=== modified file 'debian/changelog'
--- debian/changelog	2013-02-02 00:25:55 +0000
+++ debian/changelog	2013-02-02 01:30:27 +0000
@@ -4,6 +4,10 @@
     by user/group 'dhcpd' instead of root.
   * debian/control: Force dependency version for python-django to
     ((>> 1.3.1-4ubuntu1.4).
+  * Continue to ship yui3 and raphael with MAAS.
+    - debian/patches/04_precise_no_yui_root.patch: Add.
+    - debian/control: Drop dependencies on yui3 and raphael.
+    - debian/source/include-binaries: Add to not FTBFS
 
  -- Andres Rodriguez <andreserl@ubuntu.com>  Wed, 30 Jan 2013 14:07:52 -0500
 

=== modified file 'debian/control'
--- debian/control	2013-02-02 00:25:55 +0000
+++ debian/control	2013-02-02 01:30:27 +0000
@@ -56,9 +56,6 @@
          bind9utils,
          dbconfig-common,
          libapache2-mod-wsgi,
-         libjs-raphael,
-         libjs-yui3-full,
-         libjs-yui3-min,
          maas-common (= ${binary:Version}),
          postgresql-9.1,
          pwgen,

=== added directory 'debian/extras/jslibs'
=== added directory 'debian/extras/jslibs/raphael'
=== added file 'debian/extras/jslibs/raphael/raphael-min.js'
--- debian/extras/jslibs/raphael/raphael-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/raphael/raphael-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,10 @@
+// ┌────────────────────────────────────────────────────────────────────┐ \\
+// │ Raphaël 2.1.0 - JavaScript Vector Library                          │ \\
+// ├────────────────────────────────────────────────────────────────────┤ \\
+// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com)    │ \\
+// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com)              │ \\
+// ├────────────────────────────────────────────────────────────────────┤ \\
+// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\
+// └────────────────────────────────────────────────────────────────────┘ \\
+
+(function(a){var b="0.3.4",c="hasOwnProperty",d=/[\.\/]/,e="*",f=function(){},g=function(a,b){return a-b},h,i,j={n:{}},k=function(a,b){var c=j,d=i,e=Array.prototype.slice.call(arguments,2),f=k.listeners(a),l=0,m=!1,n,o=[],p={},q=[],r=h,s=[];h=a,i=0;for(var t=0,u=f.length;t<u;t++)"zIndex"in f[t]&&(o.push(f[t].zIndex),f[t].zIndex<0&&(p[f[t].zIndex]=f[t]));o.sort(g);while(o[l]<0){n=p[o[l++]],q.push(n.apply(b,e));if(i){i=d;return q}}for(t=0;t<u;t++){n=f[t];if("zIndex"in n)if(n.zIndex==o[l]){q.push(n.apply(b,e));if(i)break;do{l++,n=p[o[l]],n&&q.push(n.apply(b,e));if(i)break}while(n)}else p[n.zIndex]=n;else{q.push(n.apply(b,e));if(i)break}}i=d,h=r;return q.length?q:null};k.listeners=function(a){var b=a.split(d),c=j,f,g,h,i,k,l,m,n,o=[c],p=[];for(i=0,k=b.length;i<k;i++){n=[];for(l=0,m=o.length;l<m;l++){c=o[l].n,g=[c[b[i]],c[e]],h=2;while(h--)f=g[h],f&&(n.push(f),p=p.concat(f.f||[]))}o=n}return p},k.on=function(a,b){var c=a.split(d),e=j;for(var g=0,h=c.length;g<h;g++)e=e.n,!e[c[g]]&&(e[c[g]]={n:{}}),e=e[c[g]];e.f=e.f||[];for(g=0,h=e.f.length;g<h;g++)if(e.f[g]==b)return f;e.f.push(b);return function(a){+a==+a&&(b.zIndex=+a)}},k.stop=function(){i=1},k.nt=function(a){if(a)return(new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)")).test(h);return h},k.off=k.unbind=function(a,b){var f=a.split(d),g,h,i,k,l,m,n,o=[j];for(k=0,l=f.length;k<l;k++)for(m=0;m<o.length;m+=i.length-2){i=[m,1],g=o[m].n;if(f[k]!=e)g[f[k]]&&i.push(g[f[k]]);else for(h in g)g[c](h)&&i.push(g[h]);o.splice.apply(o,i)}for(k=0,l=o.length;k<l;k++){g=o[k];while(g.n){if(b){if(g.f){for(m=0,n=g.f.length;m<n;m++)if(g.f[m]==b){g.f.splice(m,1);break}!g.f.length&&delete g.f}for(h in g.n)if(g.n[c](h)&&g.n[h].f){var p=g.n[h].f;for(m=0,n=p.length;m<n;m++)if(p[m]==b){p.splice(m,1);break}!p.length&&delete g.n[h].f}}else{delete g.f;for(h in g.n)g.n[c](h)&&g.n[h].f&&delete g.n[h].f}g=g.n}}},k.once=function(a,b){var c=function(){var d=b.apply(this,arguments);k.unbind(a,c);return d};return k.on(a,c)},k.version=b,k.toString=function(){return"You are running Eve "+b},typeof module!="undefined"&&module.exports?module.exports=k:typeof define!="undefined"?define("eve",[],function(){return k}):a.eve=k})(this),function(){function cF(a){for(var b=0;b<cy.length;b++)cy[b].el.paper==a&&cy.splice(b--,1)}function cE(b,d,e,f,h,i){e=Q(e);var j,k,l,m=[],o,p,q,t=b.ms,u={},v={},w={};if(f)for(y=0,z=cy.length;y<z;y++){var x=cy[y];if(x.el.id==d.id&&x.anim==b){x.percent!=e?(cy.splice(y,1),l=1):k=x,d.attr(x.totalOrigin);break}}else f=+v;for(var y=0,z=b.percents.length;y<z;y++){if(b.percents[y]==e||b.percents[y]>f*b.top){e=b.percents[y],p=b.percents[y-1]||0,t=t/b.top*(e-p),o=b.percents[y+1],j=b.anim[e];break}f&&d.attr(b.anim[b.percents[y]])}if(!!j){if(!k){for(var A in j)if(j[g](A))if(U[g](A)||d.paper.customAttributes[g](A)){u[A]=d.attr(A),u[A]==null&&(u[A]=T[A]),v[A]=j[A];switch(U[A]){case C:w[A]=(v[A]-u[A])/t;break;case"colour":u[A]=a.getRGB(u[A]);var B=a.getRGB(v[A]);w[A]={r:(B.r-u[A].r)/t,g:(B.g-u[A].g)/t,b:(B.b-u[A].b)/t};break;case"path":var D=bR(u[A],v[A]),E=D[1];u[A]=D[0],w[A]=[];for(y=0,z=u[A].length;y<z;y++){w[A][y]=[0];for(var F=1,G=u[A][y].length;F<G;F++)w[A][y][F]=(E[y][F]-u[A][y][F])/t}break;case"transform":var H=d._,I=ca(H[A],v[A]);if(I){u[A]=I.from,v[A]=I.to,w[A]=[],w[A].real=!0;for(y=0,z=u[A].length;y<z;y++){w[A][y]=[u[A][y][0]];for(F=1,G=u[A][y].length;F<G;F++)w[A][y][F]=(v[A][y][F]-u[A][y][F])/t}}else{var J=d.matrix||new cb,K={_:{transform:H.transform},getBBox:function(){return d.getBBox(1)}};u[A]=[J.a,J.b,J.c,J.d,J.e,J.f],b$(K,v[A]),v[A]=K._.transform,w[A]=[(K.matrix.a-J.a)/t,(K.matrix.b-J.b)/t,(K.matrix.c-J.c)/t,(K.matrix.d-J.d)/t,(K.matrix.e-J.e)/t,(K.matrix.f-J.f)/t]}break;case"csv":var L=r(j[A])[s](c),M=r(u[A])[s](c);if(A=="clip-rect"){u[A]=M,w[A]=[],y=M.length;while(y--)w[A][y]=(L[y]-u[A][y])/t}v[A]=L;break;default:L=[][n](j[A]),M=[][n](u[A]),w[A]=[],y=d.paper.customAttributes[A].length;while(y--)w[A][y]=((L[y]||0)-(M[y]||0))/t}}var O=j.easing,P=a.easing_formulas[O];if(!P){P=r(O).match(N);if(P&&P.length==5){var R=P;P=function(a){return cC(a,+R[1],+R[2],+R[3],+R[4],t)}}else P=bf}q=j.start||b.start||+(new Date),x={anim:b,percent:e,timestamp:q,start:q+(b.del||0),status:0,initstatus:f||0,stop:!1,ms:t,easing:P,from:u,diff:w,to:v,el:d,callback:j.callback,prev:p,next:o,repeat:i||b.times,origin:d.attr(),totalOrigin:h},cy.push(x);if(f&&!k&&!l){x.stop=!0,x.start=new Date-t*f;if(cy.length==1)return cA()}l&&(x.start=new Date-x.ms*f),cy.length==1&&cz(cA)}else k.initstatus=f,k.start=new Date-k.ms*f;eve("raphael.anim.start."+d.id,d,b)}}function cD(a,b){var c=[],d={};this.ms=b,this.times=1;if(a){for(var e in a)a[g](e)&&(d[Q(e)]=a[e],c.push(Q(e)));c.sort(bd)}this.anim=d,this.top=c[c.length-1],this.percents=c}function cC(a,b,c,d,e,f){function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(z(f)<b)return e;j=(3*i*e+2*h)*e+g;if(z(j)<1e-6)break;e=e-f/j}c=0,d=1,e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(z(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cq(){return this.x+q+this.y+q+this.width+" × "+this.height}function cp(){return this.x+q+this.y}function cb(a,b,c,d,e,f){a!=null?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function bH(b,c,d){b=a._path2curve(b),c=a._path2curve(c);var e,f,g,h,i,j,k,l,m,n,o=d?0:[];for(var p=0,q=b.length;p<q;p++){var r=b[p];if(r[0]=="M")e=i=r[1],f=j=r[2];else{r[0]=="C"?(m=[e,f].concat(r.slice(1)),e=m[6],f=m[7]):(m=[e,f,e,f,i,j,i,j],e=i,f=j);for(var s=0,t=c.length;s<t;s++){var u=c[s];if(u[0]=="M")g=k=u[1],h=l=u[2];else{u[0]=="C"?(n=[g,h].concat(u.slice(1)),g=n[6],h=n[7]):(n=[g,h,g,h,k,l,k,l],g=k,h=l);var v=bG(m,n,d);if(d)o+=v;else{for(var w=0,x=v.length;w<x;w++)v[w].segment1=p,v[w].segment2=s,v[w].bez1=m,v[w].bez2=n;o=o.concat(v)}}}}}return o}function bG(b,c,d){var e=a.bezierBBox(b),f=a.bezierBBox(c);if(!a.isBBoxIntersect(e,f))return d?0:[];var g=bB.apply(0,b),h=bB.apply(0,c),i=~~(g/5),j=~~(h/5),k=[],l=[],m={},n=d?0:[];for(var o=0;o<i+1;o++){var p=a.findDotsAtSegment.apply(a,b.concat(o/i));k.push({x:p.x,y:p.y,t:o/i})}for(o=0;o<j+1;o++)p=a.findDotsAtSegment.apply(a,c.concat(o/j)),l.push({x:p.x,y:p.y,t:o/j});for(o=0;o<i;o++)for(var q=0;q<j;q++){var r=k[o],s=k[o+1],t=l[q],u=l[q+1],v=z(s.x-r.x)<.001?"y":"x",w=z(u.x-t.x)<.001?"y":"x",x=bD(r.x,r.y,s.x,s.y,t.x,t.y,u.x,u.y);if(x){if(m[x.x.toFixed(4)]==x.y.toFixed(4))continue;m[x.x.toFixed(4)]=x.y.toFixed(4);var y=r.t+z((x[v]-r[v])/(s[v]-r[v]))*(s.t-r.t),A=t.t+z((x[w]-t[w])/(u[w]-t[w]))*(u.t-t.t);y>=0&&y<=1&&A>=0&&A<=1&&(d?n++:n.push({x:x.x,y:x.y,t1:y,t2:A}))}}return n}function bF(a,b){return bG(a,b,1)}function bE(a,b){return bG(a,b)}function bD(a,b,c,d,e,f,g,h){if(!(x(a,c)<y(e,g)||y(a,c)>x(e,g)||x(b,d)<y(f,h)||y(b,d)>x(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(!k)return;var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(n<+y(a,c).toFixed(2)||n>+x(a,c).toFixed(2)||n<+y(e,g).toFixed(2)||n>+x(e,g).toFixed(2)||o<+y(b,d).toFixed(2)||o>+x(b,d).toFixed(2)||o<+y(f,h).toFixed(2)||o>+x(f,h).toFixed(2))return;return{x:l,y:m}}}function bC(a,b,c,d,e,f,g,h,i){if(!(i<0||bB(a,b,c,d,e,f,g,h)<i)){var j=1,k=j/2,l=j-k,m,n=.01;m=bB(a,b,c,d,e,f,g,h,l);while(z(m-i)>n)k/=2,l+=(m<i?1:-1)*k,m=bB(a,b,c,d,e,f,g,h,l);return l}}function bB(a,b,c,d,e,f,g,h,i){i==null&&(i=1),i=i>1?1:i<0?0:i;var j=i/2,k=12,l=[-0.1252,.1252,-0.3678,.3678,-0.5873,.5873,-0.7699,.7699,-0.9041,.9041,-0.9816,.9816],m=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],n=0;for(var o=0;o<k;o++){var p=j*l[o]+j,q=bA(p,a,c,e,g),r=bA(p,b,d,f,h),s=q*q+r*r;n+=m[o]*w.sqrt(s)}return j*n}function bA(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function by(a,b){var c=[];for(var d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function bx(){return this.hex}function bv(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[g](f)){bu(i,f);return c?c(h[f]):h[f]}i.length>=1e3&&delete h[i.shift()],i.push(f),h[f]=a[m](b,e);return c?c(h[f]):h[f]}return d}function bu(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function bm(a){if(Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[g](c)&&(b[c]=bm(a[c]));return b}function a(c){if(a.is(c,"function"))return b?c():eve.on("raphael.DOMload",c);if(a.is(c,E))return a._engine.create[m](a,c.splice(0,3+a.is(c[0],C))).add(c);var d=Array.prototype.slice.call(arguments,0);if(a.is(d[d.length-1],"function")){var e=d.pop();return b?e.call(a._engine.create[m](a,d)):eve.on("raphael.DOMload",function(){e.call(a._engine.create[m](a,d))})}return a._engine.create[m](a,arguments)}a.version="2.1.0",a.eve=eve;var b,c=/[, ]+/,d={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},e=/\{(\d+)\}/g,f="prototype",g="hasOwnProperty",h={doc:document,win:window},i={was:Object.prototype[g].call(h.win,"Raphael"),is:h.win.Raphael},j=function(){this.ca=this.customAttributes={}},k,l="appendChild",m="apply",n="concat",o="createTouch"in h.doc,p="",q=" ",r=String,s="split",t="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[s](q),u={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},v=r.prototype.toLowerCase,w=Math,x=w.max,y=w.min,z=w.abs,A=w.pow,B=w.PI,C="number",D="string",E="array",F="toString",G="fill",H=Object.prototype.toString,I={},J="push",K=a._ISURL=/^url\(['"]?([^\)]+?)['"]?\)$/i,L=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,M={NaN:1,Infinity:1,"-Infinity":1},N=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,O=w.round,P="setAttribute",Q=parseFloat,R=parseInt,S=r.prototype.toUpperCase,T=a._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},U=a._availableAnimAttrs={blur:C,"clip-rect":"csv",cx:C,cy:C,fill:"colour","fill-opacity":C,"font-size":C,height:C,opacity:C,path:"path",r:C,rx:C,ry:C,stroke:"colour","stroke-opacity":C,"stroke-width":C,transform:"transform",width:C,x:C,y:C},V=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g,W=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,X={hs:1,rg:1},Y=/,?([achlmqrstvxz]),?/gi,Z=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,$=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,_=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/ig,ba=a._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,bb={},bc=function(a,b){return a.key-b.key},bd=function(a,b){return Q(a)-Q(b)},be=function(){},bf=function(a){return a},bg=a._rectPath=function(a,b,c,d,e){if(e)return[["M",a+e,b],["l",c-e*2,0],["a",e,e,0,0,1,e,e],["l",0,d-e*2],["a",e,e,0,0,1,-e,e],["l",e*2-c,0],["a",e,e,0,0,1,-e,-e],["l",0,e*2-d],["a",e,e,0,0,1,e,-e],["z"]];return[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},bh=function(a,b,c,d){d==null&&(d=c);return[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},bi=a._getPath={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return bh(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return bh(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return bg(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return bg(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return bg(b.x,b.y,b.width,b.height)}},bj=a.mapPath=function(a,b){if(!b)return a;var c,d,e,f,g,h,i;a=bR(a);for(e=0,g=a.length;e<g;e++){i=a[e];for(f=1,h=i.length;f<h;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d}return a};a._g=h,a.type=h.win.SVGAngle||h.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bk=h.doc.createElement("div"),bl;bk.innerHTML='<v:shape adj="1"/>',bl=bk.firstChild,bl.style.behavior="url(#default#VML)";if(!bl||typeof bl.adj!="object")return a.type=p;bk=null}a.svg=!(a.vml=a.type=="VML"),a._Paper=j,a.fn=k=j.prototype=a.prototype,a._id=0,a._oid=0,a.is=function(a,b){b=v.call(b);if(b=="finite")return!M[g](+a);if(b=="array")return a instanceof Array;return b=="null"&&a===null||b==typeof a&&a!==null||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||H.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+w.atan2(-i,-h)*180/B+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*B/180},a.deg=function(a){return a*180/B%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,E)){var e=b.length;while(e--)if(z(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};var bn=a.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=w.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){eve("raphael.setWindow",a,h.win,b),h.win=b,h.doc=h.win.document,a._engine.initWin&&a._engine.initWin(h.win)};var bo=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),d=e.body}catch(f){d=createPopup().document.body}var g=d.createTextRange();bo=bv(function(a){try{d.style.color=r(a).replace(c,p);var b=g.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=h.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",h.doc.body.appendChild(i),bo=bv(function(a){i.style.color=a;return h.doc.defaultView.getComputedStyle(i,p).getPropertyValue("color")})}return bo(b)},bp=function(){return"hsb("+[this.h,this.s,this.b]+")"},bq=function(){return"hsl("+[this.h,this.s,this.l]+")"},br=function(){return this.hex},bs=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,D)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},bt=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:br};a.is(e,"finite")&&(f.opacity=e);return f};a.color=function(b){var c;a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b?(c=a.hsb2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b?(c=a.hsl2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):(a.is(b,"string")&&(b=a.getRGB(b)),a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b?(c=a.rgb2hsl(b),b.h=c.h,b.s=c.s,b.l=c.l,c=a.rgb2hsb(b),b.v=c.b):(b={hex:"none"},b.r=b.g=b.b=b.h=b.s=b.v=b.l=-1)),b.toString=br;return b},a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-z(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bt(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-z(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bt(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bs(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=x(a,b,c),g=f-y(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bp}},a.rgb2hsl=function(a,b,c){c=bs(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=x(a,b,c),h=y(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bq}},a._path2string=function(){return this.join(",").replace(Y,"$1")};var bw=a._preload=function(a,b){var c=h.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,h.doc.body.removeChild(this)},c.onerror=function(){h.doc.body.removeChild(this)},h.doc.body.appendChild(c),c.src=a};a.getRGB=bv(function(b){if(!b||!!((b=r(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bx};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none",toString:bx};!X[g](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bo(b));var c,d,e,f,h,i,j,k=b.match(L);if(k){k[2]&&(f=R(k[2].substring(5),16),e=R(k[2].substring(3,5),16),d=R(k[2].substring(1,3),16)),k[3]&&(f=R((i=k[3].charAt(3))+i,16),e=R((i=k[3].charAt(2))+i,16),d=R((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,f,h)}if(k[6]){j=k[6][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,f,h)}k={r:d,g:e,b:f,toString:bx},k.hex="#"+(16777216|f|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bx}},a),a.hsb=bv(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=bv(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=bv(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=function(b){if(!b)return null;var c=bz(b);if(c.arr)return bJ(c.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];a.is(b,E)&&a.is(b[0],E)&&(e=bJ(b)),e.length||r(b).replace(Z,function(a,b,c){var f=[],g=b.toLowerCase();c.replace(_,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(e.push([b][n](f.splice(0,2))),g="l",b=b=="m"?"l":"L");if(g=="r")e.push([b][n](f));else while(f.length>=d[g]){e.push([b][n](f.splice(0,d[g])));if(!d[g])break}}),e.toString=a._path2string,c.arr=bJ(e);return e},a.parseTransformString=bv(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=bJ(b)),d.length||r(b).replace($,function(a,b,c){var e=[],f=v.call(b);c.replace(_,function(a,b){b&&e.push(+b)}),d.push([b][n](e))}),d.toString=a._path2string;return d});var bz=function(a){var b=bz.ps=bz.ps||{};b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[g](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])});return b[a]};a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=A(j,3),l=A(j,2),m=i*i,n=m*i,o=k*a+l*3*i*c+j*3*i*i*e+n*g,p=k*b+l*3*i*d+j*3*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,x=j*e+i*g,y=j*f+i*h,z=90-w.atan2(q-s,r-t)*180/B;(q>s||r<t)&&(z+=180);return{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:x,y:y},alpha:z}},a.bezierBBox=function(b,c,d,e,f,g,h,i){a.is(b,"array")||(b=[b,c,d,e,f,g,h,i]);var j=bQ.apply(null,b);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},a.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},a.isBBoxIntersect=function(b,c){var d=a.isPointInsideBBox;return d(c,b.x,b.y)||d(c,b.x2,b.y)||d(c,b.x,b.y2)||d(c,b.x2,b.y2)||d(b,c.x,c.y)||d(b,c.x2,c.y)||d(b,c.x,c.y2)||d(b,c.x2,c.y2)||(b.x<c.x2&&b.x>c.x||c.x<b.x2&&c.x>b.x)&&(b.y<c.y2&&b.y>c.y||c.y<b.y2&&c.y>b.y)},a.pathIntersection=function(a,b){return bH(a,b)},a.pathIntersectionNumber=function(a,b){return bH(a,b,1)},a.isPointInsidePath=function(b,c,d){var e=a.pathBBox(b);return a.isPointInsideBBox(e,c,d)&&bH(b,[["M",c,d],["H",e.x2+10]],1)%2==1},a._removedFactory=function(a){return function(){eve("raphael.log",null,"Raphaël: you are calling to method “"+a+"” of removed object",a)}};var bI=a.pathBBox=function(a){var b=bz(a);if(b.bbox)return b.bbox;if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=bR(a);var c=0,d=0,e=[],f=[],g;for(var h=0,i=a.length;h<i;h++){g=a[h];if(g[0]=="M")c=g[1],d=g[2],e.push(c),f.push(d);else{var j=bQ(c,d,g[1],g[2],g[3],g[4],g[5],g[6]);e=e[n](j.min.x,j.max.x),f=f[n](j.min.y,j.max.y),c=g[5],d=g[6]}}var k=y[m](0,e),l=y[m](0,f),o=x[m](0,e),p=x[m](0,f),q={x:k,y:l,x2:o,y2:p,width:o-k,height:p-l};b.bbox=bm(q);return q},bJ=function(b){var c=bm(b);c.toString=a._path2string;return c},bK=a._pathToRelative=function(b){var c=bz(b);if(c.rel)return bJ(c.rel);if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);var d=[],e=0,f=0,g=0,h=0,i=0;b[0][0]=="M"&&(e=b[0][1],f=b[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=b.length;j<k;j++){var l=d[j]=[],m=b[j];if(m[0]!=v.call(m[0])){l[0]=v.call(m[0]);switch(l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;n<o;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}}else{l=d[j]=[],m[0]=="m"&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;p<q;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}d.toString=a._path2string,c.rel=bJ(d);return d},bL=a._pathToAbsolute=function(b){var c=bz(b);if(c.abs)return bJ(c.abs);if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);if(!b||!b.length)return[["M",0,0]];var d=[],e=0,f=0,g=0,h=0,i=0;b[0][0]=="M"&&(e=+b[0][1],f=+b[0][2],g=e,h=f,i++,d[0]=["M",e,f]);var j=b.length==3&&b[0][0]=="M"&&b[1][0].toUpperCase()=="R"&&b[2][0].toUpperCase()=="Z";for(var k,l,m=i,o=b.length;m<o;m++){d.push(k=[]),l=b[m];if(l[0]!=S.call(l[0])){k[0]=S.call(l[0]);switch(k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":var p=[e,f][n](l.slice(1));for(var q=2,r=p.length;q<r;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[n](by(p,j));break;case"M":g=+l[1]+e,h=+l[2]+f;default:for(q=1,r=l.length;q<r;q++)k[q]=+l[q]+(q%2?e:f)}}else if(l[0]=="R")p=[e,f][n](l.slice(1)),d.pop(),d=d[n](by(p,j)),k=["R"][n](l.slice(-2));else for(var s=0,t=l.length;s<t;s++)k[s]=l[s];switch(k[0]){case"Z":e=g,f=h;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":g=k[k.length-2],h=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}d.toString=a._path2string,c.abs=bJ(d);return d},bM=function(a,b,c,d){return[a,b,c,d,c,d]},bN=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bO=function(a,b,c,d,e,f,g,h,i,j){var k=B*120/180,l=B/180*(+e||0),m=[],o,p=bv(function(a,b,c){var d=a*w.cos(c)-b*w.sin(c),e=a*w.sin(c)+b*w.cos(c);return{x:d,y:e}});if(!j){o=p(a,b,-l),a=o.x,b=o.y,o=p(h,i,-l),h=o.x,i=o.y;var q=w.cos(B/180*e),r=w.sin(B/180*e),t=(a-h)/2,u=(b-i)/2,v=t*t/(c*c)+u*u/(d*d);v>1&&(v=w.sqrt(v),c=v*c,d=v*d);var x=c*c,y=d*d,A=(f==g?-1:1)*w.sqrt(z((x*y-x*u*u-y*t*t)/(x*u*u+y*t*t))),C=A*c*u/d+(a+h)/2,D=A*-d*t/c+(b+i)/2,E=w.asin(((b-D)/d).toFixed(9)),F=w.asin(((i-D)/d).toFixed(9));E=a<C?B-E:E,F=h<C?B-F:F,E<0&&(E=B*2+E),F<0&&(F=B*2+F),g&&E>F&&(E=E-B*2),!g&&F>E&&(F=F-B*2)}else E=j[0],F=j[1],C=j[2],D=j[3];var G=F-E;if(z(G)>k){var H=F,I=h,J=i;F=E+k*(g&&F>E?1:-1),h=C+c*w.cos(F),i=D+d*w.sin(F),m=bO(h,i,c,d,e,0,g,I,J,[F,H,C,D])}G=F-E;var K=w.cos(E),L=w.sin(E),M=w.cos(F),N=w.sin(F),O=w.tan(G/4),P=4/3*c*O,Q=4/3*d*O,R=[a,b],S=[a+P*L,b-Q*K],T=[h+P*N,i-Q*M],U=[h,i];S[0]=2*R[0]-S[0],S[1]=2*R[1]-S[1];if(j)return[S,T,U][n](m);m=[S,T,U][n](m).join()[s](",");var V=[];for(var W=0,X=m.length;W<X;W++)V[W]=W%2?p(m[W-1],m[W],l).y:p(m[W],m[W+1],l).x;return V},bP=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:A(j,3)*a+A(j,2)*3*i*c+j*3*i*i*e+A(i,3)*g,y:A(j,3)*b+A(j,2)*3*i*d+j*3*i*i*f+A(i,3)*h}},bQ=bv(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bP(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bP(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bP(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bP(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:y[m](0,p),y:y[m](0,o)},max:{x:x[m](0,p),y:x[m](0,o)}}}),bR=a._path2curve=bv(function(a,b){var c=!b&&bz(a);if(!b&&c.curve)return bJ(c.curve);var d=bL(a),e=b&&bL(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][n](bO[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][n](bN(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][n](bN(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](bM(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](bM(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](bM(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](bM(b.x,b.y,b.X,b.Y))}return a},i=function(a,b){if(a[b].length>7){a[b].shift();var c=a[b];while(c.length)a.splice(b++,0,["C"][n](c.splice(0,6)));a.splice(b,1),l=x(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],l=x(d.length,e&&e.length||0))};for(var k=0,l=x(d.length,e&&e.length||0);k<l;k++){d[k]=h(d[k],f),i(d,k),e&&(e[k]=h(e[k],g)),e&&i(e,k),j(d,e,f,g,k),j(e,d,g,f,k);var o=d[k],p=e&&e[k],q=o.length,r=e&&p.length;f.x=o[q-2],f.y=o[q-1],f.bx=Q(o[q-4])||f.x,f.by=Q(o[q-3])||f.y,g.bx=e&&(Q(p[r-4])||g.x),g.by=e&&(Q(p[r-3])||g.y),g.x=e&&p[r-2],g.y=e&&p[r-1]}e||(c.curve=bJ(d));return e?[d,e]:d},null,bJ),bS=a._parseDots=bv(function(b){var c=[];for(var d=0,e=b.length;d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;d<e;d++)if(!c[d].offset){var h=Q(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=Q(i);var k=(i-h)/(j-d+1);for(;d<j;d++)h+=k,c[d].offset=h+"%"}return c}),bT=a._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)},bU=a._tofront=function(a,b){b.top!==a&&(bT(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},bV=a._toback=function(a,b){b.bottom!==a&&(bT(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},bW=a._insertafter=function(a,b,c){bT(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},bX=a._insertbefore=function(a,b,c){bT(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},bY=a.toMatrix=function(a,b){var c=bI(a),d={_:{transform:p},getBBox:function(){return c}};b$(d,b);return d.matrix},bZ=a.transformPath=function(a,b){return bj(a,bY(a,b))},b$=a._extractTransform=function(b,c){if(c==null)return b._.transform;c=r(c).replace(/\.{3}|\u2026/g,b._.transform||p);var d=a.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=b._,k=new cb;j.transform=d||[];if(d)for(var l=0,m=d.length;l<m;l++){var n=d[l],o=n.length,q=r(n[0]).toLowerCase(),s=n[0]!=q,t=s?k.invert():0,u,v,w,x,y;q=="t"&&o==3?s?(u=t.x(0,0),v=t.y(0,0),w=t.x(n[1],n[2]),x=t.y(n[1],n[2]),k.translate(w-u,x-v)):k.translate(n[1],n[2]):q=="r"?o==2?(y=y||b.getBBox(1),k.rotate(n[1],y.x+y.width/2,y.y+y.height/2),e+=n[1]):o==4&&(s?(w=t.x(n[2],n[3]),x=t.y(n[2],n[3]),k.rotate(n[1],w,x)):k.rotate(n[1],n[2],n[3]),e+=n[1]):q=="s"?o==2||o==3?(y=y||b.getBBox(1),k.scale(n[1],n[o-1],y.x+y.width/2,y.y+y.height/2),h*=n[1],i*=n[o-1]):o==5&&(s?(w=t.x(n[3],n[4]),x=t.y(n[3],n[4]),k.scale(n[1],n[2],w,x)):k.scale(n[1],n[2],n[3],n[4]),h*=n[1],i*=n[2]):q=="m"&&o==7&&k.add(n[1],n[2],n[3],n[4],n[5],n[6]),j.dirtyT=1,b.matrix=k}b.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,h==1&&i==1&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1},b_=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return a.length==4?[b,0,a[2],a[3]]:[b,0];case"s":return a.length==5?[b,1,1,a[3],a[4]]:a.length==3?[b,1,1]:[b,1]}},ca=a._equaliseTransform=function(b,c){c=r(c).replace(/\.{3}|\u2026/g,b),b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];var d=x(b.length,c.length),e=[],f=[],g=0,h,i,j,k;for(;g<d;g++){j=b[g]||b_(c[g]),k=c[g]||b_(j);if(j[0]!=k[0]||j[0].toLowerCase()=="r"&&(j[2]!=k[2]||j[3]!=k[3])||j[0].toLowerCase()=="s"&&(j[3]!=k[3]||j[4]!=k[4]))return;e[g]=[],f[g]=[];for(h=0,i=x(j.length,k.length);h<i;h++)h in j&&(e[g][h]=j[h]),h in k&&(f[g][h]=k[h])}return{from:e,to:f}};a._getContainer=function(b,c,d,e){var f;f=e==null&&!a.is(b,"object")?h.doc.getElementById(b):b;if(f!=null){if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d};return{container:1,x:b,y:c,width:d,height:e}}},a.pathToRelative=bK,a._engine={},a.path2curve=bR,a.matrix=function(a,b,c,d,e,f){return new cb(a,b,c,d,e,f)},function(b){function d(a){var b=w.sqrt(c(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)}function c(a){return a[0]*a[0]+a[1]*a[1]}b.add=function(a,b,c,d,e,f){var g=[[],[],[]],h=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],i=[[a,c,e],[b,d,f],[0,0,1]],j,k,l,m;a&&a instanceof cb&&(i=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]);for(j=0;j<3;j++)for(k=0;k<3;k++){m=0;for(l=0;l<3;l++)m+=h[j][l]*i[l][k];g[j][k]=m}this.a=g[0][0],this.b=g[1][0],this.c=g[0][1],this.d=g[1][1],this.e=g[0][2],this.f=g[1][2]},b.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new cb(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},b.clone=function(){return new cb(this.a,this.b,this.c,this.d,this.e,this.f)},b.translate=function(a,b){this.add(1,0,0,1,a,b)},b.scale=function(a,b,c,d){b==null&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},b.rotate=function(b,c,d){b=a.rad(b),c=c||0,d=d||0;var e=+w.cos(b).toFixed(9),f=+w.sin(b).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},b.x=function(a,b){return a*this.a+b*this.c+this.e},b.y=function(a,b){return a*this.b+b*this.d+this.f},b.get=function(a){return+this[r.fromCharCode(97+a)].toFixed(4)},b.toString=function(){return a.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},b.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},b.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},b.split=function(){var b={};b.dx=this.e,b.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];b.scalex=w.sqrt(c(e[0])),d(e[0]),b.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*b.shear,e[1][1]-e[0][1]*b.shear],b.scaley=w.sqrt(c(e[1])),d(e[1]),b.shear/=b.scaley;var f=-e[0][1],g=e[1][1];g<0?(b.rotate=a.deg(w.acos(g)),f<0&&(b.rotate=360-b.rotate)):b.rotate=a.deg(w.asin(f)),b.isSimple=!+b.shear.toFixed(9)&&(b.scalex.toFixed(9)==b.scaley.toFixed(9)||!b.rotate),b.isSuperSimple=!+b.shear.toFixed(9)&&b.scalex.toFixed(9)==b.scaley.toFixed(9)&&!b.rotate,b.noRotation=!+b.shear.toFixed(9)&&!b.rotate;return b},b.toTransformString=function(a){var b=a||this[s]();if(b.isSimple){b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4);return(b.dx||b.dy?"t"+[b.dx,b.dy]:p)+(b.scalex!=1||b.scaley!=1?"s"+[b.scalex,b.scaley,0,0]:p)+(b.rotate?"r"+[b.rotate,0,0]:p)}return"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(cb.prototype);var cc=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);navigator.vendor=="Apple Computer, Inc."&&(cc&&cc[1]<4||navigator.platform.slice(0,2)=="iP")||navigator.vendor=="Google Inc."&&cc&&cc[1]<8?k.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:k.safari=be;var cd=function(){this.returnValue=!1},ce=function(){return this.originalEvent.preventDefault()},cf=function(){this.cancelBubble=!0},cg=function(){return this.originalEvent.stopPropagation()},ch=function(){if(h.doc.addEventListener)return function(a,b,c,d){var e=o&&u[b]?u[b]:b,f=function(e){var f=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,i=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,j=e.clientX+i,k=e.clientY+f;if(o&&u[g](b))for(var l=0,m=e.targetTouches&&e.targetTouches.length;l<m;l++)if(e.targetTouches[l].target==a){var n=e;e=e.targetTouches[l],e.originalEvent=n,e.preventDefault=ce,e.stopPropagation=cg;break}return c.call(d,e,j,k)};a.addEventListener(e,f,!1);return function(){a.removeEventListener(e,f,!1);return!0}};if(h.doc.attachEvent)return function(a,b,c,d){var e=function(a){a=a||h.win.event;var b=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,e=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;a.preventDefault=a.preventDefault||cd,a.stopPropagation=a.stopPropagation||cf;return c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return!0};return f}}(),ci=[],cj=function(a){var b=a.clientX,c=a.clientY,d=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,e=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,f,g=ci.length;while(g--){f=ci[g];if(o){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX,c=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();var k=f.el.node,l,m=k.nextSibling,n=k.parentNode,p=k.style.display;h.win.opera&&n.removeChild(k),k.style.display="none",l=f.el.paper.getElementByPoint(b,c),k.style.display=p,h.win.opera&&(m?n.insertBefore(k,m):n.appendChild(k)),l&&eve("raphael.drag.over."+f.el.id,f.el,l),b+=e,c+=d,eve("raphael.drag.move."+f.el.id,f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},ck=function(b){a.unmousemove(cj).unmouseup(ck);var c=ci.length,d;while(c--)d=ci[c],d.el._drag={},eve("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,b);ci=[]},cl=a.el={};for(var cm=t.length;cm--;)(function(b){a[b]=cl[b]=function(c,d){a.is(c,"function")&&(this.events=this.events||[],this.events.push({name:b,f:c,unbind:ch(this.shape||this.node||h.doc,b,c,d||this)}));return this},a["un"+b]=cl["un"+b]=function(a){var c=this.events||[],d=c.length;while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind(),c.splice(d,1),!c.length&&delete this.events;return this}return this}})(t[cm]);cl.data=function(b,c){var d=bb[this.id]=bb[this.id]||{};if(arguments.length==1){if(a.is(b,"object")){for(var e in b)b[g](e)&&this.data(e,b[e]);return this}eve("raphael.data.get."+this.id,this,d[b],b);return d[b]}d[b]=c,eve("raphael.data.set."+this.id,this,c,b);return this},cl.removeData=function(a){a==null?bb[this.id]={}:bb[this.id]&&delete bb[this.id][a];return this},cl.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},cl.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var cn=[];cl.drag=function(b,c,d,e,f,g){function i(i){(i.originalEvent||i).preventDefault();var j=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,k=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft;this._drag.x=i.clientX+k,this._drag.y=i.clientY+j,this._drag.id=i.identifier,!ci.length&&a.mousemove(cj).mouseup(ck),ci.push({el:this,move_scope:e,start_scope:f,end_scope:g}),c&&eve.on("raphael.drag.start."+this.id,c),b&&eve.on("raphael.drag.move."+this.id,b),d&&eve.on("raphael.drag.end."+this.id,d),eve("raphael.drag.start."+this.id,f||e||this,i.clientX+k,i.clientY+j,i)}this._drag={},cn.push({el:this,start:i}),this.mousedown(i);return this},cl.onDragOver=function(a){a?eve.on("raphael.drag.over."+this.id,a):eve.unbind("raphael.drag.over."+this.id)},cl.undrag=function(){var b=cn.length;while(b--)cn[b].el==this&&(this.unmousedown(cn[b].start),cn.splice(b,1),eve.unbind("raphael.drag.*."+this.id));!cn.length&&a.unmousemove(cj).unmouseup(ck)},k.circle=function(b,c,d){var e=a._engine.circle(this,b||0,c||0,d||0);this.__set__&&this.__set__.push(e);return e},k.rect=function(b,c,d,e,f){var g=a._engine.rect(this,b||0,c||0,d||0,e||0,f||0);this.__set__&&this.__set__.push(g);return g},k.ellipse=function(b,c,d,e){var f=a._engine.ellipse(this,b||0,c||0,d||0,e||0);this.__set__&&this.__set__.push(f);return f},k.path=function(b){b&&!a.is(b,D)&&!a.is(b[0],E)&&(b+=p);var c=a._engine.path(a.format[m](a,arguments),this);this.__set__&&this.__set__.push(c);return c},k.image=function(b,c,d,e,f){var g=a._engine.image(this,b||"about:blank",c||0,d||0,e||0,f||0);this.__set__&&this.__set__.push(g);return g},k.text=function(b,c,d){var e=a._engine.text(this,b||0,c||0,r(d));this.__set__&&this.__set__.push(e);return e},k.set=function(b){!a.is(b,"array")&&(b=Array.prototype.splice.call(arguments,0,arguments.length));var c=new cG(b);this.__set__&&this.__set__.push(c);return c},k.setStart=function(a){this.__set__=a||this.set()},k.setFinish=function(a){var b=this.__set__;delete this.__set__;return b},k.setSize=function(b,c){return a._engine.setSize.call(this,b,c)},k.setViewBox=function(b,c,d,e,f){return a._engine.setViewBox.call(this,b,c,d,e,f)},k.top=k.bottom=null,k.raphael=a;var co=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,i=b.top+(h.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(h.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:i,x:j}};k.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=h.doc.elementFromPoint(a,b);if(h.win.opera&&e.tagName=="svg"){var f=co(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var i=d.getIntersectionList(g,null);i.length&&(e=i[i.length-1])}if(!e)return null;while(e.parentNode&&e!=d.parentNode&&!e.raphael)e=e.parentNode;e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null;return e},k.getById=function(a){var b=this.bottom;while(b){if(b.id==a)return b;b=b.next}return null},k.forEach=function(a,b){var c=this.bottom;while(c){if(a.call(b,c)===!1)return this;c=c.next}return this},k.getElementsByPoint=function(a,b){var c=this.set();this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)});return c},cl.isPointInside=function(b,c){var d=this.realPath=this.realPath||bi[this.type](this);return a.isPointInsidePath(d,b,c)},cl.getBBox=function(a){if(this.removed)return{};var b=this._;if(a){if(b.dirty||!b.bboxwt)this.realPath=bi[this.type](this),b.bboxwt=bI(this.realPath),b.bboxwt.toString=cq,b.dirty=0;return b.bboxwt}if(b.dirty||b.dirtyT||!b.bbox){if(b.dirty||!this.realPath)b.bboxwt=0,this.realPath=bi[this.type](this);b.bbox=bI(bj(this.realPath,this.matrix)),b.bbox.toString=cq,b.dirty=b.dirtyT=0}return b.bbox},cl.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());this.__set__&&this.__set__.push(a);return a},cl.glow=function(a){if(this.type=="text")return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||bi[this.type](this);f=this.matrix?bj(f,this.matrix):f;for(var g=1;g<c+1;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cr={},cs=function(b,c,d,e,f,g,h,i,j){return j==null?bB(b,c,d,e,f,g,h,i):a.findDotsAtSegment(b,c,d,e,f,g,h,i,bC(b,c,d,e,f,g,h,i,j))},ct=function(b,c){return function(d,e,f){d=bR(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M")g=+i[1],h=+i[2];else{j=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cu=ct(1),cv=ct(),cw=ct(0,1);a.getTotalLength=cu,a.getPointAtLength=cv,a.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return cw(a,b).end;var d=cw(a,c,1);return b?cw(d,b).end:d},cl.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return cu(this.attrs.path)}},cl.getPointAtLength=function(a){if(this.type=="path")return cv(this.attrs.path,a)},cl.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var cx=a.easing_formulas={linear:function(a){return a},"<":function(a){return A(a,1.7)},">":function(a){return A(a,.48)},"<>":function(a){var b=.48-a/1.04,c=w.sqrt(.1734+b*b),d=c-b,e=A(z(d),1/3)*(d<0?-1:1),f=-c-b,g=A(z(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return A(2,-10*a)*w.sin((a-.075)*2*B/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};cx.easeIn=cx["ease-in"]=cx["<"],cx.easeOut=cx["ease-out"]=cx[">"],cx.easeInOut=cx["ease-in-out"]=cx["<>"],cx["back-in"]=cx.backIn,cx["back-out"]=cx.backOut;var cy=[],cz=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cA=function(){var b=+(new Date),c=0;for(;c<cy.length;c++){var d=cy[c];if(d.el.removed||d.paused)continue;var e=b-d.start,f=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,o={},p,r={},s;d.initstatus?(e=(d.initstatus*d.anim.top-d.prev)/(d.percent-d.prev)*f,d.status=d.initstatus,delete d.initstatus,d.stop&&cy.splice(c--,1)):d.status=(d.prev+(d.percent-d.prev)*(e/f))/d.anim.top;if(e<0)continue;if(e<f){var t=h(e/f);for(var u in i)if(i[g](u)){switch(U[u]){case C:p=+i[u]+t*f*j[u];break;case"colour":p="rgb("+[cB(O(i[u].r+t*f*j[u].r)),cB(O(i[u].g+t*f*j[u].g)),cB(O(i[u].b+t*f*j[u].b))].join(",")+")";break;case"path":p=[];for(var v=0,w=i[u].length;v<w;v++){p[v]=[i[u][v][0]];for(var x=1,y=i[u][v].length;x<y;x++)p[v][x]=+i[u][v][x]+t*f*j[u][v][x];p[v]=p[v].join(q)}p=p.join(q);break;case"transform":if(j[u].real){p=[];for(v=0,w=i[u].length;v<w;v++){p[v]=[i[u][v][0]];for(x=1,y=i[u][v].length;x<y;x++)p[v][x]=i[u][v][x]+t*f*j[u][v][x]}}else{var z=function(a){return+i[u][a]+t*f*j[u][a]};p=[["m",z(0),z(1),z(2),z(3),z(4),z(5)]]}break;case"csv":if(u=="clip-rect"){p=[],v=4;while(v--)p[v]=+i[u][v]+t*f*j[u][v]}break;default:var A=[][n](i[u]);p=[],v=m.paper.customAttributes[u].length;while(v--)p[v]=+A[v]+t*f*j[u][v]}o[u]=p}m.attr(o),function(a,b,c){setTimeout(function(){eve("raphael.anim.frame."+a,b,c)})}(m.id,m,d.anim)}else{(function(b,c,d){setTimeout(function(){eve("raphael.anim.frame."+c.id,c,d),eve("raphael.anim.finish."+c.id,c,d),a.is(b,"function")&&b.call(c)})})(d.callback,m,d.anim),m.attr(k),cy.splice(c--,1);if(d.repeat>1&&!d.next){for(s in k)k[g](s)&&(r[s]=d.totalOrigin[s]);d.el.attr(r),cE(d.anim,d.el,d.anim.percents[0],null,d.totalOrigin,d.repeat-1)}d.next&&!d.stop&&cE(d.anim,d.el,d.next,null,d.totalOrigin,d.repeat)}}a.svg&&m&&m.paper&&m.paper.safari(),cy.length&&cz(cA)},cB=function(a){return a>255?255:a<0?0:a};cl.animateWith=function(b,c,d,e,f,g){var h=this;if(h.removed){g&&g.call(h);return h}var i=d instanceof cD?d:a.animation(d,e,f,g),j,k;cE(i,h,i.percents[0],null,h.attr());for(var l=0,m=cy.length;l<m;l++)if(cy[l].anim==c&&cy[l].el==b){cy[m-1].start=cy[l].start;break}return h},cl.onAnimation=function(a){a?eve.on("raphael.anim.frame."+this.id,a):eve.unbind("raphael.anim.frame."+this.id);return this},cD.prototype.delay=function(a){var b=new cD(this.anim,this.ms);b.times=this.times,b.del=+a||0;return b},cD.prototype.repeat=function(a){var b=new cD(this.anim,this.ms);b.del=this.del,b.times=w.floor(x(a,0))||1;return b},a.animation=function(b,c,d,e){if(b instanceof cD)return b;if(a.is(d,"function")||!d)e=e||d||null,d=null;b=Object(b),c=+c||0;var f={},h,i;for(i in b)b[g](i)&&Q(i)!=i&&Q(i)+"%"!=i&&(h=!0,f[i]=b[i]);if(!h)return new cD(b,c);d&&(f.easing=d),e&&(f.callback=e);return new cD({100:f},c)},cl.animate=function(b,c,d,e){var f=this;if(f.removed){e&&e.call(f);return f}var g=b instanceof cD?b:a.animation(b,c,d,e);cE(g,f,g.percents[0],null,f.attr());return f},cl.setTime=function(a,b){a&&b!=null&&this.status(a,y(b,a.ms)/a.ms);return this},cl.status=function(a,b){var c=[],d=0,e,f;if(b!=null){cE(a,this,-1,y(b,1));return this}e=cy.length;for(;d<e;d++){f=cy[d];if(f.el.id==this.id&&(!a||f.anim==a)){if(a)return f.status;c.push({anim:f.anim,status:f.status})}}if(a)return 0;return c},cl.pause=function(a){for(var b=0;b<cy.length;b++)cy[b].el.id==this.id&&(!a||cy[b].anim==a)&&eve("raphael.anim.pause."+this.id,this,cy[b].anim)!==!1&&(cy[b].paused=!0);return this},cl.resume=function(a){for(var b=0;b<cy.length;b++)if(cy[b].el.id==this.id&&(!a||cy[b].anim==a)){var c=cy[b];eve("raphael.anim.resume."+this.id,this,c.anim)!==!1&&(delete c.paused,this.status(c.anim,c.status))}return this},cl.stop=function(a){for(var b=0;b<cy.length;b++)cy[b].el.id==this.id&&(!a||cy[b].anim==a)&&eve("raphael.anim.stop."+this.id,this,cy[b].anim)!==!1&&cy.splice(b--,1);return this},eve.on("raphael.remove",cF),eve.on("raphael.clear",cF),cl.toString=function(){return"Raphaël’s object"};var cG=function(a){this.items=[],this.length=0,this.type="set";if(a)for(var b=0,c=a.length;b<c;b++)a[b]&&(a[b].constructor==cl.constructor||a[b].constructor==cG)&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},cH=cG.prototype;cH.push=function(){var a,b;for(var c=0,d=arguments.length;c<d;c++)a=arguments[c],a&&(a.constructor==cl.constructor||a.constructor==cG)&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},cH.pop=function(){this.length&&delete this[this.length--];return this.items.pop()},cH.forEach=function(a,b){for(var c=0,d=this.items.length;c<d;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var cI in cl)cl[g](cI)&&(cH[cI]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][m](c,b)})}}(cI));cH.attr=function(b,c){if(b&&a.is(b,E)&&a.is(b[0],"object"))for(var d=0,e=b.length;d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items.length;f<g;f++)this.items[f].attr(b,c);return this},cH.clear=function(){while(this.length)this.pop()},cH.splice=function(a,b,c){a=a<0?x(this.length+a,0):a,b=x(0,y(this.length-a,b));var d=[],e=[],f=[],g;for(g=2;g<arguments.length;g++)f.push(arguments[g]);for(g=0;g<b;g++)e.push(this[a+g]);for(;g<this.length-a;g++)d.push(this[a+g]);var h=f.length;for(g=0;g<h+d.length;g++)this.items[a+g]=this[a+g]=g<h?f[g]:d[g-h];g=this.items.length=this.length-=b-h;while(this[g])delete this[g++];return new cG(e)},cH.exclude=function(a){for(var b=0,c=this.length;b<c;b++)if(this[b]==a){this.splice(b,1);return!0}},cH.animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items.length,g=f,h,i=this,j;if(!f)return this;e&&(j=function(){!--f&&e.call(i)}),d=a.is(d,D)?d:j;var k=a.animation(b,c,d,j);h=this.items[--g].animate(k);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,k,k);return this},cH.insertAfter=function(a){var b=this.items.length;while(b--)this.items[b].insertAfter(a);return this},cH.getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}a=y[m](0,a),b=y[m](0,b),c=x[m](0,c),d=x[m](0,d);return{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},cH.clone=function(a){a=new cG;for(var b=0,c=this.items.length;b<c;b++)a.push(this.items[b].clone());return a},cH.toString=function(){return"Raphaël‘s set"},a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[g](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=R(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[g](e)){var f=a.glyphs[e];b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"};if(f.k)for(var h in f.k)f[g](h)&&(b.glyphs[e].k[h]=f.k[h])}}return a},k.getFont=function(b,c,d,e){e=e||"normal",d=d||"normal",c=+c||{normal:400,bold:700,lighter:300,bolder:800}[c]||400;if(!!a.fonts){var f=a.fonts[b];if(!f){var h=new RegExp("(^|\\s)"+b.replace(/[^\w\d\s+!~.:_-]/g,p)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[g](i)&&h.test(i)){f=a.fonts[i];break}}var j;if(f)for(var k=0,l=f.length;k<l;k++){j=f[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j}},k.print=function(b,d,e,f,g,h,i){h=h||"middle",i=x(y(i||0,1),-1);var j=r(e)[s](p),k=0,l=0,m=p,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var o=f.face.bbox[s](c),q=+o[0],t=o[3]-o[1],u=0,v=+o[1]+(h=="baseline"?t+ +f.face.descent:t/2);for(var w=0,z=j.length;w<z;w++){if(j[w]=="\n")k=0,B=0,l=0,u+=t;else{var A=l&&f.glyphs[j[w-1]]||{},B=f.glyphs[j[w]];k+=l?(A.w||f.w)+(A.k&&A.k[j[w]]||0)+f.w*i:0,l=1}B&&B.d&&(m+=a.transformPath(B.d,["t",k*n,u*n,"s",n,n,q,v,"t",(b-q)/n,(d-v)/n]))}}return this.path(m).attr({fill:"#000",stroke:"none"})},k.add=function(b){if(a.is(b,"array")){var c=this.set(),e=0,f=b.length,h;for(;e<f;e++)h=b[e]||{},d[g](h.type)&&c.push(this[h.type]().attr(h))}return c},a.format=function(b,c){var d=a.is(c,E)?[0][n](c):arguments;b&&a.is(b,D)&&d.length-1&&(b=b.replace(e,function(a,b){return d[++b]==null?p:d[b]}));return b||p},a.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),typeof e=="function"&&f&&(e=e()))}),e=(e==null||e==d?a:e)+"";return e};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),a.ninja=function(){i.was?h.win.Raphael=i.is:delete Raphael;return a},a.st=cH,function(b,c,d){function e(){/in/.test(b.readyState)?setTimeout(e,9):a.eve("raphael.DOMload")}b.readyState==null&&b.addEventListener&&(b.addEventListener(c,d=function(){b.removeEventListener(c,d,!1),b.readyState="complete"},!1),b.readyState="loading"),e()}(document,"DOMContentLoaded"),i.was?h.win.Raphael=a:Raphael=a,eve.on("raphael.DOMload",function(){b=!0})}(),window.Raphael.svg&&function(a){var b="hasOwnProperty",c=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=a.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){typeof d=="string"&&(d=q(d));for(var f in e)e[b](f)&&(f.substring(0,6)=="xlink:"?d.setAttributeNS(n,f.substring(6),c(e[f])):d.setAttribute(f,c(e[f])))}else d=a._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(b,e){var j="linear",k=b.id+e,m=.5,n=.5,o=b.node,p=b.paper,r=o.style,s=a._g.doc.getElementById(k);if(!s){e=c(e).replace(a._radial_gradient,function(a,b,c){j="radial";if(b&&c){m=d(b),n=d(c);var e=(n>.5)*2-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&n!=.5&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/);if(j=="linear"){var t=e.shift();t=-d(t);if(isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient);if(!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,j=="radial"?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;x<y;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}q(o,{fill:"url(#"+k+")",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1;return 1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if(d.type=="path"){var g=c(e).toLowerCase().split("-"),h=d.paper,i=f?"end":"start",j=d.node,k=d.attrs,m=k["stroke-width"],n=g.length,r="classic",s,t,u,v,w,x=3,y=3,z=5;while(n--)switch(g[n]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":r=g[n];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}r=="open"?(x+=2,y+=2,z+=2,u=1,v=f?4:1,w={fill:"none",stroke:k.stroke}):(v=u=x/2,w={fill:k.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={};if(r!="none"){var A="raphael-marker-"+r,B="raphael-marker-"+i+r+x+y;a._g.doc.getElementById(A)?p[A]++:(h.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[r],id:A})),p[A]=1);var C=a._g.doc.getElementById(B),D;C?(p[B]++,D=C.getElementsByTagName("use")[0]):(C=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:v,refY:y/2}),D=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),C.appendChild(D),h.defs.appendChild(C),p[B]=1),q(D,w);var F=u*(r!="diamond"&&r!="oval");f?(s=d._.arrows.startdx*m||0,t=a.getTotalLength(k.path)-F*m):(s=F*m,t=a.getTotalLength(k.path)-(d._.arrows.enddx*m||0)),w={},w["marker-"+i]="url(#"+B+")";if(t||s)w.d=Raphael.getSubpath(k.path,s,t);q(j,w),d._.arrows[i+"Path"]=A,d._.arrows[i+"Marker"]=B,d._.arrows[i+"dx"]=F,d._.arrows[i+"Type"]=r,d._.arrows[i+"String"]=e}else f?(s=d._.arrows.startdx*m||0,t=a.getTotalLength(k.path)-s):(s=0,t=a.getTotalLength(k.path)-(d._.arrows.enddx*m||0)),d._.arrows[i+"Path"]&&q(j,{d:Raphael.getSubpath(k.path,s,t)}),delete d._.arrows[i+"Path"],delete d._.arrows[i+"Marker"],delete d._.arrows[i+"dx"],delete d._.arrows[i+"Type"],delete d._.arrows[i+"String"];for(w in p)if(p[b](w)&&!p[w]){var G=a._g.doc.getElementById(w);G&&G.parentNode.removeChild(G)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,b,d){b=u[c(b).toLowerCase()];if(b){var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=b.length;while(h--)g[h]=b[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[b](o)){if(!a._availableAttrs[b](o))continue;var p=f[o];k[o]=p;switch(o){case"blur":d.blur(p);break;case"href":case"title":case"target":var u=i.parentNode;if(u.tagName.toLowerCase()!="a"){var w=q("a");u.insertBefore(w,i),w.appendChild(i),u=w}o=="target"?u.setAttributeNS(n,"show",p=="blank"?"new":p):u.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var x=c(p).split(j);if(x.length==4){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var z=q("clipPath"),A=q("rect");z.id=a.createUUID(),q(A,{x:x[0],y:x[1],width:x[2],height:x[3]}),z.appendChild(A),d.paper.defs.appendChild(z),q(i,{"clip-path":"url(#"+z.id+")"}),d.clip=A}if(!p){var B=i.getAttribute("clip-path");if(B){var C=a._g.doc.getElementById(B.replace(/(^url\(#|\)$)/g,l));C&&C.parentNode.removeChild(C),q(i,{"clip-path":l}),delete d.clip}}break;case"path":d.type=="path"&&(q(i,{d:p?k.path=a._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":i.setAttribute(o,p),d._.dirty=1;if(k.fx)o="x",p=k.x;else break;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if(o=="rx"&&d.type=="rect")break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":i.setAttribute(o,p),d._.dirty=1;if(k.fy)o="y",p=k.y;else break;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if(o=="ry"&&d.type=="rect")break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":d.type=="rect"?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":d.type=="image"&&i.setAttributeNS(n,"href",p);break;case"stroke-width":if(d._.sx!=1||d._.sy!=1)p/=g(h(d._.sx),h(d._.sy))||1;d.paper._vbSize&&(p*=d.paper._vbSize),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var D=c(p).match(a._ISURL);if(D){z=q("pattern");var F=q("image");z.id=a.createUUID(),q(z,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(F,{x:0,y:0,"xlink:href":D[1]}),z.appendChild(F),function(b){a._preload(D[1],function(){var a=this.offsetWidth,c=this.offsetHeight;q(b,{width:a,height:c}),q(F,{width:a,height:c}),d.paper.safari()})}(z),d.paper.defs.appendChild(z),q(i,{fill:"url(#"+z.id+")"}),d.pattern=z,d.pattern&&s(d);break}var G=a.getRGB(p);if(!G.error)delete f.gradient,delete k.gradient,!a.is(k.opacity,"undefined")&&a.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!a.is(k["fill-opacity"],"undefined")&&a.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});else if((d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(H){var I=H.getElementsByTagName("stop");q(I[I.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}G[b]("opacity")&&q(i,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(p),i.setAttribute(o,G.hex),o=="stroke"&&G[b]("opacity")&&q(i,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity}),o=="stroke"&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":(d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p);break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),H&&(I=H.getElementsByTagName("stop"),q(I[I.length-1],{"stop-opacity":p}));break};default:o=="font-size"&&(p=e(p,10)+"px");var J=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[J]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if(d.type=="text"&&!!(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){g.text=f.text;while(h.firstChild)h.removeChild(h.firstChild);var j=c(f.text).split("\n"),k=[],m;for(var n=0,o=j.length;n<o;n++)m=q("tspan"),n&&q(m,{dy:i*x,x:g.x}),m.appendChild(a._g.doc.createTextNode(j[n])),h.appendChild(m),k[n]=m}else{k=h.getElementsByTagName("tspan");for(n=0,o=k.length;n<o;n++)n?q(k[n],{dy:i*x,x:g.x}):q(k[0],{dy:0})}q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&a.is(r,"finite")&&q(k[0],{dy:r})}},z=function(b,c){var d=0,e=0;this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=a.matrix(),this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},A=a.el;z.prototype=A,A.constructor=z,a._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new z(c,b);d.type="path",w(d,{fill:"none",stroke:"#000",path:a});return d},A.rotate=function(a,b,e){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),e==null&&(b=e);if(b==null||e==null){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}this.transform(this._.transform.concat([["r",a,b,e]]));return this},A.scale=function(a,b,e,f){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),b==null&&(b=a),f==null&&(e=f);if(e==null||f==null)var g=this.getBBox(1);e=e==null?g.x+g.width/2:e,f=f==null?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]]));return this},A.translate=function(a,b){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this.transform(this._.transform.concat([["t",a,b]]));return this},A.transform=function(c){var d=this._;if(c==null)return d.transform;a._extractTransform(this,c),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix});if(d.sx!=1||d.sy!=1){var e=this.attrs[b]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},A.hide=function(){!this.removed&&this.paper.safari(this.node.style.display="none");return this},A.show=function(){!this.removed&&this.paper.safari(this.node.style.display="");return this},A.remove=function(){if(!this.removed&&!!this.node.parentNode){var b=this.paper;b.__set__&&b.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&b.defs.removeChild(this.gradient),a._tear(this,b),this.node.parentNode.tagName.toLowerCase()=="a"?this.node.parentNode.parentNode.removeChild(this.node.parentNode):this.node.parentNode.removeChild(this.node);for(var c in this)this[c]=typeof this[c]=="function"?a._removedFactory(c):null;this.removed=!0}},A._getBBox=function(){if(this.node.style.display=="none"){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}a&&this.hide();return b},A.attr=function(c,d){if(this.removed)return this;if(c==null){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);e.gradient&&e.fill=="none"&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform;return e}if(d==null&&a.is(c,"string")){if(c=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;if(c=="transform")return this._.transform;var g=c.split(j),h={};for(var i=0,l=g.length;i<l;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return l-1?h:h[g[0]]}if(d==null&&a.is(c,"array")){h={};for(i=0,l=c.length;i<l;i++)h[c[i]]=this.attr(c[i]);return h}if(d!=null){var m={};m[c]=d}else c!=null&&a.is(c,"object")&&(m=c);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[b](n)&&m[b](n)&&a.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[b](p)&&(m[p]=o[p])}w(this,m);return this},A.toFront=function(){if(this.removed)return this;this.node.parentNode.tagName.toLowerCase()=="a"?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var b=this.paper;b.top!=this&&a._tofront(this,b);return this},A.toBack=function(){if(this.removed)return this;var b=this.node.parentNode;b.tagName.toLowerCase()=="a"?b.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):b.firstChild!=this.node&&b.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper);var c=this.paper;return this},A.insertAfter=function(b){if(this.removed)return this;var c=b.node||b[b.length-1].node;c.nextSibling?c.parentNode.insertBefore(this.node,c.nextSibling):c.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper);return this},A.insertBefore=function(b){if(this.removed)return this;var c=b.node||b[0].node;c.parentNode.insertBefore(this.node,c),a._insertbefore(this,b,this.paper);return this},A.blur=function(b){var c=this;if(+b!==0){var d=q("filter"),e=q("feGaussianBlur");c.attrs.blur=b,d.id=a.createUUID(),q(e,{stdDeviation:+b||1.5}),d.appendChild(e),c.paper.defs.appendChild(d),c._blur=d,q(c.node,{filter:"url(#"+d.id+")"})}else c._blur&&(c._blur.parentNode.removeChild(c._blur),delete c._blur,delete c.attrs.blur),c.node.removeAttribute("filter")},a._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new z(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs);return f},a._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs);return h},a._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs);return g},a._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image";return h},a._engine.text=function(b,c,d,e){var f=q("text");b.canvas&&b.canvas.appendChild(f);var g=new z(f,b);g.attrs={x:c,y:d,"text-anchor":"middle",text:e,font:a._availableAttrs.font,stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs);return g},a._engine.setSize=function(a,b){this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox);return this},a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,g=b.height;if(!c)throw new Error("SVG container not found.");var h=q("svg"),i="overflow:hidden;",j;d=d||0,e=e||0,f=f||512,g=g||342,q(h,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),c==1?(h.style.cssText=i+"position:absolute;left:"+d+"px;top:"+e+"px",a._g.doc.body.appendChild(h),j=1):(h.style.cssText=i+"position:relative",c.firstChild?c.insertBefore(h,c.firstChild):c.appendChild(h)),c=new a._Paper,c.width=f,c.height=g,c.canvas=h,c.clear(),c._left=c._top=0,j&&(c.renderfix=function(){}),c.renderfix();return c},a._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=g(c/this.width,d/this.height),h=this.top,i=e?"meet":"xMinYMin",j,l;a==null?(this._vbSize&&(f=1),delete this._vbSize,j="0 0 "+this.width+m+this.height):(this._vbSize=f,j=a+m+b+m+c+m+d),q(this.canvas,{viewBox:j,preserveAspectRatio:i});while(f&&h)l="stroke-width"in h.attrs?h.attrs["stroke-width"]:1,h.attr({"stroke-width":l}),h._.dirty=1,h._.dirtyT=1,h=h.prev;this._viewBox=[a,b,c,d,!!e];return this},a.prototype.renderfix=function(){var a=this.canvas,b=a.style,c;try{c=a.getScreenCTM()||a.createSVGMatrix()}catch(d){c=a.createSVGMatrix()}var e=-c.e%1,f=-c.f%1;if(e||f)e&&(this._left=(this._left+e)%1,b.left=this._left+"px"),f&&(this._top=(this._top+f)%1,b.top=this._top+"px")},a.prototype.clear=function(){a.eve("raphael.clear",this);var b=this.canvas;while(b.firstChild)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(a._g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=q("defs"))},a.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null};var B=a.st;for(var C in A)A[b](C)&&!B[b](C)&&(B[C]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(C))}(window.Raphael),window.Raphael.vml&&function(a){var b="hasOwnProperty",c=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=a.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(b){var d=/[ahqstv]/ig,e=a._pathToAbsolute;c(b).match(d)&&(e=a._path2curve),d=/[clmz]/g;if(e==a._pathToAbsolute&&!c(b).match(d)){var g=c(b).replace(q,function(a,b,c){var d=[],e=b.toLowerCase()=="m",g=p[b];c.replace(s,function(a){e&&d.length==2&&(g+=d+p[b=="m"?"l":"L"],d=[]),d.push(f(a*u))});return g+d});return g}var h=e(b),i,j;g=[];for(var k=0,l=h.length;k<l;k++){i=h[k],j=h[k][0].toLowerCase(),j=="z"&&(j="x");for(var m=1,r=i.length;m<r;m++)j+=f(i[m]*u)+(m!=r-1?",":o);g.push(j)}return g.join(n)},y=function(b,c,d){var e=a.matrix();e.rotate(-b,.5,.5);return{dx:e.x(c,d),dy:e.y(c,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q,r=u/b,s=u/c;m.visibility="hidden";if(!!b&&!!c){l.coordsize=i(r)+n+i(s),m.rotation=f*(b*c<0?-1:1);if(f){var t=y(f,d,e);d=t.dx,e=t.dy}b<0&&(p+="x"),c<0&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-r+n+e*-s;if(k||g.fillsize){var v=l.getElementsByTagName(j);v=v&&v[0],l.removeChild(v),k&&(t=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),v.position=t.dx*o+n+t.dy*o),g.fillsize&&(v.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(v)}m.visibility="visible"}};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,b,d){var e=c(b).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";while(g--)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q,r=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),s=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),t=e;for(var y in i)i[b](y)&&(m[y]=i[y]);r&&(m.path=a._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur);if(i.path&&e.type=="path"||r)l.path=x(~c(m.path).toLowerCase().indexOf("r")?a._pathToAbsolute(m.path):m.path),e.type=="image"&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0));"transform"in i&&e.transform(i.transform);if(s){var B=+m.cx,D=+m.cy,E=+m.rx||+m.r||0,G=+m.ry||+m.r||0;l.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((B-E)*u),f((D-G)*u),f((B+E)*u),f((D+G)*u),f(B*u))}if("clip-rect"in i){var H=c(i["clip-rect"]).split(k);if(H.length==4){H[2]=+H[2]+ +H[0],H[3]=+H[3]+ +H[1];var I=l.clipRect||a._g.doc.createElement("div"),J=I.style;J.clip=a.format("rect({1}px {2}px {3}px {0}px)",H),l.clipRect||(J.position="absolute",J.top=0,J.left=0,J.width=e.paper.width+"px",J.height=e.paper.height+"px",l.parentNode.insertBefore(I,l),I.appendChild(l),l.clipRect=I)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var K=e.textpath.style;i.font&&(K.font=i.font),i["font-family"]&&(K.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(K.fontSize=i["font-size"]),i["font-weight"]&&(K.fontWeight=i["font-weight"]),i["font-style"]&&(K.fontStyle=i["font-style"])}"arrow-start"in i&&A(t,i["arrow-start"]),"arrow-end"in i&&A(t,i["arrow-end"],1);if(i.opacity!=null||i["stroke-width"]!=null||i.fill!=null||i.src!=null||i.stroke!=null||i["stroke-width"]!=null||i["stroke-opacity"]!=null||i["fill-opacity"]!=null||i["stroke-dasharray"]!=null||i["stroke-miterlimit"]!=null||i["stroke-linejoin"]!=null||i["stroke-linecap"]!=null){var L=l.getElementsByTagName(j),M=!1;L=L&&L[0],!L&&(M=L=F(j)),e.type=="image"&&i.src&&(L.src=i.src),i.fill&&(L.on=!0);if(L.on==null||i.fill=="none"||i.fill===null)L.on=!1;if(L.on&&i.fill){var N=c(i.fill).match(a._ISURL);if(N){L.parentNode==l&&l.removeChild(L),L.rotate=!0,L.src=N[1],L.type="tile";var O=e.getBBox(1);L.position=O.x+n+O.y,e._.fillpos=[O.x,O.y],a._preload(N[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else L.color=a.getRGB(i.fill).hex,L.src=o,L.type="solid",a.getRGB(i.fill).error&&(t.type in{circle:1,ellipse:1}||c(i.fill).charAt()!="r")&&C(t,i.fill,L)&&(m.fill="none",m.gradient=i.fill,L.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var P=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+a.getRGB(i.fill).o+1||2)-1);P=h(g(P,0),1),L.opacity=P,L.src&&(L.color="none")}l.appendChild(L);var Q=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],T=!1;!Q&&(T=Q=F("stroke"));if(i.stroke&&i.stroke!="none"||i["stroke-width"]||i["stroke-opacity"]!=null||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])Q.on=!0;(i.stroke=="none"||i.stroke===null||Q.on==null||i.stroke==0||i["stroke-width"]==0)&&(Q.on=!1);var U=a.getRGB(i.stroke);Q.on&&i.stroke&&(Q.color=U.hex),P=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+U.o+1||2)-1);var V=(d(i["stroke-width"])||1)*.75;P=h(g(P,0),1),i["stroke-width"]==null&&(V=m["stroke-width"]),i["stroke-width"]&&(Q.weight=V),V&&V<1&&(P*=V)&&(Q.weight=1),Q.opacity=P,i["stroke-linejoin"]&&(Q.joinstyle=i["stroke-linejoin"]||"miter"),Q.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(Q.endcap=i["stroke-linecap"]=="butt"?"flat":i["stroke-linecap"]=="square"?"square":"round");if(i["stroke-dasharray"]){var W={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};Q.dashstyle=W[b](i["stroke-dasharray"])?W[i["stroke-dasharray"]]:o}T&&l.appendChild(Q)}if(t.type=="text"){t.paper.canvas.style.display=o;var X=t.paper.span,Y=100,Z=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=X.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),Z=d(m["font-size"]||Z&&Z[0])||10,p.fontSize=Z*Y+"px",t.textpath.string&&(X.innerHTML=c(t.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));var $=X.getBoundingClientRect();t.W=m.w=($.right-$.left)/Y,t.H=m.h=($.bottom-$.top)/Y,t.X=m.x,t.Y=m.y+t.H/2,("x"in i||"y"in i)&&(t.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));var _=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var ba=0,bb=_.length;ba<bb;ba++)if(_[ba]in i){t._.dirty=1;break}switch(m["text-anchor"]){case"start":t.textpath.style["v-text-align"]="left",t.bbx=t.W/2;break;case"end":t.textpath.style["v-text-align"]="right",t.bbx=-t.W/2;break;default:t.textpath.style["v-text-align"]="center",t.bbx=0}t.textpath.style["v-text-kern"]=!0}},C=function(b,f,g){b.attrs=b.attrs||{};var h=b.attrs,i=Math.pow,j,k,l="linear",m=".5 .5";b.attrs.gradient=f,f=c(f).replace(a._radial_gradient,function(a,b,c){l="radial",b&&c&&(b=d(b),c=d(c),i(b-.5,2)+i(c-.5,2)>.25&&(c=e.sqrt(.25-i(b-.5,2))*((c>.5)*2-1)+.5),m=b+n+c);return o}),f=f.split(/\s*\-\s*/);if(l=="linear"){var p=f.shift();p=-d(p);if(isNaN(p))return null}var q=a._parseDots(f);if(!q)return null;b=b.shape||b.node;if(q.length){b.removeChild(g),g.on=!0,g.method="none",g.color=q[0].color,g.color2=q[q.length-1].color;var r=[];for(var s=0,t=q.length;s<t;s++)q[s].offset&&r.push(q[s].offset+n+q[s].color);g.colors=r.length?r.join():"0% "+g.color,l=="radial"?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=m,g.angle=0):(g.type="gradient",g.angle=(270-p)%360),b.appendChild(g)}return 1},D=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=a.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},E=a.el;D.prototype=E,E.constructor=D,E.transform=function(b){if(b==null)return this._.transform;var d=this.paper._viewBoxShift,e=d?"s"+[d.scale,d.scale]+"-1-1t"+[d.dx,d.dy]:o,f;d&&(f=b=c(b).replace(/\.{3}|\u2026/g,this._.transform||o)),a._extractTransform(this,e+b);var g=this.matrix.clone(),h=this.skew,i=this.node,j,k=~c(this.attrs.fill).indexOf("-"),l=!c(this.attrs.fill).indexOf("url(");g.translate(-0.5,-0.5);if(l||k||this.type=="image"){h.matrix="1 0 0 1",h.offset="0 0",j=g.split();if(k&&j.noRotation||!j.isSimple){i.style.filter=g.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;i.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else i.style.filter=o,z(this,j.scalex,j.scaley,j.dx,j.dy,j.rotate)}else i.style.filter=o,h.matrix=c(g),h.offset=g.offset();f&&(this._.transform=f);return this},E.rotate=function(a,b,e){if(this.removed)return this;if(a!=null){a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),e==null&&(b=e);if(b==null||e==null){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,b,e]]));return this}},E.translate=function(a,b){if(this.removed)return this;a=c(a).split(k),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=b),this.transform(this._.transform.concat([["t",a,b]]));return this},E.scale=function(a,b,e,f){if(this.removed)return this;a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),b==null&&(b=a),f==null&&(e=f);if(e==null||f==null)var g=this.getBBox(1);e=e==null?g.x+g.width/2:e,f=f==null?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this._.dirtyT=1;return this},E.hide=function(){!this.removed&&(this.node.style.display="none");return this},E.show=function(){!this.removed&&(this.node.style.display=o);return this},E._getBBox=function(){if(this.removed)return{};return{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&!!this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),a.eve.unbind("raphael.*.*."+this.id),a._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;this.removed=!0}},E.attr=function(c,d){if(this.removed)return this;if(c==null){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);e.gradient&&e.fill=="none"&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform;return e}if(d==null&&a.is(c,"string")){if(c==j&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;var g=c.split(k),h={};for(var i=0,m=g.length;i<m;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return m-1?h:h[g[0]]}if(this.attrs&&d==null&&a.is(c,"array")){h={};for(i=0,m=c.length;i<m;i++)h[c[i]]=this.attr(c[i]);return h}var n;d!=null&&(n={},n[c]=d),d==null&&a.is(c,"object")&&(n=c);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[b](o)&&n[b](o)&&a.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[b](q)&&(n[q]=p[q])}n.text&&this.type=="text"&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&a._tofront(this,this.paper);return this},E.toBack=function(){if(this.removed)return this;this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper));return this},E.insertAfter=function(b){if(this.removed)return this;b.constructor==a.st.constructor&&(b=b[b.length-1]),b.node.nextSibling?b.node.parentNode.insertBefore(this.node,b.node.nextSibling):b.node.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper);return this},E.insertBefore=function(b){if(this.removed)return this;b.constructor==a.st.constructor&&(b=b[0]),b.node.parentNode.insertBefore(this.node,b.node),a._insertbefore(this,b,this.paper);return this},E.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(r,o),+b!==0?(this.attrs.blur=b,c.filter=d+n+m+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",f(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur)},a._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");f.on=!0,c.appendChild(f),d.skew=f,d.transform(o);return d},a._engine.rect=function(b,c,d,e,f,g){var h=a._rectPath(c,d,e,f,g),i=b.path(h),j=i.attrs;i.X=j.x=c,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect";return i},a._engine.ellipse=function(a,b,c,d,e){var f=a.path(),g=f.attrs;f.X=b-d,f.Y=c-e,f.W=d*2,f.H=e*2,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e});return f},a._engine.circle=function(a,b,c,d){var e=a.path(),f=e.attrs;e.X=b-d,e.Y=c-d,e.W=e.H=d*2,e.type="circle",B(e,{cx:b,cy:c,r:d});return e},a._engine.image=function(b,c,d,e,f,g){var h=a._rectPath(d,e,f,g),i=b.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];k.src=c,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=c,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0);return i},a._engine.text=function(b,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=a.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=c(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,b),l={fill:"#000",stroke:"none",font:a._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=c(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),b.canvas.appendChild(h);var m=F("skew");m.on=!0,h.appendChild(m),k.skew=m,k.transform(o);return k},a._engine.setSize=function(b,c){var d=this.canvas.style;this.width=b,this.height=c,b==+b&&(b+="px"),c==+c&&(c+="px"),d.width=b,d.height=c,d.clip="rect(0 "+b+" "+c+" 0)",this._viewBox&&a._engine.setViewBox.apply(this,this._viewBox);return this},a._engine.setViewBox=function(b,c,d,e,f){a.eve("raphael.setViewBox",this,this._viewBox,[b,c,d,e,f]);var h=this.width,i=this.height,j=1/g(d/h,e/i),k,l;f&&(k=i/e,l=h/d,d*k<h&&(b-=(h-d*k)/2/k),e*l<i&&(c-=(i-e*l)/2/l)),this._viewBox=[b,c,d,e,!!f],this._viewBoxShift={dx:-b,dy:-c,scale:j},this.forEach(function(a){a.transform("...")});return this};var F;a._engine.initWin=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e,f=b.width,g=b.x,h=b.y;if(!c)throw new Error("VML container not found.");var i=new a._Paper,j=i.canvas=a._g.doc.createElement("div"),k=j.style;g=g||0,h=h||0,f=f||512,d=d||342,i.width=f,i.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),i.coordsize=u*1e3+n+u*1e3,i.coordorigin="0 0",i.span=a._g.doc.createElement("span"),i.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",j.appendChild(i.span),k.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(a._g.doc.body.appendChild(j),k.left=g+"px",k.top=h+"px",k.position="absolute"):c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j),i.renderfix=function(){};return i},a.prototype.clear=function(){a.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E)E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}(window.Raphael)
\ No newline at end of file

=== added directory 'debian/extras/jslibs/yui'
=== added directory 'debian/extras/jslibs/yui/align-plugin'
=== added file 'debian/extras/jslibs/yui/align-plugin/align-plugin-debug.js'
--- debian/extras/jslibs/yui/align-plugin/align-plugin-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/align-plugin/align-plugin-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,199 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('align-plugin', function(Y) {
+
+    /**
+     * Provides advanced positioning support for Node via a Plugin
+     * for centering and alignment. 
+     * @module align-plugin
+     */
+
+    var OFFSET_WIDTH = 'offsetWidth',
+        OFFSET_HEIGHT = 'offsetHeight',
+        undefined = undefined;
+
+    /**
+     * Node plugin which can be used to align a node with another node,
+     * region, or the viewport.
+     *
+     * @class Plugin.Align
+     * @param {Object} User configuration object
+     */
+    function Align(config) {
+        if (config.host) {
+            this._host = config.host;
+        }
+    }
+        
+    Align.prototype = {
+        /**
+         * Aligns node with a point on another node or region.
+         * Possible alignment points are:
+         * <dl>
+         *      <dt>tl</dt>
+         *      <dd>top left</dd>
+         *      <dt>tr</dt>
+         *      <dd>top right</dd>
+         *      <dt>bl</dt>
+         *      <dd>bottom left</dd>
+         *      <dt>br</dt>
+         *      <dd>bottom right</dd>
+         *      <dt>tc</dt>
+         *      <dd>top center</dd>
+         *      <dt>bc</dt>
+         *      <dd>bottom center</dd>
+         *      <dt>rc</dt>
+         *      <dd>right center</dd>
+         *      <dt>lc</dt>
+         *      <dd>left center</dd>
+         *      <dt>cc</dt>
+         *      <dd>center center</dd>
+         * </dl>
+         * @method to 
+         * @param region {String || Node || HTMLElement || Object} The node or
+         * region to align with. Defaults to the viewport region.
+         * @param regionPoint {String} The point of the region to align with.
+         * @param point {String} The point of the node aligned to the region. 
+         * @param resize {Boolean} Whether or not the node should re-align when
+         * the window is resized. Defaults to false.
+         */
+        to: function(region, regionPoint, point, syncOnResize) {
+            // cache original args for syncing
+            this._syncArgs = Y.Array(arguments);
+
+            if (region.top === undefined) {
+                region = Y.one(region).get('region');
+            }
+
+            if (region) {
+                var xy = [region.left, region.top],
+                    offxy = [region.width, region.height],
+                    points = Align.points,
+                    node = this._host,
+                    NULL = null,
+                    size = node.getAttrs([OFFSET_HEIGHT, OFFSET_WIDTH]),
+                    nodeoff = [0 - size[OFFSET_WIDTH], 0 - size[OFFSET_HEIGHT]], // reverse offsets
+                    regionFn0 = regionPoint ? points[regionPoint.charAt(0)]: NULL,
+                    regionFn1 = (regionPoint && regionPoint !== 'cc') ? points[regionPoint.charAt(1)] : NULL,
+                    nodeFn0 = point ? points[point.charAt(0)] : NULL,
+                    nodeFn1 = (point && point !== 'cc') ? points[point.charAt(1)] : NULL;
+
+                if (regionFn0) {
+                    xy = regionFn0(xy, offxy, regionPoint);
+                }
+                if (regionFn1) {
+                    xy = regionFn1(xy, offxy, regionPoint);
+                }
+
+                if (nodeFn0) {
+                    xy = nodeFn0(xy, nodeoff, point);
+                }
+                if (nodeFn1) {
+                    xy = nodeFn1(xy, nodeoff, point);
+                }
+
+                if (xy && node) {
+                    node.setXY(xy);
+                }
+                
+                this._resize(syncOnResize);
+
+            }
+            return this;
+        },
+
+        sync: function() {
+            this.to.apply(this, this._syncArgs);
+            return this;
+        },
+
+        _resize: function(add) {
+            var handle = this._handle;
+            if (add && !handle) {
+                this._handle = Y.on('resize', this._onresize, window, this);
+            } else if (!add && handle) {
+                handle.detach();
+            }
+
+        },
+
+        _onresize: function() {
+            var self = this;
+            setTimeout(function() { // for performance
+                self.sync();
+            });
+        },
+    
+        /**
+         * Aligns the center of a node to the center of another node or region.
+         * @method center 
+         * @param region {Node || HTMLElement || Object} optional The node or
+         * region to align with. Defaults to the viewport region.
+         * the window is resized. If centering to viewport, this defaults
+         * to true, otherwise default is false.
+         */
+        center: function(region, resize) {
+            this.to(region, 'cc', 'cc', resize); 
+            return this;
+        },
+
+        /**
+         * Removes the resize handler, if any. This is called automatically
+         * when unplugged from the host node.
+         * @method destroy 
+         */
+        destroy: function() {
+            var handle = this._handle;
+            if (handle) {
+                handle.detach();
+            }
+        }
+    };
+
+    Align.points = {
+        't': function(xy, off) {
+            return xy;
+        },
+
+        'r': function(xy, off) {
+            return [xy[0] + off[0], xy[1]];
+        },
+
+        'b': function(xy, off) {
+            return [xy[0], xy[1] + off[1]];
+        },
+
+        'l': function(xy, off) {
+            return xy;
+        },
+
+        'c': function(xy, off, point) {
+            var axis = (point[0] === 't' || point[0] === 'b') ?  0 : 1,
+                ret, val;
+
+            if (point === 'cc') {
+                ret = [xy[0] + off[0] / 2, xy[1] + off[1] / 2];
+            } else {
+                val = xy[axis] + off[axis] / 2;
+                ret = (axis) ? [xy[0], val] : [val, xy[1]];
+            }
+
+             return ret;
+        }
+    };
+
+    Align.NAME = 'Align';
+    Align.NS = 'align';
+
+    Align.prototype.constructor = Align;
+
+    Y.namespace('Plugin');
+    Y.Plugin.Align = Align;
+
+
+
+}, '3.5.1' ,{requires:['node-pluginhost', 'node-screen']});

=== added file 'debian/extras/jslibs/yui/align-plugin/align-plugin-min.js'
--- debian/extras/jslibs/yui/align-plugin/align-plugin-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/align-plugin/align-plugin-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("align-plugin",function(c){var e="offsetWidth",d="offsetHeight",b=b;function a(f){if(f.host){this._host=f.host;}}a.prototype={to:function(j,t,l,o){this._syncArgs=c.Array(arguments);if(j.top===b){j=c.one(j).get("region");}if(j){var s=[j.left,j.top],q=[j.width,j.height],n=a.points,f=this._host,h=null,r=f.getAttrs([d,e]),k=[0-r[e],0-r[d]],p=t?n[t.charAt(0)]:h,m=(t&&t!=="cc")?n[t.charAt(1)]:h,i=l?n[l.charAt(0)]:h,g=(l&&l!=="cc")?n[l.charAt(1)]:h;if(p){s=p(s,q,t);}if(m){s=m(s,q,t);}if(i){s=i(s,k,l);}if(g){s=g(s,k,l);}if(s&&f){f.setXY(s);}this._resize(o);}return this;},sync:function(){this.to.apply(this,this._syncArgs);return this;},_resize:function(g){var f=this._handle;if(g&&!f){this._handle=c.on("resize",this._onresize,window,this);}else{if(!g&&f){f.detach();}}},_onresize:function(){var f=this;setTimeout(function(){f.sync();});},center:function(g,f){this.to(g,"cc","cc",f);return this;},destroy:function(){var f=this._handle;if(f){f.detach();}}};a.points={"t":function(f,g){return f;},"r":function(f,g){return[f[0]+g[0],f[1]];},"b":function(f,g){return[f[0],f[1]+g[1]];},"l":function(f,g){return f;},"c":function(i,k,f){var h=(f[0]==="t"||f[0]==="b")?0:1,g,j;if(f==="cc"){g=[i[0]+k[0]/2,i[1]+k[1]/2];}else{j=i[h]+k[h]/2;g=(h)?[i[0],j]:[j,i[1]];}return g;}};a.NAME="Align";a.NS="align";a.prototype.constructor=a;c.namespace("Plugin");c.Plugin.Align=a;},"3.5.1",{requires:["node-pluginhost","node-screen"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/align-plugin/align-plugin.js'
--- debian/extras/jslibs/yui/align-plugin/align-plugin.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/align-plugin/align-plugin.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,199 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('align-plugin', function(Y) {
+
+    /**
+     * Provides advanced positioning support for Node via a Plugin
+     * for centering and alignment. 
+     * @module align-plugin
+     */
+
+    var OFFSET_WIDTH = 'offsetWidth',
+        OFFSET_HEIGHT = 'offsetHeight',
+        undefined = undefined;
+
+    /**
+     * Node plugin which can be used to align a node with another node,
+     * region, or the viewport.
+     *
+     * @class Plugin.Align
+     * @param {Object} User configuration object
+     */
+    function Align(config) {
+        if (config.host) {
+            this._host = config.host;
+        }
+    }
+        
+    Align.prototype = {
+        /**
+         * Aligns node with a point on another node or region.
+         * Possible alignment points are:
+         * <dl>
+         *      <dt>tl</dt>
+         *      <dd>top left</dd>
+         *      <dt>tr</dt>
+         *      <dd>top right</dd>
+         *      <dt>bl</dt>
+         *      <dd>bottom left</dd>
+         *      <dt>br</dt>
+         *      <dd>bottom right</dd>
+         *      <dt>tc</dt>
+         *      <dd>top center</dd>
+         *      <dt>bc</dt>
+         *      <dd>bottom center</dd>
+         *      <dt>rc</dt>
+         *      <dd>right center</dd>
+         *      <dt>lc</dt>
+         *      <dd>left center</dd>
+         *      <dt>cc</dt>
+         *      <dd>center center</dd>
+         * </dl>
+         * @method to 
+         * @param region {String || Node || HTMLElement || Object} The node or
+         * region to align with. Defaults to the viewport region.
+         * @param regionPoint {String} The point of the region to align with.
+         * @param point {String} The point of the node aligned to the region. 
+         * @param resize {Boolean} Whether or not the node should re-align when
+         * the window is resized. Defaults to false.
+         */
+        to: function(region, regionPoint, point, syncOnResize) {
+            // cache original args for syncing
+            this._syncArgs = Y.Array(arguments);
+
+            if (region.top === undefined) {
+                region = Y.one(region).get('region');
+            }
+
+            if (region) {
+                var xy = [region.left, region.top],
+                    offxy = [region.width, region.height],
+                    points = Align.points,
+                    node = this._host,
+                    NULL = null,
+                    size = node.getAttrs([OFFSET_HEIGHT, OFFSET_WIDTH]),
+                    nodeoff = [0 - size[OFFSET_WIDTH], 0 - size[OFFSET_HEIGHT]], // reverse offsets
+                    regionFn0 = regionPoint ? points[regionPoint.charAt(0)]: NULL,
+                    regionFn1 = (regionPoint && regionPoint !== 'cc') ? points[regionPoint.charAt(1)] : NULL,
+                    nodeFn0 = point ? points[point.charAt(0)] : NULL,
+                    nodeFn1 = (point && point !== 'cc') ? points[point.charAt(1)] : NULL;
+
+                if (regionFn0) {
+                    xy = regionFn0(xy, offxy, regionPoint);
+                }
+                if (regionFn1) {
+                    xy = regionFn1(xy, offxy, regionPoint);
+                }
+
+                if (nodeFn0) {
+                    xy = nodeFn0(xy, nodeoff, point);
+                }
+                if (nodeFn1) {
+                    xy = nodeFn1(xy, nodeoff, point);
+                }
+
+                if (xy && node) {
+                    node.setXY(xy);
+                }
+                
+                this._resize(syncOnResize);
+
+            }
+            return this;
+        },
+
+        sync: function() {
+            this.to.apply(this, this._syncArgs);
+            return this;
+        },
+
+        _resize: function(add) {
+            var handle = this._handle;
+            if (add && !handle) {
+                this._handle = Y.on('resize', this._onresize, window, this);
+            } else if (!add && handle) {
+                handle.detach();
+            }
+
+        },
+
+        _onresize: function() {
+            var self = this;
+            setTimeout(function() { // for performance
+                self.sync();
+            });
+        },
+    
+        /**
+         * Aligns the center of a node to the center of another node or region.
+         * @method center 
+         * @param region {Node || HTMLElement || Object} optional The node or
+         * region to align with. Defaults to the viewport region.
+         * the window is resized. If centering to viewport, this defaults
+         * to true, otherwise default is false.
+         */
+        center: function(region, resize) {
+            this.to(region, 'cc', 'cc', resize); 
+            return this;
+        },
+
+        /**
+         * Removes the resize handler, if any. This is called automatically
+         * when unplugged from the host node.
+         * @method destroy 
+         */
+        destroy: function() {
+            var handle = this._handle;
+            if (handle) {
+                handle.detach();
+            }
+        }
+    };
+
+    Align.points = {
+        't': function(xy, off) {
+            return xy;
+        },
+
+        'r': function(xy, off) {
+            return [xy[0] + off[0], xy[1]];
+        },
+
+        'b': function(xy, off) {
+            return [xy[0], xy[1] + off[1]];
+        },
+
+        'l': function(xy, off) {
+            return xy;
+        },
+
+        'c': function(xy, off, point) {
+            var axis = (point[0] === 't' || point[0] === 'b') ?  0 : 1,
+                ret, val;
+
+            if (point === 'cc') {
+                ret = [xy[0] + off[0] / 2, xy[1] + off[1] / 2];
+            } else {
+                val = xy[axis] + off[axis] / 2;
+                ret = (axis) ? [xy[0], val] : [val, xy[1]];
+            }
+
+             return ret;
+        }
+    };
+
+    Align.NAME = 'Align';
+    Align.NS = 'align';
+
+    Align.prototype.constructor = Align;
+
+    Y.namespace('Plugin');
+    Y.Plugin.Align = Align;
+
+
+
+}, '3.5.1' ,{requires:['node-pluginhost', 'node-screen']});

=== added directory 'debian/extras/jslibs/yui/anim-base'
=== added file 'debian/extras/jslibs/yui/anim-base/anim-base-debug.js'
--- debian/extras/jslibs/yui/anim-base/anim-base-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-base/anim-base-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,682 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-base', function(Y) {
+
+/**
+* The Animation Utility provides an API for creating advanced transitions.
+* @module anim
+*/
+
+/**
+* Provides the base Anim class, for animating numeric properties.
+*
+* @module anim
+* @submodule anim-base
+*/
+
+    /**
+     * A class for constructing animation instances.
+     * @class Anim
+     * @for Anim
+     * @constructor
+     * @extends Base
+     */
+
+    var RUNNING = 'running',
+        START_TIME = 'startTime',
+        ELAPSED_TIME = 'elapsedTime',
+        /**
+        * @for Anim
+        * @event start
+        * @description fires when an animation begins.
+        * @param {Event} ev The start event.
+        * @type Event.Custom
+        */
+        START = 'start',
+
+        /**
+        * @event tween
+        * @description fires every frame of the animation.
+        * @param {Event} ev The tween event.
+        * @type Event.Custom
+        */
+        TWEEN = 'tween',
+
+        /**
+        * @event end
+        * @description fires after the animation completes.
+        * @param {Event} ev The end event.
+        * @type Event.Custom
+        */
+        END = 'end',
+        NODE = 'node',
+        PAUSED = 'paused',
+        REVERSE = 'reverse', // TODO: cleanup
+        ITERATION_COUNT = 'iterationCount',
+
+        NUM = Number;
+
+    var _running = {},
+        _timer;
+
+    Y.Anim = function() {
+        Y.Anim.superclass.constructor.apply(this, arguments);
+        Y.Anim._instances[Y.stamp(this)] = this;
+    };
+
+    Y.Anim.NAME = 'anim';
+
+    Y.Anim._instances = {};
+
+    /**
+     * Regex of properties that should use the default unit.
+     *
+     * @property RE_DEFAULT_UNIT
+     * @static
+     */
+    Y.Anim.RE_DEFAULT_UNIT = /^width|height|top|right|bottom|left|margin.*|padding.*|border.*$/i;
+
+    /**
+     * The default unit to use with properties that pass the RE_DEFAULT_UNIT test.
+     *
+     * @property DEFAULT_UNIT
+     * @static
+     */
+    Y.Anim.DEFAULT_UNIT = 'px';
+
+    Y.Anim.DEFAULT_EASING = function (t, b, c, d) {
+        return c * t / d + b; // linear easing
+    };
+
+    /**
+     * Time in milliseconds passed to setInterval for frame processing 
+     *
+     * @property intervalTime
+     * @default 20
+     * @static
+     */
+    Y.Anim._intervalTime = 20;
+
+    /**
+     * Bucket for custom getters and setters
+     *
+     * @property behaviors
+     * @static
+     */
+    Y.Anim.behaviors = {
+        left: {
+            get: function(anim, attr) {
+                return anim._getOffset(attr);
+            }
+        }
+    };
+
+    Y.Anim.behaviors.top = Y.Anim.behaviors.left;
+
+    /**
+     * The default setter to use when setting object properties.
+     *
+     * @property DEFAULT_SETTER
+     * @static
+     */
+    Y.Anim.DEFAULT_SETTER = function(anim, att, from, to, elapsed, duration, fn, unit) {
+        var node = anim._node,
+            domNode = node._node,
+            val = fn(elapsed, NUM(from), NUM(to) - NUM(from), duration);
+        //make sure node instance
+        if (domNode && (domNode.style || domNode.attributes)) {
+            if (att in domNode.style || att in Y.DOM.CUSTOM_STYLES) {
+                unit = unit || '';
+                node.setStyle(att, val + unit);
+            } else if (domNode.attributes[att]) {
+                node.setAttribute(att, val);
+            }
+        } else if (node.set) {
+            node.set(att, val);
+        }
+    };
+
+    /**
+     * The default getter to use when getting object properties.
+     *
+     * @property DEFAULT_GETTER
+     * @static
+     */
+    Y.Anim.DEFAULT_GETTER = function(anim, att) {
+        var node = anim._node,
+            domNode = node._node,
+            val = '';
+        //make sure node instance
+        if (domNode && (domNode.style || domNode.attributes)) {
+            if (att in domNode.style || att in Y.DOM.CUSTOM_STYLES) {
+                val = node.getComputedStyle(att);
+            } else if (domNode.attributes[att]) {
+                val = node.getAttribute(att);
+            }
+        } else if (node.get) {
+            val = node.get(att);
+        }
+
+        return val;
+    };
+
+    Y.Anim.ATTRS = {
+        /**
+         * The object to be animated.
+         * @attribute node
+         * @type Node
+         */
+        node: {
+            setter: function(node) {
+                if (node) {
+                    if (typeof node == 'string' || node.nodeType) {
+                        node = Y.one(node);
+                    }
+                }
+
+                this._node = node;
+                if (!node) {
+                    Y.log(node + ' is not a valid node', 'warn', 'Anim');
+                }
+                return node;
+            }
+        },
+
+        /**
+         * The length of the animation.  Defaults to "1" (second).
+         * @attribute duration
+         * @type NUM
+         */
+        duration: {
+            value: 1
+        },
+
+        /**
+         * The method that will provide values to the attribute(s) during the animation. 
+         * Defaults to "Easing.easeNone".
+         * @attribute easing
+         * @type Function
+         */
+        easing: {
+            value: Y.Anim.DEFAULT_EASING,
+
+            setter: function(val) {
+                if (typeof val === 'string' && Y.Easing) {
+                    return Y.Easing[val];
+                }
+            }
+        },
+
+        /**
+         * The starting values for the animated properties.
+         *
+         * Fields may be strings, numbers, or functions.
+         * If a function is used, the return value becomes the from value.
+         * If no from value is specified, the DEFAULT_GETTER will be used.
+         * Supports any unit, provided it matches the "to" (or default)
+         * unit (e.g. `{width: '10em', color: 'rgb(0, 0 0)', borderColor: '#ccc'}`).
+         *
+         * If using the default ('px' for length-based units), the unit may be omitted
+         * (e.g. `{width: 100}, borderColor: 'ccc'}`, which defaults to pixels
+         * and hex, respectively).
+         *
+         * @attribute from
+         * @type Object
+         */
+        from: {},
+
+        /**
+         * The ending values for the animated properties.
+         *
+         * Fields may be strings, numbers, or functions.
+         * Supports any unit, provided it matches the "from" (or default)
+         * unit (e.g. `{width: '50%', color: 'red', borderColor: '#ccc'}`).
+         *
+         * If using the default ('px' for length-based units), the unit may be omitted
+         * (e.g. `{width: 100, borderColor: 'ccc'}`, which defaults to pixels
+         * and hex, respectively).
+         *
+         * @attribute to
+         * @type Object
+         */
+        to: {},
+
+        /**
+         * Date stamp for the first frame of the animation.
+         * @attribute startTime
+         * @type Int
+         * @default 0 
+         * @readOnly
+         */
+        startTime: {
+            value: 0,
+            readOnly: true
+        },
+
+        /**
+         * Current time the animation has been running.
+         * @attribute elapsedTime
+         * @type Int
+         * @default 0 
+         * @readOnly
+         */
+        elapsedTime: {
+            value: 0,
+            readOnly: true
+        },
+
+        /**
+         * Whether or not the animation is currently running.
+         * @attribute running 
+         * @type Boolean
+         * @default false 
+         * @readOnly
+         */
+        running: {
+            getter: function() {
+                return !!_running[Y.stamp(this)];
+            },
+            value: false,
+            readOnly: true
+        },
+
+        /**
+         * The number of times the animation should run 
+         * @attribute iterations
+         * @type Int
+         * @default 1 
+         */
+        iterations: {
+            value: 1
+        },
+
+        /**
+         * The number of iterations that have occurred.
+         * Resets when an animation ends (reaches iteration count or stop() called). 
+         * @attribute iterationCount
+         * @type Int
+         * @default 0
+         * @readOnly
+         */
+        iterationCount: {
+            value: 0,
+            readOnly: true
+        },
+
+        /**
+         * How iterations of the animation should behave. 
+         * Possible values are "normal" and "alternate".
+         * Normal will repeat the animation, alternate will reverse on every other pass.
+         *
+         * @attribute direction
+         * @type String
+         * @default "normal"
+         */
+        direction: {
+            value: 'normal' // | alternate (fwd on odd, rev on even per spec)
+        },
+
+        /**
+         * Whether or not the animation is currently paused.
+         * @attribute paused 
+         * @type Boolean
+         * @default false 
+         * @readOnly
+         */
+        paused: {
+            readOnly: true,
+            value: false
+        },
+
+        /**
+         * If true, animation begins from last frame
+         * @attribute reverse
+         * @type Boolean
+         * @default false 
+         */
+        reverse: {
+            value: false
+        }
+
+
+    };
+
+    /**
+     * Runs all animation instances.
+     * @method run
+     * @static
+     */    
+    Y.Anim.run = function() {
+        var instances = Y.Anim._instances;
+        for (var i in instances) {
+            if (instances[i].run) {
+                instances[i].run();
+            }
+        }
+    };
+
+    /**
+     * Pauses all animation instances.
+     * @method pause
+     * @static
+     */    
+    Y.Anim.pause = function() {
+        for (var i in _running) { // stop timer if nothing running
+            if (_running[i].pause) {
+                _running[i].pause();
+            }
+        }
+
+        Y.Anim._stopTimer();
+    };
+
+    /**
+     * Stops all animation instances.
+     * @method stop
+     * @static
+     */    
+    Y.Anim.stop = function() {
+        for (var i in _running) { // stop timer if nothing running
+            if (_running[i].stop) {
+                _running[i].stop();
+            }
+        }
+        Y.Anim._stopTimer();
+    };
+    
+    Y.Anim._startTimer = function() {
+        if (!_timer) {
+            _timer = setInterval(Y.Anim._runFrame, Y.Anim._intervalTime);
+        }
+    };
+
+    Y.Anim._stopTimer = function() {
+        clearInterval(_timer);
+        _timer = 0;
+    };
+
+    /**
+     * Called per Interval to handle each animation frame.
+     * @method _runFrame
+     * @private
+     * @static
+     */    
+    Y.Anim._runFrame = function() {
+        var done = true;
+        for (var anim in _running) {
+            if (_running[anim]._runFrame) {
+                done = false;
+                _running[anim]._runFrame();
+            }
+        }
+
+        if (done) {
+            Y.Anim._stopTimer();
+        }
+    };
+
+    Y.Anim.RE_UNITS = /^(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)*$/;
+
+    var proto = {
+        /**
+         * Starts or resumes an animation.
+         * @method run
+         * @chainable
+         */    
+        run: function() {
+            if (this.get(PAUSED)) {
+                this._resume();
+            } else if (!this.get(RUNNING)) {
+                this._start();
+            }
+            return this;
+        },
+
+        /**
+         * Pauses the animation and
+         * freezes it in its current state and time.
+         * Calling run() will continue where it left off.
+         * @method pause
+         * @chainable
+         */    
+        pause: function() {
+            if (this.get(RUNNING)) {
+                this._pause();
+            }
+            return this;
+        },
+
+        /**
+         * Stops the animation and resets its time.
+         * @method stop
+         * @param {Boolean} finish If true, the animation will move to the last frame
+         * @chainable
+         */    
+        stop: function(finish) {
+            if (this.get(RUNNING) || this.get(PAUSED)) {
+                this._end(finish);
+            }
+            return this;
+        },
+
+        _added: false,
+
+        _start: function() {
+            this._set(START_TIME, new Date() - this.get(ELAPSED_TIME));
+            this._actualFrames = 0;
+            if (!this.get(PAUSED)) {
+                this._initAnimAttr();
+            }
+            _running[Y.stamp(this)] = this;
+            Y.Anim._startTimer();
+
+            this.fire(START);
+        },
+
+        _pause: function() {
+            this._set(START_TIME, null);
+            this._set(PAUSED, true);
+            delete _running[Y.stamp(this)];
+
+            /**
+            * @event pause
+            * @description fires when an animation is paused.
+            * @param {Event} ev The pause event.
+            * @type Event.Custom
+            */
+            this.fire('pause');
+        },
+
+        _resume: function() {
+            this._set(PAUSED, false);
+            _running[Y.stamp(this)] = this;
+            this._set(START_TIME, new Date() - this.get(ELAPSED_TIME));
+            Y.Anim._startTimer();
+
+            /**
+            * @event resume
+            * @description fires when an animation is resumed (run from pause).
+            * @param {Event} ev The pause event.
+            * @type Event.Custom
+            */
+            this.fire('resume');
+        },
+
+        _end: function(finish) {
+            var duration = this.get('duration') * 1000;
+            if (finish) { // jump to last frame
+                this._runAttrs(duration, duration, this.get(REVERSE));
+            }
+
+            this._set(START_TIME, null);
+            this._set(ELAPSED_TIME, 0);
+            this._set(PAUSED, false);
+
+            delete _running[Y.stamp(this)];
+            this.fire(END, {elapsed: this.get(ELAPSED_TIME)});
+        },
+
+        _runFrame: function() {
+            var d = this._runtimeAttr.duration,
+                t = new Date() - this.get(START_TIME),
+                reverse = this.get(REVERSE),
+                done = (t >= d),
+                attribute,
+                setter;
+                
+            this._runAttrs(t, d, reverse);
+            this._actualFrames += 1;
+            this._set(ELAPSED_TIME, t);
+
+            this.fire(TWEEN);
+            if (done) {
+                this._lastFrame();
+            }
+        },
+
+        _runAttrs: function(t, d, reverse) {
+            var attr = this._runtimeAttr,
+                customAttr = Y.Anim.behaviors,
+                easing = attr.easing,
+                lastFrame = d,
+                done = false,
+                attribute,
+                setter,
+                i;
+
+            if (t >= d) {
+                done = true;
+            }
+
+            if (reverse) {
+                t = d - t;
+                lastFrame = 0;
+            }
+
+            for (i in attr) {
+                if (attr[i].to) {
+                    attribute = attr[i];
+                    setter = (i in customAttr && 'set' in customAttr[i]) ?
+                            customAttr[i].set : Y.Anim.DEFAULT_SETTER;
+
+                    if (!done) {
+                        setter(this, i, attribute.from, attribute.to, t, d, easing, attribute.unit); 
+                    } else {
+                        setter(this, i, attribute.from, attribute.to, lastFrame, d, easing, attribute.unit); 
+                    }
+                }
+            }
+
+
+        },
+
+        _lastFrame: function() {
+            var iter = this.get('iterations'),
+                iterCount = this.get(ITERATION_COUNT);
+
+            iterCount += 1;
+            if (iter === 'infinite' || iterCount < iter) {
+                if (this.get('direction') === 'alternate') {
+                    this.set(REVERSE, !this.get(REVERSE)); // flip it
+                }
+                /**
+                * @event iteration
+                * @description fires when an animation begins an iteration.
+                * @param {Event} ev The iteration event.
+                * @type Event.Custom
+                */
+                this.fire('iteration');
+            } else {
+                iterCount = 0;
+                this._end();
+            }
+
+            this._set(START_TIME, new Date());
+            this._set(ITERATION_COUNT, iterCount);
+        },
+
+        _initAnimAttr: function() {
+            var from = this.get('from') || {},
+                to = this.get('to') || {},
+                attr = {
+                    duration: this.get('duration') * 1000,
+                    easing: this.get('easing')
+                },
+                customAttr = Y.Anim.behaviors,
+                node = this.get(NODE), // implicit attr init
+                unit, begin, end;
+
+            Y.each(to, function(val, name) {
+                if (typeof val === 'function') {
+                    val = val.call(this, node);
+                }
+
+                begin = from[name];
+                if (begin === undefined) {
+                    begin = (name in customAttr && 'get' in customAttr[name])  ?
+                            customAttr[name].get(this, name) : Y.Anim.DEFAULT_GETTER(this, name);
+                } else if (typeof begin === 'function') {
+                    begin = begin.call(this, node);
+                }
+
+                var mFrom = Y.Anim.RE_UNITS.exec(begin);
+                var mTo = Y.Anim.RE_UNITS.exec(val);
+
+                begin = mFrom ? mFrom[1] : begin;
+                end = mTo ? mTo[1] : val;
+                unit = mTo ? mTo[2] : mFrom ?  mFrom[2] : ''; // one might be zero TODO: mixed units
+
+                if (!unit && Y.Anim.RE_DEFAULT_UNIT.test(name)) {
+                    unit = Y.Anim.DEFAULT_UNIT;
+                }
+
+                if (!begin || !end) {
+                    Y.error('invalid "from" or "to" for "' + name + '"', 'Anim');
+                    return;
+                }
+
+                attr[name] = {
+                    from: begin,
+                    to: end,
+                    unit: unit
+                };
+
+            }, this);
+
+            this._runtimeAttr = attr;
+        },
+
+
+        // TODO: move to computedStyle? (browsers dont agree on default computed offsets)
+        _getOffset: function(attr) {
+            var node = this._node,
+                val = node.getComputedStyle(attr),
+                get = (attr === 'left') ? 'getX': 'getY',
+                set = (attr === 'left') ? 'setX': 'setY';
+
+            if (val === 'auto') {
+                var position = node.getStyle('position');
+                if (position === 'absolute' || position === 'fixed') {
+                    val = node[get]();
+                    node[set](val);
+                } else {
+                    val = 0;
+                }
+            }
+
+            return val;
+        },
+
+        destructor: function() {
+            delete Y.Anim._instances[Y.stamp(this)];
+        }
+    };
+
+    Y.extend(Y.Anim, Y.Base, proto);
+
+
+}, '3.5.1' ,{requires:['base-base', 'node-style']});

=== added file 'debian/extras/jslibs/yui/anim-base/anim-base-min.js'
--- debian/extras/jslibs/yui/anim-base/anim-base-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-base/anim-base-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("anim-base",function(b){var c="running",n="startTime",l="elapsedTime",j="start",i="tween",m="end",d="node",k="paused",o="reverse",h="iterationCount",a=Number;var f={},e;b.Anim=function(){b.Anim.superclass.constructor.apply(this,arguments);b.Anim._instances[b.stamp(this)]=this;};b.Anim.NAME="anim";b.Anim._instances={};b.Anim.RE_DEFAULT_UNIT=/^width|height|top|right|bottom|left|margin.*|padding.*|border.*$/i;b.Anim.DEFAULT_UNIT="px";b.Anim.DEFAULT_EASING=function(q,p,s,r){return s*q/r+p;};b.Anim._intervalTime=20;b.Anim.behaviors={left:{get:function(q,p){return q._getOffset(p);}}};b.Anim.behaviors.top=b.Anim.behaviors.left;b.Anim.DEFAULT_SETTER=function(t,u,w,x,z,s,v,y){var q=t._node,r=q._node,p=v(z,a(w),a(x)-a(w),s);if(r&&(r.style||r.attributes)){if(u in r.style||u in b.DOM.CUSTOM_STYLES){y=y||"";q.setStyle(u,p+y);}else{if(r.attributes[u]){q.setAttribute(u,p);}}}else{if(q.set){q.set(u,p);}}};b.Anim.DEFAULT_GETTER=function(s,p){var r=s._node,q=r._node,t="";if(q&&(q.style||q.attributes)){if(p in q.style||p in b.DOM.CUSTOM_STYLES){t=r.getComputedStyle(p);}else{if(q.attributes[p]){t=r.getAttribute(p);}}}else{if(r.get){t=r.get(p);}}return t;};b.Anim.ATTRS={node:{setter:function(p){if(p){if(typeof p=="string"||p.nodeType){p=b.one(p);}}this._node=p;if(!p){}return p;}},duration:{value:1},easing:{value:b.Anim.DEFAULT_EASING,setter:function(p){if(typeof p==="string"&&b.Easing){return b.Easing[p];}}},from:{},to:{},startTime:{value:0,readOnly:true},elapsedTime:{value:0,readOnly:true},running:{getter:function(){return !!f[b.stamp(this)];},value:false,readOnly:true},iterations:{value:1},iterationCount:{value:0,readOnly:true},direction:{value:"normal"},paused:{readOnly:true,value:false},reverse:{value:false}};b.Anim.run=function(){var q=b.Anim._instances;for(var p in q){if(q[p].run){q[p].run();}}};b.Anim.pause=function(){for(var p in f){if(f[p].pause){f[p].pause();}}b.Anim._stopTimer();};b.Anim.stop=function(){for(var p in f){if(f[p].stop){f[p].stop();}}b.Anim._stopTimer();};b.Anim._startTimer=function(){if(!e){e=setInterval(b.Anim._runFrame,b.Anim._intervalTime);}};b.Anim._stopTimer=function(){clearInterval(e);e=0;};b.Anim._runFrame=function(){var p=true;for(var q in f){if(f[q]._runFrame){p=false;f[q]._runFrame();}}if(p){b.Anim._stopTimer();}};b.Anim.RE_UNITS=/^(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)*$/;var g={run:function(){if(this.get(k)){this._resume();}else{if(!this.get(c)){this._start();}}return this;},pause:function(){if(this.get(c)){this._pause();}return this;},stop:function(p){if(this.get(c)||this.get(k)){this._end(p);}return this;},_added:false,_start:function(){this._set(n,new Date()-this.get(l));this._actualFrames=0;if(!this.get(k)){this._initAnimAttr();}f[b.stamp(this)]=this;b.Anim._startTimer();this.fire(j);},_pause:function(){this._set(n,null);this._set(k,true);delete f[b.stamp(this)];this.fire("pause");},_resume:function(){this._set(k,false);f[b.stamp(this)]=this;this._set(n,new Date()-this.get(l));b.Anim._startTimer();this.fire("resume");},_end:function(p){var q=this.get("duration")*1000;if(p){this._runAttrs(q,q,this.get(o));}this._set(n,null);this._set(l,0);this._set(k,false);delete f[b.stamp(this)];this.fire(m,{elapsed:this.get(l)});},_runFrame:function(){var u=this._runtimeAttr.duration,r=new Date()-this.get(n),q=this.get(o),p=(r>=u),s,v;this._runAttrs(r,u,q);this._actualFrames+=1;this._set(l,r);this.fire(i);if(p){this._lastFrame();}},_runAttrs:function(A,z,w){var x=this._runtimeAttr,r=b.Anim.behaviors,y=x.easing,p=z,u=false,q,s,v;if(A>=z){u=true;}if(w){A=z-A;p=0;}for(v in x){if(x[v].to){q=x[v];s=(v in r&&"set" in r[v])?r[v].set:b.Anim.DEFAULT_SETTER;if(!u){s(this,v,q.from,q.to,A,z,y,q.unit);}else{s(this,v,q.from,q.to,p,z,y,q.unit);}}}},_lastFrame:function(){var p=this.get("iterations"),q=this.get(h);q+=1;if(p==="infinite"||q<p){if(this.get("direction")==="alternate"){this.set(o,!this.get(o));}this.fire("iteration");}else{q=0;this._end();}this._set(n,new Date());this._set(h,q);},_initAnimAttr:function(){var w=this.get("from")||{},v=this.get("to")||{},p={duration:this.get("duration")*1000,easing:this.get("easing")},r=b.Anim.behaviors,u=this.get(d),t,s,q;b.each(v,function(A,y){if(typeof A==="function"){A=A.call(this,u);}s=w[y];if(s===undefined){s=(y in r&&"get" in r[y])?r[y].get(this,y):b.Anim.DEFAULT_GETTER(this,y);}else{if(typeof s==="function"){s=s.call(this,u);}}var x=b.Anim.RE_UNITS.exec(s);var z=b.Anim.RE_UNITS.exec(A);s=x?x[1]:s;q=z?z[1]:A;t=z?z[2]:x?x[2]:"";if(!t&&b.Anim.RE_DEFAULT_UNIT.test(y)){t=b.Anim.DEFAULT_UNIT;}if(!s||!q){b.error('invalid "from" or "to" for "'+y+'"',"Anim");return;}p[y]={from:s,to:q,unit:t};},this);this._runtimeAttr=p;},_getOffset:function(q){var s=this._node,t=s.getComputedStyle(q),r=(q==="left")?"getX":"getY",u=(q==="left")?"setX":"setY";if(t==="auto"){var p=s.getStyle("position");if(p==="absolute"||p==="fixed"){t=s[r]();s[u](t);}else{t=0;}}return t;},destructor:function(){delete b.Anim._instances[b.stamp(this)];}};b.extend(b.Anim,b.Base,g);},"3.5.1",{requires:["base-base","node-style"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/anim-base/anim-base.js'
--- debian/extras/jslibs/yui/anim-base/anim-base.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-base/anim-base.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,681 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-base', function(Y) {
+
+/**
+* The Animation Utility provides an API for creating advanced transitions.
+* @module anim
+*/
+
+/**
+* Provides the base Anim class, for animating numeric properties.
+*
+* @module anim
+* @submodule anim-base
+*/
+
+    /**
+     * A class for constructing animation instances.
+     * @class Anim
+     * @for Anim
+     * @constructor
+     * @extends Base
+     */
+
+    var RUNNING = 'running',
+        START_TIME = 'startTime',
+        ELAPSED_TIME = 'elapsedTime',
+        /**
+        * @for Anim
+        * @event start
+        * @description fires when an animation begins.
+        * @param {Event} ev The start event.
+        * @type Event.Custom
+        */
+        START = 'start',
+
+        /**
+        * @event tween
+        * @description fires every frame of the animation.
+        * @param {Event} ev The tween event.
+        * @type Event.Custom
+        */
+        TWEEN = 'tween',
+
+        /**
+        * @event end
+        * @description fires after the animation completes.
+        * @param {Event} ev The end event.
+        * @type Event.Custom
+        */
+        END = 'end',
+        NODE = 'node',
+        PAUSED = 'paused',
+        REVERSE = 'reverse', // TODO: cleanup
+        ITERATION_COUNT = 'iterationCount',
+
+        NUM = Number;
+
+    var _running = {},
+        _timer;
+
+    Y.Anim = function() {
+        Y.Anim.superclass.constructor.apply(this, arguments);
+        Y.Anim._instances[Y.stamp(this)] = this;
+    };
+
+    Y.Anim.NAME = 'anim';
+
+    Y.Anim._instances = {};
+
+    /**
+     * Regex of properties that should use the default unit.
+     *
+     * @property RE_DEFAULT_UNIT
+     * @static
+     */
+    Y.Anim.RE_DEFAULT_UNIT = /^width|height|top|right|bottom|left|margin.*|padding.*|border.*$/i;
+
+    /**
+     * The default unit to use with properties that pass the RE_DEFAULT_UNIT test.
+     *
+     * @property DEFAULT_UNIT
+     * @static
+     */
+    Y.Anim.DEFAULT_UNIT = 'px';
+
+    Y.Anim.DEFAULT_EASING = function (t, b, c, d) {
+        return c * t / d + b; // linear easing
+    };
+
+    /**
+     * Time in milliseconds passed to setInterval for frame processing 
+     *
+     * @property intervalTime
+     * @default 20
+     * @static
+     */
+    Y.Anim._intervalTime = 20;
+
+    /**
+     * Bucket for custom getters and setters
+     *
+     * @property behaviors
+     * @static
+     */
+    Y.Anim.behaviors = {
+        left: {
+            get: function(anim, attr) {
+                return anim._getOffset(attr);
+            }
+        }
+    };
+
+    Y.Anim.behaviors.top = Y.Anim.behaviors.left;
+
+    /**
+     * The default setter to use when setting object properties.
+     *
+     * @property DEFAULT_SETTER
+     * @static
+     */
+    Y.Anim.DEFAULT_SETTER = function(anim, att, from, to, elapsed, duration, fn, unit) {
+        var node = anim._node,
+            domNode = node._node,
+            val = fn(elapsed, NUM(from), NUM(to) - NUM(from), duration);
+        //make sure node instance
+        if (domNode && (domNode.style || domNode.attributes)) {
+            if (att in domNode.style || att in Y.DOM.CUSTOM_STYLES) {
+                unit = unit || '';
+                node.setStyle(att, val + unit);
+            } else if (domNode.attributes[att]) {
+                node.setAttribute(att, val);
+            }
+        } else if (node.set) {
+            node.set(att, val);
+        }
+    };
+
+    /**
+     * The default getter to use when getting object properties.
+     *
+     * @property DEFAULT_GETTER
+     * @static
+     */
+    Y.Anim.DEFAULT_GETTER = function(anim, att) {
+        var node = anim._node,
+            domNode = node._node,
+            val = '';
+        //make sure node instance
+        if (domNode && (domNode.style || domNode.attributes)) {
+            if (att in domNode.style || att in Y.DOM.CUSTOM_STYLES) {
+                val = node.getComputedStyle(att);
+            } else if (domNode.attributes[att]) {
+                val = node.getAttribute(att);
+            }
+        } else if (node.get) {
+            val = node.get(att);
+        }
+
+        return val;
+    };
+
+    Y.Anim.ATTRS = {
+        /**
+         * The object to be animated.
+         * @attribute node
+         * @type Node
+         */
+        node: {
+            setter: function(node) {
+                if (node) {
+                    if (typeof node == 'string' || node.nodeType) {
+                        node = Y.one(node);
+                    }
+                }
+
+                this._node = node;
+                if (!node) {
+                }
+                return node;
+            }
+        },
+
+        /**
+         * The length of the animation.  Defaults to "1" (second).
+         * @attribute duration
+         * @type NUM
+         */
+        duration: {
+            value: 1
+        },
+
+        /**
+         * The method that will provide values to the attribute(s) during the animation. 
+         * Defaults to "Easing.easeNone".
+         * @attribute easing
+         * @type Function
+         */
+        easing: {
+            value: Y.Anim.DEFAULT_EASING,
+
+            setter: function(val) {
+                if (typeof val === 'string' && Y.Easing) {
+                    return Y.Easing[val];
+                }
+            }
+        },
+
+        /**
+         * The starting values for the animated properties.
+         *
+         * Fields may be strings, numbers, or functions.
+         * If a function is used, the return value becomes the from value.
+         * If no from value is specified, the DEFAULT_GETTER will be used.
+         * Supports any unit, provided it matches the "to" (or default)
+         * unit (e.g. `{width: '10em', color: 'rgb(0, 0 0)', borderColor: '#ccc'}`).
+         *
+         * If using the default ('px' for length-based units), the unit may be omitted
+         * (e.g. `{width: 100}, borderColor: 'ccc'}`, which defaults to pixels
+         * and hex, respectively).
+         *
+         * @attribute from
+         * @type Object
+         */
+        from: {},
+
+        /**
+         * The ending values for the animated properties.
+         *
+         * Fields may be strings, numbers, or functions.
+         * Supports any unit, provided it matches the "from" (or default)
+         * unit (e.g. `{width: '50%', color: 'red', borderColor: '#ccc'}`).
+         *
+         * If using the default ('px' for length-based units), the unit may be omitted
+         * (e.g. `{width: 100, borderColor: 'ccc'}`, which defaults to pixels
+         * and hex, respectively).
+         *
+         * @attribute to
+         * @type Object
+         */
+        to: {},
+
+        /**
+         * Date stamp for the first frame of the animation.
+         * @attribute startTime
+         * @type Int
+         * @default 0 
+         * @readOnly
+         */
+        startTime: {
+            value: 0,
+            readOnly: true
+        },
+
+        /**
+         * Current time the animation has been running.
+         * @attribute elapsedTime
+         * @type Int
+         * @default 0 
+         * @readOnly
+         */
+        elapsedTime: {
+            value: 0,
+            readOnly: true
+        },
+
+        /**
+         * Whether or not the animation is currently running.
+         * @attribute running 
+         * @type Boolean
+         * @default false 
+         * @readOnly
+         */
+        running: {
+            getter: function() {
+                return !!_running[Y.stamp(this)];
+            },
+            value: false,
+            readOnly: true
+        },
+
+        /**
+         * The number of times the animation should run 
+         * @attribute iterations
+         * @type Int
+         * @default 1 
+         */
+        iterations: {
+            value: 1
+        },
+
+        /**
+         * The number of iterations that have occurred.
+         * Resets when an animation ends (reaches iteration count or stop() called). 
+         * @attribute iterationCount
+         * @type Int
+         * @default 0
+         * @readOnly
+         */
+        iterationCount: {
+            value: 0,
+            readOnly: true
+        },
+
+        /**
+         * How iterations of the animation should behave. 
+         * Possible values are "normal" and "alternate".
+         * Normal will repeat the animation, alternate will reverse on every other pass.
+         *
+         * @attribute direction
+         * @type String
+         * @default "normal"
+         */
+        direction: {
+            value: 'normal' // | alternate (fwd on odd, rev on even per spec)
+        },
+
+        /**
+         * Whether or not the animation is currently paused.
+         * @attribute paused 
+         * @type Boolean
+         * @default false 
+         * @readOnly
+         */
+        paused: {
+            readOnly: true,
+            value: false
+        },
+
+        /**
+         * If true, animation begins from last frame
+         * @attribute reverse
+         * @type Boolean
+         * @default false 
+         */
+        reverse: {
+            value: false
+        }
+
+
+    };
+
+    /**
+     * Runs all animation instances.
+     * @method run
+     * @static
+     */    
+    Y.Anim.run = function() {
+        var instances = Y.Anim._instances;
+        for (var i in instances) {
+            if (instances[i].run) {
+                instances[i].run();
+            }
+        }
+    };
+
+    /**
+     * Pauses all animation instances.
+     * @method pause
+     * @static
+     */    
+    Y.Anim.pause = function() {
+        for (var i in _running) { // stop timer if nothing running
+            if (_running[i].pause) {
+                _running[i].pause();
+            }
+        }
+
+        Y.Anim._stopTimer();
+    };
+
+    /**
+     * Stops all animation instances.
+     * @method stop
+     * @static
+     */    
+    Y.Anim.stop = function() {
+        for (var i in _running) { // stop timer if nothing running
+            if (_running[i].stop) {
+                _running[i].stop();
+            }
+        }
+        Y.Anim._stopTimer();
+    };
+    
+    Y.Anim._startTimer = function() {
+        if (!_timer) {
+            _timer = setInterval(Y.Anim._runFrame, Y.Anim._intervalTime);
+        }
+    };
+
+    Y.Anim._stopTimer = function() {
+        clearInterval(_timer);
+        _timer = 0;
+    };
+
+    /**
+     * Called per Interval to handle each animation frame.
+     * @method _runFrame
+     * @private
+     * @static
+     */    
+    Y.Anim._runFrame = function() {
+        var done = true;
+        for (var anim in _running) {
+            if (_running[anim]._runFrame) {
+                done = false;
+                _running[anim]._runFrame();
+            }
+        }
+
+        if (done) {
+            Y.Anim._stopTimer();
+        }
+    };
+
+    Y.Anim.RE_UNITS = /^(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)*$/;
+
+    var proto = {
+        /**
+         * Starts or resumes an animation.
+         * @method run
+         * @chainable
+         */    
+        run: function() {
+            if (this.get(PAUSED)) {
+                this._resume();
+            } else if (!this.get(RUNNING)) {
+                this._start();
+            }
+            return this;
+        },
+
+        /**
+         * Pauses the animation and
+         * freezes it in its current state and time.
+         * Calling run() will continue where it left off.
+         * @method pause
+         * @chainable
+         */    
+        pause: function() {
+            if (this.get(RUNNING)) {
+                this._pause();
+            }
+            return this;
+        },
+
+        /**
+         * Stops the animation and resets its time.
+         * @method stop
+         * @param {Boolean} finish If true, the animation will move to the last frame
+         * @chainable
+         */    
+        stop: function(finish) {
+            if (this.get(RUNNING) || this.get(PAUSED)) {
+                this._end(finish);
+            }
+            return this;
+        },
+
+        _added: false,
+
+        _start: function() {
+            this._set(START_TIME, new Date() - this.get(ELAPSED_TIME));
+            this._actualFrames = 0;
+            if (!this.get(PAUSED)) {
+                this._initAnimAttr();
+            }
+            _running[Y.stamp(this)] = this;
+            Y.Anim._startTimer();
+
+            this.fire(START);
+        },
+
+        _pause: function() {
+            this._set(START_TIME, null);
+            this._set(PAUSED, true);
+            delete _running[Y.stamp(this)];
+
+            /**
+            * @event pause
+            * @description fires when an animation is paused.
+            * @param {Event} ev The pause event.
+            * @type Event.Custom
+            */
+            this.fire('pause');
+        },
+
+        _resume: function() {
+            this._set(PAUSED, false);
+            _running[Y.stamp(this)] = this;
+            this._set(START_TIME, new Date() - this.get(ELAPSED_TIME));
+            Y.Anim._startTimer();
+
+            /**
+            * @event resume
+            * @description fires when an animation is resumed (run from pause).
+            * @param {Event} ev The pause event.
+            * @type Event.Custom
+            */
+            this.fire('resume');
+        },
+
+        _end: function(finish) {
+            var duration = this.get('duration') * 1000;
+            if (finish) { // jump to last frame
+                this._runAttrs(duration, duration, this.get(REVERSE));
+            }
+
+            this._set(START_TIME, null);
+            this._set(ELAPSED_TIME, 0);
+            this._set(PAUSED, false);
+
+            delete _running[Y.stamp(this)];
+            this.fire(END, {elapsed: this.get(ELAPSED_TIME)});
+        },
+
+        _runFrame: function() {
+            var d = this._runtimeAttr.duration,
+                t = new Date() - this.get(START_TIME),
+                reverse = this.get(REVERSE),
+                done = (t >= d),
+                attribute,
+                setter;
+                
+            this._runAttrs(t, d, reverse);
+            this._actualFrames += 1;
+            this._set(ELAPSED_TIME, t);
+
+            this.fire(TWEEN);
+            if (done) {
+                this._lastFrame();
+            }
+        },
+
+        _runAttrs: function(t, d, reverse) {
+            var attr = this._runtimeAttr,
+                customAttr = Y.Anim.behaviors,
+                easing = attr.easing,
+                lastFrame = d,
+                done = false,
+                attribute,
+                setter,
+                i;
+
+            if (t >= d) {
+                done = true;
+            }
+
+            if (reverse) {
+                t = d - t;
+                lastFrame = 0;
+            }
+
+            for (i in attr) {
+                if (attr[i].to) {
+                    attribute = attr[i];
+                    setter = (i in customAttr && 'set' in customAttr[i]) ?
+                            customAttr[i].set : Y.Anim.DEFAULT_SETTER;
+
+                    if (!done) {
+                        setter(this, i, attribute.from, attribute.to, t, d, easing, attribute.unit); 
+                    } else {
+                        setter(this, i, attribute.from, attribute.to, lastFrame, d, easing, attribute.unit); 
+                    }
+                }
+            }
+
+
+        },
+
+        _lastFrame: function() {
+            var iter = this.get('iterations'),
+                iterCount = this.get(ITERATION_COUNT);
+
+            iterCount += 1;
+            if (iter === 'infinite' || iterCount < iter) {
+                if (this.get('direction') === 'alternate') {
+                    this.set(REVERSE, !this.get(REVERSE)); // flip it
+                }
+                /**
+                * @event iteration
+                * @description fires when an animation begins an iteration.
+                * @param {Event} ev The iteration event.
+                * @type Event.Custom
+                */
+                this.fire('iteration');
+            } else {
+                iterCount = 0;
+                this._end();
+            }
+
+            this._set(START_TIME, new Date());
+            this._set(ITERATION_COUNT, iterCount);
+        },
+
+        _initAnimAttr: function() {
+            var from = this.get('from') || {},
+                to = this.get('to') || {},
+                attr = {
+                    duration: this.get('duration') * 1000,
+                    easing: this.get('easing')
+                },
+                customAttr = Y.Anim.behaviors,
+                node = this.get(NODE), // implicit attr init
+                unit, begin, end;
+
+            Y.each(to, function(val, name) {
+                if (typeof val === 'function') {
+                    val = val.call(this, node);
+                }
+
+                begin = from[name];
+                if (begin === undefined) {
+                    begin = (name in customAttr && 'get' in customAttr[name])  ?
+                            customAttr[name].get(this, name) : Y.Anim.DEFAULT_GETTER(this, name);
+                } else if (typeof begin === 'function') {
+                    begin = begin.call(this, node);
+                }
+
+                var mFrom = Y.Anim.RE_UNITS.exec(begin);
+                var mTo = Y.Anim.RE_UNITS.exec(val);
+
+                begin = mFrom ? mFrom[1] : begin;
+                end = mTo ? mTo[1] : val;
+                unit = mTo ? mTo[2] : mFrom ?  mFrom[2] : ''; // one might be zero TODO: mixed units
+
+                if (!unit && Y.Anim.RE_DEFAULT_UNIT.test(name)) {
+                    unit = Y.Anim.DEFAULT_UNIT;
+                }
+
+                if (!begin || !end) {
+                    Y.error('invalid "from" or "to" for "' + name + '"', 'Anim');
+                    return;
+                }
+
+                attr[name] = {
+                    from: begin,
+                    to: end,
+                    unit: unit
+                };
+
+            }, this);
+
+            this._runtimeAttr = attr;
+        },
+
+
+        // TODO: move to computedStyle? (browsers dont agree on default computed offsets)
+        _getOffset: function(attr) {
+            var node = this._node,
+                val = node.getComputedStyle(attr),
+                get = (attr === 'left') ? 'getX': 'getY',
+                set = (attr === 'left') ? 'setX': 'setY';
+
+            if (val === 'auto') {
+                var position = node.getStyle('position');
+                if (position === 'absolute' || position === 'fixed') {
+                    val = node[get]();
+                    node[set](val);
+                } else {
+                    val = 0;
+                }
+            }
+
+            return val;
+        },
+
+        destructor: function() {
+            delete Y.Anim._instances[Y.stamp(this)];
+        }
+    };
+
+    Y.extend(Y.Anim, Y.Base, proto);
+
+
+}, '3.5.1' ,{requires:['base-base', 'node-style']});

=== added directory 'debian/extras/jslibs/yui/anim-color'
=== added file 'debian/extras/jslibs/yui/anim-color/anim-color-debug.js'
--- debian/extras/jslibs/yui/anim-color/anim-color-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-color/anim-color-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,54 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-color', function(Y) {
+
+/**
+ * Adds support for color properties in <code>to</code>
+ * and <code>from</code> attributes.
+ * @module anim
+ * @submodule anim-color
+ */
+
+var NUM = Number;
+
+Y.Anim.behaviors.color = {
+    set: function(anim, att, from, to, elapsed, duration, fn) {
+        from = Y.Color.re_RGB.exec(Y.Color.toRGB(from));
+        to = Y.Color.re_RGB.exec(Y.Color.toRGB(to));
+
+        if (!from || from.length < 3 || !to || to.length < 3) {
+            Y.error('invalid from or to passed to color behavior');
+        }
+
+        anim._node.setStyle(att, 'rgb(' + [
+            Math.floor(fn(elapsed, NUM(from[1]), NUM(to[1]) - NUM(from[1]), duration)),
+            Math.floor(fn(elapsed, NUM(from[2]), NUM(to[2]) - NUM(from[2]), duration)),
+            Math.floor(fn(elapsed, NUM(from[3]), NUM(to[3]) - NUM(from[3]), duration))
+        ].join(', ') + ')');
+    },
+    
+    // TODO: default bgcolor const
+    get: function(anim, att) {
+        var val = anim._node.getComputedStyle(att);
+        val = (val === 'transparent') ? 'rgb(255, 255, 255)' : val;
+        return val;
+    }
+};
+
+Y.each(['backgroundColor',
+        'borderColor',
+        'borderTopColor',
+        'borderRightColor', 
+        'borderBottomColor', 
+        'borderLeftColor'],
+        function(v, i) {
+            Y.Anim.behaviors[v] = Y.Anim.behaviors.color;
+        }
+);
+
+
+}, '3.5.1' ,{requires:['anim-base']});

=== added file 'debian/extras/jslibs/yui/anim-color/anim-color-min.js'
--- debian/extras/jslibs/yui/anim-color/anim-color-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-color/anim-color-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("anim-color",function(b){var a=Number;b.Anim.behaviors.color={set:function(f,d,i,h,c,g,e){i=b.Color.re_RGB.exec(b.Color.toRGB(i));h=b.Color.re_RGB.exec(b.Color.toRGB(h));if(!i||i.length<3||!h||h.length<3){b.error("invalid from or to passed to color behavior");}f._node.setStyle(d,"rgb("+[Math.floor(e(c,a(i[1]),a(h[1])-a(i[1]),g)),Math.floor(e(c,a(i[2]),a(h[2])-a(i[2]),g)),Math.floor(e(c,a(i[3]),a(h[3])-a(i[3]),g))].join(", ")+")");},get:function(d,c){var e=d._node.getComputedStyle(c);e=(e==="transparent")?"rgb(255, 255, 255)":e;return e;}};b.each(["backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],function(c,d){b.Anim.behaviors[c]=b.Anim.behaviors.color;});},"3.5.1",{requires:["anim-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/anim-color/anim-color.js'
--- debian/extras/jslibs/yui/anim-color/anim-color.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-color/anim-color.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,54 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-color', function(Y) {
+
+/**
+ * Adds support for color properties in <code>to</code>
+ * and <code>from</code> attributes.
+ * @module anim
+ * @submodule anim-color
+ */
+
+var NUM = Number;
+
+Y.Anim.behaviors.color = {
+    set: function(anim, att, from, to, elapsed, duration, fn) {
+        from = Y.Color.re_RGB.exec(Y.Color.toRGB(from));
+        to = Y.Color.re_RGB.exec(Y.Color.toRGB(to));
+
+        if (!from || from.length < 3 || !to || to.length < 3) {
+            Y.error('invalid from or to passed to color behavior');
+        }
+
+        anim._node.setStyle(att, 'rgb(' + [
+            Math.floor(fn(elapsed, NUM(from[1]), NUM(to[1]) - NUM(from[1]), duration)),
+            Math.floor(fn(elapsed, NUM(from[2]), NUM(to[2]) - NUM(from[2]), duration)),
+            Math.floor(fn(elapsed, NUM(from[3]), NUM(to[3]) - NUM(from[3]), duration))
+        ].join(', ') + ')');
+    },
+    
+    // TODO: default bgcolor const
+    get: function(anim, att) {
+        var val = anim._node.getComputedStyle(att);
+        val = (val === 'transparent') ? 'rgb(255, 255, 255)' : val;
+        return val;
+    }
+};
+
+Y.each(['backgroundColor',
+        'borderColor',
+        'borderTopColor',
+        'borderRightColor', 
+        'borderBottomColor', 
+        'borderLeftColor'],
+        function(v, i) {
+            Y.Anim.behaviors[v] = Y.Anim.behaviors.color;
+        }
+);
+
+
+}, '3.5.1' ,{requires:['anim-base']});

=== added directory 'debian/extras/jslibs/yui/anim-curve'
=== added file 'debian/extras/jslibs/yui/anim-curve/anim-curve-debug.js'
--- debian/extras/jslibs/yui/anim-curve/anim-curve-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-curve/anim-curve-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,63 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-curve', function(Y) {
+
+/**
+ * Adds support for the <code>curve</code> property for the <code>to</code> 
+ * attribute.  A curve is zero or more control points and an end point.
+ * @module anim
+ * @submodule anim-curve
+ */
+
+Y.Anim.behaviors.curve = {
+    set: function(anim, att, from, to, elapsed, duration, fn) {
+        from = from.slice.call(from);
+        to = to.slice.call(to);
+        var t = fn(elapsed, 0, 100, duration) / 100;
+        to.unshift(from);
+        anim._node.setXY(Y.Anim.getBezier(to, t));
+    },
+
+    get: function(anim, att) {
+        return anim._node.getXY();
+    }
+};
+
+/**
+ * Get the current position of the animated element based on t.
+ * Each point is an array of "x" and "y" values (0 = x, 1 = y)
+ * At least 2 points are required (start and end).
+ * First point is start. Last point is end.
+ * Additional control points are optional.     
+ * @for Anim
+ * @method getBezier
+ * @static
+ * @param {Array} points An array containing Bezier points
+ * @param {Number} t A number between 0 and 1 which is the basis for determining current position
+ * @return {Array} An array containing int x and y member data
+ */
+Y.Anim.getBezier = function(points, t) {  
+    var n = points.length;
+    var tmp = [];
+
+    for (var i = 0; i < n; ++i){
+        tmp[i] = [points[i][0], points[i][1]]; // save input
+    }
+    
+    for (var j = 1; j < n; ++j) {
+        for (i = 0; i < n - j; ++i) {
+            tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0];
+            tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; 
+        }
+    }
+
+    return [ tmp[0][0], tmp[0][1] ]; 
+
+};
+
+
+}, '3.5.1' ,{requires:['anim-xy']});

=== added file 'debian/extras/jslibs/yui/anim-curve/anim-curve-min.js'
--- debian/extras/jslibs/yui/anim-curve/anim-curve-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-curve/anim-curve-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("anim-curve",function(a){a.Anim.behaviors.curve={set:function(f,c,i,h,b,g,e){i=i.slice.call(i);h=h.slice.call(h);var d=e(b,0,100,g)/100;h.unshift(i);f._node.setXY(a.Anim.getBezier(h,d));},get:function(c,b){return c._node.getXY();}};a.Anim.getBezier=function(f,e){var g=f.length;var d=[];for(var c=0;c<g;++c){d[c]=[f[c][0],f[c][1]];}for(var b=1;b<g;++b){for(c=0;c<g-b;++c){d[c][0]=(1-e)*d[c][0]+e*d[parseInt(c+1,10)][0];d[c][1]=(1-e)*d[c][1]+e*d[parseInt(c+1,10)][1];}}return[d[0][0],d[0][1]];};},"3.5.1",{requires:["anim-xy"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/anim-curve/anim-curve.js'
--- debian/extras/jslibs/yui/anim-curve/anim-curve.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-curve/anim-curve.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,63 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-curve', function(Y) {
+
+/**
+ * Adds support for the <code>curve</code> property for the <code>to</code> 
+ * attribute.  A curve is zero or more control points and an end point.
+ * @module anim
+ * @submodule anim-curve
+ */
+
+Y.Anim.behaviors.curve = {
+    set: function(anim, att, from, to, elapsed, duration, fn) {
+        from = from.slice.call(from);
+        to = to.slice.call(to);
+        var t = fn(elapsed, 0, 100, duration) / 100;
+        to.unshift(from);
+        anim._node.setXY(Y.Anim.getBezier(to, t));
+    },
+
+    get: function(anim, att) {
+        return anim._node.getXY();
+    }
+};
+
+/**
+ * Get the current position of the animated element based on t.
+ * Each point is an array of "x" and "y" values (0 = x, 1 = y)
+ * At least 2 points are required (start and end).
+ * First point is start. Last point is end.
+ * Additional control points are optional.     
+ * @for Anim
+ * @method getBezier
+ * @static
+ * @param {Array} points An array containing Bezier points
+ * @param {Number} t A number between 0 and 1 which is the basis for determining current position
+ * @return {Array} An array containing int x and y member data
+ */
+Y.Anim.getBezier = function(points, t) {  
+    var n = points.length;
+    var tmp = [];
+
+    for (var i = 0; i < n; ++i){
+        tmp[i] = [points[i][0], points[i][1]]; // save input
+    }
+    
+    for (var j = 1; j < n; ++j) {
+        for (i = 0; i < n - j; ++i) {
+            tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0];
+            tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; 
+        }
+    }
+
+    return [ tmp[0][0], tmp[0][1] ]; 
+
+};
+
+
+}, '3.5.1' ,{requires:['anim-xy']});

=== added directory 'debian/extras/jslibs/yui/anim-easing'
=== added file 'debian/extras/jslibs/yui/anim-easing/anim-easing-debug.js'
--- debian/extras/jslibs/yui/anim-easing/anim-easing-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-easing/anim-easing-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,356 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-easing', function(Y) {
+
+/*
+TERMS OF USE - EASING EQUATIONS
+Open source under the BSD License.
+Copyright 2001 Robert Penner All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/**
+ * The easing module provides methods for customizing
+ * how an animation behaves during each run.
+ * @class Easing
+ * @module anim
+ * @submodule anim-easing
+ */
+
+var Easing = {
+
+    /**
+     * Uniform speed between points.
+     * @for Easing
+     * @method easeNone
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeNone: function (t, b, c, d) {
+        return c*t/d + b;
+    },
+    
+    /**
+     * Begins slowly and accelerates towards end. (quadratic)
+     * @method easeIn
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeIn: function (t, b, c, d) {
+        return c*(t/=d)*t + b;
+    },
+
+    /**
+     * Begins quickly and decelerates towards end.  (quadratic)
+     * @method easeOut
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeOut: function (t, b, c, d) {
+        return -c *(t/=d)*(t-2) + b;
+    },
+    
+    /**
+     * Begins slowly and decelerates towards end. (quadratic)
+     * @method easeBoth
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeBoth: function (t, b, c, d) {
+        if ((t/=d/2) < 1) {
+            return c/2*t*t + b;
+        }
+        
+        return -c/2 * ((--t)*(t-2) - 1) + b;
+    },
+    
+    /**
+     * Begins slowly and accelerates towards end. (quartic)
+     * @method easeInStrong
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeInStrong: function (t, b, c, d) {
+        return c*(t/=d)*t*t*t + b;
+    },
+    
+    /**
+     * Begins quickly and decelerates towards end.  (quartic)
+     * @method easeOutStrong
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeOutStrong: function (t, b, c, d) {
+        return -c * ((t=t/d-1)*t*t*t - 1) + b;
+    },
+    
+    /**
+     * Begins slowly and decelerates towards end. (quartic)
+     * @method easeBothStrong
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeBothStrong: function (t, b, c, d) {
+        if ((t/=d/2) < 1) {
+            return c/2*t*t*t*t + b;
+        }
+        
+        return -c/2 * ((t-=2)*t*t*t - 2) + b;
+    },
+
+    /**
+     * Snap in elastic effect.
+     * @method elasticIn
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @param {Number} a Amplitude (optional)
+     * @param {Number} p Period (optional)
+     * @return {Number} The computed value for the current animation frame
+     */
+
+    elasticIn: function (t, b, c, d, a, p) {
+        var s;
+        if (t === 0) {
+            return b;
+        }
+        if ( (t /= d) === 1 ) {
+            return b+c;
+        }
+        if (!p) {
+            p = d* 0.3;
+        }
+        
+        if (!a || a < Math.abs(c)) {
+            a = c; 
+            s = p/4;
+        }
+        else {
+            s = p/(2*Math.PI) * Math.asin (c/a);
+        }
+        
+        return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+    },
+
+    /**
+     * Snap out elastic effect.
+     * @method elasticOut
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @param {Number} a Amplitude (optional)
+     * @param {Number} p Period (optional)
+     * @return {Number} The computed value for the current animation frame
+     */
+    elasticOut: function (t, b, c, d, a, p) {
+        var s;
+        if (t === 0) {
+            return b;
+        }
+        if ( (t /= d) === 1 ) {
+            return b+c;
+        }
+        if (!p) {
+            p=d * 0.3;
+        }
+        
+        if (!a || a < Math.abs(c)) {
+            a = c;
+            s = p / 4;
+        }
+        else {
+            s = p/(2*Math.PI) * Math.asin (c/a);
+        }
+        
+        return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+    },
+    
+    /**
+     * Snap both elastic effect.
+     * @method elasticBoth
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @param {Number} a Amplitude (optional)
+     * @param {Number} p Period (optional)
+     * @return {Number} The computed value for the current animation frame
+     */
+    elasticBoth: function (t, b, c, d, a, p) {
+        var s;
+        if (t === 0) {
+            return b;
+        }
+        
+        if ( (t /= d/2) === 2 ) {
+            return b+c;
+        }
+        
+        if (!p) {
+            p = d*(0.3*1.5);
+        }
+        
+        if ( !a || a < Math.abs(c) ) {
+            a = c; 
+            s = p/4;
+        }
+        else {
+            s = p/(2*Math.PI) * Math.asin (c/a);
+        }
+        
+        if (t < 1) {
+            return -0.5*(a*Math.pow(2,10*(t-=1)) * 
+                    Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+        }
+        return a*Math.pow(2,-10*(t-=1)) * 
+                Math.sin( (t*d-s)*(2*Math.PI)/p )*0.5 + c + b;
+    },
+
+
+    /**
+     * Backtracks slightly, then reverses direction and moves to end.
+     * @method backIn
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @param {Number} s Overshoot (optional)
+     * @return {Number} The computed value for the current animation frame
+     */
+    backIn: function (t, b, c, d, s) {
+        if (s === undefined) {
+            s = 1.70158;
+        }
+        if (t === d) {
+            t -= 0.001;
+        }
+        return c*(t/=d)*t*((s+1)*t - s) + b;
+    },
+
+    /**
+     * Overshoots end, then reverses and comes back to end.
+     * @method backOut
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @param {Number} s Overshoot (optional)
+     * @return {Number} The computed value for the current animation frame
+     */
+    backOut: function (t, b, c, d, s) {
+        if (typeof s === 'undefined') {
+            s = 1.70158;
+        }
+        return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+    },
+    
+    /**
+     * Backtracks slightly, then reverses direction, overshoots end, 
+     * then reverses and comes back to end.
+     * @method backBoth
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @param {Number} s Overshoot (optional)
+     * @return {Number} The computed value for the current animation frame
+     */
+    backBoth: function (t, b, c, d, s) {
+        if (typeof s === 'undefined') {
+            s = 1.70158; 
+        }
+        
+        if ((t /= d/2 ) < 1) {
+            return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+        }
+        return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+    },
+
+    /**
+     * Bounce off of start.
+     * @method bounceIn
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    bounceIn: function (t, b, c, d) {
+        return c - Y.Easing.bounceOut(d-t, 0, c, d) + b;
+    },
+    
+    /**
+     * Bounces off end.
+     * @method bounceOut
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    bounceOut: function (t, b, c, d) {
+        if ((t/=d) < (1/2.75)) {
+                return c*(7.5625*t*t) + b;
+        } else if (t < (2/2.75)) {
+                return c*(7.5625*(t-=(1.5/2.75))*t + 0.75) + b;
+        } else if (t < (2.5/2.75)) {
+                return c*(7.5625*(t-=(2.25/2.75))*t + 0.9375) + b;
+        }
+        return c*(7.5625*(t-=(2.625/2.75))*t + 0.984375) + b;
+    },
+    
+    /**
+     * Bounces off start and end.
+     * @method bounceBoth
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    bounceBoth: function (t, b, c, d) {
+        if (t < d/2) {
+            return Y.Easing.bounceIn(t * 2, 0, c, d) * 0.5 + b;
+        }
+        return Y.Easing.bounceOut(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;
+    }
+};
+
+Y.Easing = Easing;
+
+
+}, '3.5.1' ,{requires:['anim-base']});

=== added file 'debian/extras/jslibs/yui/anim-easing/anim-easing-min.js'
--- debian/extras/jslibs/yui/anim-easing/anim-easing-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-easing/anim-easing-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("anim-easing",function(b){var a={easeNone:function(f,e,h,g){return h*f/g+e;},easeIn:function(f,e,h,g){return h*(f/=g)*f+e;},easeOut:function(f,e,h,g){return -h*(f/=g)*(f-2)+e;},easeBoth:function(f,e,h,g){if((f/=g/2)<1){return h/2*f*f+e;}return -h/2*((--f)*(f-2)-1)+e;},easeInStrong:function(f,e,h,g){return h*(f/=g)*f*f*f+e;},easeOutStrong:function(f,e,h,g){return -h*((f=f/g-1)*f*f*f-1)+e;},easeBothStrong:function(f,e,h,g){if((f/=g/2)<1){return h/2*f*f*f*f+e;}return -h/2*((f-=2)*f*f*f-2)+e;},elasticIn:function(g,e,k,j,f,i){var h;if(g===0){return e;}if((g/=j)===1){return e+k;}if(!i){i=j*0.3;}if(!f||f<Math.abs(k)){f=k;h=i/4;}else{h=i/(2*Math.PI)*Math.asin(k/f);}return -(f*Math.pow(2,10*(g-=1))*Math.sin((g*j-h)*(2*Math.PI)/i))+e;},elasticOut:function(g,e,k,j,f,i){var h;if(g===0){return e;}if((g/=j)===1){return e+k;}if(!i){i=j*0.3;}if(!f||f<Math.abs(k)){f=k;h=i/4;}else{h=i/(2*Math.PI)*Math.asin(k/f);}return f*Math.pow(2,-10*g)*Math.sin((g*j-h)*(2*Math.PI)/i)+k+e;},elasticBoth:function(g,e,k,j,f,i){var h;if(g===0){return e;}if((g/=j/2)===2){return e+k;}if(!i){i=j*(0.3*1.5);}if(!f||f<Math.abs(k)){f=k;h=i/4;}else{h=i/(2*Math.PI)*Math.asin(k/f);}if(g<1){return -0.5*(f*Math.pow(2,10*(g-=1))*Math.sin((g*j-h)*(2*Math.PI)/i))+e;}return f*Math.pow(2,-10*(g-=1))*Math.sin((g*j-h)*(2*Math.PI)/i)*0.5+k+e;},backIn:function(f,e,i,h,g){if(g===undefined){g=1.70158;}if(f===h){f-=0.001;}return i*(f/=h)*f*((g+1)*f-g)+e;},backOut:function(f,e,i,h,g){if(typeof g==="undefined"){g=1.70158;}return i*((f=f/h-1)*f*((g+1)*f+g)+1)+e;},backBoth:function(f,e,i,h,g){if(typeof g==="undefined"){g=1.70158;}if((f/=h/2)<1){return i/2*(f*f*(((g*=(1.525))+1)*f-g))+e;}return i/2*((f-=2)*f*(((g*=(1.525))+1)*f+g)+2)+e;},bounceIn:function(f,e,h,g){return h-b.Easing.bounceOut(g-f,0,h,g)+e;},bounceOut:function(f,e,h,g){if((f/=g)<(1/2.75)){return h*(7.5625*f*f)+e;}else{if(f<(2/2.75)){return h*(7.5625*(f-=(1.5/2.75))*f+0.75)+e;}else{if(f<(2.5/2.75)){return h*(7.5625*(f-=(2.25/2.75))*f+0.9375)+e;}}}return h*(7.5625*(f-=(2.625/2.75))*f+0.984375)+e;},bounceBoth:function(f,e,h,g){if(f<g/2){return b.Easing.bounceIn(f*2,0,h,g)*0.5+e;}return b.Easing.bounceOut(f*2-g,0,h,g)*0.5+h*0.5+e;}};b.Easing=a;},"3.5.1",{requires:["anim-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/anim-easing/anim-easing.js'
--- debian/extras/jslibs/yui/anim-easing/anim-easing.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-easing/anim-easing.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,356 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-easing', function(Y) {
+
+/*
+TERMS OF USE - EASING EQUATIONS
+Open source under the BSD License.
+Copyright 2001 Robert Penner All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/**
+ * The easing module provides methods for customizing
+ * how an animation behaves during each run.
+ * @class Easing
+ * @module anim
+ * @submodule anim-easing
+ */
+
+var Easing = {
+
+    /**
+     * Uniform speed between points.
+     * @for Easing
+     * @method easeNone
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeNone: function (t, b, c, d) {
+        return c*t/d + b;
+    },
+    
+    /**
+     * Begins slowly and accelerates towards end. (quadratic)
+     * @method easeIn
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeIn: function (t, b, c, d) {
+        return c*(t/=d)*t + b;
+    },
+
+    /**
+     * Begins quickly and decelerates towards end.  (quadratic)
+     * @method easeOut
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeOut: function (t, b, c, d) {
+        return -c *(t/=d)*(t-2) + b;
+    },
+    
+    /**
+     * Begins slowly and decelerates towards end. (quadratic)
+     * @method easeBoth
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeBoth: function (t, b, c, d) {
+        if ((t/=d/2) < 1) {
+            return c/2*t*t + b;
+        }
+        
+        return -c/2 * ((--t)*(t-2) - 1) + b;
+    },
+    
+    /**
+     * Begins slowly and accelerates towards end. (quartic)
+     * @method easeInStrong
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeInStrong: function (t, b, c, d) {
+        return c*(t/=d)*t*t*t + b;
+    },
+    
+    /**
+     * Begins quickly and decelerates towards end.  (quartic)
+     * @method easeOutStrong
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeOutStrong: function (t, b, c, d) {
+        return -c * ((t=t/d-1)*t*t*t - 1) + b;
+    },
+    
+    /**
+     * Begins slowly and decelerates towards end. (quartic)
+     * @method easeBothStrong
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    easeBothStrong: function (t, b, c, d) {
+        if ((t/=d/2) < 1) {
+            return c/2*t*t*t*t + b;
+        }
+        
+        return -c/2 * ((t-=2)*t*t*t - 2) + b;
+    },
+
+    /**
+     * Snap in elastic effect.
+     * @method elasticIn
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @param {Number} a Amplitude (optional)
+     * @param {Number} p Period (optional)
+     * @return {Number} The computed value for the current animation frame
+     */
+
+    elasticIn: function (t, b, c, d, a, p) {
+        var s;
+        if (t === 0) {
+            return b;
+        }
+        if ( (t /= d) === 1 ) {
+            return b+c;
+        }
+        if (!p) {
+            p = d* 0.3;
+        }
+        
+        if (!a || a < Math.abs(c)) {
+            a = c; 
+            s = p/4;
+        }
+        else {
+            s = p/(2*Math.PI) * Math.asin (c/a);
+        }
+        
+        return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+    },
+
+    /**
+     * Snap out elastic effect.
+     * @method elasticOut
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @param {Number} a Amplitude (optional)
+     * @param {Number} p Period (optional)
+     * @return {Number} The computed value for the current animation frame
+     */
+    elasticOut: function (t, b, c, d, a, p) {
+        var s;
+        if (t === 0) {
+            return b;
+        }
+        if ( (t /= d) === 1 ) {
+            return b+c;
+        }
+        if (!p) {
+            p=d * 0.3;
+        }
+        
+        if (!a || a < Math.abs(c)) {
+            a = c;
+            s = p / 4;
+        }
+        else {
+            s = p/(2*Math.PI) * Math.asin (c/a);
+        }
+        
+        return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+    },
+    
+    /**
+     * Snap both elastic effect.
+     * @method elasticBoth
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @param {Number} a Amplitude (optional)
+     * @param {Number} p Period (optional)
+     * @return {Number} The computed value for the current animation frame
+     */
+    elasticBoth: function (t, b, c, d, a, p) {
+        var s;
+        if (t === 0) {
+            return b;
+        }
+        
+        if ( (t /= d/2) === 2 ) {
+            return b+c;
+        }
+        
+        if (!p) {
+            p = d*(0.3*1.5);
+        }
+        
+        if ( !a || a < Math.abs(c) ) {
+            a = c; 
+            s = p/4;
+        }
+        else {
+            s = p/(2*Math.PI) * Math.asin (c/a);
+        }
+        
+        if (t < 1) {
+            return -0.5*(a*Math.pow(2,10*(t-=1)) * 
+                    Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+        }
+        return a*Math.pow(2,-10*(t-=1)) * 
+                Math.sin( (t*d-s)*(2*Math.PI)/p )*0.5 + c + b;
+    },
+
+
+    /**
+     * Backtracks slightly, then reverses direction and moves to end.
+     * @method backIn
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @param {Number} s Overshoot (optional)
+     * @return {Number} The computed value for the current animation frame
+     */
+    backIn: function (t, b, c, d, s) {
+        if (s === undefined) {
+            s = 1.70158;
+        }
+        if (t === d) {
+            t -= 0.001;
+        }
+        return c*(t/=d)*t*((s+1)*t - s) + b;
+    },
+
+    /**
+     * Overshoots end, then reverses and comes back to end.
+     * @method backOut
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @param {Number} s Overshoot (optional)
+     * @return {Number} The computed value for the current animation frame
+     */
+    backOut: function (t, b, c, d, s) {
+        if (typeof s === 'undefined') {
+            s = 1.70158;
+        }
+        return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+    },
+    
+    /**
+     * Backtracks slightly, then reverses direction, overshoots end, 
+     * then reverses and comes back to end.
+     * @method backBoth
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @param {Number} s Overshoot (optional)
+     * @return {Number} The computed value for the current animation frame
+     */
+    backBoth: function (t, b, c, d, s) {
+        if (typeof s === 'undefined') {
+            s = 1.70158; 
+        }
+        
+        if ((t /= d/2 ) < 1) {
+            return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+        }
+        return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+    },
+
+    /**
+     * Bounce off of start.
+     * @method bounceIn
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    bounceIn: function (t, b, c, d) {
+        return c - Y.Easing.bounceOut(d-t, 0, c, d) + b;
+    },
+    
+    /**
+     * Bounces off end.
+     * @method bounceOut
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    bounceOut: function (t, b, c, d) {
+        if ((t/=d) < (1/2.75)) {
+                return c*(7.5625*t*t) + b;
+        } else if (t < (2/2.75)) {
+                return c*(7.5625*(t-=(1.5/2.75))*t + 0.75) + b;
+        } else if (t < (2.5/2.75)) {
+                return c*(7.5625*(t-=(2.25/2.75))*t + 0.9375) + b;
+        }
+        return c*(7.5625*(t-=(2.625/2.75))*t + 0.984375) + b;
+    },
+    
+    /**
+     * Bounces off start and end.
+     * @method bounceBoth
+     * @param {Number} t Time value used to compute current value
+     * @param {Number} b Starting value
+     * @param {Number} c Delta between start and end values
+     * @param {Number} d Total length of animation
+     * @return {Number} The computed value for the current animation frame
+     */
+    bounceBoth: function (t, b, c, d) {
+        if (t < d/2) {
+            return Y.Easing.bounceIn(t * 2, 0, c, d) * 0.5 + b;
+        }
+        return Y.Easing.bounceOut(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;
+    }
+};
+
+Y.Easing = Easing;
+
+
+}, '3.5.1' ,{requires:['anim-base']});

=== added directory 'debian/extras/jslibs/yui/anim-node-plugin'
=== added file 'debian/extras/jslibs/yui/anim-node-plugin/anim-node-plugin-debug.js'
--- debian/extras/jslibs/yui/anim-node-plugin/anim-node-plugin-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-node-plugin/anim-node-plugin-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,32 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-node-plugin', function(Y) {
+
+/**
+ *  Binds an Anim instance to a Node instance
+ * @module anim
+ * @class Plugin.NodeFX
+ * @extends Base
+ * @submodule anim-node-plugin
+ */
+
+var NodeFX = function(config) {
+    config = (config) ? Y.merge(config) : {};
+    config.node = config.host;
+    NodeFX.superclass.constructor.apply(this, arguments);
+};
+
+NodeFX.NAME = "nodefx";
+NodeFX.NS = "fx";
+
+Y.extend(NodeFX, Y.Anim);
+
+Y.namespace('Plugin');
+Y.Plugin.NodeFX = NodeFX;
+
+
+}, '3.5.1' ,{requires:['node-pluginhost', 'anim-base']});

=== added file 'debian/extras/jslibs/yui/anim-node-plugin/anim-node-plugin-min.js'
--- debian/extras/jslibs/yui/anim-node-plugin/anim-node-plugin-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-node-plugin/anim-node-plugin-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("anim-node-plugin",function(b){var a=function(c){c=(c)?b.merge(c):{};c.node=c.host;a.superclass.constructor.apply(this,arguments);};a.NAME="nodefx";a.NS="fx";b.extend(a,b.Anim);b.namespace("Plugin");b.Plugin.NodeFX=a;},"3.5.1",{requires:["node-pluginhost","anim-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/anim-node-plugin/anim-node-plugin.js'
--- debian/extras/jslibs/yui/anim-node-plugin/anim-node-plugin.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-node-plugin/anim-node-plugin.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,32 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-node-plugin', function(Y) {
+
+/**
+ *  Binds an Anim instance to a Node instance
+ * @module anim
+ * @class Plugin.NodeFX
+ * @extends Base
+ * @submodule anim-node-plugin
+ */
+
+var NodeFX = function(config) {
+    config = (config) ? Y.merge(config) : {};
+    config.node = config.host;
+    NodeFX.superclass.constructor.apply(this, arguments);
+};
+
+NodeFX.NAME = "nodefx";
+NodeFX.NS = "fx";
+
+Y.extend(NodeFX, Y.Anim);
+
+Y.namespace('Plugin');
+Y.Plugin.NodeFX = NodeFX;
+
+
+}, '3.5.1' ,{requires:['node-pluginhost', 'anim-base']});

=== added directory 'debian/extras/jslibs/yui/anim-scroll'
=== added file 'debian/extras/jslibs/yui/anim-scroll/anim-scroll-debug.js'
--- debian/extras/jslibs/yui/anim-scroll/anim-scroll-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-scroll/anim-scroll-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,44 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-scroll', function(Y) {
+
+/**
+ * Adds support for the <code>scroll</code> property in <code>to</code>
+ * and <code>from</code> attributes.
+ * @module anim
+ * @submodule anim-scroll
+ */
+
+var NUM = Number;
+
+//TODO: deprecate for scrollTop/Left properties?
+Y.Anim.behaviors.scroll = {
+    set: function(anim, att, from, to, elapsed, duration, fn) {
+        var
+            node = anim._node, 
+            val = ([
+            fn(elapsed, NUM(from[0]), NUM(to[0]) - NUM(from[0]), duration),
+            fn(elapsed, NUM(from[1]), NUM(to[1]) - NUM(from[1]), duration)
+        ]);
+
+        if (val[0]) {
+            node.set('scrollLeft', val[0]);
+        }
+
+        if (val[1]) {
+            node.set('scrollTop', val[1]);
+        }
+    },
+    get: function(anim) {
+        var node = anim._node;
+        return [node.get('scrollLeft'), node.get('scrollTop')];
+    }
+};
+
+
+
+}, '3.5.1' ,{requires:['anim-base']});

=== added file 'debian/extras/jslibs/yui/anim-scroll/anim-scroll-min.js'
--- debian/extras/jslibs/yui/anim-scroll/anim-scroll-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-scroll/anim-scroll-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("anim-scroll",function(b){var a=Number;b.Anim.behaviors.scroll={set:function(f,g,i,j,k,e,h){var d=f._node,c=([h(k,a(i[0]),a(j[0])-a(i[0]),e),h(k,a(i[1]),a(j[1])-a(i[1]),e)]);if(c[0]){d.set("scrollLeft",c[0]);}if(c[1]){d.set("scrollTop",c[1]);}},get:function(d){var c=d._node;return[c.get("scrollLeft"),c.get("scrollTop")];}};},"3.5.1",{requires:["anim-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/anim-scroll/anim-scroll.js'
--- debian/extras/jslibs/yui/anim-scroll/anim-scroll.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-scroll/anim-scroll.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,44 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-scroll', function(Y) {
+
+/**
+ * Adds support for the <code>scroll</code> property in <code>to</code>
+ * and <code>from</code> attributes.
+ * @module anim
+ * @submodule anim-scroll
+ */
+
+var NUM = Number;
+
+//TODO: deprecate for scrollTop/Left properties?
+Y.Anim.behaviors.scroll = {
+    set: function(anim, att, from, to, elapsed, duration, fn) {
+        var
+            node = anim._node, 
+            val = ([
+            fn(elapsed, NUM(from[0]), NUM(to[0]) - NUM(from[0]), duration),
+            fn(elapsed, NUM(from[1]), NUM(to[1]) - NUM(from[1]), duration)
+        ]);
+
+        if (val[0]) {
+            node.set('scrollLeft', val[0]);
+        }
+
+        if (val[1]) {
+            node.set('scrollTop', val[1]);
+        }
+    },
+    get: function(anim) {
+        var node = anim._node;
+        return [node.get('scrollLeft'), node.get('scrollTop')];
+    }
+};
+
+
+
+}, '3.5.1' ,{requires:['anim-base']});

=== added directory 'debian/extras/jslibs/yui/anim-shape-transform'
=== added file 'debian/extras/jslibs/yui/anim-shape-transform/anim-shape-transform-debug.js'
--- debian/extras/jslibs/yui/anim-shape-transform/anim-shape-transform-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-shape-transform/anim-shape-transform-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,112 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-shape-transform', function(Y) {
+
+/**
+ * Adds support for the <code>transform</code> attribute of <code>Graphic</code>
+ * <code>Shape</code> instances.
+ * @module anim
+ * @submodule anim-shape-transform
+ */
+    var NUM = Number,
+        TO,
+        TOSTRING;
+
+    Y.Anim.behaviors.transform = {
+        set: function(anim, att, from, to, elapsed, duration, fn) {
+            var node = anim._node,
+                transform = "",
+                transformTo,
+                transformFrom,
+                toArgs,
+                fromArgs,
+                i = 0,
+                j,
+                argLen,
+                len;
+            to = TO;
+            len = TO.length;
+            for(; i < len; ++i)
+            {
+                toArgs = to[i].concat();
+                fromArgs = from[i].concat();
+                transformTo = toArgs.shift();
+                transformFrom = fromArgs.shift();
+                argLen = toArgs.length;
+                transform += transformTo + "(";
+                for(j = 0; j < argLen; ++j)
+                {
+                    transform += fn(elapsed, NUM(fromArgs[j]), NUM(toArgs[j]) - NUM(fromArgs[j]), duration);
+                    if(j < argLen - 1)
+                    {
+                        transform += ", ";
+                    }
+                }
+                transform += ");";
+            }
+            if(transform)
+            {
+                node.set('transform', transform);
+            }
+            node._transform = TOSTRING;
+        },
+        
+        get: function(anim) {
+            var node = anim._node,
+                fromMatrix = node.matrix,
+                toAttr = anim.get("to") || {},
+                toString = anim.get("to").transform,
+                fromString = node.get("transform"),
+                toArray = Y.MatrixUtil.getTransformArray(toString),
+                fromArray = fromString ? Y.MatrixUtil.getTransformArray(fromString) : null,
+                toMatrix,
+                i,
+                len,
+                transformFunction,
+                from;
+            if(toArray)
+            {
+                if(!fromArray || fromArray.length < 1)
+                {
+                    fromArray = [];
+                    len = toArray.length;
+                    for(i = 0; i < len; ++i)
+                    {
+                        transformFunction = toArray[i][0];
+                        fromArray[i] = Y.MatrixUtil.getTransformFunctionArray(transformFunction);
+                    }
+                    TO = toArray;
+                    from = fromArray;
+                }
+                else if(Y.MatrixUtil.compareTransformSequence(toArray, fromArray))
+                {
+                    TO = toArray;
+                    from = fromArray;
+                }
+                else
+                {
+                    toMatrix = new Y.Matrix();
+                    len = toArray.length;
+                    for(i = 0; i < len; ++i)
+                    {
+                        transformFunction = toArray[i].shift();
+                        transformFunction = transformFunction == "matrix" ? "multiply" : transformFunction;
+                        toMatrix[transformFunction].apply(toMatrix, toArray[i]); 
+                    }
+
+                    TO = toMatrix.decompose();
+                    from = fromMatrix.decompose();
+                }
+            }
+            TOSTRING = toString;
+            return from;
+        }
+    };  
+
+
+
+}, '3.5.1' ,{requires:['anim-base','matrix']});

=== added file 'debian/extras/jslibs/yui/anim-shape-transform/anim-shape-transform-min.js'
--- debian/extras/jslibs/yui/anim-shape-transform/anim-shape-transform-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-shape-transform/anim-shape-transform-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("anim-shape-transform",function(d){var b=Number,a,c;d.Anim.behaviors.transform={set:function(k,q,t,u,v,h,s){var g=k._node,f="",r,n,w,e,m=0,l,p,o;u=a;o=a.length;for(;m<o;++m){w=u[m].concat();e=t[m].concat();r=w.shift();n=e.shift();p=w.length;f+=r+"(";for(l=0;l<p;++l){f+=s(v,b(e[l]),b(w[l])-b(e[l]),h);if(l<p-1){f+=", ";}}f+=");";}if(f){g.set("transform",f);}g._transform=c;},get:function(k){var j=k._node,h=j.matrix,r=k.get("to")||{},e=k.get("to").transform,g=j.get("transform"),l=d.MatrixUtil.getTransformArray(e),q=g?d.MatrixUtil.getTransformArray(g):null,n,m,o,f,p;if(l){if(!q||q.length<1){q=[];o=l.length;for(m=0;m<o;++m){f=l[m][0];q[m]=d.MatrixUtil.getTransformFunctionArray(f);}a=l;p=q;}else{if(d.MatrixUtil.compareTransformSequence(l,q)){a=l;p=q;}else{n=new d.Matrix();o=l.length;for(m=0;m<o;++m){f=l[m].shift();f=f=="matrix"?"multiply":f;n[f].apply(n,l[m]);}a=n.decompose();p=h.decompose();}}}c=e;return p;}};},"3.5.1",{requires:["anim-base","matrix"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/anim-shape-transform/anim-shape-transform.js'
--- debian/extras/jslibs/yui/anim-shape-transform/anim-shape-transform.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-shape-transform/anim-shape-transform.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,112 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-shape-transform', function(Y) {
+
+/**
+ * Adds support for the <code>transform</code> attribute of <code>Graphic</code>
+ * <code>Shape</code> instances.
+ * @module anim
+ * @submodule anim-shape-transform
+ */
+    var NUM = Number,
+        TO,
+        TOSTRING;
+
+    Y.Anim.behaviors.transform = {
+        set: function(anim, att, from, to, elapsed, duration, fn) {
+            var node = anim._node,
+                transform = "",
+                transformTo,
+                transformFrom,
+                toArgs,
+                fromArgs,
+                i = 0,
+                j,
+                argLen,
+                len;
+            to = TO;
+            len = TO.length;
+            for(; i < len; ++i)
+            {
+                toArgs = to[i].concat();
+                fromArgs = from[i].concat();
+                transformTo = toArgs.shift();
+                transformFrom = fromArgs.shift();
+                argLen = toArgs.length;
+                transform += transformTo + "(";
+                for(j = 0; j < argLen; ++j)
+                {
+                    transform += fn(elapsed, NUM(fromArgs[j]), NUM(toArgs[j]) - NUM(fromArgs[j]), duration);
+                    if(j < argLen - 1)
+                    {
+                        transform += ", ";
+                    }
+                }
+                transform += ");";
+            }
+            if(transform)
+            {
+                node.set('transform', transform);
+            }
+            node._transform = TOSTRING;
+        },
+        
+        get: function(anim) {
+            var node = anim._node,
+                fromMatrix = node.matrix,
+                toAttr = anim.get("to") || {},
+                toString = anim.get("to").transform,
+                fromString = node.get("transform"),
+                toArray = Y.MatrixUtil.getTransformArray(toString),
+                fromArray = fromString ? Y.MatrixUtil.getTransformArray(fromString) : null,
+                toMatrix,
+                i,
+                len,
+                transformFunction,
+                from;
+            if(toArray)
+            {
+                if(!fromArray || fromArray.length < 1)
+                {
+                    fromArray = [];
+                    len = toArray.length;
+                    for(i = 0; i < len; ++i)
+                    {
+                        transformFunction = toArray[i][0];
+                        fromArray[i] = Y.MatrixUtil.getTransformFunctionArray(transformFunction);
+                    }
+                    TO = toArray;
+                    from = fromArray;
+                }
+                else if(Y.MatrixUtil.compareTransformSequence(toArray, fromArray))
+                {
+                    TO = toArray;
+                    from = fromArray;
+                }
+                else
+                {
+                    toMatrix = new Y.Matrix();
+                    len = toArray.length;
+                    for(i = 0; i < len; ++i)
+                    {
+                        transformFunction = toArray[i].shift();
+                        transformFunction = transformFunction == "matrix" ? "multiply" : transformFunction;
+                        toMatrix[transformFunction].apply(toMatrix, toArray[i]); 
+                    }
+
+                    TO = toMatrix.decompose();
+                    from = fromMatrix.decompose();
+                }
+            }
+            TOSTRING = toString;
+            return from;
+        }
+    };  
+
+
+
+}, '3.5.1' ,{requires:['anim-base','matrix']});

=== added directory 'debian/extras/jslibs/yui/anim-xy'
=== added file 'debian/extras/jslibs/yui/anim-xy/anim-xy-debug.js'
--- debian/extras/jslibs/yui/anim-xy/anim-xy-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-xy/anim-xy-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,32 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-xy', function(Y) {
+
+/**
+ * Adds support for the <code>xy</code> property in <code>from</code> and 
+ * <code>to</code> attributes.
+ * @module anim
+ * @submodule anim-xy
+ */
+
+var NUM = Number;
+
+Y.Anim.behaviors.xy = {
+    set: function(anim, att, from, to, elapsed, duration, fn) {
+        anim._node.setXY([
+            fn(elapsed, NUM(from[0]), NUM(to[0]) - NUM(from[0]), duration),
+            fn(elapsed, NUM(from[1]), NUM(to[1]) - NUM(from[1]), duration)
+        ]);
+    },
+    get: function(anim) {
+        return anim._node.getXY();
+    }
+};
+
+
+
+}, '3.5.1' ,{requires:['anim-base', 'node-screen']});

=== added file 'debian/extras/jslibs/yui/anim-xy/anim-xy-min.js'
--- debian/extras/jslibs/yui/anim-xy/anim-xy-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-xy/anim-xy-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("anim-xy",function(b){var a=Number;b.Anim.behaviors.xy={set:function(f,d,i,h,c,g,e){f._node.setXY([e(c,a(i[0]),a(h[0])-a(i[0]),g),e(c,a(i[1]),a(h[1])-a(i[1]),g)]);},get:function(c){return c._node.getXY();}};},"3.5.1",{requires:["anim-base","node-screen"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/anim-xy/anim-xy.js'
--- debian/extras/jslibs/yui/anim-xy/anim-xy.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/anim-xy/anim-xy.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,32 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('anim-xy', function(Y) {
+
+/**
+ * Adds support for the <code>xy</code> property in <code>from</code> and 
+ * <code>to</code> attributes.
+ * @module anim
+ * @submodule anim-xy
+ */
+
+var NUM = Number;
+
+Y.Anim.behaviors.xy = {
+    set: function(anim, att, from, to, elapsed, duration, fn) {
+        anim._node.setXY([
+            fn(elapsed, NUM(from[0]), NUM(to[0]) - NUM(from[0]), duration),
+            fn(elapsed, NUM(from[1]), NUM(to[1]) - NUM(from[1]), duration)
+        ]);
+    },
+    get: function(anim) {
+        return anim._node.getXY();
+    }
+};
+
+
+
+}, '3.5.1' ,{requires:['anim-base', 'node-screen']});

=== added directory 'debian/extras/jslibs/yui/app-base'
=== added file 'debian/extras/jslibs/yui/app-base/app-base-debug.js'
--- debian/extras/jslibs/yui/app-base/app-base-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/app-base/app-base-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,1142 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('app-base', function(Y) {
+
+/**
+The App Framework provides simple MVC-like building blocks (models, model lists,
+views, and URL-based routing) for writing single-page JavaScript applications.
+
+@main app
+@module app
+@since 3.4.0
+**/
+
+/**
+Provides a top-level application component which manages navigation and views.
+
+@module app
+@submodule app-base
+@since 3.5.0
+**/
+
+// TODO: Better handling of lifecycle for registered views:
+//
+//   * [!] Just redo basically everything with view management so there are no
+//     pre-`activeViewChange` side effects and handle the rest of these things:
+//
+//   * Seems like any view created via `createView` should listen for the view's
+//     `destroy` event and use that to remove it from the `_viewsInfoMap`. I
+//     should look at what ModelList does for Models as a reference.
+//
+//   * Should we have a companion `destroyView()` method? Maybe this wouldn't be
+//     needed if we have a `getView(name, create)` method, and already doing the
+//     above? We could do `app.getView('foo').destroy()` and it would be removed
+//     from the `_viewsInfoMap` as well.
+//
+//   * Should we wait to call a view's `render()` method inside of the
+//     `_attachView()` method?
+//
+//   * Should named views support a collection of instances instead of just one?
+//
+
+var Lang    = Y.Lang,
+    YObject = Y.Object,
+
+    PjaxBase = Y.PjaxBase,
+    Router   = Y.Router,
+    View     = Y.View,
+
+    getClassName = Y.ClassNameManager.getClassName,
+
+    win = Y.config.win,
+
+    App;
+
+/**
+Provides a top-level application component which manages navigation and views.
+
+This gives you a foundation and structure on which to build your application; it
+combines robust URL navigation with powerful routing and flexible view
+management.
+
+@class App.Base
+@param {Object} [config] The following are configuration properties that can be
+    specified _in addition_ to default attribute values and the non-attribute
+    properties provided by `Y.Base`:
+  @param {Object} [config.views] Hash of view-name to metadata used to
+    declaratively describe an application's views and their relationship with
+    the app and other views. The views specified here will override any defaults
+    provided by the `views` object on the `prototype`.
+@constructor
+@extends Base
+@uses View
+@uses Router
+@uses PjaxBase
+@since 3.5.0
+**/
+App = Y.Base.create('app', Y.Base, [View, Router, PjaxBase], {
+    // -- Public Properties ----------------------------------------------------
+
+    /**
+    Hash of view-name to metadata used to declaratively describe an
+    application's views and their relationship with the app and its other views.
+
+    The view metadata is composed of Objects keyed to a view-name that can have
+    any or all of the following properties:
+
+      * `type`: Function or a string representing the view constructor to use to
+        create view instances. If a string is used, the constructor function is
+        assumed to be on the `Y` object; e.g. `"SomeView"` -> `Y.SomeView`.
+
+      * `preserve`: Boolean for whether the view instance should be retained. By
+        default, the view instance will be destroyed when it is no longer the
+        `activeView`. If `true` the view instance will simply be `removed()`
+        from the DOM when it is no longer active. This is useful when the view
+        is frequently used and may be expensive to re-create.
+
+      * `parent`: String to another named view in this hash that represents the
+        parent view within the application's view hierarchy; e.g. a `"photo"`
+        view could have `"album"` has its `parent` view. This parent/child
+        relationship is a useful cue for things like transitions.
+
+      * `instance`: Used internally to manage the current instance of this named
+        view. This can be used if your view instance is created up-front, or if
+        you would rather manage the View lifecycle, but you probably should just
+        let this be handled for you.
+
+    If `views` are specified at instantiation time, the metadata in the `views`
+    Object here will be used as defaults when creating the instance's `views`.
+
+    Every `Y.App` instance gets its own copy of a `views` object so this Object
+    on the prototype will not be polluted.
+
+    @example
+        // Imagine that `Y.UsersView` and `Y.UserView` have been defined.
+        var app = new Y.App({
+            views: {
+                users: {
+                    type    : Y.UsersView,
+                    preserve: true
+                },
+
+                user: {
+                    type  : Y.UserView,
+                    parent: 'users'
+                }
+            }
+        });
+
+    @property views
+    @type Object
+    @default {}
+    @since 3.5.0
+    **/
+    views: {},
+
+    // -- Protected Properties -------------------------------------------------
+
+    /**
+    Map of view instance id (via `Y.stamp()`) to view-info object in `views`.
+
+    This mapping is used to tie a specific view instance back to its metadata by
+    adding a reference to the the related view info on the `views` object.
+
+    @property _viewInfoMap
+    @type Object
+    @default {}
+    @protected
+    @since 3.5.0
+    **/
+
+    // -- Lifecycle Methods ----------------------------------------------------
+    initializer: function (config) {
+        config || (config = {});
+
+        var views = {};
+
+        // Merges-in specified view metadata into local `views` object.
+        function mergeViewConfig(view, name) {
+            views[name] = Y.merge(views[name], view);
+        }
+
+        // First, each view in the `views` prototype object gets its metadata
+        // merged-in, providing the defaults.
+        YObject.each(this.views, mergeViewConfig);
+
+        // Then, each view in the specified `config.views` object gets its
+        // metadata merged-in.
+        YObject.each(config.views, mergeViewConfig);
+
+        // The resulting hodgepodge of metadata is then stored as the instance's
+        // `views` object, and no one's objects were harmed in the making.
+        this.views        = views;
+        this._viewInfoMap = {};
+
+        // Using `bind()` to aid extensibility.
+        this.after('activeViewChange', Y.bind('_afterActiveViewChange', this));
+
+        // PjaxBase will bind click events when `html5` is `true`, so this just
+        // forces the binding when `serverRouting` and `html5` are both falsy.
+        if (!this.get('serverRouting')) {
+            this._pjaxBindUI();
+        }
+    },
+
+    // TODO: `destructor` to destroy the `activeView`?
+
+    // -- Public Methods -------------------------------------------------------
+
+    /**
+    Creates and returns a new view instance using the provided `name` to look up
+    the view info metadata defined in the `views` object. The passed-in `config`
+    object is passed to the view constructor function.
+
+    This function also maps a view instance back to its view info metadata.
+
+    @method createView
+    @param {String} name The name of a view defined on the `views` object.
+    @param {Object} [config] The configuration object passed to the view
+      constructor function when creating the new view instance.
+    @return {View} The new view instance.
+    @since 3.5.0
+    **/
+    createView: function (name, config) {
+        var viewInfo = this.getViewInfo(name),
+            type     = (viewInfo && viewInfo.type) || View,
+            ViewConstructor, view;
+
+        // Looks for a namespaced constructor function on `Y`.
+        ViewConstructor = Lang.isString(type) ?
+                YObject.getValue(Y, type.split('.')) : type;
+
+        // Create the view instance and map it with its metadata.
+        view = new ViewConstructor(config);
+        this._viewInfoMap[Y.stamp(view, true)] = viewInfo;
+
+        return view;
+    },
+
+    /**
+    Returns the metadata associated with a view instance or view name defined on
+    the `views` object.
+
+    @method getViewInfo
+    @param {View|String} view View instance, or name of a view defined on the
+      `views` object.
+    @return {Object} The metadata for the view, or `undefined` if the view is
+      not registered.
+    @since 3.5.0
+    **/
+    getViewInfo: function (view) {
+        if (Lang.isString(view)) {
+            return this.views[view];
+        }
+
+        return view && this._viewInfoMap[Y.stamp(view, true)];
+    },
+
+    /**
+    Navigates to the specified URL if there is a route handler that matches. In
+    browsers capable of using HTML5 history or when `serverRouting` is falsy,
+    the navigation will be enhanced by firing the `navigate` event and having
+    the app handle the "request". When `serverRouting` is `true`, non-HTML5
+    browsers will navigate to the new URL via a full page reload.
+
+    When there is a route handler for the specified URL and it is being
+    navigated to, this method will return `true`, otherwise it will return
+    `false`.
+
+    **Note:** The specified URL _must_ be of the same origin as the current URL,
+    otherwise an error will be logged and navigation will not occur. This is
+    intended as both a security constraint and a purposely imposed limitation as
+    it does not make sense to tell the app to navigate to a URL on a
+    different scheme, host, or port.
+
+    @method navigate
+    @param {String} url The URL to navigate to. This must be of the same origin
+      as the current URL.
+    @param {Object} [options] Additional options to configure the navigation.
+      These are mixed into the `navigate` event facade.
+        @param {Boolean} [options.replace] Whether or not the current history
+          entry will be replaced, or a new entry will be created. Will default
+          to `true` if the specified `url` is the same as the current URL.
+        @param {Boolean} [options.force] Whether the enhanced navigation
+          should occur even in browsers without HTML5 history. Will default to
+          `true` when `serverRouting` is falsy.
+    @see PjaxBase.navigate()
+    **/
+    // Does not override `navigate()` but does use extra `options`.
+
+    /**
+    Renders this application by appending the `viewContainer` node to the
+    `container` node if it isn't already a child of the container, and the
+    `activeView` will be appended the view container, if it isn't already.
+
+    You should call this method at least once, usually after the initialization
+    of your app instance so the proper DOM structure is setup and optionally
+    append the container to the DOM if it's not there already.
+
+    You may override this method to customize the app's rendering, but you
+    should expect that the `viewContainer`'s contents will be modified by the
+    app for the purpose of rendering the `activeView` when it changes.
+
+    @method render
+    @chainable
+    @see View.render()
+    **/
+    render: function () {
+        var container           = this.get('container'),
+            viewContainer       = this.get('viewContainer'),
+            activeView          = this.get('activeView'),
+            activeViewContainer = activeView && activeView.get('container'),
+            areSame             = container.compareTo(viewContainer);
+
+        container.addClass(App.CSS_CLASS);
+        viewContainer.addClass(App.VIEWS_CSS_CLASS);
+
+        // Prevents needless shuffling around of nodes and maintains DOM order.
+        if (activeView && !viewContainer.contains(activeViewContainer)) {
+            viewContainer.appendChild(activeViewContainer);
+        }
+
+        // Prevents needless shuffling around of nodes and maintains DOM order.
+        if (!container.contains(viewContainer) && !areSame) {
+            container.appendChild(viewContainer);
+        }
+
+        return this;
+    },
+
+    /**
+    Sets which view is active/visible for the application. This will set the
+    app's `activeView` attribute to the specified `view`.
+
+    The `view` will be "attached" to this app, meaning it will be both rendered
+    into this app's `viewContainer` node and all of its events will bubble to
+    the app. The previous `activeView` will be "detached" from this app.
+
+    When a string-name is provided for a view which has been registered on this
+    app's `views` object, the referenced metadata will be used and the
+    `activeView` will be set to either a preserved view instance, or a new
+    instance of the registered view will be created using the specified `config`
+    object passed-into this method.
+
+    A callback function can be specified as either the third or fourth argument,
+    and this function will be called after the new `view` becomes the
+    `activeView`, is rendered to the `viewContainer`, and is ready to use.
+
+    @example
+        var app = new Y.App({
+            views: {
+                usersView: {
+                    // Imagine that `Y.UsersView` has been defined.
+                    type: Y.UsersView
+                }
+            },
+
+            users: new Y.ModelList()
+        });
+
+        app.route('/users/', function () {
+            this.showView('usersView', {users: this.get('users')});
+        });
+
+        app.render();
+        app.navigate('/uses/'); // => Creates a new `Y.UsersView` and shows it.
+
+    @method showView
+    @param {String|View} view The name of a view defined in the `views` object,
+        or a view instance which should become this app's `activeView`.
+    @param {Object} [config] Optional configuration to use when creating a new
+        view instance. This config object can also be used to update an existing
+        or preserved view's attributes when `options.update` is `true`.
+    @param {Object} [options] Optional object containing any of the following
+        properties:
+      @param {Function} [options.callback] Optional callback function to call
+        after new `activeView` is ready to use, the function will be passed:
+          @param {View} options.callback.view A reference to the new
+            `activeView`.
+      @param {Boolean} [options.prepend=false] Whether the `view` should be
+        prepended instead of appended to the `viewContainer`.
+      @param {Boolean} [options.render] Whether the `view` should be rendered.
+        **Note:** If no value is specified, a view instance will only be
+        rendered if it's newly created by this method.
+      @param {Boolean} [options.update=false] Whether an existing view should
+        have its attributes updated by passing the `config` object to its
+        `setAttrs()` method. **Note:** This option does not have an effect if
+        the `view` instance is created as a result of calling this method.
+    @param {Function} [callback] Optional callback Function to call after the
+        new `activeView` is ready to use. **Note:** this will override
+        `options.callback` and it can be specified as either the third or fourth
+        argument. The function will be passed the following:
+      @param {View} callback.view A reference to the new `activeView`.
+    @chainable
+    @since 3.5.0
+    **/
+    showView: function (view, config, options, callback) {
+        var viewInfo, created;
+
+        options || (options = {});
+
+        // Support the callback function being either the third or fourth arg.
+        if (callback) {
+            options.callback = callback;
+        } else if (Lang.isFunction(options)) {
+            options = {callback: options};
+        }
+
+        if (Lang.isString(view)) {
+            viewInfo = this.getViewInfo(view);
+
+            // Use the preserved view instance, or create a new view.
+            // TODO: Maybe we can remove the strict check for `preserve` and
+            // assume we'll use a View instance if it is there, and just check
+            // `preserve` when detaching?
+            if (viewInfo && viewInfo.preserve && viewInfo.instance) {
+                view = viewInfo.instance;
+
+                // Make sure there's a mapping back to the view metadata.
+                this._viewInfoMap[Y.stamp(view, true)] = viewInfo;
+            } else {
+                // TODO: Add the app as a bubble target during construction, but
+                // make sure to check that it isn't already in `bubbleTargets`!
+                // This will allow the app to be notified for about _all_ of the
+                // view's events. **Note:** This should _only_ happen if the
+                // view is created _after_ `activeViewChange`.
+
+                view    = this.createView(view, config);
+                created = true;
+            }
+        }
+
+        // Update the specified or preserved `view` when signaled to do so.
+        // There's no need to updated a view if it was _just_ created.
+        if (options.update && !created) {
+            view.setAttrs(config);
+        }
+
+        // TODO: Hold off on rendering the view until after it has been
+        // "attached", and move the call to render into `_attachView()`.
+
+        // When a value is specified for `options.render`, prefer it because it
+        // represents the developer's intent. When no value is specified, the
+        // `view` will only be rendered if it was just created.
+        if ('render' in options) {
+            options.render && view.render();
+        } else if (created) {
+            view.render();
+        }
+
+        return this._set('activeView', view, {options: options});
+    },
+
+    // -- Protected Methods ----------------------------------------------------
+
+    /**
+    Helper method to attach the view instance to the application by making the
+    app a bubble target of the view, append the view to the `viewContainer`, and
+    assign it to the `instance` property of the associated view info metadata.
+
+    @method _attachView
+    @param {View} view View to attach.
+    @param {Boolean} prepend=false Whether the view should be prepended instead
+      of appended to the `viewContainer`.
+    @protected
+    @since 3.5.0
+    **/
+    _attachView: function (view, prepend) {
+        if (!view) {
+            return;
+        }
+
+        var viewInfo      = this.getViewInfo(view),
+            viewContainer = this.get('viewContainer');
+
+        view.addTarget(this);
+        viewInfo && (viewInfo.instance = view);
+
+        // TODO: Attach events here for persevered Views?
+        // See related TODO in `_detachView`.
+
+        // TODO: Actually render the view here so that it gets "attached" before
+        // it gets rendered?
+
+        // Insert view into the DOM.
+        viewContainer[prepend ? 'prepend' : 'append'](view.get('container'));
+    },
+
+    /**
+    Overrides View's container destruction to deal with the `viewContainer` and
+    checks to make sure not to remove and purge the `<body>`.
+
+    @method _destroyContainer
+    @protected
+    @see View._destroyContainer()
+    **/
+    _destroyContainer: function () {
+        var container     = this.get('container'),
+            viewContainer = this.get('viewContainer'),
+            areSame       = container.compareTo(viewContainer);
+
+        // We do not want to remove or destroy the `<body>`.
+        if (Y.one('body').compareTo(container)) {
+            // Just clean-up our events listeners.
+            this.detachEvents();
+
+            // Clean-up `yui3-app` CSS class on the `container`.
+            container && container.removeClass(App.CSS_CLASS);
+
+            if (areSame) {
+                // Clean-up `yui3-app-views` CSS class on the `container`.
+                container && container.removeClass(App.VIEWS_CSS_CLASS);
+            } else {
+                // Destroy and purge the `viewContainer`.
+                viewContainer && viewContainer.remove(true);
+            }
+
+            return;
+        }
+
+        // Remove and purge events from both containers.
+        viewContainer && viewContainer.remove(true);
+        !areSame && container && container.remove(true);
+    },
+
+    /**
+    Helper method to detach the view instance from the application by removing
+    the application as a bubble target of the view, and either just removing the
+    view if it is intended to be preserved, or destroying the instance
+    completely.
+
+    @method _detachView
+    @param {View} view View to detach.
+    @protected
+    @since 3.5.0
+    **/
+    _detachView: function (view) {
+        if (!view) {
+            return;
+        }
+
+        var viewInfo = this.getViewInfo(view) || {};
+
+        if (viewInfo.preserve) {
+            view.remove();
+            // TODO: Detach events here for preserved Views? It is possible that
+            // some event subscriptions are made on elements other than the
+            // View's `container`.
+        } else {
+            view.destroy({remove: true});
+
+            // TODO: The following should probably happen automagically from
+            // `destroy()` being called! Possibly `removeTarget()` as well.
+
+            // Remove from view to view-info map.
+            delete this._viewInfoMap[Y.stamp(view, true)];
+
+            // Remove from view-info instance property.
+            if (view === viewInfo.instance) {
+                delete viewInfo.instance;
+            }
+        }
+
+        view.removeTarget(this);
+    },
+
+    /**
+    Getter for the `viewContainer` attribute.
+
+    @method _getViewContainer
+    @param {Node|null} value Current attribute value.
+    @return {Node} View container node.
+    @protected
+    @since 3.5.0
+    **/
+    _getViewContainer: function (value) {
+        // This wackiness is necessary to enable fully lazy creation of the
+        // container node both when no container is specified and when one is
+        // specified via a valueFn.
+
+        if (!value && !this._viewContainer) {
+            // Create a default container and set that as the new attribute
+            // value. The `this._viewContainer` property prevents infinite
+            // recursion.
+            value = this._viewContainer = this.create();
+            this._set('viewContainer', value);
+        }
+
+        return value;
+    },
+
+    /**
+    Gets the current full URL. When `html5` is false, the URL will first be
+    upgraded before it's returned.
+
+    @method _getURL
+    @return {String} URL.
+    @protected
+    @see Router._getURL()
+    **/
+    _getURL: function () {
+        var url = Y.getLocation().toString();
+        return this._html5 ? url : this._upgradeURL(url);
+    },
+
+    /**
+    Provides the default value for the `html5` attribute.
+
+    The value returned is dependent on the value of the `serverRouting`
+    attribute. When `serverRouting` is explicit set to `false` (not just falsy),
+    the default value for `html5` will be set to `false` for *all* browsers.
+
+    When `serverRouting` is `true` or `undefined` the returned value will be
+    dependent on the browser's capability of using HTML5 history.
+
+    @method _initHtml5
+    @return {Boolean} Whether or not HTML5 history should be used.
+    @protected
+    @since 3.5.0
+    **/
+    _initHtml5: function () {
+        // When `serverRouting` is explicitly set to `false` (not just falsy),
+        // forcing hash-based URLs in all browsers.
+        if (this.get('serverRouting') === false) {
+            return false;
+        } else {
+            return Router.html5;
+        }
+    },
+
+    /**
+    Determines if the specified `view` is configured as a child of the specified
+    `parent` view. This requires both views to be either named-views, or view
+    instances created using configuration data that exists in the `views`
+    object, e.g. created by the `createView()` or `showView()` method.
+
+    @method _isChildView
+    @param {View|String} view The name of a view defined in the `views` object,
+      or a view instance.
+    @param {View|String} parent The name of a view defined in the `views`
+      object, or a view instance.
+    @return {Boolean} Whether the view is configured as a child of the parent.
+    @protected
+    @since 3.5.0
+    **/
+    _isChildView: function (view, parent) {
+        var viewInfo   = this.getViewInfo(view),
+            parentInfo = this.getViewInfo(parent);
+
+        if (viewInfo && parentInfo) {
+            return this.getViewInfo(viewInfo.parent) === parentInfo;
+        }
+
+        return false;
+    },
+
+    /**
+    Determines if the specified `view` is configured as the parent of the
+    specified `child` view. This requires both views to be either named-views,
+    or view instances created using configuration data that exists in the
+    `views` object, e.g. created by the `createView()` or `showView()` method.
+
+    @method _isParentView
+    @param {View|String} view The name of a view defined in the `views` object,
+      or a view instance.
+    @param {View|String} parent The name of a view defined in the `views`
+      object, or a view instance.
+    @return {Boolean} Whether the view is configured as the parent of the child.
+    @protected
+    @since 3.5.0
+    **/
+    _isParentView: function (view, child) {
+        var viewInfo  = this.getViewInfo(view),
+            childInfo = this.getViewInfo(child);
+
+        if (viewInfo && childInfo) {
+            return this.getViewInfo(childInfo.parent) === viewInfo;
+        }
+
+        return false;
+    },
+
+    /**
+    Underlying implementation for `navigate()`.
+
+    @method _navigate
+    @param {String} url The fully-resolved URL that the app should dispatch to
+      its route handlers to fulfill the enhanced navigation "request", or use to
+      update `window.location` in non-HTML5 history capable browsers when
+      `serverRouting` is `true`.
+    @param {Object} [options] Additional options to configure the navigation.
+      These are mixed into the `navigate` event facade.
+        @param {Boolean} [options.replace] Whether or not the current history
+          entry will be replaced, or a new entry will be created. Will default
+          to `true` if the specified `url` is the same as the current URL.
+        @param {Boolean} [options.force] Whether the enhanced navigation
+          should occur even in browsers without HTML5 history. Will default to
+          `true` when `serverRouting` is falsy.
+    @protected
+    @see PjaxBase._navigate()
+    **/
+    _navigate: function (url, options) {
+        url = this._upgradeURL(url);
+
+        options || (options = {});
+
+        if (!this.get('serverRouting')) {
+            // Force navigation to be enhanced and handled by the app when
+            // `serverRouting` is falsy because the server might not be able to
+            // properly handle the request.
+            'force' in options || (options.force = true);
+        }
+
+        return PjaxBase.prototype._navigate.call(this, url, options);
+    },
+
+    /**
+    Will either save a history entry using `pushState()` or the location hash,
+    or gracefully-degrade to sending a request to the server causing a full-page
+    reload.
+
+    Overrides Router's `_save()` method to preform graceful-degradation when the
+    app's `serverRouting` is `true` and `html5` is `false` by updating the full
+    URL via standard assignment to `window.location` or by calling
+    `window.location.replace()`; both of which will cause a request to the
+    server resulting in a full-page reload.
+
+    Otherwise this will just delegate off to Router's `_save()` method allowing
+    the client-side enhanced routing to occur.
+
+    @method _save
+    @param {String} [url] URL for the history entry.
+    @param {Boolean} [replace=false] If `true`, the current history entry will
+      be replaced instead of a new one being added.
+    @chainable
+    @protected
+    @see Router._save()
+    **/
+    _save: function (url, replace) {
+        // Forces full-path URLs to always be used by modifying
+        // `window.location` in non-HTML5 history capable browsers.
+        if (this.get('serverRouting') && !this.get('html5')) {
+            // Perform same-origin check on the specified URL.
+            if (!this._hasSameOrigin(url)) {
+                Y.error('Security error: The new URL must be of the same origin as the current URL.');
+                return this;
+            }
+
+            // Results in the URL's full path starting with '/'.
+            url = this._joinURL(url || '');
+
+            // Either replace the current history entry or create a new one
+            // while navigating to the `url`.
+            if (replace) {
+                win && win.location.replace(url);
+            } else {
+                win && (win.location = url);
+            }
+
+            return this;
+        }
+
+        return Router.prototype._save.apply(this, arguments);
+    },
+
+    /**
+    Performs the actual change of this app's `activeView` by attaching the
+    `newView` to this app, and detaching the `oldView` from this app using any
+    specified `options`.
+
+    The `newView` is attached to the app by rendering it to the `viewContainer`,
+    and making this app a bubble target of its events.
+
+    The `oldView` is detached from the app by removing it from the
+    `viewContainer`, and removing this app as a bubble target for its events.
+    The `oldView` will either be preserved or properly destroyed.
+
+    **Note:** The `activeView` attribute is read-only and can be changed by
+    calling the `showView()` method.
+
+    @method _uiSetActiveView
+    @param {View} newView The View which is now this app's `activeView`.
+    @param {View} [oldView] The View which was this app's `activeView`.
+    @param {Object} [options] Optional object containing any of the following
+        properties:
+      @param {Function} [options.callback] Optional callback function to call
+        after new `activeView` is ready to use, the function will be passed:
+          @param {View} options.callback.view A reference to the new
+            `activeView`.
+      @param {Boolean} [options.prepend=false] Whether the `view` should be
+        prepended instead of appended to the `viewContainer`.
+      @param {Boolean} [options.render] Whether the `view` should be rendered.
+        **Note:** If no value is specified, a view instance will only be
+        rendered if it's newly created by this method.
+      @param {Boolean} [options.update=false] Whether an existing view should
+        have its attributes updated by passing the `config` object to its
+        `setAttrs()` method. **Note:** This option does not have an effect if
+        the `view` instance is created as a result of calling this method.
+    @protected
+    @since 3.5.0
+    **/
+    _uiSetActiveView: function (newView, oldView, options) {
+        options || (options = {});
+
+        var callback = options.callback,
+            isChild  = this._isChildView(newView, oldView),
+            isParent = !isChild && this._isParentView(newView, oldView),
+            prepend  = !!options.prepend || isParent;
+
+        // Prevent detaching (thus removing) the view we want to show. Also hard
+        // to animate out and in, the same view.
+        if (newView === oldView) {
+            return callback && callback.call(this, newView);
+        }
+
+        this._attachView(newView, prepend);
+        this._detachView(oldView);
+
+        callback && callback.call(this, newView);
+    },
+
+    /**
+    Upgrades a hash-based URL to a full-path URL, if necessary.
+
+    The specified `url` will be upgraded if its of the same origin as the
+    current URL and has a path-like hash. URLs that don't need upgrading will be
+    returned as-is.
+
+    @example
+        app._upgradeURL('http://example.com/#/foo/'); // => 'http://example.com/foo/';
+
+    @method _upgradeURL
+    @param {String} url The URL to upgrade from hash-based to full-path.
+    @return {String} The upgraded URL, or the specified URL untouched.
+    @protected
+    @since 3.5.0
+    **/
+    _upgradeURL: function (url) {
+        // We should not try to upgrade paths for external URLs.
+        if (!this._hasSameOrigin(url)) {
+            return url;
+        }
+
+        // TODO: Should the `root` be removed first, and the hash only
+        // considered if in the form of '/#/'?
+        var hash       = (url.match(/#(.*)$/) || [])[1] || '',
+            hashPrefix = Y.HistoryHash.hashPrefix;
+
+        // Strip any hash prefix, like hash-bangs.
+        if (hashPrefix && hash.indexOf(hashPrefix) === 0) {
+            hash = hash.replace(hashPrefix, '');
+        }
+
+        // If the hash looks like a URL path, assume it is, and upgrade it!
+        if (hash && hash.charAt(0) === '/') {
+            // Re-join with configured `root` before resolving.
+            url = this._resolveURL(this._joinURL(hash));
+        }
+
+        return url;
+    },
+
+    // -- Protected Event Handlers ---------------------------------------------
+
+    /**
+    Handles the application's `activeViewChange` event (which is fired when the
+    `activeView` attribute changes) by detaching the old view, attaching the new
+    view.
+
+    The `activeView` attribute is read-only, so the public API to change its
+    value is through the `showView()` method.
+
+    @method _afterActiveViewChange
+    @param {EventFacade} e
+    @protected
+    @since 3.5.0
+    **/
+    _afterActiveViewChange: function (e) {
+        this._uiSetActiveView(e.newVal, e.prevVal, e.options);
+    }
+}, {
+    ATTRS: {
+        /**
+        The application's active/visible view.
+
+        This attribute is read-only, to set the `activeView` use the
+        `showView()` method.
+
+        @attribute activeView
+        @type View
+        @default null
+        @readOnly
+        @see App.Base.showView()
+        @since 3.5.0
+        **/
+        activeView: {
+            value   : null,
+            readOnly: true
+        },
+
+        /**
+        Container node which represents the application's bounding-box, into
+        which this app's content will be rendered.
+
+        The container node serves as the host for all DOM events attached by the
+        app. Delegation is used to handle events on children of the container,
+        allowing the container's contents to be re-rendered at any time without
+        losing event subscriptions.
+
+        The default container is the `<body>` Node, but you can override this in
+        a subclass, or by passing in a custom `container` config value at
+        instantiation time.
+
+        When `container` is overridden by a subclass or passed as a config
+        option at instantiation time, it may be provided as a selector string, a
+        DOM element, or a `Y.Node` instance. During initialization, this app's
+        `create()` method will be called to convert the container into a
+        `Y.Node` instance if it isn't one already and stamp it with the CSS
+        class: `"yui3-app"`.
+
+        The container is not added to the page automatically. This allows you to
+        have full control over how and when your app is actually rendered to
+        the page.
+
+        @attribute container
+        @type HTMLElement|Node|String
+        @default Y.one('body')
+        @initOnly
+        **/
+        container: {
+            valueFn: function () {
+                return Y.one('body');
+            }
+        },
+
+        /**
+        Whether or not this browser is capable of using HTML5 history.
+
+        This value is dependent on the value of `serverRouting` and will default
+        accordingly.
+
+        Setting this to `false` will force the use of hash-based history even on
+        HTML5 browsers, but please don't do this unless you understand the
+        consequences.
+
+        @attribute html5
+        @type Boolean
+        @initOnly
+        @see serverRouting
+        **/
+        html5: {
+            valueFn: '_initHtml5'
+        },
+
+        /**
+        CSS selector string used to filter link click events so that only the
+        links which match it will have the enhanced-navigation behavior of pjax
+        applied.
+
+        When a link is clicked and that link matches this selector, navigating
+        to the link's `href` URL using the enhanced, pjax, behavior will be
+        attempted; and the browser's default way to navigate to new pages will
+        be the fallback.
+
+        By default this selector will match _all_ links on the page.
+
+        @attribute linkSelector
+        @type String|Function
+        @default "a"
+        **/
+        linkSelector: {
+            value: 'a'
+        },
+
+        /**
+        Whether or not this application's server is capable of properly routing
+        all requests and rendering the initial state in the HTML responses.
+
+        This can have three different values, each having particular
+        implications on how the app will handle routing and navigation:
+
+          * `undefined`: The best form of URLs will be chosen based on the
+            capabilities of the browser. Given no information about the server
+            environmentm a balanced approach to routing and navigation is
+            chosen.
+
+            The server should be capable of handling full-path requests, since
+            full-URLs will be generated by browsers using HTML5 history. If this
+            is a client-side-only app the server could handle full-URL requests
+            by sending a redirect back to the root with a hash-based URL, e.g:
+
+                Request:     http://example.com/users/1
+                Redirect to: http://example.com/#/users/1
+
+          * `true`: The server is *fully* capable of properly handling requests
+            to all full-path URLs the app can produce.
+
+            This is the best option for progressive-enhancement because it will
+            cause **all URLs to always have full-paths**, which means the server
+            will be able to accurately handle all URLs this app produces. e.g.
+
+                http://example.com/users/1
+
+            To meet this strict full-URL requirement, browsers which are not
+            capable of using HTML5 history will make requests to the server
+            resulting in full-page reloads.
+
+          * `false`: The server is *not* capable of properly handling requests
+            to all full-path URLs the app can produce, therefore all routing
+            will be handled by this App instance.
+
+            Be aware that this will cause **all URLs to always be hash-based**,
+            even in browsers that are capable of using HTML5 history. e.g.
+
+                http://example.com/#/users/1
+
+            A single-page or client-side-only app where the server sends a
+            "shell" page with JavaScript to the client might have this
+            restriction. If you're setting this to `false`, read the following:
+
+        **Note:** When this is set to `false`, the server will *never* receive
+        the full URL because browsers do not send the fragment-part to the
+        server, that is everything after and including the "#".
+
+        Consider the following example:
+
+            URL shown in browser: http://example.com/#/users/1
+            URL sent to server:   http://example.com/
+
+        You should feel bad about hurting our precious web if you forcefully set
+        either `serverRouting` or `html5` to `false`, because you're basically
+        punching the web in the face here with your lossy URLs! Please make sure
+        you know what you're doing and that you understand the implications.
+
+        Ideally you should always prefer full-path URLs (not /#/foo/), and want
+        full-page reloads when the client's browser is not capable of enhancing
+        the experience using the HTML5 history APIs. Setting this to `true` is
+        the best option for progressive-enhancement (and graceful-degradation).
+
+        @attribute serverRouting
+        @type Boolean
+        @default undefined
+        @initOnly
+        @since 3.5.0
+        **/
+        serverRouting: {
+            value    : undefined,
+            writeOnce: 'initOnly'
+        },
+
+        /**
+        The node into which this app's `views` will be rendered when they become
+        the `activeView`.
+
+        The view container node serves as the container to hold the app's
+        `activeView`. Each time the `activeView` is set via `showView()`, the
+        previous view will be removed from this node, and the new active view's
+        `container` node will be appended.
+
+        The default view container is a `<div>` Node, but you can override this
+        in a subclass, or by passing in a custom `viewContainer` config value at
+        instantiation time. The `viewContainer` may be provided as a selector
+        string, DOM element, or a `Y.Node` instance (having the `viewContainer`
+        and the `container` be the same node is also supported).
+
+        The app's `render()` method will stamp the view container with the CSS
+        class `"yui3-app-views"` and append it to the app's `container` node if
+        it isn't already, and any `activeView` will be appended to this node if
+        it isn't already.
+
+        @attribute viewContainer
+        @type HTMLElement|Node|String
+        @default Y.Node.create(this.containerTemplate)
+        @initOnly
+        @since 3.5.0
+        **/
+        viewContainer: {
+            getter   : '_getViewContainer',
+            setter   : Y.one,
+            writeOnce: true
+        }
+    },
+
+    // TODO: Should these go on the `prototype`?
+    // TODO: These should also just go in a `CLASS_NAMES` object.
+
+    /**
+    CSS class added to an app's `container` node.
+
+    @property CSS_CLASS
+    @type String
+    @default "yui3-app"
+    @static
+    @since 3.5.0
+    **/
+    CSS_CLASS: getClassName('app'),
+
+    /**
+    CSS class added to an app's `viewContainer` node.
+
+    @property VIEWS_CSS_CLASS
+    @type String
+    @default "yui3-app-views"
+    @static
+    @since 3.5.0
+    **/
+    VIEWS_CSS_CLASS: getClassName('app', 'views'),
+
+    /**
+    Properties that shouldn't be turned into ad-hoc attributes when passed to
+    App's constructor.
+
+    @property _NON_ATTRS_CFG
+    @type Array
+    @static
+    @protected
+    @since 3.5.0
+    **/
+    _NON_ATTRS_CFG: ['views']
+});
+
+// -- Namespace ----------------------------------------------------------------
+Y.namespace('App').Base = App;
+
+/**
+Provides a top-level application component which manages navigation and views.
+
+This gives you a foundation and structure on which to build your application; it
+combines robust URL navigation with powerful routing and flexible view
+management.
+
+`Y.App` is both a namespace and constructor function. The `Y.App` class is
+special in that any `Y.App` class extensions that are included in the YUI
+instance will be **auto-mixed** on to the `Y.App` class. Consider this example:
+
+    YUI().use('app-base', 'app-transitions', function (Y) {
+        // This will create two YUI Apps, `basicApp` will not have transitions,
+        // but `fancyApp` will have transitions support included and turn it on.
+        var basicApp = new Y.App.Base(),
+            fancyApp = new Y.App({transitions: true});
+    });
+
+@class App
+@param {Object} [config] The following are configuration properties that can be
+    specified _in addition_ to default attribute values and the non-attribute
+    properties provided by `Y.Base`:
+  @param {Object} [config.views] Hash of view-name to metadata used to
+    declaratively describe an application's views and their relationship with
+    the app and other views. The views specified here will override any defaults
+    provided by the `views` object on the `prototype`.
+@constructor
+@extends App.Base
+@uses App.Transitions
+@since 3.5.0
+**/
+Y.App = Y.mix(Y.Base.create('app', Y.App.Base, []), Y.App, true);
+
+
+}, '3.5.1' ,{requires:['classnamemanager', 'pjax-base', 'router', 'view']});

=== added file 'debian/extras/jslibs/yui/app-base/app-base-min.js'
--- debian/extras/jslibs/yui/app-base/app-base-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/app-base/app-base-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("app-base",function(c){var g=c.Lang,i=c.Object,a=c.PjaxBase,d=c.Router,b=c.View,e=c.ClassNameManager.getClassName,h=c.config.win,f;f=c.Base.create("app",c.Base,[b,d,a],{views:{},initializer:function(k){k||(k={});var j={};function l(m,n){j[n]=c.merge(j[n],m);}i.each(this.views,l);i.each(k.views,l);this.views=j;this._viewInfoMap={};this.after("activeViewChange",c.bind("_afterActiveViewChange",this));if(!this.get("serverRouting")){this._pjaxBindUI();}},createView:function(m,l){var k=this.getViewInfo(m),n=(k&&k.type)||b,o,j;o=g.isString(n)?i.getValue(c,n.split(".")):n;j=new o(l);this._viewInfoMap[c.stamp(j,true)]=k;return j;},getViewInfo:function(j){if(g.isString(j)){return this.views[j];}return j&&this._viewInfoMap[c.stamp(j,true)];},render:function(){var k=this.get("container"),j=this.get("viewContainer"),l=this.get("activeView"),n=l&&l.get("container"),m=k.compareTo(j);k.addClass(f.CSS_CLASS);j.addClass(f.VIEWS_CSS_CLASS);if(l&&!j.contains(n)){j.appendChild(n);}if(!k.contains(j)&&!m){k.appendChild(j);}return this;},showView:function(j,m,l,o){var k,n;l||(l={});if(o){l.callback=o;}else{if(g.isFunction(l)){l={callback:l};}}if(g.isString(j)){k=this.getViewInfo(j);if(k&&k.preserve&&k.instance){j=k.instance;this._viewInfoMap[c.stamp(j,true)]=k;}else{j=this.createView(j,m);n=true;}}if(l.update&&!n){j.setAttrs(m);}if("render" in l){l.render&&j.render();}else{if(n){j.render();}}return this._set("activeView",j,{options:l});},_attachView:function(k,l){if(!k){return;}var m=this.getViewInfo(k),j=this.get("viewContainer");k.addTarget(this);m&&(m.instance=k);j[l?"prepend":"append"](k.get("container"));},_destroyContainer:function(){var k=this.get("container"),j=this.get("viewContainer"),l=k.compareTo(j);if(c.one("body").compareTo(k)){this.detachEvents();k&&k.removeClass(f.CSS_CLASS);if(l){k&&k.removeClass(f.VIEWS_CSS_CLASS);}else{j&&j.remove(true);}return;}j&&j.remove(true);!l&&k&&k.remove(true);},_detachView:function(j){if(!j){return;}var k=this.getViewInfo(j)||{};if(k.preserve){j.remove();}else{j.destroy({remove:true});delete this._viewInfoMap[c.stamp(j,true)];if(j===k.instance){delete k.instance;}}j.removeTarget(this);},_getViewContainer:function(j){if(!j&&!this._viewContainer){j=this._viewContainer=this.create();this._set("viewContainer",j);}return j;},_getURL:function(){var j=c.getLocation().toString();return this._html5?j:this._upgradeURL(j);},_initHtml5:function(){if(this.get("serverRouting")===false){return false;}else{return d.html5;}},_isChildView:function(j,m){var l=this.getViewInfo(j),k=this.getViewInfo(m);if(l&&k){return this.getViewInfo(l.parent)===k;}return false;},_isParentView:function(j,m){var k=this.getViewInfo(j),l=this.getViewInfo(m);if(k&&l){return this.getViewInfo(l.parent)===k;}return false;},_navigate:function(k,j){k=this._upgradeURL(k);j||(j={});if(!this.get("serverRouting")){"force" in j||(j.force=true);}return a.prototype._navigate.call(this,k,j);},_save:function(j,k){if(this.get("serverRouting")&&!this.get("html5")){if(!this._hasSameOrigin(j)){c.error("Security error: The new URL must be of the same origin as the current URL.");return this;}j=this._joinURL(j||"");if(k){h&&h.location.replace(j);}else{h&&(h.location=j);}return this;}return d.prototype._save.apply(this,arguments);},_uiSetActiveView:function(p,n,m){m||(m={});var o=m.callback,j=this._isChildView(p,n),l=!j&&this._isParentView(p,n),k=!!m.prepend||l;if(p===n){return o&&o.call(this,p);}this._attachView(p,k);this._detachView(n);o&&o.call(this,p);},_upgradeURL:function(k){if(!this._hasSameOrigin(k)){return k;}var l=(k.match(/#(.*)$/)||[])[1]||"",j=c.HistoryHash.hashPrefix;if(j&&l.indexOf(j)===0){l=l.replace(j,"");}if(l&&l.charAt(0)==="/"){k=this._resolveURL(this._joinURL(l));}return k;},_afterActiveViewChange:function(j){this._uiSetActiveView(j.newVal,j.prevVal,j.options);}},{ATTRS:{activeView:{value:null,readOnly:true},container:{valueFn:function(){return c.one("body");}},html5:{valueFn:"_initHtml5"},linkSelector:{value:"a"},serverRouting:{value:undefined,writeOnce:"initOnly"},viewContainer:{getter:"_getViewContainer",setter:c.one,writeOnce:true}},CSS_CLASS:e("app"),VIEWS_CSS_CLASS:e("app","views"),_NON_ATTRS_CFG:["views"]});c.namespace("App").Base=f;c.App=c.mix(c.Base.create("app",c.App.Base,[]),c.App,true);},"3.5.1",{requires:["classnamemanager","pjax-base","router","view"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/app-base/app-base.js'
--- debian/extras/jslibs/yui/app-base/app-base.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/app-base/app-base.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,1142 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('app-base', function(Y) {
+
+/**
+The App Framework provides simple MVC-like building blocks (models, model lists,
+views, and URL-based routing) for writing single-page JavaScript applications.
+
+@main app
+@module app
+@since 3.4.0
+**/
+
+/**
+Provides a top-level application component which manages navigation and views.
+
+@module app
+@submodule app-base
+@since 3.5.0
+**/
+
+// TODO: Better handling of lifecycle for registered views:
+//
+//   * [!] Just redo basically everything with view management so there are no
+//     pre-`activeViewChange` side effects and handle the rest of these things:
+//
+//   * Seems like any view created via `createView` should listen for the view's
+//     `destroy` event and use that to remove it from the `_viewsInfoMap`. I
+//     should look at what ModelList does for Models as a reference.
+//
+//   * Should we have a companion `destroyView()` method? Maybe this wouldn't be
+//     needed if we have a `getView(name, create)` method, and already doing the
+//     above? We could do `app.getView('foo').destroy()` and it would be removed
+//     from the `_viewsInfoMap` as well.
+//
+//   * Should we wait to call a view's `render()` method inside of the
+//     `_attachView()` method?
+//
+//   * Should named views support a collection of instances instead of just one?
+//
+
+var Lang    = Y.Lang,
+    YObject = Y.Object,
+
+    PjaxBase = Y.PjaxBase,
+    Router   = Y.Router,
+    View     = Y.View,
+
+    getClassName = Y.ClassNameManager.getClassName,
+
+    win = Y.config.win,
+
+    App;
+
+/**
+Provides a top-level application component which manages navigation and views.
+
+This gives you a foundation and structure on which to build your application; it
+combines robust URL navigation with powerful routing and flexible view
+management.
+
+@class App.Base
+@param {Object} [config] The following are configuration properties that can be
+    specified _in addition_ to default attribute values and the non-attribute
+    properties provided by `Y.Base`:
+  @param {Object} [config.views] Hash of view-name to metadata used to
+    declaratively describe an application's views and their relationship with
+    the app and other views. The views specified here will override any defaults
+    provided by the `views` object on the `prototype`.
+@constructor
+@extends Base
+@uses View
+@uses Router
+@uses PjaxBase
+@since 3.5.0
+**/
+App = Y.Base.create('app', Y.Base, [View, Router, PjaxBase], {
+    // -- Public Properties ----------------------------------------------------
+
+    /**
+    Hash of view-name to metadata used to declaratively describe an
+    application's views and their relationship with the app and its other views.
+
+    The view metadata is composed of Objects keyed to a view-name that can have
+    any or all of the following properties:
+
+      * `type`: Function or a string representing the view constructor to use to
+        create view instances. If a string is used, the constructor function is
+        assumed to be on the `Y` object; e.g. `"SomeView"` -> `Y.SomeView`.
+
+      * `preserve`: Boolean for whether the view instance should be retained. By
+        default, the view instance will be destroyed when it is no longer the
+        `activeView`. If `true` the view instance will simply be `removed()`
+        from the DOM when it is no longer active. This is useful when the view
+        is frequently used and may be expensive to re-create.
+
+      * `parent`: String to another named view in this hash that represents the
+        parent view within the application's view hierarchy; e.g. a `"photo"`
+        view could have `"album"` has its `parent` view. This parent/child
+        relationship is a useful cue for things like transitions.
+
+      * `instance`: Used internally to manage the current instance of this named
+        view. This can be used if your view instance is created up-front, or if
+        you would rather manage the View lifecycle, but you probably should just
+        let this be handled for you.
+
+    If `views` are specified at instantiation time, the metadata in the `views`
+    Object here will be used as defaults when creating the instance's `views`.
+
+    Every `Y.App` instance gets its own copy of a `views` object so this Object
+    on the prototype will not be polluted.
+
+    @example
+        // Imagine that `Y.UsersView` and `Y.UserView` have been defined.
+        var app = new Y.App({
+            views: {
+                users: {
+                    type    : Y.UsersView,
+                    preserve: true
+                },
+
+                user: {
+                    type  : Y.UserView,
+                    parent: 'users'
+                }
+            }
+        });
+
+    @property views
+    @type Object
+    @default {}
+    @since 3.5.0
+    **/
+    views: {},
+
+    // -- Protected Properties -------------------------------------------------
+
+    /**
+    Map of view instance id (via `Y.stamp()`) to view-info object in `views`.
+
+    This mapping is used to tie a specific view instance back to its metadata by
+    adding a reference to the the related view info on the `views` object.
+
+    @property _viewInfoMap
+    @type Object
+    @default {}
+    @protected
+    @since 3.5.0
+    **/
+
+    // -- Lifecycle Methods ----------------------------------------------------
+    initializer: function (config) {
+        config || (config = {});
+
+        var views = {};
+
+        // Merges-in specified view metadata into local `views` object.
+        function mergeViewConfig(view, name) {
+            views[name] = Y.merge(views[name], view);
+        }
+
+        // First, each view in the `views` prototype object gets its metadata
+        // merged-in, providing the defaults.
+        YObject.each(this.views, mergeViewConfig);
+
+        // Then, each view in the specified `config.views` object gets its
+        // metadata merged-in.
+        YObject.each(config.views, mergeViewConfig);
+
+        // The resulting hodgepodge of metadata is then stored as the instance's
+        // `views` object, and no one's objects were harmed in the making.
+        this.views        = views;
+        this._viewInfoMap = {};
+
+        // Using `bind()` to aid extensibility.
+        this.after('activeViewChange', Y.bind('_afterActiveViewChange', this));
+
+        // PjaxBase will bind click events when `html5` is `true`, so this just
+        // forces the binding when `serverRouting` and `html5` are both falsy.
+        if (!this.get('serverRouting')) {
+            this._pjaxBindUI();
+        }
+    },
+
+    // TODO: `destructor` to destroy the `activeView`?
+
+    // -- Public Methods -------------------------------------------------------
+
+    /**
+    Creates and returns a new view instance using the provided `name` to look up
+    the view info metadata defined in the `views` object. The passed-in `config`
+    object is passed to the view constructor function.
+
+    This function also maps a view instance back to its view info metadata.
+
+    @method createView
+    @param {String} name The name of a view defined on the `views` object.
+    @param {Object} [config] The configuration object passed to the view
+      constructor function when creating the new view instance.
+    @return {View} The new view instance.
+    @since 3.5.0
+    **/
+    createView: function (name, config) {
+        var viewInfo = this.getViewInfo(name),
+            type     = (viewInfo && viewInfo.type) || View,
+            ViewConstructor, view;
+
+        // Looks for a namespaced constructor function on `Y`.
+        ViewConstructor = Lang.isString(type) ?
+                YObject.getValue(Y, type.split('.')) : type;
+
+        // Create the view instance and map it with its metadata.
+        view = new ViewConstructor(config);
+        this._viewInfoMap[Y.stamp(view, true)] = viewInfo;
+
+        return view;
+    },
+
+    /**
+    Returns the metadata associated with a view instance or view name defined on
+    the `views` object.
+
+    @method getViewInfo
+    @param {View|String} view View instance, or name of a view defined on the
+      `views` object.
+    @return {Object} The metadata for the view, or `undefined` if the view is
+      not registered.
+    @since 3.5.0
+    **/
+    getViewInfo: function (view) {
+        if (Lang.isString(view)) {
+            return this.views[view];
+        }
+
+        return view && this._viewInfoMap[Y.stamp(view, true)];
+    },
+
+    /**
+    Navigates to the specified URL if there is a route handler that matches. In
+    browsers capable of using HTML5 history or when `serverRouting` is falsy,
+    the navigation will be enhanced by firing the `navigate` event and having
+    the app handle the "request". When `serverRouting` is `true`, non-HTML5
+    browsers will navigate to the new URL via a full page reload.
+
+    When there is a route handler for the specified URL and it is being
+    navigated to, this method will return `true`, otherwise it will return
+    `false`.
+
+    **Note:** The specified URL _must_ be of the same origin as the current URL,
+    otherwise an error will be logged and navigation will not occur. This is
+    intended as both a security constraint and a purposely imposed limitation as
+    it does not make sense to tell the app to navigate to a URL on a
+    different scheme, host, or port.
+
+    @method navigate
+    @param {String} url The URL to navigate to. This must be of the same origin
+      as the current URL.
+    @param {Object} [options] Additional options to configure the navigation.
+      These are mixed into the `navigate` event facade.
+        @param {Boolean} [options.replace] Whether or not the current history
+          entry will be replaced, or a new entry will be created. Will default
+          to `true` if the specified `url` is the same as the current URL.
+        @param {Boolean} [options.force] Whether the enhanced navigation
+          should occur even in browsers without HTML5 history. Will default to
+          `true` when `serverRouting` is falsy.
+    @see PjaxBase.navigate()
+    **/
+    // Does not override `navigate()` but does use extra `options`.
+
+    /**
+    Renders this application by appending the `viewContainer` node to the
+    `container` node if it isn't already a child of the container, and the
+    `activeView` will be appended the view container, if it isn't already.
+
+    You should call this method at least once, usually after the initialization
+    of your app instance so the proper DOM structure is setup and optionally
+    append the container to the DOM if it's not there already.
+
+    You may override this method to customize the app's rendering, but you
+    should expect that the `viewContainer`'s contents will be modified by the
+    app for the purpose of rendering the `activeView` when it changes.
+
+    @method render
+    @chainable
+    @see View.render()
+    **/
+    render: function () {
+        var container           = this.get('container'),
+            viewContainer       = this.get('viewContainer'),
+            activeView          = this.get('activeView'),
+            activeViewContainer = activeView && activeView.get('container'),
+            areSame             = container.compareTo(viewContainer);
+
+        container.addClass(App.CSS_CLASS);
+        viewContainer.addClass(App.VIEWS_CSS_CLASS);
+
+        // Prevents needless shuffling around of nodes and maintains DOM order.
+        if (activeView && !viewContainer.contains(activeViewContainer)) {
+            viewContainer.appendChild(activeViewContainer);
+        }
+
+        // Prevents needless shuffling around of nodes and maintains DOM order.
+        if (!container.contains(viewContainer) && !areSame) {
+            container.appendChild(viewContainer);
+        }
+
+        return this;
+    },
+
+    /**
+    Sets which view is active/visible for the application. This will set the
+    app's `activeView` attribute to the specified `view`.
+
+    The `view` will be "attached" to this app, meaning it will be both rendered
+    into this app's `viewContainer` node and all of its events will bubble to
+    the app. The previous `activeView` will be "detached" from this app.
+
+    When a string-name is provided for a view which has been registered on this
+    app's `views` object, the referenced metadata will be used and the
+    `activeView` will be set to either a preserved view instance, or a new
+    instance of the registered view will be created using the specified `config`
+    object passed-into this method.
+
+    A callback function can be specified as either the third or fourth argument,
+    and this function will be called after the new `view` becomes the
+    `activeView`, is rendered to the `viewContainer`, and is ready to use.
+
+    @example
+        var app = new Y.App({
+            views: {
+                usersView: {
+                    // Imagine that `Y.UsersView` has been defined.
+                    type: Y.UsersView
+                }
+            },
+
+            users: new Y.ModelList()
+        });
+
+        app.route('/users/', function () {
+            this.showView('usersView', {users: this.get('users')});
+        });
+
+        app.render();
+        app.navigate('/uses/'); // => Creates a new `Y.UsersView` and shows it.
+
+    @method showView
+    @param {String|View} view The name of a view defined in the `views` object,
+        or a view instance which should become this app's `activeView`.
+    @param {Object} [config] Optional configuration to use when creating a new
+        view instance. This config object can also be used to update an existing
+        or preserved view's attributes when `options.update` is `true`.
+    @param {Object} [options] Optional object containing any of the following
+        properties:
+      @param {Function} [options.callback] Optional callback function to call
+        after new `activeView` is ready to use, the function will be passed:
+          @param {View} options.callback.view A reference to the new
+            `activeView`.
+      @param {Boolean} [options.prepend=false] Whether the `view` should be
+        prepended instead of appended to the `viewContainer`.
+      @param {Boolean} [options.render] Whether the `view` should be rendered.
+        **Note:** If no value is specified, a view instance will only be
+        rendered if it's newly created by this method.
+      @param {Boolean} [options.update=false] Whether an existing view should
+        have its attributes updated by passing the `config` object to its
+        `setAttrs()` method. **Note:** This option does not have an effect if
+        the `view` instance is created as a result of calling this method.
+    @param {Function} [callback] Optional callback Function to call after the
+        new `activeView` is ready to use. **Note:** this will override
+        `options.callback` and it can be specified as either the third or fourth
+        argument. The function will be passed the following:
+      @param {View} callback.view A reference to the new `activeView`.
+    @chainable
+    @since 3.5.0
+    **/
+    showView: function (view, config, options, callback) {
+        var viewInfo, created;
+
+        options || (options = {});
+
+        // Support the callback function being either the third or fourth arg.
+        if (callback) {
+            options.callback = callback;
+        } else if (Lang.isFunction(options)) {
+            options = {callback: options};
+        }
+
+        if (Lang.isString(view)) {
+            viewInfo = this.getViewInfo(view);
+
+            // Use the preserved view instance, or create a new view.
+            // TODO: Maybe we can remove the strict check for `preserve` and
+            // assume we'll use a View instance if it is there, and just check
+            // `preserve` when detaching?
+            if (viewInfo && viewInfo.preserve && viewInfo.instance) {
+                view = viewInfo.instance;
+
+                // Make sure there's a mapping back to the view metadata.
+                this._viewInfoMap[Y.stamp(view, true)] = viewInfo;
+            } else {
+                // TODO: Add the app as a bubble target during construction, but
+                // make sure to check that it isn't already in `bubbleTargets`!
+                // This will allow the app to be notified for about _all_ of the
+                // view's events. **Note:** This should _only_ happen if the
+                // view is created _after_ `activeViewChange`.
+
+                view    = this.createView(view, config);
+                created = true;
+            }
+        }
+
+        // Update the specified or preserved `view` when signaled to do so.
+        // There's no need to updated a view if it was _just_ created.
+        if (options.update && !created) {
+            view.setAttrs(config);
+        }
+
+        // TODO: Hold off on rendering the view until after it has been
+        // "attached", and move the call to render into `_attachView()`.
+
+        // When a value is specified for `options.render`, prefer it because it
+        // represents the developer's intent. When no value is specified, the
+        // `view` will only be rendered if it was just created.
+        if ('render' in options) {
+            options.render && view.render();
+        } else if (created) {
+            view.render();
+        }
+
+        return this._set('activeView', view, {options: options});
+    },
+
+    // -- Protected Methods ----------------------------------------------------
+
+    /**
+    Helper method to attach the view instance to the application by making the
+    app a bubble target of the view, append the view to the `viewContainer`, and
+    assign it to the `instance` property of the associated view info metadata.
+
+    @method _attachView
+    @param {View} view View to attach.
+    @param {Boolean} prepend=false Whether the view should be prepended instead
+      of appended to the `viewContainer`.
+    @protected
+    @since 3.5.0
+    **/
+    _attachView: function (view, prepend) {
+        if (!view) {
+            return;
+        }
+
+        var viewInfo      = this.getViewInfo(view),
+            viewContainer = this.get('viewContainer');
+
+        view.addTarget(this);
+        viewInfo && (viewInfo.instance = view);
+
+        // TODO: Attach events here for persevered Views?
+        // See related TODO in `_detachView`.
+
+        // TODO: Actually render the view here so that it gets "attached" before
+        // it gets rendered?
+
+        // Insert view into the DOM.
+        viewContainer[prepend ? 'prepend' : 'append'](view.get('container'));
+    },
+
+    /**
+    Overrides View's container destruction to deal with the `viewContainer` and
+    checks to make sure not to remove and purge the `<body>`.
+
+    @method _destroyContainer
+    @protected
+    @see View._destroyContainer()
+    **/
+    _destroyContainer: function () {
+        var container     = this.get('container'),
+            viewContainer = this.get('viewContainer'),
+            areSame       = container.compareTo(viewContainer);
+
+        // We do not want to remove or destroy the `<body>`.
+        if (Y.one('body').compareTo(container)) {
+            // Just clean-up our events listeners.
+            this.detachEvents();
+
+            // Clean-up `yui3-app` CSS class on the `container`.
+            container && container.removeClass(App.CSS_CLASS);
+
+            if (areSame) {
+                // Clean-up `yui3-app-views` CSS class on the `container`.
+                container && container.removeClass(App.VIEWS_CSS_CLASS);
+            } else {
+                // Destroy and purge the `viewContainer`.
+                viewContainer && viewContainer.remove(true);
+            }
+
+            return;
+        }
+
+        // Remove and purge events from both containers.
+        viewContainer && viewContainer.remove(true);
+        !areSame && container && container.remove(true);
+    },
+
+    /**
+    Helper method to detach the view instance from the application by removing
+    the application as a bubble target of the view, and either just removing the
+    view if it is intended to be preserved, or destroying the instance
+    completely.
+
+    @method _detachView
+    @param {View} view View to detach.
+    @protected
+    @since 3.5.0
+    **/
+    _detachView: function (view) {
+        if (!view) {
+            return;
+        }
+
+        var viewInfo = this.getViewInfo(view) || {};
+
+        if (viewInfo.preserve) {
+            view.remove();
+            // TODO: Detach events here for preserved Views? It is possible that
+            // some event subscriptions are made on elements other than the
+            // View's `container`.
+        } else {
+            view.destroy({remove: true});
+
+            // TODO: The following should probably happen automagically from
+            // `destroy()` being called! Possibly `removeTarget()` as well.
+
+            // Remove from view to view-info map.
+            delete this._viewInfoMap[Y.stamp(view, true)];
+
+            // Remove from view-info instance property.
+            if (view === viewInfo.instance) {
+                delete viewInfo.instance;
+            }
+        }
+
+        view.removeTarget(this);
+    },
+
+    /**
+    Getter for the `viewContainer` attribute.
+
+    @method _getViewContainer
+    @param {Node|null} value Current attribute value.
+    @return {Node} View container node.
+    @protected
+    @since 3.5.0
+    **/
+    _getViewContainer: function (value) {
+        // This wackiness is necessary to enable fully lazy creation of the
+        // container node both when no container is specified and when one is
+        // specified via a valueFn.
+
+        if (!value && !this._viewContainer) {
+            // Create a default container and set that as the new attribute
+            // value. The `this._viewContainer` property prevents infinite
+            // recursion.
+            value = this._viewContainer = this.create();
+            this._set('viewContainer', value);
+        }
+
+        return value;
+    },
+
+    /**
+    Gets the current full URL. When `html5` is false, the URL will first be
+    upgraded before it's returned.
+
+    @method _getURL
+    @return {String} URL.
+    @protected
+    @see Router._getURL()
+    **/
+    _getURL: function () {
+        var url = Y.getLocation().toString();
+        return this._html5 ? url : this._upgradeURL(url);
+    },
+
+    /**
+    Provides the default value for the `html5` attribute.
+
+    The value returned is dependent on the value of the `serverRouting`
+    attribute. When `serverRouting` is explicit set to `false` (not just falsy),
+    the default value for `html5` will be set to `false` for *all* browsers.
+
+    When `serverRouting` is `true` or `undefined` the returned value will be
+    dependent on the browser's capability of using HTML5 history.
+
+    @method _initHtml5
+    @return {Boolean} Whether or not HTML5 history should be used.
+    @protected
+    @since 3.5.0
+    **/
+    _initHtml5: function () {
+        // When `serverRouting` is explicitly set to `false` (not just falsy),
+        // forcing hash-based URLs in all browsers.
+        if (this.get('serverRouting') === false) {
+            return false;
+        } else {
+            return Router.html5;
+        }
+    },
+
+    /**
+    Determines if the specified `view` is configured as a child of the specified
+    `parent` view. This requires both views to be either named-views, or view
+    instances created using configuration data that exists in the `views`
+    object, e.g. created by the `createView()` or `showView()` method.
+
+    @method _isChildView
+    @param {View|String} view The name of a view defined in the `views` object,
+      or a view instance.
+    @param {View|String} parent The name of a view defined in the `views`
+      object, or a view instance.
+    @return {Boolean} Whether the view is configured as a child of the parent.
+    @protected
+    @since 3.5.0
+    **/
+    _isChildView: function (view, parent) {
+        var viewInfo   = this.getViewInfo(view),
+            parentInfo = this.getViewInfo(parent);
+
+        if (viewInfo && parentInfo) {
+            return this.getViewInfo(viewInfo.parent) === parentInfo;
+        }
+
+        return false;
+    },
+
+    /**
+    Determines if the specified `view` is configured as the parent of the
+    specified `child` view. This requires both views to be either named-views,
+    or view instances created using configuration data that exists in the
+    `views` object, e.g. created by the `createView()` or `showView()` method.
+
+    @method _isParentView
+    @param {View|String} view The name of a view defined in the `views` object,
+      or a view instance.
+    @param {View|String} parent The name of a view defined in the `views`
+      object, or a view instance.
+    @return {Boolean} Whether the view is configured as the parent of the child.
+    @protected
+    @since 3.5.0
+    **/
+    _isParentView: function (view, child) {
+        var viewInfo  = this.getViewInfo(view),
+            childInfo = this.getViewInfo(child);
+
+        if (viewInfo && childInfo) {
+            return this.getViewInfo(childInfo.parent) === viewInfo;
+        }
+
+        return false;
+    },
+
+    /**
+    Underlying implementation for `navigate()`.
+
+    @method _navigate
+    @param {String} url The fully-resolved URL that the app should dispatch to
+      its route handlers to fulfill the enhanced navigation "request", or use to
+      update `window.location` in non-HTML5 history capable browsers when
+      `serverRouting` is `true`.
+    @param {Object} [options] Additional options to configure the navigation.
+      These are mixed into the `navigate` event facade.
+        @param {Boolean} [options.replace] Whether or not the current history
+          entry will be replaced, or a new entry will be created. Will default
+          to `true` if the specified `url` is the same as the current URL.
+        @param {Boolean} [options.force] Whether the enhanced navigation
+          should occur even in browsers without HTML5 history. Will default to
+          `true` when `serverRouting` is falsy.
+    @protected
+    @see PjaxBase._navigate()
+    **/
+    _navigate: function (url, options) {
+        url = this._upgradeURL(url);
+
+        options || (options = {});
+
+        if (!this.get('serverRouting')) {
+            // Force navigation to be enhanced and handled by the app when
+            // `serverRouting` is falsy because the server might not be able to
+            // properly handle the request.
+            'force' in options || (options.force = true);
+        }
+
+        return PjaxBase.prototype._navigate.call(this, url, options);
+    },
+
+    /**
+    Will either save a history entry using `pushState()` or the location hash,
+    or gracefully-degrade to sending a request to the server causing a full-page
+    reload.
+
+    Overrides Router's `_save()` method to preform graceful-degradation when the
+    app's `serverRouting` is `true` and `html5` is `false` by updating the full
+    URL via standard assignment to `window.location` or by calling
+    `window.location.replace()`; both of which will cause a request to the
+    server resulting in a full-page reload.
+
+    Otherwise this will just delegate off to Router's `_save()` method allowing
+    the client-side enhanced routing to occur.
+
+    @method _save
+    @param {String} [url] URL for the history entry.
+    @param {Boolean} [replace=false] If `true`, the current history entry will
+      be replaced instead of a new one being added.
+    @chainable
+    @protected
+    @see Router._save()
+    **/
+    _save: function (url, replace) {
+        // Forces full-path URLs to always be used by modifying
+        // `window.location` in non-HTML5 history capable browsers.
+        if (this.get('serverRouting') && !this.get('html5')) {
+            // Perform same-origin check on the specified URL.
+            if (!this._hasSameOrigin(url)) {
+                Y.error('Security error: The new URL must be of the same origin as the current URL.');
+                return this;
+            }
+
+            // Results in the URL's full path starting with '/'.
+            url = this._joinURL(url || '');
+
+            // Either replace the current history entry or create a new one
+            // while navigating to the `url`.
+            if (replace) {
+                win && win.location.replace(url);
+            } else {
+                win && (win.location = url);
+            }
+
+            return this;
+        }
+
+        return Router.prototype._save.apply(this, arguments);
+    },
+
+    /**
+    Performs the actual change of this app's `activeView` by attaching the
+    `newView` to this app, and detaching the `oldView` from this app using any
+    specified `options`.
+
+    The `newView` is attached to the app by rendering it to the `viewContainer`,
+    and making this app a bubble target of its events.
+
+    The `oldView` is detached from the app by removing it from the
+    `viewContainer`, and removing this app as a bubble target for its events.
+    The `oldView` will either be preserved or properly destroyed.
+
+    **Note:** The `activeView` attribute is read-only and can be changed by
+    calling the `showView()` method.
+
+    @method _uiSetActiveView
+    @param {View} newView The View which is now this app's `activeView`.
+    @param {View} [oldView] The View which was this app's `activeView`.
+    @param {Object} [options] Optional object containing any of the following
+        properties:
+      @param {Function} [options.callback] Optional callback function to call
+        after new `activeView` is ready to use, the function will be passed:
+          @param {View} options.callback.view A reference to the new
+            `activeView`.
+      @param {Boolean} [options.prepend=false] Whether the `view` should be
+        prepended instead of appended to the `viewContainer`.
+      @param {Boolean} [options.render] Whether the `view` should be rendered.
+        **Note:** If no value is specified, a view instance will only be
+        rendered if it's newly created by this method.
+      @param {Boolean} [options.update=false] Whether an existing view should
+        have its attributes updated by passing the `config` object to its
+        `setAttrs()` method. **Note:** This option does not have an effect if
+        the `view` instance is created as a result of calling this method.
+    @protected
+    @since 3.5.0
+    **/
+    _uiSetActiveView: function (newView, oldView, options) {
+        options || (options = {});
+
+        var callback = options.callback,
+            isChild  = this._isChildView(newView, oldView),
+            isParent = !isChild && this._isParentView(newView, oldView),
+            prepend  = !!options.prepend || isParent;
+
+        // Prevent detaching (thus removing) the view we want to show. Also hard
+        // to animate out and in, the same view.
+        if (newView === oldView) {
+            return callback && callback.call(this, newView);
+        }
+
+        this._attachView(newView, prepend);
+        this._detachView(oldView);
+
+        callback && callback.call(this, newView);
+    },
+
+    /**
+    Upgrades a hash-based URL to a full-path URL, if necessary.
+
+    The specified `url` will be upgraded if its of the same origin as the
+    current URL and has a path-like hash. URLs that don't need upgrading will be
+    returned as-is.
+
+    @example
+        app._upgradeURL('http://example.com/#/foo/'); // => 'http://example.com/foo/';
+
+    @method _upgradeURL
+    @param {String} url The URL to upgrade from hash-based to full-path.
+    @return {String} The upgraded URL, or the specified URL untouched.
+    @protected
+    @since 3.5.0
+    **/
+    _upgradeURL: function (url) {
+        // We should not try to upgrade paths for external URLs.
+        if (!this._hasSameOrigin(url)) {
+            return url;
+        }
+
+        // TODO: Should the `root` be removed first, and the hash only
+        // considered if in the form of '/#/'?
+        var hash       = (url.match(/#(.*)$/) || [])[1] || '',
+            hashPrefix = Y.HistoryHash.hashPrefix;
+
+        // Strip any hash prefix, like hash-bangs.
+        if (hashPrefix && hash.indexOf(hashPrefix) === 0) {
+            hash = hash.replace(hashPrefix, '');
+        }
+
+        // If the hash looks like a URL path, assume it is, and upgrade it!
+        if (hash && hash.charAt(0) === '/') {
+            // Re-join with configured `root` before resolving.
+            url = this._resolveURL(this._joinURL(hash));
+        }
+
+        return url;
+    },
+
+    // -- Protected Event Handlers ---------------------------------------------
+
+    /**
+    Handles the application's `activeViewChange` event (which is fired when the
+    `activeView` attribute changes) by detaching the old view, attaching the new
+    view.
+
+    The `activeView` attribute is read-only, so the public API to change its
+    value is through the `showView()` method.
+
+    @method _afterActiveViewChange
+    @param {EventFacade} e
+    @protected
+    @since 3.5.0
+    **/
+    _afterActiveViewChange: function (e) {
+        this._uiSetActiveView(e.newVal, e.prevVal, e.options);
+    }
+}, {
+    ATTRS: {
+        /**
+        The application's active/visible view.
+
+        This attribute is read-only, to set the `activeView` use the
+        `showView()` method.
+
+        @attribute activeView
+        @type View
+        @default null
+        @readOnly
+        @see App.Base.showView()
+        @since 3.5.0
+        **/
+        activeView: {
+            value   : null,
+            readOnly: true
+        },
+
+        /**
+        Container node which represents the application's bounding-box, into
+        which this app's content will be rendered.
+
+        The container node serves as the host for all DOM events attached by the
+        app. Delegation is used to handle events on children of the container,
+        allowing the container's contents to be re-rendered at any time without
+        losing event subscriptions.
+
+        The default container is the `<body>` Node, but you can override this in
+        a subclass, or by passing in a custom `container` config value at
+        instantiation time.
+
+        When `container` is overridden by a subclass or passed as a config
+        option at instantiation time, it may be provided as a selector string, a
+        DOM element, or a `Y.Node` instance. During initialization, this app's
+        `create()` method will be called to convert the container into a
+        `Y.Node` instance if it isn't one already and stamp it with the CSS
+        class: `"yui3-app"`.
+
+        The container is not added to the page automatically. This allows you to
+        have full control over how and when your app is actually rendered to
+        the page.
+
+        @attribute container
+        @type HTMLElement|Node|String
+        @default Y.one('body')
+        @initOnly
+        **/
+        container: {
+            valueFn: function () {
+                return Y.one('body');
+            }
+        },
+
+        /**
+        Whether or not this browser is capable of using HTML5 history.
+
+        This value is dependent on the value of `serverRouting` and will default
+        accordingly.
+
+        Setting this to `false` will force the use of hash-based history even on
+        HTML5 browsers, but please don't do this unless you understand the
+        consequences.
+
+        @attribute html5
+        @type Boolean
+        @initOnly
+        @see serverRouting
+        **/
+        html5: {
+            valueFn: '_initHtml5'
+        },
+
+        /**
+        CSS selector string used to filter link click events so that only the
+        links which match it will have the enhanced-navigation behavior of pjax
+        applied.
+
+        When a link is clicked and that link matches this selector, navigating
+        to the link's `href` URL using the enhanced, pjax, behavior will be
+        attempted; and the browser's default way to navigate to new pages will
+        be the fallback.
+
+        By default this selector will match _all_ links on the page.
+
+        @attribute linkSelector
+        @type String|Function
+        @default "a"
+        **/
+        linkSelector: {
+            value: 'a'
+        },
+
+        /**
+        Whether or not this application's server is capable of properly routing
+        all requests and rendering the initial state in the HTML responses.
+
+        This can have three different values, each having particular
+        implications on how the app will handle routing and navigation:
+
+          * `undefined`: The best form of URLs will be chosen based on the
+            capabilities of the browser. Given no information about the server
+            environmentm a balanced approach to routing and navigation is
+            chosen.
+
+            The server should be capable of handling full-path requests, since
+            full-URLs will be generated by browsers using HTML5 history. If this
+            is a client-side-only app the server could handle full-URL requests
+            by sending a redirect back to the root with a hash-based URL, e.g:
+
+                Request:     http://example.com/users/1
+                Redirect to: http://example.com/#/users/1
+
+          * `true`: The server is *fully* capable of properly handling requests
+            to all full-path URLs the app can produce.
+
+            This is the best option for progressive-enhancement because it will
+            cause **all URLs to always have full-paths**, which means the server
+            will be able to accurately handle all URLs this app produces. e.g.
+
+                http://example.com/users/1
+
+            To meet this strict full-URL requirement, browsers which are not
+            capable of using HTML5 history will make requests to the server
+            resulting in full-page reloads.
+
+          * `false`: The server is *not* capable of properly handling requests
+            to all full-path URLs the app can produce, therefore all routing
+            will be handled by this App instance.
+
+            Be aware that this will cause **all URLs to always be hash-based**,
+            even in browsers that are capable of using HTML5 history. e.g.
+
+                http://example.com/#/users/1
+
+            A single-page or client-side-only app where the server sends a
+            "shell" page with JavaScript to the client might have this
+            restriction. If you're setting this to `false`, read the following:
+
+        **Note:** When this is set to `false`, the server will *never* receive
+        the full URL because browsers do not send the fragment-part to the
+        server, that is everything after and including the "#".
+
+        Consider the following example:
+
+            URL shown in browser: http://example.com/#/users/1
+            URL sent to server:   http://example.com/
+
+        You should feel bad about hurting our precious web if you forcefully set
+        either `serverRouting` or `html5` to `false`, because you're basically
+        punching the web in the face here with your lossy URLs! Please make sure
+        you know what you're doing and that you understand the implications.
+
+        Ideally you should always prefer full-path URLs (not /#/foo/), and want
+        full-page reloads when the client's browser is not capable of enhancing
+        the experience using the HTML5 history APIs. Setting this to `true` is
+        the best option for progressive-enhancement (and graceful-degradation).
+
+        @attribute serverRouting
+        @type Boolean
+        @default undefined
+        @initOnly
+        @since 3.5.0
+        **/
+        serverRouting: {
+            value    : undefined,
+            writeOnce: 'initOnly'
+        },
+
+        /**
+        The node into which this app's `views` will be rendered when they become
+        the `activeView`.
+
+        The view container node serves as the container to hold the app's
+        `activeView`. Each time the `activeView` is set via `showView()`, the
+        previous view will be removed from this node, and the new active view's
+        `container` node will be appended.
+
+        The default view container is a `<div>` Node, but you can override this
+        in a subclass, or by passing in a custom `viewContainer` config value at
+        instantiation time. The `viewContainer` may be provided as a selector
+        string, DOM element, or a `Y.Node` instance (having the `viewContainer`
+        and the `container` be the same node is also supported).
+
+        The app's `render()` method will stamp the view container with the CSS
+        class `"yui3-app-views"` and append it to the app's `container` node if
+        it isn't already, and any `activeView` will be appended to this node if
+        it isn't already.
+
+        @attribute viewContainer
+        @type HTMLElement|Node|String
+        @default Y.Node.create(this.containerTemplate)
+        @initOnly
+        @since 3.5.0
+        **/
+        viewContainer: {
+            getter   : '_getViewContainer',
+            setter   : Y.one,
+            writeOnce: true
+        }
+    },
+
+    // TODO: Should these go on the `prototype`?
+    // TODO: These should also just go in a `CLASS_NAMES` object.
+
+    /**
+    CSS class added to an app's `container` node.
+
+    @property CSS_CLASS
+    @type String
+    @default "yui3-app"
+    @static
+    @since 3.5.0
+    **/
+    CSS_CLASS: getClassName('app'),
+
+    /**
+    CSS class added to an app's `viewContainer` node.
+
+    @property VIEWS_CSS_CLASS
+    @type String
+    @default "yui3-app-views"
+    @static
+    @since 3.5.0
+    **/
+    VIEWS_CSS_CLASS: getClassName('app', 'views'),
+
+    /**
+    Properties that shouldn't be turned into ad-hoc attributes when passed to
+    App's constructor.
+
+    @property _NON_ATTRS_CFG
+    @type Array
+    @static
+    @protected
+    @since 3.5.0
+    **/
+    _NON_ATTRS_CFG: ['views']
+});
+
+// -- Namespace ----------------------------------------------------------------
+Y.namespace('App').Base = App;
+
+/**
+Provides a top-level application component which manages navigation and views.
+
+This gives you a foundation and structure on which to build your application; it
+combines robust URL navigation with powerful routing and flexible view
+management.
+
+`Y.App` is both a namespace and constructor function. The `Y.App` class is
+special in that any `Y.App` class extensions that are included in the YUI
+instance will be **auto-mixed** on to the `Y.App` class. Consider this example:
+
+    YUI().use('app-base', 'app-transitions', function (Y) {
+        // This will create two YUI Apps, `basicApp` will not have transitions,
+        // but `fancyApp` will have transitions support included and turn it on.
+        var basicApp = new Y.App.Base(),
+            fancyApp = new Y.App({transitions: true});
+    });
+
+@class App
+@param {Object} [config] The following are configuration properties that can be
+    specified _in addition_ to default attribute values and the non-attribute
+    properties provided by `Y.Base`:
+  @param {Object} [config.views] Hash of view-name to metadata used to
+    declaratively describe an application's views and their relationship with
+    the app and other views. The views specified here will override any defaults
+    provided by the `views` object on the `prototype`.
+@constructor
+@extends App.Base
+@uses App.Transitions
+@since 3.5.0
+**/
+Y.App = Y.mix(Y.Base.create('app', Y.App.Base, []), Y.App, true);
+
+
+}, '3.5.1' ,{requires:['classnamemanager', 'pjax-base', 'router', 'view']});

=== added directory 'debian/extras/jslibs/yui/app-transitions'
=== added directory 'debian/extras/jslibs/yui/app-transitions-css'
=== added file 'debian/extras/jslibs/yui/app-transitions-css/app-transitions-css-min.css'
--- debian/extras/jslibs/yui/app-transitions-css/app-transitions-css-min.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/app-transitions-css/app-transitions-css-min.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-app-transitioning .yui3-app-views,.yui3-app-views.yui3-app-transitioning{overflow-x:hidden;position:relative;white-space:nowrap}.yui3-app-transitioning .yui3-app-views>*,.yui3-app-views.yui3-app-transitioning>*{display:inline-block;width:100%;vertical-align:top;white-space:normal;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#yui3-css-stamp.app-transitions-css{display:none}
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/app-transitions-css/app-transitions-css.css'
--- debian/extras/jslibs/yui/app-transitions-css/app-transitions-css.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/app-transitions-css/app-transitions-css.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,24 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-app-transitioning .yui3-app-views,
+.yui3-app-views.yui3-app-transitioning {
+    overflow-x: hidden;
+    position: relative;
+    white-space: nowrap;
+}
+.yui3-app-transitioning .yui3-app-views > *,
+.yui3-app-views.yui3-app-transitioning > * {
+    display: inline-block;
+    width: 100%;
+    vertical-align: top;
+    white-space: normal;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+}
+/* YUI CSS Detection Stamp */
+#yui3-css-stamp.app-transitions-css { display: none; }

=== added directory 'debian/extras/jslibs/yui/app-transitions-native'
=== added file 'debian/extras/jslibs/yui/app-transitions-native/app-transitions-native-debug.js'
--- debian/extras/jslibs/yui/app-transitions-native/app-transitions-native-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/app-transitions-native/app-transitions-native-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,358 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('app-transitions-native', function(Y) {
+
+/**
+Provides the implementation of view transitions for `Y.App.Transitions` in
+browsers which support native CSS3 transitions.
+
+@module app
+@submodule app-transitions-native
+@since 3.5.0
+**/
+
+var AppTransitions = Y.App.Transitions;
+
+/**
+Provides the implementation of view transitions for `Y.App.Transitions` in
+browsers which support native CSS3 transitions.
+
+When this module is used, `Y.App.TransitionsNative` will automatically mix
+itself in to `Y.App`.
+
+@class App.TransitionsNative
+@since 3.5.0
+**/
+function AppTransitionsNative() {}
+
+AppTransitionsNative.prototype = {
+    // -- Protected Properties -------------------------------------------------
+
+    /**
+    Whether this app is currently transitioning its `activeView`.
+
+    @property _transitioning
+    @type Boolean
+    @default false
+    @protected
+    @since 3.5.0
+    **/
+
+    /**
+    A queue that holds pending calls to this app's `_uiTransitionActiveView()`
+    method.
+
+    @property _viewTransitionQueue
+    @type Array
+    @default []
+    @protected
+    @since 3.5.0
+    **/
+
+    // -- Lifecycle Methods ----------------------------------------------------
+
+    initializer: function () {
+        this._transitioning       = false;
+        this._viewTransitionQueue = [];
+
+        // TODO: Consider the AOP approach that `Plugin.WidgetAnim` uses.
+        Y.Do.before(this._queueActiveView, this, '_uiSetActiveView');
+    },
+
+    // -- Protected Methods ----------------------------------------------------
+
+    /**
+    Dequeues any pending calls to `_uiTransitionActiveView()`.
+
+    **Note:** When there is more than one queued transition, only the most
+    recent `activeView` change will be visually transitioned, while the others
+    will have their `transition` option overridden to `false`.
+
+    @method _dequeueActiveView
+    @protected
+    @since 3.5.0
+    **/
+    _dequeueActiveView: function () {
+        var queue      = this._viewTransitionQueue,
+            transition = queue.shift(),
+            options;
+
+        if (transition) {
+            // When items are still left in the queue, override the transition
+            // so it does not run.
+            if (queue.length) {
+                // Overrides `transition` option and splices in the new options.
+                options = Y.merge(transition[2], {transition: false});
+                transition.splice(2, 1, options);
+            }
+
+            this._uiTransitionActiveView.apply(this, transition);
+        }
+    },
+
+    /**
+    Returns an object containing a named fx for both `viewIn` and `viewOut`
+    based on the relationship between the specified `newView` and `oldView`.
+
+    @method _getFx
+    @param {View} newView The view being transitioned-in.
+    @param {View} oldView The view being transitioned-out.
+    @param {String} [transition] The preferred transition to use.
+    @return {Object} An object containing a named fx for both `viewIn` and
+        `viewOut`.
+    @protected
+    @since 3.5.0
+    **/
+    _getFx: function (newView, oldView, transition) {
+        var fx          = AppTransitions.FX,
+            transitions = this.get('transitions');
+
+        if (transition === false || !transitions) {
+            return null;
+        }
+
+        if (transition) {
+            return fx[transition];
+        }
+
+        if (this._isChildView(newView, oldView)) {
+            return fx[transitions.toChild];
+        }
+
+        if (this._isParentView(newView, oldView)) {
+            return fx[transitions.toParent];
+        }
+
+        return fx[transitions.navigate];
+    },
+
+    /**
+    Queues calls to `_uiTransitionActiveView()` to make sure a currently running
+    transition isn't interrupted.
+
+    **Note:** This method prevents the default `_uiSetActiveView()` method from
+    running.
+
+    @method _queueActiveView
+    @protected
+    @since 3.5.0
+    **/
+    _queueActiveView: function () {
+        var args = Y.Array(arguments, 0, true);
+
+        this._viewTransitionQueue.push(args);
+
+        if (!this._transitioning) {
+            this._dequeueActiveView();
+        }
+
+        return new Y.Do.Prevent();
+    },
+
+    /**
+    Performs the actual change of this app's `activeView` by visually
+    transitioning between the `newView` and `oldView` using any specified
+    `options`.
+
+    The `newView` is attached to the app by rendering it to the `viewContainer`,
+    and making this app a bubble target of its events.
+
+    The `oldView` is detached from the app by removing it from the
+    `viewContainer`, and removing this app as a bubble target for its events.
+    The `oldView` will either be preserved or properly destroyed.
+
+    **Note:** This method overrides `_uiSetActiveView()` and provides all of its
+    functionality plus supports visual transitions. Also, the `activeView`
+    attribute is read-only and can be changed by calling the `showView()`
+    method.
+
+    @method _uiTransitionActiveView
+    @param {View} newView The View which is now this app's `activeView`.
+    @param {View} [oldView] The View which was this app's `activeView`.
+    @param {Object} [options] Optional object containing any of the following
+        properties:
+      @param {Function} [options.callback] Optional callback function to call
+        after new `activeView` is ready to use, the function will be passed:
+          @param {View} options.callback.view A reference to the new
+            `activeView`.
+      @param {Boolean} [options.prepend=false] Whether the `view` should be
+        prepended instead of appended to the `viewContainer`.
+      @param {Boolean} [options.render] Whether the `view` should be rendered.
+        **Note:** If no value is specified, a view instance will only be
+        rendered if it's newly created by this method.
+      @param {Boolean|String} [options.transition] Optional transition override.
+        A transition can be specified which will override the default, or
+        `false` for no transition.
+      @param {Boolean} [options.update=false] Whether an existing view should
+        have its attributes updated by passing the `config` object to its
+        `setAttrs()` method. **Note:** This option does not have an effect if
+        the `view` instance is created as a result of calling this method.
+    @protected
+    @since 3.5.0
+    **/
+    _uiTransitionActiveView: function (newView, oldView, options) {
+        options || (options = {});
+
+        var callback = options.callback,
+            container, transitioning, isChild, isParent, prepend,
+            fx, fxConfig, transitions;
+
+        // Quits early when to new and old views are the same.
+        if (newView === oldView) {
+            callback && callback.call(this, newView);
+
+            this._transitioning = false;
+            return this._dequeueActiveView();
+        }
+
+        fx       = this._getFx(newView, oldView, options.transition);
+        isChild  = this._isChildView(newView, oldView);
+        isParent = !isChild && this._isParentView(newView, oldView);
+        prepend  = !!options.prepend || isParent;
+
+        // Preforms simply attach/detach of the new and old view respectively
+        // when there's no transition to perform.
+        if (!fx) {
+            this._attachView(newView, prepend);
+            this._detachView(oldView);
+            callback && callback.call(this, newView);
+
+            this._transitioning = false;
+            return this._dequeueActiveView();
+        }
+
+        this._transitioning = true;
+
+        container     = this.get('container');
+        transitioning = AppTransitions.CLASS_NAMES.transitioning;
+
+        container.addClass(transitioning);
+
+        this._attachView(newView, prepend);
+
+        // Called when view transitions completed, if none were added this will
+        // run right away.
+        function complete() {
+            this._detachView(oldView);
+            container.removeClass(transitioning);
+            callback && callback.call(this, newView);
+
+            this._transitioning = false;
+            return this._dequeueActiveView();
+        }
+
+        // Setup a new stack to run the view transitions in parallel.
+        transitions = new Y.Parallel({context: this});
+        fxConfig    = {
+            crossView: !!oldView && !!newView,
+            prepended: prepend
+        };
+
+        // Transition the new view first to prevent a gap when sliding.
+        if (newView && fx.viewIn) {
+            newView.get('container')
+                .transition(fx.viewIn, fxConfig, transitions.add());
+        }
+
+        if (oldView && fx.viewOut) {
+            oldView.get('container')
+                .transition(fx.viewOut, fxConfig, transitions.add());
+        }
+
+        transitions.done(complete);
+    }
+};
+
+// -- Transition fx ------------------------------------------------------------
+Y.mix(Y.Transition.fx, {
+    'app:fadeIn': {
+        opacity : 1,
+        duration: 0.3,
+
+        on: {
+            start: function (data) {
+                var styles = {opacity: 0},
+                    config = data.config;
+
+                if (config.crossView && !config.prepended) {
+                    styles.transform = 'translateX(-100%)';
+                }
+
+                this.setStyles(styles);
+            },
+
+            end: function () {
+                this.setStyle('transform', 'translateX(0)');
+            }
+        }
+    },
+
+    'app:fadeOut': {
+        opacity : 0,
+        duration: 0.3,
+
+        on: {
+            start: function (data) {
+                var styles = {opacity: 1},
+                    config = data.config;
+
+                if (config.crossView && config.prepended) {
+                    styles.transform = 'translateX(-100%)';
+                }
+
+                this.setStyles(styles);
+            },
+
+            end: function () {
+                this.setStyle('transform', 'translateX(0)');
+            }
+        }
+    },
+
+    'app:slideLeft': {
+        duration : 0.3,
+        transform: 'translateX(-100%)',
+
+        on: {
+            start: function () {
+                this.setStyles({
+                    opacity  : 1,
+                    transform: 'translateX(0%)'
+                });
+            },
+
+            end: function () {
+                this.setStyle('transform', 'translateX(0)');
+            }
+        }
+    },
+
+    'app:slideRight': {
+        duration : 0.3,
+        transform: 'translateX(0)',
+
+        on: {
+            start: function () {
+                this.setStyles({
+                    opacity  : 1,
+                    transform: 'translateX(-100%)'
+                });
+            },
+
+            end: function () {
+                this.setStyle('transform', 'translateX(0)');
+            }
+        }
+    }
+});
+
+// -- Namespacae ---------------------------------------------------------------
+Y.App.TransitionsNative = AppTransitionsNative;
+Y.Base.mix(Y.App, [AppTransitionsNative]);
+
+
+}, '3.5.1' ,{requires:['app-transitions', 'app-transitions-css', 'parallel', 'transition']});

=== added file 'debian/extras/jslibs/yui/app-transitions-native/app-transitions-native-min.js'
--- debian/extras/jslibs/yui/app-transitions-native/app-transitions-native-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/app-transitions-native/app-transitions-native-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("app-transitions-native",function(c){var a=c.App.Transitions;function b(){}b.prototype={initializer:function(){this._transitioning=false;this._viewTransitionQueue=[];c.Do.before(this._queueActiveView,this,"_uiSetActiveView");},_dequeueActiveView:function(){var d=this._viewTransitionQueue,f=d.shift(),e;if(f){if(d.length){e=c.merge(f[2],{transition:false});f.splice(2,1,e);}this._uiTransitionActiveView.apply(this,f);}},_getFx:function(h,d,g){var e=a.FX,f=this.get("transitions");if(g===false||!f){return null;}if(g){return e[g];}if(this._isChildView(h,d)){return e[f.toChild];}if(this._isParentView(h,d)){return e[f.toParent];}return e[f.navigate];},_queueActiveView:function(){var d=c.Array(arguments,0,true);this._viewTransitionQueue.push(d);if(!this._transitioning){this._dequeueActiveView();}return new c.Do.Prevent();},_uiTransitionActiveView:function(i,l,p){p||(p={});var n=p.callback,d,m,e,j,o,h,g,k;if(i===l){n&&n.call(this,i);this._transitioning=false;return this._dequeueActiveView();}h=this._getFx(i,l,p.transition);e=this._isChildView(i,l);j=!e&&this._isParentView(i,l);o=!!p.prepend||j;if(!h){this._attachView(i,o);this._detachView(l);n&&n.call(this,i);this._transitioning=false;return this._dequeueActiveView();}this._transitioning=true;d=this.get("container");m=a.CLASS_NAMES.transitioning;d.addClass(m);this._attachView(i,o);function f(){this._detachView(l);d.removeClass(m);n&&n.call(this,i);this._transitioning=false;return this._dequeueActiveView();}k=new c.Parallel({context:this});g={crossView:!!l&&!!i,prepended:o};if(i&&h.viewIn){i.get("container").transition(h.viewIn,g,k.add());}if(l&&h.viewOut){l.get("container").transition(h.viewOut,g,k.add());}k.done(f);}};c.mix(c.Transition.fx,{"app:fadeIn":{opacity:1,duration:0.3,on:{start:function(f){var e={opacity:0},d=f.config;if(d.crossView&&!d.prepended){e.transform="translateX(-100%)";}this.setStyles(e);},end:function(){this.setStyle("transform","translateX(0)");}}},"app:fadeOut":{opacity:0,duration:0.3,on:{start:function(f){var e={opacity:1},d=f.config;if(d.crossView&&d.prepended){e.transform="translateX(-100%)";}this.setStyles(e);},end:function(){this.setStyle("transform","translateX(0)");}}},"app:slideLeft":{duration:0.3,transform:"translateX(-100%)",on:{start:function(){this.setStyles({opacity:1,transform:"translateX(0%)"});},end:function(){this.setStyle("transform","translateX(0)");}}},"app:slideRight":{duration:0.3,transform:"translateX(0)",on:{start:function(){this.setStyles({opacity:1,transform:"translateX(-100%)"});},end:function(){this.setStyle("transform","translateX(0)");}}}});c.App.TransitionsNative=b;c.Base.mix(c.App,[b]);},"3.5.1",{requires:["app-transitions","app-transitions-css","parallel","transition"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/app-transitions-native/app-transitions-native.js'
--- debian/extras/jslibs/yui/app-transitions-native/app-transitions-native.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/app-transitions-native/app-transitions-native.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,358 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('app-transitions-native', function(Y) {
+
+/**
+Provides the implementation of view transitions for `Y.App.Transitions` in
+browsers which support native CSS3 transitions.
+
+@module app
+@submodule app-transitions-native
+@since 3.5.0
+**/
+
+var AppTransitions = Y.App.Transitions;
+
+/**
+Provides the implementation of view transitions for `Y.App.Transitions` in
+browsers which support native CSS3 transitions.
+
+When this module is used, `Y.App.TransitionsNative` will automatically mix
+itself in to `Y.App`.
+
+@class App.TransitionsNative
+@since 3.5.0
+**/
+function AppTransitionsNative() {}
+
+AppTransitionsNative.prototype = {
+    // -- Protected Properties -------------------------------------------------
+
+    /**
+    Whether this app is currently transitioning its `activeView`.
+
+    @property _transitioning
+    @type Boolean
+    @default false
+    @protected
+    @since 3.5.0
+    **/
+
+    /**
+    A queue that holds pending calls to this app's `_uiTransitionActiveView()`
+    method.
+
+    @property _viewTransitionQueue
+    @type Array
+    @default []
+    @protected
+    @since 3.5.0
+    **/
+
+    // -- Lifecycle Methods ----------------------------------------------------
+
+    initializer: function () {
+        this._transitioning       = false;
+        this._viewTransitionQueue = [];
+
+        // TODO: Consider the AOP approach that `Plugin.WidgetAnim` uses.
+        Y.Do.before(this._queueActiveView, this, '_uiSetActiveView');
+    },
+
+    // -- Protected Methods ----------------------------------------------------
+
+    /**
+    Dequeues any pending calls to `_uiTransitionActiveView()`.
+
+    **Note:** When there is more than one queued transition, only the most
+    recent `activeView` change will be visually transitioned, while the others
+    will have their `transition` option overridden to `false`.
+
+    @method _dequeueActiveView
+    @protected
+    @since 3.5.0
+    **/
+    _dequeueActiveView: function () {
+        var queue      = this._viewTransitionQueue,
+            transition = queue.shift(),
+            options;
+
+        if (transition) {
+            // When items are still left in the queue, override the transition
+            // so it does not run.
+            if (queue.length) {
+                // Overrides `transition` option and splices in the new options.
+                options = Y.merge(transition[2], {transition: false});
+                transition.splice(2, 1, options);
+            }
+
+            this._uiTransitionActiveView.apply(this, transition);
+        }
+    },
+
+    /**
+    Returns an object containing a named fx for both `viewIn` and `viewOut`
+    based on the relationship between the specified `newView` and `oldView`.
+
+    @method _getFx
+    @param {View} newView The view being transitioned-in.
+    @param {View} oldView The view being transitioned-out.
+    @param {String} [transition] The preferred transition to use.
+    @return {Object} An object containing a named fx for both `viewIn` and
+        `viewOut`.
+    @protected
+    @since 3.5.0
+    **/
+    _getFx: function (newView, oldView, transition) {
+        var fx          = AppTransitions.FX,
+            transitions = this.get('transitions');
+
+        if (transition === false || !transitions) {
+            return null;
+        }
+
+        if (transition) {
+            return fx[transition];
+        }
+
+        if (this._isChildView(newView, oldView)) {
+            return fx[transitions.toChild];
+        }
+
+        if (this._isParentView(newView, oldView)) {
+            return fx[transitions.toParent];
+        }
+
+        return fx[transitions.navigate];
+    },
+
+    /**
+    Queues calls to `_uiTransitionActiveView()` to make sure a currently running
+    transition isn't interrupted.
+
+    **Note:** This method prevents the default `_uiSetActiveView()` method from
+    running.
+
+    @method _queueActiveView
+    @protected
+    @since 3.5.0
+    **/
+    _queueActiveView: function () {
+        var args = Y.Array(arguments, 0, true);
+
+        this._viewTransitionQueue.push(args);
+
+        if (!this._transitioning) {
+            this._dequeueActiveView();
+        }
+
+        return new Y.Do.Prevent();
+    },
+
+    /**
+    Performs the actual change of this app's `activeView` by visually
+    transitioning between the `newView` and `oldView` using any specified
+    `options`.
+
+    The `newView` is attached to the app by rendering it to the `viewContainer`,
+    and making this app a bubble target of its events.
+
+    The `oldView` is detached from the app by removing it from the
+    `viewContainer`, and removing this app as a bubble target for its events.
+    The `oldView` will either be preserved or properly destroyed.
+
+    **Note:** This method overrides `_uiSetActiveView()` and provides all of its
+    functionality plus supports visual transitions. Also, the `activeView`
+    attribute is read-only and can be changed by calling the `showView()`
+    method.
+
+    @method _uiTransitionActiveView
+    @param {View} newView The View which is now this app's `activeView`.
+    @param {View} [oldView] The View which was this app's `activeView`.
+    @param {Object} [options] Optional object containing any of the following
+        properties:
+      @param {Function} [options.callback] Optional callback function to call
+        after new `activeView` is ready to use, the function will be passed:
+          @param {View} options.callback.view A reference to the new
+            `activeView`.
+      @param {Boolean} [options.prepend=false] Whether the `view` should be
+        prepended instead of appended to the `viewContainer`.
+      @param {Boolean} [options.render] Whether the `view` should be rendered.
+        **Note:** If no value is specified, a view instance will only be
+        rendered if it's newly created by this method.
+      @param {Boolean|String} [options.transition] Optional transition override.
+        A transition can be specified which will override the default, or
+        `false` for no transition.
+      @param {Boolean} [options.update=false] Whether an existing view should
+        have its attributes updated by passing the `config` object to its
+        `setAttrs()` method. **Note:** This option does not have an effect if
+        the `view` instance is created as a result of calling this method.
+    @protected
+    @since 3.5.0
+    **/
+    _uiTransitionActiveView: function (newView, oldView, options) {
+        options || (options = {});
+
+        var callback = options.callback,
+            container, transitioning, isChild, isParent, prepend,
+            fx, fxConfig, transitions;
+
+        // Quits early when to new and old views are the same.
+        if (newView === oldView) {
+            callback && callback.call(this, newView);
+
+            this._transitioning = false;
+            return this._dequeueActiveView();
+        }
+
+        fx       = this._getFx(newView, oldView, options.transition);
+        isChild  = this._isChildView(newView, oldView);
+        isParent = !isChild && this._isParentView(newView, oldView);
+        prepend  = !!options.prepend || isParent;
+
+        // Preforms simply attach/detach of the new and old view respectively
+        // when there's no transition to perform.
+        if (!fx) {
+            this._attachView(newView, prepend);
+            this._detachView(oldView);
+            callback && callback.call(this, newView);
+
+            this._transitioning = false;
+            return this._dequeueActiveView();
+        }
+
+        this._transitioning = true;
+
+        container     = this.get('container');
+        transitioning = AppTransitions.CLASS_NAMES.transitioning;
+
+        container.addClass(transitioning);
+
+        this._attachView(newView, prepend);
+
+        // Called when view transitions completed, if none were added this will
+        // run right away.
+        function complete() {
+            this._detachView(oldView);
+            container.removeClass(transitioning);
+            callback && callback.call(this, newView);
+
+            this._transitioning = false;
+            return this._dequeueActiveView();
+        }
+
+        // Setup a new stack to run the view transitions in parallel.
+        transitions = new Y.Parallel({context: this});
+        fxConfig    = {
+            crossView: !!oldView && !!newView,
+            prepended: prepend
+        };
+
+        // Transition the new view first to prevent a gap when sliding.
+        if (newView && fx.viewIn) {
+            newView.get('container')
+                .transition(fx.viewIn, fxConfig, transitions.add());
+        }
+
+        if (oldView && fx.viewOut) {
+            oldView.get('container')
+                .transition(fx.viewOut, fxConfig, transitions.add());
+        }
+
+        transitions.done(complete);
+    }
+};
+
+// -- Transition fx ------------------------------------------------------------
+Y.mix(Y.Transition.fx, {
+    'app:fadeIn': {
+        opacity : 1,
+        duration: 0.3,
+
+        on: {
+            start: function (data) {
+                var styles = {opacity: 0},
+                    config = data.config;
+
+                if (config.crossView && !config.prepended) {
+                    styles.transform = 'translateX(-100%)';
+                }
+
+                this.setStyles(styles);
+            },
+
+            end: function () {
+                this.setStyle('transform', 'translateX(0)');
+            }
+        }
+    },
+
+    'app:fadeOut': {
+        opacity : 0,
+        duration: 0.3,
+
+        on: {
+            start: function (data) {
+                var styles = {opacity: 1},
+                    config = data.config;
+
+                if (config.crossView && config.prepended) {
+                    styles.transform = 'translateX(-100%)';
+                }
+
+                this.setStyles(styles);
+            },
+
+            end: function () {
+                this.setStyle('transform', 'translateX(0)');
+            }
+        }
+    },
+
+    'app:slideLeft': {
+        duration : 0.3,
+        transform: 'translateX(-100%)',
+
+        on: {
+            start: function () {
+                this.setStyles({
+                    opacity  : 1,
+                    transform: 'translateX(0%)'
+                });
+            },
+
+            end: function () {
+                this.setStyle('transform', 'translateX(0)');
+            }
+        }
+    },
+
+    'app:slideRight': {
+        duration : 0.3,
+        transform: 'translateX(0)',
+
+        on: {
+            start: function () {
+                this.setStyles({
+                    opacity  : 1,
+                    transform: 'translateX(-100%)'
+                });
+            },
+
+            end: function () {
+                this.setStyle('transform', 'translateX(0)');
+            }
+        }
+    }
+});
+
+// -- Namespacae ---------------------------------------------------------------
+Y.App.TransitionsNative = AppTransitionsNative;
+Y.Base.mix(Y.App, [AppTransitionsNative]);
+
+
+}, '3.5.1' ,{requires:['app-transitions', 'app-transitions-css', 'parallel', 'transition']});

=== added file 'debian/extras/jslibs/yui/app-transitions/app-transitions-debug.js'
--- debian/extras/jslibs/yui/app-transitions/app-transitions-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/app-transitions/app-transitions-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,257 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('app-transitions', function(Y) {
+
+/**
+Provides view transitions for `Y.App` in browsers which support native CSS3
+transitions.
+
+@module app
+@submodule app-transitions
+@since 3.5.0
+**/
+
+/**
+Provides view transitions for `Y.App` in browsers which support native CSS3
+transitions.
+
+View transitions provide an nice way to move from one "page" to the next that is
+both pleasant to the user and helps to communicate a hierarchy between sections
+of an application.
+
+When this module is used, it will automatically mix itself in to `Y.App` and
+transition between `activeView` changes using the following effects:
+
+  * **`fade`**: Cross-fades between the old an new active views.
+
+  * **`slideLeft`**: The old and new active views are positioned next to each
+    other and both slide to the left.
+
+  * **`slideRight`**: The old and new active views are positioned next to each
+    other and both slide to the right.
+
+**Note:** Transitions are an opt-in feature and are enabled via an app's
+`transitions` attribute.
+
+@class App.Transitions
+@uses App.TransitionsNative
+@since 3.5.0
+**/
+function AppTransitions() {}
+
+AppTransitions.ATTRS = {
+    /**
+    Whether or not this application should use view transitions, and if so then
+    which ones or `true` for the defaults which are specified by the
+    `transitions` prototype property.
+
+    **Note:** Transitions are an opt-in feature and will only be used in
+    browsers which support native CSS3 transitions.
+
+    @attribute transitions
+    @type Boolean|Object
+    @default false
+    @since 3.5.0
+    **/
+    transitions: {
+        setter: '_setTransitions',
+        value : false
+    }
+};
+
+/**
+CSS classes used by `App.Transitions`.
+
+When an app is transitioning between `activeView`s, its `container` node will
+have the "yui3-app-transitioning" CSS class added.
+
+@property CLASS_NAMES
+@type Object
+@static
+@since 3.5.0
+**/
+AppTransitions.CLASS_NAMES = {
+    transitioning: Y.ClassNameManager.getClassName('app', 'transitioning')
+};
+
+/**
+Collect of transitions -> fx.
+
+A transition (e.g. "fade") is a simple name given to a configuration of fx to
+apply, consisting of `viewIn` and `viewOut` properties who's values are names of
+fx registered on `Y.Transition.fx`.
+
+By default transitions: `fade`, `slideLeft`, and `slideRight` have fx defined.
+
+@property FX
+@type Object
+@static
+@since 3.5.0
+**/
+AppTransitions.FX = {
+    fade: {
+        viewIn : 'app:fadeIn',
+        viewOut: 'app:fadeOut'
+    },
+
+    slideLeft: {
+        viewIn : 'app:slideLeft',
+        viewOut: 'app:slideLeft'
+    },
+
+    slideRight: {
+        viewIn : 'app:slideRight',
+        viewOut: 'app:slideRight'
+    }
+};
+
+AppTransitions.prototype = {
+    // -- Public Properties ----------------------------------------------------
+
+    /**
+    Default transitions to use when the `activeView` changes.
+
+    The following are types of changes for which transitions can be defined that
+    correspond to the relationship between the new and previous `activeView`:
+
+      * `navigate`: The default transition to use when changing the `activeView`
+        of the application.
+
+      * `toChild`: The transition to use when the new `activeView` is configured
+        as a child of the previously active view via its `parent` property as
+        defined in this app's `views`.
+
+      * `toParent`: The transition to use when the new `activeView` is
+        configured as the `parent` of the previously active view as defined in
+        this app's `views`.
+
+    **Note:** Transitions are an opt-in feature and will only be used in
+    browsers which support native CSS3 transitions.
+
+    @property transitions
+    @type Object
+    @default
+        {
+            navigate: 'fade',
+            toChild : 'slideLeft',
+            toParent: 'slideRight'
+        }
+    @since 3.5.0
+    **/
+    transitions: {
+        navigate: 'fade',
+        toChild : 'slideLeft',
+        toParent: 'slideRight'
+    },
+
+    // -- Public Methods -------------------------------------------------------
+
+    /**
+    Sets which view is active/visible for the application. This will set the
+    app's `activeView` attribute to the specified `view`.
+
+    The `view` will be "attached" to this app, meaning it will be both rendered
+    into this app's `viewContainer` node and all of its events will bubble to
+    the app. The previous `activeView` will be "detached" from this app.
+
+    When a string-name is provided for a view which has been registered on this
+    app's `views` object, the referenced metadata will be used and the
+    `activeView` will be set to either a preserved view instance, or a new
+    instance of the registered view will be created using the specified `config`
+    object passed-into this method.
+
+    A callback function can be specified as either the third or fourth argument,
+    and this function will be called after the new `view` becomes the
+    `activeView`, is rendered to the `viewContainer`, and is ready to use.
+
+    @example
+        var app = new Y.App({
+            views: {
+                usersView: {
+                    // Imagine that `Y.UsersView` has been defined.
+                    type: Y.UsersView
+                }
+            },
+
+            transitions: true,
+            users      : new Y.ModelList()
+        });
+
+        app.route('/users/', function () {
+            this.showView('usersView', {users: this.get('users')});
+        });
+
+        app.render();
+        app.navigate('/uses/');
+        // => Creates a new `Y.UsersView` and transitions to it.
+
+    @method showView
+    @param {String|View} view The name of a view defined in the `views` object,
+        or a view instance which should become this app's `activeView`.
+    @param {Object} [config] Optional configuration to use when creating a new
+        view instance. This config object can also be used to update an existing
+        or preserved view's attributes when `options.update` is `true`.
+    @param {Object} [options] Optional object containing any of the following
+        properties:
+      @param {Function} [options.callback] Optional callback function to call
+        after new `activeView` is ready to use, the function will be passed:
+          @param {View} options.callback.view A reference to the new
+            `activeView`.
+      @param {Boolean} [options.prepend=false] Whether the `view` should be
+        prepended instead of appended to the `viewContainer`.
+      @param {Boolean} [options.render] Whether the `view` should be rendered.
+        **Note:** If no value is specified, a view instance will only be
+        rendered if it's newly created by this method.
+      @param {Boolean|String} [options.transition] Optional transition override.
+        A transition can be specified which will override the default, or
+        `false` for no transition.
+      @param {Boolean} [options.update=false] Whether an existing view should
+        have its attributes updated by passing the `config` object to its
+        `setAttrs()` method. **Note:** This option does not have an effect if
+        the `view` instance is created as a result of calling this method.
+    @param {Function} [callback] Optional callback Function to call after the
+        new `activeView` is ready to use. **Note:** this will override
+        `options.callback` and it can be specified as either the third or fourth
+        argument. The function will be passed the following:
+      @param {View} callback.view A reference to the new `activeView`.
+    @chainable
+    @since 3.5.0
+    **/
+    // Does not override `showView()` but does use `options.transitions`.
+
+    // -- Protected Methods ----------------------------------------------------
+
+    /**
+    Setter for `transitions` attribute.
+
+    When specified as `true`, the defaults will be use as specified by the
+    `transitions` prototype property.
+
+    @method _setTransitions
+    @param {Boolean|Object} transitions The new `transitions` attribute value.
+    @return {Mixed} The processed value which represents the new state.
+    @protected
+    @see App.Base.showView()
+    @since 3.5.0
+    **/
+    _setTransitions: function (transitions) {
+        var defTransitions = this.transitions;
+
+        if (transitions && transitions === true) {
+            return Y.merge(defTransitions);
+        }
+
+        return transitions;
+    }
+};
+
+// -- Namespace ----------------------------------------------------------------
+Y.App.Transitions = AppTransitions;
+Y.Base.mix(Y.App, [AppTransitions]);
+
+
+}, '3.5.1' ,{requires:['app-base']});

=== added file 'debian/extras/jslibs/yui/app-transitions/app-transitions-min.js'
--- debian/extras/jslibs/yui/app-transitions/app-transitions-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/app-transitions/app-transitions-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("app-transitions",function(b){function a(){}a.ATTRS={transitions:{setter:"_setTransitions",value:false}};a.CLASS_NAMES={transitioning:b.ClassNameManager.getClassName("app","transitioning")};a.FX={fade:{viewIn:"app:fadeIn",viewOut:"app:fadeOut"},slideLeft:{viewIn:"app:slideLeft",viewOut:"app:slideLeft"},slideRight:{viewIn:"app:slideRight",viewOut:"app:slideRight"}};a.prototype={transitions:{navigate:"fade",toChild:"slideLeft",toParent:"slideRight"},_setTransitions:function(d){var c=this.transitions;if(d&&d===true){return b.merge(c);}return d;}};b.App.Transitions=a;b.Base.mix(b.App,[a]);},"3.5.1",{requires:["app-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/app-transitions/app-transitions.js'
--- debian/extras/jslibs/yui/app-transitions/app-transitions.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/app-transitions/app-transitions.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,257 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('app-transitions', function(Y) {
+
+/**
+Provides view transitions for `Y.App` in browsers which support native CSS3
+transitions.
+
+@module app
+@submodule app-transitions
+@since 3.5.0
+**/
+
+/**
+Provides view transitions for `Y.App` in browsers which support native CSS3
+transitions.
+
+View transitions provide an nice way to move from one "page" to the next that is
+both pleasant to the user and helps to communicate a hierarchy between sections
+of an application.
+
+When this module is used, it will automatically mix itself in to `Y.App` and
+transition between `activeView` changes using the following effects:
+
+  * **`fade`**: Cross-fades between the old an new active views.
+
+  * **`slideLeft`**: The old and new active views are positioned next to each
+    other and both slide to the left.
+
+  * **`slideRight`**: The old and new active views are positioned next to each
+    other and both slide to the right.
+
+**Note:** Transitions are an opt-in feature and are enabled via an app's
+`transitions` attribute.
+
+@class App.Transitions
+@uses App.TransitionsNative
+@since 3.5.0
+**/
+function AppTransitions() {}
+
+AppTransitions.ATTRS = {
+    /**
+    Whether or not this application should use view transitions, and if so then
+    which ones or `true` for the defaults which are specified by the
+    `transitions` prototype property.
+
+    **Note:** Transitions are an opt-in feature and will only be used in
+    browsers which support native CSS3 transitions.
+
+    @attribute transitions
+    @type Boolean|Object
+    @default false
+    @since 3.5.0
+    **/
+    transitions: {
+        setter: '_setTransitions',
+        value : false
+    }
+};
+
+/**
+CSS classes used by `App.Transitions`.
+
+When an app is transitioning between `activeView`s, its `container` node will
+have the "yui3-app-transitioning" CSS class added.
+
+@property CLASS_NAMES
+@type Object
+@static
+@since 3.5.0
+**/
+AppTransitions.CLASS_NAMES = {
+    transitioning: Y.ClassNameManager.getClassName('app', 'transitioning')
+};
+
+/**
+Collect of transitions -> fx.
+
+A transition (e.g. "fade") is a simple name given to a configuration of fx to
+apply, consisting of `viewIn` and `viewOut` properties who's values are names of
+fx registered on `Y.Transition.fx`.
+
+By default transitions: `fade`, `slideLeft`, and `slideRight` have fx defined.
+
+@property FX
+@type Object
+@static
+@since 3.5.0
+**/
+AppTransitions.FX = {
+    fade: {
+        viewIn : 'app:fadeIn',
+        viewOut: 'app:fadeOut'
+    },
+
+    slideLeft: {
+        viewIn : 'app:slideLeft',
+        viewOut: 'app:slideLeft'
+    },
+
+    slideRight: {
+        viewIn : 'app:slideRight',
+        viewOut: 'app:slideRight'
+    }
+};
+
+AppTransitions.prototype = {
+    // -- Public Properties ----------------------------------------------------
+
+    /**
+    Default transitions to use when the `activeView` changes.
+
+    The following are types of changes for which transitions can be defined that
+    correspond to the relationship between the new and previous `activeView`:
+
+      * `navigate`: The default transition to use when changing the `activeView`
+        of the application.
+
+      * `toChild`: The transition to use when the new `activeView` is configured
+        as a child of the previously active view via its `parent` property as
+        defined in this app's `views`.
+
+      * `toParent`: The transition to use when the new `activeView` is
+        configured as the `parent` of the previously active view as defined in
+        this app's `views`.
+
+    **Note:** Transitions are an opt-in feature and will only be used in
+    browsers which support native CSS3 transitions.
+
+    @property transitions
+    @type Object
+    @default
+        {
+            navigate: 'fade',
+            toChild : 'slideLeft',
+            toParent: 'slideRight'
+        }
+    @since 3.5.0
+    **/
+    transitions: {
+        navigate: 'fade',
+        toChild : 'slideLeft',
+        toParent: 'slideRight'
+    },
+
+    // -- Public Methods -------------------------------------------------------
+
+    /**
+    Sets which view is active/visible for the application. This will set the
+    app's `activeView` attribute to the specified `view`.
+
+    The `view` will be "attached" to this app, meaning it will be both rendered
+    into this app's `viewContainer` node and all of its events will bubble to
+    the app. The previous `activeView` will be "detached" from this app.
+
+    When a string-name is provided for a view which has been registered on this
+    app's `views` object, the referenced metadata will be used and the
+    `activeView` will be set to either a preserved view instance, or a new
+    instance of the registered view will be created using the specified `config`
+    object passed-into this method.
+
+    A callback function can be specified as either the third or fourth argument,
+    and this function will be called after the new `view` becomes the
+    `activeView`, is rendered to the `viewContainer`, and is ready to use.
+
+    @example
+        var app = new Y.App({
+            views: {
+                usersView: {
+                    // Imagine that `Y.UsersView` has been defined.
+                    type: Y.UsersView
+                }
+            },
+
+            transitions: true,
+            users      : new Y.ModelList()
+        });
+
+        app.route('/users/', function () {
+            this.showView('usersView', {users: this.get('users')});
+        });
+
+        app.render();
+        app.navigate('/uses/');
+        // => Creates a new `Y.UsersView` and transitions to it.
+
+    @method showView
+    @param {String|View} view The name of a view defined in the `views` object,
+        or a view instance which should become this app's `activeView`.
+    @param {Object} [config] Optional configuration to use when creating a new
+        view instance. This config object can also be used to update an existing
+        or preserved view's attributes when `options.update` is `true`.
+    @param {Object} [options] Optional object containing any of the following
+        properties:
+      @param {Function} [options.callback] Optional callback function to call
+        after new `activeView` is ready to use, the function will be passed:
+          @param {View} options.callback.view A reference to the new
+            `activeView`.
+      @param {Boolean} [options.prepend=false] Whether the `view` should be
+        prepended instead of appended to the `viewContainer`.
+      @param {Boolean} [options.render] Whether the `view` should be rendered.
+        **Note:** If no value is specified, a view instance will only be
+        rendered if it's newly created by this method.
+      @param {Boolean|String} [options.transition] Optional transition override.
+        A transition can be specified which will override the default, or
+        `false` for no transition.
+      @param {Boolean} [options.update=false] Whether an existing view should
+        have its attributes updated by passing the `config` object to its
+        `setAttrs()` method. **Note:** This option does not have an effect if
+        the `view` instance is created as a result of calling this method.
+    @param {Function} [callback] Optional callback Function to call after the
+        new `activeView` is ready to use. **Note:** this will override
+        `options.callback` and it can be specified as either the third or fourth
+        argument. The function will be passed the following:
+      @param {View} callback.view A reference to the new `activeView`.
+    @chainable
+    @since 3.5.0
+    **/
+    // Does not override `showView()` but does use `options.transitions`.
+
+    // -- Protected Methods ----------------------------------------------------
+
+    /**
+    Setter for `transitions` attribute.
+
+    When specified as `true`, the defaults will be use as specified by the
+    `transitions` prototype property.
+
+    @method _setTransitions
+    @param {Boolean|Object} transitions The new `transitions` attribute value.
+    @return {Mixed} The processed value which represents the new state.
+    @protected
+    @see App.Base.showView()
+    @since 3.5.0
+    **/
+    _setTransitions: function (transitions) {
+        var defTransitions = this.transitions;
+
+        if (transitions && transitions === true) {
+            return Y.merge(defTransitions);
+        }
+
+        return transitions;
+    }
+};
+
+// -- Namespace ----------------------------------------------------------------
+Y.App.Transitions = AppTransitions;
+Y.Base.mix(Y.App, [AppTransitions]);
+
+
+}, '3.5.1' ,{requires:['app-base']});

=== added directory 'debian/extras/jslibs/yui/array-extras'
=== added file 'debian/extras/jslibs/yui/array-extras/array-extras-debug.js'
--- debian/extras/jslibs/yui/array-extras/array-extras-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/array-extras/array-extras-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,367 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('array-extras', function(Y) {
+
+/**
+Adds additional utility methods to the `Y.Array` class.
+
+@module collection
+@submodule array-extras
+**/
+
+var A          = Y.Array,
+    L          = Y.Lang,
+    ArrayProto = Array.prototype;
+
+/**
+Returns the index of the last item in the array that contains the specified
+value, or `-1` if the value isn't found.
+
+@method lastIndexOf
+@param {Array} a Array to search in.
+@param {Any} val Value to search for.
+@param {Number} [fromIndex] Index at which to start searching backwards.
+  Defaults to the array's length - 1. If negative, it will be taken as an offset
+  from the end of the array. If the calculated index is less than 0, the array
+  will not be searched and `-1` will be returned.
+@return {Number} Index of the item that contains the value, or `-1` if not
+  found.
+@static
+@for Array
+**/
+A.lastIndexOf = L._isNative(ArrayProto.lastIndexOf) ?
+    function(a, val, fromIndex) {
+        // An undefined fromIndex is still considered a value by some (all?)
+        // native implementations, so we can't pass it unless it's actually
+        // specified.
+        return fromIndex || fromIndex === 0 ? a.lastIndexOf(val, fromIndex) :
+                a.lastIndexOf(val);
+    } :
+    function(a, val, fromIndex) {
+        var len = a.length,
+            i   = len - 1;
+
+        if (fromIndex || fromIndex === 0) {
+            i = Math.min(fromIndex < 0 ? len + fromIndex : fromIndex, len);
+        }
+
+        if (i > -1 && len > 0) {
+            for (; i > -1; --i) {
+                if (i in a && a[i] === val) {
+                    return i;
+                }
+            }
+        }
+
+        return -1;
+    };
+
+/**
+Returns a copy of the specified array with duplicate items removed.
+
+@method unique
+@param {Array} a Array to dedupe.
+@return {Array} Copy of the array with duplicate items removed.
+@static
+**/
+A.unique = function(a, sort) {
+    // Note: the sort param is deprecated and intentionally undocumented since
+    // YUI 3.3.0. It never did what the API docs said it did (see the older
+    // comment below as well).
+    var i       = 0,
+        len     = a.length,
+        results = [],
+        item, j;
+
+    for (; i < len; ++i) {
+        item = a[i];
+
+        // This loop iterates over the results array in reverse order and stops
+        // if it finds an item that matches the current input array item (a
+        // dupe). If it makes it all the way through without finding a dupe, the
+        // current item is pushed onto the results array.
+        for (j = results.length; j > -1; --j) {
+            if (item === results[j]) {
+                break;
+            }
+        }
+
+        if (j === -1) {
+            results.push(item);
+        }
+    }
+
+    // Note: the sort option doesn't really belong here... I think it was added
+    // because there was a way to fast path the two operations together.  That
+    // implementation was not working, so I replaced it with the following.
+    // Leaving it in so that the API doesn't get broken.
+    if (sort) {
+        Y.log('The sort parameter is deprecated and will be removed in a future version of YUI.', 'warn', 'deprecated');
+
+        if (L.isNumber(results[0])) {
+            results.sort(A.numericSort);
+        } else {
+            results.sort();
+        }
+    }
+
+    return results;
+};
+
+/**
+Executes the supplied function on each item in the array. Returns a new array
+containing the items for which the supplied function returned a truthy value.
+
+@method filter
+@param {Array} a Array to filter.
+@param {Function} f Function to execute on each item.
+@param {Object} [o] Optional context object.
+@return {Array} Array of items for which the supplied function returned a
+  truthy value (empty if it never returned a truthy value).
+@static
+*/
+A.filter = L._isNative(ArrayProto.filter) ?
+    function(a, f, o) {
+        return a.filter(f, o);
+    } :
+    function(a, f, o) {
+        var i       = 0,
+            len     = a.length,
+            results = [],
+            item;
+
+        for (; i < len; ++i) {
+            if (i in a) {
+                item = a[i];
+
+                if (f.call(o, item, i, a)) {
+                    results.push(item);
+                }
+            }
+        }
+
+        return results;
+    };
+
+/**
+The inverse of `Array.filter()`. Executes the supplied function on each item.
+Returns a new array containing the items for which the supplied function
+returned `false`.
+
+@method reject
+@param {Array} a the array to iterate.
+@param {Function} f the function to execute on each item.
+@param {object} [o] Optional context object.
+@return {Array} The items for which the supplied function returned `false`.
+@static
+*/
+A.reject = function(a, f, o) {
+    return A.filter(a, function(item, i, a) {
+        return !f.call(o, item, i, a);
+    });
+};
+
+/**
+Executes the supplied function on each item in the array. Iteration stops if the
+supplied function does not return a truthy value.
+
+@method every
+@param {Array} a the array to iterate.
+@param {Function} f the function to execute on each item.
+@param {Object} [o] Optional context object.
+@return {Boolean} `true` if every item in the array returns `true` from the
+  supplied function, `false` otherwise.
+@static
+*/
+A.every = L._isNative(ArrayProto.every) ?
+    function(a, f, o) {
+        return a.every(f, o);
+    } :
+    function(a, f, o) {
+        for (var i = 0, l = a.length; i < l; ++i) {
+            if (i in a && !f.call(o, a[i], i, a)) {
+                return false;
+            }
+        }
+
+        return true;
+    };
+
+/**
+Executes the supplied function on each item in the array and returns a new array
+containing all the values returned by the supplied function.
+
+@example
+
+    // Convert an array of numbers into an array of strings.
+    Y.Array.map([1, 2, 3, 4], function (item) {
+      return '' + item;
+    });
+    // => ['1', '2', '3', '4']
+
+@method map
+@param {Array} a the array to iterate.
+@param {Function} f the function to execute on each item.
+@param {object} [o] Optional context object.
+@return {Array} A new array containing the return value of the supplied function
+  for each item in the original array.
+@static
+*/
+A.map = L._isNative(ArrayProto.map) ?
+    function(a, f, o) {
+        return a.map(f, o);
+    } :
+    function(a, f, o) {
+        var i       = 0,
+            len     = a.length,
+            results = a.concat();
+
+        for (; i < len; ++i) {
+            if (i in a) {
+                results[i] = f.call(o, a[i], i, a);
+            }
+        }
+
+        return results;
+    };
+
+
+/**
+Executes the supplied function on each item in the array, "folding" the array
+into a single value.
+
+@method reduce
+@param {Array} a Array to iterate.
+@param {Any} init Initial value to start with.
+@param {Function} f Function to execute on each item. This function should
+  update and return the value of the computation. It will receive the following
+  arguments:
+    @param {Any} f.previousValue Value returned from the previous iteration,
+      or the initial value if this is the first iteration.
+    @param {Any} f.currentValue Value of the current item being iterated.
+    @param {Number} f.index Index of the current item.
+    @param {Array} f.array Array being iterated.
+@param {Object} [o] Optional context object.
+@return {Any} Final result from iteratively applying the given function to each
+  element in the array.
+@static
+*/
+A.reduce = L._isNative(ArrayProto.reduce) ?
+    function(a, init, f, o) {
+        // ES5 Array.reduce doesn't support a thisObject, so we need to
+        // implement it manually.
+        return a.reduce(function(init, item, i, a) {
+            return f.call(o, init, item, i, a);
+        }, init);
+    } :
+    function(a, init, f, o) {
+        var i      = 0,
+            len    = a.length,
+            result = init;
+
+        for (; i < len; ++i) {
+            if (i in a) {
+                result = f.call(o, result, a[i], i, a);
+            }
+        }
+
+        return result;
+    };
+
+/**
+Executes the supplied function on each item in the array, searching for the
+first item that matches the supplied function.
+
+@method find
+@param {Array} a the array to search.
+@param {Function} f the function to execute on each item. Iteration is stopped
+  as soon as this function returns `true`.
+@param {Object} [o] Optional context object.
+@return {Object} the first item that the supplied function returns `true` for,
+  or `null` if it never returns `true`.
+@static
+*/
+A.find = function(a, f, o) {
+    for (var i = 0, l = a.length; i < l; i++) {
+        if (i in a && f.call(o, a[i], i, a)) {
+            return a[i];
+        }
+    }
+    return null;
+};
+
+/**
+Iterates over an array, returning a new array of all the elements that match the
+supplied regular expression.
+
+@method grep
+@param {Array} a Array to iterate over.
+@param {RegExp} pattern Regular expression to test against each item.
+@return {Array} All the items in the array that produce a match against the
+  supplied regular expression. If no items match, an empty array is returned.
+@static
+*/
+A.grep = function(a, pattern) {
+    return A.filter(a, function(item, index) {
+        return pattern.test(item);
+    });
+};
+
+/**
+Partitions an array into two new arrays, one with the items for which the
+supplied function returns `true`, and one with the items for which the function
+returns `false`.
+
+@method partition
+@param {Array} a Array to iterate over.
+@param {Function} f Function to execute for each item in the array. It will
+  receive the following arguments:
+    @param {Any} f.item Current item.
+    @param {Number} f.index Index of the current item.
+    @param {Array} f.array The array being iterated.
+@param {Object} [o] Optional execution context.
+@return {Object} An object with two properties: `matches` and `rejects`. Each is
+  an array containing the items that were selected or rejected by the test
+  function (or an empty array if none).
+@static
+*/
+A.partition = function(a, f, o) {
+    var results = {
+        matches: [],
+        rejects: []
+    };
+
+    A.each(a, function(item, index) {
+        var set = f.call(o, item, index, a) ? results.matches : results.rejects;
+        set.push(item);
+    });
+
+    return results;
+};
+
+/**
+Creates an array of arrays by pairing the corresponding elements of two arrays
+together into a new array.
+
+@method zip
+@param {Array} a Array to iterate over.
+@param {Array} a2 Another array whose values will be paired with values of the
+  first array.
+@return {Array} An array of arrays formed by pairing each element of the first
+  array with an item in the second array having the corresponding index.
+@static
+*/
+A.zip = function(a, a2) {
+    var results = [];
+    A.each(a, function(item, index) {
+        results.push([item, a2[index]]);
+    });
+    return results;
+};
+
+
+}, '3.5.1' ,{requires:['yui-base']});

=== added file 'debian/extras/jslibs/yui/array-extras/array-extras-min.js'
--- debian/extras/jslibs/yui/array-extras/array-extras-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/array-extras/array-extras-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("array-extras",function(d){var b=d.Array,a=d.Lang,c=Array.prototype;b.lastIndexOf=a._isNative(c.lastIndexOf)?function(e,g,f){return f||f===0?e.lastIndexOf(g,f):e.lastIndexOf(g);}:function(f,j,h){var e=f.length,g=e-1;if(h||h===0){g=Math.min(h<0?e+h:h,e);}if(g>-1&&e>0){for(;g>-1;--g){if(g in f&&f[g]===j){return g;}}}return -1;};b.unique=function(f,l){var k=0,e=f.length,h=[],m,g;for(;k<e;++k){m=f[k];for(g=h.length;g>-1;--g){if(m===h[g]){break;}}if(g===-1){h.push(m);}}if(l){if(a.isNumber(h[0])){h.sort(b.numericSort);}else{h.sort();}}return h;};b.filter=a._isNative(c.filter)?function(e,g,h){return e.filter(g,h);}:function(g,l,m){var j=0,e=g.length,h=[],k;for(;j<e;++j){if(j in g){k=g[j];if(l.call(m,k,j,g)){h.push(k);}}}return h;};b.reject=function(e,g,h){return b.filter(e,function(k,j,f){return !g.call(h,k,j,f);});};b.every=a._isNative(c.every)?function(e,g,h){return e.every(g,h);}:function(g,j,k){for(var h=0,e=g.length;h<e;++h){if(h in g&&!j.call(k,g[h],h,g)){return false;}}return true;};b.map=a._isNative(c.map)?function(e,g,h){return e.map(g,h);}:function(g,k,l){var j=0,e=g.length,h=g.concat();for(;j<e;++j){if(j in g){h[j]=k.call(l,g[j],j,g);}}return h;};b.reduce=a._isNative(c.reduce)?function(e,i,g,h){return e.reduce(function(l,k,j,f){return g.call(h,l,k,j,f);},i);}:function(h,m,k,l){var j=0,g=h.length,e=m;for(;j<g;++j){if(j in h){e=k.call(l,e,h[j],j,h);}}return e;};b.find=function(g,j,k){for(var h=0,e=g.length;h<e;h++){if(h in g&&j.call(k,g[h],h,g)){return g[h];}}return null;};b.grep=function(e,f){return b.filter(e,function(h,g){return f.test(h);});};b.partition=function(e,h,i){var g={matches:[],rejects:[]};b.each(e,function(j,f){var k=h.call(i,j,f,e)?g.matches:g.rejects;k.push(j);});return g;};b.zip=function(f,e){var g=[];b.each(f,function(i,h){g.push([i,e[h]]);});return g;};},"3.5.1",{requires:["yui-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/array-extras/array-extras.js'
--- debian/extras/jslibs/yui/array-extras/array-extras.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/array-extras/array-extras.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,366 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('array-extras', function(Y) {
+
+/**
+Adds additional utility methods to the `Y.Array` class.
+
+@module collection
+@submodule array-extras
+**/
+
+var A          = Y.Array,
+    L          = Y.Lang,
+    ArrayProto = Array.prototype;
+
+/**
+Returns the index of the last item in the array that contains the specified
+value, or `-1` if the value isn't found.
+
+@method lastIndexOf
+@param {Array} a Array to search in.
+@param {Any} val Value to search for.
+@param {Number} [fromIndex] Index at which to start searching backwards.
+  Defaults to the array's length - 1. If negative, it will be taken as an offset
+  from the end of the array. If the calculated index is less than 0, the array
+  will not be searched and `-1` will be returned.
+@return {Number} Index of the item that contains the value, or `-1` if not
+  found.
+@static
+@for Array
+**/
+A.lastIndexOf = L._isNative(ArrayProto.lastIndexOf) ?
+    function(a, val, fromIndex) {
+        // An undefined fromIndex is still considered a value by some (all?)
+        // native implementations, so we can't pass it unless it's actually
+        // specified.
+        return fromIndex || fromIndex === 0 ? a.lastIndexOf(val, fromIndex) :
+                a.lastIndexOf(val);
+    } :
+    function(a, val, fromIndex) {
+        var len = a.length,
+            i   = len - 1;
+
+        if (fromIndex || fromIndex === 0) {
+            i = Math.min(fromIndex < 0 ? len + fromIndex : fromIndex, len);
+        }
+
+        if (i > -1 && len > 0) {
+            for (; i > -1; --i) {
+                if (i in a && a[i] === val) {
+                    return i;
+                }
+            }
+        }
+
+        return -1;
+    };
+
+/**
+Returns a copy of the specified array with duplicate items removed.
+
+@method unique
+@param {Array} a Array to dedupe.
+@return {Array} Copy of the array with duplicate items removed.
+@static
+**/
+A.unique = function(a, sort) {
+    // Note: the sort param is deprecated and intentionally undocumented since
+    // YUI 3.3.0. It never did what the API docs said it did (see the older
+    // comment below as well).
+    var i       = 0,
+        len     = a.length,
+        results = [],
+        item, j;
+
+    for (; i < len; ++i) {
+        item = a[i];
+
+        // This loop iterates over the results array in reverse order and stops
+        // if it finds an item that matches the current input array item (a
+        // dupe). If it makes it all the way through without finding a dupe, the
+        // current item is pushed onto the results array.
+        for (j = results.length; j > -1; --j) {
+            if (item === results[j]) {
+                break;
+            }
+        }
+
+        if (j === -1) {
+            results.push(item);
+        }
+    }
+
+    // Note: the sort option doesn't really belong here... I think it was added
+    // because there was a way to fast path the two operations together.  That
+    // implementation was not working, so I replaced it with the following.
+    // Leaving it in so that the API doesn't get broken.
+    if (sort) {
+
+        if (L.isNumber(results[0])) {
+            results.sort(A.numericSort);
+        } else {
+            results.sort();
+        }
+    }
+
+    return results;
+};
+
+/**
+Executes the supplied function on each item in the array. Returns a new array
+containing the items for which the supplied function returned a truthy value.
+
+@method filter
+@param {Array} a Array to filter.
+@param {Function} f Function to execute on each item.
+@param {Object} [o] Optional context object.
+@return {Array} Array of items for which the supplied function returned a
+  truthy value (empty if it never returned a truthy value).
+@static
+*/
+A.filter = L._isNative(ArrayProto.filter) ?
+    function(a, f, o) {
+        return a.filter(f, o);
+    } :
+    function(a, f, o) {
+        var i       = 0,
+            len     = a.length,
+            results = [],
+            item;
+
+        for (; i < len; ++i) {
+            if (i in a) {
+                item = a[i];
+
+                if (f.call(o, item, i, a)) {
+                    results.push(item);
+                }
+            }
+        }
+
+        return results;
+    };
+
+/**
+The inverse of `Array.filter()`. Executes the supplied function on each item.
+Returns a new array containing the items for which the supplied function
+returned `false`.
+
+@method reject
+@param {Array} a the array to iterate.
+@param {Function} f the function to execute on each item.
+@param {object} [o] Optional context object.
+@return {Array} The items for which the supplied function returned `false`.
+@static
+*/
+A.reject = function(a, f, o) {
+    return A.filter(a, function(item, i, a) {
+        return !f.call(o, item, i, a);
+    });
+};
+
+/**
+Executes the supplied function on each item in the array. Iteration stops if the
+supplied function does not return a truthy value.
+
+@method every
+@param {Array} a the array to iterate.
+@param {Function} f the function to execute on each item.
+@param {Object} [o] Optional context object.
+@return {Boolean} `true` if every item in the array returns `true` from the
+  supplied function, `false` otherwise.
+@static
+*/
+A.every = L._isNative(ArrayProto.every) ?
+    function(a, f, o) {
+        return a.every(f, o);
+    } :
+    function(a, f, o) {
+        for (var i = 0, l = a.length; i < l; ++i) {
+            if (i in a && !f.call(o, a[i], i, a)) {
+                return false;
+            }
+        }
+
+        return true;
+    };
+
+/**
+Executes the supplied function on each item in the array and returns a new array
+containing all the values returned by the supplied function.
+
+@example
+
+    // Convert an array of numbers into an array of strings.
+    Y.Array.map([1, 2, 3, 4], function (item) {
+      return '' + item;
+    });
+    // => ['1', '2', '3', '4']
+
+@method map
+@param {Array} a the array to iterate.
+@param {Function} f the function to execute on each item.
+@param {object} [o] Optional context object.
+@return {Array} A new array containing the return value of the supplied function
+  for each item in the original array.
+@static
+*/
+A.map = L._isNative(ArrayProto.map) ?
+    function(a, f, o) {
+        return a.map(f, o);
+    } :
+    function(a, f, o) {
+        var i       = 0,
+            len     = a.length,
+            results = a.concat();
+
+        for (; i < len; ++i) {
+            if (i in a) {
+                results[i] = f.call(o, a[i], i, a);
+            }
+        }
+
+        return results;
+    };
+
+
+/**
+Executes the supplied function on each item in the array, "folding" the array
+into a single value.
+
+@method reduce
+@param {Array} a Array to iterate.
+@param {Any} init Initial value to start with.
+@param {Function} f Function to execute on each item. This function should
+  update and return the value of the computation. It will receive the following
+  arguments:
+    @param {Any} f.previousValue Value returned from the previous iteration,
+      or the initial value if this is the first iteration.
+    @param {Any} f.currentValue Value of the current item being iterated.
+    @param {Number} f.index Index of the current item.
+    @param {Array} f.array Array being iterated.
+@param {Object} [o] Optional context object.
+@return {Any} Final result from iteratively applying the given function to each
+  element in the array.
+@static
+*/
+A.reduce = L._isNative(ArrayProto.reduce) ?
+    function(a, init, f, o) {
+        // ES5 Array.reduce doesn't support a thisObject, so we need to
+        // implement it manually.
+        return a.reduce(function(init, item, i, a) {
+            return f.call(o, init, item, i, a);
+        }, init);
+    } :
+    function(a, init, f, o) {
+        var i      = 0,
+            len    = a.length,
+            result = init;
+
+        for (; i < len; ++i) {
+            if (i in a) {
+                result = f.call(o, result, a[i], i, a);
+            }
+        }
+
+        return result;
+    };
+
+/**
+Executes the supplied function on each item in the array, searching for the
+first item that matches the supplied function.
+
+@method find
+@param {Array} a the array to search.
+@param {Function} f the function to execute on each item. Iteration is stopped
+  as soon as this function returns `true`.
+@param {Object} [o] Optional context object.
+@return {Object} the first item that the supplied function returns `true` for,
+  or `null` if it never returns `true`.
+@static
+*/
+A.find = function(a, f, o) {
+    for (var i = 0, l = a.length; i < l; i++) {
+        if (i in a && f.call(o, a[i], i, a)) {
+            return a[i];
+        }
+    }
+    return null;
+};
+
+/**
+Iterates over an array, returning a new array of all the elements that match the
+supplied regular expression.
+
+@method grep
+@param {Array} a Array to iterate over.
+@param {RegExp} pattern Regular expression to test against each item.
+@return {Array} All the items in the array that produce a match against the
+  supplied regular expression. If no items match, an empty array is returned.
+@static
+*/
+A.grep = function(a, pattern) {
+    return A.filter(a, function(item, index) {
+        return pattern.test(item);
+    });
+};
+
+/**
+Partitions an array into two new arrays, one with the items for which the
+supplied function returns `true`, and one with the items for which the function
+returns `false`.
+
+@method partition
+@param {Array} a Array to iterate over.
+@param {Function} f Function to execute for each item in the array. It will
+  receive the following arguments:
+    @param {Any} f.item Current item.
+    @param {Number} f.index Index of the current item.
+    @param {Array} f.array The array being iterated.
+@param {Object} [o] Optional execution context.
+@return {Object} An object with two properties: `matches` and `rejects`. Each is
+  an array containing the items that were selected or rejected by the test
+  function (or an empty array if none).
+@static
+*/
+A.partition = function(a, f, o) {
+    var results = {
+        matches: [],
+        rejects: []
+    };
+
+    A.each(a, function(item, index) {
+        var set = f.call(o, item, index, a) ? results.matches : results.rejects;
+        set.push(item);
+    });
+
+    return results;
+};
+
+/**
+Creates an array of arrays by pairing the corresponding elements of two arrays
+together into a new array.
+
+@method zip
+@param {Array} a Array to iterate over.
+@param {Array} a2 Another array whose values will be paired with values of the
+  first array.
+@return {Array} An array of arrays formed by pairing each element of the first
+  array with an item in the second array having the corresponding index.
+@static
+*/
+A.zip = function(a, a2) {
+    var results = [];
+    A.each(a, function(item, index) {
+        results.push([item, a2[index]]);
+    });
+    return results;
+};
+
+
+}, '3.5.1' ,{requires:['yui-base']});

=== added directory 'debian/extras/jslibs/yui/array-invoke'
=== added file 'debian/extras/jslibs/yui/array-invoke/array-invoke-debug.js'
--- debian/extras/jslibs/yui/array-invoke/array-invoke-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/array-invoke/array-invoke-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,46 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('array-invoke', function(Y) {
+
+/**
+@module collection
+@submodule array-invoke
+*/
+
+/**
+Executes a named method on each item in an array of objects. Items in the array
+that do not have a function by that name will be skipped.
+
+@example
+
+    Y.Array.invoke(arrayOfDrags, 'plug', Y.Plugin.DDProxy);
+
+@method invoke
+@param {Array} items Array of objects supporting the named method.
+@param {String} name the name of the method to execute on each item.
+@param {Any} [args*] Any number of additional args are passed as parameters to
+  the execution of the named method.
+@return {Array} All return values, indexed according to the item index.
+@static
+@for Array
+**/
+Y.Array.invoke = function(items, name) {
+    var args = Y.Array(arguments, 2, true),
+        isFunction = Y.Lang.isFunction,
+        ret = [];
+
+    Y.Array.each(Y.Array(items), function(item, i) {
+        if (item && isFunction(item[name])) {
+            ret[i] = item[name].apply(item, args);
+        }
+    });
+
+    return ret;
+};
+
+
+}, '3.5.1' ,{requires:['yui-base']});

=== added file 'debian/extras/jslibs/yui/array-invoke/array-invoke-min.js'
--- debian/extras/jslibs/yui/array-invoke/array-invoke-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/array-invoke/array-invoke-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("array-invoke",function(a){a.Array.invoke=function(b,e){var d=a.Array(arguments,2,true),f=a.Lang.isFunction,c=[];a.Array.each(a.Array(b),function(h,g){if(h&&f(h[e])){c[g]=h[e].apply(h,d);}});return c;};},"3.5.1",{requires:["yui-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/array-invoke/array-invoke.js'
--- debian/extras/jslibs/yui/array-invoke/array-invoke.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/array-invoke/array-invoke.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,46 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('array-invoke', function(Y) {
+
+/**
+@module collection
+@submodule array-invoke
+*/
+
+/**
+Executes a named method on each item in an array of objects. Items in the array
+that do not have a function by that name will be skipped.
+
+@example
+
+    Y.Array.invoke(arrayOfDrags, 'plug', Y.Plugin.DDProxy);
+
+@method invoke
+@param {Array} items Array of objects supporting the named method.
+@param {String} name the name of the method to execute on each item.
+@param {Any} [args*] Any number of additional args are passed as parameters to
+  the execution of the named method.
+@return {Array} All return values, indexed according to the item index.
+@static
+@for Array
+**/
+Y.Array.invoke = function(items, name) {
+    var args = Y.Array(arguments, 2, true),
+        isFunction = Y.Lang.isFunction,
+        ret = [];
+
+    Y.Array.each(Y.Array(items), function(item, i) {
+        if (item && isFunction(item[name])) {
+            ret[i] = item[name].apply(item, args);
+        }
+    });
+
+    return ret;
+};
+
+
+}, '3.5.1' ,{requires:['yui-base']});

=== added directory 'debian/extras/jslibs/yui/arraylist'
=== added directory 'debian/extras/jslibs/yui/arraylist-add'
=== added file 'debian/extras/jslibs/yui/arraylist-add/arraylist-add-debug.js'
--- debian/extras/jslibs/yui/arraylist-add/arraylist-add-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/arraylist-add/arraylist-add-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,93 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('arraylist-add', function(Y) {
+
+/**
+ * Collection utilities beyond what is provided in the YUI core
+ * @module collection
+ * @submodule arraylist-add
+ * @deprecated Use ModelList or a custom ArrayList subclass
+ */
+
+/*
+ * Adds methods add and remove to Y.ArrayList
+ */
+Y.mix(Y.ArrayList.prototype, {
+
+    /**
+     * Add a single item to the ArrayList.  Does not prevent duplicates.
+     *
+     * @method add
+     * @param { mixed } item Item presumably of the same type as others in the
+     *                       ArrayList.
+     * @param {Number} index (Optional.)  Number representing the position at
+     * which the item should be inserted.
+     * @return {ArrayList} the instance.
+     * @for ArrayList
+     * @deprecated Use ModelList or a custom ArrayList subclass
+     * @chainable
+     */
+    add: function(item, index) {
+        var items = this._items;
+
+        if (Y.Lang.isNumber(index)) {
+            items.splice(index, 0, item);
+        }
+        else {
+            items.push(item);
+        }
+
+        return this;
+    },
+
+    /**
+     * Removes first or all occurrences of an item to the ArrayList.  If a
+     * comparator is not provided, uses itemsAreEqual method to determine
+     * matches.
+     *
+     * @method remove
+     * @param { mixed } needle Item to find and remove from the list.
+     * @param { Boolean } all If true, remove all occurrences.
+     * @param { Function } comparator optional a/b function to test equivalence.
+     * @return {ArrayList} the instance.
+     * @for ArrayList
+     * @deprecated Use ModelList or a custom ArrayList subclass
+     * @chainable
+     */
+    remove: function(needle, all, comparator) {
+        comparator = comparator || this.itemsAreEqual;
+
+        for (var i = this._items.length - 1; i >= 0; --i) {
+            if (comparator.call(this, needle, this.item(i))) {
+                this._items.splice(i, 1);
+                if (!all) {
+                    break;
+                }
+            }
+        }
+
+        return this;
+    },
+
+    /**
+     * Default comparator for items stored in this list.  Used by remove().
+     *
+     * @method itemsAreEqual
+     * @param { mixed } a item to test equivalence with.
+     * @param { mixed } b other item to test equivalance.
+     * @return { Boolean } true if items are deemed equivalent.
+     * @for ArrayList
+     * @deprecated Use ModelList or a custom ArrayList subclass
+     */
+    itemsAreEqual: function(a, b) {
+        return a === b;
+    }
+
+});
+
+
+}, '3.5.1' ,{requires:['arraylist']});

=== added file 'debian/extras/jslibs/yui/arraylist-add/arraylist-add-min.js'
--- debian/extras/jslibs/yui/arraylist-add/arraylist-add-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/arraylist-add/arraylist-add-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("arraylist-add",function(a){a.mix(a.ArrayList.prototype,{add:function(d,c){var b=this._items;if(a.Lang.isNumber(c)){b.splice(c,0,d);}else{b.push(d);}return this;},remove:function(e,d,b){b=b||this.itemsAreEqual;for(var c=this._items.length-1;c>=0;--c){if(b.call(this,e,this.item(c))){this._items.splice(c,1);if(!d){break;}}}return this;},itemsAreEqual:function(d,c){return d===c;}});},"3.5.1",{requires:["arraylist"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/arraylist-add/arraylist-add.js'
--- debian/extras/jslibs/yui/arraylist-add/arraylist-add.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/arraylist-add/arraylist-add.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,93 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('arraylist-add', function(Y) {
+
+/**
+ * Collection utilities beyond what is provided in the YUI core
+ * @module collection
+ * @submodule arraylist-add
+ * @deprecated Use ModelList or a custom ArrayList subclass
+ */
+
+/*
+ * Adds methods add and remove to Y.ArrayList
+ */
+Y.mix(Y.ArrayList.prototype, {
+
+    /**
+     * Add a single item to the ArrayList.  Does not prevent duplicates.
+     *
+     * @method add
+     * @param { mixed } item Item presumably of the same type as others in the
+     *                       ArrayList.
+     * @param {Number} index (Optional.)  Number representing the position at
+     * which the item should be inserted.
+     * @return {ArrayList} the instance.
+     * @for ArrayList
+     * @deprecated Use ModelList or a custom ArrayList subclass
+     * @chainable
+     */
+    add: function(item, index) {
+        var items = this._items;
+
+        if (Y.Lang.isNumber(index)) {
+            items.splice(index, 0, item);
+        }
+        else {
+            items.push(item);
+        }
+
+        return this;
+    },
+
+    /**
+     * Removes first or all occurrences of an item to the ArrayList.  If a
+     * comparator is not provided, uses itemsAreEqual method to determine
+     * matches.
+     *
+     * @method remove
+     * @param { mixed } needle Item to find and remove from the list.
+     * @param { Boolean } all If true, remove all occurrences.
+     * @param { Function } comparator optional a/b function to test equivalence.
+     * @return {ArrayList} the instance.
+     * @for ArrayList
+     * @deprecated Use ModelList or a custom ArrayList subclass
+     * @chainable
+     */
+    remove: function(needle, all, comparator) {
+        comparator = comparator || this.itemsAreEqual;
+
+        for (var i = this._items.length - 1; i >= 0; --i) {
+            if (comparator.call(this, needle, this.item(i))) {
+                this._items.splice(i, 1);
+                if (!all) {
+                    break;
+                }
+            }
+        }
+
+        return this;
+    },
+
+    /**
+     * Default comparator for items stored in this list.  Used by remove().
+     *
+     * @method itemsAreEqual
+     * @param { mixed } a item to test equivalence with.
+     * @param { mixed } b other item to test equivalance.
+     * @return { Boolean } true if items are deemed equivalent.
+     * @for ArrayList
+     * @deprecated Use ModelList or a custom ArrayList subclass
+     */
+    itemsAreEqual: function(a, b) {
+        return a === b;
+    }
+
+});
+
+
+}, '3.5.1' ,{requires:['arraylist']});

=== added directory 'debian/extras/jslibs/yui/arraylist-filter'
=== added file 'debian/extras/jslibs/yui/arraylist-filter/arraylist-filter-debug.js'
--- debian/extras/jslibs/yui/arraylist-filter/arraylist-filter-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/arraylist-filter/arraylist-filter-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,51 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('arraylist-filter', function(Y) {
+
+/**
+ * Collection utilities beyond what is provided in the YUI core
+ * @module collection
+ * @submodule arraylist-filter
+ * @deprecated Use ModelList or a custom subclass implementation
+ */
+
+/*
+ * Adds filter method to ArrayList prototype
+ */
+Y.mix(Y.ArrayList.prototype, {
+
+    /**
+     * <p>Create a new ArrayList (or augmenting class instance) from a subset
+     * of items as determined by the boolean function passed as the
+     * argument.  The original ArrayList is unchanged.</p>
+     *
+     * <p>The validator signature is <code>validator( item )</code>.</p>
+     *
+     * @method filter
+     * @param { Function } validator Boolean function to determine in or out.
+     * @return { ArrayList } New instance based on who passed the validator.
+     * @for ArrayList
+     * @deprecated Use ModelList or a custom subclass implementation
+     */
+    filter: function(validator) {
+        var items = [];
+
+        Y.Array.each(this._items, function(item, i) {
+            item = this.item(i);
+
+            if (validator(item)) {
+                items.push(item);
+            }
+        }, this);
+
+        return new this.constructor(items);
+    }
+
+});
+
+
+}, '3.5.1' ,{requires:['arraylist']});

=== added file 'debian/extras/jslibs/yui/arraylist-filter/arraylist-filter-min.js'
--- debian/extras/jslibs/yui/arraylist-filter/arraylist-filter-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/arraylist-filter/arraylist-filter-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("arraylist-filter",function(a){a.mix(a.ArrayList.prototype,{filter:function(c){var b=[];a.Array.each(this._items,function(e,d){e=this.item(d);if(c(e)){b.push(e);}},this);return new this.constructor(b);}});},"3.5.1",{requires:["arraylist"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/arraylist-filter/arraylist-filter.js'
--- debian/extras/jslibs/yui/arraylist-filter/arraylist-filter.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/arraylist-filter/arraylist-filter.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,51 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('arraylist-filter', function(Y) {
+
+/**
+ * Collection utilities beyond what is provided in the YUI core
+ * @module collection
+ * @submodule arraylist-filter
+ * @deprecated Use ModelList or a custom subclass implementation
+ */
+
+/*
+ * Adds filter method to ArrayList prototype
+ */
+Y.mix(Y.ArrayList.prototype, {
+
+    /**
+     * <p>Create a new ArrayList (or augmenting class instance) from a subset
+     * of items as determined by the boolean function passed as the
+     * argument.  The original ArrayList is unchanged.</p>
+     *
+     * <p>The validator signature is <code>validator( item )</code>.</p>
+     *
+     * @method filter
+     * @param { Function } validator Boolean function to determine in or out.
+     * @return { ArrayList } New instance based on who passed the validator.
+     * @for ArrayList
+     * @deprecated Use ModelList or a custom subclass implementation
+     */
+    filter: function(validator) {
+        var items = [];
+
+        Y.Array.each(this._items, function(item, i) {
+            item = this.item(i);
+
+            if (validator(item)) {
+                items.push(item);
+            }
+        }, this);
+
+        return new this.constructor(items);
+    }
+
+});
+
+
+}, '3.5.1' ,{requires:['arraylist']});

=== added file 'debian/extras/jslibs/yui/arraylist/arraylist-debug.js'
--- debian/extras/jslibs/yui/arraylist/arraylist-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/arraylist/arraylist-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,220 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('arraylist', function(Y) {
+
+/**
+ * Collection utilities beyond what is provided in the YUI core
+ * @module collection
+ * @submodule arraylist
+ */
+
+var YArray      = Y.Array,
+    YArray_each = YArray.each,
+    ArrayListProto;
+
+/**
+ * Generic ArrayList class for managing lists of items and iterating operations
+ * over them.  The targeted use for this class is for augmentation onto a
+ * class that is responsible for managing multiple instances of another class
+ * (e.g. NodeList for Nodes).  The recommended use is to augment your class with
+ * ArrayList, then use ArrayList.addMethod to mirror the API of the constituent
+ * items on the list's API.
+ *
+ * The default implementation creates immutable lists, but mutability can be
+ * provided via the arraylist-add submodule or by implementing mutation methods
+ * directly on the augmented class's prototype.
+ *
+ * @class ArrayList
+ * @constructor
+ * @param items { Array } array of items this list will be responsible for
+ */
+function ArrayList( items ) {
+    if ( items !== undefined ) {
+        this._items = Y.Lang.isArray( items ) ? items : YArray( items );
+    } else {
+        // ||= to support lazy initialization from augment
+        this._items = this._items || [];
+    }
+}
+
+ArrayListProto = {
+    /**
+     * Get an item by index from the list.  Override this method if managing a
+     * list of objects that have a different public representation (e.g. Node
+     * instances vs DOM nodes).  The iteration methods that accept a user
+     * function will use this method for access list items for operation.
+     *
+     * @method item
+     * @param i { Integer } index to fetch
+     * @return { mixed } the item at the requested index
+     */
+    item: function ( i ) {
+        return this._items[i];
+    },
+
+    /**
+     * <p>Execute a function on each item of the list, optionally providing a
+     * custom execution context.  Default context is the item.</p>
+     *
+     * <p>The callback signature is <code>callback( item, index )</code>.</p>
+     *
+     * @method each
+     * @param fn { Function } the function to execute
+     * @param context { mixed } optional override 'this' in the function
+     * @return { ArrayList } this instance
+     * @chainable
+     */
+    each: function ( fn, context ) {
+        YArray_each( this._items, function ( item, i ) {
+            item = this.item( i );
+
+            fn.call( context || item, item, i, this );
+        }, this);
+
+        return this;
+    },
+
+    /**
+     * <p>Execute a function on each item of the list, optionally providing a
+     * custom execution context.  Default context is the item.</p>
+     *
+     * <p>The callback signature is <code>callback( item, index )</code>.</p>
+     *
+     * <p>Unlike <code>each</code>, if the callback returns true, the
+     * iteratation will stop.</p>
+     *
+     * @method some
+     * @param fn { Function } the function to execute
+     * @param context { mixed } optional override 'this' in the function
+     * @return { Boolean } True if the function returned true on an item
+     */
+    some: function ( fn, context ) {
+        return YArray.some( this._items, function ( item, i ) {
+            item = this.item( i );
+
+            return fn.call( context || item, item, i, this );
+        }, this);
+    },
+
+    /**
+     * Finds the first index of the needle in the managed array of items.
+     *
+     * @method indexOf
+     * @param needle { mixed } The item to search for
+     * @return { Integer } Array index if found.  Otherwise -1
+     */
+    indexOf: function ( needle ) {
+        return YArray.indexOf( this._items, needle );
+    },
+
+    /**
+     * How many items are in this list?
+     *
+     * @method size
+     * @return { Integer } Number of items in the list
+     */
+    size: function () {
+        return this._items.length;
+    },
+
+    /**
+     * Is this instance managing any items?
+     *
+     * @method isEmpty
+     * @return { Boolean } true if 1 or more items are being managed
+     */
+    isEmpty: function () {
+        return !this.size();
+    },
+
+    /**
+     * Provides an array-like representation for JSON.stringify.
+     *
+     * @method toJSON
+     * @return { Array } an array representation of the ArrayList
+     */
+    toJSON: function () {
+        return this._items;
+    }
+};
+// Default implementation does not distinguish between public and private
+// item getter
+/**
+ * Protected method for optimizations that may be appropriate for API
+ * mirroring. Similar in functionality to <code>item</code>, but is used by
+ * methods added with <code>ArrayList.addMethod()</code>.
+ *
+ * @method _item
+ * @protected
+ * @param i { Integer } Index of item to fetch
+ * @return { mixed } The item appropriate for pass through API methods
+ */
+ArrayListProto._item = ArrayListProto.item;
+
+// Mixed onto existing proto to preserve constructor NOT being an own property.
+// This has bitten me when composing classes by enumerating, copying prototypes.
+Y.mix(ArrayList.prototype, ArrayListProto);
+
+Y.mix( ArrayList, {
+
+    /**
+     * <p>Adds a pass through method to dest (typically the prototype of a list
+     * class) that calls the named method on each item in the list with
+     * whatever parameters are passed in.  Allows for API indirection via list
+     * instances.</p>
+     *
+     * <p>Accepts a single string name or an array of string names.</p>
+     *
+     * <pre><code>list.each( function ( item ) {
+     *     item.methodName( 1, 2, 3 );
+     * } );
+     * // becomes
+     * list.methodName( 1, 2, 3 );</code></pre>
+     *
+     * <p>Additionally, the pass through methods use the item retrieved by the
+     * <code>_item</code> method in case there is any special behavior that is
+     * appropriate for API mirroring.</p>
+     *
+     * <p>If the iterated method returns a value, the return value from the
+     * added method will be an array of values with each value being at the
+     * corresponding index for that item.  If the iterated method does not
+     * return a value, the added method will be chainable.
+     *
+     * @method addMethod
+     * @static
+     * @param dest {Object} Object or prototype to receive the iterator method
+     * @param name {String|String[]} Name of method of methods to create
+     */
+    addMethod: function ( dest, names ) {
+
+        names = YArray( names );
+
+        YArray_each( names, function ( name ) {
+            dest[ name ] = function () {
+                var args = YArray( arguments, 0, true ),
+                    ret  = [];
+
+                YArray_each( this._items, function ( item, i ) {
+                    item = this._item( i );
+
+                    var result = item[ name ].apply( item, args );
+
+                    if ( result !== undefined && result !== item ) {
+                        ret[i] = result;
+                    }
+                }, this);
+
+                return ret.length ? ret : this;
+            };
+        } );
+    }
+} );
+
+Y.ArrayList = ArrayList;
+
+
+}, '3.5.1' ,{requires:['yui-base']});

=== added file 'debian/extras/jslibs/yui/arraylist/arraylist-min.js'
--- debian/extras/jslibs/yui/arraylist/arraylist-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/arraylist/arraylist-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("arraylist",function(e){var d=e.Array,c=d.each,a;function b(f){if(f!==undefined){this._items=e.Lang.isArray(f)?f:d(f);}else{this._items=this._items||[];}}a={item:function(f){return this._items[f];},each:function(g,f){c(this._items,function(j,h){j=this.item(h);g.call(f||j,j,h,this);},this);return this;},some:function(g,f){return d.some(this._items,function(j,h){j=this.item(h);return g.call(f||j,j,h,this);},this);},indexOf:function(f){return d.indexOf(this._items,f);},size:function(){return this._items.length;},isEmpty:function(){return !this.size();},toJSON:function(){return this._items;}};a._item=a.item;e.mix(b.prototype,a);e.mix(b,{addMethod:function(f,g){g=d(g);c(g,function(h){f[h]=function(){var j=d(arguments,0,true),i=[];c(this._items,function(m,l){m=this._item(l);var k=m[h].apply(m,j);if(k!==undefined&&k!==m){i[l]=k;}},this);return i.length?i:this;};});}});e.ArrayList=b;},"3.5.1",{requires:["yui-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/arraylist/arraylist.js'
--- debian/extras/jslibs/yui/arraylist/arraylist.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/arraylist/arraylist.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,220 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('arraylist', function(Y) {
+
+/**
+ * Collection utilities beyond what is provided in the YUI core
+ * @module collection
+ * @submodule arraylist
+ */
+
+var YArray      = Y.Array,
+    YArray_each = YArray.each,
+    ArrayListProto;
+
+/**
+ * Generic ArrayList class for managing lists of items and iterating operations
+ * over them.  The targeted use for this class is for augmentation onto a
+ * class that is responsible for managing multiple instances of another class
+ * (e.g. NodeList for Nodes).  The recommended use is to augment your class with
+ * ArrayList, then use ArrayList.addMethod to mirror the API of the constituent
+ * items on the list's API.
+ *
+ * The default implementation creates immutable lists, but mutability can be
+ * provided via the arraylist-add submodule or by implementing mutation methods
+ * directly on the augmented class's prototype.
+ *
+ * @class ArrayList
+ * @constructor
+ * @param items { Array } array of items this list will be responsible for
+ */
+function ArrayList( items ) {
+    if ( items !== undefined ) {
+        this._items = Y.Lang.isArray( items ) ? items : YArray( items );
+    } else {
+        // ||= to support lazy initialization from augment
+        this._items = this._items || [];
+    }
+}
+
+ArrayListProto = {
+    /**
+     * Get an item by index from the list.  Override this method if managing a
+     * list of objects that have a different public representation (e.g. Node
+     * instances vs DOM nodes).  The iteration methods that accept a user
+     * function will use this method for access list items for operation.
+     *
+     * @method item
+     * @param i { Integer } index to fetch
+     * @return { mixed } the item at the requested index
+     */
+    item: function ( i ) {
+        return this._items[i];
+    },
+
+    /**
+     * <p>Execute a function on each item of the list, optionally providing a
+     * custom execution context.  Default context is the item.</p>
+     *
+     * <p>The callback signature is <code>callback( item, index )</code>.</p>
+     *
+     * @method each
+     * @param fn { Function } the function to execute
+     * @param context { mixed } optional override 'this' in the function
+     * @return { ArrayList } this instance
+     * @chainable
+     */
+    each: function ( fn, context ) {
+        YArray_each( this._items, function ( item, i ) {
+            item = this.item( i );
+
+            fn.call( context || item, item, i, this );
+        }, this);
+
+        return this;
+    },
+
+    /**
+     * <p>Execute a function on each item of the list, optionally providing a
+     * custom execution context.  Default context is the item.</p>
+     *
+     * <p>The callback signature is <code>callback( item, index )</code>.</p>
+     *
+     * <p>Unlike <code>each</code>, if the callback returns true, the
+     * iteratation will stop.</p>
+     *
+     * @method some
+     * @param fn { Function } the function to execute
+     * @param context { mixed } optional override 'this' in the function
+     * @return { Boolean } True if the function returned true on an item
+     */
+    some: function ( fn, context ) {
+        return YArray.some( this._items, function ( item, i ) {
+            item = this.item( i );
+
+            return fn.call( context || item, item, i, this );
+        }, this);
+    },
+
+    /**
+     * Finds the first index of the needle in the managed array of items.
+     *
+     * @method indexOf
+     * @param needle { mixed } The item to search for
+     * @return { Integer } Array index if found.  Otherwise -1
+     */
+    indexOf: function ( needle ) {
+        return YArray.indexOf( this._items, needle );
+    },
+
+    /**
+     * How many items are in this list?
+     *
+     * @method size
+     * @return { Integer } Number of items in the list
+     */
+    size: function () {
+        return this._items.length;
+    },
+
+    /**
+     * Is this instance managing any items?
+     *
+     * @method isEmpty
+     * @return { Boolean } true if 1 or more items are being managed
+     */
+    isEmpty: function () {
+        return !this.size();
+    },
+
+    /**
+     * Provides an array-like representation for JSON.stringify.
+     *
+     * @method toJSON
+     * @return { Array } an array representation of the ArrayList
+     */
+    toJSON: function () {
+        return this._items;
+    }
+};
+// Default implementation does not distinguish between public and private
+// item getter
+/**
+ * Protected method for optimizations that may be appropriate for API
+ * mirroring. Similar in functionality to <code>item</code>, but is used by
+ * methods added with <code>ArrayList.addMethod()</code>.
+ *
+ * @method _item
+ * @protected
+ * @param i { Integer } Index of item to fetch
+ * @return { mixed } The item appropriate for pass through API methods
+ */
+ArrayListProto._item = ArrayListProto.item;
+
+// Mixed onto existing proto to preserve constructor NOT being an own property.
+// This has bitten me when composing classes by enumerating, copying prototypes.
+Y.mix(ArrayList.prototype, ArrayListProto);
+
+Y.mix( ArrayList, {
+
+    /**
+     * <p>Adds a pass through method to dest (typically the prototype of a list
+     * class) that calls the named method on each item in the list with
+     * whatever parameters are passed in.  Allows for API indirection via list
+     * instances.</p>
+     *
+     * <p>Accepts a single string name or an array of string names.</p>
+     *
+     * <pre><code>list.each( function ( item ) {
+     *     item.methodName( 1, 2, 3 );
+     * } );
+     * // becomes
+     * list.methodName( 1, 2, 3 );</code></pre>
+     *
+     * <p>Additionally, the pass through methods use the item retrieved by the
+     * <code>_item</code> method in case there is any special behavior that is
+     * appropriate for API mirroring.</p>
+     *
+     * <p>If the iterated method returns a value, the return value from the
+     * added method will be an array of values with each value being at the
+     * corresponding index for that item.  If the iterated method does not
+     * return a value, the added method will be chainable.
+     *
+     * @method addMethod
+     * @static
+     * @param dest {Object} Object or prototype to receive the iterator method
+     * @param name {String|String[]} Name of method of methods to create
+     */
+    addMethod: function ( dest, names ) {
+
+        names = YArray( names );
+
+        YArray_each( names, function ( name ) {
+            dest[ name ] = function () {
+                var args = YArray( arguments, 0, true ),
+                    ret  = [];
+
+                YArray_each( this._items, function ( item, i ) {
+                    item = this._item( i );
+
+                    var result = item[ name ].apply( item, args );
+
+                    if ( result !== undefined && result !== item ) {
+                        ret[i] = result;
+                    }
+                }, this);
+
+                return ret.length ? ret : this;
+            };
+        } );
+    }
+} );
+
+Y.ArrayList = ArrayList;
+
+
+}, '3.5.1' ,{requires:['yui-base']});

=== added directory 'debian/extras/jslibs/yui/arraysort'
=== added file 'debian/extras/jslibs/yui/arraysort/arraysort-debug.js'
--- debian/extras/jslibs/yui/arraysort/arraysort-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/arraysort/arraysort-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,71 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('arraysort', function(Y) {
+
+/**
+Provides a case-insenstive comparator which can be used for array sorting.
+
+@module arraysort
+*/
+
+var LANG = Y.Lang,
+    ISVALUE = LANG.isValue,
+    ISSTRING = LANG.isString;
+
+/**
+Provides a case-insenstive comparator which can be used for array sorting.
+
+@class ArraySort
+*/
+
+Y.ArraySort = {
+
+    /**
+    Comparator function for simple case-insensitive sorting of an array of
+    strings.
+
+    @method compare
+    @param a {Object} First sort argument.
+    @param b {Object} Second sort argument.
+    @param desc {Boolean} `true` if sort direction is descending, `false` if
+        sort direction is ascending.
+    @return {Boolean} -1 when a < b. 0 when a == b. 1 when a > b.
+    */
+    compare: function(a, b, desc) {
+        if(!ISVALUE(a)) {
+            if(!ISVALUE(b)) {
+                return 0;
+            }
+            else {
+                return 1;
+            }
+        }
+        else if(!ISVALUE(b)) {
+            return -1;
+        }
+
+        if(ISSTRING(a)) {
+            a = a.toLowerCase();
+        }
+        if(ISSTRING(b)) {
+            b = b.toLowerCase();
+        }
+        if(a < b) {
+            return (desc) ? 1 : -1;
+        }
+        else if (a > b) {
+            return (desc) ? -1 : 1;
+        }
+        else {
+            return 0;
+        }
+    }
+
+};
+
+
+}, '3.5.1' ,{requires:['yui-base']});

=== added file 'debian/extras/jslibs/yui/arraysort/arraysort-min.js'
--- debian/extras/jslibs/yui/arraysort/arraysort-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/arraysort/arraysort-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("arraysort",function(c){var b=c.Lang,a=b.isValue,d=b.isString;c.ArraySort={compare:function(f,e,g){if(!a(f)){if(!a(e)){return 0;}else{return 1;}}else{if(!a(e)){return -1;}}if(d(f)){f=f.toLowerCase();}if(d(e)){e=e.toLowerCase();}if(f<e){return(g)?1:-1;}else{if(f>e){return(g)?-1:1;}else{return 0;}}}};},"3.5.1",{requires:["yui-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/arraysort/arraysort.js'
--- debian/extras/jslibs/yui/arraysort/arraysort.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/arraysort/arraysort.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,71 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('arraysort', function(Y) {
+
+/**
+Provides a case-insenstive comparator which can be used for array sorting.
+
+@module arraysort
+*/
+
+var LANG = Y.Lang,
+    ISVALUE = LANG.isValue,
+    ISSTRING = LANG.isString;
+
+/**
+Provides a case-insenstive comparator which can be used for array sorting.
+
+@class ArraySort
+*/
+
+Y.ArraySort = {
+
+    /**
+    Comparator function for simple case-insensitive sorting of an array of
+    strings.
+
+    @method compare
+    @param a {Object} First sort argument.
+    @param b {Object} Second sort argument.
+    @param desc {Boolean} `true` if sort direction is descending, `false` if
+        sort direction is ascending.
+    @return {Boolean} -1 when a < b. 0 when a == b. 1 when a > b.
+    */
+    compare: function(a, b, desc) {
+        if(!ISVALUE(a)) {
+            if(!ISVALUE(b)) {
+                return 0;
+            }
+            else {
+                return 1;
+            }
+        }
+        else if(!ISVALUE(b)) {
+            return -1;
+        }
+
+        if(ISSTRING(a)) {
+            a = a.toLowerCase();
+        }
+        if(ISSTRING(b)) {
+            b = b.toLowerCase();
+        }
+        if(a < b) {
+            return (desc) ? 1 : -1;
+        }
+        else if (a > b) {
+            return (desc) ? -1 : 1;
+        }
+        else {
+            return 0;
+        }
+    }
+
+};
+
+
+}, '3.5.1' ,{requires:['yui-base']});

=== added directory 'debian/extras/jslibs/yui/assets'
=== added directory 'debian/extras/jslibs/yui/assets/skins'
=== added directory 'debian/extras/jslibs/yui/assets/skins/sam'
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/arrows.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/arrows.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/arrows.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/autocomplete-list.css'
--- debian/extras/jslibs/yui/assets/skins/sam/autocomplete-list.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/autocomplete-list.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-aclist{position:absolute;z-index:1}.yui3-aclist-hidden{visibility:hidden}.yui3-aclist-aria{left:-9999px;position:absolute}.yui3-aclist-list{list-style:none;margin:0;overflow:hidden;padding:0}.yui3-aclist-item{cursor:pointer;list-style:none;padding:2px 5px}.yui3-aclist-item-active{outline:#afafaf dotted thin}.yui3-skin-sam .yui3-aclist-content{background:#fff;border:1px solid #afafaf;-moz-box-shadow:1px 1px 4px rgba(0,0,0,0.58);-webkit-box-shadow:1px 1px 4px rgba(0,0,0,0.58);box-shadow:1px 1px 4px rgba(0,0,0,0.58)}.yui3-skin-sam .yui3-aclist-item-hover{background:#bfdaff}.yui3-skin-sam .yui3-aclist-item-active{background:#2647a0;color:#fff;outline:0}#yui3-css-stamp.skin-sam-autocomplete-list{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/bg.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/bg.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/bg.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/calendar-base.css'
--- debian/extras/jslibs/yui/assets/skins/sam/calendar-base.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/calendar-base.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-calendar-pane{width:100%}.yui3-calendar-grid{width:100%}.yui3-calendar-column-hidden,.yui3-calendar-hidden{display:none}.yui3-skin-sam .yui3-calendar-content{padding:10px;color:#000;border:1px solid gray;background:#f2f2f2;background:-moz-linear-gradient(top,#f9f9f9 0,#f2f2f2 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#f9f9f9),color-stop(100%,#f2f2f2));background:-webkit-linear-gradient(top,#f9f9f9 0,#f2f2f2 100%);background:-o-linear-gradient(top,#f9f9f9 0,#f2f2f2 100%);background:-ms-linear-gradient(top,#f9f9f9 0,#f2f2f2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9',endColorstr='#f2f2f2',GradientType=0);background:linear-gradient(top,#f9f9f9 0,#f2f2f2 100%);-moz-border-radius:5px;border-radius:5px}.yui3-skin-sam .yui3-calendar-grid{padding:5px;border-collapse:collapse}.yui3-skin-sam .yui3-calendar-header{padding-bottom:10px}.yui3-skin-sam .yui3-calendar-header-label{margin:0;font-size:1em;font-weight:bold}.yui3-skin-sam .yui3-calendar-day,.yui3-skin-sam .yui3-calendar-prevmonth-day,.yui3-skin-sam .yui3-calendar-nextmonth-day{padding:5px;border:1px solid #ccc;background:#fff;text-align:center}.yui3-skin-sam .yui3-calendar-day:hover{background:#06c;color:#fff}.yui3-skin-sam .yui3-calendar-selection-disabled,.yui3-skin-sam .yui3-calendar-selection-disabled:hover{color:#a6a6a6;background:#ccc}.yui3-skin-sam .yui3-calendar-weekday{font-weight:bold}.yui3-skin-sam .yui3-calendar-prevmonth-day,.yui3-skin-sam .yui3-calendar-nextmonth-day{color:#a6a6a6}.yui3-skin-sam .yui3-calendar-day{font-weight:bold}.yui3-skin-sam .yui3-calendar-day-selected{background-color:#b3d4ff;color:#000}.yui3-skin-sam .yui3-calendar-header-label{text-align:center}.yui3-skin-sam .yui3-calendar-left-grid{margin-right:1em}.yui3-skin-sam .yui3-calendar-right-grid{margin-left:1em}.yui3-skin-sam .yui3-calendar-day-highlighted{background-color:#dcdef5}.yui3-skin-sam .yui3-calendar-day-selected.yui3-calendar-day-highlighted{background-color:#758fbb}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/calendar.css'
--- debian/extras/jslibs/yui/assets/skins/sam/calendar.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/calendar.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-calendar-column-hidden,.yui3-calendar-hidden{display:none}.yui3-calendar-day{cursor:pointer}.yui3-calendar-selection-disabled{cursor:default}.yui3-calendar-prevmonth-day{cursor:default}.yui3-calendar-nextmonth-day{cursor:default}.yui3-calendar-content:hover .yui3-calendar-day,.yui3-calendar-content:hover .yui3-calendar-prevmonth-day,.yui3-calendar-content:hover .yui3-calendar-nextmonth-day{-moz-user-select:none}.yui3-skin-sam .yui3-calendar-day-highlighted{background-color:#dcdef5}.yui3-skin-sam .yui3-calendar-day-selected.yui3-calendar-day-highlighted{background-color:#758fbb}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/calendarnavigator.css'
--- debian/extras/jslibs/yui/assets/skins/sam/calendarnavigator.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/calendarnavigator.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-calendar-header{padding-left:15px;padding-right:15px}.yui3-calendar-header-label{width:100%}.yui3-calendarnav-prevmonth{cursor:pointer}.yui3-calendarnav-nextmonth{cursor:pointer}.yui3-skin-sam .yui3-calendarnav-prevmonth,.yui3-skin-sam .yui3-calendarnav-nextmonth{color:#000;width:12px;height:14px;background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAOCAYAAAA1+Nx+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKNJREFUeNpiYCAeSAPxUiiWZqAi4ATiaiD+DMT/ofgzVIyTUsMDgfghksHo+CFUDcnAAIgP4DEYHR+A6iEIhIB4GgkGo+NpUDMwADMQFwHxBwoMh+EPULOYYYZ7APFVKhiMjkFmejBBLWFjoD5gQ+dQO4iwOloUiOdQYPgcqBkDl0zRQRQRGS2KGkVFHRB/QzL4G1SMk5qpQg6psJMjVhNAgAEAH+qPqeiPEUsAAAAASUVORK5CYII=);background-repeat:no-repeat}.yui3-skin-sam .yui3-calendarnav-prevmonth:hover,.yui3-skin-sam .yui3-calendarnav-nextmonth:hover{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAOCAYAAAA1+Nx+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPpJREFUeNpi/P//PwMxQD9jszSQ6oJyyy7O8H1KjD5GQhYADeYEUkVAXAHEPFDhL0DcAcR9QIu+k20B0PBAIDUBiOVwKHkExAVAS9aTZAHQYAOowfYMxIGDUIsu4LUAaLAQkGoB4kwG8sB0IK4BWvQOxQKgwcxAdj4Q1wExPwNl4CMQNwHxRKBFfxn10jd5ADm9QKzFQF1wDYiLmaAcNgbqA7CZTEBv7ADS2iDboN5joEIQgczSBpmNHsmiQKodiJPJNHwuEFcCDX49MMkUi0VRUB/hy2ggFy+jtKgohRYVnFDh79CiopuiogLNIjmobxigrn5EjD6AAAMAok9vhfHG8wQAAAAASUVORK5CYII=);color:#06c}.yui3-skin-sam .yui3-calendarnav-month-disabled,.yui3-skin-sam .yui3-calendarnav-month-disabled:hover{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAOCAYAAAA1+Nx+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQhJREFUeNqs0yGLAlEUhuHrKoIgCFbBJghb3F+g0WrVarEqLIhBEEFYWKNNMBktU4z6C5RNkwyCyWQSTPuOfCOCrHNnxwMPyOGe73DAiTmOYywrhy/9/sTBZujN4k0KPbioi6teKuqCmsKGSN/10+q5ehN6QQkrLJB/Mp/Xm5VmAhdkMcEGZWNfZc1MlPGwII42dmiZ/1dLGW1lXhdU8YNvZEz0yijLy6z6FyTN6yvpX7DEOzo4vSD4pCwvc+lfcMEYBUwjhE+VMVbmw7/oiCY+sA4RvNZMUxmB38EWFTSwfxK815uKZkJ/yXMU0cf5rn9Wr6g3f1bC4nwvbIAZRup1Ay671a8AAwC3OzOqxK+rkwAAAABJRU5ErkJggg==);cursor:default;color:#ccc}.yui3-skin-sam .yui3-calendarnav-prevmonth,.yui3-skin-sam .yui3-calendarnav-prevmonth:hover{background-position:0 0;margin-left:-12px}.yui3-skin-sam .yui3-calendarnav-nextmonth,.yui3-skin-sam .yui3-calendarnav-nextmonth:hover{background-position:-12px 0;margin-right:-12px}.yui3-skin-sam .yui3-calendarnav-prevmonth span,.yui3-skin-sam .yui3-calendarnav-nextmonth span{display:none;*display:block}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/console-filters.css'
--- debian/extras/jslibs/yui/assets/skins/sam/console-filters.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/console-filters.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-skin-sam .yui3-console-ft .yui3-console-filters-categories,.yui3-skin-sam .yui3-console-ft .yui3-console-filters-sources{text-align:left;padding:5px 0;border:1px inset;margin:0 2px}.yui3-skin-sam .yui3-console-ft .yui3-console-filters-categories{background:#fff;border-bottom:2px ridge}.yui3-skin-sam .yui3-console-ft .yui3-console-filters-sources{background:#fff;margin-bottom:2px;border-top:0 none;border-bottom-right-radius:10px;border-bottom-left-radius:10px;-moz-border-radius-bottomright:10px;-moz-border-radius-bottomleft:10px;-webkit-border-bottom-right-radius:10px;-webkit-border-bottom-left-radius:10px}.yui3-skin-sam .yui3-console-filter-label{white-space:nowrap;margin-left:1ex}#yui3-css-stamp.skin-sam-console-filters{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/console.css'
--- debian/extras/jslibs/yui/assets/skins/sam/console.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/console.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-skin-sam .yui3-console-separate{position:absolute;right:1em;top:1em;z-index:999}.yui3-skin-sam .yui3-console-inline{display:-moz-inline-stack;display:inline-block;*display:inline;zoom:1;vertical-align:top}.yui3-skin-sam .yui3-console-inline .yui3-console-content{position:relative}.yui3-skin-sam .yui3-console-content{background:#777;_background:#d8d8da url(bg.png) repeat-x 0 0;font:normal 13px/1.3 Arial,sans-serif;text-align:left;border:1px solid #777;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px}.yui3-skin-sam .yui3-console-hd,.yui3-skin-sam .yui3-console-bd,.yui3-skin-sam .yui3-console-ft{position:relative}.yui3-skin-sam .yui3-console-hd,.yui3-skin-sam .yui3-console-ft .yui3-console-controls{text-align:right}.yui3-skin-sam .yui3-console-hd{background:#d8d8da url(bg.png) repeat-x 0 0;padding:1ex;border:1px solid transparent;_border:0 none;border-top-right-radius:10px;border-top-left-radius:10px;-moz-border-radius-topright:10px;-moz-border-radius-topleft:10px;-webkit-border-top-right-radius:10px;-webkit-border-top-left-radius:10px}.yui3-skin-sam .yui3-console-bd{background:#fff;border-top:1px solid #777;border-bottom:1px solid #777;color:#000;font-size:11px;overflow:auto;overflow-x:auto;overflow-y:scroll;_width:100%}.yui3-skin-sam .yui3-console-ft{background:#d8d8da url(bg.png) repeat-x 0 0;border:1px solid transparent;_border:0 none;border-bottom-right-radius:10px;border-bottom-left-radius:10px;-moz-border-radius-bottomright:10px;-moz-border-radius-bottomleft:10px;-webkit-border-bottom-right-radius:10px;-webkit-border-bottom-left-radius:10px}.yui3-skin-sam .yui3-console-controls{padding:4px 1ex;zoom:1}.yui3-skin-sam .yui3-console-title{color:#000;display:inline;float:left;font-weight:bold;font-size:13px;height:24px;line-height:24px;margin:0;padding-left:1ex}.yui3-skin-sam .yui3-console-pause-label{float:left}.yui3-skin-sam .yui3-console-button{line-height:1.3}.yui3-skin-sam .yui3-console-collapsed .yui3-console-bd,.yui3-skin-sam .yui3-console-collapsed .yui3-console-ft{display:none}.yui3-skin-sam .yui3-console-content.yui3-console-collapsed{-webkit-border-radius:0}.yui3-skin-sam .yui3-console-collapsed .yui3-console-hd{border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:0}.yui3-skin-sam .yui3-console-entry{border-bottom:1px solid #aaa;min-height:32px;_height:32px}.yui3-skin-sam .yui3-console-entry-meta{margin:0;overflow:hidden}.yui3-skin-sam .yui3-console-entry-content{margin:0;padding:0 1ex;white-space:pre-wrap;word-wrap:break-word}.yui3-skin-sam .yui3-console-entry-meta .yui3-console-entry-src{color:#000;font-style:italic;font-weight:bold;float:right;margin:2px 5px 0 0}.yui3-skin-sam .yui3-console-entry-meta .yui3-console-entry-time{color:#777;padding-left:1ex}.yui3-skin-sam .yui3-console-entry-warn .yui3-console-entry-meta .yui3-console-entry-time{color:#555}.yui3-skin-sam .yui3-console-entry-info .yui3-console-entry-meta .yui3-console-entry-cat,.yui3-skin-sam .yui3-console-entry-warn .yui3-console-entry-meta .yui3-console-entry-cat,.yui3-skin-sam .yui3-console-entry-error .yui3-console-entry-meta .yui3-console-entry-cat{display:none}.yui3-skin-sam .yui3-console-entry-warn{background:#aee url(warn_error.png) no-repeat -15px 15px}.yui3-skin-sam .yui3-console-entry-error{background:#ffa url(warn_error.png) no-repeat 5px -24px;color:#900}.yui3-skin-sam .yui3-console-entry-warn .yui3-console-entry-content,.yui3-skin-sam .yui3-console-entry-error .yui3-console-entry-content{padding-left:24px}.yui3-skin-sam .yui3-console-entry-cat{text-transform:uppercase;padding:1px 4px;background-color:#ccc}.yui3-skin-sam .yui3-console-entry-info .yui3-console-entry-cat{background-color:#ac2}.yui3-skin-sam .yui3-console-entry-warn .yui3-console-entry-cat{background-color:#e81}.yui3-skin-sam .yui3-console-entry-error .yui3-console-entry-cat{background-color:#b00;color:#fff}.yui3-skin-sam .yui3-console-hidden{display:none}#yui3-css-stamp.skin-sam-console{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/datatable-base-deprecated.css'
--- debian/extras/jslibs/yui/assets/skins/sam/datatable-base-deprecated.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/datatable-base-deprecated.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,8 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-skin-sam .yui3-datatable-mask{position:absolute;z-index:9500}.yui3-datatable-tmp{position:absolute;left:-9000px}.yui3-datatable-scrollable .yui3-datatable-bd{overflow:auto}.yui3-datatable-scrollable .yui3-datatable-hd{overflow:hidden;position:relative}.yui3-datatable-scrollable .yui3-datatable-bd thead tr,.yui3-datatable-scrollable .yui3-datatable-bd thead th{position:absolute;left:-1500px}.yui3-datatable-scrollable tbody{-moz-outline:0}.yui3-skin-sam thead .yui3-datatable-sortable{cursor:pointer}.yui3-skin-sam thead .yui3-datatable-draggable{cursor:move}.yui3-datatable-coltarget{position:absolute;z-index:999}.yui3-datatable-hd{zoom:1}th.yui3-datatable-resizeable .yui3-datatable-resizerliner{position:relative}.yui3-datatable-resizer{position:absolute;right:0;bottom:0;height:100%;cursor:e-resize;cursor:col-resize;background-color:#CCC;opacity:0;filter:alpha(opacity=0)}.yui3-datatable-resizerproxy{visibility:hidden;position:absolute;z-index:9000;background-color:#CCC;opacity:0;filter:alpha(opacity=0)}th.yui3-datatable-hidden .yui3-datatable-liner,td.yui3-datatable-hidden .yui3-datatable-liner,th.yui3-datatable-hidden .yui3-datatable-resizer{display:none}.yui3-datatable-editor,.yui3-datatable-editor-shim{position:absolute;z-index:9000}.yui3-skin-sam .yui3-datatable table{margin:0;padding:0;font-family:arial;font-size:inherit;border-collapse:separate;*border-collapse:collapse;border-spacing:0;border:1px solid #7f7f7f}.yui3-skin-sam .yui3-datatable thead{border-spacing:0}.yui3-skin-sam .yui3-datatable caption{color:#000;font-size:85%;font-weight:normal;font-style:italic;line-height:1;padding:1em 0;text-align:center}.yui3-skin-sam .yui3-datatable th{background:#d8d8da url(sprite.png) repeat-x 0 0}.yui3-skin-sam .yui3-datatable th,.yui3-skin-sam .yui3-datatable th a{font-weight:normal;text-decoration:none;color:#000;vertical-align:bottom}.yui3-skin-sam .yui3-datatable th{margin:0;padding:0;border:0;border-right:1px solid #cbcbcb}.yui3-skin-sam .yui3-datatable tr.yui3-datatable-first td{border-top:1px solid #7f7f7f}.yui3-skin-sam .yui3-datatable th .yui3-datatable-liner{white-space:nowrap}.yui3-skin-sam .yui3-datatable-liner{margin:0;padding:0;padding:4px 10px 4px 10px;overflow:visible;border:0 solid black}.yui3-skin-sam .yui3-datatable-coltarget{width:5px;background-color:red}.yui3-skin-sam .yui3-datatable td{margin:0;padding:0;border:0;border-right:1px solid #cbcbcb;text-align:left}.yui3-skin-sam .yui3-datatable-list td{border-right:0}.yui3-skin-sam .yui3-datatable-resizer{width:6px}.yui3-skin-sam .yui3-datatable-mask{background-color:#000;opacity:.25;filter:alpha(opacity=25)}.yui3-skin-sam .yui3-datatable-message{background-color:#FFF}.yui3-skin-sam .yui3-datatable-scrollable table{border:0}.yui3-skin-sam .yui3-datatable-scrollable .yui3-datatable-hd{border-left:1px solid #7f7f7f;border-top:1px solid #7f7f7f;border-right:1px solid #7f7f7f}.yui3-skin-sam .yui3-datatable-scrollable .yui3-datatable-bd{border-left:1px solid #7f7f7f;border-bottom:1px solid #7f7f7f;border-right:1px solid #7f7f7f;background-color:#FFF}.yui3-skin-sam .yui3-datatable-scrollable .yui3-datatable-data tr.yui3-datatable-last td{border-bottom:1px solid #7f7f7f}.yui3-skin-sam th.yui3-datatable-asc,.yui3-skin-sam th.yui3-datatable-desc{background:url(sprite.png) repeat-x 0 -100px}.yui3-skin-sam th.yui3-datatable-sortable .yui3-datatable-liner{padding-right:20px}.yui3-skin-sam th.yui3-datatable-asc .yui3-datatable-liner{background:url(dt-arrow-up.png) no-repeat right}.yui3-skin-sam th.yui3-datatable-desc .yui3-datatable-liner{background:url(dt-arrow-dn.png) no-repeat right}tbody .yui3-datatable-editable{cursor:pointer}.yui3-datatable-editor{text-align:left;background-color:#f2f2f2;border:1px solid #808080;padding:6px}.yui3-datatable-editor label{padding-left:4px;padding-right:6px}.yui3-datatable-editor .yui3-datatable-button{padding-top:6px;text-align:right}.yui3-datatable-editor .yui3-datatable-button button{background:url(sprite.png) repeat-x 0 0;border:1px solid #999;width:4em;height:1.8em;margin-left:6px}.yui3-datatable-editor .yui3-datatable-button button.yui3-datatable-default{background:url(sprite.png) repeat-x 0 -1400px;background-color:#5584e0;border:1px solid #304369;color:#FFF}.yui3-datatable-editor .yui3-datatable-button button:hover{background:url(sprite.png) repeat-x 0 -1300px;color:#000}.yui3-datatable-editor .yui3-datatable-button button:active{background:url(sprite.png) repeat-x 0 -1700px;color:#000}.yui3-skin-sam .yui3-datatable td{background-color:transparent}.yui3-skin-sam tr.yui3-datatable-even td{background-color:#FFF}.yui3-skin-sam tr.yui3-datatable-odd td{background-color:#edf5ff}.yui3-skin-sam tr.yui3-datatable-even td.yui3-datatable-asc,.yui3-skin-sam tr.yui3-datatable-even td.yui3-datatable-desc{background-color:#edf5ff}.yui3-skin-sam tr.yui3-datatable-odd td.yui3-datatable-asc,.yui3-skin-sam tr.yui3-datatable-odd td.yui3-datatable-desc{background-color:#dbeaff}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-even{background-color:#FFF}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-odd{background-color:#FFF}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-even td.yui3-datatable-asc,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-even td.yui3-datatable-desc{background-color:#edf5ff}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-odd td.yui3-datatable-asc,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-odd td.yui3-datatable-desc{background-color:#edf5ff}.yui3-skin-sam th.yui3-datatable-highlighted,.yui3-skin-sam th.yui3-datatable-highlighted a{background-color:#b2d2ff}.yui3-skin-sam tr.yui3-datatable-highlighted,.yui3-skin-sam tr.yui3-datatable-highlighted td.yui3-datatable-asc,.yui3-skin-sam tr.yui3-datatable-highlighted td.yui3-datatable-desc,.yui3-skin-sam tr.yui3-datatable-even td.yui3-datatable-highlighted,.yui3-skin-sam tr.yui3-datatable-odd td.yui3-datatable-highlighted{cursor:pointer;background-color:#b2d2ff}
+.yui3-skin-sam .yui3-datatable-list th.yui3-datatable-highlighted,.yui3-skin-sam .yui3-datatable-list th.yui3-datatable-highlighted a{background-color:#b2d2ff}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-highlighted,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-highlighted td.yui3-datatable-asc,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-highlighted td.yui3-datatable-desc,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-even td.yui3-datatable-highlighted,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-odd td.yui3-datatable-highlighted{cursor:pointer;background-color:#b2d2ff}.yui3-skin-sam th.yui3-datatable-selected,.yui3-skin-sam th.yui3-datatable-selected a{background-color:#446cd7}.yui3-skin-sam tr.yui3-datatable-selected td,.yui3-skin-sam tr.yui3-datatable-selected td.yui3-datatable-asc,.yui3-skin-sam tr.yui3-datatable-selected td.yui3-datatable-desc{background-color:#426fd9;color:#FFF}.yui3-skin-sam tr.yui3-datatable-even td.yui3-datatable-selected,.yui3-skin-sam tr.yui3-datatable-odd td.yui3-datatable-selected{background-color:#446cd7;color:#FFF}.yui3-skin-sam .yui3-datatable-list th.yui3-datatable-selected,.yui3-skin-sam .yui3-datatable-list th.yui3-datatable-selected a{background-color:#446cd7}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-selected td,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-selected td.yui3-datatable-asc,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-selected td.yui3-datatable-desc{background-color:#426fd9;color:#FFF}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-even td.yui3-datatable-selected,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-odd td.yui3-datatable-selected{background-color:#446cd7;color:#FFF}.yui3-skin-sam .yui3-datatable-paginator{display:block;margin:6px 0;white-space:nowrap}.yui3-skin-sam .yui3-datatable-paginator .yui3-datatable-first,.yui3-skin-sam .yui3-datatable-paginator .yui3-datatable-last,.yui3-skin-sam .yui3-datatable-paginator .yui3-datatable-selected{padding:2px 6px}.yui3-skin-sam .yui3-datatable-paginator a.yui3-datatable-first,.yui3-skin-sam .yui3-datatable-paginator a.yui3-datatable-last{text-decoration:none}.yui3-skin-sam .yui3-datatable-paginator .yui3-datatable-previous,.yui3-skin-sam .yui3-datatable-paginator .yui3-datatable-next{display:none}.yui3-skin-sam a.yui3-datatable-page{border:1px solid #cbcbcb;padding:2px 6px;text-decoration:none;background-color:#fff}.yui3-skin-sam .yui3-datatable-selected{border:1px solid #fff;background-color:#fff}#yui3-css-stamp.skin-sam-datatable-base-deprecated{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/datatable-base.css'
--- debian/extras/jslibs/yui/assets/skins/sam/datatable-base.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/datatable-base.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-datatable-table{empty-cells:show}.yui3-skin-sam .yui3-datatable-table{margin:0;padding:0;font-family:arial,sans-serif;border-collapse:separate;border-spacing:0;border:1px solid #cbcbcb}.yui3-skin-sam .yui3-datatable-caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.yui3-skin-sam .yui3-datatable-cell,.yui3-skin-sam .yui3-datatable-header{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:4px 10px 4px 10px}.yui3-skin-sam .yui3-datatable-cell:first-child,.yui3-skin-sam .yui3-datatable-first-header{border-left-width:0}.yui3-skin-sam .yui3-datatable-header{background:#fff url(sprite.png) repeat-x 0 0;background-image:-webkit-linear-gradient(transparent 40%,rgba(0,0,0,0.21));background-image:-moz-linear-gradient(top,transparent 40%,rgba(0,0,0,0.21));background-image:-ms-linear-gradient(transparent 40%,rgba(0,0,0,0.21));background-image:-o-linear-gradient(transparent 40%,rgba(0,0,0,0.21));background-image:linear-gradient(transparent 40%,rgba(0,0,0,0.21));color:#000;font-weight:normal;text-align:left;text-shadow:0 1px 1px #fff;vertical-align:bottom;white-space:nowrap}.yui3-skin-sam .yui3-datatable-cell{background-color:transparent}.yui3-skin-sam .yui3-datatable-even .yui3-datatable-cell{background-color:#fff}.yui3-skin-sam .yui3-datatable-odd .yui3-datatable-cell{background-color:#edf5ff}#yui3-css-stamp.skin-sam-datatable-base{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/datatable-message.css'
--- debian/extras/jslibs/yui/assets/skins/sam/datatable-message.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/datatable-message.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-datatable-message{display:none}.yui3-datatable-message-visible .yui3-datatable-message{display:block;display:table-row-group}.yui3-skin-sam .yui3-datatable-message-content{border:0 none;border-bottom:1px solid #cbcbcb;padding:4px 10px}#yui3-css-stamp.skin-sam-datatable-message{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/datatable-scroll.css'
--- debian/extras/jslibs/yui/assets/skins/sam/datatable-scroll.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/datatable-scroll.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-datatable-scrollable-x{_overflow-x:hidden;_position:relative}.yui3-datatable-scrollable-y,.yui3-datatable-scrollable-y .yui3-datatable-x-scroller{_overflow-y:hidden;_position:relative}.yui3-datatable-y-scroller-container{overflow-x:hidden;position:relative}.yui3-datatable-scrollable-y .yui3-datatable-content{position:relative}.yui3-datatable-scrollable-y .yui3-datatable-table .yui3-datatable-columns{visibility:hidden}.yui3-datatable-scroll-columns{position:absolute;width:100%;z-index:2}.yui3-datatable-y-scroller,.yui3-datatable-scrollable-x .yui3-datatable-caption-table{width:100%}.yui3-datatable-x-scroller{position:relative;overflow-x:scroll;overflow-y:hidden}.yui3-datatable-scrollable-y .yui3-datatable-y-scroller{position:relative;overflow-x:hidden;overflow-y:scroll;z-index:1;-webkit-overflow-scrolling:touch}.yui3-datatable-scrollbar{position:absolute;overflow-x:hidden;overflow-y:scroll;z-index:2}.yui3-datatable-scrollbar div{position:absolute;width:1px;visibility:hidden}.yui3-skin-sam .yui3-datatable-scroll-columns{border-collapse:separate;border-spacing:0;font-family:arial,sans-serif;margin:0;padding:0;top:0;left:0}.yui3-skin-sam .yui3-datatable-scroll-columns .yui3-datatable-header{padding:0}.yui3-skin-sam .yui3-datatable-x-scroller,.yui3-skin-sam .yui3-datatable-y-scroller-container{border:1px solid #cbcbcb}.yui3-skin-sam .yui3-datatable-scrollable-x .yui3-datatable-y-scroller-container,.yui3-skin-sam .yui3-datatable-x-scroller .yui3-datatable-table,.yui3-skin-sam .yui3-datatable-y-scroller .yui3-datatable-table{border:0 none}#yui3-css-stamp.skin-sam-datatable-scroll{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/datatable-sort.css'
--- debian/extras/jslibs/yui/assets/skins/sam/datatable-sort.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/datatable-sort.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-datatable-sortable-column{z-index:1}.yui3-datatable-sortable-column:focus,.yui3-datatable-sortable-column:active{z-index:2}.yui3-skin-sam .yui3-datatable-sortable-column{cursor:pointer}.yui3-skin-sam .yui3-datatable-columns .yui3-datatable-sorted,.yui3-skin-sam .yui3-datatable-sortable-column:hover{*background:#c1c4c8 url(sprite.png) repeat-x 0 -100px;background-color:#f1f2f3}.yui3-skin-sam .yui3-datatable-sort-liner{display:block;height:100%;position:relative;padding-right:15px;position:relative}.yui3-skin-sam .yui3-datatable-sort-indicator{position:absolute;right:0;bottom:.5ex;width:7px;height:10px;background:url(sort-arrow-sprite.png) no-repeat 0 0;_background:url(sort-arrow-sprite-ie.png) no-repeat 0 0;overflow:hidden}.yui3-skin-sam .yui3-datatable-sorted .yui3-datatable-sort-indicator{background-position:0 -10px}.yui3-skin-sam .yui3-datatable-sorted-desc .yui3-datatable-sort-indicator{background-position:0 -20px}.yui3-skin-sam .yui3-datatable-data .yui3-datatable-even .yui3-datatable-sorted{background-color:#edf5ff}.yui3-skin-sam .yui3-datatable-data .yui3-datatable-odd .yui3-datatable-sorted{background-color:#dbeaff}#yui3-css-stamp.skin-sam-datatable-sort{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/dial.css'
--- debian/extras/jslibs/yui/assets/skins/sam/dial.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/dial.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+v\:oval,v\:shadow,v\:fill{behavior:url(#default#VML);display:inline-block;zoom:1;*display:inline}.yui3-dial{position:relative;display:-moz-inline-stack;display:inline-block;zoom:1;*display:inline}.yui3-dial-content,.yui3-dial-ring{position:relative}.yui3-dial-handle,.yui3-dial-marker,.yui3-dial-center-button,.yui3-dial-reset-string,.yui3-dial-handle-vml,.yui3-dial-marker-vml,.yui3-dial-center-button-vml,.yui3-dial-ring-vml v\:oval,.yui3-dial-center-button-vml v\:oval{position:absolute}.yui3-dial-center-button-vml v\:oval{font-size:1px;top:0;left:0}.yui3-dial-content .yui3-dial-ring .yui3-dial-hidden v\:oval,.yui3-dial-content .yui3-dial-ring .yui3-dial-hidden{opacity:0;filter:alpha(opacity=0)}.yui3-skin-sam .yui3-dial-handle{background:#6c3a3a;opacity:.3;-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.9) inset;cursor:pointer;font-size:1px}.yui3-skin-sam .yui3-dial-ring{background:#bebdb7;background:-moz-linear-gradient(100% 100% 135deg,#7b7a6d,#fff);background:-webkit-gradient(linear,left top,right bottom,from(#fff),to(#7b7a6d));box-shadow:1px 1px 5px rgba(0,0,0,0.4) inset;-webkit-box-shadow:1px 1px 5px rgba(0,0,0,0.4) inset;-moz-box-shadow:1px 1px 5px rgba(0,0,0,0.4) inset}.yui3-skin-sam .yui3-dial-center-button{box-shadow:-1px -1px 2px rgba(0,0,0,0.3) inset,1px 1px 2px rgba(0,0,0,0.5);-moz-box-shadow:-1px -1px 2px rgba(0,0,0,0.3) inset,1px 1px 2px rgba(0,0,0,0.5);background:#dddbd4;background:-moz-radial-gradient(30% 30% 0deg,circle farthest-side,#fbfbf9 24%,#f2f0ea 41%,#d3d0c3 83%) repeat scroll 0 0 transparent;background:-webkit-gradient(radial,15 15,15,30 30,40,from(#fbfbf9),to(#d3d0c3),color-stop(.2,#f2f0ea));cursor:pointer;opacity:.7}.yui3-skin-sam .yui3-dial-reset-string{color:#676767;font-size:85%;text-decoration:underline}.yui3-skin-sam .yui3-dial-label{color:#808080;margin-bottom:.8em}.yui3-skin-sam .yui3-dial-value-string{margin-left:.5em;color:#000;font-size:130%}.yui3-skin-sam .yui3-dial-value{visibility:hidden;position:absolute;top:0;left:102%;width:4em}.yui3-skin-sam .yui3-dial-north-mark{position:absolute;border-left:2px solid #ccc;height:5px;width:10px;left:50%;top:-7px;font-size:1px}.yui3-skin-sam .yui3-dial-marker{background-color:#000;opacity:.2;font-size:1px}.yui3-skin-sam .yui3-dial-marker-max-min{background-color:#ab3232;opacity:.6}.yui3-skin-sam .yui3-dial-ring-vml,.yui3-skin-sam .yui3-dial-center-button-vml,.yui3-skin-sam .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-sam v\:oval.yui3-dial-marker-max-min,.yui3-skin-sam .yui3-dial-marker-vml,.yui3-skin-sam .yui3-dial-handle-vml{background:0;opacity:1}#yui3-css-stamp.skin-sam-dial{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/horizontal-menu-submenu-indicator.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/horizontal-menu-submenu-indicator.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/horizontal-menu-submenu-indicator.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/horizontal-menu-submenu-toggle.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/horizontal-menu-submenu-toggle.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/horizontal-menu-submenu-toggle.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/node-flick.css'
--- debian/extras/jslibs/yui/assets/skins/sam/node-flick.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/node-flick.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-flick{position:relative;overflow:hidden}.yui3-flick-content{position:relative}#yui3-css-stamp.skin-sam-node-flick{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/node-menunav.css'
--- debian/extras/jslibs/yui/assets/skins/sam/node-menunav.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/node-menunav.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-menu .yui3-menu{position:absolute;z-index:1}.yui3-menu .yui3-shim{position:absolute;top:0;left:0;z-index:-1;opacity:0;filter:alpha(opacity=0);border:0;margin:0;padding:0;height:100%;width:100%}.yui3-menu-hidden{top:-10000px;left:-10000px;visibility:hidden}.yui3-menu li{list-style-type:none}.yui3-menu ul,.yui3-menu li{margin:0;padding:0}.yui3-menu-label,.yui3-menuitem-content{text-align:left;white-space:nowrap;display:block}.yui3-menu-horizontal li{float:left;width:auto}.yui3-menu-horizontal li li{float:none}.yui3-menu-horizontal ul{*zoom:1}.yui3-menu-horizontal ul ul{*zoom:normal}.yui3-menu-horizontal>.yui3-menu-content>ul:after{content:"";display:block;clear:both;line-height:0;font-size:0;visibility:hidden}.yui3-menu-content{*zoom:1}.yui3-menu-hidden .yui3-menu-content{*zoom:normal}.yui3-menuitem-content,.yui3-menu-label{_zoom:1}.yui3-menu-hidden .yui3-menuitem-content,.yui3-menu-hidden .yui3-menu-label{_zoom:normal}.yui3-skin-sam .yui3-menu-content,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menu-content{font-size:93%;line-height:1.5;*line-height:1.45;border:solid 1px #808080;background:#fff;padding:3px 0}.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menu-content{font-size:100%}.yui3-skin-sam .yui3-menu-horizontal .yui3-menu-content{line-height:2;*line-height:1.9;background:url(sprite.png) repeat-x 0 0;padding:0}.yui3-skin-sam .yui3-menu ul,.yui3-skin-sam .yui3-menu ul ul{margin-top:3px;padding-top:3px;border-top:solid 1px #ccc}.yui3-skin-sam .yui3-menu ul.first-of-type{border:0;margin:0;padding:0}.yui3-skin-sam .yui3-menu-horizontal ul{padding:0;margin:0;border:0}.yui3-skin-sam .yui3-menu li,.yui3-skin-sam .yui3-menu .yui3-menu li{_border-bottom:solid 1px #fff}.yui3-skin-sam .yui3-menu-horizontal li{_border-bottom:0}.yui3-skin-sam .yui3-menubuttonnav li{border-right:solid 1px #ccc}.yui3-skin-sam .yui3-splitbuttonnav li{border-right:solid 1px #808080}.yui3-skin-sam .yui3-menubuttonnav li li,.yui3-skin-sam .yui3-splitbuttonnav li li{border-right:0}.yui3-skin-sam .yui3-menu-label,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menu-label,.yui3-skin-sam .yui3-menuitem-content,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menuitem-content{padding:0 1em;color:#000;text-decoration:none;cursor:default;float:none;border:0;margin:0}.yui3-skin-sam .yui3-menu-horizontal .yui3-menu-label,.yui3-skin-sam .yui3-menu-horizontal .yui3-menuitem-content{padding:0 10px;border-style:solid;border-color:#808080;border-width:1px 0;margin:-1px 0;float:left;width:auto}.yui3-skin-sam .yui3-menu-label,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menu-label{background:url(vertical-menu-submenu-indicator.png) right center no-repeat}.yui3-skin-sam .yui3-menu-horizontal .yui3-menu-label{background:url(sprite.png) repeat-x 0 0}.yui3-skin-sam .yui3-menubuttonnav .yui3-menu-label,.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label{background-image:none}.yui3-skin-sam .yui3-menubuttonnav .yui3-menu-label{padding-right:0}.yui3-skin-sam .yui3-menubuttonnav .yui3-menu-label em{font-style:normal;padding-right:20px;display:block;background:url(horizontal-menu-submenu-indicator.png) right center no-repeat}.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label{padding:0}.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label a{float:left;width:auto;color:#000;text-decoration:none;cursor:default;padding:0 5px 0 10px}.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label .yui3-menu-toggle{padding:0;border-left:solid 1px #ccc;width:15px;overflow:hidden;text-indent:-1000px;background:url(horizontal-menu-submenu-indicator.png) 3px center no-repeat}.yui3-skin-sam .yui3-menu-label-active,.yui3-skin-sam .yui3-menu-label-menuvisible,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menu-label-active,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menu-label-menuvisible{background-color:#b3d4ff}.yui3-skin-sam .yui3-menuitem-active .yui3-menuitem-content,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menuitem-active .yui3-menuitem-content{background-image:none;background-color:#b3d4ff;border-left-width:0;margin-left:0}.yui3-skin-sam .yui3-menu-horizontal .yui3-menu-label-active,.yui3-skin-sam .yui3-menu-horizontal .yui3-menuitem-active .yui3-menuitem-content,.yui3-skin-sam .yui3-menu-horizontal .yui3-menu-label-menuvisible{border-color:#7d98b8;background:url(sprite.png) repeat-x 0 -1700px}.yui3-skin-sam .yui3-menubuttonnav .yui3-menu-label-active,.yui3-skin-sam .yui3-menubuttonnav .yui3-menuitem-active .yui3-menuitem-content,.yui3-skin-sam .yui3-menubuttonnav .yui3-menu-label-menuvisible,.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label-active,.yui3-skin-sam .yui3-splitbuttonnav .yui3-menuitem-active .yui3-menuitem-content,.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label-menuvisible{border-left-width:1px;margin-left:-1px}.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label-menuvisible{border-color:#808080;background:transparent}.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label-menuvisible .yui3-menu-toggle{border-color:#7d98b8;background:url(horizontal-menu-submenu-toggle.png) left center no-repeat}#yui3-css-stamp.skin-sam-node-menunav{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/overlay.css'
--- debian/extras/jslibs/yui/assets/skins/sam/overlay.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/overlay.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-overlay{position:absolute}.yui3-overlay-hidden{visibility:hidden}.yui3-widget-tmp-forcesize .yui3-overlay-content{overflow:hidden!important}#yui3-css-stamp.skin-sam-overlay{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/panel.css'
--- debian/extras/jslibs/yui/assets/skins/sam/panel.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/panel.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-panel{position:absolute}.yui3-panel-hidden{visibility:hidden}.yui3-widget-tmp-forcesize .yui3-panel-content{overflow:hidden!important}.yui3-panel .yui3-widget-hd{position:relative}.yui3-panel .yui3-widget-hd .yui3-widget-buttons{position:absolute;top:0;right:0}.yui3-panel .yui3-widget-ft .yui3-widget-buttons{display:inline-block;*display:inline;zoom:1}.yui3-skin-sam .yui3-panel-content{-webkit-box-shadow:0 0 5px #333;-moz-box-shadow:0 0 5px #333;box-shadow:0 0 5px #333;border:1px solid black;background:white}.yui3-skin-sam .yui3-panel .yui3-widget-hd{padding:8px 28px 8px 8px;min-height:13px;_height:13px;color:white;background-color:#3961c5;background:-moz-linear-gradient(0% 100% 90deg,#2647a0 7%,#3d67ce 50%,#426fd9 100%);background:-webkit-gradient(linear,left bottom,left top,from(#2647a0),color-stop(0.07,#2647a0),color-stop(0.5,#3d67ce),to(#426fd9))}.yui3-skin-sam .yui3-panel .yui3-widget-hd .yui3-widget-buttons{padding:8px}.yui3-skin-sam .yui3-panel .yui3-widget-bd{padding:10px}.yui3-skin-sam .yui3-panel .yui3-widget-ft{background:#edf5ff;padding:8px;text-align:right}.yui3-skin-sam .yui3-panel .yui3-widget-ft .yui3-button{margin-left:8px}.yui3-skin-sam .yui3-panel .yui3-widget-hd .yui3-button-close{background:transparent;filter:none;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;width:13px;height:13px;padding:0;overflow:hidden;vertical-align:top;*font-size:0;*line-height:0;*letter-spacing:-1000px;*color:#86a5ec;*background:url(sprite_icons.png) no-repeat 1px 1px}.yui3-skin-sam .yui3-panel .yui3-widget-hd .yui3-button-close:before{content:url(sprite_icons.png);display:inline-block;text-align:center;font-size:0;line-height:0;width:13px;margin:1px 0 0 1px}.yui3-skin-sam .yui3-panel-hidden .yui3-widget-hd .yui3-button-close{display:none}#yui3-css-stamp.skin-sam-panel{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/rail-x-lines.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/rail-x-lines.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/rail-x-lines.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/rail-x.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/rail-x.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/rail-x.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/rail-y-lines.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/rail-y-lines.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/rail-y-lines.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/rail-y.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/rail-y.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/rail-y.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/resize-base.css'
--- debian/extras/jslibs/yui/assets/skins/sam/resize-base.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/resize-base.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-resize,.yui3-resize-wrapper{z-index:0;zoom:1}.yui3-resize-handle{position:absolute;display:block;z-index:100;zoom:1}.yui3-resize-proxy{position:absolute;border:1px dashed #000;position:absolute;z-index:10000}.yui3-resize-hidden-handles .yui3-resize-handle{opacity:0;filter:alpha(opacity=0)}.yui3-resize-handle-t,.yui3-resize-handle-b{width:100%;left:0;height:6px}.yui3-resize-handle-l,.yui3-resize-handle-r{height:100%;top:0;width:6px}.yui3-resize-handle-t{cursor:n-resize;top:0}.yui3-resize-handle-b{cursor:s-resize;bottom:0}.yui3-resize-handle-l{cursor:w-resize;left:0}.yui3-resize-handle-r{cursor:e-resize;right:0}.yui3-resize-handle-inner{position:absolute;zoom:1}.yui3-resize-handle-inner-t,.yui3-resize-handle-inner-b{margin-left:-8px;left:50%}.yui3-resize-handle-inner-l,.yui3-resize-handle-inner-r{margin-top:-8px;top:50%}.yui3-resize-handle-inner-t{top:-4px}.yui3-resize-handle-inner-b{bottom:-4px}.yui3-resize-handle-inner-l{left:-4px}.yui3-resize-handle-inner-r{right:-4px}.yui3-resize-handle-tr,.yui3-resize-handle-br,.yui3-resize-handle-tl,.yui3-resize-handle-bl{height:15px;width:15px;z-index:200}.yui3-resize-handle-tr{cursor:ne-resize;top:0;right:0}.yui3-resize-handle-tl{cursor:nw-resize;top:0;left:0}.yui3-resize-handle-br{cursor:se-resize;bottom:0;right:0}.yui3-resize-handle-bl{cursor:sw-resize;bottom:0;left:0}.yui3-resize-handle-inner-r,.yui3-resize-handle-inner-l,.yui3-resize-handle-inner-t,.yui3-resize-handle-inner-b,.yui3-resize-handle-inner-tr,.yui3-resize-handle-inner-br,.yui3-resize-handle-inner-tl,.yui3-resize-handle-inner-bl{background-repeat:no-repeat;background:url(arrows.png) no-repeat 0 0;display:block;height:15px;overflow:hidden;text-indent:-99999em;width:15px}.yui3-resize-handle-inner-br{background-position:-30px 0;bottom:-2px;right:-2px}.yui3-resize-handle-inner-tr{background-position:-58px 0;bottom:0;right:-2px}.yui3-resize-handle-inner-bl{background-position:-75px 0;bottom:-2px;right:-2px}.yui3-resize-handle-inner-tl{background-position:-47px 0;bottom:0;right:-2px}.yui3-resize-handle-inner-b,.yui3-resize-handle-inner-t{background-position:-15px 0}#yui3-css-stamp.skin-sam-resize-base{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/scrollview-base.css'
--- debian/extras/jslibs/yui/assets/skins/sam/scrollview-base.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/scrollview-base.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-scrollview{position:relative;overflow:hidden;-webkit-user-select:none;-moz-user-select:none}.yui3-scrollview-hidden{display:none}.yui3-scrollview-content{position:relative}.yui3-skin-sam .yui3-scrollview{-webkit-tap-highlight-color:rgba(255,255,255,0)}#yui3-css-stamp.skin-sam-scrollview-base{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/scrollview-list.css'
--- debian/extras/jslibs/yui/assets/skins/sam/scrollview-list.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/scrollview-list.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-skin-sam .yui3-scrollview{-webkit-tap-highlight-color:rgba(255,255,255,0)}.yui3-skin-sam .yui3-scrollview{background-color:white}.yui3-skin-sam .yui3-scrollview-vert .yui3-scrollview-content .yui3-scrollview-item{*zoom:1}.yui3-skin-sam .yui3-scrollview-vert .yui3-scrollview-content .yui3-scrollview-list{*zoom:1;list-style:none;padding:0;margin:0}.yui3-skin-sam .yui3-scrollview-vert .yui3-scrollview-content{border-top:0;background-color:white;font-family:HelveticaNeue,arial,helvetica,clean,sans-serif;color:black}.yui3-skin-sam .yui3-scrollview-vert .yui3-scrollview-content .yui3-scrollview-item{border-bottom:1px solid #303030;padding:15px 20px 16px;font-size:100%;font-weight:bold;background-color:white;cursor:pointer}#yui3-css-stamp.skin-sam-scrollview-list{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/scrollview-scrollbars.css'
--- debian/extras/jslibs/yui/assets/skins/sam/scrollview-scrollbars.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/scrollview-scrollbars.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-scrollview-scrollbar{opacity:1;position:absolute;width:6px;height:10px}.yui3-scrollview-scrollbar{top:0;right:1px}.yui3-scrollview-scrollbar-horiz{top:auto;height:8px;width:20px;bottom:1px;left:0}.yui3-scrollview-scrollbar .yui3-scrollview-child{position:absolute;right:0;display:block;width:100%;height:4px}.yui3-scrollview-scrollbar .yui3-scrollview-first{top:0}.yui3-scrollview-scrollbar .yui3-scrollview-last{top:0}.yui3-scrollview-scrollbar .yui3-scrollview-middle{position:absolute;top:4px;height:1px}.yui3-scrollview-scrollbar-horiz .yui3-scrollview-child{display:-moz-inline-stack;display:inline-block;zoom:1;*display:inline;top:0;left:0;bottom:auto;right:auto}.yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{width:4px;height:6px}.yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{top:0;left:4px;width:1px;height:6px}.yui3-scrollview-scrollbar-vert-basic{height:auto}.yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child{position:static;_overflow:hidden;_line-height:4px}.yui3-scrollview-scrollbar-horiz-basic{width:auto;white-space:nowrap;line-height:6px;_overflow:hidden}.yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{position:static;padding:0;margin:0;top:auto;left:auto;right:auto;bottom:auto}.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none}#yui3-css-stamp.skin-sam-scrollview-scrollbars{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/skin.css'
--- debian/extras/jslibs/yui/assets/skins/sam/skin.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/skin.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,35 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-aclist{position:absolute;z-index:1}.yui3-aclist-hidden{visibility:hidden}.yui3-aclist-aria{left:-9999px;position:absolute}.yui3-aclist-list{list-style:none;margin:0;overflow:hidden;padding:0}.yui3-aclist-item{cursor:pointer;list-style:none;padding:2px 5px}.yui3-aclist-item-active{outline:#afafaf dotted thin}.yui3-skin-sam .yui3-aclist-content{background:#fff;border:1px solid #afafaf;-moz-box-shadow:1px 1px 4px rgba(0,0,0,0.58);-webkit-box-shadow:1px 1px 4px rgba(0,0,0,0.58);box-shadow:1px 1px 4px rgba(0,0,0,0.58)}.yui3-skin-sam .yui3-aclist-item-hover{background:#bfdaff}.yui3-skin-sam .yui3-aclist-item-active{background:#2647a0;color:#fff;outline:0}#yui3-css-stamp.skin-sam-autocomplete-list{display:none}
+.yui3-calendar-pane{width:100%}.yui3-calendar-grid{width:100%}.yui3-calendar-column-hidden,.yui3-calendar-hidden{display:none}.yui3-skin-sam .yui3-calendar-content{padding:10px;color:#000;border:1px solid gray;background:#f2f2f2;background:-moz-linear-gradient(top,#f9f9f9 0,#f2f2f2 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#f9f9f9),color-stop(100%,#f2f2f2));background:-webkit-linear-gradient(top,#f9f9f9 0,#f2f2f2 100%);background:-o-linear-gradient(top,#f9f9f9 0,#f2f2f2 100%);background:-ms-linear-gradient(top,#f9f9f9 0,#f2f2f2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9',endColorstr='#f2f2f2',GradientType=0);background:linear-gradient(top,#f9f9f9 0,#f2f2f2 100%);-moz-border-radius:5px;border-radius:5px}.yui3-skin-sam .yui3-calendar-grid{padding:5px;border-collapse:collapse}.yui3-skin-sam .yui3-calendar-header{padding-bottom:10px}.yui3-skin-sam .yui3-calendar-header-label{margin:0;font-size:1em;font-weight:bold}.yui3-skin-sam .yui3-calendar-day,.yui3-skin-sam .yui3-calendar-prevmonth-day,.yui3-skin-sam .yui3-calendar-nextmonth-day{padding:5px;border:1px solid #ccc;background:#fff;text-align:center}.yui3-skin-sam .yui3-calendar-day:hover{background:#06c;color:#fff}.yui3-skin-sam .yui3-calendar-selection-disabled,.yui3-skin-sam .yui3-calendar-selection-disabled:hover{color:#a6a6a6;background:#ccc}.yui3-skin-sam .yui3-calendar-weekday{font-weight:bold}.yui3-skin-sam .yui3-calendar-prevmonth-day,.yui3-skin-sam .yui3-calendar-nextmonth-day{color:#a6a6a6}.yui3-skin-sam .yui3-calendar-day{font-weight:bold}.yui3-skin-sam .yui3-calendar-day-selected{background-color:#b3d4ff;color:#000}.yui3-skin-sam .yui3-calendar-header-label{text-align:center}.yui3-skin-sam .yui3-calendar-left-grid{margin-right:1em}.yui3-skin-sam .yui3-calendar-right-grid{margin-left:1em}.yui3-skin-sam .yui3-calendar-day-highlighted{background-color:#dcdef5}.yui3-skin-sam .yui3-calendar-day-selected.yui3-calendar-day-highlighted{background-color:#758fbb}
+.yui3-calendar-column-hidden,.yui3-calendar-hidden{display:none}.yui3-calendar-day{cursor:pointer}.yui3-calendar-selection-disabled{cursor:default}.yui3-calendar-prevmonth-day{cursor:default}.yui3-calendar-nextmonth-day{cursor:default}.yui3-calendar-content:hover .yui3-calendar-day,.yui3-calendar-content:hover .yui3-calendar-prevmonth-day,.yui3-calendar-content:hover .yui3-calendar-nextmonth-day{-moz-user-select:none}.yui3-skin-sam .yui3-calendar-day-highlighted{background-color:#dcdef5}.yui3-skin-sam .yui3-calendar-day-selected.yui3-calendar-day-highlighted{background-color:#758fbb}
+.yui3-calendar-header{padding-left:15px;padding-right:15px}.yui3-calendar-header-label{width:100%}.yui3-calendarnav-prevmonth{cursor:pointer}.yui3-calendarnav-nextmonth{cursor:pointer}.yui3-skin-sam .yui3-calendarnav-prevmonth,.yui3-skin-sam .yui3-calendarnav-nextmonth{color:#000;width:12px;height:14px;background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAOCAYAAAA1+Nx+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKNJREFUeNpiYCAeSAPxUiiWZqAi4ATiaiD+DMT/ofgzVIyTUsMDgfghksHo+CFUDcnAAIgP4DEYHR+A6iEIhIB4GgkGo+NpUDMwADMQFwHxBwoMh+EPULOYYYZ7APFVKhiMjkFmejBBLWFjoD5gQ+dQO4iwOloUiOdQYPgcqBkDl0zRQRQRGS2KGkVFHRB/QzL4G1SMk5qpQg6psJMjVhNAgAEAH+qPqeiPEUsAAAAASUVORK5CYII=);background-repeat:no-repeat}.yui3-skin-sam .yui3-calendarnav-prevmonth:hover,.yui3-skin-sam .yui3-calendarnav-nextmonth:hover{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAOCAYAAAA1+Nx+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPpJREFUeNpi/P//PwMxQD9jszSQ6oJyyy7O8H1KjD5GQhYADeYEUkVAXAHEPFDhL0DcAcR9QIu+k20B0PBAIDUBiOVwKHkExAVAS9aTZAHQYAOowfYMxIGDUIsu4LUAaLAQkGoB4kwG8sB0IK4BWvQOxQKgwcxAdj4Q1wExPwNl4CMQNwHxRKBFfxn10jd5ADm9QKzFQF1wDYiLmaAcNgbqA7CZTEBv7ADS2iDboN5joEIQgczSBpmNHsmiQKodiJPJNHwuEFcCDX49MMkUi0VRUB/hy2ggFy+jtKgohRYVnFDh79CiopuiogLNIjmobxigrn5EjD6AAAMAok9vhfHG8wQAAAAASUVORK5CYII=);color:#06c}.yui3-skin-sam .yui3-calendarnav-month-disabled,.yui3-skin-sam .yui3-calendarnav-month-disabled:hover{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAOCAYAAAA1+Nx+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQhJREFUeNqs0yGLAlEUhuHrKoIgCFbBJghb3F+g0WrVarEqLIhBEEFYWKNNMBktU4z6C5RNkwyCyWQSTPuOfCOCrHNnxwMPyOGe73DAiTmOYywrhy/9/sTBZujN4k0KPbioi6teKuqCmsKGSN/10+q5ehN6QQkrLJB/Mp/Xm5VmAhdkMcEGZWNfZc1MlPGwII42dmiZ/1dLGW1lXhdU8YNvZEz0yijLy6z6FyTN6yvpX7DEOzo4vSD4pCwvc+lfcMEYBUwjhE+VMVbmw7/oiCY+sA4RvNZMUxmB38EWFTSwfxK815uKZkJ/yXMU0cf5rn9Wr6g3f1bC4nwvbIAZRup1Ay671a8AAwC3OzOqxK+rkwAAAABJRU5ErkJggg==);cursor:default;color:#ccc}.yui3-skin-sam .yui3-calendarnav-prevmonth,.yui3-skin-sam .yui3-calendarnav-prevmonth:hover{background-position:0 0;margin-left:-12px}.yui3-skin-sam .yui3-calendarnav-nextmonth,.yui3-skin-sam .yui3-calendarnav-nextmonth:hover{background-position:-12px 0;margin-right:-12px}.yui3-skin-sam .yui3-calendarnav-prevmonth span,.yui3-skin-sam .yui3-calendarnav-nextmonth span{display:none;*display:block}
+.yui3-skin-sam .yui3-console-ft .yui3-console-filters-categories,.yui3-skin-sam .yui3-console-ft .yui3-console-filters-sources{text-align:left;padding:5px 0;border:1px inset;margin:0 2px}.yui3-skin-sam .yui3-console-ft .yui3-console-filters-categories{background:#fff;border-bottom:2px ridge}.yui3-skin-sam .yui3-console-ft .yui3-console-filters-sources{background:#fff;margin-bottom:2px;border-top:0 none;border-bottom-right-radius:10px;border-bottom-left-radius:10px;-moz-border-radius-bottomright:10px;-moz-border-radius-bottomleft:10px;-webkit-border-bottom-right-radius:10px;-webkit-border-bottom-left-radius:10px}.yui3-skin-sam .yui3-console-filter-label{white-space:nowrap;margin-left:1ex}#yui3-css-stamp.skin-sam-console-filters{display:none}
+.yui3-skin-sam .yui3-console-separate{position:absolute;right:1em;top:1em;z-index:999}.yui3-skin-sam .yui3-console-inline{display:-moz-inline-stack;display:inline-block;*display:inline;zoom:1;vertical-align:top}.yui3-skin-sam .yui3-console-inline .yui3-console-content{position:relative}.yui3-skin-sam .yui3-console-content{background:#777;_background:#d8d8da url(bg.png) repeat-x 0 0;font:normal 13px/1.3 Arial,sans-serif;text-align:left;border:1px solid #777;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px}.yui3-skin-sam .yui3-console-hd,.yui3-skin-sam .yui3-console-bd,.yui3-skin-sam .yui3-console-ft{position:relative}.yui3-skin-sam .yui3-console-hd,.yui3-skin-sam .yui3-console-ft .yui3-console-controls{text-align:right}.yui3-skin-sam .yui3-console-hd{background:#d8d8da url(bg.png) repeat-x 0 0;padding:1ex;border:1px solid transparent;_border:0 none;border-top-right-radius:10px;border-top-left-radius:10px;-moz-border-radius-topright:10px;-moz-border-radius-topleft:10px;-webkit-border-top-right-radius:10px;-webkit-border-top-left-radius:10px}.yui3-skin-sam .yui3-console-bd{background:#fff;border-top:1px solid #777;border-bottom:1px solid #777;color:#000;font-size:11px;overflow:auto;overflow-x:auto;overflow-y:scroll;_width:100%}.yui3-skin-sam .yui3-console-ft{background:#d8d8da url(bg.png) repeat-x 0 0;border:1px solid transparent;_border:0 none;border-bottom-right-radius:10px;border-bottom-left-radius:10px;-moz-border-radius-bottomright:10px;-moz-border-radius-bottomleft:10px;-webkit-border-bottom-right-radius:10px;-webkit-border-bottom-left-radius:10px}.yui3-skin-sam .yui3-console-controls{padding:4px 1ex;zoom:1}.yui3-skin-sam .yui3-console-title{color:#000;display:inline;float:left;font-weight:bold;font-size:13px;height:24px;line-height:24px;margin:0;padding-left:1ex}.yui3-skin-sam .yui3-console-pause-label{float:left}.yui3-skin-sam .yui3-console-button{line-height:1.3}.yui3-skin-sam .yui3-console-collapsed .yui3-console-bd,.yui3-skin-sam .yui3-console-collapsed .yui3-console-ft{display:none}.yui3-skin-sam .yui3-console-content.yui3-console-collapsed{-webkit-border-radius:0}.yui3-skin-sam .yui3-console-collapsed .yui3-console-hd{border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:0}.yui3-skin-sam .yui3-console-entry{border-bottom:1px solid #aaa;min-height:32px;_height:32px}.yui3-skin-sam .yui3-console-entry-meta{margin:0;overflow:hidden}.yui3-skin-sam .yui3-console-entry-content{margin:0;padding:0 1ex;white-space:pre-wrap;word-wrap:break-word}.yui3-skin-sam .yui3-console-entry-meta .yui3-console-entry-src{color:#000;font-style:italic;font-weight:bold;float:right;margin:2px 5px 0 0}.yui3-skin-sam .yui3-console-entry-meta .yui3-console-entry-time{color:#777;padding-left:1ex}.yui3-skin-sam .yui3-console-entry-warn .yui3-console-entry-meta .yui3-console-entry-time{color:#555}.yui3-skin-sam .yui3-console-entry-info .yui3-console-entry-meta .yui3-console-entry-cat,.yui3-skin-sam .yui3-console-entry-warn .yui3-console-entry-meta .yui3-console-entry-cat,.yui3-skin-sam .yui3-console-entry-error .yui3-console-entry-meta .yui3-console-entry-cat{display:none}.yui3-skin-sam .yui3-console-entry-warn{background:#aee url(warn_error.png) no-repeat -15px 15px}.yui3-skin-sam .yui3-console-entry-error{background:#ffa url(warn_error.png) no-repeat 5px -24px;color:#900}.yui3-skin-sam .yui3-console-entry-warn .yui3-console-entry-content,.yui3-skin-sam .yui3-console-entry-error .yui3-console-entry-content{padding-left:24px}.yui3-skin-sam .yui3-console-entry-cat{text-transform:uppercase;padding:1px 4px;background-color:#ccc}.yui3-skin-sam .yui3-console-entry-info .yui3-console-entry-cat{background-color:#ac2}.yui3-skin-sam .yui3-console-entry-warn .yui3-console-entry-cat{background-color:#e81}.yui3-skin-sam .yui3-console-entry-error .yui3-console-entry-cat{background-color:#b00;color:#fff}.yui3-skin-sam .yui3-console-hidden{display:none}#yui3-css-stamp.skin-sam-console{display:none}
+.yui3-skin-sam .yui3-datatable-mask{position:absolute;z-index:9500}.yui3-datatable-tmp{position:absolute;left:-9000px}.yui3-datatable-scrollable .yui3-datatable-bd{overflow:auto}.yui3-datatable-scrollable .yui3-datatable-hd{overflow:hidden;position:relative}.yui3-datatable-scrollable .yui3-datatable-bd thead tr,.yui3-datatable-scrollable .yui3-datatable-bd thead th{position:absolute;left:-1500px}.yui3-datatable-scrollable tbody{-moz-outline:0}.yui3-skin-sam thead .yui3-datatable-sortable{cursor:pointer}.yui3-skin-sam thead .yui3-datatable-draggable{cursor:move}.yui3-datatable-coltarget{position:absolute;z-index:999}.yui3-datatable-hd{zoom:1}th.yui3-datatable-resizeable .yui3-datatable-resizerliner{position:relative}.yui3-datatable-resizer{position:absolute;right:0;bottom:0;height:100%;cursor:e-resize;cursor:col-resize;background-color:#CCC;opacity:0;filter:alpha(opacity=0)}.yui3-datatable-resizerproxy{visibility:hidden;position:absolute;z-index:9000;background-color:#CCC;opacity:0;filter:alpha(opacity=0)}th.yui3-datatable-hidden .yui3-datatable-liner,td.yui3-datatable-hidden .yui3-datatable-liner,th.yui3-datatable-hidden .yui3-datatable-resizer{display:none}.yui3-datatable-editor,.yui3-datatable-editor-shim{position:absolute;z-index:9000}.yui3-skin-sam .yui3-datatable table{margin:0;padding:0;font-family:arial;font-size:inherit;border-collapse:separate;*border-collapse:collapse;border-spacing:0;border:1px solid #7f7f7f}.yui3-skin-sam .yui3-datatable thead{border-spacing:0}.yui3-skin-sam .yui3-datatable caption{color:#000;font-size:85%;font-weight:normal;font-style:italic;line-height:1;padding:1em 0;text-align:center}.yui3-skin-sam .yui3-datatable th{background:#d8d8da url(sprite.png) repeat-x 0 0}.yui3-skin-sam .yui3-datatable th,.yui3-skin-sam .yui3-datatable th a{font-weight:normal;text-decoration:none;color:#000;vertical-align:bottom}.yui3-skin-sam .yui3-datatable th{margin:0;padding:0;border:0;border-right:1px solid #cbcbcb}.yui3-skin-sam .yui3-datatable tr.yui3-datatable-first td{border-top:1px solid #7f7f7f}.yui3-skin-sam .yui3-datatable th .yui3-datatable-liner{white-space:nowrap}.yui3-skin-sam .yui3-datatable-liner{margin:0;padding:0;padding:4px 10px 4px 10px;overflow:visible;border:0 solid black}.yui3-skin-sam .yui3-datatable-coltarget{width:5px;background-color:red}.yui3-skin-sam .yui3-datatable td{margin:0;padding:0;border:0;border-right:1px solid #cbcbcb;text-align:left}.yui3-skin-sam .yui3-datatable-list td{border-right:0}.yui3-skin-sam .yui3-datatable-resizer{width:6px}.yui3-skin-sam .yui3-datatable-mask{background-color:#000;opacity:.25;filter:alpha(opacity=25)}.yui3-skin-sam .yui3-datatable-message{background-color:#FFF}.yui3-skin-sam .yui3-datatable-scrollable table{border:0}.yui3-skin-sam .yui3-datatable-scrollable .yui3-datatable-hd{border-left:1px solid #7f7f7f;border-top:1px solid #7f7f7f;border-right:1px solid #7f7f7f}.yui3-skin-sam .yui3-datatable-scrollable .yui3-datatable-bd{border-left:1px solid #7f7f7f;border-bottom:1px solid #7f7f7f;border-right:1px solid #7f7f7f;background-color:#FFF}.yui3-skin-sam .yui3-datatable-scrollable .yui3-datatable-data tr.yui3-datatable-last td{border-bottom:1px solid #7f7f7f}.yui3-skin-sam th.yui3-datatable-asc,.yui3-skin-sam th.yui3-datatable-desc{background:url(sprite.png) repeat-x 0 -100px}.yui3-skin-sam th.yui3-datatable-sortable .yui3-datatable-liner{padding-right:20px}.yui3-skin-sam th.yui3-datatable-asc .yui3-datatable-liner{background:url(dt-arrow-up.png) no-repeat right}.yui3-skin-sam th.yui3-datatable-desc .yui3-datatable-liner{background:url(dt-arrow-dn.png) no-repeat right}tbody .yui3-datatable-editable{cursor:pointer}.yui3-datatable-editor{text-align:left;background-color:#f2f2f2;border:1px solid #808080;padding:6px}.yui3-datatable-editor label{padding-left:4px;padding-right:6px}.yui3-datatable-editor .yui3-datatable-button{padding-top:6px;text-align:right}.yui3-datatable-editor .yui3-datatable-button button{background:url(sprite.png) repeat-x 0 0;border:1px solid #999;width:4em;height:1.8em;margin-left:6px}.yui3-datatable-editor .yui3-datatable-button button.yui3-datatable-default{background:url(sprite.png) repeat-x 0 -1400px;background-color:#5584e0;border:1px solid #304369;color:#FFF}.yui3-datatable-editor .yui3-datatable-button button:hover{background:url(sprite.png) repeat-x 0 -1300px;color:#000}.yui3-datatable-editor .yui3-datatable-button button:active{background:url(sprite.png) repeat-x 0 -1700px;color:#000}.yui3-skin-sam .yui3-datatable td{background-color:transparent}.yui3-skin-sam tr.yui3-datatable-even td{background-color:#FFF}.yui3-skin-sam tr.yui3-datatable-odd td{background-color:#edf5ff}.yui3-skin-sam tr.yui3-datatable-even td.yui3-datatable-asc,.yui3-skin-sam tr.yui3-datatable-even td.yui3-datatable-desc{background-color:#edf5ff}.yui3-skin-sam tr.yui3-datatable-odd td.yui3-datatable-asc,.yui3-skin-sam tr.yui3-datatable-odd td.yui3-datatable-desc{background-color:#dbeaff}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-even{background-color:#FFF}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-odd{background-color:#FFF}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-even td.yui3-datatable-asc,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-even td.yui3-datatable-desc{background-color:#edf5ff}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-odd td.yui3-datatable-asc,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-odd td.yui3-datatable-desc{background-color:#edf5ff}.yui3-skin-sam th.yui3-datatable-highlighted,.yui3-skin-sam th.yui3-datatable-highlighted a{background-color:#b2d2ff}.yui3-skin-sam tr.yui3-datatable-highlighted,.yui3-skin-sam tr.yui3-datatable-highlighted td.yui3-datatable-asc,.yui3-skin-sam tr.yui3-datatable-highlighted td.yui3-datatable-desc,.yui3-skin-sam tr.yui3-datatable-even td.yui3-datatable-highlighted,.yui3-skin-sam tr.yui3-datatable-odd td.yui3-datatable-highlighted{cursor:pointer;background-color:#b2d2ff}
+.yui3-skin-sam .yui3-datatable-list th.yui3-datatable-highlighted,.yui3-skin-sam .yui3-datatable-list th.yui3-datatable-highlighted a{background-color:#b2d2ff}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-highlighted,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-highlighted td.yui3-datatable-asc,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-highlighted td.yui3-datatable-desc,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-even td.yui3-datatable-highlighted,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-odd td.yui3-datatable-highlighted{cursor:pointer;background-color:#b2d2ff}.yui3-skin-sam th.yui3-datatable-selected,.yui3-skin-sam th.yui3-datatable-selected a{background-color:#446cd7}.yui3-skin-sam tr.yui3-datatable-selected td,.yui3-skin-sam tr.yui3-datatable-selected td.yui3-datatable-asc,.yui3-skin-sam tr.yui3-datatable-selected td.yui3-datatable-desc{background-color:#426fd9;color:#FFF}.yui3-skin-sam tr.yui3-datatable-even td.yui3-datatable-selected,.yui3-skin-sam tr.yui3-datatable-odd td.yui3-datatable-selected{background-color:#446cd7;color:#FFF}.yui3-skin-sam .yui3-datatable-list th.yui3-datatable-selected,.yui3-skin-sam .yui3-datatable-list th.yui3-datatable-selected a{background-color:#446cd7}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-selected td,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-selected td.yui3-datatable-asc,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-selected td.yui3-datatable-desc{background-color:#426fd9;color:#FFF}.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-even td.yui3-datatable-selected,.yui3-skin-sam .yui3-datatable-list tr.yui3-datatable-odd td.yui3-datatable-selected{background-color:#446cd7;color:#FFF}.yui3-skin-sam .yui3-datatable-paginator{display:block;margin:6px 0;white-space:nowrap}.yui3-skin-sam .yui3-datatable-paginator .yui3-datatable-first,.yui3-skin-sam .yui3-datatable-paginator .yui3-datatable-last,.yui3-skin-sam .yui3-datatable-paginator .yui3-datatable-selected{padding:2px 6px}.yui3-skin-sam .yui3-datatable-paginator a.yui3-datatable-first,.yui3-skin-sam .yui3-datatable-paginator a.yui3-datatable-last{text-decoration:none}.yui3-skin-sam .yui3-datatable-paginator .yui3-datatable-previous,.yui3-skin-sam .yui3-datatable-paginator .yui3-datatable-next{display:none}.yui3-skin-sam a.yui3-datatable-page{border:1px solid #cbcbcb;padding:2px 6px;text-decoration:none;background-color:#fff}.yui3-skin-sam .yui3-datatable-selected{border:1px solid #fff;background-color:#fff}#yui3-css-stamp.skin-sam-datatable-base-deprecated{display:none}
+.yui3-datatable-table{empty-cells:show}.yui3-skin-sam .yui3-datatable-table{margin:0;padding:0;font-family:arial,sans-serif;border-collapse:separate;border-spacing:0;border:1px solid #cbcbcb}.yui3-skin-sam .yui3-datatable-caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.yui3-skin-sam .yui3-datatable-cell,.yui3-skin-sam .yui3-datatable-header{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:4px 10px 4px 10px}.yui3-skin-sam .yui3-datatable-cell:first-child,.yui3-skin-sam .yui3-datatable-first-header{border-left-width:0}.yui3-skin-sam .yui3-datatable-header{background:#fff url(sprite.png) repeat-x 0 0;background-image:-webkit-linear-gradient(transparent 40%,rgba(0,0,0,0.21));background-image:-moz-linear-gradient(top,transparent 40%,rgba(0,0,0,0.21));background-image:-ms-linear-gradient(transparent 40%,rgba(0,0,0,0.21));background-image:-o-linear-gradient(transparent 40%,rgba(0,0,0,0.21));background-image:linear-gradient(transparent 40%,rgba(0,0,0,0.21));color:#000;font-weight:normal;text-align:left;text-shadow:0 1px 1px #fff;vertical-align:bottom;white-space:nowrap}.yui3-skin-sam .yui3-datatable-cell{background-color:transparent}.yui3-skin-sam .yui3-datatable-even .yui3-datatable-cell{background-color:#fff}.yui3-skin-sam .yui3-datatable-odd .yui3-datatable-cell{background-color:#edf5ff}#yui3-css-stamp.skin-sam-datatable-base{display:none}
+.yui3-datatable-message{display:none}.yui3-datatable-message-visible .yui3-datatable-message{display:block;display:table-row-group}.yui3-skin-sam .yui3-datatable-message-content{border:0 none;border-bottom:1px solid #cbcbcb;padding:4px 10px}#yui3-css-stamp.skin-sam-datatable-message{display:none}
+.yui3-datatable-scrollable-x{_overflow-x:hidden;_position:relative}.yui3-datatable-scrollable-y,.yui3-datatable-scrollable-y .yui3-datatable-x-scroller{_overflow-y:hidden;_position:relative}.yui3-datatable-y-scroller-container{overflow-x:hidden;position:relative}.yui3-datatable-scrollable-y .yui3-datatable-content{position:relative}.yui3-datatable-scrollable-y .yui3-datatable-table .yui3-datatable-columns{visibility:hidden}.yui3-datatable-scroll-columns{position:absolute;width:100%;z-index:2}.yui3-datatable-y-scroller,.yui3-datatable-scrollable-x .yui3-datatable-caption-table{width:100%}.yui3-datatable-x-scroller{position:relative;overflow-x:scroll;overflow-y:hidden}.yui3-datatable-scrollable-y .yui3-datatable-y-scroller{position:relative;overflow-x:hidden;overflow-y:scroll;z-index:1;-webkit-overflow-scrolling:touch}.yui3-datatable-scrollbar{position:absolute;overflow-x:hidden;overflow-y:scroll;z-index:2}.yui3-datatable-scrollbar div{position:absolute;width:1px;visibility:hidden}.yui3-skin-sam .yui3-datatable-scroll-columns{border-collapse:separate;border-spacing:0;font-family:arial,sans-serif;margin:0;padding:0;top:0;left:0}.yui3-skin-sam .yui3-datatable-scroll-columns .yui3-datatable-header{padding:0}.yui3-skin-sam .yui3-datatable-x-scroller,.yui3-skin-sam .yui3-datatable-y-scroller-container{border:1px solid #cbcbcb}.yui3-skin-sam .yui3-datatable-scrollable-x .yui3-datatable-y-scroller-container,.yui3-skin-sam .yui3-datatable-x-scroller .yui3-datatable-table,.yui3-skin-sam .yui3-datatable-y-scroller .yui3-datatable-table{border:0 none}#yui3-css-stamp.skin-sam-datatable-scroll{display:none}
+.yui3-datatable-sortable-column{z-index:1}.yui3-datatable-sortable-column:focus,.yui3-datatable-sortable-column:active{z-index:2}.yui3-skin-sam .yui3-datatable-sortable-column{cursor:pointer}.yui3-skin-sam .yui3-datatable-columns .yui3-datatable-sorted,.yui3-skin-sam .yui3-datatable-sortable-column:hover{*background:#c1c4c8 url(sprite.png) repeat-x 0 -100px;background-color:#f1f2f3}.yui3-skin-sam .yui3-datatable-sort-liner{display:block;height:100%;position:relative;padding-right:15px;position:relative}.yui3-skin-sam .yui3-datatable-sort-indicator{position:absolute;right:0;bottom:.5ex;width:7px;height:10px;background:url(sort-arrow-sprite.png) no-repeat 0 0;_background:url(sort-arrow-sprite-ie.png) no-repeat 0 0;overflow:hidden}.yui3-skin-sam .yui3-datatable-sorted .yui3-datatable-sort-indicator{background-position:0 -10px}.yui3-skin-sam .yui3-datatable-sorted-desc .yui3-datatable-sort-indicator{background-position:0 -20px}.yui3-skin-sam .yui3-datatable-data .yui3-datatable-even .yui3-datatable-sorted{background-color:#edf5ff}.yui3-skin-sam .yui3-datatable-data .yui3-datatable-odd .yui3-datatable-sorted{background-color:#dbeaff}#yui3-css-stamp.skin-sam-datatable-sort{display:none}
+v\:oval,v\:shadow,v\:fill{behavior:url(#default#VML);display:inline-block;zoom:1;*display:inline}.yui3-dial{position:relative;display:-moz-inline-stack;display:inline-block;zoom:1;*display:inline}.yui3-dial-content,.yui3-dial-ring{position:relative}.yui3-dial-handle,.yui3-dial-marker,.yui3-dial-center-button,.yui3-dial-reset-string,.yui3-dial-handle-vml,.yui3-dial-marker-vml,.yui3-dial-center-button-vml,.yui3-dial-ring-vml v\:oval,.yui3-dial-center-button-vml v\:oval{position:absolute}.yui3-dial-center-button-vml v\:oval{font-size:1px;top:0;left:0}.yui3-dial-content .yui3-dial-ring .yui3-dial-hidden v\:oval,.yui3-dial-content .yui3-dial-ring .yui3-dial-hidden{opacity:0;filter:alpha(opacity=0)}.yui3-skin-sam .yui3-dial-handle{background:#6c3a3a;opacity:.3;-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.9) inset;cursor:pointer;font-size:1px}.yui3-skin-sam .yui3-dial-ring{background:#bebdb7;background:-moz-linear-gradient(100% 100% 135deg,#7b7a6d,#fff);background:-webkit-gradient(linear,left top,right bottom,from(#fff),to(#7b7a6d));box-shadow:1px 1px 5px rgba(0,0,0,0.4) inset;-webkit-box-shadow:1px 1px 5px rgba(0,0,0,0.4) inset;-moz-box-shadow:1px 1px 5px rgba(0,0,0,0.4) inset}.yui3-skin-sam .yui3-dial-center-button{box-shadow:-1px -1px 2px rgba(0,0,0,0.3) inset,1px 1px 2px rgba(0,0,0,0.5);-moz-box-shadow:-1px -1px 2px rgba(0,0,0,0.3) inset,1px 1px 2px rgba(0,0,0,0.5);background:#dddbd4;background:-moz-radial-gradient(30% 30% 0deg,circle farthest-side,#fbfbf9 24%,#f2f0ea 41%,#d3d0c3 83%) repeat scroll 0 0 transparent;background:-webkit-gradient(radial,15 15,15,30 30,40,from(#fbfbf9),to(#d3d0c3),color-stop(.2,#f2f0ea));cursor:pointer;opacity:.7}.yui3-skin-sam .yui3-dial-reset-string{color:#676767;font-size:85%;text-decoration:underline}.yui3-skin-sam .yui3-dial-label{color:#808080;margin-bottom:.8em}.yui3-skin-sam .yui3-dial-value-string{margin-left:.5em;color:#000;font-size:130%}.yui3-skin-sam .yui3-dial-value{visibility:hidden;position:absolute;top:0;left:102%;width:4em}.yui3-skin-sam .yui3-dial-north-mark{position:absolute;border-left:2px solid #ccc;height:5px;width:10px;left:50%;top:-7px;font-size:1px}.yui3-skin-sam .yui3-dial-marker{background-color:#000;opacity:.2;font-size:1px}.yui3-skin-sam .yui3-dial-marker-max-min{background-color:#ab3232;opacity:.6}.yui3-skin-sam .yui3-dial-ring-vml,.yui3-skin-sam .yui3-dial-center-button-vml,.yui3-skin-sam .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-sam v\:oval.yui3-dial-marker-max-min,.yui3-skin-sam .yui3-dial-marker-vml,.yui3-skin-sam .yui3-dial-handle-vml{background:0;opacity:1}#yui3-css-stamp.skin-sam-dial{display:none}
+.yui3-flick{position:relative;overflow:hidden}.yui3-flick-content{position:relative}#yui3-css-stamp.skin-sam-node-flick{display:none}
+.yui3-menu .yui3-menu{position:absolute;z-index:1}.yui3-menu .yui3-shim{position:absolute;top:0;left:0;z-index:-1;opacity:0;filter:alpha(opacity=0);border:0;margin:0;padding:0;height:100%;width:100%}.yui3-menu-hidden{top:-10000px;left:-10000px;visibility:hidden}.yui3-menu li{list-style-type:none}.yui3-menu ul,.yui3-menu li{margin:0;padding:0}.yui3-menu-label,.yui3-menuitem-content{text-align:left;white-space:nowrap;display:block}.yui3-menu-horizontal li{float:left;width:auto}.yui3-menu-horizontal li li{float:none}.yui3-menu-horizontal ul{*zoom:1}.yui3-menu-horizontal ul ul{*zoom:normal}.yui3-menu-horizontal>.yui3-menu-content>ul:after{content:"";display:block;clear:both;line-height:0;font-size:0;visibility:hidden}.yui3-menu-content{*zoom:1}.yui3-menu-hidden .yui3-menu-content{*zoom:normal}.yui3-menuitem-content,.yui3-menu-label{_zoom:1}.yui3-menu-hidden .yui3-menuitem-content,.yui3-menu-hidden .yui3-menu-label{_zoom:normal}.yui3-skin-sam .yui3-menu-content,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menu-content{font-size:93%;line-height:1.5;*line-height:1.45;border:solid 1px #808080;background:#fff;padding:3px 0}.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menu-content{font-size:100%}.yui3-skin-sam .yui3-menu-horizontal .yui3-menu-content{line-height:2;*line-height:1.9;background:url(sprite.png) repeat-x 0 0;padding:0}.yui3-skin-sam .yui3-menu ul,.yui3-skin-sam .yui3-menu ul ul{margin-top:3px;padding-top:3px;border-top:solid 1px #ccc}.yui3-skin-sam .yui3-menu ul.first-of-type{border:0;margin:0;padding:0}.yui3-skin-sam .yui3-menu-horizontal ul{padding:0;margin:0;border:0}.yui3-skin-sam .yui3-menu li,.yui3-skin-sam .yui3-menu .yui3-menu li{_border-bottom:solid 1px #fff}.yui3-skin-sam .yui3-menu-horizontal li{_border-bottom:0}.yui3-skin-sam .yui3-menubuttonnav li{border-right:solid 1px #ccc}.yui3-skin-sam .yui3-splitbuttonnav li{border-right:solid 1px #808080}.yui3-skin-sam .yui3-menubuttonnav li li,.yui3-skin-sam .yui3-splitbuttonnav li li{border-right:0}.yui3-skin-sam .yui3-menu-label,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menu-label,.yui3-skin-sam .yui3-menuitem-content,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menuitem-content{padding:0 1em;color:#000;text-decoration:none;cursor:default;float:none;border:0;margin:0}.yui3-skin-sam .yui3-menu-horizontal .yui3-menu-label,.yui3-skin-sam .yui3-menu-horizontal .yui3-menuitem-content{padding:0 10px;border-style:solid;border-color:#808080;border-width:1px 0;margin:-1px 0;float:left;width:auto}.yui3-skin-sam .yui3-menu-label,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menu-label{background:url(vertical-menu-submenu-indicator.png) right center no-repeat}.yui3-skin-sam .yui3-menu-horizontal .yui3-menu-label{background:url(sprite.png) repeat-x 0 0}.yui3-skin-sam .yui3-menubuttonnav .yui3-menu-label,.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label{background-image:none}.yui3-skin-sam .yui3-menubuttonnav .yui3-menu-label{padding-right:0}.yui3-skin-sam .yui3-menubuttonnav .yui3-menu-label em{font-style:normal;padding-right:20px;display:block;background:url(horizontal-menu-submenu-indicator.png) right center no-repeat}.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label{padding:0}.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label a{float:left;width:auto;color:#000;text-decoration:none;cursor:default;padding:0 5px 0 10px}.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label .yui3-menu-toggle{padding:0;border-left:solid 1px #ccc;width:15px;overflow:hidden;text-indent:-1000px;background:url(horizontal-menu-submenu-indicator.png) 3px center no-repeat}.yui3-skin-sam .yui3-menu-label-active,.yui3-skin-sam .yui3-menu-label-menuvisible,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menu-label-active,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menu-label-menuvisible{background-color:#b3d4ff}.yui3-skin-sam .yui3-menuitem-active .yui3-menuitem-content,.yui3-skin-sam .yui3-menu .yui3-menu .yui3-menuitem-active .yui3-menuitem-content{background-image:none;background-color:#b3d4ff;border-left-width:0;margin-left:0}.yui3-skin-sam .yui3-menu-horizontal .yui3-menu-label-active,.yui3-skin-sam .yui3-menu-horizontal .yui3-menuitem-active .yui3-menuitem-content,.yui3-skin-sam .yui3-menu-horizontal .yui3-menu-label-menuvisible{border-color:#7d98b8;background:url(sprite.png) repeat-x 0 -1700px}.yui3-skin-sam .yui3-menubuttonnav .yui3-menu-label-active,.yui3-skin-sam .yui3-menubuttonnav .yui3-menuitem-active .yui3-menuitem-content,.yui3-skin-sam .yui3-menubuttonnav .yui3-menu-label-menuvisible,.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label-active,.yui3-skin-sam .yui3-splitbuttonnav .yui3-menuitem-active .yui3-menuitem-content,.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label-menuvisible{border-left-width:1px;margin-left:-1px}.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label-menuvisible{border-color:#808080;background:transparent}.yui3-skin-sam .yui3-splitbuttonnav .yui3-menu-label-menuvisible .yui3-menu-toggle{border-color:#7d98b8;background:url(horizontal-menu-submenu-toggle.png) left center no-repeat}#yui3-css-stamp.skin-sam-node-menunav{display:none}
+.yui3-overlay{position:absolute}.yui3-overlay-hidden{visibility:hidden}.yui3-widget-tmp-forcesize .yui3-overlay-content{overflow:hidden!important}#yui3-css-stamp.skin-sam-overlay{display:none}
+.yui3-panel{position:absolute}.yui3-panel-hidden{visibility:hidden}.yui3-widget-tmp-forcesize .yui3-panel-content{overflow:hidden!important}.yui3-panel .yui3-widget-hd{position:relative}.yui3-panel .yui3-widget-hd .yui3-widget-buttons{position:absolute;top:0;right:0}.yui3-panel .yui3-widget-ft .yui3-widget-buttons{display:inline-block;*display:inline;zoom:1}.yui3-skin-sam .yui3-panel-content{-webkit-box-shadow:0 0 5px #333;-moz-box-shadow:0 0 5px #333;box-shadow:0 0 5px #333;border:1px solid black;background:white}.yui3-skin-sam .yui3-panel .yui3-widget-hd{padding:8px 28px 8px 8px;min-height:13px;_height:13px;color:white;background-color:#3961c5;background:-moz-linear-gradient(0% 100% 90deg,#2647a0 7%,#3d67ce 50%,#426fd9 100%);background:-webkit-gradient(linear,left bottom,left top,from(#2647a0),color-stop(0.07,#2647a0),color-stop(0.5,#3d67ce),to(#426fd9))}.yui3-skin-sam .yui3-panel .yui3-widget-hd .yui3-widget-buttons{padding:8px}.yui3-skin-sam .yui3-panel .yui3-widget-bd{padding:10px}.yui3-skin-sam .yui3-panel .yui3-widget-ft{background:#edf5ff;padding:8px;text-align:right}.yui3-skin-sam .yui3-panel .yui3-widget-ft .yui3-button{margin-left:8px}.yui3-skin-sam .yui3-panel .yui3-widget-hd .yui3-button-close{background:transparent;filter:none;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;width:13px;height:13px;padding:0;overflow:hidden;vertical-align:top;*font-size:0;*line-height:0;*letter-spacing:-1000px;*color:#86a5ec;*background:url(sprite_icons.png) no-repeat 1px 1px}.yui3-skin-sam .yui3-panel .yui3-widget-hd .yui3-button-close:before{content:url(sprite_icons.png);display:inline-block;text-align:center;font-size:0;line-height:0;width:13px;margin:1px 0 0 1px}.yui3-skin-sam .yui3-panel-hidden .yui3-widget-hd .yui3-button-close{display:none}#yui3-css-stamp.skin-sam-panel{display:none}
+.yui3-resize,.yui3-resize-wrapper{z-index:0;zoom:1}.yui3-resize-handle{position:absolute;display:block;z-index:100;zoom:1}.yui3-resize-proxy{position:absolute;border:1px dashed #000;position:absolute;z-index:10000}.yui3-resize-hidden-handles .yui3-resize-handle{opacity:0;filter:alpha(opacity=0)}.yui3-resize-handle-t,.yui3-resize-handle-b{width:100%;left:0;height:6px}.yui3-resize-handle-l,.yui3-resize-handle-r{height:100%;top:0;width:6px}.yui3-resize-handle-t{cursor:n-resize;top:0}.yui3-resize-handle-b{cursor:s-resize;bottom:0}.yui3-resize-handle-l{cursor:w-resize;left:0}.yui3-resize-handle-r{cursor:e-resize;right:0}.yui3-resize-handle-inner{position:absolute;zoom:1}.yui3-resize-handle-inner-t,.yui3-resize-handle-inner-b{margin-left:-8px;left:50%}.yui3-resize-handle-inner-l,.yui3-resize-handle-inner-r{margin-top:-8px;top:50%}.yui3-resize-handle-inner-t{top:-4px}.yui3-resize-handle-inner-b{bottom:-4px}.yui3-resize-handle-inner-l{left:-4px}.yui3-resize-handle-inner-r{right:-4px}.yui3-resize-handle-tr,.yui3-resize-handle-br,.yui3-resize-handle-tl,.yui3-resize-handle-bl{height:15px;width:15px;z-index:200}.yui3-resize-handle-tr{cursor:ne-resize;top:0;right:0}.yui3-resize-handle-tl{cursor:nw-resize;top:0;left:0}.yui3-resize-handle-br{cursor:se-resize;bottom:0;right:0}.yui3-resize-handle-bl{cursor:sw-resize;bottom:0;left:0}.yui3-resize-handle-inner-r,.yui3-resize-handle-inner-l,.yui3-resize-handle-inner-t,.yui3-resize-handle-inner-b,.yui3-resize-handle-inner-tr,.yui3-resize-handle-inner-br,.yui3-resize-handle-inner-tl,.yui3-resize-handle-inner-bl{background-repeat:no-repeat;background:url(arrows.png) no-repeat 0 0;display:block;height:15px;overflow:hidden;text-indent:-99999em;width:15px}.yui3-resize-handle-inner-br{background-position:-30px 0;bottom:-2px;right:-2px}.yui3-resize-handle-inner-tr{background-position:-58px 0;bottom:0;right:-2px}.yui3-resize-handle-inner-bl{background-position:-75px 0;bottom:-2px;right:-2px}.yui3-resize-handle-inner-tl{background-position:-47px 0;bottom:0;right:-2px}.yui3-resize-handle-inner-b,.yui3-resize-handle-inner-t{background-position:-15px 0}#yui3-css-stamp.skin-sam-resize-base{display:none}
+.yui3-scrollview{position:relative;overflow:hidden;-webkit-user-select:none;-moz-user-select:none}.yui3-scrollview-hidden{display:none}.yui3-scrollview-content{position:relative}.yui3-skin-sam .yui3-scrollview{-webkit-tap-highlight-color:rgba(255,255,255,0)}#yui3-css-stamp.skin-sam-scrollview-base{display:none}
+.yui3-skin-sam .yui3-scrollview{-webkit-tap-highlight-color:rgba(255,255,255,0)}.yui3-skin-sam .yui3-scrollview{background-color:white}.yui3-skin-sam .yui3-scrollview-vert .yui3-scrollview-content .yui3-scrollview-item{*zoom:1}.yui3-skin-sam .yui3-scrollview-vert .yui3-scrollview-content .yui3-scrollview-list{*zoom:1;list-style:none;padding:0;margin:0}.yui3-skin-sam .yui3-scrollview-vert .yui3-scrollview-content{border-top:0;background-color:white;font-family:HelveticaNeue,arial,helvetica,clean,sans-serif;color:black}.yui3-skin-sam .yui3-scrollview-vert .yui3-scrollview-content .yui3-scrollview-item{border-bottom:1px solid #303030;padding:15px 20px 16px;font-size:100%;font-weight:bold;background-color:white;cursor:pointer}#yui3-css-stamp.skin-sam-scrollview-list{display:none}
+.yui3-scrollview-scrollbar{opacity:1;position:absolute;width:6px;height:10px}.yui3-scrollview-scrollbar{top:0;right:1px}.yui3-scrollview-scrollbar-horiz{top:auto;height:8px;width:20px;bottom:1px;left:0}.yui3-scrollview-scrollbar .yui3-scrollview-child{position:absolute;right:0;display:block;width:100%;height:4px}.yui3-scrollview-scrollbar .yui3-scrollview-first{top:0}.yui3-scrollview-scrollbar .yui3-scrollview-last{top:0}.yui3-scrollview-scrollbar .yui3-scrollview-middle{position:absolute;top:4px;height:1px}.yui3-scrollview-scrollbar-horiz .yui3-scrollview-child{display:-moz-inline-stack;display:inline-block;zoom:1;*display:inline;top:0;left:0;bottom:auto;right:auto}.yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{width:4px;height:6px}.yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{top:0;left:4px;width:1px;height:6px}.yui3-scrollview-scrollbar-vert-basic{height:auto}.yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child{position:static;_overflow:hidden;_line-height:4px}.yui3-scrollview-scrollbar-horiz-basic{width:auto;white-space:nowrap;line-height:6px;_overflow:hidden}.yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{position:static;padding:0;margin:0;top:auto;left:auto;right:auto;bottom:auto}.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none}#yui3-css-stamp.skin-sam-scrollview-scrollbars{display:none}
+.yui3-slider,.yui3-slider-rail{display:-moz-inline-stack;display:inline-block;*display:inline;zoom:1;vertical-align:middle}.yui3-slider-content{position:relative;display:block}.yui3-slider-rail{position:relative}.yui3-slider-rail-cap-top,.yui3-slider-rail-cap-left,.yui3-slider-rail-cap-bottom,.yui3-slider-rail-cap-right,.yui3-slider-thumb,.yui3-slider-thumb-image,.yui3-slider-thumb-shadow{position:absolute}.yui3-slider-thumb{overflow:hidden}.yui3-skin-sam .yui3-slider-x .yui3-slider-rail,.yui3-skin-sam .yui3-slider-x .yui3-slider-rail-cap-left,.yui3-skin-sam .yui3-slider-x .yui3-slider-rail-cap-right{background-image:url(rail-x.png);background-repeat:repeat-x}.yui3-skin-sam .yui3-slider-x .yui3-slider-rail{height:26px}.yui3-skin-sam .yui3-slider-x .yui3-slider-thumb{height:26px;width:15px}.yui3-skin-sam .yui3-slider-x .yui3-slider-rail-cap-left{background-position:0 -20px;height:20px;left:-2px;width:5px}.yui3-skin-sam .yui3-slider-x .yui3-slider-rail-cap-right{background-position:0 -40px;height:20px;right:-2px;width:5px}.yui3-skin-sam .yui3-slider-x .yui3-slider-thumb-image{left:0;top:-10px}.yui3-skin-sam .yui3-slider-x .yui3-slider-thumb-shadow{left:0;opacity:.15;filter:alpha(opacity=15);top:-50px}.yui3-skin-sam .yui3-slider-y .yui3-slider-rail,.yui3-skin-sam .yui3-slider-y .yui3-slider-rail-cap-top,.yui3-skin-sam .yui3-slider-y .yui3-slider-rail-cap-bottom{background-image:url(rail-y.png);background-repeat:repeat-y}.yui3-skin-sam .yui3-slider-y .yui3-slider-rail{width:26px}.yui3-skin-sam .yui3-slider-y .yui3-slider-thumb{width:26px;height:15px}.yui3-skin-sam .yui3-slider-y .yui3-slider-rail-cap-top{background-position:-20px 0;width:20px;top:-2px;height:5px}.yui3-skin-sam .yui3-slider-y .yui3-slider-rail-cap-bottom{background-position:-40px 0;width:20px;bottom:-2px;height:5px}.yui3-skin-sam .yui3-slider-y .yui3-slider-thumb-image{left:-10px;top:0}.yui3-skin-sam .yui3-slider-y .yui3-slider-thumb-shadow{left:-50px;opacity:.15;filter:alpha(opacity=15);top:0}#yui3-css-stamp.skin-sam-slider-base{display:none}
+.yui3-tab-panel{display:none}.yui3-tab-panel-selected{display:block}.yui3-tabview-list,.yui3-tab{margin:0;padding:0;list-style:none}.yui3-tabview{position:relative}.yui3-tabview,.yui3-tabview-list,.yui3-tabview-panel,.yui3-tab,.yui3-tab-panel{zoom:1}.yui3-tab{display:inline-block;*display:inline;vertical-align:bottom;cursor:pointer}.yui3-tab-label{display:block;display:inline-block;padding:6px 10px;position:relative;text-decoration:none;vertical-align:bottom}.yui3-skin-sam .yui3-tabview-list{border:solid #2647a0;border-width:0 0 5px;zoom:1}.yui3-skin-sam .yui3-tab{margin:0 .2em 0 0;padding:1px 0 0;zoom:1}.yui3-skin-sam .yui3-tab-selected{margin-bottom:-1px}.yui3-skin-sam .yui3-tab-label{background:#d8d8d8 url(sprite.png) repeat-x;border:solid #a3a3a3;border-width:1px 1px 0 1px;color:#000;cursor:pointer;font-size:85%;padding:.3em .75em;text-decoration:none}.yui3-skin-sam .yui3-tab-label:hover,.yui3-skin-sam .yui3-tab-label:focus{background:#bfdaff url(sprite.png) repeat-x left -1300px;outline:0}.yui3-skin-sam .yui3-tab-selected .yui3-tab-label,.yui3-skin-sam .yui3-tab-selected .yui3-tab-label:focus,.yui3-skin-sam .yui3-tab-selected .yui3-tab-label:hover{background:#2647a0 url(sprite.png) repeat-x left -1400px;color:#fff}.yui3-skin-sam .yui3-tab-selected .yui3-tab-label{padding:.4em .75em}.yui3-skin-sam .yui3-tab-selected .yui3-tab-label{border-color:#243356}.yui3-skin-sam .yui3-tabview-panel{background:#edf5ff}.yui3-skin-sam .yui3-tabview-panel{border:1px solid #808080;border-top-color:#243356;padding:.25em .5em}#yui3-css-stamp.skin-sam-tabview{display:none}
+.yui3-testconsole .yui3-console-entry{min-height:inherit;padding:5px}.yui3-testconsole .yui3-console-controls{display:none}.yui3-skin-sam .yui3-testconsole .yui3-console-content,.yui3-skin-sam .yui3-testconsole .yui3-console-bd,.yui3-skin-sam .yui3-testconsole .yui3-console-entry,.yui3-skin-sam .yui3-testconsole .yui3-console-ft,.yui3-skin-sam .yui3-testconsole .yui3-console-ft .yui3-console-filters-categories,.yui3-skin-sam .yui3-testconsole .yui3-console-ft .yui3-console-filters-sources,.yui3-skin-sam .yui3-testconsole .yui3-console-hd{background:0;border:0;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.yui3-skin-sam .yui3-testconsole-content,.yui3-skin-sam .yui3-testconsole .yui3-console-bd{color:#333;font:13px/1.4 Helvetica,'DejaVu Sans','Bitstream Vera Sans',Arial,sans-serif}.yui3-skin-sam .yui3-testconsole-content{border:1px solid #afafaf}.yui3-skin-sam .yui3-testconsole .yui3-console-entry{border-bottom:1px solid #eaeaea;font-family:Menlo,Inconsolata,Consolas,'DejaVu Mono','Bitstream Vera Sans Mono',monospace;font-size:11px}.yui3-skin-sam .yui3-testconsole .yui3-console-ft{border-top:1px solid}.yui3-skin-sam .yui3-testconsole .yui3-console-hd{border-bottom:1px solid;*zoom:1}.yui3-skin-sam .yui3-testconsole.yui3-console-collapsed .yui3-console-hd{border:0}.yui3-skin-sam .yui3-testconsole .yui3-console-ft,.yui3-skin-sam .yui3-testconsole .yui3-console-hd{border-color:#cfcfcf}.yui3-skin-sam .yui3-testconsole .yui3-testconsole-entry-fail{background-color:#ffe0e0;border-bottom-color:#ffc5c4}.yui3-skin-sam .yui3-testconsole .yui3-testconsole-entry-pass{background-color:#ecffea;border-bottom-color:#d1ffcc}#yui3-css-stamp.skin-sam-test-console{display:none}
+.yui3-skin-sam .yui3-console-entry-pass .yui3-console-entry-cat{background-color:green;color:#fff;}.yui3-skin-sam .yui3-console-entry-fail .yui3-console-entry-cat{background-color:red;color:#fff;}.yui3-skin-sam .yui3-console-entry-ignore .yui3-console-entry-cat{background-color:#666;}
+.yui3-widget-hidden{display:none}.yui3-widget-content{overflow:hidden}.yui3-widget-content-expanded{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;height:100%}.yui3-widget-tmp-forcesize{overflow:hidden!important}#yui3-css-stamp.skin-sam-widget-base{display:none}
+.yui3-widget-buttons .yui3-button-close,.yui3-widget-buttons .yui3-button-close .yui3-button-content,.yui3-widget-buttons .yui3-button-close .yui3-button-icon{display:inline-block;*display:inline;zoom:1;width:13px;height:13px;line-height:13px;vertical-align:top}.yui3-widget-buttons .yui3-button-close .yui3-button-icon{background-repeat:no-repeat;background-position:1px 1px}.yui3-skin-sam .yui3-widget-buttons .yui3-button-icon{background-image:url(sprite_icons.gif)}#yui3-css-stamp.skin-sam-widget-buttons{display:none}
+.yui3-skin-sam .yui3-widget-mask{background-color:black;zoom:1;-ms-filter:"alpha(opacity=40)";filter:alpha(opacity=40);opacity:.4}#yui3-css-stamp.skin-sam-widget-modality{display:none}
+.yui3-widget-stacked .yui3-widget-shim{opacity:0;filter:alpha(opacity=0);position:absolute;border:0;top:0;left:0;padding:0;margin:0;z-index:-1;width:100%;height:100%;_width:0;_height:0}#yui3-css-stamp.skin-sam-widget-stack{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/slider-base.css'
--- debian/extras/jslibs/yui/assets/skins/sam/slider-base.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/slider-base.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-slider,.yui3-slider-rail{display:-moz-inline-stack;display:inline-block;*display:inline;zoom:1;vertical-align:middle}.yui3-slider-content{position:relative;display:block}.yui3-slider-rail{position:relative}.yui3-slider-rail-cap-top,.yui3-slider-rail-cap-left,.yui3-slider-rail-cap-bottom,.yui3-slider-rail-cap-right,.yui3-slider-thumb,.yui3-slider-thumb-image,.yui3-slider-thumb-shadow{position:absolute}.yui3-slider-thumb{overflow:hidden}.yui3-skin-sam .yui3-slider-x .yui3-slider-rail,.yui3-skin-sam .yui3-slider-x .yui3-slider-rail-cap-left,.yui3-skin-sam .yui3-slider-x .yui3-slider-rail-cap-right{background-image:url(rail-x.png);background-repeat:repeat-x}.yui3-skin-sam .yui3-slider-x .yui3-slider-rail{height:26px}.yui3-skin-sam .yui3-slider-x .yui3-slider-thumb{height:26px;width:15px}.yui3-skin-sam .yui3-slider-x .yui3-slider-rail-cap-left{background-position:0 -20px;height:20px;left:-2px;width:5px}.yui3-skin-sam .yui3-slider-x .yui3-slider-rail-cap-right{background-position:0 -40px;height:20px;right:-2px;width:5px}.yui3-skin-sam .yui3-slider-x .yui3-slider-thumb-image{left:0;top:-10px}.yui3-skin-sam .yui3-slider-x .yui3-slider-thumb-shadow{left:0;opacity:.15;filter:alpha(opacity=15);top:-50px}.yui3-skin-sam .yui3-slider-y .yui3-slider-rail,.yui3-skin-sam .yui3-slider-y .yui3-slider-rail-cap-top,.yui3-skin-sam .yui3-slider-y .yui3-slider-rail-cap-bottom{background-image:url(rail-y.png);background-repeat:repeat-y}.yui3-skin-sam .yui3-slider-y .yui3-slider-rail{width:26px}.yui3-skin-sam .yui3-slider-y .yui3-slider-thumb{width:26px;height:15px}.yui3-skin-sam .yui3-slider-y .yui3-slider-rail-cap-top{background-position:-20px 0;width:20px;top:-2px;height:5px}.yui3-skin-sam .yui3-slider-y .yui3-slider-rail-cap-bottom{background-position:-40px 0;width:20px;bottom:-2px;height:5px}.yui3-skin-sam .yui3-slider-y .yui3-slider-thumb-image{left:-10px;top:0}.yui3-skin-sam .yui3-slider-y .yui3-slider-thumb-shadow{left:-50px;opacity:.15;filter:alpha(opacity=15);top:0}#yui3-css-stamp.skin-sam-slider-base{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/sort-arrow-sprite-ie.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/sort-arrow-sprite-ie.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/sort-arrow-sprite-ie.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/sort-arrow-sprite.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/sort-arrow-sprite.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/sort-arrow-sprite.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/sprite.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/sprite.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/sprite.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/sprite_icons.gif'
Binary files debian/extras/jslibs/yui/assets/skins/sam/sprite_icons.gif	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/sprite_icons.gif	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/sprite_icons.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/sprite_icons.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/sprite_icons.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/tabview.css'
--- debian/extras/jslibs/yui/assets/skins/sam/tabview.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/tabview.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-tab-panel{display:none}.yui3-tab-panel-selected{display:block}.yui3-tabview-list,.yui3-tab{margin:0;padding:0;list-style:none}.yui3-tabview{position:relative}.yui3-tabview,.yui3-tabview-list,.yui3-tabview-panel,.yui3-tab,.yui3-tab-panel{zoom:1}.yui3-tab{display:inline-block;*display:inline;vertical-align:bottom;cursor:pointer}.yui3-tab-label{display:block;display:inline-block;padding:6px 10px;position:relative;text-decoration:none;vertical-align:bottom}.yui3-skin-sam .yui3-tabview-list{border:solid #2647a0;border-width:0 0 5px;zoom:1}.yui3-skin-sam .yui3-tab{margin:0 .2em 0 0;padding:1px 0 0;zoom:1}.yui3-skin-sam .yui3-tab-selected{margin-bottom:-1px}.yui3-skin-sam .yui3-tab-label{background:#d8d8d8 url(sprite.png) repeat-x;border:solid #a3a3a3;border-width:1px 1px 0 1px;color:#000;cursor:pointer;font-size:85%;padding:.3em .75em;text-decoration:none}.yui3-skin-sam .yui3-tab-label:hover,.yui3-skin-sam .yui3-tab-label:focus{background:#bfdaff url(sprite.png) repeat-x left -1300px;outline:0}.yui3-skin-sam .yui3-tab-selected .yui3-tab-label,.yui3-skin-sam .yui3-tab-selected .yui3-tab-label:focus,.yui3-skin-sam .yui3-tab-selected .yui3-tab-label:hover{background:#2647a0 url(sprite.png) repeat-x left -1400px;color:#fff}.yui3-skin-sam .yui3-tab-selected .yui3-tab-label{padding:.4em .75em}.yui3-skin-sam .yui3-tab-selected .yui3-tab-label{border-color:#243356}.yui3-skin-sam .yui3-tabview-panel{background:#edf5ff}.yui3-skin-sam .yui3-tabview-panel{border:1px solid #808080;border-top-color:#243356;padding:.25em .5em}#yui3-css-stamp.skin-sam-tabview{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/test-console.css'
--- debian/extras/jslibs/yui/assets/skins/sam/test-console.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/test-console.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-testconsole .yui3-console-entry{min-height:inherit;padding:5px}.yui3-testconsole .yui3-console-controls{display:none}.yui3-skin-sam .yui3-testconsole .yui3-console-content,.yui3-skin-sam .yui3-testconsole .yui3-console-bd,.yui3-skin-sam .yui3-testconsole .yui3-console-entry,.yui3-skin-sam .yui3-testconsole .yui3-console-ft,.yui3-skin-sam .yui3-testconsole .yui3-console-ft .yui3-console-filters-categories,.yui3-skin-sam .yui3-testconsole .yui3-console-ft .yui3-console-filters-sources,.yui3-skin-sam .yui3-testconsole .yui3-console-hd{background:0;border:0;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.yui3-skin-sam .yui3-testconsole-content,.yui3-skin-sam .yui3-testconsole .yui3-console-bd{color:#333;font:13px/1.4 Helvetica,'DejaVu Sans','Bitstream Vera Sans',Arial,sans-serif}.yui3-skin-sam .yui3-testconsole-content{border:1px solid #afafaf}.yui3-skin-sam .yui3-testconsole .yui3-console-entry{border-bottom:1px solid #eaeaea;font-family:Menlo,Inconsolata,Consolas,'DejaVu Mono','Bitstream Vera Sans Mono',monospace;font-size:11px}.yui3-skin-sam .yui3-testconsole .yui3-console-ft{border-top:1px solid}.yui3-skin-sam .yui3-testconsole .yui3-console-hd{border-bottom:1px solid;*zoom:1}.yui3-skin-sam .yui3-testconsole.yui3-console-collapsed .yui3-console-hd{border:0}.yui3-skin-sam .yui3-testconsole .yui3-console-ft,.yui3-skin-sam .yui3-testconsole .yui3-console-hd{border-color:#cfcfcf}.yui3-skin-sam .yui3-testconsole .yui3-testconsole-entry-fail{background-color:#ffe0e0;border-bottom-color:#ffc5c4}.yui3-skin-sam .yui3-testconsole .yui3-testconsole-entry-pass{background-color:#ecffea;border-bottom-color:#d1ffcc}#yui3-css-stamp.skin-sam-test-console{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/test.css'
--- debian/extras/jslibs/yui/assets/skins/sam/test.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/test.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-skin-sam .yui3-console-entry-pass .yui3-console-entry-cat{background-color:green;color:#fff;}.yui3-skin-sam .yui3-console-entry-fail .yui3-console-entry-cat{background-color:red;color:#fff;}.yui3-skin-sam .yui3-console-entry-ignore .yui3-console-entry-cat{background-color:#666;}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/thumb-x.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/thumb-x.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/thumb-x.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/thumb-y.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/thumb-y.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/thumb-y.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/vertical-menu-submenu-indicator.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/vertical-menu-submenu-indicator.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/vertical-menu-submenu-indicator.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/warn_error.png'
Binary files debian/extras/jslibs/yui/assets/skins/sam/warn_error.png	1970-01-01 00:00:00 +0000 and debian/extras/jslibs/yui/assets/skins/sam/warn_error.png	2013-02-02 01:30:27 +0000 differ
=== added file 'debian/extras/jslibs/yui/assets/skins/sam/widget-base.css'
--- debian/extras/jslibs/yui/assets/skins/sam/widget-base.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/widget-base.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-widget-hidden{display:none}.yui3-widget-content{overflow:hidden}.yui3-widget-content-expanded{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;height:100%}.yui3-widget-tmp-forcesize{overflow:hidden!important}#yui3-css-stamp.skin-sam-widget-base{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/widget-buttons.css'
--- debian/extras/jslibs/yui/assets/skins/sam/widget-buttons.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/widget-buttons.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-widget-buttons .yui3-button-close,.yui3-widget-buttons .yui3-button-close .yui3-button-content,.yui3-widget-buttons .yui3-button-close .yui3-button-icon{display:inline-block;*display:inline;zoom:1;width:13px;height:13px;line-height:13px;vertical-align:top}.yui3-widget-buttons .yui3-button-close .yui3-button-icon{background-repeat:no-repeat;background-position:1px 1px}.yui3-skin-sam .yui3-widget-buttons .yui3-button-icon{background-image:url(sprite_icons.gif)}#yui3-css-stamp.skin-sam-widget-buttons{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/widget-modality.css'
--- debian/extras/jslibs/yui/assets/skins/sam/widget-modality.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/widget-modality.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-skin-sam .yui3-widget-mask{background-color:black;zoom:1;-ms-filter:"alpha(opacity=40)";filter:alpha(opacity=40);opacity:.4}#yui3-css-stamp.skin-sam-widget-modality{display:none}

=== added file 'debian/extras/jslibs/yui/assets/skins/sam/widget-stack.css'
--- debian/extras/jslibs/yui/assets/skins/sam/widget-stack.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/assets/skins/sam/widget-stack.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-widget-stacked .yui3-widget-shim{opacity:0;filter:alpha(opacity=0);position:absolute;border:0;top:0;left:0;padding:0;margin:0;z-index:-1;width:100%;height:100%;_width:0;_height:0}#yui3-css-stamp.skin-sam-widget-stack{display:none}

=== added directory 'debian/extras/jslibs/yui/async-queue'
=== added file 'debian/extras/jslibs/yui/async-queue/async-queue-debug.js'
--- debian/extras/jslibs/yui/async-queue/async-queue-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/async-queue/async-queue-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,528 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('async-queue', function(Y) {
+
+/**
+ * <p>AsyncQueue allows you create a chain of function callbacks executed
+ * via setTimeout (or synchronously) that are guaranteed to run in order.
+ * Items in the queue can be promoted or removed.  Start or resume the
+ * execution chain with run().  pause() to temporarily delay execution, or
+ * stop() to halt and clear the queue.</p>
+ *
+ * @module async-queue
+ */
+
+/**
+ * <p>A specialized queue class that supports scheduling callbacks to execute
+ * sequentially, iteratively, even asynchronously.</p>
+ *
+ * <p>Callbacks can be function refs or objects with the following keys.  Only
+ * the <code>fn</code> key is required.</p>
+ *
+ * <ul>
+ * <li><code>fn</code> -- The callback function</li>
+ * <li><code>context</code> -- The execution context for the callbackFn.</li>
+ * <li><code>args</code> -- Arguments to pass to callbackFn.</li>
+ * <li><code>timeout</code> -- Millisecond delay before executing callbackFn.
+ *                     (Applies to each iterative execution of callback)</li>
+ * <li><code>iterations</code> -- Number of times to repeat the callback.
+ * <li><code>until</code> -- Repeat the callback until this function returns
+ *                         true.  This setting trumps iterations.</li>
+ * <li><code>autoContinue</code> -- Set to false to prevent the AsyncQueue from
+ *                        executing the next callback in the Queue after
+ *                        the callback completes.</li>
+ * <li><code>id</code> -- Name that can be used to get, promote, get the
+ *                        indexOf, or delete this callback.</li>
+ * </ul>
+ *
+ * @class AsyncQueue
+ * @extends EventTarget
+ * @constructor
+ * @param callback* {Function|Object} 0..n callbacks to seed the queue
+ */
+Y.AsyncQueue = function() {
+    this._init();
+    this.add.apply(this, arguments);
+};
+
+var Queue   = Y.AsyncQueue,
+    EXECUTE = 'execute',
+    SHIFT   = 'shift',
+    PROMOTE = 'promote',
+    REMOVE  = 'remove',
+
+    isObject   = Y.Lang.isObject,
+    isFunction = Y.Lang.isFunction;
+
+/**
+ * <p>Static default values used to populate callback configuration properties.
+ * Preconfigured defaults include:</p>
+ *
+ * <ul>
+ *  <li><code>autoContinue</code>: <code>true</code></li>
+ *  <li><code>iterations</code>: 1</li>
+ *  <li><code>timeout</code>: 10 (10ms between callbacks)</li>
+ *  <li><code>until</code>: (function to run until iterations &lt;= 0)</li>
+ * </ul>
+ *
+ * @property defaults
+ * @type {Object}
+ * @static
+ */
+Queue.defaults = Y.mix({
+    autoContinue : true,
+    iterations   : 1,
+    timeout      : 10,
+    until        : function () {
+        this.iterations |= 0;
+        return this.iterations <= 0;
+    }
+}, Y.config.queueDefaults || {});
+
+Y.extend(Queue, Y.EventTarget, {
+    /**
+     * Used to indicate the queue is currently executing a callback.
+     *
+     * @property _running
+     * @type {Boolean|Object} true for synchronous callback execution, the
+     *                        return handle from Y.later for async callbacks.
+     *                        Otherwise false.
+     * @protected
+     */
+    _running : false,
+
+    /**
+     * Initializes the AsyncQueue instance properties and events.
+     *
+     * @method _init
+     * @protected
+     */
+    _init : function () {
+        Y.EventTarget.call(this, { prefix: 'queue', emitFacade: true });
+
+        this._q = [];
+
+        /** 
+         * Callback defaults for this instance.  Static defaults that are not
+         * overridden are also included.
+         *
+         * @property defaults
+         * @type {Object}
+         */
+        this.defaults = {};
+
+        this._initEvents();
+    },
+
+    /**
+     * Initializes the instance events.
+     *
+     * @method _initEvents
+     * @protected
+     */
+    _initEvents : function () {
+        this.publish({
+            'execute' : { defaultFn : this._defExecFn,    emitFacade: true },
+            'shift'   : { defaultFn : this._defShiftFn,   emitFacade: true },
+            'add'     : { defaultFn : this._defAddFn,     emitFacade: true },
+            'promote' : { defaultFn : this._defPromoteFn, emitFacade: true },
+            'remove'  : { defaultFn : this._defRemoveFn,  emitFacade: true }
+        });
+    },
+
+    /**
+     * Returns the next callback needing execution.  If a callback is
+     * configured to repeat via iterations or until, it will be returned until
+     * the completion criteria is met.
+     *
+     * When the queue is empty, null is returned.
+     *
+     * @method next
+     * @return {Function} the callback to execute
+     */
+    next : function () {
+        var callback;
+
+        while (this._q.length) {
+            callback = this._q[0] = this._prepare(this._q[0]);
+            if (callback && callback.until()) {
+                this.fire(SHIFT, { callback: callback });
+                callback = null;
+            } else {
+                break;
+            }
+        }
+
+        return callback || null;
+    },
+
+    /**
+     * Default functionality for the &quot;shift&quot; event.  Shifts the
+     * callback stored in the event object's <em>callback</em> property from
+     * the queue if it is the first item.
+     *
+     * @method _defShiftFn
+     * @param e {Event} The event object
+     * @protected
+     */
+    _defShiftFn : function (e) {
+        if (this.indexOf(e.callback) === 0) {
+            this._q.shift();
+        }
+    },
+
+    /**
+     * Creates a wrapper function to execute the callback using the aggregated 
+     * configuration generated by combining the static AsyncQueue.defaults, the
+     * instance defaults, and the specified callback settings.
+     *
+     * The wrapper function is decorated with the callback configuration as
+     * properties for runtime modification.
+     *
+     * @method _prepare
+     * @param callback {Object|Function} the raw callback
+     * @return {Function} a decorated function wrapper to execute the callback
+     * @protected
+     */
+    _prepare: function (callback) {
+        if (isFunction(callback) && callback._prepared) {
+            return callback;
+        }
+
+        var config = Y.merge(
+            Queue.defaults,
+            { context : this, args: [], _prepared: true },
+            this.defaults,
+            (isFunction(callback) ? { fn: callback } : callback)),
+            
+            wrapper = Y.bind(function () {
+                if (!wrapper._running) {
+                    wrapper.iterations--;
+                }
+                if (isFunction(wrapper.fn)) {
+                    wrapper.fn.apply(wrapper.context || Y,
+                                     Y.Array(wrapper.args));
+                }
+            }, this);
+            
+        return Y.mix(wrapper, config);
+    },
+
+    /**
+     * Sets the queue in motion.  All queued callbacks will be executed in
+     * order unless pause() or stop() is called or if one of the callbacks is
+     * configured with autoContinue: false.
+     *
+     * @method run
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    run : function () {
+        var callback,
+            cont = true;
+
+        for (callback = this.next();
+            cont && callback && !this.isRunning();
+            callback = this.next())
+        {
+            cont = (callback.timeout < 0) ?
+                this._execute(callback) :
+                this._schedule(callback);
+        }
+
+        if (!callback) {
+            /**
+             * Event fired after the last queued callback is executed.
+             * @event complete
+             */
+            this.fire('complete');
+        }
+
+        return this;
+    },
+
+    /**
+     * Handles the execution of callbacks. Returns a boolean indicating
+     * whether it is appropriate to continue running.
+     *
+     * @method _execute
+     * @param callback {Object} the callback object to execute
+     * @return {Boolean} whether the run loop should continue
+     * @protected
+     */
+    _execute : function (callback) {
+        this._running = callback._running = true;
+
+        callback.iterations--;
+        this.fire(EXECUTE, { callback: callback });
+
+        var cont = this._running && callback.autoContinue;
+
+        this._running = callback._running = false;
+
+        return cont;
+    },
+
+    /**
+     * Schedules the execution of asynchronous callbacks.
+     *
+     * @method _schedule
+     * @param callback {Object} the callback object to execute
+     * @return {Boolean} whether the run loop should continue
+     * @protected
+     */
+    _schedule : function (callback) {
+        this._running = Y.later(callback.timeout, this, function () {
+            if (this._execute(callback)) {
+                this.run();
+            }
+        });
+
+        return false;
+    },
+
+    /**
+     * Determines if the queue is waiting for a callback to complete execution.
+     *
+     * @method isRunning
+     * @return {Boolean} true if queue is waiting for a 
+     *                   from any initiated transactions
+     */
+    isRunning : function () {
+        return !!this._running;
+    },
+
+    /**
+     * Default functionality for the &quot;execute&quot; event.  Executes the
+     * callback function
+     *
+     * @method _defExecFn
+     * @param e {Event} the event object
+     * @protected
+     */
+    _defExecFn : function (e) {
+        e.callback();
+    },
+
+    /**
+     * Add any number of callbacks to the end of the queue. Callbacks may be
+     * provided as functions or objects.
+     *
+     * @method add
+     * @param callback* {Function|Object} 0..n callbacks
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    add : function () {
+        this.fire('add', { callbacks: Y.Array(arguments,0,true) });
+
+        return this;
+    },
+
+    /**
+     * Default functionality for the &quot;add&quot; event.  Adds the callbacks
+     * in the event facade to the queue. Callbacks successfully added to the
+     * queue are present in the event's <code>added</code> property in the
+     * after phase.
+     *
+     * @method _defAddFn
+     * @param e {Event} the event object
+     * @protected
+     */
+    _defAddFn : function(e) {
+        var _q = this._q,
+            added = [];
+
+        Y.Array.each(e.callbacks, function (c) {
+            if (isObject(c)) {
+                _q.push(c);
+                added.push(c);
+            }
+        });
+
+        e.added = added;
+    },
+
+    /**
+     * Pause the execution of the queue after the execution of the current
+     * callback completes.  If called from code outside of a queued callback,
+     * clears the timeout for the pending callback. Paused queue can be
+     * restarted with q.run()
+     *
+     * @method pause
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    pause: function () {
+        if (isObject(this._running)) {
+            this._running.cancel();
+        }
+
+        this._running = false;
+
+        return this;
+    },
+
+    /**
+     * Stop and clear the queue after the current execution of the
+     * current callback completes.
+     *
+     * @method stop
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    stop : function () { 
+        this._q = [];
+
+        return this.pause();
+    },
+
+    /** 
+     * Returns the current index of a callback.  Pass in either the id or
+     * callback function from getCallback.
+     *
+     * @method indexOf
+     * @param callback {String|Function} the callback or its specified id
+     * @return {Number} index of the callback or -1 if not found
+     */
+    indexOf : function (callback) {
+        var i = 0, len = this._q.length, c;
+
+        for (; i < len; ++i) {
+            c = this._q[i];
+            if (c === callback || c.id === callback) {
+                return i;
+            }
+        }
+
+        return -1;
+    },
+
+    /**
+     * Retrieve a callback by its id.  Useful to modify the configuration
+     * while the queue is running.
+     *
+     * @method getCallback
+     * @param id {String} the id assigned to the callback
+     * @return {Object} the callback object
+     */
+    getCallback : function (id) {
+        var i = this.indexOf(id);
+
+        return (i > -1) ? this._q[i] : null;
+    },
+
+    /**
+     * Promotes the named callback to the top of the queue. If a callback is
+     * currently executing or looping (via until or iterations), the promotion
+     * is scheduled to occur after the current callback has completed.
+     *
+     * @method promote
+     * @param callback {String|Object} the callback object or a callback's id
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    promote : function (callback) {
+        var payload = { callback : callback },e;
+
+        if (this.isRunning()) {
+            e = this.after(SHIFT, function () {
+                    this.fire(PROMOTE, payload);
+                    e.detach();
+                }, this);
+        } else {
+            this.fire(PROMOTE, payload);
+        }
+
+        return this;
+    },
+
+    /**
+     * <p>Default functionality for the &quot;promote&quot; event.  Promotes the
+     * named callback to the head of the queue.</p>
+     *
+     * <p>The event object will contain a property &quot;callback&quot;, which
+     * holds the id of a callback or the callback object itself.</p>
+     *
+     * @method _defPromoteFn
+     * @param e {Event} the custom event
+     * @protected
+     */
+    _defPromoteFn : function (e) {
+        var i = this.indexOf(e.callback),
+            promoted = (i > -1) ? this._q.splice(i,1)[0] : null;
+
+        e.promoted = promoted;
+
+        if (promoted) {
+            this._q.unshift(promoted);
+        }
+    },
+
+    /**
+     * Removes the callback from the queue.  If the queue is active, the
+     * removal is scheduled to occur after the current callback has completed.
+     *
+     * @method remove
+     * @param callback {String|Object} the callback object or a callback's id
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    remove : function (callback) {
+        var payload = { callback : callback },e;
+
+        // Can't return the removed callback because of the deferral until
+        // current callback is complete
+        if (this.isRunning()) {
+            e = this.after(SHIFT, function () {
+                    this.fire(REMOVE, payload);
+                    e.detach();
+                },this);
+        } else {
+            this.fire(REMOVE, payload);
+        }
+
+        return this;
+    },
+
+    /**
+     * <p>Default functionality for the &quot;remove&quot; event.  Removes the
+     * callback from the queue.</p>
+     *
+     * <p>The event object will contain a property &quot;callback&quot;, which
+     * holds the id of a callback or the callback object itself.</p>
+     *
+     * @method _defRemoveFn
+     * @param e {Event} the custom event
+     * @protected
+     */
+    _defRemoveFn : function (e) {
+        var i = this.indexOf(e.callback);
+
+        e.removed = (i > -1) ? this._q.splice(i,1)[0] : null;
+    },
+
+    /**
+     * Returns the number of callbacks in the queue.
+     *
+     * @method size
+     * @return {Number}
+     */
+    size : function () {
+        // next() flushes callbacks that have met their until() criteria and
+        // therefore shouldn't count since they wouldn't execute anyway.
+        if (!this.isRunning()) {
+            this.next();
+        }
+
+        return this._q.length;
+    }
+});
+
+
+
+}, '3.5.1' ,{requires:['event-custom']});

=== added file 'debian/extras/jslibs/yui/async-queue/async-queue-min.js'
--- debian/extras/jslibs/yui/async-queue/async-queue-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/async-queue/async-queue-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("async-queue",function(g){g.AsyncQueue=function(){this._init();this.add.apply(this,arguments);};var e=g.AsyncQueue,c="execute",b="shift",d="promote",h="remove",a=g.Lang.isObject,f=g.Lang.isFunction;e.defaults=g.mix({autoContinue:true,iterations:1,timeout:10,until:function(){this.iterations|=0;return this.iterations<=0;}},g.config.queueDefaults||{});g.extend(e,g.EventTarget,{_running:false,_init:function(){g.EventTarget.call(this,{prefix:"queue",emitFacade:true});this._q=[];this.defaults={};this._initEvents();},_initEvents:function(){this.publish({"execute":{defaultFn:this._defExecFn,emitFacade:true},"shift":{defaultFn:this._defShiftFn,emitFacade:true},"add":{defaultFn:this._defAddFn,emitFacade:true},"promote":{defaultFn:this._defPromoteFn,emitFacade:true},"remove":{defaultFn:this._defRemoveFn,emitFacade:true}});},next:function(){var i;while(this._q.length){i=this._q[0]=this._prepare(this._q[0]);if(i&&i.until()){this.fire(b,{callback:i});i=null;}else{break;}}return i||null;},_defShiftFn:function(i){if(this.indexOf(i.callback)===0){this._q.shift();}},_prepare:function(k){if(f(k)&&k._prepared){return k;}var i=g.merge(e.defaults,{context:this,args:[],_prepared:true},this.defaults,(f(k)?{fn:k}:k)),j=g.bind(function(){if(!j._running){j.iterations--;}if(f(j.fn)){j.fn.apply(j.context||g,g.Array(j.args));}},this);return g.mix(j,i);},run:function(){var j,i=true;for(j=this.next();i&&j&&!this.isRunning();j=this.next()){i=(j.timeout<0)?this._execute(j):this._schedule(j);}if(!j){this.fire("complete");}return this;},_execute:function(j){this._running=j._running=true;j.iterations--;this.fire(c,{callback:j});var i=this._running&&j.autoContinue;this._running=j._running=false;return i;},_schedule:function(i){this._running=g.later(i.timeout,this,function(){if(this._execute(i)){this.run();}});return false;},isRunning:function(){return !!this._running;},_defExecFn:function(i){i.callback();},add:function(){this.fire("add",{callbacks:g.Array(arguments,0,true)});return this;},_defAddFn:function(j){var k=this._q,i=[];g.Array.each(j.callbacks,function(l){if(a(l)){k.push(l);i.push(l);}});j.added=i;},pause:function(){if(a(this._running)){this._running.cancel();}this._running=false;return this;},stop:function(){this._q=[];return this.pause();},indexOf:function(m){var k=0,j=this._q.length,l;for(;k<j;++k){l=this._q[k];if(l===m||l.id===m){return k;}}return -1;},getCallback:function(k){var j=this.indexOf(k);return(j>-1)?this._q[j]:null;},promote:function(k){var j={callback:k},i;if(this.isRunning()){i=this.after(b,function(){this.fire(d,j);i.detach();},this);}else{this.fire(d,j);}return this;},_defPromoteFn:function(l){var j=this.indexOf(l.callback),k=(j>-1)?this._q.splice(j,1)[0]:null;l.promoted=k;if(k){this._q.unshift(k);}},remove:function(k){var j={callback:k},i;if(this.isRunning()){i=this.after(b,function(){this.fire(h,j);i.detach();},this);}else{this.fire(h,j);}return this;},_defRemoveFn:function(k){var j=this.indexOf(k.callback);k.removed=(j>-1)?this._q.splice(j,1)[0]:null;},size:function(){if(!this.isRunning()){this.next();}return this._q.length;}});},"3.5.1",{requires:["event-custom"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/async-queue/async-queue.js'
--- debian/extras/jslibs/yui/async-queue/async-queue.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/async-queue/async-queue.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,528 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('async-queue', function(Y) {
+
+/**
+ * <p>AsyncQueue allows you create a chain of function callbacks executed
+ * via setTimeout (or synchronously) that are guaranteed to run in order.
+ * Items in the queue can be promoted or removed.  Start or resume the
+ * execution chain with run().  pause() to temporarily delay execution, or
+ * stop() to halt and clear the queue.</p>
+ *
+ * @module async-queue
+ */
+
+/**
+ * <p>A specialized queue class that supports scheduling callbacks to execute
+ * sequentially, iteratively, even asynchronously.</p>
+ *
+ * <p>Callbacks can be function refs or objects with the following keys.  Only
+ * the <code>fn</code> key is required.</p>
+ *
+ * <ul>
+ * <li><code>fn</code> -- The callback function</li>
+ * <li><code>context</code> -- The execution context for the callbackFn.</li>
+ * <li><code>args</code> -- Arguments to pass to callbackFn.</li>
+ * <li><code>timeout</code> -- Millisecond delay before executing callbackFn.
+ *                     (Applies to each iterative execution of callback)</li>
+ * <li><code>iterations</code> -- Number of times to repeat the callback.
+ * <li><code>until</code> -- Repeat the callback until this function returns
+ *                         true.  This setting trumps iterations.</li>
+ * <li><code>autoContinue</code> -- Set to false to prevent the AsyncQueue from
+ *                        executing the next callback in the Queue after
+ *                        the callback completes.</li>
+ * <li><code>id</code> -- Name that can be used to get, promote, get the
+ *                        indexOf, or delete this callback.</li>
+ * </ul>
+ *
+ * @class AsyncQueue
+ * @extends EventTarget
+ * @constructor
+ * @param callback* {Function|Object} 0..n callbacks to seed the queue
+ */
+Y.AsyncQueue = function() {
+    this._init();
+    this.add.apply(this, arguments);
+};
+
+var Queue   = Y.AsyncQueue,
+    EXECUTE = 'execute',
+    SHIFT   = 'shift',
+    PROMOTE = 'promote',
+    REMOVE  = 'remove',
+
+    isObject   = Y.Lang.isObject,
+    isFunction = Y.Lang.isFunction;
+
+/**
+ * <p>Static default values used to populate callback configuration properties.
+ * Preconfigured defaults include:</p>
+ *
+ * <ul>
+ *  <li><code>autoContinue</code>: <code>true</code></li>
+ *  <li><code>iterations</code>: 1</li>
+ *  <li><code>timeout</code>: 10 (10ms between callbacks)</li>
+ *  <li><code>until</code>: (function to run until iterations &lt;= 0)</li>
+ * </ul>
+ *
+ * @property defaults
+ * @type {Object}
+ * @static
+ */
+Queue.defaults = Y.mix({
+    autoContinue : true,
+    iterations   : 1,
+    timeout      : 10,
+    until        : function () {
+        this.iterations |= 0;
+        return this.iterations <= 0;
+    }
+}, Y.config.queueDefaults || {});
+
+Y.extend(Queue, Y.EventTarget, {
+    /**
+     * Used to indicate the queue is currently executing a callback.
+     *
+     * @property _running
+     * @type {Boolean|Object} true for synchronous callback execution, the
+     *                        return handle from Y.later for async callbacks.
+     *                        Otherwise false.
+     * @protected
+     */
+    _running : false,
+
+    /**
+     * Initializes the AsyncQueue instance properties and events.
+     *
+     * @method _init
+     * @protected
+     */
+    _init : function () {
+        Y.EventTarget.call(this, { prefix: 'queue', emitFacade: true });
+
+        this._q = [];
+
+        /** 
+         * Callback defaults for this instance.  Static defaults that are not
+         * overridden are also included.
+         *
+         * @property defaults
+         * @type {Object}
+         */
+        this.defaults = {};
+
+        this._initEvents();
+    },
+
+    /**
+     * Initializes the instance events.
+     *
+     * @method _initEvents
+     * @protected
+     */
+    _initEvents : function () {
+        this.publish({
+            'execute' : { defaultFn : this._defExecFn,    emitFacade: true },
+            'shift'   : { defaultFn : this._defShiftFn,   emitFacade: true },
+            'add'     : { defaultFn : this._defAddFn,     emitFacade: true },
+            'promote' : { defaultFn : this._defPromoteFn, emitFacade: true },
+            'remove'  : { defaultFn : this._defRemoveFn,  emitFacade: true }
+        });
+    },
+
+    /**
+     * Returns the next callback needing execution.  If a callback is
+     * configured to repeat via iterations or until, it will be returned until
+     * the completion criteria is met.
+     *
+     * When the queue is empty, null is returned.
+     *
+     * @method next
+     * @return {Function} the callback to execute
+     */
+    next : function () {
+        var callback;
+
+        while (this._q.length) {
+            callback = this._q[0] = this._prepare(this._q[0]);
+            if (callback && callback.until()) {
+                this.fire(SHIFT, { callback: callback });
+                callback = null;
+            } else {
+                break;
+            }
+        }
+
+        return callback || null;
+    },
+
+    /**
+     * Default functionality for the &quot;shift&quot; event.  Shifts the
+     * callback stored in the event object's <em>callback</em> property from
+     * the queue if it is the first item.
+     *
+     * @method _defShiftFn
+     * @param e {Event} The event object
+     * @protected
+     */
+    _defShiftFn : function (e) {
+        if (this.indexOf(e.callback) === 0) {
+            this._q.shift();
+        }
+    },
+
+    /**
+     * Creates a wrapper function to execute the callback using the aggregated 
+     * configuration generated by combining the static AsyncQueue.defaults, the
+     * instance defaults, and the specified callback settings.
+     *
+     * The wrapper function is decorated with the callback configuration as
+     * properties for runtime modification.
+     *
+     * @method _prepare
+     * @param callback {Object|Function} the raw callback
+     * @return {Function} a decorated function wrapper to execute the callback
+     * @protected
+     */
+    _prepare: function (callback) {
+        if (isFunction(callback) && callback._prepared) {
+            return callback;
+        }
+
+        var config = Y.merge(
+            Queue.defaults,
+            { context : this, args: [], _prepared: true },
+            this.defaults,
+            (isFunction(callback) ? { fn: callback } : callback)),
+            
+            wrapper = Y.bind(function () {
+                if (!wrapper._running) {
+                    wrapper.iterations--;
+                }
+                if (isFunction(wrapper.fn)) {
+                    wrapper.fn.apply(wrapper.context || Y,
+                                     Y.Array(wrapper.args));
+                }
+            }, this);
+            
+        return Y.mix(wrapper, config);
+    },
+
+    /**
+     * Sets the queue in motion.  All queued callbacks will be executed in
+     * order unless pause() or stop() is called or if one of the callbacks is
+     * configured with autoContinue: false.
+     *
+     * @method run
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    run : function () {
+        var callback,
+            cont = true;
+
+        for (callback = this.next();
+            cont && callback && !this.isRunning();
+            callback = this.next())
+        {
+            cont = (callback.timeout < 0) ?
+                this._execute(callback) :
+                this._schedule(callback);
+        }
+
+        if (!callback) {
+            /**
+             * Event fired after the last queued callback is executed.
+             * @event complete
+             */
+            this.fire('complete');
+        }
+
+        return this;
+    },
+
+    /**
+     * Handles the execution of callbacks. Returns a boolean indicating
+     * whether it is appropriate to continue running.
+     *
+     * @method _execute
+     * @param callback {Object} the callback object to execute
+     * @return {Boolean} whether the run loop should continue
+     * @protected
+     */
+    _execute : function (callback) {
+        this._running = callback._running = true;
+
+        callback.iterations--;
+        this.fire(EXECUTE, { callback: callback });
+
+        var cont = this._running && callback.autoContinue;
+
+        this._running = callback._running = false;
+
+        return cont;
+    },
+
+    /**
+     * Schedules the execution of asynchronous callbacks.
+     *
+     * @method _schedule
+     * @param callback {Object} the callback object to execute
+     * @return {Boolean} whether the run loop should continue
+     * @protected
+     */
+    _schedule : function (callback) {
+        this._running = Y.later(callback.timeout, this, function () {
+            if (this._execute(callback)) {
+                this.run();
+            }
+        });
+
+        return false;
+    },
+
+    /**
+     * Determines if the queue is waiting for a callback to complete execution.
+     *
+     * @method isRunning
+     * @return {Boolean} true if queue is waiting for a 
+     *                   from any initiated transactions
+     */
+    isRunning : function () {
+        return !!this._running;
+    },
+
+    /**
+     * Default functionality for the &quot;execute&quot; event.  Executes the
+     * callback function
+     *
+     * @method _defExecFn
+     * @param e {Event} the event object
+     * @protected
+     */
+    _defExecFn : function (e) {
+        e.callback();
+    },
+
+    /**
+     * Add any number of callbacks to the end of the queue. Callbacks may be
+     * provided as functions or objects.
+     *
+     * @method add
+     * @param callback* {Function|Object} 0..n callbacks
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    add : function () {
+        this.fire('add', { callbacks: Y.Array(arguments,0,true) });
+
+        return this;
+    },
+
+    /**
+     * Default functionality for the &quot;add&quot; event.  Adds the callbacks
+     * in the event facade to the queue. Callbacks successfully added to the
+     * queue are present in the event's <code>added</code> property in the
+     * after phase.
+     *
+     * @method _defAddFn
+     * @param e {Event} the event object
+     * @protected
+     */
+    _defAddFn : function(e) {
+        var _q = this._q,
+            added = [];
+
+        Y.Array.each(e.callbacks, function (c) {
+            if (isObject(c)) {
+                _q.push(c);
+                added.push(c);
+            }
+        });
+
+        e.added = added;
+    },
+
+    /**
+     * Pause the execution of the queue after the execution of the current
+     * callback completes.  If called from code outside of a queued callback,
+     * clears the timeout for the pending callback. Paused queue can be
+     * restarted with q.run()
+     *
+     * @method pause
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    pause: function () {
+        if (isObject(this._running)) {
+            this._running.cancel();
+        }
+
+        this._running = false;
+
+        return this;
+    },
+
+    /**
+     * Stop and clear the queue after the current execution of the
+     * current callback completes.
+     *
+     * @method stop
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    stop : function () { 
+        this._q = [];
+
+        return this.pause();
+    },
+
+    /** 
+     * Returns the current index of a callback.  Pass in either the id or
+     * callback function from getCallback.
+     *
+     * @method indexOf
+     * @param callback {String|Function} the callback or its specified id
+     * @return {Number} index of the callback or -1 if not found
+     */
+    indexOf : function (callback) {
+        var i = 0, len = this._q.length, c;
+
+        for (; i < len; ++i) {
+            c = this._q[i];
+            if (c === callback || c.id === callback) {
+                return i;
+            }
+        }
+
+        return -1;
+    },
+
+    /**
+     * Retrieve a callback by its id.  Useful to modify the configuration
+     * while the queue is running.
+     *
+     * @method getCallback
+     * @param id {String} the id assigned to the callback
+     * @return {Object} the callback object
+     */
+    getCallback : function (id) {
+        var i = this.indexOf(id);
+
+        return (i > -1) ? this._q[i] : null;
+    },
+
+    /**
+     * Promotes the named callback to the top of the queue. If a callback is
+     * currently executing or looping (via until or iterations), the promotion
+     * is scheduled to occur after the current callback has completed.
+     *
+     * @method promote
+     * @param callback {String|Object} the callback object or a callback's id
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    promote : function (callback) {
+        var payload = { callback : callback },e;
+
+        if (this.isRunning()) {
+            e = this.after(SHIFT, function () {
+                    this.fire(PROMOTE, payload);
+                    e.detach();
+                }, this);
+        } else {
+            this.fire(PROMOTE, payload);
+        }
+
+        return this;
+    },
+
+    /**
+     * <p>Default functionality for the &quot;promote&quot; event.  Promotes the
+     * named callback to the head of the queue.</p>
+     *
+     * <p>The event object will contain a property &quot;callback&quot;, which
+     * holds the id of a callback or the callback object itself.</p>
+     *
+     * @method _defPromoteFn
+     * @param e {Event} the custom event
+     * @protected
+     */
+    _defPromoteFn : function (e) {
+        var i = this.indexOf(e.callback),
+            promoted = (i > -1) ? this._q.splice(i,1)[0] : null;
+
+        e.promoted = promoted;
+
+        if (promoted) {
+            this._q.unshift(promoted);
+        }
+    },
+
+    /**
+     * Removes the callback from the queue.  If the queue is active, the
+     * removal is scheduled to occur after the current callback has completed.
+     *
+     * @method remove
+     * @param callback {String|Object} the callback object or a callback's id
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    remove : function (callback) {
+        var payload = { callback : callback },e;
+
+        // Can't return the removed callback because of the deferral until
+        // current callback is complete
+        if (this.isRunning()) {
+            e = this.after(SHIFT, function () {
+                    this.fire(REMOVE, payload);
+                    e.detach();
+                },this);
+        } else {
+            this.fire(REMOVE, payload);
+        }
+
+        return this;
+    },
+
+    /**
+     * <p>Default functionality for the &quot;remove&quot; event.  Removes the
+     * callback from the queue.</p>
+     *
+     * <p>The event object will contain a property &quot;callback&quot;, which
+     * holds the id of a callback or the callback object itself.</p>
+     *
+     * @method _defRemoveFn
+     * @param e {Event} the custom event
+     * @protected
+     */
+    _defRemoveFn : function (e) {
+        var i = this.indexOf(e.callback);
+
+        e.removed = (i > -1) ? this._q.splice(i,1)[0] : null;
+    },
+
+    /**
+     * Returns the number of callbacks in the queue.
+     *
+     * @method size
+     * @return {Number}
+     */
+    size : function () {
+        // next() flushes callbacks that have met their until() criteria and
+        // therefore shouldn't count since they wouldn't execute anyway.
+        if (!this.isRunning()) {
+            this.next();
+        }
+
+        return this._q.length;
+    }
+});
+
+
+
+}, '3.5.1' ,{requires:['event-custom']});

=== added directory 'debian/extras/jslibs/yui/attribute-base'
=== added file 'debian/extras/jslibs/yui/attribute-base/attribute-base-debug.js'
--- debian/extras/jslibs/yui/attribute-base/attribute-base-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-base/attribute-base-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,111 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('attribute-base', function(Y) {
+
+    /**
+     * The attribute module provides an augmentable Attribute implementation, which 
+     * adds configurable attributes and attribute change events to the class being 
+     * augmented. It also provides a State class, which is used internally by Attribute,
+     * but can also be used independently to provide a name/property/value data structure to
+     * store state.
+     *
+     * @module attribute
+     */
+
+    /**
+     * The attribute-base submodule provides core attribute handling support, with everything
+     * aside from complex attribute handling in the provider's constructor.
+     *
+     * @module attribute
+     * @submodule attribute-base
+     */
+    
+    /**
+     * <p>
+     * Attribute provides configurable attribute support along with attribute change events. It is designed to be 
+     * augmented on to a host class, and provides the host with the ability to configure attributes to store and retrieve state, 
+     * along with attribute change events.
+     * </p>
+     * <p>For example, attributes added to the host can be configured:</p>
+     * <ul>
+     *     <li>As read only.</li>
+     *     <li>As write once.</li>
+     *     <li>With a setter function, which can be used to manipulate
+     *     values passed to Attribute's <a href="#method_set">set</a> method, before they are stored.</li>
+     *     <li>With a getter function, which can be used to manipulate stored values,
+     *     before they are returned by Attribute's <a href="#method_get">get</a> method.</li>
+     *     <li>With a validator function, to validate values before they are stored.</li>
+     * </ul>
+     *
+     * <p>See the <a href="#method_addAttr">addAttr</a> method, for the complete set of configuration
+     * options available for attributes.</p>
+     *
+     * <p><strong>NOTE:</strong> Most implementations will be better off extending the <a href="Base.html">Base</a> class, 
+     * instead of augmenting Attribute directly. Base augments Attribute and will handle the initial configuration 
+     * of attributes for derived classes, accounting for values passed into the constructor.</p>
+     *
+     * @class Attribute
+     * @param attrs {Object} The attributes to add during construction (passed through to <a href="#method_addAttrs">addAttrs</a>). These can also be defined on the constructor being augmented with Attribute by defining the ATTRS property on the constructor.
+     * @param values {Object} The initial attribute values to apply (passed through to <a href="#method_addAttrs">addAttrs</a>). These are not merged/cloned. The caller is responsible for isolating user provided values if required.
+     * @param lazy {boolean} Whether or not to add attributes lazily (passed through to <a href="#method_addAttrs">addAttrs</a>).
+     * @uses AttributeCore
+     * @uses AttributeEvents
+     * @uses EventTarget
+     * @uses AttributeExtras
+     */
+    var Attribute = function() {
+
+        // Fix #2531929 
+        // Complete hack, to make sure the first clone of a node value in IE doesn't doesn't hurt state - maintains 3.4.1 behavior.
+        // Too late in the release cycle to do anything about the core problem.
+        // The root issue is that cloning a Y.Node instance results in an object which barfs in IE, when you access it's properties (since 3.3.0).
+        this._ATTR_E_FACADE = null;
+        this._yuievt = null;
+
+        Y.AttributeCore.apply(this, arguments);
+        Y.AttributeEvents.apply(this, arguments);
+        Y.AttributeExtras.apply(this, arguments);
+    };
+
+    Y.mix(Attribute, Y.AttributeCore, false, null, 1);
+    Y.mix(Attribute, Y.AttributeExtras, false, null, 1);
+
+    // Needs to be "true", to overwrite methods from AttributeCore
+    Y.mix(Attribute, Y.AttributeEvents, true, null, 1);
+
+    /**
+     * <p>The value to return from an attribute setter in order to prevent the set from going through.</p>
+     *
+     * <p>You can return this value from your setter if you wish to combine validator and setter 
+     * functionality into a single setter function, which either returns the massaged value to be stored or 
+     * AttributeCore.INVALID_VALUE to prevent invalid values from being stored.</p>
+     *
+     * @property INVALID_VALUE
+     * @type Object
+     * @static
+     * @final
+     */
+    Attribute.INVALID_VALUE = Y.AttributeCore.INVALID_VALUE;
+
+    /**
+     * The list of properties which can be configured for 
+     * each attribute (e.g. setter, getter, writeOnce etc.).
+     *
+     * This property is used internally as a whitelist for faster
+     * Y.mix operations.
+     *
+     * @property _ATTR_CFG
+     * @type Array
+     * @static
+     * @protected
+     */
+    Attribute._ATTR_CFG = Y.AttributeCore._ATTR_CFG.concat(Y.AttributeEvents._ATTR_CFG);
+
+    Y.Attribute = Attribute;
+
+
+}, '3.5.1' ,{requires:['attribute-core', 'attribute-events', 'attribute-extras']});

=== added file 'debian/extras/jslibs/yui/attribute-base/attribute-base-min.js'
--- debian/extras/jslibs/yui/attribute-base/attribute-base-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-base/attribute-base-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("attribute-base",function(b){var a=function(){this._ATTR_E_FACADE=null;this._yuievt=null;b.AttributeCore.apply(this,arguments);b.AttributeEvents.apply(this,arguments);b.AttributeExtras.apply(this,arguments);};b.mix(a,b.AttributeCore,false,null,1);b.mix(a,b.AttributeExtras,false,null,1);b.mix(a,b.AttributeEvents,true,null,1);a.INVALID_VALUE=b.AttributeCore.INVALID_VALUE;a._ATTR_CFG=b.AttributeCore._ATTR_CFG.concat(b.AttributeEvents._ATTR_CFG);b.Attribute=a;},"3.5.1",{requires:["attribute-core","attribute-events","attribute-extras"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/attribute-base/attribute-base.js'
--- debian/extras/jslibs/yui/attribute-base/attribute-base.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-base/attribute-base.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,111 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('attribute-base', function(Y) {
+
+    /**
+     * The attribute module provides an augmentable Attribute implementation, which 
+     * adds configurable attributes and attribute change events to the class being 
+     * augmented. It also provides a State class, which is used internally by Attribute,
+     * but can also be used independently to provide a name/property/value data structure to
+     * store state.
+     *
+     * @module attribute
+     */
+
+    /**
+     * The attribute-base submodule provides core attribute handling support, with everything
+     * aside from complex attribute handling in the provider's constructor.
+     *
+     * @module attribute
+     * @submodule attribute-base
+     */
+    
+    /**
+     * <p>
+     * Attribute provides configurable attribute support along with attribute change events. It is designed to be 
+     * augmented on to a host class, and provides the host with the ability to configure attributes to store and retrieve state, 
+     * along with attribute change events.
+     * </p>
+     * <p>For example, attributes added to the host can be configured:</p>
+     * <ul>
+     *     <li>As read only.</li>
+     *     <li>As write once.</li>
+     *     <li>With a setter function, which can be used to manipulate
+     *     values passed to Attribute's <a href="#method_set">set</a> method, before they are stored.</li>
+     *     <li>With a getter function, which can be used to manipulate stored values,
+     *     before they are returned by Attribute's <a href="#method_get">get</a> method.</li>
+     *     <li>With a validator function, to validate values before they are stored.</li>
+     * </ul>
+     *
+     * <p>See the <a href="#method_addAttr">addAttr</a> method, for the complete set of configuration
+     * options available for attributes.</p>
+     *
+     * <p><strong>NOTE:</strong> Most implementations will be better off extending the <a href="Base.html">Base</a> class, 
+     * instead of augmenting Attribute directly. Base augments Attribute and will handle the initial configuration 
+     * of attributes for derived classes, accounting for values passed into the constructor.</p>
+     *
+     * @class Attribute
+     * @param attrs {Object} The attributes to add during construction (passed through to <a href="#method_addAttrs">addAttrs</a>). These can also be defined on the constructor being augmented with Attribute by defining the ATTRS property on the constructor.
+     * @param values {Object} The initial attribute values to apply (passed through to <a href="#method_addAttrs">addAttrs</a>). These are not merged/cloned. The caller is responsible for isolating user provided values if required.
+     * @param lazy {boolean} Whether or not to add attributes lazily (passed through to <a href="#method_addAttrs">addAttrs</a>).
+     * @uses AttributeCore
+     * @uses AttributeEvents
+     * @uses EventTarget
+     * @uses AttributeExtras
+     */
+    var Attribute = function() {
+
+        // Fix #2531929 
+        // Complete hack, to make sure the first clone of a node value in IE doesn't doesn't hurt state - maintains 3.4.1 behavior.
+        // Too late in the release cycle to do anything about the core problem.
+        // The root issue is that cloning a Y.Node instance results in an object which barfs in IE, when you access it's properties (since 3.3.0).
+        this._ATTR_E_FACADE = null;
+        this._yuievt = null;
+
+        Y.AttributeCore.apply(this, arguments);
+        Y.AttributeEvents.apply(this, arguments);
+        Y.AttributeExtras.apply(this, arguments);
+    };
+
+    Y.mix(Attribute, Y.AttributeCore, false, null, 1);
+    Y.mix(Attribute, Y.AttributeExtras, false, null, 1);
+
+    // Needs to be "true", to overwrite methods from AttributeCore
+    Y.mix(Attribute, Y.AttributeEvents, true, null, 1);
+
+    /**
+     * <p>The value to return from an attribute setter in order to prevent the set from going through.</p>
+     *
+     * <p>You can return this value from your setter if you wish to combine validator and setter 
+     * functionality into a single setter function, which either returns the massaged value to be stored or 
+     * AttributeCore.INVALID_VALUE to prevent invalid values from being stored.</p>
+     *
+     * @property INVALID_VALUE
+     * @type Object
+     * @static
+     * @final
+     */
+    Attribute.INVALID_VALUE = Y.AttributeCore.INVALID_VALUE;
+
+    /**
+     * The list of properties which can be configured for 
+     * each attribute (e.g. setter, getter, writeOnce etc.).
+     *
+     * This property is used internally as a whitelist for faster
+     * Y.mix operations.
+     *
+     * @property _ATTR_CFG
+     * @type Array
+     * @static
+     * @protected
+     */
+    Attribute._ATTR_CFG = Y.AttributeCore._ATTR_CFG.concat(Y.AttributeEvents._ATTR_CFG);
+
+    Y.Attribute = Attribute;
+
+
+}, '3.5.1' ,{requires:['attribute-core', 'attribute-events', 'attribute-extras']});

=== added directory 'debian/extras/jslibs/yui/attribute-complex'
=== added file 'debian/extras/jslibs/yui/attribute-complex/attribute-complex-debug.js'
--- debian/extras/jslibs/yui/attribute-complex/attribute-complex-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-complex/attribute-complex-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,132 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('attribute-complex', function(Y) {
+
+    /**
+     * Adds support for attribute providers to handle complex attributes in the constructor
+     *
+     * @module attribute
+     * @submodule attribute-complex
+     * @for Attribute
+     */
+
+    var O = Y.Object,
+        DOT = ".";
+
+    Y.Attribute.Complex = function() {};
+    Y.Attribute.Complex.prototype = {
+
+        /**
+         * Utility method to split out simple attribute name/value pairs ("x") 
+         * from complex attribute name/value pairs ("x.y.z"), so that complex
+         * attributes can be keyed by the top level attribute name.
+         *
+         * @method _normAttrVals
+         * @param {Object} valueHash An object with attribute name/value pairs
+         *
+         * @return {Object} An object literal with 2 properties - "simple" and "complex",
+         * containing simple and complex attribute values respectively keyed 
+         * by the top level attribute name, or null, if valueHash is falsey.
+         *
+         * @private
+         */
+        _normAttrVals : function(valueHash) {
+            var vals = {},
+                subvals = {},
+                path,
+                attr,
+                v, k;
+
+            if (valueHash) {
+                for (k in valueHash) {
+                    if (valueHash.hasOwnProperty(k)) {
+                        if (k.indexOf(DOT) !== -1) {
+                            path = k.split(DOT);
+                            attr = path.shift();
+                            v = subvals[attr] = subvals[attr] || [];
+                            v[v.length] = {
+                                path : path, 
+                                value: valueHash[k]
+                            };
+                        } else {
+                            vals[k] = valueHash[k];
+                        }
+                    }
+                }
+                return { simple:vals, complex:subvals };
+            } else {
+                return null;
+            }
+        },
+
+        /**
+         * Returns the initial value of the given attribute from
+         * either the default configuration provided, or the 
+         * over-ridden value if it exists in the set of initValues 
+         * provided and the attribute is not read-only.
+         *
+         * @param {String} attr The name of the attribute
+         * @param {Object} cfg The attribute configuration object
+         * @param {Object} initValues The object with simple and complex attribute name/value pairs returned from _normAttrVals
+         *
+         * @return {Any} The initial value of the attribute.
+         *
+         * @method _getAttrInitVal
+         * @private
+         */
+        _getAttrInitVal : function(attr, cfg, initValues) {
+
+            var val = cfg.value,
+                valFn = cfg.valueFn,
+                simple,
+                complex,
+                i,
+                l,
+                path,
+                subval,
+                subvals;
+
+            if (valFn) {
+                if (!valFn.call) {
+                    valFn = this[valFn];
+                }
+                if (valFn) {
+                    val = valFn.call(this, attr);
+                }
+            }
+
+            if (!cfg.readOnly && initValues) {
+
+                // Simple Attributes
+                simple = initValues.simple;
+                if (simple && simple.hasOwnProperty(attr)) {
+                    val = simple[attr];
+                }
+
+                // Complex Attributes (complex values applied, after simple, incase both are set)
+                complex = initValues.complex;
+                if (complex && complex.hasOwnProperty(attr)) {
+                    subvals = complex[attr];
+                    for (i = 0, l = subvals.length; i < l; ++i) {
+                        path = subvals[i].path;
+                        subval = subvals[i].value;
+                        O.setValue(val, path, subval);
+                    }
+                }
+            }
+
+            return val;
+        }
+    };
+
+    Y.mix(Y.Attribute, Y.Attribute.Complex, true, null, 1);
+
+    // Consistency with the rest of the Attribute addons for now. 
+    Y.AttributeComplex = Y.Attribute.Complex;
+
+
+}, '3.5.1' ,{requires:['attribute-base']});

=== added file 'debian/extras/jslibs/yui/attribute-complex/attribute-complex-min.js'
--- debian/extras/jslibs/yui/attribute-complex/attribute-complex-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-complex/attribute-complex-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("attribute-complex",function(b){var a=b.Object,c=".";b.Attribute.Complex=function(){};b.Attribute.Complex.prototype={_normAttrVals:function(g){var i={},h={},j,d,f,e;if(g){for(e in g){if(g.hasOwnProperty(e)){if(e.indexOf(c)!==-1){j=e.split(c);d=j.shift();f=h[d]=h[d]||[];f[f.length]={path:j,value:g[e]};}else{i[e]=g[e];}}}return{simple:i,complex:h};}else{return null;}},_getAttrInitVal:function(m,j,p){var e=j.value,o=j.valueFn,d,f,h,g,q,n,k;if(o){if(!o.call){o=this[o];}if(o){e=o.call(this,m);}}if(!j.readOnly&&p){d=p.simple;if(d&&d.hasOwnProperty(m)){e=d[m];}f=p.complex;if(f&&f.hasOwnProperty(m)){k=f[m];for(h=0,g=k.length;h<g;++h){q=k[h].path;n=k[h].value;a.setValue(e,q,n);}}}return e;}};b.mix(b.Attribute,b.Attribute.Complex,true,null,1);b.AttributeComplex=b.Attribute.Complex;},"3.5.1",{requires:["attribute-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/attribute-complex/attribute-complex.js'
--- debian/extras/jslibs/yui/attribute-complex/attribute-complex.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-complex/attribute-complex.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,132 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('attribute-complex', function(Y) {
+
+    /**
+     * Adds support for attribute providers to handle complex attributes in the constructor
+     *
+     * @module attribute
+     * @submodule attribute-complex
+     * @for Attribute
+     */
+
+    var O = Y.Object,
+        DOT = ".";
+
+    Y.Attribute.Complex = function() {};
+    Y.Attribute.Complex.prototype = {
+
+        /**
+         * Utility method to split out simple attribute name/value pairs ("x") 
+         * from complex attribute name/value pairs ("x.y.z"), so that complex
+         * attributes can be keyed by the top level attribute name.
+         *
+         * @method _normAttrVals
+         * @param {Object} valueHash An object with attribute name/value pairs
+         *
+         * @return {Object} An object literal with 2 properties - "simple" and "complex",
+         * containing simple and complex attribute values respectively keyed 
+         * by the top level attribute name, or null, if valueHash is falsey.
+         *
+         * @private
+         */
+        _normAttrVals : function(valueHash) {
+            var vals = {},
+                subvals = {},
+                path,
+                attr,
+                v, k;
+
+            if (valueHash) {
+                for (k in valueHash) {
+                    if (valueHash.hasOwnProperty(k)) {
+                        if (k.indexOf(DOT) !== -1) {
+                            path = k.split(DOT);
+                            attr = path.shift();
+                            v = subvals[attr] = subvals[attr] || [];
+                            v[v.length] = {
+                                path : path, 
+                                value: valueHash[k]
+                            };
+                        } else {
+                            vals[k] = valueHash[k];
+                        }
+                    }
+                }
+                return { simple:vals, complex:subvals };
+            } else {
+                return null;
+            }
+        },
+
+        /**
+         * Returns the initial value of the given attribute from
+         * either the default configuration provided, or the 
+         * over-ridden value if it exists in the set of initValues 
+         * provided and the attribute is not read-only.
+         *
+         * @param {String} attr The name of the attribute
+         * @param {Object} cfg The attribute configuration object
+         * @param {Object} initValues The object with simple and complex attribute name/value pairs returned from _normAttrVals
+         *
+         * @return {Any} The initial value of the attribute.
+         *
+         * @method _getAttrInitVal
+         * @private
+         */
+        _getAttrInitVal : function(attr, cfg, initValues) {
+
+            var val = cfg.value,
+                valFn = cfg.valueFn,
+                simple,
+                complex,
+                i,
+                l,
+                path,
+                subval,
+                subvals;
+
+            if (valFn) {
+                if (!valFn.call) {
+                    valFn = this[valFn];
+                }
+                if (valFn) {
+                    val = valFn.call(this, attr);
+                }
+            }
+
+            if (!cfg.readOnly && initValues) {
+
+                // Simple Attributes
+                simple = initValues.simple;
+                if (simple && simple.hasOwnProperty(attr)) {
+                    val = simple[attr];
+                }
+
+                // Complex Attributes (complex values applied, after simple, incase both are set)
+                complex = initValues.complex;
+                if (complex && complex.hasOwnProperty(attr)) {
+                    subvals = complex[attr];
+                    for (i = 0, l = subvals.length; i < l; ++i) {
+                        path = subvals[i].path;
+                        subval = subvals[i].value;
+                        O.setValue(val, path, subval);
+                    }
+                }
+            }
+
+            return val;
+        }
+    };
+
+    Y.mix(Y.Attribute, Y.Attribute.Complex, true, null, 1);
+
+    // Consistency with the rest of the Attribute addons for now. 
+    Y.AttributeComplex = Y.Attribute.Complex;
+
+
+}, '3.5.1' ,{requires:['attribute-base']});

=== added directory 'debian/extras/jslibs/yui/attribute-core'
=== added file 'debian/extras/jslibs/yui/attribute-core/attribute-core-debug.js'
--- debian/extras/jslibs/yui/attribute-core/attribute-core-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-core/attribute-core-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,1029 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('attribute-core', function(Y) {
+
+    /**
+     * The State class maintains state for a collection of named items, with 
+     * a varying number of properties defined.
+     *
+     * It avoids the need to create a separate class for the item, and separate instances 
+     * of these classes for each item, by storing the state in a 2 level hash table, 
+     * improving performance when the number of items is likely to be large.
+     *
+     * @constructor
+     * @class State
+     */
+    Y.State = function() {
+        /**
+         * Hash of attributes
+         * @property data
+         */
+        this.data = {};
+    };
+
+    Y.State.prototype = {
+
+        /**
+         * Adds a property to an item.
+         *
+         * @method add
+         * @param name {String} The name of the item.
+         * @param key {String} The name of the property.
+         * @param val {Any} The value of the property.
+         */
+        add : function(name, key, val) {
+            var d = this.data;
+            d[name] = d[name] || {};
+            d[name][key] = val;
+        },
+
+        /**
+         * Adds multiple properties to an item.
+         *
+         * @method addAll
+         * @param name {String} The name of the item.
+         * @param o {Object} A hash of property/value pairs.
+         */
+        addAll: function(name, o) {
+            var key;
+
+            for (key in o) {
+                if (o.hasOwnProperty(key)) {
+                    this.add(name, key, o[key]);
+                }
+            }
+        },
+
+        /**
+         * Removes a property from an item.
+         *
+         * @method remove
+         * @param name {String} The name of the item.
+         * @param key {String} The property to remove.
+         */
+        remove: function(name, key) {
+            var d = this.data;
+            if (d[name]) {
+                delete d[name][key];
+            }
+        },
+
+        /**
+         * Removes multiple properties from an item, or remove the item completely.
+         *
+         * @method removeAll
+         * @param name {String} The name of the item.
+         * @param o {Object|Array} Collection of properties to delete. If not provided, the entire item is removed.
+         */
+        removeAll: function(name, o) {
+            var d = this.data;
+
+            if (!o) {
+                if (d[name]) {
+                    delete d[name];
+                }
+            } else {
+                Y.each(o, function(v, k) {
+                    if(Y.Lang.isString(k)) {
+                        this.remove(name, k);
+                    } else {
+                        this.remove(name, v);
+                    }
+                }, this);
+            }
+        },
+
+        /**
+         * For a given item, returns the value of the property requested, or undefined if not found.
+         *
+         * @method get
+         * @param name {String} The name of the item
+         * @param key {String} Optional. The property value to retrieve.
+         * @return {Any} The value of the supplied property.
+         */
+        get: function(name, key) {
+            var d = this.data;
+            return (d[name]) ? d[name][key] : undefined;
+        },
+
+        /**
+         * For the given item, returns an object with all of the
+         * item's property/value pairs. By default the object returned
+         * is a shallow copy of the stored data, but passing in true
+         * as the second parameter will return a reference to the stored
+         * data.
+         *
+         * @method getAll
+         * @param name {String} The name of the item
+         * @param reference {boolean} true, if you want a reference to the stored
+         * object 
+         * @return {Object} An object with property/value pairs for the item.
+         */
+        getAll : function(name, reference) {
+            var d = this.data, o;
+
+            if (!reference) {
+                Y.each(d[name], function(v, k) {
+                        o = o || {};
+                        o[k] = v;
+                });
+            } else {
+                o = d[name];
+            }
+
+            return o;
+        }
+    };
+    /**
+     * The attribute module provides an augmentable Attribute implementation, which 
+     * adds configurable attributes and attribute change events to the class being 
+     * augmented. It also provides a State class, which is used internally by Attribute,
+     * but can also be used independently to provide a name/property/value data structure to
+     * store state.
+     *
+     * @module attribute
+     */
+
+    /**
+     * The attribute-core submodule provides the lightest level of attribute handling support 
+     * without Attribute change events, or lesser used methods such as reset(), modifyAttrs(),
+     * and removeAttr().
+     *
+     * @module attribute
+     * @submodule attribute-core
+     */
+    var O = Y.Object,
+        Lang = Y.Lang,
+
+        DOT = ".",
+
+        // Externally configurable props
+        GETTER = "getter",
+        SETTER = "setter",
+        READ_ONLY = "readOnly",
+        WRITE_ONCE = "writeOnce",
+        INIT_ONLY = "initOnly",
+        VALIDATOR = "validator",
+        VALUE = "value",
+        VALUE_FN = "valueFn",
+        LAZY_ADD = "lazyAdd",
+
+        // Used for internal state management
+        ADDED = "added",
+        BYPASS_PROXY = "_bypassProxy",
+        INITIALIZING = "initializing",
+        INIT_VALUE = "initValue",
+        LAZY = "lazy",
+        IS_LAZY_ADD = "isLazyAdd",
+
+        INVALID_VALUE;
+
+    /**
+     * <p>
+     * AttributeCore provides the lightest level of configurable attribute support. It is designed to be 
+     * augmented on to a host class, and provides the host with the ability to configure 
+     * attributes to store and retrieve state, <strong>but without support for attribute change events</strong>.
+     * </p>
+     * <p>For example, attributes added to the host can be configured:</p>
+     * <ul>
+     *     <li>As read only.</li>
+     *     <li>As write once.</li>
+     *     <li>With a setter function, which can be used to manipulate
+     *     values passed to Attribute's <a href="#method_set">set</a> method, before they are stored.</li>
+     *     <li>With a getter function, which can be used to manipulate stored values,
+     *     before they are returned by Attribute's <a href="#method_get">get</a> method.</li>
+     *     <li>With a validator function, to validate values before they are stored.</li>
+     * </ul>
+     *
+     * <p>See the <a href="#method_addAttr">addAttr</a> method, for the complete set of configuration
+     * options available for attributes.</p>
+     * 
+     * <p>Object/Classes based on AttributeCore can augment <a href="AttributeEvents.html">AttributeEvents</a> 
+     * (with true for overwrite) and <a href="AttributeExtras.html">AttributeExtras</a> to add attribute event and 
+     * additional, less commonly used attribute methods, such as `modifyAttr`, `removeAttr` and `reset`.</p>   
+     *
+     * @class AttributeCore
+     * @param attrs {Object} The attributes to add during construction (passed through to <a href="#method_addAttrs">addAttrs</a>). These can also be defined on the constructor being augmented with Attribute by defining the ATTRS property on the constructor.
+     * @param values {Object} The initial attribute values to apply (passed through to <a href="#method_addAttrs">addAttrs</a>). These are not merged/cloned. The caller is responsible for isolating user provided values if required.
+     * @param lazy {boolean} Whether or not to add attributes lazily (passed through to <a href="#method_addAttrs">addAttrs</a>).
+     */
+    function AttributeCore(attrs, values, lazy) {
+        this._initAttrHost(attrs, values, lazy);            
+    }
+
+    /**
+     * <p>The value to return from an attribute setter in order to prevent the set from going through.</p>
+     *
+     * <p>You can return this value from your setter if you wish to combine validator and setter 
+     * functionality into a single setter function, which either returns the massaged value to be stored or 
+     * AttributeCore.INVALID_VALUE to prevent invalid values from being stored.</p>
+     *
+     * @property INVALID_VALUE
+     * @type Object
+     * @static
+     * @final
+     */
+    AttributeCore.INVALID_VALUE = {};
+    INVALID_VALUE = AttributeCore.INVALID_VALUE;
+
+    /**
+     * The list of properties which can be configured for 
+     * each attribute (e.g. setter, getter, writeOnce etc.).
+     *
+     * This property is used internally as a whitelist for faster
+     * Y.mix operations.
+     *
+     * @property _ATTR_CFG
+     * @type Array
+     * @static
+     * @protected
+     */
+    AttributeCore._ATTR_CFG = [SETTER, GETTER, VALIDATOR, VALUE, VALUE_FN, WRITE_ONCE, READ_ONLY, LAZY_ADD, BYPASS_PROXY];
+
+    AttributeCore.prototype = {
+
+        /**
+         * Constructor logic for attributes. Initializes the host state, and sets up the inital attributes passed to the 
+         * constructor.
+         *
+         * @method _initAttrHost
+         * @param attrs {Object} The attributes to add during construction (passed through to <a href="#method_addAttrs">addAttrs</a>). These can also be defined on the constructor being augmented with Attribute by defining the ATTRS property on the constructor.
+         * @param values {Object} The initial attribute values to apply (passed through to <a href="#method_addAttrs">addAttrs</a>). These are not merged/cloned. The caller is responsible for isolating user provided values if required.
+         * @param lazy {boolean} Whether or not to add attributes lazily (passed through to <a href="#method_addAttrs">addAttrs</a>).
+         * @private
+         */
+        _initAttrHost : function(attrs, values, lazy) {
+            this._state = new Y.State();
+            this._initAttrs(attrs, values, lazy);
+        },
+
+        /**
+         * <p>
+         * Adds an attribute with the provided configuration to the host object.
+         * </p>
+         * <p>
+         * The config argument object supports the following properties:
+         * </p>
+         * 
+         * <dl>
+         *    <dt>value &#60;Any&#62;</dt>
+         *    <dd>The initial value to set on the attribute</dd>
+         *
+         *    <dt>valueFn &#60;Function | String&#62;</dt>
+         *    <dd>
+         *    <p>A function, which will return the initial value to set on the attribute. This is useful
+         *    for cases where the attribute configuration is defined statically, but needs to 
+         *    reference the host instance ("this") to obtain an initial value. If both the value and valueFn properties are defined, 
+         *    the value returned by the valueFn has precedence over the value property, unless it returns undefined, in which 
+         *    case the value property is used.</p>
+         *
+         *    <p>valueFn can also be set to a string, representing the name of the instance method to be used to retrieve the value.</p>
+         *    </dd>
+         *
+         *    <dt>readOnly &#60;boolean&#62;</dt>
+         *    <dd>Whether or not the attribute is read only. Attributes having readOnly set to true
+         *        cannot be modified by invoking the set method.</dd>
+         *
+         *    <dt>writeOnce &#60;boolean&#62; or &#60;string&#62;</dt>
+         *    <dd>
+         *        Whether or not the attribute is "write once". Attributes having writeOnce set to true, 
+         *        can only have their values set once, be it through the default configuration, 
+         *        constructor configuration arguments, or by invoking set.
+         *        <p>The writeOnce attribute can also be set to the string "initOnly", in which case the attribute can only be set during initialization
+         *        (when used with Base, this means it can only be set during construction)</p>
+         *    </dd>
+         *
+         *    <dt>setter &#60;Function | String&#62;</dt>
+         *    <dd>
+         *    <p>The setter function used to massage or normalize the value passed to the set method for the attribute. 
+         *    The value returned by the setter will be the final stored value. Returning
+         *    <a href="#property_Attribute.INVALID_VALUE">Attribute.INVALID_VALUE</a>, from the setter will prevent
+         *    the value from being stored.
+         *    </p>
+         *    
+         *    <p>setter can also be set to a string, representing the name of the instance method to be used as the setter function.</p>
+         *    </dd>
+         *      
+         *    <dt>getter &#60;Function | String&#62;</dt>
+         *    <dd>
+         *    <p>
+         *    The getter function used to massage or normalize the value returned by the get method for the attribute.
+         *    The value returned by the getter function is the value which will be returned to the user when they 
+         *    invoke get.
+         *    </p>
+         *
+         *    <p>getter can also be set to a string, representing the name of the instance method to be used as the getter function.</p>
+         *    </dd>
+         *
+         *    <dt>validator &#60;Function | String&#62;</dt>
+         *    <dd>
+         *    <p>
+         *    The validator function invoked prior to setting the stored value. Returning
+         *    false from the validator function will prevent the value from being stored.
+         *    </p>
+         *    
+         *    <p>validator can also be set to a string, representing the name of the instance method to be used as the validator function.</p>
+         *    </dd>
+         *
+         *    <dt>lazyAdd &#60;boolean&#62;</dt>
+         *    <dd>Whether or not to delay initialization of the attribute until the first call to get/set it. 
+         *    This flag can be used to over-ride lazy initialization on a per attribute basis, when adding multiple attributes through 
+         *    the <a href="#method_addAttrs">addAttrs</a> method.</dd>
+         *
+         * </dl>
+         *
+         * <p>The setter, getter and validator are invoked with the value and name passed in as the first and second arguments, and with
+         * the context ("this") set to the host object.</p>
+         *
+         * <p>Configuration properties outside of the list mentioned above are considered private properties used internally by attribute, 
+         * and are not intended for public use.</p>
+         * 
+         * @method addAttr
+         *
+         * @param {String} name The name of the attribute.
+         * @param {Object} config An object with attribute configuration property/value pairs, specifying the configuration for the attribute.
+         *
+         * <p>
+         * <strong>NOTE:</strong> The configuration object is modified when adding an attribute, so if you need 
+         * to protect the original values, you will need to merge the object.
+         * </p>
+         *
+         * @param {boolean} lazy (optional) Whether or not to add this attribute lazily (on the first call to get/set). 
+         *
+         * @return {Object} A reference to the host object.
+         *
+         * @chainable
+         */
+        addAttr: function(name, config, lazy) {
+
+            Y.log('Adding attribute: ' + name, 'info', 'attribute');
+
+            var host = this, // help compression
+                state = host._state,
+                value,
+                hasValue;
+
+            config = config || {};
+
+            lazy = (LAZY_ADD in config) ? config[LAZY_ADD] : lazy;
+
+            if (lazy && !host.attrAdded(name)) {
+                state.addAll(name, {
+                    lazy : config,
+                    added : true
+                });
+            } else {
+
+                if (host.attrAdded(name) && !state.get(name, IS_LAZY_ADD)) { Y.log('Attribute: ' + name + ' already exists. Cannot add it again without removing it first', 'warn', 'attribute'); }
+
+                if (!host.attrAdded(name) || state.get(name, IS_LAZY_ADD)) {
+
+                    hasValue = (VALUE in config);
+
+                    if (config.readOnly && !hasValue) { Y.log('readOnly attribute: ' + name + ', added without an initial value. Value will be set on initial call to set', 'warn', 'attribute');}
+
+                    if (hasValue) {
+                        // We'll go through set, don't want to set value in config directly
+                        value = config.value;
+                        delete config.value;
+                    }
+
+                    config.added = true;
+                    config.initializing = true;
+
+                    state.addAll(name, config);
+
+                    if (hasValue) {
+                        // Go through set, so that raw values get normalized/validated
+                        host.set(name, value);
+                    }
+
+                    state.remove(name, INITIALIZING);
+                }
+            }
+
+            return host;
+        },
+
+        /**
+         * Checks if the given attribute has been added to the host
+         *
+         * @method attrAdded
+         * @param {String} name The name of the attribute to check.
+         * @return {boolean} true if an attribute with the given name has been added, false if it hasn't. This method will return true for lazily added attributes.
+         */
+        attrAdded: function(name) {
+            return !!this._state.get(name, ADDED);
+        },
+
+        /**
+         * Returns the current value of the attribute. If the attribute
+         * has been configured with a 'getter' function, this method will delegate
+         * to the 'getter' to obtain the value of the attribute.
+         *
+         * @method get
+         *
+         * @param {String} name The name of the attribute. If the value of the attribute is an Object, 
+         * dot notation can be used to obtain the value of a property of the object (e.g. <code>get("x.y.z")</code>)
+         *
+         * @return {Any} The value of the attribute
+         */
+        get : function(name) {
+            return this._getAttr(name);
+        },
+
+        /**
+         * Checks whether or not the attribute is one which has been
+         * added lazily and still requires initialization.
+         *
+         * @method _isLazyAttr
+         * @private
+         * @param {String} name The name of the attribute
+         * @return {boolean} true if it's a lazily added attribute, false otherwise.
+         */
+        _isLazyAttr: function(name) {
+            return this._state.get(name, LAZY);
+        },
+
+        /**
+         * Finishes initializing an attribute which has been lazily added.
+         *
+         * @method _addLazyAttr
+         * @private
+         * @param {Object} name The name of the attribute
+         */
+        _addLazyAttr: function(name, cfg) {
+            var state = this._state,
+                lazyCfg = state.get(name, LAZY);
+
+            state.add(name, IS_LAZY_ADD, true);
+            state.remove(name, LAZY);
+            this.addAttr(name, lazyCfg);
+        },
+
+        /**
+         * Sets the value of an attribute.
+         *
+         * @method set
+         * @chainable
+         *
+         * @param {String} name The name of the attribute. If the 
+         * current value of the attribute is an Object, dot notation can be used
+         * to set the value of a property within the object (e.g. <code>set("x.y.z", 5)</code>).
+         *
+         * @param {Any} value The value to set the attribute to.
+         *
+         * @return {Object} A reference to the host object.
+         */
+        set : function(name, val) {
+            return this._setAttr(name, val);
+        },
+
+        /**
+         * Allows setting of readOnly/writeOnce attributes. See <a href="#method_set">set</a> for argument details.
+         *
+         * @method _set
+         * @protected
+         * @chainable
+         * 
+         * @param {String} name The name of the attribute.
+         * @param {Any} val The value to set the attribute to.
+         * @return {Object} A reference to the host object.
+         */
+        _set : function(name, val) {
+            return this._setAttr(name, val, null, true);
+        },
+
+        /**
+         * Provides the common implementation for the public set and protected _set methods.
+         *
+         * See <a href="#method_set">set</a> for argument details.
+         *
+         * @method _setAttr
+         * @protected
+         * @chainable
+         *
+         * @param {String} name The name of the attribute.
+         * @param {Any} value The value to set the attribute to.
+         * @param {Object} opts (Optional) Optional event data to be mixed into
+         * the event facade passed to subscribers of the attribute's change event.
+         * This is currently a hack. There's no real need for the AttributeCore implementation
+         * to support this parameter, but breaking it out into AttributeEvents, results in
+         * additional function hops for the critical path. May change in 3.5.0 PR3.
+         * @param {boolean} force If true, allows the caller to set values for 
+         * readOnly or writeOnce attributes which have already been set.
+         *
+         * @return {Object} A reference to the host object.
+         */
+        _setAttr : function(name, val, opts, force)  {
+            
+            // HACK - no real reason core needs to know about opts, but 
+            // it adds fn hops if we want to break it out. 
+            // Not sure it's worth it for this critical path
+            
+            var allowSet = true,
+                state = this._state,
+                stateProxy = this._stateProxy,
+                cfg,
+                initialSet,
+                strPath,
+                path,
+                currVal,
+                writeOnce,
+                initializing;
+
+            if (name.indexOf(DOT) !== -1) {
+                strPath = name;
+                path = name.split(DOT);
+                name = path.shift();
+            }
+
+            if (this._isLazyAttr(name)) {
+                this._addLazyAttr(name);
+            }
+
+            cfg = state.getAll(name, true) || {}; 
+
+            initialSet = (!(VALUE in cfg));
+
+            if (stateProxy && name in stateProxy && !cfg._bypassProxy) {
+                // TODO: Value is always set for proxy. Can we do any better? Maybe take a snapshot as the initial value for the first call to set? 
+                initialSet = false;
+            }
+
+            writeOnce = cfg.writeOnce;
+            initializing = cfg.initializing;
+
+            if (!initialSet && !force) {
+
+                if (writeOnce) {
+                    Y.log('Set attribute:' + name + ', aborted; Attribute is writeOnce', 'warn', 'attribute');
+                    allowSet = false;
+                }
+
+                if (cfg.readOnly) {
+                    Y.log('Set attribute:' + name + ', aborted; Attribute is readOnly', 'warn', 'attribute');
+                    allowSet = false;
+                }
+            }
+
+            if (!initializing && !force && writeOnce === INIT_ONLY) {
+                Y.log('Set attribute:' + name + ', aborted; Attribute is writeOnce: "initOnly"', 'warn', 'attribute');
+                allowSet = false;
+            }
+
+            if (allowSet) {
+                // Don't need currVal if initialSet (might fail in custom getter if it always expects a non-undefined/non-null value)
+                if (!initialSet) {
+                    currVal =  this.get(name);
+                }
+
+                if (path) {
+                   val = O.setValue(Y.clone(currVal), path, val);
+
+                   if (val === undefined) {
+                       Y.log('Set attribute path:' + strPath + ', aborted; Path is invalid', 'warn', 'attribute');
+                       allowSet = false;
+                   }
+                }
+
+                if (allowSet) {
+                    if (!this._fireAttrChange || initializing) {
+                        this._setAttrVal(name, strPath, currVal, val);
+                    } else {
+                        // HACK - no real reason core needs to know about _fireAttrChange, but 
+                        // it adds fn hops if we want to break it out. Not sure it's worth it for this critical path
+                        this._fireAttrChange(name, strPath, currVal, val, opts);
+                    }
+                }
+            }
+
+            return this;
+        },
+
+        /**
+         * Provides the common implementation for the public get method,
+         * allowing Attribute hosts to over-ride either method.
+         *
+         * See <a href="#method_get">get</a> for argument details.
+         *
+         * @method _getAttr
+         * @protected
+         * @chainable
+         *
+         * @param {String} name The name of the attribute.
+         * @return {Any} The value of the attribute.
+         */
+        _getAttr : function(name) {
+            var host = this, // help compression
+                fullName = name,
+                state = host._state,
+                path,
+                getter,
+                val,
+                cfg;
+
+            if (name.indexOf(DOT) !== -1) {
+                path = name.split(DOT);
+                name = path.shift();
+            }
+
+            // On Demand - Should be rare - handles out of order valueFn references
+            if (host._tCfgs && host._tCfgs[name]) {
+                cfg = {};
+                cfg[name] = host._tCfgs[name];
+                delete host._tCfgs[name];
+                host._addAttrs(cfg, host._tVals);
+            }
+            
+            // Lazy Init
+            if (host._isLazyAttr(name)) {
+                host._addLazyAttr(name);
+            }
+
+            val = host._getStateVal(name);
+                        
+            getter = state.get(name, GETTER);
+
+            if (getter && !getter.call) {
+                getter = this[getter];
+            }
+
+            val = (getter) ? getter.call(host, val, fullName) : val;
+            val = (path) ? O.getValue(val, path) : val;
+
+            return val;
+        },
+
+        /**
+         * Gets the stored value for the attribute, from either the 
+         * internal state object, or the state proxy if it exits
+         * 
+         * @method _getStateVal
+         * @private
+         * @param {String} name The name of the attribute
+         * @return {Any} The stored value of the attribute
+         */
+        _getStateVal : function(name) {
+            var stateProxy = this._stateProxy;
+            return stateProxy && (name in stateProxy) && !this._state.get(name, BYPASS_PROXY) ? stateProxy[name] : this._state.get(name, VALUE);
+        },
+
+        /**
+         * Sets the stored value for the attribute, in either the 
+         * internal state object, or the state proxy if it exits
+         *
+         * @method _setStateVal
+         * @private
+         * @param {String} name The name of the attribute
+         * @param {Any} value The value of the attribute
+         */
+        _setStateVal : function(name, value) {
+            var stateProxy = this._stateProxy;
+            if (stateProxy && (name in stateProxy) && !this._state.get(name, BYPASS_PROXY)) {
+                stateProxy[name] = value;
+            } else {
+                this._state.add(name, VALUE, value);
+            }
+        },
+
+        /**
+         * Updates the stored value of the attribute in the privately held State object,
+         * if validation and setter passes.
+         *
+         * @method _setAttrVal
+         * @private
+         * @param {String} attrName The attribute name.
+         * @param {String} subAttrName The sub-attribute name, if setting a sub-attribute property ("x.y.z").
+         * @param {Any} prevVal The currently stored value of the attribute.
+         * @param {Any} newVal The value which is going to be stored.
+         * 
+         * @return {booolean} true if the new attribute value was stored, false if not.
+         */
+        _setAttrVal : function(attrName, subAttrName, prevVal, newVal) {
+
+            var host = this,
+                allowSet = true,
+                cfg = this._state.getAll(attrName, true) || {},
+                validator = cfg.validator,
+                setter = cfg.setter,
+                initializing = cfg.initializing,
+                prevRawVal = this._getStateVal(attrName),
+                name = subAttrName || attrName,
+                retVal,
+                valid;
+
+            if (validator) {
+                if (!validator.call) { 
+                    // Assume string - trying to keep critical path tight, so avoiding Lang check
+                    validator = this[validator];
+                }
+                if (validator) {
+                    valid = validator.call(host, newVal, name);
+
+                    if (!valid && initializing) {
+                        newVal = cfg.defaultValue;
+                        valid = true; // Assume it's valid, for perf.
+                    }
+                }
+            }
+
+            if (!validator || valid) {
+                if (setter) {
+                    if (!setter.call) {
+                        // Assume string - trying to keep critical path tight, so avoiding Lang check
+                        setter = this[setter];
+                    }
+                    if (setter) {
+                        retVal = setter.call(host, newVal, name);
+
+                        if (retVal === INVALID_VALUE) {
+                            Y.log('Attribute: ' + attrName + ', setter returned Attribute.INVALID_VALUE for value:' + newVal, 'warn', 'attribute');
+                            allowSet = false;
+                        } else if (retVal !== undefined){
+                            Y.log('Attribute: ' + attrName + ', raw value: ' + newVal + ' modified by setter to:' + retVal, 'info', 'attribute');
+                            newVal = retVal;
+                        }
+                    }
+                }
+
+                if (allowSet) {
+                    if(!subAttrName && (newVal === prevRawVal) && !Lang.isObject(newVal)) {
+                        Y.log('Attribute: ' + attrName + ', value unchanged:' + newVal, 'warn', 'attribute');
+                        allowSet = false;
+                    } else {
+                        // Store value
+                        if (!(INIT_VALUE in cfg)) {
+                            cfg.initValue = newVal;
+                        }
+                        host._setStateVal(attrName, newVal);
+                    }
+                }
+
+            } else {
+                Y.log('Attribute:' + attrName + ', Validation failed for value:' + newVal, 'warn', 'attribute');
+                allowSet = false;
+            }
+
+            return allowSet;
+        },
+
+        /**
+         * Sets multiple attribute values.
+         *
+         * @method setAttrs
+         * @param {Object} attrs  An object with attributes name/value pairs.
+         * @return {Object} A reference to the host object.
+         * @chainable
+         */
+        setAttrs : function(attrs) {
+            return this._setAttrs(attrs);
+        },
+
+        /**
+         * Implementation behind the public setAttrs method, to set multiple attribute values.
+         *
+         * @method _setAttrs
+         * @protected
+         * @param {Object} attrs  An object with attributes name/value pairs.
+         * @return {Object} A reference to the host object.
+         * @chainable
+         */
+        _setAttrs : function(attrs) {
+            for (var attr in attrs) {
+                if ( attrs.hasOwnProperty(attr) ) {
+                    this.set(attr, attrs[attr]);
+                }
+            }
+            return this;
+        },
+
+        /**
+         * Gets multiple attribute values.
+         *
+         * @method getAttrs
+         * @param {Array | boolean} attrs Optional. An array of attribute names. If omitted, all attribute values are
+         * returned. If set to true, all attributes modified from their initial values are returned.
+         * @return {Object} An object with attribute name/value pairs.
+         */
+        getAttrs : function(attrs) {
+            return this._getAttrs(attrs);
+        },
+
+        /**
+         * Implementation behind the public getAttrs method, to get multiple attribute values.
+         *
+         * @method _getAttrs
+         * @protected
+         * @param {Array | boolean} attrs Optional. An array of attribute names. If omitted, all attribute values are
+         * returned. If set to true, all attributes modified from their initial values are returned.
+         * @return {Object} An object with attribute name/value pairs.
+         */
+        _getAttrs : function(attrs) {
+            var host = this,
+                o = {}, 
+                i, l, attr, val,
+                modifiedOnly = (attrs === true);
+
+            // TODO - figure out how to get all "added"
+            attrs = (attrs && !modifiedOnly) ? attrs : O.keys(host._state.data);
+
+            for (i = 0, l = attrs.length; i < l; i++) {
+                // Go through get, to honor cloning/normalization
+                attr = attrs[i];
+                val = host.get(attr);
+
+                if (!modifiedOnly || host._getStateVal(attr) != host._state.get(attr, INIT_VALUE)) {
+                    o[attr] = host.get(attr); 
+                }
+            }
+
+            return o;
+        },
+
+        /**
+         * Configures a group of attributes, and sets initial values.
+         *
+         * <p>
+         * <strong>NOTE:</strong> This method does not isolate the configuration object by merging/cloning. 
+         * The caller is responsible for merging/cloning the configuration object if required.
+         * </p>
+         *
+         * @method addAttrs
+         * @chainable
+         *
+         * @param {Object} cfgs An object with attribute name/configuration pairs.
+         * @param {Object} values An object with attribute name/value pairs, defining the initial values to apply.
+         * Values defined in the cfgs argument will be over-written by values in this argument unless defined as read only.
+         * @param {boolean} lazy Whether or not to delay the intialization of these attributes until the first call to get/set.
+         * Individual attributes can over-ride this behavior by defining a lazyAdd configuration property in their configuration.
+         * See <a href="#method_addAttr">addAttr</a>.
+         * 
+         * @return {Object} A reference to the host object.
+         */
+        addAttrs : function(cfgs, values, lazy) {
+            var host = this; // help compression
+            if (cfgs) {
+                host._tCfgs = cfgs;
+                host._tVals = host._normAttrVals(values);
+                host._addAttrs(cfgs, host._tVals, lazy);
+                host._tCfgs = host._tVals = null;
+            }
+
+            return host;
+        },
+
+        /**
+         * Implementation behind the public addAttrs method. 
+         * 
+         * This method is invoked directly by get if it encounters a scenario 
+         * in which an attribute's valueFn attempts to obtain the 
+         * value an attribute in the same group of attributes, which has not yet 
+         * been added (on demand initialization).
+         *
+         * @method _addAttrs
+         * @private
+         * @param {Object} cfgs An object with attribute name/configuration pairs.
+         * @param {Object} values An object with attribute name/value pairs, defining the initial values to apply.
+         * Values defined in the cfgs argument will be over-written by values in this argument unless defined as read only.
+         * @param {boolean} lazy Whether or not to delay the intialization of these attributes until the first call to get/set.
+         * Individual attributes can over-ride this behavior by defining a lazyAdd configuration property in their configuration.
+         * See <a href="#method_addAttr">addAttr</a>.
+         */
+        _addAttrs : function(cfgs, values, lazy) {
+            var host = this, // help compression
+                attr,
+                attrCfg,
+                value;
+
+            for (attr in cfgs) {
+                if (cfgs.hasOwnProperty(attr)) {
+
+                    // Not Merging. Caller is responsible for isolating configs
+                    attrCfg = cfgs[attr];
+                    attrCfg.defaultValue = attrCfg.value;
+
+                    // Handle simple, complex and user values, accounting for read-only
+                    value = host._getAttrInitVal(attr, attrCfg, host._tVals);
+
+                    if (value !== undefined) {
+                        attrCfg.value = value;
+                    }
+
+                    if (host._tCfgs[attr]) {
+                        delete host._tCfgs[attr];
+                    }
+
+                    host.addAttr(attr, attrCfg, lazy);
+                }
+            }
+        },
+
+        /**
+         * Utility method to protect an attribute configuration
+         * hash, by merging the entire object and the individual 
+         * attr config objects. 
+         *
+         * @method _protectAttrs
+         * @protected
+         * @param {Object} attrs A hash of attribute to configuration object pairs.
+         * @return {Object} A protected version of the attrs argument.
+         */
+        _protectAttrs : function(attrs) {
+            if (attrs) {
+                attrs = Y.merge(attrs);
+                for (var attr in attrs) {
+                    if (attrs.hasOwnProperty(attr)) {
+                        attrs[attr] = Y.merge(attrs[attr]);
+                    }
+                }
+            }
+            return attrs;
+        },
+
+        /**
+         * Utility method to normalize attribute values. The base implementation 
+         * simply merges the hash to protect the original.
+         *
+         * @method _normAttrVals
+         * @param {Object} valueHash An object with attribute name/value pairs
+         *
+         * @return {Object}
+         *
+         * @private
+         */
+        _normAttrVals : function(valueHash) {
+            return (valueHash) ? Y.merge(valueHash) : null;
+        },
+
+        /**
+         * Returns the initial value of the given attribute from
+         * either the default configuration provided, or the 
+         * over-ridden value if it exists in the set of initValues 
+         * provided and the attribute is not read-only.
+         *
+         * @param {String} attr The name of the attribute
+         * @param {Object} cfg The attribute configuration object
+         * @param {Object} initValues The object with simple and complex attribute name/value pairs returned from _normAttrVals
+         *
+         * @return {Any} The initial value of the attribute.
+         *
+         * @method _getAttrInitVal
+         * @private
+         */
+        _getAttrInitVal : function(attr, cfg, initValues) {
+            var val, valFn;
+            // init value is provided by the user if it exists, else, provided by the config
+            if (!cfg.readOnly && initValues && initValues.hasOwnProperty(attr)) {
+                val = initValues[attr];
+            } else {
+                val = cfg.value;
+                valFn = cfg.valueFn;
+ 
+                if (valFn) {
+                    if (!valFn.call) {
+                        valFn = this[valFn];
+                    }
+                    if (valFn) {
+                        val = valFn.call(this, attr);
+                    }
+                }
+            }
+
+            Y.log('initValue for ' + attr + ':' + val, 'info', 'attribute');
+
+            return val;
+        },
+
+        /**
+         * Utility method to set up initial attributes defined during construction, either through the constructor.ATTRS property, or explicitly passed in.
+         * 
+         * @method _initAttrs
+         * @protected
+         * @param attrs {Object} The attributes to add during construction (passed through to <a href="#method_addAttrs">addAttrs</a>). These can also be defined on the constructor being augmented with Attribute by defining the ATTRS property on the constructor.
+         * @param values {Object} The initial attribute values to apply (passed through to <a href="#method_addAttrs">addAttrs</a>). These are not merged/cloned. The caller is responsible for isolating user provided values if required.
+         * @param lazy {boolean} Whether or not to add attributes lazily (passed through to <a href="#method_addAttrs">addAttrs</a>).
+         */
+        _initAttrs : function(attrs, values, lazy) {
+            // ATTRS support for Node, which is not Base based
+            attrs = attrs || this.constructor.ATTRS;
+    
+            var Base = Y.Base,
+                BaseCore = Y.BaseCore,
+                baseInst = (Base && Y.instanceOf(this, Base)),
+                baseCoreInst = (!baseInst && BaseCore && Y.instanceOf(this, BaseCore));
+
+            if ( attrs && !baseInst && !baseCoreInst) {
+                this.addAttrs(this._protectAttrs(attrs), values, lazy);
+            }
+        }
+    };
+
+    Y.AttributeCore = AttributeCore;
+
+
+}, '3.5.1' );

=== added file 'debian/extras/jslibs/yui/attribute-core/attribute-core-min.js'
--- debian/extras/jslibs/yui/attribute-core/attribute-core-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-core/attribute-core-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("attribute-core",function(c){c.State=function(){this.data={};};c.State.prototype={add:function(v,w,y){var x=this.data;x[v]=x[v]||{};x[v][w]=y;},addAll:function(v,x){var w;for(w in x){if(x.hasOwnProperty(w)){this.add(v,w,x[w]);}}},remove:function(v,w){var x=this.data;if(x[v]){delete x[v][w];}},removeAll:function(v,x){var w=this.data;if(!x){if(w[v]){delete w[v];}}else{c.each(x,function(z,y){if(c.Lang.isString(y)){this.remove(v,y);}else{this.remove(v,z);}},this);}},get:function(v,w){var x=this.data;return(x[v])?x[v][w]:undefined;},getAll:function(w,v){var y=this.data,x;if(!v){c.each(y[w],function(A,z){x=x||{};x[z]=A;});}else{x=y[w];}return x;}};var i=c.Object,d=c.Lang,q=".",k="getter",j="setter",l="readOnly",r="writeOnce",p="initOnly",u="validator",f="value",m="valueFn",o="lazyAdd",t="added",h="_bypassProxy",b="initializing",g="initValue",a="lazy",n="isLazyAdd",e;function s(w,v,x){this._initAttrHost(w,v,x);}s.INVALID_VALUE={};e=s.INVALID_VALUE;s._ATTR_CFG=[j,k,u,f,m,r,l,o,h];s.prototype={_initAttrHost:function(w,v,x){this._state=new c.State();this._initAttrs(w,v,x);},addAttr:function(w,v,y){var z=this,B=z._state,A,x;v=v||{};y=(o in v)?v[o]:y;if(y&&!z.attrAdded(w)){B.addAll(w,{lazy:v,added:true});}else{if(!z.attrAdded(w)||B.get(w,n)){x=(f in v);if(x){A=v.value;delete v.value;}v.added=true;v.initializing=true;B.addAll(w,v);if(x){z.set(w,A);}B.remove(w,b);}}return z;},attrAdded:function(v){return !!this._state.get(v,t);},get:function(v){return this._getAttr(v);},_isLazyAttr:function(v){return this._state.get(v,a);},_addLazyAttr:function(x,v){var y=this._state,w=y.get(x,a);y.add(x,n,true);y.remove(x,a);this.addAttr(x,w);},set:function(v,w){return this._setAttr(v,w);},_set:function(v,w){return this._setAttr(v,w,null,true);},_setAttr:function(x,A,v,y){var E=true,w=this._state,B=this._stateProxy,H,D,G,I,z,C,F;if(x.indexOf(q)!==-1){G=x;I=x.split(q);x=I.shift();}if(this._isLazyAttr(x)){this._addLazyAttr(x);}H=w.getAll(x,true)||{};D=(!(f in H));if(B&&x in B&&!H._bypassProxy){D=false;}C=H.writeOnce;F=H.initializing;if(!D&&!y){if(C){E=false;}if(H.readOnly){E=false;}}if(!F&&!y&&C===p){E=false;}if(E){if(!D){z=this.get(x);}if(I){A=i.setValue(c.clone(z),I,A);if(A===undefined){E=false;}}if(E){if(!this._fireAttrChange||F){this._setAttrVal(x,G,z,A);}else{this._fireAttrChange(x,G,z,A,v);}}}return this;},_getAttr:function(x){var y=this,C=x,z=y._state,A,v,B,w;if(x.indexOf(q)!==-1){A=x.split(q);x=A.shift();}if(y._tCfgs&&y._tCfgs[x]){w={};w[x]=y._tCfgs[x];delete y._tCfgs[x];y._addAttrs(w,y._tVals);}if(y._isLazyAttr(x)){y._addLazyAttr(x);}B=y._getStateVal(x);v=z.get(x,k);if(v&&!v.call){v=this[v];}B=(v)?v.call(y,B,C):B;B=(A)?i.getValue(B,A):B;return B;},_getStateVal:function(v){var w=this._stateProxy;return w&&(v in w)&&!this._state.get(v,h)?w[v]:this._state.get(v,f);},_setStateVal:function(v,x){var w=this._stateProxy;if(w&&(v in w)&&!this._state.get(v,h)){w[v]=x;}else{this._state.add(v,f,x);}},_setAttrVal:function(H,G,C,A){var I=this,D=true,F=this._state.getAll(H,true)||{},y=F.validator,B=F.setter,E=F.initializing,x=this._getStateVal(H),w=G||H,z,v;if(y){if(!y.call){y=this[y];}if(y){v=y.call(I,A,w);if(!v&&E){A=F.defaultValue;v=true;}}}if(!y||v){if(B){if(!B.call){B=this[B];}if(B){z=B.call(I,A,w);if(z===e){D=false;}else{if(z!==undefined){A=z;}}}}if(D){if(!G&&(A===x)&&!d.isObject(A)){D=false;}else{if(!(g in F)){F.initValue=A;}I._setStateVal(H,A);}}}else{D=false;}return D;},setAttrs:function(v){return this._setAttrs(v);},_setAttrs:function(w){for(var v in w){if(w.hasOwnProperty(v)){this.set(v,w[v]);}}return this;},getAttrs:function(v){return this._getAttrs(v);},_getAttrs:function(y){var A=this,C={},z,w,v,B,x=(y===true);y=(y&&!x)?y:i.keys(A._state.data);for(z=0,w=y.length;z<w;z++){v=y[z];B=A.get(v);if(!x||A._getStateVal(v)!=A._state.get(v,g)){C[v]=A.get(v);}}return C;},addAttrs:function(v,w,x){var y=this;if(v){y._tCfgs=v;y._tVals=y._normAttrVals(w);y._addAttrs(v,y._tVals,x);y._tCfgs=y._tVals=null;}return y;},_addAttrs:function(w,x,y){var A=this,v,z,B;for(v in w){if(w.hasOwnProperty(v)){z=w[v];z.defaultValue=z.value;B=A._getAttrInitVal(v,z,A._tVals);if(B!==undefined){z.value=B;}if(A._tCfgs[v]){delete A._tCfgs[v];}A.addAttr(v,z,y);}}},_protectAttrs:function(w){if(w){w=c.merge(w);for(var v in w){if(w.hasOwnProperty(v)){w[v]=c.merge(w[v]);}}}return w;},_normAttrVals:function(v){return(v)?c.merge(v):null;},_getAttrInitVal:function(v,w,y){var z,x;if(!w.readOnly&&y&&y.hasOwnProperty(v)){z=y[v];}else{z=w.value;x=w.valueFn;if(x){if(!x.call){x=this[x];}if(x){z=x.call(this,v);}}}return z;},_initAttrs:function(w,v,z){w=w||this.constructor.ATTRS;var y=c.Base,x=c.BaseCore,A=(y&&c.instanceOf(this,y)),B=(!A&&x&&c.instanceOf(this,x));if(w&&!A&&!B){this.addAttrs(this._protectAttrs(w),v,z);}}};c.AttributeCore=s;},"3.5.1");
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/attribute-core/attribute-core.js'
--- debian/extras/jslibs/yui/attribute-core/attribute-core.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-core/attribute-core.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,1017 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('attribute-core', function(Y) {
+
+    /**
+     * The State class maintains state for a collection of named items, with 
+     * a varying number of properties defined.
+     *
+     * It avoids the need to create a separate class for the item, and separate instances 
+     * of these classes for each item, by storing the state in a 2 level hash table, 
+     * improving performance when the number of items is likely to be large.
+     *
+     * @constructor
+     * @class State
+     */
+    Y.State = function() {
+        /**
+         * Hash of attributes
+         * @property data
+         */
+        this.data = {};
+    };
+
+    Y.State.prototype = {
+
+        /**
+         * Adds a property to an item.
+         *
+         * @method add
+         * @param name {String} The name of the item.
+         * @param key {String} The name of the property.
+         * @param val {Any} The value of the property.
+         */
+        add : function(name, key, val) {
+            var d = this.data;
+            d[name] = d[name] || {};
+            d[name][key] = val;
+        },
+
+        /**
+         * Adds multiple properties to an item.
+         *
+         * @method addAll
+         * @param name {String} The name of the item.
+         * @param o {Object} A hash of property/value pairs.
+         */
+        addAll: function(name, o) {
+            var key;
+
+            for (key in o) {
+                if (o.hasOwnProperty(key)) {
+                    this.add(name, key, o[key]);
+                }
+            }
+        },
+
+        /**
+         * Removes a property from an item.
+         *
+         * @method remove
+         * @param name {String} The name of the item.
+         * @param key {String} The property to remove.
+         */
+        remove: function(name, key) {
+            var d = this.data;
+            if (d[name]) {
+                delete d[name][key];
+            }
+        },
+
+        /**
+         * Removes multiple properties from an item, or remove the item completely.
+         *
+         * @method removeAll
+         * @param name {String} The name of the item.
+         * @param o {Object|Array} Collection of properties to delete. If not provided, the entire item is removed.
+         */
+        removeAll: function(name, o) {
+            var d = this.data;
+
+            if (!o) {
+                if (d[name]) {
+                    delete d[name];
+                }
+            } else {
+                Y.each(o, function(v, k) {
+                    if(Y.Lang.isString(k)) {
+                        this.remove(name, k);
+                    } else {
+                        this.remove(name, v);
+                    }
+                }, this);
+            }
+        },
+
+        /**
+         * For a given item, returns the value of the property requested, or undefined if not found.
+         *
+         * @method get
+         * @param name {String} The name of the item
+         * @param key {String} Optional. The property value to retrieve.
+         * @return {Any} The value of the supplied property.
+         */
+        get: function(name, key) {
+            var d = this.data;
+            return (d[name]) ? d[name][key] : undefined;
+        },
+
+        /**
+         * For the given item, returns an object with all of the
+         * item's property/value pairs. By default the object returned
+         * is a shallow copy of the stored data, but passing in true
+         * as the second parameter will return a reference to the stored
+         * data.
+         *
+         * @method getAll
+         * @param name {String} The name of the item
+         * @param reference {boolean} true, if you want a reference to the stored
+         * object 
+         * @return {Object} An object with property/value pairs for the item.
+         */
+        getAll : function(name, reference) {
+            var d = this.data, o;
+
+            if (!reference) {
+                Y.each(d[name], function(v, k) {
+                        o = o || {};
+                        o[k] = v;
+                });
+            } else {
+                o = d[name];
+            }
+
+            return o;
+        }
+    };
+    /**
+     * The attribute module provides an augmentable Attribute implementation, which 
+     * adds configurable attributes and attribute change events to the class being 
+     * augmented. It also provides a State class, which is used internally by Attribute,
+     * but can also be used independently to provide a name/property/value data structure to
+     * store state.
+     *
+     * @module attribute
+     */
+
+    /**
+     * The attribute-core submodule provides the lightest level of attribute handling support 
+     * without Attribute change events, or lesser used methods such as reset(), modifyAttrs(),
+     * and removeAttr().
+     *
+     * @module attribute
+     * @submodule attribute-core
+     */
+    var O = Y.Object,
+        Lang = Y.Lang,
+
+        DOT = ".",
+
+        // Externally configurable props
+        GETTER = "getter",
+        SETTER = "setter",
+        READ_ONLY = "readOnly",
+        WRITE_ONCE = "writeOnce",
+        INIT_ONLY = "initOnly",
+        VALIDATOR = "validator",
+        VALUE = "value",
+        VALUE_FN = "valueFn",
+        LAZY_ADD = "lazyAdd",
+
+        // Used for internal state management
+        ADDED = "added",
+        BYPASS_PROXY = "_bypassProxy",
+        INITIALIZING = "initializing",
+        INIT_VALUE = "initValue",
+        LAZY = "lazy",
+        IS_LAZY_ADD = "isLazyAdd",
+
+        INVALID_VALUE;
+
+    /**
+     * <p>
+     * AttributeCore provides the lightest level of configurable attribute support. It is designed to be 
+     * augmented on to a host class, and provides the host with the ability to configure 
+     * attributes to store and retrieve state, <strong>but without support for attribute change events</strong>.
+     * </p>
+     * <p>For example, attributes added to the host can be configured:</p>
+     * <ul>
+     *     <li>As read only.</li>
+     *     <li>As write once.</li>
+     *     <li>With a setter function, which can be used to manipulate
+     *     values passed to Attribute's <a href="#method_set">set</a> method, before they are stored.</li>
+     *     <li>With a getter function, which can be used to manipulate stored values,
+     *     before they are returned by Attribute's <a href="#method_get">get</a> method.</li>
+     *     <li>With a validator function, to validate values before they are stored.</li>
+     * </ul>
+     *
+     * <p>See the <a href="#method_addAttr">addAttr</a> method, for the complete set of configuration
+     * options available for attributes.</p>
+     * 
+     * <p>Object/Classes based on AttributeCore can augment <a href="AttributeEvents.html">AttributeEvents</a> 
+     * (with true for overwrite) and <a href="AttributeExtras.html">AttributeExtras</a> to add attribute event and 
+     * additional, less commonly used attribute methods, such as `modifyAttr`, `removeAttr` and `reset`.</p>   
+     *
+     * @class AttributeCore
+     * @param attrs {Object} The attributes to add during construction (passed through to <a href="#method_addAttrs">addAttrs</a>). These can also be defined on the constructor being augmented with Attribute by defining the ATTRS property on the constructor.
+     * @param values {Object} The initial attribute values to apply (passed through to <a href="#method_addAttrs">addAttrs</a>). These are not merged/cloned. The caller is responsible for isolating user provided values if required.
+     * @param lazy {boolean} Whether or not to add attributes lazily (passed through to <a href="#method_addAttrs">addAttrs</a>).
+     */
+    function AttributeCore(attrs, values, lazy) {
+        this._initAttrHost(attrs, values, lazy);            
+    }
+
+    /**
+     * <p>The value to return from an attribute setter in order to prevent the set from going through.</p>
+     *
+     * <p>You can return this value from your setter if you wish to combine validator and setter 
+     * functionality into a single setter function, which either returns the massaged value to be stored or 
+     * AttributeCore.INVALID_VALUE to prevent invalid values from being stored.</p>
+     *
+     * @property INVALID_VALUE
+     * @type Object
+     * @static
+     * @final
+     */
+    AttributeCore.INVALID_VALUE = {};
+    INVALID_VALUE = AttributeCore.INVALID_VALUE;
+
+    /**
+     * The list of properties which can be configured for 
+     * each attribute (e.g. setter, getter, writeOnce etc.).
+     *
+     * This property is used internally as a whitelist for faster
+     * Y.mix operations.
+     *
+     * @property _ATTR_CFG
+     * @type Array
+     * @static
+     * @protected
+     */
+    AttributeCore._ATTR_CFG = [SETTER, GETTER, VALIDATOR, VALUE, VALUE_FN, WRITE_ONCE, READ_ONLY, LAZY_ADD, BYPASS_PROXY];
+
+    AttributeCore.prototype = {
+
+        /**
+         * Constructor logic for attributes. Initializes the host state, and sets up the inital attributes passed to the 
+         * constructor.
+         *
+         * @method _initAttrHost
+         * @param attrs {Object} The attributes to add during construction (passed through to <a href="#method_addAttrs">addAttrs</a>). These can also be defined on the constructor being augmented with Attribute by defining the ATTRS property on the constructor.
+         * @param values {Object} The initial attribute values to apply (passed through to <a href="#method_addAttrs">addAttrs</a>). These are not merged/cloned. The caller is responsible for isolating user provided values if required.
+         * @param lazy {boolean} Whether or not to add attributes lazily (passed through to <a href="#method_addAttrs">addAttrs</a>).
+         * @private
+         */
+        _initAttrHost : function(attrs, values, lazy) {
+            this._state = new Y.State();
+            this._initAttrs(attrs, values, lazy);
+        },
+
+        /**
+         * <p>
+         * Adds an attribute with the provided configuration to the host object.
+         * </p>
+         * <p>
+         * The config argument object supports the following properties:
+         * </p>
+         * 
+         * <dl>
+         *    <dt>value &#60;Any&#62;</dt>
+         *    <dd>The initial value to set on the attribute</dd>
+         *
+         *    <dt>valueFn &#60;Function | String&#62;</dt>
+         *    <dd>
+         *    <p>A function, which will return the initial value to set on the attribute. This is useful
+         *    for cases where the attribute configuration is defined statically, but needs to 
+         *    reference the host instance ("this") to obtain an initial value. If both the value and valueFn properties are defined, 
+         *    the value returned by the valueFn has precedence over the value property, unless it returns undefined, in which 
+         *    case the value property is used.</p>
+         *
+         *    <p>valueFn can also be set to a string, representing the name of the instance method to be used to retrieve the value.</p>
+         *    </dd>
+         *
+         *    <dt>readOnly &#60;boolean&#62;</dt>
+         *    <dd>Whether or not the attribute is read only. Attributes having readOnly set to true
+         *        cannot be modified by invoking the set method.</dd>
+         *
+         *    <dt>writeOnce &#60;boolean&#62; or &#60;string&#62;</dt>
+         *    <dd>
+         *        Whether or not the attribute is "write once". Attributes having writeOnce set to true, 
+         *        can only have their values set once, be it through the default configuration, 
+         *        constructor configuration arguments, or by invoking set.
+         *        <p>The writeOnce attribute can also be set to the string "initOnly", in which case the attribute can only be set during initialization
+         *        (when used with Base, this means it can only be set during construction)</p>
+         *    </dd>
+         *
+         *    <dt>setter &#60;Function | String&#62;</dt>
+         *    <dd>
+         *    <p>The setter function used to massage or normalize the value passed to the set method for the attribute. 
+         *    The value returned by the setter will be the final stored value. Returning
+         *    <a href="#property_Attribute.INVALID_VALUE">Attribute.INVALID_VALUE</a>, from the setter will prevent
+         *    the value from being stored.
+         *    </p>
+         *    
+         *    <p>setter can also be set to a string, representing the name of the instance method to be used as the setter function.</p>
+         *    </dd>
+         *      
+         *    <dt>getter &#60;Function | String&#62;</dt>
+         *    <dd>
+         *    <p>
+         *    The getter function used to massage or normalize the value returned by the get method for the attribute.
+         *    The value returned by the getter function is the value which will be returned to the user when they 
+         *    invoke get.
+         *    </p>
+         *
+         *    <p>getter can also be set to a string, representing the name of the instance method to be used as the getter function.</p>
+         *    </dd>
+         *
+         *    <dt>validator &#60;Function | String&#62;</dt>
+         *    <dd>
+         *    <p>
+         *    The validator function invoked prior to setting the stored value. Returning
+         *    false from the validator function will prevent the value from being stored.
+         *    </p>
+         *    
+         *    <p>validator can also be set to a string, representing the name of the instance method to be used as the validator function.</p>
+         *    </dd>
+         *
+         *    <dt>lazyAdd &#60;boolean&#62;</dt>
+         *    <dd>Whether or not to delay initialization of the attribute until the first call to get/set it. 
+         *    This flag can be used to over-ride lazy initialization on a per attribute basis, when adding multiple attributes through 
+         *    the <a href="#method_addAttrs">addAttrs</a> method.</dd>
+         *
+         * </dl>
+         *
+         * <p>The setter, getter and validator are invoked with the value and name passed in as the first and second arguments, and with
+         * the context ("this") set to the host object.</p>
+         *
+         * <p>Configuration properties outside of the list mentioned above are considered private properties used internally by attribute, 
+         * and are not intended for public use.</p>
+         * 
+         * @method addAttr
+         *
+         * @param {String} name The name of the attribute.
+         * @param {Object} config An object with attribute configuration property/value pairs, specifying the configuration for the attribute.
+         *
+         * <p>
+         * <strong>NOTE:</strong> The configuration object is modified when adding an attribute, so if you need 
+         * to protect the original values, you will need to merge the object.
+         * </p>
+         *
+         * @param {boolean} lazy (optional) Whether or not to add this attribute lazily (on the first call to get/set). 
+         *
+         * @return {Object} A reference to the host object.
+         *
+         * @chainable
+         */
+        addAttr: function(name, config, lazy) {
+
+
+            var host = this, // help compression
+                state = host._state,
+                value,
+                hasValue;
+
+            config = config || {};
+
+            lazy = (LAZY_ADD in config) ? config[LAZY_ADD] : lazy;
+
+            if (lazy && !host.attrAdded(name)) {
+                state.addAll(name, {
+                    lazy : config,
+                    added : true
+                });
+            } else {
+
+
+                if (!host.attrAdded(name) || state.get(name, IS_LAZY_ADD)) {
+
+                    hasValue = (VALUE in config);
+
+
+                    if (hasValue) {
+                        // We'll go through set, don't want to set value in config directly
+                        value = config.value;
+                        delete config.value;
+                    }
+
+                    config.added = true;
+                    config.initializing = true;
+
+                    state.addAll(name, config);
+
+                    if (hasValue) {
+                        // Go through set, so that raw values get normalized/validated
+                        host.set(name, value);
+                    }
+
+                    state.remove(name, INITIALIZING);
+                }
+            }
+
+            return host;
+        },
+
+        /**
+         * Checks if the given attribute has been added to the host
+         *
+         * @method attrAdded
+         * @param {String} name The name of the attribute to check.
+         * @return {boolean} true if an attribute with the given name has been added, false if it hasn't. This method will return true for lazily added attributes.
+         */
+        attrAdded: function(name) {
+            return !!this._state.get(name, ADDED);
+        },
+
+        /**
+         * Returns the current value of the attribute. If the attribute
+         * has been configured with a 'getter' function, this method will delegate
+         * to the 'getter' to obtain the value of the attribute.
+         *
+         * @method get
+         *
+         * @param {String} name The name of the attribute. If the value of the attribute is an Object, 
+         * dot notation can be used to obtain the value of a property of the object (e.g. <code>get("x.y.z")</code>)
+         *
+         * @return {Any} The value of the attribute
+         */
+        get : function(name) {
+            return this._getAttr(name);
+        },
+
+        /**
+         * Checks whether or not the attribute is one which has been
+         * added lazily and still requires initialization.
+         *
+         * @method _isLazyAttr
+         * @private
+         * @param {String} name The name of the attribute
+         * @return {boolean} true if it's a lazily added attribute, false otherwise.
+         */
+        _isLazyAttr: function(name) {
+            return this._state.get(name, LAZY);
+        },
+
+        /**
+         * Finishes initializing an attribute which has been lazily added.
+         *
+         * @method _addLazyAttr
+         * @private
+         * @param {Object} name The name of the attribute
+         */
+        _addLazyAttr: function(name, cfg) {
+            var state = this._state,
+                lazyCfg = state.get(name, LAZY);
+
+            state.add(name, IS_LAZY_ADD, true);
+            state.remove(name, LAZY);
+            this.addAttr(name, lazyCfg);
+        },
+
+        /**
+         * Sets the value of an attribute.
+         *
+         * @method set
+         * @chainable
+         *
+         * @param {String} name The name of the attribute. If the 
+         * current value of the attribute is an Object, dot notation can be used
+         * to set the value of a property within the object (e.g. <code>set("x.y.z", 5)</code>).
+         *
+         * @param {Any} value The value to set the attribute to.
+         *
+         * @return {Object} A reference to the host object.
+         */
+        set : function(name, val) {
+            return this._setAttr(name, val);
+        },
+
+        /**
+         * Allows setting of readOnly/writeOnce attributes. See <a href="#method_set">set</a> for argument details.
+         *
+         * @method _set
+         * @protected
+         * @chainable
+         * 
+         * @param {String} name The name of the attribute.
+         * @param {Any} val The value to set the attribute to.
+         * @return {Object} A reference to the host object.
+         */
+        _set : function(name, val) {
+            return this._setAttr(name, val, null, true);
+        },
+
+        /**
+         * Provides the common implementation for the public set and protected _set methods.
+         *
+         * See <a href="#method_set">set</a> for argument details.
+         *
+         * @method _setAttr
+         * @protected
+         * @chainable
+         *
+         * @param {String} name The name of the attribute.
+         * @param {Any} value The value to set the attribute to.
+         * @param {Object} opts (Optional) Optional event data to be mixed into
+         * the event facade passed to subscribers of the attribute's change event.
+         * This is currently a hack. There's no real need for the AttributeCore implementation
+         * to support this parameter, but breaking it out into AttributeEvents, results in
+         * additional function hops for the critical path. May change in 3.5.0 PR3.
+         * @param {boolean} force If true, allows the caller to set values for 
+         * readOnly or writeOnce attributes which have already been set.
+         *
+         * @return {Object} A reference to the host object.
+         */
+        _setAttr : function(name, val, opts, force)  {
+            
+            // HACK - no real reason core needs to know about opts, but 
+            // it adds fn hops if we want to break it out. 
+            // Not sure it's worth it for this critical path
+            
+            var allowSet = true,
+                state = this._state,
+                stateProxy = this._stateProxy,
+                cfg,
+                initialSet,
+                strPath,
+                path,
+                currVal,
+                writeOnce,
+                initializing;
+
+            if (name.indexOf(DOT) !== -1) {
+                strPath = name;
+                path = name.split(DOT);
+                name = path.shift();
+            }
+
+            if (this._isLazyAttr(name)) {
+                this._addLazyAttr(name);
+            }
+
+            cfg = state.getAll(name, true) || {}; 
+
+            initialSet = (!(VALUE in cfg));
+
+            if (stateProxy && name in stateProxy && !cfg._bypassProxy) {
+                // TODO: Value is always set for proxy. Can we do any better? Maybe take a snapshot as the initial value for the first call to set? 
+                initialSet = false;
+            }
+
+            writeOnce = cfg.writeOnce;
+            initializing = cfg.initializing;
+
+            if (!initialSet && !force) {
+
+                if (writeOnce) {
+                    allowSet = false;
+                }
+
+                if (cfg.readOnly) {
+                    allowSet = false;
+                }
+            }
+
+            if (!initializing && !force && writeOnce === INIT_ONLY) {
+                allowSet = false;
+            }
+
+            if (allowSet) {
+                // Don't need currVal if initialSet (might fail in custom getter if it always expects a non-undefined/non-null value)
+                if (!initialSet) {
+                    currVal =  this.get(name);
+                }
+
+                if (path) {
+                   val = O.setValue(Y.clone(currVal), path, val);
+
+                   if (val === undefined) {
+                       allowSet = false;
+                   }
+                }
+
+                if (allowSet) {
+                    if (!this._fireAttrChange || initializing) {
+                        this._setAttrVal(name, strPath, currVal, val);
+                    } else {
+                        // HACK - no real reason core needs to know about _fireAttrChange, but 
+                        // it adds fn hops if we want to break it out. Not sure it's worth it for this critical path
+                        this._fireAttrChange(name, strPath, currVal, val, opts);
+                    }
+                }
+            }
+
+            return this;
+        },
+
+        /**
+         * Provides the common implementation for the public get method,
+         * allowing Attribute hosts to over-ride either method.
+         *
+         * See <a href="#method_get">get</a> for argument details.
+         *
+         * @method _getAttr
+         * @protected
+         * @chainable
+         *
+         * @param {String} name The name of the attribute.
+         * @return {Any} The value of the attribute.
+         */
+        _getAttr : function(name) {
+            var host = this, // help compression
+                fullName = name,
+                state = host._state,
+                path,
+                getter,
+                val,
+                cfg;
+
+            if (name.indexOf(DOT) !== -1) {
+                path = name.split(DOT);
+                name = path.shift();
+            }
+
+            // On Demand - Should be rare - handles out of order valueFn references
+            if (host._tCfgs && host._tCfgs[name]) {
+                cfg = {};
+                cfg[name] = host._tCfgs[name];
+                delete host._tCfgs[name];
+                host._addAttrs(cfg, host._tVals);
+            }
+            
+            // Lazy Init
+            if (host._isLazyAttr(name)) {
+                host._addLazyAttr(name);
+            }
+
+            val = host._getStateVal(name);
+                        
+            getter = state.get(name, GETTER);
+
+            if (getter && !getter.call) {
+                getter = this[getter];
+            }
+
+            val = (getter) ? getter.call(host, val, fullName) : val;
+            val = (path) ? O.getValue(val, path) : val;
+
+            return val;
+        },
+
+        /**
+         * Gets the stored value for the attribute, from either the 
+         * internal state object, or the state proxy if it exits
+         * 
+         * @method _getStateVal
+         * @private
+         * @param {String} name The name of the attribute
+         * @return {Any} The stored value of the attribute
+         */
+        _getStateVal : function(name) {
+            var stateProxy = this._stateProxy;
+            return stateProxy && (name in stateProxy) && !this._state.get(name, BYPASS_PROXY) ? stateProxy[name] : this._state.get(name, VALUE);
+        },
+
+        /**
+         * Sets the stored value for the attribute, in either the 
+         * internal state object, or the state proxy if it exits
+         *
+         * @method _setStateVal
+         * @private
+         * @param {String} name The name of the attribute
+         * @param {Any} value The value of the attribute
+         */
+        _setStateVal : function(name, value) {
+            var stateProxy = this._stateProxy;
+            if (stateProxy && (name in stateProxy) && !this._state.get(name, BYPASS_PROXY)) {
+                stateProxy[name] = value;
+            } else {
+                this._state.add(name, VALUE, value);
+            }
+        },
+
+        /**
+         * Updates the stored value of the attribute in the privately held State object,
+         * if validation and setter passes.
+         *
+         * @method _setAttrVal
+         * @private
+         * @param {String} attrName The attribute name.
+         * @param {String} subAttrName The sub-attribute name, if setting a sub-attribute property ("x.y.z").
+         * @param {Any} prevVal The currently stored value of the attribute.
+         * @param {Any} newVal The value which is going to be stored.
+         * 
+         * @return {booolean} true if the new attribute value was stored, false if not.
+         */
+        _setAttrVal : function(attrName, subAttrName, prevVal, newVal) {
+
+            var host = this,
+                allowSet = true,
+                cfg = this._state.getAll(attrName, true) || {},
+                validator = cfg.validator,
+                setter = cfg.setter,
+                initializing = cfg.initializing,
+                prevRawVal = this._getStateVal(attrName),
+                name = subAttrName || attrName,
+                retVal,
+                valid;
+
+            if (validator) {
+                if (!validator.call) { 
+                    // Assume string - trying to keep critical path tight, so avoiding Lang check
+                    validator = this[validator];
+                }
+                if (validator) {
+                    valid = validator.call(host, newVal, name);
+
+                    if (!valid && initializing) {
+                        newVal = cfg.defaultValue;
+                        valid = true; // Assume it's valid, for perf.
+                    }
+                }
+            }
+
+            if (!validator || valid) {
+                if (setter) {
+                    if (!setter.call) {
+                        // Assume string - trying to keep critical path tight, so avoiding Lang check
+                        setter = this[setter];
+                    }
+                    if (setter) {
+                        retVal = setter.call(host, newVal, name);
+
+                        if (retVal === INVALID_VALUE) {
+                            allowSet = false;
+                        } else if (retVal !== undefined){
+                            newVal = retVal;
+                        }
+                    }
+                }
+
+                if (allowSet) {
+                    if(!subAttrName && (newVal === prevRawVal) && !Lang.isObject(newVal)) {
+                        allowSet = false;
+                    } else {
+                        // Store value
+                        if (!(INIT_VALUE in cfg)) {
+                            cfg.initValue = newVal;
+                        }
+                        host._setStateVal(attrName, newVal);
+                    }
+                }
+
+            } else {
+                allowSet = false;
+            }
+
+            return allowSet;
+        },
+
+        /**
+         * Sets multiple attribute values.
+         *
+         * @method setAttrs
+         * @param {Object} attrs  An object with attributes name/value pairs.
+         * @return {Object} A reference to the host object.
+         * @chainable
+         */
+        setAttrs : function(attrs) {
+            return this._setAttrs(attrs);
+        },
+
+        /**
+         * Implementation behind the public setAttrs method, to set multiple attribute values.
+         *
+         * @method _setAttrs
+         * @protected
+         * @param {Object} attrs  An object with attributes name/value pairs.
+         * @return {Object} A reference to the host object.
+         * @chainable
+         */
+        _setAttrs : function(attrs) {
+            for (var attr in attrs) {
+                if ( attrs.hasOwnProperty(attr) ) {
+                    this.set(attr, attrs[attr]);
+                }
+            }
+            return this;
+        },
+
+        /**
+         * Gets multiple attribute values.
+         *
+         * @method getAttrs
+         * @param {Array | boolean} attrs Optional. An array of attribute names. If omitted, all attribute values are
+         * returned. If set to true, all attributes modified from their initial values are returned.
+         * @return {Object} An object with attribute name/value pairs.
+         */
+        getAttrs : function(attrs) {
+            return this._getAttrs(attrs);
+        },
+
+        /**
+         * Implementation behind the public getAttrs method, to get multiple attribute values.
+         *
+         * @method _getAttrs
+         * @protected
+         * @param {Array | boolean} attrs Optional. An array of attribute names. If omitted, all attribute values are
+         * returned. If set to true, all attributes modified from their initial values are returned.
+         * @return {Object} An object with attribute name/value pairs.
+         */
+        _getAttrs : function(attrs) {
+            var host = this,
+                o = {}, 
+                i, l, attr, val,
+                modifiedOnly = (attrs === true);
+
+            // TODO - figure out how to get all "added"
+            attrs = (attrs && !modifiedOnly) ? attrs : O.keys(host._state.data);
+
+            for (i = 0, l = attrs.length; i < l; i++) {
+                // Go through get, to honor cloning/normalization
+                attr = attrs[i];
+                val = host.get(attr);
+
+                if (!modifiedOnly || host._getStateVal(attr) != host._state.get(attr, INIT_VALUE)) {
+                    o[attr] = host.get(attr); 
+                }
+            }
+
+            return o;
+        },
+
+        /**
+         * Configures a group of attributes, and sets initial values.
+         *
+         * <p>
+         * <strong>NOTE:</strong> This method does not isolate the configuration object by merging/cloning. 
+         * The caller is responsible for merging/cloning the configuration object if required.
+         * </p>
+         *
+         * @method addAttrs
+         * @chainable
+         *
+         * @param {Object} cfgs An object with attribute name/configuration pairs.
+         * @param {Object} values An object with attribute name/value pairs, defining the initial values to apply.
+         * Values defined in the cfgs argument will be over-written by values in this argument unless defined as read only.
+         * @param {boolean} lazy Whether or not to delay the intialization of these attributes until the first call to get/set.
+         * Individual attributes can over-ride this behavior by defining a lazyAdd configuration property in their configuration.
+         * See <a href="#method_addAttr">addAttr</a>.
+         * 
+         * @return {Object} A reference to the host object.
+         */
+        addAttrs : function(cfgs, values, lazy) {
+            var host = this; // help compression
+            if (cfgs) {
+                host._tCfgs = cfgs;
+                host._tVals = host._normAttrVals(values);
+                host._addAttrs(cfgs, host._tVals, lazy);
+                host._tCfgs = host._tVals = null;
+            }
+
+            return host;
+        },
+
+        /**
+         * Implementation behind the public addAttrs method. 
+         * 
+         * This method is invoked directly by get if it encounters a scenario 
+         * in which an attribute's valueFn attempts to obtain the 
+         * value an attribute in the same group of attributes, which has not yet 
+         * been added (on demand initialization).
+         *
+         * @method _addAttrs
+         * @private
+         * @param {Object} cfgs An object with attribute name/configuration pairs.
+         * @param {Object} values An object with attribute name/value pairs, defining the initial values to apply.
+         * Values defined in the cfgs argument will be over-written by values in this argument unless defined as read only.
+         * @param {boolean} lazy Whether or not to delay the intialization of these attributes until the first call to get/set.
+         * Individual attributes can over-ride this behavior by defining a lazyAdd configuration property in their configuration.
+         * See <a href="#method_addAttr">addAttr</a>.
+         */
+        _addAttrs : function(cfgs, values, lazy) {
+            var host = this, // help compression
+                attr,
+                attrCfg,
+                value;
+
+            for (attr in cfgs) {
+                if (cfgs.hasOwnProperty(attr)) {
+
+                    // Not Merging. Caller is responsible for isolating configs
+                    attrCfg = cfgs[attr];
+                    attrCfg.defaultValue = attrCfg.value;
+
+                    // Handle simple, complex and user values, accounting for read-only
+                    value = host._getAttrInitVal(attr, attrCfg, host._tVals);
+
+                    if (value !== undefined) {
+                        attrCfg.value = value;
+                    }
+
+                    if (host._tCfgs[attr]) {
+                        delete host._tCfgs[attr];
+                    }
+
+                    host.addAttr(attr, attrCfg, lazy);
+                }
+            }
+        },
+
+        /**
+         * Utility method to protect an attribute configuration
+         * hash, by merging the entire object and the individual 
+         * attr config objects. 
+         *
+         * @method _protectAttrs
+         * @protected
+         * @param {Object} attrs A hash of attribute to configuration object pairs.
+         * @return {Object} A protected version of the attrs argument.
+         */
+        _protectAttrs : function(attrs) {
+            if (attrs) {
+                attrs = Y.merge(attrs);
+                for (var attr in attrs) {
+                    if (attrs.hasOwnProperty(attr)) {
+                        attrs[attr] = Y.merge(attrs[attr]);
+                    }
+                }
+            }
+            return attrs;
+        },
+
+        /**
+         * Utility method to normalize attribute values. The base implementation 
+         * simply merges the hash to protect the original.
+         *
+         * @method _normAttrVals
+         * @param {Object} valueHash An object with attribute name/value pairs
+         *
+         * @return {Object}
+         *
+         * @private
+         */
+        _normAttrVals : function(valueHash) {
+            return (valueHash) ? Y.merge(valueHash) : null;
+        },
+
+        /**
+         * Returns the initial value of the given attribute from
+         * either the default configuration provided, or the 
+         * over-ridden value if it exists in the set of initValues 
+         * provided and the attribute is not read-only.
+         *
+         * @param {String} attr The name of the attribute
+         * @param {Object} cfg The attribute configuration object
+         * @param {Object} initValues The object with simple and complex attribute name/value pairs returned from _normAttrVals
+         *
+         * @return {Any} The initial value of the attribute.
+         *
+         * @method _getAttrInitVal
+         * @private
+         */
+        _getAttrInitVal : function(attr, cfg, initValues) {
+            var val, valFn;
+            // init value is provided by the user if it exists, else, provided by the config
+            if (!cfg.readOnly && initValues && initValues.hasOwnProperty(attr)) {
+                val = initValues[attr];
+            } else {
+                val = cfg.value;
+                valFn = cfg.valueFn;
+ 
+                if (valFn) {
+                    if (!valFn.call) {
+                        valFn = this[valFn];
+                    }
+                    if (valFn) {
+                        val = valFn.call(this, attr);
+                    }
+                }
+            }
+
+
+            return val;
+        },
+
+        /**
+         * Utility method to set up initial attributes defined during construction, either through the constructor.ATTRS property, or explicitly passed in.
+         * 
+         * @method _initAttrs
+         * @protected
+         * @param attrs {Object} The attributes to add during construction (passed through to <a href="#method_addAttrs">addAttrs</a>). These can also be defined on the constructor being augmented with Attribute by defining the ATTRS property on the constructor.
+         * @param values {Object} The initial attribute values to apply (passed through to <a href="#method_addAttrs">addAttrs</a>). These are not merged/cloned. The caller is responsible for isolating user provided values if required.
+         * @param lazy {boolean} Whether or not to add attributes lazily (passed through to <a href="#method_addAttrs">addAttrs</a>).
+         */
+        _initAttrs : function(attrs, values, lazy) {
+            // ATTRS support for Node, which is not Base based
+            attrs = attrs || this.constructor.ATTRS;
+    
+            var Base = Y.Base,
+                BaseCore = Y.BaseCore,
+                baseInst = (Base && Y.instanceOf(this, Base)),
+                baseCoreInst = (!baseInst && BaseCore && Y.instanceOf(this, BaseCore));
+
+            if ( attrs && !baseInst && !baseCoreInst) {
+                this.addAttrs(this._protectAttrs(attrs), values, lazy);
+            }
+        }
+    };
+
+    Y.AttributeCore = AttributeCore;
+
+
+}, '3.5.1' );

=== added directory 'debian/extras/jslibs/yui/attribute-events'
=== added file 'debian/extras/jslibs/yui/attribute-events/attribute-events-debug.js'
--- debian/extras/jslibs/yui/attribute-events/attribute-events-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-events/attribute-events-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,180 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('attribute-events', function(Y) {
+
+    /**
+     * The attribute module provides an augmentable Attribute implementation, which 
+     * adds configurable attributes and attribute change events to the class being 
+     * augmented. It also provides a State class, which is used internally by Attribute,
+     * but can also be used independently to provide a name/property/value data structure to
+     * store state.
+     *
+     * @module attribute
+     */
+
+    /**
+     * The attribute-events submodule provides augmentable attribute change event support 
+     * for AttributeCore based implementations.
+     *
+     * @module attribute
+     * @submodule attribute-events
+     */
+    var EventTarget = Y.EventTarget,
+
+        CHANGE = "Change",
+        BROADCAST = "broadcast",
+        PUBLISHED = "published";
+
+    /**
+     * Provides an augmentable implementation of attribute change events for 
+     * AttributeCore. 
+     *
+     * @class AttributeEvents
+     * @uses EventTarget
+     */
+    function AttributeEvents() {
+        // Perf tweak - avoid creating event literals if not required.
+        this._ATTR_E_FACADE = {};
+        EventTarget.call(this, {emitFacade:true});
+    }
+
+    AttributeEvents._ATTR_CFG = [BROADCAST];
+
+    AttributeEvents.prototype = {
+
+        /**
+         * Sets the value of an attribute.
+         *
+         * @method set
+         * @chainable
+         *
+         * @param {String} name The name of the attribute. If the 
+         * current value of the attribute is an Object, dot notation can be used
+         * to set the value of a property within the object (e.g. <code>set("x.y.z", 5)</code>).
+         *
+         * @param {Any} value The value to set the attribute to.
+         *
+         * @param {Object} opts (Optional) Optional event data to be mixed into
+         * the event facade passed to subscribers of the attribute's change event. This 
+         * can be used as a flexible way to identify the source of a call to set, allowing 
+         * the developer to distinguish between set called internally by the host, vs. 
+         * set called externally by the application developer.
+         *
+         * @return {Object} A reference to the host object.
+         */
+        set : function(name, val, opts) {
+            return this._setAttr(name, val, opts);
+        },
+
+        /**
+         * Allows setting of readOnly/writeOnce attributes. See <a href="#method_set">set</a> for argument details.
+         *
+         * @method _set
+         * @protected
+         * @chainable
+         * 
+         * @param {String} name The name of the attribute.
+         * @param {Any} val The value to set the attribute to.
+         * @param {Object} opts (Optional) Optional event data to be mixed into
+         * the event facade passed to subscribers of the attribute's change event.
+         * @return {Object} A reference to the host object.
+         */
+        _set : function(name, val, opts) {
+            return this._setAttr(name, val, opts, true);
+        },
+
+        /**
+         * Sets multiple attribute values.
+         *
+         * @method setAttrs
+         * @param {Object} attrs  An object with attributes name/value pairs.
+         * @return {Object} A reference to the host object.
+         * @chainable
+         */
+        setAttrs : function(attrs, opts) {
+            return this._setAttrs(attrs, opts);
+        },
+
+        /**
+         * Utility method to help setup the event payload and fire the attribute change event.
+         * 
+         * @method _fireAttrChange
+         * @private
+         * @param {String} attrName The name of the attribute
+         * @param {String} subAttrName The full path of the property being changed, 
+         * if this is a sub-attribute value being change. Otherwise null.
+         * @param {Any} currVal The current value of the attribute
+         * @param {Any} newVal The new value of the attribute
+         * @param {Object} opts Any additional event data to mix into the attribute change event's event facade.
+         */
+        _fireAttrChange : function(attrName, subAttrName, currVal, newVal, opts) {
+            var host = this,
+                eventName = attrName + CHANGE,
+                state = host._state,
+                facade,
+                broadcast,
+                evtCfg;
+
+            if (!state.get(attrName, PUBLISHED)) {
+                
+                evtCfg = {
+                    queuable:false,
+                    defaultTargetOnly: true, 
+                    defaultFn:host._defAttrChangeFn, 
+                    silent:true
+                };
+
+                broadcast = state.get(attrName, BROADCAST);
+                if (broadcast !== undefined) {
+                    evtCfg.broadcast = broadcast;
+                }
+
+                host.publish(eventName, evtCfg);
+                
+                state.add(attrName, PUBLISHED, true);
+            }
+
+            facade = (opts) ? Y.merge(opts) : host._ATTR_E_FACADE;
+
+            // Not using the single object signature for fire({type:..., newVal:...}), since 
+            // we don't want to override type. Changed to the fire(type, {newVal:...}) signature.
+
+            // facade.type = eventName;
+            facade.attrName = attrName;
+            facade.subAttrName = subAttrName;
+            facade.prevVal = currVal;
+            facade.newVal = newVal;
+
+            // host.fire(facade);
+            host.fire(eventName, facade);
+        },
+
+        /**
+         * Default function for attribute change events.
+         *
+         * @private
+         * @method _defAttrChangeFn
+         * @param {EventFacade} e The event object for attribute change events.
+         */
+        _defAttrChangeFn : function(e) {
+            if (!this._setAttrVal(e.attrName, e.subAttrName, e.prevVal, e.newVal)) {
+                Y.log('State not updated and stopImmediatePropagation called for attribute: ' + e.attrName + ' , value:' + e.newVal, 'warn', 'attribute');
+                // Prevent "after" listeners from being invoked since nothing changed.
+                e.stopImmediatePropagation();
+            } else {
+                e.newVal = this.get(e.attrName);
+            }
+        }
+    };
+
+    // Basic prototype augment - no lazy constructor invocation.
+    Y.mix(AttributeEvents, EventTarget, false, null, 1);
+
+    Y.AttributeEvents = AttributeEvents;
+
+
+}, '3.5.1' ,{requires:['event-custom']});

=== added file 'debian/extras/jslibs/yui/attribute-events/attribute-events-min.js'
--- debian/extras/jslibs/yui/attribute-events/attribute-events-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-events/attribute-events-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("attribute-events",function(e){var f=e.EventTarget,d="Change",a="broadcast",c="published";function b(){this._ATTR_E_FACADE={};f.call(this,{emitFacade:true});}b._ATTR_CFG=[a];b.prototype={set:function(g,i,h){return this._setAttr(g,i,h);},_set:function(g,i,h){return this._setAttr(g,i,h,true);},setAttrs:function(g,h){return this._setAttrs(g,h);},_fireAttrChange:function(o,n,k,j,g){var q=this,m=o+d,i=q._state,p,l,h;if(!i.get(o,c)){h={queuable:false,defaultTargetOnly:true,defaultFn:q._defAttrChangeFn,silent:true};l=i.get(o,a);if(l!==undefined){h.broadcast=l;}q.publish(m,h);i.add(o,c,true);}p=(g)?e.merge(g):q._ATTR_E_FACADE;p.attrName=o;p.subAttrName=n;p.prevVal=k;p.newVal=j;q.fire(m,p);},_defAttrChangeFn:function(g){if(!this._setAttrVal(g.attrName,g.subAttrName,g.prevVal,g.newVal)){g.stopImmediatePropagation();}else{g.newVal=this.get(g.attrName);}}};e.mix(b,f,false,null,1);e.AttributeEvents=b;},"3.5.1",{requires:["event-custom"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/attribute-events/attribute-events.js'
--- debian/extras/jslibs/yui/attribute-events/attribute-events.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-events/attribute-events.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,179 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('attribute-events', function(Y) {
+
+    /**
+     * The attribute module provides an augmentable Attribute implementation, which 
+     * adds configurable attributes and attribute change events to the class being 
+     * augmented. It also provides a State class, which is used internally by Attribute,
+     * but can also be used independently to provide a name/property/value data structure to
+     * store state.
+     *
+     * @module attribute
+     */
+
+    /**
+     * The attribute-events submodule provides augmentable attribute change event support 
+     * for AttributeCore based implementations.
+     *
+     * @module attribute
+     * @submodule attribute-events
+     */
+    var EventTarget = Y.EventTarget,
+
+        CHANGE = "Change",
+        BROADCAST = "broadcast",
+        PUBLISHED = "published";
+
+    /**
+     * Provides an augmentable implementation of attribute change events for 
+     * AttributeCore. 
+     *
+     * @class AttributeEvents
+     * @uses EventTarget
+     */
+    function AttributeEvents() {
+        // Perf tweak - avoid creating event literals if not required.
+        this._ATTR_E_FACADE = {};
+        EventTarget.call(this, {emitFacade:true});
+    }
+
+    AttributeEvents._ATTR_CFG = [BROADCAST];
+
+    AttributeEvents.prototype = {
+
+        /**
+         * Sets the value of an attribute.
+         *
+         * @method set
+         * @chainable
+         *
+         * @param {String} name The name of the attribute. If the 
+         * current value of the attribute is an Object, dot notation can be used
+         * to set the value of a property within the object (e.g. <code>set("x.y.z", 5)</code>).
+         *
+         * @param {Any} value The value to set the attribute to.
+         *
+         * @param {Object} opts (Optional) Optional event data to be mixed into
+         * the event facade passed to subscribers of the attribute's change event. This 
+         * can be used as a flexible way to identify the source of a call to set, allowing 
+         * the developer to distinguish between set called internally by the host, vs. 
+         * set called externally by the application developer.
+         *
+         * @return {Object} A reference to the host object.
+         */
+        set : function(name, val, opts) {
+            return this._setAttr(name, val, opts);
+        },
+
+        /**
+         * Allows setting of readOnly/writeOnce attributes. See <a href="#method_set">set</a> for argument details.
+         *
+         * @method _set
+         * @protected
+         * @chainable
+         * 
+         * @param {String} name The name of the attribute.
+         * @param {Any} val The value to set the attribute to.
+         * @param {Object} opts (Optional) Optional event data to be mixed into
+         * the event facade passed to subscribers of the attribute's change event.
+         * @return {Object} A reference to the host object.
+         */
+        _set : function(name, val, opts) {
+            return this._setAttr(name, val, opts, true);
+        },
+
+        /**
+         * Sets multiple attribute values.
+         *
+         * @method setAttrs
+         * @param {Object} attrs  An object with attributes name/value pairs.
+         * @return {Object} A reference to the host object.
+         * @chainable
+         */
+        setAttrs : function(attrs, opts) {
+            return this._setAttrs(attrs, opts);
+        },
+
+        /**
+         * Utility method to help setup the event payload and fire the attribute change event.
+         * 
+         * @method _fireAttrChange
+         * @private
+         * @param {String} attrName The name of the attribute
+         * @param {String} subAttrName The full path of the property being changed, 
+         * if this is a sub-attribute value being change. Otherwise null.
+         * @param {Any} currVal The current value of the attribute
+         * @param {Any} newVal The new value of the attribute
+         * @param {Object} opts Any additional event data to mix into the attribute change event's event facade.
+         */
+        _fireAttrChange : function(attrName, subAttrName, currVal, newVal, opts) {
+            var host = this,
+                eventName = attrName + CHANGE,
+                state = host._state,
+                facade,
+                broadcast,
+                evtCfg;
+
+            if (!state.get(attrName, PUBLISHED)) {
+                
+                evtCfg = {
+                    queuable:false,
+                    defaultTargetOnly: true, 
+                    defaultFn:host._defAttrChangeFn, 
+                    silent:true
+                };
+
+                broadcast = state.get(attrName, BROADCAST);
+                if (broadcast !== undefined) {
+                    evtCfg.broadcast = broadcast;
+                }
+
+                host.publish(eventName, evtCfg);
+                
+                state.add(attrName, PUBLISHED, true);
+            }
+
+            facade = (opts) ? Y.merge(opts) : host._ATTR_E_FACADE;
+
+            // Not using the single object signature for fire({type:..., newVal:...}), since 
+            // we don't want to override type. Changed to the fire(type, {newVal:...}) signature.
+
+            // facade.type = eventName;
+            facade.attrName = attrName;
+            facade.subAttrName = subAttrName;
+            facade.prevVal = currVal;
+            facade.newVal = newVal;
+
+            // host.fire(facade);
+            host.fire(eventName, facade);
+        },
+
+        /**
+         * Default function for attribute change events.
+         *
+         * @private
+         * @method _defAttrChangeFn
+         * @param {EventFacade} e The event object for attribute change events.
+         */
+        _defAttrChangeFn : function(e) {
+            if (!this._setAttrVal(e.attrName, e.subAttrName, e.prevVal, e.newVal)) {
+                // Prevent "after" listeners from being invoked since nothing changed.
+                e.stopImmediatePropagation();
+            } else {
+                e.newVal = this.get(e.attrName);
+            }
+        }
+    };
+
+    // Basic prototype augment - no lazy constructor invocation.
+    Y.mix(AttributeEvents, EventTarget, false, null, 1);
+
+    Y.AttributeEvents = AttributeEvents;
+
+
+}, '3.5.1' ,{requires:['event-custom']});

=== added directory 'debian/extras/jslibs/yui/attribute-extras'
=== added file 'debian/extras/jslibs/yui/attribute-extras/attribute-extras-debug.js'
--- debian/extras/jslibs/yui/attribute-extras/attribute-extras-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-extras/attribute-extras-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,150 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('attribute-extras', function(Y) {
+
+    /**
+     * The attribute module provides an augmentable Attribute implementation, which 
+     * adds configurable attributes and attribute change events to the class being 
+     * augmented. It also provides a State class, which is used internally by Attribute,
+     * but can also be used independently to provide a name/property/value data structure to
+     * store state.
+     *
+     * @module attribute
+     */
+
+    /**
+     * The attribute-extras submodule provides less commonly used attribute methods, and can 
+     * be augmented/mixed into an implemention which used attribute-core.
+     *
+     * @module attribute
+     * @submodule attribute-extras
+     */
+    var BROADCAST = "broadcast",
+        PUBLISHED = "published",
+        INIT_VALUE = "initValue",
+
+        MODIFIABLE = {
+            readOnly:1,
+            writeOnce:1,
+            getter:1,
+            broadcast:1
+        };
+
+    /**
+     * A augmentable implementation for AttributeCore, providing less frequently used 
+     * methods for Attribute management such as modifyAttrs(), removeAttr and reset()   
+     *
+     * @class AttributeExtras
+     */
+    function AttributeExtras() {}
+
+    AttributeExtras.prototype = {
+
+        /**
+         * Updates the configuration of an attribute which has already been added.
+         * <p>
+         * The properties which can be modified through this interface are limited
+         * to the following subset of attributes, which can be safely modified
+         * after a value has already been set on the attribute: readOnly, writeOnce, 
+         * broadcast and getter.
+         * </p>
+         * @method modifyAttr
+         * @param {String} name The name of the attribute whose configuration is to be updated.
+         * @param {Object} config An object with configuration property/value pairs, specifying the configuration properties to modify.
+         */
+        modifyAttr: function(name, config) {
+            var host = this, // help compression
+                prop, state;
+
+            if (host.attrAdded(name)) {
+
+                if (host._isLazyAttr(name)) {
+                    host._addLazyAttr(name);
+                }
+
+                state = host._state;
+                for (prop in config) {
+                    if (MODIFIABLE[prop] && config.hasOwnProperty(prop)) {
+                        state.add(name, prop, config[prop]);
+
+                        // If we reconfigured broadcast, need to republish
+                        if (prop === BROADCAST) {
+                            state.remove(name, PUBLISHED);
+                        }
+                    }
+                }
+            }
+
+            if (!host.attrAdded(name)) {Y.log('Attribute modifyAttr:' + name + ' has not been added. Use addAttr to add the attribute', 'warn', 'attribute');}
+        },
+
+        /**
+         * Removes an attribute from the host object
+         *
+         * @method removeAttr
+         * @param {String} name The name of the attribute to be removed.
+         */
+        removeAttr: function(name) {
+            this._state.removeAll(name);
+        },
+
+        /**
+         * Resets the attribute (or all attributes) to its initial value, as long as
+         * the attribute is not readOnly, or writeOnce.
+         *
+         * @method reset
+         * @param {String} name Optional. The name of the attribute to reset.  If omitted, all attributes are reset.
+         * @return {Object} A reference to the host object.
+         * @chainable
+         */
+        reset : function(name) {
+            var host = this;  // help compression
+
+            if (name) {
+                if (host._isLazyAttr(name)) {
+                    host._addLazyAttr(name);
+                }
+                host.set(name, host._state.get(name, INIT_VALUE));
+            } else {
+                Y.each(host._state.data, function(v, n) {
+                    host.reset(n);
+                });
+            }
+            return host;
+        },
+
+        /**
+         * Returns an object with the configuration properties (and value)
+         * for the given attribute. If attrName is not provided, returns the
+         * configuration properties for all attributes.
+         *
+         * @method _getAttrCfg
+         * @protected
+         * @param {String} name Optional. The attribute name. If not provided, the method will return the configuration for all attributes.
+         * @return {Object} The configuration properties for the given attribute, or all attributes.
+         */
+        _getAttrCfg : function(name) {
+            var o,
+                state = this._state;
+
+            if (name) {
+                o = state.getAll(name) || {};
+            } else {
+                o = {};
+                Y.each(state.data, function(v, n) {
+                    o[n] = state.getAll(n);
+                }); 
+            }
+
+            return o;
+        }
+    };
+
+    Y.AttributeExtras = AttributeExtras;
+
+
+}, '3.5.1' );

=== added file 'debian/extras/jslibs/yui/attribute-extras/attribute-extras-min.js'
--- debian/extras/jslibs/yui/attribute-extras/attribute-extras-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-extras/attribute-extras-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("attribute-extras",function(f){var a="broadcast",d="published",e="initValue",c={readOnly:1,writeOnce:1,getter:1,broadcast:1};function b(){}b.prototype={modifyAttr:function(h,g){var i=this,k,j;if(i.attrAdded(h)){if(i._isLazyAttr(h)){i._addLazyAttr(h);}j=i._state;for(k in g){if(c[k]&&g.hasOwnProperty(k)){j.add(h,k,g[k]);if(k===a){j.remove(h,d);}}}}},removeAttr:function(g){this._state.removeAll(g);},reset:function(g){var h=this;if(g){if(h._isLazyAttr(g)){h._addLazyAttr(g);}h.set(g,h._state.get(g,e));}else{f.each(h._state.data,function(i,j){h.reset(j);});}return h;},_getAttrCfg:function(g){var i,h=this._state;if(g){i=h.getAll(g)||{};}else{i={};f.each(h.data,function(j,k){i[k]=h.getAll(k);});}return i;}};f.AttributeExtras=b;},"3.5.1");
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/attribute-extras/attribute-extras.js'
--- debian/extras/jslibs/yui/attribute-extras/attribute-extras.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/attribute-extras/attribute-extras.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,149 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('attribute-extras', function(Y) {
+
+    /**
+     * The attribute module provides an augmentable Attribute implementation, which 
+     * adds configurable attributes and attribute change events to the class being 
+     * augmented. It also provides a State class, which is used internally by Attribute,
+     * but can also be used independently to provide a name/property/value data structure to
+     * store state.
+     *
+     * @module attribute
+     */
+
+    /**
+     * The attribute-extras submodule provides less commonly used attribute methods, and can 
+     * be augmented/mixed into an implemention which used attribute-core.
+     *
+     * @module attribute
+     * @submodule attribute-extras
+     */
+    var BROADCAST = "broadcast",
+        PUBLISHED = "published",
+        INIT_VALUE = "initValue",
+
+        MODIFIABLE = {
+            readOnly:1,
+            writeOnce:1,
+            getter:1,
+            broadcast:1
+        };
+
+    /**
+     * A augmentable implementation for AttributeCore, providing less frequently used 
+     * methods for Attribute management such as modifyAttrs(), removeAttr and reset()   
+     *
+     * @class AttributeExtras
+     */
+    function AttributeExtras() {}
+
+    AttributeExtras.prototype = {
+
+        /**
+         * Updates the configuration of an attribute which has already been added.
+         * <p>
+         * The properties which can be modified through this interface are limited
+         * to the following subset of attributes, which can be safely modified
+         * after a value has already been set on the attribute: readOnly, writeOnce, 
+         * broadcast and getter.
+         * </p>
+         * @method modifyAttr
+         * @param {String} name The name of the attribute whose configuration is to be updated.
+         * @param {Object} config An object with configuration property/value pairs, specifying the configuration properties to modify.
+         */
+        modifyAttr: function(name, config) {
+            var host = this, // help compression
+                prop, state;
+
+            if (host.attrAdded(name)) {
+
+                if (host._isLazyAttr(name)) {
+                    host._addLazyAttr(name);
+                }
+
+                state = host._state;
+                for (prop in config) {
+                    if (MODIFIABLE[prop] && config.hasOwnProperty(prop)) {
+                        state.add(name, prop, config[prop]);
+
+                        // If we reconfigured broadcast, need to republish
+                        if (prop === BROADCAST) {
+                            state.remove(name, PUBLISHED);
+                        }
+                    }
+                }
+            }
+
+        },
+
+        /**
+         * Removes an attribute from the host object
+         *
+         * @method removeAttr
+         * @param {String} name The name of the attribute to be removed.
+         */
+        removeAttr: function(name) {
+            this._state.removeAll(name);
+        },
+
+        /**
+         * Resets the attribute (or all attributes) to its initial value, as long as
+         * the attribute is not readOnly, or writeOnce.
+         *
+         * @method reset
+         * @param {String} name Optional. The name of the attribute to reset.  If omitted, all attributes are reset.
+         * @return {Object} A reference to the host object.
+         * @chainable
+         */
+        reset : function(name) {
+            var host = this;  // help compression
+
+            if (name) {
+                if (host._isLazyAttr(name)) {
+                    host._addLazyAttr(name);
+                }
+                host.set(name, host._state.get(name, INIT_VALUE));
+            } else {
+                Y.each(host._state.data, function(v, n) {
+                    host.reset(n);
+                });
+            }
+            return host;
+        },
+
+        /**
+         * Returns an object with the configuration properties (and value)
+         * for the given attribute. If attrName is not provided, returns the
+         * configuration properties for all attributes.
+         *
+         * @method _getAttrCfg
+         * @protected
+         * @param {String} name Optional. The attribute name. If not provided, the method will return the configuration for all attributes.
+         * @return {Object} The configuration properties for the given attribute, or all attributes.
+         */
+        _getAttrCfg : function(name) {
+            var o,
+                state = this._state;
+
+            if (name) {
+                o = state.getAll(name) || {};
+            } else {
+                o = {};
+                Y.each(state.data, function(v, n) {
+                    o[n] = state.getAll(n);
+                }); 
+            }
+
+            return o;
+        }
+    };
+
+    Y.AttributeExtras = AttributeExtras;
+
+
+}, '3.5.1' );

=== added directory 'debian/extras/jslibs/yui/autocomplete-base'
=== added file 'debian/extras/jslibs/yui/autocomplete-base/autocomplete-base-debug.js'
--- debian/extras/jslibs/yui/autocomplete-base/autocomplete-base-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-base/autocomplete-base-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,1552 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-base', function(Y) {
+
+/**
+Provides automatic input completion or suggestions for text input fields and
+textareas.
+
+@module autocomplete
+@main autocomplete
+@since 3.3.0
+**/
+
+/**
+`Y.Base` extension that provides core autocomplete logic (but no UI
+implementation) for a text input field or textarea. Must be mixed into a
+`Y.Base`-derived class to be useful.
+
+@module autocomplete
+@submodule autocomplete-base
+**/
+
+/**
+Extension that provides core autocomplete logic (but no UI implementation) for a
+text input field or textarea.
+
+The `AutoCompleteBase` class provides events and attributes that abstract away
+core autocomplete logic and configuration, but does not provide a widget
+implementation or suggestion UI. For a prepackaged autocomplete widget, see
+`AutoCompleteList`.
+
+This extension cannot be instantiated directly, since it doesn't provide an
+actual implementation. It's intended to be mixed into a `Y.Base`-based class or
+widget.
+
+`Y.Widget`-based example:
+
+    YUI().use('autocomplete-base', 'widget', function (Y) {
+        var MyAC = Y.Base.create('myAC', Y.Widget, [Y.AutoCompleteBase], {
+            // Custom prototype methods and properties.
+        }, {
+            // Custom static methods and properties.
+        });
+
+        // Custom implementation code.
+    });
+
+`Y.Base`-based example:
+
+    YUI().use('autocomplete-base', function (Y) {
+        var MyAC = Y.Base.create('myAC', Y.Base, [Y.AutoCompleteBase], {
+            initializer: function () {
+                this._bindUIACBase();
+                this._syncUIACBase();
+            },
+
+            // Custom prototype methods and properties.
+        }, {
+            // Custom static methods and properties.
+        });
+
+        // Custom implementation code.
+    });
+
+@class AutoCompleteBase
+**/
+
+var Escape  = Y.Escape,
+    Lang    = Y.Lang,
+    YArray  = Y.Array,
+    YObject = Y.Object,
+
+    isFunction = Lang.isFunction,
+    isString   = Lang.isString,
+    trim       = Lang.trim,
+
+    INVALID_VALUE = Y.Attribute.INVALID_VALUE,
+
+    _FUNCTION_VALIDATOR = '_functionValidator',
+    _SOURCE_SUCCESS     = '_sourceSuccess',
+
+    ALLOW_BROWSER_AC    = 'allowBrowserAutocomplete',
+    INPUT_NODE          = 'inputNode',
+    QUERY               = 'query',
+    QUERY_DELIMITER     = 'queryDelimiter',
+    REQUEST_TEMPLATE    = 'requestTemplate',
+    RESULTS             = 'results',
+    RESULT_LIST_LOCATOR = 'resultListLocator',
+    VALUE               = 'value',
+    VALUE_CHANGE        = 'valueChange',
+
+    EVT_CLEAR   = 'clear',
+    EVT_QUERY   = QUERY,
+    EVT_RESULTS = RESULTS;
+
+function AutoCompleteBase() {}
+
+AutoCompleteBase.prototype = {
+    // -- Lifecycle Methods ----------------------------------------------------
+    initializer: function () {
+        // AOP bindings.
+        Y.before(this._bindUIACBase, this, 'bindUI');
+        Y.before(this._syncUIACBase, this, 'syncUI');
+
+        // -- Public Events ----------------------------------------------------
+
+        /**
+        Fires after the query has been completely cleared or no longer meets the
+        minimum query length requirement.
+
+        @event clear
+        @param {String} prevVal Value of the query before it was cleared.
+        @param {String} src Source of the event.
+        @preventable _defClearFn
+        **/
+        this.publish(EVT_CLEAR, {
+            defaultFn: this._defClearFn
+        });
+
+        /**
+        Fires when the contents of the input field have changed and the input
+        value meets the criteria necessary to generate an autocomplete query.
+
+        @event query
+        @param {String} inputValue Full contents of the text input field or
+            textarea that generated the query.
+        @param {String} query AutoComplete query. This is the string that will
+            be used to request completion results. It may or may not be the same
+            as `inputValue`.
+        @param {String} src Source of the event.
+        @preventable _defQueryFn
+        **/
+        this.publish(EVT_QUERY, {
+            defaultFn: this._defQueryFn
+        });
+
+        /**
+        Fires after query results are received from the source. If no source has
+        been set, this event will not fire.
+
+        @event results
+        @param {Array|Object} data Raw, unfiltered result data (if available).
+        @param {String} query Query that generated these results.
+        @param {Object[]} results Array of filtered, formatted, and highlighted
+            results. Each item in the array is an object with the following
+            properties:
+
+            @param {Node|HTMLElement|String} results.display Formatted result
+                HTML suitable for display to the user. If no custom formatter is
+                set, this will be an HTML-escaped version of the string in the
+                `text` property.
+            @param {String} [results.highlighted] Highlighted (but not
+                formatted) result text. This property will only be set if a
+                highlighter is in use.
+            @param {Any} results.raw Raw, unformatted result in whatever form it
+                was provided by the source.
+            @param {String} results.text Plain text version of the result,
+                suitable for being inserted into the value of a text input field
+                or textarea when the result is selected by a user. This value is
+                not HTML-escaped and should not be inserted into the page using
+                `innerHTML` or `Node#setContent()`.
+
+        @preventable _defResultsFn
+        **/
+        this.publish(EVT_RESULTS, {
+            defaultFn: this._defResultsFn
+        });
+    },
+
+    destructor: function () {
+        this._acBaseEvents && this._acBaseEvents.detach();
+
+        delete this._acBaseEvents;
+        delete this._cache;
+        delete this._inputNode;
+        delete this._rawSource;
+    },
+
+    // -- Public Prototype Methods ---------------------------------------------
+
+    /**
+    Clears the result cache.
+
+    @method clearCache
+    @chainable
+    @since 3.5.0
+    **/
+    clearCache: function () {
+        this._cache && (this._cache = {});
+        return this;
+    },
+
+    /**
+    Sends a request to the configured source. If no source is configured, this
+    method won't do anything.
+
+    Usually there's no reason to call this method manually; it will be called
+    automatically when user input causes a `query` event to be fired. The only
+    time you'll need to call this method manually is if you want to force a
+    request to be sent when no user input has occurred.
+
+    @method sendRequest
+    @param {String} [query] Query to send. If specified, the `query` attribute
+        will be set to this query. If not specified, the current value of the
+        `query` attribute will be used.
+    @param {Function} [requestTemplate] Request template function. If not
+        specified, the current value of the `requestTemplate` attribute will be
+        used.
+    @chainable
+    **/
+    sendRequest: function (query, requestTemplate) {
+        var request,
+            source = this.get('source');
+
+        if (query || query === '') {
+            this._set(QUERY, query);
+        } else {
+            query = this.get(QUERY) || '';
+        }
+
+        if (source) {
+            if (!requestTemplate) {
+                requestTemplate = this.get(REQUEST_TEMPLATE);
+            }
+
+            request = requestTemplate ?
+                requestTemplate.call(this, query) : query;
+
+            Y.log('sendRequest: ' + request, 'info', 'autocomplete-base');
+
+            source.sendRequest({
+                query  : query,
+                request: request,
+
+                callback: {
+                    success: Y.bind(this._onResponse, this, query)
+                }
+            });
+        }
+
+        return this;
+    },
+
+    // -- Protected Lifecycle Methods ------------------------------------------
+
+    /**
+    Attaches event listeners and behaviors.
+
+    @method _bindUIACBase
+    @protected
+    **/
+    _bindUIACBase: function () {
+        var inputNode  = this.get(INPUT_NODE),
+            tokenInput = inputNode && inputNode.tokenInput;
+
+        // If the inputNode has a node-tokeninput plugin attached, bind to the
+        // plugin's inputNode instead.
+        if (tokenInput) {
+            inputNode = tokenInput.get(INPUT_NODE);
+            this._set('tokenInput', tokenInput);
+        }
+
+        if (!inputNode) {
+            Y.error('No inputNode specified.');
+            return;
+        }
+
+        this._inputNode = inputNode;
+
+        this._acBaseEvents = new Y.EventHandle([
+            // This is the valueChange event on the inputNode, provided by the
+            // event-valuechange module, not our own valueChange.
+            inputNode.on(VALUE_CHANGE, this._onInputValueChange, this),
+            inputNode.on('blur', this._onInputBlur, this),
+
+            this.after(ALLOW_BROWSER_AC + 'Change', this._syncBrowserAutocomplete),
+            this.after('sourceTypeChange', this._afterSourceTypeChange),
+            this.after(VALUE_CHANGE, this._afterValueChange)
+        ]);
+    },
+
+    /**
+    Synchronizes the UI state of the `inputNode`.
+
+    @method _syncUIACBase
+    @protected
+    **/
+    _syncUIACBase: function () {
+        this._syncBrowserAutocomplete();
+        this.set(VALUE, this.get(INPUT_NODE).get(VALUE));
+    },
+
+    // -- Protected Prototype Methods ------------------------------------------
+
+    /**
+    Creates a DataSource-like object that simply returns the specified array as
+    a response. See the `source` attribute for more details.
+
+    @method _createArraySource
+    @param {Array} source
+    @return {Object} DataSource-like object.
+    @protected
+    **/
+    _createArraySource: function (source) {
+        var that = this;
+
+        return {
+            type: 'array',
+            sendRequest: function (request) {
+                that[_SOURCE_SUCCESS](source.concat(), request);
+            }
+        };
+    },
+
+    /**
+    Creates a DataSource-like object that passes the query to a custom-defined
+    function, which is expected to call the provided callback with an array of
+    results. See the `source` attribute for more details.
+
+    @method _createFunctionSource
+    @param {Function} source Function that accepts a query and a callback as
+      parameters, and calls the callback with an array of results.
+    @return {Object} DataSource-like object.
+    @protected
+    **/
+    _createFunctionSource: function (source) {
+        var that = this;
+
+        return {
+            type: 'function',
+            sendRequest: function (request) {
+                var value;
+
+                function afterResults(results) {
+                    that[_SOURCE_SUCCESS](results || [], request);
+                }
+
+                // Allow both synchronous and asynchronous functions. If we get
+                // a truthy return value, assume the function is synchronous.
+                if ((value = source(request.query, afterResults))) {
+                    afterResults(value);
+                }
+            }
+        };
+    },
+
+    /**
+    Creates a DataSource-like object that looks up queries as properties on the
+    specified object, and returns the found value (if any) as a response. See
+    the `source` attribute for more details.
+
+    @method _createObjectSource
+    @param {Object} source
+    @return {Object} DataSource-like object.
+    @protected
+    **/
+    _createObjectSource: function (source) {
+        var that = this;
+
+        return {
+            type: 'object',
+            sendRequest: function (request) {
+                var query = request.query;
+
+                that[_SOURCE_SUCCESS](
+                    YObject.owns(source, query) ? source[query] : [],
+                    request
+                );
+            }
+        };
+    },
+
+    /**
+    Returns `true` if _value_ is either a function or `null`.
+
+    @method _functionValidator
+    @param {Function|null} value Value to validate.
+    @protected
+    **/
+    _functionValidator: function (value) {
+        return value === null || isFunction(value);
+    },
+
+    /**
+    Faster and safer alternative to `Y.Object.getValue()`. Doesn't bother
+    casting the path to an array (since we already know it's an array) and
+    doesn't throw an error if a value in the middle of the object hierarchy is
+    neither `undefined` nor an object.
+
+    @method _getObjectValue
+    @param {Object} obj
+    @param {Array} path
+    @return {Any} Located value, or `undefined` if the value was
+        not found at the specified path.
+    @protected
+    **/
+    _getObjectValue: function (obj, path) {
+        if (!obj) {
+            return;
+        }
+
+        for (var i = 0, len = path.length; obj && i < len; i++) {
+            obj = obj[path[i]];
+        }
+
+        return obj;
+    },
+
+    /**
+    Parses result responses, performs filtering and highlighting, and fires the
+    `results` event.
+
+    @method _parseResponse
+    @param {String} query Query that generated these results.
+    @param {Object} response Response containing results.
+    @param {Object} data Raw response data.
+    @protected
+    **/
+    _parseResponse: function (query, response, data) {
+        var facade = {
+                data   : data,
+                query  : query,
+                results: []
+            },
+
+            listLocator = this.get(RESULT_LIST_LOCATOR),
+            results     = [],
+            unfiltered  = response && response.results,
+
+            filters,
+            formatted,
+            formatter,
+            highlighted,
+            highlighter,
+            i,
+            len,
+            maxResults,
+            result,
+            text,
+            textLocator;
+
+        if (unfiltered && listLocator) {
+            unfiltered = listLocator.call(this, unfiltered);
+        }
+
+        if (unfiltered && unfiltered.length) {
+            filters     = this.get('resultFilters');
+            textLocator = this.get('resultTextLocator');
+
+            // Create a lightweight result object for each result to make them
+            // easier to work with. The various properties on the object
+            // represent different formats of the result, and will be populated
+            // as we go.
+            for (i = 0, len = unfiltered.length; i < len; ++i) {
+                result = unfiltered[i];
+
+                text = textLocator ?
+                        textLocator.call(this, result) :
+                        result.toString();
+
+                results.push({
+                    display: Escape.html(text),
+                    raw    : result,
+                    text   : text
+                });
+            }
+
+            // Run the results through all configured result filters. Each
+            // filter returns an array of (potentially fewer) result objects,
+            // which is then passed to the next filter, and so on.
+            for (i = 0, len = filters.length; i < len; ++i) {
+                results = filters[i].call(this, query, results.concat());
+
+                if (!results) {
+                    Y.log("Filter didn't return anything.", 'warn', 'autocomplete-base');
+                    return;
+                }
+
+                if (!results.length) {
+                    break;
+                }
+            }
+
+            if (results.length) {
+                formatter   = this.get('resultFormatter');
+                highlighter = this.get('resultHighlighter');
+                maxResults  = this.get('maxResults');
+
+                // If maxResults is set and greater than 0, limit the number of
+                // results.
+                if (maxResults && maxResults > 0 &&
+                        results.length > maxResults) {
+                    results.length = maxResults;
+                }
+
+                // Run the results through the configured highlighter (if any).
+                // The highlighter returns an array of highlighted strings (not
+                // an array of result objects), and these strings are then added
+                // to each result object.
+                if (highlighter) {
+                    highlighted = highlighter.call(this, query,
+                            results.concat());
+
+                    if (!highlighted) {
+                        Y.log("Highlighter didn't return anything.", 'warn', 'autocomplete-base');
+                        return;
+                    }
+
+                    for (i = 0, len = highlighted.length; i < len; ++i) {
+                        result = results[i];
+                        result.highlighted = highlighted[i];
+                        result.display     = result.highlighted;
+                    }
+                }
+
+                // Run the results through the configured formatter (if any) to
+                // produce the final formatted results. The formatter returns an
+                // array of strings or Node instances (not an array of result
+                // objects), and these strings/Nodes are then added to each
+                // result object.
+                if (formatter) {
+                    formatted = formatter.call(this, query, results.concat());
+
+                    if (!formatted) {
+                        Y.log("Formatter didn't return anything.", 'warn', 'autocomplete-base');
+                        return;
+                    }
+
+                    for (i = 0, len = formatted.length; i < len; ++i) {
+                        results[i].display = formatted[i];
+                    }
+                }
+            }
+        }
+
+        facade.results = results;
+        this.fire(EVT_RESULTS, facade);
+    },
+
+    /**
+    Returns the query portion of the specified input value, or `null` if there
+    is no suitable query within the input value.
+
+    If a query delimiter is defined, the query will be the last delimited part
+    of of the string.
+
+    @method _parseValue
+    @param {String} value Input value from which to extract the query.
+    @return {String|null} query
+    @protected
+    **/
+    _parseValue: function (value) {
+        var delim = this.get(QUERY_DELIMITER);
+
+        if (delim) {
+            value = value.split(delim);
+            value = value[value.length - 1];
+        }
+
+        return Lang.trimLeft(value);
+    },
+
+    /**
+    Setter for the `enableCache` attribute.
+
+    @method _setEnableCache
+    @param {Boolean} value
+    @protected
+    @since 3.5.0
+    **/
+    _setEnableCache: function (value) {
+        // When `this._cache` is an object, result sources will store cached
+        // results in it. When it's falsy, they won't. This way result sources
+        // don't need to get the value of the `enableCache` attribute on every
+        // request, which would be sloooow.
+        this._cache = value ? {} : null;
+        Y.log('Cache ' + (value ? 'enabled' : 'disabled'), 'debug', 'autocomplete-base');
+    },
+
+    /**
+    Setter for locator attributes.
+
+    @method _setLocator
+    @param {Function|String|null} locator
+    @return {Function|null}
+    @protected
+    **/
+    _setLocator: function (locator) {
+        if (this[_FUNCTION_VALIDATOR](locator)) {
+            return locator;
+        }
+
+        var that = this;
+
+        locator = locator.toString().split('.');
+
+        return function (result) {
+            return result && that._getObjectValue(result, locator);
+        };
+    },
+
+    /**
+    Setter for the `requestTemplate` attribute.
+
+    @method _setRequestTemplate
+    @param {Function|String|null} template
+    @return {Function|null}
+    @protected
+    **/
+    _setRequestTemplate: function (template) {
+        if (this[_FUNCTION_VALIDATOR](template)) {
+            return template;
+        }
+
+        template = template.toString();
+
+        return function (query) {
+            return Lang.sub(template, {query: encodeURIComponent(query)});
+        };
+    },
+
+    /**
+    Setter for the `resultFilters` attribute.
+
+    @method _setResultFilters
+    @param {Array|Function|String|null} filters `null`, a filter
+        function, an array of filter functions, or a string or array of strings
+        representing the names of methods on `Y.AutoCompleteFilters`.
+    @return {Function[]} Array of filter functions (empty if <i>filters</i> is
+        `null`).
+    @protected
+    **/
+    _setResultFilters: function (filters) {
+        var acFilters, getFilterFunction;
+
+        if (filters === null) {
+            return [];
+        }
+
+        acFilters = Y.AutoCompleteFilters;
+
+        getFilterFunction = function (filter) {
+            if (isFunction(filter)) {
+                return filter;
+            }
+
+            if (isString(filter) && acFilters &&
+                    isFunction(acFilters[filter])) {
+                return acFilters[filter];
+            }
+
+            return false;
+        };
+
+        if (Lang.isArray(filters)) {
+            filters = YArray.map(filters, getFilterFunction);
+            return YArray.every(filters, function (f) { return !!f; }) ?
+                    filters : INVALID_VALUE;
+        } else {
+            filters = getFilterFunction(filters);
+            return filters ? [filters] : INVALID_VALUE;
+        }
+    },
+
+    /**
+    Setter for the `resultHighlighter` attribute.
+
+    @method _setResultHighlighter
+    @param {Function|String|null} highlighter `null`, a highlighter function, or
+        a string representing the name of a method on
+        `Y.AutoCompleteHighlighters`.
+    @return {Function|null}
+    @protected
+    **/
+    _setResultHighlighter: function (highlighter) {
+        var acHighlighters;
+
+        if (this[_FUNCTION_VALIDATOR](highlighter)) {
+            return highlighter;
+        }
+
+        acHighlighters = Y.AutoCompleteHighlighters;
+
+        if (isString(highlighter) && acHighlighters &&
+                isFunction(acHighlighters[highlighter])) {
+            return acHighlighters[highlighter];
+        }
+
+        return INVALID_VALUE;
+    },
+
+    /**
+    Setter for the `source` attribute. Returns a DataSource or a DataSource-like
+    object depending on the type of _source_ and/or the value of the
+    `sourceType` attribute.
+
+    @method _setSource
+    @param {Any} source AutoComplete source. See the `source` attribute for
+        details.
+    @return {DataSource|Object}
+    @protected
+    **/
+    _setSource: function (source) {
+        var sourceType = this.get('sourceType') || Lang.type(source),
+            sourceSetter;
+
+        if ((source && isFunction(source.sendRequest))
+                || source === null
+                || sourceType === 'datasource') {
+
+            // Quacks like a DataSource instance (or null). Make it so!
+            this._rawSource = source;
+            return source;
+        }
+
+        // See if there's a registered setter for this source type.
+        if ((sourceSetter = AutoCompleteBase.SOURCE_TYPES[sourceType])) {
+            this._rawSource = source;
+            return Lang.isString(sourceSetter) ?
+                    this[sourceSetter](source) : sourceSetter(source);
+        }
+
+        Y.error("Unsupported source type '" + sourceType + "'. Maybe autocomplete-sources isn't loaded?");
+        return INVALID_VALUE;
+    },
+
+    /**
+    Shared success callback for non-DataSource sources.
+
+    @method _sourceSuccess
+    @param {Any} data Response data.
+    @param {Object} request Request object.
+    @protected
+    **/
+    _sourceSuccess: function (data, request) {
+        request.callback.success({
+            data: data,
+            response: {results: data}
+        });
+    },
+
+    /**
+    Synchronizes the UI state of the `allowBrowserAutocomplete` attribute.
+
+    @method _syncBrowserAutocomplete
+    @protected
+    **/
+    _syncBrowserAutocomplete: function () {
+        var inputNode = this.get(INPUT_NODE);
+
+        if (inputNode.get('nodeName').toLowerCase() === 'input') {
+            inputNode.setAttribute('autocomplete',
+                    this.get(ALLOW_BROWSER_AC) ? 'on' : 'off');
+        }
+    },
+
+    /**
+    Updates the query portion of the `value` attribute.
+
+    If a query delimiter is defined, the last delimited portion of the input
+    value will be replaced with the specified _value_.
+
+    @method _updateValue
+    @param {String} newVal New value.
+    @protected
+    **/
+    _updateValue: function (newVal) {
+        var delim = this.get(QUERY_DELIMITER),
+            insertDelim,
+            len,
+            prevVal;
+
+        newVal = Lang.trimLeft(newVal);
+
+        if (delim) {
+            insertDelim = trim(delim); // so we don't double up on spaces
+            prevVal     = YArray.map(trim(this.get(VALUE)).split(delim), trim);
+            len         = prevVal.length;
+
+            if (len > 1) {
+                prevVal[len - 1] = newVal;
+                newVal = prevVal.join(insertDelim + ' ');
+            }
+
+            newVal = newVal + insertDelim + ' ';
+        }
+
+        this.set(VALUE, newVal);
+    },
+
+    // -- Protected Event Handlers ---------------------------------------------
+
+    /**
+    Updates the current `source` based on the new `sourceType` to ensure that
+    the two attributes don't get out of sync when they're changed separately.
+
+    @method _afterSourceTypeChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterSourceTypeChange: function (e) {
+        if (this._rawSource) {
+            this.set('source', this._rawSource);
+        }
+    },
+
+    /**
+    Handles change events for the `value` attribute.
+
+    @method _afterValueChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterValueChange: function (e) {
+        var newVal   = e.newVal,
+            self     = this,
+            uiChange = e.src === AutoCompleteBase.UI_SRC,
+            delay, fire, minQueryLength, query;
+
+        // Update the UI if the value was changed programmatically.
+        if (!uiChange) {
+            self._inputNode.set(VALUE, newVal);
+        }
+
+        Y.log('valueChange: new: "' + newVal + '"; old: "' + e.prevVal + '"', 'info', 'autocomplete-base');
+
+        minQueryLength = self.get('minQueryLength');
+        query          = self._parseValue(newVal) || '';
+
+        if (minQueryLength >= 0 && query.length >= minQueryLength) {
+            // Only query on changes that originate from the UI.
+            if (uiChange) {
+                delay = self.get('queryDelay');
+
+                fire = function () {
+                    self.fire(EVT_QUERY, {
+                        inputValue: newVal,
+                        query     : query,
+                        src       : e.src
+                    });
+                };
+
+                if (delay) {
+                    clearTimeout(self._delay);
+                    self._delay = setTimeout(fire, delay);
+                } else {
+                    fire();
+                }
+            } else {
+                // For programmatic value changes, just update the query
+                // attribute without sending a query.
+                self._set(QUERY, query);
+            }
+        } else {
+            clearTimeout(self._delay);
+
+            self.fire(EVT_CLEAR, {
+                prevVal: e.prevVal ? self._parseValue(e.prevVal) : null,
+                src    : e.src
+            });
+        }
+    },
+
+    /**
+    Handles `blur` events on the input node.
+
+    @method _onInputBlur
+    @param {EventFacade} e
+    @protected
+    **/
+    _onInputBlur: function (e) {
+        var delim = this.get(QUERY_DELIMITER),
+            delimPos,
+            newVal,
+            value;
+
+        // If a query delimiter is set and the input's value contains one or
+        // more trailing delimiters, strip them.
+        if (delim && !this.get('allowTrailingDelimiter')) {
+            delim = Lang.trimRight(delim);
+            value = newVal = this._inputNode.get(VALUE);
+
+            if (delim) {
+                while ((newVal = Lang.trimRight(newVal)) &&
+                        (delimPos = newVal.length - delim.length) &&
+                        newVal.lastIndexOf(delim) === delimPos) {
+
+                    newVal = newVal.substring(0, delimPos);
+                }
+            } else {
+                // Delimiter is one or more space characters, so just trim the
+                // value.
+                newVal = Lang.trimRight(newVal);
+            }
+
+            if (newVal !== value) {
+                this.set(VALUE, newVal);
+            }
+        }
+    },
+
+    /**
+    Handles `valueChange` events on the input node and fires a `query` event
+    when the input value meets the configured criteria.
+
+    @method _onInputValueChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _onInputValueChange: function (e) {
+        var newVal = e.newVal;
+
+        // Don't query if the internal value is the same as the new value
+        // reported by valueChange.
+        if (newVal !== this.get(VALUE)) {
+            this.set(VALUE, newVal, {src: AutoCompleteBase.UI_SRC});
+        }
+    },
+
+    /**
+    Handles source responses and fires the `results` event.
+
+    @method _onResponse
+    @param {EventFacade} e
+    @protected
+    **/
+    _onResponse: function (query, e) {
+        // Ignore stale responses that aren't for the current query.
+        if (query === (this.get(QUERY) || '')) {
+            this._parseResponse(query || '', e.response, e.data);
+        }
+    },
+
+    // -- Protected Default Event Handlers -------------------------------------
+
+    /**
+    Default `clear` event handler. Sets the `results` attribute to an empty
+    array and `query` to null.
+
+    @method _defClearFn
+    @protected
+    **/
+    _defClearFn: function () {
+        this._set(QUERY, null);
+        this._set(RESULTS, []);
+    },
+
+    /**
+    Default `query` event handler. Sets the `query` attribute and sends a
+    request to the source if one is configured.
+
+    @method _defQueryFn
+    @param {EventFacade} e
+    @protected
+    **/
+    _defQueryFn: function (e) {
+        Y.log('query: "' + e.query + '"; inputValue: "' + e.inputValue + '"', 'info', 'autocomplete-base');
+        this.sendRequest(e.query); // sendRequest will set the 'query' attribute
+    },
+
+    /**
+    Default `results` event handler. Sets the `results` attribute to the latest
+    results.
+
+    @method _defResultsFn
+    @param {EventFacade} e
+    @protected
+    **/
+    _defResultsFn: function (e) {
+        Y.log('results: ' + Y.dump(e.results), 'info', 'autocomplete-base');
+        this._set(RESULTS, e[RESULTS]);
+    }
+};
+
+AutoCompleteBase.ATTRS = {
+    /**
+    Whether or not to enable the browser's built-in autocomplete functionality
+    for input fields.
+
+    @attribute allowBrowserAutocomplete
+    @type Boolean
+    @default false
+    **/
+    allowBrowserAutocomplete: {
+        value: false
+    },
+
+    /**
+    When a `queryDelimiter` is set, trailing delimiters will automatically be
+    stripped from the input value by default when the input node loses focus.
+    Set this to `true` to allow trailing delimiters.
+
+    @attribute allowTrailingDelimiter
+    @type Boolean
+    @default false
+    **/
+    allowTrailingDelimiter: {
+        value: false
+    },
+
+    /**
+    Whether or not to enable in-memory caching in result sources that support
+    it.
+
+    @attribute enableCache
+    @type Boolean
+    @default true
+    @since 3.5.0
+    **/
+    enableCache: {
+        lazyAdd: false, // we need the setter to run on init
+        setter: '_setEnableCache',
+        value: true
+    },
+
+    /**
+    Node to monitor for changes, which will generate `query` events when
+    appropriate. May be either an `<input>` or a `<textarea>`.
+
+    @attribute inputNode
+    @type Node|HTMLElement|String
+    @initOnly
+    **/
+    inputNode: {
+        setter: Y.one,
+        writeOnce: 'initOnly'
+    },
+
+    /**
+    Maximum number of results to return. A value of `0` or less will allow an
+    unlimited number of results.
+
+    @attribute maxResults
+    @type Number
+    @default 0
+    **/
+    maxResults: {
+        value: 0
+    },
+
+    /**
+    Minimum number of characters that must be entered before a `query` event
+    will be fired. A value of `0` allows empty queries; a negative value will
+    effectively disable all `query` events.
+
+    @attribute minQueryLength
+    @type Number
+    @default 1
+    **/
+    minQueryLength: {
+        value: 1
+    },
+
+    /**
+    Current query, or `null` if there is no current query.
+
+    The query might not be the same as the current value of the input node, both
+    for timing reasons (due to `queryDelay`) and because when one or more
+    `queryDelimiter` separators are in use, only the last portion of the
+    delimited input string will be used as the query value.
+
+    @attribute query
+    @type String|null
+    @default null
+    @readonly
+    **/
+    query: {
+        readOnly: true,
+        value: null
+    },
+
+    /**
+    Number of milliseconds to delay after input before triggering a `query`
+    event. If new input occurs before this delay is over, the previous input
+    event will be ignored and a new delay will begin.
+
+    This can be useful both to throttle queries to a remote data source and to
+    avoid distracting the user by showing them less relevant results before
+    they've paused their typing.
+
+    @attribute queryDelay
+    @type Number
+    @default 100
+    **/
+    queryDelay: {
+        value: 100
+    },
+
+    /**
+    Query delimiter string. When a delimiter is configured, the input value
+    will be split on the delimiter, and only the last portion will be used in
+    autocomplete queries and updated when the `query` attribute is
+    modified.
+
+    @attribute queryDelimiter
+    @type String|null
+    @default null
+    **/
+    queryDelimiter: {
+        value: null
+    },
+
+    /**
+    Source request template. This can be a function that accepts a query as a
+    parameter and returns a request string, or it can be a string containing the
+    placeholder "{query}", which will be replaced with the actual URI-encoded
+    query. In either case, the resulting string will be appended to the request
+    URL when the `source` attribute is set to a remote DataSource, JSONP URL, or
+    XHR URL (it will not be appended to YQL URLs).
+
+    While `requestTemplate` may be set to either a function or a string, it will
+    always be returned as a function that accepts a query argument and returns a
+    string.
+
+    @attribute requestTemplate
+    @type Function|String|null
+    @default null
+    **/
+    requestTemplate: {
+        setter: '_setRequestTemplate',
+        value: null
+    },
+
+    /**
+    Array of local result filter functions. If provided, each filter will be
+    called with two arguments when results are received: the query and an array
+    of result objects. See the documentation for the `results` event for a list
+    of the properties available on each result object.
+
+    Each filter is expected to return a filtered or modified version of the
+    results array, which will then be passed on to subsequent filters, then the
+    `resultHighlighter` function (if set), then the `resultFormatter` function
+    (if set), and finally to subscribers to the `results` event.
+
+    If no `source` is set, result filters will not be called.
+
+    Prepackaged result filters provided by the autocomplete-filters and
+    autocomplete-filters-accentfold modules can be used by specifying the filter
+    name as a string, such as `'phraseMatch'` (assuming the necessary filters
+    module is loaded).
+
+    @attribute resultFilters
+    @type Array
+    @default []
+    **/
+    resultFilters: {
+        setter: '_setResultFilters',
+        value: []
+    },
+
+    /**
+    Function which will be used to format results. If provided, this function
+    will be called with two arguments after results have been received and
+    filtered: the query and an array of result objects. The formatter is
+    expected to return an array of HTML strings or Node instances containing the
+    desired HTML for each result.
+
+    See the documentation for the `results` event for a list of the properties
+    available on each result object.
+
+    If no `source` is set, the formatter will not be called.
+
+    @attribute resultFormatter
+    @type Function|null
+    **/
+    resultFormatter: {
+        validator: _FUNCTION_VALIDATOR,
+        value: null
+    },
+
+    /**
+    Function which will be used to highlight results. If provided, this function
+    will be called with two arguments after results have been received and
+    filtered: the query and an array of filtered result objects. The highlighter
+    is expected to return an array of highlighted result text in the form of
+    HTML strings.
+
+    See the documentation for the `results` event for a list of the properties
+    available on each result object.
+
+    If no `source` is set, the highlighter will not be called.
+
+    @attribute resultHighlighter
+    @type Function|null
+    **/
+    resultHighlighter: {
+        setter: '_setResultHighlighter',
+        value: null
+    },
+
+    /**
+    Locator that should be used to extract an array of results from a non-array
+    response.
+
+    By default, no locator is applied, and all responses are assumed to be
+    arrays by default. If all responses are already arrays, you don't need to
+    define a locator.
+
+    The locator may be either a function (which will receive the raw response as
+    an argument and must return an array) or a string representing an object
+    path, such as "foo.bar.baz" (which would return the value of
+    `result.foo.bar.baz` if the response is an object).
+
+    While `resultListLocator` may be set to either a function or a string, it
+    will always be returned as a function that accepts a response argument and
+    returns an array.
+
+    @attribute resultListLocator
+    @type Function|String|null
+    **/
+    resultListLocator: {
+        setter: '_setLocator',
+        value: null
+    },
+
+    /**
+    Current results, or an empty array if there are no results.
+
+    @attribute results
+    @type Array
+    @default []
+    @readonly
+    **/
+    results: {
+        readOnly: true,
+        value: []
+    },
+
+    /**
+    Locator that should be used to extract a plain text string from a non-string
+    result item. The resulting text value will typically be the value that ends
+    up being inserted into an input field or textarea when the user of an
+    autocomplete implementation selects a result.
+
+    By default, no locator is applied, and all results are assumed to be plain
+    text strings. If all results are already plain text strings, you don't need
+    to define a locator.
+
+    The locator may be either a function (which will receive the raw result as
+    an argument and must return a string) or a string representing an object
+    path, such as "foo.bar.baz" (which would return the value of
+    `result.foo.bar.baz` if the result is an object).
+
+    While `resultTextLocator` may be set to either a function or a string, it
+    will always be returned as a function that accepts a result argument and
+    returns a string.
+
+    @attribute resultTextLocator
+    @type Function|String|null
+    **/
+    resultTextLocator: {
+        setter: '_setLocator',
+        value: null
+    },
+
+    /**
+    Source for autocomplete results. The following source types are supported:
+
+    <dl>
+      <dt>Array</dt>
+      <dd>
+        <p>
+        The full array will be provided to any configured filters for each
+        query. This is an easy way to create a fully client-side autocomplete
+        implementation.
+        </p>
+
+        <p>
+        Example: `['first result', 'second result', 'etc']`
+        </p>
+      </dd>
+
+      <dt>DataSource</dt>
+      <dd>
+        A `DataSource` instance or other object that provides a DataSource-like
+        `sendRequest` method. See the `DataSource` documentation for details.
+      </dd>
+
+      <dt>Function</dt>
+      <dd>
+        <p>
+        A function source will be called with the current query and a
+        callback function as parameters, and should either return an array of
+        results (for synchronous operation) or return nothing and pass an
+        array of results to the provided callback (for asynchronous
+        operation).
+        </p>
+
+        <p>
+        Example (synchronous):
+        </p>
+
+        <pre>
+        function (query) {
+            return ['foo', 'bar'];
+        }
+        </pre>
+
+        <p>
+        Example (async):
+        </p>
+
+        <pre>
+        function (query, callback) {
+            callback(['foo', 'bar']);
+        }
+        </pre>
+      </dd>
+
+      <dt>Object</dt>
+      <dd>
+        <p>
+        An object will be treated as a query hashmap. If a property on the
+        object matches the current query, the value of that property will be
+        used as the response.
+        </p>
+
+        <p>
+        The response is assumed to be an array of results by default. If the
+        response is not an array, provide a `resultListLocator` to
+        process the response and return an array.
+        </p>
+
+        <p>
+        Example: `{foo: ['foo result 1', 'foo result 2'], bar: ['bar result']}`
+        </p>
+      </dd>
+    </dl>
+
+    If the optional `autocomplete-sources` module is loaded, then
+    the following additional source types will be supported as well:
+
+    <dl>
+      <dt>&lt;select&gt; Node</dt>
+      <dd>
+        You may provide a YUI Node instance wrapping a &lt;select&gt;
+        element, and the options in the list will be used as results. You
+        will also need to specify a `resultTextLocator` of 'text'
+        or 'value', depending on what you want to use as the text of the
+        result.
+
+        Each result will be an object with the following properties:
+
+        <dl>
+          <dt>html (String)</dt>
+          <dd>
+            <p>HTML content of the &lt;option&gt; element.</p>
+          </dd>
+
+          <dt>index (Number)</dt>
+          <dd>
+            <p>Index of the &lt;option&gt; element in the list.</p>
+          </dd>
+
+          <dt>node (Y.Node)</dt>
+          <dd>
+            <p>Node instance referring to the original &lt;option&gt; element.</p>
+          </dd>
+
+          <dt>selected (Boolean)</dt>
+          <dd>
+            <p>Whether or not this item is currently selected in the
+            &lt;select&gt; list.</p>
+          </dd>
+
+          <dt>text (String)</dt>
+          <dd>
+            <p>Text content of the &lt;option&gt; element.</p>
+          </dd>
+
+          <dt>value (String)</dt>
+          <dd>
+            <p>Value of the &lt;option&gt; element.</p>
+          </dd>
+        </dl>
+      </dd>
+
+      <dt>String (JSONP URL)</dt>
+      <dd>
+        <p>
+        If a URL with a `{callback}` placeholder is provided, it will be used to
+        make a JSONP request. The `{query}` placeholder will be replaced with
+        the current query, and the `{callback}` placeholder will be replaced
+        with an internally-generated JSONP callback name. Both placeholders must
+        appear in the URL, or the request will fail. An optional `{maxResults}`
+        placeholder may also be provided, and will be replaced with the value of
+        the maxResults attribute (or 1000 if the maxResults attribute is 0 or
+        less).
+        </p>
+
+        <p>
+        The response is assumed to be an array of results by default. If the
+        response is not an array, provide a `resultListLocator` to process the
+        response and return an array.
+        </p>
+
+        <p>
+        <strong>The `jsonp` module must be loaded in order for
+        JSONP URL sources to work.</strong> If the `jsonp` module
+        is not already loaded, it will be loaded on demand if possible.
+        </p>
+
+        <p>
+        Example: `'http://example.com/search?q={query}&callback={callback}'`
+        </p>
+      </dd>
+
+      <dt>String (XHR URL)</dt>
+      <dd>
+        <p>
+        If a URL without a `{callback}` placeholder is provided, it will be used
+        to make a same-origin XHR request. The `{query}` placeholder will be
+        replaced with the current query. An optional `{maxResults}` placeholder
+        may also be provided, and will be replaced with the value of the
+        maxResults attribute (or 1000 if the maxResults attribute is 0 or less).
+        </p>
+
+        <p>
+        The response is assumed to be a JSON array of results by default. If the
+        response is a JSON object and not an array, provide a
+        `resultListLocator` to process the response and return an array. If the
+        response is in some form other than JSON, you will need to use a custom
+        DataSource instance as the source.
+        </p>
+
+        <p>
+        <strong>The `io-base` and `json-parse` modules
+        must be loaded in order for XHR URL sources to work.</strong> If
+        these modules are not already loaded, they will be loaded on demand
+        if possible.
+        </p>
+
+        <p>
+        Example: `'http://example.com/search?q={query}'`
+        </p>
+      </dd>
+
+      <dt>String (YQL query)</dt>
+      <dd>
+        <p>
+        If a YQL query is provided, it will be used to make a YQL request. The
+        `{query}` placeholder will be replaced with the current autocomplete
+        query. This placeholder must appear in the YQL query, or the request
+        will fail. An optional `{maxResults}` placeholder may also be provided,
+        and will be replaced with the value of the maxResults attribute (or 1000
+        if the maxResults attribute is 0 or less).
+        </p>
+
+        <p>
+        <strong>The `yql` module must be loaded in order for YQL
+        sources to work.</strong> If the `yql` module is not
+        already loaded, it will be loaded on demand if possible.
+        </p>
+
+        <p>
+        Example: `'select * from search.suggest where query="{query}"'`
+        </p>
+      </dd>
+    </dl>
+
+    As an alternative to providing a source, you could simply listen for `query`
+    events and handle them any way you see fit. Providing a source is optional,
+    but will usually be simpler.
+
+    @attribute source
+    @type Array|DataSource|Function|Node|Object|String|null
+    **/
+    source: {
+        setter: '_setSource',
+        value: null
+    },
+
+    /**
+    May be used to force a specific source type, overriding the automatic source
+    type detection. It should almost never be necessary to do this, but as they
+    taught us in the Boy Scouts, one should always be prepared, so it's here if
+    you need it. Be warned that if you set this attribute and something breaks,
+    it's your own fault.
+
+    Supported `sourceType` values are: 'array', 'datasource', 'function', and
+    'object'.
+
+    If the `autocomplete-sources` module is loaded, the following additional
+    source types are supported: 'io', 'jsonp', 'select', 'string', 'yql'
+
+    @attribute sourceType
+    @type String
+    **/
+    sourceType: {
+        value: null
+    },
+
+    /**
+    If the `inputNode` specified at instantiation time has a `node-tokeninput`
+    plugin attached to it, this attribute will be a reference to the
+    `Y.Plugin.TokenInput` instance.
+
+    @attribute tokenInput
+    @type Plugin.TokenInput
+    @readonly
+    **/
+    tokenInput: {
+        readOnly: true
+    },
+
+    /**
+    Current value of the input node.
+
+    @attribute value
+    @type String
+    @default ''
+    **/
+    value: {
+        // Why duplicate this._inputNode.get('value')? Because we need a
+        // reliable way to track the source of value changes. We want to perform
+        // completion when the user changes the value, but not when we change
+        // the value.
+        value: ''
+    }
+};
+
+// This tells Y.Base.create() to copy these static properties to any class
+// AutoCompleteBase is mixed into.
+AutoCompleteBase._buildCfg = {
+    aggregates: ['SOURCE_TYPES'],
+    statics   : ['UI_SRC']
+};
+
+/**
+Mapping of built-in source types to their setter functions. DataSource instances
+and DataSource-like objects are handled natively, so are not mapped here.
+
+@property SOURCE_TYPES
+@type {Object}
+@static
+**/
+AutoCompleteBase.SOURCE_TYPES = {
+    array     : '_createArraySource',
+    'function': '_createFunctionSource',
+    object    : '_createObjectSource'
+};
+
+AutoCompleteBase.UI_SRC = (Y.Widget && Y.Widget.UI_SRC) || 'ui';
+
+Y.AutoCompleteBase = AutoCompleteBase;
+
+
+}, '3.5.1' ,{optional:['autocomplete-sources'], requires:['array-extras', 'base-build', 'escape', 'event-valuechange', 'node-base']});

=== added file 'debian/extras/jslibs/yui/autocomplete-base/autocomplete-base-min.js'
--- debian/extras/jslibs/yui/autocomplete-base/autocomplete-base-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-base/autocomplete-base-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,8 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("autocomplete-base",function(f){var g=f.Escape,j=f.Lang,q=f.Array,i=f.Object,d=j.isFunction,r=j.isString,u=j.trim,l=f.Attribute.INVALID_VALUE,o="_functionValidator",x="_sourceSuccess",c="allowBrowserAutocomplete",h="inputNode",w="query",e="queryDelimiter",b="requestTemplate",m="results",n="resultListLocator",k="value",s="valueChange",a="clear",t=w,p=m;function v(){}v.prototype={initializer:function(){f.before(this._bindUIACBase,this,"bindUI");f.before(this._syncUIACBase,this,"syncUI");this.publish(a,{defaultFn:this._defClearFn});this.publish(t,{defaultFn:this._defQueryFn});this.publish(p,{defaultFn:this._defResultsFn});},destructor:function(){this._acBaseEvents&&this._acBaseEvents.detach();delete this._acBaseEvents;delete this._cache;delete this._inputNode;delete this._rawSource;},clearCache:function(){this._cache&&(this._cache={});return this;},sendRequest:function(A,B){var y,z=this.get("source");if(A||A===""){this._set(w,A);}else{A=this.get(w)||"";}if(z){if(!B){B=this.get(b);}y=B?B.call(this,A):A;z.sendRequest({query:A,request:y,callback:{success:f.bind(this._onResponse,this,A)}});}return this;},_bindUIACBase:function(){var z=this.get(h),y=z&&z.tokenInput;if(y){z=y.get(h);this._set("tokenInput",y);}if(!z){f.error("No inputNode specified.");return;}this._inputNode=z;this._acBaseEvents=new f.EventHandle([z.on(s,this._onInputValueChange,this),z.on("blur",this._onInputBlur,this),this.after(c+"Change",this._syncBrowserAutocomplete),this.after("sourceTypeChange",this._afterSourceTypeChange),this.after(s,this._afterValueChange)]);},_syncUIACBase:function(){this._syncBrowserAutocomplete();this.set(k,this.get(h).get(k));},_createArraySource:function(z){var y=this;return{type:"array",sendRequest:function(A){y[x](z.concat(),A);}};},_createFunctionSource:function(z){var y=this;return{type:"function",sendRequest:function(A){var B;function C(D){y[x](D||[],A);}if((B=z(A.query,C))){C(B);}}};},_createObjectSource:function(z){var y=this;return{type:"object",sendRequest:function(A){var B=A.query;y[x](i.owns(z,B)?z[B]:[],A);}};},_functionValidator:function(y){return y===null||d(y);},_getObjectValue:function(B,A){if(!B){return;}for(var z=0,y=A.length;B&&z<y;z++){B=B[A[z]];}return B;},_parseResponse:function(A,y,P){var G={data:P,query:A,results:[]},I=this.get(n),H=[],F=y&&y.results,C,z,J,B,O,K,L,M,D,E,N;if(F&&I){F=I.call(this,F);}if(F&&F.length){C=this.get("resultFilters");N=this.get("resultTextLocator");for(K=0,L=F.length;K<L;++K){D=F[K];E=N?N.call(this,D):D.toString();H.push({display:g.html(E),raw:D,text:E});}for(K=0,L=C.length;K<L;++K){H=C[K].call(this,A,H.concat());if(!H){return;}if(!H.length){break;}}if(H.length){J=this.get("resultFormatter");O=this.get("resultHighlighter");M=this.get("maxResults");if(M&&M>0&&H.length>M){H.length=M;}if(O){B=O.call(this,A,H.concat());if(!B){return;}for(K=0,L=B.length;K<L;++K){D=H[K];D.highlighted=B[K];D.display=D.highlighted;}}if(J){z=J.call(this,A,H.concat());if(!z){return;}for(K=0,L=z.length;K<L;++K){H[K].display=z[K];}}}}G.results=H;this.fire(p,G);},_parseValue:function(y){var z=this.get(e);if(z){y=y.split(z);y=y[y.length-1];}return j.trimLeft(y);},_setEnableCache:function(y){this._cache=y?{}:null;},_setLocator:function(y){if(this[o](y)){return y;}var z=this;y=y.toString().split(".");return function(A){return A&&z._getObjectValue(A,y);};},_setRequestTemplate:function(y){if(this[o](y)){return y;}y=y.toString();return function(z){return j.sub(y,{query:encodeURIComponent(z)});};},_setResultFilters:function(A){var y,z;if(A===null){return[];}y=f.AutoCompleteFilters;z=function(B){if(d(B)){return B;}if(r(B)&&y&&d(y[B])){return y[B];}return false;};if(j.isArray(A)){A=q.map(A,z);return q.every(A,function(B){return !!B;})?A:l;}else{A=z(A);return A?[A]:l;}},_setResultHighlighter:function(y){var z;if(this[o](y)){return y;}z=f.AutoCompleteHighlighters;if(r(y)&&z&&d(z[y])){return z[y];}return l;},_setSource:function(A){var y=this.get("sourceType")||j.type(A),z;if((A&&d(A.sendRequest))||A===null||y==="datasource"){this._rawSource=A;return A;}if((z=v.SOURCE_TYPES[y])){this._rawSource=A;return j.isString(z)?this[z](A):z(A);}f.error("Unsupported source type '"+y+"'. Maybe autocomplete-sources isn't loaded?");return l;},_sourceSuccess:function(z,y){y.callback.success({data:z,response:{results:z}});},_syncBrowserAutocomplete:function(){var y=this.get(h);if(y.get("nodeName").toLowerCase()==="input"){y.setAttribute("autocomplete",this.get(c)?"on":"off");}},_updateValue:function(z){var B=this.get(e),A,y,C;z=j.trimLeft(z);if(B){A=u(B);C=q.map(u(this.get(k)).split(B),u);y=C.length;if(y>1){C[y-1]=z;z=C.join(A+" ");}z=z+A+" ";}this.set(k,z);},_afterSourceTypeChange:function(y){if(this._rawSource){this.set("source",this._rawSource);}},_afterValueChange:function(F){var B=F.newVal,z=this,E=F.src===v.UI_SRC,A,C,y,D;if(!E){z._inputNode.set(k,B);}y=z.get("minQueryLength");D=z._parseValue(B)||"";if(y>=0&&D.length>=y){if(E){A=z.get("queryDelay");C=function(){z.fire(t,{inputValue:B,query:D,src:F.src});};if(A){clearTimeout(z._delay);z._delay=setTimeout(C,A);}else{C();}}else{z._set(w,D);}}else{clearTimeout(z._delay);z.fire(a,{prevVal:F.prevVal?z._parseValue(F.prevVal):null,src:F.src});}},_onInputBlur:function(B){var C=this.get(e),y,z,A;if(C&&!this.get("allowTrailingDelimiter")){C=j.trimRight(C);A=z=this._inputNode.get(k);if(C){while((z=j.trimRight(z))&&(y=z.length-C.length)&&z.lastIndexOf(C)===y){z=z.substring(0,y);}}else{z=j.trimRight(z);}if(z!==A){this.set(k,z);}}},_onInputValueChange:function(z){var y=z.newVal;if(y!==this.get(k)){this.set(k,y,{src:v.UI_SRC});}},_onResponse:function(y,z){if(y===(this.get(w)||"")){this._parseResponse(y||"",z.response,z.data);}},_defClearFn:function(){this._set(w,null);this._set(m,[]);},_defQueryFn:function(y){this.sendRequest(y.query);},_defResultsFn:function(y){this._set(m,y[m]);}};v.ATTRS={allowBrowserAutocomplete:{value:false},allowTrailingDelimiter:{value:false},enableCache:{lazyAdd:false,setter:"_setEnableCache",value:true},inputNode:{setter:f.one,writeOnce:"initOnly"},maxResults:{value:0},minQueryLength:{value:1},query:{readOnly:true,value:null},queryDelay:{value:100},queryDelimiter:{value:null},requestTemplate:{setter:"_setRequestTemplate",value:null},resultFilters:{setter:"_setResultFilters",value:[]},resultFormatter:{validator:o,value:null},resultHighlighter:{setter:"_setResultHighlighter",value:null},resultListLocator:{setter:"_setLocator",value:null},results:{readOnly:true,value:[]},resultTextLocator:{setter:"_setLocator",value:null},source:{setter:"_setSource",value:null},sourceType:{value:null},tokenInput:{readOnly:true},value:{value:""}};
+v._buildCfg={aggregates:["SOURCE_TYPES"],statics:["UI_SRC"]};v.SOURCE_TYPES={array:"_createArraySource","function":"_createFunctionSource",object:"_createObjectSource"};v.UI_SRC=(f.Widget&&f.Widget.UI_SRC)||"ui";f.AutoCompleteBase=v;},"3.5.1",{optional:["autocomplete-sources"],requires:["array-extras","base-build","escape","event-valuechange","node-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/autocomplete-base/autocomplete-base.js'
--- debian/extras/jslibs/yui/autocomplete-base/autocomplete-base.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-base/autocomplete-base.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,1544 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-base', function(Y) {
+
+/**
+Provides automatic input completion or suggestions for text input fields and
+textareas.
+
+@module autocomplete
+@main autocomplete
+@since 3.3.0
+**/
+
+/**
+`Y.Base` extension that provides core autocomplete logic (but no UI
+implementation) for a text input field or textarea. Must be mixed into a
+`Y.Base`-derived class to be useful.
+
+@module autocomplete
+@submodule autocomplete-base
+**/
+
+/**
+Extension that provides core autocomplete logic (but no UI implementation) for a
+text input field or textarea.
+
+The `AutoCompleteBase` class provides events and attributes that abstract away
+core autocomplete logic and configuration, but does not provide a widget
+implementation or suggestion UI. For a prepackaged autocomplete widget, see
+`AutoCompleteList`.
+
+This extension cannot be instantiated directly, since it doesn't provide an
+actual implementation. It's intended to be mixed into a `Y.Base`-based class or
+widget.
+
+`Y.Widget`-based example:
+
+    YUI().use('autocomplete-base', 'widget', function (Y) {
+        var MyAC = Y.Base.create('myAC', Y.Widget, [Y.AutoCompleteBase], {
+            // Custom prototype methods and properties.
+        }, {
+            // Custom static methods and properties.
+        });
+
+        // Custom implementation code.
+    });
+
+`Y.Base`-based example:
+
+    YUI().use('autocomplete-base', function (Y) {
+        var MyAC = Y.Base.create('myAC', Y.Base, [Y.AutoCompleteBase], {
+            initializer: function () {
+                this._bindUIACBase();
+                this._syncUIACBase();
+            },
+
+            // Custom prototype methods and properties.
+        }, {
+            // Custom static methods and properties.
+        });
+
+        // Custom implementation code.
+    });
+
+@class AutoCompleteBase
+**/
+
+var Escape  = Y.Escape,
+    Lang    = Y.Lang,
+    YArray  = Y.Array,
+    YObject = Y.Object,
+
+    isFunction = Lang.isFunction,
+    isString   = Lang.isString,
+    trim       = Lang.trim,
+
+    INVALID_VALUE = Y.Attribute.INVALID_VALUE,
+
+    _FUNCTION_VALIDATOR = '_functionValidator',
+    _SOURCE_SUCCESS     = '_sourceSuccess',
+
+    ALLOW_BROWSER_AC    = 'allowBrowserAutocomplete',
+    INPUT_NODE          = 'inputNode',
+    QUERY               = 'query',
+    QUERY_DELIMITER     = 'queryDelimiter',
+    REQUEST_TEMPLATE    = 'requestTemplate',
+    RESULTS             = 'results',
+    RESULT_LIST_LOCATOR = 'resultListLocator',
+    VALUE               = 'value',
+    VALUE_CHANGE        = 'valueChange',
+
+    EVT_CLEAR   = 'clear',
+    EVT_QUERY   = QUERY,
+    EVT_RESULTS = RESULTS;
+
+function AutoCompleteBase() {}
+
+AutoCompleteBase.prototype = {
+    // -- Lifecycle Methods ----------------------------------------------------
+    initializer: function () {
+        // AOP bindings.
+        Y.before(this._bindUIACBase, this, 'bindUI');
+        Y.before(this._syncUIACBase, this, 'syncUI');
+
+        // -- Public Events ----------------------------------------------------
+
+        /**
+        Fires after the query has been completely cleared or no longer meets the
+        minimum query length requirement.
+
+        @event clear
+        @param {String} prevVal Value of the query before it was cleared.
+        @param {String} src Source of the event.
+        @preventable _defClearFn
+        **/
+        this.publish(EVT_CLEAR, {
+            defaultFn: this._defClearFn
+        });
+
+        /**
+        Fires when the contents of the input field have changed and the input
+        value meets the criteria necessary to generate an autocomplete query.
+
+        @event query
+        @param {String} inputValue Full contents of the text input field or
+            textarea that generated the query.
+        @param {String} query AutoComplete query. This is the string that will
+            be used to request completion results. It may or may not be the same
+            as `inputValue`.
+        @param {String} src Source of the event.
+        @preventable _defQueryFn
+        **/
+        this.publish(EVT_QUERY, {
+            defaultFn: this._defQueryFn
+        });
+
+        /**
+        Fires after query results are received from the source. If no source has
+        been set, this event will not fire.
+
+        @event results
+        @param {Array|Object} data Raw, unfiltered result data (if available).
+        @param {String} query Query that generated these results.
+        @param {Object[]} results Array of filtered, formatted, and highlighted
+            results. Each item in the array is an object with the following
+            properties:
+
+            @param {Node|HTMLElement|String} results.display Formatted result
+                HTML suitable for display to the user. If no custom formatter is
+                set, this will be an HTML-escaped version of the string in the
+                `text` property.
+            @param {String} [results.highlighted] Highlighted (but not
+                formatted) result text. This property will only be set if a
+                highlighter is in use.
+            @param {Any} results.raw Raw, unformatted result in whatever form it
+                was provided by the source.
+            @param {String} results.text Plain text version of the result,
+                suitable for being inserted into the value of a text input field
+                or textarea when the result is selected by a user. This value is
+                not HTML-escaped and should not be inserted into the page using
+                `innerHTML` or `Node#setContent()`.
+
+        @preventable _defResultsFn
+        **/
+        this.publish(EVT_RESULTS, {
+            defaultFn: this._defResultsFn
+        });
+    },
+
+    destructor: function () {
+        this._acBaseEvents && this._acBaseEvents.detach();
+
+        delete this._acBaseEvents;
+        delete this._cache;
+        delete this._inputNode;
+        delete this._rawSource;
+    },
+
+    // -- Public Prototype Methods ---------------------------------------------
+
+    /**
+    Clears the result cache.
+
+    @method clearCache
+    @chainable
+    @since 3.5.0
+    **/
+    clearCache: function () {
+        this._cache && (this._cache = {});
+        return this;
+    },
+
+    /**
+    Sends a request to the configured source. If no source is configured, this
+    method won't do anything.
+
+    Usually there's no reason to call this method manually; it will be called
+    automatically when user input causes a `query` event to be fired. The only
+    time you'll need to call this method manually is if you want to force a
+    request to be sent when no user input has occurred.
+
+    @method sendRequest
+    @param {String} [query] Query to send. If specified, the `query` attribute
+        will be set to this query. If not specified, the current value of the
+        `query` attribute will be used.
+    @param {Function} [requestTemplate] Request template function. If not
+        specified, the current value of the `requestTemplate` attribute will be
+        used.
+    @chainable
+    **/
+    sendRequest: function (query, requestTemplate) {
+        var request,
+            source = this.get('source');
+
+        if (query || query === '') {
+            this._set(QUERY, query);
+        } else {
+            query = this.get(QUERY) || '';
+        }
+
+        if (source) {
+            if (!requestTemplate) {
+                requestTemplate = this.get(REQUEST_TEMPLATE);
+            }
+
+            request = requestTemplate ?
+                requestTemplate.call(this, query) : query;
+
+
+            source.sendRequest({
+                query  : query,
+                request: request,
+
+                callback: {
+                    success: Y.bind(this._onResponse, this, query)
+                }
+            });
+        }
+
+        return this;
+    },
+
+    // -- Protected Lifecycle Methods ------------------------------------------
+
+    /**
+    Attaches event listeners and behaviors.
+
+    @method _bindUIACBase
+    @protected
+    **/
+    _bindUIACBase: function () {
+        var inputNode  = this.get(INPUT_NODE),
+            tokenInput = inputNode && inputNode.tokenInput;
+
+        // If the inputNode has a node-tokeninput plugin attached, bind to the
+        // plugin's inputNode instead.
+        if (tokenInput) {
+            inputNode = tokenInput.get(INPUT_NODE);
+            this._set('tokenInput', tokenInput);
+        }
+
+        if (!inputNode) {
+            Y.error('No inputNode specified.');
+            return;
+        }
+
+        this._inputNode = inputNode;
+
+        this._acBaseEvents = new Y.EventHandle([
+            // This is the valueChange event on the inputNode, provided by the
+            // event-valuechange module, not our own valueChange.
+            inputNode.on(VALUE_CHANGE, this._onInputValueChange, this),
+            inputNode.on('blur', this._onInputBlur, this),
+
+            this.after(ALLOW_BROWSER_AC + 'Change', this._syncBrowserAutocomplete),
+            this.after('sourceTypeChange', this._afterSourceTypeChange),
+            this.after(VALUE_CHANGE, this._afterValueChange)
+        ]);
+    },
+
+    /**
+    Synchronizes the UI state of the `inputNode`.
+
+    @method _syncUIACBase
+    @protected
+    **/
+    _syncUIACBase: function () {
+        this._syncBrowserAutocomplete();
+        this.set(VALUE, this.get(INPUT_NODE).get(VALUE));
+    },
+
+    // -- Protected Prototype Methods ------------------------------------------
+
+    /**
+    Creates a DataSource-like object that simply returns the specified array as
+    a response. See the `source` attribute for more details.
+
+    @method _createArraySource
+    @param {Array} source
+    @return {Object} DataSource-like object.
+    @protected
+    **/
+    _createArraySource: function (source) {
+        var that = this;
+
+        return {
+            type: 'array',
+            sendRequest: function (request) {
+                that[_SOURCE_SUCCESS](source.concat(), request);
+            }
+        };
+    },
+
+    /**
+    Creates a DataSource-like object that passes the query to a custom-defined
+    function, which is expected to call the provided callback with an array of
+    results. See the `source` attribute for more details.
+
+    @method _createFunctionSource
+    @param {Function} source Function that accepts a query and a callback as
+      parameters, and calls the callback with an array of results.
+    @return {Object} DataSource-like object.
+    @protected
+    **/
+    _createFunctionSource: function (source) {
+        var that = this;
+
+        return {
+            type: 'function',
+            sendRequest: function (request) {
+                var value;
+
+                function afterResults(results) {
+                    that[_SOURCE_SUCCESS](results || [], request);
+                }
+
+                // Allow both synchronous and asynchronous functions. If we get
+                // a truthy return value, assume the function is synchronous.
+                if ((value = source(request.query, afterResults))) {
+                    afterResults(value);
+                }
+            }
+        };
+    },
+
+    /**
+    Creates a DataSource-like object that looks up queries as properties on the
+    specified object, and returns the found value (if any) as a response. See
+    the `source` attribute for more details.
+
+    @method _createObjectSource
+    @param {Object} source
+    @return {Object} DataSource-like object.
+    @protected
+    **/
+    _createObjectSource: function (source) {
+        var that = this;
+
+        return {
+            type: 'object',
+            sendRequest: function (request) {
+                var query = request.query;
+
+                that[_SOURCE_SUCCESS](
+                    YObject.owns(source, query) ? source[query] : [],
+                    request
+                );
+            }
+        };
+    },
+
+    /**
+    Returns `true` if _value_ is either a function or `null`.
+
+    @method _functionValidator
+    @param {Function|null} value Value to validate.
+    @protected
+    **/
+    _functionValidator: function (value) {
+        return value === null || isFunction(value);
+    },
+
+    /**
+    Faster and safer alternative to `Y.Object.getValue()`. Doesn't bother
+    casting the path to an array (since we already know it's an array) and
+    doesn't throw an error if a value in the middle of the object hierarchy is
+    neither `undefined` nor an object.
+
+    @method _getObjectValue
+    @param {Object} obj
+    @param {Array} path
+    @return {Any} Located value, or `undefined` if the value was
+        not found at the specified path.
+    @protected
+    **/
+    _getObjectValue: function (obj, path) {
+        if (!obj) {
+            return;
+        }
+
+        for (var i = 0, len = path.length; obj && i < len; i++) {
+            obj = obj[path[i]];
+        }
+
+        return obj;
+    },
+
+    /**
+    Parses result responses, performs filtering and highlighting, and fires the
+    `results` event.
+
+    @method _parseResponse
+    @param {String} query Query that generated these results.
+    @param {Object} response Response containing results.
+    @param {Object} data Raw response data.
+    @protected
+    **/
+    _parseResponse: function (query, response, data) {
+        var facade = {
+                data   : data,
+                query  : query,
+                results: []
+            },
+
+            listLocator = this.get(RESULT_LIST_LOCATOR),
+            results     = [],
+            unfiltered  = response && response.results,
+
+            filters,
+            formatted,
+            formatter,
+            highlighted,
+            highlighter,
+            i,
+            len,
+            maxResults,
+            result,
+            text,
+            textLocator;
+
+        if (unfiltered && listLocator) {
+            unfiltered = listLocator.call(this, unfiltered);
+        }
+
+        if (unfiltered && unfiltered.length) {
+            filters     = this.get('resultFilters');
+            textLocator = this.get('resultTextLocator');
+
+            // Create a lightweight result object for each result to make them
+            // easier to work with. The various properties on the object
+            // represent different formats of the result, and will be populated
+            // as we go.
+            for (i = 0, len = unfiltered.length; i < len; ++i) {
+                result = unfiltered[i];
+
+                text = textLocator ?
+                        textLocator.call(this, result) :
+                        result.toString();
+
+                results.push({
+                    display: Escape.html(text),
+                    raw    : result,
+                    text   : text
+                });
+            }
+
+            // Run the results through all configured result filters. Each
+            // filter returns an array of (potentially fewer) result objects,
+            // which is then passed to the next filter, and so on.
+            for (i = 0, len = filters.length; i < len; ++i) {
+                results = filters[i].call(this, query, results.concat());
+
+                if (!results) {
+                    return;
+                }
+
+                if (!results.length) {
+                    break;
+                }
+            }
+
+            if (results.length) {
+                formatter   = this.get('resultFormatter');
+                highlighter = this.get('resultHighlighter');
+                maxResults  = this.get('maxResults');
+
+                // If maxResults is set and greater than 0, limit the number of
+                // results.
+                if (maxResults && maxResults > 0 &&
+                        results.length > maxResults) {
+                    results.length = maxResults;
+                }
+
+                // Run the results through the configured highlighter (if any).
+                // The highlighter returns an array of highlighted strings (not
+                // an array of result objects), and these strings are then added
+                // to each result object.
+                if (highlighter) {
+                    highlighted = highlighter.call(this, query,
+                            results.concat());
+
+                    if (!highlighted) {
+                        return;
+                    }
+
+                    for (i = 0, len = highlighted.length; i < len; ++i) {
+                        result = results[i];
+                        result.highlighted = highlighted[i];
+                        result.display     = result.highlighted;
+                    }
+                }
+
+                // Run the results through the configured formatter (if any) to
+                // produce the final formatted results. The formatter returns an
+                // array of strings or Node instances (not an array of result
+                // objects), and these strings/Nodes are then added to each
+                // result object.
+                if (formatter) {
+                    formatted = formatter.call(this, query, results.concat());
+
+                    if (!formatted) {
+                        return;
+                    }
+
+                    for (i = 0, len = formatted.length; i < len; ++i) {
+                        results[i].display = formatted[i];
+                    }
+                }
+            }
+        }
+
+        facade.results = results;
+        this.fire(EVT_RESULTS, facade);
+    },
+
+    /**
+    Returns the query portion of the specified input value, or `null` if there
+    is no suitable query within the input value.
+
+    If a query delimiter is defined, the query will be the last delimited part
+    of of the string.
+
+    @method _parseValue
+    @param {String} value Input value from which to extract the query.
+    @return {String|null} query
+    @protected
+    **/
+    _parseValue: function (value) {
+        var delim = this.get(QUERY_DELIMITER);
+
+        if (delim) {
+            value = value.split(delim);
+            value = value[value.length - 1];
+        }
+
+        return Lang.trimLeft(value);
+    },
+
+    /**
+    Setter for the `enableCache` attribute.
+
+    @method _setEnableCache
+    @param {Boolean} value
+    @protected
+    @since 3.5.0
+    **/
+    _setEnableCache: function (value) {
+        // When `this._cache` is an object, result sources will store cached
+        // results in it. When it's falsy, they won't. This way result sources
+        // don't need to get the value of the `enableCache` attribute on every
+        // request, which would be sloooow.
+        this._cache = value ? {} : null;
+    },
+
+    /**
+    Setter for locator attributes.
+
+    @method _setLocator
+    @param {Function|String|null} locator
+    @return {Function|null}
+    @protected
+    **/
+    _setLocator: function (locator) {
+        if (this[_FUNCTION_VALIDATOR](locator)) {
+            return locator;
+        }
+
+        var that = this;
+
+        locator = locator.toString().split('.');
+
+        return function (result) {
+            return result && that._getObjectValue(result, locator);
+        };
+    },
+
+    /**
+    Setter for the `requestTemplate` attribute.
+
+    @method _setRequestTemplate
+    @param {Function|String|null} template
+    @return {Function|null}
+    @protected
+    **/
+    _setRequestTemplate: function (template) {
+        if (this[_FUNCTION_VALIDATOR](template)) {
+            return template;
+        }
+
+        template = template.toString();
+
+        return function (query) {
+            return Lang.sub(template, {query: encodeURIComponent(query)});
+        };
+    },
+
+    /**
+    Setter for the `resultFilters` attribute.
+
+    @method _setResultFilters
+    @param {Array|Function|String|null} filters `null`, a filter
+        function, an array of filter functions, or a string or array of strings
+        representing the names of methods on `Y.AutoCompleteFilters`.
+    @return {Function[]} Array of filter functions (empty if <i>filters</i> is
+        `null`).
+    @protected
+    **/
+    _setResultFilters: function (filters) {
+        var acFilters, getFilterFunction;
+
+        if (filters === null) {
+            return [];
+        }
+
+        acFilters = Y.AutoCompleteFilters;
+
+        getFilterFunction = function (filter) {
+            if (isFunction(filter)) {
+                return filter;
+            }
+
+            if (isString(filter) && acFilters &&
+                    isFunction(acFilters[filter])) {
+                return acFilters[filter];
+            }
+
+            return false;
+        };
+
+        if (Lang.isArray(filters)) {
+            filters = YArray.map(filters, getFilterFunction);
+            return YArray.every(filters, function (f) { return !!f; }) ?
+                    filters : INVALID_VALUE;
+        } else {
+            filters = getFilterFunction(filters);
+            return filters ? [filters] : INVALID_VALUE;
+        }
+    },
+
+    /**
+    Setter for the `resultHighlighter` attribute.
+
+    @method _setResultHighlighter
+    @param {Function|String|null} highlighter `null`, a highlighter function, or
+        a string representing the name of a method on
+        `Y.AutoCompleteHighlighters`.
+    @return {Function|null}
+    @protected
+    **/
+    _setResultHighlighter: function (highlighter) {
+        var acHighlighters;
+
+        if (this[_FUNCTION_VALIDATOR](highlighter)) {
+            return highlighter;
+        }
+
+        acHighlighters = Y.AutoCompleteHighlighters;
+
+        if (isString(highlighter) && acHighlighters &&
+                isFunction(acHighlighters[highlighter])) {
+            return acHighlighters[highlighter];
+        }
+
+        return INVALID_VALUE;
+    },
+
+    /**
+    Setter for the `source` attribute. Returns a DataSource or a DataSource-like
+    object depending on the type of _source_ and/or the value of the
+    `sourceType` attribute.
+
+    @method _setSource
+    @param {Any} source AutoComplete source. See the `source` attribute for
+        details.
+    @return {DataSource|Object}
+    @protected
+    **/
+    _setSource: function (source) {
+        var sourceType = this.get('sourceType') || Lang.type(source),
+            sourceSetter;
+
+        if ((source && isFunction(source.sendRequest))
+                || source === null
+                || sourceType === 'datasource') {
+
+            // Quacks like a DataSource instance (or null). Make it so!
+            this._rawSource = source;
+            return source;
+        }
+
+        // See if there's a registered setter for this source type.
+        if ((sourceSetter = AutoCompleteBase.SOURCE_TYPES[sourceType])) {
+            this._rawSource = source;
+            return Lang.isString(sourceSetter) ?
+                    this[sourceSetter](source) : sourceSetter(source);
+        }
+
+        Y.error("Unsupported source type '" + sourceType + "'. Maybe autocomplete-sources isn't loaded?");
+        return INVALID_VALUE;
+    },
+
+    /**
+    Shared success callback for non-DataSource sources.
+
+    @method _sourceSuccess
+    @param {Any} data Response data.
+    @param {Object} request Request object.
+    @protected
+    **/
+    _sourceSuccess: function (data, request) {
+        request.callback.success({
+            data: data,
+            response: {results: data}
+        });
+    },
+
+    /**
+    Synchronizes the UI state of the `allowBrowserAutocomplete` attribute.
+
+    @method _syncBrowserAutocomplete
+    @protected
+    **/
+    _syncBrowserAutocomplete: function () {
+        var inputNode = this.get(INPUT_NODE);
+
+        if (inputNode.get('nodeName').toLowerCase() === 'input') {
+            inputNode.setAttribute('autocomplete',
+                    this.get(ALLOW_BROWSER_AC) ? 'on' : 'off');
+        }
+    },
+
+    /**
+    Updates the query portion of the `value` attribute.
+
+    If a query delimiter is defined, the last delimited portion of the input
+    value will be replaced with the specified _value_.
+
+    @method _updateValue
+    @param {String} newVal New value.
+    @protected
+    **/
+    _updateValue: function (newVal) {
+        var delim = this.get(QUERY_DELIMITER),
+            insertDelim,
+            len,
+            prevVal;
+
+        newVal = Lang.trimLeft(newVal);
+
+        if (delim) {
+            insertDelim = trim(delim); // so we don't double up on spaces
+            prevVal     = YArray.map(trim(this.get(VALUE)).split(delim), trim);
+            len         = prevVal.length;
+
+            if (len > 1) {
+                prevVal[len - 1] = newVal;
+                newVal = prevVal.join(insertDelim + ' ');
+            }
+
+            newVal = newVal + insertDelim + ' ';
+        }
+
+        this.set(VALUE, newVal);
+    },
+
+    // -- Protected Event Handlers ---------------------------------------------
+
+    /**
+    Updates the current `source` based on the new `sourceType` to ensure that
+    the two attributes don't get out of sync when they're changed separately.
+
+    @method _afterSourceTypeChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterSourceTypeChange: function (e) {
+        if (this._rawSource) {
+            this.set('source', this._rawSource);
+        }
+    },
+
+    /**
+    Handles change events for the `value` attribute.
+
+    @method _afterValueChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterValueChange: function (e) {
+        var newVal   = e.newVal,
+            self     = this,
+            uiChange = e.src === AutoCompleteBase.UI_SRC,
+            delay, fire, minQueryLength, query;
+
+        // Update the UI if the value was changed programmatically.
+        if (!uiChange) {
+            self._inputNode.set(VALUE, newVal);
+        }
+
+
+        minQueryLength = self.get('minQueryLength');
+        query          = self._parseValue(newVal) || '';
+
+        if (minQueryLength >= 0 && query.length >= minQueryLength) {
+            // Only query on changes that originate from the UI.
+            if (uiChange) {
+                delay = self.get('queryDelay');
+
+                fire = function () {
+                    self.fire(EVT_QUERY, {
+                        inputValue: newVal,
+                        query     : query,
+                        src       : e.src
+                    });
+                };
+
+                if (delay) {
+                    clearTimeout(self._delay);
+                    self._delay = setTimeout(fire, delay);
+                } else {
+                    fire();
+                }
+            } else {
+                // For programmatic value changes, just update the query
+                // attribute without sending a query.
+                self._set(QUERY, query);
+            }
+        } else {
+            clearTimeout(self._delay);
+
+            self.fire(EVT_CLEAR, {
+                prevVal: e.prevVal ? self._parseValue(e.prevVal) : null,
+                src    : e.src
+            });
+        }
+    },
+
+    /**
+    Handles `blur` events on the input node.
+
+    @method _onInputBlur
+    @param {EventFacade} e
+    @protected
+    **/
+    _onInputBlur: function (e) {
+        var delim = this.get(QUERY_DELIMITER),
+            delimPos,
+            newVal,
+            value;
+
+        // If a query delimiter is set and the input's value contains one or
+        // more trailing delimiters, strip them.
+        if (delim && !this.get('allowTrailingDelimiter')) {
+            delim = Lang.trimRight(delim);
+            value = newVal = this._inputNode.get(VALUE);
+
+            if (delim) {
+                while ((newVal = Lang.trimRight(newVal)) &&
+                        (delimPos = newVal.length - delim.length) &&
+                        newVal.lastIndexOf(delim) === delimPos) {
+
+                    newVal = newVal.substring(0, delimPos);
+                }
+            } else {
+                // Delimiter is one or more space characters, so just trim the
+                // value.
+                newVal = Lang.trimRight(newVal);
+            }
+
+            if (newVal !== value) {
+                this.set(VALUE, newVal);
+            }
+        }
+    },
+
+    /**
+    Handles `valueChange` events on the input node and fires a `query` event
+    when the input value meets the configured criteria.
+
+    @method _onInputValueChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _onInputValueChange: function (e) {
+        var newVal = e.newVal;
+
+        // Don't query if the internal value is the same as the new value
+        // reported by valueChange.
+        if (newVal !== this.get(VALUE)) {
+            this.set(VALUE, newVal, {src: AutoCompleteBase.UI_SRC});
+        }
+    },
+
+    /**
+    Handles source responses and fires the `results` event.
+
+    @method _onResponse
+    @param {EventFacade} e
+    @protected
+    **/
+    _onResponse: function (query, e) {
+        // Ignore stale responses that aren't for the current query.
+        if (query === (this.get(QUERY) || '')) {
+            this._parseResponse(query || '', e.response, e.data);
+        }
+    },
+
+    // -- Protected Default Event Handlers -------------------------------------
+
+    /**
+    Default `clear` event handler. Sets the `results` attribute to an empty
+    array and `query` to null.
+
+    @method _defClearFn
+    @protected
+    **/
+    _defClearFn: function () {
+        this._set(QUERY, null);
+        this._set(RESULTS, []);
+    },
+
+    /**
+    Default `query` event handler. Sets the `query` attribute and sends a
+    request to the source if one is configured.
+
+    @method _defQueryFn
+    @param {EventFacade} e
+    @protected
+    **/
+    _defQueryFn: function (e) {
+        this.sendRequest(e.query); // sendRequest will set the 'query' attribute
+    },
+
+    /**
+    Default `results` event handler. Sets the `results` attribute to the latest
+    results.
+
+    @method _defResultsFn
+    @param {EventFacade} e
+    @protected
+    **/
+    _defResultsFn: function (e) {
+        this._set(RESULTS, e[RESULTS]);
+    }
+};
+
+AutoCompleteBase.ATTRS = {
+    /**
+    Whether or not to enable the browser's built-in autocomplete functionality
+    for input fields.
+
+    @attribute allowBrowserAutocomplete
+    @type Boolean
+    @default false
+    **/
+    allowBrowserAutocomplete: {
+        value: false
+    },
+
+    /**
+    When a `queryDelimiter` is set, trailing delimiters will automatically be
+    stripped from the input value by default when the input node loses focus.
+    Set this to `true` to allow trailing delimiters.
+
+    @attribute allowTrailingDelimiter
+    @type Boolean
+    @default false
+    **/
+    allowTrailingDelimiter: {
+        value: false
+    },
+
+    /**
+    Whether or not to enable in-memory caching in result sources that support
+    it.
+
+    @attribute enableCache
+    @type Boolean
+    @default true
+    @since 3.5.0
+    **/
+    enableCache: {
+        lazyAdd: false, // we need the setter to run on init
+        setter: '_setEnableCache',
+        value: true
+    },
+
+    /**
+    Node to monitor for changes, which will generate `query` events when
+    appropriate. May be either an `<input>` or a `<textarea>`.
+
+    @attribute inputNode
+    @type Node|HTMLElement|String
+    @initOnly
+    **/
+    inputNode: {
+        setter: Y.one,
+        writeOnce: 'initOnly'
+    },
+
+    /**
+    Maximum number of results to return. A value of `0` or less will allow an
+    unlimited number of results.
+
+    @attribute maxResults
+    @type Number
+    @default 0
+    **/
+    maxResults: {
+        value: 0
+    },
+
+    /**
+    Minimum number of characters that must be entered before a `query` event
+    will be fired. A value of `0` allows empty queries; a negative value will
+    effectively disable all `query` events.
+
+    @attribute minQueryLength
+    @type Number
+    @default 1
+    **/
+    minQueryLength: {
+        value: 1
+    },
+
+    /**
+    Current query, or `null` if there is no current query.
+
+    The query might not be the same as the current value of the input node, both
+    for timing reasons (due to `queryDelay`) and because when one or more
+    `queryDelimiter` separators are in use, only the last portion of the
+    delimited input string will be used as the query value.
+
+    @attribute query
+    @type String|null
+    @default null
+    @readonly
+    **/
+    query: {
+        readOnly: true,
+        value: null
+    },
+
+    /**
+    Number of milliseconds to delay after input before triggering a `query`
+    event. If new input occurs before this delay is over, the previous input
+    event will be ignored and a new delay will begin.
+
+    This can be useful both to throttle queries to a remote data source and to
+    avoid distracting the user by showing them less relevant results before
+    they've paused their typing.
+
+    @attribute queryDelay
+    @type Number
+    @default 100
+    **/
+    queryDelay: {
+        value: 100
+    },
+
+    /**
+    Query delimiter string. When a delimiter is configured, the input value
+    will be split on the delimiter, and only the last portion will be used in
+    autocomplete queries and updated when the `query` attribute is
+    modified.
+
+    @attribute queryDelimiter
+    @type String|null
+    @default null
+    **/
+    queryDelimiter: {
+        value: null
+    },
+
+    /**
+    Source request template. This can be a function that accepts a query as a
+    parameter and returns a request string, or it can be a string containing the
+    placeholder "{query}", which will be replaced with the actual URI-encoded
+    query. In either case, the resulting string will be appended to the request
+    URL when the `source` attribute is set to a remote DataSource, JSONP URL, or
+    XHR URL (it will not be appended to YQL URLs).
+
+    While `requestTemplate` may be set to either a function or a string, it will
+    always be returned as a function that accepts a query argument and returns a
+    string.
+
+    @attribute requestTemplate
+    @type Function|String|null
+    @default null
+    **/
+    requestTemplate: {
+        setter: '_setRequestTemplate',
+        value: null
+    },
+
+    /**
+    Array of local result filter functions. If provided, each filter will be
+    called with two arguments when results are received: the query and an array
+    of result objects. See the documentation for the `results` event for a list
+    of the properties available on each result object.
+
+    Each filter is expected to return a filtered or modified version of the
+    results array, which will then be passed on to subsequent filters, then the
+    `resultHighlighter` function (if set), then the `resultFormatter` function
+    (if set), and finally to subscribers to the `results` event.
+
+    If no `source` is set, result filters will not be called.
+
+    Prepackaged result filters provided by the autocomplete-filters and
+    autocomplete-filters-accentfold modules can be used by specifying the filter
+    name as a string, such as `'phraseMatch'` (assuming the necessary filters
+    module is loaded).
+
+    @attribute resultFilters
+    @type Array
+    @default []
+    **/
+    resultFilters: {
+        setter: '_setResultFilters',
+        value: []
+    },
+
+    /**
+    Function which will be used to format results. If provided, this function
+    will be called with two arguments after results have been received and
+    filtered: the query and an array of result objects. The formatter is
+    expected to return an array of HTML strings or Node instances containing the
+    desired HTML for each result.
+
+    See the documentation for the `results` event for a list of the properties
+    available on each result object.
+
+    If no `source` is set, the formatter will not be called.
+
+    @attribute resultFormatter
+    @type Function|null
+    **/
+    resultFormatter: {
+        validator: _FUNCTION_VALIDATOR,
+        value: null
+    },
+
+    /**
+    Function which will be used to highlight results. If provided, this function
+    will be called with two arguments after results have been received and
+    filtered: the query and an array of filtered result objects. The highlighter
+    is expected to return an array of highlighted result text in the form of
+    HTML strings.
+
+    See the documentation for the `results` event for a list of the properties
+    available on each result object.
+
+    If no `source` is set, the highlighter will not be called.
+
+    @attribute resultHighlighter
+    @type Function|null
+    **/
+    resultHighlighter: {
+        setter: '_setResultHighlighter',
+        value: null
+    },
+
+    /**
+    Locator that should be used to extract an array of results from a non-array
+    response.
+
+    By default, no locator is applied, and all responses are assumed to be
+    arrays by default. If all responses are already arrays, you don't need to
+    define a locator.
+
+    The locator may be either a function (which will receive the raw response as
+    an argument and must return an array) or a string representing an object
+    path, such as "foo.bar.baz" (which would return the value of
+    `result.foo.bar.baz` if the response is an object).
+
+    While `resultListLocator` may be set to either a function or a string, it
+    will always be returned as a function that accepts a response argument and
+    returns an array.
+
+    @attribute resultListLocator
+    @type Function|String|null
+    **/
+    resultListLocator: {
+        setter: '_setLocator',
+        value: null
+    },
+
+    /**
+    Current results, or an empty array if there are no results.
+
+    @attribute results
+    @type Array
+    @default []
+    @readonly
+    **/
+    results: {
+        readOnly: true,
+        value: []
+    },
+
+    /**
+    Locator that should be used to extract a plain text string from a non-string
+    result item. The resulting text value will typically be the value that ends
+    up being inserted into an input field or textarea when the user of an
+    autocomplete implementation selects a result.
+
+    By default, no locator is applied, and all results are assumed to be plain
+    text strings. If all results are already plain text strings, you don't need
+    to define a locator.
+
+    The locator may be either a function (which will receive the raw result as
+    an argument and must return a string) or a string representing an object
+    path, such as "foo.bar.baz" (which would return the value of
+    `result.foo.bar.baz` if the result is an object).
+
+    While `resultTextLocator` may be set to either a function or a string, it
+    will always be returned as a function that accepts a result argument and
+    returns a string.
+
+    @attribute resultTextLocator
+    @type Function|String|null
+    **/
+    resultTextLocator: {
+        setter: '_setLocator',
+        value: null
+    },
+
+    /**
+    Source for autocomplete results. The following source types are supported:
+
+    <dl>
+      <dt>Array</dt>
+      <dd>
+        <p>
+        The full array will be provided to any configured filters for each
+        query. This is an easy way to create a fully client-side autocomplete
+        implementation.
+        </p>
+
+        <p>
+        Example: `['first result', 'second result', 'etc']`
+        </p>
+      </dd>
+
+      <dt>DataSource</dt>
+      <dd>
+        A `DataSource` instance or other object that provides a DataSource-like
+        `sendRequest` method. See the `DataSource` documentation for details.
+      </dd>
+
+      <dt>Function</dt>
+      <dd>
+        <p>
+        A function source will be called with the current query and a
+        callback function as parameters, and should either return an array of
+        results (for synchronous operation) or return nothing and pass an
+        array of results to the provided callback (for asynchronous
+        operation).
+        </p>
+
+        <p>
+        Example (synchronous):
+        </p>
+
+        <pre>
+        function (query) {
+            return ['foo', 'bar'];
+        }
+        </pre>
+
+        <p>
+        Example (async):
+        </p>
+
+        <pre>
+        function (query, callback) {
+            callback(['foo', 'bar']);
+        }
+        </pre>
+      </dd>
+
+      <dt>Object</dt>
+      <dd>
+        <p>
+        An object will be treated as a query hashmap. If a property on the
+        object matches the current query, the value of that property will be
+        used as the response.
+        </p>
+
+        <p>
+        The response is assumed to be an array of results by default. If the
+        response is not an array, provide a `resultListLocator` to
+        process the response and return an array.
+        </p>
+
+        <p>
+        Example: `{foo: ['foo result 1', 'foo result 2'], bar: ['bar result']}`
+        </p>
+      </dd>
+    </dl>
+
+    If the optional `autocomplete-sources` module is loaded, then
+    the following additional source types will be supported as well:
+
+    <dl>
+      <dt>&lt;select&gt; Node</dt>
+      <dd>
+        You may provide a YUI Node instance wrapping a &lt;select&gt;
+        element, and the options in the list will be used as results. You
+        will also need to specify a `resultTextLocator` of 'text'
+        or 'value', depending on what you want to use as the text of the
+        result.
+
+        Each result will be an object with the following properties:
+
+        <dl>
+          <dt>html (String)</dt>
+          <dd>
+            <p>HTML content of the &lt;option&gt; element.</p>
+          </dd>
+
+          <dt>index (Number)</dt>
+          <dd>
+            <p>Index of the &lt;option&gt; element in the list.</p>
+          </dd>
+
+          <dt>node (Y.Node)</dt>
+          <dd>
+            <p>Node instance referring to the original &lt;option&gt; element.</p>
+          </dd>
+
+          <dt>selected (Boolean)</dt>
+          <dd>
+            <p>Whether or not this item is currently selected in the
+            &lt;select&gt; list.</p>
+          </dd>
+
+          <dt>text (String)</dt>
+          <dd>
+            <p>Text content of the &lt;option&gt; element.</p>
+          </dd>
+
+          <dt>value (String)</dt>
+          <dd>
+            <p>Value of the &lt;option&gt; element.</p>
+          </dd>
+        </dl>
+      </dd>
+
+      <dt>String (JSONP URL)</dt>
+      <dd>
+        <p>
+        If a URL with a `{callback}` placeholder is provided, it will be used to
+        make a JSONP request. The `{query}` placeholder will be replaced with
+        the current query, and the `{callback}` placeholder will be replaced
+        with an internally-generated JSONP callback name. Both placeholders must
+        appear in the URL, or the request will fail. An optional `{maxResults}`
+        placeholder may also be provided, and will be replaced with the value of
+        the maxResults attribute (or 1000 if the maxResults attribute is 0 or
+        less).
+        </p>
+
+        <p>
+        The response is assumed to be an array of results by default. If the
+        response is not an array, provide a `resultListLocator` to process the
+        response and return an array.
+        </p>
+
+        <p>
+        <strong>The `jsonp` module must be loaded in order for
+        JSONP URL sources to work.</strong> If the `jsonp` module
+        is not already loaded, it will be loaded on demand if possible.
+        </p>
+
+        <p>
+        Example: `'http://example.com/search?q={query}&callback={callback}'`
+        </p>
+      </dd>
+
+      <dt>String (XHR URL)</dt>
+      <dd>
+        <p>
+        If a URL without a `{callback}` placeholder is provided, it will be used
+        to make a same-origin XHR request. The `{query}` placeholder will be
+        replaced with the current query. An optional `{maxResults}` placeholder
+        may also be provided, and will be replaced with the value of the
+        maxResults attribute (or 1000 if the maxResults attribute is 0 or less).
+        </p>
+
+        <p>
+        The response is assumed to be a JSON array of results by default. If the
+        response is a JSON object and not an array, provide a
+        `resultListLocator` to process the response and return an array. If the
+        response is in some form other than JSON, you will need to use a custom
+        DataSource instance as the source.
+        </p>
+
+        <p>
+        <strong>The `io-base` and `json-parse` modules
+        must be loaded in order for XHR URL sources to work.</strong> If
+        these modules are not already loaded, they will be loaded on demand
+        if possible.
+        </p>
+
+        <p>
+        Example: `'http://example.com/search?q={query}'`
+        </p>
+      </dd>
+
+      <dt>String (YQL query)</dt>
+      <dd>
+        <p>
+        If a YQL query is provided, it will be used to make a YQL request. The
+        `{query}` placeholder will be replaced with the current autocomplete
+        query. This placeholder must appear in the YQL query, or the request
+        will fail. An optional `{maxResults}` placeholder may also be provided,
+        and will be replaced with the value of the maxResults attribute (or 1000
+        if the maxResults attribute is 0 or less).
+        </p>
+
+        <p>
+        <strong>The `yql` module must be loaded in order for YQL
+        sources to work.</strong> If the `yql` module is not
+        already loaded, it will be loaded on demand if possible.
+        </p>
+
+        <p>
+        Example: `'select * from search.suggest where query="{query}"'`
+        </p>
+      </dd>
+    </dl>
+
+    As an alternative to providing a source, you could simply listen for `query`
+    events and handle them any way you see fit. Providing a source is optional,
+    but will usually be simpler.
+
+    @attribute source
+    @type Array|DataSource|Function|Node|Object|String|null
+    **/
+    source: {
+        setter: '_setSource',
+        value: null
+    },
+
+    /**
+    May be used to force a specific source type, overriding the automatic source
+    type detection. It should almost never be necessary to do this, but as they
+    taught us in the Boy Scouts, one should always be prepared, so it's here if
+    you need it. Be warned that if you set this attribute and something breaks,
+    it's your own fault.
+
+    Supported `sourceType` values are: 'array', 'datasource', 'function', and
+    'object'.
+
+    If the `autocomplete-sources` module is loaded, the following additional
+    source types are supported: 'io', 'jsonp', 'select', 'string', 'yql'
+
+    @attribute sourceType
+    @type String
+    **/
+    sourceType: {
+        value: null
+    },
+
+    /**
+    If the `inputNode` specified at instantiation time has a `node-tokeninput`
+    plugin attached to it, this attribute will be a reference to the
+    `Y.Plugin.TokenInput` instance.
+
+    @attribute tokenInput
+    @type Plugin.TokenInput
+    @readonly
+    **/
+    tokenInput: {
+        readOnly: true
+    },
+
+    /**
+    Current value of the input node.
+
+    @attribute value
+    @type String
+    @default ''
+    **/
+    value: {
+        // Why duplicate this._inputNode.get('value')? Because we need a
+        // reliable way to track the source of value changes. We want to perform
+        // completion when the user changes the value, but not when we change
+        // the value.
+        value: ''
+    }
+};
+
+// This tells Y.Base.create() to copy these static properties to any class
+// AutoCompleteBase is mixed into.
+AutoCompleteBase._buildCfg = {
+    aggregates: ['SOURCE_TYPES'],
+    statics   : ['UI_SRC']
+};
+
+/**
+Mapping of built-in source types to their setter functions. DataSource instances
+and DataSource-like objects are handled natively, so are not mapped here.
+
+@property SOURCE_TYPES
+@type {Object}
+@static
+**/
+AutoCompleteBase.SOURCE_TYPES = {
+    array     : '_createArraySource',
+    'function': '_createFunctionSource',
+    object    : '_createObjectSource'
+};
+
+AutoCompleteBase.UI_SRC = (Y.Widget && Y.Widget.UI_SRC) || 'ui';
+
+Y.AutoCompleteBase = AutoCompleteBase;
+
+
+}, '3.5.1' ,{optional:['autocomplete-sources'], requires:['array-extras', 'base-build', 'escape', 'event-valuechange', 'node-base']});

=== added directory 'debian/extras/jslibs/yui/autocomplete-filters'
=== added directory 'debian/extras/jslibs/yui/autocomplete-filters-accentfold'
=== added file 'debian/extras/jslibs/yui/autocomplete-filters-accentfold/autocomplete-filters-accentfold-debug.js'
--- debian/extras/jslibs/yui/autocomplete-filters-accentfold/autocomplete-filters-accentfold-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-filters-accentfold/autocomplete-filters-accentfold-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,142 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-filters-accentfold', function(Y) {
+
+/**
+Provides pre-built accent-folding result matching filters for AutoComplete.
+
+These filters are similar to the ones provided by the `autocomplete-filters`
+module, but use accent-aware comparisons. For example, "resume" and "résumé"
+will be considered equal when using the accent-folding filters.
+
+@module autocomplete
+@submodule autocomplete-filters-accentfold
+**/
+
+/**
+@class AutoCompleteFilters
+@static
+**/
+
+var AccentFold = Y.Text.AccentFold,
+    WordBreak  = Y.Text.WordBreak,
+    YArray     = Y.Array,
+    YObject    = Y.Object;
+
+Y.mix(Y.namespace('AutoCompleteFilters'), {
+    /**
+    Accent folding version of `charMatch()`.
+
+    @method charMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    charMatchFold: function (query, results) {
+        if (!query) { return results; }
+
+        var queryChars = YArray.unique(AccentFold.fold(query).split(''));
+
+        return YArray.filter(results, function (result) {
+            var text = AccentFold.fold(result.text);
+
+            return YArray.every(queryChars, function (chr) {
+                return text.indexOf(chr) !== -1;
+            });
+        });
+    },
+
+    /**
+    Accent folding version of `phraseMatch()`.
+
+    @method phraseMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    phraseMatchFold: function (query, results) {
+        if (!query) { return results; }
+
+        query = AccentFold.fold(query);
+
+        return YArray.filter(results, function (result) {
+            return AccentFold.fold(result.text).indexOf(query) !== -1;
+        });
+    },
+
+    /**
+    Accent folding version of `startsWith()`.
+
+    @method startsWithFold
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    startsWithFold: function (query, results) {
+        if (!query) { return results; }
+
+        query = AccentFold.fold(query);
+
+        return YArray.filter(results, function (result) {
+            return AccentFold.fold(result.text).indexOf(query) === 0;
+        });
+    },
+
+    /**
+    Accent folding version of `subWordMatch()`.
+
+    @method subWordMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    subWordMatchFold: function (query, results) {
+        if (!query) { return results; }
+
+        var queryWords = WordBreak.getUniqueWords(AccentFold.fold(query));
+
+        return YArray.filter(results, function (result) {
+            var resultText = AccentFold.fold(result.text);
+
+            return YArray.every(queryWords, function (queryWord) {
+                return resultText.indexOf(queryWord) !== -1;
+            });
+        });
+    },
+
+    /**
+    Accent folding version of `wordMatch()`.
+
+    @method wordMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    wordMatchFold: function (query, results) {
+        if (!query) { return results; }
+
+        var queryWords = WordBreak.getUniqueWords(AccentFold.fold(query));
+
+        return YArray.filter(results, function (result) {
+            // Convert resultWords array to a hash for fast lookup.
+            var resultWords = YArray.hash(WordBreak.getUniqueWords(
+                    AccentFold.fold(result.text)));
+
+            return YArray.every(queryWords, function (word) {
+                return YObject.owns(resultWords, word);
+            });
+        });
+    }
+});
+
+
+}, '3.5.1' ,{requires:['array-extras', 'text-accentfold', 'text-wordbreak']});

=== added file 'debian/extras/jslibs/yui/autocomplete-filters-accentfold/autocomplete-filters-accentfold-min.js'
--- debian/extras/jslibs/yui/autocomplete-filters-accentfold/autocomplete-filters-accentfold-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-filters-accentfold/autocomplete-filters-accentfold-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("autocomplete-filters-accentfold",function(d){var c=d.Text.AccentFold,a=d.Text.WordBreak,b=d.Array,e=d.Object;d.mix(d.namespace("AutoCompleteFilters"),{charMatchFold:function(h,g){if(!h){return g;}var f=b.unique(c.fold(h).split(""));return b.filter(g,function(i){var j=c.fold(i.text);return b.every(f,function(k){return j.indexOf(k)!==-1;});});},phraseMatchFold:function(g,f){if(!g){return f;}g=c.fold(g);return b.filter(f,function(h){return c.fold(h.text).indexOf(g)!==-1;});},startsWithFold:function(g,f){if(!g){return f;}g=c.fold(g);return b.filter(f,function(h){return c.fold(h.text).indexOf(g)===0;});},subWordMatchFold:function(h,f){if(!h){return f;}var g=a.getUniqueWords(c.fold(h));return b.filter(f,function(i){var j=c.fold(i.text);return b.every(g,function(k){return j.indexOf(k)!==-1;});});},wordMatchFold:function(h,f){if(!h){return f;}var g=a.getUniqueWords(c.fold(h));return b.filter(f,function(i){var j=b.hash(a.getUniqueWords(c.fold(i.text)));return b.every(g,function(k){return e.owns(j,k);});});}});},"3.5.1",{requires:["array-extras","text-accentfold","text-wordbreak"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/autocomplete-filters-accentfold/autocomplete-filters-accentfold.js'
--- debian/extras/jslibs/yui/autocomplete-filters-accentfold/autocomplete-filters-accentfold.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-filters-accentfold/autocomplete-filters-accentfold.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,142 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-filters-accentfold', function(Y) {
+
+/**
+Provides pre-built accent-folding result matching filters for AutoComplete.
+
+These filters are similar to the ones provided by the `autocomplete-filters`
+module, but use accent-aware comparisons. For example, "resume" and "résumé"
+will be considered equal when using the accent-folding filters.
+
+@module autocomplete
+@submodule autocomplete-filters-accentfold
+**/
+
+/**
+@class AutoCompleteFilters
+@static
+**/
+
+var AccentFold = Y.Text.AccentFold,
+    WordBreak  = Y.Text.WordBreak,
+    YArray     = Y.Array,
+    YObject    = Y.Object;
+
+Y.mix(Y.namespace('AutoCompleteFilters'), {
+    /**
+    Accent folding version of `charMatch()`.
+
+    @method charMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    charMatchFold: function (query, results) {
+        if (!query) { return results; }
+
+        var queryChars = YArray.unique(AccentFold.fold(query).split(''));
+
+        return YArray.filter(results, function (result) {
+            var text = AccentFold.fold(result.text);
+
+            return YArray.every(queryChars, function (chr) {
+                return text.indexOf(chr) !== -1;
+            });
+        });
+    },
+
+    /**
+    Accent folding version of `phraseMatch()`.
+
+    @method phraseMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    phraseMatchFold: function (query, results) {
+        if (!query) { return results; }
+
+        query = AccentFold.fold(query);
+
+        return YArray.filter(results, function (result) {
+            return AccentFold.fold(result.text).indexOf(query) !== -1;
+        });
+    },
+
+    /**
+    Accent folding version of `startsWith()`.
+
+    @method startsWithFold
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    startsWithFold: function (query, results) {
+        if (!query) { return results; }
+
+        query = AccentFold.fold(query);
+
+        return YArray.filter(results, function (result) {
+            return AccentFold.fold(result.text).indexOf(query) === 0;
+        });
+    },
+
+    /**
+    Accent folding version of `subWordMatch()`.
+
+    @method subWordMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    subWordMatchFold: function (query, results) {
+        if (!query) { return results; }
+
+        var queryWords = WordBreak.getUniqueWords(AccentFold.fold(query));
+
+        return YArray.filter(results, function (result) {
+            var resultText = AccentFold.fold(result.text);
+
+            return YArray.every(queryWords, function (queryWord) {
+                return resultText.indexOf(queryWord) !== -1;
+            });
+        });
+    },
+
+    /**
+    Accent folding version of `wordMatch()`.
+
+    @method wordMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    wordMatchFold: function (query, results) {
+        if (!query) { return results; }
+
+        var queryWords = WordBreak.getUniqueWords(AccentFold.fold(query));
+
+        return YArray.filter(results, function (result) {
+            // Convert resultWords array to a hash for fast lookup.
+            var resultWords = YArray.hash(WordBreak.getUniqueWords(
+                    AccentFold.fold(result.text)));
+
+            return YArray.every(queryWords, function (word) {
+                return YObject.owns(resultWords, word);
+            });
+        });
+    }
+});
+
+
+}, '3.5.1' ,{requires:['array-extras', 'text-accentfold', 'text-wordbreak']});

=== added file 'debian/extras/jslibs/yui/autocomplete-filters/autocomplete-filters-debug.js'
--- debian/extras/jslibs/yui/autocomplete-filters/autocomplete-filters-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-filters/autocomplete-filters-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,245 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-filters', function(Y) {
+
+/**
+Provides pre-built result matching filters for AutoComplete.
+
+@module autocomplete
+@submodule autocomplete-filters
+@class AutoCompleteFilters
+@static
+**/
+
+var YArray     = Y.Array,
+    YObject    = Y.Object,
+    WordBreak  = Y.Text.WordBreak,
+
+Filters = Y.mix(Y.namespace('AutoCompleteFilters'), {
+    // -- Public Methods -------------------------------------------------------
+
+    /**
+    Returns an array of results that contain all of the characters in the query,
+    in any order (not necessarily consecutive). Case-insensitive.
+
+    @method charMatch
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    charMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // charMatchCase(). It's intentionally undocumented.
+
+        if (!query) { return results; }
+
+        var queryChars = YArray.unique((caseSensitive ? query :
+                query.toLowerCase()).split(''));
+
+        return YArray.filter(results, function (result) {
+            result = result.text;
+
+            if (!caseSensitive) {
+                result = result.toLowerCase();
+            }
+
+            return YArray.every(queryChars, function (chr) {
+                return result.indexOf(chr) !== -1;
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `charMatch()`.
+
+    @method charMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    charMatchCase: function (query, results) {
+        return Filters.charMatch(query, results, true);
+    },
+
+    /**
+    Returns an array of results that contain the complete query as a phrase.
+    Case-insensitive.
+
+    @method phraseMatch
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    phraseMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // phraseMatchCase(). It's intentionally undocumented.
+
+        if (!query) { return results; }
+
+        if (!caseSensitive) {
+            query = query.toLowerCase();
+        }
+
+        return YArray.filter(results, function (result) {
+            return (caseSensitive ? result.text : result.text.toLowerCase()).indexOf(query) !== -1;
+        });
+    },
+
+    /**
+    Case-sensitive version of `phraseMatch()`.
+
+    @method phraseMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    phraseMatchCase: function (query, results) {
+        return Filters.phraseMatch(query, results, true);
+    },
+
+    /**
+    Returns an array of results that start with the complete query as a phrase.
+    Case-insensitive.
+
+    @method startsWith
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    startsWith: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // startsWithCase(). It's intentionally undocumented.
+
+        if (!query) { return results; }
+
+        if (!caseSensitive) {
+            query = query.toLowerCase();
+        }
+
+        return YArray.filter(results, function (result) {
+            return (caseSensitive ? result.text : result.text.toLowerCase()).indexOf(query) === 0;
+        });
+    },
+
+    /**
+    Case-sensitive version of `startsWith()`.
+
+    @method startsWithCase
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    startsWithCase: function (query, results) {
+        return Filters.startsWith(query, results, true);
+    },
+
+    /**
+    Returns an array of results in which all the words of the query match either
+    whole words or parts of words in the result. Non-word characters like
+    whitespace and certain punctuation are ignored. Case-insensitive.
+
+    This is basically a combination of `wordMatch()` (by ignoring whitespace and
+    word order) and `phraseMatch()` (by allowing partial matching instead of
+    requiring the entire word to match).
+
+    Example use case: Trying to find personal names independently of name order
+    (Western or Eastern order) and supporting immediate feedback by allowing
+    partial occurences. So queries like "J. Doe", "Doe, John", and "J. D." would
+    all match "John Doe".
+
+    @method subWordMatch
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    subWordMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // subWordMatchCase(). It's intentionally undocumented.
+
+        if (!query) { return results; }
+
+        var queryWords = WordBreak.getUniqueWords(query, {
+            ignoreCase: !caseSensitive
+        });
+
+        return YArray.filter(results, function (result) {
+            var resultText = caseSensitive ? result.text :
+                    result.text.toLowerCase();
+
+            return YArray.every(queryWords, function (queryWord) {
+                return resultText.indexOf(queryWord) !== -1;
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `subWordMatch()`.
+
+    @method subWordMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    subWordMatchCase: function (query, results) {
+        return Filters.subWordMatch(query, results, true);
+    },
+
+    /**
+    Returns an array of results that contain all of the words in the query, in
+    any order. Non-word characters like whitespace and certain punctuation are
+    ignored. Case-insensitive.
+
+    @method wordMatch
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    wordMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // wordMatchCase(). It's intentionally undocumented.
+
+        if (!query) { return results; }
+
+        var options    = {ignoreCase: !caseSensitive},
+            queryWords = WordBreak.getUniqueWords(query, options);
+
+        return YArray.filter(results, function (result) {
+            // Convert resultWords array to a hash for fast lookup.
+            var resultWords = YArray.hash(WordBreak.getUniqueWords(result.text,
+                                options));
+
+            return YArray.every(queryWords, function (word) {
+                return YObject.owns(resultWords, word);
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `wordMatch()`.
+
+    @method wordMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    wordMatchCase: function (query, results) {
+        return Filters.wordMatch(query, results, true);
+    }
+});
+
+
+}, '3.5.1' ,{requires:['array-extras', 'text-wordbreak']});

=== added file 'debian/extras/jslibs/yui/autocomplete-filters/autocomplete-filters-min.js'
--- debian/extras/jslibs/yui/autocomplete-filters/autocomplete-filters-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-filters/autocomplete-filters-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("autocomplete-filters",function(d){var c=d.Array,e=d.Object,a=d.Text.WordBreak,b=d.mix(d.namespace("AutoCompleteFilters"),{charMatch:function(i,h,f){if(!i){return h;}var g=c.unique((f?i:i.toLowerCase()).split(""));return c.filter(h,function(j){j=j.text;if(!f){j=j.toLowerCase();}return c.every(g,function(k){return j.indexOf(k)!==-1;});});},charMatchCase:function(g,f){return b.charMatch(g,f,true);},phraseMatch:function(h,g,f){if(!h){return g;}if(!f){h=h.toLowerCase();}return c.filter(g,function(i){return(f?i.text:i.text.toLowerCase()).indexOf(h)!==-1;});},phraseMatchCase:function(g,f){return b.phraseMatch(g,f,true);},startsWith:function(h,g,f){if(!h){return g;}if(!f){h=h.toLowerCase();}return c.filter(g,function(i){return(f?i.text:i.text.toLowerCase()).indexOf(h)===0;});},startsWithCase:function(g,f){return b.startsWith(g,f,true);},subWordMatch:function(i,g,f){if(!i){return g;}var h=a.getUniqueWords(i,{ignoreCase:!f});return c.filter(g,function(j){var k=f?j.text:j.text.toLowerCase();return c.every(h,function(l){return k.indexOf(l)!==-1;});});},subWordMatchCase:function(g,f){return b.subWordMatch(g,f,true);},wordMatch:function(j,h,f){if(!j){return h;}var g={ignoreCase:!f},i=a.getUniqueWords(j,g);return c.filter(h,function(k){var l=c.hash(a.getUniqueWords(k.text,g));return c.every(i,function(m){return e.owns(l,m);});});},wordMatchCase:function(g,f){return b.wordMatch(g,f,true);}});},"3.5.1",{requires:["array-extras","text-wordbreak"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/autocomplete-filters/autocomplete-filters.js'
--- debian/extras/jslibs/yui/autocomplete-filters/autocomplete-filters.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-filters/autocomplete-filters.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,245 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-filters', function(Y) {
+
+/**
+Provides pre-built result matching filters for AutoComplete.
+
+@module autocomplete
+@submodule autocomplete-filters
+@class AutoCompleteFilters
+@static
+**/
+
+var YArray     = Y.Array,
+    YObject    = Y.Object,
+    WordBreak  = Y.Text.WordBreak,
+
+Filters = Y.mix(Y.namespace('AutoCompleteFilters'), {
+    // -- Public Methods -------------------------------------------------------
+
+    /**
+    Returns an array of results that contain all of the characters in the query,
+    in any order (not necessarily consecutive). Case-insensitive.
+
+    @method charMatch
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    charMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // charMatchCase(). It's intentionally undocumented.
+
+        if (!query) { return results; }
+
+        var queryChars = YArray.unique((caseSensitive ? query :
+                query.toLowerCase()).split(''));
+
+        return YArray.filter(results, function (result) {
+            result = result.text;
+
+            if (!caseSensitive) {
+                result = result.toLowerCase();
+            }
+
+            return YArray.every(queryChars, function (chr) {
+                return result.indexOf(chr) !== -1;
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `charMatch()`.
+
+    @method charMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    charMatchCase: function (query, results) {
+        return Filters.charMatch(query, results, true);
+    },
+
+    /**
+    Returns an array of results that contain the complete query as a phrase.
+    Case-insensitive.
+
+    @method phraseMatch
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    phraseMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // phraseMatchCase(). It's intentionally undocumented.
+
+        if (!query) { return results; }
+
+        if (!caseSensitive) {
+            query = query.toLowerCase();
+        }
+
+        return YArray.filter(results, function (result) {
+            return (caseSensitive ? result.text : result.text.toLowerCase()).indexOf(query) !== -1;
+        });
+    },
+
+    /**
+    Case-sensitive version of `phraseMatch()`.
+
+    @method phraseMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    phraseMatchCase: function (query, results) {
+        return Filters.phraseMatch(query, results, true);
+    },
+
+    /**
+    Returns an array of results that start with the complete query as a phrase.
+    Case-insensitive.
+
+    @method startsWith
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    startsWith: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // startsWithCase(). It's intentionally undocumented.
+
+        if (!query) { return results; }
+
+        if (!caseSensitive) {
+            query = query.toLowerCase();
+        }
+
+        return YArray.filter(results, function (result) {
+            return (caseSensitive ? result.text : result.text.toLowerCase()).indexOf(query) === 0;
+        });
+    },
+
+    /**
+    Case-sensitive version of `startsWith()`.
+
+    @method startsWithCase
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    startsWithCase: function (query, results) {
+        return Filters.startsWith(query, results, true);
+    },
+
+    /**
+    Returns an array of results in which all the words of the query match either
+    whole words or parts of words in the result. Non-word characters like
+    whitespace and certain punctuation are ignored. Case-insensitive.
+
+    This is basically a combination of `wordMatch()` (by ignoring whitespace and
+    word order) and `phraseMatch()` (by allowing partial matching instead of
+    requiring the entire word to match).
+
+    Example use case: Trying to find personal names independently of name order
+    (Western or Eastern order) and supporting immediate feedback by allowing
+    partial occurences. So queries like "J. Doe", "Doe, John", and "J. D." would
+    all match "John Doe".
+
+    @method subWordMatch
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    subWordMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // subWordMatchCase(). It's intentionally undocumented.
+
+        if (!query) { return results; }
+
+        var queryWords = WordBreak.getUniqueWords(query, {
+            ignoreCase: !caseSensitive
+        });
+
+        return YArray.filter(results, function (result) {
+            var resultText = caseSensitive ? result.text :
+                    result.text.toLowerCase();
+
+            return YArray.every(queryWords, function (queryWord) {
+                return resultText.indexOf(queryWord) !== -1;
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `subWordMatch()`.
+
+    @method subWordMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    subWordMatchCase: function (query, results) {
+        return Filters.subWordMatch(query, results, true);
+    },
+
+    /**
+    Returns an array of results that contain all of the words in the query, in
+    any order. Non-word characters like whitespace and certain punctuation are
+    ignored. Case-insensitive.
+
+    @method wordMatch
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    wordMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // wordMatchCase(). It's intentionally undocumented.
+
+        if (!query) { return results; }
+
+        var options    = {ignoreCase: !caseSensitive},
+            queryWords = WordBreak.getUniqueWords(query, options);
+
+        return YArray.filter(results, function (result) {
+            // Convert resultWords array to a hash for fast lookup.
+            var resultWords = YArray.hash(WordBreak.getUniqueWords(result.text,
+                                options));
+
+            return YArray.every(queryWords, function (word) {
+                return YObject.owns(resultWords, word);
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `wordMatch()`.
+
+    @method wordMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to filter
+    @return {Array} Filtered results
+    @static
+    **/
+    wordMatchCase: function (query, results) {
+        return Filters.wordMatch(query, results, true);
+    }
+});
+
+
+}, '3.5.1' ,{requires:['array-extras', 'text-wordbreak']});

=== added directory 'debian/extras/jslibs/yui/autocomplete-highlighters'
=== added directory 'debian/extras/jslibs/yui/autocomplete-highlighters-accentfold'
=== added file 'debian/extras/jslibs/yui/autocomplete-highlighters-accentfold/autocomplete-highlighters-accentfold-debug.js'
--- debian/extras/jslibs/yui/autocomplete-highlighters-accentfold/autocomplete-highlighters-accentfold-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-highlighters-accentfold/autocomplete-highlighters-accentfold-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,113 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-highlighters-accentfold', function(Y) {
+
+/**
+Provides pre-built accent-folding result highlighters for AutoComplete.
+
+These highlighters are similar to the ones provided by the `autocomplete-
+highlighters` module, but use accent-aware comparisons. For example, "resume"
+and "résumé" will be considered equal when using the accent-folding
+highlighters.
+
+@module autocomplete
+@submodule autocomplete-highlighters-accentfold
+**/
+
+/**
+@class AutoCompleteHighlighters
+@static
+**/
+
+var Highlight = Y.Highlight,
+    YArray    = Y.Array;
+
+Y.mix(Y.namespace('AutoCompleteHighlighters'), {
+    /**
+    Accent-folding version of `charMatch()`.
+
+    @method charMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    charMatchFold: function (query, results) {
+        var queryChars = YArray.unique(query.split(''));
+
+        return YArray.map(results, function (result) {
+            return Highlight.allFold(result.text, queryChars);
+        });
+    },
+
+    /**
+    Accent-folding version of `phraseMatch()`.
+
+    @method phraseMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    phraseMatchFold: function (query, results) {
+        return YArray.map(results, function (result) {
+            return Highlight.allFold(result.text, [query]);
+        });
+    },
+
+    /**
+    Accent-folding version of `startsWith()`.
+
+    @method startsWithFold
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    startsWithFold: function (query, results) {
+        return YArray.map(results, function (result) {
+            return Highlight.allFold(result.text, [query], {
+                startsWith: true
+            });
+        });
+    },
+
+    /**
+    Accent-folding version of `subWordMatch()`.
+
+    @method subWordMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    subWordMatchFold: function (query, results) {
+        var queryWords = Y.Text.WordBreak.getUniqueWords(query);
+
+        return YArray.map(results, function (result) {
+            return Highlight.allFold(result.text, queryWords);
+        });
+    },
+
+    /**
+    Accent-folding version of `wordMatch()`.
+
+    @method wordMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    wordMatchFold: function (query, results) {
+        return YArray.map(results, function (result) {
+            return Highlight.wordsFold(result.text, query);
+        });
+    }
+});
+
+
+}, '3.5.1' ,{requires:['array-extras', 'highlight-accentfold']});

=== added file 'debian/extras/jslibs/yui/autocomplete-highlighters-accentfold/autocomplete-highlighters-accentfold-min.js'
--- debian/extras/jslibs/yui/autocomplete-highlighters-accentfold/autocomplete-highlighters-accentfold-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-highlighters-accentfold/autocomplete-highlighters-accentfold-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("autocomplete-highlighters-accentfold",function(c){var a=c.Highlight,b=c.Array;c.mix(c.namespace("AutoCompleteHighlighters"),{charMatchFold:function(f,e){var d=b.unique(f.split(""));return b.map(e,function(g){return a.allFold(g.text,d);});},phraseMatchFold:function(e,d){return b.map(d,function(f){return a.allFold(f.text,[e]);});},startsWithFold:function(e,d){return b.map(d,function(f){return a.allFold(f.text,[e],{startsWith:true});});},subWordMatchFold:function(f,d){var e=c.Text.WordBreak.getUniqueWords(f);return b.map(d,function(g){return a.allFold(g.text,e);});},wordMatchFold:function(e,d){return b.map(d,function(f){return a.wordsFold(f.text,e);});}});},"3.5.1",{requires:["array-extras","highlight-accentfold"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/autocomplete-highlighters-accentfold/autocomplete-highlighters-accentfold.js'
--- debian/extras/jslibs/yui/autocomplete-highlighters-accentfold/autocomplete-highlighters-accentfold.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-highlighters-accentfold/autocomplete-highlighters-accentfold.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,113 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-highlighters-accentfold', function(Y) {
+
+/**
+Provides pre-built accent-folding result highlighters for AutoComplete.
+
+These highlighters are similar to the ones provided by the `autocomplete-
+highlighters` module, but use accent-aware comparisons. For example, "resume"
+and "résumé" will be considered equal when using the accent-folding
+highlighters.
+
+@module autocomplete
+@submodule autocomplete-highlighters-accentfold
+**/
+
+/**
+@class AutoCompleteHighlighters
+@static
+**/
+
+var Highlight = Y.Highlight,
+    YArray    = Y.Array;
+
+Y.mix(Y.namespace('AutoCompleteHighlighters'), {
+    /**
+    Accent-folding version of `charMatch()`.
+
+    @method charMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    charMatchFold: function (query, results) {
+        var queryChars = YArray.unique(query.split(''));
+
+        return YArray.map(results, function (result) {
+            return Highlight.allFold(result.text, queryChars);
+        });
+    },
+
+    /**
+    Accent-folding version of `phraseMatch()`.
+
+    @method phraseMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    phraseMatchFold: function (query, results) {
+        return YArray.map(results, function (result) {
+            return Highlight.allFold(result.text, [query]);
+        });
+    },
+
+    /**
+    Accent-folding version of `startsWith()`.
+
+    @method startsWithFold
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    startsWithFold: function (query, results) {
+        return YArray.map(results, function (result) {
+            return Highlight.allFold(result.text, [query], {
+                startsWith: true
+            });
+        });
+    },
+
+    /**
+    Accent-folding version of `subWordMatch()`.
+
+    @method subWordMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    subWordMatchFold: function (query, results) {
+        var queryWords = Y.Text.WordBreak.getUniqueWords(query);
+
+        return YArray.map(results, function (result) {
+            return Highlight.allFold(result.text, queryWords);
+        });
+    },
+
+    /**
+    Accent-folding version of `wordMatch()`.
+
+    @method wordMatchFold
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    wordMatchFold: function (query, results) {
+        return YArray.map(results, function (result) {
+            return Highlight.wordsFold(result.text, query);
+        });
+    }
+});
+
+
+}, '3.5.1' ,{requires:['array-extras', 'highlight-accentfold']});

=== added file 'debian/extras/jslibs/yui/autocomplete-highlighters/autocomplete-highlighters-debug.js'
--- debian/extras/jslibs/yui/autocomplete-highlighters/autocomplete-highlighters-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-highlighters/autocomplete-highlighters-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,205 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-highlighters', function(Y) {
+
+/**
+Provides pre-built result highlighters for AutoComplete.
+
+@module autocomplete
+@submodule autocomplete-highlighters
+@class AutoCompleteHighlighters
+@static
+**/
+
+var YArray    = Y.Array,
+    Highlight = Y.Highlight,
+
+Highlighters = Y.mix(Y.namespace('AutoCompleteHighlighters'), {
+    // -- Public Methods -------------------------------------------------------
+
+    /**
+    Highlights any individual query character that occurs anywhere in a result.
+    Case-insensitive.
+
+    @method charMatch
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    charMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // charMatchCase(). It's intentionally undocumented.
+
+        var queryChars = YArray.unique((caseSensitive ? query :
+                query.toLowerCase()).split(''));
+
+        return YArray.map(results, function (result) {
+            return Highlight.all(result.text, queryChars, {
+                caseSensitive: caseSensitive
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `charMatch()`.
+
+    @method charMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    charMatchCase: function (query, results) {
+        return Highlighters.charMatch(query, results, true);
+    },
+
+    /**
+    Highlights the complete query as a phrase anywhere within a result. Case-
+    insensitive.
+
+    @method phraseMatch
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    phraseMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // phraseMatchCase(). It's intentionally undocumented.
+
+        return YArray.map(results, function (result) {
+            return Highlight.all(result.text, [query], {
+                caseSensitive: caseSensitive
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `phraseMatch()`.
+
+    @method phraseMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    phraseMatchCase: function (query, results) {
+        return Highlighters.phraseMatch(query, results, true);
+    },
+
+    /**
+    Highlights the complete query as a phrase at the beginning of a result.
+    Case-insensitive.
+
+    @method startsWith
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    startsWith: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // startsWithCase(). It's intentionally undocumented.
+
+        return YArray.map(results, function (result) {
+            return Highlight.all(result.text, [query], {
+                caseSensitive: caseSensitive,
+                startsWith   : true
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `startsWith()`.
+
+    @method startsWithCase
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    startsWithCase: function (query, results) {
+        return Highlighters.startsWith(query, results, true);
+    },
+
+    /**
+    Highlights portions of results in which words from the query match either
+    whole words or parts of words in the result. Non-word characters like
+    whitespace and certain punctuation are ignored. Case-insensitive.
+
+    @method subWordMatch
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    subWordMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // subWordMatchCase(). It's intentionally undocumented.
+
+        var queryWords = Y.Text.WordBreak.getUniqueWords(query, {
+            ignoreCase: !caseSensitive
+        });
+
+        return YArray.map(results, function (result) {
+            return Highlight.all(result.text, queryWords, {
+                caseSensitive: caseSensitive
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `subWordMatch()`.
+
+    @method subWordMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    subWordMatchCase: function (query, results) {
+        return Highlighters.subWordMatch(query, results, true);
+    },
+
+    /**
+    Highlights individual words in results that are also in the query. Non-word
+    characters like punctuation are ignored. Case-insensitive.
+
+    @method wordMatch
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    wordMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // wordMatchCase(). It's intentionally undocumented.
+
+        return YArray.map(results, function (result) {
+            return Highlight.words(result.text, query, {
+                caseSensitive: caseSensitive
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `wordMatch()`.
+
+    @method wordMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    wordMatchCase: function (query, results) {
+        return Highlighters.wordMatch(query, results, true);
+    }
+});
+
+
+}, '3.5.1' ,{requires:['array-extras', 'highlight-base']});

=== added file 'debian/extras/jslibs/yui/autocomplete-highlighters/autocomplete-highlighters-min.js'
--- debian/extras/jslibs/yui/autocomplete-highlighters/autocomplete-highlighters-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-highlighters/autocomplete-highlighters-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("autocomplete-highlighters",function(d){var c=d.Array,a=d.Highlight,b=d.mix(d.namespace("AutoCompleteHighlighters"),{charMatch:function(h,g,e){var f=c.unique((e?h:h.toLowerCase()).split(""));return c.map(g,function(i){return a.all(i.text,f,{caseSensitive:e});});},charMatchCase:function(f,e){return b.charMatch(f,e,true);},phraseMatch:function(g,f,e){return c.map(f,function(h){return a.all(h.text,[g],{caseSensitive:e});});},phraseMatchCase:function(f,e){return b.phraseMatch(f,e,true);},startsWith:function(g,f,e){return c.map(f,function(h){return a.all(h.text,[g],{caseSensitive:e,startsWith:true});});},startsWithCase:function(f,e){return b.startsWith(f,e,true);},subWordMatch:function(h,f,e){var g=d.Text.WordBreak.getUniqueWords(h,{ignoreCase:!e});return c.map(f,function(i){return a.all(i.text,g,{caseSensitive:e});});},subWordMatchCase:function(f,e){return b.subWordMatch(f,e,true);},wordMatch:function(g,f,e){return c.map(f,function(h){return a.words(h.text,g,{caseSensitive:e});});},wordMatchCase:function(f,e){return b.wordMatch(f,e,true);}});},"3.5.1",{requires:["array-extras","highlight-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/autocomplete-highlighters/autocomplete-highlighters.js'
--- debian/extras/jslibs/yui/autocomplete-highlighters/autocomplete-highlighters.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-highlighters/autocomplete-highlighters.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,205 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-highlighters', function(Y) {
+
+/**
+Provides pre-built result highlighters for AutoComplete.
+
+@module autocomplete
+@submodule autocomplete-highlighters
+@class AutoCompleteHighlighters
+@static
+**/
+
+var YArray    = Y.Array,
+    Highlight = Y.Highlight,
+
+Highlighters = Y.mix(Y.namespace('AutoCompleteHighlighters'), {
+    // -- Public Methods -------------------------------------------------------
+
+    /**
+    Highlights any individual query character that occurs anywhere in a result.
+    Case-insensitive.
+
+    @method charMatch
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    charMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // charMatchCase(). It's intentionally undocumented.
+
+        var queryChars = YArray.unique((caseSensitive ? query :
+                query.toLowerCase()).split(''));
+
+        return YArray.map(results, function (result) {
+            return Highlight.all(result.text, queryChars, {
+                caseSensitive: caseSensitive
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `charMatch()`.
+
+    @method charMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    charMatchCase: function (query, results) {
+        return Highlighters.charMatch(query, results, true);
+    },
+
+    /**
+    Highlights the complete query as a phrase anywhere within a result. Case-
+    insensitive.
+
+    @method phraseMatch
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    phraseMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // phraseMatchCase(). It's intentionally undocumented.
+
+        return YArray.map(results, function (result) {
+            return Highlight.all(result.text, [query], {
+                caseSensitive: caseSensitive
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `phraseMatch()`.
+
+    @method phraseMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    phraseMatchCase: function (query, results) {
+        return Highlighters.phraseMatch(query, results, true);
+    },
+
+    /**
+    Highlights the complete query as a phrase at the beginning of a result.
+    Case-insensitive.
+
+    @method startsWith
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    startsWith: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // startsWithCase(). It's intentionally undocumented.
+
+        return YArray.map(results, function (result) {
+            return Highlight.all(result.text, [query], {
+                caseSensitive: caseSensitive,
+                startsWith   : true
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `startsWith()`.
+
+    @method startsWithCase
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    startsWithCase: function (query, results) {
+        return Highlighters.startsWith(query, results, true);
+    },
+
+    /**
+    Highlights portions of results in which words from the query match either
+    whole words or parts of words in the result. Non-word characters like
+    whitespace and certain punctuation are ignored. Case-insensitive.
+
+    @method subWordMatch
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    subWordMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // subWordMatchCase(). It's intentionally undocumented.
+
+        var queryWords = Y.Text.WordBreak.getUniqueWords(query, {
+            ignoreCase: !caseSensitive
+        });
+
+        return YArray.map(results, function (result) {
+            return Highlight.all(result.text, queryWords, {
+                caseSensitive: caseSensitive
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `subWordMatch()`.
+
+    @method subWordMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    subWordMatchCase: function (query, results) {
+        return Highlighters.subWordMatch(query, results, true);
+    },
+
+    /**
+    Highlights individual words in results that are also in the query. Non-word
+    characters like punctuation are ignored. Case-insensitive.
+
+    @method wordMatch
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    wordMatch: function (query, results, caseSensitive) {
+        // The caseSensitive parameter is only intended for use by
+        // wordMatchCase(). It's intentionally undocumented.
+
+        return YArray.map(results, function (result) {
+            return Highlight.words(result.text, query, {
+                caseSensitive: caseSensitive
+            });
+        });
+    },
+
+    /**
+    Case-sensitive version of `wordMatch()`.
+
+    @method wordMatchCase
+    @param {String} query Query to match
+    @param {Array} results Results to highlight
+    @return {Array} Highlighted results
+    @static
+    **/
+    wordMatchCase: function (query, results) {
+        return Highlighters.wordMatch(query, results, true);
+    }
+});
+
+
+}, '3.5.1' ,{requires:['array-extras', 'highlight-base']});

=== added directory 'debian/extras/jslibs/yui/autocomplete-list'
=== added directory 'debian/extras/jslibs/yui/autocomplete-list-keys'
=== added file 'debian/extras/jslibs/yui/autocomplete-list-keys/autocomplete-list-keys-debug.js'
--- debian/extras/jslibs/yui/autocomplete-list-keys/autocomplete-list-keys-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list-keys/autocomplete-list-keys-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,192 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-list-keys', function(Y) {
+
+/**
+Mixes keyboard support into AutoCompleteList. By default, this module is not
+loaded for iOS and Android devices.
+
+@module autocomplete
+@submodule autocomplete-list-keys
+**/
+
+ // keyCode constants.
+var KEY_DOWN  = 40,
+    KEY_ENTER = 13,
+    KEY_ESC   = 27,
+    KEY_TAB   = 9,
+    KEY_UP    = 38;
+
+function ListKeys() {
+    Y.before(this._bindKeys, this, 'bindUI');
+    this._initKeys();
+}
+
+ListKeys.prototype = {
+    // -- Lifecycle Methods ----------------------------------------------------
+
+    /**
+    Initializes keyboard command mappings.
+
+    @method _initKeys
+    @protected
+    @for AutoCompleteList
+    **/
+    _initKeys: function () {
+        var keys        = {},
+            keysVisible = {};
+
+        // Register keyboard command handlers. _keys contains handlers that will
+        // always be called; _keysVisible contains handlers that will only be
+        // called when the list is visible.
+        keys[KEY_DOWN] = this._keyDown;
+
+        keysVisible[KEY_ENTER] = this._keyEnter;
+        keysVisible[KEY_ESC]   = this._keyEsc;
+        keysVisible[KEY_TAB]   = this._keyTab;
+        keysVisible[KEY_UP]    = this._keyUp;
+
+        this._keys        = keys;
+        this._keysVisible = keysVisible;
+    },
+
+    destructor: function () {
+        this._unbindKeys();
+    },
+
+    /**
+    Binds keyboard events.
+
+    @method _bindKeys
+    @protected
+    **/
+    _bindKeys: function () {
+        this._keyEvents = this._inputNode.on('keydown', this._onInputKey, this);
+    },
+
+    /**
+    Unbinds keyboard events.
+
+    @method _unbindKeys
+    @protected
+    **/
+    _unbindKeys: function () {
+        this._keyEvents && this._keyEvents.detach();
+        this._keyEvents = null;
+    },
+
+    // -- Protected Methods ----------------------------------------------------
+
+    /**
+    Called when the down arrow key is pressed.
+
+    @method _keyDown
+    @protected
+    **/
+    _keyDown: function () {
+        if (this.get('visible')) {
+            this._activateNextItem();
+        } else {
+            this.show();
+        }
+    },
+
+    /**
+    Called when the enter key is pressed.
+
+    @method _keyEnter
+    @protected
+    **/
+    _keyEnter: function (e) {
+        var item = this.get('activeItem');
+
+        if (item) {
+            this.selectItem(item, e);
+        } else {
+            // Don't prevent form submission when there's no active item.
+            return false;
+        }
+    },
+
+    /**
+    Called when the escape key is pressed.
+
+    @method _keyEsc
+    @protected
+    **/
+    _keyEsc: function () {
+        this.hide();
+    },
+
+    /**
+    Called when the tab key is pressed.
+
+    @method _keyTab
+    @protected
+    **/
+    _keyTab: function (e) {
+        var item;
+
+        if (this.get('tabSelect')) {
+            item = this.get('activeItem');
+
+            if (item) {
+                this.selectItem(item, e);
+                return true;
+            }
+        }
+
+        return false;
+    },
+
+    /**
+    Called when the up arrow key is pressed.
+
+    @method _keyUp
+    @protected
+    **/
+    _keyUp: function () {
+        this._activatePrevItem();
+    },
+
+    // -- Protected Event Handlers ---------------------------------------------
+
+    /**
+    Handles `inputNode` key events.
+
+    @method _onInputKey
+    @param {EventTarget} e
+    @protected
+    **/
+    _onInputKey: function (e) {
+        var handler,
+            keyCode = e.keyCode;
+
+        this._lastInputKey = keyCode;
+
+        if (this.get('results').length) {
+            handler = this._keys[keyCode];
+
+            if (!handler && this.get('visible')) {
+                handler = this._keysVisible[keyCode];
+            }
+
+            if (handler) {
+                // A handler may return false to indicate that it doesn't wish
+                // to prevent the default key behavior.
+                if (handler.call(this, e) !== false) {
+                    e.preventDefault();
+                }
+            }
+        }
+    }
+};
+
+Y.Base.mix(Y.AutoCompleteList, [ListKeys]);
+
+
+}, '3.5.1' ,{requires:['autocomplete-list', 'base-build']});

=== added file 'debian/extras/jslibs/yui/autocomplete-list-keys/autocomplete-list-keys-min.js'
--- debian/extras/jslibs/yui/autocomplete-list-keys/autocomplete-list-keys-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list-keys/autocomplete-list-keys-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("autocomplete-list-keys",function(g){var c=40,a=13,d=27,f=9,b=38;function e(){g.before(this._bindKeys,this,"bindUI");this._initKeys();}e.prototype={_initKeys:function(){var h={},i={};h[c]=this._keyDown;i[a]=this._keyEnter;i[d]=this._keyEsc;i[f]=this._keyTab;i[b]=this._keyUp;this._keys=h;this._keysVisible=i;},destructor:function(){this._unbindKeys();},_bindKeys:function(){this._keyEvents=this._inputNode.on("keydown",this._onInputKey,this);},_unbindKeys:function(){this._keyEvents&&this._keyEvents.detach();this._keyEvents=null;},_keyDown:function(){if(this.get("visible")){this._activateNextItem();}else{this.show();}},_keyEnter:function(i){var h=this.get("activeItem");if(h){this.selectItem(h,i);}else{return false;}},_keyEsc:function(){this.hide();},_keyTab:function(i){var h;if(this.get("tabSelect")){h=this.get("activeItem");if(h){this.selectItem(h,i);return true;}}return false;},_keyUp:function(){this._activatePrevItem();},_onInputKey:function(j){var h,i=j.keyCode;this._lastInputKey=i;if(this.get("results").length){h=this._keys[i];if(!h&&this.get("visible")){h=this._keysVisible[i];}if(h){if(h.call(this,j)!==false){j.preventDefault();}}}}};g.Base.mix(g.AutoCompleteList,[e]);},"3.5.1",{requires:["autocomplete-list","base-build"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/autocomplete-list-keys/autocomplete-list-keys.js'
--- debian/extras/jslibs/yui/autocomplete-list-keys/autocomplete-list-keys.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list-keys/autocomplete-list-keys.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,192 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-list-keys', function(Y) {
+
+/**
+Mixes keyboard support into AutoCompleteList. By default, this module is not
+loaded for iOS and Android devices.
+
+@module autocomplete
+@submodule autocomplete-list-keys
+**/
+
+ // keyCode constants.
+var KEY_DOWN  = 40,
+    KEY_ENTER = 13,
+    KEY_ESC   = 27,
+    KEY_TAB   = 9,
+    KEY_UP    = 38;
+
+function ListKeys() {
+    Y.before(this._bindKeys, this, 'bindUI');
+    this._initKeys();
+}
+
+ListKeys.prototype = {
+    // -- Lifecycle Methods ----------------------------------------------------
+
+    /**
+    Initializes keyboard command mappings.
+
+    @method _initKeys
+    @protected
+    @for AutoCompleteList
+    **/
+    _initKeys: function () {
+        var keys        = {},
+            keysVisible = {};
+
+        // Register keyboard command handlers. _keys contains handlers that will
+        // always be called; _keysVisible contains handlers that will only be
+        // called when the list is visible.
+        keys[KEY_DOWN] = this._keyDown;
+
+        keysVisible[KEY_ENTER] = this._keyEnter;
+        keysVisible[KEY_ESC]   = this._keyEsc;
+        keysVisible[KEY_TAB]   = this._keyTab;
+        keysVisible[KEY_UP]    = this._keyUp;
+
+        this._keys        = keys;
+        this._keysVisible = keysVisible;
+    },
+
+    destructor: function () {
+        this._unbindKeys();
+    },
+
+    /**
+    Binds keyboard events.
+
+    @method _bindKeys
+    @protected
+    **/
+    _bindKeys: function () {
+        this._keyEvents = this._inputNode.on('keydown', this._onInputKey, this);
+    },
+
+    /**
+    Unbinds keyboard events.
+
+    @method _unbindKeys
+    @protected
+    **/
+    _unbindKeys: function () {
+        this._keyEvents && this._keyEvents.detach();
+        this._keyEvents = null;
+    },
+
+    // -- Protected Methods ----------------------------------------------------
+
+    /**
+    Called when the down arrow key is pressed.
+
+    @method _keyDown
+    @protected
+    **/
+    _keyDown: function () {
+        if (this.get('visible')) {
+            this._activateNextItem();
+        } else {
+            this.show();
+        }
+    },
+
+    /**
+    Called when the enter key is pressed.
+
+    @method _keyEnter
+    @protected
+    **/
+    _keyEnter: function (e) {
+        var item = this.get('activeItem');
+
+        if (item) {
+            this.selectItem(item, e);
+        } else {
+            // Don't prevent form submission when there's no active item.
+            return false;
+        }
+    },
+
+    /**
+    Called when the escape key is pressed.
+
+    @method _keyEsc
+    @protected
+    **/
+    _keyEsc: function () {
+        this.hide();
+    },
+
+    /**
+    Called when the tab key is pressed.
+
+    @method _keyTab
+    @protected
+    **/
+    _keyTab: function (e) {
+        var item;
+
+        if (this.get('tabSelect')) {
+            item = this.get('activeItem');
+
+            if (item) {
+                this.selectItem(item, e);
+                return true;
+            }
+        }
+
+        return false;
+    },
+
+    /**
+    Called when the up arrow key is pressed.
+
+    @method _keyUp
+    @protected
+    **/
+    _keyUp: function () {
+        this._activatePrevItem();
+    },
+
+    // -- Protected Event Handlers ---------------------------------------------
+
+    /**
+    Handles `inputNode` key events.
+
+    @method _onInputKey
+    @param {EventTarget} e
+    @protected
+    **/
+    _onInputKey: function (e) {
+        var handler,
+            keyCode = e.keyCode;
+
+        this._lastInputKey = keyCode;
+
+        if (this.get('results').length) {
+            handler = this._keys[keyCode];
+
+            if (!handler && this.get('visible')) {
+                handler = this._keysVisible[keyCode];
+            }
+
+            if (handler) {
+                // A handler may return false to indicate that it doesn't wish
+                // to prevent the default key behavior.
+                if (handler.call(this, e) !== false) {
+                    e.preventDefault();
+                }
+            }
+        }
+    }
+};
+
+Y.Base.mix(Y.AutoCompleteList, [ListKeys]);
+
+
+}, '3.5.1' ,{requires:['autocomplete-list', 'base-build']});

=== added directory 'debian/extras/jslibs/yui/autocomplete-list/assets'
=== added file 'debian/extras/jslibs/yui/autocomplete-list/assets/autocomplete-list-core.css'
--- debian/extras/jslibs/yui/autocomplete-list/assets/autocomplete-list-core.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list/assets/autocomplete-list-core.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,33 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-aclist {
+    position: absolute;
+    z-index: 1;
+}
+
+.yui3-aclist-hidden { visibility: hidden; }
+
+.yui3-aclist-aria {
+    /* Hide from sighted users, show to screen readers. */
+    left: -9999px;
+    position: absolute;
+}
+
+.yui3-aclist-list {
+    list-style: none;
+    margin: 0;
+    overflow: hidden;
+    padding: 0;
+}
+
+.yui3-aclist-item {
+    cursor: pointer;
+    list-style: none;
+    padding: 2px 5px;
+}
+
+.yui3-aclist-item-active { outline: #afafaf dotted thin; }

=== added directory 'debian/extras/jslibs/yui/autocomplete-list/assets/skins'
=== added directory 'debian/extras/jslibs/yui/autocomplete-list/assets/skins/night'
=== added file 'debian/extras/jslibs/yui/autocomplete-list/assets/skins/night/autocomplete-list-skin.css'
--- debian/extras/jslibs/yui/autocomplete-list/assets/skins/night/autocomplete-list-skin.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list/assets/skins/night/autocomplete-list-skin.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,57 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-skin-night [for=ac-input] { /* autocomplete label color */
+    color: #CBCBCB;
+}
+
+.yui3-skin-night .yui3-aclist-content {
+	font-size: 100%;
+    background-color: #151515;
+	color: #ccc;
+    border: 1px solid #303030;
+	-moz-box-shadow: 0 0 17px rgba(0,0,0,0.58);
+	-webkit-box-shadow: 0 0 17px rgba(0,0,0,0.58);
+	box-shadow: 0 0 17px rgba(0,0,0,0.58);
+}
+
+.yui3-skin-night .yui3-aclist-item-active {
+    background-color: #2F3030;
+    background: -moz-linear-gradient(
+		0% 100% 90deg,
+		#252626 0%,
+		#333434 100%
+	);
+    background: -webkit-gradient(
+        linear,
+        left top,
+        left bottom,
+        from(#333434),
+        to(#252626)
+    );
+}
+.yui3-skin-night .yui3-aclist-item-hover {
+    background-color: #262727;
+    background: -moz-linear-gradient(
+		0% 100% 90deg,
+		#202121 0%,
+		#282929 100%
+	);
+    background: -webkit-gradient(
+        linear,
+        left top,
+        left bottom,
+        from(#282929),
+        to(#202121)
+    );
+}
+
+.yui3-skin-night .yui3-aclist-item { 
+    padding: 0 1em;   /*0.4em 1em 0.6em*/
+    line-height: 2.25;
+}
+.yui3-skin-night .yui3-aclist-item-active { outline: none; }
+.yui3-skin-night .yui3-highlight { color:#EFEFEF; }

=== added file 'debian/extras/jslibs/yui/autocomplete-list/assets/skins/night/autocomplete-list.css'
--- debian/extras/jslibs/yui/autocomplete-list/assets/skins/night/autocomplete-list.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list/assets/skins/night/autocomplete-list.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-aclist{position:absolute;z-index:1}.yui3-aclist-hidden{visibility:hidden}.yui3-aclist-aria{left:-9999px;position:absolute}.yui3-aclist-list{list-style:none;margin:0;overflow:hidden;padding:0}.yui3-aclist-item{cursor:pointer;list-style:none;padding:2px 5px}.yui3-aclist-item-active{outline:#afafaf dotted thin}.yui3-skin-night [for=ac-input]{color:#cbcbcb}.yui3-skin-night .yui3-aclist-content{font-size:100%;background-color:#151515;color:#ccc;border:1px solid #303030;-moz-box-shadow:0 0 17px rgba(0,0,0,0.58);-webkit-box-shadow:0 0 17px rgba(0,0,0,0.58);box-shadow:0 0 17px rgba(0,0,0,0.58)}.yui3-skin-night .yui3-aclist-item-active{background-color:#2f3030;background:-moz-linear-gradient(0% 100% 90deg,#252626 0,#333434 100%);background:-webkit-gradient(linear,left top,left bottom,from(#333434),to(#252626))}.yui3-skin-night .yui3-aclist-item-hover{background-color:#262727;background:-moz-linear-gradient(0% 100% 90deg,#202121 0,#282929 100%);background:-webkit-gradient(linear,left top,left bottom,from(#282929),to(#202121))}.yui3-skin-night .yui3-aclist-item{padding:0 1em;line-height:2.25}.yui3-skin-night .yui3-aclist-item-active{outline:0}.yui3-skin-night .yui3-highlight{color:#efefef}#yui3-css-stamp.skin-night-autocomplete-list{display:none}

=== added directory 'debian/extras/jslibs/yui/autocomplete-list/assets/skins/sam'
=== added file 'debian/extras/jslibs/yui/autocomplete-list/assets/skins/sam/autocomplete-list-skin.css'
--- debian/extras/jslibs/yui/autocomplete-list/assets/skins/sam/autocomplete-list-skin.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list/assets/skins/sam/autocomplete-list-skin.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,23 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-skin-sam .yui3-aclist-content {
+    background: #fff;
+    border: 1px solid #afafaf;
+    -moz-box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.58);
+    -webkit-box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.58);
+    box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.58);
+}
+
+.yui3-skin-sam .yui3-aclist-item-hover {
+    background: #bfdaff;
+}
+
+.yui3-skin-sam .yui3-aclist-item-active {
+    background: #2647a0;
+    color: #fff;
+    outline: none;
+}

=== added file 'debian/extras/jslibs/yui/autocomplete-list/assets/skins/sam/autocomplete-list.css'
--- debian/extras/jslibs/yui/autocomplete-list/assets/skins/sam/autocomplete-list.css	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list/assets/skins/sam/autocomplete-list.css	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+.yui3-aclist{position:absolute;z-index:1}.yui3-aclist-hidden{visibility:hidden}.yui3-aclist-aria{left:-9999px;position:absolute}.yui3-aclist-list{list-style:none;margin:0;overflow:hidden;padding:0}.yui3-aclist-item{cursor:pointer;list-style:none;padding:2px 5px}.yui3-aclist-item-active{outline:#afafaf dotted thin}.yui3-skin-sam .yui3-aclist-content{background:#fff;border:1px solid #afafaf;-moz-box-shadow:1px 1px 4px rgba(0,0,0,0.58);-webkit-box-shadow:1px 1px 4px rgba(0,0,0,0.58);box-shadow:1px 1px 4px rgba(0,0,0,0.58)}.yui3-skin-sam .yui3-aclist-item-hover{background:#bfdaff}.yui3-skin-sam .yui3-aclist-item-active{background:#2647a0;color:#fff;outline:0}#yui3-css-stamp.skin-sam-autocomplete-list{display:none}

=== added file 'debian/extras/jslibs/yui/autocomplete-list/autocomplete-list-debug.js'
--- debian/extras/jslibs/yui/autocomplete-list/autocomplete-list-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list/autocomplete-list-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,893 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-list', function(Y) {
+
+/**
+Traditional autocomplete dropdown list widget, just like Mom used to make.
+
+@module autocomplete
+@submodule autocomplete-list
+**/
+
+/**
+Traditional autocomplete dropdown list widget, just like Mom used to make.
+
+@class AutoCompleteList
+@extends Widget
+@uses AutoCompleteBase
+@uses WidgetPosition
+@uses WidgetPositionAlign
+@constructor
+@param {Object} config Configuration object.
+**/
+
+var Lang   = Y.Lang,
+    Node   = Y.Node,
+    YArray = Y.Array,
+
+    // Whether or not we need an iframe shim.
+    useShim = Y.UA.ie && Y.UA.ie < 7,
+
+    // keyCode constants.
+    KEY_TAB = 9,
+
+    // String shorthand.
+    _CLASS_ITEM        = '_CLASS_ITEM',
+    _CLASS_ITEM_ACTIVE = '_CLASS_ITEM_ACTIVE',
+    _CLASS_ITEM_HOVER  = '_CLASS_ITEM_HOVER',
+    _SELECTOR_ITEM     = '_SELECTOR_ITEM',
+
+    ACTIVE_ITEM      = 'activeItem',
+    ALWAYS_SHOW_LIST = 'alwaysShowList',
+    CIRCULAR         = 'circular',
+    HOVERED_ITEM     = 'hoveredItem',
+    ID               = 'id',
+    ITEM             = 'item',
+    LIST             = 'list',
+    RESULT           = 'result',
+    RESULTS          = 'results',
+    VISIBLE          = 'visible',
+    WIDTH            = 'width',
+
+    // Event names.
+    EVT_SELECT = 'select',
+
+List = Y.Base.create('autocompleteList', Y.Widget, [
+    Y.AutoCompleteBase,
+    Y.WidgetPosition,
+    Y.WidgetPositionAlign
+], {
+    // -- Prototype Properties -------------------------------------------------
+    ARIA_TEMPLATE: '<div/>',
+    ITEM_TEMPLATE: '<li/>',
+    LIST_TEMPLATE: '<ul/>',
+
+    // Widget automatically attaches delegated event handlers to everything in
+    // Y.Node.DOM_EVENTS, including synthetic events. Since Widget's event
+    // delegation won't work for the synthetic valuechange event, and since
+    // it creates a name collision between the backcompat "valueChange" synth
+    // event alias and AutoCompleteList's "valueChange" event for the "value"
+    // attr, this hack is necessary in order to prevent Widget from attaching
+    // valuechange handlers.
+    UI_EVENTS: (function () {
+        var uiEvents = Y.merge(Y.Node.DOM_EVENTS);
+
+        delete uiEvents.valuechange;
+        delete uiEvents.valueChange;
+
+        return uiEvents;
+    }()),
+
+    // -- Lifecycle Prototype Methods ------------------------------------------
+    initializer: function () {
+        var inputNode = this.get('inputNode');
+
+        if (!inputNode) {
+            Y.error('No inputNode specified.');
+            return;
+        }
+
+        this._inputNode  = inputNode;
+        this._listEvents = [];
+
+        // This ensures that the list is rendered inside the same parent as the
+        // input node by default, which is necessary for proper ARIA support.
+        this.DEF_PARENT_NODE = inputNode.get('parentNode');
+
+        // Cache commonly used classnames and selectors for performance.
+        this[_CLASS_ITEM]        = this.getClassName(ITEM);
+        this[_CLASS_ITEM_ACTIVE] = this.getClassName(ITEM, 'active');
+        this[_CLASS_ITEM_HOVER]  = this.getClassName(ITEM, 'hover');
+        this[_SELECTOR_ITEM]     = '.' + this[_CLASS_ITEM];
+
+        /**
+        Fires when an autocomplete suggestion is selected from the list,
+        typically via a keyboard action or mouse click.
+
+        @event select
+        @param {Node} itemNode List item node that was selected.
+        @param {Object} result AutoComplete result object.
+        @preventable _defSelectFn
+        **/
+        this.publish(EVT_SELECT, {
+            defaultFn: this._defSelectFn
+        });
+    },
+
+    destructor: function () {
+        while (this._listEvents.length) {
+            this._listEvents.pop().detach();
+        }
+
+        if (this._ariaNode) {
+            this._ariaNode.remove().destroy(true);
+        }
+    },
+
+    bindUI: function () {
+        this._bindInput();
+        this._bindList();
+    },
+
+    renderUI: function () {
+        var ariaNode    = this._createAriaNode(),
+            boundingBox = this.get('boundingBox'),
+            contentBox  = this.get('contentBox'),
+            inputNode   = this._inputNode,
+            listNode    = this._createListNode(),
+            parentNode  = inputNode.get('parentNode');
+
+        inputNode.addClass(this.getClassName('input')).setAttrs({
+            'aria-autocomplete': LIST,
+            'aria-expanded'    : false,
+            'aria-owns'        : listNode.get('id')
+        });
+
+        // ARIA node must be outside the widget or announcements won't be made
+        // when the widget is hidden.
+        parentNode.append(ariaNode);
+
+        // Add an iframe shim for IE6.
+        if (useShim) {
+            boundingBox.plug(Y.Plugin.Shim);
+        }
+
+        // Force position: absolute on the boundingBox. This works around a
+        // potential CSS loading race condition in Gecko that can cause the
+        // boundingBox to become relatively positioned, which is all kinds of
+        // no good.
+        boundingBox.setStyle('position', 'absolute');
+
+        this._ariaNode    = ariaNode;
+        this._boundingBox = boundingBox;
+        this._contentBox  = contentBox;
+        this._listNode    = listNode;
+        this._parentNode  = parentNode;
+    },
+
+    syncUI: function () {
+        // No need to call _syncPosition() here; the other _sync methods will
+        // call it when necessary.
+        this._syncResults();
+        this._syncVisibility();
+    },
+
+    // -- Public Prototype Methods ---------------------------------------------
+
+    /**
+    Hides the list, unless the `alwaysShowList` attribute is `true`.
+
+    @method hide
+    @see show
+    @chainable
+    **/
+    hide: function () {
+        return this.get(ALWAYS_SHOW_LIST) ? this : this.set(VISIBLE, false);
+    },
+
+    /**
+    Selects the specified _itemNode_, or the current `activeItem` if _itemNode_
+    is not specified.
+
+    @method selectItem
+    @param {Node} [itemNode] Item node to select.
+    @param {EventFacade} [originEvent] Event that triggered the selection, if
+        any.
+    @chainable
+    **/
+    selectItem: function (itemNode, originEvent) {
+        if (itemNode) {
+            if (!itemNode.hasClass(this[_CLASS_ITEM])) {
+                return this;
+            }
+        } else {
+            itemNode = this.get(ACTIVE_ITEM);
+
+            if (!itemNode) {
+                return this;
+            }
+        }
+
+        this.fire(EVT_SELECT, {
+            itemNode   : itemNode,
+            originEvent: originEvent || null,
+            result     : itemNode.getData(RESULT)
+        });
+
+        return this;
+    },
+
+    // -- Protected Prototype Methods ------------------------------------------
+
+    /**
+    Activates the next item after the currently active item. If there is no next
+    item and the `circular` attribute is `true`, focus will wrap back to the
+    input node.
+
+    @method _activateNextItem
+    @chainable
+    @protected
+    **/
+    _activateNextItem: function () {
+        var item = this.get(ACTIVE_ITEM),
+            nextItem;
+
+        if (item) {
+            nextItem = item.next(this[_SELECTOR_ITEM]) ||
+                    (this.get(CIRCULAR) ? null : item);
+        } else {
+            nextItem = this._getFirstItemNode();
+        }
+
+        this.set(ACTIVE_ITEM, nextItem);
+
+        return this;
+    },
+
+    /**
+    Activates the item previous to the currently active item. If there is no
+    previous item and the `circular` attribute is `true`, focus will wrap back
+    to the input node.
+
+    @method _activatePrevItem
+    @chainable
+    @protected
+    **/
+    _activatePrevItem: function () {
+        var item     = this.get(ACTIVE_ITEM),
+            prevItem = item ? item.previous(this[_SELECTOR_ITEM]) :
+                    this.get(CIRCULAR) && this._getLastItemNode();
+
+        this.set(ACTIVE_ITEM, prevItem || null);
+
+        return this;
+    },
+
+    /**
+    Appends the specified result _items_ to the list inside a new item node.
+
+    @method _add
+    @param {Array|Node|HTMLElement|String} items Result item or array of
+        result items.
+    @return {NodeList} Added nodes.
+    @protected
+    **/
+    _add: function (items) {
+        var itemNodes = [];
+
+        YArray.each(Lang.isArray(items) ? items : [items], function (item) {
+            itemNodes.push(this._createItemNode(item).setData(RESULT, item));
+        }, this);
+
+        itemNodes = Y.all(itemNodes);
+        this._listNode.append(itemNodes.toFrag());
+
+        return itemNodes;
+    },
+
+    /**
+    Updates the ARIA live region with the specified message.
+
+    @method _ariaSay
+    @param {String} stringId String id (from the `strings` attribute) of the
+        message to speak.
+    @param {Object} [subs] Substitutions for placeholders in the string.
+    @protected
+    **/
+    _ariaSay: function (stringId, subs) {
+        var message = this.get('strings.' + stringId);
+        this._ariaNode.set('text', subs ? Lang.sub(message, subs) : message);
+    },
+
+    /**
+    Binds `inputNode` events and behavior.
+
+    @method _bindInput
+    @protected
+    **/
+    _bindInput: function () {
+        var inputNode = this._inputNode,
+            alignNode, alignWidth, tokenInput;
+
+        // Null align means we can auto-align. Set align to false to prevent
+        // auto-alignment, or a valid alignment config to customize the
+        // alignment.
+        if (this.get('align') === null) {
+            // If this is a tokenInput, align with its bounding box.
+            // Otherwise, align with the inputNode. Bit of a cheat.
+            tokenInput = this.get('tokenInput');
+            alignNode  = (tokenInput && tokenInput.get('boundingBox')) || inputNode;
+
+            this.set('align', {
+                node  : alignNode,
+                points: ['tl', 'bl']
+            });
+
+            // If no width config is set, attempt to set the list's width to the
+            // width of the alignment node. If the alignment node's width is
+            // falsy, do nothing.
+            if (!this.get(WIDTH) && (alignWidth = alignNode.get('offsetWidth'))) {
+                this.set(WIDTH, alignWidth);
+            }
+        }
+
+        // Attach inputNode events.
+        this._listEvents.concat([
+            inputNode.after('blur',  this._afterListInputBlur, this),
+            inputNode.after('focus', this._afterListInputFocus, this)
+        ]);
+    },
+
+    /**
+    Binds list events.
+
+    @method _bindList
+    @protected
+    **/
+    _bindList: function () {
+        this._listEvents.concat([
+            Y.one('doc').after('click', this._afterDocClick, this),
+            Y.one('win').after('windowresize', this._syncPosition, this),
+
+            this.after({
+                mouseover: this._afterMouseOver,
+                mouseout : this._afterMouseOut,
+
+                activeItemChange    : this._afterActiveItemChange,
+                alwaysShowListChange: this._afterAlwaysShowListChange,
+                hoveredItemChange   : this._afterHoveredItemChange,
+                resultsChange       : this._afterResultsChange,
+                visibleChange       : this._afterVisibleChange
+            }),
+
+            this._listNode.delegate('click', this._onItemClick,
+                    this[_SELECTOR_ITEM], this)
+        ]);
+    },
+
+    /**
+    Clears the contents of the tray.
+
+    @method _clear
+    @protected
+    **/
+    _clear: function () {
+        this.set(ACTIVE_ITEM, null);
+        this._set(HOVERED_ITEM, null);
+
+        this._listNode.get('children').remove(true);
+    },
+
+    /**
+    Creates and returns an ARIA live region node.
+
+    @method _createAriaNode
+    @return {Node} ARIA node.
+    @protected
+    **/
+    _createAriaNode: function () {
+        var ariaNode = Node.create(this.ARIA_TEMPLATE);
+
+        return ariaNode.addClass(this.getClassName('aria')).setAttrs({
+            'aria-live': 'polite',
+            role       : 'status'
+        });
+    },
+
+    /**
+    Creates and returns an item node with the specified _content_.
+
+    @method _createItemNode
+    @param {Object} result Result object.
+    @return {Node} Item node.
+    @protected
+    **/
+    _createItemNode: function (result) {
+        var itemNode = Node.create(this.ITEM_TEMPLATE);
+
+        return itemNode.addClass(this[_CLASS_ITEM]).setAttrs({
+            id  : Y.stamp(itemNode),
+            role: 'option'
+        }).setAttribute('data-text', result.text).append(result.display);
+    },
+
+    /**
+    Creates and returns a list node. If the `listNode` attribute is already set
+    to an existing node, that node will be used.
+
+    @method _createListNode
+    @return {Node} List node.
+    @protected
+    **/
+    _createListNode: function () {
+        var listNode = this.get('listNode') || Node.create(this.LIST_TEMPLATE);
+
+        listNode.addClass(this.getClassName(LIST)).setAttrs({
+            id  : Y.stamp(listNode),
+            role: 'listbox'
+        });
+
+        this._set('listNode', listNode);
+        this.get('contentBox').append(listNode);
+
+        return listNode;
+    },
+
+    /**
+    Gets the first item node in the list, or `null` if the list is empty.
+
+    @method _getFirstItemNode
+    @return {Node|null}
+    @protected
+    **/
+    _getFirstItemNode: function () {
+        return this._listNode.one(this[_SELECTOR_ITEM]);
+    },
+
+    /**
+    Gets the last item node in the list, or `null` if the list is empty.
+
+    @method _getLastItemNode
+    @return {Node|null}
+    @protected
+    **/
+    _getLastItemNode: function () {
+        return this._listNode.one(this[_SELECTOR_ITEM] + ':last-child');
+    },
+
+    /**
+    Synchronizes the result list's position and alignment.
+
+    @method _syncPosition
+    @protected
+    **/
+    _syncPosition: function () {
+        // Force WidgetPositionAlign to refresh its alignment.
+        this._syncUIPosAlign();
+
+        // Resize the IE6 iframe shim to match the list's dimensions.
+        this._syncShim();
+    },
+
+    /**
+    Synchronizes the results displayed in the list with those in the _results_
+    argument, or with the `results` attribute if an argument is not provided.
+
+    @method _syncResults
+    @param {Array} [results] Results.
+    @protected
+    **/
+    _syncResults: function (results) {
+        if (!results) {
+            results = this.get(RESULTS);
+        }
+
+        this._clear();
+
+        if (results.length) {
+            this._add(results);
+            this._ariaSay('items_available');
+        }
+
+        this._syncPosition();
+
+        if (this.get('activateFirstItem') && !this.get(ACTIVE_ITEM)) {
+            this.set(ACTIVE_ITEM, this._getFirstItemNode());
+        }
+    },
+
+    /**
+    Synchronizes the size of the iframe shim used for IE6 and lower. In other
+    browsers, this method is a noop.
+
+    @method _syncShim
+    @protected
+    **/
+    _syncShim: useShim ? function () {
+        this._boundingBox.shim.sync();
+    } : function () {},
+
+    /**
+    Synchronizes the visibility of the tray with the _visible_ argument, or with
+    the `visible` attribute if an argument is not provided.
+
+    @method _syncVisibility
+    @param {Boolean} [visible] Visibility.
+    @protected
+    **/
+    _syncVisibility: function (visible) {
+        if (this.get(ALWAYS_SHOW_LIST)) {
+            visible = true;
+            this.set(VISIBLE, visible);
+        }
+
+        if (typeof visible === 'undefined') {
+            visible = this.get(VISIBLE);
+        }
+
+        this._inputNode.set('aria-expanded', visible);
+        this._boundingBox.set('aria-hidden', !visible);
+
+        if (visible) {
+            this._syncPosition();
+        } else {
+            this.set(ACTIVE_ITEM, null);
+            this._set(HOVERED_ITEM, null);
+
+            // Force a reflow to work around a glitch in IE6 and 7 where some of
+            // the contents of the list will sometimes remain visible after the
+            // container is hidden.
+            this._boundingBox.get('offsetWidth');
+        }
+
+        // In some pages, IE7 fails to repaint the contents of the list after it
+        // becomes visible. Toggling a bogus class on the body forces a repaint
+        // that fixes the issue.
+        if (Y.UA.ie === 7) {
+            Y.one('body')
+                .addClass('yui3-ie7-sucks')
+                .removeClass('yui3-ie7-sucks');
+        }
+    },
+
+    // -- Protected Event Handlers ---------------------------------------------
+
+    /**
+    Handles `activeItemChange` events.
+
+    @method _afterActiveItemChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterActiveItemChange: function (e) {
+        var inputNode = this._inputNode,
+            newVal    = e.newVal,
+            prevVal   = e.prevVal,
+            node;
+
+        // The previous item may have disappeared by the time this handler runs,
+        // so we need to be careful.
+        if (prevVal && prevVal._node) {
+            prevVal.removeClass(this[_CLASS_ITEM_ACTIVE]);
+        }
+
+        if (newVal) {
+            newVal.addClass(this[_CLASS_ITEM_ACTIVE]);
+            inputNode.set('aria-activedescendant', newVal.get(ID));
+        } else {
+            inputNode.removeAttribute('aria-activedescendant');
+        }
+
+        if (this.get('scrollIntoView')) {
+            node = newVal || inputNode;
+
+            if (!node.inRegion(Y.DOM.viewportRegion(), true)
+                    || !node.inRegion(this._contentBox, true)) {
+
+                node.scrollIntoView();
+            }
+        }
+    },
+
+    /**
+    Handles `alwaysShowListChange` events.
+
+    @method _afterAlwaysShowListChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterAlwaysShowListChange: function (e) {
+        this.set(VISIBLE, e.newVal || this.get(RESULTS).length > 0);
+    },
+
+    /**
+    Handles click events on the document. If the click is outside both the
+    input node and the bounding box, the list will be hidden.
+
+    @method _afterDocClick
+    @param {EventFacade} e
+    @protected
+    @since 3.5.0
+    **/
+    _afterDocClick: function (e) {
+        var boundingBox = this._boundingBox,
+            target      = e.target;
+
+        if (target !== this._inputNode && target !== boundingBox &&
+                !boundingBox.one(target.get('id'))) {
+
+            this.hide();
+        }
+    },
+
+    /**
+    Handles `hoveredItemChange` events.
+
+    @method _afterHoveredItemChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterHoveredItemChange: function (e) {
+        var newVal  = e.newVal,
+            prevVal = e.prevVal;
+
+        if (prevVal) {
+            prevVal.removeClass(this[_CLASS_ITEM_HOVER]);
+        }
+
+        if (newVal) {
+            newVal.addClass(this[_CLASS_ITEM_HOVER]);
+        }
+    },
+
+    /**
+    Handles `inputNode` blur events.
+
+    @method _afterListInputBlur
+    @protected
+    **/
+    _afterListInputBlur: function () {
+        this._listInputFocused = false;
+
+        if (this.get(VISIBLE) &&
+                !this._mouseOverList &&
+                (this._lastInputKey !== KEY_TAB ||
+                    !this.get('tabSelect') ||
+                    !this.get(ACTIVE_ITEM))) {
+            this.hide();
+        }
+    },
+
+    /**
+    Handles `inputNode` focus events.
+
+    @method _afterListInputFocus
+    @protected
+    **/
+    _afterListInputFocus: function () {
+        this._listInputFocused = true;
+    },
+
+    /**
+    Handles `mouseover` events.
+
+    @method _afterMouseOver
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterMouseOver: function (e) {
+        var itemNode = e.domEvent.target.ancestor(this[_SELECTOR_ITEM], true);
+
+        this._mouseOverList = true;
+
+        if (itemNode) {
+            this._set(HOVERED_ITEM, itemNode);
+        }
+    },
+
+    /**
+    Handles `mouseout` events.
+
+    @method _afterMouseOut
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterMouseOut: function () {
+        this._mouseOverList = false;
+        this._set(HOVERED_ITEM, null);
+    },
+
+    /**
+    Handles `resultsChange` events.
+
+    @method _afterResultsChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterResultsChange: function (e) {
+        this._syncResults(e.newVal);
+
+        if (!this.get(ALWAYS_SHOW_LIST)) {
+            this.set(VISIBLE, !!e.newVal.length);
+        }
+    },
+
+    /**
+    Handles `visibleChange` events.
+
+    @method _afterVisibleChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterVisibleChange: function (e) {
+        this._syncVisibility(!!e.newVal);
+    },
+
+    /**
+    Delegated event handler for item `click` events.
+
+    @method _onItemClick
+    @param {EventFacade} e
+    @protected
+    **/
+    _onItemClick: function (e) {
+        var itemNode = e.currentTarget;
+
+        this.set(ACTIVE_ITEM, itemNode);
+        this.selectItem(itemNode, e);
+    },
+
+    // -- Protected Default Event Handlers -------------------------------------
+
+    /**
+    Default `select` event handler.
+
+    @method _defSelectFn
+    @param {EventFacade} e
+    @protected
+    **/
+    _defSelectFn: function (e) {
+        var text = e.result.text;
+
+        // TODO: support typeahead completion, etc.
+        this._inputNode.focus();
+        this._updateValue(text);
+        this._ariaSay('item_selected', {item: text});
+        this.hide();
+    }
+}, {
+    ATTRS: {
+        /**
+        If `true`, the first item in the list will be activated by default when
+        the list is initially displayed and when results change.
+
+        @attribute activateFirstItem
+        @type Boolean
+        @default false
+        **/
+        activateFirstItem: {
+            value: false
+        },
+
+        /**
+        Item that's currently active, if any. When the user presses enter, this
+        is the item that will be selected.
+
+        @attribute activeItem
+        @type Node
+        **/
+        activeItem: {
+            setter: Y.one,
+            value: null
+        },
+
+        /**
+        If `true`, the list will remain visible even when there are no results
+        to display.
+
+        @attribute alwaysShowList
+        @type Boolean
+        @default false
+        **/
+        alwaysShowList: {
+            value: false
+        },
+
+        /**
+        If `true`, keyboard navigation will wrap around to the opposite end of
+        the list when navigating past the first or last item.
+
+        @attribute circular
+        @type Boolean
+        @default true
+        **/
+        circular: {
+            value: true
+        },
+
+        /**
+        Item currently being hovered over by the mouse, if any.
+
+        @attribute hoveredItem
+        @type Node|null
+        @readOnly
+        **/
+        hoveredItem: {
+            readOnly: true,
+            value: null
+        },
+
+        /**
+        Node that will contain result items.
+
+        @attribute listNode
+        @type Node|null
+        @initOnly
+        **/
+        listNode: {
+            writeOnce: 'initOnly',
+            value: null
+        },
+
+        /**
+        If `true`, the viewport will be scrolled to ensure that the active list
+        item is visible when necessary.
+
+        @attribute scrollIntoView
+        @type Boolean
+        @default false
+        **/
+        scrollIntoView: {
+            value: false
+        },
+
+        /**
+        Translatable strings used by the AutoCompleteList widget.
+
+        @attribute strings
+        @type Object
+        **/
+        strings: {
+            valueFn: function () {
+                return Y.Intl.get('autocomplete-list');
+            }
+        },
+
+        /**
+        If `true`, pressing the tab key while the list is visible will select
+        the active item, if any.
+
+        @attribute tabSelect
+        @type Boolean
+        @default true
+        **/
+        tabSelect: {
+            value: true
+        },
+
+        // The "visible" attribute is documented in Widget.
+        visible: {
+            value: false
+        }
+    },
+
+    CSS_PREFIX: Y.ClassNameManager.getClassName('aclist')
+});
+
+Y.AutoCompleteList = List;
+
+/**
+Alias for <a href="AutoCompleteList.html">`AutoCompleteList`</a>. See that class
+for API docs.
+
+@class AutoComplete
+**/
+
+Y.AutoComplete = List;
+
+
+}, '3.5.1' ,{requires:['autocomplete-base', 'event-resize', 'node-screen', 'selector-css3', 'shim-plugin', 'widget', 'widget-position', 'widget-position-align'], skinnable:true, after:['autocomplete-sources'], lang:['en']});

=== added file 'debian/extras/jslibs/yui/autocomplete-list/autocomplete-list-min.js'
--- debian/extras/jslibs/yui/autocomplete-list/autocomplete-list-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list/autocomplete-list-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,8 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("autocomplete-list",function(b){var i=b.Lang,v=b.Node,l=b.Array,h=b.UA.ie&&b.UA.ie<7,p=9,s="_CLASS_ITEM",t="_CLASS_ITEM_ACTIVE",d="_CLASS_ITEM_HOVER",u="_SELECTOR_ITEM",f="activeItem",k="alwaysShowList",o="circular",r="hoveredItem",m="id",e="item",c="list",w="result",j="results",q="visible",g="width",n="select",a=b.Base.create("autocompleteList",b.Widget,[b.AutoCompleteBase,b.WidgetPosition,b.WidgetPositionAlign],{ARIA_TEMPLATE:"<div/>",ITEM_TEMPLATE:"<li/>",LIST_TEMPLATE:"<ul/>",UI_EVENTS:(function(){var x=b.merge(b.Node.DOM_EVENTS);delete x.valuechange;delete x.valueChange;return x;}()),initializer:function(){var x=this.get("inputNode");if(!x){b.error("No inputNode specified.");return;}this._inputNode=x;this._listEvents=[];this.DEF_PARENT_NODE=x.get("parentNode");this[s]=this.getClassName(e);this[t]=this.getClassName(e,"active");this[d]=this.getClassName(e,"hover");this[u]="."+this[s];this.publish(n,{defaultFn:this._defSelectFn});},destructor:function(){while(this._listEvents.length){this._listEvents.pop().detach();}if(this._ariaNode){this._ariaNode.remove().destroy(true);}},bindUI:function(){this._bindInput();this._bindList();},renderUI:function(){var C=this._createAriaNode(),z=this.get("boundingBox"),y=this.get("contentBox"),B=this._inputNode,A=this._createListNode(),x=B.get("parentNode");B.addClass(this.getClassName("input")).setAttrs({"aria-autocomplete":c,"aria-expanded":false,"aria-owns":A.get("id")});x.append(C);if(h){z.plug(b.Plugin.Shim);}z.setStyle("position","absolute");this._ariaNode=C;this._boundingBox=z;this._contentBox=y;this._listNode=A;this._parentNode=x;},syncUI:function(){this._syncResults();this._syncVisibility();},hide:function(){return this.get(k)?this:this.set(q,false);},selectItem:function(y,x){if(y){if(!y.hasClass(this[s])){return this;}}else{y=this.get(f);if(!y){return this;}}this.fire(n,{itemNode:y,originEvent:x||null,result:y.getData(w)});return this;},_activateNextItem:function(){var y=this.get(f),x;if(y){x=y.next(this[u])||(this.get(o)?null:y);}else{x=this._getFirstItemNode();}this.set(f,x);return this;},_activatePrevItem:function(){var y=this.get(f),x=y?y.previous(this[u]):this.get(o)&&this._getLastItemNode();this.set(f,x||null);return this;},_add:function(x){var y=[];l.each(i.isArray(x)?x:[x],function(z){y.push(this._createItemNode(z).setData(w,z));},this);y=b.all(y);this._listNode.append(y.toFrag());return y;},_ariaSay:function(z,x){var y=this.get("strings."+z);this._ariaNode.set("text",x?i.sub(y,x):y);},_bindInput:function(){var A=this._inputNode,y,z,x;if(this.get("align")===null){x=this.get("tokenInput");y=(x&&x.get("boundingBox"))||A;this.set("align",{node:y,points:["tl","bl"]});if(!this.get(g)&&(z=y.get("offsetWidth"))){this.set(g,z);}}this._listEvents.concat([A.after("blur",this._afterListInputBlur,this),A.after("focus",this._afterListInputFocus,this)]);},_bindList:function(){this._listEvents.concat([b.one("doc").after("click",this._afterDocClick,this),b.one("win").after("windowresize",this._syncPosition,this),this.after({mouseover:this._afterMouseOver,mouseout:this._afterMouseOut,activeItemChange:this._afterActiveItemChange,alwaysShowListChange:this._afterAlwaysShowListChange,hoveredItemChange:this._afterHoveredItemChange,resultsChange:this._afterResultsChange,visibleChange:this._afterVisibleChange}),this._listNode.delegate("click",this._onItemClick,this[u],this)]);},_clear:function(){this.set(f,null);this._set(r,null);this._listNode.get("children").remove(true);},_createAriaNode:function(){var x=v.create(this.ARIA_TEMPLATE);return x.addClass(this.getClassName("aria")).setAttrs({"aria-live":"polite",role:"status"});},_createItemNode:function(x){var y=v.create(this.ITEM_TEMPLATE);return y.addClass(this[s]).setAttrs({id:b.stamp(y),role:"option"}).setAttribute("data-text",x.text).append(x.display);},_createListNode:function(){var x=this.get("listNode")||v.create(this.LIST_TEMPLATE);x.addClass(this.getClassName(c)).setAttrs({id:b.stamp(x),role:"listbox"});this._set("listNode",x);this.get("contentBox").append(x);return x;},_getFirstItemNode:function(){return this._listNode.one(this[u]);},_getLastItemNode:function(){return this._listNode.one(this[u]+":last-child");},_syncPosition:function(){this._syncUIPosAlign();this._syncShim();},_syncResults:function(x){if(!x){x=this.get(j);}this._clear();if(x.length){this._add(x);this._ariaSay("items_available");}this._syncPosition();if(this.get("activateFirstItem")&&!this.get(f)){this.set(f,this._getFirstItemNode());}},_syncShim:h?function(){this._boundingBox.shim.sync();}:function(){},_syncVisibility:function(x){if(this.get(k)){x=true;this.set(q,x);}if(typeof x==="undefined"){x=this.get(q);}this._inputNode.set("aria-expanded",x);this._boundingBox.set("aria-hidden",!x);if(x){this._syncPosition();}else{this.set(f,null);this._set(r,null);this._boundingBox.get("offsetWidth");}if(b.UA.ie===7){b.one("body").addClass("yui3-ie7-sucks").removeClass("yui3-ie7-sucks");}},_afterActiveItemChange:function(A){var z=this._inputNode,x=A.newVal,B=A.prevVal,y;if(B&&B._node){B.removeClass(this[t]);}if(x){x.addClass(this[t]);z.set("aria-activedescendant",x.get(m));}else{z.removeAttribute("aria-activedescendant");}if(this.get("scrollIntoView")){y=x||z;if(!y.inRegion(b.DOM.viewportRegion(),true)||!y.inRegion(this._contentBox,true)){y.scrollIntoView();}}},_afterAlwaysShowListChange:function(x){this.set(q,x.newVal||this.get(j).length>0);},_afterDocClick:function(z){var x=this._boundingBox,y=z.target;if(y!==this._inputNode&&y!==x&&!x.one(y.get("id"))){this.hide();}},_afterHoveredItemChange:function(y){var x=y.newVal,z=y.prevVal;if(z){z.removeClass(this[d]);}if(x){x.addClass(this[d]);}},_afterListInputBlur:function(){this._listInputFocused=false;if(this.get(q)&&!this._mouseOverList&&(this._lastInputKey!==p||!this.get("tabSelect")||!this.get(f))){this.hide();}},_afterListInputFocus:function(){this._listInputFocused=true;},_afterMouseOver:function(x){var y=x.domEvent.target.ancestor(this[u],true);this._mouseOverList=true;if(y){this._set(r,y);
+}},_afterMouseOut:function(){this._mouseOverList=false;this._set(r,null);},_afterResultsChange:function(x){this._syncResults(x.newVal);if(!this.get(k)){this.set(q,!!x.newVal.length);}},_afterVisibleChange:function(x){this._syncVisibility(!!x.newVal);},_onItemClick:function(x){var y=x.currentTarget;this.set(f,y);this.selectItem(y,x);},_defSelectFn:function(x){var y=x.result.text;this._inputNode.focus();this._updateValue(y);this._ariaSay("item_selected",{item:y});this.hide();}},{ATTRS:{activateFirstItem:{value:false},activeItem:{setter:b.one,value:null},alwaysShowList:{value:false},circular:{value:true},hoveredItem:{readOnly:true,value:null},listNode:{writeOnce:"initOnly",value:null},scrollIntoView:{value:false},strings:{valueFn:function(){return b.Intl.get("autocomplete-list");}},tabSelect:{value:true},visible:{value:false}},CSS_PREFIX:b.ClassNameManager.getClassName("aclist")});b.AutoCompleteList=a;b.AutoComplete=a;},"3.5.1",{requires:["autocomplete-base","event-resize","node-screen","selector-css3","shim-plugin","widget","widget-position","widget-position-align"],skinnable:true,after:["autocomplete-sources"],lang:["en"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/autocomplete-list/autocomplete-list.js'
--- debian/extras/jslibs/yui/autocomplete-list/autocomplete-list.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list/autocomplete-list.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,893 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-list', function(Y) {
+
+/**
+Traditional autocomplete dropdown list widget, just like Mom used to make.
+
+@module autocomplete
+@submodule autocomplete-list
+**/
+
+/**
+Traditional autocomplete dropdown list widget, just like Mom used to make.
+
+@class AutoCompleteList
+@extends Widget
+@uses AutoCompleteBase
+@uses WidgetPosition
+@uses WidgetPositionAlign
+@constructor
+@param {Object} config Configuration object.
+**/
+
+var Lang   = Y.Lang,
+    Node   = Y.Node,
+    YArray = Y.Array,
+
+    // Whether or not we need an iframe shim.
+    useShim = Y.UA.ie && Y.UA.ie < 7,
+
+    // keyCode constants.
+    KEY_TAB = 9,
+
+    // String shorthand.
+    _CLASS_ITEM        = '_CLASS_ITEM',
+    _CLASS_ITEM_ACTIVE = '_CLASS_ITEM_ACTIVE',
+    _CLASS_ITEM_HOVER  = '_CLASS_ITEM_HOVER',
+    _SELECTOR_ITEM     = '_SELECTOR_ITEM',
+
+    ACTIVE_ITEM      = 'activeItem',
+    ALWAYS_SHOW_LIST = 'alwaysShowList',
+    CIRCULAR         = 'circular',
+    HOVERED_ITEM     = 'hoveredItem',
+    ID               = 'id',
+    ITEM             = 'item',
+    LIST             = 'list',
+    RESULT           = 'result',
+    RESULTS          = 'results',
+    VISIBLE          = 'visible',
+    WIDTH            = 'width',
+
+    // Event names.
+    EVT_SELECT = 'select',
+
+List = Y.Base.create('autocompleteList', Y.Widget, [
+    Y.AutoCompleteBase,
+    Y.WidgetPosition,
+    Y.WidgetPositionAlign
+], {
+    // -- Prototype Properties -------------------------------------------------
+    ARIA_TEMPLATE: '<div/>',
+    ITEM_TEMPLATE: '<li/>',
+    LIST_TEMPLATE: '<ul/>',
+
+    // Widget automatically attaches delegated event handlers to everything in
+    // Y.Node.DOM_EVENTS, including synthetic events. Since Widget's event
+    // delegation won't work for the synthetic valuechange event, and since
+    // it creates a name collision between the backcompat "valueChange" synth
+    // event alias and AutoCompleteList's "valueChange" event for the "value"
+    // attr, this hack is necessary in order to prevent Widget from attaching
+    // valuechange handlers.
+    UI_EVENTS: (function () {
+        var uiEvents = Y.merge(Y.Node.DOM_EVENTS);
+
+        delete uiEvents.valuechange;
+        delete uiEvents.valueChange;
+
+        return uiEvents;
+    }()),
+
+    // -- Lifecycle Prototype Methods ------------------------------------------
+    initializer: function () {
+        var inputNode = this.get('inputNode');
+
+        if (!inputNode) {
+            Y.error('No inputNode specified.');
+            return;
+        }
+
+        this._inputNode  = inputNode;
+        this._listEvents = [];
+
+        // This ensures that the list is rendered inside the same parent as the
+        // input node by default, which is necessary for proper ARIA support.
+        this.DEF_PARENT_NODE = inputNode.get('parentNode');
+
+        // Cache commonly used classnames and selectors for performance.
+        this[_CLASS_ITEM]        = this.getClassName(ITEM);
+        this[_CLASS_ITEM_ACTIVE] = this.getClassName(ITEM, 'active');
+        this[_CLASS_ITEM_HOVER]  = this.getClassName(ITEM, 'hover');
+        this[_SELECTOR_ITEM]     = '.' + this[_CLASS_ITEM];
+
+        /**
+        Fires when an autocomplete suggestion is selected from the list,
+        typically via a keyboard action or mouse click.
+
+        @event select
+        @param {Node} itemNode List item node that was selected.
+        @param {Object} result AutoComplete result object.
+        @preventable _defSelectFn
+        **/
+        this.publish(EVT_SELECT, {
+            defaultFn: this._defSelectFn
+        });
+    },
+
+    destructor: function () {
+        while (this._listEvents.length) {
+            this._listEvents.pop().detach();
+        }
+
+        if (this._ariaNode) {
+            this._ariaNode.remove().destroy(true);
+        }
+    },
+
+    bindUI: function () {
+        this._bindInput();
+        this._bindList();
+    },
+
+    renderUI: function () {
+        var ariaNode    = this._createAriaNode(),
+            boundingBox = this.get('boundingBox'),
+            contentBox  = this.get('contentBox'),
+            inputNode   = this._inputNode,
+            listNode    = this._createListNode(),
+            parentNode  = inputNode.get('parentNode');
+
+        inputNode.addClass(this.getClassName('input')).setAttrs({
+            'aria-autocomplete': LIST,
+            'aria-expanded'    : false,
+            'aria-owns'        : listNode.get('id')
+        });
+
+        // ARIA node must be outside the widget or announcements won't be made
+        // when the widget is hidden.
+        parentNode.append(ariaNode);
+
+        // Add an iframe shim for IE6.
+        if (useShim) {
+            boundingBox.plug(Y.Plugin.Shim);
+        }
+
+        // Force position: absolute on the boundingBox. This works around a
+        // potential CSS loading race condition in Gecko that can cause the
+        // boundingBox to become relatively positioned, which is all kinds of
+        // no good.
+        boundingBox.setStyle('position', 'absolute');
+
+        this._ariaNode    = ariaNode;
+        this._boundingBox = boundingBox;
+        this._contentBox  = contentBox;
+        this._listNode    = listNode;
+        this._parentNode  = parentNode;
+    },
+
+    syncUI: function () {
+        // No need to call _syncPosition() here; the other _sync methods will
+        // call it when necessary.
+        this._syncResults();
+        this._syncVisibility();
+    },
+
+    // -- Public Prototype Methods ---------------------------------------------
+
+    /**
+    Hides the list, unless the `alwaysShowList` attribute is `true`.
+
+    @method hide
+    @see show
+    @chainable
+    **/
+    hide: function () {
+        return this.get(ALWAYS_SHOW_LIST) ? this : this.set(VISIBLE, false);
+    },
+
+    /**
+    Selects the specified _itemNode_, or the current `activeItem` if _itemNode_
+    is not specified.
+
+    @method selectItem
+    @param {Node} [itemNode] Item node to select.
+    @param {EventFacade} [originEvent] Event that triggered the selection, if
+        any.
+    @chainable
+    **/
+    selectItem: function (itemNode, originEvent) {
+        if (itemNode) {
+            if (!itemNode.hasClass(this[_CLASS_ITEM])) {
+                return this;
+            }
+        } else {
+            itemNode = this.get(ACTIVE_ITEM);
+
+            if (!itemNode) {
+                return this;
+            }
+        }
+
+        this.fire(EVT_SELECT, {
+            itemNode   : itemNode,
+            originEvent: originEvent || null,
+            result     : itemNode.getData(RESULT)
+        });
+
+        return this;
+    },
+
+    // -- Protected Prototype Methods ------------------------------------------
+
+    /**
+    Activates the next item after the currently active item. If there is no next
+    item and the `circular` attribute is `true`, focus will wrap back to the
+    input node.
+
+    @method _activateNextItem
+    @chainable
+    @protected
+    **/
+    _activateNextItem: function () {
+        var item = this.get(ACTIVE_ITEM),
+            nextItem;
+
+        if (item) {
+            nextItem = item.next(this[_SELECTOR_ITEM]) ||
+                    (this.get(CIRCULAR) ? null : item);
+        } else {
+            nextItem = this._getFirstItemNode();
+        }
+
+        this.set(ACTIVE_ITEM, nextItem);
+
+        return this;
+    },
+
+    /**
+    Activates the item previous to the currently active item. If there is no
+    previous item and the `circular` attribute is `true`, focus will wrap back
+    to the input node.
+
+    @method _activatePrevItem
+    @chainable
+    @protected
+    **/
+    _activatePrevItem: function () {
+        var item     = this.get(ACTIVE_ITEM),
+            prevItem = item ? item.previous(this[_SELECTOR_ITEM]) :
+                    this.get(CIRCULAR) && this._getLastItemNode();
+
+        this.set(ACTIVE_ITEM, prevItem || null);
+
+        return this;
+    },
+
+    /**
+    Appends the specified result _items_ to the list inside a new item node.
+
+    @method _add
+    @param {Array|Node|HTMLElement|String} items Result item or array of
+        result items.
+    @return {NodeList} Added nodes.
+    @protected
+    **/
+    _add: function (items) {
+        var itemNodes = [];
+
+        YArray.each(Lang.isArray(items) ? items : [items], function (item) {
+            itemNodes.push(this._createItemNode(item).setData(RESULT, item));
+        }, this);
+
+        itemNodes = Y.all(itemNodes);
+        this._listNode.append(itemNodes.toFrag());
+
+        return itemNodes;
+    },
+
+    /**
+    Updates the ARIA live region with the specified message.
+
+    @method _ariaSay
+    @param {String} stringId String id (from the `strings` attribute) of the
+        message to speak.
+    @param {Object} [subs] Substitutions for placeholders in the string.
+    @protected
+    **/
+    _ariaSay: function (stringId, subs) {
+        var message = this.get('strings.' + stringId);
+        this._ariaNode.set('text', subs ? Lang.sub(message, subs) : message);
+    },
+
+    /**
+    Binds `inputNode` events and behavior.
+
+    @method _bindInput
+    @protected
+    **/
+    _bindInput: function () {
+        var inputNode = this._inputNode,
+            alignNode, alignWidth, tokenInput;
+
+        // Null align means we can auto-align. Set align to false to prevent
+        // auto-alignment, or a valid alignment config to customize the
+        // alignment.
+        if (this.get('align') === null) {
+            // If this is a tokenInput, align with its bounding box.
+            // Otherwise, align with the inputNode. Bit of a cheat.
+            tokenInput = this.get('tokenInput');
+            alignNode  = (tokenInput && tokenInput.get('boundingBox')) || inputNode;
+
+            this.set('align', {
+                node  : alignNode,
+                points: ['tl', 'bl']
+            });
+
+            // If no width config is set, attempt to set the list's width to the
+            // width of the alignment node. If the alignment node's width is
+            // falsy, do nothing.
+            if (!this.get(WIDTH) && (alignWidth = alignNode.get('offsetWidth'))) {
+                this.set(WIDTH, alignWidth);
+            }
+        }
+
+        // Attach inputNode events.
+        this._listEvents.concat([
+            inputNode.after('blur',  this._afterListInputBlur, this),
+            inputNode.after('focus', this._afterListInputFocus, this)
+        ]);
+    },
+
+    /**
+    Binds list events.
+
+    @method _bindList
+    @protected
+    **/
+    _bindList: function () {
+        this._listEvents.concat([
+            Y.one('doc').after('click', this._afterDocClick, this),
+            Y.one('win').after('windowresize', this._syncPosition, this),
+
+            this.after({
+                mouseover: this._afterMouseOver,
+                mouseout : this._afterMouseOut,
+
+                activeItemChange    : this._afterActiveItemChange,
+                alwaysShowListChange: this._afterAlwaysShowListChange,
+                hoveredItemChange   : this._afterHoveredItemChange,
+                resultsChange       : this._afterResultsChange,
+                visibleChange       : this._afterVisibleChange
+            }),
+
+            this._listNode.delegate('click', this._onItemClick,
+                    this[_SELECTOR_ITEM], this)
+        ]);
+    },
+
+    /**
+    Clears the contents of the tray.
+
+    @method _clear
+    @protected
+    **/
+    _clear: function () {
+        this.set(ACTIVE_ITEM, null);
+        this._set(HOVERED_ITEM, null);
+
+        this._listNode.get('children').remove(true);
+    },
+
+    /**
+    Creates and returns an ARIA live region node.
+
+    @method _createAriaNode
+    @return {Node} ARIA node.
+    @protected
+    **/
+    _createAriaNode: function () {
+        var ariaNode = Node.create(this.ARIA_TEMPLATE);
+
+        return ariaNode.addClass(this.getClassName('aria')).setAttrs({
+            'aria-live': 'polite',
+            role       : 'status'
+        });
+    },
+
+    /**
+    Creates and returns an item node with the specified _content_.
+
+    @method _createItemNode
+    @param {Object} result Result object.
+    @return {Node} Item node.
+    @protected
+    **/
+    _createItemNode: function (result) {
+        var itemNode = Node.create(this.ITEM_TEMPLATE);
+
+        return itemNode.addClass(this[_CLASS_ITEM]).setAttrs({
+            id  : Y.stamp(itemNode),
+            role: 'option'
+        }).setAttribute('data-text', result.text).append(result.display);
+    },
+
+    /**
+    Creates and returns a list node. If the `listNode` attribute is already set
+    to an existing node, that node will be used.
+
+    @method _createListNode
+    @return {Node} List node.
+    @protected
+    **/
+    _createListNode: function () {
+        var listNode = this.get('listNode') || Node.create(this.LIST_TEMPLATE);
+
+        listNode.addClass(this.getClassName(LIST)).setAttrs({
+            id  : Y.stamp(listNode),
+            role: 'listbox'
+        });
+
+        this._set('listNode', listNode);
+        this.get('contentBox').append(listNode);
+
+        return listNode;
+    },
+
+    /**
+    Gets the first item node in the list, or `null` if the list is empty.
+
+    @method _getFirstItemNode
+    @return {Node|null}
+    @protected
+    **/
+    _getFirstItemNode: function () {
+        return this._listNode.one(this[_SELECTOR_ITEM]);
+    },
+
+    /**
+    Gets the last item node in the list, or `null` if the list is empty.
+
+    @method _getLastItemNode
+    @return {Node|null}
+    @protected
+    **/
+    _getLastItemNode: function () {
+        return this._listNode.one(this[_SELECTOR_ITEM] + ':last-child');
+    },
+
+    /**
+    Synchronizes the result list's position and alignment.
+
+    @method _syncPosition
+    @protected
+    **/
+    _syncPosition: function () {
+        // Force WidgetPositionAlign to refresh its alignment.
+        this._syncUIPosAlign();
+
+        // Resize the IE6 iframe shim to match the list's dimensions.
+        this._syncShim();
+    },
+
+    /**
+    Synchronizes the results displayed in the list with those in the _results_
+    argument, or with the `results` attribute if an argument is not provided.
+
+    @method _syncResults
+    @param {Array} [results] Results.
+    @protected
+    **/
+    _syncResults: function (results) {
+        if (!results) {
+            results = this.get(RESULTS);
+        }
+
+        this._clear();
+
+        if (results.length) {
+            this._add(results);
+            this._ariaSay('items_available');
+        }
+
+        this._syncPosition();
+
+        if (this.get('activateFirstItem') && !this.get(ACTIVE_ITEM)) {
+            this.set(ACTIVE_ITEM, this._getFirstItemNode());
+        }
+    },
+
+    /**
+    Synchronizes the size of the iframe shim used for IE6 and lower. In other
+    browsers, this method is a noop.
+
+    @method _syncShim
+    @protected
+    **/
+    _syncShim: useShim ? function () {
+        this._boundingBox.shim.sync();
+    } : function () {},
+
+    /**
+    Synchronizes the visibility of the tray with the _visible_ argument, or with
+    the `visible` attribute if an argument is not provided.
+
+    @method _syncVisibility
+    @param {Boolean} [visible] Visibility.
+    @protected
+    **/
+    _syncVisibility: function (visible) {
+        if (this.get(ALWAYS_SHOW_LIST)) {
+            visible = true;
+            this.set(VISIBLE, visible);
+        }
+
+        if (typeof visible === 'undefined') {
+            visible = this.get(VISIBLE);
+        }
+
+        this._inputNode.set('aria-expanded', visible);
+        this._boundingBox.set('aria-hidden', !visible);
+
+        if (visible) {
+            this._syncPosition();
+        } else {
+            this.set(ACTIVE_ITEM, null);
+            this._set(HOVERED_ITEM, null);
+
+            // Force a reflow to work around a glitch in IE6 and 7 where some of
+            // the contents of the list will sometimes remain visible after the
+            // container is hidden.
+            this._boundingBox.get('offsetWidth');
+        }
+
+        // In some pages, IE7 fails to repaint the contents of the list after it
+        // becomes visible. Toggling a bogus class on the body forces a repaint
+        // that fixes the issue.
+        if (Y.UA.ie === 7) {
+            Y.one('body')
+                .addClass('yui3-ie7-sucks')
+                .removeClass('yui3-ie7-sucks');
+        }
+    },
+
+    // -- Protected Event Handlers ---------------------------------------------
+
+    /**
+    Handles `activeItemChange` events.
+
+    @method _afterActiveItemChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterActiveItemChange: function (e) {
+        var inputNode = this._inputNode,
+            newVal    = e.newVal,
+            prevVal   = e.prevVal,
+            node;
+
+        // The previous item may have disappeared by the time this handler runs,
+        // so we need to be careful.
+        if (prevVal && prevVal._node) {
+            prevVal.removeClass(this[_CLASS_ITEM_ACTIVE]);
+        }
+
+        if (newVal) {
+            newVal.addClass(this[_CLASS_ITEM_ACTIVE]);
+            inputNode.set('aria-activedescendant', newVal.get(ID));
+        } else {
+            inputNode.removeAttribute('aria-activedescendant');
+        }
+
+        if (this.get('scrollIntoView')) {
+            node = newVal || inputNode;
+
+            if (!node.inRegion(Y.DOM.viewportRegion(), true)
+                    || !node.inRegion(this._contentBox, true)) {
+
+                node.scrollIntoView();
+            }
+        }
+    },
+
+    /**
+    Handles `alwaysShowListChange` events.
+
+    @method _afterAlwaysShowListChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterAlwaysShowListChange: function (e) {
+        this.set(VISIBLE, e.newVal || this.get(RESULTS).length > 0);
+    },
+
+    /**
+    Handles click events on the document. If the click is outside both the
+    input node and the bounding box, the list will be hidden.
+
+    @method _afterDocClick
+    @param {EventFacade} e
+    @protected
+    @since 3.5.0
+    **/
+    _afterDocClick: function (e) {
+        var boundingBox = this._boundingBox,
+            target      = e.target;
+
+        if (target !== this._inputNode && target !== boundingBox &&
+                !boundingBox.one(target.get('id'))) {
+
+            this.hide();
+        }
+    },
+
+    /**
+    Handles `hoveredItemChange` events.
+
+    @method _afterHoveredItemChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterHoveredItemChange: function (e) {
+        var newVal  = e.newVal,
+            prevVal = e.prevVal;
+
+        if (prevVal) {
+            prevVal.removeClass(this[_CLASS_ITEM_HOVER]);
+        }
+
+        if (newVal) {
+            newVal.addClass(this[_CLASS_ITEM_HOVER]);
+        }
+    },
+
+    /**
+    Handles `inputNode` blur events.
+
+    @method _afterListInputBlur
+    @protected
+    **/
+    _afterListInputBlur: function () {
+        this._listInputFocused = false;
+
+        if (this.get(VISIBLE) &&
+                !this._mouseOverList &&
+                (this._lastInputKey !== KEY_TAB ||
+                    !this.get('tabSelect') ||
+                    !this.get(ACTIVE_ITEM))) {
+            this.hide();
+        }
+    },
+
+    /**
+    Handles `inputNode` focus events.
+
+    @method _afterListInputFocus
+    @protected
+    **/
+    _afterListInputFocus: function () {
+        this._listInputFocused = true;
+    },
+
+    /**
+    Handles `mouseover` events.
+
+    @method _afterMouseOver
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterMouseOver: function (e) {
+        var itemNode = e.domEvent.target.ancestor(this[_SELECTOR_ITEM], true);
+
+        this._mouseOverList = true;
+
+        if (itemNode) {
+            this._set(HOVERED_ITEM, itemNode);
+        }
+    },
+
+    /**
+    Handles `mouseout` events.
+
+    @method _afterMouseOut
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterMouseOut: function () {
+        this._mouseOverList = false;
+        this._set(HOVERED_ITEM, null);
+    },
+
+    /**
+    Handles `resultsChange` events.
+
+    @method _afterResultsChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterResultsChange: function (e) {
+        this._syncResults(e.newVal);
+
+        if (!this.get(ALWAYS_SHOW_LIST)) {
+            this.set(VISIBLE, !!e.newVal.length);
+        }
+    },
+
+    /**
+    Handles `visibleChange` events.
+
+    @method _afterVisibleChange
+    @param {EventFacade} e
+    @protected
+    **/
+    _afterVisibleChange: function (e) {
+        this._syncVisibility(!!e.newVal);
+    },
+
+    /**
+    Delegated event handler for item `click` events.
+
+    @method _onItemClick
+    @param {EventFacade} e
+    @protected
+    **/
+    _onItemClick: function (e) {
+        var itemNode = e.currentTarget;
+
+        this.set(ACTIVE_ITEM, itemNode);
+        this.selectItem(itemNode, e);
+    },
+
+    // -- Protected Default Event Handlers -------------------------------------
+
+    /**
+    Default `select` event handler.
+
+    @method _defSelectFn
+    @param {EventFacade} e
+    @protected
+    **/
+    _defSelectFn: function (e) {
+        var text = e.result.text;
+
+        // TODO: support typeahead completion, etc.
+        this._inputNode.focus();
+        this._updateValue(text);
+        this._ariaSay('item_selected', {item: text});
+        this.hide();
+    }
+}, {
+    ATTRS: {
+        /**
+        If `true`, the first item in the list will be activated by default when
+        the list is initially displayed and when results change.
+
+        @attribute activateFirstItem
+        @type Boolean
+        @default false
+        **/
+        activateFirstItem: {
+            value: false
+        },
+
+        /**
+        Item that's currently active, if any. When the user presses enter, this
+        is the item that will be selected.
+
+        @attribute activeItem
+        @type Node
+        **/
+        activeItem: {
+            setter: Y.one,
+            value: null
+        },
+
+        /**
+        If `true`, the list will remain visible even when there are no results
+        to display.
+
+        @attribute alwaysShowList
+        @type Boolean
+        @default false
+        **/
+        alwaysShowList: {
+            value: false
+        },
+
+        /**
+        If `true`, keyboard navigation will wrap around to the opposite end of
+        the list when navigating past the first or last item.
+
+        @attribute circular
+        @type Boolean
+        @default true
+        **/
+        circular: {
+            value: true
+        },
+
+        /**
+        Item currently being hovered over by the mouse, if any.
+
+        @attribute hoveredItem
+        @type Node|null
+        @readOnly
+        **/
+        hoveredItem: {
+            readOnly: true,
+            value: null
+        },
+
+        /**
+        Node that will contain result items.
+
+        @attribute listNode
+        @type Node|null
+        @initOnly
+        **/
+        listNode: {
+            writeOnce: 'initOnly',
+            value: null
+        },
+
+        /**
+        If `true`, the viewport will be scrolled to ensure that the active list
+        item is visible when necessary.
+
+        @attribute scrollIntoView
+        @type Boolean
+        @default false
+        **/
+        scrollIntoView: {
+            value: false
+        },
+
+        /**
+        Translatable strings used by the AutoCompleteList widget.
+
+        @attribute strings
+        @type Object
+        **/
+        strings: {
+            valueFn: function () {
+                return Y.Intl.get('autocomplete-list');
+            }
+        },
+
+        /**
+        If `true`, pressing the tab key while the list is visible will select
+        the active item, if any.
+
+        @attribute tabSelect
+        @type Boolean
+        @default true
+        **/
+        tabSelect: {
+            value: true
+        },
+
+        // The "visible" attribute is documented in Widget.
+        visible: {
+            value: false
+        }
+    },
+
+    CSS_PREFIX: Y.ClassNameManager.getClassName('aclist')
+});
+
+Y.AutoCompleteList = List;
+
+/**
+Alias for <a href="AutoCompleteList.html">`AutoCompleteList`</a>. See that class
+for API docs.
+
+@class AutoComplete
+**/
+
+Y.AutoComplete = List;
+
+
+}, '3.5.1' ,{requires:['autocomplete-base', 'event-resize', 'node-screen', 'selector-css3', 'shim-plugin', 'widget', 'widget-position', 'widget-position-align'], skinnable:true, after:['autocomplete-sources'], lang:['en']});

=== added directory 'debian/extras/jslibs/yui/autocomplete-list/lang'
=== added file 'debian/extras/jslibs/yui/autocomplete-list/lang/autocomplete-list.js'
--- debian/extras/jslibs/yui/autocomplete-list/lang/autocomplete-list.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list/lang/autocomplete-list.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("lang/autocomplete-list",function(a){a.Intl.add("autocomplete-list","",{item_selected:"{item} selected.",items_available:"Suggestions are available. Use the up and down arrow keys to select suggestions."});},"3.5.1");
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/autocomplete-list/lang/autocomplete-list_en.js'
--- debian/extras/jslibs/yui/autocomplete-list/lang/autocomplete-list_en.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-list/lang/autocomplete-list_en.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("lang/autocomplete-list_en",function(a){a.Intl.add("autocomplete-list","en",{item_selected:"{item} selected.",items_available:"Suggestions are available. Use up and down arrows to select."});},"3.5.1");
\ No newline at end of file

=== added directory 'debian/extras/jslibs/yui/autocomplete-plugin'
=== added file 'debian/extras/jslibs/yui/autocomplete-plugin/autocomplete-plugin-debug.js'
--- debian/extras/jslibs/yui/autocomplete-plugin/autocomplete-plugin-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-plugin/autocomplete-plugin-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,54 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-plugin', function(Y) {
+
+/**
+Binds an AutoCompleteList instance to a Node instance.
+
+@module autocomplete
+@submodule autocomplete-plugin
+**/
+
+/**
+Binds an AutoCompleteList instance to a Node instance.
+
+@example
+
+    Y.one('#my-input').plug(Y.Plugin.AutoComplete, {
+        source: 'select * from search.suggest where query="{query}"'
+    });
+
+    // You can now access the AutoCompleteList instance at Y.one('#my-input').ac
+
+@class Plugin.AutoComplete
+@extends AutoCompleteList
+**/
+
+var Plugin = Y.Plugin;
+
+function ACListPlugin(config) {
+    config.inputNode = config.host;
+
+    // Render by default.
+    if (!config.render && config.render !== false) {
+      config.render = true;
+    }
+
+    ACListPlugin.superclass.constructor.apply(this, arguments);
+}
+
+Y.extend(ACListPlugin, Y.AutoCompleteList, {}, {
+    NAME      : 'autocompleteListPlugin',
+    NS        : 'ac',
+    CSS_PREFIX: Y.ClassNameManager.getClassName('aclist')
+});
+
+Plugin.AutoComplete     = ACListPlugin;
+Plugin.AutoCompleteList = ACListPlugin;
+
+
+}, '3.5.1' ,{requires:['autocomplete-list', 'node-pluginhost']});

=== added file 'debian/extras/jslibs/yui/autocomplete-plugin/autocomplete-plugin-min.js'
--- debian/extras/jslibs/yui/autocomplete-plugin/autocomplete-plugin-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-plugin/autocomplete-plugin-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("autocomplete-plugin",function(b){var a=b.Plugin;function c(d){d.inputNode=d.host;if(!d.render&&d.render!==false){d.render=true;}c.superclass.constructor.apply(this,arguments);}b.extend(c,b.AutoCompleteList,{},{NAME:"autocompleteListPlugin",NS:"ac",CSS_PREFIX:b.ClassNameManager.getClassName("aclist")});a.AutoComplete=c;a.AutoCompleteList=c;},"3.5.1",{requires:["autocomplete-list","node-pluginhost"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/autocomplete-plugin/autocomplete-plugin.js'
--- debian/extras/jslibs/yui/autocomplete-plugin/autocomplete-plugin.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-plugin/autocomplete-plugin.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,54 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-plugin', function(Y) {
+
+/**
+Binds an AutoCompleteList instance to a Node instance.
+
+@module autocomplete
+@submodule autocomplete-plugin
+**/
+
+/**
+Binds an AutoCompleteList instance to a Node instance.
+
+@example
+
+    Y.one('#my-input').plug(Y.Plugin.AutoComplete, {
+        source: 'select * from search.suggest where query="{query}"'
+    });
+
+    // You can now access the AutoCompleteList instance at Y.one('#my-input').ac
+
+@class Plugin.AutoComplete
+@extends AutoCompleteList
+**/
+
+var Plugin = Y.Plugin;
+
+function ACListPlugin(config) {
+    config.inputNode = config.host;
+
+    // Render by default.
+    if (!config.render && config.render !== false) {
+      config.render = true;
+    }
+
+    ACListPlugin.superclass.constructor.apply(this, arguments);
+}
+
+Y.extend(ACListPlugin, Y.AutoCompleteList, {}, {
+    NAME      : 'autocompleteListPlugin',
+    NS        : 'ac',
+    CSS_PREFIX: Y.ClassNameManager.getClassName('aclist')
+});
+
+Plugin.AutoComplete     = ACListPlugin;
+Plugin.AutoCompleteList = ACListPlugin;
+
+
+}, '3.5.1' ,{requires:['autocomplete-list', 'node-pluginhost']});

=== added directory 'debian/extras/jslibs/yui/autocomplete-sources'
=== added file 'debian/extras/jslibs/yui/autocomplete-sources/autocomplete-sources-debug.js'
--- debian/extras/jslibs/yui/autocomplete-sources/autocomplete-sources-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-sources/autocomplete-sources-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,482 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-sources', function(Y) {
+
+/**
+Mixes support for JSONP and YQL result sources into AutoCompleteBase.
+
+@module autocomplete
+@submodule autocomplete-sources
+**/
+
+var ACBase = Y.AutoCompleteBase,
+    Lang   = Y.Lang,
+
+    _SOURCE_SUCCESS = '_sourceSuccess',
+
+    MAX_RESULTS         = 'maxResults',
+    REQUEST_TEMPLATE    = 'requestTemplate',
+    RESULT_LIST_LOCATOR = 'resultListLocator';
+
+// Add prototype properties and methods to AutoCompleteBase.
+Y.mix(ACBase.prototype, {
+    /**
+    Regular expression used to determine whether a String source is a YQL query.
+
+    @property _YQL_SOURCE_REGEX
+    @type RegExp
+    @protected
+    @for AutoCompleteBase
+    **/
+    _YQL_SOURCE_REGEX: /^(?:select|set|use)\s+/i,
+
+    /**
+    Runs before AutoCompleteBase's `_createObjectSource()` method and augments
+    it to support additional object-based source types.
+
+    @method _beforeCreateObjectSource
+    @param {String} source
+    @protected
+    @for AutoCompleteBase
+    **/
+    _beforeCreateObjectSource: function (source) {
+        // If the object is a <select> node, use the options as the result
+        // source.
+        if (source instanceof Y.Node &&
+                source.get('nodeName').toLowerCase() === 'select') {
+
+            return this._createSelectSource(source);
+        }
+
+        // If the object is a JSONPRequest instance, try to use it as a JSONP
+        // source.
+        if (Y.JSONPRequest && source instanceof Y.JSONPRequest) {
+            return this._createJSONPSource(source);
+        }
+
+        // Fall back to a basic object source.
+        return this._createObjectSource(source);
+    },
+
+    /**
+    Creates a DataSource-like object that uses `Y.io` as a source. See the
+    `source` attribute for more details.
+
+    @method _createIOSource
+    @param {String} source URL.
+    @return {Object} DataSource-like object.
+    @protected
+    @for AutoCompleteBase
+    **/
+    _createIOSource: function (source) {
+        var ioSource = {type: 'io'},
+            that     = this,
+            ioRequest, lastRequest, loading;
+
+        // Private internal _sendRequest method that will be assigned to
+        // ioSource.sendRequest once io-base and json-parse are available.
+        function _sendRequest(request) {
+            var cacheKey = request.request,
+                query    = request.query;
+
+            // Return immediately on a cached response.
+            if (that._cache && cacheKey in that._cache) {
+                that[_SOURCE_SUCCESS](that._cache[cacheKey], request);
+                return;
+            }
+
+            // Cancel any outstanding requests.
+            if (ioRequest && ioRequest.isInProgress()) {
+                ioRequest.abort();
+            }
+
+            ioRequest = Y.io(that._getXHRUrl(source, request), {
+                on: {
+                    success: function (tid, response) {
+                        var data;
+
+                        try {
+                            data = Y.JSON.parse(response.responseText);
+                        } catch (ex) {
+                            Y.error('JSON parse error', ex);
+                        }
+
+                        if (data) {
+                            that._cache && (that._cache[cacheKey] = data);
+                            that[_SOURCE_SUCCESS](data, request);
+                        }
+                    }
+                }
+            });
+        }
+
+        ioSource.sendRequest = function (request) {
+            // Keep track of the most recent request in case there are multiple
+            // requests while we're waiting for the IO module to load. Only the
+            // most recent request will be sent.
+            lastRequest = request;
+
+            if (loading) { return; }
+
+            loading = true;
+
+            // Lazy-load the io-base and json-parse modules if necessary,
+            // then overwrite the sendRequest method to bypass this check in
+            // the future.
+            Y.use('io-base', 'json-parse', function () {
+                ioSource.sendRequest = _sendRequest;
+                _sendRequest(lastRequest);
+            });
+        };
+
+        return ioSource;
+    },
+
+    /**
+    Creates a DataSource-like object that uses the specified JSONPRequest
+    instance as a source. See the `source` attribute for more details.
+
+    @method _createJSONPSource
+    @param {JSONPRequest|String} source URL string or JSONPRequest instance.
+    @return {Object} DataSource-like object.
+    @protected
+    @for AutoCompleteBase
+    **/
+    _createJSONPSource: function (source) {
+        var jsonpSource = {type: 'jsonp'},
+            that        = this,
+            lastRequest, loading;
+
+        function _sendRequest(request) {
+            var cacheKey = request.request,
+                query    = request.query;
+
+            if (that._cache && cacheKey in that._cache) {
+                that[_SOURCE_SUCCESS](that._cache[cacheKey], request);
+                return;
+            }
+
+            // Hack alert: JSONPRequest currently doesn't support
+            // per-request callbacks, so we're reaching into the protected
+            // _config object to make it happen.
+            //
+            // This limitation is mentioned in the following JSONP
+            // enhancement ticket:
+            //
+            // http://yuilibrary.com/projects/yui3/ticket/2529371
+            source._config.on.success = function (data) {
+                that._cache && (that._cache[cacheKey] = data);
+                that[_SOURCE_SUCCESS](data, request);
+            };
+
+            source.send(query);
+        }
+
+        jsonpSource.sendRequest = function (request) {
+            // Keep track of the most recent request in case there are multiple
+            // requests while we're waiting for the JSONP module to load. Only
+            // the most recent request will be sent.
+            lastRequest = request;
+
+            if (loading) { return; }
+
+            loading = true;
+
+            // Lazy-load the JSONP module if necessary, then overwrite the
+            // sendRequest method to bypass this check in the future.
+            Y.use('jsonp', function () {
+                // Turn the source into a JSONPRequest instance if it isn't
+                // one already.
+                if (!(source instanceof Y.JSONPRequest)) {
+                    source = new Y.JSONPRequest(source, {
+                        format: Y.bind(that._jsonpFormatter, that)
+                    });
+                }
+
+                jsonpSource.sendRequest = _sendRequest;
+                _sendRequest(lastRequest);
+            });
+        };
+
+        return jsonpSource;
+    },
+
+    /**
+    Creates a DataSource-like object that uses the specified `<select>` node as
+    a source.
+
+    @method _createSelectSource
+    @param {Node} source YUI Node instance wrapping a `<select>` node.
+    @return {Object} DataSource-like object.
+    @protected
+    @for AutoCompleteBase
+    **/
+    _createSelectSource: function (source) {
+        var that = this;
+
+        return {
+            type: 'select',
+            sendRequest: function (request) {
+                var options = [];
+
+                source.get('options').each(function (option) {
+                    options.push({
+                        html    : option.get('innerHTML'),
+                        index   : option.get('index'),
+                        node    : option,
+                        selected: option.get('selected'),
+                        text    : option.get('text'),
+                        value   : option.get('value')
+                    });
+                });
+
+                that[_SOURCE_SUCCESS](options, request);
+            }
+        };
+    },
+
+    /**
+    Creates a DataSource-like object that calls the specified  URL or executes
+    the specified YQL query for results. If the string starts with "select ",
+    "use ", or "set " (case-insensitive), it's assumed to be a YQL query;
+    otherwise, it's assumed to be a URL (which may be absolute or relative).
+    URLs containing a "{callback}" placeholder are assumed to be JSONP URLs; all
+    others will use XHR. See the `source` attribute for more details.
+
+    @method _createStringSource
+    @param {String} source URL or YQL query.
+    @return {Object} DataSource-like object.
+    @protected
+    @for AutoCompleteBase
+    **/
+    _createStringSource: function (source) {
+        if (this._YQL_SOURCE_REGEX.test(source)) {
+            // Looks like a YQL query.
+            return this._createYQLSource(source);
+        } else if (source.indexOf('{callback}') !== -1) {
+            // Contains a {callback} param and isn't a YQL query, so it must be
+            // JSONP.
+            return this._createJSONPSource(source);
+        } else {
+            // Not a YQL query or JSONP, so we'll assume it's an XHR URL.
+            return this._createIOSource(source);
+        }
+    },
+
+    /**
+    Creates a DataSource-like object that uses the specified YQL query string to
+    create a YQL-based source. See the `source` attribute for details. If no
+    `resultListLocator` is defined, this method will set a best-guess locator
+    that might work for many typical YQL queries.
+
+    @method _createYQLSource
+    @param {String} source YQL query.
+    @return {Object} DataSource-like object.
+    @protected
+    @for AutoCompleteBase
+    **/
+    _createYQLSource: function (source) {
+        var that      = this,
+            yqlSource = {type: 'yql'},
+            lastRequest, loading, yqlRequest;
+
+        if (!that.get(RESULT_LIST_LOCATOR)) {
+            that.set(RESULT_LIST_LOCATOR, that._defaultYQLLocator);
+        }
+
+        function _sendRequest(request) {
+            var query      = request.query,
+                env        = that.get('yqlEnv'),
+                maxResults = that.get(MAX_RESULTS),
+                callback, opts, yqlQuery;
+
+            yqlQuery = Lang.sub(source, {
+                maxResults: maxResults > 0 ? maxResults : 1000,
+                request   : request.request,
+                query     : query
+            });
+
+            if (that._cache && yqlQuery in that._cache) {
+                that[_SOURCE_SUCCESS](that._cache[yqlQuery], request);
+                return;
+            }
+
+            callback = function (data) {
+                that._cache && (that._cache[yqlQuery] = data);
+                that[_SOURCE_SUCCESS](data, request);
+            };
+
+            opts = {proto: that.get('yqlProtocol')};
+
+            // Only create a new YQLRequest instance if this is the
+            // first request. For subsequent requests, we'll reuse the
+            // original instance.
+            if (yqlRequest) {
+                yqlRequest._callback   = callback;
+                yqlRequest._opts       = opts;
+                yqlRequest._params.q   = yqlQuery;
+
+                if (env) {
+                    yqlRequest._params.env = env;
+                }
+            } else {
+                yqlRequest = new Y.YQLRequest(yqlQuery, {
+                    on: {success: callback},
+                    allowCache: false // temp workaround until JSONP has per-URL callback proxies
+                }, env ? {env: env} : null, opts);
+            }
+
+            yqlRequest.send();
+        }
+
+        yqlSource.sendRequest = function (request) {
+            // Keep track of the most recent request in case there are multiple
+            // requests while we're waiting for the YQL module to load. Only the
+            // most recent request will be sent.
+            lastRequest = request;
+
+            if (!loading) {
+                // Lazy-load the YQL module if necessary, then overwrite the
+                // sendRequest method to bypass this check in the future.
+                loading = true;
+
+                Y.use('yql', function () {
+                    yqlSource.sendRequest = _sendRequest;
+                    _sendRequest(lastRequest);
+                });
+            }
+        };
+
+        return yqlSource;
+    },
+
+    /**
+    Default resultListLocator used when a string-based YQL source is set and the
+    implementer hasn't already specified one.
+
+    @method _defaultYQLLocator
+    @param {Object} response YQL response object.
+    @return {Array}
+    @protected
+    @for AutoCompleteBase
+    **/
+    _defaultYQLLocator: function (response) {
+        var results = response && response.query && response.query.results,
+            values;
+
+        if (results && Lang.isObject(results)) {
+            // If there's only a single value on YQL's results object, that
+            // value almost certainly contains the array of results we want. If
+            // there are 0 or 2+ values, then the values themselves are most
+            // likely the results we want.
+            values  = Y.Object.values(results) || [];
+            results = values.length === 1 ? values[0] : values;
+
+            if (!Lang.isArray(results)) {
+                results = [results];
+            }
+        } else {
+            results = [];
+        }
+
+        return results;
+    },
+
+    /**
+    Returns a formatted XHR URL based on the specified base _url_, _query_, and
+    the current _requestTemplate_ if any.
+
+    @method _getXHRUrl
+    @param {String} url Base URL.
+    @param {Object} request Request object containing `query` and `request`
+      properties.
+    @return {String} Formatted URL.
+    @protected
+    @for AutoCompleteBase
+    **/
+    _getXHRUrl: function (url, request) {
+        var maxResults = this.get(MAX_RESULTS);
+
+        if (request.query !== request.request) {
+            // Append the request template to the URL.
+            url += request.request;
+        }
+
+        return Lang.sub(url, {
+            maxResults: maxResults > 0 ? maxResults : 1000,
+            query     : encodeURIComponent(request.query)
+        });
+    },
+
+    /**
+    URL formatter passed to `JSONPRequest` instances.
+
+    @method _jsonpFormatter
+    @param {String} url
+    @param {String} proxy
+    @param {String} query
+    @return {String} Formatted URL
+    @protected
+    @for AutoCompleteBase
+    **/
+    _jsonpFormatter: function (url, proxy, query) {
+        var maxResults      = this.get(MAX_RESULTS),
+            requestTemplate = this.get(REQUEST_TEMPLATE);
+
+        if (requestTemplate) {
+            url += requestTemplate(query);
+        }
+
+        return Lang.sub(url, {
+            callback  : proxy,
+            maxResults: maxResults > 0 ? maxResults : 1000,
+            query     : encodeURIComponent(query)
+        });
+    }
+});
+
+// Add attributes to AutoCompleteBase.
+Y.mix(ACBase.ATTRS, {
+    /**
+    YQL environment file URL to load when the `source` is set to a YQL query.
+    Set this to `null` to use the default Open Data Tables environment file
+    (http://datatables.org/alltables.env).
+
+    @attribute yqlEnv
+    @type String
+    @default null
+    @for AutoCompleteBase
+    **/
+    yqlEnv: {
+        value: null
+    },
+
+    /**
+    URL protocol to use when the `source` is set to a YQL query.
+
+    @attribute yqlProtocol
+    @type String
+    @default 'http'
+    @for AutoCompleteBase
+    **/
+    yqlProtocol: {
+        value: 'http'
+    }
+});
+
+// Tell AutoCompleteBase about the new source types it can now support.
+Y.mix(ACBase.SOURCE_TYPES, {
+    io    : '_createIOSource',
+    jsonp : '_createJSONPSource',
+    object: '_beforeCreateObjectSource', // Run our version before the base version.
+    select: '_createSelectSource',
+    string: '_createStringSource',
+    yql   : '_createYQLSource'
+}, true);
+
+
+}, '3.5.1' ,{optional:['io-base', 'json-parse', 'jsonp', 'yql'], requires:['autocomplete-base']});

=== added file 'debian/extras/jslibs/yui/autocomplete-sources/autocomplete-sources-min.js'
--- debian/extras/jslibs/yui/autocomplete-sources/autocomplete-sources-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-sources/autocomplete-sources-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("autocomplete-sources",function(g){var a=g.AutoCompleteBase,f=g.Lang,b="_sourceSuccess",d="maxResults",e="requestTemplate",c="resultListLocator";g.mix(a.prototype,{_YQL_SOURCE_REGEX:/^(?:select|set|use)\s+/i,_beforeCreateObjectSource:function(h){if(h instanceof g.Node&&h.get("nodeName").toLowerCase()==="select"){return this._createSelectSource(h);}if(g.JSONPRequest&&h instanceof g.JSONPRequest){return this._createJSONPSource(h);}return this._createObjectSource(h);},_createIOSource:function(l){var j={type:"io"},k=this,n,i,m;function h(o){var q=o.request,p=o.query;if(k._cache&&q in k._cache){k[b](k._cache[q],o);return;}if(n&&n.isInProgress()){n.abort();}n=g.io(k._getXHRUrl(l,o),{on:{success:function(u,r){var t;try{t=g.JSON.parse(r.responseText);}catch(s){g.error("JSON parse error",s);}if(t){k._cache&&(k._cache[q]=t);k[b](t,o);}}}});}j.sendRequest=function(o){i=o;if(m){return;}m=true;g.use("io-base","json-parse",function(){j.sendRequest=h;h(i);});};return j;},_createJSONPSource:function(l){var j={type:"jsonp"},k=this,i,m;function h(n){var p=n.request,o=n.query;if(k._cache&&p in k._cache){k[b](k._cache[p],n);return;}l._config.on.success=function(q){k._cache&&(k._cache[p]=q);k[b](q,n);};l.send(o);}j.sendRequest=function(n){i=n;if(m){return;}m=true;g.use("jsonp",function(){if(!(l instanceof g.JSONPRequest)){l=new g.JSONPRequest(l,{format:g.bind(k._jsonpFormatter,k)});}j.sendRequest=h;h(i);});};return j;},_createSelectSource:function(i){var h=this;return{type:"select",sendRequest:function(k){var j=[];i.get("options").each(function(l){j.push({html:l.get("innerHTML"),index:l.get("index"),node:l,selected:l.get("selected"),text:l.get("text"),value:l.get("value")});});h[b](j,k);}};},_createStringSource:function(h){if(this._YQL_SOURCE_REGEX.test(h)){return this._createYQLSource(h);}else{if(h.indexOf("{callback}")!==-1){return this._createJSONPSource(h);}else{return this._createIOSource(h);}}},_createYQLSource:function(l){var k=this,m={type:"yql"},i,n,j;if(!k.get(c)){k.set(c,k._defaultYQLLocator);}function h(s){var t=s.query,q=k.get("yqlEnv"),o=k.get(d),u,r,p;p=f.sub(l,{maxResults:o>0?o:1000,request:s.request,query:t});if(k._cache&&p in k._cache){k[b](k._cache[p],s);return;}u=function(v){k._cache&&(k._cache[p]=v);k[b](v,s);};r={proto:k.get("yqlProtocol")};if(j){j._callback=u;j._opts=r;j._params.q=p;if(q){j._params.env=q;}}else{j=new g.YQLRequest(p,{on:{success:u},allowCache:false},q?{env:q}:null,r);}j.send();}m.sendRequest=function(o){i=o;if(!n){n=true;g.use("yql",function(){m.sendRequest=h;h(i);});}};return m;},_defaultYQLLocator:function(i){var j=i&&i.query&&i.query.results,h;if(j&&f.isObject(j)){h=g.Object.values(j)||[];j=h.length===1?h[0]:h;if(!f.isArray(j)){j=[j];}}else{j=[];}return j;},_getXHRUrl:function(i,j){var h=this.get(d);if(j.query!==j.request){i+=j.request;}return f.sub(i,{maxResults:h>0?h:1000,query:encodeURIComponent(j.query)});},_jsonpFormatter:function(i,j,k){var h=this.get(d),l=this.get(e);if(l){i+=l(k);}return f.sub(i,{callback:j,maxResults:h>0?h:1000,query:encodeURIComponent(k)});}});g.mix(a.ATTRS,{yqlEnv:{value:null},yqlProtocol:{value:"http"}});g.mix(a.SOURCE_TYPES,{io:"_createIOSource",jsonp:"_createJSONPSource",object:"_beforeCreateObjectSource",select:"_createSelectSource",string:"_createStringSource",yql:"_createYQLSource"},true);},"3.5.1",{optional:["io-base","json-parse","jsonp","yql"],requires:["autocomplete-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/autocomplete-sources/autocomplete-sources.js'
--- debian/extras/jslibs/yui/autocomplete-sources/autocomplete-sources.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/autocomplete-sources/autocomplete-sources.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,482 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('autocomplete-sources', function(Y) {
+
+/**
+Mixes support for JSONP and YQL result sources into AutoCompleteBase.
+
+@module autocomplete
+@submodule autocomplete-sources
+**/
+
+var ACBase = Y.AutoCompleteBase,
+    Lang   = Y.Lang,
+
+    _SOURCE_SUCCESS = '_sourceSuccess',
+
+    MAX_RESULTS         = 'maxResults',
+    REQUEST_TEMPLATE    = 'requestTemplate',
+    RESULT_LIST_LOCATOR = 'resultListLocator';
+
+// Add prototype properties and methods to AutoCompleteBase.
+Y.mix(ACBase.prototype, {
+    /**
+    Regular expression used to determine whether a String source is a YQL query.
+
+    @property _YQL_SOURCE_REGEX
+    @type RegExp
+    @protected
+    @for AutoCompleteBase
+    **/
+    _YQL_SOURCE_REGEX: /^(?:select|set|use)\s+/i,
+
+    /**
+    Runs before AutoCompleteBase's `_createObjectSource()` method and augments
+    it to support additional object-based source types.
+
+    @method _beforeCreateObjectSource
+    @param {String} source
+    @protected
+    @for AutoCompleteBase
+    **/
+    _beforeCreateObjectSource: function (source) {
+        // If the object is a <select> node, use the options as the result
+        // source.
+        if (source instanceof Y.Node &&
+                source.get('nodeName').toLowerCase() === 'select') {
+
+            return this._createSelectSource(source);
+        }
+
+        // If the object is a JSONPRequest instance, try to use it as a JSONP
+        // source.
+        if (Y.JSONPRequest && source instanceof Y.JSONPRequest) {
+            return this._createJSONPSource(source);
+        }
+
+        // Fall back to a basic object source.
+        return this._createObjectSource(source);
+    },
+
+    /**
+    Creates a DataSource-like object that uses `Y.io` as a source. See the
+    `source` attribute for more details.
+
+    @method _createIOSource
+    @param {String} source URL.
+    @return {Object} DataSource-like object.
+    @protected
+    @for AutoCompleteBase
+    **/
+    _createIOSource: function (source) {
+        var ioSource = {type: 'io'},
+            that     = this,
+            ioRequest, lastRequest, loading;
+
+        // Private internal _sendRequest method that will be assigned to
+        // ioSource.sendRequest once io-base and json-parse are available.
+        function _sendRequest(request) {
+            var cacheKey = request.request,
+                query    = request.query;
+
+            // Return immediately on a cached response.
+            if (that._cache && cacheKey in that._cache) {
+                that[_SOURCE_SUCCESS](that._cache[cacheKey], request);
+                return;
+            }
+
+            // Cancel any outstanding requests.
+            if (ioRequest && ioRequest.isInProgress()) {
+                ioRequest.abort();
+            }
+
+            ioRequest = Y.io(that._getXHRUrl(source, request), {
+                on: {
+                    success: function (tid, response) {
+                        var data;
+
+                        try {
+                            data = Y.JSON.parse(response.responseText);
+                        } catch (ex) {
+                            Y.error('JSON parse error', ex);
+                        }
+
+                        if (data) {
+                            that._cache && (that._cache[cacheKey] = data);
+                            that[_SOURCE_SUCCESS](data, request);
+                        }
+                    }
+                }
+            });
+        }
+
+        ioSource.sendRequest = function (request) {
+            // Keep track of the most recent request in case there are multiple
+            // requests while we're waiting for the IO module to load. Only the
+            // most recent request will be sent.
+            lastRequest = request;
+
+            if (loading) { return; }
+
+            loading = true;
+
+            // Lazy-load the io-base and json-parse modules if necessary,
+            // then overwrite the sendRequest method to bypass this check in
+            // the future.
+            Y.use('io-base', 'json-parse', function () {
+                ioSource.sendRequest = _sendRequest;
+                _sendRequest(lastRequest);
+            });
+        };
+
+        return ioSource;
+    },
+
+    /**
+    Creates a DataSource-like object that uses the specified JSONPRequest
+    instance as a source. See the `source` attribute for more details.
+
+    @method _createJSONPSource
+    @param {JSONPRequest|String} source URL string or JSONPRequest instance.
+    @return {Object} DataSource-like object.
+    @protected
+    @for AutoCompleteBase
+    **/
+    _createJSONPSource: function (source) {
+        var jsonpSource = {type: 'jsonp'},
+            that        = this,
+            lastRequest, loading;
+
+        function _sendRequest(request) {
+            var cacheKey = request.request,
+                query    = request.query;
+
+            if (that._cache && cacheKey in that._cache) {
+                that[_SOURCE_SUCCESS](that._cache[cacheKey], request);
+                return;
+            }
+
+            // Hack alert: JSONPRequest currently doesn't support
+            // per-request callbacks, so we're reaching into the protected
+            // _config object to make it happen.
+            //
+            // This limitation is mentioned in the following JSONP
+            // enhancement ticket:
+            //
+            // http://yuilibrary.com/projects/yui3/ticket/2529371
+            source._config.on.success = function (data) {
+                that._cache && (that._cache[cacheKey] = data);
+                that[_SOURCE_SUCCESS](data, request);
+            };
+
+            source.send(query);
+        }
+
+        jsonpSource.sendRequest = function (request) {
+            // Keep track of the most recent request in case there are multiple
+            // requests while we're waiting for the JSONP module to load. Only
+            // the most recent request will be sent.
+            lastRequest = request;
+
+            if (loading) { return; }
+
+            loading = true;
+
+            // Lazy-load the JSONP module if necessary, then overwrite the
+            // sendRequest method to bypass this check in the future.
+            Y.use('jsonp', function () {
+                // Turn the source into a JSONPRequest instance if it isn't
+                // one already.
+                if (!(source instanceof Y.JSONPRequest)) {
+                    source = new Y.JSONPRequest(source, {
+                        format: Y.bind(that._jsonpFormatter, that)
+                    });
+                }
+
+                jsonpSource.sendRequest = _sendRequest;
+                _sendRequest(lastRequest);
+            });
+        };
+
+        return jsonpSource;
+    },
+
+    /**
+    Creates a DataSource-like object that uses the specified `<select>` node as
+    a source.
+
+    @method _createSelectSource
+    @param {Node} source YUI Node instance wrapping a `<select>` node.
+    @return {Object} DataSource-like object.
+    @protected
+    @for AutoCompleteBase
+    **/
+    _createSelectSource: function (source) {
+        var that = this;
+
+        return {
+            type: 'select',
+            sendRequest: function (request) {
+                var options = [];
+
+                source.get('options').each(function (option) {
+                    options.push({
+                        html    : option.get('innerHTML'),
+                        index   : option.get('index'),
+                        node    : option,
+                        selected: option.get('selected'),
+                        text    : option.get('text'),
+                        value   : option.get('value')
+                    });
+                });
+
+                that[_SOURCE_SUCCESS](options, request);
+            }
+        };
+    },
+
+    /**
+    Creates a DataSource-like object that calls the specified  URL or executes
+    the specified YQL query for results. If the string starts with "select ",
+    "use ", or "set " (case-insensitive), it's assumed to be a YQL query;
+    otherwise, it's assumed to be a URL (which may be absolute or relative).
+    URLs containing a "{callback}" placeholder are assumed to be JSONP URLs; all
+    others will use XHR. See the `source` attribute for more details.
+
+    @method _createStringSource
+    @param {String} source URL or YQL query.
+    @return {Object} DataSource-like object.
+    @protected
+    @for AutoCompleteBase
+    **/
+    _createStringSource: function (source) {
+        if (this._YQL_SOURCE_REGEX.test(source)) {
+            // Looks like a YQL query.
+            return this._createYQLSource(source);
+        } else if (source.indexOf('{callback}') !== -1) {
+            // Contains a {callback} param and isn't a YQL query, so it must be
+            // JSONP.
+            return this._createJSONPSource(source);
+        } else {
+            // Not a YQL query or JSONP, so we'll assume it's an XHR URL.
+            return this._createIOSource(source);
+        }
+    },
+
+    /**
+    Creates a DataSource-like object that uses the specified YQL query string to
+    create a YQL-based source. See the `source` attribute for details. If no
+    `resultListLocator` is defined, this method will set a best-guess locator
+    that might work for many typical YQL queries.
+
+    @method _createYQLSource
+    @param {String} source YQL query.
+    @return {Object} DataSource-like object.
+    @protected
+    @for AutoCompleteBase
+    **/
+    _createYQLSource: function (source) {
+        var that      = this,
+            yqlSource = {type: 'yql'},
+            lastRequest, loading, yqlRequest;
+
+        if (!that.get(RESULT_LIST_LOCATOR)) {
+            that.set(RESULT_LIST_LOCATOR, that._defaultYQLLocator);
+        }
+
+        function _sendRequest(request) {
+            var query      = request.query,
+                env        = that.get('yqlEnv'),
+                maxResults = that.get(MAX_RESULTS),
+                callback, opts, yqlQuery;
+
+            yqlQuery = Lang.sub(source, {
+                maxResults: maxResults > 0 ? maxResults : 1000,
+                request   : request.request,
+                query     : query
+            });
+
+            if (that._cache && yqlQuery in that._cache) {
+                that[_SOURCE_SUCCESS](that._cache[yqlQuery], request);
+                return;
+            }
+
+            callback = function (data) {
+                that._cache && (that._cache[yqlQuery] = data);
+                that[_SOURCE_SUCCESS](data, request);
+            };
+
+            opts = {proto: that.get('yqlProtocol')};
+
+            // Only create a new YQLRequest instance if this is the
+            // first request. For subsequent requests, we'll reuse the
+            // original instance.
+            if (yqlRequest) {
+                yqlRequest._callback   = callback;
+                yqlRequest._opts       = opts;
+                yqlRequest._params.q   = yqlQuery;
+
+                if (env) {
+                    yqlRequest._params.env = env;
+                }
+            } else {
+                yqlRequest = new Y.YQLRequest(yqlQuery, {
+                    on: {success: callback},
+                    allowCache: false // temp workaround until JSONP has per-URL callback proxies
+                }, env ? {env: env} : null, opts);
+            }
+
+            yqlRequest.send();
+        }
+
+        yqlSource.sendRequest = function (request) {
+            // Keep track of the most recent request in case there are multiple
+            // requests while we're waiting for the YQL module to load. Only the
+            // most recent request will be sent.
+            lastRequest = request;
+
+            if (!loading) {
+                // Lazy-load the YQL module if necessary, then overwrite the
+                // sendRequest method to bypass this check in the future.
+                loading = true;
+
+                Y.use('yql', function () {
+                    yqlSource.sendRequest = _sendRequest;
+                    _sendRequest(lastRequest);
+                });
+            }
+        };
+
+        return yqlSource;
+    },
+
+    /**
+    Default resultListLocator used when a string-based YQL source is set and the
+    implementer hasn't already specified one.
+
+    @method _defaultYQLLocator
+    @param {Object} response YQL response object.
+    @return {Array}
+    @protected
+    @for AutoCompleteBase
+    **/
+    _defaultYQLLocator: function (response) {
+        var results = response && response.query && response.query.results,
+            values;
+
+        if (results && Lang.isObject(results)) {
+            // If there's only a single value on YQL's results object, that
+            // value almost certainly contains the array of results we want. If
+            // there are 0 or 2+ values, then the values themselves are most
+            // likely the results we want.
+            values  = Y.Object.values(results) || [];
+            results = values.length === 1 ? values[0] : values;
+
+            if (!Lang.isArray(results)) {
+                results = [results];
+            }
+        } else {
+            results = [];
+        }
+
+        return results;
+    },
+
+    /**
+    Returns a formatted XHR URL based on the specified base _url_, _query_, and
+    the current _requestTemplate_ if any.
+
+    @method _getXHRUrl
+    @param {String} url Base URL.
+    @param {Object} request Request object containing `query` and `request`
+      properties.
+    @return {String} Formatted URL.
+    @protected
+    @for AutoCompleteBase
+    **/
+    _getXHRUrl: function (url, request) {
+        var maxResults = this.get(MAX_RESULTS);
+
+        if (request.query !== request.request) {
+            // Append the request template to the URL.
+            url += request.request;
+        }
+
+        return Lang.sub(url, {
+            maxResults: maxResults > 0 ? maxResults : 1000,
+            query     : encodeURIComponent(request.query)
+        });
+    },
+
+    /**
+    URL formatter passed to `JSONPRequest` instances.
+
+    @method _jsonpFormatter
+    @param {String} url
+    @param {String} proxy
+    @param {String} query
+    @return {String} Formatted URL
+    @protected
+    @for AutoCompleteBase
+    **/
+    _jsonpFormatter: function (url, proxy, query) {
+        var maxResults      = this.get(MAX_RESULTS),
+            requestTemplate = this.get(REQUEST_TEMPLATE);
+
+        if (requestTemplate) {
+            url += requestTemplate(query);
+        }
+
+        return Lang.sub(url, {
+            callback  : proxy,
+            maxResults: maxResults > 0 ? maxResults : 1000,
+            query     : encodeURIComponent(query)
+        });
+    }
+});
+
+// Add attributes to AutoCompleteBase.
+Y.mix(ACBase.ATTRS, {
+    /**
+    YQL environment file URL to load when the `source` is set to a YQL query.
+    Set this to `null` to use the default Open Data Tables environment file
+    (http://datatables.org/alltables.env).
+
+    @attribute yqlEnv
+    @type String
+    @default null
+    @for AutoCompleteBase
+    **/
+    yqlEnv: {
+        value: null
+    },
+
+    /**
+    URL protocol to use when the `source` is set to a YQL query.
+
+    @attribute yqlProtocol
+    @type String
+    @default 'http'
+    @for AutoCompleteBase
+    **/
+    yqlProtocol: {
+        value: 'http'
+    }
+});
+
+// Tell AutoCompleteBase about the new source types it can now support.
+Y.mix(ACBase.SOURCE_TYPES, {
+    io    : '_createIOSource',
+    jsonp : '_createJSONPSource',
+    object: '_beforeCreateObjectSource', // Run our version before the base version.
+    select: '_createSelectSource',
+    string: '_createStringSource',
+    yql   : '_createYQLSource'
+}, true);
+
+
+}, '3.5.1' ,{optional:['io-base', 'json-parse', 'jsonp', 'yql'], requires:['autocomplete-base']});

=== added directory 'debian/extras/jslibs/yui/base-base'
=== added file 'debian/extras/jslibs/yui/base-base/base-base-debug.js'
--- debian/extras/jslibs/yui/base-base/base-base-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/base-base/base-base-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,354 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('base-base', function(Y) {
+
+    /**
+     * The base module provides the Base class, which objects requiring attribute and custom event support can extend. 
+     * The module also provides two ways to reuse code - It augments Base with the Plugin.Host interface which provides 
+     * plugin support and also provides the BaseCore.build method which provides a way to build custom classes using extensions.
+     *
+     * @module base
+     */
+
+    /**
+     * The base-base submodule provides the Base class without the Plugin support, provided by Plugin.Host, 
+     * and without the extension support provided by BaseCore.build.
+     *
+     * @module base
+     * @submodule base-base
+     */
+
+    /**
+     * The base module provides the Base class, which objects requiring attribute and custom event support can extend. 
+     * The module also provides two ways to reuse code - It augments Base with the Plugin.Host interface which provides 
+     * plugin support and also provides the Base.build method which provides a way to build custom classes using extensions.
+     *
+     * @module base
+     */
+
+    /**
+     * The base-base submodule provides the Base class without the Plugin support, provided by Plugin.Host, 
+     * and without the extension support provided by Base.build.
+     *
+     * @module base
+     * @submodule base-base
+     */
+    var L = Y.Lang,
+
+        DESTROY = "destroy",
+        INIT = "init",
+
+        BUBBLETARGETS = "bubbleTargets",
+        _BUBBLETARGETS = "_bubbleTargets",
+
+        BaseCore = Y.BaseCore,
+        AttributeCore = Y.AttributeCore,
+        Attribute = Y.Attribute;
+
+    /**
+     * <p>
+     * A base class which objects requiring attributes and custom event support can 
+     * extend. Base also handles the chaining of initializer and destructor methods across 
+     * the hierarchy as part of object construction and destruction. Additionally, attributes configured 
+     * through the static <a href="#property_Base.ATTRS">ATTRS</a> property for each class 
+     * in the hierarchy will be initialized by Base.
+     * </p>
+     *
+     * <p>
+     * The static <a href="#property_Base.NAME">NAME</a> property of each class extending 
+     * from Base will be used as the identifier for the class, and is used by Base to prefix 
+     * all events fired by instances of that class.
+     * </p>
+     *
+     * @class Base
+     * @constructor
+     * @uses BaseCore
+     * @uses Attribute
+     * @uses AttributeCore
+     * @uses AttributeEvents
+     * @uses AttributeExtras
+     * @uses EventTarget
+     *
+     * @param {Object} config Object with configuration property name/value pairs. The object can be 
+     * used to provide default values for the objects published attributes.
+     *
+     * <p>
+     * The config object can also contain the following non-attribute properties, providing a convenient 
+     * way to configure events listeners and plugins for the instance, as part of the constructor call:
+     * </p>
+     *
+     * <dl>
+     *     <dt>on</dt>
+     *     <dd>An event name to listener function map, to register event listeners for the "on" moment of the event. A constructor convenience property for the <a href="Base.html#method_on">on</a> method.</dd>
+     *     <dt>after</dt>
+     *     <dd>An event name to listener function map, to register event listeners for the "after" moment of the event. A constructor convenience property for the <a href="Base.html#method_after">after</a> method.</dd>
+     *     <dt>bubbleTargets</dt>
+     *     <dd>An object, or array of objects, to register as bubble targets for bubbled events fired by this instance. A constructor convenience property for the <a href="EventTarget.html#method_addTarget">addTarget</a> method.</dd>
+     *     <dt>plugins</dt>
+     *     <dd>A plugin, or array of plugins to be plugged into the instance (see PluginHost's plug method for signature details). A constructor convenience property for the <a href="Plugin.Host.html#method_plug">plug</a> method.</dd>
+     * </dl>
+     */
+    function Base() {
+        BaseCore.apply(this, arguments);
+    }
+
+    /**
+     * The list of properties which can be configured for 
+     * each attribute (e.g. setter, getter, writeOnce, readOnly etc.)
+     *
+     * @property _ATTR_CFG
+     * @type Array
+     * @static
+     * @private
+     */
+    Base._ATTR_CFG = Attribute._ATTR_CFG.concat("cloneDefaultValue");
+    Base._ATTR_CFG_HASH = Y.Array.hash(Base._ATTR_CFG);
+
+    /**
+     * The array of non-attribute configuration properties supported by this class. 
+     * 
+     * `Base` supports "on", "after", "plugins" and "bubbleTargets" properties, 
+     * which are not set up as attributes. 
+     *
+     * This property is primarily required so that when 
+     * <a href="#property__allowAdHocAttrs">`_allowAdHocAttrs`</a> is enabled by
+     * a class, non-attribute configurations don't get added as ad-hoc attributes.  
+     *
+     * @property _NON_ATTRS_CFG
+     * @type Array
+     * @static
+     * @private
+     */
+    Base._NON_ATTRS_CFG = BaseCore._NON_ATTRS_CFG.concat(["on", "after", "bubbleTargets"]);
+
+    /**
+     * <p>
+     * The string to be used to identify instances of 
+     * this class, for example in prefixing events.
+     * </p>
+     * <p>
+     * Classes extending Base, should define their own
+     * static NAME property, which should be camelCase by
+     * convention (e.g. MyClass.NAME = "myClass";).
+     * </p>
+     * @property NAME
+     * @type String
+     * @static
+     */
+    Base.NAME = "base";
+
+    /**
+     * The default set of attributes which will be available for instances of this class, and 
+     * their configuration. In addition to the configuration properties listed by 
+     * Attribute's <a href="Attribute.html#method_addAttr">addAttr</a> method, the attribute 
+     * can also be configured with a "cloneDefaultValue" property, which defines how the statically
+     * defined value field should be protected ("shallow", "deep" and false are supported values). 
+     *
+     * By default if the value is an object literal or an array it will be "shallow" cloned, to 
+     * protect the default value.
+     *
+     * @property ATTRS
+     * @type Object
+     * @static
+     */
+    Base.ATTRS = AttributeCore.prototype._protectAttrs(BaseCore.ATTRS);
+
+    Base.prototype = {
+
+        /**
+         * Internal construction logic for Base.
+         *
+         * @method _initBase
+         * @param {Object} config The constructor configuration object
+         * @private
+         */
+        _initBase: function(cfg) {
+            Y.log('init called', 'life', 'base');
+
+            this._eventPrefix = this.constructor.EVENT_PREFIX || this.constructor.NAME;
+
+            Y.BaseCore.prototype._initBase.call(this, cfg);
+        },
+
+        /**
+         * Initializes Attribute 
+         * 
+         * @method _initAttribute
+         * @private
+         */
+        _initAttribute: function(cfg) {
+            Attribute.call(this);
+            this._yuievt.config.prefix = this._eventPrefix;
+        },
+
+        /**
+         * Utility method to define the attribute hash used to filter/whitelist property mixes for 
+         * this class. 
+         * 
+         * @method _attrCfgHash
+         * @private
+         */
+        _attrCfgHash: function() {
+            return Base._ATTR_CFG_HASH;
+        },
+
+        /**
+         * Init lifecycle method, invoked during construction.
+         * Fires the init event prior to setting up attributes and 
+         * invoking initializers for the class hierarchy.
+         *
+         * @method init
+         * @chainable
+         * @param {Object} config Object with configuration property name/value pairs
+         * @return {Base} A reference to this object
+         */
+        init: function(config) {
+            /**
+             * <p>
+             * Lifecycle event for the init phase, fired prior to initialization. 
+             * Invoking the preventDefault() method on the event object provided 
+             * to subscribers will prevent initialization from occuring.
+             * </p>
+             * <p>
+             * Subscribers to the "after" momemt of this event, will be notified
+             * after initialization of the object is complete (and therefore
+             * cannot prevent initialization).
+             * </p>
+             *
+             * @event init
+             * @preventable _defInitFn
+             * @param {EventFacade} e Event object, with a cfg property which 
+             * refers to the configuration object passed to the constructor.
+             */
+            this.publish(INIT, {
+                queuable:false,
+                fireOnce:true,
+                defaultTargetOnly:true,
+                defaultFn:this._defInitFn
+            });
+
+            this._preInitEventCfg(config);
+
+            this.fire(INIT, {cfg: config});
+
+            return this;
+        },
+
+        /**
+         * Handles the special on, after and target properties which allow the user to
+         * easily configure on and after listeners as well as bubble targets during 
+         * construction, prior to init.
+         *
+         * @private
+         * @method _preInitEventCfg
+         * @param {Object} config The user configuration object
+         */
+        _preInitEventCfg : function(config) {
+            if (config) {
+                if (config.on) {
+                    this.on(config.on);
+                }
+                if (config.after) {
+                    this.after(config.after);
+                }
+            }
+
+            var i, l, target,
+                userTargets = (config && BUBBLETARGETS in config);
+
+            if (userTargets || _BUBBLETARGETS in this) {
+                target = userTargets ? (config && config.bubbleTargets) : this._bubbleTargets;
+                if (L.isArray(target)) {
+                    for (i = 0, l = target.length; i < l; i++) { 
+                        this.addTarget(target[i]);
+                    }
+                } else if (target) {
+                    this.addTarget(target);
+                }
+            }
+        },
+
+        /**
+         * <p>
+         * Destroy lifecycle method. Fires the destroy
+         * event, prior to invoking destructors for the
+         * class hierarchy.
+         * </p>
+         * <p>
+         * Subscribers to the destroy
+         * event can invoke preventDefault on the event object, to prevent destruction
+         * from proceeding.
+         * </p>
+         * @method destroy
+         * @return {Base} A reference to this object
+         * @chainable
+         */
+        destroy: function() {
+            Y.log('destroy called', 'life', 'base');
+
+            /**
+             * <p>
+             * Lifecycle event for the destroy phase, 
+             * fired prior to destruction. Invoking the preventDefault 
+             * method on the event object provided to subscribers will 
+             * prevent destruction from proceeding.
+             * </p>
+             * <p>
+             * Subscribers to the "after" moment of this event, will be notified
+             * after destruction is complete (and as a result cannot prevent
+             * destruction).
+             * </p>
+             * @event destroy
+             * @preventable _defDestroyFn
+             * @param {EventFacade} e Event object
+             */
+            this.publish(DESTROY, {
+                queuable:false,
+                fireOnce:true,
+                defaultTargetOnly:true,
+                defaultFn: this._defDestroyFn
+            });
+            this.fire(DESTROY);
+
+            this.detachAll();
+            return this;
+        },
+
+        /**
+         * Default init event handler
+         *
+         * @method _defInitFn
+         * @param {EventFacade} e Event object, with a cfg property which 
+         * refers to the configuration object passed to the constructor.
+         * @protected
+         */
+        _defInitFn : function(e) {
+            this._baseInit(e.cfg);
+        },
+
+        /**
+         * Default destroy event handler
+         *
+         * @method _defDestroyFn
+         * @param {EventFacade} e Event object
+         * @protected
+         */
+        _defDestroyFn : function(e) {
+            this._baseDestroy(e.cfg);
+        }
+    };
+
+    Y.mix(Base, Attribute, false, null, 1);
+    Y.mix(Base, BaseCore, false, null, 1);
+
+    // Fix constructor
+    Base.prototype.constructor = Base;
+
+    Y.Base = Base;
+
+
+}, '3.5.1' ,{requires:['base-core', 'attribute-base']});

=== added file 'debian/extras/jslibs/yui/base-base/base-base-min.js'
--- debian/extras/jslibs/yui/base-base/base-base-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/base-base/base-base-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("base-base",function(b){var g=b.Lang,e="destroy",i="init",h="bubbleTargets",c="_bubbleTargets",j=b.BaseCore,f=b.AttributeCore,a=b.Attribute;function d(){j.apply(this,arguments);}d._ATTR_CFG=a._ATTR_CFG.concat("cloneDefaultValue");d._ATTR_CFG_HASH=b.Array.hash(d._ATTR_CFG);d._NON_ATTRS_CFG=j._NON_ATTRS_CFG.concat(["on","after","bubbleTargets"]);d.NAME="base";d.ATTRS=f.prototype._protectAttrs(j.ATTRS);d.prototype={_initBase:function(k){this._eventPrefix=this.constructor.EVENT_PREFIX||this.constructor.NAME;b.BaseCore.prototype._initBase.call(this,k);},_initAttribute:function(k){a.call(this);this._yuievt.config.prefix=this._eventPrefix;},_attrCfgHash:function(){return d._ATTR_CFG_HASH;},init:function(k){this.publish(i,{queuable:false,fireOnce:true,defaultTargetOnly:true,defaultFn:this._defInitFn});this._preInitEventCfg(k);this.fire(i,{cfg:k});return this;},_preInitEventCfg:function(m){if(m){if(m.on){this.on(m.on);}if(m.after){this.after(m.after);}}var n,k,p,o=(m&&h in m);if(o||c in this){p=o?(m&&m.bubbleTargets):this._bubbleTargets;if(g.isArray(p)){for(n=0,k=p.length;n<k;n++){this.addTarget(p[n]);}}else{if(p){this.addTarget(p);}}}},destroy:function(){this.publish(e,{queuable:false,fireOnce:true,defaultTargetOnly:true,defaultFn:this._defDestroyFn});this.fire(e);this.detachAll();return this;},_defInitFn:function(k){this._baseInit(k.cfg);},_defDestroyFn:function(k){this._baseDestroy(k.cfg);}};b.mix(d,a,false,null,1);b.mix(d,j,false,null,1);d.prototype.constructor=d;b.Base=d;},"3.5.1",{requires:["base-core","attribute-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/base-base/base-base.js'
--- debian/extras/jslibs/yui/base-base/base-base.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/base-base/base-base.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,352 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('base-base', function(Y) {
+
+    /**
+     * The base module provides the Base class, which objects requiring attribute and custom event support can extend. 
+     * The module also provides two ways to reuse code - It augments Base with the Plugin.Host interface which provides 
+     * plugin support and also provides the BaseCore.build method which provides a way to build custom classes using extensions.
+     *
+     * @module base
+     */
+
+    /**
+     * The base-base submodule provides the Base class without the Plugin support, provided by Plugin.Host, 
+     * and without the extension support provided by BaseCore.build.
+     *
+     * @module base
+     * @submodule base-base
+     */
+
+    /**
+     * The base module provides the Base class, which objects requiring attribute and custom event support can extend. 
+     * The module also provides two ways to reuse code - It augments Base with the Plugin.Host interface which provides 
+     * plugin support and also provides the Base.build method which provides a way to build custom classes using extensions.
+     *
+     * @module base
+     */
+
+    /**
+     * The base-base submodule provides the Base class without the Plugin support, provided by Plugin.Host, 
+     * and without the extension support provided by Base.build.
+     *
+     * @module base
+     * @submodule base-base
+     */
+    var L = Y.Lang,
+
+        DESTROY = "destroy",
+        INIT = "init",
+
+        BUBBLETARGETS = "bubbleTargets",
+        _BUBBLETARGETS = "_bubbleTargets",
+
+        BaseCore = Y.BaseCore,
+        AttributeCore = Y.AttributeCore,
+        Attribute = Y.Attribute;
+
+    /**
+     * <p>
+     * A base class which objects requiring attributes and custom event support can 
+     * extend. Base also handles the chaining of initializer and destructor methods across 
+     * the hierarchy as part of object construction and destruction. Additionally, attributes configured 
+     * through the static <a href="#property_Base.ATTRS">ATTRS</a> property for each class 
+     * in the hierarchy will be initialized by Base.
+     * </p>
+     *
+     * <p>
+     * The static <a href="#property_Base.NAME">NAME</a> property of each class extending 
+     * from Base will be used as the identifier for the class, and is used by Base to prefix 
+     * all events fired by instances of that class.
+     * </p>
+     *
+     * @class Base
+     * @constructor
+     * @uses BaseCore
+     * @uses Attribute
+     * @uses AttributeCore
+     * @uses AttributeEvents
+     * @uses AttributeExtras
+     * @uses EventTarget
+     *
+     * @param {Object} config Object with configuration property name/value pairs. The object can be 
+     * used to provide default values for the objects published attributes.
+     *
+     * <p>
+     * The config object can also contain the following non-attribute properties, providing a convenient 
+     * way to configure events listeners and plugins for the instance, as part of the constructor call:
+     * </p>
+     *
+     * <dl>
+     *     <dt>on</dt>
+     *     <dd>An event name to listener function map, to register event listeners for the "on" moment of the event. A constructor convenience property for the <a href="Base.html#method_on">on</a> method.</dd>
+     *     <dt>after</dt>
+     *     <dd>An event name to listener function map, to register event listeners for the "after" moment of the event. A constructor convenience property for the <a href="Base.html#method_after">after</a> method.</dd>
+     *     <dt>bubbleTargets</dt>
+     *     <dd>An object, or array of objects, to register as bubble targets for bubbled events fired by this instance. A constructor convenience property for the <a href="EventTarget.html#method_addTarget">addTarget</a> method.</dd>
+     *     <dt>plugins</dt>
+     *     <dd>A plugin, or array of plugins to be plugged into the instance (see PluginHost's plug method for signature details). A constructor convenience property for the <a href="Plugin.Host.html#method_plug">plug</a> method.</dd>
+     * </dl>
+     */
+    function Base() {
+        BaseCore.apply(this, arguments);
+    }
+
+    /**
+     * The list of properties which can be configured for 
+     * each attribute (e.g. setter, getter, writeOnce, readOnly etc.)
+     *
+     * @property _ATTR_CFG
+     * @type Array
+     * @static
+     * @private
+     */
+    Base._ATTR_CFG = Attribute._ATTR_CFG.concat("cloneDefaultValue");
+    Base._ATTR_CFG_HASH = Y.Array.hash(Base._ATTR_CFG);
+
+    /**
+     * The array of non-attribute configuration properties supported by this class. 
+     * 
+     * `Base` supports "on", "after", "plugins" and "bubbleTargets" properties, 
+     * which are not set up as attributes. 
+     *
+     * This property is primarily required so that when 
+     * <a href="#property__allowAdHocAttrs">`_allowAdHocAttrs`</a> is enabled by
+     * a class, non-attribute configurations don't get added as ad-hoc attributes.  
+     *
+     * @property _NON_ATTRS_CFG
+     * @type Array
+     * @static
+     * @private
+     */
+    Base._NON_ATTRS_CFG = BaseCore._NON_ATTRS_CFG.concat(["on", "after", "bubbleTargets"]);
+
+    /**
+     * <p>
+     * The string to be used to identify instances of 
+     * this class, for example in prefixing events.
+     * </p>
+     * <p>
+     * Classes extending Base, should define their own
+     * static NAME property, which should be camelCase by
+     * convention (e.g. MyClass.NAME = "myClass";).
+     * </p>
+     * @property NAME
+     * @type String
+     * @static
+     */
+    Base.NAME = "base";
+
+    /**
+     * The default set of attributes which will be available for instances of this class, and 
+     * their configuration. In addition to the configuration properties listed by 
+     * Attribute's <a href="Attribute.html#method_addAttr">addAttr</a> method, the attribute 
+     * can also be configured with a "cloneDefaultValue" property, which defines how the statically
+     * defined value field should be protected ("shallow", "deep" and false are supported values). 
+     *
+     * By default if the value is an object literal or an array it will be "shallow" cloned, to 
+     * protect the default value.
+     *
+     * @property ATTRS
+     * @type Object
+     * @static
+     */
+    Base.ATTRS = AttributeCore.prototype._protectAttrs(BaseCore.ATTRS);
+
+    Base.prototype = {
+
+        /**
+         * Internal construction logic for Base.
+         *
+         * @method _initBase
+         * @param {Object} config The constructor configuration object
+         * @private
+         */
+        _initBase: function(cfg) {
+
+            this._eventPrefix = this.constructor.EVENT_PREFIX || this.constructor.NAME;
+
+            Y.BaseCore.prototype._initBase.call(this, cfg);
+        },
+
+        /**
+         * Initializes Attribute 
+         * 
+         * @method _initAttribute
+         * @private
+         */
+        _initAttribute: function(cfg) {
+            Attribute.call(this);
+            this._yuievt.config.prefix = this._eventPrefix;
+        },
+
+        /**
+         * Utility method to define the attribute hash used to filter/whitelist property mixes for 
+         * this class. 
+         * 
+         * @method _attrCfgHash
+         * @private
+         */
+        _attrCfgHash: function() {
+            return Base._ATTR_CFG_HASH;
+        },
+
+        /**
+         * Init lifecycle method, invoked during construction.
+         * Fires the init event prior to setting up attributes and 
+         * invoking initializers for the class hierarchy.
+         *
+         * @method init
+         * @chainable
+         * @param {Object} config Object with configuration property name/value pairs
+         * @return {Base} A reference to this object
+         */
+        init: function(config) {
+            /**
+             * <p>
+             * Lifecycle event for the init phase, fired prior to initialization. 
+             * Invoking the preventDefault() method on the event object provided 
+             * to subscribers will prevent initialization from occuring.
+             * </p>
+             * <p>
+             * Subscribers to the "after" momemt of this event, will be notified
+             * after initialization of the object is complete (and therefore
+             * cannot prevent initialization).
+             * </p>
+             *
+             * @event init
+             * @preventable _defInitFn
+             * @param {EventFacade} e Event object, with a cfg property which 
+             * refers to the configuration object passed to the constructor.
+             */
+            this.publish(INIT, {
+                queuable:false,
+                fireOnce:true,
+                defaultTargetOnly:true,
+                defaultFn:this._defInitFn
+            });
+
+            this._preInitEventCfg(config);
+
+            this.fire(INIT, {cfg: config});
+
+            return this;
+        },
+
+        /**
+         * Handles the special on, after and target properties which allow the user to
+         * easily configure on and after listeners as well as bubble targets during 
+         * construction, prior to init.
+         *
+         * @private
+         * @method _preInitEventCfg
+         * @param {Object} config The user configuration object
+         */
+        _preInitEventCfg : function(config) {
+            if (config) {
+                if (config.on) {
+                    this.on(config.on);
+                }
+                if (config.after) {
+                    this.after(config.after);
+                }
+            }
+
+            var i, l, target,
+                userTargets = (config && BUBBLETARGETS in config);
+
+            if (userTargets || _BUBBLETARGETS in this) {
+                target = userTargets ? (config && config.bubbleTargets) : this._bubbleTargets;
+                if (L.isArray(target)) {
+                    for (i = 0, l = target.length; i < l; i++) { 
+                        this.addTarget(target[i]);
+                    }
+                } else if (target) {
+                    this.addTarget(target);
+                }
+            }
+        },
+
+        /**
+         * <p>
+         * Destroy lifecycle method. Fires the destroy
+         * event, prior to invoking destructors for the
+         * class hierarchy.
+         * </p>
+         * <p>
+         * Subscribers to the destroy
+         * event can invoke preventDefault on the event object, to prevent destruction
+         * from proceeding.
+         * </p>
+         * @method destroy
+         * @return {Base} A reference to this object
+         * @chainable
+         */
+        destroy: function() {
+
+            /**
+             * <p>
+             * Lifecycle event for the destroy phase, 
+             * fired prior to destruction. Invoking the preventDefault 
+             * method on the event object provided to subscribers will 
+             * prevent destruction from proceeding.
+             * </p>
+             * <p>
+             * Subscribers to the "after" moment of this event, will be notified
+             * after destruction is complete (and as a result cannot prevent
+             * destruction).
+             * </p>
+             * @event destroy
+             * @preventable _defDestroyFn
+             * @param {EventFacade} e Event object
+             */
+            this.publish(DESTROY, {
+                queuable:false,
+                fireOnce:true,
+                defaultTargetOnly:true,
+                defaultFn: this._defDestroyFn
+            });
+            this.fire(DESTROY);
+
+            this.detachAll();
+            return this;
+        },
+
+        /**
+         * Default init event handler
+         *
+         * @method _defInitFn
+         * @param {EventFacade} e Event object, with a cfg property which 
+         * refers to the configuration object passed to the constructor.
+         * @protected
+         */
+        _defInitFn : function(e) {
+            this._baseInit(e.cfg);
+        },
+
+        /**
+         * Default destroy event handler
+         *
+         * @method _defDestroyFn
+         * @param {EventFacade} e Event object
+         * @protected
+         */
+        _defDestroyFn : function(e) {
+            this._baseDestroy(e.cfg);
+        }
+    };
+
+    Y.mix(Base, Attribute, false, null, 1);
+    Y.mix(Base, BaseCore, false, null, 1);
+
+    // Fix constructor
+    Base.prototype.constructor = Base;
+
+    Y.Base = Base;
+
+
+}, '3.5.1' ,{requires:['base-core', 'attribute-base']});

=== added directory 'debian/extras/jslibs/yui/base-build'
=== added file 'debian/extras/jslibs/yui/base-build/base-build-debug.js'
--- debian/extras/jslibs/yui/base-build/base-build-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/base-build/base-build-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,428 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('base-build', function(Y) {
+
+    /**
+     * The base-build submodule provides Base.build functionality, which
+     * can be used to create custom classes, by aggregating extensions onto 
+     * a main class.
+     *
+     * @module base
+     * @submodule base-build
+     * @for Base
+     */
+    var Base = Y.Base,
+        L = Y.Lang,
+        INITIALIZER = "initializer",
+        DESTRUCTOR = "destructor",
+        build,
+        arrayAggregator = function (prop, r, s) {
+            if (s[prop]) {
+                r[prop] = (r[prop] || []).concat(s[prop]);
+            }    
+        };
+
+    Base._build = function(name, main, extensions, px, sx, cfg) {
+
+        var build = Base._build,
+
+            builtClass = build._ctor(main, cfg),
+            buildCfg = build._cfg(main, cfg, extensions),
+
+            _mixCust = build._mixCust,
+
+            dynamic = builtClass._yuibuild.dynamic,
+
+            i, l, extClass, extProto,
+            initializer,
+            destructor;
+
+        // Augment/Aggregate
+        for (i = 0, l = extensions.length; i < l; i++) {
+            extClass = extensions[i];
+
+            extProto = extClass.prototype;
+            
+            initializer = extProto[INITIALIZER];
+            destructor = extProto[DESTRUCTOR];
+            delete extProto[INITIALIZER];
+            delete extProto[DESTRUCTOR];
+
+            // Prototype, old non-displacing augment
+            Y.mix(builtClass, extClass, true, null, 1);
+
+            // Custom Statics
+            _mixCust(builtClass, extClass, buildCfg);
+
+            if (initializer) { 
+                extProto[INITIALIZER] = initializer;
+            }
+
+            if (destructor) {
+                extProto[DESTRUCTOR] = destructor;
+            }
+
+            builtClass._yuibuild.exts.push(extClass);
+        }
+
+        if (px) {
+            Y.mix(builtClass.prototype, px, true);
+        }
+
+        if (sx) {
+            Y.mix(builtClass, build._clean(sx, buildCfg), true);
+            _mixCust(builtClass, sx, buildCfg);
+        }
+
+        builtClass.prototype.hasImpl = build._impl;
+
+        if (dynamic) {
+            builtClass.NAME = name;
+            builtClass.prototype.constructor = builtClass;
+        }
+
+        return builtClass;
+    };
+
+    build = Base._build;
+
+    Y.mix(build, {
+
+        _mixCust: function(r, s, cfg) {
+            
+            var aggregates, 
+                custom, 
+                statics,
+                aggr,
+                l,
+                i;
+                
+            if (cfg) {
+                aggregates = cfg.aggregates;
+                custom = cfg.custom;
+                statics = cfg.statics;
+            }
+
+            if (statics) {
+                Y.mix(r, s, true, statics);
+            }
+
+            if (aggregates) {
+                for (i = 0, l = aggregates.length; i < l; i++) {
+                    aggr = aggregates[i];
+                    if (!r.hasOwnProperty(aggr) && s.hasOwnProperty(aggr)) {
+                        r[aggr] = L.isArray(s[aggr]) ? [] : {};
+                    }
+                    Y.aggregate(r, s, true, [aggr]);
+                }
+            }
+
+            if (custom) {
+                for (i in custom) {
+                    if (custom.hasOwnProperty(i)) {
+                        custom[i](i, r, s);
+                    }
+                }
+            }
+            
+        },
+
+        _tmpl: function(main) {
+
+            function BuiltClass() {
+                BuiltClass.superclass.constructor.apply(this, arguments);
+            }
+            Y.extend(BuiltClass, main);
+
+            return BuiltClass;
+        },
+
+        _impl : function(extClass) {
+            var classes = this._getClasses(), i, l, cls, exts, ll, j;
+            for (i = 0, l = classes.length; i < l; i++) {
+                cls = classes[i];
+                if (cls._yuibuild) {
+                    exts = cls._yuibuild.exts;
+                    ll = exts.length;
+    
+                    for (j = 0; j < ll; j++) {
+                        if (exts[j] === extClass) {
+                            return true;
+                        }
+                    }
+                }
+            }
+            return false;
+        },
+
+        _ctor : function(main, cfg) {
+
+           var dynamic = (cfg && false === cfg.dynamic) ? false : true,
+               builtClass = (dynamic) ? build._tmpl(main) : main,
+               buildCfg = builtClass._yuibuild;
+
+            if (!buildCfg) {
+                buildCfg = builtClass._yuibuild = {};
+            }
+
+            buildCfg.id = buildCfg.id || null;
+            buildCfg.exts = buildCfg.exts || [];
+            buildCfg.dynamic = dynamic;
+
+            return builtClass;
+        },
+
+        _cfg : function(main, cfg, exts) {
+            var aggr = [], 
+                cust = {},
+                statics = [],
+                buildCfg,
+                cfgAggr = (cfg && cfg.aggregates),
+                cfgCustBuild = (cfg && cfg.custom),
+                cfgStatics = (cfg && cfg.statics),
+                c = main,
+                i, 
+                l;
+
+            // Prototype Chain
+            while (c && c.prototype) {
+                buildCfg = c._buildCfg;
+                if (buildCfg) {
+                    if (buildCfg.aggregates) {
+                        aggr = aggr.concat(buildCfg.aggregates);
+                    }
+                    if (buildCfg.custom) {
+                        Y.mix(cust, buildCfg.custom, true);
+                    }
+                    if (buildCfg.statics) {
+                        statics = statics.concat(buildCfg.statics);
+                    }
+                }
+                c = c.superclass ? c.superclass.constructor : null;
+            }
+
+            // Exts
+            if (exts) {
+                for (i = 0, l = exts.length; i < l; i++) {
+                    c = exts[i];
+                    buildCfg = c._buildCfg;
+                    if (buildCfg) {
+                        if (buildCfg.aggregates) {
+                            aggr = aggr.concat(buildCfg.aggregates);
+                        }
+                        if (buildCfg.custom) {
+                            Y.mix(cust, buildCfg.custom, true);
+                        }
+                        if (buildCfg.statics) {
+                            statics = statics.concat(buildCfg.statics);
+                        }
+                    }                    
+                }
+            }
+
+            if (cfgAggr) {
+                aggr = aggr.concat(cfgAggr);
+            }
+
+            if (cfgCustBuild) {
+                Y.mix(cust, cfg.cfgBuild, true);
+            }
+
+            if (cfgStatics) {
+                statics = statics.concat(cfgStatics);
+            }
+
+            return {
+                aggregates: aggr,
+                custom: cust,
+                statics: statics
+            };
+        },
+
+        _clean : function(sx, cfg) {
+            var prop, i, l, sxclone = Y.merge(sx),
+                aggregates = cfg.aggregates,
+                custom = cfg.custom;
+
+            for (prop in custom) {
+                if (sxclone.hasOwnProperty(prop)) {
+                    delete sxclone[prop];
+                }
+            }
+
+            for (i = 0, l = aggregates.length; i < l; i++) {
+                prop = aggregates[i];
+                if (sxclone.hasOwnProperty(prop)) {
+                    delete sxclone[prop];
+                }
+            }
+
+            return sxclone;
+        }
+    });
+
+    /**
+     * <p>
+     * Builds a custom constructor function (class) from the
+     * main function, and array of extension functions (classes)
+     * provided. The NAME field for the constructor function is 
+     * defined by the first argument passed in.
+     * </p>
+     * <p>
+     * The cfg object supports the following properties
+     * </p>
+     * <dl>
+     *    <dt>dynamic &#60;boolean&#62;</dt>
+     *    <dd>
+     *    <p>If true (default), a completely new class
+     *    is created which extends the main class, and acts as the 
+     *    host on which the extension classes are augmented.</p>
+     *    <p>If false, the extensions classes are augmented directly to
+     *    the main class, modifying the main class' prototype.</p>
+     *    </dd>
+     *    <dt>aggregates &#60;String[]&#62;</dt>
+     *    <dd>An array of static property names, which will get aggregated
+     *    on to the built class, in addition to the default properties build 
+     *    will always aggregate as defined by the main class' static _buildCfg
+     *    property.
+     *    </dd>
+     * </dl>
+     *
+     * @method build
+     * @deprecated Use the more convenient Base.create and Base.mix methods instead
+     * @static
+     * @param {Function} name The name of the new class. Used to defined the NAME property for the new class.
+     * @param {Function} main The main class on which to base the built class
+     * @param {Function[]} extensions The set of extension classes which will be
+     * augmented/aggregated to the built class.
+     * @param {Object} cfg Optional. Build configuration for the class (see description).
+     * @return {Function} A custom class, created from the provided main and extension classes
+     */
+    Base.build = function(name, main, extensions, cfg) {
+        return build(name, main, extensions, null, null, cfg);
+    };
+
+    /**
+     * Creates a new class (constructor function) which extends the base class passed in as the second argument, 
+     * and mixes in the array of extensions provided.
+     * 
+     * Prototype properties or methods can be added to the new class, using the px argument (similar to Y.extend).
+     * 
+     * Static properties or methods can be added to the new class, using the sx argument (similar to Y.extend).
+     * 
+     * **NOTE FOR COMPONENT DEVELOPERS**: Both the `base` class, and `extensions` can define static a `_buildCfg` 
+     * property, which acts as class creation meta-data, and drives how special static properties from the base 
+     * class, or extensions should be copied, aggregated or (custom) mixed into the newly created class.
+     * 
+     * The `_buildCfg` property is a hash with 3 supported properties: `statics`, `aggregates` and `custom`, e.g:
+     * 
+     *     // If the Base/Main class is the thing introducing the property:
+     * 
+     *     MyBaseClass._buildCfg = {
+     *     
+     *        // Static properties/methods to copy (Alias) to the built class.
+     *        statics: ["CopyThisMethod", "CopyThisProperty"],
+     * 
+     *        // Static props to aggregate onto the built class.
+     *        aggregates: ["AggregateThisProperty"],
+     * 
+     *        // Static properties which need custom handling (e.g. deep merge etc.)
+     *        custom: {
+     *           "CustomProperty" : function(property, Receiver, Supplier) {
+     *              ...
+     *              var triggers = Receiver.CustomProperty.triggers; 
+                    Receiver.CustomProperty.triggers = triggers.concat(Supplier.CustomProperty.triggers);
+     *              ...
+     *           }
+     *        }
+     *     };
+     * 
+     *     MyBaseClass.CopyThisMethod = function() {...}; 
+     *     MyBaseClass.CopyThisProperty = "foo";
+     *     MyBaseClass.AggregateThisProperty = {...};
+     *     MyBaseClass.CustomProperty = {
+     *        triggers: [...]
+     *     }
+     *
+     *     // Or, if the Extension is the thing introducing the property:
+     * 
+     *     MyExtension._buildCfg = {
+     *         statics : ...
+     *         aggregates : ...
+     *         custom : ...  
+     *     }    
+     * 
+     * This way, when users pass your base or extension class to `Y.Base.create` or `Y.Base.mix`, they don't need to
+     * know which properties need special handling. `Y.Base` has a buildCfg which defines `ATTRS` for custom mix handling
+     * (to protect the static config objects), and `Y.Widget` has a buildCfg which specifies `HTML_PARSER` for 
+     * straight up aggregation.
+     *
+     * @method create
+     * @static
+     * @param {Function} name The name of the newly created class. Used to defined the NAME property for the new class.
+     * @param {Function} main The base class which the new class should extend. This class needs to be Base or a class derived from base (e.g. Widget).
+     * @param {Function[]} extensions The list of extensions which will be mixed into the built class.
+     * @param {Object} px The set of prototype properties/methods to add to the built class.
+     * @param {Object} sx The set of static properties/methods to add to the built class.
+     * @return {Function} The newly created class.
+     */
+    Base.create = function(name, base, extensions, px, sx) {
+        return build(name, base, extensions, px, sx);
+    };
+
+    /**
+     * <p>Mixes in a list of extensions to an existing class.</p>
+     * @method mix
+     * @static
+     * @param {Function} main The existing class into which the extensions should be mixed.  The class needs to be Base or a class derived from Base (e.g. Widget)
+     * @param {Function[]} extensions The set of extension classes which will mixed into the existing main class.
+     * @return {Function} The modified main class, with extensions mixed in.
+     */
+    Base.mix = function(main, extensions) {
+        return build(null, main, extensions, null, null, {dynamic:false});
+    };
+
+    /**
+     * The build configuration for the Base class.
+     *
+     * Defines the static fields which need to be aggregated
+     * when the Base class is used as the main class passed to
+     * the <a href="#method_Base.build">Base.build</a> method.
+     *
+     * @property _buildCfg
+     * @type Object
+     * @static
+     * @final
+     * @private
+     */
+    Base._buildCfg = {
+        custom : {
+            ATTRS : function(prop, r, s) {
+
+                r.ATTRS = r.ATTRS || {};
+
+                if (s.ATTRS) {
+
+                    var sAttrs = s.ATTRS,
+                        rAttrs = r.ATTRS,
+                        a;
+
+                    for (a in sAttrs) {
+                        if (sAttrs.hasOwnProperty(a)) {
+                            rAttrs[a] = rAttrs[a] || {};
+                            Y.mix(rAttrs[a], sAttrs[a], true);
+                        }
+                    }
+                }
+            },
+            _NON_ATTRS_CFG : arrayAggregator
+        },
+        aggregates : ["_PLUG", "_UNPLUG"]
+    };
+
+
+}, '3.5.1' ,{requires:['base-base']});

=== added file 'debian/extras/jslibs/yui/base-build/base-build-min.js'
--- debian/extras/jslibs/yui/base-build/base-build-min.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/base-build/base-build-min.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,7 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add("base-build",function(g){var c=g.Base,a=g.Lang,b="initializer",e="destructor",f,d=function(j,i,h){if(h[j]){i[j]=(i[j]||[]).concat(h[j]);}};c._build=function(h,o,t,x,w,q){var y=c._build,j=y._ctor(o,q),m=y._cfg(o,q,t),v=y._mixCust,k=j._yuibuild.dynamic,p,n,u,z,s,r;for(p=0,n=t.length;p<n;p++){u=t[p];z=u.prototype;s=z[b];r=z[e];delete z[b];delete z[e];g.mix(j,u,true,null,1);v(j,u,m);if(s){z[b]=s;}if(r){z[e]=r;}j._yuibuild.exts.push(u);}if(x){g.mix(j.prototype,x,true);}if(w){g.mix(j,y._clean(w,m),true);v(j,w,m);}j.prototype.hasImpl=y._impl;if(k){j.NAME=h;j.prototype.constructor=j;}return j;};f=c._build;g.mix(f,{_mixCust:function(h,t,p){var o,j,q,k,m,n;if(p){o=p.aggregates;j=p.custom;q=p.statics;}if(q){g.mix(h,t,true,q);}if(o){for(n=0,m=o.length;n<m;n++){k=o[n];if(!h.hasOwnProperty(k)&&t.hasOwnProperty(k)){h[k]=a.isArray(t[k])?[]:{};}g.aggregate(h,t,true,[k]);}}if(j){for(n in j){if(j.hasOwnProperty(n)){j[n](n,h,t);}}}},_tmpl:function(h){function i(){i.superclass.constructor.apply(this,arguments);}g.extend(i,h);return i;},_impl:function(n){var q=this._getClasses(),p,k,h,o,r,m;for(p=0,k=q.length;p<k;p++){h=q[p];if(h._yuibuild){o=h._yuibuild.exts;r=o.length;for(m=0;m<r;m++){if(o[m]===n){return true;}}}}return false;},_ctor:function(h,i){var k=(i&&false===i.dynamic)?false:true,l=(k)?f._tmpl(h):h,j=l._yuibuild;if(!j){j=l._yuibuild={};}j.id=j.id||null;j.exts=j.exts||[];j.dynamic=k;return l;},_cfg:function(m,q,n){var k=[],p={},v=[],h,t=(q&&q.aggregates),u=(q&&q.custom),r=(q&&q.statics),s=m,o,j;while(s&&s.prototype){h=s._buildCfg;if(h){if(h.aggregates){k=k.concat(h.aggregates);}if(h.custom){g.mix(p,h.custom,true);}if(h.statics){v=v.concat(h.statics);}}s=s.superclass?s.superclass.constructor:null;}if(n){for(o=0,j=n.length;o<j;o++){s=n[o];h=s._buildCfg;if(h){if(h.aggregates){k=k.concat(h.aggregates);}if(h.custom){g.mix(p,h.custom,true);}if(h.statics){v=v.concat(h.statics);}}}}if(t){k=k.concat(t);}if(u){g.mix(p,q.cfgBuild,true);}if(r){v=v.concat(r);}return{aggregates:k,custom:p,statics:v};},_clean:function(q,j){var p,k,h,n=g.merge(q),o=j.aggregates,m=j.custom;for(p in m){if(n.hasOwnProperty(p)){delete n[p];}}for(k=0,h=o.length;k<h;k++){p=o[k];if(n.hasOwnProperty(p)){delete n[p];}}return n;}});c.build=function(j,h,k,i){return f(j,h,k,null,null,i);};c.create=function(h,k,j,i,l){return f(h,k,j,i,l);};c.mix=function(h,i){return f(null,h,i,null,null,{dynamic:false});};c._buildCfg={custom:{ATTRS:function(m,k,i){k.ATTRS=k.ATTRS||{};if(i.ATTRS){var j=i.ATTRS,l=k.ATTRS,h;for(h in j){if(j.hasOwnProperty(h)){l[h]=l[h]||{};g.mix(l[h],j[h],true);}}}},_NON_ATTRS_CFG:d},aggregates:["_PLUG","_UNPLUG"]};},"3.5.1",{requires:["base-base"]});
\ No newline at end of file

=== added file 'debian/extras/jslibs/yui/base-build/base-build.js'
--- debian/extras/jslibs/yui/base-build/base-build.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/base-build/base-build.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,428 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('base-build', function(Y) {
+
+    /**
+     * The base-build submodule provides Base.build functionality, which
+     * can be used to create custom classes, by aggregating extensions onto 
+     * a main class.
+     *
+     * @module base
+     * @submodule base-build
+     * @for Base
+     */
+    var Base = Y.Base,
+        L = Y.Lang,
+        INITIALIZER = "initializer",
+        DESTRUCTOR = "destructor",
+        build,
+        arrayAggregator = function (prop, r, s) {
+            if (s[prop]) {
+                r[prop] = (r[prop] || []).concat(s[prop]);
+            }    
+        };
+
+    Base._build = function(name, main, extensions, px, sx, cfg) {
+
+        var build = Base._build,
+
+            builtClass = build._ctor(main, cfg),
+            buildCfg = build._cfg(main, cfg, extensions),
+
+            _mixCust = build._mixCust,
+
+            dynamic = builtClass._yuibuild.dynamic,
+
+            i, l, extClass, extProto,
+            initializer,
+            destructor;
+
+        // Augment/Aggregate
+        for (i = 0, l = extensions.length; i < l; i++) {
+            extClass = extensions[i];
+
+            extProto = extClass.prototype;
+            
+            initializer = extProto[INITIALIZER];
+            destructor = extProto[DESTRUCTOR];
+            delete extProto[INITIALIZER];
+            delete extProto[DESTRUCTOR];
+
+            // Prototype, old non-displacing augment
+            Y.mix(builtClass, extClass, true, null, 1);
+
+            // Custom Statics
+            _mixCust(builtClass, extClass, buildCfg);
+
+            if (initializer) { 
+                extProto[INITIALIZER] = initializer;
+            }
+
+            if (destructor) {
+                extProto[DESTRUCTOR] = destructor;
+            }
+
+            builtClass._yuibuild.exts.push(extClass);
+        }
+
+        if (px) {
+            Y.mix(builtClass.prototype, px, true);
+        }
+
+        if (sx) {
+            Y.mix(builtClass, build._clean(sx, buildCfg), true);
+            _mixCust(builtClass, sx, buildCfg);
+        }
+
+        builtClass.prototype.hasImpl = build._impl;
+
+        if (dynamic) {
+            builtClass.NAME = name;
+            builtClass.prototype.constructor = builtClass;
+        }
+
+        return builtClass;
+    };
+
+    build = Base._build;
+
+    Y.mix(build, {
+
+        _mixCust: function(r, s, cfg) {
+            
+            var aggregates, 
+                custom, 
+                statics,
+                aggr,
+                l,
+                i;
+                
+            if (cfg) {
+                aggregates = cfg.aggregates;
+                custom = cfg.custom;
+                statics = cfg.statics;
+            }
+
+            if (statics) {
+                Y.mix(r, s, true, statics);
+            }
+
+            if (aggregates) {
+                for (i = 0, l = aggregates.length; i < l; i++) {
+                    aggr = aggregates[i];
+                    if (!r.hasOwnProperty(aggr) && s.hasOwnProperty(aggr)) {
+                        r[aggr] = L.isArray(s[aggr]) ? [] : {};
+                    }
+                    Y.aggregate(r, s, true, [aggr]);
+                }
+            }
+
+            if (custom) {
+                for (i in custom) {
+                    if (custom.hasOwnProperty(i)) {
+                        custom[i](i, r, s);
+                    }
+                }
+            }
+            
+        },
+
+        _tmpl: function(main) {
+
+            function BuiltClass() {
+                BuiltClass.superclass.constructor.apply(this, arguments);
+            }
+            Y.extend(BuiltClass, main);
+
+            return BuiltClass;
+        },
+
+        _impl : function(extClass) {
+            var classes = this._getClasses(), i, l, cls, exts, ll, j;
+            for (i = 0, l = classes.length; i < l; i++) {
+                cls = classes[i];
+                if (cls._yuibuild) {
+                    exts = cls._yuibuild.exts;
+                    ll = exts.length;
+    
+                    for (j = 0; j < ll; j++) {
+                        if (exts[j] === extClass) {
+                            return true;
+                        }
+                    }
+                }
+            }
+            return false;
+        },
+
+        _ctor : function(main, cfg) {
+
+           var dynamic = (cfg && false === cfg.dynamic) ? false : true,
+               builtClass = (dynamic) ? build._tmpl(main) : main,
+               buildCfg = builtClass._yuibuild;
+
+            if (!buildCfg) {
+                buildCfg = builtClass._yuibuild = {};
+            }
+
+            buildCfg.id = buildCfg.id || null;
+            buildCfg.exts = buildCfg.exts || [];
+            buildCfg.dynamic = dynamic;
+
+            return builtClass;
+        },
+
+        _cfg : function(main, cfg, exts) {
+            var aggr = [], 
+                cust = {},
+                statics = [],
+                buildCfg,
+                cfgAggr = (cfg && cfg.aggregates),
+                cfgCustBuild = (cfg && cfg.custom),
+                cfgStatics = (cfg && cfg.statics),
+                c = main,
+                i, 
+                l;
+
+            // Prototype Chain
+            while (c && c.prototype) {
+                buildCfg = c._buildCfg;
+                if (buildCfg) {
+                    if (buildCfg.aggregates) {
+                        aggr = aggr.concat(buildCfg.aggregates);
+                    }
+                    if (buildCfg.custom) {
+                        Y.mix(cust, buildCfg.custom, true);
+                    }
+                    if (buildCfg.statics) {
+                        statics = statics.concat(buildCfg.statics);
+                    }
+                }
+                c = c.superclass ? c.superclass.constructor : null;
+            }
+
+            // Exts
+            if (exts) {
+                for (i = 0, l = exts.length; i < l; i++) {
+                    c = exts[i];
+                    buildCfg = c._buildCfg;
+                    if (buildCfg) {
+                        if (buildCfg.aggregates) {
+                            aggr = aggr.concat(buildCfg.aggregates);
+                        }
+                        if (buildCfg.custom) {
+                            Y.mix(cust, buildCfg.custom, true);
+                        }
+                        if (buildCfg.statics) {
+                            statics = statics.concat(buildCfg.statics);
+                        }
+                    }                    
+                }
+            }
+
+            if (cfgAggr) {
+                aggr = aggr.concat(cfgAggr);
+            }
+
+            if (cfgCustBuild) {
+                Y.mix(cust, cfg.cfgBuild, true);
+            }
+
+            if (cfgStatics) {
+                statics = statics.concat(cfgStatics);
+            }
+
+            return {
+                aggregates: aggr,
+                custom: cust,
+                statics: statics
+            };
+        },
+
+        _clean : function(sx, cfg) {
+            var prop, i, l, sxclone = Y.merge(sx),
+                aggregates = cfg.aggregates,
+                custom = cfg.custom;
+
+            for (prop in custom) {
+                if (sxclone.hasOwnProperty(prop)) {
+                    delete sxclone[prop];
+                }
+            }
+
+            for (i = 0, l = aggregates.length; i < l; i++) {
+                prop = aggregates[i];
+                if (sxclone.hasOwnProperty(prop)) {
+                    delete sxclone[prop];
+                }
+            }
+
+            return sxclone;
+        }
+    });
+
+    /**
+     * <p>
+     * Builds a custom constructor function (class) from the
+     * main function, and array of extension functions (classes)
+     * provided. The NAME field for the constructor function is 
+     * defined by the first argument passed in.
+     * </p>
+     * <p>
+     * The cfg object supports the following properties
+     * </p>
+     * <dl>
+     *    <dt>dynamic &#60;boolean&#62;</dt>
+     *    <dd>
+     *    <p>If true (default), a completely new class
+     *    is created which extends the main class, and acts as the 
+     *    host on which the extension classes are augmented.</p>
+     *    <p>If false, the extensions classes are augmented directly to
+     *    the main class, modifying the main class' prototype.</p>
+     *    </dd>
+     *    <dt>aggregates &#60;String[]&#62;</dt>
+     *    <dd>An array of static property names, which will get aggregated
+     *    on to the built class, in addition to the default properties build 
+     *    will always aggregate as defined by the main class' static _buildCfg
+     *    property.
+     *    </dd>
+     * </dl>
+     *
+     * @method build
+     * @deprecated Use the more convenient Base.create and Base.mix methods instead
+     * @static
+     * @param {Function} name The name of the new class. Used to defined the NAME property for the new class.
+     * @param {Function} main The main class on which to base the built class
+     * @param {Function[]} extensions The set of extension classes which will be
+     * augmented/aggregated to the built class.
+     * @param {Object} cfg Optional. Build configuration for the class (see description).
+     * @return {Function} A custom class, created from the provided main and extension classes
+     */
+    Base.build = function(name, main, extensions, cfg) {
+        return build(name, main, extensions, null, null, cfg);
+    };
+
+    /**
+     * Creates a new class (constructor function) which extends the base class passed in as the second argument, 
+     * and mixes in the array of extensions provided.
+     * 
+     * Prototype properties or methods can be added to the new class, using the px argument (similar to Y.extend).
+     * 
+     * Static properties or methods can be added to the new class, using the sx argument (similar to Y.extend).
+     * 
+     * **NOTE FOR COMPONENT DEVELOPERS**: Both the `base` class, and `extensions` can define static a `_buildCfg` 
+     * property, which acts as class creation meta-data, and drives how special static properties from the base 
+     * class, or extensions should be copied, aggregated or (custom) mixed into the newly created class.
+     * 
+     * The `_buildCfg` property is a hash with 3 supported properties: `statics`, `aggregates` and `custom`, e.g:
+     * 
+     *     // If the Base/Main class is the thing introducing the property:
+     * 
+     *     MyBaseClass._buildCfg = {
+     *     
+     *        // Static properties/methods to copy (Alias) to the built class.
+     *        statics: ["CopyThisMethod", "CopyThisProperty"],
+     * 
+     *        // Static props to aggregate onto the built class.
+     *        aggregates: ["AggregateThisProperty"],
+     * 
+     *        // Static properties which need custom handling (e.g. deep merge etc.)
+     *        custom: {
+     *           "CustomProperty" : function(property, Receiver, Supplier) {
+     *              ...
+     *              var triggers = Receiver.CustomProperty.triggers; 
+                    Receiver.CustomProperty.triggers = triggers.concat(Supplier.CustomProperty.triggers);
+     *              ...
+     *           }
+     *        }
+     *     };
+     * 
+     *     MyBaseClass.CopyThisMethod = function() {...}; 
+     *     MyBaseClass.CopyThisProperty = "foo";
+     *     MyBaseClass.AggregateThisProperty = {...};
+     *     MyBaseClass.CustomProperty = {
+     *        triggers: [...]
+     *     }
+     *
+     *     // Or, if the Extension is the thing introducing the property:
+     * 
+     *     MyExtension._buildCfg = {
+     *         statics : ...
+     *         aggregates : ...
+     *         custom : ...  
+     *     }    
+     * 
+     * This way, when users pass your base or extension class to `Y.Base.create` or `Y.Base.mix`, they don't need to
+     * know which properties need special handling. `Y.Base` has a buildCfg which defines `ATTRS` for custom mix handling
+     * (to protect the static config objects), and `Y.Widget` has a buildCfg which specifies `HTML_PARSER` for 
+     * straight up aggregation.
+     *
+     * @method create
+     * @static
+     * @param {Function} name The name of the newly created class. Used to defined the NAME property for the new class.
+     * @param {Function} main The base class which the new class should extend. This class needs to be Base or a class derived from base (e.g. Widget).
+     * @param {Function[]} extensions The list of extensions which will be mixed into the built class.
+     * @param {Object} px The set of prototype properties/methods to add to the built class.
+     * @param {Object} sx The set of static properties/methods to add to the built class.
+     * @return {Function} The newly created class.
+     */
+    Base.create = function(name, base, extensions, px, sx) {
+        return build(name, base, extensions, px, sx);
+    };
+
+    /**
+     * <p>Mixes in a list of extensions to an existing class.</p>
+     * @method mix
+     * @static
+     * @param {Function} main The existing class into which the extensions should be mixed.  The class needs to be Base or a class derived from Base (e.g. Widget)
+     * @param {Function[]} extensions The set of extension classes which will mixed into the existing main class.
+     * @return {Function} The modified main class, with extensions mixed in.
+     */
+    Base.mix = function(main, extensions) {
+        return build(null, main, extensions, null, null, {dynamic:false});
+    };
+
+    /**
+     * The build configuration for the Base class.
+     *
+     * Defines the static fields which need to be aggregated
+     * when the Base class is used as the main class passed to
+     * the <a href="#method_Base.build">Base.build</a> method.
+     *
+     * @property _buildCfg
+     * @type Object
+     * @static
+     * @final
+     * @private
+     */
+    Base._buildCfg = {
+        custom : {
+            ATTRS : function(prop, r, s) {
+
+                r.ATTRS = r.ATTRS || {};
+
+                if (s.ATTRS) {
+
+                    var sAttrs = s.ATTRS,
+                        rAttrs = r.ATTRS,
+                        a;
+
+                    for (a in sAttrs) {
+                        if (sAttrs.hasOwnProperty(a)) {
+                            rAttrs[a] = rAttrs[a] || {};
+                            Y.mix(rAttrs[a], sAttrs[a], true);
+                        }
+                    }
+                }
+            },
+            _NON_ATTRS_CFG : arrayAggregator
+        },
+        aggregates : ["_PLUG", "_UNPLUG"]
+    };
+
+
+}, '3.5.1' ,{requires:['base-base']});

=== added directory 'debian/extras/jslibs/yui/base-core'
=== added file 'debian/extras/jslibs/yui/base-core/base-core-debug.js'
--- debian/extras/jslibs/yui/base-core/base-core-debug.js	1970-01-01 00:00:00 +0000
+++ debian/extras/jslibs/yui/base-core/base-core-debug.js	2013-02-02 01:30:27 +0000
@@ -0,0 +1,621 @@
+/*
+YUI 3.5.1 (build 22)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+YUI.add('base-core', function(Y) {
+
+    /**
+     * The base module provides the Base class, which objects requiring attribute and custom event support can extend. 
+     * The module also provides two ways to reuse code - It augments Base with the Plugin.Host interface which provides 
+     * plugin support and also provides the BaseCore.build method which provides a way to build custom classes using extensions.
+     *
+     * @module base
+     */
+
+    /**
+     * <p>The base-core module provides the BaseCore class, the lightest version of Base, 
+     * which provides Base's basic lifecycle management and ATTRS construction support, 
+     * but doesn't fire init/destroy or attribute change events.</p> 
+     * 
+     * <p>It mixes in AttributeCore, which is the lightest version of Attribute</p>
+     *
+     * @module base
+     * @submodule base-core
+     */
+    var O = Y.Object,
+        L = Y.Lang,
+        DOT = ".",
+        INITIALIZED = "initialized",
+        DESTROYED = "destroyed",
+        INITIALIZER = "initializer",
+        OBJECT_CONSTRUCTOR = Object.prototype.constructor,
+        DEEP = "deep",
+        SHALLOW = "shallow",
+        DESTRUCTOR = "destructor",
+
+        AttributeCore = Y.AttributeCore,
+
+        _wlmix = function(r, s, wlhash) {
+            var p;
+            for (p in s) {
+                if(wlhash[p]) { 
+                    r[p] = s[p];
+                }
+            }
+            return r;
+        };
+
+    /**
+     * The BaseCore class, is the lightest version of Base, and provides Base's 
+     * basic lifecycle management and ATTRS construction support, but doesn't 
+     * fire init/destroy or attribute change events.
+     *
+     * BaseCore also handles the chaining of initializer and destructor methods across 
+     * the hierarchy as part of object construction and destruction. Additionally, attributes 
+     * configured through the static <a href="#property_BaseCore.ATTRS">ATTRS</a> 
+     * property for each class in the hierarchy will be initialized by BaseCore.
+     *
+     * Classes which require attribute support, but don't intend to use/expose attribute 
+     * change events can extend BaseCore instead of Base for optimal kweight and 
+     * runtime performance.
+     * 
+     * @class BaseCore
+     * @constructor
+     * @uses AttributeCore
+     * @param {Object} cfg Object with configuration property name/value pairs. 
+     * The object can be used to provide initial values for the objects published 
+     * attributes.
+     */
+    function BaseCore(cfg) {
+        if (!this._BaseInvoked) {
+            this._BaseInvoked = true;
+
+            Y.log('constructor called', 'life', 'base');
+            this._initBase(cfg);
+        }
+        else { Y.log('Based constructor called more than once. Ignoring duplicate calls', 'life', 'base'); }
+    }
+
+    /**
+     * The list of properties which can be configured for each attribute 
+     * (e.g. setter, getter, writeOnce, readOnly etc.)
+     *
+     * @property _ATTR_CFG
+     * @type Array
+     * @static
+     * @private
+     */
+    BaseCore._ATTR_CFG = AttributeCore._ATTR_CFG.concat("cloneDefaultValue");
+    BaseCore._ATTR_CFG_HASH = Y.Array.hash(BaseCore._ATTR_CFG);
+
+    /**
+     * The array of non-attribute configuration properties supported by this class. 
+     * 
+     * For example `BaseCore` defines a "plugins" configuration property which 
+     * should not be set up as an attribute. This property is primarily required so 
+     * that when <a href="#property__allowAdHocAttrs">`_allowAdHocAttrs`</a> is enabled by a class, 
+     * non-attribute configuration properties don't get added as ad-hoc attributes.  
+     *
+     * @property _NON_ATTRS_CFG
+     * @type Array
+     * @static
+     * @private
+     */
+    BaseCore._NON_ATTRS_CFG = ["plugins"];
+
+    /**
+     * This property controls whether or not instances of this class should
+     * allow users to add ad-hoc attributes through the constructor configuration 
+     * hash.
+     *
+     * AdHoc attributes are attributes which are not defined by the class, and are 
+     * not handled by the MyClass._NON_ATTRS_CFG  
+     * 
+     * @property _allowAdHocAttrs
+     * @type boolean
+     * @default undefined (false)
+     * @protected
+     */
+
+    /**
+     * The string to be used to identify instances of this class.
+     * 
+     * Classes extending BaseCore, should define their own
+     * static NAME property, which should be camelCase by
+     * convention (e.g. MyClass.NAME = "myClass";).
+     *
+     * @property NAME
+     * @type String
+     * @static
+     */
+    BaseCore.NAME = "baseCore";
+
+    /**
+     * The default set of attributes which will be available for instances of this class, and 
+     * their configuration. In addition to the configuration properties listed by 
+     * AttributeCore's <a href="AttributeCore.html#method_addAttr">addAttr</a> method, 
+     * the attribute can also be configured with a "cloneDefaultValue" property, which 
+     * defines how the statically defined value field should be protected 
+     * ("shallow", "deep" and false are supported values). 
+     *
+     * By default if the value is an object literal or an array it will be "shallow" 
+     * cloned, to protect the default value.
+     *
+     * @property ATTRS
+     * @type Object
+     * @static
+     */
+    BaseCore.ATTRS = {
+        /**
+         * Flag indicating whether or not this object
+         * has been through the init lifecycle phase.
+         *
+         * 