var Cufon = (function() {

	var api = function() {
		return api.replace.apply(null, arguments);
	};

	var DOM = api.DOM = {

		ready: (function() {

			var complete = false, readyStatus = { loaded: 1, complete: 1 };

			var queue = [], perform = function() {
				if (complete) return;
				complete = true;
				for (var fn; fn = queue.shift(); fn());
			};

			// Gecko, Opera, WebKit r26101+

			if (document.addEventListener) {
				document.addEventListener('DOMContentLoaded', perform, false);
				window.addEventListener('pageshow', perform, false); // For cached Gecko pages
			}

			// Old WebKit, Internet Explorer

			if (!window.opera && document.readyState) (function() {
				readyStatus[document.readyState] ? perform() : setTimeout(arguments.callee, 10);
			})();

			// Internet Explorer

			if (document.readyState && document.createStyleSheet) (function() {
				try {
					document.body.doScroll('left');
					perform();
				}
				catch (e) {
					setTimeout(arguments.callee, 1);
				}
			})();

			addEvent(window, 'load', perform); // Fallback

			return function(listener) {
				if (!arguments.length) perform();
				else complete ? listener() : queue.push(listener);
			};

		})(),

		root: function() {
			return document.documentElement || document.body;
		}

	};

	var CSS = api.CSS = {

		Size: function(value, base) {

			this.value = parseFloat(value);
			this.unit = String(value).match(/[a-z%]*$/)[0] || 'px';

			this.convert = function(value) {
				return value / base * this.value;
			};

			this.convertFrom = function(value) {
				return value / this.value * base;
			};

			this.toString = function() {
				return this.value + this.unit;
			};

		},

		addClass: function(el, className) {
			var current = el.className;
			el.className = current + (current && ' ') + className;
			return el;
		},

		color: cached(function(value) {
			var parsed = {};
			parsed.color = value.replace(/^rgba\((.*?),\s*([\d.]+)\)/, function($0, $1, $2) {
				parsed.opacity = parseFloat($2);
				return 'rgb(' + $1 + ')';
			});
			return parsed;
		}),

		// has no direct CSS equivalent.
		// @see http://msdn.microsoft.com/en-us/library/system.windows.fontstretches.aspx
		fontStretch: cached(function(value) {
			if (typeof value == 'number') return value;
			if (/%$/.test(value)) return parseFloat(value) / 100;
			return {
				'ultra-condensed': 0.5,
				'extra-condensed': 0.625,
				condensed: 0.75,
				'semi-condensed': 0.875,
				'semi-expanded': 1.125,
				expanded: 1.25,
				'extra-expanded': 1.5,
				'ultra-expanded': 2
			}[value] || 1;
		}),

		getStyle: function(el) {
			var view = document.defaultView;
			if (view && view.getComputedStyle) return new Style(view.getComputedStyle(el, null));
			if (el.currentStyle) return new Style(el.currentStyle);
			return new Style(el.style);
		},

		gradient: cached(function(value) {
			var gradient = {
				id: value,
				type: value.match(/^-([a-z]+)-gradient\(/)[1],
				stops: []
			}, colors = value.substr(value.indexOf('(')).match(/([\d.]+=)?(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)/ig);
			for (var i = 0, l = colors.length, stop; i < l; ++i) {
				stop = colors[i].split('=', 2).reverse();
				gradient.stops.push([ stop[1] || i / (l - 1), stop[0] ]);
			}
			return gradient;
		}),

		quotedList: cached(function(value) {
			// doesn't work properly with empty quoted strings (""), but
			// it's not worth the extra code.
			var list = [], re = /\s*((["'])([\s\S]*?[^\\])\2|[^,]+)\s*/g, match;
			while (match = re.exec(value)) list.push(match[3] || match[1]);
			return list;
		}),

		recognizesMedia: cached(function(media) {
			var el = document.createElement('style'), sheet, container, supported;
			el.type = 'text/css';
			el.media = media;
			try { // this is cached anyway
				el.appendChild(document.createTextNode('/**/'));
			} catch (e) {}
			container = elementsByTagName('head')[0];
			container.insertBefore(el, container.firstChild);
			sheet = (el.sheet || el.styleSheet);
			supported = sheet && !sheet.disabled;
			container.removeChild(el);
			return supported;
		}),

		removeClass: function(el, className) {
			var re = RegExp('(?:^|\\s+)' + className +  '(?=\\s|$)', 'g');
			el.className = el.className.replace(re, '');
			return el;
		},

		supports: function(property, value) {
			var checker = document.createElement('span').style;
			if (checker[property] === undefined) return false;
			checker[property] = value;
			return checker[property] === value;
		},

		textAlign: function(word, style, position, wordCount) {
			if (style.get('textAlign') == 'right') {
				if (position > 0) word = ' ' + word;
			}
			else if (position < wordCount - 1) word += ' ';
			return word;
		},

		textShadow: cached(function(value) {
			if (value == 'none') return null;
			var shadows = [], currentShadow = {}, result, offCount = 0;
			var re = /(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)|(-?[\d.]+[a-z%]*)|,/ig;
			while (result = re.exec(value)) {
				if (result[0] == ',') {
					shadows.push(currentShadow);
					currentShadow = {};
					offCount = 0;
				}
				else if (result[1]) {
					currentShadow.color = result[1];
				}
				else {
					currentShadow[[ 'offX', 'offY', 'blur' ][offCount++]] = result[2];
				}
			}
			shadows.push(currentShadow);
			return shadows;
		}),

		textTransform: (function() {
			var map = {
				uppercase: function(s) {
					return s.toUpperCase();
				},
				lowercase: function(s) {
					return s.toLowerCase();
				},
				capitalize: function(s) {
					return s.replace(/(?:^|\s)./g, function($0) {
						return $0.toUpperCase();
					});
				}
			};
			return function(text, style) {
				var transform = map[style.get('textTransform')];
				return transform ? transform(text) : text;
			};
		})(),

		whiteSpace: (function() {
			var ignore = {
				inline: 1,
				'inline-block': 1,
				'run-in': 1
			};
			var wsStart = /^\s+/, wsEnd = /\s+$/;
			return function(text, style, node, previousElement, simple) {
				if (simple) return text.replace(wsStart, '').replace(wsEnd, ''); // @fixme too simple
				if (previousElement) {
					if (previousElement.nodeName.toLowerCase() == 'br') {
						text = text.replace(wsStart, '');
					}
				}
				if (ignore[style.get('display')]) return text;
				if (!node.previousSibling) text = text.replace(wsStart, '');
				if (!node.nextSibling) text = text.replace(wsEnd, '');
				return text;
			};
		})()

	};

	CSS.ready = (function() {

		// don't do anything in Safari 2 (it doesn't recognize any media type)
		var complete = !CSS.recognizesMedia('all'), hasLayout = false;

		var queue = [], perform = function() {
			complete = true;
			for (var fn; fn = queue.shift(); fn());
		};

		var links = elementsByTagName('link'), styles = elementsByTagName('style');

		function isContainerReady(el) {
			return el.disabled || isSheetReady(el.sheet, el.media || 'screen');
		}

		function isSheetReady(sheet, media) {
			// in Opera sheet.disabled is true when it's still loading,
			// even though link.disabled is false. they stay in sync if
			// set manually.
			if (!CSS.recognizesMedia(media || 'all')) return true;
			if (!sheet || sheet.disabled) return false;
			try {
				var rules = sheet.cssRules, rule;
				if (rules) {
					// needed for Safari 3 and Chrome 1.0.
					// in standards-conforming browsers cssRules contains @-rules.
					// Chrome 1.0 weirdness: rules[<number larger than .length - 1>]
					// returns the last rule, so a for loop is the only option.
					search: for (var i = 0, l = rules.length; rule = rules[i], i < l; ++i) {
						switch (rule.type) {
							case 2: // @charset
								break;
							case 3: // @import
								if (!isSheetReady(rule.styleSheet, rule.media.mediaText)) return false;
								break;
							default:
								// only @charset can precede @import
								break search;

						}
					}
				}
			}
			catch (e) {} // probably a style sheet from another domain
			return true;
		}

		function allStylesLoaded() {
			// Internet Explorer's style sheet model, there's no need to do anything
			if (document.createStyleSheet) return true;
			// standards-compliant browsers
			var el, i;
			for (i = 0; el = links[i]; ++i) {
				if (el.rel.toLowerCase() == 'stylesheet' && !isContainerReady(el)) return false;
			}
			for (i = 0; el = styles[i]; ++i) {
				if (!isContainerReady(el)) return false;
			}
			return true;
		}

		DOM.ready(function() {
			// getComputedStyle returns null in Gecko if used in an iframe with display: none
			if (!hasLayout) hasLayout = CSS.getStyle(document.body).isUsable();
			if (complete || (hasLayout && allStylesLoaded())) perform();
			else setTimeout(arguments.callee, 10);
		});

		return function(listener) {
			if (complete) listener();
			else queue.push(listener);
		};

	})();

	function Font(data) {

		var face = this.face = data.face, wordSeparators = {
			'\u0020': 1,
			'\u00a0': 1,
			'\u3000': 1
		};

		this.glyphs = (function(glyphs) {
			var key, fallbacks = {
				'\u2011': '\u002d',
				'\u00ad': '\u2011'
			};
			for (key in fallbacks) {
				if (!hasOwnProperty(fallbacks, key)) continue;
				if (!glyphs[key]) glyphs[key] = glyphs[fallbacks[key]];
			}
			return glyphs;
		})(data.glyphs);

		this.w = data.w;
		this.baseSize = parseInt(face['units-per-em'], 10);

		this.family = face['font-family'].toLowerCase();
		this.weight = face['font-weight'];
		this.style = face['font-style'] || 'normal';

		this.viewBox = (function () {
			var parts = face.bbox.split(/\s+/);
			var box = {
				minX: parseInt(parts[0], 10),
				minY: parseInt(parts[1], 10),
				maxX: parseInt(parts[2], 10),
				maxY: parseInt(parts[3], 10)
			};
			box.width = box.maxX - box.minX;
			box.height = box.maxY - box.minY;
			box.toString = function() {
				return [ this.minX, this.minY, this.width, this.height ].join(' ');
			};
			return box;
		})();

		this.ascent = -parseInt(face.ascent, 10);
		this.descent = -parseInt(face.descent, 10);

		this.height = -this.ascent + this.descent;

		this.spacing = function(chars, letterSpacing, wordSpacing) {
			var glyphs = this.glyphs, glyph,
				kerning, k,
				jumps = [],
				width = 0, w,
				i = -1, j = -1, chr;
			while (chr = chars[++i]) {
				glyph = glyphs[chr] || this.missingGlyph;
				if (!glyph) continue;
				if (kerning) {
					width -= k = kerning[chr] || 0;
					jumps[j] -= k;
				}
				w = glyph.w;
				if (isNaN(w)) w = +this.w; // may have been a String in old fonts
				if (w > 0) {
					w += letterSpacing;
					if (wordSeparators[chr]) w += wordSpacing;
				}
				width += jumps[++j] = ~~w; // get rid of decimals
				kerning = glyph.k;
			}
			jumps.total = width;
			return jumps;
		};

	}

	function FontFamily() {

		var styles = {}, mapping = {
			oblique: 'italic',
			italic: 'oblique'
		};

		this.add = function(font) {
			(styles[font.style] || (styles[font.style] = {}))[font.weight] = font;
		};

		this.get = function(style, weight) {
			var weights = styles[style] || styles[mapping[style]]
				|| styles.normal || styles.italic || styles.oblique;
			if (!weights) return null;
			// we don't have to worry about "bolder" and "lighter"
			// because IE's currentStyle returns a numeric value for it,
			// and other browsers use the computed value anyway
			weight = {
				normal: 400,
				bold: 700
			}[weight] || parseInt(weight, 10);
			if (weights[weight]) return weights[weight];
			// http://www.w3.org/TR/CSS21/fonts.html#propdef-font-weight
			// Gecko uses x99/x01 for lighter/bolder
			var up = {
				1: 1,
				99: 0
			}[weight % 100], alts = [], min, max;
			if (up === undefined) up = weight > 400;
			if (weight == 500) weight = 400;
			for (var alt in weights) {
				if (!hasOwnProperty(weights, alt)) continue;
				alt = parseInt(alt, 10);
				if (!min || alt < min) min = alt;
				if (!max || alt > max) max = alt;
				alts.push(alt);
			}
			if (weight < min) weight = min;
			if (weight > max) weight = max;
			alts.sort(function(a, b) {
				return (up
					? (a >= weight && b >= weight) ? a < b : a > b
					: (a <= weight && b <= weight) ? a > b : a < b) ? -1 : 1;
			});
			return weights[alts[0]];
		};

	}

	function HoverHandler() {

		function contains(node, anotherNode) {
			try {
				if (node.contains) return node.contains(anotherNode);
				return node.compareDocumentPosition(anotherNode) & 16;
			}
			catch(e) {} // probably a XUL element such as a scrollbar
			return false;
		}

		function onOverOut(e) {
			var related = e.relatedTarget;
			// there might be no relatedTarget if the element is right next
			// to the window frame
			if (related && contains(this, related)) return;
			trigger(this, e.type == 'mouseover');
		}

		function onEnterLeave(e) {
			trigger(this, e.type == 'mouseenter');
		}

		function trigger(el, hoverState) {
			// A timeout is needed so that the event can actually "happen"
			// before replace is triggered. This ensures that styles are up
			// to date.
			setTimeout(function() {
				var options = sharedStorage.get(el).options;
				api.replace(el, hoverState ? merge(options, options.hover) : options, true);
			}, 10);
		}

		this.attach = function(el) {
			if (el.onmouseenter === undefined) {
				addEvent(el, 'mouseover', onOverOut);
				addEvent(el, 'mouseout', onOverOut);
			}
			else {
				addEvent(el, 'mouseenter', onEnterLeave);
				addEvent(el, 'mouseleave', onEnterLeave);
			}
		};

	}

	function ReplaceHistory() {

		var list = [], map = {};

		function filter(keys) {
			var values = [], key;
			for (var i = 0; key = keys[i]; ++i) values[i] = list[map[key]];
			return values;
		}

		this.add = function(key, args) {
			map[key] = list.push(args) - 1;
		};

		this.repeat = function() {
			var snapshot = arguments.length ? filter(arguments) : list, args;
			for (var i = 0; args = snapshot[i++];) api.replace(args[0], args[1], true);
		};

	}

	function Storage() {

		var map = {}, at = 0;

		function identify(el) {
			return el.cufid || (el.cufid = ++at);
		}

		this.get = function(el) {
			var id = identify(el);
			return map[id] || (map[id] = {});
		};

	}

	function Style(style) {

		var custom = {}, sizes = {};

		this.extend = function(styles) {
			for (var property in styles) {
				if (hasOwnProperty(styles, property)) custom[property] = styles[property];
			}
			return this;
		};

		this.get = function(property) {
			return custom[property] != undefined ? custom[property] : style[property];
		};

		this.getSize = function(property, base) {
			return sizes[property] || (sizes[property] = new CSS.Size(this.get(property), base));
		};

		this.isUsable = function() {
			return !!style;
		};

	}

	function addEvent(el, type, listener) {
		if (el.addEventListener) {
			el.addEventListener(type, listener, false);
		}
		else if (el.attachEvent) {
			el.attachEvent('on' + type, function() {
				return listener.call(el, window.event);
			});
		}
	}

	function attach(el, options) {
		var storage = sharedStorage.get(el);
		if (storage.options) return el;
		if (options.hover && options.hoverables[el.nodeName.toLowerCase()]) {
			hoverHandler.attach(el);
		}
		storage.options = options;
		return el;
	}

	function cached(fun) {
		var cache = {};
		return function(key) {
			if (!hasOwnProperty(cache, key)) cache[key] = fun.apply(null, arguments);
			return cache[key];
		};
	}

	function getFont(el, style) {
		var families = CSS.quotedList(style.get('fontFamily').toLowerCase()), family;
		for (var i = 0; family = families[i]; ++i) {
			if (fonts[family]) return fonts[family].get(style.get('fontStyle'), style.get('fontWeight'));
		}
		return null;
	}

	function elementsByTagName(query) {
		return document.getElementsByTagName(query);
	}

	function hasOwnProperty(obj, property) {
		return obj.hasOwnProperty(property);
	}

	function merge() {
		var merged = {}, arg, key;
		for (var i = 0, l = arguments.length; arg = arguments[i], i < l; ++i) {
			for (key in arg) {
				if (hasOwnProperty(arg, key)) merged[key] = arg[key];
			}
		}
		return merged;
	}

	function process(font, text, style, options, node, el) {
		var fragment = document.createDocumentFragment(), processed;
		if (text === '') return fragment;
		var separate = options.separate;
		var parts = text.split(separators[separate]), needsAligning = (separate == 'words');
		if (needsAligning && HAS_BROKEN_REGEXP) {
			// @todo figure out a better way to do this
			if (/^\s/.test(text)) parts.unshift('');
			if (/\s$/.test(text)) parts.push('');
		}
		for (var i = 0, l = parts.length; i < l; ++i) {
			processed = engines[options.engine](font,
				needsAligning ? CSS.textAlign(parts[i], style, i, l) : parts[i],
				style, options, node, el, i < l - 1);
			if (processed) fragment.appendChild(processed);
		}
		return fragment;
	}

	function replaceElement(el, options) {
		var name = el.nodeName.toLowerCase();
		if (options.ignore[name]) return;
		if (options.onBeforeReplace) options.onBeforeReplace(el, options);
		var replace = !options.textless[name], simple = (options.trim === 'simple');
		var style = CSS.getStyle(attach(el, options)).extend(options);
		// may cause issues if the element contains other elements
		// with larger fontSize, however such cases are rare and can
		// be fixed by using a more specific selector
		if (parseFloat(style.get('fontSize')) === 0) return;
		var font = getFont(el, style), node, type, next, anchor, text, lastElement;
		var isShy = options.softHyphens, anyShy = false, pos, shy, reShy = /\u00ad/g;
		var modifyText = options.modifyText;
		if (!font) return;
		for (node = el.firstChild; node; node = next) {
			type = node.nodeType;
			next = node.nextSibling;
			if (replace && type == 3) {
				if (isShy && el.nodeName.toLowerCase() != TAG_SHY) {
					pos = node.data.indexOf('\u00ad');
					if (pos >= 0) {
						node.splitText(pos);
						next = node.nextSibling;
						next.deleteData(0, 1);
						shy = document.createElement(TAG_SHY);
						shy.appendChild(document.createTextNode('\u00ad'));
						el.insertBefore(shy, next);
						next = shy;
						anyShy = true;
					}
				}
				// Node.normalize() is broken in IE 6, 7, 8
				if (anchor) {
					anchor.appendData(node.data);
					el.removeChild(node);
				}
				else anchor = node;
				if (next) continue;
			}
			if (anchor) {
				text = anchor.data;
				if (!isShy) text = text.replace(reShy, '');
				text = CSS.whiteSpace(text, style, anchor, lastElement, simple);
				// modify text only on the first replace
				if (modifyText) text = modifyText(text, anchor, el, options);
				el.replaceChild(process(font, text, style, options, node, el), anchor);
				anchor = null;
			}
			if (type == 1) {
				if (node.firstChild) {
					if (node.nodeName.toLowerCase() == 'cufon') {
						engines[options.engine](font, null, style, options, node, el);
					}
					else arguments.callee(node, options);
				}
				lastElement = node;
			}
		}
		if (isShy && anyShy) {
			updateShy(el);
			if (!trackingShy) addEvent(window, 'resize', updateShyOnResize);
			trackingShy = true;
		}
		if (options.onAfterReplace) options.onAfterReplace(el, options);
	}

	function updateShy(context) {
		var shys, shy, parent, glue, newGlue, next, prev, i;
		shys = context.getElementsByTagName(TAG_SHY);
		// unfortunately there doesn't seem to be any easy
		// way to avoid having to loop through the shys twice.
		for (i = 0; shy = shys[i]; ++i) {
			shy.className = C_SHY_DISABLED;
			glue = parent = shy.parentNode;
			if (glue.nodeName.toLowerCase() != TAG_GLUE) {
				newGlue = document.createElement(TAG_GLUE);
				newGlue.appendChild(shy.previousSibling);
				parent.insertBefore(newGlue, shy);
				newGlue.appendChild(shy);
			}
			else {
				// get rid of double glue (edge case fix)
				glue = glue.parentNode;
				if (glue.nodeName.toLowerCase() == TAG_GLUE) {
					parent = glue.parentNode;
					while (glue.firstChild) {
						parent.insertBefore(glue.firstChild, glue);
					}
					parent.removeChild(glue);
				}
			}
		}
		for (i = 0; shy = shys[i]; ++i) {
			shy.className = '';
			glue = shy.parentNode;
			parent = glue.parentNode;
			next = glue.nextSibling || parent.nextSibling;
			// make sure we're comparing same types
			prev = (next.nodeName.toLowerCase() == TAG_GLUE) ? glue : shy.previousSibling;
			if (prev.offsetTop >= next.offsetTop) {
				shy.className = C_SHY_DISABLED;
				if (prev.offsetTop < next.offsetTop) {
					// we have an annoying edge case, double the glue
					newGlue = document.createElement(TAG_GLUE);
					parent.insertBefore(newGlue, glue);
					newGlue.appendChild(glue);
					newGlue.appendChild(next);
				}
			}
		}
	}

	function updateShyOnResize() {
		if (ignoreResize) return; // needed for IE
		CSS.addClass(DOM.root(), C_VIEWPORT_RESIZING);
		clearTimeout(shyTimer);
		shyTimer = setTimeout(function() {
			ignoreResize = true;
			CSS.removeClass(DOM.root(), C_VIEWPORT_RESIZING);
			updateShy(document);
			ignoreResize = false;
		}, 100);
	}

	var HAS_BROKEN_REGEXP = ' '.split(/\s+/).length == 0;
	var TAG_GLUE = 'cufonglue';
	var TAG_SHY = 'cufonshy';
	var C_SHY_DISABLED = 'cufon-shy-disabled';
	var C_VIEWPORT_RESIZING = 'cufon-viewport-resizing';

	var sharedStorage = new Storage();
	var hoverHandler = new HoverHandler();
	var replaceHistory = new ReplaceHistory();
	var initialized = false;
	var trackingShy = false;
	var shyTimer;
	var ignoreResize = false;

	var engines = {}, fonts = {}, defaultOptions = {
		autoDetect: false,
		engine: null,
		//fontScale: 1,
		//fontScaling: false,
		forceHitArea: false,
		hover: false,
		hoverables: {
			a: true
		},
		ignore: {
			applet: 1,
			canvas: 1,
			col: 1,
			colgroup: 1,
			head: 1,
			iframe: 1,
			map: 1,
			noscript: 1,
			optgroup: 1,
			option: 1,
			script: 1,
			select: 1,
			style: 1,
			textarea: 1,
			title: 1,
			pre: 1
		},
		modifyText: null,
		onAfterReplace: null,
		onBeforeReplace: null,
		printable: true,
		//rotation: 0,
		//selectable: false,
		selector: (
				window.Sizzle
			||	(window.jQuery && function(query) { return jQuery(query); }) // avoid noConflict issues
			||	(window.dojo && dojo.query)
			||	(window.glow && glow.dom && glow.dom.get)
			||	(window.Ext && Ext.query)
			||	(window.YAHOO && YAHOO.util && YAHOO.util.Selector && YAHOO.util.Selector.query)
			||	(window.$$ && function(query) { return $$(query); })
			||	(window.$ && function(query) { return $(query); })
			||	(document.querySelectorAll && function(query) { return document.querySelectorAll(query); })
			||	elementsByTagName
		),
		separate: 'words', // 'none' and 'characters' are also accepted
		softHyphens: true,
		textless: {
			dl: 1,
			html: 1,
			ol: 1,
			table: 1,
			tbody: 1,
			thead: 1,
			tfoot: 1,
			tr: 1,
			ul: 1
		},
		textShadow: 'none',
		trim: 'advanced'
	};

	var separators = {
		// The first pattern may cause unicode characters above
		// code point 255 to be removed in Safari 3.0. Luckily enough
		// Safari 3.0 does not include non-breaking spaces in \s, so
		// we can just use a simple alternative pattern.
		words: /\s/.test('\u00a0') ? /[^\S\u00a0]+/ : /\s+/,
		characters: '',
		none: /^/
	};

	api.now = function() {
		DOM.ready();
		return api;
	};

	api.refresh = function() {
		replaceHistory.repeat.apply(replaceHistory, arguments);
		return api;
	};

	api.registerEngine = function(id, engine) {
		if (!engine) return api;
		engines[id] = engine;
		return api.set('engine', id);
	};

	api.registerFont = function(data) {
		if (!data) return api;
		var font = new Font(data), family = font.family;
		if (!fonts[family]) fonts[family] = new FontFamily();
		fonts[family].add(font);
		return api.set('fontFamily', '"' + family + '"');
	};

	api.replace = function(elements, options, ignoreHistory) {
		options = merge(defaultOptions, options);
		if (!options.engine) return api; // there's no browser support so we'll just stop here
		if (!initialized) {
			CSS.addClass(DOM.root(), 'cufon-active cufon-loading');
			CSS.ready(function() {
				// fires before any replace() calls, but it doesn't really matter
				CSS.addClass(CSS.removeClass(DOM.root(), 'cufon-loading'), 'cufon-ready');
			});
			initialized = true;
		}
		if (options.hover) options.forceHitArea = true;
		if (options.autoDetect) delete options.fontFamily;
		if (typeof options.textShadow == 'string') {
			options.textShadow = CSS.textShadow(options.textShadow);
		}
		if (typeof options.color == 'string' && /^-/.test(options.color)) {
			options.textGradient = CSS.gradient(options.color);
		}
		else delete options.textGradient;
		if (!ignoreHistory) replaceHistory.add(elements, arguments);
		if (elements.nodeType || typeof elements == 'string') elements = [ elements ];
		CSS.ready(function() {
			for (var i = 0, l = elements.length; i < l; ++i) {
				var el = elements[i];
				if (typeof el == 'string') api.replace(options.selector(el), options, true);
				else replaceElement(el, options);
			}
		});
		return api;
	};

	api.set = function(option, value) {
		defaultOptions[option] = value;
		return api;
	};

	return api;

})();

Cufon.registerEngine('vml', (function() {

	var ns = document.namespaces;
	if (!ns) return;
	ns.add('cvml', 'urn:schemas-microsoft-com:vml');
	ns = null;

	var check = document.createElement('cvml:shape');
	check.style.behavior = 'url(#default#VML)';
	if (!check.coordsize) return; // VML isn't supported
	check = null;

	var HAS_BROKEN_LINEHEIGHT = (document.documentMode || 0) < 8;

	document.write(('<style type="text/css">' +
		'cufoncanvas{text-indent:0;}' +
		'@media screen{' +
			'cvml\\:shape,cvml\\:rect,cvml\\:fill,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute;}' +
			'cufoncanvas{position:absolute;text-align:left;}' +
			'cufon{display:inline-block;position:relative;vertical-align:' +
			(HAS_BROKEN_LINEHEIGHT
				? 'middle'
				: 'text-bottom') +
			';}' +
			'cufon cufontext{position:absolute;left:-10000in;font-size:1px;text-align:left;}' +
			'cufonshy.cufon-shy-disabled,.cufon-viewport-resizing cufonshy{display:none;}' +
			'cufonglue{white-space:nowrap;display:inline-block;}' +
			'.cufon-viewport-resizing cufonglue{white-space:normal;}' +
			'a cufon{cursor:pointer}' + // ignore !important here
		'}' +
		'@media print{' +
			'cufon cufoncanvas{display:none;}' +
		'}' +
	'</style>').replace(/;/g, '!important;'));

	function getFontSizeInPixels(el, value) {
		return getSizeInPixels(el, /(?:em|ex|%)$|^[a-z-]+$/i.test(value) ? '1em' : value);
	}

	// Original by Dead Edwards.
	// Combined with getFontSizeInPixels it also works with relative units.
	function getSizeInPixels(el, value) {
		if (!isNaN(value) || /px$/i.test(value)) return parseFloat(value);
		var style = el.style.left, runtimeStyle = el.runtimeStyle.left;
		el.runtimeStyle.left = el.currentStyle.left;
		el.style.left = value.replace('%', 'em');
		var result = el.style.pixelLeft;
		el.style.left = style;
		el.runtimeStyle.left = runtimeStyle;
		return result;
	}

	function getSpacingValue(el, style, size, property) {
		var key = 'computed' + property, value = style[key];
		if (isNaN(value)) {
			value = style.get(property);
			style[key] = value = (value == 'normal') ? 0 : ~~size.convertFrom(getSizeInPixels(el, value));
		}
		return value;
	}

	var fills = {};

	function gradientFill(gradient) {
		var id = gradient.id;
		if (!fills[id]) {
			var stops = gradient.stops, fill = document.createElement('cvml:fill'), colors = [];
			fill.type = 'gradient';
			fill.angle = 180;
			fill.focus = '0';
			fill.method = 'none';
			fill.color = stops[0][1];
			for (var j = 1, k = stops.length - 1; j < k; ++j) {
				colors.push(stops[j][0] * 100 + '% ' + stops[j][1]);
			}
			fill.colors = colors.join(',');
			fill.color2 = stops[k][1];
			fills[id] = fill;
		}
		return fills[id];
	}

	return function(font, text, style, options, node, el, hasNext) {

		var redraw = (text === null);

		if (redraw) text = node.alt;

		var viewBox = font.viewBox;

		var size = style.computedFontSize || (style.computedFontSize = new Cufon.CSS.Size(getFontSizeInPixels(el, style.get('fontSize')) + 'px', font.baseSize));

		var wrapper, canvas;

		if (redraw) {
			wrapper = node;
			canvas = node.firstChild;
		}
		else {
			wrapper = document.createElement('cufon');
			wrapper.className = 'cufon cufon-vml';
			wrapper.alt = text;

			canvas = document.createElement('cufoncanvas');
			wrapper.appendChild(canvas);

			if (options.printable) {
				var print = document.createElement('cufontext');
				print.appendChild(document.createTextNode(text));
				wrapper.appendChild(print);
			}

			// ie6, for some reason, has trouble rendering the last VML element in the document.
			// we can work around this by injecting a dummy element where needed.
			// @todo find a better solution
			if (!hasNext) wrapper.appendChild(document.createElement('cvml:shape'));
		}

		var wStyle = wrapper.style;
		var cStyle = canvas.style;

		var height = size.convert(viewBox.height), roundedHeight = Math.ceil(height);
		var roundingFactor = roundedHeight / height;
		var stretchFactor = roundingFactor * Cufon.CSS.fontStretch(style.get('fontStretch'));
		var minX = viewBox.minX, minY = viewBox.minY;

		cStyle.height = roundedHeight;
		cStyle.top = Math.round(size.convert(minY - font.ascent));
		cStyle.left = Math.round(size.convert(minX));

		wStyle.height = size.convert(font.height) + 'px';

		var color = style.get('color');
		var chars = Cufon.CSS.textTransform(text, style).split('');

		var jumps = font.spacing(chars,
			getSpacingValue(el, style, size, 'letterSpacing'),
			getSpacingValue(el, style, size, 'wordSpacing')
		);

		if (!jumps.length) return null;

		var width = jumps.total;
		var fullWidth = -minX + width + (viewBox.width - jumps[jumps.length - 1]);

		var shapeWidth = size.convert(fullWidth * stretchFactor), roundedShapeWidth = Math.round(shapeWidth);

		var coordSize = fullWidth + ',' + viewBox.height, coordOrigin;
		var stretch = 'r' + coordSize + 'ns';

		var fill = options.textGradient && gradientFill(options.textGradient);

		var glyphs = font.glyphs, offsetX = 0;
		var shadows = options.textShadow;
		var i = -1, j = 0, chr;

		while (chr = chars[++i]) {

			var glyph = glyphs[chars[i]] || font.missingGlyph, shape;
			if (!glyph) continue;

			if (redraw) {
				// some glyphs may be missing so we can't use i
				shape = canvas.childNodes[j];
				while (shape.firstChild) shape.removeChild(shape.firstChild); // shadow, fill
			}
			else {
				shape = document.createElement('cvml:shape');
				canvas.appendChild(shape);
			}

			shape.stroked = 'f';
			shape.coordsize = coordSize;
			shape.coordorigin = coordOrigin = (minX - offsetX) + ',' + minY;
			shape.path = (glyph.d ? 'm' + glyph.d + 'xe' : '') + 'm' + coordOrigin + stretch;
			shape.fillcolor = color;

			if (fill) shape.appendChild(fill.cloneNode(false));

			// it's important to not set top/left or IE8 will grind to a halt
			var sStyle = shape.style;
			sStyle.width = roundedShapeWidth;
			sStyle.height = roundedHeight;

			if (shadows) {
				// due to the limitations of the VML shadow element there
				// can only be two visible shadows. opacity is shared
				// for all shadows.
				var shadow1 = shadows[0], shadow2 = shadows[1];
				var color1 = Cufon.CSS.color(shadow1.color), color2;
				var shadow = document.createElement('cvml:shadow');
				shadow.on = 't';
				shadow.color = color1.color;
				shadow.offset = shadow1.offX + ',' + shadow1.offY;
				if (shadow2) {
					color2 = Cufon.CSS.color(shadow2.color);
					shadow.type = 'double';
					shadow.color2 = color2.color;
					shadow.offset2 = shadow2.offX + ',' + shadow2.offY;
				}
				shadow.opacity = color1.opacity || (color2 && color2.opacity) || 1;
				shape.appendChild(shadow);
			}

			offsetX += jumps[j++];
		}

		// addresses flickering issues on :hover

		var cover = shape.nextSibling, coverFill, vStyle;

		if (options.forceHitArea) {

			if (!cover) {
				cover = document.createElement('cvml:rect');
				cover.stroked = 'f';
				cover.className = 'cufon-vml-cover';
				coverFill = document.createElement('cvml:fill');
				coverFill.opacity = 0;
				cover.appendChild(coverFill);
				canvas.appendChild(cover);
			}

			vStyle = cover.style;

			vStyle.width = roundedShapeWidth;
			vStyle.height = roundedHeight;

		}
		else if (cover) canvas.removeChild(cover);

		wStyle.width = Math.max(Math.ceil(size.convert(width * stretchFactor)), 0);

		if (HAS_BROKEN_LINEHEIGHT) {

			var yAdjust = style.computedYAdjust;

			if (yAdjust === undefined) {
				var lineHeight = style.get('lineHeight');
				if (lineHeight == 'normal') lineHeight = '1em';
				else if (!isNaN(lineHeight)) lineHeight += 'em'; // no unit
				style.computedYAdjust = yAdjust = 0.5 * (getSizeInPixels(el, lineHeight) - parseFloat(wStyle.height));
			}

			if (yAdjust) {
				wStyle.marginTop = Math.ceil(yAdjust) + 'px';
				wStyle.marginBottom = yAdjust + 'px';
			}

		}

		return wrapper;

	};

})());

Cufon.registerEngine('canvas', (function() {

	// Safari 2 doesn't support .apply() on native methods

	var check = document.createElement('canvas');
	if (!check || !check.getContext || !check.getContext.apply) return;
	check = null;

	var HAS_INLINE_BLOCK = Cufon.CSS.supports('display', 'inline-block');

	// Firefox 2 w/ non-strict doctype (almost standards mode)
	var HAS_BROKEN_LINEHEIGHT = !HAS_INLINE_BLOCK && (document.compatMode == 'BackCompat' || /frameset|transitional/i.test(document.doctype.publicId));

	var styleSheet = document.createElement('style');
	styleSheet.type = 'text/css';
	styleSheet.appendChild(document.createTextNode((
		'cufon{text-indent:0;}' +
		'@media screen,projection{' +
			'cufon{display:inline;display:inline-block;position:relative;vertical-align:middle;' +
			(HAS_BROKEN_LINEHEIGHT
				? ''
				: 'font-size:1px;line-height:1px;') +
			'}cufon cufontext{display:-moz-inline-box;display:inline-block;width:0;height:0;text-align:left;text-indent:-10000in;}' +
			(HAS_INLINE_BLOCK
				? 'cufon canvas{position:relative;}'
				: 'cufon canvas{position:absolute;}') +
			'cufonshy.cufon-shy-disabled,.cufon-viewport-resizing cufonshy{display:none;}' +
			'cufonglue{white-space:nowrap;display:inline-block;}' +
			'.cufon-viewport-resizing cufonglue{white-space:normal;}' +
		'}' +
		'@media print{' +
			'cufon{padding:0;}' + // Firefox 2
			'cufon canvas{display:none;}' +
		'}'
	).replace(/;/g, '!important;')));
	document.getElementsByTagName('head')[0].appendChild(styleSheet);

	function generateFromVML(path, context) {
		var atX = 0, atY = 0;
		var code = [], re = /([mrvxe])([^a-z]*)/g, match;
		generate: for (var i = 0; match = re.exec(path); ++i) {
			var c = match[2].split(',');
			switch (match[1]) {
				case 'v':
					code[i] = { m: 'bezierCurveTo', a: [ atX + ~~c[0], atY + ~~c[1], atX + ~~c[2], atY + ~~c[3], atX += ~~c[4], atY += ~~c[5] ] };
					break;
				case 'r':
					code[i] = { m: 'lineTo', a: [ atX += ~~c[0], atY += ~~c[1] ] };
					break;
				case 'm':
					code[i] = { m: 'moveTo', a: [ atX = ~~c[0], atY = ~~c[1] ] };
					break;
				case 'x':
					code[i] = { m: 'closePath' };
					break;
				case 'e':
					break generate;
			}
			context[code[i].m].apply(context, code[i].a);
		}
		return code;
	}

	function interpret(code, context) {
		for (var i = 0, l = code.length; i < l; ++i) {
			var line = code[i];
			context[line.m].apply(context, line.a);
		}
	}

	return function(font, text, style, options, node, el) {

		var redraw = (text === null);

		if (redraw) text = node.getAttribute('alt');

		var viewBox = font.viewBox;

		var size = style.getSize('fontSize', font.baseSize);

		var expandTop = 0, expandRight = 0, expandBottom = 0, expandLeft = 0;
		var shadows = options.textShadow, shadowOffsets = [];
		if (shadows) {
			for (var i = shadows.length; i--;) {
				var shadow = shadows[i];
				var x = size.convertFrom(parseFloat(shadow.offX));
				var y = size.convertFrom(parseFloat(shadow.offY));
				shadowOffsets[i] = [ x, y ];
				if (y < expandTop) expandTop = y;
				if (x > expandRight) expandRight = x;
				if (y > expandBottom) expandBottom = y;
				if (x < expandLeft) expandLeft = x;
			}
		}

		var chars = Cufon.CSS.textTransform(text, style).split('');

		var jumps = font.spacing(chars,
			~~size.convertFrom(parseFloat(style.get('letterSpacing')) || 0),
			~~size.convertFrom(parseFloat(style.get('wordSpacing')) || 0)
		);

		if (!jumps.length) return null; // there's nothing to render

		var width = jumps.total;

		expandRight += viewBox.width - jumps[jumps.length - 1];
		expandLeft += viewBox.minX;

		var wrapper, canvas;

		if (redraw) {
			wrapper = node;
			canvas = node.firstChild;
		}
		else {
			wrapper = document.createElement('cufon');
			wrapper.className = 'cufon cufon-canvas';
			wrapper.setAttribute('alt', text);

			canvas = document.createElement('canvas');
			wrapper.appendChild(canvas);

			if (options.printable) {
				var print = document.createElement('cufontext');
				print.appendChild(document.createTextNode(text));
				wrapper.appendChild(print);
			}
		}

		var wStyle = wrapper.style;
		var cStyle = canvas.style;

		var height = size.convert(viewBox.height);
		var roundedHeight = Math.ceil(height);
		var roundingFactor = roundedHeight / height;
		var stretchFactor = roundingFactor * Cufon.CSS.fontStretch(style.get('fontStretch'));
		var stretchedWidth = width * stretchFactor;

		var canvasWidth = Math.ceil(size.convert(stretchedWidth + expandRight - expandLeft));
		var canvasHeight = Math.ceil(size.convert(viewBox.height - expandTop + expandBottom));

		canvas.width = canvasWidth;
		canvas.height = canvasHeight;

		// needed for WebKit and full page zoom
		cStyle.width = canvasWidth + 'px';
		cStyle.height = canvasHeight + 'px';

		// minY has no part in canvas.height
		expandTop += viewBox.minY;

		cStyle.top = Math.round(size.convert(expandTop - font.ascent)) + 'px';
		cStyle.left = Math.round(size.convert(expandLeft)) + 'px';

		var wrapperWidth = Math.max(Math.ceil(size.convert(stretchedWidth)), 0) + 'px';

		if (HAS_INLINE_BLOCK) {
			wStyle.width = wrapperWidth;
			wStyle.height = size.convert(font.height) + 'px';
		}
		else {
			wStyle.paddingLeft = wrapperWidth;
			wStyle.paddingBottom = (size.convert(font.height) - 1) + 'px';
		}

		var g = canvas.getContext('2d'), scale = height / viewBox.height;

		// proper horizontal scaling is performed later
		g.scale(scale, scale * roundingFactor);
		g.translate(-expandLeft, -expandTop);
		g.save();

		function renderText() {
			var glyphs = font.glyphs, glyph, i = -1, j = -1, chr;
			g.scale(stretchFactor, 1);
			while (chr = chars[++i]) {
				var glyph = glyphs[chars[i]] || font.missingGlyph;
				if (!glyph) continue;
				if (glyph.d) {
					g.beginPath();
					if (glyph.code) interpret(glyph.code, g);
					else glyph.code = generateFromVML('m' + glyph.d, g);
					g.fill();
				}
				g.translate(jumps[++j], 0);
			}
			g.restore();
		}

		if (shadows) {
			for (var i = shadows.length; i--;) {
				var shadow = shadows[i];
				g.save();
				g.fillStyle = shadow.color;
				g.translate.apply(g, shadowOffsets[i]);
				renderText();
			}
		}

		var gradient = options.textGradient;
		if (gradient) {
			var stops = gradient.stops, fill = g.createLinearGradient(0, viewBox.minY, 0, viewBox.maxY);
			for (var i = 0, l = stops.length; i < l; ++i) {
				fill.addColorStop.apply(fill, stops[i]);
			}
			g.fillStyle = fill;
		}
		else g.fillStyle = style.get('color');

		renderText();

		return wrapper;

	};

})());

/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright Hans Reichel, 1996. Published by FontShop International FontFont
 * release 17
 */
Cufon.registerFont({"w":196,"face":{"font-family":"Dax","font-weight":500,"font-stretch":"normal","units-per-em":"360","panose-1":"2 0 6 3 0 0 0 0 0 0","ascent":"288","descent":"-72","x-height":"4","bbox":"-15 -292 295 82","underline-thickness":"18","underline-position":"-36","stemh":"26","stemv":"41","unicode-range":"U+0020-U+2122"},"glyphs":{" ":{"w":97},"\u00d7":{"d":"171,-61r-19,19r-54,-58r-53,58r-19,-19r53,-59r-53,-58r19,-19r53,57r53,-57r20,19r-54,58"},"!":{"d":"86,-248r-10,163r-33,0r-10,-163r53,0xm86,-24v0,15,-12,27,-26,27v-15,0,-27,-12,-27,-27v0,-14,12,-26,27,-26v14,0,26,12,26,26","w":111},"\"":{"d":"126,-242r-9,96r-22,0r-9,-96v9,-12,31,-12,40,0xm62,-242r-8,96r-23,0r-8,-96v8,-12,30,-12,39,0","w":148},"#":{"d":"185,-152r-38,0r-9,50r34,0r0,22r-38,0r-14,80r-25,0r14,-80r-38,0r-15,80r-24,0r13,-80r-33,0r0,-22r37,0r9,-50r-34,0r0,-22r38,0r13,-74r25,0r-13,74r39,0r13,-74r24,0r-13,74r35,0r0,22xm122,-152r-39,0r-9,50r39,0"},"$":{"d":"111,-143v81,29,65,132,-10,144r4,46r-27,0r4,-44v-26,-1,-43,-6,-55,-14r11,-30v24,18,82,16,82,-28v0,-20,-11,-34,-40,-43v-71,-23,-64,-128,11,-137r-3,-43r25,0r-3,42v21,1,36,7,46,13r-10,26v-23,-18,-74,-14,-74,26v0,23,16,34,39,42"},"%":{"d":"291,-81v0,38,-9,85,-52,85v-43,0,-51,-47,-51,-85v0,-38,8,-85,51,-85v43,0,52,47,52,85xm210,-245r-85,248r-22,-6r85,-248xm126,-166v0,38,-9,84,-52,84v-43,0,-51,-46,-51,-84v0,-38,8,-85,51,-85v43,0,52,47,52,85xm262,-82v0,-30,-2,-65,-23,-65v-21,0,-23,35,-23,65v0,30,2,64,23,64v21,0,23,-34,23,-64xm97,-167v0,-30,-2,-66,-23,-66v-21,0,-23,36,-23,66v0,30,2,64,23,64v21,0,23,-34,23,-64","w":313},"&":{"d":"225,-157v-9,4,-27,11,-40,14r0,132v-14,9,-38,15,-72,15v-59,0,-96,-26,-96,-72v-1,-38,29,-60,60,-72v-28,-9,-44,-27,-44,-53v0,-56,88,-72,128,-45r-13,26v-21,-15,-77,-11,-71,23v11,58,96,26,135,5xm143,-29r0,-105v-54,13,-79,27,-79,63v0,40,44,56,79,42","w":228},"'":{"d":"63,-242r-9,96r-23,0r-8,-96v9,-13,31,-11,40,0","w":85},"(":{"d":"127,70r-21,12v-113,-131,-113,-239,0,-369r21,12v-76,94,-77,251,0,345","w":137},")":{"d":"31,-287v114,130,113,238,0,369r-21,-12v76,-95,77,-251,0,-345","w":137},"*":{"d":"141,-240v0,10,-8,18,-17,18v-9,0,-17,-8,-17,-18v0,-10,8,-18,17,-18v9,0,17,8,17,18xm97,-272v0,10,-8,17,-17,17v-9,0,-18,-7,-18,-17v0,-25,35,-22,35,0xm94,-226v0,9,-6,15,-14,15v-8,0,-15,-7,-15,-15v0,-8,7,-14,15,-14v8,0,14,6,14,14xm126,-189v0,10,-8,18,-18,18v-9,0,-17,-8,-17,-18v0,-10,7,-17,17,-17v9,0,18,7,18,17xm53,-240v0,10,-8,17,-18,17v-9,0,-17,-7,-17,-17v0,-10,7,-18,17,-18v9,0,18,8,18,18xm68,-189v0,25,-35,22,-35,0v0,-10,8,-18,17,-18v10,0,18,8,18,18","w":159},"+":{"d":"169,-105r-56,0r0,60r-29,0r0,-60r-57,0r0,-29r57,0r0,-60r29,0r0,60r56,0r0,29"},",":{"d":"80,-36r-52,97r-26,0r32,-97v6,-13,44,-19,46,0","w":101},"-":{"d":"107,-104r-88,0r0,-34r88,0r0,34","w":126},".":{"d":"74,-24v0,14,-12,26,-26,26v-15,0,-27,-12,-27,-26v0,-15,12,-27,27,-27v14,0,26,12,26,27","w":95},"\/":{"d":"202,-274r-170,356r-28,-13r170,-356","w":205},"0":{"d":"178,-124v0,55,-16,128,-80,128v-64,0,-80,-73,-80,-128v0,-55,16,-127,80,-127v64,0,80,72,80,127xm136,-124v0,-46,-5,-100,-38,-100v-33,0,-38,54,-38,100v0,46,5,98,38,98v33,0,38,-52,38,-98"},"1":{"d":"139,0r-44,0r0,-198v-12,7,-38,12,-61,14r-6,-26v45,-6,71,-23,80,-38r31,0r0,248"},"2":{"d":"169,0r-156,0r85,-123v19,-27,23,-41,23,-56v0,-45,-65,-46,-90,-30r-11,-28v15,-8,35,-14,66,-14v94,0,97,75,49,138r-58,77r92,0r0,36"},"3":{"d":"118,-139v88,23,54,143,-36,143v-32,0,-53,-5,-68,-14r12,-30v28,17,97,17,97,-33v0,-40,-38,-48,-66,-47r0,-23v36,-3,59,-20,59,-45v0,-43,-62,-34,-85,-22r-11,-28v40,-23,140,-18,140,45v0,31,-31,49,-42,54"},"4":{"d":"179,-53r-20,0r0,53r-41,0r0,-53r-100,0r0,-27r99,-168r42,0r0,171r20,0r0,24xm119,-205v-15,33,-52,92,-72,128r71,0"},"5":{"d":"173,-73v0,43,-36,77,-89,77v-30,0,-51,-5,-67,-14r12,-30v28,18,97,17,97,-33v0,-32,-23,-58,-96,-47r12,-128r123,0r0,37r-92,0r-5,64v73,-6,105,28,105,74"},"6":{"d":"179,-74v0,43,-28,78,-79,78v-56,0,-81,-42,-81,-95v0,-110,90,-153,125,-159r12,29v-27,8,-68,27,-87,76v53,-16,109,7,110,71xm137,-76v0,-45,-39,-60,-74,-46v-8,40,-2,96,37,96v27,0,37,-24,37,-50"},"7":{"d":"185,-248r-32,77v-28,66,-53,136,-61,171r-54,0r94,-211r-111,0r0,-37r164,0"},"8":{"d":"178,-60v0,39,-33,64,-80,64v-44,0,-80,-23,-80,-64v0,-29,16,-48,52,-69v-71,-31,-51,-123,28,-122v41,0,73,24,73,60v0,26,-13,43,-45,61v36,22,52,42,52,70xm135,-191v0,-20,-15,-35,-36,-35v-22,0,-36,14,-36,34v0,19,8,30,36,47v28,-17,36,-28,36,-46xm138,-61v0,-20,-7,-33,-41,-53v-34,19,-40,33,-40,53v0,22,19,37,41,37v24,0,40,-16,40,-37"},"9":{"d":"177,-155v0,110,-90,152,-125,159r-11,-30v27,-8,67,-27,86,-76v-51,18,-109,-5,-109,-70v0,-43,29,-78,80,-78v56,0,79,42,79,95xm133,-126v8,-40,2,-96,-37,-96v-27,0,-37,25,-37,51v0,44,40,58,74,45"},":":{"d":"74,-136v0,15,-12,26,-26,26v-15,0,-27,-11,-27,-26v0,-14,12,-27,27,-27v14,0,26,13,26,27xm74,-24v0,14,-12,26,-26,26v-15,0,-27,-12,-27,-26v0,-15,12,-27,27,-27v14,0,26,12,26,27","w":95},";":{"d":"80,-136v0,15,-11,26,-26,26v-14,0,-27,-11,-27,-26v0,-14,13,-27,27,-27v15,0,26,13,26,27xm80,-36r-52,97r-26,0r32,-97v6,-15,44,-19,46,0","w":101},"<":{"d":"169,-46r-142,-61r0,-27r142,-61r0,31r-107,43r107,44r0,31"},"=":{"d":"169,-140r-142,0r0,-29r142,0r0,29xm169,-71r-142,0r0,-28r142,0r0,28"},">":{"d":"169,-107r-142,61r0,-31r107,-44r-107,-43r0,-31r142,61r0,27"},"?":{"d":"147,-191v0,33,-31,54,-52,60r-4,46r-33,0r-6,-60v24,-5,49,-19,49,-42v7,-35,-54,-39,-75,-24r-12,-26v41,-28,133,-13,133,46xm101,-24v0,15,-12,26,-26,26v-15,0,-27,-11,-27,-26v0,-14,12,-26,27,-26v14,0,26,12,26,26","w":151},"@":{"d":"291,-149v0,48,-27,126,-81,126v-17,0,-26,-9,-28,-32v-14,22,-31,31,-54,31v-31,0,-44,-27,-44,-57v0,-39,26,-99,74,-99v21,0,33,13,41,31r5,-25r22,0v-7,35,-22,75,-22,111v0,15,3,21,13,21v30,0,55,-66,55,-107v0,-54,-37,-88,-89,-88v-83,0,-143,77,-143,157v0,73,49,112,117,112v56,0,88,-22,119,-54r11,13v-66,90,-266,73,-266,-72v0,-91,72,-171,164,-171v62,0,106,39,106,103xm190,-122v0,-25,-14,-40,-31,-40v-35,0,-51,53,-51,81v0,21,11,38,30,38v35,0,51,-52,52,-79","w":312},"A":{"d":"211,0r-47,0r-19,-64r-80,0r-20,64r-41,0r82,-248r44,0xm139,-90r-26,-87v-6,-19,-4,-31,-7,-30v-5,31,-25,85,-34,117r67,0","w":215},"B":{"d":"194,-68v0,76,-113,85,-168,58r0,-227v15,-8,40,-14,70,-14v60,0,89,27,89,64v1,35,-27,49,-46,57v23,5,55,26,55,62xm141,-184v4,-37,-39,-48,-72,-37r0,80v43,5,77,-8,72,-43xm148,-68v0,-39,-28,-53,-79,-50r0,89v34,12,79,5,79,-39","w":209},"C":{"d":"164,-10v-12,9,-29,14,-51,14v-63,0,-95,-59,-95,-128v0,-67,32,-127,95,-127v23,0,39,5,51,14r-10,27v-7,-4,-17,-9,-32,-9v-42,0,-57,47,-57,95v0,62,35,115,88,84","w":174},"D":{"d":"201,-126v0,74,-30,130,-105,130v-31,0,-55,-5,-70,-14r0,-227v16,-8,39,-14,67,-14v75,0,108,51,108,125xm154,-126v0,-74,-26,-105,-83,-92r0,186v56,15,83,-16,83,-94","w":218},"E":{"d":"146,0r-120,0r0,-248r120,0r0,31r-75,0r0,75r67,0r0,30r-67,0r0,81r75,0r0,31","w":162},"F":{"d":"146,-217r-75,0r0,75r67,0r0,30r-67,0r0,112r-45,0r0,-248r120,0r0,31","w":159},"G":{"d":"192,-10v-15,9,-33,14,-66,14v-66,0,-108,-46,-108,-129v0,-105,90,-150,171,-113r-14,28v-56,-24,-115,0,-111,87v3,74,33,108,85,90r0,-81r-36,0r0,-28r79,0r0,132","w":215},"H":{"d":"195,0r-46,0r0,-112r-78,0r0,112r-45,0r0,-248r45,0r0,106r78,0r0,-106r46,0r0,248","w":220},"I":{"d":"72,0r-46,0r0,-248r46,0r0,248","w":98},"J":{"d":"72,-13v0,58,-39,88,-87,92r0,-32v23,-5,41,-24,41,-56r0,-239r46,0r0,235","w":98},"K":{"d":"195,0r-51,0r-72,-125r0,125r-46,0r0,-248r46,0r1,113r71,-113r46,0r-77,115","w":199},"L":{"d":"141,0r-115,0r0,-248r46,0r0,217r69,0r0,31","w":151},"M":{"d":"73,-194r-18,194r-38,0r27,-248r46,0r52,187v12,-60,36,-128,52,-187r46,0r28,248r-43,0r-18,-194v-4,25,-45,162,-54,194r-26,0","w":284},"N":{"d":"208,0r-36,0r-109,-188r1,188r-38,0r0,-248r43,0r102,176r-1,-176r38,0r0,248","w":234},"O":{"d":"204,-124v0,71,-26,128,-93,128v-67,0,-93,-57,-93,-128v0,-70,26,-127,93,-127v67,0,93,57,93,127xm157,-125v0,-46,-8,-96,-46,-96v-38,0,-47,50,-47,96v0,46,8,95,47,95v39,0,46,-49,46,-95","w":221},"P":{"d":"184,-174v0,48,-40,86,-114,76r0,98r-44,0r0,-237v16,-8,40,-14,68,-14v64,0,90,33,90,77xm140,-175v5,-42,-34,-58,-70,-46r0,96v46,7,73,-12,70,-50","w":197},"Q":{"d":"111,-251v112,0,119,192,47,241r41,51r-33,30r-35,-71v-78,17,-113,-48,-113,-124v0,-70,26,-127,93,-127xm158,-126v0,-46,-8,-95,-47,-95v-39,0,-47,49,-47,95v0,46,7,95,47,95v40,0,47,-49,47,-95","w":221},"R":{"d":"193,0r-51,0r-71,-112r0,112r-45,0r0,-237v15,-8,40,-14,68,-14v111,0,120,134,25,140xm141,-174v0,-45,-33,-59,-70,-47r0,98v40,6,70,-12,70,-51","w":203},"S":{"d":"154,-72v0,44,-33,76,-79,76v-30,0,-49,-5,-62,-14r11,-32v23,18,81,16,81,-27v0,-19,-10,-30,-38,-42v-40,-17,-51,-44,-51,-68v0,-39,28,-72,74,-72v25,0,43,6,54,14r-10,28v-22,-17,-74,-16,-74,25v0,22,16,31,38,40v49,21,56,48,56,72","w":170},"T":{"d":"149,-217r-46,0r0,217r-46,0r0,-217r-46,0r0,-31r138,0r0,31","w":160},"U":{"d":"189,-72v0,45,-33,76,-82,76v-49,0,-81,-31,-81,-76r0,-176r45,0r0,176v0,27,17,41,38,41v21,0,38,-14,38,-41r0,-176r42,0r0,176","w":214},"V":{"d":"193,-248r-73,248r-40,0r-75,-248r49,0r48,191v11,-62,33,-130,47,-191r44,0","w":197},"W":{"d":"289,-248r-57,248r-40,0r-38,-152v-5,-14,-2,-28,-5,-27r-41,179r-41,0r-57,-248r46,0r36,190r42,-190r34,0r43,190r36,-190r42,0","w":298},"X":{"d":"188,0r-51,0r-42,-91r-43,91r-47,0r67,-127r-60,-121r50,0r36,84r41,-84r44,0r-62,116","w":193},"Y":{"d":"183,-248r-67,141r0,107r-46,0r0,-107r-67,-141r49,0r43,103r44,-103r44,0","w":185},"Z":{"d":"151,0r-143,0r84,-217r-78,0r0,-31r135,0r-82,217r84,0r0,31","w":162},"[":{"d":"112,77r-86,0r0,-360r86,0r0,26r-48,0r0,309r48,0r0,25","w":127},"\\":{"d":"203,69r-28,13r-171,-355r28,-14","w":207},"]":{"d":"102,77r-87,0r0,-25r48,0r0,-309r-48,0r0,-26r87,0r0,360","w":127},"^":{"d":"183,-168r-17,17r-59,-66r-58,66r-17,-17r55,-72v12,-14,29,-15,40,0","w":214},"_":{"d":"200,75r-204,0r0,-27r204,0r0,27"},"`":{"d":"66,-215r-25,0r-44,-49v4,-10,29,-10,44,-1","w":79},"a":{"d":"163,-10v-15,8,-40,14,-70,14v-53,0,-79,-22,-79,-59v0,-51,49,-66,108,-72v10,-55,-57,-47,-87,-31r-10,-25v42,-21,138,-29,138,52r0,121xm122,-26r0,-80v-41,5,-67,14,-67,49v0,35,40,42,67,31","w":186},"b":{"d":"181,-102v0,65,-34,106,-94,106v-30,0,-52,-6,-64,-14r0,-273r44,0r0,94v58,-25,114,13,114,87xm138,-99v0,-52,-28,-87,-71,-66r0,138v46,16,71,-16,71,-72","w":197},"c":{"d":"139,-10v-54,36,-123,-2,-123,-88v0,-86,69,-121,122,-86r-9,25v-35,-24,-69,5,-69,61v0,57,32,86,69,61","w":149},"d":{"d":"174,-10v-15,9,-37,14,-67,14v-57,0,-91,-37,-91,-99v0,-74,48,-114,114,-97r0,-91r44,0r0,273xm130,-29r0,-139v-47,-14,-70,23,-70,71v0,54,27,86,70,68","w":197},"e":{"d":"177,-98r-119,17v-2,59,65,62,102,43r10,28v-14,8,-34,14,-64,14v-55,0,-90,-36,-90,-102v0,-63,32,-100,83,-100v51,0,80,35,78,100xm136,-116v0,-39,-14,-55,-38,-55v-26,0,-44,22,-43,68","w":193},"f":{"d":"110,-166r-32,0r0,166r-43,0r0,-166r-22,0r0,-28r22,0v-5,-59,19,-93,75,-89r0,28v-30,-4,-35,28,-32,61r32,0r0,28","w":119},"g":{"d":"173,3v8,81,-92,91,-146,65r13,-29v34,20,105,14,91,-44v-59,23,-115,-14,-115,-88v0,-63,31,-105,94,-105v28,0,51,6,63,14r0,187xm131,-30r0,-137v-44,-17,-71,12,-71,72v0,59,29,83,71,65"},"h":{"d":"176,0r-44,0r0,-136v6,-30,-41,-43,-65,-25r0,161r-44,0r0,-283r44,0r0,97v46,-26,119,2,109,48r0,138","w":199},"i":{"d":"71,-249v0,12,-10,21,-24,21v-13,0,-24,-9,-24,-21v0,-12,11,-22,24,-22v14,0,24,10,24,22xm69,0r-44,0r0,-194r44,0r0,194","w":93},"j":{"d":"72,-249v0,12,-10,21,-24,21v-13,0,-25,-9,-25,-21v0,-12,12,-22,25,-22v13,0,24,10,24,22xm69,-17v0,60,-34,95,-77,98r0,-30v21,-7,34,-22,34,-63r0,-182r43,0r0,177","w":94},"k":{"d":"183,0r-49,0r-66,-99r0,99r-43,0r0,-283r43,0r1,177r62,-88r44,0r-67,89","w":183},"l":{"d":"69,0r-44,0r0,-283r44,0r0,283","w":94},"m":{"d":"285,0r-43,0r0,-138v4,-33,-48,-42,-66,-18r0,156r-44,0r0,-139v4,-30,-41,-38,-65,-26r0,165r-44,0r0,-184v30,-18,116,-21,134,8v13,-12,32,-22,62,-22v100,1,57,113,66,198","w":308},"n":{"d":"176,0r-44,0r0,-138v9,-28,-41,-39,-65,-27r0,165r-44,0r0,-184v18,-9,43,-14,76,-14v117,-1,66,106,77,198","w":199},"o":{"d":"177,-97v0,57,-26,101,-80,101v-54,0,-81,-44,-81,-101v0,-58,27,-101,81,-101v55,0,80,43,80,101xm134,-97v0,-37,-6,-73,-37,-73v-31,0,-37,36,-37,73v0,37,7,71,37,71v31,0,37,-34,37,-71","w":193},"p":{"d":"181,-99v0,74,-47,115,-114,98r0,78r-44,0r0,-261v15,-8,37,-14,68,-14v57,0,90,37,90,99xm138,-98v0,-56,-25,-84,-71,-69r0,140v45,13,71,-16,71,-71","w":197},"q":{"d":"174,77r-43,0r0,-82v-59,26,-115,-14,-115,-87v0,-60,28,-106,94,-106v30,0,51,6,64,14r0,261xm131,-30r0,-138v-46,-15,-71,13,-71,73v0,58,28,84,71,65","w":197},"r":{"d":"117,-197r-9,32v-15,-5,-31,-5,-41,1r0,164r-44,0r0,-184v20,-10,45,-14,94,-13","w":122},"s":{"d":"88,-113v77,27,52,114,-23,116v-23,0,-41,-6,-53,-14r11,-28v15,15,66,17,66,-16v0,-17,-8,-24,-28,-32v-37,-14,-44,-34,-44,-54v0,-53,75,-72,112,-43r-11,26v-12,-15,-59,-15,-59,14v0,16,12,25,29,31","w":149},"t":{"d":"110,-2v-37,15,-75,-13,-75,-48r0,-116r-22,0r0,-28r22,0r0,-43r43,-12r0,55r32,0r0,28r-32,0r0,113v-1,19,14,31,32,24r0,27","w":123},"u":{"d":"173,-12v-16,9,-40,16,-74,16v-106,0,-70,-109,-76,-198r44,0r0,135v-5,30,40,41,62,26r0,-161r44,0r0,182"},"v":{"d":"175,-194r-62,194r-42,0r-63,-194r46,0v12,50,32,99,39,152r41,-152r41,0","w":181},"w":{"d":"274,-194r-54,194r-40,0r-33,-122v-5,-13,-2,-26,-5,-25v-7,49,-27,101,-38,147r-40,0r-54,-194r44,0r29,126v6,32,1,34,9,0r34,-126r37,0r38,151v7,-49,24,-103,34,-151r39,0","w":283},"x":{"d":"173,0r-48,0r-38,-71r-37,71r-44,0r60,-100r-54,-94r46,0r33,63r35,-63r41,0r-55,91","w":178},"y":{"d":"175,-194r-89,271r-46,0r32,-77r-64,-194r46,0r39,153v8,-49,29,-105,41,-153r41,0","w":181},"z":{"d":"141,0r-131,0r74,-166r-68,0r0,-28r123,0r-72,166r74,0r0,28","w":154},"{":{"d":"121,46v-41,0,-76,-15,-76,-60v0,-37,7,-99,-29,-94r0,-23v36,5,29,-55,29,-92v0,-45,35,-60,76,-60r0,23v-75,-7,-1,129,-70,141v40,3,33,62,33,107v0,24,11,35,37,35r0,23","w":139},"|":{"d":"60,77r-34,0r0,-360r34,0r0,360","w":86},"}":{"d":"123,-108v-36,-4,-29,57,-29,94v0,45,-35,60,-76,60r0,-23v76,8,3,-130,70,-143v-66,-1,8,-144,-70,-140r0,-23v41,0,76,15,76,60v0,37,-7,97,29,92r0,23","w":139},"~":{"d":"186,-127v-5,16,-18,26,-40,29v-29,4,-46,-26,-73,-23v-17,2,-26,15,-31,26r-14,-27v7,-16,17,-28,39,-30v31,-3,47,25,73,22v17,-2,27,-12,32,-24","w":214},"\u2122":{"d":"260,-123r-22,0r-12,-102r-31,102r-20,0r-31,-102r-12,102r-21,0r17,-125r29,0r28,100r28,-100r30,0xm105,-231r-34,0r0,108r-22,0r0,-108r-34,0r0,-17r90,0r0,17","w":281},"\u2026":{"d":"291,-24v0,14,-12,26,-26,26v-14,0,-26,-12,-26,-26v0,-15,12,-26,26,-26v14,0,26,11,26,26xm185,-24v0,14,-12,26,-26,26v-15,0,-27,-12,-27,-26v0,-15,12,-26,27,-26v14,0,26,11,26,26xm79,-24v0,14,-11,26,-26,26v-14,0,-26,-12,-26,-26v0,-15,12,-26,26,-26v15,0,26,11,26,26","w":317},"\u2013":{"d":"148,-107r-148,0r0,-28r148,0r0,28","w":147},"\u2014":{"d":"295,-109r-295,0r0,-23r295,0r0,23","w":295},"\u201c":{"d":"161,-283r-30,97v-4,12,-42,19,-42,0r49,-97r23,0xm91,-283r-31,97v-4,12,-41,18,-42,0r50,-97r23,0","w":173},"\u201d":{"d":"156,-272r-51,97r-22,0r30,-97v4,-12,42,-18,43,0xm85,-272r-50,97r-22,0r30,-97v4,-12,41,-18,42,0","w":173},"\u2018":{"d":"91,-283r-31,97v-4,12,-41,18,-42,0r50,-97r23,0","w":103},"\u2019":{"d":"85,-272r-50,97r-22,0r30,-97v4,-12,41,-18,42,0","w":103},"\u00a0":{"w":97}}});


Cufon.replace('.news-info h1 span', { fontFamily: 'Dax', hover: false });
Cufon.replace('.rgb-spotlight-info h2 span', { fontFamily: 'Dax', hover: false });
Cufon.replace('.events-info h2 span', { fontFamily: 'Dax', hover: false });
Cufon.replace('.description h1 span', { fontFamily: 'Dax', hover: false });
Cufon.replace('.rgb-spotlight-info h3', { fontFamily: 'Dax', hover: false });
Cufon.replace('.title-info h4', { fontFamily: 'Dax', hover: false });

