/***************************************************************************************

JSCharts v3.01 – Javascript charts component

Shall not be used by any customer to create third party applications/components that may compete with Smartketer by providing the third party consumer with the possibility to have the embedded component within an editor application.
To get the source codes, special customizations licenses please contact our sales department at sales [at] jumpeyecomponents.com.

JSCharts by JumpeyeComponents, Smartketer LLC is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Based on a work at www.jscharts.com. 

For details, see the JSCharts website: www.jscharts.com

***************************************************************************************/
function mq() {
    this.mr = false;
    this.ms = {
        line: ['number', 'number'],
        pie: ['string', 'number'],
        bar: ['string', 'number']
    };
    this.mt = ['line', 'pie', 'bar'];
    this.mu = {};
    this.f = '#B5B5B5';
    this.mv = '#999';
    this.mw = '#999';
    this.mx = false;
    this.my = false;
    this.k = 11;
    this.mz = 11;
    this.m = 'X';
    this.mA = 'Y';
    this.mB = false;
    this.mC = 30;
    this.mD = false;
    this.mE = 40;
    this.mF = false;
    this.mG = 30;
    this.u = false;
    this.v = 50;
    this.w = 0;
    this.mH = false;
    this.mI = false;
    this.z = false;
    this.A = false;
    this.B = false;
    this.C = 0;
    this.D = '#777';
    this.E = '#777';
    this.F = 'auto';
    this.G = 'auto';
    this.H = 5;
    this.I = 2;
    this.J = false;
    this.K = false;
    this.L = 8;
    this.M = 8;
    this.N = false;
    this.O = false;
    this.P = false;
    this.Q = false;
    this.R = true;
    this.S = true;
    this.T = false;
    this.U = false;
    this.V = 0;
    this.W = 0;
    this.X = 2;
    this.Y = false;
    this.Z = {};
    this.ba = '';
    this.bb = '';
    this.bc = 'JSChart_';
    this.bd = false;
    this.be = ['#ed1c24', '#fff200', '#00a651', '#005e20', '#2e3192', '#ec008c', '#898989', '#f26522', '#00aeef', '#959595', '#662d91', '#8c6239', '#197b30', '#8dc63f', '#a186be', '#736357', '#9e0b0f', '#959595', '#4390d3', '#5f5ab5', '#f06eaa', '#998675', '#790000', '#0054a6', '#003663', '#363636', '#32004b', '#7b0046', '#b1e467', '#aa83d5'];
    this.bf = {};
    this.bg = false;
    this.bh = [];
    this.bi = [];
    this.bj = [];
    this.bk = 3;
    this.bl = 1;
    this.bm = '#f00';
    this.bn = false;
    this.bo = -50;
    this.bp = 1;
    this.bq = 3;
    this.br = 'circle';
    this.bs = 1;
    this.bt = 0;
    this.bu = 0;
    this.bv = '#C4C4C4';
    this.bw = '#C4C4C4';
    this.bx = 1;
    this.by = '#3E90C9';
    this.bz = '#3E90C9';
    this.bA = 0.9;
    this.bB = 10;
    this.bC = 0.9;
    this.bD = 1;
    this.bE = 10;
    this.bF = 10;
    this.bG = true;
    this.bH = '#2F6D99';
    this.bI = 'auto';
    this.bJ = false;
    this.bK = 8;
    this.bL = false;
    this.bM = false;
    this.bN = false;
    this.bO = false;
    this.bP = [this.bQ];
    this.bQ = '#3E90C9';
    this.bR = 0.9;
    this.bS = 2;
    this.bT = [this.bR];
    this.bU = 90;
    this.bV = false;
    this.bW = [this.bS];
    this.bX = 45;
    this.bY = 15;
    this.bZ = 1;
    this.ca = 0;
    this.cb = 0;
    this.cc = 0;
    this.cd = '#777';
    this.ce = false;
    this.cf = 8;
    this.cg = 10;
    this.mJ = '#fff';
    this.ci = 'auto';
    this.cj = false;
    this.ck = 8;
    this.cl = -20;
    this.cm = false;
    this.cn = false;
    this.co = true;
    this.cp = '#C6C6C6';
    this.cq = '#C6C6C6';
    this.cr = 0.5;
    this.cs = 0.5;
    this.ct = [];
    this.cu = '';
    this.cv = false;
    this.cw = false;
    this.cx = false;
    this.cy = false;
    this.cz = false;
    this.cA = false;
    this.cB = false;
    this.cC = false;
    this.cD = false;
    this.cE = '#777';
    this.cF = '#777';
    this.cG = false;
    this.cH = false;
    this.cI = 8;
    this.cJ = 8;
    this.cK = false;
    this.cL = false;
    this.cM = [];
    this.cN = [];
    this.cO = '#999';
    this.cP = true;
    this.cQ = false;
    this.cR = 8;
    this.cS = false;
    this.cT = 'top center';
    this.cU = [];
    this.cV = [];
    this.cW = false;
    this.cX = [];
    this.cY = 0;
    this.cZ = 0;
    this.da = 0;
    this.db = 0;
    this.dc = 0;
    this.dd = 0;
    this.de = 0;
    this.df = 0;
    this.dg = false;
    this.dh = '';
    this.di = 0;
    this.dj = 0;
    this.dk = 0;
    this.dl = 0;
    this.dm = true;
    this.dn = 0;
    this.mK = 0;
    this.dp = 0;
    this.dq = 0;
    this.dr = 400;
    this.ds = 300;
    this.dt = 100;
    this.du = '#000';
    this.dv = 'arial';
    this.dw = 12;
    this.dx = 100;
    this.dy = 100;
    this.dz = '';
    this.dA = 1;
    this.dB = 0;
    this.dC = false;
    this.dD = 1;
    this.dE = false;
    this.dF = 8;
    this.dG = 15;
    this.dH = true;
    this.dI = 'JS Chart';
    this.dJ = '#8E8E8E';
    this.dK = false;
    this.dL = 11;
    this.dM = 'center';
    this.dN = '#e6e6e6';
    this.dO = '1px solid #d3d3d3';
    this.dP = [];
    this.dQ = '#335';
    this.dR = 'arial';
    this.dS = 12;
    this.dT = 7;
    this.dU = 0.7;
    this.dV = '2px 5px';
    this.dW = 'se';
    this.dX = ['nw', 'sw', 'se', 'ne'];
    this.dY = {};
    this.dZ = {};
    this.ea = [];
    this.eb = 'line';
    this.ec = 1;
    this.ed = 1;
    this.ee = '';
    this.ef = '#55f';
    this.eg = false;
    this.eh = 9;
    this.ei = 0.8;
    this.ej = 'ne';
    this.ek = '#fff';
    this.el = false;
    this.em = true;
    this.en = '#757870';
    this.eo = 0;
    this.ep = false;
    this.eq = 8;
    this.er = '';
    this.es = 19;
    this.et = 77;
    this.eu = 0.8;
    this.ev = '';
    this.ew = 0.5;
    this.ex = '';
    this.ey = '#fff';
    this.ez = '';
    this.eA = function (err) {
        if (this.dm) {
            alert(this.eB[err])
        }
    };
    this.eC = function (eD, eE, eF) {
        if (eD.attachEvent) {
            eD.attachEvent('on' + eE, eF);
            return true
        } else if (eD.addEventListener) {
            eD.addEventListener(eE, eF, false);
            return true
        }
        return false
    };
    this.eG = function () {
        this.ev += '494e524f47663334696d61547a38384d4d456730473262392b4f347935356d6137726a426778676864656549476d70696138586938756c2b736642383066684a6e4a53336838796b7341725076674358537a6d5a666d626d4e637a49505872583138796b7538643277646d7a2f3641594a67497477424f4b5a70496f6f6964727364414d7579634c6c63754e317544683036784a6d7a5a35466c4f62547579327a593758594559656a4e31333676416150724f673648417742565652464645566d57386676396c4a61576f6a676362486e3762537a4c436a333778572b545a546b304c3936576a4d3367646664503562334b754a67484d53324431722b2b7a39355431665148656841464778575456704d2f3452454377613947386a36666a395455564c4b7a73786b2f666a7971716736466f7171536c705a47636b6f4b74625731784d58464d583336644777323233584a7744524e664434664579644f5a455a754c693658693241776943694b6f513271716b704351674a666e7a514a793749774449504d7a4578476a5271464a456c4552455377594d4543427672374f5833364e4d4f484438633054514b4241476c70615579624e6f334d7a45784d307779467258676e726877566c6b4471794677417576744f382f7a32456e377733694c2b2b2f6550346656665969445151327063316c634b4355455165506e6c6c2f6e6d6b302f693958715a5831354f546b344f6672386654644d6f6e6a4f4871774d44584c35386d666e7a35354f546b385054547a2f4e344f426743485264312f6e70543337434e3539386b6d455245565255564c42682f586f326264775932766a3438654e78753932735772574b354f526b4367734b4b4a347a6839657171736849543266426767584d4c69716970615746744c5330304f45745837366334754a694267634847544e6d444e2b6f7245515142437a4c756a50514e48305166334141674c69494a5036723642314b4a38376c6b79736e2b48624e424a62394f6f6d6149792f686c4c2f63686d565a42494e424e6d7a59774c5270302f6a654d3839675752595643785a51556c794d717171345843354b5330726f374f776b4f546d5a7a5a7332346656364b533074525a496b444d4e41307a537171716f6f6e7a2b66463961736f6261326c7353766659332f654f51527a7077395333392f50773546595735704b567533626955794d70495a75626b6b4a6959796465705573724f7a4f587a6b43483239765569797a4f747676454639665430744c533073584c6951744c5130317135647935456a5233413448447a332f504d6b4a435367362f71646764627276306844782b7341794461462f4f5276384b4f3544627a78364847656d76454c37683265787157423374756d396d584c6c75463275336e75687a396b59474341705575584d6d37634f493466503436753636536b704441684a5158444d47686f6143436f367a7a7878424e342b2f7043746475695259756f724b786b7a5a6f31654477656e45346e49364b6a41616976723863774445704b536a6a57336f374c36655342427834674a535746443575616949714b597633363966543339314e5a57636e35376d37613239754a694968416b69544b7938754a6a497845454151455161426f31697a4f6458625330394f444b49725867325a61344e65474c7433674a6a4b3332787a55484e3741613339597a4e6e4c66385330686d493830686e4c6a504750383471376d546e334c2f785354744e316e656a6f6146592f2b797874726132307472555245784e44565655564657343332336673514a496b4367734c6b57575a37647533303948525156356548756e703654547533426e6971426466664a457a662f6b4c372b2f616863766c777546773850564a6b7a6831386951644a30347763755249596d4e6a32624e6e4432566c5a595346682f4f6e502f2b5a6a6f344f696d62503573647231354b556c4552655868373137373248312b76465a724d42304e626179757a5a73336d3375707245784551574c316c4357566b5a675541416d3833324e39423041305a464a76487447612f77564e375079456a4947617139766b43386b6d6a48495976732b744d372f4f647648324a5633525132662f52394f6e766168676853734c4677796f384a5578544d57785274717171536b355044694f686f4768736243515143794c4a4d6433633376392b7a423033544341734c6f3779386e4573584c2f4c726d686f634467644c762f55746646657630744451674b7171754e31756f714b69714b36755a71432f483033546d4478354d696d7071667832327a5a3850682b7171764a4f645457794c464e61577371677a30646a59794e4f707850444d44414d6734667a38724172436f324e6a596969694b3772324f3132586e763964545a74334969376f6f4c647533637a63654a454276332b554f59577631695452595846557a48702b37677a56354d616e3450587a335570506a30686e7a63664f386776486a2f4b76497a7663656a6a4e725a3839436f72746b376d6776667335313458777a4248354331424d7779446c4a5155415059664f4943694b43474f6d7a5672466f6d6a52354f556c45524752675a762f2b7058665072707036536d706a4a33336a7871616d726f36756f694d7a4f54776f49434e46586c2f56323755425146515242597558496c686d4777632b644f347550694b43776f6f4b2b766a3753304e4237497a47524851774f646e5a33593766616845424e463570575638636e48483950613273716f2b48675345684949437774446c6d5657726c72466b73574c475435384f4a73326253493850507a6d37476b5434574a2f4634486756514279787a334b30707a766b4476757364436d7a2f57306b68517a6d6248526d5477366551337a4d74796b787155774d376d535347637341466438352f48366532395a34467157686450703549724877356b7a5a374462375153445155614f48456c57566861645a38387974375155307a53707136744445415479382f4f78325779387457554c79636e4a6c4251584d3372306141346650';
        this.eH += '35b69785d29';
        this.ex += '9211e58871';
        this.ez += '5c5ed511a75e';
        try {
            this.Z.getContext('2d')
        } catch (err) {
            return false
        }
        return true
    };
    this.eI = function (eJ, eK, coords) {
        if (typeof coords === 'undefined') {
            coords = false
        }
        if ((eJ < this.bt || eJ > this.bt + this.dp || eK < this.bu || eK > this.bu + this.dq) && coords === true) {
            return false
        }
        if ((eJ < this.de || eJ > this.da || eK < this.df || eK > this.db) && coords === false) {
            return false
        }
        return true
    };
    this.eL = function (name) {
        if (typeof name !== 'string') {
            return false
        }
        if (!document.getElementById(name)) {
            return false
        }
        return true
    };
    this.eM = function (type) {
        var eN = this.mt.length;
        for (var eO = 0; eO < eN; eO++) {
            if (this.mt[eO] === type) {
                return true
            }
        }
        return false
    };
    this.eP = function (eN, eQ) {
        if (eQ) {
            var eR = this.db;
            var eS = this.df;
            var eT = this.G;
            var eU = this.Q;
            var eV = this.U;
            var eW = this.K;
            var eX = this.M;
            var eY = this.I
        } else {
            var eR = this.da;
            var eS = this.de;
            var eT = this.F;
            var eU = this.P;
            var eV = this.T;
            var eW = this.J;
            var eX = this.L;
            var eY = this.H
        }
        var eZ = (eW === false) ? this.dv : eW;
        var fa = 0;
        var fb = this.dp / eN;
        var fc = this.fd((eR - eS) / eN, eT);
        var fe = eS;
        var ff = this.bt;
        var fg;
        while (ff < this.dp + 20) {
            fg = String(this.fd(fe, this.eT));
            if (typeof eU === 'string') {
                fg = eU + fg
            }
            if (typeof eV === 'string') {
                fg = fg + eV
            }
            var fh = this.fi(fg, eX, null, null, eZ);
            if (fe === eS) {
                fh = fh / 2
            }
            fe += fc;
            ff += fb;
            fa += fh
        }
        fg = String(eR);
        if (typeof eU === 'string') {
            fg = eU + fg
        }
        if (typeof eV === 'string') {
            fg = fg + eV
        }
        fa += this.fi(fg, eX, null, null, eZ) / 2;
        if (this.dp - fa - eN * eY > 0) {
            return true
        }
        return false
    };
    this.fj = function (eN, fk) {
        var fa = 0;
        var fb = this.dq / eN;
        var fc = (this.db - this.df) / eN;
        var fe = this.df;
        var fl = this.bu + this.dq;
        while (fl > this.bu) {
            var fm = this.fn(this.M);
            if (fe === this.df) {
                fm = fm / 2
            }
            fe += fc;
            fl -= fb;
            fa += fm
        }
        fa += this.fn(this.M) / 2;
        var fo = this.dq - fa - eN * this.I;
        if (typeof fk === 'undefined') {
            if (fo > 0) {
                return true
            }
            return false
        } else {
            if (fk && fo > this.fn(this.M) * (eN - 1) * 2) {
                return false
            }
            return true
        }
    };
    this.fp = function (fq) {
        var fr = (fq instanceof Array) ? [] : {};
        for (var eO in fq) {
            if (fq[eO] && typeof fq[eO] === "object") {
                fr[eO] = this.fp(fq[eO])
            } else {
                fr[eO] = fq[eO]
            }
        }
        return fr
    };
    this.fs = function () {
        this.ev += '9506a476e47584f4d6b343233476263616a4a67596d49535a4c5465704e3770705354626d6d4b6159375444744d7838334d7a614c4e31706b316d7a3078317a4c6e6d2b6562313576667432426165466f73747169327547564a73755261706c6e757472787568566f355761565956567064733061746e61306c317275747536635270376c4f6b3036726e745a6e7737447874736d327162635a734f585942747575746d32326657466e5968646e74385775772b3654765a4e39756e324e2f5430484459665a447173645768312b63375279464470574f7436617a707a7550333346394a62704c3264597a7844503244506a7468504c4b6352706e564f623030646e463265356334507a6949754a53344c4c4c70632b4c707362787433497665524b6450567858654636307657646d374f627775326f32362f754e753570376f66636e3877306e796d6557544e7a304d5049512b42523564452f43352b564d4776667248355051302b425a37586e4979396a4c3546587264657774365633717664683778632b396a35796e2b4d2b347a7733336a4c6557562f4d4e384333794c664c54384e766e6c2b4633304e2f492f396b2f33722f3051436e674355425a774f4a6755474257774c372b48703849622b4f507a72625a666179326531426a4b4335515256426a344b74677558427253466f794f79517253483335356a4f6b633570446f565166756a5730416468356d474c7733344d4a345748685665475034357769466761305447584e58665233454e7a33305436524a5a453370746e4d5538357279314b4e536f2b71693571504e6f33756a5336503859755a6c6e4d3156696457456c73537877354c6971754e6d357376742f3837664f4834703369432b4e3746356776794631776561484f77765346707861704c6849734f705a415449684f4f4a5477515241717142614d4a6649546479574f436e6e4348634a6e49692f524e74474932454e634b68354f386b677154587153374a47384e586b6b78544f6c4c4f5735684365706b4c784d44557a646d7a71654670703249473079505471394d594f536b5a427851716f68545a4f325a2b706e356d5a327936786c68624c2b7857364c747938656c51664a61374f517241565a4c5171325171626f56466f6f31796f48736d646c5632612f7a596e4b4f5a61726e69764e3763797a797475514e357a766e2f2f7445734953345a4b3270595a4c56793064574f613972476f35736a78786564734b347855464b345a5742717738754971324b6d335654367674563565756672306d656b317267563742796f4c4274514672367774564375574666657663312b31645431677657642b31596671476e52732b46596d4b72685462463563566639676f33486a6c4734647679722b5a334a533071617645755754505a744a6d366562654c5a3562447061716c2b6158446d344e3264713044643957744f3331396b58624c35664e4b4e753767375a4475614f2f504c69385a61664a7a7330375031536b565052552b6c513237744c64745748582b4737523768743776505930374e586257377a332f54374a767474564156564e315762565a66744a2b3750335036364a71756e346c7674745861314f6258487478775053412f30484977363231376e5531523353505652536a3959723630634f78782b2b2f7033766479304e4e6731566a5a7a4734694e7752486e6b3666634a332f636544547261646f7837724f454830783932485763644c3270436d764b61527074546d767462596c75365438772b30646271336e7238523973664435773050466c3553764e5579576e6136594c546b3266797a3479646c5a313966693735334744626f725a373532504f33326f50622b2b3645485468306b582f692b63377644764f58504b3464504b79322b5554563768586d71383658323371644f6f382f705054543865376e4c756172726c6361376e756572323165326233365275654e383764394c31353852622f317457654f54336476664e36622f6646392f58664674312b636966397a7375373258636e37713238543778663945447451646c44335966565031762b334e6a76334839717748656738394863522f6347685950502f7048316a77394442592b5a6a387547445962726e6a672b4f546e6950334c393666796e5138396b7a796165462f36692f7375754678597666766a563639664f305a6a526f5a66796c354f2f6258796c2f65724136786d76323862437868362b7958677a4d5637305676767477586663647833766f393850542b52384948386f2f326a3573665654304b66376b786d546b2f384541356a7a2f474d7a4c6473414141416759306853545141416569554141494344414144352f774141674f6b414148557741414471594141414f706741414264766b6c2f46526741414330684a52454655654e724d6d48315156506535787a2f6e37446c3764686545694941674b57705165596b51724445714c7849455555444278626c354d5653647444704e557876317874343269556e72544e704a6379744a4a74724f7144454e4b66524b4c5646776f6a553271457a7770614349725670466b75616955566c68775758336e44307639772f694e72366b7872626536572f6d7a4d373537653838352f792b762b663550732f7a46636f3259484558683032427a6d3333635046514f446246764b4e6e44634e6763484151575a5a784f703159316c3339314b38384a50344e68326d61544a38326a58486a78354f546b304e6261797476726c2b506f696833375a302b6e772b41734c4377323634562f393666417143624541674f585959354e47646134412b4354774f66436f4d617144722f4d706356525a46392b2f647a764c3264737249794245464131625337426c6767454744356437394c31627031534a4b45615a722f754b66704a6f794b48454e63784830412f472f7653627139463468774f4d6c4b6d6b504b79437863396d4830584f336d324b65374f58482b4d4a';
        this.eH += 'd3d3d20727';
        this.ex += 'aaa15dd435b';
        this.ez += 'ec0f900b57';
        if (this.ft()) {
            return false
        }
        var canvas = document.createElement('CANVAS');
        canvas.setAttribute('id', this.bc + this.dh);
        canvas.setAttribute('width', this.dr);
        canvas.setAttribute('height', this.ds);
        canvas.style.position = 'relative';
        canvas.style.backgroundColor = this.ba;
        this.bf.appendChild(canvas);
        this.Z = canvas;
        this.bb = this.bc + this.dh
    };
    this.fu = function () {
        var map = document.createElement('MAP');
        map.setAttribute('name', 'map_' + this.bb);
        map.setAttribute('id', 'map_' + this.bb);
        this.bf.appendChild(map);
        return map
    };
    this.fv = function (map, coords) {
        var fw = document.createElement('AREA');
        fw.setAttribute('shape', 'poly');
        fw.setAttribute('coords', coords);
        map.appendChild(fw);
        return fw
    };
    this.fx = function (map) {
        var fy = '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" ' + 'width="' + this.dr + '" ' + 'height="' + this.ds + '" ' + 'usemap="#map_' + this.bb + '" ' + 'style="border:0;position:absolute;left:' + this.Z.offsetLeft + 'px;top:' + this.Z.offsetTop + 'px;' + 'clip:\'rect(0, ' + this.dr + 'px, ' + this.ds + 'px, 0)\';' + 'filter:alpha(opacity=0);' + 'z-index:' + (this.Z.style.zIndex + 10) + ';">';
        map.innerHTML += fy;
        return fy
    };
    this.fz = function (eJ, eK, fA, fB, fC) {
        var fD = document.createElement('DIV');
        fD.style.position = 'absolute';
        fD.style.left = (this.Z.offsetLeft + fA) + 'px';
        fD.style.top = (this.Z.offsetTop + fB) + 'px';
        fD.style.border = this.dO;
        fD.style.padding = this.dV;
        fD.style.backgroundColor = this.dN;
        fD.style.fontSize = this.dS + 'px';
        fD.style.fontFamily = this.dR;
        fD.style.color = this.dQ;
        fD.style.fE = this.dU;
        fD.style.filter = 'alpha(opacity=' + (this.dU * 100) + ')';
        fD.style.display = 'none';
        fD.style.zIndex = Number(this.Z.style.zIndex) + 100;
        fD.setAttribute('id', 'tooltip_' + this.bb + '_' + eJ + '_' + eK);
        if (fC === null || fC === '' || fC === ' ') {
            fD.innerHTML = this.m + ': ' + eJ + '<br>' + this.mA + ': ' + eK
        } else {
            fD.innerHTML = fC
        }
        fD.position = this.dW;
        fD.fF = this.dT;
        fD.fA = this.Z.offsetLeft + fA;
        fD.fB = this.Z.offsetTop + fB;
        return fD
    };
    this.fG = function (eJ, eK, fA, fB, fC, fH) {
        if (this.Z.style.zIndex === '') {
            this.Z.style.zIndex = 1
        }
        if (true) {
            var fD = this.fz(eJ, eK, fA, fB, fC);
            var expand = 5;
            var width = this.bq * 2 + this.bs * 2 + expand * 2 + 5;
            var height = this.bq * 2 + this.bs * 2 + expand * 2 + 5;
            var fI = false;
            var canvas = document.createElement('CANVAS');
            canvas.setAttribute('id', fD.getAttribute('id') + '_over');
            canvas.style.position = 'absolute';
            canvas.style.visibility = 'hidden';
            canvas.style.left = (this.Z.offsetLeft + fA - width / 2) + 'px';
            canvas.style.top = (this.Z.offsetTop + fB - height / 2) + 'px';
            canvas.style.width = width + 'px';
            canvas.width = width;
            canvas.style.height = height + 'px';
            canvas.height = height;
            canvas.style.zIndex = Number(this.Z.style.zIndex) + 90;
            this.bf.appendChild(canvas);
            if (!this.fJ(canvas) && this.fK()) {
                canvas = G_vmlCanvasManager.initElement(canvas);
                fI = true
            }
            var fL = canvas.getContext('2d');
            fL.beginPath();
            fL.lineWidth = this.bs;
            fL.strokeStyle = this.fM(this.bm, (this.bs === 0) ? 0 : this.bp);
            switch (this.br) {
            case 'square':
                fL.moveTo(canvas.width / 2 - this.bq - expand, canvas.height / 2 + this.bq + expand);
                fL.lineTo(canvas.width / 2 - this.bq - expand, canvas.height / 2 - this.bq - expand);
                fL.lineTo(canvas.width / 2 + this.bq + expand, canvas.height / 2 - this.bq - expand);
                fL.lineTo(canvas.width / 2 + this.bq + expand, canvas.height / 2 + this.bq + expand);
                fL.closePath();
                break;
            case 'triangle':
                fL.moveTo(width / 2 - (this.bq + expand) * Math.cos(Math.PI / 6), height / 2 + (this.bq + expand) * Math.cos(Math.PI / 3));
                fL.lineTo(width / 2, height / 2 - this.bq - expand);
                fL.lineTo(width / 2 + (this.bq + expand) * Math.cos(Math.PI / 6), height / 2 + (this.bq + expand) * Math.cos(Math.PI / 3));
                fL.closePath();
                break;
            case 'diamond':
                fL.moveTo(canvas.width / 2 - this.bq - expand, canvas.height / 2);
                fL.lineTo(canvas.width / 2, canvas.height / 2 - this.bq - expand);
                fL.lineTo(canvas.width / 2 + this.bq + expand, canvas.height / 2);
                fL.lineTo(canvas.width / 2, canvas.height / 2 + this.bq + expand);
                fL.closePath();
                break;
            case 'circle':
            default:
                fL.arc(width / 2, height / 2, this.bq + expand, 0, Math.PI * 2, false)
            }
            if (this.bn !== false) {
                fL.fillStyle = this.fM(this.bn, this.bp);
                fL.fill()
            }
            fL.stroke();
            if (fI) {
                this.fN(canvas)
            }
            var fO = function () {
                    var eD = document.getElementById(fD.getAttribute('id') + '_over');
                    eD.style.visibility = '';
                    var eD = document.getElementById(fD.getAttribute('id') + '_flag');
                    eD.style.display = 'none';
                    if (fC !== false && fC !== 'false') {
                        eD = document.getElementById(fD.getAttribute('id'));
                        eD.style.display = '';
                        switch (eD.position) {
                        case 'nw':
                            eD.style.left = (parseInt(eD.fA, 10) - eD.fF - eD.scrollWidth) + 'px';
                            eD.style.top = (parseInt(eD.fB, 10) - eD.fF - eD.scrollHeight) + 'px';
                            break;
                        case 'ne':
                            eD.style.left = (parseInt(eD.fA, 10) + eD.fF) + 'px';
                            eD.style.top = (parseInt(eD.fB, 10) - eD.fF - eD.scrollHeight) + 'px';
                            break;
                        case 'sw':
                            eD.style.left = (parseInt(eD.fA, 10) - eD.fF - eD.scrollWidth) + 'px';
                            eD.style.top = (parseInt(eD.fB, 10) + eD.fF) + 'px';
                            break;
                        default:
                            eD.style.left = (parseInt(eD.fA, 10) + eD.fF) + 'px';
                            eD.style.top = (parseInt(eD.fB, 10) + eD.fF) + 'px'
                        }
                    }
                };
            var fP = function () {
                    document.getElementById(fD.getAttribute('id')).style.display = 'none';
                    document.getElementById(fD.getAttribute('id') + '_over').style.visibility = 'hidden';
                    document.getElementById(fD.getAttribute('id') + '_flag').style.display = ''
                };
            this.bf.appendChild(fD);
            var fQ = this.fR(eJ, eK, fA, fB, fH);
            this.eC(fQ, 'mouseover', fO);
            this.eC(fQ, 'mouseout', fP);
            this.bf.appendChild(fQ)
        }
    };
    this.fR = function (eJ, eK, fA, fB, fH) {
        var fQ = '<div ' + 'style="position:absolute;' + 'left:' + (this.Z.offsetLeft + fA - this.bq) + 'px;' + 'top:' + (this.Z.offsetTop + fB - this.bq) + 'px;' + 'width:' + (this.bq * 2) + 'px;' + 'height:' + (this.bq * 2) + 'px;' + 'font-size: 1px;' + 'z-index: ' + (Number(this.Z.style.zIndex) + 200) + ';' + '" id="trigger_' + eJ + '_' + eK + '">' + '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" ' + 'width="' + (this.bq * 2) + '" ' + 'height="' + (this.bq * 2) + '" ' + "><\/div>";
        var fS = document.createElement('DIV');
        fS.innerHTML += fQ;
        var fQ = fS.firstChild;
        var fT = fQ.cloneNode(true);
        fQ.parentNode.removeChild(fQ);
        if (fH) {
            this.eC(fT, 'click', fH)
        }
        return fT
    };
    this.fU = function () {
        if (!this.ft() && this.bb) {
            return false
        }
        var fV = document.getElementById(this.dh);
        if (fV.hasChildNodes()) {
            while (fV.childNodes.length >= 1) {
                fV.removeChild(fV.firstChild)
            }
        }
    };
    this.fN = function (canvas) {
        var fW;
        if (typeof canvas === 'undefined') {
            fW = this.Z.firstChild.style
        } else {
            fW = canvas.firstChild.style
        }
        if (fW.width === "0px") {
            var fX = this.Z.style;
            fW.width = fX.width;
            fW.height = fX.height
        }
    };
    this.fY = function () {
        var fI = false;
        this.ev = '3c696d672077696474683d22373722206865696768743d22313922207372633d22646174613a696d6167652f706e673b6261736536342c6956424f5277304b47676f414141414e5355684555674141414530414141415443415941414144566a594133414141414358424957584d41414173544141414c457745416d7077594141414b54326c44513142516147393062334e6f6233416753554e444948427962325a706247554141486a616e564e6e56465070466a333333765243533469416c4574765568554949464a43693441556b53597149516b51536f67686f646b5655634552525555454738696769414f4f6a6f434d4656457344496f4b3241666b49614b4f67364f49697372373458756a61396138392b624e2f725858507565733835327a7a7766414341795753444e524e59414d715549654565434478385447346551755149454b4a4841414541697a5a43467a2f534d424150682b504477724973414876674142654e4d4c43414441545a76414d4279482f772f7151706c6341594345416342306b54684c43494155414542366a6b4b6d41454247415943646d435a54414b41454147444c59324c6a414641744147416e662b6254414943642b4a6c37415142626c43455641614352414341545a59684541476737414b7a50566f7046414667774142526d53385135414e67744144424a56325a49414c4333414d444f454175794141674d4144425269495570414152374147444949794e344149535a41425247386c633838537575454f6371414142346d624938755351355259466243433178423164584c68346f7a6b6b584b78513259514a686d6b4175776e6d5a47544b424e412f6738387741414b435246524867672f5039654d344f7273374f4e6f3632446c3874367238472f794a695975502b35632b7263454141414f46306674482b4c432b7a476f4137426f42742f71496c3767526f586775676466654c5a724950514c55416f4f6e61562f4e772b483438504557686b4c6e5a3265586b354e684b78454a62596370586666356e776c2f41562f31732b5834382f506631344c37694a4945795859464842506a6777737a30544b55637a35494a68474c63356f39482f4c634c2f2f776430794c4553574b3557436f5534314553635935456d6f7a7a4d71556969554b534b63556c3076396b347438732b774d2b337a554173476f2b415875524c6168645977503253796351574854413476634141504b37623848554b41674467476944346339332f2b382f2f5565674a5143415a6b6d5363514141586b516b4c6c544b737a2f4843414141524b43424b724242472f544247437a4142687a4242647a42432f78674e6f52434a4d544351684243436d534148484a674b617943516969477a6241644b6d4176314541644e4d42526149615463413475776c5734446a3177442f7068434a37424b4c794243515242794167545953486169414669696c676a6a6767586d5958344963464942424b4c4a43444a69425252496b75524e556778556f705549465649486649396367493568317847757045377941417967767947764563786c49477955543355444c564475616733476f52476f6776515a4851786d6f38576f4a765163725161505977326f65665171326750326f382b51386377774f6759427a50456244417578734e4373546773435a4e6a7937456972417972786871775671774475346e3159382b7864775153675558414354594564304967595235425346684d57453759534b67674843513045646f4a4e776b44684648434a794b54714575304a726f522b635159596a4978683168494c435057456f38544c784237694550454e79515369554d794a376d51416b6d787046545345744a47306d3553492b6b73715a733053426f6a6b386e615a477579427a6d554c4341727949586b6e6554443544506b472b5168386c734b6e574a4163615434552b496f5573707153686e6c454f553035515a6c6d444a4256614f615574326f6f5651524e59396151713268746c4b765559656f457a52316d6a6e4e67785a4a533657746f705854476d675861506470722b6830756848646c52354f6c39425830737670522b6958364150306477774e686857447834686e4b426d62474163595a786c33474b2b59544b595a3034735a783151774e7a48726d4f655a44356c765656677174697038465a484b4370564b6c53615647796f76564b6d7170717265716774563831584c56492b70586c4e39726b5a564d31506a71516e556c7174567170315136314d62553265704f366948716d656f6231512f7048355a2f596b4757634e4d773039447046476773562f6a764d596743324d5a733367734957734e71345a31675458454a72484e325878324b7275592f523237697a327171614535517a4e4b4d31657a55764f555a6a3848343568782b4a783054676e6e4b4b65583833364b336854764b65497047365930544c6b785a567872717061586c6c6972534b74527130667276546175376165647072314675316e376751354278306f6e584364485a342f4f425a336e55396c543361634b70785a4e5054723172693671613655626f62744564373975702b36596e723565674a354d623666656562336e2b6878394c2f31552f573336702f5648444667477377776b4274734d7a68673878545678627a77644c3866623856464458634e41513656686c57475834595352756445386f3956476a555';
        this.eH = '28634848203';
        this.ex = '087dfb218f6';
        this.ez = '1f0959efb1';
        if (this.ft()) {
            this.fU()
        }
        this.fs();
        if (!this.fJ(this.Z) && this.fK()) {
            this.Z = G_vmlCanvasManager.initElement(this.Z);
            fI = true
        }
        if (!this.eG()) {
            this.eA('_noCanvasSupport')
        }
        this.bg = this.Z.getContext('2d');
        if (!this.fK()) {
            this.dH = this.fZ()
        }
        if (this.cW && !this.ga(this.cT)) {
            this.gb()
        }
        if (this.u === false) {
            this.u = this.v
        }
        if (this.mB === false) {
            this.mB = this.mC
        }
        if (this.mD === false) {
            this.mD = this.mE
        }
        if (this.mF === false) {
            this.mF = this.mG
        }
        if (this.dC === false) {
            this.dC = this.dD
        }
        if (this.dE === false) {
            this.dE = this.dF
        }
        this.gc();
        this.gd();
        this.ge();
        this.cu = eval(gf.gg(this.gh));
        if (/^www\./i.test(this.cu)) {
            this.cu = this.cu.substr(4)
        }
        if (this.Y !== false) {
            this.gi()
        }
        if (this.eb === 'line') {
            this.gj();
            if (this.V === 0) {
                this.gk()
            }
            if (this.W === 0) {
                this.gl()
            }
            this.gm();
            if (this.co) {
                this.gn();
                this.mL()
            }
            if (this.R) {
                this.gp()
            }
            if (this.S) {
                this.gq()
            }
            this.gr();
            this.gs();
            this.gt()
        }
        if (this.eb === 'bar') {
            this.gj();
            if (this.W === 0) {
                this.gl()
            }
            if (this.co) {
                this.gn()
            }
            this.gu();
            if (this.S) {
                this.gq(this.mH)
            }
            this.gr();
            this.gt()
        }
        if (this.eb === 'pie') {
            this.gv()
        }
        this.gw();
        if (fI) {
            this.fN()
        }
        if (this.cW && this.ga(this.cT)) {
            this.gb()
        }
        var gx;
        var eN;
        var gy;
        var eO;
        if (this.uC === '') {
            gx = gf.gg('0x' + this.ev);
            gy = this.gz('', false, true);
            setTimeout((function (fq) {
                return function () {
                    var fS = document.createElement('div');
                    var fy = gx + 'style="border:0;position:absolute;left:' + (fq.Z.offsetLeft + gy[0]) + 'px;top:' + (fq.Z.offsetTop + gy[1]) + 'px;' + 'z-index:' + (fq.Z.style.zIndex + 1000) + ';"/>';
                    fS.innerHTML = fy;
                    fq.bf.appendChild(fS)
                }
            }(this)), this.eo);
            return
        }
        var ix = 0;
        cHH = this.uC;
        if (this.uC.indexOf(',') == '-1') {
            if (this.uC.indexOf('#SUB') != -1) {
                var gA = this.gB(this.cu)
            } else {
                var gA = this.gC(this.cu)
            }
            if (gA == this.uC) {
                setTimeout(this.gD(), this.eo);
                return
            }
        } else {
            var gE = this.uC.replace(/\s/g, '');
            var gF = gE.split(',');
            var gG = gF.length;
            for (ix = 0; ix < gG; ix++) {
                if (gF[ix].indexOf('#SUB') != -1) {
                    var gA = this.gB(this.cu)
                } else {
                    var gA = this.gC(this.cu)
                }
                if (gA == gF[ix]) {
                    setTimeout(this.gD(), this.eo);
                    return
                }
            }
        }
        gx = gf.gg('0x' + this.ev);
        gy = this.gz('', false, true);
        setTimeout((function (fq) {
            return function () {
                var fS = document.createElement('div');
                var fy = gx + 'style="border:0;position:absolute;left:' + (fq.Z.offsetLeft + gy[0]) + 'px;top:' + (fq.Z.offsetTop + gy[1]) + 'px;' + 'z-index:' + (fq.Z.style.zIndex + 1000) + ';"/>';
                fS.innerHTML = fy;
                fq.bf.appendChild(fS)
            }
        }(this)), this.eo);
        return
    };
    this.gj = function () {
        var gH = this.bN ? this.dp / 15 : 0;
        var gI = this.bO ? this.dq / 15 : 0;
        this.bg.beginPath();
        this.bg.lineWidth = this.X;
        this.bg.strokeStyle = this.f;
        this.bg.moveTo(this.mD, this.u - gI);
        this.bg.lineTo(this.mD, this.ds - this.mB);
        this.bg.lineTo(this.dr - this.mF + gH, this.ds - this.mB);
        this.bg.stroke();
        if (this.mr && this.co && this.eb !== 'line') {
            this.bg.lineWidth = 1;
            this.bg.strokeStyle = this.f;
            this.bg.moveTo(this.mD + this.bB, this.u - gI - this.bB);
            this.bg.lineTo(this.mD + this.bB, this.ds - this.mB - this.bB);
            this.bg.lineTo(this.dr - this.mF + gH + this.bB, this.ds - this.mB - this.bB);
            this.bg.moveTo(this.mD + this.bB, this.ds - this.mB - this.bB);
            this.bg.lineTo(this.mD, this.ds - this.mB)
        }
        this.bg.stroke()
    };
    this.gi = function () {
        this.Z.style.background = 'url(' + this.Y + ')'
    };
    this.gu = function () {
        var eN = this.bh.length;
        var gJ;
        var gK;
        var fh;
        var fm;
        var width = this.gL();
        var ff = this.bD;
        var gM;
        var gN;
        var gO;
        var gP;
        var fl;
        var gQ;
        var gR;
        var gS;
        var gT;
        var coords;
        var fC;
        var gU;
        var gV;
        var eJ;
        var eK;
        var gW;
        var gX;
        var fg;
        var fillStyle;
        var strokeStyle;
        var fD;
        var gY;
        var gZ;
        var ha;
        var hb;
        var hc;
        var eZ;
        var fb = (this.bF !== 1);
        var hd = [];
        var he;
        var hf;
        var hg;
        var hh = 0;
        var hi = 0;
        var hj = 0;
        var hk = -this.C * Math.PI / 180;
        var map;
        var hl;
        var fw;
        this.dZ = this.fp(this.dY);
        if (this.mH) {
            width /= this.w;
            fl = this.dq - this.bD / this.w
        }
        map = this.fu();
        this.fx(map);
        for (var eO = (this.mH) ? eN - 1 : 0;
        (this.mH && eO >= 0) || (!this.mH && eO < eN); eO = (this.mH) ? eO - 1 : eO + 1) {
            gK = this.bh[eO].length - 1;
            hb = false;
            hc = false;
            if (this.mH && eO === eN - 1) {
                fl -= width / gK
            }
            for (gV = 0; gV < gK; gV++) {
                gZ = (typeof this.bv === 'string' || typeof this.bv[gV] === 'undefined') ? this.bw : this.bv[gV];
                gY = (typeof this.by === 'string' || typeof this.by[gV] === 'undefined') ? this.bz : this.by[gV];
                ha = (typeof this.bC === 'string' || typeof this.bC[gV] === 'undefined') ? this.bA : this.bC[gV];
                coords = this.hm(null, this.bh[eO][gV + 1]);
                if (this.mH) {
                    coords = [coords[0], (this.dq + this.bu - coords[1]) * this.w + this.bt]
                }
                fillStyle = this.fM((this.bd !== false) ? this.bd[eO] : gY, ha);
                if (coords[1] > this.bt + this.dp && this.mH) {
                    coords[1] = this.bt + this.dp + 1;
                    ff = coords[1]
                }
                if (coords[1] < this.bu && !this.mH) {
                    coords[1] = this.bu - 1;
                    fl = coords[1]
                }
                if (!this.ct[(this.mH) ? Math.abs(gV - gK) - 1 : gV]) {
                    this.bg.beginPath();
                    this.bg.fillStyle = fillStyle;
                    if (fb === false) {
                        if (this.mH) {
                            this.bg.fillRect(this.bt, this.bu + fl, coords[1] - this.bt, width / gK);
                            if (this.mr) {
                                this.bg.fillStyle = fillStyle;
                                this.bg.moveTo(this.bt, this.bu + fl);
                                this.bg.lineTo(coords[1], this.bu + fl);
                                this.bg.lineTo(coords[1], this.bu + fl + width / gK);
                                this.bg.lineTo(coords[1] + this.bB, this.bu + fl + width / gK - this.bB);
                                this.bg.lineTo(coords[1] + this.bB, this.bu + fl - this.bB);
                                this.bg.lineTo(this.bt + this.bB, this.bu + fl - this.bB);
                                this.bg.fill()
                            }
                        } else {
                            this.bg.fillRect(this.bt + ff, coords[1], width / gK, this.bu + this.dq - coords[1]);
                            if (this.mr) {
                                this.bg.fillStyle = fillStyle;
                                this.bg.moveTo(this.bt + ff, coords[1]);
                                this.bg.lineTo(this.bt + ff + this.bB, coords[1] - this.bB);
                                this.bg.lineTo(this.bt + ff + width / gK + this.bB, coords[1] - this.bB);
                                this.bg.lineTo(this.bt + ff + width / gK + this.bB, this.bu + this.dq - this.bB);
                                this.bg.lineTo(this.bt + ff + width / gK, this.bu + this.dq);
                                this.bg.lineTo(this.bt + ff + width / gK, coords[1]);
                                this.bg.fill()
                            }
                        }
                    } else {
                        fb = Math.round((this.bu + this.dq) / this.bF);
                        if (fb < 3) {
                            fb = 3
                        }
                        if (this.mH) {
                            for (he = this.bt; he < coords[1]; he += fb, hh++) {
                                hg = [];
                                hf = fb;
                                if (he + fb > coords[1]) {
                                    hf = coords[1] - he
                                }
                                hg.push({
                                    moveTo: [he, this.bu + fl]
                                });
                                hg.push({
                                    lineTo: [he + hf, this.bu + fl]
                                });
                                hg.push({
                                    lineTo: [he + hf, this.bu + fl + width / gK]
                                });
                                hg.push({
                                    lineTo: [he, this.bu + fl + width / gK]
                                });
                                if (this.mr) {
                                    hg.push({
                                        moveTo: [he, this.bu + fl]
                                    });
                                    hg.push({
                                        lineTo: [he + this.bB, this.bu + fl - this.bB]
                                    });
                                    hg.push({
                                        lineTo: [he + hf + ha * 0.5 + this.bB, this.bu + fl - this.bB]
                                    });
                                    hg.push({
                                        lineTo: [he + hf + ha * 0.5, this.bu + fl]
                                    })
                                }
                                if (he + fb >= coords[1] && this.mr) {
                                    hg.push({
                                        moveTo: [he + hf, this.bu + fl]
                                    });
                                    hg.push({
                                        lineTo: [he + hf + this.bB, this.bu + fl - this.bB]
                                    });
                                    hg.push({
                                        lineTo: [he + hf + this.bB, this.bu + fl + width / gK - this.bB]
                                    });
                                    hg.push({
                                        lineTo: [he + hf, this.bu + fl + width / gK]
                                    })
                                }
                                hg.push({
                                    fill: []
                                });
                                hd.push({
                                    hg: hg,
                                    hh: hh
                                })
                            }
                        } else {
                            for (he = this.bu + this.dq; he > coords[1]; he -= fb, hh++) {
                                hg = [];
                                hf = fb;
                                if (he - fb < coords[1]) {
                                    hf = he - coords[1]
                                }
                                hg.push({
                                    moveTo: [this.bt + ff, he - hf]
                                });
                                hg.push({
                                    lineTo: [this.bt + ff, he]
                                });
                                hg.push({
                                    lineTo: [this.bt + ff + width / gK, he]
                                });
                                hg.push({
                                    lineTo: [this.bt + ff + width / gK, he - hf]
                                });
                                if (this.mr) {
                                    hg.push({
                                        moveTo: [this.bt + ff + width / gK, he - hf - ha * 0.6]
                                    });
                                    hg.push({
                                        lineTo: [this.bt + ff + width / gK + this.bB, he - hf - ha * 0.6 - this.bB]
                                    });
                                    hg.push({
                                        lineTo: [this.bt + ff + width / gK + this.bB, he - this.bB]
                                    });
                                    hg.push({
                                        lineTo: [this.bt + ff + width / gK, he]
                                    })
                                }
                                if (he - fb < coords[1] && this.mr) {
                                    hg.push({
                                        moveTo: [this.bt + ff, he - hf]
                                    });
                                    hg.push({
                                        lineTo: [this.bt + ff + this.bB, he - hf - this.bB]
                                    });
                                    hg.push({
                                        lineTo: [this.bt + ff + width / gK + this.bB, he - hf - this.bB]
                                    });
                                    hg.push({
                                        lineTo: [this.bt + ff + width / gK, he - hf]
                                    })
                                }
                                hg.push({
                                    fill: []
                                });
                                hd.push({
                                    hg: hg,
                                    hh: hh
                                })
                            }
                        }
                        for (he = 0, gJ = hd.length; he < gJ; he++) {
                            hj = hd[he].hh * 10 + 200;
                            setTimeout((function (fL, hd, fillStyle) {
                                return function () {
                                    fL.beginPath();
                                    fL.fillStyle = fillStyle;
                                    var hn, eJ;
                                    for (var eO = 0, eN = hd.length; eO < eN; eO++) {
                                        for (eJ in hd[eO]) {
                                            hn = hd[eO][eJ].join(',');
                                            eval('fL.' + eJ + '(' + hn + ');')
                                        }
                                    }
                                    fL.closePath()
                                }
                            })(this.bg, hd[he].hg, fillStyle), hj)
                        }
                        hd = []
                    }
                    this.bg.strokeStyle = this.fM(gZ, ha);
                    if (this.bx > 0) {
                        this.bg.lineWidth = this.bx;
                        if (fb === false) {
                            if (this.mH) {
                                this.bg.moveTo(this.bt, this.bu + fl);
                                this.bg.lineTo(coords[1], this.bu + fl);
                                if (coords[1] > this.bt + this.dp) {
                                    this.bg.moveTo(coords[1], this.bu + fl + width / gK)
                                } else {
                                    this.bg.lineTo(coords[1], this.bu + fl + width / gK)
                                }
                                this.bg.lineTo(this.bt, this.bu + fl + width / gK)
                            } else {
                                this.bg.moveTo(this.bt + ff, this.bu + this.dq);
                                this.bg.lineTo(this.bt + ff, coords[1]);
                                if (coords[1] < this.bu) {
                                    this.bg.moveTo(this.bt + ff + width / gK, coords[1])
                                } else {
                                    this.bg.lineTo(this.bt + ff + width / gK, coords[1])
                                }
                                this.bg.lineTo(this.bt + ff + width / gK, this.bu + this.dq)
                            }
                        } else {
                            if (this.mH) {
                                for (he = this.bt; he < coords[1]; he += fb, hi++) {
                                    hf = fb;
                                    hg = [];
                                    if (he + fb > coords[1]) {
                                        hf = coords[1] - he
                                    }
                                    hg.push({
                                        moveTo: [he, this.bu + fl]
                                    });
                                    hg.push({
                                        lineTo: [he + hf, this.bu + fl]
                                    });
                                    hg.push({
                                        moveTo: [he, this.bu + fl + width / gK]
                                    });
                                    hg.push({
                                        lineTo: [he + hf, this.bu + fl + width / gK]
                                    });
                                    if (this.mr) {
                                        if (he === this.bt) {
                                            hg.push({
                                                moveTo: [he, this.bu + fl]
                                            });
                                            hg.push({
                                                lineTo: [he + this.bB, this.bu + fl - this.bB]
                                            })
                                        } else {
                                            hg.push({
                                                moveTo: [he + this.bB, this.bu + fl - this.bB]
                                            })
                                        }
                                        hg.push({
                                            lineTo: [he + hf + this.bB, this.bu + fl - this.bB]
                                        })
                                    }
                                    if (he + hf === coords[1] && he + hf <= this.bt + this.dp) {
                                        hg.push({
                                            moveTo: [he + hf, this.bu + fl]
                                        });
                                        hg.push({
                                            lineTo: [he + hf, this.bu + fl + width / gK]
                                        });
                                        if (this.mr) {
                                            hg.push({
                                                lineTo: [he + hf + this.bB, this.bu + fl + width / gK - this.bB]
                                            });
                                            hg.push({
                                                lineTo: [he + hf + this.bB, this.bu + fl - this.bB]
                                            });
                                            hg.push({
                                                lineTo: [he + hf, this.bu + fl]
                                            })
                                        }
                                    }
                                    hd.push({
                                        hg: hg,
                                        hh: hi
                                    })
                                }
                            } else {
                                for (he = this.bu + this.dq; he > coords[1]; he -= fb, hi++) {
                                    hf = fb;
                                    hg = [];
                                    if (he - fb < coords[1]) {
                                        hf = he - coords[1]
                                    }
                                    hg.push({
                                        moveTo: [this.bt + ff, he]
                                    });
                                    hg.push({
                                        lineTo: [this.bt + ff, he - hf]
                                    });
                                    hg.push({
                                        moveTo: [this.bt + ff + width / gK, he]
                                    });
                                    hg.push({
                                        lineTo: [this.bt + ff + width / gK, he - hf]
                                    });
                                    if (this.mr) {
                                        if (he === this.bu + this.dq) {
                                            hg.push({
                                                moveTo: [this.bt + ff + width / gK, he]
                                            });
                                            hg.push({
                                                lineTo: [this.bt + ff + width / gK + this.bB, he - this.bB]
                                            })
                                        } else {
                                            hg.push({
                                                moveTo: [this.bt + ff + width / gK + this.bB, he - this.bB]
                                            })
                                        }
                                        hg.push({
                                            lineTo: [this.bt + ff + width / gK + this.bB, he - hf - this.bB]
                                        })
                                    }
                                    if (he - hf === coords[1] && he - hf >= this.bu) {
                                        hg.push({
                                            moveTo: [this.bt + ff, he - hf]
                                        });
                                        hg.push({
                                            lineTo: [this.bt + ff + width / gK, he - hf]
                                        });
                                        if (this.mr) {
                                            hg.push({
                                                lineTo: [this.bt + ff + width / gK + this.bB, he - hf - this.bB]
                                            });
                                            hg.push({
                                                lineTo: [this.bt + ff + this.bB, he - hf - this.bB]
                                            });
                                            hg.push({
                                                lineTo: [this.bt + ff, he - hf]
                                            })
                                        }
                                    }
                                    hd.push({
                                        hg: hg,
                                        hh: hi
                                    })
                                }
                            }
                            for (he = 0, gJ = hd.length; he < gJ; he++) {
                                hj = hd[he].hh * 10 + 200;
                                setTimeout((function (fL, hd, strokeStyle, lineWidth) {
                                    return function () {
                                        fL.beginPath();
                                        fL.strokeStyle = strokeStyle;
                                        fL.lineWidth = lineWidth;
                                        var hn, eJ;
                                        for (var eO = 0, eN = hd.length; eO < eN; eO++) {
                                            for (eJ in hd[eO]) {
                                                hn = hd[eO][eJ].join(',');
                                                eval('fL.' + eJ + '(' + hn + ');')
                                            }
                                        }
                                        fL.stroke()
                                    }
                                })(this.bg, hd[he].hg, this.bg.strokeStyle, this.bg.lineWidth), hj)
                            }
                            hd = []
                        }
                        this.bg.stroke();
                        this.bg.closePath();
                        if (coords[1] > this.bt + this.dp && this.mH) {
                            coords[1] = this.bt + this.dp + 1;
                            ff = coords[1];
                            for (gU = ha; gU > 0; gU -= 0.1) {
                                strokeStyle = this.fM((this.bd !== false) ? this.bd[eO] : gY, (gU > ha / 2) ? gU : gU / 2);
                                setTimeout((function (fL, strokeStyle, mr, ho, ff, gQ, gR) {
                                    return function () {
                                        fL.beginPath();
                                        fL.lineWidth = 1;
                                        fL.strokeStyle = strokeStyle;
                                        if (mr) {
                                            fL.moveTo(ff + ho, gQ - ho);
                                            fL.lineTo(ff + ho, gR - ho);
                                            fL.lineTo(ff, gR)
                                        } else {
                                            fL.moveTo(ff, gQ);
                                            fL.lineTo(ff, gR)
                                        }
                                        fL.stroke()
                                    }
                                })(this.bg, strokeStyle, this.mr, this.bB, ff, this.bu + fl, this.bu + fl + width / gK), hj);
                                ff++
                            }
                        }
                        if (coords[1] < this.bu && !this.mH) {
                            coords[1] = this.bu - 1;
                            fl = coords[1];
                            for (gU = ha; gU > 0; gU -= 0.1) {
                                strokeStyle = this.fM((this.bd !== false) ? this.bd[eO] : gY, (gU > ha / 2) ? gU : gU / 2);
                                setTimeout((function (fL, strokeStyle, mr, ho, gM, gN, fl) {
                                    return function () {
                                        fL.beginPath();
                                        fL.lineWidth = 1;
                                        fL.strokeStyle = strokeStyle;
                                        if (mr) {
                                            fL.moveTo(gM, fl);
                                            fL.lineTo(gM + ho, fl - ho);
                                            fL.lineTo(gN + ho, fl - ho)
                                        } else {
                                            fL.moveTo(gM, fl);
                                            fL.lineTo(gN, fl)
                                        }
                                        fL.stroke()
                                    }
                                })(this.bg, strokeStyle, this.mr, this.bB, this.bt + ff, this.bt + ff + width / gK, fl), hj);
                                fl--
                            }
                        }
                        if (coords[1] > this.bt + this.dp && this.mH) {
                            ff = coords[1] + 0.5;
                            for (gU = ha; gU > 0; gU -= 0.1) {
                                strokeStyle = this.fM(gZ, (gU > ha / 2) ? gU : gU / 2);
                                setTimeout((function (fL, strokeStyle, mr, ho, ff, gQ, gR, gS, gT) {
                                    return function () {
                                        fL.beginPath();
                                        fL.lineWidth = 1;
                                        fL.strokeStyle = strokeStyle;
                                        fL.moveTo(ff, gQ);
                                        fL.lineTo(ff, gR);
                                        fL.moveTo(ff, gS);
                                        fL.lineTo(ff, gT);
                                        if (mr) {
                                            fL.moveTo(ff + ho, gQ - ho);
                                            fL.lineTo(ff + ho, gR - ho)
                                        }
                                        fL.stroke()
                                    }
                                })(this.bg, strokeStyle, this.mr, this.bB, ff, this.bu + fl - this.bx / 2, this.bu + fl + this.bx / 2, this.bu + fl - this.bx / 2 + width / gK, this.bu + fl + this.bx / 2 + width / gK), hj);
                                ff++
                            }
                        }
                        if (coords[1] < this.bu && !this.mH) {
                            fl = coords[1] - 0.5;
                            for (gU = ha; gU > 0; gU -= 0.1) {
                                strokeStyle = this.fM(gZ, (gU > ha / 2) ? gU : gU / 2);
                                setTimeout((function (fL, strokeStyle, mr, ho, gM, gN, gO, gP, fl) {
                                    return function () {
                                        fL.beginPath();
                                        fL.lineWidth = 1;
                                        fL.strokeStyle = strokeStyle;
                                        fL.moveTo(gM, fl);
                                        fL.lineTo(gN, fl);
                                        fL.moveTo(gO, fl);
                                        fL.lineTo(gP, fl);
                                        if (mr) {
                                            fL.moveTo(gO + ho, fl - ho);
                                            fL.lineTo(gP + ho, fl - ho)
                                        }
                                        fL.stroke()
                                    }
                                })(this.bg, strokeStyle, this.mr, this.bB, this.bt + ff - this.bx / 2, this.bt + ff + this.bx / 2, this.bt + ff + width / gK - this.bx / 2, this.bt + ff + width / gK + this.bx / 2, fl), hj);
                                fl--
                            }
                        }
                    }
                    if (typeof this.mu[this.bh[eO][0]] !== 'undefined') {
                        if (this.mH) {
                            hl = [this.bt, this.bu + fl, coords[1], this.bu + fl, coords[1], this.bu + fl + width / gK, this.bt, this.bu + fl + width / gK]
                        } else {
                            hl = [this.bt + ff, coords[1], this.bt + ff + width / gK, coords[1], this.bt + ff + width / gK, this.bu + this.dq, this.bt + ff, this.bu + this.dq]
                        }
                        fw = this.fv(map, hl);
                        this.eC(fw, 'click', this.mu[this.bh[eO][0]])
                    }
                    gU = this.bh[eO][0];
                    fD = this.dY[gV + 1];
                    if (typeof fD !== 'undefined' && typeof fD[gU] !== 'undefined') {
                        fC = (typeof fD[gU][1] === 'undefined') ? null : fD[gU][1];
                        fg = this.bh[eO][gV + 1];
                        if (typeof this.bL === 'string') {
                            fg = this.bL + fg
                        }
                        if (typeof this.bM === 'string') {
                            fg = fg + this.bM
                        }
                        if (this.mH) {
                            eJ = coords[1];
                            eK = this.bu + fl + width / gK / 2
                        } else {
                            eJ = this.bt + ff + width / gK / 2;
                            eK = coords[1]
                        }
                        this.fG(this.bh[eO][0], fg, eJ, eK, fC, (typeof fD[gU]['callback'] === 'undefined') ? false : fD[gU]['callback']);
                        this.ea.push(setTimeout(this.hp(this, [eJ, eK], this.bh[eO][0], fg), hj))
                    }
                    fD = this.dY['__all__'];
                    if (typeof fD !== 'undefined' && typeof fD[gU] !== 'undefined') {
                        fC = (typeof fD[gU][1] === 'undefined') ? null : fD[gU][1];
                        fg = this.bh[eO][gV + 1];
                        if (typeof this.bL === 'string') {
                            fg = this.bL + fg
                        }
                        if (typeof this.bM === 'string') {
                            fg = fg + this.bM
                        }
                        if (this.mH) {
                            eJ = coords[1];
                            eK = this.bu + fl + width / gK / 2
                        } else {
                            eJ = this.bt + ff + width / gK / 2;
                            eK = coords[1]
                        }
                        this.fG(this.bh[eO][0], fg, eJ, eK, fC, (typeof fD[gU]['callback'] === 'undefined') ? false : fD[gU]['callback']);
                        this.ea.push(setTimeout(this.hp(this, [eJ, eK], this.bh[eO][0], fg), hj))
                    }
                }
                eZ = (this.J === false) ? this.dv : this.J;
                fh = this.fi(this.bh[eO][0], this.L, null, null, eZ);
                if (this.bh[eO][gV + 1] < this.df) {
                    if (this.mH) {
                        coords[1] = this.mD - 4 - fh
                    } else {
                        coords[1] = this.bu + this.dq
                    }
                }
                if (coords[1] < this.bu - this.hq) {
                    coords[1] = this.bu - this.hq - 5
                }
                if (this.R && !hb) {
                    hb = true;
                    if (this.mH) {
                        fm = this.fn(this.L);
                        this.hr(this.bh[eO][0], this.mD - 4 - fh, this.bu + fl + width / gK - width / 2 - fm / 2, this.L, null, null, null, eZ, this.D)
                    } else {
                        if (this.C > 0) {
                            this.bg.save();
                            this.bg.translate(this.bt + ff + width / 2, this.ds - ((this.N === false) ? this.mB - 4 : this.N) + this.L / 2 + 2);
                            this.bg.rotate(hk);
                            this.hr(this.bh[eO][0], 0 - fh, 0 - this.L / 2 - 2, this.L, null, null, null, eZ, this.D);
                            this.bg.restore()
                        } else {
                            this.hr(this.bh[eO][0], this.bt + ff + width / 2 - fh / 2, this.ds - ((this.N === false) ? this.mB - 4 : this.N), this.L, null, null, null, eZ, this.D)
                        }
                    }
                }
                if (this.bG && !this.ct[(this.mH) ? Math.abs(gV - gK) - 1 : gV]) {
                    fg = (this.bI === 'auto') ? this.bh[eO][gV + 1] : this.bh[eO][gV + 1].toFixed(this.bI);
                    gW = String(this.bh[eO][gV + 1]).lastIndexOf('.');
                    gX = String(this.bh[eO][gV + 1]).substr(gW + 1).length;
                    if (gX > 3 && this.bI === 'auto') {
                        fg = this.fd(this.bh[eO][gV + 1], 3)
                    }
                    if (typeof this.bL === 'string') {
                        fg = this.bL + fg
                    }
                    if (typeof this.bM === 'string') {
                        fg = fg + this.bM
                    }
                    if (this.el !== false) {
                        fg = this.hs(fg)
                    }
                    eZ = (this.bJ === false) ? this.dv : this.bJ;
                    fh = this.fi(String(fg), this.bK, null, null, eZ);
                    if (this.mH) {
                        this.hr(fg, coords[1] + 3, this.bu + fl + width / gK / 2 - fm / 2, this.bK, null, null, null, eZ, this.bH, null, null, null, hj)
                    } else {
                        this.hr(fg, this.bt + ff + width / gK / 2 - fh / 2, coords[1] - this.fn(this.bK) - 3, this.bK, null, null, null, eZ, this.bH, null, null, null, hj)
                    }
                }
                if (!hc) {
                    hc = true;
                    gJ = this.cM.length;
                    eZ = (this.cG === false) ? this.dv : this.cG;
                    for (gU = 0; gU < gJ; gU++) {
                        if (this.cM[gU][0] === this.bh[eO][0]) {
                            fh = this.fi(String(this.cM[gU][1]), this.cI, null, null, eZ);
                            if (this.mH) {
                                this.hr(this.cM[gU][1], (this.cL === false) ? this.mD - 4 - fh : this.cL - fh, this.bu + fl + width / 2 - fm / 2, this.cI, null, null, null, eZ, this.cE)
                            } else {
                                if (this.C > 0) {
                                    this.bg.save();
                                    this.bg.translate(this.bt + ff + width / 2, this.ds - ((this.cK === false) ? this.mB - 10 : this.cK - 4));
                                    this.bg.rotate(hk);
                                    this.hr(this.cM[gU][1], 0 - fh, 0 - this.cI / 2 - 2, this.cI, null, null, null, eZ, this.cE);
                                    this.bg.restore()
                                } else {
                                    this.hr(this.cM[gU][1], this.bt + ff + width / 2 - fh / 2, this.ds - ((this.cK === false) ? this.mB - 4 : this.cK), this.cI, null, null, null, eZ, this.cE)
                                }
                            }
                        }
                    }
                }
                if (this.mH) {
                    if (gV === gK - 1 && typeof this.bh[eO - 1] !== 'undefined') {
                        fl -= width / (this.bh[eO - 1].length - 1);
                        fl -= this.bD * 2 / this.w
                    } else {
                        fl -= width / gK
                    }
                } else {
                    ff = (gV === gK - 1) ? ff + width / gK + 2 * this.bD : ff + width / gK
                }
            }
        }
        this.eo = hj
    };
    this.ht = function (eJ, eK, lineWidth) {
        this.bg.fillRect(eJ - lineWidth / 4, eK - lineWidth / 4, lineWidth / 2, lineWidth / 2)
    };
    this.gn = function () {
        if (this.mH) {
            var hu = this.bO ? this.dq / 15 : 0
        } else {
            var hu = this.bN ? this.dp / 15 : 0
        }
        var fb;
        var ff;
        var fl;
        if (this.W === 0) {
            var fe = this.dd;
            fl = this.bu + this.dq - this.ed;
            ff = (this.mH && this.eb !== 'line') ? this.bt + this.ed * this.w : this.bt;
            while (fe <= this.cZ - this.mK) {
                this.bg.beginPath();
                this.bg.strokeStyle = this.fM(this.cp, this.cr);
                this.bg.lineWidth = 1;
                if (this.mH && this.eb !== 'line') {
                    if (this.mr) {
                        this.bg.moveTo(ff + this.bB, this.bu - hu - this.bB);
                        this.bg.lineTo(ff + this.bB, this.bu + this.dq - this.bB);
                        this.bg.lineTo(ff, this.bu + this.dq)
                    } else {
                        this.bg.moveTo(ff, this.bu - hu);
                        this.bg.lineTo(ff, this.bu + this.dq)
                    }
                    ff += this.ed * this.w
                } else {
                    if (this.mr && this.eb !== 'line') {
                        this.bg.moveTo(this.bt, fl);
                        this.bg.lineTo(this.bt + this.bB, fl - this.bB);
                        this.bg.lineTo(this.bt + this.dp + hu + this.bB, fl - this.bB)
                    } else {
                        this.bg.moveTo(this.bt, fl);
                        this.bg.lineTo(this.bt + this.dp + hu, fl)
                    }
                    fl -= this.ed
                }
                fe += this.mK;
                fe = Number(fe.toFixed(10));
                this.bg.stroke()
            }
        } else {
            var eN = (this.W > 1) ? this.W - 1 : ((this.dg) ? this.bh[0].length : this.bh.length) - 1;
            while (!this.fj(eN)) {
                eN = Math.floor(eN / 2)
            }
            if (this.mH) {
                fb = this.dp / eN;
                ff = this.bt
            } else {
                fb = this.dq / eN;
                fl = this.bu + this.dq - fb
            }
            for (var eO = 1; eO <= eN; eO++) {
                this.bg.beginPath();
                this.bg.strokeStyle = this.fM(this.cp, this.cr);
                this.bg.lineWidth = 1;
                if (this.mH && this.eb !== 'line') {
                    if (this.mr) {
                        this.bg.moveTo(ff, this.bu - hu);
                        this.bg.lineTo(ff, this.bu + this.dq)
                    } else {
                        this.bg.moveTo(ff, this.bu - hu);
                        this.bg.lineTo(ff, this.bu + this.dq)
                    }
                    ff += fb
                } else {
                    if (this.mr && this.eb !== 'line') {
                        this.bg.moveTo(this.bt, fl);
                        this.bg.lineTo(this.bt + this.bB, fl - this.bB);
                        this.bg.lineTo(this.bt + this.dp + hu + this.bB, fl - this.bB)
                    } else {
                        this.bg.moveTo(this.bt, fl);
                        this.bg.lineTo(this.bt + this.dp + hu, fl)
                    }
                    fl -= fb
                }
                this.bg.stroke()
            }
        }
    };
    this.mL = function () {
        var hu = this.bO ? this.dq / 15 : 0;
        var fc;
        var fe;
        var fb;
        var ff;
        if (this.V === 0) {
            fe = this.dc;
            ff = this.bt + this.ec;
            while (fe <= this.cY - this.dn) {
                this.bg.beginPath();
                this.bg.strokeStyle = this.fM(this.cq, this.cs);
                this.bg.lineWidth = 1;
                this.bg.moveTo(ff, this.bu + this.dq);
                this.bg.lineTo(ff, this.bu - hu);
                this.bg.stroke();
                fe += this.dn;
                ff += this.ec
            }
        } else {
            var eN = (this.V > 1) ? this.V - 1 : ((this.dg) ? this.bh[0].length : this.bh.length) - 1;
            while (!this.eP(eN)) {
                eN = Math.floor(eN / 2)
            }
            fb = this.dp / eN;
            fc = (this.da - this.de) / eN;
            fe = this.de;
            ff = this.bt + fb;
            for (var eO = 0; eO <= eN - 1; eO++) {
                this.bg.beginPath();
                this.bg.strokeStyle = this.fM(this.cq, this.cs);
                this.bg.lineWidth = 1;
                this.bg.moveTo(ff, this.bu + this.dq);
                this.bg.lineTo(ff, this.bu - hu);
                this.bg.stroke();
                fe += fc;
                ff += fb
            }
        }
    };
    this.gm = function () {
        var gK = this.bh.length;
        var eN;
        var gJ;
        var eJ;
        var eK;
        var eO;
        var gU;
        var line;
        var coords;
        var hv;
        var hw;
        var hx;
        var hy;
        var lineWidth;
        var hz;
        var hA = [];
        var hB = [];
        var hC = [];
        var fb = (this.bU === 1) ? false : this.dp / this.bU;
        var hD = 0;
        var hE;
        if (this.dY['__all__'] === {}) {
            delete this.dY['__all__']
        }
        this.dZ = this.fp(this.dY);
        for (var hF = 0; hF < gK; hF++) {
            if (this.ct[hF]) {
                continue
            }
            eN = this.bh[hF].length;
            if (this.bP.length === 1) {
                hy = this.bP[0]
            } else {
                hy = (typeof this.bP[hF] === 'undefined') ? this.bP[0] : this.bP[hF]
            }
            if (this.bT.length === 1) {
                hz = this.bT[0]
            } else {
                hz = (typeof this.bT[hF] === 'undefined') ? this.bT[0] : this.bT[hF]
            }
            if (this.bW.length === 1) {
                lineWidth = this.bW[0]
            } else {
                lineWidth = (typeof this.bW[hF] === 'undefined') ? this.bW[0] : this.bW[hF]
            }
            hG = this.fM(hy, hz);
            for (eO = 0; eO < eN; eO++) {
                coords = this.hm(this.bh[hF][eO][0], this.bh[hF][eO][1]);
                if (eO < eN - 1) {
                    hx = this.hm(this.bh[hF][eO + 1][0], this.bh[hF][eO + 1][1]);
                    if (!this.eI(this.bh[hF][eO][0], this.bh[hF][eO][1])) {
                        hv = false;
                        for (gU = coords[0]; gU < hx[0]; gU += 0.01) {
                            if (hx[1] >= coords[1]) {
                                eK = (hx[1] - coords[1]) * (gU - coords[0]) / (hx[0] - coords[0]) + coords[1]
                            } else {
                                eK = (coords[1] - hx[1]) * (gU - coords[0]) / (hx[0] - coords[0]) + coords[1];
                                eK = coords[1] * 2 - eK
                            }
                            if (this.eI(gU, eK, true)) {
                                hv = true;
                                break
                            }
                        }
                        if (!hv) {
                            continue
                        }
                        coords[0] = gU;
                        coords[1] = eK
                    }
                    if (!this.eI(this.bh[hF][eO + 1][0], this.bh[hF][eO + 1][1])) {
                        hv = false;
                        hw = false;
                        for (gU = coords[0]; gU < hx[0]; gU += 0.01) {
                            if (hx[1] >= coords[1]) {
                                eK = (hx[1] - coords[1]) * (gU - coords[0]) / (hx[0] - coords[0]) + coords[1]
                            } else {
                                eK = (coords[1] - hx[1]) * (gU - coords[0]) / (hx[0] - coords[0]) + coords[1];
                                eK = coords[1] * 2 - eK
                            }
                            if (this.eI(gU, eK, true)) {
                                hw = true
                            } else if (hw) {
                                hv = true;
                                break
                            }
                        }
                        if (hv) {
                            hx[0] = gU;
                            hx[1] = eK
                        }
                    }
                    if (fb === false) {
                        this.bg.beginPath();
                        this.bg.strokeStyle = hG;
                        this.bg.lineWidth = lineWidth;
                        this.bg.moveTo(coords[0], coords[1]);
                        this.bg.lineTo(hx[0], hx[1]);
                        this.bg.stroke()
                    } else {
                        for (gU = coords[0]; gU < hx[0]; gU += fb) {
                            if (hx[1] >= coords[1]) {
                                eK = (hx[1] - coords[1]) * (gU - coords[0]) / (hx[0] - coords[0]) + coords[1]
                            } else {
                                eK = (coords[1] - hx[1]) * (gU - coords[0]) / (hx[0] - coords[0]) + coords[1];
                                eK = coords[1] * 2 - eK
                            }
                            hB.push([gU, eK])
                        }
                        hB.push([hx[0], hx[1]]);
                        hA.push(hB);
                        hB = []
                    }
                }
                coords = this.hm(this.bh[hF][eO][0], this.bh[hF][eO][1]);
                line = this.bi[hF];
                eJ = this.bh[hF][eO][0];
                if (typeof this.dY[line] !== 'undefined' && typeof this.dY[line][eJ] !== 'undefined') {
                    if (fb !== false) {
                        hC[coords[0]] = [line, eJ, hF, eO, coords]
                    } else {
                        this.hH(line, eJ, hF, eO, coords)
                    }
                }
                if (typeof this.dY['__all__'] !== 'undefined' && typeof this.dY['__all__'][eJ] !== 'undefined') {
                    if (fb !== false) {
                        hC[coords[0]] = ['__all__', eJ, hF, eO, coords]
                    } else {
                        this.hH('__all__', eJ, hF, eO, coords)
                    }
                }
            }
            if (fb !== false) {
                for (eO = 0, eN = hA.length; eO < eN; eO++) {
                    hB = hA[eO];
                    for (gU = 0, gJ = hB.length; gU < gJ; gU++) {
                        hD += gU + eO;
                        if (typeof hC[hB[gU][0]] !== 'undefined') {
                            gV = hC[hB[gU][0]];
                            this.hH(gV[0], gV[1], gV[2], gV[3], gV[4], hD + 50)
                        }
                        if (gU >= gJ - 1) {
                            continue
                        }
                        hE = hB[gU + 1];
                        setTimeout((function (fL, hB, hE, hG, lineWidth) {
                            return function () {
                                fL.beginPath();
                                fL.strokeStyle = hG;
                                fL.lineWidth = lineWidth;
                                fL.moveTo(hB[0], hB[1]);
                                fL.lineTo(hE[0], hE[1]);
                                fL.stroke()
                            }
                        })(this.bg, hB[gU], hE, hG, lineWidth), hD + 50)
                    }
                }
            }
            hD = 0;
            hB = [];
            hA = []
        }
    };
    this.gv = function () {
        var coords;
        var length;
        var eN = this.bh.length;
        var gJ;
        var start = 0;
        var fa = 0;
        var fC;
        var offsetX;
        var offsetY;
        var color;
        var hI = [];
        var gW;
        var gX;
        var fg;
        var fh;
        var gU;
        var hf;
        var hJ = 1;
        var hK = 1;
        var eZ;
        var fy;
        var map;
        var hL;
        var hM;
        var hl;
        var expand = 2;
        var width;
        var height;
        var canvas;
        var hN = this.cb;
        if (this.ca === 0) {
            this.ca = this.dr / 2
        }
        if (this.cb === 0) {
            this.cb = this.ds / 2
        }
        if (this.cc === 0) {
            this.cc = (this.ds > this.dr) ? this.dr / 3.75 : this.ds / 3.75
        }
        for (var eO = 0; eO < eN; eO++) {
            fa += this.bh[eO][1]
        }
        this.bg.save();
        if (this.mr) {
            gU = this.cc * Math.cos(this.bX * Math.PI / 180);
            hK = gU / this.cc;
            hJ = this.bY * Math.sin(this.bX * Math.PI / 180) / hK;
            this.bg.scale(1, hK);
            this.cb += (this.cb - this.cb * hK) / hK
        }
        for (eO = 0; eO < eN; eO++) {
            length = this.bh[eO][1] * Math.PI * 2 / fa;
            this.bg.beginPath();
            if (this.fK()) {
                this.bg.fill();
                if (length === 0) {
                    length = 0.001
                }
            }
            color = this.hO();
            if (eO > 0) {
                while (hI[hI.length - 1] === color || (eO === eN - 1 && hI[0] === color)) {
                    color = this.hO()
                }
            }
            hI[hI.length] = color;
            fillStyle = this.fM(color, this.bZ);
            if (this.bd !== false) {
                fillStyle = this.fM(this.bd[eO], this.bZ)
            }
            this.bg.fillStyle = fillStyle;
            this.bg.arc(this.ca, this.cb, this.cc, start, start + length, false);
            this.bg.lineTo(this.ca, this.cb);
            this.bg.fill();
            this.bg.closePath();
            if (this.mr && start <= Math.PI) {
                hf = length;
                hP = this.cc * Math.cos(start);
                hQ = this.cc * Math.sin(start);
                if (start + length > Math.PI) {
                    hR = -this.cc;
                    hS = 0;
                    hf = Math.PI - start
                } else {
                    hR = this.cc * Math.cos(start + hf);
                    hS = this.cc * Math.sin(start + hf)
                }
                this.bg.beginPath();
                this.bg.fillStyle = fillStyle;
                this.bg.arc(this.ca, this.cb + hJ, this.cc, start, start + hf, false);
                this.bg.lineTo(this.ca + hR, this.cb + hS + hJ);
                this.bg.arc(this.ca, this.cb, this.cc, start + hf, start, true);
                this.bg.fill();
                this.bg.closePath()
            }
            start += length
        }
        this.bg.restore();
        map = this.fu();
        this.fx(map);
        hL = Math.floor(this.cc / 20);
        start = 0;
        for (eO = 0; eO < eN; eO++) {
            length = this.bh[eO][1] * Math.PI * 2 / fa;
            if (typeof this.mu[this.bh[eO][0]] !== 'undefined') {
                hl = [this.ca, this.cb * hK];
                hf = start;
                hM = length / hL;
                for (gU = 0; gU <= hL; gU++, hf += hM) {
                    hl.push(this.ca + this.cc * Math.cos(hf));
                    hl.push((this.cb + this.cc * Math.sin(hf)) * hK)
                }
                fw = this.fv(map, hl);
                this.eC(fw, 'click', this.mu[this.bh[eO][0]])
            }
            gJ = this.dY.length;
            gU = this.bh[eO][0];
            if (typeof this.dY[gU] !== 'undefined') {
                coords = this.hT(start, length, this.bo);
                fC = (typeof this.dY[gU][1] === 'undefined') ? null : this.dY[gU][1];
                fg = this.bh[eO][1];
                if (typeof this.cm === 'string') {
                    fg = this.cm + fg
                }
                if (typeof this.cn === 'string') {
                    fg = fg + this.cn
                }
                this.fG(this.bh[eO][0], fg, coords[0], coords[1] * hK, fC, (typeof this.dY[gU]['callback'] === 'undefined') ? false : this.dY[gU]['callback']);
                this.ea.push(setTimeout(this.hp(this, coords, this.bh[eO][0], fg, hK), 0))
            }
            if (this.R) {
                coords = this.hT(start, length, this.cg);
                eZ = (this.ce === false) ? this.dv : this.ce;
                if (start + length / 2 < Math.PI / 3 || start + length / 2 >= Math.PI / 3 * 5) {
                    offsetX = 0;
                    offsetY = -this.fn(this.cf) / 2
                } else if (start + length / 2 < Math.PI / 3 * 2) {
                    offsetX = -this.fi(this.bh[eO][0], this.cf, null, null, eZ) / 2;
                    offsetY = 0
                } else if (start + length / 2 < Math.PI / 3 * 4) {
                    offsetX = -this.fi(this.bh[eO][0], this.cf, null, null, eZ);
                    offsetY = -this.fn(this.cf) / 2
                } else if (start + length / 2 < Math.PI / 3 * 5) {
                    offsetX = -this.fi(this.bh[eO][0], this.cf, null, null, eZ) / 2;
                    offsetY = -this.fn(this.cf)
                }
                this.hr(this.bh[eO][0], coords[0] + offsetX, coords[1] * hK + offsetY, this.cf, null, null, null, eZ, this.cd)
            }
            if (this.S) {
                fg = (this.ci === 'auto') ? this.bh[eO][1] : this.bh[eO][1].toFixed(this.ci);
                gW = String(this.bh[eO][1]).lastIndexOf('.');
                gX = String(this.bh[eO][1]).substr(gW + 1).length;
                if (gX > 3 && this.ci === 'auto') {
                    fg = this.fd(this.bh[eO][1], 3)
                }
                if (typeof this.cm === 'string') {
                    fg = this.cm + fg
                }
                if (typeof this.cn === 'string') {
                    fg = fg + this.cn
                }
                if (this.el !== false) {
                    fg = this.hs(fg)
                }
                eZ = (this.cj === false) ? this.dv : this.cj;
                fh = this.fi(String(fg), this.ck, null, null, eZ);
                length = this.bh[eO][1] * Math.PI * 2 / fa;
                coords = this.hT(start, length, this.cl);
                offsetY = -this.fn(this.ck) / 2;
                offsetX = -fh / 2;
                this.hr(fg, coords[0] + offsetX, coords[1] * hK + offsetY, this.ck, null, null, null, eZ, this.mJ)
            }
            start += length
        }
        this.cb = hN
    };
    this.hp = function (hU, coords, hV, hW, hK) {
        return function () {
            if (typeof hK === 'undefined') {
                hK = 1
            }
            var expand = 2;
            var width = hU.bq * 2 + hU.bs * 2 + expand * 2;
            var height = hU.bq * 2 + hU.bs * 2 + expand * 2;
            var fI = false;
            var canvas = document.createElement('CANVAS');
            canvas.setAttribute('id', 'tooltip_' + hU.bb + '_' + hV + '_' + hW + '_flag');
            canvas.style.position = 'absolute';
            canvas.style.width = width + 'px';
            canvas.width = width;
            canvas.style.height = height + 'px';
            canvas.height = height;
            canvas.style.left = (hU.Z.offsetLeft + coords[0] - width / 2) + 'px';
            canvas.style.top = (hU.Z.offsetTop + coords[1] - height / 2) * hK + 'px';
            canvas.style.zIndex = Number(hU.Z.style.zIndex) + 80;
            hU.bf.appendChild(canvas);
            if (!hU.fJ(canvas) && hU.fK()) {
                canvas = G_vmlCanvasManager.initElement(canvas);
                fI = false
            }
            var fL = canvas.getContext('2d');
            fL.beginPath();
            fL.lineWidth = hU.bs;
            fL.strokeStyle = hU.fM(hU.bm, (hU.bs === 0) ? 0 : hU.bp);
            switch (hU.br) {
            case 'square':
                fL.moveTo(canvas.width / 2 - hU.bq, canvas.height / 2 + hU.bq);
                fL.lineTo(canvas.width / 2 - hU.bq, canvas.height / 2 - hU.bq);
                fL.lineTo(canvas.width / 2 + hU.bq, canvas.height / 2 - hU.bq);
                fL.lineTo(canvas.width / 2 + hU.bq, canvas.height / 2 + hU.bq);
                fL.closePath();
                break;
            case 'triangle':
                fL.moveTo(canvas.width / 2 - hU.bq * Math.cos(Math.PI / 6), canvas.height / 2 + hU.bq * Math.cos(Math.PI / 3));
                fL.lineTo(canvas.width / 2, canvas.height / 2 - hU.bq);
                fL.lineTo(canvas.width / 2 + hU.bq * Math.cos(Math.PI / 6), canvas.height / 2 + hU.bq * Math.cos(Math.PI / 3));
                fL.closePath();
                break;
            case 'diamond':
                fL.moveTo(canvas.width / 2 - hU.bq, canvas.height / 2);
                fL.lineTo(canvas.width / 2, canvas.height / 2 - hU.bq);
                fL.lineTo(canvas.width / 2 + hU.bq, canvas.height / 2);
                fL.lineTo(canvas.width / 2, canvas.height / 2 + hU.bq);
                fL.closePath();
                break;
            case 'circle':
            default:
                fL.arc(canvas.width / 2, canvas.height / 2, hU.bq, 0, Math.PI * 2, false)
            }
            if (hU.bn !== false) {
                fL.fillStyle = hU.fM(hU.bn, hU.bp);
                fL.fill()
            }
            fL.stroke();
            if (fI) {
                hU.fN(canvas)
            }
        }
    };
    this.hX = function (hY) {
        if (hY === "" || hY === "0" || hY === 0 || hY === null || hY === false || hY === []) {
            return false
        }
        return true
    };
    this.ft = function () {
        if (this.bb !== '' && document.getElementById(this.bb)) {
            return true
        }
        return false
    };
    this.hZ = function (fontsize, ia, ib, ic, eZ, color, fE, mM, id) {
        var ie = [];
        ie.fontsize = (typeof fontsize === 'undefined' || fontsize === null) ? this.dw : fontsize;
        ie.ia = (typeof ia === 'undefined' || ia === null) ? this.dx : ia;
        ie.ib = (typeof ib === 'undefined' || ib === null) ? this.dy : ib;
        ie.ic = (typeof ic === 'undefined') || ic === null ? this.dt : ic;
        ie.eZ = (typeof eZ === 'undefined' || eZ === null) ? this.dv : eZ;
        ie.color = (typeof color === 'undefined' || color === null) ? this.du : color;
        ie.fE = (typeof fE === 'undefined' || fE === null) ? this.dA : fE;
        ie.mM = (typeof mM === 'undefined' || mM === null) ? this.dB : mM;
        ie.id = (typeof id === 'undefined' || id === null) ? this.dz : id;
        return ie
    };
    this.hs = function (eO) {
        eO = String(eO);
        var mN = false;
        var hi = false;
        var ig = '';
        var hF;
        if (this.el === '.') {
            var ih = '.';
            var ii = ','
        } else {
            var ih = ',';
            var ii = '.'
        }
        var ij = eO.lastIndexOf('.');
        if (ij === -1) {
            mN = eO
        } else {
            mN = eO.substr(0, ij);
            hi = eO.substr(ij + 1)
        }
        for (var gU = mN.length - 1, fb = 0; gU >= 0; gU--, fb++) {
            hF = mN.substr(gU, 1);
            if (/[0-9]/.test(hF)) {
                if (fb === 3) {
                    fb = -1;
                    gU++;
                    ig = ii + ig
                } else {
                    ig = hF + ig
                }
            }
        }
        return (hi === false) ? ig : ig + ih + hi
    };
    this.gL = function () {
        var mO = this.dp / this.bh.length;
        this.bD = Math.round(mO * this.bE / 100);
        return mO - 2 * this.bD
    };
    this.hm = function (eJ, eK) {
        var il = [null, null];
        if (typeof eJ === 'number') {
            il[0] = (this.V === 0) ? (eJ - this.dc) * this.ec / this.dn + this.bt : (eJ - this.de) * this.ec + this.bt
        }
        if (typeof eK === 'number') {
            il[1] = (this.W === 0) ? (this.cZ - eK) * this.ed / this.mK + this.bu : (this.db - eK) * this.ed + this.bu
        }
        return il
    };
    this.gd = function () {
        this.ev += '3438633565656f556b6953526b5a4642586c34654e54553139505831446255766b735363346d494742676259753364766949396d7a35364e4a456e7332376550697863764d6e5871564a496e544b4270337a3475584c69414941696b70715251554668496658303935382b66443230614942674d6b70575678583333336365755862766f36656e427369786959324f5a4d574d4767554141683850422f7633372b65797a7a363654706f526236576b57513471475a5131356a45304534595a774d3632684e554e39487469456d396663436a524245454a65497767436b6953462b6a704e3078676348475459734747684247525a467637504d396531337648616e434149324f31324a456b69454169674777594f5263466d7377335a4377595a39506c433548366a486863494244414d4134664445516f39777a424376616c706d6969663237747477793441306d334b586c45413058626e716f4a6c57556953644e3270583575585a5a6e49794d6a7276305551626c49646270797a4c417446555642757443644a49587533456a437648634a316832797a3356626c45506e2f472f38657375752f59507a66414a733635526171544736584141414141456c46546b5375516d43432220';
        this.gh += 'f6e2e686f73746e616d65';
        this.de = this.im();
        this.df = this.mP();
        this.da = this.io();
        this.db = this.ip();
        if (this.eb === 'bar') {
            var iq = 0;
            while (this.db - this.df < (this.df - iq) * 20 / 100) {
                iq = (this.df - iq) * 90 / 100 + iq
            }
            this.df = iq
        }
        if (this.eb === 'line') {
            if (this.cy !== false && this.cw !== false && this.cy > this.cw) {
                this.eA('_invalidIntervalX');
                this.cy = false;
                this.cw = false
            } else {
                if (this.cy !== false) {
                    this.de = this.cy
                }
                if (this.cw !== false) {
                    this.da = this.cw
                }
            }
        }
        if (this.eb === 'line' || this.eb === 'bar') {
            if (this.cz !== false && this.cx !== false && this.cz > this.cx) {
                this.eA('_invalidIntervalY');
                this.cz = false;
                this.cx = false
            } else {
                if (this.cz !== false) {
                    this.df = this.cz
                } else if (this.eb === 'bar') {
                    this.df = 0
                }
                if (this.cx !== false) {
                    this.db = this.cx
                }
            }
        }
    };
    this.io = function () {
        var ir;
        var eN;
        var eO;
        if (this.dg) {
            var gK = this.bh.length;
            for (var hF = 0; hF < gK; hF++) {
                eN = this.bh[hF].length;
                for (eO = 0; eO < eN; eO++) {
                    if (typeof ir === 'undefined') {
                        ir = this.bh[hF][eO][0]
                    } else {
                        if (ir < this.bh[hF][eO][0]) {
                            ir = this.bh[hF][eO][0]
                        }
                    }
                }
            }
        } else {
            eN = this.bh.length;
            for (eO = 0; eO < eN; eO++) {
                if (eO === 0) {
                    ir = this.bh[eO][0]
                } else {
                    if (ir < this.bh[eO][0]) {
                        ir = this.bh[eO][0]
                    }
                }
            }
        }
        return ir
    };
    this.ip = function () {
        var ir;
        var gK;
        var eN;
        var eO;
        var hF;
        if (this.dg) {
            gK = this.bh.length;
            for (hF = 0; hF < gK; hF++) {
                eN = this.bh[hF].length;
                for (eO = 0; eO < eN; eO++) {
                    if (typeof ir === 'undefined') {
                        ir = this.bh[hF][eO][1]
                    } else {
                        if (ir < this.bh[hF][eO][1]) {
                            ir = this.bh[hF][eO][1]
                        }
                    }
                }
            }
        } else {
            eN = this.bh.length;
            for (eO = 0; eO < eN; eO++) {
                gK = this.bh[eO].length - 1;
                for (hF = 1; hF <= gK; hF++) {
                    if (eO === 0 && hF === 1) {
                        ir = this.bh[eO][hF]
                    } else {
                        if (ir < this.bh[eO][hF]) {
                            ir = this.bh[eO][hF]
                        }
                    }
                }
            }
        }
        return ir
    };
    this.im = function () {
        var ir;
        var is;
        var eO;
        if (this.dg) {
            var gK = this.bh.length;
            var eO;
            for (var hF = 0; hF < gK; hF++) {
                eN = this.bh[hF].length;
                for (eO = 0; eO < eN; eO++) {
                    if (typeof ir === 'undefined') {
                        ir = this.bh[hF][eO][0]
                    } else {
                        if (ir > this.bh[hF][eO][0]) {
                            ir = this.bh[hF][eO][0]
                        }
                    }
                }
            }
        } else {
            eN = this.bh.length;
            for (eO = 0; eO < eN; eO++) {
                if (eO === 0) {
                    ir = this.bh[eO][0]
                } else {
                    if (ir > this.bh[eO][0]) {
                        ir = this.bh[eO][0]
                    }
                }
            }
        }
        return ir
    };
    this.mP = function () {
        var ir;
        var eN;
        var eO;
        if (this.dg) {
            var gK = this.bh.length;
            for (var hF = 0; hF < gK; hF++) {
                eN = this.bh[hF].length;
                for (eO = 0; eO < eN; eO++) {
                    if (typeof ir === 'undefined') {
                        ir = this.bh[hF][eO][1]
                    } else {
                        if (ir > this.bh[hF][eO][1]) {
                            ir = this.bh[hF][eO][1]
                        }
                    }
                }
            }
        } else {
            eN = this.bh.length;
            for (eO = 0; eO < eN; eO++) {
                if (eO === 0) {
                    ir = this.bh[eO][1]
                } else {
                    if (ir > this.bh[eO][1]) {
                        ir = this.bh[eO][1]
                    }
                }
            }
        }
        return ir
    };
    this.hT = function (start, length, fF) {
        var coords;
        if (start + length / 2 < Math.PI / 2) {
            coords = this.it(start, start + length, this.ca, this.cb, this.cc + fF)
        } else if (start + length / 2 < Math.PI) {
            coords = this.iu(start, start + length, this.ca, this.cb, this.cc + fF)
        } else if (start + length / 2 < Math.PI + Math.PI / 2) {
            coords = this.iv(start, start + length, this.ca, this.cb, this.cc + fF)
        } else {
            coords = this.iw(start, start + length, this.ca, this.cb, this.cc + fF)
        }
        return coords
    };
    this.it = function (mQ, iy, eJ, eK, iz) {
        var hk = (iy - mQ) / 2 + mQ;
        return [eJ + iz * Math.cos(hk), eK + iz * Math.sin(hk)]
    };
    this.iu = function (mQ, iy, eJ, eK, iz) {
        var hk = (iy - mQ) / 2 + Math.PI - iy;
        return [eJ - iz * Math.cos(hk), eK + iz * Math.sin(hk)]
    };
    this.iv = function (mQ, iy, eJ, eK, iz) {
        var hk = (iy - mQ) / 2 + mQ - Math.PI;
        return [eJ - iz * Math.cos(hk), eK - iz * Math.sin(hk)]
    };
    this.iw = function (mQ, iy, eJ, eK, iz) {
        var hk = 2 * Math.PI - mQ - (iy - mQ) / 2;
        return [eJ + iz * Math.cos(hk), eK - iz * Math.sin(hk)]
    };
    this.hO = function () {
        var index = Math.abs(Math.round(Math.random() * this.be.length - 1));
        return this.be[index]
    };
    this.fn = function (size) {
        if (!this.dH) {
            return get_textHeight(size)
        }
        var size = (typeof size === 'undefined') ? 12 : size;
        return 32 * (size / 25)
    };
    this.fi = function (text, fontsize, ib, ic, eZ) {
        this.bg.font = (this.fK()) ? fontsize + this.bl + this.bk + 'px "' + eZ + '"' : fontsize + this.bk + 'px "' + eZ + '"';
        if (!this.dH) {
            return get_textWidth(text, fontsize, ib, ic, 'sans-serif')
        } else {
            return this.bg.measureText(text).width
        }
    };
    this.gz = function (iA, iB, iC) {
        var iD;
        var fontSize;
        var hK = 1;
        var gU;
        var eZ = (this.eg === false) ? this.dv : this.eg;
        if (iB) {
            switch (this.ej) {
            case 'ne':
                iD = 0;
                break;
            case 'se':
                iD = 1;
                break;
            case 'sw':
                iD = 2;
                break;
            default:
                iD = 3
            }
            fontSize = this.eh
        } else {
            iD = parseInt(Math.random() * 4, 10);
            iD = 3;
            fontSize = this.eq;
            eZ = 'arial'
        }
        var ff;
        var fl;
        if (this.eb === 'pie') {
            if (this.cb === 0) {
                this.cb = this.ds / 2
            }
            if (this.mr) {
                gU = this.cc * Math.cos(this.bX * Math.PI / 180);
                hK = gU / this.cc
            }
        }
        if (iC) {
            switch (iD) {
            case 0:
                ff = this.dr - this.et;
                fl = 0;
                break;
            case 1:
                ff = this.dr - this.et;
                fl = this.ds - this.es;
                break;
            case 2:
                ff = 0;
                fl = this.ds - this.es;
                break;
            default:
                ff = 0;
                fl = 0
            }
        } else {
            switch (iD) {
            case 0:
                if (this.eb === 'pie') {
                    fl = this.cb - this.cc - this.cg - this.cf - this.fn(fontSize) - 5;
                    ff = this.ca + this.cb - fl - this.fi(iA, fontSize, null, null, eZ)
                } else {
                    ff = this.dr - this.mF - this.fi(iA, fontSize, null, null, eZ);
                    fl = this.bu
                }
                break;
            case 1:
                if (this.eb === 'pie') {
                    fl = this.cb + this.cc + this.cg + this.cf + 5;
                    ff = this.ca + fl - this.cb - this.fi(iA, fontSize, null, null, eZ)
                } else {
                    ff = this.dr - this.mF - this.fi(iA, fontSize, null, null, eZ);
                    fl = this.ds - this.mB - this.fn(fontSize) - 5
                }
                break;
            case 2:
                if (this.eb === 'pie') {
                    fl = this.cb + this.cc + this.cg + this.cf + 5;
                    ff = this.ca - (fl - this.cb) - 5
                } else {
                    ff = this.mD + 5;
                    fl = this.ds - this.mB - this.fn(fontSize) - 5
                }
                break;
            default:
                if (this.eb === 'pie') {
                    fl = this.cb - this.cc - this.cg - this.cf - this.fn(fontSize) - 5;
                    ff = this.ca - (this.cb - fl) + 5
                } else {
                    ff = this.mD + 5;
                    fl = this.bu
                }
            }
        }
        return [ff, fl]
    };
    this.gC = function (host) {
        var iE = host.split('.');
        var eN = iE.length;
        var iF = '';
        for (var eO = 0; eO < eN; eO++) {
            iF += this.iG.iH(iE[eO])
        }
        iF = this.iG.iH(iF);
        iF += '-' + this.ex;
        return this.iG.iH(iF)
    };
    this.iI = function (iJ) {
        iJ = iJ.replace(new RegExp(/^\s+/), "");
        iJ = iJ.replace(new RegExp(/\s+$/), "");
        iJ = iJ.replace(new RegExp(/\\/g), "/");
        iJ = iJ.replace(new RegExp(/^http\:\/\/|^https\:\/\/|^ftp\:\/\//i), "");
        iJ = iJ.replace(new RegExp(/^www\./i), "");
        iJ = iJ.replace(new RegExp(/\/(.*)/), "");
        var iK = '';
        if (iJ.match(new RegExp(/\.[a-z]{2,3}\.[a-z]{2}$/i))) {
            iK = iJ.match(new RegExp(/\.[a-z]{2,3}\.[a-z]{2}$/i)).join("");
            iJ = iJ.replace(new RegExp(/\.[a-z]{2,3}\.[a-z]{2}$/i), "")
        } else if (iJ.match(new RegExp(/\.[a-z]{2,4}$/i))) {
            iK = iJ.match(new RegExp(/\.[a-z]{2,4}$/i)).join("");
            iJ = iJ.replace(new RegExp(/\.[a-z]{2,4}$/i), "")
        }
        var iL = iJ.split(".");
        iJ = String(iL[iL.length - 1]).concat(iK);
        return iJ
    };
    this.gB = function (host) {
        var iM = this.iI(host);
        var iE = iM.split('.');
        var eN = iE.length;
        var iN = eN - 2;
        var iF = '';
        for (var eO = iN; eO < eN; eO++) {
            iF += this.iG.iH(iE[eO])
        }
        iF = this.iG.iH(iF);
        iF += '-' + this.ez;
        return this.iG.iH(iF) + '#SUB'
    };
    this.fM = function (color, iO) {
        if (typeof color === 'undefined' || (color.length !== 4 && color.length !== 7)) {
            this.eA('_invalidColor');
            return false
        }
        if (color.length === 4) {
            color = ('#' + color.substring(1, 2)) + color.substring(1, 2) + color.substring(2, 3) + color.substring(2, 3) + color.substring(3, 4) + color.substring(3, 4)
        }
        var iP = parseInt(color.substring(1, 7).substring(0, 2), 16);
        var iQ = parseInt(color.substring(1, 7).substring(2, 4), 16);
        var hi = parseInt(color.substring(1, 7).substring(4, 6), 16);
        return 'rgba(' + iP + ', ' + iQ + ', ' + hi + ', ' + iO + ')'
    };
    this.iR = function (iE, iS) {
        for (var eO = 0, eN = iE.length; eO < eN; eO++) {
            if (iE[eO] === iS) {
                return true
            }
        }
        return false
    };
    this.iT = function (name, type, code, ik, resize) {
        if (typeof code === 'undefined') {
            code = '';
            ik = ''
        }
        if (!this.eL(name)) {
            this.iU = true;
            this.eA('_noName');
            return
        }
        this.dh = name;
        this.bf = document.getElementById(name);
        this.bf.innerHTML = '';
        if (!this.eM(type)) {
            this.cv = true;
            this.eA('_noType');
            return
        }
        eval(gf.gg('0x746869732e75433d636f6465'));
        eval(gf.gg('0x746869732e754b3d696b'));
        if (resize) {
            var width = this.bf.style.width;
            var height = this.bf.style.height;
            this.iV(width, height)
        }
    };
    this.iW = function (data) {
        var iX = this.ms[this.eb];
        if (!this.ga(data)) {
            return false
        }
        var eN = data.length;
        for (var eO = 0; eO < eN; eO++) {
            if (!this.ga(data[eO])) {
                return false
            }
            if (data[eO].length < iX.length) {
                return false
            }
            gJ = 2;
            for (var gU = 0; gU < gJ; gU++) {
                if (typeof data[eO][gU] !== iX[gU]) {
                    return false
                }
                if (isNaN(data[eO][gU]) && iX[gU] === 'number') {
                    return false
                }
            }
        }
        return true
    };
    this.ga = function (data) {
        if (data instanceof Array) {
            return true
        }
        return false
    };
    this.fJ = function (iY) {
        return (iY.getContext)
    };
    this.iZ = function (iY) {
        return Object.prototype.toString.call(iY) === "[object Function]"
    };
    this.fK = function () {
        var ja = navigator.userAgent.toLowerCase();
        return (!/^opera/.test(ja) && /msie/.test(ja))
    };
    this.jb = function () {
        var ja = navigator.userAgent.toLowerCase();
        return (/mozilla/.test(ja) && !/(compatible|webkit)/.test(ja))
    };
    this.jc = function () {
        var ja = navigator.userAgent.toLowerCase();
        var version = Number(ja.lastIndexOf('/'));
        return (/^opera/.test(ja) && version < 10.50)
    };
    this.fZ = function () {
        return (typeof this.bg.measureText !== 'undefined')
    };
    this.jd = function (je) {
        je = JSON.parse(je);
        if (typeof je.JSChart === 'undefined') {
            this.eA('_xmlUnexpectedFormat');
            return
        } else {
            var jf = document.createElement('JSChart');
            var jg;
            var jh;
            var data;
            var ji;
            var jj;
            var eO;
            var gU;
            var eN;
            if (typeof je.JSChart['datasets'] === 'undefined') {
                this.eA('_xmlUnexpectedFormat');
                return
            } else {
                jg = je.JSChart['datasets'];
                eN = jg.length;
                for (eO = 0; eO < eN; eO++) {
                    jh = jg[eO];
                    jk = document.createElement('dataset');
                    if (typeof jh.usestring === 'string' && jh.usestring === 'true') {
                        jk.setAttribute('usestring', true)
                    }
                    if (typeof jh.type === 'string') {
                        jk.setAttribute('type', jh['type'])
                    }
                    if (typeof jh.id === 'string') {
                        jk.setAttribute('id', jh['id'])
                    }
                    if (typeof jh['data'] !== 'undefined' && typeof jh['data'] !== 'undefined') {
                        gJ = jh['data'].length;
                        for (gU = 0; gU < gJ; gU++) {
                            jl = document.createElement('data');
                            jl.setAttribute('unit', jh['data'][gU]['unit']);
                            jl.setAttribute('value', jh['data'][gU]['value']);
                            jk.appendChild(jl)
                        }
                    }
                    jf.appendChild(jk)
                }
                if (typeof je.JSChart['colorset'] !== 'undefined') {
                    jm = je.JSChart['colorset'];
                    eN = jm.length;
                    jn = document.createElement('colorset');
                    for (eO = 0; eO < eN; eO++) {
                        jo = document.createElement('color');
                        jo.setAttribute('value', jm[eO]);
                        jn.appendChild(jo)
                    }
                    jf.appendChild(jn)
                }
                if (typeof je.JSChart['optionset'] !== 'undefined') {
                    ji = je.JSChart['optionset'];
                    eN = ji.length;
                    jp = document.createElement('optionset');
                    for (eO = 0; eO < eN; eO++) {
                        jq = document.createElement('option');
                        jq.setAttribute('set', ji[eO]['set']);
                        jq.setAttribute('value', ji[eO]['value']);
                        jp.appendChild(jq)
                    }
                    jf.appendChild(jp)
                }
            }
        }
        jr = document.createElement('json');
        jr.appendChild(jf);
        return jr
    };
    this.hH = function (line, eJ, hF, eO, coords, hj) {
        if (typeof this.dY[line] === 'undefined' || typeof this.dY[line][eJ] === 'undefined') {
            return false
        }
        if (typeof this.dY[line][eJ][2] !== 'undefined' && this.dY[line][eJ][2] !== this.bi[hF]) {
            return false
        }
        if (this.iR(this.dP, coords)) {
            return false
        }
        this.dP.push(coords);
        var fC = (typeof this.dY[line][eJ][1] === 'undefined') ? null : this.dY[line][eJ][1];
        var hV = this.bh[hF][eO][0];
        if (typeof this.P === 'string') {
            hV = this.P + hV
        }
        if (typeof this.P === 'string') {
            hV = hV + this.P
        }
        var hW = this.bh[hF][eO][1];
        if (typeof this.Q === 'string') {
            hW = this.Q + hW
        }
        if (typeof this.U === 'string') {
            hW = hW + this.U
        }
        this.fG(hV, hW, coords[0], coords[1], fC, (typeof this.dY[line][eJ]['callback'] === 'undefined') ? false : this.dY[line][eJ]['callback']);
        if (typeof hj === 'undefined') {
            hj = 0
        }
        this.ea.push(setTimeout(this.hp(this, coords, hV, hW), hj))
    };
    this.js = function (jt) {
        var jr;
        if (!this.fK()) {
            window.onerror = (function (iY, err) {
                if (iY) {
                    return function () {
                        alert(err)
                    }
                }
                return function () {}
            })(this.dm, this.eB._xmlFileNotLoaded)
        }
        try {
            jr = new ActiveXObject('Microsoft.XMLHTTP')
        } catch (ju) {
            try {
                var jr = new XMLHttpRequest()
            } catch (err) {
                alert(err.message);
                return
            }
        }
        jr.open("GET", jt, false);
        jr.setRequestHeader("Content-Type", "application/json, text/javascript");
        jr.send(null);
        jr = jr.responseText;
        jr.async = false;
        return jr
    };
    this.jv = function (jt, fg) {
        var jr;
        fg = (typeof fg !== 'undefined' && fg === true);
        if (!this.fK()) {
            window.onerror = (function (iY, err) {
                if (iY) {
                    return function () {
                        alert(err)
                    }
                }
                return function () {}
            })(this.dm, this.eB._xmlFileNotLoaded)
        }
        try {
            jr = new ActiveXObject('Microsoft.XMLDOM')
        } catch (ju) {
            try {
                if (!fg) {
                    var jw = new XMLHttpRequest();
                    jw.open("GET", jt, false);
                    jw.setRequestHeader("Content-Type", "text/xml");
                    jw.send(null);
                    jr = jw.responseXML
                }
            } catch (err) {
                alert(err.message);
                return
            }
        }
        var jx;
        if (fg) {
            if (this.fK()) {
                jx = jr.loadXML(jt)
            } else {
                var jy = new DOMParser();
                jr = jy.parseFromString(jt, "text/xml");
                jx = true
            }
        } else {
            jr.async = false;
            jx = this.fK() ? jr.load(jt) : true
        }
        if (!jx) {
            this.eA('_xmlFileNotLoaded');
            return
        }
        return jr
    };
    this.jz = function (eJ, iq) {
        return Math.log(eJ) / Math.log(iq)
    };
    this.jA = function (jr) {
        if (typeof jr === 'undefined') {
            return false
        }
        var jB = [];
        var jC = [];
        var jD = [];
        if (jr.getElementsByTagName('JSChart').length !== 1) {
            this.eA('_xmlUnexpectedFormat');
            return
        }
        var jE = jr.getElementsByTagName('JSChart')[0];
        var eN = jE.childNodes.length;
        var gJ;
        var gK;
        var jF;
        var data;
        var color;
        var eb;
        var jG;
        var jH;
        var jI;
        var jJ;
        var jK;
        var gU;
        var gV;
        var id;
        var jL;
        var newValue;
        var jM;
        for (var eO = 0; eO < eN; eO++) {
            jF = jE.childNodes[eO];
            if (typeof jF === 'undefined') {
                continue
            }
            if (String(jF.tagName).toLowerCase() === 'dataset') {
                eb = jF.getAttribute('type');
                if (eb === null || eb === '') {
                    this.eA('_xmlEmptyType');
                    return
                }
                this.eb = eb;
                gJ = jF.childNodes.length;
                if (gJ < 1) {
                    this.eA('_xmlEmptyData');
                    return
                }
                gK = 0;
                jK = (jF.getAttribute('usestring') === 'true');
                for (gU = 0; gU < gJ; gU++) {
                    data = jF.childNodes[gU];
                    if (String(data.tagName).toLowerCase() === 'data') {
                        jH = data.getAttribute('unit');
                        jI = data.getAttribute('value');
                        if (jH === null || jH === '' || jI === null || jI === '') {
                            this.eA('_xmlMalformedData');
                            return
                        }
                        switch (eb) {
                        case 'bar':
                            if (jI.indexOf(',') > -1) {
                                newValue = [String(jH)];
                                jM = jI.split(',');
                                for (gV = 0; gV < jM.length; gV++) {
                                    newValue.push(Number(jM[gV]))
                                }
                                jB.push(newValue);
                                if (gK < jM.length) {
                                    gK = jM.length
                                }
                            } else {
                                jB.push([String(jH), Number(jI)])
                            }
                            break;
                        case 'pie':
                            if (isNaN(Number(jI))) {
                                this.eA('_xmlMalformedData');
                                return
                            }
                            jB.push([String(jH), Number(jI)]);
                            break;
                        default:
                            if (isNaN(Number(jI))) {
                                this.eA('_xmlMalformedData');
                                return
                            }
                            if (/^[0-9.]*$/.test(jH) && !jK) {
                                jB.push([Number(jH), Number(jI)])
                            } else {
                                jB.push([String(jH), Number(jI)]);
                                this.bV = true
                            }
                        }
                    }
                }
                if (this.eb === 'bar') {
                    for (gU = 0; gU < gK; gU++) {
                        this.cV.push([this.bz, String(gU + 1), gU + 1]);
                        this.ct.push(false)
                    }
                }
                if (typeof jB[0][0] === 'string' && this.eb === 'line') {
                    if (this.bh.length === 0) {
                        for (gV = 0, gJ = jB.length; gV < gJ; gV++) {
                            this.cM.push([gV, String(jB[gV][0]), 'x-value']);
                            this.bj[jB[gV][0]] = gV;
                            jB[gV][0] = gV
                        }
                    } else {
                        var min = this.im();
                        var max = this.io();
                        var fb = Math.round((max - min) / (jB.length - 1));
                        for (var jN = 0, gV = min; gV < max, jN < jB.length; gV += fb, jN++) {
                            this.cM.push([gV, String(jB[jN][0]), 'x-value']);
                            this.bj[jB[jN][0]] = gV;
                            jB[jN][0] = gV
                        }
                    }
                    this.R = false
                }
                id = false;
                jL = jF.getAttribute('id');
                if (jL !== null && jL !== '') {
                    id = jL
                }
                if (this.eb === 'line') {
                    this.dg = true;
                    if (this.bh === []) {
                        this.bh = new Array(jB)
                    } else {
                        this.bh.push(jB)
                    }
                    var index = String(this.bh.length - 1);
                    this.bi[index] = (id === false) ? '_autoid_' + index : id;
                    if (typeof this.bP[index] === 'undefined') {
                        this.bP[index] = this.bQ
                    }
                    if (typeof this.bT[index] === 'undefined') {
                        this.bT[index] = this.bR
                    }
                    if (typeof this.bW[index] === 'undefined') {
                        this.bW[index] = this.bS
                    }
                    this.cX.push([this.bQ, this.bi[index], this.bi[index]])
                } else {
                    this.bh = jB
                }
                jB = []
            }
            if (String(jF.tagName).toLowerCase() === 'colorset') {
                gJ = jF.childNodes.length;
                for (gU = 0; gU < gJ; gU++) {
                    color = jF.childNodes[gU];
                    if (String(color.tagName).toLowerCase() === 'color') {
                        jG = color.getAttribute('value');
                        if (jG === null || jG === '') {
                            this.eA('_xmlMalformedColor');
                            return
                        }
                        jC.push(jG)
                    }
                }
                this.bd = jC
            }
            if (String(jF.tagName).toLowerCase() === 'optionset') {
                gJ = jF.childNodes.length;
                for (gU = 0; gU < gJ; gU++) {
                    color = jF.childNodes[gU];
                    if (String(color.tagName).toLowerCase() === 'option') {
                        jJ = color.getAttribute('set');
                        jI = color.getAttribute('value');
                        jL = color.getAttribute('id');
                        if (jJ === null || jJ === '' || jI === null || jI === '') {
                            this.eA('_xmlMalformedOption');
                            return
                        }
                        if (jL === null || jL === '') {
                            jD.push([jJ, jI])
                        } else {
                            jD.push([jJ, jI, jL])
                        }
                    }
                }
            }
        }
        return jD
    };
    this.fd = function (mN, jM) {
        var hi = Number(mN);
        return Number(hi.toFixed(jM))
    };
    this.gk = function (eQ) {
        var jO;
        var fe;
        var jP;
        var gW;
        var gX;
        var fg;
        var fh;
        var jQ = 1;
        var fa = 0;
        if (eQ) {
            var eS = this.df;
            var eR = this.db
        } else {
            var eS = this.de;
            var eR = this.da
        }
        while (fa < this.dp) {
            jO = this.jR(eS, eR, jQ);
            this.dc = jO[0];
            this.cY = jO[1];
            this.dn = jO[2];
            fe = this.dc;
            jP = 0;
            while (fe <= this.cY) {
                fg = (this.F === 'auto') ? fe : fe.toFixed(this.F);
                gW = String(fe).lastIndexOf('.');
                gX = String(fe).substr(gW + 1).length;
                if (gX > 3 && this.F === 'auto') {
                    fg = this.fd(fe, 3)
                }
                fh = this.fi(String(fg), this.L, null, null, this.L);
                fa += fh;
                fe += this.dn;
                jP++;
                if (jP < 1) {
                    fa -= fh / 2
                }
            }
            fa -= fh / 2;
            jQ++
        }
        this.dk = (eS - this.dc) * this.dp / (this.cY - this.dc);
        this.di = (this.cY - eR) * this.dp / (this.cY - this.dc);
        this.ec = this.dn * this.dp / (this.cY - this.dc)
    };
    this.gl = function () {
        var fm = this.fn(this.M);
        var jQ = Math.floor(this.dq / (fm + 6));
        var jO = this.jR(this.df, this.db, jQ);
        this.dd = jO[0];
        this.cZ = jO[1];
        this.mK = jO[2];
        this.dl = (this.df - this.dd) * this.dq / (this.cZ - this.dd);
        this.dj = (this.cZ - this.db) * this.dq / (this.cZ - this.dd);
        this.ed = this.mK * this.dq / (this.cZ - this.dd)
    };
    this.gc = function () {
        this.ev += '6b786e5a796561706c4657566b5a525552462f50484b456f306550556c4251774657666a30416751474668495949675546645846776f2f5864654a69596b68612f703064757a596763666a6f61696f6950543064413773333839626d7a656a4b417131762f6b4e4b353535686e7354456f6949694c675a4e4d6b4746377a6448506d6b41594378305a6b737a3139505974543941507a3179676d327432396b35346b3341526a6d474d467a633337484c7863655a3256424e533537424144626a72364358777665456a524a6b6a6833376877656a7765667a34656d61596969794f4a4669326873624d517744436f714b6d672b6349437a6e7865303936656c30583773474f3374375a53576c4e445132456866587838744c533330397661536b5a354f526b5947567a77653675727147444e6d444c4778735451334e33505050666451586c5a475631635842773865784f6c30686a7a2b336f514546455768707261576d544e6e6f716f71697149514668374f2f327a64476970794136724b6878392b794b584c6c304f6732354a4c2b64473150744d434f73377649796f736e75484f4f47544a6754383477496e754a7435735773624667573436757666675533754a436b2f414b5563673278537571723263766e53494c522b745a752b7057757a7933354b494b4548765351652b626a757959714f727134757336644f353074754c4b496f7357627959317259326d707161794d334e5a63574b466678383354714f486a324b4b49714d48547332564c52716d735948483378415445774d555646523950663344784832752b2b536d35744c793847445448336f4958355858382b564b31655938754344504c74364e57397433737975336274446f466d576864506849437372693250743757526c5a564662573476483477476775626b5a5552544a7a7337475058382b5033763156547765443549303145414a4e307044756a6d55526150446f6e485a4939454d503563487a6d4e596f4e6a417345414e517268444a736f566a30325555665642504c344c71446f3331576733536b4f61706845664830392b666a36425149434f';
        this.gh = '0x6c6f636174696';
        this.bt = this.mD + 1;
        this.bu = this.u + 1;
        this.dp = this.dr - this.mD - this.mF - 2;
        this.dq = this.ds - this.u - this.mB - 2;
        this.w = this.dp / this.dq
    };
    this.iV = function (eJ, eK) {
        if (eJ) {
            var width = parseInt(eJ, 10);
            if (!isNaN(width)) {
                this.dr = width
            }
        }
        if (eK) {
            var height = parseInt(eK, 10);
            if (!isNaN(height)) {
                this.ds = height
            }
        }
    };
    this.ge = function () {
        if (this.dp === 0) {
            this.gd()
        }
        if (this.da === this.de) {
            this.da++
        }
        if (this.db === this.df) {
            this.db++
        }
        this.ec = this.dp / (this.da - this.de);
        this.ed = this.dq / (this.db - this.df)
    };
    this.gb = function () {
        var paddingTop = (this.u === false) ? this.v : this.u;
        var paddingBottom = (this.mB === false) ? this.mC : this.mB;
        var paddingLeft = (this.mD === false) ? this.mE : this.mD;
        var paddingRight = (this.mF === false) ? this.mG : this.mF;
        var jS = (this.dC === false) ? this.dD : this.dC;
        var jT = (this.dE === false) ? this.dF : this.dE;
        var jU = this.dr - paddingLeft - paddingRight + 8;
        var eO;
        var eN;
        if (this.cP === true) {
            if (this.eb === 'line') {
                eN = this.cX.length;
                for (eO = 0; eO < eN; eO++) {
                    this.cU.push([this.bP[eO], this.cX[eO][1], this.cX[eO][2]])
                }
            }
            if (this.eb === 'bar') {
                eN = this.cV.length;
                for (eO = 0; eO < eN; eO++) {
                    this.cU.push([(typeof this.by === 'string' || typeof this.by[eO] === 'undefined') ? this.bz : this.by[eO], this.cV[eO][1], eO])
                }
            }
        }
        eN = this.cU.length;
        if (eN === 0) {
            return false
        }
        var position;
        if (this.ga(this.cT)) {
            position = this.cT
        } else {
            position = this.cT.split(' ');
            position[0] = position[0].substr(0, 1);
            var jV = (position[0] === 'l' || position[0] === 'r');
            if (typeof position[1] === 'undefined') {
                if (jV) {
                    position[1] = 'm'
                } else {
                    position[1] = 'c'
                }
            }
            position[1] = position[1].substr(0, 1);
            position = position[0] + position[1]
        }
        var rows = [
            []
        ];
        var jW = 0;
        var jX = 0;
        var jY = 0;
        var jZ = 0;
        var ka;
        var kb = (jV || this.ga(position)) ? 0 : this.fn(this.cR) + 10;
        for (eO = 0; eO < eN; eO++) {
            ka = this.fi(this.cU[eO][1], this.cR, null, null, this.cQ) + 25;
            if (jY < ka) {
                jY = ka
            }
        }
        for (eO = 0; eO < eN; eO++) {
            jW += jY;
            if (jW > jU || jV || this.ga(position)) {
                jW = jY;
                jZ++;
                if (jV || this.ga(position)) {
                    rows[jZ - 1] = [this.cU[eO]]
                } else {
                    rows[jZ] = [this.cU[eO]]
                }
                kb += this.fn(this.cR) + 4
            } else {
                if (jX < jW) {
                    jX = jW
                }
                rows[jZ].push(this.cU[eO]);
                if (eO === eN - 1) {}
            }
        }
        var kc;
        var kd;
        switch (position) {
        case 'tc':
        default:
            if (typeof position === 'string') {
                if (this.cS !== false) {
                    paddingTop = this.cS
                }
                kc = paddingLeft + jU / 2 - jX / 2;
                kd = paddingTop
            }
            break;
        case 'tl':
            if (this.cS !== false) {
                paddingTop = this.cS
            }
            kc = paddingLeft;
            kd = paddingTop;
            break;
        case 'tr':
            if (this.cS !== false) {
                paddingTop = this.cS
            }
            kc = paddingLeft + jU - jX;
            kd = paddingTop;
            break;
        case 'bl':
            kc = paddingLeft;
            if (this.cS !== false) {
                kd = this.ds - this.cS - 2 * kb + this.fn(this.mz) + this.fn((this.mH) ? this.M : this.L) + 10
            } else {
                kd = this.ds - paddingBottom - kb + this.fn(this.mz) + this.fn((this.mH) ? this.M : this.L) + 10
            }
            break;
        case 'bc':
            kc = paddingLeft + jU / 2 - jX / 2;
            if (this.cS !== false) {
                kd = this.ds - this.cS - 2 * kb + this.fn(this.mz) + this.fn((this.mH) ? this.M : this.L) + 10
            } else {
                kd = this.ds - paddingBottom - kb + this.fn(this.mz) + this.fn((this.mH) ? this.M : this.L) + 10
            }
            break;
        case 'br':
            kc = paddingLeft + jU - jX;
            if (this.cS !== false) {
                kd = this.ds - this.cS - 2 * kb + this.fn(this.mz) + this.fn((this.mH) ? this.M : this.L) + 10
            } else {
                kd = this.ds - paddingBottom - kb + this.fn(this.mz) + this.fn((this.mH) ? this.M : this.L) + 10
            }
            break;
        case 'lt':
            kc = 10;
            if (this.cS !== false) {
                kc = this.cS;
                paddingLeft = this.cS
            }
            kd = paddingTop;
            break;
        case 'lm':
            kc = 10;
            if (this.cS !== false) {
                kc = this.cS;
                paddingLeft = this.cS
            }
            kd = paddingTop + (this.ds - paddingTop - paddingBottom - kb) / 2;
            break;
        case 'lb':
            kc = 10;
            if (this.cS !== false) {
                kc = this.cS;
                paddingLeft = this.cS
            }
            kd = this.ds - paddingBottom - kb;
            break;
        case 'rt':
            if (this.cS !== false) {
                paddingRight = this.cS
            }
            kc = this.dr - paddingRight - jY;
            kd = paddingTop;
            break;
        case 'rm':
            if (this.cS !== false) {
                paddingRight = this.cS
            }
            kc = this.dr - paddingRight - jY;
            kd = paddingTop + (this.ds - paddingTop - paddingBottom - kb) / 2;
            break;
        case 'rb':
            if (this.cS !== false) {
                paddingRight = this.cS
            }
            kc = this.dr - paddingRight - jY;
            kd = this.ds - paddingBottom - kb;
            break
        }
        var ke = rows.length;
        var ff = (this.ga(position)) ? position[0] : kc;
        var fl = (this.ga(position)) ? position[1] : kd;
        var kf;
        var kg = 0;
        var eZ = (this.cQ === false) ? this.dv : this.cQ;
        var fQ;
        var fT;
        var fS;
        for (var iP = 0; iP < ke; iP++) {
            if (jV || this.ga(position)) {
                eN = 1
            } else {
                eN = rows[iP].length
            }
            for (eO = 0; eO < eN; eO++) {
                kf = rows[iP][eO];
                this.bg.fillStyle = this.fM(kf[0], 1);
                this.bg.fillRect(ff, fl, 10, 10);
                this.hr(kf[1], ff + 15, fl, this.cR, null, null, null, eZ, this.cO);
                fQ = '<div ' + 'style="position:absolute;' + 'left:' + (this.Z.offsetLeft + ff) + 'px;' + 'top:' + (this.Z.offsetTop + fl) + 'px;' + 'width: 10px;' + 'height: 10px;' + 'font-size: 1px;' + 'z-index: ' + (Number(this.Z.style.zIndex) + 200) + ';' + '" id="trigger_legend_' + parseInt(ff, 10) + '_' + parseInt(fl, 10) + '">' + '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" ' + 'width="' + (this.bq * 2) + '" ' + 'height="' + (this.bq * 2) + '" ' + "><\/div>";
                fS = document.createElement('DIV');
                fS.innerHTML += fQ;
                fQ = fS.firstChild;
                fT = fQ.cloneNode(true);
                fQ.parentNode.removeChild(fQ);
                this.eC(fT, 'click', (function (hU, kf, paddingTop, paddingBottom, paddingLeft, paddingRight, jS) {
                    return function () {
                        var eO;
                        var eN;
                        hU.u = paddingTop;
                        hU.mB = paddingBottom;
                        hU.mD = paddingLeft;
                        hU.mF = paddingRight;
                        hU.dC = jS;
                        if (hU.cP === true) {
                            var kh = [];
                            eN = hU.cU.length;
                            for (eO = 0; eO < eN; eO++) {
                                if (hU.cU[eO][2] === '__custom__') {
                                    kh.push(hU.cU[eO])
                                }
                            }
                            hU.cU = kh
                        }
                        hU.dY = hU.dZ;
                        if (hU.eb === 'line') {
                            eN = hU.bi.length;
                            for (eO = 0; eO < eN; eO++) {
                                if (kf[2] !== '__custom__' && kf[2] === hU.bi[eO]) {
                                    hU.ct[eO] = !(hU.ct[eO])
                                }
                            }
                        }
                        if (hU.eb === 'bar') {
                            eN = hU.ct.length;
                            for (eO = 0; eO < eN; eO++) {
                                if (kf[2] === eO) {
                                    hU.ct[eO] = !(hU.ct[eO])
                                }
                            }
                        }
                        eN = hU.ea.length;
                        for (eO = 0; eO < eN; eO++) {
                            clearTimeout(hU.ea[eO])
                        }
                        hU.ea = [];
                        hU.fY()
                    }
                })(this, kf, this.u, this.mB, this.mD, this.mF, this.dC));
                this.bf.appendChild(fT);
                ff += jY;
                kg++
            }
            ff = (this.ga(position)) ? position[0] : kc;
            fl += this.fn(this.cR) + 4
        }
        if (jV) {
            jY += 10
        }
        switch (position) {
        case 'tc':
        case 'tl':
        case 'tr':
        default:
            if (this.u === false && !this.ga(position)) {
                var ki = this.u;
                this.u = paddingTop + kb
            }
            break;
        case 'bl':
        case 'bc':
        case 'br':
            if (this.mB === false) {
                var ki = this.mB;
                this.mB = this.mC + kb
            }
            if (this.dC === false) {
                this.dC = this.dD + kb
            }
            break;
        case 'lt':
        case 'lm':
        case 'lb':
            if (this.mD === false) {
                var ki = this.mD;
                this.mD = this.mE + jY
            }
            if (this.dE === false) {
                this.dE = this.dF + jY
            }
            break;
        case 'rt':
        case 'rm':
        case 'rb':
            if (this.mF === false) {
                var ki = this.mF;
                this.mF = this.mG + jY
            }
            break
        }
        this.hq = kb
    };
    this.hr = function (text, eJ, eK, fontsize, ia, ib, ic, eZ, color, fE, mM, id, hj) {
        if (typeof this.bg === false || typeof text === 'undefined' || typeof eJ === 'undefined' || typeof eK === 'undefined') {
            return false
        }
        text = String(text);
        var kj = this.hZ(fontsize, ia, ib, ic, eZ, color, fE, mM, id);
        fontsize = (this.fK()) ? kj.fontsize + this.bl + this.bk + 'px "' + eZ + '"' : kj.fontsize + this.bk + 'px "' + eZ + '"';
        if (this.fK()) {
            eJ -= 1
        }
        if (!this.dH) {
            if (typeof hj === 'undefined') {
                this.bg.strokeStyle = this.fM(kj.color, kj.fE);
                this.bg.strokeText(text, eJ, eK, kj.fontsize, kj.ia, kj.ib, kj.ic, kj.eZ, kj.color, kj.fE, kj.mM, kj.id)
            } else {
                setTimeout((function (fL, strokeStyle, text, eJ, eK, fontsize, ia, ib, ic, eZ, color, fE, mM, id) {
                    return function () {
                        fL.strokeStyle = strokeStyle;
                        fL.strokeText(text, eJ, eK, fontsize, ia, ib, ic, eZ, color, fE, mM, id)
                    }
                })(this.bg, this.fM(kj.color, kj.fE), text, eJ, eK, kj.fontsize, kj.ia, kj.ib, kj.ic, kj.eZ, kj.color, kj.fE, kj.mM, kj.id), hj)
            }
        } else {
            if (typeof hj === 'undefined') {
                this.bg.fillStyle = this.fM(kj.color, kj.fE);
                this.bg.font = fontsize;
                this.bg.textBaseline = 'top';
                this.bg.fillText(text, eJ, eK)
            } else {
                setTimeout((function (fL, fillStyle, font, text, eJ, eK) {
                    return function () {
                        fL.fillStyle = fillStyle;
                        fL.font = font;
                        fL.textBaseline = 'top';
                        fL.fillText(text, eJ, eK)
                    }
                })(this.bg, this.fM(kj.color, kj.fE), fontsize, text, eJ, eK), hj)
            }
        }
    };
    this.gr = function () {
        var kk = (this.mx === false) ? this.dv : this.mx;
        var kl = (this.my === false) ? this.dv : this.my;
        var km = this.fi(this.m, this.k, null, null, kk);
        var ff = (this.dp - km) / 2 + this.mD;
        var fl = this.ds - this.dC - this.fn((this.mH) ? this.mz : this.k);
        if (this.mH) {
            this.hr(this.mA, ff, fl, this.mz, null, null, null, kl, this.mw)
        } else {
            this.hr(this.m, ff, fl, this.k, null, null, null, kk, this.mv)
        }
        var eN = (this.mH) ? this.m.length : this.mA.length;
        var fm = eN * this.fn((this.mH) ? this.k : this.mz);
        fl = Math.round((this.ds - fm) / 2);
        for (var eO = 0; eO < eN; eO++) {
            ff = this.dE;
            if (this.mH) {
                this.hr(this.m.substr(eO, 1), ff, fl, this.k, null, null, null, kk, this.mv)
            } else {
                this.hr(this.mA.substr(eO, 1), ff, fl, this.mz, null, null, null, kl, this.mw)
            }
            fl += this.fn((this.mH) ? this.k : this.mz)
        }
    };
    this.gs = function () {
        if (this.eb !== 'line') {
            return false
        }
        var eN;
        var coords;
        var fh;
        var eZ;
        var eO;
        var eN = this.cM.length;
        var hk = -this.C * Math.PI / 180;
        var fl;
        var eJ;
        var kn;
        var ko;
        var kp = [];
        var kq = [];
        for (eO = 0; eO < eN; eO++) {
            coords = this.hm(this.cM[eO][0], 0);
            if (coords[0] < this.mD || coords[0] > this.dr - this.mF) {
                continue
            }
            if (typeof this.cM[eO][2] !== 'undefined' && this.cM[eO][2] === 'x-value') {
                kp.push(this.cM[eO])
            } else {
                kq.push(this.cM[eO])
            }
        }
        eN = kp.length;
        for (eO = 0; eO < eN; eO++) {
            coords = this.hm(kp[eO][0], 0);
            kn = (this.mI && eO === 0);
            ko = (this.A && eO + 1 === eN);
            fl = this.ds - ((this.N === false) ? this.mB - 4 : this.N);
            eZ = (this.J === false) ? this.dv : this.J;
            fh = this.fi(String(kp[eO][1]), this.L, null, null, eZ);
            if (this.C > 0) {
                this.bg.save();
                if (kn) {
                    eJ = coords[0] + 2 + this.L / 2
                } else if (ko) {
                    eJ = coords[0] + 2 - this.L / 2
                } else {
                    eJ = coords[0] + 2
                }
                this.bg.translate(eJ, fl + 4);
                this.bg.rotate(hk);
                this.hr(kp[eO][1], 0 - fh, 0 - this.L / 2 - 2, this.L, null, null, null, eZ, this.D);
                this.bg.restore()
            } else {
                if (kn) {
                    eJ = coords[0]
                } else if (ko) {
                    eJ = coords[0] - fh
                } else {
                    eJ = coords[0] - fh / 2
                }
                this.hr(kp[eO][1], eJ, fl, this.L, null, null, null, eZ, this.D)
            }
        }
        eN = kq.length;
        for (eO = 0; eO < eN; eO++) {
            coords = this.hm(kq[eO][0], 0);
            coords[0] = Number(coords[0].toFixed(12));
            kn = (this.cA && coords[0] === this.bt);
            ko = (this.cC && coords[0] === this.bt + this.dp);
            fl = this.ds - ((this.cK === false) ? this.mB - 4 : this.cK);
            eZ = (this.cG === false) ? this.dv : this.cG;
            fh = this.fi(String(kq[eO][1]), this.cI, null, null, eZ);
            if (this.C > 0) {
                this.bg.save();
                if (kn) {
                    eJ = coords[0] + 2 + this.L / 2
                } else if (ko) {
                    eJ = coords[0] + 2 - this.L / 2
                } else {
                    eJ = coords[0] + 2
                }
                this.bg.translate(eJ, fl + 4);
                this.bg.rotate(hk);
                this.hr(kq[eO][1], 0 - fh, 0 - this.cI / 2 - 2, this.cI, null, null, null, eZ, this.cE);
                this.bg.restore()
            } else {
                if (kn) {
                    eJ = coords[0]
                } else if (ko) {
                    eJ = coords[0] - fh
                } else {
                    eJ = coords[0] - fh / 2
                }
                this.hr(kq[eO][1], eJ, fl, this.cI, null, null, null, eZ, this.cE)
            }
        }
    };
    this.gt = function () {
        var eN;
        var coords;
        var fh;
        var eN = this.cN.length;
        var eO;
        var eZ = (this.cH === false) ? this.dv : this.cH;
        var hk = -this.C * Math.PI / 180;
        var kn;
        var ko;
        var eJ;
        var eK;
        if (this.mH) {
            for (eO = 0; eO < eN; eO++) {
                coords = this.hm(this.cN[eO][0], 0);
                if (coords[0] < this.mD || coords[0] > this.dp + this.bt) {
                    continue
                }
                kn = (this.cB && coords[0] === this.bt);
                ko = (this.cD && coords[0] === this.bt + this.dp);
                fh = this.fi(String(this.cN[eO][1]), this.cJ, null, null, eZ);
                if (this.C > 0) {
                    this.bg.save();
                    if (kn) {
                        eJ = coords[0] + 2 + this.cJ
                    } else if (ko) {
                        eJ = coords[0] + 2 - this.cJ / 4
                    } else {
                        eJ = coords[0] + 2
                    }
                    this.bg.translate(eJ, (this.cK === false) ? this.ds - this.mB + 8 : this.ds - this.cK);
                    this.bg.rotate(hk);
                    this.hr(this.cN[eO][1], 0 - fh, 0 - this.cJ / 2 - 2, this.cJ, null, null, null, eZ, this.cF);
                    this.bg.restore()
                } else {
                    if (kn) {
                        eJ = coords[0]
                    } else if (ko) {
                        eJ = coords[0] - fh
                    } else {
                        eJ = coords[0] - fh / 2
                    }
                    this.hr(this.cN[eO][1], eJ, (this.cK === false) ? this.ds - this.mB + 4 : this.ds - this.cK, this.cJ, null, null, null, eZ, this.cF)
                }
            }
        } else {
            for (eO = 0; eO < eN; eO++) {
                coords = this.hm(0, this.cN[eO][0]);
                if (coords[1] < this.u || coords[1] > this.ds - this.mB) {
                    continue
                }
                kn = (this.cB && coords[1] === this.bu + this.dq);
                ko = (this.cD && coords[1] === this.bu);
                fh = this.fi(String(this.cN[eO][1]), this.cJ, null, null, eZ);
                if (kn) {
                    eK = coords[1] - this.fn(this.cJ)
                } else if (ko) {
                    eK = coords[1]
                } else {
                    eK = coords[1] - this.fn(this.cJ / 2)
                }
                this.hr(this.cN[eO][1], (this.cL === false) ? this.mD - fh - 4 : this.cL - fh, eK, this.cJ, null, null, null, eZ, this.cF)
            }
        }
    };
    this.gw = function () {
        var eZ = (this.dK === false) ? this.dv : this.dK;
        var kr = this.fi(this.dI, this.dL, null, null, eZ);
        var ff;
        switch (this.dM) {
        case 'left':
            ff = this.mD;
            break;
        case 'right':
            ff = this.dr - this.mF - kr;
            break;
        default:
            ff = Math.round((this.dr - kr) / 2)
        }
        var fl = this.dG;
        this.hr(this.dI, ff, fl, this.dL, null, null, null, eZ, this.dJ)
    };
    this.gD = function () {
        var fq = this;
        return function () {
            var gy = fq.gz(fq.ee, true);
            var eZ = (fq.eg === false) ? fq.dv : fq.eg;
            fq.hr(fq.ee, gy[0] + 1, gy[1] + 1, fq.eh, null, null, null, eZ, fq.ek, fq.ei);
            fq.hr(fq.ee, gy[0], gy[1], fq.eh, null, null, null, eZ, fq.ef, fq.ei)
        }
    };
    this.gp = function (eQ) {
        var fh;
        var fg;
        var gX;
        var gW;
        var fb;
        var fc;
        var fe;
        var ff;
        var fl = this.ds - ((this.N === false) ? this.mB - 4 : this.N);
        var hk = -this.C * Math.PI / 180;
        var eJ;
        var kn;
        var ko;
        if (eQ) {
            this.ec = this.dp / (this.db - this.df);
            this.gk(eQ);
            var ks = this.W;
            var kt = this.dd;
            var ku = this.cZ;
            var eT = this.G;
            var eU = this.Q;
            var eV = this.U;
            var eW = this.K;
            var eX = this.M;
            var kv = this.E;
            var eR = this.db;
            var eS = this.df
        } else {
            var ks = this.V;
            var kt = this.dc;
            var ku = this.cY;
            var eT = this.F;
            var eU = this.P;
            var eV = this.T;
            var eW = this.J;
            var eX = this.L;
            var kv = this.D;
            var eR = this.da;
            var eS = this.de
        }
        var eZ = (eW === false) ? this.dv : eW;
        if (ks === 0) {
            fe = kt;
            ff = this.bt;
            while (fe <= ku) {
                fg = (eT === 'auto') ? fe : fe.toFixed(eT);
                kn = (((this.mI && !eQ) || (this.z && eQ)) && fe === kt);
                ko = (((this.A && !eQ) || (this.B && eQ)) && fe + this.dn > ku);
                gW = String(fe).lastIndexOf('.');
                gX = String(fe).substr(gW + 1).length;
                if (gX > 3 && eT === 'auto') {
                    fg = this.fd(fe, 3)
                }
                if (this.el !== false) {
                    fg = this.hs(fg)
                }
                if (typeof eU === 'string') {
                    fg = eU + fg
                }
                if (typeof eV === 'string') {
                    fg = fg + eV
                }
                fh = this.fi(String(fg), eX, null, null, eZ);
                if (this.C > 0) {
                    if (kn) {
                        eJ = ff + eX
                    } else if (ko) {
                        eJ = ff - eX / 4
                    } else {
                        eJ = ff + eX / 4
                    }
                    this.bg.save();
                    this.bg.translate(eJ, fl + 4);
                    this.bg.rotate(hk);
                    this.hr(fg, 0 - fh, 0 - eX / 2 - 2, eX, null, null, null, eZ, kv);
                    this.bg.restore()
                } else {
                    if (kn) {
                        eJ = ff
                    } else if (ko) {
                        eJ = ff - fh
                    } else {
                        eJ = ff - fh / 2
                    }
                    this.hr(fg, eJ, fl, eX, null, null, null, eZ, kv)
                }
                fe += this.dn;
                ff += this.ec
            }
        } else {
            var hv = false;
            for (var eO = 2; eO < 200; eO++) {
                if ((eR - eS) % eO === 0) {
                    hv = eO;
                    if (!this.eP(eO, true)) {
                        continue
                    }
                    break
                }
            }
            var eN = (hv) ? hv : eO;
            if (ks > 1) {
                eN = ks - 1
            }
            var kw = 0;
            var data = (this.dg) ? this.bh[0] : this.bh;
            for (eO = 0; eO < data.length; eO++) {
                gW = String(data[eO][0]).lastIndexOf('.');
                if (gW >= 0) {
                    gX = String(data[eO][0]).substr(gW + 1).length;
                    if (kw < gX) {
                        kw = gX
                    }
                }
            }
            kw++;
            while (!this.eP(eN, true)) {
                eN = Math.floor(eN / 2)
            }
            fb = this.dp / eN;
            fc = (eR - eS) / eN;
            fe = eS;
            ff = this.mD;
            fl = (this.N === false) ? this.bu + this.dq + 4 : this.ds - this.N;
            for (eO = 0; eO <= eN; eO++) {
                kn = (this.mI && eO === 0);
                ko = (this.A && eO + 1 > eN);
                fg = (eT === 'auto' && this.fd(fe, eT) !== fe) ? this.fd(fe, kw) : fe.toFixed(eT);
                if (this.el !== false) {
                    fg = this.hs(fg)
                }
                if (typeof eU === 'string') {
                    fg = eU + fg
                }
                if (typeof eV === 'string') {
                    fg = fg + eV
                }
                fh = this.fi(fg, eX, null, null, eZ);
                if (this.C > 0) {
                    this.bg.save();
                    if (kn) {
                        eJ = ff + fh / 4 + eX / 2
                    } else if (ko) {
                        eJ = ff + fh / 4 - eX / 2
                    } else {
                        eJ = ff + fh / 4
                    }
                    this.bg.translate(eJ, fl + 4);
                    this.bg.rotate(hk);
                    this.hr(fg, 0 - fh, 0 - eX / 2 - 2, eX, null, null, null, eZ, kv);
                    this.bg.restore()
                } else {
                    if (kn) {
                        eJ = ff
                    } else if (ko) {
                        eJ = ff - fh
                    } else {
                        eJ = ff - fh / 2
                    }
                    this.hr(fg, eJ, fl, eX, null, null, null, eZ, kv)
                }
                fe += fc;
                ff += fb
            }
        }
    };
    this.gq = function (eQ) {
        if (eQ) {
            this.gp(true);
            return
        }
        var fh;
        var fg;
        var gX;
        var gW;
        var fb;
        var fc;
        var fe;
        var fl;
        var ff = (this.O === false) ? this.mD - 4 : this.O;
        var fm = this.fn(this.M);
        var eZ = (this.K === false) ? this.dv : this.K;
        var kn;
        var ko;
        if (this.W === 0) {
            fe = this.dd;
            fl = this.bu + this.dq;
            while (fe <= this.cZ) {
                kn = (this.z && fe === this.dd);
                ko = (this.B && fe + this.mK > this.cZ);
                fg = (this.G === 'auto') ? fe : fe.toFixed(this.G);
                gW = String(fe).lastIndexOf('.');
                gX = String(fe).substr(gW + 1).length;
                if (gX > 3 && this.G === 'auto') {
                    fg = this.fd(fe, 3)
                }
                if (this.el !== false) {
                    fg = this.hs(fg)
                }
                if (typeof this.Q === 'string') {
                    fg = this.Q + fg
                }
                if (typeof this.U === 'string') {
                    fg = fg + this.U
                }
                fh = this.fi(String(fg), this.M, null, null, eZ);
                if (kn) {
                    eK = fl - fm
                } else if (ko) {
                    eK = fl
                } else {
                    eK = fl - fm / 2
                }
                this.hr(fg, ff - fh, eK, this.M, null, null, null, eZ, this.E);
                fe += this.mK;
                fe = Number(fe.toFixed(10));
                fl -= this.ed
            }
        } else {
            var hv = false;
            for (var eO = 2; eO < 200; eO++) {
                if ((this.db - this.df) % eO === 0) {
                    hv = eO;
                    if (!this.fj(eO, true)) {
                        continue
                    }
                    break
                }
            }
            var eN = (hv) ? hv : eO;
            if (this.W > 1) {
                eN = this.W - 1
            }
            var kw = 0;
            var data = (this.dg) ? this.bh[0] : this.bh;
            for (eO = 0; eO < data.length; eO++) {
                gW = String(data[eO][1]).lastIndexOf('.');
                if (gW >= 0) {
                    gX = String(data[eO][1]).substr(gW + 1).length;
                    if (kw < gX) {
                        kw = gX
                    }
                }
            }
            kw++;
            while (!this.fj(eN)) {
                eN = Math.floor(eN / 2)
            }
            fb = this.dq / eN;
            fc = (this.db - this.df) / eN;
            fe = this.df;
            ff = (this.O === false) ? this.mD - 4 : this.O;
            fl = this.bu + this.dq;
            for (eO = 0; eO <= eN; eO++) {
                kn = (this.z && eO === 0);
                ko = (this.B && eO + 1 > eN);
                fm = this.fn(this.M);
                fg = (this.G === 'auto' && this.fd(fe, this.G) !== fe) ? this.fd(fe, kw) : fe.toFixed(this.G);
                if (this.el !== false) {
                    fg = this.hs(fg)
                }
                if (typeof this.Q === 'string') {
                    fg = this.Q + fg
                }
                if (typeof this.U === 'string') {
                    fg = fg + this.U
                }
                fh = this.fi(fg, this.M, null, null, eZ);
                if (kn) {
                    eK = fl - fm
                } else if (ko) {
                    eK = fl
                } else {
                    eK = fl - fm / 2
                }
                this.hr(fg, ff - fh, eK, this.M, null, null, null, eZ, this.E);
                fe += fc;
                fl -= fb
            }
        }
    };
    this.kx = false;
    this.ky = false;
    this.kz = 0;
    this.kA = 0;
    this.kB = false;
    this.kC = function (min, max, kD, kE) {
        if (typeof kE === 'undefined') {
            kE = true
        }
        min = Math.floor(min);
        max = Math.ceil(max);
        if (Math.abs(min - max) === 0) {
            --min;
            ++max
        }
        kD = Math.floor(kD);
        var kF = Math.round((this.kz / 100.0) * Math.abs(max - min));
        var kG = Math.round((this.kA / 100.0) * Math.abs(max - min));
        if (typeof this.kx === 'number') {
            min = Math.ceil(this.kx);
            if (min >= max) {
                alert('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.');
                return
            }
        }
        if (typeof this.ky === 'number') {
            max = Math.ceil(this.ky);
            if (min >= max) {
                alert('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.');
                return
            }
        }
        if (Math.abs(min - max) === 0) {
            ++max;
            --min
        }
        min -= kG;
        max += kF;
        var ir;
        var kH;
        var kI;
        var kJ;
        var kK;
        var kL;
        var kM;
        var kN;
        var kO;
        var kP;
        var kQ;
        var kR;
        var kS;
        if (kE) {
            ir = this.kT(kD, min, max, 1);
            kH = ir[0];
            kN = ir[1];
            kO = ir[2];
            kK = ir[3]
        } else {
            kN = min;
            kO = max;
            ir = this.kU(kD, min, max, 1);
            kH = ir[0];
            kK = ir[1]
        }
        if (Math.abs(min - max) > 2) {
            if (kE) {
                ir = this.kT(kD, min, max, 5);
                kI = ir[0];
                kP = ir[1];
                kQ = ir[2];
                kL = ir[3]
            } else {
                kP = min;
                kQ = max;
                ir = this.kU(kD, min, max, 5);
                kI = ir[0];
                kL = ir[1]
            }
        } else {
            kI = 10000
        }
        if (Math.abs(min - max) > 5) {
            if (kE) {
                ir = this.kT(kD, min, max, 2);
                kJ = ir[0];
                kR = ir[1];
                kS = ir[2];
                kM = ir[3]
            } else {
                kR = min;
                kS = max;
                ir = this.kU(kD, min, max, 2);
                kJ = ir[0];
                kM = ir[1]
            }
        } else {
            kJ = 10000
        }
        var kV = Math.abs(kH - kD);
        var kW = Math.abs(kI - kD);
        var kX = (!this.hX(kM) && kM > 1) ? Math.abs(kJ - kD) : kX = 10000;
        var iP;
        if (kV < kW) {
            iP = (kV < kX) ? 1 : 3
        } else {
            iP = (kW < kX) ? 2 : 3
        }
        switch (iP) {
        case 1:
            return [kN, kO, kK];
        case 2:
            return [kP, kQ, kL];
        case 3:
            return [kR, kS, kM];
        default:
            alert('invalid r (IntAutoScale) ');
            return
        }
    };
    this.jR = function (min, max, kD, kE) {
        if (typeof kE === 'undefined') {
            kE = true
        }
        if (this.kB) {
            this.kC(min, max, kD, kE);
            return
        }
        if (Math.abs(min - max) < 0.00001) {
            if (min === 0 && max === 0) {
                min = -1;
                max = 1
            } else {
                var kY = (Math.abs(max) + Math.abs(min)) * 0.005;
                min -= kY;
                max += kY
            }
        }
        var kF = (this.kz / 100.0) * Math.abs(max - min);
        var kG = (this.kA / 100.0) * Math.abs(max - min);
        if (typeof this.kx === 'number') {
            min = this.kx;
            if (min >= max) {
                alert('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.');
                return
            }
            if (Math.abs(min - max) < 0.00001) {
                max *= 1.2
            }
        }
        if (typeof this.ky === 'number') {
            max = this.ky;
            if (min >= max) {
                alert('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.');
                return
            }
            if (Math.abs(min - max) < 0.00001) {
                min *= 0.8
            }
        }
        min -= kG;
        max += kF;
        var ir;
        var kH;
        var kI;
        var kJ;
        var kN;
        var kO;
        var kP;
        var kQ;
        var kR;
        var kS;
        var kZ;
        var kK;
        var la;
        var kL;
        var lb;
        var kM;
        if (kE) {
            ir = this.lc(kD, min, max, 1, 2);
            kH = ir[0];
            kN = ir[1];
            kO = ir[2];
            kZ = ir[3];
            kK = ir[4]
        } else {
            kN = min;
            kO = max;
            ir = this.mR(kD, min, max, 1, 2, false);
            kH = ir[0];
            kZ = ir[1];
            kK = ir[2]
        }
        if (kE) {
            ir = this.lc(kD, min, max, 5, 2);
            kI = ir[0];
            kP = ir[1];
            kQ = ir[2];
            la = ir[3];
            kL = ir[4]
        } else {
            kP = min;
            kQ = max;
            ir = this.mR(kD, min, max, 5, 2, false);
            kI = ir[0];
            la = ir[1];
            kL = ir[2]
        }
        if (kE) {
            ir = this.lc(kD, min, max, 2, 5);
            kJ = ir[0];
            kR = ir[1];
            kS = ir[2];
            lb = ir[3];
            kM = ir[4]
        } else {
            kR = min;
            kS = max;
            ir = this.mR(kD, min, max, 2, 5, false);
            kJ = ir[0];
            lb = ir[1];
            kM = ir[2]
        }
        var kV = Math.abs(kH - kD);
        var kW = Math.abs(kI - kD);
        var kX = Math.abs(kJ - kD);
        var iP = this.le(kV, kW, kX, 0.8);
        switch (iP) {
        case 1:
            return [kN, kO, kK];
        case 2:
            return [kP, kQ, kL];
        case 3:
            return [kR, kS, kM];
        default:
            alert('invalid r (AutoScale) ');
            return
        }
    };
    this.lc = function (kD, min, max, mN, hi, kE) {
        if (typeof kE === 'undefined') {
            kE = true
        }
        var lf = max - min;
        var lg = (lf === 0) ? 0 : Math.floor(this.jz(lf, 10));
        if (min > 0 && min < Math.pow(10, lg)) {
            min = 0
        }
        var lh = Math.pow(10, lg) / mN;
        var li = lh / hi;
        var lj = Math.ceil(max / li) * li;
        var lk = Math.floor(min / li) * li;
        var ll = lj - lk;
        var lm = ll / lh;
        while (lm > kD) {
            lh = Math.pow(10, lg) / mN;
            lm = ll / lh;
            ++lg
        }
        li = lh / hi;
        lk = Math.floor(min / li) * li;
        ll = lj - lk;
        if (kE) {
            lk = Math.floor(min / lh) * lh;
            ll = lj - lk;
            lj = Math.ceil(ll / lh) * lh + lk
        } else {
            lj = Math.ceil(max / li) * li
        }
        return [lm, lk, lj, li, lh]
    };
    this.mR = function (kD, min, max, mN, hi) {
        var lf = max - min;
        var lg = (lf === 0) ? 0 : Math.floor(this.jz(lf, 10));
        var lh = Math.pow(10, lg) / mN;
        var li = Math.lh / hi;
        var lm = Math.floor(lf / lh);
        while (lm > kD) {
            lh = Math.pow(10, lg) / mN;
            lm = Math.floor(lf / lh);
            ++lg
        }
        li = lh / hi;
        return [lm, li, lh]
    };
    this.kT = function (kD, min, max, mN, kE) {
        if (typeof kE === 'undefined') {
            kE = true
        }
        var lf = max - min;
        if (lf === 0) {
            alert('Can\'t automatically determine ticks since min == max.');
            return
        } else {
            var lg = Math.floor(this.jz(lf, 10))
        }
        if (min > 0 && min < Math.pow(10, lg)) {
            min = 0
        }
        if (lg === 0) {
            lg = 1
        }
        var lh = (mN === 1) ? 1 : Math.pow(10, lg) / mN;
        var lj = Math.ceil(max / lh) * lh;
        var lk = Math.floor(min / lh) * lh;
        var ll = lj - lk;
        var lm = ll / lh;
        while (lm > kD) {
            lh = Math.pow(10, lg) / mN;
            lm = ll / lh;
            ++lg
        }
        lk = Math.floor(min / lh) * lh;
        ll = lj - lk;
        if (kE) {
            lk = Math.floor(min / lh) * lh;
            ll = lj - lk;
            lj = Math.ceil(ll / lh) * lh + lk
        } else {
            lj = Math.ceil(max / lh) * lh
        }
        return [lm, lk, lj, lh]
    };
    this.kU = function (kD, min, max, mN) {
        var lf = max - min;
        if (lf === 0) {
            alert('Can\'t automatically determine ticks since min == max.');
            return
        } else {
            var lg = Math.floor(this.jz(lf, 10))
        }
        if (lg === 0) {
            lg = 1
        }
        var lh = (mN === 1) ? 1 : Math.pow(10, lg) / mN;
        var lm = Math.floor(lf / lh);
        while (lm > kD) {
            lh = Math.pow(10, lg) / mN;
            lm = Math.floor(lf / lh);
            ++lg
        }
        return [lm, lh]
    };
    this.le = function (mN, hi, hh, ln) {
        if (mN < hi) {
            if (mN < hh * ln) {
                return 1
            }
            return 3
        } else if (hi < hh * ln) {
            return 2
        }
        return 3
    };
    this.iG = {
        lo: 0,
        lp: "",
        lq: 8,
        iH: function (hF) {
            return this.lr(this.ls(this.lt(hF), hF.length * this.lq))
        },
        lu: function (hF) {
            return this.lv(this.ls(this.lt(hF), hF.length * this.lq))
        },
        lw: function (hF) {
            return this.lx(this.ls(this.lt(hF), hF.length * this.lq))
        },
        ly: function (lz, data) {
            return this.lr(this.lA(lz, data))
        },
        lB: function (lz, data) {
            return this.lv(this.lA(lz, data))
        },
        lC: function (lz, data) {
            return this.lx(this.lA(lz, data))
        },
        lD: function () {
            return this.iH("abc") === "900150983cd24fb0d6963f7d28e17f72"
        },
        ls: function (eJ, eN) {
            eJ[eN >> 5] |= 0x80 << ((eN) % 32);
            eJ[(((eN + 64) >>> 9) << 4) + 14] = eN;
            var mN = 1732584193;
            var hi = -271733879;
            var hh = -1732584194;
            var hg = 271733878;
            for (var eO = 0; eO < eJ.length; eO += 16) {
                var lE = mN;
                var lF = hi;
                var lG = hh;
                var lH = hg;
                mN = this.lI(mN, hi, hh, hg, eJ[eO + 0], 7, -680876936);
                hg = this.lI(hg, mN, hi, hh, eJ[eO + 1], 12, -389564586);
                hh = this.lI(hh, hg, mN, hi, eJ[eO + 2], 17, 606105819);
                hi = this.lI(hi, hh, hg, mN, eJ[eO + 3], 22, -1044525330);
                mN = this.lI(mN, hi, hh, hg, eJ[eO + 4], 7, -176418897);
                hg = this.lI(hg, mN, hi, hh, eJ[eO + 5], 12, 1200080426);
                hh = this.lI(hh, hg, mN, hi, eJ[eO + 6], 17, -1473231341);
                hi = this.lI(hi, hh, hg, mN, eJ[eO + 7], 22, -45705983);
                mN = this.lI(mN, hi, hh, hg, eJ[eO + 8], 7, 1770035416);
                hg = this.lI(hg, mN, hi, hh, eJ[eO + 9], 12, -1958414417);
                hh = this.lI(hh, hg, mN, hi, eJ[eO + 10], 17, -42063);
                hi = this.lI(hi, hh, hg, mN, eJ[eO + 11], 22, -1990404162);
                mN = this.lI(mN, hi, hh, hg, eJ[eO + 12], 7, 1804603682);
                hg = this.lI(hg, mN, hi, hh, eJ[eO + 13], 12, -40341101);
                hh = this.lI(hh, hg, mN, hi, eJ[eO + 14], 17, -1502002290);
                hi = this.lI(hi, hh, hg, mN, eJ[eO + 15], 22, 1236535329);
                mN = this.lJ(mN, hi, hh, hg, eJ[eO + 1], 5, -165796510);
                hg = this.lJ(hg, mN, hi, hh, eJ[eO + 6], 9, -1069501632);
                hh = this.lJ(hh, hg, mN, hi, eJ[eO + 11], 14, 643717713);
                hi = this.lJ(hi, hh, hg, mN, eJ[eO + 0], 20, -373897302);
                mN = this.lJ(mN, hi, hh, hg, eJ[eO + 5], 5, -701558691);
                hg = this.lJ(hg, mN, hi, hh, eJ[eO + 10], 9, 38016083);
                hh = this.lJ(hh, hg, mN, hi, eJ[eO + 15], 14, -660478335);
                hi = this.lJ(hi, hh, hg, mN, eJ[eO + 4], 20, -405537848);
                mN = this.lJ(mN, hi, hh, hg, eJ[eO + 9], 5, 568446438);
                hg = this.lJ(hg, mN, hi, hh, eJ[eO + 14], 9, -1019803690);
                hh = this.lJ(hh, hg, mN, hi, eJ[eO + 3], 14, -187363961);
                hi = this.lJ(hi, hh, hg, mN, eJ[eO + 8], 20, 1163531501);
                mN = this.lJ(mN, hi, hh, hg, eJ[eO + 13], 5, -1444681467);
                hg = this.lJ(hg, mN, hi, hh, eJ[eO + 2], 9, -51403784);
                hh = this.lJ(hh, hg, mN, hi, eJ[eO + 7], 14, 1735328473);
                hi = this.lJ(hi, hh, hg, mN, eJ[eO + 12], 20, -1926607734);
                mN = this.lK(mN, hi, hh, hg, eJ[eO + 5], 4, -378558);
                hg = this.lK(hg, mN, hi, hh, eJ[eO + 8], 11, -2022574463);
                hh = this.lK(hh, hg, mN, hi, eJ[eO + 11], 16, 1839030562);
                hi = this.lK(hi, hh, hg, mN, eJ[eO + 14], 23, -35309556);
                mN = this.lK(mN, hi, hh, hg, eJ[eO + 1], 4, -1530992060);
                hg = this.lK(hg, mN, hi, hh, eJ[eO + 4], 11, 1272893353);
                hh = this.lK(hh, hg, mN, hi, eJ[eO + 7], 16, -155497632);
                hi = this.lK(hi, hh, hg, mN, eJ[eO + 10], 23, -1094730640);
                mN = this.lK(mN, hi, hh, hg, eJ[eO + 13], 4, 681279174);
                hg = this.lK(hg, mN, hi, hh, eJ[eO + 0], 11, -358537222);
                hh = this.lK(hh, hg, mN, hi, eJ[eO + 3], 16, -722521979);
                hi = this.lK(hi, hh, hg, mN, eJ[eO + 6], 23, 76029189);
                mN = this.lK(mN, hi, hh, hg, eJ[eO + 9], 4, -640364487);
                hg = this.lK(hg, mN, hi, hh, eJ[eO + 12], 11, -421815835);
                hh = this.lK(hh, hg, mN, hi, eJ[eO + 15], 16, 530742520);
                hi = this.lK(hi, hh, hg, mN, eJ[eO + 2], 23, -995338651);
                mN = this.lL(mN, hi, hh, hg, eJ[eO + 0], 6, -198630844);
                hg = this.lL(hg, mN, hi, hh, eJ[eO + 7], 10, 1126891415);
                hh = this.lL(hh, hg, mN, hi, eJ[eO + 14], 15, -1416354905);
                hi = this.lL(hi, hh, hg, mN, eJ[eO + 5], 21, -57434055);
                mN = this.lL(mN, hi, hh, hg, eJ[eO + 12], 6, 1700485571);
                hg = this.lL(hg, mN, hi, hh, eJ[eO + 3], 10, -1894986606);
                hh = this.lL(hh, hg, mN, hi, eJ[eO + 10], 15, -1051523);
                hi = this.lL(hi, hh, hg, mN, eJ[eO + 1], 21, -2054922799);
                mN = this.lL(mN, hi, hh, hg, eJ[eO + 8], 6, 1873313359);
                hg = this.lL(hg, mN, hi, hh, eJ[eO + 15], 10, -30611744);
                hh = this.lL(hh, hg, mN, hi, eJ[eO + 6], 15, -1560198380);
                hi = this.lL(hi, hh, hg, mN, eJ[eO + 13], 21, 1309151649);
                mN = this.lL(mN, hi, hh, hg, eJ[eO + 4], 6, -145523070);
                hg = this.lL(hg, mN, hi, hh, eJ[eO + 11], 10, -1120210379);
                hh = this.lL(hh, hg, mN, hi, eJ[eO + 2], 15, 718787259);
                hi = this.lL(hi, hh, hg, mN, eJ[eO + 9], 21, -343485551);
                mN = this.lM(mN, lE);
                hi = this.lM(hi, lF);
                hh = this.lM(hh, lG);
                hg = this.lM(hg, lH)
            }
            return [mN, hi, hh, hg]
        },
        lN: function (lO, mN, hi, eJ, hF, gV) {
            return this.lM(this.lP(this.lM(this.lM(mN, lO), this.lM(eJ, gV)), hF), hi)
        },
        lI: function (mN, hi, hh, hg, eJ, hF, gV) {
            return this.lN((hi & hh) | ((~hi) & hg), mN, hi, eJ, hF, gV)
        },
        lJ: function (mN, hi, hh, hg, eJ, hF, gV) {
            return this.lN((hi & hg) | (hh & (~hg)), mN, hi, eJ, hF, gV)
        },
        lK: function (mN, hi, hh, hg, eJ, hF, gV) {
            return this.lN(hi ^ hh ^ hg, mN, hi, eJ, hF, gV)
        },
        lL: function (mN, hi, hh, hg, eJ, hF, gV) {
            return this.lN(hh ^ (hi | (~hg)), mN, hi, eJ, hF, gV)
        },
        lA: function (lz, data) {
            var lQ = this.lt(lz);
            if (lQ.length > 16) {
                lQ = this.ls(lQ, lz.length * this.lq)
            }
            var lR = [16],
                lS = [16];
            for (var eO = 0; eO < 16; eO++) {
                lR[eO] = lQ[eO] ^ 0x36363636;
                lS[eO] = lQ[eO] ^ 0x5C5C5C5C
            }
            var hash = this.ls(lR.concat(this.lt(data)), 512 + data.length * this.lq);
            return this.ls(lS.concat(hash), 512 + 128)
        },
        lM: function (eJ, eK) {
            var lT = (eJ & 0xFFFF) + (eK & 0xFFFF);
            var lU = (eJ >> 16) + (eK >> 16) + (lT >> 16);
            return (lU << 16) | (lT & 0xFFFF)
        },
        lP: function (lV, lW) {
            return (lV << lW) | (lV >>> (32 - lW))
        },
        lt: function (lX) {
            var lY = [];
            var lZ = (1 << this.lq) - 1;
            for (var eO = 0; eO < lX.length * this.lq; eO += this.lq) {
                lY[eO >> 5] |= (lX.charCodeAt(eO / this.lq) & lZ) << (eO % 32)
            }
            return lY
        },
        lx: function (lY) {
            var lX = "";
            var lZ = (1 << this.lq) - 1;
            for (var eO = 0; eO < lY.length * 32; eO += this.lq) {
                lX += String.fromCharCode((lY[eO >> 5] >>> (eO % 32)) & lZ)
            }
            return lX
        },
        lr: function (ma) {
            var mb = this.lo ? "0123456789ABCDEF" : "0123456789abcdef";
            var lX = "";
            for (var eO = 0; eO < ma.length * 4; eO++) {
                lX += mb.charAt((ma[eO >> 2] >> ((eO % 4) * 8 + 4)) & 0xF) + mb.charAt((ma[eO >> 2] >> ((eO % 4) * 8)) & 0xF)
            }
            return lX
        },
        lv: function (ma) {
            var mc = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
            var lX = "";
            for (var eO = 0; eO < ma.length * 4; eO += 3) {
                var md = (((ma[eO >> 2] >> 8 * (eO % 4)) & 0xFF) << 16) | (((ma[eO + 1 >> 2] >> 8 * ((eO + 1) % 4)) & 0xFF) << 8) | ((ma[eO + 2 >> 2] >> 8 * ((eO + 2) % 4)) & 0xFF);
                for (var jN = 0; jN < 4; jN++) {
                    if (eO * 8 + jN * 6 > ma.length * 32) {
                        lX += this.lp
                    } else {
                        lX += mc.charAt((md >> 6 * (3 - jN)) & 0x3F)
                    }
                }
            }
            return lX
        }
    };
    this.eB = {
        _3dNotBoolean: 'JSChart: 3D setting must be boolean (true/false)',
        _alignNotBoolean: 'JSChart: Alignment setting must be boolean (true/false)',
        _axisNameNotString: 'JSChart: Axis name must be string',
        _axisPrefixNotString: 'JSChart: Axis values prefix must be string',
        _axisSuffixNotString: 'JSChart: Axis values suffix must be string',
        _axisValuesAngleNotNumber: 'JSChart: Axis angle must be a number between 0 and 90',
        _axisValuesNotNumber: 'JSChart: The number of axis values must be a number greater than 1',
        _axisWidthNotNumber: 'JSChart: Axis width must be a number',
        _backgroundImageNotString: 'JSChart: Background image name must be string',
        _barBorderWidthNotNumber: 'JSChart: Bars border width must be a number',
        _barSpacingRatioNotNumber: 'JSChart: Bars spacing ratio must be a number between 0 and 100',
        _barValuesNotBoolean: 'JSChart: Bar values setting must be boolean (true/false)',
        _barValuesPrefixNotString: 'JSChart: Bar values prefix must be string',
        _barValuesSuffixNotString: 'JSChart: Bar values suffix must be string',
        _colorLength: 'JSChart: Colors array length must equal data length in case of pie and bar graphs',
        _colorNotArray: 'JSChart: Color data not array',
        _dataNotArray: 'JSChart: Input data not array',
        _dataWrongFormat: 'JSChart: Input data in wrong format for selected chart type',
        _depthNotNumber: 'JSChart: Depth setting must be a number',
        _errorsNotBoolean: 'JSChart: Error alerts setting must be boolean (true/false)',
        _extendNotBoolean: 'JSChart: Graph extend setting must be boolean (true/false)',
        _flagOffsetNotNumber: 'JSChart: Flag offset must be a number',
        _flagShapeNotString: 'JSChart: Flag shape must be a string',
        _flagWidthNotNumber: 'JSChart: Flag line width must be a number',
        _fontFamilyNotString: 'JSChart: All font family names must be strings',
        _fontSizeNotNumber: 'JSChart: All font sizes must be numbers',
        _gridNotBoolean: 'JSChart: Grid setting must be boolean (true/false)',
        _idNotString: 'JSChart: Id not string',
        _intervalNotNumber: 'JSChart: All interval limits must be numbers',
        _invalidArea: 'JSChart: Invalid area call',
        _invalidBarNumber: 'JSChart: Invalid bar number',
        _invalidColor: 'JSChart: All color values must be in hexa format (#rgb or #rrggbb)',
        _invalidFunction: 'JSChart: Callback not a function',
        _invalidIntervalX: 'JSChart: Invalid interval on axis X',
        _invalidIntervalY: 'JSChart: Invalid interval on axis Y',
        _invalidLabel: 'JSChart: Invalid label format',
        _invalidPieAngle: 'JSChart: Invalid pie angle',
        _invalidTooltip: 'JSChart: Invalid tooltip format',
        _invalidValueFormat: 'JSChart: Invalid values format',
        _legendNotBoolean: 'JSChart: Legend switch must be boolean (true/false)',
        _invalidLegendPosition: 'JSChart: Legend position must be string (see documentation for values) or two number coordinates',
        _legendTextNotString: 'JSChart: Legend text not string',
        _lineWidthNotNumber: 'JSChart: Lines width must be a number',
        _noCanvasSupport: 'JSChart: No canvas support',
        _noData: 'JSChart: No data loaded',
        _notEnoughData: 'JSChart: Not enough data to render chart',
        _noKey: 'JSChart: Key missing or mismatch',
        _noName: 'JSChart: Name must be string and correspond to an existing ID',
        _noTooltip: 'JSChart: No tooltip with this id',
        _noType: 'JSChart: Chart type not supported',
        _notBars: 'JSChart: Chart is not bars type',
        _notLine: 'JSChart: Chart is not line type',
        _notPie: 'JSChart: Chart is not pie type',
        _opacityNotNumber: 'JSChart: Any opacity must be a number between 0 (transparent) and 1 (opaque)',
        _optionSetNotArray: 'JSChart: Option set not array',
        _paddingNotNumber: 'JSChart: Padding values must be numbers',
        _paddingTooMuch: 'JSChart: The sum of paddings exceed the canvas size',
        _piePositionNotNumber: 'JSChart: Pie position coordinates must be numbers',
        _pieUnitsFontSizeNotNumber: 'JSChart: Pie units font size must be a number',
        _pieUnitsOffsetNotNumber: 'JSChart: Pie units offset must be a number',
        _pieValuesOffsetNotNumber: 'JSChart: Pie values offset must be a number',
        _pieValuesPrefixNotString: 'JSChart: Pie values prefix must be string',
        _pieValuesSuffixNotString: 'JSChart: Pie values suffix must be string',
        _prefixNotString: 'JSChart: Canvas id prefix must be string',
        _radiusNotNumber: 'JSChart: All radius settings must be numbers',
        _reverseNotBoolean: 'JSChart: Axis reverse setting must be boolean (true/false)',
        _sizeNotNumber: 'JSChart: Graph size arguments must be numbers',
        _speedNotNumber: 'JSChart: Speed must be a number',
        _titleNotString: 'JSChart: Title must be string',
        _titlePositionNotString: 'JSChart: Title position must be string (center, left or right)',
        _tooltipBorderNotString: 'JSChart: Tooltip border must be string',
        _tooltipFontNotString: 'JSChart: Tooltip font family must be string',
        _tooltipOffsetNotNumber: 'JSChart: Tooltip offset must be a number',
        _tooltipIdNotNumber: 'JSChart: Tooltip id must be a number',
        _tooltipPaddingNotString: 'JSChart: Tooltip padding must be string',
        _tooltipPositionNotString: 'JSChart: Tooltip position must be string',
        _tooltipPositionWrong: 'JSChart: Wrong tooltip position, possible values are nw, ne, sw and se',
        _userLabelNotString: 'JSChart: Graph label must be string',
        _userLabelPositionNotString: 'JSChart: Graph label position must be string',
        _userLabelPositionWrong: 'JSChart: Wrong graph label position, possible values are nw, ne, sw and se',
        _valuesDecimalsNotNumber: 'JSChart: Decimals must be a number',
        _valuesShowNotBoolean: 'JSChart: Values show setting must be boolean (true/false)',
        _xmlEmptyData: 'JSChart XML/JSON: Empty data set',
        _xmlEmptyKey: 'JSChart XML/JSON: Empty or missing key',
        _xmlEmptyName: 'JSChart XML/JSON: Empty or missing chart name',
        _xmlEmptyType: 'JSChart XML/JSON: Empty or missing chart type',
        _xmlFileNotLoaded: 'JSChart XML/JSON: File not loaded or malformed color/data/option set',
        _xmlMalformedColor: 'JSChart XML/JSON: Malformed color set',
        _xmlMalformedData: 'JSChart XML/JSON: Malformed data set',
        _xmlMalformedOption: 'JSChart XML/JSON: Malformed option set',
        _xmlUnexpectedFormat: 'JSChart XML/JSON: Unexpected format'
    }
}
function JSChart(name, type, code, lz, resize) {
    this.me = new mq();
    var me = this.me;
    var mf;
    if (typeof lz === 'boolean') {
        resize = lz
    }
    lz = '';
    if (typeof code === 'undefined') {
        code = ''
    }
    me.iT(name, type.toLowerCase(), code, lz, resize);
    me.eA = function (err) {
        if (me.dm) {
            alert(me.eB[err])
        }
    };
    this.colorize = function (mg) {
        if (me.bh.length === 0) {
            me.eA('_noData');
            return
        }
        if (!me.ga(mg)) {
            me.eA('_colorNotArray');
            return
        }
        if (me.bh.length !== mg.length && me.eb !== 'line') {
            me.eA('_colorLength');
            return
        }
        me.bd = mg
    };
    this.colorizeBars = function (mg) {
        if (me.eb === 'bar') {
            this.colorize(mg)
        } else {
            me.eA('_notBars')
        }
    };
    this.colorizePie = function (mg) {
        if (me.eb === 'pie') {
            this.colorize(mg)
        } else {
            me.eA('_notPie')
        }
    };
    this.draw = function () {
        if (me.bh.length === 0) {
            me.eA('_noData');
            return
        }
        if (((me.bh.length === 1 && !me.dg) || (me.bh[0].length === 1 && me.dg)) && me.eb === 'line') {
            me.eA('_notEnoughData');
            return
        }
        me.fY()
    };
    this.getDataIds = function () {
        return me.bi
    };
    this.resize = function (eJ, eK) {
        if (typeof eJ !== 'number' || typeof eK !== 'number') {
            me.eA('_sizeNotNumber');
            return
        }
        me.iV(eJ, eK);
        me.fY()
    };
    this.set3D = function (mh) {
        if (typeof mh !== 'boolean') {
            me.eA('_3dNotBoolean');
            return
        }
        me.mr = mh
    };
    this.setArea = function (fe, fH) {
        if (typeof fe !== 'string' || !me.iZ(fH)) {
            me.eA('_invalidArea');
            return
        }
        me.mu[fe] = fH
    };
    this.setAxisAlignX = function (align) {
        if (typeof align !== 'boolean') {
            me.eA('_alignNotBoolean');
            return
        }
        me.mI = align;
        me.A = align
    };
    this.setAxisAlignY = function (align) {
        if (typeof align !== 'boolean') {
            me.eA('_alignNotBoolean');
            return
        }
        me.z = align;
        me.B = align
    };
    this.setAxisAlignFirstX = function (align) {
        if (typeof align !== 'boolean') {
            me.eA('_alignNotBoolean');
            return
        }
        me.mI = align
    };
    this.setAxisAlignFirstY = function (align) {
        if (typeof align !== 'boolean') {
            me.eA('_alignNotBoolean');
            return
        }
        me.z = align
    };
    this.setAxisAlignLastX = function (align) {
        if (typeof align !== 'boolean') {
            me.eA('_alignNotBoolean');
            return
        }
        me.A = align
    };
    this.setAxisAlignLastY = function (align) {
        if (typeof align !== 'boolean') {
            me.eA('_alignNotBoolean');
            return
        }
        me.B = align
    };
    this.setAxisColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.f = color
    };
    this.setAxisNameColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.mv = color;
        me.mw = color
    };
    this.setAxisNameColorX = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.mv = color
    };
    this.setAxisNameColorY = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.mw = color
    };
    this.setAxisNameFontFamily = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.mx = fg;
        me.my = fg
    };
    this.setAxisNameFontFamilyX = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.mx = fg
    };
    this.setAxisNameFontFamilyY = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.my = fg
    };
    this.setAxisNameFontSize = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.k = Number(size);
        me.mz = Number(size)
    };
    this.setAxisNameFontSizeX = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.k = Number(size)
    };
    this.setAxisNameFontSizeY = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.mz = Number(size)
    };
    this.setAxisNameX = function (name) {
        if (typeof name !== 'string') {
            me.eA('_axisNameNotString');
            return
        }
        me.m = name
    };
    this.setAxisNameY = function (name) {
        if (typeof name !== 'string') {
            me.eA('_axisNameNotString');
            return
        }
        me.mA = name
    };
    this.setAxisPaddingBottom = function (number) {
        if (typeof number !== 'number') {
            me.eA('_paddingNotNumber');
            return
        }
        if (me.u + number >= me.ds) {
            me.eA('_paddingTooMuch');
            return
        }
        me.mB = Number(number)
    };
    this.setAxisPaddingLeft = function (number) {
        if (typeof number !== 'number') {
            me.eA('_paddingNotNumber');
            return
        }
        if (number + me.mF >= me.dr) {
            me.eA('_paddingTooMuch');
            return
        }
        me.mD = Number(number)
    };
    this.setAxisPaddingRight = function (number) {
        if (typeof number !== 'number') {
            me.eA('_paddingNotNumber');
            return
        }
        if (me.mD + number >= me.dr) {
            me.eA('_paddingTooMuch');
            return
        }
        me.mF = Number(number)
    };
    this.setAxisPaddingTop = function (number) {
        if (typeof number !== 'number') {
            me.eA('_paddingNotNumber');
            return
        }
        if (number + me.mB >= me.ds) {
            me.eA('_paddingTooMuch');
            return
        }
        me.u = Number(number)
    };
    this.setAxisReversed = function (reverse) {
        if (typeof reverse !== 'boolean') {
            me.eA('_reverseNotBoolean');
            return
        }
        if (me.eb === 'bar') {
            me.mH = reverse
        }
    };
    this.setAxisValuesAngle = function (number) {
        if (typeof number !== 'number') {
            me.eA('_axisValuesAngleNotNumber');
            return
        }
        if (number < 0) {
            number = 0
        }
        if (number > 89.9) {
            number = 89.9
        }
        me.C = number
    };
    this.setAxisValuesColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.D = color;
        me.E = color
    };
    this.setAxisValuesColorX = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.D = color
    };
    this.setAxisValuesColorY = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.E = color
    };
    this.setAxisValuesDecimals = function (number) {
        if (typeof number !== 'number') {
            me.eA('_valuesDecimalsNotNumber');
            return
        }
        me.F = number;
        me.G = number
    };
    this.setAxisValuesDecimalsX = function (number) {
        if (typeof number !== 'number') {
            me.eA('_valuesDecimalsNotNumber');
            return
        }
        me.F = number
    };
    this.setAxisValuesDecimalsY = function (number) {
        if (typeof number !== 'number') {
            me.eA('_valuesDecimalsNotNumber');
            return
        }
        me.G = number
    };
    this.setAxisValuesFontFamily = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.J = fg;
        me.K = fg
    };
    this.setAxisValuesFontFamilyX = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.J = fg
    };
    this.setAxisValuesFontFamilyY = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.K = fg
    };
    this.setAxisValuesFontSize = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.L = Number(size);
        me.M = Number(size)
    };
    this.setAxisValuesFontSizeX = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.L = Number(size)
    };
    this.setAxisValuesFontSizeY = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.M = Number(size)
    };
    this.setAxisValuesNumberX = function (number) {
        if (typeof number !== 'number' && number > 1) {
            me.eA('_axisValuesNotNumber');
            return
        }
        me.V = number
    };
    this.setAxisValuesNumberY = function (number) {
        if (typeof number !== 'number' && number > 1) {
            me.eA('_axisValuesNotNumber');
            return
        }
        me.W = number
    };
    this.setAxisValuesPaddingBottom = function (number) {
        if (typeof number !== 'number') {
            me.eA('_paddingNotNumber');
            return
        }
        me.N = Number(number)
    };
    this.setAxisValuesPaddingLeft = function (number) {
        if (typeof number !== 'number') {
            me.eA('_paddingNotNumber');
            return
        }
        me.O = Number(number)
    };
    this.setAxisValuesPrefixX = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_axisPrefixNotString');
            return
        }
        me.P = fg
    };
    this.setAxisValuesPrefixY = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_axisPrefixNotString');
            return
        }
        me.Q = fg
    };
    this.setAxisValuesSuffixX = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_axisSuffixNotString');
            return
        }
        me.T = fg
    };
    this.setAxisValuesSuffixY = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_axisSuffixNotString');
            return
        }
        me.U = fg
    };
    this.setAxisWidth = function (number) {
        if (typeof number !== 'number') {
            me.eA('_axisWidthNotNumber');
            return
        }
        me.X = number
    };
    this.setBackgroundColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.ba = color
    };
    this.setBackgroundImage = function (src) {
        if (typeof src !== 'string') {
            me.eA('_backgroundImageNotString');
            return
        }
        me.Y = src
    };
    this.setBarBorderColor = function (color, hF) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        if (typeof hF === 'undefined') {
            me.bw = color
        } else if (typeof me.bv === 'string') {
            me.bv = [];
            me.bv[hF - 1] = color
        } else {
            me.bv[hF - 1] = color
        }
    };
    this.setBarBorderWidth = function (number) {
        if (typeof number !== 'number') {
            me.eA('_barBorderWidthNotNumber');
            return
        }
        me.bx = Number(number)
    };
    this.setBarColor = function (color, hF) {
        if (me.eb !== 'bar') {
            return false
        }
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        if (typeof hF === 'undefined') {
            me.bz = color
        } else if (typeof me.by === 'string') {
            me.by = [];
            me.by[hF - 1] = color
        } else {
            me.by[hF - 1] = color;
            if (typeof me.cV[hF - 1] !== 'undefined') {
                me.cV[hF - 1][0] = color
            }
        }
    };
    this.setBarDepth = function (number) {
        if (typeof number !== 'number') {
            me.eA('_depthNotNumber');
            return
        }
        me.bB = number
    };
    this.setBarOpacity = function (fE, hF) {
        if (typeof fE !== 'number' || (fE < 0 || fE > 1)) {
            me.eA('_opacityNotNumber');
            return
        }
        if (typeof hF === 'undefined') {
            me.bA = fE
        } else if (typeof me.bC === 'number') {
            me.bC = [];
            me.bC[hF - 1] = fE
        } else {
            me.bC[hF - 1] = fE
        }
    };
    this.setBarSpacingRatio = function (number) {
        if (typeof number !== 'number' || (number < 0 || number > 100)) {
            me.eA('_barSpacingRatioNotNumber');
            return
        }
        me.bE = Number(number) / 2
    };
    this.setBarSpeed = function (number) {
        if (typeof number !== 'number') {
            me.eA('_speedNotNumber');
            return
        }
        number = 100 - number;
        if (number < 1) {
            number = 1
        }
        if (number > 100) {
            number = 100
        }
        me.bF = Number(number)
    };
    this.setBarValues = function (jM) {
        if (typeof jM !== 'boolean') {
            me.eA('_barValuesNotBoolean');
            return
        }
        me.bG = jM
    };
    this.setBarValuesColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.bH = color
    };
    this.setBarValuesDecimals = function (number) {
        if (typeof number !== 'number') {
            me.eA('_valuesDecimalsNotNumber');
            return
        }
        me.bI = number
    };
    this.setBarValuesFontFamily = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.bJ = fg
    };
    this.setBarValuesFontSize = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.bK = Number(size)
    };
    this.setBarValuesPrefix = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_barValuesPrefixNotString');
            return
        }
        me.bL = fg
    };
    this.setBarValuesSuffix = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_barValuesSuffixNotString');
            return
        }
        me.bM = fg
    };
    this.setCanvasIdPrefix = function (prefix) {
        if (typeof prefix !== 'string') {
            me.eA('_prefixNotString');
            return
        }
        me.bc = prefix
    };
    this.setDataArray = function (data, id, usestring) {
        if (me.cv) {
            return
        }
        if (!me.ga(data)) {
            me.eA('_dataNotArray');
            return
        }
        me.eb = type.toLowerCase();
        var eO;
        var eN;
        if ((typeof data[0][0] === 'string' || usestring === true) && me.eb === 'line') {
            if (me.bh.length === 0) {
                for (eO = 0, eN = data.length; eO < eN; eO++) {
                    this.setLabelX([eO, String(data[eO][0]), 'x-value']);
                    me.bj[data[eO][0]] = eO;
                    data[eO][0] = eO
                }
            } else {
                var min = me.im();
                var max = me.io();
                var fb = Math.round((max - min) / (data.length - 1));
                for (var jN = 0, eO = min, eN = data.length; eO < max, jN < eN; eO += fb, jN++) {
                    this.setLabelX([eO, String(data[jN][0])], 'x-value');
                    me.bj[data[jN][0]] = eO;
                    data[jN][0] = eO
                }
            }
            this.setShowXValues(false);
            this.bV = true
        }
        if (!me.iW(data)) {
            me.eA('_dataWrongFormat');
            return
        }
        if (typeof id !== 'undefined' && id !== null && typeof id !== 'string') {
            me.eA('_idNotString');
            return
        }
        if (me.eb === 'line') {
            me.dg = true;
            var mi = false;
            if (me.bh === []) {
                me.bh = new Array(data)
            } else {
                for (var eJ in me.bi) {
                    if (me.bi[eJ] === id) {
                        me.bh[eJ] = data;
                        mi = true
                    }
                }
                if (!mi) {
                    me.bh[me.bh.length] = data
                }
            }
            if (!mi) {
                var index = me.bh.length - 1;
                me.bi[index] = (typeof id === 'undefined' || id === null) ? '_autoid_' + index : id;
                me.ct[index] = false;
                if (typeof me.bP[index] === 'undefined') {
                    me.bP[index] = me.bQ
                }
                if (typeof me.bT[index] === 'undefined') {
                    me.bT[index] = me.bR
                }
                if (typeof me.bW[index] === 'undefined') {
                    me.bW[index] = me.bS
                }
                me.cX.push([me.bQ, me.bi[index], me.bi[index]])
            }
        } else if (me.eb === 'bar') {
            eN = data.length;
            var hF = 0;
            for (eO = 0; eO < eN; eO++) {
                if (hF < data[eO].length) {
                    hF = data[eO].length
                }
            }
            for (eO = 1; eO < hF; eO++) {
                me.cV.push([me.bz, String(eO), eO]);
                me.ct.push(false)
            }
            me.bh = data
        } else {
            me.bh = data
        }
    };
    this.setDataJSON = function (jt, fg) {
        if (me.cv) {
            return
        }
        var je = me.js(jt, fg);
        var jf = me.jd(je);
        var ji = me.jA(jf);
        if (me.ga(ji) && ji.length > 0) {
            var eN = ji.length;
            var hn;
            var gU;
            var mj;
            for (var eO = 0; eO < eN; eO++) {
                if (ji[eO].length < 3) {
                    mj = ji[eO][0] + '(' + ji[eO][1] + ')'
                } else {
                    mj = ji[eO][0] + '(' + ji[eO][1] + ', "' + ji[eO][2] + '")'
                }
                eval("this." + mj)
            }
        }
    };
    this.setDataXML = function (jt, fg) {
        if (me.cv) {
            return
        }
        var ji = me.jA(me.jv(jt, fg));
        if (me.ga(ji) && ji.length > 0) {
            var eN = ji.length;
            var hn;
            var gU;
            var mj;
            for (var eO = 0; eO < eN; eO++) {
                if (ji[eO].length < 3) {
                    mj = ji[eO][0] + '(' + ji[eO][1] + ')'
                } else {
                    mj = ji[eO][0] + '(' + ji[eO][1] + ', "' + ji[eO][2] + '")'
                }
                eval("this." + mj)
            }
        }
    };
    this.setErrors = function (mk) {
        if (typeof mk !== 'boolean') {
            me.eA('_errorsNotBoolean');
            return
        }
        me.dm = mk
    };
    this.setFlagColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.bm = color
    };
    this.setFlagFillColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.bn = color
    };
    this.setFlagOffset = function (fF) {
        if (typeof fF !== 'number') {
            me.eA('_flagOffsetNotNumber');
            return
        }
        me.bo = Number(fF)
    };
    this.setFlagOpacity = function (fE) {
        if (typeof fE !== 'number' || (fE < 0 || fE > 1)) {
            me.eA('_opacityNotNumber');
            return
        }
        me.bp = fE
    };
    this.setFlagShape = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_flagShapeNotString');
            return
        }
        me.br = fg
    };
    this.setFlagRadius = function (iz) {
        if (typeof iz !== 'number') {
            me.eA('_radiusNotNumber');
            return
        }
        me.bq = Number(iz)
    };
    this.setFlagWidth = function (number) {
        if (typeof number !== 'number') {
            me.eA('_flagWidthNotNumber');
            return
        }
        me.bs = Number(number)
    };
    this.setFontFamily = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.dv = fg
    };
    this.setGraphExtend = function (hu) {
        if (typeof hu !== 'boolean') {
            me.eA('_extendNotBoolean');
            return
        }
        me.bN = hu;
        me.bO = hu
    };
    this.setGraphExtendX = function (hu) {
        if (typeof hu !== 'boolean') {
            me.eA('_extendNotBoolean');
            return
        }
        me.bN = hu
    };
    this.setGraphExtendY = function (hu) {
        if (typeof hu !== 'boolean') {
            me.eA('_extendNotBoolean');
            return
        }
        me.bO = hu
    };
    this.setGraphLabel = function (label) {
        if (typeof label !== 'string') {
            me.eA('_userLabelNotString');
            return
        }
        me.ee = label
    };
    this.setGraphLabelColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.ef = color
    };
    this.setGraphLabelFontFamily = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.eg = fg
    };
    this.setGraphLabelFontSize = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.eh = Number(size)
    };
    this.setGraphLabelOpacity = function (fE) {
        if (typeof fE !== 'number' || (fE < 0 || fE > 1)) {
            me.eA('_opacityNotNumber');
            return
        }
        me.ei = fE
    };
    this.setGraphLabelPosition = function (position) {
        if (typeof position !== 'string') {
            me.eA('_userLabelPositionNotString');
            return
        }
        var eN = me.dX.length;
        for (var eO = 0; eO < eN; eO++) {
            if (me.dX[eO] === position) {
                me.ej = position;
                return true
            }
        }
        me.eA('_userLabelPositionWrong');
        return
    };
    this.setGraphLabelShadowColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.ek = color
    };
    this.setGrid = function (ml) {
        if (typeof ml !== 'boolean') {
            me.eA('_gridNotBoolean');
            return
        }
        me.co = ml
    };
    this.setGridColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.cp = color;
        me.cq = color
    };
    this.setGridColorX = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.cp = color
    };
    this.setGridColorY = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.cq = color
    };
    this.setGridOpacity = function (fE) {
        if (typeof fE !== 'number' || (fE < 0 || fE > 1)) {
            me.eA('_opacityNotNumber');
            return
        }
        me.cr = fE;
        me.cs = fE
    };
    this.setGridOpacityX = function (fE) {
        if (typeof fE !== 'number' || (fE < 0 || fE > 1)) {
            me.eA('_opacityNotNumber');
            return
        }
        me.cr = fE
    };
    this.setGridOpacityY = function (fE) {
        if (typeof fE !== 'number' || (fE < 0 || fE > 1)) {
            me.eA('_opacityNotNumber');
            return
        }
        me.cs = fE
    };
    this.setIntervalEndX = function (number) {
        if (typeof number !== 'number') {
            me.eA('_intervalNotNumber');
            return
        }
        me.cw = number
    };
    this.setIntervalEndY = function (number) {
        if (typeof number !== 'number') {
            me.eA('_intervalNotNumber');
            return
        }
        me.cx = number
    };
    this.setIntervalStartX = function (number) {
        if (typeof number !== 'number') {
            me.eA('_intervalNotNumber');
            return
        }
        me.cy = number
    };
    this.setIntervalStartY = function (number) {
        if (typeof number !== 'number') {
            me.eA('_intervalNotNumber');
            return
        }
        me.cz = number
    };
    this.setIntervalX = function (start, mm) {
        this.setIntervalStartX(start);
        this.setIntervalEndX(mm)
    };
    this.setIntervalY = function (start, mm) {
        this.setIntervalStartY(start);
        this.setIntervalEndY(mm)
    };
    this.setLabelAlignX = function (align) {
        if (typeof align !== 'boolean') {
            me.eA('_alignNotBoolean');
            return
        }
        me.cA = align;
        me.cC = align
    };
    this.setLabelAlignY = function (align) {
        if (typeof align !== 'boolean') {
            me.eA('_alignNotBoolean');
            return
        }
        me.cB = align;
        me.cD = align
    };
    this.setLabelAlignFirstX = function (align) {
        if (typeof align !== 'boolean') {
            me.eA('_alignNotBoolean');
            return
        }
        me.cA = align
    };
    this.setLabelAlignFirstY = function (align) {
        if (typeof align !== 'boolean') {
            me.eA('_alignNotBoolean');
            return
        }
        me.cB = align
    };
    this.setLabelAlignLastX = function (align) {
        if (typeof align !== 'boolean') {
            me.eA('_alignNotBoolean');
            return
        }
        me.cC = align
    };
    this.setLabelAlignLastY = function (align) {
        if (typeof align !== 'boolean') {
            me.eA('_alignNotBoolean');
            return
        }
        me.cD = align
    };
    this.setLabelColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.cE = color;
        me.cF = color
    };
    this.setLabelColorX = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.cE = color
    };
    this.setLabelColorY = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.cF = color
    };
    this.setLabelFontFamily = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.cG = fg;
        me.cH = fg
    };
    this.setLabelFontFamilyX = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.cG = fg
    };
    this.setLabelFontFamilyY = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.cH = fg
    };
    this.setLabelFontSize = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.cI = Number(size);
        me.cJ = Number(size)
    };
    this.setLabelFontSizeX = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.cI = Number(size)
    };
    this.setLabelFontSizeY = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.cJ = Number(size)
    };
    this.setLabelPaddingBottom = function (number) {
        if (typeof number !== 'number') {
            me.eA('_paddingNotNumber');
            return
        }
        me.cK = Number(number)
    };
    this.setLabelPaddingLeft = function (number) {
        if (typeof number !== 'number') {
            me.eA('_paddingNotNumber');
            return
        }
        me.cL = Number(number)
    };
    this.setLabelX = function (label) {
        if (!me.ga(label) || label.length < 2 || label.length > 3) {
            me.eA('_invalidLabel');
            return
        }
        if (me.eb === 'line' && typeof label[0] === 'string') {
            if (typeof me.bj[label[0]] !== 'undefined') {
                label[0] = me.bj[label[0]]
            }
        }
        me.cM.push(label)
    };
    this.setLabelY = function (label) {
        if (!me.ga(label) || label.length !== 2) {
            me.eA('_invalidLabel');
            return
        }
        me.cN.push(label)
    };
    this.setLegend = function (color, text) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        if (typeof text !== 'string') {
            me.eA('_legendTextNotString');
            return
        }
        me.cU.push([color, text, '__custom__'])
    };
    this.setLegendColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.cO = color
    };
    this.setLegendDetect = function (kf) {
        if (typeof kf !== 'boolean') {
            me.eA('_legendNotBoolean');
            return
        }
        me.cP = kf
    };
    this.setLegendFontFamily = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.cQ = fg
    };
    this.setLegendFontSize = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.cR = Number(size)
    };
    this.setLegendForBar = function (bar, text) {
        if (typeof bar !== 'number') {
            me.eA('_invalidBarNumber');
            return
        }
        bar--;
        if (bar < 0 || bar >= me.cV.length) {
            me.eA('_invalidBarNumber');
            return
        }
        if (typeof text !== 'string') {
            me.eA('_legendTextNotString');
            return
        }
        me.cV[bar] = [(typeof me.by[bar] === 'undefined') ? me.bz : me.by[bar], text]
    };
    this.setLegendForLine = function (id, text) {
        if (typeof id !== 'undefined' && typeof id !== 'string') {
            me.eA('_idNotString');
            return
        }
        if (typeof text !== 'string') {
            me.eA('_legendTextNotString');
            return
        }
        var eN = me.bi.length;
        for (var eO = 0; eO < eN; eO++) {
            if (typeof me.bi[eO] !== 'undefined' && me.bi[eO] === id) {
                me.cX[eO][1] = text;
                break
            }
        }
    };
    this.setLegendPadding = function (number) {
        if (typeof number !== 'number') {
            me.eA('_paddingNotNumber');
            return
        }
        me.cS = number
    };
    this.setLegendPosition = function (ff, fl) {
        if (typeof ff === 'string') {
            me.cT = ff
        } else if (typeof ff === 'number' && typeof fl === 'number') {
            me.cT = [ff, fl]
        } else {
            me.eA('_invalidLegendPosition');
            return
        }
    };
    this.setLegendShow = function (kf) {
        if (typeof kf !== 'boolean') {
            me.eA('_legendNotBoolean');
            return
        }
        me.cW = kf
    };
    this.setLineColor = function (color, id) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        if (typeof id !== 'undefined' && typeof id !== 'string') {
            me.eA('_idNotString');
            return
        }
        if (typeof id === 'undefined') {
            if (me.bP.length === 1) {
                me.bP[0] = color
            } else {
                var eN = me.bi.length;
                for (var eO = 0; eO < eN; eO++) {
                    if (typeof me.bP[eO] !== 'undefined') {
                        me.bP[eO] = color
                    }
                }
            }
        } else {
            if (me.bi.length < 2) {
                me.bP[0] = color
            } else {
                for (var lz in me.bi) {
                    if (me.bi[lz] === id) {
                        me.bP[lz] = color;
                        me.cX[lz][0] = color
                    }
                }
            }
        }
    };
    this.setLineOpacity = function (fE, id) {
        if (typeof fE !== 'number' || (fE < 0 || fE > 1)) {
            me.eA('_opacityNotNumber');
            return
        }
        if (typeof id === 'undefined') {
            if (me.bT.length === 1) {
                me.bT[0] = fE
            } else {
                var eN = me.bi.length;
                for (var eO = 0; eO < eN; eO++) {
                    if (typeof me.bP[eO] !== 'undefined') {
                        me.bT[eO] = fE
                    }
                }
            }
        } else {
            if (me.bi.length < 2) {
                me.bT[0] = fE
            } else {
                var index = false;
                for (var lz in me.bi) {
                    if (me.bi[lz] === id) {
                        index = lz;
                        break
                    }
                }
                if (index !== false) {
                    me.bT[index] = fE
                }
            }
        }
    };
    this.setLineSpeed = function (number) {
        if (typeof number !== 'number') {
            me.eA('_speedNotNumber');
            return
        }
        number = (100 - number) * 10;
        if (number < 1) {
            number = 1
        }
        if (number > 1000) {
            number = 1000
        }
        me.bU = Number(number)
    };
    this.setLineWidth = function (number, id) {
        if (typeof number !== 'number') {
            me.eA('_lineWidthNotNumber');
            return
        }
        number = Number(number);
        if (typeof id === 'undefined') {
            if (me.bW.length === 1) {
                me.bW[0] = number
            } else {
                var eN = me.bi.length;
                for (var eO = 0; eO < eN; eO++) {
                    if (typeof me.bW[eO] !== 'undefined') {
                        me.bW[eO] = number
                    }
                }
            }
        } else {
            if (me.bi.length < 2) {
                me.bW[0] = number
            } else {
                var index = false;
                for (var lz in me.bi) {
                    if (me.bi[lz] === id) {
                        index = lz;
                        break
                    }
                }
                if (index !== false) {
                    me.bW[index] = number
                }
            }
        }
    };
    this.setPieAngle = function (number) {
        if (typeof number !== 'number' || number < 0 || number > 89) {
            me.eA('_invalidPieAngle');
            return
        }
        me.bX = number
    };
    this.setPieDepth = function (number) {
        if (typeof number !== 'number') {
            me.eA('_depthNotNumber');
            return
        }
        if (number < 1) {
            number = 1
        }
        me.bY = number
    };
    this.setPieOpacity = function (fE) {
        if (typeof fE !== 'number' || (fE < 0 || fE > 1)) {
            me.eA('_opacityNotNumber');
            return
        }
        me.bZ = Number(fE)
    };
    this.setPiePosition = function (eJ, eK) {
        if (typeof eJ !== 'number' || typeof eK !== 'number') {
            me.eA('_piePositionNotNumber');
            return
        }
        me.ca = Number(eJ);
        me.cb = Number(eK)
    };
    this.setPieRadius = function (iz) {
        if (typeof iz !== 'number') {
            me.eA('_radiusNotNumber');
            return
        }
        me.cc = Number(iz)
    };
    this.setPieUnitsColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.cd = color
    };
    this.setPieUnitsFontFamily = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.ce = fg
    };
    this.setPieUnitsFontSize = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.cf = Number(size)
    };
    this.setPieUnitsOffset = function (fF) {
        if (typeof fF !== 'number') {
            me.eA('_pieUnitsOffsetNotNumber');
            return
        }
        me.cg = Number(fF)
    };
    this.setPieValuesColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.mJ = color
    };
    this.setPieValuesDecimals = function (number) {
        if (typeof number !== 'number') {
            me.eA('_valuesDecimalsNotNumber');
            return
        }
        me.ci = number
    };
    this.setPieValuesFontFamily = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.cj = fg
    };
    this.setPieValuesFontSize = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.ck = Number(size)
    };
    this.setPieValuesOffset = function (fF) {
        if (typeof fF !== 'number') {
            me.eA('_pieUnitsOffsetNotNumber');
            return
        }
        me.cl = Number(fF)
    };
    this.setPieValuesPrefix = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_pieValuesPrefixNotString');
            return
        }
        me.cm = fg
    };
    this.setPieValuesSuffix = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_pieValuesSuffixNotString');
            return
        }
        me.cn = fg
    };
    this.setShowXValues = function (show) {
        if (typeof show !== 'boolean') {
            me.eA('_valuesShowNotBoolean');
            return
        }
        me.R = show
    };
    this.setShowYValues = function (show) {
        if (typeof show !== 'boolean') {
            me.eA('_valuesShowNotBoolean');
            return
        }
        me.S = show
    };
    this.setSize = function (eJ, eK) {
        if (typeof eJ !== 'number' || typeof eK !== 'number') {
            me.eA('_sizeNotNumber');
            return
        }
        me.iV(eJ, eK)
    };
    this.setSpeed = function (number) {
        me.setBarSpeed(number);
        if (typeof number === 'number') {
            me.setLineSpeed(number)
        }
    };
    this.setTextPaddingBottom = function (number) {
        if (typeof number !== 'number') {
            me.eA('_paddingNotNumber');
            return
        }
        me.dC = Number(number)
    };
    this.setTextPaddingLeft = function (number) {
        if (typeof number !== 'number') {
            me.eA('_paddingNotNumber');
            return
        }
        me.dE = Number(number)
    };
    this.setTextPaddingTop = function (number) {
        if (typeof number !== 'number') {
            me.eA('_paddingNotNumber');
            return
        }
        me.dG = Number(number)
    };
    this.setTitle = function (title) {
        if (typeof title !== 'string') {
            me.eA('_titleNotString');
            return
        }
        me.dI = title
    };
    this.setTitleColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.dJ = color
    };
    this.setTitleFontFamily = function (fg) {
        if (typeof fg !== 'string') {
            me.eA('_fontFamilyNotString');
            return
        }
        me.dK = fg
    };
    this.setTitleFontSize = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.dL = Number(size)
    };
    this.setTitlePosition = function (gy) {
        if (typeof gy !== 'string') {
            me.eA('_titlePositionNotString');
            return
        }
        me.dM = gy
    };
    this.setTooltip = function (fD, fH) {
        if (!me.ga(fD) || fD.length < 1 || fD.length > 3) {
            me.eA('_invalidTooltip');
            return
        }
        if (me.eb !== 'pie') {
            var line = (typeof fD[2] === 'undefined') ? '__all__' : fD[2];
            if (typeof me.dY[line] === 'undefined') {
                me.dY[line] = {}
            }
            if (me.eb === 'line' && typeof fD[0] === 'string') {
                if (typeof me.bj[fD[0]] !== 'undefined') {
                    me.dY[line][me.bj[fD[0]]] = fD
                }
            } else {
                me.dY[line][fD[0]] = fD
            }
        } else {
            me.dY[fD[0]] = fD
        }
        if (typeof fH !== 'undefined') {
            if (!me.iZ(fH)) {
                me.eA('_invalidFunction');
                return
            }
            if (me.eb !== 'pie') {
                if (me.eb === 'line' && typeof fD[0] === 'string') {
                    if (typeof me.bj[fD[0]] !== 'undefined') {
                        me.dY[line][me.bj[fD[0]]]['callback'] = fH
                    }
                } else {
                    me.dY[line][fD[0]]['callback'] = fH
                }
            } else {
                me.dY[fD[0]]['callback'] = fH
            }
        }
    };
    this.setTooltipBackground = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.dN = color
    };
    this.setTooltipBorder = function (mn) {
        if (typeof mn !== 'string') {
            me.eA('_tooltipBorderNotString');
            return
        }
        me.dO = mn
    };
    this.setTooltipFontColor = function (color) {
        if (typeof color !== 'string' || me.fM(color) === false) {
            me.eA('_invalidColor');
            return
        }
        me.dQ = color
    };
    this.setTooltipFontFamily = function (font) {
        if (typeof font !== 'string') {
            me.eA('_tooltipFontNotString');
            return
        }
        me.dR = font
    };
    this.setTooltipFontSize = function (size) {
        if (typeof size !== 'number') {
            me.eA('_fontSizeNotNumber');
            return
        }
        me.dS = Number(size)
    };
    this.setTooltipOpacity = function (fE) {
        if (typeof fE !== 'number' || (fE < 0 || fE > 1)) {
            me.eA('_opacityNotNumber');
            return
        }
        me.dU = Number(fE)
    };
    this.setTooltipPadding = function (mn) {
        if (typeof mn !== 'string') {
            me.eA('_tooltipPaddingNotString');
            return
        }
        me.dV = mn
    };
    this.setTooltipOffset = function (fF) {
        if (typeof fF !== 'number') {
            me.eA('_tooltipOffsetNotNumber');
            return
        }
        me.dT = Number(fF)
    };
    this.setTooltipPosition = function (position) {
        if (typeof position !== 'string') {
            me.eA('_tooltipPositionNotString');
            return
        }
        var eN = me.dX.length;
        for (var eO = 0; eO < eN; eO++) {
            if (me.dX[eO] === position) {
                me.dW = position;
                return true
            }
        }
        me.eA('_tooltipPositionWrong');
        return
    };
    this.setValuesFormat = function (iX) {
        if (iX !== '.' && iX !== ',' && iX !== false) {
            me.eA('_invalidValueFormat');
            return
        }
        me.el = iX
    }
}
function gf() {}
gf.mo = function (hF) {
    var iP = "0x";
    var mp = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f");
    for (var eO = 0; eO < hF.length; eO++) {
        iP += mp[hF.charCodeAt(eO) >> 4] + mp[hF.charCodeAt(eO) & 0xf]
    }
    return iP
};
gf.gg = function (he) {
    var iP = "";
    for (var eO = (he.substr(0, 2) == "0x") ? 2 : 0; eO < he.length; eO += 2) {
        iP += String.fromCharCode(parseInt(he.substr(eO, 2), 16))
    }
    return iP
};
if (!document.createElement('canvas').getContext) {
    (function () {
        var m = Math;
        var mr = m.round;
        var ms = m.sin;
        var mc = m.cos;
        var abs = m.abs;
        var sqrt = m.sqrt;
        var Z = 10;
        var Z2 = Z / 2;

        function getContext() {
            return this.context_ || (this.context_ = new CanvasRenderingContext2D_(this))
        }
        var slice = Array.prototype.slice;

        function bind(f, obj, var_args) {
            var a = slice.call(arguments, 2);
            return function () {
                return f.apply(obj, a.concat(slice.call(arguments)))
            }
        }
        function encodeHtmlAttribute(s) {
            return String(s).replace(/&/g, '&amp;').replace(/"/g, '&quot;')
        }
        function addNamespacesAndStylesheet(doc) {
            if (!doc.namespaces['g_vml_']) {
                doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', '#default#VML')
            }
            if (!doc.namespaces['g_o_']) {
                doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', '#default#VML')
            }
            if (!doc.styleSheets['ex_canvas_']) {
                var ss = doc.createStyleSheet();
                ss.owningElement.id = 'ex_canvas_';
                ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + 'text-align:left;width:300px;height:150px}'
            }
        }
        addNamespacesAndStylesheet(document);
        var G_vmlCanvasManager_ = {
            init: function (opt_doc) {
                if (/MSIE/.test(navigator.userAgent) && !window.opera) {
                    var doc = opt_doc || document;
                    doc.createElement('canvas');
                    doc.attachEvent('onreadystatechange', bind(this.init_, this, doc))
                }
            },
            init_: function (doc) {
                var els = doc.getElementsByTagName('canvas');
                for (var i = 0; i < els.length; i++) {
                    this.initElement(els[i])
                }
            },
            initElement: function (el) {
                if (!el.getContext) {
                    el.getContext = getContext;
                    addNamespacesAndStylesheet(el.ownerDocument);
                    el.innerHTML = '';
                    el.attachEvent('onpropertychange', onPropertyChange);
                    el.attachEvent('onresize', onResize);
                    var attrs = el.attributes;
                    if (attrs.width && attrs.width.specified) {
                        el.style.width = attrs.width.nodeValue + 'px'
                    } else {
                        el.width = el.clientWidth
                    }
                    if (attrs.height && attrs.height.specified) {
                        el.style.height = attrs.height.nodeValue + 'px'
                    } else {
                        el.height = el.clientHeight
                    }
                }
                return el
            }
        };

        function onPropertyChange(e) {
            var el = e.srcElement;
            switch (e.propertyName) {
            case 'width':
                el.getContext().clearRect();
                el.style.width = el.attributes.width.nodeValue + 'px';
                el.firstChild.style.width = el.clientWidth + 'px';
                break;
            case 'height':
                el.getContext().clearRect();
                el.style.height = el.attributes.height.nodeValue + 'px';
                el.firstChild.style.height = el.clientHeight + 'px';
                break
            }
        }
        function onResize(e) {
            var el = e.srcElement;
            if (el.firstChild) {
                el.firstChild.style.width = el.clientWidth + 'px';
                el.firstChild.style.height = el.clientHeight + 'px'
            }
        }
        G_vmlCanvasManager_.init();
        var dec2hex = [];
        for (var i = 0; i < 16; i++) {
            for (var j = 0; j < 16; j++) {
                dec2hex[i * 16 + j] = i.toString(16) + j.toString(16)
            }
        }
        function createMatrixIdentity() {
            return [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
        }
        function matrixMultiply(m1, m2) {
            var result = createMatrixIdentity();
            for (var x = 0; x < 3; x++) {
                for (var y = 0; y < 3; y++) {
                    var sum = 0;
                    for (var z = 0; z < 3; z++) {
                        sum += m1[x][z] * m2[z][y]
                    }
                    result[x][y] = sum
                }
            }
            return result
        }
        function copyState(o1, o2) {
            o2.fillStyle = o1.fillStyle;
            o2.lineCap = o1.lineCap;
            o2.lineJoin = o1.lineJoin;
            o2.lineWidth = o1.lineWidth;
            o2.miterLimit = o1.miterLimit;
            o2.shadowBlur = o1.shadowBlur;
            o2.shadowColor = o1.shadowColor;
            o2.shadowOffsetX = o1.shadowOffsetX;
            o2.shadowOffsetY = o1.shadowOffsetY;
            o2.strokeStyle = o1.strokeStyle;
            o2.globalAlpha = o1.globalAlpha;
            o2.font = o1.font;
            o2.textAlign = o1.textAlign;
            o2.textBaseline = o1.textBaseline;
            o2.arcScaleX_ = o1.arcScaleX_;
            o2.arcScaleY_ = o1.arcScaleY_;
            o2.lineScale_ = o1.lineScale_
        }
        function processStyle(styleString) {
            var str, alpha = 1;
            styleString = String(styleString);
            if (styleString.substring(0, 3) == 'rgb') {
                var start = styleString.indexOf('(', 3);
                var end = styleString.indexOf(')', start + 1);
                var guts = styleString.substring(start + 1, end).split(',');
                str = '#';
                for (var i = 0; i < 3; i++) {
                    str += dec2hex[Number(guts[i])]
                }
                if (guts.length == 4 && styleString.substr(3, 1) == 'a') {
                    alpha = guts[3]
                }
            } else {
                str = styleString
            }
            return {
                color: str,
                alpha: alpha
            }
        }
        var DEFAULT_STYLE = {
            style: 'normal',
            variant: 'normal',
            weight: 'normal',
            size: 10,
            family: 'sans-serif'
        };
        var fontStyleCache = {};

        function processFontStyle(styleString) {
            if (fontStyleCache[styleString]) {
                return fontStyleCache[styleString]
            }
            var el = document.createElement('div');
            var style = el.style;
            try {
                style.font = styleString
            } catch (ex) {}
            return fontStyleCache[styleString] = {
                style: style.fontStyle || DEFAULT_STYLE.style,
                variant: style.fontVariant || DEFAULT_STYLE.variant,
                weight: style.fontWeight || DEFAULT_STYLE.weight,
                size: style.fontSize || DEFAULT_STYLE.size,
                family: style.fontFamily || DEFAULT_STYLE.family
            }
        }
        function getComputedStyle(style, element) {
            var computedStyle = {};
            for (var p in style) {
                computedStyle[p] = style[p]
            }
            var canvasFontSize = parseFloat(element.currentStyle.fontSize),
                fontSize = parseFloat(style.size);
            if (typeof style.size == 'number') {
                computedStyle.size = style.size
            } else if (style.size.indexOf('px') != -1) {
                computedStyle.size = fontSize
            } else if (style.size.indexOf('em') != -1) {
                computedStyle.size = canvasFontSize * fontSize
            } else if (style.size.indexOf('%') != -1) {
                computedStyle.size = (canvasFontSize / 100) * fontSize
            } else if (style.size.indexOf('pt') != -1) {
                computedStyle.size = canvasFontSize * (4 / 3) * fontSize
            } else {
                computedStyle.size = canvasFontSize
            }
            computedStyle.size *= 0.981;
            return computedStyle
        }
        function buildStyle(style) {
            return style.style + ' ' + style.variant + ' ' + style.weight + ' ' + style.size + 'px ' + style.family
        }
        function processLineCap(lineCap) {
            switch (lineCap) {
            case 'butt':
                return 'flat';
            case 'round':
                return 'round';
            case 'square':
            default:
                return 'square'
            }
        }
        function CanvasRenderingContext2D_(surfaceElement) {
            this.m_ = createMatrixIdentity();
            this.mStack_ = [];
            this.aStack_ = [];
            this.currentPath_ = [];
            this.strokeStyle = '#000';
            this.fillStyle = '#000';
            this.lineWidth = 1;
            this.lineJoin = 'miter';
            this.lineCap = 'butt';
            this.miterLimit = Z * 1;
            this.globalAlpha = 1;
            this.font = '10px sans-serif';
            this.textAlign = 'left';
            this.textBaseline = 'alphabetic';
            this.canvas = surfaceElement;
            var el = surfaceElement.ownerDocument.createElement('div');
            el.style.width = surfaceElement.clientWidth + 'px';
            el.style.height = surfaceElement.clientHeight + 'px';
            el.style.overflow = 'hidden';
            el.style.position = 'absolute';
            surfaceElement.appendChild(el);
            this.element_ = el;
            this.arcScaleX_ = 1;
            this.arcScaleY_ = 1;
            this.lineScale_ = 1
        }
        var contextPrototype = CanvasRenderingContext2D_.prototype;
        contextPrototype.clearRect = function () {
            if (this.textMeasureEl_) {
                this.textMeasureEl_.removeNode(true);
                this.textMeasureEl_ = null
            }
            this.element_.innerHTML = ''
        };
        contextPrototype.beginPath = function () {
            this.currentPath_ = []
        };
        contextPrototype.moveTo = function (aX, aY) {
            var p = this.getCoords_(aX, aY);
            this.currentPath_.push({
                type: 'moveTo',
                x: p.x,
                y: p.y
            });
            this.currentX_ = p.x;
            this.currentY_ = p.y
        };
        contextPrototype.lineTo = function (aX, aY) {
            var p = this.getCoords_(aX, aY);
            this.currentPath_.push({
                type: 'lineTo',
                x: p.x,
                y: p.y
            });
            this.currentX_ = p.x;
            this.currentY_ = p.y
        };
        contextPrototype.bezierCurveTo = function (aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) {
            var p = this.getCoords_(aX, aY);
            var cp1 = this.getCoords_(aCP1x, aCP1y);
            var cp2 = this.getCoords_(aCP2x, aCP2y);
            bezierCurveTo(this, cp1, cp2, p)
        };

        function bezierCurveTo(self, cp1, cp2, p) {
            self.currentPath_.push({
                type: 'bezierCurveTo',
                cp1x: cp1.x,
                cp1y: cp1.y,
                cp2x: cp2.x,
                cp2y: cp2.y,
                x: p.x,
                y: p.y
            });
            self.currentX_ = p.x;
            self.currentY_ = p.y
        }
        contextPrototype.quadraticCurveTo = function (aCPx, aCPy, aX, aY) {
            var cp = this.getCoords_(aCPx, aCPy);
            var p = this.getCoords_(aX, aY);
            var cp1 = {
                x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_),
                y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_)
            };
            var cp2 = {
                x: cp1.x + (p.x - this.currentX_) / 3.0,
                y: cp1.y + (p.y - this.currentY_) / 3.0
            };
            bezierCurveTo(this, cp1, cp2, p)
        };
        contextPrototype.arc = function (aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) {
            aRadius *= Z;
            var arcType = aClockwise ? 'at' : 'wa';
            var xStart = aX + mc(aStartAngle) * aRadius - Z2;
            var yStart = aY + ms(aStartAngle) * aRadius - Z2;
            var xEnd = aX + mc(aEndAngle) * aRadius - Z2;
            var yEnd = aY + ms(aEndAngle) * aRadius - Z2;
            if (xStart == xEnd && !aClockwise) {
                xStart += 0.125
            }
            var p = this.getCoords_(aX, aY);
            var pStart = this.getCoords_(xStart, yStart);
            var pEnd = this.getCoords_(xEnd, yEnd);
            this.currentPath_.push({
                type: arcType,
                x: p.x,
                y: p.y,
                radius: aRadius,
                xStart: pStart.x,
                yStart: pStart.y,
                xEnd: pEnd.x,
                yEnd: pEnd.y
            })
        };
        contextPrototype.rect = function (aX, aY, aWidth, aHeight) {
            this.moveTo(aX, aY);
            this.lineTo(aX + aWidth, aY);
            this.lineTo(aX + aWidth, aY + aHeight);
            this.lineTo(aX, aY + aHeight);
            this.closePath()
        };
        contextPrototype.strokeRect = function (aX, aY, aWidth, aHeight) {
            var oldPath = this.currentPath_;
            this.beginPath();
            this.moveTo(aX, aY);
            this.lineTo(aX + aWidth, aY);
            this.lineTo(aX + aWidth, aY + aHeight);
            this.lineTo(aX, aY + aHeight);
            this.closePath();
            this.stroke();
            this.currentPath_ = oldPath
        };
        contextPrototype.fillRect = function (aX, aY, aWidth, aHeight) {
            var oldPath = this.currentPath_;
            this.beginPath();
            this.moveTo(aX, aY);
            this.lineTo(aX + aWidth, aY);
            this.lineTo(aX + aWidth, aY + aHeight);
            this.lineTo(aX, aY + aHeight);
            this.closePath();
            this.fill();
            this.currentPath_ = oldPath
        };
        contextPrototype.createLinearGradient = function (aX0, aY0, aX1, aY1) {
            var gradient = new CanvasGradient_('gradient');
            gradient.x0_ = aX0;
            gradient.y0_ = aY0;
            gradient.x1_ = aX1;
            gradient.y1_ = aY1;
            return gradient
        };
        contextPrototype.createRadialGradient = function (aX0, aY0, aR0, aX1, aY1, aR1) {
            var gradient = new CanvasGradient_('gradientradial');
            gradient.x0_ = aX0;
            gradient.y0_ = aY0;
            gradient.r0_ = aR0;
            gradient.x1_ = aX1;
            gradient.y1_ = aY1;
            gradient.r1_ = aR1;
            return gradient
        };
        contextPrototype.drawImage = function (image, var_args) {
            var dx, dy, dw, dh, sx, sy, sw, sh;
            var oldRuntimeWidth = image.runtimeStyle.width;
            var oldRuntimeHeight = image.runtimeStyle.height;
            image.runtimeStyle.width = 'auto';
            image.runtimeStyle.height = 'auto';
            var w = image.width;
            var h = image.height;
            image.runtimeStyle.width = oldRuntimeWidth;
            image.runtimeStyle.height = oldRuntimeHeight;
            if (arguments.length == 3) {
                dx = arguments[1];
                dy = arguments[2];
                sx = sy = 0;
                sw = dw = w;
                sh = dh = h
            } else if (arguments.length == 5) {
                dx = arguments[1];
                dy = arguments[2];
                dw = arguments[3];
                dh = arguments[4];
                sx = sy = 0;
                sw = w;
                sh = h
            } else if (arguments.length == 9) {
                sx = arguments[1];
                sy = arguments[2];
                sw = arguments[3];
                sh = arguments[4];
                dx = arguments[5];
                dy = arguments[6];
                dw = arguments[7];
                dh = arguments[8]
            } else {
                throw Error('Invalid number of arguments')
            }
            var d = this.getCoords_(dx, dy);
            var w2 = sw / 2;
            var h2 = sh / 2;
            var vmlStr = [];
            var W = 10;
            var H = 10;
            vmlStr.push(' <g_vml_:group', ' coordsize="', Z * W, ',', Z * H, '"', ' coordorigin="0,0"', ' style="width:', W, 'px;height:', H, 'px;position:absolute;');
            if (this.m_[0][0] != 1 || this.m_[0][1] || this.m_[1][1] != 1 || this.m_[1][0]) {
                var filter = [];
                filter.push('M11=', this.m_[0][0], ',', 'M12=', this.m_[1][0], ',', 'M21=', this.m_[0][1], ',', 'M22=', this.m_[1][1], ',', 'Dx=', mr(d.x / Z), ',', 'Dy=', mr(d.y / Z), '');
                var max = d;
                var c2 = this.getCoords_(dx + dw, dy);
                var c3 = this.getCoords_(dx, dy + dh);
                var c4 = this.getCoords_(dx + dw, dy + dh);
                max.x = m.max(max.x, c2.x, c3.x, c4.x);
                max.y = m.max(max.y, c2.y, c3.y, c4.y);
                vmlStr.push('padding:0 ', mr(max.x / Z), 'px ', mr(max.y / Z), 'px 0;filter:progid:DXImageTransform.Microsoft.Matrix(', filter.join(''), ", sizingmethod='clip');")
            } else {
                vmlStr.push('top:', mr(d.y / Z), 'px;left:', mr(d.x / Z), 'px;')
            }
            vmlStr.push(' ">', '<g_vml_:image src="', image.src, '"', ' style="width:', Z * dw, 'px;', ' height:', Z * dh, 'px"', ' cropleft="', sx / w, '"', ' croptop="', sy / h, '"', ' cropright="', (w - sx - sw) / w, '"', ' cropbottom="', (h - sy - sh) / h, '"', ' />', '</g_vml_:group>');
            this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join(''))
        };
        contextPrototype.stroke = function (aFill) {
            var lineStr = [];
            var lineOpen = false;
            var W = 10;
            var H = 10;
            lineStr.push('<g_vml_:shape', ' filled="', !! aFill, '"', ' style="position:absolute;width:', W, 'px;height:', H, 'px;"', ' coordorigin="0,0"', ' coordsize="', Z * W, ',', Z * H, '"', ' stroked="', !aFill, '"', ' path="');
            var newSeq = false;
            var min = {
                x: null,
                y: null
            };
            var max = {
                x: null,
                y: null
            };
            for (var i = 0; i < this.currentPath_.length; i++) {
                var p = this.currentPath_[i];
                var c;
                switch (p.type) {
                case 'moveTo':
                    c = p;
                    lineStr.push(' m ', mr(p.x), ',', mr(p.y));
                    break;
                case 'lineTo':
                    lineStr.push(' l ', mr(p.x), ',', mr(p.y));
                    break;
                case 'close':
                    lineStr.push(' x ');
                    p = null;
                    break;
                case 'bezierCurveTo':
                    lineStr.push(' c ', mr(p.cp1x), ',', mr(p.cp1y), ',', mr(p.cp2x), ',', mr(p.cp2y), ',', mr(p.x), ',', mr(p.y));
                    break;
                case 'at':
                case 'wa':
                    lineStr.push(' ', p.type, ' ', mr(p.x - this.arcScaleX_ * p.radius), ',', mr(p.y - this.arcScaleY_ * p.radius), ' ', mr(p.x + this.arcScaleX_ * p.radius), ',', mr(p.y + this.arcScaleY_ * p.radius), ' ', mr(p.xStart), ',', mr(p.yStart), ' ', mr(p.xEnd), ',', mr(p.yEnd));
                    break
                }
                if (p) {
                    if (min.x == null || p.x < min.x) {
                        min.x = p.x
                    }
                    if (max.x == null || p.x > max.x) {
                        max.x = p.x
                    }
                    if (min.y == null || p.y < min.y) {
                        min.y = p.y
                    }
                    if (max.y == null || p.y > max.y) {
                        max.y = p.y
                    }
                }
            }
            lineStr.push(' ">');
            if (!aFill) {
                appendStroke(this, lineStr)
            } else {
                appendFill(this, lineStr, min, max)
            }
            lineStr.push('</g_vml_:shape>');
            this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''))
        };

        function appendStroke(ctx, lineStr) {
            var a = processStyle(ctx.strokeStyle);
            var color = a.color;
            var opacity = a.alpha * ctx.globalAlpha;
            var lineWidth = ctx.lineScale_ * ctx.lineWidth;
            if (lineWidth < 1) {
                opacity *= lineWidth
            }
            lineStr.push('<g_vml_:stroke', ' opacity="', opacity, '"', ' joinstyle="', ctx.lineJoin, '"', ' miterlimit="', ctx.miterLimit, '"', ' endcap="', processLineCap(ctx.lineCap), '"', ' weight="', lineWidth, 'px"', ' color="', color, '" />')
        }
        function appendFill(ctx, lineStr, min, max) {
            var fillStyle = ctx.fillStyle;
            var arcScaleX = ctx.arcScaleX_;
            var arcScaleY = ctx.arcScaleY_;
            var width = max.x - min.x;
            var height = max.y - min.y;
            if (fillStyle instanceof CanvasGradient_) {
                var angle = 0;
                var focus = {
                    x: 0,
                    y: 0
                };
                var shift = 0;
                var expansion = 1;
                if (fillStyle.type_ == 'gradient') {
                    var x0 = fillStyle.x0_ / arcScaleX;
                    var y0 = fillStyle.y0_ / arcScaleY;
                    var x1 = fillStyle.x1_ / arcScaleX;
                    var y1 = fillStyle.y1_ / arcScaleY;
                    var p0 = ctx.getCoords_(x0, y0);
                    var p1 = ctx.getCoords_(x1, y1);
                    var dx = p1.x - p0.x;
                    var dy = p1.y - p0.y;
                    angle = Math.atan2(dx, dy) * 180 / Math.PI;
                    if (angle < 0) {
                        angle += 360
                    }
                    if (angle < 1e-6) {
                        angle = 0
                    }
                } else {
                    var p0 = ctx.getCoords_(fillStyle.x0_, fillStyle.y0_);
                    focus = {
                        x: (p0.x - min.x) / width,
                        y: (p0.y - min.y) / height
                    };
                    width /= arcScaleX * Z;
                    height /= arcScaleY * Z;
                    var dimension = m.max(width, height);
                    shift = 2 * fillStyle.r0_ / dimension;
                    expansion = 2 * fillStyle.r1_ / dimension - shift
                }
                var stops = fillStyle.colors_;
                stops.sort(function (cs1, cs2) {
                    return cs1.offset - cs2.offset
                });
                var length = stops.length;
                var color1 = stops[0].color;
                var color2 = stops[length - 1].color;
                var opacity1 = stops[0].alpha * ctx.globalAlpha;
                var opacity2 = stops[length - 1].alpha * ctx.globalAlpha;
                var colors = [];
                for (var i = 0; i < length; i++) {
                    var stop = stops[i];
                    colors.push(stop.offset * expansion + shift + ' ' + stop.color)
                }
                lineStr.push('<g_vml_:fill type="', fillStyle.type_, '"', ' method="none" focus="100%"', ' color="', color1, '"', ' color2="', color2, '"', ' colors="', colors.join(','), '"', ' opacity="', opacity2, '"', ' g_o_:opacity2="', opacity1, '"', ' angle="', angle, '"', ' focusposition="', focus.x, ',', focus.y, '" />')
            } else if (fillStyle instanceof CanvasPattern_) {
                if (width && height) {
                    var deltaLeft = -min.x;
                    var deltaTop = -min.y;
                    lineStr.push('<g_vml_:fill', ' position="', deltaLeft / width * arcScaleX * arcScaleX, ',', deltaTop / height * arcScaleY * arcScaleY, '"', ' type="tile"', ' src="', fillStyle.src_, '" />')
                }
            } else {
                var a = processStyle(ctx.fillStyle);
                var color = a.color;
                var opacity = a.alpha * ctx.globalAlpha;
                lineStr.push('<g_vml_:fill color="', color, '" opacity="', opacity, '" />')
            }
        }
        contextPrototype.fill = function () {
            this.stroke(true)
        };
        contextPrototype.closePath = function () {
            this.currentPath_.push({
                type: 'close'
            })
        };
        contextPrototype.getCoords_ = function (aX, aY) {
            var m = this.m_;
            return {
                x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2,
                y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2
            }
        };
        contextPrototype.save = function () {
            var o = {};
            copyState(this, o);
            this.aStack_.push(o);
            this.mStack_.push(this.m_);
            this.m_ = matrixMultiply(createMatrixIdentity(), this.m_)
        };
        contextPrototype.restore = function () {
            if (this.aStack_.length) {
                copyState(this.aStack_.pop(), this);
                this.m_ = this.mStack_.pop()
            }
        };

        function matrixIsFinite(m) {
            return isFinite(m[0][0]) && isFinite(m[0][1]) && isFinite(m[1][0]) && isFinite(m[1][1]) && isFinite(m[2][0]) && isFinite(m[2][1])
        }
        function setM(ctx, m, updateLineScale) {
            if (!matrixIsFinite(m)) {
                return
            }
            ctx.m_ = m;
            if (updateLineScale) {
                var det = m[0][0] * m[1][1] - m[0][1] * m[1][0];
                ctx.lineScale_ = sqrt(abs(det))
            }
        }
        contextPrototype.translate = function (aX, aY) {
            var m1 = [
                [1, 0, 0],
                [0, 1, 0],
                [aX, aY, 1]
            ];
            setM(this, matrixMultiply(m1, this.m_), false)
        };
        contextPrototype.rotate = function (aRot) {
            var c = mc(aRot);
            var s = ms(aRot);
            var m1 = [
                [c, s, 0],
                [-s, c, 0],
                [0, 0, 1]
            ];
            setM(this, matrixMultiply(m1, this.m_), false)
        };
        contextPrototype.scale = function (aX, aY) {
            this.arcScaleX_ *= aX;
            this.arcScaleY_ *= aY;
            var m1 = [
                [aX, 0, 0],
                [0, aY, 0],
                [0, 0, 1]
            ];
            setM(this, matrixMultiply(m1, this.m_), true)
        };
        contextPrototype.transform = function (m11, m12, m21, m22, dx, dy) {
            var m1 = [
                [m11, m12, 0],
                [m21, m22, 0],
                [dx, dy, 1]
            ];
            setM(this, matrixMultiply(m1, this.m_), true)
        };
        contextPrototype.setTransform = function (m11, m12, m21, m22, dx, dy) {
            var m = [
                [m11, m12, 0],
                [m21, m22, 0],
                [dx, dy, 1]
            ];
            setM(this, m, true)
        };
        contextPrototype.drawText_ = function (text, x, y, maxWidth, stroke) {
            var m = this.m_,
                delta = 1000,
                left = 0,
                right = delta,
                offset = {
                    x: 0,
                    y: 0
                },
                lineStr = [];
            var fontStyle = getComputedStyle(processFontStyle(this.font), this.element_);
            var fontStyleString = buildStyle(fontStyle);
            var elementStyle = this.element_.currentStyle;
            var textAlign = this.textAlign.toLowerCase();
            switch (textAlign) {
            case 'left':
            case 'center':
            case 'right':
                break;
            case 'end':
                textAlign = elementStyle.direction == 'ltr' ? 'right' : 'left';
                break;
            case 'start':
                textAlign = elementStyle.direction == 'rtl' ? 'right' : 'left';
                break;
            default:
                textAlign = 'left'
            }
            switch (this.textBaseline) {
            case 'hanging':
            case 'top':
                offset.y = fontStyle.size / 1.75;
                break;
            case 'middle':
                break;
            default:
            case null:
            case 'alphabetic':
            case 'ideographic':
            case 'bottom':
                offset.y = -fontStyle.size / 2.25;
                break
            }
            switch (textAlign) {
            case 'right':
                left = delta;
                right = 0.05;
                break;
            case 'center':
                left = right = delta / 2;
                break
            }
            var d = this.getCoords_(x + offset.x, y + offset.y);
            lineStr.push('<g_vml_:line from="', -left, ' 0" to="', right, ' 0.05" ', ' coordsize="100 100" coordorigin="0 0"', ' filled="', !stroke, '" stroked="', !! stroke, '" style="position:absolute;width:1px;height:1px;">');
            if (stroke) {
                appendStroke(this, lineStr)
            } else {
                appendFill(this, lineStr, {
                    x: -left,
                    y: 0
                }, {
                    x: right,
                    y: fontStyle.size
                })
            }
            var skewM = m[0][0].toFixed(3) + ',' + m[1][0].toFixed(3) + ',' + m[0][1].toFixed(3) + ',' + m[1][1].toFixed(3) + ',0,0';
            var skewOffset = mr(d.x / Z) + ',' + mr(d.y / Z);
            lineStr.push('<g_vml_:skew on="t" matrix="', skewM, '" ', ' offset="', skewOffset, '" origin="', left, ' 0" />', '<g_vml_:path textpathok="true" />', '<g_vml_:textpath on="true" string="', encodeHtmlAttribute(text), '" style="v-text-align:', textAlign, ';font:', encodeHtmlAttribute(fontStyleString), '" /></g_vml_:line>');
            this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''))
        };
        contextPrototype.fillText = function (text, x, y, maxWidth) {
            this.drawText_(text, x, y, maxWidth, false)
        };
        contextPrototype.strokeText = function (text, x, y, maxWidth) {
            this.drawText_(text, x, y, maxWidth, true)
        };
        contextPrototype.measureText = function (text) {
            if (!this.textMeasureEl_) {
                var s = '<span style="position:absolute;' + 'top:-20000px;left:0;padding:0;margin:0;border:none;' + 'white-space:pre;"></span>';
                this.element_.insertAdjacentHTML('beforeEnd', s);
                this.textMeasureEl_ = this.element_.lastChild
            }
            var doc = this.element_.ownerDocument;
            this.textMeasureEl_.innerHTML = '';
            this.textMeasureEl_.style.font = this.font;
            this.textMeasureEl_.appendChild(doc.createTextNode(text));
            return {
                width: this.textMeasureEl_.offsetWidth
            }
        };
        contextPrototype.clip = function () {};
        contextPrototype.arcTo = function () {};
        contextPrototype.createPattern = function (image, repetition) {
            return new CanvasPattern_(image, repetition)
        };

        function CanvasGradient_(aType) {
            this.type_ = aType;
            this.x0_ = 0;
            this.y0_ = 0;
            this.r0_ = 0;
            this.x1_ = 0;
            this.y1_ = 0;
            this.r1_ = 0;
            this.colors_ = []
        }
        CanvasGradient_.prototype.addColorStop = function (aOffset, aColor) {
            aColor = processStyle(aColor);
            this.colors_.push({
                offset: aOffset,
                color: aColor.color,
                alpha: aColor.alpha
            })
        };

        function CanvasPattern_(image, repetition) {
            assertImageIsValid(image);
            switch (repetition) {
            case 'repeat':
            case null:
            case '':
                this.repetition_ = 'repeat';
                break;
            case 'repeat-x':
            case 'repeat-y':
            case 'no-repeat':
                this.repetition_ = repetition;
                break;
            default:
                throwException('SYNTAX_ERR')
            }
            this.src_ = image.src;
            this.width_ = image.width;
            this.height_ = image.height
        }
        function throwException(s) {
            throw new DOMException_(s)
        }
        function assertImageIsValid(img) {
            if (!img || img.nodeType != 1 || img.tagName != 'IMG') {
                throwException('TYPE_MISMATCH_ERR')
            }
            if (img.readyState != 'complete') {
                throwException('INVALID_STATE_ERR')
            }
        }
        function DOMException_(s) {
            this.code = this[s];
            this.message = s + ': DOM Exception ' + this.code
        }
        var p = DOMException_.prototype = new Error;
        p.INDEX_SIZE_ERR = 1;
        p.DOMSTRING_SIZE_ERR = 2;
        p.HIERARCHY_REQUEST_ERR = 3;
        p.WRONG_DOCUMENT_ERR = 4;
        p.INVALID_CHARACTER_ERR = 5;
        p.NO_DATA_ALLOWED_ERR = 6;
        p.NO_MODIFICATION_ALLOWED_ERR = 7;
        p.NOT_FOUND_ERR = 8;
        p.NOT_SUPPORTED_ERR = 9;
        p.INUSE_ATTRIBUTE_ERR = 10;
        p.INVALID_STATE_ERR = 11;
        p.SYNTAX_ERR = 12;
        p.INVALID_MODIFICATION_ERR = 13;
        p.NAMESPACE_ERR = 14;
        p.INVALID_ACCESS_ERR = 15;
        p.VALIDATION_ERR = 16;
        p.TYPE_MISMATCH_ERR = 17;
        G_vmlCanvasManager = G_vmlCanvasManager_;
        CanvasRenderingContext2D = CanvasRenderingContext2D_;
        CanvasGradient = CanvasGradient_;
        CanvasPattern = CanvasPattern_;
        DOMException = DOMException_
    })()
}
if (/^opera/.test(navigator.userAgent.toLowerCase())) {
    function check_strokeTextCapability() {
        if (document.namespaces['v'] == null) {
            var e = ["shape", "shapetype", "group", "background", "path", "formulas", "handles", "fill", "stroke", "shadow", "textbox", "textpath", "imagedata", "line", "polyline", "curve", "roundrect", "oval", "rect", "arc", "image"],
                s = document.createStyleSheet();
            for (var i = 0; i < e.length; i++) {
                s.addRule("v\\:" + e[i], "behavior: url(#default#VML);")
            }
            document.namespaces.add("v", "urn:schemas-microsoft-com:vml", "#default#VML");
        }
        if (typeof get_strokeText == 'function' && document.namespaces['v'] != null) {
            return true
        } else {
            return false
        }
    }
    function get_boundingBox(x, y, baseline, lineheight, linewidth, weight, color, opacity, rotation) {
        rotation = typeof (rotation) != 'undefined' ? rotation : 0;
        color = typeof (color) != 'undefined' ? color : '#000000';
        opacity = typeof (opacity) != 'undefined' ? opacity : 1;
        id = typeof (id) != 'undefined' ? 'id="' + id + '"' : '';
        var w = parseInt(linewidth),
            b = parseInt(baseline),
            h = parseInt(lineheight);
        return '<v:shape ' + id + ' filled="f" stroked="t" coordorigin="0,0" coordsize="' + w + ',' + h + '" path="m 0,' + b + ' l 0,0,' + w + ',0,' + w + ',' + b + ',0,' + b + ',0,' + h + ',' + w + ',' + h + ',' + w + ',' + b + ' e" style="rotation:' + rotation + ';position:absolute;margin:0px;top:' + Math.round(y) + 'px;left:' + Math.round(x) + 'px;width:' + w + 'px;height:' + h + 'px;"><v:stroke color="' + color + '" opacity="' + opacity + '" weight="' + weight + '" /></v:shape>'
    }
    function get_strokeText(string, x, y, size, weight, width, space, font, color, opacity, rotation, id) {
        function qC(cX, cY, CPx, CPy, aX, aY) {
            var t = new Array(6);
            t[0] = cX + 2.0 / 3.0 * (CPx - cX);
            t[1] = cY + 2.0 / 3.0 * (CPy - cY);
            t[2] = t[0] + (aX - cX) / 3.0;
            t[3] = t[1] + (aY - cY) / 3.0;
            t[4] = aX;
            t[5] = aY;
            return t
        }
        size = typeof (size) != 'undefined' ? size : 12;
        weight = typeof (weight) != 'undefined' ? weight : 100;
        width = 100;
        space = 100;
        font = "sans-serif";
        string = typeof (string) != 'undefined' ? string : ' ';
        var xx = typeof (x) != 'undefined' ? x : 0;
        var yy = typeof (y) != 'undefined' ? y : 0;
        rotation = typeof (rotation) != 'undefined' ? rotation : 0;
        color = typeof (color) != 'undefined' ? color : '#000000';
        opacity = typeof (opacity) != 'undefined' ? opacity : 1;
        id = typeof (id) != 'undefined' ? 'id="' + id + '"' : '';
        var i = 0,
            j = 0,
            f = 10,
            path = "",
            a, b, z, k, c, p, o, len = string.length,
            mag = size / 25.0,
            fac = Math.max(Math.min(weight, 400), 1) / 40,
            faw = Math.max(Math.min(width, 400), 10) / 100;
        var spc = Math.max(Math.min(space, 1000), 10) / 100,
            mx = ((mag * 16 * faw) * spc) - (mag * 16 * faw),
            lw = (fac * mag);
        x = 0;
        y = size;
        var ww = Math.round(get_textWidth(string, size, width, space, font)),
            hh = Math.round(get_textHeight(size));
        var out = '<v:shape ' + id + ' filled="f" stroked="t" coordorigin="0,0" coordsize="' + parseInt(ww * f) + ',' + parseInt(hh * f) + '"';
        for (i = 0; i < len; i++) {
            c = strokeFont[font][string.charAt(i)];
            if (!c) {
                continue
            }
            o = 0;
            for (j = 0; j < c.n; j++) {
                if (typeof (c.d[o]) != "string") {
                    o++;
                    continue
                }
                p = c.d[o];
                o++;
                a = c.d[o];
                if (p == "m") {
                    path += ' m ' + parseInt((x + a[0] * mag * faw) * f) + ',' + parseInt((y - a[1] * mag) * f);
                    o++
                } else if (p == "q") {
                    z = c.d[o - 2];
                    o++;
                    b = c.d[o];
                    k = qC(z[0], z[1], a[0], a[1], b[0], b[1]);
                    path += ' c ' + parseInt((x + k[0] * mag * faw) * f) + ',' + parseInt((y - k[1] * mag) * f) + ',' + parseInt((x + k[2] * mag * faw) * f) + ',' + parseInt((y - k[3] * mag) * f) + ',' + parseInt((x + k[4] * mag * faw) * f) + ',' + parseInt((y - k[5] * mag) * f);
                    o++
                } else if (p == "b") {
                    o++;
                    b = c.d[o];
                    o++;
                    z = c.d[o];
                    path += ' c ' + parseInt((x + a[0] * mag * faw) * f) + ',' + parseInt((y - a[1] * mag) * f) + ',' + parseInt((x + a[0] * mag * faw) * f) + ',' + parseInt((y - a[1] * mag) * f) + ',' + parseInt((x + z[0] * mag * faw) * f) + ',' + parseInt((y - z[1] * mag) * f);
                    o++
                } else if (p == "l") {
                    path += ' l ' + parseInt((x + a[0] * mag * faw) * f) + ',' + parseInt((y - a[1] * mag) * f);
                    o++;
                    while (typeof (c.d[o]) != "string" && o < c.d.length) {
                        a = c.d[o];
                        path += ' l ' + parseInt((x + a[0] * mag * faw) * f) + ',' + parseInt((y - a[1] * mag) * f);
                        o++
                    }
                }
            }
            x += ((c.w * faw) * mag) + mx
        }
        out += ' path="' + path + ' e" style="rotation:' + rotation + ';position:absolute;margin:0px;top:' + Math.round(yy) + 'px;left:' + Math.round(xx) + 'px;width:' + ww + 'px;height:' + hh + 'px;"><v:stroke color="' + color + '" opacity="' + opacity + '" weight="' + lw + '" miterlimit="0" endcap="round" joinstyle="round" /></v:shape>';
        return out
    }
    function get_baseLine(size) {
        return size
    }
    function get_textHeight(size) {
        size = typeof (size) != 'undefined' ? size : 12;
        return 32 * (size / 25)
    }
    function get_textWidth(string, size, width, space, font) {
        size = typeof (size) != 'undefined' ? size : 12;
        width = 100;
        space = 100;
        string = typeof (string) != 'undefined' ? string : ' ';
        font = "sans-serif";
        var total = 0,
            len = string.length,
            mg = size / 25.0,
            fw = Math.max(Math.min(width, 400), 10) / 100,
            sp = Math.max(Math.min(space, 1000), 10) / 100,
            m = ((mg * 16 * fw) * sp) - (mg * 16 * fw);
        for (var i = 0; i < len; i++) {
            var c = strokeFont[font][string.charAt(i)];
            if (c) total += ((c.w * fw) * mg) + m
        }
        return total - (m)
    }
    function get_widthText(string, width, size, fontwidth, space, font) {
        size = typeof (size) != 'undefined' ? size : 12;
        fontwidth = typeof (fontwidth) != 'undefined' ? fontwidth : 100;
        space = 100;
        string = typeof (string) != 'undefined' ? string : ' ';
        width = 100;
        font = "sans-serif";
        var cur = 0,
            total = 0,
            len = string.length,
            mg = size / 25.0,
            fw = Math.max(Math.min(fontwidth, 400), 10) / 100,
            sp = Math.max(Math.min(space, 1000), 10) / 100,
            m = ((mg * 16 * fw) * sp) - (mg * 16 * fw);
        for (var i = 0; i < len; i++) {
            var c = strokeFont[font][string.charAt(i)];
            if (c) {
                cur = ((c.w * fw) * mg) + m;
                if ((total + cur - (m)) <= width) {
                    total += cur
                } else {
                    break
                }
            } else {
                break
            }
        }
        return string.substring(0, i)
    }
    function draw_boundingBox(ctx, x, y, baseline, lineheight, linewidth) {
        ctx.strokeRect(x, y + baseline, linewidth, lineheight - baseline);
        ctx.strokeRect(x, y, linewidth, baseline)
    }
    function do_drawText(string, x, y, size, weight, width, space, font) {
        size = typeof (size) != 'undefined' ? size : 12;
        weight = typeof (weight) != 'undefined' ? weight : 100;
        width = 100;
        space = 100;
        font = "sans-serif";
        x = typeof (x) != 'undefined' ? x : 0;
        y = typeof (y) != 'undefined' ? y + size : 0 + size;
        string = typeof (string) != 'undefined' ? string : ' ';
        var i = 0,
            j = 0,
            a, b, z, c, p, o, len = string.length,
            mag = size / 25.0,
            fac = Math.max(Math.min(weight, 400), 1) / 40,
            faw = Math.max(Math.min(width, 400), 10) / 100;
        var spc = Math.max(Math.min(space, 1000), 10) / 100,
            mx = ((mag * 16 * faw) * spc) - (mag * 16 * faw),
            lw = this.lineWidth,
            ml = this.miterLimit,
            lj = this.lineJoin,
            lc = this.lineCap;
        this.lineWidth = (fac * mag);
        this.miterLimit = 0;
        this.lineJoin = "round";
        this.lineCap = "round";
        for (i = 0; i < len; i++) {
            c = strokeFont[font][string.charAt(i)];
            if (!c) {
                continue
            }
            o = 0;
            this.beginPath();
            for (j = 0; j < c.n; j++) {
                if (typeof (c.d[o]) != "string") {
                    o++;
                    continue
                }
                p = c.d[o];
                o++;
                a = c.d[o];
                if (p == "m") {
                    this.moveTo(x + a[0] * mag * faw, y - a[1] * mag);
                    o++
                } else if (p == "q") {
                    o++;
                    b = c.d[o];
                    this.quadraticCurveTo(x + a[0] * mag * faw, y - a[1] * mag, x + b[0] * mag * faw, y - b[1] * mag);
                    o++
                } else if (p == "b") {
                    o++;
                    b = c.d[o];
                    o++;
                    z = c.d[o];
                    this.bezierCurveTo(x + a[0] * mag * faw, y - a[1] * mag, x + b[0] * mag * faw, y - b[1] * mag, x + z[0] * mag * faw, y - z[1] * mag);
                    o++
                } else if (p == "l") {
                    this.lineTo(x + a[0] * mag * faw, y - a[1] * mag);
                    o++;
                    while (typeof (c.d[o]) != "string" && o < c.d.length) {
                        a = c.d[o];
                        this.lineTo(x + a[0] * mag * faw, y - a[1] * mag);
                        o++
                    }
                }
            }
            this.stroke();
            x += ((c.w * faw) * mag) + mx
        }
        this.lineWidth = lw;
        this.miterLimit = ml;
        this.lineJoin = lj;
        this.lineCap = lc
    }
    function set_textRenderContext(ctx) {
        if (typeof CanvasRenderingContext2D == 'undefined') {
            ctx.strokeText = do_drawText
        }
    }
    function check_textRenderContext(ctx) {
        if (typeof ctx.strokeText == 'function') {
            return true
        } else {
            return false
        }
    }
    if (typeof CanvasRenderingContext2D != 'undefined') {
        CanvasRenderingContext2D.prototype.strokeText = do_drawText
    }
    strokeFont = new Array();
    strokeFont["sans-serif"] = {
        ' ': {
            w: 16,
            n: 1,
            d: []
        },
        '!': {
            w: 10,
            n: 4,
            d: ['m', [5, 21], 'l', [5, 7], 'm', [5, 2], 'l', [4, 1],
                [5, 0],
                [6, 1],
                [5, 2]
            ]
        },
        '"': {
            w: 14,
            n: 4,
            d: ['m', [4, 21], 'l', [4, 14], 'm', [10, 21], 'l', [10, 14]]
        },
        '#': {
            w: 21,
            n: 8,
            d: ['m', [11, 25], 'l', [4, -7], 'm', [17, 25], 'l', [10, -7], 'm', [4, 12], 'l', [18, 12], 'm', [3, 6], 'l', [17, 6]]
        },
        '$': {
            w: 20,
            n: 12,
            d: ['m', [16, 18], 'q', [15, 21],
                [10, 21], 'q', [5, 21],
                [4, 17], 'q', [3, 12],
                [7, 11], 'l', [13, 10], 'q', [18, 9],
                [17, 4], 'q', [16, 0],
                [10, 0], 'q', [4, 0],
                [3, 4], 'm', [8, 25], 'l', [6, -4], 'm', [14, 25], 'l', [12, -4]
            ]
        },
        '%': {
            w: 24,
            n: 12,
            d: ['m', [21, 21], 'l', [3, 0], 'm', [7, 21], 'q', [3, 21],
                [3, 17], 'q', [3, 13],
                [7, 13], 'q', [11, 13],
                [11, 17], 'q', [11, 21],
                [7, 21], 'm', [17, 8], 'q', [13, 8],
                [13, 4], 'q', [13, 0],
                [17, 0], 'q', [21, 0],
                [21, 4], 'q', [21, 8],
                [17, 8]
            ]
        },
        '&': {
            w: 26,
            n: 14,
            d: ['m', [23, 12], 'q', [23, 14],
                [22, 14], 'q', [20, 14],
                [19, 11], 'l', [17, 6], 'q', [15, 0],
                [9, 0], 'q', [3, 0],
                [3, 5], 'q', [3, 8],
                [7, 10], 'l', [12, 13], 'q', [14, 15],
                [14, 17], 'q', [14, 21],
                [11, 21], 'q', [8, 21],
                [8, 17], 'q', [8, 14],
                [12, 8], 'q', [17, 0],
                [21, 0], 'q', [23, 0],
                [23, 2]
            ]
        },
        '\'': {
            w: 10,
            n: 2,
            d: ['m', [5, 19], 'l', [4, 20],
                [5, 21],
                [6, 20],
                [6, 18],
                [5, 16],
                [4, 15]
            ]
        },
        '(': {
            w: 14,
            n: 3,
            d: ['m', [11, 25], 'q', [4, 19],
                [4, 9], 'q', [4, -1],
                [11, -7]
            ]
        },
        ')': {
            w: 14,
            n: 3,
            d: ['m', [3, 25], 'q', [10, 19],
                [10, 9], 'q', [10, -1],
                [3, -7]
            ]
        },
        '*': {
            w: 16,
            n: 6,
            d: ['m', [8, 21], 'l', [8, 9], 'm', [3, 18], 'l', [13, 12], 'm', [13, 18], 'l', [3, 12]]
        },
        '+': {
            w: 26,
            n: 4,
            d: ['m', [13, 18], 'l', [13, 0], 'm', [4, 9], 'l', [22, 9]]
        },
        ',': {
            w: 10,
            n: 2,
            d: ['m', [6, 1], 'l', [5, 0],
                [4, 1],
                [5, 2],
                [6, 1],
                [6, -1],
                [5, -3],
                [4, -4]
            ]
        },
        '-': {
            w: 26,
            n: 2,
            d: ['m', [4, 9], 'l', [22, 9]]
        },
        '.': {
            w: 10,
            n: 2,
            d: ['m', [5, 2], 'l', [4, 1],
                [5, 0],
                [6, 1],
                [5, 2]
            ]
        },
        '/': {
            w: 22,
            n: 2,
            d: ['m', [20, 25], 'l', [2, -7]]
        },
        '0': {
            w: 20,
            n: 7,
            d: ['m', [10, 21], 'q', [3, 21],
                [3, 12], 'l', [3, 9], 'q', [3, 0],
                [10, 0], 'q', [17, 0],
                [17, 9], 'l', [17, 12], 'q', [17, 21],
                [10, 21]
            ]
        },
        '1': {
            w: 20,
            n: 3,
            d: ['m', [6, 17], 'q', [8, 18],
                [11, 21], 'l', [11, 0]
            ]
        },
        '2': {
            w: 20,
            n: 5,
            d: ['m', [17, 0], 'l', [3, 0],
                [13, 10], 'q', [16, 13],
                [16, 16], 'q', [16, 21],
                [10, 21], 'q', [4, 21],
                [4, 16]
            ]
        },
        '3': {
            w: 20,
            n: 5,
            d: ['m', [5, 21], 'l', [16, 21],
                [10, 14], 'q', [17, 14],
                [17, 7], 'q', [17, 0],
                [10, 0], 'q', [5, 0],
                [3, 4]
            ]
        },
        '4': {
            w: 20,
            n: 2,
            d: ['m', [13, 0], 'l', [13, 21],
                [3, 7],
                [18, 7]
            ]
        },
        '5': {
            w: 20,
            n: 6,
            d: ['m', [15, 21], 'l', [5, 21],
                [4, 12], 'q', [5, 14],
                [10, 14], 'q', [17, 14],
                [17, 7], 'q', [17, 0],
                [10, 0], 'q', [5, 0],
                [3, 4]
            ]
        },
        '6': {
            w: 20,
            n: 8,
            d: ['m', [16, 18], 'q', [15, 21],
                [10, 21], 'q', [3, 21],
                [3, 12], 'l', [3, 7], 'q', [3, 0],
                [10, 0], 'q', [17, 0],
                [17, 7], 'q', [17, 13],
                [10, 13], 'q', [3, 13],
                [3, 7]
            ]
        },
        '7': {
            w: 20,
            n: 2,
            d: ['m', [3, 21], 'l', [17, 21],
                [7, 0]
            ]
        },
        '8': {
            w: 20,
            n: 9,
            d: ['m', [10, 13], 'q', [15, 13],
                [15, 17], 'q', [15, 21],
                [10, 21], 'q', [5, 21],
                [5, 17], 'q', [5, 13],
                [10, 13], 'q', [3, 13],
                [3, 7], 'q', [3, 0],
                [10, 0], 'q', [17, 0],
                [17, 7], 'q', [17, 13],
                [10, 13]
            ]
        },
        '9': {
            w: 20,
            n: 8,
            d: ['m', [17, 14], 'q', [17, 8],
                [10, 8], 'q', [3, 8],
                [3, 14], 'q', [3, 21],
                [10, 21], 'q', [17, 21],
                [17, 14], 'l', [17, 9], 'q', [17, 0],
                [10, 0], 'q', [5, 0],
                [4, 3]
            ]
        },
        ':': {
            w: 10,
            n: 4,
            d: ['m', [5, 14], 'l', [4, 13],
                [5, 12],
                [6, 13],
                [5, 14], 'm', [5, 2], 'l', [4, 1],
                [5, 0],
                [6, 1],
                [5, 2]
            ]
        },
        ';': {
            w: 10,
            n: 4,
            d: ['m', [5, 14], 'l', [4, 13],
                [5, 12],
                [6, 13],
                [5, 14], 'm', [6, 1], 'l', [5, 0],
                [4, 1],
                [5, 2],
                [6, 1],
                [6, -1],
                [5, -3],
                [4, -4]
            ]
        },
        '<': {
            w: 24,
            n: 2,
            d: ['m', [20, 18], 'l', [4, 9],
                [20, 0]
            ]
        },
        '=': {
            w: 26,
            n: 4,
            d: ['m', [4, 12], 'l', [22, 12], 'm', [4, 6], 'l', [22, 6]]
        },
        '>': {
            w: 24,
            n: 2,
            d: ['m', [4, 18], 'l', [20, 9],
                [4, 0]
            ]
        },
        '?': {
            w: 18,
            n: 8,
            d: ['m', [3, 16], 'q', [3, 21],
                [9, 21], 'q', [15, 21],
                [15, 16], 'q', [15, 11],
                [10, 11], 'q', [9, 11],
                [9, 10], 'l', [9, 7], 'm', [9, 2], 'l', [8, 1],
                [9, 0],
                [10, 1],
                [9, 2]
            ]
        },
        '@': {
            w: 27,
            n: 17,
            d: ['m', [21, 3], 'q', [20, 1],
                [14, 0], 'l', [13, 0], 'q', [4, 1],
                [3, 10], 'l', [3, 11], 'q', [4, 20],
                [13, 21], 'l', [14, 21], 'q', [23, 20],
                [24, 11], 'l', [24, 10], 'q', [24, 6],
                [20, 6], 'q', [17, 6],
                [18, 10], 'q', [18, 6],
                [13, 6], 'q', [8, 6],
                [9, 11], 'q', [10, 15],
                [14, 15], 'q', [19, 15],
                [18, 10], 'm', [18, 10], 'l', [19, 14]
            ]
        },
        'A': {
            w: 18,
            n: 6,
            d: ['m', [1, 0], 'l', [9, 21],
                [17, 0], 'm', [4, 7], 'l', [14, 7]
            ]
        },
        'B': {
            w: 21,
            n: 9,
            d: ['m', [4, 11], 'l', [12, 11], 'm', [13, 0], 'l', [4, 0],
                [4, 21],
                [12, 21], 'q', [17, 21],
                [17, 16], 'q', [17, 11],
                [12, 11], 'q', [18, 11],
                [18, 6], 'l', [18, 5], 'q', [18, 0],
                [13, 0]
            ]
        },
        'C': {
            w: 21,
            n: 7,
            d: ['m', [11, 21], 'q', [17, 21],
                [18, 16], 'm', [18, 5], 'q', [17, 0],
                [11, 0], 'q', [3, 0],
                [3, 9], 'l', [3, 12], 'q', [3, 21],
                [11, 21]
            ]
        },
        'D': {
            w: 21,
            n: 5,
            d: ['m', [11, 0], 'l', [4, 0],
                [4, 21],
                [11, 21], 'q', [18, 21],
                [18, 12], 'l', [18, 9], 'q', [18, 0],
                [11, 0]
            ]
        },
        'E': {
            w: 19,
            n: 4,
            d: ['m', [17, 21], 'l', [4, 21],
                [4, 0],
                [17, 0], 'm', [4, 11], 'l', [12, 11]
            ]
        },
        'F': {
            w: 18,
            n: 4,
            d: ['m', [17, 21], 'l', [4, 21],
                [4, 0], 'm', [4, 11], 'l', [12, 11]
            ]
        },
        'G': {
            w: 21,
            n: 8,
            d: ['m', [11, 21], 'q', [17, 21],
                [18, 16], 'm', [13, 8], 'l', [18, 8],
                [18, 5], 'q', [17, 0],
                [11, 0], 'q', [3, 0],
                [3, 9], 'l', [3, 12], 'q', [3, 21],
                [11, 21]
            ]
        },
        'H': {
            w: 22,
            n: 6,
            d: ['m', [4, 21], 'l', [4, 0], 'm', [18, 21], 'l', [18, 0], 'm', [4, 11], 'l', [18, 11]]
        },
        'I': {
            w: 8,
            n: 2,
            d: ['m', [4, 21], 'l', [4, 0]]
        },
        'J': {
            w: 16,
            n: 5,
            d: ['m', [12, 21], 'l', [12, 5], 'q', [12, 0],
                [7, 0], 'q', [2, 0],
                [2, 5], 'l', [2, 7]
            ]
        },
        'K': {
            w: 21,
            n: 6,
            d: ['m', [4, 21], 'l', [4, 0], 'm', [18, 21], 'l', [4, 7], 'm', [9, 12], 'l', [18, 0]]
        },
        'L': {
            w: 17,
            n: 2,
            d: ['m', [4, 21], 'l', [4, 0],
                [16, 0]
            ]
        },
        'M': {
            w: 24,
            n: 2,
            d: ['m', [4, 0], 'l', [4, 21],
                [12, 0],
                [20, 21],
                [20, 0]
            ]
        },
        'N': {
            w: 22,
            n: 2,
            d: ['m', [4, 0], 'l', [4, 21],
                [18, 0],
                [18, 21]
            ]
        },
        'O': {
            w: 22,
            n: 7,
            d: ['m', [11, 21], 'q', [19, 21],
                [19, 12], 'l', [19, 9], 'q', [19, 0],
                [11, 0], 'q', [3, 0],
                [3, 9], 'l', [3, 12], 'q', [3, 21],
                [11, 21]
            ]
        },
        'P': {
            w: 21,
            n: 6,
            d: ['m', [4, 10], 'l', [13, 10], 'q', [18, 10],
                [18, 15], 'l', [18, 16], 'q', [18, 21],
                [13, 21], 'l', [4, 21],
                [4, 0]
            ]
        },
        'Q': {
            w: 22,
            n: 9,
            d: ['m', [11, 21], 'q', [19, 21],
                [19, 12], 'l', [19, 9], 'q', [19, 0],
                [11, 0], 'q', [3, 0],
                [3, 9], 'l', [3, 12], 'q', [3, 21],
                [11, 21], 'm', [12, 4], 'l', [18, -2]
            ]
        },
        'R': {
            w: 21,
            n: 8,
            d: ['m', [4, 10], 'l', [13, 10], 'q', [18, 10],
                [18, 15], 'l', [18, 16], 'q', [18, 21],
                [13, 21], 'l', [4, 21],
                [4, 0], 'm', [13, 10], 'l', [18, 0]
            ]
        },
        'S': {
            w: 20,
            n: 8,
            d: ['m', [16, 18], 'q', [15, 21],
                [10, 21], 'q', [5, 21],
                [4, 17], 'q', [3, 12],
                [7, 11], 'l', [13, 10], 'q', [18, 9],
                [17, 4], 'q', [16, 0],
                [10, 0], 'q', [4, 0],
                [3, 4]
            ]
        },
        'T': {
            w: 16,
            n: 4,
            d: ['m', [8, 21], 'l', [8, 0], 'm', [1, 21], 'l', [15, 21]]
        },
        'U': {
            w: 22,
            n: 5,
            d: ['m', [4, 21], 'l', [4, 6], 'q', [4, 0],
                [11, 0], 'q', [18, 0],
                [18, 6], 'l', [18, 21]
            ]
        },
        'V': {
            w: 18,
            n: 2,
            d: ['m', [1, 21], 'l', [9, 0],
                [17, 21]
            ]
        },
        'W': {
            w: 24,
            n: 2,
            d: ['m', [2, 21], 'l', [7, 0],
                [12, 21],
                [17, 0],
                [22, 21]
            ]
        },
        'X': {
            w: 20,
            n: 4,
            d: ['m', [3, 21], 'l', [17, 0], 'm', [17, 21], 'l', [3, 0]]
        },
        'Y': {
            w: 18,
            n: 4,
            d: ['m', [1, 21], 'l', [9, 11],
                [17, 21], 'm', [9, 11], 'l', [9, 0]
            ]
        },
        'Z': {
            w: 20,
            n: 2,
            d: ['m', [3, 21], 'l', [17, 21],
                [3, 0],
                [17, 0]
            ]
        },
        '[': {
            w: 14,
            n: 2,
            d: ['m', [11, 25], 'l', [4, 25],
                [4, -7],
                [11, -7]
            ]
        },
        '\\': {
            w: 14,
            n: 2,
            d: ['m', [0, 21], 'l', [14, -3]]
        },
        ']': {
            w: 14,
            n: 2,
            d: ['m', [3, 25], 'l', [10, 25],
                [10, -7],
                [3, -7]
            ]
        },
        '^': {
            w: 16,
            n: 2,
            d: ['m', [3, 16], 'l', [8, 21],
                [13, 16]
            ]
        },
        '_': {
            w: 16,
            n: 2,
            d: ['m', [0, -2], 'l', [16, -2]]
        },
        '`': {
            w: 10,
            n: 2,
            d: ['m', [6, 21], 'l', [5, 20],
                [4, 18],
                [4, 16],
                [5, 15],
                [6, 16],
                [5, 17]
            ]
        },
        'a': {
            w: 19,
            n: 10,
            d: ['m', [15, 14], 'l', [15, 0], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [13, 0],
                [15, 2], 'm', [15, 12], 'q', [13, 14],
                [10, 14]
            ]
        },
        'b': {
            w: 19,
            n: 10,
            d: ['m', [4, 21], 'l', [4, 0], 'm', [10, 14], 'l', [9, 14], 'q', [6, 14],
                [4, 12], 'm', [4, 2], 'q', [6, 0],
                [9, 0], 'l', [10, 0], 'q', [16, 0],
                [16, 7], 'q', [16, 14],
                [10, 14]
            ]
        },
        'c': {
            w: 18,
            n: 10,
            d: ['m', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [14, 0],
                [15, 3], 'm', [15, 11], 'q', [14, 14],
                [10, 14]
            ]
        },
        'd': {
            w: 19,
            n: 10,
            d: ['m', [15, 21], 'l', [15, 0], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [13, 0],
                [15, 2], 'm', [15, 12], 'q', [13, 14],
                [10, 14]
            ]
        },
        'e': {
            w: 18,
            n: 8,
            d: ['m', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [14, 0],
                [15, 3], 'm', [3, 8], 'l', [15, 8], 'q', [15, 14],
                [9, 14]
            ]
        },
        'f': {
            w: 12,
            n: 5,
            d: ['m', [10, 21], 'q', [5, 21],
                [5, 17], 'l', [5, 0], 'm', [2, 14], 'l', [9, 14]
            ]
        },
        'g': {
            w: 19,
            n: 12,
            d: ['m', [15, 14], 'l', [15, -2], 'q', [15, -7],
                [10, -7], 'q', [7, -7],
                [6, -6], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [13, 0],
                [15, 2], 'm', [15, 12], 'q', [13, 14],
                [10, 14]
            ]
        },
        'h': {
            w: 19,
            n: 6,
            d: ['m', [4, 21], 'l', [4, 0], 'm', [4, 10], 'q', [6, 14],
                [11, 14], 'q', [15, 14],
                [15, 10], 'l', [15, 0]
            ]
        },
        'i': {
            w: 8,
            n: 4,
            d: ['m', [3, 21], 'l', [4, 20],
                [5, 21],
                [4, 22],
                [3, 21], 'm', [4, 14], 'l', [4, 0]
            ]
        },
        'j': {
            w: 10,
            n: 5,
            d: ['m', [5, 21], 'l', [6, 20],
                [7, 21],
                [6, 22],
                [5, 21], 'm', [6, 14], 'l', [6, -3], 'q', [6, -8],
                [1, -7]
            ]
        },
        'k': {
            w: 17,
            n: 6,
            d: ['m', [4, 21], 'l', [4, 0], 'm', [14, 14], 'l', [4, 4], 'm', [8, 8], 'l', [15, 0]]
        },
        'l': {
            w: 8,
            n: 2,
            d: ['m', [4, 21], 'l', [4, 0]]
        },
        'm': {
            w: 26,
            n: 10,
            d: ['m', [4, 14], 'l', [4, 0], 'm', [4, 10], 'q', [6, 14],
                [10, 14], 'q', [13, 14],
                [13, 10], 'l', [13, 0], 'm', [13, 10], 'q', [15, 14],
                [19, 14], 'q', [22, 14],
                [22, 10], 'l', [22, 0]
            ]
        },
        'n': {
            w: 19,
            n: 6,
            d: ['m', [4, 14], 'l', [4, 0], 'm', [4, 10], 'q', [6, 14],
                [11, 14], 'q', [15, 14],
                [15, 10], 'l', [15, 0]
            ]
        },
        'o': {
            w: 19,
            n: 7,
            d: ['m', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [16, 0],
                [16, 7], 'q', [16, 14],
                [10, 14]
            ]
        },
        'p': {
            w: 19,
            n: 10,
            d: ['m', [4, 14], 'l', [4, -7], 'm', [10, 14], 'l', [9, 14], 'q', [6, 14],
                [4, 12], 'm', [4, 2], 'q', [6, 0],
                [9, 0], 'l', [10, 0], 'q', [16, 0],
                [16, 7], 'q', [16, 14],
                [10, 14]
            ]
        },
        'q': {
            w: 19,
            n: 10,
            d: ['m', [15, 14], 'l', [15, -7], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [13, 0],
                [15, 2], 'm', [15, 12], 'q', [13, 14],
                [10, 14]
            ]
        },
        'r': {
            w: 13,
            n: 4,
            d: ['m', [4, 14], 'l', [4, 0], 'm', [4, 8], 'q', [5, 14],
                [12, 14]
            ]
        },
        's': {
            w: 16,
            n: 7,
            d: ['m', [13, 11], 'q', [13, 14],
                [8, 14], 'q', [3, 14],
                [3, 11], 'q', [3, 8],
                [8, 7], 'q', [13, 6],
                [13, 3], 'q', [13, 0],
                [8, 0], 'q', [3, 0],
                [3, 3]
            ]
        },
        't': {
            w: 12,
            n: 5,
            d: ['m', [5, 21], 'l', [5, 4], 'q', [5, -1],
                [10, 0], 'm', [2, 14], 'l', [9, 14]
            ]
        },
        'u': {
            w: 19,
            n: 6,
            d: ['m', [4, 14], 'l', [4, 4], 'q', [4, 0],
                [8, 0], 'q', [13, 0],
                [15, 4], 'm', [15, 14], 'l', [15, 0]
            ]
        },
        'v': {
            w: 16,
            n: 2,
            d: ['m', [2, 14], 'l', [8, 0],
                [14, 14]
            ]
        },
        'w': {
            w: 22,
            n: 2,
            d: ['m', [3, 14], 'l', [7, 0],
                [11, 14],
                [15, 0],
                [19, 14]
            ]
        },
        'x': {
            w: 17,
            n: 4,
            d: ['m', [3, 14], 'l', [14, 0], 'm', [14, 14], 'l', [3, 0]]
        },
        'y': {
            w: 16,
            n: 5,
            d: ['m', [2, 14], 'l', [8, 0], 'm', [14, 14], 'l', [8, 0], 'q', [5, -7],
                [1, -7]
            ]
        },
        'z': {
            w: 17,
            n: 2,
            d: ['m', [3, 14], 'l', [14, 14],
                [3, 0],
                [14, 0]
            ]
        },
        '{': {
            w: 14,
            n: 9,
            d: ['m', [9, 25], 'q', [5, 24],
                [5, 20], 'q', [5, 17],
                [7, 16], 'q', [9, 15],
                [8, 12], 'q', [7, 9],
                [4, 9], 'q', [7, 9],
                [8, 6], 'q', [9, 3],
                [7, 2], 'q', [5, 1],
                [5, -2], 'q', [5, -6],
                [9, -7]
            ]
        },
        '|': {
            w: 8,
            n: 2,
            d: ['m', [4, 25], 'l', [4, -7]]
        },
        '}': {
            w: 14,
            n: 9,
            d: ['m', [5, 25], 'q', [9, 24],
                [9, 20], 'q', [9, 17],
                [7, 16], 'q', [5, 15],
                [6, 12], 'q', [7, 9],
                [10, 9], 'q', [7, 9],
                [6, 6], 'q', [5, 3],
                [7, 2], 'q', [9, 1],
                [9, -2], 'q', [9, -6],
                [5, -7]
            ]
        },
        '~': {
            w: 24,
            n: 4,
            d: ['m', [3, 6], 'q', [3, 12],
                [10, 10], 'l', [14, 8], 'q', [21, 4],
                [21, 10]
            ]
        },
        '�': {
            w: 16,
            n: 1,
            d: []
        },
        '�': {
            w: 10,
            n: 4,
            d: ['m', [5, 10], 'l', [5, -4], 'm', [5, 17], 'l', [4, 16],
                [5, 15],
                [6, 16],
                [5, 17]
            ]
        },
        '�': {
            w: 18,
            n: 14,
            d: ['m', [9, 14], 'l', [9, 18], 'm', [9, 0], 'l', [9, -4], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [14, 0],
                [15, 3], 'm', [15, 11], 'q', [14, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 18,
            n: 8,
            d: ['m', [4, 11], 'l', [13, 11], 'm', [16, 18], 'q', [15, 21],
                [11, 21], 'q', [5, 21],
                [6, 16], 'q', [7, 8],
                [6, 2], 'q', [5, 0],
                [4, 0], 'l', [16, 0]
            ]
        },
        '�': {
            w: 19,
            n: 13,
            d: ['m', [15, 3], 'l', [17, 1], 'm', [15, 13], 'l', [17, 15], 'm', [5, 3], 'l', [3, 1], 'm', [5, 13], 'l', [3, 15], 'm', [10, 14], 'q', [4, 14],
                [4, 8], 'q', [4, 2],
                [10, 2], 'q', [16, 2],
                [16, 8], 'q', [16, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 18,
            n: 8,
            d: ['m', [4, 7], 'l', [14, 7], 'm', [4, 11], 'l', [14, 11], 'm', [1, 21], 'l', [9, 11],
                [17, 21], 'm', [9, 11], 'l', [9, 0]
            ]
        },
        '�': {
            w: 8,
            n: 4,
            d: ['m', [4, 25], 'l', [4, 12], 'm', [4, 6], 'l', [4, -7]]
        },
        '�': {
            w: 20,
            n: 12,
            d: ['m', [16, 18], 'q', [16, 21],
                [10, 21], 'q', [4, 21],
                [4, 18], 'q', [4, 15],
                [10, 14], 'q', [16, 13],
                [16, 10], 'q', [16, 6],
                [10, 7], 'm', [10, 14], 'q', [4, 15],
                [4, 11], 'q', [4, 8],
                [10, 7], 'q', [16, 6],
                [16, 3], 'q', [16, 0],
                [10, 0], 'q', [4, 0],
                [4, 3]
            ]
        },
        '�': {
            w: 16,
            n: 4,
            d: ['m', [4, 25], 'l', [4, 23], 'm', [12, 25], 'l', [12, 23]]
        },
        '�': {
            w: 27,
            n: 15,
            d: ['m', [18, 13], 'q', [17, 15],
                [14, 15], 'q', [9, 15],
                [9, 11], 'l', [9, 10], 'q', [9, 6],
                [14, 6], 'q', [17, 6],
                [18, 8], 'm', [24, 10], 'q', [24, 0],
                [14, 0], 'l', [13, 0], 'q', [3, 0],
                [3, 10], 'l', [3, 11], 'q', [3, 21],
                [13, 21], 'l', [14, 21], 'q', [24, 21],
                [24, 11], 'l', [24, 10]
            ]
        },
        '�': {
            w: 14,
            n: 9,
            d: ['m', [4, 12], 'l', [10, 12], 'm', [10, 21], 'l', [10, 15], 'm', [4, 18], 'q', [4, 15],
                [7, 15], 'q', [10, 15],
                [10, 18], 'q', [10, 21],
                [7, 21], 'q', [4, 21],
                [4, 18]
            ]
        },
        '�': {
            w: 24,
            n: 4,
            d: ['m', [12, 16], 'l', [3, 9],
                [12, 2], 'm', [21, 16], 'l', [12, 9],
                [21, 2]
            ]
        },
        '�': {
            w: 22,
            n: 2,
            d: ['m', [4, 12], 'l', [18, 12],
                [18, 8]
            ]
        },
        '�': {
            w: 22,
            n: 2,
            d: ['m', [4, 9], 'l', [18, 9]]
        },
        '�': {
            w: 27,
            n: 17,
            d: ['m', [9, 6], 'l', [9, 15],
                [16, 15], 'm', [9, 10], 'l', [16, 10],
                [18, 6], 'm', [16, 10], 'q', [18, 10],
                [18, 12], 'l', [18, 13], 'q', [18, 15],
                [16, 15], 'm', [24, 10], 'q', [24, 0],
                [14, 0], 'l', [13, 0], 'q', [3, 0],
                [3, 10], 'l', [3, 11], 'q', [3, 21],
                [13, 21], 'l', [14, 21], 'q', [24, 21],
                [24, 11], 'l', [24, 10]
            ]
        },
        '�': {
            w: 16,
            n: 2,
            d: ['m', [0, 24], 'l', [16, 24]]
        },
        '�': {
            w: 10,
            n: 5,
            d: ['m', [3, 23], 'q', [3, 21],
                [5, 21], 'q', [7, 21],
                [7, 23], 'q', [7, 25],
                [5, 25], 'q', [3, 25],
                [3, 23]
            ]
        },
        '�': {
            w: 22,
            n: 6,
            d: ['m', [11, 18], 'l', [11, 6], 'm', [4, 12], 'l', [18, 12], 'm', [4, 2], 'l', [18, 2]]
        },
        '�': {
            w: 14,
            n: 6,
            d: ['m', [10, 11], 'l', [4, 11], 'q', [4, 15],
                [7, 15], 'q', [10, 15],
                [10, 18], 'q', [10, 21],
                [7, 21], 'q', [4, 21],
                [4, 18]
            ]
        },
        '�': {
            w: 14,
            n: 5,
            d: ['m', [4, 14], 'q', [4, 11],
                [7, 11], 'q', [10, 11],
                [10, 14], 'q', [10, 17],
                [7, 17], 'l', [10, 21],
                [4, 21]
            ]
        },
        '�': {
            w: 19,
            n: 2,
            d: ['m', [9, 18], 'l', [12, 20]]
        },
        '�': {
            w: 19,
            n: 7,
            d: ['m', [4, 14], 'l', [4, -6], 'm', [4, 4], 'q', [4, 0],
                [8, 0], 'q', [13, 0],
                [15, 4], 'm', [15, 14], 'l', [15, 0]
            ]
        },
        '�': {
            w: 18,
            n: 5,
            d: ['m', [8, 11], 'q', [3, 11],
                [3, 16], 'q', [3, 21],
                [9, 21], 'm', [9, 0], 'l', [9, 21],
                [15, 21],
                [15, 0]
            ]
        },
        '�': {
            w: 10,
            n: 2,
            d: ['m', [5, 14], 'l', [4, 13],
                [5, 12],
                [6, 13],
                [5, 14]
            ]
        },
        '�': {
            w: 18,
            n: 2,
            d: ['m', [10, 0], 'l', [10, -2],
                [7, -4]
            ]
        },
        '�': {
            w: 10,
            n: 2,
            d: ['m', [4, 19], 'l', [6, 21],
                [6, 11]
            ]
        },
        '�': {
            w: 14,
            n: 7,
            d: ['m', [4, 12], 'l', [10, 12], 'm', [4, 18], 'q', [4, 15],
                [7, 15], 'q', [10, 15],
                [10, 18], 'q', [10, 21],
                [7, 21], 'q', [4, 21],
                [4, 18]
            ]
        },
        '�': {
            w: 24,
            n: 4,
            d: ['m', [3, 16], 'l', [12, 9],
                [3, 2], 'm', [12, 16], 'l', [21, 9],
                [12, 2]
            ]
        },
        '�': {
            w: 24,
            n: 6,
            d: ['m', [4, 19], 'l', [6, 21],
                [6, 11], 'm', [16, 15], 'l', [6, 5], 'm', [19, 0], 'l', [19, 10],
                [14, 4],
                [20, 4]
            ]
        },
        '�': {
            w: 24,
            n: 10,
            d: ['m', [4, 19], 'l', [6, 21],
                [6, 11], 'm', [16, 15], 'l', [6, 5], 'm', [20, 0], 'l', [14, 0], 'q', [14, 4],
                [17, 4], 'q', [20, 4],
                [20, 7], 'q', [20, 10],
                [17, 10], 'q', [14, 10],
                [14, 7]
            ]
        },
        '�': {
            w: 24,
            n: 10,
            d: ['m', [4, 14], 'q', [4, 11],
                [7, 11], 'q', [10, 11],
                [10, 14], 'q', [10, 17],
                [7, 17], 'l', [10, 21],
                [4, 21], 'm', [18, 15], 'l', [8, 5], 'm', [19, 0], 'l', [19, 10],
                [14, 4],
                [20, 4]
            ]
        },
        '�': {
            w: 18,
            n: 7,
            d: ['m', [9, 21], 'l', [8, 20],
                [9, 19],
                [10, 20],
                [9, 21], 'm', [9, 14], 'l', [9, 10], 'q', [3, 10],
                [3, 5], 'q', [3, 0],
                [9, 0], 'q', [15, 0],
                [15, 5]
            ]
        },
        '�': {
            w: 18,
            n: 6,
            d: ['m', [7, 25], 'l', [10, 23], 'm', [1, 0], 'l', [9, 21],
                [17, 0], 'm', [4, 7], 'l', [14, 7]
            ]
        },
        '�': {
            w: 18,
            n: 6,
            d: ['m', [8, 23], 'l', [11, 25], 'm', [1, 0], 'l', [9, 21],
                [17, 0], 'm', [4, 7], 'l', [14, 7]
            ]
        },
        '�': {
            w: 18,
            n: 6,
            d: ['m', [7, 23], 'l', [9, 25],
                [11, 23], 'm', [1, 0], 'l', [9, 21],
                [17, 0], 'm', [4, 7], 'l', [14, 7]
            ]
        },
        '�': {
            w: 18,
            n: 6,
            d: ['m', [6, 23], 'l', [8, 25],
                [10, 23],
                [12, 25], 'm', [1, 0], 'l', [9, 21],
                [17, 0], 'm', [4, 7], 'l', [14, 7]
            ]
        },
        '�': {
            w: 18,
            n: 10,
            d: ['m', [5, 25], 'l', [5, 23], 'm', [13, 25], 'l', [13, 23], 'm', [1, 0], 'l', [9, 21],
                [17, 0], 'm', [4, 7], 'l', [14, 7]
            ]
        },
        '�': {
            w: 18,
            n: 10,
            d: ['m', [7, 23], 'q', [7, 21],
                [9, 21], 'q', [11, 21],
                [11, 23], 'q', [11, 25],
                [9, 25], 'q', [7, 25],
                [7, 23], 'm', [1, 0], 'l', [9, 21],
                [17, 0], 'm', [4, 7], 'l', [14, 7]
            ]
        },
        '�': {
            w: 18,
            n: 12,
            d: ['m', [9, 21], 'l', [1, 0], 'm', [4, 7], 'l', [9, 7], 'm', [9, 21], 'l', [9, 0], 'm', [9, 21], 'l', [17, 21], 'm', [9, 11], 'l', [17, 11], 'm', [9, 0], 'l', [17, 0]]
        },
        '�': {
            w: 21,
            n: 9,
            d: ['m', [11, 0], 'l', [11, -2],
                [8, -4], 'm', [11, 21], 'q', [17, 21],
                [18, 16], 'm', [18, 5], 'q', [17, 0],
                [11, 0], 'q', [3, 0],
                [3, 9], 'l', [3, 12], 'q', [3, 21],
                [11, 21]
            ]
        },
        '�': {
            w: 19,
            n: 8,
            d: ['m', [7, 25], 'l', [10, 23], 'm', [17, 21], 'l', [4, 21],
                [4, 0],
                [17, 0], 'm', [4, 11], 'l', [12, 11]
            ]
        },
        '�': {
            w: 19,
            n: 8,
            d: ['m', [9, 23], 'l', [12, 25], 'm', [17, 21], 'l', [4, 21],
                [4, 0],
                [17, 0], 'm', [4, 11], 'l', [12, 11]
            ]
        },
        '�': {
            w: 19,
            n: 8,
            d: ['m', [8, 23], 'l', [10, 25],
                [12, 23], 'm', [17, 21], 'l', [4, 21],
                [4, 0],
                [17, 0], 'm', [4, 11], 'l', [12, 11]
            ]
        },
        '�': {
            w: 19,
            n: 10,
            d: ['m', [6, 25], 'l', [6, 23], 'm', [15, 25], 'l', [15, 23], 'm', [17, 21], 'l', [4, 21],
                [4, 0],
                [17, 0], 'm', [4, 11], 'l', [12, 11]
            ]
        },
        '�': {
            w: 8,
            n: 4,
            d: ['m', [3, 25], 'l', [6, 23], 'm', [4, 21], 'l', [4, 0]]
        },
        '�': {
            w: 8,
            n: 4,
            d: ['m', [2, 23], 'l', [5, 25], 'm', [4, 21], 'l', [4, 0]]
        },
        '�': {
            w: 8,
            n: 4,
            d: ['m', [2, 23], 'l', [4, 25],
                [6, 23], 'm', [4, 21], 'l', [4, 0]
            ]
        },
        '�': {
            w: 8,
            n: 6,
            d: ['m', [2, 25], 'l', [2, 23], 'm', [6, 25], 'l', [6, 23], 'm', [4, 21], 'l', [4, 0]]
        },
        '�': {
            w: 21,
            n: 7,
            d: ['m', [2, 10], 'l', [11, 10], 'm', [11, 0], 'l', [4, 0],
                [4, 21],
                [11, 21], 'q', [18, 21],
                [18, 12], 'l', [18, 9], 'q', [18, 0],
                [11, 0]
            ]
        },
        '�': {
            w: 22,
            n: 4,
            d: ['m', [8, 23], 'l', [10, 25],
                [12, 23],
                [14, 25], 'm', [4, 0], 'l', [4, 21],
                [18, 0],
                [18, 21]
            ]
        },
        '�': {
            w: 22,
            n: 9,
            d: ['m', [8, 25], 'l', [11, 23], 'm', [11, 21], 'q', [19, 21],
                [19, 12], 'l', [19, 9], 'q', [19, 0],
                [11, 0], 'q', [3, 0],
                [3, 9], 'l', [3, 12], 'q', [3, 21],
                [11, 21]
            ]
        },
        '�': {
            w: 22,
            n: 9,
            d: ['m', [10, 23], 'l', [13, 25], 'm', [11, 21], 'q', [19, 21],
                [19, 12], 'l', [19, 9], 'q', [19, 0],
                [11, 0], 'q', [3, 0],
                [3, 9], 'l', [3, 12], 'q', [3, 21],
                [11, 21]
            ]
        },
        '�': {
            w: 22,
            n: 9,
            d: ['m', [9, 23], 'l', [11, 25],
                [13, 23], 'm', [11, 21], 'q', [19, 21],
                [19, 12], 'l', [19, 9], 'q', [19, 0],
                [11, 0], 'q', [3, 0],
                [3, 9], 'l', [3, 12], 'q', [3, 21],
                [11, 21]
            ]
        },
        '�': {
            w: 22,
            n: 9,
            d: ['m', [8, 23], 'l', [10, 25],
                [12, 23],
                [14, 25], 'm', [11, 21], 'q', [19, 21],
                [19, 12], 'l', [19, 9], 'q', [19, 0],
                [11, 0], 'q', [3, 0],
                [3, 9], 'l', [3, 12], 'q', [3, 21],
                [11, 21]
            ]
        },
        '�': {
            w: 22,
            n: 13,
            d: ['m', [6, 25], 'l', [6, 23], 'm', [16, 25], 'l', [16, 23], 'm', [11, 21], 'q', [19, 21],
                [19, 12], 'l', [19, 9], 'q', [19, 0],
                [11, 0], 'q', [3, 0],
                [3, 9], 'l', [3, 12], 'q', [3, 21],
                [11, 21]
            ]
        },
        '�': {
            w: 12,
            n: 4,
            d: ['m', [2, 16], 'l', [10, 6], 'm', [10, 16], 'l', [2, 6]]
        },
        '�': {
            w: 22,
            n: 9,
            d: ['m', [3, 1], 'l', [19, 20], 'm', [11, 21], 'q', [19, 21],
                [19, 12], 'l', [19, 9], 'q', [19, 0],
                [11, 0], 'q', [3, 0],
                [3, 9], 'l', [3, 12], 'q', [3, 21],
                [11, 21]
            ]
        },
        '�': {
            w: 22,
            n: 7,
            d: ['m', [8, 25], 'l', [11, 23], 'm', [4, 21], 'l', [4, 6], 'q', [4, 0],
                [11, 0], 'q', [18, 0],
                [18, 6], 'l', [18, 21]
            ]
        },
        '�': {
            w: 22,
            n: 7,
            d: ['m', [10, 23], 'l', [13, 25], 'm', [4, 21], 'l', [4, 6], 'q', [4, 0],
                [11, 0], 'q', [18, 0],
                [18, 6], 'l', [18, 21]
            ]
        },
        '�': {
            w: 22,
            n: 7,
            d: ['m', [9, 23], 'l', [11, 25],
                [13, 23], 'm', [4, 21], 'l', [4, 6], 'q', [4, 0],
                [11, 0], 'q', [18, 0],
                [18, 6], 'l', [18, 21]
            ]
        },
        '�': {
            w: 22,
            n: 9,
            d: ['m', [7, 25], 'l', [7, 23], 'm', [15, 25], 'l', [15, 23], 'm', [4, 21], 'l', [4, 6], 'q', [4, 0],
                [11, 0], 'q', [18, 0],
                [18, 6], 'l', [18, 21]
            ]
        },
        '�': {
            w: 18,
            n: 6,
            d: ['m', [8, 23], 'l', [11, 25], 'm', [1, 21], 'l', [9, 11],
                [9, 0], 'm', [17, 21], 'l', [9, 11]
            ]
        },
        '�': {
            w: 19,
            n: 7,
            d: ['m', [4, 18], 'l', [4, -5], 'm', [4, 14], 'l', [9, 14], 'q', [16, 14],
                [16, 7], 'q', [16, 0],
                [9, 0], 'l', [4, 0]
            ]
        },
        '�': {
            w: 21,
            n: 9,
            d: ['m', [8, 0], 'l', [11, 0], 'q', [17, 0],
                [17, 5], 'l', [17, 6], 'q', [17, 10],
                [11, 12], 'q', [16, 13],
                [16, 16], 'q', [16, 21],
                [10, 21], 'q', [4, 21],
                [4, 16], 'l', [4, 0]
            ]
        },
        '�': {
            w: 19,
            n: 12,
            d: ['m', [7, 20], 'l', [10, 18], 'm', [15, 14], 'l', [15, 0], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [13, 0],
                [15, 2], 'm', [15, 12], 'q', [13, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 19,
            n: 12,
            d: ['m', [9, 18], 'l', [12, 20], 'm', [15, 14], 'l', [15, 0], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [13, 0],
                [15, 2], 'm', [15, 12], 'q', [13, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 19,
            n: 12,
            d: ['m', [7, 18], 'l', [9, 20],
                [11, 18], 'm', [15, 14], 'l', [15, 0], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [13, 0],
                [15, 2], 'm', [15, 12], 'q', [13, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 19,
            n: 12,
            d: ['m', [7, 18], 'l', [9, 20],
                [11, 18],
                [13, 20], 'm', [15, 14], 'l', [15, 0], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [13, 0],
                [15, 2], 'm', [15, 12], 'q', [13, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 19,
            n: 14,
            d: ['m', [4, 20], 'l', [4, 18], 'm', [15, 20], 'l', [15, 18], 'm', [15, 14], 'l', [15, 0], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [13, 0],
                [15, 2], 'm', [15, 12], 'q', [13, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 19,
            n: 15,
            d: ['m', [7, 18], 'q', [7, 16],
                [9, 16], 'q', [11, 16],
                [11, 18], 'q', [11, 20],
                [9, 20], 'q', [7, 20],
                [7, 18], 'm', [15, 14], 'l', [15, 0], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [13, 0],
                [15, 2], 'm', [15, 12], 'q', [13, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 21,
            n: 10,
            d: ['m', [11, 14], 'l', [11, 0], 'm', [11, 8], 'l', [18, 8], 'q', [18, 14],
                [12, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [13, 0], 'q', [17, 0],
                [18, 3]
            ]
        },
        '�': {
            w: 18,
            n: 10,
            d: ['m', [10, 0], 'l', [10, -2],
                [7, -4], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [14, 0],
                [15, 3], 'm', [15, 11], 'q', [14, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 18,
            n: 10,
            d: ['m', [7, 20], 'l', [10, 18], 'm', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [14, 0],
                [15, 3], 'm', [3, 8], 'l', [15, 8], 'q', [15, 14],
                [9, 14]
            ]
        },
        '�': {
            w: 18,
            n: 10,
            d: ['m', [9, 18], 'l', [12, 20], 'm', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [14, 0],
                [15, 3], 'm', [3, 8], 'l', [15, 8], 'q', [15, 14],
                [9, 14]
            ]
        },
        '�': {
            w: 18,
            n: 10,
            d: ['m', [7, 18], 'l', [9, 20],
                [11, 18], 'm', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [14, 0],
                [15, 3], 'm', [3, 8], 'l', [15, 8], 'q', [15, 14],
                [9, 14]
            ]
        },
        '�': {
            w: 18,
            n: 12,
            d: ['m', [4, 20], 'l', [4, 18], 'm', [15, 20], 'l', [15, 18], 'm', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [14, 0],
                [15, 3], 'm', [3, 8], 'l', [15, 8], 'q', [15, 14],
                [9, 14]
            ]
        },
        '�': {
            w: 8,
            n: 4,
            d: ['m', [3, 20], 'l', [6, 18], 'm', [4, 14], 'l', [4, 0]]
        },
        '�': {
            w: 8,
            n: 4,
            d: ['m', [2, 18], 'l', [5, 20], 'm', [4, 14], 'l', [4, 0]]
        },
        '�': {
            w: 8,
            n: 4,
            d: ['m', [2, 18], 'l', [4, 20],
                [6, 18], 'm', [4, 14], 'l', [4, 0]
            ]
        },
        '�': {
            w: 8,
            n: 6,
            d: ['m', [2, 20], 'l', [2, 18], 'm', [6, 20], 'l', [6, 18], 'm', [4, 14], 'l', [4, 0]]
        },
        '�': {
            w: 19,
            n: 12,
            d: ['m', [8, 17], 'l', [10, 21], 'm', [7, 20], 'l', [11, 18], 'q', [16, 16],
                [16, 8], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [16, 0],
                [16, 7], 'q', [16, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 19,
            n: 8,
            d: ['m', [7, 18], 'l', [9, 20],
                [11, 18],
                [13, 20], 'm', [4, 14], 'l', [4, 0], 'm', [4, 10], 'q', [6, 14],
                [11, 14], 'q', [15, 14],
                [15, 10], 'l', [15, 0]
            ]
        },
        '�': {
            w: 19,
            n: 9,
            d: ['m', [7, 20], 'l', [10, 18], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [16, 0],
                [16, 7], 'q', [16, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 19,
            n: 9,
            d: ['m', [9, 18], 'l', [12, 20], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [16, 0],
                [16, 7], 'q', [16, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 19,
            n: 9,
            d: ['m', [7, 18], 'l', [9, 20],
                [11, 18], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [16, 0],
                [16, 7], 'q', [16, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 19,
            n: 9,
            d: ['m', [7, 18], 'l', [9, 20],
                [11, 18],
                [13, 20], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [16, 0],
                [16, 7], 'q', [16, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 19,
            n: 11,
            d: ['m', [4, 20], 'l', [4, 18], 'm', [15, 20], 'l', [15, 18], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [16, 0],
                [16, 7], 'q', [16, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 18,
            n: 6,
            d: ['m', [9, 15], 'l', [9, 14], 'm', [4, 9], 'l', [14, 9], 'm', [9, 4], 'l', [9, 3]]
        },
        '�': {
            w: 19,
            n: 9,
            d: ['m', [3, 1], 'l', [15, 14], 'm', [10, 14], 'l', [9, 14], 'q', [3, 14],
                [3, 7], 'q', [3, 0],
                [9, 0], 'l', [10, 0], 'q', [16, 0],
                [16, 7], 'q', [16, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 19,
            n: 8,
            d: ['m', [7, 20], 'l', [10, 18], 'm', [4, 14], 'l', [4, 4], 'q', [4, 0],
                [8, 0], 'q', [13, 0],
                [15, 4], 'm', [15, 14], 'l', [15, 0]
            ]
        },
        '�': {
            w: 19,
            n: 8,
            d: ['m', [9, 18], 'l', [12, 20], 'm', [4, 14], 'l', [4, 4], 'q', [4, 0],
                [8, 0], 'q', [13, 0],
                [15, 4], 'm', [15, 14], 'l', [15, 0]
            ]
        },
        '�': {
            w: 19,
            n: 8,
            d: ['m', [7, 18], 'l', [9, 20],
                [11, 18], 'm', [4, 14], 'l', [4, 4], 'q', [4, 0],
                [8, 0], 'q', [13, 0],
                [15, 4], 'm', [15, 14], 'l', [15, 0]
            ]
        },
        '�': {
            w: 19,
            n: 10,
            d: ['m', [4, 20], 'l', [4, 18], 'm', [15, 20], 'l', [15, 18], 'm', [4, 14], 'l', [4, 4], 'q', [4, 0],
                [8, 0], 'q', [13, 0],
                [15, 4], 'm', [15, 14], 'l', [15, 0]
            ]
        },
        '�': {
            w: 16,
            n: 7,
            d: ['m', [7, 18], 'l', [10, 20], 'm', [2, 14], 'l', [8, 0], 'm', [14, 14], 'l', [8, 0], 'q', [5, -7],
                [1, -7]
            ]
        },
        '�': {
            w: 19,
            n: 10,
            d: ['m', [4, 21], 'l', [4, -7], 'm', [10, 14], 'l', [9, 14], 'q', [6, 14],
                [4, 12], 'm', [4, 2], 'q', [6, 0],
                [9, 0], 'l', [10, 0], 'q', [16, 0],
                [16, 7], 'q', [16, 14],
                [10, 14]
            ]
        },
        '�': {
            w: 16,
            n: 9,
            d: ['m', [2, 20], 'l', [2, 18], 'm', [14, 20], 'l', [14, 18], 'm', [2, 14], 'l', [8, 0], 'm', [14, 14], 'l', [8, 0], 'q', [5, -7],
                [1, -7]
            ]
        }
    }
}
if (!this.JSON) {
    this.JSON = {}
}(function () {
    function f(n) {
        return n < 10 ? '0' + n : n
    }
    if (typeof Date.prototype.toJSON !== 'function') {
        Date.prototype.toJSON = function (key) {
            return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + 'T' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds()) + 'Z' : null
        };
        String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (key) {
            return this.valueOf()
        }
    }
    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        gap, indent, meta = {
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"': '\\"',
            '\\': '\\\\'
        },
        rep;

    function quote(string) {
        escapable.lastIndex = 0;
        return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
            var c = meta[a];
            return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4)
        }) + '"' : '"' + string + '"'
    }
    function str(key, holder) {
        var i, k, v, length, mind = gap,
            partial, value = holder[key];
        if (value && typeof value === 'object' && typeof value.toJSON === 'function') {
            value = value.toJSON(key)
        }
        if (typeof rep === 'function') {
            value = rep.call(holder, key, value)
        }
        switch (typeof value) {
        case 'string':
            return quote(value);
        case 'number':
            return isFinite(value) ? String(value) : 'null';
        case 'boolean':
        case 'null':
            return String(value);
        case 'object':
            if (!value) {
                return 'null'
            }
            gap += indent;
            partial = [];
            if (Object.prototype.toString.apply(value) === '[object Array]') {
                length = value.length;
                for (i = 0; i < length; i += 1) {
                    partial[i] = str(i, value) || 'null'
                }
                v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']';
                gap = mind;
                return v
            }
            if (rep && typeof rep === 'object') {
                length = rep.length;
                for (i = 0; i < length; i += 1) {
                    k = rep[i];
                    if (typeof k === 'string') {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v)
                        }
                    }
                }
            } else {
                for (k in value) {
                    if (Object.hasOwnProperty.call(value, k)) {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v)
                        }
                    }
                }
            }
            v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}';
            gap = mind;
            return v
        }
    }
    if (typeof JSON.stringify !== 'function') {
        JSON.stringify = function (value, replacer, space) {
            var i;
            gap = '';
            indent = '';
            if (typeof space === 'number') {
                for (i = 0; i < space; i += 1) {
                    indent += ' '
                }
            } else if (typeof space === 'string') {
                indent = space
            }
            rep = replacer;
            if (replacer && typeof replacer !== 'function' && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) {
                throw new Error('JSON.stringify')
            }
            return str('', {
                '': value
            })
        }
    }
    if (typeof JSON.parse !== 'function') {
        JSON.parse = function (text, reviver) {
            var j;

            function walk(holder, key) {
                var k, v, value = holder[key];
                if (value && typeof value === 'object') {
                    for (k in value) {
                        if (Object.hasOwnProperty.call(value, k)) {
                            v = walk(value, k);
                            if (v !== undefined) {
                                value[k] = v
                            } else {
                                delete value[k]
                            }
                        }
                    }
                }
                return reviver.call(holder, key, value)
            }
            cx.lastIndex = 0;
            if (cx.test(text)) {
                text = text.replace(cx, function (a) {
                    return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4)
                })
            }
            if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
                j = eval('(' + text + ')');
                return typeof reviver === 'function' ? walk({
                    '': j
                }, '') : j
            }
            throw new SyntaxError('JSON.parse')
        }
    }
}());
