/* Prototype JavaScript framework, version 1.6.0.3
 * (c) 2005-2008 Sam Stephenson
 *
 * Prototype is freely distributable under the terms of an MIT-style license.
 * For details, see the Prototype web site: http://www.prototypejs.org/
 *
 *--------------------------------------------------------------------------*/

var Prototype = {
 Version: '1.6.0.3',

 Browser: {
 IE: !!(window.attachEvent &&
 navigator.userAgent.indexOf('Opera') === -1),
 Opera: navigator.userAgent.indexOf('Opera') > -1,
 WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
 Gecko: navigator.userAgent.indexOf('Gecko') > -1 &&
 navigator.userAgent.indexOf('KHTML') === -1,
 MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
 },

 BrowserFeatures: {
 XPath: !!document.evaluate,
 SelectorsAPI: !!document.querySelector,
 ElementExtensions: !!window.HTMLElement,
 SpecificElementExtensions:
 document.createElement('div')['__proto__'] &&
 document.createElement('div')['__proto__'] !==
 document.createElement('form')['__proto__']
 },

 ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
 JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,

 emptyFunction: function() { },
 K: function(x) { return x }
};

if (Prototype.Browser.MobileSafari)
 Prototype.BrowserFeatures.SpecificElementExtensions = false;


/* Based on Alex Arnell's inheritance implementation. */
var Class = {
 create: function() {
 var parent = null, properties = $A(arguments);
 if (Object.isFunction(properties[0]))
 parent = properties.shift();

 function klass() {
 this.initialize.apply(this, arguments);
 }

 Object.extend(klass, Class.Methods);
 klass.superclass = parent;
 klass.subclasses = [];

 if (parent) {
 var subclass = function() { };
 subclass.prototype = parent.prototype;
 klass.prototype = new subclass;
 parent.subclasses.push(klass);
 }

 for (var i = 0; i < properties.length; i++)
 klass.addMethods(properties[i]);

 if (!klass.prototype.initialize)
 klass.prototype.initialize = Prototype.emptyFunction;

 klass.prototype.constructor = klass;

 return klass;
 }
};

Class.Methods = {
 addMethods: function(source) {
 var ancestor = this.superclass && this.superclass.prototype;
 var properties = Object.keys(source);

 if (!Object.keys({ toString: true }).length)
 properties.push("toString", "valueOf");

 for (var i = 0, length = properties.length; i < length; i++) {
 var property = properties[i], value = source[property];
 if (ancestor && Object.isFunction(value) &&
 value.argumentNames().first() == "$super") {
 var method = value;
 value = (function(m) {
 return function() { return ancestor[m].apply(this, arguments) };
 })(property).wrap(method);

 value.valueOf = method.valueOf.bind(method);
 value.toString = method.toString.bind(method);
 }
 this.prototype[property] = value;
 }

 return this;
 }
};

var Abstract = { };

Object.extend = function(destination, source) {
 for (var property in source)
 destination[property] = source[property];
 return destination;
};

Object.extend(Object, {
 inspect: function(object) {
 try {
 if (Object.isUndefined(object)) return 'undefined';
 if (object === null) return 'null';
 return object.inspect ? object.inspect() : String(object);
 } catch (e) {
 if (e instanceof RangeError) return '...';
 throw e;
 }
 },

 toJSON: function(object) {
 var type = typeof object;
 switch (type) {
 case 'undefined':
 case 'function':
 case 'unknown': return;
 case 'boolean': return object.toString();
 }

 if (object === null) return 'null';
 if (object.toJSON) return object.toJSON();
 if (Object.isElement(object)) return;

 var results = [];
 for (var property in object) {
 var value = Object.toJSON(object[property]);
 if (!Object.isUndefined(value))
 results.push(property.toJSON() + ': ' + value);
 }

 return '{' + results.join(', ') + '}';
 },

 toQueryString: function(object) {
 return $H(object).toQueryString();
 },

 toHTML: function(object) {
 return object && object.toHTML ? object.toHTML() : String.interpret(object);
 },

 keys: function(object) {
 var keys = [];
 for (var property in object)
 keys.push(property);
 return keys;
 },

 values: function(object) {
 var values = [];
 for (var property in object)
 values.push(object[property]);
 return values;
 },

 clone: function(object) {
 return Object.extend({ }, object);
 },

 isElement: function(object) {
 return !!(object && object.nodeType == 1);
 },

 isArray: function(object) {
 return object != null && typeof object == "object" &&
 'splice' in object && 'join' in object;
 },

 isHash: function(object) {
 return object instanceof Hash;
 },

 isFunction: function(object) {
 return typeof object == "function";
 },

 isString: function(object) {
 return typeof object == "string";
 },

 isNumber: function(object) {
 return typeof object == "number";
 },

 isUndefined: function(object) {
 return typeof object == "undefined";
 }
});

Object.extend(Function.prototype, {
 argumentNames: function() {
 var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1]
 .replace(/\s+/g, '').split(',');
 return names.length == 1 && !names[0] ? [] : names;
 },

 bind: function() {
 if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
 var __method = this, args = $A(arguments), object = args.shift();
 return function() {
 return __method.apply(object, args.concat($A(arguments)));
 }
 },

 bindAsEventListener: function() {
 var __method = this, args = $A(arguments), object = args.shift();
 return function(event) {
 return __method.apply(object, [event || window.event].concat(args));
 }
 },

 curry: function() {
 if (!arguments.length) return this;
 var __method = this, args = $A(arguments);
 return function() {
 return __method.apply(this, args.concat($A(arguments)));
 }
 },

 delay: function() {
 var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
 return window.setTimeout(function() {
 return __method.apply(__method, args);
 }, timeout);
 },

 defer: function() {
 var args = [0.01].concat($A(arguments));
 return this.delay.apply(this, args);
 },

 wrap: function(wrapper) {
 var __method = this;
 return function() {
 return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
 }
 },

 methodize: function() {
 if (this._methodized) return this._methodized;
 var __method = this;
 return this._methodized = function() {
 return __method.apply(null, [this].concat($A(arguments)));
 };
 }
});

Date.prototype.toJSON = function() {
 return '"' + this.getUTCFullYear() + '-' +
 (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
 this.getUTCDate().toPaddedString(2) + 'T' +
 this.getUTCHours().toPaddedString(2) + ':' +
 this.getUTCMinutes().toPaddedString(2) + ':' +
 this.getUTCSeconds().toPaddedString(2) + 'Z"';
};

var Try = {
 these: function() {
 var returnValue;

 for (var i = 0, length = arguments.length; i < length; i++) {
 var lambda = arguments[i];
 try {
 returnValue = lambda();
 break;
 } catch (e) { }
 }

 return returnValue;
 }
};

RegExp.prototype.match = RegExp.prototype.test;

RegExp.escape = function(str) {
 return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};

/*--------------------------------------------------------------------------*/

var PeriodicalExecuter = Class.create({
 initialize: function(callback, frequency) {
 this.callback = callback;
 this.frequency = frequency;
 this.currentlyExecuting = false;

 this.registerCallback();
 },

 registerCallback: function() {
 this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
 },

 execute: function() {
 this.callback(this);
 },

 stop: function() {
 if (!this.timer) return;
 clearInterval(this.timer);
 this.timer = null;
 },

 onTimerEvent: function() {
 if (!this.currentlyExecuting) {
 try {
 this.currentlyExecuting = true;
 this.execute();
 } finally {
 this.currentlyExecuting = false;
 }
 }
 }
});
Object.extend(String, {
 interpret: function(value) {
 return value == null ? '' : String(value);
 },
 specialChar: {
 '\b': '\\b',
 '\t': '\\t',
 '\n': '\\n',
 '\f': '\\f',
 '\r': '\\r',
 '\\': '\\\\'
 }
});

Object.extend(String.prototype, {
 gsub: function(pattern, replacement) {
 var result = '', source = this, match;
 replacement = arguments.callee.prepareReplacement(replacement);

 while (source.length > 0) {
 if (match = source.match(pattern)) {
 result += source.slice(0, match.index);
 result += String.interpret(replacement(match));
 source = source.slice(match.index + match[0].length);
 } else {
 result += source, source = '';
 }
 }
 return result;
 },

 sub: function(pattern, replacement, count) {
 replacement = this.gsub.prepareReplacement(replacement);
 count = Object.isUndefined(count) ? 1 : count;

 return this.gsub(pattern, function(match) {
 if (--count < 0) return match[0];
 return replacement(match);
 });
 },

 scan: function(pattern, iterator) {
 this.gsub(pattern, iterator);
 return String(this);
 },

 truncate: function(length, truncation) {
 length = length || 30;
 truncation = Object.isUndefined(truncation) ? '...' : truncation;
 return this.length > length ?
 this.slice(0, length - truncation.length) + truncation : String(this);
 },

 strip: function() {
 return this.replace(/^\s+/, '').replace(/\s+$/, '');
 },

 stripTags: function() {
 return this.replace(/<\/?[^>]+>/gi, '');
 },

 stripScripts: function() {
 return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
 },

 extractScripts: function() {
 var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
 var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
 return (this.match(matchAll) || []).map(function(scriptTag) {
 return (scriptTag.match(matchOne) || ['', ''])[1];
 });
 },

 evalScripts: function() {
 return this.extractScripts().map(function(script) { return eval(script) });
 },

 escapeHTML: function() {
 var self = arguments.callee;
 self.text.data = this;
 return self.div.innerHTML;
 },

 unescapeHTML: function() {
 var div = new Element('div');
 div.innerHTML = this.stripTags();
 return div.childNodes[0] ? (div.childNodes.length > 1 ?
 $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
 div.childNodes[0].nodeValue) : '';
 },

 toQueryParams: function(separator) {
 var match = this.strip().match(/([^?#]*)(#.*)?$/);
 if (!match) return { };

 return match[1].split(separator || '&').inject({ }, function(hash, pair) {
 if ((pair = pair.split('='))[0]) {
 var key = decodeURIComponent(pair.shift());
 var value = pair.length > 1 ? pair.join('=') : pair[0];
 if (value != undefined) value = decodeURIComponent(value);

 if (key in hash) {
 if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
 hash[key].push(value);
 }
 else hash[key] = value;
 }
 return hash;
 });
 },

 toArray: function() {
 return this.split('');
 },

 succ: function() {
 return this.slice(0, this.length - 1) +
 String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
 },

 times: function(count) {
 return count < 1 ? '' : new Array(count + 1).join(this);
 },

 camelize: function() {
 var parts = this.split('-'), len = parts.length;
 if (len == 1) return parts[0];

 var camelized = this.charAt(0) == '-'
 ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
 : parts[0];

 for (var i = 1; i < len; i++)
 camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);

 return camelized;
 },

 capitalize: function() {
 return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
 },

 underscore: function() {
 return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
 },

 dasherize: function() {
 return this.gsub(/_/,'-');
 },

 inspect: function(useDoubleQuotes) {
 var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
 var character = String.specialChar[match[0]];
 return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
 });
 if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
 return "'" + escapedString.replace(/'/g, '\\\'') + "'";
 },

 toJSON: function() {
 return this.inspect(true);
 },

 unfilterJSON: function(filter) {
 return this.sub(filter || Prototype.JSONFilter, '#{1}');
 },

 isJSON: function() {
 var str = this;
 if (str.blank()) return false;
 str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
 return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
 },

 evalJSON: function(sanitize) {
 var json = this.unfilterJSON();
 try {
 if (!sanitize || json.isJSON()) return eval('(' + json + ')');
 } catch (e) { }
 throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
 },

 include: function(pattern) {
 return this.indexOf(pattern) > -1;
 },

 startsWith: function(pattern) {
 return this.indexOf(pattern) === 0;
 },

 endsWith: function(pattern) {
 var d = this.length - pattern.length;
 return d >= 0 && this.lastIndexOf(pattern) === d;
 },

 empty: function() {
 return this == '';
 },

 blank: function() {
 return /^\s*$/.test(this);
 },

 interpolate: function(object, pattern) {
 return new Template(this, pattern).evaluate(object);
 }
});

if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
 escapeHTML: function() {
 return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
 },
 unescapeHTML: function() {
 return this.stripTags().replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
 }
});

String.prototype.gsub.prepareReplacement = function(replacement) {
 if (Object.isFunction(replacement)) return replacement;
 var template = new Template(replacement);
 return function(match) { return template.evaluate(match) };
};

String.prototype.parseQuery = String.prototype.toQueryParams;

Object.extend(String.prototype.escapeHTML, {
 div: document.createElement('div'),
 text: document.createTextNode('')
});

String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);

var Template = Class.create({
 initialize: function(template, pattern) {
 this.template = template.toString();
 this.pattern = pattern || Template.Pattern;
 },

 evaluate: function(object) {
 if (Object.isFunction(object.toTemplateReplacements))
 object = object.toTemplateReplacements();

 return this.template.gsub(this.pattern, function(match) {
 if (object == null) return '';

 var before = match[1] || '';
 if (before == '\\') return match[2];

 var ctx = object, expr = match[3];
 var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
 match = pattern.exec(expr);
 if (match == null) return before;

 while (match != null) {
 var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
 ctx = ctx[comp];
 if (null == ctx || '' == match[3]) break;
 expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
 match = pattern.exec(expr);
 }

 return before + String.interpret(ctx);
 });
 }
});
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;

var $break = { };

var Enumerable = {
 each: function(iterator, context) {
 var index = 0;
 try {
 this._each(function(value) {
 iterator.call(context, value, index++);
 });
 } catch (e) {
 if (e != $break) throw e;
 }
 return this;
 },

 eachSlice: function(number, iterator, context) {
 var index = -number, slices = [], array = this.toArray();
 if (number < 1) return array;
 while ((index += number) < array.length)
 slices.push(array.slice(index, index+number));
 return slices.collect(iterator, context);
 },

 all: function(iterator, context) {
 iterator = iterator || Prototype.K;
 var result = true;
 this.each(function(value, index) {
 result = result && !!iterator.call(context, value, index);
 if (!result) throw $break;
 });
 return result;
 },

 any: function(iterator, context) {
 iterator = iterator || Prototype.K;
 var result = false;
 this.each(function(value, index) {
 if (result = !!iterator.call(context, value, index))
 throw $break;
 });
 return result;
 },

 collect: function(iterator, context) {
 iterator = iterator || Prototype.K;
 var results = [];
 this.each(function(value, index) {
 results.push(iterator.call(context, value, index));
 });
 return results;
 },

 detect: function(iterator, context) {
 var result;
 this.each(function(value, index) {
 if (iterator.call(context, value, index)) {
 result = value;
 throw $break;
 }
 });
 return result;
 },

 findAll: function(iterator, context) {
 var results = [];
 this.each(function(value, index) {
 if (iterator.call(context, value, index))
 results.push(value);
 });
 return results;
 },

 grep: function(filter, iterator, context) {
 iterator = iterator || Prototype.K;
 var results = [];

 if (Object.isString(filter))
 filter = new RegExp(filter);

 this.each(function(value, index) {
 if (filter.match(value))
 results.push(iterator.call(context, value, index));
 });
 return results;
 },

 include: function(object) {
 if (Object.isFunction(this.indexOf))
 if (this.indexOf(object) != -1) return true;

 var found = false;
 this.each(function(value) {
 if (value == object) {
 found = true;
 throw $break;
 }
 });
 return found;
 },

 inGroupsOf: function(number, fillWith) {
 fillWith = Object.isUndefined(fillWith) ? null : fillWith;
 return this.eachSlice(number, function(slice) {
 while(slice.length < number) slice.push(fillWith);
 return slice;
 });
 },

 inject: function(memo, iterator, context) {
 this.each(function(value, index) {
 memo = iterator.call(context, memo, value, index);
 });
 return memo;
 },

 invoke: function(method) {
 var args = $A(arguments).slice(1);
 return this.map(function(value) {
 return value[method].apply(value, args);
 });
 },

 max: function(iterator, context) {
 iterator = iterator || Prototype.K;
 var result;
 this.each(function(value, index) {
 value = iterator.call(context, value, index);
 if (result == null || value >= result)
 result = value;
 });
 return result;
 },

 min: function(iterator, context) {
 iterator = iterator || Prototype.K;
 var result;
 this.each(function(value, index) {
 value = iterator.call(context, value, index);
 if (result == null || value < result)
 result = value;
 });
 return result;
 },

 partition: function(iterator, context) {
 iterator = iterator || Prototype.K;
 var trues = [], falses = [];
 this.each(function(value, index) {
 (iterator.call(context, value, index) ?
 trues : falses).push(value);
 });
 return [trues, falses];
 },

 pluck: function(property) {
 var results = [];
 this.each(function(value) {
 results.push(value[property]);
 });
 return results;
 },

 reject: function(iterator, context) {
 var results = [];
 this.each(function(value, index) {
 if (!iterator.call(context, value, index))
 results.push(value);
 });
 return results;
 },

 sortBy: function(iterator, context) {
 return this.map(function(value, index) {
 return {
 value: value,
 criteria: iterator.call(context, value, index)
 };
 }).sort(function(left, right) {
 var a = left.criteria, b = right.criteria;
 return a < b ? -1 : a > b ? 1 : 0;
 }).pluck('value');
 },

 toArray: function() {
 return this.map();
 },

 zip: function() {
 var iterator = Prototype.K, args = $A(arguments);
 if (Object.isFunction(args.last()))
 iterator = args.pop();

 var collections = [this].concat(args).map($A);
 return this.map(function(value, index) {
 return iterator(collections.pluck(index));
 });
 },

 size: function() {
 return this.toArray().length;
 },

 inspect: function() {
 return '#<Enumerable:' + this.toArray().inspect() + '>';
 }
};

Object.extend(Enumerable, {
 map: Enumerable.collect,
 find: Enumerable.detect,
 select: Enumerable.findAll,
 filter: Enumerable.findAll,
 member: Enumerable.include,
 entries: Enumerable.toArray,
 every: Enumerable.all,
 some: Enumerable.any
});
function $A(iterable) {
 if (!iterable) return [];
 if (iterable.toArray) return iterable.toArray();
 var length = iterable.length || 0, results = new Array(length);
 while (length--) results[length] = iterable[length];
 return results;
}

if (Prototype.Browser.WebKit) {
 $A = function(iterable) {
 if (!iterable) return [];
 // In Safari, only use the `toArray` method if it's not a NodeList.
 // A NodeList is a function, has an function `item` property, and a numeric
 // `length` property. Adapted from Google Doctype.
 if (!(typeof iterable === 'function' && typeof iterable.length ===
 'number' && typeof iterable.item === 'function') && iterable.toArray)
 return iterable.toArray();
 var length = iterable.length || 0, results = new Array(length);
 while (length--) results[length] = iterable[length];
 return results;
 };
}

Array.from = $A;

Object.extend(Array.prototype, Enumerable);

if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;

Object.extend(Array.prototype, {
 _each: function(iterator) {
 for (var i = 0, length = this.length; i < length; i++)
 iterator(this[i]);
 },

 clear: function() {
 this.length = 0;
 return this;
 },

 first: function() {
 return this[0];
 },

 last: function() {
 return this[this.length - 1];
 },

 compact: function() {
 return this.select(function(value) {
 return value != null;
 });
 },

 flatten: function() {
 return this.inject([], function(array, value) {
 return array.concat(Object.isArray(value) ?
 value.flatten() : [value]);
 });
 },

 without: function() {
 var values = $A(arguments);
 return this.select(function(value) {
 return !values.include(value);
 });
 },

 reverse: function(inline) {
 return (inline !== false ? this : this.toArray())._reverse();
 },

 reduce: function() {
 return this.length > 1 ? this : this[0];
 },

 uniq: function(sorted) {
 return this.inject([], function(array, value, index) {
 if (0 == index || (sorted ? array.last() != value : !array.include(value)))
 array.push(value);
 return array;
 });
 },

 intersect: function(array) {
 return this.uniq().findAll(function(item) {
 return array.detect(function(value) { return item === value });
 });
 },

 clone: function() {
 return [].concat(this);
 },

 size: function() {
 return this.length;
 },

 inspect: function() {
 return '[' + this.map(Object.inspect).join(', ') + ']';
 },

 toJSON: function() {
 var results = [];
 this.each(function(object) {
 var value = Object.toJSON(object);
 if (!Object.isUndefined(value)) results.push(value);
 });
 return '[' + results.join(', ') + ']';
 }
});

// use native browser JS 1.6 implementation if available
if (Object.isFunction(Array.prototype.forEach))
 Array.prototype._each = Array.prototype.forEach;

if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
 i || (i = 0);
 var length = this.length;
 if (i < 0) i = length + i;
 for (; i < length; i++)
 if (this[i] === item) return i;
 return -1;
};

if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
 i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
 var n = this.slice(0, i).reverse().indexOf(item);
 return (n < 0) ? n : i - n - 1;
};

Array.prototype.toArray = Array.prototype.clone;

function $w(string) {
 if (!Object.isString(string)) return [];
 string = string.strip();
 return string ? string.split(/\s+/) : [];
}

if (Prototype.Browser.Opera){
 Array.prototype.concat = function() {
 var array = [];
 for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
 for (var i = 0, length = arguments.length; i < length; i++) {
 if (Object.isArray(arguments[i])) {
 for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
 array.push(arguments[i][j]);
 } else {
 array.push(arguments[i]);
 }
 }
 return array;
 };
}
Object.extend(Number.prototype, {
 toColorPart: function() {
 return this.toPaddedString(2, 16);
 },

 succ: function() {
 return this + 1;
 },

 times: function(iterator, context) {
 $R(0, this, true).each(iterator, context);
 return this;
 },

 toPaddedString: function(length, radix) {
 var string = this.toString(radix || 10);
 return '0'.times(length - string.length) + string;
 },

 toJSON: function() {
 return isFinite(this) ? this.toString() : 'null';
 }
});

$w('abs round ceil floor').each(function(method){
 Number.prototype[method] = Math[method].methodize();
});
function $H(object) {
 return new Hash(object);
};

var Hash = Class.create(Enumerable, (function() {

 function toQueryPair(key, value) {
 if (Object.isUndefined(value)) return key;
 return key + '=' + encodeURIComponent(String.interpret(value));
 }

 return {
 initialize: function(object) {
 this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
 },

 _each: function(iterator) {
 for (var key in this._object) {
 var value = this._object[key], pair = [key, value];
 pair.key = key;
 pair.value = value;
 iterator(pair);
 }
 },

 set: function(key, value) {
 return this._object[key] = value;
 },

 get: function(key) {
 // simulating poorly supported hasOwnProperty
 if (this._object[key] !== Object.prototype[key])
 return this._object[key];
 },

 unset: function(key) {
 var value = this._object[key];
 delete this._object[key];
 return value;
 },

 toObject: function() {
 return Object.clone(this._object);
 },

 keys: function() {
 return this.pluck('key');
 },

 values: function() {
 return this.pluck('value');
 },

 index: function(value) {
 var match = this.detect(function(pair) {
 return pair.value === value;
 });
 return match && match.key;
 },

 merge: function(object) {
 return this.clone().update(object);
 },

 update: function(object) {
 return new Hash(object).inject(this, function(result, pair) {
 result.set(pair.key, pair.value);
 return result;
 });
 },

 toQueryString: function() {
 return this.inject([], function(results, pair) {
 var key = encodeURIComponent(pair.key), values = pair.value;

 if (values && typeof values == 'object') {
 if (Object.isArray(values))
 return results.concat(values.map(toQueryPair.curry(key)));
 } else results.push(toQueryPair(key, values));
 return results;
 }).join('&');
 },

 inspect: function() {
 return '#<Hash:{' + this.map(function(pair) {
 return pair.map(Object.inspect).join(': ');
 }).join(', ') + '}>';
 },

 toJSON: function() {
 return Object.toJSON(this.toObject());
 },

 clone: function() {
 return new Hash(this);
 }
 }
})());

Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
Hash.from = $H;
var ObjectRange = Class.create(Enumerable, {
 initialize: function(start, end, exclusive) {
 this.start = start;
 this.end = end;
 this.exclusive = exclusive;
 },

 _each: function(iterator) {
 var value = this.start;
 while (this.include(value)) {
 iterator(value);
 value = value.succ();
 }
 },

 include: function(value) {
 if (value < this.start)
 return false;
 if (this.exclusive)
 return value < this.end;
 return value <= this.end;
 }
});

var $R = function(start, end, exclusive) {
 return new ObjectRange(start, end, exclusive);
};

var Ajax = {
 getTransport: function() {
 return Try.these(
 function() {return new XMLHttpRequest()},
 function() {return new ActiveXObject('Msxml2.XMLHTTP')},
 function() {return new ActiveXObject('Microsoft.XMLHTTP')}
 ) || false;
 },

 activeRequestCount: 0
};

Ajax.Responders = {
 responders: [],

 _each: function(iterator) {
 this.responders._each(iterator);
 },

 register: function(responder) {
 if (!this.include(responder))
 this.responders.push(responder);
 },

 unregister: function(responder) {
 this.responders = this.responders.without(responder);
 },

 dispatch: function(callback, request, transport, json) {
 this.each(function(responder) {
 if (Object.isFunction(responder[callback])) {
 try {
 responder[callback].apply(responder, [request, transport, json]);
 } catch (e) { }
 }
 });
 }
};

Object.extend(Ajax.Responders, Enumerable);

Ajax.Responders.register({
 onCreate: function() { Ajax.activeRequestCount++ },
 onComplete: function() { Ajax.activeRequestCount-- }
});

Ajax.Base = Class.create({
 initialize: function(options) {
 this.options = {
 method: 'post',
 asynchronous: true,
 contentType: 'application/x-www-form-urlencoded',
 encoding: 'UTF-8',
 parameters: '',
 evalJSON: true,
 evalJS: true
 };
 Object.extend(this.options, options || { });

 this.options.method = this.options.method.toLowerCase();

 if (Object.isString(this.options.parameters))
 this.options.parameters = this.options.parameters.toQueryParams();
 else if (Object.isHash(this.options.parameters))
 this.options.parameters = this.options.parameters.toObject();
 }
});

Ajax.Request = Class.create(Ajax.Base, {
 _complete: false,

 initialize: function($super, url, options) {
 $super(options);
 this.transport = Ajax.getTransport();
 this.request(url);
 },

 request: function(url) {
 this.url = url;
 this.method = this.options.method;
 var params = Object.clone(this.options.parameters);

 if (!['get', 'post'].include(this.method)) {
 // simulate other verbs over post
 params['_method'] = this.method;
 this.method = 'post';
 }

 this.parameters = params;

 if (params = Object.toQueryString(params)) {
 // when GET, append parameters to URL
 if (this.method == 'get')
 this.url += (this.url.include('?') ? '&' : '?') + params;
 else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
 params += '&_=';
 }

 try {
 var response = new Ajax.Response(this);
 if (this.options.onCreate) this.options.onCreate(response);
 Ajax.Responders.dispatch('onCreate', this, response);

 this.transport.open(this.method.toUpperCase(), this.url,
 this.options.asynchronous);

 if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);

 this.transport.onreadystatechange = this.onStateChange.bind(this);
 this.setRequestHeaders();

 this.body = this.method == 'post' ? (this.options.postBody || params) : null;
 this.transport.send(this.body);

 /* Force Firefox to handle ready state 4 for synchronous requests */
 if (!this.options.asynchronous && this.transport.overrideMimeType)
 this.onStateChange();

 }
 catch (e) {
 this.dispatchException(e);
 }
 },

 onStateChange: function() {
 var readyState = this.transport.readyState;
 if (readyState > 1 && !((readyState == 4) && this._complete))
 this.respondToReadyState(this.transport.readyState);
 },

 setRequestHeaders: function() {
 var headers = {
 'X-Requested-With': 'XMLHttpRequest',
 'X-Prototype-Version': Prototype.Version,
 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
 };

 if (this.method == 'post') {
 headers['Content-type'] = this.options.contentType +
 (this.options.encoding ? '; charset=' + this.options.encoding : '');

 /* Force "Connection: close" for older Mozilla browsers to work
 * around a bug where XMLHttpRequest sends an incorrect
 * Content-length header. See Mozilla Bugzilla #246651.
 */
 if (this.transport.overrideMimeType &&
 (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
 headers['Connection'] = 'close';
 }

 // user-defined headers
 if (typeof this.options.requestHeaders == 'object') {
 var extras = this.options.requestHeaders;

 if (Object.isFunction(extras.push))
 for (var i = 0, length = extras.length; i < length; i += 2)
 headers[extras[i]] = extras[i+1];
 else
 $H(extras).each(function(pair) { headers[pair.key] = pair.value });
 }

 for (var name in headers)
 this.transport.setRequestHeader(name, headers[name]);
 },

 success: function() {
 var status = this.getStatus();
 return !status || (status >= 200 && status < 300);
 },

 getStatus: function() {
 try {
 return this.transport.status || 0;
 } catch (e) { return 0 }
 },

 respondToReadyState: function(readyState) {
 var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);

 if (state == 'Complete') {
 try {
 this._complete = true;
 (this.options['on' + response.status]
 || this.options['on' + (this.success() ? 'Success' : 'Failure')]
 || Prototype.emptyFunction)(response, response.headerJSON);
 } catch (e) {
 this.dispatchException(e);
 }

 var contentType = response.getHeader('Content-type');
 if (this.options.evalJS == 'force'
 || (this.options.evalJS && this.isSameOrigin() && contentType
 && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
 this.evalResponse();
 }

 try {
 (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
 Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
 } catch (e) {
 this.dispatchException(e);
 }

 if (state == 'Complete') {
 // avoid memory leak in MSIE: clean up
 this.transport.onreadystatechange = Prototype.emptyFunction;
 }
 },

 isSameOrigin: function() {
 var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
 return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
 protocol: location.protocol,
 domain: document.domain,
 port: location.port ? ':' + location.port : ''
 }));
 },

 getHeader: function(name) {
 try {
 return this.transport.getResponseHeader(name) || null;
 } catch (e) { return null }
 },

 evalResponse: function() {
 try {
 return eval((this.transport.responseText || '').unfilterJSON());
 } catch (e) {
 this.dispatchException(e);
 }
 },

 dispatchException: function(exception) {
 (this.options.onException || Prototype.emptyFunction)(this, exception);
 Ajax.Responders.dispatch('onException', this, exception);
 }
});

Ajax.Request.Events =
 ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Response = Class.create({
 initialize: function(request){
 this.request = request;
 var transport = this.transport = request.transport,
 readyState = this.readyState = transport.readyState;

 if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
 this.status = this.getStatus();
 this.statusText = this.getStatusText();
 this.responseText = String.interpret(transport.responseText);
 this.headerJSON = this._getHeaderJSON();
 }

 if(readyState == 4) {
 var xml = transport.responseXML;
 this.responseXML = Object.isUndefined(xml) ? null : xml;
 this.responseJSON = this._getResponseJSON();
 }
 },

 status: 0,
 statusText: '',

 getStatus: Ajax.Request.prototype.getStatus,

 getStatusText: function() {
 try {
 return this.transport.statusText || '';
 } catch (e) { return '' }
 },

 getHeader: Ajax.Request.prototype.getHeader,

 getAllHeaders: function() {
 try {
 return this.getAllResponseHeaders();
 } catch (e) { return null }
 },

 getResponseHeader: function(name) {
 return this.transport.getResponseHeader(name);
 },

 getAllResponseHeaders: function() {
 return this.transport.getAllResponseHeaders();
 },

 _getHeaderJSON: function() {
 var json = this.getHeader('X-JSON');
 if (!json) return null;
 json = decodeURIComponent(escape(json));
 try {
 return json.evalJSON(this.request.options.sanitizeJSON ||
 !this.request.isSameOrigin());
 } catch (e) {
 this.request.dispatchException(e);
 }
 },

 _getResponseJSON: function() {
 var options = this.request.options;
 if (!options.evalJSON || (options.evalJSON != 'force' &&
 !(this.getHeader('Content-type') || '').include('application/json')) ||
 this.responseText.blank())
 return null;
 try {
 return this.responseText.evalJSON(options.sanitizeJSON ||
 !this.request.isSameOrigin());
 } catch (e) {
 this.request.dispatchException(e);
 }
 }
});

Ajax.Updater = Class.create(Ajax.Request, {
 initialize: function($super, container, url, options) {
 this.container = {
 success: (container.success || container),
 failure: (container.failure || (container.success ? null : container))
 };

 options = Object.clone(options);
 var onComplete = options.onComplete;
 options.onComplete = (function(response, json) {
 this.updateContent(response.responseText);
 if (Object.isFunction(onComplete)) onComplete(response, json);
 }).bind(this);

 $super(url, options);
 },

 updateContent: function(responseText) {
 var receiver = this.container[this.success() ? 'success' : 'failure'],
 options = this.options;

 if (!options.evalScripts) responseText = responseText.stripScripts();

 if (receiver = $(receiver)) {
 if (options.insertion) {
 if (Object.isString(options.insertion)) {
 var insertion = { }; insertion[options.insertion] = responseText;
 receiver.insert(insertion);
 }
 else options.insertion(receiver, responseText);
 }
 else receiver.update(responseText);
 }
 }
});

Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
 initialize: function($super, container, url, options) {
 $super(options);
 this.onComplete = this.options.onComplete;

 this.frequency = (this.options.frequency || 2);
 this.decay = (this.options.decay || 1);

 this.updater = { };
 this.container = container;
 this.url = url;

 this.start();
 },

 start: function() {
 this.options.onComplete = this.updateComplete.bind(this);
 this.onTimerEvent();
 },

 stop: function() {
 this.updater.options.onComplete = undefined;
 clearTimeout(this.timer);
 (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
 },

 updateComplete: function(response) {
 if (this.options.decay) {
 this.decay = (response.responseText == this.lastText ?
 this.decay * this.options.decay : 1);

 this.lastText = response.responseText;
 }
 this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
 },

 onTimerEvent: function() {
 this.updater = new Ajax.Updater(this.container, this.url, this.options);
 }
});
function $(element) {
 if (arguments.length > 1) {
 for (var i = 0, elements = [], length = arguments.length; i < length; i++)
 elements.push($(arguments[i]));
 return elements;
 }
 if (Object.isString(element))
 element = document.getElementById(element);
 return Element.extend(element);
}

if (Prototype.BrowserFeatures.XPath) {
 document._getElementsByXPath = function(expression, parentElement) {
 var results = [];
 var query = document.evaluate(expression, $(parentElement) || document,
 null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
 for (var i = 0, length = query.snapshotLength; i < length; i++)
 results.push(Element.extend(query.snapshotItem(i)));
 return results;
 };
}

/*--------------------------------------------------------------------------*/

if (!window.Node) var Node = { };

if (!Node.ELEMENT_NODE) {
 // DOM level 2 ECMAScript Language Binding
 Object.extend(Node, {
 ELEMENT_NODE: 1,
 ATTRIBUTE_NODE: 2,
 TEXT_NODE: 3,
 CDATA_SECTION_NODE: 4,
 ENTITY_REFERENCE_NODE: 5,
 ENTITY_NODE: 6,
 PROCESSING_INSTRUCTION_NODE: 7,
 COMMENT_NODE: 8,
 DOCUMENT_NODE: 9,
 DOCUMENT_TYPE_NODE: 10,
 DOCUMENT_FRAGMENT_NODE: 11,
 NOTATION_NODE: 12
 });
}

(function() {
 var element = this.Element;
 this.Element = function(tagName, attributes) {
 attributes = attributes || { };
 tagName = tagName.toLowerCase();
 var cache = Element.cache;
 if (Prototype.Browser.IE && attributes.name) {
 tagName = '<' + tagName + ' name="' + attributes.name + '">';
 delete attributes.name;
 return Element.writeAttribute(document.createElement(tagName), attributes);
 }
 if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
 return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
 };
 Object.extend(this.Element, element || { });
 if (element) this.Element.prototype = element.prototype;
}).call(window);

Element.cache = { };

Element.Methods = {
 visible: function(element) {
 return $(element).style.display != 'none';
 },

 toggle: function(element) {
 element = $(element);
 Element[Element.visible(element) ? 'hide' : 'show'](element);
 return element;
 },

 hide: function(element) {
 element = $(element);
 element.style.display = 'none';
 return element;
 },

 show: function(element) {
 element = $(element);
 element.style.display = '';
 return element;
 },

 remove: function(element) {
 element = $(element);
 element.parentNode.removeChild(element);
 return element;
 },

 update: function(element, content) {
 element = $(element);
 if (content && content.toElement) content = content.toElement();
 if (Object.isElement(content)) return element.update().insert(content);
 content = Object.toHTML(content);
 element.innerHTML = content.stripScripts();
 content.evalScripts.bind(content).defer();
 return element;
 },

 replace: function(element, content) {
 element = $(element);
 if (content && content.toElement) content = content.toElement();
 else if (!Object.isElement(content)) {
 content = Object.toHTML(content);
 var range = element.ownerDocument.createRange();
 range.selectNode(element);
 content.evalScripts.bind(content).defer();
 content = range.createContextualFragment(content.stripScripts());
 }
 element.parentNode.replaceChild(content, element);
 return element;
 },

 insert: function(element, insertions) {
 element = $(element);

 if (Object.isString(insertions) || Object.isNumber(insertions) ||
 Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
 insertions = {bottom:insertions};

 var content, insert, tagName, childNodes;

 for (var position in insertions) {
 content = insertions[position];
 position = position.toLowerCase();
 insert = Element._insertionTranslations[position];

 if (content && content.toElement) content = content.toElement();
 if (Object.isElement(content)) {
 insert(element, content);
 continue;
 }

 content = Object.toHTML(content);

 tagName = ((position == 'before' || position == 'after')
 ? element.parentNode : element).tagName.toUpperCase();

 childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());

 if (position == 'top' || position == 'after') childNodes.reverse();
 childNodes.each(insert.curry(element));

 content.evalScripts.bind(content).defer();
 }

 return element;
 },

 wrap: function(element, wrapper, attributes) {
 element = $(element);
 if (Object.isElement(wrapper))
 $(wrapper).writeAttribute(attributes || { });
 else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
 else wrapper = new Element('div', wrapper);
 if (element.parentNode)
 element.parentNode.replaceChild(wrapper, element);
 wrapper.appendChild(element);
 return wrapper;
 },

 inspect: function(element) {
 element = $(element);
 var result = '<' + element.tagName.toLowerCase();
 $H({'id': 'id', 'className': 'class'}).each(function(pair) {
 var property = pair.first(), attribute = pair.last();
 var value = (element[property] || '').toString();
 if (value) result += ' ' + attribute + '=' + value.inspect(true);
 });
 return result + '>';
 },

 recursivelyCollect: function(element, property) {
 element = $(element);
 var elements = [];
 while (element = element[property])
 if (element.nodeType == 1)
 elements.push(Element.extend(element));
 return elements;
 },

 ancestors: function(element) {
 return $(element).recursivelyCollect('parentNode');
 },

 descendants: function(element) {
 return $(element).select("*");
 },

 firstDescendant: function(element) {
 element = $(element).firstChild;
 while (element && element.nodeType != 1) element = element.nextSibling;
 return $(element);
 },

 immediateDescendants: function(element) {
 if (!(element = $(element).firstChild)) return [];
 while (element && element.nodeType != 1) element = element.nextSibling;
 if (element) return [element].concat($(element).nextSiblings());
 return [];
 },

 previousSiblings: function(element) {
 return $(element).recursivelyCollect('previousSibling');
 },

 nextSiblings: function(element) {
 return $(element).recursivelyCollect('nextSibling');
 },

 siblings: function(element) {
 element = $(element);
 return element.previousSiblings().reverse().concat(element.nextSiblings());
 },

 match: function(element, selector) {
 if (Object.isString(selector))
 selector = new Selector(selector);
 return selector.match($(element));
 },

 up: function(element, expression, index) {
 element = $(element);
 if (arguments.length == 1) return $(element.parentNode);
 var ancestors = element.ancestors();
 return Object.isNumber(expression) ? ancestors[expression] :
 Selector.findElement(ancestors, expression, index);
 },

 down: function(element, expression, index) {
 element = $(element);
 if (arguments.length == 1) return element.firstDescendant();
 return Object.isNumber(expression) ? element.descendants()[expression] :
 Element.select(element, expression)[index || 0];
 },

 previous: function(element, expression, index) {
 element = $(element);
 if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
 var previousSiblings = element.previousSiblings();
 return Object.isNumber(expression) ? previousSiblings[expression] :
 Selector.findElement(previousSiblings, expression, index);
 },

 next: function(element, expression, index) {
 element = $(element);
 if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
 var nextSiblings = element.nextSiblings();
 return Object.isNumber(expression) ? nextSiblings[expression] :
 Selector.findElement(nextSiblings, expression, index);
 },

 select: function() {
 var args = $A(arguments), element = $(args.shift());
 return Selector.findChildElements(element, args);
 },

 adjacent: function() {
 var args = $A(arguments), element = $(args.shift());
 return Selector.findChildElements(element.parentNode, args).without(element);
 },

 identify: function(element) {
 element = $(element);
 var id = element.readAttribute('id'), self = arguments.callee;
 if (id) return id;
 do { id = 'anonymous_element_' + self.counter++ } while ($(id));
 element.writeAttribute('id', id);
 return id;
 },

 readAttribute: function(element, name) {
 element = $(element);
 if (Prototype.Browser.IE) {
 var t = Element._attributeTranslations.read;
 if (t.values[name]) return t.values[name](element, name);
 if (t.names[name]) name = t.names[name];
 if (name.include(':')) {
 return (!element.attributes || !element.attributes[name]) ? null :
 element.attributes[name].value;
 }
 }
 return element.getAttribute(name);
 },

 writeAttribute: function(element, name, value) {
 element = $(element);
 var attributes = { }, t = Element._attributeTranslations.write;

 if (typeof name == 'object') attributes = name;
 else attributes[name] = Object.isUndefined(value) ? true : value;

 for (var attr in attributes) {
 name = t.names[attr] || attr;
 value = attributes[attr];
 if (t.values[attr]) name = t.values[attr](element, value);
 if (value === false || value === null)
 element.removeAttribute(name);
 else if (value === true)
 element.setAttribute(name, name);
 else element.setAttribute(name, value);
 }
 return element;
 },

 getHeight: function(element) {
 return $(element).getDimensions().height;
 },

 getWidth: function(element) {
 return $(element).getDimensions().width;
 },

 classNames: function(element) {
 return new Element.ClassNames(element);
 },

 hasClassName: function(element, className) {
 if (!(element = $(element))) return;
 var elementClassName = element.className;
 return (elementClassName.length > 0 && (elementClassName == className ||
 new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
 },

 addClassName: function(element, className) {
 if (!(element = $(element))) return;
 if (!element.hasClassName(className))
 element.className += (element.className ? ' ' : '') + className;
 return element;
 },

 removeClassName: function(element, className) {
 if (!(element = $(element))) return;
 element.className = element.className.replace(
 new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
 return element;
 },

 toggleClassName: function(element, className) {
 if (!(element = $(element))) return;
 return element[element.hasClassName(className) ?
 'removeClassName' : 'addClassName'](className);
 },

 // removes whitespace-only text node children
 cleanWhitespace: function(element) {
 element = $(element);
 var node = element.firstChild;
 while (node) {
 var nextNode = node.nextSibling;
 if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
 element.removeChild(node);
 node = nextNode;
 }
 return element;
 },

 empty: function(element) {
 return $(element).innerHTML.blank();
 },

 descendantOf: function(element, ancestor) {
 element = $(element), ancestor = $(ancestor);

 if (element.compareDocumentPosition)
 return (element.compareDocumentPosition(ancestor) & 8) === 8;

 if (ancestor.contains)
 return ancestor.contains(element) && ancestor !== element;

 while (element = element.parentNode)
 if (element == ancestor) return true;

 return false;
 },

 scrollTo: function(element) {
 element = $(element);
 var pos = element.cumulativeOffset();
 window.scrollTo(pos[0], pos[1]);
 return element;
 },

 getStyle: function(element, style) {
 element = $(element);
 style = style == 'float' ? 'cssFloat' : style.camelize();
 var value = element.style[style];
 if (!value || value == 'auto') {
 var css = document.defaultView.getComputedStyle(element, null);
 value = css ? css[style] : null;
 }
 if (style == 'opacity') return value ? parseFloat(value) : 1.0;
 return value == 'auto' ? null : value;
 },

 getOpacity: function(element) {
 return $(element).getStyle('opacity');
 },

 setStyle: function(element, styles) {
 element = $(element);
 var elementStyle = element.style, match;
 if (Object.isString(styles)) {
 element.style.cssText += ';' + styles;
 return styles.include('opacity') ?
 element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
 }
 for (var property in styles)
 if (property == 'opacity') element.setOpacity(styles[property]);
 else
 elementStyle[(property == 'float' || property == 'cssFloat') ?
 (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
 property] = styles[property];

 return element;
 },

 setOpacity: function(element, value) {
 element = $(element);
 element.style.opacity = (value == 1 || value === '') ? '' :
 (value < 0.00001) ? 0 : value;
 return element;
 },

 getDimensions: function(element) {
 element = $(element);
 var display = element.getStyle('display');
 if (display != 'none' && display != null) // Safari bug
 return {width: element.offsetWidth, height: element.offsetHeight};

 // All *Width and *Height properties give 0 on elements with display none,
 // so enable the element temporarily
 var els = element.style;
 var originalVisibility = els.visibility;
 var originalPosition = els.position;
 var originalDisplay = els.display;
 els.visibility = 'hidden';
 els.position = 'absolute';
 els.display = 'block';
 var originalWidth = element.clientWidth;
 var originalHeight = element.clientHeight;
 els.display = originalDisplay;
 els.position = originalPosition;
 els.visibility = originalVisibility;
 return {width: originalWidth, height: originalHeight};
 },

 makePositioned: function(element) {
 element = $(element);
 var pos = Element.getStyle(element, 'position');
 if (pos == 'static' || !pos) {
 element._madePositioned = true;
 element.style.position = 'relative';
 // Opera returns the offset relative to the positioning context, when an
 // element is position relative but top and left have not been defined
 if (Prototype.Browser.Opera) {
 element.style.top = 0;
 element.style.left = 0;
 }
 }
 return element;
 },

 undoPositioned: function(element) {
 element = $(element);
 if (element._madePositioned) {
 element._madePositioned = undefined;
 element.style.position =
 element.style.top =
 element.style.left =
 element.style.bottom =
 element.style.right = '';
 }
 return element;
 },

 makeClipping: function(element) {
 element = $(element);
 if (element._overflow) return element;
 element._overflow = Element.getStyle(element, 'overflow') || 'auto';
 if (element._overflow !== 'hidden')
 element.style.overflow = 'hidden';
 return element;
 },

 undoClipping: function(element) {
 element = $(element);
 if (!element._overflow) return element;
 element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
 element._overflow = null;
 return element;
 },

 cumulativeOffset: function(element) {
 var valueT = 0, valueL = 0;
 do {
 valueT += element.offsetTop || 0;
 valueL += element.offsetLeft || 0;
 element = element.offsetParent;
 } while (element);
 return Element._returnOffset(valueL, valueT);
 },

 positionedOffset: function(element) {
 var valueT = 0, valueL = 0;
 do {
 valueT += element.offsetTop || 0;
 valueL += element.offsetLeft || 0;
 element = element.offsetParent;
 if (element) {
 if (element.tagName.toUpperCase() == 'BODY') break;
 var p = Element.getStyle(element, 'position');
 if (p !== 'static') break;
 }
 } while (element);
 return Element._returnOffset(valueL, valueT);
 },

 absolutize: function(element) {
 element = $(element);
 if (element.getStyle('position') == 'absolute') return element;
 // Position.prepare(); // To be done manually by Scripty when it needs it.

 var offsets = element.positionedOffset();
 var top = offsets[1];
 var left = offsets[0];
 var width = element.clientWidth;
 var height = element.clientHeight;

 element._originalLeft = left - parseFloat(element.style.left || 0);
 element._originalTop = top - parseFloat(element.style.top || 0);
 element._originalWidth = element.style.width;
 element._originalHeight = element.style.height;

 element.style.position = 'absolute';
 element.style.top = top + 'px';
 element.style.left = left + 'px';
 element.style.width = width + 'px';
 element.style.height = height + 'px';
 return element;
 },

 relativize: function(element) {
 element = $(element);
 if (element.getStyle('position') == 'relative') return element;
 // Position.prepare(); // To be done manually by Scripty when it needs it.

 element.style.position = 'relative';
 var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);
 var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

 element.style.top = top + 'px';
 element.style.left = left + 'px';
 element.style.height = element._originalHeight;
 element.style.width = element._originalWidth;
 return element;
 },

 cumulativeScrollOffset: function(element) {
 var valueT = 0, valueL = 0;
 do {
 valueT += element.scrollTop || 0;
 valueL += element.scrollLeft || 0;
 element = element.parentNode;
 } while (element);
 return Element._returnOffset(valueL, valueT);
 },

 getOffsetParent: function(element) {
 if (element.offsetParent) return $(element.offsetParent);
 if (element == document.body) return $(element);

 while ((element = element.parentNode) && element != document.body)
 if (Element.getStyle(element, 'position') != 'static')
 return $(element);

 return $(document.body);
 },

 viewportOffset: function(forElement) {
 var valueT = 0, valueL = 0;

 var element = forElement;
 do {
 valueT += element.offsetTop || 0;
 valueL += element.offsetLeft || 0;

 // Safari fix
 if (element.offsetParent == document.body &&
 Element.getStyle(element, 'position') == 'absolute') break;

 } while (element = element.offsetParent);

 element = forElement;
 do {
 if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) {
 valueT -= element.scrollTop || 0;
 valueL -= element.scrollLeft || 0;
 }
 } while (element = element.parentNode);

 return Element._returnOffset(valueL, valueT);
 },

 clonePosition: function(element, source) {
 var options = Object.extend({
 setLeft: true,
 setTop: true,
 setWidth: true,
 setHeight: true,
 offsetTop: 0,
 offsetLeft: 0
 }, arguments[2] || { });

 // find page position of source
 source = $(source);
 var p = source.viewportOffset();

 // find coordinate system to use
 element = $(element);
 var delta = [0, 0];
 var parent = null;
 // delta [0,0] will do fine with position: fixed elements,
 // position:absolute needs offsetParent deltas
 if (Element.getStyle(element, 'position') == 'absolute') {
 parent = element.getOffsetParent();
 delta = parent.viewportOffset();
 }

 // correct by body offsets (fixes Safari)
 if (parent == document.body) {
 delta[0] -= document.body.offsetLeft;
 delta[1] -= document.body.offsetTop;
 }

 // set position
 if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
 if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
 if (options.setWidth) element.style.width = source.offsetWidth + 'px';
 if (options.setHeight) element.style.height = source.offsetHeight + 'px';
 return element;
 }
};

Element.Methods.identify.counter = 1;

Object.extend(Element.Methods, {
 getElementsBySelector: Element.Methods.select,
 childElements: Element.Methods.immediateDescendants
});

Element._attributeTranslations = {
 write: {
 names: {
 className: 'class',
 htmlFor: 'for'
 },
 values: { }
 }
};

if (Prototype.Browser.Opera) {
 Element.Methods.getStyle = Element.Methods.getStyle.wrap(
 function(proceed, element, style) {
 switch (style) {
 case 'left': case 'top': case 'right': case 'bottom':
 if (proceed(element, 'position') === 'static') return null;
 case 'height': case 'width':
 // returns '0px' for hidden elements; we want it to return null
 if (!Element.visible(element)) return null;

 // returns the border-box dimensions rather than the content-box
 // dimensions, so we subtract padding and borders from the value
 var dim = parseInt(proceed(element, style), 10);

 if (dim !== element['offset' + style.capitalize()])
 return dim + 'px';

 var properties;
 if (style === 'height') {
 properties = ['border-top-width', 'padding-top',
 'padding-bottom', 'border-bottom-width'];
 }
 else {
 properties = ['border-left-width', 'padding-left',
 'padding-right', 'border-right-width'];
 }
 return properties.inject(dim, function(memo, property) {
 var val = proceed(element, property);
 return val === null ? memo : memo - parseInt(val, 10);
 }) + 'px';
 default: return proceed(element, style);
 }
 }
 );

 Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
 function(proceed, element, attribute) {
 if (attribute === 'title') return element.title;
 return proceed(element, attribute);
 }
 );
}

else if (Prototype.Browser.IE) {
 // IE doesn't report offsets correctly for static elements, so we change them
 // to "relative" to get the values, then change them back.
 Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
 function(proceed, element) {
 element = $(element);
 // IE throws an error if element is not in document
 try { element.offsetParent }
 catch(e) { return $(document.body) }
 var position = element.getStyle('position');
 if (position !== 'static') return proceed(element);
 element.setStyle({ position: 'relative' });
 var value = proceed(element);
 element.setStyle({ position: position });
 return value;
 }
 );

 $w('positionedOffset viewportOffset').each(function(method) {
 Element.Methods[method] = Element.Methods[method].wrap(
 function(proceed, element) {
 element = $(element);
 try { element.offsetParent }
 catch(e) { return Element._returnOffset(0,0) }
 var position = element.getStyle('position');
 if (position !== 'static') return proceed(element);
 // Trigger hasLayout on the offset parent so that IE6 reports
 // accurate offsetTop and offsetLeft values for position: fixed.
 var offsetParent = element.getOffsetParent();
 if (offsetParent && offsetParent.getStyle('position') === 'fixed')
 offsetParent.setStyle({ zoom: 1 });
 element.setStyle({ position: 'relative' });
 var value = proceed(element);
 element.setStyle({ position: position });
 return value;
 }
 );
 });

 Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap(
 function(proceed, element) {
 try { element.offsetParent }
 catch(e) { return Element._returnOffset(0,0) }
 return proceed(element);
 }
 );

 Element.Methods.getStyle = function(element, style) {
 element = $(element);
 style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
 var value = element.style[style];
 if (!value && element.currentStyle) value = element.currentStyle[style];

 if (style == 'opacity') {
 if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
 if (value[1]) return parseFloat(value[1]) / 100;
 return 1.0;
 }

 if (value == 'auto') {
 if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
 return element['offset' + style.capitalize()] + 'px';
 return null;
 }
 return value;
 };

 Element.Methods.setOpacity = function(element, value) {
 function stripAlpha(filter){
 return filter.replace(/alpha\([^\)]*\)/gi,'');
 }
 element = $(element);
 var currentStyle = element.currentStyle;
 if ((currentStyle && !currentStyle.hasLayout) ||
 (!currentStyle && element.style.zoom == 'normal'))
 element.style.zoom = 1;

 var filter = element.getStyle('filter'), style = element.style;
 if (value == 1 || value === '') {
 (filter = stripAlpha(filter)) ?
 style.filter = filter : style.removeAttribute('filter');
 return element;
 } else if (value < 0.00001) value = 0;
 style.filter = stripAlpha(filter) +
 'alpha(opacity=' + (value * 100) + ')';
 return element;
 };

 Element._attributeTranslations = {
 read: {
 names: {
 'class': 'className',
 'for': 'htmlFor'
 },
 values: {
 _getAttr: function(element, attribute) {
 return element.getAttribute(attribute, 2);
 },
 _getAttrNode: function(element, attribute) {
 var node = element.getAttributeNode(attribute);
 return node ? node.value : "";
 },
 _getEv: function(element, attribute) {
 attribute = element.getAttribute(attribute);
 return attribute ? attribute.toString().slice(23, -2) : null;
 },
 _flag: function(element, attribute) {
 return $(element).hasAttribute(attribute) ? attribute : null;
 },
 style: function(element) {
 return element.style.cssText.toLowerCase();
 },
 title: function(element) {
 return element.title;
 }
 }
 }
 };

 Element._attributeTranslations.write = {
 names: Object.extend({
 cellpadding: 'cellPadding',
 cellspacing: 'cellSpacing'
 }, Element._attributeTranslations.read.names),
 values: {
 checked: function(element, value) {
 element.checked = !!value;
 },

 style: function(element, value) {
 element.style.cssText = value ? value : '';
 }
 }
 };

 Element._attributeTranslations.has = {};

 $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
 'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
 Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
 Element._attributeTranslations.has[attr.toLowerCase()] = attr;
 });

 (function(v) {
 Object.extend(v, {
 href: v._getAttr,
 src: v._getAttr,
 type: v._getAttr,
 action: v._getAttrNode,
 disabled: v._flag,
 checked: v._flag,
 readonly: v._flag,
 multiple: v._flag,
 onload: v._getEv,
 onunload: v._getEv,
 onclick: v._getEv,
 ondblclick: v._getEv,
 onmousedown: v._getEv,
 onmouseup: v._getEv,
 onmouseover: v._getEv,
 onmousemove: v._getEv,
 onmouseout: v._getEv,
 onfocus: v._getEv,
 onblur: v._getEv,
 onkeypress: v._getEv,
 onkeydown: v._getEv,
 onkeyup: v._getEv,
 onsubmit: v._getEv,
 onreset: v._getEv,
 onselect: v._getEv,
 onchange: v._getEv
 });
 })(Element._attributeTranslations.read.values);
}

else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
 Element.Methods.setOpacity = function(element, value) {
 element = $(element);
 element.style.opacity = (value == 1) ? 0.999999 :
 (value === '') ? '' : (value < 0.00001) ? 0 : value;
 return element;
 };
}

else if (Prototype.Browser.WebKit) {
 Element.Methods.setOpacity = function(element, value) {
 element = $(element);
 element.style.opacity = (value == 1 || value === '') ? '' :
 (value < 0.00001) ? 0 : value;

 if (value == 1)
 if(element.tagName.toUpperCase() == 'IMG' && element.width) {
 element.width++; element.width--;
 } else try {
 var n = document.createTextNode(' ');
 element.appendChild(n);
 element.removeChild(n);
 } catch (e) { }

 return element;
 };

 // Safari returns margins on body which is incorrect if the child is absolutely
 // positioned. For performance reasons, redefine Element#cumulativeOffset for
 // KHTML/WebKit only.
 Element.Methods.cumulativeOffset = function(element) {
 var valueT = 0, valueL = 0;
 do {
 valueT += element.offsetTop || 0;
 valueL += element.offsetLeft || 0;
 if (element.offsetParent == document.body)
 if (Element.getStyle(element, 'position') == 'absolute') break;

 element = element.offsetParent;
 } while (element);

 return Element._returnOffset(valueL, valueT);
 };
}

if (Prototype.Browser.IE || Prototype.Browser.Opera) {
 // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
 Element.Methods.update = function(element, content) {
 element = $(element);

 if (content && content.toElement) content = content.toElement();
 if (Object.isElement(content)) return element.update().insert(content);

 content = Object.toHTML(content);
 var tagName = element.tagName.toUpperCase();

 if (tagName in Element._insertionTranslations.tags) {
 $A(element.childNodes).each(function(node) { element.removeChild(node) });
 Element._getContentFromAnonymousElement(tagName, content.stripScripts())
 .each(function(node) { element.appendChild(node) });
 }
 else element.innerHTML = content.stripScripts();

 content.evalScripts.bind(content).defer();
 return element;
 };
}

if ('outerHTML' in document.createElement('div')) {
 Element.Methods.replace = function(element, content) {
 element = $(element);

 if (content && content.toElement) content = content.toElement();
 if (Object.isElement(content)) {
 element.parentNode.replaceChild(content, element);
 return element;
 }

 content = Object.toHTML(content);
 var parent = element.parentNode, tagName = parent.tagName.toUpperCase();

 if (Element._insertionTranslations.tags[tagName]) {
 var nextSibling = element.next();
 var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
 parent.removeChild(element);
 if (nextSibling)
 fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
 else
 fragments.each(function(node) { parent.appendChild(node) });
 }
 else element.outerHTML = content.stripScripts();

 content.evalScripts.bind(content).defer();
 return element;
 };
}

Element._returnOffset = function(l, t) {
 var result = [l, t];
 result.left = l;
 result.top = t;
 return result;
};

Element._getContentFromAnonymousElement = function(tagName, html) {
 var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
 if (t) {
 div.innerHTML = t[0] + html + t[1];
 t[2].times(function() { div = div.firstChild });
 } else div.innerHTML = html;
 return $A(div.childNodes);
};

Element._insertionTranslations = {
 before: function(element, node) {
 element.parentNode.insertBefore(node, element);
 },
 top: function(element, node) {
 element.insertBefore(node, element.firstChild);
 },
 bottom: function(element, node) {
 element.appendChild(node);
 },
 after: function(element, node) {
 element.parentNode.insertBefore(node, element.nextSibling);
 },
 tags: {
 TABLE: ['<table>', '</table>', 1],
 TBODY: ['<table><tbody>', '</tbody></table>', 2],
 TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3],
 TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
 SELECT: ['<select>', '</select>', 1]
 }
};

(function() {
 Object.extend(this.tags, {
 THEAD: this.tags.TBODY,
 TFOOT: this.tags.TBODY,
 TH: this.tags.TD
 });
}).call(Element._insertionTranslations);

Element.Methods.Simulated = {
 hasAttribute: function(element, attribute) {
 attribute = Element._attributeTranslations.has[attribute] || attribute;
 var node = $(element).getAttributeNode(attribute);
 return !!(node && node.specified);
 }
};

Element.Methods.ByTag = { };

Object.extend(Element, Element.Methods);

if (!Prototype.BrowserFeatures.ElementExtensions &&
 document.createElement('div')['__proto__']) {
 window.HTMLElement = { };
 window.HTMLElement.prototype = document.createElement('div')['__proto__'];
 Prototype.BrowserFeatures.ElementExtensions = true;
}

Element.extend = (function() {
 if (Prototype.BrowserFeatures.SpecificElementExtensions)
 return Prototype.K;

 var Methods = { }, ByTag = Element.Methods.ByTag;

 var extend = Object.extend(function(element) {
 if (!element || element._extendedByPrototype ||
 element.nodeType != 1 || element == window) return element;

 var methods = Object.clone(Methods),
 tagName = element.tagName.toUpperCase(), property, value;

 // extend methods for specific tags
 if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);

 for (property in methods) {
 value = methods[property];
 if (Object.isFunction(value) && !(property in element))
 element[property] = value.methodize();
 }

 element._extendedByPrototype = Prototype.emptyFunction;
 return element;

 }, {
 refresh: function() {
 // extend methods for all tags (Safari doesn't need this)
 if (!Prototype.BrowserFeatures.ElementExtensions) {
 Object.extend(Methods, Element.Methods);
 Object.extend(Methods, Element.Methods.Simulated);
 }
 }
 });

 extend.refresh();
 return extend;
})();

Element.hasAttribute = function(element, attribute) {
 if (element.hasAttribute) return element.hasAttribute(attribute);
 return Element.Methods.Simulated.hasAttribute(element, attribute);
};

Element.addMethods = function(methods) {
 var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;

 if (!methods) {
 Object.extend(Form, Form.Methods);
 Object.extend(Form.Element, Form.Element.Methods);
 Object.extend(Element.Methods.ByTag, {
 "FORM": Object.clone(Form.Methods),
 "INPUT": Object.clone(Form.Element.Methods),
 "SELECT": Object.clone(Form.Element.Methods),
 "TEXTAREA": Object.clone(Form.Element.Methods)
 });
 }

 if (arguments.length == 2) {
 var tagName = methods;
 methods = arguments[1];
 }

 if (!tagName) Object.extend(Element.Methods, methods || { });
 else {
 if (Object.isArray(tagName)) tagName.each(extend);
 else extend(tagName);
 }

 function extend(tagName) {
 tagName = tagName.toUpperCase();
 if (!Element.Methods.ByTag[tagName])
 Element.Methods.ByTag[tagName] = { };
 Object.extend(Element.Methods.ByTag[tagName], methods);
 }

 function copy(methods, destination, onlyIfAbsent) {
 onlyIfAbsent = onlyIfAbsent || false;
 for (var property in methods) {
 var value = methods[property];
 if (!Object.isFunction(value)) continue;
 if (!onlyIfAbsent || !(property in destination))
 destination[property] = value.methodize();
 }
 }

 function findDOMClass(tagName) {
 var klass;
 var trans = {
 "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
 "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
 "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
 "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
 "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
 "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
 "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
 "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
 "FrameSet", "IFRAME": "IFrame"
 };
 if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
 if (window[klass]) return window[klass];
 klass = 'HTML' + tagName + 'Element';
 if (window[klass]) return window[klass];
 klass = 'HTML' + tagName.capitalize() + 'Element';
 if (window[klass]) return window[klass];

 window[klass] = { };
 window[klass].prototype = document.createElement(tagName)['__proto__'];
 return window[klass];
 }

 if (F.ElementExtensions) {
 copy(Element.Methods, HTMLElement.prototype);
 copy(Element.Methods.Simulated, HTMLElement.prototype, true);
 }

 if (F.SpecificElementExtensions) {
 for (var tag in Element.Methods.ByTag) {
 var klass = findDOMClass(tag);
 if (Object.isUndefined(klass)) continue;
 copy(T[tag], klass.prototype);
 }
 }

 Object.extend(Element, Element.Methods);
 delete Element.ByTag;

 if (Element.extend.refresh) Element.extend.refresh();
 Element.cache = { };
};

document.viewport = {
 getDimensions: function() {
 var dimensions = { }, B = Prototype.Browser;
 $w('width height').each(function(d) {
 var D = d.capitalize();
 if (B.WebKit && !document.evaluate) {
 // Safari <3.0 needs self.innerWidth/Height
 dimensions[d] = self['inner' + D];
 } else if (B.Opera && parseFloat(window.opera.version()) < 9.5) {
 // Opera <9.5 needs document.body.clientWidth/Height
 dimensions[d] = document.body['client' + D]
 } else {
 dimensions[d] = document.documentElement['client' + D];
 }
 });
 return dimensions;
 },

 getWidth: function() {
 return this.getDimensions().width;
 },

 getHeight: function() {
 return this.getDimensions().height;
 },

 getScrollOffsets: function() {
 return Element._returnOffset(
 window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
 window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
 }
};
/* Portions of the Selector class are derived from Jack Slocum's DomQuery,
 * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
 * license. Please see http://www.yui-ext.com/ for more information. */

var Selector = Class.create({
 initialize: function(expression) {
 this.expression = expression.strip();

 if (this.shouldUseSelectorsAPI()) {
 this.mode = 'selectorsAPI';
 } else if (this.shouldUseXPath()) {
 this.mode = 'xpath';
 this.compileXPathMatcher();
 } else {
 this.mode = "normal";
 this.compileMatcher();
 }

 },

 shouldUseXPath: function() {
 if (!Prototype.BrowserFeatures.XPath) return false;

 var e = this.expression;

 // Safari 3 chokes on :*-of-type and :empty
 if (Prototype.Browser.WebKit &&
 (e.include("-of-type") || e.include(":empty")))
 return false;

 // XPath can't do namespaced attributes, nor can it read
 // the "checked" property from DOM nodes
 if ((/(\[[\w-]*?:|:checked)/).test(e))
 return false;

 return true;
 },

 shouldUseSelectorsAPI: function() {
 if (!Prototype.BrowserFeatures.SelectorsAPI) return false;

 if (!Selector._div) Selector._div = new Element('div');

 // Make sure the browser treats the selector as valid. Test on an
 // isolated element to minimize cost of this check.
 try {
 Selector._div.querySelector(this.expression);
 } catch(e) {
 return false;
 }

 return true;
 },

 compileMatcher: function() {
 var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
 c = Selector.criteria, le, p, m;

 if (Selector._cache[e]) {
 this.matcher = Selector._cache[e];
 return;
 }

 this.matcher = ["this.matcher = function(root) {",
 "var r = root, h = Selector.handlers, c = false, n;"];

 while (e && le != e && (/\S/).test(e)) {
 le = e;
 for (var i in ps) {
 p = ps[i];
 if (m = e.match(p)) {
 this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
 new Template(c[i]).evaluate(m));
 e = e.replace(m[0], '');
 break;
 }
 }
 }

 this.matcher.push("return h.unique(n);\n}");
 eval(this.matcher.join('\n'));
 Selector._cache[this.expression] = this.matcher;
 },

 compileXPathMatcher: function() {
 var e = this.expression, ps = Selector.patterns,
 x = Selector.xpath, le, m;

 if (Selector._cache[e]) {
 this.xpath = Selector._cache[e]; return;
 }

 this.matcher = ['.//*'];
 while (e && le != e && (/\S/).test(e)) {
 le = e;
 for (var i in ps) {
 if (m = e.match(ps[i])) {
 this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
 new Template(x[i]).evaluate(m));
 e = e.replace(m[0], '');
 break;
 }
 }
 }

 this.xpath = this.matcher.join('');
 Selector._cache[this.expression] = this.xpath;
 },

 findElements: function(root) {
 root = root || document;
 var e = this.expression, results;

 switch (this.mode) {
 case 'selectorsAPI':
 // querySelectorAll queries document-wide, then filters to descendants
 // of the context element. That's not what we want.
 // Add an explicit context to the selector if necessary.
 if (root !== document) {
 var oldId = root.id, id = $(root).identify();
 e = "#" + id + " " + e;
 }

 results = $A(root.querySelectorAll(e)).map(Element.extend);
 root.id = oldId;

 return results;
 case 'xpath':
 return document._getElementsByXPath(this.xpath, root);
 default:
 return this.matcher(root);
 }
 },

 match: function(element) {
 this.tokens = [];

 var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
 var le, p, m;

 while (e && le !== e && (/\S/).test(e)) {
 le = e;
 for (var i in ps) {
 p = ps[i];
 if (m = e.match(p)) {
 // use the Selector.assertions methods unless the selector
 // is too complex.
 if (as[i]) {
 this.tokens.push([i, Object.clone(m)]);
 e = e.replace(m[0], '');
 } else {
 // reluctantly do a document-wide search
 // and look for a match in the array
 return this.findElements(document).include(element);
 }
 }
 }
 }

 var match = true, name, matches;
 for (var i = 0, token; token = this.tokens[i]; i++) {
 name = token[0], matches = token[1];
 if (!Selector.assertions[name](element, matches)) {
 match = false; break;
 }
 }

 return match;
 },

 toString: function() {
 return this.expression;
 },

 inspect: function() {
 return "#<Selector:" + this.expression.inspect() + ">";
 }
});

Object.extend(Selector, {
 _cache: { },

 xpath: {
 descendant: "//*",
 child: "/*",
 adjacent: "/following-sibling::*[1]",
 laterSibling: '/following-sibling::*',
 tagName: function(m) {
 if (m[1] == '*') return '';
 return "[local-name()='" + m[1].toLowerCase() +
 "' or local-name()='" + m[1].toUpperCase() + "']";
 },
 className: "[contains(concat(' ', @class, ' '), ' #{1} ')]",
 id: "[@id='#{1}']",
 attrPresence: function(m) {
 m[1] = m[1].toLowerCase();
 return new Template("[@#{1}]").evaluate(m);
 },
 attr: function(m) {
 m[1] = m[1].toLowerCase();
 m[3] = m[5] || m[6];
 return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
 },
 pseudo: function(m) {
 var h = Selector.xpath.pseudos[m[1]];
 if (!h) return '';
 if (Object.isFunction(h)) return h(m);
 return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
 },
 operators: {
 '=': "[@#{1}='#{3}']",
 '!=': "[@#{1}!='#{3}']",
 '^=': "[starts-with(@#{1}, '#{3}')]",
 '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
 '*=': "[contains(@#{1}, '#{3}')]",
 '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
 '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
 },
 pseudos: {
 'first-child': '[not(preceding-sibling::*)]',
 'last-child': '[not(following-sibling::*)]',
 'only-child': '[not(preceding-sibling::* or following-sibling::*)]',
 'empty': "[count(*) = 0 and (count(text()) = 0)]",
 'checked': "[@checked]",
 'disabled': "[(@disabled) and (@type!='hidden')]",
 'enabled': "[not(@disabled) and (@type!='hidden')]",
 'not': function(m) {
 var e = m[6], p = Selector.patterns,
 x = Selector.xpath, le, v;

 var exclusion = [];
 while (e && le != e && (/\S/).test(e)) {
 le = e;
 for (var i in p) {
 if (m = e.match(p[i])) {
 v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
 exclusion.push("(" + v.substring(1, v.length - 1) + ")");
 e = e.replace(m[0], '');
 break;
 }
 }
 }
 return "[not(" + exclusion.join(" and ") + ")]";
 },
 'nth-child': function(m) {
 return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
 },
 'nth-last-child': function(m) {
 return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
 },
 'nth-of-type': function(m) {
 return Selector.xpath.pseudos.nth("position() ", m);
 },
 'nth-last-of-type': function(m) {
 return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
 },
 'first-of-type': function(m) {
 m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
 },
 'last-of-type': function(m) {
 m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
 },
 'only-of-type': function(m) {
 var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
 },
 nth: function(fragment, m) {
 var mm, formula = m[6], predicate;
 if (formula == 'even') formula = '2n+0';
 if (formula == 'odd') formula = '2n+1';
 if (mm = formula.match(/^(\d+)$/)) // digit only
 return '[' + fragment + "= " + mm[1] + ']';
 if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
 if (mm[1] == "-") mm[1] = -1;
 var a = mm[1] ? Number(mm[1]) : 1;
 var b = mm[2] ? Number(mm[2]) : 0;
 predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
 "((#{fragment} - #{b}) div #{a} >= 0)]";
 return new Template(predicate).evaluate({
 fragment: fragment, a: a, b: b });
 }
 }
 }
 },

 criteria: {
 tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;',
 className: 'n = h.className(n, r, "#{1}", c); c = false;',
 id: 'n = h.id(n, r, "#{1}", c); c = false;',
 attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
 attr: function(m) {
 m[3] = (m[5] || m[6]);
 return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);
 },
 pseudo: function(m) {
 if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
 return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
 },
 descendant: 'c = "descendant";',
 child: 'c = "child";',
 adjacent: 'c = "adjacent";',
 laterSibling: 'c = "laterSibling";'
 },

 patterns: {
 // combinators must be listed first
 // (and descendant needs to be last combinator)
 laterSibling: /^\s*~\s*/,
 child: /^\s*>\s*/,
 adjacent: /^\s*\+\s*/,
 descendant: /^\s/,

 // selectors follow
 tagName: /^\s*(\*|[\w\-]+)(\b|$)?/,
 id: /^#([\w\-\*]+)(\b|$)/,
 className: /^\.([\w\-\*]+)(\b|$)/,
 pseudo:
/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
 attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/,
 attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
 },

 // for Selector.match and Element#match
 assertions: {
 tagName: function(element, matches) {
 return matches[1].toUpperCase() == element.tagName.toUpperCase();
 },

 className: function(element, matches) {
 return Element.hasClassName(element, matches[1]);
 },

 id: function(element, matches) {
 return element.id === matches[1];
 },

 attrPresence: function(element, matches) {
 return Element.hasAttribute(element, matches[1]);
 },

 attr: function(element, matches) {
 var nodeValue = Element.readAttribute(element, matches[1]);
 return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]);
 }
 },

 handlers: {
 // UTILITY FUNCTIONS
 // joins two collections
 concat: function(a, b) {
 for (var i = 0, node; node = b[i]; i++)
 a.push(node);
 return a;
 },

 // marks an array of nodes for counting
 mark: function(nodes) {
 var _true = Prototype.emptyFunction;
 for (var i = 0, node; node = nodes[i]; i++)
 node._countedByPrototype = _true;
 return nodes;
 },

 unmark: function(nodes) {
 for (var i = 0, node; node = nodes[i]; i++)
 node._countedByPrototype = undefined;
 return nodes;
 },

 // mark each child node with its position (for nth calls)
 // "ofType" flag indicates whether we're indexing for nth-of-type
 // rather than nth-child
 index: function(parentNode, reverse, ofType) {
 parentNode._countedByPrototype = Prototype.emptyFunction;
 if (reverse) {
 for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
 var node = nodes[i];
 if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
 }
 } else {
 for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
 if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
 }
 },

 // filters out duplicates and extends all nodes
 unique: function(nodes) {
 if (nodes.length == 0) return nodes;
 var results = [], n;
 for (var i = 0, l = nodes.length; i < l; i++)
 if (!(n = nodes[i])._countedByPrototype) {
 n._countedByPrototype = Prototype.emptyFunction;
 results.push(Element.extend(n));
 }
 return Selector.handlers.unmark(results);
 },

 // COMBINATOR FUNCTIONS
 descendant: function(nodes) {
 var h = Selector.handlers;
 for (var i = 0, results = [], node; node = nodes[i]; i++)
 h.concat(results, node.getElementsByTagName('*'));
 return results;
 },

 child: function(nodes) {
 var h = Selector.handlers;
 for (var i = 0, results = [], node; node = nodes[i]; i++) {
 for (var j = 0, child; child = node.childNodes[j]; j++)
 if (child.nodeType == 1 && child.tagName != '!') results.push(child);
 }
 return results;
 },

 adjacent: function(nodes) {
 for (var i = 0, results = [], node; node = nodes[i]; i++) {
 var next = this.nextElementSibling(node);
 if (next) results.push(next);
 }
 return results;
 },

 laterSibling: function(nodes) {
 var h = Selector.handlers;
 for (var i = 0, results = [], node; node = nodes[i]; i++)
 h.concat(results, Element.nextSiblings(node));
 return results;
 },

 nextElementSibling: function(node) {
 while (node = node.nextSibling)
 if (node.nodeType == 1) return node;
 return null;
 },

 previousElementSibling: function(node) {
 while (node = node.previousSibling)
 if (node.nodeType == 1) return node;
 return null;
 },

 // TOKEN FUNCTIONS
 tagName: function(nodes, root, tagName, combinator) {
 var uTagName = tagName.toUpperCase();
 var results = [], h = Selector.handlers;
 if (nodes) {
 if (combinator) {
 // fastlane for ordinary descendant combinators
 if (combinator == "descendant") {
 for (var i = 0, node; node = nodes[i]; i++)
 h.concat(results, node.getElementsByTagName(tagName));
 return results;
 } else nodes = this[combinator](nodes);
 if (tagName == "*") return nodes;
 }
 for (var i = 0, node; node = nodes[i]; i++)
 if (node.tagName.toUpperCase() === uTagName) results.push(node);
 return results;
 } else return root.getElementsByTagName(tagName);
 },

 id: function(nodes, root, id, combinator) {
 var targetNode = $(id), h = Selector.handlers;
 if (!targetNode) return [];
 if (!nodes && root == document) return [targetNode];
 if (nodes) {
 if (combinator) {
 if (combinator == 'child') {
 for (var i = 0, node; node = nodes[i]; i++)
 if (targetNode.parentNode == node) return [targetNode];
 } else if (combinator == 'descendant') {
 for (var i = 0, node; node = nodes[i]; i++)
 if (Element.descendantOf(targetNode, node)) return [targetNode];
 } else if (combinator == 'adjacent') {
 for (var i = 0, node; node = nodes[i]; i++)
 if (Selector.handlers.previousElementSibling(targetNode) == node)
 return [targetNode];
 } else nodes = h[combinator](nodes);
 }
 for (var i = 0, node; node = nodes[i]; i++)
 if (node == targetNode) return [targetNode];
 return [];
 }
 return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
 },

 className: function(nodes, root, className, combinator) {
 if (nodes && combinator) nodes = this[combinator](nodes);
 return Selector.handlers.byClassName(nodes, root, className);
 },

 byClassName: function(nodes, root, className) {
 if (!nodes) nodes = Selector.handlers.descendant([root]);
 var needle = ' ' + className + ' ';
 for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
 nodeClassName = node.className;
 if (nodeClassName.length == 0) continue;
 if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
 results.push(node);
 }
 return results;
 },

 attrPresence: function(nodes, root, attr, combinator) {
 if (!nodes) nodes = root.getElementsByTagName("*");
 if (nodes && combinator) nodes = this[combinator](nodes);
 var results = [];
 for (var i = 0, node; node = nodes[i]; i++)
 if (Element.hasAttribute(node, attr)) results.push(node);
 return results;
 },

 attr: function(nodes, root, attr, value, operator, combinator) {
 if (!nodes) nodes = root.getElementsByTagName("*");
 if (nodes && combinator) nodes = this[combinator](nodes);
 var handler = Selector.operators[operator], results = [];
 for (var i = 0, node; node = nodes[i]; i++) {
 var nodeValue = Element.readAttribute(node, attr);
 if (nodeValue === null) continue;
 if (handler(nodeValue, value)) results.push(node);
 }
 return results;
 },

 pseudo: function(nodes, name, value, root, combinator) {
 if (nodes && combinator) nodes = this[combinator](nodes);
 if (!nodes) nodes = root.getElementsByTagName("*");
 return Selector.pseudos[name](nodes, value, root);
 }
 },

 pseudos: {
 'first-child': function(nodes, value, root) {
 for (var i = 0, results = [], node; node = nodes[i]; i++) {
 if (Selector.handlers.previousElementSibling(node)) continue;
 results.push(node);
 }
 return results;
 },
 'last-child': function(nodes, value, root) {
 for (var i = 0, results = [], node; node = nodes[i]; i++) {
 if (Selector.handlers.nextElementSibling(node)) continue;
 results.push(node);
 }
 return results;
 },
 'only-child': function(nodes, value, root) {
 var h = Selector.handlers;
 for (var i = 0, results = [], node; node = nodes[i]; i++)
 if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
 results.push(node);
 return results;
 },
 'nth-child': function(nodes, formula, root) {
 return Selector.pseudos.nth(nodes, formula, root);
 },
 'nth-last-child': function(nodes, formula, root) {
 return Selector.pseudos.nth(nodes, formula, root, true);
 },
 'nth-of-type': function(nodes, formula, root) {
 return Selector.pseudos.nth(nodes, formula, root, false, true);
 },
 'nth-last-of-type': function(nodes, formula, root) {
 return Selector.pseudos.nth(nodes, formula, root, true, true);
 },
 'first-of-type': function(nodes, formula, root) {
 return Selector.pseudos.nth(nodes, "1", root, false, true);
 },
 'last-of-type': function(nodes, formula, root) {
 return Selector.pseudos.nth(nodes, "1", root, true, true);
 },
 'only-of-type': function(nodes, formula, root) {
 var p = Selector.pseudos;
 return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
 },

 // handles the an+b logic
 getIndices: function(a, b, total) {
 if (a == 0) return b > 0 ? [b] : [];
 return $R(1, total).inject([], function(memo, i) {
 if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
 return memo;
 });
 },

 // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
 nth: function(nodes, formula, root, reverse, ofType) {
 if (nodes.length == 0) return [];
 if (formula == 'even') formula = '2n+0';
 if (formula == 'odd') formula = '2n+1';
 var h = Selector.handlers, results = [], indexed = [], m;
 h.mark(nodes);
 for (var i = 0, node; node = nodes[i]; i++) {
 if (!node.parentNode._countedByPrototype) {
 h.index(node.parentNode, reverse, ofType);
 indexed.push(node.parentNode);
 }
 }
 if (formula.match(/^\d+$/)) { // just a number
 formula = Number(formula);
 for (var i = 0, node; node = nodes[i]; i++)
 if (node.nodeIndex == formula) results.push(node);
 } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
 if (m[1] == "-") m[1] = -1;
 var a = m[1] ? Number(m[1]) : 1;
 var b = m[2] ? Number(m[2]) : 0;
 var indices = Selector.pseudos.getIndices(a, b, nodes.length);
 for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
 for (var j = 0; j < l; j++)
 if (node.nodeIndex == indices[j]) results.push(node);
 }
 }
 h.unmark(nodes);
 h.unmark(indexed);
 return results;
 },

 'empty': function(nodes, value, root) {
 for (var i = 0, results = [], node; node = nodes[i]; i++) {
 // IE treats comments as element nodes
 if (node.tagName == '!' || node.firstChild) continue;
 results.push(node);
 }
 return results;
 },

 'not': function(nodes, selector, root) {
 var h = Selector.handlers, selectorType, m;
 var exclusions = new Selector(selector).findElements(root);
 h.mark(exclusions);
 for (var i = 0, results = [], node; node = nodes[i]; i++)
 if (!node._countedByPrototype) results.push(node);
 h.unmark(exclusions);
 return results;
 },

 'enabled': function(nodes, value, root) {
 for (var i = 0, results = [], node; node = nodes[i]; i++)
 if (!node.disabled && (!node.type || node.type !== 'hidden'))
 results.push(node);
 return results;
 },

 'disabled': function(nodes, value, root) {
 for (var i = 0, results = [], node; node = nodes[i]; i++)
 if (node.disabled) results.push(node);
 return results;
 },

 'checked': function(nodes, value, root) {
 for (var i = 0, results = [], node; node = nodes[i]; i++)
 if (node.checked) results.push(node);
 return results;
 }
 },

 operators: {
 '=': function(nv, v) { return nv == v; },
 '!=': function(nv, v) { return nv != v; },
 '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); },
 '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); },
 '*=': function(nv, v) { return nv == v || nv && nv.include(v); },
 '$=': function(nv, v) { return nv.endsWith(v); },
 '*=': function(nv, v) { return nv.include(v); },
 '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
 '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() +
 '-').include('-' + (v || "").toUpperCase() + '-'); }
 },

 split: function(expression) {
 var expressions = [];
 expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
 expressions.push(m[1].strip());
 });
 return expressions;
 },

 matchElements: function(elements, expression) {
 var matches = $$(expression), h = Selector.handlers;
 h.mark(matches);
 for (var i = 0, results = [], element; element = elements[i]; i++)
 if (element._countedByPrototype) results.push(element);
 h.unmark(matches);
 return results;
 },

 findElement: function(elements, expression, index) {
 if (Object.isNumber(expression)) {
 index = expression; expression = false;
 }
 return Selector.matchElements(elements, expression || '*')[index || 0];
 },

 findChildElements: function(element, expressions) {
 expressions = Selector.split(expressions.join(','));
 var results = [], h = Selector.handlers;
 for (var i = 0, l = expressions.length, selector; i < l; i++) {
 selector = new Selector(expressions[i].strip());
 h.concat(results, selector.findElements(element));
 }
 return (l > 1) ? h.unique(results) : results;
 }
});

if (Prototype.Browser.IE) {
 Object.extend(Selector.handlers, {
 // IE returns comment nodes on getElementsByTagName("*").
 // Filter them out.
 concat: function(a, b) {
 for (var i = 0, node; node = b[i]; i++)
 if (node.tagName !== "!") a.push(node);
 return a;
 },

 // IE improperly serializes _countedByPrototype in (inner|outer)HTML.
 unmark: function(nodes) {
 for (var i = 0, node; node = nodes[i]; i++)
 node.removeAttribute('_countedByPrototype');
 return nodes;
 }
 });
}

function $$() {
 return Selector.findChildElements(document, $A(arguments));
}
var Form = {
 reset: function(form) {
 $(form).reset();
 return form;
 },

 serializeElements: function(elements, options) {
 if (typeof options != 'object') options = { hash: !!options };
 else if (Object.isUndefined(options.hash)) options.hash = true;
 var key, value, submitted = false, submit = options.submit;

 var data = elements.inject({ }, function(result, element) {
 if (!element.disabled && element.name) {
 key = element.name; value = $(element).getValue();
 if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
 submit !== false && (!submit || key == submit) && (submitted = true)))) {
 if (key in result) {
 // a key is already present; construct an array of values
 if (!Object.isArray(result[key])) result[key] = [result[key]];
 result[key].push(value);
 }
 else result[key] = value;
 }
 }
 return result;
 });

 return options.hash ? data : Object.toQueryString(data);
 }
};

Form.Methods = {
 serialize: function(form, options) {
 return Form.serializeElements(Form.getElements(form), options);
 },

 getElements: function(form) {
 return $A($(form).getElementsByTagName('*')).inject([],
 function(elements, child) {
 if (Form.Element.Serializers[child.tagName.toLowerCase()])
 elements.push(Element.extend(child));
 return elements;
 }
 );
 },

 getInputs: function(form, typeName, name) {
 form = $(form);
 var inputs = form.getElementsByTagName('input');

 if (!typeName && !name) return $A(inputs).map(Element.extend);

 for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
 var input = inputs[i];
 if ((typeName && input.type != typeName) || (name && input.name != name))
 continue;
 matchingInputs.push(Element.extend(input));
 }

 return matchingInputs;
 },

 disable: function(form) {
 form = $(form);
 Form.getElements(form).invoke('disable');
 return form;
 },

 enable: function(form) {
 form = $(form);
 Form.getElements(form).invoke('enable');
 return form;
 },

 findFirstElement: function(form) {
 var elements = $(form).getElements().findAll(function(element) {
 return 'hidden' != element.type && !element.disabled;
 });
 var firstByIndex = elements.findAll(function(element) {
 return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
 }).sortBy(function(element) { return element.tabIndex }).first();

 return firstByIndex ? firstByIndex : elements.find(function(element) {
 return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
 });
 },

 focusFirstElement: function(form) {
 form = $(form);
 form.findFirstElement().activate();
 return form;
 },

 request: function(form, options) {
 form = $(form), options = Object.clone(options || { });

 var params = options.parameters, action = form.readAttribute('action') || '';
 if (action.blank()) action = window.location.href;
 options.parameters = form.serialize(true);

 if (params) {
 if (Object.isString(params)) params = params.toQueryParams();
 Object.extend(options.parameters, params);
 }

 if (form.hasAttribute('method') && !options.method)
 options.method = form.method;

 return new Ajax.Request(action, options);
 }
};

/*--------------------------------------------------------------------------*/

Form.Element = {
 focus: function(element) {
 $(element).focus();
 return element;
 },

 select: function(element) {
 $(element).select();
 return element;
 }
};

Form.Element.Methods = {
 serialize: function(element) {
 element = $(element);
 if (!element.disabled && element.name) {
 var value = element.getValue();
 if (value != undefined) {
 var pair = { };
 pair[element.name] = value;
 return Object.toQueryString(pair);
 }
 }
 return '';
 },

 getValue: function(element) {
 element = $(element);
 var method = element.tagName.toLowerCase();
 return Form.Element.Serializers[method](element);
 },

 setValue: function(element, value) {
 element = $(element);
 var method = element.tagName.toLowerCase();
 Form.Element.Serializers[method](element, value);
 return element;
 },

 clear: function(element) {
 $(element).value = '';
 return element;
 },

 present: function(element) {
 return $(element).value != '';
 },

 activate: function(element) {
 element = $(element);
 try {
 element.focus();
 if (element.select && (element.tagName.toLowerCase() != 'input' ||
 !['button', 'reset', 'submit'].include(element.type)))
 element.select();
 } catch (e) { }
 return element;
 },

 disable: function(element) {
 element = $(element);
 element.disabled = true;
 return element;
 },

 enable: function(element) {
 element = $(element);
 element.disabled = false;
 return element;
 }
};

/*--------------------------------------------------------------------------*/

var Field = Form.Element;
var $F = Form.Element.Methods.getValue;

/*--------------------------------------------------------------------------*/

Form.Element.Serializers = {
 input: function(element, value) {
 switch (element.type.toLowerCase()) {
 case 'checkbox':
 case 'radio':
 return Form.Element.Serializers.inputSelector(element, value);
 default:
 return Form.Element.Serializers.textarea(element, value);
 }
 },

 inputSelector: function(element, value) {
 if (Object.isUndefined(value)) return element.checked ? element.value : null;
 else element.checked = !!value;
 },

 textarea: function(element, value) {
 if (Object.isUndefined(value)) return element.value;
 else element.value = value;
 },

 select: function(element, value) {
 if (Object.isUndefined(value))
 return this[element.type == 'select-one' ?
 'selectOne' : 'selectMany'](element);
 else {
 var opt, currentValue, single = !Object.isArray(value);
 for (var i = 0, length = element.length; i < length; i++) {
 opt = element.options[i];
 currentValue = this.optionValue(opt);
 if (single) {
 if (currentValue == value) {
 opt.selected = true;
 return;
 }
 }
 else opt.selected = value.include(currentValue);
 }
 }
 },

 selectOne: function(element) {
 var index = element.selectedIndex;
 return index >= 0 ? this.optionValue(element.options[index]) : null;
 },

 selectMany: function(element) {
 var values, length = element.length;
 if (!length) return null;

 for (var i = 0, values = []; i < length; i++) {
 var opt = element.options[i];
 if (opt.selected) values.push(this.optionValue(opt));
 }
 return values;
 },

 optionValue: function(opt) {
 // extend element because hasAttribute may not be native
 return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
 }
};

/*--------------------------------------------------------------------------*/

Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
 initialize: function($super, element, frequency, callback) {
 $super(callback, frequency);
 this.element = $(element);
 this.lastValue = this.getValue();
 },

 execute: function() {
 var value = this.getValue();
 if (Object.isString(this.lastValue) && Object.isString(value) ?
 this.lastValue != value : String(this.lastValue) != String(value)) {
 this.callback(this.element, value);
 this.lastValue = value;
 }
 }
});

Form.Element.Observer = Class.create(Abstract.TimedObserver, {
 getValue: function() {
 return Form.Element.getValue(this.element);
 }
});

Form.Observer = Class.create(Abstract.TimedObserver, {
 getValue: function() {
 return Form.serialize(this.element);
 }
});

/*--------------------------------------------------------------------------*/

Abstract.EventObserver = Class.create({
 initialize: function(element, callback) {
 this.element = $(element);
 this.callback = callback;

 this.lastValue = this.getValue();
 if (this.element.tagName.toLowerCase() == 'form')
 this.registerFormCallbacks();
 else
 this.registerCallback(this.element);
 },

 onElementEvent: function() {
 var value = this.getValue();
 if (this.lastValue != value) {
 this.callback(this.element, value);
 this.lastValue = value;
 }
 },

 registerFormCallbacks: function() {
 Form.getElements(this.element).each(this.registerCallback, this);
 },

 registerCallback: function(element) {
 if (element.type) {
 switch (element.type.toLowerCase()) {
 case 'checkbox':
 case 'radio':
 Event.observe(element, 'click', this.onElementEvent.bind(this));
 break;
 default:
 Event.observe(element, 'change', this.onElementEvent.bind(this));
 break;
 }
 }
 }
});

Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
 getValue: function() {
 return Form.Element.getValue(this.element);
 }
});

Form.EventObserver = Class.create(Abstract.EventObserver, {
 getValue: function() {
 return Form.serialize(this.element);
 }
});
if (!window.Event) var Event = { };

Object.extend(Event, {
 KEY_BACKSPACE: 8,
 KEY_TAB: 9,
 KEY_RETURN: 13,
 KEY_ESC: 27,
 KEY_LEFT: 37,
 KEY_UP: 38,
 KEY_RIGHT: 39,
 KEY_DOWN: 40,
 KEY_DELETE: 46,
 KEY_HOME: 36,
 KEY_END: 35,
 KEY_PAGEUP: 33,
 KEY_PAGEDOWN: 34,
 KEY_INSERT: 45,

 cache: { },

 relatedTarget: function(event) {
 var element;
 switch(event.type) {
 case 'mouseover': element = event.fromElement; break;
 case 'mouseout': element = event.toElement; break;
 default: return null;
 }
 return Element.extend(element);
 }
});

Event.Methods = (function() {
 var isButton;

 if (Prototype.Browser.IE) {
 var buttonMap = { 0: 1, 1: 4, 2: 2 };
 isButton = function(event, code) {
 return event.button == buttonMap[code];
 };

 } else if (Prototype.Browser.WebKit) {
 isButton = function(event, code) {
 switch (code) {
 case 0: return event.which == 1 && !event.metaKey;
 case 1: return event.which == 1 && event.metaKey;
 default: return false;
 }
 };

 } else {
 isButton = function(event, code) {
 return event.which ? (event.which === code + 1) : (event.button === code);
 };
 }

 return {
 isLeftClick: function(event) { return isButton(event, 0) },
 isMiddleClick: function(event) { return isButton(event, 1) },
 isRightClick: function(event) { return isButton(event, 2) },

 element: function(event) {
 event = Event.extend(event);

 var node = event.target,
 type = event.type,
 currentTarget = event.currentTarget;

 if (currentTarget && currentTarget.tagName) {
 // Firefox screws up the "click" event when moving between radio buttons
 // via arrow keys. It also screws up the "load" and "error" events on images,
 // reporting the document as the target instead of the original image.
 if (type === 'load' || type === 'error' ||
 (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
 && currentTarget.type === 'radio'))
 node = currentTarget;
 }
 if (node) {
 if (node.nodeType == Node.TEXT_NODE) node = node.parentNode;
 return Element.extend(node);
 } else return false;
 },

 findElement: function(event, expression) {
 var element = Event.element(event);
 if (!expression) return element;
 var elements = [element].concat(element.ancestors());
 return Selector.findElement(elements, expression, 0);
 },

 pointer: function(event) {
 var docElement = document.documentElement,
 body = document.body || { scrollLeft: 0, scrollTop: 0 };
 return {
 x: event.pageX || (event.clientX +
 (docElement.scrollLeft || body.scrollLeft) -
 (docElement.clientLeft || 0)),
 y: event.pageY || (event.clientY +
 (docElement.scrollTop || body.scrollTop) -
 (docElement.clientTop || 0))
 };
 },

 pointerX: function(event) { return Event.pointer(event).x },
 pointerY: function(event) { return Event.pointer(event).y },

 stop: function(event) {
 Event.extend(event);
 event.preventDefault();
 event.stopPropagation();
 event.stopped = true;
 }
 };
})();

Event.extend = (function() {
 var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
 m[name] = Event.Methods[name].methodize();
 return m;
 });

 if (Prototype.Browser.IE) {
 Object.extend(methods, {
 stopPropagation: function() { this.cancelBubble = true },
 preventDefault: function() { this.returnValue = false },
 inspect: function() { return "[object Event]" }
 });

 return function(event) {
 if (!event) return false;
 if (event._extendedByPrototype) return event;

 event._extendedByPrototype = Prototype.emptyFunction;
 var pointer = Event.pointer(event);
 Object.extend(event, {
 target: event.srcElement,
 relatedTarget: Event.relatedTarget(event),
 pageX: pointer.x,
 pageY: pointer.y
 });
 return Object.extend(event, methods);
 };

 } else {
 Event.prototype = Event.prototype || document.createEvent("HTMLEvents")['__proto__'];
 Object.extend(Event.prototype, methods);
 return Prototype.K;
 }
})();

Object.extend(Event, (function() {
 var cache = Event.cache;

 function getEventID(element) {
 try {
 if (element._prototypeEventID) return element._prototypeEventID[0];
 arguments.callee.id = arguments.callee.id || 1;
 return element._prototypeEventID = [++arguments.callee.id];
 } catch (error) {
 return false;
 }
 }

 function getDOMEventName(eventName) {
 if (eventName && eventName.include(':')) return "dataavailable";
 return eventName;
 }

 function getCacheForID(id) {
 return cache[id] = cache[id] || { };
 }

 function getWrappersForEventName(id, eventName) {
 var c = getCacheForID(id);
 return c[eventName] = c[eventName] || [];
 }

 function createWrapper(element, eventName, handler) {
 var id = getEventID(element);
 var c = getWrappersForEventName(id, eventName);
 if (c.pluck("handler").include(handler)) return false;

 var wrapper = function(event) {
 if (!Event || !Event.extend ||
 (event.eventName && event.eventName != eventName))
 return false;

 Event.extend(event);
 handler.call(element, event);
 };

 wrapper.handler = handler;
 c.push(wrapper);
 return wrapper;
 }

 function findWrapper(id, eventName, handler) {
 var c = getWrappersForEventName(id, eventName);
 return c.find(function(wrapper) { return wrapper.handler == handler });
 }

 function destroyWrapper(id, eventName, handler) {
 var c = getCacheForID(id);
 if (!c[eventName]) return false;
 c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
 }

 function destroyCache() {
 for (var id in cache)
 for (var eventName in cache[id])
 cache[id][eventName] = null;
 }


 // Internet Explorer needs to remove event handlers on page unload
 // in order to avoid memory leaks.
 if (window.attachEvent) {
 window.attachEvent("onunload", destroyCache);
 }

 // Safari has a dummy event handler on page unload so that it won't
 // use its bfcache. Safari <= 3.1 has an issue with restoring the "document"
 // object when page is returned to via the back button using its bfcache.
 if (Prototype.Browser.WebKit) {
 window.addEventListener('unload', Prototype.emptyFunction, false);
 }

 return {
 observe: function(element, eventName, handler) {
 element = $(element);
 var name = getDOMEventName(eventName);

 var wrapper = createWrapper(element, eventName, handler);
 if (!wrapper) return element;

 if (element.addEventListener) {
 element.addEventListener(name, wrapper, false);
 } else {
 element.attachEvent("on" + name, wrapper);
 }

 return element;
 },

 stopObserving: function(element, eventName, handler) {
 element = $(element);
 var id = getEventID(element), name = getDOMEventName(eventName);

 if (!handler && eventName) {
 getWrappersForEventName(id, eventName).each(function(wrapper) {
 element.stopObserving(eventName, wrapper.handler);
 });
 return element;

 } else if (!eventName) {
 Object.keys(getCacheForID(id)).each(function(eventName) {
 element.stopObserving(eventName);
 });
 return element;
 }

 var wrapper = findWrapper(id, eventName, handler);
 if (!wrapper) return element;

 if (element.removeEventListener) {
 element.removeEventListener(name, wrapper, false);
 } else {
 element.detachEvent("on" + name, wrapper);
 }

 destroyWrapper(id, eventName, handler);

 return element;
 },

 fire: function(element, eventName, memo) {
 element = $(element);
 if (element == document && document.createEvent && !element.dispatchEvent)
 element = document.documentElement;

 var event;
 if (document.createEvent) {
 event = document.createEvent("HTMLEvents");
 event.initEvent("dataavailable", true, true);
 } else {
 event = document.createEventObject();
 event.eventType = "ondataavailable";
 }

 event.eventName = eventName;
 event.memo = memo || { };

 if (document.createEvent) {
 element.dispatchEvent(event);
 } else {
 element.fireEvent(event.eventType, event);
 }

 return Event.extend(event);
 }
 };
})());

Object.extend(Event, Event.Methods);

Element.addMethods({
 fire: Event.fire,
 observe: Event.observe,
 stopObserving: Event.stopObserving
});

Object.extend(document, {
 fire: Element.Methods.fire.methodize(),
 observe: Element.Methods.observe.methodize(),
 stopObserving: Element.Methods.stopObserving.methodize(),
 loaded: false
});

(function() {
 /* Support for the DOMContentLoaded event is based on work by Dan Webb,
 Matthias Miller, Dean Edwards and John Resig. */

 var timer;

 function fireContentLoadedEvent() {
 if (document.loaded) return;
 if (timer) window.clearInterval(timer);
 document.fire("dom:loaded");
 document.loaded = true;
 }

 if (document.addEventListener) {
 if (Prototype.Browser.WebKit) {
 timer = window.setInterval(function() {
 if (/loaded|complete/.test(document.readyState))
 fireContentLoadedEvent();
 }, 0);

 Event.observe(window, "load", fireContentLoadedEvent);

 } else {
 document.addEventListener("DOMContentLoaded",
 fireContentLoadedEvent, false);
 }

 } else {
 document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
 $("__onDOMContentLoaded").onreadystatechange = function() {
 if (this.readyState == "complete") {
 this.onreadystatechange = null;
 fireContentLoadedEvent();
 }
 };
 }
})();
/*------------------------------- DEPRECATED -------------------------------*/

Hash.toQueryString = Object.toQueryString;

var Toggle = { display: Element.toggle };

Element.Methods.childOf = Element.Methods.descendantOf;

var Insertion = {
 Before: function(element, content) {
 return Element.insert(element, {before:content});
 },

 Top: function(element, content) {
 return Element.insert(element, {top:content});
 },

 Bottom: function(element, content) {
 return Element.insert(element, {bottom:content});
 },

 After: function(element, content) {
 return Element.insert(element, {after:content});
 }
};

var $continue = new Error('"throw $continue" is deprecated, use "return" instead');

// This should be moved to script.aculo.us; notice the deprecated methods
// further below, that map to the newer Element methods.
var Position = {
 // set to true if needed, warning: firefox performance problems
 // NOT neeeded for page scrolling, only if draggable contained in
 // scrollable elements
 includeScrollOffsets: false,

 // must be called before calling withinIncludingScrolloffset, every time the
 // page is scrolled
 prepare: function() {
 this.deltaX = window.pageXOffset
 || document.documentElement.scrollLeft
 || document.body.scrollLeft
 || 0;
 this.deltaY = window.pageYOffset
 || document.documentElement.scrollTop
 || document.body.scrollTop
 || 0;
 },

 // caches x/y coordinate pair to use with overlap
 within: function(element, x, y) {
 if (this.includeScrollOffsets)
 return this.withinIncludingScrolloffsets(element, x, y);
 this.xcomp = x;
 this.ycomp = y;
 this.offset = Element.cumulativeOffset(element);

 return (y >= this.offset[1] &&
 y < this.offset[1] + element.offsetHeight &&
 x >= this.offset[0] &&
 x < this.offset[0] + element.offsetWidth);
 },

 withinIncludingScrolloffsets: function(element, x, y) {
 var offsetcache = Element.cumulativeScrollOffset(element);

 this.xcomp = x + offsetcache[0] - this.deltaX;
 this.ycomp = y + offsetcache[1] - this.deltaY;
 this.offset = Element.cumulativeOffset(element);

 return (this.ycomp >= this.offset[1] &&
 this.ycomp < this.offset[1] + element.offsetHeight &&
 this.xcomp >= this.offset[0] &&
 this.xcomp < this.offset[0] + element.offsetWidth);
 },

 // within must be called directly before
 overlap: function(mode, element) {
 if (!mode) return 0;
 if (mode == 'vertical')
 return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
 element.offsetHeight;
 if (mode == 'horizontal')
 return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
 element.offsetWidth;
 },

 // Deprecation layer -- use newer Element methods now (1.5.2).

 cumulativeOffset: Element.Methods.cumulativeOffset,

 positionedOffset: Element.Methods.positionedOffset,

 absolutize: function(element) {
 Position.prepare();
 return Element.absolutize(element);
 },

 relativize: function(element) {
 Position.prepare();
 return Element.relativize(element);
 },

 realOffset: Element.Methods.cumulativeScrollOffset,

 offsetParent: Element.Methods.getOffsetParent,

 page: Element.Methods.viewportOffset,

 clone: function(source, target, options) {
 options = options || { };
 return Element.clonePosition(target, source, options);
 }
};

/*--------------------------------------------------------------------------*/

if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
 function iter(name) {
 return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
 }

 instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
 function(element, className) {
 className = className.toString().strip();
 var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
 return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
 } : function(element, className) {
 className = className.toString().strip();
 var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
 if (!classNames && !className) return elements;

 var nodes = $(element).getElementsByTagName('*');
 className = ' ' + className + ' ';

 for (var i = 0, child, cn; child = nodes[i]; i++) {
 if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
 (classNames && classNames.all(function(name) {
 return !name.toString().blank() && cn.include(' ' + name + ' ');
 }))))
 elements.push(Element.extend(child));
 }
 return elements;
 };

 return function(className, parentElement) {
 return $(parentElement || document.body).getElementsByClassName(className);
 };
}(Element.Methods);

/*--------------------------------------------------------------------------*/

Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
 initialize: function(element) {
 this.element = $(element);
 },

 _each: function(iterator) {
 this.element.className.split(/\s+/).select(function(name) {
 return name.length > 0;
 })._each(iterator);
 },

 set: function(className) {
 this.element.className = className;
 },

 add: function(classNameToAdd) {
 if (this.include(classNameToAdd)) return;
 this.set($A(this).concat(classNameToAdd).join(' '));
 },

 remove: function(classNameToRemove) {
 if (!this.include(classNameToRemove)) return;
 this.set($A(this).without(classNameToRemove).join(' '));
 },

 toString: function() {
 return $A(this).join(' ');
 }
};

Object.extend(Element.ClassNames.prototype, Enumerable);

/*--------------------------------------------------------------------------*/

Element.addMethods();
/*
* Really easy field validation with Prototype
* http://tetlaw.id.au/view/javascript/really-easy-field-validation
* Andrew Tetlaw
* Version 1.5.4.1 (2007-01-05)
*
* Copyright (c) 2007 Andrew Tetlaw
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
var Validator = Class.create();

Validator.prototype = {
 initialize : function(className, error, test, options) {
 if(typeof test == 'function'){
 this.options = $H(options);
 this._test = test;
 } else {
 this.options = $H(test);
 this._test = function(){return true};
 }
 this.error = error || 'Validation failed.';
 this.className = className;
 },
 test : function(v, elm) {
 return (this._test(v,elm) && this.options.all(function(p){
 return Validator.methods[p.key] ? Validator.methods[p.key](v,elm,p.value) : true;
 }));
 }
}
Validator.methods = {
 pattern : function(v,elm,opt) {return Validation.get('IsEmpty').test(v) || opt.test(v)},
 minLength : function(v,elm,opt) {return v.length >= opt},
 maxLength : function(v,elm,opt) {return v.length <= opt},
 min : function(v,elm,opt) {return v >= parseFloat(opt)},
 max : function(v,elm,opt) {return v <= parseFloat(opt)},
 notOneOf : function(v,elm,opt) {return $A(opt).all(function(value) {
 return v != value;
 })},
 oneOf : function(v,elm,opt) {return $A(opt).any(function(value) {
 return v == value;
 })},
 is : function(v,elm,opt) {return v == opt},
 isNot : function(v,elm,opt) {return v != opt},
 equalToField : function(v,elm,opt) {return v == $F(opt)},
 notEqualToField : function(v,elm,opt) {return v != $F(opt)},
 include : function(v,elm,opt) {return $A(opt).all(function(value) {
 return Validation.get(value).test(v,elm);
 })}
}

var Validation = Class.create();
Validation.defaultOptions = {
 onSubmit : true,
 stopOnFirst : false,
 immediate : false,
 focusOnError : true,
 useTitles : false,
 addClassNameToContainer: false,
 containerClassName: '.input-box',
 onFormValidate : function(result, form) {},
 onElementValidate : function(result, elm) {}
};

Validation.prototype = {
 initialize : function(form, options){
 this.form = $(form);
 if (!this.form) {
 return;
 }
 this.options = Object.extend({
 onSubmit : Validation.defaultOptions.onSubmit,
 stopOnFirst : Validation.defaultOptions.stopOnFirst,
 immediate : Validation.defaultOptions.immediate,
 focusOnError : Validation.defaultOptions.focusOnError,
 useTitles : Validation.defaultOptions.useTitles,
 onFormValidate : Validation.defaultOptions.onFormValidate,
 onElementValidate : Validation.defaultOptions.onElementValidate
 }, options || {});
 if(this.options.onSubmit) Event.observe(this.form,'submit',this.onSubmit.bind(this),false);
 if(this.options.immediate) {
 Form.getElements(this.form).each(function(input) { // Thanks Mike! 
 if (input.tagName.toLowerCase() == 'select') {
 Event.observe(input, 'blur', this.onChange.bindAsEventListener(this));
 }
 Event.observe(input, 'change', this.onChange.bindAsEventListener(this));
 }, this);
 }
 },
 onChange : function (ev) {
 Validation.isOnChange = true;
 Validation.validate(Event.element(ev),{
 useTitle : this.options.useTitles, 
 onElementValidate : this.options.onElementValidate
 });
 Validation.isOnChange = false; 
 },
 onSubmit : function(ev){
 if(!this.validate()) Event.stop(ev);
 },
 validate : function() {
 var result = false;
 var useTitles = this.options.useTitles;
 var callback = this.options.onElementValidate;
 try {
 if(this.options.stopOnFirst) {
 result = Form.getElements(this.form).all(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); });
 } else {
 result = Form.getElements(this.form).collect(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); }).all();
 }
 } catch (e) {

 }
 if(!result && this.options.focusOnError) {
 try{
 Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus()
 }
 catch(e){

 }
 }
 this.options.onFormValidate(result, this.form);
 return result;
 },
 reset : function() {
 Form.getElements(this.form).each(Validation.reset);
 }
}

Object.extend(Validation, {
 validate : function(elm, options){
 options = Object.extend({
 useTitle : false,
 onElementValidate : function(result, elm) {}
 }, options || {});
 elm = $(elm);

 var cn = $w(elm.className);
 return result = cn.all(function(value) {
 var test = Validation.test(value,elm,options.useTitle);
 options.onElementValidate(test, elm);
 return test;
 });
 },
 insertAdvice : function(elm, advice){
 var container = $(elm).up('.field-row');
 if(container){
 Element.insert(container, {after: advice});
 } else if (elm.up('td.value')) {
 elm.up('td.value').insert({bottom: advice});
 } else if (elm.advaiceContainer && $(elm.advaiceContainer)) {
 $(elm.advaiceContainer).update(advice);
 }
 else {
 switch (elm.type.toLowerCase()) {
 case 'checkbox':
 case 'radio':
 var p = elm.parentNode;
 if(p) {
 Element.insert(p, {'bottom': advice});
 } else {
 Element.insert(elm, {'after': advice});
 }
 break;
 default:
 Element.insert(elm, {'after': advice});
 }
 }
 },
 showAdvice : function(elm, advice, adviceName){
 if(!elm.advices){
 elm.advices = new Hash();
 }
 else{
 elm.advices.each(function(pair){
 this.hideAdvice(elm, pair.value);
 }.bind(this));
 }
 elm.advices.set(adviceName, advice);
 if(typeof Effect == 'undefined') {
 advice.style.display = 'block';
 } else {
 if(!advice._adviceAbsolutize) {
 new Effect.Appear(advice, {duration : 1 });
 } else {
 Position.absolutize(advice);
 advice.show();
 advice.setStyle({
 'top':advice._adviceTop,
 'left': advice._adviceLeft,
 'width': advice._adviceWidth,
 'z-index': 1000
 });
 advice.addClassName('advice-absolute');
 }
 }
 },
 hideAdvice : function(elm, advice){
 if(advice != null) advice.hide();
 },
 updateCallback : function(elm, status) {
 if (typeof elm.callbackFunction != 'undefined') {
 eval(elm.callbackFunction+'(\''+elm.id+'\',\''+status+'\')');
 }
 },
 ajaxError : function(elm, errorMsg) {
 var name = 'validate-ajax';
 var advice = Validation.getAdvice(name, elm);
 if (advice == null) {
 advice = this.createAdvice(name, elm, false, errorMsg);
 }
 this.showAdvice(elm, advice, 'validate-ajax');
 this.updateCallback(elm, 'failed');

 elm.addClassName('validation-failed');
 elm.addClassName('validate-ajax');
 if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
 var container = elm.up(Validation.defaultOptions.containerClassName);
 if (container && this.allowContainerClassName(elm)) {
 container.removeClassName('validation-passed');
 container.addClassName('validation-error');
 }
 }
 },
 allowContainerClassName: function (elm) {
 if (elm.type == 'radio' || elm.type == 'checkbox') {
 return elm.hasClassName('change-container-classname');
 }
 
 return true;
 },
 test : function(name, elm, useTitle) {
 var v = Validation.get(name);
 var prop = '__advice'+name.camelize();
 try {
 if(Validation.isVisible(elm) && !v.test($F(elm), elm)) {
 //if(!elm[prop]) {
 var advice = Validation.getAdvice(name, elm);
 if (advice == null) {
 advice = this.createAdvice(name, elm, useTitle);
 }
 this.showAdvice(elm, advice, name);
 this.updateCallback(elm, 'failed');
 //}
 elm[prop] = 1;
 if (!elm.advaiceContainer) {
 elm.removeClassName('validation-passed');
 elm.addClassName('validation-failed');
 } 
 
 if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
 var container = elm.up(Validation.defaultOptions.containerClassName);
 if (container && this.allowContainerClassName(elm)) {
 container.removeClassName('validation-passed');
 container.addClassName('validation-error');
 }
 }
 return false;
 } else {
 var advice = Validation.getAdvice(name, elm);
 this.hideAdvice(elm, advice);
 this.updateCallback(elm, 'passed');
 elm[prop] = '';
 elm.removeClassName('validation-failed');
 elm.addClassName('validation-passed');
 if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
 var container = elm.up(Validation.defaultOptions.containerClassName);
 if (container && !container.down('.validation-failed') && this.allowContainerClassName(elm)) {
 if (!Validation.get('IsEmpty').test(elm.value) || !this.isVisible(elm)) { 
 container.addClassName('validation-passed');
 } else {
 container.removeClassName('validation-passed');
 }
 container.removeClassName('validation-error');
 }
 }
 return true;
 }
 } catch(e) {
 throw(e)
 }
 },
 isVisible : function(elm) {
 while(elm.tagName != 'BODY') {
 if(!$(elm).visible()) return false;
 elm = elm.parentNode;
 }
 return true;
 },
 getAdvice : function(name, elm) {
 return $('advice-' + name + '-' + Validation.getElmID(elm)) || $('advice-' + Validation.getElmID(elm));
 },
 createAdvice : function(name, elm, useTitle, customError) {
 var v = Validation.get(name);
 var errorMsg = useTitle ? ((elm && elm.title) ? elm.title : v.error) : v.error;
 if (customError) {
 errorMsg = customError;
 }
 try {
 if (Translator){
 errorMsg = Translator.translate(errorMsg);
 }
 }
 catch(e){}

 advice = '<div class="validation-advice" id="advice-' + name + '-' + Validation.getElmID(elm) +'" style="display:none">' + errorMsg + '</div>'


 Validation.insertAdvice(elm, advice);
 advice = Validation.getAdvice(name, elm);
 if($(elm).hasClassName('absolute-advice')) {
 var dimensions = $(elm).getDimensions();
 var originalPosition = Position.cumulativeOffset(elm);

 advice._adviceTop = (originalPosition[1] + dimensions.height) + 'px';
 advice._adviceLeft = (originalPosition[0]) + 'px';
 advice._adviceWidth = (dimensions.width) + 'px';
 advice._adviceAbsolutize = true;
 }
 return advice;
 },
 getElmID : function(elm) {
 return elm.id ? elm.id : elm.name;
 },
 reset : function(elm) {
 elm = $(elm);
 var cn = $w(elm.className);
 cn.each(function(value) {
 var prop = '__advice'+value.camelize();
 if(elm[prop]) {
 var advice = Validation.getAdvice(value, elm);
 if (advice) {
 advice.hide();
 }
 elm[prop] = '';
 }
 elm.removeClassName('validation-failed');
 elm.removeClassName('validation-passed');
 if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
 var container = elm.up(Validation.defaultOptions.containerClassName);
 if (container) {
 container.removeClassName('validation-passed');
 container.removeClassName('validation-error');
 }
 }
 });
 },
 add : function(className, error, test, options) {
 var nv = {};
 nv[className] = new Validator(className, error, test, options);
 Object.extend(Validation.methods, nv);
 },
 addAllThese : function(validators) {
 var nv = {};
 $A(validators).each(function(value) {
 nv[value[0]] = new Validator(value[0], value[1], value[2], (value.length > 3 ? value[3] : {}));
 });
 Object.extend(Validation.methods, nv);
 },
 get : function(name) {
 return Validation.methods[name] ? Validation.methods[name] : Validation.methods['_LikeNoIDIEverSaw_'];
 },
 methods : {
 '_LikeNoIDIEverSaw_' : new Validator('_LikeNoIDIEverSaw_','',{})
 }
});

Validation.add('IsEmpty', '', function(v) {
 return (v == '' || (v == null) || (v.length == 0) || /^\s+$/.test(v)); // || /^\s+$/.test(v));
});

Validation.addAllThese([
 ['validate-select', 'Please select an option.', function(v) {
 return ((v != "none") && (v != null) && (v.length != 0));
 }],
 ['required-entry', 'This is a required field.', function(v) {
 return !Validation.get('IsEmpty').test(v);
 }],
 ['validate-number', 'Please enter a valid number in this field.', function(v) {
 return Validation.get('IsEmpty').test(v) || (!isNaN(parseNumber(v)) && !/^\s+$/.test(parseNumber(v)));
 }],
 ['validate-digits', 'Please use numbers only in this field. please avoid spaces or other characters such as dots or commas.', function(v) {
 return Validation.get('IsEmpty').test(v) || !/[^\d]/.test(v);
 }],
 ['validate-alpha', 'Please use letters only (a-z or A-Z) in this field.', function (v) {
 return Validation.get('IsEmpty').test(v) || /^[a-zA-Z]+$/.test(v)
 }],
 ['validate-code', 'Please use only letters (a-z), numbers (0-9) or underscore(_) in this field, first character should be a letter.', function (v) {
 return Validation.get('IsEmpty').test(v) || /^[a-z]+[a-z0-9_]+$/.test(v)
 }],
 ['validate-alphanum', 'Please use only letters (a-z or A-Z) or numbers (0-9) only in this field. No spaces or other characters are allowed.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^[a-zA-Z0-9]+$/.test(v) /*!/\W/.test(v)*/
 }],
 ['validate-street', 'Please use only letters (a-z or A-Z) or numbers (0-9) or spaces and # only in this field.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^[ \w]{3,}([A-Za-z]\.)?([ \w]*\#\d+)?(\r\n| )[ \w]{3,}/.test(v)
 }],
 ['validate-phoneStrict', 'Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v);
 }],
 ['validate-phoneLax', 'Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^((\d[-. ]?)?((\(\d{3}\))|\d{3}))?[-. ]?\d{3}[-. ]?\d{4}$/.test(v);
 }],
 ['validate-fax', 'Please enter a valid fax number. For example (123) 456-7890 or 123-456-7890.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v);
 }],
 ['validate-date', 'Please enter a valid date.', function(v) {
 var test = new Date(v);
 return Validation.get('IsEmpty').test(v) || !isNaN(test);
 }],
 ['validate-email', 'Please enter a valid email address. For example johndoe@domain.com.', function (v) {
 //return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
 //return Validation.get('IsEmpty').test(v) || /^[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9][\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9\.]{1,30}[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9]@([a-z0-9_-]{1,30}\.){1,5}[a-z]{2,4}$/i.test(v)
 return Validation.get('IsEmpty').test(v) || /^[a-z0-9,!\#\$%&'\*\+/=\?\^_`\{\|}~-]+(\.[a-z0-9,!#\$%&'\*\+/=\?\^_`\{\|}~-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,})/i.test(v)
 }],
 ['validate-emailSender', 'Please use only letters (a-z or A-Z), numbers (0-9) , underscore(_) or spaces in this field.', function (v) {
 return Validation.get('IsEmpty').test(v) || /^[a-zA-Z0-9_\s]+$/.test(v)
 }],
 ['validate-password', 'Please enter 6 or more characters. Leading or trailing spaces will be ignored.', function(v) {
 var pass=v.strip(); /*strip leading and trailing spaces*/
 return !(pass.length>0 && pass.length < 6);
 }],
 ['validate-admin-password', 'Please enter 7 or more characters. Password should contain both numeric and alphabetic characters.', function(v) {
 var pass=v.strip();
 if (0 == pass.length) {
 return true;
 }
 if (!(/[a-z]/i.test(v)) || !(/[0-9]/.test(v))) {
 return false;
 }
 return !(pass.length < 7);
 }],
 ['validate-cpassword', 'Please make sure your passwords match.', function(v) {
 if ($('password')) {
 var pass = $('password');
 }
 else {
 var pass = $$('.validate-password').length ? $$('.validate-password')[0] : $$('.validate-admin-password')[0];
 }
 var conf = $('confirmation') ? $('confirmation') : $$('.validate-cpassword')[0];
 return (pass.value == conf.value);
 }],
 ['validate-url', 'Please enter a valid URL. http:// is required', function (v) {
 return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)
 }],
 ['validate-clean-url', 'Please enter a valid URL. For example http://www.example.com or www.example.com', function (v) {
 return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v) || /^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v)
 }],
 ['validate-identifier', 'Please enter a valid Identifier. For example example-page, example-page.html or anotherlevel/example-page', function (v) {
 return Validation.get('IsEmpty').test(v) || /^[A-Z0-9][A-Z0-9_\/-]+(\.[A-Z0-9_-]+)*$/i.test(v)
 }],
 ['validate-xml-identifier', 'Please enter a valid XML-identifier. For example something_1, block5, id-4', function (v) {
 return Validation.get('IsEmpty').test(v) || /^[A-Z][A-Z0-9_\/-]*$/i.test(v)
 }],
 ['validate-ssn', 'Please enter a valid social security number. For example 123-45-6789.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^\d{3}-?\d{2}-?\d{4}$/.test(v);
 }],
 ['validate-zip', 'Please enter a valid zip code. For example 90602 or 90602-1234.', function(v) {
 return Validation.get('IsEmpty').test(v) || /(^\d{5}$)|(^\d{5}-\d{4}$)/.test(v);
 }],
 ['validate-zip-international', 'Please enter a valid zip code.', function(v) {
 //return Validation.get('IsEmpty').test(v) || /(^[A-z0-9]{2,10}([\s]{0,1}|[\-]{0,1})[A-z0-9]{2,10}$)/.test(v);
 return true;
 }],
 ['validate-date-au', 'Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.', function(v) {
 if(Validation.get('IsEmpty').test(v)) return true;
 var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
 if(!regex.test(v)) return false;
 var d = new Date(v.replace(regex, '$2/$1/$3'));
 return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) &&
 (parseInt(RegExp.$1, 10) == d.getDate()) &&
 (parseInt(RegExp.$3, 10) == d.getFullYear() );
 }],
 ['validate-currency-dollar', 'Please enter a valid $ amount. For example $100.00.', function(v) {
 // [$]1[##][,###]+[.##]
 // [$]1###+[.##]
 // [$]0.##
 // [$].##
 return Validation.get('IsEmpty').test(v) || /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)
 }],
 ['validate-one-required', 'Please select one of the above options.', function (v,elm) {
 var p = elm.parentNode;
 var options = p.getElementsByTagName('INPUT');
 return $A(options).any(function(elm) {
 return $F(elm);
 });
 }],
 ['validate-one-required-by-name', 'Please select one of the options.', function (v,elm) {
 var inputs = $$('input[name="' + elm.name.replace(/([\\"])/g, '\\$1') + '"]');
 
 var error = 1;
 for(var i=0;i<inputs.length;i++) {
 if((inputs[i].type == 'checkbox' || inputs[i].type == 'radio') && inputs[i].checked == true) {
 error = 0;
 }
 
 if(Validation.isOnChange && (inputs[i].type == 'checkbox' || inputs[i].type == 'radio')) {
 Validation.reset(inputs[i]);
 }
 }

 if( error == 0 ) {
 return true;
 } else {
 return false;
 }
 }],
 ['validate-not-negative-number', 'Please enter a valid number in this field.', function(v) {
 v = parseNumber(v);
 return (!isNaN(v) && v>=0);
 }],
 ['validate-state', 'Please select State/Province.', function(v) {
 return (v!=0 || v == '');
 }],

 ['validate-new-password', 'Please enter 6 or more characters. Leading or trailing spaces will be ignored.', function(v) {
 if (!Validation.get('validate-password').test(v)) return false;
 if (Validation.get('IsEmpty').test(v) && v != '') return false;
 return true;
 }],
 ['validate-greater-than-zero', 'Please enter a number greater than 0 in this field.', function(v) {
 if(v.length)
 return parseFloat(v) > 0;
 else
 return true;
 }],
 ['validate-zero-or-greater', 'Please enter a number 0 or greater in this field.', function(v) {
 if(v.length)
 return parseFloat(v) >= 0;
 else
 return true;
 }],
 ['validate-cc-number', 'Please enter a valid credit card number.', function(v, elm) {
 // remove non-numerics
 var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type');
 if (ccTypeContainer && typeof Validation.creditCartTypes.get(ccTypeContainer.value) != 'undefined'
 && Validation.creditCartTypes.get(ccTypeContainer.value)[2] == false) {
 if (!Validation.get('IsEmpty').test(v) && Validation.get('validate-digits').test(v)) {
 return true;
 } else {
 return false;
 }
 }
 return validateCreditCard(v);
 }],
 ['validate-cc-type', 'Credit card number doesn\'t match credit card type', function(v, elm) {
 // remove credit card number delimiters such as "-" and space
 elm.value = removeDelimiters(elm.value);
 v = removeDelimiters(v);

 var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type');
 if (!ccTypeContainer) {
 return true;
 }
 var ccType = ccTypeContainer.value;

 if (typeof Validation.creditCartTypes.get(ccType) == 'undefined') {
 return false;
 }

 // Other card type or switch or solo card
 if (Validation.creditCartTypes.get(ccType)[0]==false) {
 return true;
 }

 // Matched credit card type
 var ccMatchedType = '';

 Validation.creditCartTypes.each(function (pair) {
 if (pair.value[0] && v.match(pair.value[0])) {
 ccMatchedType = pair.key;
 throw $break;
 }
 });

 if(ccMatchedType != ccType) {
 return false;
 }
 
 if (ccTypeContainer.hasClassName('validation-failed') && Validation.isOnChange) {
 Validation.validate(ccTypeContainer);
 }

 return true;
 }],
 ['validate-cc-type-select', 'Card type doesn\'t match credit card number', function(v, elm) {
 var ccNumberContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_type')) + '_cc_number');
 if (Validation.isOnChange && Validation.get('IsEmpty').test(ccNumberContainer.value)) {
 return true;
 }
 if (Validation.get('validate-cc-type').test(ccNumberContainer.value, ccNumberContainer)) {
 Validation.validate(ccNumberContainer);
 }
 return Validation.get('validate-cc-type').test(ccNumberContainer.value, ccNumberContainer);
 }],
 ['validate-cc-exp', 'Incorrect credit card expiration date', function(v, elm) {
 var ccExpMonth = v;
 var ccExpYear = $('ccsave_expiration_yr').value;
 var currentTime = new Date();
 var currentMonth = currentTime.getMonth() + 1;
 var currentYear = currentTime.getFullYear();
 if (ccExpMonth < currentMonth && ccExpYear == currentYear) {
 return false;
 }
 return true;
 }],
 ['validate-cc-cvn', 'Please enter a valid credit card verification number.', function(v, elm) {
 var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_cid')) + '_cc_type');
 if (!ccTypeContainer) {
 return true;
 }
 var ccType = ccTypeContainer.value;

 if (typeof Validation.creditCartTypes.get(ccType) == 'undefined') {
 return false;
 }

 var re = Validation.creditCartTypes.get(ccType)[1];

 if (v.match(re)) {
 return true;
 }

 return false;
 }],
 ['validate-ajax', '', function(v, elm) { return true; }],
 ['validate-data', 'Please use only letters (a-z or A-Z), numbers (0-9) or underscore(_) in this field, first character should be a letter.', function (v) {
 if(v != '' && v) {
 return /^[A-Za-z]+[A-Za-z0-9_]+$/.test(v);
 }
 return true;
 }],
 ['validate-css-length', 'Please input a valid CSS-length. For example 100px or 77pt or 20em or .5ex or 50%', function (v) {
 if (v != '' && v) {
 return /^[0-9\.]+(px|pt|em|ex|%)?$/.test(v) && (!(/\..*\./.test(v))) && !(/\.$/.test(v));
 }
 return true;
 }],
 ['validate-length', 'Maximum length exceeded.', function (v, elm) {
 var re = new RegExp(/^maximum-length-[0-9]+$/);
 var result = true;
 $w(elm.className).each(function(name, index) {
 if (name.match(re) && result) {
 var length = name.split('-')[2];
 result = (v.length <= length);
 }
 });
 return result;
 }]
]);


// Credit Card Validation Javascript
// copyright 12th May 2003, by Stephen Chapman, Felgall Pty Ltd

// You have permission to copy and use this javascript provided that
// the content of the script is not changed in any way.

function validateCreditCard(s) {
 // remove non-numerics
 var v = "0123456789";
 var w = "";
 for (i=0; i < s.length; i++) {
 x = s.charAt(i);
 if (v.indexOf(x,0) != -1)
 w += x;
 }
 // validate number
 j = w.length / 2;
 k = Math.floor(j);
 m = Math.ceil(j) - k;
 c = 0;
 for (i=0; i<k; i++) {
 a = w.charAt(i*2+m) * 2;
 c += a > 9 ? Math.floor(a/10 + a%10) : a;
 }
 for (i=0; i<k+m; i++) c += w.charAt(i*2+1-m) * 1;
 return (c%10 == 0);
}

function removeDelimiters (v) {
 v = v.replace(/\s/g, '');
 v = v.replace(/\-/g, '');
 return v;
}

function parseNumber(v)
{
 if (typeof v != 'string') {
 return parseFloat(v);
 }

 var isDot = v.indexOf('.');
 var isComa = v.indexOf(',');

 if (isDot != -1 && isComa != -1) {
 if (isComa > isDot) {
 v = v.replace('.', '').replace(',', '.');
 }
 else {
 v = v.replace(',', '');
 }
 }
 else if (isComa != -1) {
 v = v.replace(',', '.');
 }

 return parseFloat(v);
}

/**
 * Hash with credit card types wich can be simply extended in payment modules
 * 0 - regexp for card number
 * 1 - regexp for cvn
 * 2 - check or not credit card number trough Luhn algorithm by
 * function validateCreditCard wich you can find above in this file
 */
Validation.creditCartTypes = $H({
 'VI': [new RegExp('^4[0-9]{12}([0-9]{3})?$'), new RegExp('^[0-9]{3}$'), true],
 'MC': [new RegExp('^5[1-5][0-9]{14}$'), new RegExp('^[0-9]{3}$'), true],
 'AE': [new RegExp('^3[47][0-9]{13}$'), new RegExp('^[0-9]{4}$'), true],
 'DI': [new RegExp('^6011[0-9]{12}$'), new RegExp('^[0-9]{3}$'), true],
 'SS': [new RegExp('^((6759[0-9]{12})|(49[013][1356][0-9]{13})|(633[34][0-9]{12})|(633110[0-9]{10})|(564182[0-9]{10}))([0-9]{2,3})?$'), new RegExp('^([0-9]{3}|[0-9]{4})?$'), true],
 'OT': [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), false]
});

// script.aculo.us builder.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007

// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

var Builder = {
 NODEMAP: {
 AREA: 'map',
 CAPTION: 'table',
 COL: 'table',
 COLGROUP: 'table',
 LEGEND: 'fieldset',
 OPTGROUP: 'select',
 OPTION: 'select',
 PARAM: 'object',
 TBODY: 'table',
 TD: 'table',
 TFOOT: 'table',
 TH: 'table',
 THEAD: 'table',
 TR: 'table'
 },
 // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
 // due to a Firefox bug
 node: function(elementName) {
 elementName = elementName.toUpperCase();
 
 // try innerHTML approach
 var parentTag = this.NODEMAP[elementName] || 'div';
 var parentElement = document.createElement(parentTag);
 try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
 parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
 } catch(e) {}
 var element = parentElement.firstChild || null;
 
 // see if browser added wrapping tags
 if(element && (element.tagName.toUpperCase() != elementName))
 element = element.getElementsByTagName(elementName)[0];
 
 // fallback to createElement approach
 if(!element) element = document.createElement(elementName);
 
 // abort if nothing could be created
 if(!element) return;

 // attributes (or text)
 if(arguments[1])
 if(this._isStringOrNumber(arguments[1]) ||
 (arguments[1] instanceof Array) ||
 arguments[1].tagName) {
 this._children(element, arguments[1]);
 } else {
 var attrs = this._attributes(arguments[1]);
 if(attrs.length) {
 try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
 parentElement.innerHTML = "<" +elementName + " " +
 attrs + "></" + elementName + ">";
 } catch(e) {}
 element = parentElement.firstChild || null;
 // workaround firefox 1.0.X bug
 if(!element) {
 element = document.createElement(elementName);
 for(attr in arguments[1]) 
 element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
 }
 if(element.tagName.toUpperCase() != elementName)
 element = parentElement.getElementsByTagName(elementName)[0];
 }
 } 

 // text, or array of children
 if(arguments[2])
 this._children(element, arguments[2]);

 return element;
 },
 _text: function(text) {
 return document.createTextNode(text);
 },

 ATTR_MAP: {
 'className': 'class',
 'htmlFor': 'for'
 },

 _attributes: function(attributes) {
 var attrs = [];
 for(attribute in attributes)
 attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
 '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
 return attrs.join(" ");
 },
 _children: function(element, children) {
 if(children.tagName) {
 element.appendChild(children);
 return;
 }
 if(typeof children=='object') { // array can hold nodes and text
 children.flatten().each( function(e) {
 if(typeof e=='object')
 element.appendChild(e)
 else
 if(Builder._isStringOrNumber(e))
 element.appendChild(Builder._text(e));
 });
 } else
 if(Builder._isStringOrNumber(children))
 element.appendChild(Builder._text(children));
 },
 _isStringOrNumber: function(param) {
 return(typeof param=='string' || typeof param=='number');
 },
 build: function(html) {
 var element = this.node('div');
 $(element).update(html.strip());
 return element.down();
 },
 dump: function(scope) { 
 if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope 
 
 var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
 "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
 "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
 "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
 "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
 "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
 
 tags.each( function(tag){ 
 scope[tag] = function() { 
 return Builder.node.apply(Builder, [tag].concat($A(arguments))); 
 } 
 });
 }
}

// script.aculo.us effects.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007

// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// Contributors:
// Justin Palmer (http://encytemedia.com/)
// Mark Pilgrim (http://diveintomark.org/)
// Martin Bialasinki
// 
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/ 

// converts rgb() and #xxx to #xxxxxx format, 
// returns self (or first argument) if not convertable 
String.prototype.parseColor = function() { 
 var color = '#';
 if(this.slice(0,4) == 'rgb(') { 
 var cols = this.slice(4,this.length-1).split(','); 
 var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); 
 } else { 
 if(this.slice(0,1) == '#') { 
 if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); 
 if(this.length==7) color = this.toLowerCase(); 
 } 
 } 
 return(color.length==7 ? color : (arguments[0] || this)); 
}

/*--------------------------------------------------------------------------*/

Element.collectTextNodes = function(element) { 
 return $A($(element).childNodes).collect( function(node) {
 return (node.nodeType==3 ? node.nodeValue : 
 (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
 }).flatten().join('');
}

Element.collectTextNodesIgnoreClass = function(element, className) { 
 return $A($(element).childNodes).collect( function(node) {
 return (node.nodeType==3 ? node.nodeValue : 
 ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
 Element.collectTextNodesIgnoreClass(node, className) : ''));
 }).flatten().join('');
}

Element.setContentZoom = function(element, percent) {
 element = $(element); 
 element.setStyle({fontSize: (percent/100) + 'em'}); 
 if(Prototype.Browser.WebKit) window.scrollBy(0,0);
 return element;
}

Element.getInlineOpacity = function(element){
 return $(element).style.opacity || '';
}

Element.forceRerendering = function(element) {
 try {
 element = $(element);
 var n = document.createTextNode(' ');
 element.appendChild(n);
 element.removeChild(n);
 } catch(e) { }
};

/*--------------------------------------------------------------------------*/

Array.prototype.call = function() {
 var args = arguments;
 this.each(function(f){ f.apply(this, args) });
}

/*--------------------------------------------------------------------------*/

var Effect = {
 _elementDoesNotExistError: {
 name: 'ElementDoesNotExistError',
 message: 'The specified DOM element does not exist, but is required for this effect to operate'
 },
 tagifyText: function(element) {
 if(typeof Builder == 'undefined')
 throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
 
 var tagifyStyle = 'position:relative';
 if(Prototype.Browser.IE) tagifyStyle += ';zoom:1';
 
 element = $(element);
 $A(element.childNodes).each( function(child) {
 if(child.nodeType==3) {
 child.nodeValue.toArray().each( function(character) {
 element.insertBefore(
 Builder.node('span',{style: tagifyStyle},
 character == ' ' ? String.fromCharCode(160) : character), 
 child);
 });
 Element.remove(child);
 }
 });
 },
 multiple: function(element, effect) {
 var elements;
 if(((typeof element == 'object') || 
 (typeof element == 'function')) && 
 (element.length))
 elements = element;
 else
 elements = $(element).childNodes;
 
 var options = Object.extend({
 speed: 0.1,
 delay: 0.0
 }, arguments[2] || {});
 var masterDelay = options.delay;

 $A(elements).each( function(element, index) {
 new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
 });
 },
 PAIRS: {
 'slide': ['SlideDown','SlideUp'],
 'blind': ['BlindDown','BlindUp'],
 'appear': ['Appear','Fade']
 },
 toggle: function(element, effect) {
 element = $(element);
 effect = (effect || 'appear').toLowerCase();
 var options = Object.extend({
 queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
 }, arguments[2] || {});
 Effect[element.visible() ? 
 Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
 }
};

var Effect2 = Effect; // deprecated

/* ------------- transitions ------------- */

Effect.Transitions = {
 linear: Prototype.K,
 sinoidal: function(pos) {
 return (-Math.cos(pos*Math.PI)/2) + 0.5;
 },
 reverse: function(pos) {
 return 1-pos;
 },
 flicker: function(pos) {
 var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
 return (pos > 1 ? 1 : pos);
 },
 wobble: function(pos) {
 return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
 },
 pulse: function(pos, pulses) { 
 pulses = pulses || 5; 
 return (
 Math.round((pos % (1/pulses)) * pulses) == 0 ? 
 ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
 1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
 );
 },
 none: function(pos) {
 return 0;
 },
 full: function(pos) {
 return 1;
 }
};

/* ------------- core effects ------------- */

Effect.ScopedQueue = Class.create();
Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
 initialize: function() {
 this.effects = [];
 this.interval = null; 
 },
 _each: function(iterator) {
 this.effects._each(iterator);
 },
 add: function(effect) {
 var timestamp = new Date().getTime();
 
 var position = (typeof effect.options.queue == 'string') ? 
 effect.options.queue : effect.options.queue.position;
 
 switch(position) {
 case 'front':
 // move unstarted effects after this effect 
 this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
 e.startOn += effect.finishOn;
 e.finishOn += effect.finishOn;
 });
 break;
 case 'with-last':
 timestamp = this.effects.pluck('startOn').max() || timestamp;
 break;
 case 'end':
 // start effect after last queued effect has finished
 timestamp = this.effects.pluck('finishOn').max() || timestamp;
 break;
 }
 
 effect.startOn += timestamp;
 effect.finishOn += timestamp;

 if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
 this.effects.push(effect);
 
 if(!this.interval)
 this.interval = setInterval(this.loop.bind(this), 15);
 },
 remove: function(effect) {
 this.effects = this.effects.reject(function(e) { return e==effect });
 if(this.effects.length == 0) {
 clearInterval(this.interval);
 this.interval = null;
 }
 },
 loop: function() {
 var timePos = new Date().getTime();
 for(var i=0, len=this.effects.length;i<len;i++) 
 this.effects[i] && this.effects[i].loop(timePos);
 }
});

Effect.Queues = {
 instances: $H(),
 get: function(queueName) {
 if(typeof queueName != 'string') return queueName;
 
 if(!this.instances[queueName])
 this.instances[queueName] = new Effect.ScopedQueue();
 
 return this.instances[queueName];
 }
}
Effect.Queue = Effect.Queues.get('global');

Effect.DefaultOptions = {
 transition: Effect.Transitions.sinoidal,
 duration: 1.0, // seconds
 fps: 100, // 100= assume 66fps max.
 sync: false, // true for combining
 from: 0.0,
 to: 1.0,
 delay: 0.0,
 queue: 'parallel'
}

Effect.Base = function() {};
Effect.Base.prototype = {
 position: null,
 start: function(options) {
 function codeForEvent(options,eventName){
 return (
 (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
 (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
 );
 }
 if(options.transition === false) options.transition = Effect.Transitions.linear;
 this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
 this.currentFrame = 0;
 this.state = 'idle';
 this.startOn = this.options.delay*1000;
 this.finishOn = this.startOn+(this.options.duration*1000);
 this.fromToDelta = this.options.to-this.options.from;
 this.totalTime = this.finishOn-this.startOn;
 this.totalFrames = this.options.fps*this.options.duration;
 
 eval('this.render = function(pos){ '+
 'if(this.state=="idle"){this.state="running";'+
 codeForEvent(options,'beforeSetup')+
 (this.setup ? 'this.setup();':'')+ 
 codeForEvent(options,'afterSetup')+
 '};if(this.state=="running"){'+
 'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+
 'this.position=pos;'+
 codeForEvent(options,'beforeUpdate')+
 (this.update ? 'this.update(pos);':'')+
 codeForEvent(options,'afterUpdate')+
 '}}');
 
 this.event('beforeStart');
 if(!this.options.sync)
 Effect.Queues.get(typeof this.options.queue == 'string' ? 
 'global' : this.options.queue.scope).add(this);
 },
 loop: function(timePos) {
 if(timePos >= this.startOn) {
 if(timePos >= this.finishOn) {
 this.render(1.0);
 this.cancel();
 this.event('beforeFinish');
 if(this.finish) this.finish(); 
 this.event('afterFinish');
 return; 
 }
 var pos = (timePos - this.startOn) / this.totalTime,
 frame = Math.round(pos * this.totalFrames);
 if(frame > this.currentFrame) {
 this.render(pos);
 this.currentFrame = frame;
 }
 }
 },
 cancel: function() {
 if(!this.options.sync)
 Effect.Queues.get(typeof this.options.queue == 'string' ? 
 'global' : this.options.queue.scope).remove(this);
 this.state = 'finished';
 },
 event: function(eventName) {
 if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
 if(this.options[eventName]) this.options[eventName](this);
 },
 inspect: function() {
 var data = $H();
 for(property in this)
 if(typeof this[property] != 'function') data[property] = this[property];
 return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
 }
}

Effect.Parallel = Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
 initialize: function(effects) {
 this.effects = effects || [];
 this.start(arguments[1]);
 },
 update: function(position) {
 this.effects.invoke('render', position);
 },
 finish: function(position) {
 this.effects.each( function(effect) {
 effect.render(1.0);
 effect.cancel();
 effect.event('beforeFinish');
 if(effect.finish) effect.finish(position);
 effect.event('afterFinish');
 });
 }
});

Effect.Event = Class.create();
Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
 initialize: function() {
 var options = Object.extend({
 duration: 0
 }, arguments[0] || {});
 this.start(options);
 },
 update: Prototype.emptyFunction
});

Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
 initialize: function(element) {
 this.element = $(element);
 if(!this.element) throw(Effect._elementDoesNotExistError);
 // make this work on IE on elements without 'layout'
 if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
 this.element.setStyle({zoom: 1});
 var options = Object.extend({
 from: this.element.getOpacity() || 0.0,
 to: 1.0
 }, arguments[1] || {});
 this.start(options);
 },
 update: function(position) {
 this.element.setOpacity(position);
 }
});

Effect.Move = Class.create();
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
 initialize: function(element) {
 this.element = $(element);
 if(!this.element) throw(Effect._elementDoesNotExistError);
 var options = Object.extend({
 x: 0,
 y: 0,
 mode: 'relative'
 }, arguments[1] || {});
 this.start(options);
 },
 setup: function() {
 // Bug in Opera: Opera returns the "real" position of a static element or
 // relative element that does not have top/left explicitly set.
 // ==> Always set top and left for position relative elements in your stylesheets 
 // (to 0 if you do not need them) 
 this.element.makePositioned();
 this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
 this.originalTop = parseFloat(this.element.getStyle('top') || '0');
 if(this.options.mode == 'absolute') {
 // absolute movement, so we need to calc deltaX and deltaY
 this.options.x = this.options.x - this.originalLeft;
 this.options.y = this.options.y - this.originalTop;
 }
 },
 update: function(position) {
 this.element.setStyle({
 left: Math.round(this.options.x * position + this.originalLeft) + 'px',
 top: Math.round(this.options.y * position + this.originalTop) + 'px'
 });
 }
});

// for backwards compatibility
Effect.MoveBy = function(element, toTop, toLeft) {
 return new Effect.Move(element, 
 Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
};

Effect.Scale = Class.create();
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
 initialize: function(element, percent) {
 this.element = $(element);
 if(!this.element) throw(Effect._elementDoesNotExistError);
 var options = Object.extend({
 scaleX: true,
 scaleY: true,
 scaleContent: true,
 scaleFromCenter: false,
 scaleMode: 'box', // 'box' or 'contents' or {} with provided values
 scaleFrom: 100.0,
 scaleTo: percent
 }, arguments[2] || {});
 this.start(options);
 },
 setup: function() {
 this.restoreAfterFinish = this.options.restoreAfterFinish || false;
 this.elementPositioning = this.element.getStyle('position');
 
 this.originalStyle = {};
 ['top','left','width','height','fontSize'].each( function(k) {
 this.originalStyle[k] = this.element.style[k];
 }.bind(this));
 
 this.originalTop = this.element.offsetTop;
 this.originalLeft = this.element.offsetLeft;
 
 var fontSize = this.element.getStyle('font-size') || '100%';
 ['em','px','%','pt'].each( function(fontSizeType) {
 if(fontSize.indexOf(fontSizeType)>0) {
 this.fontSize = parseFloat(fontSize);
 this.fontSizeType = fontSizeType;
 }
 }.bind(this));
 
 this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
 
 this.dims = null;
 if(this.options.scaleMode=='box')
 this.dims = [this.element.offsetHeight, this.element.offsetWidth];
 if(/^content/.test(this.options.scaleMode))
 this.dims = [this.element.scrollHeight, this.element.scrollWidth];
 if(!this.dims)
 this.dims = [this.options.scaleMode.originalHeight,
 this.options.scaleMode.originalWidth];
 },
 update: function(position) {
 var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
 if(this.options.scaleContent && this.fontSize)
 this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
 this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
 },
 finish: function(position) {
 if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
 },
 setDimensions: function(height, width) {
 var d = {};
 if(this.options.scaleX) d.width = Math.round(width) + 'px';
 if(this.options.scaleY) d.height = Math.round(height) + 'px';
 if(this.options.scaleFromCenter) {
 var topd = (height - this.dims[0])/2;
 var leftd = (width - this.dims[1])/2;
 if(this.elementPositioning == 'absolute') {
 if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
 if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
 } else {
 if(this.options.scaleY) d.top = -topd + 'px';
 if(this.options.scaleX) d.left = -leftd + 'px';
 }
 }
 this.element.setStyle(d);
 }
});

Effect.Highlight = Class.create();
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
 initialize: function(element) {
 this.element = $(element);
 if(!this.element) throw(Effect._elementDoesNotExistError);
 var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
 this.start(options);
 },
 setup: function() {
 // Prevent executing on elements not in the layout flow
 if(this.element.getStyle('display')=='none') { this.cancel(); return; }
 // Disable background image during the effect
 this.oldStyle = {};
 if (!this.options.keepBackgroundImage) {
 this.oldStyle.backgroundImage = this.element.getStyle('background-image');
 this.element.setStyle({backgroundImage: 'none'});
 }
 if(!this.options.endcolor)
 this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
 if(!this.options.restorecolor)
 this.options.restorecolor = this.element.getStyle('background-color');
 // init color calculations
 this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
 this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
 },
 update: function(position) {
 this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
 return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
 },
 finish: function() {
 this.element.setStyle(Object.extend(this.oldStyle, {
 backgroundColor: this.options.restorecolor
 }));
 }
});

Effect.ScrollTo = Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
 initialize: function(element) {
 this.element = $(element);
 this.start(arguments[1] || {});
 },
 setup: function() {
 Position.prepare();
 var offsets = Position.cumulativeOffset(this.element);
 if(this.options.offset) offsets[1] += this.options.offset;
 var max = window.innerHeight ? 
 window.height - window.innerHeight :
 document.body.scrollHeight - 
 (document.documentElement.clientHeight ? 
 document.documentElement.clientHeight : document.body.clientHeight);
 this.scrollStart = Position.deltaY;
 this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
 },
 update: function(position) {
 Position.prepare();
 window.scrollTo(Position.deltaX, 
 this.scrollStart + (position*this.delta));
 }
});

/* ------------- combination effects ------------- */

Effect.Fade = function(element) {
 element = $(element);
 var oldOpacity = element.getInlineOpacity();
 var options = Object.extend({
 from: element.getOpacity() || 1.0,
 to: 0.0,
 afterFinishInternal: function(effect) { 
 if(effect.options.to!=0) return;
 effect.element.hide().setStyle({opacity: oldOpacity}); 
 }}, arguments[1] || {});
 return new Effect.Opacity(element,options);
}

Effect.Appear = function(element) {
 element = $(element);
 var options = Object.extend({
 from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
 to: 1.0,
 // force Safari to render floated elements properly
 afterFinishInternal: function(effect) {
 effect.element.forceRerendering();
 },
 beforeSetup: function(effect) {
 effect.element.setOpacity(effect.options.from).show(); 
 }}, arguments[1] || {});
 return new Effect.Opacity(element,options);
}

Effect.Puff = function(element) {
 element = $(element);
 var oldStyle = { 
 opacity: element.getInlineOpacity(), 
 position: element.getStyle('position'),
 top: element.style.top,
 left: element.style.left,
 width: element.style.width,
 height: element.style.height
 };
 return new Effect.Parallel(
 [ new Effect.Scale(element, 200, 
 { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
 new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
 Object.extend({ duration: 1.0, 
 beforeSetupInternal: function(effect) {
 Position.absolutize(effect.effects[0].element)
 },
 afterFinishInternal: function(effect) {
 effect.effects[0].element.hide().setStyle(oldStyle); }
 }, arguments[1] || {})
 );
}

Effect.BlindUp = function(element) {
 element = $(element);
 element.makeClipping();
 return new Effect.Scale(element, 0,
 Object.extend({ scaleContent: false, 
 scaleX: false, 
 restoreAfterFinish: true,
 afterFinishInternal: function(effect) {
 effect.element.hide().undoClipping();
 } 
 }, arguments[1] || {})
 );
}

Effect.BlindDown = function(element) {
 element = $(element);
 var elementDimensions = element.getDimensions();
 return new Effect.Scale(element, 100, Object.extend({ 
 scaleContent: false, 
 scaleX: false,
 scaleFrom: 0,
 scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
 restoreAfterFinish: true,
 afterSetup: function(effect) {
 effect.element.makeClipping().setStyle({height: '0px'}).show(); 
 }, 
 afterFinishInternal: function(effect) {
 effect.element.undoClipping();
 }
 }, arguments[1] || {}));
}

Effect.SwitchOff = function(element) {
 element = $(element);
 var oldOpacity = element.getInlineOpacity();
 return new Effect.Appear(element, Object.extend({
 duration: 0.4,
 from: 0,
 transition: Effect.Transitions.flicker,
 afterFinishInternal: function(effect) {
 new Effect.Scale(effect.element, 1, { 
 duration: 0.3, scaleFromCenter: true,
 scaleX: false, scaleContent: false, restoreAfterFinish: true,
 beforeSetup: function(effect) { 
 effect.element.makePositioned().makeClipping();
 },
 afterFinishInternal: function(effect) {
 effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
 }
 })
 }
 }, arguments[1] || {}));
}

Effect.DropOut = function(element) {
 element = $(element);
 var oldStyle = {
 top: element.getStyle('top'),
 left: element.getStyle('left'),
 opacity: element.getInlineOpacity() };
 return new Effect.Parallel(
 [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
 new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
 Object.extend(
 { duration: 0.5,
 beforeSetup: function(effect) {
 effect.effects[0].element.makePositioned(); 
 },
 afterFinishInternal: function(effect) {
 effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
 } 
 }, arguments[1] || {}));
}

Effect.Shake = function(element) {
 element = $(element);
 var oldStyle = {
 top: element.getStyle('top'),
 left: element.getStyle('left') };
 return new Effect.Move(element, 
 { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
 new Effect.Move(effect.element,
 { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
 new Effect.Move(effect.element,
 { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
 new Effect.Move(effect.element,
 { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
 new Effect.Move(effect.element,
 { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
 new Effect.Move(effect.element,
 { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
 effect.element.undoPositioned().setStyle(oldStyle);
 }}) }}) }}) }}) }}) }});
}

Effect.SlideDown = function(element) {
 element = $(element).cleanWhitespace();
 // SlideDown need to have the content of the element wrapped in a container element with fixed height!
 var oldInnerBottom = element.down().getStyle('bottom');
 var elementDimensions = element.getDimensions();
 return new Effect.Scale(element, 100, Object.extend({ 
 scaleContent: false, 
 scaleX: false, 
 scaleFrom: window.opera ? 0 : 1,
 scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
 restoreAfterFinish: true,
 afterSetup: function(effect) {
 effect.element.makePositioned();
 effect.element.down().makePositioned();
 if(window.opera) effect.element.setStyle({top: ''});
 effect.element.makeClipping().setStyle({height: '0px'}).show(); 
 },
 afterUpdateInternal: function(effect) {
 effect.element.down().setStyle({bottom:
 (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
 },
 afterFinishInternal: function(effect) {
 effect.element.undoClipping().undoPositioned();
 effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
 }, arguments[1] || {})
 );
}

Effect.SlideUp = function(element) {
 element = $(element).cleanWhitespace();
 var oldInnerBottom = element.down().getStyle('bottom');
 return new Effect.Scale(element, window.opera ? 0 : 1,
 Object.extend({ scaleContent: false, 
 scaleX: false, 
 scaleMode: 'box',
 scaleFrom: 100,
 restoreAfterFinish: true,
 beforeStartInternal: function(effect) {
 effect.element.makePositioned();
 effect.element.down().makePositioned();
 if(window.opera) effect.element.setStyle({top: ''});
 effect.element.makeClipping().show();
 }, 
 afterUpdateInternal: function(effect) {
 effect.element.down().setStyle({bottom:
 (effect.dims[0] - effect.element.clientHeight) + 'px' });
 },
 afterFinishInternal: function(effect) {
 effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
 effect.element.down().undoPositioned();
 }
 }, arguments[1] || {})
 );
}

// Bug in opera makes the TD containing this element expand for a instance after finish 
Effect.Squish = function(element) {
 return new Effect.Scale(element, window.opera ? 1 : 0, { 
 restoreAfterFinish: true,
 beforeSetup: function(effect) {
 effect.element.makeClipping(); 
 }, 
 afterFinishInternal: function(effect) {
 effect.element.hide().undoClipping(); 
 }
 });
}

Effect.Grow = function(element) {
 element = $(element);
 var options = Object.extend({
 direction: 'center',
 moveTransition: Effect.Transitions.sinoidal,
 scaleTransition: Effect.Transitions.sinoidal,
 opacityTransition: Effect.Transitions.full
 }, arguments[1] || {});
 var oldStyle = {
 top: element.style.top,
 left: element.style.left,
 height: element.style.height,
 width: element.style.width,
 opacity: element.getInlineOpacity() };

 var dims = element.getDimensions(); 
 var initialMoveX, initialMoveY;
 var moveX, moveY;
 
 switch (options.direction) {
 case 'top-left':
 initialMoveX = initialMoveY = moveX = moveY = 0; 
 break;
 case 'top-right':
 initialMoveX = dims.width;
 initialMoveY = moveY = 0;
 moveX = -dims.width;
 break;
 case 'bottom-left':
 initialMoveX = moveX = 0;
 initialMoveY = dims.height;
 moveY = -dims.height;
 break;
 case 'bottom-right':
 initialMoveX = dims.width;
 initialMoveY = dims.height;
 moveX = -dims.width;
 moveY = -dims.height;
 break;
 case 'center':
 initialMoveX = dims.width / 2;
 initialMoveY = dims.height / 2;
 moveX = -dims.width / 2;
 moveY = -dims.height / 2;
 break;
 }
 
 return new Effect.Move(element, {
 x: initialMoveX,
 y: initialMoveY,
 duration: 0.01, 
 beforeSetup: function(effect) {
 effect.element.hide().makeClipping().makePositioned();
 },
 afterFinishInternal: function(effect) {
 new Effect.Parallel(
 [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
 new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
 new Effect.Scale(effect.element, 100, {
 scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
 sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
 ], Object.extend({
 beforeSetup: function(effect) {
 effect.effects[0].element.setStyle({height: '0px'}).show(); 
 },
 afterFinishInternal: function(effect) {
 effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 
 }
 }, options)
 )
 }
 });
}

Effect.Shrink = function(element) {
 element = $(element);
 var options = Object.extend({
 direction: 'center',
 moveTransition: Effect.Transitions.sinoidal,
 scaleTransition: Effect.Transitions.sinoidal,
 opacityTransition: Effect.Transitions.none
 }, arguments[1] || {});
 var oldStyle = {
 top: element.style.top,
 left: element.style.left,
 height: element.style.height,
 width: element.style.width,
 opacity: element.getInlineOpacity() };

 var dims = element.getDimensions();
 var moveX, moveY;
 
 switch (options.direction) {
 case 'top-left':
 moveX = moveY = 0;
 break;
 case 'top-right':
 moveX = dims.width;
 moveY = 0;
 break;
 case 'bottom-left':
 moveX = 0;
 moveY = dims.height;
 break;
 case 'bottom-right':
 moveX = dims.width;
 moveY = dims.height;
 break;
 case 'center': 
 moveX = dims.width / 2;
 moveY = dims.height / 2;
 break;
 }
 
 return new Effect.Parallel(
 [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
 new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
 new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
 ], Object.extend({ 
 beforeStartInternal: function(effect) {
 effect.effects[0].element.makePositioned().makeClipping(); 
 },
 afterFinishInternal: function(effect) {
 effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
 }, options)
 );
}

Effect.Pulsate = function(element) {
 element = $(element);
 var options = arguments[1] || {};
 var oldOpacity = element.getInlineOpacity();
 var transition = options.transition || Effect.Transitions.sinoidal;
 var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
 reverser.bind(transition);
 return new Effect.Opacity(element, 
 Object.extend(Object.extend({ duration: 2.0, from: 0,
 afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
 }, options), {transition: reverser}));
}

Effect.Fold = function(element) {
 element = $(element);
 var oldStyle = {
 top: element.style.top,
 left: element.style.left,
 width: element.style.width,
 height: element.style.height };
 element.makeClipping();
 return new Effect.Scale(element, 5, Object.extend({ 
 scaleContent: false,
 scaleX: false,
 afterFinishInternal: function(effect) {
 new Effect.Scale(element, 1, { 
 scaleContent: false, 
 scaleY: false,
 afterFinishInternal: function(effect) {
 effect.element.hide().undoClipping().setStyle(oldStyle);
 } });
 }}, arguments[1] || {}));
};

Effect.Morph = Class.create();
Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
 initialize: function(element) {
 this.element = $(element);
 if(!this.element) throw(Effect._elementDoesNotExistError);
 var options = Object.extend({
 style: {}
 }, arguments[1] || {});
 if (typeof options.style == 'string') {
 if(options.style.indexOf(':') == -1) {
 var cssText = '', selector = '.' + options.style;
 $A(document.styleSheets).reverse().each(function(styleSheet) {
 if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
 else if (styleSheet.rules) cssRules = styleSheet.rules;
 $A(cssRules).reverse().each(function(rule) {
 if (selector == rule.selectorText) {
 cssText = rule.style.cssText;
 throw $break;
 }
 });
 if (cssText) throw $break;
 });
 this.style = cssText.parseStyle();
 options.afterFinishInternal = function(effect){
 effect.element.addClassName(effect.options.style);
 effect.transforms.each(function(transform) {
 if(transform.style != 'opacity')
 effect.element.style[transform.style] = '';
 });
 }
 } else this.style = options.style.parseStyle();
 } else this.style = $H(options.style)
 this.start(options);
 },
 setup: function(){
 function parseColor(color){
 if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
 color = color.parseColor();
 return $R(0,2).map(function(i){
 return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
 });
 }
 this.transforms = this.style.map(function(pair){
 var property = pair[0], value = pair[1], unit = null;

 if(value.parseColor('#zzzzzz') != '#zzzzzz') {
 value = value.parseColor();
 unit = 'color';
 } else if(property == 'opacity') {
 value = parseFloat(value);
 if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
 this.element.setStyle({zoom: 1});
 } else if(Element.CSS_LENGTH.test(value)) {
 var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
 value = parseFloat(components[1]);
 unit = (components.length == 3) ? components[2] : null;
 }

 var originalValue = this.element.getStyle(property);
 return { 
 style: property.camelize(), 
 originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 
 targetValue: unit=='color' ? parseColor(value) : value,
 unit: unit
 };
 }.bind(this)).reject(function(transform){
 return (
 (transform.originalValue == transform.targetValue) ||
 (
 transform.unit != 'color' &&
 (isNaN(transform.originalValue) || isNaN(transform.targetValue))
 )
 )
 });
 },
 update: function(position) {
 var style = {}, transform, i = this.transforms.length;
 while(i--)
 style[(transform = this.transforms[i]).style] = 
 transform.unit=='color' ? '#'+
 (Math.round(transform.originalValue[0]+
 (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
 (Math.round(transform.originalValue[1]+
 (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
 (Math.round(transform.originalValue[2]+
 (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
 transform.originalValue + Math.round(
 ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
 this.element.setStyle(style, true);
 }
});

Effect.Transform = Class.create();
Object.extend(Effect.Transform.prototype, {
 initialize: function(tracks){
 this.tracks = [];
 this.options = arguments[1] || {};
 this.addTracks(tracks);
 },
 addTracks: function(tracks){
 tracks.each(function(track){
 var data = $H(track).values().first();
 this.tracks.push($H({
 ids: $H(track).keys().first(),
 effect: Effect.Morph,
 options: { style: data }
 }));
 }.bind(this));
 return this;
 },
 play: function(){
 return new Effect.Parallel(
 this.tracks.map(function(track){
 var elements = [$(track.ids) || $$(track.ids)].flatten();
 return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
 }).flatten(),
 this.options
 );
 }
});

Element.CSS_PROPERTIES = $w(
 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 
 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
 'fontSize fontWeight height left letterSpacing lineHeight ' +
 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
 'right textIndent top width wordSpacing zIndex');
 
Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;

String.prototype.parseStyle = function(){
 var element = document.createElement('div');
 element.innerHTML = '<div style="' + this + '"></div>';
 var style = element.childNodes[0].style, styleRules = $H();
 
 Element.CSS_PROPERTIES.each(function(property){
 if(style[property]) styleRules[property] = style[property]; 
 });
 if(Prototype.Browser.IE && this.indexOf('opacity') > -1) {
 styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
 }
 return styleRules;
};

Element.morph = function(element, style) {
 new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
 return element;
};

['getInlineOpacity','forceRerendering','setContentZoom',
 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( 
 function(f) { Element.Methods[f] = Element[f]; }
);

Element.Methods.visualEffect = function(element, effect, options) {
 s = effect.dasherize().camelize();
 effect_class = s.charAt(0).toUpperCase() + s.substring(1);
 new Effect[effect_class](element, options);
 return $(element);
};

Element.addMethods();
// script.aculo.us dragdrop.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007

// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// (c) 2005-2007 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

if(typeof Effect == 'undefined')
 throw("dragdrop.js requires including script.aculo.us' effects.js library");

var Droppables = {
 drops: [],

 remove: function(element) {
 this.drops = this.drops.reject(function(d) { return d.element==$(element) });
 },

 add: function(element) {
 element = $(element);
 var options = Object.extend({
 greedy: true,
 hoverclass: null,
 tree: false
 }, arguments[1] || {});

 // cache containers
 if(options.containment) {
 options._containers = [];
 var containment = options.containment;
 if((typeof containment == 'object') &&
 (containment.constructor == Array)) {
 containment.each( function(c) { options._containers.push($(c)) });
 } else {
 options._containers.push($(containment));
 }
 }

 if(options.accept) options.accept = [options.accept].flatten();

 Element.makePositioned(element); // fix IE
 options.element = element;

 this.drops.push(options);
 },

 findDeepestChild: function(drops) {
 deepest = drops[0];

 for (i = 1; i < drops.length; ++i)
 if (Element.isParent(drops[i].element, deepest.element))
 deepest = drops[i];

 return deepest;
 },

 isContained: function(element, drop) {
 var containmentNode;
 if(drop.tree) {
 containmentNode = element.treeNode;
 } else {
 containmentNode = element.parentNode;
 }
 return drop._containers.detect(function(c) { return containmentNode == c });
 },

 isAffected: function(point, element, drop) {
 return (
 (drop.element!=element) &&
 ((!drop._containers) ||
 this.isContained(element, drop)) &&
 ((!drop.accept) ||
 (Element.classNames(element).detect(
 function(v) { return drop.accept.include(v) } ) )) &&
 Position.within(drop.element, point[0], point[1]) );
 },

 deactivate: function(drop) {
 if(drop.hoverclass)
 Element.removeClassName(drop.element, drop.hoverclass);
 this.last_active = null;
 },

 activate: function(drop) {
 if(drop.hoverclass)
 Element.addClassName(drop.element, drop.hoverclass);
 this.last_active = drop;
 },

 show: function(point, element) {
 if(!this.drops.length) return;
 var affected = [];

 if(this.last_active) this.deactivate(this.last_active);
 this.drops.each( function(drop) {
 if(Droppables.isAffected(point, element, drop))
 affected.push(drop);
 });

 if(affected.length>0) {
 drop = Droppables.findDeepestChild(affected);
 Position.within(drop.element, point[0], point[1]);
 if(drop.onHover)
 drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));

 Droppables.activate(drop);
 }
 },

 fire: function(event, element) {
 if(!this.last_active) return;
 Position.prepare();

 if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
 if (this.last_active.onDrop) {
 this.last_active.onDrop(element, this.last_active.element, event);
 return true;
 }
 },

 reset: function() {
 if(this.last_active)
 this.deactivate(this.last_active);
 }
}

var Draggables = {
 drags: [],
 observers: [],

 register: function(draggable) {
 if(this.drags.length == 0) {
 this.eventMouseUp = this.endDrag.bindAsEventListener(this);
 this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
 this.eventKeypress = this.keyPress.bindAsEventListener(this);

 Event.observe(document, "mouseup", this.eventMouseUp);
 Event.observe(draggable.element, "mousemove", this.eventMouseMove);
 Event.observe(document, "keypress", this.eventKeypress);
 }
 this.drags.push(draggable);
 },

 unregister: function(draggable) {
 this.drags = this.drags.reject(function(d) { return d==draggable });
 if(this.drags.length == 0) {
 Event.stopObserving(document, "mouseup", this.eventMouseUp);
 Event.stopObserving(draggable.element, "mousemove", this.eventMouseMove);
 Event.stopObserving(document, "keypress", this.eventKeypress);
 }
 },

 activate: function(draggable) {
 if(draggable.options.delay) {
 this._timeout = setTimeout(function() {
 Draggables._timeout = null;
 window.focus();
 Draggables.activeDraggable = draggable;
 }.bind(this), draggable.options.delay);
 } else {
 window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
 this.activeDraggable = draggable;
 }
 },

 deactivate: function() {
 this.activeDraggable = null;
 },

 updateDrag: function(event) {
 if(!this.activeDraggable) return;
 var pointer = [Event.pointerX(event), Event.pointerY(event)];
 // Mozilla-based browsers fire successive mousemove events with
 // the same coordinates, prevent needless redrawing (moz bug?)
 if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
 this._lastPointer = pointer;

 this.activeDraggable.updateDrag(event, pointer);
 },

 endDrag: function(event) {
 if(this._timeout) {
 clearTimeout(this._timeout);
 this._timeout = null;
 }
 if(!this.activeDraggable) return;
 this._lastPointer = null;
 this.activeDraggable.endDrag(event);
 this.activeDraggable = null;
 },

 keyPress: function(event) {
 if(this.activeDraggable)
 this.activeDraggable.keyPress(event);
 },

 addObserver: function(observer) {
 this.observers.push(observer);
 this._cacheObserverCallbacks();
 },

 removeObserver: function(element) { // element instead of observer fixes mem leaks
 this.observers = this.observers.reject( function(o) { return o.element==element });
 this._cacheObserverCallbacks();
 },

 notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'
 if(this[eventName+'Count'] > 0)
 this.observers.each( function(o) {
 if(o[eventName]) o[eventName](eventName, draggable, event);
 });
 if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
 },

 _cacheObserverCallbacks: function() {
 ['onStart','onEnd','onDrag'].each( function(eventName) {
 Draggables[eventName+'Count'] = Draggables.observers.select(
 function(o) { return o[eventName]; }
 ).length;
 });
 }
}

/*--------------------------------------------------------------------------*/

var Draggable = Class.create();
Draggable._dragging = {};

Draggable.prototype = {
 initialize: function(element) {
 var defaults = {
 handle: false,
 reverteffect: function(element, top_offset, left_offset) {
 var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
 new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
 queue: {scope:'_draggable', position:'end'}
 });
 },
 endeffect: function(element) {
 var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;
 new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
 queue: {scope:'_draggable', position:'end'},
 afterFinish: function(){
 Draggable._dragging[element] = false
 }
 });
 },
 zindex: 1000,
 revert: false,
 quiet: false,
 scroll: false,
 scrollSensitivity: 20,
 scrollSpeed: 15,
 snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }
 delay: 0
 };

 if(!arguments[1] || typeof arguments[1].endeffect == 'undefined')
 Object.extend(defaults, {
 starteffect: function(element) {
 element._opacity = Element.getOpacity(element);
 Draggable._dragging[element] = true;
 new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
 }
 });

 var options = Object.extend(defaults, arguments[1] || {});

 this.element = $(element);

 if(options.handle && (typeof options.handle == 'string'))
 this.handle = this.element.down('.'+options.handle, 0);

 if(!this.handle) this.handle = $(options.handle);
 if(!this.handle) this.handle = this.element;

 if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
 options.scroll = $(options.scroll);
 this._isScrollChild = Element.childOf(this.element, options.scroll);
 }

 Element.makePositioned(this.element); // fix IE

 this.delta = this.currentDelta();
 this.options = options;
 this.dragging = false;

 this.eventMouseDown = this.initDrag.bindAsEventListener(this);
 Event.observe(this.handle, "mousedown", this.eventMouseDown);

 Draggables.register(this);
 },

 destroy: function() {
 Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
 Draggables.unregister(this);
 },

 currentDelta: function() {
 return([
 parseInt(Element.getStyle(this.element,'left') || '0'),
 parseInt(Element.getStyle(this.element,'top') || '0')]);
 },

 initDrag: function(event) {
 if(typeof Draggable._dragging[this.element] != 'undefined' &&
 Draggable._dragging[this.element]) return;
 if(Event.isLeftClick(event)) {
 // abort on form elements, fixes a Firefox issue
 var src = Event.element(event);
 if((tag_name = src.tagName.toUpperCase()) && (
 tag_name=='INPUT' ||
 tag_name=='SELECT' ||
 tag_name=='OPTION' ||
 tag_name=='BUTTON' ||
 tag_name=='TEXTAREA')) return;

 var pointer = [Event.pointerX(event), Event.pointerY(event)];
 var pos = Position.cumulativeOffset(this.element);
 this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });

 Draggables.activate(this);
 Event.stop(event);
 }
 },

 startDrag: function(event) {
 this.dragging = true;

 if(this.options.zindex) {
 this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
 this.element.style.zIndex = this.options.zindex;
 }

 if(this.options.ghosting) {
 this._clone = this.element.cloneNode(true);
 Position.absolutize(this.element);
 this.element.parentNode.insertBefore(this._clone, this.element);
 }

 if(this.options.scroll) {
 if (this.options.scroll == window) {
 var where = this._getWindowScroll(this.options.scroll);
 this.originalScrollLeft = where.left;
 this.originalScrollTop = where.top;
 } else {
 this.originalScrollLeft = this.options.scroll.scrollLeft;
 this.originalScrollTop = this.options.scroll.scrollTop;
 }
 }

 Draggables.notify('onStart', this, event);

 if(this.options.starteffect) this.options.starteffect(this.element);
 },

 updateDrag: function(event, pointer) {
 if(!this.dragging) this.startDrag(event);

 if(!this.options.quiet){
 Position.prepare();
 Droppables.show(pointer, this.element);
 }

 Draggables.notify('onDrag', this, event);

 this.draw(pointer);
 if(this.options.change) this.options.change(this);

 if(this.options.scroll) {
 this.stopScrolling();

 var p;
 if (this.options.scroll == window) {
 with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
 } else {
 p = Position.page(this.options.scroll);
 p[0] += this.options.scroll.scrollLeft + Position.deltaX;
 p[1] += this.options.scroll.scrollTop + Position.deltaY;
 p.push(p[0]+this.options.scroll.offsetWidth);
 p.push(p[1]+this.options.scroll.offsetHeight);
 }
 var speed = [0,0];
 if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
 if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
 if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
 if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
 this.startScrolling(speed);
 }

 // fix AppleWebKit rendering
 if(Prototype.Browser.WebKit) window.scrollBy(0,0);

 Event.stop(event);
 },

 finishDrag: function(event, success) {
 this.dragging = false;

 if(this.options.quiet){
 Position.prepare();
 var pointer = [Event.pointerX(event), Event.pointerY(event)];
 Droppables.show(pointer, this.element);
 }

 if(this.options.ghosting) {
 Position.relativize(this.element);
 Element.remove(this._clone);
 this._clone = null;
 }

 var dropped = false;
 if(success) {
 dropped = Droppables.fire(event, this.element);
 if (!dropped) dropped = false;
 }
 if(dropped && this.options.onDropped) this.options.onDropped(this.element);
 Draggables.notify('onEnd', this, event);

 var revert = this.options.revert;
 if(revert && typeof revert == 'function') revert = revert(this.element);

 var d = this.currentDelta();
 if(revert && this.options.reverteffect) {
 if (dropped == 0 || revert != 'failure')
 this.options.reverteffect(this.element,
 d[1]-this.delta[1], d[0]-this.delta[0]);
 } else {
 this.delta = d;
 }

 if(this.options.zindex)
 this.element.style.zIndex = this.originalZ;

 if(this.options.endeffect)
 this.options.endeffect(this.element);

 Draggables.deactivate(this);
 Droppables.reset();
 },

 keyPress: function(event) {
 if(event.keyCode!=Event.KEY_ESC) return;
 this.finishDrag(event, false);
 Event.stop(event);
 },

 endDrag: function(event) {
 if(!this.dragging) return;
 this.stopScrolling();
 this.finishDrag(event, true);
 Event.stop(event);
 },

 draw: function(point) {
 var pos = Position.cumulativeOffset(this.element);
 if(this.options.ghosting) {
 var r = Position.realOffset(this.element);
 pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
 }

 var d = this.currentDelta();
 pos[0] -= d[0]; pos[1] -= d[1];

 if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
 pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
 pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
 }

 var p = [0,1].map(function(i){
 return (point[i]-pos[i]-this.offset[i])
 }.bind(this));

 if(this.options.snap) {
 if(typeof this.options.snap == 'function') {
 p = this.options.snap(p[0],p[1],this);
 } else {
 if(this.options.snap instanceof Array) {
 p = p.map( function(v, i) {
 return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
 } else {
 p = p.map( function(v) {
 return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
 }
 }}

 var style = this.element.style;
 if((!this.options.constraint) || (this.options.constraint=='horizontal'))
 style.left = p[0] + "px";
 if((!this.options.constraint) || (this.options.constraint=='vertical'))
 style.top = p[1] + "px";

 if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
 },

 stopScrolling: function() {
 if(this.scrollInterval) {
 clearInterval(this.scrollInterval);
 this.scrollInterval = null;
 Draggables._lastScrollPointer = null;
 }
 },

 startScrolling: function(speed) {
 if(!(speed[0] || speed[1])) return;
 this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
 this.lastScrolled = new Date();
 this.scrollInterval = setInterval(this.scroll.bind(this), 10);
 },

 scroll: function() {
 var current = new Date();
 var delta = current - this.lastScrolled;
 this.lastScrolled = current;
 if(this.options.scroll == window) {
 with (this._getWindowScroll(this.options.scroll)) {
 if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
 var d = delta / 1000;
 this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
 }
 }
 } else {
 this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
 this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
 }

 Position.prepare();
 Droppables.show(Draggables._lastPointer, this.element);
 Draggables.notify('onDrag', this);
 if (this._isScrollChild) {
 Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
 Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
 Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
 if (Draggables._lastScrollPointer[0] < 0)
 Draggables._lastScrollPointer[0] = 0;
 if (Draggables._lastScrollPointer[1] < 0)
 Draggables._lastScrollPointer[1] = 0;
 this.draw(Draggables._lastScrollPointer);
 }

 if(this.options.change) this.options.change(this);
 },

 _getWindowScroll: function(w) {
 var T, L, W, H;
 with (w.document) {
 if (w.document.documentElement && documentElement.scrollTop) {
 T = documentElement.scrollTop;
 L = documentElement.scrollLeft;
 } else if (w.document.body) {
 T = body.scrollTop;
 L = body.scrollLeft;
 }
 if (w.innerWidth) {
 W = w.innerWidth;
 H = w.innerHeight;
 } else if (w.document.documentElement && documentElement.clientWidth) {
 W = documentElement.clientWidth;
 H = documentElement.clientHeight;
 } else {
 W = body.offsetWidth;
 H = body.offsetHeight
 }
 }
 return { top: T, left: L, width: W, height: H };
 }
}

/*--------------------------------------------------------------------------*/

var SortableObserver = Class.create();
SortableObserver.prototype = {
 initialize: function(element, observer) {
 this.element = $(element);
 this.observer = observer;
 this.lastValue = Sortable.serialize(this.element);
 },

 onStart: function() {
 this.lastValue = Sortable.serialize(this.element);
 },

 onEnd: function() {
 Sortable.unmark();
 if(this.lastValue != Sortable.serialize(this.element))
 this.observer(this.element)
 }
}

var Sortable = {
 SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,

 sortables: {},

 _findRootElement: function(element) {
 while (element.tagName.toUpperCase() != "BODY") {
 if(element.id && Sortable.sortables[element.id]) return element;
 element = element.parentNode;
 }
 },

 options: function(element) {
 element = Sortable._findRootElement($(element));
 if(!element) return;
 return Sortable.sortables[element.id];
 },

 destroy: function(element){
 var s = Sortable.options(element);

 if(s) {
 Draggables.removeObserver(s.element);
 s.droppables.each(function(d){ Droppables.remove(d) });
 s.draggables.invoke('destroy');

 delete Sortable.sortables[s.element.id];
 }
 },

 create: function(element) {
 element = $(element);
 var options = Object.extend({
 element: element,
 tag: 'li', // assumes li children, override with tag: 'tagname'
 dropOnEmpty: false,
 tree: false,
 treeTag: 'ul',
 overlap: 'vertical', // one of 'vertical', 'horizontal'
 constraint: 'vertical', // one of 'vertical', 'horizontal', false
 containment: element, // also takes array of elements (or id's); or false
 handle: false, // or a CSS class
 only: false,
 delay: 0,
 hoverclass: null,
 ghosting: false,
 quiet: false,
 scroll: false,
 scrollSensitivity: 20,
 scrollSpeed: 15,
 format: this.SERIALIZE_RULE,

 // these take arrays of elements or ids and can be
 // used for better initialization performance
 elements: false,
 handles: false,

 onChange: Prototype.emptyFunction,
 onUpdate: Prototype.emptyFunction
 }, arguments[1] || {});

 // clear any old sortable with same element
 this.destroy(element);

 // build options for the draggables
 var options_for_draggable = {
 revert: true,
 quiet: options.quiet,
 scroll: options.scroll,
 scrollSpeed: options.scrollSpeed,
 scrollSensitivity: options.scrollSensitivity,
 delay: options.delay,
 ghosting: options.ghosting,
 constraint: options.constraint,
 handle: options.handle };

 if(options.starteffect)
 options_for_draggable.starteffect = options.starteffect;

 if(options.reverteffect)
 options_for_draggable.reverteffect = options.reverteffect;
 else
 if(options.ghosting) options_for_draggable.reverteffect = function(element) {
 element.style.top = 0;
 element.style.left = 0;
 };

 if(options.endeffect)
 options_for_draggable.endeffect = options.endeffect;

 if(options.zindex)
 options_for_draggable.zindex = options.zindex;

 // build options for the droppables
 var options_for_droppable = {
 overlap: options.overlap,
 containment: options.containment,
 tree: options.tree,
 hoverclass: options.hoverclass,
 onHover: Sortable.onHover
 }

 var options_for_tree = {
 onHover: Sortable.onEmptyHover,
 overlap: options.overlap,
 containment: options.containment,
 hoverclass: options.hoverclass
 }

 // fix for gecko engine
 Element.cleanWhitespace(element);

 options.draggables = [];
 options.droppables = [];

 // drop on empty handling
 if(options.dropOnEmpty || options.tree) {
 Droppables.add(element, options_for_tree);
 options.droppables.push(element);
 }

 (options.elements || this.findElements(element, options) || []).each( function(e,i) {
 var handle = options.handles ? $(options.handles[i]) :
 (options.handle ? $(e).getElementsByClassName(options.handle)[0] : e);
 options.draggables.push(
 new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
 Droppables.add(e, options_for_droppable);
 if(options.tree) e.treeNode = element;
 options.droppables.push(e);
 });

 if(options.tree) {
 (Sortable.findTreeElements(element, options) || []).each( function(e) {
 Droppables.add(e, options_for_tree);
 e.treeNode = element;
 options.droppables.push(e);
 });
 }

 // keep reference
 this.sortables[element.id] = options;

 // for onupdate
 Draggables.addObserver(new SortableObserver(element, options.onUpdate));

 },

 // return all suitable-for-sortable elements in a guaranteed order
 findElements: function(element, options) {
 return Element.findChildren(
 element, options.only, options.tree ? true : false, options.tag);
 },

 findTreeElements: function(element, options) {
 return Element.findChildren(
 element, options.only, options.tree ? true : false, options.treeTag);
 },

 onHover: function(element, dropon, overlap) {
 if(Element.isParent(dropon, element)) return;

 if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
 return;
 } else if(overlap>0.5) {
 Sortable.mark(dropon, 'before');
 if(dropon.previousSibling != element) {
 var oldParentNode = element.parentNode;
 element.style.visibility = "hidden"; // fix gecko rendering
 dropon.parentNode.insertBefore(element, dropon);
 if(dropon.parentNode!=oldParentNode)
 Sortable.options(oldParentNode).onChange(element);
 Sortable.options(dropon.parentNode).onChange(element);
 }
 } else {
 Sortable.mark(dropon, 'after');
 var nextElement = dropon.nextSibling || null;
 if(nextElement != element) {
 var oldParentNode = element.parentNode;
 element.style.visibility = "hidden"; // fix gecko rendering
 dropon.parentNode.insertBefore(element, nextElement);
 if(dropon.parentNode!=oldParentNode)
 Sortable.options(oldParentNode).onChange(element);
 Sortable.options(dropon.parentNode).onChange(element);
 }
 }
 },

 onEmptyHover: function(element, dropon, overlap) {
 var oldParentNode = element.parentNode;
 var droponOptions = Sortable.options(dropon);

 if(!Element.isParent(dropon, element)) {
 var index;

 var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
 var child = null;

 if(children) {
 var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);

 for (index = 0; index < children.length; index += 1) {
 if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
 offset -= Element.offsetSize (children[index], droponOptions.overlap);
 } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
 child = index + 1 < children.length ? children[index + 1] : null;
 break;
 } else {
 child = children[index];
 break;
 }
 }
 }

 dropon.insertBefore(element, child);

 Sortable.options(oldParentNode).onChange(element);
 droponOptions.onChange(element);
 }
 },

 unmark: function() {
 if(Sortable._marker) Sortable._marker.hide();
 },

 mark: function(dropon, position) {
 // mark on ghosting only
 var sortable = Sortable.options(dropon.parentNode);
 if(sortable && !sortable.ghosting) return;

 if(!Sortable._marker) {
 Sortable._marker =
 ($('dropmarker') || Element.extend(document.createElement('DIV'))).
 hide().addClassName('dropmarker').setStyle({position:'absolute'});
 document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
 }
 var offsets = Position.cumulativeOffset(dropon);
 Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});

 if(position=='after')
 if(sortable.overlap == 'horizontal')
 Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
 else
 Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});

 Sortable._marker.show();
 },

 _tree: function(element, options, parent) {
 var children = Sortable.findElements(element, options) || [];

 for (var i = 0; i < children.length; ++i) {
 var match = children[i].id.match(options.format);

 if (!match) continue;

 var child = {
 id: encodeURIComponent(match ? match[1] : null),
 element: element,
 parent: parent,
 children: [],
 position: parent.children.length,
 container: $(children[i]).down(options.treeTag)
 }

 /* Get the element containing the children and recurse over it */
 if (child.container)
 this._tree(child.container, options, child)

 parent.children.push (child);
 }

 return parent;
 },

 tree: function(element) {
 element = $(element);
 var sortableOptions = this.options(element);
 var options = Object.extend({
 tag: sortableOptions.tag,
 treeTag: sortableOptions.treeTag,
 only: sortableOptions.only,
 name: element.id,
 format: sortableOptions.format
 }, arguments[1] || {});

 var root = {
 id: null,
 parent: null,
 children: [],
 container: element,
 position: 0
 }

 return Sortable._tree(element, options, root);
 },

 /* Construct a [i] index for a particular node */
 _constructIndex: function(node) {
 var index = '';
 do {
 if (node.id) index = '[' + node.position + ']' + index;
 } while ((node = node.parent) != null);
 return index;
 },

 sequence: function(element) {
 element = $(element);
 var options = Object.extend(this.options(element), arguments[1] || {});

 return $(this.findElements(element, options) || []).map( function(item) {
 return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
 });
 },

 setSequence: function(element, new_sequence) {
 element = $(element);
 var options = Object.extend(this.options(element), arguments[2] || {});

 var nodeMap = {};
 this.findElements(element, options).each( function(n) {
 if (n.id.match(options.format))
 nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
 n.parentNode.removeChild(n);
 });

 new_sequence.each(function(ident) {
 var n = nodeMap[ident];
 if (n) {
 n[1].appendChild(n[0]);
 delete nodeMap[ident];
 }
 });
 },

 serialize: function(element) {
 element = $(element);
 var options = Object.extend(Sortable.options(element), arguments[1] || {});
 var name = encodeURIComponent(
 (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);

 if (options.tree) {
 return Sortable.tree(element, arguments[1]).children.map( function (item) {
 return [name + Sortable._constructIndex(item) + "[id]=" +
 encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
 }).flatten().join('&');
 } else {
 return Sortable.sequence(element, arguments[1]).map( function(item) {
 return name + "[]=" + encodeURIComponent(item);
 }).join('&');
 }
 }
}

// Returns true if child is contained within element
Element.isParent = function(child, element) {
 if (!child.parentNode || child == element) return false;
 if (child.parentNode == element) return true;
 return Element.isParent(child.parentNode, element);
}

Element.findChildren = function(element, only, recursive, tagName) {
 if(!element.hasChildNodes()) return null;
 tagName = tagName.toUpperCase();
 if(only) only = [only].flatten();
 var elements = [];
 $A(element.childNodes).each( function(e) {
 if(e.tagName && e.tagName.toUpperCase()==tagName &&
 (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
 elements.push(e);
 if(recursive) {
 var grandchildren = Element.findChildren(e, only, recursive, tagName);
 if(grandchildren) elements.push(grandchildren);
 }
 });

 return (elements.length>0 ? elements.flatten() : []);
}

Element.offsetSize = function (element, type) {
 return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
}

// script.aculo.us controls.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007

// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// (c) 2005-2007 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
// (c) 2005-2007 Jon Tirsen (http://www.tirsen.com)
// Contributors:
// Richard Livsey
// Rahul Bhargava
// Rob Wills
// 
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

// Autocompleter.Base handles all the autocompletion functionality 
// that's independent of the data source for autocompletion. This
// includes drawing the autocompletion menu, observing keyboard
// and mouse events, and similar.
//
// Specific autocompleters need to provide, at the very least, 
// a getUpdatedChoices function that will be invoked every time
// the text inside the monitored textbox changes. This method 
// should get the text for which to provide autocompletion by
// invoking this.getToken(), NOT by directly accessing
// this.element.value. This is to allow incremental tokenized
// autocompletion. Specific auto-completion logic (AJAX, etc)
// belongs in getUpdatedChoices.
//
// Tokenized incremental autocompletion is enabled automatically
// when an autocompleter is instantiated with the 'tokens' option
// in the options parameter, e.g.:
// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
// will incrementally autocomplete with a comma as the token.
// Additionally, ',' in the above example can be replaced with
// a token array, e.g. { tokens: [',', '\n'] } which
// enables autocompletion on multiple tokens. This is most 
// useful when one of the tokens is \n (a newline), as it 
// allows smart autocompletion after linebreaks.

if(typeof Effect == 'undefined')
 throw("controls.js requires including script.aculo.us' effects.js library");

var Autocompleter = {}
Autocompleter.Base = function() {};
Autocompleter.Base.prototype = {
 baseInitialize: function(element, update, options) {
 element = $(element)
 this.element = element; 
 this.update = $(update); 
 this.hasFocus = false; 
 this.changed = false; 
 this.active = false; 
 this.index = 0; 
 this.entryCount = 0;

 if(this.setOptions)
 this.setOptions(options);
 else
 this.options = options || {};

 this.options.paramName = this.options.paramName || this.element.name;
 this.options.tokens = this.options.tokens || [];
 this.options.frequency = this.options.frequency || 0.4;
 this.options.minChars = this.options.minChars || 1;
 this.options.onShow = this.options.onShow || 
 function(element, update){ 
 if(!update.style.position || update.style.position=='absolute') {
 update.style.position = 'absolute';
 Position.clone(element, update, {
 setHeight: false, 
 offsetTop: element.offsetHeight
 });
 }
 Effect.Appear(update,{duration:0.15});
 };
 this.options.onHide = this.options.onHide || 
 function(element, update){ new Effect.Fade(update,{duration:0.15}) };

 if(typeof(this.options.tokens) == 'string') 
 this.options.tokens = new Array(this.options.tokens);

 this.observer = null;
 
 this.element.setAttribute('autocomplete','off');

 Element.hide(this.update);

 Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
 Event.observe(this.element, 'keypress', this.onKeyPress.bindAsEventListener(this));

 // Turn autocomplete back on when the user leaves the page, so that the
 // field's value will be remembered on Mozilla-based browsers.
 Event.observe(window, 'beforeunload', function(){ 
 element.setAttribute('autocomplete', 'on'); 
 });
 },

 show: function() {
 if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
 if(!this.iefix && 
 (Prototype.Browser.IE) &&
 (Element.getStyle(this.update, 'position')=='absolute')) {
 new Insertion.After(this.update, 
 '<iframe id="' + this.update.id + '_iefix" '+
 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
 this.iefix = $(this.update.id+'_iefix');
 }
 if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
 },
 
 fixIEOverlapping: function() {
 Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
 this.iefix.style.zIndex = 1;
 this.update.style.zIndex = 2;
 Element.show(this.iefix);
 },

 hide: function() {
 this.stopIndicator();
 if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
 if(this.iefix) Element.hide(this.iefix);
 },

 startIndicator: function() {
 if(this.options.indicator) Element.show(this.options.indicator);
 },

 stopIndicator: function() {
 if(this.options.indicator) Element.hide(this.options.indicator);
 },

 onKeyPress: function(event) {
 if(this.active)
 switch(event.keyCode) {
 case Event.KEY_TAB:
 case Event.KEY_RETURN:
 this.selectEntry();
 Event.stop(event);
 case Event.KEY_ESC:
 this.hide();
 this.active = false;
 Event.stop(event);
 return;
 case Event.KEY_LEFT:
 case Event.KEY_RIGHT:
 return;
 case Event.KEY_UP:
 this.markPrevious();
 this.render();
 if(Prototype.Browser.WebKit) Event.stop(event);
 return;
 case Event.KEY_DOWN:
 this.markNext();
 this.render();
 if(Prototype.Browser.WebKit) Event.stop(event);
 return;
 }
 else 
 if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || 
 (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;

 this.changed = true;
 this.hasFocus = true;

 if(this.observer) clearTimeout(this.observer);
 this.observer = 
 setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
 },

 activate: function() {
 this.changed = false;
 this.hasFocus = true;
 this.getUpdatedChoices();
 },

 onHover: function(event) {
 var element = Event.findElement(event, 'LI');
 if(this.index != element.autocompleteIndex) 
 {
 this.index = element.autocompleteIndex;
 this.render();
 }
 Event.stop(event);
 },
 
 onClick: function(event) {
 var element = Event.findElement(event, 'LI');
 this.index = element.autocompleteIndex;
 this.selectEntry();
 this.hide();
 },
 
 onBlur: function(event) {
 // needed to make click events working
 setTimeout(this.hide.bind(this), 250);
 this.hasFocus = false;
 this.active = false; 
 }, 
 
 render: function() {
 if(this.entryCount > 0) {
 for (var i = 0; i < this.entryCount; i++)
 this.index==i ? 
 Element.addClassName(this.getEntry(i),"selected") : 
 Element.removeClassName(this.getEntry(i),"selected");
 if(this.hasFocus) { 
 this.show();
 this.active = true;
 }
 } else {
 this.active = false;
 this.hide();
 }
 },
 
 markPrevious: function() {
 if(this.index > 0) this.index--
 else this.index = this.entryCount-1;
 this.getEntry(this.index).scrollIntoView(true);
 },
 
 markNext: function() {
 if(this.index < this.entryCount-1) this.index++
 else this.index = 0;
 this.getEntry(this.index).scrollIntoView(false);
 },
 
 getEntry: function(index) {
 return this.update.firstChild.childNodes[index];
 },
 
 getCurrentEntry: function() {
 return this.getEntry(this.index);
 },
 
 selectEntry: function() {
 this.active = false;
 this.updateElement(this.getCurrentEntry());
 },

 updateElement: function(selectedElement) {
 if (this.options.updateElement) {
 this.options.updateElement(selectedElement);
 return;
 }
 var value = '';
 if (this.options.select) {
 var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
 if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
 } else
 value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
 
 var lastTokenPos = this.findLastToken();
 if (lastTokenPos != -1) {
 var newValue = this.element.value.substr(0, lastTokenPos + 1);
 var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
 if (whitespace)
 newValue += whitespace[0];
 this.element.value = newValue + value;
 } else {
 this.element.value = value;
 }
 this.element.focus();
 
 if (this.options.afterUpdateElement)
 this.options.afterUpdateElement(this.element, selectedElement);
 },

 updateChoices: function(choices) {
 if(!this.changed && this.hasFocus) {
 this.update.innerHTML = choices;
 Element.cleanWhitespace(this.update);
 Element.cleanWhitespace(this.update.down());

 if(this.update.firstChild && this.update.down().childNodes) {
 this.entryCount = 
 this.update.down().childNodes.length;
 for (var i = 0; i < this.entryCount; i++) {
 var entry = this.getEntry(i);
 entry.autocompleteIndex = i;
 this.addObservers(entry);
 }
 } else { 
 this.entryCount = 0;
 }

 this.stopIndicator();
 this.index = 0;
 
 if(this.entryCount==1 && this.options.autoSelect) {
 this.selectEntry();
 this.hide();
 } else {
 this.render();
 }
 }
 },

 addObservers: function(element) {
 Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
 Event.observe(element, "click", this.onClick.bindAsEventListener(this));
 },

 onObserverEvent: function() {
 this.changed = false; 
 if(this.getToken().length>=this.options.minChars) {
 this.getUpdatedChoices();
 } else {
 this.active = false;
 this.hide();
 }
 },

 getToken: function() {
 var tokenPos = this.findLastToken();
 if (tokenPos != -1)
 var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
 else
 var ret = this.element.value;

 return /\n/.test(ret) ? '' : ret;
 },

 findLastToken: function() {
 var lastTokenPos = -1;

 for (var i=0; i<this.options.tokens.length; i++) {
 var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
 if (thisTokenPos > lastTokenPos)
 lastTokenPos = thisTokenPos;
 }
 return lastTokenPos;
 }
}

Ajax.Autocompleter = Class.create();
Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
 initialize: function(element, update, url, options) {
 this.baseInitialize(element, update, options);
 this.options.asynchronous = true;
 this.options.onComplete = this.onComplete.bind(this);
 this.options.defaultParams = this.options.parameters || null;
 this.url = url;
 },

 getUpdatedChoices: function() {
 this.startIndicator();
 
 var entry = encodeURIComponent(this.options.paramName) + '=' + 
 encodeURIComponent(this.getToken());

 this.options.parameters = this.options.callback ?
 this.options.callback(this.element, entry) : entry;

 if(this.options.defaultParams) 
 this.options.parameters += '&' + this.options.defaultParams;
 
 new Ajax.Request(this.url, this.options);
 },

 onComplete: function(request) {
 this.updateChoices(request.responseText);
 }

});

// The local array autocompleter. Used when you'd prefer to
// inject an array of autocompletion options into the page, rather
// than sending out Ajax queries, which can be quite slow sometimes.
//
// The constructor takes four parameters. The first two are, as usual,
// the id of the monitored textbox, and id of the autocompletion menu.
// The third is the array you want to autocomplete from, and the fourth
// is the options block.
//
// Extra local autocompletion options:
// - choices - How many autocompletion choices to offer
//
// - partialSearch - If false, the autocompleter will match entered
// text only at the beginning of strings in the 
// autocomplete array. Defaults to true, which will
// match text at the beginning of any *word* in the
// strings in the autocomplete array. If you want to
// search anywhere in the string, additionally set
// the option fullSearch to true (default: off).
//
// - fullSsearch - Search anywhere in autocomplete array strings.
//
// - partialChars - How many characters to enter before triggering
// a partial match (unlike minChars, which defines
// how many characters are required to do any match
// at all). Defaults to 2.
//
// - ignoreCase - Whether to ignore case when autocompleting.
// Defaults to true.
//
// It's possible to pass in a custom function as the 'selector' 
// option, if you prefer to write your own autocompletion logic.
// In that case, the other options above will not apply unless
// you support them.

Autocompleter.Local = Class.create();
Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
 initialize: function(element, update, array, options) {
 this.baseInitialize(element, update, options);
 this.options.array = array;
 },

 getUpdatedChoices: function() {
 this.updateChoices(this.options.selector(this));
 },

 setOptions: function(options) {
 this.options = Object.extend({
 choices: 10,
 partialSearch: true,
 partialChars: 2,
 ignoreCase: true,
 fullSearch: false,
 selector: function(instance) {
 var ret = []; // Beginning matches
 var partial = []; // Inside matches
 var entry = instance.getToken();
 var count = 0;

 for (var i = 0; i < instance.options.array.length && 
 ret.length < instance.options.choices ; i++) { 

 var elem = instance.options.array[i];
 var foundPos = instance.options.ignoreCase ? 
 elem.toLowerCase().indexOf(entry.toLowerCase()) : 
 elem.indexOf(entry);

 while (foundPos != -1) {
 if (foundPos == 0 && elem.length != entry.length) { 
 ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + 
 elem.substr(entry.length) + "</li>");
 break;
 } else if (entry.length >= instance.options.partialChars && 
 instance.options.partialSearch && foundPos != -1) {
 if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
 partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
 elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
 foundPos + entry.length) + "</li>");
 break;
 }
 }

 foundPos = instance.options.ignoreCase ? 
 elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : 
 elem.indexOf(entry, foundPos + 1);

 }
 }
 if (partial.length)
 ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
 return "<ul>" + ret.join('') + "</ul>";
 }
 }, options || {});
 }
});

// AJAX in-place editor
//
// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor

// Use this if you notice weird scrolling problems on some browsers,
// the DOM might be a bit confused when this gets called so do this
// waits 1 ms (with setTimeout) until it does the activation
Field.scrollFreeActivate = function(field) {
 setTimeout(function() {
 Field.activate(field);
 }, 1);
}

Ajax.InPlaceEditor = Class.create();
Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
Ajax.InPlaceEditor.prototype = {
 initialize: function(element, url, options) {
 this.url = url;
 this.element = $(element);

 this.options = Object.extend({
 paramName: "value",
 okButton: true,
 okLink: false,
 okText: "ok",
 cancelButton: false,
 cancelLink: true,
 cancelText: "cancel",
 textBeforeControls: '',
 textBetweenControls: '',
 textAfterControls: '',
 savingText: "Saving...",
 clickToEditText: "Click to edit",
 okText: "ok",
 rows: 1,
 onComplete: function(transport, element) {
 new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
 },
 onFailure: function(transport) {
 alert("Error communicating with the server: " + transport.responseText.stripTags());
 },
 callback: function(form) {
 return Form.serialize(form);
 },
 handleLineBreaks: true,
 loadingText: 'Loading...',
 savingClassName: 'inplaceeditor-saving',
 loadingClassName: 'inplaceeditor-loading',
 formClassName: 'inplaceeditor-form',
 highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
 highlightendcolor: "#FFFFFF",
 externalControl: null,
 submitOnBlur: false,
 ajaxOptions: {},
 evalScripts: false
 }, options || {});

 if(!this.options.formId && this.element.id) {
 this.options.formId = this.element.id + "-inplaceeditor";
 if ($(this.options.formId)) {
 // there's already a form with that name, don't specify an id
 this.options.formId = null;
 }
 }
 
 if (this.options.externalControl) {
 this.options.externalControl = $(this.options.externalControl);
 }
 
 this.originalBackground = Element.getStyle(this.element, 'background-color');
 if (!this.originalBackground) {
 this.originalBackground = "transparent";
 }
 
 this.element.title = this.options.clickToEditText;
 
 this.onclickListener = this.enterEditMode.bindAsEventListener(this);
 this.mouseoverListener = this.enterHover.bindAsEventListener(this);
 this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
 Event.observe(this.element, 'click', this.onclickListener);
 Event.observe(this.element, 'mouseover', this.mouseoverListener);
 Event.observe(this.element, 'mouseout', this.mouseoutListener);
 if (this.options.externalControl) {
 Event.observe(this.options.externalControl, 'click', this.onclickListener);
 Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
 Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
 }
 },
 enterEditMode: function(evt) {
 if (this.saving) return;
 if (this.editing) return;
 this.editing = true;
 this.onEnterEditMode();
 if (this.options.externalControl) {
 Element.hide(this.options.externalControl);
 }
 Element.hide(this.element);
 this.createForm();
 this.element.parentNode.insertBefore(this.form, this.element);
 if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
 // stop the event to avoid a page refresh in Safari
 if (evt) {
 Event.stop(evt);
 }
 return false;
 },
 createForm: function() {
 this.form = document.createElement("form");
 this.form.id = this.options.formId;
 Element.addClassName(this.form, this.options.formClassName)
 this.form.onsubmit = this.onSubmit.bind(this);

 this.createEditField();

 if (this.options.textarea) {
 var br = document.createElement("br");
 this.form.appendChild(br);
 }
 
 if (this.options.textBeforeControls)
 this.form.appendChild(document.createTextNode(this.options.textBeforeControls));

 if (this.options.okButton) {
 var okButton = document.createElement("input");
 okButton.type = "submit";
 okButton.value = this.options.okText;
 okButton.className = 'editor_ok_button';
 this.form.appendChild(okButton);
 }
 
 if (this.options.okLink) {
 var okLink = document.createElement("a");
 okLink.href = "#";
 okLink.appendChild(document.createTextNode(this.options.okText));
 okLink.onclick = this.onSubmit.bind(this);
 okLink.className = 'editor_ok_link';
 this.form.appendChild(okLink);
 }
 
 if (this.options.textBetweenControls && 
 (this.options.okLink || this.options.okButton) && 
 (this.options.cancelLink || this.options.cancelButton))
 this.form.appendChild(document.createTextNode(this.options.textBetweenControls));
 
 if (this.options.cancelButton) {
 var cancelButton = document.createElement("input");
 cancelButton.type = "submit";
 cancelButton.value = this.options.cancelText;
 cancelButton.onclick = this.onclickCancel.bind(this);
 cancelButton.className = 'editor_cancel_button';
 this.form.appendChild(cancelButton);
 }

 if (this.options.cancelLink) {
 var cancelLink = document.createElement("a");
 cancelLink.href = "#";
 cancelLink.appendChild(document.createTextNode(this.options.cancelText));
 cancelLink.onclick = this.onclickCancel.bind(this);
 cancelLink.className = 'editor_cancel editor_cancel_link'; 
 this.form.appendChild(cancelLink);
 }
 
 if (this.options.textAfterControls)
 this.form.appendChild(document.createTextNode(this.options.textAfterControls));
 },
 hasHTMLLineBreaks: function(string) {
 if (!this.options.handleLineBreaks) return false;
 return string.match(/<br/i) || string.match(/<p>/i);
 },
 convertHTMLLineBreaks: function(string) {
 return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
 },
 createEditField: function() {
 var text;
 if(this.options.loadTextURL) {
 text = this.options.loadingText;
 } else {
 text = this.getText();
 }

 var obj = this;
 
 if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
 this.options.textarea = false;
 var textField = document.createElement("input");
 textField.obj = this;
 textField.type = "text";
 textField.name = this.options.paramName;
 textField.value = text;
 textField.style.backgroundColor = this.options.highlightcolor;
 textField.className = 'editor_field';
 var size = this.options.size || this.options.cols || 0;
 if (size != 0) textField.size = size;
 if (this.options.submitOnBlur)
 textField.onblur = this.onSubmit.bind(this);
 this.editField = textField;
 } else {
 this.options.textarea = true;
 var textArea = document.createElement("textarea");
 textArea.obj = this;
 textArea.name = this.options.paramName;
 textArea.value = this.convertHTMLLineBreaks(text);
 textArea.rows = this.options.rows;
 textArea.cols = this.options.cols || 40;
 textArea.className = 'editor_field'; 
 if (this.options.submitOnBlur)
 textArea.onblur = this.onSubmit.bind(this);
 this.editField = textArea;
 }
 
 if(this.options.loadTextURL) {
 this.loadExternalText();
 }
 this.form.appendChild(this.editField);
 },
 getText: function() {
 return this.element.innerHTML;
 },
 loadExternalText: function() {
 Element.addClassName(this.form, this.options.loadingClassName);
 this.editField.disabled = true;
 new Ajax.Request(
 this.options.loadTextURL,
 Object.extend({
 asynchronous: true,
 onComplete: this.onLoadedExternalText.bind(this)
 }, this.options.ajaxOptions)
 );
 },
 onLoadedExternalText: function(transport) {
 Element.removeClassName(this.form, this.options.loadingClassName);
 this.editField.disabled = false;
 this.editField.value = transport.responseText.stripTags();
 Field.scrollFreeActivate(this.editField);
 },
 onclickCancel: function() {
 this.onComplete();
 this.leaveEditMode();
 return false;
 },
 onFailure: function(transport) {
 this.options.onFailure(transport);
 if (this.oldInnerHTML) {
 this.element.innerHTML = this.oldInnerHTML;
 this.oldInnerHTML = null;
 }
 return false;
 },
 onSubmit: function() {
 // onLoading resets these so we need to save them away for the Ajax call
 var form = this.form;
 var value = this.editField.value;
 
 // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
 // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
 // to be displayed indefinitely
 this.onLoading();
 
 if (this.options.evalScripts) {
 new Ajax.Request(
 this.url, Object.extend({
 parameters: this.options.callback(form, value),
 onComplete: this.onComplete.bind(this),
 onFailure: this.onFailure.bind(this),
 asynchronous:true, 
 evalScripts:true
 }, this.options.ajaxOptions));
 } else {
 new Ajax.Updater(
 { success: this.element,
 // don't update on failure (this could be an option)
 failure: null }, 
 this.url, Object.extend({
 parameters: this.options.callback(form, value),
 onComplete: this.onComplete.bind(this),
 onFailure: this.onFailure.bind(this)
 }, this.options.ajaxOptions));
 }
 // stop the event to avoid a page refresh in Safari
 if (arguments.length > 1) {
 Event.stop(arguments[0]);
 }
 return false;
 },
 onLoading: function() {
 this.saving = true;
 this.removeForm();
 this.leaveHover();
 this.showSaving();
 },
 showSaving: function() {
 this.oldInnerHTML = this.element.innerHTML;
 this.element.innerHTML = this.options.savingText;
 Element.addClassName(this.element, this.options.savingClassName);
 this.element.style.backgroundColor = this.originalBackground;
 Element.show(this.element);
 },
 removeForm: function() {
 if(this.form) {
 if (this.form.parentNode) Element.remove(this.form);
 this.form = null;
 }
 },
 enterHover: function() {
 if (this.saving) return;
 this.element.style.backgroundColor = this.options.highlightcolor;
 if (this.effect) {
 this.effect.cancel();
 }
 Element.addClassName(this.element, this.options.hoverClassName)
 },
 leaveHover: function() {
 if (this.options.backgroundColor) {
 this.element.style.backgroundColor = this.oldBackground;
 }
 Element.removeClassName(this.element, this.options.hoverClassName)
 if (this.saving) return;
 this.effect = new Effect.Highlight(this.element, {
 startcolor: this.options.highlightcolor,
 endcolor: this.options.highlightendcolor,
 restorecolor: this.originalBackground
 });
 },
 leaveEditMode: function() {
 Element.removeClassName(this.element, this.options.savingClassName);
 this.removeForm();
 this.leaveHover();
 this.element.style.backgroundColor = this.originalBackground;
 Element.show(this.element);
 if (this.options.externalControl) {
 Element.show(this.options.externalControl);
 }
 this.editing = false;
 this.saving = false;
 this.oldInnerHTML = null;
 this.onLeaveEditMode();
 },
 onComplete: function(transport) {
 this.leaveEditMode();
 this.options.onComplete.bind(this)(transport, this.element);
 },
 onEnterEditMode: function() {},
 onLeaveEditMode: function() {},
 dispose: function() {
 if (this.oldInnerHTML) {
 this.element.innerHTML = this.oldInnerHTML;
 }
 this.leaveEditMode();
 Event.stopObserving(this.element, 'click', this.onclickListener);
 Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
 Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
 if (this.options.externalControl) {
 Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
 Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
 Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
 }
 }
};

Ajax.InPlaceCollectionEditor = Class.create();
Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
 createEditField: function() {
 if (!this.cached_selectTag) {
 var selectTag = document.createElement("select");
 var collection = this.options.collection || [];
 var optionTag;
 collection.each(function(e,i) {
 optionTag = document.createElement("option");
 optionTag.value = (e instanceof Array) ? e[0] : e;
 if((typeof this.options.value == 'undefined') && 
 ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
 if(this.options.value==optionTag.value) optionTag.selected = true;
 optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
 selectTag.appendChild(optionTag);
 }.bind(this));
 this.cached_selectTag = selectTag;
 }

 this.editField = this.cached_selectTag;
 if(this.options.loadTextURL) this.loadExternalText();
 this.form.appendChild(this.editField);
 this.options.callback = function(form, value) {
 return "value=" + encodeURIComponent(value);
 }
 }
});

// Delayed observer, like Form.Element.Observer, 
// but waits for delay after last key input
// Ideal for live-search fields

Form.Element.DelayedObserver = Class.create();
Form.Element.DelayedObserver.prototype = {
 initialize: function(element, delay, callback) {
 this.delay = delay || 0.5;
 this.element = $(element);
 this.callback = callback;
 this.timer = null;
 this.lastValue = $F(this.element); 
 Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
 },
 delayedListener: function(event) {
 if(this.lastValue == $F(this.element)) return;
 if(this.timer) clearTimeout(this.timer);
 this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
 this.lastValue = $F(this.element);
 },
 onTimerEvent: function() {
 this.timer = null;
 this.callback(this.element, $F(this.element));
 }
};

// script.aculo.us slider.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007

// Copyright (c) 2005-2007 Marty Haught, Thomas Fuchs
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

if(!Control) var Control = {};
Control.Slider = Class.create();

// options:
// axis: 'vertical', or 'horizontal' (default)
//
// callbacks:
// onChange(value)
// onSlide(value)
Control.Slider.prototype = {
 initialize: function(handle, track, options) {
 var slider = this;

 if(handle instanceof Array) {
 this.handles = handle.collect( function(e) { return $(e) });
 } else {
 this.handles = [$(handle)];
 }

 this.track = $(track);
 this.options = options || {};

 this.axis = this.options.axis || 'horizontal';
 this.increment = this.options.increment || 1;
 this.step = parseInt(this.options.step || '1');
 this.range = this.options.range || $R(0,1);

 this.value = 0; // assure backwards compat
 this.values = this.handles.map( function() { return 0 });
 this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
 this.options.startSpan = $(this.options.startSpan || null);
 this.options.endSpan = $(this.options.endSpan || null);

 this.restricted = this.options.restricted || false;

 this.maximum = this.options.maximum || this.range.end;
 this.minimum = this.options.minimum || this.range.start;

 // Will be used to align the handle onto the track, if necessary
 this.alignX = parseInt(this.options.alignX || '0');
 this.alignY = parseInt(this.options.alignY || '0');

 this.trackLength = this.maximumOffset() - this.minimumOffset();

 this.handleLength = this.isVertical() ?
 (this.handles[0].offsetHeight != 0 ?
 this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
 (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
 this.handles[0].style.width.replace(/px$/,""));

 this.active = false;
 this.dragging = false;
 this.disabled = false;

 if(this.options.disabled) this.setDisabled();

 // Allowed values array
 this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
 if(this.allowedValues) {
 this.minimum = this.allowedValues.min();
 this.maximum = this.allowedValues.max();
 }

 this.eventMouseDown = this.startDrag.bindAsEventListener(this);
 this.eventMouseUp = this.endDrag.bindAsEventListener(this);
 this.eventMouseMove = this.update.bindAsEventListener(this);

 // Initialize handles in reverse (make sure first handle is active)
 this.handles.each( function(h,i) {
 i = slider.handles.length-1-i;
 slider.setValue(parseFloat(
 (slider.options.sliderValue instanceof Array ?
 slider.options.sliderValue[i] : slider.options.sliderValue) ||
 slider.range.start), i);
 Element.makePositioned(h); // fix IE
 Event.observe(h, "mousedown", slider.eventMouseDown);
 });

 Event.observe(this.track, "mousedown", this.eventMouseDown);
 Event.observe(document, "mouseup", this.eventMouseUp);
 Event.observe(this.track.parentNode.parentNode, "mousemove", this.eventMouseMove);

 this.initialized = true;
 },
 dispose: function() {
 var slider = this;
 Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
 Event.stopObserving(document, "mouseup", this.eventMouseUp);
 Event.stopObserving(this.track.parentNode.parentNode, "mousemove", this.eventMouseMove);
 this.handles.each( function(h) {
 Event.stopObserving(h, "mousedown", slider.eventMouseDown);
 });
 },
 setDisabled: function(){
 this.disabled = true;
 },
 setEnabled: function(){
 this.disabled = false;
 },
 getNearestValue: function(value){
 if(this.allowedValues){
 if(value >= this.allowedValues.max()) return(this.allowedValues.max());
 if(value <= this.allowedValues.min()) return(this.allowedValues.min());

 var offset = Math.abs(this.allowedValues[0] - value);
 var newValue = this.allowedValues[0];
 this.allowedValues.each( function(v) {
 var currentOffset = Math.abs(v - value);
 if(currentOffset <= offset){
 newValue = v;
 offset = currentOffset;
 }
 });
 return newValue;
 }
 if(value > this.range.end) return this.range.end;
 if(value < this.range.start) return this.range.start;
 return value;
 },
 setValue: function(sliderValue, handleIdx){
 if(!this.active) {
 this.activeHandleIdx = handleIdx || 0;
 this.activeHandle = this.handles[this.activeHandleIdx];
 this.updateStyles();
 }
 handleIdx = handleIdx || this.activeHandleIdx || 0;
 if(this.initialized && this.restricted) {
 if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
 sliderValue = this.values[handleIdx-1];
 if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
 sliderValue = this.values[handleIdx+1];
 }
 sliderValue = this.getNearestValue(sliderValue);
 this.values[handleIdx] = sliderValue;
 this.value = this.values[0]; // assure backwards compat

 this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
 this.translateToPx(sliderValue);

 this.drawSpans();
 if(!this.dragging || !this.event) this.updateFinished();
 },
 setValueBy: function(delta, handleIdx) {
 this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
 handleIdx || this.activeHandleIdx || 0);
 },
 translateToPx: function(value) {
 return Math.round(
 ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
 (value - this.range.start)) + "px";
 },
 translateToValue: function(offset) {
 return ((offset/(this.trackLength-this.handleLength) *
 (this.range.end-this.range.start)) + this.range.start);
 },
 getRange: function(range) {
 var v = this.values.sortBy(Prototype.K);
 range = range || 0;
 return $R(v[range],v[range+1]);
 },
 minimumOffset: function(){
 return(this.isVertical() ? this.alignY : this.alignX);
 },
 maximumOffset: function(){
 return(this.isVertical() ?
 (this.track.offsetHeight != 0 ? this.track.offsetHeight :
 this.track.style.height.replace(/px$/,"")) - this.alignY :
 (this.track.offsetWidth != 0 ? this.track.offsetWidth :
 this.track.style.width.replace(/px$/,"")) - this.alignY);
 },
 isVertical: function(){
 return (this.axis == 'vertical');
 },
 drawSpans: function() {
 var slider = this;
 if(this.spans)
 $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
 if(this.options.startSpan)
 this.setSpan(this.options.startSpan,
 $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
 if(this.options.endSpan)
 this.setSpan(this.options.endSpan,
 $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
 },
 setSpan: function(span, range) {
 if(this.isVertical()) {
 span.style.top = this.translateToPx(range.start);
 span.style.height = this.translateToPx(range.end - range.start + this.range.start);
 } else {
 span.style.left = this.translateToPx(range.start);
 span.style.width = this.translateToPx(range.end - range.start + this.range.start);
 }
 },
 updateStyles: function() {
 this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
 Element.addClassName(this.activeHandle, 'selected');
 },
 startDrag: function(event) {
 if(Event.isLeftClick(event)) {
 if(!this.disabled){
 this.active = true;

 var handle = Event.element(event);
 var pointer = [Event.pointerX(event), Event.pointerY(event)];
 var track = handle;
 if(track==this.track) {
 var offsets = Position.cumulativeOffset(this.track);
 this.event = event;
 this.setValue(this.translateToValue(
 (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
 ));
 var offsets = Position.cumulativeOffset(this.activeHandle);
 this.offsetX = (pointer[0] - offsets[0]);
 this.offsetY = (pointer[1] - offsets[1]);
 } else {
 // find the handle (prevents issues with Safari)
 while((this.handles.indexOf(handle) == -1) && handle.parentNode)
 handle = handle.parentNode;

 if(this.handles.indexOf(handle)!=-1) {
 this.activeHandle = handle;
 this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
 this.updateStyles();

 var offsets = Position.cumulativeOffset(this.activeHandle);
 this.offsetX = (pointer[0] - offsets[0]);
 this.offsetY = (pointer[1] - offsets[1]);
 }
 }
 }
 Event.stop(event);
 }
 },
 update: function(event) {
 if(this.active) {
 if(!this.dragging) this.dragging = true;
 this.draw(event);
 if(Prototype.Browser.WebKit) window.scrollBy(0,0);
 Event.stop(event);
 }
 },
 draw: function(event) {
 var pointer = [Event.pointerX(event), Event.pointerY(event)];
 var offsets = Position.cumulativeOffset(this.track);
 pointer[0] -= this.offsetX + offsets[0];
 pointer[1] -= this.offsetY + offsets[1];
 this.event = event;
 this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
 if(this.initialized && this.options.onSlide)
 this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
 },
 endDrag: function(event) {
 if(this.active && this.dragging) {
 this.finishDrag(event, true);
 Event.stop(event);
 }
 this.active = false;
 this.dragging = false;
 },
 finishDrag: function(event, success) {
 this.active = false;
 this.dragging = false;
 this.updateFinished();
 },
 updateFinished: function() {
 if(this.initialized && this.options.onChange)
 this.options.onChange(this.values.length>1 ? this.values : this.value, this);
 this.event = null;
 }
}
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
 */
function popWin(url,win,para) {
 var win = window.open(url,win,para);
 win.focus();
}

function setLocation(url){
 window.location.href = url;
}

function setPLocation(url, setFocus){
 if( setFocus ) {
 window.opener.focus();
 }
 window.opener.location.href = url;
}

function setLanguageCode(code, fromCode){
 //TODO: javascript cookies have different domain and path than php cookies
 var href = window.location.href;
 var after = '', dash;
 if (dash = href.match(/\#(.*)$/)) {
 href = href.replace(/\#(.*)$/, '');
 after = dash[0];
 }

 if (href.match(/[?]/)) {
 var re = /([?&]store=)[a-z0-9_]*/;
 if (href.match(re)) {
 href = href.replace(re, '$1'+code);
 } else {
 href += '&store='+code;
 }

 var re = /([?&]from_store=)[a-z0-9_]*/;
 if (href.match(re)) {
 href = href.replace(re, '');
 }
 } else {
 href += '?store='+code;
 }
 if (typeof(fromCode) != 'undefined') {
 href += '&from_store='+fromCode;
 }
 href += after;

 setLocation(href);
}

/**
 * Add classes to specified elements.
 * Supported classes are: 'odd', 'even', 'first', 'last'
 *
 * @param elements - array of elements to be decorated
 * [@param decorateParams] - array of classes to be set. If omitted, all available will be used
 */
function decorateGeneric(elements, decorateParams)
{
 var allSupportedParams = ['odd', 'even', 'first', 'last'];
 var _decorateParams = {};
 var total = elements.length;

 if (total) {
 // determine params called
 if (typeof(decorateParams) == 'undefined') {
 decorateParams = allSupportedParams;
 }
 if (!decorateParams.length) {
 return;
 }
 for (var k in allSupportedParams) {
 _decorateParams[allSupportedParams[k]] = false;
 }
 for (var k in decorateParams) {
 _decorateParams[decorateParams[k]] = true;
 }

 // decorate elements
 // elements[0].addClassName('first'); // will cause bug in IE (#5587)
 if (_decorateParams.first) {
 Element.addClassName(elements[0], 'first');
 }
 if (_decorateParams.last) {
 Element.addClassName(elements[total-1], 'last');
 }
 for (var i = 0; i < total; i++) {
 if ((i + 1) % 2 == 0) {
 if (_decorateParams.even) {
 Element.addClassName(elements[i], 'even');
 }
 }
 else {
 if (_decorateParams.odd) {
 Element.addClassName(elements[i], 'odd');
 }
 }
 }
 }
}

/**
 * Decorate table rows and cells, tbody etc
 * @see decorateGeneric()
 */
function decorateTable(table, options) {
 var table = $(table);
 if (table) {
 // set default options
 var _options = {
 'tbody' : false,
 'tbody tr' : ['odd', 'even', 'first', 'last'],
 'thead tr' : ['first', 'last'],
 'tfoot tr' : ['first', 'last'],
 'tr td' : ['last']
 };
 // overload options
 if (typeof(options) != 'undefined') {
 for (var k in options) {
 _options[k] = options[k];
 }
 }
 // decorate
 if (_options['tbody']) {
 decorateGeneric(table.select('tbody'), _options['tbody']);
 }
 if (_options['tbody tr']) {
 decorateGeneric(table.select('tbody tr'), _options['tbody tr']);
 }
 if (_options['thead tr']) {
 decorateGeneric(table.select('thead tr'), _options['thead tr']);
 }
 if (_options['tfoot tr']) {
 decorateGeneric(table.select('tfoot tr'), _options['tfoot tr']);
 }
 if (_options['tr td']) {
 var allRows = table.select('tr');
 if (allRows.length) {
 for (var i = 0; i < allRows.length; i++) {
 decorateGeneric(allRows[i].getElementsByTagName('TD'), _options['tr td']);
 }
 }
 }
 }
}

/**
 * Set "odd", "even" and "last" CSS classes for list items
 * @see decorateGeneric()
 */
function decorateList(list, nonRecursive) {
 if ($(list)) {
 if (typeof(nonRecursive) == 'undefined') {
 var items = $(list).select('li')
 }
 else {
 var items = $(list).childElements();
 }
 decorateGeneric(items, ['odd', 'even', 'last']);
 }
}

/**
 * Set "odd", "even" and "last" CSS classes for list items
 * @see decorateGeneric()
 */
function decorateDataList(list) {
 list = $(list);
 if (list) {
 decorateGeneric(list.select('dt'), ['odd', 'even', 'last']);
 decorateGeneric(list.select('dd'), ['odd', 'even', 'last']);
 }
}

/**
 * Formats currency using patern
 * format - JSON (pattern, decimal, decimalsDelimeter, groupsDelimeter)
 * showPlus - true (always show '+'or '-'),
 * false (never show '-' even if number is negative)
 * null (show '-' if number is negative)
 */

function formatCurrency(price, format, showPlus){
 precision = isNaN(format.precision = Math.abs(format.precision)) ? 2 : format.precision;
 requiredPrecision = isNaN(format.requiredPrecision = Math.abs(format.requiredPrecision)) ? 2 : format.requiredPrecision;

 //precision = (precision > requiredPrecision) ? precision : requiredPrecision;
 //for now we don't need this difference so precision is requiredPrecision
 precision = requiredPrecision;

 integerRequired = isNaN(format.integerRequired = Math.abs(format.integerRequired)) ? 1 : format.integerRequired;

 decimalSymbol = format.decimalSymbol == undefined ? "," : format.decimalSymbol;
 groupSymbol = format.groupSymbol == undefined ? "." : format.groupSymbol;
 groupLength = format.groupLength == undefined ? 3 : format.groupLength;

 if (showPlus == undefined || showPlus == true) {
 s = price < 0 ? "-" : ( showPlus ? "+" : "");
 } else if (showPlus == false) {
 s = '';
 }

 i = parseInt(price = Math.abs(+price || 0).toFixed(precision)) + "";
 pad = (i.length < integerRequired) ? (integerRequired - i.length) : 0;
 while (pad) { i = '0' + i; pad--; }

 j = (j = i.length) > groupLength ? j % groupLength : 0;
 re = new RegExp("(\\d{" + groupLength + "})(?=\\d)", "g");

 /**
 * replace(/-/, 0) is only for fixing Safari bug which appears
 * when Math.abs(0).toFixed() executed on "0" number.
 * Result is "0.-0" :(
 */
 r = (j ? i.substr(0, j) + groupSymbol : "") + i.substr(j).replace(re, "$1" + groupSymbol) + (precision ? decimalSymbol + Math.abs(price - i).toFixed(precision).replace(/-/, 0).slice(2) : "")

 if (format.pattern.indexOf('{sign}') == -1) {
 pattern = s + format.pattern;
 } else {
 pattern = format.pattern.replace('{sign}', s);
 }

 return pattern.replace('%s', r).replace(/^\s\s*/, '').replace(/\s\s*$/, '');
};

function expandDetails(el, childClass) {
 if (Element.hasClassName(el,'show-details')) {
 $$(childClass).each(function(item){item.hide()});
 Element.removeClassName(el,'show-details');
 }
 else {
 $$(childClass).each(function(item){item.show()});
 Element.addClassName(el,'show-details');
 }
}

// Version 1.0
var isIE = navigator.appVersion.match(/MSIE/) == "MSIE";

if (!window.Varien)
 var Varien = new Object();

Varien.showLoading = function(){
 Element.show('loading-process');
}
Varien.hideLoading = function(){
 Element.hide('loading-process');
}
Varien.GlobalHandlers = {
 onCreate: function() {
 Varien.showLoading();
 },

 onComplete: function() {
 if(Ajax.activeRequestCount == 0) {
 Varien.hideLoading();
 }
 }
};

Ajax.Responders.register(Varien.GlobalHandlers);

/**
 * Quick Search form client model
 */
Varien.searchForm = Class.create();
Varien.searchForm.prototype = {
 initialize : function(form, field, emptyText){
 this.form = $(form);
 this.field = $(field);
 this.emptyText = emptyText;

 Event.observe(this.form, 'submit', this.submit.bind(this));
 Event.observe(this.field, 'focus', this.focus.bind(this));
 Event.observe(this.field, 'blur', this.blur.bind(this));
 this.blur();
 },

 submit : function(event){
 if (this.field.value == this.emptyText || this.field.value == ''){
 Event.stop(event);
 return false;
 }
 return true;
 },

 focus : function(event){
 if(this.field.value==this.emptyText){
 this.field.value='';
 }

 },

 blur : function(event){
 if(this.field.value==''){
 this.field.value=this.emptyText;
 }
 },

 initAutocomplete : function(url, destinationElement){
 new Ajax.Autocompleter(
 this.field,
 destinationElement,
 url,
 {
 paramName: this.field.name,
 minChars: 2,
 updateElement: this._selectAutocompleteItem.bind(this),
 onShow : function(element, update) { 
 if(!update.style.position || update.style.position=='absolute') {
 update.style.position = 'absolute';
 Position.clone(element, update, {
 setHeight: false, 
 offsetTop: element.offsetHeight
 });
 }
 Effect.Appear(update,{duration:0});
 }

 }
 );
 },

 _selectAutocompleteItem : function(element){
 if(element.title){
 this.field.value = element.title;
 }
 this.form.submit();
 }
}

Varien.Tabs = Class.create();
Varien.Tabs.prototype = {
 initialize: function(selector) {
 var self=this;
 $$(selector+' a').each(this.initTab.bind(this));
 },

 initTab: function(el) {
 el.href = 'javascript:void(0)';
 if ($(el.parentNode).hasClassName('active')) {
 this.showContent(el);
 }
 el.observe('click', this.showContent.bind(this, el));
 },

 showContent: function(a) {
 var li = $(a.parentNode), ul = $(li.parentNode);
 ul.getElementsBySelector('li', 'ol').each(function(el){
 var contents = $(el.id+'_contents');
 if (el==li) {
 el.addClassName('active');
 contents.show();
 } else {
 el.removeClassName('active');
 contents.hide();
 }
 });
 }
}

Varien.DOB = Class.create();
Varien.DOB.prototype = {
 initialize: function(selector, required, format) {
 var el = $$(selector)[0];
 this.day = Element.select($(el), '.dob-day input')[0];
 this.month = Element.select($(el), '.dob-month input')[0];
 this.year = Element.select($(el), '.dob-year input')[0];
 this.dob = Element.select($(el), '.dob-full input')[0];
 this.advice = Element.select($(el), '.validation-advice')[0];
 this.required = required;
 this.format = format;

 this.day.validate = this.validate.bind(this);
 this.month.validate = this.validate.bind(this);
 this.year.validate = this.validate.bind(this);

 this.advice.hide();
 },

 validate: function() {
 var error = false;

 if (this.day.value=='' && this.month.value=='' && this.year.value=='') {
 if (this.required) {
 error = 'This date is a required value.';
 } else {
 this.dob.value = '';
 }
 } else if (this.day.value=='' || this.month.value=='' || this.year.value=='') {
 error = 'Please enter a valid full date.';
 } else {
 var date = new Date();
 if (this.day.value<1 || this.day.value>31) {
 error = 'Please enter a valid day (1-31).';
 } else if (this.month.value<1 || this.month.value>12) {
 error = 'Please enter a valid month (1-12).';
 } else if (this.year.value<1900 || this.year.value>date.getFullYear()) {
 error = 'Please enter a valid year (1900-'+date.getFullYear()+').';
 } else {
 this.dob.value = this.format.replace(/(%m|%b)/i, this.month.value).replace(/(%d|%e)/i, this.day.value).replace(/%y/i, this.year.value);
 var testDOB = this.month.value + '/' + this.day.value + '/'+ this.year.value;
 var test = new Date(testDOB);
 if (isNaN(test)) {
 error = 'Please enter a valid date.';
 }
 }
 }

 if (error !== false) {
 try {
 this.advice.innerHTML = Translator.translate(error);
 }
 catch (e) {
 this.advice.innerHTML = error;
 }
 this.advice.show();
 return false;
 }

 this.advice.hide();
 return true;
 }
}

Validation.addAllThese([
 ['validate-custom', ' ', function(v,elm) {
 return elm.validate();
 }]
]);

function truncateOptions() {
 $$('.truncated').each(function(element){
 Event.observe(element, 'mouseover', function(){
 if (element.down('div.truncated_full_value')) {
 element.down('div.truncated_full_value').addClassName('show')
 }
 });
 Event.observe(element, 'mouseout', function(){
 if (element.down('div.truncated_full_value')) {
 element.down('div.truncated_full_value').removeClassName('show')
 }
 });

 });
}
Event.observe(window, 'load', function(){
 truncateOptions();
});
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
 */
VarienForm = Class.create();
VarienForm.prototype = {
 initialize: function(formId, firstFieldFocus){
 this.form = $(formId);
 if (!this.form) {
 return;
 }
 this.cache = $A();
 this.currLoader = false;
 this.currDataIndex = false;
 this.validator = new Validation(this.form);
 this.elementFocus = this.elementOnFocus.bindAsEventListener(this);
 this.elementBlur = this.elementOnBlur.bindAsEventListener(this);
 this.childLoader = this.onChangeChildLoad.bindAsEventListener(this);
 this.highlightClass = 'highlight';
 this.extraChildParams = '';
 this.firstFieldFocus= firstFieldFocus || false;
 this.bindElements();
 if(this.firstFieldFocus){
 try{
 Form.Element.focus(Form.findFirstElement(this.form))
 }
 catch(e){}
 }
 },

 submit : function(url){
 if(this.validator && this.validator.validate()){
 this.form.submit();
 }
 return false;
 },

 bindElements:function (){
 var elements = Form.getElements(this.form);
 for (var row in elements) {
 if (elements[row].id) {
 Event.observe(elements[row],'focus',this.elementFocus);
 Event.observe(elements[row],'blur',this.elementBlur);
 }
 }
 },

 elementOnFocus: function(event){
 var element = Event.findElement(event, 'fieldset');
 if(element){
 Element.addClassName(element, this.highlightClass);
 }
 },

 elementOnBlur: function(event){
 var element = Event.findElement(event, 'fieldset');
 if(element){
 Element.removeClassName(element, this.highlightClass);
 }
 },

 setElementsRelation: function(parent, child, dataUrl, first){
 if (parent=$(parent)) {
 // TODO: array of relation and caching
 if (!this.cache[parent.id]){
 this.cache[parent.id] = $A();
 this.cache[parent.id]['child'] = child;
 this.cache[parent.id]['dataUrl'] = dataUrl;
 this.cache[parent.id]['data'] = $A();
 this.cache[parent.id]['first'] = first || false;
 }
 Event.observe(parent,'change',this.childLoader);
 }
 },

 onChangeChildLoad: function(event){
 element = Event.element(event);
 this.elementChildLoad(element);
 },

 elementChildLoad: function(element, callback){
 this.callback = callback || false;
 if (element.value) {
 this.currLoader = element.id;
 this.currDataIndex = element.value;
 if (this.cache[element.id]['data'][element.value]) {
 this.setDataToChild(this.cache[element.id]['data'][element.value]);
 }
 else{
 new Ajax.Request(this.cache[this.currLoader]['dataUrl'],{
 method: 'post',
 parameters: {"parent":element.value},
 onComplete: this.reloadChildren.bind(this)
 });
 }
 }
 },

 reloadChildren: function(transport){
 var data = eval('(' + transport.responseText + ')');
 this.cache[this.currLoader]['data'][this.currDataIndex] = data;
 this.setDataToChild(data);
 },

 setDataToChild: function(data){
 if (data.length) {
 var child = $(this.cache[this.currLoader]['child']);
 if (child){
 var html = '<select name="'+child.name+'" id="'+child.id+'" class="'+child.className+'" title="'+child.title+'" '+this.extraChildParams+'>';
 if(this.cache[this.currLoader]['first']){
 html+= '<option value="">'+this.cache[this.currLoader]['first']+'</option>';
 }
 for (var i in data){
 if(data[i].value) {
 html+= '<option value="'+data[i].value+'"';
 if(child.value && (child.value == data[i].value || child.value == data[i].label)){
 html+= ' selected';
 }
 html+='>'+data[i].label+'</option>';
 }
 }
 html+= '</select>';
 Element.insert(child, {before: html});
 Element.remove(child);
 }
 }
 else{
 var child = $(this.cache[this.currLoader]['child']);
 if (child){
 var html = '<input type="text" name="'+child.name+'" id="'+child.id+'" class="'+child.className+'" title="'+child.title+'" '+this.extraChildParams+'>';
 Element.insert(child, {before: html});
 Element.remove(child);
 }
 }

 this.bindElements();
 if (this.callback) {
 this.callback();
 }
 }
}

RegionUpdater = Class.create();
RegionUpdater.prototype = {
 initialize: function (countryEl, regionTextEl, regionSelectEl, regions, disableAction)
 {
 this.countryEl = $(countryEl);
 this.regionTextEl = $(regionTextEl);
 this.regionSelectEl = $(regionSelectEl);
 this.regions = regions;

 this.disableAction = (typeof disableAction=='undefined') ? 'hide' : disableAction;

 if (this.regionSelectEl.options.length<=1) {
 this.update();
 }

 Event.observe(this.countryEl, 'change', this.update.bind(this));
 },

 update: function()
 {
 if (this.regions[this.countryEl.value]) {
 var i, option, region, def;

 if (this.regionTextEl) {
 def = this.regionTextEl.value.toLowerCase();
 this.regionTextEl.value = '';
 }
 if (!def) {
 def = this.regionSelectEl.getAttribute('defaultValue');
 }

 this.regionSelectEl.options.length = 1;
 for (regionId in this.regions[this.countryEl.value]) {
 region = this.regions[this.countryEl.value][regionId];

 option = document.createElement('OPTION');
 option.value = regionId;
 option.text = region.name;

 if (this.regionSelectEl.options.add) {
 this.regionSelectEl.options.add(option);
 } else {
 this.regionSelectEl.appendChild(option);
 }

 if (regionId==def || region.name.toLowerCase()==def || region.code.toLowerCase()==def) {
 this.regionSelectEl.value = regionId;
 }
 }

 if (this.disableAction=='hide') {
 if (this.regionTextEl) {
 this.regionTextEl.style.display = 'none';
 }

 this.regionSelectEl.style.display = '';
 } else if (this.disableAction=='disable') {
 if (this.regionTextEl) {
 this.regionTextEl.disabled = true;
 }
 this.regionSelectEl.disabled = false;
 }
 this.setMarkDisplay(this.regionSelectEl, true);
 } else {
 if (this.disableAction=='hide') {
 if (this.regionTextEl) {
 this.regionTextEl.style.display = '';
 }
 this.regionSelectEl.style.display = 'none';
 Validation.reset(this.regionSelectEl);
 } else if (this.disableAction=='disable') {
 if (this.regionTextEl) {
 this.regionTextEl.disabled = false;
 }
 this.regionSelectEl.disabled = true;
 } else if (this.disableAction=='nullify') {
 this.regionSelectEl.options.length = 1;
 this.regionSelectEl.value = '';
 this.regionSelectEl.selectedIndex = 0;
 this.lastCountryId = '';
 }
 this.setMarkDisplay(this.regionSelectEl, false);
 }
 },

 setMarkDisplay: function(elem, display){
 elem = $(elem);
 var labelElement = elem.up(1).down('label > span.required') || 
 elem.up(2).down('label > span.required') ||
 elem.up(1).down('label.required > em') ||
 elem.up(2).down('label.required > em');
 if(labelElement) {
 display ? labelElement.show() : labelElement.hide();
 }
 }
}
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
 */
function toggleMenu(el, over)
{
 if (over) {
 Element.addClassName(el, 'over');
 }
 else {
 Element.removeClassName(el, 'over');
 }
}

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category Mage
 * @package Js
 * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
 */

var Translate = Class.create();
Translate.prototype = {
 initialize: function(data){
 this.data = $H(data);
 },

 translate : function(){
 var args = arguments;
 var text = arguments[0];

 if(this.data.get(text)){
 return this.data.get(text);
 }
 return text;
 },
 add : function() {
 if (arguments.length > 1) {
 this.data.set(arguments[0], arguments[1]);
 } else if (typeof arguments[0] =='object') {
 $H(arguments[0]).each(function (pair){
 this.data.set(pair.key, pair.value);
 }.bind(this));
 }
 }
}
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
 */
// old school cookie functions grabbed off the web

if (!window.Mage) var Mage = {};

Mage.Cookies = {};
Mage.Cookies.set = function(name, value){
 var argv = arguments;
 var argc = arguments.length;
 var expires = (argc > 2) ? argv[2] : null;
 var path = (argc > 3) ? argv[3] : '/';
 var domain = (argc > 4) ? argv[4] : null;
 var secure = (argc > 5) ? argv[5] : false;
 document.cookie = name + "=" + escape (value) +
 ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
 ((path == null) ? "" : ("; path=" + path)) +
 ((domain == null) ? "" : ("; domain=" + domain)) +
 ((secure == true) ? "; secure" : "");
};

Mage.Cookies.get = function(name){
 var arg = name + "=";
 var alen = arg.length;
 var clen = document.cookie.length;
 var i = 0;
 var j = 0;
 while(i < clen){
 j = i + alen;
 if (document.cookie.substring(i, j) == arg)
 return Mage.Cookies.getCookieVal(j);
 i = document.cookie.indexOf(" ", i) + 1;
 if(i == 0)
 break;
 }
 return null;
};

Mage.Cookies.clear = function(name) {
 if(Mage.Cookies.get(name)){
 document.cookie = name + "=" +
 "; expires=Thu, 01-Jan-70 00:00:01 GMT";
 }
};

Mage.Cookies.getCookieVal = function(offset){
 var endstr = document.cookie.indexOf(";", offset);
 if(endstr == -1){
 endstr = document.cookie.length;
 }
 return unescape(document.cookie.substring(offset, endstr));
};
/*
 * Ext Core Library 3.0
 * http://extjs.com/
 * Copyright(c) 2006-2009, Ext JS, LLC.
 * 
 * MIT Licensed - http://extjs.com/license/mit.txt
 * 
 */
window.undefined=window.undefined;Ext={version:"3.0"};Ext.apply=function(d,e,b){if(b){Ext.apply(d,b)}if(d&&e&&typeof e=="object"){for(var a in e){d[a]=e[a]}}return d};(function(){var d=0,r=navigator.userAgent.toLowerCase(),w=function(e){return e.test(r)},k=document.compatMode=="CSS1Compat",y=w(/opera/),g=w(/chrome/),s=w(/webkit/),v=!g&&w(/safari/),a=v&&w(/version\/3/),z=v&&w(/version\/4/),q=!y&&w(/msie/),o=q&&w(/msie 7/),n=q&&w(/msie 8/),p=q&&!o&&!n,m=!s&&w(/gecko/),b=m&&w(/rv:1\.9/),t=q&&!k,x=w(/windows|win32/),j=w(/macintosh|mac os x/),h=w(/adobeair/),l=w(/linux/),c=/^https/i.test(window.location.protocol);if(p){try{document.execCommand("BackgroundImageCache",false,true)}catch(u){}}Ext.apply(Ext,{isStrict:k,isSecure:c,isReady:false,enableGarbageCollector:true,enableListenerCollection:false,USE_NATIVE_JSON:false,applyIf:function(A,B){if(A){for(var e in B){if(Ext.isEmpty(A[e])){A[e]=B[e]}}}return A},id:function(e,A){return(e=Ext.getDom(e)||{}).id=e.id||(A||"ext-gen")+(++d)},extend:function(){var A=function(C){for(var B in C){this[B]=C[B]}};var e=Object.prototype.constructor;return function(H,D,G){if(Ext.isObject(D)){G=D;D=H;H=G.constructor!=e?G.constructor:function(){D.apply(this,arguments)}}var C=function(){},E,B=D.prototype;C.prototype=B;E=H.prototype=new C();E.constructor=H;H.superclass=B;if(B.constructor==e){B.constructor=D}H.override=function(F){Ext.override(H,F)};E.superclass=E.supr=(function(){return B});E.override=A;Ext.override(H,G);H.extend=function(F){Ext.extend(H,F)};return H}}(),override:function(e,B){if(B){var A=e.prototype;Ext.apply(A,B);if(Ext.isIE&&B.toString!=e.toString){A.toString=B.toString}}},namespace:function(){var A,e;Ext.each(arguments,function(B){e=B.split(".");A=window[e[0]]=window[e[0]]||{};Ext.each(e.slice(1),function(C){A=A[C]=A[C]||{}})});return A},urlEncode:function(F,E){var C,A=[],B,D=encodeURIComponent;for(B in F){C=typeof F[B]=="undefined";Ext.each(C?B:F[B],function(G,e){A.push("&",D(B),"=",(G!=B||!C)?D(G):"")})}if(!E){A.shift();E=""}return E+A.join("")},urlDecode:function(B,A){var E={},D=B.split("&"),F=decodeURIComponent,e,C;Ext.each(D,function(G){G=G.split("=");e=F(G[0]);C=F(G[1]);E[e]=A||!E[e]?C:[].concat(E[e]).concat(C)});return E},toArray:function(){return q?function(e,C,A,B){B=[];Ext.each(e,function(D){B.push(D)});return B.slice(C||0,A||B.length)}:function(e,B,A){return Array.prototype.slice.call(e,B||0,A||e.length)}}(),each:function(D,C,B){if(Ext.isEmpty(D,true)){return}if(typeof D.length=="undefined"||Ext.isPrimitive(D)){D=[D]}for(var A=0,e=D.length;A<e;A++){if(C.call(B||D[A],D[A],A,D)===false){return A}}},getDom:function(e){if(!e||!document){return null}return e.dom?e.dom:(typeof e=="string"?document.getElementById(e):e)},getBody:function(){return Ext.get(document.body||document.documentElement)},removeNode:q?function(){var e;return function(A){if(A&&A.tagName!="BODY"){e=e||document.createElement("div");e.appendChild(A);e.innerHTML=""}}}():function(e){if(e&&e.parentNode&&e.tagName!="BODY"){e.parentNode.removeChild(e)}},isEmpty:function(A,e){return A===null||A===undefined||((Ext.isArray(A)&&!A.length))||(!e?A==="":false)},isArray:function(e){return Object.prototype.toString.apply(e)==="[object Array]"},isObject:function(e){return e&&typeof e=="object"},isPrimitive:function(e){var A=typeof e;return A=="string"||A=="number"||A=="boolean"},isFunction:function(e){return typeof e=="function"},isOpera:y,isWebKit:s,isChrome:g,isSafari:v,isSafari3:a,isSafari4:z,isSafari2:v&&!(a||z),isIE:q,isIE6:p,isIE7:o,isIE8:n,isGecko:m,isGecko2:m&&!b,isGecko3:b,isBorderBox:t,isLinux:l,isWindows:x,isMac:j,isAir:h});Ext.ns=Ext.namespace})();Ext.ns("Ext","Ext.util","Ext.lib","Ext.data");Ext.apply(Function.prototype,{createInterceptor:function(b,a){var c=this;return !Ext.isFunction(b)?this:function(){var e=this,d=arguments;b.target=e;b.method=c;return(b.apply(a||e||window,d)!==false)?c.apply(e||window,d):null}},createCallback:function(){var a=arguments,b=this;return function(){return b.apply(window,a)}},createDelegate:function(c,b,a){var d=this;return function(){var g=b||arguments;if(a===true){g=Array.prototype.slice.call(arguments,0);g=g.concat(b)}else{if(typeof a=="number"){g=Array.prototype.slice.call(arguments,0);var e=[a,0].concat(b);Array.prototype.splice.apply(g,e)}}return d.apply(c||window,g)}},defer:function(c,e,b,a){var d=this.createDelegate(e,b,a);if(c>0){return setTimeout(d,c)}d();return 0}});Ext.applyIf(String,{format:function(b){var a=Ext.toArray(arguments,1);return b.replace(/\{(\d+)\}/g,function(c,d){return a[d]})}});Ext.applyIf(Array.prototype,{indexOf:function(c){for(var b=0,a=this.length;b<a;b++){if(this[b]==c){return b}}return -1},remove:function(b){var a=this.indexOf(b);if(a!=-1){this.splice(a,1)}return this}});Ext.util.TaskRunner=function(e){e=e||10;var g=[],a=[],b=0,h=false,d=function(){h=false;clearInterval(b);b=0},j=function(){if(!h){h=true;b=setInterval(k,e)}},c=function(l){a.push(l);if(l.onStop){l.onStop.apply(l.scope||l)}},k=function(){var n=a.length,p=new Date().getTime();if(n>0){for(var r=0;r<n;r++){g.remove(a[r])}a=[];if(g.length<1){d();return}}for(var r=0,q,m,o,l=g.length;r<l;++r){q=g[r];m=p-q.taskRunTime;if(q.interval<=m){o=q.run.apply(q.scope||q,q.args||[++q.taskRunCount]);q.taskRunTime=p;if(o===false||q.taskRunCount===q.repeat){c(q);return}}if(q.duration&&q.duration<=(p-q.taskStartTime)){c(q)}}};this.start=function(l){g.push(l);l.taskStartTime=new Date().getTime();l.taskRunTime=0;l.taskRunCount=0;j();return l};this.stop=function(l){c(l);return l};this.stopAll=function(){d();for(var m=0,l=g.length;m<l;m++){if(g[m].onStop){g[m].onStop()}}g=[];a=[]}};Ext.TaskMgr=new Ext.util.TaskRunner();(function(){var b;function c(d){if(!b){b=new Ext.Element.Flyweight()}b.dom=d;return b}(function(){var g=document,d=g.compatMode=="CSS1Compat",e=Math.max,h=parseInt;Ext.lib.Dom={isAncestor:function(k,l){var j=false;k=Ext.getDom(k);l=Ext.getDom(l);if(k&&l){if(k.contains){return k.contains(l)}else{if(k.compareDocumentPosition){return !!(k.compareDocumentPosition(l)&16)}else{while(l=l.parentNode){j=l==k||j}}}}return j},getViewWidth:function(j){return j?this.getDocumentWidth():this.getViewportWidth()},getViewHeight:function(j){return j?this.getDocumentHeight():this.getViewportHeight()},getDocumentHeight:function(){return e(!d?g.body.scrollHeight:g.documentElement.scrollHeight,this.getViewportHeight())},getDocumentWidth:function(){return e(!d?g.body.scrollWidth:g.documentElement.scrollWidth,this.getViewportWidth())},getViewportHeight:function(){return Ext.isIE?(Ext.isStrict?g.documentElement.clientHeight:g.body.clientHeight):self.innerHeight},getViewportWidth:function(){return !Ext.isStrict&&!Ext.isOpera?g.body.clientWidth:Ext.isIE?g.documentElement.clientWidth:self.innerWidth},getY:function(j){return this.getXY(j)[1]},getX:function(j){return this.getXY(j)[0]},getXY:function(l){var k,r,t,w,m,n,v=0,s=0,u,j,o=(g.body||g.documentElement),q=[0,0];l=Ext.getDom(l);if(l!=o){if(l.getBoundingClientRect){t=l.getBoundingClientRect();u=c(document).getScroll();q=[t.left+u.left,t.top+u.top]}else{k=l;j=c(l).isStyle("position","absolute");while(k){r=c(k);v+=k.offsetLeft;s+=k.offsetTop;j=j||r.isStyle("position","absolute");if(Ext.isGecko){s+=w=h(r.getStyle("borderTopWidth"),10)||0;v+=m=h(r.getStyle("borderLeftWidth"),10)||0;if(k!=l&&!r.isStyle("overflow","visible")){v+=m;s+=w}}k=k.offsetParent}if(Ext.isSafari&&j){v-=o.offsetLeft;s-=o.offsetTop}if(Ext.isGecko&&!j){n=c(o);v+=h(n.getStyle("borderLeftWidth"),10)||0;s+=h(n.getStyle("borderTopWidth"),10)||0}k=l.parentNode;while(k&&k!=o){if(!Ext.isOpera||(k.tagName!="TR"&&!c(k).isStyle("display","inline"))){v-=k.scrollLeft;s-=k.scrollTop}k=k.parentNode}q=[v,s]}}return q},setXY:function(k,l){(k=Ext.fly(k,"_setXY")).position();var m=k.translatePoints(l),j=k.dom.style,n;for(n in m){if(!isNaN(m[n])){j[n]=m[n]+"px"}}},setX:function(k,j){this.setXY(k,[j,false])},setY:function(j,k){this.setXY(j,[false,k])}}})();Ext.lib.Event=function(){var x=false,v=[],g=[],B=0,r=[],d,E=false,l=window,H=document,m=200,t=20,C=0,s=1,j=2,n=3,u=3,y=4,e=function(){var I;if(l.addEventListener){I=function(M,K,L,J){if(K=="mouseenter"){L=L.createInterceptor(p);M.addEventListener("mouseover",L,(J))}else{if(K=="mouseleave"){L=L.createInterceptor(p);M.addEventListener("mouseout",L,(J))}else{M.addEventListener(K,L,(J))}}return L}}else{if(l.attachEvent){I=function(M,K,L,J){M.attachEvent("on"+K,L);return L}}else{I=function(){}}}return I}(),h=function(){var I;if(l.removeEventListener){I=function(M,K,L,J){if(K=="mouseenter"){K="mouseover"}else{if(K=="mouseleave"){K="mouseout"}}M.removeEventListener(K,L,(J))}}else{if(l.detachEvent){I=function(L,J,K){L.detachEvent("on"+J,K)}}else{I=function(){}}}return I}();var D=Ext.isGecko?function(I){return Object.prototype.toString.call(I)=="[object XULElement]"}:function(){};var q=Ext.isGecko?function(I){try{return I.nodeType==3}catch(J){return false}}:function(I){return I.nodeType==3};function p(J){var I=z.getRelatedTarget(J);return !(D(I)||w(J.currentTarget,I))}function w(I,K){if(I&&I.firstChild){while(K){if(K===I){return true}try{K=K.parentNode}catch(J){return false}if(K&&(K.nodeType!=1)){K=null}}}return false}function A(L,I,K){var J=-1;Ext.each(v,function(M,N){if(M&&M[j]==K&&M[C]==L&&M[s]==I){J=N}});return J}function F(){var I=false,L=[],J,K=!x||(B>0);if(!E){E=true;Ext.each(r,function(N,O,M){if(N&&(J=H.getElementById(N.id))){if(!N.checkReady||x||J.nextSibling||(H&&H.body)){J=N.override?(N.override===true?N.obj:N.override):J;N.fn.call(J,N.obj);r[O]=null}else{L.push(item)}}});B=(L.length==0)?0:B-1;if(K){o()}else{clearInterval(d);d=null}I=!(E=false)}return I}function o(){if(!d){var I=function(){F()};d=setInterval(I,t)}}function G(){var I=Ext.fly(H).getScroll();return[I.top,I.top]}function k(I,J){I=I.browserEvent||I;var K=I["page"+J];if(!K&&0!=K){K=I["client"+J]||0;if(Ext.isIE){K+=G()[J=="X"?0:1]}}return K}var z={onAvailable:function(K,I,L,J){r.push({id:K,fn:I,obj:L,override:J,checkReady:false});B=m;o()},addListener:function(L,I,K){var J;L=Ext.getDom(L);if(L&&K){if("unload"==I){J=!!(g[g.length]=[L,I,K])}else{v.push([L,I,K,J=e(L,I,K,false)])}}return !!J},removeListener:function(N,J,M){var L=false,K,I;N=Ext.getDom(N);if(!M){L=this.purgeElement(N,false,J)}else{if("unload"==J){Ext.each(g,function(P,Q,O){if(P&&P[0]==N&&P[1]==J&&P[2]==M){g.splice(Q,1);L=true}})}else{K=arguments[3]||A(N,J,M);I=v[K];if(N&&I){h(N,J,I[n],false);I[n]=I[j]=null;v.splice(K,1);L=true}}}return L},getTarget:function(I){I=I.browserEvent||I;return this.resolveTextNode(I.target||I.srcElement)},resolveTextNode:function(I){return I&&!D(I)&&q(I)?I.parentNode:I},getRelatedTarget:function(I){I=I.browserEvent||I;return this.resolveTextNode(I.relatedTarget||(I.type=="mouseout"?I.toElement:I.type=="mouseover"?I.fromElement:null))},getPageX:function(I){return k(I,"X")},getPageY:function(I){return k(I,"Y")},getXY:function(I){return[this.getPageX(I),this.getPageY(I)]},stopEvent:function(I){this.stopPropagation(I);this.preventDefault(I)},stopPropagation:function(I){I=I.browserEvent||I;if(I.stopPropagation){I.stopPropagation()}else{I.cancelBubble=true}},preventDefault:function(I){I=I.browserEvent||I;if(I.preventDefault){I.preventDefault()}else{I.returnValue=false}},getEvent:function(I){I=I||l.event;if(!I){var J=this.getEvent.caller;while(J){I=J.arguments[0];if(I&&Event==I.constructor){break}J=J.caller}}return I},getCharCode:function(I){I=I.browserEvent||I;return I.charCode||I.keyCode||0},_load:function(J){x=true;var I=Ext.lib.Event;if(Ext.isIE&&J!==true){h(l,"load",arguments.callee)}},purgeElement:function(J,L,I){var K=this;Ext.each(K.getListeners(J,I),function(M){if(M){K.removeListener(J,M.type,M.fn)}});if(L&&J&&J.childNodes){Ext.each(J.childNodes,function(M){K.purgeElement(M,L,I)})}},getListeners:function(L,J){var M=this,K=[],I;if(J){I=J=="unload"?g:v}else{I=v.concat(g)}Ext.each(I,function(N,O){if(N&&N[C]==L&&(!J||J==N[s])){K.push({type:N[s],fn:N[j],obj:N[u],adjust:N[y],index:O})}});return K.length?K:null},_unload:function(P){var O=Ext.lib.Event,M,L,J,I,K,N;Ext.each(g,function(Q){if(Q){try{N=Q[y]?(Q[y]===true?Q[u]:Q[y]):l;Q[j].call(N,O.getEvent(R),Q[u])}catch(R){}}});g=null;if(v&&(L=v.length)){while(L){if(J=v[K=--L]){O.removeListener(J[C],J[s],J[j],K)}}}h(l,"unload",O._unload)}};z.on=z.addListener;z.un=z.removeListener;if(H&&H.body){z._load(true)}else{e(l,"load",z._load)}e(l,"unload",z._unload);F();return z}();Ext.lib.Ajax=function(){var g=["MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];function h(t){var s=t.conn,u;function r(v,w){for(u in w){if(w.hasOwnProperty(u)){v.setRequestHeader(u,w[u])}}}if(l.defaultHeaders){r(s,l.defaultHeaders)}if(l.headers){r(s,l.headers);l.headers=null}}function d(u,t,s,r){return{tId:u,status:s?-1:0,statusText:s?"transaction aborted":"communication failure",isAbort:true,isTimeout:true,argument:t}}function k(r,s){(l.headers=l.headers||{})[r]=s}function p(w,u){var r={},s,t=w.conn;try{s=w.conn.getAllResponseHeaders();Ext.each(s.split("\n"),function(x){var y=x.indexOf(":");r[x.substr(0,y)]=x.substr(y+1)})}catch(v){}return{tId:w.tId,status:t.status,statusText:t.statusText,getResponseHeader:function(x){return r[x]},getAllResponseHeaders:function(){return s},responseText:t.responseText,responseXML:t.responseXML,argument:u}}function o(r){r.conn=null;r=null}function e(w,x,s,r){if(!x){o(w);return}var u,t;try{if(w.conn.status!==undefined&&w.conn.status!=0){u=w.conn.status}else{u=13030}}catch(v){u=13030}if((u>=200&&u<300)||(Ext.isIE&&u==1223)){t=p(w,x.argument);if(x.success){if(!x.scope){x.success(t)}else{x.success.apply(x.scope,[t])}}}else{switch(u){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:t=d(w.tId,x.argument,(s?s:false),r);if(x.failure){if(!x.scope){x.failure(t)}else{x.failure.apply(x.scope,[t])}}break;default:t=p(w,x.argument);if(x.failure){if(!x.scope){x.failure(t)}else{x.failure.apply(x.scope,[t])}}}}o(w);t=null}function n(t,w){w=w||{};var r=t.conn,v=t.tId,s=l.poll,u=w.timeout||null;if(u){l.timeout[v]=setTimeout(function(){l.abort(t,w,true)},u)}s[v]=setInterval(function(){if(r&&r.readyState==4){clearInterval(s[v]);s[v]=null;if(u){clearTimeout(l.timeout[v]);l.timeout[v]=null}e(t,w)}},l.pollInterval)}function j(v,s,u,r){var t=m()||null;if(t){t.conn.open(v,s,true);if(l.useDefaultXhrHeader){k("X-Requested-With",l.defaultXhrHeader)}if(r&&l.useDefaultHeader&&(!l.headers||!l.headers["Content-Type"])){k("Content-Type",l.defaultPostHeader)}if(l.defaultHeaders||l.headers){h(t)}n(t,u);t.conn.send(r||null)}return t}function m(){var s;try{if(s=q(l.transactionId)){l.transactionId++}}catch(r){}finally{return s}}function q(u){var r;try{r=new XMLHttpRequest()}catch(t){for(var s=0;s<g.length;++s){try{r=new ActiveXObject(g[s]);break}catch(t){}}}finally{return{conn:r,tId:u}}}var l={request:function(y,w,r,x,s){if(s){var v=this,u=s.xmlData,t=s.jsonData;Ext.applyIf(v,s);if(u||t){k("Content-Type",u?"text/xml":"application/json");x=u||(Ext.isObject(t)?Ext.encode(t):t)}}return j(y||s.method||"POST",w,r,x)},serializeForm:function(s){var t=s.elements||(document.forms[s]||Ext.getDom(s)).elements,z=false,y=encodeURIComponent,w,A,r,u,v="",x;Ext.each(t,function(B){r=B.name;x=B.type;if(!B.disabled&&r){if(/select-(one|multiple)/i.test(x)){Ext.each(B.options,function(C){if(C.selected){v+=String.format("{0}={1}&",y(r),(C.hasAttribute?C.hasAttribute("value"):C.getAttribute("value")!==null)?C.value:C.text)}})}else{if(!/file|undefined|reset|button/i.test(x)){if(!(/radio|checkbox/i.test(x)&&!B.checked)&&!(x=="submit"&&z)){v+=y(r)+"="+y(B.value)+"&";z=/submit/i.test(x)}}}}});return v.substr(0,v.length-1)},useDefaultHeader:true,defaultPostHeader:"application/x-www-form-urlencoded; charset=UTF-8",useDefaultXhrHeader:true,defaultXhrHeader:"XMLHttpRequest",poll:{},timeout:{},pollInterval:50,transactionId:0,abort:function(u,w,r){var t=this,v=u.tId,s=false;if(t.isCallInProgress(u)){u.conn.abort();clearInterval(t.poll[v]);t.poll[v]=null;if(r){t.timeout[v]=null}e(u,w,(s=true),r)}return s},isCallInProgress:function(r){return r.conn&&!{0:true,4:true}[r.conn.readyState]}};return l}();(function(){var h=Ext.lib,k=/width|height|opacity|padding/i,g=/^((width|height)|(top|left))$/,d=/width|height|top$|bottom$|left$|right$/i,j=/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i,l=function(m){return typeof m!=="undefined"},e=function(){return new Date()};h.Anim={motion:function(p,n,q,r,m,o){return this.run(p,n,q,r,m,o,Ext.lib.Motion)},run:function(q,n,s,t,m,p,o){o=o||Ext.lib.AnimBase;if(typeof t=="string"){t=Ext.lib.Easing[t]}var r=new o(q,n,s,t);r.animateX(function(){if(Ext.isFunction(m)){m.call(p)}});return r}};h.AnimBase=function(n,m,o,p){if(n){this.init(n,m,o,p)}};h.AnimBase.prototype={doMethod:function(m,p,n){var o=this;return o.method(o.curFrame,p,n-p,o.totalFrames)},setAttr:function(m,o,n){if(k.test(m)&&o<0){o=0}Ext.fly(this.el,"_anim").setStyle(m,o+n)},getAttr:function(m){var o=Ext.fly(this.el),p=o.getStyle(m),n=g.exec(m)||[];if(p!=="auto"&&!j.test(p)){return parseFloat(p)}return(!!(n[2])||(o.getStyle("position")=="absolute"&&!!(n[3])))?o.dom["offset"+n[0].charAt(0).toUpperCase()+n[0].substr(1)]:0},getDefaultUnit:function(m){return d.test(m)?"px":""},animateX:function(p,m){var n=this,o=function(){n.onComplete.removeListener(o);if(Ext.isFunction(p)){p.call(m||n,n)}};n.onComplete.addListener(o,n);n.animate()},setRunAttr:function(p){var r=this,s=this.attributes[p],t=s.to,q=s.by,u=s.from,v=s.unit,n=(this.runAttrs[p]={}),o;if(!l(t)&&!l(q)){return false}var m=l(u)?u:r.getAttr(p);if(l(t)){o=t}else{if(l(q)){if(Ext.isArray(m)){o=[];Ext.each(m,function(w,x){o[x]=w+q[x]})}else{o=m+q}}}Ext.apply(n,{start:m,end:o,unit:l(v)?v:r.getDefaultUnit(p)})},init:function(n,r,q,m){var t=this,p=0,u=h.AnimMgr;Ext.apply(t,{isAnimated:false,startTime:null,el:Ext.getDom(n),attributes:r||{},duration:q||1,method:m||h.Easing.easeNone,useSec:true,curFrame:0,totalFrames:u.fps,runAttrs:{},animate:function(){var w=this,x=w.duration;if(w.isAnimated){return false}w.curFrame=0;w.totalFrames=w.useSec?Math.ceil(u.fps*x):x;u.registerElement(w)},stop:function(w){var x=this;if(w){x.curFrame=x.totalFrames;x._onTween.fire()}u.stop(x)}});var v=function(){var x=this,w;x.onStart.fire();x.runAttrs={};for(w in this.attributes){this.setRunAttr(w)}x.isAnimated=true;x.startTime=e();p=0};var s=function(){var x=this;x.onTween.fire({duration:e()-x.startTime,curFrame:x.curFrame});var y=x.runAttrs;for(var w in y){this.setAttr(w,x.doMethod(w,y[w].start,y[w].end),y[w].unit)}++p};var o=function(){var w=this,y=(e()-w.startTime)/1000,x={duration:y,frames:p,fps:p/y};w.isAnimated=false;p=0;w.onComplete.fire(x)};t.onStart=new Ext.util.Event(t);t.onTween=new Ext.util.Event(t);t.onComplete=new Ext.util.Event(t);(t._onStart=new Ext.util.Event(t)).addListener(v);(t._onTween=new Ext.util.Event(t)).addListener(s);(t._onComplete=new Ext.util.Event(t)).addListener(o)}};Ext.lib.AnimMgr=new function(){var q=this,o=null,n=[],m=0;Ext.apply(q,{fps:1000,delay:1,registerElement:function(s){n.push(s);++m;s._onStart.fire();q.start()},unRegister:function(t,s){t._onComplete.fire();s=s||r(t);if(s!=-1){n.splice(s,1)}if(--m<=0){q.stop()}},start:function(){if(o===null){o=setInterval(q.run,q.delay)}},stop:function(u){if(!u){clearInterval(o);for(var t=0,s=n.length;t<s;++t){if(n[0].isAnimated){q.unRegister(n[0],0)}}n=[];o=null;m=0}else{q.unRegister(u)}},run:function(){var s;Ext.each(n,function(t){if(t&&t.isAnimated){s=t.totalFrames;if(t.curFrame<s||s===null){++t.curFrame;if(t.useSec){p(t)}t._onTween.fire()}else{q.stop(t)}}},q)}});var r=function(t){var s=-1;Ext.each(n,function(v,u){if(v==t){s=u;return false}});return s};var p=function(t){var x=t.totalFrames,w=t.curFrame,v=t.duration,u=(w*v*1000/x),s=(e()-t.startTime),y=0;if(s<v*1000){y=Math.round((s/u-1)*w)}else{y=x-(w+1)}if(y>0&&isFinite(y)){if(t.curFrame+y>=x){y=x-(w+1)}t.curFrame+=y}}};h.Bezier=new function(){this.getPosition=function(r,q){var u=r.length,p=[],s=1-q,o,m;for(o=0;o<u;++o){p[o]=[r[o][0],r[o][1]]}for(m=1;m<u;++m){for(o=0;o<u-m;++o){p[o][0]=s*p[o][0]+q*p[parseInt(o+1,10)][0];p[o][1]=s*p[o][1]+q*p[parseInt(o+1,10)][1]}}return[p[0][0],p[0][1]]}};h.Easing={easeNone:function(n,m,p,o){return p*n/o+m},easeIn:function(n,m,p,o){return p*(n/=o)*n+m},easeOut:function(n,m,p,o){return -p*(n/=o)*(n-2)+m}};(function(){h.Motion=function(r,q,s,t){if(r){h.Motion.superclass.constructor.call(this,r,q,s,t)}};Ext.extend(h.Motion,Ext.lib.AnimBase);var p=h.Motion.superclass,o=h.Motion.prototype,n=/^points$/i;Ext.apply(h.Motion.prototype,{setAttr:function(q,u,t){var s=this,r=p.setAttr;if(n.test(q)){t=t||"px";r.call(s,"left",u[0],t);r.call(s,"top",u[1],t)}else{r.call(s,q,u,t)}},getAttr:function(q){var s=this,r=p.getAttr;return n.test(q)?[r.call(s,"left"),r.call(s,"top")]:r.call(s,q)},doMethod:function(q,t,r){var s=this;return n.test(q)?h.Bezier.getPosition(s.runAttrs[q],s.method(s.curFrame,0,100,s.totalFrames)/100):p.doMethod.call(s,q,t,r)},setRunAttr:function(x){if(n.test(x)){var z=this,s=this.el,C=this.attributes.points,v=C.control||[],A=C.from,B=C.to,y=C.by,D=h.Dom,r,u,t,w,q;if(v.length>0&&!Ext.isArray(v[0])){v=[v]}else{}Ext.fly(s,"_anim").position();D.setXY(s,l(A)?A:D.getXY(s));r=z.getAttr("points");if(l(B)){t=m.call(z,B,r);for(u=0,w=v.length;u<w;++u){v[u]=m.call(z,v[u],r)}}else{if(l(y)){t=[r[0]+y[0],r[1]+y[1]];for(u=0,w=v.length;u<w;++u){v[u]=[r[0]+v[u][0],r[1]+v[u][1]]}}}q=this.runAttrs[x]=[r];if(v.length>0){q=q.concat(v)}q[q.length]=t}else{p.setRunAttr.call(this,x)}}});var m=function(q,s){var r=h.Dom.getXY(this.el);return[q[0]-r[0]+s[0],q[1]-r[1]+s[1]]}})()})();(function(){var d=Math.abs,k=Math.PI,j=Math.asin,h=Math.pow,e=Math.sin,g=Ext.lib;Ext.apply(g.Easing,{easeBoth:function(m,l,o,n){return((m/=n/2)<1)?o/2*m*m+l:-o/2*((--m)*(m-2)-1)+l},easeInStrong:function(m,l,o,n){return o*(m/=n)*m*m*m+l},easeOutStrong:function(m,l,o,n){return -o*((m=m/n-1)*m*m*m-1)+l},easeBothStrong:function(m,l,o,n){return((m/=n/2)<1)?o/2*m*m*m*m+l:-o/2*((m-=2)*m*m*m-2)+l},elasticIn:function(n,l,u,r,m,q){if(n==0||(n/=r)==1){return n==0?l:l+u}q=q||(r*0.3);var o;if(m>=d(u)){o=q/(2*k)*j(u/m)}else{m=u;o=q/4}return -(m*h(2,10*(n-=1))*e((n*r-o)*(2*k)/q))+l},elasticOut:function(n,l,u,r,m,q){if(n==0||(n/=r)==1){return n==0?l:l+u}q=q||(r*0.3);var o;if(m>=d(u)){o=q/(2*k)*j(u/m)}else{m=u;o=q/4}return m*h(2,-10*n)*e((n*r-o)*(2*k)/q)+u+l},elasticBoth:function(n,l,u,r,m,q){if(n==0||(n/=r/2)==2){return n==0?l:l+u}q=q||(r*(0.3*1.5));var o;if(m>=d(u)){o=q/(2*k)*j(u/m)}else{m=u;o=q/4}return n<1?-0.5*(m*h(2,10*(n-=1))*e((n*r-o)*(2*k)/q))+l:m*h(2,-10*(n-=1))*e((n*r-o)*(2*k)/q)*0.5+u+l},backIn:function(m,l,p,o,n){n=n||1.70158;return p*(m/=o)*m*((n+1)*m-n)+l},backOut:function(m,l,p,o,n){if(!n){n=1.70158}return p*((m=m/o-1)*m*((n+1)*m+n)+1)+l},backBoth:function(m,l,p,o,n){n=n||1.70158;return((m/=o/2)<1)?p/2*(m*m*(((n*=(1.525))+1)*m-n))+l:p/2*((m-=2)*m*(((n*=(1.525))+1)*m+n)+2)+l},bounceIn:function(m,l,o,n){return o-g.Easing.bounceOut(n-m,0,o,n)+l},bounceOut:function(m,l,o,n){if((m/=n)<(1/2.75)){return o*(7.5625*m*m)+l}else{if(m<(2/2.75)){return o*(7.5625*(m-=(1.5/2.75))*m+0.75)+l}else{if(m<(2.5/2.75)){return o*(7.5625*(m-=(2.25/2.75))*m+0.9375)+l}}}return o*(7.5625*(m-=(2.625/2.75))*m+0.984375)+l},bounceBoth:function(m,l,o,n){return(m<n/2)?g.Easing.bounceIn(m*2,0,o,n)*0.5+l:g.Easing.bounceOut(m*2-n,0,o,n)*0.5+o*0.5+l}})})();(function(){var j=Ext.lib;j.Anim.color=function(r,p,s,t,o,q){return j.Anim.run(r,p,s,t,o,q,j.ColorAnim)};j.ColorAnim=function(p,o,q,r){j.ColorAnim.superclass.constructor.call(this,p,o,q,r)};Ext.extend(j.ColorAnim,j.AnimBase);var l=j.ColorAnim.superclass,k=/color$/i,g=/^transparent|rgba\(0, 0, 0, 0\)$/,n=/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,d=/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,e=/^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i,h=function(o){return typeof o!=="undefined"};function m(p){var r=parseInt,q,o=null,t;if(p.length==3){return p}Ext.each([d,n,e],function(u,s){q=(s%2==0)?16:10;t=u.exec(p);if(t&&t.length==4){o=[r(t[1],q),r(t[2],q),r(t[3],q)];return false}});return o}Ext.apply(j.ColorAnim.prototype,{getAttr:function(o){var q=this,p=q.el,r;if(k.test(o)){while(p&&g.test(r=Ext.fly(p).getStyle(o))){p=p.parentNode;r="fff"}}else{r=l.getAttr.call(q,o)}return r},doMethod:function(o,t,p){var r=this,s,q=Math.floor;if(k.test(o)){s=[];Ext.each(t,function(u,w){s[w]=l.doMethod.call(r,o,u,p[w])});s="rgb("+q(s[0])+","+q(s[1])+","+q(s[2])+")"}else{s=l.doMethod.call(r,o,t,p)}return s},setRunAttr:function(o){var r=this,q=r.attributes[o],v=q.to,s=q.by,t;l.setRunAttr.call(r,o);t=r.runAttrs[o];if(k.test(o)){var u=m(t.start),p=m(t.end);if(!h(v)&&h(s)){p=m(s);Ext.each(u,function(x,w){p[i]=x+p[i]})}t.start=u;t.end=p}}})})();(function(){var d=Ext.lib;d.Anim.scroll=function(l,j,m,n,h,k){return d.Anim.run(l,j,m,n,h,k,d.Scroll)};d.Scroll=function(j,h,k,l){if(j){d.Scroll.superclass.constructor.call(this,j,h,k,l)}};Ext.extend(d.Scroll,d.ColorAnim);var g=d.Scroll.superclass,e="scroll";Ext.apply(d.Scroll.prototype,{doMethod:function(h,o,j){var m,l=this,n=l.curFrame,k=l.totalFrames;if(h==e){m=[l.method(n,o[0],j[0]-o[0],k),l.method(n,o[1],j[1]-o[1],k)]}else{m=g.doMethod.call(l,h,o,j)}return m},getAttr:function(h){var j=this;if(h==e){return[j.el.scrollLeft,j.el.scrollTop]}else{return g.getAttr.call(j,h)}},setAttr:function(h,l,k){var j=this;if(h==e){j.el.scrollLeft=l[0];j.el.scrollTop=l[1]}else{g.setAttr.call(j,h,l,k)}}})})();if(Ext.isIE){function a(){var d=Function.prototype;delete d.createSequence;delete d.defer;delete d.createDelegate;delete d.createCallback;delete d.createInterceptor;window.detachEvent("onunload",a)}window.attachEvent("onunload",a)}})();(function(){var j=Ext.util,m=Ext.toArray,l=Ext.each,a=Ext.isObject,h=true,k=false;j.Observable=function(){var n=this,o=n.events;if(n.listeners){n.on(n.listeners);delete n.listeners}n.events=o||{}};j.Observable.prototype=function(){var o=/^(?:scope|delay|buffer|single)$/,n=function(p){return p.toLowerCase()};return{fireEvent:function(){var p=m(arguments),s=n(p[0]),t=this,r=h,v=t.events[s],u,w;if(t.eventsSuspended===h){if(u=t.suspendedEventsQueue){u.push(p)}}else{if(a(v)&&v.bubble){if(v.fire.apply(v,p.slice(1))===k){return k}w=t.getBubbleTarget&&t.getBubbleTarget();if(w&&w.enableBubble){w.enableBubble(s);return w.fireEvent.apply(w,p)}}else{if(a(v)){p.shift();r=v.fire.apply(v,p)}}}return r},addListener:function(r,u,w,q){var t=this,s,x,v,p;if(a(r)){q=r;for(s in q){x=q[s];if(!o.test(s)){t.addListener(s,x.fn||x,x.scope||q.scope,x.fn?x:q)}}}else{r=n(r);p=t.events[r]||h;if(typeof p=="boolean"){t.events[r]=p=new j.Event(t,r)}p.addListener(u,w,a(q)?q:{})}},removeListener:function(p,r,q){var s=this.events[n(p)];if(a(s)){s.removeListener(r,q)}},purgeListeners:function(){var r=this.events,p,q;for(q in r){p=r[q];if(a(p)){p.clearListeners()}}},addEvents:function(q){var p=this;p.events=p.events||{};if(typeof q=="string"){l(arguments,function(r){p.events[r]=p.events[r]||h})}else{Ext.applyIf(p.events,q)}},hasListener:function(p){var q=this.events[p];return a(q)&&q.listeners.length>0},suspendEvents:function(p){this.eventsSuspended=h;if(p){this.suspendedEventsQueue=[]}},resumeEvents:function(){var p=this;p.eventsSuspended=!delete p.suspendedEventQueue;l(p.suspendedEventsQueue,function(q){p.fireEvent.apply(p,q)})}}}();var e=j.Observable.prototype;e.on=e.addListener;e.un=e.removeListener;j.Observable.releaseCapture=function(n){n.fireEvent=e.fireEvent};function g(p,q,n){return function(){if(q.target==arguments[0]){p.apply(n,m(arguments))}}}function c(q,r,p){var n=new j.DelayedTask();return function(){n.delay(r.buffer,q,p,m(arguments))}}function d(p,q,o,n){return function(){q.removeListener(o,n);return p.apply(n,arguments)}}function b(p,q,n){return function(){var o=m(arguments);(function(){p.apply(n,o)}).defer(q.delay||10)}}j.Event=function(o,n){this.name=n;this.obj=o;this.listeners=[]};j.Event.prototype={addListener:function(q,p,o){var r=this,n;p=p||r.obj;if(!r.isListening(q,p)){n=r.createListener(q,p,o);if(r.firing){r.listeners=r.listeners.slice(0)}r.listeners.push(n)}},createListener:function(r,q,s){s=s||{},q=q||this.obj;var n={fn:r,scope:q,options:s},p=r;if(s.target){p=g(p,s,q)}if(s.delay){p=b(p,s,q)}if(s.single){p=d(p,this,r,q)}if(s.buffer){p=c(p,s,q)}n.fireFn=p;return n},findListener:function(q,p){var o,n=-1;l(this.listeners,function(r,s){o=r.scope;if(r.fn==q&&(o==p||o==this.obj)){n=s;return k}},this);return n},isListening:function(o,n){return this.findListener(o,n)!=-1},removeListener:function(q,p){var o,r=this,n=k;if((o=r.findListener(q,p))!=-1){if(r.firing){r.listeners=r.listeners.slice(0)}r.listeners.splice(o,1);n=h}return n},clearListeners:function(){this.listeners=[]},fire:function(){var p=this,o=m(arguments),n=h;l(p.listeners,function(q){p.firing=h;if(q.fireFn.apply(q.scope||p.obj||window,o)===k){return n=p.firing=k}});p.firing=k;return n}}})();Ext.DomHelper=function(){var t=null,k=/^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i,m=/^table|tbody|tr|td$/i,q,n="afterbegin",o="afterend",c="beforebegin",p="beforeend",a="<table>",h="</table>",b=a+"<tbody>",j="</tbody>"+h,l=b+"<tr>",s="</tr>"+j;function g(x,z,y,A,w,u){var v=q.insertHtml(A,Ext.getDom(x),r(z));return y?Ext.get(v,true):v}function r(z){var w="",v,y,x,u,A;if(typeof z=="string"){w=z}else{if(Ext.isArray(z)){Ext.each(z,function(B){w+=r(B)})}else{w+="<"+(z.tag=z.tag||"div");for(v in z){y=z[v];if(!/tag|children|cn|html$/i.test(v)&&!Ext.isFunction(y)){if(Ext.isObject(y)){w+=" "+v+"='";for(x in y){u=y[x];w+=!Ext.isFunction(u)?x+":"+u+";":""}w+="'"}else{w+=" "+({cls:"class",htmlFor:"for"}[v]||v)+"='"+y+"'"}}}if(k.test(z.tag)){w+="/>"}else{w+=">";if(A=z.children||z.cn){w+=r(A)}else{if(z.html){w+=z.html}}w+="</"+z.tag+">"}}}return w}function e(z,x,w,y){t.innerHTML=[x,w,y].join("");var u=-1,v=t;while(++u<z){v=v.firstChild}return v}function d(u,v,x,w){var y,z;t=t||document.createElement("div");if(u=="td"&&(v==n||v==p)||!/td|tr|tbody/i.test(u)&&(v==c||v==o)){return}z=v==c?x:v==o?x.nextSibling:v==n?x.firstChild:null;if(v==c||v==o){x=x.parentNode}if(u=="td"||(u=="tr"&&(v==p||v==n))){y=e(4,l,w,s)}else{if((u=="tbody"&&(v==p||v==n))||(u=="tr"&&(v==c||v==o))){y=e(3,b,w,j)}else{y=e(2,a,w,h)}}x.insertBefore(y,z);return y}q={markup:function(u){return r(u)},insertHtml:function(z,u,A){var y={},w,C,B,D,x,v;z=z.toLowerCase();y[c]=["BeforeBegin","previousSibling"];y[o]=["AfterEnd","nextSibling"];if(u.insertAdjacentHTML){if(m.test(u.tagName)&&(v=d(u.tagName.toLowerCase(),z,u,A))){return v}y[n]=["AfterBegin","firstChild"];y[p]=["BeforeEnd","lastChild"];if(w=y[z]){u.insertAdjacentHTML(w[0],A);return u[w[1]]}}else{B=u.ownerDocument.createRange();C="setStart"+(/end/i.test(z)?"After":"Before");if(y[z]){B[C](u);D=B.createContextualFragment(A);u.parentNode.insertBefore(D,z==c?u:u.nextSibling);return u[(z==c?"previous":"next")+"Sibling"]}else{x=(z==n?"first":"last")+"Child";if(u.firstChild){B[C](u[x]);D=B.createContextualFragment(A);z==n?u.insertBefore(D,u.firstChild):u.appendChild(D)}else{u.innerHTML=A}return u[x]}}throw'Illegal insertion point -> "'+z+'"'},insertBefore:function(u,w,v){return g(u,w,v,c)},insertAfter:function(u,w,v){return g(u,w,v,o,"nextSibling")},insertFirst:function(u,w,v){return g(u,w,v,n,"firstChild")},append:function(u,w,v){return g(u,w,v,p,"",true)},overwrite:function(u,w,v){u=Ext.getDom(u);u.innerHTML=r(w);return v?Ext.get(u.firstChild):u.firstChild},createHtml:r};return q}();Ext.Template=function(d){var e=this,b=arguments,c=[];if(Ext.isArray(d)){d=d.join("")}else{if(b.length>1){Ext.each(b,function(a){if(Ext.isObject(a)){Ext.apply(e,a)}else{c.push(a)}});d=c.join("")}}e.html=d;if(e.compiled){e.compile()}};Ext.Template.prototype={applyTemplate:function(a){var b=this;return b.compiled?b.compiled(a):b.html.replace(b.re,function(c,d){return a[d]!==undefined?a[d]:""})},set:function(a,c){var b=this;b.html=a;b.compiled=null;return c?b.compile():b},re:/\{([\w-]+)\}/g,compile:function(){var me=this,sep=Ext.isGecko?"+":",";function fn(m,name){name="values['"+name+"']";return"'"+sep+"("+name+" == undefined ? '' : "+name+")"+sep+"'"}eval("this.compiled = function(values){ return "+(Ext.isGecko?"'":"['")+me.html.replace(/\\/g,"\\\\").replace(/(\r\n|\n)/g,"\\n").replace(/'/g,"\\'").replace(this.re,fn)+(Ext.isGecko?"';};":"'].join('');};"));return me},insertFirst:function(b,a,c){return this.doInsert("afterBegin",b,a,c)},insertBefore:function(b,a,c){return this.doInsert("beforeBegin",b,a,c)},insertAfter:function(b,a,c){return this.doInsert("afterEnd",b,a,c)},append:function(b,a,c){return this.doInsert("beforeEnd",b,a,c)},doInsert:function(c,e,b,a){e=Ext.getDom(e);var d=Ext.DomHelper.insertHtml(c,e,this.applyTemplate(b));return a?Ext.get(d,true):d},overwrite:function(b,a,c){b=Ext.getDom(b);b.innerHTML=this.applyTemplate(a);return c?Ext.get(b.firstChild,true):b.firstChild}};Ext.Template.prototype.apply=Ext.Template.prototype.applyTemplate;Ext.Template.from=function(b,a){b=Ext.getDom(b);return new Ext.Template(b.value||b.innerHTML,a||"")};Ext.DomQuery=function(){var cache={},simpleCache={},valueCache={},nonSpace=/\S/,trimRe=/^\s+|\s+$/g,tplRe=/\{(\d+)\}/g,modeRe=/^(\s?[\/>+~]\s?|\s|$)/,tagTokenRe=/^(#)?([\w-\*]+)/,nthRe=/(\d*)n\+?(\d*)/,nthRe2=/\D/,isIE=window.ActiveXObject?true:false,isOpera=Ext.isOpera,key=30803;eval("var batch = 30803;");function child(p,index){var i=0,n=p.firstChild;while(n){if(n.nodeType==1){if(++i==index){return n}}n=n.nextSibling}return null}function next(n){while((n=n.nextSibling)&&n.nodeType!=1){}return n}function prev(n){while((n=n.previousSibling)&&n.nodeType!=1){}return n}function children(d){var n=d.firstChild,ni=-1,nx;while(n){nx=n.nextSibling;if(n.nodeType==3&&!nonSpace.test(n.nodeValue)){d.removeChild(n)}else{n.nodeIndex=++ni}n=nx}return this}function byClassName(c,a,v){if(!v){return c}var r=[],ri=-1,cn;for(var i=0,ci;ci=c[i];i++){if((" "+ci.className+" ").indexOf(v)!=-1){r[++ri]=ci}}return r}function attrValue(n,attr){if(!n.tagName&&typeof n.length!="undefined"){n=n[0]}if(!n){return null}if(attr=="for"){return n.htmlFor}if(attr=="class"||attr=="className"){return n.className}return n.getAttribute(attr)||n[attr]}function getNodes(ns,mode,tagName){var result=[],ri=-1,cs;if(!ns){return result}tagName=tagName||"*";if(typeof ns.getElementsByTagName!="undefined"){ns=[ns]}if(!mode){for(var i=0,ni;ni=ns[i];i++){cs=ni.getElementsByTagName(tagName);for(var j=0,ci;ci=cs[j];j++){result[++ri]=ci}}}else{if(mode=="/"||mode==">"){var utag=tagName.toUpperCase();for(var i=0,ni,cn;ni=ns[i];i++){cn=isOpera?ni.childNodes:(ni.children||ni.childNodes);for(var j=0,cj;cj=cn[j];j++){if(cj.nodeName==utag||cj.nodeName==tagName||tagName=="*"){result[++ri]=cj}}}}else{if(mode=="+"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(n&&(n.nodeName==utag||n.nodeName==tagName||tagName=="*")){result[++ri]=n}}}else{if(mode=="~"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)){if(n.nodeName==utag||n.nodeName==tagName||tagName=="*"){result[++ri]=n}}}}}}}return result}function concat(a,b){if(b.slice){return a.concat(b)}for(var i=0,l=b.length;i<l;i++){a[a.length]=b[i]}return a}function byTag(cs,tagName){if(cs.tagName||cs==document){cs=[cs]}if(!tagName){return cs}var r=[],ri=-1;tagName=tagName.toLowerCase();for(var i=0,ci;ci=cs[i];i++){if(ci.nodeType==1&&ci.tagName.toLowerCase()==tagName){r[++ri]=ci}}return r}function byId(cs,attr,id){if(cs.tagName||cs==document){cs=[cs]}if(!id){return cs}var r=[],ri=-1;for(var i=0,ci;ci=cs[i];i++){if(ci&&ci.id==id){r[++ri]=ci;return r}}return r}function byAttribute(cs,attr,value,op,custom){var r=[],ri=-1,st=custom=="{",f=Ext.DomQuery.operators[op];for(var i=0,ci;ci=cs[i];i++){if(ci.nodeType!=1){continue}var a;if(st){a=Ext.DomQuery.getStyle(ci,attr)}else{if(attr=="class"||attr=="className"){a=ci.className}else{if(attr=="for"){a=ci.htmlFor}else{if(attr=="href"){a=ci.getAttribute("href",2)}else{a=ci.getAttribute(attr)}}}}if((f&&f(a,value))||(!f&&a)){r[++ri]=ci}}return r}function byPseudo(cs,name,value){return Ext.DomQuery.pseudos[name](cs,value)}function nodupIEXml(cs){var d=++key,r;cs[0].setAttribute("_nodup",d);r=[cs[0]];for(var i=1,len=cs.length;i<len;i++){var c=cs[i];if(!c.getAttribute("_nodup")!=d){c.setAttribute("_nodup",d);r[r.length]=c}}for(var i=0,len=cs.length;i<len;i++){cs[i].removeAttribute("_nodup")}return r}function nodup(cs){if(!cs){return[]}var len=cs.length,c,i,r=cs,cj,ri=-1;if(!len||typeof cs.nodeType!="undefined"||len==1){return cs}if(isIE&&typeof cs[0].selectSingleNode!="undefined"){return nodupIEXml(cs)}var d=++key;cs[0]._nodup=d;for(i=1;c=cs[i];i++){if(c._nodup!=d){c._nodup=d}else{r=[];for(var j=0;j<i;j++){r[++ri]=cs[j]}for(j=i+1;cj=cs[j];j++){if(cj._nodup!=d){cj._nodup=d;r[++ri]=cj}}return r}}return r}function quickDiffIEXml(c1,c2){var d=++key,r=[];for(var i=0,len=c1.length;i<len;i++){c1[i].setAttribute("_qdiff",d)}for(var i=0,len=c2.length;i<len;i++){if(c2[i].getAttribute("_qdiff")!=d){r[r.length]=c2[i]}}for(var i=0,len=c1.length;i<len;i++){c1[i].removeAttribute("_qdiff")}return r}function quickDiff(c1,c2){var len1=c1.length,d=++key,r=[];if(!len1){return c2}if(isIE&&c1[0].selectSingleNode){return quickDiffIEXml(c1,c2)}for(var i=0;i<len1;i++){c1[i]._qdiff=d}for(var i=0,len=c2.length;i<len;i++){if(c2[i]._qdiff!=d){r[r.length]=c2[i]}}return r}function quickId(ns,mode,root,id){if(ns==root){var d=root.ownerDocument||root;return d.getElementById(id)}ns=getNodes(ns,mode,"*");return byId(ns,null,id)}return{getStyle:function(el,name){return Ext.fly(el).getStyle(name)},compile:function(path,type){type=type||"select";var fn=["var f = function(root){\n var mode; ++batch; var n = root || document;\n"],q=path,mode,lq,tk=Ext.DomQuery.matchers,tklen=tk.length,mm,lmode=q.match(modeRe);if(lmode&&lmode[1]){fn[fn.length]='mode="'+lmode[1].replace(trimRe,"")+'";';q=q.replace(lmode[1],"")}while(path.substr(0,1)=="/"){path=path.substr(1)}while(q&&lq!=q){lq=q;var tm=q.match(tagTokenRe);if(type=="select"){if(tm){if(tm[1]=="#"){fn[fn.length]='n = quickId(n, mode, root, "'+tm[2]+'");'}else{fn[fn.length]='n = getNodes(n, mode, "'+tm[2]+'");'}q=q.replace(tm[0],"")}else{if(q.substr(0,1)!="@"){fn[fn.length]='n = getNodes(n, mode, "*");'}}}else{if(tm){if(tm[1]=="#"){fn[fn.length]='n = byId(n, null, "'+tm[2]+'");'}else{fn[fn.length]='n = byTag(n, "'+tm[2]+'");'}q=q.replace(tm[0],"")}}while(!(mm=q.match(modeRe))){var matched=false;for(var j=0;j<tklen;j++){var t=tk[j];var m=q.match(t.re);if(m){fn[fn.length]=t.select.replace(tplRe,function(x,i){return m[i]});q=q.replace(m[0],"");matched=true;break}}if(!matched){throw'Error parsing selector, parsing failed at "'+q+'"'}}if(mm[1]){fn[fn.length]='mode="'+mm[1].replace(trimRe,"")+'";';q=q.replace(mm[1],"")}}fn[fn.length]="return nodup(n);\n}";eval(fn.join(""));return f},select:function(path,root,type){if(!root||root==document){root=document}if(typeof root=="string"){root=document.getElementById(root)}var paths=path.split(","),results=[];for(var i=0,len=paths.length;i<len;i++){var p=paths[i].replace(trimRe,"");if(!cache[p]){cache[p]=Ext.DomQuery.compile(p);if(!cache[p]){throw p+" is not a valid selector"}}var result=cache[p](root);if(result&&result!=document){results=results.concat(result)}}if(paths.length>1){return nodup(results)}return results},selectNode:function(path,root){return Ext.DomQuery.select(path,root)[0]},selectValue:function(path,root,defaultValue){path=path.replace(trimRe,"");if(!valueCache[path]){valueCache[path]=Ext.DomQuery.compile(path,"select")}var n=valueCache[path](root),v;n=n[0]?n[0]:n;v=(n&&n.firstChild?n.firstChild.nodeValue:null);return((v===null||v===undefined||v==="")?defaultValue:v)},selectNumber:function(path,root,defaultValue){var v=Ext.DomQuery.selectValue(path,root,defaultValue||0);return parseFloat(v)},is:function(el,ss){if(typeof el=="string"){el=document.getElementById(el)}var isArray=Ext.isArray(el),result=Ext.DomQuery.filter(isArray?el:[el],ss);return isArray?(result.length==el.length):(result.length>0)},filter:function(els,ss,nonMatches){ss=ss.replace(trimRe,"");if(!simpleCache[ss]){simpleCache[ss]=Ext.DomQuery.compile(ss,"simple")}var result=simpleCache[ss](els);return nonMatches?quickDiff(result,els):result},matchers:[{re:/^\.([\w-]+)/,select:'n = byClassName(n, null, " {1} ");'},{re:/^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,select:'n = byPseudo(n, "{1}", "{2}");'},{re:/^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,select:'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'},{re:/^#([\w-]+)/,select:'n = byId(n, null, "{1}");'},{re:/^@([\w-]+)/,select:'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'}],operators:{"=":function(a,v){return a==v},"!=":function(a,v){return a!=v},"^=":function(a,v){return a&&a.substr(0,v.length)==v},"$=":function(a,v){return a&&a.substr(a.length-v.length)==v},"*=":function(a,v){return a&&a.indexOf(v)!==-1},"%=":function(a,v){return(a%v)==0},"|=":function(a,v){return a&&(a==v||a.substr(0,v.length+1)==v+"-")},"~=":function(a,v){return a&&(" "+a+" ").indexOf(" "+v+" ")!=-1}},pseudos:{"first-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.previousSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"last-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"nth-child":function(c,a){var r=[],ri=-1,m=nthRe.exec(a=="even"&&"2n"||a=="odd"&&"2n+1"||!nthRe2.test(a)&&"n+"+a||a),f=(m[1]||1)-0,l=m[2]-0;for(var i=0,n;n=c[i];i++){var pn=n.parentNode;if(batch!=pn._batch){var j=0;for(var cn=pn.firstChild;cn;cn=cn.nextSibling){if(cn.nodeType==1){cn.nodeIndex=++j}}pn._batch=batch}if(f==1){if(l==0||n.nodeIndex==l){r[++ri]=n}}else{if((n.nodeIndex+l)%f==0){r[++ri]=n}}}return r},"only-child":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(!prev(ci)&&!next(ci)){r[++ri]=ci}}return r},empty:function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var cns=ci.childNodes,j=0,cn,empty=true;while(cn=cns[j]){++j;if(cn.nodeType==1||cn.nodeType==3){empty=false;break}}if(empty){r[++ri]=ci}}return r},contains:function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if((ci.textContent||ci.innerText||"").indexOf(v)!=-1){r[++ri]=ci}}return r},nodeValue:function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.firstChild&&ci.firstChild.nodeValue==v){r[++ri]=ci}}return r},checked:function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.checked==true){r[++ri]=ci}}return r},not:function(c,ss){return Ext.DomQuery.filter(c,ss,true)},any:function(c,selectors){var ss=selectors.split("|"),r=[],ri=-1,s;for(var i=0,ci;ci=c[i];i++){for(var j=0;s=ss[j];j++){if(Ext.DomQuery.is(ci,s)){r[++ri]=ci;break}}}return r},odd:function(c){return this["nth-child"](c,"odd")},even:function(c){return this["nth-child"](c,"even")},nth:function(c,a){return c[a-1]||[]},first:function(c){return c[0]||[]},last:function(c){return c[c.length-1]||[]},has:function(c,ss){var s=Ext.DomQuery.select,r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(s(ss,ci).length>0){r[++ri]=ci}}return r},next:function(c,ss){var is=Ext.DomQuery.is,r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=next(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r},prev:function(c,ss){var is=Ext.DomQuery.is,r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=prev(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r}}}}();Ext.query=Ext.DomQuery.select;Ext.EventManager=function(){var u,n,k=false,m=Ext.lib.Event,o=Ext.lib.Dom,b=document,v=window,g="ie-deferred-loader",p="DOMContentLoaded",e={},h=/^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;function l(B,x,A,z,y){var D=Ext.id(B),C=e[D]=e[D]||{};(C[x]=C[x]||[]).push([A,z,y]);m.on(B,x,z);if(x=="mousewheel"&&B.addEventListener){var w=["DOMMouseScroll",z,false];B.addEventListener.apply(B,w);m.on(window,"unload",function(){B.removeEventListener.apply(B,w)})}if(x=="mousedown"&&B==document){Ext.EventManager.stoppedMouseDownEvent.addListener(z)}}function c(){if(!k){Ext.isReady=k=true;if(n){clearInterval(n)}if(Ext.isGecko||Ext.isOpera){b.removeEventListener(p,c,false)}if(Ext.isIE){var w=b.getElementById(g);if(w){w.onreadystatechange=null;w.parentNode.removeChild(w)}}if(u){u.fire();u.clearListeners()}}}function a(){var w="complete";u=new Ext.util.Event();if(Ext.isGecko||Ext.isOpera){b.addEventListener(p,c,false)}else{if(Ext.isIE){b.write("<script id="+g+' defer="defer" src="//:"><\/script>');b.getElementById(g).onreadystatechange=function(){if(this.readyState==w){c()}}}else{if(Ext.isWebKit){n=setInterval(function(){if(b.readyState==w){c()}},10)}}}m.on(v,"load",c)}function s(w,x){return function(){var y=Ext.toArray(arguments);if(x.target==Ext.EventObject.setEvent(y[0]).target){w.apply(this,y)}}}function t(x,y){var w=new Ext.util.DelayedTask(x);return function(z){w.delay(y.buffer,x,null,[new Ext.EventObjectImpl(z)])}}function q(A,z,w,y,x){return function(B){Ext.EventManager.removeListener(z,w,y,x);A(B)}}function d(w,x){return function(y){y=new Ext.EventObjectImpl(y);setTimeout(function(){w(y)},x.delay||10)}}function j(y,x,w,C,B){var D=!Ext.isObject(w)?{}:w,A=Ext.getDom(y);C=C||D.fn;B=B||D.scope;if(!A){throw'Error listening for "'+x+'". Element "'+y+"\" doesn't exist."}function z(F){if(!Ext){return}F=Ext.EventObject.setEvent(F);var E;if(D.delegate){if(!(E=F.getTarget(D.delegate,A))){return}}else{E=F.target}if(D.stopEvent){F.stopEvent()}if(D.preventDefault){F.preventDefault()}if(D.stopPropagation){F.stopPropagation()}if(D.normalized){F=F.browserEvent}C.call(B||A,F,E,D)}if(D.target){z=s(z,D)}if(D.delay){z=d(z,D)}if(D.single){z=q(z,A,x,C,B)}if(D.buffer){z=t(z,D)}l(A,x,C,z,B);return z}var r={addListener:function(y,w,A,z,x){if(Ext.isObject(w)){var D=w,B,C;for(B in D){C=D[B];if(!h.test(B)){if(Ext.isFunction(C)){j(y,B,D,C,D.scope)}else{j(y,B,C)}}}}else{j(y,w,x,A,z)}},removeListener:function(x,w,B,A){var z=Ext.getDom(x),C=Ext.id(z),y;Ext.each((e[C]||{})[w],function(E,F,D){if(Ext.isArray(E)&&E[0]==B&&(!A||E[2]==A)){m.un(z,w,y=E[1]);D.splice(F,1);return false}});if(w=="mousewheel"&&z.addEventListener&&y){z.removeEventListener("DOMMouseScroll",y,false)}if(w=="mousedown"&&z==b&&y){Ext.EventManager.stoppedMouseDownEvent.removeListener(y)}},removeAll:function(x){var z=Ext.id(x=Ext.getDom(x)),y=e[z],w;for(w in y){if(y.hasOwnProperty(w)){Ext.each(y[w],function(A){m.un(x,w,A.wrap)})}}e[z]=null},onDocumentReady:function(y,x,w){if(k){u.addListener(y,x,w);u.fire();u.clearListeners()}else{if(!u){a()}w=w||{};w.delay=w.delay||1;u.addListener(y,x,w)}},elHash:e};r.on=r.addListener;r.un=r.removeListener;r.stoppedMouseDownEvent=new Ext.util.Event();return r}();Ext.onReady=Ext.EventManager.onDocumentReady;(function(){var a=function(){var c=document.body||document.getElementsByTagName("body")[0];if(!c){return false}var b=[" ",Ext.isIE?"ext-ie "+(Ext.isIE6?"ext-ie6":(Ext.isIE7?"ext-ie7":"ext-ie8")):Ext.isGecko?"ext-gecko "+(Ext.isGecko2?"ext-gecko2":"ext-gecko3"):Ext.isOpera?"ext-opera":Ext.isWebKit?"ext-webkit":""];if(Ext.isSafari){b.push("ext-safari "+(Ext.isSafari2?"ext-safari2":(Ext.isSafari3?"ext-safari3":"ext-safari4")))}else{if(Ext.isChrome){b.push("ext-chrome")}}if(Ext.isMac){b.push("ext-mac")}if(Ext.isLinux){b.push("ext-linux")}if(Ext.isBorderBox){b.push("ext-border-box")}if(Ext.isStrict){var d=c.parentNode;if(d){d.className+=" ext-strict"}}c.className+=b.join(" ");return true};if(!a()){Ext.onReady(a)}})();Ext.EventObject=function(){var b=Ext.lib.Event,a={3:13,63234:37,63235:39,63232:38,63233:40,63276:33,63277:34,63272:46,63273:36,63275:35},c=Ext.isIE?{1:0,4:1,2:2}:(Ext.isWebKit?{1:0,2:1,3:2}:{0:0,1:1,2:2});Ext.EventObjectImpl=function(d){if(d){this.setEvent(d.browserEvent||d)}};Ext.EventObjectImpl.prototype={setEvent:function(g){var d=this;if(g==d||(g&&g.browserEvent)){return g}d.browserEvent=g;if(g){d.button=g.button?c[g.button]:(g.which?g.which-1:-1);if(g.type=="click"&&d.button==-1){d.button=0}d.type=g.type;d.shiftKey=g.shiftKey;d.ctrlKey=g.ctrlKey||g.metaKey||false;d.altKey=g.altKey;d.keyCode=g.keyCode;d.charCode=g.charCode;d.target=b.getTarget(g);d.xy=b.getXY(g)}else{d.button=-1;d.shiftKey=false;d.ctrlKey=false;d.altKey=false;d.keyCode=0;d.charCode=0;d.target=null;d.xy=[0,0]}return d},stopEvent:function(){var d=this;if(d.browserEvent){if(d.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(d)}b.stopEvent(d.browserEvent)}},preventDefault:function(){if(this.browserEvent){b.preventDefault(this.browserEvent)}},stopPropagation:function(){var d=this;if(d.browserEvent){if(d.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(d)}b.stopPropagation(d.browserEvent)}},getCharCode:function(){return this.charCode||this.keyCode},getKey:function(){return this.normalizeKey(this.keyCode||this.charCode)},normalizeKey:function(d){return Ext.isSafari?(a[d]||d):d},getPageX:function(){return this.xy[0]},getPageY:function(){return this.xy[1]},getXY:function(){return this.xy},getTarget:function(e,g,d){return e?Ext.fly(this.target).findParent(e,g,d):(d?Ext.get(this.target):this.target)},getRelatedTarget:function(){return this.browserEvent?b.getRelatedTarget(this.browserEvent):null},getWheelDelta:function(){var d=this.browserEvent;var g=0;if(d.wheelDelta){g=d.wheelDelta/120}else{if(d.detail){g=-d.detail/3}}return g},within:function(g,h,d){if(g){var e=this[h?"getRelatedTarget":"getTarget"]();return e&&((d?(e==Ext.getDom(g)):false)||Ext.fly(g).contains(e))}return false}};return new Ext.EventObjectImpl()}();(function(){var j=document;Ext.Element=function(o,p){var q=typeof o=="string"?j.getElementById(o):o,r;if(!q){return null}r=q.id;if(!p&&r&&Ext.Element.cache[r]){return Ext.Element.cache[r]}this.dom=q;this.id=r||Ext.id(q)};var a=Ext.lib.Dom,e=Ext.DomHelper,m=Ext.lib.Event,d=Ext.lib.Anim,g=Ext.Element;g.prototype={set:function(t,q){var r=this.dom,p,s;for(p in t){s=t[p];if(p!="style"&&!Ext.isFunction(s)){if(p=="cls"){r.className=s}else{if(t.hasOwnProperty(p)){if(q||!!r.setAttribute){r.setAttribute(p,s)}else{r[p]=s}}}}}if(t.style){Ext.DomHelper.applyStyles(r,t.style)}return this},defaultUnit:"px",is:function(o){return Ext.DomQuery.is(this.dom,o)},focus:function(r,q){var o=this,q=q||o.dom;try{if(Number(r)){o.focus.defer(r,null,[null,q])}else{q.focus()}}catch(p){}return o},blur:function(){try{this.dom.blur()}catch(o){}return this},getValue:function(o){var p=this.dom.value;return o?parseInt(p,10):p},addListener:function(o,r,q,p){Ext.EventManager.on(this.dom,o,r,q||this,p);return this},removeListener:function(o,q,p){Ext.EventManager.removeListener(this.dom,o,q,p||this);return this},removeAllListeners:function(){Ext.EventManager.removeAll(this.dom);return this},addUnits:function(o){if(o===""||o=="auto"||o===undefined){o=o||""}else{if(!isNaN(o)||!k.test(o)){o=o+(this.defaultUnit||"px")}}return o},load:function(p,q,o){Ext.Ajax.request(Ext.apply({params:q,url:p.url||p,callback:o,el:this.dom,indicatorText:p.indicatorText||""},Ext.isObject(p)?p:{}));return this},isBorderBox:function(){return h[(this.dom.tagName||"").toLowerCase()]||Ext.isBorderBox},remove:function(){var o=this,p=o.dom;o.removeAllListeners();delete g.cache[p.id];delete g.dataCache[p.id];Ext.removeNode(p)},hover:function(p,o,r,q){var s=this;s.on("mouseenter",p,r||s.dom,q);s.on("mouseleave",o,r||s.dom,q);return s},contains:function(o){return !o?false:Ext.lib.Dom.isAncestor(this.dom,o.dom?o.dom:o)},getAttributeNS:function(p,o){return this.getAttribute(o,p)},getAttribute:Ext.isIE?function(o,q){var r=this.dom,p=typeof r[q+":"+o];if(["undefined","unknown"].indexOf(p)==-1){return r[q+":"+o]}return r[o]}:function(o,p){var q=this.dom;return q.getAttributeNS(p,o)||q.getAttribute(p+":"+o)||q.getAttribute(o)||q[o]},update:function(o){this.dom.innerHTML=o}};var n=g.prototype;g.addMethods=function(p){Ext.apply(n,p)};n.on=n.addListener;n.un=n.removeListener;n.autoBoxAdjust=true;var k=/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,c;g.cache={};g.dataCache={};g.get=function(p){var o,s,r;if(!p){return null}if(typeof p=="string"){if(!(s=j.getElementById(p))){return null}if(o=g.cache[p]){o.dom=s}else{o=g.cache[p]=new g(s)}return o}else{if(p.tagName){if(!(r=p.id)){r=Ext.id(p)}if(o=g.cache[r]){o.dom=p}else{o=g.cache[r]=new g(p)}return o}else{if(p instanceof g){if(p!=c){p.dom=j.getElementById(p.id)||p.dom;g.cache[p.id]=p}return p}else{if(p.isComposite){return p}else{if(Ext.isArray(p)){return g.select(p)}else{if(p==j){if(!c){var q=function(){};q.prototype=g.prototype;c=new q();c.dom=j}return c}}}}}}return null};g.data=function(p,o,q){var r=g.dataCache[p.id];if(!r){r=g.dataCache[p.id]={}}if(arguments.length==2){return r[o]}else{r[o]=q}};function l(){if(!Ext.enableGarbageCollector){clearInterval(g.collectorThread)}else{var o,p,q;for(o in g.cache){p=g.cache[o];q=p.dom;if(!q||!q.parentNode||(!q.offsetParent&&!j.getElementById(o))){delete g.cache[o];if(q&&Ext.enableListenerCollection){Ext.EventManager.removeAll(q)}}}}}g.collectorThreadId=setInterval(l,30000);var b=function(){};b.prototype=g.prototype;g.Flyweight=function(o){this.dom=o};g.Flyweight.prototype=new b();g.Flyweight.prototype.isFlyweight=true;g._flyweights={};g.fly=function(q,o){var p=null;o=o||"_global";if(q=Ext.getDom(q)){(g._flyweights[o]=g._flyweights[o]||new g.Flyweight()).dom=q;p=g._flyweights[o]}return p};Ext.get=g.get;Ext.fly=g.fly;var h=Ext.isStrict?{select:1}:{input:1,select:1,textarea:1};if(Ext.isIE||Ext.isGecko){h.button=1}Ext.EventManager.on(window,"unload",function(){delete g.cache;delete g.dataCache;delete g._flyweights})})();Ext.Element.addMethods(function(){var d="parentNode",b="nextSibling",c="previousSibling",e=Ext.DomQuery,a=Ext.get;return{findParent:function(n,m,h){var k=this.dom,g=document.body,l=0,j;if(Ext.isGecko&&Object.prototype.toString.call(k)=="[object XULElement]"){return null}m=m||50;if(isNaN(m)){j=Ext.getDom(m);m=10}while(k&&k.nodeType==1&&l<m&&k!=g&&k!=j){if(e.is(k,n)){return h?a(k):k}l++;k=k.parentNode}return null},findParentNode:function(k,j,g){var h=Ext.fly(this.dom.parentNode,"_internal");return h?h.findParent(k,j,g):null},up:function(h,g){return this.findParentNode(h,g,true)},select:function(g,h){return Ext.Element.select(g,h,this.dom)},query:function(g,h){return e.select(g,this.dom)},child:function(g,h){var j=e.selectNode(g,this.dom);return h?j:a(j)},down:function(g,h){var j=e.selectNode(" > "+g,this.dom);return h?j:a(j)},parent:function(g,h){return this.matchNode(d,d,g,h)},next:function(g,h){return this.matchNode(b,b,g,h)},prev:function(g,h){return this.matchNode(c,c,g,h)},first:function(g,h){return this.matchNode(b,"firstChild",g,h)},last:function(g,h){return this.matchNode(c,"lastChild",g,h)},matchNode:function(h,l,g,j){var k=this.dom[l];while(k){if(k.nodeType==1&&(!g||e.is(k,g))){return !j?a(k):k}k=k[h]}return null}}}());Ext.Element.addMethods(function(){var d=Ext.getDom,a=Ext.get,c=Ext.DomHelper,b=function(e){return(e.nodeType||e.dom||typeof e=="string")};return{appendChild:function(e){return a(e).appendTo(this)},appendTo:function(e){d(e).appendChild(this.dom);return this},insertBefore:function(e){(e=d(e)).parentNode.insertBefore(this.dom,e);return this},insertAfter:function(e){(e=d(e)).parentNode.insertBefore(this.dom,e.nextSibling);return this},insertFirst:function(g,e){g=g||{};if(b(g)){g=d(g);this.dom.insertBefore(g,this.dom.firstChild);return !e?a(g):g}else{return this.createChild(g,this.dom.firstChild,e)}},replace:function(e){e=a(e);this.insertBefore(e);e.remove();return this},replaceWith:function(g){var h=this,e=Ext.Element;if(b(g)){g=d(g);h.dom.parentNode.insertBefore(g,h.dom)}else{g=c.insertBefore(h.dom,g)}delete e.cache[h.id];Ext.removeNode(h.dom);h.id=Ext.id(h.dom=g);return e.cache[h.id]=h},createChild:function(g,e,h){g=g||{tag:"div"};return e?c.insertBefore(e,g,h!==true):c[!this.dom.firstChild?"overwrite":"append"](this.dom,g,h!==true)},wrap:function(e,g){var h=c.insertBefore(this.dom,e||{tag:"div"},!g);h.dom?h.dom.appendChild(this.dom):h.appendChild(this.dom);return h},insertHtml:function(g,h,e){var j=c.insertHtml(g,this.dom,h);return e?Ext.get(j):j}}}());Ext.Element.addMethods(function(){var g={},u=/(-[a-z])/gi,b={},p=document.defaultView,r=Ext.isIE?"styleFloat":"cssFloat",x=/alpha\(opacity=(.*)\)/i,k=/^\s+|\s+$/g,w=Ext.Element,d="padding",c="margin",v="border",q="-left",o="-right",t="-top",l="-bottom",h="-width",j={l:v+q+h,r:v+o+h,t:v+t+h,b:v+l+h},e={l:d+q,r:d+o,t:d+t,b:d+l},a={l:c+q,r:c+o,t:c+t,b:c+l},y=Ext.Element.data;function n(z,A){return A.charAt(1).toUpperCase()}function m(A,z){var B=0;Ext.each(A.match(/\w/g),function(C){if(C=parseInt(this.getStyle(z[C]),10)){B+=Math.abs(C)}},this);return B}function s(z){return g[z]||(g[z]=z=="float"?r:z.replace(u,n))}return{adjustWidth:function(z){var A=this;if(typeof z=="number"&&A.autoBoxAdjust&&!A.isBorderBox()){z-=(A.getBorderWidth("lr")+A.getPadding("lr"));z=z<0?0:z}return z},adjustHeight:function(z){var A=this;if(typeof z=="number"&&A.autoBoxAdjust&&!A.isBorderBox()){z-=(A.getBorderWidth("tb")+A.getPadding("tb"));z=z<0?0:z}return z},addClass:function(z){var A=this;Ext.each(z,function(B){A.dom.className+=(!A.hasClass(B)&&B?" "+B:"")});return A},radioClass:function(z){Ext.each(this.dom.parentNode.childNodes,function(A){if(A.nodeType==1){Ext.fly(A).removeClass(z)}});return this.addClass(z)},removeClass:function(z){var A=this;if(A.dom.className){Ext.each(z,function(B){A.dom.className=A.dom.className.replace(b[B]=b[B]||new RegExp("(?:^|\\s+)"+B+"(?:\\s+|$)","g")," ")})}return A},toggleClass:function(z){return this.hasClass(z)?this.removeClass(z):this.addClass(z)},hasClass:function(z){return z&&(" "+this.dom.className+" ").indexOf(" "+z+" ")!=-1},replaceClass:function(A,z){return this.removeClass(A).addClass(z)},isStyle:function(z,A){return this.getStyle(z)==A},getStyle:function(){return p&&p.getComputedStyle?function(C){var B=this.dom,z,A;if(B==document){return null}C=s(C);return(z=B.style[C])?z:(A=p.getComputedStyle(B,""))?A[C]:null}:function(D){var B=this.dom,z,A;if(B==document){return null}if(D=="opacity"){if(B.style.filter.match){if(z=B.style.filter.match(x)){var C=parseFloat(z[1]);if(!isNaN(C)){return C?C/100:0}}}return 1}D=s(D);return B.style[D]||((A=B.currentStyle)?A[D]:null)}}(),getColor:function(z,A,E){var D,C=this.getStyle(z),B=E||"#";if(!C||C=="transparent"||C=="inherit"){return A}if(/^r/.test(C)){Ext.each(C.slice(4,C.length-1).split(","),function(F){D=(F*1).toString(16);B+=D<16?"0"+D:D})}else{B+=C.replace("#","").replace(/^(\w)(\w)(\w)$/,"$1$1$2$2$3$3")}return B.length>5?B.toLowerCase():A},setStyle:function(D,C){var A,B,z;if(!Ext.isObject(D)){A={};A[D]=C;D=A}for(B in D){C=D[B];B=="opacity"?this.setOpacity(C):this.dom.style[s(B)]=C}return this},setOpacity:function(A,z){var D=this,B=D.dom.style;if(!z||!D.anim){if(Ext.isIE){var C=A<1?"alpha(opacity="+A*100+")":"",E=B.filter.replace(x,"").replace(k,"");B.zoom=1;B.filter=E+(E.length>0?" ":"")+C}else{B.opacity=A}}else{D.anim({opacity:{to:A}},D.preanim(arguments,1),null,0.35,"easeIn")}return D},clearOpacity:function(){var z=this.dom.style;if(Ext.isIE){if(!Ext.isEmpty(z.filter)){z.filter=z.filter.replace(x,"").replace(k,"")}}else{z.opacity=z["-moz-opacity"]=z["-khtml-opacity"]=""}return this},getHeight:function(A){var z=this.dom.offsetHeight||0;z=!A?z:z-this.getBorderWidth("tb")-this.getPadding("tb");return z<0?0:z},getWidth:function(A){var z=this.dom.offsetWidth||0;z=!A?z:z-this.getBorderWidth("lr")-this.getPadding("lr");return z<0?0:z},setWidth:function(A,z){var B=this;A=B.adjustWidth(A);!z||!B.anim?B.dom.style.width=B.addUnits(A):B.anim({width:{to:A}},B.preanim(arguments,1));return B},setHeight:function(z,A){var B=this;z=B.adjustHeight(z);!A||!B.anim?B.dom.style.height=B.addUnits(z):B.anim({height:{to:z}},B.preanim(arguments,1));return B},getBorderWidth:function(z){return m.call(this,z,j)},getPadding:function(z){return m.call(this,z,e)},clip:function(){var z=this;dom=z.dom;if(!y(dom,"isClipped")){y(dom,"isClipped",true);y(dom,"originalClip,",{o:z.getStyle("overflow"),x:z.getStyle("overflow-x"),y:z.getStyle("overflow-y")});z.setStyle("overflow","hidden");z.setStyle("overflow-x","hidden");z.setStyle("overflow-y","hidden")}return z},unclip:function(){var z=this,B=z.dom;if(y(B,"isClipped")){y(B,"isClipped",false);var A=y(B,"originalClip");if(A.o){z.setStyle("overflow",A.o)}if(A.x){z.setStyle("overflow-x",A.x)}if(A.y){z.setStyle("overflow-y",A.y)}}return z},addStyles:m,margins:a}}());(function(){var a=Ext.lib.Dom,b="left",g="right",d="top",j="bottom",h="position",c="static",e="relative",k="auto",l="z-index";function m(o,n,p){return this.preanim&&!!n?this.preanim(o,p):false}Ext.Element.addMethods({getX:function(){return a.getX(this.dom)},getY:function(){return a.getY(this.dom)},getXY:function(){return a.getXY(this.dom)},getOffsetsTo:function(n){var q=this.getXY(),p=Ext.fly(n,"_internal").getXY();return[q[0]-p[0],q[1]-p[1]]},setX:function(n,o){return this.setXY([n,this.getY()],m.call(this,arguments,o,1))},setY:function(o,n){return this.setXY([this.getX(),o],m.call(this,arguments,n,1))},setLeft:function(n){this.setStyle(b,this.addUnits(n));return this},setTop:function(n){this.setStyle(d,this.addUnits(n));return this},setRight:function(n){this.setStyle(g,this.addUnits(n));return this},setBottom:function(n){this.setStyle(j,this.addUnits(n));return this},setXY:function(p,n){var o=this;if(!n||!o.anim){a.setXY(o.dom,p)}else{o.anim({points:{to:p}},o.preanim(arguments,1),"motion")}return o},setLocation:function(n,p,o){return this.setXY([n,p],m.call(this,arguments,o,2))},moveTo:function(n,p,o){return this.setXY([n,p],m.call(this,arguments,o,2))},getLeft:function(n){return !n?this.getX():parseInt(this.getStyle(b),10)||0},getRight:function(n){var o=this;return !n?o.getX()+o.getWidth():(o.getLeft(true)+o.getWidth())||0},getTop:function(n){return !n?this.getY():parseInt(this.getStyle(d),10)||0},getBottom:function(n){var o=this;return !n?o.getY()+o.getHeight():(o.getTop(true)+o.getHeight())||0},position:function(r,q,n,p){var o=this;if(!r&&o.isStyle(h,c)){o.setStyle(h,e)}else{if(r){o.setStyle(h,r)}}if(q){o.setStyle(l,q)}if(n||p){o.setXY([n||false,p||false])}},clearPositioning:function(n){n=n||"";this.setStyle({left:n,right:n,top:n,bottom:n,"z-index":"",position:c});return this},getPositioning:function(){var n=this.getStyle(b);var o=this.getStyle(d);return{position:this.getStyle(h),left:n,right:n?"":this.getStyle(g),top:o,bottom:o?"":this.getStyle(j),"z-index":this.getStyle(l)}},setPositioning:function(n){var p=this,o=p.dom.style;p.setStyle(n);if(n.right==k){o.right=""}if(n.bottom==k){o.bottom=""}return p},translatePoints:function(n,v){v=isNaN(n[1])?v:n[1];n=isNaN(n[0])?n:n[0];var r=this,s=r.isStyle(h,e),u=r.getXY(),p=parseInt(r.getStyle(b),10),q=parseInt(r.getStyle(d),10);p=!isNaN(p)?p:(s?0:r.dom.offsetLeft);q=!isNaN(q)?q:(s?0:r.dom.offsetTop);return{left:(n-u[0]+p),top:(v-u[1]+q)}},animTest:m})})();Ext.Element.addMethods({isScrollable:function(){var a=this.dom;return a.scrollHeight>a.clientHeight||a.scrollWidth>a.clientWidth},scrollTo:function(a,b){this.dom["scroll"+(/top/i.test(a)?"Top":"Left")]=b;return this},getScroll:function(){var j=this.dom,h=document,a=h.body,c=h.documentElement,b,g,e;if(j==h||j==a){if(Ext.isIE&&Ext.isStrict){b=c.scrollLeft;g=c.scrollTop}else{b=window.pageXOffset;g=window.pageYOffset}e={left:b||(a?a.scrollLeft:0),top:g||(a?a.scrollTop:0)}}else{e={left:j.scrollLeft,top:j.scrollTop}}return e}});Ext.Element.VISIBILITY=1;Ext.Element.DISPLAY=2;Ext.Element.addMethods(function(){var h="visibility",d="display",b="hidden",k="none",a="originalDisplay",c="visibilityMode",e=Ext.Element.DISPLAY,g=Ext.Element.data,j=function(n){var m=g(n,a);if(m===undefined){g(n,a,m="")}return m},l=function(o){var n=g(o,c);if(n===undefined){g(o,c,n=1)}return n};return{originalDisplay:"",visibilityMode:1,setVisibilityMode:function(m){g(this.dom,c,m);return this},animate:function(n,p,o,q,m){this.anim(n,{duration:p,callback:o,easing:q},m);return this},anim:function(p,q,n,s,o,m){n=n||"run";q=q||{};var r=this,t=Ext.lib.Anim[n](r.dom,p,(q.duration||s)||0.35,(q.easing||o)||"easeOut",function(){if(m){m.call(r)}if(q.callback){q.callback.call(q.scope||r,r,q)}},r);q.anim=t;return t},preanim:function(m,n){return !m[n]?false:(Ext.isObject(m[n])?m[n]:{duration:m[n+1],callback:m[n+2],easing:m[n+3]})},isVisible:function(){return !this.isStyle(h,b)&&!this.isStyle(d,k)},setVisible:function(q,n){var o=this,p=o.dom,m=l(this.dom)==e;if(!n||!o.anim){if(m){o.setDisplayed(q)}else{o.fixDisplay();p.style.visibility=q?"visible":b}}else{if(q){o.setOpacity(0.01);o.setVisible(true)}o.anim({opacity:{to:(q?1:0)}},o.preanim(arguments,1),null,0.35,"easeIn",function(){if(!q){p.style[m?d:h]=(m)?k:b;Ext.fly(p).setOpacity(1)}})}return o},toggle:function(m){var n=this;n.setVisible(!n.isVisible(),n.preanim(arguments,0));return n},setDisplayed:function(m){if(typeof m=="boolean"){m=m?j(this.dom):k}this.setStyle(d,m);return this},fixDisplay:function(){var m=this;if(m.isStyle(d,k)){m.setStyle(h,b);m.setStyle(d,j(this.dom));if(m.isStyle(d,k)){m.setStyle(d,"block")}}},hide:function(m){this.setVisible(false,this.preanim(arguments,0));return this},show:function(m){this.setVisible(true,this.preanim(arguments,0));return this}}}());(function(){var z=null,B=undefined,l=true,u=false,k="setX",h="setY",a="setXY",o="left",m="bottom",t="top",n="right",r="height",g="width",j="points",x="hidden",A="absolute",v="visible",e="motion",p="position",s="easeOut",d=new Ext.Element.Flyweight(),w={},y=function(C){return C||{}},q=function(C){d.dom=C;d.id=Ext.id(C);return d},c=function(C){if(!w[C]){w[C]=[]}return w[C]},b=function(D,C){w[D]=C};Ext.enableFx=l;Ext.Fx={switchStatements:function(D,E,C){return E.apply(this,C[D])},slideIn:function(I,F){F=y(F);var K=this,H=K.dom,N=H.style,P,C,M,E,D,N,J,O,L,G;I=I||"t";K.queueFx(F,function(){P=q(H).getXY();q(H).fixDisplay();C=q(H).getFxRestore();M={x:P[0],y:P[1],0:P[0],1:P[1],width:H.offsetWidth,height:H.offsetHeight};M.right=M.x+M.width;M.bottom=M.y+M.height;q(H).setWidth(M.width).setHeight(M.height);E=q(H).fxWrap(C.pos,F,x);N.visibility=v;N.position=A;function Q(){q(H).fxUnwrap(E,C.pos,F);N.width=C.width;N.height=C.height;q(H).afterFx(F)}O={to:[M.x,M.y]};L={to:M.width};G={to:M.height};function R(V,S,W,T,Y,aa,ad,ac,ab,X,U){var Z={};q(V).setWidth(W).setHeight(T);if(q(V)[Y]){q(V)[Y](aa)}S[ad]=S[ac]="0";if(ab){Z.width=ab}if(X){Z.height=X}if(U){Z.points=U}return Z}J=q(H).switchStatements(I.toLowerCase(),R,{t:[E,N,M.width,0,z,z,o,m,z,G,z],l:[E,N,0,M.height,z,z,n,t,L,z,z],r:[E,N,M.width,M.height,k,M.right,o,t,z,z,O],b:[E,N,M.width,M.height,h,M.bottom,o,t,z,G,O],tl:[E,N,0,0,z,z,n,m,L,G,O],bl:[E,N,0,0,h,M.y+M.height,n,t,L,G,O],br:[E,N,0,0,a,[M.right,M.bottom],o,t,L,G,O],tr:[E,N,0,0,k,M.x+M.width,o,m,L,G,O]});N.visibility=v;q(E).show();arguments.callee.anim=q(E).fxanim(J,F,e,0.5,s,Q)});return K},slideOut:function(G,E){E=y(E);var I=this,F=I.dom,L=F.style,M=I.getXY(),D,C,J,K,H={to:0};G=G||"t";I.queueFx(E,function(){C=q(F).getFxRestore();J={x:M[0],y:M[1],0:M[0],1:M[1],width:F.offsetWidth,height:F.offsetHeight};J.right=J.x+J.width;J.bottom=J.y+J.height;q(F).setWidth(J.width).setHeight(J.height);D=q(F).fxWrap(C.pos,E,v);L.visibility=v;L.position=A;q(D).setWidth(J.width).setHeight(J.height);function N(){E.useDisplay?q(F).setDisplayed(u):q(F).hide();q(F).fxUnwrap(D,C.pos,E);L.width=C.width;L.height=C.height;q(F).afterFx(E)}function O(P,X,V,Y,T,W,S,U,R){var Q={};P[X]=P[V]="0";Q[Y]=T;if(W){Q[W]=S}if(U){Q[U]=R}return Q}K=q(F).switchStatements(G.toLowerCase(),O,{t:[L,o,m,r,H],l:[L,n,t,g,H],r:[L,o,t,g,H,j,{to:[J.right,J.y]}],b:[L,o,t,r,H,j,{to:[J.x,J.bottom]}],tl:[L,n,m,g,H,r,H],bl:[L,n,t,g,H,r,H,j,{to:[J.x,J.bottom]}],br:[L,o,t,g,H,r,H,j,{to:[J.x+J.width,J.bottom]}],tr:[L,o,m,g,H,r,H,j,{to:[J.right,J.y]}]});arguments.callee.anim=q(D).fxanim(K,E,e,0.5,s,N)});return I},puff:function(I){I=y(I);var G=this,H=G.dom,D=H.style,E,C,F;G.queueFx(I,function(){E=q(H).getWidth();C=q(H).getHeight();q(H).clearOpacity();q(H).show();F=q(H).getFxRestore();function J(){I.useDisplay?q(H).setDisplayed(u):q(H).hide();q(H).clearOpacity();q(H).setPositioning(F.pos);D.width=F.width;D.height=F.height;D.fontSize="";q(H).afterFx(I)}arguments.callee.anim=q(H).fxanim({width:{to:q(H).adjustWidth(E*2)},height:{to:q(H).adjustHeight(C*2)},points:{by:[-E*0.5,-C*0.5]},opacity:{to:0},fontSize:{to:200,unit:"%"}},I,e,0.5,s,J)});return G},switchOff:function(G){G=y(G);var E=this,F=E.dom,C=F.style,D;E.queueFx(G,function(){q(F).clearOpacity();q(F).clip();D=q(F).getFxRestore();function H(){G.useDisplay?q(F).setDisplayed(u):q(F).hide();q(F).clearOpacity();q(F).setPositioning(D.pos);C.width=D.width;C.height=D.height;q(F).afterFx(G)}q(F).fxanim({opacity:{to:0.3}},z,z,0.1,z,function(){q(F).clearOpacity();(function(){q(F).fxanim({height:{to:1},points:{by:[0,q(F).getHeight()*0.5]}},G,e,0.3,"easeIn",H)}).defer(100)})});return E},highlight:function(E,I){I=y(I);var G=this,H=G.dom,C=I.attr||"backgroundColor",D={},F;G.queueFx(I,function(){q(H).clearOpacity();q(H).show();function J(){H.style[C]=F;q(H).afterFx(I)}F=H.style[C];D[C]={from:E||"ffff9c",to:I.endColor||q(H).getColor(C)||"ffffff"};arguments.callee.anim=q(H).fxanim(D,I,"color",1,"easeIn",J)});return G},frame:function(C,F,I){I=y(I);var E=this,H=E.dom,D,G;E.queueFx(I,function(){C=C||"#C3DAF9";if(C.length==6){C="#"+C}F=F||1;q(H).show();var M=q(H).getXY(),K={x:M[0],y:M[1],0:M[0],1:M[1],width:H.offsetWidth,height:H.offsetHeight},J=function(){D=q(document.body||document.documentElement).createChild({style:{visbility:x,position:A,"z-index":35000,border:"0px solid "+C}});return D.queueFx({},L)};arguments.callee.anim={isAnimated:true,stop:function(){F=0;D.stopFx()}};function L(){var N=Ext.isBorderBox?2:1;G=D.anim({top:{from:K.y,to:K.y-20},left:{from:K.x,to:K.x-20},borderWidth:{from:0,to:10},opacity:{from:1,to:0},height:{from:K.height,to:K.height+20*N},width:{from:K.width,to:K.width+20*N}},{duration:I.duration||1,callback:function(){D.remove();--F>0?J():q(H).afterFx(I)}});arguments.callee.anim={isAnimated:true,stop:function(){G.stop()}}}J()});return E},pause:function(E){var D=this.dom,C;this.queueFx({},function(){C=setTimeout(function(){q(D).afterFx({})},E*1000);arguments.callee.anim={isAnimated:true,stop:function(){clearTimeout(C);q(D).afterFx({})}}});return this},fadeIn:function(E){E=y(E);var C=this,D=C.dom,F=E.endOpacity||1;C.queueFx(E,function(){q(D).setOpacity(0);q(D).fixDisplay();D.style.visibility=v;arguments.callee.anim=q(D).fxanim({opacity:{to:F}},E,z,0.5,s,function(){if(F==1){q(D).clearOpacity()}q(D).afterFx(E)})});return C},fadeOut:function(F){F=y(F);var D=this,E=D.dom,C=E.style,G=F.endOpacity||0;D.queueFx(F,function(){arguments.callee.anim=q(E).fxanim({opacity:{to:G}},F,z,0.5,s,function(){if(G==0){Ext.Element.data(E,"visibilityMode")==Ext.Element.DISPLAY||F.useDisplay?C.display="none":C.visibility=x;q(E).clearOpacity()}q(E).afterFx(F)})});return D},scale:function(C,D,E){this.shift(Ext.apply({},E,{width:C,height:D}));return this},shift:function(E){E=y(E);var D=this.dom,C={};this.queueFx(E,function(){for(var F in E){if(E[F]!=B){C[F]={to:E[F]}}}C.width?C.width.to=q(D).adjustWidth(E.width):C;C.height?C.height.to=q(D).adjustWidth(E.height):C;if(C.x||C.y||C.xy){C.points=C.xy||{to:[C.x?C.x.to:q(D).getX(),C.y?C.y.to:q(D).getY()]}}arguments.callee.anim=q(D).fxanim(C,E,e,0.35,s,function(){q(D).afterFx(E)})});return this},ghost:function(F,D){D=y(D);var H=this,E=H.dom,K=E.style,I={opacity:{to:0},points:{}},L=I.points,C,J,G;F=F||"b";H.queueFx(D,function(){C=q(E).getFxRestore();J=q(E).getWidth();G=q(E).getHeight();function M(){D.useDisplay?q(E).setDisplayed(u):q(E).hide();q(E).clearOpacity();q(E).setPositioning(C.pos);K.width=C.width;K.height=C.height;q(E).afterFx(D)}L.by=q(E).switchStatements(F.toLowerCase(),function(O,N){return[O,N]},{t:[0,-G],l:[-J,0],r:[J,0],b:[0,G],tl:[-J,-G],bl:[-J,G],br:[J,G],tr:[J,-G]});arguments.callee.anim=q(E).fxanim(I,D,e,0.5,s,M)});return H},syncFx:function(){var C=this;C.fxDefaults=Ext.apply(C.fxDefaults||{},{block:u,concurrent:l,stopFx:u});return C},sequenceFx:function(){var C=this;C.fxDefaults=Ext.apply(C.fxDefaults||{},{block:u,concurrent:u,stopFx:u});return C},nextFx:function(){var C=c(this.dom.id)[0];if(C){C.call(this)}},hasActiveFx:function(){return c(this.dom.id)[0]},stopFx:function(C){var D=this,F=D.dom.id;if(D.hasActiveFx()){var E=c(F)[0];if(E&&E.anim){if(E.anim.isAnimated){b(F,[E]);E.anim.stop(C!==undefined?C:l)}else{b(F,[])}}}return D},beforeFx:function(C){if(this.hasActiveFx()&&!C.concurrent){if(C.stopFx){this.stopFx();return l}return u}return l},hasFxBlock:function(){var C=c(this.dom.id);return C&&C[0]&&C[0].block},queueFx:function(F,C){var D=this;if(!D.hasFxBlock()){Ext.applyIf(F,D.fxDefaults);if(!F.concurrent){var E=D.beforeFx(F);C.block=F.block;c(D.dom.id).push(C);if(E){D.nextFx()}}else{C.call(D)}}return D},fxWrap:function(I,G,E){var F=this.dom,D,C;if(!G.wrap||!(D=Ext.getDom(G.wrap))){if(G.fixPosition){C=q(F).getXY()}var H=document.createElement("div");H.style.visibility=E;D=F.parentNode.insertBefore(H,F);q(D).setPositioning(I);if(q(D).isStyle(p,"static")){q(D).position("relative")}q(F).clearPositioning("auto");q(D).clip();D.appendChild(F);if(C){q(D).setXY(C)}}return D},fxUnwrap:function(C,F,E){var D=this.dom;q(D).clearPositioning();q(D).setPositioning(F);if(!E.wrap){C.parentNode.insertBefore(D,C);q(C).remove()}},getFxRestore:function(){var C=this.dom.style;return{pos:this.getPositioning(),width:C.width,height:C.height}},afterFx:function(D){var C=this.dom,E=C.id;if(D.afterStyle){q(C).setStyle(D.afterStyle)}if(D.afterCls){q(C).addClass(D.afterCls)}if(D.remove==l){q(C).remove()}if(D.callback){D.callback.call(D.scope,q(C))}if(!D.concurrent){c(E).shift();q(C).nextFx()}},fxanim:function(F,G,D,H,E,C){D=D||"run";G=G||{};var I=Ext.lib.Anim[D](this.dom,F,(G.duration||H)||0.35,(G.easing||E)||s,C,this);G.anim=I;return I}};Ext.Fx.resize=Ext.Fx.scale;Ext.Element.addMethods(Ext.Fx)})();Ext.CompositeElementLite=function(b,a){this.elements=[];this.add(b,a);this.el=new Ext.Element.Flyweight()};Ext.CompositeElementLite.prototype={isComposite:true,getCount:function(){return this.elements.length},add:function(b){if(b){if(Ext.isArray(b)){this.elements=this.elements.concat(b)}else{var a=this.elements;Ext.each(b,function(c){a.push(c)})}}return this},invoke:function(d,a){var b=this.elements,c=this.el;Ext.each(b,function(g){c.dom=g;Ext.Element.prototype[d].apply(c,a)});return this},item:function(a){var b=this;if(!b.elements[a]){return null}b.el.dom=b.elements[a];return b.el},addListener:function(a,d,c,b){Ext.each(this.elements,function(g){Ext.EventManager.on(g,a,d,c||g,b)});return this},each:function(c,b){var d=this,a=d.el;Ext.each(d.elements,function(h,g){a.dom=h;return c.call(b||a,a,d,g)});return d},indexOf:function(a){return this.elements.indexOf(Ext.getDom(a))},replaceElement:function(e,c,a){var b=!isNaN(e)?e:this.indexOf(e),g;if(b>-1){c=Ext.getDom(c);if(a){g=this.elements[b];g.parentNode.insertBefore(c,g);Ext.removeNode(g)}this.elements.splice(b,1,c)}return this},clear:function(){this.elements=[]}};Ext.CompositeElementLite.prototype.on=Ext.CompositeElementLite.prototype.addListener;(function(){var c,b=Ext.Element.prototype,a=Ext.CompositeElementLite.prototype;for(var c in b){if(Ext.isFunction(b[c])){(function(d){a[d]=a[d]||function(){return this.invoke(d,arguments)}}).call(a,c)}}})();if(Ext.DomQuery){Ext.Element.selectorFunction=Ext.DomQuery.select}Ext.Element.select=function(a,d,b){var c;if(typeof a=="string"){c=Ext.Element.selectorFunction(a,b)}else{if(a.length!==undefined){c=a}else{throw"Invalid selector"}}return new Ext.CompositeElementLite(c)};Ext.select=Ext.Element.select;(function(){var c="beforerequest",m="requestcomplete",l="requestexception",e=undefined,j="load",h="POST",k="GET",g=window;Ext.data.Connection=function(n){Ext.apply(this,n);this.addEvents(c,m,l);Ext.data.Connection.superclass.constructor.call(this)};function b(n){this.transId=false;var o=n.argument.options;n.argument=o?o.argument:null;this.fireEvent(m,this,n,o);if(o.success){o.success.call(o.scope,n,o)}if(o.callback){o.callback.call(o.scope,o,true,n)}}function d(n,p){this.transId=false;var o=n.argument.options;n.argument=o?o.argument:null;this.fireEvent(l,this,n,o,p);if(o.failure){o.failure.call(o.scope,n,o)}if(o.callback){o.callback.call(o.scope,o,false,n)}}function a(s,n,p){var q=Ext.id(),y=document,t=y.createElement("iframe"),r=Ext.getDom(s.form),x=[],w;t.id=t.name=q;t.className="x-hidden";t.src=Ext.SSL_SECURE_URL;y.body.appendChild(t);if(Ext.isIE){y.frames[q].name=q}r.target=q;r.method=h;r.enctype=r.encoding="multipart/form-data";r.action=p||"";n=Ext.urlDecode(n,false);for(var v in n){if(n.hasOwnProperty(v)){w=y.createElement("input");w.type="hidden";w.value=n[w.name=v];r.appendChild(w);x.push(w)}}function u(){var z=this,o={responseText:"",responseXML:null,argument:s.argument},C,B;try{C=t.contentWindow.document||t.contentDocument||g.frames[q].document;if(C){if(C.body){if(/textarea/i.test((B=C.body.firstChild||{}).tagName)){o.responseText=B.value}else{o.responseText=C.body.innerHTML}}else{o.responseXML=C.XMLDocument||C}}}catch(A){}Ext.EventManager.removeListener(t,j,u,z);z.fireEvent(m,z,o,s);Ext.callback(s.success,s.scope,[o,s]);Ext.callback(s.callback,s.scope,[s,true,o]);if(!z.debugUploads){setTimeout(function(){Ext.removeNode(t)},100)}}Ext.EventManager.on(t,j,u,this);r.submit();Ext.each(x,function(o){Ext.removeNode(o)})}Ext.extend(Ext.data.Connection,Ext.util.Observable,{timeout:30000,autoAbort:false,disableCaching:true,disableCachingParam:"_dc",request:function(t){var w=this;if(w.fireEvent(c,w,t)){if(t.el){if(!Ext.isEmpty(t.indicatorText)){w.indicatorText='<div class="loading-indicator">'+t.indicatorText+"</div>"}if(w.indicatorText){Ext.getDom(t.el).innerHTML=w.indicatorText}t.success=(Ext.isFunction(t.success)?t.success:function(){}).createInterceptor(function(o){Ext.getDom(t.el).innerHTML=o.responseText})}var r=t.params,q=t.url||w.url,n,u={success:b,failure:d,scope:w,argument:{options:t},timeout:t.timeout||w.timeout},s,x;if(Ext.isFunction(r)){r=r.call(t.scope||g,t)}r=Ext.urlEncode(w.extraParams,typeof r=="object"?Ext.urlEncode(r):r);if(Ext.isFunction(q)){q=q.call(t.scope||g,t)}if(s=Ext.getDom(t.form)){q=q||s.action;if(t.isUpload||/multipart\/form-data/i.test(s.getAttribute("enctype"))){return a.call(w,t,r,q)}x=Ext.lib.Ajax.serializeForm(s);r=r?(r+"&"+x):x}n=t.method||w.method||((r||t.xmlData||t.jsonData)?h:k);if(n===k&&(w.disableCaching&&t.disableCaching!==false)||t.disableCaching===true){var v=t.disableCachingParam||w.disableCachingParam;q+=(q.indexOf("?")!=-1?"&":"?")+v+"="+(new Date().getTime())}t.headers=Ext.apply(t.headers||{},w.defaultHeaders||{});if(t.autoAbort===true||w.autoAbort){w.abort()}if((n==k||t.xmlData||t.jsonData)&&r){q+=(/\?/.test(q)?"&":"?")+r;r=""}return w.transId=Ext.lib.Ajax.request(n,q,u,r,t)}else{return t.callback?t.callback.apply(t.scope,[t,e,e]):null}},isLoading:function(n){return n?Ext.lib.Ajax.isCallInProgress(n):!!this.transId},abort:function(n){if(n||this.isLoading()){Ext.lib.Ajax.abort(n||this.transId)}}})})();Ext.Ajax=new Ext.data.Connection({autoAbort:false,serializeForm:function(a){return Ext.lib.Ajax.serializeForm(a)}});Ext.util.DelayedTask=function(d,c,a){var e=this,g,b=function(){clearInterval(g);g=null;d.apply(c,a||[])};e.delay=function(j,l,k,h){e.cancel();d=l||d;c=k||c;a=h||a;g=setInterval(b,j)};e.cancel=function(){if(g){clearInterval(g);g=null}}};Ext.util.JSON=new (function(){var useHasOwn=!!{}.hasOwnProperty,isNative=Ext.USE_NATIVE_JSON&&JSON&&JSON.toString()=="[object JSON]";var pad=function(n){return n<10?"0"+n:n};var m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};var encodeString=function(s){if(/["\\\x00-\x1f]/.test(s)){return'"'+s.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c}c=b.charCodeAt();return"\\u00"+Math.floor(c/16).toString(16)+(c%16).toString(16)})+'"'}return'"'+s+'"'};var encodeArray=function(o){var a=["["],b,i,l=o.length,v;for(i=0;i<l;i+=1){v=o[i];switch(typeof v){case"undefined":case"function":case"unknown":break;default:if(b){a.push(",")}a.push(v===null?"null":Ext.util.JSON.encode(v));b=true}}a.push("]");return a.join("")};this.encodeDate=function(o){return'"'+o.getFullYear()+"-"+pad(o.getMonth()+1)+"-"+pad(o.getDate())+"T"+pad(o.getHours())+":"+pad(o.getMinutes())+":"+pad(o.getSeconds())+'"'};this.encode=isNative?JSON.stringify:function(o){if(typeof o=="undefined"||o===null){return"null"}else{if(Ext.isArray(o)){return encodeArray(o)}else{if(Object.prototype.toString.apply(o)==="[object Date]"){return Ext.util.JSON.encodeDate(o)}else{if(typeof o=="string"){return encodeString(o)}else{if(typeof o=="number"){return isFinite(o)?String(o):"null"}else{if(typeof o=="boolean"){return String(o)}else{var a=["{"],b,i,v;for(i in o){if(!useHasOwn||o.hasOwnProperty(i)){v=o[i];switch(typeof v){case"undefined":case"function":case"unknown":break;default:if(b){a.push(",")}a.push(this.encode(i),":",v===null?"null":this.encode(v));b=true}}}a.push("}");return a.join("")}}}}}}};this.decode=isNative?JSON.parse:function(json){return eval("("+json+")")}})();Ext.encode=Ext.util.JSON.encode;Ext.decode=Ext.util.JSON.decode;
/*****************************************************************

typeface.js, version 0.13 | typefacejs.neocracy.org

Copyright (c) 2008 - 2009, David Chester davidchester@gmx.net 

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

*****************************************************************/

(function() {

var _typeface_js = {

 faces: {},

 loadFace: function(typefaceData) {

 var familyName = typefaceData.familyName.toLowerCase();
 
 if (!this.faces[familyName]) {
 this.faces[familyName] = {};
 }
 if (!this.faces[familyName][typefaceData.cssFontWeight]) {
 this.faces[familyName][typefaceData.cssFontWeight] = {};
 }

 var face = this.faces[familyName][typefaceData.cssFontWeight][typefaceData.cssFontStyle] = typefaceData;
 face.loaded = true;
 },

 log: function(message) {
 
 if (this.quiet) {
 return;
 }
 
 message = "typeface.js: " + message;
 
 if (this.customLogFn) {
 this.customLogFn(message);

 } else if (window.console && window.console.log) {
 window.console.log(message);
 }
 
 },
 
 pixelsFromPoints: function(face, style, points, dimension) {
 var pixels = points * parseInt(style.fontSize) * 72 / (face.resolution * 100);
 if (dimension == 'horizontal' && style.fontStretchPercent) {
 pixels *= style.fontStretchPercent;
 }
 return pixels;
 },

 pointsFromPixels: function(face, style, pixels, dimension) {
 var points = pixels * face.resolution / (parseInt(style.fontSize) * 72 / 100);
 if (dimension == 'horizontal' && style.fontStretchPrecent) {
 points *= style.fontStretchPercent;
 }
 return points;
 },

 cssFontWeightMap: {
 normal: 'normal',
 bold: 'bold',
 400: 'normal',
 700: 'bold'
 },

 cssFontStretchMap: {
 'ultra-condensed': 0.55,
 'extra-condensed': 0.77,
 'condensed': 0.85,
 'semi-condensed': 0.93,
 'normal': 1,
 'semi-expanded': 1.07,
 'expanded': 1.15,
 'extra-expanded': 1.23,
 'ultra-expanded': 1.45,
 'default': 1
 },
 
 fallbackCharacter: '.',

 configure: function(args) {
 var configurableOptionNames = [ 'customLogFn', 'customClassNameRegex', 'customTypefaceElementsList', 'quiet', 'verbose', 'disableSelection' ];
 
 for (var i = 0; i < configurableOptionNames.length; i++) {
 var optionName = configurableOptionNames[i];
 if (args[optionName]) {
 if (optionName == 'customLogFn') {
 if (typeof args[optionName] != 'function') {
 throw "customLogFn is not a function";
 } else {
 this.customLogFn = args.customLogFn;
 }
 } else {
 this[optionName] = args[optionName];
 }
 }
 }
 },

 getTextExtents: function(face, style, text) {
 var extentX = 0;
 var extentY = 0;
 var horizontalAdvance;
 
 var textLength = text.length;
 for (var i = 0; i < textLength; i++) {
 var glyph = face.glyphs[text.charAt(i)] ? face.glyphs[text.charAt(i)] : face.glyphs[this.fallbackCharacter];
 var letterSpacingAdjustment = this.pointsFromPixels(face, style, style.letterSpacing);
 extentX += Math.max(glyph.ha, glyph.x_max) + letterSpacingAdjustment;
 horizontalAdvance += glyph.ha + letterSpacingAdjustment;
 }
 return { 
 x: extentX, 
 y: extentY,
 ha: horizontalAdvance
 
 };
 },

 pixelsFromCssAmount: function(cssAmount, defaultValue, element) {

 var matches = undefined;

 if (cssAmount == 'normal') {
 return defaultValue;

 } else if (matches = cssAmount.match(/([\-\d+\.]+)px/)) {
 return matches[1];

 } else {
 // thanks to Dean Edwards for this very sneaky way to get IE to convert 
 // relative values to pixel values
 
 var pixelAmount;
 
 var leftInlineStyle = element.style.left;
 var leftRuntimeStyle = element.runtimeStyle.left;

 element.runtimeStyle.left = element.currentStyle.left;

 if (!cssAmount.match(/\d(px|pt)$/)) {
 element.style.left = '1em';
 } else {
 element.style.left = cssAmount || 0;
 }

 pixelAmount = element.style.pixelLeft;
 
 element.style.left = leftInlineStyle;
 element.runtimeStyle.left = leftRuntimeStyle;
 
 return pixelAmount || defaultValue;
 }
 },

 capitalizeText: function(text) {
 return text.replace(/(^|\s)[a-z]/g, function(match) { return match.toUpperCase() } ); 
 },

 getElementStyle: function(e) {
 if (window.getComputedStyle) {
 return window.getComputedStyle(e, '');
 
 } else if (e.currentStyle) {
 return e.currentStyle;
 }
 },

 getRenderedText: function(e) {

 var browserStyle = this.getElementStyle(e.parentNode);

 var inlineStyleAttribute = e.parentNode.getAttribute('style');
 if (inlineStyleAttribute && typeof(inlineStyleAttribute) == 'object') {
 inlineStyleAttribute = inlineStyleAttribute.cssText;
 }

 if (inlineStyleAttribute) {

 var inlineStyleDeclarations = inlineStyleAttribute.split(/\s*\;\s*/);

 var inlineStyle = {};
 for (var i = 0; i < inlineStyleDeclarations.length; i++) {
 var declaration = inlineStyleDeclarations[i];
 var declarationOperands = declaration.split(/\s*\:\s*/);
 inlineStyle[declarationOperands[0]] = declarationOperands[1];
 }
 }

 var style = { 
 color: browserStyle.color, 
 fontFamily: browserStyle.fontFamily.split(/\s*,\s*/)[0].replace(/(^"|^'|'$|"$)/g, '').toLowerCase(), 
 fontSize: this.pixelsFromCssAmount(browserStyle.fontSize, 12, e.parentNode),
 fontWeight: this.cssFontWeightMap[browserStyle.fontWeight],
 fontStyle: browserStyle.fontStyle ? browserStyle.fontStyle : 'normal',
 fontStretchPercent: this.cssFontStretchMap[inlineStyle && inlineStyle['font-stretch'] ? inlineStyle['font-stretch'] : 'default'],
 textDecoration: browserStyle.textDecoration,
 lineHeight: this.pixelsFromCssAmount(browserStyle.lineHeight, 'normal', e.parentNode),
 letterSpacing: this.pixelsFromCssAmount(browserStyle.letterSpacing, 0, e.parentNode),
 textTransform: browserStyle.textTransform
 };

 var face;
 if (
 this.faces[style.fontFamily] 
 && this.faces[style.fontFamily][style.fontWeight]
 ) {
 face = this.faces[style.fontFamily][style.fontWeight][style.fontStyle];
 }

 var text = e.nodeValue;
 
 if (
 e.previousSibling 
 && e.previousSibling.nodeType == 1 
 && e.previousSibling.tagName != 'BR' 
 && this.getElementStyle(e.previousSibling).display.match(/inline/) 
 ) {
 text = text.replace(/^\s+/, ' ');
 } else {
 text = text.replace(/^\s+/, '');
 }
 
 if (
 e.nextSibling 
 && e.nextSibling.nodeType == 1 
 && e.nextSibling.tagName != 'BR' 
 && this.getElementStyle(e.nextSibling).display.match(/inline/)
 ) {
 text = text.replace(/\s+$/, ' ');
 } else {
 text = text.replace(/\s+$/, '');
 }
 
 text = text.replace(/\s+/g, ' ');
 
 if (style.textTransform && style.textTransform != 'none') {
 switch (style.textTransform) {
 case 'capitalize':
 text = this.capitalizeText(text);
 break;
 case 'uppercase':
 text = text.toUpperCase();
 break;
 case 'lowercase':
 text = text.toLowerCase();
 break;
 }
 }

 if (!face) {
 var excerptLength = 12;
 var textExcerpt = text.substring(0, excerptLength);
 if (text.length > excerptLength) {
 textExcerpt += '...';
 }
 
 var fontDescription = style.fontFamily;
 if (style.fontWeight != 'normal') fontDescription += ' ' + style.fontWeight;
 if (style.fontStyle != 'normal') fontDescription += ' ' + style.fontStyle;
 
 this.log("couldn't find typeface font: " + fontDescription + ' for text "' + textExcerpt + '"');
 return;
 }
 
 var words = text.split(/\b(?=\w)/);

 var containerSpan = document.createElement('span');
 containerSpan.className = 'typeface-js-vector-container';
 
 var wordsLength = words.length
 for (var i = 0; i < wordsLength; i++) {
 var word = words[i];
 
 var vector = this.renderWord(face, style, word);
 
 if (vector) {
 containerSpan.appendChild(vector.element);

 if (!this.disableSelection) {
 var selectableSpan = document.createElement('span');
 selectableSpan.className = 'typeface-js-selected-text';

 var wordNode = document.createTextNode(word);
 selectableSpan.appendChild(wordNode);

 if (this.vectorBackend != 'vml') {
 selectableSpan.style.marginLeft = -1 * (vector.width + 1) + 'px';
 }
 selectableSpan.targetWidth = vector.width;
 //selectableSpan.style.lineHeight = 1 + 'px';

 if (this.vectorBackend == 'vml') {
 vector.element.appendChild(selectableSpan);
 } else {
 containerSpan.appendChild(selectableSpan);
 }
 }
 }
 }

 return containerSpan;
 },

 renderDocument: function(callback) { 
 
 if (!callback)
 callback = function(e) { e.style.visibility = 'visible' };

 var elements = document.getElementsByTagName('*');
 
 var elementsLength = elements.length;
 for (var i = 0; i < elements.length; i++) {
 if (elements[i].className.match(/(^|\s)renderFont(\s|$)/) || elements[i].tagName.match(/^(H1|H2)$/)) {
 this.replaceText(elements[i]);
 if (typeof callback == 'function') {
 callback(elements[i]);
 }
 }
 }

 if (this.vectorBackend == 'vml') {
 // lamely work around IE's quirky leaving off final dynamic shapes
 var dummyShape = document.createElement('v:shape');
 dummyShape.style.display = 'none';
 document.body.appendChild(dummyShape);
 }
 },

 replaceText: function(e) {

 var childNodes = [];
 var childNodesLength = e.childNodes.length;

 for (var i = 0; i < childNodesLength; i++) {
 this.replaceText(e.childNodes[i]);
 }

 if (e.nodeType == 3 && e.nodeValue.match(/\S/)) {
 var parentNode = e.parentNode;

 if (parentNode.className == 'typeface-js-selected-text') {
 return;
 }

 var renderedText = this.getRenderedText(e);
 
 if (
 parentNode.tagName == 'A' 
 && this.vectorBackend == 'vml'
 && this.getElementStyle(parentNode).display == 'inline'
 ) {
 // something of a hack, use inline-block to get IE to accept clicks in whitespace regions
 parentNode.style.display = 'inline-block';
 parentNode.style.cursor = 'pointer';
 }

 if (this.getElementStyle(parentNode).display == 'inline') {
 parentNode.style.display = 'inline-block';
 }

 if (renderedText) { 
 if (parentNode.replaceChild) {
 parentNode.replaceChild(renderedText, e);
 } else {
 parentNode.insertBefore(renderedText, e);
 parentNode.removeChild(e);
 }
 if (this.vectorBackend == 'vml') {
 renderedText.innerHTML = renderedText.innerHTML;
 }

 var childNodesLength = renderedText.childNodes.length
 for (var i; i < childNodesLength; i++) {
 
 // do our best to line up selectable text with rendered text

 var e = renderedText.childNodes[i];
 if (e.hasChildNodes() && !e.targetWidth) {
 e = e.childNodes[0];
 }
 
 if (e && e.targetWidth) {
 var letterSpacingCount = e.innerHTML.length;
 var wordSpaceDelta = e.targetWidth - e.offsetWidth;
 var letterSpacing = wordSpaceDelta / (letterSpacingCount || 1);

 if (this.vectorBackend == 'vml') {
 letterSpacing = Math.ceil(letterSpacing);
 }

 e.style.letterSpacing = letterSpacing + 'px';
 e.style.width = e.targetWidth + 'px';
 }
 }
 }
 }
 },

 applyElementVerticalMetrics: function(face, style, e) {

 if (style.lineHeight == 'normal') {
 style.lineHeight = this.pixelsFromPoints(face, style, face.lineHeight);
 }

 var cssLineHeightAdjustment = style.lineHeight - this.pixelsFromPoints(face, style, face.lineHeight);

 e.style.marginTop = Math.round( cssLineHeightAdjustment / 2 ) + 'px';
 e.style.marginBottom = Math.round( cssLineHeightAdjustment / 2) + 'px';
 
 },

 vectorBackends: {

 canvas: {

 _initializeSurface: function(face, style, text) {

 var extents = this.getTextExtents(face, style, text);

 var canvas = document.createElement('canvas');
 if (this.disableSelection) {
 canvas.innerHTML = text;
 }

 canvas.height = Math.round(this.pixelsFromPoints(face, style, face.lineHeight));
 canvas.width = Math.round(this.pixelsFromPoints(face, style, extents.x, 'horizontal'));
 
 this.applyElementVerticalMetrics(face, style, canvas);

 if (extents.x > extents.ha) 
 canvas.style.marginRight = Math.round(this.pixelsFromPoints(face, style, extents.x - extents.ha, 'horizontal')) + 'px';

 var ctx = canvas.getContext('2d');

 var pointScale = this.pixelsFromPoints(face, style, 1);
 ctx.scale(pointScale * style.fontStretchPercent, -1 * pointScale);
 ctx.translate(0, -1 * face.ascender);
 ctx.fillStyle = style.color;

 return { context: ctx, canvas: canvas };
 },

 _renderGlyph: function(ctx, face, char, style) {

 var glyph = face.glyphs[char];

 if (!glyph) {
 //this.log.error("glyph not defined: " + char);
 return this.renderGlyph(ctx, face, this.fallbackCharacter, style);
 }

 if (glyph.o) {

 var outline;
 if (glyph.cached_outline) {
 outline = glyph.cached_outline;
 } else {
 outline = glyph.o.split(' ');
 glyph.cached_outline = outline;
 }

 var outlineLength = outline.length;
 for (var i = 0; i < outlineLength; ) {

 var action = outline[i++];

 switch(action) {
 case 'm':
 ctx.moveTo(outline[i++], outline[i++]);
 break;
 case 'l':
 ctx.lineTo(outline[i++], outline[i++]);
 break;

 case 'q':
 var cpx = outline[i++];
 var cpy = outline[i++];
 ctx.quadraticCurveTo(outline[i++], outline[i++], cpx, cpy);
 break;
 }
 } 
 }
 if (glyph.ha) {
 var letterSpacingPoints = 
 style.letterSpacing && style.letterSpacing != 'normal' ? 
 this.pointsFromPixels(face, style, style.letterSpacing) : 
 0;

 ctx.translate(glyph.ha + letterSpacingPoints, 0);
 }
 },

 _renderWord: function(face, style, text) {
 var surface = this.initializeSurface(face, style, text);
 var ctx = surface.context;
 var canvas = surface.canvas;
 ctx.beginPath();
 ctx.save();

 var chars = text.split('');
 var charsLength = chars.length;
 for (var i = 0; i < charsLength; i++) {
 this.renderGlyph(ctx, face, chars[i], style);
 }

 ctx.fill();

 if (style.textDecoration == 'underline') {

 ctx.beginPath();
 ctx.moveTo(0, face.underlinePosition);
 ctx.restore();
 ctx.lineTo(0, face.underlinePosition);
 ctx.strokeStyle = style.color;
 ctx.lineWidth = face.underlineThickness;
 ctx.stroke();
 }

 return { element: ctx.canvas, width: Math.floor(canvas.width) };
 
 }
 },

 vml: {

 _initializeSurface: function(face, style, text) {

 var shape = document.createElement('v:shape');

 var extents = this.getTextExtents(face, style, text);
 
 shape.style.width = shape.style.height = style.fontSize + 'px'; 
 shape.style.marginLeft = '-1px'; // this seems suspect...

 if (extents.x > extents.ha) {
 shape.style.marginRight = this.pixelsFromPoints(face, style, extents.x - extents.ha, 'horizontal') + 'px';
 }

 this.applyElementVerticalMetrics(face, style, shape);

 var resolutionScale = face.resolution * 100 / 72;
 shape.coordsize = (resolutionScale / style.fontStretchPercent) + "," + resolutionScale;
 
 shape.coordorigin = '0,' + face.ascender;
 shape.style.flip = 'y';

 shape.fillColor = style.color;
 shape.stroked = false;

 shape.path = 'hh m 0,' + face.ascender + ' l 0,' + face.descender + ' ';

 return shape;
 },

 _renderGlyph: function(shape, face, char, offsetX, style, vmlSegments) {

 var glyph = face.glyphs[char];

 if (!glyph) {
 this.log("glyph not defined: " + char);
 this.renderGlyph(shape, face, this.fallbackCharacter, offsetX, style);
 return;
 }
 
 vmlSegments.push('m');

 if (glyph.o) {
 
 var outline, outlineLength;
 
 if (glyph.cached_outline) {
 outline = glyph.cached_outline;
 outlineLength = outline.length;
 } else {
 outline = glyph.o.split(' ');
 outlineLength = outline.length;

 for (var i = 0; i < outlineLength;) {

 switch(outline[i++]) {
 case 'q':
 outline[i] = Math.round(outline[i++]);
 outline[i] = Math.round(outline[i++]);
 case 'm':
 case 'l':
 outline[i] = Math.round(outline[i++]);
 outline[i] = Math.round(outline[i++]);
 break;
 } 
 } 

 glyph.cached_outline = outline;
 }

 var prevX, prevY;
 
 for (var i = 0; i < outlineLength;) {

 var action = outline[i++];

 var x = outline[i++] + offsetX;
 var y = outline[i++];
 
 switch(action) {
 case 'm':
 vmlSegments.push('xm ', x, ',', y);
 break;
 
 case 'l':
 vmlSegments.push('l ', x, ',', y);
 break;

 case 'q':
 var cpx = outline[i++] + offsetX;
 var cpy = outline[i++];

 var cp1x = Math.round(prevX + 2.0 / 3.0 * (cpx - prevX));
 var cp1y = Math.round(prevY + 2.0 / 3.0 * (cpy - prevY));

 var cp2x = Math.round(cp1x + (x - prevX) / 3.0);
 var cp2y = Math.round(cp1y + (y - prevY) / 3.0);
 
 vmlSegments.push('c ', cp1x, ',', cp1y, ',', cp2x, ',', cp2y, ',', x, ',', y);
 break;
 }

 prevX = x;
 prevY = y;
 } 
 }

 vmlSegments.push('x e');
 return vmlSegments;
 },

 _renderWord: function(face, style, text) {
 var offsetX = 0;
 var shape = this.initializeSurface(face, style, text);
 
 var letterSpacingPoints = 
 style.letterSpacing && style.letterSpacing != 'normal' ? 
 this.pointsFromPixels(face, style, style.letterSpacing) : 
 0;

 letterSpacingPoints = Math.round(letterSpacingPoints);
 var chars = text.split('');
 var vmlSegments = [];
 for (var i = 0; i < chars.length; i++) {
 var char = chars[i];
 vmlSegments = this.renderGlyph(shape, face, char, offsetX, style, vmlSegments);
 offsetX += face.glyphs[char].ha + letterSpacingPoints ; 
 }

 // make sure to preserve trailing whitespace
 shape.path += vmlSegments.join('') + 'm ' + offsetX + ' 0 l ' + offsetX + ' ' + face.ascender;
 
 return {
 element: shape,
 width: Math.floor(this.pixelsFromPoints(face, style, offsetX, 'horizontal'))
 };
 }

 }

 },

 setVectorBackend: function(backend) {

 this.vectorBackend = backend;
 var backendFunctions = ['renderWord', 'initializeSurface', 'renderGlyph'];

 for (var i = 0; i < backendFunctions.length; i++) {
 var backendFunction = backendFunctions[i];
 this[backendFunction] = this.vectorBackends[backend]['_' + backendFunction];
 }
 },
 
 initialize: function() {

 // quit if this function has already been called
 if (arguments.callee.done) return; 
 
 // flag this function so we don't do the same thing twice
 arguments.callee.done = true;

 // kill the timer
 if (window._typefaceTimer) clearInterval(_typefaceTimer);

 this.renderDocument( function(e) { e.style.visibility = 'visible' } );

 }
 
};

// IE won't accept real selectors...
var typefaceSelectors = ['.renderFont', 'h1', 'h2'];

if (document.createStyleSheet) { 

 var styleSheet = document.createStyleSheet();
 for (var i = 0; i < typefaceSelectors.length; i++) {
 var selector = typefaceSelectors[i];
 styleSheet.addRule(selector, 'visibility: hidden');
 }

 styleSheet.addRule(
 '.typeface-js-selected-text', 
 '-ms-filter: \
 "Chroma(color=black) \
 progid:DXImageTransform.Microsoft.MaskFilter(Color=white) \
 progid:DXImageTransform.Microsoft.MaskFilter(Color=blue) \
 alpha(opacity=30)" !important; \
 color: black; \
 font-family: Modern; \
 position: absolute; \
 white-space: pre; \
 filter: alpha(opacity=0);'
 );

 styleSheet.addRule(
 '.typeface-js-vector-container',
 'position: relative'
 );

} else if (document.styleSheets && document.styleSheets.length) {

 var styleSheet = document.styleSheets[0];
 document.styleSheets[0].insertRule(typefaceSelectors.join(',') + ' { visibility: hidden; }', styleSheet.cssRules.length); 

 document.styleSheets[0].insertRule(
 '.typeface-js-selected-text { \
 color: rgba(128, 128, 128, 0); \
 opacity: 0.30; \
 position: absolute; \
 font-family: Arial, sans-serif; \
 white-space: pre \
 }', 
 styleSheet.cssRules.length
 );

 try { 
 // set selection style for Mozilla / Firefox
 document.styleSheets[0].insertRule(
 '.typeface-js-selected-text::-moz-selection { background: blue; }', 
 styleSheet.cssRules.length
 ); 

 } catch(e) {};

 try { 
 // set styles for browsers with CSS3 selectors (Safari, Chrome)
 document.styleSheets[0].insertRule(
 '.typeface-js-selected-text::selection { background: blue; }', 
 styleSheet.cssRules.length
 ); 

 } catch(e) {};

 // most unfortunately, sniff for WebKit's quirky selection behavior
 if (/WebKit/i.test(navigator.userAgent)) {
 document.styleSheets[0].insertRule(
 '.typeface-js-vector-container { position: relative }',
 styleSheet.cssRules.length
 );
 }

}

var backend = !!(window.attachEvent && !window.opera) ? 'vml' : window.CanvasRenderingContext2D || document.createElement('canvas').getContext ? 'canvas' : null;

if (backend == 'vml') {

 document.namespaces.add("v","urn:schemas-microsoft-com:vml","#default#VML");

 var styleSheet = document.createStyleSheet();
 styleSheet.addRule('v\\:shape', "display: inline-block;");
}

_typeface_js.setVectorBackend(backend);
window._typeface_js = _typeface_js;
 
if (/WebKit/i.test(navigator.userAgent)) {

 var _typefaceTimer = setInterval(function() {
 if (/loaded|complete/.test(document.readyState)) {
 _typeface_js.initialize(); 
 }
 }, 10);
}

if (document.addEventListener) {
 window.addEventListener('DOMContentLoaded', function() { _typeface_js.initialize() }, false);
} 

/*@cc_on @*/
/*@if (@_win32)

document.write("<script id=__ie_onload_typeface defer src=//:><\/script>");
var script = document.getElementById("__ie_onload_typeface");
script.onreadystatechange = function() {
 if (this.readyState == "complete") {
 _typeface_js.initialize(); 
 }
};

/*@end @*/

try { console.log('initializing typeface.js') } catch(e) {};

})();

if (_typeface_js && _typeface_js.loadFace) _typeface_js.loadFace({"glyphs":{"⌐":{"x_min":46,"x_max":780,"ha":825,"o":"m 780 683 l 780 592 l 134 592 l 134 270 l 46 270 l 46 683 l 780 683 "},"♀":{"x_min":162,"x_max":858,"ha":1021,"o":"m 529 316 l 529 40 l 834 40 l 834 0 l 529 0 l 529 -297 l 490 -297 l 490 0 l 184 0 l 184 40 l 490 40 l 490 312 q 339 356 421 312 q 210 486 258 401 q 162 666 162 571 q 208 842 162 758 q 336 974 254 927 q 510 1021 419 1021 q 683 973 600 1021 q 812 841 766 926 q 858 664 858 756 q 762 419 858 522 q 529 316 667 316 m 509 983 q 356 942 431 983 q 239 824 281 901 q 198 665 198 747 q 289 440 198 533 q 509 347 380 347 q 730 440 639 347 q 822 665 822 533 q 780 824 822 747 q 663 942 738 901 q 509 983 588 983 "},"ǻ":{"x_min":67,"x_max":725.9375,"ha":757,"o":"m 702 69 l 725 31 q 618 -19 677 -19 q 542 6 573 -19 q 488 94 511 31 q 377 3 425 26 q 262 -19 329 -19 q 116 23 166 -19 q 67 130 67 65 q 181 295 67 229 q 484 382 295 360 l 484 478 q 443 566 484 529 q 340 603 403 603 q 240 578 282 603 q 211 542 211 560 q 227 511 211 532 q 247 462 247 483 q 227 413 247 432 q 177 394 208 394 q 121 417 143 394 q 99 475 99 440 q 173 598 99 542 q 367 654 247 654 q 536 605 478 654 q 595 485 595 555 l 595 138 q 609 70 595 92 q 647 48 624 48 q 702 69 673 48 m 484 337 q 245 260 315 313 q 193 145 193 219 q 220 63 193 92 q 291 34 247 34 q 427 94 369 34 q 484 246 484 155 l 484 337 m 382 1034 q 479 992 438 1034 q 520 893 520 951 q 479 792 520 834 q 380 751 438 751 q 282 792 323 751 q 242 891 242 833 q 283 992 242 950 q 382 1034 324 1034 m 382 978 q 321 952 346 978 q 297 891 297 927 q 321 831 297 856 q 381 807 346 807 q 440 832 415 807 q 465 892 465 857 q 440 953 465 928 q 382 978 416 978 m 295 1058 l 278 1075 l 391 1241 q 457 1325 438 1310 q 495 1340 476 1340 q 534 1323 517 1340 q 551 1285 551 1306 q 503 1216 551 1252 l 295 1058 "},"":{"x_min":74,"x_max":989,"ha":1063,"o":"m 989 461 q 854 119 989 259 q 534 -21 720 -21 q 211 119 348 -21 q 74 460 74 260 q 207 798 74 656 q 531 940 341 940 q 853 800 718 940 q 989 461 989 661 m 827 456 q 747 769 827 652 q 529 887 668 887 q 314 772 393 887 q 236 461 236 657 q 317 147 236 263 q 532 31 399 31 q 749 150 671 31 q 827 456 827 269 m 372 621 l 395 621 q 418 540 395 565 q 494 515 441 515 l 567 515 q 643 540 619 515 q 667 621 667 565 l 691 621 l 691 296 l 667 296 q 643 377 667 351 q 567 403 620 403 l 494 403 q 418 377 442 403 q 395 296 395 351 l 372 296 l 372 621 "},"Á":{"x_min":-10,"x_max":990,"ha":983,"o":"m 474 1023 l 519 1023 l 872 106 q 959 51 893 51 l 990 51 l 990 0 l 598 0 l 598 51 l 629 51 q 715 64 690 51 q 733 93 733 74 q 728 118 733 105 l 646 331 l 258 331 l 212 208 q 195 131 195 160 q 225 74 195 98 q 312 51 255 51 l 346 51 l 346 0 l -10 0 l -10 51 q 80 76 47 51 q 141 173 113 101 l 474 1023 m 455 830 l 279 384 l 627 384 l 455 830 m 416 1080 l 399 1096 l 513 1262 q 579 1347 560 1332 q 617 1361 598 1361 q 656 1345 639 1361 q 673 1307 673 1328 q 625 1237 673 1273 l 416 1080 "},"ĥ":{"x_min":29.0625,"x_max":801,"ha":832,"o":"m 29 1009 l 265 1009 l 265 525 q 370 622 314 590 q 490 655 427 655 q 598 625 550 655 q 661 545 635 602 q 688 409 688 487 l 688 107 q 702 65 688 78 q 748 52 717 52 l 801 52 l 801 1 l 465 1 l 465 52 l 502 52 q 561 65 545 52 q 578 107 578 79 l 578 409 q 540 532 578 488 q 444 577 502 577 q 358 551 398 577 q 292 475 319 526 q 265 367 265 424 l 265 114 q 278 66 265 80 q 324 52 292 52 l 378 52 l 378 1 l 49 1 l 49 52 l 86 52 q 140 67 124 52 q 156 114 156 82 l 156 872 q 135 933 156 913 q 74 953 114 953 l 29 953 l 29 1009 m 387 1300 l 442 1300 l 601 1067 l 559 1067 l 414 1201 l 272 1067 l 229 1067 l 387 1300 "},"Κ":{"x_min":55,"x_max":1079,"ha":1058,"o":"m 55 1002 l 504 1002 l 504 951 l 408 951 q 361 934 378 951 q 345 893 345 918 l 345 428 l 715 831 q 747 897 747 866 q 725 936 747 921 q 653 951 703 951 l 626 951 l 626 1002 l 1029 1002 l 1029 951 l 997 951 q 908 926 957 951 q 819 858 860 902 l 591 617 l 917 126 q 973 68 944 85 q 1043 51 1003 51 l 1079 51 l 1079 0 l 636 0 l 636 51 l 686 51 q 759 60 741 51 q 778 84 778 69 q 770 109 778 97 l 498 516 l 345 347 l 345 101 q 358 67 345 78 q 408 51 379 51 l 504 51 l 504 0 l 55 0 l 55 51 l 141 51 q 191 64 175 51 q 207 101 207 78 l 207 900 q 189 937 207 924 q 128 951 171 951 l 55 951 l 55 1002 "},"»":{"x_min":-11.296875,"x_max":535.015625,"ha":580,"o":"m 319 675 l 535 379 l 319 85 l 259 85 l 394 379 l 259 675 l 319 675 m 47 675 l 259 379 l 47 85 l -11 85 l 124 379 l -11 675 l 47 675 "},"∆":{"x_min":17.28125,"x_max":814.8125,"ha":833,"o":"m 814 0 l 17 0 l 434 940 l 814 0 m 657 56 l 392 711 l 100 56 l 657 56 "},"♥":{"x_min":84,"x_max":808,"ha":892,"o":"m 447 -15 q 388 134 426 64 q 240 352 350 204 q 141 489 160 460 q 97 576 111 537 q 84 657 84 616 q 133 783 84 732 q 252 834 182 834 q 381 781 327 834 q 447 663 422 741 q 508 779 468 739 q 635 835 563 835 q 757 784 707 835 q 808 665 808 734 q 779 537 808 603 q 665 363 750 472 q 507 133 556 223 q 447 -15 467 62 "},"ў":{"x_min":29,"x_max":717,"ha":732,"o":"m 31 635 l 329 635 l 329 589 l 301 589 q 248 578 262 589 q 234 548 234 568 q 237 530 234 539 l 411 148 l 540 467 q 554 533 554 501 q 534 573 554 559 q 458 587 515 587 l 458 635 l 717 635 l 717 589 q 615 520 641 581 l 385 -26 q 267 -217 326 -164 q 139 -270 207 -270 q 59 -242 89 -270 q 29 -173 29 -214 q 47 -123 29 -143 q 94 -103 66 -103 q 136 -120 119 -103 q 154 -161 154 -137 q 151 -181 154 -168 q 148 -196 148 -191 q 169 -213 148 -213 q 218 -196 191 -213 q 270 -144 246 -180 q 353 13 294 -108 l 118 530 q 86 571 105 557 q 31 589 67 584 l 31 635 m 493 822 q 489 843 493 829 q 484 871 484 860 q 541 927 484 927 q 583 911 565 927 q 602 862 602 894 q 544 770 602 805 q 401 735 487 735 q 255 766 316 735 q 195 861 195 798 q 213 911 195 894 q 256 927 231 927 q 298 911 282 927 q 315 868 315 895 q 309 841 315 858 q 303 819 303 824 q 334 793 303 802 q 398 785 364 785 q 493 822 493 785 "},"ţ":{"x_min":34,"x_max":497,"ha":530,"o":"m 205 894 l 253 894 l 253 635 l 455 635 l 455 573 l 253 573 l 253 166 q 277 85 253 113 q 341 57 302 57 q 419 99 387 57 q 452 240 452 142 l 497 240 q 444 52 497 113 q 307 -9 391 -9 q 185 34 229 -9 q 142 146 142 77 l 142 573 l 34 573 l 34 620 q 146 683 107 632 q 205 894 205 758 m 229 -285 l 218 -260 q 286 -183 286 -231 q 274 -170 286 -170 q 262 -171 271 -170 q 246 -174 252 -174 q 203 -158 221 -174 q 186 -121 186 -142 q 203 -85 186 -101 q 250 -70 221 -70 q 310 -93 287 -70 q 333 -154 333 -116 q 229 -285 333 -243 "},"«":{"x_min":-0.671875,"x_max":545.640625,"ha":580,"o":"m 215 675 l 275 675 l 139 379 l 275 85 l 215 85 l 0 379 l 215 675 m 485 675 l 545 675 l 410 379 l 545 85 l 485 85 l 275 379 l 485 675 "},"í":{"x_min":32.421875,"x_max":400,"ha":429,"o":"m 32 638 l 280 638 l 280 96 q 290 64 280 74 q 329 51 305 51 l 400 51 l 400 0 l 46 0 l 46 51 l 111 51 q 154 65 140 51 q 168 107 168 80 l 168 507 q 146 564 168 545 q 83 584 125 584 l 32 584 l 32 638 m 116 741 l 100 758 l 214 924 q 279 1008 260 993 q 317 1023 298 1023 q 356 1006 339 1023 q 373 969 373 990 q 325 899 373 935 l 116 741 "},"◦":{"x_min":52,"x_max":432,"ha":484,"o":"m 432 458 q 376 320 432 377 q 242 264 320 264 q 107 320 163 264 q 52 458 52 377 q 107 595 52 538 q 242 652 163 652 q 376 595 320 652 q 432 458 432 538 m 382 458 q 340 558 382 516 q 242 600 299 600 q 144 558 185 600 q 103 458 103 516 q 143 357 103 399 q 242 316 184 316 q 341 357 300 316 q 382 458 382 399 "},"ņ":{"x_min":45,"x_max":804,"ha":832,"o":"m 45 641 l 251 641 q 266 508 266 588 q 369 612 312 577 q 497 647 426 647 q 601 622 559 647 q 668 543 643 597 q 694 423 694 490 l 694 114 q 709 65 694 80 q 760 51 724 51 l 804 51 l 804 0 l 476 0 l 476 51 l 507 51 q 568 65 551 51 q 586 107 586 79 l 586 379 q 559 511 586 468 q 446 572 521 572 q 320 510 370 572 q 270 349 270 448 l 270 114 q 285 65 270 80 q 337 51 301 51 l 381 51 l 381 0 l 51 0 l 51 51 l 93 51 q 143 64 126 51 q 160 98 160 78 l 160 508 q 138 570 160 549 q 76 591 117 591 l 45 591 l 45 641 m 317 -57 q 387 -57 364 -57 q 482 -79 446 -57 q 518 -144 518 -101 q 474 -231 518 -193 q 334 -270 430 -270 q 287 -270 318 -270 l 287 -217 q 413 -150 413 -217 q 317 -115 413 -115 l 317 -57 "},"µ":{"x_min":89,"x_max":723.484375,"ha":784,"o":"m 130 620 l 239 620 l 239 259 q 250 125 239 161 q 282 80 259 97 q 333 64 306 64 q 411 86 372 64 q 490 154 450 109 l 490 620 l 600 620 l 600 177 q 605 88 600 109 q 621 63 609 72 q 645 54 632 54 q 674 68 662 54 q 698 138 691 89 l 723 138 q 687 18 723 56 q 596 -19 650 -19 q 515 20 543 -19 q 490 109 495 49 q 382 10 432 40 q 281 -19 332 -19 q 220 -4 246 -19 q 177 38 201 6 q 177 7 177 17 q 200 -154 177 -46 q 209 -225 209 -196 q 190 -278 209 -257 q 146 -300 171 -300 q 105 -280 122 -300 q 89 -226 89 -260 q 108 -114 89 -194 q 122 -43 121 -59 q 130 77 130 26 q 130 128 130 80 l 130 620 "},"ỳ":{"x_min":29,"x_max":717,"ha":732,"o":"m 31 635 l 329 635 l 329 589 l 301 589 q 248 578 262 589 q 234 548 234 568 q 237 530 234 539 l 411 148 l 540 467 q 554 533 554 501 q 534 573 554 559 q 458 587 515 587 l 458 635 l 717 635 l 717 589 q 615 520 641 581 l 385 -26 q 267 -217 326 -164 q 139 -270 207 -270 q 59 -242 89 -270 q 29 -173 29 -214 q 47 -123 29 -143 q 94 -103 66 -103 q 136 -120 119 -103 q 154 -161 154 -137 q 151 -181 154 -168 q 148 -196 148 -191 q 169 -213 148 -213 q 218 -196 191 -213 q 270 -144 246 -180 q 353 13 294 -108 l 118 530 q 86 571 105 557 q 31 589 67 584 l 31 635 m 477 758 l 461 741 l 277 879 q 204 968 204 933 q 220 1006 204 988 q 259 1023 237 1023 q 326 979 296 1023 l 477 758 "},"Ι":{"x_min":51,"x_max":504,"ha":555,"o":"m 51 1002 l 504 1002 l 504 951 l 426 951 q 360 937 374 951 q 347 881 347 924 l 347 123 q 358 66 347 78 q 416 51 374 51 l 504 51 l 504 0 l 51 0 l 51 51 l 136 51 q 194 64 181 51 q 208 123 208 78 l 208 881 q 196 935 208 925 q 127 951 177 951 l 51 951 l 51 1002 "},"Ύ":{"x_min":0,"x_max":1158,"ha":1145,"o":"m 178 1002 l 609 1002 l 609 951 l 561 951 q 483 941 501 951 q 465 915 465 932 q 474 883 465 897 l 724 488 l 904 825 q 916 873 916 847 q 893 930 916 909 q 828 951 870 951 l 783 951 l 783 1002 l 1158 1002 l 1158 951 q 1056 927 1093 951 q 984 841 1019 904 l 758 418 l 758 101 q 771 65 758 76 q 828 51 790 51 l 913 51 l 913 0 l 462 0 l 462 51 l 551 51 q 603 64 587 51 q 619 101 619 77 l 619 409 l 313 894 q 267 937 293 925 q 178 950 240 950 l 178 1002 m 49 739 l 14 873 q 0 958 0 928 q 62 1026 0 1026 q 112 1007 96 1026 q 129 963 129 988 q 111 873 129 938 l 77 739 l 49 739 "},"ѕ":{"x_min":81.953125,"x_max":573,"ha":630,"o":"m 119 239 q 213 76 159 121 q 345 32 267 32 q 457 64 418 32 q 496 145 496 96 q 481 195 496 174 q 442 227 467 216 q 311 257 416 237 q 170 300 209 278 q 108 362 130 323 q 86 447 86 401 q 131 574 86 517 q 297 647 190 647 q 447 594 378 647 l 491 642 l 526 642 l 526 416 l 491 416 q 412 554 462 512 q 289 597 362 597 q 189 565 225 597 q 154 488 154 533 q 187 422 154 448 q 315 379 219 394 q 458 347 425 360 q 543 284 513 327 q 573 181 573 242 q 508 39 573 97 q 343 -19 443 -19 q 171 43 251 -19 l 123 -14 l 81 -14 l 81 239 l 119 239 "},"Ш":{"x_min":64,"x_max":1432,"ha":1488,"o":"m 64 0 l 64 51 l 129 51 q 186 64 173 51 q 200 126 200 78 l 200 884 q 187 940 200 926 q 119 954 174 954 l 64 954 l 64 1005 l 477 1005 l 477 954 l 419 954 q 354 940 367 954 q 341 884 341 927 l 341 63 l 677 63 l 677 884 q 664 940 677 926 q 596 954 651 954 l 553 954 l 553 1005 l 942 1005 l 942 954 l 895 954 q 831 941 844 954 q 818 884 818 927 l 818 63 l 1155 63 l 1155 884 q 1141 941 1155 928 q 1076 954 1127 954 l 1018 954 l 1018 1005 l 1432 1005 l 1432 954 l 1376 954 q 1308 939 1321 954 q 1295 884 1295 925 l 1295 126 q 1308 64 1295 78 q 1366 51 1322 51 l 1432 51 l 1432 0 l 64 0 "},"M":{"x_min":23,"x_max":1249,"ha":1285,"o":"m 23 1002 l 350 1002 l 643 211 l 914 1002 l 1249 1002 l 1249 951 l 1167 951 q 1108 938 1123 951 q 1094 893 1094 925 l 1094 100 q 1111 63 1094 76 q 1173 51 1129 51 l 1249 51 l 1249 0 l 800 0 l 800 51 l 883 51 q 936 64 919 51 q 954 100 954 78 l 954 951 l 629 0 l 584 0 l 234 946 l 234 217 q 250 120 234 152 q 295 70 266 87 q 394 53 325 53 l 394 0 l 23 0 l 23 54 q 146 87 113 54 q 179 208 179 121 l 179 901 q 163 939 179 927 q 106 951 148 951 l 23 951 l 23 1002 "},"╗":{"x_min":-15.578125,"x_max":666,"ha":964,"o":"m 550 -421 l 550 490 l -15 490 l -15 609 l 666 609 l 666 -421 l 550 -421 m 297 233 l -15 233 l -15 352 l 413 352 l 413 -421 l 297 -421 l 297 233 "},"Ψ":{"x_min":36,"x_max":1365,"ha":1400,"o":"m 36 951 l 36 1002 l 442 1002 l 442 951 l 380 951 q 322 939 336 951 q 309 878 309 927 l 309 686 q 325 531 309 591 q 396 435 341 471 q 545 400 451 400 l 632 400 l 632 878 q 618 937 632 924 q 560 951 604 951 l 498 951 l 498 1002 l 903 1002 l 903 951 l 841 951 q 783 939 797 951 q 770 878 770 927 l 770 400 l 858 400 q 1032 448 972 400 q 1092 686 1092 497 l 1092 878 q 1078 938 1092 925 q 1020 951 1064 951 l 959 951 l 959 1002 l 1365 1002 l 1365 951 l 1303 951 q 1246 939 1260 951 q 1233 878 1233 927 l 1233 656 q 1136 397 1233 460 q 858 334 1040 334 l 770 334 l 770 123 q 783 64 770 77 q 841 51 797 51 l 927 51 l 927 0 l 474 0 l 474 51 l 560 51 q 618 62 604 51 q 632 123 632 74 l 632 334 l 548 334 q 250 410 333 334 q 168 656 168 486 l 168 878 q 154 938 168 924 q 96 951 140 951 l 36 951 "},"ũ":{"x_min":37.671875,"x_max":797,"ha":832,"o":"m 258 641 l 258 226 q 296 107 258 149 q 395 65 334 65 q 521 126 469 65 q 574 280 574 187 l 574 518 q 551 569 574 551 q 463 587 528 587 l 463 641 l 682 641 l 682 126 q 701 70 682 90 q 757 51 721 51 l 797 51 l 797 3 l 587 3 l 574 126 q 461 24 518 58 q 347 -9 405 -9 q 205 48 262 -9 q 148 241 148 105 l 148 517 q 119 573 148 554 q 37 587 99 587 l 37 641 l 258 641 m 619 945 l 641 945 q 603 831 641 873 q 510 790 565 790 q 373 825 468 790 q 280 850 303 850 q 214 790 230 850 l 191 790 q 323 943 205 943 q 450 913 367 943 q 554 883 534 883 q 619 945 601 883 "},"ŭ":{"x_min":37.671875,"x_max":797,"ha":832,"o":"m 258 641 l 258 226 q 296 107 258 149 q 395 65 334 65 q 521 126 469 65 q 574 280 574 187 l 574 518 q 551 569 574 551 q 463 587 528 587 l 463 641 l 682 641 l 682 126 q 701 70 682 90 q 757 51 721 51 l 797 51 l 797 3 l 587 3 l 574 126 q 461 24 518 58 q 347 -9 405 -9 q 205 48 262 -9 q 148 241 148 105 l 148 517 q 119 573 148 554 q 37 587 99 587 l 37 641 l 258 641 m 214 1003 l 256 1003 q 310 936 273 958 q 413 915 347 915 q 524 939 481 915 q 574 1003 557 958 l 618 1003 q 585 885 612 931 q 512 813 557 839 q 414 787 467 787 q 281 841 335 787 q 214 1003 227 896 "},"―":{"x_min":-8,"x_max":1029,"ha":1021,"o":"m -8 367 l 1029 367 l 1029 298 l -8 298 l -8 367 "},"{":{"x_min":72,"x_max":451,"ha":452,"o":"m 451 -88 l 451 -113 q 267 -19 339 -98 q 196 156 196 58 q 211 271 196 193 q 227 371 227 347 q 184 467 227 424 q 72 519 142 510 l 72 548 q 185 602 144 558 q 227 703 227 645 q 211 801 227 733 q 196 906 196 869 q 264 1085 196 1009 q 451 1181 332 1161 l 451 1158 q 298 990 298 1122 q 309 905 298 959 q 329 782 329 818 q 278 637 329 702 q 127 536 227 571 q 275 433 222 500 q 329 292 329 365 q 314 188 329 254 q 298 76 298 107 q 336 -27 298 16 q 451 -88 374 -71 "},"¼":{"x_min":110.671875,"x_max":980,"ha":1134,"o":"m 110 907 q 212 918 174 907 q 289 958 250 930 l 299 958 l 299 532 q 306 513 299 520 q 328 507 314 507 l 394 507 l 394 474 l 120 474 l 120 507 l 177 507 q 213 518 203 507 q 223 557 223 529 l 223 833 q 212 865 223 856 q 169 875 201 875 l 110 875 l 110 907 m 868 939 l 926 939 l 290 0 l 234 0 l 868 939 m 867 483 l 890 483 l 890 149 l 980 149 l 980 109 l 890 109 l 890 70 q 900 40 890 49 q 931 31 910 31 l 966 31 l 966 -1 l 733 -1 l 733 31 l 769 31 q 801 40 790 31 q 812 65 812 49 l 812 109 l 589 109 l 589 149 l 867 483 m 812 370 l 631 149 l 812 149 l 812 370 "},"▄":{"x_min":-15,"x_max":979,"ha":964,"o":"m 979 -421 l -15 -421 l -15 421 l 979 421 l 979 -421 "},"ι":{"x_min":31.421875,"x_max":488,"ha":501,"o":"m 31 585 l 31 639 l 279 639 l 279 184 q 353 57 279 57 q 440 241 440 57 l 488 241 q 468 106 488 164 q 416 20 448 49 q 320 -9 383 -9 q 223 13 257 -9 q 178 71 189 35 q 167 185 167 107 l 167 508 q 82 585 167 585 l 31 585 "},"Ĳ":{"x_min":51,"x_max":1270,"ha":1311,"o":"m 504 51 l 504 0 l 51 0 l 51 51 l 137 51 q 195 64 182 51 q 209 123 209 77 l 209 878 q 194 938 209 926 q 137 951 179 951 l 51 951 l 51 1002 l 504 1002 l 504 951 l 418 951 q 360 937 373 951 q 347 878 347 924 l 347 123 q 361 63 347 76 q 418 51 376 51 l 504 51 m 835 1002 l 1270 1002 l 1270 951 l 1211 951 q 1153 938 1166 951 q 1140 878 1140 924 l 1140 249 q 1057 56 1140 131 q 841 -19 974 -19 q 648 53 721 -19 q 575 225 575 126 q 611 345 575 298 q 705 392 648 392 q 780 362 751 392 q 809 286 809 333 q 784 220 809 246 q 730 194 760 194 q 697 201 718 194 q 673 207 679 207 q 648 169 648 207 q 700 74 648 114 q 821 35 752 35 q 953 95 906 35 q 1000 257 1000 156 l 1000 879 q 985 939 1000 927 q 928 951 970 951 l 835 951 l 835 1002 "},"Ê":{"x_min":89,"x_max":907.21875,"ha":983,"o":"m 89 1002 l 877 1002 l 877 663 l 842 663 q 757 887 815 823 q 608 951 700 951 l 415 951 q 379 938 391 951 q 368 898 368 925 l 368 542 l 452 542 q 563 591 521 542 q 606 743 606 640 l 654 743 l 654 279 l 606 279 q 562 444 606 394 q 445 494 519 494 l 368 494 l 368 95 q 382 62 368 74 q 429 51 396 51 l 582 51 q 868 373 830 51 l 907 373 l 907 0 l 89 0 l 89 51 l 156 51 q 211 64 195 51 q 227 105 227 78 l 227 898 q 213 938 227 925 q 169 951 199 951 l 89 951 l 89 1002 m 463 1348 l 518 1348 l 677 1115 l 634 1115 l 490 1249 l 348 1115 l 305 1115 l 463 1348 "},"Ά":{"x_min":-10,"x_max":990,"ha":983,"o":"m 474 1023 l 519 1023 l 872 106 q 959 51 893 51 l 990 51 l 990 0 l 598 0 l 598 51 l 629 51 q 715 64 690 51 q 733 93 733 74 q 728 118 733 105 l 646 331 l 258 331 l 212 208 q 195 131 195 160 q 224 74 195 98 q 312 51 254 51 l 346 51 l 346 0 l -10 0 l -10 51 q 80 76 47 51 q 141 173 113 101 l 474 1023 m 455 830 l 279 384 l 627 384 l 455 830 m 155 739 l 120 873 q 106 958 106 928 q 168 1026 106 1026 q 218 1007 202 1026 q 235 963 235 988 q 217 873 235 938 l 183 739 l 155 739 "},")":{"x_min":5.71875,"x_max":365,"ha":453,"o":"m 23 1181 q 193 1006 139 1073 q 320 782 276 901 q 365 533 365 664 q 322 290 365 404 q 194 65 280 175 q 23 -113 134 -12 l 5 -77 q 140 103 94 16 q 212 292 187 189 q 237 528 237 396 q 213 771 237 666 q 144 959 189 876 q 5 1143 99 1042 l 23 1181 "},"ε":{"x_min":62,"x_max":583.296875,"ha":636,"o":"m 235 325 q 76 471 76 351 q 146 605 76 556 q 326 654 216 654 q 506 601 443 654 q 570 482 570 548 q 548 419 570 445 q 494 393 526 393 q 443 414 464 393 q 422 464 422 435 q 439 515 422 493 q 455 546 455 538 q 419 588 455 571 q 337 605 382 605 q 230 569 269 605 q 192 473 192 532 q 222 389 192 425 q 355 353 252 353 l 355 302 q 184 159 184 302 q 231 63 184 94 q 351 32 279 32 q 546 153 473 32 l 583 132 q 323 -20 510 -20 q 134 25 206 -20 q 62 155 62 71 q 235 325 62 281 "},"э":{"x_min":41,"x_max":569,"ha":615,"o":"m 440 356 q 388 537 440 479 q 262 596 336 596 q 88 446 147 596 l 46 459 q 276 654 106 654 q 484 568 400 654 q 569 331 569 483 q 481 72 569 164 q 266 -20 394 -20 q 98 33 156 -20 q 41 145 41 86 q 62 208 41 182 q 115 235 83 235 q 166 213 145 235 q 187 163 187 192 q 169 112 187 135 q 153 85 153 92 q 179 47 153 66 q 253 29 205 29 q 440 299 440 29 l 218 299 l 218 356 l 440 356 "},"ш":{"x_min":32,"x_max":1151,"ha":1183,"o":"m 1145 0 l 32 0 l 32 51 l 97 51 q 155 106 155 51 l 155 538 q 106 584 155 584 l 35 584 l 35 635 l 376 635 l 376 584 l 323 584 q 267 527 267 584 l 267 51 l 536 51 l 536 538 q 487 584 536 584 l 433 584 l 433 635 l 755 635 l 755 584 l 704 584 q 648 527 648 584 l 648 51 l 917 51 l 917 538 q 868 584 917 584 l 815 584 l 815 635 l 1151 635 l 1151 584 l 1085 584 q 1029 527 1029 584 l 1029 111 q 1035 71 1029 83 q 1053 55 1042 59 q 1099 51 1064 51 l 1145 51 l 1145 0 "},"Я":{"x_min":25,"x_max":947,"ha":1011,"o":"m 947 1003 l 947 952 l 871 952 q 822 936 835 952 q 810 888 810 921 l 810 99 q 871 51 810 51 l 947 51 l 947 0 l 534 0 l 534 51 l 607 51 q 670 99 670 51 l 670 477 l 589 477 q 425 439 475 477 q 348 261 375 401 q 310 93 325 143 q 259 14 294 42 q 173 -14 224 -14 q 85 17 120 -14 q 37 94 50 48 q 25 220 25 140 l 69 220 q 120 92 69 92 q 153 111 140 92 q 195 225 165 131 q 258 377 227 327 q 336 454 290 426 q 452 496 383 481 q 208 588 277 517 q 139 755 139 658 q 230 939 139 876 q 446 1003 322 1003 l 947 1003 m 670 528 l 670 890 q 652 940 670 928 q 555 952 635 952 l 507 952 q 336 905 383 952 q 289 734 289 859 q 349 577 289 627 q 553 528 409 528 l 670 528 "},"a":{"x_min":67,"x_max":725.9375,"ha":757,"o":"m 702 69 l 725 31 q 618 -19 677 -19 q 542 6 573 -19 q 488 94 511 31 q 377 3 425 26 q 262 -19 329 -19 q 116 23 166 -19 q 67 130 67 65 q 181 295 67 229 q 484 382 295 360 l 484 478 q 444 566 484 529 q 341 603 403 603 q 241 578 283 603 q 211 542 211 560 q 227 511 211 532 q 247 462 247 483 q 227 413 247 432 q 177 394 208 394 q 121 417 143 394 q 99 475 99 440 q 173 598 99 542 q 367 654 247 654 q 536 605 478 654 q 595 485 595 555 l 595 138 q 609 70 595 92 q 647 48 624 48 q 702 69 673 48 m 484 337 q 245 260 316 313 q 193 145 193 219 q 220 63 193 92 q 291 34 247 34 q 427 94 369 34 q 484 246 484 155 l 484 337 "},"Ę":{"x_min":89,"x_max":951.078125,"ha":983,"o":"m 89 1002 l 877 1002 l 877 663 l 841 663 q 757 887 815 823 q 607 951 700 951 l 415 951 q 379 938 391 951 q 368 898 368 925 l 368 542 l 452 542 q 563 591 521 542 q 606 743 606 640 l 654 743 l 654 279 l 606 279 q 562 444 606 394 q 445 494 519 494 l 368 494 l 368 95 q 382 62 368 74 q 429 51 396 51 l 582 51 q 867 373 829 51 l 907 373 l 907 0 l 89 0 l 89 51 l 156 51 q 211 64 195 51 q 227 105 227 78 l 227 898 q 213 938 227 925 q 169 951 199 951 l 89 951 l 89 1002 m 694 7 l 730 7 q 712 -63 712 -30 q 752 -162 712 -124 q 856 -201 793 -201 q 937 -185 893 -201 l 951 -207 q 866 -249 900 -238 q 794 -261 832 -261 q 682 -223 723 -261 q 641 -128 641 -186 q 694 7 641 -47 "},"Z":{"x_min":49,"x_max":769,"ha":831,"o":"m 90 1002 l 769 1002 l 769 951 l 207 51 l 420 51 q 570 81 512 51 q 665 172 629 112 q 731 376 701 233 l 769 376 l 769 0 l 49 0 l 49 45 l 616 951 l 413 951 q 284 931 330 951 q 182 836 221 904 q 127 654 143 768 l 90 654 l 90 1002 "},"k":{"x_min":33.734375,"x_max":781,"ha":807,"o":"m 33 1008 l 272 1008 l 272 320 l 474 500 q 504 546 504 526 q 486 572 504 563 q 402 587 460 587 l 402 635 l 734 635 l 734 585 q 583 534 635 585 l 441 405 l 672 80 q 746 51 694 51 l 781 51 l 781 0 l 441 0 l 441 51 l 474 51 q 525 57 512 51 q 538 74 538 64 q 531 93 538 83 l 362 334 l 272 253 l 272 93 q 284 63 272 73 q 334 51 302 51 l 377 51 l 377 0 l 43 0 l 43 51 l 96 51 q 146 65 130 51 q 162 103 162 79 l 162 886 q 142 931 162 917 q 67 952 114 952 l 33 952 l 33 1008 "},"":{"x_min":153.3125,"x_max":300,"ha":454,"o":"m 195 -285 l 185 -260 q 253 -183 253 -231 q 241 -170 253 -170 q 229 -171 238 -170 q 213 -174 219 -174 q 170 -158 188 -174 q 153 -121 153 -142 q 170 -85 153 -101 q 217 -70 188 -70 q 277 -93 254 -70 q 300 -154 300 -116 q 195 -285 300 -243 "},"Ù":{"x_min":36,"x_max":1084,"ha":1110,"o":"m 36 1002 l 490 1002 l 490 951 l 398 951 q 347 938 362 951 q 333 901 333 926 l 333 336 q 348 201 333 247 q 430 94 370 134 q 588 55 491 55 q 792 125 722 55 q 863 315 863 196 l 863 775 q 854 867 863 836 q 830 916 846 899 q 791 943 815 934 q 712 951 767 951 l 712 1002 l 1084 1002 l 1084 951 l 1057 951 q 963 917 994 951 q 933 817 933 882 l 933 325 q 842 77 933 164 q 572 -19 740 -19 q 342 23 425 -19 q 220 145 258 65 q 192 296 192 205 l 192 901 q 176 938 192 924 q 129 951 160 951 l 36 951 l 36 1002 m 687 1092 l 672 1075 l 487 1212 q 414 1302 414 1267 q 430 1339 414 1322 q 469 1357 447 1357 q 536 1313 506 1357 l 687 1092 "},"Ů":{"x_min":36,"x_max":1084,"ha":1110,"o":"m 36 1002 l 490 1002 l 490 951 l 398 951 q 347 938 362 951 q 333 901 333 926 l 333 336 q 348 201 333 247 q 430 94 370 134 q 588 55 491 55 q 792 125 722 55 q 863 315 863 196 l 863 775 q 854 867 863 836 q 830 916 846 899 q 791 943 815 934 q 712 951 767 951 l 712 1002 l 1084 1002 l 1084 951 l 1057 951 q 963 917 994 951 q 933 817 933 882 l 933 325 q 842 77 933 164 q 572 -19 740 -19 q 342 23 425 -19 q 220 145 258 65 q 192 296 192 205 l 192 901 q 176 938 192 924 q 129 951 160 951 l 36 951 l 36 1002 m 571 1368 q 668 1326 627 1368 q 709 1227 709 1285 q 668 1126 709 1168 q 569 1085 627 1085 q 471 1126 512 1085 q 431 1225 431 1167 q 472 1326 431 1284 q 571 1368 513 1368 m 570 1312 q 510 1286 535 1312 q 486 1225 486 1261 q 510 1165 486 1190 q 570 1141 535 1141 q 629 1166 604 1141 q 654 1226 654 1191 q 629 1287 654 1262 q 570 1312 605 1312 "},"¢":{"x_min":99,"x_max":677.28125,"ha":757,"o":"m 532 1002 l 583 1002 l 490 651 q 616 590 570 637 q 662 491 662 543 q 639 426 662 451 q 582 401 616 401 q 530 422 552 401 q 508 473 508 444 q 526 520 508 495 q 543 553 543 542 q 528 578 543 565 q 477 602 508 595 l 335 68 q 438 40 386 40 q 548 73 501 40 q 633 190 595 107 l 677 174 q 417 -19 610 -19 q 316 0 360 -19 l 244 -267 l 195 -267 l 269 11 q 172 87 205 48 q 119 183 139 126 q 99 303 99 240 q 145 483 99 400 q 266 610 191 565 q 441 656 342 656 l 532 1002 m 293 101 l 427 606 q 285 533 339 606 q 231 310 231 460 q 293 101 231 182 "},"В":{"x_min":64,"x_max":942,"ha":983,"o":"m 64 1002 l 576 1002 q 807 934 727 1002 q 888 764 888 866 q 832 618 888 678 q 664 524 776 559 q 872 431 802 495 q 942 269 942 367 q 902 137 942 195 q 770 39 862 79 q 561 0 678 0 l 64 0 l 64 51 l 145 51 q 199 63 182 51 q 216 90 216 75 l 216 894 q 199 937 216 922 q 150 951 182 951 l 64 951 l 64 1002 m 358 541 l 544 541 q 681 592 630 541 q 732 761 732 644 q 707 874 732 834 q 637 934 683 915 q 477 953 590 953 q 377 941 396 953 q 358 899 358 929 l 358 541 m 358 491 l 358 105 q 373 64 358 78 q 429 51 389 51 l 548 51 q 723 104 667 51 q 780 269 780 157 q 721 431 780 372 q 560 491 663 491 l 358 491 "},"І":{"x_min":51,"x_max":504,"ha":555,"o":"m 51 1002 l 504 1002 l 504 951 l 426 951 q 360 937 374 951 q 347 881 347 924 l 347 123 q 358 66 347 78 q 416 51 374 51 l 504 51 l 504 0 l 51 0 l 51 51 l 136 51 q 194 64 181 51 q 208 123 208 78 l 208 881 q 196 935 208 925 q 127 951 177 951 l 51 951 l 51 1002 "},"ē":{"x_min":58,"x_max":633.984375,"ha":681,"o":"m 628 313 l 184 313 q 235 108 184 167 q 381 41 293 41 q 590 192 511 41 l 633 173 q 353 -19 536 -19 q 143 73 228 -19 q 58 309 58 165 q 142 558 58 463 q 349 654 226 654 q 505 606 439 654 q 604 470 571 559 q 628 313 628 407 m 183 361 l 452 361 q 489 377 476 361 q 503 434 503 394 q 457 560 503 508 q 349 613 411 613 q 231 550 280 613 q 183 361 183 487 m 131 945 l 561 945 l 561 857 l 131 857 l 131 945 "},"":{"x_min":51,"x_max":545.84375,"ha":586,"o":"m 211 328 q 80 477 80 382 q 146 594 80 549 q 317 639 213 639 q 463 609 404 639 q 521 534 521 579 q 504 493 521 510 q 464 476 487 476 q 403 526 427 476 q 303 598 370 598 q 218 565 253 598 q 183 467 183 532 q 308 344 183 344 q 339 346 322 344 q 386 352 370 352 q 427 327 427 352 q 386 301 427 301 q 341 305 371 301 q 306 309 319 309 q 175 171 175 309 q 210 63 175 104 q 308 23 245 23 q 413 106 387 23 q 443 167 427 150 q 486 184 459 184 q 527 167 508 184 q 545 123 545 151 q 476 20 545 60 q 313 -19 406 -19 q 132 32 214 -19 q 51 170 51 83 q 211 328 51 276 "},"β":{"x_min":67.390625,"x_max":652,"ha":700,"o":"m 93 -9 l 67 0 q 86 159 86 78 l 86 746 q 152 948 86 871 q 345 1026 218 1026 q 537 958 470 1026 q 605 804 605 891 q 566 683 605 738 q 465 603 527 629 q 600 503 548 579 q 652 320 652 428 q 568 75 652 165 q 373 -15 484 -15 q 173 110 233 -15 q 93 -9 151 46 m 199 540 q 267 602 234 586 q 373 625 299 618 q 467 676 442 633 q 492 787 492 720 q 349 975 492 975 q 199 771 199 975 l 199 540 m 365 34 q 526 331 526 34 q 365 573 526 573 q 238 505 282 573 q 195 321 195 436 q 237 117 195 201 q 365 34 280 34 "},"≠":{"x_min":17,"x_max":731,"ha":748,"o":"m 17 555 l 417 555 l 556 916 l 610 916 l 473 555 l 731 555 l 731 491 l 448 491 l 352 240 l 731 240 l 731 177 l 328 177 l 188 -182 l 135 -182 l 274 177 l 17 177 l 17 240 l 298 240 l 394 491 l 17 491 l 17 555 "},"‼":{"x_min":121,"x_max":610,"ha":731,"o":"m 222 294 l 187 294 q 146 710 187 477 q 121 912 121 862 q 142 995 121 963 q 206 1027 164 1027 q 290 910 290 1027 q 262 710 290 860 q 222 294 222 482 m 543 294 l 508 294 q 467 710 508 477 q 442 912 442 862 q 463 995 442 963 q 526 1027 485 1027 q 610 910 610 1027 q 583 710 610 860 q 543 294 543 482 m 205 146 q 262 121 239 146 q 286 62 286 96 q 262 6 286 31 q 205 -19 238 -19 q 149 4 173 -19 q 125 62 125 27 q 147 121 125 96 q 205 146 170 146 m 526 146 q 584 120 561 146 q 607 62 607 95 q 583 5 607 29 q 525 -19 559 -19 q 469 4 493 -19 q 446 62 446 28 q 468 121 446 96 q 526 146 491 146 "},"¥":{"x_min":14,"x_max":945,"ha":958,"o":"m 384 459 l 143 837 q 97 881 122 869 q 14 893 72 893 l 14 940 l 423 940 l 423 894 l 377 894 q 303 884 320 894 q 286 859 286 875 q 295 828 286 842 l 532 459 l 703 774 q 715 820 715 795 q 693 874 715 854 q 632 894 671 894 l 589 894 l 589 940 l 945 940 l 945 894 q 848 872 883 894 q 779 789 813 850 l 600 459 l 865 459 l 865 408 l 564 408 l 564 254 l 865 254 l 865 203 l 564 203 l 564 94 q 577 63 564 73 q 632 51 595 51 l 713 51 l 713 0 l 284 0 l 284 51 l 368 51 q 417 62 402 51 q 432 94 432 73 l 432 203 l 111 203 l 111 254 l 432 254 l 432 408 l 111 408 l 111 459 l 384 459 "},"Ĥ":{"x_min":64,"x_max":1070,"ha":1134,"o":"m 64 1002 l 483 1002 l 483 951 l 406 951 q 353 936 365 951 q 341 865 341 921 l 341 557 l 791 557 l 791 865 q 779 937 791 923 q 724 951 767 951 l 653 951 l 653 1002 l 1070 1002 l 1070 951 l 993 951 q 953 943 965 951 q 934 917 942 936 q 931 857 931 906 l 931 137 q 939 74 931 84 q 1002 51 956 51 l 1070 51 l 1070 0 l 653 0 l 653 51 l 724 51 q 782 74 767 51 q 791 142 791 87 l 791 491 l 341 491 l 341 137 q 348 73 341 84 q 406 51 365 51 l 483 51 l 483 0 l 64 0 l 64 51 l 144 51 q 178 59 165 51 q 196 84 190 68 q 200 142 200 95 l 200 865 q 187 936 200 921 q 134 951 175 951 l 64 951 l 64 1002 m 539 1347 l 593 1347 l 752 1113 l 710 1113 l 565 1248 l 423 1113 l 380 1113 l 539 1347 "},"U":{"x_min":36,"x_max":1084,"ha":1110,"o":"m 36 1002 l 490 1002 l 490 951 l 398 951 q 347 938 362 951 q 333 901 333 926 l 333 336 q 348 201 333 247 q 430 94 370 134 q 588 55 491 55 q 792 125 722 55 q 863 315 863 196 l 863 775 q 854 867 863 836 q 830 916 846 899 q 791 943 815 934 q 712 951 767 951 l 712 1002 l 1084 1002 l 1084 951 l 1057 951 q 963 917 994 951 q 933 817 933 882 l 933 325 q 842 77 933 164 q 572 -19 740 -19 q 342 23 425 -19 q 220 145 258 65 q 192 296 192 205 l 192 901 q 176 938 192 924 q 129 951 160 951 l 36 951 l 36 1002 "},"Ñ":{"x_min":56,"x_max":1084,"ha":1110,"o":"m 56 1002 l 290 1002 l 884 215 l 884 785 q 845 913 884 871 q 740 951 810 951 l 740 1003 l 1084 1003 l 1084 951 q 1005 936 1031 951 q 960 882 979 921 q 941 796 941 843 l 941 0 l 878 0 l 265 819 l 265 214 q 305 92 265 132 q 431 52 346 52 l 431 0 l 56 0 l 56 52 q 167 97 126 52 q 209 206 209 141 l 209 886 l 197 898 q 150 942 164 935 q 100 951 131 951 l 56 951 l 56 1002 m 796 1280 l 818 1280 q 780 1165 818 1207 q 686 1124 742 1124 q 550 1159 645 1124 q 456 1185 480 1185 q 391 1124 407 1185 l 368 1124 q 500 1278 382 1278 q 627 1247 544 1278 q 731 1217 710 1217 q 796 1280 778 1217 "},"F":{"x_min":70,"x_max":876.3125,"ha":908,"o":"m 70 1002 l 876 1002 l 876 654 l 837 654 q 751 888 806 834 q 571 951 688 951 l 413 951 q 379 939 390 951 q 369 906 369 928 l 369 544 l 453 544 q 566 591 524 544 q 608 738 608 638 l 659 738 l 659 286 l 608 286 q 567 446 608 398 q 454 495 526 495 l 369 495 l 369 112 q 385 64 369 78 q 440 51 401 51 l 543 51 l 543 0 l 70 0 l 70 51 l 170 51 q 214 63 201 51 q 227 104 227 76 l 227 900 q 213 939 227 927 q 166 951 199 951 l 70 951 l 70 1002 "},"╤":{"x_min":-15,"x_max":979,"ha":964,"o":"m 979 490 l -15 490 l -15 609 l 979 609 l 979 490 m 424 233 l -15 233 l -15 352 l 979 352 l 979 233 l 540 233 l 540 -421 l 424 -421 l 424 233 "},"Ќ":{"x_min":64,"x_max":1003,"ha":1031,"o":"m 584 524 q 703 470 658 505 q 775 383 749 435 q 824 224 801 331 q 905 79 856 79 q 960 217 960 79 l 1003 217 q 843 -14 1003 -14 q 752 16 790 -14 q 701 91 714 47 q 677 234 689 136 q 643 397 664 352 q 575 465 622 443 q 421 487 528 487 l 341 487 l 341 105 q 353 63 341 76 q 403 51 366 51 l 483 51 l 483 0 l 64 0 l 64 51 l 138 51 q 200 99 200 51 l 200 901 q 138 952 200 952 l 64 952 l 64 1003 l 483 1003 l 483 952 l 392 952 q 358 940 376 952 q 341 901 341 928 l 341 538 l 475 538 q 589 564 559 538 q 627 642 618 590 q 648 774 637 694 q 677 914 661 865 q 732 994 693 964 q 830 1024 771 1024 q 938 989 894 1024 q 982 897 982 954 q 957 825 982 854 q 894 796 932 796 q 838 818 862 796 q 814 871 814 840 q 826 909 814 889 q 833 930 833 920 q 821 955 833 944 q 794 966 810 966 q 742 930 766 966 q 695 732 718 894 q 661 576 677 605 q 584 524 645 547 m 433 1078 l 416 1095 l 530 1261 q 595 1345 576 1330 q 633 1360 614 1360 q 672 1343 655 1360 q 689 1305 689 1326 q 641 1236 689 1271 l 433 1078 "},"∕":{"x_min":-224.640625,"x_max":467.21875,"ha":227,"o":"m 409 940 l 467 940 l -168 0 l -224 0 l 409 940 "},"å":{"x_min":67,"x_max":725.9375,"ha":757,"o":"m 702 69 l 725 31 q 618 -19 677 -19 q 542 6 573 -19 q 488 94 511 31 q 377 3 425 26 q 262 -19 329 -19 q 116 23 166 -19 q 67 130 67 65 q 181 295 67 229 q 484 382 295 360 l 484 478 q 443 566 484 529 q 341 603 403 603 q 241 578 283 603 q 211 542 211 560 q 227 511 211 532 q 247 462 247 483 q 227 413 247 432 q 177 394 208 394 q 121 417 143 394 q 99 475 99 440 q 173 598 99 542 q 367 654 247 654 q 536 605 478 654 q 595 485 595 555 l 595 138 q 609 70 595 92 q 647 48 624 48 q 702 69 673 48 m 484 337 q 245 260 315 313 q 193 145 193 219 q 220 63 193 92 q 291 34 247 34 q 427 94 369 34 q 484 246 484 155 l 484 337 m 380 1034 q 476 992 435 1034 q 517 893 517 951 q 476 792 517 834 q 378 751 435 751 q 280 792 321 751 q 240 891 240 833 q 280 992 240 950 q 380 1034 321 1034 m 379 978 q 319 952 344 978 q 295 891 295 927 q 319 831 295 856 q 378 807 343 807 q 437 832 412 807 q 462 892 462 857 q 437 953 462 928 q 379 978 413 978 "},"Ϋ":{"x_min":-8,"x_max":972,"ha":959,"o":"m -8 1002 l 423 1002 l 423 951 l 375 951 q 297 941 315 951 q 279 915 279 932 q 288 883 279 897 l 538 488 l 718 825 q 730 873 730 847 q 707 930 730 909 q 643 951 685 951 l 597 951 l 597 1002 l 972 1002 l 972 951 q 870 927 907 951 q 798 841 833 904 l 572 418 l 572 101 q 585 65 572 76 q 643 51 605 51 l 727 51 l 727 0 l 276 0 l 276 51 l 365 51 q 417 64 401 51 q 433 101 433 77 l 433 409 l 127 894 q 81 937 107 925 q -8 950 54 950 l -8 1002 m 364 1263 q 413 1243 393 1263 q 433 1194 433 1223 q 412 1144 433 1165 q 364 1124 392 1124 q 316 1145 336 1124 q 297 1195 297 1166 q 316 1243 297 1223 q 364 1263 336 1263 m 620 1261 q 669 1240 649 1261 q 689 1191 689 1220 q 668 1141 689 1162 q 620 1121 648 1121 q 571 1141 591 1121 q 551 1191 551 1162 q 571 1240 551 1220 q 620 1261 591 1261 "},"0":{"x_min":67,"x_max":703,"ha":757,"o":"m 380 958 q 596 854 509 958 q 703 470 703 728 q 609 106 703 231 q 385 -19 516 -19 q 173 86 258 -19 q 67 467 67 218 q 167 845 67 705 q 380 958 247 958 m 383 909 q 247 823 296 909 q 198 467 198 737 q 248 116 198 204 q 385 28 299 28 q 517 109 471 28 q 573 463 573 206 q 521 818 573 728 q 383 909 469 909 "},"ō":{"x_min":46,"x_max":635,"ha":681,"o":"m 338 654 q 549 561 464 654 q 635 317 635 468 q 596 139 635 213 q 487 23 558 66 q 335 -19 416 -19 q 130 74 214 -19 q 46 317 46 168 q 130 560 46 466 q 338 654 214 654 m 338 605 q 216 537 264 605 q 168 319 168 468 q 215 98 168 168 q 338 29 263 29 q 464 98 416 29 q 512 327 512 168 q 465 540 512 474 q 338 605 417 605 m 126 945 l 556 945 l 556 857 l 126 857 l 126 945 "},"”":{"x_min":8.390625,"x_max":470,"ha":529,"o":"m 29 638 l 8 669 q 105 764 74 717 q 136 845 136 811 q 132 862 136 856 q 120 868 128 868 l 114 867 q 87 863 97 863 q 36 885 57 863 q 15 938 15 907 q 37 997 15 972 q 89 1023 60 1023 q 164 986 131 1023 q 197 892 197 949 q 29 638 197 751 m 302 638 l 281 669 q 378 764 347 717 q 409 844 409 811 q 405 862 409 856 q 393 868 401 868 l 386 867 q 359 863 370 863 q 309 884 330 863 q 288 938 288 906 q 310 997 288 972 q 362 1023 333 1023 q 437 986 404 1023 q 470 892 470 949 q 302 638 470 750 "},"ö":{"x_min":46,"x_max":635,"ha":681,"o":"m 338 654 q 549 561 464 654 q 635 317 635 468 q 596 139 635 213 q 487 23 558 66 q 335 -19 416 -19 q 130 74 214 -19 q 46 317 46 168 q 130 560 46 466 q 338 654 214 654 m 338 605 q 216 537 264 605 q 168 319 168 468 q 215 98 168 168 q 338 29 263 29 q 464 98 416 29 q 512 327 512 168 q 465 540 512 474 q 338 605 417 605 m 225 928 q 274 908 254 928 q 294 859 294 888 q 273 809 294 830 q 225 789 253 789 q 177 810 197 789 q 158 860 158 831 q 177 908 158 888 q 225 928 197 928 m 481 926 q 530 905 510 926 q 550 856 550 885 q 529 806 550 827 q 481 786 509 786 q 432 806 452 786 q 412 855 412 827 q 432 905 412 885 q 481 926 452 926 "},"☺":{"x_min":257,"x_max":1105,"ha":1362,"o":"m 681 783 q 889 727 787 783 q 1047 567 990 671 q 1105 350 1105 463 q 1048 136 1105 238 q 891 -23 992 33 q 681 -81 790 -81 q 470 -23 570 -81 q 313 136 369 33 q 257 350 257 238 q 313 567 257 463 q 472 727 370 671 q 681 783 574 783 m 681 720 q 503 672 590 720 q 367 535 416 624 q 319 350 319 446 q 366 167 319 255 q 500 30 414 79 q 681 -18 587 -18 q 861 30 774 -18 q 995 167 947 79 q 1043 350 1043 255 q 994 535 1043 446 q 858 672 945 624 q 681 720 772 720 m 518 495 q 556 479 540 495 q 572 440 572 463 q 556 401 572 417 q 518 385 540 385 q 480 401 496 385 q 464 440 464 417 q 480 479 464 463 q 518 495 496 495 m 843 495 q 881 479 865 495 q 897 440 897 463 q 881 401 897 417 q 843 385 865 385 q 805 401 821 385 q 789 440 789 417 q 804 479 789 463 q 843 495 820 495 m 485 211 l 526 236 q 680 139 579 139 q 834 236 782 139 l 876 211 q 794 113 843 147 q 680 80 745 80 q 567 113 615 80 q 485 211 518 147 "},"╧":{"x_min":-15,"x_max":979,"ha":964,"o":"m 979 490 l -15 490 l -15 609 l 424 609 l 424 1263 l 540 1263 l 540 609 l 979 609 l 979 490 m 979 233 l -15 233 l -15 352 l 979 352 l 979 233 "},"ć":{"x_min":41,"x_max":563.640625,"ha":604,"o":"m 520 188 l 563 175 q 335 -19 511 -19 q 123 68 205 -19 q 41 300 41 155 q 131 561 41 468 q 343 654 221 654 q 495 602 435 654 q 555 487 555 550 q 532 424 555 449 q 480 400 510 400 q 429 421 450 400 q 409 472 409 442 q 431 529 409 502 q 442 549 442 542 q 416 588 442 569 q 345 607 390 607 q 223 546 264 607 q 163 315 163 459 q 216 109 163 179 q 351 39 269 39 q 520 188 465 39 m 252 741 l 235 758 l 349 924 q 414 1008 395 993 q 452 1023 433 1023 q 491 1006 474 1023 q 508 968 508 989 q 460 899 508 934 l 252 741 "},"þ":{"x_min":15,"x_max":692,"ha":781,"o":"m 233 1008 l 233 509 q 329 615 278 584 q 439 647 379 647 q 561 606 503 647 q 655 489 619 566 q 692 315 692 412 q 603 62 692 160 q 426 -19 529 -19 q 320 11 367 -19 q 236 102 273 41 l 236 -154 q 250 -196 236 -184 q 301 -212 268 -212 l 347 -212 l 347 -261 l 15 -261 l 15 -212 l 61 -212 q 109 -199 93 -212 q 125 -166 125 -187 l 125 865 q 103 931 125 912 q 15 950 81 950 l 15 1008 l 233 1008 m 408 585 q 286 513 336 585 q 236 307 236 442 q 284 106 236 171 q 408 41 333 41 q 516 96 478 41 q 565 310 565 169 q 521 521 565 458 q 408 585 477 585 "},"]":{"x_min":14.859375,"x_max":292,"ha":453,"o":"m 292 -98 l 14 -98 l 14 -47 l 132 -47 q 173 -31 160 -47 q 187 18 187 -16 l 187 1043 q 172 1097 187 1080 q 132 1114 158 1114 l 14 1114 l 14 1165 l 292 1165 l 292 -98 "},"А":{"x_min":-10,"x_max":990,"ha":983,"o":"m 474 1023 l 519 1023 l 872 106 q 959 51 893 51 l 990 51 l 990 0 l 598 0 l 598 51 l 629 51 q 715 64 690 51 q 733 93 733 74 q 728 118 733 105 l 646 331 l 258 331 l 212 208 q 195 131 195 160 q 225 74 195 98 q 312 51 255 51 l 346 51 l 346 0 l -10 0 l -10 51 q 80 76 47 51 q 141 173 113 101 l 474 1023 m 455 830 l 279 384 l 627 384 l 455 830 "},"′":{"x_min":53.203125,"x_max":226,"ha":278,"o":"m 53 556 l 69 759 q 85 876 76 840 q 117 935 94 913 q 172 958 140 958 q 226 906 226 958 q 172 759 226 880 l 82 556 l 53 556 "},"Ы":{"x_min":64,"x_max":1363,"ha":1406,"o":"m 64 0 l 64 51 l 117 51 q 176 60 160 51 q 195 82 191 69 q 200 136 200 95 l 200 886 q 189 938 200 925 q 143 951 178 951 l 64 951 l 64 1002 l 517 1002 l 517 951 l 404 951 q 353 933 365 951 q 341 876 341 916 l 341 565 l 540 565 q 799 490 706 565 q 893 279 893 416 q 807 78 893 156 q 554 0 722 0 l 64 0 m 341 514 l 341 126 q 355 68 341 85 q 414 51 370 51 l 497 51 q 695 109 649 51 q 741 280 741 167 q 684 458 741 402 q 501 514 627 514 l 341 514 m 910 1002 l 1363 1002 l 1363 951 l 1285 951 q 1219 938 1233 951 q 1206 882 1206 925 l 1206 123 q 1217 66 1206 78 q 1275 51 1233 51 l 1363 51 l 1363 0 l 910 0 l 910 51 l 995 51 q 1053 64 1040 51 q 1067 123 1067 78 l 1067 882 q 1055 935 1067 925 q 986 951 1036 951 l 910 951 l 910 1002 "},"ẁ":{"x_min":35,"x_max":1025,"ha":1058,"o":"m 35 635 l 308 635 l 308 588 l 272 588 q 234 579 245 588 q 223 556 223 571 q 229 525 223 541 l 369 166 l 491 507 q 446 575 466 561 q 379 588 427 588 l 379 635 l 679 635 l 679 588 l 653 588 q 606 579 619 588 q 594 553 594 569 q 599 525 594 541 l 740 166 l 853 485 q 865 540 865 517 q 847 574 865 562 q 782 587 830 587 l 782 635 l 1025 635 l 1025 588 q 956 559 979 580 q 917 494 933 538 l 736 -19 l 697 -19 l 522 426 l 365 -19 l 327 -19 l 104 542 q 80 578 93 568 q 35 587 66 587 l 35 635 m 634 758 l 619 741 l 434 878 q 361 968 361 933 q 377 1005 361 988 q 416 1023 394 1023 q 483 979 453 1023 l 634 758 "},"ĭ":{"x_min":-10.78125,"x_max":400,"ha":429,"o":"m 32 638 l 280 638 l 280 96 q 290 64 280 74 q 329 51 306 51 l 400 51 l 400 0 l 46 0 l 46 51 l 111 51 q 154 65 140 51 q 168 107 168 80 l 168 507 q 146 564 168 545 q 83 584 125 584 l 32 584 l 32 638 m -10 1002 l 31 1002 q 85 936 48 958 q 188 915 122 915 q 299 939 256 915 q 349 1002 332 958 l 393 1002 q 359 885 387 931 q 286 813 332 839 q 188 787 241 787 q 56 841 110 787 q -10 1002 1 895 "},"8":{"x_min":82,"x_max":714,"ha":757,"o":"m 513 532 q 666 429 619 492 q 714 276 714 366 q 645 86 714 167 q 393 -19 557 -19 q 165 51 249 -19 q 82 228 82 122 q 130 367 82 307 q 297 467 178 426 q 122 704 122 544 q 200 883 122 808 q 400 958 279 958 q 545 928 483 958 q 638 849 606 899 q 671 744 671 799 q 513 532 671 616 m 462 549 q 556 630 532 590 q 580 734 580 669 q 532 864 580 818 q 396 911 485 911 q 260 867 308 911 q 212 755 212 824 q 254 646 212 687 q 462 549 296 606 m 346 448 q 215 357 252 408 q 179 232 179 306 q 234 83 179 136 q 394 30 290 30 q 565 83 504 30 q 627 223 627 136 q 574 343 627 303 q 346 448 521 384 "},"R":{"x_min":35,"x_max":953,"ha":984,"o":"m 35 1002 l 542 1002 q 771 933 690 1002 q 853 754 853 865 q 820 636 853 688 q 727 553 788 584 q 537 509 666 522 q 667 457 631 482 q 725 391 703 432 q 774 227 746 351 q 817 106 794 138 q 855 81 834 81 q 894 111 876 81 q 912 220 912 142 l 953 220 q 795 -10 953 -10 q 709 15 746 -10 q 655 89 673 40 q 623 280 641 125 q 592 408 613 371 q 524 469 570 446 q 415 493 479 493 l 335 493 l 335 99 q 347 63 335 74 q 397 51 363 51 l 492 51 l 492 0 l 35 0 l 35 51 l 131 51 q 178 63 163 51 q 193 99 193 76 l 193 899 q 177 938 193 925 q 131 951 162 951 l 35 951 l 35 1002 m 335 542 l 451 542 q 633 586 567 542 q 700 747 700 631 q 675 872 700 826 q 609 935 650 918 q 450 952 569 952 q 353 940 372 952 q 335 902 335 929 l 335 542 "},"Ż":{"x_min":49,"x_max":769,"ha":831,"o":"m 90 1002 l 769 1002 l 769 951 l 207 51 l 420 51 q 570 81 512 51 q 665 172 629 112 q 731 376 701 233 l 769 376 l 769 0 l 49 0 l 49 45 l 615 951 l 413 951 q 284 931 329 951 q 182 836 221 904 q 127 654 143 768 l 90 654 l 90 1002 m 405 1307 q 454 1287 434 1307 q 474 1238 474 1267 q 453 1188 474 1209 q 405 1168 433 1168 q 357 1188 377 1168 q 338 1238 338 1209 q 357 1287 338 1267 q 405 1307 377 1307 "},"ħ":{"x_min":29,"x_max":801,"ha":832,"o":"m 265 824 l 492 824 l 492 776 l 265 776 l 265 524 q 491 654 363 654 q 600 622 553 654 q 667 537 647 590 q 687 370 687 483 l 687 106 q 747 51 687 51 l 801 51 l 801 0 l 465 0 l 465 51 l 502 51 q 577 106 577 51 l 577 408 q 540 529 577 482 q 443 576 504 576 q 317 515 369 576 q 265 366 265 454 l 265 113 q 324 51 265 51 l 378 51 l 378 0 l 49 0 l 49 51 l 86 51 q 156 113 156 51 l 156 776 l 29 776 l 29 824 l 156 824 l 156 870 q 74 951 156 951 l 29 951 l 29 1008 l 265 1008 l 265 824 "},"õ":{"x_min":46,"x_max":635,"ha":681,"o":"m 338 654 q 549 561 464 654 q 635 317 635 468 q 596 139 635 213 q 487 23 558 66 q 335 -19 416 -19 q 130 74 214 -19 q 46 317 46 168 q 130 560 46 466 q 338 654 214 654 m 338 605 q 216 537 264 605 q 168 319 168 468 q 215 98 168 168 q 338 29 263 29 q 464 98 416 29 q 512 327 512 168 q 465 540 512 474 q 338 605 417 605 m 560 945 l 582 945 q 544 830 582 872 q 450 789 506 789 q 314 824 409 789 q 220 850 244 850 q 154 789 171 850 l 132 789 q 264 943 146 943 q 391 912 308 943 q 495 882 474 882 q 560 945 542 882 "},"─":{"x_min":-15,"x_max":979,"ha":964,"o":"m 979 362 l -15 362 l -15 481 l 979 481 l 979 362 "},"˙":{"x_min":159,"x_max":295,"ha":453,"o":"m 226 973 q 275 953 255 973 q 295 904 295 933 q 274 854 295 875 q 226 834 254 834 q 178 854 198 834 q 159 904 159 875 q 178 953 159 933 q 226 973 198 973 "},"ê":{"x_min":58,"x_max":633.984375,"ha":681,"o":"m 628 313 l 184 313 q 235 108 184 167 q 381 41 293 41 q 590 192 511 41 l 633 173 q 353 -19 536 -19 q 143 73 228 -19 q 58 309 58 165 q 142 558 58 463 q 349 654 226 654 q 505 606 439 654 q 604 470 571 559 q 628 313 628 407 m 183 361 l 452 361 q 489 377 476 361 q 503 434 503 394 q 457 560 503 508 q 349 613 411 613 q 231 550 280 613 q 183 361 183 487 m 318 1013 l 372 1013 l 531 780 l 489 780 l 344 914 l 202 780 l 160 780 l 318 1013 "},"″":{"x_min":63,"x_max":475,"ha":530,"o":"m 63 556 l 63 757 q 97 915 73 873 q 171 958 121 958 q 227 906 227 958 q 173 757 227 878 l 84 556 l 63 556 m 314 556 l 314 757 q 323 877 314 840 q 357 935 332 913 q 420 958 383 958 q 475 907 475 958 q 425 757 475 865 l 334 556 l 314 556 "},"„":{"x_min":8.390625,"x_max":470,"ha":529,"o":"m 29 -241 l 8 -210 q 105 -115 74 -162 q 136 -34 136 -68 q 132 -17 136 -23 q 120 -11 128 -11 l 114 -12 q 86 -19 98 -19 q 36 3 57 -19 q 15 58 15 26 q 38 121 15 95 q 89 147 60 147 q 164 110 131 147 q 197 14 197 73 q 29 -241 197 -127 m 302 -241 l 281 -210 q 377 -115 346 -163 q 409 -35 409 -68 q 405 -17 409 -23 q 393 -11 401 -11 l 386 -12 q 358 -19 371 -19 q 309 3 330 -19 q 288 58 288 26 q 310 120 288 94 q 362 146 333 146 q 437 109 404 146 q 470 14 470 72 q 431 -117 470 -54 q 302 -241 393 -179 "},"ч":{"x_min":0,"x_max":742,"ha":774,"o":"m 0 584 l 0 635 l 330 635 l 330 584 l 275 584 q 219 527 219 584 l 219 420 q 250 330 219 361 q 335 299 282 299 q 427 323 377 299 q 510 383 477 347 l 510 538 q 461 584 510 584 l 408 584 l 408 635 l 742 635 l 742 584 l 679 584 q 622 527 622 584 l 622 96 q 670 51 622 51 l 742 51 l 742 0 l 388 0 l 388 51 l 453 51 q 510 107 510 51 l 510 331 q 299 233 410 233 q 167 274 227 233 q 107 436 107 315 l 107 538 q 58 584 107 584 l 0 584 "},"δ":{"x_min":46,"x_max":635,"ha":681,"o":"m 281 631 q 93 826 93 693 q 169 970 93 913 q 371 1027 246 1027 q 540 989 472 1027 q 608 884 608 952 q 541 804 608 804 q 492 822 510 804 q 474 867 474 840 q 489 909 474 888 q 497 929 497 920 q 460 967 497 953 q 376 982 424 982 q 244 936 289 982 q 199 826 199 891 q 237 732 199 763 q 398 655 275 700 q 535 584 487 622 q 609 476 583 545 q 635 315 635 407 q 545 68 635 157 q 337 -20 455 -20 q 130 73 214 -20 q 46 316 46 167 q 281 631 46 556 m 512 327 q 465 538 512 470 q 338 605 418 605 q 212 530 256 605 q 168 319 168 455 q 214 101 168 174 q 338 29 260 29 q 512 327 512 29 "},"Â":{"x_min":-10,"x_max":990,"ha":983,"o":"m 474 1023 l 519 1023 l 872 106 q 959 51 893 51 l 990 51 l 990 0 l 598 0 l 598 51 l 629 51 q 715 64 690 51 q 733 93 733 74 q 728 118 733 105 l 646 331 l 258 331 l 212 208 q 195 131 195 160 q 225 74 195 98 q 312 51 255 51 l 346 51 l 346 0 l -10 0 l -10 51 q 80 76 47 51 q 141 173 113 101 l 474 1023 m 455 830 l 279 384 l 627 384 l 455 830 m 463 1349 l 518 1349 l 677 1115 l 634 1115 l 490 1250 l 348 1115 l 305 1115 l 463 1349 "},"Į":{"x_min":51,"x_max":504,"ha":555,"o":"m 51 1002 l 504 1002 l 504 951 l 426 951 q 360 937 374 951 q 347 881 347 924 l 347 123 q 358 66 347 78 q 416 51 374 51 l 504 51 l 504 0 l 51 0 l 51 51 l 136 51 q 194 64 181 51 q 208 123 208 78 l 208 881 q 196 935 208 925 q 127 951 177 951 l 51 951 l 51 1002 m 240 7 l 275 7 q 258 -63 258 -30 q 298 -162 258 -124 q 402 -201 339 -201 q 482 -185 438 -201 l 496 -207 q 412 -249 446 -238 q 340 -261 378 -261 q 228 -223 269 -261 q 187 -128 187 -186 q 240 7 187 -47 "},"ω":{"x_min":46,"x_max":816,"ha":862,"o":"m 350 653 l 350 604 q 206 520 244 604 q 169 311 169 437 q 197 105 169 181 q 285 28 226 28 q 354 79 334 28 q 374 280 374 131 l 374 345 l 486 345 l 486 280 q 510 69 486 111 q 576 28 534 28 q 663 105 634 28 q 693 311 693 182 q 667 492 693 425 q 606 581 641 559 q 511 603 571 603 l 511 654 q 735 559 654 654 q 816 293 816 464 q 750 58 816 137 q 588 -20 684 -20 q 430 72 484 -20 q 271 -20 371 -20 q 110 60 174 -20 q 46 290 46 140 q 88 504 46 425 q 195 618 131 583 q 350 653 258 653 "},"Ţ":{"x_min":49.390625,"x_max":866.609375,"ha":908,"o":"m 49 1003 l 866 1003 l 866 623 l 830 623 q 594 958 785 958 q 541 944 555 958 q 527 899 527 930 l 527 98 q 540 62 527 74 q 586 51 554 51 l 686 51 l 686 0 l 229 0 l 229 51 l 342 51 q 377 62 365 51 q 389 93 389 74 l 389 905 q 373 944 389 931 q 324 958 358 958 q 163 865 228 958 q 87 623 110 788 l 49 623 l 49 1003 m 434 -285 l 424 -260 q 492 -183 492 -231 q 480 -170 492 -170 q 468 -171 477 -170 q 452 -174 458 -174 q 409 -158 427 -174 q 392 -121 392 -142 q 409 -85 392 -101 q 456 -70 427 -70 q 516 -93 493 -70 q 539 -154 539 -116 q 434 -285 539 -243 "},"":{"x_min":49.6875,"x_max":402,"ha":453,"o":"m 78 959 q 163 949 118 949 l 402 949 l 402 928 q 309 760 347 843 q 272 560 272 676 q 262 476 272 493 q 217 459 252 459 q 162 511 162 459 q 286 808 162 598 l 332 887 l 144 887 q 117 872 126 887 q 93 787 108 857 l 49 787 l 78 959 "},"´":{"x_min":134.515625,"x_max":407,"ha":453,"o":"m 151 741 l 134 758 l 248 924 q 313 1008 294 993 q 351 1023 332 1023 q 390 1006 373 1023 q 407 968 407 989 q 359 898 407 934 l 151 741 "},"Ĉ":{"x_min":94,"x_max":916.296875,"ha":982,"o":"m 786 924 l 832 1021 l 883 1021 l 883 618 l 847 618 q 736 868 803 788 q 540 970 654 970 q 338 857 416 970 q 261 476 261 744 q 350 132 261 250 q 562 32 425 32 q 763 110 682 32 q 869 346 844 188 l 916 346 q 796 71 895 167 q 545 -25 696 -25 q 319 38 422 -25 q 155 219 216 101 q 94 478 94 337 q 157 760 94 628 q 319 957 220 891 q 532 1024 418 1024 q 656 1001 596 1024 q 786 924 716 979 m 502 1347 l 556 1347 l 715 1114 l 673 1114 l 528 1248 l 386 1114 l 344 1114 l 502 1347 "},"И":{"x_min":64,"x_max":1085,"ha":1149,"o":"m 341 247 l 808 869 l 808 886 q 795 939 808 927 q 742 951 782 951 l 671 951 l 671 1002 l 1085 1002 l 1085 951 l 1011 951 q 964 939 981 951 q 948 857 948 927 l 948 137 q 952 81 948 93 q 974 59 956 68 q 1020 51 992 51 l 1085 51 l 1085 0 l 671 0 l 671 51 l 742 51 q 796 69 784 51 q 808 142 808 87 l 808 776 l 342 149 q 342 91 342 107 q 359 62 342 74 q 406 51 377 51 l 483 51 l 483 0 l 64 0 l 64 51 l 144 51 q 188 69 176 51 q 200 142 200 87 l 200 866 q 188 935 200 920 q 134 951 177 951 l 64 951 l 64 1002 l 483 1002 l 483 951 l 406 951 q 352 936 364 951 q 341 866 341 921 l 341 247 "},"⌡":{"x_min":171,"x_max":456,"ha":816,"o":"m 360 1177 l 456 1177 l 456 -50 q 399 -269 456 -190 q 262 -349 342 -349 q 192 -325 213 -349 q 171 -275 171 -302 q 188 -229 171 -247 q 228 -212 206 -212 q 266 -222 251 -212 q 294 -253 280 -231 q 325 -279 310 -279 q 352 -262 344 -279 q 360 -158 360 -246 l 360 1177 "},"○":{"x_min":118,"x_max":704,"ha":822,"o":"m 411 690 q 555 651 484 690 q 664 540 625 612 q 704 391 704 469 q 618 180 704 267 q 411 93 532 93 q 203 180 289 93 q 118 391 118 267 q 157 541 118 469 q 267 651 196 612 q 411 690 337 690 m 411 638 q 291 606 349 638 q 201 514 234 574 q 169 391 169 455 q 240 217 169 289 q 411 145 311 145 q 582 217 511 145 q 653 391 653 289 q 620 514 653 455 q 530 606 587 574 q 411 638 472 638 "},"Љ":{"x_min":24.296875,"x_max":1461,"ha":1494,"o":"m 1085 1003 l 1085 952 l 972 952 q 921 934 933 952 q 909 876 909 916 l 909 566 l 1108 566 q 1368 491 1275 566 q 1461 280 1461 416 q 1376 79 1461 158 q 1121 0 1292 0 l 632 0 l 632 51 l 685 51 q 744 60 728 51 q 763 82 759 69 q 768 136 768 95 l 768 883 q 756 934 768 920 q 708 947 745 947 l 566 947 q 467 923 494 947 q 433 856 440 899 q 426 628 426 813 q 396 261 426 408 q 303 50 366 114 q 157 -14 239 -14 q 61 20 98 -14 q 24 117 24 55 q 49 194 24 166 q 118 222 75 222 q 168 206 151 222 q 199 155 185 191 q 215 123 208 130 q 237 115 221 115 q 333 296 299 115 q 367 727 367 478 q 344 915 367 878 q 259 952 322 952 l 204 952 l 204 1003 l 1085 1003 m 909 515 l 909 126 q 923 68 909 85 q 982 51 937 51 l 1065 51 q 1263 109 1217 51 q 1309 280 1309 167 q 1252 459 1309 403 q 1069 515 1196 515 l 909 515 "},"р":{"x_min":41,"x_max":718,"ha":782,"o":"m 241 640 q 257 509 257 575 q 355 615 304 584 q 465 647 405 647 q 587 606 529 647 q 681 489 645 566 q 718 315 718 412 q 628 62 718 160 q 452 -19 555 -19 q 346 11 393 -19 q 262 102 299 41 l 262 -154 q 276 -196 262 -184 q 326 -212 294 -212 l 373 -212 l 373 -261 l 41 -261 l 41 -212 l 86 -212 q 134 -199 118 -212 q 150 -166 150 -187 l 150 502 q 128 568 150 549 q 41 588 106 588 l 41 640 l 241 640 m 434 585 q 312 513 362 585 q 262 307 262 442 q 310 106 262 171 q 434 41 359 41 q 542 96 504 41 q 591 310 591 169 q 547 521 591 458 q 434 585 503 585 "},"Ω":{"x_min":59.46875,"x_max":998.203125,"ha":1058,"o":"m 59 300 l 98 300 q 176 133 119 175 q 381 92 233 92 l 425 92 l 425 228 q 181 359 275 255 q 87 607 87 464 q 217 905 87 787 q 521 1023 348 1023 q 839 911 707 1023 q 971 621 971 799 q 884 376 971 485 q 632 229 798 267 l 632 92 l 677 92 q 827 104 779 92 q 909 158 876 116 q 959 300 942 201 l 998 300 l 998 0 l 571 0 l 571 272 q 804 617 804 302 q 725 891 804 812 q 530 971 647 971 q 333 888 413 971 q 254 608 254 805 q 309 367 254 445 q 487 272 365 288 l 487 0 l 59 0 l 59 300 "},"т":{"x_min":23.4375,"x_max":639.203125,"ha":663,"o":"m 65 408 l 23 408 l 23 635 l 639 635 l 639 408 l 598 408 q 541 553 576 523 q 453 584 505 584 l 384 584 l 384 96 q 432 51 384 51 l 503 51 l 503 0 l 149 0 l 149 51 l 214 51 q 272 107 272 51 l 272 584 l 209 584 q 117 548 150 584 q 65 408 84 512 "},"П":{"x_min":64,"x_max":1070,"ha":1134,"o":"m 64 1002 l 1070 1002 l 1070 951 l 997 951 q 946 935 959 951 q 934 857 934 919 l 934 137 q 938 80 934 92 q 960 59 942 67 q 1004 51 979 51 l 1070 51 l 1070 0 l 655 0 l 655 51 l 726 51 q 781 69 769 51 q 793 142 793 87 l 793 945 l 341 945 l 341 137 q 344 80 341 90 q 363 60 348 70 q 406 51 378 51 l 483 51 l 483 0 l 64 0 l 64 51 l 144 51 q 180 61 170 51 q 195 80 190 72 q 200 142 200 89 l 200 865 q 189 935 200 919 q 134 951 178 951 l 64 951 l 64 1002 "},"Ö":{"x_min":74,"x_max":986,"ha":1059,"o":"m 521 1023 q 754 956 645 1023 q 924 769 863 889 q 986 500 986 650 q 924 230 986 350 q 754 42 862 109 q 525 -25 646 -25 q 303 41 407 -25 q 136 230 199 107 q 74 502 74 353 q 134 769 74 650 q 301 955 195 888 q 521 1023 407 1023 m 532 971 q 321 861 402 971 q 241 503 241 751 q 323 131 241 234 q 528 29 406 29 q 677 75 613 29 q 780 224 742 122 q 819 490 819 325 q 783 772 819 670 q 680 922 747 873 q 532 971 613 971 m 401 1263 q 450 1243 430 1263 q 470 1194 470 1223 q 449 1144 470 1165 q 401 1124 429 1124 q 353 1145 373 1124 q 334 1195 334 1166 q 353 1243 334 1223 q 401 1263 373 1263 m 657 1261 q 706 1240 686 1261 q 726 1191 726 1220 q 705 1141 726 1162 q 657 1121 685 1121 q 608 1141 628 1121 q 588 1191 588 1162 q 608 1240 588 1220 q 657 1261 628 1261 "},"z":{"x_min":65,"x_max":596,"ha":654,"o":"m 92 635 l 594 635 l 594 594 l 202 51 l 393 51 q 498 93 459 51 q 558 248 537 135 l 596 248 l 596 0 l 65 0 l 65 46 l 455 586 l 290 586 q 212 572 238 586 q 168 524 187 557 q 133 408 149 490 l 92 408 l 92 635 "},"":{"x_min":64,"x_max":837.109375,"ha":879,"o":"m 837 919 l 837 709 l 817 709 q 744 833 803 805 q 602 861 686 861 l 334 861 l 334 115 q 363 50 334 75 q 466 25 393 25 l 466 0 l 64 0 l 64 24 q 162 47 131 24 q 193 132 193 69 l 193 790 q 163 871 193 847 q 64 895 133 895 l 64 919 l 837 919 "},"™":{"x_min":24.75,"x_max":1334,"ha":1361,"o":"m 38 1002 l 530 1002 l 544 864 l 521 864 q 484 939 514 916 q 390 961 457 961 l 341 961 l 341 546 q 354 487 341 502 q 412 473 368 473 l 412 448 l 159 448 l 159 473 q 214 489 202 473 q 227 561 227 505 l 227 961 l 175 961 q 83 938 111 961 q 47 864 56 916 l 24 864 l 38 1002 m 783 1002 l 967 609 l 1146 1002 l 1334 1002 l 1334 976 q 1273 961 1287 976 q 1260 905 1260 946 l 1260 562 q 1273 488 1260 503 q 1334 473 1286 473 l 1334 448 l 1066 448 l 1066 473 q 1119 480 1106 473 q 1139 502 1132 487 q 1146 561 1146 518 l 1146 900 l 939 448 l 917 448 l 710 893 l 710 545 q 724 487 710 503 q 773 472 738 472 l 797 472 l 797 448 l 591 448 l 591 472 q 652 487 638 472 q 667 552 667 502 l 667 899 q 652 961 667 947 q 591 976 638 976 l 591 1002 l 783 1002 "},"╦":{"x_min":-15,"x_max":979.375,"ha":965,"o":"m 979 490 l -15 490 l -15 609 l 979 609 l 979 490 m 298 233 l -14 233 l -14 352 l 414 352 l 414 -421 l 298 -421 l 298 233 m 551 -421 l 551 352 l 979 352 l 979 233 l 667 233 l 667 -421 l 551 -421 "},"Θ":{"x_min":74,"x_max":986,"ha":1059,"o":"m 524 1023 q 748 959 637 1023 q 922 772 859 896 q 986 500 986 649 q 849 126 986 272 q 525 -20 712 -20 q 307 42 412 -20 q 138 229 202 105 q 74 503 74 353 q 134 769 74 650 q 301 955 195 888 q 524 1023 407 1023 m 531 971 q 324 864 407 971 q 241 504 241 758 q 321 137 241 241 q 528 33 402 33 q 741 144 663 33 q 819 490 819 256 q 737 863 819 756 q 531 971 656 971 m 330 315 l 330 706 l 376 706 q 507 542 376 542 l 552 542 q 684 706 684 542 l 730 706 l 730 315 l 684 315 q 649 453 684 412 q 545 493 614 493 l 516 493 q 376 315 376 493 l 330 315 "},"Ř":{"x_min":35,"x_max":953,"ha":984,"o":"m 35 1002 l 542 1002 q 771 933 690 1002 q 853 754 853 865 q 820 636 853 688 q 727 553 788 584 q 537 509 666 522 q 667 457 631 482 q 725 391 703 432 q 774 227 746 351 q 817 106 794 138 q 855 81 834 81 q 894 111 876 81 q 912 220 912 142 l 953 220 q 795 -10 953 -10 q 709 15 746 -10 q 655 89 673 40 q 623 280 641 125 q 592 408 613 371 q 524 469 570 446 q 415 493 479 493 l 335 493 l 335 99 q 347 63 335 74 q 397 51 363 51 l 492 51 l 492 0 l 35 0 l 35 51 l 131 51 q 178 63 163 51 q 193 99 193 76 l 193 899 q 177 938 193 925 q 131 951 162 951 l 35 951 l 35 1002 m 335 542 l 451 542 q 633 586 567 542 q 700 747 700 631 q 675 872 700 826 q 609 935 650 918 q 450 952 569 952 q 353 940 372 952 q 335 902 335 929 l 335 542 m 306 1348 l 348 1348 l 492 1212 l 635 1348 l 677 1348 l 517 1112 l 461 1112 l 306 1348 "},"╖":{"x_min":-15.578125,"x_max":666,"ha":964,"o":"m 297 -420 l 297 362 l -15 362 l -15 481 l 666 481 l 666 -420 l 550 -420 l 550 362 l 413 362 l 413 -420 l 297 -420 "},"Ň":{"x_min":56,"x_max":1084,"ha":1110,"o":"m 56 1002 l 290 1002 l 884 215 l 884 785 q 845 913 884 871 q 740 951 810 951 l 740 1003 l 1084 1003 l 1084 951 q 1005 936 1031 951 q 960 882 979 921 q 941 796 941 843 l 941 0 l 878 0 l 265 819 l 265 214 q 305 92 265 132 q 431 52 346 52 l 431 0 l 56 0 l 56 52 q 167 97 126 52 q 209 206 209 141 l 209 886 l 197 898 q 150 942 164 935 q 100 951 131 951 l 56 951 l 56 1002 m 359 1348 l 401 1348 l 544 1212 l 688 1348 l 730 1348 l 570 1112 l 514 1112 l 359 1348 "},"É":{"x_min":89,"x_max":907.21875,"ha":983,"o":"m 89 1002 l 877 1002 l 877 663 l 841 663 q 757 887 815 823 q 607 951 700 951 l 415 951 q 379 938 391 951 q 368 898 368 925 l 368 542 l 452 542 q 563 591 521 542 q 606 743 606 640 l 654 743 l 654 279 l 606 279 q 562 444 606 394 q 445 494 519 494 l 368 494 l 368 95 q 382 62 368 74 q 429 51 396 51 l 582 51 q 867 373 829 51 l 907 373 l 907 0 l 89 0 l 89 51 l 156 51 q 211 64 195 51 q 227 105 227 78 l 227 898 q 213 938 227 925 q 169 951 199 951 l 89 951 l 89 1002 m 416 1075 l 399 1092 l 513 1258 q 579 1342 560 1327 q 617 1357 597 1357 q 655 1340 638 1357 q 672 1302 672 1323 q 624 1233 672 1269 l 416 1075 "},"и":{"x_min":32,"x_max":812,"ha":844,"o":"m 580 526 l 580 553 q 532 584 574 584 l 461 584 l 461 635 l 812 635 l 812 584 l 748 584 q 692 526 692 584 l 692 96 q 740 51 692 51 l 811 51 l 811 0 l 457 0 l 457 51 l 523 51 q 580 107 580 51 l 580 455 l 266 120 l 266 96 q 314 51 266 51 l 387 51 l 387 0 l 32 0 l 32 51 l 97 51 q 154 107 154 51 l 154 538 q 106 584 154 584 l 35 584 l 35 635 l 387 635 l 387 584 l 322 584 q 266 526 266 584 l 266 189 l 580 526 "},"³":{"x_min":53,"x_max":401,"ha":453,"o":"m 297 720 q 375 677 349 707 q 401 599 401 646 q 353 502 401 541 q 225 463 306 463 q 98 498 143 463 q 53 579 53 534 q 68 622 53 606 q 106 639 83 639 q 139 626 127 639 q 151 591 151 613 q 138 555 151 574 q 129 532 129 540 q 145 508 129 519 q 208 494 169 494 q 282 520 258 494 q 307 605 307 546 q 289 681 307 656 q 236 704 269 704 l 207 704 l 181 704 q 152 708 159 704 q 145 721 145 713 q 152 734 145 729 q 175 739 159 739 l 206 739 q 240 735 229 735 q 289 757 272 735 q 306 827 306 778 q 282 903 306 879 q 214 928 259 928 q 163 916 180 928 q 145 888 145 904 q 153 866 145 880 q 161 840 161 851 q 148 812 161 823 q 115 801 136 801 q 82 814 95 801 q 70 852 70 828 q 113 925 70 892 q 230 958 157 958 q 345 921 302 958 q 388 831 388 884 q 365 768 388 796 q 297 720 342 740 "},"♦":{"x_min":141.5625,"x_max":751.671875,"ha":893,"o":"m 445 836 q 590 614 504 731 q 751 409 690 479 q 590 204 702 356 q 445 -16 500 81 q 396 65 428 18 q 263 254 342 147 q 141 409 245 278 q 314 631 208 487 q 445 836 392 738 "},"[":{"x_min":161,"x_max":438.125,"ha":453,"o":"m 161 1165 l 438 1165 l 438 1114 l 320 1114 q 279 1098 292 1114 q 266 1048 266 1083 l 266 23 q 280 -30 266 -13 q 320 -47 295 -47 l 438 -47 l 438 -98 l 161 -98 l 161 1165 "},"ζ":{"x_min":46,"x_max":595,"ha":599,"o":"m 95 912 l 107 1021 q 248 1009 196 1009 l 570 1009 l 570 977 q 461 848 551 954 q 232 530 299 656 q 166 307 166 403 q 203 213 166 245 q 339 145 241 181 q 504 82 461 101 q 571 27 547 62 q 595 -61 595 -8 q 534 -207 595 -145 q 350 -270 474 -270 q 156 -225 217 -270 q 96 -114 96 -181 q 115 -50 96 -76 q 173 -24 135 -24 q 236 -78 236 -24 q 217 -123 236 -102 q 205 -147 205 -136 q 242 -200 205 -173 q 343 -227 279 -227 q 455 -183 419 -227 q 491 -83 491 -140 q 461 -16 491 -37 q 323 40 431 4 q 94 162 142 102 q 46 291 46 223 q 88 460 46 377 q 236 665 131 542 q 479 921 341 787 l 257 921 q 95 912 167 921 "},"∏":{"x_min":31,"x_max":1090,"ha":1120,"o":"m 824 961 l 296 961 l 296 -130 q 320 -211 296 -187 q 404 -236 345 -236 l 428 -236 l 428 -261 l 31 -261 l 31 -236 l 54 -236 q 138 -210 115 -236 q 162 -130 162 -184 l 162 883 q 137 964 162 940 q 54 989 113 989 l 31 989 l 31 1014 l 1090 1014 l 1090 989 l 1066 989 q 982 963 1005 989 q 959 883 959 937 l 959 -130 q 983 -211 959 -187 q 1066 -236 1008 -236 l 1090 -236 l 1090 -261 l 693 -261 l 693 -236 l 716 -236 q 801 -210 778 -236 q 824 -130 824 -184 l 824 961 "},"Έ":{"x_min":0,"x_max":996.21875,"ha":1073,"o":"m 178 1002 l 966 1002 l 966 663 l 931 663 q 846 887 904 823 q 697 951 789 951 l 504 951 q 468 938 480 951 q 457 898 457 925 l 457 542 l 541 542 q 652 591 610 542 q 695 743 695 640 l 743 743 l 743 279 l 695 279 q 652 444 695 394 q 534 494 608 494 l 457 494 l 457 95 q 471 62 457 74 q 518 51 485 51 l 671 51 q 957 373 919 51 l 996 373 l 996 0 l 178 0 l 178 51 l 245 51 q 300 64 284 51 q 316 105 316 78 l 316 898 q 302 938 316 925 q 258 951 288 951 l 178 951 l 178 1002 m 49 739 l 14 873 q 0 958 0 928 q 62 1026 0 1026 q 112 1007 96 1026 q 129 963 129 988 q 111 873 129 938 l 77 739 l 49 739 "},"Ρ":{"x_min":53,"x_max":875,"ha":908,"o":"m 53 1002 l 537 1002 q 788 926 702 1002 q 875 727 875 850 q 795 540 875 605 q 524 452 685 452 l 349 452 l 349 109 q 362 67 349 80 q 412 51 381 51 l 524 51 l 524 0 l 53 0 l 53 51 l 151 51 q 194 62 180 51 q 208 95 208 74 l 208 893 q 190 937 208 923 q 125 950 173 950 l 53 950 l 53 1002 m 349 501 l 482 501 q 665 554 609 501 q 722 732 722 608 q 696 865 722 819 q 622 934 671 912 q 462 957 573 957 q 368 942 388 957 q 349 893 349 928 l 349 501 "},"ğ":{"x_min":66,"x_max":721,"ha":731,"o":"m 522 599 q 644 668 588 668 q 699 646 677 668 q 721 593 721 624 q 706 551 721 568 q 671 535 691 535 q 620 582 633 535 q 602 603 615 603 q 553 572 579 603 q 592 503 582 532 q 603 439 603 473 q 575 336 603 381 q 482 256 547 291 q 358 222 417 222 l 286 222 q 183 205 209 222 q 158 156 158 188 q 178 116 158 130 q 256 102 199 102 l 420 102 q 600 59 545 102 q 655 -55 655 17 q 592 -191 655 -136 q 332 -270 505 -270 q 120 -216 189 -270 q 66 -122 66 -174 q 100 -48 66 -82 q 218 0 135 -15 q 119 48 152 16 q 86 126 86 80 q 112 202 86 170 q 206 257 139 234 q 121 334 149 289 q 93 437 93 379 q 164 591 93 529 q 348 654 235 654 q 438 640 395 654 q 522 599 481 627 m 347 611 q 249 566 288 611 q 211 442 211 522 q 249 310 211 357 q 347 263 288 263 q 445 308 407 263 q 484 439 484 354 q 445 564 484 518 q 347 611 406 611 m 386 0 q 212 -34 264 0 q 160 -118 160 -69 q 199 -190 160 -164 q 346 -226 250 -226 q 519 -187 461 -226 q 577 -101 577 -148 q 559 -49 577 -73 q 501 -12 541 -25 q 386 0 462 0 m 151 1003 l 193 1003 q 247 936 211 958 q 350 915 284 915 q 461 939 418 915 q 511 1003 494 958 l 555 1003 q 521 885 549 931 q 449 813 494 839 q 351 787 403 787 q 218 841 272 787 q 151 1003 164 896 "},"ª":{"x_min":21,"x_max":452.421875,"ha":454,"o":"m 429 669 l 452 636 q 383 611 416 611 q 332 624 353 611 q 295 671 311 637 q 228 626 264 641 q 153 611 193 611 q 54 637 88 611 q 21 705 21 664 q 71 790 21 755 q 288 859 144 841 l 288 912 q 265 963 288 942 q 206 984 242 984 q 146 969 172 984 q 130 951 130 960 q 138 936 130 946 q 154 903 154 918 q 139 871 154 884 q 100 858 124 858 q 58 873 75 858 q 42 911 42 888 q 91 987 42 952 q 224 1023 141 1023 q 336 992 295 1023 q 376 917 376 960 l 376 714 q 383 672 376 684 q 402 660 390 660 q 429 669 410 660 m 288 822 q 148 778 193 811 q 119 713 119 756 q 133 667 119 684 q 172 651 148 651 q 250 683 213 651 q 288 774 288 715 l 288 822 "},"ї":{"x_min":14,"x_max":406,"ha":429,"o":"m 32 638 l 280 638 l 280 96 q 290 64 280 74 q 329 51 306 51 l 400 51 l 400 0 l 46 0 l 46 51 l 111 51 q 154 65 140 51 q 168 107 168 80 l 168 507 q 146 564 168 545 q 83 584 125 584 l 32 584 l 32 638 m 81 928 q 130 908 110 928 q 150 859 150 888 q 129 809 150 830 q 81 789 109 789 q 33 810 53 789 q 14 860 14 831 q 33 908 14 888 q 81 928 53 928 m 337 926 q 386 905 366 926 q 406 856 406 885 q 385 806 406 827 q 337 786 365 786 q 288 806 308 786 q 268 855 268 827 q 288 905 268 885 q 337 926 308 926 "},"T":{"x_min":49.390625,"x_max":866.609375,"ha":908,"o":"m 49 1002 l 866 1002 l 866 622 l 830 622 q 594 957 785 957 q 541 943 555 957 q 527 898 527 929 l 527 98 q 540 62 527 74 q 586 51 554 51 l 686 51 l 686 0 l 229 0 l 229 51 l 342 51 q 377 62 365 51 q 389 92 389 74 l 389 904 q 373 943 389 930 q 324 957 358 957 q 163 864 228 957 q 87 622 110 787 l 49 622 l 49 1002 "},"š":{"x_min":81.953125,"x_max":573,"ha":630,"o":"m 119 239 q 213 76 159 121 q 345 32 267 32 q 457 64 418 32 q 496 145 496 96 q 481 195 496 174 q 442 227 467 216 q 311 257 416 237 q 170 300 209 278 q 108 362 130 323 q 86 447 86 401 q 131 574 86 517 q 297 647 190 647 q 447 594 378 647 l 491 642 l 526 642 l 526 416 l 491 416 q 412 554 462 512 q 289 597 362 597 q 189 565 225 597 q 154 488 154 533 q 187 422 154 448 q 315 379 219 394 q 458 347 425 360 q 543 284 513 327 q 573 181 573 242 q 508 39 573 97 q 343 -19 443 -19 q 171 43 251 -19 l 123 -14 l 81 -14 l 81 239 l 119 239 m 144 1014 l 186 1014 l 329 878 l 473 1014 l 515 1014 l 355 778 l 299 778 l 144 1014 "},"є":{"x_min":46,"x_max":572.625,"ha":614,"o":"m 532 181 l 572 165 q 338 -20 502 -20 q 134 60 223 -20 q 46 301 46 140 q 133 557 46 461 q 349 653 221 653 q 500 601 441 653 q 560 487 560 549 q 538 425 560 451 q 485 400 516 400 q 434 421 455 400 q 414 471 414 442 q 436 528 414 500 q 447 549 447 541 q 420 587 447 569 q 352 606 394 606 q 170 358 190 606 l 395 358 l 395 301 l 171 301 q 220 108 171 178 q 355 39 270 39 q 448 67 406 39 q 532 181 490 96 "},"Þ":{"x_min":28,"x_max":850,"ha":909,"o":"m 324 242 l 324 109 q 337 67 324 80 q 387 51 356 51 l 501 51 l 501 0 l 28 0 l 28 51 l 126 51 q 169 62 155 51 q 183 95 183 74 l 183 893 q 165 937 183 924 q 100 951 148 951 l 28 951 l 28 1002 l 501 1002 l 501 951 l 406 951 q 341 937 358 951 q 324 893 324 923 l 324 793 l 512 793 q 763 716 677 793 q 850 517 850 640 q 770 330 850 395 q 501 242 660 242 l 324 242 m 324 291 l 457 291 q 640 344 584 291 q 697 522 697 398 q 672 652 697 603 q 605 722 648 700 q 471 744 562 744 l 324 744 l 324 291 "},"":{"x_min":46,"x_max":581,"ha":627,"o":"m 321 578 q 229 669 283 621 q 135 774 152 736 q 119 844 119 812 q 291 962 119 962 q 464 928 395 962 q 532 844 532 894 q 517 804 532 822 q 480 787 503 787 q 409 833 450 787 q 333 904 362 887 q 264 921 305 921 q 186 899 215 921 q 158 847 158 878 q 183 782 158 814 q 314 676 208 750 q 471 553 421 601 q 551 440 521 505 q 581 302 581 376 q 494 77 581 174 q 293 -19 408 -19 q 118 57 190 -19 q 46 266 46 134 q 128 478 46 395 q 321 578 211 562 m 350 546 q 160 279 160 514 q 208 90 160 155 q 318 25 257 25 q 426 89 383 25 q 469 264 469 153 q 446 401 469 344 q 380 509 423 457 q 350 546 355 539 "},"j":{"x_min":-42,"x_max":287,"ha":403,"o":"m 212 1016 q 265 994 244 1016 q 287 940 287 973 q 265 885 287 907 q 212 864 244 864 q 159 886 182 864 q 137 940 137 909 q 159 993 137 970 q 212 1016 182 1016 m 278 640 l 278 36 q 207 -183 278 -96 q 49 -270 136 -270 q -18 -247 5 -270 q -42 -187 -42 -225 q -22 -134 -42 -154 q 25 -113 -3 -113 q 85 -175 71 -113 q 95 -200 90 -195 q 109 -206 99 -206 q 133 -194 121 -206 q 158 -135 148 -176 q 170 -23 170 -78 l 170 511 q 147 568 170 548 q 80 588 125 588 l 23 588 l 23 640 l 278 640 "},"Σ":{"x_min":49,"x_max":769,"ha":831,"o":"m 448 558 l 154 92 l 433 92 q 624 147 554 92 q 732 375 694 203 l 769 375 l 769 0 l 49 0 l 49 45 l 343 503 l 69 951 l 69 1002 l 748 1002 l 748 656 l 710 656 q 655 839 694 776 q 560 927 616 903 q 424 951 505 951 l 206 951 l 448 558 "},"1":{"x_min":149.953125,"x_max":652,"ha":758,"o":"m 462 940 l 462 94 q 475 65 462 75 q 522 51 494 51 l 652 51 l 652 0 l 174 0 l 174 51 l 284 51 q 335 67 318 51 q 352 112 352 84 l 352 751 q 336 784 352 770 q 297 798 321 798 l 149 798 l 149 844 q 318 880 253 858 q 431 940 382 903 l 462 940 "},"░":{"x_min":0,"x_max":882,"ha":964,"o":"m 0 1263 l 80 1263 l 80 1178 l 0 1178 l 0 1263 m 321 1263 l 401 1263 l 401 1178 l 321 1178 l 321 1263 m 642 1263 l 722 1263 l 722 1178 l 642 1178 l 642 1263 m 160 1094 l 240 1094 l 240 1009 l 160 1009 l 160 1094 m 481 1094 l 561 1094 l 561 1009 l 481 1009 l 481 1094 m 802 1094 l 882 1094 l 882 1009 l 802 1009 l 802 1094 m 642 925 l 722 925 l 722 840 l 642 840 l 642 925 m 321 925 l 401 925 l 401 840 l 321 840 l 321 925 m 0 925 l 80 925 l 80 840 l 0 840 l 0 925 m 802 757 l 882 757 l 882 672 l 802 672 l 802 757 m 481 757 l 561 757 l 561 672 l 481 672 l 481 757 m 160 757 l 240 757 l 240 672 l 160 672 l 160 757 m 0 587 l 80 587 l 80 502 l 0 502 l 0 587 m 321 587 l 401 587 l 401 502 l 321 502 l 321 587 m 642 587 l 722 587 l 722 502 l 642 502 l 642 587 m 802 419 l 882 419 l 882 334 l 802 334 l 802 419 m 481 419 l 561 419 l 561 334 l 481 334 l 481 419 m 160 419 l 240 419 l 240 334 l 160 334 l 160 419 m 0 250 l 80 250 l 80 165 l 0 165 l 0 250 m 321 250 l 401 250 l 401 165 l 321 165 l 321 250 m 642 250 l 722 250 l 722 165 l 642 165 l 642 250 m 160 81 l 240 81 l 240 -4 l 160 -4 l 160 81 m 481 81 l 561 81 l 561 -4 l 481 -4 l 481 81 m 802 81 l 882 81 l 882 -4 l 802 -4 l 802 81 m 642 -88 l 722 -88 l 722 -173 l 642 -173 l 642 -88 m 321 -88 l 401 -88 l 401 -173 l 321 -173 l 321 -88 m 0 -88 l 80 -88 l 80 -173 l 0 -173 l 0 -88 m 160 -257 l 240 -257 l 240 -342 l 160 -342 l 160 -257 m 481 -257 l 561 -257 l 561 -342 l 481 -342 l 481 -257 m 802 -257 l 882 -257 l 882 -342 l 802 -342 l 802 -257 "},"ℓ":{"x_min":23.40625,"x_max":567.75,"ha":575,"o":"m 23 221 l 155 356 l 155 692 q 207 895 155 822 q 350 969 260 969 q 451 929 416 969 q 486 834 486 890 q 426 648 486 743 q 261 435 367 553 l 261 209 q 377 23 261 23 q 543 204 486 23 l 567 204 q 490 47 547 113 q 348 -18 434 -18 q 233 20 281 -18 q 170 106 185 58 q 155 254 155 155 l 155 319 l 40 204 l 23 221 m 261 473 q 449 807 449 684 q 423 896 449 862 q 355 930 397 930 q 261 749 261 930 l 261 473 "},"ĉ":{"x_min":41,"x_max":563.640625,"ha":604,"o":"m 520 188 l 563 175 q 335 -19 511 -19 q 123 68 205 -19 q 41 300 41 155 q 131 561 41 468 q 343 654 221 654 q 495 602 435 654 q 555 488 555 551 q 532 425 555 450 q 480 401 510 401 q 429 422 450 401 q 409 472 409 443 q 431 529 409 502 q 442 550 442 542 q 416 588 442 569 q 345 607 390 607 q 223 546 264 607 q 163 315 163 459 q 216 109 163 179 q 351 39 269 39 q 520 188 465 39 m 283 1013 l 337 1013 l 496 780 l 454 780 l 310 914 l 167 780 l 125 780 l 283 1013 "},"ī":{"x_min":-15,"x_max":415,"ha":429,"o":"m 32 638 l 280 638 l 280 96 q 290 64 280 74 q 329 51 306 51 l 400 51 l 400 0 l 46 0 l 46 51 l 111 51 q 154 65 140 51 q 168 107 168 80 l 168 507 q 146 564 168 545 q 83 584 125 584 l 32 584 l 32 638 m -15 945 l 415 945 l 415 857 l -15 857 l -15 945 "},"О":{"x_min":74,"x_max":986,"ha":1059,"o":"m 521 1023 q 754 956 645 1023 q 924 769 863 889 q 986 500 986 650 q 924 230 986 350 q 754 42 862 109 q 525 -25 646 -25 q 303 41 407 -25 q 136 230 199 107 q 74 502 74 353 q 134 769 74 650 q 301 955 195 888 q 521 1023 407 1023 m 532 971 q 321 861 402 971 q 241 503 241 751 q 323 131 241 234 q 528 29 406 29 q 677 75 613 29 q 780 224 742 122 q 819 490 819 325 q 783 772 819 670 q 680 922 747 873 q 532 971 613 971 "},"ξ":{"x_min":46,"x_max":592,"ha":596,"o":"m 459 597 l 459 542 q 386 549 412 549 q 223 483 289 549 q 158 330 158 417 q 183 244 158 280 q 258 182 208 207 q 430 111 308 158 q 557 39 523 76 q 592 -59 592 3 q 526 -209 592 -149 q 335 -270 461 -270 q 145 -227 209 -270 q 81 -115 81 -185 q 100 -50 81 -76 q 158 -24 120 -24 q 222 -80 222 -24 q 198 -133 222 -106 q 189 -150 189 -142 q 229 -202 189 -178 q 334 -226 270 -226 q 454 -182 420 -226 q 488 -88 488 -138 q 465 -29 488 -51 q 375 15 443 -7 q 112 139 178 80 q 46 294 46 198 q 113 472 46 392 q 327 586 180 552 q 155 746 155 640 q 195 840 155 796 q 372 921 235 883 l 196 921 q 73 912 132 921 l 90 1021 q 231 1009 174 1009 l 531 1009 l 531 921 q 265 749 265 895 q 314 646 265 688 q 459 597 364 605 "},"Ď":{"x_min":47,"x_max":983,"ha":1059,"o":"m 47 1002 l 554 1002 q 747 961 667 1002 q 914 789 845 909 q 983 506 983 670 q 941 262 983 370 q 845 116 910 178 q 687 23 780 54 q 501 0 618 0 l 47 0 l 47 51 l 140 51 q 189 62 175 51 q 203 98 203 74 l 203 905 q 188 938 203 926 q 147 951 173 951 l 47 951 l 47 1002 m 403 951 q 359 938 373 951 q 345 900 345 925 l 345 100 q 361 63 345 76 q 418 51 378 51 l 501 51 q 698 109 613 51 q 781 220 753 149 q 821 486 821 316 q 735 853 821 736 q 514 951 662 951 l 403 951 m 273 1346 l 315 1346 l 458 1211 l 601 1346 l 644 1346 l 484 1111 l 427 1111 l 273 1346 "},"&":{"x_min":88,"x_max":1041.75,"ha":1110,"o":"m 467 577 q 600 359 554 428 q 700 225 646 291 q 804 439 804 356 q 778 498 804 476 q 700 520 752 520 l 665 520 l 665 567 l 1035 567 l 1035 520 l 1007 520 q 947 509 971 520 q 904 475 924 498 q 857 392 885 452 q 736 186 800 269 q 895 91 827 91 q 964 124 936 91 q 1001 239 991 157 l 1041 239 q 988 46 1041 112 q 853 -19 934 -19 q 760 4 807 -19 q 645 90 712 28 q 507 4 568 28 q 377 -19 447 -19 q 170 62 252 -19 q 88 264 88 144 q 140 430 88 356 q 328 577 192 504 q 265 797 265 709 q 333 959 265 892 q 500 1027 401 1027 q 649 977 594 1027 q 704 846 704 928 q 651 703 704 768 q 467 577 599 638 m 442 629 q 574 720 538 672 q 610 836 610 768 q 577 937 610 900 q 493 975 544 975 q 409 939 442 975 q 376 844 376 903 q 442 629 376 758 m 351 524 q 211 333 211 444 q 276 154 211 248 q 439 61 342 61 q 609 129 522 61 q 493 284 544 207 q 351 524 442 361 "},"G":{"x_min":69,"x_max":1021,"ha":1058,"o":"m 765 923 l 819 1023 l 876 1023 l 876 623 l 845 623 q 727 873 795 796 q 529 972 641 972 q 376 922 444 972 q 272 774 308 873 q 236 495 236 675 q 272 223 236 321 q 372 78 308 124 q 521 32 436 32 q 701 98 638 32 q 765 269 765 164 l 765 364 q 748 398 765 386 q 692 411 731 411 l 609 411 l 609 458 l 1021 458 l 1021 411 l 965 411 q 912 397 928 411 q 897 359 897 384 l 897 -23 l 852 -23 q 802 147 828 65 q 684 22 753 64 q 528 -19 615 -19 q 297 46 404 -19 q 130 229 191 111 q 69 497 69 347 q 130 765 69 646 q 300 954 192 884 q 517 1024 407 1024 q 636 1002 579 1024 q 765 923 693 981 "},"ΰ":{"x_min":37.671875,"x_max":684,"ha":790,"o":"m 37 583 l 37 638 l 258 638 l 258 249 q 306 66 258 104 q 416 29 355 29 q 536 77 499 29 q 574 258 574 125 l 574 517 q 549 567 574 552 q 463 583 525 583 l 463 638 l 684 638 l 684 239 q 615 37 684 95 q 422 -20 547 -20 q 212 42 276 -20 q 148 240 148 104 l 148 516 q 123 567 148 551 q 37 583 99 583 m 393 739 l 357 873 q 344 958 344 928 q 405 1026 344 1026 q 456 1007 440 1026 q 472 963 472 988 q 455 873 472 938 l 421 739 l 393 739 m 300 858 q 279 809 300 830 q 231 788 259 788 q 183 809 203 788 q 164 859 164 830 q 184 907 164 887 q 231 927 204 927 q 279 907 258 927 q 300 858 300 887 m 652 858 q 631 809 652 830 q 583 788 611 788 q 535 809 555 788 q 516 859 516 830 q 536 907 516 887 q 583 927 556 927 q 631 907 611 927 q 652 858 652 887 "},"`":{"x_min":86,"x_max":359.15625,"ha":453,"o":"m 359 758 l 343 741 l 159 878 q 86 968 86 933 q 102 1005 86 988 q 141 1023 119 1023 q 208 979 178 1023 l 359 758 "},"╔":{"x_min":298,"x_max":979.578125,"ha":964,"o":"m 414 -421 l 298 -421 l 298 609 l 979 609 l 979 490 l 414 490 l 414 -421 m 667 233 l 667 -421 l 551 -421 l 551 352 l 979 352 l 979 233 l 667 233 "},"ŏ":{"x_min":46,"x_max":635,"ha":681,"o":"m 338 654 q 549 561 464 654 q 635 317 635 468 q 596 139 635 213 q 487 23 558 66 q 335 -19 416 -19 q 130 74 214 -19 q 46 317 46 168 q 130 560 46 466 q 338 654 214 654 m 338 605 q 216 537 264 605 q 168 319 168 468 q 215 98 168 168 q 338 29 263 29 q 464 98 416 29 q 512 327 512 168 q 465 540 512 474 q 338 605 417 605 m 138 1002 l 180 1002 q 234 936 197 958 q 337 915 271 915 q 448 939 405 915 q 498 1002 480 958 l 541 1002 q 508 885 535 931 q 435 813 480 839 q 337 787 390 787 q 205 841 259 787 q 138 1002 151 895 "},"ý":{"x_min":29,"x_max":717,"ha":732,"o":"m 31 635 l 329 635 l 329 589 l 301 589 q 248 578 262 589 q 234 548 234 568 q 237 530 234 539 l 411 148 l 540 467 q 554 533 554 501 q 534 573 554 559 q 458 587 515 587 l 458 635 l 717 635 l 717 589 q 615 520 641 581 l 385 -26 q 267 -217 326 -164 q 139 -270 207 -270 q 59 -242 89 -270 q 29 -173 29 -214 q 47 -123 29 -143 q 94 -103 66 -103 q 136 -120 119 -103 q 154 -161 154 -137 q 151 -181 154 -168 q 148 -196 148 -191 q 169 -213 148 -213 q 218 -196 191 -213 q 270 -144 246 -180 q 353 13 294 -108 l 118 530 q 86 571 105 557 q 31 589 67 584 l 31 635 m 298 741 l 281 758 l 395 924 q 460 1008 441 993 q 498 1023 479 1023 q 537 1006 520 1023 q 554 969 554 990 q 506 899 554 935 l 298 741 "},"º":{"x_min":9,"x_max":400,"ha":409,"o":"m 203 1023 q 344 965 288 1023 q 400 817 400 907 q 343 667 400 724 q 201 611 287 611 q 64 668 119 611 q 9 817 9 726 q 64 965 9 907 q 203 1023 120 1023 m 203 986 q 132 945 160 986 q 105 818 105 905 q 132 689 105 730 q 203 648 160 648 q 276 689 248 648 q 304 822 304 730 q 276 947 304 908 q 203 986 248 986 "},"╝":{"x_min":-15.578125,"x_max":666,"ha":964,"o":"m 550 1263 l 666 1263 l 666 233 l -15 233 l -15 352 l 550 352 l 550 1263 m 297 609 l 297 1263 l 413 1263 l 413 490 l -15 490 l -15 609 l 297 609 "},"∞":{"x_min":35,"x_max":934,"ha":970,"o":"m 433 453 q 532 599 479 558 q 679 640 586 640 q 860 561 786 640 q 934 357 934 482 q 862 153 934 233 q 702 73 790 73 q 579 122 636 73 q 478 267 542 155 q 385 146 435 183 q 263 109 334 109 q 101 178 167 109 q 35 359 35 248 q 96 539 35 471 q 239 608 157 608 q 340 577 296 608 q 433 453 384 547 m 497 315 q 595 173 547 209 q 704 137 644 137 q 841 196 786 137 q 896 357 896 256 q 838 522 896 457 q 708 587 780 587 q 628 563 662 587 q 566 488 594 540 q 497 315 550 457 m 414 400 q 340 510 382 475 q 237 546 298 546 q 119 495 166 546 q 72 360 72 444 q 118 215 72 269 q 224 162 165 162 q 336 219 287 162 q 414 400 367 257 "},"ź":{"x_min":65,"x_max":596,"ha":654,"o":"m 92 635 l 594 635 l 594 594 l 202 51 l 393 51 q 498 93 459 51 q 558 248 537 135 l 596 248 l 596 0 l 65 0 l 65 46 l 455 586 l 290 586 q 212 572 238 586 q 168 524 187 557 q 133 408 149 490 l 92 408 l 92 635 m 250 741 l 234 758 l 348 924 q 413 1008 394 993 q 451 1023 432 1023 q 490 1006 473 1023 q 507 969 507 990 q 459 899 507 935 l 250 741 "},"я":{"x_min":31.953125,"x_max":753,"ha":786,"o":"m 31 147 l 79 147 l 83 125 q 121 60 94 60 q 163 115 144 60 l 187 185 q 246 271 209 249 q 329 302 283 294 q 173 361 224 315 q 123 470 123 407 q 184 586 123 537 q 374 635 245 635 l 753 635 l 753 584 l 687 584 q 630 527 630 584 l 630 95 q 678 51 630 51 l 750 51 l 750 0 l 398 0 l 398 51 l 466 51 q 518 108 518 51 l 518 288 l 430 288 q 307 171 342 288 l 283 92 q 240 13 266 36 q 164 -10 215 -10 q 81 16 119 -10 q 31 147 43 43 m 518 339 l 518 525 q 469 584 518 584 l 412 584 q 275 548 306 584 q 245 460 245 512 q 263 390 245 418 q 313 350 282 361 q 421 339 344 339 l 518 339 "},"Ё":{"x_min":89,"x_max":907.21875,"ha":983,"o":"m 89 1002 l 877 1002 l 877 663 l 842 663 q 758 887 815 823 q 608 951 700 951 l 415 951 q 379 938 391 951 q 368 898 368 925 l 368 542 l 452 542 q 563 591 521 542 q 606 743 606 640 l 654 743 l 654 279 l 606 279 q 562 444 606 394 q 445 494 519 494 l 368 494 l 368 95 q 382 62 368 74 q 429 51 396 51 l 582 51 q 868 373 830 51 l 907 373 l 907 0 l 89 0 l 89 51 l 156 51 q 211 64 195 51 q 227 105 227 78 l 227 898 q 213 938 227 925 q 169 951 199 951 l 89 951 l 89 1002 m 363 1263 q 412 1243 392 1263 q 432 1194 432 1223 q 411 1144 432 1165 q 363 1124 391 1124 q 315 1145 335 1124 q 296 1195 296 1166 q 315 1243 296 1223 q 363 1263 335 1263 m 619 1261 q 667 1240 647 1261 q 688 1191 688 1220 q 667 1141 688 1162 q 619 1121 647 1121 q 570 1141 590 1121 q 550 1191 550 1162 q 570 1240 550 1220 q 619 1261 590 1261 "},"█":{"x_min":-15,"x_max":979,"ha":964,"o":"m -15 -421 l -15 1263 l 979 1263 l 979 -421 l -15 -421 "},"ń":{"x_min":45,"x_max":804,"ha":832,"o":"m 45 641 l 251 641 q 266 508 266 588 q 369 612 312 577 q 497 647 425 647 q 601 622 559 647 q 668 543 643 597 q 694 423 694 490 l 694 114 q 709 65 694 80 q 760 51 724 51 l 804 51 l 804 0 l 476 0 l 476 51 l 507 51 q 568 65 551 51 q 586 107 586 79 l 586 379 q 559 511 586 468 q 446 572 521 572 q 320 510 370 572 q 270 349 270 448 l 270 114 q 285 65 270 80 q 337 51 301 51 l 381 51 l 381 0 l 51 0 l 51 51 l 93 51 q 143 64 126 51 q 160 98 160 78 l 160 508 q 138 570 160 549 q 76 591 117 591 l 45 591 l 45 641 m 331 741 l 314 758 l 428 924 q 494 1008 475 993 q 532 1023 512 1023 q 570 1007 553 1023 q 587 969 587 990 q 539 899 587 935 l 331 741 "},"Г":{"x_min":64,"x_max":830.15625,"ha":844,"o":"m 64 1002 l 830 1002 l 830 656 l 790 656 q 692 900 759 849 q 524 951 626 951 l 384 951 q 341 906 341 951 l 341 112 q 357 63 341 76 q 412 51 374 51 l 515 51 l 515 0 l 64 0 l 64 51 l 143 51 q 200 104 200 51 l 200 900 q 139 951 200 951 l 64 951 l 64 1002 "},"Ь":{"x_min":64,"x_max":893,"ha":926,"o":"m 64 0 l 64 51 l 117 51 q 176 60 160 51 q 195 82 191 69 q 200 136 200 95 l 200 886 q 189 938 200 925 q 143 951 178 951 l 64 951 l 64 1002 l 517 1002 l 517 951 l 404 951 q 353 933 365 951 q 341 876 341 916 l 341 565 l 540 565 q 799 490 706 565 q 893 279 893 416 q 807 78 893 156 q 554 0 722 0 l 64 0 m 341 514 l 341 126 q 355 68 341 85 q 414 51 370 51 l 497 51 q 695 109 649 51 q 741 280 741 167 q 684 458 741 402 q 501 514 627 514 l 341 514 "},"¤":{"x_min":84.078125,"x_max":741.59375,"ha":825,"o":"m 84 729 l 143 791 l 230 703 q 317 750 271 734 q 411 766 362 766 q 595 703 509 766 l 681 791 l 741 729 l 655 641 q 717 452 717 552 q 655 269 717 350 l 741 182 l 681 121 l 595 208 q 505 160 552 176 q 410 145 459 145 q 230 208 311 145 l 143 121 l 84 182 l 170 269 q 110 460 110 366 q 170 641 110 554 l 84 729 m 413 679 q 258 613 322 679 q 194 455 194 548 q 258 297 194 362 q 413 232 322 232 q 568 297 504 232 q 633 455 633 362 q 568 613 633 548 q 413 679 503 679 "},"Ĝ":{"x_min":69,"x_max":1021,"ha":1058,"o":"m 765 923 l 819 1023 l 876 1023 l 876 623 l 845 623 q 727 873 795 796 q 529 972 641 972 q 376 922 444 972 q 272 774 308 873 q 236 495 236 675 q 272 223 236 321 q 372 78 308 124 q 521 32 436 32 q 701 98 638 32 q 765 269 765 164 l 765 364 q 748 398 765 386 q 692 411 731 411 l 609 411 l 609 458 l 1021 458 l 1021 411 l 965 411 q 912 397 928 411 q 897 359 897 384 l 897 -23 l 852 -23 q 802 147 828 65 q 684 22 753 64 q 528 -19 615 -19 q 297 46 404 -19 q 130 229 191 111 q 69 497 69 347 q 130 765 69 646 q 300 954 192 884 q 517 1024 407 1024 q 636 1002 579 1024 q 765 923 693 981 m 517 1347 l 571 1347 l 731 1113 l 688 1113 l 543 1248 l 401 1113 l 359 1113 l 517 1347 "},"p":{"x_min":41,"x_max":718,"ha":782,"o":"m 241 640 q 257 509 257 575 q 355 615 304 584 q 465 647 405 647 q 587 606 529 647 q 681 489 645 566 q 718 315 718 412 q 628 62 718 160 q 452 -19 555 -19 q 346 11 393 -19 q 262 102 299 41 l 262 -154 q 276 -196 262 -184 q 326 -212 294 -212 l 373 -212 l 373 -261 l 41 -261 l 41 -212 l 86 -212 q 134 -199 118 -212 q 150 -166 150 -187 l 150 502 q 128 568 150 549 q 41 588 106 588 l 41 640 l 241 640 m 434 585 q 312 513 362 585 q 262 307 262 442 q 310 106 262 171 q 434 41 359 41 q 542 96 504 41 q 591 310 591 169 q 547 521 591 458 q 434 585 503 585 "},"│":{"x_min":424,"x_max":540,"ha":964,"o":"m 424 -421 l 424 1263 l 540 1263 l 540 -421 l 424 -421 "},"Ю":{"x_min":64,"x_max":1391,"ha":1465,"o":"m 341 481 l 341 123 q 354 64 341 78 q 410 51 368 51 l 477 51 l 477 0 l 64 0 l 64 51 l 129 51 q 186 64 173 51 q 200 123 200 77 l 200 881 q 187 937 200 923 q 119 951 174 951 l 64 951 l 64 1002 l 477 1002 l 477 951 l 418 951 q 354 937 367 951 q 341 881 341 924 l 341 532 l 502 532 q 654 894 522 765 q 942 1023 786 1023 q 1254 878 1118 1023 q 1391 499 1391 733 q 1259 130 1391 281 q 941 -20 1127 -20 q 637 120 768 -20 q 507 481 507 260 l 341 481 m 1224 488 q 1146 858 1224 746 q 950 971 1069 971 q 754 864 836 971 q 672 502 672 758 q 754 136 672 240 q 946 32 837 32 q 1142 140 1060 32 q 1224 488 1224 248 "},"ο":{"x_min":46,"x_max":635,"ha":681,"o":"m 338 654 q 549 561 464 654 q 635 317 635 468 q 596 139 635 213 q 487 23 558 66 q 335 -19 416 -19 q 130 74 214 -19 q 46 317 46 168 q 130 560 46 466 q 338 654 214 654 m 338 605 q 216 537 264 605 q 168 319 168 468 q 215 98 168 168 q 338 29 263 29 q 464 98 416 29 q 512 327 512 168 q 465 540 512 474 q 338 605 417 605 "},"S":{"x_min":87.90625,"x_max":796,"ha":857,"o":"m 628 926 l 688 1014 l 738 1014 l 738 649 l 697 649 q 575 893 656 816 q 389 971 494 971 q 245 917 301 971 q 190 786 190 864 q 211 702 190 738 q 274 643 232 666 q 434 595 317 621 q 664 521 598 558 q 763 427 730 484 q 796 294 796 370 q 706 70 796 159 q 475 -19 617 -19 q 210 81 322 -19 l 135 -12 l 87 -12 l 87 376 l 135 376 q 260 122 163 215 q 479 30 357 30 q 639 89 577 30 q 702 233 702 148 q 678 317 702 281 q 604 378 655 353 q 406 438 554 403 q 184 526 243 477 q 101 722 101 595 q 183 938 101 854 q 395 1023 266 1023 q 513 1000 457 1023 q 628 926 569 978 "},"/":{"x_min":0,"x_max":378.15625,"ha":378,"o":"m 378 1002 l 85 0 l 0 0 l 293 1002 l 378 1002 "},"":{"x_min":53,"x_max":700.71875,"ha":721,"o":"m 519 621 l 630 621 l 563 304 q 529 176 548 231 q 608 62 543 62 q 676 150 664 62 l 700 150 q 663 25 693 69 q 592 -19 634 -19 q 512 126 531 -19 q 287 -19 442 -19 q 115 67 177 -19 q 53 307 53 153 q 122 551 53 464 q 289 639 191 639 q 479 425 421 639 l 519 621 m 466 364 q 301 600 399 600 q 211 525 245 600 q 177 300 177 450 q 209 82 177 141 q 293 24 241 24 q 374 72 337 24 q 442 262 410 120 l 466 364 "},"►":{"x_min":191,"x_max":1155.34375,"ha":1347,"o":"m 191 960 l 1155 469 l 191 -21 l 191 960 "},"Ŧ":{"x_min":49.390625,"x_max":866.609375,"ha":908,"o":"m 527 529 l 791 529 l 791 469 l 527 469 l 527 123 q 540 64 527 77 q 598 51 554 51 l 686 51 l 686 0 l 229 0 l 229 51 l 317 51 q 375 62 361 51 q 389 123 389 74 l 389 469 l 124 469 l 124 529 l 389 529 l 389 904 q 324 957 389 957 q 87 622 133 957 l 49 622 l 49 1002 l 866 1002 l 866 622 l 830 622 q 594 957 784 957 q 537 940 548 957 q 527 898 527 924 l 527 529 "},"ђ":{"x_min":29.0625,"x_max":687,"ha":831,"o":"m 156 798 l 156 871 q 74 952 156 952 l 29 952 l 29 1009 l 265 1009 l 265 798 l 573 798 l 573 740 l 265 740 l 265 524 q 491 654 364 654 q 627 598 568 654 q 687 366 687 542 l 687 172 q 669 -68 687 16 q 588 -211 651 -152 q 456 -270 525 -270 q 365 -189 365 -270 q 385 -133 365 -152 q 432 -113 405 -113 q 492 -175 478 -113 q 515 -206 499 -206 q 559 -156 541 -206 q 577 149 577 -106 l 577 311 q 570 472 577 433 q 527 543 563 510 q 444 576 492 576 q 317 513 369 576 q 265 366 265 451 l 265 113 q 325 51 265 51 l 378 51 l 378 0 l 49 0 l 49 51 l 86 51 q 156 113 156 51 l 156 740 l 35 740 l 35 798 l 156 798 "},"y":{"x_min":29,"x_max":717,"ha":732,"o":"m 31 635 l 329 635 l 329 589 l 301 589 q 248 578 262 589 q 234 548 234 568 q 237 530 234 539 l 411 148 l 540 467 q 554 533 554 501 q 534 573 554 559 q 458 587 515 587 l 458 635 l 717 635 l 717 589 q 615 520 641 581 l 385 -26 q 267 -217 326 -164 q 139 -270 207 -270 q 59 -242 89 -270 q 29 -173 29 -214 q 47 -123 29 -143 q 94 -103 66 -103 q 136 -120 119 -103 q 154 -161 154 -137 q 151 -181 154 -168 q 148 -196 148 -191 q 169 -213 148 -213 q 218 -196 191 -213 q 270 -144 246 -180 q 353 13 294 -108 l 118 530 q 86 571 105 557 q 31 589 67 584 l 31 635 "},"Π":{"x_min":64,"x_max":1070,"ha":1134,"o":"m 64 1002 l 1070 1002 l 1070 951 l 997 951 q 946 935 959 951 q 934 857 934 919 l 934 137 q 938 80 934 92 q 960 59 942 67 q 1004 51 979 51 l 1070 51 l 1070 0 l 655 0 l 655 51 l 726 51 q 781 69 769 51 q 793 142 793 87 l 793 945 l 341 945 l 341 137 q 344 80 341 90 q 363 60 348 70 q 406 51 378 51 l 483 51 l 483 0 l 64 0 l 64 51 l 144 51 q 180 61 170 51 q 195 80 190 72 q 200 142 200 89 l 200 865 q 189 935 200 919 q 134 951 178 951 l 64 951 l 64 1002 "},"‗":{"x_min":-8,"x_max":689,"ha":681,"o":"m -8 -85 l 689 -85 l 689 -155 l -8 -155 l -8 -85 m -8 -222 l 689 -222 l 689 -292 l -8 -292 l -8 -222 "},"–":{"x_min":-8,"x_max":765,"ha":757,"o":"m -8 367 l 765 367 l 765 298 l -8 298 l -8 367 "},"ë":{"x_min":58,"x_max":633.984375,"ha":681,"o":"m 628 313 l 184 313 q 235 108 184 167 q 381 41 292 41 q 590 192 511 41 l 633 173 q 353 -19 536 -19 q 143 73 228 -19 q 58 309 58 165 q 142 558 58 463 q 349 654 226 654 q 505 606 439 654 q 604 470 571 559 q 628 313 628 407 m 183 361 l 452 361 q 489 377 476 361 q 503 434 503 394 q 457 560 503 508 q 349 613 411 613 q 231 550 280 613 q 183 361 183 487 m 204 928 q 253 908 233 928 q 273 859 273 888 q 252 809 273 830 q 204 789 232 789 q 156 810 176 789 q 137 860 137 831 q 156 908 137 888 q 204 928 176 928 m 460 926 q 509 905 489 926 q 529 856 529 885 q 508 806 529 827 q 460 786 488 786 q 411 806 431 786 q 391 855 391 827 q 411 905 391 885 q 460 926 431 926 "},"б":{"x_min":49,"x_max":652,"ha":698,"o":"m 599 1015 l 648 1015 q 589 894 640 942 q 424 847 539 847 q 248 828 300 847 q 160 763 197 810 q 109 647 124 716 q 94 436 94 577 q 358 654 178 654 q 562 564 473 654 q 652 315 652 475 q 561 67 652 154 q 355 -20 470 -20 q 133 91 218 -20 q 49 434 49 202 q 75 685 49 577 q 158 861 102 793 q 272 947 214 929 q 485 966 329 966 q 566 976 544 966 q 599 1015 588 986 m 529 327 q 482 538 529 470 q 355 605 435 605 q 229 530 273 605 q 185 319 185 455 q 231 101 185 174 q 355 29 276 29 q 529 327 529 29 "},"ƒ":{"x_min":34,"x_max":736,"ha":757,"o":"m 513 667 l 636 667 l 625 620 l 504 620 q 395 155 466 418 q 258 -180 324 -107 q 122 -253 192 -253 q 57 -231 80 -253 q 34 -177 34 -210 q 49 -133 34 -151 q 87 -116 65 -116 q 119 -128 106 -116 q 132 -156 132 -140 q 123 -180 132 -168 q 114 -197 114 -192 q 120 -207 114 -204 q 136 -211 125 -211 q 199 -169 169 -211 q 253 0 229 -128 q 391 620 309 305 l 269 620 l 279 669 q 366 677 346 669 q 397 701 386 685 q 436 794 412 723 q 531 984 486 940 q 638 1028 575 1028 q 710 1005 684 1028 q 736 947 736 983 q 722 908 736 923 q 691 894 709 894 q 658 906 671 894 q 646 934 646 918 q 654 959 646 945 q 661 977 661 971 q 654 990 661 986 q 634 995 647 995 q 588 975 610 995 q 555 903 567 956 q 513 667 534 812 "},"у":{"x_min":29,"x_max":717,"ha":732,"o":"m 31 635 l 329 635 l 329 589 l 301 589 q 248 578 262 589 q 234 548 234 568 q 237 530 234 539 l 411 148 l 540 467 q 554 533 554 501 q 534 573 554 559 q 458 587 515 587 l 458 635 l 717 635 l 717 589 q 615 520 641 581 l 385 -26 q 267 -217 326 -164 q 139 -270 207 -270 q 59 -242 89 -270 q 29 -173 29 -214 q 47 -123 29 -143 q 94 -103 66 -103 q 136 -120 119 -103 q 154 -161 154 -137 q 151 -181 154 -168 q 148 -196 148 -191 q 169 -213 148 -213 q 218 -196 191 -213 q 270 -144 246 -180 q 353 13 294 -108 l 118 530 q 86 571 105 557 q 31 589 67 584 l 31 635 "},"J":{"x_min":21,"x_max":716,"ha":757,"o":"m 281 1002 l 716 1002 l 716 951 l 654 951 q 601 937 617 951 q 586 898 586 924 l 586 249 q 550 113 586 173 q 445 16 514 52 q 289 -19 376 -19 q 96 51 171 -19 q 21 225 21 122 q 58 346 21 301 q 151 392 96 392 q 226 362 197 392 q 255 287 255 333 q 231 221 255 248 q 176 195 207 195 q 143 201 164 195 q 119 207 125 207 q 101 197 107 207 q 94 169 94 188 q 144 76 94 118 q 267 35 194 35 q 398 93 350 35 q 446 257 446 152 l 446 898 q 428 938 446 925 q 368 951 410 951 l 281 951 l 281 1002 "},"ŷ":{"x_min":29,"x_max":717,"ha":732,"o":"m 31 635 l 329 635 l 329 589 l 301 589 q 248 578 262 589 q 234 548 234 568 q 237 530 234 539 l 411 148 l 540 467 q 554 533 554 501 q 534 573 554 559 q 458 587 515 587 l 458 635 l 717 635 l 717 589 q 615 520 641 581 l 385 -26 q 267 -217 326 -164 q 139 -270 207 -270 q 59 -242 89 -270 q 29 -173 29 -214 q 47 -123 29 -143 q 94 -103 66 -103 q 136 -120 119 -103 q 154 -161 154 -137 q 151 -181 154 -168 q 148 -196 148 -191 q 169 -213 148 -213 q 218 -196 191 -213 q 270 -144 246 -180 q 353 13 294 -108 l 118 530 q 86 571 105 557 q 31 589 67 584 l 31 635 m 345 1014 l 399 1014 l 558 780 l 516 780 l 371 914 l 230 780 l 187 780 l 345 1014 "},"ŕ":{"x_min":34.0625,"x_max":581,"ha":604,"o":"m 34 641 l 258 641 l 258 389 q 344 581 293 516 q 469 647 395 647 q 550 615 520 647 q 581 530 581 583 q 560 464 581 488 q 509 440 540 440 q 461 460 479 440 q 443 515 443 481 q 453 557 443 538 q 463 578 463 575 q 450 589 463 589 q 389 556 423 589 q 315 431 341 511 q 275 234 275 308 l 275 98 q 291 63 275 75 q 345 51 307 51 l 425 51 l 425 0 l 38 0 l 38 51 l 99 51 q 147 63 131 51 q 163 93 163 76 l 163 498 q 143 565 163 544 q 88 587 124 587 l 34 587 l 34 641 m 250 741 l 234 758 l 347 924 q 413 1008 394 993 q 451 1023 432 1023 q 490 1007 473 1023 q 507 969 507 990 q 459 899 507 935 l 250 741 "},"☻":{"x_min":257,"x_max":1105,"ha":1362,"o":"m 681 783 q 889 727 787 783 q 1047 567 990 671 q 1105 350 1105 463 q 1048 136 1105 238 q 891 -23 992 33 q 681 -81 790 -81 q 470 -23 570 -81 q 313 136 369 33 q 257 350 257 238 q 313 567 257 463 q 472 727 370 671 q 681 783 574 783 m 518 495 q 480 479 496 495 q 464 440 464 463 q 480 401 464 417 q 518 385 496 385 q 556 401 540 385 q 572 440 572 417 q 556 479 572 463 q 518 495 540 495 m 843 495 q 804 479 820 495 q 789 440 789 463 q 805 401 789 417 q 843 385 821 385 q 881 401 865 385 q 897 440 897 417 q 881 479 897 463 q 843 495 865 495 m 485 211 q 567 113 518 147 q 680 80 615 80 q 794 113 745 80 q 876 211 843 147 l 834 235 q 680 138 782 138 q 526 235 579 138 l 485 211 "},"ώ":{"x_min":46,"x_max":816,"ha":862,"o":"m 350 653 l 350 604 q 206 520 244 604 q 169 311 169 437 q 197 105 169 181 q 285 28 226 28 q 354 79 334 28 q 374 280 374 131 l 374 345 l 486 345 l 486 280 q 510 69 486 111 q 576 28 534 28 q 663 105 634 28 q 693 311 693 182 q 667 492 693 425 q 606 581 641 559 q 511 603 571 603 l 511 654 q 735 559 654 654 q 816 293 816 464 q 750 58 816 137 q 588 -20 684 -20 q 430 72 484 -20 q 271 -20 371 -20 q 110 60 174 -20 q 46 290 46 140 q 88 504 46 425 q 195 618 131 583 q 350 653 258 653 m 415 739 l 380 873 q 366 958 366 928 q 428 1026 366 1026 q 478 1007 462 1026 q 495 963 495 988 q 477 873 495 938 l 442 739 l 415 739 "},"˘":{"x_min":21.265625,"x_max":424.6875,"ha":453,"o":"m 21 1003 l 63 1003 q 117 936 80 958 q 219 915 154 915 q 330 939 287 915 q 380 1003 363 958 l 424 1003 q 391 885 418 931 q 318 813 363 839 q 220 787 273 787 q 88 841 142 787 q 21 1003 33 896 "},"┤":{"x_min":-15.640625,"x_max":539,"ha":964,"o":"m 423 -421 l 423 362 l -15 362 l -15 481 l 423 481 l 423 1263 l 539 1263 l 539 -421 l 423 -421 "},"↑":{"x_min":101.640625,"x_max":579.359375,"ha":680,"o":"m 101 711 q 322 991 275 871 l 353 991 q 579 709 411 860 l 579 657 q 374 791 441 722 l 374 -291 l 307 -291 l 307 791 q 101 658 214 713 l 101 711 "},"D":{"x_min":47,"x_max":983,"ha":1059,"o":"m 47 1002 l 554 1002 q 747 961 667 1002 q 914 789 845 909 q 983 506 983 670 q 941 262 983 370 q 845 116 910 178 q 687 23 780 54 q 501 0 618 0 l 47 0 l 47 51 l 140 51 q 189 62 175 51 q 203 98 203 74 l 203 905 q 188 938 203 926 q 147 951 173 951 l 47 951 l 47 1002 m 403 951 q 359 938 373 951 q 345 900 345 925 l 345 100 q 361 63 345 76 q 418 51 378 51 l 501 51 q 698 109 613 51 q 781 220 753 149 q 821 486 821 316 q 735 853 821 736 q 514 951 662 951 l 403 951 "},"┼":{"x_min":-15,"x_max":979,"ha":964,"o":"m 424 362 l -15 362 l -15 481 l 424 481 l 424 1263 l 540 1263 l 540 481 l 979 481 l 979 362 l 540 362 l 540 -421 l 424 -421 l 424 362 "},"ł":{"x_min":19.75,"x_max":383,"ha":428,"o":"m 19 952 l 19 1008 l 266 1008 l 266 627 l 383 735 l 383 672 l 266 564 l 266 93 q 277 64 266 74 q 317 51 293 51 l 383 51 l 383 0 l 31 0 l 31 51 l 93 51 q 139 65 124 51 q 154 107 154 80 l 154 477 l 27 369 l 27 432 l 154 540 l 154 880 q 136 930 154 914 q 75 952 111 952 l 19 952 "},"ĺ":{"x_min":32.75,"x_max":396,"ha":428,"o":"m 279 1008 l 279 93 q 290 64 279 74 q 330 51 306 51 l 396 51 l 396 0 l 44 0 l 44 51 l 106 51 q 152 65 137 51 q 167 107 167 80 l 167 880 q 149 930 167 914 q 88 952 124 952 l 32 952 l 32 1008 l 279 1008 m 117 1075 l 101 1092 l 215 1258 q 280 1342 261 1327 q 318 1357 299 1357 q 357 1341 340 1357 q 374 1303 374 1324 q 326 1233 374 1269 l 117 1075 "},"ц":{"x_min":32,"x_max":844,"ha":845,"o":"m 32 0 l 32 51 l 97 51 q 155 107 155 51 l 155 538 q 106 584 155 584 l 35 584 l 35 635 l 376 635 l 376 584 l 323 584 q 267 527 267 584 l 267 51 l 579 51 l 579 538 q 530 584 579 584 l 475 584 l 475 635 l 813 635 l 813 584 l 747 584 q 691 527 691 584 l 691 110 q 706 59 691 67 q 751 51 721 51 l 844 51 l 844 -192 l 794 -192 q 745 -26 775 -52 q 623 0 715 0 l 32 0 "},"Л":{"x_min":23.640625,"x_max":1045,"ha":1109,"o":"m 203 1003 l 1045 1003 l 1045 951 l 987 951 q 921 938 935 951 q 908 882 908 925 l 908 123 q 921 64 908 78 q 977 51 935 51 l 1045 51 l 1045 0 l 611 0 l 611 51 l 696 51 q 754 62 740 51 q 768 123 768 74 l 768 947 l 561 947 q 452 917 480 947 q 418 812 425 888 l 418 633 q 344 98 418 211 q 159 -14 270 -14 q 62 19 101 -14 q 23 117 23 53 q 49 193 23 165 q 117 221 74 221 q 199 157 180 221 q 213 123 206 131 q 236 115 220 115 q 332 302 298 115 q 366 686 366 490 q 346 908 366 864 q 258 951 327 951 l 203 951 l 203 1003 "},"├":{"x_min":424,"x_max":979.296875,"ha":964,"o":"m 424 -421 l 424 1263 l 540 1263 l 540 481 l 979 481 l 979 362 l 540 362 l 540 -421 l 424 -421 "},"$":{"x_min":97,"x_max":688,"ha":756,"o":"m 359 1022 l 415 1022 l 415 957 q 522 934 457 957 q 623 865 587 912 q 659 760 659 818 q 637 690 659 715 q 581 665 615 665 q 532 685 552 665 q 512 736 512 705 q 536 798 512 767 q 560 842 560 832 q 529 880 560 861 q 415 908 484 908 l 415 543 q 624 413 560 490 q 688 234 688 335 q 617 55 688 125 q 415 -14 546 -14 l 415 -188 l 359 -188 l 359 -19 q 218 9 280 -19 q 126 82 156 37 q 97 182 97 128 q 120 259 97 230 q 178 289 144 289 q 231 266 210 289 q 253 205 253 243 q 222 140 253 166 q 187 97 187 108 q 223 56 187 77 q 359 28 274 28 l 359 414 q 107 702 107 496 q 175 881 107 809 q 359 953 243 953 l 359 1022 m 359 564 l 359 907 q 228 860 275 907 q 181 747 181 813 q 217 647 181 690 q 359 564 253 605 m 415 391 l 415 28 q 556 84 506 36 q 606 200 606 132 q 566 306 606 261 q 415 391 527 351 "},"w":{"x_min":35,"x_max":1025,"ha":1058,"o":"m 35 635 l 308 635 l 308 588 l 272 588 q 234 579 245 588 q 223 556 223 571 q 229 525 223 541 l 369 166 l 491 507 q 446 575 466 561 q 379 588 427 588 l 379 635 l 679 635 l 679 588 l 653 588 q 606 579 619 588 q 594 553 594 569 q 599 525 594 541 l 740 166 l 853 485 q 865 540 865 517 q 847 574 865 562 q 782 587 830 587 l 782 635 l 1025 635 l 1025 588 q 956 559 979 580 q 917 494 933 538 l 736 -19 l 697 -19 l 522 426 l 365 -19 l 327 -19 l 104 542 q 80 578 93 568 q 35 587 66 587 l 35 635 "},"о":{"x_min":46,"x_max":635,"ha":681,"o":"m 338 654 q 549 561 464 654 q 635 317 635 468 q 596 139 635 213 q 487 23 558 66 q 335 -19 416 -19 q 130 74 214 -19 q 46 317 46 168 q 130 560 46 466 q 338 654 214 654 m 338 605 q 216 537 264 605 q 168 319 168 468 q 215 98 168 168 q 338 29 263 29 q 464 98 416 29 q 512 327 512 168 q 465 540 512 474 q 338 605 417 605 "},"Д":{"x_min":5,"x_max":1016,"ha":1080,"o":"m 1016 51 l 1016 -249 l 963 -249 q 940 -116 963 -172 q 845 -30 918 -60 q 698 0 772 0 l 306 0 q 124 -51 196 0 q 52 -246 52 -102 l 5 -246 l 5 58 q 144 86 95 58 q 247 214 194 114 q 319 448 300 313 q 338 762 338 583 q 305 914 338 872 q 210 956 273 956 l 197 956 l 197 1003 l 1016 1003 l 1016 952 l 943 952 q 892 935 905 952 q 880 858 880 919 l 880 137 q 958 51 880 51 l 1016 51 m 740 56 l 740 952 l 565 952 q 449 928 482 952 q 406 860 415 905 q 398 674 398 816 q 327 236 398 378 q 165 56 256 93 l 740 56 "},"Ç":{"x_min":94,"x_max":916.296875,"ha":982,"o":"m 786 924 l 832 1021 l 883 1021 l 883 618 l 847 618 q 736 868 803 788 q 540 970 654 970 q 338 857 416 970 q 261 476 261 745 q 350 132 261 250 q 562 32 425 32 q 763 110 682 32 q 869 347 844 188 l 916 347 q 796 71 895 167 q 545 -25 696 -25 q 319 38 422 -25 q 155 219 216 101 q 94 478 94 337 q 157 760 94 628 q 319 957 220 891 q 533 1024 418 1024 q 656 1001 596 1024 q 786 924 716 979 m 543 -26 q 624 -62 596 -35 q 652 -126 652 -90 q 605 -222 652 -183 q 470 -262 558 -262 q 402 -262 445 -262 l 402 -208 l 433 -208 q 518 -187 491 -208 q 546 -135 546 -166 q 479 -79 546 -90 l 493 7 l 547 7 l 543 -26 "},"Ŝ":{"x_min":87.90625,"x_max":796,"ha":857,"o":"m 628 926 l 688 1014 l 738 1014 l 738 649 l 697 649 q 575 893 656 816 q 389 971 494 971 q 245 917 301 971 q 190 786 190 864 q 211 702 190 738 q 274 643 232 666 q 434 595 317 621 q 664 521 598 558 q 763 427 730 484 q 796 294 796 370 q 706 70 796 159 q 475 -19 617 -19 q 210 81 322 -19 l 135 -12 l 87 -12 l 87 376 l 135 376 q 260 122 163 215 q 479 30 357 30 q 639 89 577 30 q 702 233 702 148 q 678 317 702 281 q 604 378 655 353 q 406 438 554 403 q 184 526 243 477 q 101 722 101 595 q 183 938 101 854 q 395 1023 266 1023 q 513 1000 457 1023 q 628 926 569 978 m 414 1346 l 468 1346 l 627 1113 l 584 1113 l 440 1247 l 298 1113 l 255 1113 l 414 1346 "},"C":{"x_min":94,"x_max":916.296875,"ha":982,"o":"m 786 924 l 832 1021 l 883 1021 l 883 618 l 847 618 q 736 868 803 788 q 540 970 654 970 q 338 857 416 970 q 261 476 261 744 q 350 132 261 250 q 562 32 425 32 q 763 110 682 32 q 869 346 844 188 l 916 346 q 796 71 895 167 q 545 -25 696 -25 q 319 38 422 -25 q 155 219 216 101 q 94 478 94 337 q 157 760 94 628 q 319 957 220 891 q 532 1024 418 1024 q 656 1001 596 1024 q 786 924 716 979 "},"Ĵ":{"x_min":21,"x_max":716,"ha":757,"o":"m 281 1002 l 716 1002 l 716 951 l 654 951 q 601 937 617 951 q 586 898 586 924 l 586 249 q 550 113 586 173 q 445 16 514 52 q 289 -19 376 -19 q 96 51 171 -19 q 21 225 21 122 q 58 346 21 301 q 151 392 96 392 q 226 362 197 392 q 255 287 255 333 q 231 221 255 248 q 176 195 207 195 q 143 201 164 195 q 119 207 125 207 q 101 197 107 207 q 94 169 94 188 q 144 76 94 118 q 267 35 194 35 q 398 93 350 35 q 446 257 446 152 l 446 898 q 428 938 446 925 q 368 951 410 951 l 281 951 l 281 1002 m 457 1347 l 511 1347 l 670 1113 l 628 1113 l 483 1247 l 341 1113 l 298 1113 l 457 1347 "},"È":{"x_min":89,"x_max":907.21875,"ha":983,"o":"m 89 1002 l 877 1002 l 877 663 l 842 663 q 757 887 815 823 q 608 951 700 951 l 415 951 q 379 938 391 951 q 368 898 368 925 l 368 542 l 452 542 q 563 591 521 542 q 606 743 606 640 l 654 743 l 654 279 l 606 279 q 562 444 606 394 q 445 494 519 494 l 368 494 l 368 95 q 382 62 368 74 q 429 51 396 51 l 582 51 q 868 373 830 51 l 907 373 l 907 0 l 89 0 l 89 51 l 156 51 q 211 64 195 51 q 227 105 227 78 l 227 898 q 213 938 227 925 q 169 951 199 951 l 89 951 l 89 1002 m 624 1092 l 608 1075 l 424 1212 q 351 1302 351 1267 q 367 1339 351 1322 q 406 1357 384 1357 q 473 1313 443 1357 l 624 1092 "},"ﬁ":{"x_min":45,"x_max":792,"ha":832,"o":"m 267 640 l 511 640 q 599 640 527 640 l 687 640 l 687 98 q 698 66 687 76 q 748 51 719 51 l 792 51 l 792 0 l 465 0 l 465 51 l 493 51 q 556 63 539 51 q 574 98 574 75 l 574 512 q 556 554 574 540 q 502 576 533 576 l 267 576 l 267 104 q 283 63 267 76 q 341 51 299 51 l 379 51 l 379 0 l 45 0 l 45 51 l 79 51 q 140 64 124 51 q 157 104 157 77 l 157 576 l 54 576 l 54 635 l 159 635 q 199 855 159 774 q 313 981 239 935 q 476 1027 387 1027 q 622 982 567 1027 q 678 880 678 938 q 660 824 678 845 q 613 804 642 804 q 565 822 583 804 q 547 868 547 840 q 561 914 547 893 q 570 932 570 927 q 546 963 570 948 q 476 978 522 978 q 321 896 375 978 q 267 694 267 815 l 267 640 "},"X":{"x_min":25,"x_max":951,"ha":958,"o":"m 25 1002 l 428 1002 l 428 951 l 381 951 q 313 942 330 951 q 296 920 296 933 q 315 881 296 910 l 503 599 l 648 823 q 676 893 676 866 q 652 935 676 919 q 562 951 628 951 l 562 1003 l 919 1003 l 919 951 q 826 931 860 951 q 742 845 780 904 l 540 545 l 850 87 q 883 59 863 67 q 951 51 903 51 l 951 0 l 562 0 l 562 51 l 616 51 q 670 60 655 51 q 685 85 685 70 q 665 130 685 101 l 464 429 l 315 210 q 280 120 280 159 q 300 68 280 86 q 361 51 321 51 l 400 51 l 400 0 l 25 0 l 25 51 q 129 81 83 51 q 220 178 175 111 l 428 484 l 159 877 q 103 937 127 924 q 25 951 78 951 l 25 1002 "},"ô":{"x_min":46,"x_max":635,"ha":681,"o":"m 338 654 q 549 561 464 654 q 635 317 635 468 q 596 139 635 213 q 487 23 558 66 q 335 -19 416 -19 q 130 74 214 -19 q 46 317 46 168 q 130 560 46 466 q 338 654 214 654 m 338 605 q 216 537 264 605 q 168 319 168 468 q 215 98 168 168 q 338 29 263 29 q 464 98 416 29 q 512 327 512 168 q 465 540 512 474 q 338 605 417 605 m 333 1013 l 387 1013 l 546 780 l 504 780 l 359 914 l 217 780 l 174 780 l 333 1013 "},"Ė":{"x_min":89,"x_max":907.21875,"ha":983,"o":"m 89 1002 l 877 1002 l 877 663 l 842 663 q 757 887 815 823 q 608 951 700 951 l 415 951 q 379 938 391 951 q 368 898 368 925 l 368 542 l 452 542 q 563 591 521 542 q 606 743 606 640 l 654 743 l 654 279 l 606 279 q 562 444 606 394 q 445 494 519 494 l 368 494 l 368 95 q 382 62 368 74 q 429 51 396 51 l 582 51 q 868 373 830 51 l 907 373 l 907 0 l 89 0 l 89 51 l 156 51 q 211 64 195 51 q 227 105 227 78 l 227 898 q 213 938 227 925 q 169 951 199 951 l 89 951 l 89 1002 m 501 1261 q 550 1241 530 1261 q 570 1192 570 1221 q 549 1142 570 1163 q 501 1122 529 1122 q 453 1142 473 1122 q 434 1192 434 1163 q 453 1241 434 1221 q 501 1261 473 1261 "},"г":{"x_min":32,"x_max":606.59375,"ha":623,"o":"m 383 51 l 383 0 l 32 0 l 32 51 l 96 51 q 151 107 151 51 l 151 538 q 102 584 151 584 l 32 584 l 32 635 l 606 635 l 606 389 l 565 389 q 494 549 530 515 q 370 584 457 584 l 320 584 q 263 527 263 584 l 263 96 q 311 51 263 51 l 383 51 "},"Ŀ":{"x_min":43,"x_max":873.34375,"ha":909,"o":"m 43 1002 l 498 1002 l 498 951 l 389 951 q 351 937 363 951 q 339 893 339 923 l 339 103 q 354 62 339 74 q 417 51 370 51 l 555 51 q 736 125 665 51 q 838 385 806 200 l 873 385 l 873 0 l 43 0 l 43 51 l 123 51 q 181 66 164 51 q 198 118 198 82 l 198 900 q 184 938 198 925 q 142 951 170 951 l 43 951 l 43 1002 m 595 577 q 644 556 624 577 q 664 508 664 536 q 643 458 664 479 q 595 437 623 437 q 547 458 567 437 q 528 508 528 479 q 547 556 528 536 q 595 577 567 577 "},"х":{"x_min":32,"x_max":710,"ha":731,"o":"m 32 635 l 332 635 l 332 586 q 259 563 259 586 q 270 535 259 552 l 378 389 l 483 523 q 495 551 495 538 q 415 588 495 580 l 415 635 l 678 635 l 678 588 q 531 507 582 572 l 410 351 l 602 97 q 644 61 622 72 q 710 51 667 51 l 710 0 l 392 0 l 392 51 l 415 51 q 466 58 449 51 q 477 72 477 63 q 464 97 477 79 l 339 265 l 239 133 q 218 89 218 106 q 232 63 218 72 q 302 51 253 51 l 302 0 l 32 0 l 32 51 q 107 72 81 55 q 186 144 151 99 l 310 304 l 127 546 q 32 586 97 586 l 32 635 "},"╚":{"x_min":298,"x_max":979.359375,"ha":964,"o":"m 414 1263 l 414 352 l 978 352 l 978 233 l 298 233 l 298 1263 l 414 1263 m 667 609 l 979 609 l 979 490 l 551 490 l 551 1263 l 667 1263 l 667 609 "},"ŋ":{"x_min":45,"x_max":694,"ha":796,"o":"m 694 424 l 694 47 q 623 -187 694 -104 q 464 -270 552 -270 q 372 -189 372 -270 q 392 -133 372 -152 q 440 -113 413 -113 q 501 -175 486 -113 q 524 -206 508 -206 q 570 -146 555 -206 q 585 -23 585 -86 l 585 198 l 586 198 l 586 379 q 446 572 586 572 q 320 510 370 572 q 270 349 270 448 l 270 114 q 288 62 270 74 q 337 51 307 51 l 381 51 l 381 0 l 51 0 l 51 51 l 93 51 q 160 98 160 51 l 160 508 q 76 591 160 591 l 45 591 l 45 641 l 251 641 q 267 508 267 591 q 497 647 353 647 q 645 584 597 647 q 694 424 694 522 "},"Ч":{"x_min":3,"x_max":983,"ha":1047,"o":"m 707 551 l 707 881 q 693 937 707 923 q 625 951 680 951 l 563 951 l 563 1002 l 983 1002 l 983 951 l 925 951 q 860 937 873 951 q 847 881 847 924 l 847 123 q 860 64 847 78 q 916 51 874 51 l 983 51 l 983 0 l 544 0 l 544 51 l 635 51 q 693 64 680 51 q 707 123 707 77 l 707 501 q 446 419 582 419 q 241 485 322 419 q 160 678 160 551 l 160 881 q 146 937 160 923 q 79 951 133 951 l 3 951 l 3 1002 l 442 1002 l 442 951 l 378 951 q 312 938 326 951 q 299 882 299 925 l 299 669 q 312 566 299 601 q 368 504 326 531 q 470 478 410 478 q 707 551 597 478 "},"∟":{"x_min":241,"x_max":1091.90625,"ha":1332,"o":"m 241 867 l 307 867 l 307 68 l 1091 68 l 1091 0 l 241 0 l 241 867 "},"ü":{"x_min":37.671875,"x_max":797,"ha":832,"o":"m 258 641 l 258 226 q 296 107 258 149 q 395 65 334 65 q 521 126 469 65 q 574 280 574 187 l 574 518 q 550 569 574 551 q 463 587 527 587 l 463 641 l 682 641 l 682 126 q 701 70 682 90 q 757 51 721 51 l 797 51 l 797 3 l 587 3 l 574 126 q 461 24 517 58 q 347 -9 404 -9 q 205 48 262 -9 q 148 241 148 105 l 148 517 q 119 573 148 554 q 37 587 99 587 l 37 641 l 258 641 m 282 928 q 331 908 311 928 q 351 859 351 888 q 330 809 351 830 q 282 789 310 789 q 234 810 254 789 q 215 860 215 831 q 234 908 215 888 q 282 928 254 928 m 538 926 q 587 905 567 926 q 607 856 607 885 q 586 806 607 827 q 538 786 566 786 q 489 806 509 786 q 469 855 469 827 q 489 905 469 885 q 538 926 509 926 "},"ь":{"x_min":32,"x_max":671,"ha":717,"o":"m 266 369 l 367 369 q 602 312 533 369 q 671 177 671 255 q 610 50 671 100 q 417 0 549 0 l 32 0 l 32 51 l 97 51 q 154 107 154 51 l 154 538 q 104 584 154 584 l 32 584 l 32 635 l 394 635 l 394 584 l 322 584 q 266 527 266 584 l 266 369 m 266 318 l 266 103 q 314 51 266 51 l 378 51 q 515 83 480 51 q 550 178 550 115 q 520 278 550 238 q 370 318 490 318 l 266 318 "},"Ÿ":{"x_min":-8,"x_max":972,"ha":959,"o":"m -8 1002 l 423 1002 l 423 951 l 375 951 q 297 941 315 951 q 279 915 279 932 q 288 883 279 897 l 538 488 l 718 825 q 730 873 730 847 q 707 930 730 909 q 643 951 685 951 l 597 951 l 597 1002 l 972 1002 l 972 951 q 870 927 907 951 q 798 841 833 904 l 572 418 l 572 101 q 585 65 572 76 q 643 51 605 51 l 727 51 l 727 0 l 276 0 l 276 51 l 365 51 q 417 64 401 51 q 433 101 433 77 l 433 409 l 127 894 q 81 937 107 925 q -8 950 54 950 l -8 1002 m 364 1263 q 413 1243 393 1263 q 433 1194 433 1223 q 412 1144 433 1165 q 364 1124 392 1124 q 316 1145 336 1124 q 297 1195 297 1166 q 316 1243 297 1223 q 364 1263 336 1263 m 620 1261 q 669 1240 649 1261 q 689 1191 689 1220 q 668 1141 689 1162 q 620 1121 648 1121 q 571 1141 591 1121 q 551 1191 551 1162 q 571 1240 551 1220 q 620 1261 591 1261 "},"в":{"x_min":31.578125,"x_max":668,"ha":730,"o":"m 31 0 l 31 50 l 97 50 q 154 108 154 50 l 154 540 q 106 584 154 584 l 35 584 l 35 635 l 385 635 q 529 622 481 635 q 609 570 576 609 q 642 476 642 532 q 588 368 642 408 q 468 329 535 329 q 668 163 668 299 q 408 0 668 0 l 31 0 m 266 350 l 357 350 q 520 464 520 350 q 372 583 520 583 l 333 583 q 266 526 266 583 l 266 350 m 266 299 l 266 107 q 278 62 266 76 q 322 49 291 49 l 376 49 q 510 81 480 49 q 540 167 540 114 q 378 299 540 299 l 266 299 "},"Η":{"x_min":64,"x_max":1070,"ha":1134,"o":"m 64 1002 l 483 1002 l 483 951 l 406 951 q 353 936 365 951 q 341 865 341 921 l 341 557 l 791 557 l 791 865 q 779 937 791 923 q 724 951 767 951 l 653 951 l 653 1002 l 1070 1002 l 1070 951 l 993 951 q 953 943 965 951 q 934 917 942 936 q 931 857 931 906 l 931 137 q 939 74 931 84 q 1002 51 956 51 l 1070 51 l 1070 0 l 653 0 l 653 51 l 724 51 q 782 74 767 51 q 791 142 791 87 l 791 491 l 341 491 l 341 137 q 348 73 341 84 q 406 51 365 51 l 483 51 l 483 0 l 64 0 l 64 51 l 144 51 q 178 59 165 51 q 196 84 190 68 q 200 142 200 95 l 200 865 q 187 936 200 921 q 134 951 175 951 l 64 951 l 64 1002 "},"С":{"x_min":94,"x_max":916.296875,"ha":981,"o":"m 786 924 l 832 1021 l 883 1021 l 883 618 l 847 618 q 736 868 803 788 q 540 970 654 970 q 338 857 416 970 q 261 476 261 744 q 350 132 261 250 q 562 32 425 32 q 763 110 682 32 q 869 346 844 188 l 916 346 q 796 71 895 167 q 545 -25 696 -25 q 319 38 422 -25 q 155 219 216 101 q 94 478 94 337 q 157 760 94 628 q 319 957 220 891 q 532 1024 418 1024 q 656 1001 596 1024 q 786 924 716 979 "},"ß":{"x_min":41,"x_max":726,"ha":781,"o":"m 521 597 q 673 504 621 575 q 726 320 726 434 q 689 149 726 230 q 600 29 653 68 q 491 -9 548 -9 q 399 24 434 -9 q 365 108 365 58 q 383 166 365 143 q 428 188 402 188 q 470 169 452 188 q 488 125 488 151 q 467 78 488 101 q 456 57 456 66 q 463 43 456 49 q 485 38 470 38 q 563 95 530 38 q 597 293 597 152 q 551 513 597 454 q 401 573 505 573 l 401 617 q 480 631 435 617 q 542 674 525 646 q 567 786 567 715 q 530 931 567 887 q 425 976 494 976 q 310 931 345 976 q 265 771 265 875 l 265 120 q 279 67 265 83 q 326 51 293 51 l 326 0 l 41 0 l 41 51 l 85 51 q 136 62 121 51 q 151 95 151 74 l 151 747 q 221 954 151 879 q 414 1029 291 1029 q 608 963 537 1029 q 680 805 680 898 q 644 691 680 742 q 521 597 608 640 "},"└":{"x_min":424,"x_max":979.296875,"ha":964,"o":"m 424 362 l 424 1263 l 540 1263 l 540 481 l 979 481 l 979 362 l 424 362 "},"њ":{"x_min":32,"x_max":1108,"ha":1154,"o":"m 467 0 l 467 51 l 532 51 q 589 107 589 51 l 589 304 l 266 304 l 266 96 q 314 51 266 51 l 387 51 l 387 0 l 32 0 l 32 51 l 97 51 q 154 107 154 51 l 154 538 q 106 584 154 584 l 35 584 l 35 635 l 387 635 l 387 584 l 322 584 q 266 527 266 584 l 266 361 l 589 361 l 589 538 q 540 584 589 584 l 470 584 l 470 635 l 822 635 l 822 584 l 757 584 q 714 569 727 584 q 702 543 702 555 l 702 361 l 803 361 q 1043 303 978 361 q 1108 173 1108 246 q 1048 51 1108 102 q 855 0 988 0 l 467 0 m 702 310 l 702 103 q 750 51 702 51 l 815 51 q 951 82 916 51 q 986 176 986 113 q 944 282 986 255 q 807 310 902 310 l 702 310 "},"Ű":{"x_min":36,"x_max":1084,"ha":1110,"o":"m 36 1002 l 490 1002 l 490 951 l 398 951 q 347 938 362 951 q 333 901 333 926 l 333 336 q 348 201 333 247 q 430 94 370 134 q 588 55 491 55 q 792 125 722 55 q 863 315 863 196 l 863 775 q 854 867 863 836 q 830 916 846 899 q 791 943 815 934 q 712 951 767 951 l 712 1002 l 1084 1002 l 1084 951 l 1057 951 q 963 917 994 951 q 933 817 933 882 l 933 325 q 842 77 933 164 q 572 -19 740 -19 q 342 23 425 -19 q 220 145 258 65 q 192 296 192 205 l 192 901 q 176 938 192 924 q 129 951 160 951 l 36 951 l 36 1002 m 679 1075 l 663 1092 l 775 1258 q 841 1342 822 1327 q 879 1357 860 1357 q 918 1340 901 1357 q 935 1302 935 1324 q 887 1233 935 1268 l 679 1075 m 410 1075 l 394 1092 l 507 1258 q 573 1342 554 1327 q 611 1357 592 1357 q 650 1340 633 1357 q 667 1303 667 1324 q 619 1233 667 1269 l 410 1075 "},"♣":{"x_min":36.90625,"x_max":856.421875,"ha":894,"o":"m 730 0 l 166 0 l 172 23 q 317 69 281 46 q 405 172 371 104 q 439 314 439 239 q 439 346 439 325 q 340 223 398 262 q 221 185 282 185 q 90 240 144 185 q 36 375 36 295 q 86 507 36 453 q 196 562 135 562 q 306 526 238 562 q 270 597 278 572 q 262 649 262 621 q 314 780 262 727 q 446 834 367 834 q 577 780 523 834 q 631 652 631 727 q 585 526 631 592 q 652 556 640 553 q 692 562 670 562 q 807 508 758 562 q 856 377 856 455 q 802 241 856 296 q 672 186 749 186 q 583 206 621 186 q 511 261 544 226 q 455 346 488 286 q 484 175 455 238 q 576 71 514 113 q 725 23 618 44 l 730 0 "},"c":{"x_min":41,"x_max":563.640625,"ha":604,"o":"m 520 188 l 563 175 q 335 -19 511 -19 q 123 68 205 -19 q 41 300 41 155 q 131 561 41 468 q 343 654 221 654 q 495 602 435 654 q 555 488 555 551 q 532 425 555 450 q 480 401 510 401 q 429 422 450 401 q 409 472 409 443 q 431 529 409 502 q 442 550 442 542 q 416 588 442 569 q 345 607 390 607 q 223 546 264 607 q 163 315 163 459 q 216 109 163 179 q 351 39 269 39 q 520 188 465 39 "},"¶":{"x_min":71.015625,"x_max":738,"ha":824,"o":"m 738 1002 l 738 976 l 710 976 q 658 965 673 976 q 637 933 643 955 q 631 834 631 912 l 631 -260 l 581 -260 l 581 963 l 453 963 l 453 -260 l 402 -260 l 402 474 q 206 503 270 474 q 106 594 142 533 q 71 736 71 655 q 103 869 71 818 q 211 969 146 937 q 381 1002 277 1002 l 738 1002 "},"Ή":{"x_min":0,"x_max":1184,"ha":1248,"o":"m 178 1002 l 597 1002 l 597 951 l 520 951 q 467 936 479 951 q 455 865 455 921 l 455 557 l 905 557 l 905 865 q 893 937 905 923 q 838 951 881 951 l 767 951 l 767 1002 l 1184 1002 l 1184 951 l 1107 951 q 1067 943 1079 951 q 1048 917 1056 936 q 1045 857 1045 906 l 1045 137 q 1053 74 1045 84 q 1116 51 1070 51 l 1184 51 l 1184 0 l 767 0 l 767 51 l 838 51 q 896 74 881 51 q 905 142 905 87 l 905 491 l 455 491 l 455 137 q 462 73 455 84 q 520 51 479 51 l 597 51 l 597 0 l 178 0 l 178 51 l 258 51 q 292 59 279 51 q 310 84 304 68 q 314 142 314 95 l 314 865 q 301 936 314 921 q 248 951 289 951 l 178 951 l 178 1002 m 49 739 l 14 873 q 0 958 0 928 q 62 1026 0 1026 q 112 1007 96 1026 q 129 963 129 988 q 111 873 129 938 l 77 739 l 49 739 "},"":{"x_min":46,"x_max":758,"ha":788,"o":"m 758 621 l 758 522 l 466 522 q 598 406 536 486 q 660 235 660 326 q 569 50 660 120 q 374 -19 479 -19 q 143 81 240 -19 q 46 322 46 181 q 96 495 46 420 q 214 595 147 570 q 383 621 281 621 l 758 621 m 422 522 l 399 522 q 265 502 311 522 q 189 433 219 482 q 160 313 160 385 q 223 110 160 195 q 374 25 286 25 q 495 88 447 25 q 544 248 544 151 q 422 522 544 397 "},"γ":{"x_min":11.390625,"x_max":717,"ha":731,"o":"m 440 102 l 440 -146 q 457 -197 440 -185 q 506 -210 475 -210 l 550 -210 l 550 -261 l 222 -261 l 222 -210 l 253 -210 q 332 -153 332 -210 l 332 66 l 131 500 q 88 565 110 546 q 11 584 65 584 l 11 635 l 209 635 q 239 530 214 587 l 411 148 l 538 465 q 554 528 554 505 q 534 569 554 555 q 458 583 514 583 l 458 635 l 717 635 l 717 584 q 650 564 673 584 q 600 480 627 545 l 440 102 "},"­":{"x_min":91,"x_max":360,"ha":453,"o":"m 91 586 l 360 586 l 360 483 l 91 483 l 91 586 "},":":{"x_min":110,"x_max":272,"ha":378,"o":"m 190 865 q 247 841 224 865 q 271 783 271 817 q 248 724 271 747 q 191 701 225 701 q 133 725 157 701 q 110 783 110 749 q 133 840 110 816 q 190 865 157 865 m 191 359 q 248 334 224 359 q 272 276 272 310 q 248 216 272 240 q 191 192 224 192 q 134 216 158 192 q 110 274 110 240 q 133 334 110 310 q 191 359 157 359 "},"╓":{"x_min":298,"x_max":980.25,"ha":964,"o":"m 298 -420 l 298 481 l 980 481 l 980 362 l 667 362 l 667 -420 l 551 -420 l 551 362 l 414 362 l 414 -420 l 298 -420 "},"ś":{"x_min":81.953125,"x_max":573,"ha":630,"o":"m 119 239 q 213 76 160 121 q 345 32 267 32 q 457 64 418 32 q 496 145 496 96 q 481 195 496 174 q 442 227 467 216 q 311 257 417 237 q 170 300 209 278 q 108 362 130 323 q 86 447 86 401 q 131 574 86 517 q 297 647 191 647 q 447 594 378 647 l 491 642 l 526 642 l 526 416 l 491 416 q 412 554 462 512 q 289 597 362 597 q 189 565 225 597 q 154 488 154 533 q 187 422 154 448 q 315 379 219 394 q 459 347 425 360 q 543 284 513 327 q 573 181 573 242 q 508 39 573 97 q 343 -19 443 -19 q 171 43 251 -19 l 123 -14 l 81 -14 l 81 239 l 119 239 m 214 741 l 197 758 l 311 924 q 377 1008 358 993 q 415 1023 396 1023 q 454 1006 437 1023 q 471 969 471 990 q 423 899 471 935 l 214 741 "}," ":{"x_min":0,"x_max":0,"ha":391},"У":{"x_min":29,"x_max":995,"ha":1005,"o":"m 480 159 l 152 869 q 49 952 114 952 l 29 952 l 29 1003 l 437 1003 l 437 952 l 388 952 q 317 942 333 952 q 302 907 302 932 q 323 843 302 892 l 558 310 l 746 754 q 776 857 776 821 q 740 928 776 904 q 666 952 704 952 l 618 952 l 618 1003 l 995 1003 l 995 952 q 839 820 893 939 l 544 165 q 450 26 500 67 q 319 -14 401 -14 q 181 31 236 -14 q 126 146 126 76 q 149 216 126 190 q 209 242 173 242 q 268 219 245 242 q 291 165 291 197 q 282 116 291 150 q 279 97 279 105 q 299 60 279 76 q 347 45 318 45 q 480 159 422 45 "},"¾":{"x_min":124,"x_max":997,"ha":1134,"o":"m 368 720 q 446 677 420 707 q 472 599 472 646 q 424 502 472 541 q 296 463 377 463 q 169 498 214 463 q 124 579 124 533 q 139 621 124 605 q 177 638 154 638 q 209 625 197 638 q 222 590 222 612 q 208 555 222 574 q 200 532 200 540 q 216 508 200 518 q 279 494 240 494 q 353 520 329 494 q 378 604 378 546 q 360 681 378 656 q 307 704 340 704 l 278 704 l 252 704 q 223 708 230 704 q 216 721 216 713 q 223 734 216 729 q 246 739 230 739 l 277 739 q 311 735 300 735 q 360 757 343 735 q 377 827 377 778 q 353 903 377 879 q 285 928 330 928 q 234 916 251 928 q 216 888 216 904 q 224 866 216 880 q 232 840 232 851 q 219 812 232 823 q 186 801 207 801 q 153 814 166 801 q 141 852 141 828 q 184 925 141 892 q 301 958 228 958 q 416 921 373 958 q 459 831 459 884 q 436 768 459 796 q 368 720 413 740 m 887 940 l 944 940 l 309 0 l 252 0 l 887 940 m 884 484 l 907 484 l 907 150 l 997 150 l 997 110 l 907 110 l 907 71 q 916 41 907 50 q 948 32 926 32 l 982 32 l 982 0 l 749 0 l 749 32 l 785 32 q 818 41 807 32 q 829 66 829 50 l 829 110 l 606 110 l 606 150 l 884 484 m 829 370 l 647 150 l 829 150 l 829 370 "},"Ί":{"x_min":0,"x_max":631,"ha":682,"o":"m 178 1002 l 631 1002 l 631 951 l 553 951 q 488 937 502 951 q 475 881 475 924 l 475 123 q 486 66 475 78 q 544 51 502 51 l 631 51 l 631 0 l 178 0 l 178 51 l 264 51 q 322 64 309 51 q 336 123 336 78 l 336 881 q 324 935 336 925 q 255 951 305 951 l 178 951 l 178 1002 m 49 739 l 14 873 q 0 958 0 928 q 62 1026 0 1026 q 112 1007 96 1026 q 129 963 129 988 q 111 873 129 938 l 77 739 l 49 739 "},"ŉ":{"x_min":-13.59375,"x_max":969,"ha":997,"o":"m 210 641 l 417 641 q 432 508 432 588 q 534 612 477 577 q 663 647 591 647 q 766 622 724 647 q 833 543 808 597 q 859 423 859 490 l 859 114 q 874 65 859 80 q 925 51 889 51 l 969 51 l 969 0 l 641 0 l 641 51 l 672 51 q 733 65 716 51 q 751 107 751 79 l 751 379 q 724 511 751 468 q 611 572 687 572 q 486 510 536 572 q 436 349 436 448 l 436 114 q 451 65 436 80 q 502 51 467 51 l 546 51 l 546 0 l 216 0 l 216 51 l 259 51 q 309 64 292 51 q 326 98 326 78 l 326 508 q 304 570 326 549 q 242 591 282 591 l 210 591 l 210 641 m 7 638 l -13 669 q 83 764 52 717 q 114 845 114 811 q 110 862 114 856 q 98 868 106 868 l 92 867 q 64 863 76 863 q 14 885 35 863 q -6 938 -6 907 q 15 997 -6 972 q 67 1023 38 1023 q 142 986 109 1023 q 175 892 175 949 q 136 761 175 823 q 7 638 98 699 "},"┴":{"x_min":-15,"x_max":979,"ha":964,"o":"m 979 362 l -15 362 l -15 481 l 424 481 l 424 1263 l 540 1263 l 540 481 l 979 481 l 979 362 "},"Ģ":{"x_min":69,"x_max":1021,"ha":1058,"o":"m 765 923 l 819 1024 l 876 1024 l 876 624 l 845 624 q 727 873 795 796 q 529 972 641 972 q 376 922 444 972 q 272 774 308 873 q 236 495 236 675 q 272 223 236 321 q 372 78 308 124 q 521 32 436 32 q 701 98 638 32 q 765 270 765 164 l 765 364 q 748 398 765 386 q 692 411 731 411 l 609 411 l 609 458 l 1021 458 l 1021 411 l 965 411 q 912 397 928 411 q 897 359 897 384 l 897 -23 l 852 -23 q 802 147 828 65 q 684 22 753 64 q 528 -19 615 -19 q 298 46 404 -19 q 130 229 191 111 q 69 497 69 347 q 130 765 69 646 q 300 954 192 884 q 517 1024 407 1024 q 636 1002 579 1024 q 765 923 693 981 m 514 -26 q 595 -62 567 -34 q 623 -126 623 -90 q 576 -222 623 -183 q 441 -262 529 -262 q 372 -262 415 -262 l 372 -208 l 403 -208 q 489 -187 462 -208 q 517 -134 517 -166 q 449 -78 517 -90 l 464 7 l 518 7 l 514 -26 "},"m":{"x_min":67,"x_max":1164,"ha":1211,"o":"m 83 640 l 260 640 q 277 511 277 575 q 381 616 330 585 q 492 647 431 647 q 598 612 556 647 q 663 499 640 577 q 761 610 707 573 q 880 647 816 647 q 1008 595 965 647 q 1063 420 1063 527 l 1063 105 q 1077 66 1063 76 q 1132 51 1095 51 l 1164 51 l 1164 0 l 851 0 l 851 51 l 881 51 q 937 64 921 51 q 953 105 953 78 l 953 420 q 919 529 953 490 q 830 568 885 568 q 754 545 788 568 q 701 480 720 522 q 673 378 673 420 l 673 105 q 687 64 673 77 q 732 51 702 51 l 775 51 l 775 0 l 458 0 l 458 51 l 493 51 q 544 64 527 51 q 561 99 561 78 l 561 392 q 528 526 561 484 q 442 569 496 569 q 333 520 371 569 q 280 358 280 451 l 280 105 q 292 65 280 76 q 348 51 310 51 l 381 51 l 381 0 l 67 0 l 67 51 l 114 51 q 154 64 140 51 q 169 99 169 78 l 169 515 q 151 566 169 549 q 83 588 134 583 l 83 640 "},"Е":{"x_min":89,"x_max":907.21875,"ha":983,"o":"m 89 1002 l 877 1002 l 877 663 l 842 663 q 757 887 815 823 q 608 951 700 951 l 415 951 q 379 938 391 951 q 368 898 368 925 l 368 542 l 452 542 q 563 591 521 542 q 606 743 606 640 l 654 743 l 654 279 l 606 279 q 562 444 606 394 q 445 494 519 494 l 368 494 l 368 95 q 382 62 368 74 q 429 51 396 51 l 582 51 q 868 373 830 51 l 907 373 l 907 0 l 89 0 l 89 51 l 156 51 q 211 64 195 51 q 227 105 227 78 l 227 898 q 213 938 227 925 q 169 951 199 951 l 89 951 l 89 1002 "},"ž":{"x_min":65,"x_max":596,"ha":654,"o":"m 92 635 l 594 635 l 594 594 l 202 51 l 393 51 q 498 93 459 51 q 558 248 537 135 l 596 248 l 596 0 l 65 0 l 65 46 l 455 586 l 290 586 q 212 572 238 586 q 168 524 187 557 q 133 408 149 490 l 92 408 l 92 635 m 163 1014 l 205 1014 l 348 878 l 492 1014 l 534 1014 l 374 778 l 318 778 l 163 1014 "},"╞":{"x_min":424,"x_max":979.296875,"ha":964,"o":"m 424 -421 l 424 1263 l 540 1263 l 540 609 l 979 609 l 979 490 l 540 490 l 540 352 l 979 352 l 979 233 l 540 233 l 540 -421 l 424 -421 "},"á":{"x_min":67,"x_max":725.9375,"ha":757,"o":"m 702 69 l 725 31 q 618 -19 677 -19 q 542 6 573 -19 q 488 94 511 31 q 377 3 425 26 q 262 -19 329 -19 q 116 23 166 -19 q 67 130 67 65 q 181 295 67 229 q 484 382 295 360 l 484 478 q 444 566 484 529 q 341 603 403 603 q 241 578 283 603 q 211 542 211 560 q 227 511 211 532 q 247 462 247 483 q 227 413 247 432 q 177 394 208 394 q 121 417 143 394 q 99 475 99 440 q 173 598 99 542 q 367 654 247 654 q 536 605 478 654 q 595 485 595 555 l 595 138 q 609 70 595 92 q 647 48 624 48 q 702 69 673 48 m 484 337 q 245 260 316 313 q 193 145 193 219 q 220 63 193 92 q 291 34 247 34 q 427 94 369 34 q 484 246 484 155 l 484 337 m 298 741 l 281 758 l 394 924 q 460 1008 441 993 q 498 1023 479 1023 q 536 1006 519 1023 q 553 968 553 989 q 506 899 553 934 l 298 741 "},"×":{"x_min":75.765625,"x_max":749.671875,"ha":825,"o":"m 138 813 l 412 533 l 687 813 l 749 749 l 475 469 l 749 189 l 686 126 l 412 405 l 138 126 l 76 190 l 350 469 l 75 749 l 138 813 "},"":{"x_min":74,"x_max":990,"ha":1063,"o":"m 607 130 q 730 24 607 24 l 730 0 l 333 0 l 333 24 q 460 129 449 24 q 179 225 284 129 q 74 459 74 322 q 185 699 74 608 q 456 790 297 790 q 333 895 456 895 l 333 919 l 730 919 l 730 895 q 603 790 611 895 q 884 693 778 790 q 990 460 990 597 q 878 219 990 309 q 607 130 767 130 m 460 751 q 325 714 383 751 q 242 616 267 677 q 218 448 218 556 q 460 171 218 171 l 460 751 m 603 747 l 603 167 q 770 230 695 167 q 846 470 846 293 q 603 747 846 747 "},"п":{"x_min":32,"x_max":805,"ha":837,"o":"m 805 635 l 805 584 l 739 584 q 683 527 683 584 l 683 96 q 731 51 683 51 l 805 51 l 805 0 l 449 0 l 449 51 l 514 51 q 571 107 571 51 l 571 584 l 266 584 l 266 96 q 314 51 266 51 l 386 51 l 386 0 l 32 0 l 32 51 l 97 51 q 154 107 154 51 l 154 538 q 106 584 154 584 l 35 584 l 35 635 l 805 635 "},"Ǻ":{"x_min":-10,"x_max":990,"ha":983,"o":"m 475 1023 l 520 1023 l 872 106 q 959 51 893 51 l 990 51 l 990 0 l 598 0 l 598 51 l 629 51 q 715 64 690 51 q 733 93 733 74 q 728 118 733 105 l 646 331 l 258 331 l 212 208 q 195 131 195 160 q 225 74 195 98 q 312 51 255 51 l 346 51 l 346 0 l -10 0 l -10 51 q 80 76 47 51 q 141 173 113 101 l 475 1023 m 456 830 l 279 384 l 627 384 l 456 830 m 491 1373 q 587 1331 546 1373 q 628 1232 628 1290 q 587 1131 628 1173 q 489 1090 546 1090 q 391 1131 432 1090 q 351 1230 351 1172 q 391 1331 351 1289 q 491 1373 432 1373 m 491 1317 q 430 1291 455 1317 q 406 1230 406 1266 q 430 1170 406 1195 q 490 1146 455 1146 q 549 1171 524 1146 q 574 1231 574 1196 q 549 1292 574 1267 q 491 1317 525 1317 m 401 1385 l 385 1402 l 498 1568 q 564 1652 545 1637 q 602 1667 583 1667 q 640 1651 623 1667 q 657 1613 657 1634 q 609 1543 657 1579 l 401 1385 "},"K":{"x_min":55,"x_max":1079,"ha":1058,"o":"m 55 1002 l 504 1002 l 504 951 l 408 951 q 361 934 378 951 q 345 893 345 918 l 345 428 l 715 831 q 747 897 747 866 q 725 936 747 921 q 653 951 703 951 l 626 951 l 626 1002 l 1029 1002 l 1029 951 l 997 951 q 908 926 957 951 q 819 858 860 902 l 591 617 l 917 126 q 973 68 944 85 q 1043 51 1003 51 l 1079 51 l 1079 0 l 636 0 l 636 51 l 686 51 q 759 60 741 51 q 778 84 778 69 q 770 109 778 97 l 498 516 l 345 347 l 345 101 q 358 67 345 78 q 408 51 379 51 l 504 51 l 504 0 l 55 0 l 55 51 l 141 51 q 191 64 175 51 q 207 101 207 78 l 207 900 q 189 937 207 924 q 128 951 171 951 l 55 951 l 55 1002 "},"7":{"x_min":103,"x_max":705,"ha":757,"o":"m 150 956 q 291 940 215 940 l 705 940 l 705 908 q 566 632 614 745 q 494 416 518 520 q 470 177 470 313 q 463 37 470 64 q 438 -4 457 10 q 388 -18 419 -18 q 334 4 353 -18 q 315 76 315 27 q 330 187 315 120 q 400 384 345 253 q 525 661 472 560 l 617 834 l 257 834 q 197 805 217 834 q 150 635 178 776 l 103 635 l 150 956 "},"¨":{"x_min":31,"x_max":423,"ha":454,"o":"m 98 928 q 147 908 127 928 q 167 859 167 888 q 146 809 167 830 q 98 789 126 789 q 50 810 70 789 q 31 860 31 831 q 50 908 31 888 q 98 928 70 928 m 354 926 q 403 905 383 926 q 423 856 423 885 q 402 806 423 827 q 354 786 382 786 q 305 806 325 786 q 285 855 285 827 q 305 905 285 885 q 354 926 325 926 "},"Y":{"x_min":-8,"x_max":972,"ha":959,"o":"m -8 1002 l 423 1002 l 423 951 l 375 951 q 297 941 315 951 q 279 915 279 932 q 288 883 279 897 l 538 488 l 718 825 q 730 873 730 847 q 707 930 730 909 q 642 951 684 951 l 597 951 l 597 1002 l 972 1002 l 972 951 q 870 927 907 951 q 798 841 833 904 l 572 418 l 572 101 q 585 65 572 76 q 642 51 604 51 l 727 51 l 727 0 l 276 0 l 276 51 l 365 51 q 417 64 401 51 q 433 101 433 77 l 433 409 l 127 894 q 81 937 107 925 q -8 950 54 950 l -8 1002 "},"E":{"x_min":89,"x_max":907.21875,"ha":983,"o":"m 89 1002 l 877 1002 l 877 663 l 842 663 q 757 887 815 823 q 608 951 700 951 l 415 951 q 379 938 391 951 q 368 898 368 925 l 368 542 l 452 542 q 563 591 521 542 q 606 743 606 640 l 654 743 l 654 279 l 606 279 q 562 444 606 394 q 445 494 519 494 l 368 494 l 368 95 q 382 62 368 74 q 429 51 396 51 l 582 51 q 868 373 830 51 l 907 373 l 907 0 l 89 0 l 89 51 l 156 51 q 211 64 195 51 q 227 105 227 78 l 227 898 q 213 938 227 925 q 169 951 199 951 l 89 951 l 89 1002 "},"Ô":{"x_min":74,"x_max":986,"ha":1059,"o":"m 521 1023 q 754 956 645 1023 q 924 769 863 889 q 986 500 986 650 q 924 230 986 350 q 754 42 862 109 q 525 -25 646 -25 q 303 41 407 -25 q 136 230 199 107 q 74 502 74 353 q 134 769 74 650 q 301 955 195 888 q 521 1023 407 1023 m 532 971 q 321 861 402 971 q 241 503 241 751 q 323 131 241 234 q 528 29 406 29 q 677 75 613 29 q 780 224 742 122 q 819 490 819 325 q 783 772 819 670 q 680 922 747 873 q 532 971 613 971 m 502 1348 l 556 1348 l 715 1115 l 673 1115 l 528 1249 l 386 1115 l 343 1115 l 502 1348 "},"Є":{"x_min":84,"x_max":906.96875,"ha":962,"o":"m 251 480 q 268 278 251 344 q 324 156 286 212 q 418 69 362 101 q 549 37 475 37 q 755 115 674 37 q 859 346 837 194 l 906 346 q 785 74 887 168 q 535 -20 683 -20 q 213 123 343 -20 q 84 478 84 266 q 210 860 84 698 q 522 1023 337 1023 q 777 923 652 1023 l 823 1021 l 873 1021 l 873 618 l 837 618 q 528 969 751 969 q 328 852 405 969 q 251 531 251 735 l 639 531 l 639 480 l 251 480 "},"Ï":{"x_min":51,"x_max":504,"ha":555,"o":"m 51 1002 l 504 1002 l 504 951 l 426 951 q 360 937 374 951 q 347 881 347 924 l 347 123 q 359 66 347 78 q 417 51 375 51 l 504 51 l 504 0 l 51 0 l 51 51 l 136 51 q 194 64 181 51 q 208 123 208 78 l 208 881 q 196 935 208 925 q 128 951 177 951 l 51 951 l 51 1002 m 149 1263 q 198 1243 178 1263 q 218 1194 218 1223 q 197 1144 218 1165 q 149 1124 177 1124 q 101 1145 121 1124 q 82 1195 82 1166 q 101 1243 82 1223 q 149 1263 121 1263 m 405 1261 q 454 1240 434 1261 q 474 1191 474 1220 q 453 1141 474 1162 q 405 1121 433 1121 q 356 1141 376 1121 q 336 1191 336 1162 q 356 1240 336 1220 q 405 1261 376 1261 "},"ġ":{"x_min":66,"x_max":721,"ha":731,"o":"m 522 599 q 644 668 588 668 q 699 646 677 668 q 721 593 721 624 q 706 551 721 568 q 671 535 691 535 q 620 582 633 535 q 602 603 615 603 q 553 572 579 603 q 592 503 582 532 q 603 439 603 473 q 575 336 603 381 q 482 256 547 291 q 358 222 417 222 l 285 222 q 183 205 209 222 q 158 156 158 188 q 178 116 158 130 q 256 102 199 102 l 420 102 q 600 59 545 102 q 655 -55 655 17 q 592 -191 655 -136 q 332 -270 505 -270 q 120 -216 189 -270 q 66 -122 66 -174 q 100 -48 66 -82 q 218 0 135 -15 q 119 48 152 16 q 86 126 86 80 q 112 202 86 170 q 206 257 139 234 q 121 334 149 289 q 93 437 93 379 q 164 591 93 529 q 348 654 235 654 q 438 640 395 654 q 522 599 481 627 m 347 611 q 249 566 288 611 q 211 442 211 522 q 249 310 211 357 q 347 263 288 263 q 445 308 407 263 q 484 439 484 354 q 445 564 484 518 q 347 611 406 611 m 386 0 q 212 -34 264 0 q 160 -118 160 -69 q 199 -190 160 -164 q 346 -226 250 -226 q 519 -187 461 -226 q 577 -101 577 -148 q 559 -49 577 -73 q 501 -12 541 -25 q 386 0 462 0 m 376 928 q 425 908 405 928 q 445 859 445 888 q 424 809 445 830 q 376 789 404 789 q 328 809 348 789 q 309 859 309 830 q 328 908 309 888 q 376 928 348 928 "},"έ":{"x_min":62,"x_max":583.296875,"ha":636,"o":"m 235 325 q 76 471 76 351 q 146 605 76 556 q 326 654 216 654 q 506 601 443 654 q 570 482 570 548 q 548 419 570 445 q 494 393 526 393 q 443 414 464 393 q 422 464 422 435 q 439 515 422 493 q 455 546 455 538 q 419 588 455 571 q 337 605 382 605 q 230 569 269 605 q 192 473 192 532 q 222 389 192 425 q 355 353 252 353 l 355 302 q 184 159 184 302 q 231 63 184 94 q 351 32 279 32 q 546 153 473 32 l 583 132 q 323 -20 510 -20 q 134 25 206 -20 q 62 155 62 71 q 235 325 62 281 m 314 739 l 279 873 q 265 958 265 928 q 327 1026 265 1026 q 377 1007 361 1026 q 394 963 394 988 q 376 873 394 938 l 342 739 l 314 739 "},"ϋ":{"x_min":37.671875,"x_max":684,"ha":790,"o":"m 37 583 l 37 638 l 258 638 l 258 249 q 306 66 258 104 q 416 29 355 29 q 536 77 499 29 q 574 258 574 125 l 574 517 q 549 567 574 552 q 463 583 525 583 l 463 638 l 684 638 l 684 239 q 615 37 684 95 q 422 -20 547 -20 q 212 42 276 -20 q 148 240 148 104 l 148 516 q 123 567 148 551 q 37 583 99 583 m 288 927 q 337 907 317 927 q 357 858 357 887 q 336 808 357 829 q 288 788 316 788 q 240 809 260 788 q 221 859 221 830 q 240 907 221 887 q 288 927 260 927 m 544 926 q 592 905 572 926 q 613 856 613 885 q 592 806 613 827 q 544 786 572 786 q 495 806 515 786 q 475 855 475 827 q 495 905 475 885 q 544 926 515 926 "},"й":{"x_min":32,"x_max":812,"ha":844,"o":"m 580 526 l 580 553 q 531 584 574 584 l 461 584 l 461 635 l 812 635 l 812 584 l 748 584 q 692 526 692 584 l 692 96 q 740 51 692 51 l 811 51 l 811 0 l 457 0 l 457 51 l 523 51 q 580 107 580 51 l 580 455 l 266 120 l 266 96 q 314 51 266 51 l 387 51 l 387 0 l 32 0 l 32 51 l 97 51 q 154 107 154 51 l 154 538 q 106 584 154 584 l 35 584 l 35 635 l 387 635 l 387 584 l 323 584 q 266 526 266 584 l 266 189 l 580 526 m 516 822 q 511 843 516 829 q 507 871 507 860 q 564 928 507 928 q 606 911 588 928 q 625 862 625 894 q 567 770 625 805 q 423 735 510 735 q 275 768 332 735 q 218 861 218 802 q 236 911 218 894 q 280 928 254 928 q 322 911 306 928 q 338 869 338 895 q 332 841 338 858 q 326 819 326 824 q 357 793 326 802 q 420 785 388 785 q 516 822 516 785 "},"b":{"x_min":11,"x_max":691,"ha":758,"o":"m 238 1008 l 238 542 q 325 627 277 599 q 429 655 373 655 q 615 567 539 655 q 691 336 691 480 q 609 86 691 181 q 407 -9 528 -9 q 303 14 350 -9 q 208 91 257 37 q 134 -9 170 30 l 108 0 q 127 163 127 78 l 127 880 q 104 933 127 914 q 39 952 81 952 l 11 952 l 11 1008 l 238 1008 m 405 595 q 283 528 330 595 q 236 307 236 461 q 282 98 236 161 q 404 35 329 35 q 513 97 471 35 q 565 321 565 176 q 519 530 565 465 q 405 595 473 595 "},"ύ":{"x_min":37.671875,"x_max":684,"ha":790,"o":"m 37 583 l 37 638 l 258 638 l 258 249 q 306 66 258 104 q 416 29 355 29 q 536 77 499 29 q 574 258 574 125 l 574 517 q 549 567 574 552 q 463 583 525 583 l 463 638 l 684 638 l 684 239 q 615 37 684 95 q 422 -20 547 -20 q 212 42 276 -20 q 148 240 148 104 l 148 516 q 123 567 148 551 q 37 583 99 583 m 414 739 l 379 873 q 365 958 365 928 q 427 1026 365 1026 q 477 1007 461 1026 q 494 963 494 988 q 476 873 494 938 l 441 739 l 414 739 "},"ﬂ":{"x_min":47,"x_max":795,"ha":832,"o":"m 553 1013 q 687 1027 619 1019 l 687 108 q 701 66 687 82 q 738 51 716 51 l 795 51 l 795 0 l 469 0 l 469 51 l 517 51 q 565 64 552 51 q 579 108 579 77 l 579 573 l 269 573 l 269 108 q 284 64 269 78 q 330 51 299 51 l 377 51 l 377 0 l 47 0 l 47 51 l 99 51 q 144 64 129 51 q 159 99 159 77 l 159 573 l 55 573 l 55 635 l 159 635 l 159 677 q 200 856 159 773 q 309 982 241 938 q 450 1027 376 1027 q 495 1023 470 1027 q 553 1013 521 1020 m 579 802 q 537 857 537 816 q 549 897 537 876 q 558 922 558 914 q 531 961 558 943 q 456 979 503 979 q 324 912 380 979 q 269 730 269 845 l 269 635 l 579 635 l 579 802 "},"ф":{"x_min":46,"x_max":983,"ha":1029,"o":"m 457 102 q 288 -20 396 -20 q 119 72 192 -20 q 46 314 46 164 q 114 548 46 451 q 285 646 183 646 q 457 509 394 646 l 457 878 q 434 931 457 912 q 377 950 412 950 l 321 950 l 321 1006 l 566 1006 l 566 503 q 743 646 633 646 q 913 549 844 646 q 983 314 983 452 q 909 72 983 164 q 739 -20 836 -20 q 570 102 631 -20 l 570 -152 q 633 -210 570 -210 l 680 -210 l 680 -261 l 348 -261 l 348 -210 l 393 -210 q 457 -163 457 -210 l 457 102 m 459 311 q 416 504 459 424 q 301 585 373 585 q 170 307 170 585 q 205 107 170 172 q 296 42 241 42 q 411 107 363 42 q 459 311 459 172 m 859 307 q 726 585 859 585 q 613 505 656 585 q 570 311 570 425 q 618 107 570 172 q 732 42 666 42 q 825 111 791 42 q 859 307 859 180 "},"Ŋ":{"x_min":64,"x_max":1007,"ha":1081,"o":"m 341 775 l 341 123 q 354 64 341 77 q 412 51 368 51 l 432 51 l 432 0 l 64 0 l 64 51 l 129 51 q 186 64 173 51 q 200 123 200 77 l 200 878 q 186 937 200 924 q 129 951 172 951 l 64 951 l 64 1002 l 341 1002 l 341 876 q 604 1023 436 1023 q 890 879 773 1023 q 1007 500 1007 736 q 913 131 1007 282 q 665 -20 819 -20 q 504 48 560 -20 q 448 221 448 116 q 485 352 448 306 q 578 398 523 398 q 653 368 624 398 q 682 292 682 338 q 657 226 682 252 q 604 200 633 200 q 559 210 592 200 q 545 213 550 213 q 521 172 521 213 q 557 73 521 113 q 651 34 593 34 q 788 127 737 34 q 840 478 840 220 q 772 855 840 744 q 584 967 705 967 q 341 775 418 967 "},"╩":{"x_min":-15,"x_max":979,"ha":964,"o":"m 414 490 l -15 490 l -15 609 l 298 609 l 298 1263 l 414 1263 l 414 490 m 979 490 l 551 490 l 551 1263 l 667 1263 l 667 609 l 979 609 l 979 490 m 979 233 l -15 233 l -15 352 l 979 352 l 979 233 "},"Ũ":{"x_min":36,"x_max":1084,"ha":1110,"o":"m 36 1002 l 490 1002 l 490 951 l 398 951 q 347 938 362 951 q 333 901 333 926 l 333 336 q 348 201 333 247 q 430 94 370 134 q 588 55 491 55 q 792 125 722 55 q 863 315 863 196 l 863 775 q 854 867 863 836 q 830 916 846 899 q 791 943 815 934 q 712 951 767 951 l 712 1002 l 1084 1002 l 1084 951 l 1057 951 q 963 917 994 951 q 933 817 933 882 l 933 325 q 842 77 933 164 q 572 -19 740 -19 q 342 23 425 -19 q 220 145 258 65 q 192 296 192 205 l 192 901 q 176 938 192 924 q 129 951 160 951 l 36 951 l 36 1002 m 762 1277 l 784 1277 q 746 1163 784 1205 q 653 1122 708 1122 q 517 1157 612 1122 q 423 1182 447 1182 q 357 1122 374 1182 l 335 1122 q 467 1275 348 1275 q 593 1245 511 1275 q 697 1215 677 1215 q 762 1277 744 1215 "},"Щ":{"x_min":64,"x_max":1458,"ha":1497,"o":"m 341 63 l 677 63 l 677 884 q 664 940 677 926 q 596 954 651 954 l 553 954 l 553 1005 l 942 1005 l 942 954 l 895 954 q 831 940 844 954 q 818 884 818 927 l 818 63 l 1155 63 l 1155 884 q 1141 941 1155 928 q 1076 954 1127 954 l 1018 954 l 1018 1005 l 1432 1005 l 1432 954 l 1376 954 q 1308 939 1321 954 q 1295 884 1295 925 l 1295 137 q 1311 68 1295 86 q 1367 51 1327 51 l 1458 51 l 1458 -245 l 1407 -245 q 1138 0 1407 0 l 64 0 l 64 51 l 129 51 q 186 64 173 51 q 200 126 200 78 l 200 884 q 187 940 200 926 q 119 954 174 954 l 64 954 l 64 1005 l 477 1005 l 477 954 l 419 954 q 354 941 367 954 q 341 884 341 927 l 341 63 "},"L":{"x_min":43,"x_max":873.34375,"ha":909,"o":"m 43 1002 l 498 1002 l 498 951 l 389 951 q 351 937 363 951 q 339 893 339 923 l 339 103 q 354 62 339 74 q 417 51 370 51 l 555 51 q 736 125 665 51 q 838 385 806 200 l 873 385 l 873 0 l 43 0 l 43 51 l 123 51 q 181 66 164 51 q 198 118 198 82 l 198 900 q 184 938 198 925 q 142 951 170 951 l 43 951 l 43 1002 "},";":{"x_min":99.40625,"x_max":285,"ha":378,"o":"m 192 865 q 249 841 226 865 q 272 782 272 817 q 248 725 272 749 q 192 702 225 702 q 134 725 158 702 q 111 781 111 749 q 134 840 111 816 q 192 865 157 865 m 121 -24 l 99 7 q 227 186 227 104 q 213 203 227 203 q 197 200 207 203 q 175 197 184 197 q 124 221 146 197 q 102 280 102 245 q 125 335 102 312 q 182 359 148 359 q 255 324 225 359 q 285 232 285 289 q 121 -24 285 94 "},"ď":{"x_min":72,"x_max":878,"ha":886,"o":"m 396 1008 l 640 1008 l 640 145 q 658 72 640 94 q 715 51 677 51 l 759 51 l 759 0 l 546 0 l 530 130 q 441 26 492 61 q 327 -9 390 -9 q 146 81 221 -9 q 72 321 72 172 q 167 578 72 482 q 340 654 242 654 q 447 623 399 654 q 530 531 494 593 l 530 890 q 508 935 530 918 q 440 952 486 952 l 396 952 l 396 1008 m 358 598 q 244 537 286 598 q 202 334 202 477 q 245 116 202 179 q 356 53 288 53 q 479 123 428 53 q 531 330 531 194 q 476 533 531 459 q 358 598 428 598 m 773 799 l 763 823 q 831 901 831 853 q 819 914 831 914 q 807 913 816 914 q 791 911 797 911 q 748 926 766 911 q 731 963 731 942 q 748 999 731 983 q 796 1015 766 1015 q 855 991 832 1015 q 878 930 878 968 q 773 799 878 840 "},"Ο":{"x_min":74,"x_max":986,"ha":1059,"o":"m 521 1023 q 754 956 645 1023 q 924 769 863 889 q 986 500 986 650 q 924 230 986 350 q 754 42 862 109 q 525 -25 646 -25 q 303 41 407 -25 q 136 230 199 107 q 74 502 74 353 q 134 769 74 650 q 301 955 195 888 q 521 1023 407 1023 m 532 971 q 321 861 402 971 q 241 503 241 751 q 323 131 241 234 q 528 29 406 29 q 677 75 613 29 q 780 224 742 122 q 819 490 819 325 q 783 772 819 670 q 680 922 747 873 q 532 971 613 971 "},"Ĭ":{"x_min":51,"x_max":504,"ha":555,"o":"m 51 1002 l 504 1002 l 504 951 l 426 951 q 360 937 374 951 q 347 881 347 924 l 347 123 q 358 66 347 78 q 416 51 374 51 l 504 51 l 504 0 l 51 0 l 51 51 l 136 51 q 194 64 181 51 q 208 123 208 78 l 208 881 q 196 935 208 925 q 127 951 177 951 l 51 951 l 51 1002 m 75 1335 l 117 1335 q 171 1269 134 1291 q 274 1248 208 1248 q 384 1272 341 1248 q 434 1335 417 1291 l 478 1335 q 445 1218 472 1264 q 372 1146 417 1172 q 274 1120 327 1120 q 142 1174 196 1120 q 75 1335 88 1228 "},"♪":{"x_min":24.59375,"x_max":656,"ha":681,"o":"m 323 924 l 348 924 q 499 914 462 924 q 591 862 551 900 q 638 781 621 833 q 656 660 656 730 l 656 591 l 590 591 l 590 620 q 571 698 590 666 q 515 747 552 730 q 407 769 466 769 l 389 769 l 389 203 q 367 75 389 121 q 294 2 346 29 q 181 -25 242 -25 q 66 16 109 -25 q 24 126 24 58 q 75 245 24 197 q 207 294 125 294 q 323 262 259 294 l 323 924 "},"ŧ":{"x_min":34,"x_max":498,"ha":530,"o":"m 253 426 l 455 426 l 455 378 l 253 378 l 253 166 q 279 83 253 109 q 340 57 305 57 q 420 102 388 57 q 453 240 453 147 l 498 240 q 443 52 498 113 q 306 -9 388 -9 q 188 30 235 -9 q 142 146 142 70 l 142 378 l 34 378 l 34 426 l 142 426 l 142 573 l 34 573 l 34 620 q 203 894 203 642 l 254 894 l 254 635 l 455 635 l 455 573 l 253 573 l 253 426 "},"À":{"x_min":-10,"x_max":990,"ha":983,"o":"m 475 1023 l 519 1023 l 872 106 q 959 51 893 51 l 990 51 l 990 0 l 598 0 l 598 51 l 629 51 q 715 64 690 51 q 733 93 733 74 q 728 118 733 105 l 646 331 l 258 331 l 212 208 q 195 131 195 160 q 225 74 195 98 q 312 51 255 51 l 346 51 l 346 0 l -10 0 l -10 51 q 80 76 47 51 q 141 173 113 101 l 475 1023 m 455 830 l 279 384 l 627 384 l 455 830 m 623 1092 l 608 1075 l 424 1213 q 351 1302 351 1268 q 367 1340 351 1323 q 406 1357 384 1357 q 473 1314 443 1357 l 623 1092 "},"Ϊ":{"x_min":51,"x_max":504,"ha":555,"o":"m 51 1002 l 504 1002 l 504 951 l 426 951 q 360 937 374 951 q 347 881 347 924 l 347 123 q 359 66 347 78 q 417 51 375 51 l 504 51 l 504 0 l 51 0 l 51 51 l 136 51 q 194 64 181 51 q 208 123 208 78 l 208 881 q 196 935 208 925 q 128 951 177 951 l 51 951 l 51 1002 m 149 1263 q 198 1243 178 1263 q 218 1194 218 1223 q 197 1144 218 1165 q 149 1124 177 1124 q 101 1145 121 1124 q 82 1195 82 1166 q 101 1243 82 1223 q 149 1263 121 1263 m 405 1261 q 454 1240 434 1261 q 474 1191 474 1220 q 453 1141 474 1162 q 405 1121 433 1121 q 356 1141 376 1121 q 336 1191 336 1162 q 356 1240 336 1220 q 405 1261 376 1261 "},"½":{"x_min":110.671875,"x_max":991,"ha":1134,"o":"m 110 907 q 212 918 174 907 q 289 958 250 930 l 299 958 l 299 532 q 306 513 299 520 q 328 507 314 507 l 394 507 l 394 474 l 120 474 l 120 507 l 177 507 q 213 518 203 507 q 223 557 223 529 l 223 833 q 212 865 223 856 q 169 875 201 875 l 110 875 l 110 907 m 831 940 l 889 940 l 254 0 l 197 0 l 831 940 m 738 80 l 904 80 q 938 91 928 80 q 963 154 949 102 l 982 154 l 982 -1 l 646 -1 l 646 27 l 811 196 q 897 361 897 283 q 869 425 897 399 q 800 452 842 452 q 736 433 761 452 q 711 395 711 414 q 737 370 711 381 q 766 333 766 359 q 752 297 766 311 q 717 284 738 284 q 673 303 691 284 q 656 356 656 323 q 701 446 656 408 q 831 484 747 484 q 951 451 912 484 q 991 366 991 418 q 963 285 991 327 q 832 159 936 244 q 738 80 768 107 "},"╛":{"x_min":-15.640625,"x_max":539,"ha":964,"o":"m 539 233 l -15 233 l -15 352 l 423 352 l 423 490 l -15 490 l -15 609 l 423 609 l 423 1263 l 539 1263 l 539 233 "},"╜":{"x_min":-15.578125,"x_max":666,"ha":964,"o":"m 666 362 l -15 362 l -15 481 l 297 481 l 297 1263 l 413 1263 l 413 481 l 550 481 l 550 1263 l 666 1263 l 666 362 "},"'":{"x_min":71,"x_max":207,"ha":278,"o":"m 123 556 l 86 759 q 71 873 71 844 q 88 937 71 917 q 137 958 105 958 q 187 937 167 958 q 207 883 207 917 q 189 759 207 858 l 152 556 l 123 556 "},"ĳ":{"x_min":32.421875,"x_max":716,"ha":832,"o":"m 280 938 q 258 885 280 907 q 205 863 236 863 q 152 885 174 863 q 130 938 130 907 q 152 992 130 970 q 205 1015 174 1015 q 258 992 236 1015 q 280 938 280 970 m 716 938 q 694 885 716 907 q 641 863 672 863 q 588 885 610 863 q 566 938 566 907 q 588 992 566 970 q 641 1015 610 1015 q 694 992 672 1015 q 716 938 716 970 m 708 640 l 708 36 q 637 -180 708 -91 q 478 -270 567 -270 q 387 -189 387 -270 q 407 -133 387 -152 q 454 -113 427 -113 q 515 -175 501 -113 q 538 -206 521 -206 q 584 -146 569 -206 q 600 -23 600 -86 l 600 511 q 509 588 600 588 l 453 588 l 453 640 l 708 640 m 32 639 l 280 639 l 280 96 q 329 51 280 51 l 400 51 l 400 0 l 46 0 l 46 51 l 111 51 q 168 107 168 51 l 168 508 q 83 585 168 585 l 32 585 l 32 639 "},"╟":{"x_min":298,"x_max":979.359375,"ha":964,"o":"m 551 -421 l 551 1263 l 667 1263 l 667 481 l 979 481 l 979 362 l 667 362 l 667 -421 l 551 -421 m 298 -421 l 298 1263 l 414 1263 l 414 -421 l 298 -421 "},"Р":{"x_min":53,"x_max":875,"ha":908,"o":"m 53 1002 l 537 1002 q 788 926 702 1002 q 875 727 875 850 q 795 540 875 605 q 524 452 685 452 l 349 452 l 349 109 q 362 67 349 80 q 412 51 381 51 l 524 51 l 524 0 l 53 0 l 53 51 l 151 51 q 194 62 180 51 q 208 95 208 74 l 208 893 q 190 937 208 923 q 125 950 173 950 l 53 950 l 53 1002 m 349 501 l 482 501 q 665 554 609 501 q 722 732 722 608 q 696 865 722 819 q 622 934 671 912 q 462 957 573 957 q 368 942 388 957 q 349 893 349 928 l 349 501 "},"˛":{"x_min":96,"x_max":405.59375,"ha":453,"o":"m 149 6 l 184 6 q 167 -63 167 -30 q 207 -162 167 -124 q 311 -201 248 -201 q 391 -185 347 -201 l 405 -207 q 321 -249 355 -238 q 249 -261 287 -261 q 137 -223 178 -261 q 96 -129 96 -186 q 149 6 96 -48 "},"♂":{"x_min":74,"x_max":940.8125,"ha":1021,"o":"m 808 1097 l 832 1087 l 940 635 l 902 625 l 808 1019 l 570 498 q 719 361 668 447 q 770 177 770 275 q 724 0 770 84 q 595 -130 678 -83 q 421 -178 512 -178 q 248 -130 331 -178 q 119 0 165 -83 q 74 177 74 85 q 176 428 74 324 q 423 532 278 532 q 533 513 475 532 l 773 1036 l 416 856 l 400 892 l 808 1097 m 421 495 q 268 454 343 495 q 151 336 193 413 q 110 177 110 259 q 201 -47 110 45 q 421 -141 292 -141 q 642 -47 551 -141 q 734 177 734 45 q 692 336 734 259 q 575 454 650 413 q 421 495 500 495 "},"╨":{"x_min":-15,"x_max":979,"ha":964,"o":"m 979 362 l -15 362 l -15 481 l 298 481 l 298 1263 l 414 1263 l 414 481 l 551 481 l 551 1263 l 667 1263 l 667 481 l 979 481 l 979 362 "},"Ć":{"x_min":94,"x_max":916.296875,"ha":982,"o":"m 786 924 l 832 1021 l 883 1021 l 883 618 l 847 618 q 737 868 803 788 q 540 970 654 970 q 338 857 416 970 q 261 476 261 744 q 350 132 261 250 q 562 32 425 32 q 763 110 682 32 q 869 346 844 188 l 916 346 q 796 71 895 167 q 545 -25 696 -25 q 319 38 422 -25 q 155 219 216 101 q 94 478 94 337 q 157 760 94 628 q 319 957 220 891 q 533 1024 418 1024 q 656 1001 596 1024 q 786 924 716 979 m 455 1074 l 439 1091 l 553 1257 q 618 1341 599 1326 q 656 1356 637 1356 q 695 1340 678 1356 q 712 1302 712 1323 q 664 1232 712 1268 l 455 1074 "},"":{"x_min":24.953125,"x_max":520,"ha":559,"o":"m 520 621 l 520 522 l 320 522 q 296 203 296 304 q 319 119 296 147 q 377 92 342 92 q 452 171 440 92 l 476 171 q 439 39 476 98 q 343 -19 402 -19 q 225 204 225 -19 q 248 522 225 300 l 189 522 q 105 503 135 522 q 48 428 74 485 l 24 428 q 77 550 48 508 q 133 607 106 593 q 210 621 161 621 l 520 621 "},"Т":{"x_min":49.390625,"x_max":866.609375,"ha":908,"o":"m 49 1002 l 866 1002 l 866 622 l 830 622 q 594 957 785 957 q 541 943 555 957 q 527 898 527 929 l 527 98 q 540 62 527 74 q 586 51 554 51 l 686 51 l 686 0 l 229 0 l 229 51 l 342 51 q 377 62 365 51 q 389 92 389 74 l 389 904 q 373 943 389 930 q 324 957 358 957 q 163 864 228 957 q 87 622 110 787 l 49 622 l 49 1002 "},"£":{"x_min":-19,"x_max":695.875,"ha":757,"o":"m 351 506 l 597 506 l 597 448 l 363 448 q 371 335 371 392 q 342 167 371 239 q 551 111 477 111 q 613 137 589 111 q 650 231 637 163 l 695 221 q 625 41 677 101 q 511 -19 572 -19 q 425 1 471 -19 q 295 86 378 21 q 206 7 253 34 q 120 -19 160 -19 q 20 18 60 -19 q -19 113 -19 56 q 20 204 -19 168 q 122 240 59 240 q 279 190 174 240 l 279 213 q 228 448 279 335 l 37 448 l 37 506 l 200 506 q 159 701 159 615 q 236 884 159 810 q 440 958 313 958 q 596 905 538 958 q 654 777 654 852 q 628 698 654 728 q 566 668 602 668 q 518 690 537 668 q 499 748 499 712 q 525 806 499 783 q 556 837 551 830 q 559 848 559 842 q 529 890 559 871 q 438 909 499 909 q 319 868 364 909 q 274 766 274 826 q 280 708 274 737 q 314 611 287 680 q 351 506 337 553 m 258 112 q 166 172 192 161 q 115 184 140 184 q 53 162 77 184 q 30 105 30 140 q 55 48 30 71 q 120 26 80 26 q 258 112 198 26 "},"ů":{"x_min":37.671875,"x_max":797,"ha":832,"o":"m 258 641 l 258 226 q 296 107 258 149 q 395 65 334 65 q 521 126 469 65 q 574 280 574 187 l 574 518 q 551 569 574 551 q 463 587 528 587 l 463 641 l 682 641 l 682 126 q 701 70 682 90 q 757 51 721 51 l 797 51 l 797 3 l 587 3 l 574 126 q 461 24 518 58 q 347 -9 405 -9 q 205 48 262 -9 q 148 241 148 105 l 148 517 q 119 573 148 554 q 37 587 99 587 l 37 641 l 258 641 m 405 1035 q 502 993 461 1035 q 543 894 543 952 q 502 793 543 835 q 403 752 461 752 q 305 793 346 752 q 265 892 265 834 q 306 993 265 951 q 405 1035 347 1035 m 405 979 q 345 953 370 979 q 320 892 320 928 q 344 832 320 857 q 404 808 369 808 q 463 833 438 808 q 489 893 489 858 q 464 954 489 929 q 405 979 440 979 "},"Ō":{"x_min":74,"x_max":986,"ha":1059,"o":"m 521 1023 q 754 956 645 1023 q 924 769 863 889 q 986 500 986 650 q 924 230 986 350 q 754 42 862 109 q 525 -25 646 -25 q 303 41 407 -25 q 136 230 199 107 q 74 502 74 353 q 134 769 74 650 q 301 955 195 888 q 521 1023 407 1023 m 532 971 q 321 861 402 971 q 241 503 241 751 q 323 131 241 234 q 528 29 406 29 q 677 75 613 29 q 780 224 742 122 q 819 490 819 325 q 783 772 819 670 q 680 922 747 873 q 532 971 613 971 m 315 1276 l 745 1276 l 745 1188 l 315 1188 l 315 1276 "},"а":{"x_min":67,"x_max":725.9375,"ha":757,"o":"m 702 69 l 725 31 q 618 -19 677 -19 q 542 6 573 -19 q 488 94 511 31 q 377 3 425 26 q 262 -19 329 -19 q 116 23 166 -19 q 67 130 67 65 q 181 295 67 229 q 484 382 295 360 l 484 478 q 444 566 484 529 q 341 603 403 603 q 241 578 283 603 q 211 542 211 560 q 227 511 211 532 q 247 462 247 483 q 227 413 247 432 q 177 394 208 394 q 121 417 143 394 q 99 475 99 440 q 173 598 99 542 q 367 654 247 654 q 536 605 478 654 q 595 485 595 555 l 595 138 q 609 70 595 92 q 647 48 624 48 q 702 69 673 48 m 484 337 q 245 260 316 313 q 193 145 193 219 q 220 63 193 92 q 291 34 247 34 q 427 94 369 34 q 484 246 484 155 l 484 337 "},"Ğ":{"x_min":69,"x_max":1021,"ha":1058,"o":"m 765 923 l 819 1023 l 876 1023 l 876 623 l 845 623 q 727 873 795 796 q 529 972 641 972 q 376 922 444 972 q 272 774 308 873 q 236 495 236 675 q 272 223 236 321 q 372 78 308 124 q 521 32 436 32 q 701 98 638 32 q 765 269 76