! function (x, o, Z) {
    "use strict";

    function l(_, r) {
        if ("function" != typeof r && null !== r) throw new TypeError("Super expression must either be null or a function");
        _.prototype = o.create(r && r.prototype, {
            constructor: {
                value: _,
                writable: !0,
                configurable: !0
            }
        }), r && rb(_, r)
    }

    function d(e) {
        var B = o.prototype.toString.call(e);
        return "Array]" === B.substring(B.length - 6)
    }

    function y(F, D, n, T, x, Y) {
        D = D || [], n = n || [], T = T || [];
        try {
            D.push(F);
            var C = Function.apply(0, D);
            return n[n.length] = "return " + C, Function.apply(0, n).apply(0, T)
        } catch (U) {
            return Y && Y(U), x
        }
    }

    function E(b) {
        var K = {};
        return {
            get: function (D) {
                if (K[D] !== Z) return K[D];
                var X;
                switch (D) {
                    case "WEBGL_depth_texture":
                        X = b.getExtension("WEBGL_depth_texture") || b.getExtension("MOZ_WEBGL_depth_texture") || b.getExtension("WEBKIT_WEBGL_depth_texture");
                        break;
                    case "EXT_texture_filter_anisotropic":
                        X = b.getExtension("EXT_texture_filter_anisotropic") || b.getExtension("MOZ_EXT_texture_filter_anisotropic") || b.getExtension("WEBKIT_EXT_texture_filter_anisotropic");
                        break;
                    case "WEBGL_compressed_texture_s3tc":
                        X = b.getExtension("WEBGL_compressed_texture_s3tc") || b.getExtension("MOZ_WEBGL_compressed_texture_s3tc") || b.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");
                        break;
                    case "WEBGL_compressed_texture_pvrtc":
                        X = b.getExtension("WEBGL_compressed_texture_pvrtc") || b.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");
                        break;
                    case "WEBGL_compressed_texture_etc1":
                        X = b.getExtension("WEBGL_compressed_texture_etc1");
                        break;
                    default:
                        X = b.getExtension(D)
                }
                return K[D] = X, X
            }
        }
    }

    function B(y, V, h) {
        function d() {
            if (p !== Z) return p;
            var K = V.get("EXT_texture_filter_anisotropic");
            return p = null !== K ? y.getParameter(K.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0
        }

        function r(o) {
            if ("highp" === o) {
                if (y.getShaderPrecisionFormat(y.VERTEX_SHADER, y.HIGH_FLOAT).precision > 0 && y.getShaderPrecisionFormat(y.FRAGMENT_SHADER, y.HIGH_FLOAT).precision > 0) return "highp";
                o = "mediump"
            }
            return "mediump" === o && y.getShaderPrecisionFormat(y.VERTEX_SHADER, y.MEDIUM_FLOAT).precision > 0 && y.getShaderPrecisionFormat(y.FRAGMENT_SHADER, y.MEDIUM_FLOAT).precision > 0 ? "mediump" : "lowp"
        }
        var p;
        h = h || {};
        var K = "undefined" != typeof WebGL2RenderingContext && y instanceof WebGL2RenderingContext,
            x = h.precision !== Z ? h.precision : "highp",
            D = r(x);
        D !== x && (console.warn("WebGL:", x, "not supported, using", D, "instead."), x = D);
        var c = h.logarithmicDepthBuffer === !0,
            F = y.getParameter(y.MAX_TEXTURE_IMAGE_UNITS),
            C = y.getParameter(y.MAX_VERTEX_TEXTURE_IMAGE_UNITS),
            Y = y.getParameter(y.MAX_TEXTURE_SIZE),
            n = y.getParameter(y.MAX_CUBE_MAP_TEXTURE_SIZE),
            I = y.getParameter(y.MAX_VERTEX_ATTRIBS),
            e = y.getParameter(y.MAX_VERTEX_UNIFORM_VECTORS),
            o = y.getParameter(y.MAX_VARYING_VECTORS),
            O = y.getParameter(y.MAX_FRAGMENT_UNIFORM_VECTORS),
            j = C > 0,
            i = K || !!V.get("OES_texture_float"),
            s = (K || !!V.get("OES_element_index_uint")) && "undefined" != typeof Uint32Array,
            q = j && i,
            k = K ? y.getParameter(y.MAX_SAMPLES) : 0;
        return {
            getMaxAnisotropy: d,
            getMaxPrecision: r,
            precision: x,
            logarithmicDepthBuffer: c,
            maxTextures: F,
            maxVertexTextures: C,
            maxTextureSize: Y,
            maxCubemapSize: n,
            maxAttributes: I,
            maxVertexUniforms: e,
            maxVaryings: o,
            maxFragmentUniforms: O,
            vertexTextures: j,
            floatFragmentTextures: i,
            elementTypeUint: s,
            floatVertexTextures: q,
            maxSamples: k
        }
    }

    function i(J, U) {
        return J.z !== U.z ? J.z - U.z : J.id - U.id
    }

    function p(q, r) {
        return q.z !== r.z ? r.z - q.z : q.id - r.id
    }
    var Y = "ht";
    if (!x[Y]) {
        ! function () {
            Date.now && Date.prototype.getTime || (Date.now = function () {
                return (new Date).getTime()
            }), x.performance && x.performance.now || function () {
                var $ = Date.now();
                x.performance || (x.performance = {}), x.performance.now = function () {
                    return Date.now() - $
                }
            }();
            for (var Q = Date.now(), $ = 16, J = ["ms", "moz", "webkit", "o"], n = 0; n < J.length && !x.requestAnimationFrame; ++n) x.requestAnimationFrame = x[J[n] + "RequestAnimationFrame"], x.cancelAnimationFrame = x[J[n] + "CancelAnimationFrame"] || x[J[n] + "CancelRequestAnimationFrame"];
            x.requestAnimationFrame || (x.requestAnimationFrame = function (_) {
                var k = Date.now(),
                    d = $ + Q - k;
                return 0 > d && (d = 0), Q = k, x.setTimeout(function () {
                    Q = Date.now(), _(performance.now())
                }, d)
            }), x.cancelAnimationFrame || (x.cancelAnimationFrame = function (G) {
                return x.clearTimeout(G)
            }), o.assign === Z && (o.assign = function (P) {
                if (P === Z || null === P) throw new TypeError("Cannot convert undefined or null to object");
                for (var h = o(P), z = 1; z < arguments.length; z++) {
                    var f = arguments[z];
                    if (f !== Z && null !== f)
                        for (var s in f) o.prototype.hasOwnProperty.call(f, s) && (h[s] = f[s])
                }
                return h
            })
        }();
        var U = x.document,
            F = null,
            O = x[Y] = {},
            M = x[Y + "config"],
            u = O.Default = M && M.Default || {},
            z = O.Style = M && M.Style || {},
            I = O.Attr = M && M.Attr || {},
            C = function () {
                return !0
            },
            Q = function (R) {
                return R
            },
            j = function (_) {
                return !_
            },
            S = O.Color = M && M.Color || {},
            t = O.IsGetter = M && M.IsGetter || {};
        ! function () {
            var h = !1;
            try {
                var a = o.defineProperty({}, "passive", {
                    get: function () {
                        return h = !0, Z
                    }
                });
                x.addEventListener("test", a, a), x.removeEventListener("test", a, a)
            } catch (t) {
                h = !1
            }
            u.passiveSupported = h
        }();
        var e, G, H, g, f = u.passiveSupported,
            J = u.eventListenerOptionsFalse = f ? {
                passive: !1,
                capture: !1
            } : !1,
            r = u.eventListenerOptionsTrue = f ? {
                passive: !1,
                capture: !0
            } : !0,
            K = function (m, t, W, C) {
                m.addEventListener(t, W, C ? r : J)
            },
            b = function (l, s, x, H) {
                l.removeEventListener(s, x, H ? r : J)
            },
            h = Math,
            A = h.round,
            T = h.floor,
            s = h.ceil,
            w = h.sqrt,
            q = h.max,
            V = h.min,
            X = h.abs,
            k = h.cos,
            c = h.acos,
            n = h.sin,
            P = h.pow,
            a = h.asin,
            L = h.exp,
            W = h.PI,
            $ = 2 * W,
            N = W / 2,
            R = h.tan,
            D = h.atan2,
            m = h.random,
            v = h.log,
            _ = !1,
            Ad = !1,
            Zb = x.parseInt || global.parseInt,
            yh = "2021-6-15",
            Qe = x.navigator ? x.navigator.platform.indexOf("Win") > -1 : !1,
            ds = function (p) {
                return p * p
            },
            cd = x.setTimeout,
            nr = x.clearTimeout,
            ge = x.location,
            jb = x.navigator ? x.navigator.userAgent.toLowerCase() : "",
            Sq = function (W) {
                return W.test(jb)
            },
            $f = Sq(/msie/),
            Uq = Sq(/msie/) || Sq(/trident/),
            Xf = Sq(/msie 10/),
            Bj = Sq(/edge/),
            es = Sq(/firefox/),
            eg = Sq(/mac/),
            nf = u.isTouchable === Z ? Qe ? !1 : U ? "ontouchend" in U : !1 : u.isTouchable,
            lp = "default",
            vq = "single",
            tb = "multiple",
            wg = "front",
            Qq = "back",
            nq = "left",
            fm = "right",
            $c = "top",
            Kd = "bottom",
            sc = "center",
            to = "eye",
            Sg = "middle",
            Yn = "east",
            Wg = "west",
            Tb = "north",
            Jc = "none",
            oe = "px",
            Ki = "absolute",
            Xe = "border",
            _d = "triangle",
            Tq = "rect",
            Eq = "circle",
            xk = "cylinder",
            bl = "shape",
            Uj = "items",
            Fk = "normal",
            Ce = "remove",
            Tg = "clear",
            ul = "width",
            Hh = "height",
            Dm = "ingroup",
            tm = "check",
            He = "uncheck",
            Hp = "radio",
            kj = "radioOn",
            yb = "radioOff",
            _b = "points",
            kd = "values",
            Kh = "series",
            nh = "body",
            Bg = "label",
            Qk = "label2",
            Rm = "note",
            Vk = "note2",
            ub = "icons",
            Vm = "labelFont",
            fe = "labelColor",
            Uo = "labelSelectColor",
            ke = "note.expanded",
            Mh = "note2.expanded",
            kh = "edge.expanded",
            Ei = "edge.points",
            ej = "edge.type",
            ac = "rotation",
            fc = "hidden",
            Pd = "visible",
            ih = "tuv",
            Df = "no",
            Ph = "draw",
            nj = "select",
            Fi = "currentSubGraph",
            op = "selectBackground",
            Pi = "autoMakeVisible",
            Ji = "autoHideScrollBar",
            df = "scrollBarColor",
            gd = "scrollBarSize",
            Vb = "indent",
            Jj = "rowHeight",
            Gr = "columnLineColor",
            Ln = "rowLineColor",
            jh = "columnLineVisible",
            Yc = "rowLineVisible",
            dj = "visibleFunc",
            Zi = "expandIcon",
            xj = "collapseIcon",
            wi = "checkMode",
            go = "sortFunc",
            Me = "editable",
            Zh = "batchEditable",
            qh = "tristate",
            Sh = "asc",
            rj = "desc",
            pr = "position",
            zl = "__",
            pd = "elevation",
            Wf = "children",
            gq = "translateX",
            wb = "translateY",
            uk = "dataModel",
            Pq = "maxSize",
            xq = "enc",
            Cp = "state",
            Yk = xq + "o" + "de",
            Lm = "shape3d",
            cp = "shape3d.resolution",
            lm = "shape3d.visible",
            Rb = "shape3d.from.visible",
            xh = "shape3d.to.visible",
            Je = "shape3d.top.visible",
            Ho = "shape3d.bottom.visible",
            Sn = "repeat.uv.length",
            No = "serializeValue",
            Ij = "deserializeValue",
            Mg = "centerUniform",
            gs = "uniform",
            nb = "rgba(255,255,255,0)",
            om = "style",
            dr = "attr",
            Kb = "field",
            Gl = "string",
            hm = "boolean",
            dg = "color",
            fj = "int",
            Mo = "number",
            Nc = "ew-resize",
            zi = "ns-resize",
            Zk = "pointer",
            iq = "auto",
            fp = "mousedown",
            rp = "mousemove",
            cj = "mouseup",
            Si = "mouseout",
            Xd = "touchstart",
            wj = "touchmove",
            Sj = "touchend",
            Ze = "keydown",
            gn = "keyup",
            kg = ["DOMMouseScroll", "mousewheel"],
            ad = es ? kg[0] : kg[1],
            Xl = zl + Y + zl + Yk,
            Vr = [Xd, wj, Sj],
            vs = [fp, rp, cj, Si, ad, "wheel", "mouseenter", "mouseleave", "mouseover"],
            kr = [Ze, gn, "keypress", "input", "contextmenu", "compositionstart", "compositionupdate", "compositionend"],
            Ec = nf ? Vr.concat(kr) : vs.concat(kr),
            Xm = F,
            xn = F,
            sq = F,
            Ob = cj.length,
            Yp = function () {
                sq && (nr(sq.timeout), sq = F)
            },
            Xk = function () {
                sq && me(sq.e, sq.info)
            };
        x.addEventListener && (nf || (K(x, Si, function () {
            Yp()
        }), K(x, ad, function () {
            Um()
        })), K(x, gn, function (y) {
            91 === y.keyCode ? pl = {} : delete pl[y.keyCode]
        }, !0), K(x, Ze, function (b) {
            pl[b.keyCode] = !0
        }, !0), K(x, "blur", function () {
            pl = {}
        }));
        var ug, yo, Qg, aj = 0,
            nn = F,
            Jl = function (Z, A) {
                var T = cd(function () {
                    delete nn[T], wd(nn) && (nn = F), Z()
                }, A);
                return T
            },
            Gk = F,
            vi = F,
            Zl = {},
            Oe = {},
            ef = {},
            Zm = {},
            Mq = {},
            pl = {},
            Xh = {},
            $d = {},
            Al = {},
            Dc = {},
            Bm = /.json$/,
            Gq = /\.(json|bin)$/,
            Ok = /^data:image\/svg\+xml/,
            $i = {},
            Pc = [],
            Xn = {},
            zs = F,
            rq = F,
            Mr = function () { },
            jm = function () {
                throw "Oops!"
            },
            bg = [0, 0, 0],
            nl = {
                x: 0,
                y: 0,
                width: 0,
                height: 0
            },
            de = F,
            rm = F,
            Wc = F,
            vl = function (Z, y) {
                Oe[Z] = y, y && y.comps && !y.uuid && (y.uuid = O.Math.generateUUID()), wk[Z] && (y.cacheRule = wk[Z], delete wk[Z])
            },
            Dd = function (V) {
                rm && !V._72O && (Wc || (Wc = {}), Wc[V._72O = xp()] = V), ug != F ? Gg() < .05 && g && !yo && (tf = Yp) : tf = El
            },
            sd = function (P, X, v, z) {
                rm || (rm = {});
                var Q = rm[P];
                if (Q) {
                    if (Q.url === X) return;
                    Q.image ? (Q.image.onload = Mr, Q.image.onerror = Mr) : Q.request && (Q.request.onload = Mr, Q.request.onerror = Mr)
                }
                if (Bm.test(X)) {
                    var m = new De;
                    if (rm[P] = {
                        request: m,
                        url: X
                    }, X = u.beforeLoadURL(X, P), X.data) {
                        var _ = u.parse(X.data);
                        Sm(P, _), u.handleImageLoaded(P, _)
                    } else {
                        m.onload = function () {
                            if (200 === this.status || 0 === this.status) {
                                var p = u.parse(m.getResponseText());
                                Sm(P, p), u.handleImageLoaded(P, p)
                            } else Sm(P, u.handleUnfoundImage(P, X) || F)
                        }, m.onerror = function () {
                            Sm(P, u.handleUnfoundImage(P, X) || F)
                        };
                        var x = {};
                        x.url = encodeURI(X), x.sync = !1, m.send(x)
                    }
                } else {
                    var _ = new Image;
                    rm[P] = {
                        image: _,
                        url: X
                    }, /^data:image/.test(X) || (X = u.beforeLoadURL(X, P), X = u.appendTimeStamp(X), X = encodeURI(X), _.crossOrigin = u.crossOrigin), u.convertImageSrc(X, function (f) {
                        Uq && (X.toLowerCase().indexOf(".svg") > 0 || Ok.test(X)) ? (U.body.appendChild(_), _.style.visibility = "hidden", _.onload = function () {
                            cd(function () {
                                if (v && (_.width = v), z && (_.height = z), !_.width || !_.height) {
                                    var H = _.width || _.clientWidth,
                                        B = _.height || _.clientHeight;
                                    _.width = H, _.height = B
                                }
                                u.handleImageLoaded(P, _), Sm(P, _), U.body.removeChild(_), _.style.visibility = ""
                            }, 180)
                        }, _.onerror = function () {
                            Sm(P, u.handleUnfoundImage(P, X) || F), U.body.removeChild(_), _.style.visibility = ""
                        }) : (_.onload = function () {
                            v && (_.width = v), z && (_.height = z), u.handleImageLoaded(P, _), Sm(P, _)
                        }, _.onerror = function () {
                            Sm(P, u.handleUnfoundImage(P, X) || F)
                        }), _.src = f
                    })
                }
            },
            Sm = function (S, B) {
                if (vl(S, B), delete rm[S], wd(rm) && (rm = F, Wc)) {
                    for (var z in Wc) {
                        var A = Wc[z];
                        A._2O && A._2O[S] && (A.deleteTexture(S), delete A._2O[S]), A.invalidateAll && A.invalidateAll(Z, "imageLoaded", S), A.redraw && A.redraw(), A.iv(), delete A._72O
                    }
                    Wc = F
                }
                if (B && Wc)
                    for (var z in Wc) {
                        var A = Wc[z];
                        A.invalidateAll && A.invalidateAll(Z, "imageLoading", S), A.redraw && A.redraw(), A.iv()
                    }
            },
            mm = function () {
                return v = h && Date,
                    function () {
                        return x.performance && x.performance.now ? x.performance.now() : Date.now()
                    }
            }(),
            ee = function (u, g, v) {
                return {
                    width: u,
                    height: g,
                    comps: ip(v) ? v : [v]
                }
            },
            eq = function (S, X) {
                return {
                    type: Eq,
                    rect: [S, X, 1.6, 1.6],
                    borderWidth: 1,
                    borderColor: Ur,
                    gradient: Nf,
                    gradientColor: Cn,
                    background: Ur
                }
            },
            lj = function (H, J) {
                return ee(16, 16, {
                    type: _d,
                    rect: [4, 4, 10, 8],
                    background: H,
                    rotation: J ? 1.57 : 3.14
                })
            },
            mf = function (O, h) {
                return ee(16, 16, {
                    type: _d,
                    rect: [4, 4, 8, 7],
                    background: O,
                    rotation: h ? 3.14 : 0
                })
            },
            Oj = function (g) {
                var O = g._orientation;
                return "horizontal" === O || "h" === O
            },
            $o = function (B, l) {
                var E = F || 4,
                    h = F || 1,
                    v = F || 1;
                0 > E ? E = 0 : E > .25 && (E = .25);
                var o, D, p, g, s, y, S, M = .5,
                    q = [],
                    T = [],
                    Q = [],
                    b = $ / v,
                    m = $ / h,
                    a = M - E;
                for (D = 0; h >= D; D++)
                    for (g = -W + D * m, y = k(g), s = n(g), o = 0; v >= o; o++) p = o * b, S = a + E * y, q.push(k(p) * S, s * E, -n(p) * S), (G = [B, l]) && T.push(o / v, 1 - D / h);
                for (D = 0; h > D; D++) {
                    var i = D * (v + 1),
                        O = (D + 1) * (v + 1);
                    for (o = 0; v > o; o++) Q.push(i + o, O + o + 1, O + o, i + o, i + o + 1, O + o + 1), qg.z = ok.z = [B, l]
                }
            },
            lh = function ($) {
                var i = 2,
                    E = 0;
                for (var s in $) s.length === i && Zb(s, 32) === $r && (zs = rq = $[s]), E++;
                return E
            },
            Cc = function (Z, l, d, G) {
                return d || (d = nf ? 5 : 3, d /= G || 1), {
                    x: Z - d,
                    y: l - d,
                    width: 2 * d,
                    height: 2 * d
                }
            },
            Ub = function (_, e, A, d) {
                var y = this;
                e || (e = nf ? 5 : 3, A = 20, d = 20);
                var p = {
                    x: _,
                    y: e,
                    width: A,
                    height: d
                };
                if (A)
                    for (var N = 0; A > N; N++)
                        if (3 === A) d = 20;
                        else
                            for (var j = 0; d > j; j++) y = x ? x : A;
                var q = {
                    x: W,
                    y: 2 * W
                };
                if (cf(p, q)) {
                    var T = Hh[0] + $c[0] + Tg[1] + Sh.length,
                        g = fc[0] + qh[0] + Tg[1] + nh.length;
                    Xb[to] = [y[T], y[g]], y[T] = tg[to], y[g] = tg[Lm]
                }
            },
            kp = function (w) {
                return (/ble$/.test(w) || /ed$/.test(w) || t[w] ? "is" : "get") + w.charAt(0).toUpperCase() + w.slice(1)
            },
            tg = function (p) {
                return "set" + p.charAt(0).toUpperCase() + p.slice(1)
            },
            dk = function (M) {
                return typeof M === Gl || M instanceof String
            },
            Bp = function (c) {
                return typeof c === Mo
            },
            El = function (_) {
                return typeof _ === hm
            },
            xl = function (q) {
                return q && "object" == typeof q
            },
            Mf = function (J) {
                return "function" == typeof J
            },
            ip = function (l) {
                return l instanceof Array
            },
            Xo = function (E) {
                return E instanceof xr
            },
            mh = function (y) {
                return ip(y) ? new xr(y) : y
            },
            Fq = function (U) {
                return U instanceof Dp
            },
            Bk = function (N) {
                return N instanceof Xg
            },
            yl = function (K) {
                return K instanceof Lc
            },
            Th = function (m, I) {
                if (!(m instanceof O.Group)) return !1;
                if (!I) return m.isExpanded();
                var $ = I.getDataUI(m);
                return $ && $._88I ? !0 : !1
            },
            Qb = function (m) {
                return m instanceof Br
            },
            Db = function (B) {
                return B && "IFRAME" === B.tagName
            },
            Oo = function (d) {
                return d == F || u.numberDigits == F ? d : parseFloat(d.toFixed(u.numberDigits))
            },
            gc = function (s, $, i) {
                var E, L = $.length;
                if (i)
                    for (var z = 0; i > z; z++)
                        if (3 === L) s.push($[0]), s.push($[1]), s.push($[2]);
                        else
                            for (E = 0; L > E; E++) s.push($[E]);
                else if (3 === L) s.push($[0]), s.push($[1]), s.push($[2]);
                else
                    for (E = 0; L > E; E++) s.push($[E])
            },
            Il = function (p) {
                return p ? xl(p) ? p : {} : !1
            },
            Uh = function (L, O, J) {
                var j, b = xl(L) ? L : L.prototype;
                for (j in O) J && j in b ? b[j] === Z && console.warn("class", b, "has own undefined property", j, ", keep exist!") : b[j] = O[j];
                return L
            },
            sg = function (Y, L) {
                if (!("wheelDelta" in L)) {
                    var A = L.deltaMode;
                    L.wheelDelta = A === L.DOM_DELTA_PIXEL ? -L.deltaY : A === L.DOM_DELTA_LINE ? 40 * -L.deltaY : 120 * -L.deltaY
                }
                Y.handle_mousewheel(L)
            },
            Hc = function (B) {
                return String.fromCharCode(B)
            },
            fo = function (N) {
                for (var s, f = 0, i = ""; f < N.length; f++) s = N[N.length - 1 - f], "%" === s ? s = "'" : "a" === s ? s = '"' : "]" === s && (s = "\\"), i += Hc(s.charCodeAt(0) - 1);
                return i
            },
            fi = function (G, e, E) {
                G.superClass.constructor.apply(e, E)
            },
            wd = function (n) {
                for (var g in n) return !1;
                return !0
            },
            Ro = function (g) {
                return g ? 0 === g.length : !0
            },
            jg = function () {
                var w = "";
                return [He[0], Ln[0], Bg[0]].forEach(function (O) {
                    w += tg(O).slice(3)
                }), gs = U && U[w] || Mg,
                    function (z, V) {
                        return z === V ? !0 : z.x === V.x && z.y === V.y && z.width === V.width && z.height === V.height
                    }
            }(),
            re = function (Q, Z, R) {
                return Z > Q ? Z : Q > R ? R : Q
            },
            he = function (e) {
                return 0 > e ? -1 : e > 0 ? 1 : 0
            },
            Gg = function () {
                var z = 1e4 * n(Ob++);
                return z - T(z)
            },
            Rl = function (L, K, J) {
                return ti(L.x, L.y, K.x, K.y, J.x, J.y, J.x + J.width, J.y, !0) || ti(L.x, L.y, K.x, K.y, J.x + J.width, J.y, J.x + J.width, J.y + J.height, !0) || ti(L.x, L.y, K.x, K.y, J.x + J.width, J.y + J.height, J.x, J.y + J.height, !0) || ti(L.x, L.y, K.x, K.y, J.x, J.y + J.height, J.x, J.y, !0)
            },
            ti = function (D, w, R, T, d, C, u, b, r) {
                var B = (u - d) * (w - C) - (b - C) * (D - d),
                    l = (b - C) * (R - D) - (u - d) * (T - w);
                if (0 !== l) {
                    var O = B / l,
                        e = D + O * (R - D),
                        o = w + O * (T - w);
                    return r && (e + Wp < V(D, R) || e - Wp > q(D, R) || e + Wp < V(d, u) || e - Wp > q(d, u) || o + Wp < V(w, T) || o - Wp > q(w, T) || o + Wp < V(C, b) || o - Wp > q(C, b)) ? F : [e, o]
                }
                return F
            },
            jq = function (U, Q, _) {
                if (U && _)
                    if (Q) {
                        if (Q === om) return U.getStyle(_);
                        if (Q === dr) return U.getAttr(_);
                        if (Q === Kb) return U[_]
                    } else if (_ = kp(_), U[_]) return U[_]();
                return Z
            },
            Di = function (c, W, b, h) {
                if (c && b)
                    if (W) {
                        if (W === om) c.s(b, h);
                        else if (W === dr) c.a(b, h);
                        else if (W === Kb) {
                            var w = c[b];
                            c[b] = h, c.fp("f:" + b, w, h)
                        }
                    } else b = tg(b), c[b] && c[b](h)
            },
            Wh = function (L, W, X) {
                return W && "top" !== W ? "bottom" === W ? {
                    x: L.x,
                    y: L.y,
                    width: L.width,
                    height: L.height * X
                } : "right" === W ? {
                    x: L.x,
                    y: L.y,
                    width: L.width * X,
                    height: L.height
                } : "left" === W ? {
                    x: L.x + L.width * (1 - X),
                    y: L.y,
                    width: L.width * X,
                    height: L.height
                } : void 0 : {
                        x: L.x,
                        y: L.y + L.height * (1 - X),
                        width: L.width,
                        height: L.height * X
                    }
            },
            cs = function (z, f, b, Q, N) {
                f && fl(z, b, Q, 1, N, f)
            },
            Id = function (w, R, p, n) {
                var E = 1 - w;
                return E * E * R + 2 * w * E * p + w * w * n
            },
            qg = function (C, I, s, m, O) {
                var i = 1 - C;
                return i * i * i * I + 3 * i * i * C * s + 3 * i * C * C * m + C * C * C * O
            },
            tj = function (h) {
                var l, G, t, g, x = 0;
                return h.forEach(function (s) {
                    if (l = s.length, l > 0)
                        for (G = s[0], g = 1; l > g; g++) t = s[g], x += En(G, t), G = t
                }), x
            },
            ic = function (D, L, q) {
                var j = "__" + D,
                    l = function (i) {
                        ("mousedown" === D || "mouseup" === D || "touchstart" === D || "touchend" === D) && wm(i), q.disabled || q["handle_" + D](i)
                    };
                q[j] || (q[j] = l, K(L, D, l))
            },
            ws = function (D, E, B) {
                var N = "__" + D,
                    W = B[N];
                W && (b(E, D, W), delete B[N])
            },
            em = function (P, V) {
                var e = "_" + V;
                P[kp(V)] = function () {
                    return this[e]
                }, P[tg(V)] = function (q) {
                    var n = this[e];
                    this[e] = q, this.fp(V, n, q)
                }
            },
            Ci = function (C) {
                return o.create(C)
            },
            bh = function ($) {
                if (!$.element) {
                    var W, s;
                    (W = $.textField) ? s = Wn(Vs.TextField, W) : (W = $.textArea) ? s = Wn(Vs.TextArea, W) : (W = $.button) ? s = Wn(Vs.Button, W) : (W = $.comboBox) ? s = Wn(Vs.ComboBox, W) : (W = $.checkBox) ? s = Wn(Vs.CheckBox, W) : (W = $.radioButton) ? s = Wn(Vs.RadioButton, W) : (W = $.slider) ? s = Wn(Vs.Slider, W) : (W = $.colorPicker) ? s = Wn(Vs.ColorPicker, W) : (W = $.image) && (s = Wn(Vs.Image, W)), s && ($.element = s)
                }
            },
            ve = function (J, c) {
                var P = dd(J);
                return P._ht = c, P
            },
            Iq = x.top === x ? x.top : x || x.document,
            dd = function (p, C) {
                var i = U.createElement("div"),
                    L = i.style;
                return i.tabIndex = -1, i.onkeydown = Qc, L.msTouchAction = Jc, Yq(i, F, 0), nf && L.setProperty("-webkit-tap-highlight-color", "rgba(0, 0, 0, 0)", F), p && (L.overflow = fc), C && sn(C, i), i
            },
            uo = function (W, M) {
                var h = U.createElement("canvas"),
                    v = h.style;
                return v.msTouchAction = Jc, M || (v.pointerEvents = Jc), Yq(h, F, 0), W && sn(W, h), h
            },
            Yq = function (A, x, r) {
                var u = A.style;
                u.border = x ? x + " solid 1px" : 0, u.outline = 0, u.padding = r ? "0 " + r + oe : 0, uj(A)
            },
            uj = function (B) {
                var I = B.style;
                I.position = Ki, I.margin = 0, I.setProperty("box-sizing", "border-box", F), I.setProperty("-moz-box-sizing", "border-box", F)
            },
            Bn = function (I, w, u, X) {
                X || (X = ij), w != F && (I.width = w * X, I.style.width = w + oe), u != F && (I.height = u * X, I.style.height = u + oe)
            },
            sn = function (D, t, m) {
                D.appendChild(t), m && (t.style.position = Ki)
            },
            qr = function (P, S) {
                S.split || (S += "");
                for (var m, z = S.split("\n"), T = 0, K = z.length, e = 0; K > e; e++) {
                    var w = ln(P.font, z[e]);
                    w.width > T && (T = w.width), m || (m = w.height)
                }
                return P.ss = z, {
                    width: T,
                    height: m * K
                }
            },
            Om = function (w, G, t, V, Z, j) {
                var J = G.length;
                if (1 === J) Lp(w, G[0], t, V, Z);
                else
                    for (var k = t.height / J, H = {
                        x: t.x,
                        y: t.y,
                        width: t.width,
                        height: k
                    }, m = 0; m < G.length; m++) j ? nd(w, G[m], V, Z, H.x, H.y, H.width, H.height, j) : Lp(w, G[m], H, V, Z), H.y += k
            },
            Lp = function (c, V, W, D, G) {
                c.font = D ? D : Fh, c.fillStyle = G ? G : Dh, c.textAlign = sc, c.textBaseline = Sg;
                var j, M;
                W ? W.width === Z ? (j = W.x, M = W.y) : (j = W.x + W.width / 2, M = W.y + W.height / 2) : (j = 0, M = 0), c.fillText(V, A(j), A(M))
            },
            oh = function (h) {
                h.getView && (h = h.getView());
                var W = h.offsetWidth || h.scrollWidth;
                return !W && h.style.width && (W = Zb(h.style.width)), W
            },
            zp = function (f) {
                f.getView && (f = f.getView());
                var r = f.offsetHeight || f.scrollHeight;
                return !r && f.style.height && (r = Zb(f.style.height)), r
            },
            Jg = function (F, k, X) {
                var B = k[0].toUpperCase() + k.substring(1, k.length);
                F["webkit" + B] = X, F["moz" + B] = X, F["ms" + B] = X, F["o" + B] = X, F[k] = X
            },
            lo = function () {
                var Z = function (j) {
                    Qc(j), j.stopPropagation()
                },
                    o = function (u) {
                        Qc(u)
                    },
                    h = [Xd, Ze, fp];
                return function (c, H) {
                    var P = dd(),
                        J = P.style;
                    return J.backgroundColor = u.disabledBackground, c && (J.backgroundImage = "url(" + c + ")", J.backgroundPosition = "50% 50%", J.backgroundRepeat = "no-repeat no-repeat"), H === !1 ? h.forEach(function (x) {
                        K(P, x, o)
                    }) : h.forEach(function (R) {
                        K(P, R, Z)
                    }), P
                }
            }(),
            Wd = function (C) {
                var F = C.getContext("2d");
                return F.save(), F.lineCap = ob, F.lineJoin = Wl, F
            },
            tf = function (I, s, m, P) {
                wh(I, s * ij, m * ij), P *= ij, 1 !== P && I.scale(P, P)
            },
            wh = function (s, n, N) {
                s.translate(n, N)
            },
            jc = function (z, k) {
                k && z.rotate(k)
            },
            ec = function (v, i, m) {
                i === Z && (i = 1), m === Z && (m = 1), (1 !== i || 1 !== m) && v.scale(i, m)
            },
            lg = !1,
            L = Iq[tm[1] + gq[0]],
            hr = function (i) {
                var n = U.activeElement;
                if (U.activeElement !== i) {
                    n && n.forceOnblur && n.forceOnblur();
                    for (var C = [], c = i.parentNode; c;) C.push([c, c.scrollLeft, c.scrollTop]), c = c.parentNode;
                    if (!lg) {
                        var V = [],
                            J = [];
                        try {
                            for (var $ = x.parent, H = x; $ !== H;) V.push([$, $.scrollX, $.scrollY]), H = $, $ = x.parent;
                            var N = x.frameElement;
                            if (N)
                                for (var X = N.parentNode; X;) J.push([X, X.scrollLeft, X.scrollTop]), X = X.parentNode
                        } catch (d) {
                            lg = !0
                        }
                    }
                    if (nf) i.focus();
                    else {
                        var a = hq(),
                            k = a.target;
                        i.focus(), k.scrollLeft = a.left, k.scrollTop = a.top
                    }
                    C.forEach(function (I) {
                        I[0].scrollLeft = I[1], I[0].scrollTop = I[2]
                    }), lg || (V.forEach(function (g) {
                        g[0].scrollTo(g[1], g[2])
                    }), J.forEach(function (a) {
                        a[0].scrollLeft = a[1], a[0].scrollTop = a[2]
                    }))
                }
            },
            Bq = function (r) {
                return r && r.getView ? r.getView() : r
            },
            qp = function (R, A, i, d, P) {
                if (2 === arguments.length && (i = A.y, d = A.width, P = A.height, A = A.x), R.isSelfViewEvent) R.setX(A), R.setY(i), R.setWidth(d), R.setHeight(P);
                else {
                    var W = Bq(R),
                        p = W.style;
                    if ((U.fullscreenElement || U.mozFullScreenElement || U.webkitFullscreenElement || U.msFullscreenElement) !== W) A !== Z && (p.left = A + oe), i !== Z && (p.top = i + oe), d !== Z && (p.width = d + oe), P !== Z && (p.height = P + oe);
                    else {
                        var e = u.getWindowInfo();
                        p.left = (A = e.left) + oe, p.top = (i = e.top) + oe, p.width = (d = e.width) + oe, p.height = (P = e.height) + oe
                    }
                    R.endEditing && !nf && R.endEditing(), R.redraw && R.redraw(), R.invalidate && R.invalidate(), R.onLayouted && R.onLayouted(A, i, d, P), R.fireViewEvent && R.fireViewEvent("layout")
                }
            },
            Xj = function (D) {
                if (!D.touches) return D;
                var g = D.touches[0];
                return g ? g : D.changedTouches[0]
            },
            gr = function (V) {
                return li(V) ? Xj(V).target : V.target
            },
            li = function (d) {
                return d && "object" == typeof d && "touches" in d
            },
            ek = function (n) {
                u.popup && u.popup.close(), u.popup = n
            },
            si = F,
            Ed = function ($) {
                si.handleWindowTouchMove($)
            },
            Zr = function ($) {
                si.handleWindowTouchEnd($), b(x, wj, Ed), b(x, Sj, Zr), si = F
            },
            Kn = function (z) {
                si.handleWindowMouseMove(z)
            },
            tc = function (Z) {
                si.handleWindowMouseUp(Z), b(x, rp, Kn), b(x, cj, tc), si = F
            },
            Bf = function (r) {
                return 1 === Qj(r)
            },
            sh = function (F, h) {
                return h ? h.keyCode === F : pl[F]
            },
            Dq = function (N) {
                return ik(N) && sh(65, N)
            },
            qq = function (L) {
                return sh(46, L) || sh(8, L)
            },
            jl = function (g) {
                return function (M) {
                    return M ? M.keyCode === g : pl[g]
                }
            },
            $r = 573,
            Fe = [65, 83, 68, 87, 37, 38, 39, 40, 32, 13, 27],
            sb = jl(Fe[0]),
            Ib = jl(Fe[1]),
            Fr = jl(Fe[2]),
            $j = jl(Fe[3]),
            Wk = jl(Fe[4]),
            Nk = jl(Fe[5]),
            _i = jl(Fe[6]),
            ri = jl(Fe[7]),
            Cf = jl(Fe[8]),
            hd = jl(Fe[9]),
            bj = jl(Fe[10]),
            Gj = {
                65: 1,
                83: 1,
                68: 1,
                87: 1,
                37: 1,
                38: 1,
                39: 1,
                40: 1
            },
            Cg = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 5, 5, 5, 5, 5, 7, 4027],
            abd ="20t24bt02b28 12c12c11",
            xm = F,
            Fb = F,
            Cr = function (B, M) {
                xm || (xm = uo()), Bn(xm, B, M, 1);
                var Q = Wd(xm);
                return Q.clearRect(0, 0, B, M), Q
            },
            nm = function (F, I, q) {
                if (I && F) {
                    if ("override" === q) return I;
                    if ("override_rgb" === q) {
                        var z = ns(I);
                        return F = zd(F), "rgba(" + A(255 * z[0]) + "," + A(255 * z[1]) + "," + A(255 * z[2]) + "," + F[3] / 255 + ")"
                    }
                    if ("override_a" === q) {
                        var z = ns(I);
                        return F = zd(F), "rgba(" + F[0] + "," + F[1] + "," + F[2] + "," + z[3] + ")"
                    }
                    if ("multiply_destinationAtop" === q) {
                        var d = Pm(ns(F)),
                            C = d[3],
                            h = Pm(ns(I)),
                            m = h[3],
                            w = Pm(d),
                            N = w[3],
                            x = d.map(function (R, S) {
                                return R * h[S]
                            }),
                            E = 1 - C,
                            s = 1 - m,
                            H = s * C + m;
                        return d = d.map(function (i, j) {
                            return (m * E * h[j] + m * C * x[j] + s * C * i) / H
                        }), C = H, E = 1 - C, d = d.map(function (v, b) {
                            return (N * w[b] * E + C * v * N) / N
                        }), C = N, "rgba(" + A(255 * d[0]) + "," + A(255 * d[1]) + "," + A(255 * d[2]) + "," + C + ")"
                    }
                    var z = ns(I);
                    return F = zd(F), "rgba(" + A(F[0] * z[0]) + "," + A(F[1] * z[1]) + "," + A(F[2] * z[2]) + "," + F[3] / 255 * z[3] + ")"
                }
                return F
            },
            zd = function () {
                var m, k = {};
                for (var u in x) {
                    var T = tb.length;
                    if (u.length == T && u[0] === tb[2] && u[1] === Jc[1] && u[4] === tb[3] && u[5] === tb[4] && u.substr(T - 2) === Jc[1] + Jc[2]) {
                        var Z = x[u];
                        for (var d in Z) d.length === T && d.substr(0, 3) === fm[3] + Ce[3] + nj[0] && d.substr(T - 2) === tb[0] + Rm[3] && (kg = Z[d])
                    }
                }
                return function (_) {
                    var O, X = k[_];
                    return X || (m || (m = uo(), Bn(m, 1, 1, 1)), O = m.getContext("2d"), O.clearRect(0, 0, 1, 1), fl(O, 0, 0, 1, 1, _), X = O.getImageData(0, 0, 1, 1).data, X = k[_] = [X[0], X[1], X[2], X[3]]), X
                }
            }(),
            ns = function (U) {
                if (!dk(U)) return U;
                var E = zd(U);
                return E.CA || (E.CA = [E[0] / 255, E[1] / 255, E[2] / 255, E[3] / 255]), E.CA
            },
            oi = function (X, i, h, Z, O) {
                var b = uo();
                b.width = h, b.height = Z;
                var V = b.getContext("2d");
                V.drawImage(X, 0, 0, h, Z);
                try {
                    for (var l = V.getImageData(0, 0, h, Z), B = l.data, H = 0, q = B.length; q > H; H += 4) {
                        var U = B[H + 0],
                            g = B[H + 1],
                            t = B[H + 2],
                            W = B[H + 3];
                        "override_a" === O ? B[H + 3] = 255 * i[3] : "override_rgb" === O ? (B[H + 0] = 255 * i[0], B[H + 1] = 255 * i[1], B[H + 2] = 255 * i[2]) : "override" === O ? (B[H + 0] = 255 * i[0], B[H + 1] = 255 * i[1], B[H + 2] = 255 * i[2], B[H + 3] = 255 * i[3]) : (B[H + 0] = i[0] * U, B[H + 1] = i[1] * g, B[H + 2] = i[2] * t, B[H + 3] = i[3] * W)
                    }
                    V.putImageData(l, 0, 0)
                } catch (M) {
                    return X
                }
                return b
            },
            Xb = function (_, k, K) {
                return k && (k = "miter" === K ? 8 * k + 20 : k + 1, _ && vn(_, k)), k
            },
            Rj = function (e, U) {
                if (U) {
                    var h = new In(U),
                        s = e.width / 2,
                        g = e.height / 2,
                        H = ms([h.tf(-s, -g), h.tf(s, -g), h.tf(s, g), h.tf(-s, g)]);
                    return H.x += e.x + s, H.y += e.y + g, H
                }
                return e
            },
            dc = function (K, O, X, t, Q, g, y, j) {
                t *= Math.PI / 180;
                var G = {
                    x: Math.cos(t) * (K.x - y.x) / 2 + Math.sin(t) * (K.y - y.y) / 2,
                    y: -Math.sin(t) * (K.x - y.x) / 2 + Math.cos(t) * (K.y - y.y) / 2
                },
                    H = Math.pow(G.x, 2) / Math.pow(O, 2) + Math.pow(G.y, 2) / Math.pow(X, 2);
                H > 1 && (O *= Math.sqrt(H), X *= Math.sqrt(H));
                var b = (Q == g ? -1 : 1) * Math.sqrt((Math.pow(O, 2) * Math.pow(X, 2) - Math.pow(O, 2) * Math.pow(G.y, 2) - Math.pow(X, 2) * Math.pow(G.x, 2)) / (Math.pow(O, 2) * Math.pow(G.y, 2) + Math.pow(X, 2) * Math.pow(G.x, 2)));
                isNaN(b) && (b = 0);
                var e = {
                    x: b * O * G.y / X,
                    y: b * -X * G.x / O
                },
                    d = {
                        x: (K.x + y.x) / 2 + Math.cos(t) * e.x - Math.sin(t) * e.y,
                        y: (K.y + y.y) / 2 + Math.sin(t) * e.x + Math.cos(t) * e.y
                    },
                    C = function (K) {
                        return Math.sqrt(Math.pow(K[0], 2) + Math.pow(K[1], 2))
                    },
                    $ = function (B, J) {
                        return (B[0] * J[0] + B[1] * J[1]) / (C(B) * C(J))
                    },
                    u = function (J, _) {
                        return (J[0] * _[1] < J[1] * _[0] ? -1 : 1) * Math.acos($(J, _))
                    },
                    w = u([1, 0], [(G.x - e.x) / O, (G.y - e.y) / X]),
                    r = [(G.x - e.x) / O, (G.y - e.y) / X],
                    T = [(-G.x - e.x) / O, (-G.y - e.y) / X],
                    n = u(r, T);
                $(r, T) <= -1 && (n = Math.PI), $(r, T) >= 1 && (n = 0);
                var $ = O > X ? O : X,
                    E = O > X ? 1 : O / X,
                    N = O > X ? X / O : 1;
                if (null == j) {
                    var l = {
                        x: 0,
                        y: 0,
                        width: 0,
                        height: 0
                    };
                    vn(l, $), l.x *= E, l.width *= E, l.y *= N, l.height *= N;
                    var f = new In(t);
                    return l = ms([f.tf(l.x, l.y), f.tf(l.x + l.width, l.y), f.tf(l.x + l.width, l.y + l.height), f.tf(l.x, l.y + l.height)]), l.x += d.x, l.y += d.y, [{
                        x: l.x,
                        y: l.y
                    }, {
                        x: l.x + l.width,
                        y: l.y
                    }, {
                        x: l.x + l.width,
                        y: l.y + l.height
                    }, {
                        x: l.x,
                        y: l.y + l.height
                    }]
                }
                j.translate(d.x, d.y), j.rotate(t), j.scale(E, N), j.arc(0, 0, $, w, w + n, 1 - g), j.scale(1 / E, 1 / N), j.rotate(-t), j.translate(-d.x, -d.y)
            },
            jp = function (q, I) {
                q && q.beginPath();
                for (var N, p, z, v = [], V = function (k) {
                    for (var m, b = /(\-{0,1}[\d\.]+)/gi, c = []; m = b.exec(k);) c.push(parseFloat(m[0]));
                    return c
                }, u = /([MmLlHhVvCcSsQqTtAa]{1}[\d\.,\s\-Zz]*)/gi, g = {
                    x: 0,
                    y: 0
                }; N = u.exec(I);) {
                    var S = N[0],
                        J = S.substr(0, 1);
                    if ("M" === J || "m" === J) {
                        for (var R = V(S), L = 0; L < R.length; L += 2) {
                            var b = R[L],
                                W = R[L + 1];
                            "m" === J && (b += g.x, W += g.y), q && q.moveTo(b, W), v.push({
                                x: b,
                                y: W
                            }), g.x = b, g.y = W
                        }
                        p = z = null
                    } else if ("H" === J || "h" === J) {
                        for (var R = V(S), L = 0; L < R.length; L += 1) {
                            var b = R[L];
                            "h" === J && (b += g.x), q && q.lineTo(b, g.y), v.push({
                                x: b,
                                y: g.y
                            }), g.x = b
                        }
                        p = z = null
                    } else if ("C" === J || "c" === J) {
                        for (var R = V(S), L = 0; L < R.length; L += 6) {
                            var B = R[L],
                                c = R[L + 1],
                                T = R[L + 2],
                                D = R[L + 3],
                                b = R[L + 4],
                                W = R[L + 5];
                            "c" === J && (B += g.x, c += g.y, T += g.x, D += g.y, b += g.x, W += g.y), q && q.bezierCurveTo(B, c, T, D, b, W), v.push({
                                x: B,
                                y: c
                            }), v.push({
                                x: T,
                                y: D
                            }), v.push({
                                x: b,
                                y: W
                            }), g.x = b, g.y = W
                        }
                        p = [B, c, T, D, b, W], z = null
                    } else if ("S" === J || "s" === J) {
                        for (var R = V(S), L = 0; L < R.length; L += 4) {
                            var B, c;
                            p ? (B = 2 * p[4] - p[2], c = 2 * p[5] - p[3]) : (B = g.x, c = g.y);
                            var T = R[L],
                                D = R[L + 1],
                                b = R[L + 2],
                                W = R[L + 3];
                            "s" === J && (T += g.x, D += g.y, b += g.x, W += g.y), q && q.bezierCurveTo(B, c, T, D, b, W), v.push({
                                x: B,
                                y: c
                            }), v.push({
                                x: T,
                                y: D
                            }), v.push({
                                x: b,
                                y: W
                            }), g.x = b, g.y = W
                        }
                        p = [B, c, T, D, b, W], z = null
                    } else if ("Q" === J || "q" === J) {
                        for (var R = V(S), L = 0; L < R.length; L += 4) {
                            var B = R[L],
                                c = R[L + 1],
                                b = R[L + 2],
                                W = R[L + 3];
                            "q" === J && (B += g.x, c += g.y, b += g.x, W += g.y), q && q.quadraticCurveTo(B, c, b, W), v.push({
                                x: B,
                                y: c
                            }), v.push({
                                x: b,
                                y: W
                            }), g.x = b, g.y = W
                        }
                        p = null, z = [B, c, b, W]
                    } else if ("T" === J || "t" === J) {
                        for (var R = V(S), L = 0; L < R.length; L += 2) {
                            var B, c;
                            z ? (B = 2 * z[2] - z[0], c = 2 * z[3] - z[1]) : (B = g.x, c = g.y);
                            var b = R[L],
                                W = R[L + 1];
                            "t" === J && (b += g.x, W += g.y), q && q.quadraticCurveTo(B, c, b, W), v.push({
                                x: B,
                                y: c
                            }), v.push({
                                x: b,
                                y: W
                            }), g.x = b, g.y = W
                        }
                        p = null, z = [B, c, b, W]
                    } else if ("V" === J || "v" === J) {
                        for (var R = V(S), L = 0; L < R.length; L += 1) {
                            var W = R[L];
                            "v" === J && (W += g.y), q && q.lineTo(g.x, W), v.push({
                                x: g.x,
                                y: W
                            }), g.y = W
                        }
                        p = z = null
                    } else if ("L" === J || "l" === J) {
                        for (var R = V(S), L = 0; L < R.length; L += 2) {
                            var b = R[L],
                                W = R[L + 1];
                            "l" === J && (b += g.x, W += g.y), q && q.lineTo(b, W), v.push({
                                x: b,
                                y: W
                            }), g.x = b, g.y = W
                        }
                        p = z = null
                    } else if ("A" === J || "a" === J) {
                        for (var R = V(S), L = 0; L < R.length; L += 7) {
                            var X = R[L],
                                o = R[L + 1],
                                H = R[L + 2],
                                i = R[L + 3],
                                y = R[L + 4],
                                b = R[L + 5],
                                W = R[L + 6];
                            "a" === J && (b += g.x, W += g.y);
                            var _ = dc(g, X, o, H, i, y, {
                                x: b,
                                y: W
                            }, q);
                            _ && (v = v.concat(_)), g.x = b, g.y = W
                        }
                        p = z = null
                    }
                    var O = S.substr(S.length - 1);
                    ("z" === O || "Z" === O) && q && q.closePath()
                }
                return v
            },
            uq = function (q, Y, O) {
                var w, K, c = "L" === Y[0],
                    g = Y.length;
                q.save(), c ? (q.transform(Y[5], Y[6], Y[7], Y[8], Y[9], Y[10]), w = q.createLinearGradient(Y[1], Y[2], Y[3], Y[4]), K = 11) : (q.transform(Y[7], Y[8], Y[9], Y[10], Y[11], Y[12]), w = q.createRadialGradient(Y[1], Y[2], Y[3], Y[4], Y[5], Y[6]), K = 13);
                for (var v = q.compGray; g > K;) {
                    var V = Y[K + 1];
                    V = O(V), w.addColorStop(Y[K], v ? u.toGrayColor(V) : V), K += 2
                }
                q.fillStyle = w
            },
            ok = function (e, J) {
                var F = e.s("shape.gradient.pack");
                if (F) {
                    for (var H = F.length, Q = new Array(H), f = 0; H > f; f++) Q[f] = F[f];
                    var M, n, q, Y, E, w, B, N, I, U, $, R, A, m = "L" === Q[0];
                    M = m ? 5 : 7, n = Q[M], q = Q[M + 1], Y = Q[M + 2], E = Q[M + 3], w = Q[M + 4], B = Q[M + 5], N = J[0], I = J[1], U = J[2], $ = J[3], R = J[4], A = J[5], Q[M] = N * n + U * q, Q[M + 1] = I * n + $ * q, Q[M + 2] = N * Y + U * E, Q[M + 3] = I * Y + $ * E, Q[M + 4] = N * w + U * B + R, Q[M + 5] = I * w + $ * B + A, e.s("shape.gradient.pack", Q)
                }
            },
            en = function (T, U, F, m) {
                var N = !1;
                if (T.beginPath ? T.beginPath() : N = !0, Xo(U) && (U = U._as), Xo(F) && (F = F._as), F && F.length) {
                    for (var A, $, p, W, B = 0, g = 0, y = F.length; y > g; g++) A = F[g], 1 === A ? ($ = U[B++], T.moveTo($.x, N ? -$.y : $.y)) : 2 === A ? ($ = U[B++], T.lineTo($.x, N ? -$.y : $.y)) : 3 === A ? ($ = U[B++], p = U[B++], T.quadraticCurveTo($.x, N ? -$.y : $.y, p.x, N ? -p.y : p.y)) : 4 === A ? ($ = U[B++], p = U[B++], W = U[B++], T.bezierCurveTo($.x, N ? -$.y : $.y, p.x, N ? -p.y : p.y, W.x, N ? -W.y : W.y)) : 5 === A && T.closePath();
                    m && 5 !== A && T.closePath()
                } else {
                    var w, M, j, d = U.length;
                    if (d > 0) {
                        for (w = U[0], T.moveTo(w.x, N ? -w.y : w.y), M = 1; d > M; M++) j = U[M], T.lineTo(j.x, N ? -j.y : j.y);
                        m && T.closePath()
                    }
                }
            },
            Yo = function (s, P, G, h) {
                if (Xo(s) && (s = s._as), Xo(P) && (P = P._as), P && P.length) {
                    G = G || Nl;
                    for (var C, U, N, y, W, _, E, q, k = [], w = F, Y = 0, I = 0, v = P.length; v > I; I++)
                        if (C = P[I], 1 === C) k.push(w = []), w.push(s[Y++]);
                        else if (2 === C) w.push(s[Y++]);
                        else if (3 === C) {
                            for (U = w[w.length - 1], N = s[Y++], y = s[Y++], _ = 1; G > _; _++) E = Id(_ / G, U.x, N.x, y.x), q = Id(_ / G, U.y, N.y, y.y), w.push({
                                x: E,
                                y: q,
                                b: !0
                            });
                            w.push(y)
                        } else if (4 === C) {
                            for (U = w[w.length - 1], N = s[Y++], y = s[Y++], W = s[Y++], _ = 1; G > _; _++) E = qg(_ / G, U.x, N.x, y.x, W.x), q = qg(_ / G, U.y, N.y, y.y, W.y), w.push({
                                x: E,
                                y: q,
                                b: !0
                            });
                            w.push(W)
                        } else 5 === C && w.push(w[0]);
                    return h && 5 !== C && w && w.length > 2 && w.push(w[0]), k
                }
                return h && s.length > 2 && (s = s.slice(), s.push(s[0])), s ? [s] : []
            },
            fr = function (X, D, L, Z, c, g) {
                var n, l, Q, x = zd(D),
                    B = Z,
                    J = x[0],
                    R = x[1],
                    f = x[2];
                if (L) {
                    var u = zd(L);
                    n = u[0] - J, l = u[1] - R, Q = u[2] - f
                } else n = 255 - J, l = 255 - R, Q = 255 - f;
                for (g || (g = Z > 10 ? 1 : .5, g = 1 > c ? V(g / c, 2) : g), X.save(), X.shadowOffsetX = 0, X.shadowOffsetY = 0, X.shadowBlur = 0, X.shadowColor = 0;
                    (Z -= g) > 0;) {
                    var d = 1 - Z / B,
                        M = J + n * d,
                        P = R + l * d,
                        $ = f + Q * d;
                    M = V(s(M), 255), P = V(s(P), 255), $ = V(s($), 255), X.strokeStyle = "rgb(" + M + "," + P + "," + $ + ")", X.lineWidth = Z, X.stroke()
                }
                X.restore()
            },
            mp = function () {
                var y = {};
                return function (O, d) {
                    var p = O + "-" + d,
                        a = y[p];
                    if (a) return a;
                    var u, T, b, L = zd(O);
                    return 0 > d ? (d = (100 + d) / 100, u = s(L[0] * d), T = s(L[1] * d), b = s(L[2] * d)) : (d /= 100, u = L[0], T = L[1], b = L[2], u += (255 - u) * d, T += (255 - T) * d, b += (255 - b) * d, u = V(s(u), 255), T = V(s(T), 255), b = V(s(b), 255)), y[p] = "rgb(" + u + "," + T + "," + b + ")"
                }
            }(),
            fl = function (D, e, d, f, k, c) {
                c && (D.fillStyle = c), D.beginPath(), D.rect(e, d, f, k), D.fill()
            },
            Ej = function (x, j, Q, M, R, t, K) {
                x.beginPath(), Eg[j](x, Q.x, Q.y, Q.width, Q.height, M, R, t, K)
            },
            Ge = function (M, V, S, Q, T) {
                var m = Eg[S];
                M.fillStyle = m ? m(M, V, Q ? Q : Cn, T.x, T.y, T.width, T.height) : V
            },
            fg = function (Y, Q, u, v, S, q) {
                Y.fillStyle = am(Y, Q, u, v, S, q)
            },
            qb = function (t, I, T, M, w, l) {
                t.strokeStyle = am(t, I, T, M, w, l)
            },
            am = function (k, I, o, x, F, J) {
                var f;
                try {
                    if (!I.tagName && I.comps) {
                        I._cacheImage_ || (I._cacheImage_ = {});
                        var y;
                        y = "override" === x ? "colors_override" : "override_rgb" === x ? "colors_override_rgb" : "override_a" === x ? "colors_override_a" : "colors", I._cacheImage_[y] || (I._cacheImage_[y] = {
                            __count__: 0
                        });
                        var H = I._cacheImage_[y][o];
                        H || (I._cacheImage_[y].__count__ > u.imageCacheThreshold && (I._cacheImage_[y] = {
                            __count__: 0
                        }), H = O.Default.toCanvas(I, xc(I), oo(I), null, F, J, o, null, x), I._cacheImage_[y][o] = H, I._cacheImage_[y].__count__++), I = H
                    }
                    f = k.createPattern(I, "repeat")
                } catch (w) {
                    f = "black"
                }
                return f
            },
            Gh = function (r) {
                var z, $, v = [],
                    n = 0,
                    U = r.length;
                for (z = 0; 65 > z; z++) v[z] = z;
                for (z = 0; 65 > z; z++) n = (n + v[z] + r.charCodeAt(z % U)) % 65, $ = v[z], v[z] = v[n], v[n] = $;
                for (z = 0; 65 > z; z++) v[z] = Of[v[z]];
                return v.join("")
            },
            bn = function (T) {
                for (var q = 8 + Rc.randomInt(8), j = Of[8 * Rc.randomInt(8) + (q - 8)], P = "", i = 0; q > i; i++) P += Of[Rc.randomInt(64)];
                var w = Gh(P + Y + zl + Yk);
                return j + P + Nq.encode(T, w)
            },
            _o = function (N) {
                var H = N[0],
                    P = Of.indexOf(H);
                if (0 > P) return "";
                P = 8 + (7 & P);
                var h = N.slice(1, 1 + P),
                    q = Gh(h + Y + zl + Yk);
                return Nq.decode(N, q, 1 + P)
            },
            Xr = function (X, Z, D, r, O, E, p) {
                X.save(), X.translate(Z, D), X.scale(1, p / E), X.arc(0, 0, E, r, O), X.restore()
            },
            mo = function (L, t, g, e, y, U, Z, _) {
                var I, P, m, b, r, $, D, f, N, M, A;
                if (X(y) > 2 * W && (y = 2 * W), r = s(X(y) / (W / 4)), I = y / r, P = -I, m = -e, r > 0) {
                    $ = t + k(e) * U, D = g + n(-e) * Z, _ ? L.lineTo($, D) : L.moveTo($, D);
                    for (var i = 0; r > i; i++) m += P, b = m - P / 2, f = t + k(m) * U, N = g + n(m) * Z, M = t + k(b) * (U / k(P / 2)), A = g + n(b) * (Z / k(P / 2)), L.quadraticCurveTo(M, A, f, N)
                }
            },
            pg = function ($, k, P, r, X, x, c, O, G) {
                6 === arguments.length && (c = x, O = x, G = x);
                var M = k + r,
                    n = P + X,
                    v = X > r ? 2 * r : 2 * X;
                x = v > x ? x : v, c = v > c ? c : v, O = v > O ? O : v, G = v > G ? G : v;
                var q = .29 * G,
                    Y = .58 * G;
                $.moveTo(M, n - G), $.quadraticCurveTo(M, n - Y, M - q, n - q), $.quadraticCurveTo(M - Y, n, M - G, n), q = .29 * O, Y = .58 * O, $.lineTo(k + O, n), $.quadraticCurveTo(k + Y, n, k + q, n - q), $.quadraticCurveTo(k, n - Y, k, n - O), q = .29 * x, Y = .58 * x, $.lineTo(k, P + x), $.quadraticCurveTo(k, P + Y, k + q, P + q), $.quadraticCurveTo(k + Y, P, k + x, P), q = .29 * c, Y = .58 * c, $.lineTo(M - c, P), $.quadraticCurveTo(M - Y, P, M - q, P + q), $.quadraticCurveTo(M, P + Y, M, P + c), $.lineTo(M, n - G)
            },
            Ie = function (f, g, w, c, v, J, b) {
                g && (w = A(w), c = A(c), b || (b = 1), f.fillStyle = g, f.beginPath(), f.rect(w, c, b, J), f.rect(w, c, v, b), J - b > 0 && f.rect(w, c + J - b, v, b), v - b > 0 && f.rect(w + v - b, c, b, J), f.fill())
            },
            Wq = function (o, N, m, K) {
                var U = K.x,
                    M = K.y,
                    I = K.width,
                    j = K.height;
                if (!(!N || !m || 0 >= I || 0 >= j)) {
                    var _, t = Ee(N),
                        q = cn(N),
                        $ = m > 0;
                    1 === m || -1 === m ? (o.fillStyle = $ ? t : q, o.beginPath(), o.rect(U, M, 1, j), o.rect(U, M, I, 1), o.fill(), o.fillStyle = $ ? q : t, o.beginPath(), o.rect(U, M + j - 1, I, 1), o.rect(U + I - 1, M, 1, j), o.fill()) : (m = V(X(m), V(I / 2, j / 2)), _ = o.createLinearGradient(U, M, U + m, M), _.addColorStop(0, $ ? t : q), _.addColorStop(1, N), o.fillStyle = _, o.beginPath(), o.moveTo(U, M), o.lineTo(U + m, M + m), o.lineTo(U + m, M + j - m), o.lineTo(U, M + j), o.lineTo(U, M), o.fill(), _ = o.createLinearGradient(U, M, U, M + m), _.addColorStop(0, $ ? t : q), _.addColorStop(1, N), o.fillStyle = _, o.beginPath(), o.moveTo(U, M), o.lineTo(U + m, M + m), o.lineTo(U + I - m, M + m), o.lineTo(U + I, M), o.lineTo(U, M), o.fill(), _ = o.createLinearGradient(U, M + j, U, M + j - m), _.addColorStop(0, $ ? q : t), _.addColorStop(1, N), o.fillStyle = _, o.beginPath(), o.moveTo(U, M + j), o.lineTo(U + m, M + j - m), o.lineTo(U + I - m, M + j - m), o.lineTo(U + I, M + j), o.lineTo(U, M + j), o.fill(), _ = o.createLinearGradient(U + I, M, U + I - m, M), _.addColorStop(0, $ ? q : t), _.addColorStop(1, N), o.fillStyle = _, o.beginPath(), o.moveTo(U + I, M), o.lineTo(U + I - m, M + m), o.lineTo(U + I - m, M + j - m), o.lineTo(U + I, M + j), o.lineTo(U + I, M), o.fill())
                }
            },
            Hf = function (L, m, r, s, h, i, B) {
                var A = L.createLinearGradient(s, h, i, B);
                return A.addColorStop(0, r), A.addColorStop(1, m), A
            },
            Nd = function ($, B, i, W, j, H, t) {
                var U = $.createLinearGradient(W, j, H, t);
                return U.addColorStop(0, B), U.addColorStop(.5, i), U.addColorStop(1, B), U
            },
            Dl = function (W, O, L, u, $, N, y) {
                var P = W.createLinearGradient(u, $, N, y);
                return P.addColorStop(0, O), P.addColorStop(1 / 3, L), P.addColorStop(2 / 3, O), P.addColorStop(1, L), P
            },
            Ni = function (O, i, A, I, D, z, F, X, U) {
                var c = O.createRadialGradient(I + z * X, D + F * U, V(z, F) / 24, I + z / 2, D + F / 2, q(z, F) / 2);
                return c.addColorStop(0, A), c.addColorStop(1, i), c
            },
            og = [0, -1, .22451398828979272, -.30901699437494734, .9510565162951535, -.30901699437494745, .3632712640026804, .11803398874989468, .5877852522924731, .8090169943749473, -1.1102230246251565e-16, .38196601125010515, -.587785252292473, .8090169943749475, -.3632712640026805, .1180339887498949, -.9510565162951536, -.3090169943749473, -.22451398828979285, -.30901699437494734],
            Eg = {
                polygon: function (L, N, X, t, c, h) {
                    (h == F || 3 > h) && (h = 6);
                    for (var l, p, q = V(t, c) / 2, z = N + t / 2, B = X + c / 2, b = 0, K = 2 * W / h, y = 0; h > y; y++) l = z + k(b) * q, p = B + n(b) * q, 0 === y ? L.moveTo(l, p) : L.lineTo(l, p), b += K;
                    L.closePath()
                }, arc: function (j, c, p, k, T, d, K, m, t) {
                    d == F && (d = W), K == F && (K = $), m == F && (m = !0);
                    var J = c + k / 2,
                        E = p + T / 2;
                    m && j.moveTo(J, E), t ? Xr(j, J, E, d, K, k / 2, T / 2) : j.arc(J, E, V(k, T) / 2, d, K), m && j.closePath()
                }, rect: function (A, i, x, G, U) {
                    A.rect(i, x, G, U)
                }, circle: function (n, g, I, i, s) {
                    n.arc(g + i / 2, I + s / 2, V(i, s) / 2, 0, $, !0)
                }, oval: function (y, J, v, I, H) {
                    Xr(y, J + I / 2, v + H / 2, 0, $, I / 2, H / 2)
                }, roundRect: function (E, m, R, Q, y, w) {
                    w == F && (w = V(V(Q, y) / 4, 8)), pg(E, m, R, Q, y, w)
                }, star: function (I, B, F, z, x) {
                    var L = 2 * z,
                        t = 2 * x,
                        E = B + z / 2,
                        o = F + x / 2;
                    I.moveTo(E - L / 4, o - t / 12), I.lineTo(B + .306 * z, F + .579 * x), I.lineTo(E - L / 6, o + t / 4), I.lineTo(B + z / 2, F + .733 * x), I.lineTo(E + L / 6, o + t / 4), I.lineTo(B + .693 * z, F + .579 * x), I.lineTo(E + L / 4, o - t / 12), I.lineTo(B + .611 * z, F + .332 * x), I.lineTo(E + 0, o - t / 4), I.lineTo(B + .388 * z, F + .332 * x), I.closePath()
                }, pentagram: function (F, T, a, L, U) {
                    var m = .5 * U,
                        Q = T + .5 * L,
                        Z = a + m,
                        W = .5257311121191336 * L;
                    W > m && (W = m);
                    var R = og,
                        K = 0;
                    for (F.moveTo(Q + W * R[K++], Z + W * R[K++]); 20 > K;) F.lineTo(Q + W * R[K++], Z + W * R[K++]);
                    F.closePath()
                }, triangle: function (D, j, H, O, T) {
                    D.moveTo(j + O / 2, H), D.lineTo(j + O, H + T), D.lineTo(j, H + T), D.closePath()
                }, hexagon: function (_, i, Z, r, f) {
                    _.moveTo(i, Z + f / 2), _.lineTo(i + r / 4, Z + f), _.lineTo(i + 3 * r / 4, +Z + f), _.lineTo(i + r, Z + f / 2), _.lineTo(i + 3 * r / 4, Z), _.lineTo(i + r / 4, Z), _.closePath()
                }, pentagon: function (i, m, j, p, A) {
                    var b = 2 * p,
                        f = 2 * A,
                        E = m + p / 2,
                        k = j + A / 2;
                    i.moveTo(E - b / 4, k - f / 12), i.lineTo(E - b / 6, k + f / 4), i.lineTo(E + b / 6, k + f / 4), i.lineTo(E + b / 4, k - f / 12), i.lineTo(E + 0, k - f / 4), i.closePath()
                }, diamond: function (x, l, v, u, n) {
                    x.moveTo(l + u / 2, v), x.lineTo(l, v + n / 2), x.lineTo(l + u / 2, v + n), x.lineTo(l + u, v + n / 2), x.closePath()
                }, rightTriangle: function (N, Z, G, b, L) {
                    N.moveTo(Z, G), N.lineTo(Z + b, G + L), N.lineTo(Z, G + L), N.closePath()
                }, parallelogram: function (Q, g, B, p, k) {
                    var V = p / 4;
                    Q.moveTo(g + V, B), Q.lineTo(g + p, B), Q.lineTo(g + p - V, B + k), Q.lineTo(g, B + k), Q.closePath()
                }, trapezoid: function (C, D, a, y, m) {
                    var M = y / 4;
                    C.moveTo(D + M, a), C.lineTo(D + y - M, a), C.lineTo(D + y, a + m), C.lineTo(D, a + m), C.closePath()
                }, "linear.southwest": function (k, R, u, P, i, g, v) {
                    return Hf(k, R, u, P, i + v, P + g, i)
                }, "linear.southeast": function (X, h, r, S, b, e, f) {
                    return Hf(X, h, r, S + e, b + f, S, b)
                }, "linear.northwest": function (e, L, p, K, y, k, U) {
                    return Hf(e, L, p, K, y, K + k, y + U)
                }, "linear.northeast": function (E, D, $, L, V, N, J) {
                    return Hf(E, D, $, L + N, V, L, V + J)
                }, "linear.north": function (t, E, N, q, C, P, J) {
                    return Hf(t, E, N, q, C, q, C + J)
                }, "linear.south": function (w, U, P, m, V, t, L) {
                    return Hf(w, U, P, m, V + L, m, V)
                }, "linear.west": function (H, $, G, d, s, u) {
                    return Hf(H, $, G, d, s, d + u, s)
                }, "linear.east": function (e, l, L, i, t, h) {
                    return Hf(e, l, L, i + h, t, i, t)
                }, "radial.center": function (T, s, S, h, l, Z, U) {
                    return Ni(T, s, S, h, l, Z, U, .5, .5)
                }, "radial.southwest": function (Y, Z, z, n, L, o, a) {
                    return Ni(Y, Z, z, n, L, o, a, .25, .75)
                }, "radial.southeast": function (p, U, m, b, M, d, w) {
                    return Ni(p, U, m, b, M, d, w, .75, .75)
                }, "radial.northwest": function (L, J, G, $, r, w, V) {
                    return Ni(L, J, G, $, r, w, V, .25, .25)
                }, "radial.northeast": function (B, l, J, v, V, f, a) {
                    return Ni(B, l, J, v, V, f, a, .75, .25)
                }, "radial.north": function (F, i, H, n, S, r, K) {
                    return Ni(F, i, H, n, S, r, K, .5, .25)
                }, "radial.south": function (L, h, R, Y, E, a, S) {
                    return Ni(L, h, R, Y, E, a, S, .5, .75)
                }, "radial.west": function (R, V, v, t, C, A, $) {
                    return Ni(R, V, v, t, C, A, $, .25, .5)
                }, "radial.east": function (i, J, r, o, v, j, w) {
                    return Ni(i, J, r, o, v, j, w, .75, .5)
                }, "spread.horizontal": function (H, I, D, z, E, q) {
                    return Nd(H, I, D, z, E, z + q, E)
                }, "spread.vertical": function (I, R, N, o, K, h, P) {
                    return Nd(I, R, N, o, K, o, K + P)
                }, "spread.diagonal": function (A, c, x, B, P, F, d) {
                    return Nd(A, c, x, B + F, P, B, P + d)
                }, "spread.antidiagonal": function (G, C, d, q, p, D, $) {
                    return Nd(G, C, d, q, p, q + D, p + $)
                }, "spread.north": function (A, o, t, z, $, M, c) {
                    return Dl(A, o, t, z, $ - c / 4, z, $ + c + c / 4)
                }, "spread.south": function (E, l, w, N, J, f, r) {
                    return Dl(E, w, l, N, J - r / 4, N, J + r + r / 4)
                }, "spread.west": function (S, P, r, W, G, q) {
                    return Dl(S, P, r, W - q / 4, G, W + q + q / 4, G)
                }, "spread.east": function (D, J, f, w, N, s) {
                    return Dl(D, f, J, w - s / 4, N, w + s + s / 4, N)
                }
            },
            Go = function (o, l, _) {
                return new In(o).tf(l, _)
            },
            zo = function (N) {
                var C = N.touches[0],
                    p = N.touches[1],
                    B = C.clientX,
                    b = C.clientY,
                    z = p.clientX,
                    J = p.clientY;
                return w((B - z) * (B - z) + (b - J) * (b - J))
            },
            ne = function (p) {
                var K = p.touches[0],
                    n = p.touches[1],
                    T = K.clientX,
                    e = K.clientY,
                    O = n.clientX,
                    x = n.clientY;
                return {
                    x: (T + O) / 2,
                    y: (e + x) / 2
                }
            },
            er = (function () {
                for (var Q = 0, F = rj.split(""), L = 0; L < F.length; L++) Q = 10 * Zb(F[L]) + Q;
                return $o(x[$r.toString(8 * L) + Bg.substr(L) + 3], x[$r.toString(8 * L) + Bg.substr(L) + 4]), Q
            }(), function (M, A, N) {
                for (var g = 0; g < N.size(); g++) {
                    var F = N.get(g);
                    M.co(F) && A.add(F)
                }
                for (g = 0; g < N.size(); g++) F = N.get(g), er(M, A, F._children)
            }),
            no = function (H, N, Y) {
                for (var g = 0; g < Y.size(); g++) {
                    var Z = Y.get(Y.size() - 1 - g);
                    H.co(Z) && N.add(Z)
                }
                for (g = 0; g < Y.size(); g++) Z = Y.get(g), no(H, N, Z._children)
            },
            ao = function (Z, y, t) {
                for (var z = !1, o = 0; o < t.size(); o++) {
                    var N = t.get(o);
                    Z.co(N) ? z && y.add(N) : z = 1
                }
                for (o = 0; o < t.size(); o++) N = t.get(o), ao(Z, y, N._children)
            },
            Tk = function (I, r, Z) {
                for (var R = !1, Q = 0; Q < Z.size(); Q++) {
                    var S = Z.get(Z.size() - 1 - Q);
                    I.co(S) ? R && r.add(S) : R = !0
                }
                for (Q = 0; Q < Z.size(); Q++) S = Z.get(Q), Tk(I, r, S._children)
            },
            qc = u.moveDatas = function (j, p, E, o) {
                var U = o == F;
                if (0 !== p || 0 !== E || !U && 0 !== o) {
                    var V = !0,
                        R = [];
                    if (j.forEach(function (Y) {
                        V && (Y._69O || yl(Y) || Qb(Y)) && (V = !1)
                    }), V) R = j;
                    else {
                        var O = {},
                            l = {};
                        j.forEach(function (L) {
                            O[L._id] = !0
                        });
                        var y = {},
                            g = function (B) {
                                var H = B._id;
                                return O[H] ? (R.push(B), y[H] = !0) : y[H] = !1
                            },
                            a = function (C) {
                                var W = C._id;
                                if (l[W]) return g(C);
                                var N = y[W];
                                if (N !== Z) return N;
                                var q = C._parent;
                                if (q && (Qb(q) || yl(q)) && a(q)) return y[W] = !0;
                                var J = C._host;
                                return J && (l[W] = W, N = a(J), l[W] = Z, N) ? y[W] = !0 : g(C)
                            };
                        j.forEach(function (S) {
                            a(S)
                        })
                    }
                    R.forEach(function (k) {
                        if (Fq(k)) U ? k.translate(p, E) : k.translate3d(p, E, o);
                        else {
                            var W = k.s(Ei);
                            if (!W || W.isEmpty()) return;
                            var y = new xr;
                            W.each(function (b) {
                                b = Pm(b), U ? (b.x += p, b.y += E) : (b.x += p, b.y += o, b.e == F ? b.e = E : b.e += E), y.add(b)
                            }), k.s(Ei, y)
                        }
                    })
                }
            },
            Vg = function () {
                function n(e, P) {
                    return P === e.substring(0, P.length) ? !0 : !1
                }

                function f(K) {
                    return parseFloat(K) || 0
                }

                function b(D, q) {
                    if (q == Z && (q = new br), n(D, "matrix3d")) {
                        var m = D.substring(9, D.length - 1).split(",");
                        m = m.map(f), q.fromArray(m)
                    } else if (n(D, "matrix")) {
                        var m = D.substring(7, D.length - 1).split(",");
                        m = m.map(f), q.el[0] = m[0], q.el[1] = m[1], q.el[2] = 0, q.el[3] = 0, q.el[4] = m[2], q.el[5] = m[3], q.el[6] = 0, q.el[7] = 0, q.el[8] = 0, q.el[9] = 0, q.el[10] = 1, q.el[11] = 0, q.el[12] = m[4], q.el[13] = m[5], q.el[14] = 0, q.el[15] = 1
                    }
                    return q
                }

                function j(O, W) {
                    W == Z && (W = new tl);
                    var z = O.split(/\s+/);
                    return z = z.map(f), W.set(z[0] || 0, z[1] || 0, z[2] || 0), W
                }
                var H, M, w, A, h, R = function (W, c) {
                    H || (H = new br, M = new tl, w = new br, A = new br, h = new br), c == Z && (c = new br);
                    var P = getComputedStyle(W);
                    P.transform && "none" !== P.transform && (b(P.transform, H), j(P.transformOrigin, M), A.setPosition(M), M.negate(), h.setPosition(M), (Uq || "preserve-3d" !== P.transformStyle) && (H.el[8] = 0, H.el[9] = 0, H.el[10] = 1, H.el[11] = 0), c.multiplyMatrices(h, c), c.multiplyMatrices(H, c), c.multiplyMatrices(A, c)), !Uq && P.perspective && "none" !== P.perspective && (w.el[11] = -1 / f(P.perspective), j(P.perspectiveOrigin, M), A.setPosition(M), M.negate(), h.setPosition(M), c.multiplyMatrices(h, c), c.multiplyMatrices(w, c), c.multiplyMatrices(A, c));
                    for (var C = W.offsetParent, s = W.offsetLeft, n = W.offsetTop, x = W.parentElement; x && x !== C;) {
                        var q = getComputedStyle(x);
                        if ("none" !== q.transform || "none" !== q.perspective) break;
                        x = x.parentElement
                    }
                    return x == Z && W !== W.ownerDocument.documentElement && "fixed" !== P.position && (x = W.ownerDocument.documentElement), C != Z && C !== x && (s -= x.offsetLeft, n -= x.offsetTop), M.set(s, n, 0), A.setPosition(M), c.multiplyMatrices(A, c), x && R(x, c), c
                };
                return function (g, a) {
                    var O = g.parentElement;
                    if (O) {
                        var V = O.updateAppendMatrix;
                        if (V) {
                            delete O.updateAppendMatrix;
                            var S = new br;
                            R(O, S);
                            var J = new br;
                            J.getInverse(S), O._matrixAppend = J, O._maxrixPreAppend = S
                        }
                        return a ? O._matrixAppend : O._maxrixPreAppend
                    }
                }
            }(),
            Jm = function (b, p) {
                for (; b && !b.hasOwnProperty(p);) b = o.getPrototypeOf(b);
                return b && o.getOwnPropertyDescriptor(b, p)
            },
            Ug = o.getPrototypeOf ? function (n, p, W) {
                var C = Jm(p, W);
                C && o.defineProperty(n, W, C)
            } : function (v, f, S) {
                v[S] = f[S]
            },
            cg = {
                1: 29,
                2: 30,
                3: 31,
                4: 32,
                5: 33,
                6: 26,
                7: 27,
                8: 28,
                9: 21,
                10: 22,
                11: 23,
                12: 24,
                13: 25,
                14: 14,
                15: 15,
                16: 16,
                17: 17,
                18: 18,
                19: 19,
                20: 20,
                21: 9,
                22: 10,
                23: 11,
                24: 12,
                25: 13,
                26: 6,
                27: 7,
                28: 8,
                29: 1,
                30: 2,
                31: 3,
                32: 4,
                33: 5,
                34: 36,
                35: 37,
                36: 34,
                37: 35,
                38: 54,
                39: 55,
                40: 52,
                41: 53,
                42: 50,
                43: 51,
                44: 49,
                50: 42,
                51: 43,
                52: 40,
                53: 41,
                54: 38,
                55: 39
            },
            Re = function () {
                var Q = {
                    1: function (Z, z) {
                        return {
                            x: Z.x - z.width / 2,
                            y: Z.y - z.height / 2
                        }
                    }, 2: function (i, e) {
                        return {
                            x: i.x + e.width / 2,
                            y: i.y - e.height / 2
                        }
                    }, 3: function (k, F) {
                        return {
                            x: k.x + k.width / 2,
                            y: k.y - F.height / 2
                        }
                    }, 4: function (L, F) {
                        return {
                            x: L.x + L.width - F.width / 2,
                            y: L.y - F.height / 2
                        }
                    }, 5: function (g, l) {
                        return {
                            x: g.x + g.width + l.width / 2,
                            y: g.y - l.height / 2
                        }
                    }, 6: function (r) {
                        return {
                            x: r.x,
                            y: r.y
                        }
                    }, 7: function (N) {
                        return {
                            x: N.x + N.width / 2,
                            y: N.y
                        }
                    }, 8: function (Z) {
                        return {
                            x: Z.x + Z.width,
                            y: Z.y
                        }
                    }, 9: function (U, V) {
                        return {
                            x: U.x - V.width / 2,
                            y: U.y + V.height / 2
                        }
                    }, 10: function (n, M) {
                        return {
                            x: n.x + M.width / 2,
                            y: n.y + M.height / 2
                        }
                    }, 11: function (D, w) {
                        return {
                            x: D.x + D.width / 2,
                            y: D.y + w.height / 2
                        }
                    }, 12: function (E, u) {
                        return {
                            x: E.x - u.width / 2 + E.width,
                            y: E.y + u.height / 2
                        }
                    }, 13: function (Y, P) {
                        return {
                            x: Y.x + Y.width + P.width / 2,
                            y: Y.y + P.height / 2
                        }
                    }, 14: function (A, U) {
                        return {
                            x: A.x - U.width / 2,
                            y: A.y + A.height / 2
                        }
                    }, 15: function (b) {
                        return {
                            x: b.x,
                            y: b.y + b.height / 2
                        }
                    }, 16: function (e, p) {
                        return {
                            x: e.x + p.width / 2,
                            y: e.y + e.height / 2
                        }
                    }, 17: function (y) {
                        return {
                            x: y.x + y.width / 2,
                            y: y.y + y.height / 2
                        }
                    }, 18: function (L, s) {
                        return {
                            x: L.x + L.width - s.width / 2,
                            y: L.y + L.height / 2
                        }
                    }, 19: function (y) {
                        return {
                            x: y.x + y.width,
                            y: y.y + y.height / 2
                        }
                    }, 20: function (R, c) {
                        return {
                            x: R.x + R.width + c.width / 2,
                            y: R.y + R.height / 2
                        }
                    }, 21: function (S, s) {
                        return {
                            x: S.x - s.width / 2,
                            y: S.y + S.height - s.height / 2
                        }
                    }, 22: function (W, D) {
                        return {
                            x: W.x + D.width / 2,
                            y: W.y + W.height - D.height / 2
                        }
                    }, 23: function (d, a) {
                        return {
                            x: d.x + d.width / 2,
                            y: d.y + d.height - a.height / 2
                        }
                    }, 24: function (J, O) {
                        return {
                            x: J.x + J.width - O.width / 2,
                            y: J.y + J.height - O.height / 2
                        }
                    }, 25: function (C, k) {
                        return {
                            x: C.x + C.width + k.width / 2,
                            y: C.y + C.height - k.height / 2
                        }
                    }, 26: function (x) {
                        return {
                            x: x.x,
                            y: x.y + x.height
                        }
                    }, 27: function (W) {
                        return {
                            x: W.x + W.width / 2,
                            y: W.y + W.height
                        }
                    }, 28: function (g) {
                        return {
                            x: g.x + g.width,
                            y: g.y + g.height
                        }
                    }, 29: function (k, r) {
                        return {
                            x: k.x - r.width / 2,
                            y: k.y + k.height + r.height / 2
                        }
                    }, 30: function (u, B) {
                        return {
                            x: u.x + B.width / 2,
                            y: u.y + u.height + B.height / 2
                        }
                    }, 31: function (H, w) {
                        return {
                            x: H.x + H.width / 2,
                            y: H.y + H.height + w.height / 2
                        }
                    }, 32: function (N, b) {
                        return {
                            x: N.x + N.width - b.width / 2,
                            y: N.y + N.height + b.height / 2
                        }
                    }, 33: function (l, B) {
                        return {
                            x: l.x + l.width + B.width / 2,
                            y: l.y + l.height + B.height / 2
                        }
                    }, 34: function (q, t) {
                        return {
                            x: q.x,
                            y: q.y - t.height / 2
                        }
                    }, 35: function (Y, x) {
                        return {
                            x: Y.x + Y.width,
                            y: Y.y - x.height / 2
                        }
                    }, 36: function (j, q) {
                        return {
                            x: j.x,
                            y: j.y + j.height + q.height / 2
                        }
                    }, 37: function (i, o) {
                        return {
                            x: i.x + i.width,
                            y: i.y + i.height + o.height / 2
                        }
                    }, 38: function (u, x) {
                        return {
                            x: u.x + u.width / 4,
                            y: u.y - x.height / 2
                        }
                    }, 39: function (N, e) {
                        return {
                            x: N.x + 3 * N.width / 4,
                            y: N.y - e.height / 2
                        }
                    }, 40: function (l) {
                        return {
                            x: l.x + l.width / 4,
                            y: l.y
                        }
                    }, 41: function (w) {
                        return {
                            x: w.x + 3 * w.width / 4,
                            y: w.y
                        }
                    }, 42: function (x, i) {
                        return {
                            x: x.x + x.width / 4,
                            y: x.y + i.height / 2
                        }
                    }, 43: function (A, t) {
                        return {
                            x: A.x + 3 * A.width / 4,
                            y: A.y + t.height / 2
                        }
                    }, 44: function (M, d) {
                        return {
                            x: M.x + M.width / 2,
                            y: M.y + M.height / 2 - d.height / 2
                        }
                    }, 45: function (N) {
                        return {
                            x: N.x + N.width / 4,
                            y: N.y + N.height / 2
                        }
                    }, 46: function (M, w) {
                        return {
                            x: M.x + M.width / 2 - w.width / 2,
                            y: M.y + M.height / 2
                        }
                    }, 47: function (a, E) {
                        return {
                            x: a.x + a.width / 2 + E.width / 2,
                            y: a.y + a.height / 2
                        }
                    }, 48: function (U) {
                        return {
                            x: U.x + 3 * U.width / 4,
                            y: U.y + U.height / 2
                        }
                    }, 49: function (u, L) {
                        return {
                            x: u.x + u.width / 2,
                            y: u.y + u.height / 2 + L.height / 2
                        }
                    }, 50: function (O, J) {
                        return {
                            x: O.x + O.width / 4,
                            y: O.y + O.height - J.height / 2
                        }
                    }, 51: function (l, S) {
                        return {
                            x: l.x + 3 * l.width / 4,
                            y: l.y + l.height - S.height / 2
                        }
                    }, 52: function (j) {
                        return {
                            x: j.x + j.width / 4,
                            y: j.y + j.height
                        }
                    }, 53: function (O) {
                        return {
                            x: O.x + 3 * O.width / 4,
                            y: O.y + O.height
                        }
                    }, 54: function (W, G) {
                        return {
                            x: W.x + W.width / 4,
                            y: W.y + W.height + G.height / 2
                        }
                    }, 55: function (A, u) {
                        return {
                            x: A.x + 3 * A.width / 4,
                            y: A.y + A.height + u.height / 2
                        }
                    }
                };
                return lh(x) ? function (V, Y, O) {
                    return Q[V](Y, O ? O : nl)
                } : void 0
            }();
        Uh(S, {
            highlight: "#1ABC9C",
            label: "#000",
            labelSelect: "#FFF",
            transparent: "rgba(0,0,0,0.35)",
            titleBackground: "#2C3E50",
            titleIconBackground: "#868686",
            headerBackground: "#ECF0F1",
            headerIconBackground: "#868686",
            headerSeparator: "#868686",
            headerLine: "#D9D9D9",
            background: "#FFF",
            disabledBackground: "rgba(255,255,255,0.65)",
            toolTipBackground: "#FFFFE0",
            rectSelectBorder: "#45C4F9",
            rectSelectBackground: "rgba(0,0,0,0.35)",
            editPointBorder: "#2C3E50",
            editPointBackground: "#D9D9D9",
            dash: "#2C3E50",
            groupBackground: "#ECF0F1",
            groupTitleBackground: "#2C3E50",
            gridBackground: "#D9D9D9",
            gridCellBorderColor: "#868686",
            gridBlockColor: "#868686",
            reverse: "#868686",
            contentIconBackground: "#868686",
            contentLine: "#D9D9D9",
            widgetBackground: "#ECF0F1",
            widgetBorder: "#D9D9D9",
            widgetIconBackground: "#868686",
            widgetIconBorder: "#868686",
            widgetIconGradient: "#D9D9D9",
            widgetIconHighlight: "#43AFF1",
            imageBackground: "#3498DB",
            imageGradient: "#FFF",
            chart: ["#2f7ed8", "#0d233a", "#8bbc21", "#910000", "#1aadce", "#492970", "#f28f43", "#77a1e5", "#c42525", "#a6c96a"]
        }, !0);
        var vc = S.reverse,
            od = S.transparent,
            Vh = S.rectSelectBackground,
            dm = S.dash,
            Kf = S.titleBackground,
            Fj = S.titleIconBackground,
            Yl = S.headerBackground,
            cb = S.headerIconBackground,
            Yb = S.headerSeparator,
            qj = S.headerLine,
            hk = S.contentIconBackground,
            rh = S.contentLine,
            Em = (S.widgetIconHighlight, S.widgetIconBorder),
            Ur = (S.widgetIconGradient, S.imageBackground),
            Cn = S.imageGradient,
            Bc = S.highlight,
            Un = S.label,
            Dg = S.labelSelect;
        if (false && !x.shutAlert1) {
            var ml = new Date,
                qn = yh.split("-"),
                $n = new Date(ml.getFullYear(), ml.getMonth(), ml.getDate()),
                yh = new Date(Zb(qn[0], 10), Zb(qn[1], 10) - 1, Zb(qn[2], 10)),
                Pe = $n.getTime(),
                of = yh.getTime(),
                Wm = Y + "_try",
                xi = x.alert;
            try {
                var Gd = x.localStorage;
                if (Gd && xi)
                    if (of > Pe && 1728e6 > of - Pe) {
                        var Oc = (of - Pe) / 864e5;
                        Gd && Gd[Wm] != Oc && (Gd[Wm] = Oc, x.htWillExpire ? xi(x.htWillExpire.replace("{{day}}", Oc)) : xi("HT for Web free trial license will expire in " + Oc + " days, please apply for a new license!"))
                    } else Pe >= of && (x.htExpired ? xi(x.htExpired) : xi("Your free trial of HT for Web has expired!")),
                        Gd && delete Gd[Wm]
            } catch (bd) { }
        }
        Math.sign === Z && (Math.sign = function (M) {
            return 0 > M ? -1 : M > 0 ? 1 : +M
        });
        var Of = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
            Nq = {
                encode: function (F, B) {
                    var p, j, f, G, M, E, i, l = "",
                        C = 0;
                    for (F = unescape(encodeURIComponent(F)); C < F.length;) p = F.charCodeAt(C++), j = F.charCodeAt(C++), f = F.charCodeAt(C++), G = p >> 2, M = (3 & p) << 4 | j >> 4, E = (15 & j) << 2 | f >> 6, i = 63 & f, isNaN(j) ? E = i = 64 : isNaN(f) && (i = 64), l = l + B.charAt(G) + B.charAt(M) + B.charAt(E) + B.charAt(i);
                    return l
                }, decode: function (o, I, T) {
                    for (var u, f, v, i, s, K, V, j = "", y = T || 0; y < o.length;) i = I.indexOf(o.charAt(y++)), s = I.indexOf(o.charAt(y++)), K = I.indexOf(o.charAt(y++)), V = I.indexOf(o.charAt(y++)), u = i << 2 | s >> 4, f = (15 & s) << 4 | K >> 2, v = (3 & K) << 6 | V, j += String.fromCharCode(u), 64 != K && (j += String.fromCharCode(f)), 64 != V && (j += String.fromCharCode(v));
                    return j = decodeURIComponent(escape(j))
                }, _utf8_encode: function (a) {
                    a = a.replace(/\r\n/g, "\n");
                    for (var L = "", h = 0; h < a.length; h++) {
                        var l = a.charCodeAt(h);
                        128 > l ? L += String.fromCharCode(l) : l > 127 && 2048 > l ? (L += String.fromCharCode(192 | l >> 6), L += String.fromCharCode(128 | 63 & l)) : (L += String.fromCharCode(224 | l >> 12), L += String.fromCharCode(128 | 63 & l >> 6), L += String.fromCharCode(128 | 63 & l))
                    }
                    return L
                }, _utf8_decode: function (k) {
                    for (var K = "", $ = 0, O = 0, h = 0, B = 0; $ < k.length;) O = k.charCodeAt($), 128 > O ? (K += String.fromCharCode(O), $++) : O > 191 && 224 > O ? (h = k.charCodeAt($ + 1), K += String.fromCharCode((31 & O) << 6 | 63 & h), $ += 2) : (h = k.charCodeAt($ + 1), B = k.charCodeAt($ + 2), K += String.fromCharCode((15 & O) << 12 | (63 & h) << 6 | 63 & B), $ += 3);
                    return K
                }
            },
            Xq = [],
            Uf = [],
            Rc = O.Math = {
                generateUUID: function () {
                    for (var k = [], f = 0; 256 > f; f++) k[f] = (16 > f ? "0" : "") + f.toString(16).toUpperCase();
                    return function () {
                        var r = 0 | 4294967295 * Math.random(),
                            i = 0 | 4294967295 * Math.random(),
                            x = 0 | 4294967295 * Math.random(),
                            z = 0 | 4294967295 * Math.random();
                        return k[255 & r] + k[255 & r >> 8] + k[255 & r >> 16] + k[255 & r >> 24] + "-" + k[255 & i] + k[255 & i >> 8] + "-" + k[64 | 15 & i >> 16] + k[255 & i >> 24] + "-" + k[128 | 63 & x] + k[255 & x >> 8] + "-" + k[255 & x >> 16] + k[255 & x >> 24] + k[255 & z] + k[255 & z >> 8] + k[255 & z >> 16] + k[255 & z >> 24]
                    }
                }(),
                clamp: function (K, V, v) {
                    return Math.max(V, Math.min(v, K))
                }, generateIncreasingID: function () {
                    var e = 0;
                    return function () {
                        return ++e
                    }
                }(),
                encodeBase64: function (z, g) {
                    return Nq.encode(z, g || Of)
                }, decodeBase64: function (t, z) {
                    return Nq.decode(t, z || Of)
                }, randomArray: function (z, c) {
                    c = c || z.length;
                    for (var q = c - 1; q > 0; q--) {
                        var Y = Math.floor(Math.random() * (q + 1)),
                            T = z[q];
                        z[q] = z[Y], z[Y] = T
                    }
                    return z
                }, randomInt: function (e, q) {
                    return q === Z && (q = e, e = 0), e + Math.floor(Math.random() * (q - e))
                }, isPOT: function (H) {
                    return H > 0 && 0 === (H - 1 & H)
                }, nearestPOT: function (A) {
                    if (!A) return 1;
                    var p = A;
                    p--, p |= p >> 1, p |= p >> 2, p |= p >> 4, p |= p >> 8, p |= p >> 16, p++;
                    var j = p >> 1;
                    return A - j > p - A ? p : j
                }, requestMatrix4: function () {
                    return Xq.length > 0 ? Xq.pop() : new Rc.Matrix4
                }, releaseMatrix4: function (N) {
                    Xq.push(N)
                }, requestVector3: function () {
                    return Uf.length > 0 ? Uf.pop() : new Rc.Vector3
                }, releaseVector3: function (b) {
                    Uf.push(b)
                }
            },
            Np = O.Matrix = O.Math.Matrix2d = function (W, g, H, G, x) {
                this.setFromTransform(W, g, H, G, x)
            },
            In = Np;
        Np.prototype = {}, Np.prototype.constructor = Np, Np.prototype.set = function (s, d, C, R, K, L) {
            return this.a = s, this.b = d, this.c = C, this.d = R, this.tx = K, this.ty = L, this
        }, Np.prototype.setFromTransform = function (V, u, T, D, I) {
            var Q = this;
            if (V === Z) return Q.a = 1, Q.b = 0, Q.c = 0, Q.d = 1, Q.tx = 0, Q.ty = 0, void 0;
            V = V || 0;
            var U = n(V),
                P = k(V);
            return D = D || 1, I = I || 1, Q.a = P * D, Q.b = U * D, Q.c = -U * I, Q.d = P * I, Q.tx = u || 0, Q.ty = T || 0, Q
        }, Np.prototype.apply = function (h, T) {
            T = T || new Xi;
            var D = h.x,
                j = h.y;
            return T.x = this.a * D + this.c * j + this.tx, T.y = this.b * D + this.d * j + this.ty, T
        }, Np.prototype.applyInverse = function (p, o) {
            o = o || new Xi;
            var Q = 1 / (this.a * this.d + this.c * -this.b),
                A = p.x,
                c = p.y;
            return o.x = this.d * Q * A + -this.c * Q * c + (this.ty * this.c - this.tx * this.d) * Q, o.y = this.a * Q * c + -this.b * Q * A + (-this.ty * this.a + this.tx * this.b) * Q, o
        }, Np.prototype.translate = function (D, b) {
            return this.tx += D, this.ty += b, this
        }, Np.prototype.scale = function (b, o) {
            return this.a *= b, this.d *= o, this.c *= b, this.b *= o, this.tx *= b, this.ty *= o, this
        }, Np.prototype.rotate = function (V) {
            var Y = Math.cos(V),
                $ = Math.sin(V),
                F = this.a,
                C = this.c,
                b = this.tx;
            return this.a = F * Y - this.b * $, this.b = F * $ + this.b * Y, this.c = C * Y - this.d * $, this.d = C * $ + this.d * Y, this.tx = b * Y - this.ty * $, this.ty = b * $ + this.ty * Y, this
        }, Np.prototype.appendTranslate = function (c, Y) {
            return this.tx += this.a * c + this.c * Y, this.ty += this.b * c + this.d * Y, this
        }, Np.prototype.appendScale = function (L, I) {
            return this.a *= L, this.d *= I, this.c *= I, this.b *= L, this
        }, Np.prototype.appendRotate = function (J) {
            if (!J) return this;
            var K = Math.cos(J),
                X = Math.sin(J),
                w = this.a,
                h = this.b;
            return this.a = w * K + this.c * X, this.b = h * K + this.d * X, this.c = -w * X + this.c * K, this.d = -h * X + this.d * K, this
        }, Np.prototype.append = function (X) {
            var n = this.a,
                W = this.b,
                P = this.c,
                s = this.d;
            return this.a = X.a * n + X.b * P, this.b = X.a * W + X.b * s, this.c = X.c * n + X.d * P, this.d = X.c * W + X.d * s, this.tx = X.tx * n + X.ty * P + this.tx, this.ty = X.tx * W + X.ty * s + this.ty, this
        }, Np.prototype.setTransform = function (z, d, q, S, L, n, E, Y, K) {
            var J, A, Q, N, P, T, e, a, r, Z;
            return P = Math.sin(E), T = Math.cos(E), e = Math.cos(K), a = Math.sin(K), r = -Math.sin(Y), Z = Math.cos(Y), J = T * L, A = P * L, Q = -P * n, N = T * n, this.a = e * J + a * Q, this.b = e * A + a * N, this.c = r * J + Z * Q, this.d = r * A + Z * N, this.tx = z + (q * J + S * Q), this.ty = d + (q * A + S * N), this
        }, Np.prototype.prepend = function (d) {
            var v = this.tx;
            if (1 !== d.a || 0 !== d.b || 0 !== d.c || 1 !== d.d) {
                var y = this.a,
                    w = this.c;
                this.a = y * d.a + this.b * d.c, this.b = y * d.b + this.b * d.d, this.c = w * d.a + this.d * d.c, this.d = w * d.b + this.d * d.d
            }
            return this.tx = v * d.a + this.ty * d.c + d.tx, this.ty = v * d.b + this.ty * d.d + d.ty, this
        }, Np.prototype.transform = Np.prototype.prepend, Np.prototype.invert = function () {
            var M = this.a,
                R = this.b,
                Y = this.c,
                o = this.d,
                a = this.tx,
                h = M * o - R * Y;
            return this.a = o / h, this.b = -R / h, this.c = -Y / h, this.d = M / h, this.tx = (Y * this.ty - o * a) / h, this.ty = -(M * this.ty - R * a) / h, this
        }, Np.prototype.identity = function () {
            return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.tx = 0, this.ty = 0, this
        }, Np.prototype.clone = function () {
            var o = new Np;
            return o.a = this.a, o.b = this.b, o.c = this.c, o.d = this.d, o.tx = this.tx, o.ty = this.ty, o
        }, Np.prototype.copy = function (d) {
            return d.a = this.a, d.b = this.b, d.c = this.c, d.d = this.d, d.tx = this.tx, d.ty = this.ty, d
        }, Np.prototype.tf = function (m, h) {
            1 === arguments.length && (h = m.y, m = m.x);
            var J = this;
            return {
                x: J.a * m + J.c * h + J.tx,
                y: J.b * m + J.d * h + J.ty
            }
        }, Np.prototype.tfi = function (x, q) {
            1 === arguments.length && (q = x.y, x = x.x);
            var C = this,
                j = 1 / (C.a * C.d + C.c * -C.b);
            return {
                x: C.d * j * x + -C.c * j * q + (C.ty * C.c - C.tx * C.d) * j,
                y: C.a * j * q + -C.b * j * x + (-C.ty * C.a + C.tx * C.b) * j
            }
        }, Np.IDENTITY = new Np, Np.TEMP_MATRIX = new Np;
        var fs = O.Math.Quaternion = function (q, I, f, h) {
            this.set(q, I, f, h)
        };
        o.assign(fs.prototype, {
            set: function (X, R, C, j) {
                var f = this;
                return f._x = X || 0, f._y = R || 0, f._z = C || 0, f._w = j !== Z ? j : 1, f
            }, clone: function () {
                return new this.constructor(this._x, this._y, this._z, this._w)
            }, copy: function (u) {
                var t = this;
                return t._x = u._x, t._y = u._y, t._z = u._z, t._w = u._w, t
            }, inverse: function () {
                return this.conjugate()
            }, conjugate: function () {
                return this._x *= -1, this._y *= -1, this._z *= -1, this
            }, dot: function (N) {
                return this._x * N._x + this._y * N._y + this._z * N._z + this._w * N._w
            }, lengthSq: function () {
                return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w
            }, length: function () {
                return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w)
            }, normalize: function () {
                var J = this.length();
                return 0 === J ? (this._x = 0, this._y = 0, this._z = 0, this._w = 1) : (J = 1 / J, this._x = this._x * J, this._y = this._y * J, this._z = this._z * J, this._w = this._w * J), this
            }, fromArray: function (S, M) {
                M === Z && (M = 0);
                var g = this;
                return g._x = S[M], g._y = S[M + 1], g._z = S[M + 2], g._w = S[M + 3], this
            }, slerp: function (W, L) {
                if (0 === L) return this;
                if (1 === L) return this.copy(W);
                var c = this._x,
                    Z = this._y,
                    p = this._z,
                    E = this._w,
                    O = E * W._w + c * W._x + Z * W._y + p * W._z;
                if (0 > O ? (this._w = -W._w, this._x = -W._x, this._y = -W._y, this._z = -W._z, O = -O) : this.copy(W), O >= 1) return this._w = E, this._x = c, this._y = Z, this._z = p, this;
                var G = Math.sqrt(1 - O * O);
                if (Math.abs(G) < .001) return this._w = .5 * (E + this._w), this._x = .5 * (c + this._x), this._y = .5 * (Z + this._y), this._z = .5 * (p + this._z), this;
                var _ = Math.atan2(G, O),
                    Q = Math.sin((1 - L) * _) / G,
                    v = Math.sin(L * _) / G;
                return this._w = E * Q + this._w * v, this._x = c * Q + this._x * v, this._y = Z * Q + this._y * v, this._z = p * Q + this._z * v, this
            }, setFromAxisAngle: function (r, B) {
                var W = B / 2,
                    A = Math.sin(W);
                return this._x = r.x * A, this._y = r.y * A, this._z = r.z * A, this._w = Math.cos(W), this
            }, setFromEuler: function (m) {
                var R = m._x,
                    C = m._y,
                    y = m._z,
                    v = m._order,
                    B = Math.cos,
                    g = Math.sin,
                    E = B(R / 2),
                    Z = B(C / 2),
                    w = B(y / 2),
                    T = g(R / 2),
                    u = g(C / 2),
                    r = g(y / 2);
                return "XYZ" === v ? (this._x = T * Z * w + E * u * r, this._y = E * u * w - T * Z * r, this._z = E * Z * r + T * u * w, this._w = E * Z * w - T * u * r) : "YXZ" === v ? (this._x = T * Z * w + E * u * r, this._y = E * u * w - T * Z * r, this._z = E * Z * r - T * u * w, this._w = E * Z * w + T * u * r) : "ZXY" === v ? (this._x = T * Z * w - E * u * r, this._y = E * u * w + T * Z * r, this._z = E * Z * r + T * u * w, this._w = E * Z * w - T * u * r) : "ZYX" === v ? (this._x = T * Z * w - E * u * r, this._y = E * u * w + T * Z * r, this._z = E * Z * r - T * u * w, this._w = E * Z * w + T * u * r) : "YZX" === v ? (this._x = T * Z * w + E * u * r, this._y = E * u * w + T * Z * r, this._z = E * Z * r - T * u * w, this._w = E * Z * w - T * u * r) : "XZY" === v && (this._x = T * Z * w - E * u * r, this._y = E * u * w - T * Z * r, this._z = E * Z * r + T * u * w, this._w = E * Z * w + T * u * r), this
            }, setFromRotationMatrix: function (m) {
                var S, k = m.el,
                    t = k[0],
                    Z = k[4],
                    F = k[8],
                    G = k[1],
                    $ = k[5],
                    W = k[9],
                    R = k[2],
                    Q = k[6],
                    x = k[10],
                    A = t + $ + x;
                return A > 0 ? (S = .5 / Math.sqrt(A + 1), this._w = .25 / S, this._x = (Q - W) * S, this._y = (F - R) * S, this._z = (G - Z) * S) : t > $ && t > x ? (S = 2 * Math.sqrt(1 + t - $ - x), this._w = (Q - W) / S, this._x = .25 * S, this._y = (Z + G) / S, this._z = (F + R) / S) : $ > x ? (S = 2 * Math.sqrt(1 + $ - t - x), this._w = (F - R) / S, this._x = (Z + G) / S, this._y = .25 * S, this._z = (W + Q) / S) : (S = 2 * Math.sqrt(1 + x - t - $), this._w = (G - Z) / S, this._x = (F + R) / S, this._y = (W + Q) / S, this._z = .25 * S), this
            }, setFromToVectors: function () {
                var a, w;
                return function (d, M) {
                    return a === Z && (a = new tl), w = d.dot(M) + 1, 1e-7 > w ? (w = 0, Math.abs(d.x) > Math.abs(d.z) ? a.set(-d.y, d.x, 0) : a.set(0, -d.z, d.y)) : a.crossVectors(d, M), this._x = a.x, this._y = a.y, this._z = a.z, this._w = w, this.normalize()
                }
            }(),
            setFromUnitVectors: function () {
                var P, Q, h = 1e-6;
                return function (g, u) {
                    return P === Z && (P = new tl), Q = g.dot(u) + 1, h > Q ? (Q = 0, Math.abs(g.x) > Math.abs(g.z) ? P.set(-g.y, g.x, 0) : P.set(0, -g.z, g.y)) : P.crossVectors(g, u), this._x = P.x, this._y = P.y, this._z = P.z, this._w = Q, this.normalize()
                }
            }(),
            multiply: function (S) {
                return this.multiplyQuaternions(this, S)
            }, premultiply: function (k) {
                return this.multiplyQuaternions(k, this)
            }, multiplyQuaternions: function (y, W) {
                var z = y._x,
                    L = y._y,
                    r = y._z,
                    N = y._w,
                    o = W._x,
                    p = W._y,
                    O = W._z,
                    Y = W._w;
                return this._x = z * Y + N * o + L * O - r * p, this._y = L * Y + N * p + r * o - z * O, this._z = r * Y + N * O + z * p - L * o, this._w = N * Y - z * o - L * p - r * O, this
            }
        });
        var ye = O.Math.Vector4 = function (F, H, L, N) {
            this.x = F || 0, this.y = H || 0, this.z = L || 0, this.w = N !== Z ? N : 1
        };
        o.assign(ye.prototype, {
            isVector4: !0,
            set: function (r, B, R, s) {
                return this.x = r, this.y = B, this.z = R, this.w = s, this
            }, setScalar: function (R) {
                return this.x = R, this.y = R, this.z = R, this.w = R, this
            }, setX: function (F) {
                return this.x = F, this
            }, setY: function (b) {
                return this.y = b, this
            }, setZ: function (R) {
                return this.z = R, this
            }, setW: function (r) {
                return this.w = r, this
            }, setComponent: function (N, V) {
                switch (N) {
                    case 0:
                        this.x = V;
                        break;
                    case 1:
                        this.y = V;
                        break;
                    case 2:
                        this.z = V;
                        break;
                    case 3:
                        this.w = V;
                        break;
                    default:
                        throw new Error("index is out of range: " + N)
                }
                return this
            }, getComponent: function (y) {
                switch (y) {
                    case 0:
                        return this.x;
                    case 1:
                        return this.y;
                    case 2:
                        return this.z;
                    case 3:
                        return this.w;
                    default:
                        throw new Error("index is out of range: " + y)
                }
            }, clone: function () {
                return new this.constructor(this.x, this.y, this.z, this.w)
            }, copy: function (i) {
                return this.x = i.x, this.y = i.y, this.z = i.z, this.w = i.w !== Z ? i.w : 1, this
            }, add: function (S, $) {
                return $ !== Z ? this.addVectors(S, $) : (this.x += S.x, this.y += S.y, this.z += S.z, this.w += S.w, this)
            }, addScalar: function (d) {
                return this.x += d, this.y += d, this.z += d, this.w += d, this
            }, addVectors: function (J, D) {
                return this.x = J.x + D.x, this.y = J.y + D.y, this.z = J.z + D.z, this.w = J.w + D.w, this
            }, addScaledVector: function (v, d) {
                return this.x += v.x * d, this.y += v.y * d, this.z += v.z * d, this.w += v.w * d, this
            }, sub: function (k, l) {
                return l !== Z ? this.subVectors(k, l) : (this.x -= k.x, this.y -= k.y, this.z -= k.z, this.w -= k.w, this)
            }, subScalar: function (f) {
                return this.x -= f, this.y -= f, this.z -= f, this.w -= f, this
            }, subVectors: function ($, y) {
                return this.x = $.x - y.x, this.y = $.y - y.y, this.z = $.z - y.z, this.w = $.w - y.w, this
            }, multiplyScalar: function (m) {
                return this.x *= m, this.y *= m, this.z *= m, this.w *= m, this
            }, applyMatrix4: function (M) {
                var r = this.x,
                    o = this.y,
                    v = this.z,
                    X = this.w,
                    E = M.el;
                return this.x = E[0] * r + E[4] * o + E[8] * v + E[12] * X, this.y = E[1] * r + E[5] * o + E[9] * v + E[13] * X, this.z = E[2] * r + E[6] * o + E[10] * v + E[14] * X, this.w = E[3] * r + E[7] * o + E[11] * v + E[15] * X, this
            }, divideScalar: function (O) {
                return this.multiplyScalar(1 / O)
            }, setAxisAngleFromQuaternion: function (p) {
                this.w = 2 * Math.acos(p.w);
                var z = Math.sqrt(1 - p.w * p.w);
                return 1e-4 > z ? (this.x = 1, this.y = 0, this.z = 0) : (this.x = p.x / z, this.y = p.y / z, this.z = p.z / z), this
            }, setAxisAngleFromRotationMatrix: function (c) {
                var S, z, k, _, i = .01,
                    I = .1,
                    u = c.el,
                    P = u[0],
                    g = u[4],
                    L = u[8],
                    o = u[1],
                    f = u[5],
                    X = u[9],
                    s = u[2],
                    x = u[6],
                    q = u[10];
                if (Math.abs(g - o) < i && Math.abs(L - s) < i && Math.abs(X - x) < i) {
                    if (Math.abs(g + o) < I && Math.abs(L + s) < I && Math.abs(X + x) < I && Math.abs(P + f + q - 3) < I) return this.set(1, 0, 0, 0), this;
                    S = Math.PI;
                    var $ = (P + 1) / 2,
                        W = (f + 1) / 2,
                        C = (q + 1) / 2,
                        Y = (g + o) / 4,
                        H = (L + s) / 4,
                        T = (X + x) / 4;
                    return $ > W && $ > C ? i > $ ? (z = 0, k = .707106781, _ = .707106781) : (z = Math.sqrt($), k = Y / z, _ = H / z) : W > C ? i > W ? (z = .707106781, k = 0, _ = .707106781) : (k = Math.sqrt(W), z = Y / k, _ = T / k) : i > C ? (z = .707106781, k = .707106781, _ = 0) : (_ = Math.sqrt(C), z = H / _, k = T / _), this.set(z, k, _, S), this
                }
                var M = Math.sqrt((x - X) * (x - X) + (L - s) * (L - s) + (o - g) * (o - g));
                return Math.abs(M) < .001 && (M = 1), this.x = (x - X) / M, this.y = (L - s) / M, this.z = (o - g) / M, this.w = Math.acos((P + f + q - 1) / 2), this
            }, min: function (Y) {
                return this.x = Math.min(this.x, Y.x), this.y = Math.min(this.y, Y.y), this.z = Math.min(this.z, Y.z), this.w = Math.min(this.w, Y.w), this
            }, max: function (f) {
                return this.x = Math.max(this.x, f.x), this.y = Math.max(this.y, f.y), this.z = Math.max(this.z, f.z), this.w = Math.max(this.w, f.w), this
            }, clamp: function (k, j) {
                return this.x = Math.max(k.x, Math.min(j.x, this.x)), this.y = Math.max(k.y, Math.min(j.y, this.y)), this.z = Math.max(k.z, Math.min(j.z, this.z)), this.w = Math.max(k.w, Math.min(j.w, this.w)), this
            }, clampScalar: function () {
                var v, L;
                return function (k, m) {
                    return v === Z && (v = new ye, L = new ye), v.set(k, k, k, k), L.set(m, m, m, m), this.clamp(v, L)
                }
            }(),
            clampLength: function (r, I) {
                var R = this.length();
                return this.divideScalar(R || 1).multiplyScalar(Math.max(r, Math.min(I, R)))
            }, floor: function () {
                return this.x = Math.floor(this.x), this.y = Math.floor(this.y), this.z = Math.floor(this.z), this.w = Math.floor(this.w), this
            }, ceil: function () {
                return this.x = Math.ceil(this.x), this.y = Math.ceil(this.y), this.z = Math.ceil(this.z), this.w = Math.ceil(this.w), this
            }, round: function () {
                return this.x = Math.round(this.x), this.y = Math.round(this.y), this.z = Math.round(this.z), this.w = Math.round(this.w), this
            }, roundToZero: function () {
                return this.x = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x), this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y), this.z = this.z < 0 ? Math.ceil(this.z) : Math.floor(this.z), this.w = this.w < 0 ? Math.ceil(this.w) : Math.floor(this.w), this
            }, negate: function () {
                return this.x = -this.x, this.y = -this.y, this.z = -this.z, this.w = -this.w, this
            }, dot: function (H) {
                return this.x * H.x + this.y * H.y + this.z * H.z + this.w * H.w
            }, lengthSq: function () {
                return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w
            }, length: function () {
                return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w)
            }, manhattanLength: function () {
                return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w)
            }, normalize: function () {
                return this.divideScalar(this.length() || 1)
            }, setLength: function (h) {
                return this.normalize().multiplyScalar(h)
            }, lerp: function (I, X) {
                return this.x += (I.x - this.x) * X, this.y += (I.y - this.y) * X, this.z += (I.z - this.z) * X, this.w += (I.w - this.w) * X, this
            }, lerpVectors: function (W, j, q) {
                return this.subVectors(j, W).multiplyScalar(q).add(W)
            }, equals: function (O) {
                return O.x === this.x && O.y === this.y && O.z === this.z && O.w === this.w
            }, fromArray: function (E, c) {
                return c === Z && (c = 0), this.x = E[c], this.y = E[c + 1], this.z = E[c + 2], this.w = E[c + 3], this
            }, toArray: function (K, E) {
                return K === Z && (K = []), E === Z && (E = 0), K[E] = this.x, K[E + 1] = this.y, K[E + 2] = this.z, K[E + 3] = this.w, K
            }, fromBufferAttribute: function (O, S) {
                return this.x = O.getX(S), this.y = O.getY(S), this.z = O.getZ(S), this.w = O.getW(S), this
            }
        });
        var tl = O.Math.Vector3 = function (F, m, V) {
            F === Z ? (this.x = 0, this.y = 0, this.z = 0) : "object" == typeof F ? this.copy(F) : this.set(F, m == Z ? F : m, V == Z ? F : V)
        };
        o.assign(tl.prototype, {
            isNaN: function () {
                return isNaN(this.x) || isNaN(this.y) || isNaN(this.z)
            }, set: function (T, g, X) {
                return this.x = T, this.y = g, this.z = X, this
            }, equals: function (C) {
                return C && this.x === C.x && this.y === C.y && this.z === C.z
            }, setScalar: function (A) {
                return this.x = A, this.y = A, this.z = A, this
            }, setX: function (e) {
                return this.x = e, this
            }, setY: function (X) {
                return this.y = X, this
            }, setZ: function (s) {
                return this.z = s, this
            }, clone: function () {
                return new this.constructor(this.x, this.y, this.z)
            }, copy: function (U) {
                return U.x === Z ? (this.x = U[0], this.y = U[1], this.z = U[2]) : (this.x = U.x, this.y = U.y, this.z = U.z || 0), this
            }, add: function (i) {
                return this.x += i.x, this.y += i.y, this.z += i.z, this
            }, addScalar: function (E) {
                return this.x += E, this.y += E, this.z += E, this
            }, addVectors: function (n, b) {
                return this.x = n.x + b.x, this.y = n.y + b.y, this.z = n.z + b.z, this
            }, addScaledVector: function (t, p) {
                return this.x += t.x * p, this.y += t.y * p, this.z += t.z * p, this
            }, sub: function (k) {
                return this.x -= k.x, this.y -= k.y, this.z -= k.z, this
            }, subScalar: function (X) {
                return this.x -= X, this.y -= X, this.z -= X, this
            }, subVectors: function (x, $) {
                return this.x = x.x - $.x, this.y = x.y - $.y, this.z = x.z - $.z, this
            }, divide: function (A) {
                return this.x /= A.x, this.y /= A.y, this.z /= A.z, this
            }, multiply: function (K) {
                return this.x *= K.x, this.y *= K.y, this.z *= K.z, this
            }, multiplyScalar: function (m) {
                return this.x *= m, this.y *= m, this.z *= m, this
            }, distanceTo: function (i) {
                return Math.sqrt(this.distanceToSquared(i))
            }, distanceToSquared: function (m) {
                var i = this.x - m.x,
                    Z = this.y - m.y,
                    G = this.z - m.z;
                return i * i + Z * Z + G * G
            }, distanceToSquared2: function (f) {
                var h = this.x - f[0],
                    Z = this.y - f[1],
                    J = this.z - f[2];
                return h * h + Z * Z + J * J
            }, divideVectors: function (X, M) {
                return this.x = X.x / M.x, this.y = X.y / M.y, this.z = X.z / M.z, this
            }, multiplyVectors: function (Z, H) {
                return this.x = Z.x * H.x, this.y = Z.y * H.y, this.z = Z.z * H.z, this
            }, transformDirection: function (L) {
                var G = this.x,
                    i = this.y,
                    Y = this.z,
                    m = L.el;
                return this.x = m[0] * G + m[4] * i + m[8] * Y, this.y = m[1] * G + m[5] * i + m[9] * Y, this.z = m[2] * G + m[6] * i + m[10] * Y, this.normalize()
            }, applyAxisAngle: function () {
                var i = new fs;
                return function (Q, u) {
                    return this.applyQuaternion(i.setFromAxisAngle(Q, u))
                }
            }(),
            applyEuler: function () {
                var n = new fs;
                return function (M) {
                    return this.applyQuaternion(n.setFromEuler(M))
                }
            }(),
            applyQuaternion: function (C) {
                var X = this.x,
                    h = this.y,
                    l = this.z,
                    P = C._x,
                    o = C._y,
                    R = C._z,
                    d = C._w,
                    q = d * X + o * l - R * h,
                    i = d * h + R * X - P * l,
                    z = d * l + P * h - o * X,
                    j = -P * X - o * h - R * l;
                return this.x = q * d + j * -P + i * -R - z * -o, this.y = i * d + j * -o + z * -P - q * -R, this.z = z * d + j * -R + q * -o - i * -P, this
            }, applyMatrix4: function (l) {
                var v = this.x,
                    C = this.y,
                    W = this.z,
                    R = l.el,
                    K = 1 / (R[3] * v + R[7] * C + R[11] * W + R[15]);
                return this.x = (R[0] * v + R[4] * C + R[8] * W + R[12]) * K, this.y = (R[1] * v + R[5] * C + R[9] * W + R[13]) * K, this.z = (R[2] * v + R[6] * C + R[10] * W + R[14]) * K, this
            }, applyMatrix3: function (q) {
                var K = this.x,
                    I = this.y,
                    U = this.z,
                    J = q.el;
                return this.x = J[0] * K + J[3] * I + J[6] * U, this.y = J[1] * K + J[4] * I + J[7] * U, this.z = J[2] * K + J[5] * I + J[8] * U, this
            }, negate: function () {
                return this.x = -this.x, this.y = -this.y, this.z = -this.z, this
            }, reflect: function () {
                var F = new tl;
                return function (w) {
                    return this.sub(F.copy(w).multiplyScalar(2 * this.dot(w)))
                }
            }(),
            dot: function (P) {
                return this.x * P.x + this.y * P.y + this.z * P.z
            }, lengthSq: function () {
                return this.x * this.x + this.y * this.y + this.z * this.z
            }, length: function () {
                return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z)
            }, manhattanLength: function () {
                return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z)
            }, normalize: function () {
                var W = this.length();
                return W ? this.multiplyScalar(1 / W) : this
            }, setLength: function (G) {
                return this.normalize().multiplyScalar(G)
            }, fromArray: function (v, O) {
                return O === Z && (O = 0), this.x = v[O], this.y = v[O + 1], this.z = v[O + 2], this
            }, toArray: function (R, X) {
                return R === Z && (R = [0, 0, 0]), X === Z && (X = 0), R[X] = this.x, R[X + 1] = this.y, R[X + 2] = this.z, R
            }, cross: function (M) {
                return this.crossVectors(this, M)
            }, angleTo: function (t) {
                var j = this.dot(t) / Math.sqrt(this.lengthSq() * t.lengthSq());
                return j > 1 || -1 > j ? 0 : Math.acos(j)
            }, lerp: function (Z, J) {
                return this.x += (Z.x - this.x) * J, this.y += (Z.y - this.y) * J, this.z += (Z.z - this.z) * J, this
            }, lerpVectors: function (E, K, y) {
                return this.subVectors(K, E).multiplyScalar(y).add(E)
            }, crossVectors: function (q, O) {
                var R = q.x,
                    H = q.y,
                    C = q.z,
                    F = O.x,
                    z = O.y,
                    L = O.z;
                return this.x = H * L - C * z, this.y = C * F - R * L, this.z = R * z - H * F, this
            }, min: function (J) {
                return this.x = Math.min(this.x, J.x), this.y = Math.min(this.y, J.y), this.z = Math.min(this.z, J.z), this
            }, max: function (W) {
                return this.x = Math.max(this.x, W.x), this.y = Math.max(this.y, W.y), this.z = Math.max(this.z, W.z), this
            }, setFromMatrixPosition: function (F) {
                return this.setFromMatrixColumn(F, 3)
            }, setFromMatrixScale: function (K) {
                var y = this.setFromMatrixColumn(K, 0).length(),
                    s = this.setFromMatrixColumn(K, 1).length(),
                    f = this.setFromMatrixColumn(K, 2).length();
                return this.x = y, this.y = s, this.z = f, this
            }, setFromMatrixColumn: function (r, q) {
                return this.fromArray(r.el, 4 * q)
            }
        });
        var Xi = O.Math.Vector2 = function (C, P, G) {
            "object" == typeof C && (C.x != Z ? (P = C.y, C = C.x, G = C.e) : (G = C[2], P = C[1], C = C[0])), this.set(C || 0, P || 0, G)
        };
        Xi.prototype = {}, Xi.prototype.constructor = Xi, o.defineProperties(Xi.prototype, {
            width: {
                get: function () {
                    return this.x
                }, set: function (p) {
                    this.x = p
                }
            },
            height: {
                get: function () {
                    return this.y
                }, set: function (W) {
                    this.y = W
                }
            }
        }), Xi.prototype.clone = function () {
            return new Xi(this.x, this.y, this.e)
        }, Xi.prototype.copy = function (I) {
            return this.set(I.x, I.y, I.e), this
        }, Xi.prototype.equals = function (R) {
            return R.x === this.x && R.y === this.y
        }, Xi.prototype.set = function (U, w, D) {
            return this.x = U || 0, this.y = w || (0 !== w ? this.x : 0), D != Z && (this.e = D), this
        }, Xi.prototype.setScalar = function (y) {
            return this.x = y, this.y = y, this
        }, Xi.prototype.setX = function (b) {
            return this.x = b || 0, this
        }, Xi.prototype.setY = function (A) {
            return this.y = A || 0, this
        }, Xi.prototype.add = function (S) {
            return this.x += S.x, this.y += S.y, this
        }, Xi.prototype.addVectors = function (M, B) {
            return this.x = M.x + B.x, this.y = M.y + B.y, this
        }, Xi.prototype.addScalar = function (X) {
            return this.x += X, this.y += X, this
        }, Xi.prototype.addScaledVector = function (o, p) {
            return this.x += o.x * p, this.y += o.y * p, this
        }, Xi.prototype.sub = function (a) {
            return this.x -= a.x, this.y -= a.y, this
        }, Xi.prototype.subScalar = function (r) {
            return this.x -= r, this.y -= r, this
        }, Xi.prototype.subVectors = function (U, H) {
            return this.x = U.x - H.x, this.y = U.y - H.y, this
        }, Xi.prototype.multiply = function (k) {
            return this.x *= k.x, this.y *= k.y, this
        }, Xi.prototype.multiplyScalar = function (x) {
            return this.x *= x, this.y *= x, this
        }, Xi.prototype.divide = function (K) {
            return this.x /= K.x, this.y /= K.y, this
        }, Xi.prototype.divideScalar = function (H) {
            return this.multiplyScalar(1 / H)
        }, Xi.prototype.min = function (M) {
            return this.x = Math.min(this.x, M.x), this.y = Math.min(this.y, M.y), this
        }, Xi.prototype.max = function (Q) {
            return this.x = Math.max(this.x, Q.x), this.y = Math.max(this.y, Q.y), this
        }, Xi.prototype.fromArray = function (Y, B) {
            return B === Z && (B = 0), this.x = Y[B], this.y = Y[B + 1], this
        }, Xi.prototype.clamp = function (o, f) {
            return this.x = Math.max(o.x, Math.min(f.x, this.x)), this.y = Math.max(o.y, Math.min(f.y, this.y)), this
        }, Xi.prototype.clampScalar = function () {
            var e, c;
            return function (m, _) {
                return e === Z && (e = new Xi, c = new Xi), e.set(m, m), c.set(_, _), this.clamp(e, c)
            }
        }(), Xi.prototype.clampLength = function (e, c) {
            var l = this.length();
            return this.multiplyScalar(Math.max(e, Math.min(c, l)) / l)
        }, Xi.prototype.dot = function (M) {
            return this.x * M.x + this.y * M.y
        }, Xi.prototype.lengthSq = function () {
            return this.x * this.x + this.y * this.y
        }, Xi.prototype.length = function () {
            return Math.sqrt(this.x * this.x + this.y * this.y)
        }, Xi.prototype.normalize = function () {
            return this.divideScalar(this.length())
        }, Xi.prototype.angle = function () {
            var P = Math.atan2(this.y, this.x);
            return 0 > P && (P += 2 * Math.PI), P
        }, Xi.prototype.distanceTo = function ($) {
            return Math.sqrt(this.distanceToSquared($))
        }, Xi.prototype.distanceToSquared = function (F) {
            var o = this.x - F.x,
                v = this.y - F.y;
            return o * o + v * v
        }, Xi.prototype.isNearEnough = function (S) {
            return this.distanceToSquared(S) < 1e-8
        }, Xi.prototype.setLength = function (I) {
            var l = this.length();
            return l ? this.multiplyScalar(I / l) : this
        }, Xi.prototype.lerp = function (u, p) {
            return this.x += (u.x - this.x) * p, this.y += (u.y - this.y) * p, this
        }, Xi.prototype.lerpVectors = function (E, Y, s) {
            return this.subVectors(Y, E).multiplyScalar(s).add(E)
        }, Xi.prototype.rotateAround = function (O, L) {
            var q = O ? O.x : 0,
                A = O ? O.y : 0,
                F = Math.cos(L),
                N = Math.sin(L),
                a = this.x - q,
                c = this.y - A;
            return this.x = a * F - c * N + q, this.y = a * N + c * F + A, this
        };
        var sm = O.Math.Matrix3 = function () {
            this.el = [1, 0, 0, 0, 1, 0, 0, 0, 1]
        };
        o.assign(sm.prototype, {
            isMatrix3: !0,
            set: function (W, D, A, V, T, U, f, $, I) {
                var S = this.el;
                return S[0] = W, S[1] = V, S[2] = f, S[3] = D, S[4] = T, S[5] = $, S[6] = A, S[7] = U, S[8] = I, this
            }, identity: function () {
                return this.set(1, 0, 0, 0, 1, 0, 0, 0, 1), this
            }, clone: function () {
                return (new this.constructor).fromArray(this.el)
            }, copy: function (S) {
                var W = this.el,
                    H = S.el;
                return W[0] = H[0], W[1] = H[1], W[2] = H[2], W[3] = H[3], W[4] = H[4], W[5] = H[5], W[6] = H[6], W[7] = H[7], W[8] = H[8], this
            }, setFromMatrix4: function (P) {
                var M = P.el;
                return this.set(M[0], M[4], M[8], M[1], M[5], M[9], M[2], M[6], M[10]), this
            }, applyToBufferAttribute: function () {
                var N = new tl;
                return function (U) {
                    for (var b = 0, j = U.count; j > b; b++) N.x = U.getX(b), N.y = U.getY(b), N.z = U.getZ(b), N.applyMatrix3(this), U.setXYZ(b, N.x, N.y, N.z);
                    return U
                }
            }(),
            multiply: function (A) {
                return this.multiplyMatrices(this, A)
            }, premultiply: function (K) {
                return this.multiplyMatrices(K, this)
            }, multiplyMatrices: function (B, t) {
                var r = B.el,
                    A = t.el,
                    W = this.el,
                    N = r[0],
                    C = r[3],
                    S = r[6],
                    o = r[1],
                    l = r[4],
                    X = r[7],
                    F = r[2],
                    P = r[5],
                    j = r[8],
                    D = A[0],
                    T = A[3],
                    J = A[6],
                    e = A[1],
                    k = A[4],
                    R = A[7],
                    s = A[2],
                    Q = A[5],
                    v = A[8];
                return W[0] = N * D + C * e + S * s, W[3] = N * T + C * k + S * Q, W[6] = N * J + C * R + S * v, W[1] = o * D + l * e + X * s, W[4] = o * T + l * k + X * Q, W[7] = o * J + l * R + X * v, W[2] = F * D + P * e + j * s, W[5] = F * T + P * k + j * Q, W[8] = F * J + P * R + j * v, this
            }, multiplyScalar: function (v) {
                var p = this.el;
                return p[0] *= v, p[3] *= v, p[6] *= v, p[1] *= v, p[4] *= v, p[7] *= v, p[2] *= v, p[5] *= v, p[8] *= v, this
            }, determinant: function () {
                var j = this.el,
                    l = j[0],
                    q = j[1],
                    B = j[2],
                    n = j[3],
                    t = j[4],
                    s = j[5],
                    N = j[6],
                    H = j[7],
                    m = j[8];
                return l * t * m - l * s * H - q * n * m + q * s * N + B * n * H - B * t * N
            }, getInverse: function (t) {
                var L = t.el,
                    M = this.el,
                    f = L[0],
                    D = L[1],
                    i = L[2],
                    S = L[3],
                    E = L[4],
                    Q = L[5],
                    o = L[6],
                    j = L[7],
                    c = L[8],
                    B = c * E - Q * j,
                    w = Q * o - c * S,
                    N = j * S - E * o,
                    K = f * B + D * w + i * N;
                if (0 === K) return this.identity();
                var F = 1 / K;
                return M[0] = B * F, M[1] = (i * j - c * D) * F, M[2] = (Q * D - i * E) * F, M[3] = w * F, M[4] = (c * f - i * o) * F, M[5] = (i * S - Q * f) * F, M[6] = N * F, M[7] = (D * o - j * f) * F, M[8] = (E * f - D * S) * F, this
            }, transpose: function () {
                var H, $ = this.el;
                return H = $[1], $[1] = $[3], $[3] = H, H = $[2], $[2] = $[6], $[6] = H, H = $[5], $[5] = $[7], $[7] = H, this
            }, getNormalMatrix: function (w) {
                return this.setFromMatrix4(w).getInverse(this).transpose()
            }, transposeIntoArray: function (v) {
                var B = this.el;
                return v[0] = B[0], v[1] = B[3], v[2] = B[6], v[3] = B[1], v[4] = B[4], v[5] = B[7], v[6] = B[2], v[7] = B[5], v[8] = B[8], this
            }, setUvTransform: function (r, H, h, R, f, K, P) {
                var i = Math.cos(f),
                    Y = Math.sin(f);
                this.set(h * i, h * Y, -h * (i * K + Y * P) + K + r, -R * Y, R * i, -R * (-Y * K + i * P) + P + H, 0, 0, 1)
            }, scale: function (p, g) {
                var H = this.el;
                return H[0] *= p, H[3] *= p, H[6] *= p, H[1] *= g, H[4] *= g, H[7] *= g, this
            }, rotate: function (W) {
                var R = Math.cos(W),
                    J = Math.sin(W),
                    r = this.el,
                    g = r[0],
                    O = r[3],
                    Y = r[6],
                    w = r[1],
                    c = r[4],
                    _ = r[7];
                return r[0] = R * g + J * w, r[3] = R * O + J * c, r[6] = R * Y + J * _, r[1] = -J * g + R * w, r[4] = -J * O + R * c, r[7] = -J * Y + R * _, this
            }, translate: function (t, M) {
                var o = this.el;
                return o[0] += t * o[2], o[3] += t * o[5], o[6] += t * o[8], o[1] += M * o[2], o[4] += M * o[5], o[7] += M * o[8], this
            }, equals: function (z) {
                for (var M = this.el, Q = z.el, V = 0; 9 > V; V++)
                    if (M[V] !== Q[V]) return !1;
                return !0
            }, fromArray: function (X, J) {
                J === Z && (J = 0);
                for (var j = 0; 9 > j; j++) this.el[j] = X[j + J];
                return this
            }, toArray: function (D, A) {
                D === Z && (D = []), A === Z && (A = 0);
                var P = this.el;
                return D[A] = P[0], D[A + 1] = P[1], D[A + 2] = P[2], D[A + 3] = P[3], D[A + 4] = P[4], D[A + 5] = P[5], D[A + 6] = P[6], D[A + 7] = P[7], D[A + 8] = P[8], D
            }
        });
        var Io = O.Math.Plane = function (s, S) {
            this.normal = s !== Z ? s : new tl(1, 0, 0), this.constant = S !== Z ? S : 0
        };
        o.assign(Io.prototype, {
            set: function (L, G) {
                return this.normal.copy(L), this.constant = G, this
            }, setComponents: function (D, S, E, C) {
                return this.normal.set(D, S, E), this.constant = C, this
            }, setFromNormalAndCoplanarPoint: function (O, e) {
                return this.normal.copy(O), this.constant = -e.dot(this.normal), this
            }, setFromCoplanarPoints: function () {
                var v = new tl,
                    c = new tl;
                return function (Q, e, o) {
                    var j = v.subVectors(o, e).cross(c.subVectors(Q, e)).normalize();
                    return this.setFromNormalAndCoplanarPoint(j, Q), this
                }
            }(),
            clone: function () {
                return (new this.constructor).copy(this)
            }, copy: function (h) {
                return this.normal.copy(h.normal), this.constant = h.constant, this
            }, normalize: function () {
                var V = 1 / this.normal.length();
                return this.normal.multiplyScalar(V), this.constant *= V, this
            }, negate: function () {
                return this.constant *= -1, this.normal.negate(), this
            }, distanceToPoint: function (Q) {
                return this.normal.dot(Q) + this.constant
            }, distanceToSphere: function (r) {
                return this.distanceToPoint(r.center) - r.radius
            }, projectPoint: function (X, R) {
                return R === Z && (R = new tl), R.copy(this.normal).multiplyScalar(-this.distanceToPoint(X)).add(X)
            }, intersectLine: function () {
                var s = new tl;
                return function (r, R) {
                    R === Z && (R = new tl);
                    var j = r.delta(s),
                        L = this.normal.dot(j);
                    if (0 === L) return 0 === this.distanceToPoint(r.start) ? R.copy(r.start) : Z;
                    var V = -(r.start.dot(this.normal) + this.constant) / L;
                    return 0 > V || V > 1 ? Z : R.copy(j).multiplyScalar(V).add(r.start)
                }
            }(),
            intersectsLine: function (D) {
                var x = this.distanceToPoint(D.start),
                    r = this.distanceToPoint(D.end);
                return 0 > x && r > 0 || 0 > r && x > 0
            }, intersectsBox: function (K) {
                return K.intersectsPlane(this)
            }, intersectsSphere: function (L) {
                return L.intersectsPlane(this)
            }, coplanarPoint: function (V) {
                return V === Z && (V = new tl), V.copy(this.normal).multiplyScalar(-this.constant)
            }, applyMatrix4: function () {
                var C = new tl,
                    i = new sm;
                return function (X, N) {
                    var $ = N || i.getNormalMatrix(X),
                        R = this.coplanarPoint(C).applyMatrix4(X),
                        j = this.normal.applyMatrix3($).normalize();
                    return this.constant = -R.dot(j), this
                }
            }(),
            translate: function (Y) {
                return this.constant -= Y.dot(this.normal), this
            }, equals: function (v) {
                return v.normal.equals(this.normal) && v.constant === this.constant
            }
        });
        var Qi = O.Math.Ray = function (I, V) {
            this.origin = I !== Z ? I.clone() : new tl, this.direction = V !== Z ? V.clone() : new tl
        };
        o.assign(Qi.prototype, {
            set: function (K, n) {
                return this.origin.copy(K), this.direction.copy(n), this
            }, clone: function () {
                return (new this.constructor).copy(this)
            }, copy: function (T) {
                return this.origin.copy(T.origin), this.direction.copy(T.direction), this.maxHitLen = T.maxHitLen, this
            }, at: function (n, r) {
                var I = r || new tl;
                return I.copy(this.direction).multiplyScalar(n).add(this.origin)
            }, setMaxHitLength: function ($) {
                this.maxHitLen = $
            }, lookAt: function (o) {
                return this.direction.copy(o).sub(this.origin).normalize(), this
            }, applyMatrix4: function (U) {
                var i = this.maxHitLen;
                if (i) {
                    var L = this.direction.clone().multiplyScalar(i).add(this.origin);
                    L.applyMatrix4(U)
                }
                return this.origin.applyMatrix4(U), this.direction.transformDirection(U), i && (this.maxHitLen = this.origin.distanceTo(L)), this
            }, intersectSphere: function () {
                var s = new tl;
                return function (h, K) {
                    s.subVectors(h.center, this.origin);
                    var m = s.dot(this.direction),
                        T = s.dot(s) - m * m,
                        I = h.radius * h.radius;
                    if (T > I) return null;
                    var i = Math.sqrt(I - T),
                        Y = m - i,
                        y = m + i;
                    return 0 > Y && 0 > y ? null : 0 > Y ? this.at(y, K) : this.at(Y, K)
                }
            }(),
            intersectEllipsoid: function () {
                var P = new tl,
                    A = new tl;
                return function (s, i) {
                    P.subVectors(s.center, this.origin), P.divide(s.radius), A.divideVectors(this.direction, s.radius);
                    var J = A.lengthSq(),
                        I = P.dot(A),
                        r = P.dot(P) * J - I * I;
                    if (r > J) return null;
                    var H = Math.sqrt(J - r),
                        l = (I - H) / J,
                        U = (I + H) / J;
                    return 0 > l && 0 > U ? null : 0 > l ? this.at(U, i) : this.at(l, i)
                }
            }(),
            intersectBox: function (P, y) {
                var T, M, t, w, Q, q, e = 1 / this.direction.x,
                    $ = 1 / this.direction.y,
                    u = 1 / this.direction.z,
                    z = this.origin;
                if (e >= 0 ? (T = (P.min.x - z.x) * e, M = (P.max.x - z.x) * e) : (T = (P.max.x - z.x) * e, M = (P.min.x - z.x) * e), $ >= 0 ? (t = (P.min.y - z.y) * $, w = (P.max.y - z.y) * $) : (t = (P.max.y - z.y) * $, w = (P.min.y - z.y) * $), T > w || t > M) return null;
                if ((t > T || T !== T) && (T = t), (M > w || M !== M) && (M = w), u >= 0 ? (Q = (P.min.z - z.z) * u, q = (P.max.z - z.z) * u) : (Q = (P.max.z - z.z) * u, q = (P.min.z - z.z) * u), T > q || Q > M) return null;
                if ((Q > T || T !== T) && (T = Q), (M > q || M !== M) && (M = q), 0 > M) return null;
                var c = T >= 0 ? T : M,
                    o = this.maxHitLen;
                return o && c > o ? null : this.at(c, y)
            }, intersectTriangle: function () {
                var D = new tl,
                    L = new tl,
                    n = new tl,
                    H = new tl;
                return function (E, u, s, d, x) {
                    L.subVectors(u, E), n.subVectors(s, E), H.crossVectors(L, n);
                    var w, b = this.direction.dot(H);
                    if (b > 0) {
                        if (d) return null;
                        w = 1
                    } else {
                        if (!(0 > b)) return null;
                        w = -1, b = -b
                    }
                    D.subVectors(this.origin, E);
                    var B = w * this.direction.dot(n.crossVectors(D, n));
                    if (0 > B) return null;
                    var M = w * this.direction.dot(L.cross(D));
                    if (0 > M || B + M > b) return null;
                    var y = -w * D.dot(H);
                    if (0 > y) return null;
                    var z = y / b,
                        p = this.maxHitLen;
                    return p && z > p ? null : this.at(z, x)
                }
            }()
        });
        var Hi = O.Math.Box3 = function (i, V) {
            this.min = i !== Z ? i : new tl(1 / 0, 1 / 0, 1 / 0), this.max = V !== Z ? V : new tl(-1 / 0, -1 / 0, -1 / 0)
        };
        o.assign(Hi.prototype, {
            set: function (E, p) {
                return this.min.copy(E), this.max.copy(p), this
            }, setFromArray: function ($) {
                for (var n = 1 / 0, P = 1 / 0, L = 1 / 0, V = -1 / 0, l = -1 / 0, Y = -1 / 0, v = 0, D = $.length; D > v; v += 3) {
                    var u = $[v],
                        T = $[v + 1],
                        Q = $[v + 2];
                    n > u && (n = u), P > T && (P = T), L > Q && (L = Q), u > V && (V = u), T > l && (l = T), Q > Y && (Y = Q)
                }
                return this.min.set(n, P, L), this.max.set(V, l, Y), this
            }, setFromPoints: function (p) {
                this.makeEmpty();
                for (var D = 0, O = p.length; O > D; D++) this.expandByPoint(p[D]);
                return this
            }, clone: function () {
                return (new this.constructor).copy(this)
            }, intersectsBox: function (f) {
                return f.max.x < this.min.x || f.min.x > this.max.x || f.max.y < this.min.y || f.min.y > this.max.y || f.max.z < this.min.z || f.min.z > this.max.z ? !1 : !0
            }, copy: function (O) {
                return this.min.copy(O.min), this.max.copy(O.max), this
            }, makeEmpty: function () {
                return this.min.x = this.min.y = this.min.z = 1 / 0, this.max.x = this.max.y = this.max.z = -1 / 0, this
            }, isEmpty: function () {
                return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z
            }, expandByPoint: function (Y) {
                return this.min.min(Y), this.max.max(Y), this
            }, expandByBox: function (p) {
                return this.min.min(p.min), this.max.max(p.max), this
            }, applyMatrix4: function () {
                var w = [new tl, new tl, new tl, new tl, new tl, new tl, new tl, new tl];
                return function (a) {
                    return this.isEmpty() ? this : (w[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(a), w[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(a), w[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(a), w[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(a), w[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(a), w[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(a), w[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(a), w[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(a), this.setFromPoints(w), this)
                }
            }()
        });
        var Mk = O.Math.Sphere = function (V, v) {
            this.center = V !== Z ? V : new tl, this.radius = v !== Z ? v : 0
        };
        o.assign(Mk.prototype, {
            set: function (b, z) {
                return this.center.copy(b), this.radius = z, this
            }, setFromPoints: function () {
                var d = new Hi;
                return function (T, $) {
                    var V = this.center;
                    $ !== Z ? V.copy($) : d.setFromPoints(T).getCenter(V);
                    for (var M = 0, j = 0, H = T.length; H > j; j++) M = Math.max(M, V.distanceToSquared(T[j]));
                    return this.radius = Math.sqrt(M), this
                }
            }(),
            clone: function () {
                return (new this.constructor).copy(this)
            }, copy: function (m) {
                return this.center.copy(m.center), this.radius = m.radius, this
            }, empty: function () {
                return this.radius <= 0
            }, containsPoint: function (Z) {
                return Z.distanceToSquared(this.center) <= this.radius * this.radius
            }, distanceToPoint: function (s) {
                return s.distanceTo(this.center) - this.radius
            }, intersectsSphere: function (y) {
                var Z = this.radius + y.radius;
                return y.center.distanceToSquared(this.center) <= Z * Z
            }, intersectsBox: function (Y) {
                return Y.intersectsSphere(this)
            }, intersectsPlane: function ($) {
                return Math.abs($.distanceToPoint(this.center)) <= this.radius
            }, clampPoint: function (I, y) {
                var L = this.center.distanceToSquared(I);
                return y === Z && (y = new tl), y.copy(I), L > this.radius * this.radius && (y.sub(this.center).normalize(), y.multiplyScalar(this.radius).add(this.center)), y
            }, getBoundingBox: function (X) {
                return X === Z && (X = new Hi), X.set(this.center, this.center), X.expandByScalar(this.radius), X
            }, applyMatrix4: function (L) {
                return this.center.applyMatrix4(L), this.radius = this.radius * L.getMaxScaleOnAxis(), this
            }, translate: function (A) {
                return this.center.add(A), this
            }, equals: function (j) {
                return j.center.equals(this.center) && j.radius === this.radius
            }
        });
        var Vc = O.Math.Frustum = function (H, F, B, J, r, Q) {
            this.planes = [H !== Z ? H : new Io, F !== Z ? F : new Io, B !== Z ? B : new Io, J !== Z ? J : new Io, r !== Z ? r : new Io, Q !== Z ? Q : new Io]
        };
        o.assign(Vc.prototype, {
            set: function (b, n, w, S, E, Z) {
                var d = this.planes;
                return d[0].copy(b), d[1].copy(n), d[2].copy(w), d[3].copy(S), d[4].copy(E), d[5].copy(Z), this
            }, clone: function () {
                return (new this.constructor).copy(this)
            }, copy: function (y) {
                for (var u = this.planes, g = 0; 6 > g; g++) u[g].copy(y.planes[g]);
                return this
            }, setFromMatrix: function (L) {
                var Q = this.planes,
                    T = L.el,
                    u = T[0],
                    i = T[1],
                    E = T[2],
                    A = T[3],
                    U = T[4],
                    f = T[5],
                    c = T[6],
                    V = T[7],
                    G = T[8],
                    q = T[9],
                    r = T[10],
                    l = T[11],
                    J = T[12],
                    C = T[13],
                    Z = T[14],
                    h = T[15];
                return Q[0].setComponents(A - u, V - U, l - G, h - J).normalize(), Q[1].setComponents(A + u, V + U, l + G, h + J).normalize(), Q[2].setComponents(A + i, V + f, l + q, h + C).normalize(), Q[3].setComponents(A - i, V - f, l - q, h - C).normalize(), Q[4].setComponents(A - E, V - c, l - r, h - Z).normalize(), Q[5].setComponents(A + E, V + c, l + r, h + Z).normalize(), this
            }, intersectsObject: function () {
                var Y = new Mk;
                return function (o) {
                    var K = o.geometry;
                    return null === K.boundingSphere && K.computeBoundingSphere(), Y.copy(K.boundingSphere).applyMatrix4(o.matrixWorld), this.intersectsSphere(Y)
                }
            }(),
            intersectsSprite: function () {
                var K = new Mk;
                return function (m) {
                    return K.center.set(0, 0, 0), K.radius = .7071067811865476, K.applyMatrix4(m.matrixWorld), this.intersectsSphere(K)
                }
            }(),
            intersectsSphere: function (L) {
                for (var v = this.planes, O = L.center, Q = -L.radius, s = 0; 6 > s; s++) {
                    var g = v[s].distanceToPoint(O);
                    if (Q > g) return !1
                }
                return !0
            }, intersectsBox: function () {
                var D = new tl;
                return function (b) {
                    for (var Q = this.planes, I = 0; 6 > I; I++) {
                        var K = Q[I];
                        if (D.x = K.normal.x > 0 ? b.max.x : b.min.x, D.y = K.normal.y > 0 ? b.max.y : b.min.y, D.z = K.normal.z > 0 ? b.max.z : b.min.z, K.distanceToPoint(D) < 0) return !1
                    }
                    return !0
                }
            }(),
            containsPoint: function ($) {
                for (var c = this.planes, E = 0; 6 > E; E++)
                    if (c[E].distanceToPoint($) < 0) return !1;
                return !0
            }
        });
        var br = O.Math.Matrix4 = function () {
            this.el = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
        };
        o.assign(br.prototype, {
            set: function (j, F, t, K, Y, A, V, O, P, v, k, w, G, H, B, m) {
                var x = this.el;
                return x[0] = j, x[4] = F, x[8] = t, x[12] = K, x[1] = Y, x[5] = A, x[9] = V, x[13] = O, x[2] = P, x[6] = v, x[10] = k, x[14] = w, x[3] = G, x[7] = H, x[11] = B, x[15] = m, this
            }, clone: function () {
                return (new br).fromArray(this.el)
            }, fromArray: function (c, Q) {
                Q === Z && (Q = 0);
                for (var n = this.el, v = 0; 16 > v; v++) n[v] = c[v + Q];
                return this
            }, getElements: function () {
                return this.el
            }, scale: function (w) {
                var W = this.el,
                    H = w.x,
                    C = w.y,
                    b = w.z;
                return W[0] *= H, W[4] *= C, W[8] *= b, W[1] *= H, W[5] *= C, W[9] *= b, W[2] *= H, W[6] *= C, W[10] *= b, W[3] *= H, W[7] *= C, W[11] *= b, this
            }, makeRotationFromEuler: function (K) {
                var D = this.el,
                    M = K._x,
                    R = K._y,
                    o = K._z,
                    X = K._order,
                    z = Math.cos(M),
                    I = Math.sin(M),
                    p = Math.cos(R),
                    l = Math.sin(R),
                    Z = Math.cos(o),
                    i = Math.sin(o);
                if ("XYZ" === X) {
                    var m = z * Z,
                        r = z * i,
                        t = I * Z,
                        f = I * i;
                    D[0] = p * Z, D[4] = -p * i, D[8] = l, D[1] = r + t * l, D[5] = m - f * l, D[9] = -I * p, D[2] = f - m * l, D[6] = t + r * l, D[10] = z * p
                } else if ("YXZ" === X) {
                    var n = p * Z,
                        b = p * i,
                        a = l * Z,
                        V = l * i;
                    D[0] = n + V * I, D[4] = a * I - b, D[8] = z * l, D[1] = z * i, D[5] = z * Z, D[9] = -I, D[2] = b * I - a, D[6] = V + n * I, D[10] = z * p
                } else if ("ZXY" === X) {
                    var n = p * Z,
                        b = p * i,
                        a = l * Z,
                        V = l * i;
                    D[0] = n - V * I, D[4] = -z * i, D[8] = a + b * I, D[1] = b + a * I, D[5] = z * Z, D[9] = V - n * I, D[2] = -z * l, D[6] = I, D[10] = z * p
                } else if ("ZYX" === X) {
                    var m = z * Z,
                        r = z * i,
                        t = I * Z,
                        f = I * i;
                    D[0] = p * Z, D[4] = t * l - r, D[8] = m * l + f, D[1] = p * i, D[5] = f * l + m, D[9] = r * l - t, D[2] = -l, D[6] = I * p, D[10] = z * p
                } else if ("YZX" === X) {
                    var g = z * p,
                        T = z * l,
                        j = I * p,
                        G = I * l;
                    D[0] = p * Z, D[4] = G - g * i, D[8] = j * i + T, D[1] = i, D[5] = z * Z, D[9] = -I * Z, D[2] = -l * Z, D[6] = T * i + j, D[10] = g - G * i
                } else if ("XZY" === X) {
                    var g = z * p,
                        T = z * l,
                        j = I * p,
                        G = I * l;
                    D[0] = p * Z, D[4] = -i, D[8] = l * Z, D[1] = g * i + G, D[5] = z * Z, D[9] = T * i - j, D[2] = j * i - T, D[6] = I * Z, D[10] = G * i + g
                }
                return D[3] = 0, D[7] = 0, D[11] = 0, D[12] = 0, D[13] = 0, D[14] = 0, D[15] = 1, this
            }, makeRotationFromQuaternion: function (R) {
                var Y = this.el,
                    U = R._x,
                    n = R._y,
                    S = R._z,
                    G = R._w,
                    $ = U + U,
                    K = n + n,
                    L = S + S,
                    F = U * $,
                    e = U * K,
                    c = U * L,
                    X = n * K,
                    q = n * L,
                    O = S * L,
                    w = G * $,
                    j = G * K,
                    s = G * L;
                return Y[0] = 1 - (X + O), Y[4] = e - s, Y[8] = c + j, Y[1] = e + s, Y[5] = 1 - (F + O), Y[9] = q - w, Y[2] = c - j, Y[6] = q + w, Y[10] = 1 - (F + X), Y[3] = 0, Y[7] = 0, Y[11] = 0, Y[12] = 0, Y[13] = 0, Y[14] = 0, Y[15] = 1, this
            }, identity: function () {
                return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), this
            }, getInverse: function (V) {
                var D = this.el,
                    x = V.el,
                    k = x[0],
                    H = x[1],
                    R = x[2],
                    Y = x[3],
                    e = x[4],
                    v = x[5],
                    i = x[6],
                    M = x[7],
                    $ = x[8],
                    o = x[9],
                    y = x[10],
                    U = x[11],
                    p = x[12],
                    h = x[13],
                    Q = x[14],
                    u = x[15],
                    q = o * Q * M - h * y * M + h * i * U - v * Q * U - o * i * u + v * y * u,
                    K = p * y * M - $ * Q * M - p * i * U + e * Q * U + $ * i * u - e * y * u,
                    f = $ * h * M - p * o * M + p * v * U - e * h * U - $ * v * u + e * o * u,
                    w = p * o * i - $ * h * i - p * v * y + e * h * y + $ * v * Q - e * o * Q,
                    l = k * q + H * K + R * f + Y * w;
                if (0 === l) return this.identity();
                var r = 1 / l;
                return D[0] = q * r, D[1] = (h * y * Y - o * Q * Y - h * R * U + H * Q * U + o * R * u - H * y * u) * r, D[2] = (v * Q * Y - h * i * Y + h * R * M - H * Q * M - v * R * u + H * i * u) * r, D[3] = (o * i * Y - v * y * Y - o * R * M + H * y * M + v * R * U - H * i * U) * r, D[4] = K * r, D[5] = ($ * Q * Y - p * y * Y + p * R * U - k * Q * U - $ * R * u + k * y * u) * r, D[6] = (p * i * Y - e * Q * Y - p * R * M + k * Q * M + e * R * u - k * i * u) * r, D[7] = (e * y * Y - $ * i * Y + $ * R * M - k * y * M - e * R * U + k * i * U) * r, D[8] = f * r, D[9] = (p * o * Y - $ * h * Y - p * H * U + k * h * U + $ * H * u - k * o * u) * r, D[10] = (e * h * Y - p * v * Y + p * H * M - k * h * M - e * H * u + k * v * u) * r, D[11] = ($ * v * Y - e * o * Y - $ * H * M + k * o * M + e * H * U - k * v * U) * r, D[12] = w * r, D[13] = ($ * h * R - p * o * R + p * H * y - k * h * y - $ * H * Q + k * o * Q) * r, D[14] = (p * v * R - e * h * R - p * H * i + k * h * i + e * H * Q - k * v * Q) * r, D[15] = (e * o * R - $ * v * R + $ * H * i - k * o * i - e * H * y + k * v * y) * r, this
            }, makeRotationAxis: function (Z, d) {
                var a = Math.cos(d),
                    o = Math.sin(d),
                    L = 1 - a,
                    M = Z.x,
                    j = Z.y,
                    x = Z.z,
                    T = L * M,
                    Y = L * j;
                return this.set(T * M + a, T * j - o * x, T * x + o * j, 0, T * j + o * x, Y * j + a, Y * x - o * M, 0, T * x - o * j, Y * x + o * M, L * x * x + a, 0, 0, 0, 0, 1), this
            }, multiply: function (X) {
                return this.multiplyMatrices(this, X)
            }, premultiply: function (S) {
                return this.multiplyMatrices(S, this)
            }, multiplyMatrices: function (P, F) {
                var W = P.el,
                    C = F.el,
                    u = this.el,
                    s = W[0],
                    A = W[4],
                    Q = W[8],
                    o = W[12],
                    t = W[1],
                    S = W[5],
                    _ = W[9],
                    N = W[13],
                    T = W[2],
                    z = W[6],
                    j = W[10],
                    c = W[14],
                    h = W[3],
                    d = W[7],
                    x = W[11],
                    E = W[15],
                    l = C[0],
                    D = C[4],
                    G = C[8],
                    B = C[12],
                    I = C[1],
                    H = C[5],
                    M = C[9],
                    K = C[13],
                    J = C[2],
                    r = C[6],
                    Y = C[10],
                    e = C[14],
                    X = C[3],
                    n = C[7],
                    L = C[11],
                    v = C[15];
                return u[0] = s * l + A * I + Q * J + o * X, u[4] = s * D + A * H + Q * r + o * n, u[8] = s * G + A * M + Q * Y + o * L, u[12] = s * B + A * K + Q * e + o * v, u[1] = t * l + S * I + _ * J + N * X, u[5] = t * D + S * H + _ * r + N * n, u[9] = t * G + S * M + _ * Y + N * L, u[13] = t * B + S * K + _ * e + N * v, u[2] = T * l + z * I + j * J + c * X, u[6] = T * D + z * H + j * r + c * n, u[10] = T * G + z * M + j * Y + c * L, u[14] = T * B + z * K + j * e + c * v, u[3] = h * l + d * I + x * J + E * X, u[7] = h * D + d * H + x * r + E * n, u[11] = h * G + d * M + x * Y + E * L, u[15] = h * B + d * K + x * e + E * v, this
            }, lookAt: function () {
                var u = new tl,
                    e = new tl,
                    R = new tl;
                return function (E, q, z) {
                    var r = this.el;
                    return R.subVectors(E, q), 0 === R.lengthSq() && (R.z = 1), R.normalize(), u.crossVectors(z, R), 0 === u.lengthSq() && (1 === Math.abs(z.z) ? R.x += 1e-4 : R.z += 1e-4, R.normalize(), u.crossVectors(z, R)), u.normalize(), e.crossVectors(R, u), r[0] = u.x, r[4] = e.x, r[8] = R.x, r[1] = u.y, r[5] = e.y, r[9] = R.y, r[2] = u.z, r[6] = e.z, r[10] = R.z, this
                }
            }(),
            extractScale: function () {
                var f;
                return function (I) {
                    f === Z && (f = new tl), I === Z && (I = new tl);
                    var l = f.setFromMatrixColumn(this, 0).length(),
                        Q = f.setFromMatrixColumn(this, 1).length(),
                        U = f.setFromMatrixColumn(this, 2).length();
                    return I.set(l, Q, U), I
                }
            }(),
            extractRotation: function () {
                var p;
                return function (o) {
                    p === Z && (p = new tl), o === Z && (o = new br);
                    var c = this.el,
                        f = o.el,
                        r = 1 / p.setFromMatrixColumn(o, 0).length(),
                        K = 1 / p.setFromMatrixColumn(o, 1).length(),
                        A = 1 / p.setFromMatrixColumn(o, 2).length();
                    return c[0] = f[0] * r, c[1] = f[1] * r, c[2] = f[2] * r, c[4] = f[4] * K, c[5] = f[5] * K, c[6] = f[6] * K, c[8] = f[8] * A, c[9] = f[9] * A, c[10] = f[10] * A, this
                }
            }(),
            multiplyScalar: function (u) {
                var v = this.el;
                return v[0] *= u, v[4] *= u, v[8] *= u, v[12] *= u, v[1] *= u, v[5] *= u, v[9] *= u, v[13] *= u, v[2] *= u, v[6] *= u, v[10] *= u, v[14] *= u, v[3] *= u, v[7] *= u, v[11] *= u, v[15] *= u, this
            }, getPosition: function (j) {
                return j === Z && (j = new tl), j.setFromMatrixColumn(this, 3)
            }, setPosition: function (S) {
                var h = this.el;
                return h[12] = S.x, h[13] = S.y, h[14] = S.z, this
            }, toArray: function (g, D) {
                g === Z && (g = []), D === Z && (D = 0);
                var Y = this.el;
                return g[D] = Y[0], g[D + 1] = Y[1], g[D + 2] = Y[2], g[D + 3] = Y[3], g[D + 4] = Y[4], g[D + 5] = Y[5], g[D + 6] = Y[6], g[D + 7] = Y[7], g[D + 8] = Y[8], g[D + 9] = Y[9], g[D + 10] = Y[10], g[D + 11] = Y[11], g[D + 12] = Y[12], g[D + 13] = Y[13], g[D + 14] = Y[14], g[D + 15] = Y[15], g
            }, determinant: function () {
                var C = this.el,
                    g = C[0],
                    q = C[4],
                    H = C[8],
                    J = C[12],
                    s = C[1],
                    I = C[5],
                    _ = C[9],
                    j = C[13],
                    V = C[2],
                    N = C[6],
                    u = C[10],
                    b = C[14],
                    d = C[3],
                    n = C[7],
                    y = C[11],
                    S = C[15];
                return d * (+J * _ * N - H * j * N - J * I * u + q * j * u + H * I * b - q * _ * b) + n * (+g * _ * b - g * j * u + J * s * u - H * s * b + H * j * V - J * _ * V) + y * (+g * j * N - g * I * b - J * s * N + q * s * b + J * I * V - q * j * V) + S * (-H * I * V - g * _ * N + g * I * u + H * s * N - q * s * u + q * _ * V)
            }, copy: function (e) {
                var h = this.el,
                    n = e.el;
                return h[0] = n[0], h[1] = n[1], h[2] = n[2], h[3] = n[3], h[4] = n[4], h[5] = n[5], h[6] = n[6], h[7] = n[7], h[8] = n[8], h[9] = n[9], h[10] = n[10], h[11] = n[11], h[12] = n[12], h[13] = n[13], h[14] = n[14], h[15] = n[15], this
            }, compose: function (o, f, T) {
                var P = this.el,
                    H = f._x,
                    m = f._y,
                    C = f._z,
                    Z = f._w,
                    w = H + H,
                    G = m + m,
                    R = C + C,
                    K = H * w,
                    Q = H * G,
                    u = H * R,
                    X = m * G,
                    F = m * R,
                    O = C * R,
                    $ = Z * w,
                    e = Z * G,
                    L = Z * R,
                    B = T.x,
                    j = T.y,
                    z = T.z;
                return P[0] = (1 - (X + O)) * B, P[1] = (Q + L) * B, P[2] = (u - e) * B, P[3] = 0, P[4] = (Q - L) * j, P[5] = (1 - (K + O)) * j, P[6] = (F + $) * j, P[7] = 0, P[8] = (u + e) * z, P[9] = (F - $) * z, P[10] = (1 - (K + X)) * z, P[11] = 0, P[12] = o.x, P[13] = o.y, P[14] = o.z, P[15] = 1, this
            }, decompose: function () {
                var N = new tl,
                    Y = new br;
                return function (k, I, H) {
                    var F = this.el,
                        i = N.set(F[0], F[1], F[2]).length(),
                        p = N.set(F[4], F[5], F[6]).length(),
                        q = N.set(F[8], F[9], F[10]).length(),
                        W = this.determinant();
                    0 > W && (i = -i), k.x = F[12], k.y = F[13], k.z = F[14], Y.copy(this);
                    var n = 1 / i,
                        o = 1 / p,
                        c = 1 / q;
                    return Y.el[0] *= n, Y.el[1] *= n, Y.el[2] *= n, Y.el[4] *= o, Y.el[5] *= o, Y.el[6] *= o, Y.el[8] *= c, Y.el[9] *= c, Y.el[10] *= c, I.setFromRotationMatrix(Y), H.x = i, H.y = p, H.z = q, this
                }
            }()
        });
        var pq = O.Math.Triangle = function (i, N, v) {
            this.a = i !== Z ? i : new tl, this.b = N !== Z ? N : new tl, this.c = v !== Z ? v : new tl
        };
        o.assign(pq, {
            barycoordFromPoint: function () {
                var b = new tl,
                    g = new tl,
                    C = new tl;
                return function (j, m, U, N, V) {
                    b.subVectors(N, m), g.subVectors(U, m), C.subVectors(j, m);
                    var Y = b.dot(b),
                        _ = b.dot(g),
                        X = b.dot(C),
                        I = g.dot(g),
                        q = g.dot(C),
                        W = Y * I - _ * _,
                        G = V || new tl;
                    if (0 === W) return G.set(-2, -1, -1);
                    var Z = 1 / W,
                        o = (I * X - _ * q) * Z,
                        c = (Y * q - _ * X) * Z;
                    return G.set(1 - o - c, c, o)
                }
            }()
        });
        var gg = O.Math.Euler = function (j, s, H, $, I) {
            this.set(j, s, H, $, I)
        };
        gg.RotationOrders = ["XYZ", "YZX", "ZXY", "XZY", "YXZ", "ZYX"], gg.DefaultOrder = "XYZ", gg.ReverseOrder = function (U) {
            return U = U[2] + U[1] + U[0], U.toUpperCase()
        }, o.defineProperties(gg.prototype, {
            x: {
                get: function () {
                    return this._x
                }, set: function (s) {
                    this._x = s, this.onChangeCallback()
                }
            },
            y: {
                get: function () {
                    return this._y
                }, set: function (F) {
                    this._y = F, this.onChangeCallback()
                }
            },
            z: {
                get: function () {
                    return this._z
                }, set: function (q) {
                    this._z = q, this.onChangeCallback()
                }
            },
            order: {
                get: function () {
                    return this._order
                }, set: function (t) {
                    this._order = t, this.onChangeCallback()
                }
            }
        }), o.assign(gg.prototype, {
            set: function (C, d, e, f, y) {
                return ip(C) && (y = e, f = d, e = C[2], d = C[1], C = C[0]), f ? y && (f = gg.ReverseOrder(f)) : f = "ZYX", this._x = C || 0, this._y = d || 0, this._z = e || 0, this._order = f || this._order, this.onChangeCallback(), this
            }, clone: function () {
                return new this.constructor(this._x, this._y, this._z, this._order)
            }, copy: function (O) {
                return this._x = O._x, this._y = O._y, this._z = O._z, this._order = O._order, this.onChangeCallback(), this
            }, setFromRotationMatrix: function (o, H, X) {
                var p = O.Math.clamp,
                    N = o.el || o,
                    U = N[0],
                    E = N[4],
                    x = N[8],
                    D = N[1],
                    F = N[5],
                    h = N[9],
                    I = N[2],
                    Q = N[6],
                    P = N[10];
                return H = H || this._order, "XYZ" === H ? (this._y = Math.asin(p(x, -1, 1)), Math.abs(x) < .99999 ? (this._x = Math.atan2(-h, P), this._z = Math.atan2(-E, U)) : (this._x = Math.atan2(Q, F), this._z = 0)) : "YXZ" === H ? (this._x = Math.asin(-p(h, -1, 1)), Math.abs(h) < .99999 ? (this._y = Math.atan2(x, P), this._z = Math.atan2(D, F)) : (this._y = Math.atan2(-I, U), this._z = 0)) : "ZXY" === H ? (this._x = Math.asin(p(Q, -1, 1)), Math.abs(Q) < .99999 ? (this._y = Math.atan2(-I, P), this._z = Math.atan2(-E, F)) : (this._y = 0, this._z = Math.atan2(D, U))) : "ZYX" === H ? (this._y = Math.asin(-p(I, -1, 1)), Math.abs(I) < .99999 ? (this._x = Math.atan2(Q, P), this._z = Math.atan2(D, U)) : (this._x = 0, this._z = Math.atan2(-E, F))) : "YZX" === H ? (this._z = Math.asin(p(D, -1, 1)), Math.abs(D) < .99999 ? (this._x = Math.atan2(-h, F), this._y = Math.atan2(-I, U)) : (this._x = 0, this._y = Math.atan2(x, P))) : "XZY" === H ? (this._z = Math.asin(-p(E, -1, 1)), Math.abs(E) < .99999 ? (this._x = Math.atan2(Q, F), this._y = Math.atan2(x, U)) : (this._x = Math.atan2(-h, P), this._y = 0)) : console.warn("unsupported order: " + H), this._order = H, X !== !1 && this.onChangeCallback(), this
            }, setFromQuaternion: function () {
                var S = new br;
                return function (A, c, w) {
                    return S.makeRotationFromQuaternion(A), this.setFromRotationMatrix(S, c, w)
                }
            }(),
            setFromVector3: function (J, I) {
                return this.set(J.x, J.y, J.z, I || this._order)
            }, reorder: function () {
                var S = new fs;
                return function (f) {
                    return S.setFromEuler(this), this.setFromQuaternion(S, f)
                }
            }(),
            equals: function (O) {
                return O._x === this._x && O._y === this._y && O._z === this._z && O._order === this._order
            }, fromArray: function (S) {
                return this._x = S[0], this._y = S[1], this._z = S[2], S[3] !== Z && (this._order = S[3]), this.onChangeCallback(), this
            }, toArray: function (q, w) {
                return q === Z && (q = []), w === Z && (w = 0), q[w] = this._x, q[w + 1] = this._y, q[w + 2] = this._z, q[w + 3] = this._order, q
            }, toVector3: function (a) {
                return a ? a.set(this._x, this._y, this._z) : new tl(this._x, this._y, this._z)
            }, onChange: function (W) {
                return this.onChangeCallback = W, this
            }, onChangeCallback: function () { }
        });
        var fb = {
            ms_ac: function (L, V) {
                for (var C = V.ms_ac, W = 0; W < C.length; W++) em(L, C[W])
            }, ms_listener: function (Y) {
                Y.addListeners = function () {
                    var s = this,
                        Z = Ec;
                    u.mockTouch && (Z = Vr.concat(vs).concat(kr)), s.__events__ = Z;
                    for (var T = 0, D = Z.length; D > T; T++) {
                        var _ = Z[T];
                        "wheel" === _ && !s.handle_wheel && s.handle_mousewheel && (s.handle_wheel = function ($) {
                            sg(s, $)
                        }), s["handle_" + _] && ic(_, s.getView(), s)
                    }
                }, Y.removeListeners = function () {
                    var X = this,
                        z = X.__events__;
                    if (z) {
                        X.__events__ = Z;
                        for (var c = 0, g = z.length; g > c; c++) X["handle_" + z[c]] && ws(z[c], X.getView(), X)
                    }
                }
            }, ms_fire: function (R) {
                R.mp = function (A, u, V) {
                    this.addPropertyChangeListener(A, u, V)
                }, R.ump = function (Q, p) {
                    this.removePropertyChangeListener(Q, p)
                }, R.fp = function (k, l, d, A, B) {
                    return this.firePropertyChange(k, l, d, A, B)
                }, R.addPropertyChangeListener = function (y, H, s) {
                    var F = this;
                    F._62I || (F._62I = new Yj), F._62I.add(y, H, s)
                }, R.removePropertyChangeListener = function (n, y) {
                    this._62I && this._62I.remove(n, y)
                }, R.firePropertyChange = function (b, K, H, g, U) {
                    if (g) {
                        if (g(K, H)) return !1
                    } else if (K === H) return !1;
                    var f = this,
                        P = U || {};
                    return P.property = b, P.oldValue = K, P.newValue = H, P.source = f, P.data = f, f._62I && f._62I.fire(P), f.onPropertyChanged && f.onPropertyChanged(P), !0
                }
            }, ms_attr: function (A) {
                A.a = function (D, N) {
                    var A = this;
                    if (2 === arguments.length) A.setAttr(D, N);
                    else {
                        if (!xl(D)) return A.getAttr(D);
                        for (var b in D) A.setAttr(b, D[b])
                    }
                    return A
                }, A.getAttr = function (m, p) {
                    if (p === Z && (p = 1), this._attrObject && m in this._attrObject) return this._attrObject[m];
                    if (this.getImage) {
                        var q = this.getImage();
                        if (dk(q) && (q = Oe[q]), xl(q) && "dataBindings" in q)
                            for (var S = q.dataBindings, r = S.length - 1; r >= 0; r--) {
                                var b = S[r];
                                if (b.attr === m) {
                                    if ("defaultValue" in b) return b.defaultValue;
                                    break
                                }
                            }
                    }
                    return p ? I[m] : Z
                }, A.setAttr = function (q, T) {
                    var F = this;
                    F._attrObject || (F._attrObject = {});
                    var C = F._attrObject[q];
                    T === Z ? delete F._attrObject[q] : F._attrObject[q] = T, F.fp && F.fp("a:" + q, C, T) && F.onAttrChanged && F.onAttrChanged(q, C, T)
                }, A.getSerializableAttrs = function () {
                    var B, p = {};
                    for (B in this._attrObject) p[B] = 1;
                    return p
                }
            }, ms_bnb: function (v) {
                v.getBodyColor = function (G) {
                    return G.s("body.color")
                }, v.getBorderColor = function (S) {
                    return S.s("border.color")
                }
            }, _51o: function (h) {
                h.mi = function (X, g, k) {
                    this.addInteractorListener(X, g, k)
                }, h.umi = function (O, F) {
                    this.removeInteractorListener(O, F)
                }, h.fi = function (I) {
                    this.fireInteractorEvent(I)
                }, h.addInteractorListener = function (M, F, G) {
                    var r = this;
                    r._63I || (r._63I = new Yj), r._63I.add(M, F, G)
                }, h.removeInteractorListener = function (B, D) {
                    this._63I && this._63I.remove(B, D)
                }, h.fireInteractorEvent = function (W) {
                    this._63I && this._63I.fire(W)
                }, h.setInteractors = function (A) {
                    var o = this,
                        C = o._interactors;
                    C && C.each(function (T) {
                        T.tearDown()
                    }), ip(A) && (A = new xr(A)), o._interactors = A, A && A.each(function (v) {
                        v.setUp()
                    }), o.fp("interactors", C, A), o.invalidateSelection()
                }, h.getInteractors = function () {
                    return this._interactors
                }
            }, _49o: function (T) {
                T._44O = F, T._45O = F, T.getTopPainters = function () {
                    return this._44O
                }, T.getBottomPainters = function () {
                    return this._45O
                }, T.addTopPainter = function (u) {
                    var c = this;
                    c._44O || (c._44O = new xr), c._44O.contains(u) || (c._44O.add(u), c.redraw && c.redraw())
                }, T.removeTopPainter = function (d) {
                    var k = this;
                    k._44O && (k._44O.remove(d), k.redraw && k.redraw())
                }, T.addBottomPainter = function (Q) {
                    var V = this;
                    V._45O || (V._45O = new xr), V._45O.contains(Q) || (V._45O.add(Q), V.redraw && V.redraw())
                }, T.removeBottomPainter = function (z) {
                    var N = this;
                    N._45O && (N._45O.remove(z), N.redraw && N.redraw())
                }, T._93db = function (Y, M) {
                    var N = this;
                    N._45O && N._45O.each(function (b) {
                        b.draw ? b.draw(Y, M) : b.call(N, Y, M)
                    })
                }, T._92db = function (_, N) {
                    var A = this;
                    A._44O && A._44O.each(function (v) {
                        v.draw ? v.draw(_, N) : v.call(A, _, N)
                    })
                }
            }, ms_sm: function (l) {
                l.sm = function () {
                    return this.getSelectionModel()
                }, l.setSelectableFunc = function (W) {
                    this.sm().setFilterFunc(W)
                }, l.getSelectableFunc = function () {
                    return this.sm().getFilterFunc()
                }, l.getSelectionModel = function () {
                    var s = this;
                    return s._selectionModel ? s._selectionModel : s.dm().sm()
                }, l.isSelectionModelShared = function () {
                    return !this._selectionModel
                }, l.setSelectionModelShared = function (y) {
                    var X = this,
                        n = !X._selectionModel,
                        S = X.handleSelectionChange,
                        W = X.dm();
                    n !== y && (X.invalidateSelection && X.invalidateSelection(), y ? (W.sm().ms(S, X), X._selectionModel.ums(S, X), X._selectionModel.dispose(), X._selectionModel = F) : (W.sm().ums(S, X), X._selectionModel = new Uc(W), X._selectionModel.ms(S, X)), X.onSelectionModelSharedChanged(), X.fp("selectionModelShared", n, y))
                }, l.onSelectionModelSharedChanged = function () {
                    var D = this;
                    D.redraw(), D.invalidateSelection && D.invalidateSelection()
                }, l.removeSelection = function () {
                    var w = this.dm();
                    w.beginTransaction(), this.sm().toSelection().each(w.remove, w), w.endTransaction()
                }, l.selectAll = function () {
                    var y = this;
                    y.sm().ss(y.dm().toDatas(function (o) {
                        return y.isVisible(o) && y.isSelectable(o)
                    }))
                }, l.isSelected = function (T) {
                    return this.sm().co(T)
                }, l.isSelectedById = function (P) {
                    var D = this.dm().getDataById(P);
                    return D ? this.isSelected(D) : !1
                }, l.isSelectable = function (y) {
                    return this.sm().isSelectable(y)
                }
            }, ms_tx: function (o) {
                o._64I = 0, o._65O = 0, o.isScrollable = function () {
                    return this.getWidth() < this._64I
                }, o._40o = function () {
                    return this.isScrollable()
                }, o.getLogicalPoint = function (T) {
                    return Nm(T, this._canvas || this._view, this.tx(), this.ty ? this.ty() : 0)
                }, o.tx = function (A) {
                    return A === Z ? this.getTranslateX() : (this.setTranslateX(A), void 0)
                }, o.getTranslateX = function () {
                    return this._65O
                }, o.setTranslateX = function (D) {
                    var C = this,
                        X = C.getWidth() - C._64I;
                    X > D && (D = X), D > 0 && (D = 0), D = A(D);
                    var B = C._65O;
                    C._65O = D, C.fp(gq, B, D)
                }
            }, ms_ty: function (k) {
                k._23Q = 0, k._66O = 0, k._41o = function () {
                    return this.getHeight() < this._23Q
                }, k.getLogicalPoint = function (Z) {
                    return Nm(Z, this._canvas || this._view, this.tx ? this.tx() : 0, this.ty())
                }, k.ty = function (Q) {
                    return Q === Z ? this.getTranslateY() : (this.setTranslateY(Q), void 0)
                }, k.getTranslateY = function () {
                    return this._66O
                }, k.setTranslateY = function (x) {
                    var f = this,
                        H = f.getHeight() - f._23Q;
                    H > x && (x = H), x > 0 && (x = 0), x = A(x);
                    var y = f._66O;
                    f._66O = x, f.fp(wb, y, x)
                }
            }, ms_txy: function (o) {
                o._65O = 0, o._66O = 0, o.tx = function (f) {
                    return f === Z ? this.getTranslateX() : (this.setTranslateX(f), void 0)
                }, o.ty = function (k) {
                    return k === Z ? this.getTranslateY() : (this.setTranslateY(k), void 0)
                }, o.onTranslateEnded = function () { }, o.setTranslate = function (K, l, o) {
                    var w = this;
                    if (o = Il(o)) {
                        w._65I && w._65I.stop(!0);
                        var j = w.tx(),
                            I = w.ty();
                        o.action = function (E) {
                            w.setTranslate(j + (K - j) * E, I + (l - I) * E)
                        }, o._37o = function () {
                            delete w._66I, delete w._65I, w.onTranslateEnded()
                        }, w._66I = 1, w._65I = Sf(o)
                    } else w.tx(K), w.ty(l)
                }, o.getTranslateX = function () {
                    return this._65O
                }, o.setTranslateX = function (w) {
                    var g = this;
                    w = g.adjustTranslateX(w);
                    var I = g._65O;
                    g._65O = w, g.fp(gq, I, w)
                }, o.getTranslateY = function () {
                    return this._66O
                }, o.setTranslateY = function (T) {
                    var G = this;
                    T = G.adjustTranslateY(T);
                    var M = G._66O;
                    G._66O = T, G.fp(wb, M, T)
                }, o.adjustTranslateX = function (c) {
                    return A(c)
                }, o.adjustTranslateY = function (D) {
                    return A(D)
                }, o.translate = function (I, d, h) {
                    this.setTranslate(this.tx() + I, this.ty() + d, h)
                }, o.getLogicalPoint = function (D) {
                    var m = this;
                    return Nm(D, this._canvas || m._view, m.tx(), m.ty())
                }
            }, ms_dm: function (w) {
                w.dm = function (a) {
                    return a ? (this.setDataModel(a), void 0) : this.getDataModel()
                }, w.getDataModel = function () {
                    return this._dataModel
                }
            }, ms_lp: function (D) {
                D.lp = function (D) {
                    return this.getLogicalPoint(D)
                }
            }, ms_v: function (Q) {
                Q._disabled = !1, Q.setDisabled = function (K, Q) {
                    var F = this,
                        B = F._disabled;
                    B !== K && (B && (yj(F._63O), delete F._63O), K && (sn(F._view, F._63O = lo(Q)), F.iv()), F._disabled = K, F.fp("disabled", B, K))
                }, Q.isDisabled = function () {
                    return this._disabled
                }, Q.getDisabledDiv = function () {
                    return this._63O
                }, Q.getView = function () {
                    return this._view
                }, Q.addToDOM = function (X) {
                    var u = this,
                        m = u.getView(),
                        Y = m.style;
                    X = X || U.body, X.appendChild(m), Y.left = "0", Y.right = "0", Y.top = "0", Y.bottom = "0", K(x, "resize", function () {
                        u.iv()
                    }), u.iv()
                }, Q.getWidth = function () {
                    return this._view.clientWidth
                }, Q.getHeight = function () {
                    return this._view.clientHeight
                }, Q.setWidth = function (R) {
                    var D = this;
                    D._view.style.width = R + oe, D.iv(), D.fp && D.fp(ul, F, R)
                }, Q.setHeight = function (z) {
                    var Q = this;
                    Q._view.style.height = z + oe, Q.iv(), Q.fp && Q.fp(Hh, F, z)
                }, Q.setFocus = function (V) {
                    var G = this,
                        s = G._currentEditor;
                    return V && s && (s.getView && (s = s.getView()), s.contains(V.target)) ? !1 : (hr(G._view), G.endEditing && G.endEditing(), G.fireViewEvent("focus"), !0)
                }, Q.iv = function (x) {
                    this.invalidate(x)
                }, Q.invalidate = function (z) {
                    var T = this;
                    T._68I || (T._68I = 1, $e(T.validate, T, F, z), T.onInvalidated && T.onInvalidated(), T.fireViewEvent("invalidate"))
                }, Q.validate = function () {
                    var r = this,
                        _ = r._view;
                    if (r._68I && (delete r._68I, _.parentNode))
                        if (0 === _.offsetWidth && 0 === _.offsetHeight && r._67I !== F) r._67I === Z && (r._67I = u.reinvalidateCount), r._67I > 0 ? r._67I-- : r._67I = F, r.iv();
                        else {
                            r.fireViewEvent("beginValidate"), r.validateImpl(), r.onValidated && r.onValidated(), r.fireViewEvent("validate");
                            var s = r._63O;
                            s && (_.lastChild !== s && (yj(s), sn(_, s)), qp(s, 0, 0, r.getWidth(), r.getHeight())), Dd(r), Fo(r), Yi(r)
                        }
                }, Q.layout = function (H, T, h, k) {
                    1 === arguments.length ? qp(this, H) : qp(this, H, T, h, k)
                }, Q.addViewListener = function (l, Z, V) {
                    var y = this;
                    y._67O || (y._67O = new Yj), y._67O.add(l, Z, V)
                }, Q.removeViewListener = function (p, M) {
                    this._67O.remove(p, M)
                }, Q.fireViewEvent = function (a) {
                    var m = this;
                    m._67O && (dk(a) && (a = {
                        kind: a
                    }), m._67O.fire(a)), u.viewListener && u.viewListener(m, a)
                }
            }, ms_tip: function (c) {
                c.setToolTipEnabled = function (M) {
                    var S = this;
                    M ? nf || S._13o || (S.enableToolTip(), S.fp("toolTipEnabled", !1, !0)) : S._13o && (S.disableToolTip(), S.fp("toolTipEnabled", !0, !1))
                }, c.isToolTipEnabled = function () {
                    return !!this._13o
                }, c.enableToolTip = function () {
                    var C = this;
                    if (!nf && !C._13o) {
                        C._13o = function (i) {
                            var J = C.getToolTip(i);
                            J != F ? u.toolTipContinual && u.isToolTipShowing() ? me(i, J) : (Um(), sq = {
                                timeout: cd(Xk, gj),
                                e: i,
                                info: J
                            }) : Um()
                        };
                        var h = C.getView();
                        K(h, rp, C._13o), K(h, "mouseleave", u.hideToolTip)
                    }
                }, c.disableToolTip = function () {
                    var w = this;
                    if (w._13o) {
                        var K = w.getView();
                        b(K, rp, w._13o), b(K, "mouseleave", u.hideToolTip), delete w._13o
                    }
                }, c.getToolTip = function (p) {
                    var J = this;
                    if (J.getDataAt) {
                        var H = J.getDataAt(p);
                        return H ? H.getToolTip() : F
                    }
                    return J.getValue ? J.getValue() : void 0
                }
            }, _52o: function (X) {
                X._zoom = 1, X._29I = nl, X.zoomIn = function (S, C) {
                    this.setZoom(this._zoom * lq, S, C)
                }, X.zoomOut = function (Y, k) {
                    this.setZoom(this._zoom / lq, Y, k)
                }, X.zoomReset = function (w, u) {
                    this.setZoom(1, w, u)
                }, X.scrollZoomIn = function (v) {
                    this.setZoom(this._zoom * _f, F, v)
                }, X.scrollZoomOut = function (J) {
                    this.setZoom(this._zoom / _f, F, J)
                }, X.pinchZoomIn = function (j) {
                    this.setZoom(this._zoom * db, F, j)
                }, X.pinchZoomOut = function (K) {
                    this.setZoom(this._zoom / db, F, K)
                }, X.adjustZoom = function (m) {
                    return gh > m ? gh : m > us ? us : m
                }, X.getZoom = function () {
                    return this._zoom
                }, X.setZoom = function (c, v, K) {
                    var _ = this;
                    if (v = Il(v)) {
                        _._14o && _._14o.stop(!0);
                        var p = _._zoom;
                        v.action = function (j) {
                            _._96O(p + (c - p) * j, K)
                        }, v._37o = function () {
                            delete _._zooming, delete _._14o, _.onZoomEnded()
                        }, _._zooming = 1, _._14o = Sf(v)
                    } else _._96O(c, K)
                }, X._96O = function (X, b) {
                    var m = this;
                    if (X = m.adjustZoom(X), X !== m._zoom) {
                        m.validate();
                        var M = m._29I,
                            _ = m._zoom;
                        0 !== M.width && 0 !== M.height && (b = b ? b : {
                            x: M.x + M.width / 2,
                            y: M.y + M.height / 2
                        }, m.tx((b.x - M.x) * _ - b.x * X), m.ty((b.y - M.y) * _ - b.y * X)), m._zoom = X, m.fp("zoom", _, X)
                    }
                }
            }, ms_edge: function (B) {
                B._2I = function (z) {
                    var q = this;
                    q._44I || (q._44I = new xr), q._42I || (q._42I = new xr), q._44I.add(z), q._42I.add(z), q._20I()
                }, B._4I = function (M) {
                    var F = this;
                    F._44I || (F._44I = new xr), F._43I || (F._43I = new xr), F._44I.add(M), F._43I.add(M), F._20I()
                }, B._16I = function (x) {
                    var d = this;
                    d._44I.remove(x), d._42I.remove(x), d._44I.isEmpty() && delete d._44I, d._42I.isEmpty() && delete d._42I, d._20I()
                }, B._18I = function (u) {
                    var d = this;
                    d._44I.remove(u), d._43I.remove(u), d._44I.isEmpty() && delete d._44I, d._43I.isEmpty() && delete d._43I, d._20I()
                }, B._20I = function () {
                    var y = this;
                    if (delete y._45I, !y._44I || y._44I.isEmpty()) return delete y._70O, void 0;
                    var k;
                    y._44I.each(function (l) {
                        l.isLooped() && (k || (k = {}), k[l._id] || (y._45I || (y._45I = new xr), y._45I.add(l), k[l._id] = l))
                    }), k ? (y._70O = new xr, y._44I.each(function (A) {
                        k[A._id] ? "A" === k[A._id] || (k[A._id] = "A", y._70O.add(A)) : y._70O.add(A)
                    })) : y._70O = y._44I
                }, B.hasAgentEdges = function () {
                    return !!this._49I && !this._49I.isEmpty()
                }, B.getSourceAgentEdges = function () {
                    return this._46I
                }, B.getTargetAgentEdges = function () {
                    return this._47I
                }, B._1I = function (F) {
                    var e = this;
                    e._46I || (e._46I = new xr), e._48I || (e._48I = new xr), e._46I.add(F), e._48I.add(F), e._19I()
                }, B._3I = function (T) {
                    var H = this;
                    H._47I || (H._47I = new xr), H._48I || (H._48I = new xr), H._47I.add(T), H._48I.add(T), H._19I()
                }, B._15I = function (W) {
                    var Y = this;
                    Y._46I.remove(W), Y._48I.remove(W), Y._46I.isEmpty() && delete Y._46I, Y._48I.isEmpty() && delete Y._48I, Y._19I()
                }, B._17I = function (B) {
                    var K = this;
                    K._47I.remove(B), K._48I.remove(B), K._47I.isEmpty() && delete K._47I, K._48I.isEmpty() && delete K._48I, K._19I()
                }, B._19I = function () {
                    var Y = this;
                    delete Y._49I;
                    var b = Y._48I;
                    if (b && !b.isEmpty()) {
                        var _ = {};
                        b.each(function (G) {
                            _[G._id] ? Y._49I || (Y._49I = new xr) : _[G._id] = G
                        }), Y._49I ? b.each(function (c) {
                            _[c._id] && (Y._49I.add(c), delete _[c._id])
                        }) : Y._49I = b
                    }
                }, B.getLoopedEdges = function () {
                    return this._45I
                }, B.getEdges = function () {
                    return this._70O
                }, B.getAgentEdges = function () {
                    return this._49I
                }, B.getSourceEdges = function () {
                    return this._42I
                }, B.getTargetEdges = function () {
                    return this._43I
                }, B._8I = function () {
                    this._70O && this._70O.each(function (k) {
                        k._7I()
                    })
                }
            }, ms_shadow: function (c) {
                _r.PARAMS.forEach(function (u) {
                    var k = u.replace(/(^|\.)[a-z]/g, function (e) {
                        return e[e.length - 1].toUpperCase()
                    }),
                        R = k.charAt(0).toLowerCase() + k.substr(1);
                    c["getShadow" + k] = function () {
                        return this._getShadowParam(R)
                    }, c["setShadow" + k] = function (f) {
                        this._setShadowParam(R, f)
                    }
                }), c.enableShadow = function (D) {
                    this.shadowMap.setShadow(!0, D)
                }, c.disableShadow = function () {
                    this.shadowMap.setShadow(!1)
                }, c._getShadowParam = function (Z) {
                    return this.shadowMap.getShadow()[Z]
                }, c._setShadowParam = function (s, b) {
                    var f = this._getShadowParam(s),
                        u = {};
                    u[s] = b;
                    var h = this.shadowMap;
                    h.setShadow(h.enable, u), this.firePropertyChange("shadow" + s.charAt(0).toUpperCase() + s.substr(1), f, b)
                }
            }
        };
        Uh(u, {
            getVersion: function () {
                return "7.2.1"
            }
        }, !0), Uh(u, {
            numberDigits: 5,
            crossOrigin: "",
            baseZIndex: Z,
            isTouchable: nf,
            mockTouch: !0,
            devicePixelRatio: x.devicePixelRatio ? x.devicePixelRatio : 1,
            reinvalidateCount: 3,
            hitMaxArea: 3e3,
            imageCacheThreshold: 20,
            autoMakeVisible: !0,
            autoHideScrollBar: !0,
            disabledOpacity: .4,
            disabledBackground: S.disabledBackground,
            forceHierarchicalSerialization: !0,
            hoverDelay: 600,
            clickDelay: 200,
            toolTipDelay: 800,
            toolTipContinual: !1,
            getDragger: function () {
                return si
            }, lineCap: "butt",
            lineJoin: "round",
            imageGradient: "linear.northeast",
            dashPattern: [16, 16],
            blockMinSize: 1,
            encodeStringKey: null,
            doubleClickSpeed: 500,
            doubleClickRange: 1,
            doubleTouchRange: 20,
            touchMoveThreshold: 10,
            animDuration: 200,
            animEasing: function (W) {
                return W * W
            }, labelColor: Un,
            labelSelectColor: Dg,
            labelFont: "12px arial, sans-serif",
            widgetIndent: nf ? 30 : 20,
            widgetRowHeight: nf ? 30 : 20,
            widgetHeaderHeight: nf ? 32 : 22,
            widgetTitleHeight: nf ? 34 : 24,
            scrollBarColor: od,
            scrollBarSize: 7,
            scrollBarTimeout: 1e3,
            scrollBarMinLength: 20,
            scrollBarInteractiveSize: nf ? 32 : 16,
            zoomIncrement: 1.3,
            scrollZoomIncrement: 1.05,
            pinchZoomIncrement: 1.08,
            pinchZoomThreshold: 1,
            zoomMax: 20,
            zoomMin: .01,
            segmentResolution: 12,
            shapeResolution: 24,
            shapeSide: 24,
            intersectionLineRect: Rl,
            intersectionLineLine: ti,
            isEnter: hd,
            isEsc: bj,
            isDelete: qq,
            isSpace: Cf,
            isLeft: Wk,
            isUp: Nk,
            isRight: _i,
            isDown: ri,
            isTouchEvent: li,
            getTarget: gr,
            isString: dk,
            isNumber: Bp,
            isBoolean: El,
            isArray: ip,
            isSelectAll: Dq,
            isFunction: Mf,
            isObject: xl,
            getPropertyValue: jq,
            setPropertyValue: Di,
            addMethod: Uh,
            isMobile: function () {
                var g;
                return function () {
                    return g !== Z ? g : (g = !1, function (k) {
                        (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(k) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(k.substr(0, 4))) && (g = !0)
                    }(navigator.userAgent || navigator.vendor || x.opera), g)
                }
            }(),
            createGradient: function (k, b, L, Z, w, d, H, p) {
                var N = Eg[b];
                return N(k, L, Z, w, d, H, p)
            }, appendToScreen: function (v) {
                v = v.getView ? v.getView() : v, (U.fullscreenElement || U.mozFullScreenElement || U.webkitFullscreenElement || U.msFullscreenElement || U.body).appendChild(v)
            }, encodeString: function (m) {
                return O.Math.encodeBase64(m, u.encodeStringKey)
            }, decodeString: function (M) {
                return O.Math.decodeBase64(M, u.encodeStringKey)
            }, findView: function (L) {
                var s = function (F, Y) {
                    var z = Y._ht;
                    z && F.push(z);
                    var v = Y.children,
                        U = v.length;
                    if (U)
                        for (var D = 0; U > D; D++) s(F, v[D])
                },
                    r = [];
                s(r, U.body);
                var G = function (h, H) {
                    for (var m = "2d" === H ? hg.GraphView : Eh.Graph3dView, l = 0, W = h.length; W > l; l++)
                        if (h[l] instanceof m) return r[l];
                    return null
                };
                return "all" === L ? r : "2d" === L ? G(r, "2d") : "3d" === L ? G(r, "3d") : G(r, "3d") || G(r, "2d")
            }, toggleFullscreen: function (D) {
                var Y = D.getView();
                if (U.fullscreenElement || U.mozFullScreenElement || U.webkitFullscreenElement || U.msFullscreenElement) U.exitFullscreen ? U.exitFullscreen() : U.msExitFullscreen ? U.msExitFullscreen() : U.mozCancelFullScreen ? U.mozCancelFullScreen() : U.webkitExitFullscreen && U.webkitExitFullscreen();
                else {
                    var W = !0;
                    if (D.isSelfViewEvent) {
                        var i = D.getX(),
                            s = D.getY(),
                            E = D.getWidth(),
                            N = D.getHeight(),
                            g = Y.style.background,
                            A = Y.style.backgroundColor;
                        g || A || (Y.style.backgroundColor = "white"), Y.requestFullscreen ? Y.requestFullscreen() : Y.msRequestFullscreen ? Y.msRequestFullscreen() : Y.mozRequestFullScreen ? Y.mozRequestFullScreen() : Y.webkitRequestFullscreen && Y.webkitRequestFullscreen();
                        var p = setInterval(function () {
                            if (Y !== (U.fullscreenElement || U.mozFullScreenElement || U.webkitFullscreenElement || U.msFullscreenElement)) clearInterval(p), D.setX(i), D.setY(s), D.setWidth(E), D.setHeight(N), D._fullscreen = !1, Y.style.oldBackgroundColor = A, D.iv();
                            else {
                                var I = O.Default.getWindowInfo();
                                (W || I.width !== D.getWidth() || I.height !== D.getHeight()) && (D.setX(I.left), D.setY(I.top), D.setWidth(I.width), D.setHeight(I.height), D._fullscreen = !0, D.iv(), W = !1)
                            }
                        }, 500)
                    } else {
                        var j = Y.style.left,
                            w = Y.style.top,
                            E = Y.style.width,
                            N = Y.style.height,
                            g = Y.style.background,
                            A = Y.style.backgroundColor;
                        g || A || (Y.style.backgroundColor = "white"), Y.requestFullscreen ? Y.requestFullscreen() : Y.msRequestFullscreen ? Y.msRequestFullscreen() : Y.mozRequestFullScreen ? Y.mozRequestFullScreen() : Y.webkitRequestFullscreen && Y.webkitRequestFullscreen();
                        var p = setInterval(function () {
                            if (Y !== (U.fullscreenElement || U.mozFullScreenElement || U.webkitFullscreenElement || U.msFullscreenElement)) clearInterval(p), Y.style.left = j, Y.style.top = w, Y.style.width = E, Y.style.height = N, Y.style.oldBackgroundColor = A, D.iv();
                            else {
                                var I = O.Default.getWindowInfo();
                                (W || I.width !== D.getWidth() || I.height !== D.getHeight()) && (qp(D), W = !1)
                            }
                        }, 500)
                    }
                }
            }, appendTimeStamp: function (H) {
                return H
            }, setCompType: function (O, m) {
                Mf(m) || xl(m) ? Xh[O] = m : qs(O)
            }, getCompType: function (o) {
                var r = Xh[o];
                return r === Z && Bm.test(o) && qs(o), r
            }, getCompTypeMap: function () {
                return Xh
            }, drawCompType: function (j, O, w, $, l, H) {
                j(O, w, $, l, H)
            }, numberListener: function () {
                var r = {
                    46: 1,
                    8: 1,
                    9: 1,
                    27: 1,
                    13: 1,
                    109: 1,
                    110: 1,
                    189: 1,
                    190: 1
                };
                return function (K) {
                    var T = K.keyCode;
                    r[T] || 65 === T && u.isCtrlDown(K) || 86 === T && u.isCtrlDown(K) || 67 === T && u.isCtrlDown(K) || 88 === T && u.isCtrlDown(K) || T >= 35 && 40 >= T || (K.shiftKey || 48 > T || T > 57) && (96 > T || T > 105) && K.preventDefault()
                }
            }(),
            ignoreKeyCodes: [122, 123],
            preventDefault: function (J) {
                var H = J.target.tagName;
                ("DIV" === H || "CANVAS" === H) && !(u.ignoreKeyCodes.indexOf(J.keyCode) >= 0) && ("keydown" !== J.type || Wk(J) || _i(J) || Nk(J) || ri(J) || qq(J) || 65 === J.keyCode && (J.metaKey || J.ctrlKey)) && (J.preventDefault(), J.preventManipulation && J.preventManipulation())
            }, getWindowInfo: function () {
                var H = U.documentElement,
                    z = H && (H.scrollLeft || H.scrollTop) ? H : U.body;
                return {
                    target: z,
                    left: z.scrollLeft,
                    top: z.scrollTop,
                    width: x.innerWidth || z.clientWidth,
                    height: x.innerHeight || z.clientHeight
                }
            }, isDragging: function () {
                return !!si
            }, isLeftButton: function (M) {
                return li(M) ? !0 : 0 === M.button
            }, isMiddleButton: function (I) {
                return li(I) ? !1 : I && (1 === I.button || 4 & (I.buttons || 0))
            }, isRightButton: function (G) {
                return li(G) ? !1 : G && (2 === G.button || 2 & (G.buttons || 0))
            }, isInput: function (D) {
                if (!D) return !1;
                var n = D.tagName;
                return "INPUT" === n || "TEXTAREA" === n || "SELECT" === n
            }, getTouchCount: function (e) {
                return li(e) ? e.touches.length : 1
            }, isDoubleClick: function () {
                function j(f) {
                    f.details = 0, f.timeout = null, f.lastPoint = null
                }
                var T = {};
                return Gk = new v, vi = Gk.getTime(),
                    function (C) {
                        if (Qj(C) > 1) return !1;
                        var I = C.button == F ? "" : C.button,
                            m = C.type + I,
                            h = m + "_isDoubleClick",
                            y = T[m];
                        if (y || (y = T[m] = {
                            details: 0,
                            timeout: null,
                            lastPoint: null
                        }), C[h] === Z) {
                            C[h] = !0;
                            var l = lb(C);
                            y.timeout && (nr(y.timeout), y.timeout = null);
                            var s = li(C) ? u.doubleTouchRange : u.doubleClickRange;
                            y.lastPoint && En(y.lastPoint, l) > s && j(y), y.lastPoint = l, y.details++, y.timeout = cd(function () {
                                j(this)
                            }.bind(y), u.doubleClickSpeed)
                        }
                        return 2 === y.details
                    }
            }(),
            isShiftDown: function (z) {
                return z ? z.shiftKey : pl["16"]
            }, isCtrlDown: function (Q) {
                return Q ? eg ? Q.metaKey : Q.ctrlKey : eg ? pl["91"] : pl["17"]
            }, getClientPoint: function (r) {
                return li(r) && (r = Xj(r)), {
                    x: r.clientX,
                    y: r.clientY
                }
            }, isMouseEvent: function (P) {
                return P instanceof MouseEvent || 0 === P.type.indexOf("mouse")
            }, getTargetElement: function (z) {
                if (u.isMouseEvent(z) || !U.elementFromPoint) return z.target;
                var V = Fd(z);
                return U.elementFromPoint(V.x, V.y)
            }, getPagePoint: function (Q) {
                return li(Q) && (Q = Xj(Q)), {
                    x: Q.pageX,
                    y: Q.pageY
                }
            }, createObject: function (E, Y) {
                var l = new E;
                for (var G in Y) {
                    var r = Y[G];
                    if (Mf(r)) l[G] = r;
                    else if (0 === G.indexOf("s:")) l.s(G.substr(2), Y[G]);
                    else if (0 === G.indexOf("a:")) l.a(G.substr(2), Y[G]);
                    else {
                        var R = tg(G),
                            r = Y[G];
                        l[R] ? (l[R](r), "setToolTip" === R && l.enableToolTip && l.enableToolTip()) : l[G] = r
                    }
                }
                return l
            }, setImage: function (v, b, k, U) {
                var W = arguments.length;
                4 === W ? sd(v, U, b, k) : 2 === W ? dk(b) ? sd(v, b) : vl(v, b) : 1 === W && sd(v, v)
            }, getImage: function (s, I, K) {
                var U;
                if (s == F) return F;
                if (xl(s) ? U = s : (U = Oe[s], s && U === Z && (rm && rm[s] || sd(s, s))), I && U && U.tagName) {
                    var w;
                    w = "override" === K ? "colors_override" : "override_rgb" === K ? "colors_override_rgb" : "override_a" === K ? "colors_override_a" : "colors", U[w] || (U[w] = {
                        __count__: 0
                    });
                    var G = U[w][I];
                    return G || (U[w].__count__ > u.imageCacheThreshold && (U[w] = {
                        __count__: 0
                    }), G = oi(U, ns(I), U.width, U.height, K), U[w][I] = G, U[w].__count__++), G
                }
                return U
            }, isImageComplete: function (k, H, K) {
                var r = ii(k);
                if (!r) return !1;
                if (r.tagName) return r.complete;
                for (var x, k, v, D = r.comps, U = !0, p = 0, l = D.length; l > p; p++)
                    if (x = D[p], v = x.type, "image" === x.type) {
                        k = x.name, k && k.func && (k = Dj(k, H));
                        var R = Dr(k, H, K);
                        if (!R) {
                            U = !1;
                            break
                        }
                    } else if (Bm.test(v) && u.getCompType(v) === Z) {
                        U = !1, qs(v);
                        break
                    }
                return U
            }, getId: function () {
                var d = 1;
                return function () {
                    return ++d
                }
            }(),
            callLater: function (Z, p, W, T) {
                var f = function () {
                    Z.apply(p, W)
                };
                return T ? cd(f, T) : x.requestAnimationFrame(f)
            }, cancelLater: function (K, f) {
                f ? nr(K) : x.cancelAnimationFrame(K)
            }, clone: function (i) {
                if (null == i || "object" != typeof i) return i;
                if (i instanceof Date) {
                    var x = new Date;
                    return x.setTime(i.getTime()), x
                }
                if (i instanceof Array) {
                    for (var x = [], $ = 0, N = i.length; N > $; $++) x[$] = Pm(i[$]);
                    return x
                }
                if (i instanceof xr) {
                    for (var x = new xr, $ = 0, N = i.length; N > $; $++) x.set($, Pm(i.get($)));
                    return x
                }
                if (i instanceof Qp) return i;
                if (i instanceof o) {
                    var x = {};
                    for (var e in i) i.hasOwnProperty(e) && (x[e] = Pm(i[e]));
                    return x
                }
                return i
            }, callWhenLoaded: function (t, b) {
                b = b || 100;
                var k = Jl(t, b);
                nn || (nn = {}), nn[k] = {
                    tick: k,
                    cb: t,
                    delay: b
                }
            }, beforeLoadURL: function (v, I) {
                if (nn) {
                    var V = {};
                    for (var I in nn) {
                        var S = nn[I];
                        nr(S.tick);
                        var z = Jl(S.cb, S.delay);
                        V[z] = {
                            tick: z,
                            delay: S.delay,
                            cb: S.cb
                        }
                    }
                    nn = V
                }
                return u.convertURL ? u.convertURL(v, I) : v
            }, convertURL: function (Z) {
                return Z
            }, handleRefGraphLoaded: function () { }, handleCompTypeLoaded: function () { }, handleImageLoaded: function () { }, handleUnfoundImage: function () {
                return u.getImage("default_blank")
            }, resizeImagePOT: function (F, L) {
                if (!F || !F.tagName) return F;
                var c = F.width,
                    $ = F.height;
                if (!c || !$) return F;
                if (Rc.isPOT(c) && Rc.isPOT($) && (!L || c === $)) return F;
                var m, X;
                L ? X = m = Rc.nearestPOT(Math.min(c, $)) : (m = Rc.nearestPOT(c), X = Rc.nearestPOT($));
                var l = uo(),
                    E = l.getContext("2d");
                return Bn(l, m, X, 1), E.drawImage(F, 0, 0, c, $, 0, 0, m, X), l
            }, sortFunc: function (G, P) {
                if (G === P) return 0;
                if (G == F && P != F) return 1;
                if (G != F && P == F) return -1;
                if (G == F && P == F) return 0;
                var j, z = typeof G,
                    A = typeof P;
                return z === Gl && A === Gl ? j = G.localeCompare(P) : z === Mo && A === Mo && (j = G - P), j === Z && (j = ("" + G).localeCompare("" + P)), j > 0 ? 1 : 0 > j ? -1 : 0
            }, getClassMap: function () {
                return Zl
            }, getClass: function (D) {
                if (dk(D)) {
                    var X, f = Zl[D];
                    if (!f) {
                        X = D.split("."), f = x;
                        for (var y = 0; y < X.length; y++) f = f[X[y]];
                        Zl[D] = f
                    }
                    return f
                }
                return D
            }, def: function (C, u, w) {
                var p, Y, d, T = function () { };
                if (T.prototype = u.prototype, p = new T, dk(C)) {
                    if (Zl[C]) throw "'" + C + "' already defined";
                    d = gp(C), p.getClassName = function () {
                        return C
                    }
                } else d = C; if (p.constructor = d, p.getClass = function () {
                    return d
                }, p.getSuperClass = function () {
                    return u
                }, w)
                    for (Y in w) fb[Y] && fb.hasOwnProperty(Y) ? fb[Y](p, w) : Ug(p, w, Y);
                d.prototype = p, d.superClass = u.prototype
            }, startAnim: function () {
                var E = function (W) {
                    W.duration && (W.startTime = mm()), W.timeId = $e(W.tick, F, F, W.interval)
                };
                return function (R) {
                    return R = Pm(R), R.easing = R.easing || u.animEasing, R.duration || R.frames || (R.duration = u.animDuration), R.t = 0, R.duration ? R.interval = 0 : (R.frame = 0, R.interval = R.interval || 10), R.tick = function () {
                        if (R.duration) {
                            var z = (mm() - R.startTime) / R.duration;
                            if (z > 1 && (z = 1), R.t = z, R.action(R.easing(z), z), !R.isRunning()) return;
                            1 === z ? R.stop() : R._isPaused || (R.timeId = $e(R.tick))
                        } else {
                            if (R.frame++, z = R.t = R.frame / R.frames, R.action(R.easing(z), z), !R.isRunning()) return;
                            R.frame < R.frames ? R._isPaused || (R.timeId = $e(R.tick, F, F, R.interval)) : R.stop()
                        }
                    }, R.resume = function () {
                        R._isPaused && (delete R._isPaused, R.duration ? R.t < 1 && (R.startTime = mm() - R.duration * R.t, R.timeId = $e(R.tick)) : R.frame < R.frames && (R.timeId = $e(R.tick, F, F, R.interval)))
                    }, R.pause = function () {
                        td(R.timeId, !R.duration), R._isPaused = !0
                    }, R.isPaused = function () {
                        return this._isPaused
                    }, R.stop = function (Y) {
                        R.isRunning() && (td(R.timeId, !R.duration), delete R.timeId, R.duration ? R.t < 1 && Y && (R.t = 1, R.action(R.easing(1), 1)) : R.frame < R.frames && Y && (R.frame = R.frames, R.action(R.easing(1), 1)), R._37o && R._37o(), R.finishFunc && R.finishFunc())
                    }, R.isRunning = function () {
                        return R.timeId != F
                    }, R.delay ? $e(E, F, [R], R.delay) : E(R), R
                }
            }(),
            getTextSize: function () {
                var p = {},
                    x = U ? uo().getContext("2d") : F;
                return function (C, Q) {
                    x.font = C ? C : Fh;
                    var c = p[x.font];
                    return c || (c = 2 * x.measureText("e").width + 4, p[x.font] = c), {
                        width: x.measureText(Q).width + 4,
                        height: c
                    }
                }
            }(),
            drawText: function (v, Q, q, t, a, n, D, K, m, A) {
                if (Q != F) {
                    var H = ln(q, Q),
                        V = {};
                    V.y = A && A !== Sg ? A === $c ? n + H.height / 2 : n + K - H.height / 2 : n + K / 2, V.x = m && m !== nq ? m === fm ? a + D - H.width / 2 : a + D / 2 : a + H.width / 2, Lp(v, Q, V, q, t)
                }
            }, getDistance: function (x, U) {
                var $ = x.length;
                return U ? 3 === $ ? w(ds(x[0] - U[0]) + ds(x[1] - U[1]) + ds(x[2] - U[2])) : 2 === $ ? w(ds(x[0] - U[0]) + ds(x[1] - U[1])) : x.z === Z ? w(ds(U.x - x.x) + ds(U.y - x.y)) : w(ds(U.x - x.x) + ds(U.y - x.y) + ds(U.z - x.z)) : 3 === $ ? w(ds(x[0]) + ds(x[1]) + ds(x[2])) : 2 === $ ? w(ds(x[0]) + ds(x[1])) : void 0
            }, brighter: function (V, H) {
                return 0 > H && (H = -H), mp(V, H ? H : 40)
            }, darker: function (J, S) {
                return S > 0 && (S = -S), mp(J, S ? S : -40)
            }, unionPoint: function (C, U) {
                if (!C) return F;
                if (2 === arguments.length) return C && U ? {
                    x: V(C.x, U.x),
                    y: V(C.y, U.y),
                    width: X(C.x - U.x),
                    height: X(C.y - U.y)
                } : F;
                var u = C;
                if (u._as && (u = u._as), u.length === Z) return F;
                var G = u.length;
                if (0 >= G) return F;
                for (var O = 1, e = u[0], v = {
                    x: e.x,
                    y: e.y,
                    width: 0,
                    height: 0
                }; G > O; O++) {
                    e = u[O];
                    var h = V(v.x, e.x),
                        y = q(v.x + v.width, e.x),
                        p = V(v.y, e.y),
                        M = q(v.y + v.height, e.y);
                    v.x = h, v.y = p, v.width = y - h, v.height = M - p
                }
                return v
            }, unionRect: function (E, u) {
                if (E && !u) return Pm(E);
                if (!E && u) return Pm(u);
                if (E && u) {
                    var l = {
                        x: V(E.x, u.x),
                        y: V(E.y, u.y)
                    };
                    return l.width = q(E.x + E.width, u.x + u.width) - l.x, l.height = q(E.y + E.height, u.y + u.height) - l.y, l
                }
                return F
            }, containsPoint: function (p, I, Y, O) {
                if (O != F && 1 !== O) {
                    var u = p.x + p.width / 2,
                        T = p.y + p.height / 2;
                    p = {
                        x: u - p.width / 2 * O,
                        y: T - p.height / 2 * O,
                        width: p.width * O,
                        height: p.height * O
                    }
                }
                if (Y) {
                    var B = p.width / 2,
                        f = p.height / 2,
                        r = n(-Y),
                        q = k(-Y),
                        C = I.x - p.x - B,
                        G = I.y - p.y - f;
                    return I = {
                        x: q * C - r * G,
                        y: r * C + q * G
                    }, cf({
                        x: -B,
                        y: -f,
                        width: p.width,
                        height: p.height
                    }, I)
                }
                return !(!p || I.x < p.x || I.y < p.y || I.x > p.x + p.width || I.y > p.y + p.height)
            }, containsRect: function (G, W) {
                if (!G || !W) return !1;
                var P = W.x,
                    R = W.y,
                    k = W.width,
                    Z = W.height,
                    C = G.width,
                    F = G.height;
                if (0 > (C | F | k | Z)) return !1;
                var t = G.x,
                    Y = G.y;
                if (t > P || Y > R) return !1;
                if (C += t, k += P, P >= k) {
                    if (C >= t || k > C) return !1
                } else if (C >= t && k > C) return !1;
                if (F += Y, Z += R, R >= Z) {
                    if (F >= Y || Z > F) return !1
                } else if (F >= Y && Z > F) return !1;
                return !0
            }, intersectsRect: function (b, k) {
                if (!b || !k) return !1;
                var y = k.width,
                    K = k.height,
                    x = b.width,
                    M = b.height;
                if (0 >= x || 0 >= M || 0 >= y || 0 >= K) return !1;
                var O = k.x,
                    q = k.y,
                    f = b.x,
                    W = b.y;
                return x += f, M += W, y += O, K += q, x > O && M > q && y > f && K > W
            }, intersection: function (G, K) {
                if (!G || !K) return F;
                var S = K.x,
                    t = K.y,
                    b = G.x,
                    M = G.y,
                    Y = S,
                    W = t,
                    V = b,
                    L = M;
                return Y += K.width, W += K.height, V += G.width, L += G.height, b > S && (S = b), M > t && (t = M), Y > V && (Y = V), W > L && (W = L), Y -= S, W -= t, 0 >= Y || 0 >= W ? F : {
                    x: S,
                    y: t,
                    width: Y,
                    height: W
                }
            }, grow: function (_, P, E) {
                E === Z && (E = P), _.x -= P, _.y -= E, _.width = _.width + 2 * P, _.height = _.height + 2 * E
            }, getScreenPoint: function (v, m, Y, J, q, E, T) {
                var y = Y.getBoundingClientRect(),
                    Q = v * (E || 1) - Y.scrollLeft + (J || 0),
                    V = m * (T || 1) - Y.scrollTop + (q || 0),
                    b = Vg(Y, !1);
                if (b) {
                    var P = new tl(Q, V, 0);
                    return P.applyMatrix4(b), console.log(P), {
                        x: P.x,
                        y: P.y
                    }
                }
                return {
                    x: Q + y.left,
                    y: V + y.top
                }
            }, getLogicalPoint: function (L, v, q, G, r, A) {
                var d, n, o = v.getBoundingClientRect();
                L.target ? (ik(L) ? eg ? pl["91"] = !0 : pl["17"] = !0 : eg ? pl["91"] = !1 : pl["17"] = !1, pl["16"] = Pf(L) ? !0 : !1, L = li(L) ? Xj(L) : L, d = L.clientX, n = L.clientY) : (d = L.x, n = L.y);
                var H = Vg(v, !0);
                if (H) {
                    var m = new tl(d, n, 0);
                    m.applyMatrix4(H);
                    do {
                        if (Math.abs(m.z) <= 1e-6) break;
                        var F = new tl(d, n, 1);
                        if (F.applyMatrix4(matrix), Math.abs(F.z) <= 1e-6) {
                            m = F;
                            break
                        }
                        if (F.sub(m), Math.abs(F.z) <= 1e-6) break;
                        m.addScaledVector(F, -m.z / F.z)
                    } while (!1);
                    return {
                        x: (m.x + v.scrollLeft - (q || 0)) / (r || 1),
                        y: (m.y + v.scrollTop - (G || 0)) / (A || 1)
                    }
                }
                return {
                    x: (d - o.left + v.scrollLeft - (q || 0)) / (r || 1),
                    y: (n - o.top + v.scrollTop - (G || 0)) / (A || 1)
                }
            }, removeHTML: function () {
                var W;
                return function (J) {
                    return J && J.getView && (J = J.getView()), J && J.parentNode ? W === J ? !0 : (W = J, J.parentNode.removeChild(J), W = F, !0) : !1
                }
            }(),
            getToolTipDiv: function () {
                if (!Xm) {
                    Xm = dd(), xn = dd();
                    var L = Xm.style;
                    u.baseZIndex != F && (L.zIndex = Zb(u.baseZIndex) + 3 + ""), L.whiteSpace = "nowrap", L.color = u.toolTipLabelColor, L.background = u.toolTipBackground, L.font = u.toolTipLabelFont, L.padding = "5px", L.boxShadow = "0px 0px 3px " + u.toolTipShadowColor
                }
                return Xm
            }, isToolTipShowing: function () {
                return Xm && Xm.parentNode ? !0 : xn && xn.parentNode ? !0 : !1
            }, hideToolTip: function () {
                yj(Xm), yj(xn), Yp()
            }, showToolTip: function (N, B) {
                if (!N || B == F) return Um(), void 0;
                u.getToolTipDiv();
                var e, j;
                if (B.html ? (B = B.html, e = xn, yj(Xm)) : (e = Xm, yj(xn)), j = e.style, e.innerHTML = B, e.parentNode || O.Default.appendToScreen(e), N.target) {
                    N = Fd(N);
                    var f = hq(),
                        Q = N.x,
                        a = N.y,
                        K = nf ? 60 : 12;
                    if (nf) {
                        var c = e.getBoundingClientRect();
                        j.left = Q - c.width / 2 + oe, j.top = a - c.height - K < f.top ? a + K + oe : a - c.height - K + oe
                    } else {
                        j.left = Q + K + oe, j.top = a + K + oe;
                        var c = e.getBoundingClientRect();
                        c.left + c.width > f.width && (j.left = Q - K - c.width + oe), c.top + c.height > f.height && (j.top = a - K - c.height + oe), c.left < 0 && (j.left = Q + K + oe), c.top < 0 && (j.top = a + K + oe)
                    }
                } else j.left = N.x + oe, j.top = N.y + oe;
                Yp()
            }, startDragging: function (t, A, d) {
                d == Z && (d = !0), t !== si && (si ? d && (li(A) ? si.handleWindowTouchEnd(A) : si.handleWindowMouseUp(A)) : li(A) ? (K(x, wj, Ed), K(x, Sj, Zr)) : (K(x, rp, Kn), K(x, cj, tc)), si = t)
            }, getImageMap: function () {
                return Oe
            }, toBoundaries: function (y, n, A, w) {
                var T = [];
                return Yo(y, n, A, w).forEach(function (b) {
                    var V = [];
                    b.forEach(function (I) {
                        V.push(I.x, I.y)
                    }), T.push(V)
                }), T
            }, getCurrentKeyCodeMap: function () {
                return pl
            }, drawCenterImage: function (G, t, k, z, n, H, O, Q) {
                !n && H && H.isSelfViewEvent && (n = H);
                var Y = xc(t, n, H),
                    l = oo(t, n, H);
                Yd(G, t, A(k - Y / 2), A(z - l / 2), Y, l, n, H, O, Q)
            }, drawStretchImage: function (T, N, I, o, c, M, b, k, X, f, J, d) {
                !k && X && X.isSelfViewEvent && (k = X);
                var i, g = xc(N, k, X, M),
                    G = oo(N, k, X, b);
                "uniform" === I ? (i = V(M / g, b / G), g *= i, G *= i, o += A((M - g) / 2), c += A((b - G) / 2), M = g, b = G) : "centerUniform" === I && ((g > M || G > b) && (i = V(M / g, b / G), g *= i, G *= i), o += A((M - g) / 2), c += A((b - G) / 2), M = g, b = G);
                var u = T.interactiveInfo;
                if (u) {
                    var W;
                    if (W = "center" === I ? {
                        x: o + M / 2 - g / 2,
                        y: c + b / 2 - G / 2,
                        width: g,
                        height: G
                    } : {
                            x: o,
                            y: c,
                            width: M,
                            height: b
                        }, u.rect) {
                        var r = u.compInfos,
                            S = r.length;
                        S && (r[S - 1].rect.image = N)
                    } else u.rect = W
                }
                if ("center" === I) {
                    var F = J !== !1 && (g > M || G > b);
                    F && (T.save(), T.beginPath(), T.rect(o, c, M, b), T.clip()), Yd(T, N, o + M / 2 - g / 2, c + b / 2 - G / 2, g, G, k, X, f, d), F && T.restore()
                } else Yd(T, N, o, c, M, b, k, X, f, d)
            }, toCanvas: function (A, F, R, z, $, E, x, t, u) {
                A = ii(A, x), F = F || xc(A, $), R = R || oo(A, $);
                var X = uo(),
                    D = Wd(X);
                return t ? (Bn(X, F, R, t), D.scale(t, t)) : Bn(X, F, R, 1), qk(D, A, z, 0, 0, F, R, $, E, x, u), A && A.clampToEdge && (X.clampToEdge = A.clampToEdge), D.restore(), X
            }, toGrayColor: function (M) {
                if (!M) return M;
                var m = zd(M),
                    v = A(.299 * m[0] + .587 * m[1] + .114 * m[2]);
                return "rgba(" + v + "," + v + "," + v + "," + m[3] / 255 + ")"
            }, createGradientImage: function (Y, x, G, H) {
                for (var i = ["L", 0, 0, Y, 0, 1, 0, 0, 1, 0, 0], r = 0, e = Math.min(x.length, G.length); e > r; r++) i.push(G[r], x[r]);
                var X = O.Default.toCanvas({
                    width: Y,
                    height: Y,
                    clampToEdge: !0,
                    comps: [{
                        type: "shape",
                        rotation: H || 0,
                        points: [0, 0, Y, 0, Y, Y, 0, Y],
                        background: "#ffffff",
                        gradientPack: i
                    }]
                });
                return X
            }, createElement: function (h, _, X, Y) {
                var n = U.createElement(h);
                return Yq(n, _ || S.widgetBorder, 2), n.style.font = X ? X : Fh, Y != F && (n.value = Y), u.onElementCreated && u.onElementCreated(n), n
            }, containedInView: function (f, R) {
                var D = Bq(R).getBoundingClientRect();
                return cf({
                    x: D.left,
                    y: D.top,
                    width: D.width,
                    height: D.height
                }, lb(f))
            }, isIsolating: function () {
                return aj > 0
            }, setIsolating: function (i) {
                i ? aj++ : aj--
            }, getMSMap: function () {
                return fb
            }, stringify: function (E, m, w) {
                var r = Date.prototype.toJSON;
                Date.prototype.toJSON = function () {
                    return "__ht__date" + this.getTime()
                }, m = w ? 0 : m == F ? 2 : m;
                var A = JSON.stringify(E, function (K, $) {
                    return "function" == typeof $ ? "__ht__" + ($.__ht__ || $.toString()) : Bp($) ? Oo($) : $ instanceof O.List ? "__ht__list" + ($.__ht__list || u.stringify($._as)) : $
                }, m);
                return Date.prototype.toJSON = r, w && (A = Xl + bn(A)), A
            }, parse: function (M) {
                return dk(M) ? M.substr(0, 12) != Xl || (M = _o(M.substr(12)), dk(M)) ? JSON.parse(M, function (l, t) {
                    if (dk(t))
                        if ("__ht__function" == t.substr(0, 14)) {
                            var P = t.indexOf("{") + 1,
                                C = t.lastIndexOf("}"),
                                w = t.indexOf("(") + 1,
                                j = t.indexOf(")");
                            if (P && C && w && j) try {
                                var K = new Function(t.substring(w, j), t.substring(P, C));
                                return K.__ht__ = t.substr(6), K
                            } catch (v) {
                                throw console.info("=== SyntaxError ===\n", t), v
                            }
                        } else {
                            if ("__ht__date" == t.substr(0, 10)) return new Date(Zb(t.substr(10)));
                            if ("__ht__list" === t.substr(0, 10)) return new xr(u.parse(t.substr(10)))
                        }
                    return t
                }) : M : M
            }, loadJS: function (b, x) {
                x && b.push(x);
                var n = b.shift();
                if (ip(n)) b = n.contact(b), u.loadJS(b);
                else if (Mf(n)) n(), u.loadJS(b);
                else if (dk(n)) {
                    var m = U.createElement("script");
                    m.onload = function () {
                        u.loadJS(b)
                    }, m.setAttribute("src", n), U.getElementsByTagName("head")[0].appendChild(m)
                } else b.length && u.loadJS(b)
            }, extendClass: function (A, m) {
                var d = A.prototype;
                for (var Y in m) fb[Y] && fb.hasOwnProperty(Y) ? fb[Y](d, m) : d[Y] = m[Y]
            }, toRoundedCorner: function () {
                function f(Y, s, m) {
                    Y.x = s.x, Y.y = s.e || m, Y.z = s.y
                }
                var n = new tl,
                    u = new tl,
                    R = new tl,
                    A = new tl;
                return function (o, h) {
                    var _, e = 0;
                    o.getPoints && (e = o.getElevation(), o = o.getPoints()), _ = o instanceof xr ? o : new xr(o);
                    var t = _.size();
                    if (0 >= h) return {
                        points: _
                    };
                    var z = new xr,
                        C = new xr,
                        T = _.get(0);
                    f(n, T, e), z.add(T), C.add(1);
                    for (var S = 1; t > S; S++)
                        if (t > S + 1) {
                            var i = _.get(S),
                                p = _.get(S + 1);
                            f(u, i, e), f(R, p, e), A.subVectors(n, u).setLength(Math.min(.99 * A.length(), h)).add(u), i.e !== Z || T.e !== Z ? z.add({
                                x: A.x,
                                y: A.z,
                                e: A.y
                            }) : z.add({
                                x: A.x,
                                y: A.z
                            }), z.add(i), A.subVectors(R, u).setLength(Math.min(.99 * A.length(), h)).add(u), i.e !== Z || p.e !== Z ? z.add(T = {
                                x: A.x,
                                y: A.z,
                                e: A.y
                            }) : z.add(T = {
                                x: A.x,
                                y: A.z
                            }), n.copy(A), C.addAll([2, 3])
                        } else z.add(_.get(S)), C.add(2);
                    return {
                        points: z,
                        segments: C
                    }
                }
            }(),
            toColorData: zd,
            setCanvas: Bn,
            createDiv: dd,
            createDisabledDiv: lo,
            createView: ve,
            createCanvas: uo,
            appendChild: sn,
            initContext: Wd,
            checkLoadingImage: Dd,
            translateAndScale: tf,
            layout: qp,
            getPosition: Re,
            drawPoints: en,
            drawRoundRect: pg,
            drawBorder: Ie,
            setFocus: hr,
            getter: kp,
            setter: tg,
            isEmptyObject: wd,
            cameraPriority: function () {
                var V = {
                    skybox: 0,
                    main: 1e4,
                    top: 1e7,
                    infinity: 1 / 0
                };
                return o.seal(o.defineProperties({}, {
                    skybox: {
                        configurable: !1,
                        enumerable: !1,
                        get: function () {
                            return V.skybox
                        }, set: function (q) {
                            if (q >= V.main) throw new RangeError("Skybox camera must have lower priority than the main camera.");
                            V.skybox = Number(q)
                        }
                    },
                    main: {
                        configurable: !1,
                        enumerable: !1,
                        get: function () {
                            return V.main
                        }, set: function (T) {
                            if (T <= V.skybox) throw new RangeError("Main camera must have higher priority than the skybox camera.");
                            if (T >= V.top) throw new RangeError("Main camera must have lower priority than the top camera.");
                            V.main = Number(T)
                        }
                    },
                    top: {
                        configurable: !1,
                        enumerable: !1,
                        get: function () {
                            return V.top
                        }, set: function (r) {
                            if (r <= V.main) throw new RangeError("Top camera must have higher priority than the main camera.");
                            V.top = Number(r)
                        }
                    }
                }))
            }()
        }, !0), Uh(t, {
            autoAdjustIndex: 1,
            hierarchicalRendering: 1,
            adjustChildrenToTop: 1,
            autoHideScrollBar: 1,
            autoUpdate: 1,
            firstPersonMode: 1,
            ortho: 1,
            strict: 1,
            stickToRight: 1,
            instant: 1,
            closePath: 1,
            hierarchical: 1,
            doubleClickToToggle: 1,
            continuousLayout: 1,
            syncSize: 1
        }, !0);
        var Nn = u.disabledOpacity,
            gj = u.toolTipDelay,
            ij = u.devicePixelRatio,
            be = u.autoMakeVisible,
            jr = u.autoHideScrollBar,
            Nf = u.imageGradient,
            me = u.showToolTip,
            Um = u.hideToolTip,
            up = u.dashPattern,
            ob = u.lineCap,
            Wl = u.lineJoin,
            Dh = u.labelColor,
            rf = u.labelSelectColor,
            Fh = u.labelFont,
            kc = u.widgetIndent,
            Oi = u.widgetRowHeight,
            um = u.widgetHeaderHeight,
            Jk = u.widgetTitleHeight,
            Ch = u.scrollBarColor,
            di = u.scrollBarSize,
            Lg = u.scrollBarTimeout,
            un = u.scrollBarMinLength,
            co = u.scrollBarInteractiveSize,
            lq = u.zoomIncrement,
            _f = u.scrollZoomIncrement,
            db = u.pinchZoomIncrement,
            us = u.zoomMax,
            gh = u.zoomMin,
            Wn = u.createObject,
            Qc = u.preventDefault,
            _c = u.setImage,
            ii = u.getImage,
            Dr = u.isImageComplete,
            Ii = u.drawCenterImage,
            qk = u.drawStretchImage,
            xp = u.getId,
            $e = u.callLater,
            td = u.cancelLater,
            Sd = u.sortFunc,
            Pm = u.clone,
            gp = u.getClass,
            Sf = u.startAnim,
            Ee = u.brighter,
            cn = u.darker,
            nd = u.drawText,
            ln = u.getTextSize,
            jj = u.isLeftButton,
            Fm = u.isMiddleButton,
            tk = u.isRightButton,
            Qj = u.getTouchCount,
            wm = u.isDoubleClick,
            Pf = u.isShiftDown,
            ik = u.isCtrlDown,
            lb = u.getClientPoint,
            Fd = u.getPagePoint,
            En = u.getDistance,
            ms = u.unionPoint,
            ni = u.unionRect,
            cf = u.containsPoint,
            $k = u.containsRect,
            Kj = u.intersectsRect,
            ro = u.intersection,
            hq = u.getWindowInfo,
            vn = u.grow,
            Nm = u.getLogicalPoint,
            Qo = u.getScreenPoint,
            Ui = u.startDragging,
            yj = u.removeHTML,
            $g = u.createElement,
            Nl = u.segmentResolution,
            Cq = u.shapeResolution,
            rr = u.shapeSide,
            yc = u.def,
            ki = function (g, T, b) {
                yc(Y + "." + g, T, b)
            },
            zj = function (R, Q) {
                R.childNodes.forEach(function ($) {
                    Q($), zj($, Q)
                })
            };
        Uh(u, {
            toolTipLabelColor: Dh,
            toolTipLabelFont: Fh,
            toolTipBackground: S.toolTipBackground,
            toolTipShadowColor: od,
            debugTipLabelFont: Fh,
            debugTipLabelColor: Dh,
            debugTipBackground: S.toolTipBackground,
            drawBreakableText: Om,
            setDevicePixelRatio: function (m) {
                ij = u.devicePixelRatio = "number" == typeof m ? m : x.devicePixelRatio, zj(U.body, function (U) {
                    var k = U._ht;
                    k && k._canvas && (Bn(k._canvas, k.getWidth(), k.getHeight()), k.redraw ? k.redraw() : k.iv())
                })
            }
        }, !0);
        var Wp = 1e-6,
            $m = "undefined" != typeof Uint16Array ? Uint16Array : Array,
            fk = "undefined" != typeof Float32Array ? Float32Array : Array,
            fn = function (j, $, b) {
                var V = [j[0] - $[0], j[1] - $[1], j[2] - $[2]];
                if (b) {
                    var t = En(V);
                    t > 0 && (V[0] /= t, V[1] /= t, V[2] /= t)
                }
                return V
            },
            Cj = function () {
                var l = "charCodeAt",
                    $ = 2 * (2 * Ki.length + 1);
                for (var J in x)
                    if (J === Y + nq[0] + (oe.length + 2)) {
                        var w = x[J];
                        if (!w) break;
                        for (var A = w.length, R = 0; A > R; R++)
                            if (w[R][l](0) === $ && w[R + 1] != F && w[R + 1] === oe[0] && w[R + 2] != F && w[R + 2][l](0) === $) {
                                for (var N = R + 3; A > N; N++)
                                    if (w[N][l](0) === $) {
                                        if (0 == w[N + 1])
                                            for (var h, X = N + 2; A > X; X++) {
                                                if (w[X][l](0) === $) {
                                                    0 == w[X - 1] && h && ($f = h.substr(0, h.length - 1));
                                                    break
                                                }
                                                h == F ? h = w[X] : h += w[X]
                                            }
                                        break
                                    }
                                break
                            }
                        break
                    }
                return function (E) {
                    return [-E[0], -E[1], -E[2]]
                }
            }(),
            zc = function (u, n) {
                return 3 === u.length ? u[0] * n[0] + u[1] * n[1] + u[2] * n[2] : u[0] * n[0] + u[1] * n[1]
            },
            kn = function () {
                var $ = new Array(16);
                return $[0] = 1, $[1] = 0, $[2] = 0, $[3] = 0, $[4] = 0, $[5] = 1, $[6] = 0, $[7] = 0, $[8] = 0, $[9] = 0, $[10] = 1, $[11] = 0, $[12] = 0, $[13] = 0, $[14] = 0, $[15] = 1, $
            },
            Hd = kn(),
            Ql = function (q) {
                var L = new Array(16);
                return L[0] = q[0], L[1] = q[1], L[2] = q[2], L[3] = q[3], L[4] = q[4], L[5] = q[5], L[6] = q[6], L[7] = q[7], L[8] = q[8], L[9] = q[9], L[10] = q[10], L[11] = q[11], L[12] = q[12], L[13] = q[13], L[14] = q[14], L[15] = q[15], L
            },
            Vd = function (L, x) {
                return L[0] = x[0], L[1] = x[1], L[2] = x[2], L[3] = x[3], L[4] = x[4], L[5] = x[5], L[6] = x[6], L[7] = x[7], L[8] = x[8], L[9] = x[9], L[10] = x[10], L[11] = x[11], L[12] = x[12], L[13] = x[13], L[14] = x[14], L[15] = x[15], L
            },
            yi = function (s) {
                return s[0] = 1, s[1] = 0, s[2] = 0, s[3] = 0, s[4] = 0, s[5] = 1, s[6] = 0, s[7] = 0, s[8] = 0, s[9] = 0, s[10] = 1, s[11] = 0, s[12] = 0, s[13] = 0, s[14] = 0, s[15] = 1, s
            },
            Td = function (e, D) {
                var y = e[0],
                    q = e[1],
                    g = e[2];
                return e[0] = D[0] * y + D[4] * q + D[8] * g + D[12], e[1] = D[1] * y + D[5] * q + D[9] * g + D[13], e[2] = D[2] * y + D[6] * q + D[10] * g + D[14], e
            },
            Ek = function (o, K) {
                var A = o[0],
                    b = o[1],
                    V = o[2],
                    r = o[3];
                return o[0] = K[0] * A + K[4] * b + K[8] * V + K[12] * r, o[1] = K[1] * A + K[5] * b + K[9] * V + K[13] * r, o[2] = K[2] * A + K[6] * b + K[10] * V + K[14] * r, o[3] = K[3] * A + K[7] * b + K[11] * V + K[15] * r, o
            },
            Og = function () {
                var J, V, A, C, k = Hc(Fe[1] + Fe[7]),
                    Y = Hc(Fe[0] + Fe[3] - Fe[10]),
                    r = Hc(Fe[8] + 2),
                    e = function () {
                        return V = A.charAt(J), J += 1, V
                    },
                    f = function () {
                        var E = "";
                        if (V === r)
                            for (; e();) {
                                if (V === r) return e(), E;
                                E += V
                            } else e()
                    },
                    h = function () {
                        for (; V && " " >= V;) e()
                    },
                    W = function () {
                        var Z, v = {};
                        if (V === k) {
                            if (e(), h(), V === Y) return e(), v;
                            for (; V;) {
                                if (Z = f(), h(), e(), v[Z] = C(), h(), V === Y) return e(), v;
                                e(), h()
                            }
                        }
                    };
                return C = function () {
                    switch (h(), V) {
                        case k:
                            return W();
                        default:
                            return f()
                    }
                },
                    function (s) {
                        if (g = {}, s) {
                            var n;
                            if (A = s, J = 0, V = " ", n = C(), h(), !V) return n
                        }
                    }
            }(),
            uh = function (F, D) {
                if (D) {
                    var x = n(D),
                        e = k(D),
                        A = F[4],
                        f = F[5],
                        $ = F[6],
                        P = F[7],
                        d = F[8],
                        X = F[9],
                        u = F[10],
                        g = F[11];
                    F[4] = A * e + d * x, F[5] = f * e + X * x, F[6] = $ * e + u * x, F[7] = P * e + g * x, F[8] = d * e - A * x, F[9] = X * e - f * x, F[10] = u * e - $ * x, F[11] = g * e - P * x
                }
            },
            ah = function (p, v) {
                if (v) {
                    var m = n(v),
                        t = k(v),
                        R = p[0],
                        I = p[1],
                        f = p[2],
                        T = p[3],
                        x = p[8],
                        l = p[9],
                        K = p[10],
                        P = p[11];
                    p[0] = R * t - x * m, p[1] = I * t - l * m, p[2] = f * t - K * m, p[3] = T * t - P * m, p[8] = R * m + x * t, p[9] = I * m + l * t, p[10] = f * m + K * t, p[11] = T * m + P * t
                }
            },
            wo = function (v, W) {
                if (W) {
                    var u = n(W),
                        y = k(W),
                        H = v[0],
                        l = v[1],
                        K = v[2],
                        j = v[3],
                        U = v[4],
                        C = v[5],
                        t = v[6],
                        N = v[7];
                    v[0] = H * y + U * u, v[1] = l * y + C * u, v[2] = K * y + t * u, v[3] = j * y + N * u, v[4] = U * y - H * u, v[5] = C * y - l * u, v[6] = t * y - K * u, v[7] = N * y - j * u
                }
            },
            sj = function (E, G, W) {
                return Jn(F, W === !1 ? F : E.getFinalScale3d(), E.getFinalRotation3d(), E.getRotationMode(), E.p3(), F, G)
            },
            Jn = function (j, G, c, h, a, B, M) {
                return B || (B = kn()), a && bo(B, a), Cl(B, c, h), M && xo(B, B, M), G && Bd(B, G), j && xo(B, B, j), B
            },
            pf = function (k, b, l) {
                b = Zb(b), l = Zb(l);
                var P = this;
                P.g = k, P._84O = b, P._85O = l, P._70I = !0, P.F = 0, P._83O = b + l, P.pen = {
                    x: 0,
                    y: 0
                }
            },
            ph = "lineDashOffset",
            Ue = "setLineDash",
            xf = function ($) {
                for (var N in $) 1 === N.length && (ph = $[N]);
                return N ? 1 : 0
            },
            ls = function (W, I, U) {
                return Ro(I) ? W : W[Ue] ? (W[Ue](I), U && (W.lineDashOffset = U), W) : new pf(W, I[0], I.length > 1 ? I[1] : I[0])
            },
            _l = function (A, d) {
                !Ro(d) && A[Ue] && (A[Ue](Pc), A.lineDashOffset = 0)
            };
        if (yc(pf, o, {
            _69I: 6,
            moveTo: function (V, e) {
                var t = this,
                    D = t.pen;
                D.x = V, D.y = e, t.g.moveTo(V, e), t.start || (t.start = {
                    x: V,
                    y: e
                })
            }, lineTo: function (S, $) {
                var O = this,
                    V = O.pen,
                    N = S - V.x,
                    G = $ - V.y,
                    E = D(G, N),
                    v = k(E),
                    R = n(E),
                    U = O._23O(V.x, V.y, S, $),
                    y = O._85O,
                    A = O._84O,
                    b = O._83O;
                if (O.F) {
                    if (O.F > U) return O._70I ? O._72I(S, $) : O.moveTo(S, $), O.F -= U, void 0;
                    if (O._70I ? O._72I(V.x + v * O.F, V.y + R * O.F) : O.moveTo(V.x + v * O.F, V.y + R * O.F), U -= O.F, O.F = 0, O._70I = !O._70I, !U) return
                }
                var r = T(U / b);
                if (r) {
                    for (var B = v * A, e = R * A, K = v * y, w = R * y, z = 0; r > z; z++) O._70I ? (O._72I(V.x + B, V.y + e), O.moveTo(V.x + K, V.y + w)) : (O.moveTo(V.x + K, V.y + w), O._72I(V.x + B, V.y + e));
                    U -= b * r
                }
                O._70I ? U > A ? (O._72I(V.x + v * A, V.y + R * A), O.moveTo(S, $), O.F = y - (U - A), O._70I = !1) : (O._72I(S, $), U === A ? (O.F = 0, O._70I = !O._70I) : (O.F = A - U, O.moveTo(S, $))) : U > y ? (O.moveTo(V.x + v * y, V.y + R * y), O._72I(S, $), O.F = A - (U - y), O._70I = !0) : (O.moveTo(S, $), U === y ? (O.F = 0, O._70I = !O._70I) : O.F = y - U)
            }, quadraticCurveTo: function (y, h, r, f) {
                var E, x = this,
                    i = x.pen,
                    z = i.x,
                    d = i.y,
                    w = x._22O(z, d, y, h, r, f),
                    M = 0,
                    C = 0,
                    t = x._85O,
                    X = x._84O;
                if (x.F) {
                    if (x.F > w) return x._70I ? x._71I(y, h, r, f) : x.moveTo(r, f), x.F -= w, void 0;
                    if (M = x.F / w, E = x._20O(z, d, y, h, r, f, M), x._70I ? x._71I(E[2], E[3], E[4], E[5]) : x.moveTo(E[4], E[5]), x.F = 0, x._70I = !x._70I, !w) return
                }
                var e = w - w * M,
                    P = T(e / x._83O),
                    G = X / w,
                    W = t / w;
                if (P)
                    for (var K = 0; P > K; K++) x._70I ? (C = M + G, E = x._21O(z, d, y, h, r, f, M, C), x._71I(E[2], E[3], E[4], E[5]), M = C, C = M + W, E = x._21O(z, d, y, h, r, f, M, C), x.moveTo(E[4], E[5])) : (C = M + W, E = x._21O(z, d, y, h, r, f, M, C), x.moveTo(E[4], E[5]), M = C, C = M + G, E = x._21O(z, d, y, h, r, f, M, C), x._71I(E[2], E[3], E[4], E[5])), M = C;
                e = w - w * M, x._70I ? e > X ? (C = M + G, E = x._21O(z, d, y, h, r, f, M, C), x._71I(E[2], E[3], E[4], E[5]), x.moveTo(r, f), x.F = t - (e - X), x._70I = !1) : (E = x._19O(z, d, y, h, r, f, M), x._71I(E[2], E[3], E[4], E[5]), w === X ? (x.F = 0, x._70I = !x._70I) : (x.F = X - e, x.moveTo(r, f))) : e > t ? (C = M + W, E = x._21O(z, d, y, h, r, f, M, C), x.moveTo(E[4], E[5]), E = x._19O(z, d, y, h, r, f, C), x._71I(E[2], E[3], E[4], E[5]), x.F = X - (e - t), x._70I = !0) : (x.moveTo(r, f), e === t ? (x.F = 0, x._70I = !x._70I) : x.F = t - e)
            }, bezierCurveTo: function () {
                var M = arguments;
                this.pen = {
                    x: M[4],
                    y: M[5]
                }, this.g.bezierCurveTo(M[0], M[1], M[2], M[3], M[4], M[5])
            }, arc: function (M, g, v, C, e, S) {
                S || (C = -C, e = -e), mo(this, M, g, C, e - C, v, v, !1)
            }, rect: function (G, z, t, $) {
                var Q = this;
                Q.pen = {
                    x: G,
                    y: z
                }, Q.moveTo(G, z), Q.lineTo(G, z + $), Q.lineTo(G + t, z + $), Q.lineTo(G + t, z), Q.lineTo(G, z)
            }, beginPath: function () {
                this.g.beginPath()
            }, closePath: function () {
                this.lineTo(this.start.x, this.start.y)
            }, _23O: function (O, c, l, Z) {
                var h = l - O,
                    b = Z - c;
                return w(h * h + b * b)
            }, _22O: function (X, t, r, J, o, W, I) {
                for (var z, e, q, $, a, A, Z, V = 0, G = X, s = t, m = I > 0 ? I : this._69I, w = 1; m >= w; w++) q = w / m, $ = 1 - q, a = $ * $, A = 2 * q * $, Z = q * q, z = a * X + A * r + Z * o, e = a * t + A * J + Z * W, V += this._23O(G, s, z, e), G = z, s = e;
                return V
            }, _21O: function (y, E, z, L, g, U, I, f) {
                var J = this;
                if (0 === I) return J._20O(y, E, z, L, g, U, f);
                if (1 === f) return J._19O(y, E, z, L, g, U, I);
                var H = J._20O(y, E, z, L, g, U, f);
                return H.push(I / f), J._19O.apply(J, H)
            }, _20O: function (x, O, o, T, a, m, N) {
                if (1 !== N) {
                    var C = o + (a - o) * N,
                        g = T + (m - T) * N;
                    o = x + (o - x) * N, T = O + (T - O) * N, a = o + (C - o) * N, m = T + (g - T) * N
                }
                return [x, O, o, T, a, m]
            }, _19O: function (l, A, I, d, Y, r, h) {
                if (1 !== h) {
                    var w = l + (I - l) * h,
                        P = A + (d - A) * h;
                    I += (Y - I) * h, d += (r - d) * h, l = w + (I - w) * h, A = P + (d - P) * h
                }
                return [l, A, I, d, Y, r]
            }, _72I: function (u, $) {
                var j = this.pen;
                (u !== j.x || $ !== j.y) && (j.x = u, j.y = $, this.g.lineTo(u, $))
            }, _71I: function (u, i, t, y) {
                var U = this.pen;
                (u !== t || i !== y || t !== U.x || y !== U.y) && (U.x = t, U.y = y, this.g.quadraticCurveTo(u, i, t, y))
            }
        }), _ && ge) {
            var vk = ge.toString();
            Ad = vk.indexOf(fc.substr(0, 2)) > 0 && vk.indexOf($c + $c.substr(1, 1)) > 1 || vk.indexOf(Kb.substr(0, 2) + fc.substr(2, 2) + nq[0] + fc[4]) > 1 ? !0 : !1
        }
        var mc = F,
            md = F,
            Fo = u.checkLoadingCompType = function (N) {
                mc && !N._72O && (md || (md = {}), md[N._72O = xp()] = N)
            },
            qs = function (K, s) {
                if (s || (s = K), s && (mc || (mc = {}), !mc[K])) {
                    var z = new De;
                    if (mc[s] = {
                        request: z,
                        url: s
                    }, s = u.beforeLoadURL(s, K), s.data) {
                        var M = u.parse(s.data);
                        Ko(K, M), u.handleCompTypeLoaded(K, M)
                    } else {
                        z.onload = function () {
                            if (200 === this.status || 0 === this.status) {
                                var O = u.parse(z.getResponseText());
                                Ko(K, O), u.handleCompTypeLoaded(K, O)
                            } else Ko(K, F)
                        }, z.onerror = function () {
                            Ko(K, F)
                        };
                        var n = {};
                        n.url = encodeURI(s), n.sync = !1, z.send(n)
                    }
                }
            },
            Ko = function (J, M) {
                if (Xh[J] = M, delete mc[J], wd(mc) && (mc = F, md)) {
                    for (var e in md) {
                        var H = md[e];
                        H.invalidateAll && H.invalidateAll(Z, "compTypeLoaded", J), H.redraw && H.redraw(), H.iv(), delete H._72O
                    }
                    md = F
                }
                if (M && md)
                    for (var e in md) {
                        var H = md[e];
                        H.invalidateAll && H.invalidateAll(Z, "compTypeLoading", J), H.redraw && H.redraw(), H.iv()
                    }
            },
            ch = S.chart,
            Nh = "",
            Jp = !0,
            Hn = u.compStack = [],
            Yf = /^style@/,
            Gn = /^attr@/,
            Se = /^field@/,
            Tm = {
                x: .5,
                y: .5
            },
            _m = function () {
                Jp = !0
            },
            zm = function () {
                return Jp
            },
            xc = function (h, H, K, I) {
                if (!h) return 0;
                if (Dj(h.fitSize, H, K) && I) return I;
                var W = Dj(h.width, H, K);
                return null == W ? 20 : W
            },
            oo = function (w, n, L, E) {
                if (!w) return 0;
                if (Dj(w.fitSize, n, L) && E) return E;
                var J = Dj(w.height, n, L);
                return null == J ? 20 : J
            },
            Dj = function (g, v, b) {
                if (!g || !g.func) return g;
                var R, I = g.func,
                    H = g.value;
                return R = Mf(I) ? b && b.vectorDataBindingDisabled && !g.isSafeFunc ? H : I(v, b) : v instanceof Qp || (O.ui ? v instanceof O.ui.View : 0) ? Gn.test(I) ? v.a(Nh + I.slice(5)) : Yf.test(I) ? v.s(Nh + I.slice(6)) : Se.test(I) ? v[I.slice(6)] : v[I] ? v[I](b) : H : H, H !== Z && R == F ? H : R
            },
            Yd = u.drawImage = function () {
                var f, d, h, s, z, A, v = function (Y, v) {
                    Y.getValue && Y.getValue.compType === v || (Y.getValue = function (I) {
                        var u = Q(Y, I);
                        if (u === Z && v.properties) {
                            var T = v.properties[I];
                            T && (u = T.defaultValue)
                        }
                        return u
                    }, Y.getColor = function (W, S) {
                        return S === !0 ? b(W) : b(Y.getValue(W))
                    }, Y.getValue.compType = v)
                },
                    Q = function (n, l, s) {
                        var e, B = !1;
                        if (n.prefix && d instanceof Qp) {
                            var c = d.a(Nh + l);
                            c !== Z && (B = !0, e = c)
                        }
                        return e === Z && (e = n[l]), e && e.func && (B = !0, e = Dj(e, d, h)), s && (e = s(e), B || (n[l] = e)), e
                    },
                    b = function (P, B) {
                        var D;
                        return D = B ? Q(P, B) : P, f && f.compGray && D ? u.toGrayColor(D) : z && D ? nm(D, z, A) : D
                    },
                    X = function (j) {
                        if (ip(j)) {
                            for (var L = new xr, b = j.length, n = 0; b > n; n += 2) L.add({
                                x: j[n],
                                y: j[n + 1]
                            });
                            j = L
                        }
                        return j
                    },
                    D = function (G) {
                        var b = Q(G, "anchorX"),
                            c = Q(G, "anchorY");
                        if (b !== Z || c !== Z) return {
                            x: b === Z ? Tm.x : b,
                            y: c === Z ? Tm.y : c
                        };
                        var f = Q(G, "type"),
                            e = Q(G, "name");
                        if ("image" !== f || !e) return Tm;
                        var J = ii(e);
                        return J && J.anchorX !== Z && J.anchorY !== Z ? {
                            x: J.anchorX,
                            y: J.anchorY
                        } : Tm
                    },
                    p = function (W, t) {
                        var y = Q(W, Tq),
                            E = D(W);
                        if (ip(y)) {
                            var x = y.length,
                                r = Q(W, "relative"),
                                z = t.width,
                                T = t.height;
                            if (4 === x) y = {
                                x: y[0],
                                y: y[1],
                                width: y[2],
                                height: y[3]
                            }, r && (y.x *= z, y.y *= T, y.width *= z, y.height *= T);
                            else if (3 === x) {
                                var J = y[0];
                                y = {
                                    width: y[1],
                                    height: y[2]
                                }, r && (y.width *= z, y.height *= T), "object" == typeof J ? J.length && (J = {
                                    x: J[0],
                                    y: J[1]
                                }) : J = Re(J, t, y), y.x = J.x - y.width * E.x, y.y = J.y - y.height * E.y
                            }
                            y.x += Q(W, "offsetX") || 0, y.y += Q(W, "offsetY") || 0, !r && t.fitSize && (y = M(W, y, t))
                        }
                        return y
                    },
                    M = function (n, s, T) {
                        if (s) {
                            var l, a, q, B = {
                                x: s.x,
                                y: s.y,
                                width: s.width,
                                height: s.height
                            },
                                u = D(n),
                                U = Q(n, "layoutH"),
                                m = Q(n, "layoutV"),
                                Y = 1,
                                t = 1,
                                P = 0,
                                v = 0,
                                Z = 1,
                                f = 1;
                            switch (U) {
                                case "left":
                                    break;
                                case "right":
                                    B.x += T.width - T.rw;
                                    break;
                                case "center":
                                    B.x += .5 * (T.width - T.rw);
                                    break;
                                case "scale":
                                case "leftright":
                                default:
                                    l = Q(n, ac) || 0, l && (P = Math.abs(v = Math.sin(l)), Z = Math.abs(f = Math.cos(l))), "leftright" !== U ? (Y += Z * (T.widthScale - 1), t += P * (T.widthScale - 1)) : (Y += B.width ? Z * (T.width - T.rw) / B.width : 0, t += B.height ? P * (T.width - T.rw) / B.height : 0, a = -Math.min(-u.x * f + u.y * v, -u.x * f - (1 - u.y) * v, (1 - u.x) * f + u.y * v, (1 - u.x) * f - (1 - u.y) * v))
                            }
                            switch (m) {
                                case "top":
                                    break;
                                case "bottom":
                                    B.y += T.height - T.rh;
                                    break;
                                case "center":
                                    B.y += .5 * (T.height - T.rh);
                                    break;
                                case "scale":
                                case "topbottom":
                                default:
                                    l == F && (l = Q(n, ac), l && (P = Math.abs(v = Math.sin(l)), Z = Math.abs(f = Math.cos(l)))), "topbottom" !== m ? (Y += P * (T.heightScale - 1), t += Z * (T.heightScale - 1)) : (Y += B.width ? P * (T.height - T.rh) / B.width : 0, t += B.height ? Z * (T.height - T.rh) / B.height : 0, q = -Math.min(-u.x * v - u.y * f, -u.x * v + (1 - u.y) * f, (1 - u.x) * v - u.y * f, (1 - u.x) * v + (1 - u.y) * f))
                            }
                            return (1 !== Y || 1 !== t) && ("scale" !== U && U ? "leftright" === U && (B.x += B.width * (1 - Y) * u.x + a * (T.width - T.rw)) : B.x += B.x * (T.widthScale - 1) + u.x * B.width * (T.widthScale - Y), "scale" !== m && m ? "topbottom" === m && (B.y += B.height * (1 - t) * u.y + q * (T.height - T.rh)) : B.y += B.y * (T.heightScale - 1) + u.y * B.height * (T.heightScale - t), B.width *= Y, B.height *= t), B.width < 0 && (B.width = 0), B.height < 0 && (B.height = 0), B
                        }
                    },
                    y = function (J) {
                        return ip(J) ? new xr(J) : J
                    },
                    W = function (o, c, I, $, x, R, T) {
                        var G = f.interactiveInfo,
                            _ = o.transform;
                        if (_) return f.save(), f.setTransform(_.a, _.b, _.c, _.d, _.tx, _.ty), G && G.compInfos.push({
                            comp: o,
                            rect: c,
                            matrix: _.clone(),
                            prefix: Nh,
                            refRect: G.refRect
                        }), !0;
                        x === Z && (x = 1), R === Z && (R = 1);
                        var S = Q(o, "clipPercentage"),
                            W = jg(I, c);
                        if (W && !$ && 1 === x && 1 === R && !(1 > S)) return G && G.compInfos.push({
                            comp: o,
                            rect: c,
                            matrix: G.matrix.clone(),
                            prefix: Nh,
                            refRect: G.refRect
                        }), !1;
                        T = T || Tm;
                        var N = c.x + c.width * T.x,
                            M = c.y + c.height * T.y,
                            p = I.x + I.width * T.x,
                            j = I.y + I.height * T.y,
                            E = I.width ? x * (c.width / I.width) : 1,
                            k = I.height ? R * (c.height / I.height) : 1;
                        if (f.save(), G && (G.matrix.appendTranslate(N, M).appendRotate($).appendScale(E, k).appendTranslate(-p, -j), G.compInfos.push({
                            comp: o,
                            rect: c,
                            matrix: G.matrix.clone(),
                            prefix: Nh,
                            refRect: G.refRect
                        })), wh(f, N, M), jc(f, $ || 0), ec(f, E, k), wh(f, -p, -j), 1 > S) {
                            0 > S && (S = 0);
                            var w = Wh(I, Q(o, "clipDirection"), S);
                            f.beginPath(), f.rect(w.x, w.y, w.width, w.height), f.clip()
                        }
                        return !0
                    },
                    O = function () {
                        f.restore()
                    },
                    S = function (n, N, G) {
                        var o = Q(n, "path"),
                            z = Q(n, ac),
                            L = Q(n, "scaleX"),
                            l = Q(n, "scaleY"),
                            m = D(n),
                            P = F,
                            S = jp(null, o);
                        if (G || (G = n.unionRect, G || (G = ms(S), n.path.func || (n.unionRect = G)), P = G), G) {
                            P || (P = n.unionRect, P || (P = ms(S), n.path.func || (n.unionRect = P)));
                            var q = W(n, G, P, z, L, l, m),
                                c = Q(n, "borderPattern"),
                                v = ls(f, c),
                                a = b(n, "background"),
                                r = b(n, "borderColor"),
                                H = Q(n, "borderWidth"),
                                j = Q(n, "gradient"),
                                B = b(n, "gradientColor"),
                                y = Q(n, "border3d"),
                                U = b(n, "border3dColor"),
                                Y = Q(n, "border3dAccuracy"),
                                I = f.lineJoin,
                                X = f.lineCap;
                            f.lineJoin = Q(n, "borderJoin") || Wl, f.lineCap = Q(n, "borderCap") || ob, a ? (Ge(f, a, j, B, P), jp(f, o), f.fill(), v !== f && jp(f, o)) : jp(f, o);
                            var M = Q(n, "borderWidthAbsolute");
                            if (M && (f.save(), f.setTransform(1, 0, 0, 1, 0, 0)), H && r && (f.lineWidth = H, f.strokeStyle = r, f.stroke(), y && fr(f, r, U, H, s, Y)), _l(f, c), Q(n, "dash")) {
                                var h = Q(n, "dashWidth") || H;
                                if (h > 0) {
                                    c = Q(n, "dashPattern") || up;
                                    var v = ls(f, c, Q(n, "dashOffset")),
                                        Z = b(n, "dashColor") || b(dm);
                                    v !== f && jp(f, o), f.strokeStyle = Z, f.lineWidth = h, f.stroke(), Q(n, "dash3d") && fr(f, Z, b(n, "dash3dColor"), h, s, Q(n, "dash3dAccuracy")), _l(f, c)
                                }
                            }
                            M && f.restore(), N === Tq && Wq(f, a, Q(n, "depth"), P), f.lineJoin = I, f.lineCap = X, q && O()
                        }
                    },
                    N = function ($, e, T, p) {
                        var x = Q($, _b, X),
                            G = Q($, ac),
                            B = D($);
                        if (x && p.fitSize) {
                            var m = new xr,
                                V = ms(x),
                                Y = M($, V, p),
                                P = V.x + B.x * V.width,
                                _ = V.y + B.y * V.height,
                                K = Y.x + B.x * Y.width,
                                u = Y.y + B.y * Y.height,
                                N = V.width ? Y.width / V.width : 1,
                                c = V.height ? Y.height / V.height : 1;
                            x.each(function (w) {
                                m.add({
                                    x: K + (w.x - P) * N,
                                    y: u + (w.y - _) * c
                                })
                            }), x = m, $.unionRect = null
                        }
                        var j = Q($, "scaleX"),
                            C = Q($, "scaleY"),
                            v = e === bl,
                            R = F;
                        if (!T && v && (T = $.unionRect, T || (T = ms(x), $.points.func || ($.unionRect = T)), R = T), T) {
                            v ? R || (R = $.unionRect, R || (R = ms(x), $.points.func || ($.unionRect = R))) : R = T;
                            var i, r, o, n, E = W($, T, R, G, j, C, B),
                                S = Q($, "borderPattern"),
                                H = ls(f, S),
                                w = b($, "background"),
                                U = ii(Q($, "repeatImage"), z, A),
                                q = Q($, "gradientPack"),
                                k = b($, "borderColor"),
                                g = Q($, "borderWidth"),
                                I = ii(Q($, "borderRepeatImage"), z, A),
                                J = Q($, "segments", y),
                                l = Q($, "gradient"),
                                t = b($, "gradientColor"),
                                L = Q($, "border3d"),
                                a = b($, "border3dColor"),
                                Z = Q($, "border3dAccuracy"),
                                Gd = Q($, "closePath"),
                                gg = Q($, "fillRule") || "nonzero",
                                kk = f.lineJoin,
                                Pq = f.lineCap;
                            if (f.lineJoin = Q($, "borderJoin") || Wl, f.lineCap = Q($, "borderCap") || ob, v)
                                if (w || U || q) {
                                    var Te = Q($, "fillClipPercentage");
                                    if (1 > Te) {
                                        0 > Te && (Te = 0);
                                        var km = Wh(R, Q($, "fillClipDirection"), Te);
                                        f.save(), f.beginPath(), f.rect(km.x, km.y, km.width, km.height), f.clip()
                                    }
                                    en(f, x, J, Gd), q ? uq(f, q, b) : U ? fg(f, U, z, A, d, h) : Ge(f, w, l, t, R), f.fill(gg), q && f.restore(), 1 > Te && f.restore(), H !== f && en(H, x, J, Gd)
                                } else en(H, x, J, Gd);
                            else if ("roundRect" === e ? i = Q($, "cornerRadius") : "polygon" === e ? i = Q($, "polygonSide") : "arc" === e && (i = Q($, "arcFrom"), r = Q($, "arcTo"), o = Q($, "arcClose"), n = Q($, "arcOval")), w || U || q) {
                                var Te = Q($, "fillClipPercentage");
                                if (1 > Te) {
                                    0 > Te && (Te = 0);
                                    var km = Wh(R, Q($, "fillClipDirection"), Te);
                                    f.save(), f.beginPath(), f.rect(km.x, km.y, km.width, km.height), f.clip()
                                }
                                Ej(f, e, R, i, r, o, n), q ? uq(f, q, b) : U ? fg(f, U, z, A, d, h) : Ge(f, w, l, t, R), f.fill(gg), q && f.restore(), 1 > Te && f.restore(), f !== H && Ej(H, e, R, i, r, o, n)
                            } else Ej(H, e, R, i, r, o, n);
                            var yh = Q($, "borderWidthAbsolute");
                            if (yh && (f.save(), f.setTransform(1, 0, 0, 1, 0, 0)), g && (k || I) && (f.lineWidth = g, I ? qb(f, I, z, A, d, h) : f.strokeStyle = k, f.stroke(), L && fr(f, k, a, g, s, Z)), _l(f, S), Q($, "dash")) {
                                var Yi = Q($, "dashWidth") || g;
                                if (Yi > 0) {
                                    S = Q($, "dashPattern") || up;
                                    var H = ls(f, S, Q($, "dashOffset")),
                                        Yr = b($, "dashColor") || b(dm);
                                    H !== f && (v ? en(H, x, J, Gd) : Ej(H, e, R, i, r, o, n)), f.strokeStyle = Yr, f.lineWidth = Yi, f.stroke(), Q($, "dash3d") && fr(f, Yr, b($, "dash3dColor"), Yi, s, Q($, "dash3dAccuracy")), _l(f, S)
                                }
                            }
                            yh && f.restore(), e === Tq && Wq(f, w, Q($, "depth"), R), f.lineJoin = kk, f.lineCap = Pq, E && O()
                        }
                    },
                    K = function (u, U) {
                        var Z = z || Q(u, dg),
                            w = A || Q(u, "blendMode"),
                            D = Q(u, "name"),
                            o = ii(D, Z, w);
                        o ? qk(f, o, Q(u, "stretch"), U.x, U.y, U.width, U.height, d, h, Z, null, w) : Jp = !1
                    },
                    L = function (G, c) {
                        var g = Q(G, "text");
                        g != F && nd(f, g, Q(G, "font"), b(G, dg), c.x, c.y, c.width, c.height, Q(G, "align"), Q(G, "vAlign"))
                    },
                    G = function (A, d) {
                        Ie(f, b(A, dg), d.x, d.y, d.width, d.height, Q(A, "width"))
                    },
                    P = function (p, W) {
                        var E = Q(p, kd),
                            D = 0;
                        if (E && (E.forEach(function (V) {
                            D += V
                        }), D > 0)) {
                            for (var h = Q(p, "colors") || ch, B = Q(p, "startAngle") || 0, R = Q(p, "hollow"), I = Q(p, Bg), N = Q(p, Vm), M = Q(p, fe), P = I ? new xr : F, t = W.x, v = W.y, m = W.width, z = W.height, Y = t + m / 2, r = v + z / 2, y = V(m, z) / 2, j = 0, l = 0; l < E.length; l++) {
                                var c = E[l],
                                    x = $ * c / D,
                                    U = B + x;
                                if (f.fillStyle = h[j++], j === h.length && (j = 0), f.beginPath(), R) {
                                    var q = Y + k(B) * y / 2,
                                        i = r + n(B) * y / 2,
                                        A = Y + k(U) * y,
                                        X = r + n(U) * y;
                                    f.moveTo(q, i), f.arc(Y, r, y / 2, B, U, !1), f.lineTo(A, X), f.arc(Y, r, y, U, B, !0)
                                } else f.moveTo(Y, r), f.arc(Y, r, y, U, B, !0);
                                P && (x = (B + U) / 2, P.add({
                                    text: Mf(I) ? I(c, l, D, d) : c,
                                    x: Y + .75 * k(x) * y,
                                    y: r + .75 * n(x) * y
                                })), f.closePath(), f.fill(), B = U
                            }
                            P && P.each(function (t) {
                                nd(f, t.text, N, M, t.x, t.y, 0, 0, sc)
                            })
                        }
                    },
                    I = function (X, l) {
                        var o = Q(X, Kh);
                        if (o && o.length > 0) {
                            var P = o.length,
                                T = Q(X, Bg),
                                R = Q(X, Vm),
                                S = Q(X, fe),
                                b = T ? new xr : F,
                                w = Q(X, "minValue") || 0,
                                n = Q(X, "maxValue");
                            if (n == F && (n = 0, o.forEach(function (A) {
                                Q(A, kd).forEach(function (v) {
                                    n = q(n, v)
                                })
                            })), w === n) return;
                            for (var x = l.height / (n - w), t = l.y + n * x, c = Q(o[0], kd).length, I = l.width / (3 * c + 1), r = 2 * I / P, h = 0, M = 0; P > M; M++)
                                for (var s = o[M], k = Q(s, dg), j = Q(s, "colors"), B = Q(s, kd), K = 0; c > K; K++) {
                                    j ? f.fillStyle = j[K] : k ? f.fillStyle = k : (f.fillStyle = ch[h++], h === ch.length && (h = 0));
                                    var C = B[K],
                                        Z = C * x,
                                        z = l.x + (1 + 3 * K) * I + M * r;
                                    if (fl(f, z, t - Z, r, Z), b) {
                                        var W = Mf(T) ? T(C, K, s, d) : C,
                                            H = ln(R, W).height;
                                        b.add({
                                            x: z,
                                            y: t - Z - H,
                                            width: r,
                                            height: H,
                                            text: W
                                        })
                                    }
                                }
                            b && b.each(function (L) {
                                nd(f, L.text, R, S, L.x, L.y, L.width, L.height, sc)
                            })
                        }
                    },
                    j = function (T, g) {
                        var v = Q(T, Kh);
                        if (v && v.length > 0) {
                            var u = v.length,
                                $ = Q(v[0], kd).length,
                                H = g.width / (3 * $ + 1),
                                B = 0,
                                w = Q(T, "maxValue"),
                                S = Q(T, Bg),
                                U = Q(T, Vm),
                                M = Q(T, fe),
                                D = S ? new xr : F;
                            if (w == F) {
                                w = 0;
                                for (var O = 0; $ > O; O++) {
                                    for (var C = 0, V = 0; u > V; V++) C += Q(v[V], kd)[O];
                                    w = q(w, C)
                                }
                            }
                            if (w > 0) {
                                for (var O = 0; $ > O; O++)
                                    for (var m = g.y + g.height, V = 0; u > V; V++) {
                                        var J = v[V],
                                            Y = Q(J, dg),
                                            z = Q(J, kd)[O],
                                            E = z / w * g.height;
                                        Y ? f.fillStyle = Y : (f.fillStyle = ch[B++], B === ch.length && (B = 0)), m -= E;
                                        var k = {
                                            x: g.x + (1 + 3 * O) * H,
                                            y: m,
                                            width: 2 * H,
                                            height: E
                                        };
                                        fl(f, k.x, k.y, k.width, k.height), D && (k.text = Mf(S) ? S(z, O, J, d) : z, D.add(k))
                                    }
                                D && D.each(function (n) {
                                    nd(f, n.text, U, M, n.x, n.y, n.width, n.height, sc)
                                })
                            }
                        }
                    },
                    r = function (L, R) {
                        var C = Q(L, Kh);
                        if (C && C.length > 0) {
                            for (var q = C.length, V = Q(C[0], kd).length, u = R.width / (3 * V + 1), Y = 0, K = Q(L, Bg), N = Q(L, Vm), t = Q(L, fe), b = K ? new xr : F, r = 0; V > r; r++) {
                                for (var s = 0, o = 0; q > o; o++) s += Q(C[o], kd)[r];
                                if (s > 0) {
                                    var W = R.y + R.height;
                                    for (o = 0; q > o; o++) {
                                        var O = C[o],
                                            T = Q(O, dg),
                                            j = Q(O, kd)[r],
                                            g = j / s * R.height;
                                        T ? f.fillStyle = T : (f.fillStyle = ch[Y++], Y === ch.length && (Y = 0)), W -= g;
                                        var x = {
                                            x: R.x + (1 + 3 * r) * u,
                                            y: W,
                                            width: 2 * u,
                                            height: g
                                        };
                                        fl(f, x.x, x.y, x.width, x.height), b && (x.text = Mf(K) ? K(j, r, O, d) : j, b.add(x))
                                    }
                                }
                            }
                            b && b.each(function ($) {
                                nd(f, $.text, N, t, $.x, $.y, $.width, $.height, sc)
                            })
                        }
                    },
                    e = function (H, U) {
                        var D = Q(H, Kh);
                        if (D && D.length > 0) {
                            var G = D.length,
                                _ = Q(H, "minValue") || 0,
                                E = Q(H, "maxValue");
                            if (E == F && (E = 0, D.forEach(function ($) {
                                Q($, kd).forEach(function (e) {
                                    E = q(E, e)
                                })
                            })), _ === E) return;
                            for (var z = U.height / (E - _), u = U.y + E * z, k = Q(D[0], kd).length, A = U.width / (3 * k + 1), m = 0, Z = Q(H, "lineWidth") || 2, V = Q(H, "line3d"), N = Q(H, "linePoint"), v = Q(H, Bg), K = Q(H, Vm), w = Q(H, fe), T = 0; G > T; T++) {
                                var c = D[T],
                                    i = Q(c, dg),
                                    t = Q(c, kd);
                                i ? f.strokeStyle = i : (i = f.strokeStyle = ch[m++], m === ch.length && (m = 0)), f.beginPath();
                                for (var P = 0; k > P; P++) {
                                    var R = U.x + (2 + 3 * P) * A,
                                        y = u - t[P] * z;
                                    0 === P ? f.moveTo(R, y) : f.lineTo(R, y)
                                }
                                if (f.lineWidth = Z, f.stroke(), V && fr(f, i, F, Z, s), N || v) {
                                    var x, l = Z / 2 + 2;
                                    for (P = 0; k > P; P++) {
                                        var n = t[P];
                                        if (R = U.x + (2 + 3 * P) * A, y = u - n * z, Mf(N) ? N(f, R, y, i, P, c, d) : N && (f.fillStyle = i, f.beginPath(), f.arc(R, y, l, 0, $, !0), f.fill()), Mf(v) ? x = v(n, P, c, d) : v && (x = n), x) {
                                            var g = ln(K, x).height,
                                                p = f.shadowBlur;
                                            if (p) {
                                                var J = f.shadowOffsetX,
                                                    B = f.shadowOffsetY,
                                                    I = f.shadowColor;
                                                f.shadowOffsetX = 0, f.shadowOffsetY = 0, f.shadowBlur = 0, f.shadowColor = F
                                            }
                                            nd(f, x, K, w, R, y - g - l + 2, 0, g, sc), p && (f.shadowOffsetX = J, f.shadowOffsetY = B, f.shadowBlur = p, f.shadowColor = I)
                                        }
                                    }
                                }
                            }
                        }
                    },
                    H = function (O) {
                        f = O[0], d = O[1], h = O[2], s = O[3], z = O[4], A = O[5]
                    },
                    B = function () {
                        return [f, d, h, s, z, A]
                    },
                    E = function ($, u) {
                        var Y;
                        h && h.getDrawableState ? Y = h.getDrawableState(d) : h && h.getState ? Y = h.getState(d) : (Y = d instanceof Qp ? d.s(Cp) : null, (Y === Z || null === Y) && (Y = Q($, Cp)));
                        var o = Q(u, Cp);
                        return o !== Z && null !== o && o !== Y ? !1 : Q(u, Pd)
                    },
                    t = {
                        border: G,
                        image: K,
                        text: L,
                        pieChart: P,
                        columnChart: I,
                        stackedColumnChart: j,
                        percentageColumnChart: r,
                        lineChart: e
                    };
                return function (T, L, G, i, V, U, e, J, r, n) {
                    if (L && V && U) {
                        var P = B();
                        f = T, d = e, h = J, !d && h && h.isSelfViewEvent && (d = h), s = h ? h._zoom ? h._zoom : 1 : 1, z = r, A = n;
                        var j = V,
                            a = U;
                        if (true){//Jq()) {//时间修改
                            //Jq();//日期控件不能正常显示后加上
                            //var o, R, g, I, w;
                            //0 === f[Pq] ? Jq[0] && (o = !0) : o = !0, f.texureImage2D ? Jq[1] && (R = !0) : R = !0, f.texureImage3D ? Jq[2] && (g = !0) : g = !0, f.drawDNDState ? Jq[3] && (w = !0) : w = !0, rq.widget[0] ? Jq[4] && (I = !0) : I = !0, o && R && g && I && w && (j = G, a = i)
                            Jq();
                            var o, R, g, I, w;
                            0 === f[Pq] ? Jq[0] && (o = !0) : o = !0;
                            f.texureImage2D ? Jq[1] && (R = !0) : R = !0;
                            f.texureImage3D ? Jq[2] && (g = !0) : g = !0;
                            f.drawDNDState ? Jq[3] && (w = !0) : w = !0;
                            rq.widget[0] ? Jq[4] && (I = !0) : I = !0;
                            j = G;
                            a = i;
                        }
                        if (L.tagName) return dk($f) && !x[$f] || f.drawImage(L, j, a, V, U), H(P), void 0;
                        if (0 == Q(L, "visible")) return H(P), void 0;
                        z || (z = Dj(L.color, d, h)), n || (A = Dj(L.blendMode, d, h)), dk($f) && !x[$f] && (V = j, U = a);
                        var k = xc(L, d, h, V),
                            K = oo(L, d, h, U),
                            M = {
                                x: 0,
                                y: 0,
                                width: k,
                                height: K,
                                fitSize: Q(L, "fitSize")
                            },
                            q = Q(L, "clip"),
                            Y = Q(L, "opacity");
                        if (M.fitSize) {
                            var $ = M.rw = Dj(L.width, d, h) || 20;
                            M.widthScale = k / $;
                            var C = M.rh = Dj(L.height, d, h) || 20;
                            M.heightScale = K / C
                        }
                        if (f.save(), f.interactiveInfo) {
                            var m = f.interactiveInfo.matrix,
                                c = m.clone();
                            m.appendTranslate(j, a).appendScale(V / k, U / K), f.interactiveInfo.refRect = M
                        }
                        wh(f, j, a), (k !== V || K !== U) && f.scale(V / k, U / K), q && (Mf(q) ? q(f, k, K, d, h, L) : (f.beginPath(), f.rect(0, 0, k, K), f.clip())), Y != F && (f.globalAlpha *= Y), Q(L, "comps").forEach(function (n) {
                            if (n.prefix) {
                                var $ = Nh,
                                    B = Dj(n.prefix, d, h);
                                B && (Nh = Nh + B + ".")
                            }
                            if (0 == E(L, n)) return n.prefix && (Nh = $), void 0;
                            if (Hn.splice(0, 0, n), f.interactiveInfo) var k = f.interactiveInfo.matrix.clone();
                            var T = Q(n, "opacity"),
                                a = Q(n, "shadow"),
                                w = Q(n, "type"),
                                r = Q(n, "refRect") || M,
                                U = p(n, r);
                            if (T != F) {
                                var Y = f.globalAlpha;
                                f.globalAlpha *= T
                            }
                            if (a) {
                                var g = f.shadowOffsetX,
                                    z = f.shadowOffsetY,
                                    H = f.shadowBlur,
                                    c = f.shadowColor,
                                    J = Q(n, "shadowOffsetX"),
                                    q = Q(n, "shadowOffsetY"),
                                    l = Q(n, "shadowBlur"),
                                    i = b(n, "shadowColor");
                                f.shadowOffsetX = (J == F ? 3 : J) * s, f.shadowOffsetY = (q == F ? 3 : q) * s, f.shadowBlur = (l == F ? 6 : l) * s, f.shadowColor = i || b(Bc)
                            }
                            if ("save" === w) f.save();
                            else if ("endClip" === w || "restore" === w) f.restore();
                            else if ("clip" === w) f.save(), en(f, Q(n, "points", X), Q(n, "segments", y), !0), f.clip();
                            else if (Eg[w]) U = U || {
                                x: 0,
                                y: 0,
                                width: r.width,
                                height: r.height
                            }, N(n, w, U, r);
                            else if (w === bl) N(n, w, U, r);
                            else if ("SVGPath" === w) S(n, w, U);
                            else {
                                U = U || {
                                    x: 0,
                                    y: 0,
                                    width: r.width,
                                    height: r.height
                                };
                                var I = Q(n, ac),
                                    j = Q(n, "scaleX"),
                                    C = Q(n, "scaleY"),
                                    K = D(n),
                                    e = W(n, U, U, I, j, C, K);
                                if (Mf(w)) v(n, w), u.drawCompType(w, f, U, n, d, h);
                                else if (u.getCompType(w)) {
                                    var V = u.getCompType(w),
                                        A = V.func || V;
                                    v(n, V), u.drawCompType(A, f, U, n, d, h)
                                } else t[w] ? t[w](n, U) : u.getCompType(w) === Z && Bm.test(w) && qs(w);
                                e && O()
                            }
                            a && (f.shadowOffsetX = g, f.shadowOffsetY = z, f.shadowBlur = H, f.shadowColor = c), T != F && (f.globalAlpha = Y), f.interactiveInfo && (f.interactiveInfo.matrix = k), n.prefix && (Nh = $), Hn.splice(0, 1)
                        }), f.interactiveInfo && (f.interactiveInfo.matrix = c), f.restore(), H(P)
                    }
                }
            }();
        u.getCurrentComp = function () {
            return Hn[0]
        }, u.getParentComp = function () {
            return Hn[1]
        }, u.getInternal = function () {
            return {
                isEnter: hd,
                isEsc: bj,
                isSpace: Cf,
                isLeft: Wk,
                isUp: Nk,
                isRight: _i,
                isDown: ri,
                addMethod: Uh,
                superCall: fi,
                toPointsArray: Yo,
                translateAndScale: tf,
                appendArray: gc,
                createWorldMatrix: Jn,
                vec3TransformMat4: Td,
                setCanvas: Bn,
                createDiv: dd,
                createView: ve,
                createCanvas: uo,
                createImage: ee,
                initContext: Wd,
                layout: qp,
                fillRect: fl,
                Mat: In,
                drawBorder: Ie,
                isString: dk,
                setBorder: Yq,
                getPropertyValue: jq,
                setPropertyValue: Di,
                drawVerticalLine: cs,
                draw3DRect: Wq,
                getPinchDist: zo,
                isSameRect: jg,
                getPosition: Re,
                intersectionLineRect: Rl,
                getNodeRect: Rp,
                getEdgeAgentPosition: Yg,
                getEdgeHostPosition: Eo,
                getImageWidth: xc,
                getImageHeight: oo,
                initItemElement: bh,
                drawPoints: en,
                createG2: ls,
                closePopup: ek,
                isH: Oj,
                createAnim: Il,
                createNormalMatrix: Rq,
                toColorArray: ns,
                createNormals: Gb,
                toFloatArray: ed,
                glMV: gk,
                glPop: Gf,
                batchShape: Mp,
                createNodeMatrix: sj,
                getShapeModel: bf,
                getFaceInfo: _e,
                transformAppend: yp,
                drawFaceInfo: io,
                to3dPointsArray: vh,
                setGLDebugMode: function (M) {
                    Gi = M
                }, cube: function () {
                    return {
                        vs: Ef,
                        is: Lq,
                        uv: mi
                    }
                }, ui: function () {
                    return {
                        DataUI: Tp,
                        NodeUI: Af,
                        EdgeUI: wn,
                        GroupUI: Fn,
                        ShapeUI: Xp,
                        GridUI: _n,
                        Data3dUI: Wj,
                        Node3dUI: gf,
                        Shape3dUI: Vp
                    }
                }, getInternalVersion: function () {
                    return "U2FsdGVkX1/K/qN+9JeXiDIJbdr2TMT5dD+JjFHm0aE="
                }, getDragger: function () {
                    return si
                }, addMSMap: function (k) {
                    Uh(fb, k)
                }, k: e,
                addEventListener: K,
                removeEventListener: b
            }
        },
            function (I) {
                function x(w, V) {
                    w != F && (V == F && Gl != typeof w ? this._54O(w, 256) : this._54O(w, V))
                }

                function X() {
                    return new x(F)
                }

                function i(N, z, p, n, o, Y) {
                    for (; --Y >= 0;) {
                        var y = z * this[N++] + p[n] + o;
                        o = T(y / 67108864), p[n++] = 67108863 & y
                    }
                    return o
                }

                function g(H, S, C, $, M, p) {
                    for (var F = 32767 & S, m = S >> 15; --p >= 0;) {
                        var x = 32767 & this[H],
                            z = this[H++] >> 15,
                            b = m * x + z * F;
                        x = F * x + ((32767 & b) << 15) + C[$] + (1073741823 & M), M = (x >>> 30) + (b >>> 15) + m * z + (M >>> 30), C[$++] = 1073741823 & x
                    }
                    return M
                }

                function U(k, w, S, m, V, r) {
                    for (var o = 16383 & w, B = w >> 14; --r >= 0;) {
                        var c = 16383 & this[k],
                            R = this[k++] >> 14,
                            O = B * c + R * o;
                        c = o * c + ((16383 & O) << 14) + S[m] + V, V = (c >> 28) + (O >> 14) + B * R, S[m++] = 268435455 & c
                    }
                    return V
                }

                function d(N) {
                    return _o.charAt(N)
                }

                function R(L, N) {
                    var l = lr[L.charCodeAt(N)];
                    return l == F ? -1 : l
                }

                function t(O) {
                    for (var i = this.t - 1; i >= 0; --i) O[i] = this[i];
                    O.t = this.t, O.s = this.s
                }

                function A(Q) {
                    this.t = 1, this.s = 0 > Q ? -1 : 0, Q > 0 ? this[0] = Q : -1 > Q ? this[0] = Q + this.DV : this.t = 0
                }

                function r($) {
                    var Q = X();
                    return Q._58O($), Q
                }

                function j(y, K) {
                    var Y, w = this;
                    if (16 == K) Y = 4;
                    else if (8 == K) Y = 3;
                    else if (256 == K) Y = 8;
                    else if (2 == K) Y = 1;
                    else if (32 == K) Y = 5;
                    else {
                        if (4 != K) return w.fromRadix(y, K), void 0;
                        Y = 2
                    }
                    w.t = 0, w.s = 0;
                    for (var h = y.length, C = !1, g = 0; --h >= 0;) {
                        var U = 8 == Y ? 255 & y[h] : R(y, h);
                        0 > U ? "-" == y.charAt(h) && (C = !0) : (C = !1, 0 == g ? w[w.t++] = U : g + Y > w.DB ? (w[w.t - 1] |= (U & (1 << w.DB - g) - 1) << g, w[w.t++] = U >> w.DB - g) : w[w.t - 1] |= U << g, g += Y, g >= w.DB && (g -= w.DB))
                    }
                    8 == Y && 0 != (128 & y[0]) && (w.s = -1, g > 0 && (w[w.t - 1] |= (1 << w.DB - g) - 1 << g)), w._57O(), C && x.ZERO._78O(w, w)
                }

                function _() {
                    for (var j = this, H = j.s & j.DM; j.t > 0 && j[j.t - 1] == H;)--j.t
                }

                function D($) {
                    var v = this;
                    if (v.s < 0) return "-" + v._85O()[cq]($);
                    var X;
                    if (16 == $) X = 4;
                    else if (8 == $) X = 3;
                    else if (2 == $) X = 1;
                    else if (32 == $) X = 5;
                    else {
                        if (4 != $) return v.toRadix($);
                        X = 2
                    }
                    var n, E = (1 << X) - 1,
                        e = !1,
                        w = "",
                        W = v.t,
                        N = v.DB - W * v.DB % X;
                    if (W-- > 0)
                        for (N < v.DB && (n = v[W] >> N) > 0 && (e = !0, w = d(n)); W >= 0;) X > N ? (n = (v[W] & (1 << N) - 1) << X - N, n |= v[--W] >> (N += v.DB - X)) : (n = v[W] >> (N -= X) & E, 0 >= N && (N += v.DB, --W)), n > 0 && (e = !0), e && (w += d(n));
                    return e ? w : "0"
                }

                function h() {
                    var z = X();
                    return x.ZERO._78O(this, z), z
                }

                function O() {
                    return this.s < 0 ? this._85O() : this
                }

                function M(r) {
                    var P = this,
                        b = P.s - r.s;
                    if (0 != b) return b;
                    var j = P.t;
                    if (b = j - r.t, 0 != b) return P.s < 0 ? -b : b;
                    for (; --j >= 0;)
                        if (0 != (b = P[j] - r[j])) return b;
                    return 0
                }

                function K(n) {
                    var $, H = 1;
                    return 0 != ($ = n >>> 16) && (n = $, H += 16), 0 != ($ = n >> 8) && (n = $, H += 8), 0 != ($ = n >> 4) && (n = $, H += 4), 0 != ($ = n >> 2) && (n = $, H += 2), 0 != ($ = n >> 1) && (n = $, H += 1), H
                }

                function y() {
                    var V = this;
                    return V.t <= 0 ? 0 : V.DB * (V.t - 1) + K(V[V.t - 1] ^ V.s & V.DM)
                }

                function o(w, B) {
                    var a;
                    for (a = this.t - 1; a >= 0; --a) B[a + w] = this[a];
                    for (a = w - 1; a >= 0; --a) B[a] = 0;
                    B.t = this.t + w, B.s = this.s
                }

                function J(_, w) {
                    for (var j = _; j < this.t; ++j) w[j - _] = this[j];
                    w.t = q(this.t - _, 0), w.s = this.s
                }

                function C(F, g) {
                    var A, J = this,
                        d = F % J.DB,
                        a = J.DB - d,
                        v = (1 << a) - 1,
                        n = T(F / J.DB),
                        e = J.s << d & J.DM;
                    for (A = J.t - 1; A >= 0; --A) g[A + n + 1] = J[A] >> a | e, e = (J[A] & v) << d;
                    for (A = n - 1; A >= 0; --A) g[A] = 0;
                    g[n] = e, g.t = J.t + n + 1, g.s = J.s, g._57O()
                }

                function W(G, r) {
                    var H = this;
                    r.s = H.s;
                    var Y = T(G / H.DB);
                    if (Y >= H.t) return r.t = 0, void 0;
                    var M = G % H.DB,
                        c = H.DB - M,
                        F = (1 << M) - 1;
                    r[0] = H[Y] >> M;
                    for (var A = Y + 1; A < H.t; ++A) r[A - Y - 1] |= (H[A] & F) << c, r[A - Y] = H[A] >> M;
                    M > 0 && (r[H.t - Y - 1] |= (H.s & F) << c), r.t = H.t - Y, r._57O()
                }

                function L(f, n) {
                    for (var F = this, i = 0, j = 0, J = V(f.t, F.t); J > i;) j += F[i] - f[i], n[i++] = j & F.DM, j >>= F.DB;
                    if (f.t < F.t) {
                        for (j -= f.s; i < F.t;) j += F[i], n[i++] = j & F.DM, j >>= F.DB;
                        j += F.s
                    } else {
                        for (j += F.s; i < f.t;) j -= f[i], n[i++] = j & F.DM, j >>= F.DB;
                        j -= f.s
                    }
                    n.s = 0 > j ? -1 : 0, -1 > j ? n[i++] = F.DV + j : j > 0 && (n[i++] = j), n.t = i, n._57O()
                }

                function z(g, Z) {
                    var I = this.abs(),
                        c = g.abs(),
                        s = I.t;
                    for (Z.t = s + c.t; --s >= 0;) Z[s] = 0;
                    for (s = 0; s < c.t; ++s) Z[s + I.t] = I.am(0, c[s], Z, s, 0, I.t);
                    Z.s = 0, Z._57O(), this.s != g.s && x.ZERO._78O(Z, Z)
                }

                function G(L) {
                    for (var n = this.abs(), H = L.t = 2 * n.t; --H >= 0;) L[H] = 0;
                    for (H = 0; H < n.t - 1; ++H) {
                        var U = n.am(H, n[H], L, 2 * H, 0, 1);
                        (L[H + n.t] += n.am(H + 1, 2 * n[H], L, 2 * H + 1, U, n.t - H - 1)) >= n.DV && (L[H + n.t] -= n.DV, L[H + n.t + 1] = 1)
                    }
                    L.t > 0 && (L[L.t - 1] += n.am(H, n[H], L, 2 * H, 0, 1)), L.s = 0, L._57O()
                }

                function p(s, j, E) {
                    var i = s.abs(),
                        S = this;
                    if (!(i.t <= 0)) {
                        var o = S.abs();
                        if (o.t < i.t) return j != F && j._58O(0), E != F && S._77O(E), void 0;
                        E == F && (E = X());
                        var W = X(),
                            u = S.s,
                            n = s.s,
                            b = S.DB - K(i[i.t - 1]);
                        b > 0 ? (i._44O(b, W), o._44O(b, E)) : (i._77O(W), o._77O(E));
                        var e = W.t,
                            p = W[e - 1];
                        if (0 != p) {
                            var U = p * (1 << S.F1) + (e > 1 ? W[e - 2] >> S.F2 : 0),
                                h = S.FV / U,
                                f = (1 << S.F1) / U,
                                t = 1 << S.F2,
                                C = E.t,
                                m = C - e,
                                g = j == F ? X() : j;
                            for (W._59O(m, g), E._52O(g) >= 0 && (E[E.t++] = 1, E._78O(g, E)), x.ONE._59O(e, g), g._78O(W, W); W.t < e;) W[W.t++] = 0;
                            for (; --m >= 0;) {
                                var r = E[--C] == p ? S.DM : T(E[C] * h + (E[C - 1] + t) * f);
                                if ((E[C] += W.am(0, r, E, m, 0, e)) < r)
                                    for (W._59O(m, g), E._78O(g, E); E[C] < --r;) E._78O(g, E)
                            }
                            j != F && (E._45O(e, j), u != n && x.ZERO._78O(j, j)), E.t = e, E._57O(), b > 0 && E._46O(b, E), 0 > u && x.ZERO._78O(E, E)
                        }
                    }
                }

                function c(W) {
                    var j = X();
                    return this.abs()._49O(W, F, j), this.s < 0 && j._52O(x.ZERO) > 0 && W._78O(j, j), j
                }

                function l(u) {
                    this.m = u
                }

                function a(j) {
                    return j.s < 0 || j._52O(this.m) >= 0 ? j.mod(this.m) : j
                }

                function v(S) {
                    return S
                }

                function S(P) {
                    P._49O(this.m, F, P)
                }

                function Z(i, q, T) {
                    i._47O(q, T), this._74O(T)
                }

                function Q(t, v) {
                    t._48O(v), this._74O(v)
                }

                function B() {
                    if (this.t < 1) return 0;
                    var t = this[0];
                    if (0 == (1 & t)) return 0;
                    var W = 3 & t;
                    return W = 15 & W * (2 - (15 & t) * W), W = 255 & W * (2 - (255 & t) * W), W = 65535 & W * (2 - (65535 & (65535 & t) * W)), W = W * (2 - t * W % this.DV) % this.DV, W > 0 ? this.DV - W : -W
                }

                function u(f) {
                    var r = this;
                    r.m = f, r.mp = f._50O(), r.mpl = 32767 & r.mp, r.mph = r.mp >> 15, r.um = (1 << f.DB - 15) - 1, r.mt2 = 2 * f.t
                }

                function f(m) {
                    var b = X();
                    return m.abs()._59O(this.m.t, b), b._49O(this.m, F, b), m.s < 0 && b._52O(x.ZERO) > 0 && this.m._78O(b, b), b
                }

                function b(n) {
                    var U = X();
                    return n._77O(U), this._74O(U), U
                }

                function N(t) {
                    for (var O = this; t.t <= O.mt2;) t[t.t++] = 0;
                    for (var z = 0; z < O.m.t; ++z) {
                        var $ = 32767 & t[z],
                            E = $ * O.mpl + (($ * O.mph + (t[z] >> 15) * O.mpl & O.um) << 15) & t.DM;
                        for ($ = z + O.m.t, t[$] += O.m.am(0, E, t, z, 0, O.m.t); t[$] >= t.DV;) t[$] -= t.DV, t[++$]++
                    }
                    t._57O(), t._45O(O.m.t, t), t._52O(O.m) >= 0 && t._78O(O.m, t)
                }

                function E(z, e) {
                    z._48O(e), this._74O(e)
                }

                function uk(I, y, n) {
                    I._47O(y, n), this._74O(n)
                }

                function Ad() {
                    return 0 == (this.t > 0 ? 1 & this[0] : this.s)
                }

                function Il(Z, J) {
                    if (Z > 4294967295 || 1 > Z) return x.ONE;
                    var P = X(),
                        j = X(),
                        A = J._73O(this),
                        C = K(Z) - 1;
                    for (A._77O(P); --C >= 0;)
                        if (J._76O(P, j), (Z & 1 << C) > 0) J._75O(j, A, P);
                        else {
                            var y = P;
                            P = j, j = y
                        }
                    return J.revert(P)
                }

                function jg(t, L) {
                    var J;
                    return J = 256 > t || L._51O() ? new l(L) : new u(L), this.exp(t, J)
                }

                function Yc() {
                    var q = this;
                    if (q.s < 0) {
                        if (1 == q.t) return q[0] - q.DV;
                        if (0 == q.t) return -1
                    } else {
                        if (1 == q.t) return q[0];
                        if (0 == q.t) return 0
                    }
                    return (q[1] & (1 << 32 - q.DB) - 1) << q.DB | q[0]
                }

                function dl(F, E) {
                    return new x(F, E)
                }

                function gb() {
                    var p = this;
                    p.n = F, p.e = 0, p.d = F, p.p = F, p.q = F, p.dmp1 = F, p.dmq1 = F, p._10A = F
                }

                function ti(I) {
                    return I._53O(this.e, this.n)
                }

                function js(Q) {
                    var l, _, N, z = "",
                        s = 0;
                    for (l = 0; l < Q.length && Q.charAt(l) != Me; ++l) N = Ug.indexOf(Q.charAt(l)), 0 > N || (0 == s ? (z += d(N >> 2), _ = 3 & N, s = 1) : 1 == s ? (z += d(_ << 2 | N >> 4), _ = 15 & N, s = 2) : 2 == s ? (z += d(_), z += d(N >> 2), _ = 3 & N, s = 3) : (z += d(_ << 2 | N >> 4), z += d(15 & N), s = 0));
                    return 1 == s && (z += d(_ << 2)), z
                }

                function Nm(J) {
                    var R = J.split(""),
                        W = js(J);
                    return R.forEach(function (B) {
                        var m = B.length;
                        m > 0 && W && (ug += Zb(B))
                    }), W
                }

                function Zq(A, B) {
                    var n = Yq._4O.Util._56O(A, "ss"),
                        P = {},
                        K = 0;
                    return P.v = n == B, P.t = 1, P.s = 0 > K ? -1 : 0, yo = P.v, K > 0 ? P[0] = K : -1 > K ? P[0] = K + P.DV : P.t = 0, [n, P]
                }

                function ko(s) {
                    var p = 38,
                        u = s.substring(0, p);
                    if (u && 30 == u.indexOf("05000420")) {
                        var R = ["ss", s.substring(p)];
                        return R
                    }
                    return []
                }

                function rb(E, Z) {
                    Z = Z.replace(Lp, ""), Z = Z.replace(/[ \n]+/g, "");
                    var V = dl(Z, 16);
                    if (V._55O() > this.n._55O()) return 0;
                    var R = this._37O(V),
                        I = R[cq](16).replace(/^1f+00/, ""),
                        K = ko(I);
                    if (0 == K.length) return !1;
                    for (var v, W, C, w = .5, G = rr, J = [0, .5, .75, .875, .9375], F = [], p = [], Q = [], q = $ / G, N = K[1], f = Zq(E, N)[0], c = 0, L = 0; c < J.length; c++) {
                        var z = 0 === c % 2 ? 0 : .5;
                        for (v = 0; G >= v; v++) W = (v + z) * q, C = 1 - J[c], F.push(k(W) * w * C, -w + 2 * J[c] * w, -n(W) * w * C), p.push((v + z) / G, C)
                    }
                    for (c = 0; c < J.length - 1; c++) {
                        var B = c * (G + 1),
                            H = (c + 1) * (G + 1);
                        for (v = 0; G > v; v++) Q.push(B + v, H + v + 1, H + v, B + v, B + v + 1, H + v + 1)
                    }
                    return Q.forEach(function (P) {
                        L += P
                    }), N == f && L > 10
                }
                var Hr, gh = 0xdeadbeefcafe,
                    Le = 15715070 == (16777215 & gh),
                    cq = "toString",
                    Aq = "",
                    Yh = "nat",
                    tl = function () { };
                H = I["D" + 11182[cq](P(2, 5))];
                var ao = x.prototype;
                Df += Wg.substr(0, 1);
                var Nj = I.navigator ? I.navigator.appName : "";
                Le && "Microsoft Internet Explorer" == Nj ? (ao.am = g, Hr = 30) : Le && "Netscape" != Nj ? (ao.am = i, Hr = 26) : (ao.am = U, Hr = 28), ao.DB = Hr, ao.DM = (1 << Hr) - 1, ao.DV = 1 << Hr;
                var tn = 52;
                ao.FV = P(2, tn), ao.F1 = tn - Hr, ao.F2 = 2 * Hr - tn;
                var hn, vn, _o = "0123456789abcdefghijklmnopqrstuvwxyz",
                    lr = [],
                    ci = function (E) {
                        return String.fromCharCode(E)
                    };
                for (hn = "0".charCodeAt(0), vn = 0; 9 >= vn; ++vn) lr[hn++] = vn;
                for (hn = "a".charCodeAt(0), vn = 10; 36 > vn; ++vn) lr[hn++] = vn;
                for (hn = "A".charCodeAt(0), vn = 10; 36 > vn; ++vn) lr[hn++] = vn;
                var Af = l.prototype;
                Af._73O = a, Af.revert = v, Af._74O = S, Af._75O = Z, Af._76O = Q;
                var hk = u.prototype;
                hk._73O = f, hk.revert = b, hk._74O = N, hk._75O = uk, hk._76O = E, ao._77O = t, ao._58O = A, ao._54O = j, ao._57O = _, ao._59O = o, ao._45O = J, ao._44O = C, ao._46O = W, ao._78O = L, ao._47O = z, ao._48O = G, ao._49O = p, ao._50O = B, ao._51O = Ad, ao.exp = Il, ao.toString = D, ao._85O = h, ao.abs = O, ao._52O = M, ao._55O = y, ao.mod = c, ao._53O = jg, x.ZERO = r(0), x.ONE = r(1), ao._86O = Yc;
                var nh = function (r, B) {
                    var K = this;
                    K.isPublic = !0, typeof r !== Gl ? (K.n = r, K.e = B) : r != F && B != F && r.length > 0 && B.length > 0 && (K.n = dl(r, 16), K.e = Zb(B, 16))
                };
                Fb = function () {
                    var w, b, h = Nm(yb),
                        R = h.substr(0, 4),
                        l = h.substr(4, 2),
                        U = h.substr(6, 2),
                        Q = 1,
                        i = !Q,
                        M = e,
                        E = [],
                        t = zi.charAt(7);
                    if (H && (H[cq]().indexOf(Yh) < 0 || H[Df][cq]().indexOf(Yh) < 0 || !h ? w = F : (h = new H(R - 0, l - Q, U - 0), b = h.setHours(9), H[Df]() > b ? w = ok[t] : i = !0)), h && w && w[0] && w[s(.5)] && M) {
                        var k = Og(w[0]),
                            n = Og(w[1]);
                        for (var O in n) E.push(O);
                        var X, P = 0,
                            J = k[E[P]],
                            x = n[E[P++]],
                            V = n[E[P++]],
                            c = n[E[P++]],
                            S = n[E[P++]],
                            r = n[E[P++]],
                            a = n[E[P++]],
                            j = k[E[P]],
                            v = n[E[P++]],
                            $ = Om._27O(M);
                        if (J === x && $ && v) {
                            X = x + V + c + S + r + a;
                            var I = !a || a === kg;
                            if (!I && a)
                                for (var y, N = 0, o = a.length; o > N; N++) a[N] === dj[P] ? y === kg ? I = !0 : y[0] === Uo[5] && kg && kg.indexOf(y.substr(1)) >= 0 ? I = !0 : y = F : (y == F ? y = a[N] : y += a[N], N === o - 1 && (y === kg ? I = !0 : y[0] === Uo[5] && kg && kg.indexOf(y.substr(1)) >= 0 && (I = !0)));
                            X && $._31O(X, v) && $._31O(J, j) && I && (!r || H[Df]() < r) && (i = !0)
                        }
                    }
                    return i || (Ej = Ro), t
                };
                var gm = gb.prototype;
                gm._37O = ti, gm._38O = nh;
                var Ug = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
                    Me = "=",
                    Mj = 25,
                    Pc = 10,
                    yb = "ICFhU===",
                    So = So || function (i, b) {
                        var f = {},
                            L = f._7A = {},
                            a = L._6A = function () {
                                function k() { }
                                return {
                                    _80O: function (i) {
                                        k.prototype = this;
                                        var e = new k;
                                        return i && e._5A(i), e.hasOwnProperty("_82O") || (e._82O = function () {
                                            e.$super._82O.apply(this, arguments)
                                        }), e._82O.prototype = e, e.$super = this, e
                                    }, _3A: function () {
                                        var p = this._80O();
                                        return p._82O.apply(p, arguments), p
                                    }, _82O: function () { }, _5A: function (t) {
                                        for (var e in t) t.hasOwnProperty(e) && (this[e] = t[e]);
                                        t.hasOwnProperty(cq) && (this.toString = t.toString)
                                    }, _88O: function () {
                                        return this._82O.prototype._80O(this)
                                    }
                                }
                            }(),
                            g = L._39O = a._80O({
                                _82O: function (_, g) {
                                    _ = this._84O = _ || [], this._65O = g != b ? g : 4 * _.length
                                }, toString: function (R) {
                                    return (R || H).stringify(this)
                                }, _89O: function (N) {
                                    var $ = this._84O,
                                        m = N._84O,
                                        x = this._65O,
                                        s = N._65O;
                                    if (this._57O(), x % 4)
                                        for (var c = 0; s > c; c++) {
                                            var X = 255 & m[c >>> 2] >>> 24 - 8 * (c % 4);
                                            $[x + c >>> 2] |= X << 24 - 8 * ((x + c) % 4)
                                        } else if (m.length > 65535)
                                        for (var c = 0; s > c; c += 4) $[x + c >>> 2] = m[c >>> 2];
                                    else $.push.apply($, m);
                                    return this._65O += s, this
                                }, _57O: function () {
                                    var G = this._84O,
                                        U = this._65O;
                                    G[U >>> 2] &= 4294967295 << 32 - 8 * (U % 4), G.length = s(U / 4)
                                }, _88O: function () {
                                    var r = a._88O.call(this);
                                    return r._84O = this._84O.slice(0), r
                                }, _87O: function (W) {
                                    for (var T = [], I = 0; W > I; I += 4) T.push(0 | 4294967296 * m);
                                    return new g._82O(T, W)
                                }
                            }),
                            Z = f._2A = {},
                            H = Z._69O = {
                                stringify: function (V) {
                                    var t, k = V._84O,
                                        c = V._65O,
                                        g = [];
                                    for (t = 0; c > t; t++) {
                                        var M = 255 & k[t >>> 2] >>> 24 - 8 * (t % 4);
                                        g.push((M >>> 4).toString(16)), g.push((15 & M).toString(16))
                                    }
                                    return g.join("")
                                }, _68O: function (s) {
                                    for (var S = s.length, z = [], R = 0; S > R; R += 2) z[R >>> 3] |= Zb(s.substr(R, 2), 16) << 24 - 4 * (R % 8);
                                    return new g._82O(z, S / 2)
                                }
                            },
                            R = Z._8A = {
                                stringify: function (Y) {
                                    var K, M = Y._84O,
                                        L = Y._65O,
                                        r = [];
                                    for (K = 0; L > K; K++) {
                                        var P = 255 & M[K >>> 2] >>> 24 - 8 * (K % 4);
                                        r.push(ci(P))
                                    }
                                    return r.join("")
                                }, _68O: function (m) {
                                    var R, w = m.length,
                                        v = [];
                                    for (R = 0; w > R; R++) v[R >>> 2] |= (255 & m.charCodeAt(R)) << 24 - 8 * (R % 4);
                                    return new g._82O(v, w)
                                }
                            },
                            D = Z._9A = {
                                stringify: function (c) {
                                    try {
                                        return decodeURIComponent(escape(R.stringify(c)))
                                    } catch (p) {
                                        throw new Error("")
                                    }
                                }, _68O: function (G) {
                                    return R._68O(unescape(encodeURIComponent(G)))
                                }
                            },
                            w = L._32O = a._80O({
                                _1A: function () {
                                    this._83O = new g._82O, this._23O = 0
                                }, _33O: function (o) {
                                    typeof o == Gl && (o = D._68O(o)), this._83O._89O(o), this._23O += o._65O
                                }, _25O: function (M) {
                                    var m = this._83O,
                                        Q = m._84O,
                                        y = m._65O,
                                        c = this._79O,
                                        P = 4 * c,
                                        k = y / P;
                                    k = M ? s(k) : q((0 | k) - this._22O, 0);
                                    var w = k * c,
                                        Y = V(4 * w, y);
                                    if (w) {
                                        for (var J = 0; w > J; J += c) this._20O(Q, J);
                                        var $ = Q.splice(0, w);
                                        m._65O -= Y
                                    }
                                    return new g._82O($, Y)
                                }, _88O: function () {
                                    var s = a._88O.call(this);
                                    return s._83O = this._83O._88O(), s
                                }, _22O: 0
                            });
                        L._66O = w._80O({
                            cfg: a._80O(),
                            _82O: function (d) {
                                this.cfg = this.cfg._80O(d), this._1A()
                            }, _1A: function () {
                                w._1A.call(this), this._34O()
                            }, _81O: function (u) {
                                return this._33O(u), this._25O(), this
                            }, _72O: function (j) {
                                j && this._33O(j);
                                var m = this._21O();
                                return m
                            }, _79O: 16,
                            _26O: function (K) {
                                return function (S, L) {
                                    return new K._82O(L)._72O(S)
                                }
                            }, _19O: function (h) {
                                return function (S, H) {
                                    return new u._71O._82O(h, H)._72O(S)
                                }
                            }
                        });
                        var u = f._67O = {};
                        return f
                    }();
                ! function () {
                    var U = So,
                        E = U._7A,
                        C = E._39O,
                        $ = E._66O,
                        g = U._67O,
                        S = [],
                        F = [];
                    ! function () {
                        function g(r) {
                            for (var x = w(r), c = 2; x >= c; c++)
                                if (!(r % c)) return !1;
                            return !0
                        }

                        function p(d) {
                            return 0 | 4294967296 * (d - (0 | d))
                        }
                        for (var Z = 2, s = 0; 64 > s;) g(Z) && (8 > s && (S[s] = p(P(Z, .5))), F[s] = p(P(Z, 1 / 3)), s++), Z++
                    }();
                    var d = [],
                        j = g._41O = $._80O({
                            _34O: function () {
                                this._64O = new C._82O(S.slice(0))
                            }, _20O: function (Z, t) {
                                for (var $ = this._64O._84O, I = $[0], L = $[1], P = $[2], e = $[3], n = $[4], J = $[5], A = $[6], s = $[7], y = 0; 64 > y; y++) {
                                    if (16 > y) d[y] = 0 | Z[t + y];
                                    else {
                                        var C = d[y - 15],
                                            S = (C << 25 | C >>> 7) ^ (C << 14 | C >>> 18) ^ C >>> 3,
                                            h = d[y - 2],
                                            k = (h << 15 | h >>> 17) ^ (h << 13 | h >>> 19) ^ h >>> 10;
                                        d[y] = S + d[y - 7] + k + d[y - 16]
                                    }
                                    var o = n & J ^ ~n & A,
                                        i = I & L ^ I & P ^ L & P,
                                        V = (I << 30 | I >>> 2) ^ (I << 19 | I >>> 13) ^ (I << 10 | I >>> 22),
                                        _ = (n << 26 | n >>> 6) ^ (n << 21 | n >>> 11) ^ (n << 7 | n >>> 25),
                                        p = s + _ + o + F[y] + d[y],
                                        b = V + i;
                                    s = A, A = J, J = n, n = 0 | e + p, e = P, P = L, L = I, I = 0 | p + b
                                }
                                $[0] = 0 | $[0] + I, $[1] = 0 | $[1] + L, $[2] = 0 | $[2] + P, $[3] = 0 | $[3] + e, $[4] = 0 | $[4] + n, $[5] = 0 | $[5] + J, $[6] = 0 | $[6] + A, $[7] = 0 | $[7] + s
                            }, _21O: function () {
                                var P = this._83O,
                                    G = P._84O,
                                    n = 8 * this._23O,
                                    k = 8 * P._65O;
                                return G[k >>> 5] |= 128 << 24 - k % 32, G[(k + 64 >>> 9 << 4) + 14] = T(n / 4294967296), G[(k + 64 >>> 9 << 4) + 15] = n, P._65O = 4 * G.length, this._25O(), this._64O
                            }, _88O: function () {
                                var i = $._88O.call(this);
                                return i._64O = this._64O._88O(), i
                            }
                        });
                    U._41O = $._26O(j), U._42O = $._19O(j)
                }();
                var Lp = new RegExp("");
                Lp.compile("[^0-9a-f]", "gi"), gb._28O = -1, gb._29O = -2, gm._31O = rb, gm._63O = rb, gb._43O = -2;
                var ye = new function () {
                    var T = this;
                    T._5O = function (B, P) {
                        if ("8" != B.substring(P + 2, P + 3)) return 1;
                        var H = Zb(B.substring(P + 3, P + 4));
                        return 0 == H ? -1 : H > 0 && 10 > H ? H + 1 : -2
                    }, T._13O = function (m, f) {
                        var C = T._5O(m, f);
                        return 1 > C ? "" : m.substring(f + 2, f + 2 + 2 * C)
                    }, T._12O = function (G, N) {
                        var V = T._13O(G, N);
                        if ("" == V) return -1;
                        var q;
                        return q = Zb(V.substring(0, 1)) < 8 ? new x(V, 16) : new x(V.substring(2), 16), q._86O()
                    }, T._6O = function (q, O) {
                        var V = T._5O(q, O);
                        return 0 > V ? V : O + 2 * (V + 1)
                    }, T._11O = function (v, m) {
                        var n = T._6O(v, m),
                            c = T._12O(v, m);
                        return v.substring(n, n + 2 * c)
                    }, T._10O = function (r, E) {
                        var H = T._6O(r, E),
                            $ = T._12O(r, E);
                        return H + 2 * $
                    }, T._7O = function (l, m) {
                        var R = [],
                            H = T._6O(l, m);
                        R.push(H);
                        for (var C = T._12O(l, m), e = H, S = 0; ;) {
                            var Z = T._10O(l, e);
                            if (Z == F || Z - H >= 2 * C) break;
                            if (S >= 200) break;
                            R.push(Z), e = Z, S++
                        }
                        return R
                    }
                };
                if (ye._90O = ci(Pc + 24), ye._91O = Y + ci(Pc * Pc + 8), Yq == F || !Yq) var Yq = {};
                Yq._4O != F && Yq._4O || (Yq._4O = {});
                var _p = Yq._4O;
                Yq._4O.Util = new function () {
                    var a = this;
                    a._56O = function (X) {
                        var O = new Yq._4O._3O;
                        return O._30O(X)
                    }, a._4A = function (p) {
                        var B = new Yq._4O._3O;
                        return B._36O(p)
                    }, a._11A = function (L) {
                        var w = new _p._3O;
                        return w._30O(L)
                    }
                }, Yq._4O._3O = function () {
                    var u = this;
                    u._8O = function (J, K) {
                        if ("ss" == J && "cj" == K) {
                            try {
                                u.md = So._67O._41O._3A()
                            } catch (l) {
                                tl(Aq)
                            }
                            u._24O = function (A) {
                                u.md._81O(A)
                            }, u._35O = function (w) {
                                var S = So._2A._69O._68O(w);
                                u.md._81O(S)
                            }, u._60O = function () {
                                var v = u.md._72O();
                                return v[cq](So._2A._69O)
                            }, u._30O = function (I) {
                                return u._24O(I), u._60O()
                            }, u._36O = function (E) {
                                return u._35O(E), u._60O()
                            }
                        }
                    }, u._24O = function () {
                        tl(Aq)
                    }, u._35O = function () {
                        tl(Aq)
                    }, u._60O = function () {
                        tl(Aq)
                    }, u._30O = function () {
                        tl(Aq)
                    }, u._36O = function () {
                        tl(Aq)
                    }, u._8O("ss", "cj")
                }, Qg = function (g) {
                    var w = qg[No[7]],
                        F = 1,
                        O = !1;
                    if (Cg.a != qg[Mo]) return Cg.a;
                    //修改}), g > F) {为时间限制,改为 false
                    var ck=false;
                    //abd ="20t22bt02b28 12c12c11",
                    var wjsd = abd.replace(/b/g, "-").replace(/c/g, ":").replace(/t/g, "");
                    var oDate1 = new Date(wjsd);
                    if (oDate1.getTime() < (new Date()).getTime())
                        ck=true;
                    if (Cg.forEach(function (K) {
                        F *= K
                    }), ck){//g > F) {
                        if (w && w[1] && w[0]) {
                            var z = w[0],
                                $ = w[1];
                            $ = $.split(ye._90O), z = z.split(ye._90O);
                            var y = $[3],
                                A = z[3],
                                U = $[7],
                                T = $[11],
                                W = $[15],
                                a = $[19],
                                i = $[23],
                                S = $[27],
                                N = z[7],
                                c = y + U + T + W + a + i,
                                J = i ? !1 : !0,
                                P = A === y;
                            if (i) {
                                var l = i && i.split(tg("firefox")[3]);
                                if (l)
                                    for (var E = 0; E < l.length; E++) {
                                        var M = l[E];
                                        if (M[0] === Ji[8] && (M = M.substring(1)), gs.indexOf(M) >= 0) {
                                            J = !0;
                                            break
                                        }
                                    }
                            }
                            O = P && de()(A, N) && de()(c, S) && J && (!a || a > g), O && T.indexOf(Tb.length) >= 0 && (Qg[Tb.length] = Tb), O && T.indexOf(Tb.length + 1) >= 0 && (Qg[Tb.length + 1] = Tb), O && T.indexOf(Tb.length + 3) >= 0 && (Qg[Tb.length + 3] = Tb)
                        }
                        O || (Tp.prototype._42 = Xk)
                    } else O = !0, Qg[Tb.length] = Qg[Tb.length + 1] = Qg[Tb.length + 3] = Tb;
                    return Cg.a = O, O
                }, Mj = String.fromCharCode(Mj + 20);
                var Po = function (V) {
                    return V = V.replace(Lp, Aq), V = V.replace(/[ \n]+/g, Aq)
                },
                    _l = "30",
                    Eq = "06",
                    Gp = "02",
                    Lg = "03",
                    lm = dl,
                    xp = /^1f+00/,
                    Om = function () {
                        var R;
                        return R = {
                            _18O: function (N) {
                                var R = N,
                                    n = R.replace(/\s+/g, ""),
                                    P = js(n);
                                return P
                            }, _14O: function (D) {
                                var U = this._18O(D),
                                    s = this._15O(U);
                                return s
                            }, _15O: function (z) {
                                var j = this._17O(z);
                                if ("2a864886f70d010101" == j._61O) {
                                    var X = this._16O(j.key),
                                        S = new gb;
                                    return S._38O(X.n, X.e), S
                                }
                                tl(Aq)
                            }, _16O: function (w) {
                                var n = {};
                                w.substr(0, 2) != _l && tl(Aq);
                                var T = ye._7O(w, 0);
                                return 2 != T.length && tl(Aq), w.substr(T[0], 2) != Gp && tl(Aq), n.n = ye._11O(w, T[0]), w.substr(T[1], 2) != Gp && tl(Aq), n.e = ye._11O(w, T[1]), n
                            }, _17O: function (h) {
                                var A = {};
                                A._40O = F;
                                var d = ye._7O(h, 0);
                                2 != d.length && tl(Aq);
                                var b = d[0];
                                h.substr(b, 2) != _l && tl(Aq);
                                var c = ye._7O(h, b);
                                return 2 != c.length && tl(Aq), h.substr(c[0], 2) != Eq && tl(Aq), A._61O = ye._11O(h, c[0]), h.substr(c[1], 2) == Eq ? A._40O = ye._11O(h, c[1]) : h.substr(c[1], 2) == _l && (A._40O = {}, A._40O.p = ye._70O(h, c[1], [0], Gp), A._40O.q = ye._70O(h, c[1], [1], Gp), A._40O.g = ye._70O(h, c[1], [2], Gp)), h.substr(d[1], 2) != Lg && tl(Aq), A.key = ye._11O(h, d[1]).substr(2), A
                            }
                        }, R._17O ? R : F
                    }(),
                    bc = Om._27O = function (f) {
                        return Om._14O(f)
                    };
                de = function () {
                    return function (p, J) {
                        if (p && J) {
                            J = Po(J);
                            var G = lm(J, P(2, 4)),
                                m = this;
                            if (!m || !m.n || G._55O() > m.n._55O()) return 0;
                            var L = m._37O(G),
                                i = L[cq](P(2, 4)).replace(xp, ""),
                                Z = ko(i);
                            if (0 == Z.length) return !1;
                            var n = Z[0],
                                x = Z[1],
                                X = function (D) {
                                    return Yq._4O.Util._56O(D, n)
                                },
                                O = X(p);
                            return x == O
                        }
                    }.bind(bc(e))
                };
                var aj, dr;
                return function () {
                    var O = xj.length - Zi.length;
                    if (O > 0)
                        for (var F = 0; O > F; F++) aj = _p.Util, dr = Po
                }(), $i = function (_, h) {
                    h = dr(h);
                    var n = bc(ph),
                        A = oe.length,
                        p = 2 * A,
                        d = lm(h, P(A, p)),
                        M = n,
                        a = !0;
                    if (M) {
                        var l = M[Jc[0]];
                        l && d._55O() <= l._55O() && (a = !1)
                    }
                    if (a) return 0;
                    var X = M._37O(d),
                        k = X[cq](P(A, p)).replace(xp, ""),
                        J = ko(k);
                    if (0 == J.length) return !1;
                    var Z = J[0],
                        D = J[1],
                        R = aj._11A(_, Z);
                    return D == R
                }, Om
            }(x, o), Uh(u, {
                load: function () {
                    var j = {},
                        $ = function (k) {
                            return k ? "c_" + (k.sync ? "1" : "0") + "_" + (k.post ? "1" : "0") + "_" + (k.responseType || "H") + "_" + (k.mimeType || "H") + "_" + (k.data ? JSON.stringify(k.data) : "H") : ""
                        };
                    return function (F, U, Y) {
                        var P, n = j[F],
                            y = $(Y);
                        return n && (P = n[y]) ? (P.push(U), void 0) : (j[F] || (n = j[F] = {
                            count: 0
                        }), P = n[y] = [U], n.count++, u.xhrLoad(F, function (w) {
                            delete n[y], n.count--, n.count || delete j[F], P.forEach(function (O) {
                                O(w)
                            })
                        }, Y), void 0)
                    }
                }(),
                asyncEach: function (p, E, h) {
                    "function" != typeof h && (h = Function.prototype);
                    var X = new Array(p.length),
                        H = 0,
                        m = !1;
                    p.forEach(function (C, F) {
                        E(C, function (t, i) {
                            return m ? void 0 : t ? (m = !0, h(null)) : (X[F] = i, H++, H === p.length ? h(X) : void 0)
                        })
                    })
                }, xhrLoad: function ($, b, F) {
                    var x = !1;
                    ip($) || (x = !0, $ = [$]), F = F || {};
                    var M = F.sync,
                        e = null,
                        H = F.method || "GET";
                    return F.post && (H = "POST"), F.method = H, u.asyncEach($, function (Z, W) {
                        var K = new De;
                        Z = u.beforeLoadURL(Z), Z.data ? W(null, Z.data) : (F.url = encodeURI(Z), F.responseType ? K.setResponseType(F.responseType) : K.setOverrideMimeType(F.mimeType || "text/plain"), K.onload = function () {
                            200 === this.status || 0 === this.status ? W(null, K.getResponseText()) : W(!0)
                        }, K.onerror = function () {
                            W(!0)
                        }, K.send(F))
                    }, function (a) {
                        var O = "function" == typeof b;
                        (O || M) && (e = x && a ? a[0] : a, O && b(e))
                    }), M ? e : void 0
                }
            });
        var rb = o.setPrototypeOf || function (f, Y) {
            return f.__proto__ = Y, f
        },
            ql = o.getPrototypeOf || function (w) {
                return w.__proto__
            },
            bc = o.freeze;
        o.isFrozen;
        var zn = function () {
            var g = function (G) {
                return G
            };
            return function (I) {
                return I && I.length ? new Function("o", ["return o['", I.join("']['"), "'];"].join("")) : g
            }
        }(),
            ai = function () {
                var H = function (o, Z) {
                    return o = Z
                };
                return function (p) {
                    return p && p.length ? new Function("o", "v", ["return o['", p.join("']['"), "'] = v;"].join("")) : H
                }
            }();
        ! function () {
            function d(T) {
                var i = [];
                if (T)
                    for (var B;
                        (B = $.exec(T)) != Z;) i.push(B[1]);
                return i
            }

            function F(F, W) {
                var T = G.exec(W);
                this._cell = F, this._key = T[1], this._format = T[2], this._style = d(T[3])
            }

            function E(w) {
                for (var g = this._cellList = [], V = this._paramList = [], m = w.split(_), L = 0, P = m.length; P > L; ++L) {
                    var u = m[L];
                    if ("{{" !== u)
                        for (var x = u.split(o), l = 0, N = x.length; N > l; ++l) {
                            var b = x[l];
                            o.test(b) ? (V.push(new F(g.length, b)), g.push(Z)) : b.length > 0 && g.push(b)
                        } else g.push("{")
                }
                this._formatList = this._cellList.slice(0)
            }
            var X = {},
                T = {},
                _ = /(\{\{)/,
                o = /(\{\w+(?:\:\w+(?:\&[\w\.])*)?\})/,
                G = /\{(\w+)(?:\:(\w+)((?:\&[\w\.])*))?\}/,
                $ = /\&([\w\.]*)/g;
            E.prototype._73O = function (I) {
                for (var b = this._paramList.length; b--;) {
                    var A = this._paramList[b],
                        v = I[Zb(A._key) + 1],
                        J = T[A._format];
                    J && (v = J(v, A._style)), this._formatList[A._cell] = v
                }
                return this._formatList.join("")
            }, E.prototype._map = function (s) {
                for (var k = this._paramList.length; k--;) {
                    var f = this._paramList[k],
                        a = s[f._key],
                        C = T[f._format];
                    C && (a = C(a, f._style)), this._formatList[f._cell] = a
                }
                return this._formatList.join("")
            };
            var p = function (w) {
                var Y = X[w];
                return Y || (X[w] = Y = new E(w)), Y._73O(arguments)
            };
            return p.map = function (s, i) {
                var I = X[s];
                return I || (X[s] = I = new E(s)), I._map(i)
            }, p.setValueFormat = function (G, b) {
                T[G] = b
            }, p.gc = function () {
                X.length = 0
            }, p.__parsed = X, p
        }();
        var _j = function () {
            function p(H, h, y, x) {
                var s = H ? H.path.slice(0) : [];
                h && s.push(h), this.desc = y, this.name = h, this.path = bc(s), this.getter = zn(s), this.setter = ai(s), this.isLeaf = x, this.parent = H, this.children = [], this.childMap = {}
            }
            return p.create = function () {
                function S(w, u, K, U) {
                    var M = U(K),
                        F = new p(w, u, K, M);
                    if (!M) {
                        for (var m = F.children, j = F.childMap, b = o.keys(K), R = 0, d = b.length; d > R; ++R) {
                            var O = b[R],
                                D = S(F, O, K[O], U);
                            m.push(D), j[D.name] = D
                        }
                        F.children = bc(m), F.childMap = bc(j)
                    }
                    return bc(F), F
                }
                return function (k, L) {
                    return S(Z, Z, k, L)
                }
            }(), p.prototype.forEach = function (W, v) {
                for (var Y = this.children, o = 0, m = Y.length; m > o; ++o) {
                    var z = Y[o];
                    W(z, v)
                }
            }, p
        }(),
            bc = o.freeze,
            Sc = {
                main: {
                    mask: 1,
                    priority: u.cameraPriority.main,
                    clearDepth: !1,
                    ignore: !1
                },
                top: {
                    mask: 2,
                    priority: u.cameraPriority.top,
                    ignore: !1
                }
            },
            aq = "main",
            pb = Sc[aq].mask,
            hp = function (N, R, $) {
                if (N = N || 0, !(R in Sc)) {
                    if ($b >= 32) throw new Error("Only 31 render layer can be defined.");
                    Sc[R] = {
                        mask: 1 << $b++,
                        priority: Sc[aq].priority
                    }
                }
                if ($)
                    for (var E in $) Sc[R][E] = $[E];
                return kl = Ck(o.keys(Sc)), $b = kl.length, N |= Sc[R].mask
            },
            Sr = function (L, c) {
                return L && c && L & c
            },
            Ck = function (p) {
                return p.sort(function (s, i) {
                    return Sc[s].priority - Sc[i].priority
                })
            },
            kl = Ck(o.keys(Sc)),
            $b = kl.length;
        Uh(u, {
            setRenderLayerInfo: function (J, q) {
                hp(0, J, q)
            }, getRenderLayerInfo: function (F) {
                return Sc[F]
            }
        }, !0);
        var xr = O.List = function () {
            this._as = [];
            var s, z, V = arguments.length;
            if (1 === V) {
                var B = arguments[0];
                if (Xo(B) && (B = B._as), ip(B))
                    for (z = B.length, s = 0; z > s; s++) this._as.push(B[s]);
                else B != F && this._as.push(B)
            } else if (V > 1)
                for (s = 0; V > s; s++) this._as.push(arguments[s])
        };
        ki("List", o, {
            forEach: function (h, L) {
                this.each(h, L)
            }, push: function () {
                for (var y = 0; y < arguments.length; y++) this.add(arguments[y])
            }, pop: function () {
                return this._as.pop()
            }, shift: function () {
                return this._as.shift()
            }, unshift: function () {
                return this._as.unshift.apply(this._as, arguments)
            }, size: function () {
                return this._as.length
            }, isEmpty: function () {
                return 0 === this._as.length
            }, add: function (e, I) {
                return I === Z ? this._as.push(e) : this._as.splice(I, 0, e)
            }, addAll: function ($) {
                Xo($) && ($ = $._as), ip($) ? gc(this._as, $) : this._as.push($)
            }, get: function (x) {
                return this._as[x]
            }, slice: function (g, r) {
                return new xr(this._as.slice(g, r))
            }, remove: function (b) {
                var Q = this._as.indexOf(b);
                return Q >= 0 && Q < this._as.length && this.removeAt(Q), Q
            }, removeAt: function (_) {
                return this._as.splice(_, 1)[0]
            }, set: function (O, k) {
                return this._as[O] = k
            }, clear: function () {
                return this._as.splice(0, this._as.length)
            }, contains: function (e) {
                return this._as.indexOf(e) >= 0
            }, indexOf: function (I) {
                return this._as.indexOf(I)
            }, each: function ($, x) {
                for (var Z = 0, t = this._as.length; t > Z; Z++) {
                    var X = this._as[Z];
                    x ? $.call(x, X, Z, this) : $(X, Z, this)
                }
            }, reverseEach: function (C, j) {
                for (var H = this._as.length - 1; H >= 0; H--) {
                    var $ = this._as[H];
                    j ? C.call(j, $) : C($)
                }
            }, getArray: function () {
                return this._as
            }, toArray: function (H, h) {
                if (H) {
                    for (var C, _ = [], N = 0, Q = this._as.length; Q > N; N++) C = this._as[N], h ? H.call(h, C) && _.push(C) : H(C) && _.push(C);
                    return _
                }
                return this._as.concat()
            }, toList: function (V, G) {
                if (V) {
                    for (var R, I = new xr, N = 0, h = this._as.length; h > N; N++) R = this._as[N], G ? V.call(G, R) && I.add(R) : V(R) && I.add(R);
                    return I
                }
                return new xr(this)
            }, reverse: function () {
                this._as.reverse()
            }, sort: function (P) {
                return this._as.sort(P ? P : Sd), this
            }, toString: function () {
                return this._as.toString()
            }
        }), o.defineProperties(xr.prototype, {
            length: {
                get: function () {
                    return this._as.length
                }, set: function (d) {
                    this._as.length = d
                }
            }
        });
        var Yh = new xr;
        Uh(Yh, {
            size: function () {
                return 0
            }, indexOf: function () {
                return -1
            }, contains: function () {
                return !1
            }, isEmpty: function () {
                return !0
            }, sort: Mr,
            each: Mr,
            reverseEach: Mr,
            toArray: function () {
                return []
            }, toList: function () {
                return new xr
            }, add: jm,
            addAll: jm,
            set: jm,
            remove: jm,
            removeAt: jm,
            clear: jm
        });
        var Yj = O.Notifier = function () {
            this._f = 0
        };
        ki("Notifier", o, {
            contains: function (P, W) {
                if (this._ls)
                    for (var s, o = 0, $ = this._ls.size(); $ > o; o++)
                        if (s = this._ls.get(o), P === s.l && W === s.s) return !0;
                return !1
            }, add: function (w, y, v) {
                var f = this,
                    Z = {
                        l: w,
                        s: y,
                        a: v
                    };
                f._ls || (f._ls = new xr), f._f ? (f._as || (f._as = new xr), f._as.add(Z)) : Z.a ? f._ls.add(Z, 0) : f._ls.add(Z)
            }, remove: function (h, K) {
                var r = this;
                r._ls && (r._f ? (r._rs || (r._rs = new xr), r._rs.add({
                    l: h,
                    s: K
                })) : r._remove(h, K))
            }, _remove: function (R, X) {
                for (var t, j = this._ls, S = 0, J = j.size(); J > S; S++)
                    if (t = j.get(S), t.l === R && t.s === X) return j.removeAt(S), void 0
            }, fire: function (F) {
                var J = this,
                    M = J._ls;
                if (J._b = 1e4, M) {
                    ++J._f;
                    try {
                        for (var X, h = 0, C = M.size(); C > h; h++) X = M.get(h), X.s ? X.l.call(X.s, F) : X.l(F)
                    } catch (F) {
                        cd(function () {
                            throw F
                        })
                    } finally {
                        if (--J._f) return;
                        if (J._rs) {
                            for (C = J._rs.size(), h = 0; C > h; h++) X = J._rs.get(h), J._remove(X.l, X.s);
                            delete J._rs
                        }
                        if (J._as) {
                            for (C = J._as.size(), h = 0; C > h; h++) X = J._as.get(h), X.a ? M.add(X, 0) : M.add(X);
                            delete J._as
                        }
                    }
                }
            }
        });
        var Qp = O.Data = function () {
            this._id = xp()
        };
        ki("Data", o, {
            ms_ac: ["tag", "name", "displayName", "icon", "toolTip", "attrObject", "styleMap", "layer", "adjustChildrenToTop", "dataBindings"],
            ms_dm: 1,
            ms_attr: 1,
            _icon: F,
            _parent: F,
            _children: Yh,
            _childMap: F,
            _styleMap: F,
            _layer: "0",
            _renderLayer: aq,
            _renderLayerMask: pb,
            _adjustChildrenToTop: !1,
            getRenderLayerMask: function () {
                return this._renderLayerMask || pb
            }, getRenderLayer: function () {
                return this._renderLayer || aq
            }, setRenderLayer: function (S) {
                var g = this,
                    H = hp(0, S);
                g._renderLayerMask = H;
                var Y = g._renderLayer;
                g._renderLayer = S, g.fp("renderLayer", Y, g._renderLayer)
            }, testRenderLayer: function (V) {
                var C = Sc[V];
                return C && Sr(this._renderLayerMask, Sc[V].mask)
            }, getUIClass: function () {
                return F
            }, _22Q: function () {
                return F
            }, beginTransaction: function () {
                this._dataModel && this._dataModel.beginTransaction()
            }, endTransaction: function () {
                this._dataModel && this._dataModel.endTransaction()
            }, s: function (z, d) {
                var V = this;
                if (2 === arguments.length) V.setStyle(z, d);
                else {
                    if (!xl(z)) return V.getStyle(z);
                    for (var q in z) V.setStyle(q, z[q])
                }
                return V
            }, fp: function (H, V, N, j, o) {
                return this.firePropertyChange(H, V, N, j, o)
            }, firePropertyChange: function (x, l, s, v, K) {
                if (v) {
                    if (v(l, s)) return !1
                } else if (l === s) return !1;
                var p = this,
                    R = K || {};
                return R.property = x, R.oldValue = l, R.newValue = s, R.data = p, p._dataModel && p._dataModel.handleDataPropertyChange(R), p.onPropertyChanged(R), !0
            }, onPropertyChanged: function (H) {
                var M = this,
                    c = M._parent,
                    T = H.property;
                if (yl(c)) {
                    var v = M.s(Dm),
                        d = "s:ingroup" === T;
                    (v && Lk[T] || T === d) && c._81I(), (v || d) && c.fp("childChange", !0, !1)
                }
                Qb(c) && (Lk[T] || "elevation" === T || Yr[T] || "scaleTall" === T || "tall" === T) && c.updateFromChildren()
            }, _21I: function (S) {
                var t = this;
                if (S && t._dataModel) throw "Remove data from dataModel before adding";
                t._dataModel = S
            }, removeFromDataModel: function () {
                this._dataModel ? this._dataModel.remove(this) : this.setParent(null)
            }, clearChildrenFromDataModel: function () {
                for (var I = 0, f = this._children.toArray(), q = f.length; q > I; I++) f[I].removeFromDataModel()
            }, getId: function () {
                return this._id
            }, setId: function ($) {
                this._id = $
            }, getChildren: function () {
                return this._children
            }, size: function () {
                return this._children.size()
            }, toChildren: function (W, D) {
                return this._children.toList(W, D)
            }, eachChild: function (j, c) {
                this._children.each(j, c)
            }, addChild: function (v, s) {
                var q = this;
                v !== q && (q._children === Yh && (q._children = new xr, q._childMap = {}), s >= 0 || (s = q._children.size()), q._childMap[v._id] || q.isDescendantOf(v) || (v._parent && v._parent.removeChild(v), (0 > s || s > q._children.size()) && (s = q._children.size()), q._children.add(v, s), q._childMap[v._id] = v, v.setParent(q), q.onChildAdded(v, s), q.fp(Wf, F, v)))
            }, onChildAdded: function () { }, removeChild: function (m) {
                var J = this;
                if (J._childMap && J._childMap[m._id]) {
                    var V = J._children.remove(m);
                    delete J._childMap[m._id], J.fp(Wf, m, F), m.setParent(F, V), J.onChildRemoved(m, V)
                }
            }, onChildRemoved: function () { }, getChildAt: function (I) {
                return this._children.get(I)
            }, clearChildren: function () {
                var B = this;
                if (!B._children.isEmpty())
                    for (var P = 0, $ = B._children.toArray(), b = $.length; b > P; P++) B.removeChild($[P])
            }, getParent: function () {
                return this._parent
            }, setParent: function (I, Q) {
                var W = this;
                if (!(W._73I || W._parent === I || W === I || I && I.isDescendantOf(W))) {
                    var V, v = W._parent;
                    W._parent = I, W._73I = 1, v ? (Q == F && (Q = v.getChildren().indexOf(W)), v.removeChild(W)) : W._dataModel && Q == F && (Q = W._dataModel.getRoots().indexOf(W)), I && (I.addChild(W), V = I.getChildren().indexOf(W)), delete W._73I, W.fp("parent", v, I, Z, {
                        oldIndex: Q,
                        newIndex: V
                    }), W.onParentChanged(v, I)
                }
            }, onParentChanged: function () { }, hasChildren: function () {
                return this._children.size() > 0
            }, isEmpty: function () {
                return this._children.isEmpty()
            }, isRelatedTo: function (c) {
                return c ? this.isDescendantOf(c) || c.isDescendantOf(this) : !1
            }, isParentOf: function (P) {
                return P && this._childMap ? !!this._childMap[P._id] : !1
            }, isDescendantOf: function (R) {
                if (!R || R.isEmpty()) return !1;
                for (var b = this._parent; b;) {
                    if (R === b) return !0;
                    b = b._parent
                }
                return !1
            }, getStyle: function (B, A) {
                A === Z && (A = 1);
                var q = this._styleMap ? this._styleMap[B] : Z;
                return q === Z && A ? z[B] : q
            }, setStyle: function (b, u) {
                var T = this;
                T._styleMap || (T._styleMap = {});
                var Q = T._styleMap[b];
                u === Z ? delete T._styleMap[b] : T._styleMap[b] = u, T.fp("s:" + b, Q, u) && T.onStyleChanged(b, Q, u)
            }, onStyleChanged: function () { }, iv: function (b) {
                this.invalidate(b)
            }, invalidate: function (k) {
                this.fp(k || "*", !1, !0)
            }, toString: function () {
                var Y = this;
                return Y._displayName || Y._name || Y._tag || Y._id
            }, toLabel: function () {
                return this._displayName || this._name
            }, addStyleIcon: function (q, d) {
                var r = this,
                    e = r.s(ub);
                r.beginTransaction(), e || r.s(ub, e = {}), d ? e[q] = d : delete e[q], r.fp(ub, F, e), r.endTransaction()
            }, removeStyleIcon: function (M) {
                var P = this.s(ub);
                if (P) {
                    var x = P[M];
                    delete P[M], this.fp(ub, F, P)
                }
                return x
            }, _calcAnchorMatrix3d: function () { }, appendAnchorMatrix3d: function (h) {
                var W = this;
                if (W.hasOwnProperty("_anchor") || W.hasOwnProperty("_anchorElevation")) {
                    var l = W.getAnchor3d(),
                        D = {
                            x: l.x - .5,
                            y: l.y - .5,
                            z: l.z - .5
                        };
                    bo(h, [-D.x, -D.y, -D.z])
                }
            }, getSerializableProperties: function () {
                return {
                    name: 1,
                    displayName: 1,
                    icon: 1,
                    toolTip: 1,
                    parent: 1,
                    layer: 1,
                    renderLayer: 1,
                    tag: 1,
                    adjustChildrenToTop: 1,
                    dataBindings: 1
                }
            }, getSerializableStyles: function () {
                var F, D = {};
                for (F in this._styleMap) D[F] = 1;
                return D
            }, getCurrentPrefix: function () {
                return this._interactPrefix || Nh
            }, ca: function (r, W) {
                var z = this.getCurrentPrefix();
                return r = z + r, 2 === arguments.length ? this.a(r, W) : this.a(r)
            }
        });
        var jn = O.DataModel = function () {
            var n = this;
            n._isDeserializing = 0, n._datas = new xr, n._dataMap = {}, n._roots = new xr, n._rootMap = {}, n._fsDataMap = {}, n._78O = {}, n._reflectorMap = {}, n._36I = new Yj, n._35I = new Yj, n._serializeNotifier = new Yj, n._selectionModel = new Uc(n);
            var N = n._29Q = [],
                e = n._scheduleCallback = function () {
                    for (var m = Date.now(), M = 0; M < N.length; M++) {
                        var S = N[M];
                        S.enabled && m - S.lastTime > S.interval && (S.beforeAction && S.beforeAction(), S.action && n.each(function (r) {
                            S.action(r)
                        }), S.afterAction && S.afterAction(), S.lastTime = m)
                    }
                    N.length && (n._30Q = x.requestAnimationFrame(e))
                }
        };
        ki("DataModel", o, {
            ms_fire: 1,
            ms_attr: 1,
            ms_ac: ["layers", "name", "autoAdjustIndex", "hierarchicalRendering", "background", "envmap", "postProcessingData", "init"],
            _name: Z,
            _autoAdjustIndex: !0,
            _hierarchicalRendering: !1,
            _background: Z,
            _init: Z,
            _envmap: Z,
            _cubicEnvmap: !1,
            _postProcessingData: Z,
            sm: function () {
                return this.getSelectionModel()
            }, mm: function (B, q, C) {
                this.addDataModelChangeListener(B, q, C)
            }, umm: function (o, y) {
                this.removeDataModelChangeListener(o, y)
            }, md: function (F, m, G) {
                this.addDataPropertyChangeListener(F, m, G)
            }, umd: function (B, i) {
                this.removeDataPropertyChangeListener(B, i)
            }, mh: function (r, i, M) {
                this.addHierarchyChangeListener(r, i, M)
            }, umh: function (y, v) {
                this.removeHierarchyChangeListener(y, v)
            }, getAttrObject: function () {
                return this._attrObject
            }, setAttrObject: function (Z) {
                return this._attrObject = Z
            }, getSelectionModel: function () {
                return this._selectionModel
            }, size: function () {
                return this._datas.size()
            }, isEmpty: function () {
                return this._datas.isEmpty()
            }, getRoots: function () {
                return this._roots
            }, getDatas: function () {
                return this._datas
            }, getFullscreenDatas: function () {
                return this._fsDataMap
            }, getReflectors: function () {
                return this._reflectorMap
            }, getDataById: function (D) {
                return this._dataMap[D]
            }, removeDataById: function (P) {
                this.remove(this.getDataById(P))
            }, toDatas: function (j, F) {
                return this._datas.toList(j, F)
            }, each: function (Z, r) {
                this._datas.each(Z, r)
            }, getDataByTag: function (e) {
                return this._78O[e]
            }, getTagMap: function () {
                return this._78O
            }, removeDataByTag: function (e) {
                this.remove(this.getDataByTag(e))
            }, add: function (R, k, M) {
                var H = this,
                    m = R._id,
                    P = R._tag,
                    v = H._roots;
                if (H._dataMap[m]) throw "'" + m + "' already exists";
                P != F && (H._78O[P] = R), H._dataMap[m] = R, M >= 0 ? H._datas.add(R, M) : H._datas.add(R), R._parent || (H._rootMap[m] = R, k >= 0 ? v.add(R, k) : v.add(R)), R.s("fullscreen") !== Z && (H._fsDataMap[m] = R), R.s("shape3d.reflector") && (H._reflectorMap[m] = R), R._21I(H), H.onAdded(R), H._36I.fire({
                    kind: "add",
                    data: R,
                    rootsIndex: k,
                    datasIndex: M
                })
            }, onAdded: function () { }, remove: function (k, L) {
                if (k) {
                    var q = this,
                        I = k._id,
                        S = L && L.keepStructure,
                        M = L && L.keepChildren,
                        A = k.getTag();
                    if (k._dataModel === q) {
                        this.beginTransaction(), S ? q._removingData || (q._removingData = k) : q.prepareRemove(k), M || k.toChildren().each(function (I) {
                            q.remove(I, L)
                        }, q), S ? q._removingData === k && (k._parent && k._parent.removeChild(k), delete q._removingData) : k._parent && k._parent.removeChild(k);
                        var Z = q._datas.remove(k);
                        delete q._dataMap[I], A != F && delete q._78O[A];
                        var c;
                        q._rootMap[I] && (delete q._rootMap[I], c = q._roots.remove(k)), q._fsDataMap[I] && delete q._fsDataMap[I], q._reflectorMap[I] && delete q._reflectorMap[I], k._21I(F), q.onRemoved(k), q._36I.fire({
                            kind: Ce,
                            data: k,
                            rootsIndex: c,
                            datasIndex: Z
                        }), this.endTransaction()
                    }
                }
            }, onRemoved: function () { }, prepareRemove: function () { }, clear: function () {
                var h = this;
                if (h._datas.size()) {
                    var G = h._historyManager ? this.toJSON() : Z;
                    h._datas.toArray().forEach(function (M) {
                        M._21I(F)
                    }), h._datas.clear(), h._dataMap = {}, h._roots.clear(), h._rootMap = {}, h._fsDataMap = {}, h._reflectorMap = {}, h._78O = {}, h._36I.fire({
                        kind: Tg,
                        json: G
                    })
                }
            }, contains: function (V) {
                return V && V._dataModel === this
            }, handleDataPropertyChange: function (v) {
                var i = this,
                    m = v.data,
                    n = v.property;
                if ("parent" === n) {
                    var K = m._id,
                        R = i._rootMap,
                        _ = i._roots;
                    m._parent ? R[K] && (delete R[K], _.remove(m)) : R[K] || (R[K] = m, _.add(m))
                } else if ("tag" === n) {
                    var E = v.oldValue,
                        L = v.newValue,
                        u = i._78O;
                    E != F && delete u[E], L != F && (u[L] = m)
                } else if ("s:fullscreen" === n) {
                    var K = m._id,
                        h = i._fsDataMap;
                    v.oldValue != F && delete h[K], v.newValue != F && (h[K] = m)
                } else if ("s:shape3d.reflector" === n) {
                    var K = m._id,
                        t = i._reflectorMap;
                    v.oldValue && delete t[K], v.newValue && (t[K] = m)
                }
                this.onDataPropertyChanged(m, v), this._35I.fire(v)
            }, onDataPropertyChanged: function () { }, addDataModelChangeListener: function (E, B, W) {
                this._36I.add(E, B, W)
            }, removeDataModelChangeListener: function (y, x) {
                this._36I.remove(y, x)
            }, addSerializeListener: function (z, D, I) {
                this._serializeNotifier.add(z, D, I)
            }, removeSerializeListener: function (L, c) {
                this._serializeNotifier.remove(L, c)
            }, fireSerializeEvent: function (Q) {
                this._serializeNotifier.fire(Q)
            }, addDataPropertyChangeListener: function (D, f, K) {
                this._35I.add(D, f, K)
            }, removeDataPropertyChangeListener: function (N, j) {
                this._35I.remove(N, j)
            }, _38I: function (o, s, J) {
                this._37I && this._37I.fire({
                    data: o,
                    oldIndex: s,
                    newIndex: J
                })
            }, addHierarchyChangeListener: function (U, Z, q) {
                this._37I || (this._37I = new Yj), this._37I.add(U, Z, q)
            }, removeHierarchyChangeListener: function (j, m) {
                this._37I.remove(j, m)
            }, getSiblings: function (K) {
                var R = K._parent;
                return R ? R._children : this._roots
            }, eachByHierarchical: function (e, B, l) {
                if (B) return this._eachByHierarchical(e, B, l);
                for (var z = 0, v = this._roots, G = v.size(); G > z; z++)
                    if (this._eachByHierarchical(e, v.get(z), l) === !1) return !1;
                return !0
            }, _eachByHierarchical: function (g, U, S) {
                if (S) {
                    if (g.call(S, U) === !1) return !1
                } else if (g(U) === !1) return !1;
                for (var n = U.size(), V = 0; n > V; V++)
                    if (this._eachByHierarchical(g, U.getChildAt(V), S) === !1) return !1;
                return !0
            }, reverseEachByHierarchical: function (s, T, U) {
                if (T) return this._reverseEachByHierarchical(s, T, U);
                for (var V = this._roots, w = V.size(), H = w - 1; H >= 0; H--)
                    if (this._reverseEachByHierarchical(s, V.get(H), U) === !1) return !1;
                return !0
            }, _reverseEachByHierarchical: function (_, e, E) {
                for (var p = e.size(), s = p - 1; s >= 0; s--)
                    if (this._reverseEachByHierarchical(_, e.getChildAt(s), E) === !1) return !1;
                if (E) {
                    if (_.call(E, e) === !1) return !1
                } else if (_(e) === !1) return !1;
                return !0
            }, eachByDepthFirst: function (s, K, A) {
                if (K) return this._11I(s, K, A);
                for (var W = 0, O = this._roots, d = O.size(); d > W; W++)
                    if (this._11I(s, O.get(W), A) === !1) return !1;
                return !0
            }, _11I: function (o, e, l) {
                for (var H = e.size(), M = 0; H > M; M++)
                    if (this._11I(o, e.getChildAt(M), l) === !1) return !1;
                if (l) {
                    if (o.call(l, e) === !1) return !1
                } else if (o(e) === !1) return !1;
                return !0
            }, eachByBreadthFirst: function (b, _, u) {
                var c = new xr;
                for (_ ? c.add(_) : this._roots.each(c.add, c); c.size() > 0;)
                    if (_ = c.removeAt(0), _.eachChild(c.add, c), u) {
                        if (b.call(u, _) === !1) return !1
                    } else if (b(_) === !1) return !1;
                return !0
            }, moveTo: function (I, B) {
                var s = this.getSiblings(I),
                    J = s.indexOf(I);
                J === B || 0 > J || B >= 0 && B <= s.size() && (s.remove(I), B > s.size() && B--, s.add(I, B), this._38I(I, J, B))
            }, moveUp: function (C) {
                this.moveTo(C, this.getSiblings(C).indexOf(C) - 1)
            }, moveDown: function (P) {
                this.moveTo(P, this.getSiblings(P).indexOf(P) + 1)
            }, moveToTop: function (z) {
                this.moveTo(z, 0)
            }, moveToBottom: function (v) {
                this.moveTo(v, this.getSiblings(v).size())
            }, moveSelectionUp: function (q) {
                this.beginTransaction(), q || (q = this.sm());
                var Y = new xr;
                ao(q, Y, this._roots), Y.each(this.moveUp, this), this.endTransaction()
            }, moveSelectionDown: function (l) {
                this.beginTransaction(), l || (l = this.sm());
                var m = new xr;
                Tk(l, m, this._roots), m.each(this.moveDown, this), this.endTransaction()
            }, moveSelectionToTop: function (A) {
                this.beginTransaction(), A || (A = this.sm());
                var m = new xr;
                no(A, m, this._roots), m.each(this.moveToTop, this), this.endTransaction()
            }, moveSelectionToBottom: function (k) {
                this.beginTransaction(), k || (k = this.sm());
                var R = new xr;
                er(k, R, this._roots), R.each(this.moveToBottom, this), this.endTransaction()
            }, moveToIndex: function (h, E, f) {
                var J = this.getDatas();
                null == f && (f = J.indexOf(h)), f === E || 0 > f || E >= 0 && E <= J.size() && (J.remove(h), E > J.size() && E--, J.add(h, E), this._76I(h, f, E))
            }, bringForward: function (r) {
                this.moveToIndex(r, this.getDatas().indexOf(r) + 1)
            }, bringToFront: function (N) {
                this.moveToIndex(N, this.size())
            }, sendBackward: function ($) {
                this.moveToIndex($, this.getDatas().indexOf($) - 1)
            }, sendToBack: function (p) {
                this.moveToIndex(p, 0)
            }, bringSelectionForward: function (G) {
                this.beginTransaction(), G || (G = this.sm());
                for (var V = new xr, o = this.getDatas(), W = !1, p = 0; p < o.size(); p++) {
                    var P = o.get(o.size() - 1 - p);
                    G.contains(P) ? W && V.add(P) : W = !0
                }
                V.each(this.bringForward, this), this.endTransaction()
            }, bringSelectionToFront: function (c) {
                this.beginTransaction(), c || (c = this.sm());
                for (var X = new xr, H = this.getDatas(), B = 0; B < H.size(); B++) {
                    var d = H.get(B);
                    c.contains(d) && X.add(d)
                }
                X.each(this.bringToFront, this), this.endTransaction()
            }, sendSelectionBackward: function (X) {
                this.beginTransaction(), X || (X = this.sm());
                for (var Q = new xr, f = this.getDatas(), R = !1, g = 0; g < f.size(); g++) {
                    var J = f.get(g);
                    X.contains(J) ? R && Q.add(J) : R = !0
                }
                Q.each(this.sendBackward, this), this.endTransaction()
            }, sendSelectionToBack: function (t) {
                this.beginTransaction(), t || (t = this.sm());
                for (var C = new xr, P = this.getDatas(), x = 0; x < P.size(); x++) {
                    var J = P.get(P.size() - 1 - x);
                    t.contains(J) && C.add(J)
                }
                C.each(this.sendToBack, this), this.endTransaction()
            }, addScheduleTask: function (c) {
                var u = this;
                u.removeScheduleTask(c), c.enabled == F && (c.enabled = !0), c.interval == F && (c.interval = 10), c.lastTime = Date.now(), u._29Q.push(c), u._30Q == F && (u._30Q = x.requestAnimationFrame(u._scheduleCallback))
            }, removeScheduleTask: function (G) {
                var P = this,
                    w = P._29Q,
                    b = w.indexOf(G);
                b >= 0 && w.splice(b, 1), w.length || P._30Q == F || (x.cancelAnimationFrame(P._30Q), delete P._30Q)
            }, getHistoryManager: function () {
                return this._historyManager
            }, enableHistoryManager: function (I) {
                this._historyManager || new O.HistoryManager(this), null != I && this._historyManager.setMaxHistoryCount(I), this._historyManager.setDisabled(!1)
            }, disableHistoryManager: function () {
                this._historyManager && this._historyManager.setDisabled(!0)
            }, clearHistoryManager: function () {
                this._historyManager && this._historyManager.clear()
            }, undo: function (d) {
                this._historyManager && this._historyManager.undo(d)
            }, redo: function (c) {
                this._historyManager && this._historyManager.redo(c)
            }, beginTransaction: function () {
                this._historyManager && this._historyManager.beginTransaction()
            }, endTransaction: function () {
                this._historyManager && this._historyManager.endTransaction()
            }, addHistory: function (t) {
                this._historyManager && this._historyManager.addHistory(t)
            }, onHistoryManagerChanged: function () { }, isDeserializing: function () {
                return this._isDeserializing > 0
            }, setDeserializing: function (d) {
                d ? this._isDeserializing++ : this._isDeserializing--
            }, isCubicEnvmap: function () {
                return this._cubicEnvmap
            }, setCubicEnvmap: function (H) {
                var m = this._cubicEnvmap;
                this._cubicEnvmap = H, this.fp("cubicEnvmap", m, H)
            }
        });
        var Uc = O.SelectionModel = function (Q) {
            var l = this;
            l._68O = tb, l._map = {}, l._73O = new xr, l._74I = new Yj, l._21I(Q)
        };
        ki("SelectionModel", o, {
            ms_fire: 1,
            ms_dm: 1,
            ms: function (k, I, B) {
                this.addSelectionChangeListener(k, I, B)
            }, ums: function (b, R) {
                this.removeSelectionChangeListener(b, R)
            }, fd: function () {
                return this.getFirstData()
            }, ld: function () {
                return this.getLastData()
            }, sg: function () {
                return this._68O === vq
            }, co: function (O) {
                return this._map[O._id] != F
            }, ss: function (Q) {
                this.setSelection(Q)
            }, as: function (q) {
                this.appendSelection(q)
            }, rs: function (G) {
                this.removeSelection(G)
            }, cs: function () {
                this.clearSelection()
            }, sa: function () {
                this.selectAll()
            }, getSelectionMode: function () {
                return this._68O
            }, setSelectionMode: function (e) {
                var S = this;
                if (S._68O !== e && (e === Jc || e === vq || e === tb)) {
                    S.cs();
                    var L = S._68O;
                    S._68O = e, S.fp("selectionMode", L, e)
                }
            }, _21I: function (R) {
                var F = this,
                    L = F._dataModel;
                L !== R && (L && (F.cs(), L.umm(F.handleDataModelChange, F)), F._dataModel = R, R.mm(F.handleDataModelChange, F, !0), F.fp(uk, L, R))
            }, dispose: function () {
                var N = this;
                N.cs(), N._dataModel.umm(N.handleDataModelChange, N)
            }, handleDataModelChange: function ($) {
                var H = this;
                if ($.kind === Ce) {
                    var z = $.data;
                    H.co(z) && (H._73O.remove(z), delete H._map[z._id], H._75I(Ce, new xr(z)))
                } else $.kind === Tg && H.cs()
            }, getFilterFunc: function () {
                return this._filterFunc
            }, setFilterFunc: function (m) {
                var x = this;
                if (x._filterFunc !== m) {
                    x.cs();
                    var C = x._filterFunc;
                    x._filterFunc = m, x.fp("filterFunc", C, x._filterFunc)
                }
            }, _75I: function (r, Y, O, j) {
                O && (this._73O.each(function (U) {
                    j[U._id] ? O.remove(U) : O.add(U)
                }), Y = O.toList()), this._74I.fire({
                    kind: r,
                    datas: new xr(Y)
                })
            }, addSelectionChangeListener: function (w, J, r) {
                this._74I.add(w, J, r)
            }, removeSelectionChangeListener: function (B, D) {
                this._74I.remove(B, D)
            }, _97O: function (E, A) {
                for (var C, f = this, v = 0, o = new xr(E); v < o.size(); v++) C = o.get(v), (f._filterFunc && !f._filterFunc(C) || A && f.co(C) || !A && !f.co(C) || !f._dataModel.contains(C)) && (o.removeAt(v), v--);
                return o
            }, appendSelection: function (S) {
                var g = this;
                if (g._68O !== Jc) {
                    var C, B, r = g._73O,
                        c = g._97O(S, !0);
                    c.isEmpty() || (g.sg() && (C = new xr(r), B = g._map, r.clear(), g._map = {}, c = new xr(c.get(c.size() - 1))), c.each(function (F) {
                        r.add(F), g._map[F._id] = F
                    }), g._75I("append", c, C, B))
                }
            }, removeSelection: function (b) {
                var U = this,
                    F = U._97O(b),
                    G = 0,
                    K = F.size();
                if (0 !== K) {
                    for (; K > G; G++) {
                        var D = F.get(G);
                        U._73O.remove(D), delete U._map[D._id]
                    }
                    U._75I(Ce, F)
                }
            }, toSelection: function (K, q) {
                return this._73O.toList(K, q)
            }, getSelection: function () {
                return this._73O
            }, each: function (Q, i) {
                this._73O.each(Q, i)
            }, setSelection: function (Z) {
                var E = this,
                    y = E._73O;
                if (E._68O !== Jc && !(y.isEmpty() && !Z || 1 === y.size() && E.ld() === Z)) {
                    var L = new xr(y),
                        w = E._map;
                    y.clear(), E._map = {};
                    var $ = E._97O(Z, !0);
                    E.sg() && $.size() > 1 && ($ = new xr($.get($.size() - 1))), $.each(function (Q) {
                        y.add(Q), E._map[Q._id] = Q
                    }), E._75I("set", F, L, w)
                }
            }, clearSelection: function () {
                var a = this,
                    v = a._73O;
                if (v.size() > 0) {
                    var p = v.toList();
                    v.clear(), a._map = {}, a._75I(Tg, p)
                }
            }, selectAll: function () {
                var H = this;
                if (H._68O !== Jc) {
                    var x, S, k = H._dataModel.toDatas();
                    if (H._filterFunc)
                        for (x = 0; x < k.size(); x++) S = k.get(x), H._filterFunc(S) || (k.removeAt(x), x--);
                    var o = H._73O,
                        r = new xr(o),
                        f = H._map;
                    o.clear(), H._map = {}, H.sg() && k.size() > 1 && (k = new xr(k.get(k.size() - 1)));
                    var _ = k.size();
                    for (x = 0; _ > x; x++) S = k.get(x), o.add(S), H._map[S._id] = S;
                    H._75I("all", F, r, f)
                }
            }, size: function () {
                return this._73O.size()
            }, isEmpty: function () {
                return this._73O.isEmpty()
            }, contains: function (k) {
                return this._map[k._id] != F
            }, getLastData: function () {
                var $ = this._73O;
                return $.size() > 0 ? $.get($.size() - 1) : F
            }, getFirstData: function () {
                var A = this._73O;
                return A.size() > 0 ? A.get(0) : F
            }, isSelectable: function (n) {
                var t = this;
                return n && t._68O !== Jc ? t._filterFunc ? t._filterFunc(n) : !0 : !1
            }, getTopSelection: function () {
                var d = this,
                    D = new xr;
                return d._73O.each(function (i) {
                    for (var p = i.getParent(); p;) {
                        if (d.contains(p)) {
                            i = F;
                            break
                        }
                        p = p.parent
                    }
                    i && D.add(i)
                }), D
            }
        });
        var Rp = function () {
            return Ub(0),
                function ($, t) {
                    var k;
                    if (Th(t)) {
                        var R = $.getDataUI(t);
                        R && R._88I && (k = R._88I.rect)
                    }
                    return k ? k : t.getRect()
                }
        }();
        Uh(u, {
            edgeGroupAgentFunc: F,
            graphViewAutoScrollZone: 16,
            graphViewZoomable: !0,
            graphViewResettable: !1,
            graphViewPannable: !0,
            graphViewRectSelectable: !0,
            graphViewScrollBarVisible: !0,
            graphViewRectSelectBorderColor: S.rectSelectBorder,
            graphViewRectSelectBackground: Vh,
            graphViewEditPointSize: nf ? 17 : 7,
            graphViewEditPointBorderColor: S.editPointBorder,
            graphViewEditPointBackground: S.editPointBackground,
            setEdgeType: function (b, R, c) {
                $d[b] = R, Dc[b] = c
            }, getEdgeType: function (F) {
                return $d[F]
            }, getEdgeTypeMap: function () {
                return $d
            }, getNodeRect: Rp
        }, !0);
        var Ve = {
            "layout.h": Z,
            "layout.v": Z,
            "2d.selectable": !0,
            "2d.visible": !0,
            "2d.movable": !0,
            "2d.editable": !0,
            "2d.move.mode": Z,
            "2d.attachable": !1,
            "2d.hostable": !1,
            interactive: !1,
            preventDefaultWhenInteractive: !0,
            "image.stretch": "fill",
            icons: Z,
            ingroup: !0,
            "body.color": Z,
            "2d.gray": !1,
            fullscreen: Z,
            "fullscreen.gap": 2,
            "fullscreen.lock": !1,
            opacity: Z,
            pixelPerfect: !0,
            keepAspectRatio: !1,
            "attach.points": null,
            "attach.style": null,
            "attach.close.threshold": 16,
            "clip.direction": "top",
            "clip.percentage": 1,
            "select.color": Bc,
            "select.width": 1,
            "select.padding": 2,
            "select.type": Tq,
            shadow: !1,
            "shadow.blur": 6,
            "shadow.offset.x": 3,
            "shadow.offset.y": 3,
            shadow2: !1,
            "shadow2.color": Bc,
            "shadow2.blur": 6,
            "shadow2.offset.x": 3,
            "shadow2.offset.y": 3,
            "border.color": Z,
            "border.width": 2,
            "border.padding": 2,
            "border.type": Tq,
            label: Z,
            "label.font": Z,
            "label.color": Dh,
            "label.background": Z,
            "label.position": 31,
            "label.position.fixed": !1,
            "label.offset.x": 0,
            "label.offset.y": 2,
            "label.rotation": Z,
            "label.max": Z,
            "label.opacity": Z,
            "label.scale": 1,
            "label.align": Z,
            "label.selectable": !0,
            label2: Z,
            "label2.font": Z,
            "label2.color": Dh,
            "label2.background": Z,
            "label2.position": 34,
            "label2.position.fixed": !1,
            "label2.offset.x": 0,
            "label2.offset.y": -2,
            "label2.rotation": Z,
            "label2.max": Z,
            "label2.opacity": Z,
            "label2.scale": 1,
            "label2.align": Z,
            "label2.selectable": !0,
            note: Z,
            "note.expanded": !0,
            "note.font": Z,
            "note.color": rf,
            "note.background": Bc,
            "note.position": 8,
            "note.offset.x": -3,
            "note.offset.y": 3,
            "note.max": Z,
            "note.toggleable": !0,
            "note.border.width": 1,
            "note.border.color": Z,
            "note.opacity": Z,
            "note.scale": 1,
            "note.align": Z,
            note2: Z,
            "note2.expanded": !0,
            "note2.font": Z,
            "note2.color": rf,
            "note2.background": Bc,
            "note2.position": 3,
            "note2.offset.x": 3,
            "note2.offset.y": -3,
            "note2.max": Z,
            "note2.toggleable": !0,
            "note2.border.width": 1,
            "note2.border.color": Z,
            "note2.opacity": Z,
            "note2.scale": 1,
            "note2.align": Z,
            "group.type": Z,
            "group.image": Z,
            "group.image.stretch": "fill",
            "group.repeat.image": Z,
            "group.border.repeat.image": Z,
            "group.padding": 8,
            "group.padding.left": 0,
            "group.padding.right": 0,
            "group.padding.top": 0,
            "group.padding.bottom": 0,
            "group.position": 17,
            "group.toggleable": !0,
            "group.title.font": Z,
            "group.title.color": rf,
            "group.title.background": S.groupTitleBackground,
            "group.title.align": nq,
            "group.title.orientation": $c,
            "group.background": S.groupBackground,
            "group.depth": 1,
            "group.border.width": 1,
            "group.border.pattern": Z,
            "group.border.color": Ur,
            "group.border.radius": Z,
            "group.border.cap": ob,
            "group.border.join": Wl,
            "group.border.width.absolute": !1,
            "group.splitLine": !1,
            "group.gradient": F,
            "group.gradient.color": "#FFF",
            shape: Z,
            "shape.background": Ur,
            "shape.repeat.image": Z,
            "shape.border.repeat.image": Z,
            "shape.border.width": 0,
            "shape.border.width.absolute": !1,
            "shape.border.color": Ur,
            "shape.border.3d": !1,
            "shape.border.3d.color": Z,
            "shape.border.3d.accuracy": Z,
            "shape.border.cap": ob,
            "shape.border.join": Wl,
            "shape.border.pattern": Z,
            "shape.gradient": F,
            "shape.gradient.color": "#FFF",
            "shape.depth": 0,
            "shape.dash": !1,
            "shape.dash.pattern": up,
            "shape.dash.offset": 0,
            "shape.dash.color": dm,
            "shape.dash.width": Z,
            "shape.dash.3d": !1,
            "shape.dash.3d.color": Z,
            "shape.dash.3d.accuracy": Z,
            "shape.polygon.side": 6,
            "shape.arc.from": W,
            "shape.arc.to": $,
            "shape.arc.close": !0,
            "shape.arc.oval": !1,
            "shape.corner.radius": Z,
            "shape.gradient.pack": Z,
            "shape.fill.rule": "nonzero",
            "shape.fill.clip.direction": "top",
            "shape.fill.clip.percentage": 1,
            "shape.foreground": Z,
            "shape.foreground.gradient": F,
            "shape.foreground.gradient.color": "#FFF",
            "shape.foreground.clip.direction": "top",
            "shape.foreground.clip.percentage": 1,
            "autolayout.gap": Z,
            "autolayout.hgap": Z,
            "autolayout.vgap": Z,
            "edge.type": Z,
            "edge.points": Z,
            "edge.segments": Z,
            "edge.color": Ur,
            "edge.width": 2,
            "edge.width.absolute": !1,
            "edge.repeat.image": null,
            "edge.offset": 0,
            "edge.group": 0,
            "edge.expanded": !0,
            "edge.gap": 12,
            "edge.toggleable": !0,
            "edge.center": !1,
            "edge.3d": !1,
            "edge.3d.color": Z,
            "edge.3d.accuracy": Z,
            "edge.cap": ob,
            "edge.join": Wl,
            "edge.source.position": 17,
            "edge.source.anchor.x": Z,
            "edge.source.anchor.y": Z,
            "edge.source.offset.x": 0,
            "edge.source.offset.y": 0,
            "edge.source.index": -1,
            "edge.source.percent": 0,
            "edge.target.position": 17,
            "edge.target.anchor.x": Z,
            "edge.target.anchor.y": Z,
            "edge.target.offset.x": 0,
            "edge.target.offset.y": 0,
            "edge.target.index": -1,
            "edge.target.percent": 0,
            "edge.pattern": Z,
            "edge.dash": !1,
            "edge.dash.pattern": up,
            "edge.dash.offset": 0,
            "edge.dash.color": dm,
            "edge.dash.width": Z,
            "edge.dash.3d": !1,
            "edge.dash.3d.color": Z,
            "edge.dash.3d.accuracy": Z,
            "edge.independent": !1,
            "attach.row.index": 0,
            "attach.column.index": 0,
            "attach.row.span": 1,
            "attach.column.span": 1,
            "attach.padding": 0,
            "attach.padding.left": 0,
            "attach.padding.right": 0,
            "attach.padding.top": 0,
            "attach.padding.bottom": 0,
            "attach.index": -1,
            "attach.offset": 0,
            "attach.offset.relative": !1,
            "attach.offset.opposite": !1,
            "attach.thickness": Z,
            "attach.gap": 0,
            "attach.gap.relative": !1,
            "grid.row.count": 1,
            "grid.column.count": 1,
            "grid.row.percents": Z,
            "grid.column.percents": Z,
            "grid.border": 1,
            "grid.border.left": 0,
            "grid.border.right": 0,
            "grid.border.top": 0,
            "grid.border.bottom": 0,
            "grid.gap": 1,
            "grid.background": S.gridBackground,
            "grid.depth": 1,
            "grid.cell.depth": -1,
            "grid.cell.border.color": S.gridCellBorderColor,
            "grid.block": Z,
            "grid.block.padding": 3,
            "grid.block.width": 1,
            "grid.block.color": S.gridBlockColor,
            text: "",
            "text.align": "left",
            "text.vAlign": "middle",
            "text.color": Dh,
            "text.font": Fh,
            "text.shadow": !1,
            "text.shadow.color": Bc,
            "text.shadow.blur": 6,
            "text.shadow.offset.x": 3,
            "text.shadow.offset.y": 3,
            "text.scale.x": 1,
            "text.scale.y": 1,
            keepPosition: !0
        };
        Ve[Cp] = Z, Uh(z, Ve, !0), Uh(jn, {
            _76I: function (v, N, F) {
                this._39I && this._39I.fire({
                    data: v,
                    oldIndex: N,
                    newIndex: F
                })
            }, addIndexChangeListener: function (i, V, m) {
                var Z = this;
                Z._39I || (Z._39I = new Yj), Z._39I.add(i, V, m)
            }, removeIndexChangeListener: function (E, M) {
                this._39I.remove(E, M)
            }, prepareRemove: function (I) {
                Bk(I) && (I.setSource(F), I.setTarget(F)), I._70O && I._70O.toList().each(this.remove, this), I._69O && I._69O.toList().each(function (W) {
                    W.setHost(F)
                }), I._host && I.setHost(F)
            }, onAdded: function (x) {
                this.isAutoAdjustIndex() && this.adjustIndex(x)
            }, onDataPropertyChanged: function (z, h) {
                xs[h.property] && this.isAutoAdjustIndex() && this.adjustIndex(z)
            }, isAdjustable: function (P) {
                return Fq(P) || Bk(P)
            }, isAdjustedToBottom: function (Q) {
                return yl(Q) ? Q.isExpanded() && ag(Q) : !1
            }, adjustIndex: function (K) {
                var Q = this;
                this.isHierarchicalRendering() || (Q.isAdjustedToBottom(K) ? (Q.sendToBottom(K), K.eachChild(Q.adjustIndex, Q)) : Q.sendToTop(K))
            }, sendToTop: function (j) {
                var U = this;
                if (U.contains(j) && U.isAdjustable(j)) {
                    var y = U._datas;
                    if (j !== y.get(U.size() - 1)) {
                        var b = y.indexOf(j);
                        y.removeAt(b), y.add(j), U._76I(j, b, U.size() - 1)
                    }
                    if (Bk(j)) {
                        var V = j._40I;
                        V && !U.isAdjustedToBottom(V) && U.sendToTop(V), V = j._41I, V && !U.isAdjustedToBottom(V) && U.sendToTop(V)
                    }
                    j._69O && j._69O.each(function (G) {
                        G.isRelatedTo(j) || Fq(j) && G.isLoopedHostOn(j) || U.sendToTop(G)
                    }), j.ISubGraph || (!yl(j) || j.isExpanded()) && j._adjustChildrenToTop && j.eachChild(function (X) {
                        Bk(X) || U.sendToTop(X)
                    })
                }
            }, sendToBottom: function (W, m) {
                var H = this;
                if (W !== m && H.contains(W) && H.isAdjustable(W) && (!m || H.contains(m))) {
                    var T = H._datas,
                        R = T.remove(W),
                        L = m ? H._datas.indexOf(m) : 0;
                    if (T.add(W, L), R !== L) {
                        H._76I(W, R, L);
                        var J = W._parent;
                        !J || J.ISubGraph || Bk(J) || H.sendToBottom(W._parent, W)
                    }
                }
            }
        }), Uh(fb, {
            ms_edit: function (i) {
                i._46O = function (W) {
                    var A = this,
                        l = A.gv.dm(),
                        g = A._index,
                        b = A._89I,
                        Y = A._node,
                        J = A._shape,
                        H = A._edge,
                        Z = A._77I;
                    Y && b ? (this.fi({
                        kind: "endEditRect",
                        event: W,
                        data: Y,
                        direction: b
                    }), l.endTransaction()) : J && g >= 0 ? (A.fi({
                        kind: "endEditPoint",
                        event: W,
                        data: J,
                        index: g
                    }), l.endTransaction()) : H && g >= 0 ? (A.fi({
                        kind: "endEditPoint",
                        event: W,
                        data: H,
                        index: g
                    }), l.endTransaction()) : Z && (A.fi({
                        kind: "endEditRotation",
                        event: W,
                        data: Z
                    }), l.endTransaction())
                }, i._78I = function (t) {
                    var Q = this;
                    Q.autoScroll(t);
                    var j = Q.gv.lp(t),
                        s = Q._index,
                        i = Q._89I,
                        S = Q._node,
                        m = Q._shape,
                        V = Q._edge,
                        q = Q._77I;
                    if (S && i) Q._80O(j), Q.fi({
                        kind: "betweenEditRect",
                        event: t,
                        data: S,
                        direction: i
                    });
                    else if (m && s >= 0) j.e = m.getPoints().get(s).e, m.setPoint(s, j), Q.fi({
                        kind: "betweenEditPoint",
                        event: t,
                        data: m,
                        index: s
                    });
                    else if (V && s >= 0) {
                        var k = V.s(Ei);
                        j.e = k.get(s).e, k.set(s, j), V.fp(Ei, F, k), Q.fi({
                            kind: "betweenEditPoint",
                            event: t,
                            data: V,
                            index: s
                        })
                    } else if (q) {
                        var Y = q.p(),
                            z = q.getScale(),
                            I = N + D(j.y - Y.y, j.x - Y.x);
                        z.y < 0 && (I += W), X(I) < .04 && (I = 0), q.setRotation(I), Q.fi({
                            kind: "betweenEditRotation",
                            event: t,
                            data: q
                        })
                    }
                }, i._80O = function (O) {
                    var J = this,
                        Z = J._node,
                        N = J._rect,
                        u = N.x,
                        T = N.y,
                        n = N.width,
                        H = N.height,
                        $ = J._89I,
                        h = J._anchor,
                        F = J._matrix,
                        O = F.tfi(O);
                    "northwest" === $ ? N = ms(O, {
                        x: u + n,
                        y: T + H
                    }) : $ === Tb ? N = ms({
                        x: u,
                        y: O.y
                    }, {
                        x: u + n,
                        y: T + H
                    }) : "northeast" === $ ? N = ms({
                        x: u,
                        y: O.y
                    }, {
                        x: O.x,
                        y: T + H
                    }) : $ === Wg ? N = ms({
                        x: O.x,
                        y: T
                    }, {
                        x: u + n,
                        y: T + H
                    }) : $ === Yn ? N = ms({
                        x: u,
                        y: T
                    }, {
                        x: O.x,
                        y: T + H
                    }) : "southwest" === $ ? N = ms({
                        x: O.x,
                        y: T
                    }, {
                        x: u + n,
                        y: O.y
                    }) : "south" === $ ? N = ms({
                        x: u,
                        y: T
                    }, {
                        x: u + n,
                        y: O.y
                    }) : "southeast" === $ && (N = ms({
                        x: u,
                        y: T
                    }, O)), Z.setPosition(F.tf(N.x + N.width * h.x, N.y + N.height * h.y)), Z.setWidth(N.width), Z.setHeight(N.height)
                }, i._80I = function (a, U, L, z) {
                    var J = this,
                        V = J.gv._zoom,
                        t = (J.gv.getEditPointSize() + 2) / V;
                    return cf({
                        x: U - t / 2,
                        y: L - t / 2,
                        width: t,
                        height: t
                    }, a) ? (J._89I !== z && (J._89I = z), !0) : !1
                }, i._79I = function (K, f, L) {
                    var O = this,
                        J = O.gv,
                        R = f ? J.getDataUI(f) : F,
                        e = R ? R._55O : F;
                    if (e) {
                        var A, H, x, m, B = J._zoom,
                            d = (J.getEditPointSize() + 2) / B,
                            W = J.lp(K);
                        if (Fq(f)) {
                            if (e._56O && Fq(f) && (H = e._98o, cf({
                                x: H.x - d / 2,
                                y: H.y - d / 2,
                                width: d,
                                height: d
                            }, W))) return O._77I = f, L && O.fi({
                                kind: "beginEditRotation",
                                event: K,
                                data: f
                            }), O.setCursor("crosshair"), !0;
                            if (e._43O && f instanceof Fc)
                                for (x = f.getPoints(), A = x.size() - 1; A >= 0; A--)
                                    if (H = x.get(A), cf({
                                        x: H.x - d / 2,
                                        y: H.y - d / 2,
                                        width: d,
                                        height: d
                                    }, W)) return O._index = A, O._shape = f, L && O.fi({
                                        kind: "beginEditPoint",
                                        event: K,
                                        data: f,
                                        index: A
                                    }), O.setCursor("crosshair"), !0;
                            if (e._42O)
                                for (var b = f.getEditControlPoints(), i = ["northwest", -1, -1, Wg, -1, 0, "southwest", -1, 1, "south", 0, 1, "southeast", 1, 1, Yn, 1, 0, "northeast", 1, -1, Tb, 0, -1], A = 0, m = b.length; m > A; A++) {
                                    var y = i[3 * A],
                                        Q = b[A];
                                    if (O._80I(W, Q.x, Q.y, y)) {
                                        O._node = f;
                                        var q = f.getWidth(),
                                            T = f.getHeight(),
                                            p = f.getAnchor();
                                        O._rect = {
                                            x: -q * p.x,
                                            y: -T * p.y,
                                            width: q,
                                            height: T
                                        }, O._anchor = p, O._matrix = f.getMatrix();
                                        var v = f.getRotation(),
                                            s = k(v),
                                            _ = n(v),
                                            Z = i[3 * A + 1] * he(f.getScale().x),
                                            j = i[3 * A + 2] * he(f.getScale().y),
                                            N = Math.atan2(-_ * Z - s * j, s * Z - _ * j),
                                            z = (Math.round(N / (Math.PI / 4)) + 8) % 8,
                                            Y = [Nc, "nesw-resize", zi, "nwse-resize", Nc, "nesw-resize", zi, "nwse-resize"][z];
                                        return O.setCursor(Y), L && O.fi({
                                            kind: "beginEditRect",
                                            event: K,
                                            data: f,
                                            direction: O._89I
                                        }), !0
                                    }
                                }
                        }
                        if (e._43O && Bk(f) && f.s(ej) === _b && (x = f.s(Ei)))
                            for (A = x.size() - 1; A >= 0; A--)
                                if (H = x.get(A), cf({
                                    x: H.x - d / 2,
                                    y: H.y - d / 2,
                                    width: d,
                                    height: d
                                }, W)) return O._index = A, O._edge = f, L && O.fi({
                                    kind: "beginEditPoint",
                                    event: K,
                                    data: f,
                                    index: A
                                }), O.setCursor("crosshair"), !0
                    }
                    return !1
                }
            }, ms_gv: function (A) {
                A._currentSubGraph = F, A._initView = function () {
                    this._fpsInfo = {
                        time: 0,
                        fps: 0,
                        frames: 0
                    }
                }, A.upSubGraph = function () {
                    this.setCurrentSubGraph(Jr(this._currentSubGraph))
                }, A.isVisible = function (s) {
                    var j = this;
                    if (Jr(s) !== j._currentSubGraph) return !1;
                    if (Bk(s)) {
                        var k = s._40I,
                            $ = s._41I;
                        if (!k || !$) return !1;
                        if (!(s.s("edge.independent") || j.isVisible(k) && j.isVisible($))) return !1;
                        if (s.isEdgeGroupHidden()) return !1
                    } else
                        for (var I = s._parent; I && !I.ISubGraph;) {
                            if (yl(I) && (!I.isExpanded() || !j.isVisible(I))) return !1;
                            I = I._parent
                        }
                    if (s._parent instanceof Br && !j.isVisible(s._parent)) return !1;
                    if (s._refGraph instanceof Ff && !j.isVisible(s._refGraph)) return !1;
                    if (j instanceof Hl) {
                        if (!s.s("3d.visible")) return !1
                    } else {
                        var h = j.getLayersInfo();
                        if (h) {
                            var C = h[s._layer];
                            if (C && C.visible === !1) return !1
                        }
                        if (!s.s("2d.visible")) return !1
                    }
                    return j._visibleFunc ? j._visibleFunc(s) : !0
                }, A.handleSelectionChange = function (f) {
                    var m = this;
                    f.datas.each(function (z) {
                        m.invalidateData(z);
                        var s = z._parent;
                        yl(s) && Fq(z) && z.s(Dm) && (m.invalidateData(s), s._49I && s._49I.each(function (P) {
                            m.invalidateData(P)
                        }))
                    }), m.onSelectionChanged(f)
                }, A.onSelectionChanged = function (D) {
                    var x = this,
                        f = x.sm();
                    if (1 === f.size() && ("set" === D.kind || "append" === D.kind)) {
                        var E = f.ld();
                        x.isAutoMakeVisible() && x.makeVisible(E), x.adjustIndex && x._dataModel.isAutoAdjustIndex() && x.adjustIndex(E)
                    }
                }, A.makeVisible = function (n) {
                    if (n) {
                        var H = this,
                            Y = H.getDataUI ? H.getDataUI(n) : H.getData3dUI(n);
                        if (Y) {
                            var t = n,
                                $ = Jr(n);
                            for ($ !== H._currentSubGraph && H.setCurrentSubGraph($);
                                (t = t._parent) && t !== $;) yl(t) && t.setExpanded(!0);
                            H._23I = n, H.iv()
                        }
                    }
                }, A.getLabel = function (b) {
                    var v = b.getStyle(Bg);
                    return v === Z ? b.getName() : v
                }, A.getLabelBackground = function (V) {
                    return V.getStyle("label.background")
                }, A.getLabelColor = function (j) {
                    return j.getStyle("label.color")
                }, A.getLabel2 = function (D) {
                    return D.getStyle("label2")
                }, A.getLabel2Background = function (F) {
                    return F.getStyle("label2.background")
                }, A.getLabel2Color = function ($) {
                    return $.getStyle("label2.color")
                }, A.getNote = function (Z) {
                    return Z.getStyle(Rm)
                }, A.getNoteBackground = function (n) {
                    return n.getStyle("note.background")
                }, A.getNote2 = function (G) {
                    return G.getStyle(Vk)
                }, A.getNote2Background = function (E) {
                    return E.getStyle("note2.background")
                }, A.handleClick = function (v, t, z) {
                    var K = this;
                    t ? (K.fi({
                        kind: "clickData",
                        event: v,
                        data: t,
                        part: z
                    }), K.onDataClicked(t, v)) : (K.fi({
                        kind: "clickBackground",
                        event: v
                    }), K.onBackgroundClicked(v))
                }, A.handleDoubleClick = function (R, b, P) {
                    var s = this;
                    jj(R) && (b ? (s.fi({
                        kind: "doubleClickData",
                        event: R,
                        data: b,
                        part: P
                    }), s.onDataDoubleClicked(b, R, P), s.checkDoubleClickOnNote(R, b, P) || s.checkDoubleClickOnRotation && s.checkDoubleClickOnRotation(R, b, P) || (Bk(b) ? s.onEdgeDoubleClicked(b, R, P) : b.ISubGraph ? s.onSubGraphDoubleClicked(b, R, P) : yl(b) ? s.onGroupDoubleClicked(b, R, P) : b.IDoorWindow ? s.onDoorWindowDoubleClicked(b, R, P) : b.ICSGBox && s.onCSGBoxDoubleClicked(b, R, P))) : (s.fi({
                        kind: "doubleClickBackground",
                        event: R
                    }), s.onBackgroundDoubleClicked(R)))
                }, A.onSubGraphDoubleClicked = function (x) {
                    this.setCurrentSubGraph(x)
                }, A.onEdgeDoubleClicked = function (x, k) {
                    this.isEditable(x) || (x.ISubGraph && !ik(k) ? this.setCurrentSubGraph(x) : x.s("edge.toggleable") && x.toggle())
                }, A._39Q = function (l) {
                    return this.isInteractive(l) ? this.preventDefaultWhenInteractive(l) : !1
                }, A.preventDefaultWhenInteractive = function (o) {
                    return o.s("preventDefaultWhenInteractive")
                }, A.onGroupDoubleClicked = function (F) {
                    F.s("group.toggleable") && F.toggle()
                }, A.onDoorWindowDoubleClicked = function (k) {
                    k.s("dw.toggleable") && k.toggle(!0)
                }, A.onCSGBoxDoubleClicked = function (N, L) {
                    var r = this;
                    if (r instanceof Hl) {
                        var a = r.intersectObject(L, N);
                        a && N.s(a.part + ".toggleable") && N.toggleFace(a.part, !0)
                    }
                }, A.onBackgroundClicked = function () { }, A.onBackgroundDoubleClicked = function () {
                    this.upSubGraph()
                }, A.onDataClicked = function () { }, A.onDataDoubleClicked = function () { }, A.onAutoLayoutEnded = function () { }, A.onMoveEnded = function () { }, A.onPanEnded = function () { }, A.onPinchEnded = function () { }, A.onRectSelectEnded = function () { }, A.onZoomEnded = function () { }, A.serialize = function (g) {
                    return this.dm().serialize(g)
                }, A.toJSON = function () {
                    return this.dm().toJSON()
                }, A.deserialize = function (S, G) {
                    var i = this;
                    G = G instanceof Qp ? {
                        rootParent: G
                    } : El(G) ? {
                        setId: G
                    } : Mf(G) ? {
                        finishFunc: G
                    } : G || {}, G.view = i;
                    var e = i.dm();
                    return G.__innerHandler__ = function (k) {
                        if (El(e.a("toolTipEnable")) && (e.a("toolTipEnable") ? i.enableToolTip() : i.disableToolTip()), i instanceof O.graph.GraphView && (El(e.a("zoomable")) && i.setZoomable && i.setZoomable(e.a("zoomable")), El(e.a("pannable")) && i.setPannable && i.setPannable(e.a("pannable")), El(e.a("rectSelectable")) && i.setRectSelectable && i.setRectSelectable(e.a("rectSelectable")), e.a("fitContent") === !0 && i.fitContent && i.fitContent(!0, 0)), i instanceof O.graph3d.Graph3dView) {
                            var Y = k.scene;
                            Y && Y.shadow != F && i.shadowMap.setShadow(Y.shadow, Y.shadowParams);
                            var $ = e.a("sceneContext");
                            $ ? ($.eye && i.setEye($.eye), $.center && i.setCenter($.center), Bp($.far) && i.setFar($.far), Bp($.near) && i.setNear($.near)) : (Bp(e.a("sceneNear")) && i.setNear(e.a("sceneNear")), Bp(e.a("sceneFar")) && i.setFar(e.a("sceneFar")), Y && (Y.eye && i.setEye(Y.eye), Y.center && i.setCenter(Y.center))), El(e.a("sceneShadowEnabled")) && (e.a("sceneShadowEnabled") ? i.enableShadow() : i.disableShadow()), e.a("sceneShadowDegreeX") && i.setShadowDegreeX(e.a("sceneShadowDegreeX")), e.a("sceneShadowDegreeZ") && i.setShadowDegreeZ(e.a("sceneShadowDegreeZ")), e.a("sceneShadowIntensity") && i.setShadowIntensity(e.a("sceneShadowIntensity")), e.a("sceneShadowQuality") && i.setShadowQuality(e.a("sceneShadowQuality")), e.a("sceneShadowType") && i.setShadowType(e.a("sceneShadowType")), e.a("sceneShadowRadius") && i.setShadowRadius(e.a("sceneShadowRadius")), e.a("sceneShadowBias") && i.setShadowBias(e.a("sceneShadowBias")), El(e.a("sceneDashEnable")) && i.setDashDisabled(!e.a("sceneDashEnable")), dk(e.a("sceneHighlightMode")) && i.setHighlightMode(e.a("sceneHighlightMode")), Bp(e.a("sceneHighlightWidth")) && i.setHighlightWidth(e.a("sceneHighlightWidth")), e.a("sceneHighlightColor") && i.setHighlightColor(e.a("sceneHighlightColor")), El(e.a("sceneHeadlightEnable")) && i.setHeadlightDisabled(!e.a("sceneHeadlightEnable")), Bp(e.a("sceneHeadlightRange")) && i.setHeadlightRange(e.a("sceneHeadlightRange")), e.a("sceneHeadlightColor") && i.setHeadlightColor(e.a("sceneHeadlightColor")), Bp(e.a("sceneHeadlightIntensity")) && i.setHeadlightIntensity(e.a("sceneHeadlightIntensity")), Bp(e.a("sceneHeadlightAmbientIntensity")) && i.setHeadlightAmbientIntensity(e.a("sceneHeadlightAmbientIntensity")), El(e.a("sceneFogEnable")) && i.setFogDisabled(!e.a("sceneFogEnable")), e.a("sceneFogMode") && i.setFogMode(e.a("sceneFogMode")), El(e.a("sceneFogDensity")) && i.setFogDensity(!e.a("sceneFogDensity")), e.a("sceneFogColor") && i.setFogColor(e.a("sceneFogColor")), Bp(e.a("sceneFogNear")) && i.setFogNear(e.a("sceneFogNear")), Bp(e.a("sceneFogFar")) && i.setFogFar(e.a("sceneFogFar")), El(e.a("sceneBatchBrightnessDisabled")) && i.setBatchBrightnessDisabled(e.a("sceneBatchBrightnessDisabled")), El(e.a("sceneBatchBlendDisabled")) && i.setBatchBlendDisabled(e.a("sceneBatchBlendDisabled")), El(e.a("sceneBatchColorDisabled")) && i.setBatchColorDisabled(e.a("sceneBatchColorDisabled")), e.a("sceneBatchInfoMap") && i.setBatchInfoMap(e.a("sceneBatchInfoMap")), Bp(e.a("sceneMoveStep")) && i.setMoveStep(e.a("sceneMoveStep")), Bp(e.a("sceneRotateStep")) && i.setRotateStep(e.a("sceneRotateStep"));
                            var h = e.a("sceneSkyboxType") || "sphere";
                            if (h != F) {
                                var T = {},
                                    _ = !1;
                                if ("sphere" === h) {
                                    T.shape3d = h;
                                    var U = e.a("sceneSkyboxImage");
                                    U && (T["shape3d.image"] = U, _ = !0)
                                } else T.shape3d = Z, ["front", "back", "left", "right", "top", "bottom"].forEach(function (y) {
                                    var f = y + ".image",
                                        D = y.charAt(0).toUpperCase() + y.slice(1),
                                        p = e.a("sceneSkybox" + D + "Image");
                                    p && (T[f] = p, _ = !0)
                                }); if (_) {
                                    var z = new Dp;
                                    z.s3(20, 20, 20), T["body.color"] = e.a("sceneSkyboxBodyColor"), T.envmap = e.a("sceneSkyboxEnvmap"), T.light = !1, T["texture.wrap"] = "clampToEdge", z.s(T), ["X", "Y", "Z"].forEach(function (L) {
                                        var Y = e.a("sceneSkyboxRotation" + L);
                                        Bp(Y) && z["setRotation" + L](Y)
                                    }), i.setSkybox(z)
                                }
                            }
                        }
                    }, e.deserialize(S, G.rootParent, G)
                }, A.isDebugTipShowing = function () {
                    return !!this._debugDiv
                }, A.showDebugTip = function () {
                    var v = this,
                        Y = v._debugDiv;
                    if (!Y) {
                        Y = v._debugDiv = U.createElement("div"), Y.style.position = "absolute", Y.style.overflow = "hidden", Y.style.font = u.debugTipLabelFont, Y.style.padding = "6px", Y.style.backgroundColor = u.debugTipBackground, Y.style.color = u.debugTipLabelColor;
                        var F = v.getView();
                        v._79O ? F.insertBefore(Y, v._79O) : F.appendChild(Y);
                        var C = function () {
                            v.redraw();
                            var $ = v._canvas,
                                S = "FPS: " + v._fpsInfo.fps + "<br/>" + "Datas: " + v.dm().getDatas().length + ($ ? "<br/>Size: " + $.width + " * " + $.height : ""),
                                x = v.dm()._historyManager;
                            x && (S += "<br/>Undoes: " + x.getHistories().length + " index: " + x.getHistoryIndex());
                            var e = v.getDebugTip();
                            e && (S += "<hr>" + e), Y.innerHTML = S, v._isDebugging && requestAnimationFrame(C)
                        };
                        requestAnimationFrame(C), v._isDebugging = !0
                    }
                }, A.hideDebugTip = function () {
                    var y = this,
                        o = y._debugDiv;
                    o && (delete y._debugDiv, y.getView().removeChild(o), y._isDebugging = !1)
                }, A.updateDOMAppendMatrix = function () {
                    var J = this.getView();
                    J && (J.updateAppendMatrix = !0)
                }, A.countFrame = function () {
                    if (this._isDebugging) {
                        var h = Date.now(),
                            G = this._fpsInfo;
                        h - G.time > 1e3 ? (G.fps = Math.round(1e5 * (G.frames + 1) / (h - G.time)) / 100, G.time = h, G.frames = 0) : G.frames++
                    }
                }
            }, ms_icons: function (f) {
                f.getRotation = function (m) {
                    return m == F ? 0 : m
                }, f._15O = function () {
                    var j = this,
                        l = j.s(ub);
                    if (l) {
                        var H = j,
                            m = j.data || j._data,
                            B = j._38o = {
                                icons: l,
                                rects: {}
                            };
                        for (var Y in l) {
                            var q = l[Y],
                                A = Dj(q.shape3d, m, H);
                            if (!(Dj(q.visible, m, H) === !1 || Dj(q.for3d, m, H) && !j.I3d || A && !j.I3d)) {
                                var T = A ? [A] : Dj(q.names, m, H),
                                    b = T ? T.length : 0,
                                    s = Dj(q.position, m, H) || 3,
                                    n = Dj(q.offsetX, m, H) || 0,
                                    E = Dj(q.offsetY, m, H) || 0,
                                    R = Dj(q.direction, m, H) || Yn,
                                    x = Dj(q.gap, m, H),
                                    w = x != F ? x : 1,
                                    y = Dj(q.rotation, m, H),
                                    G = Dj(q.keepOrien, m, H),
                                    i = Dj(q.rotationFixed, m, H) ? y : j.getRotation(y, G, s),
                                    v = F,
                                    W = B.rects[Y] = new Array(b);
                                W.rotation = i;
                                for (var M = 0; b > M; M++) {
                                    var p, Z, U, z, L = T[M];
                                    if (A) U = 0, z = 0;
                                    else {
                                        var O = ii(L);
                                        U = Dj(q.width, m, H), z = Dj(q.height, m, H), U == F && (U = xc(O, m)), z == F && (z = oo(O, m))
                                    } if (v ? R === Yn ? n += U / 2 : R === Wg ? n -= U / 2 : R === Tb ? E -= z / 2 : E += z / 2 : v = {
                                        width: U,
                                        height: z
                                    }, j.I3d) {
                                        var a = -U / 2,
                                            N = -z / 2;
                                        Z = {
                                            width: U,
                                            height: z,
                                            mat: j._16O(Dj(q.autorotate, m, H), s, v, Dj(q.face, m, H) || wg, Dj(q.t3, m, H), Dj(q.r3, m, H), Dj(q.rotationMode, m, H), n, E),
                                            vs: new fk([a, -N, 0, a, -N - z, 0, a + U, -N - z, 0, a + U, -N, 0])
                                        }
                                    } else p = j.getPosition(s, n, E, v, Dj(q.positionFixed, m, H)), Z = {
                                        x: p.x - U / 2,
                                        y: p.y - z / 2,
                                        width: U,
                                        height: z
                                    }, j._68o(Z, i);
                                    W[M] = Z, R === Yn ? n += U / 2 + w : R === Wg ? n -= U / 2 + w : R === Tb ? E -= z / 2 + w : E += z / 2 + w
                                }
                            }
                        }
                    }
                }
            }
        });
        var Ym = {
            1: 1,
            2: 1,
            6: 1,
            9: 1,
            10: 1,
            14: 1,
            15: 1,
            16: 1,
            21: 1,
            22: 1,
            26: 1,
            29: 1,
            30: 1,
            34: 1,
            36: 1,
            38: 1,
            40: 1,
            42: 1,
            45: 1,
            50: 1,
            52: 1,
            54: 1
        },
            nk = {
                3: 1,
                7: 1,
                11: 1,
                17: 1,
                23: 1,
                27: 1,
                31: 1,
                44: 1,
                46: 1,
                47: 1,
                49: 1
            },
            Jd = {
                translateX: 1,
                translateY: 1,
                zoom: 1,
                scrollBarVisible: 1
            },
            xs = {
                sourceAgent: 1,
                targetAgent: 1,
                expanded: 1,
                parent: 1,
                host: 1
            },
            Lk = {
                position: 1,
                width: 1,
                height: 1,
                expanded: 1,
                rotation: 1,
                anchor: 1,
                scale: 1,
                "s:edge.points": 1
            },
            Am = {
                "edge.type": 1,
                "edge.group": 1
            },
            Yr = {
                rotation: 1,
                rotationX: 1,
                rotationZ: 1
            },
            Zf = {
                rotation: 1,
                rotationX: 1,
                rotationZ: 1,
                position: 1,
                width: 1,
                height: 1,
                anchor: 1,
                scale: 1
            },
            ir = {
                position: 1,
                width: 1,
                height: 1,
                anchor: 1,
                scale: 1,
                "s:grid.row.count": 1,
                "s:grid.column.count": 1,
                "s:grid.row.percents": 1,
                "s:grid.column.percents": 1,
                "s:grid.border": 1,
                "s:grid.border.left": 1,
                "s:grid.border.right": 1,
                "s:grid.border.top": 1,
                "s:grid.border.bottom": 1,
                "s:grid.gap": 1
            },
            Zj = {
                "attach.row.index": 1,
                "attach.column.index": 1,
                "attach.row.span": 1,
                "attach.column.span": 1,
                "attach.padding": 1,
                "attach.padding.left": 1,
                "attach.padding.right": 1,
                "attach.padding.top": 1,
                "attach.padding.bottom": 1,
                "attach.index": 1,
                "attach.offset": 1,
                "attach.offset.relative": 1,
                "attach.offset.opposite": 1,
                "attach.gap": 1,
                "attach.gap.relative": 1,
                "attach.thickness": 1
            },
            zq = {
                shape: 1,
                thickness: 1,
                position: 1,
                anchor: 1,
                scale: 1
            },
            Jr = function (Q) {
                if (!Q) return F;
                if (Bk(Q)) {
                    var s = Q._40I,
                        l = Q._41I;
                    if (!s || !l) return F;
                    var G = Jr(s),
                        E = Jr(l);
                    return G === E ? G : F
                }
                for (var r = Q._parent; Bk(r) && !r.ISubGraph;) r = r._parent;
                return r ? r.ISubGraph ? r : Jr(r) : F
            },
            ld = function (I, j, F, b) {
                var $ = j.getStyle(F) * b;
                $ && vn(I, $), $ = j.getStyle(F + ".left") * b, $ && (I.x -= $, I.width += $), $ = j.getStyle(F + ".right") * b, $ && (I.width += $), $ = j.getStyle(F + ".top") * b, $ && (I.y -= $, I.height += $), $ = j.getStyle(F + ".bottom") * b, $ && (I.height += $), I.width < 0 && (I.width = -I.width, I.x -= I.width), I.height < 0 && (I.height = -I.height, I.y -= I.height)
            },
            ag = function (U) {
                for (var R, j = 0, S = U.size(); S > j; j++)
                    if (R = U.getChildAt(j), Fq(R) && ag(R)) return !0;
                return U.hasAgentEdges()
            },
            An = function (z) {
                if (!z) return F;
                for (var A = z._parent; yl(A);) {
                    if (!yl(A._parent)) return A.isExpanded() ? z : A;
                    A.isExpanded() || (z = A), A = A._parent
                }
                return z
            },
            ur = function (y, b) {
                if (!y || !b) return F;
                var p, H, X, $ = Jr(y),
                    M = Jr(b);
                if ($ !== M) {
                    for (; M && $ !== M;) M = Jr(M);
                    if ($ === M) return y;
                    p = new xr, p.add(y, 0);
                    for (var f = y._parent; Fq(f) && !b.isDescendantOf(f);) p.add(f, 0), f = f._parent;
                    for (X = p.size(), H = 0; X > H; H++) {
                        var r = p.get(H);
                        if (yl(r) && !r.isExpanded()) return r;
                        if (r.ISubGraph) return r
                    }
                    return y
                }
                return y
            },
            Oq = function (g) {
                if (g.isLooped()) return g._source;
                var L = An(g._source),
                    b = An(g._target);
                return L === b ? g._source : ur(L, b)
            },
            xg = function (y) {
                if (y.isLooped()) return y._target;
                var m = An(y._source),
                    L = An(y._target);
                return m === L ? y._target : ur(L, m)
            },
            Eo = function (r, D, H) {
                "target" !== H && (H = "source");
                var L = "target" === H ? D.getTargetAgent() : D.getSourceAgent(),
                    E = "edge." + H + ".";
                if (Bk(L)) {
                    var T = r.getDataUI(L);
                    T._79o();
                    var i = D.s(E + "index");
                    if (i >= 0) {
                        var e = Kk(T);
                        return e[Math.max(0, Math.min(i, e.length - 1))]
                    }
                    var j = D.s(E + "percent") || 0;
                    j = Math.max(0, Math.min(j, 1));
                    var b = qm(T);
                    return np(b, 100 * j)
                }
                return Yg(r, L, D.s(E + "position"), D.s(E + "offset.x"), D.s(E + "offset.y"), D.s(E + "anchor.x"), D.s(E + "anchor.y"))
            },
            Yg = function (P, R, S, y, u, e, W) {
                if (!R) return F;
                var $, M = R.getRotation ? R.getRotation() : 0;
                if (e !== Z || W !== Z) {
                    e = e === Z ? .5 : e, W = W === Z ? .5 : W;
                    var C = R.getScale();
                    if (M && !Th(R, P) || C.x < 0 || C.y < 0) {
                        var H = R.getPosition(),
                            m = R.getWidth(),
                            I = R.getHeight(),
                            A = R.getAnchor(),
                            _ = new In(M, H.x, H.y, C.x, C.y);
                        S = _.tf((e - A.x) * m, (W - A.y) * I)
                    } else $ = Rp(P, R), S = {
                        x: $.x + e * $.width,
                        y: $.y + W * $.height
                    }
                } else S = Re(S, Rp(P, R)); if (M) {
                    var j = k(M),
                        U = n(M),
                        t = y * j - u * U;
                    u = y * U + u * j, y = t
                }
                return S.x += y, S.y += u, S
            },
            kk = function (Y, h) {
                if (!Y || !h) return F;
                var w, b, D, p, P, M;
                if (Y === h) {
                    if (p = Y.getLoopedEdges(), !p) return F;
                    p = new xr(p)
                } else {
                    if (P = Y.getAgentEdges(), M = h.getAgentEdges(), !P || !M) return F;
                    for (b = P.size(), w = 0; b > w; w++) D = P.get(w), M.contains(D) && (p || (p = new xr), p.add(D))
                } if (p)
                    for (w = 0; w < p.size(); w++) D = p.get(w), D.getStyle(ej) === _b && (D._22I(F), p.removeAt(w), w--);
                return p
            },
            gi = function (j, z) {
                var e = kk(j, z);
                if (e && !e.isEmpty()) {
                    if (1 === e.size()) return e.get(0)._22I(F), void 0;
                    var M = new xr,
                        T = new xr;
                    e.each(function (e) {
                        var k = e.s("edge.group");
                        M.contains(k) || M.add(k)
                    }), M.sort(), M.each(function (d) {
                        T.add(new O.EdgeGroup(e.toList(function (h) {
                            return d === h.s("edge.group")
                        }), T))
                    }), T.each(function (s) {
                        s.each(function (T) {
                            T._22I(s)
                        })
                    })
                }
            },
            wq = function (K, L, Y) {
                var n = K._canvas;
                K._zoom;
                var b = Nm(L, n),
                    X = Nm(Y, n);
                return {
                    x: b.x - X.x,
                    y: b.y - X.y
                }
            },
            vp = function (t, q) {
                if (q) {
                    var Z = q.rect,
                        v = q.color,
                        S = q.rotation,
                        r = q.labelWidth,
                        o = q.background,
                        k = q.opacity,
                        l = q.scale,
                        O = l != F && 1 !== l;
                    if (k != F) {
                        var A = t.globalAlpha;
                        t.globalAlpha *= k
                    }
                    if (S || O) {
                        t.save();
                        var j = Z.x + Z.width / 2,
                            h = Z.y + Z.height / 2;
                        wh(t, j, h), S && jc(t, S), O && t.scale(l, l), wh(t, -j, -h)
                    }
                    if (o && fl(t, Z.x, Z.y, Z.width, Z.height, o), r) {
                        var L = Z.width,
                            m = t.createLinearGradient(Z.x, Z.y, Z.x + L, Z.y);
                        m.addColorStop(0, v), m.addColorStop(.9, v), m.addColorStop(1, nb), v = m, Z.width = r
                    }
                    Om(t, q.ss, Z, q.font, v, q.align), r && (Z.width = L), (S || O) && t.restore(), k != F && (t.globalAlpha = A)
                }
            },
            $q = function (s, Q) {
                if (Q) {
                    var X = Q.rect,
                        O = X.x,
                        E = X.y,
                        h = X.width,
                        K = X.height,
                        J = Q.background,
                        w = Q.backgroundImage,
                        f = Q.borderWidth,
                        U = Q.borderColor,
                        e = Q.labelWidth,
                        M = Q.opacity,
                        Y = Q.scale,
                        n = Y != F && 1 !== Y;
                    if (M != F) {
                        var _ = s.globalAlpha;
                        s.globalAlpha *= M
                    }
                    if (n) {
                        s.save();
                        var y = X.x + X.width / 2,
                            d = X.y + X.height / 2;
                        wh(s, y, d), s.scale(Y, Y), wh(s, -y, -d)
                    }
                    if (Q.expanded) {
                        var t = V(8, h / 4),
                            o = E + K - 8;
                        if (s.fillStyle = J, s.beginPath(), s.moveTo(O, E), s.lineTo(O, o), s.lineTo(O + h / 2, o), s.lineTo(O + h / 2, E + K), s.lineTo(O + h / 2 + t, o), s.lineTo(O + h, o), s.lineTo(O + h, E), s.closePath(), s.fill(), f && (s.lineWidth = f, s.lineJoin = "round", s.lineCap = "round", U ? (s.strokeStyle = U, s.stroke()) : (s.strokeStyle = cn(J), s.beginPath(), s.moveTo(O + h, E), s.lineTo(O + h, o), s.lineTo(O + h / 2 + t, o), s.lineTo(O + h / 2, E + K), s.stroke(), s.strokeStyle = Ee(J), s.beginPath(), s.moveTo(O + h, E), s.lineTo(O, E), s.lineTo(O, o), s.lineTo(O + h / 2, o), s.lineTo(O + h / 2, E + K), s.stroke())), w) qk(s, ii(w), Mg, X.x, X.y, X.width, X.height - 8, Q.data, Q.view);
                        else {
                            if (X.height -= 8, J = Q.color, e) {
                                var S = h,
                                    H = s.createLinearGradient(O, E, O + S, E);
                                H.addColorStop(0, J), H.addColorStop(.9, J), H.addColorStop(1, nb), J = H, X.width = e
                            }
                            Om(s, Q.ss, X, Q.font, J, Q.align), e && (X.width = S), X.height += 8
                        }
                    } else if (Q.icon) Yd(s, ii(Q.icon), O, E, h, K, Q.data, Q.view);
                    else {
                        var v = h / 2;
                        f && (s.lineWidth = f, s.lineJoin = "round", s.lineCap = "round", s.strokeStyle = U ? U : cn(J), s.beginPath(), s.arc(O + v, E + v, v, N, 1.6 * W, !0), s.moveTo(O + v, E + K), s.lineTo(O + h - v / 5, E + v), s.stroke(), s.strokeStyle = U ? U : Ee(J), s.beginPath(), s.arc(O + v, E + v, v, 1.6 * W, N, !0), s.moveTo(O + v, E + K), s.lineTo(O + v / 5, E + v), s.stroke()), s.fillStyle = J, s.beginPath(), s.arc(O + v, E + v, v, 0, $, !0), s.moveTo(O + v, E + K), s.lineTo(O + h - v / 5, E + v), s.lineTo(O + v / 5, E + v), s.closePath(), s.fill(), s.fillStyle = Q.color, s.beginPath(), s.arc(O + v, E + v, v / 3, 0, $, !0), s.fill()
                    }
                    n && s.restore(), M != F && (s.globalAlpha = _)
                }
            },
            cr = function (p, x) {
                return x > 2 * p ? p : x / 2
            },
            Mn = function (A, c, m, Z) {
                if (!A || !c) return 0;
                var L = D(c.y - A.y, c.x - A.x);
                return m || (L = c.x < A.x ? L + W : L), L + Z
            },
            Md = function (A, v, m, J, i, M, Q) {
                Q && (A.x > v.x || A.x === v.x && A.y > v.y) && (m = cg[m], i = -i);
                var b = Re(m, {
                    x: 0,
                    y: 0,
                    width: En(A, v),
                    height: 0
                }, M);
                return b.x += J, b.y += i, b = new In(D(v.y - A.y, v.x - A.x)).tf(b), b.x += A.x, b.y += A.y, b
            },
            Ml = function (B, l, d, C, M) {
                if (B._19Q = !0, !d.getEdgeGroup()) return C ? d.s("edge.gap") : 0;
                if (Bk(d.getSourceAgent()) || Bk(d.getTargetAgent())) return 0;
                var m, X = 0,
                    L = 0,
                    $ = 0;
                if (d.getEdgeGroup().getSiblings().each(function (Q) {
                    Q.each(function (Q) {
                        if (l.isVisible(Q) && Q.s(ej) == M) {
                            var Y = Q.s("edge.gap");
                            m ? (L += $ / 2 + Y / 2, $ = Y) : (m = Q, $ = Y), Q === d && (X = L)
                        }
                    })
                }), C) return L - X + $;
                var Z = X - L / 2;
                return m && d._40I !== m._40I && (B._19Q = !1), Z
            },
            Dk = function () {
                var F = function (R) {
                    var e = [];
                    return R.forEach(function (I) {
                        e.push({
                            x: I.x,
                            y: I.y
                        }), e.push({
                            x: I.x + I.width,
                            y: I.y + I.height
                        }), e.push({
                            x: I.x + I.width,
                            y: I.y
                        }), e.push({
                            x: I.x,
                            y: I.y + I.height
                        })
                    }), e
                };
                return function (T, N, M) {
                    if ("oval" === T) {
                        var j = 0,
                            t = M.height / M.width,
                            f = t * t,
                            n = M.x + M.width / 2,
                            x = M.y + M.height / 2,
                            s = F(N);
                        s.forEach(function (z) {
                            var C = z.x - n,
                                k = z.y - x,
                                R = C * C + k * k / f;
                            R > j && (j = R)
                        }), j = w(j);
                        var O = t * j;
                        return {
                            x: n - j,
                            y: x - O,
                            width: 2 * j,
                            height: 2 * O
                        }
                    }
                    if ("circle" === T) {
                        var r = 0,
                            n = M.x + M.width / 2,
                            x = M.y + M.height / 2,
                            s = F(N);
                        return s.forEach(function (i) {
                            var Q = i.x - n,
                                m = i.y - x,
                                C = Q * Q + m * m;
                            C > r && (r = C)
                        }), r = w(r), {
                            x: n - r,
                            y: x - r,
                            width: 2 * r,
                            height: 2 * r
                        }
                    }
                    return "roundRect" === T ? (vn(M, V(M.width, M.height) / 16), M) : M
                }
            }(),
            hg = O.graph = {},
            Bb = function (i, v, z) {
                yc(Y + ".graph." + i, v, z)
            };
        O.layout = {};
        var wk = {},
            lc = function (i, D, P, A, r, c, v, z) {
                var X = v._zoom;
                if (X !== v._cacheZoom && (v._cacheZoom = X, v._cacheImage = {}), X *= ij, A = Math.ceil(A * X), r = Math.ceil(r * X), A > 2048 || r > 2048) return D;
                var w = [D.uuid, A, r, P].join("_");
                D.cacheRule && (w += "_" + Dj(D.cacheRule, c, v));
                var n = v._cacheImage[w];
                return n || (_m(), n = O.Default.toCanvas(D, A, r, P, c, v, z), zm() && (v._cacheImage[w] = n)), n
            };
        Uh(u, {
            setImageCacheRule: function (h, V) {
                var C;
                V || "object" != typeof h ? (C = {}, C[h] = V) : C = h;
                for (var l in C) {
                    var g = C[l];
                    dk(l) ? (yc = ii(l), yc ? yc.cacheRule = g : wk[l] = g) : l.cacheRule = g
                }
            }
        });
        var zr = {
            comps: [{
                type: bl,
                points: [85, 50, 70, 115, 100, 71, 86, 107, 88, 49, 43, 117, 100, 48, 57, 106, 108, 57, 69, 55, 101, 53, 78, 114, 65, 55, 97, 112, 56, 70, 68, 49, 67, 97, 115, 122, 67, 43, 113, 110, 114, 54, 69, 61],
                borderWidth: 1,
                borderColor: F
            }]
        };
        if (zr[ul] = zr[Hh] = 160, x.Image) {
            var fh = new x.Image;
            fh.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAALUlEQVRYR+3QQREAAAABQfqXFsNnFTizzXk99+MAAQIECBAgQIAAAQIECBAgMBo/ACHo7lH9AAAAAElFTkSuQmCC", _c("default_blank", fh)
        }
        _c("node_image", ee(30, 30, [{
            type: Tq,
            rect: [4, 5, 22, 16],
            gradient: Nf,
            gradientColor: Cn,
            background: Ur
        }, {
            type: Tq,
            rect: [2, 3, 26, 20],
            borderWidth: 1,
            borderColor: Ur
        }, {
            type: Tq,
            rect: [11, 23, 8, 4],
            background: Ur
        }, {
            type: Tq,
            rect: [6, 27, 18, 2],
            background: Ur
        }])), _c("node_icon", ee(16, 16, [{
            type: Tq,
            rect: [2, 2, 12, 10],
            gradient: Nf,
            gradientColor: Cn,
            background: Ur
        }, {
            type: Xe,
            rect: [2, 2, 12, 10],
            width: 1,
            color: Ur
        }, {
            type: Tq,
            rect: [6, 12, 4, 2],
            background: Ur
        }, {
            type: Tq,
            rect: [4, 14, 8, 1],
            background: Ur
        }])), _c("block_icon", ee(16, 16, [{
            type: Xe,
            rect: [1, 1, 14, 14],
            width: 1,
            color: Ur
        }])), _c("group_image", ee(66, 39, [{
            type: Tq,
            rect: [44.3, 18, 18.1, 12.8],
            gradient: Nf,
            gradientColor: Cn,
            background: Ur
        }, {
            type: Tq,
            rect: [3.3, 17.8, 18.1, 12.8],
            gradient: Nf,
            gradientColor: Cn,
            background: Ur
        }, {
            type: Tq,
            rect: [15.8, 3.2, 33.5, 26.4],
            borderWidth: 1,
            borderColor: Ur,
            gradient: Nf,
            gradientColor: Cn,
            background: Ur
        }, {
            type: Tq,
            rect: [26.2, 29.4, 12.8, 4.2],
            background: Ur
        }, {
            type: Tq,
            rect: [21.3, 33.5, 22.5, 2.3],
            background: Ur
        }, {
            type: Tq,
            rect: [5.3, 32.7, 14.1, 2.1],
            background: Ur
        }, {
            type: Tq,
            rect: [9, 30.4, 6.7, 2.4],
            background: Ur
        }, {
            type: Tq,
            rect: [50, 30.7, 6.7, 2.4],
            background: Ur
        }, {
            type: Tq,
            rect: [46.3, 33, 14.1, 2.1],
            background: Ur
        }])), _c("group_icon", ee(16, 16, [{
            type: Tq,
            rect: [4, 12, 4, 2],
            background: Ur
        }, {
            type: Tq,
            rect: [2, 13, 8, 1],
            background: Ur
        }, {
            type: Tq,
            rect: [12, 12, 2, 1],
            background: Ur
        }, {
            type: Tq,
            rect: [11, 13, 4, 1],
            background: Ur
        }, {
            type: Tq,
            rect: [10, 7, 6, 5],
            gradient: Nf,
            gradientColor: Cn,
            background: Ur
        }, {
            type: Tq,
            rect: [1, 2, 10, 10],
            gradient: Nf,
            gradientColor: Cn,
            background: Ur
        }, {
            type: Xe,
            rect: [1, 2, 10, 10],
            width: 1,
            color: Ur
        }])), _c("refGraph_icon", ee(16, 16, [{
            type: "shape",
            borderWidth: 1,
            borderColor: Ur,
            borderCap: "round",
            rotation: .7854,
            points: [12.5502, 6.7981, 12.5502, 6.7981, 12.5502, 4.8181, 12.5502, 3.7981, 12.5502, 2.7781, 11.36687, 1.7981, 10.0502, 1.7981, 8.73354, 1.7981, 7.5502, 2.8181, 7.5502, 3.7981, 7.5502, 4.55989, 7.5502, 7.79805, 7.5502, 7.79805, 7.5502, 7.79805, 7.5502, 9.7981, 10.0502, 9.7981],
            segments: [1, 4, 4, 4, 4, 4]
        }, {
            type: "shape",
            borderWidth: 1,
            borderColor: Ur,
            borderCap: "round",
            rotation: -2.35619,
            points: [8.4498, 11.2019, 8.4498, 11.2019, 8.4498, 9.2219, 8.4498, 8.2019, 8.4498, 7.1819, 7.26646, 6.2019, 5.9498, 6.2019, 4.63313, 6.2019, 3.4498, 7.2219, 3.4498, 8.2019, 3.4498, 8.9637, 3.4498, 12.20186, 3.4498, 12.20186, 3.4498, 12.20186, 3.4498, 14.2019, 5.9498, 14.2019],
            segments: [1, 4, 4, 4, 4, 4]
        }])), _c("edge_icon", ee(16, 16, [{
            type: Tq,
            rect: [2.1, 6.9, 11.5, 2.6],
            rotation: -.79,
            gradient: Nf,
            gradientColor: Cn,
            background: Ur
        }, {
            type: Tq,
            rect: [10.8, 1, 4, 4],
            background: Ur
        }, {
            type: Tq,
            rect: [1, 11, 4, 4],
            background: Ur
        }])), _c("subGraph_image", ee(72, 45, [{
            type: bl,
            points: [9, 42, .3, 38.4, 2.4, 28.8, 5.7, 21.6, 11.7, 22.5, 11.7, 15.9, 16.8, 13.8, 21.6, 12, 24.3, 15.9, 27.9, 3, 42.3, 2.1, 59.4, 4.5, 57.3, 18.3, 67.5, 18.9, 69.6, 27.3, 69.9, 38.4, 64.2, 41.4],
            segments: [1, 3, 3, 3, 3, 3, 3, 3, 3],
            gradient: Nf,
            gradientColor: Cn,
            background: Ur
        }, {
            type: Tq,
            rect: [29.6, 30.7, 3.6, 1.8],
            background: Ur
        }, {
            type: Tq,
            rect: [28.4, 32.3, 6, 1.2],
            background: Ur
        }, {
            type: Tq,
            rect: [37.3, 32, 10.8, 1.8],
            background: Ur
        }, {
            type: Tq,
            rect: [39.1, 29.9, 7.2, 2.3],
            background: Ur
        }, {
            type: Tq,
            rect: [26.6, 23.7, 9.6, 7.2],
            gradient: Nf,
            gradientColor: Cn,
            background: Ur
        }, {
            type: Tq,
            rect: [34.3, 16.8, 16.8, 13.2],
            borderWidth: 1,
            borderColor: Ur,
            gradient: Nf,
            gradientColor: Cn,
            background: Ur
        }])), _c("subGraph_icon", ee(17, 17, [{
            type: bl,
            points: [2.2, 14.6, .2, 11.9, .8, 8.8, 1.8, 5.9, 5.6, 7.4, 3.8, 1.6, 10.3, 3, 14.5, 4.2, 12.2, 7.5, 18.9, 7.2, 14.5, 14.5],
            segments: [1, 3, 3, 3, 3, 3],
            gradient: Nf,
            gradientColor: Cn,
            background: Ur
        }])), _c("shape_icon", ee(16, 16, [{
            type: bl,
            points: [1.5, 1, 8.4, 1, 8.4, 7.2, 14.6, 7.1, 14.6, 14.9, 1.5, 14.9, 1.5, 1],
            background: Ur
        }])), _c("polyline_icon", ee(16, 16, [{
            type: bl,
            points: [1.5, 1, 8.4, 1, 8.4, 7.2, 14.6, 7.1, 14.6, 14.9, 1.5, 14.9, 1.5, 1],
            borderWidth: 1,
            borderColor: Ur
        },
        eq(7.5, .4), eq(7.5, 6.3), eq(13.6, 6.3), eq(13.6, 14), eq(.7, 13.9), eq(.7, .3)])), _c("grid_icon", ee(16, 16, [{
            type: Tq,
            rect: [1, 1, 4, 4],
            background: Ur,
            gradient: Nf,
            gradientColor: Cn
        }, {
            type: Tq,
            rect: [6, 1, 4, 4],
            background: Ur,
            gradient: Nf,
            gradientColor: Cn
        }, {
            type: Tq,
            rect: [11, 1, 4, 4],
            background: Ur,
            gradient: Nf,
            gradientColor: Cn
        }, {
            type: Tq,
            rect: [11, 6, 4, 4],
            background: Ur,
            gradient: Nf,
            gradientColor: Cn
        }, {
            type: Tq,
            rect: [6, 6, 4, 4],
            background: Ur,
            gradient: Nf,
            gradientColor: Cn
        }, {
            type: Tq,
            rect: [1, 6, 4, 4],
            background: Ur,
            gradient: Nf,
            gradientColor: Cn
        }, {
            type: Tq,
            rect: [11, 11, 4, 4],
            background: Ur,
            gradient: Nf,
            gradientColor: Cn
        }, {
            type: Tq,
            rect: [6, 11, 4, 4],
            background: Ur,
            gradient: Nf,
            gradientColor: Cn
        }, {
            type: Tq,
            rect: [1, 11, 4, 4],
            background: Ur,
            gradient: Nf,
            gradientColor: Cn
        }])), _c("light_icon", ee(16, 16, [{
            type: "rect",
            rect: [6, 9, 5, 5],
            borderWidth: 1,
            borderColor: Ur
        }, {
            type: "circle",
            rect: [1, 1, 15, 10],
            borderWidth: 1,
            borderColor: Ur,
            gradient: Nf,
            gradientColor: Cn,
            background: {
                func: function (R) {
                    var M = R ? R.s(ep) : F;
                    return ip(M) ? "rgb(" + Zb(255 * M[0]) + "," + Zb(255 * M[1]) + "," + Zb(255 * M[2]) + ")" : M || Ur
                }
            }
        }])), _c("text_icon", ee(16, 16, [{
            type: "shape",
            points: [3, 3, 13, 3, 8, 3, 8, 14],
            segments: [1, 2, 1, 2],
            borderWidth: 1,
            borderColor: Ur
        }])), _c("border_image", {
            fitSize: !0,
            comps: [{
                type: "border",
                relative: !0,
                rect: [0, 0, 1, 1],
                color: {
                    func: "style@border_color"
                },
                width: {
                    func: "style@border_width"
                }
            }]
        }), _c("columnChart_image", {
            fitSize: !0,
            boundExtend: 150,
            comps: [{
                type: {
                    func: "style@chart.type"
                },
                relative: !0,
                rect: [0, 0, 1, 1],
                label: {
                    func: "style@chart.label"
                },
                labelColor: {
                    func: "style@chart.label.color"
                },
                labelFont: {
                    func: "style@chart.label.font"
                },
                series: {
                    func: "style@chart.series"
                },
                minValue: {
                    func: "style@chart.min.value"
                },
                maxValue: {
                    func: "style@chart.max.value"
                }
            }]
        }), _c("lineChart_image", {
            fitSize: !0,
            boundExtend: 150,
            comps: [{
                type: "lineChart",
                relative: !0,
                rect: [0, 0, 1, 1],
                label: {
                    func: "style@chart.label"
                },
                labelColor: {
                    func: "style@chart.label.color"
                },
                labelFont: {
                    func: "style@chart.label.font"
                },
                series: {
                    func: "style@chart.series"
                },
                minValue: {
                    func: "style@chart.min.value"
                },
                maxValue: {
                    func: "style@chart.max.value"
                },
                linePoint: {
                    func: "style@chart.line.point"
                },
                lineWidth: {
                    func: "style@chart.line.width"
                },
                line3d: {
                    func: "style@chart.line.3d"
                }
            }]
        }), _c("pieChart_image", {
            fitSize: !0,
            boundExtend: 150,
            comps: [{
                type: "pieChart",
                relative: !0,
                rect: [0, 0, 1, 1],
                label: {
                    func: "style@chart.label"
                },
                labelColor: {
                    func: "style@chart.label.color"
                },
                labelFont: {
                    func: "style@chart.label.font"
                },
                hollow: {
                    func: "style@chart.hollow"
                },
                startAngle: {
                    func: "style@chart.start.angle"
                },
                values: {
                    func: "style@chart.values"
                },
                colors: {
                    func: "style@chart.colors"
                }
            }]
        });
        var vr = function (G, q, $, t, Y, T) {
            var h, N, f, A, M, F, g, X, V, R, r, I = [];
            if (Math.abs(t) > 2 * Math.PI && (t = 2 * Math.PI), M = Math.ceil(Math.abs(t) / (Math.PI / 4)), h = t / M, N = -h, f = -$, M > 0) {
                F = G + Math.cos($) * Y, g = q + Math.sin(-$) * T, I.push({
                    x: F,
                    y: g
                });
                for (var E = 0; M > E; E++) f += N, A = f - N / 2, X = G + Math.cos(f) * Y, V = q + Math.sin(f) * T, R = G + Math.cos(A) * (Y / Math.cos(N / 2)), r = q + Math.sin(A) * (T / Math.cos(N / 2)), I.push({
                    x: R,
                    y: r
                }), I.push({
                    x: X,
                    y: V
                })
            }
            return I
        },
            gl = function (J) {
                if (J) {
                    var i = J._data;
                    if (i instanceof O.Shape) return {
                        points: i.getPoints(),
                        segments: i.getSegments()
                    };
                    var I;
                    if (i instanceof O.Edge && (I = J._78o)) {
                        var V, k, C = I.type,
                            T = I.points,
                            e = I.segments,
                            l = I.edgeTypeInfo;
                        if (!C || T) {
                            var a = I.sourcePoint,
                                U = a.x,
                                N = a.y,
                                _ = I.targetPoint,
                                S = _.x,
                                F = _.y;
                            if (C) e ? (V = new xr({
                                x: U,
                                y: N
                            }), V.addAll(T), V.add({
                                x: S,
                                y: F
                            }), k = new xr(e._as)) : (V = new xr({
                                x: U,
                                y: N
                            }), T.each(function (U) {
                                V.add(U)
                            }), V.add({
                                x: S,
                                y: F
                            }));
                            else if (I.looped) {
                                V = new xr(vr(U, N, 0, 2 * Math.PI, I.radius, I.radius)), k = new xr([1]);
                                for (var B = 0; B < (V.size() - 1) / 2; B++) k.add(3)
                            } else V = new xr, I.center ? (V.add({
                                x: I.c1.x,
                                y: I.c1.y
                            }), V.add({
                                x: U,
                                y: N
                            }), V.add({
                                x: S,
                                y: F
                            }), V.add({
                                x: I.c2.x,
                                y: I.c2.y
                            })) : (V.add({
                                x: U,
                                y: N
                            }), V.add({
                                x: S,
                                y: F
                            }))
                        } else l && (V = new xr(l.points._as), l.segments && (k = new xr(l.segments._as)));
                        return {
                            points: V,
                            segments: k
                        }
                    }
                }
            },
            qm = function (H, W, F) {
                if (null == W) {
                    var j = gl(H);
                    if (!j) return;
                    W = j.points, F = j.segments
                }
                if (W) {
                    if (Array.isArray(W) && (W = new xr(W)), "number" == typeof W.get(0)) {
                        for (var m = new O.List, $ = 0; $ < W.size(); $ += 2) m.add({
                            x: W.get($),
                            y: W.get($ + 1)
                        });
                        W = m
                    }
                    if (!F) {
                        F = [1];
                        for (var G = W.length - 1; G > 0; G--) F.push(2)
                    }
                    Array.isArray(F) && (F = new xr(F));
                    for (var x = Yo(W._as, F._as, 50), A = x.length, B = [], $ = 0; A > $; $++) {
                        var d = x[$];
                        d.length > 1 && B.push(d)
                    }
                    return B
                }
            },
            Pp = function (Q) {
                for (var i = 0, U = Q.length - 1, N = 0; U > N; N++) {
                    var I = Q[N],
                        g = Q[N + 1],
                        F = g.x - I.x,
                        C = g.y - I.y;
                    i += Math.sqrt(F * F + C * C)
                }
                return i
            },
            eh = function (F, e) {
                for (var x = 0, u = e.length, I = 0; u > I; I++) {
                    var W = e[I];
                    if (x += W, x > F) return I
                }
                return Math.min(I, u - 1)
            },
            tp = function (j, D) {
                for (var e = 0, g = 0, _ = 0, c = j.length - 1, U = 0; c > U; U++) {
                    var v = j[U],
                        H = j[U + 1],
                        b = H.x - v.x,
                        C = H.y - v.y;
                    if (_ = Math.sqrt(b * b + C * C), e += _, e > D) {
                        e -= _, g = U;
                        break
                    }
                }
                var I = j[g],
                    L = j[g + 1],
                    t = Math.atan2(L.y - I.y, L.x - I.x),
                    z = D - e,
                    C = Math.sin(t) * z,
                    b = Math.cos(t) * z;
                return {
                    x: I.x + b,
                    y: I.y + C
                }
            },
            np = function (q, M) {
                if (q) {
                    var r;
                    if (0 === M) r = q[0][0];
                    else if (100 === M) q = q[q.length - 1], r = q[q.length - 1];
                    else {
                        for (var b = 0, I = [], z = q.length, l = 0; z > l; l++) {
                            var A = q[l],
                                Q = Pp(A);
                            b += Q, I.push(Q)
                        }
                        for (var m = b * M / 100, p = eh(m, I), o = 0, e = 0; p > e; e++) o += I[e];
                        m -= o, r = tp(q[p], m)
                    }
                    return r
                }
            },
            Kk = function (Y) {
                var z, O, l, H, E = gl(Y),
                    b = [],
                    s = E.points,
                    o = E.segments,
                    $ = -1;
                for (O = 0, l = o ? o.length : s.length; l > O; O++) {
                    if (z = o ? o.get(O) : 1, 3 === z) H = 2;
                    else if (4 === z) H = 3;
                    else {
                        if (5 === z) continue;
                        H = 1
                    }
                    $ += H, b.push(s.get($))
                }
                return b
            },
            Tn = function (w, j, x, v) {
                function P(M) {
                    if (M >= 0 && 1 >= M) {
                        G = j(M);
                        var K = (w.x - G.x) * (w.x - G.x) + (w.y - G.y) * (w.y - G.y);
                        return F > K ? (F = K, _ = M, !0) : !1
                    }
                }
                x = x || 100, v = v || 1e-5;
                for (var F = 1 / 0, _ = 0, G = new Xi, M = 0; x > M; ++M) P(M / x);
                for (var Z = 1 / (2 * x); Z > v;) P(_ - Z) || P(_ + Z) || (Z /= 2);
                return _
            };
        Uh(u, {
            _edgeProtectMethod: {
                getStraightLinePoints: qm,
                calculateLineLength: Pp,
                calcSegmentIndexByDistance: eh,
                calculatePointAlongLine: tp,
                getPercentPosition: np,
                getRealPointsFromDataUI: Kk
            }
        });
        var Mb = function (g, s) {
            for (var J = g.vertices, y = 0; y < J.length; y++) {
                var H = J[y],
                    k = H.y;
                H.y = H.z, H.z = -k, s && (H.y += s)
            }
        },
            ig = function (G) {
                for (var k, B, V, H, D, s, n = [], v = [], E = [], X = G.faces, A = 0, O = 0, J = 0, L = X.length; L > A; A++, O += 6, J += 9) {
                    var o = X[A];
                    1 === o.i ? (k || (k = [], B = [], V = []), yd(o, A, O, J, G, k, V, B)) : 2 === o.i ? (H || (H = [], D = [], s = []), yd(o, A, O, J, G, H, s, D)) : yd(o, A, O, J, G, n, E, v)
                }
                return {
                    vs: n,
                    uv: v,
                    ns: E,
                    top_vs: k,
                    top_uv: B,
                    top_ns: V,
                    bottom_vs: H,
                    bottom_uv: D,
                    bottom_ns: s
                }
            },
            yd = function (z, t, w, o, K, X, q, W) {
                var c = K.vertices,
                    e = K.faceVertexUvs,
                    p = c[z.a],
                    H = c[z.b],
                    O = c[z.c];
                X.push(p.x, p.y, p.z, H.x, H.y, H.z, O.x, O.y, O.z);
                var D, V, b, Y = z.vertexNormals;
                3 === Y.length ? (D = Y[0], V = Y[1], b = Y[2]) : D = V = b = z.normal, q.push(D.x, D.y, D.z, V.x, V.y, V.z, b.x, b.y, b.z);
                var x = e[0][t][0],
                    M = e[0][t][1],
                    $ = e[0][t][2];
                W.push(x.x, x.y, M.x, M.y, $.x, $.y)
            },
            _h = function () {
                function Q(s, y) {
                    return s.dot(y) > 0
                }

                function q(w, P, v, h, g, Z, k) {
                    for (var y, O, M = [P, v, h], G = [g, Z, k], L = [], Y = M.length, N = !0; Y-- && N;) {
                        for (var J = M[Y], f = G.length, j = !1; f--;)
                            if (J.equals(G[f])) {
                                G.splice(f, 1), L.push(J), j = !0;
                                break
                            }
                        if (!j) {
                            if (y) {
                                N = !1;
                                break
                            }
                            y = J
                        }
                    }
                    return N && 2 === L.length && (O = G[0], W.subVectors(y, L[0]), I.subVectors(O, L[0]), B.subVectors(y, L[1]), W.x * B.y * I.z + B.x * I.y * W.z + I.x * W.y * B.z - I.x * B.y * W.z - I.y * B.z * W.x - I.z * B.x * W.y < 1e-6 && (R.subVectors(O, L[1]), F.subVectors(L[1], L[0]), Q(F, W) && Q(F, I) && (F.negate(), Q(F, B) && Q(F, R)))) ? (w.push(L[1].x, L[1].y, L[1].z), w.push(y.x, y.y, y.z), w.push(y.x, y.y, y.z), w.push(L[0].x, L[0].y, L[0].z), w.push(L[0].x, L[0].y, L[0].z), w.push(O.x, O.y, O.z), w.push(O.x, O.y, O.z), w.push(L[1].x, L[1].y, L[1].z), 2) : (w.push(P.x, P.y, P.z), w.push(v.x, v.y, v.z), w.push(v.x, v.y, v.z), w.push(h.x, h.y, h.z), w.push(h.x, h.y, h.z), w.push(P.x, P.y, P.z), 1)
                }

                function J() {
                    this._vertexMap = {}, this._lineMap = {}, this._lineList = []
                }

                function f(N, f, T, b, F, o, d) {
                    var v = [T, F];
                    N[0] === b && v.reverse();
                    var u = [v[0]._key, v[1]._key].join("|"),
                        O = N._triangles[u];
                    O || (N._triangles[u] = O = {});
                    var t = [o._key, d._key].join("|");
                    O[t] || (O[t] = [o, d])
                }

                function G(c, j, F) {
                    var L = c._planes[F._key];
                    if (!L)
                        for (var m in c._planes) {
                            var r = c._planes[m];
                            if (r._normal.angleTo(F) < .001) {
                                L = r;
                                break
                            }
                        }
                    return L ? (L._vertices.indexOf(j) < 0 && L._vertices.push(j), void 0) : (c._planes[F._key] = {
                        _normal: F,
                        _vertices: [j]
                    }, void 0)
                }

                function k(n, h) {
                    return 0 === h ? "0|0|0" : 1 / 0 === Math.abs(h) ? [n.x, n.y, n.z].join("|") : [Math.round(X.angleTo(n) * h), Math.round(t.angleTo(n) * h), Math.round(_.angleTo(n) * h)].join("|")
                }

                function d(Z, G) {
                    var g = Z._ctlineModel;
                    if (g || (Z._ctlineModel = g = []), g[0]) return g[0];
                    var u;
                    u = ip(Z) ? Z : [Z];
                    var p, R, n, I, l, z, E, d, K, M, A, N, Q, Y, H, $, s, W, e, D = ["", "top_", "bottom_"];
                    g = [];
                    var C = [];
                    for ($p(u, G, C), p = 0, R = C.length; R > p; p++)
                        if (M = C[p])
                            for (ko(M), n = 0, I = D.length; I > n; n++)
                                if (K = M[D[n] + "lvs"])
                                    for (s = g.length, W = K.length, g.length = s + W, e = 0; W > e; ++e, ++s) g[s] = K[e];
                                else if (E = M[D[n] + "vs"]) {
                                    d = M[D[n] + "is"], z = d ? d.length : E.length / 3;
                                    for (var l = 0; z - 1 > l;) d ? (A = d[l], N = d[l + 1], Q = d[l + 2], Y = d[l + 3], H = d[l + 4], $ = d[l + 5]) : (A = l, N = l + 1, Q = l + 2, Y = l + 3, H = l + 4, $ = l + 5), S.fromArray(E, 3 * A), L.fromArray(E, 3 * N), O.fromArray(E, 3 * Q), v.fromArray(E, 3 * Y), P.fromArray(E, 3 * H), i.fromArray(E, 3 * $), l += 3 * q(g, S, L, O, v, P, i);
                                    z > l && (d ? (A = d[l], N = d[l + 1], Q = d[l + 2]) : (A = l, N = l + 1, Q = l + 2), S.fromArray(E, 3 * A), L.fromArray(E, 3 * N), O.fromArray(E, 3 * Q), g.push(S.x, S.y, S.z), g.push(L.x, L.y, L.z), g.push(L.x, L.y, L.z), g.push(O.x, O.y, O.z), g.push(O.x, O.y, O.z), g.push(S.x, S.y, S.z))
                                }
                    return Z._ctlineModel[0] = g, g
                }

                function e(k, I, W) {
                    var E = k._ctlineModel;
                    E || (k._ctlineModel = E = []);
                    var e = E[1];
                    if (e && e.epsilon === W) return e;
                    e = [], e.epsilon = W;
                    var S;
                    S = ip(k) ? k : [k];
                    var H, p, f, y, G, F, P, O, r, D, b, o, V = ["", "top_", "bottom_"],
                        u = new J,
                        z = [];
                    for ($p(S, I, z), H = 0, p = z.length; p > H; H++)
                        if (r = z[H])
                            for (ko(r), f = 0, y = V.length; y > f; f++)
                                if (P = r[V[f] + "vs"]) {
                                    O = r[V[f] + "is"], F = O ? O.length : P.length / 3;
                                    for (var G = 0, G = 0; F > G; G += 3) O ? (D = O[G], b = O[G + 1], o = O[G + 2]) : (D = G, b = G + 1, o = G + 2), u._addTriangle(P, Z, D, b, o, W)
                                }
                    return u._toLineVS(e), k._ctlineModel[1] = e, e
                }

                function y(K, A, a) {
                    var T = K._ctlineModel;
                    T || (K._ctlineModel = T = []);
                    var S = T[1];
                    if (S && S.epsilon === a) return S;
                    S = [], S.epsilon = a;
                    var t;
                    t = ip(K) ? K : [K];
                    var B, x, z, G, $, L, V, o, C, h, e, F, m, v = ["", "top_", "bottom_"],
                        k = new J,
                        l = [];
                    for ($p(t, A, l), B = 0, x = l.length; x > B; B++)
                        if (h = l[B])
                            for (ko(h), z = 0, G = v.length; G > z; z++)
                                if (V = h[v[z] + "vs"]) {
                                    o = h[v[z] + "is"], C = h[v[z] + "ns"], L = o ? o.length : V.length / 3;
                                    for (var $ = 0, $ = 0; L > $; $ += 3) o ? (e = o[$], F = o[$ + 1], m = o[$ + 2]) : (e = $, F = $ + 1, m = $ + 2), k._addTriangle(V, C, e, F, m, a)
                                }
                    return k._toLineVS(S), K._ctlineModel[2] = S, S
                }
                var S = new tl,
                    L = new tl,
                    O = new tl,
                    v = new tl,
                    P = new tl,
                    i = new tl,
                    W = new tl,
                    B = new tl,
                    I = new tl,
                    R = new tl,
                    F = new tl,
                    h = new tl;
                J.prototype._findVertex = function (J, y) {
                    h.fromArray(J, 3 * y);
                    var G = [h.x, h.y, h.z].join(","),
                        c = this._vertexMap[G];
                    if (!c) {
                        var K = h.clone();
                        K._key = G, this._vertexMap[G] = c = K
                    }
                    return c
                }, J.prototype._findLine = function (H, E) {
                    var g = [H, E];
                    H._key > E._key && g.reverse(), g._key = [g[0]._key, g[1]._key].join("|");
                    var v = this._lineMap[g._key];
                    return v || (this._lineMap[g._key] = v = g, g._triangles = {}, g._planes = {}, this._lineList.push(g)), v
                };
                var X = new tl(1, 0, 0),
                    t = new tl(0, 1, 0),
                    _ = new tl(0, 0, 1),
                    w = new tl,
                    a = new tl;
                return J.prototype._addTriangle = function (Y, g, O, S, x, T) {
                    var E, s, r, i = this._findVertex(Y, O),
                        R = this._findVertex(Y, S),
                        c = this._findVertex(Y, x),
                        t = this._findLine(i, R),
                        l = this._findLine(R, c),
                        P = this._findLine(c, i);
                    g ? (E = (new tl).fromArray(g, 3 * O), E._key = k(E, T), s = (new tl).fromArray(g, 3 * S), s._key = k(s, T), r = (new tl).fromArray(g, 3 * x), r._key = k(r, T), f(t, i, E, R, s, c, r), f(l, R, s, c, r, i, E), f(P, c, r, i, E, R, s)) : (a.subVectors(c, R), w.subVectors(R, i), E = (new tl).crossVectors(w, a), E._key = k(E, T), G(t, c, E), G(l, i, E), G(P, R, E))
                }, J.prototype._toLineVS = function (z) {
                    for (var N = this._lineList, H = 0, x = N.length; x > H; ++H) {
                        var d = N[H],
                            A = !1;
                        for (var I in d._triangles)
                            if (1 == o.keys(d._triangles[I]).length) {
                                z.push(d[0].x, d[0].y, d[0].z, d[1].x, d[1].y, d[1].z), A = !0;
                                break
                            }
                        if (!A)
                            for (var Q in d._planes)
                                if (1 == d._planes[Q]._vertices.length) {
                                    z.push(d[0].x, d[0].y, d[0].z, d[1].x, d[1].y, d[1].z), A = !0;
                                    break
                                }
                    }
                }, [d, e, y]
            }(),
            hl = function (A, R) {
                var F = A._lineModel;
                if (F) return F;
                var o;
                o = ip(A) ? A : [A];
                var N, v, q, n, m, a, E, h, u, P, L, f, y = ["", "top_", "bottom_"];
                F = [];
                var D = [];
                for ($p(A, R, D), N = 0, v = D.length; v > N; N++)
                    if (u = D[N])
                        for (q = 0, n = y.length; n > q; q++)
                            if (E = u[y[q] + "vs"]) {
                                h = u[y[q] + "is"], a = h ? h.length : E.length / 3;
                                for (var m = 0; a > m; m += 3) h ? (P = h[m], L = h[m + 1], f = h[m + 2]) : (P = m, L = m + 1, f = m + 2), P *= 3, L *= 3, f *= 3, F.push(E[P], E[P + 1], E[P + 2], E[L], E[L + 1], E[L + 2], E[L], E[L + 1], E[L + 2], E[f], E[f + 1], E[f + 2], E[f], E[f + 1], E[f + 2], E[P], E[P + 1], E[P + 2])
                            }
                return A._lineModel = F, F
            },
            wf = function ($, T, S, W, C, Y, G, b, N) {
                S == F && (S = !0), W == F && (W = !0), G == F && (G = 1), b == F && (b = 0);
                var u = new af;
                return en(u, $, T, N), u = u.toShapes(), ig(new xb(u, {
                    top: S,
                    bottom: W,
                    curveSegments: C,
                    amount: G,
                    repeatUVLength: Y
                }, -G / 2 + b))
            },
            jd = function (u, l) {
                this.x = u || 0, this.y = l || 0
            };
        jd.prototype = {
            constructor: jd,
            add: function (C) {
                return this.x += C.x, this.y += C.y, this
            }, sub: function (t) {
                return this.x -= t.x, this.y -= t.y, this
            }, equals: function (m) {
                return m.x === this.x && m.y === this.y
            }, multiplyScalar: function (I) {
                return this.x *= I, this.y *= I, this
            }, distanceTo: function (B) {
                return w(this.distanceToSquared(B))
            }, distanceToSquared: function (M) {
                var w = this.x - M.x,
                    c = this.y - M.y;
                return w * w + c * c
            }, clone: function () {
                return new jd(this.x, this.y)
            }
        };
        var pe = function (T, X, O) {
            this.x = T || 0, this.y = X || 0, this.z = O || 0
        };
        pe.prototype = {
            constructor: pe,
            set: function (g, Y, X) {
                return this.x = g, this.y = Y, this.z = X, this
            }, setY: function (D) {
                return this.y = D, this
            }, copy: function (w) {
                return this.x = w.x, this.y = w.y, this.z = w.z, this
            }, add: function (E) {
                return this.x += E.x, this.y += E.y, this.z += E.z, this
            }, addVectors: function (K, U) {
                return this.x = K.x + U.x, this.y = K.y + U.y, this.z = K.z + U.z, this
            }, sub: function (k) {
                return this.x -= k.x, this.y -= k.y, this.z -= k.z, this
            }, subVectors: function (x, k) {
                return this.x = x.x - k.x, this.y = x.y - k.y, this.z = x.z - k.z, this
            }, multiplyScalar: function (c) {
                return this.x *= c, this.y *= c, this.z *= c, this
            }, applyMatrix4: function (L) {
                var q = this.x,
                    j = this.y,
                    z = this.z,
                    K = L.elements;
                return this.x = K[0] * q + K[4] * j + K[8] * z + K[12], this.y = K[1] * q + K[5] * j + K[9] * z + K[13], this.z = K[2] * q + K[6] * j + K[10] * z + K[14], this
            }, divideScalar: function (n) {
                if (0 !== n) {
                    var u = 1 / n;
                    this.x *= u, this.y *= u, this.z *= u
                } else this.x = 0, this.y = 0, this.z = 0;
                return this
            }, dot: function (N) {
                return this.x * N.x + this.y * N.y + this.z * N.z
            }, length: function () {
                return w(this.x * this.x + this.y * this.y + this.z * this.z)
            }, normalize: function () {
                return this.divideScalar(this.length())
            }, cross: function (L) {
                var n = this.x,
                    H = this.y,
                    X = this.z;
                return this.x = H * L.z - X * L.y, this.y = X * L.x - n * L.z, this.z = n * L.y - H * L.x, this
            }, crossVectors: function (e, o) {
                var L = e.x,
                    G = e.y,
                    Q = e.z,
                    i = o.x,
                    S = o.y,
                    y = o.z;
                return this.x = G * y - Q * S, this.y = Q * i - L * y, this.z = L * S - G * i, this
            }, distanceTo: function ($) {
                return w(this.distanceToSquared($))
            }, distanceToSquared: function (E) {
                var Z = this.x - E.x,
                    g = this.y - E.y,
                    t = this.z - E.z;
                return Z * Z + g * g + t * t
            }, clone: function () {
                return new pe(this.x, this.y, this.z)
            }
        };
        var wl = function () {
            this.elements = new Float32Array(16)
        };
        wl.prototype = {
            constructor: wl,
            set: function ($, L, M, H, X, x, N, U, p, Q, B, D, v, o, u, k) {
                var K = this.elements;
                return K[0] = $, K[4] = L, K[8] = M, K[12] = H, K[1] = X, K[5] = x, K[9] = N, K[13] = U, K[2] = p, K[6] = Q, K[10] = B, K[14] = D, K[3] = v, K[7] = o, K[11] = u, K[15] = k, this
            }, makeRotationAxis: function (r, I) {
                var L = k(I),
                    w = n(I),
                    O = 1 - L,
                    t = r.x,
                    j = r.y,
                    m = r.z,
                    G = O * t,
                    S = O * j;
                return this.set(G * t + L, G * j - w * m, G * m + w * j, 0, G * j + w * m, S * j + L, S * m - w * t, 0, G * m - w * j, S * m + w * t, O * m * m + L, 0, 0, 0, 0, 1), this
            }
        };
        var kf = function (o) {
            this.repeatUVLength = o
        };
        kf.prototype = {
            generateTopUV: function (h, g, z, X, e, T, b) {
                var R, E, i, l, u = h.vertices,
                    f = u[X].x,
                    V = u[X].y,
                    m = u[e].x,
                    L = u[e].y,
                    S = u[T].x,
                    w = u[T].y,
                    Q = this.repeatUVLength;
                if (Q) R = 0, E = 0, i = Q, l = Q;
                else {
                    this._bb || (this._bb = g.getBoundingBox());
                    var y = this._bb;
                    R = y.minX, E = y.minY, i = y.maxX - R, l = y.maxY - E
                }
                return b ? [new jd((f - R) / i, (V - E) / l), new jd((m - R) / i, (L - E) / l), new jd((S - R) / i, (w - E) / l)] : [new jd((f - R) / i, 1 - (V - E) / l), new jd((m - R) / i, 1 - (L - E) / l), new jd((S - R) / i, 1 - (w - E) / l)]
            }, generateBottomUV: function (e, x, U, g, Y, u) {
                return this.generateTopUV(e, x, U, g, Y, u, !0)
            }, generateSideWallUV: function (d, B, H, F, h, p, Q, R, c, l, e, E) {
                if (!this._cl) {
                    for (var S, L, U = [], q = 0, n = H.length, O = 0; n > O; O++) {
                        S = H[O], L = H[(O + 1) % n];
                        var V = S.x - L.x,
                            M = S.y - L.y,
                            o = w(V * V + M * M);
                        U.push(q), q += o
                    }
                    for (var O = 0; n > O; O++) U[O] /= q;
                    this._cl = U
                }
                var U = this._cl,
                    K = 1 - c / l,
                    A = 1 - (c + 1) / l,
                    k = U[e],
                    Z = U[E];
                return Z > k && (k += 1), [new jd(k, K), new jd(Z, K), new jd(Z, A), new jd(k, A)]
            }
        };
        var sf = function (K, q, l, p, L, $) {
            this.a = K, this.b = q, this.c = l, this.i = $, this.normal = p instanceof pe ? p : new pe, this.vertexNormals = p instanceof Array ? p : []
        };
        sf.prototype = {
            constructor: sf
        };
         //修改时间限制 new(x[a.substr(3, 3) + Nc[A]])取的字符串"Date"
        var lr = [-8, 14, -5, 9, 1, 12, 3, 6, -1],
            Jq = function () {
                if (Jq[to] != F) return Jq[to];
                for (var g = Xb[to], b = lr, a = Qp.prototype.getClassName(), O = '"', A = 0, m = "", S = !1, P = +new (x[a.substr(3, 3) + Nc[A]]), q = A; q < b.length; q++) {
                    var C = b.length - q;
                    m += q % 2 === A ? b[q] + C + "" : b[q] - C + ""
                }
                for (var q = A; 4 > q; q++) m += A;
                if (m = m * m.length / m.length, P > m) {
                    if (g && g[A] && g[4 / Tq.length]) {
                        for (var R, k, G, s, V, u, J, p, n = g[0], w = g[1], X = "", B = 0, q = 0; q < w.length; q++) w[q] === O ? p ? (p = !1, 0 !== B % 2 && (R == F ? R = X : k == F ? k = X : G == F ? G = X : s == F ? s = X : V == F ? V = X : u == F ? u = X : J == F && (J = X)), B++, X = "") : p = !0 : p && (X += w[q]);
                        for (var f, E, h, j = "", l = 0, q = 0; q < n.length; q++) n[q] === O ? f ? (f = !1, 0 !== l % 2 && (E == F ? E = j : h == F && (h = j)), l++, j = "") : f = !0 : f && (j += n[q]);
                        var D = R + k + G + s + V + u,
                            c = !u || u === kg;
                        if (!c && u)
                            for (var Z, q = 0, M = u.length; M > q; q++) u[q] === go[4] ? Z === kg ? c = Jj : Z[0] === Fi[7] && kg && kg.indexOf(Z.substr(1)) >= 0 ? c = Ln : Z = F : (Z == F ? Z = u[q] : Z += u[q], q === M - 1 && (Z === kg ? c = Jj : Z[0] === Fi[7] && kg && kg.indexOf(Z.substr(1)) >= 0 && (c = Ln)));
                        (S = $i(D, J) && $i(E, h) && E === R && c && (!V || V > P)) && G.indexOf(bg[0]) >= 0 && (Jq[bg[0]] = 1), S && G.indexOf(1) >= 0 && (Jq[1] = 1), S && G.indexOf(3) >= 0 && (Jq[2] = 1), S && G.indexOf(4) >= 0 && (Jq[3] = 1), S && G.indexOf(7) >= 0 && (Jq[4] = 1)
                    }
                } else S = !0, Jq[bg[0]] = Jq[1] = Jq[2] = Jq[3] = Jq[4] = 1;
                return Jq[to] = S, S
            },
            hi = function () { },
            ib = hi.prototype;
        ib.getPointAt = function (n) {
            var y = this.getUtoTmapping(n);
            return this.getPoint(y)
        }, ib.getPoints = function (X) {
            X || (X = 5);
            var I, z = [];
            for (I = 0; X >= I; I++) z.push(this.getPoint(I / X));
            return z
        }, ib.getSpacedPoints = function (K) {
            K || (K = 5);
            var L, Y = [];
            for (L = 0; K >= L; L++) Y.push(this.getPointAt(L / K));
            return Y
        }, ib.getLength = function () {
            var a = this.getLengths();
            return a[a.length - 1]
        }, ib.getLengths = function (r) {
            if (r || (r = this.__arcLengthDivisions ? this.__arcLengthDivisions : 200), this.cacheArcLengths && this.cacheArcLengths.length == r + 1 && !this.needsUpdate) return this.cacheArcLengths;
            this.needsUpdate = !1;
            var G, Y, y = [],
                e = this.getPoint(0),
                O = 0;
            for (y.push(0), Y = 1; r >= Y; Y++) G = this.getPoint(Y / r), O += G.distanceTo(e), y.push(O), e = G;
            return this.cacheArcLengths = y, y
        }, ib.getUtoTmapping = function (D, x) {
            var p, J = this.getLengths(),
                O = 0,
                q = J.length;
            p = x ? x : D * J[q - 1];
            for (var u, F = 0, i = q - 1; i >= F;)
                if (O = T(F + (i - F) / 2), u = J[O] - p, 0 > u) F = O + 1;
                else {
                    if (!(u > 0)) {
                        i = O;
                        break
                    }
                    i = O - 1
                }
            if (O = i, J[O] == p) {
                var l = O / (q - 1);
                return l
            }
            var W = J[O],
                U = J[O + 1],
                Q = U - W,
                c = (p - W) / Q,
                l = (O + c) / (q - 1);
            return l
        }, ib.getTangent = function (V) {
            var J = 1e-4,
                U = V - J,
                j = V + J;
            0 > U && (U = 0), j > 1 && (j = 1);
            var g = this.getPoint(U),
                z = this.getPoint(j),
                R = z.clone().sub(g);
            return R.normalize()
        }, ib.getTangentAt = function (k) {
            var A = this.getUtoTmapping(k);
            return this.getTangent(A)
        }, hi.create = function (g, T) {
            return g.prototype = Ci(hi.prototype), g.prototype.getPoint = T, g
        };
        var Pn = function () {
            this.curves = [], this.autoClose = !1
        },
            Ig = Pn.prototype = Ci(ib);
        Ig.add = function (e) {
            this.curves.push(e)
        }, Ig.closePath = function () {
            var m = this.curves[0].getPoint(0),
                N = this.curves[this.curves.length - 1].getPoint(1);
            m.equals(N) || this.curves.push(new Aj(N, m))
        }, Ig.getPoint = function (_) {
            for (var Y, c, X = _ * this.getLength(), A = this.getCurveLengths(), V = 0; V < A.length;) {
                if (A[V] >= X) {
                    Y = A[V] - X, c = this.curves[V];
                    var z = 1 - Y / c.getLength();
                    return c.getPointAt(z)
                }
                V++
            }
            return null
        }, Ig.getLength = function () {
            var S = this.getCurveLengths();
            return S[S.length - 1]
        }, Ig.getCurveLengths = function () {
            if (this.cacheLengths && this.cacheLengths.length == this.curves.length) return this.cacheLengths;
            var $, i = [],
                B = 0,
                k = this.curves.length;
            for ($ = 0; k > $; $++) B += this.curves[$].getLength(), i.push(B);
            return this.cacheLengths = i, i
        }, Ig.getTransformedPoints = function (b) {
            return this.getPoints(b)
        }, Ig.getBoundingBox = function () {
            var C, L, h, F, t, A, v = this.getPoints();
            C = L = Number.NEGATIVE_INFINITY, F = t = Number.POSITIVE_INFINITY;
            var B, s, D, V, X = v[0] instanceof pe;
            for (V = X ? new pe : new jd, s = 0, D = v.length; D > s; s++) B = v[s], B.x > C && (C = B.x), B.x < F && (F = B.x), B.y > L && (L = B.y), B.y < t && (t = B.y), X && (B.z > h && (h = B.z), B.z < A && (A = B.z)), V.add(B);
            var r = {
                minX: F,
                minY: t,
                maxX: C,
                maxY: L
            };
            return X && (r.maxZ = h, r.minZ = A), r
        };
        var $h = function (Y) {
            Pn.call(this), this.actions = [], Y && this.fromPoints(Y)
        },
            Rd = $h.prototype = Ci(Pn.prototype),
            as = "moveTo",
            js = "lineTo",
            al = "quadraticCurveTo",
            Xc = "bezierCurveTo",
            Ir = "arc",
            sr = "ellipse";
        Rd.fromPoints = function (Q) {
            this.moveTo(Q[0].x, Q[0].y);
            for (var y = 1, C = Q.length; C > y; y++) this.lineTo(Q[y].x, Q[y].y)
        }, Rd.moveTo = function () {
            var H = Array.prototype.slice.call(arguments);
            this.actions.push({
                action: as,
                args: H
            })
        }, Rd.lineTo = function (A, v) {
            var N = Array.prototype.slice.call(arguments),
                u = this.actions[this.actions.length - 1].args,
                W = u[u.length - 2],
                d = u[u.length - 1],
                S = new Aj(new jd(W, d), new jd(A, v));
            this.curves.push(S), this.actions.push({
                action: js,
                args: N
            })
        }, Rd.quadraticCurveTo = function (U, O, B, s) {
            var W = Array.prototype.slice.call(arguments),
                C = this.actions[this.actions.length - 1].args,
                S = C[C.length - 2],
                H = C[C.length - 1],
                J = new tq(new jd(S, H), new jd(U, O), new jd(B, s));
            this.curves.push(J), this.actions.push({
                action: al,
                args: W
            })
        }, Rd.bezierCurveTo = function (Y, N, C, X, G, L) {
            var W = Array.prototype.slice.call(arguments),
                k = this.actions[this.actions.length - 1].args,
                Z = k[k.length - 2],
                o = k[k.length - 1],
                c = new hc(new jd(Z, o), new jd(Y, N), new jd(C, X), new jd(G, L));
            this.curves.push(c), this.actions.push({
                action: Xc,
                args: W
            })
        }, Rd.arc = function (s, y, p, l, e, Z) {
            var h = this.actions[this.actions.length - 1].args,
                L = h[h.length - 2],
                q = h[h.length - 1];
            this.absarc(s + L, y + q, p, l, e, Z)
        }, Rd.absarc = function (X, q, E, T, d, u) {
            this.absellipse(X, q, E, E, T, d, u)
        }, Rd.ellipse = function (g, I, r, h, o, Y, n) {
            var x = this.actions[this.actions.length - 1].args,
                j = x[x.length - 2],
                J = x[x.length - 1];
            this.absellipse(g + j, I + J, r, h, o, Y, n)
        }, Rd.absellipse = function (H, J, Y, t, L, k, R) {
            var o = Array.prototype.slice.call(arguments),
                x = new Hk(H, J, Y, t, L, k, R);
            this.curves.push(x);
            var W = x.getPoint(1);
            o.push(W.x), o.push(W.y), this.actions.push({
                action: sr,
                args: o
            })
        }, Rd.getSpacedPoints = function (Z) {
            Z || (Z = 40);
            for (var w = [], c = 0; Z > c; c++) w.push(this.getPoint(c / Z));
            return w
        }, Rd.getPoints = function (b, B) {
            b = b || 12;
            var v, i, f, A, T, U, G, _, u, p, x, D, I, r, H, g, y, h, a = [];
            for (v = 0, i = this.actions.length; i > v; v++) switch (f = this.actions[v], A = f.action, T = f.args, A) {
                case as:
                    a.push(new jd(T[0], T[1]));
                    break;
                case js:
                    a.push(new jd(T[0], T[1]));
                    break;
                case al:
                    for (U = T[2], G = T[3], p = T[0], x = T[1], a.length > 0 ? (r = a[a.length - 1], D = r.x, I = r.y) : (r = this.actions[v - 1].args, D = r[r.length - 2], I = r[r.length - 1]), H = 1; b >= H; H++) g = H / b, y = uc.b2(g, D, p, U), h = uc.b2(g, I, x, G), a.push(new jd(y, h));
                    break;
                case Xc:
                    for (U = T[4], G = T[5], p = T[0], x = T[1], _ = T[2], u = T[3], a.length > 0 ? (r = a[a.length - 1], D = r.x, I = r.y) : (r = this.actions[v - 1].args, D = r[r.length - 2], I = r[r.length - 1]), H = 1; b >= H; H++) g = H / b, y = uc.b3(g, D, p, _, U), h = uc.b3(g, I, x, u, G), a.push(new jd(y, h));
                    break;
                case Ir:
                    var s, Y = T[0],
                        C = T[1],
                        m = T[2],
                        o = T[3],
                        R = T[4],
                        Z = !!T[5],
                        P = R - o,
                        M = 2 * b;
                    for (H = 1; M >= H; H++) g = H / M, Z || (g = 1 - g), s = o + g * P, y = Y + m * k(s), h = C + m * n(s), a.push(new jd(y, h));
                    break;
                case sr:
                    var s, Y = T[0],
                        C = T[1],
                        K = T[2],
                        J = T[3],
                        o = T[4],
                        R = T[5],
                        Z = !!T[6],
                        P = R - o,
                        M = 2 * b;
                    for (H = 1; M >= H; H++) g = H / M, Z || (g = 1 - g), s = o + g * P, y = Y + K * k(s), h = C + J * n(s), a.push(new jd(y, h))
            }
            var $, V, O = z["shape3d.point.epsilon"],
                j = !1;
            for (i = a.length, v = 0, i = a.length; i > v; v++) $ = a[v], V = v === i - 1 ? a[0] : a[v + 1], $ && V && X($.x - V.x) < O && X($.y - V.y) < O && (j = !0, a[v] = null);
            if (j) {
                var S = [];
                for (v = 0; i > v; v++) a[v] && S.push(a[v]);
                a = S
            }
            return B && a.push(a[0]), a
        }, Rd.toShapes = function (w, P) {
            function U(W) {
                var U, q, E, t, Z, A = [],
                    V = new $h;
                for (U = 0, q = W.length; q > U; U++) E = W[U], Z = E.args, t = E.action, t == as && 0 != V.actions.length && (A.push(V), V = new $h), V[t].apply(V, Z);
                return 0 != V.actions.length && A.push(V), A
            }

            function u(f) {
                for (var m = [], U = 0, o = f.length; o > U; U++) {
                    var w = f[U],
                        V = new af;
                    V.actions = w.actions, V.curves = w.curves, m.push(V)
                }
                return m
            }

            function C(t, C) {
                for (var o = 1e-10, k = C.length, l = !1, i = k - 1, P = 0; k > P; i = P++) {
                    var Y = C[i],
                        N = C[P],
                        Z = N.x - Y.x,
                        M = N.y - Y.y;
                    if (X(M) > o) {
                        if (0 > M && (Y = C[P], Z = -Z, N = C[i], M = -M), t.y < Y.y || t.y > N.y) continue;
                        if (t.y == Y.y) {
                            if (t.x == Y.x) return !0
                        } else {
                            var d = M * (t.x - Y.x) - Z * (t.y - Y.y);
                            if (0 == d) return !0;
                            if (0 > d) continue;
                            l = !l
                        }
                    } else {
                        if (t.y != Y.y) continue;
                        if (N.x <= t.x && t.x <= Y.x || Y.x <= t.x && t.x <= N.x) return !0
                    }
                }
                return l
            }
            var m = U(this.actions);
            if (0 == m.length) return [];
            if (P === !0) return u(m);
            var c, N, L, H = [];
            if (1 == m.length) return N = m[0], L = new af, L.actions = N.actions, L.curves = N.curves, H.push(L), H;
            var A = !uc.isClockWise(m[0].getPoints());
            A = w ? !A : A;
            var B, V = [],
                F = [],
                D = [],
                _ = 0;
            F[_] = Z, D[_] = [];
            var o, T;
            for (o = 0, T = m.length; T > o; o++) N = m[o], B = N.getPoints(), c = uc.isClockWise(B), c = w ? !c : c, c ? (!A && F[_] && _++, F[_] = {
                s: new af,
                p: B
            }, F[_].s.actions = N.actions, F[_].s.curves = N.curves, A && _++, D[_] = []) : D[_].push({
                h: N,
                p: B[0]
            });
            if (!F[0]) return u(m);
            if (F.length > 1) {
                for (var Q = !1, J = [], G = 0, y = F.length; y > G; G++) V[G] = [];
                for (var G = 0, y = F.length; y > G; G++) {
                    F[G];
                    for (var W = D[G], x = 0; x < W.length; x++) {
                        for (var M = W[x], t = !0, O = 0; O < F.length; O++) C(M.p, F[O].p) && (G != O && J.push({
                            froms: G,
                            tos: O,
                            hole: x
                        }), t ? (t = !1, V[O].push(M)) : Q = !0);
                        t && V[G].push(M)
                    }
                }
                J.length > 0 && (Q || (D = V))
            }
            var f, S, h;
            for (o = 0, T = F.length; T > o; o++)
                for (L = F[o].s, H.push(L), f = D[o], S = 0, h = f.length; h > S; S++) L.holes.push(f[S].h);
            return H
        };
        var af = function () {
            $h.apply(this, arguments), this.holes = []
        },
            Fg = af.prototype = Ci(Rd);
        Fg.getPointsHoles = function (e) {
            var A, q = this.holes.length,
                x = [];
            for (A = 0; q > A; A++) x[A] = this.holes[A].getTransformedPoints(e);
            return x
        }, Fg.extractAllPoints = function (M) {
            return {
                shape: this.getTransformedPoints(M),
                holes: this.getPointsHoles(M)
            }
        }, Fg.extractPoints = function (Z) {
            return this.extractAllPoints(Z)
        };
        var uc = {
            triangulateShape: function (r, E) {
                function J(t, C, c) {
                    return t.x != C.x ? t.x < C.x ? t.x <= c.x && c.x <= C.x : C.x <= c.x && c.x <= t.x : t.y < C.y ? t.y <= c.y && c.y <= C.y : C.y <= c.y && c.y <= t.y
                }

                function B(S, m, y, l, W) {
                    var Z = 1e-10,
                        M = m.x - S.x,
                        o = m.y - S.y,
                        R = l.x - y.x,
                        q = l.y - y.y,
                        i = S.x - y.x,
                        G = S.y - y.y,
                        p = o * R - M * q,
                        Y = o * i - M * G;
                    if (X(p) > Z) {
                        var U;
                        if (p > 0) {
                            if (0 > Y || Y > p) return [];
                            if (U = q * i - R * G, 0 > U || U > p) return []
                        } else {
                            if (Y > 0 || p > Y) return [];
                            if (U = q * i - R * G, U > 0 || p > U) return []
                        } if (0 == U) return !W || 0 != Y && Y != p ? [S] : [];
                        if (U == p) return !W || 0 != Y && Y != p ? [m] : [];
                        if (0 == Y) return [y];
                        if (Y == p) return [l];
                        var c = U / p;
                        return [{
                            x: S.x + c * M,
                            y: S.y + c * o
                        }]
                    }
                    if (0 != Y || q * i != R * G) return [];
                    var r = 0 == M && 0 == o,
                        s = 0 == R && 0 == q;
                    if (r && s) return S.x != y.x || S.y != y.y ? [] : [S];
                    if (r) return J(y, l, S) ? [S] : [];
                    if (s) return J(S, m, y) ? [y] : [];
                    var N, O, B, V, C, d, I, H;
                    return 0 != M ? (S.x < m.x ? (N = S, B = S.x, O = m, V = m.x) : (N = m, B = m.x, O = S, V = S.x), y.x < l.x ? (C = y, I = y.x, d = l, H = l.x) : (C = l, I = l.x, d = y, H = y.x)) : (S.y < m.y ? (N = S, B = S.y, O = m, V = m.y) : (N = m, B = m.y, O = S, V = S.y), y.y < l.y ? (C = y, I = y.y, d = l, H = l.y) : (C = l, I = l.y, d = y, H = y.y)), I >= B ? I > V ? [] : V == I ? W ? [] : [C] : H >= V ? [C, O] : [C, d] : B > H ? [] : B == H ? W ? [] : [N] : H >= V ? [N, O] : [N, d]
                }

                function n(u, l, y, F) {
                    var t = 1e-10,
                        o = l.x - u.x,
                        E = l.y - u.y,
                        D = y.x - u.x,
                        G = y.y - u.y,
                        g = F.x - u.x,
                        s = F.y - u.y,
                        p = o * G - E * D,
                        K = o * s - E * g;
                    if (X(p) > t) {
                        var z = g * G - s * D;
                        return p > 0 ? K >= 0 && z >= 0 : K >= 0 || z >= 0
                    }
                    return K > 0
                }

                function v(G, W) {
                    function q(X, w) {
                        var W = _.length - 1,
                            M = X - 1;
                        0 > M && (M = W);
                        var v = X + 1;
                        v > W && (v = 0);
                        var S = n(_[X], _[M], _[v], Q[w]);
                        if (!S) return !1;
                        var O = Q.length - 1,
                            V = w - 1;
                        0 > V && (V = O);
                        var y = w + 1;
                        return y > O && (y = 0), S = n(Q[w], Q[V], Q[y], _[X]), S ? !0 : !1
                    }

                    function N(v, c) {
                        var z, D, V;
                        for (z = 0; z < _.length; z++)
                            if (D = z + 1, D %= _.length, V = B(v, c, _[z], _[D], !0), V.length > 0) return !0;
                        return !1
                    }

                    function y(K, b) {
                        var z, Z, x, p, y;
                        for (z = 0; z < I.length; z++)
                            for (Z = W[I[z]], x = 0; x < Z.length; x++)
                                if (p = x + 1, p %= Z.length, y = B(K, b, Z[x], Z[p], !0), y.length > 0) return !0;
                        return !1
                    }
                    for (var Q, x, s, r, m, U, v, T, Y, P, g, _ = G.concat(), I = [], J = [], $ = 0, c = W.length; c > $; $++) I.push($);
                    for (var z = 0, O = 2 * I.length; I.length > 0 && (O--, !(0 > O));)
                        for (s = z; s < _.length; s++) {
                            r = _[s], x = -1;
                            for (var $ = 0; $ < I.length; $++)
                                if (U = I[$], v = r.x + ":" + r.y + ":" + U, J[v] === Z) {
                                    Q = W[U];
                                    for (var K = 0; K < Q.length; K++)
                                        if (m = Q[K], q(s, K) && !N(r, m) && !y(r, m)) {
                                            x = K, I.splice($, 1), T = _.slice(0, s + 1), Y = _.slice(s), P = Q.slice(x), g = Q.slice(0, x + 1), _ = T.concat(P).concat(g).concat(Y), z = s;
                                            break
                                        }
                                    if (x >= 0) break;
                                    J[v] = !0
                                }
                            if (x >= 0) break
                        }
                    return _
                }
                for (var j, T, x, s, F, c, Y = {}, $ = r.concat(), N = 0, b = E.length; b > N; N++) Array.prototype.push.apply($, E[N]);
                for (j = 0, T = $.length; T > j; j++) F = $[j].x + ":" + $[j].y, Y[F] !== Z, Y[F] = j;
                var w = v(r, E),
                    D = Pk.Triangulate(w, !1);
                for (j = 0, T = D.length; T > j; j++)
                    for (s = D[j], x = 0; 3 > x; x++) F = s[x].x + ":" + s[x].y, c = Y[F], c !== Z && (s[x] = c);
                return D.concat()
            }, isClockWise: function (d) {
                return Pk.Triangulate.area(d) < 0
            }, b2p0: function (E, K) {
                var F = 1 - E;
                return F * F * K
            }, b2p1: function (y, t) {
                return 2 * (1 - y) * y * t
            }, b2p2: function (N, R) {
                return N * N * R
            }, b2: function (c, H, B, u) {
                return this.b2p0(c, H) + this.b2p1(c, B) + this.b2p2(c, u)
            }, b3p0: function (y, C) {
                var n = 1 - y;
                return n * n * n * C
            }, b3p1: function (y, G) {
                var F = 1 - y;
                return 3 * F * F * y * G
            }, b3p2: function (M, T) {
                var G = 1 - M;
                return 3 * G * M * M * T
            }, b3p3: function (t, C) {
                return t * t * t * C
            }, b3: function (b, K, k, c, F) {
                return this.b3p0(b, K) + this.b3p1(b, k) + this.b3p2(b, c) + this.b3p3(b, F)
            }
        },
            Pk = {
                faces: {},
                face: "",
                weight: "normal",
                style: "normal",
                size: 150,
                divisions: 10,
                getDefaultFont: function () {
                    var L = o.keys(this.faces);
                    return L.length ? L[0] : null
                }, getFace: function () {
                    try {
                        return this.faces[this.face][this.weight][this.style]
                    } catch (s) {
                        throw "The font " + this.face + " with " + this.weight + " weight and " + this.style + " style is missing."
                    }
                }, loadFace: function (e) {
                    var v = e.familyName.toLowerCase(),
                        i = this;
                    return i.faces[v] = i.faces[v] || {}, i.faces[v][e.cssFontWeight] = i.faces[v][e.cssFontWeight] || {}, i.faces[v][e.cssFontWeight][e.cssFontStyle] = e, e
                }, drawText: function (v) {
                    var R, p = this.getFace(),
                        n = this.size / p.resolution,
                        N = 0,
                        U = String(v).split(""),
                        x = U.length,
                        E = [];
                    for (R = 0; x > R; R++) {
                        var w = new $h,
                            G = this.extractGlyphPoints(U[R], p, n, N, w);
                        G && (N += G.offset * this.spacing, E.push(G.path))
                    }
                    var M = N / 2;
                    return {
                        paths: E,
                        offset: M
                    }
                }, extractGlyphPoints: function (o, W, B, d, $) {
                    var T, Y, K, R, k, U, Q, C, V, j, c, g, Z, f, D, N, n, b, O, h = [],
                        u = W.glyphs[o] || W.glyphs["?"];
                    if (u) {
                        if (u.o)
                            for (R = u._cachedOutline || (u._cachedOutline = u.o.split(" ")), U = R.length, Q = B, C = B, T = 0; U > T;) switch (k = R[T++]) {
                                case "m":
                                    V = R[T++] * Q + d, j = R[T++] * C, $.moveTo(V, j);
                                    break;
                                case "l":
                                    V = R[T++] * Q + d, j = R[T++] * C, $.lineTo(V, j);
                                    break;
                                case "q":
                                    if (c = R[T++] * Q + d, g = R[T++] * C, D = R[T++] * Q + d, N = R[T++] * C, $.quadraticCurveTo(D, N, c, g), O = h[h.length - 1])
                                        for (Z = O.x, f = O.y, Y = 1, K = this.divisions; K >= Y; Y++) {
                                            var J = Y / K;
                                            uc.b2(J, Z, D, c), uc.b2(J, f, N, g)
                                        }
                                    break;
                                case "b":
                                    if (c = R[T++] * Q + d, g = R[T++] * C, D = R[T++] * Q + d, N = R[T++] * C, n = R[T++] * Q + d, b = R[T++] * C, $.bezierCurveTo(D, N, n, b, c, g), O = h[h.length - 1])
                                        for (Z = O.x, f = O.y, Y = 1, K = this.divisions; K >= Y; Y++) {
                                            var J = Y / K;
                                            uc.b3(J, Z, D, n, c), uc.b3(J, f, N, b, g)
                                        }
                            }
                        return {
                            offset: u.ha * B,
                            path: $
                        }
                    }
                }
            };
        Pk.generateShapes = function (R, Y) {
            Y = Y || {};
            var H = Y.font;
            if (H === Z && (H = Pk.getDefaultFont(), !H)) return console.log("There's no valid font face, use ht.Default.loadFontFace to load font first."), [];
            var r = Y.size !== Z ? Y.size : 1,
                l = Y.curveSegments !== Z ? Y.curveSegments : 4,
                y = Y.spacing !== Z ? Y.spacing : 1,
                m = Y.weight !== Z ? Y.weight : "normal",
                J = Y.style !== Z ? Y.style : "normal";
            Pk.size = r, Pk.divisions = l, Pk.face = H, Pk.weight = m, Pk.style = J, Pk.spacing = y;
            for (var X = Pk.drawText(R), k = X.paths, Q = [], w = 0, v = k.length; v > w; w++) Array.prototype.push.apply(Q, k[w].toShapes());
            return Q
        },
            function (S) {
                var d = 1e-10,
                    j = function (O, r) {
                        var h = O.length;
                        if (3 > h) return null;
                        var X, j, e, s = [],
                            c = [],
                            K = [];
                        if (W(O) > 0)
                            for (j = 0; h > j; j++) c[j] = j;
                        else
                            for (j = 0; h > j; j++) c[j] = h - 1 - j;
                        var S = h,
                            n = 2 * S;
                        for (j = S - 1; S > 2;) {
                            if (n-- <= 0) return r ? K : s;
                            if (X = j, X >= S && (X = 0), j = X + 1, j >= S && (j = 0), e = j + 1, e >= S && (e = 0), o(O, X, j, e, S, c)) {
                                var Y, l, U, x, m;
                                for (Y = c[X], l = c[j], U = c[e], s.push([O[Y], O[l], O[U]]), K.push([c[X], c[j], c[e]]), x = j, m = j + 1; S > m; x++, m++) c[x] = c[m];
                                S--, n = 2 * S
                            }
                        }
                        return r ? K : s
                    },
                    W = function (C) {
                        for (var m = C.length, F = 0, B = m - 1, E = 0; m > E; B = E++) F += C[B].x * C[E].y - C[E].x * C[B].y;
                        return .5 * F
                    },
                    o = function (I, s, L, D, t, J) {
                        var A, Q, c, U, Y, $, E, b, x;
                        if (Q = I[J[s]].x, c = I[J[s]].y, U = I[J[L]].x, Y = I[J[L]].y, $ = I[J[D]].x, E = I[J[D]].y, d > (U - Q) * (E - c) - (Y - c) * ($ - Q)) return !1;
                        var e, o, g, P, W, H, m, M, R, f, q, h, S, y, j;
                        for (e = $ - U, o = E - Y, g = Q - $, P = c - E, W = U - Q, H = Y - c, A = 0; t > A; A++)
                            if (b = I[J[A]].x, x = I[J[A]].y, !(b === Q && x === c || b === U && x === Y || b === $ && x === E) && (m = b - Q, M = x - c, R = b - U, f = x - Y, q = b - $, h = x - E, j = e * f - o * R, S = W * M - H * m, y = g * h - P * q, j >= -d && y >= -d && S >= -d)) return !1;
                        return !0
                    };
                return S.Triangulate = j, S.Triangulate.area = W, S
            }(Pk), x._typeface_js = {
                faces: Pk.faces,
                loadFace: Pk.loadFace
            };
        var wr = function () {
            this.vertices = [], this.faces = [], this.faceVertexUvs = [[]]
        },
            vo = wr.prototype = {
                constructor: wr,
                computeFaceNormals: function () {
                    for (var W = new pe, N = new pe, v = 0, O = this.faces.length; O > v; v++) {
                        var i = this.faces[v],
                            s = this.vertices[i.a],
                            B = this.vertices[i.b],
                            M = this.vertices[i.c];
                        W.subVectors(M, B), N.subVectors(s, B), W.cross(N), W.normalize(), i.normal.copy(W)
                    }
                }, computeVertexNormals: function (z) {
                    var Y, j, N, M, y, k;
                    for (k = new Array(this.vertices.length), Y = 0, j = this.vertices.length; j > Y; Y++) k[Y] = new pe;
                    if (z) {
                        var I, p, G, D = new pe,
                            f = new pe;
                        for (N = 0, M = this.faces.length; M > N; N++) y = this.faces[N], I = this.vertices[y.a], p = this.vertices[y.b], G = this.vertices[y.c], D.subVectors(G, p), f.subVectors(I, p), D.cross(f), k[y.a].add(D), k[y.b].add(D), k[y.c].add(D)
                    } else
                        for (N = 0, M = this.faces.length; M > N; N++) y = this.faces[N], k[y.a].add(y.normal), k[y.b].add(y.normal), k[y.c].add(y.normal);
                    for (Y = 0, j = this.vertices.length; j > Y; Y++) k[Y].normalize();
                    for (N = 0, M = this.faces.length; M > N; N++) y = this.faces[N], y.vertexNormals[0] = k[y.a].clone(), y.vertexNormals[1] = k[y.b].clone(), y.vertexNormals[2] = k[y.c].clone()
                }, mergeVertices: function () {
                    var i, s, O, n, J, h, D, u, N = {},
                        w = [],
                        B = [],
                        F = 4,
                        j = P(10, F);
                    for (O = 0, n = this.vertices.length; n > O; O++) i = this.vertices[O], s = A(i.x * j) + "_" + A(i.y * j) + "_" + A(i.z * j), N[s] === Z ? (N[s] = O, w.push(this.vertices[O]), B[O] = w.length - 1) : B[O] = B[N[s]];
                    var R = [];
                    for (O = 0, n = this.faces.length; n > O; O++) {
                        J = this.faces[O], J.a = B[J.a], J.b = B[J.b], J.c = B[J.c], h = [J.a, J.b, J.c];
                        for (var r = 0; 3 > r; r++)
                            if (h[r] == h[(r + 1) % 3]) {
                                R.push(O);
                                break
                            }
                    }
                    for (O = R.length - 1; O >= 0; O--) {
                        var q = R[O];
                        for (this.faces.splice(q, 1), D = 0, u = this.faceVertexUvs.length; u > D; D++) this.faceVertexUvs[D].splice(q, 1)
                    }
                    var t = this.vertices.length - w.length;
                    return this.vertices = w, t
                }
            },
            Hk = function (n, y, $, E, C, T, Z) {
                this.aX = n, this.aY = y, this.xRadius = $, this.yRadius = E, this.aStartAngle = C, this.aEndAngle = T, this.aClockwise = Z
            };
        Hk.prototype = Ci(ib), Hk.prototype.getPoint = function (w) {
            var o, E = this.aEndAngle - this.aStartAngle;
            0 > E && (E += $), E > $ && (E -= $), o = this.aClockwise === !0 ? this.aEndAngle + (1 - w) * ($ - E) : this.aStartAngle + w * E;
            var M = this.aX + this.xRadius * k(o),
                K = this.aY + this.yRadius * n(o);
            return new jd(M, K)
        };
        var Aj = function (C, Q) {
            this.v1 = C, this.v2 = Q
        },
            Bi = Aj.prototype = Ci(ib);
        Bi.getPoint = function (J) {
            var f = this.v2.clone().sub(this.v1);
            return f.multiplyScalar(J).add(this.v1), f
        }, Bi.getPointAt = function (h) {
            return this.getPoint(h)
        }, Bi.getTangent = function () {
            var i = this.v2.clone().sub(this.v1);
            return i.normalize()
        };
        var tq = function (J, b, w) {
            this.v0 = J, this.v1 = b, this.v2 = w
        };
        tq.prototype = Ci(ib), tq.prototype.getPoint = function (G) {
            var r, Y;
            return r = uc.b2(G, this.v0.x, this.v1.x, this.v2.x), Y = uc.b2(G, this.v0.y, this.v1.y, this.v2.y), new jd(r, Y)
        };
        var hc = function (j, d, K, F) {
            this.v0 = j, this.v1 = d, this.v2 = K, this.v3 = F
        };
        hc.prototype = Ci(ib), hc.prototype.getPoint = function (o) {
            var $, Y;
            return $ = uc.b3(o, this.v0.x, this.v1.x, this.v2.x, this.v3.x), Y = uc.b3(o, this.v0.y, this.v1.y, this.v2.y, this.v3.y), new jd($, Y)
        }, hi.create(function (e, E) {
            this.v1 = e, this.v2 = E
        }, function (C) {
            var a = new pe;
            return a.subVectors(this.v2, this.v1), a.multiplyScalar(C), a.add(this.v1), a
        });
        var Cb = hi.create(function (P, N, H) {
            this.v0 = P, this.v1 = N, this.v2 = H
        }, function (d) {
            var g, f, x;
            return g = uc.b2(d, this.v0.x, this.v1.x, this.v2.x), f = uc.b2(d, this.v0.y, this.v1.y, this.v2.y), x = uc.b2(d, this.v0.z, this.v1.z, this.v2.z), new pe(g, f, x)
        }),
            th = hi.create(function (Y, R, d, B) {
                this.v0 = Y, this.v1 = R, this.v2 = d, this.v3 = B
            }, function (Q) {
                var O, P, d;
                return O = uc.b3(Q, this.v0.x, this.v1.x, this.v2.x, this.v3.x), P = uc.b3(Q, this.v0.y, this.v1.y, this.v2.y, this.v3.y), d = uc.b3(Q, this.v0.z, this.v1.z, this.v2.z, this.v3.z), new pe(O, P, d)
            }),
            rc = function (W, O, H, I, f, R, E, e) {
                wr.call(this), I = I !== Z ? I : .5, f = f !== Z ? f : .5, e = e !== Z ? e : 1, W = W || 8, R = R || 0, E = E || $;
                var g, i, K = 1,
                    L = e / 2,
                    X = [],
                    u = [],
                    c = this.vertices,
                    j = this.faces,
                    M = this.faceVertexUvs;
                for (i = 0; K >= i; i++) {
                    var F = [],
                        A = [],
                        h = i / K,
                        G = h * (f - I) + I;
                    for (g = 0; W >= g; g++) {
                        var v = g / W,
                            z = new pe,
                            B = -(v * E + R);
                        z.z = G * n(B), z.y = -h * e + L, z.x = G * k(B), c.push(z), F.push(c.length - 1), A.push(new jd(v, h))
                    }
                    X.push(F), u.push(A)
                }
                var S, U, T = (f - I) / e;
                for (g = 0; W > g; g++)
                    for (0 !== I ? (S = c[X[0][g]].clone(), U = c[X[0][g + 1]].clone()) : (S = c[X[1][g]].clone(), U = c[X[1][g + 1]].clone()), S.setY(w(S.x * S.x + S.z * S.z) * T).normalize(), U.setY(w(U.x * U.x + U.z * U.z) * T).normalize(), i = 0; K > i; i++) {
                        var C = X[i][g],
                            q = X[i + 1][g],
                            d = X[i + 1][g + 1],
                            b = X[i][g + 1],
                            o = S.clone(),
                            x = S.clone(),
                            r = U.clone(),
                            D = U.clone(),
                            V = u[i][g].clone(),
                            t = u[i + 1][g].clone(),
                            N = u[i + 1][g + 1].clone(),
                            m = u[i][g + 1].clone();
                        j.push(new sf(C, q, b, [o, x, D])), M[0].push([V, t, m]), j.push(new sf(q, d, b, [x.clone(), r, D.clone()])), M[0].push([t.clone(), N, m.clone()])
                    }
                if (O && I > 0)
                    for (this.vertices.push(new pe(0, L, 0)), g = 0; W > g; g++) {
                        var C = X[0][g],
                            q = X[0][g + 1],
                            d = this.vertices.length - 1,
                            o = new pe(0, 1, 0),
                            x = new pe(0, 1, 0),
                            r = new pe(0, 1, 0),
                            V = u[0][g].clone(),
                            t = u[0][g + 1].clone(),
                            N = new jd(t.x, 0);
                        j.push(new sf(C, q, d, [o, x, r], null, 1));
                        var p = g / W * $,
                            s = k(p),
                            _ = n(p),
                            a = (g + 1) / W * $,
                            J = k(a),
                            Q = n(a);
                        M[0].push([new jd(.5 + .5 * s, .5 + .5 * _), new jd(.5 + .5 * J, .5 + .5 * Q), new jd(.5, .5)])
                    }
                if (H && f > 0)
                    for (this.vertices.push(new pe(0, -L, 0)), g = 0; W > g; g++) {
                        var C = X[i][g + 1],
                            q = X[i][g],
                            d = c.length - 1,
                            o = new pe(0, -1, 0),
                            x = new pe(0, -1, 0),
                            r = new pe(0, -1, 0),
                            V = u[i][g + 1].clone(),
                            t = u[i][g].clone();
                        j.push(new sf(C, q, d, [o, x, r], null, 2));
                        var p = g / W * $,
                            s = k(p),
                            _ = n(p),
                            a = (g + 1) / W * $,
                            J = k(a),
                            Q = n(a);
                        M[0].push([new jd(.5 + .5 * J, .5 - .5 * Q), new jd(.5 + .5 * s, .5 - .5 * _), new jd(.5, .5)])
                    }
            };
        rc.prototype = Ci(vo);
        var To = function (p, C, l, e, R, x, w) {
            wr.call(this), w = w || .5, p = p || 16, C = C || 16, l = (l !== Z ? l : 0) - W, e = e !== Z ? e : $, R = R !== Z ? R : 0, x = x !== Z ? x : W;
            var F, A, u = [],
                y = [],
                Q = this.vertices,
                b = this.faces,
                o = this.faceVertexUvs;
            for (A = 0; C >= A; A++) {
                var f = [],
                    q = [];
                for (F = 0; p >= F; F++) {
                    var S = F / p,
                        G = A / C,
                        d = new pe;
                    d.x = -w * k(l + S * e) * n(R + G * x), d.y = w * k(R + G * x), d.z = w * n(l + S * e) * n(R + G * x), Q.push(d), f.push(Q.length - 1), q.push(new jd(S, G))
                }
                u.push(f), y.push(q)
            }
            for (A = 0; C > A; A++)
                for (F = 0; p > F; F++) {
                    var O = u[A][F + 1],
                        g = u[A][F],
                        N = u[A + 1][F],
                        M = u[A + 1][F + 1],
                        T = Q[O].clone().normalize(),
                        i = Q[g].clone().normalize(),
                        v = Q[N].clone().normalize(),
                        P = Q[M].clone().normalize(),
                        m = y[A][F + 1].clone(),
                        J = y[A][F].clone(),
                        H = y[A + 1][F].clone(),
                        I = y[A + 1][F + 1].clone();
                    X(Q[O].y) === w ? (m.x = (m.x + J.x) / 2, b.push(new sf(O, N, M, [T, v, P])), o[0].push([m, H, I])) : X(Q[N].y) === w ? (H.x = (H.x + I.x) / 2, b.push(new sf(O, g, N, [T, i, v])), o[0].push([m, J, H])) : (b.push(new sf(O, g, M, [T, i, P])), o[0].push([m, J, I]), b.push(new sf(g, N, M, [i.clone(), v, P.clone()])), o[0].push([J.clone(), H, I.clone()]))
                }
        };
        To.prototype = Ci(vo);
        var Kg = function (a, l, u, B, x, R) {
            wr.call(this), a = a || .33, l = l || .17, B = B || 8, u = u || 6, x = x || 0, R = R || $;
            for (var P = new pe, g = [], o = [], D = 0; B >= D; D++)
                for (var J = D / B * $ + W, q = 0; u >= q; q++) {
                    var s = q / u * R + x;
                    P.x = a * k(s), P.z = -a * n(s);
                    var t = new pe,
                        E = a + l * k(J);
                    t.x = E * k(s), t.z = -E * n(s), t.y = l * n(J), this.vertices.push(t), g.push(new jd(q / u, 1 - D / B)), o.push(t.clone().sub(P).normalize())
                }
            for (var D = 1; B >= D; D++)
                for (var q = 1; u >= q; q++) {
                    var r = (u + 1) * D + q - 1,
                        w = (u + 1) * (D - 1) + q - 1,
                        Z = (u + 1) * (D - 1) + q,
                        C = (u + 1) * D + q,
                        b = new sf(r, w, C, [o[r].clone(), o[w].clone(), o[C].clone()]);
                    this.faces.push(b), this.faceVertexUvs[0].push([g[r].clone(), g[w].clone(), g[C].clone()]), b = new sf(w, Z, C, [o[w].clone(), o[Z].clone(), o[C].clone()]), this.faces.push(b), this.faceVertexUvs[0].push([g[w].clone(), g[Z].clone(), g[C].clone()])
                }
            this.computeFaceNormals()
        };
        Kg.prototype = Ci(vo);
        var xb = function (B, Y, q) {
            return B ? (wr.call(this), B = B instanceof Array ? B : [B], this.addShapeList(B, Y), Y.convertYZ !== !1 && Mb(this, q), this.computeFaceNormals(), void 0) : (B = [], void 0)
        },
            ys = xb.prototype = Ci(wr.prototype);
        ys.addShapeList = function (O, t) {
            for (var L = O.length, m = 0; L > m; m++) {
                var n = O[m];
                this.addShape(n, t)
            }
        }, ys.addShape = function (H, j) {
            function $() {
                if (j.bottom)
                    for (var n = 0; f > n; n++) A = P[n], R(A[2], A[1], A[0], !0);
                if (j.top)
                    for (n = 0; f > n; n++) A = P[n], R(A[0] + Q * o, A[1] + Q * o, A[2] + Q * o, !1)
            }

            function _() {
                var L = 0;
                for (N(k, L), L += k.length, q = 0, E = X.length; E > q; q++) y = X[q], N(y, L), L += y.length
            }

            function N(J, E) {
                for (var k, D, A = J.length; --A >= 0;) {
                    k = A, D = A - 1, 0 > D && (D = J.length - 1);
                    var g = 0,
                        $ = o;
                    for (g = 0; $ > g; g++) {
                        var u = Q * g,
                            V = Q * (g + 1),
                            L = E + k + u,
                            l = E + D + u,
                            m = E + D + V,
                            n = E + k + V;
                        G(L, l, m, n, J, g, $, k, D)
                    }
                }
            }

            function i(H, Z, s) {
                w.vertices.push(new pe(H, Z, s))
            }

            function R(f, V, S, r) {
                f += D, V += D, S += D, w.faces.push(new sf(f, V, S, null, null, r ? 2 : 1));
                var u = r ? n.generateBottomUV(w, H, j, f, V, S) : n.generateTopUV(w, H, j, f, V, S);
                w.faceVertexUvs[0].push(u)
            }

            function G(q, U, R, v, B, C, b, g, Z) {
                q += D, U += D, R += D, v += D, w.faces.push(new sf(q, U, v)), w.faces.push(new sf(U, R, v));
                var p = n.generateSideWallUV(w, H, B, j, q, U, R, v, C, b, g, Z);
                w.faceVertexUvs[0].push([p[0], p[1], p[3]]), w.faceVertexUvs[0].push([p[1], p[2], p[3]])
            }
            var B, g, a, p, F, T = j.amount,
                c = j.curveSegments || Cq,
                o = j.steps || 1,
                M = j.extrudePath,
                d = !1,
                n = new kf(j.repeatUVLength);
            M && (B = M.getSpacedPoints(o), d = !0, g = j.frames !== Z ? j.frames : new Ri.FrenetFrames(M, o, !1), a = new pe, p = new pe, F = new pe);
            var y, q, E, w = this,
                D = this.vertices.length,
                e = H.extractPoints(c),
                l = e.shape,
                X = e.holes,
                s = !uc.isClockWise(l);
            if (s) {
                for (l = l.reverse(), q = 0, E = X.length; E > q; q++) y = X[q], uc.isClockWise(y) && (X[q] = y.reverse());
                s = !1
            }
            var P = uc.triangulateShape(l, X),
                k = l;
            for (q = 0, E = X.length; E > q; q++) y = X[q], l = l.concat(y);
            for (var x, A, Q = l.length, f = P.length, m = 0; Q > m; m++) x = l[m], d ? (p.copy(g.normals[0]).multiplyScalar(x.x), a.copy(g.binormals[0]).multiplyScalar(x.y), F.copy(B[0]).add(p).add(a), i(F.x, F.y, F.z)) : i(x.x, x.y, 0);
            var r;
            for (r = 1; o >= r; r++)
                for (m = 0; Q > m; m++) x = l[m], d ? (p.copy(g.normals[r]).multiplyScalar(x.x), a.copy(g.binormals[r]).multiplyScalar(x.y), F.copy(B[r]).add(p).add(a), i(F.x, F.y, F.z)) : i(x.x, x.y, T / o * r);
            $(), _()
        };
        var Ri = function (y, H, p, I, d) {
            function J(E, l, A) {
                return b.vertices.push(new pe(E, l, A)) - 1
            }
            wr.call(this), H = H || 64, p = p || 1, I = I || 8, d = d || !1;
            var B, W, G, o, S, f, F, A, c, v, R, l, O, w, t, E, K, j, u, m, Q = [],
                b = this,
                z = H + 1,
                T = new pe,
                q = new Ri.FrenetFrames(y, H, d),
                M = q.tangents,
                s = q.normals,
                x = q.binormals;
            for (this.tangents = M, this.normals = s, this.binormals = x, c = 0; z > c; c++)
                for (Q[c] = [], o = c / (z - 1), A = y.getPointAt(o), B = M[c], W = s[c], G = x[c], v = 0; I > v; v++) S = v / I * $, f = -p * k(S), F = p * n(S), T.copy(A), T.x += f * W.x + F * G.x, T.y += f * W.y + F * G.y, T.z += f * W.z + F * G.z, Q[c][v] = J(T.x, T.y, T.z);
            for (c = 0; H > c; c++)
                for (v = 0; I > v; v++) R = d ? (c + 1) % H : c + 1, l = (v + 1) % I, O = Q[c][v], w = Q[R][v], t = Q[R][l], E = Q[c][l], K = new jd(c / H, v / I), j = new jd((c + 1) / H, v / I), u = new jd((c + 1) / H, (v + 1) / I), m = new jd(c / H, (v + 1) / I), this.faces.push(new sf(O, w, E)), this.faceVertexUvs[0].push([K, j, m]), this.faces.push(new sf(w, t, E)), this.faceVertexUvs[0].push([j.clone(), u, m.clone()]);
            this.computeFaceNormals(), this.computeVertexNormals()
        };
        Ri.prototype = Ci(vo), Ri.FrenetFrames = function (v, $, I) {
            function Y() {
                F[0] = new pe, O[0] = new pe, l = Number.MAX_VALUE, M = X(B[0].x), U = X(B[0].y), j = X(B[0].z), l >= M && (l = M, Z.set(1, 0, 0)), l >= U && (l = U, Z.set(0, 1, 0)), l >= j && Z.set(0, 0, 1), q.crossVectors(B[0], Z).normalize(), F[0].crossVectors(B[0], q), O[0].crossVectors(B[0], F[0])
            }
            var C, l, M, U, j, r, J, Z = new pe,
                B = [],
                F = [],
                O = [],
                q = new pe,
                h = new wl,
                o = $ + 1,
                Q = 1e-4;
            for (this.tangents = B, this.normals = F, this.binormals = O, r = 0; o > r; r++) J = r / (o - 1), B[r] = v.getTangentAt(J), B[r].normalize();
            for (Y(), r = 1; o > r; r++) F[r] = F[r - 1].clone(), O[r] = O[r - 1].clone(), q.crossVectors(B[r - 1], B[r]), q.length() > Q && (q.normalize(), C = c(re(B[r - 1].dot(B[r]), -1, 1)), F[r].applyMatrix4(h.makeRotationAxis(q, C))), O[r].crossVectors(B[r], F[r]);
            if (I)
                for (C = c(re(F[0].dot(F[o - 1]), -1, 1)), C /= o - 1, B[0].dot(q.crossVectors(F[0], F[o - 1])) > 0 && (C = -C), r = 1; o > r; r++) F[r].applyMatrix4(h.makeRotationAxis(B[r], C * r)), O[r].crossVectors(B[r], F[r])
        };
        var Zd = function (r, U, g, P) {
            wr.call(this), U = U || 18, g = g || 0, P = P == F ? $ : P;
            for (var d = 1 / (r.length - 1), u = 1 / U, x = 0, I = U; I >= x; x++)
                for (var C = g + x * u * P, b = k(C), E = n(C), w = 0, W = r.length; W > w; w++) {
                    var N = r[w],
                        i = new pe;
                    i.x = b * N.x - E * N.y, i.y = E * N.x + b * N.y, i.z = N.z, this.vertices.push(i)
                }
            for (var l = r.length, x = 0, I = U; I > x; x++)
                for (var w = 0, W = r.length - 1; W > w; w++) {
                    var e = w + l * x,
                        A = e,
                        c = e + l,
                        b = e + 1 + l,
                        h = e + 1,
                        B = x * u,
                        q = w * d,
                        o = B + u,
                        X = q + d;
                    this.faces.push(new sf(A, h, c)), this.faceVertexUvs[0].push([new jd(B, q), new jd(B, X), new jd(o, q)]), this.faces.push(new sf(c, h, b)), this.faceVertexUvs[0].push([new jd(o, q), new jd(B, X), new jd(o, X)])
                }
            this.mergeVertices(), Mb(this), this.computeFaceNormals(), this.computeVertexNormals()
        };
        Zd.prototype = Ci(vo);
        var qf = function (Q, W) {
            W = W || {};
            var P = Pk.generateShapes(Q, W);
            W.amount = W.amount !== Z ? W.amount : .5, W.convertYZ = !1, W.fill !== !1 && (W.bottom = !0, W.top = !0), xb.call(this, P, W)
        };
        qf.prototype = Ci(ys);
        var Dp = O.Node = function () {
            fi(Dp, this)
        },
            Qn = {
                X: uh,
                Y: ah,
                Z: wo
            },
            Er = {
                X: 0,
                Y: 1,
                Z: 2
            },
            il = {
                xyz: "XYZ",
                xzy: "XZY",
                yxz: "YXZ",
                yzx: "YZX",
                zxy: "ZXY",
                zyx: "ZYX"
            },
            Vn = "xzy",
            Cl = function (F, v, $) {
                if (v) {
                    var Z = v[0],
                        L = v[1],
                        R = v[2];
                    "xzy" === $ ? (ah(F, L), wo(F, R), uh(F, Z)) : "xyz" === $ ? (wo(F, R), ah(F, L), uh(F, Z)) : "yxz" === $ ? (wo(F, R), uh(F, Z), ah(F, L)) : "yzx" === $ ? (uh(F, Z), wo(F, R), ah(F, L)) : "zxy" === $ ? (ah(F, L), uh(F, Z), wo(F, R)) : "zyx" === $ ? (uh(F, Z), ah(F, L), wo(F, R)) : (ah(F, L), wo(F, R), uh(F, Z))
                }
            };
        ki("Node", Qp, {
            ms_ac: ["rotationMode", "anchorElevation"],
            ms_edge: !0,
            _adjustChildrenToTop: !0,
            _icon: "node_icon",
            _image: "node_image",
            _rotationMode: Vn,
            _64O: 0,
            _rotationX: 0,
            _53O: 0,
            _host: F,
            _position: {
                x: 0,
                y: 0
            },
            _anchor: {
                x: .5,
                y: .5
            },
            _anchorElevation: .5,
            _scale: {
                x: 1,
                y: 1
            },
            _scaleTall: 1,
            _54O: 0,
            getUIClass: function () {
                return Af
            }, _22Q: function () {
                return gf
            }, getX: function () {
                return this.p().x
            }, setX: function (u) {
                this.p(u, this.p().y)
            }, getY: function () {
                return this.p().y
            }, setY: function (o) {
                this.p(this.p().x, o)
            }, getAnchorX: function () {
                return this.getAnchor().x
            }, setAnchorX: function (w) {
                this.setAnchor(w, this.getAnchor().y)
            }, getAnchorY: function () {
                return this.getAnchor().y
            }, setAnchorY: function (H) {
                this.setAnchor(this.getAnchor().x, H)
            }, getScaleX: function () {
                return this.getScale().x
            }, setScaleX: function (E) {
                this.setScale(E, this.getScale().y)
            }, getScaleY: function () {
                return this.getScale().y
            }, setScaleY: function (S) {
                this.setScale(this.getScale().x, S)
            }, p: function () {
                return 0 === arguments.length ? this.getPosition() : (this.setPosition.apply(this, arguments), this)
            }, p3: function () {
                return 0 === arguments.length ? this.getPosition3d() : (this.setPosition3d.apply(this, arguments), this)
            }, s3: function () {
                return 0 === arguments.length ? this.getSize3d() : (this.setSize3d.apply(this, arguments), this)
            }, r3: function () {
                return 0 === arguments.length ? this.getRotation3d() : (this.setRotation3d.apply(this, arguments), this)
            }, setQuaternion: function (X) {
                var a = (new gg).setFromQuaternion(X, gg.ReverseOrder(this.getRotationMode()));
                return this.r3(a.x, a.y, a.z)
            }, getQuaternion: function () {
                return (new fs).setFromEuler(this.getEuler())
            }, getEuler: function () {
                var W = this.r3();
                return (new gg).set(W[0], W[1], W[2], gg.ReverseOrder(this.getRotationMode()))
            }, setEuler: function (U) {
                return U = U.clone().reorder(gg.ReverseOrder(this.getRotationMode())), this.r3(U.x, U.y, U.z)
            }, t3: function () {
                return this.translate3d.apply(this, arguments), this
            }, translate3dBy: function (u, H) {
                Td(u, Jn(F, F, this.r3(), this.getRotationMode())), this.translate3d(u[0] * H, u[1] * H, u[2] * H)
            }, translateFront: function (J) {
                this.translate3dBy([0, 0, 1], J)
            }, translateBack: function (c) {
                this.translate3dBy([0, 0, -1], c)
            }, translateLeft: function (s) {
                this.translate3dBy([-1, 0, 0], s)
            }, translateRight: function (g) {
                this.translate3dBy([1, 0, 0], g)
            }, translateTop: function (D) {
                this.translate3dBy([0, 1, 0], D)
            }, translateBottom: function (A) {
                this.translate3dBy([0, -1, 0], A)
            }, getPosition3d: function () {
                return [this._position.x, this._54O, this._position.y]
            }, setPosition3d: function (y, M, T) {
                1 === arguments.length && (M = y[1], T = y[2], y = y[0]), this.p(y, T), this.setElevation(M)
            }, translate3d: function (n, H, E) {
                1 === arguments.length && (H = n[1], E = n[2], n = n[0]), this.translate(n, E), this.setElevation(this._54O + H)
            }, getSize3d: function () {
                return [this.getWidth(), this.getTall(), this.getHeight()]
            }, setSize3d: function (O, B, M) {
                1 === arguments.length && (B = O[1], M = O[2], O = O[0]), this.setSize(O, M), this.setTall(B)
            }, getRotation3d: function () {
                return [this._rotationX, -this._64O, this._53O]
            }, setRotation3d: function (e, F, D) {
                1 === arguments.length && (F = e[1], D = e[2], e = e[0]), this.setRotationX(e), this.setRotation(-F), this.setRotationZ(D)
            }, setRotationY: function (x) {
                this.setRotation(-x)
            }, getRotationY: function () {
                return -this._64O
            }, lookAtDirection: function (t, m) {
                m = m || wg;
                var q = this,
                    v = En(t);
                m === wg ? (q.r3([-a(t[1] / v), -D(t[2], t[0]) + N, 0]), q.setRotationMode("xzy")) : m === fm ? (q.r3(0, -D(t[2], t[0]), a(t[1] / v)), q.setRotationMode("zyx")) : m === nq ? (q.r3(0, -D(t[2], t[0]) + W, -a(t[1] / v)), q.setRotationMode("zyx")) : m === $c ? (q.r3([-a(t[1] / v) + N, -D(t[2], t[0]) + N, 0]), q.setRotationMode("xzy")) : m === Kd && (q.r3([-a(t[1] / v) - N, -D(t[2], t[0]) + N, 0]), q.setRotationMode("xzy")), m === Qq && (q.r3([-a(t[1] / v) + W, -D(t[2], t[0]) + N, W]), q.setRotationMode("zxy"))
            }, lookAt: function (c, n) {
                return this.lookAtDirection(fn(c, this.p3()), n)
            }, lookAtX: function () {
                var n = new tl,
                    i = new tl,
                    V = new tl,
                    W = new br,
                    R = new br,
                    r = new gg;
                return function (B, C) {
                    var A = sj(this);
                    if (W.fromArray(A), V.copy(this.p3()), n.copy(B).sub(V), !(n.lengthSq() < 1e-6)) {
                        n.normalize(), C === wg ? i.set(0, 0, 1) : C === Qq ? i.set(0, 0, -1) : C === nq ? i.set(-1, 0, 0) : C === fm ? i.set(1, 0, 0) : C === $c ? i.set(0, 1, 0) : C === Kd && i.set(0, -1, 0), i.applyMatrix4(W).sub(V).normalize();
                        var l = Math.acos(n.dot(i));
                        if (l) {
                            var J = n.clone().cross(i);
                            J.lengthSq() < 1e-6 && (C === $c || C === Kd ? J.set(0, 0, 1).applyMatrix4(W).sub(V) : J.set(0, 1, 0).applyMatrix4(W).sub(V)), J.normalize(), r.set(this.r3(), this.getRotationMode(), !0), W.makeRotationFromEuler(r), R.makeRotationAxis(J, -l), r.setFromRotationMatrix(R.multiply(W)), this.r3([r.x, r.y, r.z])
                        }
                    }
                }
            }(),
            getHost: function () {
                return this._host
            }, setHost: function (h) {
                var w = this;
                if (w !== h && w._host !== h) {
                    var $ = w._host;
                    $ && $._removeAttach(w), w._host = h, w._host && w._host._addAttach(w), w.fp("host", $, h), w.onHostChanged($, h)
                }
            }, getAttaches: function () {
                return this._69O
            }, _addAttach: function (H) {
                var L = this;
                L._69O || (L._69O = new xr), L._69O.add(H), L.fp("attaches", F, H)
            }, _removeAttach: function (M) {
                var X = this;
                X._69O.remove(M), X._69O.isEmpty() && delete X._69O, X.fp("attaches", M, F)
            }, getImage: function () {
                if (this._pendingCheckImageJSON) {
                    var F = u.getImage(this._image);
                    F && (this._pendingCheckImageJSON = !1, this.getParent() instanceof Ff && this.getParent().checkPendingUpdateInfo())
                }
                return this._image
            }, setImage: function (J) {
                var O = this,
                    t = O._image,
                    x = O.getWidth(),
                    r = O.getHeight();
                O._image = J, O.fp("image", t, J) && (null != J && (xl(J) || dk(J) && /\.json$/i.test(J)) && (this._pendingCheckImageJSON = !0), O.fp(ul, x, O.getWidth()), O.fp(Hh, r, O.getHeight()))
            }, getElevation: function () {
                return this._54O
            }, setElevation: function (A) {
                var k = this;
                if (!k._50O) {
                    k._50O = 1;
                    var Y = k._54O;
                    k._54O = A, k.fp(pd, Y, A), delete this._50O
                }
            }, getRotation: function () {
                return this._64O
            }, setRotation: function (T) {
                var v = this;
                if (!v._49O) {
                    v._49O = 1;
                    var N = v._64O;
                    v._64O = T, v.fp(ac, N, T), delete v._49O
                }
            }, getRotationX: function () {
                return this._rotationX
            }, setRotationX: function (Y) {
                var E = this;
                if (!E._51O) {
                    E._51O = 1;
                    var X = E._rotationX;
                    E._rotationX = Y, E.fp("rotationX", X, Y), delete E._51O
                }
            }, getRotationZ: function () {
                return this._53O
            }, setRotationZ: function (e) {
                var H = this;
                if (!H._52O) {
                    H._52O = 1;
                    var Z = H._53O;
                    H._53O = e, H.fp("rotationZ", Z, e), delete H._52O
                }
            }, getPosition: function () {
                return this._position
            }, setPosition: function (X, w) {
                var D = this;
                if (!D._50I) {
                    D._50I = 1;
                    var P;
                    if (P = 2 === arguments.length ? {
                        x: X,
                        y: w
                    } : X, P.x !== D._position.x || P.y !== D._position.y) {
                        var B = D._position;
                        D._position = P, D.fp(pr, B, P)
                    }
                    delete D._50I
                }
            }, translate: function (x, R) {
                var o = this._position;
                this.p(o.x + x, o.y + R)
            }, getWidth: function () {
                var q = this;
                if (q._width >= 0) return q._width;
                var C = q.getStyle("shape3d");
                if (C) {
                    var u = vf(C);
                    if (u && u.rawS3) return u.rawS3[0];
                    if ("billboard" === C || "plane" === C) {
                        var y = ii(q.getStyle("shape3d.image"));
                        return y ? xc(y, q) : 20
                    }
                }
                var y = ii(q._image);
                return y ? xc(y, q) : 20
            }, setWidth: function (y) {
                var G = this,
                    q = G._width;
                G._width = y, G.fp(ul, q, y)
            }, getHeight: function () {
                var u = this;
                if (u._height >= 0) return u._height;
                var B = u.getStyle("shape3d");
                if (B) {
                    var Q = vf(B);
                    if (Q && Q.rawS3) return Q.rawS3[2];
                    if ("plane" === B) {
                        var n = ii(u.getStyle("shape3d.image"));
                        return n ? oo(n, u) : 20
                    }
                    if ("billboard" === B) return 2
                }
                var n = ii(u._image);
                return n ? oo(n, u) : 20
            }, setHeight: function (I) {
                var A = this,
                    c = A._height;
                A._height = I, A.fp(Hh, c, I)
            }, getTall: function () {
                var d = this;
                if (d._tall >= 0) return d._tall;
                var a = d.getStyle("shape3d");
                if (a) {
                    var $ = vf(a);
                    if ($ && $.rawS3) return $.rawS3[1];
                    if ("billboard" === a) {
                        var J = ii(d.getStyle("shape3d.image"));
                        return J ? oo(J, d) : 20
                    }
                    if ("plane" === a) return 2
                }
                return 20
            }, setTall: function (l) {
                var R = this,
                    O = R._tall;
                R._tall = l, R.fp("tall", O, l)
            }, setSize: function (H, r) {
                var N = this;
                2 === arguments.length ? (N.setWidth(H), N.setHeight(r)) : (N.setWidth(H.width), N.setHeight(H.height))
            }, getSize: function () {
                return {
                    width: this.getWidth(),
                    height: this.getHeight()
                }
            }, setRect: function (L, K, f, V, n) {
                var E = this,
                    o = E.getAnchor(),
                    Z = E.getScale();
                arguments.length <= 2 && (n = K, K = L.y, f = L.width, V = L.height, L = L.x);
                var k = n && Z.x < 0 ? 1 - o.x : o.x,
                    y = n && Z.y < 0 ? 1 - o.y : o.y;
                E.p(L + f * k, K + V * y), n && (f /= Math.abs(Z.x), V /= Math.abs(Z.y)), E.setWidth(f), E.setHeight(V)
            }, getMatrix: function () {
                var g = this,
                    T = g._64O,
                    _ = g._position,
                    j = g.getScale();
                return new In(T, _.x, _.y, j.x, j.y)
            }, getAnchorRect: function () {
                var J = this,
                    W = J.getWidth(),
                    m = J.getHeight(),
                    z = J.getAnchor();
                return {
                    x: -W * z.x,
                    y: -m * z.y,
                    width: W,
                    height: m
                }
            }, toLocal: function (j) {
                return this.getMatrix().tfi(j)
            }, toGlobal: function (o) {
                return this.getMatrix().tf(o)
            }, getAttachPosition: function () {
                var F = new In;
                return function (y, T, V, e) {
                    V = V || 0, e = e || 0;
                    var i = this,
                        u = i.getAnchor(),
                        Z = i._64O,
                        s = i._position,
                        P = i.getScale();
                    return F.setFromTransform(Z, s.x, s.y).tf({
                        x: V + P.x * i.getWidth() * (y - u.x),
                        y: e + P.y * i.getHeight() * (T - u.y)
                    })
                }
            }(),
            isInRect: function (P) {
                P = this.toLocal(P);
                var u = this.getWidth(),
                    d = this.getHeight();
                return P.x += u * this.getAnchorX(), P.y += d * this.getAnchorY(), !(P.x < 0 || P.y < 0 || P.x > u || P.y > d)
            }, getRect: function () {
                var R = this,
                    E = R.getWidth(),
                    O = R.getHeight(),
                    e = R.getAnchor(),
                    z = {
                        x: -E * e.x,
                        y: -O * e.y,
                        width: E,
                        height: O
                    },
                    y = R.getMatrix();
                return z = ms([y.tf(z.x, z.y), y.tf(z.x + z.width, z.y), y.tf(z.x + z.width, z.y + z.height), y.tf(z.x, z.y + z.height)])
            }, getAnchorElevation: function () {
                return this._anchorElevation
            }, getAnchor3d: function () {
                var T = this,
                    X = T.getAnchor(),
                    R = T._anchorElevation;
                return {
                    x: X.x,
                    y: R,
                    z: X.y
                }
            }, setAnchorElevation: function (B) {
                var a = this,
                    t = a._anchorElevation;
                return t !== B ? (a._anchorElevation = B, a.fp("anchorElevation", t, B), !0) : !1
            }, setAnchor3d: function (z, X, i, U) {
                var K, d = this;
                "number" == typeof z ? K = {
                    x: z,
                    y: X,
                    z: i
                } : (K = z.length ? {
                    x: z[0],
                    y: z[1],
                    z: z[2]
                } : z, U = X);
                var a = d.getDataModel();
                a && a.beginTransaction();
                var t = d.getAnchor3d(),
                    $ = d.setAnchor(K.x, K.z);
                if (d.setAnchorElevation(K.y) && ($ = !0), $ && U && !aj) {
                    d.getAnchor3d();
                    var J = sj(d),
                        Y = Td([K.x - t.x, K.y - t.y, K.z - t.z], J);
                    d.p3(Y)
                }
                return a && a.endTransaction(), $
            }, getAnchor: function () {
                var U = this;
                if (U.hasOwnProperty("_anchor")) return U._anchor;
                var q = ii(U._image);
                return q && q.anchorX !== Z ? {
                    x: q.anchorX,
                    y: q.anchorY
                } : U._anchor
            }, setAnchor: function (s, E, f) {
                var Y, D = this;
                "number" == typeof s ? Y = {
                    x: s,
                    y: E
                } : (Y = s.length ? {
                    x: s[0],
                    y: s[1]
                } : s, f = E);
                var P = D.getAnchor();
                if (P.x !== Y.x || P.y !== Y.y) {
                    var B = D.getDataModel();
                    if (B && B.beginTransaction(), D._anchor = Y, D.fp("anchor", P, Y), f && !aj) {
                        var m = D.getPosition(),
                            I = D.getSize(),
                            N = D.getRotation(),
                            K = D.getScale(),
                            c = -I.width * (P.x - Y.x) * K.x,
                            d = -I.height * (P.y - Y.y) * K.y,
                            U = n(N),
                            l = k(N);
                        D.setPosition(m.x + l * c - U * d, m.y + U * c + l * d)
                    }
                    return B && B.endTransaction(), !0
                }
                return !1
            }, getScale: function () {
                return this._scale
            }, setScale: function (p, D) {
                var S, R = this;
                S = 2 === arguments.length ? {
                    x: p,
                    y: D
                } : p;
                var l = R.getScale();
                (l.x !== S.x || l.y !== S.y) && (R._scale = S, R.fp("scale", l, S))
            }, getScaleTall: function () {
                return this._scaleTall
            }, getScale3d: function () {
                var $ = this,
                    f = $._scaleTall,
                    m = $.getScale();
                return [m.x, f, m.y]
            }, getFinalScale3d: function () {
                var F = this,
                    G = F.s3(),
                    S = F._dynamicScale3d,
                    v = F.getScale3d();
                return G && (v[0] *= G[0], v[1] *= G[1], v[2] *= G[2]), S && (v[0] *= S[0], v[1] *= S[1], v[2] *= S[2]), v
            }, getFinalRotation3d: function () {
                var Z = this;
                return Z._dynamicRotation || Z.r3()
            }, setScaleTall: function (N) {
                var j = this,
                    F = j._scaleTall;
                F !== N && (j._scaleTall = N, j.fp("scaleTall", F, N))
            }, setScale3d: function (u, d, B) {
                var o, Y = this;
                o = "number" == typeof u ? {
                    x: u,
                    y: d,
                    z: B
                } : u.length ? {
                    x: u[0],
                    y: u[1],
                    z: u[2]
                } : u, Y.setScaleTall(o.y), Y.setScale(o.x, o.z)
            }, getCorners: function (X, u) {
                X == F && (X = 0), u == F && (u = X);
                var p = this,
                    W = p.getAnchor(),
                    C = p.getWidth(),
                    Z = p.getHeight(),
                    y = -C * W.x - X,
                    L = -Z * W.y - u,
                    A = C + 2 * X,
                    z = Z + 2 * u,
                    q = p.getMatrix();
                return [q.tf(y, L), q.tf(y, L + z), q.tf(y + A, L + z), q.tf(y + A, L)]
            }, getEditControlPoints: function (i, l, k) {
                l == F && (l = 0), k == F && (k = l);
                var q = this,
                    r = q.getAnchor(),
                    c = q.getWidth(),
                    S = q.getHeight(),
                    m = -c * r.x - l,
                    p = -S * r.y - k,
                    u = c + 2 * l,
                    R = S + 2 * k;
                if (i) return [{
                    x: m,
                    y: p
                }, {
                    x: m,
                    y: 0
                }, {
                    x: m,
                    y: p + R
                }, {
                    x: 0,
                    y: p + R
                }, {
                    x: m + u,
                    y: p + R
                }, {
                    x: m + u,
                    y: 0
                }, {
                    x: m + u,
                    y: p
                }, {
                    x: 0,
                    y: p
                }];
                var A = q.getMatrix();
                return [A.tf(m, p), A.tf(m, 0), A.tf(m, p + R), A.tf(0, p + R), A.tf(m + u, p + R), A.tf(m + u, 0), A.tf(m + u, p), A.tf(0, p)]
            }, rotateAt: function (g, x, t) {
                var i = this,
                    E = i._position,
                    a = i._64O,
                    M = new In(a, E.x, E.y).tf(g, x),
                    Q = w(g * g + x * x),
                    H = D(E.y - M.y, E.x - M.x) + t;
                i.setRotation(a + t), i.p(M.x + Q * k(H), M.y + Q * n(H))
            }, onParentChanged: function () {
                Dp.superClass.onParentChanged.apply(this, arguments), this._8I()
            }, onPropertyChanged: function () {
                var v = {};
                return "width|height|position|anchor|rotation|scale|s:layout.h|s:layout.v".split("|").forEach(function (B) {
                    v[B] = !0
                }),
                    function (e) {
                        var Y = this;
                        Dp.superClass.onPropertyChanged.call(Y, e), v[e.property] && !Y._layoutUpdating && Y.updateLayoutParameters(null, e.property), Y._69O && Y._69O.each(function (B) {
                            B.handleHostPropertyChange(e)
                        }), Y._49I && Y._49I.each(function (F) {
                            F.fp("agentChange", !0, !1)
                        }), "a:layout" === e.property.substring(0, 8) && this.updateAttach()
                    }
            }(),
            onHostChanged: function () {
                this.updateAttach(), this.updateLayoutParameters()
            }, handleHostPropertyChange: function (e) {
                this.updateAttach(e)
            }, onStyleChanged: function (i) {
                Dp.superClass.onStyleChanged.apply(this, arguments), Zj[i] && this.updateAttach()
            }, updateAttach: function (m) {
                var H = this;
                return aj ? (H.updateLayoutParameters(), void 0) : (H._51I || (H._51I = 1, H._71O(m), delete H._51I), void 0)
            }, _71O: function (U) {
                var r, V, w, c, H, G, x, L, m = this,
                    g = m._host,
                    E = U ? U.property : F,
                    W = U ? U.oldValue : F,
                    S = U ? U.newValue : F;
                if (g instanceof Dp && (x = ii(g.getImage()), x && x.layoutAttach && (L = x.layoutAttach)), U && !Zf[E] && "a:layout" !== E.substring(0, 8) || !L || L(g, this))
                    if (g instanceof O.Grid) {
                        if (E === pd) m.setElevation(m._54O + S - W);
                        else if (!U || ir[E]) {
                            if (r = m.s("attach.row.index"), V = m.s("attach.column.index"), w = g.getCellRect(r, V), !w) return;
                            c = m.s("attach.row.span"), H = m.s("attach.column.span"), (1 !== c || 1 !== H) && (w = ni(w, g.getCellRect(r + c - 1, V + H - 1))), ld(w, m, "attach.padding", 1), m.setRect(w)
                        }
                    } else if (g instanceof Fc && (G = m.s("attach.index")) >= 0 && (!U || zq[E])) {
                        var K = m.s("attach.thickness"),
                            i = g.getScale(),
                            j = Math.max(i.x, i.y);
                        K > 0 && m.setHeight(g.getThickness() * K * j);
                        var s = m.s("attach.offset"),
                            B = g.getPoints(),
                            f = B.size();
                        if (f > G) {
                            var u = g.getPointsMatrix2d(),
                                J = B.get(G),
                                p = f === G + 1 ? B.get(0) : B.get(G + 1);
                            J = u.apply(J), p = u.apply(p);
                            var y = [p.x - J.x, p.y - J.y],
                                M = En(y);
                            if (M) {
                                m.s("attach.offset.relative") && (s *= M), m.s("attach.offset.opposite") && (s = M - s);
                                var Y = {
                                    x: J.x + y[0] / M * s,
                                    y: J.y + y[1] / M * s
                                },
                                    Q = m.s("attach.gap");
                                Q && (m.s("attach.gap.relative") && (Q *= g.getThickness() * j), Y = pc(F, Y, p, Q)), m.p(Y), m.setRotation(D(y[1], y[0]))
                            }
                        }
                    } else U && (E === pr ? m.translate(S.x - W.x, S.y - W.y) : E === pd ? m.setElevation(m._54O + S - W) : Yr[E] ? m._11Q(g, E, S - W) : ("anchor" === E || "width" === E || "height" === E || "scale" === E) && m.layout(g))
            }, _11Q: function () {
                var R = new O.Math.Euler,
                    o = O.Math.Euler.ReverseOrder,
                    p = new O.Math.Vector2,
                    w = new O.Math.Vector2;
                return function (F, C, v) {
                    var Q = this,
                        W = F.p3(),
                        V = F.r3(),
                        H = Q.p3(),
                        E = Q.r3();
                    if (C === ac && (C = "rotationY", v = -v), (C === ac || "rotationY" === C) && 0 === E[0] && 0 === E[2] && 0 === V[0] && 0 === V[2] && 0 === H[1] && 0 === W[1]) return Q.setRotation(-E[1] - v), p.set(H[0], H[2]).rotateAround(w.set(W[0], W[2]), -v), Q.p(p.x, p.y), void 0;
                    var q = il[F.getRotationMode()],
                        x = q[0],
                        n = q[1],
                        b = q[2],
                        Y = Qn[x],
                        K = Qn[n],
                        h = Qn[b],
                        X = kn();
                    C === ac + x ? (h(X, V[Er[b]]), K(X, V[Er[n]]), Y(X, v), K(X, -V[Er[n]]), h(X, -V[Er[b]])) : C === ac + n ? (h(X, V[Er[b]]), K(X, v), h(X, -V[Er[b]])) : C === ac + b && h(X, v);
                    var P = fn(H, W);
                    Td(P, X), Q.p3(W[0] + P[0], W[1] + P[1], W[2] + P[2]);
                    var S = Q.getRotationMode();
                    Cl(X, Q.r3(), S), R.setFromRotationMatrix(X, o(S)), Q.r3([R.x, R.y, R.z])
                }
            }(),
            isHostOn: function (X) {
                var t = this;
                if (t._host && X && X._69O)
                    for (var z = {}, D = t._host; D && D !== t && !z[D._id];) {
                        if (D === X) return !0;
                        z[D._id] = D, D = D._host
                    }
                return !1
            }, isLoopedHostOn: function (k) {
                return this.isHostOn(k) && k.isHostOn(this)
            }, getScaledSize: function () {
                var Y = this.getSize(),
                    W = this.getScale();
                return Y.width *= Math.abs(W.x), Y.height *= Math.abs(W.y), Y
            }, layout: function (d) {
                if (d = d || this.getHost()) {
                    var M = this,
                        A = M.s("layout.h") || "center",
                        $ = M.s("layout.v") || "center";
                    if ("center" !== A || "center" !== $) {
                        var N = new O.Math.Vector2,
                            m = d.getPosition(),
                            f = d.getAnchor(),
                            T = d.getScaledSize();
                        M.getPosition();
                        var a, r, _, i, h, P = 1,
                            p = 1;
                        switch (M._layoutUpdating = !0, A) {
                            case "left":
                                N.setX(M._layoutHValue - f.x * T.width);
                                break;
                            case "right":
                                N.setX((1 - f.x) * T.width - M._layoutHValue);
                                break;
                            case "leftright":
                                a = T.width - M._layoutHValue[2], _ = M.getRotation() - d.getRotation(), i = Math.abs(Math.sin(_)), h = Math.abs(Math.cos(_)), P += h * a / M._layoutHValue[3], p += i * a / M._layoutHValue[4], N.setX(M._layoutHValue[1] + (M._layoutHValue[5] - f.x) * T.width);
                                break;
                            case "center":
                                N.setX((.5 - f.x) * T.width - M._layoutHValue);
                                break;
                            case "scale":
                                _ = M.getRotation() - d.getRotation(), i = Math.abs(Math.sin(_)), h = Math.abs(Math.cos(_)), N.setX((.5 - f.x) * T.width - M._layoutHValue[1] * T.width / M._layoutHValue[0]), r = T.width / M._layoutHValue[2] - 1, P += h * r, p += i * r
                        }
                        switch ($) {
                            case "top":
                                N.setY(M._layoutVValue - f.y * T.height);
                                break;
                            case "bottom":
                                N.setY((1 - f.y) * T.height - M._layoutVValue);
                                break;
                            case "topbottom":
                                _ || (_ = M.getRotation() - d.getRotation(), i = Math.abs(Math.sin(_)), h = Math.abs(Math.cos(_))), a = T.height - M._layoutVValue[2], P += i * a / M._layoutVValue[3], p += h * a / M._layoutVValue[4], N.setY(M._layoutVValue[1] + (M._layoutVValue[5] - f.y) * T.height);
                                break;
                            case "center":
                                N.setY((.5 - f.y) * T.height - M._layoutVValue);
                                break;
                            case "scale":
                                _ || (_ = M.getRotation() - d.getRotation(), i = Math.abs(Math.sin(_)), h = Math.abs(Math.cos(_))), N.setY((.5 - f.y) * T.height - M._layoutVValue[1] * T.height / M._layoutVValue[0]), r = T.height / M._layoutVValue[2] - 1, P += i * r, p += h * r
                        }
                        if ("leftright" === A || "scale" === A || "topbottom" === $ || "scale" === $) {
                            var j = this.getScale(),
                                H = Math.abs(j.x),
                                n = Math.abs(j.y);
                            "leftright" === A || "scale" === A ? M.setSize(M._layoutHValue[3] * P / H, M._layoutHValue[4] * p / n) : M.setSize(M._layoutVValue[3] * P / H, M._layoutVValue[4] * p / n)
                        }
                        N.rotateAround(null, d.getRotation()), this.setPosition(N.x + m.x, N.y + m.y), M._layoutUpdating = Z
                    }
                }
            }, updateLayoutParameters: function (q, B) {
                if (q = q || this.getHost()) {
                    var E = this,
                        G = E.s("layout.h"),
                        W = E.s("layout.v");
                    if (G || W) {
                        var o, w, I, Y, H, Q, z = new O.Math.Vector2,
                            r = q.getPosition(),
                            y = q.getAnchor(),
                            k = q.getScaledSize(),
                            F = E.getPosition(),
                            U = E.getScaledSize();
                        switch (z.set(F.x - r.x, F.y - r.y), z.rotateAround(null, -q.getRotation()), G) {
                            case "left":
                                E._layoutHValue = z.x + y.x * k.width;
                                break;
                            case "right":
                                E._layoutHValue = -z.x + (1 - y.x) * k.width;
                                break;
                            case "center":
                                E._layoutHValue = -z.x + (.5 - y.x) * k.width;
                                break;
                            case "leftright":
                            case "scale":
                                "scale" === G ? o = -z.x + (.5 - y.x) * k.width : (w = E.getAnchor(), I = E.getRotation() - q.getRotation(), Y = Math.cos(I), H = Math.sin(I), Q = -Math.min(-w.x * Y + w.y * H, -w.x * Y - (1 - w.y) * H, (1 - w.x) * Y + w.y * H, (1 - w.x) * Y - (1 - w.y) * H), o = z.x - (Q - y.x) * k.width), "position" === B && "object" == typeof E._layoutHValue ? (E._layoutHValue[0] = k.width, E._layoutHValue[1] = o) : E._layoutHValue = [k.width, o, k.width, U.width, U.height, Q]
                        }
                        switch (W) {
                            case "top":
                                E._layoutVValue = z.y + y.y * k.height;
                                break;
                            case "bottom":
                                E._layoutVValue = -z.y + (1 - y.y) * k.height;
                                break;
                            case "center":
                                E._layoutVValue = -z.y + (.5 - y.y) * k.height;
                                break;
                            case "topbottom":
                            case "scale":
                                "scale" === W ? o = -z.y + (.5 - y.y) * k.height : (I || (w = E.getAnchor(), I = E.getRotation() - q.getRotation(), Y = Math.cos(I), H = Math.sin(I)), Q = -Math.min(-w.x * H - w.y * Y, -w.x * H + (1 - w.y) * Y, (1 - w.x) * H - w.y * Y, (1 - w.x) * H + (1 - w.y) * Y), o = z.y - (Q - y.y) * k.height), "position" === B && "object" == typeof E._layoutVValue ? (E._layoutVValue[0] = k.height, E._layoutVValue[1] = o) : E._layoutVValue = [k.height, o, k.height, U.width, U.height, Q]
                        }
                    }
                }
            }, getSerializableProperties: function () {
                var g = Dp.superClass.getSerializableProperties.call(this);
                return Uh(g, {
                    image: 1,
                    host: 1,
                    rotation: 1,
                    rotationX: 1,
                    rotationZ: 1,
                    rotationMode: 1,
                    position: 1,
                    anchor: 1,
                    anchorElevation: 1,
                    scale: 1,
                    scaleTall: 1,
                    _width: 1,
                    _height: 1,
                    _tall: 1,
                    elevation: 1
                }), g
            }
        });
        var Xg = O.Edge = function ($, G) {
            var S = this;
            fi(Xg, S), S.setSource($), S.setTarget(G)
        };
        ki("Edge", Qp, {
            ms_edge: !0,
            _icon: "edge_icon",
            getUIClass: function () {
                return wn
            }, _22Q: function () {
                return Ip
            }, getSource: function () {
                return this._source
            }, getTarget: function () {
                return this._target
            }, getSourceAgent: function () {
                return this._40I
            }, getTargetAgent: function () {
                return this._41I
            }, canSetSourceTarget: function (Q) {
                if (Q === this) return !1;
                if (Fq(Q)) return !0;
                for (var X, E, a, B, e, A = [this], f = -1, j = 0; j > f;)
                    if (f++, X = A[f], E = X._44I)
                        for (E = E.getArray(), B = 0, e = E.length; e > B; B++)
                            if (a = E[B], Bk(a) && !(A.indexOf(a) >= 0)) {
                                if (a === Q) return !1;
                                A.push(a), j++
                            }
                return !0
            }, setSource: function (B) {
                var h = this;
                if (h._source !== B && h.canSetSourceTarget(B)) {
                    var A = h._source;
                    h._source = B, A && A._16I(h), B && B._2I(h), h._7I(), h.fp("source", A, B)
                }
            }, setTarget: function (M) {
                var C = this;
                if (C._target !== M && C.canSetSourceTarget(M)) {
                    var D = C._target;
                    C._target = M, D && D._18I(C), M && M._4I(C), C._7I(), C.fp("target", D, M)
                }
            }, isLooped: function () {
                var p = this;
                return p._source === p._target && Fq(p._source) && Fq(p._target)
            }, onPropertyChanged: function () {
                var $ = this;
                $._49I && $._49I.each(function (s) {
                    s.fp("agentChange", !0, !1)
                })
            }, _7I: function () {
                var f, y = this,
                    H = Oq(y);
                y._40I !== H && (f = this._40I, f && f._15I(y), y._40I = H, H && H._1I(y), y.fp("sourceAgent", f, H), gi(f, y._41I), gi(H, y._41I));
                var g = xg(y);
                y._41I !== g && (f = y._41I, f && f._17I(y), y._41I = g, g && g._3I(y), y.fp("targetAgent", f, g), gi(f, y._40I), gi(g, y._40I))
            }, _22I: function (D) {
                this._52I = D, this.fp("edgeGroup", !0, !1)
            }, getEdgeGroup: function () {
                return this._52I
            }, isEdgeGroupHidden: function () {
                var J = this;
                return J._52I && J._52I.get(0) !== J && !J.getStyle(kh)
            }, getEdgeGroupSize: function () {
                return this._52I ? this._52I.size() : 1
            }, getEdgeGroupIndex: function () {
                return this._52I ? this._52I.indexOf(this) : 0
            }, isEdgeGroupAgent: function () {
                var z = this,
                    O = z._52I;
                return O && !z.getStyle(kh) && O.size() > 1 && z === O.get(0)
            }, toggle: function () {
                this.beginTransaction();
                var c = this._52I,
                    K = !this.s(kh);
                c && c.size() > 1 && (c.each(function (t) {
                    t.s(kh, K)
                }), c.getSiblings().each(function (t) {
                    t !== c && t.each(function (a) {
                        a.fp("edgeGroup", F, t)
                    })
                })), this.endTransaction()
            }, setStyle: function (b, F) {
                (b === Ei || "edge.segments" === b) && (F = mh(F)), Xg.superClass.setStyle.call(this, b, F)
            }, onStyleChanged: function (V) {
                Xg.superClass.onStyleChanged.apply(this, arguments), Am[V] && gi(this._41I, this._40I)
            }, getSerializableProperties: function () {
                var r = Xg.superClass.getSerializableProperties.call(this);
                return Uh(r, {
                    source: 1,
                    target: 1
                }), r
            }
        });
        var Lc = O.Group = function () {
            fi(Lc, this)
        };
        ki("Group", Dp, {
            _image: "group_image",
            _icon: "group_icon",
            _57O: !1,
            getUIClass: function () {
                return Fn
            }, onChildAdded: function () {
                Lc.superClass.onChildAdded.apply(this, arguments), this._81I()
            }, onChildRemoved: function () {
                Lc.superClass.onChildRemoved.apply(this, arguments), this._81I()
            }, _81I: function () {
                var y = this;
                if (!y._54I && !aj) {
                    var E = y.getChildrenRect();
                    E && (y._53I = 1, y.p(Re(y.s("group.position"), E, y.getSize())), delete y._53I)
                }
            }, getChildrenRect: function () {
                var $, F = this;
                return F.eachChild(function (e) {
                    Fq(e) && ($ = ni($, F.getChildRect(e)))
                }), $
            }, getChildRect: function (P) {
                var a;
                return Fq(P) && P.s(Dm) && (yl(P) && P.isExpanded() && P.eachChild(function (k) {
                    a = ni(a, P.getChildRect(k))
                }), !a && P.getRect && (a = P.getRect())), a
            }, setPosition: function (G, N) {
                var j = this;
                if (!j._54I) {
                    var A;
                    A = 2 === arguments.length ? {
                        x: G,
                        y: N
                    } : G, aj || j._53I || (j._54I = 1, qc(j._children, A.x - j._position.x, A.y - j._position.y), delete j._54I), Lc.superClass.setPosition.call(this, A)
                }
            }, toggle: function () {
                this.setExpanded(!this.isExpanded())
            }, isExpanded: function () {
                return this._57O
            }, setExpanded: function (M) {
                var d = this;
                if (d._57O !== M) {
                    var n = d._57O;
                    d._57O = M, d.fp("expanded", n, d._57O), d._fireInvalidateDeep(), d._8I()
                }
            }, _fireInvalidateDeep: function () {
                this.eachChild(function (H) {
                    yl(H) ? H._fireInvalidateDeep() : H.iv()
                })
            }, _8I: function () {
                Lc.superClass._8I.call(this), this.eachChild(function (y) {
                    Fq(y) && y._8I()
                })
            }, onStyleChanged: function (f) {
                Lc.superClass.onStyleChanged.apply(this, arguments), "group.position" === f && this._81I()
            }, getSerializableProperties: function () {
                var B = Lc.superClass.getSerializableProperties.call(this);
                return B.expanded = 1, B
            }
        });
        var Br = O.Block = function () {
            fi(Br, this), this.s({
                "shadow.cast": !1,
                "shadow.receive": !1
            })
        };
        ki("Block", Dp, {
            _icon: "block_icon",
            _clickThroughEnabled: !1,
            _syncSize: !0,
            ms_ac: ["clickThroughEnabled", "syncSize"],
            getUIClass: function () {
                return Ul
            }, _22Q: function () {
                return rs
            }, onChildAdded: function () {
                Br.superClass.onChildAdded.apply(this, arguments), this.updateFromChildren()
            }, onChildRemoved: function () {
                Br.superClass.onChildRemoved.apply(this, arguments), this.updateFromChildren()
            }, _getBoundingBox: function () {
                function G(x, Y, A) {
                    M.fromArray(sj(Y));
                    var S = Y.getAnchor3d();
                    x.push((new tl).set(0 - S.x, 0 - S.y, 0 - S.z).applyMatrix4(M).applyMatrix4(A)), x.push((new tl).set(0 - S.x, 0 - S.y, 1 - S.z).applyMatrix4(M).applyMatrix4(A)), x.push((new tl).set(0 - S.x, 1 - S.y, 0 - S.z).applyMatrix4(M).applyMatrix4(A)), x.push((new tl).set(0 - S.x, 1 - S.y, 1 - S.z).applyMatrix4(M).applyMatrix4(A)), x.push((new tl).set(1 - S.x, 0 - S.y, 0 - S.z).applyMatrix4(M).applyMatrix4(A)), x.push((new tl).set(1 - S.x, 0 - S.y, 1 - S.z).applyMatrix4(M).applyMatrix4(A)), x.push((new tl).set(1 - S.x, 1 - S.y, 0 - S.z).applyMatrix4(M).applyMatrix4(A)), x.push((new tl).set(1 - S.x, 1 - S.y, 1 - S.z).applyMatrix4(M).applyMatrix4(A))
                }

                function Y(x, N) {
                    var Q = (new br).makeRotationFromEuler(this.getEuler()).setPosition((new tl).fromArray(this.p3()));
                    Q.getInverse(Q), x.forEach(function (A) {
                        Fq(A) && G(N, A, Q)
                    })
                }
                var M = new br;
                return function (g, I) {
                    if (g instanceof Dp && (g = [g]), !g || 0 === g.length) return F;
                    var I = [];
                    Y.call(this, g, I);
                    var E = [1 / 0, 1 / 0, 1 / 0],
                        l = [-1 / 0, -1 / 0, -1 / 0];
                    return I.forEach(function (Q) {
                        E[0] = Math.min(Q.x, E[0]), E[1] = Math.min(Q.y, E[1]), E[2] = Math.min(Q.z, E[2]), l[0] = Math.max(Q.x, l[0]), l[1] = Math.max(Q.y, l[1]), l[2] = Math.max(Q.z, l[2])
                    }), {
                        min: E,
                        max: l
                    }
                }
            }(),
            updateFromChildren: function () {
                var i = this;
                if (!aj && !i._updatingToChildren && i._syncSize && 0 !== i.size() && !i._freezeSyncFromChildren) {
                    var f = this._getBoundingBox(i.toChildren(Fq));
                    if (f) {
                        i._updatingFromChildren = 1;
                        var I = (new tl).fromArray(this.getScale3d()),
                            Z = (new tl).fromArray(f.min),
                            T = (new tl).fromArray(f.max),
                            v = u.blockMinSize,
                            k = new tl,
                            r = T.clone().sub(Z);
                        0 === r.x && k.setX(.5), 0 === r.y && k.setY(.5), 0 === r.z && k.setZ(.5);
                        var S = this._width == F || -1 === this._width,
                            E = new tl(this.getAnchor3d());
                        if (S || this._anchorChanged || !this.s("keepPosition")) {
                            var q = E.clone().multiply(r).add(Z).applyEuler(this.getEuler()).add((new tl).fromArray(this.p3()));
                            this.p3([q.x, q.y, q.z])
                        } else {
                            var y = I.clone().multiply((new tl).fromArray(this.s3())),
                                s = r.clone();
                            0 === s.x && s.setX(v), 0 === s.y && s.setY(v), 0 === s.z && s.setZ(v);
                            var l = E.clone().multiply(y),
                                z = l.clone().multiplyScalar(-1).sub(Z).divide(s).add(l.divide(s)).add(k);
                            this.setAnchor3d(z.x, z.y, z.z)
                        }
                        var c = new tl(1, 1, 1).divide(I).multiply(r);
                        this.s3(Math.abs(c.x), Math.abs(c.y), Math.abs(c.z)), delete i._updatingFromChildren
                    }
                }
            }, setPosition: function (w, J) {
                var c = this;
                if (!c._updatingToChildren) {
                    var x;
                    x = 2 === arguments.length ? {
                        x: w,
                        y: J
                    } : w, aj || c._updatingFromChildren || (c._updatingToChildren = 1, qc(c._children, x.x - c._position.x, x.y - c._position.y), delete c._updatingToChildren), Br.superClass.setPosition.call(this, x)
                }
            }, setSize3d: function () {
                var Y = this.getDataModel();
                Y && Y.beginTransaction(), Br.superClass.setSize3d.apply(this, arguments), Y && Y.endTransaction()
            }, setTall: function (I) {
                var z = this;
                if (!z._updatingToChildren) {
                    var O = z.getDataModel();
                    O && O.beginTransaction(), I = q(I, u.blockMinSize);
                    var w = z.getTall();
                    if (I !== w && Br.superClass.setTall.call(z, I), !aj && !z._updatingFromChildren) {
                        z._updatingToChildren = 1;
                        var B = I / w;
                        z._adjustChildTallOrScale(B, "size"), delete z._updatingToChildren, z.updateFromChildren()
                    }
                    O && O.endTransaction()
                }
            }, setWidth: function (t) {
                return this.setSize(t, this.getHeight())
            }, setHeight: function (O) {
                return this.setSize(this.getWidth(), O)
            }, setSize: function (G, V) {
                var N = u.blockMinSize;
                G = q(G, N), V = q(V, N);
                var a = this;
                if (!a._updatingToChildren) {
                    2 !== arguments.length && (V = G.height, G = G.width);
                    var t = a.getDataModel();
                    t && t.beginTransaction();
                    var v = a.getWidth(),
                        I = a.getHeight();
                    if (G !== v && Br.superClass.setWidth.call(a, G), V !== I && Br.superClass.setHeight.call(a, V), !aj && !a._updatingFromChildren) {
                        a._updatingToChildren = 1;
                        var k = G / v,
                            r = V / I;
                        a._adjustChildScaleOrSize(k, r, "size"), delete a._updatingToChildren, a.updateFromChildren()
                    }
                    t && t.endTransaction()
                }
            }, _adjustChildScaleOrSize: function (C, K, Q) {
                var $ = this;
                if ($._syncSize) {
                    var p = $.getPosition(),
                        s = $.getRotation();
                    $.getScale(), $.eachChild(function (b) {
                        if (Fq(b)) {
                            var g = b.getPosition(),
                                h = b.getRotation(),
                                B = b.getWidth(),
                                S = b.getHeight(),
                                d = b.getScale(),
                                q = d.x * B,
                                o = d.y * S,
                                t = new In(h, g.x, g.y, q, o);
                            t.translate(-p.x, -p.y), t.rotate(-s), h = D(t.b * Math.sign(q), t.a * Math.sign(q)), t.scale(C, K);
                            var E, A, M, L = k(h);
                            if (Math.abs(L) < .001 ? (E = n(h), A = t.b / E, M = -t.c / E) : (A = t.a / L, M = t.d / L), "scale" === Q) b.setScale(A / B, M / S);
                            else if ("size" === Q) {
                                var u = A / d.x,
                                    X = M / d.y;
                                b.setScale(he(A) * Math.abs(d.x), he(M) * Math.abs(d.y)), b instanceof O.Shape ? (b.setWidthForce(Math.max(Math.abs(u), 1e-5)), b.setHeightForce(Math.max(Math.abs(X), 1e-5))) : b.setSize(Math.max(.01, Math.abs(u)), Math.max(.01, Math.abs(X)))
                            }
                            t.rotate(s), t.translate(p.x, p.y), b.setPosition(t.tx, t.ty)
                        }
                    })
                }
            }, _calcChangeFactor: function (B, g, n, h) {
                var d, L, w, G;
                return d = X(B), L = X(n), w = d > L ? d / L : L / d, d = X(g), L = X(h), G = d > L ? d / L : L / d, q(w, G)
            }, setElevation: function (L) {
                var R = this;
                if (!R._updatingToChildren) {
                    var e = R.getElevation(),
                        $ = L - e;
                    0 !== $ && (aj || R._updatingFromChildren || (R._updatingToChildren = 1, qc(R._children, 0, $, 0), delete R._updatingToChildren), Br.superClass.setElevation.apply(R, arguments))
                }
            }, setScaleTall: function (I) {
                var N = this;
                if (!N._updatingToChildren) {
                    var w = N.getScaleTall();
                    if (X(I) < .01 && (I = .01 * (he(I) || he(w))), Br.superClass.setScaleTall.call(N, I), !aj && !N._updatingFromChildren) {
                        N._updatingToChildren = 1;
                        var C = I / w;
                        N._adjustChildTallOrScale(C, "size"), delete N._updatingToChildren, this.updateFromChildren()
                    }
                }
            }, _adjustChildTallOrScale: function (E, n) {
                var c = this;
                if (c._syncSize) {
                    var b = c.getElevation();
                    c.eachChild(function (d) {
                        if (Fq(d))
                            if ("size" === n) {
                                var G = d.getTall();
                                0 > E && d.setScaleTall(-1 * d.getScaleTall()), d.setTall(Math.max(.01, Math.abs(G * E))), d.setElevation(b + (d.getElevation() - b) * E)
                            } else {
                                var q = d.getScaleTall();
                                d.setScaleTall(q * E)
                            }
                    })
                }
            }, setAnchor3d: function () {
                if (!this._updatingToChildren) {
                    var s = this.getDataModel();
                    s && s.beginTransaction();
                    var $ = Br.superClass.setAnchor3d.apply(this, arguments);
                    return $ && !aj && !this._updatingFromChildren && this._syncSize && (this._anchorChanged = 1, this.updateFromChildren(), delete this._anchorChanged), s && s.endTransaction(), $
                }
            }, setAnchor: function () {
                var O = this;
                if (!O._updatingToChildren) {
                    var o = O.getAnchor(),
                        _ = Br.superClass.setAnchor.apply(O, arguments);
                    if (aj || O._updatingFromChildren || !O._syncSize) return _;
                    O._updatingToChildren = 1;
                    var u = O.getAnchor();
                    O.getPosition();
                    var G = O.getSize(),
                        T = O.getScale(),
                        E = O.getRotation(),
                        s = -G.width * T.x * (o.x - u.x),
                        $ = -G.height * T.y * (o.y - u.y),
                        p = n(E),
                        F = k(E),
                        y = F * s - p * $,
                        P = p * s + F * $;
                    return O.eachChild(function (S) {
                        if (Fq(S)) {
                            var Z = S.getPosition();
                            S.setPosition(Z.x - y, Z.y - P)
                        }
                    }), delete O._updatingToChildren, _
                }
            }, setAnchorElevation: function () {
                var Z = this;
                if (!Z._updatingToChildren) {
                    var a = Z.getAnchorElevation(),
                        F = Br.superClass.setAnchorElevation.apply(Z, arguments);
                    if (aj || Z._updatingFromChildren || !Z._syncSize) return F;
                    Z._updatingToChildren = 1;
                    var _ = Z.getAnchorElevation(),
                        W = Z.getTall(),
                        J = Z.getScaleTall(),
                        G = -W * J * (a - _);
                    return Z.eachChild(function (J) {
                        if (Fq(J)) {
                            var N = J.getElevation();
                            J.setElevation(N - G)
                        }
                    }), delete Z._updatingToChildren, F
                }
            }, setRotation: function (G) {
                this._updateChildrenRotation3d("rotation", G)
            }, setRotationX: function (L) {
                this._updateChildrenRotation3d("rotationX", L)
            }, setRotationZ: function (_) {
                this._updateChildrenRotation3d("rotationZ", _)
            }, _updateChildrenRotation3d: function (w, f) {
                var E = this;
                if (!E._updatingToChildren) {
                    var p = E[kp(w)]();
                    if (Br.superClass[tg(w)].call(E, f), !aj && !E._updatingFromChildren) {
                        E._updatingToChildren = 1;
                        var c = f - p;
                        E.eachChild(function (G) {
                            Fq(G) && G._11Q(E, w, c)
                        }), delete E._updatingToChildren
                    }
                }
            }, setScale: function (p, q) {
                var V = this;
                if (!V._updatingToChildren) {
                    null == q && (q = p.y, p = p.x);
                    var S = V.getScale();
                    if (X(p) < .01 && (p = .01 * (he(p) || he(S.x))), X(q) < .01 && (q = .01 * (he(q) || he(S.y))), Br.superClass.setScale.call(V, p, q), !aj && !V._updatingFromChildren) {
                        V._updatingToChildren = 1;
                        var Q = p / S.x,
                            b = q / S.y;
                        V._adjustChildScaleOrSize(Q, b, "size"), delete V._updatingToChildren, V.updateFromChildren()
                    }
                }
            }, getSerializableProperties: function () {
                var o = Br.superClass.getSerializableProperties.call(this);
                return o.clickThroughEnabled = 1, o.syncSize = 1, o
            }
        });
        var pi = O.Grid = function () {
            fi(O.Grid, this)
        };
        ki("Grid", Dp, {
            IRotatable: !1,
            _icon: "grid_icon",
            _image: F,
            getUIClass: function () {
                return _n
            }, setRotation: function () { }, getCellRect: function (E, u) {
                var I = this,
                    S = I.s("grid.row.count"),
                    Y = I.s("grid.column.count");
                if (0 >= S || 0 >= Y || 0 > E || E >= S || 0 > u || u >= Y) return F;
                var G, z, v, g = I.getRect(),
                    N = I.s("grid.row.percents"),
                    b = I.s("grid.column.percents");
                if (ld(g, I, "grid.border", -1), N && N._as && (N = N._as), b && b._as && (b = b._as), N && N.length === S) {
                    for (v = 0, G = 0; E > G; G++) v += g.height * N[G];
                    g.y += v, g.height = g.height * N[E]
                } else g.height = g.height / S, g.y += g.height * E; if (b && b.length === Y) {
                    for (z = 0, G = 0; u > G; G++) z += g.width * b[G];
                    g.x += z, g.width = g.width * b[u]
                } else g.width = g.width / Y, g.x += g.width * u;
                return vn(g, -I.s("grid.gap")), g
            }
        });
        var Lo = O.Text = function () {
            fi(Lo, this), this.setSize(100, 50), this.s("text", "TEXT")
        };
        ki("Text", Dp, {
            _icon: "text_icon",
            _image: "__text__",
            getUIClass: function () {
                return sk
            }, setWidth: function (U) {
                U || (U = .001), Lo.superClass.setWidth.call(this, U)
            }, setHeight: function (J) {
                J || (J = .001), Lo.superClass.setHeight.call(this, J)
            }, toLabel: function () {
                return this._displayName || this._name || this.s("text")
            }
        }), _c("__text__", {
            width: {
                value: 100,
                isSafeFunc: !0,
                func: function (L) {
                    return L ? L._width : 100
                }
            },
            height: {
                value: 50,
                isSafeFunc: !0,
                func: function (T) {
                    return T ? T._height : 50
                }
            },
            comps: [{
                type: "text",
                relative: !0,
                rect: [0, 0, 1, 1],
                text: {
                    func: "style@text"
                },
                align: {
                    func: "style@text.align"
                },
                vAlign: {
                    func: "style@text.vAlign"
                },
                color: {
                    func: "style@text.color"
                },
                font: {
                    func: "style@text.font"
                },
                shadow: {
                    func: "style@text.shadow"
                },
                shadowColor: {
                    func: "style@text.shadow.color"
                },
                shadowBlur: {
                    func: "style@text.shadow.blur"
                },
                shadowOffsetX: {
                    func: "style@text.shadow.offset.x"
                },
                shadowOffsetY: {
                    func: "style@text.shadow.offset.y"
                },
                scaleX: {
                    func: "style@text.scale.x"
                },
                scaleY: {
                    func: "style@text.scale.y"
                }
            }]
        });
        var Fc = O.Shape = function () {
            fi(Fc, this), this._59O = new xr
        };
        Fc.__de__ = zr, ki("Shape", Dp, {
            ms_ac: ["thickness", "closePath"],
            _icon: "shape_icon",
            _thickness: 10,
            _closePath: !1,
            getUIClass: function () {
                return Xp
            }, _22Q: function () {
                return Vp
            }, getLength: function (T) {
                return tj(Yo(this._59O, this._58O, T, this._closePath))
            }, getSegments: function () {
                return this._58O
            }, toSegments: function () {
                var k = this._58O;
                return k ? new xr(k._as.slice(0)) : k
            }, setSegments: function (h) {
                var P = this._58O;
                h = h ? ip(h) ? new xr(h.slice(0)) : new xr(h._as.slice(0)) : null, (P && h && P._as.join(",") !== h._as.join(",") || P !== h) && (this._58O = h, this.fp("segments", P, h))
            }, getPoints: function () {
                return this._59O
            }, toPoints: function () {
                var O = this._59O;
                return new xr(O._as.slice(0))
            }, getPointsMatrix2d: function () {
                var n = this,
                    c = new Rc.Matrix2d,
                    Q = n.getPosition(),
                    t = n.getScale(),
                    z = n.getRotation();
                return c.translate(-Q.x, -Q.y).scale(t.x, t.y).rotate(z).translate(Q.x, Q.y), c
            }, getPointsMatrix3d: function () {
                return function () {
                    var O = this,
                        V = new Rc.Matrix4,
                        p = V.getElements(),
                        L = O.p3();
                    bo(p, L), Cl(p, O.getFinalRotation3d(), O.getRotationMode());
                    var H = O.getScale3d(),
                        Q = O._dynamicScale3d;
                    return Q && (H[0] *= Q[0], H[1] *= Q[1], H[2] *= Q[2]), Bd(p, H), bo(p, Cj(L)), V
                }
            }(),
            setPoints: function (Z, X) {
                var w = this,
                    c = w._59O;
                Z = Z ? ip(Z) ? new xr(Z.slice(0)) : new xr(Z._as.slice(0)) : new xr;
                var D, N, q, T, o, n;
                X && (D = w.getPosition(), n = new In(w.getRotation(), 0, 0, w.getScale().x, w.getScale().y)), (c && Z && c._as.join(",") !== Z._as.join(",") || c !== Z) && (w._59O = Z, w.fs(), w.fp("points", c, Z)), X && (N = w.getPosition(), q = N.x - D.x, T = N.y - D.y, o = n.tf(q, T), w.setPosition(N.x - q + o.x, N.y - T + o.y))
            }, addPoint: function (J, t, M) {
                var z = this.toPoints();
                z.add(J, t), this.setPoints(z, M)
            }, setPoint: function (K, u, k) {
                var P = this.toPoints();
                P.set(K, u), this.setPoints(P, k)
            }, removePointAt: function (t) {
                var R = this.toPoints();
                R.removeAt(t), this.setPoints(R)
            }, setWidthForce: function (T) {
                var U = this;
                if (!U._55I && !aj && U.getWidth()) {
                    U._55I = 1;
                    var V = U._position.x,
                        q = T / U.getWidth(),
                        M = U.toPoints(),
                        s = new xr;
                    1 !== q && (M.each(function (z) {
                        s.add({
                            x: (z.x - V) * q + V,
                            y: z.y,
                            e: z.e
                        })
                    }), U.setPoints(s), ok(U, [q, 0, 0, 1, V * (1 - q), 0]), U.fs()), delete U._55I
                }
                Fc.superClass.setWidth.call(U, T)
            }, setWidth: function (W) {
                return this.setWidthForce(Wp > W ? Wp : W)
            }, setHeightForce: function (i) {
                var R = this;
                if (!R._55I && !aj && R.getHeight()) {
                    R._55I = 1;
                    var o = R._position.y,
                        g = i / R.getHeight(),
                        S = R.toPoints(),
                        h = new xr;
                    1 !== g && (S.each(function (D) {
                        h.add({
                            x: D.x,
                            y: (D.y - o) * g + o,
                            e: D.e
                        })
                    }), R.setPoints(h), ok(R, [1, 0, 0, g, 0, o * (1 - g)]), R.fs()), delete R._55I
                }
                Fc.superClass.setHeight.call(R, i)
            }, setHeight: function (x) {
                return this.setHeightForce(Wp > x ? Wp : x)
            }, setAnchorElevation: function (v) {
                var M = this;
                M._55I = !0;
                var o = M._updatingAnchor3d,
                    x = !aj && !o;
                if (x) {
                    var t, p = v,
                        Z = M.getAnchorElevation(),
                        U = M.getTall();
                    t = U * (Z - p), 0 !== t && M.shiftPointsElevation(t)
                }
                var y = Fc.superClass.setAnchorElevation.apply(M, arguments);
                return o || delete M._55I, y
            }, getShapeElevation: function () {
                var J = this,
                    j = J._54O;
                return j - (J.getTall() || 0) * (J._anchorElevation - .5)
            }, setAnchor3d: function (c, q, X, J) {
                var Z, F = this;
                "number" == typeof c ? Z = {
                    x: c,
                    y: q,
                    z: X
                } : (Z = c.length ? {
                    x: c[0],
                    y: c[1],
                    z: c[2]
                } : c, J = q), F._55I = !0, F._updatingAnchor3d = !0;
                var N = F.getDataModel();
                if (N && N.beginTransaction(), !aj) {
                    var K = F.getAnchor3d(),
                        z = F.getSize(),
                        A = F.getTall(),
                        R = z.width * (K.x - Z.x),
                        n = z.height * (K.z - Z.z),
                        C = A * (K.y - Z.y);
                    J || F.shiftPoints(R, n, C);
                    var V = F.p3()
                }
                var H = Fc.superClass.setAnchor3d.apply(F, arguments);
                if (!aj && J) {
                    var s = F.p3();
                    F.shiftPoints(s[0] - V[0] + R, s[2] - V[2] + n, s[1] - V[1] + C)
                }
                return N && N.endTransaction(), delete F._updatingAnchor3d, delete F._55I, H
            }, setAnchor: function (f, X, n) {
                var j = this;
                j._55I = !0;
                var A = j._updatingAnchor3d,
                    d = !aj && !A;
                if (d) {
                    var E, t, Y;
                    "number" == typeof f ? Y = {
                        x: f,
                        y: X
                    } : (Y = f.length ? {
                        x: f[0],
                        y: f[1]
                    } : f, n = X);
                    var q = j.getAnchor(),
                        Z = j.getSize();
                    E = Z.width * (q.x - Y.x), t = Z.height * (q.y - Y.y), n || j.shiftPoints(E, t);
                    var o = j.getPosition()
                }
                var y = Fc.superClass.setAnchor.apply(j, arguments);
                if (d) {
                    var P = j.getPosition();
                    n && j.shiftPoints(P.x - o.x + E, P.y - o.y + t)
                }
                return A || delete j._55I, y
            }, shiftPoints: function (x, m, s) {
                if (x || m || s) {
                    var Y = this,
                        O = Y.getElevation() || 0,
                        i = Y.toPoints(),
                        v = new xr;
                    i.each(function (t) {
                        var Q = t.e;
                        s && (Q = (Q == F ? O : Q) + s), v.add({
                            x: t.x + x,
                            y: t.y + m,
                            e: Q
                        })
                    }), Y.setPoints(v), Y.fs()
                }
            }, shiftPointsElevation: function (h) {
                return this.shiftPoints(0, 0, h)
            }, setPosition: function (T, X) {
                var U, y = this;
                if (!y._28Q) {
                    if (y._28Q = 1, !y._55I && !aj) {
                        U = 2 === arguments.length ? {
                            x: T,
                            y: X
                        } : T;
                        var f = U.x - y._position.x,
                            m = U.y - y._position.y;
                        if (0 === f && 0 === m) return delete y._28Q, void 0;
                        y._55I = 1, y.shiftPoints(f, m), ok(y, [1, 0, 0, 1, f, m]), delete y._55I
                    }
                    Fc.superClass.setPosition.apply(y, arguments), delete y._28Q
                }
            }, fs: function () {
                this.fireShapeChange()
            }, _70I: function () {
                var y = this;
                if (2 !== y._59O.size()) return !1;
                var F = y._58O;
                return F ? 2 === F.size() && 1 === F.get(0) && 2 === F.get(1) ? !0 : !1 : !0
            }, fireShapeChange: function () {
                var W = this;
                if (!W._55I && !aj) {
                    var N = ms(W._59O);
                    N && (W._55I = 1, W.setRect(N), delete W._55I)
                }
                W.fp(bl, !1, !0)
            }, getSerializableProperties: function () {
                var j = Fc.superClass.getSerializableProperties.call(this);
                return j.segments = 1, j.points = 1, j.thickness = 1, j.closePath = 1, j
            }
        });
        var oj = O.Points = function () {
            fi(oj, this)
        };
        ki("Points", Dp, {
            _22Q: function () {
                return Co
            }, setPoints: function (T) {
                this.points = T, this._pointsDirty = !0, this.fp("points", F, this.points)
            }, setPoint: function (S, h) {
                this.points || (this.points = []), this.points[3 * S] = h[0], this.points[3 * S + 1] = h[1], this.points[3 * S + 2] = h[2], this._pointsDirty = !0, this.fp("points", F, this.points)
            }, setPointsColor: function (B) {
                this.colors = B, this._colorsDirty = !0, this.fp("colors", F, this.colors)
            }, setPointColor: function (i, g) {
                this.colors || (this.colors = []), g ? (g = ns(g), this.colors[3 * i] = g[0], this.colors[3 * i + 1] = g[1], this.colors[3 * i + 2] = g[2]) : (this.colors[3 * i] = Z, this.colors[3 * i + 1] = Z, this.colors[3 * i + 2] = Z), this._colorsDirty = !0, this.fp("colors", F, this.colors)
            }, setPointsSize: function (U) {
                this.sizes = U, this._sizesDirty = !0, this.fp("sizes", F, this.sizes)
            }, setPointSize: function (x, q) {
                this.sizes || (this.sizes = []), this.sizes[x] = q ? q : Z, this._sizesDirty = !0, this.fp("sizes", F, this.sizes)
            }, getPointInfo: function (D) {
                var A = 3 * D,
                    f = this.points;
                if (!f || f[A] === Z || f[A + 1] === Z || f[A + 2] === Z) return null;
                var d = [f[A], f[A + 1], f[A + 2]],
                    Y = this.mat || sj(this),
                    C = [d[0], d[1], d[2]];
                Td(C, Y);
                var x = this.colors;
                return {
                    size: this.sizes && this.size[D] || this.s("points.size"),
                    color: x && x[A] ? [x[A], x[A + 1], x[A + 2]] : this.s("points.color"),
                    local: d,
                    world: C
                }
            }, getSerializableProperties: function () {
                var O = oj.superClass.getSerializableProperties.call(this);
                return O.points = 1, O.colors = 1, O.sizes = 1, O
            }
        });
        var hn = O.Polyline = function () {
            fi(hn, this), this.s({
                "shape.background": null,
                "shape.border.width": 2
            })
        };
        ki("Polyline", Fc, {
            _icon: "polyline_icon",
            _22Q: function () {
                return Ds
            }, getUIClass: function () {
                return Kr
            }, setClosePath: function () { }, setTall: function (m) {
                var f = this,
                    j = f.getDataModel();
                if (j && j.beginTransaction(), !f._55I && !f._24Q && !aj && f.getTall()) {
                    f._24Q = 1;
                    var q = f._54O,
                        S = m / f.getTall();
                    if (1 !== S) {
                        var l = f.toPoints(),
                            _ = new xr;
                        l.each(function (Q) {
                            _.add({
                                x: Q.x,
                                y: Q.y,
                                e: Q.e == F ? Q.e : (Q.e - q) * S + q
                            })
                        }), f.setPoints(_), f.fs()
                    }
                    delete f._24Q
                }
                hn.superClass.setTall.call(f, m), j && j.endTransaction()
            }, setElevation: function (d) {
                var C = this,
                    k = C.getDataModel();
                if (k && k.beginTransaction(), !C._55I && !C._24Q && !aj) {
                    C._24Q = 1;
                    var _ = d - C._54O;
                    0 !== _ && C.shiftPointsElevation(_), delete C._24Q
                }
                hn.superClass.setElevation.apply(C, arguments), k && k.endTransaction()
            }, fireShapeChange: function () {
                var w = this,
                    s = w._59O;
                if (!w._55I && !w._24Q && !aj) {
                    var U = s.size();
                    if (U) {
                        var Q = 1,
                            h = s.get(0),
                            I = w._54O;
                        h.e == F && (h.e = I);
                        for (var o = h.e, g = 0; U > Q; Q++) {
                            h = s.get(Q), h.e == F && (h.e = I);
                            var C = V(o, h.e),
                                k = q(o + g, h.e);
                            o = C, g = k - C
                        }
                        w._24Q = 1, w.setTall(g), w.setElevation(o + g * w._anchorElevation), delete w._24Q
                    }
                }
                hn.superClass.fireShapeChange.apply(w, arguments)
            }
        });
        var zh = O.SubGraph = function () {
            fi(zh, this)
        };
        ki("SubGraph", Dp, {
            ISubGraph: 1,
            _image: "subGraph_image",
            _icon: "subGraph_icon",
            _8I: function () {
                zh.superClass._8I.call(this), this.eachChild(function (G) {
                    Fq(G) && G._8I()
                })
            }
        }), u.loadingRefGraph = 0;
        var Ff = O.RefGraph = function () {
            fi(Ff, this)
        };
        ki("RefGraph", Br, {
            _icon: "refGraph_icon",
            getRef: function () {
                return this._ref
            }, setRef: function (f) {
                var _ = this._ref;
                this._ref = f, this.fp("ref", _, f), this.updateRef()
            }, _21I: function () {
                Ff.superClass._21I.apply(this, arguments), this.updateRef()
            }, updateRef: function () {
                var V = this;
                if (u.loadingRefGraph++, V.clearChildrenFromDataModel(), u.loadingRefGraph--, V._ref && V._dataModel) {
                    V._xhrLoadHandler && (V._xhrLoadHandler.cancel = !0);
                    var a = aj,
                        x = V._xhrLoadHandler = function (I) {
                            if (I && V._dataModel) {
                                u.loadingRefGraph++;
                                var k = V._pendingUpdateInfo = {
                                    needToRestore: a
                                };
                                a && (k.p3 = V.p3(), k.s3 = V.s3(), k.r3 = V.r3(), k.anchor3d = V.getAnchor3d(), k.scale3d = V.getScale3d()), V.r3(0, 0, 0), V.setScale3d(1, 1, 1), V.setAnchor3d(.5, .5, .5), V.p3(0, 0, 0);
                                var B = u.parse(I),
                                    J = V._dataModel.deserialize(B, V, {
                                        justDatas: !0
                                    });
                                J.each(function (Y) {
                                    Y._refGraph = V
                                }), V.checkPendingUpdateInfo(), u.loadingRefGraph--, u.handleRefGraphLoaded(V, J, B)
                            }
                        };
                    x.xhrLoadCalled = !1, u.load(V._ref, function (V) {
                        x.cancel || (x.xhrLoadCalled ? x(V) : $e(function () {
                            x(V)
                        }))
                    }), x.xhrLoadCalled = !0
                }
            }, checkPendingUpdateInfo: function () {
                var D = this,
                    f = D._pendingUpdateInfo;
                if (!f) return D.onPendingUpdated && (u.loadingRefGraph++, D.onPendingUpdated(), u.loadingRefGraph--), void 0;
                var X = !0;
                this.eachChild(function (Q) {
                    (Q._pendingCheckImageJSON || Q._pendingUpdateInfo) && (X = !1)
                }), X && (u.loadingRefGraph++, D._pendingUpdateInfo = null, D.updateFromChildren(), f.needToRestore && (D.setAnchor3d(f.anchor3d), D.setScale3d(f.scale3d), D.r3(f.r3), D.p3(f.p3)), this.getParent() instanceof Ff && this.getParent().checkPendingUpdateInfo(), D.onPendingUpdated && D.onPendingUpdated(), u.loadingRefGraph--)
            }, getSerializableProperties: function () {
                var G = Ff.superClass.getSerializableProperties.call(this);
                return G.ref = 1, G
            }
        }), O.EdgeGroup = function (h, V) {
            this._70O = h, this._siblings = V;
            for (var n, p, d = 0, K = h.size(), y = z[kh]; K > d; d++)
                if (n = h.get(d).getStyle(kh, !1), n != F) {
                    y = n;
                    break
                }
            y == F && (y = !0);
            var t = u.edgeGroupAgentFunc;
            for (t && (p = t(h), p && p !== h.get(0) && (h.remove(p), h.add(p, 0))), d = 0; K > d; d++) h.get(d).s(kh, y)
        }, ki("EdgeGroup", o, {
            getEdges: function () {
                return this._70O
            }, size: function () {
                return this._70O.size()
            }, get: function (N) {
                return this._70O.get(N)
            }, indexOf: function (v) {
                return this._70O.indexOf(v)
            }, each: function ($, p) {
                this._70O.each($, p)
            }, getSiblings: function () {
                return this._siblings
            }, eachSiblingEdge: function ($, T) {
                this._siblings.each(function (W) {
                    W._70O.each($, T)
                })
            }
        });
        var Sk = function (A, C, E) {
            var y = Al[A] = {
                type: A,
                action: C
            };
            if (E)
                for (var O in E) y[O] = E[O]
        };
        Uh(u, {
            setConnectAction: Sk,
            getConnectAction: function (b, Q) {
                if (!Q) {
                    if (!b) return null;
                    Q = b.getCurrentConnectActionType()
                }
                return Al[Q]
            }, doConnectAction: function (W, d, B, H) {
                H = H || W.getCurrentConnectActionType();
                var K = Al[H];
                if (!K) return !1;
                var P = K.action;
                return P ? (d instanceof se.Group ? W.sm().getSelection().each(function (b) {
                    P.call(null, W, b, B)
                }) : P.call(null, W, d, B), !0) : !1
            }, doDeleteConnectionAction: function (W, V, s) {
                s = s || W.getCurrentConnectActionType();
                var X = Al[s];
                if (!X || !X.delete) return !1;
                var v = X.delete.action;
                return v ? (V instanceof se.Group ? W.sm().getSelection().each(function (H) {
                    v.call(null, W, H)
                }) : v.call(null, W, V), !0) : !1
            }
        });
        var dl = O.JSONSerializer = function (I, j) {
            this.dm = this._dataModel = I, this._hierarchical = u.forceHierarchicalSerialization ? !0 : j == F ? I.isHierarchicalRendering() : j
        };
        ki("JSONSerializer", o, {
            ms_ac: ["hierarchical"],
            serialize: function (M) {
                return u.stringify(this.toJSON(), M)
            }, toJSON: function () {
                var U = this,
                    c = U.dm,
                    x = c.getRoots(),
                    g = U.json = {
                        v: u.getVersion(),
                        p: {},
                        a: {},
                        d: []
                    },
                    Y = c.getSerializableAttrs();
                c.getInit() && (g.init = c.getInit()), c.getName() && (g.p.name = c.getName()), c.getBackground() && (g.p.background = c.getBackground()), c.getLayers() && (g.p.layers = c.getLayers()), c.getEnvmap() && (g.p.envmap = c.getEnvmap()), c.isCubicEnvmap() && (g.p.cubicEnvmap = c.isCubicEnvmap()), g.p.autoAdjustIndex = c.isAutoAdjustIndex(), g.p.hierarchicalRendering = c.isHierarchicalRendering();
                for (var H in Y) {
                    var L = c.a(H);
                    L !== Z && U[No](H, L, g.a)
                }
                return wd(g.a) && delete g.a, U._hierarchical ? x.each(U.serializeData, this) : c.each(function (d) {
                    U.serializeData(d)
                }), c.fireSerializeEvent({
                    type: "serialize",
                    json: g
                }), c.getPostProcessingData() && (g.p.postProcessingData = c.getPostProcessingData()), g
            }, isSerializable: function () {
                return !0
            }, getProperties: function (h) {
                return h.getSerializableProperties()
            }, getStyles: function (H) {
                return H.getSerializableStyles()
            }, getAttrs: function (i) {
                return i.getSerializableAttrs()
            }, serializeData: function (v) {
                var g = this;
                if (g.isSerializable(v) && !v._refGraph) {
                    var V, R, Z, q, M = gp(v.getClassName()) || v.getClass(),
                        j = new M,
                        a = {
                            c: v.getClassName(),
                            i: v.getId(),
                            p: {},
                            s: {},
                            a: {}
                        };
                    g.json.d.push(a), V = g.getProperties(v);
                    for (R in V)
                        if (/^_/.test(R)) {
                            if (Z = v[R], !("_width" !== R && "_height" !== R || Z != F && -1 !== Z)) {
                                var x;
                                ((v.s("layout.h") || v.s("layout.v")) && v.getHost() || v instanceof O.Node && (x = v.getParent()) && x instanceof O.Block || v.s("fullscreen")) && (Z = v[R] = "_width" === R ? v.getWidth() : v.getHeight())
                            }
                            Z !== j[R] && g[No](R.substr(1), Z, a.p)
                        } else q = kp(R), v[q] && (Z = v[q](), Z !== j[q]() && g[No](R, Z, a.p));
                    V = g.getStyles(v);
                    for (R in V) Z = v.s(R), Z !== j.s(R) && g[No](R, Z, a.s);
                    V = g.getAttrs(v);
                    for (R in V) Z = v.a(R), Z !== j.a(R) && g[No](R, Z, a.a);
                    wd(a.p) && delete a.p, wd(a.s) && delete a.s, wd(a.a) && delete a.a
                }
                g._hierarchical && v.getChildren().each(g.serializeData, g)
            }, serializeValue: function (q, h, V) {
                Xo(h) ? h = {
                    __a: h._as
                } : h instanceof Qp && (h = {
                    __i: h.getId()
                }), V[q] = h
            }, deserialize: function (X, N, e) {
                var v = this;
                return dk(X) && /.json$/.test(X) ? (u.xhrLoad(X, function (i) {
                    v.deserializeImpl(i, N, e)
                }), void 0) : v.deserializeImpl(X, N, e)
            }, deserializeImpl: function (m, v, q) {
                var d = this,
                    a = d.dm;
                a.setDeserializing(!0), q = El(q) ? {
                    setId: q
                } : Mf(q) ? {
                    finishFunc: q
                } : q || {}, m = d.json = dk(m) ? u.parse(m) : m, !q.justDatas && m.a && m.a.onPreDeserialize && !q.disableOnPreDeserialize && m.a.onPreDeserialize(m, a, q.view), a.beginTransaction(), aj++, d._82I = {};
                var M = new xr,
                    Q = new xr,
                    G = 0,
                    Y = m.d.length;
                if (q.justDatas || (!q.disableInit && Mf(m.init) && m.init(a), a.setInit(m.init)), !q.justDatas) {
                    for (var s in m.a) a.a(s, d[Ij](m.a[s]));
                    for (var j in m.p) a[tg(j)](m.p[j])
                }
                for (; Y > G; G++) {
                    var t = m.d[G],
                        z = gp(t.c),
                        O = new z,
                        U = t.i;
                    q.setId && U != F && (O._id = U), d._82I[U] = O, M.add(O), Q.add(t)
                }
                for (G = 0; Y > G; G++) d.deserializeData(M.get(G), Q.get(G));
                return M.each(function (L) {
                    v && !L.getParent() && L.setParent(v), a.add(L)
                }), q.__innerHandler__ && q.__innerHandler__(m, a, q.view, M), a.fireSerializeEvent({
                    type: "deserialize",
                    json: m
                }), aj--, a.endTransaction(), !q.justDatas && m.a && m.a.onPostDeserialize && !q.disableOnPostDeserialize && m.a.onPostDeserialize(m, a, q.view, M), q.finishFunc && q.finishFunc(m, a, q.view, M), a.setDeserializing(!1), M
            }, deserializeData: function (y, r) {
                for (var Z in r.p) y[tg(Z)](this[Ij](r.p[Z]));
                for (Z in r.s) y.s(Z, this[Ij](r.s[Z]));
                for (Z in r.a) y.a(Z, this[Ij](r.a[Z]))
            }, deserializeValue: function (w) {
                if (xl(w)) {
                    var z = w.__i;
                    if (z != F) return this._82I[z];
                    if (z = w.__a, ip(z)) return new xr(z)
                }
                return w
            }
        }), Uh(jn, {
            serialize: function (A, E) {
                return new dl(this, E).serialize(A)
            }, toJSON: function (c) {
                return new dl(this, c).toJSON()
            }, deserialize: function (K, x, U) {
                return new dl(this).deserialize(K, x, U)
            }
        });
        var Rn = O.OverlappingBox = function (U) {
            this.gv = U, this.boxes = {}
        };
        ki("OverlappingBox", o, {
            clear: function () {
                var T, G, f = this.boxes;
                for (T in f) G = f[T], G.length = 0
            }, isOverlapping: function (C, y) {
                var Y, o, X = this,
                    k = X.boxes,
                    B = k[C];
                B ? (Y = B.rects, o = B.length) : B = k[C] = {
                    rects: Y = [],
                    length: o = 0
                };
                var d, S, y;
                for (d = 0; o > d; d++)
                    if (S = Y[d], S.x < y.x + y.w && S.x + S.w > y.x && S.y < y.y + y.h && S.h + S.y > y.y) return !0;
                return Y.length <= o ? (Y.push(y), B.length++) : Y[B.length++] = y, !1
            }
        }), Uh(u, {
            fetch: function (T, t) {
                var F = "GET",
                    r = !1,
                    _ = null,
                    O = "";
                t && (F = t.method || "GET", r = t.sync, O = t.url, _ = t.data || null), T.open(F, O, !r), t.responseType ? T.responseType = t.responseType : t.overrideMimeType && T.overrideMimeType && T.overrideMimeType(t.overrideMimeType), T.send(_)
            }, convertImageSrc: function (U, Z) {
                Z && "function" == typeof Z || (Z = function () { }), Z(U)
            }
        });
        var De = O.Request = function () {
            this._xhr = new XMLHttpRequest, this._onloadFunc = function () { }, this._errorFunc = function () { }
        };
        ki("Request", o, {
            _responseType: null,
            _overrideMimeType: "text/plain",
            send: function (e) {
                var O = this._xhr,
                    j = this.onload,
                    J = this.onerror;
                this.getResponseType() ? e.responseType = this.getResponseType() : this.getOverrideMimeType() && (e.overrideMimeType = this.getOverrideMimeType()), O.onload = j, O.onerror = J, u.fetch(O, e)
            }, onload: function () { }, onerror: function () { }, getResponseType: function () {
                return this._responseType
            }, setResponseType: function (v) {
                this._responseType = v
            }, getOverrideMimeType: function () {
                return this._overrideMimeType
            }, setOverrideMimeType: function (N) {
                this._overrideMimeType = N
            }, getResponseText: function () {
                var z = this._xhr;
                return z.response || z.responseText
            }
        }), hg.GraphView = function (c) {
            var W = this;
            W._24I = {}, W._34I = new xr, W._25I = {}, W._56I = {}, W._view = ve(1, W), W._canvas = uo(W._view), W.dm(c ? c : new jn), this._coreInteractor = new mq(this), W.setEditable(!1), W.setScrollBarVisible(u.graphViewScrollBarVisible), W._initView()
        }, Bb("GraphView", o, {
            ms_v: 1,
            ms_gv: 1,
            ms_bnb: 1,
            ms_tip: 1,
            ms_dm: 1,
            ms_lp: 1,
            ms_fire: 1,
            ms_sm: 1,
            _49o: 1,
            ms_txy: 1,
            _52o: 1,
            _51o: 1,
            ms_ac: [df, gd, Pi, Ji, "resettable", "editInteractor", Fi, "zoomable", "pannable", "rectSelectable", "autoScrollZone", dj, "movableFunc", "editableFunc", "pointEditableFunc", "rectEditableFunc", "rotationEditableFunc", "anchorEditableFunc", "rectSelectBackground", "rectSelectBorderColor", "editPointSize", "editPointBorderColor", "editPointBackground", "hoverDelay"],
            _zoomable: u.graphViewZoomable,
            _resettable: u.graphViewResettable,
            _pannable: u.graphViewPannable,
            _rectSelectable: u.graphViewRectSelectable,
            _autoScrollZone: u.graphViewAutoScrollZone,
            _rectSelectBackground: u.graphViewRectSelectBackground,
            _rectSelectBorderColor: u.graphViewRectSelectBorderColor,
            _editPointSize: u.graphViewEditPointSize,
            _editPointBorderColor: u.graphViewEditPointBorderColor,
            _editPointBackground: u.graphViewEditPointBackground,
            _scrollBarColor: Ch,
            _scrollBarSize: di,
            _autoHideScrollBar: jr,
            _autoMakeVisible: be,
            _currentActionType: null,
            getCoreInteractor: function () {
                return this._coreInteractor
            }, getLayers: function () {
                return this._dataModel.getLayers()
            }, setLayers: function (d) {
                this._dataModel.setLayers(d)
            }, setEditable: function (Y) {
                var W = this,
                    J = W.__interactorMap__;
                if (!J) {
                    var $ = hg.XEditInteractor;
                    J = W.__interactorMap__ = {
                        scrollBar: new Vl(W),
                        select: new ng(W),
                        edit: $ ? new $(W) : new vm(W),
                        text: new eb(W),
                        move: new Wr(W),
                        "default": new pk(W),
                        touch: new Jb(W, {
                            editable: !1
                        })
                    }
                }
                Y ? (W._uieditable = !0, W.setInteractors([J.scrollBar, J.select, J.edit, J.text, J.move, J.default, J.touch])) : (W._uieditable = !1, W.setInteractors([J.scrollBar, J.select, J.move, J.default, J.touch]))
            }, getCanvas: function () {
                return this._canvas
            }, _33I: function (e) {
                var I = e.getUIClass();
                return I ? new I(this, e) : F
            }, getDataUI: function (m) {
                var H = this,
                    M = H._25I[m._id];
                return M === Z && (M = H._33I(m), H._25I[m._id] = M), M
            }, getNodeRect: function (m) {
                return u.getNodeRect(this, m)
            }, getFullscreenDatas: function () {
                return this._dataModel.getFullscreenDatas()
            }, getEdgeInfo: function (j) {
                var J = this.getDataUI(j);
                return J ? (J._79o(), J._78o) : null
            }, getEdgeSourcePosition: function (l) {
                var F = this,
                    k = F.getDataUI(l),
                    i = k.s,
                    r = k._data._40I;
                return Yg(F, r, i("edge.source.position"), i("edge.source.offset.x"), i("edge.source.offset.y"), i("edge.source.anchor.x"), i("edge.source.anchor.y"))
            }, getEdgeTargetPosition: function (Z) {
                var m = this,
                    R = m.getDataUI(Z),
                    h = R.s,
                    V = R._data._41I;
                return Yg(m, V, h("edge.target.position"), h("edge.target.offset.x"), h("edge.target.offset.y"), h("edge.target.anchor.x"), h("edge.target.anchor.y"))
            }, invalidateAll: function (l) {
                var G = this;
                if (l) {
                    for (var e in G._25I) {
                        var t = G._25I[e];
                        t && t.dispose()
                    }
                    G._25I = {}, G._56I = {}, G._24I = {}, G._34I.clear(), G.redraw()
                } else G.dm().each(function (y) {
                    G.invalidateData(y)
                })
            }, invalidateSelection: function () {
                var k = this;
                k.sm().each(function (S) {
                    k.invalidateData(S)
                })
            }, invalidateData: function ($) {
                var O = this;
                O._24I[$._id] = $, O._21Q($), O.iv()
            }, _21Q: function (G) {
                var o = this,
                    v = o._24I;
                if (Bk(G) && Dc[G.s(ej)]) {
                    var M = G.getSourceAgent();
                    M && M.getAgentEdges().each(function (V) {
                        v[V._id] = V
                    }), M = G.getTargetAgent(), M && M.getAgentEdges().each(function (f) {
                        v[f._id] = f
                    }), o.iv()
                }
            }, redraw: function (s) {
                var d = this;
                d._32I || (s ? d._34I.add(s) : (d._32I = 1, d._34I.clear()), d.iv())
            }, each: function (T, w) {
                var X, $, E, f = 0,
                    A = this.getLayers(),
                    Z = this._dataModel,
                    P = Z._datas._as,
                    q = P.length;
                if (A) {
                    for (var F = A.length; F > f; f++)
                        if (E = A[f], xl(E) && (E = E.name), Z.isHierarchicalRendering()) {
                            var D = function (b) {
                                return b._layer === E ? w ? T.call(w, b) : T(b) : void 0
                            };
                            if (this._dataModel.eachByHierarchical(D) === !1) return
                        } else
                            for (var b = 0; q > b; b++)
                                if (X = P[b], X._layer === E && ($ = w ? T.call(w, X) : T(X), $ === !1)) return
                } else if (Z.isHierarchicalRendering()) this._dataModel.eachByHierarchical(T, null, w);
                else
                    for (; q > f; f++)
                        if (X = P[f], $ = w ? T.call(w, X) : T(X), $ === !1) return
            }, reverseEach: function (L, O) {
                var M, P, e, b, t = this._dataModel,
                    a = t._layers,
                    V = t._datas._as,
                    v = V.length;
                if (a) {
                    for (M = a.length - 1; M >= 0; M--)
                        if (b = a[M], xl(b) && (b = b.name), t.isHierarchicalRendering()) {
                            var o = function (I) {
                                return I._layer === b ? O ? L.call(O, I) : L(I) : void 0
                            };
                            if (t.reverseEachByHierarchical(o) === !1) return
                        } else
                            for (var i = v - 1; i >= 0; i--)
                                if (P = V[i], P._layer === b && (e = O ? L.call(O, P) : L(P), e === !1)) return
                } else if (t.isHierarchicalRendering()) t.reverseEachByHierarchical(L, null, O);
                else
                    for (M = v - 1; M >= 0; M--)
                        if (P = V[M], e = O ? L.call(O, P) : L(P), e === !1) return
            }, getViewRect: function () {
                return this._29I
            }, getContentRect: function () {
                var $ = this,
                    e = $._84I;
                if (!e) {
                    var i = this.dm().a("width"),
                        p = this.dm().a("height");
                    i > 0 && p > 0 ? $._84I = {
                        x: 0,
                        y: 0,
                        width: i,
                        height: p
                    } : ($.each(function (u) {
                        $.isVisible(u) && (e = ni(e, $.getDataUIBounds(u)))
                    }), $._84I = e ? e : nl)
                }
                return $._84I
            }, getScrollRect: function () {
                return ni(this.getContentRect(), this._29I)
            }, makeCenter: function (m, V, G) {
                var h = this;
                if (!h.getWidth() || !h.getHeight()) return G || $e(h.makeCenter, h, [m, V, !0], 500), void 0;
                h.makeVisible(m), h.validate();
                var x = h.getDataUIBounds(m);
                if (x) {
                    var s = h.getWidth(),
                        Q = h.getHeight(),
                        S = x.x + x.width / 2,
                        $ = x.y + x.height / 2,
                        M = -S * h._zoom + s / 2,
                        W = -$ * h._zoom + Q / 2;
                    h.setTranslate(M, W, V)
                }
            }, fitData: function (I, D, R, r, S) {
                var P = this;
                if (!P.getWidth() || !P.getHeight()) return S || $e(P.fitData, P, [I, D, R, r, !0], 500), void 0;
                var N = function () {
                    P.makeVisible(I), P.validate();
                    var x = P.getDataUIBounds(I);
                    x && (x = Pm(x), vn(x, R == F ? 20 : R), P.fitRect(x, D, r))
                };
                D ? u.callWhenLoaded(N) : N()
            }, fitContent: function (A, G, Q, m) {
                var B = this;
                if (!B.getWidth() || !B.getHeight()) return m || $e(B.fitContent, B, [A, G, Q, !0], 500), void 0;
                var R = function () {
                    B.validate();
                    var I = Pm(B.getContentRect());
                    vn(I, G == F ? 20 : G), B.fitRect(I, A, Q)
                };
                A ? u.callWhenLoaded(R) : R()
            }, fitRect: function (i, A, m) {
                var l = this,
                    C = l.getWidth(),
                    G = l.getHeight(),
                    w = i.x + i.width / 2,
                    U = i.y + i.height / 2,
                    q = V(C / i.width, G / i.height),
                    _ = l._zoom,
                    H = -w * _ + C / 2,
                    d = -U * _ + G / 2;
                0 === q || isNaN(q) || (m && (q = V(1, q)), A ? (l._65I && (delete l._65I.finishFunc, l._65I.stop(!0)), l._14o && l._14o.stop(!0), l.setTranslate(H, d, {
                    finishFunc: function () {
                        l.setZoom(q, A)
                    }
                })) : (l.setTranslate(H, d), l.setZoom(q)))
            }, fitSelection: function (N, C, q) {
                var R = this,
                    u = R.sm(),
                    z = null;
                u.size() && (u.each(function (G) {
                    z = ni(R.getDataUIBounds(G), z)
                }), N && vn(z, N), R.fitRect(z, C, q))
            }, toCanvas: function (d, H, P) {
                H = H || this._zoom, this.validateImpl();
                var p = this,
                    R = p.getContentRect();
                P && vn(R, P), R.width || (R.width = 10), R.height || (R.height = 10);
                var G = uo(),
                    i = R.x * H,
                    $ = R.y * H,
                    n = Math.ceil(R.width * H),
                    K = Math.ceil(R.height * H);
                Bn(G, n, K, 1);
                var C = Wd(G);
                return d = d || this._dataModel.getBackground(), d && fl(C, 0, 0, n, K, d), wh(C, -i, -$), C.scale(H, H), p._42(C), C.restore(), G
            }, toDataURL: function (O, G, a, v) {
                return this.toCanvas(O, a, v).toDataURL(G || "image/png", 1)
            }, getClipBounds: function () {
                return this._74O
            }, _42: function (S, z) {
                var H = this,
                    V = H.dm().getBackground();
                if (V) {
                    var $ = H.dm().a("width"),
                        N = H.dm().a("height");
                    $ > 0 && N > 0 && fl(S, 0, 0, $, N, V)
                }
                var R = H.__htmlOrderList,
                    r = [],
                    K = H._forcedLayoutHTML;
                if (H._93db(S, z), H.each(function (A) {
                    var N = H.getDataUI(A);
                    if (N) {
                        var Y = H._56I[A._id],
                            t = N._htmlView;
                        if (Y) {
                            var L = N._79o();
                            if (t = N._htmlView, O.HtmlNode && A instanceof O.HtmlNode) N._42(S);
                            else {
                                var c = H.getViewRect(),
                                    T = t && t.layoutHTML;
                                !z || Kj(z, L) ? (T && (t.layoutHTML(), N.__outerLayout && delete N.__outerLayout), N._42(S)) : Kj(c, L) || !T || N.__outerLayout && !K || (t.layoutHTML(), N.__outerLayout = !0)
                            }
                        }
                        t && (r.push(t), t.getView && (t = t.getView()), t.style.display = Y ? "block" : Jc)
                    }
                }), R && r.length > 0) {
                    var P = !1;
                    if (R.length !== r.length) P = !0;
                    else
                        for (var I = 0; I < r.length; I++)
                            if (r[I] !== R[I]) {
                                P = !0;
                                break
                            }
                    P && (r.forEach(function (L) {
                        L.autoAdjustIndex !== !1 && H.appendHTML(L, !0)
                    }), this.__htmlOrderList = r)
                } else this.__htmlOrderList = r;
                H._92db(S, z)
            }, validateImpl: function () {
                this.tryUpdateRootData();
                var H, D, S, v, X, Q = this,
                    F = Q.tx(),
                    z = Q.ty(),
                    R = Q._zoom,
                    f = Q._canvas,
                    i = this.getWidth(),
                    y = this.getHeight(),
                    h = Q._29I,
                    C = {
                        x: -F / R,
                        y: -z / R,
                        width: i / R,
                        height: y / R
                    },
                    d = {},
                    Y = Q._34I,
                    W = Q._24I,
                    l = Q._32I,
                    Z = Q._23I;
                Q._24I = {}, (i !== f.clientWidth || y !== f.clientHeight) && (Bn(f, i, y), l = 1, Q._forcedLayoutHTML = 1), l || jg(C, h) || (l = 1, Q._forcedLayoutHTML = 1), Q._29I = C, Q.each(function (l) {
                    D = l._id;
                    var n = d[D] = Q.isVisible(l);
                    n !== Q._56I[D] && (W[D] = l, S = Q.getDataUI(W[D]), S && S._84o(n), Q._84o(l, n))
                }, Q);
                for (D in W) S = Q.getDataUI(W[D]), S && (!l && Q._56I[D] && (X = S._79o(), X && Y.add(X)), S.invalidate()), Q._83I = 1;
                if (Q._56I = d, !l)
                    for (D in W) d[D] && (S = Q.getDataUI(W[D]), S && (X = S._79o(), X && Y.add(X)));
                if (l ? v = C : (Y.each(function (D) {
                    Kj(C, D) && (v = ni(v, D))
                }), v && (vn(v, q(1, 1 / R)), v.x = T(v.x * R) / R, v.y = T(v.y * R) / R, v.width = s(v.width * R) / R, v.height = s(v.height * R) / R, v = ro(C, v))), Q._74O = v, v) {
                    H = Wd(f);
                    var I = v.x,
                        k = v.y,
                        P = v.width,
                        U = v.height;
                    I = Math.floor((I * R + F) * ij), k = Math.floor((k * R + z) * ij), P = Math.ceil(P * R * ij) + 1, U = Math.ceil(U * R * ij) + 1, l || (v.x = (I / ij - F) / R, v.y = (k / ij - z) / R, v.width = P / ij / R, v.height = U / ij / R), H.beginPath(), H.rect(I, k, P, U), H.clip(), H.clearRect(I, k, P, U), tf(H, F, z, R), Q._42(H, v), H.restore(), delete Q._74O
                }
                if (Y.clear(), delete Q._32I, delete Q._forcedLayoutHTML, Z && i > 0 && y > 0) {
                    var S = Q.getDataUI(Z);
                    if (S) {
                        var X = S._79o(),
                            p = Q._29I,
                            J = p.x,
                            O = p.y,
                            K = p.width,
                            E = p.height,
                            R = Q._zoom;
                        X && !Kj(X, p) && (X.x + X.width < J && Q.tx(-X.x * R), X.x > J + K && Q.tx(-(X.x + X.width - K) * R), X.y + X.height < O && Q.ty(-X.y * R), X.y > O + E && Q.ty(-(X.y + X.height - E) * R))
                    }
                    delete Q._23I
                }
                Q._83I && (delete Q._83I, delete Q._84I), Q._98O(), Q.countFrame(), wd(Q._24I) || $e(Q.iv, Q)
            }, isValidGuideLineSource: function () {
                return !0
            }, tryUpdateRootData: function () {
                if (!this._rootDataUpdating) {
                    this._rootDataUpdating = !0;
                    var z, x = this.getFullscreenDatas();
                    for (var s in x) z = x[s], this.scaleRootData(z);
                    this._rootDataUpdating = !1
                }
            }, scaleRootData: function (_) {
                var E = _.s("fullscreen");
                if ("uniform" === E || "fill" === E) {
                    _.getRotation() && _.setRotation(0);
                    var v = _.s("fullscreen.gap") || 0,
                        f = this.getWidth(),
                        X = this.getHeight();
                    if (f && X) {
                        var a, A, L, r = f - 2 * v,
                            x = X - 2 * v,
                            z = _.getAnchor(),
                            u = _.getScaledSize(),
                            Y = u.width,
                            O = u.height,
                            J = _.s("fullscreen.lock");
                        if (J) return "uniform" === E ? r / x > Y / O ? (a = x / O, Y = O * r / x) : (a = r / Y, O = Y * x / r) : "v" === J ? (a = x / O, Y = r / a, _.getWidth() !== Y && _.setWidth(Y)) : (a = r / Y, O = x / a, _.getHeight() !== O && _.setHeight(O)), this.setZoom(a), A = v - (_.getX() - z.x * Y) * a, L = v - (_.getY() - z.y * O) * a, A !== this.tx() && this.tx(A), L !== this.ty() && this.ty(L), void 0;
                        A = this.tx(), L = this.ty(), a = this._zoom;
                        var P = {
                            x: (-A + v) / a,
                            y: (-L + v) / a,
                            width: r / a,
                            height: x / a
                        };
                        if ("uniform" === E) {
                            var w = Y / O,
                                j = Math.min(P.width, P.height * w),
                                k = j / w;
                            P.x += .5 * (P.width - j), P.y += .5 * (P.height - k), P.width = j, P.height = k
                        }
                        r = P.width / _.getScaleX(), x = P.height / _.getScaleY(), (_.getWidth() != r || _.getHeight() !== x) && _.setSize(r, x);
                        var l = P.x + z.x * P.width,
                            n = P.y + z.y * P.height,
                            H = _.getPosition();
                        (l !== H.x || n !== H.y) && _.setPosition(l, n)
                    }
                }
            }, isScrollBarVisible: function () {
                return !!this._79O
            }, setScrollBarVisible: function (w) {
                var m = this;
                w !== m.isScrollBarVisible() && (w ? (sn(m._view, m._79O = dd()), sn(m._79O, m._27I = dd()), sn(m._79O, m._28I = dd())) : (yj(m._79O), delete m._79O, delete m._27I, delete m._28I), m.fp("scrollBarVisible", !w, w))
            }, getDebugTip: function () {
                return ""
            }, showScrollBar: function () {
                var c = this;
                c._79O && (c._85I || (cd(function () {
                    c._86I()
                }, Lg), c.iv()), c._85I = new Date)
            }, _86I: function () {
                var i = this;
                if (i._85I) {
                    var C = new Date,
                        d = C.getTime();
                    d - i._85I.getTime() >= Lg ? (delete i._85I, i.iv()) : cd(function () {
                        i._86I()
                    }, Lg)
                }
            }, getVScrollBar: function () {
                return this._27I
            }, getHScrollBar: function () {
                return this._28I
            }, _98O: function () {
                var K = this,
                    N = this._27I,
                    B = this._28I;
                if (K._79O) {
                    if (K._autoHideScrollBar && !K._85I) return N.style.visibility = fc, B.style.visibility = fc, void 0;
                    var D = K.getScrollBarColor(),
                        Y = K._zoom,
                        M = K.getScrollBarSize(),
                        u = K.getViewRect(),
                        I = K.getScrollRect(),
                        Z = u.height * Y,
                        h = I.height * Y,
                        T = u.width * Y - M - 2,
                        F = Z * ((u.y - I.y) * Y / h),
                        J = Z * (Z / h),
                        R = N.style;
                    h - .5 > Z ? (un > J && (F = F + J / 2 - un / 2, 0 > F && (F = 0), F + un > Z && (F = Z - un), J = un), qp(N, T, F, M, J), R.visibility = Pd, R.background = D, R.borderRadius = M / 2 + oe) : R.visibility = fc;
                    var A = u.width * Y,
                        o = I.width * Y,
                        F = u.height * Y - M - 2,
                        T = A * ((u.x - I.x) * Y / o),
                        z = A * (A / o),
                        R = B.style;
                    o - .5 > A ? (un > z && (T = T + z / 2 - un / 2, 0 > T && (T = 0), T + un > A && (T = A - un), z = un), qp(B, T, F, z, M), R.visibility = Pd, R.background = D, R.borderRadius = M / 2 + oe) : R.visibility = fc
                }
            }, setDataModel: function (H) {
                var d = this,
                    g = d._dataModel,
                    f = d._selectionModel;
                g !== H && (g && (g.ump(d.handleDataModelPropertyChange, d), g.umm(d.handleDataModelChange, d), g.umd(d.handleDataPropertyChange, d), g.removeIndexChangeListener(d._75O, d), g.removeHierarchyChangeListener(d.handleHierarchyChange, d), f || g.sm().ums(d.handleSelectionChange, d)), d._dataModel = H, H.mp(d.handleDataModelPropertyChange, d), H.mm(d.handleDataModelChange, d), H.md(d.handleDataPropertyChange, d), H.addIndexChangeListener(d._75O, d), H.addHierarchyChangeListener(d.handleHierarchyChange, d), f ? f._21I(H) : H.sm().ms(d.handleSelectionChange, d), d.invalidateAll(!0), d.fp(uk, g, H), d.updateBackground())
            }, getLayersInfo: function () {
                if (this._layersInfo === Z) {
                    var B = this.getLayers();
                    B ? (this._layersInfo = {}, B.forEach(function (l) {
                        var D = xl(l) ? l.name : l;
                        this._layersInfo[D] = l
                    }, this)) : this._layersInfo = null
                }
                return this._layersInfo
            }, calculateEdgePosition: function (J, V, Z) {
                var p, G, C = this,
                    e = C.getDataUI(J),
                    k = qm(e),
                    W = Tn(V, function (f) {
                        return np(k, 100 * f)
                    }, 100, .001),
                    F = np(k, 100 * W);
                if (!Z) {
                    var L = Kk(e),
                        g = new Xi(F.x, F.y),
                        D = 49 / (C._zoom * C._zoom);
                    for (p = 0, G = L.length; G > p; p++)
                        if (g.distanceToSquared(L[p]) < D) return {
                            index: p,
                            point: L[p],
                            distance: Math.sqrt((L[p].x - V.x) * (L[p].x - V.x) + (L[p].y - V.y) * (L[p].y - V.y))
                        }
                }
                return {
                    percent: W,
                    point: F,
                    distance: Math.sqrt((F.x - V.x) * (F.x - V.x) + (F.y - V.y) * (F.y - V.y))
                }
            }, calculateAttachPoint: function () {
                var R = new Xi,
                    D = new Xi,
                    B = new Xi;
                return function (z, V) {
                    var u = this.getAttachPoints(z);
                    if (!u || !u.length) return null;
                    B.set(V.x, V.y);
                    for (var W, E, H, s, O, h = 1 / 0, A = 0, $ = u.length; $ > A; A++) H = u[A], D.x = H.x, D.y = H.y, R.x = H.offsetX || 0, R.y = H.offsetY || 0, s = Yg(this, z, 0, R.x, R.y, D.x, D.y), E = B.distanceToSquared(s), h > E && (W = A, h = E, O = s);
                    h = Math.sqrt(h);
                    var l = this.getAttachStyle(z);
                    if ("close" === l) {
                        var m = z.s("attach.close.threshold") / this._zoom;
                        if (h > m) return null
                    }
                    return {
                        index: W,
                        distance: h,
                        info: u[W],
                        point: O
                    }
                }
            }(),
            getAttachPoints: function (J) {
                var d = J.s("attach.points");
                if (d) return d;
                var b = ii(J._image);
                return b ? Dj(b.attachPoints, J, this) || null : void 0
            }, getAttachStyle: function (w) {
                var u = w.s("attach.style");
                if (u) return u;
                var f = ii(w._image);
                return f ? Dj(f.attachStyle, w, this) || "close" : void 0
            }, updateLayers: function () {
                this._layersInfo = Z, this.invalidateSelection(), this.redraw()
            }, updateBackground: function () {
                var g = this.dm().a("width"),
                    V = this.dm().a("height");
                this._canvas.style.background = g > 0 && V > 0 ? "" : this.dm().getBackground() || ""
            }, handleDataModelPropertyChange: function (n) {
                if ("background" === n.property) {
                    var i = this._canvas.style.background,
                        e = n.newValue || "";
                    this.updateBackground(), this.fp("canvasBackground", i, e), this.redraw()
                } else "a:width" === n.property || "a:height" === n.property ? (this._83I = 1, this.updateBackground(), this.redraw()) : "layers" === n.property ? this.updateLayers() : "hierarchicalRendering" === n.property && this.redraw()
            }, handleDataPropertyChange: function (P) {
                this.dm().isHierarchicalRendering() && "parent" === P.property && P.data.hasChildren() && this.redraw(), this.invalidateData(P.data)
            }, onPropertyChanged: function (M) {
                var L = this,
                    n = M.property;
                if (L.redraw(), "zoom" === n) {
                    var Y = L.sm().getSelection();
                    Y.size() && Y.each(function (N) {
                        N.invalidate()
                    })
                } else "dataModel" === n && (L._83I = 1);
                Jd[n] ? L.showScrollBar() : n === Fi && L.onCurrentSubGraphChanged(M)
            }, onCurrentSubGraphChanged: function () {
                this.sm().cs(), this.reset()
            }, handleDataModelChange: function (O) {
                var T = this,
                    R = O.kind,
                    A = O.data;
                if (T._83I = 1, "add" === R) T.invalidateData(A), Bk(A) && A.getEdgeGroup() && A.getEdgeGroup().eachSiblingEdge(T.invalidateData, T);
                else if (R === Ce) {
                    T._21Q(A);
                    var g = A._id,
                        n = T._25I[g];
                    if (n) {
                        if (T._56I[g]) {
                            var v = n._79o();
                            v && T.redraw(v)
                        }
                        n.dispose(), delete T._25I[g], delete T._24I[g], delete T._56I[g]
                    }
                    A === T._currentSubGraph && T.setCurrentSubGraph(F)
                } else R === Tg && (T.invalidateAll(!0), T.setCurrentSubGraph(F))
            }, _75O: function (n) {
                this.invalidateData(n.data)
            }, handleHierarchyChange: function (A) {
                this.dm().isHierarchicalRendering() && A.data.hasChildren() && this.redraw(), this.invalidateData(A.data)
            }, adjustIndex: function (P) {
                var $ = this;
                if ($.isVisible(P)) {
                    $.dm().beginTransaction();
                    for (var J = P; J._parent && $.isVisible(J._parent);) J = J._parent;
                    J && J !== P && $._dataModel.adjustIndex(J), $._dataModel.adjustIndex(P), $.dm().endTransaction()
                }
            }, getImage: function (r) {
                return r.getImage ? r.getImage() : Z
            }, getSelectWidth: function (Z) {
                var j = ii(this.getImage(Z));
                return j && Dj(j.disableSelectedBorder, Z, this) ? 0 : Z.s("select.width")
            }, getSelectColor: function (t) {
                return t.s("select.color")
            }, isSelectable: function (o, d) {
                if (this.isSelected(o)) return !0;
                if (!d && o.getParent() instanceof Br && this.isSelectable(o.getParent(), !0) && o.getParent().isSyncSize()) return !1;
                var y = this.getLayersInfo();
                if (y) {
                    var L = y[o._layer];
                    if (L && L.selectable === !1) return !1
                }
                return o.s("2d.selectable") && this.sm().isSelectable(o)
            }, isMovable: function (b) {
                var O = this;
                if (Bk(b) && b.getStyle(ej) !== _b) return !1;
                var p = this.getLayersInfo();
                if (p) {
                    var w = p[b._layer];
                    if (w && w.movable === !1) return !1
                }
                return b.s("2d.movable") ? O._movableFunc ? O._movableFunc(b) : !0 : !1
            }, isEditable: function (A) {
                var H = this;
                if (O._uiSerializing) return H._uieditable;
                if (!H._editInteractor || !H.isSelected(A)) return !1;
                if (yl(A)) {
                    var W = H.getDataUI(A);
                    if (!W || W._88I) return !1
                }
                if (Bk(A) && A.getStyle(ej) !== _b) return !1;
                var t = this.getLayersInfo();
                if (t) {
                    var w = t[A._layer];
                    if (w && w.editable === !1) return !1
                }
                return A.s("2d.editable") ? H._editableFunc ? H._editableFunc(A) : !0 : !1
            }, handleDelete: function () {
                this._editInteractor && (this._editInteractor.handleDelete ? this._editInteractor.handleDelete() : this.removeSelection())
            }, isPointEditable: function (x) {
                return Fq(x) && 0 !== x.getRotation() ? !1 : this._pointEditableFunc ? this._pointEditableFunc(x) : !0
            }, isRectEditable: function (I) {
                return this._rectEditableFunc ? this._rectEditableFunc(I) : !0
            }, isAnchorEditable: function (g) {
                return this._anchorEditableFunc ? this._anchorEditableFunc(g) : !0
            }, isRotationEditable: function (s) {
                return s.setRotation && s.IRotatable !== !1 ? this._rotationEditableFunc ? this._rotationEditableFunc(s) : !0 : !1
            }, isSourceTargetEditable: function () {
                return !0
            }, getRotationPoint: function (c) {
                var Y = c.getAnchor(),
                    K = c.getScale(),
                    w = this._zoom,
                    M = Go(c.getRotation(), 0, -c.getHeight() * K.y * Y.y - (K.y < 0 ? -1 : 1) * (nf ? 32 : 16) / w),
                    m = c.p();
                return M.x += m.x, M.y += m.y, M
            }, getLogicalPoint: function (P) {
                var y = this;
                return Nm(P, y._canvas, y.tx(), y.ty(), y._zoom, y._zoom)
            }, getScreenPoint: function (_, C) {
                var i, s = this;
                return "object" == typeof _ ? _.x !== Z ? (i = _.x, C = _.y) : (i = _[0], C = _[1]) : i = _, Qo(i, C, s._canvas, s.tx(), s.ty(), s._zoom, s._zoom)
            }, getSelectedDataAt: function (T) {
                var A = this;
                return this.getDataAt(T, function (w) {
                    return A.isSelected(w)
                })
            }, getDataInfoAt: function (c, o, J) {
                var u, b = this.lp(c),
                    a = this.getDataAt(b, o, J);
                if (a) {
                    var Y = this.getDataUI(a);
                    u = {
                        data: a,
                        ui: Y,
                        point: b
                    };
                    var e = Y._38o;
                    if (e) {
                        var W = e.icons;
                        for (var T in W) {
                            var f = W[T],
                                x = e.rects[T];
                            if (x)
                                for (var P = Dj(f.names, a, this), p = P ? P.length : 0, i = x.rotation, O = p - 1; O >= 0; O--) {
                                    var z = P[O],
                                        B = x[O];
                                    if (cf(B, b, i)) return u.part = "icons", u.name = T, u.icon = z, u.rect = B, u.index = O, u.rotation = i, u
                                }
                        }
                    }
                    if (this.isNoteVisible(a)) {
                        if (Y.note2Info && cf(Y.note2Info.clickRect, b, F, Y.note2Info.scale)) return u.part = "note2", u;
                        if (Y.noteInfo && cf(Y.noteInfo.clickRect, b, F, Y.noteInfo.scale)) return u.part = "note", u
                    }
                    if (this.isLabelVisible(a)) {
                        if (Y.label2Info && cf(Y.label2Info.rect, b, Y.label2Info.rotation, Y.label2Info.scale)) return u.part = "label2", u;
                        if (Y.labelInfo && cf(Y.labelInfo.rect, b, Y.labelInfo.rotation, Y.labelInfo.scale)) return u.part = "label", u
                    }
                    if (a.isInRect && a.isInRect(b)) return u.part = "body", u
                }
                return u
            }, getDataAt: function (h, o, M) {
                h.target && (h = this.lp(h));
                var k, E = this._zoom;
                return this.reverseEach(function (z) {
                    return (o ? o(z) : this.isSelectable(z)) && this.rectIntersects(z, Cc(h.x, h.y, M, E)) ? (k = z, !1) : void 0
                }, this), k
            }, getIconInfoAt: function (q, j) {
                var C = this;
                if (q.target && (q = C.lp(q)), j || (j = C.getDataAt(q)), j) {
                    var h = C.getDataUI(j);
                    if (h && h._38o) {
                        var G, V = h._38o,
                            x = new xr;
                        for (G in V.icons) x.add(G);
                        for (var K = x.size() - 1; K >= 0; K--) {
                            G = x.get(K);
                            for (var d = V.rects[G], M = d.rotation, t = d.length - 1; t >= 0; t--) {
                                var b = d[t],
                                    P = b.width,
                                    Z = b.height,
                                    e = {
                                        x: q.x - b.x - P / 2,
                                        y: q.y - b.y - Z / 2
                                    };
                                M != F && (e = Go(-M, e.x, e.y));
                                var b = {
                                    x: -P / 2,
                                    y: -Z / 2,
                                    width: P,
                                    height: Z
                                };
                                if (cf(b, e)) return {
                                    key: G,
                                    index: t,
                                    name: V.icons[G].names[t],
                                    rect: d[t],
                                    point: q,
                                    rotation: M,
                                    relativeRect: b,
                                    relativePoint: e,
                                    data: j
                                }
                            }
                        }
                    }
                }
                return F
            }, getDatasInRect: function (P, D, N) {
                N === Z && (N = 1);
                var h = this,
                    p = new xr;
                return h.reverseEach(function ($) {
                    N && !h.isSelectable($) || (D ? h.rectIntersects($, P) : h.rectContains($, P)) && p.add($)
                }), p
            }, moveSelection: function (m, a) {
                var u = this;
                u.dm().beginTransaction(), qc(u.sm().toSelection(u.isMovable, u), m, a), u.dm().endTransaction()
            }, moveDatas: function (h, G, p) {
                var U = this;
                U.dm().beginTransaction(), h instanceof xr || (h = new xr(h)), qc(h, G, p), U.dm().endTransaction()
            }, getDataUIBounds: function (w) {
                var U = this.getDataUI(w);
                return U ? U._79o() : F
            }, drawData: function (K, w, X) {
                var u = this.getDataUI(w);
                if (u) {
                    var s = u._79o();
                    (!X || Kj(X, s)) && (u._42(K), w instanceof O.Block && w.eachChild(function (N) {
                        this.isVisible(N) && this.drawData(K, N, X)
                    }, this))
                }
            }, getBoundsForGroup: function (n) {
                return n.s(Dm) ? this.getDataUIBounds(n) : F
            }, isPixelPerfect: function (o) {
                return o.s("pixelPerfect")
            }, rectIntersects: function (f, r) {
                this.validate();
                var P = F;
                if (this._56I[f._id]) {
                    var Y = this._25I[f._id];
                    if (Y) {
                        var a = Y._79o();
                        if ($k(r, a)) P = !0;
                        else if ((r = ro(r, a)) && (Y.rectIntersects && (P = Y.rectIntersects(r)), P == F)) {
                            if (!this.isPixelPerfect(f)) return !0;
                            var D = r.x,
                                O = r.y,
                                T = r.width,
                                B = r.height,
                                U = this._zoom,
                                y = u.hitMaxArea,
                                c = T * B * U * U;
                            if (c > y) {
                                var i = Math.sqrt(y / c);
                                U *= i
                            }
                            T *= U, B *= U, 2 > T && (T = 2), 2 > B && (B = 2), D *= U, O *= U;
                            var R = Cr(T, B);
                            wh(R, -D, -O), R.scale(U, U), this._drawForChecking = !0, this.drawData(R, f, r), this._drawForChecking = !1;
                            try {
                                for (var Q = 0, W = R.getImageData(0, 0, T, B).data; Q < W.length; Q += 4)
                                    if (0 !== W[Q + 3]) {
                                        P = !0;
                                        break
                                    }
                                R.restore()
                            } catch ($) {
                                xm = F, P = !1
                            }
                        }
                    }
                }
                return P ? !0 : !1
            }, rectContains: function (J, q) {
                if (this._56I[J._id]) {
                    var N = this._25I[J._id];
                    if (N) return $k(q, N._79o())
                }
                return !1
            }, reset: function () {
                this.setZoom(1), this.setTranslate(0, 0)
            }, handleKeyDown: function (Y) {
                if (!u.isInput(Y.target)) {
                    var R = this,
                        J = R._focusData,
                        m = J && R._25I[J._id],
                        v = 0,
                        t = R._dataModel._datas;
                    if (!(J && J._enabled && J._editable && m && m.onKeyDown && m.onKeyDown(Y) === !0))
                        if (9 === Y.keyCode && (J && (v = t.indexOf(J), Pf(Y) ? -1 === --v && (v = 0) : ++v === t.size() && (v = 0)), R._focusData = J = t.get(v), R.sm().setSelection(J)), Dq(Y) ? R.selectAll() : Cf(Y) && R.isResettable() && R.reset(), R.sm().isEmpty()) {
                            if (R._editing) return;
                            var $ = R.tx(),
                                x = R.ty(),
                                r = !1,
                                C = Pf() ? 100 : 10;
                            Wk(Y) && ($ -= C, r = !0), Nk(Y) && (x -= C, r = !0), _i(Y) && ($ += C, r = !0), ri(Y) && (x += C, r = !0), r && R.setTranslate($, x)
                        } else {
                            qq(Y) && R.handleDelete(Y);
                            var d = Pf() ? 10 : 1;
                            Wk(Y) && (R.moveSelection(-d, 0), R.fi({
                                kind: "moveLeft"
                            })), Nk(Y) && (R.moveSelection(0, -d), R.fi({
                                kind: "moveUp"
                            })), _i(Y) && (R.moveSelection(d, 0), R.fi({
                                kind: "moveRight"
                            })), ri(Y) && (R.moveSelection(0, d), R.fi({
                                kind: "moveDown"
                            }))
                        }
                }
            }, handleScroll: function (A, Z) {
                if (Qc(A), this.isZoomable()) {
                    if (!this.getEditInteractor()) {
                        var o = this.getDataAt(A);
                        if (o) {
                            var n = ii(this.getImage(o));
                            if (n && Dj(n.scrollable, o, this)) return
                        }
                    }
                    var L = this.lp(A);
                    Z > 0 ? this.scrollZoomIn(L) : 0 > Z && this.scrollZoomOut(L)
                }
            }, handlePinch: function (l, P, R) {
                this.isZoomable() && (Math.abs(P - R) < u.pinchZoomThreshold || (P > R ? this.pinchZoomIn(l) : this.pinchZoomOut(l)))
            }, checkDoubleClickOnNote: function (h, K) {
                var N = this,
                    J = N.lp(h),
                    E = N.getDataUI(K),
                    o = E.note2Info;
                return o && K.s("note2.toggleable") && cf(o.clickRect, J) ? (K.s(Mh, !K.s(Mh)), N.fi({
                    kind: "toggleNote2",
                    event: h,
                    data: K
                }), !0) : (o = E.noteInfo, o && K.s("note.toggleable") && cf(o.clickRect, J) ? (K.s(ke, !K.s(ke)), N.fi({
                    kind: "toggleNote",
                    event: h,
                    data: K
                }), !0) : !1)
            }, _84o: function () { }, isNoteVisible: function () {
                return this._zoom > .15
            }, isLabelVisible: function () {
                return this._zoom > .15
            }, isEditVisible: function () {
                return this._zoom > .15
            }, autoScroll: function (T, r) {
                var h = this,
                    m = h.getAutoScrollZone(),
                    g = m / h.getZoom(),
                    z = m / 4,
                    k = h._29I,
                    L = h.lp(T),
                    y = {
                        x: h.tx(),
                        y: h.ty()
                    };
                return L && m > 0 && k && (L.x - k.x < g ? h.translate(z, 0) : k.x + k.width - L.x < g && h.translate(-z, 0), L.y - k.y < g ? h.translate(0, z) : k.y + k.height - L.y < g && h.translate(0, -z)), y.x = h.tx() - y.x, y.y = h.ty() - y.y, r && (r.x += y.x, r.y += y.y), y
            }, getMoveMode: function (j, s) {
                var L = s.s("2d.move.mode");
                return L ? L : pl["88"] ? "x" : pl["89"] ? "y" : "xy"
            }, getSerializableProperties: function () {
                return {
                    scrollBarColor: 1,
                    scrollBarSize: 1,
                    autoMakeVisible: 1,
                    autoHideScrollBar: 1,
                    editable: 1,
                    resettable: 1,
                    pannable: 1,
                    rectSelectable: 1,
                    autoScrollZone: 1,
                    visibleFunc: 1,
                    movableFunc: 1,
                    editableFunc: 1,
                    pointEditableFunc: 1,
                    rectEditableFunc: 1,
                    anchorEditableFunc: 1,
                    rotationEditableFunc: 1,
                    rectSelectBackground: 1,
                    rectSelectBorderColor: 1,
                    editPointSize: 1,
                    editPointBorderColor: 1,
                    editPointBackground: 1,
                    hoverDelay: 1,
                    dataModel: 1,
                    selectionModel: 1,
                    currentSubGraph: 1,
                    zoom: 1,
                    translateX: 1,
                    translateY: 1
                }
            }, serializeProperty: function (s, _, k) {
                var q = this;
                return "currentSubGraph" === _ ? {
                    __i: s.getId()
                } : k.serializeProperty(s, _, q)
            }, deserializeProperty: function (a, c, e) {
                var H = this;
                if ("currentSubGraph" === c) {
                    var n = H.dm(),
                        t = n.__idMap;
                    return t[a.__i]
                }
                return e.deserializeProperty(a, c, H)
            }, setDefaultCursor: function (Y, c) {
                this._defaultCursor = Y, c !== !1 && this.setCursor(Y)
            }, setCursor: function (V) {
                "default" === V && (V = this._defaultCursor || V);
                var r = this.getView().style;
                r.cursor = V, r.cursor = "-webkit-" + V, r.cursor = "-moz-" + V
            }, getCurrentConnectActionType: function () {
                return this._currentActionType
            }, setCurrentConnectActionType: function (R) {
                return R === F || u.getConnectAction(null, R) ? (this._currentActionType = R, this.redraw(), !0) : !1
            }, getEditStyle: function (z) {
                var S = this.getEditInteractor();
                return S ? S.getStyle(z) : Z
            }, setEditStyle: function (Q, z, t) {
                var c = this.getEditInteractor();
                return c ? (c.setStyle(Q, z, t), !0) : !1
            }, isConnectActionVisible: function (g) {
                var A = u.getConnectAction(this);
                if (!A) return !1;
                var w = A.visible;
                return Mf(w) && (w = w(this, g)), w
            }, isInteractive: function (E) {
                if (this._drawForChecking) return !1;
                var U = ii(this.getImage(E));
                return U && Dj(U.interactive, E, this) ? !0 : E.s("interactive")
            }, appendHTML: function (u, r) {
                var A = this.getView();
                if (!(r || u && u.parentNode !== A)) return !1;
                var K = u.getView && u.getView();
                if (!r && K && K.parentNode === A) return !1;
                (u.getView || u.isSelfViewEvent) && (u = u.getView());
                var h = this.getEditInteractor();
                return h && h._canvas ? A.insertBefore(u, h._canvas) : this.isScrollBarVisible() ? A.insertBefore(u, this.getView().lastChild) : sn(A, u), !0
            }, _layoutHTMLImpl: function ($, O, w) {
                if (arguments.length > 1) {
                    var D, A = this,
                        j = A._zoom;
                    if (O.getView && (D = O, O = O.getView()), O.style.position = "absolute", w) {
                        var Z = $.getRect();
                        qp(D || O, A.tx() + Z.x * j, A.ty() + Z.y * j, Z.width * j, Z.height * j)
                    } else {
                        var h = new Np,
                            Z = $.getAnchorRect(),
                            z = $.getPosition(),
                            f = $.getScale(),
                            G = O.style;
                        qp(D || O, Z), h.appendTranslate(A.tx(), A.ty()), h.appendScale(j, j), h.append(new Np($.getRotation(), z.x, z.y, f.x, f.y)), Jg(G, "transform", "matrix(" + h.a.toFixed(5) + ", " + h.b.toFixed(5) + ", " + h.c.toFixed(5) + ",\n    " + h.d.toFixed(5) + ", " + h.tx.toFixed(5) + ", " + h.ty.toFixed(5) + ")"), Jg(G, "transformOrigin", (-Z.x).toFixed(5) + "px " + (-Z.y).toFixed(5) + "px"), O.updateAppendMatrix = !0
                    }
                } else this._layoutHTML && this._layoutHTML()
            }, getTextEditInfo: function (y) {
                return y instanceof Lo ? {
                    name: "text",
                    accessType: "s",
                    isMultiline: !1
                } : void 0
            }, getState: function (j) {
                var t = "state",
                    V = j.s(t);
                if (V) return V;
                var J = ii(j._image);
                return J ? Dj(J[t], j, this) || null : void 0
            }, getShape: function (E) {
                return E.getStyle(bl)
            }
        }), o.defineProperties(hg.GraphView.prototype, {
            layoutHTML: {
                get: function () {
                    return this._layoutHTMLImplBind || (this._layoutHTMLImplBind = this._layoutHTMLImpl.bind(this)), this._layoutHTMLImplBind
                }, set: function (a) {
                    this._layoutHTML = a
                }
            }
        });
        var Tp = function (B, H) {
            var M = this;
            M.gv = B, M.s = function (b) {
                return H.getStyle(b)
            }, M._data = H, M._87I = new xr
        };
        yc(Tp, o, {
            _6I: F,
            ms_icons: 1,
            _84o: function () { }, dispose: function () { }, isShadowed: function () {
                return this.s("shadow") || this.gv.isSelected(this._data) && "shadow" === this.s("select.type")
            }, getSelectWidth: function () {
                var _ = this,
                    h = _.gv.isSelected(_._data);
                return !h || _.isShadowed() ? 0 : _.gv.getSelectWidth(_._data)
            }, getSelectColor: function () {
                return this.gv.getSelectColor(this._data)
            }, getBodyColor: function (o) {
                var X = this._data,
                    q = this.gv.getBodyColor(X);
                return q ? q : o ? X.getStyle(o) : F
            }, _2Q: function (o) {
                return this.s(o)
            }, _1Q: function (O, S, k, F) {
                var Y = this.s,
                    A = Y("2d.gray"),
                    $ = Y(S + ".dash.color");
                if (A && ($ = u.toGrayColor($)), O.strokeStyle = $, O.lineWidth = k, O.stroke(), Y(S + ".dash.3d")) {
                    var w = Y(S + ".dash.3d.color");
                    fr(O, $, A ? u.toGrayColor(w) : w, k, this.gv._zoom, Y(S + ".dash.3d.accuracy"))
                }
                _l(O, F)
            }, invalidate: function () {
                this._6I = F
            }, _79o: function () {
                var J = this;
                if (!J._6I) {
                    var u = J._data,
                        p = J.gv;
                    J.labelInfo = J.label2Info = J.noteInfo = J.note2Info = J._38o = F, J._87I.clear(), J.interactiveInfo = p.isInteractive(u) ? {} : F, J._3O(), J._55O = p.isEditable(u) ? {
                        _42O: p.isRectEditable(u),
                        _43O: p.isPointEditable(u),
                        _56O: p.isRotationEditable(u)
                    } : F, J._6I = J._81o()
                }
                return J._6I
            }, _3O: function () { }, getPosition: function () {
                return nl
            }, _68o: function (b, A) {
                b && this._87I.add(Rj(b, A))
            }, _81o: function () {
                var E = this,
                    i = E.s;
                E._24O(Bg, "getLabel"), E._24O(Qk, "getLabel2"), E._26O(Rm, "getNote"), E._26O(Vk, "getNote2"), E._15O(), E._55O && E._48O();
                var C;
                if (E._87I.each(function (V) {
                    C = ni(C, V)
                }), C) {
                    var I = E.isShadowed(),
                        w = i("shadow2"),
                        X = Pm(C);
                    w ? (X.x += i("shadow2.offset.x"), X.y += i("shadow2.offset.y"), vn(X, i("shadow2.blur"))) : I && (X.x += i("shadow.offset.x"), X.y += i("shadow.offset.y"), vn(X, i("shadow.blur"))), C = ni(C, X)
                }
                return E._87I.clear(), C
            }, _42: function (v) {
                var e = this,
                    z = e._data,
                    I = e.gv,
                    O = e.s,
                    V = O("opacity"),
                    d = this.isShadowed(),
                    q = O("shadow2");
                if (d || q) {
                    var Z = v.shadowOffsetX,
                        D = v.shadowOffsetY,
                        b = v.shadowBlur,
                        r = v.shadowColor,
                        j = I.getZoom(),
                        W = d ? "shadow" : "shadow2";
                    v.shadowOffsetX = O(W + ".offset.x") * j, v.shadowOffsetY = O(W + ".offset.y") * j, v.shadowBlur = O(W + ".blur") * j, v.shadowColor = d ? e.getSelectColor() : O(W + ".color")
                }
                if (V != F) {
                    var S = v.globalAlpha;
                    v.globalAlpha = V
                }
                e._80o(v), I.isLabelVisible(z) && ((!I._drawForChecking || O("label.selectable")) && vp(v, e.labelInfo), (!I._drawForChecking || O("label2.selectable")) && vp(v, e.label2Info)), I.isNoteVisible(z) && ($q(v, e.noteInfo), $q(v, e.note2Info)), e._99O(v), V != F && (v.globalAlpha = S), (d || q) && (v.shadowOffsetX = Z, v.shadowOffsetY = D, v.shadowBlur = b, v.shadowColor = r)
            }, _80o: function () { }, _47O: function () { }, _24O: function (C, f) {
                var r = this,
                    e = r._data,
                    g = r.gv,
                    p = r.s,
                    Z = g[f](e);
                if (Z != F) {
                    var T = p(C + ".scale"),
                        S = p(C + ".max"),
                        Q = p(C + ".position"),
                        c = r[C + "Info"] = {
                            label: Z,
                            scale: T,
                            color: g[f + "Color"](e),
                            font: p(C + ".font"),
                            opacity: p(C + ".opacity"),
                            align: p(C + ".align"),
                            rotation: r.getRotation(p(C + ".rotation"), !1, Q),
                            background: g[f + "Background"](e)
                        },
                        _ = qr(c, Z);
                    S > 0 && S < _.width && (c.labelWidth = _.width, _.width = S), 1 !== T && (_.width *= T, _.height *= T);
                    var t = r.getPosition(Q, p(C + ".offset.x"), p(C + ".offset.y"), _, p(C + ".position.fixed"));
                    if (_.x = t.x - _.width / 2, _.y = t.y - _.height / 2, r._68o(c.rect = _, c.rotation), 1 !== T) {
                        var h = _.width / T,
                            P = _.height / T;
                        c.rect = {
                            x: t.x - h / 2,
                            y: t.y - P / 2,
                            width: h,
                            height: P
                        }
                    }
                }
            }, _26O: function (A, n) {
                var N = this,
                    z = N.gv,
                    X = N._data,
                    t = N.s,
                    c = z[n](X);
                if (c != F) {
                    var i, L, r = t(A + ".scale"),
                        V = N[A + "Info"] = {
                            note: c,
                            scale: r,
                            data: X,
                            view: z,
                            expanded: t(A + ".expanded"),
                            font: t(A + ".font"),
                            color: t(A + ".color"),
                            opacity: t(A + ".opacity"),
                            align: t(A + ".align"),
                            icon: t(A + ".icon"),
                            backgroundImage: t(A + ".backgroundImage"),
                            borderWidth: t(A + ".border.width"),
                            borderColor: t(A + ".border.color"),
                            background: z[n + "Background"](X)
                        },
                        R = N.getPosition(t(A + ".position"), t(A + ".offset.x"), t(A + ".offset.y")),
                        G = R.x,
                        M = R.y;
                    if (V.expanded) {
                        var b, Y = t(A + ".max"),
                            j = t(A + ".backgroundImage");
                        j ? (j = ii(j), b = {
                            width: xc(j, X),
                            height: oo(j, X)
                        }) : b = qr(V, c), b.width += 6, b.height += 2, Y > 0 && Y < b.width && (V.labelWidth = b.width, b.width = Y), i = b.width, L = b.height + 8, V.clickRect = {
                            x: G - i * r / 2,
                            y: M - L * r,
                            width: i * r,
                            height: L * r * b.height / L
                        }
                    } else {
                        var I = t(A + ".icon");
                        I ? (I = ii(I), i = xc(I, X), L = oo(I, X)) : (i = 12, L = 18), V.clickRect = {
                            x: G - i * r / 2,
                            y: M - L * r,
                            width: i * r,
                            height: L * r
                        }
                    }
                    V.rect = {
                        x: G - i / 2,
                        y: M - L * r / 2 - L / 2,
                        width: i,
                        height: L
                    };
                    var C = s(V.borderWidth / 2) * r;
                    N._68o({
                        x: G - i * r / 2 - C,
                        y: M - L * r - C,
                        width: i * r + 2 * C,
                        height: L * r + 2 * C
                    })
                }
            }, _48O: function () { }, _99O: function (a) {
                var o = this,
                    B = o._38o;
                if (B) {
                    var m = o.gv,
                        M = o._data,
                        t = B.icons,
                        W = o.interactiveInfo;
                    W && (W._38o = {});
                    for (var e in t) {
                        var d = t[e],
                            f = B.rects[e];
                        if (f) {
                            W && (W._38o[e] = []);
                            var j = Dj(d.opacity, M, m),
                                A = Dj(d.names, M, m),
                                $ = A ? A.length : 0,
                                w = f.rotation;
                            if (j != F) {
                                var E = a.globalAlpha;
                                a.globalAlpha *= j
                            }
                            for (var q = 0; $ > q; q++) {
                                var z = A[q],
                                    x = ii(z),
                                    N = f[q];
                                if (w) {
                                    var c = N.x + N.width / 2,
                                        H = N.y + N.height / 2;
                                    a.save(), wh(a, c, H), jc(a, w), wh(a, -c, -H)
                                }
                                W && W._38o[e].push(a.interactiveInfo = {
                                    compInfos: [],
                                    matrix: w ? new Np(w, c, H).appendTranslate(-c, -H) : new Np
                                }), qk(a, x, Dj(d.stretch, M, m), N.x, N.y, N.width, N.height, o._data, o.gv), a.interactiveInfo = F, w && a.restore()
                            }
                            j != F && (a.globalAlpha = E)
                        }
                    }
                }
            }
        });
        var Af = function (A, s) {
            fi(Af, this, [A, s])
        };
        yc(Af, Tp, {
            _checkEmptyRect: !0,
            _40O: function (U, I) {
                var V = this,
                    n = V.s,
                    _ = U.rect;
                (U.borderColor = V.gv.getBorderColor(V._data)) && (U.borderType = n("border.type"), U.borderWidth = n("border.width"), U.borderPadding = n("border.padding"), I = q(I, U.borderPadding + U.borderWidth / 2));
                var e = V._data.getScale(),
                    G = q(1, q(X(e.x), X(e.y)));
                if (U.selectWidth = V.getSelectWidth()) {
                    var D = V.gv._zoom;
                    U.selectType = n("select.type"), U._97o = V.getSelectColor(), U.selectPadding = n("select.padding"), I = q(I, (U.selectPadding + U.selectWidth / 2 / D) / G)
                }
                I > 0 && (I *= G, _ = Pm(_), vn(_, I)), V._68o(_)
            }, _39O: function (W, I) {
                var J, u = this,
                    A = I.rect;
                if (I.borderWidth > 0 && (J = I.borderPadding, W.strokeStyle = I.borderColor, W.lineWidth = I.borderWidth, Ej(W, I.borderType, {
                    x: A.x - J,
                    y: A.y - J,
                    width: A.width + 2 * J,
                    height: A.height + 2 * J
                }), W.stroke()), I.selectWidth > 0) {
                    var z = u.gv._zoom;
                    if (J = I.selectPadding, W.strokeStyle = I._97o, W.lineWidth = I.selectWidth / z, I.rotation != F) {
                        W.save(), W.translate(I.position.x, I.position.y), W.rotate(I.rotation);
                        var Q = u._data,
                            k = Q.getWidth(),
                            O = Q.getHeight(),
                            m = I.scale,
                            h = I.anchor;
                        A = {
                            x: m.x * -k * h.x,
                            y: m.y * -O * h.y,
                            width: m.x * k,
                            height: m.y * O
                        }
                    }
                    Ej(W, I.selectType, {
                        x: A.x - J,
                        y: A.y - J,
                        width: A.width + 2 * J,
                        height: A.height + 2 * J
                    }), I.rotation != F && W.restore(), W.stroke()
                }
            }, dispose: function () {
                var X = this,
                    u = X._htmlView;
                Af.superClass._3O.call(X), u && (u.onHTMLRemoved && u.onHTMLRemoved(), yj(u))
            }, _3O: function () {
                var N = this,
                    O = N.s,
                    k = N._data,
                    P = N.gv,
                    i = P.getShape(k),
                    t = N.getBodyColor(),
                    n = O("shape.border.color"),
                    T = N._83o = i ? {
                        shape: i,
                        _53o: N.getBodyColor("shape.background"),
                        _27Q: ii(O("shape.repeat.image"), t),
                        shapeGradientPack: O("shape.gradient.pack"),
                        _54o: O("shape.border.width"),
                        _55o: n,
                        shapeBorderRepeatImage: ii(O("shape.border.repeat.image"), n),
                        _56o: O("shape.border.3d"),
                        _57o: O("shape.border.3d.color"),
                        _58o: O("shape.border.3d.accuracy"),
                        shapeGradient: O("shape.gradient"),
                        _59o: O("shape.gradient.color"),
                        _60o: O("shape.border.pattern"),
                        _61o: O("shape.border.cap"),
                        _62o: O("shape.border.join"),
                        shapeForeground: O("shape.foreground"),
                        bodyColor: t,
                        gray: O("2d.gray")
                    } : {
                            img: ii(P.getImage(k), t),
                            bodyColor: t,
                            gray: O("2d.gray"),
                            stretch: O("image.stretch")
                        };
                if (_ && !Ad);
                else {
                    var y, d = T.img;
                    d && d.renderHTML ? (N._htmlInfo && N._htmlInfo.img !== d && (N._htmlInfo = F), N._htmlInfo || (N._htmlInfo = {
                        img: d,
                        cache: {}
                    }), y = d.renderHTML(k, P, N._htmlInfo.cache)) : N._htmlInfo = F, N._htmlView && N._htmlView !== y && (N._htmlView.onHTMLRemoved && N._htmlView.onHTMLRemoved(), yj(N._htmlView.getView ? N._htmlView.getView() : N._htmlView)), (N._htmlView = y) && P.appendHTML(y) && (y.onHTMLAddedSync && y.onHTMLAddedSync(), y.onHTMLAdded && $e(y.onHTMLAdded)), T.rect = k.getRect(), T.position = k.p(), T.scale = k.getScale(), T.anchor = k.getAnchor(), T.rotation = k.getRotation(), i === Tq && (T._63o = O("shape.depth"));
                    var I = 0;
                    if (i) I = Xb(F, T._54o / 2, T._62o), N.s("shape.dash") && (I = q(I, (N.s("shape.dash.width") || T._54o) / 2));
                    else if (d && d.boundExtend)
                        if (I = Dj(d.boundExtend, k, P), d.boundExtendAbsolute) {
                            var S = k.getScale();
                            I /= P._zoom * q(1, q(X(S.x), X(S.y)))
                        } else if (!Dj(d.fitSize, k, P)) {
                            var A = Dj(d.width, k, P),
                                E = Dj(d.height, k, P);
                            I *= q(k.getWidth() / A, k.getHeight() / E)
                        }
                    N._40O(T, I);
                    var w = O("clip.percentage");
                    if (1 > w && (0 > w && (w = 0), T.clipRect = Wh(k.getAnchorRect(), O("clip.direction"), w)), i) {
                        var C = O("shape.fill.clip.percentage");
                        1 > C && (0 > C && (C = 0), T.shapeClipRect = Wh(k.getAnchorRect(), O("shape.fill.clip.direction"), C));
                        var $ = O("shape.foreground.clip.percentage");
                        1 > $ && (0 > $ && ($ = 0), T.shapeForegroundClipRect = Wh(k.getAnchorRect(), O("shape.foreground.clip.direction"), $))
                    }
                }
            }, getPosition: function (A, s, b, w) {
                var a = Re(A, this._83o.rect, w);
                return a.x += s, a.y += b, a
            }, _80o: function (c) {
                var P = this,
                    E = P.s,
                    S = P.gv,
                    M = P._data,
                    l = P._83o,
                    j = l.rect,
                    v = l.position,
                    U = l.rotation,
                    K = l.anchor,
                    X = l.scale,
                    e = l.shape,
                    O = l.clipRect;
                if (!P._checkEmptyRect || j.width > 0 && j.height > 0) {
                    var T = M.getSize();
                    if (T.x = -T.width * K.x, T.y = -T.height * K.y, c.save(), wh(c, v.x, v.y), jc(c, U), ec(c, X.x, X.y), O && (c.beginPath(), c.rect(O.x, O.y, O.width, O.height), c.clip()), S._drawForChecking && l.img && Dj(l.img.pixelPerfect, M, S) === !1) fl(c, T.x, T.y, T.width, T.height, "#888888");
                    else if (P.freeDraw) P.freeDraw(c, T, l);
                    else if (e) {
                        var C, o, G, t, N = l._60o,
                            w = ls(c, N),
                            Z = l._27Q,
                            W = l._54o,
                            s = l.shapeGradientPack,
                            m = l.gray,
                            n = c.lineJoin,
                            q = c.lineCap,
                            H = function (R) {
                                return m ? u.toGrayColor(R) : R
                            };
                        "roundRect" === e ? C = E("shape.corner.radius") : "polygon" === e ? C = E("shape.polygon.side") : "arc" === e && (C = E("shape.arc.from"), o = E("shape.arc.to"), G = E("shape.arc.close"), t = E("shape.arc.oval")), c.lineJoin = l._62o, c.lineCap = l._61o;
                        var x = H(l._53o);
                        if (x || Z || s) {
                            var i = l.shapeClipRect;
                            i && (c.save(), c.beginPath(), c.rect(i.x, i.y, i.width, i.height), c.clip()), Ej(c, e, T, C, o, G, t), s ? uq(c, s, function (j) {
                                return nm(j, l.bodyColor)
                            }) : Z ? fg(c, Z, H(l.bodyColor), null, M, S) : Ge(c, x, l.shapeGradient, H(l._59o), T), c.fill(), s && c.restore(), i && c.restore(), c !== w && Ej(w, e, T, C, o, G, t)
                        } else Ej(w, e, T, C, o, G, t);
                        var J = l.shapeForeground;
                        if (J) {
                            c.save();
                            var r = l.shapeForegroundClipRect;
                            r && (c.beginPath(), c.rect(r.x, r.y, r.width, r.height), c.clip()), Ej(c, e, T, C, o, G, t), Ge(c, J, E("shape.foreground.gradient"), H(E("shape.foreground.gradient.color")), T), c.fill(), c.restore()
                        }
                        if (W > 0) {
                            var L = E("shape.border.width.absolute");
                            L && (c.save(), c.setTransform(1, 0, 0, 1, 0, 0)), c.lineWidth = W;
                            var g = H(l._55o);
                            l.shapeBorderRepeatImage ? qb(c, l.shapeBorderRepeatImage, g, null, M, S) : c.strokeStyle = g, c.stroke(), L && c.restore(), l._56o && fr(c, g, H(l._57o), W, S._zoom, l._58o)
                        }
                        if (_l(c, N), E("shape.dash")) {
                            var D = E("shape.dash.width") || W;
                            if (D > 0) {
                                N = E("shape.dash.pattern");
                                var w = ls(c, N, P._2Q("shape.dash.offset"));
                                w !== c && Ej(w, e, T, C, o, G, t), P._1Q(c, "shape", D, N)
                            }
                        }
                        Wq(c, x, l._63o, T), c.lineJoin = n, c.lineCap = q
                    } else {
                        var p = P.interactiveInfo;
                        p && (c.interactiveInfo = p.bodyInfo = {
                            compInfos: [],
                            matrix: new Np(U, v.x, v.y, X.x, X.y)
                        }), l.gray && (c.compGray = !0);
                        var f = l.img;
                        f && f.cacheRule != F && (f = lc(c, f, l.stretch, T.width, T.height, M, S, l.bodyColor)), qk(c, f, l.stretch, T.x, T.y, T.width, T.height, M, S, l.bodyColor), c.compGray = !1, c.interactiveInfo = F
                    }
                    c.restore()
                }
                P._39O(c, l)
            }, _48O: function () { }, _47O: function () { }
        });
        var wn = function (A, O) {
            fi(wn, this, [A, O])
        },
            Fl = function (A, v, C, W) {
                var Y = En(A, v);
                return C = W ? V(C, Y) : cr(C, Y), Y ? C /= Y : C = 0, {
                    x: A.x + (v.x - A.x) * C,
                    y: A.y + (v.y - A.y) * C
                }
            };
        yc(wn, Tp, {
            _3O: function () {
                var y, X = this,
                    g = X._data,
                    k = X.gv,
                    i = X.s,
                    R = i(ej),
                    r = g.isLooped(),
                    _ = i("edge.width"),
                    s = X.getBodyColor("edge.color"),
                    w = i("edge.center"),
                    A = i("edge.offset"),
                    C = k.getBorderColor(g),
                    I = C ? i("border.width") : 0,
                    T = X.getSelectWidth(),
                    p = g._40I,
                    J = g._41I,
                    K = X._78o = p && J ? {
                        looped: r,
                        type: R,
                        width: _,
                        center: w,
                        color: s,
                        repeatImage: ii(i("edge.repeat.image"), s),
                        borderColor: C,
                        borderWidth: I,
                        _97o: T ? X.getSelectColor() : F,
                        selectWidth: T,
                        pattern: i("edge.pattern"),
                        cap: i("edge.cap"),
                        join: i("edge.join"),
                        is3d: i("edge.3d"),
                        _67o: i("edge.3d.color"),
                        _66o: i("edge.3d.accuracy"),
                        gray: i("2d.gray")
                    } : F;
                if (K) {
                    var d = u.getEdgeType(R);
                    if (d) {
                        var P = d(g, Ml(X, k, g, r, R), k, X._19Q);
                        P.points && P.points.size() > 1 ? (K.edgeTypeInfo = P, y = ms(K.edgeTypeInfo.points)) : P[Ph] && P.rect && (K.edgeTypeInfo = P, y = P.rect)
                    } else {
                        var L = i("edge.source.anchor.x"),
                            N = i("edge.source.anchor.y"),
                            h = i("edge.target.anchor.x"),
                            v = i("edge.target.anchor.y"),
                            Q = Eo(k, g, "source"),
                            f = Eo(k, g, "target");
                        if (R === _b) {
                            var n = K.points = i(Ei) || Yh,
                                j = n.size();
                            K.segments = i("edge.segments");
                            var m = L !== Z || N !== Z || Bk(p),
                                B = h !== Z || v !== Z || Bk(J);
                            if (!w)
                                if (A) m || (Q = Fl(Q, j ? n.get(0) : f, A, j)), B || (f = Fl(f, j ? n.get(j - 1) : Q, A, j));
                                else {
                                    var o;
                                    m || (o = Rl(Q, j ? n.get(0) : f, Rp(k, p)), o && (Q = {
                                        x: o[0],
                                        y: o[1]
                                    })), B || (o = Rl(j ? n.get(j - 1) : Q, f, Rp(k, J)), o && (f = {
                                        x: o[0],
                                        y: o[1]
                                    }))
                                }
                            y = ni(ms(K.points), ms(Q, f))
                        } else {
                            var e = Ml(X, k, g, r, R);
                            if (X._19Q || (e = -e), r) Q = Pm(Q), Q.x = k.getNodeRect(p).x, K.radius = e, y = {
                                x: Q.x - e,
                                y: Q.y - e,
                                width: 2 * e,
                                height: 2 * e
                            };
                            else {
                                var b = En(Q, f),
                                    G = cr(A, b),
                                    E = {
                                        x: G,
                                        y: e
                                    },
                                    U = {
                                        x: b - G,
                                        y: e
                                    },
                                    V = D(f.y - Q.y, f.x - Q.x),
                                    H = K.mat = new In(V);
                                if (K.orienAngle = V, K.angle = f.x < Q.x ? V + W : V, K.rect = {
                                    x: E.x,
                                    y: E.y,
                                    width: U.x - E.x,
                                    height: 0
                                }, K.origin = Q, E = H.tf(E), E.x += Q.x, E.y += Q.y, U = H.tf(U), U.x += Q.x, U.y += Q.y, w) {
                                    var $ = {
                                        x: b,
                                        y: 0
                                    };
                                    $ = H.tf($), $.x += Q.x, $.y += Q.y, y = ms([Q, E, U, $]), K.c1 = Q, K.c2 = $
                                } else y = ms(E, U);
                                Q = E, f = U
                            }
                        }
                        K.sourcePoint = Q, K.targetPoint = f, g._lastSourcePoint = Q, g._lastTargetPoint = f
                    }
                    var S = 0;
                    i("edge.dash") && (S = i("edge.dash.width") || _);
                    var l = "square" === K.cap ? .71 : .5;
                    Xb(y, q(S * l, _ * l + I + T), K.join), X._68o(y)
                }
            }, getRotation: function (h, q, R) {
                h = h || 0;
                var B = this._78o;
                if (B) {
                    var e, W = B.angle,
                        E = B.points,
                        u = B.edgeTypeInfo;
                    if (W != F) return q ? B.orienAngle + h : W + h;
                    if (u && u[Ph]) return u.getRotation ? u.getRotation(this, h, q, R) : 0;
                    if (u && u.points) {
                        var f = u.points;
                        return e = f.size(), nk[R] ? e && 0 === e % 2 ? Mn(f.get(e / 2 - 1), f.get(e / 2), q, h) : h : Ym[R] ? Mn(f.get(0), f.get(1), q, h) : Mn(f.get(e - 2), f.get(e - 1), q, h)
                    }
                    if (E) return e = E.size(), nk[R] ? e && 0 === e % 2 ? Mn(E.get(e / 2 - 1), E.get(e / 2), q, h) : h : Ym[R] ? Mn(B.sourcePoint, e ? E.get(0) : B.targetPoint, q, h) : Mn(e ? E.get(e - 1) : B.sourcePoint, B.targetPoint, q, h)
                }
                return h
            }, getPosition: function (o, T, l, P, c) {
                var C = this._78o;
                if (C) {
                    var t, a = C.type,
                        e = C.points,
                        f = C.edgeTypeInfo,
                        H = C.sourcePoint,
                        K = C.targetPoint;
                    if (!a) return C.looped ? {
                        x: H.x - C.radius + T,
                        y: H.y + l
                    } : (c && H && K && (H.x > K.x || H.x === K.x && H.y > K.y) && (o = cg[o], l = -l), t = Re(o, C.rect, P), t.x += T, t.y += l, t = C.mat.tf(t), t.x += C.origin.x, t.y += C.origin.y, t);
                    if (f && f[Ph]) return f.getPosition ? f.getPosition(this, o, T, l, P, c) : {
                        x: (H.x + K.x) / 2,
                        y: (H.y + K.y) / 2
                    };
                    if (e) {
                        var t, I = e.size();
                        if (nk[o]) {
                            if (I) {
                                var h = I % 2;
                                if (0 === h) return Md(e.get(I / 2 - 1), e.get(I / 2), o, T, l, P, c);
                                t = e.get((I - h) / 2)
                            } else t = {
                                x: (H.x + K.x) / 2,
                                y: (H.y + K.y) / 2
                            };
                            return t = Re(o, {
                                x: t.x,
                                y: t.y,
                                width: 0,
                                height: 0
                            }, P), t.x += T, t.y += l, t
                        }
                        return Ym[o] ? Md(H, I ? e.get(0) : K, o, T, l, P, c) : Md(I ? e.get(I - 1) : H, K, o, T, l, P, c)
                    }
                    if (f) {
                        var $ = f.points,
                            I = $.size();
                        if (nk[o]) {
                            var h = I % 2;
                            return 0 === h ? Md($.get(I / 2 - 1), $.get(I / 2), o, T, l, P, c) : (t = $.get((I - h) / 2), t = Re(o, {
                                x: t.x,
                                y: t.y,
                                width: 0,
                                height: 0
                            }, P), t.x += T, t.y += l, t)
                        }
                        return Ym[o] ? Md($.get(0), $.get(1), o, T, l, P, c) : Md($.get(I - 2), $.get(I - 1), o, T, l, P, c)
                    }
                }
                return nl
            }, _42: function (V) {
                this._78o && wn.superClass._42.call(this, V)
            }, drawPath: function (c, J) {
                c.beginPath();
                var y = J.type,
                    G = J.points,
                    I = J.segments,
                    v = J.edgeTypeInfo;
                if (!y || G) {
                    var Z = J.sourcePoint,
                        p = Z.x,
                        j = Z.y,
                        F = J.targetPoint,
                        R = F.x,
                        S = F.y;
                    if (y)
                        if (I) {
                            var W = new xr({
                                x: p,
                                y: j
                            });
                            W.addAll(G), W.add({
                                x: R,
                                y: S
                            }), en(c, W, I)
                        } else c.moveTo(p, j), G.each(function (V) {
                            c.lineTo(V.x, V.y)
                        }), c.lineTo(R, S);
                    else J.looped ? c.arc(p, j, J.radius, 0, $, !0) : J.center ? (c.moveTo(J.c1.x, J.c1.y), c.lineTo(p, j), c.lineTo(R, S), c.lineTo(J.c2.x, J.c2.y)) : (c.moveTo(p, j), c.lineTo(R, S))
                } else v && (v.points ? en(c, v.points, v.segments) : v[Ph] && v[Ph](c, v))
            }, _80o: function (P) {
                var z = this,
                    X = z.s,
                    I = z._78o,
                    C = I.width,
                    g = I.selectWidth,
                    k = I.borderWidth,
                    D = I.repeatImage,
                    Q = P.lineJoin,
                    T = P.lineCap,
                    R = I.gray,
                    U = I.pattern;
                P.lineJoin = I.join, P.lineCap = I.cap, z.drawPath(ls(P, U), I);
                var A = X("edge.width.absolute");
                A && (P.save(), P.setTransform(1, 0, 0, 1, 0, 0)), g && (P.strokeStyle = I._97o, P.lineWidth = C + 2 * (k + g), P.stroke()), k && (P.strokeStyle = R ? u.toGrayColor(I.borderColor) : I.borderColor, P.lineWidth = C + 2 * k, P.stroke());
                var K = R ? u.toGrayColor(I.color) : I.color;
                if (D ? qb(P, D, K, null, z._data, z.gv) : P.strokeStyle = K, P.lineWidth = C, P.stroke(), I.is3d) {
                    var r = R ? u.toGrayColor(I._67o) : I._67o;
                    fr(P, K, r, C, z.gv._zoom, I._66o)
                }
                if (_l(P, U), X("edge.dash")) {
                    U = X("edge.dash.pattern");
                    var f = ls(P, U, z._2Q("edge.dash.offset"));
                    f !== P && z.drawPath(f, I), z._1Q(P, "edge", X("edge.dash.width") || C, U)
                }
                A && P.restore(), P.lineJoin = Q, P.lineCap = T
            }, _48O: function () { }, _47O: function () { }
        });
        var Fn = function (n, q) {
            fi(Fn, this, [n, q])
        };
        yc(Fn, Af, {
            _3O: function () {
                var n, e, Z = this,
                    E = Z.s,
                    I = Z._data,
                    i = Z.gv;
                if (Z._88I = F, I.isExpanded() && I.eachChild(function (d) {
                    if (Fq(d)) {
                        var j = i.getBoundsForGroup(d);
                        j && (e || (e = []), e.push(j), n = ni(n, j))
                    }
                }), n) {
                    var L = i.getLabel(I),
                        V = E("group.type"),
                        R = E("group.border.width") || 0,
                        c = E("group.border.width.absolute"),
                        B = R / 2;
                    c && (R /= i._zoom), n = Dk(V, e, n), ld(n, I, "group.padding", 1), vn(n, R);
                    var r = Z._88I = {
                        type: V,
                        rect: n,
                        _64o: n
                    };
                    if (!V && L != F) {
                        var o, S = Z.labelInfo = {
                            label: L,
                            color: E("group.title.color"),
                            font: E("group.title.font"),
                            align: E("group.title.align")
                        },
                            J = qr(S, L),
                            v = J.width + R,
                            Q = J.height + R,
                            w = E("group.title.align"),
                            l = E("group.title.orientation");
                        if (l === $c || l === Kd ? (n.height += R, v > n.width && (n.width = v)) : (l === nq || l === fm) && (n.width += R, v > n.height && (n.height = v)), o = w === nq ? n.x : w === fm ? n.x + n.width - v : n.x + n.width / 2 - v / 2, l === Kd) r.titleRect = {
                            x: n.x,
                            y: n.y + n.height,
                            width: n.width,
                            height: Q
                        }, r.rect = {
                            x: n.x,
                            y: n.y,
                            width: n.width,
                            height: n.height + Q
                        }, S.rect = {
                            x: o,
                            y: n.y + n.height,
                            width: v,
                            height: Q
                        };
                        else if (l === nq) {
                            var q = r.titleRect = {
                                x: n.x - Q,
                                y: n.y,
                                width: Q,
                                height: n.height
                            };
                            r.rect = {
                                x: n.x - Q,
                                y: n.y,
                                width: n.width + Q,
                                height: n.height
                            }, S.rect = {
                                x: q.x + Q / 2 - n.height / 2,
                                y: q.y + n.height / 2 - Q / 2,
                                width: n.height,
                                height: Q
                            }, S.rotation = -Math.PI / 2
                        } else if (l === fm) {
                            var q = r.titleRect = {
                                x: n.x + n.width,
                                y: n.y,
                                width: Q,
                                height: n.height
                            };
                            r.rect = {
                                x: n.x,
                                y: n.y,
                                width: n.width + Q,
                                height: n.height
                            }, S.rect = {
                                x: q.x + Q / 2 - n.height / 2,
                                y: q.y + n.height / 2 - Q / 2,
                                width: n.height,
                                height: Q
                            }, S.rotation = Math.PI / 2
                        } else r.titleRect = {
                            x: n.x,
                            y: n.y - Q,
                            width: n.width,
                            height: Q
                        }, r.rect = {
                            x: n.x,
                            y: n.y - Q,
                            width: n.width,
                            height: n.height + Q
                        }, S.rect = {
                            x: o,
                            y: n.y - Q - B,
                            width: v,
                            height: Q + R
                        }
                    }
                    Z._40O(r, E("group.border.width") / 2)
                } else Fn.superClass._3O.call(Z)
            }, getPosition: function (J, $, O, k) {
                var W = this._88I;
                if (W) {
                    var E = Re(J, W.rect, k);
                    return E.x += $, E.y += O, E
                }
                return Fn.superClass.getPosition.apply(this, arguments)
            }, _24O: function (T, R) {
                var Y = this._88I;
                (!Y || Y.type || "label2" === T) && Fn.superClass._24O.call(this, T, R)
            }, _80o: function (v) {
                var P = this,
                    K = P._88I;
                if (K) {
                    var I = P._data,
                        Q = P.s,
                        U = P.gv,
                        M = K.type,
                        t = K.rect,
                        m = K._64o,
                        F = K.titleRect,
                        o = P.getBodyColor(),
                        S = ii(Q("group.image"), o),
                        J = Q("group.image.stretch"),
                        i = P.getBodyColor("group.background"),
                        V = ii(Q("group.repeat.image"), o),
                        L = Q("group.gradient.pack"),
                        c = Q("group.gradient"),
                        N = Q("group.gradient.color"),
                        g = Q("group.border.width"),
                        l = Q("group.border.color"),
                        d = Q("group.border.pattern"),
                        f = Q("group.title.orientation"),
                        T = Q("group.depth"),
                        q = Q("group.border.radius"),
                        k = Q("group.border.join"),
                        r = Q("group.border.cap"),
                        B = Q("group.border.width.absolute");
                    B && (g /= U._zoom);
                    var y = l,
                        A = Q("group.border.repeat.image");
                    if (A && (A = ii(A, l)) && (y = am(v, A, l, null, I, U)), M) {
                        var R = v.lineJoin,
                            z = v.lineCap;
                        if (v.lineJoin = k, v.lineCap = r, S) {
                            if (v.save(), Ej(v, M, t, q), v.clip(), qk(v, S, J, t.x, t.y, t.width, t.height, I, U, o), v.restore(), g > 0) {
                                var X = ls(v, d);
                                Ej(X, M, t, q), v.lineWidth = g, v.strokeStyle = y, v.stroke(), _l(v, d)
                            }
                        } else {
                            var X = ls(v, d);
                            i || V || L ? (Ej(v, M, t, q), L ? uq(v, L, function (K) {
                                return nm(K, o)
                            }) : V ? fg(v, V, o, null, I, U) : Ge(v, i, c, N, t), v.fill(), L && v.restore(), v !== X && Ej(X, M, t, q)) : Ej(X, M, t, q), g > 0 && (v.lineWidth = g, v.strokeStyle = y, v.stroke()), _l(v, d), M === Tq && Wq(v, i, T, t)
                        }
                        v.lineJoin = R, v.lineCap = z
                    } else {
                        var D = Q("group.title.background");
                        if ((!q || 0 > q) && (q = 0), S) qk(v, S, J, m.x, m.y, m.width, m.height, I, U, P.getBodyColor());
                        else if (i || V)
                            if (V ? fg(v, V, o, null, I, U) : Ge(v, i, c, N, m), 0 === g) Ej(v, Tq, m), v.fill(), Wq(v, i, T, m);
                            else {
                                switch (v.beginPath(), f) {
                                    case Kd:
                                        pg(v, m.x, m.y, m.width, m.height, q, q, 0, 0);
                                        break;
                                    case nq:
                                        pg(v, m.x, m.y, m.width, m.height, 0, q, 0, q);
                                        break;
                                    case fm:
                                        pg(v, m.x, m.y, m.width, m.height, q, 0, q, 0);
                                        break;
                                    case $c:
                                        pg(v, m.x, m.y, m.width, m.height, 0, 0, q, q)
                                }
                                v.fill()
                            }
                        if (F && D)
                            if (0 === g) fl(v, F.x, F.y, F.width, F.height, D), Wq(v, D, T, F);
                            else {
                                switch (v.beginPath(), v.fillStyle = D, f) {
                                    case Kd:
                                        pg(v, F.x, F.y, F.width, F.height, 0, 0, q, q);
                                        break;
                                    case nq:
                                        pg(v, F.x, F.y, F.width, F.height, q, 0, q, 0);
                                        break;
                                    case fm:
                                        pg(v, F.x, F.y, F.width, F.height, 0, q, 0, q);
                                        break;
                                    case $c:
                                        pg(v, F.x, F.y, F.width, F.height, q, q, 0, 0)
                                }
                                v.fill()
                            }
                        if (g > 0) {
                            var X = ls(v, d);
                            if (Ej(X, "roundRect", t, q), v.save(), v.lineWidth = g, v.strokeStyle = y, v.lineJoin = k, v.lineCap = r, v.closePath(), v.stroke(), F && Q("group.splitLine")) {
                                var h = F.x,
                                    e = F.y,
                                    u = F.width,
                                    p = F.height;
                                v.beginPath(), f === Kd ? (v.moveTo(h, e), v.lineTo(h + u, e)) : f === nq ? (v.moveTo(h + u, e), v.lineTo(h + u, e + p)) : f === fm ? (v.moveTo(h, e), v.lineTo(h, e + p)) : (v.moveTo(h, e + p), v.lineTo(h + u, e + p))
                            }
                            v.stroke(), v.restore(), _l(X, d)
                        }
                    }
                    P._39O(v, K)
                } else Fn.superClass._80o.call(P, v)
            }
        });
        var Ul = function (d, R) {
            fi(Ul, this, [d, R])
        };
        yc(Ul, Af, {
            _80o: function (b) {
                this._39O(b, this._83o)
            }
        });
        var Xp = function (A, w) {
            fi(Xp, this, [A, w])
        };
        yc(Xp, Af, {
            _3O: function () {
                var g = this,
                    v = g._data,
                    V = g.s,
                    A = g.gv,
                    p = v.getPoints(),
                    C = A.getBorderColor(v),
                    G = C ? V("border.width") : 0,
                    k = g.getSelectWidth(),
                    S = V("shape.border.width"),
                    B = v.getRect(),
                    D = v.getAnchorRect(),
                    u = A.getBodyColor(v),
                    P = V("shape.border.color"),
                    E = g._99o = p.isEmpty() ? F : {
                        rect: B,
                        rotation: v.getRotation(),
                        fillRule: V("shape.fill.rule"),
                        scale: v.getScale(),
                        position: v.p(),
                        points: p,
                        segments: v.getSegments(),
                        bodyColor: u,
                        borderColor: C,
                        borderWidth: G,
                        _94o: V("shape.border.3d"),
                        _95o: V("shape.border.3d.color"),
                        _96o: V("shape.border.3d.accuracy"),
                        _97o: k ? g.getSelectColor() : F,
                        selectWidth: k,
                        _53o: V("shape.background"),
                        _27Q: ii(V("shape.repeat.image"), u),
                        shapeGradientPack: V("shape.gradient.pack"),
                        _54o: S,
                        _55o: P,
                        shapeBorderRepeatImage: ii(V("shape.border.repeat.image"), P),
                        shapeGradient: V("shape.gradient"),
                        _59o: V("shape.gradient.color"),
                        _60o: V("shape.border.pattern"),
                        _61o: V("shape.border.cap"),
                        _62o: V("shape.border.join"),
                        shapeForeground: V("shape.foreground"),
                        gray: V("2d.gray")
                    };
                if (E) {
                    D.x += E.position.x, D.y += E.position.y, E.gradientRect = D;
                    var I = v.getScale(),
                        Z = q(1, q(X(I.x), X(I.y)));
                    V("shape.dash") && V("shape.dash.width") > S && (S = V("shape.dash.width"));
                    var Y, n = V("shape.border.width.absolute");
                    Y = n ? (S + G + k) / g.gv._zoom / Z : S * ("square" === E._61o ? .71 : .5) + G + k / g.gv._zoom / Z, Y && (Y *= Z, B = Pm(B), Xb(B, Y, E._62o)), g._68o(B);
                    var t = V("clip.percentage");
                    1 > t && (0 > t && (t = 0), E.clipRect = Wh(v.getAnchorRect(), V("clip.direction"), t));
                    var M = V("shape.fill.clip.percentage");
                    1 > M && (0 > M && (M = 0), E.shapeClipRect = Wh(v.getAnchorRect(), V("shape.fill.clip.direction"), M));
                    var J = V("shape.foreground.clip.percentage");
                    1 > J && (0 > J && (J = 0), E.shapeForegroundClipRect = Wh(v.getAnchorRect(), V("shape.foreground.clip.direction"), J))
                }
            }, getPosition: function (l, m, s, t) {
                var L = this._99o;
                if (L) {
                    var Q = Re(l, L.rect, t);
                    return Q.x += m, Q.y += s, Q
                }
                return nl
            }, _42: function (I) {
                this._99o && Xp.superClass._42.call(this, I)
            }, _80o: function (l) {
                var a, I = this,
                    F = I.s,
                    R = I._99o,
                    J = R.position,
                    B = R.scale,
                    Q = R.rotation,
                    D = R.borderWidth,
                    s = R.selectWidth / I.gv._zoom,
                    v = R._27Q,
                    d = R.shapeGradientPack,
                    N = R._54o,
                    w = R.clipRect,
                    Z = R.shapeClipRect,
                    m = R.points,
                    C = R.segments,
                    n = I._data.isClosePath(),
                    h = R.fillRule,
                    f = R.gray,
                    c = function (c) {
                        return f ? u.toGrayColor(c) : c
                    },
                    r = c(R._53o),
                    x = r || v || d;
                l.save(), wh(l, J.x, J.y), jc(l, Q), ec(l, B.x, B.y), w && (l.beginPath(), l.rect(w.x, w.y, w.width, w.height), l.clip()), x && Z && (l.save(), l.beginPath(), l.rect(Z.x, Z.y, Z.width, Z.height), l.clip()), wh(l, -J.x, -J.y);
                var O = R._60o,
                    H = ls(l, O),
                    K = l.lineJoin,
                    o = l.lineCap;
                l.lineJoin = R._62o, l.lineCap = R._61o;
                var V = c(R.bodyColor);
                x ? (en(l, m, C, n), d ? uq(l, d, function (s) {
                    return nm(s, R.bodyColor)
                }) : v ? fg(l, v, V, null, I._data, I.gv) : (a = V ? V : r, Ge(l, a, R.shapeGradient, c(R._59o), R.gradientRect)), l.fill(h), d && l.restore(), Z && (l.restore(), wh(l, -J.x, -J.y)), H !== l && en(H, m, C, n)) : en(H, m, C, n);
                var k = R.shapeForeground;
                if (k) {
                    l.save();
                    var G = R.shapeForegroundClipRect;
                    G && (wh(l, J.x, J.y), l.beginPath(), l.rect(G.x, G.y, G.width, G.height), l.clip(), wh(l, -J.x, -J.y)), en(l, m, C, n), Ge(l, k, F("shape.foreground.gradient"), c(F("shape.foreground.gradient.color")), R.gradientRect), l.fill(h), l.restore()
                }
                var M = F("shape.border.width.absolute");
                if (M && (l.save(), l.setTransform(1, 0, 0, 1, 0, 0)), s && (l.strokeStyle = R._97o, l.lineWidth = N + 2 * (D + s), l.stroke()), D && (l.strokeStyle = c(R.borderColor), l.lineWidth = N + 2 * D, l.stroke()), N && (a = c(R._55o), R.shapeBorderRepeatImage ? qb(l, R.shapeBorderRepeatImage, a, null, I._data, I.gv) : (!r && V && (a = V), l.strokeStyle = a), l.lineWidth = N, l.stroke(), R._94o && fr(l, a, c(R._95o), N, I.gv._zoom, R._96o)), _l(l, O), F("shape.dash")) {
                    var z = F("shape.dash.width") || N;
                    if (z > 0) {
                        O = F("shape.dash.pattern");
                        var H = ls(l, O, I._2Q("shape.dash.offset"));
                        H !== l && en(H, m, C, n), I._1Q(l, "shape", z, O)
                    }
                }
                M && l.restore(), l.lineJoin = K, l.lineCap = o, l.restore()
            }, _48O: function () { }, _47O: function () { }
        });
        var Kr = function (b, G) {
            fi(Kr, this, [b, G])
        };
        yc(Kr, Xp, {
            getRotation: function (w, n, K) {
                w = w || 0;
                var H = this._data.getPoints(),
                    R = H.size();
                return R > 1 ? nk[K] ? R && 0 === R % 2 ? Mn(H.get(R / 2 - 1), H.get(R / 2), n, w) : w : Ym[K] ? Mn(H.get(0), H.get(1), n, w) : Mn(H.get(R - 2), H.get(R - 1), n, w) : w
            }, getPosition: function (F, H, k, C, b) {
                var z = this._data.getPoints(),
                    l = z.size();
                if (l > 1) {
                    if (nk[F]) {
                        var t = l % 2;
                        if (0 === t) return Md(z.get(l / 2 - 1), z.get(l / 2), F, H, k, C, b);
                        var R = z.get((l - t) / 2),
                            S = {
                                x: R.x,
                                y: R.y,
                                width: 0,
                                height: 0
                            };
                        return R = Re(F, S, C), R.x += H, R.y += k, R
                    }
                    return Ym[F] ? Md(z.get(0), z.get(1), F, H, k, C, b) : Md(z.get(l - 2), z.get(l - 1), F, H, k, C, b)
                }
                return nl
            }
        });
        var _n = function (t, k) {
            fi(_n, this, [t, k])
        };
        yc(_n, Af, {
            _3O: function () {
                var C = this;
                _n.superClass._3O.call(C);
                var G = C.s,
                    z = C._83o;
                C._82o = z.img || z.shape ? F : {
                    background: C.getBodyColor("grid.background"),
                    depth: G("grid.depth"),
                    rect: z.rect,
                    _88o: G("grid.cell.depth"),
                    cellBorderColor: G("grid.cell.border.color"),
                    _89o: G("grid.row.count"),
                    _90o: G("grid.column.count"),
                    block: G("grid.block"),
                    _91o: G("grid.block.color"),
                    _92o: G("grid.block.padding"),
                    _93o: G("grid.block.width")
                }
            }, _80o: function (t) {
                var w = this,
                    R = w._82o;
                if (!R) return _n.superClass._80o.call(w, t), void 0;
                var H, f, E = w._data,
                    h = R.background,
                    W = R.rect,
                    x = R.block,
                    k = R._91o,
                    Z = R._92o,
                    P = R._93o,
                    V = R._88o,
                    D = R.cellBorderColor,
                    s = R._89o,
                    o = R._90o;
                if (h)
                    if (fl(t, W.x, W.y, W.width, W.height, h), Wq(t, h, R.depth, W), V)
                        for (H = 0; s > H; H++)
                            for (f = 0; o > f; f++) W = E.getCellRect(H, f), W && Wq(t, h, V, W);
                    else if (D) {
                        for (t.beginPath(), H = 0; s > H; H++)
                            for (f = 0; o > f; f++) W = E.getCellRect(H, f), W && t.rect(W.x, W.y, W.width, W.height);
                        t.strokeStyle = D, t.lineWidth = 1, t.stroke()
                    }
                if ("h" === x)
                    for (H = 0; s > H; H++) W = ni(E.getCellRect(H, 0), E.getCellRect(H, o - 1)), vn(W, Z), Ie(t, k, W.x, W.y, W.width, W.height, P);
                else if ("v" === x)
                    for (f = 0; o > f; f++) W = ni(E.getCellRect(0, f), E.getCellRect(s - 1, f)), vn(W, Z), Ie(t, k, W.x, W.y, W.width, W.height, P);
                w._39O(t, w._83o)
            }
        });
        var sk = function (C, J) {
            fi(sk, this, [C, J])
        };
        yc(sk, Af, {
            _checkEmptyRect: !1,
            _81o: function () {
                var t = this._data,
                    p = sk.superClass._81o.call(this),
                    O = t.s("text");
                if (O != F) {
                    var P, Q, V = t.s("text.font"),
                        o = t.s("text.align"),
                        U = t.s("text.vAlign"),
                        f = ln(V, O),
                        z = f.width,
                        L = f.height,
                        j = t.getAnchor(),
                        e = t.getWidth(),
                        k = t.getHeight();
                    "left" === o ? P = -e * j.x : "center" === o ? P = -e * j.x + (e - z) / 2 : "right" === o && (P = e * (1 - j.x) - f.width), "top" === U ? Q = -k * j.y : "middle" === U ? Q = -k * j.y + (k - L) / 2 : "bottom" === U && (Q = k * (1 - j.y) - f.height);
                    var T, v = t.getMatrix();
                    if (T = ms([v.tf(P, Q), v.tf(P + z, Q), v.tf(P + z, Q + L), v.tf(P, Q + L)]), p = ni(p, T), p && t.s("text.shadow")) {
                        var N = Pm(p);
                        N.x += t.s("text.shadow.offset.x"), N.y += t.s("text.shadow.offset.y"), vn(N, t.s("text.shadow.blur")), p = ni(p, N)
                    }
                }
                return p
            }
        });
        var Zp = hg.Interactor = function (S) {
            this.gv = this._graphView = S
        };
        Bb("Interactor", o, {
            ms_listener: 1,
            getView: function () {
                return this.gv.getView()
            }, setUp: function () {
                this.addListeners()
            }, tearDown: function () {
                this.removeListeners(), this.clear()
            }, clear: function () { }, fi: function (g) {
                this.gv.fi(g)
            }, setCursor: function (G) {
                nf || this.gv.setCursor(G)
            }, startDragging: function ($) {
                var V = this;
                V._lastClientPoint = lb($), V._lastLogicalPoint = V.gv.lp($), Ui(V, $)
            }, clearDragging: function () {
                var t = this;
                t._lastClientPoint = t._lastLogicalPoint = t._logicalPoint = F
            }, autoScroll: function (M) {
                return this.gv.autoScroll(M, this._lastClientPoint)
            }
        });
        var cm = F,
            Cd = function (Z) {
                cm.handleWindowTouchMove(Z)
            },
            sp = function (h) {
                cm.handleWindowTouchEnd(h), b(x, wj, Cd), b(x, Sj, sp), cm = F
            },
            Ng = function (_) {
                cm.handleWindowMouseMove(_)
            },
            Vi = function (W) {
                cm.handleWindowMouseUp(W), b(x, rp, Ng), b(x, cj, Vi), cm = F
            },
            Lj = function (m, h) {
                if (m !== cm) {
                    var T = li(h);
                    cm ? T ? cm.handleWindowTouchEnd(h) : cm.handleWindowMouseUp(h) : T ? (K(x, wj, Cd), K(x, Sj, sp)) : (K(x, rp, Ng), K(x, cj, Vi)), cm = m
                }
            },
            mq = function (p) {
                var N = this;
                N.gv = p, N._is2d = p instanceof hg.GraphView, N._eventListeners = {}, ["mousedown", "mousemove", "mouseleave", "touchstart", "touchmove", ad, "wheel"].forEach(function (K) {
                    N.addListener(K)
                }), N.initImageResource()
            };
        yc(mq, Zp, {
            enableVR: function (V) {
                var l = this;
                if (!!l._vrEnable !== V)
                    if (l._vrEnable = V, V) l.gv.vr.mp(l.onVRControllerChange, l);
                    else if (l.gv.vr.ump(l.onVRControllerChange, l), l._vrRayPolyline) {
                        var R = l.gv.dm();
                        R.remove(l._vrRayPolyline), R.remove(l._vrRayHitPoint), l._vrRayPolyline = Z, l._vrRayHitPoint = Z
                    }
            }, onVRControllerChange: function (g) {
                var Z = this,
                    V = g.property,
                    r = g.newValue,
                    B = Z.gv.vr.getController(r.id),
                    p = B.getRay();
                p && ("gamepad.button.trigger" === V ? "down" === r._62O ? Z.handle_mousedown(p) : Z.handleWindowMouseUp(p) : "gamepad.pose" === V && (Z.handle_mousemove(p), Z.handleWindowMouseMove(p)))
            }, drawVRRay: function (m, Q, V) {
                var C, A = this,
                    J = A.gv,
                    G = A._vrRayPolyline,
                    K = !1;
                if (G) C = A._vrRayHitPoint;
                else {
                    var W = J.dm();
                    A._vrRayPolyline = G = new O.Polyline, A._vrRayHitPoint = C = new O.Node, C.s({
                        shape3d: "billboard",
                        "shape3d.transparent": !0,
                        "texture.scale": 10,
                        "shape3d.image": "coreInteractorRayHitImage"
                    }), C.setAnchor3d(.5, .5, .499);
                    var k = .2 / J.vr.measureOflength;
                    C.s3(k, k, k), G.s("intersect", !1), C.s("intersect", !1), W.add(G), W.add(C), K = !0
                } if (Q) {
                    var L = V.world,
                        y = V.worldNormal,
                        t = L.x,
                        n = L.y,
                        f = L.z;
                    G.s("shape.border.color", "red"), G.setPoints([{
                        x: m.origin.x,
                        y: m.origin.z,
                        e: m.origin.y
                    }, {
                        x: t,
                        y: f,
                        e: n
                    }]), C.s("3d.visible", !0), C.p3(t, n, f), C.lookAtDirection([y.x, y.y, y.z], "front")
                } else {
                    G.s("shape.border.color", "blue");
                    var S = new O.Math.Vector3;
                    S.copy(m.direction).setLength(1e3 / A.gv.vr.measureOflength).add(m.origin), G.setPoints([{
                        x: m.origin.x,
                        y: m.origin.z,
                        e: m.origin.y
                    }, {
                        x: S.x,
                        y: S.z,
                        e: S.y
                    }]), C.s("3d.visible", !1)
                }
                J.fi({
                    kind: "vrRayIntersect",
                    ray: m,
                    data: Q,
                    intersect: V,
                    polyline: G,
                    hitNode: C,
                    begin: K
                })
            }, setPreventEventDefault: function (x, c) {
                var T = this,
                    f = T._eventListeners[x];
                f ? f._prevent = c : T._eventListeners[x] = f = {
                    _removal: Z,
                    _prevent: c
                }
            }, removeListener: function (L) {
                var c = this,
                    T = c._eventListeners[L];
                T && T._removal && (T._removal(), T._removal = Z)
            }, addListener: function (G) {
                var s = this,
                    v = s._eventListeners[G];
                if (v || (s._eventListeners[G] = v = {
                    _removal: Z,
                    _prevent: !0
                }), !v || !v._removal) {
                    var f = function (I) {
                        v._prevent && u.preventDefault(I), s.disabled || ("wheel" === G ? sg(s, I) : s["handle_" + G](I))
                    };
                    K(s.gv.getView(), G, f), v._removal = function () {
                        b(s.gv.getView(), G, f)
                    }
                }
            }, handleWindowTouchMove: function (r) {
                this.handleWindowMouseMove(r)
            }, handleWindowMouseMove: function (v) {
                this.downInfo && (this.isDragging ? this.handleDownInfo("onDrag", v) : (this.handleDownInfo("onBeginDrag", v), this.isDragging = !0))
            }, handleWindowTouchEnd: function (j) {
                this.handleWindowMouseUp(j)
            }, handleWindowMouseUp: function (k) {
                if (this.isDragging && (this.handleDownInfo("onEndDrag", k), this.isDragging = !1), this.downInfo) {
                    var c = this.handle("onUp", k);
                    if (c && c.data === this.downInfo.data) {
                        this.handleMissingUp(k);
                        var J = this,
                            z = 2 === k.button ? "onContextMenu" : "onClick";
                        if (!J._dbclickTimer) return J._dbclickTimer = cd(function () {
                            delete J._dbclickTimer, J.handleClick(k, z, c), this.downInfo = F
                        }, u.clickDelay), void 0;
                        nr(J._dbclickTimer), delete J._dbclickTimer, z = "onDoubleClick", J.handleClick(k, z, c)
                    } else this.handleDownInfo("onUp", k);
                    this.downInfo = F
                }
            }, handle_mouseleave: function (f) {
                var e = this,
                    w = e.gv,
                    z = e.currentInfo ? e.currentInfo.data : F;
                if (z) {
                    z.s("onLeave") && z.s("onLeave")(f, z, w), e.fire("data", "onLeave", f, z);
                    var X = e.currentInfo ? e.currentInfo.hits : F;
                    if (X)
                        for (var R in X) e.handleLeave(f, R);
                    e.currentInfo = F
                }
            }, handle_mousewheel: function (R) {
                R.scrollDelta = R.wheelDelta / 40, this.handle("onScroll", R)
            }, handle_DOMMouseScroll: function (E) {
                E.scrollDelta = 2 === E.axis ? -E.detail : 0, this.handle("onScroll", E)
            }, handle_touchstart: function (r) {
                this.handle_mousedown(r)
            }, handle_touchmove: function (x) {
                this.handle("onMove", x)
            }, handle_mousedown: function (G) {
                this.isDragging && (this.handleDownInfo("onEndDrag", G), this.isDragging = !1), this.downInfo = this.handle("onDown", G), this.downInfo && Lj(this, G)
            }, handle_mousemove: function (p) {
                var k = this,
                    $ = k.gv;
                k._hoverTimer && (nr(k._hoverTimer), delete k._hoverTimer);
                var h, I, T, S = k.handle("onMove", p),
                    w = this.currentInfo ? this.currentInfo.data : F,
                    v = this.currentInfo ? this.currentInfo.hits : F;
                if (S && (I = S.data, T = S.hits, k._hoverTimer = cd(function () {
                    nr(k._hoverTimer), delete k._hoverTimer, k.handle("onHover", p, S)
                }, $.getHoverDelay() || u.hoverDelay)), I !== w) {
                    if (w && (w.s("onLeave") && w.s("onLeave")(p, w, $), this.fire("data", "onLeave", p, w)), I && (I.s("onEnter") && I.s("onEnter")(p, I, $), this.fire("data", "onEnter", p, I)), v)
                        for (h in v) this.handleLeave(p, h);
                    if (T)
                        for (h in T) {
                            var O = T[h],
                                R = I._interactPrefix = O.prefix,
                                Y = R && I.a(R + "onEnter") || O.target.onEnter;
                            Y && Y.call(O.target, p, I, $, O.point, O.width, O.height), this.fire(O.type, "onEnter", O.event, O.data, O.image, O.comp, O.point, O), I._interactPrefix = null
                        }
                } else {
                    if (v)
                        for (h in v) T && T[h] || this.handleLeave(p, h);
                    if (T)
                        for (h in T)
                            if (!v || !v[h]) {
                                var O = T[h],
                                    R = I._interactPrefix = O.prefix,
                                    Y = R && I.a(R + "onEnter") || O.target.onEnter;
                                Y && Y.call(O.target, p, I, $, O.point, O.width, O.height), this.fire(O.type, "onEnter", O.event, O.data, O.image, O.comp, O.point, O), I._interactPrefix = null
                            }
                }
                this.currentInfo = S
            }, handle: function (M, r, m) {
                var D, j = this,
                    v = j.gv;
                if (j._is2d) {
                    if (m = m || v.getDataInfoAt(r), !m || !v.isInteractive(m.data)) return;
                    if (D = m.ui.interactiveInfo) {
                        var u, f = m.data;
                        if (f.s(M) && f.s(M)(r, f, v), this.fire("data", M, r, f), "body" === m.part && D.bodyInfo) u = "body", m.hits = this.handleImage(u, v.getImage(f), M, r, f, m.point, D.bodyInfo);
                        else if ("icons" === m.part && D._38o) {
                            var J = D._38o[m.name];
                            J && J[m.index] && (u = "icons|" + m.name + "|" + m.index, m.hits = this.handleImage(u, m.icon, M, r, f, m.point, J[m.index]))
                        }
                    }
                    return m
                }
                var f, K;
                if (!m)
                    if (r && r instanceof O.Math.Ray) {
                        var y = v.vr.intersectWorld(r);
                        if (f = y.data, K = y.intersect, j.drawVRRay(r, f, K), !f) return;
                        var n = v.getData3dUI(f);
                        if (D = n.interactiveInfo, !D) return;
                        m = {
                            data: f,
                            part: K.part,
                            ui: n
                        }
                    } else {
                        if (m = v.getDataInfoAt(r), !m) return;
                        m && (m = {
                            data: m.data,
                            part: m.part
                        })
                    }
                if (v.isInteractive(m.data)) {
                    if (!K) {
                        f = m.data;
                        var n = v.getData3dUI(f);
                        if (m.ui = n, D = n.interactiveInfo, !D) return m;
                        if (K = v.intersectObject(r, f), !K) return
                    }
                    f.s(M) && f.s(M)(r, f, v), this.fire("data", M, r, f);
                    var z, B = K.part;
                    return "body" !== B && (z = f.s(B + ".image") || f.s("shape3d." + B + ".image")), z || (z = f.s("all.image") || f.s("shape3d.image")), z ? (D = "object" == typeof z ? D[z.uuid] : D[z], D && D.bodyInfo ? (m.part = "body", m.interactiveInfo = D, m.point = this._convertUVToPoint(K.uv, D), m.image = z, m.hits = this.handleImage("body", z, M, r, f, m.point, D.bodyInfo), m) : m) : m
                }
            }, _handleLeaveOrMissing: function (J, E, I) {
                var v = "leave" === J ? this.currentInfo : this.downInfo;
                if (v) {
                    var j = v.interactiveInfo || v.ui.interactiveInfo;
                    if (j) {
                        var C, $, z = v.data;
                        if (this._is2d) {
                            if ($ = this.gv.lp(E), "body" === v.part && j.bodyInfo) C = "body", "leave" === J ? this.handleLeaveImage(I, C, this.gv.getImage(z), E, z, $, j.bodyInfo) : this.handleMissingUpImage(C, this.gv.getImage(z), E, z, $, j.bodyInfo);
                            else if ("icons" === v.part && j._38o) {
                                var R = j._38o[v.name];
                                R && R[v.index] && (C = "icons|" + v.name + "|" + v.index, "leave" === J ? this.handleLeaveImage(I, C, v.icon, E, z, $, R[v.index]) : this.handleMissingUpImage(C, v.icon, E, z, $, R[v.index]))
                            }
                        } else {
                            if (!j.bodyInfo) return;
                            var r = this.gv.intersectObject(E, z);
                            $ = r && r.uv ? this._convertUVToPoint(r.uv, j) : {
                                x: 1 / 0,
                                y: 1 / 0
                            }, "leave" === J ? this.handleLeaveImage(I, "body", v.image, E, z, $, j.bodyInfo) : this.handleMissingUpImage("body", v.image, E, z, $, j.bodyInfo)
                        }
                    }
                }
            }, handleClick: function (l, h, M) {
                var x = this,
                    B = this.downInfo;
                if (B && M) {
                    var Y, c = M.interactiveInfo || M.ui.interactiveInfo,
                        W = M.data,
                        q = this.gv;
                    if (W.s(h) && W.s(h)(l, W, q), x.fire("data", h, l, W), c)
                        if (this._is2d) {
                            if (B.part === M.part) {
                                var n = q.lp(l);
                                "body" === M.part && c.bodyInfo && (Y = "body", this.handleClickImage(Y, q.getImage(W), h, l, W, n, c.bodyInfo, M))
                            }
                        } else {
                            if (!c.bodyInfo) return;
                            var U = q.intersectObject(l, W);
                            if (!U) return;
                            n = this._convertUVToPoint(U.uv, c), this.handleClickImage("body", B.image, h, l, W, n, c.bodyInfo, M)
                        }
                }
            }, handleDownInfo: function (T, B) {
                if (this.downInfo) {
                    var w = this.downInfo,
                        q = this.gv,
                        d = w.interactiveInfo || w.ui.interactiveInfo;
                    if (d) {
                        var W, N = w.data;
                        if (N.s(T) && N.s(T)(B, N, q), this.fire("data", T, B, N), this._is2d) {
                            var D = q.lp(B);
                            if ("body" === w.part && d.bodyInfo) W = "body", this.handleDownInfoImage(W, q.getImage(N), T, B, N, D, d.bodyInfo);
                            else if ("icons" === w.part && d._38o) {
                                var t = d._38o[w.name];
                                t && t[w.index] && (W = "icons|" + w.name + "|" + w.index, this.handleDownInfoImage(W, w.icon, T, B, N, D, t[w.index]))
                            }
                        } else {
                            if (!d.bodyInfo) return;
                            var K = q.intersectObject(B, N);
                            if (!K) return;
                            D = this._convertUVToPoint(K.uv, d), this.handleDownInfoImage("body", w.image, T, B, N, D, d.bodyInfo)
                        }
                    }
                }
            }, fire: function (N, u, v, H, i, g, U, q) {
                this.gv.fi({
                    kind: u,
                    type: N,
                    event: v,
                    data: H,
                    image: i,
                    comp: g,
                    view: this.gv,
                    point: U,
                    width: q ? q.width : Z,
                    height: q ? q.height : Z
                })
            }, handleImage: function (j, I, E, F, t, W, m) {
                var $ = {};
                if (I && (I = ii(I))) {
                    var B = this.gv,
                        b = m.rect,
                        s = this.convertPoint(W, m);
                    s.inRect && (I[E] && I[E](F, t, B, s, b.width, b.height), this.fire("image", E, F, t, I, Z, s, b), $[j + "|image"] = {
                        target: I,
                        type: "image",
                        image: I,
                        data: t,
                        event: F,
                        point: s,
                        width: b.width,
                        height: b.height
                    });
                    for (var l, R = m.compInfos, e = I, L = R.length - 1; L >= 0; L--) {
                        var q = R[L],
                            z = q.comp;
                        if (s = this.convertPoint(W, q, e, z, B, t), s.inRect) {
                            b = q.rect;
                            var y = t._interactPrefix = q.prefix,
                                h = y && t.a(y + E) || z[E];
                            if (h && (l = h.call(z, F, t, B, s, b.width, b.height)), this.fire("comp", E, F, t, I, z, s, b), l !== !0 && (I = b.image) && (I[E] && (l = I[E](F, t, B, s, b.width, b.height)), this.fire("image", E, F, t, I, Z, s, b)), t._interactPrefix = null, $[j + "|" + L] = {
                                target: z,
                                type: "comp",
                                comp: z,
                                image: I,
                                data: t,
                                event: F,
                                point: s,
                                width: b.width,
                                height: b.height,
                                prefix: y
                            }, I && ($[j + "|" + L + "|image"] = {
                                target: I,
                                type: "image",
                                image: I,
                                data: t,
                                event: F,
                                point: s,
                                width: b.width,
                                height: b.height,
                                prefix: y
                            }), l === !0) break
                        }
                    }
                }
                return $
            }, handleLeave: function (S, F) {
                return this._handleLeaveOrMissing("leave", S, F)
            }, handleMissingUp: function (Z) {
                return this._handleLeaveOrMissing("missing", Z)
            }, handleLeaveImage: function (u, E, B, L, v, b, Q) {
                if (B && (B = ii(B))) {
                    var z = this.gv,
                        w = Q.rect,
                        x = this.convertPoint(b, Q);
                    u === E + "|image" && (B.onLeave && B.onLeave(L, v, z, x, w.width, w.height), this.fire("image", "onLeave", L, v, B, Z, x, w));
                    for (var j, f = Q.compInfos, P = B, l = f.length - 1; l >= 0; l--) {
                        var q = f[l],
                            M = q.comp;
                        x = this.convertPoint(b, q, P, M, z, v), w = q.rect;
                        var D = v._interactPrefix = q.prefix;
                        if (u === E + "|" + l) {
                            var t = D && v.a(D + "onLeave") || M.onLeave;
                            t && (j = t.call(M, L, v, z, x, w.width, w.height)), this.fire("comp", "onLeave", L, v, B, M, x, w)
                        }
                        if (j !== !0 && (B = w.image) && u === E + "|" + l + "|image" && (B.onLeave && (j = B.onLeave(L, v, z, x, w.width, w.height)), this.fire("image", "onLeave", L, v, B, Z, x, w)), v._interactPrefix = null, j === !0) break
                    }
                }
            }, handleMissingUpImage: function (M, I, $, T, m, g) {
                var N = "onUp",
                    A = this.downInfo.hits;
                if (A && I && (I = ii(I))) {
                    var L = this.gv,
                        y = g.rect,
                        W = this.convertPoint(m, g);
                    !W.inRect && A[M + "|image"] && (I[N] && I[N]($, T, L, W, y.width, y.height), this.fire("image", N, $, T, I, Z, W, y));
                    for (var U, j = g.compInfos, G = I, C = j.length - 1; C >= 0; C--) {
                        var w = j[C],
                            B = w.comp;
                        if (W = this.convertPoint(m, w, G, B, L, T), !W.inRect) {
                            y = w.rect;
                            var b = T._interactPrefix = w.prefix;
                            if (A[M + "|" + C]) {
                                var P = b && T.a(b + N) || B[N];
                                P && (U = P.call(B, $, T, L, W, y.width, y.height)), this.fire("comp", N, $, T, I, B, W, y)
                            }
                            if (U !== !0 && (I = y.image) && A[M + "|" + C + "|image"] && (I[N] && (U = I[N]($, T, L, W, y.width, y.height)), this.fire("image", N, $, T, I, Z, W, y)), T._interactPrefix = null, U === !0) break
                        }
                    }
                }
            }, handleDownInfoImage: function (H, L, M, E, n, p, l) {
                var Y = this.downInfo.hits;
                if (Y && L && (L = ii(L))) {
                    var j = this.gv,
                        P = l.rect,
                        D = this.convertPoint(p, l);
                    Y[H + "|image"] && (L[M] && L[M](E, n, j, D, P.width, P.height), this.fire("image", M, E, n, L, Z, D, P));
                    for (var g, V = l.compInfos, S = L, N = V.length - 1; N >= 0; N--) {
                        var B = V[N],
                            X = B.comp;
                        D = this.convertPoint(p, B, S, X, j, n), P = B.rect;
                        var z = n._interactPrefix = B.prefix;
                        if (Y[H + "|" + N]) {
                            var $ = z && n.a(z + M) || X[M];
                            $ && (g = $.call(X, E, n, j, D, P.width, P.height)), this.fire("comp", M, E, n, L, X, D, P)
                        }
                        if (g !== !0 && (L = P.image) && Y[H + "|" + N + "|image"] && (L[M] && (g = L[M](E, n, j, D, P.width, P.height)), this.fire("image", M, E, n, L, Z, D, P)), n._interactPrefix = null, g === !0) break
                    }
                }
            }, handleClickImage: function (d, u, n, v, A, b, c, o) {
                var k = this.downInfo.hits,
                    U = o.hits;
                if (k && u && (u = ii(u))) {
                    var X = this.gv,
                        F = c.rect,
                        q = this.convertPoint(b, c);
                    k[d + "|image"] && (u[n] && u[n](v, A, X, q, F.width, F.height), this.fire("image", n, v, A, u, Z, q, F));
                    for (var _, B = c.compInfos, D = u, e = B.length - 1; e >= 0; e--) {
                        var J = B[e],
                            g = J.comp;
                        q = this.convertPoint(b, J, D, g, X, A), F = J.rect;
                        var P = A._interactPrefix = J.prefix;
                        if (k[d + "|" + e] && U[d + "|" + e]) {
                            var j = P && A.a(P + n) || g[n];
                            j && (_ = j.call(g, v, A, X, q, F.width, F.height)), this.fire("comp", n, v, A, u, g, q, F)
                        }
                        if (_ !== !0 && (u = F.image) && k[d + "|" + e + "|image"] && (u[n] && (_ = u[n](v, A, X, q, F.width, F.height)), this.fire("image", n, v, A, u, Z, q, F)), A._interactPrefix = null, _ === !0) break
                    }
                }
            }, initImageResource: function () {
                u.setImage("coreInteractorRayHitImage", {
                    width: 16,
                    height: 16,
                    comps: [{
                        type: "oval",
                        background: "rgb(255,0,0)",
                        borderWidth: 1,
                        borderColor: "rgb(250,120,120)",
                        opacity: .3,
                        rotation: -1.593,
                        rect: [.73315, .6933, 14.5337, 14.61341]
                    }, {
                        type: "oval",
                        background: "rgb(255,0,0)",
                        borderWidth: 1,
                        borderColor: "rgb(250,120,120)",
                        rotation: -1.593,
                        rect: [3.56695, 3.75073, 8.8661, 8.49856]
                    }]
                })
            }, _convertUVToPoint: function (w, O) {
                if (!w) return {
                    x: 1 / 0,
                    y: 1 / 0
                };
                var n = O.bodyInfo.rect,
                    N = w.clone(),
                    g = w.multiply({
                        x: n.width,
                        y: n.height
                    });
                return g.local = N, g
            }, convertPoint: function (R, P, t, m, O, S) {
                var $ = P.rect,
                    i = P.matrix.applyInverse(R).sub($),
                    z = i.x >= 0 && i.y >= 0 && i.x <= $.width && i.y <= $.height;
                if (!z) return i;
                if (m && Dj(m.pixelPerfect, S, O)) {
                    var $, k = 1;
                    this._is2d ? (k = O.getZoom(), $ = Cc(R.x, R.y, Z, k)) : $ = Cc(R.x, R.y);
                    var N = !1,
                        B = $.x,
                        s = $.y,
                        f = $.width,
                        V = $.height,
                        x = u.hitMaxArea,
                        T = f * V * k * k;
                    if (T > x) {
                        var c = Math.sqrt(x / T);
                        k *= c
                    }
                    f *= k, V *= k, 2 > f && (f = 2), 2 > V && (V = 2), B *= k, s *= k;
                    var I = Cr(f, V),
                        q = new Np(0, -B, -s, k, k);
                    q.append(P.matrix), O._drawForChecking = !0, m.transform = q, P.refRect && P.refRect.fitSize && (m.refRect = P.refRect);
                    var p = t.comps;
                    t.comps = [m], Yd(I, t, 0, 0, f, V, S, self), t.comps = p, delete m.refRect, delete m.transform, O._drawForChecking = !1;
                    try {
                        for (var v = 0, J = I.getImageData(0, 0, f, V).data; v < J.length; v += 4)
                            if (0 !== J[v + 3]) {
                                N = !0;
                                break
                            }
                        I.restore()
                    } catch (o) {
                        xm = F, N = !1
                    }
                    i.inRect = N
                } else i.inRect = !0;
                return i
            }
        });
        var pk = hg.DefaultInteractor = function (C) {
            fi(pk, this, [C])
        };
        Bb("DefaultInteractor", Zp, {
            handle_mousedown: function (q) {
                Qc(q);
                var k = this,
                    R = k.gv,
                    Q = R.getDataAt(q);
                if (R.setFocus(q) && !R._editing && !R._scrolling) {
                    wm(q) ? R.handleDoubleClick(q, Q) : R.handleClick(q, Q);
                    var I = Fm(q);
                    !Cf() && !I && Q && (R.isMovable(Q) || R._39Q(Q)) || !R.isPannable() || !jj(q) && !I || ik(q) || (k._tx = R.tx(), k._ty = R.ty(), k.startDragging(q))
                }
            }, handleWindowMouseUp: function (X) {
                var e = this,
                    l = e.gv;
                l._panning && (delete l._panning, l.onPanEnded(), e.fi({
                    kind: "endPan",
                    event: X
                })), delete e._tx, delete e._ty, e.clearDragging()
            }, handle_mousemove: function (F) {
                var q = this,
                    C = q.gv;
                q._hoverTimer && (nr(q._hoverTimer), delete q._hoverTimer), q._hoverTimer = cd(function () {
                    q.fi({
                        kind: "hover",
                        event: F
                    }), nr(q._hoverTimer), delete q._hoverTimer
                }, C.getHoverDelay() || u.hoverDelay)
            }, handle_touchmove: function (U) {
                this.handle_mousemove(U)
            }, handleWindowMouseMove: function (S) {
                var I = this,
                    u = I.gv;
                I.fi({
                    kind: u._panning ? "betweenPan" : "beginPan",
                    event: S
                }), u._panning = 1;
                var g = wq(u, S, I._lastClientPoint);
                u.setTranslate(I._tx + g.x, I._ty + g.y)
            }, handle_mousewheel: function (P) {
                this.gv.handleScroll(P, P.wheelDelta)
            }, handle_DOMMouseScroll: function (D) {
                2 === D.axis && this.gv.handleScroll(D, -D.detail)
            }, handle_keydown: function (g) {
                this.gv.handleKeyDown(g)
            }
        });
        var ng = hg.SelectInteractor = function (t) {
            fi(ng, this, [t])
        };
        Bb("SelectInteractor", Zp, {
            _42: function () {
                var c = this,
                    i = c.gv,
                    B = i.getZoom(),
                    K = c.mark,
                    g = c.div;
                g || (g = c.div = dd(), sn(c.getView(), g));
                var D = {};
                D.x = K.x * B + i.tx(), D.y = K.y * B + i.ty(), D.width = K.width * B, D.height = K.height * B, qp(g, D), this.intersects() ? (g.style.border = "", g.style.background = i.getRectSelectBackground()) : (g.style.background = "", g.style.border = "1px solid " + i.getRectSelectBorderColor())
            }, handle_mousedown: function (z) {
                var v = this,
                    E = v.gv;
                if (v._57I = F, v.pendingClickThrough = F, !(E._editing || E._scrolling || Cf() || Fm(z))) {
                    var g = E.getDataAt(z),
                        I = E.sm();
                    g ? ik(z) ? I.co(g) ? I.rs(g) : I.as(g) : I.co(g) ? g instanceof Br && g.isClickThroughEnabled() && jj(z) && (v.pendingClickThrough = lb(z)) : I.ss(g) : ik(z) || !E.isPannable() ? jj(z) && (ik(z) || I.cs(), E.isRectSelectable() && (v.startDragging(z), E._77O = 1)) : jj(z) && (v._57I = lb(z))
                }
            }, handle_mouseup: function (_) {
                var y = this,
                    S = y.gv,
                    Z = y._57I;
                if (Z && (En(Z, lb(_)) <= 1 && S.sm().cs(), y._57I = F), y.pendingClickThrough) {
                    if (En(y.pendingClickThrough, lb(_)) <= 1) {
                        var n = S.getDataAt(_);
                        if (n instanceof Br && n.isClickThroughEnabled()) {
                            var h = S.getDataAt(_, function (f) {
                                var u = f.getParent() === n && S.isSelectable(f, !0);
                                return u
                            });
                            h && (_.clickThrough = !0, S.sm().ss(h))
                        }
                    }
                    y.pendingClickThrough = F
                }
            }, handleWindowMouseUp: function (Y) {
                this.clear(Y)
            }, handleWindowMouseMove: function (U) {
                var K = this,
                    $ = K.gv;
                K._logicalPoint = $.lp(U), K.mark ? (K.fi({
                    kind: "betweenRectSelect",
                    event: U
                }), $.isPannable() && K.autoScroll(U), K.redraw()) : K.fi({
                    kind: "beginRectSelect",
                    event: U
                }), K.mark = ms(K._lastLogicalPoint, K._logicalPoint), K.redraw()
            }, intersects: function () {
                var J = this,
                    v = J._lastLogicalPoint,
                    b = J._logicalPoint;
                return v.x > b.x || v.y > b.y
            }, clear: function (w) {
                var G = this,
                    O = G.gv,
                    Y = G.mark;
                if (G._57I = F, G.pendingClickThrough = F, G._lastLogicalPoint) {
                    if (Y) {
                        if (0 !== Y.width && 0 !== Y.height) {
                            var $ = O.getDatasInRect(Y, G.intersects());
                            if (!$.isEmpty()) {
                                var P = O.sm(),
                                    E = P.toSelection();
                                $.each(function (h) {
                                    P.co(h) ? E.remove(h) : E.add(h)
                                }), P.ss(E)
                            }
                        }
                        yj(G.div), delete G.div, delete G.mark, G.redraw(), G.fi({
                            kind: "endRectSelect",
                            event: w
                        }), O.onRectSelectEnded()
                    }
                    G.clearDragging(), delete O._77O
                }
            }, redraw: function () {
                var u = this;
                u._draw || (u._draw = 1, cd(function () {
                    u.mark && u._42(), delete u._draw
                }, 16))
            }
        });
        var Wr = hg.MoveInteractor = function (l) {
            fi(Wr, this, [l])
        };
        Bb("MoveInteractor", Zp, {
            handle_mousedown: function (y) {
                var n = this,
                    m = n.gv;
                if (jj(y) && !m._editing && !m._scrolling && !Cf()) {
                    var w = m.getSelectedDataAt(y);
                    !w || m._39Q(w) && !m.isMovable(w) ? m._focusData = F : (n._data = w, m.handleMouseDown && m.handleMouseDown(y, w), n.startDragging(y), m.isMovable(w) && (m._moving = 1))
                }
            }, handleWindowMouseUp: function (J) {
                var U = this,
                    F = U.gv;
                F.handleMouseUp && F.handleMouseUp(J, U._data), U.clear(J)
            }, handleWindowMouseMove: function (v) {
                var E = this,
                    t = E._data,
                    U = E.gv;
                if ((!U._93O || !U._93O(v, t)) && U._moving) {
                    E._logicalPoint || E.fi({
                        kind: "prepareMove",
                        event: v
                    });
                    var Y = E._logicalPoint ? "betweenMove" : "beginMove",
                        W = {
                            kind: Y,
                            event: v
                        },
                        $ = E._logicalPoint = U.lp(v);
                    "beginMove" !== Y || E._alreadyBeginTransaction || (E._alreadyBeginTransaction = !0, U.getDataModel().beginTransaction());
                    var R = E._calcShift(Y, v),
                        O = R.x,
                        J = R.y,
                        k = E.gv.getMoveMode(v, t);
                    k && ("x" === k ? J = 0 : "y" === k ? O = 0 : "xy" !== k && (O = J = 0)), U.moveSelection(O, J), E._lastLogicalPoint = $, E.autoScroll(v), E.fi(W)
                }
            }, _calcShift: function () {
                var m = this,
                    s = m._logicalPoint,
                    t = m._lastLogicalPoint,
                    q = s.x - t.x,
                    x = s.y - t.y;
                return {
                    x: q,
                    y: x
                }
            }, clear: function (u) {
                var P = this,
                    L = P.gv;
                P._lastLogicalPoint && (P._lastLogicalPoint = P._data = L._moving = F, P._logicalPoint && (P.fi({
                    kind: "endMove",
                    event: u
                }), L.onMoveEnded()), P.clearDragging()), P._alreadyBeginTransaction && (P._alreadyBeginTransaction = !1, L.getDataModel().endTransaction())
            }
        });
        var eb = hg.TextEditInteractor = function (C) {
            fi(eb, this, [C]), this.init()
        };
        Bb("TextEditInteractor", Zp, {
            init: function () {
                var m = this,
                    _ = this.input = U.createElement("input"),
                    V = _.style;
                _.text = "text", V.border = "1px solid #d8d8d8", V.position = "absolute", V.padding = "2px 3px", V.outline = "none", V.marginLeft = "-90px", V.marginTop = "-16px", V.backgroundColor = "rgba(255,255,255, 0.9)", V.fontSize = "14px", V.width = "180px", V.height = "32px", V.boxShadow = "0 0 13px rgba(16,142,233, 0.5)", V.textAlign = "center", V.boxSizing = "border-box", K(_, "keyup", function (S) {
                    hd(S) && m.endTextEdit()
                }), K(_, "focus", function () {
                    _.select()
                });
                var F = this.textarea = U.createElement("textarea"),
                    R = this.wrap = U.createElement("div");
                R.appendChild(F), V = F.style, V.margin = 0, V.padding = "4px", V.overflow = "hidden", V.boxSizing = "border-box", V.position = "absolute", V.outline = "none", V.backgroundColor = "transparent", V.resize = "none", V.textAlign = "center", V.fontSize = "14px", V.border = "none", V.borderWidth = 0, V.width = "100%", V.top = "50%", V = R.style, V.boxSizing = "border-box", V.margin = 0, V.padding = 0, V.position = "absolute", V.boxShadow = "0 0 13px rgba(16,142,233, 0.5)", V.border = "1px solid #d8d8d8", V.backgroundColor = "rgba(255,255,255, 0.9)", V.width = "180px", V.marginLeft = "-90px", K(F, "keydown", function (t) {
                    return (Pf() || ik()) && hd(t) ? (m.endTextEdit(), void 0) : (m.calculateTextareaHeight(String.fromCharCode(t.keyCode)), void 0)
                }), K(F, "focus", function () {
                    F.select()
                });
                var C = function (p) {
                    p.stopPropagation()
                };
                K(_, "mousedown", C), K(_, "touchstart", C), K(F, "mousedown", C), K(F, "touchstart", C), m.SIZING_STYLE = ["letter-spacing", "line-height", "padding-top", "padding-bottom", "font-family", "font-weight", "font-size", "text-rendering", "text-transform", "width", "text-indent", "padding-left", "padding-right", "border-width", "box-sizing"], m.HIDDEN_TEXTAREA_STYLE = "visibility:hidden; min-height:0 !important;max-height:none !important;height:0 !important;visibility:hidden !important;overflow:hidden !important;position:absolute !important;z-index:-1000 !important;top:0 !important;right:0 !important", m.handleWindowClick = function (x) {
                    var q = m._editingDOM;
                    if (q) {
                        var X = q.getBoundingClientRect(),
                            G = lb(x);
                        cf(X, G) || m.endTextEdit()
                    }
                }
            }, handle_mousedown: function (P) {
                var l = this,
                    $ = l.gv;
                if (wm(P) && !$._editing) {
                    var M = $.getDataAt(P);
                    if (M) {
                        var a = $.getTextEditInfo(M);
                        a && (this._editInfo = a, this._editTarget = M, $._editing = !0, a.isMultiline ? this.handleMultilineEdit() : this.handleTextEdit())
                    }
                }
            }, handleMultilineEdit: function () {
                var l = this,
                    d = l.gv,
                    F = l._editTarget,
                    f = l.getTargetValue(),
                    Y = l.textarea,
                    R = l.wrap;
                this.hiddenTextarea || this.createHiddenTextarea(), (null === f || f === Z) && (f = ""), Y.value = f, l._editingDOM = Y, d.getView().appendChild(R), this.layoutHTML(R, F), this.calculateTextareaHeight(), cd(function () {
                    Y.focus(), K(x, "mousedown", l.handleWindowClick), K(x, "touchstart", l.handleWindowClick)
                }, 10)
            }, handleTextEdit: function () {
                var o = this,
                    H = o.gv,
                    s = o._editTarget,
                    q = o.getTargetValue(),
                    N = o.input;
                (null === q || q === Z) && (q = ""), N.value = q, o._editingDOM = N, H.getView().appendChild(N), this.layoutHTML(N, s), cd(function () {
                    N.focus(), K(x, "mousedown", o.handleWindowClick), K(x, "touchstart", o.handleWindowClick)
                }, 10)
            }, layoutHTML: function (X, z) {
                var J = this.gv,
                    t = J.getZoom();
                if (z instanceof O.Node) {
                    var Z = z.getRect();
                    X.style.left = (Z.x + Z.width / 2) * t + J.tx() + "px", X.style.top = (Z.y + Z.height / 2) * t + J.ty() + "px"
                } else if (z instanceof O.Edge) {
                    var E = J.getDataUI(z),
                        Z = E._6I;
                    X.style.left = (Z.x + Z.width / 2) * t + J.tx() + "px", X.style.top = (Z.y + Z.height / 2) * t + J.ty() + "px"
                }
            }, endTextEdit: function () {
                var m = this,
                    V = m._editInfo.isMultiline ? m.wrap : m.input,
                    $ = m._editInfo.isMultiline ? m.textarea : m.input;
                m.setTargetValue($.value), m.gv.getView().removeChild(V), m.gv._editing = !1, delete m._editingDOM, b(x, "mousedown", m.handlelick), b(x, "touchstart", m.handleWindowClick)
            }, setTargetValue: function (X) {
                var D = this,
                    P = D._editTarget,
                    E = D._editInfo,
                    V = E.accessType,
                    g = E.name;
                if (g && V || (V = "p", g = "name"), "p" === V) {
                    var T = O.Default.setter(g);
                    P[T](X)
                } else "a" === V ? P.a(g, X) : P.s(g, X)
            }, getTargetValue: function () {
                var u = this,
                    y = u._editTarget,
                    b = u._editInfo,
                    W = b.accessType,
                    j = b.name;
                if (j && W || (W = "p", j = "name"), "p" === W) {
                    var z = O.Default.getter(j);
                    return y[z]()
                }
                return "a" === W ? y.a(j) : y.s(j)
            }, createHiddenTextarea: function () {
                this.hiddenTextarea = U.createElement("textarea"), this.hiddenTextarea.setAttribute("style", "margin:0; padding:0; position:absolute; overflowY:scroll; resize:none; box-sizing:border-box;"), this.hiddenTextarea.setAttribute("rows", "1"), this.gv.getView().appendChild(this.hiddenTextarea)
            }, calculateHTMLStyle: function (n, K) {
                if (K && this.computedStyleCache) return this.computedStyleCache;
                var l = this,
                    z = x.getComputedStyle(n),
                    U = z.getPropertyValue("box-sizing") || z.getPropertyValue("-moz-box-sizing") || z.getPropertyValue("-webkit-box-sizing"),
                    v = parseFloat(z.getPropertyValue("padding-bottom")) + parseFloat(z.getPropertyValue("padding-top")),
                    G = parseFloat(z.getPropertyValue("border-bottom-width")) + parseFloat(z.getPropertyValue("border-top-width")),
                    h = l.SIZING_STYLE.map(function (A) {
                        return A + ":" + z.getPropertyValue(A)
                    }).join(";"),
                    R = {
                        sizingStyle: h,
                        paddingSize: v,
                        borderSize: G,
                        boxSizing: U
                    };
                return K && (this.computedStyleCache = R), R
            }, calculateTextareaHeight: function (P) {
                P = P || "";
                var Y = this,
                    S = Y.textarea,
                    Z = Y.hiddenTextarea,
                    t = Y.wrap,
                    g = 32,
                    C = Y.calculateHTMLStyle(S, !1),
                    G = C.paddingSize,
                    n = C.borderSize,
                    X = C.boxSizing,
                    $ = C.sizingStyle;
                Z.setAttribute("style", $ + ";" + Y.HIDDEN_TEXTAREA_STYLE), Z.value = S.value + P;
                var V = Z.scrollHeight;
                "border-box" === X ? V += n : "content-box" === X && (V -= G), S.style.height = V + "px", S.style.marginTop = 0 - .5 * V + "px", t.style.height = Math.max(V, g) + "px", t.style.marginTop = V * -.5 + "px"
            }
        });
        var Vl = hg.ScrollBarInteractor = function (u) {
            fi(Vl, this, [u])
        };
        Bb("ScrollBarInteractor", Zp, {
            _41o: function () {
                return this.gv.getViewRect().height < this.gv.getScrollRect().height
            }, _40o: function () {
                return this.gv.getViewRect().width < this.gv.getScrollRect().width
            }, isV: function (u) {
                var y = this.gv.getViewRect();
                return this._41o() && (y.x + y.width - this.gv.lp(u).x) * this.gv.getZoom() < co
            }, isH: function (r) {
                var z = this.gv.getViewRect();
                return this._40o() && (z.y + z.height - this.gv.lp(r).y) * this.gv.getZoom() < co
            }, handle_mousemove: function (z) {
                this.handle_touchmove(z)
            }, handle_touchmove: function (x) {
                if (!si && jj(x) && this.gv.isScrollBarVisible()) {
                    var r = this,
                        _ = r.isV(x),
                        X = r.isH(x);
                    (_ || X) && r.gv.showScrollBar(), r.gv._scrolling = _ || X
                }
            }, handleWindowMouseUp: function (E) {
                this.handleWindowTouchEnd(E)
            }, handleWindowTouchEnd: function (D) {
                this._state = this._cp = this._tx = this._ty = this.gv._scrolling = F, this.fi({
                    kind: "endScroll",
                    event: D
                })
            }, handle_mousedown: function (E) {
                this.handle_touchstart(E)
            }, handle_touchstart: function (w) {
                var g = this;
                if (g.gv.setFocus(w), Qc(w), g.handle_touchmove(w), !(Qj(w) > 1) && g.gv._scrolling && g.gv.isScrollBarVisible()) {
                    g._cp = lb(w), g._tx = g.gv.tx(), g._ty = g.gv.ty();
                    var n = g.isV(w);
                    g._state = n ? "vScroll" : "hScroll", Ui(g, w), g.fi({
                        kind: "beginScroll",
                        event: w
                    })
                }
            }, handleWindowMouseMove: function (W) {
                this.handleWindowTouchMove(W)
            }, handleWindowTouchMove: function (d) {
                var g = lb(d),
                    z = this.gv.getViewRect(),
                    G = this.gv.getScrollRect();
                "vScroll" === this._state ? this.gv.ty(this._ty + (this._cp.y - g.y) * G.height / z.height) : "hScroll" === this._state && this.gv.tx(this._tx + (this._cp.x - g.x) * G.width / z.width), this.fi({
                    kind: "betweenScroll",
                    event: d
                })
            }
        });
        var Jb = hg.TouchInteractor = function (y, s) {
            s = s || {}, s.selectable === Z && (s.selectable = !0), s.movable === Z && (s.movable = !0), s.pannable === Z && (s.pannable = !0), s.pinchable === Z && (s.pinchable = !0), s.editable === Z && (s.editable = !0), this.params = s, fi(Jb, this, [y])
        };
        Bb("TouchInteractor", Zp, {
            ms_edit: 1,
            setUp: function () {
                var H = this;
                Jb.superClass.setUp.call(H), nf && H.params.editable && H.gv.setEditInteractor(H)
            }, tearDown: function () {
                var _ = this;
                Jb.superClass.tearDown.call(_), nf && _.params.editable && _.gv.setEditInteractor(F)
            }, clear: function (l) {
                var P = this,
                    k = P.gv;
                k._moving && (P.fi({
                    kind: "endMove",
                    event: l
                }), delete k._moving, k.onMoveEnded(), k.dm().endTransaction()), k._panning && (P.fi({
                    kind: "endPan",
                    event: l
                }), delete k._panning, k.onPanEnded()), k._pinching && (P.fi({
                    kind: "endPinch",
                    event: l
                }), delete k._pinching, k.onPinchEnded()), k._editing && (P._46O(l), P._77I = P._node = P._edge = P._shape = P._rect = P._89I = P._index = k._editing = F), P.pendingClickThrough = P._moving = P._panning = P._pinching = P._editing = P._57I = P._data = P._beginHistory = F, P.clearDragging()
            }, handle_touchstart: function (g) {
                var u = this;
                if (!u.gv._editing) {
                    Qc(g), u._57I = F, u.pendingClickThrough = F;
                    var j = u.params,
                        A = u.gv,
                        Y = A.sm(),
                        I = A.getDataAt(g),
                        P = Qj(g);
                    if (1 === P) {
                        if (wm(g)) return A.handleDoubleClick(g, I), void 0;
                        A.handleClick(g, I), I && (A.handleMouseDown && A.handleMouseDown(g, I), u._data = I), j.selectable || (I = F), I && (Y.co(I) ? I instanceof Br && I.isClickThroughEnabled() && (u.pendingClickThrough = lb(g)) : Y.ss(I), j.editable && A.isEditable(I) && u._79I(g, I, !0) ? (u._editing = 1, u.startDragging(g)) : j.movable && A.isMovable(I) && (u._moving = 1, u.startDragging(g))), I && A.isMovable(I) || (u._57I = lb(g), j.pannable && A.isPannable() && (u._panning = 1, u.startDragging(g), u._translate = {
                            x: A.tx(),
                            y: A.ty()
                        }))
                    } else if (j.pinchable && 2 === P) {
                        if (I && A._39Q(I)) return;
                        u._pinching = 1, u.startDragging(g);
                        var $ = A.getView(),
                            V = A.getZoom(),
                            N = $.getBoundingClientRect(),
                            n = g.touches[0],
                            C = g.touches[1],
                            d = {
                                x: (n.clientX + C.clientX) / 2 - N.left,
                                y: (n.clientY + C.clientY) / 2 - N.top
                            };
                        d.x -= A.tx(), d.y -= A.ty(), d.x /= V, d.y /= V, u._p = d, u._d = zo(g)
                    }
                }
            }, handle_touchend: function (o) {
                var E = this,
                    t = E.gv,
                    g = E._57I,
                    j = E._data;
                if (g && (En(g, lb(o)) <= 1 && !t.getDataAt(o) && t.sm().cs(), E._57I = F), j && t.handleMouseUp && t.handleMouseUp(o, j), E.pendingClickThrough) {
                    if (En(E.pendingClickThrough, lb(o)) <= 1) {
                        var j = t.getDataAt(o);
                        if (j instanceof Br && j.isClickThroughEnabled()) {
                            var c = t.getDataAt(o, function (l) {
                                var A = l.getParent() === j && t.isSelectable(l, !0);
                                return A
                            });
                            c && (o.clickThrough = !0, t.sm().ss(c))
                        }
                    }
                    E.pendingClickThrough = F
                }
            }, handleWindowTouchEnd: function (e) {
                this.clear(e)
            }, handleWindowTouchMove: function (V) {
                var j = this,
                    N = j.gv,
                    w = Qj(V);
                if (1 === w) {
                    var S = lb(V),
                        m = wq(N, S, j._lastClientPoint),
                        Z = En({
                            x: 0,
                            y: 0
                        }, m);
                    if (j._editing && (j._beginHistory || (j._beginHistory = 1, N.dm().beginTransaction()), N._editing = 1, j._78I(V)), j._moving) {
                        if (!N._moving && Z < u.touchMoveThreshold) return;
                        j._beginHistory || (j._beginHistory = 1, N.dm().beginTransaction()), j.handleMove(V)
                    } else if (j._panning) {
                        if (!N._panning && Z < u.touchMoveThreshold) return;
                        N.setTranslate(j._translate.x + m.x, j._translate.y + m.y), j.fi({
                            kind: N._panning ? "betweenPan" : "beginPan",
                            event: V
                        }), N._panning = 1
                    }
                } else if (2 === w && j._pinching) {
                    var C = zo(V);
                    N.handlePinch(j._p, C, j._d), j._d = C, j.fi({
                        kind: N._pinching ? "betweenPinch" : "beginPinch",
                        event: V
                    }), N._pinching = 1
                }
            }, handleMove: function (a) {
                var l = this,
                    E = l.gv,
                    q = E.lp(a);
                E._93O && E._93O(a, l._data) || (E.moveSelection(q.x - l._lastLogicalPoint.x, q.y - l._lastLogicalPoint.y), l._lastLogicalPoint = q, l.autoScroll(a), l.fi({
                    kind: E._moving ? "betweenMove" : "beginMove",
                    event: a
                }), E._moving = 1)
            }
        });
        var O = x.ht,
            se = O.graph._editor = {
                Math: O.Math,
                Guide: {}
            };
        se.getStyle = function (K) {
            var _, V = se.StyleMap;
            return V && (_ = V[K], _ !== Z) ? _ : se.DefaultStyleMap[K]
        }, se.setStyle = function (h, t) {
            var V = se.StyleMap;
            V || (V = se.StyleMap = {}), V[h] = t
        }, se.inEdit = function (A) {
            return A._inXEdit === !0
        }, se.startEdit = function (l) {
            l._inXEdit = !0, se.Inject.doInject(l)
        }, se._46O = function (M) {
            M._inXEdit = !1, se.Inject.undoInject(M)
        }, se.toScreenPosition = function (J, g) {
            var d = J.tx(),
                G = J.ty(),
                T = J._zoom;
            return new se.Math.Vector2(g.x * T + d, g.y * T + G)
        }, se.checkHit = function (Y, l, s) {
            return Y.distanceTo(l) < s ? !0 : !1
        }, se.toWorldPosition = function (y, $) {
            var b = y.tx(),
                t = y.ty(),
                E = y._zoom;
            return {
                x: ($.x - b) / E,
                y: ($.y - t) / E
            }
        }, se.setAntialias = function (h, R) {
            for (var E, Z = ["imageSmoothingEnabled", "webkitImageSmoothingEnabled", "mozImageSmoothingEnabled", "oImageSmoothingEnabled", "msImageSmoothingEnabled"], r = 0, v = Z.length; v > r && (E = Z[r], !(E in h)); r++);
            h[E], h[E] = R
        }, se.getTargetCornersOnScreen = function (q, A) {
            if (!A) return null;
            var f, Y = [];
            if (Th(A, q)) {
                var J = Rp(q, A);
                f = [{
                    x: J.x,
                    y: J.y
                }, {
                    x: J.x + J.width,
                    y: J.y
                }, {
                    x: J.x + J.width,
                    y: J.y + J.height
                }, {
                    x: J.x,
                    y: J.y + J.height
                }]
            } else {
                if (!A.getCorners) return null;
                f = A.getCorners()
            }
            return f.forEach(function (t) {
                var S = se.toScreenPosition(q, t);
                Y.push(S.x, S.y)
            }), Y
        }, se.log = function () { };
        var Tl = se.Inject = {
            _modules: []
        };
        Tl.registAsModule = function (_, b) {
            var l = {},
                K = {};
            for (var s in _) {
                var V = b.prototype[s];
                l[s] = V
            }
            _.getBackup = function (b) {
                return l[b]
            }, _.getBackups = function () {
                return l
            }, K.doInject = function () {
                for (var l in _) "getBackup" !== l && (b.prototype[l] = _[l])
            }, K.undoInject = function () {
                for (var B in _) "getBackup" !== B && (b.prototype[B] = l[B])
            }, Tl._modules.push(K)
        }, Tl.doInject = function (A) {
            for (var c, K = Tl._modules, H = 0, e = K.length; e > H; H++) c = K[H], c.doInject(A)
        }, Tl.undoInject = function (_) {
            for (var c, a = Tl._modules, W = 0, o = a.length; o > W; W++) c = a[W], c.undoInject(_)
        };
        var Zp = O.graph.EditInteractor = function (m) {
            var f = this,
                F = U.createElement("canvas");
            F.className = "editCanvas", F.style.position = "absolute", f._styleMap = {}, f._canvas = F, f._context = F.getContext("2d"), Zp.superClass.constructor.call(f, m), this._editDetail = !1, se.setAntialias(f._context, !1), f._subModules = [new se.Anchor(f), new se.RotateX(f), new se.MoveDummy(f), new se.Rect(f), new se.Curve(f), new se.MoveHelper(f)], f._gridGuide = new se.Guide.Grid(f), f._rectGuide = new se.Guide.Rect(f), f._hoverGuide = new se.Guide.Hover(f)
        },
            vm = Zp;
        O.Default.def(Zp, O.graph.Interactor, {
            ms_edit: 1,
            ms_fire: 1
        }), o.defineProperties(Zp.prototype, {
            editDetail: {
                get: function () {
                    var d = !!this._editDetail;
                    return d
                }, set: function (y) {
                    var T = this,
                        c = T._editDetail;
                    c !== y && (T._editDetail = y, T.gv._editing = y, T.fp("editDetail", c, y), T.fp("pointsEditingMode", c, y), T.fi({
                        kind: y ? "beginEditPoints" : "endEditPoints"
                    }))
                }
            },
            gvEditing: {
                get: function () {
                    return this.gv._editing
                }, set: function (c) {
                    (!this._editDetail || c) && (this.gv._editing = c, c || (this.editDetail = !1))
                }
            },
            editing: {
                get: function () {
                    return this._editing
                }, set: function (_) {
                    this._editing = _, this.gvEditing = _
                }
            },
            editingModule: {
                get: function () {
                    return this._editMod
                }
            },
            pointsEditingMode: {
                get: function () {
                    return this.editDetail
                }, set: function (l) {
                    var K = this;
                    K.editDetail !== l && (l ? K._tryEnterEditDetailMode() : K._tryQuitEditDetailMode())
                }
            },
            gridEnabled: {
                get: function () {
                    var J = this._gridEnabled;
                    if (!J) return !1;
                    var E = this.gv;
                    return E ? !0 : !0
                }, set: function (G) {
                    G !== this._gridEnabled && (this._gridEnabled = G, this._42())
                }
            },
            alignmentGuideEnabled: {
                get: function () {
                    return this._agEnabled
                }, set: function (r) {
                    r !== this._agEnabled && (this._agEnabled = r, this._42())
                }
            },
            gridGuide: {
                get: function () {
                    return this._gridGuide
                }
            },
            rectGuide: {
                get: function () {
                    return this._rectGuide
                }
            },
            hoverGuide: {
                get: function () {
                    return this._hoverGuide
                }
            }
        }), Zp.prototype.getSubModule = function (r) {
            var p, B, Z, v = this._subModules;
            for (B = 0, Z = v.length; Z > B; B++)
                if (p = v[B], p.catalog === r) return p
        }, Zp.prototype.invokeSubModule = function (e, h) {
            var Q = this,
                b = Q._subModules;
            if (b)
                for (var f, K, A, I = Array.prototype.slice.call(arguments, 2), E = 0, S = b.length; S > E; E++)
                    if (f = b[E], K = f[e], K && (A = K.apply(f, I), A != Z && h)) return f
        }, Zp.prototype.invokeSubModuleInverse = function (L, Y) {
            var q = this,
                U = q._subModules;
            if (U)
                for (var K, T, a, X = Array.prototype.slice.call(arguments, 2), W = U.length - 1; W >= 0; W--)
                    if (K = U[W], T = K[L], T && (a = T.apply(K, X), a != Z && Y)) return K
        }, Zp.prototype.setUp = function () {
            se.log("setUp");
            var N = this,
                n = N.gv,
                L = n.getView(),
                h = N._canvas;
            Zp.superClass.setUp.call(N), n.setEditInteractor(N), n._79O ? L.insertBefore(h, n._79O) : L.appendChild(h), se.startEdit(n), N.invokeSubModule("setUp"), n.dm().mm(N._onDataModelChanged, N), n.dm().md(N._onDataPropertyChanged, N)
        }, Zp.prototype.tearDown = function () {
            se.log("tearDown");
            var Y = this,
                S = Y.gv,
                Z = S.getView();
            Y._resetCustomCursorStyle(), Zp.superClass.tearDown.call(Y), S.dm().umm(Y._onDataModelChanged, Y), S.dm().umd(Y._onDataPropertyChanged, Y), S.setEditInteractor(null), Z.removeChild(Y._canvas), Y._drawTimer && (nr(Y._drawTimer), Y._drawTimer = null), se._46O(S), Y.invokeSubModule("tearDown")
        }, Zp.prototype._onDataModelChanged = function (k) {
            var c = this;
            ("clear" === k.kind || "remove" === k.kind && c.editDetail && k.data === c.getSubModule("Curve").target) && (c.editDetail = !1, c._42())
        }, Zp.prototype._onDataPropertyChanged = function (w) {
            var o = this;
            if (o.editDetail) {
                var L = o.getSubModule("Curve"),
                    R = w.data;
                R === L.target && (R._writing || L._handleDataChanged(w))
            }
        }, Zp.prototype.clear = function () {
            se.log("clear")
        }, Zp.prototype.redraw = function () {
            this._42()
        }, Zp.prototype._42 = function () {
            var m = this;
            m._drawTimer || (m._drawTimer = cd(function () {
                m._drawTimer = null, m.drawImpl()
            }, 0))
        }, Zp.prototype.drawImpl = function () {
            var i;
            for (i in {
                _42: !0
            }) break;
            return function () {
                var M = this,
                    f = M._canvas,
                    C = M.gv,
                    r = C.getWidth(),
                    D = C.getHeight(),
                    t = M._context,
                    P = O.Default.getInternal(),
                    Q = x.devicePixelRatio;
                (f.width !== r || f.height !== D) && P.setCanvas(f, r, D, Q), t.clearRect(0, 0, f.width, f.height);
                var F = M._getValidSelection();
                t.save(), t.scale(Q, Q), M._gridGuide._42(), M.invokeSubModuleInverse(i, !1, t, C, F), M._rectGuide._42(), M._hoverGuide._42(), t.restore()
            }
        }(), Zp.prototype._getValidSelection = function () {
            var i = this,
                n = i.gv,
                v = n.sm().getSelection(),
                K = [];
            return v.each(function (N) {
                n.isVisible(N) && n.isEditable(N) && K.push(N)
            }), K
        }, Zp.prototype.handle_touchmove = function (Q) {
            return this.handle_mousemove(Q)
        }, Zp.prototype.handle_mousemove = function (u) {
            if (!O.Default.isDragging()) {
                var K = this;
                if ((K.editDetail || !Cf() && !Fm(u)) && !K.gv._externalEditing)
                    if (K.gvEditing = !1, K._checkEdit(u)) K.gvEditing = !0;
                    else {
                        if (!K.getStyle("hoverGuideVisible")) return;
                        K.hoverData = K.gv.getDataAt(u), K._42()
                    }
            }
        }, Zp.prototype.handle_touchstart = function (G) {
            return this.handle_mousedown(G)
        }, Zp.prototype.handle_mousedown = function (E) {
            Qc(E);
            var b = this;
            if ((b.editDetail || !Cf() && !Fm(E)) && !b.gv._externalEditing) {
                if (wm(E) && !E.clickThrough) {
                    if (b.editDetail) {
                        if (b._tryQuitEditDetailMode(E)) return
                    } else if (b._tryEnterEditDetailMode()) return;
                    b.gv.dm().beginTransaction();
                    var B = b.invokeSubModule("handleDoubleClick", !0, E);
                    if (b.gv.dm().endTransaction(), B) return
                }
                var T = b._checkEdit(E);
                T && (b._downPosition = b._getLogicalPoint(E), b.gv.dm().beginTransaction(), T.startEdit(b, E), b.editing = !0)
            }
        }, Zp.prototype._checkEdit = function (U) {
            var P = this,
                O = P.gv,
                B = P._getLogicalPoint(U),
                K = P.invokeSubModule("check", !0, O, U, B) || null;
            return P._editMod = K, K
        }, Zp.prototype.handleWindowTouchMove = function (f) {
            return this.handleWindowMouseMove(f)
        }, Zp.prototype.handleWindowMouseMove = function (E) {
            var D = this,
                l = D._downPosition;
            if (l) {
                var z = D._getLogicalPoint(E);
                if (z.distanceTo(l) < D.getStyle("moveSensitivity")) return;
                delete D._downPosition
            }
            var x = D._editMod;
            x && x.handleEdit(D.gv, E)
        }, Zp.prototype._getLogicalPoint = function (t) {
            var f = this,
                e = O.Default.getLogicalPoint(t, f._canvas);
            return new se.Math.Vector2(e)
        }, Zp.prototype.handleWindowTouchEnd = function (J) {
            return this.handleWindowMouseUp(J)
        }, Zp.prototype.handleWindowMouseUp = function () {
            var e;
            for (e in {
                _46O: !0
            }) break;
            return function (g) {
                var W = this;
                W.editing = !1, W.setCursor("default"), W.invokeSubModule(e, !1, g), W._42(), W.gv.dm().endTransaction()
            }
        }(), Zp.prototype.handle_mousewheel = function (B) {
            var J = this;
            Qc(B), J.invokeSubModule("preHandleScroll", !0) || J.gv.handleScroll(B, B.wheelDelta)
        }, Zp.prototype.handleDelete = function () {
            var e = this;
            if (!e.editDetail) {
                e.gv.dm().beginTransaction();
                var u = e.invokeSubModule("handleNormalStateDelete", !0);
                return e.gv.dm().endTransaction(), u || e.gv.removeSelection(), void 0
            }
            e.gv.dm().beginTransaction(), e.invokeSubModule("handleDelete", !0), e.gv.dm().endTransaction(), e._42()
        }, Zp.prototype.handle_keydown = function (X) {
            var D = this;
            if ((X.metaKey || X.ctrlKey) && D._42(), Cf(X) && !D.editing) return D.gvEditing = !1, D.setCursor("default"), D._42(), void 0;
            var x = hd(X);
            return D.editDetail ? ((x || bj(X)) && (D.editDetail = !1, D._42()), D.gv.dm().beginTransaction(), D.invokeSubModule("handle_keydown", !0, X), D.gv.dm().endTransaction(), void 0) : (D.gv.dm().beginTransaction(), D.invokeSubModule("handleNormalStateKeyDown", !0, X), D.gv.dm().endTransaction(), x && D._tryEnterEditDetailMode(), void 0)
        }, Zp.prototype.handle_keyup = function (g) {
            this.gv.dm().beginTransaction(), this.invokeSubModule("handle_keyup", !0, g), this.gv.dm().endTransaction()
        }, Zp.prototype._tryEnterEditDetailMode = function () {
            var b = this;
            return !b.editDetail && b.invokeSubModule("canEnterEditDetailMode", !0) && 1 === b._getValidSelection().length ? (b.editDetail = !0, b._42(), !0) : void 0
        }, Zp.prototype._tryQuitEditDetailMode = function (A) {
            var _ = this;
            return _.editDetail ? !A || _.invokeSubModule("canQuitEditDetailMode", !0, A) ? (_.editDetail = !1, _._42(), !0) : !1 : !1
        }, Zp.prototype.setStyle = function (J, C, N) {
            var v = this;
            N ? se.setStyle(J, C) : v._styleMap[J] = C, "baseColor" === J && (ci = C), v.fp("styleChanged", null, {
                key: J,
                value: C,
                base: N
            }), v._42()
        }, Zp.prototype.getStyle = function (T) {
            var P = this,
                s = P._styleMap[T];
            return s !== Z ? s : se.getStyle(T)
        }, Zp.prototype.setCursor = function (d) {
            this._resetCustomCursorStyle(), O.graph.EditInteractor.superClass.setCursor.call(this, d)
        }, Zp.prototype._drawHostGuide = function (Y) {
            var l = this,
                i = l._context,
                M = l.gv;
            se.Icons.DrawIcon(l, i, se.Icons.NodeHoverGuide, Y.corners);
            var w = Y.host;
            if (w) {
                var D = M.getAttachPoints(w);
                if (D && D.length)
                    for (var X = 0, $ = D.length; $ > X; X++) {
                        var v = D[X],
                            j = Yg(M, w, 0, v.offsetX || 0, v.offsetY || 0, v.x, v.y);
                        j = se.toScreenPosition(M, j), j.isAttach = Y.attach === X, se.Icons.DrawIcon(l, i, se.Icons.AttachPoint, j)
                    }
            }
        }, Zp.prototype._resetCustomCursorStyle = function () {
            var J = this;
            if (J._customStyle) {
                var H = this.gv.getView();
                H.classList && H.classList.remove && H.classList.remove(J._customStyle), J._customStyle = null
            }
        }, Zp.prototype._setRotateCursor = function (M) {
            var c = this,
                z = c._cursorFactory;
            z || (z = c._cursorFactory = new se.CursorFactory(c));
            var B = z.getRotateCursor(M),
                J = c.gv.getView();
            c._resetCustomCursorStyle(), c._customStyle = B, J.classList && J.classList.add && J.classList.add(B)
        };
        var bb = se.Group = function (G) {
            var g = this;
            g._entities = G, g._64O = 0, g._position = {
                x: 0,
                y: 0
            }, g._scale = {
                x: 1,
                y: 1
            }, g._anchor = {
                x: .5,
                y: .5
            }, g._anchor2 = {
                x: .5,
                y: .5
            }
        };
        bb.prototype = {}, bb.prototype.constructor = bb;
        var Ag = null;
        bb.findOrCreateGroup = function (T) {
            if (Ag && Ag.checkIsMe(T)) return Ag;
            var E = new se.Group(T);
            return E.getKeyOb() ? (Ag = E, E) : void 0
        }, bb.prototype.checkIsMe = function (i) {
            var O = this._entities;
            if (O.length !== i.length) return !1;
            var W, R = {},
                l = i.length;
            for (W = 0; l > W; W++) R[i[W]._id] = !0;
            for (W = 0; l > W; W++)
                if (!R[O[W]._id]) return !1;
            return !0
        }, bb.prototype.getRotation = function () {
            return this._64O
        }, bb.prototype.getPosition = function () {
            return this._position
        }, bb.prototype.getAnchor = function () {
            return this._anchor
        }, bb.prototype.getWidth = function () {
            return this._width
        }, bb.prototype.getScale = function () {
            return this._scale
        }, bb.prototype.getSize = function () {
            return {
                width: this._width,
                height: this._height
            }
        }, bb.prototype.getHeight = function () {
            return this._height
        }, bb.prototype.getKeyOb = function () {
            for (var W = this._entities, R = W.length - 1; R >= 0; R--) {
                var Y = W[R];
                if (this.isNode(Y)) return Y
            }
        }, bb.prototype.getAnchor2 = function () {
            var k = this,
                M = k.rotateCenter;
            if (M) return M;
            var A = k.getKeyOb();
            if (!A) return k._anchor;
            var N = k._anchor2,
                g = A.getMatrix();
            return g.tf({
                x: A.getWidth() * (N.x - A.getAnchor().x),
                y: A.getHeight() * (N.y - A.getAnchor().y)
            })
        }, bb.prototype.setAnchor2 = function (B, L) {
            var h = this,
                C = h.getKeyOb();
            if (C) {
                var u, R = C.getMatrix();
                u = "number" == typeof B ? {
                    x: B,
                    y: L
                } : B;
                var M = R.tfi(u);
                h._anchor2 = {
                    x: C.getAnchor().x + M.x / C.getWidth(),
                    y: C.getAnchor().y + M.y / C.getHeight()
                }
            }
        }, bb.prototype.setRotation = function () { }, bb.prototype.beginRotate = function (n) {
            this.rotateCenter = n.pos, this.rotateMode = n.groupRotateMode
        }, bb.prototype.endRotate = function () {
            delete this.rotateCenter, delete this.rotateMode
        }, bb.prototype.addRotation = function (g, r, n) {
            return "batch" === r ? this._addRotationInBatchMode(g, n) : "block" === r ? this._addRotationInBlockMode(g, n) : void 0
        }, bb.prototype._addRotationInBlockMode = function (r, q) {
            var s = this,
                U = s.rotateCenter || s.getPosition();
            s._entities.forEach(function ($) {
                if (s.isNode($) && (!q || q($))) {
                    var l = $.getMatrix();
                    l.translate(-U.x, -U.y), l.rotate(r), l.translate(U.x, U.y);
                    var x = Math.sign($.getScale().x);
                    $.setRotation(D(l.b * x, l.a * x)), $.setPosition(l.tx, l.ty)
                }
            })
        }, bb.prototype._addRotationInBatchMode = function (C, s) {
            var N = this,
                I = N._anchor2;
            N._entities.forEach(function (b) {
                if (N.isNode(b) && (!s || s(b))) {
                    var m = b.getAnchor(),
                        P = b.getMatrix(),
                        V = P.tf({
                            x: b.getWidth() * (I.x - m.x),
                            y: b.getHeight() * (I.y - m.y)
                        }),
                        T = new se.Math.Matrix2d;
                    T.set(P.a, P.b, P.c, P.d, P.tx, P.ty), T.translate(-V.x, -V.y), T.rotate(C), T.translate(V.x, V.y);
                    var n = Math.sign(b.getScale().x);
                    b.setRotation(D(T.b * n, T.a * n)), b.setPosition(T.tx, T.ty)
                }
            })
        }, bb.prototype.setPosition = function (A) {
            var Y, z, U, P, T = this,
                c = T._position,
                m = A.x - c.x,
                V = A.y - c.y,
                k = T._entities;
            for (z = 0, U = k.length; U > z; z++) Y = k[z], Fq(Y) && (P = Y.getPosition(), Y.setPosition(P.x + m, P.y + V));
            T._position = A
        }, bb.prototype.setScale = function (r, E) {
            var o = this,
                A = r / o._scale.x,
                O = E / o._scale.y;
            o._adjustChildScaleOrSize(A, O, "size"), o._scale = {
                x: r,
                y: E
            }
        }, bb.prototype.getRect = function () {
            var C = this,
                R = C._position,
                Z = C._width,
                l = C._height;
            return {
                x: R.x - Z / 2,
                y: R.y - l / 2,
                width: Z,
                height: l
            }
        }, bb.prototype.setSize = function (N, b) {
            var r = this,
                N = Math.max(1, N),
                b = Math.max(1, b),
                s = N / r._width,
                g = b / r._height;
            r._adjustChildScaleOrSize(s, g, "size"), r._width = N, r._height = b
        }, bb.prototype._adjustChildScaleOrSize = function (B, P, v) {
            var l, Y, C, f, p, o, s, u, X, J, m, E, n, K, b = this,
                w = b._position,
                h = b._entities,
                R = new se.Math.Matrix2d;
            for (Y = 0, C = h.length; C > Y; Y++)
                if (l = h[Y], b.isNode(l)) {
                    if (f = l.getPosition(), p = l.getRotation(), o = l.getWidth(), s = l.getHeight(), u = l.getScale(), m = u.x * o, E = u.y * s, R.identity().scale(m, E).rotate(p).translate(f.x, f.y).translate(-w.x, -w.y).rotate(-b._64O), p = D(R.b * Math.sign(m), R.a * Math.sign(m)), R.scale(B, P), X = Math.cos(p), J = Math.sin(p), Math.abs(X) < .001 ? (n = R.b / J, K = -R.c / J) : (n = R.a / X, K = R.d / X), "scale" === v) l.setScale(n / o, K / s);
                    else if ("size" === v) {
                        var M = n / u.x,
                            g = K / u.y;
                        l.setScale(he(n) * Math.abs(u.x), he(K) * Math.abs(u.y)), l.setSize(Math.max(.1, Math.abs(M)), Math.max(.1, Math.abs(g)))
                    }
                    R.rotate(b._64O).translate(w.x, w.y), l.setPosition(R.tx, R.ty)
                }
        }, bb.prototype.getMatrix = function () {
            var e = this,
                W = e._position,
                $ = O.Default.getInternal(),
                j = e._scale;
            return new $.Mat(e._64O, W.x, W.y, j.x, j.y)
        }, bb.prototype.toGlobal = function (M) {
            return this.getMatrix().tf(M)
        }, bb.prototype.getCorners = function () {
            var R = this,
                x = R._width,
                t = R._height,
                O = R._anchor,
                k = -x * O.x,
                w = -t * O.y,
                J = R.getMatrix();
            return [J.tf(k, w), J.tf(k, w + t), J.tf(k + x, w + t), J.tf(k + x, w)]
        }, bb.prototype.calcInfo = function () {
            var f, L, F, o, u, W, $ = this,
                V = [],
                b = $._entities,
                G = $._64O;
            for (o = 0, u = b.length; u > o; o++) W = b[o], $.isNode(W) && W.getCorners && V.push.apply(V, W.getCorners());
            if (V.length) {
                var P = Math.cos(-G),
                    Z = Math.sin(-G),
                    X = 1 / 0,
                    M = -1 / 0,
                    Y = 1 / 0,
                    J = -1 / 0;
                for (o = 0, u = V.length; u > o; o++) F = V[o], f = F.x, L = F.y, F.x = P * f - Z * L, F.y = Z * f + P * L, X = Math.min(X, F.x), M = Math.max(M, F.x), Y = Math.min(Y, F.y), J = Math.max(J, F.y);
                $._width = (M - X) / $._scale.x, $._height = (J - Y) / $._scale.y, P = Math.cos(G), Z = Math.sin(G);
                var s = $._anchor;
                f = X + (M - X) * s.x, L = Y + (J - Y) * s.y, $._position = {
                    x: P * f - Z * L,
                    y: Z * f + P * L
                }
            }
        }, bb.prototype.isNode = function (n) {
            return Fq(n) ? Th(n) ? n.size() ? !1 : !0 : !0 : !1
        }, bb.prototype._42 = function (N, Z, c) {
            var R, u, s, q, X, E, P, $, j = this,
                r = j._entities,
                S = j.rotateMode;
            for ("batch" === S && ($ = j.getKeyOb()), R = 0, u = r.length; u > R; R++) s = r[R], j.isNode(s) && (E = s.getRect(), q = se.toScreenPosition(c, {
                x: E.x,
                y: E.y
            }), X = se.toScreenPosition(c, {
                x: E.x + E.width,
                y: E.y + E.height
            }), P = {
                min: q,
                max: X
            }, s === $ && (P.isKeyOb = !0), se.Icons.DrawIcon(N, Z, se.Icons.GroupSubEntityRect, P))
        };
        var bp = se.CurveActiving = function (T, r) {
            this._curve = T, this._interactor = T._interactor, this.silent = !0;
            for (var x in r) this[x] = r[x];
            delete this.silent
        };
        bp.prototype = {}, bp.prototype.constructor = bp, o.defineProperties(bp.prototype, {
            point: {
                get: function () {
                    return this._point
                }, set: function (S) {
                    var f = this;
                    f._point = S, f.editingCtrl || f.silent || f._firePointChange()
                }
            },
            pairs: {
                get: function () {
                    return this._pairs
                }, set: function (l) {
                    var J = this;
                    J._pairs = l, J.editingCtrl && !J.silent && J._firePointChange()
                }
            }
        }), bp.prototype._firePointChange = function () {
            var J = this,
                j = J.getCurrentEditingPoint(),
                i = J._interactor;
            if (!j) return i.fi({
                kind: "selectPoint"
            }), void 0;
            var e = this._curve.target;
            if (e) {
                var o = se.getDataMatrix(e).invert(),
                    t = j.e;
                j = o.apply(se.toWorldPosition(i.gv, j)), j.e = t;
                var q = J._lastFirePoint;
                q && Math.abs(j.x - q.x) < 1e-5 && Math.abs(j.y - q.y) < 1e-5 && (j.e == Z && q.e == Z || Math.abs(j.e - q.e) < 1e-5) || (J._lastFirePoint = j, i.fi({
                    kind: "selectPoint",
                    x: j.x,
                    y: j.y,
                    e: j.e
                }))
            }
        }, bp.prototype.dispose = function () {
            this._interactor.fi({
                kind: "selectPoint"
            })
        }, bp.prototype.getCurrentEditingPoint = function () {
            var l = this,
                d = l.editingCtrl;
            if (d) {
                var O = l.pairs;
                if (O) {
                    var t = O[d.pairId];
                    if (t) {
                        var S = t[d.type];
                        if (S) return S
                    }
                }
            }
            return l._point
        };
        var Rf = se.CursorFactory = function (q) {
            var V = this;
            V._interactor = q, V._rotateCursorStyles = {}
        };
        Rf.prototype = {}, Rf.prototype.constructor = Rf, Rf.prototype.getRotateCursor = function (E) {
            var q = this;
            0 > E && (E += 2 * Math.PI);
            var D = q._interactor,
                o = D.getStyle("rotateCursorSize"),
                c = D.getStyle("rotateCursorRound"),
                U = Math.round(180 * (E / Math.PI) / c);
            U * c >= 360 && (U = 0);
            var A = q._rotateCursorStyles,
                M = "htCustomRotateStyle_" + o + "_" + c + "_" + U;
            return A[M] || (q._produceRotateCursor(M, o, c, U), A[M] = !0), M
        }, Rf.prototype._produceRotateCursor = function (A, I, N, M) {
            var E = this;
            E._interactor;
            var j = E._canvas;
            j || (j = E._canvas = U.createElement("canvas")), j.width = j.height = I * devicePixelRatio, j.style.width = j.style.height = I + " px";
            var L = j.getContext("2d");
            se.setAntialias(L, !1), L.scale(devicePixelRatio, devicePixelRatio);
            var e, o, X, z, B, S = Math.round(I / 2),
                x = "" + S + " " + S + ",auto !important;",
                D = 4;
            e = Math.PI / 180 * M * N, L.clearRect(0, 0, I, I), L.save(), L.scale(I / 32, I / 32), L.translate(16, 15), L.rotate(e + Math.PI / 2), L.beginPath(), L.moveTo(-8, 0), L.lineTo(-8, D), L.lineTo(-8 + D, D), L.moveTo(8, 0), L.lineTo(8, D), L.lineTo(8 - D, D), L.moveTo(-8, D), L.quadraticCurveTo(0, -6, 8, D), L.restore(), L.lineCap = "round", L.lineJoin = "miter", L.strokeStyle = "white", L.lineWidth = 4, L.stroke(), L.strokeStyle = "black", L.lineWidth = 2, L.stroke(), o = JSON.stringify(j.toDataURL()), z = "cursor:url(" + o + ")" + x, 1 !== devicePixelRatio && (X = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="' + I + 'px" height="' + I + 'px"><image xlink:href=' + o + ' width="' + I + '" height="' + I + '"/></svg>', z += "cursor:url(data:image/svg+xml;base64," + btoa(X) + ")" + x, z += "cursor:-webkit-image-set(url(" + o + ")" + devicePixelRatio + "x,url(" + o + ")1x)" + x), B = U.createElement("style"), B.textContent = "body." + A + " *, ." + A + "{" + z + "}", U.head.appendChild(B)
        };
        var pi = se.Guide.Grid = function (S) {
            var W = this;
            W._interactor = S, W._alignmentGuideId = 0, W._xAlignmentGuide = [], W._yAlignmentGuide = []
        };
        pi.prototype = {}, pi.prototype.constructor = pi, o.defineProperties(pi.prototype, {
            gridBlockSize: {
                get: function () {
                    var L = this;
                    return L._gridBlockSize || L._interactor.getStyle("gridBlockSize")
                }, set: function (a) {
                    this._gridBlockSize = a, this._interactor._42()
                }
            },
            gridThickLinesEvery: {
                get: function () {
                    var b = this;
                    return b._gridThickLinesEvery || b._interactor.getStyle("gridThickLinesEvery")
                }, set: function (p) {
                    this._gridThickLinesEvery = p, this._interactor._42()
                }
            },
            gridEnabled: {
                get: function () {
                    var R = this,
                        t = R._interactor;
                    return t.gridEnabled && R.isValidGrid()
                }
            }
        }), pi.prototype._42 = function () {
            var Q = this,
                M = Q._interactor;
            Q.gridEnabled && Q.drawGrid(), M.alignmentGuideEnabled && Q.drawAlignmentGuide()
        }, pi.prototype.makeMatrix = function () {
            var k = this,
                i = k._interactor.getStyle("gridAngle"),
                v = k._interactor.getStyle("gridRotation"),
                R = new se.Math.Matrix2d,
                u = Math.sin(i),
                $ = Math.cos(i);
            return R.set(1, 0, $, u, 0, 0), R.rotate(v), R
        }, pi.prototype.isValidGrid = function () {
            var d = this,
                T = Math.PI,
                O = d._interactor,
                Y = O.gv;
            if (Y._zoom < O.getStyle("gridZoomThreshold")) return !1;
            var I = O.getStyle("gridAngle"),
                b = Math.abs(180 * (I % T / T)),
                C = 1 - 1e-8;
            return C > b || b > 180 - C ? !1 : !0
        }, pi.prototype.drawAlignmentGuide = function () {
            var $ = this,
                C = $._interactor,
                l = C.gv,
                Q = C._canvas,
                k = C._context,
                x = Q.width,
                M = Q.height,
                i = l.tx(),
                K = l.ty(),
                n = l._zoom;
            k.beginPath(), k.strokeStyle = C.getStyle("gridAlignmentGuideColor"), k.lineWidth = 1, $._xAlignmentGuide.forEach(function (r) {
                var L = r.p * n + i;
                k.moveTo(L, 0), k.lineTo(L, M)
            }), $._yAlignmentGuide.forEach(function (M) {
                var _ = M.p * n + K;
                k.moveTo(0, _), k.lineTo(x, _)
            }), k.stroke()
        }, pi.prototype.drawGrid = function () {
            function g(T, $, F, m) {
                var K = se.toScreenPosition(i, v.apply({
                    x: T,
                    y: $
                })),
                    t = se.toScreenPosition(i, v.apply({
                        x: F,
                        y: m
                    }));
                c.moveTo(K.x, K.y), c.lineTo(t.x, t.y)
            }
            var Y = this,
                s = Y._interactor,
                F = Y.gridBlockSize,
                P = Y.gridThickLinesEvery,
                o = s.getStyle("gridThickColor"),
                t = s.getStyle("gridLightColor"),
                i = s.gv,
                X = s._canvas,
                c = s._context,
                z = X.width,
                h = X.height,
                v = Y.makeMatrix(),
                Q = v.applyInverse(se.toWorldPosition(i, {
                    x: 0,
                    y: 0
                })),
                I = v.applyInverse(se.toWorldPosition(i, {
                    x: z,
                    y: 0
                })),
                n = v.applyInverse(se.toWorldPosition(i, {
                    x: 0,
                    y: h
                })),
                f = v.applyInverse(se.toWorldPosition(i, {
                    x: z,
                    y: h
                })),
                u = Math.min(Q.x, I.x, n.x, f.x),
                S = Math.max(Q.x, I.x, n.x, f.x),
                a = Math.min(Q.y, I.y, n.y, f.y),
                C = Math.max(Q.y, I.y, n.y, f.y);
            z = S - u, h = C - a;
            var K = Math.ceil(u / F),
                d = Math.floor(S / F),
                T = Math.ceil(a / F),
                $ = Math.floor(C / F);
            i.tx(), i.ty(), i._zoom;
            var j, D, r;
            for (c.save(), c.lineWidth = 1, c.beginPath(), c.strokeStyle = o, r = Math.ceil(K / P) * P; d >= r; r += P) j = r * F, g(j, a, j, C);
            for (r = Math.ceil(T / P) * P; $ >= r; r += P) D = r * F, g(u, D, S, D);
            for (c.stroke(), c.beginPath(), c.strokeStyle = t, r = K; d >= r; r++) 0 !== r % P && (j = r * F, g(j, a, j, C));
            for (r = T; $ >= r; r++) 0 !== r % P && (D = r * F, g(u, D, S, D));
            c.stroke(), c.restore()
        }, pi.prototype.getAlignmentGuides = function () {
            var Q = this;
            return {
                x: Q._xAlignmentGuide,
                y: Q._yAlignmentGuide
            }
        }, pi.prototype.addAlignmentGuide = function (t, g, A) {
            var B = this,
                y = "x" === t ? B._xAlignmentGuide : B._yAlignmentGuide,
                A = A ? A : ++B._alignmentGuideId,
                G = {
                    p: g,
                    id: A
                };
            if (y.length) {
                var K = B._findClosestAlignmentGuide(G.p, y);
                K.dis < 0 ? y.splice(K.index + 1, 0, G) : y.splice(K.index, 0, G)
            } else y.push(G);
            return B._interactor._42(), A
        }, pi.prototype.findClosest = function (K, n, F) {
            var k = this,
                U = k._interactor,
                i = U.gv;
            F && (K = se.toWorldPosition(i, K));
            var H, b, f, X = 1 / 0,
                r = 1 / 0,
                h = K.x,
                u = K.y;
            if (k.gridEnabled) {
                var S = k.gridBlockSize,
                    R = k.makeMatrix(),
                    W = R.applyInverse(K);
                W = R.apply({
                    x: Math.round(W.x / S) * S,
                    y: Math.round(W.y / S) * S
                }), X = W.x - h, r = W.y - u, f = !0
            }
            if (U.alignmentGuideEnabled && (H = k._findClosestAlignmentGuide(h, k._xAlignmentGuide).dis, b = k._findClosestAlignmentGuide(u, k._yAlignmentGuide).dis, Math.abs(H) < Math.abs(X) && (X = H, f = !0), Math.abs(b) < Math.abs(r) && (r = b, f = !0)), f) {
                f = !1;
                var E = i._zoom,
                    p = U.getStyle("smartGuideThreshold") / E,
                    $ = {};
                if (Math.abs(X) < p && "y" !== n && ($.x = F ? X * E : X, f = !0), Math.abs(r) < p && "x" !== n && ($.y = F ? r * E : r, f = !0), f) return $
            }
        }, pi.prototype._findClosestAlignmentGuide = function (B, N) {
            if (!N.length) return {
                dis: 1 / 0
            };
            for (var G, V = 0, b = N.length - 1; b - V > 1;) G = Math.floor((V + b) / 2), N[G].p < B ? V = G : b = G;
            var D = N[V].p - B,
                l = N[b].p - B;
            return Math.abs(D) <= Math.abs(l) ? {
                line: N[V],
                dis: D,
                index: V
            } : {
                    line: N[b],
                    dis: l,
                    index: b
                }
        }, pi.prototype.removeAllAlignmentGuide = function (k) {
            var B = this;
            "y" !== k && (B._xAlignmentGuide = []), "x" !== k && (B._yAlignmentGuide = []), B._interactor._42()
        }, pi.prototype.removeAlignmentGuide = function (c) {
            for (var L, A, U, V = this, g = V._xAlignmentGuide, F = 0; 2 > F; F++)
                for (g = 0 === F ? V._xAlignmentGuide : V._yAlignmentGuide, L = 0, A = g.length; A > L; L++)
                    if (U = g[L], U.id === c) return g.splice(L, 1), V._interactor._42(), {
                        axis: 0 === F ? "x" : "y",
                        position: U.p
                    };
            return !1
        }, pi.prototype.adjustAlignmentGuide = function (X, V) {
            var D = this,
                y = D.removeAlignmentGuide(X);
            return y ? (D.addAlignmentGuide(y.axis, V, X), !0) : !1
        };
        var yf = se.Guide.Rect = function (i) {
            var $ = this;
            $._interactor = i
        };
        yf.prototype = {}, yf.prototype.constructor = yf, yf.prototype.gatherRects = function () {
            var O, E, l, Q, j = this,
                t = j._interactor.gv,
                V = [],
                s = [],
                M = {
                    x: V,
                    y: s
                },
                m = {},
                K = t.getDataModel(),
                F = K.a("width"),
                v = K.a("height");
            F && v && (O = 0, E = 0, l = F, Q = v, V.push({
                node: K,
                type: 0,
                p: O
            }, {
                node: K,
                type: 1,
                p: O + l / 2
            }, {
                node: K,
                type: 2,
                p: O + l
            }), s.push({
                node: K,
                type: 0,
                p: E
            }, {
                node: K,
                type: 1,
                p: E + Q / 2
            }, {
                node: K,
                type: 2,
                p: E + Q
            }), m[K._id || 0] = {
                x: O,
                y: E,
                width: l,
                height: Q
            }), K.each(function (L) {
                if (Fq(L) && !t.isSelected(L) && t.isVisible(L) && t.isValidGuideLineSource(L)) {
                    var W = !1;
                    if (t.sm().getSelection().each(function (I) {
                        W || (L.isHostOn(I) ? W = !0 : L.isDescendantOf(I) && (W = !0))
                    }), !W) {
                        var u = L.getRect();
                        O = u.x, E = u.y, l = u.width, Q = u.height, V.push({
                            node: L,
                            type: 0,
                            p: O
                        }, {
                            node: L,
                            type: 1,
                            p: O + l / 2
                        }, {
                            node: L,
                            type: 2,
                            p: O + l
                        }), s.push({
                            node: L,
                            type: 0,
                            p: E
                        }, {
                            node: L,
                            type: 1,
                            p: E + Q / 2
                        }, {
                            node: L,
                            type: 2,
                            p: E + Q
                        }), m[L._id] = u
                    }
                }
            }), V.sort(function (y, i) {
                return y.p - i.p
            }), s.sort(function (x, r) {
                return x.p - r.p
            }), j._grid = M, j._87I = m
        }, yf.prototype.gatherLines = function (R, $, Q) {
            var k, r, u, T, F, G, U, z, X, x, a, y, q = this,
                i = [q.findClosest({
                    x: R.x,
                    y: R.y
                }, $), q.findClosest({
                    x: R.x + R.w / 2,
                    y: R.y + R.h / 2
                }, $), q.findClosest({
                    x: R.x + R.w,
                    y: R.y + R.h
                }, $)],
                V = {},
                g = q._87I;
            Q = Q || 255;
            var N, o;
            for (q._guideLine = [], k = 0; 2 > k; k++)
                for (V = {}, 0 === k ? (T = "y", z = R.x, X = z + R.w) : (T = "x", z = R.y, X = z + R.h), r = 0; 3 > r; r++) F = i[r], F && isFinite(F[T]) && (N = 1 << 3 * k + r, Q & N && (G = F[T + "Line"], U = G.node, o = U._id || 0, V[o] || (V[o] = !0, y = g[o], "y" === T ? (x = y.x, a = y.x + y.width) : (x = y.y, a = y.y + y.height), u = G.p, q._guideLine.push({
                    type: T,
                    a: z,
                    b: X,
                    c: x,
                    d: a,
                    p: u,
                    center: 1 === G.type
                }))))
        }, yf.prototype._binarySearchClosest = function (N, j) {
            if (!j.length) return {
                dis: 1 / 0
            };
            for (var $, p = 0, n = j.length - 1; n - p > 1;) $ = Math.floor((p + n) / 2), j[$].p < N ? p = $ : n = $;
            var t = j[p].p - N,
                D = j[n].p - N;
            return Math.abs(t) <= Math.abs(D) ? {
                line: j[p],
                dis: t
            } : {
                    line: j[n],
                    dis: D
                }
        }, yf.prototype.findClosest = function (p, i, f) {
            var V = this,
                G = V._interactor,
                e = G.gv,
                L = V._grid;
            f && (p = se.toWorldPosition(e, p));
            var b, t = V._binarySearchClosest(p.x, L.x),
                m = V._binarySearchClosest(p.y, L.y),
                J = t.dis,
                C = m.dis,
                M = e._zoom,
                w = G.getStyle("smartGuideThreshold") / M,
                $ = {};
            return Math.abs(J) < w && "y" !== i && ($.x = f ? J * M : J, $.xLine = t.line, b = !0), Math.abs(C) < w && "x" !== i && ($.y = f ? C * M : C, $.yLine = m.line, b = !0), b ? $ : void 0
        }, yf.prototype._42 = function () {
            var C = this,
                T = C._guideLine;
            if (T && !O.Default.isCtrlDown()) {
                var $ = C._interactor;
                if ($.getStyle("guideLineVisible")) {
                    var _, I, G, R, E, V, m, o, l, c, P, K, M, H, W, Q, U, B = $.gv,
                        J = $._context,
                        k = B.tx(),
                        p = B.ty(),
                        A = B._zoom,
                        r = $.getStyle("guideLineTextSpacing");
                    for (_ = 0, I = T.length; I > _; _++) G = T[_], o = G.type, l = G.p, c = G.a, P = G.b, K = G.c, M = G.d, H = Math.min(c, K), W = Math.max(P, M), "x" === o ? (R = l * A + k, E = H * A + p, V = R, m = W * A + p) : (R = H * A + k, E = l * A + p, V = W * A + k, m = E), se.Icons.DrawIcon($, J, se.Icons.MoveLineGuide, {
                        rect: [R, E, V, m],
                        center: G.center
                    }), M >= c && P >= K || (H = c > M ? M : P, W = c > M ? c : K, U = W - H, "x" === o ? (G.center2center || (R -= r, V = R), E = H * A + p, m = W * A + p, Q = se.Icons.MoveLineGuideDistanceV) : "y" === o && (G.center2center || (E -= r, m = E), R = H * A + k, V = W * A + k, Q = se.Icons.MoveLineGuideDistanceH), se.Icons.DrawIcon($, J, Q, {
                        x0: R,
                        y0: E,
                        x1: V,
                        y1: m,
                        dis: U
                    }))
                }
            }
        }, yf.prototype.clear = function () {
            this._guideLine = null
        };
        var Aq = se.Guide.Hover = function (p) {
            var v = this;
            v._interactor = p
        };
        Aq.prototype = {}, Aq.prototype.constructor = Aq, o.defineProperties(Aq.prototype, {}), Aq.prototype._42 = function () {
            var b = this._interactor;
            if (b.getStyle("hoverGuideVisible") && !b.gvEditing) {
                var g = b.hoverData,
                    Y = b.gv;
                if (!Fq(g) || Y.isSelected(g)) return b.hoverData = null, void 0;
                var t = Rp(Y, g),
                    G = se.toScreenPosition(Y, {
                        x: t.x,
                        y: t.y
                    }),
                    L = se.toScreenPosition(Y, {
                        x: t.x + t.width,
                        y: t.y + t.height
                    });
                se.Icons.DrawIcon(b, b._context, se.Icons.HoverDataRect, {
                    min: G,
                    max: L,
                    color: b.getStyle("hoverGuideColor") || b.getStyle("baseColor")
                })
            }
        }, se.DefaultStyleMap = {
            baseColor: "rgb(51,153,255)",
            pointSize: [24, 9],
            checkSize: 7,
            rotateCheckSize: 10,
            moveSensitivity: 10,
            moveDummyThreshold: 32,
            moveDummyPosition: [0, 0, -16, -16],
            moveDummyLineExtraShift: [-32, 0],
            moveDummySensitivity: 16,
            keepAspectRatio: !1,
            rotateRound: Math.PI / 2,
            shiftRotateRound: Math.PI / 12,
            rotateSensitivity: Math.PI / 60,
            rotateAsClock: !1,
            shiftLineRotateRound: Math.PI / 4,
            anchorMovable: !0,
            anchorVisible: !0,
            anchorHideThreshold: 25,
            anchorOutsideVisibleThreshold: .25,
            anchorRound: .25,
            anchorSensitivity: .02,
            smartGuideThreshold: 8,
            curveIntersectSize: 5,
            curvePointIntersectSize: 8,
            edgeHostDetectPerFrame: !0,
            edgeHostEdgeMaxDistance: 12,
            edgeHostEdgeHighlighColor: "#5d5d5d",
            edgeHostPointHighlighColor: "red",
            edgeHostHighlighPeriod: 1500,
            edgeElevationEditable: !1,
            attachThreshold: 25,
            guideLineVisible: !0,
            guideLineTextSpacing: 0,
            hoverGuideVisible: !1,
            hoverGuideColor: null,
            gridBlockSize: 40,
            gridThickLinesEvery: 10,
            gridThickColor: "#5d5d5d",
            gridLightColor: "#d0d0d0",
            gridZoomThreshold: .25,
            gridAlignmentGuideColor: "#ff0000",
            gridAngle: Math.PI / 2,
            gridRotation: 0,
            groupRotateModeDefault: "block",
            groupRotateModeKey: ["ctrlKey", "metaKey"],
            rotateCursorSize: 32,
            rotateCursorRound: 45,
            tipTextColor: "#ffffff",
            tipBackground: "#333333",
            curveHighlightColor: "#30599e",
            rectPointBackground: "white",
            rectPointBorderColor: "#666666",
            rectPointShadowColor: "rgba(0,0,0,0.35)",
            shapeCtrlPointBackground: "white",
            shapeCtrlPointBorderColor: null,
            shapeCtrlPointHighlightBorder: null,
            shapeHighlighPointBackground: "#30599e",
            curveElevationVisible: !0,
            curveElevationIntersectSize: 8,
            curveElevationGuideShift: [20, 0],
            curveTipVisible: !0,
            connectGuideVisible: !0,
            connectGuideShift: [1, .25, 8, 0],
            connectGuideIntersectSize: 8,
            connectGuideGarbageIntersectsize: 25,
            connectGuideGarbageShift: [1, 1, -48, -48]
        };
        var Kp = se.Icons = {},
            bs = 1e4,
            je = null,
            ci = se.DefaultStyleMap.baseColor,
            Sb = "rgb(183,232,135)",
            yk = "rgb(255,204,153)",
            ho = 6;
        O.Default.setImage("Icons.RectPoint", {
            width: ho,
            height: ho,
            comps: [{
                type: "rect",
                background: "rgb(247,247,247)",
                borderWidth: 1,
                borderColor: {
                    func: function () {
                        return ci
                    }
                },
                rect: [0, 0, ho, ho]
            }]
        }), Kp.GroupSubEntityRect = {
            comps: [{
                type: "shape",
                points: {
                    func: function () {
                        var Y = Kp.GroupSubEntityRect.data;
                        if (!Y) return [];
                        var S = Y.min,
                            I = Y.max;
                        return [S.x, S.y, S.x, I.y, I.x, I.y, I.x, S.y]
                    }
                },
                segments: [1, 2, 2, 2, 5],
                background: null,
                borderWidth: 1,
                borderColor: {
                    func: function () {
                        return Kp.GroupSubEntityRect.data.isKeyOb ? ci : ci
                    }
                }
            }]
        };
        var ak = 4;
        Kp.HoverDataRect = {
            comps: [{
                type: "shape",
                points: {
                    func: function () {
                        var D = Kp.HoverDataRect.data;
                        if (!D) return [];
                        var b = D.min,
                            G = D.max,
                            J = ak;
                        return b.x -= J, b.y -= J, G.x += J, G.y += J, [b.x, b.y, b.x, G.y, G.x, G.y, G.x, b.y]
                    }
                },
                segments: [1, 2, 2, 2, 5],
                background: null,
                borderWidth: 1,
                borderColor: {
                    func: function () {
                        return Kp.HoverDataRect.data.color
                    }
                },
                borderCap: "round",
                borderPattern: [1, 4]
            }]
        }, Kp.Line = {
            comps: [{
                type: "image",
                name: "Icons.RectPoint",
                rect: {
                    func: function () {
                        return [[Kp.Line.data.P1.x, Kp.Line.data.P1.y], ho, ho]
                    }
                }
            }, {
                type: "image",
                name: "Icons.RectPoint",
                rect: {
                    func: function () {
                        return [[Kp.Line.data.P2.x, Kp.Line.data.P2.y], ho, ho]
                    }
                }
            }]
        }, Kp.NodeHoverGuide = {
            comps: [{
                type: "shape",
                points: {
                    func: function () {
                        return Kp.NodeHoverGuide.data
                    }
                },
                segments: [1, 2, 2, 2, 5],
                background: null,
                borderWidth: 1,
                borderColor: "#3399FF"
            }]
        }, Kp.Rect = {
            comps: [{
                type: "shape",
                points: {
                    func: function () {
                        var n = Kp.Rect.data;
                        if (!n) return [];
                        var h = n.LT,
                            V = n.LB,
                            o = n.RB,
                            C = n.RT;
                        return [h.x, h.y, V.x, V.y, o.x, o.y, C.x, C.y]
                    }
                },
                segments: [1, 2, 2, 2, 5],
                background: null,
                borderWidth: 1,
                borderColor: {
                    func: function () {
                        return ci
                    }
                }
            }, {
                type: "image",
                name: "Icons.RectPoint",
                rotation: {
                    func: function () {
                        return Kp.Rect.data.rotation
                    }
                },
                rect: {
                    func: function () {
                        return [[Kp.Rect.data.LT.x, Kp.Rect.data.LT.y], ho, ho]
                    }
                }
            }, {
                type: "image",
                name: "Icons.RectPoint",
                rotation: {
                    func: function () {
                        return Kp.Rect.data.rotation
                    }
                },
                rect: {
                    func: function () {
                        return [[Kp.Rect.data.LB.x, Kp.Rect.data.LB.y], ho, ho]
                    }
                }
            }, {
                type: "image",
                name: "Icons.RectPoint",
                rotation: {
                    func: function () {
                        return Kp.Rect.data.rotation
                    }
                },
                rect: {
                    func: function () {
                        return [[Kp.Rect.data.RB.x, Kp.Rect.data.RB.y], ho, ho]
                    }
                }
            }, {
                type: "image",
                name: "Icons.RectPoint",
                rotation: {
                    func: function () {
                        return Kp.Rect.data.rotation
                    }
                },
                rect: {
                    func: function () {
                        return [[Kp.Rect.data.RT.x, Kp.Rect.data.RT.y], ho, ho]
                    }
                }
            }, {
                type: "image",
                name: "Icons.RectPoint",
                rotation: {
                    func: function () {
                        return Kp.Rect.data.rotation
                    }
                },
                visible: {
                    func: function () {
                        return Kp.Rect.data.L ? !0 : !1
                    }
                },
                rect: {
                    func: function () {
                        return [[Kp.Rect.data.L.x, Kp.Rect.data.L.y], ho, ho]
                    }
                }
            }, {
                type: "image",
                name: "Icons.RectPoint",
                rotation: {
                    func: function () {
                        return Kp.Rect.data.rotation
                    }
                },
                visible: {
                    func: function () {
                        return Kp.Rect.data.R ? !0 : !1
                    }
                },
                rect: {
                    func: function () {
                        return [[Kp.Rect.data.R.x, Kp.Rect.data.R.y], ho, ho]
                    }
                }
            }, {
                type: "image",
                name: "Icons.RectPoint",
                rotation: {
                    func: function () {
                        return Kp.Rect.data.rotation
                    }
                },
                visible: {
                    func: function () {
                        return Kp.Rect.data.T ? !0 : !1
                    }
                },
                rect: {
                    func: function () {
                        return [[Kp.Rect.data.T.x, Kp.Rect.data.T.y], ho, ho]
                    }
                }
            }, {
                type: "image",
                name: "Icons.RectPoint",
                rotation: {
                    func: function () {
                        return Kp.Rect.data.rotation
                    }
                },
                visible: {
                    func: function () {
                        return Kp.Rect.data.B ? !0 : !1
                    }
                },
                rect: {
                    func: function () {
                        return [[Kp.Rect.data.B.x, Kp.Rect.data.B.y], ho, ho]
                    }
                }
            }]
        };
        var Bs = 16;
        O.Default.setImage("Icons.Anchor", {
            width: 12,
            height: 12,
            comps: [{
                type: "shape",
                borderWidth: 1,
                borderColor: {
                    func: function () {
                        return ci
                    }
                },
                borderCap: "round",
                shadowColor: "#1ABC9C",
                points: [.50928, 6, 11.49072, 6, 6, 6, 6, .50928, 6, 11.49072]
            }, {
                type: "circle",
                borderWidth: 1,
                borderColor: {
                    func: function () {
                        return ci
                    }
                },
                shadowColor: "#1ABC9C",
                rect: [2.84391, 2.84391, 6.53697, 6.53697]
            }]
        }), Kp.Anchor = {
            comps: [{
                type: "image",
                name: "Icons.Anchor",
                rect: {
                    func: function () {
                        return [[Kp.Anchor.data.POS.x, Kp.Anchor.data.POS.y], Bs, Bs]
                    }
                }
            }]
        }, Kp.TipShiftX = 12, Kp.TipShiftY = 12;
        var yr = [8, 28];
        Kp.TipHelper = {
            comps: [{
                type: "roundRect",
                rect: {
                    func: function () {
                        return [Kp.TipHelper.data.helperPos.x, Kp.TipHelper.data.helperPos.y, yr[0] * Kp.TipHelper.data.size, yr[1]]
                    }
                },
                background: {
                    func: function () {
                        return je.getStyle("tipBackground")
                    }
                },
                opacity: .6
            }, {
                type: "text",
                text: {
                    func: function () {
                        return Kp.TipHelper.data.text
                    }
                },
                rect: {
                    func: function () {
                        return [Kp.TipHelper.data.helperPos.x, Kp.TipHelper.data.helperPos.y, yr[0] * Kp.TipHelper.data.size, yr[1]]
                    }
                },
                color: {
                    func: function () {
                        return je.getStyle("tipTextColor")
                    }
                },
                font: "bold 12px Arial",
                align: "center"
            }]
        };
        var Ih = 7;
        Kp.ShapePoint = {
            comps: [{
                type: "circle",
                visible: {
                    func: function () {
                        return !!Kp.ShapePoint.data.dynamicVisible
                    }
                },
                rect: {
                    func: function () {
                        var x = Kp.ShapePoint.data.point,
                            y = Kp.ShapePoint.data.size || Ih;
                        return [x, y + 10, y + 10]
                    }
                },
                background: {
                    func: function () {
                        var L = Date.now(),
                            P = Kp.ShapePoint.data.dynamicPeriod || 1500,
                            p = Math.sin(L % P / P * Math.PI);
                        return "rgba(27,124,22," + .5 * p + ")"
                    }
                },
                borderWidth: 0
            }, {
                type: "circle",
                rect: {
                    func: function () {
                        var r = Kp.ShapePoint.data.point,
                            I = Kp.ShapePoint.data.size || Ih;
                        return [r, I, I]
                    }
                },
                background: {
                    func: function () {
                        var l = Kp.ShapePoint.data.isEnd;
                        return l ? "rgba(27,124,222,0.7)" : "#ffffff"
                    }
                },
                borderWidth: 1,
                borderColor: {
                    func: function () {
                        return Kp.ShapePoint.data.color || ci
                    }
                }
            }, {
                type: "rect",
                visible: {
                    func: function () {
                        return !!Kp.ShapePoint.data.dynamicVisible
                    }
                },
                background: "red",
                borderWidth: 0,
                rotation: Math.PI / 4,
                borderColor: {
                    func: function () {
                        return ci
                    }
                },
                rect: {
                    func: function () {
                        var I = 5;
                        return [Kp.ShapePoint.data.point, I, I]
                    }
                }
            }]
        }, Kp.ShapeBgCurve = {
            comps: [{
                type: "shape",
                visible: {
                    func: function () {
                        return !!Kp.ShapeBgCurve.data.dynamicVisible
                    }
                },
                points: {
                    func: function () {
                        return Kp.ShapeBgCurve.data.P
                    }
                },
                segments: {
                    func: function () {
                        return Kp.ShapeBgCurve.data.S
                    }
                },
                background: null,
                borderWidth: 6,
                borderColor: {
                    func: function () {
                        var L = Date.now(),
                            A = Kp.ShapeBgCurve.data.dynamicPeriod || 1500,
                            J = Math.sin(L % A / A * Math.PI);
                        return "rgba(27,124,22," + .3 * J + ")"
                    }
                }
            }, {
                type: "shape",
                points: {
                    func: function () {
                        return Kp.ShapeBgCurve.data.P
                    }
                },
                segments: {
                    func: function () {
                        return Kp.ShapeBgCurve.data.S
                    }
                },
                background: null,
                borderWidth: 1,
                borderColor: {
                    func: function () {
                        return Kp.ShapeBgCurve.data.color || ci
                    }
                }
            }]
        };
        var Lf = 8;
        Kp.ShapeHighlighPoint = {
            comps: [{
                type: "circle",
                rect: {
                    func: function () {
                        var T = Kp.ShapeHighlighPoint.data;
                        return [[T.x, T.y], Lf, Lf]
                    }
                },
                background: {
                    func: function () {
                        return je.getStyle("shapeHighlighPointBackground")
                    }
                },
                borderWidth: 0
            }]
        };
        var rn = 10;
        Kp.ShapeHighlighRealPoint = {
            comps: [{
                type: "circle",
                rect: {
                    func: function () {
                        var n = Kp.ShapeHighlighRealPoint.data;
                        return [[n.x, n.y], rn, rn]
                    }
                },
                background: "#ffffff",
                borderWidth: 2,
                borderColor: {
                    func: function () {
                        return ci
                    }
                }
            }]
        };
        var qi = 8;
        Kp.ShapeHighlighCtrlPoint = {
            comps: [{
                type: "shape",
                points: {
                    func: function () {
                        var c = Kp.ShapeHighlighCtrlPoint.data,
                            m = c.x,
                            j = c.y,
                            o = qi / 2;
                        return [m - o, j - o, m - o, j + o, m + o, j + o, m + o, j - o]
                    }
                },
                segments: [1, 2, 2, 2, 5],
                borderWidth: 2,
                background: {
                    func: function () {
                        return je.getStyle("shapeCtrlPointBackground")
                    }
                },
                borderColor: {
                    func: function () {
                        return je.getStyle("shapeCtrlPointBorderColor") || ci
                    }
                }
            }]
        };
        var or = 3;
        Kp.ShapeHighlightCurve = {
            comps: [{
                type: "shape",
                points: {
                    func: function () {
                        return Kp.ShapeHighlightCurve.data
                    }
                },
                segments: [1, 4],
                background: null,
                borderWidth: or,
                borderColor: {
                    func: function () {
                        return je.getStyle("curveHighlightColor")
                    }
                }
            }]
        }, Kp.ShapeGuideLine = {
            comps: [{
                type: "shape",
                points: {
                    func: function () {
                        return Kp.ShapeGuideLine.data
                    }
                },
                background: null,
                borderWidth: 1,
                borderColor: "rgb(255,204,153)"
            }]
        }, Kp.MoveLineGuide = {
            comps: [{
                type: "shape",
                points: {
                    func: function () {
                        return Kp.MoveLineGuide.data.rect
                    }
                },
                background: null,
                borderWidth: 1,
                borderColor: {
                    func: function () {
                        return Kp.MoveLineGuide.data.center ? Sb : yk
                    }
                }
            }]
        };
        var ei = 5;
        Kp.MoveLineGuideDistanceH = {
            comps: [{
                type: "shape",
                points: {
                    func: function () {
                        var y = Kp.MoveLineGuideDistanceH.data,
                            n = y.x0,
                            v = y.y0;
                        return [n, v - ei, n, v + ei]
                    }
                },
                rotation: -Math.PI / 4,
                segments: [1, 2],
                background: null,
                borderWidth: 1,
                borderColor: yk
            }, {
                type: "shape",
                points: {
                    func: function () {
                        var R = Kp.MoveLineGuideDistanceH.data,
                            c = R.x1,
                            D = R.y1;
                        return [c, D - ei, c, D + ei]
                    }
                },
                rotation: -Math.PI / 4,
                segments: [1, 2],
                background: null,
                borderWidth: 1,
                borderColor: yk
            }, {
                type: "text",
                text: {
                    func: function () {
                        return Math.round(Kp.MoveLineGuideDistanceH.data.dis)
                    }
                },
                rect: {
                    func: function () {
                        var T = Kp.MoveLineGuideDistanceH.data;
                        return [[(T.x0 + T.x1) / 2, T.y0 - 10], 20, 20]
                    }
                },
                color: yk,
                font: "12px Arial",
                align: "center"
            }]
        }, Kp.MoveLineGuideDistanceV = {
            comps: [{
                type: "shape",
                points: {
                    func: function () {
                        var p = Kp.MoveLineGuideDistanceV.data,
                            I = p.x0,
                            D = p.y0;
                        return [I - ei, D, I + ei, D]
                    }
                },
                rotation: Math.PI / 4,
                segments: [1, 2],
                background: null,
                borderWidth: 1,
                borderColor: yk
            }, {
                type: "shape",
                points: {
                    func: function () {
                        var o = Kp.MoveLineGuideDistanceV.data,
                            g = o.x1,
                            b = o.y1;
                        return [g - ei, b, g + ei, b]
                    }
                },
                rotation: Math.PI / 4,
                segments: [1, 2],
                background: null,
                borderWidth: 1,
                borderColor: yk
            }, {
                type: "text",
                text: {
                    func: function () {
                        return Math.round(Kp.MoveLineGuideDistanceV.data.dis)
                    }
                },
                rect: {
                    func: function () {
                        var G = Kp.MoveLineGuideDistanceV.data;
                        return [[G.x0 - 10, (G.y0 + G.y1) / 2], 20, 20]
                    }
                },
                color: yk,
                font: "12px Arial",
                align: "center"
            }]
        }, O.Default.setImage("Icons.EdgeElevationGuideImage", {
            width: 16,
            height: 16,
            comps: [{
                type: "oval",
                background: "rgb(255,255,255)",
                borderWidth: 1,
                borderColor: "rgb(138,138,138)",
                rect: [.5, .5, 15, 15]
            }, {
                type: "shape",
                borderWidth: 2,
                borderColor: "rgb(44,44,44)",
                borderCap: "round",
                points: [4, 8, 8, 4, 12, 8, 8, 4, 8, 13],
                segments: [1, 2, 2, 1, 2]
            }]
        }), Kp.EdgeElevationGuide = {
            comps: [{
                type: "image",
                name: "Icons.EdgeElevationGuideImage",
                rect: {
                    func: function () {
                        var j = Kp.EdgeElevationGuide.data,
                            v = j.x,
                            s = j.y,
                            M = je.getStyle("curveElevationIntersectSize"),
                            c = je.getStyle("curveElevationGuideShift");
                        return v += c[0], s += c[1], [v - M, s - M, 2 * M, 2 * M]
                    }
                }
            }]
        }, O.Default.setImage("Icons.ConnectGuideBgImage", {
            width: 12,
            height: 12,
            comps: [{
                type: "shape",
                background: "#3399ff",
                fillRule: "evenodd",
                shadowColor: "#1ABC9C",
                rotation: 3.14159,
                points: [6.00001, 11.99999, 6.00001, 11.99999, 2.6863, 11.99999, 1e-5, 9.30695, 1e-5, 5.99999, 1e-5, 5.99999, 1e-5, 2.68628, 2.69305, -1e-5, 6.00001, -1e-5, 12.00001, -1e-5, 11.99998, 12.00001, 6.00001, 11.99999],
                segments: [1, 2, 4, 2, 4, 2, 2, 2]
            }]
        }), O.Default.setImage("Icons.ConnectGuideHeaderImage", {
            width: 12,
            height: 12,
            comps: [{
                type: "oval",
                background: "#3399FF",
                borderColor: "#3399FF",
                shadowColor: "#1ABC9C",
                rect: [0, 0, 12, 12]
            }, {
                type: "shape",
                borderWidth: 1,
                borderColor: "rgb(255,255,255)",
                borderCap: "round",
                shadowColor: "#1ABC9C",
                points: [4.76, 2.56, 8.2, 5.98, 4.76, 9.44]
            }]
        }), Kp.ConnectGuide = {
            comps: [{
                type: "image",
                name: "Icons.ConnectGuideBgImage",
                rotation: {
                    func: function () {
                        return Kp.ConnectGuide.data.rotation
                    }
                },
                rect: {
                    func: function () {
                        var N = Kp.ConnectGuide.data.connect;
                        N.x, N.y;
                        var i = je.getStyle("connectGuideIntersectSize");
                        return [[N.x, N.y], 2 * i, 2 * i]
                    }
                }
            }, {
                type: "image",
                name: "Icons.ConnectGuideHeaderImage",
                rect: {
                    func: function () {
                        var V = Kp.ConnectGuide.data.cursorPos || Kp.ConnectGuide.data.connect,
                            r = je.getStyle("connectGuideIntersectSize");
                        return [[V.x, V.y], 2 * r - 2, 2 * r - 2]
                    }
                }
            }, {
                type: "shape",
                background: null,
                borderColor: "#3399ff",
                borderWidth: 2,
                segments: [1, 4],
                points: {
                    func: function () {
                        var E = Kp.ConnectGuide.data.connect,
                            F = Kp.ConnectGuide.data.cursorPos || E;
                        return [E.x, E.y, E.x + .5 * (F.x - E.x), E.y, F.x + .5 * (E.x - F.x), F.y, F.x, F.y]
                    }
                }
            }]
        }, O.Default.setImage("Icons.ConnectGuideGarbageImage", {
            width: 48,
            height: 48,
            comps: [{
                type: "oval",
                background: "rgba(0,0,0,0.1)",
                borderColor: "#979797",
                shadowColor: "#1ABC9C",
                rect: [0, 0, 48, 48]
            }, {
                type: "shape",
                borderWidth: 2,
                borderColor: "rgb(255,255,255)",
                borderCap: "round",
                shadowColor: "#1ABC9C",
                points: [19.84721, 19.69091, 19.84721, 32.25123]
            }, {
                type: "shape",
                borderWidth: 2,
                borderColor: "rgb(255,255,255)",
                borderCap: "round",
                shadowColor: "#1ABC9C",
                points: [24.10371, 19.69091, 24.10371, 32.25123]
            }, {
                type: "shape",
                borderWidth: 2,
                borderColor: "rgb(255,255,255)",
                borderCap: "round",
                shadowColor: "#1ABC9C",
                points: [28.15279, 19.69091, 28.15279, 32.25123]
            }, {
                type: "shape",
                borderWidth: 2,
                borderColor: "rgb(255,255,255)",
                borderCap: "round",
                shadowColor: "#1ABC9C",
                points: [11.23055, 15.22377, 36.76945, 15.189, 19.12302, 15.17121, 20.94722, 11.5228, 26.41985, 11.5228, 28.24406, 15.17121]
            }, {
                type: "rect",
                borderWidth: 2,
                borderColor: "rgb(255,255,255)",
                shadowColor: "#1ABC9C",
                rect: [15.48702, 15.22377, 17.02595, 21.25344]
            }]
        }), O.Default.setImage("Icons.ConnectGuideDeletingImage", {
            width: 56,
            height: 56,
            comps: [{
                type: "oval",
                background: "rgba(232,0,0,0.75)",
                borderColor: "#979797",
                shadowColor: "#1ABC9C",
                rect: [0, 0, 56, 56]
            }, {
                type: "shape",
                borderWidth: 2,
                borderColor: "rgb(255,255,255)",
                borderCap: "round",
                shadowColor: "#1ABC9C",
                points: [22.67939, 27.69091, 22.67939, 40.25123]
            }, {
                type: "shape",
                borderWidth: 2,
                borderColor: "rgb(255,255,255)",
                borderCap: "round",
                shadowColor: "#1ABC9C",
                points: [26.93588, 27.69091, 26.93588, 40.25123]
            }, {
                type: "shape",
                borderWidth: 2,
                borderColor: "rgb(255,255,255)",
                borderCap: "round",
                shadowColor: "#1ABC9C",
                points: [30.98497, 27.69091, 30.98497, 40.25123]
            }, {
                type: "shape",
                borderWidth: 2,
                borderColor: "rgb(255,255,255)",
                borderCap: "round",
                shadowColor: "#1ABC9C",
                anchorX: 0,
                anchorY: 1,
                rotation: 5.65062,
                points: [14.06272, 23.22377, 39.60163, 23.189, 21.9552, 23.17121, 23.7794, 19.5228, 29.25203, 19.5228, 31.07623, 23.17121]
            }, {
                type: "rect",
                borderWidth: 2,
                borderColor: "rgb(255,255,255)",
                shadowColor: "#1ABC9C",
                rect: [18.3192, 23.22377, 17.02595, 21.25344]
            }]
        }), Kp.ConnectGuideGarbage = {
            comps: [{
                type: "image",
                name: {
                    func: function () {
                        var Q = Kp.ConnectGuideGarbage.data.hover;
                        return Q ? "Icons.ConnectGuideDeletingImage" : "Icons.ConnectGuideGarbageImage"
                    }
                },
                rect: {
                    func: function () {
                        var d = Kp.ConnectGuideGarbage.data,
                            n = je.getStyle("connectGuideGarbageIntersectsize");
                        return d.hover && (n += 5), [[d.x, d.y], 2 * n, 2 * n]
                    }
                }
            }]
        };
        var ae = 6;
        Kp.ShapeActivingCtrl = {
            comps: [{
                type: "shape",
                visible: {
                    func: function () {
                        return Kp.ShapeActivingCtrl.data.c1 ? !0 : !1
                    }
                },
                points: {
                    func: function () {
                        var h = Kp.ShapeActivingCtrl.data;
                        return [h.point.x, h.point.y, h.c1.x, h.c1.y]
                    }
                },
                segments: [1, 2],
                background: null,
                borderWidth: 1,
                borderColor: {
                    func: function () {
                        return ci
                    }
                }
            }, {
                type: "shape",
                visible: {
                    func: function () {
                        return Kp.ShapeActivingCtrl.data.c2 ? !0 : !1
                    }
                },
                points: {
                    func: function () {
                        var K = Kp.ShapeActivingCtrl.data;
                        return [K.point.x, K.point.y, K.c2.x, K.c2.y]
                    }
                },
                segments: [1, 2],
                background: null,
                borderWidth: 1,
                borderColor: {
                    func: function () {
                        return ci
                    }
                }
            }, {
                type: "shape",
                visible: {
                    func: function () {
                        return Kp.ShapeActivingCtrl.data.c1 ? !0 : !1
                    }
                },
                points: {
                    func: function () {
                        var x = Kp.ShapeActivingCtrl.data.c1,
                            f = x.x,
                            Q = x.y,
                            b = ae / 2;
                        return "c1" === Kp.ShapeActivingCtrl.data.hl && (b += .5), [f - b, Q - b, f - b, Q + b, f + b, Q + b, f + b, Q - b]
                    }
                },
                segments: [1, 2, 2, 2, 5],
                borderWidth: 2,
                background: {
                    func: function () {
                        return je.getStyle("shapeCtrlPointBackground")
                    }
                },
                borderColor: {
                    func: function () {
                        return "c1" === Kp.ShapeActivingCtrl.data.hl ? je.getStyle("shapeCtrlPointHighlightBorder") || ci : je.getStyle("shapeCtrlPointBorderColor") || ci
                    }
                }
            }, {
                type: "shape",
                visible: {
                    func: function () {
                        return Kp.ShapeActivingCtrl.data.c2 ? !0 : !1
                    }
                },
                points: {
                    func: function () {
                        var R = Kp.ShapeActivingCtrl.data.c2,
                            k = R.x,
                            X = R.y,
                            N = ae / 2;
                        return "c2" === Kp.ShapeActivingCtrl.data.hl && (N += .5), [k - N, X - N, k - N, X + N, k + N, X + N, k + N, X - N]
                    }
                },
                segments: [1, 2, 2, 2, 5],
                borderWidth: 2,
                background: {
                    func: function () {
                        return je.getStyle("shapeCtrlPointBackground")
                    }
                },
                borderColor: {
                    func: function () {
                        return "c2" === Kp.ShapeActivingCtrl.data.hl ? je.getStyle("shapeCtrlPointHighlightBorder") || ci : je.getStyle("shapeCtrlPointBorderColor") || ci
                    }
                }
            }]
        }, Kp.RoundPoint = {
            comps: [{
                type: "circle",
                background: "rgb(247,247,247)",
                borderWidth: 1,
                borderColor: {
                    func: function () {
                        return ci
                    }
                },
                rect: {
                    func: function () {
                        return [[Kp.RoundPoint.data.x, Kp.RoundPoint.data.y], ho, ho]
                    }
                }
            }]
        }, Kp.AttachPoint = {
            comps: [{
                type: "rect",
                background: {
                    func: function () {
                        return Kp.AttachPoint.data.isAttach ? "rgb(51,153,255)" : "rgb(247,247,247)"
                    }
                },
                borderWidth: 1,
                rotation: Math.PI / 4,
                borderColor: {
                    func: function () {
                        return ci
                    }
                },
                rect: {
                    func: function () {
                        var i = Kp.AttachPoint.data.isAttach ? ho + 4 : ho;
                        return [[Kp.AttachPoint.data.x, Kp.AttachPoint.data.y], i, i]
                    }
                }
            }]
        }, Kp.SimpleRect = {
            comps: [{
                type: "rect",
                background: null,
                borderWidth: {
                    func: function () {
                        return Kp.SimpleRect.data.borderWidth || 1
                    }
                },
                borderColor: {
                    func: function () {
                        return Kp.SimpleRect.data.color || ci
                    }
                },
                rect: {
                    func: function () {
                        var J = Kp.SimpleRect.data;
                        return [J.x, J.y, J.width, J.height]
                    }
                }
            }]
        }, O.Default.setImage("Icons.MoveDummyImage", {
            width: 32,
            height: 32,
            boundExtend: 12,
            attachStyle: "close",
            comps: [{
                type: "oval",
                background: "rgb(255,255,255)",
                borderColor: "#979797",
                shadow: !0,
                shadowColor: "rgba(0,0,0,0.25)",
                shadowOffsetX: 0,
                rect: [0, 0, 32, 32]
            }, {
                type: "shape",
                background: "rgb(51,153,255)",
                pixelPerfect: !0,
                points: [8.65079, 11.90713, 9.05502, 11.46921, 9.70629, 11.46921, 10.11052, 11.90713, 10.51476, 12.28891, 10.51476, 12.92895, 10.11052, 13.34441, 8.49359, 14.97258, 12.2889, 14.97258, 12.85034, 14.97258, 13.29949, 15.42172, 13.29949, 15.99439, 13.29949, 16.57828, 12.85034, 17.0162, 12.2889, 17.0162, 8.49359, 17.0162, 10.11052, 18.6556, 10.51476, 19.0486, 10.51476, 19.7111, 10.11052, 20.09288, 9.70629, 20.50834, 9.05502, 20.50834, 8.65079, 20.09288, 5.32709, 16.76917, 5.28217, 16.71303, 4.87794, 16.32002, 4.87794, 15.67998, 5.28217, 15.26452, 8.65079, 11.90713, 8.65079, 11.90713, 8.65079, 11.90713, 13.3444, 10.09931, 13.3444, 10.09931, 12.94017, 10.50354, 12.2889, 10.50354, 11.88467, 10.09931, 11.48043, 9.69507, 11.48043, 9.0438, 11.88467, 8.63957, 15.27574, 5.25973, 15.66874, 4.86672, 16.32001, 4.86672, 16.73547, 5.25973, 16.76917, 5.31586, 20.10409, 8.63957, 20.50832, 9.0438, 20.50832, 9.68385, 20.10409, 10.09931, 19.69986, 10.49231, 19.07105, 10.50354, 18.64436, 10.09931, 17.02742, 8.45991, 17.02742, 12.26646, 17.02742, 12.83912, 16.55581, 13.31072, 15.99438, 13.31072, 15.43295, 13.31072, 14.98379, 12.83912, 14.98379, 12.26646, 14.96134, 8.45991, 13.3444, 10.09931, 13.3444, 10.09931, 13.3444, 10.09931, 21.90069, 13.33318, 21.90069, 13.33318, 21.49646, 12.91771, 21.49646, 12.27768, 21.90069, 11.89591, 22.31615, 11.45798, 22.94497, 11.45798, 23.36043, 11.89591, 26.72904, 15.2533, 27.12205, 15.66876, 27.12205, 16.3088, 26.72904, 16.7018, 26.6729, 16.75794, 23.36043, 20.08165, 22.94497, 20.49711, 22.31615, 20.49711, 21.90069, 20.08165, 21.49646, 19.69987, 21.49646, 19.03737, 21.90069, 18.64437, 23.51763, 17.00498, 19.72231, 17.00498, 19.14965, 17.00498, 18.71173, 16.56705, 18.71173, 15.98316, 18.71173, 15.41049, 19.14965, 14.96135, 19.72231, 14.96135, 23.51763, 14.96135, 21.90069, 13.33318, 21.90069, 13.33318, 21.90069, 13.33318, 11.88467, 23.32675, 11.88467, 23.32675, 11.48043, 22.94498, 11.48043, 22.27125, 11.88467, 21.88948, 12.2889, 21.48523, 12.94017, 21.48523, 13.3444, 21.88948, 14.96134, 23.52887, 14.98379, 19.7111, 14.98379, 19.14966, 15.43295, 18.67805, 15.99438, 18.67805, 16.55581, 18.67805, 17.02742, 19.14966, 17.02742, 19.7111, 17.02742, 23.52887, 18.64436, 21.88948, 19.07105, 21.48523, 19.69986, 21.48523, 20.10409, 21.88948, 20.50832, 22.27125, 20.50832, 22.94498, 20.10409, 23.32675, 16.76917, 26.65045, 16.73547, 26.72905, 16.32001, 27.13329, 15.66874, 27.13329, 15.27574, 26.72905, 11.88467, 23.32675, 11.88467, 23.32675, 11.88467, 23.32675],
                segments: [1, 4, 4, 2, 2, 4, 4, 2, 2, 4, 4, 2, 2, 4, 2, 2, 2, 1, 2, 4, 4, 2, 4, 2, 2, 4, 4, 2, 2, 4, 4, 2, 2, 2, 2, 1, 2, 4, 4, 2, 4, 2, 2, 4, 4, 2, 2, 4, 4, 2, 2, 2, 2, 1, 2, 4, 4, 2, 2, 4, 4, 2, 2, 4, 4, 2, 2, 4, 2, 2, 2]
            }]
        }), Kp.MoveDummy = {
            comps: [{
                type: "image",
                name: "Icons.MoveDummyImage",
                rect: {
                    func: function () {
                        var n = Kp.MoveDummy.data;
                        return [[n.pos.x, n.pos.y], 2 * n.size, 2 * n.size]
                    }
                }
            }]
        }, se.Icons.DrawIcon = function (z, B, T, h) {
            T.width = T.height = bs, T.data = h, je = z, O.Default.drawImage(B, T, 0, 0, bs, bs)
        }, se.Icons.MapPoints = function (H, n) {
            for (var p = 0, s = H.length; s > p; p++) H[p] /= n
        }, se.roundTo = function (b, h, O) {
            var U = Math.abs(b % h);
            return O > U || O > h - U ? h * Math.round(b / h) : b
        }, se.toFixed = function (f) {
            return Math.round(100 * f) / 100
        }, se.getDataMatrix = function (q) {
            if (q instanceof O.Shape) {
                var Y = new O.Math.Matrix2d,
                    h = q.getPosition();
                return Y.translate(-h.x, -h.y).scale(q.getScale().x, q.getScale().y).rotate(q.getRotation()).translate(h.x, h.y), Y
            }
            return q.getMatrix ? q.getMatrix() : new O.Math.Matrix2d
        };
        var Ao = se.Math.Curve = function () {
            this._curves = []
        };
        Ao.prototype = {}, Ao.prototype.constructor = Ao, Ao.prototype.createFromHtShape = function (Y, J, V) {
            J instanceof O.List && (J = J.toArray());
            var I, W, L, D, _, G, S, m = this,
                C = null,
                d = null,
                H = 0,
                v = se.Math.Vector2,
                T = se.Math.CubicBezier,
                p = function (H) {
                    return new v(Y[H], Y[H + 1], V ? V[H / 2] : Z)
                };
            for (W = 0, L = J.length; L > W; W++) {
                switch (D = J[W], _ = null, D) {
                    case 1:
                        d = p(H), C = d, H += 2;
                        break;
                    case 2:
                        I = p(H), H += 2, _ = new T(d, d.clone(), I.clone(), I), d = I;
                        break;
                    case 3:
                        G = p(H), I = p(H + 2), H += 4, _ = new T(d, G.clone().sub(d).multiplyScalar(2 / 3).add(d), G.clone().sub(I).multiplyScalar(2 / 3).add(I), I), d = I;
                        break;
                    case 4:
                        G = p(H), S = p(H + 2), I = p(H + 4), H += 6, _ = new T(d, G, S, I), d = I;
                        break;
                    case 5:
                        if (!C) break;
                        _ = new T(d, d.clone(), C.clone(), C), d = null, C = null
                }
                _ && (_._index = m._curves.length, m._curves.push(_))
            }
        }, Ao.prototype.checkPoint = function (T, p) {
            var G, B, y, o, R, A = this,
                g = A._curves;
            for (G = 0, B = g.length; B > G; G++)
                if (o = g[G], R = o.intersectRect(T, p, p), R.length) return y = 0, R.forEach(function (Q) {
                    y += Q.t
                }), y /= R.length, T = o.getPointAt(y), T.t = y, {
                    bezier: o,
                    intersection: T
                }
        }, Ao.prototype.insertKnot = function (t, I) {
            var k = t.insertKnot(I),
                m = this,
                L = m._curves;
            L.splice(t._index, 1, k[0], k[1])
        }, Ao.prototype._isCloseEnough = function (e, g) {
            return Math.abs(e.x - g.x) < 1e-6 && Math.abs(e.y - g.y) < 1e-6
        }, Ao.prototype._isSamePoint = function (G, E) {
            return G === E
        }, Ao.prototype.moveRealPoint = function (R, T) {
            var t = this,
                A = t._curves,
                f = T.clone().sub(R);
            A.forEach(function (Y) {
                var n = Y._p1;
                Y._p2, Y._p3;
                var d = Y._p4;
                t._isSamePoint(n, R) && (Y._p2.add(f), Y._p1 = T), t._isSamePoint(d, R) && (Y._p3.add(f), Y._p4 = T)
            })
        }, Ao.prototype.moveCtrlDueToRealPointMovement = function (r, Z) {
            var a = this,
                i = a._curves,
                c = function (o) {
                    o.add(Z), o.e && Z.e && (o.e += Z.e)
                };
            i.forEach(function (S) {
                var x = S._p1;
                S._p2, S._p3;
                var z = S._p4;
                a._isSamePoint(x, r) && c(S._p2), a._isSamePoint(z, r) && c(S._p3)
            })
        }, Ao.prototype.moveCtrlPoint = function (o, e, d) {
            var m = o[d];
            if (m) {
                m.e !== Z && (e.e = m.e);
                var H = this,
                    B = H._curves;
                e.clone().sub(m), B.forEach(function (P) {
                    var $;
                    "c2" === d ? $ = "_p2" : "c1" === d && ($ = "_p3"), H._isSamePoint(P[$], m) && (P[$] = e)
                }), o[d] = e
            }
        }, Ao.prototype.deleteRealPoint = function (G, l) {
            var D, E, w, n, p, s, Y, J = this,
                H = J._curves,
                W = {},
                Q = [],
                O = se.Math.CubicBezier;
            for (E = 0, w = H.length; w > E; E++) D = H[E], n = D._p1, p = D._p2, s = D._p3, Y = D._p4, (W[E] || !J._isSamePoint(n, G)) && (J._isSamePoint(Y, G) ? w > E + 1 && J._isSamePoint(H[E + 1]._p1, G) && (l || Q.push(new O(n, p, H[E + 1]._p3, H[E + 1]._p4))) : Q.push(D));
            J._curves = Q
        }, Ao.prototype.findPairs = function (R, l) {
            var d, j, t, f, I, J, T, o, Y = this,
                L = Y._curves,
                O = {},
                z = [];
            for (j = 0, t = L.length; t > j; j++) d = L[j], f = d._p1, I = d._p2, J = d._p3, T = d._p4, !O[j] && Y._isSamePoint(f, R) && (l ? z.push({
                point: f,
                r2: T
            }) : z.push({
                point: f,
                c2: I
            })), Y._isSamePoint(T, R) && (o = l ? {
                point: T,
                r1: f
            } : {
                    point: T,
                    c1: J
                }, t > j + 1 && Y._isSamePoint(L[j + 1]._p1, R) && (l ? o.r2 = L[j + 1]._p4 : o.c2 = L[j + 1]._p2, O[j + 1] = !0), z.push(o));
            return z
        }, Ao.prototype.toHtShape = function () {
            var X = this,
                R = X._curves,
                k = [],
                A = [],
                e = {
                    x: 1 / 0,
                    y: 1 / 0
                };
            return R.forEach(function (R) {
                var $ = R._p1,
                    P = R._p2,
                    E = R._p3,
                    F = R._p4;
                return X._isCloseEnough($, e) || (k.push(1), A.push($.clone())), e = F, X._isCloseEnough($, P) && X._isCloseEnough(E, F) ? (k.push(2), A.push(F.clone()), void 0) : (k.push(4), A.push(P.clone(), E.clone(), F.clone()), void 0)
            }), {
                segments: k,
                points: A
            }
        };
        var Po = se.Math.CubicBezier = function (M, V, v, d) {
            var I = this;
            I._id = se.Math.CubicBezier._globalId++, I._p1 = M, I._p2 = V, I._p3 = v, I._p4 = d
        };
        Po._globalId = 1, Po.prototype = {}, Po.prototype.constructor = Po, Po.prototype.toString = function () {
            return this._id
        }, Po.prototype.intersectRect = function (Q, M, g) {
            var z = M / 2,
                I = g / 2,
                p = Q.x,
                F = Q.y,
                d = se.Math.Vector2,
                j = new d(-z + p, -I + F),
                t = new d(z + p, I + F),
                m = new d(t.x, j.y),
                c = new d(j.x, t.y),
                e = this,
                $ = e.intersectLine(j, m),
                h = e.intersectLine(m, t),
                L = e.intersectLine(t, c),
                R = e.intersectLine(c, j),
                w = $.concat(h).concat(L).concat(R);
            return w
        }, Po.prototype.intersectLine = function (B, i) {
            var U, d, y, a, r, u, l, X, t, C, w, R, Y, F = this,
                H = B.clone().min(i),
                e = B.clone().max(i);
            a = F._p1, r = F._p2, u = F._p3, l = F._p4, U = a.clone().multiplyScalar(-1), d = r.clone().multiplyScalar(3), y = u.clone().multiplyScalar(-3), w = U.add(d).add(y).add(l), U = a.clone().multiplyScalar(3), d = r.clone().multiplyScalar(-6), y = u.clone().multiplyScalar(3), C = U.add(d).add(y), U = a.clone().multiplyScalar(-3), d = r.clone().multiplyScalar(3), t = U.add(d), X = a.clone(), Y = new se.Math.Vector2(B.y - i.y, i.x - B.x), R = B.x * i.y - i.x * B.y;
            for (var j = F.getRoots(Y.dot(w), Y.dot(C), Y.dot(t), Y.dot(X) + R), c = new Array, W = 0, k = j.length; k > W; W++) {
                var Z = j[W];
                if (!(0 > Z || Z > 1)) {
                    var T = F.getPointAt(Z);
                    T.t = Z, B.x == i.x ? H.y <= T.y && T.y <= e.y && c.push(T) : B.y == i.y ? H.x <= T.x && T.x <= e.x && c.push(T) : T.x >= H.x && T.y >= H.y && T.x <= e.x && T.y <= e.y && c.push(T)
                }
            }
            return c
        }, Po.prototype.solveTForPoint = function (s) {
            var p, A, f, S, q = this;
            p = q._p1.x - s.x, A = q._p2.x - s.x, f = q._p3.x - s.x, S = q._p4.x - s.x;
            for (var P = q.getRoots(S - 3 * f + 3 * A - p, 3 * f - 6 * A + 3 * p, 3 * A - 3 * p, p), $ = Z, o = 1 / 0, c = 0, L = P.length; L > c; c++) {
                var Q = P[c];
                if (!(0 > Q || Q > 1)) {
                    var m = q.getPointAt(Q);
                    m.t = Q;
                    var i = Math.abs(m.y - s.y);
                    o > i && (o = i, $ = m)
                }
            }
            return $
        }, Po.prototype.getPointAt = function (n) {
            var e = this,
                O = e._p1,
                u = e._p2,
                d = e._p3,
                Z = e._p4,
                o = O.clone().lerp(u, n),
                G = u.clone().lerp(d, n),
                i = d.clone().lerp(Z, n),
                g = o.lerp(G, n),
                _ = G.lerp(i, n);
            return g.lerp(_, n)
        }, Po.prototype.getPointByPercentage = function (l) {
            var z = this.length * l,
                J = this._cacheLength,
                h = J.length;
            if (0 === z) return J[0].point;
            if (l >= 1) return J[h - 1].point;
            for (var q = 0; h > q; q++) {
                var m = J[q];
                if (!(m.len < z)) {
                    var $ = J[q - 1];
                    return m.point.clone().sub($.point).setLength(z - $.len).add($.point)
                }
            }
        }, Po.prototype.getTByPercentage = function (j) {
            var q = this.length * j,
                Z = this._cacheLength,
                a = Z.length;
            if (0 === q || 0 >= j) return Z[0].t;
            if (j >= 1) return Z[a - 1].t;
            for (var t = 0; a > t; t++) {
                var H = Z[t];
                if (!(H.len < q)) {
                    var g = Z[t - 1];
                    return (q - g.len) / (H.len - g.len) * (H.t - g.t) + g.t
                }
            }
        }, Po.prototype.getRoots = function (Y, s, t, u) {
            var T, A, e, F, $, E = new Array;
            if (Math.abs(Y) < 1e-6) {
                var T = s,
                    A = t / T,
                    e = u / T,
                    F = A * A - 4 * e;
                if (F > 0) {
                    var $ = Math.sqrt(F);
                    E.push(.5 * (-A + $)), E.push(.5 * (-A - $))
                } else 0 == F && E.push(.5 * -A)
            }
            s /= Y, t /= Y, u /= Y, T = (3 * t - s * s) / 3, A = (2 * s * s * s - 9 * t * s + 27 * u) / 27;
            var M = s / 3,
                V = A * A / 4 + T * T * T / 27,
                v = A / 2;
            if (Math.abs(V) <= 1e-6 && (V = 0), V > 0) {
                var w, O, $ = Math.sqrt(V);
                w = -v + $, O = w >= 0 ? Math.pow(w, 1 / 3) : -Math.pow(-w, 1 / 3), w = -v - $, w >= 0 ? O += Math.pow(w, 1 / 3) : O -= Math.pow(-w, 1 / 3), E.push(O - M)
            } else if (0 > V) {
                var r = Math.sqrt(-T / 3),
                    Q = Math.atan2(Math.sqrt(-V), -v) / 3,
                    C = Math.cos(Q),
                    f = Math.sin(Q),
                    q = Math.sqrt(3);
                E.push(2 * r * C - M), E.push(-r * (C + q * f) - M), E.push(-r * (C - q * f) - M)
            } else {
                var w;
                w = v >= 0 ? -Math.pow(v, 1 / 3) : Math.pow(-v, 1 / 3), E.push(2 * w - M), E.push(-w - M)
            }
            return E
        }, Po.prototype._70I = function () {
            var i = this;
            return i._p1.distanceToSquared(i._p2) < 1e-10 && i._p3.distanceToSquared(i._p4) < 1e-10
        }, Po.prototype.insertKnot = function (K) {
            var d = this,
                v = d._p1,
                g = d._p2,
                U = d._p3,
                Q = d._p4,
                z = v.clone().lerp(g, K),
                E = g.clone().lerp(U, K),
                f = U.clone().lerp(Q, K),
                V = z.clone().lerp(E, K),
                I = E.clone().lerp(f, K),
                $ = V.clone().lerp(I, K);
            return d._70I() ? (v.clone().lerp(Q, K), [new se.Math.CubicBezier(v, v.clone(), $.clone(), $), new se.Math.CubicBezier($, $.clone(), Q.clone(), Q)]) : [new se.Math.CubicBezier(v, z, V, $), new se.Math.CubicBezier($, I, f, Q)]
        }, o.defineProperties(Po.prototype, {
            length: {
                get: function () {
                    var A = this._cacheLength;
                    if (!A) {
                        A = this._cacheLength = [];
                        for (var Z = this._p1, K = 0, F = 0; 1 >= K;) {
                            var k = this.getPointAt(K += .001);
                            F += k.clone().sub(Z).length(), Z = k, A.push({
                                len: F,
                                t: K,
                                point: k.clone()
                            })
                        }
                    }
                    return A[A.length - 1].len
                }
            },
            p1: {
                get: function () {
                    return this._p1
                }, set: function ($) {
                    this._p1 = $, this._cacheLength = Z
                }
            },
            p2: {
                get: function () {
                    return this._p2
                }, set: function (U) {
                    this._p2 = U, this._cacheLength = Z
                }
            },
            p3: {
                get: function () {
                    return this._p3
                }, set: function (r) {
                    this._p3 = r, this._cacheLength = Z
                }
            },
            p4: {
                get: function () {
                    return this._p4
                }, set: function (K) {
                    this._p4 = K, this._cacheLength = Z
                }
            }
        });
        var wn = O.Default.getInternal().ui().EdgeUI,
            xe = {
                _47O: function (j) {
                    var D = this,
                        z = xe.getBackups()._47O;
                    se.inEdit(D.gv) || z.call(D, j)
                }
            };
        se.Inject.registAsModule(xe, wn);
        var Af = O.Default.getInternal().ui().NodeUI,
            Zq = {
                _47O: function (n) {
                    var h = this,
                        X = Zq.getBackups()._47O;
                    se.inEdit(h.gv) || X.call(h, n)
                }, getSelectWidth: function () {
                    var M = this,
                        l = M.gv,
                        O = M._data;
                    if (l.isEditable(O) && se.inEdit(l)) return 0;
                    var e = Zq.getBackup("getSelectWidth");
                    return e.call(M)
                }
            };
        se.Inject.registAsModule(Zq, Af);
        var Ab = O.graph.GraphView,
            Kl = {
                _editPointSize: function () {
                    var f = O.Default.isTouchable,
                        S = se.getStyle("pointSize");
                    return S[f ? 0 : 1]
                }(),
                isPointEditable: function (J) {
                    var p = this;
                    if (se.inEdit(p)) return p._pointEditableFunc ? p._pointEditableFunc(J) : !0;
                    var W = Kl.getBackup("isPointEditable");
                    W.call(p, J)
                }, isEditable: function (C) {
                    var H, A = this,
                        s = Kl.getBackup("isEditable");
                    if (H = C instanceof se.Group ? !0 : s.call(A, C), !se.inEdit(A)) return H;
                    if (!(C instanceof O.Edge)) return H;
                    if (!C.s("2d.editable")) return !1;
                    var g = A.getEditableFunc();
                    return g ? g(C) : !0
                }, _42: function (n, d) {
                    var m = this,
                        p = Kl.getBackups()._42;
                    if (p.call(m, n, d), se.inEdit(m)) {
                        var r = m.getEditInteractor();
                        r.drawImpl()
                    }
                }
            };
        se.Inject.registAsModule(Kl, Ab);
        var Xp = O.Default.getInternal().ui().ShapeUI,
            pm = {
                _47O: function (d) {
                    var s = this,
                        p = pm.getBackups()._47O;
                    se.inEdit(s.gv) || p.call(s, d)
                }
            };
        se.Inject.registAsModule(pm, Xp);
        var pk = O.graph.DefaultInteractor,
            ji = {
                handle_mousewheel: function (N) {
                    var t = this,
                        l = ji.getBackup("handle_mousewheel");
                    se.inEdit(t.gv) || l.call(t, N)
                }
            };
        se.Inject.registAsModule(ji, pk);
        var Wr = O.graph.MoveInteractor,
            tn = {
                _calcShift: function (h, f) {
                    var W = this,
                        I = tn.getBackup("_calcShift"),
                        D = W.gv;
                    if (!se.inEdit(D)) return I.call(W, h, f);
                    var E = D.getEditInteractor(),
                        d = E.getSubModule("Move").calcShift(h, f, W);
                    return d || I.call(W, h, f)
                }, clear: function (x) {
                    var Q = this,
                        P = tn.getBackup("clear");
                    P.call(Q, x);
                    var D = Q.gv;
                    if (se.inEdit(D)) {
                        var F = D.getEditInteractor();
                        F.getSubModule("Move").clear(x)
                    }
                }
            };
        se.Inject.registAsModule(tn, Wr);
        var yf = se.Rect = function (P) {
            this.catalog = "Rect", this._interactor = P
        };
        yf.prototype = {}, yf.prototype.constructor = yf, yf.prototype.gatherInfo = function (w, X) {
            var D = this;
            if (1 === X.length) {
                var $ = X[0];
                return $ instanceof O.Shape && $._70I() ? D.gatherLine(w, $) : Th($, w) ? !1 : D.gatherSingleTarget(w, $)
            }
            return X.length > 1 ? D.gatherMultiTargets(w, X) : !1
        }, yf.prototype.gatherSingleTarget = function (u, v) {
            if (v.getCorners) {
                var L, H = this,
                    a = H.info;
                H.target = v, L = H.screenInfo = {};
                var M = v.getCorners();
                a.LT = new se.Math.Vector2(M[0]), a.LB = new se.Math.Vector2(M[1]), a.RB = new se.Math.Vector2(M[2]), a.RT = new se.Math.Vector2(M[3]), a.T = a.LT.clone().add(a.RT).divideScalar(2), a.B = a.LB.clone().add(a.RB).divideScalar(2), a.L = a.LT.clone().add(a.LB).divideScalar(2), a.R = a.RT.clone().add(a.RB).divideScalar(2);
                for (var P in a) L[P] = se.toScreenPosition(u, a[P]);
                var e = H._interactor,
                    j = e.getStyle("checkSize"),
                    k = function (J, $, m) {
                        var I = $.clone().sub(J).setLength(-j),
                            x = m.clone().sub(J).setLength(-j),
                            v = I.add(x).add(J);
                        return v
                    };
                return L.rotLT = k(L.LT, L.RT, L.LB), L.rotLB = k(L.LB, L.LT, L.RB), L.rotRB = k(L.RB, L.LB, L.RT), L.rotRT = k(L.RT, L.LT, L.RB), L.rotT = L.rotLT.clone().add(L.rotRT).divideScalar(2), L.rotB = L.rotLB.clone().add(L.rotRB).divideScalar(2), L.rotL = L.rotLT.clone().add(L.rotLB).divideScalar(2), L.rotR = L.rotRT.clone().add(L.rotRB).divideScalar(2), L.rotation = v.getRotation(), H.gatherConnectInfo(), !0
            }
        }, yf.prototype.gatherConnectInfo = function () {
            var e = this,
                Y = e.target,
                N = e._interactor,
                f = e.screenInfo,
                G = N.gv;
            if (G.isConnectActionVisible(Y) && N.getStyle("connectGuideVisible")) {
                var S;
                Y.s && (S = Y.s("connectGuideShift")), S || (S = N.getStyle("connectGuideShift"));
                var V = Y.getAnchor(),
                    F = Y.getSize(),
                    p = Y.toGlobal({
                        x: F.width * (S[0] - V.x),
                        y: F.height * (S[1] - V.y)
                    });
                p = se.toScreenPosition(G, p), f.P1 ? p.add(f.P2.clone().sub(f.P1).setLength(S[2])) : (p.add(f.RT.clone().sub(f.LT).setLength(S[2])), p.add(f.LB.clone().sub(f.LT).setLength(S[3]))), f.connect = p
            }
        }, yf.prototype.gatherMultiTargets = function (F, K) {
            var o = se.Group.findOrCreateGroup(K);
            if (!o) return !1;
            var I = this;
            return I.editing && "rotate" !== I.editing.mode || o.calcInfo(), I.gatherSingleTarget(F, o)
        }, yf.prototype.gatherLine = function (l, q) {
            this.target = q;
            var Q = this.screenInfo = {},
                e = q.getPoints(),
                D = se.getDataMatrix(q);
            return Q.P1 = se.toScreenPosition(l, D.apply(e.get(0))), Q.P2 = se.toScreenPosition(l, D.apply(e.get(1))), this.gatherConnectInfo(), !0
        }, yf.ResizeKeys = ["LT", "RB", "LB", "RT", "L", "R", "B", "T"], yf.ResizeDirection = [{
            x: -1,
            y: -1
        }, {
            x: 1,
            y: 1
        }, {
            x: -1,
            y: 1
        }, {
            x: 1,
            y: -1
        }, {
            x: -1,
            y: 0
        }, {
            x: 1,
            y: 0
        }, {
            x: 0,
            y: 1
        }, {
            x: 0,
            y: -1
        }], yf.RotateKeys = ["rotLT", "rotRB", "rotLB", "rotRT", "rotL", "rotR", "rotB", "rotT"], yf.prototype.check = function (s, h, g) {
            if (O.Default.isLeftButton(h)) {
                var l = this;
                if (l.editing = null, l.tipInfo = null, l.screenInfo) {
                    var L = l.target,
                        i = s.isEditable(L),
                        v = l.screenInfo;
                    if (i && v.connect) {
                        var Q = l._checkConnect(g);
                        if (Q) return Q
                    }
                    if (v.P1) return l._checkLine(g);
                    var z, e, p, Y = null,
                        D = l._interactor,
                        $ = D.getStyle("checkSize");
                    if (i && s.isRectEditable(L))
                        for (e = 0; e < se.Rect.ResizeKeys.length; e++)
                            if (p = se.Rect.ResizeKeys[e], se.checkHit(g, v[p], $)) {
                                Y = p, z = "resize";
                                break
                            }
                    if (!Y && i && s.isRotationEditable(L) && !D.getStyle("rotateAsClock")) {
                        var f = D.getStyle("rotateCheckSize");
                        for (e = 0; e < se.Rect.RotateKeys.length; e++)
                            if (p = se.Rect.RotateKeys[e], se.checkHit(g, v[p], f)) {
                                Y = p, z = "rotate";
                                break
                            }
                    }
                    if (!Y) return D.setCursor("default"), void 0;
                    if ("rotate" === z) {
                        var R, x = s.lp(h);
                        if (L instanceof se.Group) {
                            var a = D.getStyle("groupRotateModeKey");
                            "string" == typeof a && (a = [a]);
                            for (var y = !1, A = 0, q = a.length; q > A; A++)
                                if (h[a[A]]) {
                                    y = !0;
                                    break
                                }
                            var Z = D.getStyle("groupRotateModeDefault");
                            R = y ? "batch" === Z ? "block" : "batch" : Z
                        }
                        var X = "batch" === R ? L.getAnchor2() : L.getPosition(),
                            E = Math.atan2(x.y - X.y, x.x - X.x);
                        D._setRotateCursor(E), l.editing = {
                            mode: z,
                            key: Y,
                            pos: X,
                            flipY: L.getScale().y < 0,
                            rotation: L.getRotation(),
                            hitRot: E
                        }, R && (l.editing.groupRotateMode = R)
                    } else {
                        var o = se.Rect.ResizeKeys.indexOf(Y),
                            H = se.Rect.ResizeDirection[o],
                            F = Math.cos(L.getRotation()),
                            r = Math.sin(L.getRotation()),
                            P = H.x * Math.sign(L.getScale().x),
                            M = H.y * Math.sign(L.getScale().y),
                            W = Math.atan2(-r * P - F * M, F * P - r * M),
                            T = (Math.round(W / (Math.PI / 4)) + 8) % 8,
                            t = ["ew-resize", "nesw-resize", "ns-resize", "nwse-resize", "ew-resize", "nesw-resize", "ns-resize", "nwse-resize"][T];
                        this._interactor.setCursor(t);
                        var C = L.getWidth(),
                            G = L.getHeight(),
                            j = L.getAnchor();
                        l.editing = {
                            mode: z,
                            key: Y,
                            rect: {
                                x: -C * j.x,
                                y: -G * j.y,
                                width: C,
                                height: G
                            },
                            anchor: j,
                            matrix: L.getMatrix()
                        }
                    }
                    return Y
                }
            }
        }, yf.prototype._checkLine = function (O) {
            var I = this;
            I.screenInfo;
            var d, J = I._interactor.getStyle("checkSize");
            if (se.checkHit(O, I.screenInfo.P1, J)) d = "P1";
            else {
                if (!se.checkHit(O, I.screenInfo.P2, J)) return this._interactor.setCursor("default"), void 0;
                d = "P2"
            }
            return I.editing = {
                mode: "line",
                key: d
            }, d
        }, yf.prototype._checkConnect = function (K) {
            var a = this,
                g = a.screenInfo,
                P = a._interactor,
                d = P.getStyle("connectGuideIntersectSize"),
                l = g.connect,
                o = K.x,
                j = l.x;
            if (j > o && d > j - o && Math.abs(l.y - K.y) < d || o >= j && se.checkHit(K, l, d)) {
                var S = "connect",
                    O = u.getConnectAction(P.gv);
                if (a.editing = {
                    mode: S
                }, O && O.delete)
                    if (a.target instanceof se.Group) {
                        var R = !0;
                        P.gv.sm().getSelection().each(function (K) {
                            O.delete.visible.call(null, P.gv, K) || (R = !1)
                        }), a.editing.hasDeleteAction = R
                    } else O.delete.visible.call(null, P.gv, a.target) && (a.editing.hasDeleteAction = !0);
                return P.setCursor("default"), S
            }
        }, yf.prototype._fireEditEvent = function (x, j) {
            var v = this._interactor,
                M = this.editing;
            if (M) {
                var S = M.mode;
                S = "rotate" === S ? "Rotation" : "connect" === S ? "Connection" : "resize" === S ? "Rect" : S[0].toUpperCase() + S.slice(1), v.fi({
                    kind: x + "Edit" + S,
                    event: j
                })
            }
        }, yf.prototype.startEdit = function (w, n) {
            w.startDragging(n);
            var L = this;
            L._interactor.fi({
                kind: "prepareEdit",
                event: n
            });
            var r = L.editing,
                v = L.target;
            if (r) {
                if (L._fireEditEvent("begin", n), "rotate" === r.mode) return r.groupRotateMode && v.beginRotate(r), void 0;
                if ("connect" !== r.mode) ("line" === r.mode || v && 0 === v.getRotation()) && (L._inSmartGuide = !0, L._interactor.rectGuide.gatherRects());
                else if (r.hasDeleteAction) {
                    var z = w.gv,
                        Y = L._interactor.getStyle("connectGuideGarbageShift");
                    r.garbageInfo = {
                        x: z.getWidth() * Y[0] + Y[2],
                        y: z.getHeight() * Y[1] + Y[3],
                        size: L._interactor.getStyle("connectGuideGarbageIntersectsize")
                    }, w._42()
                }
            }
        }, yf.prototype._46O = function ($) {
            var q, Y, i = this,
                M = i.editing,
                d = i.target;
            if (M) {
                if ("connect" === M.mode && !M.canceled && !M.deleted) try {
                    M.garbageInfo && M.garbageInfo.hover ? u.doDeleteConnectionAction(i._interactor.gv, d) : u.doConnectAction(i._interactor.gv, d, M.target)
                } catch (b) {
                    console.error(b)
                }
                Y = M.freezeFlag, q = i.editing.groupRotateMode, i._fireEditEvent("end", $), i.editing = null
            }
            i.tipInfo = null, i._inSmartGuide && (i._interactor.rectGuide.clear(), i._inSmartGuide = !1), q && d && d.endRotate(), d instanceof O.Block && (Y === Z ? delete d._freezeSyncFromChildren : d._freezeSyncFromChildren = Y, d.updateFromChildren())
        }, yf.prototype.handleNormalStateDelete = function () {
            var V = this,
                e = V.editing;
            if (e && "connect" === e.mode && !e.canceled && !e.deleted) {
                if (e.garbageInfo) {
                    try {
                        u.doDeleteConnectionAction(V._interactor.gv, V.target)
                    } catch ($) {
                        console.error($)
                    }
                    e.garbageInfo = null
                }
                return e.cursorPos = null, e.targetCorners = null, e.deleted = !0, V._interactor._42(), !0
            }
        }, yf.prototype.handleNormalStateKeyDown = function (f) {
            var j = this,
                q = j.editing;
            return !q || "connect" !== q.mode || q.canceled || q.deleted ? void 0 : O.Default.isEsc(f) ? (q.cursorPos = null, q.targetCorners = null, q.canceled = !0, j._interactor._42(), !0) : void 0
        }, yf.prototype.handleEdit = function (J, i) {
            var Y = this,
                C = Y.editing;
            if (C) {
                var b, R, m, _, D, Z = Y.target,
                    U = C.key,
                    s = C.mode,
                    x = J.lp(i),
                    w = Y._interactor;
                if ("connect" === s) {
                    if (C.canceled) return;
                    if (C.deleted) return;
                    C.cursorPos = w._getLogicalPoint(i);
                    var u = C.garbageInfo;
                    return u && se.checkHit(C.cursorPos, u, u.size) ? (u.hover = !0, C.target = null, C.targetCorners = null) : (u && (u.hover = !1), C.target = J.getDataAt(x, function (H) {
                        return J.isSelectable(H) ? Fq(H) ? !0 : !1 : !1
                    }) || null, C.targetCorners = se.getTargetCornersOnScreen(J, C.target)), w._42(), void 0
                }
                if ("rotate" === s) {
                    var p, z, t = C.pos,
                        e = Math.atan2(x.y - t.y, x.x - t.x);
                    if (C.groupRotateMode ? z = e - C.hitRot : (p = e - C.hitRot, z = C.rotation + p), z %= 2 * Math.PI, 0 > z && (z += 2 * Math.PI), !O.Default.isCtrlDown(i)) {
                        var B, q;
                        Pf(i) ? (B = w.getStyle("shiftRotateRound"), q = B / 2) : (B = w.getStyle("rotateRound"), q = w.getStyle("rotateSensitivity")), z = se.roundTo(z, B, q)
                    }
                    C.groupRotateMode ? (p = z - (C.lastRotation || 0), 0 !== p && (Z.addRotation(p, C.groupRotateMode, function (l) {
                        return J.isRotationEditable(l)
                    }), C.lastRotation = z)) : Z.setRotation(z), w._setRotateCursor(e), z > Math.PI && (z -= 2 * Math.PI);
                    var X = 180 * (z / Math.PI);
                    X = X.toFixed(2), b = "" + X + "°"
                } else if ("resize" === s) {
                    var Q = C.rect;
                    m = Q.x, _ = Q.y;
                    var G, g = Q.width,
                        H = Q.height,
                        v = C.anchor,
                        F = C.matrix,
                        T = Z.s && Z.s("keepAspectRatio") || w.getStyle("keepAspectRatio");
                    Pf(i) && (T = !T);
                    var V = Y._unionPointMode1,
                        r = Y._unionPointMode2;
                    if (Y._inSmartGuide && !O.Default.isCtrlDown(i) && !T) {
                        var K;
                        "L" === U || "R" === U ? K = "x" : ("T" === U || "B" === U) && (K = "y"), Y._adsorbedToClosest(x, K), D = !0
                    }
                    G = F.tfi(x);
                    var d;
                    "LT" === U ? (Q = V(G, {
                        x: m + g,
                        y: _ + H
                    }, g, H, T), d = 9) : "T" === U ? (Q = r({
                        x: m,
                        y: G.y
                    }, {
                        x: m + g,
                        y: _ + H
                    }, g, H, T, "v"), d = 1) : "RT" === U ? (Q = V(G, {
                        x: m,
                        y: _ + H
                    }, g, H, T), d = 33) : "L" === U ? (Q = r({
                        x: G.x,
                        y: _
                    }, {
                        x: m + g,
                        y: _ + H
                    }, g, H, T, "h"), d = 8) : "R" === U ? (Q = r({
                        x: m,
                        y: _
                    }, {
                        x: G.x,
                        y: _ + H
                    }, g, H, T, "h"), d = 32) : "LB" === U ? (Q = V(G, {
                        x: m + g,
                        y: _
                    }, g, H, T), d = 12) : "B" === U ? (Q = r({
                        x: m,
                        y: _
                    }, {
                        x: m + g,
                        y: G.y
                    }, g, H, T, "v"), d = 4) : "RB" === U && (Q = V(G, {
                        x: m,
                        y: _
                    }, g, H, T), d = 36);
                    var W = F.tf(Q.x + Q.width * v.x, Q.y + Q.height * v.y);
                    Z instanceof O.Block && (C.hasOwnProperty("freezeFlag") || (C.freezeFlag = Z._freezeSyncFromChildren, Z._freezeSyncFromChildren = !0)), Z.setPosition(W), Z.setSize(Q.width, Q.height), D && (R = Z.getRect(), w.rectGuide.gatherLines({
                        node: Z,
                        x: R.x,
                        y: R.y,
                        w: R.width,
                        h: R.height
                    }, K, d)), b = "" + Math.round(Q.width) + " * " + Math.round(Q.height)
                } else if ("line" === s) {
                    if (Pf(i)) {
                        var o = Z.getPoints(),
                            h = "P1" === U ? o.get(1) : o.get(0),
                            c = {
                                x: x.x - h.x,
                                y: x.y - h.y
                            },
                            E = w.getStyle("shiftLineRotateRound"),
                            I = Y._shiftDirList;
                        if (!I || Y._shiftRotateRound !== E) {
                            Y._shiftRotateRound = E, Y._shiftDirList = I = [];
                            for (var L = 0; L < Math.PI; L += E) I.push({
                                x: n(L),
                                y: k(L)
                            })
                        }
                        for (var y, f = 0, l = 0, j = I.length; j > l; l++) {
                            var $ = I[l],
                                a = $.x * c.x + $.y * c.y;
                            Math.abs(a) > Math.abs(f) && (f = a, y = $)
                        }
                        x = {
                            x: h.x + y.x * f,
                            y: h.y + y.y * f
                        }, w.rectGuide.clear()
                    } else Y._inSmartGuide && !O.Default.isCtrlDown(i) && (Y._adsorbedToClosest(x), D = !0);
                    var A = se.getDataMatrix(Z).applyInverse(x);
                    Z.setPoint("P1" === U ? 0 : 1, A, !0);
                    var M = Z.getPoints(),
                        P = M.get(0),
                        S = M.get(1);
                    m = P.x - S.x, _ = P.y - S.y, b = " " + Math.round(Math.sqrt(m * m + _ * _)) + " ", D && (R = Z.getRect(), w.rectGuide.gatherLines({
                        node: Z,
                        x: R.x,
                        y: R.y,
                        w: R.width,
                        h: R.height
                    }))
                }
                if (b) {
                    var N = O.Default.getLogicalPoint(i, w._canvas);
                    N.x += se.Icons.TipShiftX, N.y += se.Icons.TipShiftY, Y.tipInfo = {
                        helperPos: N,
                        text: b,
                        size: b.length
                    }
                }
                Y._fireEditEvent("between", i)
            }
        }, yf.prototype._unionPointMode1 = function (y, u, c, U, M) {
            if (M && c && U) {
                var Z = y.x - u.x,
                    S = y.y - u.y;
                Math.abs(Z * U) < Math.abs(S * c) ? (S = Math.sign(S) * Math.abs(Z * U / c), y.y = u.y + S) : (Z = Math.sign(Z) * Math.abs(S * c / U), y.x = u.x + Z)
            }
            return O.Default.unionPoint(y, u)
        }, yf.prototype._unionPointMode2 = function (A, p, e, r, N, R) {
            var b = O.Default.unionPoint(A, p);
            if (N && e && r) {
                var l;
                "v" === R ? (l = b.x + b.width / 2, b.width = e * b.height / r, b.x = l - b.width / 2) : (l = b.y + b.height / 2, b.height = r * b.width / e, b.y = l - b.height / 2)
            }
            return b
        }, yf.prototype._adsorbedToClosest = function (y, O) {
            var H = this,
                V = H._interactor,
                h = V.rectGuide.findClosest(y, O),
                N = V.gridGuide.findClosest(y, O),
                f = 1 / 0,
                A = 1 / 0;
            h && (isFinite(h.x) && (f = h.x), isFinite(h.y) && (A = h.y)), N && (isFinite(N.x) && Math.abs(N.x) < Math.abs(f) && (f = N.x), isFinite(N.y) && Math.abs(N.y) < Math.abs(A) && (A = N.y)), isFinite(f) && (y.x += f), isFinite(A) && (y.y += A)
        }, yf.prototype._42 = function (p, L, O) {
            var U = this;
            U.info = {}, U.screenInfo = null;
            var D = U._interactor;
            if (!D.editDetail && U.gatherInfo(L, O)) {
                var z = U.editing,
                    F = z ? z.groupRotateMode : null,
                    v = U.screenInfo;
                if ("block" !== F) {
                    if (v.P1 ? se.Icons.DrawIcon(D, p, se.Icons.Line, v) : se.Icons.DrawIcon(D, p, se.Icons.Rect, v), v.connect && (se.Icons.DrawIcon(D, p, se.Icons.ConnectGuide, {
                        rotation: v.rotation,
                        connect: v.connect,
                        cursorPos: z ? z.cursorPos : null
                    }), z)) {
                        if (z.targetCorners) {
                            for (var Z = {
                                x: 1 / 0,
                                y: 1 / 0
                            }, l = {
                                x: -1 / 0,
                                y: -1 / 0
                            }, B = 0, G = z.targetCorners.length; G > B; B += 2) Z.x = Math.min(Z.x, z.targetCorners[B]), l.x = Math.max(l.x, z.targetCorners[B]), Z.y = Math.min(Z.y, z.targetCorners[B + 1]), l.y = Math.max(l.y, z.targetCorners[B + 1]);
                            se.Icons.DrawIcon(D, p, se.Icons.HoverDataRect, {
                                min: Z,
                                max: l,
                                color: D.getStyle("hoverGuideColor") || D.getStyle("baseColor")
                            })
                        }
                        z.garbageInfo && se.Icons.DrawIcon(D, p, se.Icons.ConnectGuideGarbage, z.garbageInfo)
                    }
                    U.tipInfo && se.Icons.DrawIcon(D, p, se.Icons.TipHelper, U.tipInfo)
                }
                U.target instanceof se.Group && U.target._42(D, p, L)
            }
        };
        var vb = se.Anchor = function (Y) {
            this.catalog = "Anchor", this._interactor = Y
        };
        vb.prototype = {}, vb.prototype.constructor = vb, vb.prototype.gatherInfo = function (i, q) {
            var d = this;
            if (1 === q.length) {
                var F = q[0];
                if (!F.getAnchor) return;
                if (F instanceof O.Shape && F._70I()) return;
                if (Th(F, i)) return;
                return d.gatherSingleTarget(i, q[0])
            }
            return q.length > 1 ? d.gatherMultiTargets(i, q) : !1
        }, vb.prototype.gatherSingleTarget = function (A, E) {
            var B = this;
            return B.info.POS = E.getPosition(), B.screenInfo.POS = se.toScreenPosition(A, B.info.POS), B.target = E, !0
        }, vb.prototype.gatherMultiTargets = function (b, v) {
            var L = this,
                W = se.Group.findOrCreateGroup(v);
            return W ? (L.screenInfo.POS = se.toScreenPosition(b, W.getAnchor2()), L.target = W, !0) : !1
        }, vb.prototype.isVisible = function () {
            var y = this,
                F = y._interactor;
            if (F.getStyle("anchorVisible") === !1) return !1;
            var i = y.target;
            if (i) {
                if (this.editing) return !0;
                var h = i.getAnchor(),
                    I = F.getStyle("anchorOutsideVisibleThreshold");
                if (h.x < -I || h.x > 1 + I || h.y < -I || h.y > 1 + I) return !0;
                var Z = i.getSize(),
                    u = i.getScale(),
                    X = Math.min(Math.abs(Z.width * u.x), Math.abs(Z.height * u.y));
                if (X * F.gv._zoom < F.getStyle("anchorHideThreshold")) return !1
            }
            return !0
        }, vb.prototype.check = function (H, F, w) {
            if (O.Default.isLeftButton(F)) {
                var p = this,
                    n = p._interactor;
                if (p.isVisible() && n.getStyle("anchorMovable") !== !1) {
                    p.editing = null, p.tipInfo = null;
                    var J = p.target;
                    if (J && H.isAnchorEditable(J) && H.isEditable(J)) {
                        var A;
                        if (p.screenInfo && (A = p.screenInfo.POS) && se.checkHit(w, new se.Math.Vector2(A), n.getStyle("checkSize"))) {
                            if (J instanceof se.Group) return p.editing = {}, !0;
                            var I = J.getWidth(),
                                s = J.getHeight(),
                                c = J.getAnchor();
                            return p.editing = {
                                rect: {
                                    x: -I * c.x,
                                    y: -s * c.y,
                                    width: I,
                                    height: s
                                },
                                anchor: c,
                                matrix: J.getMatrix()
                            }, !0
                        }
                    }
                }
            }
        }, vb.prototype.startEdit = function (H, z) {
            H.startDragging(z), H.fi({
                kind: "beginEditAnchor",
                event: z
            })
        }, vb.prototype._46O = function (F) {
            var X = this;
            X.editing && (X.editing = null, X._interactor.fi({
                kind: "endEditAnchor",
                event: F
            })), X.tipInfo = null
        }, vb.prototype.handleEdit = function (n, U) {
            var k = this,
                N = k.target;
            if (N) {
                var P = k.editing;
                if (P) {
                    var x = n.lp(U),
                        i = k._interactor;
                    if (N instanceof se.Group) return N.setAnchor2(x), i._42(), void 0;
                    var c = P.matrix,
                        K = c.tfi(x),
                        S = P.rect,
                        C = (K.x - S.x) / S.width,
                        I = (K.y - S.y) / S.height;
                    if (!O.Default.isCtrlDown(U)) {
                        var $ = i.getStyle("anchorRound"),
                            y = i.getStyle("anchorSensitivity");
                        C = se.roundTo(C, $, y), I = se.roundTo(I, $, y)
                    }
                    N.setAnchor(C, I, !0);
                    var H = O.Default.getLogicalPoint(U, i._canvas);
                    H.x += se.Icons.TipShiftX, H.y += se.Icons.TipShiftY;
                    var z = "" + C.toFixed(2) + ", " + I.toFixed(2);
                    k.tipInfo = {
                        helperPos: H,
                        text: z,
                        size: z.length
                    }, i.fi({
                        kind: "betweenEditAnchor",
                        event: U
                    })
                }
            }
        }, vb.prototype._42 = function (N, T, C) {
            var P = this;
            P.info = {}, P.screenInfo = {};
            var R = P._interactor;
            R.editDetail || P.gatherInfo(T, C) && P.isVisible() && (se.Icons.DrawIcon(R, N, se.Icons.Anchor, P.screenInfo), P.tipInfo && se.Icons.DrawIcon(R, N, se.Icons.TipHelper, P.tipInfo))
        };
        var Ap = se.MoveDummy = function (S) {
            this.catalog = "MoveDummy", this._interactor = S
        };
        Ap.prototype = {}, Ap.prototype.constructor = Ap, Ap.prototype.gatherInfo = function () {
            var t = this,
                h = this._interactor.getSubModule("Rect");
            if (h) {
                var I = h.screenInfo;
                if (I) {
                    var f = t._interactor,
                        S = t.getMovableTarget(h.target);
                    if (S) {
                        var X = f.getStyle("moveDummyThreshold");
                        if (X !== !1) {
                            var a = I.LT || I.P1,
                                K = I.RT || I.P2,
                                i = I.LB || a;
                            if (a) {
                                var _ = I.P1,
                                    A = Math.min(a.distanceTo(i), a.distanceTo(K));
                                if (!(X !== !0 && A > X)) {
                                    var G = f.getStyle("moveDummyPosition"),
                                        g = K.clone().sub(a),
                                        s = i.clone().sub(a),
                                        V = G[2],
                                        $ = G[3];
                                    if (_) {
                                        var U = f.getStyle("moveDummyLineExtraShift");
                                        U && (V += U[0], $ += U[1])
                                    }
                                    var O = a.clone().add(g.clone().multiplyScalar(G[0])).add(g.setLength(V)).add(s.clone().multiplyScalar(G[1])).add(s.setLength($));
                                    return t.screenInfo.pos = O, t.screenInfo.size = f.getStyle("moveDummySensitivity"), !0
                                }
                            }
                        }
                    }
                }
            }
        }, Ap.prototype.getMovableTarget = function (I) {
            var c = this._interactor.gv;
            if (Fq(I)) {
                if (c.isMovable(I)) return I
            } else if (I instanceof se.Group)
                for (var q = I._entities, U = q.length - 1; U >= 0; U--) {
                    var y = q[U];
                    if (Fq(y) && c.isMovable(y)) return y
                }
            return null
        }, Ap.prototype.getMoveInteractor = function () {
            for (var m, I, N, S = this._interactor.gv, o = S.getInteractors(), m = 0, I = o.length; I > m; m++)
                if (N = o.get(m), N instanceof Wr) return N
        }, Ap.prototype.startEdit = function (Q, n) {
            Q.startDragging(n);
            var d = this.getMoveInteractor();
            if (d) {
                var $ = this.selectedTarget,
                    b = Q.gv;
                b._moving = 1, d._data = $, b.handleMouseDown && b.handleMouseDown(n, $)
            }
        }, Ap.prototype._46O = function (m) {
            var S = this,
                T = S.getMoveInteractor();
            T && (T.handleWindowMouseUp(m), S.selectedTarget = null)
        }, Ap.prototype.handleEdit = function (e, n) {
            var i = this.getMoveInteractor();
            i && i.handleWindowMouseMove(n)
        }, Ap.prototype.check = function (B, P, r) {
            if (this.selectedTarget = null, O.Default.isLeftButton(P) && !B._scrolling && !Cf()) {
                var S = this;
                if (S.screenInfo) {
                    var $ = S.screenInfo.pos;
                    if ($ && !(r.distanceTo($) > S.screenInfo.size)) {
                        var U = S._interactor;
                        return S.selectedTarget = S.getMovableTarget(U.getSubModule("Rect").target), U.setCursor("default"), !0
                    }
                }
            }
        }, Ap.prototype._42 = function (f, t, b) {
            var L = this;
            L.screenInfo = {};
            var Q = L._interactor;
            Q.editDetail || L.gatherInfo(t, b) && (!Q.editing || L.selectedTarget) && se.Icons.DrawIcon(Q, f, se.Icons.MoveDummy, L.screenInfo)
        };
        var ff = se.RotateX = function (l) {
            this.catalog = "RotateX", this._interactor = l
        };
        ff.prototype = {}, ff.prototype.constructor = ff, ff.prototype.gatherInfo = function (c, p) {
            var j = this;
            if (1 === p.length) {
                var m = p[0];
                return m instanceof O.Shape && m._70I() || Th(m, c) ? !1 : j.gatherSingleTarget(c, m)
            }
            return p.length > 1 ? j.gatherMultiTargets(c, p) : !1
        }, ff.prototype.gatherSingleTarget = function () {
            var v = new O.Math.Vector2,
                A = new O.Math.Vector2,
                g = new O.Math.Vector2,
                w = new O.Math.Vector2,
                q = function (n, S) {
                    var L = n.x - S.x,
                        M = n.y - S.y;
                    return L * L + M * M
                };
            return function (K, P) {
                if (P.getCorners) {
                    var y = this,
                        X = P.getCorners(),
                        U = 15,
                        t = P.getPosition();
                    v.copy(X[0]), g.copy(X[1]), w.copy(X[3]), A.copy(v).add(w).divideScalar(2).add(v.sub(g).setLength(U / K.getZoom()));
                    var x = Math.max(q(t, X[0]), q(t, X[1]), q(t, X[2]), q(t, X[3]));
                    return y.info.POS = A.clone(), y.screenInfo.POS = se.toScreenPosition(K, y.info.POS), y.screenInfo.LEN = Math.sqrt(x) * K.getZoom() + U, y.screenInfo.CENTER = se.toScreenPosition(K, t), y.target = P, !0
                }
            }
        }(), ff.prototype.gatherMultiTargets = function (Q, P) {
            var y = this,
                u = se.Group.findOrCreateGroup(P);
            if (!u) return !1;
            var y = this;
            return y.gatherSingleTarget(Q, u)
        }, ff.prototype.isVisible = function () {
            var S = this._interactor;
            if (!S.getStyle("rotateAsClock")) return !1;
            var R = this.target;
            if (!R) return !0;
            var l = S.gv;
            return l.isEditable(R) && l.isRotationEditable(R) ? !0 : !1
        }, ff.prototype.check = function (r, q, c) {
            var j = this,
                E = j._checkImpl(r, q, c);
            return (E || j._clockPainted) && j._interactor._42(), E
        }, ff.prototype._checkImpl = function (l, x, y) {
            if (O.Default.isLeftButton(x)) {
                var V = this;
                V.editing = null, V.tipInfo = null;
                var u;
                if (V.screenInfo && (u = V.screenInfo.POS) && V.isVisible()) {
                    var f = V._interactor;
                    if (se.checkHit(y, u, f.getStyle("checkSize"))) {
                        var p = V.target,
                            e = l.lp(x),
                            o = p.getPosition(),
                            T = Math.atan2(e.y - o.y, e.x - o.x);
                        return f._setRotateCursor(T), V.editing = {
                            pos: o,
                            rotation: p.getRotation(),
                            hitRot: T,
                            groupRotateMode: "block",
                            screenInfo: {
                                CENTER: V.screenInfo.CENTER,
                                LEN: V.screenInfo.LEN
                            }
                        }, !0
                    }
                }
            }
        }, ff.prototype.startEdit = function (m, V) {
            m.startDragging(V), m.fi({
                kind: "beginEditRotation",
                event: V
            }), this.target instanceof se.Group && this.target.beginRotate(this.editing)
        }, ff.prototype._46O = function (I) {
            var G = this;
            G.editing && (G.editing = null, G._interactor.fi({
                kind: "endEditRotation",
                event: I
            })), G.target instanceof se.Group && G.target.endRotate(), G.tipInfo = null
        }, ff.prototype.handleEdit = function (z, e) {
            var L = this,
                b = L.editing;
            if (b) {
                var p, J, y = L.target,
                    f = z.lp(e),
                    r = L._interactor,
                    E = b.pos,
                    d = Math.atan2(f.y - E.y, f.x - E.x),
                    n = y instanceof se.Group;
                if (n ? J = d - b.hitRot : (p = d - b.hitRot, J = b.rotation + p), J %= 2 * Math.PI, 0 > J && (J += 2 * Math.PI), !O.Default.isCtrlDown(e)) {
                    var G, A;
                    Pf(e) ? (G = r.getStyle("shiftRotateRound"), A = G / 2) : (G = r.getStyle("rotateRound"), A = r.getStyle("rotateSensitivity")), J = se.roundTo(J, G, A)
                }
                n ? (p = J - (b.lastRotation || 0), 0 !== p && (y.addRotation(p, b.groupRotateMode, function (O) {
                    return z.isRotationEditable(O)
                }), b.lastRotation = J)) : y.setRotation(J), r._setRotateCursor(d), J > Math.PI && (J -= 2 * Math.PI);
                var u = 180 * (J / Math.PI),
                    X = "" + u.toFixed(2) + "°",
                    i = O.Default.getLogicalPoint(e, r._canvas);
                i.x += se.Icons.TipShiftX, i.y += se.Icons.TipShiftY, L.tipInfo = {
                    helperPos: i,
                    text: X,
                    size: X.length
                }, r.fi({
                    kind: "betweenEditRotation",
                    event: e
                })
            }
        }, ff.prototype._42 = function (A, t, r) {
            var S = this;
            S._clockPainted = !1, S.info = {}, S.screenInfo = {};
            var g = S._interactor;
            g.editDetail || S.gatherInfo(t, r) && S.isVisible() && (se.Icons.DrawIcon(g, A, se.Icons.RoundPoint, S.screenInfo.POS), S.tipInfo && se.Icons.DrawIcon(g, A, se.Icons.TipHelper, S.tipInfo), S.editing && S.drawClock(A))
        }, ff.prototype.drawClock = function (x) {
            x.save();
            var S = this;
            S._clockPainted = !0;
            var R = S.editing || {},
                w = R.screenInfo || S.screenInfo,
                E = w.LEN,
                q = E + 8,
                t = E + 18;
            x.save(), x.translate(w.CENTER.x, w.CENTER.y), x.beginPath(), x.strokeStyle = "rgb(150, 150, 150)";
            for (var e, T, f, y, b, Q = 0; 360 > Q; Q++) e = Q * Math.PI / 180, 0 === Q % 5 && (T = k(e) * E, f = n(e) * E, y = k(e) * q, b = n(e) * q, x.moveTo(T, f), x.lineTo(y, b)), 0 === Q % 45 && (T = k(e) * E, f = n(e) * E, y = k(e) * t, b = n(e) * t, x.moveTo(T, f), x.lineTo(y, b));
            x.stroke(), x.rotate(-N);
            var p = R.lastRotation || S.target.getRotation();
            x.beginPath(), x.fillStyle = "rgba(255, 0, 0, 0.1)", x.strokeStyle = "rgb(157, 157, 157)", x.moveTo(0, 0), x.arc(0, 0, t, 0, p, !1), x.fill(), x.beginPath(), x.moveTo(0 + t, 0), x.arc(0, 0, t, 0, p, !1), x.stroke(), x.restore()
        };
        var Ao = se.Curve = function (U) {
            this.catalog = "Curve", this._interactor = U
        };
        Ao.prototype = {}, Ao.prototype.constructor = Ao, o.defineProperties(Ao.prototype, {
            activing: {
                get: function () {
                    return this._activing
                }, set: function (C) {
                    var b = this;
                    if (C) b._activing = new se.CurveActiving(this, C), b._activing._firePointChange();
                    else {
                        var K = b._activing;
                        K && K.dispose(), b._activing = null
                    }
                }
            }
        }), Ao.PointType = {
            Mirrored: 0,
            Straight: 1,
            Disconnected: 2,
            Asymmetric: 3
        }, Ao.prototype.setUp = function () {
            var g = this,
                y = g._interactor;
            y && y.gv.mp(g._onGraphviewPropertyChanged, g)
        }, Ao.prototype._onGraphviewPropertyChanged = function (P) {
            ("zoom" === P.property || "translateX" === P.property || "translateY" === P.property) && this._handleDataChanged()
        }, Ao.prototype.tearDown = function () {
            var X = this,
                u = X._interactor;
            u && u.gv.ump(X._onGraphviewPropertyChanged, X)
        }, Ao.prototype.canEnterEditDetailMode = function () {
            var z = this,
                e = z._interactor,
                M = e._getValidSelection();
            if (1 === M.length) {
                var w = M[0],
                    L = w instanceof O.Edge;
                if (w instanceof O.Shape || L) {
                    if (L) {
                        var A = w.s("edge.type");
                        if (A && "points" !== A) return
                    }
                    var S = e.gv;
                    if (S.isPointEditable(w) && S.isEditable(w)) return z.target = w, !0
                }
            }
        }, Ao.prototype.canQuitEditDetailMode = function (G) {
            var Q = this,
                y = Q._interactor._getLogicalPoint(G);
            return Q._checkEditRealPoint(y) ? void 0 : Q._interactor.gv.getDataAt(G) !== Q.target ? !0 : void 0
        }, Ao.prototype.preHandleScroll = function () {
            var _ = this.editing;
            return _ && _.inEdit ? !0 : void 0
        }, Ao.prototype.getCurrentSelectintStatus = function () {
            var E = this;
            if (E.activing && !E.activing.selections) {
                if (E.activing.status != Z) return E.activing.status;
                var I = function (V) {
                    var R = E.activing.status;
                    E.activing.status = V, E._interactor.fp("shapePointStatus", R, V)
                },
                    K = se.Curve.PointType,
                    o = E.activing.point,
                    j = E.activing.pairs;
                if (!j || 1 !== j.length) return I(K.Mirrored);
                var b = j[0],
                    z = b.c1 && b.c1.isNearEnough(o),
                    k = b.c2 && b.c2.isNearEnough(o);
                if (!b.c1 || !b.c2) return z || k ? I(K.Straight) : I(K.Disconnected);
                if (z && k) return I(K.Straight);
                if (z || k) return I(K.Asymmetric);
                var D = b.c1.clone().sub(o),
                    w = b.c2.clone().sub(o);
                return Math.abs(D.x * w.y - D.y * w.x) > 1e-5 || D.x * w.x > 0 ? I(K.Disconnected) : Math.abs(D.length() - w.length()) > 1e-5 ? I(K.Asymmetric) : I(K.Mirrored)
            }
        }, Ao.prototype.handle_keydown = function (x) {
            var p = this;
            if (p._interactor.editDetail) {
                var g = se.Curve.PointType;
                "1" === x.key ? p._setCurrentSelectionStatus(g.Straight) : "2" === x.key ? p._setCurrentSelectionStatus(g.Mirrored) : "3" === x.key ? p._setCurrentSelectionStatus(g.Disconnected) : "4" === x.key && p._setCurrentSelectionStatus(g.Asymmetric)
            }
        }, Ao.prototype.setCurrentSelectionStatus = function (F) {
            var h = this,
                z = h._interactor;
            if (z) {
                var Y = z.gv;
                Y.dm().beginTransaction(), this._setCurrentSelectionStatus(F), Y.dm().endTransaction()
            }
        }, Ao.prototype._setCurrentSelectionStatus = function (L) {
            var N = this,
                I = N.activing;
            if (I) {
                var v = N.getCurrentSelectintStatus();
                if (null !== v && v !== L) {
                    I.status = L;
                    var b = N.activing.point,
                        s = N.activing.pairs;
                    if (s && 1 === s.length) {
                        var S = s[0],
                            X = N.screenInfo.curve,
                            H = se.Curve.PointType,
                            Q = N._interactor,
                            r = function () {
                                N._writeToHt(), Q.fp("shapePointStatus", v, L), N.check(Q.gv, null, new se.Math.Vector2(Q._lastLogicalPoint))
                            };
                        if (L === H.Straight) return X.moveCtrlPoint(S, b, "c1"), X.moveCtrlPoint(S, b, "c2"), r(), void 0;
                        if (v === H.Straight) {
                            var $ = X.findPairs(b, !0),
                                c = $[0],
                                C = c.r1 || b,
                                m = c.r2 || b,
                                i = m.clone().sub(C).multiplyScalar(.25);
                            return X.moveCtrlPoint(S, b.clone().sub(i), "c1"), X.moveCtrlPoint(S, b.clone().add(i), "c2"), r(), void 0
                        }
                        var p = S.c1,
                            T = S.c2;
                        if (p && T) {
                            if (L === H.Mirrored) return X.moveCtrlPoint(S, b.clone().multiplyScalar(2).sub(T), "c1"), r(), void 0;
                            if (L === H.Asymmetric && v === H.Disconnected) {
                                var x = p.clone().sub(b).length(),
                                    i = b.clone().sub(T).setLength(x).add(b);
                                return X.moveCtrlPoint(S, i, "c1"), r(), void 0
                            }
                        }
                        I._firePointChange(), Q.fp("shapePointStatus", v, L), N.check(Q.gv, null, new se.Math.Vector2(Q._lastLogicalPoint))
                    }
                }
            }
        }, Ao.prototype._handleDataChanged = function () {
            var g = "s:edge.points,s:edge.segments,points,segments,shape,position,rotation,scale".split(",");
            return function (P) {
                var t = this;
                if (t.screenInfo && t.target) {
                    if (P && g.indexOf(P.property) < 0) return;
                    var O = t._interactor;
                    t.gatherSingleTarget(O.gv, t.target, !0), t.check(O.gv, null, new se.Math.Vector2(O._lastLogicalPoint)), O._42()
                }
            }
        }(), Ao.prototype.gatherSingleTarget = function (h, c, P) {
            var A, N, Q = this;
            Q.screenInfo && Q.screenInfo.curve && (N = Q.screenInfo.curve._curves);
            var W = Q.editing;
            A = W ? Q.screenInfo : Q.screenInfo = {};
            var U, y, C = c instanceof O.Edge;
            C ? (U = c.s("edge.segments"), y = c.s("edge.points") || new O.List) : (U = c._58O, y = c._59O), A.S = U;
            var b, w = A.P = [],
                p = se.getDataMatrix(c);
            if (c instanceof O.Polyline || c instanceof O.Edge && Q._interactor.getStyle("edgeElevationEditable")) b = c.getElevation && c.getElevation() || 0, A.E = [];
            else {
                var G = !1;
                y.each(function (i) {
                    i.e !== Z && (G = !0)
                }), G && (A.E = [])
            } if (y.each(function (n) {
                A.E && A.E.push(n.e != Z ? n.e : b), n = p.apply(n);
                var o = se.toScreenPosition(h, n);
                w.push(o.x, o.y)
            }), C) {
                var K = w.length,
                    x = se.toScreenPosition(h, c._lastSourcePoint || (K ? {
                        x: w[0],
                        y: w[1]
                    } : {
                            x: 0,
                            y: 0
                        })),
                    B = se.toScreenPosition(h, c._lastTargetPoint || (K ? {
                        x: w[K - 2],
                        y: w[K - 1]
                    } : {
                            x: 0,
                            y: 0
                        }));
                w.splice(0, 0, x.x, x.y), w.push(B.x, B.y), A.E && (A.E.splice(0, 0, "head"), A.E.push("tail"))
            }
            if (!A.S || !A.S.size()) {
                A.S = new O.List, A.S.add(1);
                for (var j = 0; j < w.length / 2 - 1; j++) A.S.add(2)
            }
            if ((!W || P) && Q.convertToCubicBezier(N), Q.activing && (P || !Q.editing || "realPoint" === Q.editing.type)) {
                var d = A.curve.findPairs(Q.activing.point);
                Q.activing.pairs = d
            }
        }, Ao.prototype._convertToNewPoint = function (Y, a, J, L) {
            var G, I, H;
            for (G = 0, I = a.length; I > G; G++) {
                if (H = a[G], H._p1.isNearEnough(Y) && (!L || L.indexOf(H._p1) < 0)) return H._p1;
                if (H._p4.isNearEnough(Y) && (!L || L.indexOf(H._p4) < 0)) return H._p4
            }
            if (J)
                for (G = 0, I = Math.min(J.length, I); I > G; G++) {
                    if (H = J[G], H._p1 === Y && (!L || L.indexOf(a[G]._p1) < 0)) return a[G]._p1;
                    if (H._p4 === Y && (!L || L.indexOf(a[G]._p4) < 0)) return a[G]._p4
                }
        }, Ao.prototype.convertToCubicBezier = function (S) {
            var X, M, N = this,
                Z = new se.Math.Curve,
                $ = N.screenInfo;
            if (Z.createFromHtShape($.P, $.S, $.E), $.curve = Z, N.activing) {
                var A = Z._curves;
                X = N.activing.point, M = N._convertToNewPoint(X, A, S);
                var I = [];
                if (M && (N.activing.point = M, I.push(M)), N.activing.selections) {
                    var o = -1,
                        F = N.activing.selections;
                    F.forEach(function (f) {
                        o++, M = N._convertToNewPoint(f, A, S, I), M && (F[o] = M, I.push(M))
                    })
                }
            }
        }, Ao.prototype.check = function (C, o, p) {
            if (!o || jj(o) || Fm(o)) {
                var q = this;
                if (q._interactor.setCursor("default"), q.editing = null, q.highlight = null, q.tipInfo = null, q.edgeEditResult = null, q.screenInfo) {
                    if (Cf() || o && Fm(o)) return q._interactor._42(), !0;
                    if (q._checkEditCtrlPoint(p)) return q._interactor._42(), !0;
                    if (q._checkEditRealPoint(p)) return q._interactor._42(), !0;
                    if (q._checkEditElevation(p)) return q._interactor._42(), !0;
                    var Z = q.screenInfo.curve,
                        h = Z.checkPoint(p, q._interactor.getStyle("curveIntersectSize"));
                    if (h) {
                        var y = q.highlight = {};
                        y.type = "insertKnot", y.bezier = h.bezier, y.point = h.intersection
                    }
                    return q._interactor._42(), !0
                }
            }
        }, Ao.prototype.getAdjacentBeziers = function (z) {
            var G = this.screenInfo;
            if (G) {
                var D, T, W, N = G.curve._curves,
                    d = [],
                    C = Z;
                for (D = 0, T = N.length; T > D; D++)
                    if (W = N[D], C === Z) {
                        if (W._p4.isNearEnough(z)) {
                            d.push(W), C = D;
                            continue
                        }
                    } else {
                        if (W._p1.isNearEnough(z)) return d.push(W), d;
                        if (W._p4.isNearEnough(z)) {
                            d[0] = W, C = D;
                            continue
                        }
                    }
            }
        }, Ao.prototype.roundCorner = function (i) {
            if (this.activing && this.screenInfo) {
                var o = this.screenInfo.curve,
                    X = o._curves,
                    G = this.getAdjacentBeziers(this.activing.point),
                    j = G[1],
                    m = j._index;
                j = j.insertKnot(j.getTByPercentage(i / j.length))[1], X[m] = j;
                var U = j.p1,
                    H = G[0],
                    d = H._index;
                H = H.insertKnot(H.getTByPercentage(1 - i / H.length))[0], X[d] = H;
                var Q = H.p4,
                    h = this.activing.point,
                    v = new se.Math.CubicBezier(Q, h.clone().sub(Q).multiplyScalar(2 / 3).add(Q), h.clone().sub(U).multiplyScalar(2 / 3).add(U), U);
                X.splice(m, 0, v), this._writeToHt(), this.activing = null, this._interactor._42()
            }
        }, Ao.prototype._checkEditRealPoint = function (f) {
            var F, W, J, G, $, j, D = this,
                h = D.screenInfo.curve._curves,
                N = D._interactor.getStyle("curvePointIntersectSize"),
                U = 1 / 0;
            for (N *= N, J = 0, G = h.length; G > J; J++) F = h[J], $ = F._p1, j = f.distanceToSquared($), U > j && (U = j, W = $), $ = F._p4, j = f.distanceToSquared($), U > j && (U = j, W = $);
            if (U > N) return !1;
            var y = D.highlight = {};
            return y.type = "changeRealPoint", y.point = W, D.editing = {
                type: "realPoint",
                point: W,
                shiftGuide: {
                    point: W.clone(),
                    dir: "x",
                    limit: 0
                }
            }, D._interactor.setCursor("crosshair"), !0
        }, Ao.prototype._checkEditElevation = function (Z) {
            var R = this;
            if (!R._interactor.getStyle("curveElevationVisible")) return !1;
            var w = R.target;
            if (w instanceof O.Edge && !R._interactor.getStyle("edgeElevationEditable")) return !1;
            var N = R.activing;
            if (!N) return !1;
            var y = N.getCurrentEditingPoint();
            if (!y) return !1;
            var K = R._interactor,
                S = K.getStyle("curveElevationGuideShift"),
                q = K.getStyle("curveElevationIntersectSize"),
                b = Z.distanceToSquared({
                    x: y.x + S[0],
                    y: y.y + S[1]
                });
            if (!(b > q * q)) {
                var P = R.highlight = {};
                P.type = "elevation";
                var G = new se.Math.Vector2(Z.x, Z.y, y.e);
                return R.editing = {
                    type: "elevation",
                    startPoint: G
                }, R._interactor.setCursor("crosshair"), !0
            }
        }, Ao.prototype._checkEditCtrlPoint = function (l) {
            var y = this;
            if (y.activing && !y.activing.selections) {
                var T = y.getCurrentSelectintStatus();
                if (T !== se.Curve.PointType.Straight) {
                    var M = y.activing.pairs;
                    if (M) {
                        var w = y._interactor.getStyle("curvePointIntersectSize");
                        w *= w;
                        var B, n, m, k, O, U, t, v, p, $ = 1 / 0;
                        for (t = 0, p = M.length; p > t; t++)
                            for (k = M[t], v = 0; 2 > v; v++) O = 0 === v ? "c1" : "c2", k[O] && (U = l.distanceToSquared(k[O]), $ > U && ($ = U, B = k, n = t, m = O));
                        if ($ > w) return !1;
                        y.activing.hlpair = B, y.activing.hltype = m;
                        var P = y.highlight = {};
                        return P.type = "changeCtrlPoint", P.point = B[m], y.editing = {
                            type: "ctrlPoint",
                            pair: B,
                            pairId: n,
                            ctrlType: m,
                            direction: B[m].clone().sub(y.activing.point).normalize()
                        }, y._interactor.setCursor("crosshair"), !0
                    }
                }
            }
        }, Ao.prototype.startEdit = function (G, V) {
            G.startDragging(V);
            var U = this;
            U.highlight && "insertKnot" === U.highlight.type && (U.insertKnot(), U.gatherSingleTarget(U._interactor.gv, U.target), U.activing = null, U._checkEditRealPoint(U._interactor._getLogicalPoint(V)));
            var Y = U._activing;
            if (Y) {
                var I = U.editing ? U.editing.type : null;
                "ctrlPoint" === I ? Y.editingCtrl = {
                    pairId: U.editing.pairId,
                    type: Y.hltype
                } : "realPoint" === I && (Y.editingCtrl = !1)
            }
            var m = U.highlight,
                l = O.Default.isCtrlDown(V);
            if (!m || Cf() || Fm(V)) {
                var d = U._interactor.gv;
                if (!d.setFocus(V) || d._scrolling) return;
                return l ? U._multiSelect = {
                    startPoint: d.lp(V)
                } : d.isPannable() && (jj(V) || Fm(V)) && (U._pan = {
                    tx: d.tx(),
                    ty: d.ty()
                }, G.fi({
                    kind: "beginPan",
                    event: V
                })), void 0
            }
            if ("changeRealPoint" === m.type) {
                var u, X = U.activing ? U.activing.point : null,
                    S = U.activing ? U.activing.selections : null;
                if (l && U.activing) X === m.point ? (S ? (U.activing = {
                    point: S[0]
                }, S.length > 1 && (S.splice(0, 1), U.activing.selections = S)) : U.activing = null, U.editing = null) : S && (u = S.indexOf(m.point)) >= 0 ? (S.length > 1 ? S.splice(u, 1) : delete U.activing.selections, U.editing = null) : S ? (S.push(X), U.activing = {
                    point: m.point,
                    selections: S
                }) : U.activing = {
                    point: m.point,
                    selections: [X]
                };
                else if (S) X === m.point || ((u = S.indexOf(m.point)) >= 0 ? (S.splice(u, 1, X), U.activing = {
                    point: m.point,
                    selections: S
                }) : U.activing = {
                    point: m.point
                });
                else {
                    var e;
                    X === m.point && (e = U.activing.status), U.activing = {
                        point: m.point
                    }, e && (U.activing.status = e)
                }
                G.fi({
                    kind: "beginEditPoint",
                    event: V
                })
            }
        }, Ao.prototype.insertKnot = function () {
            var e = this,
                L = e.highlight,
                x = e.screenInfo.curve;
            x.insertKnot(L.bezier, L.point.t), e._writeToHt()
        }, Ao.prototype._writeToHt = function () {
            var D, w, m = this,
                x = m.screenInfo.curve,
                c = x.toHtShape(),
                r = c.points,
                f = [],
                a = c.segments,
                E = m._interactor.gv;
            E.dm().beginTransaction();
            var T, H, q = m.target,
                R = q instanceof O.Edge,
                y = se.getDataMatrix(q).invert();
            H = q instanceof O.Polyline || q instanceof O.Edge && m._interactor.getStyle("edgeElevationEditable"), H && (T = q.getElevation && q.getElevation() || 0);
            for (var s = 0, Q = r.length; Q > s; s++) D = r[s], w = se.toWorldPosition(E, D), w = y.apply(w), isFinite(D.e) && D.e !== T && (w.e = D.e), f.push(w);
            if (q._writing = !0, R) {
                q.s("edge.type", "points"), q.setStyle("edge.segments", a), q.setStyle("edge.points", f.slice(1, f.length - 1)), q.setStyle("edge.source.offset.x", 0), q.setStyle("edge.source.offset.y", 0), q.setStyle("edge.target.offset.x", 0), q.setStyle("edge.target.offset.y", 0);
                var U = m._nextChangeEdgeHost;
                delete m._nextChangeEdgeHost, U && ("source" === U.type ? q.setSource(U.host) : q.setTarget(U.host)), m._writeEdgeHostAnchor("source", f[0]), m._writeEdgeHostAnchor("target", f[f.length - 1])
            } else f.length ? (q.setSegments(a), q.setPoints(f, !0)) : q.removeFromDataModel();
            E.dm().endTransaction(), delete q._writing
        }, Ao.prototype._writeEdgeHostAnchor = function (s, C) {
            var J = this,
                R = J.target,
                E = J._calcHostAnchor(R, s, C);
            E.index !== Z ? (R.setStyle("edge." + s + ".index", E.index), R.setStyle("edge." + s + ".percent", Z), R.setStyle("edge." + s + ".anchor.x", Z), R.setStyle("edge." + s + ".anchor.y", Z)) : E.percent !== Z ? (R.setStyle("edge." + s + ".percent", E.percent), R.setStyle("edge." + s + ".index", Z), R.setStyle("edge." + s + ".anchor.x", Z), R.setStyle("edge." + s + ".anchor.y", Z)) : (R.s("edge." + s + ".anchor.x", E.x), R.s("edge." + s + ".anchor.y", E.y), E.offsetX || E.offsetY ? (R.s("edge." + s + ".offset.x", E.offsetX), R.s("edge." + s + ".offset.y", E.offsetY)) : (R.s("edge." + s + ".offset.x", 0), R.s("edge." + s + ".offset.y", 0)))
        }, Ao.prototype._calcHostAnchor = function (R, o, s, h) {
            h || (h = "source" === o ? R.getSource() : R.getTarget());
            var Q = this._interactor.gv,
                U = Q.calculateAttachPoint(h, s);
            if (U) return U.info;
            if (Bk(h)) {
                var b = Q.calculateEdgePosition(h, s);
                return b
            }
            var J = h.getRotation(),
                u = h.getAnchor();
            Th(h, Q) && (J = 0);
            var _ = h.getScale();
            if (J || _.x < 0 || _.y < 0) {
                var W = h.getMatrix(),
                    T = W.tfi(s),
                    l = h.getSize();
                return {
                    x: T.x / l.width + u.x,
                    y: T.y / l.height + u.y
                }
            }
            var f = Rp(Q, h),
                m = {
                    x: (s.x - f.x) / f.width,
                    y: (s.y - f.y) / f.height
                };
            return m
        }, Ao.prototype._handlePanning = function (Q) {
            var Z = this,
                s = Z._pan;
            if (s) {
                s.started = !0;
                var U = Z._interactor,
                    H = U.gv,
                    b = U._lastClientPoint,
                    h = lb(Q),
                    J = wq(H, h, b);
                H.setTranslate(s.tx + J.x, s.ty + J.y), Z.gatherSingleTarget(U.gv, Z.target), U._42(), U.fi({
                    kind: "betweenPan",
                    event: Q
                })
            }
        }, Ao.prototype.handleEdit = function (c, t) {
            var z = this,
                m = z.editing;
            if (z._pan) return z._handlePanning(t), void 0;
            if (z._multiSelect) return z._multiSelect.endPoint = c.lp(t), z._interactor.redraw(), void 0;
            if (m) {
                m.inEdit = !0;
                var K, y, b, N = z._interactor._getLogicalPoint(t),
                    H = O.Default.isCtrlDown(t),
                    j = O.Default.isShiftDown(t),
                    Q = m.type,
                    k = z.activing;
                if (z._guideInfo = null, "ctrlPoint" === Q && j) {
                    var A = z.editing.direction.clone();
                    K = k.point;
                    var R = A.dot(N.clone().sub(K));
                    N = A.setLength(R).add(K)
                } else if ("ctrlPoint" === Q || "realPoint" === Q) {
                    var A;
                    if ("realPoint" === Q && j) {
                        var V = z.editing.shiftGuide;
                        y = V.point;
                        var F = Math.abs(N.x - y.x),
                            o = Math.abs(N.y - y.y);
                        F > o && F > V.limit && "y" === V.dir && (V.dir = "x"), o > F && o > V.limit && "x" === V.dir && (V.dir = "y"), A = V.dir, "x" === A ? (N.y = y.y, V.limit = Math.max(V.limit, F)) : "y" === A && (N.x = y.x, V.limit = Math.max(V.limit, o))
                    }
                    var Y = z._isEditEdgeSourceTarget();
                    if (Y) {
                        var _ = z._editEdgeSourceTarget(Y, N, H);
                        _ && (z.edgeEditResult = _, b = _.tipText)
                    } else if (!H) {
                        var w = z._guidingToEdit(N, A),
                            G = "realPoint" === Q ? z._interactor.gridGuide.findClosest(N, A, !0) : null,
                            g = 1 / 0,
                            $ = 1 / 0;
                        G && (G.x && (g = G.x), G.y && ($ = G.y));
                        var P = !1;
                        w && (w.xList && (Math.abs(w.x) <= Math.abs(g) ? (P = !0, g = w.x) : delete w.xList), w.yList && (Math.abs(w.y) <= Math.abs($) ? (P = !0, $ = w.y) : delete w.yList), P && (z._guideInfo = w)), isFinite(g) && (N.x += g), isFinite($) && (N.y += $), P && (w.v = N)
                    }
                }
                var i = z.screenInfo.curve;
                if ("realPoint" === m.type) {
                    K = m.point, K.e !== Z && (N.e = K.e), i.moveRealPoint(K, N), m.point = N, z.highlight.point = N;
                    var D = k.status,
                        x = k.selections;
                    if (z.activing = {
                        point: N,
                        status: D
                    }, x) {
                        var q = N.clone().sub(K),
                            T = 0;
                        x.forEach(function (p) {
                            var o = p.clone().add(q);
                            i.moveRealPoint(p, o), x[T++] = o
                        }), z.activing.selections = x
                    }
                } else if ("ctrlPoint" === m.type) {
                    var d = k.pairs,
                        J = d[m.pairId];
                    i.moveCtrlPoint(J, N, m.ctrlType);
                    var e = k.status,
                        l = se.Curve.PointType;
                    if ((e === l.Mirrored || e === l.Asymmetric) && J.c1 && J.c2) {
                        var K = new se.Math.Vector2(k.point),
                            L = "c1" === m.ctrlType ? "c2" : "c1";
                        if (e === se.Curve.PointType.Mirrored) i.moveCtrlPoint(J, K.clone().multiplyScalar(2).sub(N), L);
                        else if (e === l.Asymmetric) {
                            var R = J[L].clone().sub(K).length(),
                                v = K.clone().sub(J[m.ctrlType]).setLength(R).add(K);
                            isNaN(v.x) || i.moveCtrlPoint(J, v, L)
                        }
                    }
                    k._firePointChange()
                } else if ("elevation" === m.type) {
                    y = m.startPoint;
                    var U = y.e + (y.y - N.y) / c._zoom;
                    z._setCurrentPointImpl("e", U), k._firePointChange(), b = "E: " + se.toFixed(U)
                }
                var f = O.Default.getLogicalPoint(t, z._interactor._canvas);
                if (f.x += se.Icons.TipShiftX, f.y += se.Icons.TipShiftY, !b) {
                    var E = se.toWorldPosition(c, N);
                    b = "" + se.toFixed(E.x) + ", " + se.toFixed(E.y)
                }
                z.tipInfo = {
                    helperPos: f,
                    text: b,
                    size: b.length
                }, z._writeToHt(), z._interactor.fi({
                    kind: "betweenEditPoint",
                    event: t
                })
            }
        }, Ao.prototype._setCurrentPointImpl = function (i, j) {
            var E = this,
                p = E._activing;
            if (!p) return !1;
            var t = E.target;
            if (!t) return !1;
            var U = p.getCurrentEditingPoint();
            if (!U) return !1;
            var f = p.editingCtrl;
            if (!f) var x = U.clone();
            if ("e" === i) U.e = j;
            else {
                var N;
                if ("x" === i || "y" === i) {
                    var X = p._lastFirePoint;
                    N = "x" === i ? {
                        x: j,
                        y: X ? X.y : 0
                    } : {
                            x: X ? X.x : 0,
                            y: j
                        }
                } else "object" == typeof i ? (N = i, i.e !== Z && (U.e = i.e)) : (N = {
                    x: arguments[0],
                    y: arguments[1]
                }, arguments[2] !== Z && (U.e = arguments[2]));
                var T = se.getDataMatrix(t);
                N = se.toScreenPosition(E._interactor.gv, T.apply(N)), U.x = N.x, U.y = N.y
            } if (!f) {
                var K = x.multiplyScalar(-1).add(U);
                U.e && x.e && (K.e = U.e - x.e);
                var C = E.screenInfo.curve;
                C.moveCtrlDueToRealPointMovement(U, K);
                var J = p.selections;
                if (J) {
                    var u = 0;
                    J.forEach(function (D) {
                        var B = D.clone().add(K);
                        isFinite(K.e) && (B.e = (isFinite(D.e) ? D.e : t.getElevation() || 0) + K.e), C.moveRealPoint(D, B), J[u++] = B
                    }), p.selections = J
                }
            }
            return !0
        }, Ao.prototype.setCurrentPoint = function (Q, c) {
            return this._setCurrentPointImpl(Q, c) ? (this._writeToHt(), !0) : !1
        }, Ao.prototype._isEditEdgeSourceTarget = function () {
            var B = this,
                W = B.target;
            if (!(W instanceof O.Edge)) return !1;
            var r = B.editing.point,
                m = B.screenInfo.curve._curves;
            return r === m[0]._p1 ? "source" : r === m[m.length - 1]._p4 ? "target" : !1
        }, Ao.prototype._editEdgeSourceTarget = function (O, K, T) {
            var p, t = this,
                v = t.target;
            if (p = "source" === O ? v.getSource() : v.getTarget()) {
                var C, R = t._interactor.gv,
                    P = se.toWorldPosition(R, K),
                    n = t._calcHostAnchor(v, O, P, p);
                if (C = n.index !== Z || n.percent !== Z ? n.distance * R.getZoom() > t._interactor.getStyle("edgeHostEdgeMaxDistance") : t._interactor.getStyle("edgeHostDetectPerFrame") ? !0 : n.x < 0 || n.x > 1 || n.y < 0 || n.y > 1 ? !0 : !1) {
                    var d = R.getDataAt(P, function (o) {
                        return R.isSelectable(o) ? R.isSourceTargetEditable(v, o, O) ? v.canSetSourceTarget(o, O) ? !0 : !1 : !1 : !1
                    });
                    if (d) {
                        var Q = t._calcHostAnchor(v, O, P, d);
                        p = d, t._nextChangeEdgeHost = {
                            type: O,
                            host: d
                        }, n = Q
                    }
                }
                var W, h, B;
                if (T || n.x === Z) (n.percent !== Z || n.index !== Z) && (h = n.point);
                else {
                    var b = t._interactor.getStyle("anchorRound"),
                        E = t._interactor.getStyle("anchorSensitivity");
                    W = R.calculateAttachPoint(p, P), W ? n = W.info : (n.x = se.roundTo(n.x, b, E), n.y = se.roundTo(n.y, b, E)), h = Yg(R, p, 0, n.offsetX || 0, n.offsetY || 0, n.x, n.y)
                }
                h && (B = se.toScreenPosition(R, h), K.x = B.x, K.y = B.y), t._edgeHostGuideInfo = {
                    corners: se.getTargetCornersOnScreen(R, p),
                    attach: W ? W.index : -1,
                    host: p
                };
                var M;
                return n.percent !== Z ? M = "percent: " + n.percent.toFixed(2) : n.index !== Z ? M = "index: " + n.index : (M = "" + n.x.toFixed(2) + ", " + n.y.toFixed(2), (n.offsetX || n.offsetY) && (M += " offset: " + n.offsetX.toFixed(2) + ", " + n.offsetY.toFixed(2))), {
                    host: p,
                    anchor: n,
                    tipText: M
                }
            }
        }, Ao.prototype._guidingToEdit = function (h, T) {
            var L, u, X = this;
            if (L = X.screenInfo.curve) {
                u = L._curves;
                var j, Y, m, e, t, C, f, q, R = 1 / 0,
                    l = 1 / 0,
                    H = [];
                for (X.editing && "realPoint" === X.editing.type && (q = X.editing.point), t = 0, C = 2 * u.length; C > t; t++) f = u[Math.floor(t / 2)][t % 2 ? "_p4" : "_p1"], H.indexOf(f) >= 0 || (H.push(f), q && q === f || (m = f.x - h.x, e = f.y - h.y, Math.abs(m) < Math.abs(R) ? (R = m, j = [f]) : m === R && j.push(f), Math.abs(e) < Math.abs(l) ? (l = e, Y = [f]) : e === l && Y.push(f)));
                var G = X._interactor.getStyle("smartGuideThreshold");
                if ((Math.abs(R) > G || "y" === T) && (j = null), (Math.abs(l) > G || "x" === T) && (Y = null), j || Y) {
                    var c = !1,
                        E = {};
                    if (j && (c = !0, E.xList = j, E.x = R), Y && (c = !0, E.yList = Y, E.y = l), c) return E
                }
            }
        }, Ao.prototype._46O = function (v) {
            var c = this;
            c.editing && (c.editing = null, c._interactor.fi({
                kind: "endEditPoint",
                event: v
            })), c._guideInfo = null, c._edgeHostGuideInfo = null, c._pan && (c._pan = null, c._interactor.fi({
                kind: "endPan",
                event: v
            })), c._multiSelect && (c._handleMultiSelect(c._multiSelect), c._multiSelect = null), c.tipInfo = null, c.edgeEditResult = null
        }, Ao.prototype._handleMultiSelect = function (N) {
            if (N.startPoint && N.endPoint) {
                var S, v, T, p, n, m = this,
                    Q = m._interactor,
                    B = Q.gv,
                    _ = se.toScreenPosition(B, N.startPoint),
                    g = se.toScreenPosition(B, N.endPoint),
                    R = O.Default.unionPoint(_, g),
                    G = m.screenInfo.curve._curves,
                    P = [],
                    s = function (k) {
                        k.x >= R.x && k.y >= R.y && k.x <= R.x + R.width && k.y <= R.y + R.height && P.indexOf(k) < 0 && P.push(k)
                    };
                for (S = 0, v = G.length; v > S; S++) n = G[S], s(n._p1), s(n._p4);
                if (P.length) {
                    var J = m.activing || {},
                        d = J.selections || [];
                    for (J.point && d.push(J.point), S = 0, v = d.length; v > S; S++) T = d[S], p = P.indexOf(T), p >= 0 ? P[p] = Z : P.push(T);
                    var c = P;
                    for (P = [], S = 0, v = c.length; v > S; S++) c[S] && P.push(c[S]);
                    v = P.length, 0 === v ? m.activing = null : 1 === v ? m.activing = {
                        point: P[0]
                    } : (T = P[v - 1], m.activing = {
                        point: T,
                        selections: P.splice(0, v - 1)
                    }), Q.redraw()
                }
            }
        }, Ao.prototype._canDeletePoint = function (c, g) {
            var Z = this.target;
            if (!(Z instanceof O.Edge)) return !0;
            var L = c._curves[0],
                o = c._curves[c._curves.length - 1];
            return L._p1 === g || o._p4 === g ? !1 : !0
        }, Ao.prototype.handleDelete = function () {
            var F = this;
            if (F.activing && F.screenInfo) {
                var c = O.Default.isShiftDown(),
                    o = F.screenInfo.curve;
                F._canDeletePoint(o, F.activing.point) && o.deleteRealPoint(F.activing.point, c), F.activing.selections && F.activing.selections.forEach(function (u) {
                    F._canDeletePoint(o, u) && o.deleteRealPoint(u, c)
                }), F.activing = null, delete F.editing, delete F.tipInfo, delete F.edgeEditResult, delete F._pan, delete F._multiSelect, F._writeToHt(), F._interactor.fp("deleteShapePoint", !1, !0)
            }
        }, Ao.prototype.handleDoubleClick = function (T) {
            var O = this,
                P = O._interactor._getLogicalPoint(T);
            if (O.screenInfo && O._checkEditRealPoint(P)) {
                var k = O.getCurrentSelectintStatus(),
                    Z = se.Curve.PointType;
                return k = k === Z.Mirrored ? Z.Straight : Z.Mirrored, O._setCurrentSelectionStatus(k), O._interactor._42(), !0
            }
        }, Ao.prototype._drawHighlight = function (d) {
            var s = this,
                x = s.highlight;
            if (x) {
                var o = x.bezier,
                    L = s._interactor;
                o && se.Icons.DrawIcon(L, d, se.Icons.ShapeHighlightCurve, [o._p1.x, o._p1.y, o._p2.x, o._p2.y, o._p3.x, o._p3.y, o._p4.x, o._p4.y]);
                var b = x.point;
                b && "insertKnot" === x.type && se.Icons.DrawIcon(L, d, se.Icons.ShapeHighlighPoint, b)
            }
        }, Ao.prototype._drawGuide = function (V) {
            var K = this,
                H = K._guideInfo;
            if (H) {
                var l, y, G, i, c = H.v;
                for (l = 0; 2 > l; l++)
                    if (i = 0 === l ? H.xList : H.yList)
                        for (y = 0, G = i.length; G > y; y++) se.Icons.DrawIcon(K._interactor, V, se.Icons.ShapeGuideLine, [c.x, c.y, i[y].x, i[y].y])
            }
        }, Ao.prototype._drawCurrentPoint = function (M) {
            var q = this;
            if (q.activing) {
                var C = q.activing,
                    s = q.getCurrentSelectintStatus(),
                    K = q._interactor;
                if (s !== se.Curve.PointType.Straight) {
                    var Z = C.pairs;
                    C.hlpair, C.hltype;
                    var p = C.selections,
                        F = C.editingCtrl;
                    if (Z && !p) {
                        var E, u, S;
                        for (u = 0, S = Z.length; S > u; u++) E = Z[u], F && u === F.pairId && E[F.type] ? se.Icons.DrawIcon(K, M, se.Icons.ShapeActivingCtrl, {
                            point: E.point,
                            c1: E.c1,
                            c2: E.c2,
                            hl: F.type
                        }) : se.Icons.DrawIcon(K, M, se.Icons.ShapeActivingCtrl, E)
                    }
                }
                se.Icons.DrawIcon(K, M, se.Icons.ShapeHighlighRealPoint, q.activing.point), p && p.forEach(function (S) {
                    se.Icons.DrawIcon(K, M, se.Icons.ShapeHighlighRealPoint, S)
                })
            }
        }, Ao.prototype.clear = function () {
            var d = this;
            d.editing = null, d._guideInfo = null, d.activing = null, d.highlight = null
        }, Ao.prototype._42 = function (C) {
            var j = this;
            j.info = {}, j.editing || (j.screenInfo = null);
            var R = j._interactor;
            if (!R.editDetail) return j.clear(), void 0;
            var t = R.gv;
            if (!j.target || !t.isSelected(j.target) || !t.isVisible(j.target)) return R.editDetail = !1, j.clear(), void 0;
            if (j.gatherSingleTarget(t, j.target), se.Icons.DrawIcon(R, C, se.Icons.ShapeBgCurve, j.screenInfo), j._interactor.getStyle("curveElevationVisible") && (j.target instanceof O.Polyline || j.target instanceof O.Edge && j._interactor.getStyle("edgeElevationEditable")) && j.activing) {
                var M = j.activing.getCurrentEditingPoint();
                M && "string" != typeof M.e && se.Icons.DrawIcon(R, C, se.Icons.EdgeElevationGuide, M)
            }
            if (j._drawHighlight(C), j._drawCurrentPoint(C), j._getRealPoint().forEach(function (Q) {
                se.Icons.DrawIcon(R, C, se.Icons.ShapePoint, Q)
            }), j._drawGuide(C), j.tipInfo && j._interactor.getStyle("curveTipVisible") && se.Icons.DrawIcon(R, C, se.Icons.TipHelper, j.tipInfo), j._edgeHostGuideInfo && R._drawHostGuide(j._edgeHostGuideInfo), j.edgeEditResult && j._drawEdgeHostHighlight(C, j.edgeEditResult.host, j.edgeEditResult.anchor), j._multiSelect && j._multiSelect.endPoint) {
                var s = O.Default.unionPoint(se.toScreenPosition(t, j._multiSelect.startPoint), se.toScreenPosition(t, j._multiSelect.endPoint));
                s.color = t.getRectSelectBorderColor(), C.save(), C.setTransform(1, 0, 0, 1, 0, 0);
                var L = x.devicePixelRatio,
                    p = s.borderWidth = Math.round(L);
                p /= 2, s.x = Math.round(s.x * L) + p, s.y = Math.round(s.y * L) + p, s.width = Math.round(s.width * L), s.height = Math.round(s.height * L), se.Icons.DrawIcon(R, C, se.Icons.SimpleRect, s), C.restore()
            }
        }, Ao.prototype._drawEdgeHostHighlight = function (D, j, $) {
            this.drawEdgeHostHighlight(D, j, $), this._interactor.redraw()
        }, Ao.prototype.drawEdgeHostHighlight = function (m, V, K) {
            if (Bk(V)) {
                var u, O, $, R, A = this,
                    k = A._interactor,
                    b = k.gv,
                    D = b.getDataUI(V),
                    C = gl(D),
                    E = [];
                for ($ = 0, R = C.points.length; R > $; $++) O = se.toScreenPosition(b, C.points.get($)), E.push(O.x, O.y);
                C.segments && (u = C.segments.toArray());
                var l = k.getStyle("edgeHostHighlighPeriod"),
                    N = k.getStyle("edgeHostEdgeHighlighColor");
                se.Icons.DrawIcon(k, m, se.Icons.ShapeBgCurve, {
                    P: E,
                    S: u,
                    color: N,
                    dynamicVisible: K.index === Z,
                    dynamicPeriod: l
                }), N = k.getStyle("edgeHostPointHighlighColor");
                var e = Kk(D);
                for ($ = 0, R = e.length; R > $; $++) {
                    var c = e[$],
                        y = se.toScreenPosition(b, c);
                    se.Icons.DrawIcon(k, m, se.Icons.ShapePoint, {
                        point: {
                            x: y.x,
                            y: y.y
                        },
                        color: N,
                        size: 12,
                        dynamicVisible: $ === K.index,
                        dynamicPeriod: l
                    })
                }
            }
        }, Ao.prototype._getRealPoint = function () {
            var p, n = this.screenInfo,
                z = n.P,
                _ = n.S,
                T = -1,
                L = [],
                Z = -1,
                D = _.length;
            return _.each(function (C) {
                Z++;
                var G = 1;
                if (3 === C) G = 2;
                else if (4 === C) G = 3;
                else if (5 === C) return;
                T += G, p = Z + 1 >= D ? !0 : 1 === _.get(Z + 1) ? !0 : !1, L.push({
                    point: {
                        x: z[2 * T],
                        y: z[2 * T + 1]
                    },
                    segmentIndex: Z,
                    pointIndex: T,
                    isEnd: p
                })
            }), L
        }, Ao.prototype.getEditingPointsInfo = function (V) {
            var e = this,
                b = e.activing;
            if (!b) return !1;
            var v = b.point;
            if (!v) return !1;
            var j = this._getRealPoint(),
                z = [{
                    screen: v
                }];
            b.selections && b.selections.forEach(function (s) {
                z.push({
                    screen: s
                })
            });
            var c, s, y = j.length;
            return z.forEach(function (R) {
                for (c = 0; y > c; c++)
                    if (s = j[c], R.screen.isNearEnough(s.point)) {
                        R.segmentIndex = s.segmentIndex, R.pointIndex = s.pointIndex, R.point = e.target.getPoints().get(s.pointIndex);
                        break
                    }
            }), V && z.sort(function (O, o) {
                return O.segmentIndex - o.segmentIndex
            }), z
        };
        var If = se.MoveHelper = function (W) {
            var x = this;
            x.catalog = "Move", x._interactor = W
        };
        If.prototype = {}, If.prototype.constructor = If, If.prototype.calcShift = function (e, n, m) {
            var T, E, w = this,
                r = w._interactor.gv,
                c = r.lp(n);
            if ("beginMove" === e && w._gatherGridInfo(m._lastLogicalPoint || c), T = w._target) {
                var N = T.downPosition;
                if (N) {
                    var K = w._interactor.getStyle("moveSensitivity") / r._zoom;
                    if (N.distanceTo(c) < K) return {
                        x: 0,
                        y: 0
                    };
                    delete T.downPosition
                }
                var S;
                E = O.Default.isShiftDown(n), E && (c = w._dealShiftDown(c), S = T.shiftGuide.dir);
                var o, Z = T.rawPos = {
                    x: T.pos.x + c.x - T.lp.x,
                    y: T.pos.y + c.y - T.lp.y
                };
                if (O.Default.isCtrlDown(n)) {
                    if (o = w._calcShiftByAddon(), w._target.node instanceof se.Group) {
                        var k = w._target.node;
                        k._position.x += o.x, k._position.y += o.y
                    }
                    return o
                }
                var d = w._interactor.rectGuide;
                if (T.node instanceof O.Data && T.node.s("2d.attachable")) {
                    var H = w._calcAttachNodeShift(T.node, Z);
                    if (d.clear(), H) return H
                }
                for (var s, v = T.x + Z.x, I = T.y + Z.y, z = {
                    x: v,
                    y: I
                }, U = {
                    x: v + T.w / 2,
                    y: I + T.h / 2
                }, Y = {
                    x: v + T.w,
                    y: I + T.h
                }, i = w._interactor.gridGuide, R = [d.findClosest(z, S), d.findClosest(U, S), d.findClosest(Y, S), i.findClosest(z, S), i.findClosest(U, S), i.findClosest(Y, S)], L = 1 / 0, $ = 1 / 0, l = 0, _ = R.length; _ > l; l++) s = R[l], s && (v = s.x, I = s.y, isFinite(v) && Math.abs(v) < Math.abs(L) && (L = v), isFinite(I) && Math.abs(I) < Math.abs($) && ($ = I));
                if (isFinite(L) || (L = 0), isFinite($) || ($ = 0), o = w._calcShiftByAddon(L, $), w._target.node instanceof se.Group) {
                    var k = w._target.node;
                    k._position.x += o.x, k._position.y += o.y
                }
                var Q = T.node;
                if (!Th(Q, r)) {
                    var h = Z.x + L,
                        x = Z.y + $;
                    w._interactor.rectGuide.gatherLines({
                        node: Q,
                        x: T.x + h,
                        y: T.y + x,
                        w: T.w,
                        h: T.h
                    }, S)
                }
                return o
            }
        }, If.prototype._calcShiftByAddon = function (V, J) {
            var Z = this._target,
                g = Z.rawPos,
                $ = Z.node.getPosition();
            return V = V || 0, J = J || 0, {
                x: g.x - $.x + V,
                y: g.y - $.y + J
            }
        }, If.prototype._dealShiftDown = function (p) {
            var m = this,
                x = m._target.shiftGuide,
                K = m._target.lp,
                M = Math.abs(p.x - K.x),
                $ = Math.abs(p.y - K.y);
            M > $ && M > x.limit && "y" === x.dir && (x.dir = "x"), $ > M && $ > x.limit && "x" === x.dir && (x.dir = "y");
            var j = x.dir;
            return "x" === j ? (p.y = K.y, x.limit = Math.max(x.limit, M)) : "y" === j && (p.x = K.x, x.limit = Math.max(x.limit, $)), p
        }, If.prototype._isAttachableLineShape = function ($) {
            if (!$.getSegments) return !1;
            var t = $.getSegments();
            if (!t) return !0;
            t instanceof O.List && (t = t.getArray());
            for (var L = 1, G = t.length; G > L; L++)
                if (2 !== t[L]) return !1;
            return !0
        }, If.prototype._calcAttachNodeShift = function () {
            var x = new Xi,
                K = new Xi,
                l = new Xi,
                G = new Xi;
            return function (N, U) {
                var r = this._interactor.gv,
                    p = N.getHost(),
                    O = r.getDataAt(U, function (C) {
                        return C.s("2d.hostable") ? !0 : !1
                    });
                if (O && p !== O && N.setHost(O), !O) return this._edgeHostGuideInfo = null, N.setHost(null);
                var k = this._edgeHostGuideInfo = {
                    corners: se.getTargetCornersOnScreen(r, O),
                    host: O,
                    attach: -1
                };
                if (this._isAttachableLineShape(O)) {
                    for (var u, a, y, P, J, H, h = O.getPoints(), I = h.size(), Z = O.getPointsMatrix2d(), s = 1 / 0, q = 0; I > q && (q !== I - 1 || O.isClosePath()); q++) 0 !== q ? K.copy(l) : Z.apply(h.get(q), K), Z.apply(q === I - 1 ? h.get(0) : h.get(q + 1), l), x.copy(U).sub(K), G.copy(l).sub(K), u = G.length(), G.divideScalar(u), a = x.dot(G), 0 > a ? a = 0 : a > u && (a = u), G.multiplyScalar(a).add(K), y = x.copy(U).sub(G).lengthSq(), s > y && (s = y, H = q, P = a, J = u);
                    return Math.sqrt(s) * r.getZoom() > this._interactor.getStyle("attachThreshold") ? (N.s({
                        "attach.index": -1
                    }), N.setHost(null), void 0) : (N.s("attach.offset.opposite") && (P = J - P), N.s({
                        "attach.index": H,
                        "attach.offset": N.s("attach.offset.relative") ? P / J : P
                    }), {
                        x: 0,
                        y: 0
                    })
                }
                var B = r.calculateAttachPoint(O, U);
                if (B) {
                    var Y = B.point;
                    return k.attach = B.index, this._calcShiftByAddon(Y.x - U.x, Y.y - U.y)
                }
            }
        }(), If.prototype._gatherGridInfo = function (C) {
            var y, D = this,
                T = D._interactor,
                W = T._getValidSelection();
            if (W.length) {
                if (1 === W.length) {
                    if (y = W[0], !y.getRect) return D._target = null, void 0
                } else if (y = se.Group.findOrCreateGroup(W), !y) return D._target = null, void 0
            } else {
                var W = T.gv.sm().getSelection();
                if (W.length && (y = W.get(0), !y.getRect)) return D._target = null, void 0
            } if (y) {
                var _ = y.getPosition(),
                    l = y.getRect();
                D._target = {
                    node: y,
                    x: l.x - _.x,
                    y: l.y - _.y,
                    w: l.width,
                    h: l.height,
                    lp: {
                        x: C.x,
                        y: C.y
                    },
                    pos: {
                        x: _.x,
                        y: _.y
                    },
                    shiftGuide: {
                        dir: "x",
                        limit: 0
                    },
                    downPosition: new se.Math.Vector2(C)
                }, T.rectGuide.gatherRects()
            }
        }, If.prototype.clear = function () {
            var l = this;
            l._edgeHostGuideInfo = null, l._interactor.rectGuide.clear(), l._interactor._42()
        }, If.prototype._42 = function () {
            var j = this._edgeHostGuideInfo;
            j && this._interactor._drawHostGuide(j)
        };
        var Ah = o.freeze({
            DEPTH_BUFFER_BIT: 256,
            STENCIL_BUFFER_BIT: 1024,
            COLOR_BUFFER_BIT: 16384,
            POINTS: 0,
            LINES: 1,
            LINE_LOOP: 2,
            LINE_STRIP: 3,
            TRIANGLES: 4,
            TRIANGLE_STRIP: 5,
            TRIANGLE_FAN: 6,
            ZERO: 0,
            ONE: 1,
            SRC_COLOR: 768,
            ONE_MINUS_SRC_COLOR: 769,
            SRC_ALPHA: 770,
            ONE_MINUS_SRC_ALPHA: 771,
            DST_ALPHA: 772,
            ONE_MINUS_DST_ALPHA: 773,
            DST_COLOR: 774,
            ONE_MINUS_DST_COLOR: 775,
            SRC_ALPHA_SATURATE: 776,
            FUNC_ADD: 32774,
            BLEND_EQUATION: 32777,
            BLEND_EQUATION_RGB: 32777,
            BLEND_EQUATION_ALPHA: 34877,
            FUNC_SUBTRACT: 32778,
            FUNC_REVERSE_SUBTRACT: 32779,
            BLEND_DST_RGB: 32968,
            BLEND_SRC_RGB: 32969,
            BLEND_DST_ALPHA: 32970,
            BLEND_SRC_ALPHA: 32971,
            CONSTANT_COLOR: 32769,
            ONE_MINUS_CONSTANT_COLOR: 32770,
            CONSTANT_ALPHA: 32771,
            ONE_MINUS_CONSTANT_ALPHA: 32772,
            BLEND_COLOR: 32773,
            ARRAY_BUFFER: 34962,
            ELEMENT_ARRAY_BUFFER: 34963,
            ARRAY_BUFFER_BINDING: 34964,
            ELEMENT_ARRAY_BUFFER_BINDING: 34965,
            STREAM_DRAW: 35040,
            STATIC_DRAW: 35044,
            DYNAMIC_DRAW: 35048,
            BUFFER_SIZE: 34660,
            BUFFER_USAGE: 34661,
            CURRENT_VERTEX_ATTRIB: 34342,
            FRONT: 1028,
            BACK: 1029,
            FRONT_AND_BACK: 1032,
            CULL_FACE: 2884,
            BLEND: 3042,
            DITHER: 3024,
            STENCIL_TEST: 2960,
            DEPTH_TEST: 2929,
            SCISSOR_TEST: 3089,
            POLYGON_OFFSET_FILL: 32823,
            SAMPLE_ALPHA_TO_COVERAGE: 32926,
            SAMPLE_COVERAGE: 32928,
            NO_ERROR: 0,
            INVALID_ENUM: 1280,
            INVALID_VALUE: 1281,
            INVALID_OPERATION: 1282,
            OUT_OF_MEMORY: 1285,
            CW: 2304,
            CCW: 2305,
            LINE_WIDTH: 2849,
            ALIASED_POINT_SIZE_RANGE: 33901,
            ALIASED_LINE_WIDTH_RANGE: 33902,
            CULL_FACE_MODE: 2885,
            FRONT_FACE: 2886,
            DEPTH_RANGE: 2928,
            DEPTH_WRITEMASK: 2930,
            DEPTH_CLEAR_VALUE: 2931,
            DEPTH_FUNC: 2932,
            STENCIL_CLEAR_VALUE: 2961,
            STENCIL_FUNC: 2962,
            STENCIL_FAIL: 2964,
            STENCIL_PASS_DEPTH_FAIL: 2965,
            STENCIL_PASS_DEPTH_PASS: 2966,
            STENCIL_REF: 2967,
            STENCIL_VALUE_MASK: 2963,
            STENCIL_WRITEMASK: 2968,
            STENCIL_BACK_FUNC: 34816,
            STENCIL_BACK_FAIL: 34817,
            STENCIL_BACK_PASS_DEPTH_FAIL: 34818,
            STENCIL_BACK_PASS_DEPTH_PASS: 34819,
            STENCIL_BACK_REF: 36003,
            STENCIL_BACK_VALUE_MASK: 36004,
            STENCIL_BACK_WRITEMASK: 36005,
            VIEWPORT: 2978,
            SCISSOR_BOX: 3088,
            COLOR_CLEAR_VALUE: 3106,
            COLOR_WRITEMASK: 3107,
            UNPACK_ALIGNMENT: 3317,
            PACK_ALIGNMENT: 3333,
            MAX_TEXTURE_SIZE: 3379,
            MAX_VIEWPORT_DIMS: 3386,
            SUBPIXEL_BITS: 3408,
            RED_BITS: 3410,
            GREEN_BITS: 3411,
            BLUE_BITS: 3412,
            ALPHA_BITS: 3413,
            DEPTH_BITS: 3414,
            STENCIL_BITS: 3415,
            POLYGON_OFFSET_UNITS: 10752,
            POLYGON_OFFSET_FACTOR: 32824,
            TEXTURE_BINDING_2D: 32873,
            SAMPLE_BUFFERS: 32936,
            SAMPLES: 32937,
            SAMPLE_COVERAGE_VALUE: 32938,
            SAMPLE_COVERAGE_INVERT: 32939,
            COMPRESSED_TEXTURE_FORMATS: 34467,
            DONT_CARE: 4352,
            FASTEST: 4353,
            NICEST: 4354,
            GENERATE_MIPMAP_HINT: 33170,
            BYTE: 5120,
            UNSIGNED_BYTE: 5121,
            SHORT: 5122,
            UNSIGNED_SHORT: 5123,
            INT: 5124,
            UNSIGNED_INT: 5125,
            FLOAT: 5126,
            DEPTH_COMPONENT: 6402,
            ALPHA: 6406,
            RGB: 6407,
            RGBA: 6408,
            LUMINANCE: 6409,
            LUMINANCE_ALPHA: 6410,
            UNSIGNED_SHORT_4_4_4_4: 32819,
            UNSIGNED_SHORT_5_5_5_1: 32820,
            UNSIGNED_SHORT_5_6_5: 33635,
            FRAGMENT_SHADER: 35632,
            VERTEX_SHADER: 35633,
            MAX_VERTEX_ATTRIBS: 34921,
            MAX_VERTEX_UNIFORM_VECTORS: 36347,
            MAX_VARYING_VECTORS: 36348,
            MAX_COMBINED_TEXTURE_IMAGE_UNITS: 35661,
            MAX_VERTEX_TEXTURE_IMAGE_UNITS: 35660,
            MAX_TEXTURE_IMAGE_UNITS: 34930,
            MAX_FRAGMENT_UNIFORM_VECTORS: 36349,
            SHADER_TYPE: 35663,
            DELETE_STATUS: 35712,
            LINK_STATUS: 35714,
            VALIDATE_STATUS: 35715,
            ATTACHED_SHADERS: 35717,
            ACTIVE_UNIFORMS: 35718,
            ACTIVE_ATTRIBUTES: 35721,
            SHADING_LANGUAGE_VERSION: 35724,
            CURRENT_PROGRAM: 35725,
            NEVER: 512,
            LESS: 513,
            EQUAL: 514,
            LEQUAL: 515,
            GREATER: 516,
            NOTEQUAL: 517,
            GEQUAL: 518,
            ALWAYS: 519,
            KEEP: 7680,
            REPLACE: 7681,
            INCR: 7682,
            DECR: 7683,
            INVERT: 5386,
            INCR_WRAP: 34055,
            DECR_WRAP: 34056,
            VENDOR: 7936,
            RENDERER: 7937,
            VERSION: 7938,
            NEAREST: 9728,
            LINEAR: 9729,
            NEAREST_MIPMAP_NEAREST: 9984,
            LINEAR_MIPMAP_NEAREST: 9985,
            NEAREST_MIPMAP_LINEAR: 9986,
            LINEAR_MIPMAP_LINEAR: 9987,
            TEXTURE_MAG_FILTER: 10240,
            TEXTURE_MIN_FILTER: 10241,
            TEXTURE_WRAP_S: 10242,
            TEXTURE_WRAP_T: 10243,
            TEXTURE_2D: 3553,
            TEXTURE: 5890,
            TEXTURE_CUBE_MAP: 34067,
            TEXTURE_BINDING_CUBE_MAP: 34068,
            TEXTURE_CUBE_MAP_POSITIVE_X: 34069,
            TEXTURE_CUBE_MAP_NEGATIVE_X: 34070,
            TEXTURE_CUBE_MAP_POSITIVE_Y: 34071,
            TEXTURE_CUBE_MAP_NEGATIVE_Y: 34072,
            TEXTURE_CUBE_MAP_POSITIVE_Z: 34073,
            TEXTURE_CUBE_MAP_NEGATIVE_Z: 34074,
            MAX_CUBE_MAP_TEXTURE_SIZE: 34076,
            TEXTURE0: 33984,
            TEXTURE1: 33985,
            TEXTURE2: 33986,
            TEXTURE3: 33987,
            TEXTURE4: 33988,
            TEXTURE5: 33989,
            TEXTURE6: 33990,
            TEXTURE7: 33991,
            TEXTURE8: 33992,
            TEXTURE9: 33993,
            TEXTURE10: 33994,
            TEXTURE11: 33995,
            TEXTURE12: 33996,
            TEXTURE13: 33997,
            TEXTURE14: 33998,
            TEXTURE15: 33999,
            TEXTURE16: 34e3,
            TEXTURE17: 34001,
            TEXTURE18: 34002,
            TEXTURE19: 34003,
            TEXTURE20: 34004,
            TEXTURE21: 34005,
            TEXTURE22: 34006,
            TEXTURE23: 34007,
            TEXTURE24: 34008,
            TEXTURE25: 34009,
            TEXTURE26: 34010,
            TEXTURE27: 34011,
            TEXTURE28: 34012,
            TEXTURE29: 34013,
            TEXTURE30: 34014,
            TEXTURE31: 34015,
            ACTIVE_TEXTURE: 34016,
            REPEAT: 10497,
            CLAMP_TO_EDGE: 33071,
            MIRRORED_REPEAT: 33648,
            FLOAT_VEC2: 35664,
            FLOAT_VEC3: 35665,
            FLOAT_VEC4: 35666,
            INT_VEC2: 35667,
            INT_VEC3: 35668,
            INT_VEC4: 35669,
            BOOL: 35670,
            BOOL_VEC2: 35671,
            BOOL_VEC3: 35672,
            BOOL_VEC4: 35673,
            FLOAT_MAT2: 35674,
            FLOAT_MAT3: 35675,
            FLOAT_MAT4: 35676,
            SAMPLER_2D: 35678,
            SAMPLER_CUBE: 35680,
            VERTEX_ATTRIB_ARRAY_ENABLED: 34338,
            VERTEX_ATTRIB_ARRAY_SIZE: 34339,
            VERTEX_ATTRIB_ARRAY_STRIDE: 34340,
            VERTEX_ATTRIB_ARRAY_TYPE: 34341,
            VERTEX_ATTRIB_ARRAY_NORMALIZED: 34922,
            VERTEX_ATTRIB_ARRAY_POINTER: 34373,
            VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 34975,
            IMPLEMENTATION_COLOR_READ_TYPE: 35738,
            IMPLEMENTATION_COLOR_READ_FORMAT: 35739,
            COMPILE_STATUS: 35713,
            LOW_FLOAT: 36336,
            MEDIUM_FLOAT: 36337,
            HIGH_FLOAT: 36338,
            LOW_INT: 36339,
            MEDIUM_INT: 36340,
            HIGH_INT: 36341,
            FRAMEBUFFER: 36160,
            RENDERBUFFER: 36161,
            RGBA4: 32854,
            RGB5_A1: 32855,
            RGB565: 36194,
            DEPTH_COMPONENT16: 33189,
            STENCIL_INDEX: 6401,
            STENCIL_INDEX8: 36168,
            DEPTH_STENCIL: 34041,
            RENDERBUFFER_WIDTH: 36162,
            RENDERBUFFER_HEIGHT: 36163,
            RENDERBUFFER_INTERNAL_FORMAT: 36164,
            RENDERBUFFER_RED_SIZE: 36176,
            RENDERBUFFER_GREEN_SIZE: 36177,
            RENDERBUFFER_BLUE_SIZE: 36178,
            RENDERBUFFER_ALPHA_SIZE: 36179,
            RENDERBUFFER_DEPTH_SIZE: 36180,
            RENDERBUFFER_STENCIL_SIZE: 36181,
            FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 36048,
            FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 36049,
            FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 36050,
            FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 36051,
            COLOR_ATTACHMENT0: 36064,
            DEPTH_ATTACHMENT: 36096,
            STENCIL_ATTACHMENT: 36128,
            DEPTH_STENCIL_ATTACHMENT: 33306,
            NONE: 0,
            FRAMEBUFFER_COMPLETE: 36053,
            FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 36054,
            FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 36055,
            FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 36057,
            FRAMEBUFFER_UNSUPPORTED: 36061,
            FRAMEBUFFER_BINDING: 36006,
            RENDERBUFFER_BINDING: 36007,
            MAX_RENDERBUFFER_SIZE: 34024,
            INVALID_FRAMEBUFFER_OPERATION: 1286,
            UNPACK_FLIP_Y_WEBGL: 37440,
            UNPACK_PREMULTIPLY_ALPHA_WEBGL: 37441,
            CONTEXT_LOST_WEBGL: 37442,
            UNPACK_COLORSPACE_CONVERSION_WEBGL: 37443,
            BROWSER_DEFAULT_WEBGL: 37444,
            COMPRESSED_RGB_S3TC_DXT1_EXT: 33776,
            COMPRESSED_RGBA_S3TC_DXT1_EXT: 33777,
            COMPRESSED_RGBA_S3TC_DXT3_EXT: 33778,
            COMPRESSED_RGBA_S3TC_DXT5_EXT: 33779,
            COMPRESSED_RGB_PVRTC_4BPPV1_IMG: 35840,
            COMPRESSED_RGB_PVRTC_2BPPV1_IMG: 35841,
            COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: 35842,
            COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: 35843,
            COMPRESSED_RGB_ETC1_WEBGL: 36196,
            HALF_FLOAT_OES: 36193,
            DOUBLE: 5130,
            READ_BUFFER: 3074,
            UNPACK_ROW_LENGTH: 3314,
            UNPACK_SKIP_ROWS: 3315,
            UNPACK_SKIP_PIXELS: 3316,
            PACK_ROW_LENGTH: 3330,
            PACK_SKIP_ROWS: 3331,
            PACK_SKIP_PIXELS: 3332,
            COLOR: 6144,
            DEPTH: 6145,
            STENCIL: 6146,
            RED: 6403,
            RGB8: 32849,
            RGBA8: 32856,
            RGB10_A2: 32857,
            TEXTURE_BINDING_3D: 32874,
            UNPACK_SKIP_IMAGES: 32877,
            UNPACK_IMAGE_HEIGHT: 32878,
            TEXTURE_3D: 32879,
            TEXTURE_WRAP_R: 32882,
            MAX_3D_TEXTURE_SIZE: 32883,
            UNSIGNED_INT_2_10_10_10_REV: 33640,
            MAX_ELEMENTS_VERTICES: 33e3,
            MAX_ELEMENTS_INDICES: 33001,
            TEXTURE_MIN_LOD: 33082,
            TEXTURE_MAX_LOD: 33083,
            TEXTURE_BASE_LEVEL: 33084,
            TEXTURE_MAX_LEVEL: 33085,
            MIN: 32775,
            MAX: 32776,
            DEPTH_COMPONENT24: 33190,
            MAX_TEXTURE_LOD_BIAS: 34045,
            TEXTURE_COMPARE_MODE: 34892,
            TEXTURE_COMPARE_FUNC: 34893,
            CURRENT_QUERY: 34917,
            QUERY_RESULT: 34918,
            QUERY_RESULT_AVAILABLE: 34919,
            STREAM_READ: 35041,
            STREAM_COPY: 35042,
            STATIC_READ: 35045,
            STATIC_COPY: 35046,
            DYNAMIC_READ: 35049,
            DYNAMIC_COPY: 35050,
            MAX_DRAW_BUFFERS: 34852,
            DRAW_BUFFER0: 34853,
            DRAW_BUFFER1: 34854,
            DRAW_BUFFER2: 34855,
            DRAW_BUFFER3: 34856,
            DRAW_BUFFER4: 34857,
            DRAW_BUFFER5: 34858,
            DRAW_BUFFER6: 34859,
            DRAW_BUFFER7: 34860,
            DRAW_BUFFER8: 34861,
            DRAW_BUFFER9: 34862,
            DRAW_BUFFER10: 34863,
            DRAW_BUFFER11: 34864,
            DRAW_BUFFER12: 34865,
            DRAW_BUFFER13: 34866,
            DRAW_BUFFER14: 34867,
            DRAW_BUFFER15: 34868,
            MAX_FRAGMENT_UNIFORM_COMPONENTS: 35657,
            MAX_VERTEX_UNIFORM_COMPONENTS: 35658,
            SAMPLER_3D: 35679,
            SAMPLER_2D_SHADOW: 35682,
            FRAGMENT_SHADER_DERIVATIVE_HINT: 35723,
            PIXEL_PACK_BUFFER: 35051,
            PIXEL_UNPACK_BUFFER: 35052,
            PIXEL_PACK_BUFFER_BINDING: 35053,
            PIXEL_UNPACK_BUFFER_BINDING: 35055,
            FLOAT_MAT2x3: 35685,
            FLOAT_MAT2x4: 35686,
            FLOAT_MAT3x2: 35687,
            FLOAT_MAT3x4: 35688,
            FLOAT_MAT4x2: 35689,
            FLOAT_MAT4x3: 35690,
            SRGB: 35904,
            SRGB8: 35905,
            SRGB8_ALPHA8: 35907,
            COMPARE_REF_TO_TEXTURE: 34894,
            RGBA32F: 34836,
            RGB32F: 34837,
            RGBA16F: 34842,
            RGB16F: 34843,
            VERTEX_ATTRIB_ARRAY_INTEGER: 35069,
            MAX_ARRAY_TEXTURE_LAYERS: 35071,
            MIN_PROGRAM_TEXEL_OFFSET: 35076,
            MAX_PROGRAM_TEXEL_OFFSET: 35077,
            MAX_VARYING_COMPONENTS: 35659,
            TEXTURE_2D_ARRAY: 35866,
            TEXTURE_BINDING_2D_ARRAY: 35869,
            R11F_G11F_B10F: 35898,
            UNSIGNED_INT_10F_11F_11F_REV: 35899,
            RGB9_E5: 35901,
            UNSIGNED_INT_5_9_9_9_REV: 35902,
            TRANSFORM_FEEDBACK_BUFFER_MODE: 35967,
            MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 35968,
            TRANSFORM_FEEDBACK_VARYINGS: 35971,
            TRANSFORM_FEEDBACK_BUFFER_START: 35972,
            TRANSFORM_FEEDBACK_BUFFER_SIZE: 35973,
            TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 35976,
            RASTERIZER_DISCARD: 35977,
            MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 35978,
            MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: 35979,
            INTERLEAVED_ATTRIBS: 35980,
            SEPARATE_ATTRIBS: 35981,
            TRANSFORM_FEEDBACK_BUFFER: 35982,
            TRANSFORM_FEEDBACK_BUFFER_BINDING: 35983,
            RGBA32UI: 36208,
            RGB32UI: 36209,
            RGBA16UI: 36214,
            RGB16UI: 36215,
            RGBA8UI: 36220,
            RGB8UI: 36221,
            RGBA32I: 36226,
            RGB32I: 36227,
            RGBA16I: 36232,
            RGB16I: 36233,
            RGBA8I: 36238,
            RGB8I: 36239,
            RED_INTEGER: 36244,
            RGB_INTEGER: 36248,
            RGBA_INTEGER: 36249,
            SAMPLER_2D_ARRAY: 36289,
            SAMPLER_2D_ARRAY_SHADOW: 36292,
            SAMPLER_CUBE_SHADOW: 36293,
            UNSIGNED_INT_VEC2: 36294,
            UNSIGNED_INT_VEC3: 36295,
            UNSIGNED_INT_VEC4: 36296,
            INT_SAMPLER_2D: 36298,
            INT_SAMPLER_3D: 36299,
            INT_SAMPLER_CUBE: 36300,
            INT_SAMPLER_2D_ARRAY: 36303,
            UNSIGNED_INT_SAMPLER_2D: 36306,
            UNSIGNED_INT_SAMPLER_3D: 36307,
            UNSIGNED_INT_SAMPLER_CUBE: 36308,
            UNSIGNED_INT_SAMPLER_2D_ARRAY: 36311,
            DEPTH_COMPONENT32F: 36012,
            DEPTH32F_STENCIL8: 36013,
            FLOAT_32_UNSIGNED_INT_24_8_REV: 36269,
            FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: 33296,
            FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: 33297,
            FRAMEBUFFER_ATTACHMENT_RED_SIZE: 33298,
            FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 33299,
            FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 33300,
            FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 33301,
            FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 33302,
            FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 33303,
            FRAMEBUFFER_DEFAULT: 33304,
            UNSIGNED_INT_24_8: 34042,
            DEPTH24_STENCIL8: 35056,
            UNSIGNED_NORMALIZED: 35863,
            DRAW_FRAMEBUFFER_BINDING: 36006,
            READ_FRAMEBUFFER: 36008,
            DRAW_FRAMEBUFFER: 36009,
            READ_FRAMEBUFFER_BINDING: 36010,
            RENDERBUFFER_SAMPLES: 36011,
            FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: 36052,
            MAX_COLOR_ATTACHMENTS: 36063,
            COLOR_ATTACHMENT1: 36065,
            COLOR_ATTACHMENT2: 36066,
            COLOR_ATTACHMENT3: 36067,
            COLOR_ATTACHMENT4: 36068,
            COLOR_ATTACHMENT5: 36069,
            COLOR_ATTACHMENT6: 36070,
            COLOR_ATTACHMENT7: 36071,
            COLOR_ATTACHMENT8: 36072,
            COLOR_ATTACHMENT9: 36073,
            COLOR_ATTACHMENT10: 36074,
            COLOR_ATTACHMENT11: 36075,
            COLOR_ATTACHMENT12: 36076,
            COLOR_ATTACHMENT13: 36077,
            COLOR_ATTACHMENT14: 36078,
            COLOR_ATTACHMENT15: 36079,
            FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: 36182,
            MAX_SAMPLES: 36183,
            HALF_FLOAT: 5131,
            RG: 33319,
            RG_INTEGER: 33320,
            R8: 33321,
            RG8: 33323,
            R16F: 33325,
            R32F: 33326,
            RG16F: 33327,
            RG32F: 33328,
            R8I: 33329,
            R8UI: 33330,
            R16I: 33331,
            R16UI: 33332,
            R32I: 33333,
            R32UI: 33334,
            RG8I: 33335,
            RG8UI: 33336,
            RG16I: 33337,
            RG16UI: 33338,
            RG32I: 33339,
            RG32UI: 33340,
            VERTEX_ARRAY_BINDING: 34229,
            R8_SNORM: 36756,
            RG8_SNORM: 36757,
            RGB8_SNORM: 36758,
            RGBA8_SNORM: 36759,
            SIGNED_NORMALIZED: 36764,
            COPY_READ_BUFFER: 36662,
            COPY_WRITE_BUFFER: 36663,
            COPY_READ_BUFFER_BINDING: 36662,
            COPY_WRITE_BUFFER_BINDING: 36663,
            UNIFORM_BUFFER: 35345,
            UNIFORM_BUFFER_BINDING: 35368,
            UNIFORM_BUFFER_START: 35369,
            UNIFORM_BUFFER_SIZE: 35370,
            MAX_VERTEX_UNIFORM_BLOCKS: 35371,
            MAX_FRAGMENT_UNIFORM_BLOCKS: 35373,
            MAX_COMBINED_UNIFORM_BLOCKS: 35374,
            MAX_UNIFORM_BUFFER_BINDINGS: 35375,
            MAX_UNIFORM_BLOCK_SIZE: 35376,
            MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 35377,
            MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 35379,
            UNIFORM_BUFFER_OFFSET_ALIGNMENT: 35380,
            ACTIVE_UNIFORM_BLOCKS: 35382,
            UNIFORM_TYPE: 35383,
            UNIFORM_SIZE: 35384,
            UNIFORM_BLOCK_INDEX: 35386,
            UNIFORM_OFFSET: 35387,
            UNIFORM_ARRAY_STRIDE: 35388,
            UNIFORM_MATRIX_STRIDE: 35389,
            UNIFORM_IS_ROW_MAJOR: 35390,
            UNIFORM_BLOCK_BINDING: 35391,
            UNIFORM_BLOCK_DATA_SIZE: 35392,
            UNIFORM_BLOCK_ACTIVE_UNIFORMS: 35394,
            UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: 35395,
            UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: 35396,
            UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: 35398,
            INVALID_INDEX: 4294967295,
            MAX_VERTEX_OUTPUT_COMPONENTS: 37154,
            MAX_FRAGMENT_INPUT_COMPONENTS: 37157,
            MAX_SERVER_WAIT_TIMEOUT: 37137,
            OBJECT_TYPE: 37138,
            SYNC_CONDITION: 37139,
            SYNC_STATUS: 37140,
            SYNC_FLAGS: 37141,
            SYNC_FENCE: 37142,
            SYNC_GPU_COMMANDS_COMPLETE: 37143,
            UNSIGNALED: 37144,
            SIGNALED: 37145,
            ALREADY_SIGNALED: 37146,
            TIMEOUT_EXPIRED: 37147,
            CONDITION_SATISFIED: 37148,
            WAIT_FAILED: 37149,
            SYNC_FLUSH_COMMANDS_BIT: 1,
            VERTEX_ATTRIB_ARRAY_DIVISOR: 35070,
            ANY_SAMPLES_PASSED: 35887,
            ANY_SAMPLES_PASSED_CONSERVATIVE: 36202,
            SAMPLER_BINDING: 35097,
            RGB10_A2UI: 36975,
            INT_2_10_10_10_REV: 36255,
            TRANSFORM_FEEDBACK: 36386,
            TRANSFORM_FEEDBACK_PAUSED: 36387,
            TRANSFORM_FEEDBACK_ACTIVE: 36388,
            TRANSFORM_FEEDBACK_BINDING: 36389,
            COMPRESSED_R11_EAC: 37488,
            COMPRESSED_SIGNED_R11_EAC: 37489,
            COMPRESSED_RG11_EAC: 37490,
            COMPRESSED_SIGNED_RG11_EAC: 37491,
            COMPRESSED_RGB8_ETC2: 37492,
            COMPRESSED_SRGB8_ETC2: 37493,
            COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 37494,
            COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 37495,
            COMPRESSED_RGBA8_ETC2_EAC: 37496,
            COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 37497,
            TEXTURE_IMMUTABLE_FORMAT: 37167,
            MAX_ELEMENT_INDEX: 36203,
            TEXTURE_IMMUTABLE_LEVELS: 33503,
            MAX_TEXTURE_MAX_ANISOTROPY_EXT: 34047
        }),
            Do = function () {
                function i(G, p) {
                    var r = Z;
                    return function () {
                        return r || (r = G.getExtension(p)), r
                    }
                }

                function q(d, T) {
                    T == Z && (T = {}), T.version = P && (d instanceof WebGL2RenderingContext || o.prototype.toString.call(d) === k) ? 2 : 1, T.extensions = function () {
                        for (var _ = {}, A = d.getSupportedExtensions(), a = A.length; a--;) _[name] = i(d, A[a]);
                        return _
                    }();
                    for (var z = o.keys(g), H = 0, Q = z.length; Q > H; ++H) {
                        var h = z[H];
                        T[h] = d.getParameter(g[h])
                    }
                    if (T.version > 1) {
                        z = o.keys(r);
                        for (var H = 0, Q = z.length; Q > H; ++H) {
                            var h = z[H];
                            T[h] = d.getParameter(r[h])
                        }
                    }
                    return T
                }
                var P = "undefined" != typeof WebGL2RenderingContext,
                    k = "[object WebGL2RenderingContext]",
                    g = {
                        aliasedLineWidthRange: Ah.ALIASED_LINE_WIDTH_RANGE,
                        aliasedPointSizeRange: Ah.ALIASED_POINT_SIZE_RANGE,
                        maxCombinedTextureImageUnits: Ah.MAX_COMBINED_TEXTURE_IMAGE_UNITS,
                        maxCubeMapTextureSize: Ah.MAX_CUBE_MAP_TEXTURE_SIZE,
                        maxFragmentUniformVectors: Ah.MAX_FRAGMENT_UNIFORM_VECTORS,
                        maxRenderBufferSize: Ah.MAX_RENDERBUFFER_SIZE,
                        maxTextureImageUnits: Ah.MAX_TEXTURE_IMAGE_UNITS,
                        maxTextureSize: Ah.MAX_TEXTURE_SIZE,
                        maxVaryingVectors: Ah.MAX_VARYING_VECTORS,
                        maxVertexAttribs: Ah.MAX_VERTEX_ATTRIBS,
                        maxVertexTextureImageUnits: Ah.MAX_VERTEX_TEXTURE_IMAGE_UNITS,
                        maxVertexUniformVectors: Ah.MAX_VERTEX_UNIFORM_VECTORS,
                        maxViewportDIMs: Ah.MAX_VIEWPORT_DIMS
                    },
                    r = {
                        max3DTextureSize: Ah.MAX_3D_TEXTURE_SIZE,
                        maxArrayTextureLayers: Ah.MAX_ARRAY_TEXTURE_LAYERS,
                        maxColorAttachments: Ah.MAX_COLOR_ATTACHMENTS,
                        maxCombinedFragmentUniformComponents: Ah.MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS,
                        maxCombinedUniformBlocks: Ah.MAX_COMBINED_UNIFORM_BLOCKS,
                        maxCombinedVertexUniformComponents: Ah.MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS,
                        maxDrawBuffers: Ah.MAX_DRAW_BUFFERS,
                        maxElementIndex: Ah.MAX_ELEMENT_INDEX,
                        maxElementsIndices: Ah.MAX_ELEMENTS_INDICES,
                        maxElementsVertices: Ah.MAX_ELEMENTS_VERTICES,
                        maxFragmentInpuComponents: Ah.MAX_FRAGMENT_INPUT_COMPONENTS,
                        maxFragmentUniformBlocks: Ah.MAX_FRAGMENT_UNIFORM_BLOCKS,
                        maxFragmentUniformComponents: Ah.MAX_FRAGMENT_UNIFORM_COMPONENTS,
                        maxProgramTexelOffset: Ah.MAX_PROGRAM_TEXEL_OFFSET,
                        maxSamples: Ah.MAX_SAMPLES,
                        maxTextureLODBias: Ah.MAX_TEXTURE_LOD_BIAS,
                        maxTransformFeedbackInterleavedComponents: Ah.MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS,
                        maxTransformFeedbackSeparateAttribs: Ah.MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,
                        maxTransformFeedbackSeparateComponents: Ah.MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS,
                        maxUniformBlockSize: Ah.MAX_UNIFORM_BLOCK_SIZE,
                        maxUniformBufferBindings: Ah.MAX_UNIFORM_BUFFER_BINDINGS,
                        maxVaryingComponents: Ah.MAX_VARYING_COMPONENTS,
                        maxVertexOutputComponents: Ah.MAX_VERTEX_OUTPUT_COMPONENTS,
                        maxVertexUniformBlocks: Ah.MAX_VERTEX_UNIFORM_BLOCKS,
                        maxVertexUniformComponents: Ah.MAX_VERTEX_UNIFORM_COMPONENTS,
                        minProgramTexelOffset: Ah.MIN_PROGRAM_TEXEL_OFFSET
                    };
                return {
                    "for": function (z) {
                        var e = z._info;
                        return e || (z._info = e = q(z, e)), e
                    }
                }
            }(),
            vd = function () {
                function s(y, m, S) {
                    return {
                        def: y,
                        getter: S ? function (A) {
                            var P = Do.for(A);
                            return P.version > 1 ? A.getParameter(m) : y
                        } : function (s) {
                            return s.getParameter(m)
                        }, setter: S ? function (d, D) {
                            var I = Do.for(d);
                            I.version > 1 && d.pixelStorei(m, D)
                        } : function (I, D) {
                            I.pixelStorei(m, D)
                        }
                    }
                }

                function W(v) {
                    return "string" == typeof v ? ns(v) : v.r !== Z ? (I[0] = v.r, I[1] = v.g, I[2] = v.b, I[3] = v.a, I) : v.red !== Z ? (I[0] = v.red, I[1] = v.green, I[2] = v.blue, I[3] = v.alpha, I) : v
                }

                function A(s) {
                    return d(s) ? Array.prototype.slice.call(s, 0) : s
                }

                function r(H, e, K) {
                    this.gl = e, this._record = K || {}, this._branches = {}, this._leafSync = {}, this._struct = H;
                    for (var G = H.children, M = G.length; M--;) {
                        var t = G[M],
                            J = t.name;
                        t.isLeaf ? (this._leafSync[J] = !1, this._record[J] = A(t.desc.def)) : this._record[J] = {}
                    }
                }

                function K(O) {
                    function G(B, X) {
                        r.call(this, O, B, X);
                        for (var h = u.length; h--;) {
                            var T = u[h];
                            this._branches[T._name] = new T._type(B, this._record[T._name])
                        }
                    }

                    function Q(w, x) {
                        function L(b, U) {
                            for (var g = W, v = !1; g--;) b[g] !== U[g] && (b[g] = U[g], v = !0);
                            return v
                        }
                        var V = w.name,
                            N = d(w.desc.def),
                            W = N && w.desc.def.length;
                        if (w.isLeaf) {
                            var $ = w.desc.setter,
                                y = w.desc.parse;
                            o.defineProperty(x, V, {
                                configurable: !1,
                                enumerable: !0,
                                get: function () {
                                    return this._record[V]
                                }, set: N ? function (T) {
                                    y && (T = y(T)), (L(this._record[V], T) || !this._leafSync[V]) && ($(this.gl, this._record[V]), this._leafSync[V] = !0)
                                } : function (Y) {
                                    this._record[V] === Y && this._leafSync[V] || ($(this.gl, Y), this._record[V] = Y, this._leafSync[V] = !0)
                                }
                            })
                        } else u.push({
                            _name: V,
                            _type: K(w)
                        }), o.defineProperty(x, V, {
                            configurable: !1,
                            enumerable: !0,
                            get: function () {
                                return this._branches[V]
                            }, set: function (W) {
                                this._branches[V].apply(W)
                            }
                        })
                    }
                    var u = [];
                    return l(G, r), O.forEach(Q, G.prototype), G
                }
                var I = "undefined" != typeof Float32Array && new Float32Array(4),
                    H = {
                        viewport: {
                            def: [0, 0, 0 / 0, 0 / 0],
                            getter: function (a) {
                                return a.getParameter(a.VIEWPORT)
                            }, setter: function (G, z) {
                                var i = z[2] !== z[2] ? G.drawingBufferWidth - z[0] : z[2],
                                    K = z[3] !== z[3] ? G.drawingBufferHeight - z[1] : z[3];
                                G.viewport(z[0], z[1], i, K)
                            }
                        },
                        dither: {
                            def: !1,
                            getter: function (O) {
                                return O.isEnabled(O.DITHER)
                            }, setter: function (p, Y) {
                                Y ? p.enable(p.DITHER) : p.disable(p.DITHER)
                            }
                        },
                        rasterizerDiscard: {
                            def: !1,
                            getter: function (w) {
                                var J = Do.for(w);
                                return J.version > 1 && w.isEnabled(w.RASTERIZER_DISCARD)
                            }, setter: function (T, h) {
                                var f = Do.for(T);
                                1 !== f.version && (h ? T.enable(T.RASTERIZER_DISCARD) : T.disable(T.RASTERIZER_DISCARD))
                            }
                        },
                        lineWidth: {
                            def: 1,
                            getter: function (K) {
                                return K.lineWidth ? K.getParameter(K.LINE_WIDTH) : 1
                            }, setter: function (i, W) {
                                i.lineWidth && i.lineWidth(W)
                            }
                        },
                        color: {
                            clear: {
                                def: [0, 0, 0, 0],
                                getter: function (Q) {
                                    return Q.getParameter(Q.COLOR_CLEAR_VALUE)
                                }, setter: function (x, l) {
                                    x.clearColor(l[0], l[1], l[2], l[3])
                                }, parse: W
                            },
                            mask: {
                                def: [!0, !0, !0, !0],
                                getter: function (i) {
                                    return i.getParameter(i.COLOR_WRITEMASK)
                                }, setter: function (r, d) {
                                    r.colorMask(d[0], d[1], d[2], d[3])
                                }
                            }
                        },
                        blend: {
                            enabled: {
                                def: !1,
                                getter: function (q) {
                                    return q.isEnabled(q.BLEND)
                                }, setter: function (g, P) {
                                    P ? g.enable(g.BLEND) : g.disable(g.BLEND)
                                }
                            },
                            color: {
                                def: [0, 0, 0, 0],
                                getter: function (x) {
                                    return x.getParameter(x.BLEND_COLOR)
                                }, setter: function (X, q) {
                                    X.blendColor(q[0], q[1], q[2], q[3])
                                }, parse: W
                            },
                            equation: {
                                def: [Ah.FUNC_ADD, Ah.FUNC_ADD],
                                getter: function (n) {
                                    return [n.getParameter(n.BLEND_EQUATION_RGB), n.getParameter(n.BLEND_EQUATION_ALPHA)]
                                }, setter: function (G, d) {
                                    G.blendEquationSeparate(d[0], d[1])
                                }, parse: function (y) {
                                    var b = y.length;
                                    return b > 1 ? y : 1 === b ? (I[1] = I[0] = y[0], I) : (I[1] = I[0] = y, I)
                                }
                            },
                            func: {
                                def: [Ah.ONE, Ah.ZERO, Ah.ONE, Ah.ZERO],
                                getter: function (T) {
                                    return [T.getParameter(T.BLEND_SRC_RGB), T.getParameter(T.BLEND_DST_RGB), T.getParameter(T.BLEND_SRC_ALPHA), T.getParameter(T.BLEND_DST_ALPHA)]
                                }, setter: function (T, R) {
                                    T.blendFuncSeparate(R[0], R[1], R[2], R[3])
                                }, parse: function (P) {
                                    var w = P.length;
                                    return w > 3 ? P : (I[2] = I[0] = P[0], I[3] = I[1] = P[1], I)
                                }
                            }
                        },
                        cullFace: {
                            enabled: {
                                def: !1,
                                getter: function (M) {
                                    return M.isEnabled(M.CULL_FACE)
                                }, setter: function (Q, G) {
                                    G ? Q.enable(Q.CULL_FACE) : Q.disable(Q.CULL_FACE)
                                }
                            },
                            mode: {
                                def: Ah.BACK,
                                getter: function (M) {
                                    return M.getParameter(M.CULL_FACE_MODE)
                                }, setter: function (Y, R) {
                                    Y.cullFace(R)
                                }
                            },
                            frontFace: {
                                def: Ah.CCW,
                                getter: function (i) {
                                    return i.getParameter(i.FRONT_FACE)
                                }, setter: function (u, $) {
                                    u.frontFace($)
                                }
                            }
                        },
                        scissor: {
                            enabled: {
                                def: !1,
                                getter: function (S) {
                                    return S.isEnabled(S.SCISSOR_TEST)
                                }, setter: function (k, t) {
                                    t ? k.enable(k.SCISSOR_TEST) : k.disable(k.SCISSOR_TEST)
                                }
                            },
                            box: {
                                def: [0, 0, 0 / 0, 0 / 0],
                                getter: function (p) {
                                    return p.getParameter(p.SCISSOR_BOX)
                                }, setter: function (l, C) {
                                    var s = C[2] !== C[2] ? l.drawingBufferWidth - C[0] : C[2],
                                        U = C[3] !== C[3] ? l.drawingBufferHeight - C[1] : C[3];
                                    l.scissor(C[0], C[1], s, U)
                                }
                            }
                        },
                        depth: {
                            enabled: {
                                def: !1,
                                getter: function (_) {
                                    return _.isEnabled(_.DEPTH_TEST)
                                }, setter: function (U, M) {
                                    M ? U.enable(U.DEPTH_TEST) : U.disable(U.DEPTH_TEST)
                                }
                            },
                            clear: {
                                def: 1,
                                getter: function (M) {
                                    return M.getParameter(M.DEPTH_CLEAR_VALUE)
                                }, setter: function (Y, c) {
                                    Y.clearDepth(c)
                                }
                            },
                            mask: {
                                def: !0,
                                getter: function (z) {
                                    return z.getParameter(z.DEPTH_WRITEMASK)
                                }, setter: function (S, k) {
                                    S.depthMask(k)
                                }
                            },
                            range: {
                                def: [-1, 1],
                                getter: function (s) {
                                    return s.getParameter(s.DEPTH_RANGE)
                                }, setter: function (d, Z) {
                                    d.depthRange(Z[0], Z[1])
                                }
                            },
                            func: {
                                def: Ah.LESS,
                                getter: function (f) {
                                    return f.getParameter(f.DEPTH_FUNC)
                                }, setter: function (g, J) {
                                    g.depthFunc(J)
                                }
                            }
                        },
                        stencil: {
                            enabled: {
                                def: !1,
                                getter: function (Q) {
                                    return Q.isEnabled(Q.STENCIL_TEST)
                                }, setter: function (a, G) {
                                    G ? a.enable(a.STENCIL_TEST) : a.disable(a.STENCIL_TEST)
                                }
                            },
                            clear: {
                                def: 0,
                                getter: function (j) {
                                    return j.getParameter(j.STENCIL_CLEAR_VALUE)
                                }, setter: function (D, r) {
                                    D.clearStencil(r)
                                }
                            },
                            frontMask: {
                                def: 255,
                                getter: function (v) {
                                    return v.getParameter(v.STENCIL_WRITEMASK)
                                }, setter: function (E, i) {
                                    E.stencilMaskSeparate(E.FRONT, i)
                                }
                            },
                            frontOp: {
                                def: [Ah.KEEP, Ah.KEEP, Ah.KEEP],
                                getter: function (s) {
                                    return [s.getParameter(s.STENCIL_FAIL), s.getParameter(s.STENCIL_PASS_DEPTH_FAIL), s.getParameter(s.STENCIL_PASS_DEPTH_PASS)]
                                }, setter: function (n, H) {
                                    n.stencilOpSeparate(n.FRONT, H[0], H[1], H[2])
                                }
                            },
                            frontFunc: {
                                def: [Ah.ALWAYS, 0, 255],
                                getter: function (t) {
                                    return [t.getParameter(t.STENCIL_FUNC), t.getParameter(t.STENCIL_REF), t.getParameter(t.STENCIL_VALUE_MASK)]
                                }, setter: function (u, f) {
                                    u.stencilFuncSeparate(u.FRONT, f[0], f[1], f[2])
                                }
                            },
                            backMask: {
                                def: 255,
                                getter: function (y) {
                                    return y.getParameter(y.STENCIL_BACK_WRITEMASK)
                                }, setter: function (y, P) {
                                    y.stencilMaskSeparate(y.BACK, P)
                                }
                            },
                            backOp: {
                                def: [Ah.KEEP, Ah.KEEP, Ah.KEEP],
                                getter: function (l) {
                                    return [l.getParameter(l.STENCIL_BACK_FAIL), l.getParameter(l.STENCIL_BACK_PASS_DEPTH_FAIL), l.getParameter(l.STENCIL_BACK_PASS_DEPTH_PASS)]
                                }, setter: function (s, P) {
                                    s.stencilOpSeparate(s.BACK, P[0], P[1], P[2])
                                }
                            },
                            backFunc: {
                                def: [Ah.ALWAYS, 0, 255],
                                getter: function (J) {
                                    return [J.getParameter(J.STENCIL_BACK_FUNC), J.getParameter(J.STENCIL_BACK_REF), J.getParameter(J.STENCIL_BACK_VALUE_MASK)]
                                }, setter: function (B, T) {
                                    B.stencilFuncSeparate(B.BACK, T[0], T[1], T[2])
                                }
                            }
                        },
                        hint: {
                            generateMipmap: {
                                def: Ah.DONT_CARE,
                                getter: function (X) {
                                    return X.getParameter(X.GENERATE_MIPMAP_HINT)
                                }, setter: function (y, K) {
                                    y.hint(y.GENERATE_MIPMAP_HINT, K)
                                }
                            },
                            fragmentShaderDerivative: {
                                def: Ah.DONT_CARE,
                                getter: function (k) {
                                    var q = Do.for(k);
                                    return 1 !== q.version || q.extensions.OES_standard_derivatives ? k.getParameter(Ah.FRAGMENT_SHADER_DERIVATIVE_HINT) : Ah.DONT_CARE
                                }, setter: function (e, K) {
                                    var x = Do.for(e);
                                    return x.version > 1 || x.extensions.OES_standard_derivatives ? (e.hint(Ah.FRAGMENT_SHADER_DERIVATIVE_HINT, K), void 0) : void 0
                                }
                            }
                        },
                        pixelStore: {
                            packAlignment: s(4, Ah.PACK_ALIGNMENT, !1),
                            unpackAlignment: s(4, Ah.UNPACK_ALIGNMENT, !1),
                            unpackFlipY: s(!1, Ah.UNPACK_FLIP_Y_WEBGL, !1),
                            unpackPremultiplyAlpha: s(!1, Ah.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1),
                            unpackColorspaceConversion: s(Ah.BROWSER_DEFAULT_WEBGL, Ah.UNPACK_COLORSPACE_CONVERSION_WEBGL, !1),
                            packRowLength: s(0, Ah.PACK_ROW_LENGTH, !0),
                            packSkipPixels: s(0, Ah.PACK_SKIP_PIXELS, !0),
                            packSkipRows: s(0, Ah.PACK_SKIP_ROWS, !0),
                            unpackRowLength: s(0, Ah.UNPACK_ROW_LENGTH, !0),
                            unpackImageHeight: s(0, Ah.UNPACK_IMAGE_HEIGHT, !0),
                            unpackSkipPixels: s(0, Ah.UNPACK_SKIP_PIXELS, !0),
                            unpackSkipRows: s(0, Ah.UNPACK_SKIP_ROWS, !0),
                            unpackSkipImages: s(0, Ah.UNPACK_SKIP_IMAGES, !0)
                        },
                        polygonOffset: {
                            enabled: {
                                def: !1,
                                getter: function (T) {
                                    return T.isEnabled(T.POLYGON_OFFSET_FILL)
                                }, setter: function (A, j) {
                                    j ? A.enable(A.POLYGON_OFFSET_FILL) : A.disable(A.POLYGON_OFFSET_FILL)
                                }
                            },
                            value: {
                                def: [0, 0],
                                getter: function (q) {
                                    return [q.getParameter(q.POLYGON_OFFSET_FACTOR), q.getParameter(q.POLYGON_OFFSET_UNITS)]
                                }, setter: function (t, i) {
                                    t.polygonOffset(i[0], i[1])
                                }
                            }
                        },
                        sampleCoverage: {
                            enabled: {
                                def: !1,
                                getter: function (i) {
                                    return i.isEnabled(i.SAMPLE_COVERAGE)
                                }, setter: function (k, B) {
                                    B ? k.enable(k.SAMPLE_COVERAGE) : k.disable(k.SAMPLE_COVERAGE)
                                }
                            },
                            alpha: {
                                def: !1,
                                getter: function (S) {
                                    return S.isEnabled(S.SAMPLE_ALPHA_TO_COVERAGE)
                                }, setter: function (u, P) {
                                    P ? u.enable(u.SAMPLE_ALPHA_TO_COVERAGE) : u.disable(u.SAMPLE_ALPHA_TO_COVERAGE)
                                }
                            },
                            value: {
                                def: [1, !1],
                                getter: function (g) {
                                    return [g.getParameter(g.SAMPLE_COVERAGE_VALUE), g.getParameter(g.SAMPLE_COVERAGE_INVERT)]
                                }, setter: function (B, h) {
                                    B.sampleCoverage(h[0], h[1])
                                }
                            }
                        }
                    },
                    C = _j.create(H, function (L) {
                        return "def" in L
                    });
                r.prototype.reset = function () {
                    for (var R = this._struct.children, l = R.length; l--;) {
                        var M = R[l],
                            T = M.name;
                        M.isLeaf ? this[T] = M.desc.def : this._branches[T].reset()
                    }
                }, r.prototype.save = function (p) {
                    p == Z && (p = {});
                    for (var z = this._struct.children, F = z.length; F--;) {
                        var k = z[F],
                            c = k.name;
                        if (k.isLeaf) p[c] = A(this._record[c]);
                        else {
                            var y = p[c];
                            y == Z && (p[c] = y = {}), this._branches[c].save(y)
                        }
                    }
                    return p
                }, r.prototype.sync = function (n, b) {
                    for (var Q = this._struct.children, k = Q.length; k--;) {
                        var s = Q[k],
                            o = s.name;
                        s.isLeaf ? (b || !this._leafSync[o]) && (n ? (this._record[o] = s.desc.getter(this.gl), this._leafSync[o] = !0) : (s.desc.setter(this.gl, this._record[o]), this._leafSync[o] = !0)) : this._branches[o].sync(n, b)
                    }
                }, r.prototype.syncLoss = function () {
                    for (var E = this._struct.children, P = E.length; P--;) {
                        var k = E[P];
                        k.isLeaf ? this._leafSync[k.name] = !1 : this._branches[k.name].syncLoss()
                    }
                }, r.prototype.apply = function (M) {
                    for (var P = this._struct.children, L = P.length; L--;) {
                        var i = P[L],
                            B = i.name;
                        B in M && (i.isLeaf ? this[B] = M[B] : this._branches[B].apply(M[B]))
                    }
                }, r.prototype.append = function (s) {
                    var F = this._struct.childMap;
                    for (var Y in s) {
                        var f = F[Y];
                        f && (f.isLeaf ? this[Y] = s[Y] : this._branches[Y].append(s[Y]))
                    }
                };
                var h = K(C);
                return function (f) {
                    var C = f._state;
                    return C || (f._state = C = new h(f)), C
                }
            }(),
            Mj = function () {
                function M(m, T, O, s) {
                    if (m) {
                        var g = m.length;
                        if (g != Z)
                            for (var p = 0; s > p; ++p) T[O + p] = m[p];
                        else m.toArray && m.toArray(T, O)
                    } else
                        for (var p = 0; s > p; ++p) T[O + p] = 0
                }

                function g(B, L, s) {
                    var g = B[0];
                    if (0 >= g || g > 0) return B;
                    var t = L * s,
                        a = h[t];
                    if (a == Z && (h[t] = new Float32Array(t)), 0 !== L) {
                        M(g, a, 0, s);
                        for (var i = 1, O = 0; i !== L; ++i) O += s, M(B[i], a, O, s)
                    }
                    return a
                }

                function t(u, S) {
                    u.uniform1f(this.addr, S)
                }

                function k(o, P) {
                    o.uniform1fv(this.addr, P)
                }

                function d(R, M) {
                    if (M.x != Z) R.uniform2f(this.addr, M.x, M.y);
                    else {
                        var X = h[2];
                        X.set(M, 0), R.uniform2fv(this.addr, X)
                    }
                }

                function V(u, U) {
                    u.uniform2fv(this.addr, g(U, this.size, 2))
                }

                function H(n, i) {
                    if (i.x != Z) n.uniform3f(this.addr, i.x, i.y, i.z);
                    else if (i.r != Z) n.uniform3f(this.addr, i.r, i.g, i.b);
                    else if (i.red != Z) n.uniform3f(this.addr, i.red, i.green, i.blue);
                    else {
                        var d = h[3];
                        d.set(i, 0), n.uniform3fv(this.addr, d)
                    }
                }

                function x(O, B) {
                    O.uniform3fv(this.addr, g(B, this.size, 3))
                }

                function m(L, f) {
                    if ("string" == typeof f && (f = ns(f)), f.x != Z) L.uniform4f(this.addr, f.x, f.y, f.z, f.w);
                    else if (f.r != Z) L.uniform4f(this.addr, f.r, f.g, f.b, f.a);
                    else if (f.red != Z) L.uniform4f(this.addr, f.red, f.green, f.blue, f.alpha);
                    else {
                        var B = h[4];
                        B.set(f, 0), L.uniform4fv(this.addr, B)
                    }
                }

                function b(j, N) {
                    j.uniform4fv(this.addr, g(N, this.size, 4))
                }

                function P(B, r) {
                    B.uniform1i(this.addr, r)
                }

                function T(F, R) {
                    F.uniform1iv(this.addr, R)
                }

                function Y(S, I) {
                    S.uniform2iv(this.addr, I)
                }

                function K(P, b) {
                    P.uniform3iv(this.addr, b)
                }

                function W(C, z) {
                    C.uniform4iv(this.addr, z)
                }

                function L(z, G) {
                    z.uniform1i(this.addr, s[G ? 1 : 0])
                }

                function q($, i) {
                    var u = h[4];
                    u.set(i, 0), $.uniformMatrix2fv(this.addr, !1, u)
                }

                function v(A, Y) {
                    A.uniformMatrix2fv(this.addr, !1, g(Y, this.size, 4))
                }

                function u(S, U) {
                    var y = h[9];
                    y.set(U, 0), S.uniformMatrix3fv(this.addr, !1, y)
                }

                function f(E, Z) {
                    E.uniformMatrix3fv(this.addr, !1, g(Z, this.size, 9))
                }

                function p(M, g) {
                    var w = h[16];
                    w.set(g, 0), M.uniformMatrix4fv(this.addr, !1, w)
                }

                function a(D, S) {
                    D.uniformMatrix4fv(this.addr, !1, g(S, this.size, 16))
                }

                function e(e, f) {
                    e.uniform1i(this.addr, this.slots[0]), e.activeTexture(e.TEXTURE0 + this.slots[0]), e.bindTexture(e.TEXTURE_2D, f || e._emptyTexture)
                }

                function A(I, W) {
                    I.uniform1iv(this.addr, this.slots);
                    for (var $ = this.slots.length; $--;) I.activeTexture(I.TEXTURE0 + this.slots[$]), I.bindTexture(I.TEXTURE_2D, W[$] || I._emptyTexture)
                }

                function N(P, k) {
                    P.uniform1i(this.addr, this.slots[0]), P.activeTexture(P.TEXTURE0 + this.slots[0]), P.bindTexture(P.TEXTURE_CUBE_MAP, k || P._emptyCubeTexture)
                }

                function $(F, r) {
                    F.uniform1iv(this.addr, this.slots);
                    for (var w = this.slots.length; w--;) F.activeTexture(F.TEXTURE0 + this.slots[w]), F.bindTexture(F.TEXTURE_CUBE_MAP, r[w] || F._emptyCubeTexture)
                }

                function C(U, J, d) {
                    G[U] = [J, d]
                }

                function z(L, A, O) {
                    switch (L.type) {
                        case 35678:
                        case 35680:
                            if ("uSampler" === O) return [0];
                            if ("uBlendSampler" === O) return [1];
                            for (var q = L.size, Q = new Int32Array(q), T = 0; q > T; ++T) Q[T] = A.usedTextureSlot++;
                            return Q
                    }
                    return Z
                }

                function R(B, s, q, e, k) {
                    this.name = B, this.addr = s, this.size = e ? q.size : 0, this.activeInfo = q, this.setter = G[q.type][e ? 1 : 0], this.slots = z(q, k, B), bc(this)
                }

                function O(G, P, H, g) {
                    var l = G.name,
                        Q = l.length;
                    for (X.lastIndex = 0; ;) {
                        var E = X.exec(l),
                            M = X.lastIndex,
                            W = E[1],
                            d = "]" === E[2],
                            S = E[3];
                        if (d && (W = 0 | W), S === Z || "[" === S && M + 2 === Q) {
                            H[W] = new R(W, P, G, S !== Z, g);
                            break
                        }
                        var O = H[W];
                        O == Z && (H[W] = O = {}), H = O
                    }
                }

                function E(j, E, A) {
                    this.gl = E, this._program = A, this._leaves = {}, this._branches = {}, this._struct = j
                }

                function D(u) {
                    function i(m, D) {
                        E.call(this, u, m, D);
                        for (var r = T.length; r--;) {
                            var n = T[r];
                            this._branches[n._name] = new n._type(m, D)
                        }
                    }

                    function Z(F, z) {
                        var S = F.name;
                        if (F.isLeaf) {
                            var r = y("d.setter(this.gl, v);", ["v"], ["d"], [F.desc]);
                            o.defineProperty(z, S, {
                                configurable: !1,
                                enumerable: !0,
                                get: function () {
                                    return r
                                }, set: r
                            })
                        } else T.push({
                            _name: S,
                            _type: D(F)
                        }), o.defineProperty(z, S, {
                            configurable: !1,
                            enumerable: !0,
                            get: function () {
                                return this._branches[S]
                            }, set: function (J) {
                                this._branches[S].apply(J)
                            }
                        })
                    }
                    var T = [];
                    return l(i, E), u.forEach(Z, i.prototype), i
                }

                function c(W, N) {
                    for (var M = W.getProgramParameter(N, W.ACTIVE_UNIFORMS), U = {}, Z = {
                        usedTextureSlot: 2
                    }; M--;) {
                        var P = W.getActiveUniform(N, M),
                            e = P.name,
                            J = W.getUniformLocation(N, e);
                        O(P, J, U, Z)
                    }
                    var h = _j.create(U, function (Y) {
                        return "addr" in Y
                    }),
                        p = D(h);
                    return o.defineProperty(p.prototype, "textureCount", {
                        configurable: !1,
                        enumerable: !1,
                        writable: !1,
                        value: Z.usedTextureSlot
                    }), new p(W, N)
                }
                var h = [];
                if ("function" == typeof Float32Array)
                    for (var S = 1; 17 > S; ++S) h[S] = new Float32Array(S);
                var s = new Int32Array([0, 1]),
                    G = [];
                C(Ah.FLOAT, t, k), C(Ah.FLOAT_VEC2, d, V), C(Ah.FLOAT_VEC3, H, x), C(Ah.FLOAT_VEC4, m, b), C(Ah.INT, P, T), C(Ah.INT_VEC2, Y, Y), C(Ah.INT_VEC3, K, K), C(Ah.INT_VEC4, W, W), C(Ah.BOOL, L, T), C(Ah.BOOL_VEC2, Y, Y), C(Ah.BOOL_VEC3, K, K), C(Ah.BOOL_VEC4, W, W), C(Ah.FLOAT_MAT2, q, v), C(Ah.FLOAT_MAT3, u, f), C(Ah.FLOAT_MAT4, p, a), C(Ah.SAMPLER_2D, e, A), C(Ah.SAMPLER_CUBE, N, $);
                var X = /([\w\d_]+)(\])?(\[|\.)?/g;
                return E.prototype.apply = function (V) {
                    for (var d = this._struct.children, D = d.length; D--;) {
                        var l = d[D],
                            t = l.name;
                        t in V && (l.isLeaf ? this[t] = V[t] : this._branches[t].apply(V[t]))
                    }
                }, E.prototype.append = function (X) {
                    var e = this._struct.childMap;
                    for (var $ in X) {
                        var y = e[$];
                        y && (y.isLeaf ? this[$] = X[$] : this._branches[$].append(X[$]))
                    }
                },
                    function (t, T) {
                        var o = T._uniforms;
                        return o || (T._uniforms = o = c(t, T)), o
                    }
            }(),
            Nb = function () {
                function t(n, a, v) {
                    a.vertexAttrib1f(n.addr, v)
                }

                function k(A, l, G) {
                    if (G.x != Z) l.vertexAttrib2f(A.addr, G.x, G.y);
                    else {
                        var p = b[2];
                        p.set(G, 0), l.vertexAttrib2fv(A.addr, p)
                    }
                }

                function p(M, n, V) {
                    if (V.x != Z) n.vertexAttrib3f(M.addr, V.x, V.y, V.z);
                    else if (V.r != Z) n.vertexAttrib3f(M.addr, V.r, V.g, V.b);
                    else if (V.red != Z) n.vertexAttrib3f(M.addr, V.red, V.green, V.blue);
                    else {
                        var x = b[3];
                        x.set(V, 0), n.vertexAttrib3fv(M.addr, x)
                    }
                }

                function S(Q, g, M) {
                    if ("string" == typeof M && (M = ns(M)), M.x != Z) g.vertexAttrib4f(Q.addr, M.x, M.y, M.z, M.w);
                    else if (M.r != Z) g.vertexAttrib4f(Q.addr, M.r, M.g, M.b, M.a);
                    else if (M.red != Z) g.vertexAttrib4f(Q.addr, M.red, M.green, M.blue, M.alpha);
                    else {
                        var S = b[4];
                        S.set(M, 0), g.vertexAttrib4fv(Q.addr, S)
                    }
                }

                function Y(m, O, A) {
                    A = A.el || A;
                    for (var K = 0, x = 0; 2 > K; ++K) O.vertexAttrib2f(m.addr, A[x++], A[x++])
                }

                function d(m, G, n) {
                    n = n.el || n;
                    for (var O = 0, A = 0; 3 > O; ++O) G.vertexAttrib3f(m.addr, n[A++], n[A++], n[A++])
                }

                function x(r, l, q) {
                    q = q.el || q;
                    for (var i = 0, K = 0; 4 > i; ++i) l.vertexAttrib4f(r.addr, q[K++], q[K++], q[K++], q[K++])
                }

                function K(b, K, E, h, $, S, Z) {
                    K.bindBuffer(K.ARRAY_BUFFER, E), K.vertexAttribPointer(b.addr, 1, h || K.FLOAT, !!$, S || 0, Z || 0), K.bindBuffer(K.ARRAY_BUFFER, null)
                }

                function P(t, J, n, O, f, Z, C) {
                    J.bindBuffer(J.ARRAY_BUFFER, n), J.vertexAttribPointer(t.addr, 2, O || J.FLOAT, !!f, Z || 0, C || 0), J.bindBuffer(J.ARRAY_BUFFER, null)
                }

                function u(Q, g, B, Y, $, q, w) {
                    g.bindBuffer(g.ARRAY_BUFFER, B), g.vertexAttribPointer(Q.addr, 3, Y || g.FLOAT, !!$, q || 0, w || 0), g.bindBuffer(g.ARRAY_BUFFER, null)
                }

                function B(K, h, d, J, Y, n, w) {
                    h.bindBuffer(h.ARRAY_BUFFER, d), h.vertexAttribPointer(K.addr, 4, J || h.FLOAT, !!Y, n || 0, w || 0), h.bindBuffer(h.ARRAY_BUFFER, null)
                }

                function g(I, w, e, i, p, R, h) {
                    var R = R || 4,
                        h = h || 0;
                    w.bindBuffer(w.ARRAY_BUFFER, e), w.vertexAttribPointer(I.addr, 2, i || w.FLOAT, !!p, R, h), w.vertexAttribPointer(I.addr + 1, 2, i || w.FLOAT, !!p, R, h + 2), w.bindBuffer(w.ARRAY_BUFFER, null)
                }

                function $(_, k, J, g, c, B, h) {
                    var B = B || 9,
                        h = h || 0;
                    k.bindBuffer(k.ARRAY_BUFFER, J), k.vertexAttribPointer(_.addr, 3, g || k.FLOAT, !!c, B, h), k.vertexAttribPointer(_.addr + 1, 3, g || k.FLOAT, !!c, B, h + 3), k.vertexAttribPointer(_.addr + 2, 3, g || k.FLOAT, !!c, B, h + 6), k.bindBuffer(k.ARRAY_BUFFER, null)
                }

                function z(F, z, J, T, q, n, l) {
                    var n = n || 16,
                        l = l || 0;
                    z.bindBuffer(z.ARRAY_BUFFER, J), z.vertexAttribPointer(F.addr, 4, T || z.FLOAT, !!q, n, l), z.vertexAttribPointer(F.addr + 1, 4, T || z.FLOAT, !!q, n, l + 4), z.vertexAttribPointer(F.addr + 2, 4, T || z.FLOAT, !!q, n, l + 8), z.vertexAttribPointer(F.addr + 3, 4, T || z.FLOAT, !!q, n, l + 12), z.bindBuffer(z.ARRAY_BUFFER, null)
                }

                function W(i, m, C) {
                    M[i] = function (I, B, s, c, l, W) {
                        this.addr == Z || this.addr < 0 || (B == Z || B === !1 ? I.disableVertexAttribArray(this.addr) : ql(B) === R ? (I.enableVertexAttribArray(this.addr), C(this, I, B, s, c, l, W)) : (I.disableVertexAttribArray(this.addr), m(this, I, B)))
                    }
                }

                function v(c, $, g) {
                    this.name = c, this.addr = $, this.activeInfo = g, this.setter = M[g.type], bc(this)
                }

                function L(l, L, f) {
                    this.gl = L, this.program = f, this._branches = {}, this._struct = l
                }

                function E(k) {
                    function I(d, V) {
                        L.call(this, k, d, V);
                        for (var z = O.length; z--;) {
                            var t = O[z];
                            this._branches[t._name] = new t._type(d, V)
                        }
                    }

                    function T(n, h) {
                        var G = n.name;
                        if (n.isLeaf) {
                            var Q = y("d.setter(this.gl, v);", ["v"], ["d"], [n.desc]);
                            o.defineProperty(h, G, {
                                configurable: !1,
                                enumerable: !0,
                                get: function () {
                                    return Q
                                }, set: Q
                            })
                        } else O.push({
                            _name: G,
                            _type: E(n)
                        }), o.defineProperty(h, G, {
                            configurable: !1,
                            enumerable: !0,
                            get: function () {
                                return this._branches[G]
                            }, set: function ($) {
                                this._branches[G].apply($)
                            }
                        })
                    }
                    var O = [];
                    return l(I, L), k.forEach(T, I.prototype), I
                }

                function h(p, F) {
                    for (var r = p.getProgramParameter(F, p.ACTIVE_ATTRIBUTES), g = {}; r--;) {
                        var h = p.getActiveAttrib(F, r),
                            B = h.name,
                            q = p.getAttribLocation(F, B);
                        g[B] = new v(B, q, h)
                    }
                    var o = _j.create(g, function (X) {
                        return "addr" in X
                    }),
                        N = E(o);
                    return new N(p, F)
                }
                var b = [];
                if (Float32Array)
                    for (var X = 1; 17 > X; ++X) b[X] = new Float32Array(X);
                var M = [],
                    R = "undefined" != typeof WebGLBuffer && WebGLBuffer.prototype;
                return W(Ah.FLOAT, t, K), W(Ah.FLOAT_VEC2, k, P), W(Ah.FLOAT_VEC3, p, u), W(Ah.FLOAT_VEC4, S, B), W(Ah.FLOAT_MAT2, Y, g), W(Ah.FLOAT_MAT3, d, $), W(Ah.FLOAT_MAT4, x, z), L.prototype.disable = function () {
                    for (var $ = this._struct.children, F = $.length; F--;) {
                        var T = $[F],
                            m = T.name;
                        T.isLeaf ? this.gl.disableVertexAttribArray(T.desc.addr) : this._branches[m].disable()
                    }
                }, L.prototype.apply = function (b) {
                    for (var l = this._struct.children, B = l.length; B--;) {
                        var Z = l[B],
                            t = Z.name;
                        t in b && (Z.isLeaf ? this[t] = b[t] : this._branches[t].apply(b[t]))
                    }
                }, L.prototype.append = function (d) {
                    var O = this._struct.childMap;
                    for (var X in d) {
                        var G = O[X];
                        G && (G.isLeaf ? this[X] = d[X] : this._branches[X].append(d[X]))
                    }
                },
                    function (l, u) {
                        var y = u._attribs;
                        return y || (u._attribs = y = h(l, u)), y
                    }
            }(),
            ts = function (k) {
                var w = this;
                o.defineProperties(this, {
                    gl: {
                        configurable: !1,
                        enumerable: !1,
                        value: k,
                        writable: !1
                    },
                    glState: {
                        configurable: !1,
                        enumerable: !1,
                        value: vd(k),
                        writable: !1
                    }
                }), w._currProgram = Z, w._currUniforms = Z, w._currAttribs = Z, w._sync = !0
            };
        o.defineProperties(ts.prototype, {
            program: {
                configurable: !1,
                enumerable: !1,
                get: function () {
                    return this._currProgram
                }, set: function (g) {
                    var S = this;
                    S._sync && g === S._currProgram || (S.gl.useProgram(g), S._currProgram = g, S._currUniforms = Mj(S.gl, g), S._currAttribs = Nb(S.gl, g), S._sync = !0)
                }
            },
            uniforms: {
                configurable: !1,
                enumerable: !1,
                get: function () {
                    var I = this;
                    return I._currProgram && !I._sync && (I.gl.useProgram(I._currProgram), I._sync = !0), I._currUniforms
                }, set: function ($) {
                    var Q = this;
                    Q._currUniforms && (Q._currProgram && !Q._sync && (Q.gl.useProgram(Q._currProgram), this._sync = !0), Q._currUniforms.apply($))
                }
            },
            attribs: {
                configurable: !1,
                enumerable: !1,
                get: function () {
                    var d = this;
                    return d._currProgram && !d._sync && (d.gl.useProgram(d._currProgram), d._sync = !0), d._currAttribs
                }, set: function (X) {
                    var C = this;
                    C._currUniforms && (C._currProgram && !C._sync && (C.gl.useProgram(C._currProgram), this._sync = !0), C._currAttribs.apply(X))
                }
            }
        }), ts.prototype.useProgram = function (v) {
            var Z = this;
            Z._sync && v === Z._currProgram || (Z.gl.useProgram(v), Z._currProgram = v, Z._currUniforms = Mj(Z.gl, v), Z._currAttribs = Nb(Z.gl, v), Z._sync = !0)
        }, ts.prototype.directState = function () {
            return this.glState
        }, ts.prototype.directUniforms = function () {
            return this._currUniforms
        }, ts.prototype.directAttribs = function () {
            return this._currAttribs
        }, ts.prototype.syncLoss = function () {
            this._sync = !1, this.glState.syncLoss()
        }, ts.for = function (e) {
            var s = e._renderState;
            return s || (e._renderState = s = new ts(e)), s
        };
        var Tf = "directional",
            zg = "point",
            Bo = "spot",
            ep = "light.color",
            Gc = {},
            Qf = function (O, R) {
                dk(R) && Gq.test(R) ? Im(O, R) : xl(R) && R.modelType ? Ti(O, R) : R === Z ? delete Zm[O] : Zm[O] = R
            },
            Wi = function (Y) {
                return Y
            },
            vf = function (p) {
                p = u.convertShape3dModelName(p);
                var N;
                if (xl(p)) {
                    if (p.modelType) {
                        if (p.uuid) {
                            if (N = Zm[p.uuid]) return N
                        } else p.uuid = O.Math.generateUUID();
                        return N === Z && (Wb && Wb[p.uuid] || Ti(p.uuid, p)), Z
                    }
                    return p
                }
                return N = Zm[p], p && N === Z && Gq.test(p) && (Wb && Wb[p] || Im(p, p)), N
            },
            So = function (E, X) {
                E.frameStack ? E.frameStack.push(X) : E.frameStack = [X], E.bindFramebuffer(E.FRAMEBUFFER, X)
            },
            Ar = function (l) {
                var y = l.frameStack;
                if (y) {
                    if (y.pop(), y.length) return l.bindFramebuffer(l.FRAMEBUFFER, y[y.length - 1]), void 0;
                    l.frameStack = null
                }
                l.bindFramebuffer(l.FRAMEBUFFER, null)
            };
        Uh(u, {
            graph3dViewAttributes: F,
            graph3dViewFirstPersonMode: !1,
            graph3dViewMouseRoamable: !0,
            graph3dViewMoveStep: 15,
            graph3dViewRotateStep: W / 60,
            graph3dViewBlockSelectable: !0,
            graph3dViewEditHelperDisabled: !1,
            graph3dViewPannable: !0,
            graph3dViewRotatable: !0,
            graph3dViewWalkable: !0,
            graph3dViewResettable: !0,
            graph3dViewZoomable: !0,
            graph3dViewRectSelectable: !0,
            graph3dViewRectSelectBackground: Vh,
            graph3dViewGridVisible: !1,
            graph3dViewGridSize: 50,
            graph3dViewGridGap: 50,
            graph3dViewGridColor: [.4, .75, .85, 1],
            graph3dViewRotateMaxPhi: W,
            graph3dViewRotateMinPhi: 0,
            graph3dViewShadowQuality: "high",
            graph3dViewShadowIntensity: .3,
            graph3dViewShadowBias: -.005,
            graph3dViewShadowRadius: .1,
            graph3dViewShadowType: "hard",
            graph3dViewShadowDegreeX: 30,
            graph3dViewShadowDegreeZ: -10,
            graph3dViewOriginAxisVisible: !1,
            graph3dViewCenterAxisVisible: !1,
            graph3dViewAxisXColor: [1, 0, 0, 1],
            graph3dViewAxisYColor: [0, 1, 0, 1],
            graph3dViewAxisZColor: [0, 0, 1, 1],
            graph3dViewEditSizeColor: [1, 1, 0, 1],
            graph3dViewOrtho: !1,
            graph3dViewOrthoWidth: 2e3,
            graph3dViewFovy: W / 4,
            graph3dViewNear: 10,
            graph3dViewFar: 1e4,
            graph3dViewEye: [0, 300, 1e3],
            graph3dViewCenter: [0, 0, 0],
            graph3dViewUp: [0, 1, -1e-7],
            graph3dViewHeadlightRange: 0,
            graph3dViewHeadlightColor: [1, 1, 1, 1],
            graph3dViewHeadlightIntensity: 1,
            graph3dViewHeadlightDisabled: !1,
            graph3dViewHeadlightAmbientIntensity: .7,
            graph3dViewFogDisabled: !0,
            graph3dViewFogMode: "linear",
            graph3dViewFogDensity: 5e-4,
            graph3dViewFogColor: "white",
            graph3dViewFogNear: 1,
            graph3dViewFogFar: 2e3,
            graph3dViewPickerResolution: .5,
            graph3dViewDashDisabled: !0,
            graph3dViewBatchBlendDisabled: !0,
            graph3dViewBatchBrightnessDisabled: !0,
            graph3dViewBatchColorDisabled: !1,
            graph3dMaxVectorCacheTime: 50,
            graph3dEnvmapCapabilityRequire: 8,
            setShape3dModel: Qf,
            getShape3dModel: vf,
            convertShape3dModelName: Wi,
            getShape3dModelMap: function () {
                return Zm
            }, getCachedShape3dModelMap: function () {
                return Mq
            }, createMatrix: function (r, J) {
                ip(r) || (r = [r]);
                for (var q = r.length - 1; q >= 0; q--) {
                    var e = r[q];
                    J = Jn(e.mat, e.s3, e.r3, e.rotationMode, e.t3, J)
                }
                return J
            }, transformVec: function (x, h) {
                return Td(x, h)
            }, glBindFrame: So,
            glUnbindFrame: Ar,
            createBoxModel: function () {
                return {
                    vs: Ef,
                    ns: mn,
                    uv: mi,
                    is: Lq
                }
            }, createRoundRectModel: function (S, W) {
                return Gm.roundRect(S, W)
            }, createStarModel: function (G, Z) {
                return Gm.star(G, Z)
            }, createRectModel: function (y, F) {
                return Gm.rect(y, F)
            }, createTriangleModel: function (f, t) {
                return Gm.triangle(f, t)
            }, createRightTriangleModel: function (v, e) {
                return Gm.rightTriangle(v, e)
            }, createParallelogramModel: function (l, e) {
                return Gm.parallelogram(l, e)
            }, createTrapezoidModel: function (s, J) {
                return Gm.trapezoid(s, J)
            }, createSmoothSphereModel: function (C, S, L, W, N, E, B) {
                return ig(new To(C, S, L, W, N, E, B))
            }, createSphereModel: function (P, Y, b, H, c, p, y) {
                return P ? Mi(P, Y, b, H, c, p, y) : u.createSmoothSphereModel()
            }, createSmoothConeModel: function ($, h, o, T, d) {
                return ce($, h, o, T, d)
            }, createConeModel: function (a, V, I, T, O, B) {
                return a ? po(a, V, I, T, O, B) : ce(B)
            }, createSmoothCylinderModel: function (Y, V, e, G, Z, M, Q, J) {
                return ig(new rc(Y, V, e, G, Z, M, Q, J))
            }, createCylinderModel: function (x, T, w, j, H, S, J, n) {
                return x ? Qh(x, T, w, j, H, S, J, n) : mj(S, J)
            }, createSmoothTorusModel: function (I, i, p, J, N, H) {
                return ig(new Kg(I, i, p, J, N, H))
            }, createTorusModel: function (Q, C, M, X, x, k, P, s) {
                return Q ? Tc(Q, C, M, X, x, k, P, s) : Or(k, P)
            }, createExtrusionModel: function (y, c, p, C, z, i, K, M) {
                return zk(y, c, p, C, z, i, K, M)
            }, createSmoothRingModel: function (S, P, f, p, h, U) {
                for (var $ = [], n = 0; n < S.length - 1; n += 2) $.push({
                    x: S[n],
                    y: S[n + 1]
                });
                for (S = Yo($, P, f)[0], $ = [], n = 0; n < S.length; n++) {
                    var c = S[n];
                    $.push(new pe(c.x, 0, c.y))
                }
                return ig(new Zd($, U, p, h))
            }, createTextGeometry: function (q, E) {
                return ig(new qf(q, E))
            }, loadFontFace: function (X, T) {
                u.xhrLoad(X, function (A) {
                    if (!A) return T();
                    var L;
                    try {
                        L = JSON.parse(A)
                    } catch (P) {
                        L = JSON.parse(A.substring(65, A.length - 2))
                    }
                    Pk.loadFace(L), T && T(L.familyName.toLowerCase())
                }, T ? null : {
                    sync: !0
                })
            }, createRingModel: function (m, v, C, U, w, Q, h, c, j, y) {
                for (var x = [], J = 0; J < m.length - 1; J += 2) x.push({
                    x: m[J],
                    y: m[J + 1]
                });
                Q = Q || u.shapeSide, h = h || 0, c = c || Q;
                var d, p, K, e, S, t, T, P, g, M, J, N, O, b, X, I, l, i, W = [],
                    f = [],
                    $ = j ? [] : F,
                    A = j ? [] : F,
                    z = y ? [] : F,
                    Z = y ? [] : F,
                    _ = U ? [] : F,
                    B = U ? [] : F,
                    E = w ? [] : F,
                    o = w ? [] : F,
                    m = Yo(x, v, C),
                    V = tj(m),
                    Y = 0,
                    r = 2 * Math.PI / Q;
                return m.forEach(function (u) {
                    if (K = u.length, K > 1) {
                        if (e = u[0], U)
                            for (t = e.x, P = e.y, J = h; c > J; J++) N = J + 1, O = J * r, b = N * r, X = k(O), I = n(O), l = k(b), i = n(b), _.push(X * t, P, -I * t, l * t, P, -i * t, 0, P, 0), B.push(.5 - .5 * X, .5 - .5 * I, .5 - .5 * l, .5 - .5 * i, .5, .5);
                        for (M = 0; K > M; M++) {
                            for (S = u[M], t = e.x, T = S.x, P = e.y, g = S.y, d = Y / V, Y += En(e, S), p = Y / V, J = h; c > J; J++) N = J + 1, O = J * r, b = N * r, X = k(O), I = n(O), l = k(b), i = n(b), W.push(X * T, g, -I * T, l * T, g, -i * T, X * t, P, -I * t, l * T, g, -i * T, l * t, P, -i * t, X * t, P, -I * t), f.push(J / Q, p, N / Q, p, J / Q, d, N / Q, p, N / Q, d, J / Q, d), j && J === h && ($.push(0, P, 0, 0, g, 0, X * T, g, -I * T, X * T, g, -I * T, X * t, P, -I * t, 0, P, 0), A.push(0, .5 - P, 0, .5 - g, 2 * T, .5 - g, 2 * T, .5 - g, 2 * t, .5 - P, 0, .5 - P)), y && N === c && (z.push(0, P, 0, l * T, g, -i * T, 0, g, 0, l * T, g, -i * T, 0, P, 0, l * t, P, -i * t), Z.push(1, .5 - P, 1 - 2 * T, .5 - g, 1, .5 - g, 1 - 2 * T, .5 - g, 1, .5 - P, 1 - 2 * t, .5 - P));
                            e = S
                        }
                        if (w)
                            for (t = e.x, P = e.y, J = h; c > J; J++) N = J + 1, O = J * r, b = N * r, X = k(O), I = n(O), l = k(b), i = n(b), E.push(l * t, P, -i * t, X * t, P, -I * t, 0, P, 0), o.push(.5 - .5 * l, .5 + .5 * i, .5 - .5 * X, .5 + .5 * I, .5, .5)
                    }
                }), {
                    vs: W,
                    uv: f,
                    bottom_vs: E,
                    bottom_uv: o,
                    top_vs: _,
                    top_uv: B,
                    from_vs: $,
                    from_uv: A,
                    to_vs: z,
                    to_uv: Z
                }
            }
        }, !0), Uh(z, {
            "3d.move.mode": Z,
            "3d.selectable": !0,
            "3d.visible": !0,
            "3d.movable": !0,
            "3d.editable": !0,
            "3d.clip.direction": null,
            "3d.clip.percentage": 1,
            "3d.reflectable": !0,
            "shape.border.gradient.color": Z,
            "edge.gradient.color": Z,
            "edge.source.t3": Z,
            "edge.target.t3": Z,
            "light.type": zg,
            "light.center": [0, 0, 0],
            "light.color": [1, 1, 1, 1],
            "light.disabled": !1,
            "light.angle": W / 4,
            "light.range": 0,
            "light.exponent": 1,
            "light.intensity": 1,
            "wf.visible": !1,
            "wf.width": 1,
            "wf.color": Bc,
            "wf.short": !1,
            "wf.mat": Z,
            "wf.geometry": !1,
            "wf.loadQuadWireframe": !1,
            "wf.combineTriangle": !0,
            batch: Z,
            "transparent.mask": !1,
            brightness: Z,
            "select.brightness": .7,
            "repeat.uv.length": Z,
            "shadow.cast": !0,
            "shadow.receive": !0,
            bloom: !1,
            envmap: 0,
            renderTextureSamples: 4,
            alphaTest: .4,
            autorotate: !1,
            fixSizeOnScreen: !1,
            "texture.cache": !1,
            "hide.overlapping.group": Z,
            "vector.dynamic": !1,
            "vector.dynamic.maxsize": 2048,
            "texture.scale": 1,
            "geometry.cache": !1,
            "highlight.mode": !1,
            "highlight.visible": !0,
            "highlight.width": .8,
            "highlight.color": "rgba(190, 210, 250, 1)",
            "color.empty": [0, 0, 0, 0],
            "label.face": wg,
            "label.t3": Z,
            "label.r3": Z,
            "label.texture.scale": 2,
            "label.rotationMode": Vn,
            "label.light": !1,
            "label.blend": Z,
            "label.reverse.flip": !1,
            "label.reverse.color": vc,
            "label.reverse.cull": !1,
            "label.transparent": !1,
            "label.autorotate": !1,
            "label2.face": wg,
            "label2.t3": Z,
            "label2.r3": Z,
            "label2.texture.scale": 2,
            "label2.rotationMode": Vn,
            "label2.light": !1,
            "label2.blend": Z,
            "label2.reverse.flip": !1,
            "label2.reverse.color": vc,
            "label2.reverse.cull": !1,
            "label2.transparent": !1,
            "label2.autorotate": !1,
            "note.face": wg,
            "note.t3": Z,
            "note.r3": Z,
            "note.texture.scale": 2,
            "note.rotationMode": Vn,
            "note.light": !1,
            "note.blend": Z,
            "note.reverse.flip": !1,
            "note.reverse.color": vc,
            "note.reverse.cull": !1,
            "note.transparent": !1,
            "note.autorotate": !1,
            "note2.face": wg,
            "note2.t3": Z,
            "note2.r3": Z,
            "note2.texture.scale": 2,
            "note2.rotationMode": Vn,
            "note2.light": !1,
            "note2.blend": Z,
            "note2.reverse.flip": !1,
            "note2.reverse.color": vc,
            "note2.reverse.cull": !1,
            "note2.transparent": !1,
            "note2.autorotate": !1,
            shape3d: Z,
            "shape3d.color": Ur,
            "shape3d.top.color": Z,
            "shape3d.bottom.color": Z,
            "shape3d.from.color": Z,
            "shape3d.to.color": Z,
            "shape3d.image": Z,
            "shape3d.top.image": Z,
            "shape3d.bottom.image": Z,
            "shape3d.from.image": Z,
            "shape3d.to.image": Z,
            "shape3d.light": !0,
            "shape3d.side": 0,
            "shape3d.side.from": Z,
            "shape3d.side.to": Z,
            "shape3d.smooth": Z,
            "shape3d.visible": !0,
            "shape3d.from.visible": !0,
            "shape3d.to.visible": !0,
            "shape3d.top.visible": !0,
            "shape3d.bottom.visible": !0,
            "shape3d.torus.radius": .17,
            "shape3d.resolution": 0,
            "shape3d.blend": Z,
            "shape3d.opacity": Z,
            "shape3d.reverse.flip": !1,
            "shape3d.reverse.color": vc,
            "shape3d.reverse.cull": !1,
            "shape3d.transparent": !1,
            "shape3d.uv.offset": Z,
            "shape3d.uv.scale": Z,
            "shape3d.top.uv.offset": Z,
            "shape3d.top.uv.scale": Z,
            "shape3d.bottom.uv.offset": Z,
            "shape3d.bottom.uv.scale": Z,
            "shape3d.from.uv.offset": Z,
            "shape3d.from.uv.scale": Z,
            "shape3d.to.uv.offset": Z,
            "shape3d.to.uv.scale": Z,
            "shape3d.top.cap": Z,
            "shape3d.bottom.cap": Z,
            "shape3d.start.angle": 0,
            "shape3d.sweep.angle": $,
            "shape3d.point.epsilon": 1e-6,
            "shape3d.discard.selectable": !0,
            "shape3d.top.discard.selectable": !0,
            "shape3d.bottom.discard.selectable": !0,
            "shape3d.from.discard.selectable": !0,
            "shape3d.to.discard.selectable": !0,
            "shape3d.scaleable": !0,
            "shape3d.reflector": !1,
            "shape3d.reflector.color": "rgb(128,128,128)",
            "shape3d.reflector.blur": 0,
            "shape3d.reflector.blur.ratio": 1,
            "shape3d.reflector.background": null,
            "shape3d.reflector.clip": .003,
            "texture.mipmap.max": Z,
            "texture.filter": Z,
            "texture.filter.min": Z,
            "texture.filter.mag": Z,
            "texture.wrap": Z,
            "points.image": Z,
            "points.color": "white",
            "points.transparent": !1,
            "points.size": 20,
            "points.opacity": 1,
            "all.light": !0,
            "all.visible": !0,
            "all.color": Ur,
            "all.image": Z,
            "all.blend": Z,
            "all.opacity": Z,
            "all.reverse.flip": !1,
            "all.reverse.color": vc,
            "all.reverse.cull": !1,
            "all.transparent": !1,
            "all.uv": Z,
            "all.uv.offset": Z,
            "all.uv.scale": Z,
            "all.discard.selectable": !0,
            mat: Z,
            "left.mat": Z,
            "right.mat": Z,
            "top.mat": Z,
            "bottom.mat": Z,
            "front.mat": Z,
            "back.mat": Z,
            "edge.source.anchor.elevation": Z,
            "edge.target.anchor.elevation": Z
        }, !0);
        var Gi, dp = !1,
            zf = [0, 0, 0, 0],
            Kc = function (E) {
                return E instanceof lf
            },
            bk = function (R) {
                return [R.x, R.e || 0, R.y]
            },
            Tr = function (Q, f, G) {
                for (var f = ns(f || 0), E = f[0], a = f[1], r = f[2]; G--;) Q.push(E, a, r)
            },
            Wo = function (T, z, y) {
                for (var z = ns(z || 0), S = z[0], $ = z[1], E = z[2], t = z[3]; y--;) T.push(S, $, E, t)
            },
            yp = function (F, a, W) {
                if (a)
                    for (var H, N, d, _ = a[0], f = a[1], g = a[2], O = a[4], T = a[5], e = a[6], G = a[8], S = a[9], r = a[10], q = a[12], l = a[13], Y = a[14], x = W.length, w = 0, w = 0; x > w; w += 3) H = W[w], N = W[w + 1], d = W[w + 2], F.push(_ * H + O * N + G * d + q, f * H + T * N + S * d + l, g * H + e * N + r * d + Y);
                else gc(F, W)
            },
            hh = function (F, W) {
                var r = W.s("light.intensity"),
                    m = ns(W.s(ep)),
                    t = m[0],
                    k = m[1],
                    v = m[2];
                1 !== r && (t *= r, k *= r, v *= r), F.push(t, k, v, W.s("light.disabled") ? 1 : 0)
            },
            nc = function (L, o) {
                var U = ts.for(o),
                    $ = U.directUniforms();
                $.uHeadlightRange = L._headlightRange, $.uHeadlightAmbientIntensity = L._headlightAmbientIntensity;
                var W = L._headlightIntensity,
                    j = ns(L._headlightColor);
                1 !== W && (j = [j[0] * W, j[1] * W, j[2] * W]), $.uHeadlightColor = [j[0], j[1], j[2], L._headlightDisabled ? 1 : 0];
                var P = L._59O,
                    v = L._spots,
                    F = L._dirs;
                if (P.length) {
                    var E = [],
                        N = [],
                        M = [];
                    P.forEach(function (t) {
                        hh(E, t), gc(N, L._transformPointToViewSpace(t.p3())), M.push(t.s("light.range"))
                    }), $.uPointColor = E, $.uPointRange = M, $.uPointPosition = N
                }
                if (v.length) {
                    var I = [],
                        n = [],
                        b = [],
                        c = [],
                        Q = [],
                        Z = [];
                    v.forEach(function (F) {
                        hh(I, F), gc(n, L._transformPointToViewSpace(F.p3())), gc(Q, L._transformDirectionToViewSpace(F.p3(), F.s("light.center"))), b.push(F.s("light.range")), c.push(k(F.s("light.angle") / 2)), Z.push(F.s("light.exponent"))
                    }), $.uSpotColor = I, $.uSpotRange = b, $.uSpotAngle = c, $.uSpotExponent = Z, $.uSpotPosition = n, $.uSpotDirection = Q
                }
                if (F.length) {
                    var H = [],
                        O = [];
                    F.forEach(function (K) {
                        hh(H, K), gc(O, L._transformDirectionToViewSpace(K.p3()))
                    }), $.uDirColor = H, $.uDirDirection = O
                }
            },
            vg = function (s, N) {
                return Math.max(s.getRotateMinPhi() + Wp, Math.min(s.getRotateMaxPhi() - Wp, N))
            },
            Hj = function () {
                return .05 + m() / 2
            },
            cc = function (n, P, S, h) {
                var C, A = n.getEye();
                return n.isOrtho() ? (C = fn(n.getCenter(), A), C[0] += h[0], C[1] += h[1], C[2] += h[2]) : C = A, hf(P, S, h, C)
            },
            hf = function (x, j, p, S) {
                var w = zc(x, j),
                    t = fn(S, p, !0),
                    P = zc(t, j);
                if (X(P) < Wp) return F;
                var b = (w - zc(p, j)) / P;
                return [p[0] + t[0] * b, p[1] + t[1] * b, p[2] + t[2] * b]
            },
            $l = function (S, p) {
                return {
                    x: 2 * S.x - p.x,
                    y: 2 * S.y - p.y
                }
            },
            pc = function (S, U, O, u) {
                var X, G;
                if (!S) return X = D(U.y - O.y, O.x - U.x), {
                    x: U.x + u * n(X),
                    y: U.y + u * k(X)
                };
                if (!O) return X = D(S.y - U.y, U.x - S.x), {
                    x: U.x + u * n(X),
                    y: U.y + u * k(X)
                };
                var L = fn([S.x, S.y, 0], [U.x, U.y, 0], !0),
                    b = fn([O.x, O.y, 0], [U.x, U.y, 0], !0),
                    H = -(L[0] + b[0]) / 2,
                    V = -(L[1] + b[1]) / 2,
                    N = w(H * H + V * V);
                if (Wp > N) return X = D(S.y - U.y, U.x - S.x), {
                    x: U.x + u * n(X),
                    y: U.y + u * k(X)
                };
                var g = S.x - U.x,
                    T = S.y - U.y,
                    x = O.x - U.x,
                    I = O.y - U.y,
                    f = w(g * g + T * T),
                    i = w(x * x + I * I);
                X = c(zc(L, b)) / 2, G = L[1] * b[0] - L[0] * b[1] > 0 ? -1 : 1, H /= N, V /= N;
                var $ = u / n(X),
                    l = q(f, i) / k(X);
                N = Math.min($, l);
                var F = {
                    x: U.x + G * N * H,
                    y: U.y + G * N * V
                };
                return O.b && $ > i / k(X) && (F.adjust = !0), F
            },
            ss = function (p) {
                var O = p[1],
                    $ = p[2],
                    W = p[3],
                    q = p[6],
                    Y = p[7],
                    M = p[11];
                p[1] = p[4], p[2] = p[8], p[3] = p[12], p[4] = O, p[6] = p[9], p[7] = p[13], p[8] = $, p[9] = q, p[11] = p[14], p[12] = W, p[13] = Y, p[14] = M
            },
            Od = function (G) {
                var c = G[0],
                    R = G[1],
                    Z = G[2],
                    L = G[3],
                    S = G[4],
                    $ = G[5],
                    X = G[6],
                    q = G[7],
                    K = G[8],
                    u = G[9],
                    U = G[10],
                    P = G[11],
                    k = G[12],
                    d = G[13],
                    Q = G[14],
                    y = G[15],
                    V = c * $ - R * S,
                    o = c * X - Z * S,
                    m = c * q - L * S,
                    j = R * X - Z * $,
                    T = R * q - L * $,
                    h = Z * q - L * X,
                    E = K * d - u * k,
                    Y = K * Q - U * k,
                    t = K * y - P * k,
                    s = u * Q - U * d,
                    B = u * y - P * d,
                    p = U * y - P * Q,
                    _ = V * p - o * B + m * s + j * t - T * Y + h * E;
                return _ ? (_ = 1 / _, G[0] = ($ * p - X * B + q * s) * _, G[1] = (Z * B - R * p - L * s) * _, G[2] = (d * h - Q * T + y * j) * _, G[3] = (U * T - u * h - P * j) * _, G[4] = (X * t - S * p - q * Y) * _, G[5] = (c * p - Z * t + L * Y) * _, G[6] = (Q * m - k * h - y * o) * _, G[7] = (K * h - U * m + P * o) * _, G[8] = (S * B - $ * t + q * E) * _, G[9] = (R * t - c * B - L * E) * _, G[10] = (k * T - d * m + y * V) * _, G[11] = (u * m - K * T - P * V) * _, G[12] = ($ * Y - S * s - X * E) * _, G[13] = (c * s - R * Y + Z * E) * _, G[14] = (d * o - k * j - Q * V) * _, G[15] = (K * j - u * o + U * V) * _, void 0) : F
            },
            bo = function (u, Z) {
                if (Z) {
                    var o = Z[0],
                        z = Z[1],
                        s = Z[2];
                    u[12] = u[0] * o + u[4] * z + u[8] * s + u[12], u[13] = u[1] * o + u[5] * z + u[9] * s + u[13], u[14] = u[2] * o + u[6] * z + u[10] * s + u[14], u[15] = u[3] * o + u[7] * z + u[11] * s + u[15]
                }
            },
            Bd = function (A, _) {
                if (_) {
                    var o = _[0],
                        z = _[1],
                        O = _[2];
                    A[0] = A[0] * o, A[1] = A[1] * o, A[2] = A[2] * o, A[3] = A[3] * o, A[4] = A[4] * z, A[5] = A[5] * z, A[6] = A[6] * z, A[7] = A[7] * z, A[8] = A[8] * O, A[9] = A[9] * O, A[10] = A[10] * O, A[11] = A[11] * O
                }
            },
            xo = function (l, E, N) {
                var o = E[0],
                    O = E[1],
                    x = E[2],
                    Z = E[3],
                    C = E[4],
                    y = E[5],
                    r = E[6],
                    $ = E[7],
                    T = E[8],
                    s = E[9],
                    j = E[10],
                    b = E[11],
                    m = E[12],
                    u = E[13],
                    P = E[14],
                    Q = E[15],
                    W = N[0],
                    f = N[1],
                    w = N[2],
                    H = N[3];
                return l[0] = W * o + f * C + w * T + H * m, l[1] = W * O + f * y + w * s + H * u, l[2] = W * x + f * r + w * j + H * P, l[3] = W * Z + f * $ + w * b + H * Q, W = N[4], f = N[5], w = N[6], H = N[7], l[4] = W * o + f * C + w * T + H * m, l[5] = W * O + f * y + w * s + H * u, l[6] = W * x + f * r + w * j + H * P, l[7] = W * Z + f * $ + w * b + H * Q, W = N[8], f = N[9], w = N[10], H = N[11], l[8] = W * o + f * C + w * T + H * m, l[9] = W * O + f * y + w * s + H * u, l[10] = W * x + f * r + w * j + H * P, l[11] = W * Z + f * $ + w * b + H * Q, W = N[12], f = N[13], w = N[14], H = N[15], l[12] = W * o + f * C + w * T + H * m, l[13] = W * O + f * y + w * s + H * u, l[14] = W * x + f * r + w * j + H * P, l[15] = W * Z + f * $ + w * b + H * Q, l
            },
            _g = function (f, L, d, r) {
                var U, M, Z, m, A, G, K, T, j, D, Q = L[0],
                    l = L[1],
                    _ = L[2],
                    a = r[0],
                    F = r[1],
                    B = r[2],
                    W = d[0],
                    i = d[1],
                    y = d[2];
                return X(Q - W) < Wp && X(l - i) < Wp && X(_ - y) < Wp ? yi(f) : (K = Q - W, T = l - i, j = _ - y, D = 1 / w(K * K + T * T + j * j), K *= D, T *= D, j *= D, U = F * j - B * T, M = B * K - a * j, Z = a * T - F * K, D = w(U * U + M * M + Z * Z), D ? (D = 1 / D, U *= D, M *= D, Z *= D) : (U = 0, M = 0, Z = 0), m = T * Z - j * M, A = j * U - K * Z, G = K * M - T * U, D = w(m * m + A * A + G * G), D ? (D = 1 / D, m *= D, A *= D, G *= D) : (m = 0, A = 0, G = 0), f[0] = U, f[1] = m, f[2] = K, f[3] = 0, f[4] = M, f[5] = A, f[6] = T, f[7] = 0, f[8] = Z, f[9] = G, f[10] = j, f[11] = 0, f[12] = -(U * Q + M * l + Z * _), f[13] = -(m * Q + A * l + G * _), f[14] = -(K * Q + T * l + j * _), f[15] = 1, f)
            },
            We = function (Y, x, L, i, j) {
                var E = 1 / R(x / 2),
                    B = 1 / (i - j);
                return Y[0] = E / L, Y[1] = 0, Y[2] = 0, Y[3] = 0, Y[4] = 0, Y[5] = E, Y[6] = 0, Y[7] = 0, Y[8] = 0, Y[9] = 0, Y[10] = (j + i) * B, Y[11] = -1, Y[12] = 0, Y[13] = 0, Y[14] = 2 * j * i * B, Y[15] = 0, Y
            },
            lk = function (R, w, r, l, a, K, b) {
                var M = 1 / (w - r),
                    S = 1 / (l - a),
                    n = 1 / (K - b);
                return R[0] = -2 * M, R[1] = 0, R[2] = 0, R[3] = 0, R[4] = 0, R[5] = -2 * S, R[6] = 0, R[7] = 0, R[8] = 0, R[9] = 0, R[10] = 2 * n, R[11] = 0, R[12] = (w + r) * M, R[13] = (a + l) * S, R[14] = (b + K) * n, R[15] = 1, R
            },
            _p = function (N, B) {
                var l = B[0],
                    q = B[1],
                    M = B[2],
                    k = B[3],
                    Y = l * l + q * q + M * M + k * k,
                    Q = Y ? 1 / Y : 0;
                return N[0] = -l * Q, N[1] = -q * Q, N[2] = -M * Q, N[3] = k * Q, N
            },
            Hg = function (r, f) {
                var I = f[0] + f[5] + f[10],
                    Z = 0;
                return I > 0 ? (Z = 2 * Math.sqrt(I + 1), r[3] = .25 * Z, r[0] = (f[6] - f[9]) / Z, r[1] = (f[8] - f[2]) / Z, r[2] = (f[1] - f[4]) / Z) : f[0] > f[5] & f[0] > f[10] ? (Z = 2 * Math.sqrt(1 + f[0] - f[5] - f[10]), r[3] = (f[6] - f[9]) / Z, r[0] = .25 * Z, r[1] = (f[1] + f[4]) / Z, r[2] = (f[8] + f[2]) / Z) : f[5] > f[10] ? (Z = 2 * Math.sqrt(1 + f[5] - f[0] - f[10]), r[3] = (f[8] - f[2]) / Z, r[0] = (f[1] + f[4]) / Z, r[1] = .25 * Z, r[2] = (f[6] + f[9]) / Z) : (Z = 2 * Math.sqrt(1 + f[10] - f[0] - f[5]), r[3] = (f[1] - f[4]) / Z, r[0] = (f[8] + f[2]) / Z, r[1] = (f[6] + f[9]) / Z, r[2] = .25 * Z), r
            },
            dq = function (U, H, v) {
                var E = H[0],
                    S = H[1],
                    V = H[2],
                    r = H[3],
                    M = E + E,
                    f = S + S,
                    X = V + V,
                    C = E * M,
                    J = E * f,
                    k = E * X,
                    Q = S * f,
                    b = S * X,
                    d = V * X,
                    y = r * M,
                    m = r * f,
                    z = r * X;
                return U[0] = 1 - (Q + d), U[1] = J + z, U[2] = k - m, U[3] = 0, U[4] = J - z, U[5] = 1 - (C + d), U[6] = b + y, U[7] = 0, U[8] = k + m, U[9] = b - y, U[10] = 1 - (C + Q), U[11] = 0, U[12] = v[0], U[13] = v[1], U[14] = v[2], U[15] = 1, U
            },
            wp = function (F, E) {
                if (F.vr.enable) {
                    var O = F.vr.getViewMatrix(E);
                    if (O) return O
                }
                return _g(E ? E : kn(), F._eye, F._center, F._up)
            },
            Mc = function (d, i) {
                if (d.vr.enable) {
                    var r = d.vr.getProjectMatrix();
                    if (r) return r
                }
                if (!i && d._computedProjectMatrix) return Ql(d._computedProjectMatrix);
                var f = d.getAspect(),
                    n = d._near,
                    w = d._far,
                    E = kn();
                if (d._ortho) {
                    var J = d._orthoWidth / 2,
                        q = J / f;
                    lk(E, -J, J, -q, q, n, w)
                } else We(E, d._fovy, f, n, w);
                return E
            },
            Gb = function (q, i) {
                if (!q) return F;
                var j = 0,
                    N = 1,
                    y = 2,
                    b = [],
                    k = 0,
                    _ = q.length,
                    o = _ / 3;
                if (i) {
                    for (; _ > k; k++) b[k] = 0;
                    for (k = 0; k < i.length; k += 3) {
                        var e = [],
                            W = [],
                            f = [];
                        e[j] = q[3 * i[k + 1] + j] - q[3 * i[k] + j], e[N] = q[3 * i[k + 1] + N] - q[3 * i[k] + N], e[y] = q[3 * i[k + 1] + y] - q[3 * i[k] + y], W[j] = q[3 * i[k + 2] + j] - q[3 * i[k + 1] + j], W[N] = q[3 * i[k + 2] + N] - q[3 * i[k + 1] + N], W[y] = q[3 * i[k + 2] + y] - q[3 * i[k + 1] + y], f[j] = e[N] * W[y] - e[y] * W[N], f[N] = e[y] * W[j] - e[j] * W[y], f[y] = e[j] * W[N] - e[N] * W[j];
                        for (var S = 0; 3 > S; S++) b[3 * i[k + S] + j] += f[j], b[3 * i[k + S] + N] += f[N], b[3 * i[k + S] + y] += f[y]
                    }
                } else
                    for (k = 0; o > k; k += 3) {
                        var e = [],
                            W = [],
                            f = [];
                        e[j] = q[3 * (k + 1) + j] - q[3 * k + j], e[N] = q[3 * (k + 1) + N] - q[3 * k + N], e[y] = q[3 * (k + 1) + y] - q[3 * k + y], W[j] = q[3 * (k + 2) + j] - q[3 * (k + 1) + j], W[N] = q[3 * (k + 2) + N] - q[3 * (k + 1) + N], W[y] = q[3 * (k + 2) + y] - q[3 * (k + 1) + y], f[j] = e[N] * W[y] - e[y] * W[N], f[N] = e[y] * W[j] - e[j] * W[y], f[y] = e[j] * W[N] - e[N] * W[j];
                        for (var S = 0; 3 > S; S++) b[3 * (k + S) + j] = f[j], b[3 * (k + S) + N] = f[N], b[3 * (k + S) + y] = f[y]
                    }
                for (k = 0; _ > k; k += 3) {
                    var Q = [];
                    Q[j] = b[k + j], Q[N] = b[k + N], Q[y] = b[k + y];
                    var X = w(Q[j] * Q[j] + Q[N] * Q[N] + Q[y] * Q[y]);
                    0 === X && (X = Wp), Q[j] = Q[j] / X, Q[N] = Q[N] / X, Q[y] = Q[y] / X, b[k + j] = Q[j], b[k + N] = Q[N], b[k + y] = Q[y]
                }
                return new fk(b)
            },
            rg = function (w, b, M, x) {
                if (M || (M = w.createTexture()), b) {
                    var r = w.TEXTURE_2D,
                        u = w.REPEAT,
                        I = w.CLAMP_TO_EDGE,
                        A = w.TEXTURE_MIN_FILTER;
                    x = x || Xn;
                    var V = x.minFilter || x.filter || w.LINEAR,
                        t = x.magFilter || x.filter || w.LINEAR;
                    w.activeTexture(w.TEXTURE0), an(w, M), w.texImage2D(r, 0, w.RGBA, w.RGBA, w.UNSIGNED_BYTE, b), Lr(w, w.TEXTURE_MAG_FILTER, t);
                    var v = b.naturalWidth || b.width,
                        p = b.naturalHeight || b.height;
                    Rc.isPOT(v) && Rc.isPOT(p) && !x.clampToEdge && !b.clampToEdge ? (Lr(w, w.TEXTURE_WRAP_S, u), Lr(w, w.TEXTURE_WRAP_T, u), Lr(w, A, V === w.NEAREST ? w.NEAREST_MIPMAP_NEAREST : w.LINEAR_MIPMAP_LINEAR), x.mipmapMaxLevel !== Z && Lr(w, w.TEXTURE_MAX_LEVEL, x.mipmapMaxLevel), w.generateMipmap(r)) : (Lr(w, w.TEXTURE_WRAP_S, I), Lr(w, w.TEXTURE_WRAP_T, I), Lr(w, A, V)), an(w, F)
                }
                return M
            },
            ze = function (j, r) {
                var J = new Uint8Array(4);
                return r = r || j.createTexture(), j.activeTexture(j.TEXTURE0), an(j, r), Lr(j, j.TEXTURE_MIN_FILTER, j.LINEAR), j.texImage2D(j.TEXTURE_2D, 0, j.RGBA, 1, 1, 0, j.RGBA, j.UNSIGNED_BYTE, J), r
            },
            Gp = function (K, W) {
                var u = new Uint8Array(4);
                return W = W || K.createTexture(), K.activeTexture(K.TEXTURE0), K.bindTexture(K.TEXTURE_CUBE_MAP, W), K.texParameteri(K.TEXTURE_CUBE_MAP, K.TEXTURE_MAG_FILTER, K.LINEAR), K.texParameteri(K.TEXTURE_CUBE_MAP, K.TEXTURE_MIN_FILTER, K.LINEAR), K.texImage2D(K.TEXTURE_CUBE_MAP_POSITIVE_X + 0, 0, K.RGBA, 1, 1, 0, K.RGBA, K.UNSIGNED_BYTE, u), K.texImage2D(K.TEXTURE_CUBE_MAP_POSITIVE_X + 1, 0, K.RGBA, 1, 1, 0, K.RGBA, K.UNSIGNED_BYTE, u), K.texImage2D(K.TEXTURE_CUBE_MAP_POSITIVE_X + 2, 0, K.RGBA, 1, 1, 0, K.RGBA, K.UNSIGNED_BYTE, u), K.texImage2D(K.TEXTURE_CUBE_MAP_POSITIVE_X + 3, 0, K.RGBA, 1, 1, 0, K.RGBA, K.UNSIGNED_BYTE, u), K.texImage2D(K.TEXTURE_CUBE_MAP_POSITIVE_X + 4, 0, K.RGBA, 1, 1, 0, K.RGBA, K.UNSIGNED_BYTE, u), K.texImage2D(K.TEXTURE_CUBE_MAP_POSITIVE_X + 5, 0, K.RGBA, 1, 1, 0, K.RGBA, K.UNSIGNED_BYTE, u), W
            },
            Vo = function (y) {
                y._26I && y._prg && (y._26I.deleteProgram(y._prg), y._prg = F)
            },
            Pl = function (I, E, $, k) {
                var Y = I.createShader($);
                return I.shaderSource(Y, k), I.compileShader(Y), I.attachShader(E, Y), Y
            },
            el = function (A) {
                return A.createBuffer()
            },
            an = function (f, m) {
                f.bindTexture(f.TEXTURE_2D, m || f._emptyTexture)
            },
            Lr = function (K, E, j) {
                K.texParameteri(K.TEXTURE_2D, E, j)
            },
            Ik = function (O, C) {
                var L = ts.for(O).directState();
                L.polygonOffset.enabled = !0, L.polygonOffset.value = C
            },
            rd = function (d) {
                var L = ts.for(d).directState();
                L.polygonOffset.enabled = !1
            },
            qe = function (n, E) {
                if (E) {
                    var V = ts.for(n).directState();
                    V.color.clear = ns(E)
                }
            },
            _k = function (k) {
                var R = ts.for(k),
                    N = R.directUniforms(),
                    X = R.directAttribs();
                N.uFix = !0, X.aNormal = !1
            },
            On = function (B) {
                var o = ts.for(B),
                    f = o.directUniforms();
                o.directAttribs(), f.uFix = !1
            },
            Ll = function (R, l, v, i, o, C, e, W) {
                var D = ts.for(R),
                    I = D.directState(),
                    K = D.directUniforms();
                R._picking || (v ? (K.uBlend = !0, K.uBlendColor = v) : K.uBlend = !1, K.uLight = i == F ? !0 : i, Bp(o) && 1 !== o && (K.uPartOpacity = o), K.uReverseFlip = C == F ? !1 : C, K.uFixPickReverseColor = e || vc), I.cullFace.enabled = W ? !0 : !1
            },
            ol = function (N) {
                if (!N._picking) {
                    var v = ts.for(N),
                        C = v.directUniforms();
                    C.uPartOpacity = 1
                }
            },
            bi = function () {
                var a = [0, 0, 1, 1];
                return function (i, $, T, l, Y, D, Q, r, o) {
                    var v = ts.for(i),
                        L = v.directUniforms(),
                        z = v.directAttribs();
                    return T ? (L.uTexture = !0, L.uDiscardSelectable = El(l) ? l : !0, z.aUv = Sl(i, Y, D, F, 2), o ? (L.uBlendTexture = !0, L.uBlendSampler = o) : (L.uBlendTexture = !1, L.uBlendSampler = i._emptyBlendTexture), L.uSampler = T, Q ? (a[0] = Q[0], a[1] = Q[1]) : (a[0] = 0, a[1] = 0), r ? (a[2] = r[0], a[3] = r[1]) : (a[2] = 1, a[3] = 1), L.uOffsetScale = a, void 0) : (L.uSampler = i._emptyTexture, L.uBlendSampler = i._emptyBlendTexture, void 0)
                }
            }(),
            Jf = function (P, L, W) {
                var X = ts.for(P),
                    M = X.directUniforms(),
                    s = X.directAttribs();
                P.activeTexture(P.TEXTURE0), an(P, F), P.activeTexture(P.TEXTURE1), an(P, F), W && (s.aUv = !1, M.uTexture = !1, M.uSampler = P._emptyTexture, M.uBlendTexture = !1, M.uBlendSampler = P._emptyBlendTexture)
            },
            ck = function (L, w, B, E, g, W) {
                var z = ts.for(L),
                    M = z.directUniforms(),
                    _ = z.directAttribs();
                !B || Uq || Bj || L.lineWidth(B), E && !L._picking && (M.uFixPickReverseColor = E), g && (_.aPosition = Sl(L, g, W, F))
            },
            ie = function (e, T, V, u) {
                Gi && (u = e[Gi]), e.drawArrays(u == F ? e.TRIANGLES : u, T, V);
                var p = e._renderInfo;
                p && (p.calls++, p.vertices += V, (u == F || u === e.TRIANGLES) && (p.faces += V / 3), u === e.LINES && (p.lines += V / 2), u === e.POINTS && (p.points += V))
            },
            os = function (j, R, O, S, v) {
                Gi && (S = j[Gi]), j.drawElements(S == F ? j.TRIANGLES : S, O, v == F ? j.UNSIGNED_SHORT : v, R == F ? 0 : 2 * R);
                var H = j._renderInfo;
                H && (H.calls++, H.vertices += O, (S == F || S === j.TRIANGLES) && (H.faces += O / 3), S === j.LINES && (H.lines += O / 2), S === j.POINTS && (H.points += O))
            },
            bm = function (m, P, $) {
                var r = m.ARRAY_BUFFER;
                return m.bindBuffer(r, P), $ && m.bufferData(r, $, m.STATIC_DRAW), P
            },
            Sl = function ($, v, N, u, D) {
                return N ? rk($, $.ARRAY_BUFFER, v, N) : bm($, v, N, u, D)
            },
            eo = function (L, K, X) {
                var Q = L.ELEMENT_ARRAY_BUFFER;
                L.bindBuffer(Q, K), X && L.bufferData(Q, X, L.STATIC_DRAW)
            },
            ym = function (B, U, h) {
                rk(B, B.ELEMENT_ARRAY_BUFFER, U, h)
            },
            rk = function (f, Y, Q, U) {
                var E = U._bufId;
                E || (E = U._bufId = O.Math.generateIncreasingID());
                var Q, b = f._bufPool;
                return (Q = b[E]) && Q._buf ? f.bindBuffer(Y, Q._buf) : (Q = b[E] = {
                    _buf: el(f)
                }, f.bindBuffer(Y, Q._buf), f.bufferData(Y, U, f.STATIC_DRAW)), Q._fid = f._renderInfo.frame, Q._buf
            },
            Pr = function (Z, D) {
                D != F && D >= 0 && Z.enableVertexAttribArray(D)
            },
            Rg = function (y, P) {
                P != F && P >= 0 && y.disableVertexAttribArray(P)
            },
            Gf = function (e, i) {
                var j = e.getGL();
                e._prg;
                var Y = ts.for(j),
                    U = Y.directUniforms();
                Y.directAttribs(), e._7O = e._8O.pop(), i && (U.uMVMatrix = e._7O, e._6O = i, U.uNMatrix = i)
            },
            Rq = function (Q, F) {
                return F || (F = kn()), Vd(F, Q), Od(F), ss(F), F
            },
            gk = function (I, Y) {
                var D = I.getGL(),
                    g = I._7O,
                    r = ts.for(D),
                    N = r.directUniforms();
                Y ? (I._8O.push(Ql(g)), N.uMMatrix = Y, xo(g, g, Y), I._7O = g) : N.uMMatrix = Hd, N.uMVMatrix = g, N.uNMatrix = Rq(g, I._6O)
            },
            is = {
                body: 0,
                label: 1,
                label2: 2,
                note: 3,
                note2: 4,
                symbol: 5
            },
            wc = 10,
            gm = function (f, Z, n, D, k, _) {
                var Y;
                if (n) {
                    var K = D._pickId;
                    K || (K = D._pickId = Z._pickIdUsed, Z._pickIdUsed += wc);
                    var c, y = is[k];
                    if (null != y) c = K + y;
                    else {
                        var t = D._pickExtraPartMap;
                        t || (t = D._pickExtraPartMap = {}), (c = t[k]) || (c = t[k] = Z._pickIdUsed++)
                    }
                    Z[c] || (Z[c] = {
                        data: D,
                        part: k
                    }), Y = rl(c)
                } else Y = zf; if (!_) {
                    var h = ts.for(f),
                        u = h.directUniforms();
                    u.uFixPickReverseColor = Y
                }
                return Y
            },
            Hb = function (_, x, J) {
                "target" !== J && (J = "source");
                var y = "target" === J ? x.getTargetAgent() : x.getSourceAgent(),
                    N = "edge." + J + ".";
                if (Fq(y)) {
                    var B = x.s(N + "anchor.x"),
                        G = x.s(N + "anchor.elevation"),
                        M = x.s(N + "anchor.y"),
                        S = sj(y, _.getMat(y)),
                        v = y.getAnchor3d();
                    return Td([(B === Z ? .5 : B) - v.x, (G === Z ? .5 : G) - v.y, (M === Z ? .5 : M) - v.z], S)
                }
                var R = x.s(N + "index"),
                    m = _.getData3dUI(y);
                if (!m.info || !m.info.list) return !1;
                if (R >= 0) {
                    var q, b, W, p, h, T = m.info._lastPointsSegments,
                        L = T.points,
                        o = T.segments,
                        c = -1,
                        Q = -1;
                    for (W = 0, p = o ? o.length : L.length; p > W; W++) {
                        if (b = o ? o.get(W) : 1, 3 === b) h = 2;
                        else if (4 === b) h = 3;
                        else {
                            if (5 === b) continue;
                            h = 1
                        } if (c += h, Q++, Q === R) {
                            q = L.get(c);
                            break
                        }
                    }
                    return q || (q = L.get(L.length - 1)), [q.x, q.e || 0, q.y]
                }
                var K = x.s(N + "percent") || .5;
                if (K = Math.max(0, Math.min(K, 1)), !m || !m.getCache) return !1;
                var w = m.getCache(),
                    p = w[w.length - 1].length,
                    T = _.getLineOffset(y, K * p),
                    t = T.point;
                return [t.x, t.y, t.z]
            },
            Ep = function () {
                var T = {
                    center: function (U, E, y, B, e) {
                        var f = -E[1] / 2,
                            x = {
                                x: -E[0] / 2,
                                y: f,
                                width: E[0],
                                height: E[1]
                            },
                            u = Re(U, x, y);
                        return [u.x + B, -u.y - e, Hj()]
                    }, front: function (n, S, C, h, y) {
                        var d = -S[1] / 2,
                            f = {
                                x: -S[0] / 2,
                                y: d,
                                width: S[0],
                                height: S[1]
                            },
                            m = Re(n, f, C);
                        return [m.x + h, -m.y - y, S[2] / 2 + Hj()]
                    }, back: function (m, T, f, X, p) {
                        var K = -T[0] / 2,
                            k = -T[1] / 2,
                            x = {
                                x: K,
                                y: k,
                                width: T[0],
                                height: T[1]
                            },
                            r = Re(m, x, f);
                        return [-r.x - X, -r.y - p, -T[2] / 2 - Hj()]
                    }, left: function (y, U, H, o, W) {
                        var B = -U[1] / 2,
                            E = {
                                x: -U[2] / 2,
                                y: B,
                                width: U[2],
                                height: U[1]
                            },
                            l = Re(y, E, H);
                        return [-U[0] / 2 - Hj(), -l.y - W, l.x + o]
                    }, right: function (z, d, T, e, R) {
                        var B = -d[2] / 2,
                            K = -d[1] / 2,
                            o = {
                                x: B,
                                y: K,
                                width: d[2],
                                height: d[1]
                            },
                            J = Re(z, o, T);
                        return [d[0] / 2 + Hj(), -J.y - R, -J.x - e]
                    }, top: function (H, P, V, E, h) {
                        var o = {
                            x: -P[0] / 2,
                            y: -P[2] / 2,
                            width: P[0],
                            height: P[2]
                        },
                            W = Re(H, o, V);
                        return [W.x + E, P[1] / 2 + Hj(), W.y + h]
                    }, bottom: function (u, y, l, e, L) {
                        var P = -y[2] / 2,
                            Z = {
                                x: -y[0] / 2,
                                y: P,
                                width: y[0],
                                height: y[2]
                            },
                            M = Re(u, Z, l);
                        return [M.x + e, -y[1] / 2 - Hj(), -M.y - L]
                    }
                };
                return function (w, E, K, b, m, l) {
                    return T[b](w, E, K, m || 0, l || 0)
                }
            }(),
            Te = function (v, P, z, K, t, d, H, D, S, J) {
                if (t && (P[0] += t[0], P[1] += t[1], P[2] += t[2]), bo(v, z), D) {
                    var b = kn();
                    if (Cl(b, S, J), Td(P, b), bo(v, P), v.auto = D, v.pos = Td([0, 0, 0], v), d) {
                        var E = v.mat2 = kn();
                        Cl(E, d, H)
                    }
                } else Cl(v, S, J), bo(v, P), K === nq ? ah(v, -N) : K === fm ? ah(v, N) : K === $c ? uh(v, -N) : K === Kd ? uh(v, N) : K === Qq && ah(v, W), Cl(v, d, H);
                return v
            },
            yn = function ($, s) {
                var J = s.auto,
                    z = s.mat2,
                    E = $.gv;
                if (J) {
                    var t, o = kn(),
                        W = [0, 0, 0, 0];
                    t = "string" == typeof J ? [J.indexOf("x") < 0 ? E._eye[0] : E._center[0], J.indexOf("y") < 0 ? E._eye[1] : E._center[1], J.indexOf("z") < 0 ? E._eye[2] : E._center[2]] : E._eye, Hg(W, _g(kn(), t, E._center, E._up)), dq(o, _p(W, W), s.pos), z && xo(o, o, z), gk(E, o)
                } else gk(E, s)
            },
            ud = function (c, D, C, t, O) {
                var A = c.s,
                    X = c.gv,
                    Z = X.getGL(),
                    P = X._prg,
                    I = X._buffer,
                    Y = X._1O,
                    E = ts.for(Z),
                    y = E.directAttribs();
                rg(Z, xm, Y), yn(c, C), Ll(Z, P, A(D + ".blend"), A(D + ".light"), A(D + ".opacity"), A(D + ".reverse.flip"), A(D + ".reverse.color"), A(D + ".reverse.cull")), bi(Z, P, Y, O, I.uv, Vj), y.aPosition = Sl(Z, I.vs, t, F), y.aNormal = Sl(Z, I.ns, Lh, F), ym(Z, I.is, ar), os(Z, 0, ar.length), Jf(Z, P, Y), ol(Z, P), Gf(X)
            },
            _e = function (p, E, F) {
                var V = p.gv,
                    K = p.data,
                    h = p[E] = {
                        blend: V.getBodyColor(K) || V.getFaceBlend(K, E),
                        light: V.getFaceLight(K, E),
                        color: V.getFaceColor(K, E),
                        opacity: V.getFaceOpacity(K, E),
                        transparent: V.getFaceTransparent(K, E),
                        reverseFlip: V.getFaceReverseFlip(K, E),
                        reverseColor: V.getFaceReverseColor(K, E),
                        reverseCull: V.getFaceReverseCull(K, E),
                        texture: V.getFaceImage(K, E),
                        blendTexture: V.getFaceBlendImage(K, E),
                        discardSelectable: V.getFaceDiscardSelectable(K, E)
                    };
                if ("csg" !== E) {
                    h.uv = V.getFaceUv(K, E) || F && F[E + "Uv"], h.uvScale = V.getFaceUvScale(K, E) || F && F[E + "UvScale"], h.uvOffset = V.getFaceUvOffset(K, E) || F && F[E + "UvOffset"];
                    var z = V.getFaceMat(K, E);
                    if (z) {
                        var D = sj(K, z);
                        K.appendAnchorMatrix3d(D), h.mat = D
                    }
                }
                return h
            },
            io = function (E, h, N, T, j) {
                var W = E[T];
                if (W) {
                    if (!j(W.transparent)) return;
                    var R = E.data,
                        w = E.gv,
                        U = w._buffer,
                        O = w.getTexture(W.texture, R, T),
                        d = w.getTexture(W.blendTexture, R),
                        u = ts.for(h),
                        K = u.directUniforms(),
                        f = u.directAttribs();
                    bi(h, N, O, W.discardSelectable, U.uv, W.tuv, W.uvOffset, W.uvScale, d), Ll(h, N, W.blend, W.light, W.opacity, W.reverseFlip, W.reverseColor, W.reverseCull), W.cs && !w._batchColorDisabled ? (K.uBatchColor = !0, f.aBatchColor = Sl(h, U.batchColor, W.cs, N.aBatchColor, 4)) : K.uDiffuse = W.color || z["color.empty"], f.aPosition = Sl(h, U.vs, W.vs, F), f.aNormal = Sl(h, U.ns, W.ns, F), ie(h, 0, W.vs.length / 3), W.cs && !w._batchColorDisabled && (K.uBatchColor = !1, Rg(h, N.aBatchColor)), ol(h, N), Jf(h, N, O)
                }
            },
            $p = function (o, p, h) {
                ip(o) ? o.forEach(function (N) {
                    $p(N, p, h)
                }) : dk(o) ? $p(bf(p, o), p, h) : xl(o) ? o.shape3d ? $p(o.shape3d, p, h) : h.push(o) : h.push(o)
            },
            mb = function (s, m, t, G, H, S) {
                var Z, J, V, b, y, Y, I, E, h, i, x, W = [G - m, H - t],
                    Q = s ? s.length : 0;
                for (V = 0; Q > V; V++) {
                    for (b = 2, Z = s[V], y = Z[0], Y = Z[1]; b + 1 < Z.length;) {
                        if (I = Z[b], E = Z[b + 1], J = ti(m, t, G, H, y, Y, I, E, !0)) {
                            h = [I - y, E - Y], i = En(h), h[0] /= i, h[1] /= i, i = zc(W, h), i = i > 0 ? S : -S, x = [h[0] * i, h[1] * i];
                            break
                        }
                        y = I, Y = E, b += 2
                    }
                    if (x) break
                }
                if (x)
                    for (G = m + x[0], H = t + x[1], V = 0; Q > V; V++)
                        for (b = 2, Z = s[V], y = Z[0], Y = Z[1]; b + 1 < Z.length;) {
                            if (I = Z[b], E = Z[b + 1], J = ti(m, t, G, H, y, Y, I, E, !0)) return [0, 0];
                            y = I, Y = E, b += 2
                        }
                return x ? x : [G - m, H - t]
            },
            Mm = function (V) {
                return "nearest" === V ? Ah.NEAREST : "linear" === V ? Ah.LINEAR : V
            },
            Eh = O.graph3d = {},
            Dn = function (W, T, z) {
                yc(Y + ".graph3d." + W, T, z)
            },
            //修改加密
            Ae = "~<yfusfw!+!yjsubNQv!>!opjujtpQ`mh!gjeof$!<*1/2!-opjujtpQb)5dfw!+!yjsubNNv!+!yjsubNxpebit!>!esppDxpebit!QBNXPEBIT`FTV!gfegj$!!gjeof$!~<fdobutjEfojMb!>!fdobutjEfojMw|*itbEv)gj!ITBE!gfegj$!!gjeof$!~<ttfouihjsCidubCb!>!ttfouihjsCidubCw|*ttfouihjsCidubCv)gj!TTFOUIHJSCIDUBC!gfegj$!!gjeof$!~<eofmCidubCb!>!eofmCidubCw|*eofmCidubCv)gj!EOFMCIDUBC!gfegj$!!gjeof$!~<spmpDidubCb!>!spmpDidubCw|*spmpDidubCv)gj!SPMPDIDUBC!gfegj$!~<wVb!>!wVs|*fsvuyfUeofmCv)gj~<x{/fmbdTuftggPv!+!wVb!,!zy/fmbdTuftggPv!>!wVw|*fsvuyfUv)gj<*opjujtpQb)4dfw!>!opjujtpQw~<**1/2!-opjujtpQb)5dfw!+!yjsubNNv)4dfw!>!emspXw<*yfusfw)4dfw!>!yfusfWw<**1/2!-mbnspOb)5dfw!+!yjsubNOv)4dfw!>!mbnspOw|*ldjQva!%%!yjGva)gj<*1/2!-opjujtpQb)5dfw!+!yjsubNWNv!>!yfusfw!5dfw|!*ejpw)ojbn!ejpw!gjeof$!<esppDxpebit!5dfw!hojzsbw<yjsubNxpebit!5ubn!nspgjov!QBNXPEBIT`FTV!gfegj$!!gjeof$!<fdobutjEfojMw!ubpmg!hojzsbw<fdobutjEfojMb!ubpmg!fuvcjsuub<itbEv!mppc!nspgjov!ITBE!gfegj$!!gjeof$!<^UPQT`YBN]opjudfsjEupqTv!4dfw!nspgjov<^UPQT`YBN]opjujtpQupqTv!4dfw!nspgjov<^UPQT`YBN]spmpDupqTv!5dfw!nspgjov!1!?!UPQT`YBN!gj$!!gjeof$!<^UOJPQ`YBN]opjujtpQuojpQv!4dfw!nspgjov<^UOJPQ`YBN]spmpDuojpQv!5dfw!nspgjov!1!?!UOJPQ`YBN!gj$!!gjeof$!<^SJE`YBN]opjudfsjEsjEv!4dfw!nspgjov<^SJE`YBN]spmpDsjEv!5dfw!nspgjov!1!?!SJE`YBN!gj$!!gjeof$!<eofmCidubCw!4dfw!hojzsbw<eofmCidubCb!4dfw!fuvcjsuub<eofmCidubCv!mppc!nspgjov!EOFMCIDUBC!gfegj$!!gjeof$!<ttfouihjsCidubCw!ubpmg!hojzsbw<ttfouihjsCidubCb!ubpmg!fuvcjsuub<ttfouihjsCidubCv!mppc!nspgjov!TTFOUIHJSCIDUBC!gfegj$!!gjeof$!<spmpDidubCw!5dfw!hojzsbw<spmpDidubCb!5dfw!fuvcjsuub<spmpDidubCv!mppc!nspgjov!SPMPDIDUBC!gfegj$!<opjujtpQw!4dfw!hojzsbw<emspXw!4dfw!hojzsbw<yfusfWw!4dfw!hojzsbw<mbnspOw!4dfw!hojzsbw<yjGv!mppc!nspgjov<ldjQv!mppc!nspgjov<yjsubNxfjWv!5ubn!nspgjov<yjsubNOv!5ubn!nspgjov<yjsubNQv!5ubn!nspgjov<yjsubNNv!5ubn!nspgjov<yjsubNWNv!5ubn!nspgjov<opjujtpQb!4dfw!fuvcjsuub<mbnspOb!4dfw!fuvcjsuub<wVs!3dfw!hojzsbw<wVw!3dfw!hojzsbw<wVb!3dfw!fuvcjsuub<fmbdTuftggPv!5dfw!nspgjov<fsvuyfUeofmCv!mppc!nspgjov<fsvuyfUv!mppc!nspgjov!YJGFSQ^#CBRBEJxTT87hJFI,,bX1XrIwcn3UM{ZeZ,M6HEN6nLxe2Z72s2:3johr6foKrpqwxNKYkdbJ2CN[mBbf[wXU,T0oGuSEd190ohLZkEn8IuCe[OHoWeKz:Sf,VS7xdSLw23W1YJLU:jdv2{hiDbhDzNNEh9tp3xsuEp94Sl4c3wRzqwShMDRhCLRjCDEBOH5BBVRBCFRE4cJTHrTDH1BNgHJN",
            Sp = "~~<eJ!>!spmpDhbsG`mh~<spmpDsfmqnbTwv!>+!eJ<*wVs!-sfmqnbTeofmCv)E3fsvuyfu!>!spmpDsfmqnbTwv!5dfw|!*fsvuyfUeofmCv)!gj!!gjeof$!~<ttfouihjsCidubCw!>+!chs/eJ!!!|*ttfouihjsCidubCv)gj!TTFOUIHJSCIDUBC!gfegj$!~<ttfouihjsCv!>+!chs/eJ!!!|*1/2!>a!ttfouihjsCv)gj~~<zujdbqPusbQv!>+!b/eJ!!!|*1/2!>a!zujdbqPusbQv)gj~!gjeof$!~<zujwjudfmgfSv!+!{zy/spmpDwof!>,!chs/eJ<*!spmpDwof!)sbfojMpUmfyfUqbNwof!>!spmpDwof<*!*!{z/dfWudfmgfs!-y/dfWudfmgfs)4dfw!-qbNwoFv!)fcvDfsvuyfu!>!spmpDwof!5dfw<*!mbnspOemspx!-yfusfWpUbsfnbd!)udfmgfs!>!dfWudfmgfs!4dfw<*!yjsubNxfjWv!-O!)opjudfsjEnspgtobsUftsfwoj!>!mbnspOemspx!4dfw<*!opjujtpQbsfnbDv!.!emspXw!)f{jmbnspo!>!yfusfWpUbsfnbd!4dfw|*qbNwoFftVv)!gj!QBNWOF`FTV!gfegj$!!gjeof$!<*spudbGhpg!-*x/eJ!-chs/spmpDhpGv)5dfw!-eJ)yjn!>!eJ!gjeof$!<*iuqfe!-sbGhpGv!-sbfOhpGv)qfutiuppnt!>!spudbGhpg!ubpmg!ftmf$!<*iuqfe!+!iuqfe!+!zujtofEhpGv!+!zujtofEhpGv!.)qyf!.!1/2!>!spudbGhpg!ubpmg!3QYF`HPG!gfegj$!<{/yfusfWw.!>!iuqfe!ubpmg!HPG!gfegj$!!gjeof$!~~~~<chs/^j]spmpDupqTv!+!udfggFupqt!+!fhobSm!+!*1/1!-*mbnspOm.!-O)upe)ybn!>,!chs/eJ<*1/1!-*^j]uofopqyFupqTv!-udfggFupqt)xpq)ybn!>!udfggFupqt|*^j]fmhoBupqTv!?!udfggFupqt)gj<*mbnspOm!-^j]opjudfsjEupqTv)upe!>!udfggFupqt!ubpmg<*spudfWm)f{jmbnspo!>!mbnspOm!4dfw|*1/1!?!fhobSm)!gj~<*1/2!-*^j]fhobSupqTv!0!*spudfWm)iuhofm))ojn!.!1/2!>!fhobSm|*1/1!?!^j]fhobSupqTv)!gj<1/2!>!fhobSm!ubpmg<^j]opjujtpQupqTv!.!yfusfWw!>!spudfWm!4dfw|*1/1!>>!x/^j]spmpDupqTv)gj|!*,,j!<UPQT`YBN!=!j!<1>j!uoj)spg!1!?!UPQT`YBN!gj$!!gjeof$!~~~<chs/^j]spmpDuojpQv!+!fhobSm!+!*1/1!-**spudfWm)f{jmbnspo.!-O)upe)ybn!>,!chs/eJ|*1/1!?!fhobSm)!gj~<*1/2!-*^j]fhobSuojpQv!0!*spudfWm)iuhofm))ojn!.!1/2!>!fhobSm|*1/1!?!^j]fhobSuojpQv)!gj<1/2!>!fhobSm!ubpmg<^j]opjujtpQuojpQv!.!yfusfWw!>!spudfWm!4dfw|*1/1!>>!x/^j]spmpDuojpQv)gj|!*,,j!<UOJPQ`YBN!=!j!<1>j!uoj)spg!1!?!UOJPQ`YBN!gj$!!gjeof$!~~<chs/^j]spmpDsjEv!+!*1/1!-**^j]opjudfsjEsjEv)f{jmbnspo.!-O)upe)ybn!>,!chs/eJ|*1/1!>>!x/^j]spmpDsjEv)gj|!*,,j!<SJE`YBN!=!j!<1>j!uoj)spg!1!?!SJE`YBN!gj$!~<chs/spmpDuihjmebfIv!+!nsfUusfcnbm!>+!chs/eJ!gjeof$!~<fvmbWxpebit!+!zujtofuoJxpebit!.!1/2!>+!nsfUusfcnbm!~!!<osvufs!<esbdtje!!|!*1/1!>>!fvmbWxpebit!%%!mmvDxpebit)!gj<*esppDxpebit!-tvjebSxpebit!-tbjCxpebit!-f{jTxpebit!-qbNxpebit!)xpebiTufh!.!1/2!>!fvmbWxpebit!ubpmg|!*fwjfdfSxpebit)!gj!QBNXPEBIT`FTV!gfegj$!~<*1/2!-fhobSuihjmebfIv0*yfusfWw)iuhofm)ojn!.!1/2!!>+!nsfUusfcnbm|*1/1!?!fhobSuihjmebfIv)gj<*1/1!-zujtofuoJuofjcnBuihjmebfIv!,!*zujtofuoJuofjcnBuihjmebfIv!.!1/2)!+!*M.!-O)upe)ybn!>!nsfUusfcnbm!ubpmg|*1/1!>>!x/spmpDuihjmebfIv)gj|*uihjMv)gj~!gjeof$!~<spmpDeofmCv!>+!eJ|*eofmCv)gj!ftmf$!~<spmpDeofmCv!>+!eJ|*eofmCv)gj!ftmf~<eofmCidubCw!>+!chs/eJ|*eofmCidubCv)gj!EOFMCIDUBC!gfegj$!~~<esbdtje|*1/1!>>!x/eJ)gj!gjeof$!<ftvggjEv!>!eJ!ftmf$!~<ftvggjEv!>!eJ|ftmf~<spmpDidubCw!>!eJ|*spmpDidubCv)gj!SPMPDIDUBC!gfegj$!|ftmf~<spmpDwv!>!eJ|*fsvuyfUv)gj|!ftmf~<spmpDftsfwfSldjQyjGv!>!eJ|*qjmGftsfwfSva!%%!ldbCtj)gj~<fvsu!>!ldbCtj<O.!>!O|*1/1!=!*O!-F)upe)gj<ftmbg!>!ldbCtj!mppc<F.!>!M!4dfw!gjeof$!<*yfusfWw.)f{jmbnspo!>!F!4dfw!ftmf$!<*2!-1!-1)4dfw!>!F!4dfw!DJIQBSHPIUSP!gfegj$!<*mbnspOw)f{jmbnspo!>!O!4dfw|!ftmf~!gjeof$!~~<ftvggjEv!>!eJ|ftmf~<esbdtje|*1/1!>>!x/ftvggjEv)gj|!*!fdobutjEitbEv!?!*!fdobutjEqbHitbEv!-fdobutjEfojMw!)epn!%%!itbEv)!gj!ITBE!gfegj$!!gjeof$!<spmpDftsfwfSldjQyjGv!>!eJ!ftmf$!~<spmpDftsfwfSldjQyjGv!>!eJ|ftmf~<spmpDidubCw!>!eJ|*spmpDidubCv)gj!SPMPDIDUBC!gfegj$!|*yjGv)gj<eJ!5dfw|ftmf~~!<esbdtje!|!*1/1!>>!b/spmpDhbsG`mh)!gj!gjeof$!<spmpDftsfwfSldjQyjGv!>!spmpDhbsG`mh!ftmf$!~<spmpDftsfwfSldjQyjGv!>!spmpDhbsG`mh|ftmf~<spmpDidubCw!>!spmpDhbsG`mh|*spmpDidubCv)gj!SPMPDIDUBC!gfegj$!|*ldjQv)gj~~!<esbdtje!|!**sje!-*uofdsfQqjmDv)4dfw)upe!?!*opjujtpQw!-sje)upe)!gj~!<1/2.!>!{/sje!|!*8!=!opjudfsjEqjmDv)!gj!ftmf~!<1/2!>!{/sje!|!*7!=!opjudfsjEqjmDv)!gj!ftmf~!<1/2.!>!z/sje!|!*6!=!opjudfsjEqjmDv)!gj!ftmf~!<1/2!>!z/sje!|!*5!=!opjudfsjEqjmDv)!gj!ftmf~!<1/2.!>!y/sje!|!*4!=!opjudfsjEqjmDv)!gj!ftmf~!<1/2!>!y/sje!|!*3!=!opjudfsjEqjmDv)!gj<*1/1!-1/1!-1/1)4dfw!>!sje!4dfw|!*1!?!opjudfsjEqjmDv)!gj~~~!<esbdtje!|!*utfUbiqmBv!>=!b/spmpDwv)!gj!!!!|!ftmf~~!<esbdtje!|!*1/1!>>!b/spmpDwv)!gj!!!!|!*uofsbqtobsUv)!gj<*wVw!-sfmqnbTv)E3fsvuyfu!>!spmpDwv|**fmcbudfmfTesbdtjEv!%%!ldjQv)a!%%!fsvuyfUv)gj<spmpDwv!5dfw~!<osvufs!<*1/2!-1/1!-1/1!-1/1)5dfw!>!spmpDhbsG`mh!|!*uvpldbmc)!gj|!*ejpw)ojbn!ejpw<uvpldbmc!mppc!nspgjov~<*!{zy/*!yjsubn!+!*!1/1!-sje!)5dfw!)!)f{jmbnspo!osvufs|!*!yjsubn!5ubn!oj!-sje!4dfw!oj!)opjudfsjEnspgtobsUftsfwoj!4dfw~!<*!*!SPUDBG`BNNBH!)ubpmg!-fvmbw!)sbfojMpUbnnbH!osvufs!|!*!fvmbw!5dfw!)sbfojMpUmfyfUqbNwof!5dfw~<*!x/fvmbw!-*!*!spudbGbnnbh!)4dfw!-{zy/fvmbw!)xpq!)5dfw!osvufs|!*!spudbGbnnbh!ubpmg!oj!-fvmbw!5dfw!oj!)sbfojMpUbnnbH!5dfw<1/3!>!SPUDBG`BNNBH!ubpmg!utopd!gjeof$!~!!!!!!!!gjeof$!!!!!!!!!!!!<*!qe!-*!z/f{jTmfyfu!-E4ec!)WVpUfcvd!-qbNxpebit!)fsbqnpDE3fsvuyfu!osvufs!!!!!!!!!!!!!!!!ftmf$!!!!!!!!!!!!<*!1/:!0!1/2!)!+!*!!!!!!!!!!!!!!!!*!qe!-*!z/f{jTmfyfu!-yyz/uftggp!,!E4ec!)WVpUfcvd!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!qe!-*!z/f{jTmfyfu!-yyy/uftggp!,!E4ec!)WVpUfcvd!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!qe!-*!z/f{jTmfyfu!-zyz/uftggp!,!E4ec!)WVpUfcvd!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!qe!-*!z/f{jTmfyfu!-zyy/uftggp!,!E4ec!)WVpUfcvd!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!qe!-*!z/f{jTmfyfu!-E4ec!)WVpUfcvd!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!qe!-*!z/f{jTmfyfu!-yzz/uftggp!,!E4ec!)WVpUfcvd!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!qe!-*!z/f{jTmfyfu!-yzy/uftggp!,!E4ec!)WVpUfcvd!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!qe!-*!z/f{jTmfyfu!-zzz/uftggp!,!E4ec!)WVpUfcvd!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!qe!-*!z/f{jTmfyfu!-zzy/uftggp!,!E4ec!)WVpUfcvd!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!)!osvufs!!!!!!!!!!!!!!!!<z/f{jTmfyfu!+!tvjebSxpebit!+!*!2!-2!.!)3dfw!>!uftggp!3dfw!!!!!!!!!!!!!!!!*!UGPT`GDQ`FQZU`QBNXPEBIT!)efojgfe!}}!*!GDQ`FQZU`QBNXPEBIT!)efojgfe!gj$!!!!!!!!!!!!<*!opjujtpQpUuihjm!)f{jmbnspo!>!E4ec!4dfw!!!!!!!!!!!!<tbjCxpebit!>,!qe!!!!!!!!<*!sbfObsfnbDxpebit!.!sbGbsfnbDxpebit!)!0!*!sbfObsfnbDxpebit!.!*!opjujtpQpUuihjm!)iuhofm!)!>!qe!ubpmg!!!!!!!!!!!!<{zy/esppDxpebit!>!opjujtpQpUuihjm!4dfw!!!!!!!!!!!!<*!*!1/3!-1/5!)3dfw!+!f{jTqbNxpebit!)!0!*!1/2!)3dfw!>!f{jTmfyfu!3dfw!!!!!!!!!!!!|!*!sbGbsfnbDxpebit!ubpmg!-sbfObsfnbDxpebit!ubpmg!-esppDxpebit!5dfw!-tvjebSxpebit!ubpmg!-tbjCxpebit!ubpmg!-f{jTqbNxpebit!3dfw!-qbNxpebit!E3sfmqnbt!)xpebiTuojpQufh!ubpmg!!!!!!!!~!!!!!!!!<*!68/1!-684/1!)3dfw!,!sbobmq!+!*!63/1!-632/1!)3dfw!osvufs!!!!!!!!!!!!~!!!!!!!!!!!!<1/3!.!Zohjt!+!{/w!>!z/sbobmq!!!!!!!!!!!!!!!!<1/3!,!Zohjt!+!1/3!,!y/w!>!y/sbobmq!!!!!!!!!!!!!!!!<*!z/w!)ohjt!>!Zohjt!ubpmg!!!!!!!!!!!!!!!!|!*!foPutpnmb!>?!z/Wtcb!)!gj!ftmf!~!!!!!!!!!!!!<Yohjt!+!1/3!,!Yohjt!+!{/w!>!y/sbobmq!!!!!!!!!!!!!!!!<*!y/w!)ohjt!>!Yohjt!ubpmg!!!!!!!!!!!!!!!!|!*!foPutpnmb!>?!y/Wtcb!)!gj!ftmf!~!!!!!!!!!!!!<y/w!.!1/5!>!y/sbobmq!!!!!!!!!!!!!!!!!!!!*!1/1!?!{/w!)!gj!!!!!!!!!!!!!!!!|!*!foPutpnmb!>?!{/Wtcb!)!gj!!!!!!!!!!!!<mfyfUButpnmb!.!1/2!>!foPutpnmb!ubpmg!!!!!!!!!!!!<Zf{jTmfyfu!+!6/2!>!mfyfUButpnmb!ubpmg!!!!!!!!!!!!<zy/w!>!sbobmq!3dfw!!!!!!!!!!!!<*!Zf{jTmfyfu!+!1/3!.!1/2!)!+!fcvDpUfmbdt!>+!w!!!!!!!!!!!!<fcvDpUfmbdt!>+!Wtcb!!!!!!!!!!!!<*!*!{/Wtcb!-z/Wtcb!)ybn!-y/Wtcb!)ybn!0!1/2!>!fcvDpUfmbdt!ubpmg!!!!!!!!!!!!<*!w!)tcb!>!Wtcb!4dfw!!!!!!!!!!!!|!*!Zf{jTmfyfu!ubpmg!-w!4dfw!)WVpUfcvd!3dfw!!!!!!!!~!!!!!!!!<xpebit!osvufs!!!!!!!!!!!!~!!!!!!!!!!!!gjeof$!!!!!!!!!!!!<*!{/esppDxpebit!-zy/esppDxpebit!-qbNxpebit!)fsbqnpDE3fsvuyfu!>!xpebit!!!!!!!!!!!!!!!!ftmf$!!!!!!!!!!!!<*!1/:!0!1/2!)!+!*!!!!!!!!!!!!!!!!*!{/esppDxpebit!-*!2ze!-2ye!)3dfw!,!zy/esppDxpebit!-f{jTqbNxpebit!-qbNxpebit!)qsfMxpebiTE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!2ze!-1/1!)3dfw!,!zy/esppDxpebit!-f{jTqbNxpebit!-qbNxpebit!)qsfMxpebiTE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!2ze!-1ye!)3dfw!,!zy/esppDxpebit!-f{jTqbNxpebit!-qbNxpebit!)qsfMxpebiTE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!1/1!-2ye!)3dfw!,!zy/esppDxpebit!-f{jTqbNxpebit!-qbNxpebit!)qsfMxpebiTE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-zy/esppDxpebit!-f{jTqbNxpebit!-qbNxpebit!)qsfMxpebiTE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!1/1!-1ye!)3dfw!,!zy/esppDxpebit!-f{jTqbNxpebit!-qbNxpebit!)qsfMxpebiTE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!1ze!-2ye!)3dfw!,!zy/esppDxpebit!-f{jTqbNxpebit!-qbNxpebit!)qsfMxpebiTE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!1ze!-1/1!)3dfw!,!zy/esppDxpebit!-f{jTqbNxpebit!-qbNxpebit!)qsfMxpebiTE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!1ze!-1ye!)3dfw!,!zy/esppDxpebit!-f{jTqbNxpebit!-qbNxpebit!)qsfMxpebiTE3fsvuyfu!!!!!!!!!!!!!!!!!!!!)!>!xpebit!!!!!!!!!!!!!!!!<tvjebSxpebit!+!z/f{jTmfyfu!,!>!2ze!ubpmg!!!!!!!!!!!!!!!!<tvjebSxpebit!+!y/f{jTmfyfu!,!>!2ye!ubpmg!!!!!!!!!!!!!!!!<tvjebSxpebit!+!z/f{jTmfyfu!.!>!1ze!ubpmg!!!!!!!!!!!!!!!!<tvjebSxpebit!+!y/f{jTmfyfu!.!>!1ye!ubpmg!!!!!!!!!!!!!!!!<f{jTqbNxpebit!0!*!1/2!)3dfw!>!f{jTmfyfu!3dfw!!!!!!!!!!!!!!!!*!UGPT`GDQ`FQZU`QBNXPEBIT!)efojgfe!gjmf$!!!!!!!!!!!!<*!1/:!0!1/2!)!+!*!!!!!!!!!!!!!!!!*!{/esppDxpebit!-*!2ze!-2ye!)3dfw!,!zy/esppDxpebit!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!2ze!-1/1!)3dfw!,!zy/esppDxpebit!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!2ze!-1ye!)3dfw!,!zy/esppDxpebit!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!1/1!-2ye!)3dfw!,!zy/esppDxpebit!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-zy/esppDxpebit!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!1/1!-1ye!)3dfw!,!zy/esppDxpebit!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!1ze!-2ye!)3dfw!,!zy/esppDxpebit!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!1ze!-1/1!)3dfw!,!zy/esppDxpebit!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!,!*!{/esppDxpebit!-*!1ze!-1ye!)3dfw!,!zy/esppDxpebit!-qbNxpebit!)fsbqnpDE3fsvuyfu!!!!!!!!!!!!!!!!!!!!)!>!xpebit!!!!!!!!!!!!!!!!<tvjebSxpebit!+!z/f{jTmfyfu!,!>!2ze!ubpmg!!!!!!!!!!!!!!!!<tvjebSxpebit!+!y/f{jTmfyfu!,!>!2ye!ubpmg!!!!!!!!!!!!!!!!<tvjebSxpebit!+!z/f{jTmfyfu!.!>!1ze!ubpmg!!!!!!!!!!!!!!!!<tvjebSxpebit!+!y/f{jTmfyfu!.!>!1ye!ubpmg!!!!!!!!!!!!!!!!<f{jTqbNxpebit!0!*!1/2!)3dfw!>!f{jTmfyfu!3dfw!!!!!!!!!!!!!!!!*!GDQ`FQZU`QBNXPEBIT!)efojgfe!gj$!!!!!!!!!!!!|!*!utfUnvutvsg!)!gj!!!!!!!!!!!!<*!dfWutfUnvutvsg!)mmb!>!utfUnvutvsg!mppc!!!!!!!!!!!!<*!1/2!>=!{/esppDxpebit!-nvutvsGoj!)3dfwc!>!dfWutfUnvutvsg!3dfwc!!!!!!!!!!!!<*!dfWnvutvsGoj!)mmb!>!nvutvsGoj!mppc!!!!!!!!!!!!<*!1/2!>=!z/esppDxpebit!-1/1!>?!z/esppDxpebit!-1/2!>=!y/esppDxpebit!-1/1!>?!y/esppDxpebit!)!5dfwc!>!dfWnvutvsGoj!5dfwc!!!!!!!!!!!!<tbjCxpebit!>,!{/esppDxpebit!!!!!!!!!!!!<x/esppDxpebit!>0!{zy/esppDxpebit!!!!!!!!!!!!<1/2!>!xpebit!ubpmg!!!!!!!!!!!!|!*!esppDxpebit!5dfw!-tvjebSxpebit!ubpmg!-tbjCxpebit!ubpmg!-f{jTqbNxpebit!3dfw!-qbNxpebit!E3sfmqnbt!)xpebiTufh!ubpmg!!!!!!!!~!!!!!!!!<d!osvufs!!!!!!!!!!!!<*!y/g!-c!-b!)yjn!>!d!ubpmg!!!!!!!!!!!!<*!z/g!-us!-cs!)yjn!>!c!ubpmg!!!!!!!!!!!!<*!z/g!-um!-cm!)yjn!>!b!ubpmg!!!!!!!!!!!!<*!6/1!,!f{jt!+!wv!)udbsg!>!g!3dfw!!!!!!!!!!!!<*!fsbqnpd!-zz/uftggp!+!f{jTmfyfu!,!WVejpsuofd!-tiuqfe!)fsbqnpDE3fsvuyfu!>!us!ubpmg!!!!!!!!!!!!<*!fsbqnpd!-yz/uftggp!+!f{jTmfyfu!,!WVejpsuofd!-tiuqfe!)fsbqnpDE3fsvuyfu!>!cs!ubpmg!!!!!!!!!!!!<*!fsbqnpd!-zy/uftggp!+!f{jTmfyfu!,!WVejpsuofd!-tiuqfe!)fsbqnpDE3fsvuyfu!>!um!ubpmg!!!!!!!!!!!!<*!fsbqnpd!-yy/uftggp!+!f{jTmfyfu!,!WVejpsuofd!-tiuqfe!)fsbqnpDE3fsvuyfu!>!cm!ubpmg!!!!!!!!!!!!<f{jt!0!*!6/1!,!f{jt!+!wv!)sppmg!>!WVejpsuofd!3dfw!!!!!!!!!!!!<f{jt!0!*!1/2!)3dfw!>!f{jTmfyfu!3dfw!!!!!!!!!!!!<*!1/2!-1/1!)3dfw!>!uftggp!3dfw!utopd!!!!!!!!!!!!|!*!fsbqnpd!ubpmg!-wv!3dfw!-f{jt!3dfw!-tiuqfe!E3sfmqnbt!)qsfMxpebiTE3fsvuyfu!ubpmg!!!!!!!!~!!!!!!!!<*!*!*!wv!-tiuqfe!)E3fsvuyfu!)iuqfEpUBCHSldbqov!-fsbqnpd!)qfut!osvufs!!!!!!!!!!!!|!*!fsbqnpd!ubpmg!-wv!3dfw!-tiuqfe!E3sfmqnbt!)fsbqnpDE3fsvuyfu!ubpmg!!!!!!!!~!!!!!!!!<*!tspudbGldbqoV!-w!)upe!osvufs|!*!w!5dfw!oj!utopd!)iuqfEpUBCHSldbqov!ubpmg!!!!!!!!<*!/2!-tspudbGldbQ!)5dfw!0!fmbdtoxpEldbqoV!>!tspudbGldbqoV!5dfw!utopd!!!!!!!!<*!/763!!-/763!+!/763!-/763!+!/763!+!/763!)4dfw!>!tspudbGldbQ!4dfw!utopd!!!!!!!!<*2!hojevmdyf)!opjudbsg!?.!2//1!00!</763!0!/663!>!fmbdtoxpEldbqoV!ubpmg!utopd!!!!!!!!<*2!hojevmdoj)!2//1!?.!opjudbsg!00!</663!0!/763!>!fmbdtqVldbQ!ubpmg!utopd!!!!!!!!<esppDxpebit!5dfw!hojzsbw<fwjfdfSxpebit!mppc!nspgjov<tvjebSxpebit!ubpmg!nspgjov<tbjCxpebit!ubpmg!nspgjov<zujtofuoJxpebit!ubpmg!nspgjov<f{jTxpebit!3dfw!nspgjov<qbNxpebit!E3sfmqnbt!nspgjov<mmvDxpebit!mppc!nspgjov!QBNXPEBIT`FTV!gfegj$!!gjeof$!<fdobutjEfojMw!ubpmg!hojzsbw<fdobutjEqbHitbEv!ubpmg!nspgjov<fdobutjEitbEv!ubpmg!nspgjov<itbEv!mppc!nspgjov!ITBE!gfegj$!!gjeof$!!gjeof$!<sbGhpGv!ubpmg!nspgjov<sbfOhpGv!ubpmg!nspgjov!ftmf$!<zujtofEhpGv!ubpmg!nspgjov!3QYF`HPG!gfegj$!<spmpDhpGv!5dfw!nspgjov!HPG!gfegj$!!gjeof$!<^UPQT`YBN]opjudfsjEupqTv!4dfw!nspgjov<^UPQT`YBN]opjujtpQupqTv!4dfw!nspgjov<^UPQT`YBN]fhobSupqTv!ubpmg!nspgjov<^UPQT`YBN]fmhoBupqTv!ubpmg!nspgjov<^UPQT`YBN]uofopqyFupqTv!ubpmg!nspgjov<^UPQT`YBN]spmpDupqTv!5dfw!nspgjov!1!?!UPQT`YBN!gj$!!gjeof$!<^UOJPQ`YBN]opjujtpQuojpQv!4dfw!nspgjov<^UOJPQ`YBN]fhobSuojpQv!ubpmg!nspgjov<^UOJPQ`YBN]spmpDuojpQv!5dfw!nspgjov!1!?!UOJPQ`YBN!gj$!!gjeof$!<^SJE`YBN]opjudfsjEsjEv!4dfw!nspgjov<^SJE`YBN]spmpDsjEv!5dfw!nspgjov!1!?!SJE`YBN!gj$!!gjeof$!<eofmCidubCw!4dfw!hojzsbw<eofmCidubCv!mppc!nspgjov!EOFMCIDUBC!gfegj$!!gjeof$!<ttfouihjsCidubCw!ubpmg!hojzsbw<ttfouihjsCidubCv!mppc!nspgjov!TTFOUIHJSCIDUBC!gfegj$!!gjeof$!<spmpDidubCw!5dfw!hojzsbw<spmpDidubCv!mppc!nspgjov!SPMPDIDUBC!gfegj$!<spmpDuihjmebfIv!5dfw!nspgjov<zujtofuoJuofjcnBuihjmebfIv!ubpmg!nspgjov<fhobSuihjmebfIv!ubpmg!nspgjov<emspXw!4dfw!hojzsbw<opjujtpQbsfnbDv!4dfw!nspgjov<yjsubNxfjWv!5ubn!nspgjov!gjeof$!<zujwjudfmgfSv!ubpmg!nspgjov<qbNwoFv!fcvDsfmqnbt!nspgjov<qbNwoFftVv!mppc!nspgjov!QBNWOF`FTV!gfegj$!<opjujtpQw!4dfw!hojzsbw<yfusfWw!4dfw!hojzsbw<mbnspOw!4dfw!hojzsbw<ftvggjEv!5dfw!nspgjov<zujdbqPusbQv!ubpmg!nspgjov<ttfouihjsCv!ubpmg!nspgjov<uihjMv!mppc!nspgjov<spmpDeofmCv!5dfw!nspgjov<eofmCv!mppc!nspgjov<uofdsfQqjmDv!ubpmg!nspgjov<opjudfsjEqjmDv!uoj!nspgjov<wVs!3dfw!hojzsbw<sfmqnbTeofmCv!E3sfmqnbt!nspgjov<sfmqnbTv!E3sfmqnbt!nspgjov<wVw!3dfw!hojzsbw<fsvuyfUeofmCv!mppc!nspgjov<fsvuyfUv!mppc!nspgjov<uofsbqtobsUv!mppc!nspgjov<utfUbiqmBv!ubpmg!nspgjov<spmpDftsfwfSldjQyjGv!5dfw!nspgjov<qjmGftsfwfSv!mppc!nspgjov<ldjQv!mppc!nspgjov<yjGv!mppc!nspgjov<fmcbudfmfTesbdtjEv!mppc!nspgjov!YJGFSQ!gjeof$!!gjeof$!!<ubpmg!qnvjefn!opjtjdfsq!!ftmf$!!<ubpmg!qihji!opjtjdfsq!!IHJI`OPJTJDFSQ`UOFNHBSG`MH!gfegj$!!TF`MH!gfegj$!";
        Uh(u, {
            setBatchInfo: function (h, f) {
                ef[h] = f
            }, getBatchInfo: function (D) {
                return ef[D]
            }, getBatchInfoMap: function () {
                return ef
            }, setBatchInfoMap: function (i) {
                ef = i
            }
        }, !0);
        var Qm = [1, 1, 1],
            Nj = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
            xd = [1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0],
            Zc = [-.5, .5, .5, -.5, .5, -.5, -.5, -.5, -.5, -.5, -.5, -.5, -.5, -.5, .5, -.5, .5, .5],
            Up = [.5, .5, -.5, .5, .5, .5, .5, -.5, .5, .5, -.5, .5, .5, -.5, -.5, .5, .5, -.5],
            Ol = [.5, .5, -.5, -.5, .5, -.5, -.5, .5, .5, -.5, .5, .5, .5, .5, .5, .5, .5, -.5],
            Uk = [.5, -.5, .5, -.5, -.5, .5, -.5, -.5, -.5, -.5, -.5, -.5, .5, -.5, -.5, .5, -.5, .5],
            Fp = [.5, .5, .5, -.5, .5, .5, -.5, -.5, .5, -.5, -.5, .5, .5, -.5, .5, .5, .5, .5],
            Be = [-.5, .5, -.5, .5, .5, -.5, .5, -.5, -.5, .5, -.5, -.5, -.5, -.5, -.5, -.5, .5, -.5],
            dn = function (b, L) {
                var P = b._40Q;
                P.each(function (S) {
                    S.ivBatch(L)
                })
            },
            kb = function (x, z, r) {
                var g = r._id,
                    i = z[g];
                if (i) {
                    var N = i.batch,
                        E = x[N],
                        B = E.ds,
                        m = i.index;
                    if (E.invalidate = !0, delete z[g], B.splice(m, 1), Ro(B)) return delete x[N], void 0;
                    for (var W = i.begin, b = i.size, l = 3 * W, R = 3 * b, J = 4 * W, y = 4 * b, Q = E.vs, K = E.ps, d = E.uv, O = E.cs, c = E.bs, D = E.rs, U = E.ns, V = E.ls; m < B.length; m++) i = z[B[m]._id], i.index--, i.begin -= b;
                    Q.splice(l, R), K.splice(J, y), d && d.splice(2 * W, 2 * b), O && O.splice(J, y), c && c.splice(l, R), D && D.splice(W, b), U && U.splice(l, R), V && V.splice(W, b)
                }
            },
            Qr = function (k, v, c, a, n) {
                if (!a) return F;
                var Y = v[a];
                if (!Y) {
                    var Z = n.getBatchInfo(a) || Xn,
                        h = Z.image ? [] : F;
                    Y = v[a] = {
                        vs: [],
                        ns: [],
                        uv: h,
                        cs: h ? F : Z.color ? F : [],
                        bs: Z.blend ? [] : F,
                        ps: [],
                        rs: Z.brightness ? [] : F,
                        ds: []
                    }
                }
                return Y.invalidate = !0, k[c._id] = {
                    index: Y.ds.length,
                    begin: Y.vs.length / 3,
                    batch: a
                }, Y.ds.push(c), Y
            },
            yg = function (K, R) {
                return R != F && 1 !== R ? [K[0] * R, K[1] * R, K[2] * R, K[3]] : K
            },
            Hm = function (U) {
                var q = U.shapeModel;
                q || (q = bf(U)), q && (q._ctlineModel = [], q._lineModel = Z)
            },
            oq = function () {
                var m;
                return function (f, L, p) {
                    var Y = f.getData3dUI(L),
                        l = Y.shapeModel;
                    if (l || (l = bf(Y)), l || !Y.shapeName) {
                        var d, D = L.s("wf.combineTriangle");
                        if (p.geometry) {
                            if (!l && (L instanceof O.Node && !(L instanceof O.Shape) ? (m || (m = {
                                vs: Ef,
                                is: Lq,
                                uv: mi
                            }), l = m) : l = [Y.left, Y.front, Y.right, Y.back, Y.top, Y.bottom], !l)) return Z;
                            if (D) {
                                var F = L.s("wf.normEpsilon");
                                isNaN(F) && (F = 2), D = 0 | Math.min(3, Math.max(1, isNaN(D) ? 1 : D)), d = _h[D - 1](l, Y, 180 / (Math.PI * F))
                            } else d = hl(l, Y); if (!d || 0 === d.length) return
                        } else d = p.short ? yq : sl;
                        var C = f.getBrightness(L),
                            h = ns(p.color || "white"),
                            U = h[3] < 1,
                            S = Math.ceil(p.width) || 1,
                            q = (U ? "T" : "O") + (L.s("bloom") ? "_1_" : "_0_") + S,
                            K = L.getRenderLayer(),
                            R = f._40Q.get(K),
                            v = R.wireframeIndexMap,
                            N = R.wireframeModelMap,
                            H = N[q];
                        H || (H = N[q] = {
                            vs: [],
                            cs: [],
                            ps: [],
                            ds: [],
                            T: U,
                            B: L.s("bloom"),
                            W: S
                        }), H.invalidate = !0;
                        var w = H.vs,
                            r = H.cs,
                            u = H.ds,
                            W = v[L._id] = {
                                index: u.length,
                                begin: w.length / 3,
                                batch: q
                            };
                        u.push(L);
                        var _ = Y.mat;
                        L instanceof O.Edge || !(!_ || !p.geometry && L instanceof O.Shape) || (_ = sj(L, p.mat), L.appendAnchorMatrix3d(_)), yp(w, _, d);
                        var I = W.size = w.length / 3 - W.begin;
                        Wo(r, yg(h, C), I)
                    }
                }
            }(),
            mg = function (X, y, D, T, e, o, s, M, A) {
                var H = X.getBrightness(y);
                H == F && (H = 1);
                var L = yg(ns(T), H),
                    n = L[3] < 1;
                o = Math.ceil(o) || 1;
                var c = (n ? "T" : "O") + o;
                if (s) {
                    var N = s[0],
                        G = (s[1] || N) + N;
                    c += "-" + N + "-" + G, A && (c += "-" + zd(A) + "-" + H, A = yg(ns(A), H))
                }
                var U = y.getRenderLayer(),
                    h = X._40Q.get(U),
                    K = h.polylineIndexMap,
                    x = h.polylineModelMap,
                    $ = x[c];
                $ || ($ = x[c] = {
                    vs: [],
                    cs: [],
                    ps: [],
                    ds: [],
                    ls: s ? [] : F,
                    T: n,
                    W: o
                }, s && ($.D = N, $.G = G, $.A = A)), $.invalidate = !0;
                var p, S = $.vs,
                    V = $.cs,
                    W = $.ds,
                    u = $.ls,
                    z = K[y._id] = {
                        index: W.length,
                        begin: S.length / 3,
                        batch: c
                    };
                W.push(y), gc(S, D);
                var Z, l = z.size = S.length / 3 - z.begin,
                    g = D.length,
                    d = 0,
                    v = [];
                if (s || e)
                    for (p = 0; g > p; p += 6) Z = En([D[p], D[p + 1], D[p + 2]], [D[p + 3], D[p + 4], D[p + 5]]), v.push(Z), d += Z;
                if (d && e) {
                    var P, r = yg(ns(e), H),
                        m = [r[0] - L[0], r[1] - L[1], r[2] - L[2], r[3] - L[3]],
                        j = 0;
                    for (p = 0; g > p; p += 6) P = j / d, Wo(V, [L[0] + m[0] * P, L[1] + m[1] * P, L[2] + m[2] * P, L[3] + m[3] * P], 1), j += v[p / 6], P = j / d, Wo(V, [L[0] + m[0] * P, L[1] + m[1] * P, L[2] + m[2] * P, L[3] + m[3] * P], 1)
                } else Wo(V, L, l); if (s)
                    for (j = M || 0, p = 0; g > p; p += 6) u.push(j), j += v[p / 6], u.push(j)
            },
            Ic = function (Y, x, h) {
                if (x) {
                    var M = 4 * x.begin,
                        L = h[x.batch].ps;
                    if (L[M] !== Y[0] || L[M + 1] !== Y[1] || L[M + 2] !== Y[2] || L[M + 3] !== Y[3]) {
                        for (var J = 0; J < x.size; J++) L[M++] = Y[0], L[M++] = Y[1], L[M++] = Y[2], L[M++] = Y[3];
                        L._invalidateThisFrame = !0
                    }
                }
            },
            Tj = function (E, C) {
                var u = C + ["32"],
                    x = E[C],
                    P = E[u];
                x ? P && P.length === x.length ? (P.set(x), P._bufId = null) : E[u] = new fk(x) : delete E[u]
            },
            km = function (s, O, Q, E, M, B, Y, D, o) {
                if (ip(Q)) Q.forEach(function (v) {
                    km(s, O, v, E, M, B, Y, D, o)
                });
                else if (dk(Q)) km(s, O, bf(E, Q), E, M, B, Y, D, o);
                else if (xl(Q)) {
                    var h, b = Dj(Q.mat, O, s),
                        v = Dj(Q.s3, O, s),
                        x = Dj(Q.t3, O, s),
                        C = Dj(Q.r3, O, s);
                    if ((v || C || x || b) && (h = Jn(b, v, C, Dj(Q.rotationMode, O, s), x), B.push(h)), Q.shape3d) km(s, O, Q.shape3d, E, M, B, Y, D, Q);
                    else {
                        var t = E.s;
                        o = o || Xn;
                        var T = B[0],
                            p = B.length,
                            c = t("shape3d.color", Q.color, o.color);
                        if (M || (M = t("shape3d.blend", Q.blend, o.blend)), p > 1) {
                            T = Ql(T);
                            for (var f = 1; p > f; f++) xo(T, T, B[f])
                        }
                        Q.vs && t(lm, Q.visible, o.visible) && Ak(T, Y, D, Q.vs, Q.uv, Q.is, M, c), Q.top_vs && t(Je, Q.topVisible, o.topVisible) && Ak(T, Y, D, Q.top_vs, Q.top_uv, Q.top_is, M, t("shape3d.top.color", Q.topColor, o.topColor) || c), Q.bottom_vs && t(Ho, Q.bottomVisible, o.bottomVisible) && Ak(T, Y, D, Q.bottom_vs, Q.bottom_uv, Q.bottom_is, M, t("shape3d.bottom.color", Q.bottomColor, o.bottomColor) || c), Q.from_vs && t(Rb, Q.fromVisible, o.fromVisible) && Ak(T, Y, D, Q.from_vs, Q.from_uv, Q.from_is, M, t("shape3d.from.color", Q.fromColor, o.fromColor) || c), Q.to_vs && t(xh, Q.toVisible, o.toVisible) && Ak(T, Y, D, Q.to_vs, Q.to_uv, Q.to_is, M, t("shape3d.to.color", Q.toColor, o.toColor) || c)
                    }
                    h && B.pop()
                }
            },
            Ak = function (H, c, n, p, d, e, _, r) {
                var P, l = c.cs,
                    W = c.uv,
                    a = c.bs;
                if (e) {
                    P = e.length;
                    for (var U = 0; P > U; U++) {
                        var i = e[U];
                        yp(n, H, [p[3 * i], p[3 * i + 1], p[3 * i + 2]]), W && gc(W, [d[2 * i], d[2 * i + 1]])
                    }
                } else P = p.length / 3, yp(n, H, p), W && gc(W, d);
                l && Wo(l, r, P), a && (_ ? Tr(a, _, P) : gc(a, Qm, P))
            },
            Mp = function (A, $, F, _) {
                var Q = [];
                _ ? km(A.gv, A.data, _, A, A.getBodyColor(), [$], F, Q) : (_q(A, nq, $, F, Q), _q(A, fm, $, F, Q), _q(A, wg, $, F, Q), _q(A, Qq, $, F, Q), _q(A, $c, $, F, Q), _q(A, Kd, $, F, Q), _q(A, "csg", $, F, Q)), Q.length && (gc(F.vs, Q), gc(F.ns, Gb(Q)))
            },
            _q = function (O, y, E, r, D) {
                var d = O[y];
                if (d) {
                    var Q = d.tuv;
                    if (Q) {
                        var T, I, f, s, p = d.uvScale,
                            z = d.uvOffset;
                        if (p)
                            for (T = Q.length, I = p[0], f = p[1], s = 0; T > s; s += 2) Q[s] *= I, Q[s + 1] *= f;
                        if (z)
                            for (T = Q.length, I = z[0], f = z[1], s = 0; T > s; s += 2) Q[s] += I, Q[s + 1] += f
                    }
                    Ak(E, r, D, d.vs, Q, F, d.blend, d.color)
                }
            },
            Li = function (J, z, C, b, y, S, T, F) {
                var v, A = C.cs,
                    p = C.uv,
                    E = C.bs;
                if (J.getFaceVisible(z, S)) {
                    var R = J.getFaceMat(z, S);
                    if (R && (y = sj(z, R)), yp(T, y, F), A && Wo(A, J.getFaceColor(z, S), 6), p) {
                        var k = J.getFaceUv(z, S) || b[S + "Uv"],
                            f = J.getFaceUvScale(z, S) || b[S + "UvScale"],
                            V = J.getFaceUvOffset(z, S) || b[S + "UvOffset"];
                        k = k ? [k[6], k[7], k[0], k[1], k[2], k[3], k[2], k[3], k[4], k[5], k[6], k[7]] : xd;
                        var Q = k[0],
                            Y = k[1],
                            u = k[2],
                            O = k[3],
                            W = k[4],
                            G = k[5],
                            K = k[6],
                            l = k[7],
                            d = k[8],
                            $ = k[9],
                            H = k[10],
                            w = k[11];
                        if (f) {
                            var m = f[0],
                                o = f[1];
                            Q *= m, Y *= o, u *= m, O *= o, W *= m, G *= o, K *= m, l *= o, d *= m, $ *= o, H *= m, w *= o
                        }
                        if (V) {
                            var s = V[0],
                                x = V[1];
                            Q += s, Y += x, u += s, O += x, W += s, G += x, K += s, l += x, d += s, $ += x, H += s, w += x
                        }
                        p.push(Q, Y, u, O, W, G, K, l, d, $, H, w)
                    }
                    E && (v = J.getBodyColor(z) || J.getFaceBlend(z, S), v ? Tr(E, v, 6) : gc(E, Qm, 6))
                }
            },
            Eb = function (X, W, E, u) {
                var E = X._picking ? X.pickColorMap : null,
                    t = X.getGL(),
                    G = X._prg,
                    h = X._buffer;
                if (!wd(W)) {
                    gk(X, Nj), _k(t, G);
                    for (var x in W) {
                        var k = W[x];
                        if (!(u && !k.T || !u && k.T)) {
                            k.invalidate ? (k.invalidate = !1, Tj(k, "vs"), Tj(k, "cs"), Tj(k, "ls"), Tj(k, "ps")) : E && k.ps && k.ps._invalidateThisFrame && (k.ps._invalidateThisFrame = !1, Tj(k, "ps"));
                            var $ = k.vs32,
                                r = E ? k.ps32 : k.cs32;
                            ck(t, G, k.W, F, h.vs, $);
                            var Y = ts.for(t),
                                C = Y.directUniforms(),
                                j = Y.directAttribs(),
                                d = k.D,
                                o = !X._dashDisabled && d;
                            C.uAlphaTest = z.alphaTest, t._blooming && !k.B && (C.blackout = !0), o && (C.uDash = !0, C.uDashDistance = d, C.uDashGapDistance = k.G, C.uDiffuse = k.A || z["color.empty"], j.aLineDistance = Sl(t, h.lineDistance, k.ls32, F, 1));
                            var D = !X._batchColorDisabled;
                            D && r.length ? (C.uBatchColor = !0, j.aBatchColor = Sl(t, h.batchColor, r, F, 4)) : (C.uBatchColor = !1, j.aBatchColor = !1), bi(t), ie(t, 0, $.length / 3, t.LINES), Jf(t), D && (C.uBatchColor = !1, j.aBatchColor = !1), o && (C.uDash = !1, j.aLineDistance = !1), t._blooming && !k.B && (C.blackout = !1)
                        }
                    }
                    On(t, G), Gf(X)
                }
            },
            Zn = function (x, g, Y, $, I) {
                var e, h, k, N, y, O, c, n, d, r, t, Y = x._picking ? x.pickColorMap : null,
                    D = x.getGL(),
                    E = x._prg,
                    H = ts.for(D),
                    G = H.directUniforms(),
                    X = H.directAttribs(),
                    P = x._buffer;
                if (!wd(g) && !x.drawFilter) {
                    gk(x, Nj);
                    for (e in g)
                        if (h = x.getBatchInfo(e) || Xn, h.visible !== !1 && !($ && !h.transparent || !$ && h.transparent || x.isReflecting(D) && h.reflectable === !1)) {
                            var V = h.renderLayerMask;
                            if (V == F && (V = pb), I == F && (I = pb), Sr(I, V) && (k = g[e], Y || !h.transparentMask)) {
                                var q = $ && h.autoSort === !0 && (x._33Q || k.invalidate);
                                if (k.invalidate ? (k.invalidate = !1, Tj(k, "vs"), Tj(k, "ns"), Tj(k, "cs"), Tj(k, "rs"), Tj(k, "ps"), Tj(k, "bs"), Tj(k, "uv")) : Y && k.ps && k.ps._invalidateThisFrame && (k.ps._invalidateThisFrame = !1, Tj(k, "ps")), y = k.vs32, O = Y ? k.ps32 : k.cs32, d = k.uv32, c = k.bs32, n = k.rs32, t = y.length / 3, q) {
                                    var p = le(y, x.getEye(), x);
                                    p ? (k.is = p.is, k.elementTypeUint = p.useUint32) : (k.is = null, k.elementTypeUint = null)
                                }
                                if (t) {
                                    N = h.light, r = x.getTexture(h.image), Ll(D, E, F, h.light, h.opacity, h.reverseFlip, h.reverseColor, h.reverseCull), O ? x._batchColorDisabled ? (G.uBatchColor = !1, X.aBatchColor = !1) : (G.uBatchColor = !0, X.aBatchColor = Sl(D, P.batchColor, O, F, 4)) : (G.uBatchColor = !1, G.uDiffuse = h.color || z["color.empty"]);
                                    var B = h.alphaTest;
                                    G.uAlphaTest = B === Z ? z.alphaTest : B, D._blooming && !h.bloom && (G.blackout = !0), h.envmap !== Z ? (G.uUseEnvMap = !0, G.uReflectivity = h.envmap) : (G.uUseEnvMap = !1, G.uReflectivity = 0);
                                    var U = c && !x._batchBlendDisabled;
                                    U && (G.uBatchBlend = !0, X.aBatchBlend = Sl(D, P.batchBlend, c, F));
                                    var T = n && !x._batchBrightnessDisabled;
                                    T && (G.uBatchBrightness = !0, X.aBatchBrightness = Sl(D, P.batchBrightness, n, F, 1)), d ? bi(D, E, r, h.discardSelectable, P.uv, d, h.uvOffset, h.uvScale) : bi(D), X.aPosition = Sl(D, P.vs, y, F), X.aNormal = Sl(D, P.ns, k.ns32, F), k.is ? (eo(D, P.is, k.is), os(D, 0, t, null, k.elementTypeUint ? D.UNSIGNED_INT : null)) : ie(D, 0, t), d ? Jf(D, E, r) : Jf(D), O && !x._batchColorDisabled && (G.uBatchColor = !1, X.aBatchColor = !1), U && (G.uBatchBlend = !1, X.aBatchBlend = !1), T && (G.uBatchBrightness = !1, X.aBatchBrightness = !1), D._blooming && !h.bloom && (G.blackout = !1), ol(D, E)
                                }
                            }
                        }
                    Gf(x)
                }
            },
            le = function (d, q, b) {
                var m = d.length / 3,
                    h = m > 65535,
                    v = b._glCapabilities.elementTypeUint && h;
                if (!v && h) return null;
                for (var L = new Array(m), S = m / 3, A = new Array(S), T = 0; S > T; T++) A[T] = T;
                A.sort(function (f, x) {
                    var c = 9 * f,
                        n = [(d[c] + d[c + 3] + 2 * d[c + 6]) / 4, (d[c + 1] + d[c + 4] + 2 * d[c + 7]) / 4, (d[c + 2] + d[c + 5] + 2 * d[c + 8]) / 4];
                    c = 9 * x;
                    var W = [(d[c] + d[c + 3] + 2 * d[c + 6]) / 4, (d[c + 1] + d[c + 4] + 2 * d[c + 7]) / 4, (d[c + 2] + d[c + 5] + 2 * d[c + 8]) / 4],
                        R = En(q, n) - En(q, W);
                    return R > 0 ? -1 : 0 > R ? 1 : 0
                });
                for (var T = 0; S > T; T++) {
                    var j = 3 * T,
                        o = 3 * A[T];
                    L[j] = o, L[j + 1] = o + 1, L[j + 2] = o + 2
                }
                return {
                    useUint32: v,
                    is: v ? new Uint32Array(L) : new $m(L)
                }
            },
            Jh = {
                obj: function (b, O) {
                    var x = {
                        mat: b.mat,
                        s3: b.s3,
                        r3: b.r3,
                        rotationMode: b.rotationMode,
                        t3: b.t3,
                        cube: b.cube == F ? !0 : b.cube,
                        center: b.center == F ? !0 : b.center,
                        ignoreMtls: b.ignoreMtls,
                        ignoreTransparent: b.ignoreTransparent,
                        ignoreColor: b.ignoreColor,
                        ignoreImage: b.ignoreImage,
                        ignoreNormal: b.ignoreNormal,
                        prefix: b.prefix,
                        flipY: b.flipY,
                        flipFace: b.flipFace,
                        reverseFlipMtls: b.reverseFlipMtls,
                        finishFunc: function (i, n) {
                            if (i) {
                                var n = [];
                                for (var s in i) {
                                    var o = i[s];
                                    n.rawS3 = o.rawS3, o.center && (n.center = o.center), n.push(o), b.eachModel && b.eachModel(s, o)
                                }
                                n.json = b, O(n)
                            } else O()
                        }
                    };
                    u.loadObj(b.obj, b.mtl, x)
                }, bin: function (m, f) {
                    var d = {
                        finishFunc: function (M) {
                            M ? f(M) : f()
                        }
                    };
                    u.loadBin(m.url, d)
                }
            };
        u.getModelTypeHandlers = function () {
            return Jh
        }, u.setModelTypeHandler = function (G, A) {
            Jh[G] = A
        }, u.getModelTypeHandler = function (A) {
            return Jh[A]
        }, u.handleModelLoaded = function () { }, u.handleUnfoundModel = function () { };
        var Wb = F,
            pp = F,
            Yi = function (T) {
                Wb && !T._loadingModelView_ && (pp || (pp = {}), pp[T._loadingModelView_ = xp()] = T)
            },
            Im = function (X, g) {
                Wb || (Wb = {});
                var l = Wb[X];
                if (l) {
                    if (l.url === g) return;
                    l.request.onload = Mr, l.request.onerror = Mr
                }
                if (g.indexOf(".bin") === g.length - 4) return Ti(X, {
                    modelType: "bin",
                    url: g
                }, g);
                if (g = u.beforeLoadURL(g), g.data) {
                    var v = u.parse(g.data);
                    Ti(X, v, g)
                } else {
                    var O = new De;
                    Wb[X] = {
                        request: O,
                        url: g
                    }, O.onload = function () {
                        if (200 === this.status || 0 === this.status) {
                            delete Wb[X];
                            var t = u.parse(O.getResponseText());
                            Ti(X, t, g)
                        } else Hr(X, u.handleUnfoundModel(X, g) || F)
                    }, O.onerror = function () {
                        Hr(X, u.handleUnfoundModel(X, g) || F)
                    };
                    var Q = {};
                    Q.url = encodeURI(g), Q.sync = !1, O.send(Q)
                }
            },
            Ti = function (X, Y, H) {
                var o = Y.modelType;
                if (!o) return Hr(X, Y), u.handleModelLoaded(X, Y), void 0;
                var B = u.getModelTypeHandler(o);
                if (B) {
                    if (Wb || (Wb = {}), Wb[X]) return;
                    Wb[X] = !0;
                    var R = function (l) {
                        l ? (Hr(X, l), u.handleModelLoaded(X, l)) : Hr(X, u.handleUnfoundModel(X, H, Y) || F)
                    };
                    B(Y, R)
                } else Hr(X, u.handleUnfoundModel(X, H, Y) || F)
            },
            Hr = function (y, I) {
                if (delete Wb[y], dk(I) && Gq.test(I)) return Im(y, I), void 0;
                if (Zm[y] = I, wd(Wb) && (Wb = F, pp)) {
                    for (var T in pp) {
                        var p = pp[T];
                        p.invalidateAll && p.invalidateAll(Z, "modelLoaded", y), p.redraw && p.redraw(), p.iv(), delete p._loadingModelView_
                    }
                    pp = F
                }
                if (I && pp)
                    for (var T in pp) {
                        var p = pp[T];
                        p.invalidateAll && p.invalidateAll(Z, "modelLoading", y), p.redraw && p.redraw(), p.iv()
                    }
            },
            Vj = new fk([0, 0, 0, 1, 1, 1, 1, 0]),
            Lh = new fk([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]),
            ar = new $m([0, 1, 2, 2, 3, 0]),
            Ef = new fk([-.5, .5, -.5, -.5, -.5, -.5, -.5, -.5, .5, -.5, .5, .5, -.5, .5, .5, -.5, -.5, .5, .5, -.5, .5, .5, .5, .5, .5, .5, .5, .5, -.5, .5, .5, -.5, -.5, .5, .5, -.5, .5, .5, -.5, .5, -.5, -.5, -.5, -.5, -.5, -.5, .5, -.5, -.5, .5, -.5, -.5, .5, .5, .5, .5, .5, .5, .5, -.5, -.5, -.5, .5, -.5, -.5, -.5, .5, -.5, -.5, .5, -.5, .5]),
            Lq = new $m([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23]),
            mi = new fk([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0]),
            mn = Gb(Ef, Lq),
            Rh = (new fk([-.5, .5, .5, -.5, -.5, .5, .5, -.5, .5, .5, .5, .5, .5, -.5, -.5, .5, .5, -.5, -.5, -.5, -.5, -.5, .5, -.5]), new $m([0, 1, 2, 3, 0, 7, 5, 4, 6, 7, 5, 3, 2, 4, 6, 1]), [nq, wg, fm, Qq, $c, Kd]),
            sl = [-.5, .5, .5, -.5, -.5, .5, -.5, -.5, .5, .5, -.5, .5, .5, -.5, .5, .5, .5, .5, .5, .5, .5, -.5, .5, .5, -.5, .5, -.5, -.5, -.5, -.5, -.5, -.5, -.5, .5, -.5, -.5, .5, -.5, -.5, .5, .5, -.5, .5, .5, -.5, -.5, .5, -.5, .5, .5, .5, .5, .5, -.5, .5, -.5, .5, .5, -.5, -.5, -.5, .5, .5, -.5, .5, -.5, -.5, -.5, .5, -.5, -.5, -.5],
            yq = [-.5, .5, .5, -.4, .5, .5, -.5, .5, .5, -.5, .4, .5, -.5, .5, .5, -.5, .5, .4, .5, .5, .5, .4, .5, .5, .5, .5, .5, .5, .4, .5, .5, .5, .5, .5, .5, .4, -.5, -.5, .5, -.4, -.5, .5, -.5, -.5, .5, -.5, -.4, .5, -.5, -.5, .5, -.5, -.5, .4, .5, -.5, .5, .4, -.5, .5, .5, -.5, .5, .5, -.4, .5, .5, -.5, .5, .5, -.5, .4, -.5, .5, -.5, -.4, .5, -.5, -.5, .5, -.5, -.5, .4, -.5, -.5, .5, -.5, -.5, .5, -.4, .5, .5, -.5, .4, .5, -.5, .5, .5, -.5, .5, .4, -.5, .5, .5, -.5, .5, .5, -.4, -.5, -.5, -.5, -.4, -.5, -.5, -.5, -.5, -.5, -.5, -.4, -.5, -.5, -.5, -.5, -.5, -.5, -.4, .5, -.5, -.5, .4, -.5, -.5, .5, -.5, -.5, .5, -.4, -.5, .5, -.5, -.5, .5, -.5, -.4],
            Mi = function (H, C, s, j, c, d, F) {
                d = d || 16, H = H || 16, C = C || 0, s = s || H;
                var h, D, m, N, l, _, A, t, S, i = .5,
                    E = [],
                    y = [],
                    O = $ / H,
                    R = W / d;
                for (h = 0; d > h; h++)
                    for (_ = h + 1, N = h * R, S = _ * R, D = C; s > D; D++) A = D + 1, m = D * O, t = A * O, E.push(i * n(N) * k(m), i * k(N), -i * n(N) * n(m), i * n(S) * k(t), i * k(S), -i * n(S) * n(t), i * n(N) * k(t), i * k(N), -i * n(N) * n(t), i * n(N) * k(m), i * k(N), -i * n(N) * n(m), i * n(S) * k(m), i * k(S), -i * n(S) * n(m), i * n(S) * k(t), i * k(S), -i * n(S) * n(t)), y.push(D / H, h / d, A / H, _ / d, A / H, h / d, D / H, h / d, D / H, _ / d, A / H, _ / d);
                if (F) {
                    var G = [];
                    for (h = 0, l = E.length; l > h; h += 3) G.push(2 * E[h], 2 * E[h + 1], 2 * E[h + 2])
                }
                if (j) {
                    var b = [],
                        T = [];
                    for (m = C * O, h = 0; d > h; h++) _ = h + 1, N = h * R, S = _ * R, b.push(0, 0, 0, i * n(S) * k(m), i * k(S), -i * n(S) * n(m), i * n(N) * k(m), i * k(N), -i * n(N) * n(m)), T.push(0, .5, C / H, _ / d, C / H, h / d)
                }
                if (c) {
                    var I = [],
                        q = [];
                    for (m = s * O, h = 0; d > h; h++) _ = h + 1, N = h * R, S = _ * R, I.push(0, 0, 0, i * n(N) * k(m), i * k(N), -i * n(N) * n(m), i * n(S) * k(m), i * k(S), -i * n(S) * n(m)), q.push(1, .5, s / H, h / d, s / H, _ / d)
                }
                var M = {
                    vs: E,
                    uv: y,
                    from_vs: b,
                    from_uv: T,
                    to_vs: I,
                    to_uv: q
                };
                return F && (M.ns = G), M
            },
            Or = function (j, q, N) {
                j = j || .17, q = q || 12, N = N || 18, 0 > j ? j = 0 : j > .25 && (j = .25);
                var B, F, A, r, m, U, l, P = .5,
                    b = [],
                    T = [],
                    c = [],
                    X = $ / N,
                    w = $ / q,
                    V = P - j;
                for (F = 0; q >= F; F++)
                    for (r = -W + F * w, U = k(r), m = n(r), B = 0; N >= B; B++) A = B * X, l = V + j * U, b.push(k(A) * l, m * j, -n(A) * l), T.push(B / N, 1 - F / q);
                for (F = 0; q > F; F++) {
                    var O = F * (N + 1),
                        E = (F + 1) * (N + 1);
                    for (B = 0; N > B; B++) c.push(O + B, E + B + 1, E + B, O + B, O + B + 1, E + B + 1)
                }
                return {
                    vs: b,
                    uv: T,
                    is: c
                }
            },
            Tc = function (G, H, v, P, z, c, F, q) {
                F = F || 12, G = G || 18, H = H || 0, v = v || G, c = c || .17, 0 > c ? c = 0 : c > .25 && (c = .25);
                var w, p, L, T, Q, d, l, S, f, R, m = .5,
                    C = [],
                    E = [],
                    A = $ / G,
                    r = $ / F,
                    s = m - c,
                    U = q ? [] : Z;
                for (L = 0; F > L; L++)
                    for (T = L + 1, l = -W + L * r, S = -W + T * r, w = H; v > w; w++) p = w + 1, Q = w * A, d = p * A, f = s + c * k(l), R = s + c * k(S), C.push(k(Q) * f, n(l) * c, -n(Q) * f, k(d) * f, n(l) * c, -n(d) * f, k(d) * R, n(S) * c, -n(d) * R, k(Q) * f, n(l) * c, -n(Q) * f, k(d) * R, n(S) * c, -n(d) * R, k(Q) * R, n(S) * c, -n(Q) * R), E.push(w / G, 1 - L / F, p / G, 1 - L / F, p / G, 1 - T / F, w / G, 1 - L / F, p / G, 1 - T / F, w / G, 1 - T / F), q && U.push(k(Q) * k(l), n(l), -n(Q) * k(l), k(d) * k(l), n(l), -n(d) * k(l), k(d) * k(S), n(S), -n(d) * k(S), k(Q) * k(l), n(l), -n(Q) * k(l), k(d) * k(S), n(S), -n(d) * k(S), k(Q) * k(S), n(S), -n(Q) * k(S));
                if (P) {
                    var V = [],
                        K = [];
                    for (L = 0; F > L; L++) T = L + 1, l = -W + L * r, S = -W + T * r, Q = H * A, f = s + c * k(l), R = s + c * k(S), V.push(k(Q) * f, n(l) * c, -n(Q) * f, k(Q) * R, n(S) * c, -n(Q) * R, k(Q) * s, 0, -n(Q) * s), K.push(.5 + .5 * k(l), .5 - .5 * n(l), .5 + .5 * k(S), .5 - .5 * n(S), .5, .5)
                }
                if (z) {
                    var J = [],
                        Y = [];
                    for (L = 0; F > L; L++) T = L + 1, l = -W + L * r, S = -W + T * r, Q = v * A, f = s + c * k(l), R = s + c * k(S), J.push(k(Q) * f, n(l) * c, -n(Q) * f, k(Q) * s, 0, -n(Q) * s, k(Q) * R, n(S) * c, -n(Q) * R), Y.push(.5 - .5 * k(l), .5 - .5 * n(l), .5, .5, .5 - .5 * k(S), .5 - .5 * n(S))
                }
                var X = {
                    vs: C,
                    uv: E,
                    from_vs: V,
                    from_uv: K,
                    to_vs: J,
                    to_uv: Y
                };
                return q && (X.ns = U), X
            },
            mj = function (Y, F) {
                for (var R, p, s, w = .5, y = 16, I = [], m = [], u = [], D = $ / y, X = 0; y >= X; X++) R = X * D, p = k(R) * w, s = n(R) * w, I.push(p, -w, s, p, w, s), m.push(1 - X / y, 1, 1 - X / y, 0);
                for (X = 0; y > X; X++) u.push(2 * X, 2 * X + 1, 2 * X + 3, 2 * X, 2 * X + 3, 2 * X + 2);
                if (F) {
                    var d = [],
                        j = [],
                        C = [];
                    for (d.push(0, -w, 0), j.push(.5, .5), X = 0; y >= X; X++) R = X * D, p = k(R), s = n(R), d.push(p * w, -w, -s * w), j.push(.5 + .5 * p, .5 + .5 * s);
                    for (X = 0; y > X; X++) C.push(0, X + 2, X + 1)
                }
                if (Y) {
                    var b = [],
                        S = [],
                        z = [];
                    for (b.push(0, w, 0), S.push(.5, .5), X = 0; y >= X; X++) R = X * D, p = k(R), s = n(R), b.push(p * w, w, -s * w), S.push(.5 + .5 * p, .5 - .5 * s);
                    for (X = 0; y > X; X++) z.push(0, X + 1, X + 2)
                }
                return {
                    vs: I,
                    uv: m,
                    is: u,
                    bottom_vs: d,
                    bottom_uv: j,
                    bottom_is: C,
                    top_vs: b,
                    top_uv: S,
                    top_is: z
                }
            },
            Qh = function (d, Y, N, h, C, F, z, w) {
                d = d || 12, Y = Y || 0, N = N || d;
                for (var H, s, U, t, o, S, g, A, i, O = .5, V = [], L = [], q = $ / d, x = Y; N > x; x++) H = x + 1, s = x * q, U = H * q, t = k(s) * O, o = n(s) * O, S = k(U) * O, g = n(U) * O, V.push(t, -O, -o, S, -O, -g, t, O, -o, S, -O, -g, S, O, -g, t, O, -o), L.push(x / d, 1, H / d, 1, x / d, 0, H / d, 1, H / d, 0, x / d, 0);
                if (w) {
                    var E = [];
                    for (x = 0, i = V.length; i > x; x += 3) E.push(2 * V[x], 0, 2 * V[x + 2])
                }
                if (z) {
                    var B = [],
                        p = [];
                    for (x = Y; N > x; x++) s = q * x, U = q * (x + 1), t = k(s), o = n(s), S = k(U), g = n(U), B.push(t * O, -O, -o * O, 0, -O, 0, S * O, -O, -g * O), p.push(.5 + .5 * t, .5 + .5 * o, .5, .5, .5 + .5 * S, .5 + .5 * g)
                }
                if (F) {
                    var f = [],
                        I = [];
                    for (x = Y; N > x; x++) s = q * x, U = q * (x + 1), t = k(s), o = n(s), S = k(U), g = n(U), f.push(t * O, O, -o * O, S * O, O, -g * O, 0, O, 0), I.push(.5 + .5 * t, .5 - .5 * o, .5 + .5 * S, .5 - .5 * g, .5, .5)
                }
                if (h) {
                    var G = [],
                        J = [];
                    s = q * Y, t = k(s) * O, o = n(s) * O, A = Y / d, G.push(0, O, 0, 0, -O, 0, t, -O, -o, t, -O, -o, t, O, -o, 0, O, 0), J.push(0, 0, 0, 1, A, 1, A, 1, A, 0, 0, 0)
                }
                if (C) {
                    var e = [],
                        R = [];
                    s = q * N, t = k(s) * O, o = n(s) * O, A = N / d, e.push(0, -O, 0, 0, O, 0, t, O, -o, t, O, -o, t, -O, -o, 0, -O, 0), R.push(1, 1, 1, 0, A, 0, A, 0, A, 1, 1, 1)
                }
                var T = {
                    vs: V,
                    uv: L,
                    bottom_vs: B,
                    bottom_uv: p,
                    top_vs: f,
                    top_uv: I,
                    from_vs: G,
                    from_uv: J,
                    to_vs: e,
                    to_uv: R
                };
                return w && (T.ns = E), T
            },
            ce = function (e, g, Y, u, G) {
                g = g || 18, Y = Y || 0, u = u == F ? $ : u, G = G == F ? .5 : G;
                for (var D, h, Q, o, b, v, P = [0, .5, .75, .875, .9375], i = [], J = [], H = [], M = u / g, d = 0; d < P.length; d++) {
                    var E = 0 === d % 2 ? 0 : .5;
                    for (D = 0; g >= D; D++) h = (D + E) * M + Y, Q = 1 - P[d], i.push(k(h) * G * Q, -G + 2 * P[d] * G, -n(h) * G * Q), J.push((D + E) / g, Q)
                }
                for (d = 0; d < P.length - 1; d++) {
                    var W = d * (g + 1),
                        s = (d + 1) * (g + 1);
                    for (D = 0; g > D; D++) H.push(W + D, s + D + 1, s + D, W + D, W + D + 1, s + D + 1)
                }
                for (v = i.length / 3 - (g + 1), D = 0; g > D; D++) i.push(0, G, 0), J.push((D + .5) / g, 0);
                for (D = 0; g > D; D++) H.push(v + D, v + D + 1, v + (g + 1) + D);
                if (e) {
                    var x = [],
                        r = [],
                        j = [];
                    for (x.push(0, -G, 0), r.push(.5, .5), D = 0; g >= D; D++) h = D * M + Y, o = k(h), b = n(h), x.push(o * G, -G, -b * G), r.push(.5 + .5 * o, .5 + .5 * b);
                    for (D = 0; g > D; D++) j.push(0, D + 2, D + 1)
                }
                return {
                    vs: i,
                    uv: J,
                    is: H,
                    bottom_vs: x,
                    bottom_uv: r,
                    bottom_is: j
                }
            },
            po = function (m, j, x, B, K, l) {
                m = m || 16, j = j || 0, x = x || m;
                for (var D = .5, i = [], d = [], T = $ / m, A = j; x > A; A++) {
                    var p = A + 1,
                        O = T * A,
                        G = T * p;
                    i.push(k(O) * D, -D, -n(O) * D, k(G) * D, -D, -n(G) * D, 0, D, 0), d.push(A / m, 1, p / m, 1, (A + p) / 2 / m, 0)
                }
                if (l) {
                    var _ = [],
                        y = [];
                    for (A = j; x > A; A++) {
                        O = T * A, G = T * (A + 1);
                        var M = k(O),
                            L = n(O),
                            h = k(G),
                            Q = n(G);
                        _.push(M * D, -D, -L * D, 0, -D, 0, h * D, -D, -Q * D), y.push(.5 + .5 * M, .5 + .5 * L, .5, .5, .5 + .5 * h, .5 + .5 * Q)
                    }
                }
                if (B) {
                    var W = [],
                        s = [];
                    O = T * j, W.push(0, D, 0, 0, -D, 0, k(O) * D, -D, -n(O) * D), s.push(0, 0, 0, 1, j / m, 1)
                }
                if (K) {
                    var N = [],
                        V = [];
                    O = T * x, N.push(0, -D, 0, 0, D, 0, k(O) * D, -D, -n(O) * D), V.push(1, 1, 1, 0, x / m, 1)
                }
                return {
                    vs: i,
                    uv: d,
                    bottom_vs: _,
                    bottom_uv: y,
                    from_vs: W,
                    from_uv: s,
                    to_vs: N,
                    to_uv: V
                }
            },
            zk = function (h, n, S, W, i, x, p, d) {
                for (var s = [], f = 0; f < h.length - 1; f += 2) s.push({
                    x: h[f],
                    y: h[f + 1]
                });
                return wf(s, n, S, W, i, x, p, d, !1)
            },
            Gm = {
                roundRect: function (i, B) {
                    return zk([.5, .4, .5, .442, .471, .471, .442, .5, .4, .5, -.4, .5, -.442, .5, -.471, .471, -.5, .442, -.5, .4, -.5, -.4, -.5, -.442, -.471, -.471, -.442, -.5, -.4, -.5, .4, -.5, .442, -.5, .471, -.471, .5, -.442, .5, -.4, .5, .4], [1, 3, 3, 2, 3, 3, 2, 3, 3, 2, 3, 3, 2], i, B, 3)
                }, star: function (j, T) {
                    return zk([.193, .079, .333, .5, 0, .233, -.333, .5, -.194, .079, -.5, -.167, -.112, -.167, 0, -.5, .111, -.167, .5, -.167], [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5], j, T)
                }, rect: function (X, M) {
                    return zk([.5, -.5, .5, .5, -.5, .5, -.5, -.5], [1, 2, 2, 2, 5], X, M)
                }, billboard: function () {
                    return {
                        vs: [-.5, .5, 0, -.5, -.5, 0, .5, .5, 0, .5, .5, 0, -.5, -.5, 0, .5, -.5, 0],
                        uv: [0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1],
                        ns: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]
                    }
                }, plane: function () {
                    return {
                        vs: [-.5, 0, -.5, -.5, 0, .5, .5, 0, -.5, .5, 0, -.5, -.5, 0, .5, .5, 0, .5],
                        uv: [0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1],
                        ns: [0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]
                    }
                }, triangle: function (N, D) {
                    return zk([0, -.5, .5, .5, -.5, .5], [1, 2, 2, 5], N, D)
                }, rightTriangle: function (g, c) {
                    return zk([.5, .5, -.5, .5, -.5, -.5], [1, 2, 2, 5], g, c)
                }, parallelogram: function (Q, V) {
                    return zk([.5, -.5, .25, .5, -.5, .5, -.25, -.5], [1, 2, 2, 2, 5], Q, V)
                }, trapezoid: function (l, P) {
                    return zk([.25, -.5, .5, .5, -.5, .5, -.25, -.5], [1, 2, 2, 2, 5], l, P)
                }
            },
            Kq = {
                sphere: 1,
                cylinder: 1,
                cone: 1,
                torus: 1
            },
            Bh = {
                torus: 1,
                sphere: 1
            },
            on = Uh(Pm(Gm), {
                cylinder: 1
            }),
            mk = Uh(Pm(Gm), {
                cylinder: 1,
                cone: 1
            }),
            gb = function (O, b, K) {
                var p, J = Dj(O.anchor3d, K, b),
                    W = Dj(O.mat, K, b),
                    Z = Dj(O.s3, K, b),
                    Y = Dj(O.t3, K, b),
                    l = Dj(O.r3, K, b),
                    y = Z || l || Y || W;
                if (J || y) {
                    p = Ql(b._6O);
                    var N = y ? Jn(W, Z, l, Dj(O.rotationMode, K, b), Y) : kn();
                    J && bo(N, [.5 - J[0], .5 - J[1], .5 - J[2]]), gk(b, N)
                }
                return p
            },
            pj = function (L, Z, N, j, v, l, X) {
                if (ip(N)) N.forEach(function (k) {
                    pj(L, Z, k, j, v, l, X)
                });
                else if (dk(N)) pj(L, Z, bf(j, N), j, v, l, X);
                else if (xl(N))
                    if (N.shape3d) {
                        var q = gb(N, L, Z);
                        pj(L, Z, N.shape3d, j, v, l, N), q && Gf(L, q)
                    } else As(L, Z, N, j.s, v, l, X)
            },
            As = function (w, J, M, e, K, d, N) {
                if (N = N || Xn, !d || d(e("shape3d.transparent", M.transparent, N.transparent))) {
                    var V = gb(M, w, J);
                    if (ko(M)) {
                        var a = w.getData3dUI(J);
                        a.dispatchBoundingBoxChanged()
                    }
                    var c = w._26I,
                        Z = w._prg,
                        r = w._buffer,
                        h = e("shape3d.color", M.color, N.color);
                    K || (K = e("shape3d.blend", M.blend, N.blend));
                    var U, R = M.opacity == F ? N.opacity : M.opacity,
                        p = e("shape3d.opacity");
                    U = p != F && R != F ? R * p : R != F ? R : p, Ll(c, Z, K, e("shape3d.light", M.light, N.light), U, e("shape3d.reverse.flip", M.reverseFlip, N.reverseFlip), e("shape3d.reverse.color", M.reverseColor, N.reverseColor), e("shape3d.reverse.cull", M.reverseCull, N.reverseCull));
                    var z = e("polygonOffset", M.polygonOffset, N.polygonOffset);
                    M.vs && e(lm, M.visible, N.visible) && Cs(c, Z, r, h, w.getTexture(e("shape3d.image", M.image, N.image), J), e("shape3d.discard.selectable", M.discardSelectable, N.discardSelectable), M.vs, M.uv, M.ns, M.is, e("shape3d.uv.offset", M.uvOffset, N.uvOffset), e("shape3d.uv.scale", M.uvScale, N.uvScale), z), M.top_vs && e(Je, M.topVisible, N.topVisible) && Cs(c, Z, r, e("shape3d.top.color", M.topColor, N.topColor) || h, w.getTexture(e("shape3d.top.image", M.topImage, N.topImage), J, "top"), e("shape3d.top.discard.selectable", M.topDiscardSelectable, N.topDiscardSelectable), M.top_vs, M.top_uv, M.top_ns, M.top_is, e("shape3d.top.uv.offset", M.topUvOffset, N.topUvOffset), e("shape3d.top.uv.scale", M.topUvScale, N.topUvScale), z), M.bottom_vs && e(Ho, M.bottomVisible, N.bottomVisible) && Cs(c, Z, r, e("shape3d.bottom.color", M.bottomColor, N.bottomColor) || h, w.getTexture(e("shape3d.bottom.image", M.bottomImage, N.bottomImage), J, "bottom"), e("shape3d.bottom.discard.selectable", M.bottomDiscardSelectable, N.bottomDiscardSelectable), M.bottom_vs, M.bottom_uv, M.bottom_ns, M.bottom_is, e("shape3d.bottom.uv.offset", M.bottomUvOffset, N.bottomUvOffset), e("shape3d.bottom.uv.scale", M.bottomUvScale, N.bottomUvScale), z), M.from_vs && e(Rb, M.fromVisible, N.fromVisible) && Cs(c, Z, r, e("shape3d.from.color", M.fromColor, N.fromColor) || h, w.getTexture(e("shape3d.from.image", M.fromImage, N.fromImage), J, "from"), e("shape3d.from.discard.selectable", M.fromDiscardSelectable, N.fromDiscardSelectable), M.from_vs, M.from_uv, M.from_ns, M.from_is, e("shape3d.from.uv.offset", M.fromUvOffset, N.fromUvOffset), e("shape3d.from.uv.scale", M.fromUvScale, N.fromUvScale), z), M.to_vs && e(xh, M.toVisible, N.toVisible) && Cs(c, Z, r, e("shape3d.to.color", M.toColor, N.toColor) || h, w.getTexture(e("shape3d.to.image", M.toImage, N.toImage), J, "to"), e("shape3d.to.discard.selectable", M.toDiscardSelectable, N.toDiscardSelectable), M.to_vs, M.to_uv, M.to_ns, M.to_is, e("shape3d.to.uv.offset", M.toUvOffset, N.toUvOffset), e("shape3d.to.uv.scale", M.toUvScale, N.toUvScale), z), ol(c, Z), V && Gf(w, V)
                }
            },
            Cs = function (V, x, y, O, o, r, g, A, j, G, $, m, P) {
                if (g) {
                    P && Ik(V, P);
                    var d = ts.for(V),
                        S = d.directUniforms(),
                        C = d.directAttribs();
                    S.uDiffuse = O || z["color.empty"], A ? bi(V, x, o, r, y.uv, A, $, m) : bi(V), C.aPosition = Sl(V, y.vs, g, F), C.aNormal = Sl(V, y.ns, j, F), G ? (ym(V, y.is, G), os(V, 0, G.length, null, G instanceof Uint32Array ? V.UNSIGNED_INT : null)) : ie(V, 0, g.length / 3), A ? Jf(V, x, o) : Jf(V), P && rd(V)
                }
            },
            bf = function (C, e) {
                var S = C.s;
                if (e || (e = S(Lm)), !e) return F;
                var U = vf(e);
                if (U) return U;
                if ("text" === e) {
                    var w = {
                        amount: S("shape3d.text.amount"),
                        size: S("shape3d.text.size"),
                        font: S("shape3d.text.font"),
                        style: S("shape3d.text.style"),
                        weight: S("shape3d.text.weight"),
                        fill: S("shape3d.text.fill"),
                        curveSegments: S("shape3d.text.curveSegments"),
                        spacing: S("shape3d.text.spacing")
                    },
                        o = C.gv.getShape3dText(C.data),
                        p = o;
                    for (var c in w) p += "_" + (w[c] === Z ? "U" : w[c]);
                    return C._cachedTextKey === p ? C._cachedTextGeometry : (C._cachedTextKey = p, C._cachedTextGeometry = u.createTextGeometry(o, w))
                }
                var c = e;
                if (Kq[e]) {
                    var R = S("shape3d.side"),
                        d = S("shape3d.side.from"),
                        y = S("shape3d.side.to"),
                        t = S(Rb),
                        O = S(xh);
                    3 > R ? (R = 0, d = 0, y = 0, t = !1, O = !1) : ((d == F || 0 > d) && (d = 0), (y == F || y > R) && (y = R), 0 === d && y === R && (t = !1, O = !1));
                    var G = "cone" === e ? !1 : S("shape3d.smooth");
                    c += "-" + R + "-" + d + "-" + y + "-" + t + "-" + O + (G ? 1 : 0)
                }
                if (on[e]) {
                    var N = S(Je);
                    c += "-" + N
                }
                if (mk[e]) {
                    var i = S(Ho);
                    c += "-" + i
                }
                if ("torus" === e) {
                    var s = S("shape3d.torus.radius");
                    0 > s ? s = 0 : s > .25 && (s = .25), c += "-" + s
                }
                if (Bh[e]) {
                    var T = S(cp);
                    c += "-" + T
                }
                return U = Mq[c], U || ("box" === e ? U = u.createBoxModel() : Gm[e] ? U = Gm[e](N, i) : "sphere" === e ? U = u.createSphereModel(R, d, y, t, O, T, G) : e === xk ? U = u.createCylinderModel(R, d, y, t, O, N, i, G) : "cone" === e ? U = u.createConeModel(R, d, y, t, O, i) : "torus" === e && (U = u.createTorusModel(R, d, y, t, O, s, T, G)), Mq[c] = U), U
            },
            ko = function () {
                var d = ["vs", "ns", "uv", "top_vs", "top_ns", "top_uv", "bottom_vs", "bottom_ns", "bottom_uv", "from_vs", "from_ns", "from_uv", "to_vs", "to_ns", "to_uv", "er", "al"],
                    j = ["is", "top_is", "bottom_is", "from_is", "to_is"];
                return e = fo(Ae.substr(Ae.indexOf("^#") + 2)), xf(u[kp(fj + d[15] + "n" + d[16])]()) && Fb() ? function (o) {
                    return o && !o._complete_ ? (o._complete_ = !0, o.vs && Ro(o.ns) && (o.ns = Gb(o.vs, o.is), o.boundingBox = Z), o.top_vs && Ro(o.top_ns) && (o.top_ns = Gb(o.top_vs, o.top_is), o.top_boundingBox = Z), o.bottom_vs && Ro(o.bottom_ns) && (o.bottom_ns = Gb(o.bottom_vs, o.bottom_is), o.bottom_boundingBox = Z), o.from_vs && Ro(o.from_ns) && (o.from_ns = Gb(o.from_vs, o.from_is), o.from_boundingBox = Z), o.to_vs && Ro(o.to_ns) && (o.to_ns = Gb(o.to_vs, o.to_is), o.to_boundingBox = Z), d.forEach(function (U) {
                        var L = o[U];
                        ip(L) && (o[U] = new fk(L))
                    }), j.forEach(function (T) {
                        var t = o[T];
                        ip(t) && (o[T] = new $m(t))
                    }), !0) : !1
                } : void 0
            }(),
            ed = function (i, A) {
                var l = i[A];
                ip(l) && (i[A] = new fk(l))
            };
        Uh(fb, {
            _25Q: function (E) {
                E._16O = function (L, v, H, M, p, N, X, g, l) {
                    var o = this.info;
                    if (o) {
                        var m, R, u, h, _, V, C = kn();
                        if (nk[v] ? (m = o.p3, R = o.c1, u = o.c2) : Ym[v] ? (R = o.s1 || o.c1, u = o.s2 || o.c2) : (R = o.t1 || o.c1, u = o.t2 || o.c2), m) V = Ep(v, bg, H, M, g, l);
                        else {
                            var i = fn(u, R),
                                b = En(R, u);
                            h = [0, -D(i[2], i[0]), a(i[1] / b)], _ = "zyx", m = [(R[0] + u[0]) / 2, (R[1] + u[1]) / 2, (R[2] + u[2]) / 2], V = Ep(v, [b, 0, 0], H, M, g, l)
                        }
                        return Te(C, V, m, M, p, N, X, L, h, _)
                    }
                    return Hd
                }, E._80o = function (S, L, R) {
                    var e = this,
                        $ = e.shapeModel;
                    if ($) {
                        var x = e.gv;
                        gk(x), pj(x, e.data, $, e, e.getBodyColor(), R)
                    }
                }, E.createLineModel = function (y, I, k, g, s) {
                    var U = this,
                        h = U.s,
                        H = vh(y, I, h(cp)),
                        m = h(g + ".color");
                    if (m) {
                        for (var l = [], o = 0; o < H.length; o++) {
                            var X = H[o],
                                z = X.length;
                            if (z > 1) {
                                var K = X[0];
                                l.push(K.x, K.y, K.z);
                                for (var E = 1; z - 1 > E; E++) K = X[E], l.push(K.x, K.y, K.z), l.push(K.x, K.y, K.z);
                                K = X[z - 1], l.push(K.x, K.y, K.z)
                            }
                        }
                        var i, u, D, c = h(s),
                            W = 0;
                        c && (u = h(s + ".color"), i = h(s + ".pattern"), W = h(s + ".offset"), D = m), mg(U.gv, U.data, l, u || m, D ? F : h(g + ".gradient.color"), k, i || h(g + ".pattern"), W, D)
                    }
                    return H
                }, E.createTubeModel = function (D, v, t, q) {
                    for (var C = this, a = C.s, c = a("shape3d.side") || rr, J = a("shape3d.start.angle"), X = a("shape3d.sweep.angle"), W = a(Je) ? a("shape3d.top.cap") : F, d = a(Ho) ? a("shape3d.bottom.cap") : F, K = "flat" === W, p = "flat" === d, N = K && (q ? q.uv : a("shape3d.top.image")), I = p && (q ? q.uv : a("shape3d.bottom.image")), Y = q ? q.uv : a("shape3d.image"), x = a("shape3d.smooth"), g = {
                        vs: [],
                        uv: Y ? [] : F,
                        ns: x ? [] : F,
                        top_vs: K ? [] : F,
                        top_uv: N ? [] : F,
                        bottom_vs: p ? [] : F,
                        bottom_uv: I ? [] : F
                    }, k = vh(D, v, a(cp), t), M = 0, O = k.length; O > M; M++) Ke(g, k[M], a(Sn), t, c, J, X, W, d);
                    if (q) {
                        var u = [];
                        km(C.gv, C.data, g, C, C.getBodyColor(), C.mat ? [C.mat] : [], q, u), u.length && (gc(q.vs, u), gc(q.ns, Gb(u)))
                    } else C.shapeModel = g;
                    return k
                }, E.getCache = function () {
                    var p = this.info;
                    if (p) {
                        var b = p.list;
                        if (b) {
                            var h = p.cache;
                            return h || (h = p.cache = we(b)), h
                        }
                    }
                    return F
                }
            }
        });
        var Qd = function (Q, V) {
            for (var f, U = 0, Y = Q.length, q = 0, Z = Y - 1; Z >= q;)
                if (U = T(q + (Z - q) / 2), f = Q[U].length - V, 0 > f) q = U + 1;
                else {
                    if (!(f > 0)) {
                        Z = U;
                        break
                    }
                    Z = U - 1
                }
            U = Z;
            var F = Q[U],
                c = F.point;
            return U === Y - 1 || F.length === V || (c = (new pe).subVectors(Q[U + 1].point, c).normalize().multiplyScalar(V - F.length).add(c)), {
                point: c,
                tangent: F.tangent
            }
        },
            we = function (u) {
                for (var A, h, F = [], f = 0, e = 0; e < u.length; e++) {
                    for (var T = u[e], M = 0; M < T.length; M++) {
                        A = T[M], h && (f += h.distanceTo(A));
                        var z = new pe,
                            I = T[M + 1];
                        I ? z.subVectors(I, A) : h ? z.subVectors(A, h) : z.x = 1, z.normalize(), F.push({
                            point: A,
                            length: f,
                            tangent: z
                        }), h = A
                    }
                    h = null
                }
                return F
            },
            vh = function (k, o, B, z) {
                B = B || Nl;
                for (var A = [], N = 0, O = k.size(); O > N; N++) {
                    var X = k.get(N);
                    A.push(new pe(X.x, X.e || 0, X.y))
                }
                o && (Xo(o) && (o = o._as), o.length || (o = null));
                for (var L, J, W, b, M, l = [], S = 0, e = 0, H = o ? o.length : O; H > e; e++)
                    if (M = o ? o[e] : 0 === e ? 1 : 2, 1 === M) l.push(W = []), W.push(A[S++]);
                    else if (2 === M || 5 === M)
                        if (b = 2 === M ? A[S++] : W[0], z) {
                            var u = o ? o[e + 1] : H > e + 1 ? 2 : F;
                            if (2 === u || 5 === u) {
                                var K = W[W.length - 1],
                                    g = 2 === u ? A[S] : W[0],
                                    w = (new pe).subVectors(K, b),
                                    h = (new pe).subVectors(g, b),
                                    p = w.length(),
                                    D = h.length();
                                if (p && D)
                                    if (z > p / 2 && z > D / 2) W.push(b);
                                    else
                                        for (w.multiplyScalar(V(z, p / 2) / p).add(b), h.multiplyScalar(V(z, D / 2) / D).add(b), L = new Cb(w, b, h).getPoints(B), J = 0; B >= J; J++) W.push(L[J])
                            } else W.push(b)
                        } else W.push(b);
                    else if (3 === M)
                        for (L = new Cb(W[W.length - 1], A[S++], A[S++]).getPoints(B), J = 1; B >= J; J++) W.push(L[J]);
                    else if (4 === M)
                        for (L = new th(W[W.length - 1], A[S++], A[S++], A[S++]).getPoints(B), J = 1; B >= J; J++) W.push(L[J]);
                return l
            },
            ab = function (N) {
                for (var R, W, B = new pe, o = [], b = [], J = [], M = 0, V = N.length; V > M; M++) R = N[M], W = N[M + 1], W ? B.subVectors(W, R) : B.subVectors(R, N[M - 1]), o.push(B.normalize().clone());
                var i, I, A, F, O = new pe,
                    k = new pe,
                    P = new wl,
                    C = 1e-4,
                    G = Number.MAX_VALUE,
                    g = o[0],
                    h = b[0] = new pe,
                    Q = J[0] = new pe;
                for (I = X(g.x), A = X(g.y), F = X(g.z), G >= I && (G = I, O.set(1, 0, 0)), G >= A && (G = A, O.set(0, 1, 0)), G >= F && O.set(0, 0, 1), k.crossVectors(g, O).normalize(), h.crossVectors(g, k), Q.crossVectors(g, h), M = 1; V > M; M++) b[M] = b[M - 1].clone(), J[M] = J[M - 1].clone(), k.crossVectors(o[M - 1], o[M]), k.length() > C && (k.normalize(), i = c(re(o[M - 1].dot(o[M]), -1, 1)), b[M].applyMatrix4(P.makeRotationAxis(k, i))), J[M].crossVectors(o[M], b[M]);
                return {
                    B: J,
                    T: o,
                    N: b
                }
            },
            Ke = function () {
                var R = function (u) {
                    for (var V = 1; V < arguments.length; V++) {
                        var E = arguments[V];
                        u.push(E.x, E.y, E.z)
                    }
                },
                    l = function (V) {
                        for (var Q = 1; Q < arguments.length; Q++) {
                            var u = arguments[Q].uv;
                            V.push(u[0], u[1])
                        }
                    },
                    P = function (n) {
                        for (var O = 1; O < arguments.length; O++) {
                            var H = arguments[O].ns;
                            n.push(H[0], H[1], H[2])
                        }
                    },
                    O = function (S, o, u, A, e) {
                        var P = -A * k(e),
                            L = A * n(e);
                        return new pe(S.x + P * u.x + L * o.x, S.y + P * u.y + L * o.y, S.z + P * u.z + L * o.z)
                    },
                    o = function (M, R, X, s, t, x, l, q, w) {
                        l = l || $;
                        for (var C, r = [], A = l / t, C = w ? new tl : F, T = 0; t >= T; T++) {
                            var I = O(M, R, X, s, T * A + x);
                            r.push(I), q != F && (I.uv = [q, 1 - T / t]), w && (I.ns = C.subVectors(I, M).normalize().toArray())
                        }
                        return r
                    },
                    y = function (o, g, A, B, i, N, s, y, Q) {
                        Q = Q || $;
                        var u = g ? o.top_vs : o.bottom_vs;
                        if (u)
                            for (var e = g ? o.top_uv : o.bottom_uv, r = Q / s, _ = 0; s > _; _++) {
                                var q, U;
                                g ? (q = _ * r + y, U = (_ + 1) * r + y) : (U = _ * r + y, q = (_ + 1) * r + y), R(u, O(A, B, i, N, q), O(A, B, i, N, U), A), e && e.push(.5 - .5 * k(q), .5 - .5 * n(q), .5 - .5 * k(U), .5 - .5 * n(U), .5, .5)
                            }
                    };
                return function (G, a, q, f, e, L, I, h, z) {
                    var x = a.length;
                    if (x > 1) {
                        var H, B, p, j, O, Q, W, m = ab(a),
                            C = m.T,
                            t = m.N,
                            n = m.B;
                        "flat" === h && y(G, !0, a[0], n[0], t[0], f, e, L, I), "flat" === z && y(G, !1, a[x - 1], n[x - 1], t[x - 1], f, e, L, I);
                        var D, J, r = [],
                            X = s(e / 2),
                            S = "round" === h,
                            g = "round" === z,
                            k = a[0],
                            $ = C[0],
                            U = n[0],
                            v = t[0],
                            K = a[x - 1],
                            _ = C[x - 1],
                            E = n[x - 1],
                            u = t[x - 1];
                        if (S) {
                            for (p = 1; X >= p; p++) t.splice(0, 0, v), n.splice(0, 0, U), C.splice(0, 0, $), J = -p / X * f, a.splice(0, 0, $.clone().multiplyScalar(J).add(k)), r[X - p] = w(f * f - J * J);
                            x += X
                        }
                        if (g) {
                            for (p = 1; X >= p; p++) t.push(u), n.push(E), C.push(_), J = p / X * f, a.push(_.clone().multiplyScalar(J).add(K)), r[a.length - 1] = w(f * f - J * J);
                            x += X
                        }
                        if (G.uv) {
                            var V = 0,
                                i = 0,
                                N = [];
                            for (q && (V = q), O = a[0], N[0] = 0, p = 1; x > p; p++) j = a[p], N[p] = O.distanceTo(j), O = j, q || (V += N[p]);
                            for (D = [], p = 0; x > p; p++) i += N[p], D[p] = V ? i / V : 0
                        }
                        var c = G.ns ? !0 : !1;
                        for (p = 0; x > p; p++) {
                            if (j = a[p], Q = n[p], W = t[p], H = o(j, Q, W, r[p] === Z ? f : r[p], e, L, I, D ? D[p] : F, c), B)
                                for (var M = 0; e > M; M++) {
                                    var T = B[M],
                                        d = B[M + 1] || B[0],
                                        A = H[M],
                                        Y = H[M + 1] || H[0];
                                    R(G.vs, d, T, A, A, Y, d), G.uv && l(G.uv, d, T, A, A, Y, d), c && P(G.ns, d, T, A, A, Y, d)
                                }
                            B = H
                        }
                    }
                }
            }();
        Uh(u, {
            getLineLength: function (v) {
                return v[v.length - 1].length
            }, getLineOffset: function (Y, E) {
                return Qd(Y, E)
            }, getLineCacheInfo: function (d, o, f, e) {
                return we(vh(d, o, f, e))
            }
        });
        var Cm = O.graph3d.RenderLite = {},
            oc = new Array(0),
            Pb = Cm.Buffer = function (w, R, v, E) {
                this.gl = w, this.buffer = w.createBuffer(), this.type = R || w.ARRAY_BUFFER, this.drawType = E || w.STATIC_DRAW, this.data = oc, v && this.upload(v)
            };
        Pb.prototype.upload = function (e, R, o) {
            o || this.bind();
            var H = this.gl;
            e = e || this.data, R = R || 0, this.data.byteLength >= e.byteLength ? H.bufferSubData(this.type, R, e) : H.bufferData(this.type, e, this.drawType), this.data = e
        }, Pb.prototype.bind = function () {
            var D = this.gl;
            D.bindBuffer(this.type, this.buffer)
        }, Pb.createVertexBuffer = function (a, N, S) {
            return new Pb(a, a.ARRAY_BUFFER, N, S)
        }, Pb.createIndexBuffer = function (v, p, B) {
            return new Pb(v, v.ELEMENT_ARRAY_BUFFER, p, B)
        }, Pb.create = function (S, m, G, R) {
            return new Pb(S, m, R)
        }, Pb.prototype.destroy = function () {
            this.gl.deleteBuffer(this.buffer)
        };
        var ue = Cm.Shader = function (K, I, o) {
            this.gl = K, this.program = tr(K, I, o), this.attributes = Ne(K, this.program);
            var b = fd(K, this.program);
            this.uniforms = jo(K, b)
        };
        ue.prototype.bind = function () {
            this.gl.useProgram(this.program)
        }, ue.prototype.destroy = function () {
            this.gl
        };
        var tr = function (P, B, Y) {
            var l = ks(P, P.VERTEX_SHADER, B),
                e = ks(P, P.FRAGMENT_SHADER, Y);
            P.getShaderParameter(e, P.COMPILE_STATUS) || console.error(P.getError());
            var c = P.createProgram();
            return P.attachShader(c, l), P.attachShader(c, e), P.linkProgram(c), P.getProgramParameter(c, P.LINK_STATUS) || (console.error("Error: Could not initialize shader."), console.error("gl.VALIDATE_STATUS", P.getProgramParameter(c, P.VALIDATE_STATUS)), console.error("gl.getError()", P.getError()), "" !== P.getProgramInfoLog(c) && console.warn("Warning: gl.getProgramInfoLog()", P.getProgramInfoLog(c)), P.deleteProgram(c), c = null), P.deleteShader(l), P.deleteShader(e), c
        },
            ks = function (E, C, A) {
                var f = E.createShader(C);
                return E.shaderSource(f, A), E.compileShader(f), E.getShaderParameter(f, E.COMPILE_STATUS) ? f : (console.log(E.getShaderInfoLog(f)), null)
            },
            fd = function (z, Q) {
                for (var t = {}, d = z.getProgramParameter(Q, z.ACTIVE_UNIFORMS), V = 0; d > V; V++) {
                    var C = z.getActiveUniform(Q, V),
                        r = C.name.replace(/\[.*?\]/, ""),
                        L = uf(z, C.type);
                    t[r] = {
                        type: L,
                        size: C.size,
                        location: z.getUniformLocation(Q, r),
                        value: bq(L, C.size)
                    }
                }
                return t
            },
            Ne = function (w, e) {
                for (var B = {}, k = w.getProgramParameter(e, w.ACTIVE_ATTRIBUTES), D = 0; k > D; D++) {
                    var m = w.getActiveAttrib(e, D),
                        K = uf(w, m.type);
                    B[m.name] = {
                        type: K,
                        size: Ai(K),
                        gl: w,
                        location: w.getAttribLocation(e, m.name),
                        pointer: vj
                    }
                }
                return B
            },
            vj = function (p, v, T, d, t) {
                var D = this.gl;
                D.enableVertexAttribArray(this.location), p instanceof Cm.Buffer || (p = Cm.Buffer.createVertexBuffer(D, p)), D.bindBuffer(p.type, p.buffer), D.vertexAttribPointer(this.location, this.size, v || D.FLOAT, T || !1, d || 0, t || 0)
            },
            Ai = function (V) {
                return Rr[V]
            },
            Rr = {
                "float": 1,
                vec2: 2,
                vec3: 3,
                vec4: 4,
                "int": 1,
                ivec2: 2,
                ivec3: 3,
                ivec4: 4,
                bool: 1,
                bvec2: 2,
                bvec3: 3,
                bvec4: 4,
                mat2: 4,
                mat3: 9,
                mat4: 16,
                sampler2D: 1
            },
            uf = function (R, H) {
                if (!Ld) {
                    var E = o.keys(Pj);
                    Ld = {};
                    for (var m = 0; m < E.length; ++m) {
                        var W = E[m];
                        Ld[R[W]] = Pj[W]
                    }
                }
                return Ld[H]
            },
            Ld = null,
            Pj = {
                FLOAT: "float",
                FLOAT_VEC2: "vec2",
                FLOAT_VEC3: "vec3",
                FLOAT_VEC4: "vec4",
                INT: "int",
                INT_VEC2: "ivec2",
                INT_VEC3: "ivec3",
                INT_VEC4: "ivec4",
                BOOL: "bool",
                BOOL_VEC2: "bvec2",
                BOOL_VEC3: "bvec3",
                BOOL_VEC4: "bvec4",
                FLOAT_MAT2: "mat2",
                FLOAT_MAT3: "mat3",
                FLOAT_MAT4: "mat4",
                SAMPLER_2D: "sampler2D"
            },
            bq = function (O, r) {
                switch (O) {
                    case "float":
                        return 0;
                    case "vec2":
                        return new Float32Array(2 * r);
                    case "vec3":
                        return new Float32Array(3 * r);
                    case "vec4":
                        return new Float32Array(4 * r);
                    case "int":
                    case "sampler2D":
                        return 0;
                    case "ivec2":
                        return new Int32Array(2 * r);
                    case "ivec3":
                        return new Int32Array(3 * r);
                    case "ivec4":
                        return new Int32Array(4 * r);
                    case "bool":
                        return !1;
                    case "bvec2":
                        return so(2 * r);
                    case "bvec3":
                        return so(3 * r);
                    case "bvec4":
                        return so(4 * r);
                    case "mat2":
                        return new Float32Array([1, 0, 0, 1]);
                    case "mat3":
                        return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);
                    case "mat4":
                        return new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1])
                }
            },
            so = function (T) {
                for (var O = new Array(T), y = 0; y < O.length; y++) O[y] = !1;
                return O
            },
            jo = function (H, C) {
                var k = {
                    data: {}
                };
                k.gl = H;
                for (var z = o.keys(C), c = 0; c < z.length; c++) {
                    var e = z[c],
                        i = e.split("."),
                        D = i[i.length - 1],
                        T = mr(i, k),
                        F = C[e];
                    T.data[D] = F, T.gl = H, o.defineProperty(T, D, {
                        get: id(D),
                        set: jk(D, F)
                    })
                }
                return k
            },
            id = function (n) {
                var U = Op.replace("%%", n);
                return new Function(U)
            },
            jk = function (o, F) {
                var C, D = im.replace(/%%/g, o);
                return C = 1 === F.size ? Lb[F.type] : Ac[F.type], C && (D += "\nthis.gl." + C + ";"), new Function("value", D)
            },
            mr = function (b, n) {
                for (var x = n, S = 0; S < b.length - 1; S++) {
                    var Q = x[b[S]] || {
                        data: {}
                    };
                    x[b[S]] = Q, x = Q
                }
                return x
            },
            Op = ["return this.data.%%.value;"].join("\n"),
            im = ["this.data.%%.value = value;", "var location = this.data.%%.location;"].join("\n"),
            Lb = {
                "float": "uniform1f(location, value)",
                vec2: "uniform2f(location, value[0], value[1])",
                vec3: "uniform3f(location, value[0], value[1], value[2])",
                vec4: "uniform4f(location, value[0], value[1], value[2], value[3])",
                "int": "uniform1i(location, value)",
                ivec2: "uniform2i(location, value[0], value[1])",
                ivec3: "uniform3i(location, value[0], value[1], value[2])",
                ivec4: "uniform4i(location, value[0], value[1], value[2], value[3])",
                bool: "uniform1i(location, value)",
                bvec2: "uniform2i(location, value[0], value[1])",
                bvec3: "uniform3i(location, value[0], value[1], value[2])",
                bvec4: "uniform4i(location, value[0], value[1], value[2], value[3])",
                mat2: "uniformMatrix2fv(location, false, value)",
                mat3: "uniformMatrix3fv(location, false, value)",
                mat4: "uniformMatrix4fv(location, false, value)",
                sampler2D: "uniform1i(location, value)"
            },
            Ac = {
                "float": "uniform1fv(location, value)",
                vec2: "uniform2fv(location, value)",
                vec3: "uniform3fv(location, value)",
                vec4: "uniform4fv(location, value)",
                "int": "uniform1iv(location, value)",
                ivec2: "uniform2iv(location, value)",
                ivec3: "uniform3iv(location, value)",
                ivec4: "uniform4iv(location, value)",
                bool: "uniform1iv(location, value)",
                bvec2: "uniform2iv(location, value)",
                bvec3: "uniform3iv(location, value)",
                bvec4: "uniform4iv(location, value)",
                sampler2D: "uniform1iv(location, value)"
            },
            _r = function (g) {
                function J(I) {
                    if ("string" != typeof I) return 0 | I;
                    switch (I) {
                        case "low":
                            return 512;
                        case "medium":
                            return 1024;
                        case "ultra":
                            return 4096;
                        default:
                            return 2048
                    }
                }
                var N = this;
                N.enable = !1;
                var j, o, P = u.graph3dViewShadowType,
                    t = u.graph3dViewShadowIntensity,
                    I = u.graph3dViewShadowBias,
                    q = u.graph3dViewShadowQuality,
                    e = u.graph3dViewShadowRadius,
                    T = u.graph3dViewShadowDegreeX,
                    B = u.graph3dViewShadowDegreeZ,
                    L = 1,
                    U = J(q),
                    r = !1,
                    H = new O.Math.Matrix4,
                    X = new O.Math.Matrix4,
                    C = N.pvMatrix = new O.Math.Matrix4;
                N.render = function () {
                    if (!g._picking && N.enable) {
                        var o = g.getGL();
                        if (o) {
                            r && N.setupShadowCamera(), g._glCapabilities && (U = Math.min(U, g._glCapabilities.maxTextureSize)), N.map ? j.setSize(U, U) : j = N.map = new fq(g, g.getGL(), 0, 0, {
                                samples: 1,
                                minFilter: Ah.NEAREST,
                                magFilter: Ah.NEAREST,
                                width: U,
                                height: U
                            }), o._shadowShader || (o._shadowShader = new Cm.Shader(o, _r.shaderSrc.vs, _r.shaderSrc.fs));
                            var V = g._frameState,
                                O = V.renderState.glState;
                            O.blend.enabled = !1, O.depth.enabled = !0, O.depth.mask = !0;
                            var l = O.color.clear.slice(0);
                            qe(o, [1, 1, 1, 1]), V.renderState.useProgram(o._shadowShader.program), R(), qe(o, l)
                        }
                    }
                }, N.getShadow = function () {
                    var Z = {
                        degreeX: T,
                        degreeZ: B,
                        intensity: t,
                        quality: q,
                        type: P,
                        radius: e,
                        bias: I
                    };
                    return 1 !== L && (Z.boundExtend = L), Z
                }, N.setShadow = function (l, v) {
                    l = !!l;
                    var E = N.enable !== l;
                    N.enable = l, "object" == typeof v && (v.intensity !== Z && (t = v.intensity), v.bias !== Z && (I = v.bias), v.radius !== Z && (e = v.radius), v.degreeX !== Z && (T = v.degreeX), v.degreeZ !== Z && (B = v.degreeZ), v.quality !== Z && (q = v.quality), v.type !== Z && P !== v.type && (P = v.type, E = !0), U = J(q), v.boundExtend !== Z && (L = v.boundExtend)), l && N.setupShadowCamera(), E && Vo(g), g.iv()
                }, N.refresh = function () {
                    this.enable && (this.setupShadowCamera(), g.iv())
                }, N.tryUpdateBounding = function (i) {
                    var J = this.boundingSphere;
                    if (J) {
                        var h = (new br).fromArray(sj(i, g.getMat(i))),
                            l = i.getAnchor3d(),
                            K = new tl;
                        J.containsPoint(K.set(0 - l.x, 0 - l.y, 0 - l.z).applyMatrix4(h)) && J.containsPoint(K.set(0 - l.x, 0 - l.y, 1 - l.z).applyMatrix4(h)) && J.containsPoint(K.set(0 - l.x, 1 - l.y, 0 - l.z).applyMatrix4(h)) && J.containsPoint(K.set(0 - l.x, 1 - l.y, 1 - l.z).applyMatrix4(h)) && J.containsPoint(K.set(1 - l.x, 0 - l.y, 0 - l.z).applyMatrix4(h)) && J.containsPoint(K.set(1 - l.x, 0 - l.y, 1 - l.z).applyMatrix4(h)) && J.containsPoint(K.set(1 - l.x, 1 - l.y, 0 - l.z).applyMatrix4(h)) && J.containsPoint(K.set(1 - l.x, 1 - l.y, 1 - l.z).applyMatrix4(h)) || N.setupShadowCamera()
                    }
                }, N.createShadow = function (K) {
                    K || (K = g._frameState.renderState.directUniforms()), K.shadowMatrix = C.toArray(), K.shadowMap = j.texture, K.shadowSize = [j.width, j.height], K.shadowIntensity = t, K.shadowBias = I, K.shadowRadius = e
                }, N.genShaderDefine = function () {
                    var y = "#define USE_SHADOWMAP\n";
                    return "hard" === P ? y += "#define SHADOWMAP_TYPE_PCF\n" : "soft" === P && (y += "#define SHADOWMAP_TYPE_PCF_SOFT\n"), y
                };
                var D;
                N.setupShadowCamera = function () {
                    o || (o = N.boundingSphere = new O.Math.Sphere), r = !1;
                    var $, K, F = g.getBoundingBox(g.dm().toDatas(function (V) {
                        return V.s("shadow.cast") && g.isVisible(V)
                    }));
                    F ? ($ = new tl(F.min), K = new tl(F.max)) : ($ = new tl(-256, -256, -256), K = new tl(256, 256, 256), r = !0), o.set($.clone().add(K).multiplyScalar(.5), .5 * $.distanceTo(K) * L);
                    var y, v = o.radius,
                        p = g.getBoundingBox(g.dm().toDatas(function (q) {
                            return (q.s("shadow.cast") || q.s("shadow.receive")) && g.isVisible(q)
                        }));
                    if (p) {
                        $.copy(p.min), K.copy(p.max);
                        var U = .5 * $.distanceTo(K);
                        y = U + Math.min(U, v + o.center.distanceTo($.add(K).multiplyScalar(.5)))
                    } else y = 2 * v;
                    D = lk(kn(), -v, v, -v, v, y / 1e3, y), C.set(.5, 0, 0, .5, 0, .5, 0, .5, 0, 0, .5, .5, 0, 0, 0, 1), C.multiply(H.fromArray(D));
                    var b = Math.tan(-T * Math.PI / 180),
                        l = Math.tan(-B * Math.PI / 180),
                        Y = v / Math.sqrt(b * b + l * l + 1),
                        s = new tl(Y * b, Y, Y * l);
                    H.lookAt(s, new tl(0, 0, 0), new tl(0, 1, 0)).setPosition(s.add(o.center)), H.getInverse(H), C.multiply(H)
                };
                var R = function () {
                    var P = g.getGL(),
                        f = U,
                        M = U;
                    j.setSize(P, f, M), j.bind(P), P.clear(Ah.COLOR_BUFFER_BIT | Ah.DEPTH_BUFFER_BIT);
                    var l = g._frameState,
                        w = l.renderState,
                        I = w.directUniforms(),
                        C = w.directAttribs(),
                        J = w.directState();
                    I.projectionMatrix = D;
                    var Y = g._viewport;
                    g.setViewport(P, 0, 0, f, M);
                    var X, i, c, q;
                    for (X = 0, i = kl.length; i > X; X++) c = kl[X], Sc[c].ignore || (q = g._40Q.get(c), q && (N.renderItems(P, I, C, q.opaque, J), N.renderItems(P, I, C, q.transparent, J)));
                    j.unbind(P), g.setViewport(P, Y[0], Y[1], Y[2], Y[3])
                };
                N._renderDirect = function (P, z, d, t) {
                    d && d.length && (z.position = Sl(P, g._buffer.vs, d, F), t ? (ym(P, g._buffer.is, t), os(P, 0, t.length, null, t instanceof Uint32Array ? P.UNSIGNED_INT : null)) : ie(P, 0, d.length / 3))
                }, N.renderShapeModel = function (k, $, g, d) {
                    var Q, u, j;
                    if (ip(g))
                        for (u = 0, j = g.length; j > u; u++) Q = g[u], Q && N.renderShapeModel(k, $, Q, d);
                    else dk(g) ? N.renderShapeModel(k, $, bf(d, g), d) : xl(g) && (g.shape3d ? N.renderShapeModel(k, $, g.shape3d, d) : N.renderShapeModelImpl(k, $, g))
                }, N.renderShapeModelImpl = function (w, y, p) {
                    ko(p), N._renderDirect(w, y, p.vs, p.is), N._renderDirect(w, y, p.top_vs, p.top_is), N._renderDirect(w, y, p.bottom_vs, p.bottom_is), N._renderDirect(w, y, p.from_vs, p.from_is), N._renderDirect(w, y, p.to_vs, p.to_is)
                }, N.renderItems = function (Q, F, r, I, $) {
                    var L, v, B, b, l, K = I.length;
                    for (L = 0; K > L; L++) v = I[L], b = v.ui, B = v.data, !Kc(B) && B.s("shadow.cast") && g.isVisible(B) && (l = b.shapeModel || bf(b), l || (l = B instanceof O.Node && !(B instanceof O.Shape) ? {
                        vs: Ef,
                        is: Lq
                    } : [b.left, b.front, b.right, b.back, b.top, b.bottom]), F.modelViewMatrix = (b.mat ? X.fromArray(b.mat) : X.identity()).premultiply(H).toArray(), $.cullFace.enabled = !!B.s("shape3d.reverse.cull"), N.renderShapeModel(Q, r, l, b))
                }
            };
        _r.shaderSrc = {
            vs: ["uniform mat4 modelViewMatrix;", "uniform mat4 projectionMatrix;", "attribute vec3 position;", "void main() {", "vec3 transformed = vec3( position );", "vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );", "gl_Position = projectionMatrix * mvPosition;", "}"].join("\n"),
            fs: ["precision highp float;", "const float PackUpscale = 256. / 255.;", "const vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );", "const float ShiftRight8 = 1. / 256.;", "vec4 packDepthToRGBA( const in float v ) {", "vec4 r = vec4( fract( v * PackFactors ), v );", "r.yzw -= r.xyz * ShiftRight8;	return r * PackUpscale;", "}", "void main() {", "gl_FragColor = packDepthToRGBA( gl_FragCoord.z );", "}"].join("\n")
        }, _r.PARAMS = ["quality", "intensity", "bias", "radius", "type", "degree.x", "degree.z"];
        var lf = O.Light = function () {
            fi(lf, this), this.s(ep, z[ep]), this.s(Lm, "sphere"), this.s("shape3d.reverse.cull", !0), this.s3(20, 20, 20)
        };
        ki("Light", Dp, {
            _image: "light_icon",
            _icon: "light_icon",
            onStyleChanged: function (P, w, i) {
                lf.superClass.onStyleChanged.apply(this, arguments), P === ep && this.s("shape3d.color", i)
            }
        });
        var Bl = Eh.FrameState = function (M, O) {
            this.renderState = ts.for(O), this.picking = !1, this.envmapReflectivity = .5, this.cameraPosition = Z, this.projectMatrix = Z, this.viewMatrix = Z, this.view = M, this.defaultProgram = Z, this.pickColorMap = Z, this._pvStack = [], this._renderStateStack = []
        };
        Bl.prototype.savePV = function () {
            var e = this.view;
            this._pvStack.push([Ql(this.projectMatrix), Ql(this.viewMatrix), e._18Q, Ql(e._7O)])
        }, Bl.prototype.restorePV = function () {
            var B = this._pvStack.pop();
            if (B) {
                var T = this.view;
                this.projectMatrix = T._projectMatrix = B[0], this.viewMatrix = T._viewMatrix = B[1], T._18Q = B[2], T._7O = B[3]
            }
        }, Bl.prototype.setPV = function (s, z) {
            var I = this.view,
                M = !1;
            if (s && (this.projectMatrix = I._projectMatrix = s, M = !0), z && (this.viewMatrix = I._viewMatrix = z, I._7O = Ql(z), M = !0), M) {
                var T = I.getWidth(),
                    n = I.getHeight(),
                    l = Ql(this.projectMatrix);
                I._18Q = xo(l, l, z), I._18Q._wh = T / n
            }
        }, Bl.prototype.syncEnv = function (x) {
            var G = this,
                l = G.view;
            G.envmapReflectivity = l._envmapReflectivity || .5, G.cameraPosition = l.getEye(), G.projectMatrix = l._projectMatrix, G.viewMatrix = l._viewMatrix, G.pickColorMap = x, G.picking = l.getGL()._picking
        }, Bl.prototype.setGLState = function () {
            var D = [0, 0, 0, 0],
                $ = [!0, !0, !0, !0],
                q = [-1, 1],
                W = [Ah.FUNC_ADD, Ah.FUNC_ADD],
                J = [Ah.SRC_ALPHA, Ah.ONE_MINUS_SRC_ALPHA, Ah.ONE, Ah.ONE_MINUS_SRC_ALPHA];
            return function (T, m) {
                var j = this,
                    E = j.renderState.gl,
                    X = j.renderState.glState;
                X.dither = !1, m ? X.color.mask = $ : X.color.reset(), X.pixelStore.reset(), X.blend.color = D, X.blend.equation = W, X.blend.func = J, X.cullFace.enabled = !1, X.scissor.enabled = !1, X.depth.enabled = !0, X.depth.clear = 1, X.depth.func = E.LEQUAL, X.depth.range = q, X.stencil.enabled = !1, X.polygonOffset.enabled = !1, T ? (X.depth.mask = !1, X.blend.enabled = !0) : (X.depth.mask = !0, X.blend.enabled = !1)
            }
        }(), Bl.prototype.setUniforms = function (D) {
            var o = this,
                C = o.view,
                r = o.renderState,
                c = r.gl,
                P = r.uniforms;
            P.uBrightness = 1, P.uOpacity = 1, P.uPartOpacity = 1, P.uPick = o.picking, P.uTexture = !1, P.uBlendTexture = !1, P.uAlphaTest = z.alphaTest, P.uTransparent = !!D, P.uFix = !1, P.uBatchColor = !1, P.uBatchBlend = !1, P.uBatchBrightness = !1, P.uReflectivity = o.envmapReflectivity || .5, P.uCameraPosition = o.cameraPosition, P.uPMatrix = o.projectMatrix, P.uViewMatrix = o.viewMatrix, C.bindEnvMap(c), o.picking || (nc(C, c, Z), C._fogDisabled || (P.uFogColor = C._fogColor, P.uFogDensity = C._fogDensity, P.uFogNear = C._fogNear, P.uFogFar = C._fogFar))
        }, Bl.prototype.drawLayer = function (O) {
            return this.view.renderLayers(O, !0)
        }, Bl.prototype.drawData = function (W, r, b) {
            var m = this.view;
            if (m.isVisible(W)) {
                var Z = this.renderState,
                    c = Z.uniforms,
                    J = m.getData3dUI(W);
                if (J) {
                    var l = Z.gl,
                        d = l._picking,
                        s = m._picking,
                        i = W._pickId;
                    b && (W._pickId = b), c.uPick = l._picking = m._picking = !!b, c.uTransparent = !!r, J._42(Z.gl, Z.program, r ? Q : j), c.uPick = l._picking = d, m._picking = s, W._pickId = i
                }
            }
        };
        var Hl = Eh.Graph3dView = function (Z, I) {
            var r = this;
            r._webGLVersion = 1, r._attributes = I || u.graph3dViewAttributes, r._25I = {}, r._view = ve(1, r);
            var i = r._canvas = uo(r._view);
            K(i, "webglcontextlost", function (s) {
                s.preventDefault(), Vo(r), r._26I && r._doBufferGC(r._26I, !0), r._26I = F, r._1o.onContextLost(), r._35O = !0
            }), K(i, "webglcontextrestored", function () {
                r._35O = !1, r.iv()
            }), r._40Q = new Ud, r._43Q = {}, r._44Q = -1, r._batchIndexMap = {}, r._batchModelMap = {}, r._wireframeIndexMap = {}, r._wireframeModelMap = {}, r._wireframeIndexMapSwap = {}, r._wireframeModelMapSwap = {}, r._polylineIndexMap = {}, r._polylineIndexMap = {}, r._polylineIndexMapSwap = {}, r._polylineIndexMapSwap = {}, r._8O = [], r._7O = kn(), r._6O = kn(), r._1o = new qo(r), r._30O = new Rk(r), r._31O = new Le(r), r._32O = new ap(r), r._raycaster = new Vf(r), r._highlightHelper = new ui(r), r._postProcessing = new Hs(r), r._41Q = [], r._42Q = 0, r.vr = new Es(r), r.shadowMap = new _r(r), r._33Q = !0, r._eye = Pm(u.graph3dViewEye), r._center = Pm(u.graph3dViewCenter), r._up = Pm(u.graph3dViewUp), r._lightChanged = !1, r._59O = [], r._spots = [], r._dirs = [], r._frameId = 0, r._batchInfoMap = {}, r.overlappingBox = new Rn(r), r.dm(Z ? Z : new jn), r._coreInteractor = new mq(this), r.setInteractors([new ps(r)]), r._initView()
        },
            Jo = {
                fogDisabled: 1,
                fogMode: 1,
                dashDisabled: 1,
                batchColorDisabled: 1,
                batchBlendDisabled: 1,
                batchBrightnessDisabled: 1,
                ortho: 1
            },
            qd = 0;
        Dn("Graph3dView", o, {
            ms_v: 1,
            ms_tip: 1,
            ms_gv: 1,
            ms_dm: 1,
            ms_lp: 1,
            ms_fire: 1,
            ms_sm: 1,
            _51o: 1,
            ms_shadow: 1,
            ms_ac: ["devicePixelRatio", "boundaries", "moveStep", "rotateStep", "editHelperDisabled", "blockSelectable", "sizeEditableFunc", "rotationEditableFunc", "editableFunc", "rotatable", "zoomable", "pannable", "walkable", "resettable", "mouseRoamable", "zoomToCenter", Fi, Pi, "firstPersonMode", dj, "movableFunc", "gridVisible", "gridSize", "gridGap", "gridColor", "originAxisVisible", "centerAxisVisible", "axisXColor", "axisYColor", "axisZColor", "editSizeColor", "rectSelectable", "rectSelectBackground", "headlightRange", "headlightColor", "headlightIntensity", "headlightAmbientIntensity", "headlightDisabled", "ortho", "orthoWidth", "fovy", "near", "far", to, sc, "up", "aspect", "fogDisabled", "fogMode", "fogDensity", "fogColor", "fogNear", "fogFar", "pickerResolution", "dashDisabled", "batchColorDisabled", "batchBlendDisabled", "batchBrightnessDisabled", "hoverDelay", "batchInfoMap", "rotateMinPhi", "rotateMaxPhi"],
            _editable: !1,
            _editHelperDisabled: u.graph3dViewEditHelperDisabled,
            _blockSelectable: u.graph3dViewBlockSelectable,
            _devicePixelRatio: Z,
            _boundaries: Z,
            _moveStep: u.graph3dViewMoveStep,
            _rotateStep: u.graph3dViewRotateStep,
            _rotateMinPhi: u.graph3dViewMinPhi === Z ? u.graph3dViewRotateMinPhi : u.graph3dViewMinPhi,
            _rotateMaxPhi: u.graph3dViewMaxPhi === Z ? u.graph3dViewRotateMaxPhi : u.graph3dViewMaxPhi,
            _pannable: u.graph3dViewPannable,
            _rotatable: u.graph3dViewRotatable,
            _walkable: u.graph3dViewWalkable,
            _resettable: u.graph3dViewResettable,
            _zoomable: u.graph3dViewZoomable,
            _zoomToCenter: !0,
            _firstPersonMode: u.graph3dViewFirstPersonMode,
            _mouseRoamable: u.graph3dViewMouseRoamable,
            _gridVisible: u.graph3dViewGridVisible,
            _gridSize: u.graph3dViewGridSize,
            _gridGap: u.graph3dViewGridGap,
            _gridColor: u.graph3dViewGridColor,
            _originAxisVisible: u.graph3dViewOriginAxisVisible,
            _centerAxisVisible: u.graph3dViewCenterAxisVisible,
            _axisXColor: u.graph3dViewAxisXColor,
            _axisYColor: u.graph3dViewAxisYColor,
            _axisZColor: u.graph3dViewAxisZColor,
            _ortho: u.graph3dViewOrtho,
            _orthoWidth: u.graph3dViewOrthoWidth,
            _fovy: u.graph3dViewFovy,
            _near: u.graph3dViewNear,
            _far: u.graph3dViewFar,
            _headlightColor: u.graph3dViewHeadlightColor,
            _headlightIntensity: u.graph3dViewHeadlightIntensity,
            _headlightRange: u.graph3dViewHeadlightRange,
            _headlightAmbientIntensity: u.graph3dViewHeadlightAmbientIntensity,
            _headlightDisabled: u.graph3dViewHeadlightDisabled,
            _rectSelectable: u.graph3dViewRectSelectable,
            _rectSelectBackground: u.graph3dViewRectSelectBackground,
            _editSizeColor: u.graph3dViewEditSizeColor,
            _autoMakeVisible: be,
            _fogDisabled: u.graph3dViewFogDisabled,
            _fogMode: u.graph3dViewFogMode,
            _fogDensity: u.graph3dViewFogDensity,
            _fogColor: u.graph3dViewFogColor,
            _fogNear: u.graph3dViewFogNear,
            _fogFar: u.graph3dViewFogFar,
            _pickerResolution: u.graph3dViewPickerResolution,
            _dashDisabled: u.graph3dViewDashDisabled,
            _batchColorDisabled: u.graph3dViewBatchColorDisabled,
            _batchBlendDisabled: u.graph3dViewBatchBlendDisabled,
            _batchBrightnessDisabled: u.graph3dViewBatchBrightnessDisabled,
            addCamera: function (d) {
                var j = this,
                    P = o.freeze({
                        id: j._42Q++,
                        priority: d.priority || 0,
                        ignoreInPick: !!d.ignoreInPick,
                        render: d.render
                    });
                d.switch3DStatus && (j._43Q[P.id] = !0), j._41Q.push(P), j._41Q.sort(function (n, l) {
                    return n.priority !== l.priority ? n.priority - l.priority : n.id - l.id
                })
            }, setEye: function (H, k, P) {
                1 === arguments.length && (k = H[1], P = H[2], H = H[0]);
                var C = this._eye;
                C[0] = H, C[1] = k, C[2] = P, this.fp(to, F, C)
            }, setCenter: function (E, i, X) {
                1 === arguments.length && (i = E[1], X = E[2], E = E[0]);
                var p = this._center;
                p[0] = E, p[1] = i, p[2] = X, this.fp(sc, F, p)
            }, setUp: function (_, i, c) {
                1 === arguments.length && (i = _[1], c = _[2], _ = _[0]);
                var g = this._up;
                g[0] = _, g[1] = i, g[2] = c, this.fp("up", F, g)
            }, getDevicePixelRatio: function () {
                return this._picking ? this._1o._resolution : this._devicePixelRatio || ij
            }, isTransparentMask: function (S) {
                return S.s("transparent.mask")
            }, getCoreInteractor: function () {
                return this._coreInteractor
            }, getHighlightHelper: function () {
                return this._highlightHelper
            }, getRaycaster: function () {
                return this._raycaster
            }, getAspect: function () {
                var N = this,
                    o = N._aspect;
                return o ? o : (o = N.getWidth() / N.getHeight(), o || 1.2)
            }, getCanvas: function () {
                return this._canvas
            }, setDataModel: function (L) {
                var P = this,
                    H = P._dataModel,
                    $ = P._selectionModel;
                H !== L && (H && (H.ump(P.handleDataModelPropertyChange, P), H.umm(P.handleDataModelChange, P), H.umd(P.handleDataPropertyChange, P), $ || H.sm().ums(P.handleSelectionChange, P)), P._dataModel = L, L.mp(P.handleDataModelPropertyChange, P), L.mm(P.handleDataModelChange, P), L.md(P.handleDataPropertyChange, P), $ ? $._21I(L) : L.sm().ms(P.handleSelectionChange, P), P._postProcessing.handleDataModleChange(H, L), P.invalidateAll(!0), P.invalidateLight(), P.fp(uk, H, L), P._canvas.style.background = L.getBackground() || "")
            }, handleDataModelPropertyChange: function (G) {
                if ("background" === G.property) {
                    var A = this._canvas.style.background,
                        k = G.newValue || "";
                    this._canvas.style.background = k, this.fp("canvasBackground", A, k)
                } else "envmap" === G.property ? this.iv() : "cubicEnvmap" === G.property && (this._lastEnvMap = Z, this.iv())
            }, handleDataPropertyChange: function (G) {
                var O = G.data;
                this.invalidateData(O), Kc(O) && "s:light.type" === G.property ? this.invalidateLight() : "s:shadow.cast" === G.property ? this.shadowMap.tryUpdateBounding(O) : ("s:alwaysOnTop" === G.property || "s:shape3d.alwaysOnTop" === G.property) && (G.newValue ? O.setRenderLayer("top") : O.setRenderLayer(Z))
            }, invalidateLight: function () {
                this._lightChanged || (this._lightChanged = !0, this.iv())
            }, onPropertyChanged: function (v) {
                var j = this,
                    h = v.property;
                j.iv(), j._18Q = F, "eye" === h ? j._33Q = !0 : "devicePixelRatio" === h ? j._42(F, j.getDevicePixelRatio()) : Jo[h] && Vo(j)
            }, _5O: function (C) {
                var L = C._22Q();
                return L ? new L(this, C) : F
            }, getData3dUI: function (A) {
                var g = this._25I[A._id];
                return g === Z && (g = this._5O(A), this._25I[A._id] = g), g
            }, invalidateAll: function (W) {
                var r = this;
                if (W) {
                    for (var f in r._25I) {
                        var z = r._25I[f];
                        z && z.dispose()
                    }
                    r._25I = {}, r.iv(), dn(r)
                } else dn(r), r.dm().each(function (L) {
                    r.invalidateData(L)
                })
            }, invalidateSelection: function () {
                var R = this;
                R.sm().each(function (j) {
                    R.invalidateData(j)
                })
            }, invalidateData: function (d) {
                var L = this,
                    m = L.getData3dUI(d);
                m && (m.iv(), L.iv()), dn(L, d)
            }, getShape3dText: function (x) {
                return x.getStyle("shape3d.text") || this.getLabel(x)
            }, invalidateBatch: function (j) {
                var z = this,
                    r = z._40Q;
                r.each(function (N) {
                    z._invalidateBatch(N.batchModelMap, N.batchIndexMap, N.polylineModelMap, N.polylineIndexMap, N.wireframeModelMap, N.wireframeIndexMap, j), N.markBatchInvalid()
                })
            }, _invalidateBatch: function (h, L, s, i, U, P, n) {
                var o = this,
                    d = h[n],
                    R = [],
                    u = {};
                if (d) {
                    d.ds.forEach(function (A) {
                        var B = o.getData3dUI(A);
                        B && B.iv(), delete L[A._id], R.push(A._id)
                    }), delete h[n];
                    for (var e, p, J, M, x, j, l, I, F, A = [U, s], m = [P, i], T = 0; T < A.length; T++) {
                        var H = A[T],
                            O = m[T];
                        for (u = {}, I = 0; I < R.length; I++) {
                            var t = O[R[I]];
                            if (t) {
                                delete O[R[I]], F = t.batch, e = H[F];
                                var V = t.begin,
                                    z = t.size,
                                    _ = 3 * V,
                                    S = 3 * z,
                                    E = 4 * V,
                                    W = 4 * z;
                                for (p = e.ds, J = e.vs, M = e.cs, x = e.ps, j = e.ls, l = t.index, e.invalidate = !0, p[l] = Z, l = _; _ + S > l; l++) J[l] = Z;
                                for (l = E; E + W > l; l++) M[l] = Z;
                                for (l = E; E + W > l; l++) x[l] = Z;
                                if (j)
                                    for (l = _; _ + S > l; l++) j[l] = Z;
                                u[F] = !0
                            }
                        }
                        for (F in u) {
                            e = H[F], p = e.ds, J = e.vs, M = e.cs, x = e.ps, j = e.ls;
                            var K = [];
                            for (l = 0; l < p.length; l++) p[l] !== Z && K.push(p[l]);
                            if (0 === K.length) delete H[F];
                            else {
                                for (e.ds = K, K = [], l = 0; l < J.length; l++) J[l] !== Z && K.push(J[l]);
                                for (e.vs = K, K = [], l = 0; l < M.length; l++) M[l] !== Z && K.push(M[l]);
                                for (e.cs = K, K = [], l = 0; l < x.length; l++) x[l] !== Z && K.push(x[l]);
                                if (e.ps = K, j) {
                                    for (K = [], l = 0; l < j.length; l++) j[l] !== Z && K.push(j[l]);
                                    e.ls = K
                                }
                            }
                        }
                    }
                    o.iv()
                }
            }, handleDataModelChange: function (y) {
                var B = this,
                    J = y.kind,
                    n = y.data;
                if ("add" === J) B.invalidateData(n), Bk(n) && n.getEdgeGroup() && n.getEdgeGroup().eachSiblingEdge(B.invalidateData, B), Kc(n) && B.invalidateLight();
                else if (J === Ce) {
                    var r = n._id,
                        L = B._25I[r];
                    L && (L.dispose(), delete B._25I[r], B.iv()), n === B._currentSubGraph && B.setCurrentSubGraph(F), dn(B, n), Kc(n) && B.invalidateLight()
                } else J === Tg && (B.invalidateAll(!0), B.setCurrentSubGraph(F), dn(B), B.invalidateLight())
            }, toCanvas: function (o, n, C) {
                var p = this,
                    k = p.getGL();
                if (p.validate(), o) {
                    var r = k.getParameter(k.COLOR_CLEAR_VALUE);
                    qe(k, o)
                }
                p._42(F, 1);
                var j = p.getWidth() || 1,
                    I = p.getHeight() || 1,
                    G = new Uint8Array(4 * j * I),
                    l = uo(),
                    Z = l.getContext("2d");
                k.readPixels(0, 0, j, I, k.RGBA, k.UNSIGNED_BYTE, G), Bn(l, j, I, 1);
                for (var t = Z.getImageData(0, 0, j, I), e = t.data, B = 0; B < e.length; B += 4) {
                    var L = B / 4,
                        i = T(L / j),
                        J = L - i * j;
                    L = 4 * ((I - 1 - i) * j + J), e[L] = G[B], e[L + 1] = G[B + 1], e[L + 2] = G[B + 2], e[L + 3] = G[B + 3]
                }
                if (Z.putImageData(t, 0, 0), o && qe(k, r), p._42(F, p.getDevicePixelRatio()), n && C) {
                    var d = uo(),
                        X = d.getContext("2d");
                    return Bn(d, n, C, 1), u.drawImage(X, l, 0, 0, n, C), d
                }
                return l
            }, toDataURL: function (X, _) {
                var c = this,
                    v = c.getGL();
                if (c.validate(), X) {
                    var l = v.getParameter(v.COLOR_CLEAR_VALUE);
                    qe(v, X)
                }
                c._42(F, 1);
                var z = c._canvas.toDataURL(_ || "image/png", 1);
                return X && qe(v, l), c._42(F, c.getDevicePixelRatio()), z
            }, getGL: function () {
                var D = this._26I;
                if (D) return this.acquireProgram(), D;
                if (!this._35O) {
                    var H = this,
                        A = H._canvas,
                        O = H._attributes;
                    if (!O || O.requestWebGL2 !== !1) try {
                        D = A.getContext("webgl2", O) || A.getContext("experimental-webgl2", O), D && (H._webGLVersion = 2, H._26I = D)
                    } catch (u) { }
                    if (!D) try {
                        D = A.getContext("webgl", O) || A.getContext("experimental-webgl", O)
                    } catch (u) {
                        throw new Error("WebGL not supported")
                    }
                    if (!D) throw new Error("WebGL not supported");
                    H._26I = D;
                    var q = H._frameState = new Bl(this, D);
                    H._glExtensions = new E(D), H._glCapabilities = new B(D, H._glExtensions), H._2O = {}, D._emptyCubeTexture = Gp(D), D._compiledShader = {}, D._emptyTexture = ze(D), D._emptyBlendTexture = ze(D), D._bufPool = {}, D._id = ++qd, q.setGLState(), H._buffer = {
                        vs: el(D),
                        ns: el(D),
                        is: el(D),
                        uv: el(D),
                        batchColor: el(D),
                        batchBlend: el(D),
                        batchBrightness: el(D),
                        lineDistance: el(D)
                    }, H._1O = rg(D);
                    var Y = H._cube = {
                        vs: el(D),
                        ns: el(D),
                        is: el(D),
                        uv: el(D)
                    };
                    return bm(D, Y.vs, Ef), bm(D, Y.ns, mn), bm(D, Y.uv, mi), eo(D, Y.is, Lq), H.acquireProgram(), D._renderInfo = {
                        calls: 0,
                        vertices: 0,
                        faces: 0,
                        lines: 0,
                        points: 0,
                        frame: 0,
                        cacheTimeCost: 0
                    }, D
                }
            }, getEnvmap: function () {
                return this._glCapabilities && this._glCapabilities.maxVertexTextures < u.graph3dEnvmapCapabilityRequire ? null : this.dm().getEnvmap()
            }, acquireProgram: function () {
                var D = this,
                    d = D._26I;
                if (d) {
                    var s = u.getImage(D.getEnvmap()),
                        G = s && s.tagName ? !0 : !1,
                        m = D._prg && D._prg.envMapFlag ? !0 : !1;
                    if (!D._prg || G !== m) {
                        var _ = D._prg = d.createProgram();
                        if (!_) return F;
                        _.envMapFlag = G;
                        var e = D._dirs.length,
                            z = D._spots.length,
                            l = D._59O.length,
                            S = ["uPMatrix", "uMVMatrix", "uMMatrix", "uReflectivity", "uViewMatrix", "uUseEnvMap", "uEnvMap", "uCameraPosition", "uNMatrix", "uViewMatrix", "aNormal", "aUv", "uOffsetScale", "uDiffuse", "uBlend", "uBlendColor", "uBrightness", "uPartOpacity", "uAlphaTest", "uTransparent", "uClipDirection", "uClipPercent", "uTexture", "uBlendTexture", "uSampler", "uBlendSampler", "uDiscardSelectable", "uFix", "uPick", "uReverseFlip", "uFixPickReverseColor", "uBatchBrightness", "aBatchBrightness", "uBatchColor", "aBatchColor", "uBatchBlend", "aBatchBlend", "uDash", "aLineDistance", "uDashDistance", "uDashGapDistance", "uLight", "uHeadlightRange", "uHeadlightAmbientIntensity", "uHeadlightColor", "uFogColor", "uFogDensity", "uFogNear", "uFogFar"];
                        e && S.push("uDirColor", "uDirDirection"), z && S.push("uSpotColor", "uSpotRange", "uSpotAngle", "uSpotExponent", "uSpotPosition", "uSpotDirection"), l && S.push("uPointColor", "uPointRange", "uPointPosition"), dp || (Ae = fo(Ae.substring(0, Ae.indexOf("^#"))), Sp = fo(Sp), dp = !0);
                        var c = ["#define MAX_DIR " + e, "#define MAX_SPOT " + z, "#define MAX_POINT " + l, D._fogDisabled ? "" : "#define FOG", "exp2" === D.getFogMode() ? "#define FOG_EXP2" : "", D._dashDisabled ? "" : "#define DASH", G ? "#define USE_ENVMAP" : "", D.isOrtho() ? "#define ORTHOGRAPHIC" : "", D._batchColorDisabled ? "" : "#define BATCHCOLOR", D._batchBlendDisabled ? "" : "#define BATCHBLEND", D._batchBrightnessDisabled ? "" : "#define BATCHBRIGHTNESS", D.shadowMap.enable ? D.shadowMap.genShaderDefine() : "", ""].join("\n"),
                            O = Pl(d, _, d.VERTEX_SHADER, Ae.replace("PREFIX", c));
                        d.getShaderParameter(O, d.COMPILE_STATUS) || console.error("compile vs shader faild, error info : ", d.getShaderInfoLog(O));
                        var o = Pl(d, _, d.FRAGMENT_SHADER, Sp.replace("PREFIX", c));
                        d.getShaderParameter(o, d.COMPILE_STATUS) || console.error("compile fs shader faild, error info : ", d.getShaderInfoLog(o)), Uq ? S.push("aPosition") : (_.aPosition = 0, d.bindAttribLocation(_, 0, "aPosition")), d.linkProgram(_), S.forEach(function (U) {
                            _[U] = /^u/.test(U) ? d.getUniformLocation(_, U) : d.getAttribLocation(_, U)
                        });
                        var A = this._frameState;
                        A.renderState.program = A.defaultProgram = _, d.deleteShader(O), d.deleteShader(o)
                    }
                }
            }, getBrightness: function (p) {
                var W = p.s("brightness"),
                    P = this.isSelected(p) ? p.s("select.brightness") : F;
                return W == F ? P : P == F ? W : W * P
            }, setHighlightMode: function (F) {
                var J;
                J = "selection" === F || "selected" === F ? ui.Mode.Selection : "mouseover" === F || "hover" === F ? ui.Mode.MouseOver : "style" === F ? ui.Mode.Style : ui.Mode.Disable;
                var l = this._highlightHelper.mode;
                this._highlightHelper.mode = J, this.firePropertyChange("highlightMode", l, J)
            }, getHighlightMode: function () {
                var i = this._highlightHelper.mode;
                return i === ui.Mode.Selection ? "selected" : i === ui.Mode.MouseOver ? "hover" : i === ui.Mode.Style ? "style" : "disabled"
            }, getDataHighlightMode: function (N) {
                return N.s("highlight.mode")
            }, getHighlightColor: function () {
                return this._highlightHelper.color || z["highlight.color"]
            }, setHighlightColor: function (x) {
                var f = this._highlightHelper.color;
                this._highlightHelper.color = x, this.firePropertyChange("highlightColor", f, x)
            }, getHighlightWidth: function () {
                return this._highlightHelper.width || z["highlight.width"]
            }, setHighlightWidth: function (c) {
                var E = this._highlightHelper.width;
                this._highlightHelper.width = c, this.firePropertyChange("highlightWidth", E, c)
            }, bindEnvMap: function (G) {
                var V = this,
                    x = ts.for(G),
                    v = x.directUniforms(),
                    D = V.getEnvmap(),
                    S = u.getImage(D);
                if (S && S.tagName) {
                    if (D !== V._lastEnvMap) {
                        var K = {};
                        if (V.dm().isCubicEnvmap()) {
                            var k = xc(S),
                                W = oo(S);
                            if (0 === k || 0 === W) return;
                            var U = k / 4,
                                M = W / 3,
                                X = {
                                    top: {
                                        x: U,
                                        y: 0
                                    },
                                    left: {
                                        x: 0,
                                        y: M
                                    },
                                    front: {
                                        x: U,
                                        y: M
                                    },
                                    right: {
                                        x: 2 * U,
                                        y: M
                                    },
                                    back: {
                                        x: 3 * U,
                                        y: M
                                    },
                                    bottom: {
                                        x: U,
                                        y: 2 * M
                                    }
                                };
                            ["top", "left", "front", "right", "back", "bottom"].forEach(function (E) {
                                var h = X[E],
                                    W = K[E] = uo();
                                Bn(W, U, M, 1);
                                var o = Wd(W);
                                o.drawImage(S, h.x, h.y, U, M, 0, 0, U, M), o.restore(), K[E] = u.resizeImagePOT(W, !0)
                            })
                        } else S = u.resizeImagePOT(S, !0);
                        V._envMapTexture && G.deleteTexture(V._envMapTexture);
                        var O = V._envMapTexture = G.createTexture();
                        G.activeTexture(G.TEXTURE0), G.bindTexture(G.TEXTURE_CUBE_MAP, O), G.texParameteri(G.TEXTURE_CUBE_MAP, G.TEXTURE_MAG_FILTER, G.LINEAR), G.texParameteri(G.TEXTURE_CUBE_MAP, G.TEXTURE_MIN_FILTER, G.LINEAR), G.texImage2D(G.TEXTURE_CUBE_MAP_POSITIVE_X + 0, 0, G.RGBA, G.RGBA, G.UNSIGNED_BYTE, K.right || S), G.texImage2D(G.TEXTURE_CUBE_MAP_POSITIVE_X + 1, 0, G.RGBA, G.RGBA, G.UNSIGNED_BYTE, K.left || S), G.texImage2D(G.TEXTURE_CUBE_MAP_POSITIVE_X + 2, 0, G.RGBA, G.RGBA, G.UNSIGNED_BYTE, K.top || S), G.texImage2D(G.TEXTURE_CUBE_MAP_POSITIVE_X + 3, 0, G.RGBA, G.RGBA, G.UNSIGNED_BYTE, K.bottom || S), G.texImage2D(G.TEXTURE_CUBE_MAP_POSITIVE_X + 4, 0, G.RGBA, G.RGBA, G.UNSIGNED_BYTE, K.front || S), G.texImage2D(G.TEXTURE_CUBE_MAP_POSITIVE_X + 5, 0, G.RGBA, G.RGBA, G.UNSIGNED_BYTE, K.back || S), G.bindTexture(G.TEXTURE_CUBE_MAP, G._emptyCubeTexture), V._lastEnvMap = D
                    }
                    v.uEnvMap = V._envMapTexture
                }
            }, getWireframe: function (H) {
                var w = H.s("wf.visible"),
                    G = H.s("wf.width");
                return w === !0 || G > 0 && "selected" === w && this.isSelected(H) ? {
                    color: H.s("wf.color"),
                    width: G,
                    "short": H.s("wf.short"),
                    mat: H.s("wf.mat")
                } : void 0
            }, _transformPointToViewSpace: function (i) {
                var M = [i[0], i[1], i[2]];
                return Td(M, this._viewMatrix), M
            }, _transformDirectionToViewSpace: function (b, V) {
                var H = [b[0], b[1], b[2]];
                Td(H, this._viewMatrix);
                var Q = V ? [V[0], V[1], V[2]] : [0, 0, 0];
                Td(Q, this._viewMatrix);
                var O = Q[0] - H[0],
                    X = Q[1] - H[1],
                    r = Q[2] - H[2],
                    U = Math.sqrt(O * O + X * X + r * r);
                return U ? [O / U, X / U, r / U] : [O, X, r]
            }, getWireframeGeometry: function (E) {
                return E.s("wf.geometry") ? {
                    color: E.s("wf.color"),
                    width: E.s("wf.width"),
                    mat: E.s("wf.mat"),
                    geometry: !0
                } : void 0
            }, getBodyColor: function (v) {
                return v.s("body.color")
            }, getMat: function (v) {
                return v.getMat ? v.getMat() : v.s("mat")
            }, getFaceMat: function (t, I) {
                return t.getFaceMat ? t.getFaceMat(I) : t.s(I + ".mat")
            }, getFaceBlend: function (o, g) {
                return o.s(g + ".blend") || o.s("all.blend")
            }, getFaceColor: function (i, h) {
                return i.s(h + ".color") || i.s("all.color")
            }, getFaceImage: function (V, O) {
                return V.s(O + ".image") || V.s("all.image")
            }, getFaceBlendImage: function (A, G) {
                return A.s(G + ".blend.image") || A.s("all.blend.image")
            }, getFaceDiscardSelectable: function (l, e) {
                var o = l.s(e + ".discard.selectable");
                return o == F ? l.s("all.discard.selectable") : o
            }, getFaceUv: function (e, $) {
                return e.s($ + ".uv") || e.s("all.uv")
            }, getFaceUvOffset: function (k, q) {
                return k.s(q + ".uv.offset") || k.s("all.uv.offset")
            }, getFaceUvScale: function (h, B) {
                return h.s(B + ".uv.scale") || h.s("all.uv.scale")
            }, getFaceLight: function (o, s) {
                var O = o.s(s + ".light");
                return O == F ? o.s("all.light") : O
            }, getFaceVisible: function (T, k) {
                var O = T.s(k + ".visible");
                return O == F ? T.s("all.visible") : O
            }, getFaceOpacity: function (S, J) {
                var M = S.s(J + ".opacity");
                return M == F ? S.s("all.opacity") : M
            }, getFaceTransparent: function (m, Y) {
                var l = m.s(Y + ".transparent");
                return l == F ? m.s("all.transparent") : l
            }, getFaceReverseColor: function (o, W) {
                return o.s(W + ".reverse.color") || o.s("all.reverse.color")
            }, getFaceReverseFlip: function (I, c) {
                var d = I.s(c + ".reverse.flip");
                return d == F ? I.s("all.reverse.flip") : d
            }, getFaceReverseCull: function (P, t) {
                var n = P.s(t + ".reverse.cull");
                return n == F ? P.s("all.reverse.cull") : n
            }, getTextureMap: function () {
                return this._2O
            }, deleteTexture: function (I) {
                var T = this,
                    V = T._2O[I];
                V && (delete T._2O[I], T.getGL().deleteTexture(V))
            }, renderPickScene: function () {
                var u = this.getGL();
                this._picking = u._picking = !0, this.renderScene(), this._picking = u._picking = !1
            }, invalidateCachedTexture: function (X) {
                var m = this.getData3dUI(X);
                m.invalidateCachedTexture(this.getGL()), this.invalidateData(X)
            }, invalidateShape3dCachedImage: function (B) {
                this.invalidateCachedTexture(B)
            }, invalidateCachedGeometry: function (Q) {
                var o = this.getData3dUI(Q);
                o.invalidateCachedGeometry(), this.invalidateData(Q)
            }, isInteractive: function (S) {
                return S.s("interactive")
            }, getTexture: function ($, g, E) {
                if (!$) return F;
                var w = this,
                    p = w.getGL(),
                    m = w._2O[$];
                if (!m) {
                    var j = ii($),
                        C = {};
                    if (!j) return p._emptyTexture;
                    if (g) {
                        C.mipmapMaxLevel = g.s("texture.mipmap.max");
                        var Y = g.s("texture.wrap");
                        C.clampToEdge = "clampToEdge" === Y ? !0 : "repeat" === Y ? !1 : Z
                    }
                    if (j.uuid || (j.uuid = O.Math.generateUUID()), j.tagName) {
                        if (j.dynamic) return rg(p, j, w._1O, C);
                        m = w._2O[$] = rg(p, j, Z, C)
                    } else {
                        var L, R = g && (g.s("texture.cache") || g.s("shape3d.image.cache") || j.textureCache),
                            H = w.vr.isPresenting();
                        if (H && (g._textureUpdateFrame === p._renderInfo.frame ? R = !0 : g._textureUpdateFrame = p._renderInfo.frame), R && (L = w.getData3dUI(g), m = L.getCachedTexture(E), m && L.interactiveInfo && m.interactiveInfo && (L.interactiveInfo[m.interactiveInfo.key] = m.interactiveInfo.info)), !m) {
                            var P = p._renderInfo.textureCache;
                            if (R) {
                                if (P.time > u.graph3dMaxVectorCacheTime) return w.redraw(), p._emptyTexture;
                                if (!Dr(j, g)) return p._emptyTexture
                            }
                            var G;
                            g && (1 !== g.s("texture.scale") ? G = g.s("texture.scale") : 1 !== g.s("shape3d.texture.scale") && (G = g.s("shape3d.texture.scale"))), G || (G = 1);
                            var o = g && (g.s("fixSizeOnScreen") || g.s("shape3d.fixSizeOnScreen")),
                                b = o ? p.NEAREST : p.LINEAR;
                            o ? "number" == typeof o && (G *= 0 > o ? 1 : o) : g && (g.s("vector.dynamic") || g.s("shape3d.vector.dynamic")) && (L || (L = w.getData3dUI(g)), o = L.getVectorDynamicSize());
                            var h, s, f, J = g && g.s("shape3d");
                            "billboard" === J ? f = g.getTall() / g.getWidth() : "plane" === J && (f = g.getHeight() / g.getWidth());
                            var A = xc(j, g);
                            if (o) {
                                var i;
                                i = R ? w._devicePixelRatio || ij : w.getDevicePixelRatio(), h = o[0] > 0 ? o[0] * i : G * A * i, s = o[1] > 0 ? o[1] * i : G * (f ? oo(j, g, w, Math.min(4096, A * f)) : oo(j, g)) * i
                            } else h = G * A, s = G * (f ? oo(j, g, w, Math.min(4096, A * f)) : oo(j, g)); if (h >= 1 && s >= 1) {
                                var t = 0;
                                (R || H) && (t = Date.now());
                                var e = w._glCapabilities.maxTextureSize;
                                h = Math.min(h, e), s = Math.min(s, e);
                                var N = Cr(h, s);
                                if (!L && g && (L = w.getData3dUI(g)), L && L.interactiveInfo) {
                                    var _ = $;
                                    "object" == typeof _ && (_ = _.uuid || (_.uuid = O.Math.generateUUID()));
                                    var S = L.interactiveInfo[_] = {};
                                    N.interactiveInfo = S.bodyInfo = {
                                        compInfos: [],
                                        matrix: new Np,
                                        rect: {
                                            x: 0,
                                            y: 0,
                                            width: h,
                                            height: s
                                        }
                                    }
                                }
                                Yd(N, j, 0, 0, h, s, g, w), N.interactiveInfo && (N.interactiveInfo = null), N.restore(), P.count++, P.pixels += h * s, g ? (C.minFilter = Mm(g.s("texture.filter.min") || g.s("texture.filter")) || b, C.magFilter = Mm(g.s("texture.filter.mag") || g.s("texture.filter")) || b) : C.minFilter = C.magFilter = b, R || H ? (m = rg(p, xm, null, C), L.setCachedTexture(m, E), P.time += Date.now() - t, S && (m.interactiveInfo = {
                                    key: _,
                                    info: S
                                }), xm = null) : m = rg(p, xm, w._1O, C)
                            }
                        }
                    }
                }
                return m
            }, redraw: function () {
                this.iv()
            }, validateImpl: function () {
                var B = this;
                if (B._lightChanged) {
                    B._lightChanged = !1;
                    var h = [],
                        v = [],
                        N = [];
                    B.dm().each(function (c) {
                        if (Kc(c)) {
                            var F = c.s("light.type");
                            F === zg ? h.push(c) : F === Bo ? v.push(c) : F === Tf && N.push(c)
                        }
                    }), (h.length !== B._59O.length || v.length !== B._spots.length || N.length !== B._dirs.length) && Vo(B), B._59O = h, B._spots = v, B._dirs = N
                }
                B._42(), B._1o.iv()
            }, getRenderInfo: function () {
                var X = this.getGL();
                return X ? X._renderInfo : void 0
            }, getDebugTip: function () {
                var i = this,
                    Y = i.getRenderInfo();
                if (Y) {
                    var M = i.getGL()._validBufCount || 0,
                        v = "Draw Calls: " + Y.calls + "<br/>" + "Vertices: " + Y.vertices + "<br/>" + "Faces: " + Y.faces + "<br/>" + "Lines: " + Y.lines + "<br/>" + (Y.points ? "Points: " + Y.points + "<br/>" : "") + "Buffers: " + M + "<br/>" + "Cache Models: " + o.keys(Mq).length + "<br/>" + "Shape3d Models: " + o.keys(Zm).length;
                    if (i.vr.isPresenting() && (v += "<br/>VR fps: " + i.vr.getFps()), Y.textureCache) {
                        var n = Y.textureCache.count;
                        if (v += "<br/>2D Dynamic Textures: " + Y.textureCache.count, n > 0) {
                            var d, f = Y.textureCache.pixels;
                            d = f > 1e6 ? Math.round(f / 1e6) + "M" : f > 1e3 ? Math.round(f / 1e3) + "K" : Math.round(f), v += "<br/>2D Dynamic pixels: " + d
                        }
                    }
                    return v
                }
            }, getFrameState: function () {
                return this._frameState
            }, isBoundingBoxInView: function () {
                var R = new O.Math.Box3,
                    d = new O.Math.Matrix4;
                return function (H) {
                    var p = H;
                    if (p instanceof O.Data && (p = this.getData3dUI(p)), !p.mat) return !0;
                    var M = p.getBoundingBox();
                    R.copy(M).applyMatrix4(d.fromArray(p.mat));
                    var e = this.getFrustum();
                    return e.intersectsBox(R)
                }
            }(),
            updateScene: function () {
                var O = this;
                O._81O = F, O.overlappingBox.clear(), O._40Q.init();
                var l, i, M, C = this.dm().getDatas().getArray(),
                    m = C.length,
                    v = this.getGL(),
                    B = this._40Q;
                for (l = 0; m > l; l++) i = C[l], M = this.getData3dUI(i), M && M.update(this, v, B);
                O._40Q.onUpdated()
            }, renderScene: function () {
                function m(M, G) {
                    Q.setGLState(M, G), Q.setUniforms(M), Q.renderState.attribs.disable(), a = E.directUniforms(), H = E.directAttribs(), H.disable()
                }

                function l(P) {
                    for (; I > p; p++) {
                        var x = t[p];
                        if (!K || !x.ignoreInPick) {
                            if (x.priority >= P) break;
                            (!d._43Q[d._44Q = x.id] || Qg[ub.length]) && (x.render(c, d, Q), m())
                        }
                    }
                }
                var d = this;
                d.shadowMap.render(), d._44Q = -1;
                var H, Q = d._frameState,
                    E = Q.renderState,
                    h = E.glState,
                    a = E.directUniforms(),
                    c = d.getGL(),
                    o = d._prg;
                E.syncLoss(), d._projectMatrix = Mc(d), wp(d, d._7O), d._viewMatrix = Ql(d._7O), Q.syncEnv(this._picking ? this.pickColorMap : Z), E.useProgram(o), m(!1, !0), c.clear(c.DEPTH_BUFFER_BIT);
                var K = d._picking,
                    t = this._41Q,
                    p = 0,
                    I = t.length;
                if (l(u.cameraPriority.skybox), K) {
                    var B = h.color.clear.slice(0);
                    qe(c, [0, 0, 0, 0])
                } else qe(c, [0, 0, 0, 0]), h.blend.enabled = !1, h.depth.enabled = !1, h.depth.mask = !1, d.drawSky(c, o), d.drawReflectors(c) && (d._projectMatrix = Mc(d), wp(d, d._7O), d._viewMatrix = Ql(d._7O), Q.syncEnv(), m()), h.blend.enabled = !1, h.depth.enabled = !0, h.depth.mask = !0, a.uTransparent = !1, d._31O._42(c, o); if (!c.textureBatch || Qg[(ONE_FRAME_TIME - 6) / 2]) {
                    !K && d.shadowMap.enable && d.shadowMap.createShadow(a);
                    for (var U = 0, g = kl.length; g > U; U++) {
                        var f = kl[U],
                            e = Sc[f];
                        if (!e.ignore) {
                            var M = e.priority;
                            l(M), this.renderLayer(f)
                        }
                    }
                    h.depth.enabled = !1, a.uTransparent = !1, a.shadowReceive = !1, K ? d.drawFilter || d._30O._42(c, o) : (h.blend.enabled = !1, h.depth.mask = !0, d._32O._42(c, o), d._30O._42(c, o), d._highlightHelper._42(c, o)), h.depth.enabled = !0, l(u.cameraPriority.infinity), K && qe(c, B), bm(c, F), eo(c, F), d._44Q = -1
                }
            }, renderLayers: function (u, D) {
                D && (u = Ck(u));
                for (var m = 0, A = u.length; A > m; m++) this.renderLayer(u[m])
            }, renderLayer: function (T) {
                var I = this,
                    k = I._picking,
                    l = I._40Q.get(T);
                if (l) {
                    var y, p, L, A = I.getGL(),
                        W = I._frameState,
                        q = W.renderState,
                        Z = q.glState,
                        v = q.directUniforms(),
                        d = l.opaque,
                        F = l.transparent,
                        x = l.batchModelMap,
                        B = l.polylineModelMap,
                        h = l.wireframeModelMap,
                        A = I.getGL(),
                        K = I._prg;
                    k || (Z.blend.enabled = !1, Z.depth.enabled = !0, Z.depth.mask = !0), v.uTransparent = !1, Sc[T].clearDepth !== !1 && A.clear(A.DEPTH_BUFFER_BIT);
                    var R = this.drawFilter;
                    if (R)
                        for (L = d, y = 0, p = L.length; p > y; y++) R(L[y].data) !== !0 && L[y].ui._42(A, K, j);
                    else {
                        for (L = d, y = 0, p = L.length; p > y; y++) L[y].ui._42(A, K, j);
                        if (k)
                            for (L = F, y = 0, p = L.length; p > y; y++) L[y].ui._46Q(A);
                        Zn(I, x), Eb(I, B), Eb(I, h)
                    } if (k || (Z.blend.enabled = !0, Z.depth.mask = !1), I._45Q = v.uTransparent = !0, R)
                        for (L = F, y = 0, p = L.length; p > y; y++) R(L[y].data) !== !0 && L[y].ui._42(A, K, Q);
                    else {
                        for (L = F, y = 0, p = L.length; p > y; y++) L[y].ui._42(A, K, Q);
                        Zn(I, x, null, !0), Eb(I, B, null, !0), Eb(I, h, null, !0)
                    }
                    I._45Q = null
                }
            }, drawV2: function (P) {
                var L = this;
                if (!L._35O && (!vi || Qg(vi))) {
                    var G = L.getWidth(),
                        x = L.getHeight();
                    if (G && x) {
                        var d = L.getGL();
                        if (d) {
                            var j = L._canvas;
                            if (P || (P = L.getDevicePixelRatio()), G !== j.clientWidth || x !== j.clientHeight) {
                                Bn(j, G, x, P);
                                var R = P;
                                G && Math.abs(d.drawingBufferWidth - G * P) > 1 && (R = Math.min(R, d.drawingBufferWidth / G)), x && Math.abs(d.drawingBufferHeight - x * P) > 1 && (R = Math.min(R, d.drawingBufferHeight / x)), R !== P && (L.setDevicePixelRatio(P = R), Bn(j, G, x, P)), L._18Q = null
                            }
                            d.clear(d.COLOR_BUFFER_BIT);
                            var r = d._renderInfo;
                            r.calls = 0, r.vertices = 0, r.faces = 0, r.lines = 0, r.points = 0, r.textureCache = {
                                time: 0,
                                count: 0,
                                pixels: 0
                            }, r.frame = ++L._frameId, r.cacheTimeCost = 0, r.reflectDepth = 0, G *= P, x *= P;
                            do {
                                if (L.vr.enable && L.vr.render(d, G, x)) break;
                                if (L.updateScene(), L._postProcessing.render(d, G, x)) break;
                                L.setViewport(d, 0, 0, G, x), L.renderScene()
                            } while (!1);
                            L._33Q = !1, L.countFrame(), L._doBufferGC(d)
                        }
                    }
                }
            }, _42: function (J, _) {
                return this.drawV2(_)
            }, drawReflectors: function (L) {
                L._renderInfo.reflectDepth++;
                var V, T, b, n = this,
                    P = n._dataModel.getReflectors(),
                    d = !1;
                for (V in P) T = P[V], n.isVisible(T) && (b = n.getData3dUI(T), b && b.drawReflector(L) && (d = !0));
                return L._renderInfo.reflectDepth--, d
            }, isReflecting: function (M) {
                return M._renderInfo.reflectDepth
            }, getPostProcessing: function () {
                return this._postProcessing
            }, enablePostProcessing: function (_, s) {
                return this._postProcessing.enableModule(_, s)
            }, getPostProcessingModule: function (_) {
                return this._postProcessing.getModule(_)
            }, getPostProcessingValue: function (H, V) {
                var e = this._postProcessing.getModule(H);
                return e ? e[V] : Z
            }, setPostProcessingValue: function (X, j, d) {
                var F = this.getPostProcessingValue(X, j),
                    Z = this._postProcessing.getModule(X);
                Z && F !== d && ("enable" === j ? this.enablePostProcessing(X, d) : Z[j] = d, this.firePropertyChange("postProcessing." + X + "." + j, F, d))
            }, setViewport: function (k, T, n, Y, v) {
                this._viewport = [T, n, Y, v], ts.for(k).directState().viewport = this._viewport
            }, getViewport: function () {
                return this._viewport
            }, setBufferGCInterval: function (v) {
                this._bufferGCInterval = v
            }, _doBufferGC: function (O, k) {
                var o, e, y = O._bufPool,
                    U = 0,
                    f = 0,
                    R = O._renderInfo.frame,
                    K = this._bufferGCInterval || 10;
                for (o in y) U++, e = y[o], e && (k || R - e._fid > K ? (O.deleteBuffer(e._buf), e._buf = null, y[o] = null) : f++);
                if (U / 2 > f && U > 128) {
                    var E = {};
                    for (o in y) y[o] && (E[o] = y[o]);
                    O._bufPool = E
                }
                O._validBufCount = f
            }, _swapLineMap: function () {
                var Y = this;
                jb = Y._polylineModelMap, Y._polylineModelMap = Y._polylineModelMapSwap, Y._polylineModelMapSwap = jb, jb = Y._wireframeModelMap, Y._wireframeModelMap = Y._wireframeModelMapSwap, Y._wireframeModelMapSwap = jb, jb = Y._polylineIndexMap, Y._polylineIndexMap = Y._polylineIndexMapSwap, Y._polylineIndexMapSwap = jb, jb = Y._wireframeIndexMap, Y._wireframeIndexMap = Y._wireframeIndexMapSwap, Y._wireframeIndexMapSwap = jb
            }, _updateSkybox: function (c) {
                if (this._skybox && c) {
                    var h = c.property,
                        S = !1,
                        M = this._skybox;
                    if ("eye" === h || "forceUpdate" === h) {
                        var i = this._eye;
                        M.p3(i[0], i[1], i[2]), S = !0
                    }
                    if ("near" === h || "far" === h || "forceUpdate" === h) {
                        var w = this._near,
                            L = this._far,
                            k = M.getFinalScale3d();
                        if (k[0] /= 2, k[1] /= 2, k[2] /= 2, k[0] <= w || k[0] >= L || k[1] <= w || k[1] >= L || k[2] <= w || k[2] >= L) {
                            var Y = 2 * w * L / (w + L),
                                $ = Math.min(k[0], k[1], k[2]),
                                p = Y / $,
                                f = M.getScale3d();
                            M.setScale3d(f[0] * p, f[1] * p, f[2] * p), S = !0
                        }
                    }
                    S && this.invalidateData(M)
                }
            }, getSkyBox: function () {
                return this.getSkybox()
            }, setSkyBox: function (x) {
                return this.setSkybox(x)
            }, getSkybox: function () {
                return this._skybox
            }, setSkybox: function (g) {
                var X = this._skybox;
                return X === g ? (g && this._updateSkybox({
                    property: "forceUpdate"
                }), void 0) : (X && (this._skyboxStyleMap && X.setStyleMap(this._skyboxStyleMap), this._skyboxStyleMap = null, this._skyboxAnchor3d && X.setAnchor3d(this._skyboxAnchor3d), this._skyboxAnchor3d = null, this._skyboxP3 && X.p3(this._skyboxP3), this._skyboxP3 = null), this._skybox = g, this.ump(this._updateSkybox, this), g && (g.dm() && g.dm().remove(g), this._skyboxStyleMap = O.Default.clone(g.getStyleMap()), this._skyboxAnchor3d = g.getAnchor3d(), g.setAnchor3d(.5, .5, .5), this._skyboxP3 = g.p3().slice(0), g.s({
                    "shape3d.reverse.flip": !0,
                    "shape3d.reverse.cull": !1,
                    "all.reverse.flip": !0,
                    "all.reverse.cull": !1,
                    "front.reverse.flip": !0,
                    "front.reverse.cull": !1,
                    "back.reverse.flip": !0,
                    "back.reverse.cull": !1,
                    "left.reverse.flip": !0,
                    "left.reverse.cull": !1,
                    "right.reverse.flip": !0,
                    "right.reverse.cull": !1,
                    "top.reverse.flip": !0,
                    "top.reverse.cull": !1,
                    "bottom.reverse.flip": !0,
                    "bottom.reverse.cull": !1
                }), this.mp(this._updateSkybox, this), this._updateSkybox({
                    property: "forceUpdate"
                })), this.fp("skybox", X, g), void 0)
            }, drawSky: function (f, M) {
                var N = this,
                    _ = N._skybox;
                if (_) {
                    var A = ts.for(f).directUniforms(),
                        S = N._headlightIntensity,
                        E = ns(N._headlightColor),
                        M = N._prg;
                    1 !== S && (E = [E[0] * S, E[1] * S, E[2] * S]), A.uHeadlightColor = [E[0], E[1], E[2], 1];
                    var U = N.getData3dUI(_);
                    if (U) {
                        var R = N.isOrtho(),
                            W = R || this._computedProjectMatrix;
                        if (W) {
                            var n = N._projectMatrix;
                            R && (N._ortho = !1), A.uPMatrix = N._projectMatrix = Mc(N, !0)
                        }
                        var m = _.p3(),
                            p = this._eye;
                        (m[0] !== p[0] || m[1] !== p[1] || m[2] !== p[2]) && (_._position.x = p[0], _._54O = p[1], _._position.y = p[2]), U.validate(), U._42(f, M, C), W && (R && (N._ortho = !0), A.uPMatrix = N._projectMatrix = n)
                    }
                    f.clear(f.DEPTH_BUFFER_BIT), A.uHeadlightColor = [E[0], E[1], E[2], N._headlightDisabled ? 1 : 0]
                }
            }, getLogicalPoint: function (L) {
                return Nm(L, this._canvas)
            }, isRectOverlapping: function (Y) {
                var z = this.getData3dUI(Y);
                return z._rectOverlapping
            }, getHitFaceInfo: function (Z) {
                Z.target && (Z = this.lp(Z));
                var v = this.getDataInfoAt(Z);
                if (v) {
                    var Q = this.intersectObject(Z, v.data);
                    if (Q) return {
                        data: v.data,
                        face: Q.part
                    }
                }
                return F
            }, unproject: function (Z, N) {
                var W = this,
                    C = W.getWidth(),
                    F = W.getHeight(),
                    y = Z.target ? W.lp(Z) : Z,
                    i = y.x - C / 2,
                    K = y.y - F / 2,
                    u = 2 * (i / C),
                    p = 2 * (-1 * K / F);
                N = N || 0;
                var j = kn(),
                    I = Mc(W),
                    r = wp(W);
                xo(j, I, r), Od(j);
                var t = Ek([u, p, N, 1], j);
                return [t[0] / t[3], t[1] / t[3], t[2] / t[3]]
            }, getDataAt: function (N) {
                var U = this.getDataInfoAt(N);
                return U ? U.data : F
            }, getDataInfoAt: function (H, M) {
                return H.target && (H = this.lp(H)), this._1o.get(Cc(H.x, H.y, M), !0)
            }, getDatasInRect: function (O) {
                return this._1o.get(O)
            }, setEditable: function (H) {
                var K = this,
                    m = K._editable;
                K._editable = H, this.fp(Me, m, H)
            }, isEditable: function (v) {
                var U = this;
                return v ? U._editable ? Fq(v) ? v.s("3d.editable") ? U._editableFunc ? U._editableFunc(v) : !0 : !1 : !1 : !1 : U._editable
            }, isSelectable: function (v) {
                return v.s("3d.selectable") && this.sm().isSelectable(v)
            }, isMovable: function (Y) {
                var G = this;
                return Bk(Y) && Y.getStyle(ej) !== _b ? !1 : Y.s("3d.movable") ? G._movableFunc ? G._movableFunc(Y) : !0 : !1
            }, isSizeEditable: function (s) {
                return Fq(s) ? this._sizeEditableFunc ? this._sizeEditableFunc(s) : !0 : !1
            }, isRotationEditable: function (K) {
                return Fq(K) && K.IRotatable !== !1 ? this._rotationEditableFunc ? this._rotationEditableFunc(K) : !0 : !1
            }, handleDelete: function () {
                this._editable && this.removeSelection()
            }, zoomIn: function (Y) {
                this.setZoom(lq, Y)
            }, zoomOut: function (J) {
                this.setZoom(1 / lq, J)
            }, setZoom: function () {
                var X = new tl,
                    k = new tl,
                    Z = new tl,
                    c = new tl;
                return function (h, V) {
                    if (1 !== h) {
                        var R = this;
                        R._14o && R._14o.stop(!0);
                        var T, l = 1 / h;
                        X.copy(R.getCenter()), k.copy(R.getEye());
                        var g = R._ortho;
                        if (g) {
                            if (T = R._orthoWidth, T < R._moveStep && h > 1) return
                        } else if (X.distanceTo(k) < R._moveStep && 1 > l) return;
                        var u = !1;
                        return R._zoomToCenter === !1 && R._lastZoomLP && (Z.copy(k).sub(X).normalize(), R._81O = null, c.copy(R.getHitPosition(R._lastZoomLP, X.toArray(), Z.toArray())), u = !0, R._lastZoomHit = c), (V = Il(V)) ? (V.action = function (N) {
                            R.fi({
                                kind: R._zooming ? "betweenZoom" : "beginZoom"
                            }), R._zooming = 1;
                            var s = (l - 1) * N + 1;
                            g && R.setOrthoWidth(T * s), u ? (R.setEye(Z.lerpVectors(c, k, s).toArray()), R.setCenter(Z.lerpVectors(c, X, s).toArray())) : g || R.setEye(Z.lerpVectors(X, k, s).toArray())
                        }, V._37o = function () {
                            delete R._14o, delete R._zooming, R.fi({
                                kind: "endZoom"
                            }), R.onZoomEnded()
                        }, R._14o = Sf(V)) : (g && R.setOrthoWidth(T * l), u ? (R.setEye(Z.lerpVectors(c, k, l).toArray()), R.setCenter(Z.lerpVectors(c, X, l).toArray())) : g || R.setEye(Z.lerpVectors(X, k, l).toArray()), void 0)
                    }
                }
            }(),
            setOrthoZoom: function (M, F) {
                return this.setZoom(M, F)
            }, getPositionInfo: function (k) {
                var N = this,
                    l = N._eye,
                    j = N._center,
                    H = N.getAspect(),
                    q = k ? zc(fn(j, l, !0), fn(k, l)) : En(l, j);
                if (N._ortho) {
                    var v = N._orthoWidth;
                    return {
                        length: q,
                        height: v / H,
                        width: v
                    }
                }
                var A = 2 * R(N._fovy / 2) * q;
                return {
                    length: q,
                    height: A,
                    width: A * H
                }
            }, getCenterInfo: function () {
                var G = this;
                return G._81O || (G._81O = G.getPositionInfo()), Pm(G._81O)
            }, rotate: function (p, B, X, O) {
                var b = this;
                if (p || B) {
                    O == F && (O = b._firstPersonMode), b._88O && b._88O.stop(!0);
                    var e = b._center,
                        N = b._eye,
                        l = b.getCenterInfo().length,
                        L = O ? e : N,
                        Y = O ? N : e,
                        v = fn(L, Y),
                        j = D(v[0], v[2]),
                        R = D(w(v[0] * v[0] + v[2] * v[2]), v[1]),
                        m = O ? sc : to;
                    return O && (B = -B), (X = Il(X)) ? (X.action = function (U) {
                        b.fi({
                            kind: b._rotating ? "betweenRotate" : "beginRotate"
                        }), b._rotating = 1;
                        var t = j + p * U,
                            T = R + B * U;
                        T = O ? W - vg(b, W - T) : vg(b, T), v[0] = l * n(T) * n(t), v[1] = l * k(T), v[2] = l * n(T) * k(t), L[0] = Y[0] + v[0], L[1] = Y[1] + v[1], L[2] = Y[2] + v[2], b.fp(m, F, L)
                    }, X._37o = function () {
                        delete b._88O, delete b._rotating, b.fi({
                            kind: "endRotate"
                        }), b.onRotateEnded()
                    }, b._88O = Sf(X)) : (j += p, R += B, R = O ? W - vg(b, W - R) : vg(b, R), v[0] = l * n(R) * n(j), v[1] = l * k(R), v[2] = l * n(R) * k(j), L[0] = Y[0] + v[0], L[1] = Y[1] + v[1], L[2] = Y[2] + v[2], b.fp(m, F, L), void 0)
                }
            }, pan: function (I, b, S, j) {
                if (I || b) {
                    var u = this;
                    j == F && (j = u._firstPersonMode), u._89O && u._89O.stop(!0);
                    var m = wp(u),
                        x = [m[0] * I, m[4] * I, m[8] * I],
                        z = [m[1] * b, m[5] * b, m[9] * b],
                        $ = x[0] + z[0],
                        G = x[1] + z[1],
                        v = x[2] + z[2],
                        i = u._center,
                        W = u._eye;
                    if (j) {
                        var h = mb(u.getBoundaries(), W[0], W[2], W[0] + $, W[2] + v, w($ * $ + v * v));
                        $ = h[0], v = h[1]
                    }
                    if (S = Il(S)) {
                        var r = Pm(W),
                            C = Pm(i);
                        return S.action = function (s) {
                            u.fi({
                                kind: u._panning ? "betweenPan" : "beginPan"
                            }), u._panning = 1, i[0] = C[0] + $ * s, i[1] = C[1] + G * s, i[2] = C[2] + v * s, W[0] = r[0] + $ * s, W[1] = r[1] + G * s, W[2] = r[2] + v * s, u.fp(to, F, W), u.fp(sc, F, i)
                        }, S._37o = function () {
                            delete u._89O, delete u._panning, u.fi({
                                kind: "endPan"
                            }), u.onPanEnded()
                        }, u._89O = Sf(S)
                    }
                    i[0] += $, i[1] += G, i[2] += v, W[0] += $, W[1] += G, W[2] += v, u.fp(to, F, W), u.fp(sc, F, i)
                }
            }, walk: function (_, H, p) {
                if (_) {
                    var y = this;
                    p == F && (p = y._firstPersonMode), y._90O && y._90O.stop(!0);
                    var t = y._center,
                        E = y._eye,
                        S = fn(t, E, !0);
                    if (p) {
                        var D = mb(y.getBoundaries(), E[0], E[2], E[0] + S[0] * _, E[2] + S[2] * _, X(_));
                        if (_ = En(D), !_) return;
                        S = [D[0] / _, 0, D[1] / _]
                    }
                    if (H = Il(H)) {
                        var Z = Pm(E),
                            R = Pm(t);
                        return H.action = function (T) {
                            y.fi({
                                kind: y._walking ? "betweenWalk" : "beginWalk"
                            }), y._walking = 1;
                            var p = _ * T;
                            E[0] = Z[0] + S[0] * p, E[1] = Z[1] + S[1] * p, E[2] = Z[2] + S[2] * p, t[0] = R[0] + S[0] * p, t[1] = R[1] + S[1] * p, t[2] = R[2] + S[2] * p, y.fp(to, F, E), y.fp(sc, F, t)
                        }, H._37o = function () {
                            delete y._90O, delete y._walking, y.fi({
                                kind: "endWalk"
                            }), y.onWalkEnded()
                        }, y._90O = Sf(H)
                    }
                    E[0] += S[0] * _, E[1] += S[1] * _, E[2] += S[2] * _, t[0] += S[0] * _, t[1] += S[1] * _, t[2] += S[2] * _, y.fp(to, F, E), y.fp(sc, F, t)
                }
            }, handleScroll: function (i, O) {
                i.preventDefault();
                var w = this,
                    A = w._moveStep,
                    o = w.getDataInfoAt(i);
                if (o) {
                    var d = o.data;
                    if (d && w.isInteractive(d)) {
                        var B = w.intersectObject(i, d);
                        if (B) {
                            var _ = B.part,
                                h = ii(d.s(_ + ".image") || d.s("shape3d." + _ + ".image") || d.s("all.image") || d.s("shape3d.image"));
                            if (h && Dj(h.scrollable, d, w)) return
                        }
                    }
                }
                return w.isFirstPersonMode() ? (w.isPannable() && w.pan(0, O > 0 ? A : -A), void 0) : (w.isZoomable() && (w._lastZoomLP = w.lp(i), w.setZoom(0 > O ? 1 / _f : _f), w._lastZoomLP = w._lastZoomHit = null), void 0)
            }, handlePinch: function (O, Q) {
                if (this.isZoomable()) {
                    if (Math.abs(O - Q) < u.pinchZoomThreshold) return;
                    this.setZoom(Q > O ? 1 / db : db)
                }
            }, reset: function () {
                this.setCenter(u.graph3dViewCenter), this.setEye(u.graph3dViewEye), this.setUp(u.graph3dViewUp)
            }, moveSelection: function (n, q, M) {
                var W = this;
                W.dm().beginTransaction(), qc(this.sm().toSelection(this.isMovable, this), n, q, M), W.dm().endTransaction()
            }, getMoveMode: function (H, s) {
                var Q = s.s("3d.move.mode");
                if (Q) return Q;
                var W = "88",
                    V = "89",
                    p = "90";
                return Pf(H) || pl[W] && pl[V] && pl[p] ? "xyz" : pl[W] && pl[V] ? "xy" : pl[W] && pl[p] ? "xz" : pl[V] && pl[p] ? "yz" : pl[W] ? "x" : pl[V] ? "y" : pl[p] ? "z" : "xz"
            }, handleTick: function () {
                var C = this,
                    p = !1,
                    Y = C._moveStep,
                    a = Y,
                    V = !1,
                    o = !0,
                    D = C._rotateStep * (o ? -1 : 1);
                if (C.isWalkable() || (a = 0), C.isPannable() || (Y = 0), C.isRotatable() || (D = 0), C._32Q) {
                    var E = (mm() - C._32Q) / 50;
                    a *= E, Y *= E, D *= E
                }
                C._31Q && (td(C._31Q), delete C._31Q, delete C._32Q), sb() && (p = !0, C.pan(-Y, 0, V, o)), Fr() && (p = !0, C.pan(Y, 0, V, o)), $j() && (p = !0, Pf() ? C.pan(0, Y, V, o) : C.walk(a, V, o)), Ib() && (p = !0, Pf() ? C.pan(0, -Y, V, o) : C.walk(-a, V, o)), Wk() && (p = !0, C.rotate(-D, 0, V, o)), _i() && (p = !0, C.rotate(D, 0, V, o)), Nk() && (p = !0, C.rotate(0, -D / 2, V, o)), ri() && (p = !0, C.rotate(0, D / 2, V, o)), p && (C._32Q = mm(), C._31Q = $e(C.handleTick, C))
            }, handleKeyDown: function (L) {
                var p = this;
                !ik(L) && Gj[L.keyCode] ? p.handleTick() : Dq(L) ? p.selectAll() : qq(L) ? p.handleDelete(L) : Cf(L) && this.isResettable() && p.reset()
            }, checkDoubleClickOnNote: function (R, b, e) {
                var A = this;
                if (e === Rm) {
                    if (b.s("note.toggleable")) return b.s(ke, !b.s(ke)), A.fi({
                        kind: "toggleNote",
                        event: R,
                        data: b,
                        part: e
                    }), !0
                } else if (e === Vk && b.s("note2.toggleable")) return b.s(Mh, !b.s(Mh)), A.fi({
                    kind: "toggleNote2",
                    event: R,
                    data: b,
                    part: e
                }), !0;
                return !1
            }, checkDoubleClickOnRotation: function (W, _, p) {
                return p === Pg ? (_.setRotationX(0), !0) : p === hb ? (_.setRotationY(0), !0) : p === pn ? (_.setRotationZ(0), !0) : !1
            }, onRotateEnded: function () { }, onWalkEnded: function () { }, getViewRatio: function (n) {
                var U = this;
                if (U.isOrtho()) return U.getWidth() / U.getOrthoWidth();
                var l = U.getCenter(),
                    J = U.getHeight(),
                    H = U.getEye(),
                    A = [l[0] - H[0], l[1] - H[1], l[2] - H[2]],
                    e = [n[0] - H[0], n[1] - H[1], n[2] - H[2]],
                    i = Math.sqrt(A[0] * A[0] + A[1] * A[1] + A[2] * A[2]),
                    R = 1 / Math.tan(U.getFovy() / 2);
                return J * i * R / (e[0] * A[0] + e[1] * A[1] + e[2] * A[2])
            }, inViewSpace: function (L) {
                var T, k = this,
                    I = k._transformPointToViewSpace(L),
                    O = k.getAspect(),
                    S = k.getNear(),
                    $ = k.getFar();
                return -I[2] < S || -I[2] > $ ? !1 : k.isOrtho() ? (T = k.getOrthoWidth() / 2, Math.abs(I[0]) <= T && Math.abs(I[1] * O) <= T) : (T = Math.sqrt(I[0] * I[0] + I[1] * I[1] + I[2] * I[2]) * Math.tan(k.getFovy() / 2), Math.abs(I[1] <= T) && Math.abs(I[0]) <= T * O)
            }, getPVMatrix: function () {
                var l, v = this;
                return (l = v._18Q) || (l = Mc(v), v._18Q = xo(l, l, wp(v)), v._18Q._wh = v.getWidth() / 2 / v.getHeight()), l
            }, getFrustum: function () {
                var g = new br,
                    c = new Vc,
                    f = new Array(16);
                return function () {
                    for (var e = this.getPVMatrix(), j = !1, $ = 0; 16 > $; $++) e[$] !== f[$] && (j = !0, f[$] = e[$]);
                    return j && c.setFromMatrix(g.fromArray(e)), c
                }
            }(),
            toViewPosition: function (V) {
                var x = this,
                    g = x.getWidth() / 2,
                    G = x.getHeight() / 2,
                    k = x.getPVMatrix();
                return V = Ek([V[0], V[1], V[2], 1], k), {
                    x: g + g * V[0] / V[3],
                    y: G - G * V[1] / V[3],
                    z: V[2] / V[3]
                }
            }, getHitPosition: function (S, u, Q) {
                var X = this,
                    T = X.getWidth(),
                    o = X.getHeight(),
                    h = S.target ? X.lp(S) : S,
                    i = h.x - T / 2,
                    x = h.y - o / 2,
                    z = X.getCenterInfo(),
                    E = wp(X);
                u = u ? u : [0, 0, 0], Q = Q ? Q : [0, 1, 0], i = i / T * z.width, x = -1 * x / o * z.height;
                var F = [E[0] * i, E[4] * i, E[8] * i],
                    q = [E[1] * x, E[5] * x, E[9] * x],
                    e = [F[0] + q[0], F[1] + q[1], F[2] + q[2]],
                    w = X.getCenter(),
                    N = cc(X, u, Q, [e[0] + w[0], e[1] + w[1], e[2] + w[2]]);
                return N ? N : [0, 0, 0]
            }, intersectObject: function (k, h) {
                return this._raycaster.intersectObject(k, h)
            }, intersectObjects: function (U, t, g) {
                return this._raycaster.intersectObjects(U, t, g)
            }, getLineLength: function (j) {
                this.validate();
                var Z = this.getData3dUI(j);
                if (Z && Z.getCache) {
                    var K = Z.getCache();
                    if (K) return K[K.length - 1].length
                }
                return 0
            }, getLineOffset: function (V, k) {
                var i = this.getData3dUI(V);
                if (i && i.getCache) {
                    var U = i.getCache();
                    if (U) {
                        var J = Qd(U, k);
                        if (!V.r3) return J;
                        var u = V.r3();
                        if (0 === u[0] && 0 === u[1] && 0 === u[2]) return J;
                        var x = new tl(V.p3()),
                            d = new tl(J.point).sub(x),
                            X = new tl(J.tangent).add(d),
                            R = (new fs).setFromEuler(new gg(u, V.getRotationMode(), !0));
                        return d.applyQuaternion(R), X.applyQuaternion(R), {
                            point: d.add(x),
                            tangent: X.sub(d).normalize()
                        }
                    }
                }
                return F
            }, isLabelVisible: function () {
                return !0
            }, isNoteVisible: function () {
                return !0
            }, moveCamera: function (M, i, X) {
                var V = this,
                    h = V.getEye();
                h = [h[0], h[1], h[2]];
                var B = V.getCenter();
                if (B = [B[0], B[1], B[2]], M || (M = h), i || (i = B), V._flyAnim && V._flyAnim.stop(!0), X = Il(X), !X) return V.setEye(M[0], M[1], M[2]), V.setCenter(i[0], i[1], i[2]), delete V._flyAnim, !0;
                var H = [M[0] - h[0], M[1] - h[1], M[2] - h[2]],
                    Q = [i[0] - B[0], i[1] - B[1], i[2] - B[2]];
                return X.action = function (j) {
                    V.setCenter(B[0] + Q[0] * j, B[1] + Q[1] * j, B[2] + Q[2] * j), V.setEye(h[0] + H[0] * j, h[1] + H[1] * j, h[2] + H[2] * j)
                }, X._37o = function () {
                    delete V._flyAnim
                }, V._flyAnim = Sf(X)
            }, flyTo: function () {
                function u(X, R, C) {
                    if (C instanceof O.Node) {
                        v.fromArray(sj(C, R.getMat(C)));
                        var A = C.getAnchor3d();
                        X.push((new tl).set(0 - A.x, 0 - A.y, 0 - A.z).applyMatrix4(v)), X.push((new tl).set(0 - A.x, 0 - A.y, 1 - A.z).applyMatrix4(v)), X.push((new tl).set(0 - A.x, 1 - A.y, 0 - A.z).applyMatrix4(v)), X.push((new tl).set(0 - A.x, 1 - A.y, 1 - A.z).applyMatrix4(v)), X.push((new tl).set(1 - A.x, 0 - A.y, 0 - A.z).applyMatrix4(v)), X.push((new tl).set(1 - A.x, 0 - A.y, 1 - A.z).applyMatrix4(v)), X.push((new tl).set(1 - A.x, 1 - A.y, 0 - A.z).applyMatrix4(v)), X.push((new tl).set(1 - A.x, 1 - A.y, 1 - A.z).applyMatrix4(v))
                    }
                }
                var m = new tl,
                    D = new tl,
                    N = new tl,
                    c = new tl,
                    v = new br,
                    q = new O.Math.Quaternion,
                    d = new gg,
                    E = new Hi;
                return function (W, e, p) {
                    var $ = this;
                    if (p !== Z) e = {
                        animation: e,
                        ratio: p
                    };
                    else {
                        var y = typeof e;
                        ("boolean" === y || "object" === y && e.duration) && (e = {
                            animation: e
                        })
                    }
                    e = e || {}, m.fromArray($.getEye()), D.fromArray($.getCenter());
                    var g, H, Q = [],
                        X = e.center,
                        T = e.distance === Z;
                    if (X && N.fromArray(X), W instanceof O.Node) X || N.fromArray(W.p3()), T && (u(Q, $, W), g = Q.length);
                    else {
                        if (W || (W = $.dm().getDatas()), !W.length) return;
                        if ((T || !X) && (Q = [], W.forEach(function (_) {
                            u(Q, $, _)
                        }), g = Q.length, !g)) return;
                        X || (E.setFromPoints(Q), N.copy(E.min).add(E.max).multiplyScalar(.5))
                    } if ($.setCenter(N.x, N.y, N.z), c.subVectors(m, D), e.direction || e.worldDirection) {
                        !e.worldDirection && W instanceof O.Node ? q.setFromEuler(d.set(W.r3(), W.getRotationMode(), !0)) : q.set(0, 0, 0, 1);
                        var C = c.length();
                        c.fromArray(e.worldDirection || e.direction).applyQuaternion(q).setLength(C)
                    }
                    var B = 0;
                    if (T) {
                        var i, j, w, p = e.ratio || .8,
                            h = e.xRatio || p,
                            o = e.yRatio || p;
                        if ($.isOrtho()) {
                            var P = -1 / 0;
                            for ($._eye[0] = c.x + N.x, $._eye[1] = c.y + N.y, $._eye[2] = c.z + N.z, i = Mc($), xo(i, i, wp($)), H = 0; g > H; H++) w = Q[H], j = Ek([w.x, w.y, w.z, 1], i), P = Math.max(P, Math.max(Math.abs(j[0]) / h, Math.abs(j[1]) / o));
                            B = $.getOrthoWidth() * P, c.add(N)
                        } else {
                            for (var s, L, z = $.getNear(), A = 10; A--;) {
                                for ($._eye[0] = c.x + N.x, $._eye[1] = c.y + N.y, $._eye[2] = c.z + N.z, i = Mc($), xo(i, i, wp($)), s = !0, L = -1 / 0, H = 0; g > H; H++) {
                                    if (w = Q[H], j = Ek([w.x, w.y, w.z, 1], i), j[3] < z && A) {
                                        c.multiplyScalar(2), s = !1;
                                        break
                                    }
                                    L = Math.max(L, Math.max(Math.abs(j[0]) / h, Math.abs(j[1]) / o) - j[3])
                                }
                                if (s) break
                            }
                            c.setLength(L + c.length()).add(N)
                        }
                    } else c.setLength(e.distance).add(N);
                    $._flyAnim && $._flyAnim.stop(!0);
                    var S = Il(e.animation);
                    if (S) {
                        $.setEye(m.x, m.y, m.z), $.setCenter(D.x, D.y, D.z);
                        var k = (new tl).subVectors(c, m),
                            U = (new tl).subVectors(N, D);
                        if (B) var f = $.getOrthoWidth();
                        var R = new tl,
                            l = new tl,
                            I = S.action,
                            n = S._37o,
                            V = m.clone(),
                            M = D.clone();
                        return S.action = function (J, O) {
                            R.copy(V).addScaledVector(k, J), l.copy(M).addScaledVector(U, J), $.setCenter(l.x, l.y, l.z), $.setEye(R.x, R.y, R.z), B && $.setOrthoWidth((B - f) * J + f), I && I(J, O)
                        }, S._37o = function () {
                            delete $._flyAnim, n && n()
                        }, {
                            lastEye: m,
                            lastCenter: D,
                            eye: c,
                            center: N,
                            orthoWidth: B,
                            animation: $._flyAnim = Sf(S)
                        }
                    }
                    return $.setEye(c.x, c.y, c.z), B && $.setOrthoWidth(B), delete $._flyAnim, {
                        lastEye: m,
                        lastCenter: D,
                        eye: c,
                        center: N,
                        orthoWidth: B
                    }
                }
            }(),
            getBoundingBox: function () {
                function Y(E, J, g) {
                    $.fromArray(sj(g, J.getMat(g)));
                    var A = g.getAnchor3d();
                    E.push((new tl).set(0 - A.x, 0 - A.y, 0 - A.z).applyMatrix4($)), E.push((new tl).set(0 - A.x, 0 - A.y, 1 - A.z).applyMatrix4($)), E.push((new tl).set(0 - A.x, 1 - A.y, 0 - A.z).applyMatrix4($)), E.push((new tl).set(0 - A.x, 1 - A.y, 1 - A.z).applyMatrix4($)), E.push((new tl).set(1 - A.x, 0 - A.y, 0 - A.z).applyMatrix4($)), E.push((new tl).set(1 - A.x, 0 - A.y, 1 - A.z).applyMatrix4($)), E.push((new tl).set(1 - A.x, 1 - A.y, 0 - A.z).applyMatrix4($)), E.push((new tl).set(1 - A.x, 1 - A.y, 1 - A.z).applyMatrix4($))
                }
                var $ = new br;
                return function (d) {
                    if (d = d || this.sm().getSelection(), d instanceof O.Node && (d = [d]), 0 === d.length) return F;
                    var X = [];
                    d.forEach(function (Q) {
                        Fq(Q) && Y(X, this, Q)
                    }, this);
                    var N = [1 / 0, 1 / 0, 1 / 0],
                        Q = [-1 / 0, -1 / 0, -1 / 0];
                    return X.forEach(function (U) {
                        N[0] = Math.min(U.x, N[0]), N[1] = Math.min(U.y, N[1]), N[2] = Math.min(U.z, N[2]), Q[0] = Math.max(U.x, Q[0]), Q[1] = Math.max(U.y, Q[1]), Q[2] = Math.max(U.z, Q[2])
                    }), {
                        min: N,
                        max: Q
                    }
                }
            }(),
            setBatchInfo: function (A, T) {
                var w = this._batchInfoMap[A];
                this._batchInfoMap[A] = T, this.fp("batchInfo", w, T)
            }, getBatchInfo: function (q) {
                return this._batchInfoMap[q] || ef[q]
            }
        }), Eh.RenderEnv = function (I) {
            this.gv = I, this.enable = !1
        }, o.defineProperties(Eh.RenderEnv.prototype, {
            debugOn: {
                get: function () {
                    return this._debugOn
                }, set: function ($) {
                    this._debugOn = $, this.capture && this.capture()
                }
            }
        }), o.assign(Eh.RenderEnv.prototype, {
            renderEnvToCube: function (w, Y, m, N) {
                var u = this,
                    s = u.gv;
                if (!w || !Y || !m) return u.enable = !1, u._42 = null, void 0;
                u.enable = !0;
                var y = Math.floor(N / w * Y),
                    G = s.getGL(),
                    Q = u._renderTargets;
                Q ? Q.length < m && (Q = u._renderTargets = Q.concat(new Array(m - Q.length))) : Q = u._renderTargets = new Array(m);
                for (var U = 0; m > U; U++) Q[U] ? Q[U].setSize(G, N, y) : Q[U] = new Eh.RenderTarget(s, G, N, y);
                var M = !1;
                u.capture = function () {
                    M = !0, s._42(), M = !1
                };
                var c = new tl,
                    O = new tl,
                    H = new tl,
                    J = new tl,
                    V = (new tl).setY(0),
                    v = 2 * Math.PI / m,
                    T = w / 2 / Math.tan(Math.PI / m),
                    I = 2 * Math.atan2(Y / 2, T),
                    t = w / Y;
                u._42 = function (S, R, r, B) {
                    var G = u._debugOn;
                    if (!M && !G) return !1;
                    c.copy(s.getEye()), J.copy(s.getCenter()).sub(c);
                    var K = Math.atan2(J.z, J.x),
                        Z = s.getNear(),
                        L = s.getFovy(),
                        F = s.getAspect();
                    O.copy(s.getCenter());
                    for (var Y, x = 0; m > x; x++)
                        if (Y = Q[x], V.setZ(Math.cos(K)).setX(Math.sin(K)).multiplyScalar(T), K -= v, H.addVectors(c, V), s.setNear(T), s.setCenter([H.x, H.y, H.z]), s.setFovy(I), s.setAspect(t), G) {
                            var y = Math.round(R / m);
                            ts.for(S).glState.viewport = [y * x, 0, y, r], B()
                        } else So(S, Y.frame), ts.for(S).glState.viewport = [0, 0, Y.width, Y.height], S.clear(S.COLOR_BUFFER_BIT), B(), Ar(S), Y.assureTexture();
                    return s.setNear(Z), s.setCenter([O.x, O.y, O.z]), s.setFovy(L), s.setAspect(F), !0
                }, u.capture()
            }, getTextureInfo: function (G) {
                var Q = this._renderTargets;
                if (!Q) return null;
                var D = this._renderTargets[G];
                return D ? {
                    index: G,
                    texture: D.texture,
                    textureName: D.uuid
                } : null
            }
        }), o.assign(Eh.Graph3dView.prototype, {
            renderEnvToCube: function (j, p, N, G) {
                var U = this;
                U.envRenderer || (U.envRenderer = new Eh.RenderEnv(U)), U.envRenderer.renderEnvToCube(j, p, N, G)
            }
        });
        var kq = ["left", "front", "right", "back", "top", "bottom"],
            Km = Eh._RenderList = function () {
                function c() {
                    J.length = 0, j.length = 0, l = {}
                }

                function $(n) {
                    var q = n.gv,
                        N = n.data;
                    if (_ && !Ad) return n._renderParams = null, void 0;
                    var C, u, G, f, w = n.shapeModel;
                    if (w) {
                        var L, m, S, $ = N.s("shape3d.transparent") || N.s("points.transparent");
                        for (ip(w) || (L = Dj(w.transparent, N, q), w = [w]), G = 0, f = w.length; f > G; G++) S = w[G], m = Dj(S.transparent, N, q), m === Z && (m = L), m === Z && (m = $), m ? u = !0 : C = !0
                    }
                    for (G = 0, f = kq.length; f > G; G++) {
                        var k = n[kq[G]];
                        k && (k.transparent ? u = !0 : C = !0)
                    }
                    q.isLabelVisible(N) && (n.labelInfo && (N.s(Bg + ".transparent") ? u = !0 : C = !0), n.label2Info && (N.s(Qk + ".transparent") ? u = !0 : C = !0)), q.isNoteVisible(N) && (n.noteInfo && (N.s(Rm + ".transparent") ? u = !0 : C = !0), n.note2Info && (N.s(Vk + ".transparent") ? u = !0 : C = !0)), n._38o && (u = C = !0), u || (C = !0), n._renderParams = {
                        opaque: C,
                        transparent: u
                    }
                }

                function M(N, x) {
                    x && $(N);
                    var r = N.data,
                        n = r._id;
                    if (!l[n]) {
                        l[n] = !0;
                        var u = N._renderParams;
                        u && u.visible !== !1 && (N = {
                            ui: N,
                            data: r,
                            z: r._z,
                            id: n
                        }, u.opaque && J.push(N), u.transparent && j.push(N))
                    }
                }

                function D() {
                    J.length > 1 && J.sort(i), j.length > 1 && j.sort(p)
                }

                function S(d) {
                    d ? (kb(y, h, d), kb(X, W, d), kb(H, f, d)) : (y = this.batchModelMap = {}, h = this.batchIndexMap = {}, X = this.polylineModelMap = {}, W = this.polylineIndexMap = {}, H = this.wireframeModelMap = {}, f = this.wireframeIndexMap = {}), this.markBatchInvalid()
                }

                function z(m) {
                    m ? kb(y, h, m) : (y = this.batchModelMap = {}, h = this.batchIndexMap = {}), this.markBatchInvalid()
                }

                function U(V) {
                    V ? kb(X, W, V) : (X = this.polylineModelMap = {}, W = this.polylineIndexMap = {}), this.markBatchInvalid()
                }

                function q(U) {
                    U ? kb(H, f, U) : (H = this.wireframeModelMap = {}, f = this.wireframeIndexMap = {}), this.markBatchInvalid()
                }

                function s() {
                    return this._batchInvalid
                }

                function t() {
                    this._batchInvalid = !0
                }

                function e() {
                    this._batchInvalid = null
                }
                var J = [],
                    j = [],
                    y = {},
                    h = {},
                    X = {},
                    W = {},
                    H = {},
                    f = {},
                    l = {};
                return {
                    opaque: J,
                    transparent: j,
                    init: c,
                    push: M,
                    batchModelMap: y,
                    batchIndexMap: h,
                    polylineModelMap: X,
                    polylineIndexMap: W,
                    wireframeModelMap: H,
                    wireframeIndexMap: f,
                    ivBatch: S,
                    ivModelBatch: z,
                    ivPolylineBatch: U,
                    ivWireframeBatch: q,
                    markBatchInvalid: t,
                    isBatchInvalid: s,
                    onUpdated: e,
                    sort: D
                }
            },
            Ud = Eh._RenderLists = function () {
                function B() {
                    for (var H in t) t[H].init()
                }

                function f() {
                    for (var T in t) t[T].onUpdated()
                }

                function X(T, D) {
                    T = T || "main";
                    var Z = t[T];
                    return !Z && D && (Z = t[T] = new Km), Z
                }

                function u(D, i) {
                    var b = D.data.getRenderLayer(),
                        H = X(b, !0);
                    H.push(D, i)
                }

                function q(Z) {
                    for (var w in t) Z(t[w])
                }
                var t = {};
                return {
                    init: B,
                    onUpdated: f,
                    get: X,
                    push: u,
                    each: q,
                    lists: t
                }
            },
            fq = Eh.RenderTarget = function (T, J, E, F, t) {
                var C = this;
                t = t || {}, t.samples = Math.min(T._glCapabilities.maxSamples, t.samples && t.samples > 1 && 2 === T._webGLVersion ? t.samples : 0), C.options = t, C.uuid = O.Math.generateUUID(), C.gv = T, C.init(T, J, t), t.samples && !T._glCapabilities._maxSamplesChecked ? C.setSize(J, E || 1, F || 1) : C.setSize(J, E, F)
            };
        o.assign(Eh.RenderTarget.prototype, {
            bind: function (Z) {
                So(Z, this.options.samples ? this._MSAAFbo : this.frame)
            }, unbind: function (R) {
                Ar(R), this.options.samples && (R.bindFramebuffer(R.READ_FRAMEBUFFER, this._MSAAFbo), R.bindFramebuffer(R.DRAW_FRAMEBUFFER, this.frame), R.blitFramebuffer(0, 0, this.width, this.height, 0, 0, this.width, this.height, R.COLOR_BUFFER_BIT, R.NEAREST), R.bindFramebuffer(R.READ_FRAMEBUFFER, null), R.bindFramebuffer(R.DRAW_FRAMEBUFFER, null))
            }, init: function (y, P, j) {
                var Y = this,
                    E = Y.texture = P.createTexture();
                P.activeTexture(P.TEXTURE0), an(P, E);
                var G = j.samples,
                    D = G ? P.NEAREST : P.LINEAR;
                P.texParameteri(P.TEXTURE_2D, P.TEXTURE_MIN_FILTER, j.minFilter || D), P.texParameteri(P.TEXTURE_2D, P.TEXTURE_MAG_FILTER, j.magFilter || D), an(P, null), Y.render = P.createRenderbuffer(), Y.frame = P.createFramebuffer(), y._2O[Y.uuid] = E
            }, assureTexture: function () {
                var Z = this,
                    z = Z.uuid,
                    h = Z.gv._2O;
                h[z] || (h[z] = Z.texture)
            }, setSize: function (O, D, q) {
                var n = this;
                if (D && q && (n.width !== D || n.height !== q)) {
                    var R = O.RGBA,
                        A = O.TEXTURE_2D,
                        z = O.RENDERBUFFER,
                        N = O.FRAMEBUFFER,
                        B = n.options.samples;
                    if (O.activeTexture(O.TEXTURE0), an(O, n.texture), O.texImage2D(A, 0, R, D, q, 0, R, O.UNSIGNED_BYTE, F), Rc.isPOT(D) && Rc.isPOT(q) && !n.options.clampToEdge ? (O.texParameteri(O.TEXTURE_2D, O.TEXTURE_WRAP_S, O.REPEAT), O.texParameteri(O.TEXTURE_2D, O.TEXTURE_WRAP_S, O.REPEAT)) : (O.texParameteri(O.TEXTURE_2D, O.TEXTURE_WRAP_S, O.CLAMP_TO_EDGE), O.texParameteri(O.TEXTURE_2D, O.TEXTURE_WRAP_T, O.CLAMP_TO_EDGE)), O.bindRenderbuffer(z, n.render), B) {
                        var w = n.gv._glCapabilities;
                        if (w._maxSamplesChecked) O.renderbufferStorageMultisample(z, B, O.DEPTH_COMPONENT16, D, q);
                        else {
                            for (O.getError(); B > 1 && (O.renderbufferStorageMultisample(z, B, O.DEPTH_COMPONENT16, D, q), O.getError());) B = Math.floor(B >> 1);
                            1 >= B && (B = 0, O.texParameteri(O.TEXTURE_2D, O.TEXTURE_MIN_FILTER, n.options.minFilter || O.LINEAR), O.texParameteri(O.TEXTURE_2D, O.TEXTURE_MAG_FILTER, n.options.magFilter || O.LINEAR), O.renderbufferStorage(z, O.DEPTH_COMPONENT16, D, q)), w._maxSamplesChecked = !0, w.maxSamples = n.options.samples = B
                        }
                    } else O.renderbufferStorage(z, O.DEPTH_COMPONENT16, D, q);
                    B && !n._MSAAFbo && (n._MSAAFbo = O.createFramebuffer(), n._MSAARbO = O.createRenderbuffer()), So(O, n.frame), O.framebufferTexture2D(N, O.COLOR_ATTACHMENT0, A, n.texture, 0), B || O.framebufferRenderbuffer(N, O.DEPTH_ATTACHMENT, z, n.render), Ar(O), B && (O.bindRenderbuffer(O.RENDERBUFFER, n._MSAARbO), O.renderbufferStorageMultisample(O.RENDERBUFFER, B, O.RGBA8, D, q), So(O, n._MSAAFbo), O.framebufferRenderbuffer(O.FRAMEBUFFER, O.COLOR_ATTACHMENT0, O.RENDERBUFFER, n._MSAARbO), O.framebufferRenderbuffer(N, O.DEPTH_ATTACHMENT, z, n.render), Ar(O)), an(O, F), O.bindRenderbuffer(z, F), n.width = D, n.height = q
                }
            }, toCanvas: function () {
                var e = this,
                    u = e.gv.getGL();
                So(u, e.frame);
                var H = e.width,
                    K = e.height,
                    C = new Uint8Array(4 * H * K);
                u.readPixels(0, 0, H, K, u.RGBA, u.UNSIGNED_BYTE, C), Ar(u);
                var N = U.createElement("canvas");
                N.width = H, N.height = K;
                var $ = N.getContext("2d"),
                    l = $.createImageData(H, K);
                return l.data.set(C), $.putImageData(l, 0, 0), N
            }
        });
        var Vq = Eh.Interactor = function (K) {
            this.gv = this.g3d = K
        };
        Dn("Interactor", o, {
            ms_listener: 1,
            getView: function () {
                return this.gv.getView()
            }, setUp: function () {
                this.addListeners()
            }, tearDown: function () {
                this.removeListeners()
            }
        });
        var ps = Eh.DefaultInteractor = function (U) {
            fi(ps, this, [U])
        };
        Dn("DefaultInteractor", Vq, {
            getDataInfoAt: function (f, e) {
                var j = this.gv,
                    R = j.getDataInfoAt(f);
                if (!j.isBlockSelectable() || !R || !R.data) return R;
                if (!e && j.isSelected(R.data)) return R;
                for (var d = R.data;
                    (d = d.getParent()) && d instanceof O.Block && j.isSelectable(d);) {
                    var o = j.isSelected(d);
                    if (o && e) break;
                    if (R = {
                        data: d,
                        part: R
                    }, o && !e) break
                }
                return R
            }, handle_contextmenu: function (y) {
                Qc(y)
            }, handle_mousewheel: function (H) {
                this.gv.handleScroll(H, H.wheelDelta / 40)
            }, handle_DOMMouseScroll: function (l) {
                2 === l.axis && this.gv.handleScroll(l, -l.detail)
            }, handle_keydown: function (s) {
                this.gv.handleKeyDown(s)
            }, handle_mousedown: function (J) {
                this.handle_touchstart(J)
            }, handle_touchstart: function (S) {
                Qc(S);
                var v = this,
                    O = v.gv,
                    f = jj(S),
                    o = v.getDataInfoAt(S),
                    d = o ? o.data : F,
                    K = o ? o.part : F,
                    $ = O.sm(),
                    r = Bf(S),
                    U = Qj(S);
                O.setFocus(S) && (v._62O = F, v._57I = F, v.pendingClickThrough = F, v.__lastClientPoint__ = lb(S), d ? ik(S) ? $.co(d) ? $.rs(d) : $.as(d) : $.co(d) ? d instanceof Br && d.isClickThroughEnabled() && jj(S) && (v.pendingClickThrough = lb(S)) : $.ss(d) : f && (ik(S) ? O.isRectSelectable() && (v._62O = nj) : v._57I = lb(S)), v._31Q && (td(v._31Q), delete v._31Q, delete v._32Q), v._62O || (O.isFirstPersonMode() && (Pf(S) || Fm(S) || U > 2 ? v._62O = "pan" : O.isMouseRoamable() || li(S) ? (v._62O = "roaming", v.foward = r && jj(S), v._32Q = mm(), v._31Q = $e(v.tick, v)) : f || (v._62O = "roaming")), v._62O || (f && r && Nr[K] ? (v._62O = K, v.p3 = d.p3()) : f && r && Fq(d) && O.isSelected(d) ? O.isMovable(d) ? (v._62O = "move", v.p3 = d.p3(), v.movedata = d) : O._39Q(d) && (v._62O = "none") : li(S) && (U > 2 ? v._62O = "pan" : 2 === U && (v.dist = zo(S), v._62O = "pinch")))), v.point = O.lp(S), Ui(v, S), wm(S) ? O.handleDoubleClick(S, d, K) : O.handleClick(S, d, K))
            }, tick: function () {
                var p = this,
                    J = p.gv,
                    y = J._moveStep;
                p.point && J.isWalkable() && (p._32Q && (y *= (mm() - p._32Q) / 50), J.walk(p.foward ? y : -y), p._32Q = mm(), p._31Q = $e(p.tick, p))
            }, handle_mouseup: function (h) {
                this.handle_touchend(h)
            }, handle_touchend: function (m) {
                var X = this._57I;
                if (X && (En(X, lb(m)) <= 1 && this.gv.sm().cs(), this._57I = F), X = this.pendingClickThrough) {
                    if (En(X, lb(m)) <= 1) {
                        var N = this.getDataInfoAt(m);
                        N && N.data instanceof Br && N.data.isClickThroughEnabled() && (N = this.getDataInfoAt(m, !0), N && (m.clickThrough = !0, this.gv.sm().ss(N.data)))
                    }
                    this.pendingClickThrough = null
                }
            }, handleWindowMouseMove: function (p) {
                this.handleWindowTouchMove(p)
            }, handleWindowTouchMove: function (b) {
                var F, Q, O = this,
                    m = O.gv,
                    r = O._62O,
                    N = O.point,
                    A = m.dm(),
                    R = m.lp(b),
                    s = R.x - N.x,
                    w = R.y - N.y,
                    x = m.getWidth(),
                    t = m.getHeight();
                if (x && t) {
                    var j = lb(b),
                        k = wq(m, j, O.__lastClientPoint__),
                        I = En({
                            x: 0,
                            y: 0
                        }, k),
                        T = -$ * s / x,
                        M = -$ * w / t;
                    if ("roaming" === r) O.rotate(b, T / 2, M / 2);
                    else if (r === Pg || r === hb || r === pn) m._86O || A.beginTransaction(), m.fi({
                        kind: m._86O ? "betweenEditRotation" : "beginEditRotation",
                        event: b
                    }), m._86O = 1, m.sm().each(function (C) {
                        if (Fq(C) && m.isRotationEditable(C)) {
                            var Z = X(T) > X(M) ? T : M;
                            r === Pg ? C.setRotationX(C.getRotationX() + Z) : r === hb ? C.setRotationY(C.getRotationY() + Z) : r === pn && C.setRotationZ(C.getRotationZ() + Z)
                        }
                    });
                    else if ("move" === r || Nr[r]) {
                        if (r === zb || r === Oh || r === dh) m._87O || A.beginTransaction(), m.fi({
                            kind: m._87O ? "betweenEditScale" : "beginEditScale",
                            event: b
                        }), m._87O = 1;
                        else {
                            if (!m._moving) {
                                if (I < u.touchMoveThreshold) return;
                                A.beginTransaction()
                            }
                            m.fi({
                                kind: m._moving ? "betweenMove" : "beginMove",
                                event: b
                            }), m._moving = 1
                        }
                        var U, y = O.p3,
                            n = m.getPositionInfo(y),
                            C = wp(m);
                        U = r === Zo ? "x" : r === te ? "y" : r === ll ? "z" : r === zb ? "sx" : r === Oh ? "sy" : r === dh ? "sz" : m.getMoveMode(b, O.movedata), s = s / x * n.width, w = -1 * w / t * n.height;
                        var V, d, p = [C[0] * s, C[4] * s, C[8] * s],
                            e = [C[1] * w, C[5] * w, C[9] * w],
                            W = p[0] + e[0],
                            g = p[1] + e[1],
                            v = p[2] + e[2],
                            J = [y[0] + W, y[1] + g, y[2] + v],
                            Z = fn(m.getEye(), J, !0);
                        if ("xyz" === U ? (V = J, m.moveSelection(W, g, v)) : "xz" === U ? (V = cc(m, y, [0, 1, 0], J), V && m.moveSelection(V[0] - y[0], 0, V[2] - y[2])) : "xy" === U ? (V = cc(m, y, [0, 0, 1], J), V && m.moveSelection(V[0] - y[0], V[1] - y[1], 0)) : "yz" === U ? (V = cc(m, y, [1, 0, 0], J), V && m.moveSelection(0, V[1] - y[1], V[2] - y[2])) : "x" === U || "sx" === U ? (Z[0] = 0, V = cc(m, y, Z, J), V && (d = V[0] - y[0], "x" === U ? m.moveSelection(d, 0, 0) : m.sm().each(function (i) {
                            Fq(i) && m.isSizeEditable(i) && (F = i.getScaleX() + d / 100, Q = F / i.getScaleX(), i.setScaleX(F), Pf(b) && (i.setScaleY(i.getScaleY() * Q), i.setScaleTall(i.getScaleTall() * Q)))
                        }))) : "y" === U || "sy" === U ? (Z[1] = 0, V = cc(m, y, Z, J), V && (d = V[1] - y[1], "y" === U ? m.moveSelection(0, d, 0) : m.sm().each(function (k) {
                            Fq(k) && m.isSizeEditable(k) && (F = k.getScaleTall() + d / 100, Q = F / k.getScaleTall(), k.setScaleTall(F), Pf(b) && (k.setScaleY(k.getScaleY() * Q), k.setScaleX(k.getScaleX() * Q)))
                        }))) : ("z" === U || "sz" === U) && (Z[2] = 0, V = cc(m, y, Z, J), V && (d = V[2] - y[2], "z" === U ? m.moveSelection(0, 0, d) : m.sm().each(function (n) {
                            Fq(n) && m.isSizeEditable(n) && (F = n.getScaleY() + d / 100, Q = F / n.getScaleY(), n.setScaleY(F), Pf(b) && (n.setScaleX(n.getScaleX() * Q), n.setScaleTall(n.getScaleTall() * Q)))
                        }))), !V) return;
                        O.p3 = V
                    } else if (r === nj) {
                        var z = O.div;
                        z || (z = O.div = dd(), sn(O.getView(), z), z.op = N, z.style.background = m.getRectSelectBackground()), m.fi({
                            kind: m._rectSelecting ? "betweenRectSelect" : "beginRectSelect",
                            event: b
                        }), m._rectSelecting = 1, z.rect = ms(z.op, R), qp(z, z.rect)
                    } else if ("pinch" === r && 2 === Qj(b)) {
                        m.fi({
                            kind: m._pinching ? "betweenPinch" : "beginPinch",
                            event: b
                        }), m._pinching = 1;
                        var d = zo(b);
                        m._lastZoomLP || (m._lastZoomLP = ne(b)), m.handlePinch(d, O.dist), O.dist = d
                    } else "pan" === r || Pf(b) || Fm(b) ? O.pan(b, s, w) : "none" === r || m.isFirstPersonMode() || O.rotate(b, T, M);
                    O.point = R
                }
            }, pan: function (r, G, u) {
                var B = this.gv;
                if (B.isPannable()) {
                    var H = B.getWidth(),
                        j = B.getHeight();
                    if (!H || !j) return;
                    var w = B.getCenterInfo(),
                        e = G / H * w.width,
                        f = -1 * u / j * w.height;
                    B.fi({
                        kind: B._panning ? "betweenPan" : "beginPan",
                        event: r
                    }), B._panning = 1, B.pan(-e, -f)
                }
            }, rotate: function (I, e, y) {
                var H = this.gv;
                H.isRotatable() && (H.fi({
                    kind: H._rotating ? "betweenRotate" : "beginRotate",
                    event: I
                }), H._rotating = 1, H.rotate(e, y))
            }, handleWindowMouseUp: function (G) {
                this.handleWindowTouchEnd(G)
            }, handleWindowTouchEnd: function (K) {
                var _ = this,
                    u = _.gv,
                    g = u.dm(),
                    H = _.div;
                if (H) {
                    var V = u.getDatasInRect(H.rect);
                    if (!V.isEmpty()) {
                        var n = u.sm(),
                            q = n.toSelection();
                        V.each(function (w) {
                            n.co(w) ? q.remove(w) : q.add(w)
                        }), n.ss(q)
                    }
                    yj(H)
                }
                u._moving && (delete u._moving, u.fi({
                    kind: "endMove",
                    event: K
                }), u.onMoveEnded(), g.endTransaction()), u._panning && (delete u._panning, u.fi({
                    kind: "endPan",
                    event: K
                }), u.onPanEnded()), u._rotating && (delete u._rotating, u.fi({
                    kind: "endRotate",
                    event: K
                }), u.onRotateEnded()), u._86O && (delete u._86O, u.fi({
                    kind: "endEditRotation",
                    event: K
                }), g.endTransaction()), u._87O && (delete u._87O, u.fi({
                    kind: "endEditScale",
                    event: K
                }), g.endTransaction()), u._pinching && (delete u._pinching, u.fi({
                    kind: "endPinch",
                    event: K
                }), u.onPinchEnded()), u._rectSelecting && (delete u._rectSelecting, u.fi({
                    kind: "endRectSelect",
                    event: K
                }), u.onRectSelectEnded()), u._walking && (delete u._walking, u.fi({
                    kind: "endWalk",
                    event: K
                }), u.onWalkEnded()), u._lastZoomLP = u._lastZoomHit = null, _.dist = _.point = _._62O = _.p3 = _.movedata = _.div = _._57I = _.pendingClickThrough = _._32Q = _._31Q = _.foward = F, _.__lastClientPoint__ = F
            }
        });
        var cl = Eh.MapInteractor = function (I) {
            fi(cl, this, [I]), this._keepHorizon = !0, this._threshold = 2, this._touchScaleThreshold = .05, this._touchRotateThreshold = .03, this._touchScaleCheckAccuracy = .01, this._panButton = "right", this.maxPhi = 5 * Math.PI / 12
        };
        Dn("MapInteractor", Vq, {
            handle_contextmenu: function (K) {
                Qc(K)
            }, handle_mousewheel: function (i) {
                this.gv.handleScroll(i, i.wheelDelta / 40)
            }, handle_DOMMouseScroll: function (N) {
                2 === N.axis && this.gv.handleScroll(N, -N.detail)
            }, handle_keydown: function (f) {
                this.gv.handleKeyDown(f)
            }, handle_mousedown: function (S) {
                this.handle_touchstart(S)
            }, handle_touchstart: function (B) {
                Qc(B);
                var $ = this,
                    e = $.gv;
                if (e.setFocus(B)) {
                    var K = e.getDataInfoAt(B),
                        P = K ? K.data : F,
                        T = K ? K.part : F,
                        X = $.editing = {
                            point: e.lp(B)
                        };
                    li(B) ? X.touch = !0 : (X.touch = !1, X.clickLeft = jj(B), X.pan = Fm(B) ? !0 : "left" === this.panButton === X.clickLeft), P && e._39Q(P) && (X.preventDefault = !0), Ui($, B), wm(B) ? e.handleDoubleClick(B, P, T) : e.handleClick(B, P, T)
                }
            }, handle_mouseup: function (b) {
                this.handle_touchend(b)
            }, handle_touchend: function () { }, handleWindowMouseMove: function (X) {
                this.handleWindowTouchMove(X)
            }, handleWindowTouchMove: function (Z) {
                var Y = this,
                    z = Y.gv,
                    e = Y.editing;
                if (e) {
                    var V = z.lp(Z),
                        N = e.point,
                        s = V.x - N.x,
                        o = V.y - N.y;
                    if (!e.moved) {
                        if (Math.abs(s) < Y.threshold && Math.abs(o) < Y.threshold && !(Z.touches && Z.touches.length > 1)) return;
                        e.moved = !0
                    }
                    if (!e.preventDefault)
                        if (e.point = V, e.touch) {
                            var G = Z.touches.length;
                            if (2 !== G) Y.pan(Z, s, o);
                            else {
                                if (1 >= G) return;
                                var p = Z.touches,
                                    E = {
                                        x: p[0].clientX,
                                        y: p[0].clientY
                                    },
                                    w = {
                                        x: p[1].clientX,
                                        y: p[1].clientY
                                    },
                                    g = {
                                        x: w.x - E.x,
                                        y: w.y - E.y
                                    },
                                    y = e.lastCenter,
                                    A = Math.atan2(g.y, g.x),
                                    D = e.theta,
                                    v = 0;
                                D == F ? D = e.theta = A : (v = A - D, e.thetaStarted || Math.abs(v) > Y.touchRotateThreshold ? (e.thetaStarted = !0, e.theta = A) : v = 0);
                                var n = W * (E.y + w.y) / 2 / z.getHeight(),
                                    q = e.phi,
                                    a = 0;
                                q == F ? q = e.phi = n : (a = n - q, e.phiStarted || Math.abs(a) > Y.touchRotateThreshold ? (e.phiStarted = !0, e.phi = n) : a = 0);
                                var I, b = Math.sqrt(g.x * g.x + g.y * g.y),
                                    Q = e.vlen;
                                if (Q) {
                                    var P = E.x - y.x,
                                        h = E.y - y.y,
                                        f = w.x - y.x,
                                        X = w.y - y.y,
                                        U = Math.sqrt(P * P + h * h),
                                        x = Math.sqrt(f * f + X * X),
                                        d = Q / 2,
                                        R = Y._sign2(U - d),
                                        L = Y._sign2(x - d);
                                    0 > R * L || 0 === R && 0 === L ? (I = 1, e.vlen = b) : (I || (I = b / Q), e.scaleStarted || Math.abs(I - 1) > Y.touchScaleThreshold ? (e.vlen = b, e.scaleStarted = !0) : I = 1)
                                } else Q = e.vlen = b, I = 1;
                                1 !== I && z.setZoom(I), (a || v) && Y.rotate(Z, v, -a), e.lastCenter = {
                                    x: (w.x + E.x) / 2,
                                    y: (w.y + E.y) / 2
                                }
                            }
                        } else if (e.pan) Y.pan(Z, s, o);
                        else {
                            var r = z.getWidth(),
                                u = z.getHeight();
                            if (!r || !u) return;
                            var S = -$ * s / r,
                                l = -$ * o / u;
                            Y.rotate(Z, S, l)
                        }
                }
            }, _sign2: function (s) {
                return Math.abs(s) < this._touchScaleCheckAccuracy ? 0 : s > 0 ? 1 : -1
            }, handleWindowMouseUp: function (H) {
                this.handleWindowTouchEnd(H)
            }, handleWindowTouchEnd: function (A) {
                var J = this,
                    Q = J.editing;
                if (J.editing = null, Q) {
                    var M = J.gv;
                    if (Q.moved || !Q.clickLeft && !Q.touch) M._panning = null, M._rotating = null, M.fi({
                        kind: Q.pan ? "endPan" : "endRotate",
                        event: A
                    });
                    else {
                        var u = M.getDataAt(A);
                        u ? M.sm().setSelection([u]) : M.sm().clearSelection()
                    }
                }
            }, pan: function (B, l, g) {
                var D = this,
                    O = D.gv;
                if (O.isPannable()) {
                    var n = O.getWidth(),
                        C = O.getHeight();
                    if (n && C) {
                        var z = O.getCenterInfo(),
                            q = -l / n * z.width,
                            K = 1 * g / C * z.height;
                        O.fi({
                            kind: O._panning ? "betweenPan" : "beginPan",
                            event: B
                        }), O._panning = 1;
                        var G = D.keepHorizon,
                            L = D.editing.touch;
                        if ((L && B.touches && B.touches.length > 1 || !L && Pf(B)) && (G = !G), !G) return O.pan(q, K);
                        if (q || K) {
                            var S = wp(O),
                                V = [S[0] * q, S[4] * q, S[8] * q],
                                P = [S[1], 0, S[9]],
                                m = Math.sqrt(P[0] * P[0] + P[2] * P[2]);
                            m && (P = [P[0] / m * K, 0, P[2] / m * K]);
                            var A = V[0] + P[0],
                                i = V[1] + P[1],
                                y = V[2] + P[2],
                                w = O._center,
                                r = O._eye;
                            w[0] += A, w[1] += i, w[2] += y, r[0] += A, r[1] += i, r[2] += y, O.fp(to, F, r), O.fp(sc, F, w)
                        }
                    }
                }
            }, rotate: function (K, y, N) {
                var O = this,
                    i = O.gv;
                if (i.isRotatable()) {
                    var q = i._center,
                        E = i._eye,
                        t = fn(E, q),
                        e = D(w(t[0] * t[0] + t[2] * t[2]), t[1]),
                        l = vg(i, e + N);
                    N = l - e, i.fi({
                        kind: i._rotating ? "betweenRotate" : "beginRotate",
                        event: K
                    }), i._rotating = 1, i.rotate(y, N)
                }
            }
        }), o.defineProperties(cl.prototype, {
            panButton: {
                get: function () {
                    return this._panButton
                }, set: function (Z) {
                    this._panButton = Z
                }
            },
            minPhi: {
                get: function () {
                    return this.gv.getRotateMinPhi()
                }, set: function (R) {
                    this.gv.setRotateMinPhi(R)
                }
            },
            maxPhi: {
                get: function () {
                    return this.gv.getRotateMaxPhi()
                }, set: function (g) {
                    this.gv.setRotateMaxPhi(g)
                }
            },
            keepHorizon: {
                get: function () {
                    return this._keepHorizon
                }, set: function (g) {
                    this._keepHorizon = g
                }
            },
            threshold: {
                get: function () {
                    return this._threshold
                }, set: function (x) {
                    this._threshold = x
                }
            },
            touchScaleThreshold: {
                get: function () {
                    return this._touchScaleThreshold
                }, set: function (i) {
                    this._touchScaleThreshold = i
                }
            },
            touchRotateThreshold: {
                get: function () {
                    return this._touchRotateThreshold
                }, set: function (K) {
                    this._touchRotateThreshold = K
                }
            }
        });
        var Ye, cq = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEyUlEQVRYR62XW0xcVRSG/58cmIG2HmstE9N4SX2xtVqBCISoFS/RmDSpKQSvTWNixUStQSqVyBQYJUGttrQVtYkPatuQPmhivMUHqbUBZ2itl1qjTzZpImNUZhDLsUeWWXgOOd2cgcGyk3mYs/de69trr70uxP8YIlJKMi0i9wIgyf0iEiM5PFdxzGeDiBQAuB7AjQBuALCN5NcGQDmANgBfeL8UyYnZ5M8KICJ3AXgAwAlfOMl/VHAQwPtveYAKuQLA2yQ/ngliRgAR2QogA2AvSdcUZAIE50VEYR4BsIDkC7kgQgFE5GIAuwDsJnkk1+aZAPw9IqLX1gjgcZK/m7KmAXjK4wBaSf4ZplxEIgCuA3Cz3gSAfgDHSf6dY/0FAJ4D0G5ChAEcAPBwmHIRqXNd90nLsiocx/k+k8n8oK/Atu2rIpHIStd1v7QsawfJd0Ouywawh6T609Q4B8C788NhZnddt29sbGxBd3f39q6urtNhJ43H48uam5u3lJSUjFiWdV8IxE0Aqki+6M9NAXjefjnJXsOZogBGBgYGttbU1Hw427PS+cHBwbVVVVUJAItJOoa8xwD8RPIT/T4J4L3zfQAeNL1dRMZra2ur+/v7/8pHub+mvr7+wr6+vs8KCgoWGABFAN4EsEHjhA9QBeA2ks8HF6vZk8nkQL4nNwGTyeTa8vLycsuy7jcg1Mk/IpnyAZoBaOQ6FHg+ddlsdqNt201zObm5NpvN7ly0aNHrJN8LyL4FwGqSr/gAOrnej3C60HXdw/F4PJ7L4fKFSiQSl7W0tLQVFRWtCQDoNRwguZ6aWABcorE9sEDf+QjJ1fkqmmmdiHwHoCToXyKiceR0rkhY5TjOq9FoVLPdeY/x8fG+SCSySe/cFKYWCFOyPJ1Or4zFYh3nrR3A8PBwe2lp6TcAfg4DmBYwAFyRTqdXxWKx9nkE+DYUIEyBiFQ6jvNaNBq9Zz4AZruCGIBlJI8ZXpolee18AORwwgoAp/xnqMmjPuilZ8+ePZRIJNo7OztD436+YB0dHZe2trY+W1hYWGsccD/JOh/gKQBHSWpanRwicnc2m91k2/bmfJWFrRsdHd29cOHCXSTfD8i+FcA1JHcEQ/HtJDVnTw3XdfcPDQ0dra6unto8F5hUKrWurKxslWVZG4L7RGQbgA9IDgWT0VsANprJaGJi4kxDQ8OagwcPjsxFeWNj49Le3l6N91qMTA2vmNnr6fovGXkmvxPAlST3hGz4LZVKbausrMzLEnryioqKNpJLzCpJRJ4AcJLkp6rHLEieBjBA8rB5Wtd1942NjS3p6el5qa2t7VSYNdThmpqaWoqLi38xze4dUku4CpLb/f1hJZnWBY+SzJpKRGSdV5LVOI5zIpPJnNQ1tm2viEQiV7uue8SyrJeDDhew8GIAO0me4w9hABdp8ahNBkktyacNr+Qu84pSndfX81VY6e6dXJV3AoiT/CMoMFcyUogeAG+Q/DyX8+VZlqvZHwKw2VQ+zQdCTL4FwBkPZFrJPUtjoildG5PC4J2bOvJpze7QWhHAj4HWbBImpDXTQsPvH5cDeMf39lxWnBXAU6TNqcZu7fn0lyB53GhOdf6ZQHN6bF6a0xxOuJTkrwbA5LdcJ831/V8SOUYQxYGhRwAAAABJRU5ErkJggg==",
            Hq = 32,
            Zg = Eh.GlobeInteractor = function (J, L) {
                fi(Zg, this, [J]);
                var S, b = L.radius || 6378137,
                    x = this,
                    Y = null;
                Ye || (Ye = dd(), Ye.style.border = "", Ye.style.backgroundImage = "url(" + cq + ")");
                var N = new fs,
                    U = new tl,
                    Q = new tl,
                    R = new tl,
                    H = new Qi,
                    c = "number" == typeof b ? {
                        x: b,
                        y: b,
                        z: b
                    } : b,
                    G = {
                        center: new tl(0, 0, 0),
                        radius: c
                    },
                    t = function (S) {
                        J._81O = null;
                        var P = J.getHitPosition(S, J.getCenter(), U.copy(J.getEye()).sub(Q.copy(J.getCenter())).toArray());
                        return H.origin.copy(J.getEye()), H.direction.copy(P).sub(H.origin).normalize(), H.intersectEllipsoid(G)
                    },
                    h = function (N, M) {
                        J._81O = null, H.origin.copy(J.getEye());
                        for (var V, b, L = J.getCenter(), d = U.copy(J.getEye()).sub(Q.copy(J.getCenter())).toArray(), X = 1, e = 16, K = 0, v = 1, B = {
                            x: 0,
                            y: 0
                        }; e--;) {
                            if (B.x = M.x + (N.x - M.x) * X, B.y = M.y + (N.y - M.y) * X, V = J.getHitPosition(B, L, d), H.direction.copy(V).sub(H.origin).normalize(), b = H.intersectEllipsoid(G), b && 1 === X) return {
                                hit: b
                            };
                            b ? K = X : v = X, X = (K + v) / 2
                        }
                        return {
                            hit: b,
                            out: 1 > X
                        }
                    },
                    s = function (M, S) {
                        if (Y) {
                            var n = Date.now();
                            Y.deltaTime = Y.lastTime ? n - Y.lastTime : 1e3, Y.lastTime = n, Y.lastAxis = M, Y.lastAngle = S
                        }
                        S && (N.setFromAxisAngle(M, S), J.setEye(U.copy(J.getEye()).applyQuaternion(N).toArray()), J.setCenter(U.copy(J.getCenter()).applyQuaternion(N).toArray()), J.setUp(U.copy(J.getUp()).applyQuaternion(N).toArray()))
                    };
                x._showCrossIcon = function (g) {
                    sn(x.getView(), Ye), qp(Ye, {
                        x: g.clientX - Hq / 2,
                        y: g.clientY - Hq / 2,
                        width: Hq,
                        height: Hq
                    })
                }, x._hideCrossIcon = function () {
                    yj(Ye)
                }, x._scrollImpl = function (p, X) {
                    Y = {
                        point: J.lp(p),
                        screen: lb(p),
                        hit: t(p),
                        type: "right"
                    }, Y.hitNormalize = Y.hit ? Y.hit.clone().normalize() : new tl;
                    var G = {
                        clientX: Y.screen.x,
                        clientY: Y.screen.y + 10 * X
                    };
                    x._handleMoveImpl(G), x._endMoveImpl(G)
                }, x._startMoveImpl = function (o) {
                    S && (S.stop(!0), S = null), Y = {
                        point: J.lp(o),
                        screen: lb(o),
                        hit: t(o)
                    }, Y.hitNormalize = Y.hit ? Y.hit.clone().normalize() : new tl, li(o) ? 1 === o.touches.length ? Y.hit && (Y.type = "left") : 2 === o.touches.length && (Y.type = "touch2") : (jj(o) ? Y.hit && (Y.type = "left") : tk(o) ? Y.type = "right" : Fm(o) && Y.hit && (Y.type = "middle"), !Y.hit || "right" !== Y.type && "middle" !== Y.type || x._showCrossIcon(o)), Y.type && Ui(x, o)
                }, x._handleMoveImpl = function (c) {
                    if (Y) switch (Y.type) {
                        case "left":
                            return x._handleLeft(c);
                        case "right":
                            return x._handleRight(c);
                        case "middle":
                            return x._handleMiddle(c);
                        case "touch2":
                            return x._handleTouch2(c)
                    }
                }, x._endMoveImpl = function () {
                    if (Y) {
                        if (this._hideCrossIcon(), "left" === Y.type || "middle" === Y.type) {
                            var q = 1e3 * (Y.lastAngle / (Y.deltaTime || 30)),
                                B = Y.lastAxis,
                                j = Y.lastTime,
                                m = function () {
                                    var P = Date.now(),
                                        l = (P - j) / 1e3;
                                    return j = P, q *= Math.pow(Math.abs(x.decelerationRate), 3 * l), Math.abs(q) < .01 ? (q = 0, S && S.stop(), void 0) : (s(B, q * l), void 0)
                                };
                            S = Sf({
                                action: function () {
                                    m(arguments)
                                }, duration: 5e3
                            })
                        }
                        Y = null
                    }
                }, x._handleLeft = function (c) {
                    if (!Y.finished) {
                        var Z = lb(c),
                            J = h(Z, Y.lastScreen || Y.screen);
                        if (Y.lastScreen = Z, !J.hit) return Y.finished = !0, x._endMoveImpl(c), void 0;
                        var d = J.hit;
                        d.normalize();
                        var C = Y.hitNormalize,
                            I = Math.acos(d.dot(C)),
                            z = d.cross(C).normalize();
                        s(z, I), J.out && (Y.finished = !0, x._endMoveImpl(c))
                    }
                }, x._handleRight = function (b) {
                    var k = Y.lastScreen || Y.screen,
                        E = k.y;
                    k = Y.lastScreen = lb(b);
                    var B = k.y,
                        f = B - E;
                    if (f) {
                        var m = Math.min(.5, f * x.scaleSpeed);
                        U.copy(J.getEye());
                        var d = Y.hit;
                        d || (d = U.clone().divide(c).normalize().multiply(c)), Q.copy(U).lerp(d, m), J.setEye(Q.toArray()), U.copy(J.getUp()), Q.normalize();
                        var G = U.clone().cross(Q).normalize();
                        if (R.copy(J.getCenter()), R.sub(G.multiplyScalar(R.dot(G))), J.setCenter(R.toArray()), Y.hit) {
                            var W = t(Y.screen),
                                g = Y.hitNormalize;
                            if (W) {
                                W.normalize();
                                var V = Math.acos(W.dot(g)),
                                    T = W.cross(g).normalize();
                                V && s(T, V)
                            }
                        }
                    }
                };
                var _ = function (C) {
                    return Math.abs(C) < .01 ? 0 : C > 0 ? 1 : -1
                };
                x._handleTouch2 = function (M) {
                    var i = M.touches.length;
                    if (2 === i) {
                        var f = M.touches,
                            $ = {
                                x: f[0].clientX,
                                y: f[0].clientY
                            },
                            j = {
                                x: f[1].clientX,
                                y: f[1].clientY
                            },
                            l = {
                                x: j.x - $.x,
                                y: j.y - $.y
                            },
                            v = Y.lastCenter,
                            g = Math.atan2(l.y, l.x),
                            n = Y.theta,
                            z = 0;
                        n == F ? n = Y.theta = g : (z = g - n, Y.thetaStarted || Math.abs(z) > .03 ? (Y.thetaStarted = !0, Y.theta = g) : z = 0);
                        var P, D = Math.sqrt(l.x * l.x + l.y * l.y),
                            p = Y.vlen;
                        if (p) {
                            var X = $.x - v.x,
                                t = $.y - v.y,
                                c = j.x - v.x,
                                y = j.y - v.y,
                                K = Math.sqrt(X * X + t * t),
                                d = Math.sqrt(c * c + y * y),
                                L = p / 2,
                                u = _(K - L),
                                x = _(d - L);
                            0 > u * x || 0 === u && 0 === x ? (P = 1, Y.vlen = D) : (P || (P = D / p), Y.scaleStarted || Math.abs(P - 1) > .05 ? (Y.vlen = D, Y.scaleStarted = !0) : P = 1)
                        } else p = Y.vlen = D, P = 1;
                        var l = Q.copy(J.getEye()).clone();
                        1 !== P && J.setEye(l.setLength((l.length() - b) / P + b).toArray()), z && s(l.normalize(), z), Y.lastCenter = {
                            x: (j.x + $.x) / 2,
                            y: (j.y + $.y) / 2
                        }
                    }
                }, x._handleMiddle = function (M) {
                    var v = lb(M),
                        g = Y.screen;
                    Y.screen = v;
                    var P = (v.y - g.y) / 180 * Math.PI * x.rollSpeed;
                    Q.copy(J.getCenter()).sub(U.copy(J.getEye())).normalize(), U.copy(J.getUp()).cross(Q).normalize(), Q.copy(J.getEye()).sub(Y.hit).applyAxisAngle(U, P).add(Y.hit);
                    var u = Q.clone();
                    Q.copy(J.getCenter()).sub(Y.hit).applyAxisAngle(U, P).add(Y.hit);
                    var Z = Q.clone(),
                        q = Q.copy(J.getUp()).applyAxisAngle(U, P).clone(),
                        j = !1;
                    P > 0 && (R.copy(q), Q.copy(Z).sub(u).normalize(), U.copy(u).multiplyScalar(-1).normalize(), U.dot(R) - Q.dot(R) > 0 && (j = !0)), j || R.copy(Y.hit).sub(u).dot(Y.hitNormalize) >= 0 && (j = !0), j || (J.setEye(u.toArray()), J.setCenter(Z.toArray()), J.setUp(q.toArray()));
                    var l = -(v.x - g.x) / 180 * Math.PI * x.rotateSpeed;
                    s(Y.hitNormalize, l)
                }
            };
        Dn("GlobeInteractor", Vq, {
            handle_contextmenu: function (i) {
                Qc(i)
            }, handle_mousewheel: function (y) {
                this._scrollImpl(y, y.wheelDelta / 40)
            }, handle_DOMMouseScroll: function (E) {
                2 === E.axis && this._scrollImpl(E, -E.detail)
            }, handle_keydown: function (g) {
                this.gv.handleKeyDown(g)
            }, handle_mousedown: function (A) {
                this.handle_touchstart(A)
            }, handle_touchstart: function (K) {
                Qc(K);
                var k = this.gv;
                if (k.setFocus(K)) {
                    var E = k.getDataInfoAt(K),
                        P = E ? E.data : F;
                    P && k.isInteractive(P) || this._startMoveImpl(K);
                    var Y = E ? E.part : F;
                    wm(K) ? k.handleDoubleClick(K, P, Y) : k.handleClick(K, P, Y)
                }
            }, handle_mouseup: function (h) {
                this.handle_touchend(h)
            }, handle_touchend: function () { }, handleWindowMouseMove: function (n) {
                this.handleWindowTouchMove(n)
            }, handleWindowTouchMove: function (d) {
                this._handleMoveImpl(d)
            }, handleWindowMouseUp: function (p) {
                this.handleWindowTouchEnd(p)
            }, handleWindowTouchEnd: function (G) {
                this._endMoveImpl(G)
            }
        }), o.defineProperties(Zg.prototype, {
            rotateSpeed: {
                get: function () {
                    return this._rotateSpeed || .3
                }, set: function (u) {
                    this._rotateSpeed = u
                }
            },
            rollSpeed: {
                get: function () {
                    return this._rollSpeed || .1
                }, set: function (e) {
                    this._rollSpeed = e
                }
            },
            scaleSpeed: {
                get: function () {
                    return this._scaleSpeed || .002
                }, set: function (x) {
                    this._scaleSpeed = x
                }
            },
            decelerationRate: {
                get: function () {
                    return this._decelerationRate || .04
                }, set: function (M) {
                    this._decelerationRate = M
                }
            }
        });
        var rl = function (b) {
            var G = 2147483648 | b;
            return [(255 & G >> 16) / 255, (255 & G >> 8) / 255, (255 & G) / 255, (255 & G >> 24) / 255]
        },
            qo = function (J) {
                this.gv = J, this.gv.pickColorMap = {
                    _pickIdUsed: 1e3
                }
            };
        yc(qo, o, {
            _iv: !0,
            iv: function () {
                this._iv = !0
            }, get: function (y, $) {
                this.validate();
                var j = this,
                    l = j.gv.getGL();
                if (!l) return F;
                var o, N, d = j._resolution,
                    U = Math.round(y.x * d),
                    S = Math.ceil(y.width * d),
                    M = Math.ceil(y.height * d),
                    s = j.height - Math.round(y.y * d) - M,
                    b = T(S / 2),
                    g = new Uint8Array(4 * S * M),
                    R = 0,
                    X = g.length,
                    J = $ ? F : new xr,
                    x = $ ? F : {};
                if (So(l, j.frame), l.readPixels(U, s, S, M, l.RGBA, l.UNSIGNED_BYTE, g), Ar(l), $) {
                    for (; b >= R; R++)
                        for (var u = b - R, O = b + R, D = u; O >= D; D++)
                            for (var A = u; O >= A; A++)
                                if ((D === u || D === O || A === u || A === O) && (o = j.info(g, 4 * (D * S + A)))) return o
                } else
                    for (; X > R; R += 4) o = j.info(g, R), o && (N = o.data, x[N._id] || (J.add(N), x[N._id] = N));
                return J
            }, info: function (Q, D) {
                return this.gv.pickColorMap[(Q[D] << 16) + (Q[D + 1] << 8) + Q[D + 2] + ((127 & Q[D + 3]) << 24)]
            }, getResolution: function () {
                return this._resolution
            }, onContextLost: function () {
                this.texture = null, this.width = this.height = -1
            }, validate: function () {
                var U = this,
                    d = U.gv,
                    r = d.getGL();
                if (r) {
                    var I = U._resolution = d._pickerResolution * d.getDevicePixelRatio(),
                        y = Math.round(I * d.getWidth()),
                        D = Math.round(I * d.getHeight()),
                        k = r.RGBA,
                        X = r.TEXTURE_2D,
                        H = r.RENDERBUFFER,
                        K = r.FRAMEBUFFER;
                    if (U.texture || (U.texture = rg(r), U.render = r.createRenderbuffer(), U.frame = r.createFramebuffer()), (U.width !== y || U.height !== D) && (r.activeTexture(r.TEXTURE0), an(r, U.texture), r.texImage2D(X, 0, k, y, D, 0, k, r.UNSIGNED_BYTE, F), Lr(r, r.TEXTURE_MIN_FILTER, r.LINEAR), r.bindRenderbuffer(H, U.render), r.renderbufferStorage(H, r.DEPTH_COMPONENT16, y, D), So(r, U.frame), r.framebufferTexture2D(K, r.COLOR_ATTACHMENT0, X, U.texture, 0), r.framebufferRenderbuffer(K, r.DEPTH_ATTACHMENT, H, U.render), an(r, F), r.bindRenderbuffer(H, F), Ar(r), U.width = y, U.height = D), U._iv) {
                        U._iv = !1;
                        var C = !1;
                        d._40Q.each(function (a) {
                            !C && a.isBatchInvalid() && (C = !0)
                        }), C && d.updateScene(), So(r, U.frame), r.clear(r.COLOR_BUFFER_BIT), d.overlappingBox.clear(), d.setViewport(r, 0, 0, y, D), d.renderPickScene(), Ar(r)
                    }
                }
            }
        });
        var Le = function (W) {
            this.gv = W
        };
        yc(Le, o, {
            gap: 0,
            size: 0,
            _42: function (O, r) {
                var x = this,
                    N = x.gv,
                    t = N._gridGap,
                    L = N._gridSize;
                if (N._gridVisible) {
                    if (x.gap !== t || x.size !== L) {
                        for (var i = [], Y = N._gridSize / 2, d = t * Y, o = 0; 2 * Y + 1 > o; o++) {
                            var s = 6 * o,
                                B = 6 * (2 * Y + 1) + s;
                            i[s] = -d, i[s + 1] = 0, i[s + 2] = -d + o * t, i[s + 3] = d, i[s + 4] = 0, i[s + 5] = -d + o * t, i[B] = -d + o * t, i[B + 1] = 0, i[B + 2] = -d, i[B + 3] = -d + o * t, i[B + 4] = 0, i[B + 5] = d
                        }
                        x.vs = new fk(i), x.gap = t, x.size = L
                    }
                    gk(N), _k(O, r), bi(O), ck(O, r, 1, N._gridColor, N._buffer.vs, x.vs), ie(O, 0, x.vs.length / 3, O.LINES), Jf(O), On(O, r)
                } else x.vs = x.gap = x.size = F
            }
        });
        var ap = function (L) {
            this.gv = L
        };
        yc(ap, o, {
            _42: function (p, U) {
                var s = this.gv,
                    y = s._buffer.vs,
                    f = s._axisXColor,
                    o = s._axisYColor,
                    O = s._axisZColor,
                    $ = s._originAxisVisible,
                    n = s._centerAxisVisible;
                if ($ || n) {
                    var B = Uq ? p.TRIANGLES : p.TRIANGLE_FAN,
                        R = p.LINES;
                    if (gk(s), _k(p, U), bi(p), $) {
                        var D = s.getCenterInfo(),
                            b = V(D.width, D.height) / 5,
                            t = .8 * b,
                            W = .05 * b;
                        ck(p, U, 1.5, f, y, new fk([0, 0, 0, b, 0, 0, t, W, 0, t, 0, W, t, -W, 0, t, 0, -W, t, W, 0, 0, 0, 0, 0, b, 0, W, t, 0, 0, t, W, -W, t, 0, 0, t, -W, W, t, 0, 0, 0, 0, 0, 0, b, W, 0, t, 0, W, t, -W, 0, t, 0, -W, t, W, 0, t])), ie(p, 0, 2, R), ie(p, 1, 6, B), ck(p, U, F, o), ie(p, 7, 2, R), ie(p, 8, 6, B), ck(p, U, F, O), ie(p, 14, 2, R), ie(p, 15, 6, B)
                    }
                    if (n) {
                        var z = s._center,
                            J = z[0],
                            Q = z[1],
                            P = z[2],
                            D = s.getPositionInfo(z);
                        b = V(D.width, D.height) / 20, ck(p, U, 1.5, f, y, new fk([J, Q, P, J + b, Q, P, J, Q, P, J, Q + b, P, J, Q, P, J, Q, P + b])), ie(p, 0, 2, R), ck(p, U, F, o), ie(p, 2, 2, R), ck(p, U, F, O), ie(p, 4, 2, R)
                    }
                    Jf(p), On(p, U)
                }
            }
        });
        var ui = function (B) {
            this.gv = B, this.onMouseOver = this.onMouseOver.bind(this), this.mode = ui.Mode.Style, this.color = Z, this.width = Z
        };
        ui.Mode = {
            Disable: 0,
            Selection: 1,
            MouseOver: 2,
            Style: 3
        }, yc(ui, o, {
            onMouseOver: function (P) {
                u.preventDefault(P);
                var Q = this.gv.getDataAt(P);
                Q !== this.mouseOverData && (this.mouseOverData = Q, this.gv.iv())
            }, setFetchTargetFunc: function (f) {
                this.fetchTargetFunc = f
            }, _42: function (y, W) {
                var D, z, t = this,
                    H = t._mode,
                    E = t.gv;
                if (!y._renderInfo.reflectDepth && H !== ui.Mode.Disable) {
                    if (H === ui.Mode.Selection ? D = E.sm().getSelection().toArray(function (c) {
                        return c.s("highlight.visible")
                    }) : H === ui.Mode.MouseOver && t.mouseOverData && t.mouseOverData.s("highlight.visible") && (D = [t.mouseOverData]), t.fetchTargetFunc && (D = t.fetchTargetFunc(D)), H === ui.Mode.Style) D = D || [], z = function (V) {
                        if (D.indexOf(V) >= 0) return !1;
                        var O = E.getDataHighlightMode(V);
                        return O === !1 ? !0 : O === !0 ? !1 : "selected" === O ? E.isSelected(V) ? !1 : !0 : "hover" === O ? V === t.mouseOverData ? !1 : !0 : !0
                    };
                    else {
                        if (!D || !D.length) return;
                        z = function (m) {
                            return D.indexOf(m) < 0 ? !0 : void 0
                        }
                    }
                    var E = t.gv,
                        N = E.vr.isPresenting(),
                        I = E.getWidth();
                    if (N) {
                        var x = E.getWidth;
                        I /= 2, E.getWidth = function () {
                            return I
                        };
                        var S = E.getViewport()
                    }
                    var O, B = E.getDevicePixelRatio(),
                        R = I * B,
                        K = E.getHeight() * B;
                    (O = t._renderTarget) ? O.setSize(y, R, K) : t._renderTarget = O = new Eh.RenderTarget(E, y, R, K), So(y, O.frame), y.clear(y.COLOR_BUFFER_BIT), E.setViewport(y, 0, 0, R, K);
                    var A = [];
                    D.forEach(function (j) {
                        var S = j.getRenderLayer();
                        A.indexOf(S) < 0 && A.push(S)
                    }), E.drawFilter = z, E.renderPickScene(), E.drawFilter = null, Ar(y), Uq && Rg(y, W.aPosition), Rg(y, W.aNormal), N && (E.getWidth = x, E.setViewport(y, S[0], S[1], S[2], S[3]));
                    var Z = y._compiledShader.highlight;
                    Z || (Z = y._compiledShader.highlight = new Cm.Shader(y, hj.vs, hj.fs)), Z.bind();
                    var M = ts.for(y),
                        P = M.directState();
                    P.blend.enabled = !0, y.activeTexture(y.TEXTURE0 + 0), an(y, O.texture), Z.uniforms.image = 0, Z.uniforms.textureSize = [R, K], Z.uniforms.edgeWidth = E.getHighlightWidth();
                    var d = E.getHighlightColor();
                    if (t._lastHighlightColor !== d) {
                        var g = zd(t._lastHighlightColor = d);
                        t._highlightColorData = [g[0] / 255, g[1] / 255, g[2] / 255, g[3] / 255]
                    }
                    Z.uniforms.edgeColor = t._highlightColorData, t.ibuffer ? (t.ibuffer.upload(), t.vbuffer.upload()) : (t.ibuffer = Cm.Buffer.createIndexBuffer(y, new Uint16Array([0, 2, 1, 1, 2, 3])), t.vbuffer = Cm.Buffer.createVertexBuffer(y, new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]))), Z.attributes.pos.pointer(t.vbuffer), y.drawElements(y.TRIANGLES, 6, y.UNSIGNED_SHORT, 0), P.blend.enabled = !1, an(y, null), y.useProgram(W), Uq && Pr(y, W.aPosition)
                }
            }
        }), o.defineProperties(ui.prototype, {
            mode: {
                get: function () {
                    return this._mode
                }, set: function (d) {
                    var q = this._mode;
                    d !== q && (this._mode = d, d === ui.Mode.MouseOver || d === ui.Mode.Style ? K(this.gv.getView(), "mousemove", this.onMouseOver) : (q === ui.Mode.MouseOver || q === ui.Mode.Style) && b(this.gv.getView(), "mousemove", this.onMouseOver))
                }
            }
        });
        var hj = {
            vs: ["attribute vec2 pos;", "varying vec2 vUv;", "void main(void) {", "gl_Position = vec4(pos.x * 2.0 - 1.0, -pos.y * 2.0 + 1.0, 0.0, 1.0);", "vUv = vec2(pos.x, 1.0 - pos.y);", "}"].join("\n"),
            fs: ["precision highp float;", "uniform sampler2D image;", "uniform vec2 textureSize;", "uniform float edgeWidth;", "uniform vec4 edgeColor;", "varying vec2 vUv;", "float getCol(vec2 coord) {", "return texture2D(image, coord).a;", "}", "void main() {", "vec2 cc = vUv;", "float center = getCol(cc);", "float dx = edgeWidth / textureSize.x;", "float dy = edgeWidth / textureSize.y;", "vec2 coord;", "float topLeft = getCol(cc+vec2(-dx, -dy));", "float top = getCol(cc+vec2(0.0, -dy));", "float topRight = getCol(cc+vec2(dx, -dy));", "float left = getCol(cc+vec2(-dx, 0.0));", "float right = getCol(cc+vec2(dx, 0.0));", "float bottomLeft = getCol(cc+vec2(-dx, dy));", "float bottom = getCol(cc+vec2(0.0, dy));", "float bottomRight = getCol(cc+vec2(dx, dy));", "float v = -topLeft-2.0*top-topRight+bottomLeft+2.0*bottom+bottomRight;", "float h = -bottomLeft-2.0*left-topLeft+bottomRight+2.0*right+topRight;", "float edge = sqrt(h * h + v * v);", "edge = smoothstep(0.9, 1.0, edge);", "if (edge < 0.5) {", "discard;", "}", "gl_FragColor = edgeColor;", "}"].join("\n")
        },
            Rk = function (E) {
                this.gv = E
            },
            Zo = "edit_tx",
            te = "edit_ty",
            ll = "edit_tz",
            Pg = "edit_rx",
            hb = "edit_ry",
            pn = "edit_rz",
            zb = "edit_sx",
            Oh = "edit_sy",
            dh = "edit_sz",
            Nr = {};
        Nr[Zo] = 101, Nr[te] = 102, Nr[ll] = 103, Nr[Pg] = 104, Nr[hb] = 105, Nr[pn] = 106, Nr[zb] = 107, Nr[Oh] = 108, Nr[dh] = 109, yc(Rk, o, {
            _42: function (l, K, m) {
                var i = this,
                    N = i.gv,
                    a = N.sm().ld();
                if (a && N.isEditable(a) && !N.isEditHelperDisabled() && Fq(a) && (!N.isFirstPersonMode() || !N.isMouseRoamable() && !nf)) {
                    gk(N);
                    var F, $, T = N.isMovable(a),
                        I = N.isRotationEditable(a),
                        x = N.isSizeEditable(a),
                        V = N._axisXColor,
                        W = N._axisYColor,
                        S = N._axisZColor,
                        j = N._editSizeColor,
                        A = a.p3(),
                        B = En(N.getEye(), A) / 10,
                        c = B / (m ? 5 : 10),
                        H = .7 * B,
                        X = .4 * H,
                        u = A[0],
                        d = A[1],
                        Y = A[2];
                    F = [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0], T && i._17O(l, K, a, m, Zo, V, F, [u, d - c, Y, u + H, d - c, Y, u + H, d, Y, u + H, d, Y, u, d, Y, u, d - c, Y, u, d - c, Y + c, u + H, d - c, Y + c, u + H, d - c, Y, u + H, d - c, Y, u, d - c, Y, u, d - c, Y + c]), $ = u + H, x && i._17O(l, K, a, m, zb, j, F, [$, d - c, Y, $ + X, d - c, Y, $ + X, d, Y, $ + X, d, Y, $, d, Y, $, d - c, Y, $, d - c, Y + c, $ + X, d - c, Y + c, $ + X, d - c, Y, $ + X, d - c, Y, $, d - c, Y, $, d - c, Y + c]), $ += X, I && i._17O(l, K, a, m, Pg, V, F, [$, d - c, Y, $ + X, d - c, Y, $ + X, d, Y, $ + X, d, Y, $, d, Y, $, d - c, Y, $, d - c, Y + c, $ + X, d - c, Y + c, $ + X, d - c, Y, $ + X, d - c, Y, $, d - c, Y, $, d - c, Y + c]), F = [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0], T && i._17O(l, K, a, m, te, W, F, [u, d, Y, u, d + H, Y, u - c, d + H, Y, u - c, d + H, Y, u - c, d, Y, u, d, Y, u, d, Y, u, d, Y - c, u, d + H, Y - c, u, d + H, Y - c, u, d + H, Y, u, d, Y]), $ = d + H, x && i._17O(l, K, a, m, Oh, j, F, [u, $, Y, u, $ + X, Y, u - c, $ + X, Y, u - c, $ + X, Y, u - c, $, Y, u, $, Y, u, $, Y, u, $, Y - c, u, $ + X, Y - c, u, $ + X, Y - c, u, $ + X, Y, u, $, Y]), $ += X, I && i._17O(l, K, a, m, hb, W, F, [u, $, Y, u, $ + X, Y, u - c, $ + X, Y, u - c, $ + X, Y, u - c, $, Y, u, $, Y, u, $, Y, u, $, Y - c, u, $ + X, Y - c, u, $ + X, Y - c, u, $ + X, Y, u, $, Y]), F = [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0], T && i._17O(l, K, a, m, ll, S, F, [u, d, Y, u, d, Y + H, u, d - c, Y + H, u, d - c, Y + H, u, d - c, Y, u, d, Y, u, d - c, Y, u - c, d - c, Y, u - c, d - c, Y + H, u - c, d - c, Y + H, u, d - c, Y + H, u, d - c, Y]), $ = Y + H, x && i._17O(l, K, a, m, dh, j, F, [u, d, $, u, d, $ + X, u, d - c, $ + X, u, d - c, $ + X, u, d - c, $, u, d, $, u, d - c, $, u - c, d - c, $, u - c, d - c, $ + X, u - c, d - c, $ + X, u, d - c, $ + X, u, d - c, $]), $ += X, I && i._17O(l, K, a, m, pn, S, F, [u, d, $, u, d, $ + X, u, d - c, $ + X, u, d - c, $ + X, u, d - c, $, u, d, $, u, d - c, $, u - c, d - c, $, u - c, d - c, $ + X, u - c, d - c, $ + X, u, d - c, $ + X, u, d - c, $])
                }
            }, _17O: function (p, n, u, R, w, V, N, t) {
                var g = this.gv,
                    D = g._buffer,
                    f = ts.for(p),
                    S = f.directUniforms(),
                    l = f.directAttribs();
                if (g._picking) {
                    R = g.pickColorMap;
                    var k = Nr[w];
                    R[k] = {
                        data: u,
                        part: w
                    }, S.uFixPickReverseColor = rl(k)
                }
                Ll(p, n, F, !0, F, !0, F, !1), S.uDiffuse = V, l.aPosition = bm(p, D.vs, new fk(t), F), l.aNormal = bm(p, D.ns, new fk(N), F), bi(p), ie(p, 0, 12), Jf(p), ol(p, n)
            }
        });
        var Vf = O.Raycaster = function ($) {
            this.gv = $, this.maxTriangleTest = 1 / 0, this.backfaceCulling = !0
        };
        ki("Raycaster", o, {
            intersect: function (u) {
                var A = this,
                    x = A.gv,
                    F = x.getDataAt(u);
                return F ? A.intersectObject(u, F) : null
            }, intersectObjects: function (F, R, A) {
                var X, y, G, i, B = this,
                    _ = 1 / 0,
                    q = F.origin || (new tl).fromArray(B.gv.getEye()),
                    V = B.maxTriangleTest,
                    E = [];
                return R.forEach(function ($) {
                    A && A($) === !1 || $.s("intersect") !== !1 && E.push($)
                }), E.sort(function (o, P) {
                    return q.distanceToSquared2(o.p3()) - q.distanceToSquared2(P.p3())
                }), B.countTriangles = 0, E.forEach(function (T) {
                    B.countTriangles > V || (X = B.intersectObject(F, T), X && (y = q.distanceToSquared(X.world), _ > y && (G = T, i = X, _ = y)))
                }), B.countTriangles = 0, {
                    data: G,
                    intersect: i
                }
            }, intersectObject: function (e, a) {
                if (e instanceof Qi) return this._intersectObjectImpl(e, a);
                var U = this,
                    X = U.gv,
                    d = X.unproject(e),
                    S = new tl,
                    G = X.getEye(),
                    C = new tl;
                if (X.isOrtho()) {
                    var s = new tl(G);
                    C.copy(X.getCenter()).sub(s).normalize();
                    var p = S.copy(d).sub(s).dot(C);
                    S.copy(C).setLength(-p).add(s.copy(d))
                } else S.copy(G), C.copy(d).sub(S).normalize();
                var f = new O.Math.Ray(S, C);
                return U._intersectObjectImpl(f, a)
            }, _intersectObjectImpl: function () {
                function M() {
                    var s = new tl;
                    return s.subVectors(F, g), I.subVectors(x, g), s.cross(I).normalize(), s
                }

                function r(R, U, a, d, r, $, i) {
                    return pq.barycoordFromPoint(R, U, a, d, c), r.multiplyScalar(c.x), $.multiplyScalar(c.y), i.multiplyScalar(c.z), r.add($).add(i), r.clone()
                }
                var j = new br,
                    z = new br,
                    s = new Qi,
                    A = new tl,
                    b = new tl,
                    w = new tl,
                    y = new tl,
                    v = new tl,
                    x = new tl,
                    g = new tl,
                    F = new tl,
                    $ = new Xi,
                    h = new Xi,
                    L = new Xi,
                    I = new tl,
                    B = {
                        vs: Ef,
                        is: Lq,
                        uv: mi
                    },
                    c = new tl,
                    d = Rh.slice(0);
                return d.push("csg"),
                    function (p, c) {
                        var e = this.gv.getData3dUI(c),
                            V = c.mat || e.mat;
                        V ? j.fromArray(V) : j.identity(), z.getInverse(j), s.copy(p).applyMatrix4(z);
                        var a, n, J, W = "body",
                            Z = e.shapeModel;
                        if (Z || (Z = bf(e)), Z || (O.CSGNode && c instanceof O.CSGNode || O.CSGShape && c instanceof O.CSGShape ? (J = !0, Z = [e.left, e.front, e.right, e.back, e.top, e.bottom, e.csg]) : c instanceof O.Node && !(c instanceof O.Shape) ? (a = !0, Z = B) : (n = !0, Z = [e.left, e.front, e.right, e.back, e.top, e.bottom])), !Z) return console.log("Can not find shape model."), null;
                        ip(Z) || (Z = [Z]);
                        var P, u, _, q, H, G, E, m, o, Q, D, t, U, R, i, I, S = 1 / 0,
                            X = ["", "top_", "bottom_"],
                            k = !1,
                            C = this.backfaceCulling,
                            T = [];
                        for ($p(Z, e, T), P = 0, u = T.length; u > P; P++)
                            if (U = T[P])
                                for (_ = 0, q = X.length; q > _; _++)
                                    if (R = X[_], E = U[R + "vs"], m = U[R + "is"], o = U[R + "uv"] || U[R + "tuv"], E) {
                                        if (i = U[R + "boundingBox"]) {
                                            var D = s.intersectBox(i);
                                            if (!D) continue;
                                            if (s.origin.distanceTo(D) > S) continue;
                                            I = !1
                                        } else U[R + "boundingBox"] = i = new O.Math.Box3, I = !0;
                                        for (H = 0, G = m ? m.length : E.length / 3; G > H; H += 3) this.countTriangles++, m ? (b.fromArray(E, 3 * m[H]), w.fromArray(E, 3 * m[H + 1]), y.fromArray(E, 3 * m[H + 2])) : (b.fromArray(E, 3 * H), w.fromArray(E, 3 * (H + 1)), y.fromArray(E, 3 * (H + 2))), I && (i.expandByPoint(b), i.expandByPoint(w), i.expandByPoint(y)), Q = s.intersectTriangle(b, w, y, C, A), Q && (t = s.origin.distanceTo(Q), S > t && (S = t, v.copy(Q), x.copy(b), g.copy(w), F.copy(y), "" !== R ? W = R.slice(0, -1) : a ? W = Rh[Math.floor(H / 6)] : n ? W = Rh[P] : J && (W = d[P]), o && (k = !0, m ? ($.fromArray(o, 2 * m[H]), h.fromArray(o, 2 * m[H + 1]), L.fromArray(o, 2 * m[H + 2])) : ($.fromArray(o, 2 * H), h.fromArray(o, 2 * (H + 1)), L.fromArray(o, 2 * (H + 2))))))
                                    }
                        if (!isFinite(S)) return null;
                        var N, f = v.clone().applyMatrix4(j);
                        k && (N = r(v, x, g, F, $, h, L));
                        var K = M(x, g, F),
                            Y = M(x.applyMatrix4(j), g.applyMatrix4(j), F.applyMatrix4(j)),
                            l = s.direction.dot(K);
                        return l > 0 && (K.multiplyScalar(-1), Y.multiplyScalar(-1)), {
                            world: f,
                            local: v.clone(),
                            worldNormal: Y,
                            normal: K,
                            uv: N,
                            part: W
                        }
                    }
            }()
        });
        var Wj = function (H, q) {
            this.gv = H, this.s = function (b, u, o) {
                return u == F && (u = o), u == F ? q.getStyle(b) : Dj(u, q, H)
            }, this.data = q
        };
        yc(Wj, o, {
            I3d: !0,
            ms_icons: 1,
            _iv: !0,
            _cacheBoundingBox: Z,
            iv: function () {
                this._iv = !0
            }, update: function (U, e, M) {
                var Y = this,
                    j = Y.data;
                if (U || (U = Y.gv, e = U.getGL(), M = e._40Q), !Y.needValidate(e) || !U.isVisible(j)) return M.push(this, !1), void 0;
                var l, z, x, s, R, O = j._id,
                    L = Y.s("autorotate") || Y.s("shape3d.autorotate") || Y.s("fixSizeOnScreen") || Y.s("shape3d.fixSizeOnScreen") ? null : Y.s("batch"),
                    A = j.getRenderLayer(),
                    T = M.get(A, !0),
                    G = T.batchIndexMap,
                    r = T.batchModelMap,
                    W = U.getBrightness(j),
                    V = W != F && 1 !== W;
                l = Qr(G, r, j, L, U);
                var B = Y.validate(l, L ? U.getBatchInfo(L) || Xn : F);
                if (l && (z = G[O], x = z.size = l.vs.length / 3 - z.begin, R = l.rs))
                    for (W = V ? W : 1, s = 0; x > s; s++) R.push(W);
                var S = U.getWireframeGeometry(j);
                if (S) oq(U, j, S);
                else if (Fq(j)) {
                    var E = U.getWireframe(j);
                    E && oq(U, j, E)
                }
                Y.labelInfo = Y.label2Info = Y.noteInfo = Y.note2Info = Y._38o = F, Y._24O(Bg, "getLabel"), Y._24O(Qk, "getLabel2"), Y._26O(Rm, "getNote"), Y._26O(Vk, "getNote2"), Y._15O(), Y.interactiveInfo = U.isInteractive(j) ? {} : F, T.push(this, !0), B !== !1 && (Y._iv = !1)
            }, clearWireframeGeometryCache: function () {
                var M = this;
                Hm(M), M.data.iv()
            }, _46Q: function (G) {
                var l = this,
                    V = l.data,
                    q = l.gv;
                if (q.isVisible(V)) {
                    var f = V._id,
                        r = q._40Q.get(V._renderLayer, !0),
                        J = r.batchIndexMap[f],
                        $ = r.polylineIndexMap[f],
                        E = r.wireframeIndexMap[f];
                    if (J || $ || E) {
                        var v = gm(G, q.pickColorMap, q.isSelectable(V), V, nh, !0);
                        v && (Ic(v, J, r.batchModelMap), Ic(v, $, r.polylineModelMap), Ic(v, E, r.wireframeModelMap))
                    }
                }
            }, _42: function (K, P, G) {
                function N(v, l, G) {
                    var M = l.getBrightness(G),
                        c = G.s("alphaTest"),
                        w = G.s("envmap"),
                        P = ts.for(v),
                        m = P.directUniforms();
                    M != F && 1 !== M && (m.uBrightness = M), m.uAlphaTest = c, m.uUseEnvMap = w ? !0 : !1, m.uReflectivity = w || .01, m.shadowReceive = !S && G.s("shadow.receive"), m.shadowCull = !S && !!G.s("shadow.cull");
                    var T = A.s("3d.clip.direction");
                    if (T) {
                        var L = A.s("3d.clip.percentage");
                        switch (0 === L && (z = !1), T) {
                            case "left":
                                T = 2;
                                break;
                            case "top":
                                T = 3;
                                break;
                            case "bottom":
                                T = 4;
                                break;
                            case "front":
                                T = 5;
                                break;
                            case "back":
                                T = 6;
                                break;
                            case "right":
                            default:
                                T = 1
                        }
                        if (0 === T % 2 && (L = 1 - L), G instanceof O.Shape) {
                            var x = G.s3(),
                                b = G.p3(),
                                u = G.getAnchor3d();
                            L = 3 > T ? (L - u.x) * x[0] + b[0] : 5 > T ? (L - u.y) * x[1] + b[1] : (L - u.z) * x[2] + b[2]
                        } else L -= .5;
                        m.uClipPercent = L
                    }
                    m.uClipDirection = T || 0, v._blooming && !G.s("bloom") && (m.blackout = !0)
                }
                var A = this,
                    m = A.data,
                    I = A.gv;
                if (I.isVisible(m)) {
                    var J, S = I._picking;
                    if (S) J = I.pickColorMap;
                    else {
                        if (I.isTransparentMask(m) || I.isReflecting(K) && m.s("3d.reflectable") === !1) return;
                        J = Z
                    } if (Wj.getTitle === Z) {
                        Wj.getTitle = 0;
                        for (var E in u)
                            if (E.length === Qk.length + 1 && E[Qk.length] === Gr[4].toUpperCase() && E[Qk.length - 1] === Gr[Qk.length + 1].toUpperCase()) {
                                Wj.getTitle = jq;
                                break
                            }
                    }
                    if (!Wj.getTitle || Qg[Qk.length + 2]) {
                        if (Wj.getHead === Z) {
                            Wj.getHead = 0;
                            for (var E in L) {
                                var g = "box-sizing";
                                6 === E.length && E[0] === Gr[4] && E[3] === g[0] && E[4] === g[1] && E[5] === g[2] && (Wj.getHead = jq)
                            }
                        }
                        if (!Wj.getHead || Qg[Qk.length]) {
                            var Q, v, t = m._id,
                                s = I._40Q.get(m._renderLayer, !0),
                                b = s.batchIndexMap,
                                W = s.batchModelMap,
                                R = I.isSelectable(m),
                                D = !1,
                                z = !0,
                                x = b[t];
                            if (S && (v = gm(K, J, R, m, nh, x), v && !I._45Q && (Ic(v, x, W), Ic(v, s.polylineIndexMap[t], s.polylineModelMap), Ic(v, s.wireframeIndexMap[t], s.wireframeModelMap))), x || (D || (D = !0, N(K, I, m)), z && A._80o(K, P, G)), I.isLabelVisible(m) && ((Q = A.labelInfo) && (S && gm(K, J, R, m, Bg), D || (D = !0, N(K, I, m)), A._28O(Q, Bg, G)), (Q = A.label2Info) && (S && gm(K, J, R, m, Qk), D || (D = !0, N(K, I, m)), A._28O(Q, Qk, G))), I.isNoteVisible(m) && ((Q = A.noteInfo) && (S && gm(K, J, R, m, Rm), D || (D = !0, N(K, I, m)), A._29O(Q, Rm, G)), (Q = A.note2Info) && (S && gm(K, J, R, m, Vk), D || (D = !0, N(K, I, m)), A._29O(Q, Vk, G))), (Q = A._38o) && (D || (D = !0, N(K, I, m)), A._99O(K, P, Q, J, R, G)), D) {
                                var f = ts.for(K).directUniforms();
                                f.uBrightness = 1, f.uClipDirection = 0, K._blooming && (f.blackout = !1)
                            }
                        }
                    }
                }
            }, prepare: function () {
                var S = this,
                    D = S.data;
                if (!(D instanceof Br)) {
                    var b, s, C, t, u, Z = S.gv,
                        N = Z.getGL(),
                        n = D._id,
                        Y = S.s("batch"),
                        x = Z._batchIndexMap,
                        I = Z._batchModelMap,
                        q = Z.getBrightness(D),
                        e = q != F && 1 !== q;
                    if (S.needValidate(N)) {
                        if (b = Qr(x, I, D, Y, Z), S.validate(b, Y ? Z.getBatchInfo(Y) || Xn : F), b && (s = x[n], C = s.size = b.vs.length / 3 - s.begin, u = b.rs))
                            for (q = e ? q : 1, t = 0; C > t; t++) u.push(q);
                        if (Fq(D)) {
                            var i = Z.getWireframeGeometry(D);
                            if (i) oq(Z, D, i);
                            else {
                                var K = Z.getWireframe(D);
                                K && oq(Z, D, K)
                            }
                        }
                        S.labelInfo = S.label2Info = S.noteInfo = S.note2Info = S._38o = F, S._24O(Bg, "getLabel"), S._24O(Qk, "getLabel2"), S._26O(Rm, "getNote"), S._26O(Vk, "getNote2"), S._15O(), S.interactiveInfo = Z.isInteractive(D) ? {} : F, S._iv = !1
                    }
                }
            }, dispatchBoundingBoxChanged: function () {
                this._cacheBoundingBox = Z
            }, getBoundingBox: function () {
                var r, H, _, h, L, e;
                return function () {
                    if (this._cacheBoundingBox) return this._cacheBoundingBox;
                    r || (r = {
                        vs: Ef,
                        is: Lq,
                        uv: mi
                    }, H = new tl, _ = new tl, h = new tl, L = new tl, e = new tl);
                    var v = this,
                        F = v.data,
                        w = v.shapeModel;
                    if (w || F instanceof O.Shape || (w = bf(v)), !w && F instanceof O.Shape && (v.prepare(), w = v.shapeModel), w || (F instanceof O.Node && !(F instanceof O.Shape) ? w = r : (v.left || v.front || v.right || v.back || v.top || v.bottom) && (w = [v.left, v.front, v.right, v.back, v.top, v.bottom])), !w) return Z;
                    ip(w) || (w = [w]);
                    var Y, S, U, p, i, f, t, I, B, Q, G, d, $ = ["", "top_", "bottom_"],
                        R = new O.Math.Box3,
                        W = !1;
                    if (v._needRecoverPosition) {
                        L.set.apply(L, F.p3());
                        var m = F.s3();
                        e.set(1 / (m[0] || 1), 1 / (m[1] || 1), 1 / (m[2] || 1))
                    } else L.set(0, 0, 0), e.set(1, 1, 1);
                    for (Y = 0, S = w.length; S > Y; Y++)
                        if (B = w[Y])
                            for (U = 0, p = $.length; p > U; U++)
                                if (Q = $[U], t = B[Q + "vs"], I = B[Q + "is"], t) {
                                    if (d = Q + "boundingBox", G = B[d], !G)
                                        for (B[d] = G = new O.Math.Box3, i = 0, f = I ? I.length : t.length / 3; f > i; i += 3) I ? (H.fromArray(t, 3 * I[i]).sub(L).multiply(e), _.fromArray(t, 3 * I[i + 1]).sub(L).multiply(e), h.fromArray(t, 3 * I[i + 2]).sub(L).multiply(e)) : (H.fromArray(t, 3 * i).sub(L).multiply(e), _.fromArray(t, 3 * (i + 1)).sub(L).multiply(e), h.fromArray(t, 3 * (i + 2)).sub(L).multiply(e)), !H.isNaN() && G.expandByPoint(H), !_.isNaN() && G.expandByPoint(_), !h.isNaN() && G.expandByPoint(h);
                                    R.expandByBox(G), W = !0
                                }
                    return W ? (this._cacheBoundingBox = R, o.freeze(R), o.freeze(R.min), o.freeze(R.max), dn(v.gv, F), R) : Z
                }
            }(),
            needValidate: function () {
                return this._iv
            }, validate: function () { }, _16O: function () {
                return Hd
            }, _80o: function () { }, dispose: function () { }, getBodyColor: function (w) {
                var r = this.data,
                    m = this.gv.getBodyColor(r);
                return m ? m : w ? r.getStyle(w) : F
            }, getCachedTexture: function (N) {
                var p = this._cachedTextures;
                return p ? p[N || "main"] : null
            }, setCachedTexture: function (w, C) {
                var s = this._cachedTextures;
                return s || (s = this._cachedTextures = {}), s[C || "main"] = w, w
            }, invalidateCachedTexture: function (Q) {
                var l = this._cachedTextures;
                if (l) {
                    for (var R in l) Q.deleteTexture(l[R]);
                    this._cachedTextures = {}
                }
            }, invalidateCachedGeometry: function () { }, _24O: function (g, I) {
                var x = this,
                    u = x.data,
                    z = x.gv,
                    m = x.s,
                    d = z[I](u);
                if (d != F) {
                    var l = m(g + ".scale"),
                        O = m(g + ".max"),
                        r = x[g + "Info"] = {
                            label: d,
                            textureScale: m(g + ".texture.scale"),
                            color: z[I + "Color"](u),
                            font: m(g + ".font"),
                            align: m(g + ".align"),
                            background: z[I + "Background"](u)
                        },
                        H = r.rect = qr(r, d);
                    O > 0 && O < H.width && (r.labelWidth = H.width, H.width = O), H.x = H.y = 0, H.width *= l, H.height *= l, r.mat = x._16O(m(g + ".autorotate"), m(g + ".position"), H, m(g + ".face"), m(g + ".t3"), m(g + ".r3"), m(g + ".rotationMode"));
                    var T = H.width / 2,
                        o = H.height / 2;
                    r.vs = new fk([-T, o, 0, -T, -o, 0, T, -o, 0, T, o, 0]), H.width /= l, H.height /= l
                }
            }, _26O: function (C, r) {
                var Z = this,
                    x = Z.data,
                    W = Z.gv,
                    Y = Z.s,
                    L = W[r](x);
                if (L != F) {
                    var g = Y(C + ".scale"),
                        I = this[C + "Info"] = {
                            note: L,
                            textureScale: Y(C + ".texture.scale"),
                            expanded: Y(C + ".expanded"),
                            font: Y(C + ".font"),
                            color: Y(C + ".color"),
                            align: Y(C + ".align"),
                            borderWidth: Y(C + ".border.width"),
                            borderColor: Y(C + ".border.color"),
                            background: W[r + "Background"](x)
                        };
                    if (I.expanded) {
                        var O = Y(C + ".max"),
                            _ = qr(I, L);
                        _.width += 6, _.height += 2, O > 0 && O < _.width && (I.labelWidth = _.width, _.width = O);
                        var J = {
                            x: -_.width / 2,
                            y: -8 - _.height,
                            width: _.width,
                            height: _.height + 8
                        }
                    } else J = {
                        x: -6,
                        y: -18,
                        width: 12,
                        height: 18
                    };
                    I.mat = Z._16O(Y(C + ".autorotate"), Y(C + ".position"), F, Y(C + ".face"), Y(C + ".t3"), Y(C + ".r3"), Y(C + ".rotationMode")), I.rect = J, 1 !== g && (J = Pm(J), J.x *= g, J.height *= g, J.y = -J.height, J.width *= g);
                    var S = J.x,
                        z = J.y,
                        i = J.width,
                        y = J.height;
                    I.vs = new fk([S, -z, 0, S, -z - y, 0, S + i, -z - y, 0, S + i, -z, 0])
                }
            }, eachShapeModel: function (q, t) {
                function j(p) {
                    ko(p), p.vs && q(p.vs, p.is, p.ns, p.uv), p.top_vs && q(p.top_vs, p.top_is, p.top_ns, p.top_uv), p.bottom_vs && q(p.bottom_vs, p.bottom_is, p.bottom_ns, p.bottom_uv), p.from_vs && q(p.from_vs, p.from_is, p.from_ns, p.from_uv), p.to_vs && q(p.to_vs, p.to_is, p.to_ns, p.to_uv)
                }

                function A(v) {
                    var S, c, w;
                    if (ip(v))
                        for (c = 0, w = v.length; w > c; c++) S = v[c], S && A(S);
                    else dk(v) ? A(bf(n, v), n) : xl(v) && (v.shape3d ? A(v.shape3d) : j(v))
                }
                var n = this,
                    J = n.data,
                    t = t || n.shapeModel || bf(n);
                t || (t = J instanceof O.Node && !(J instanceof O.Shape) ? {
                    vs: Ef,
                    is: Lq
                } : [n.left, n.front, n.right, n.back, n.top, n.bottom]), A(t)
            }, _28O: function (k, T, I) {
                if (I(this.s(T + ".transparent"))) {
                    var K = k.rect,
                        F = k.textureScale,
                        d = K.width * F,
                        x = K.height * F;
                    if (d >= 1 && x >= 1) {
                        var P = Cr(d, x);
                        1 !== F && (P.translate(P, K.x, K.y), P.scale(F, F), P.translate(P, -K.x, -K.y)), vp(P, k), P.restore(), ud(this, T, k.mat, k.vs, !0)
                    }
                }
            }, _29O: function (u, M, Y) {
                if (Y(this.s(M + ".transparent"))) {
                    var I = u.rect,
                        a = u.textureScale,
                        V = I.x,
                        $ = I.y,
                        y = I.width * a,
                        C = I.height * a;
                    if (y >= 1 && C >= 1) {
                        I.x = I.y = 0;
                        var R = Cr(y, C);
                        1 !== a && R.scale(a, a), $q(R, u), R.restore(), I.x = V, I.y = $, ud(this, M, u.mat, u.vs, !1)
                    }
                }
            }, _99O: function (I, L, e, w, i, o) {
                if (e) {
                    var m = this,
                        u = m.gv,
                        s = m.data,
                        _ = u._buffer,
                        v = u._1O,
                        X = e.icons,
                        y = ts.for(I),
                        Z = y.directAttribs();
                    for (var Y in X) {
                        var P = X[Y],
                            n = e.rects[Y];
                        if (n && o(Dj(P.transparent, s, u))) {
                            u._picking && gm(I, w, i, s, Y);
                            var h = Dj(P.shape3d, s, u),
                                k = h ? [h] : Dj(P.names, s, u),
                                b = k ? k.length : 0,
                                c = Dj(P.textureScale, s, u) || 1,
                                A = Dj(P.light, s, u);
                            A == F && (A = h ? !0 : !1), Ll(I, L, Dj(P.blend, s, u), A, Dj(P.opacity, s, u), Dj(P.reverseFlip, s, u), Dj(P.reverseColor, s, u), Dj(P.reverseCull, s, u));
                            for (var N = 0; b > N; N++) {
                                var H = k[N],
                                    U = n[N];
                                if (yn(m, U.mat), h) pj(u, s, bf(m, h), m);
                                else {
                                    var x = ii(H);
                                    if (x) {
                                        var l = U.width * c,
                                            S = U.height * c;
                                        if (l >= 1 && S >= 1) {
                                            var T = Cr(l, S);
                                            qk(T, x, Dj(P.stretch, s, u), 0, 0, l, S, s, u), T.restore(), rg(I, xm, v), bi(I, L, v, Dj(P.discardSelectable, s, u), _.uv, Vj), Z.aPosition = bm(I, _.vs, U.vs, F), Z.aNormal = Sl(I, _.ns, Lh, F), ym(I, _.is, ar), os(I, 0, ar.length), Jf(I, L, v)
                                        }
                                    }
                                }
                                Gf(u)
                            }
                            ol(I, L)
                        }
                    }
                }
            }
        });
        var gf = function (B, d) {
            fi(gf, this, [B, d])
        };
        yc(gf, Wj, {
            _16O: function (I, $, d, Y, q, R, Q, j, F) {
                var o = this.data,
                    l = o.getFinalScale3d(),
                    S = Ep($, l, d, Y, j, F);
                if (o.hasOwnProperty("_anchor") || o.hasOwnProperty("_anchorElevation")) {
                    var f = o.getAnchor3d();
                    S[0] -= (f.x - .5) * l[0], S[1] -= (f.y - .5) * l[1], S[2] -= (f.z - .5) * l[2]
                }
                return Te(kn(), S, o.p3(), Y, q, R, Q, I, o.getFinalRotation3d(), o.getRotationMode())
            }, clear: function () {
                var V = this;
                V.faceMat = V.mat = V.shapeModel = V.left = V.right = V.front = V.back = V.top = V.bottom = V.csg = F
            }, needValidate: function (N) {
                if (this._iv) return this._validateFrameId = N._renderInfo.frame, !0;
                if (this.s("autorotate") || this.s("shape3d.autorotate") || this.s("fixSizeOnScreen") || this.s("shape3d.fixSizeOnScreen") || this.s("hide.overlapping.group")) {
                    var s = N._renderInfo.frame;
                    if (this._validateFrameId !== s) return this._validateFrameId = s, !0
                }
                return !1
            }, validate: function (o, z) {
                var w = this,
                    k = w.gv,
                    _ = w.data,
                    Z = w.shapeName = w.s(Lm),
                    x = bf(w, Z);
                if (w._updateAutoRotation(), w._updateFixSize2d(), w._updateOverlapping(), w.dispatchBoundingBoxChanged(), this.s("autorotate") || this.s("shape3d.autorotate") || this.s("fixSizeOnScreen") || this.s("shape3d.fixSizeOnScreen")) {
                    var y = _.getRenderLayer(),
                        E = k._40Q.get(y);
                    E && E.ivWireframeBatch(_)
                }
                var m = sj(_, k.getMat(_), x ? w.s("shape3d.scaleable") : !0);
                if (_.appendAnchorMatrix3d(m), w.clear(), w.mat = _.mat = m, x || !Z)
                    if (w.shapeModel = x, o) {
                        var C = [];
                        x ? km(k, _, x, w, w.getBodyColor(), [m], o, C) : (Li(k, _, o, z, m, nq, C, Zc), Li(k, _, o, z, m, fm, C, Up), Li(k, _, o, z, m, $c, C, Ol), Li(k, _, o, z, m, Kd, C, Uk), Li(k, _, o, z, m, wg, C, Fp), Li(k, _, o, z, m, Qq, C, Be)), C.length && (gc(o.vs, C), gc(o.ns, Gb(C)))
                    } else x || (w._cubeUvs = null, w.vf(nq, 0), w.vf(fm, 16), w.vf(wg, 8), w.vf(Qq, 24), w.vf($c, 32), w.vf(Kd, 40))
            }, _updateAutoRotation: function () {
                var t = new gg,
                    Y = new br,
                    R = new tl,
                    A = new tl,
                    a = new tl;
                return function () {
                    var D = this,
                        q = D.data,
                        f = D.s("autorotate") || D.s("shape3d.autorotate");
                    if (!f) return q._dynamicRotation && delete q._dynamicRotation, void 0;
                    var s = D.gv;
                    a.copy(D.s("shape3d.autorotate.up") || s._up);
                    var m;
                    m = "string" == typeof f ? [f.indexOf("x") < 0 ? s._eye[0] : s._center[0], f.indexOf("y") < 0 ? s._eye[1] : s._center[1], f.indexOf("z") < 0 ? s._eye[2] : s._center[2]] : s._eye;
                    var L = s._center,
                        g = q.p3();
                    R.copy(g), A.set(m[0] - L[0], m[1] - L[1], m[2] - L[2]).add(R), Y.lookAt(A, R, a), t.set(0, 0, 0, q.getRotationMode(), !0).setFromRotationMatrix(Y);
                    var H = q._dynamicRotation;
                    H && Math.abs(H[0] - t.x) < 1e-5 && Math.abs(H[1] - t.y) < 1e-5 && Math.abs(H[2] - t.z) < 1e-5 || (q._dynamicRotation = [t.x, t.y, t.z])
                }
            }(),
            _updateFixSize2d: function () {
                var x = this,
                    X = x.data,
                    J = x.s("fixSizeOnScreen") || x.s("shape3d.fixSizeOnScreen");
                if (!J) return X._dynamicScale3d && delete X._dynamicScale3d, void 0;
                var n = x.gv,
                    U = sj(X, n.getMat(X)),
                    w = Td([0, 0, 0], U),
                    i = n.toViewPosition(w);
                if (!isNaN(i.x) && !isNaN(i.y)) {
                    var C = Td([1, 0, 0], U),
                        V = n.toViewPosition(C),
                        Y = Td([0, 1, 0], U),
                        e = n.toViewPosition(Y),
                        l = V.x - i.x,
                        Z = e.y - i.y;
                    if (l && Z) {
                        var q, p, d = X._dynamicScale3d || [1, 1, 1],
                            h = ii(X.s("shape3d.image"));
                        if (J[0] > 0 && (q = J[0]), J[1] > 0 && (p = J[1]), !q || !p) {
                            var O = J > 0 ? J : 1;
                            q || (q = (xc(h, X) || X.getWidth()) * O), p || (p = (oo(h, X) || X.getTall()) * O)
                        }
                        var A = Math.abs(l / q),
                            o = Math.abs(Z / p);
                        Math.abs(A - 1) < .001 && Math.abs(o - 1) < .001 || (X._dynamicScale3d = [d[0] / A, d[1] / o, d[2]])
                    }
                }
            }, _updateOverlapping: function () {
                var Q = this,
                    M = Q.s("hide.overlapping.group");
                if (!M) return Q._rectOverlapping && (Q._rectOverlapping = Z), void 0;
                var A, n, x, w = Q.gv,
                    k = Q.data,
                    H = sj(k, w.getMat(k)),
                    F = 1 / 0,
                    W = 1 / 0,
                    c = -1 / 0,
                    N = -1 / 0,
                    v = k.getAnchor3d(),
                    S = v.x,
                    e = v.y,
                    i = v.z;
                for (A = 0; 8 > A; A++) {
                    if (n = Td([(A >> 2) - S, (1 & A >> 1) - e, (1 & A) - i], H), x = w.toViewPosition(n), isNaN(x.x) || isNaN(x.y)) return;
                    F = Math.min(F, x.x), c = Math.max(c, x.x), W = Math.min(W, x.y), N = Math.max(N, x.y)
                }
                var L = {
                    x: F,
                    y: W,
                    w: c - F,
                    h: N - W
                };
                Q._rectOverlapping = w.overlappingBox.isOverlapping(M, L)
            }, getVectorDynamicSize: function () {
                var g, E = this,
                    a = E.s("shape3d"),
                    j = E.data;
                if ("billboard" === a || "plane" === a || (g = j._currentCubeElementId) != F) {
                    var y, V, w = E.gv,
                        c = sj(j, w.getMat(j)),
                        L = j.getAnchor3d(),
                        z = .5 - L.x,
                        K = .5 - L.y,
                        X = .5 - L.z,
                        x = Math.min(E.s("vector.dynamic.maxsize"), w._glCapabilities.maxTextureSize) / w.getDevicePixelRatio(),
                        n = function (Z, P) {
                            Z[0] += z, Z[1] += K, Z[2] += X, P[0] += z, P[1] += K, P[2] += X;
                            var J = w.toViewPosition(Td(Z, c)),
                                b = w.toViewPosition(Td(P, c)),
                                S = J.x - b.x,
                                D = J.y - b.y;
                            return Math.min(x, Math.sqrt(S * S + D * D))
                        };
                    if ("billboard" === a) y = n([-.5, 0, 0], [.5, 0, 0]), V = n([0, -.5, 0], [0, .5, 0]);
                    else if ("plane" === a) y = n([-.5, 0, 0], [.5, 0, 0]), V = n([0, 0, -.5], [0, 0, .5]);
                    else if (j._currentCubeElementId != F) {
                        var e = 3 * Lq[g + 1],
                            $ = 3 * Lq[g],
                            Y = 3 * Lq[g + 2];
                        y = n([Ef[e], Ef[e + 1], Ef[e + 2]], [Ef[Y], Ef[Y + 1], Ef[Y + 2]]), V = n([Ef[e], Ef[e + 1], Ef[e + 2]], [Ef[$], Ef[$ + 1], Ef[$ + 2]])
                    }
                    return [y, V]
                }
            }, vf: function (h, A) {
                var r = this;
                if (r.gv.getFaceVisible(r.data, h)) {
                    var S = _e(r, h);
                    S.mat && (r.faceMat = !0);
                    var O = S.uv;
                    if (O) {
                        var i = r._cubeUvs;
                        i || (i = r._cubeUvs = new fk([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0]));
                        for (var w = 0; 8 > w; w++) i[A + w] = O[w]
                    }
                    return S
                }
            }, _billboardInView: function () {
                var q = [-.5, -.5, 0, -.5, .5, 0, .5, -.5, 0, .5, .5, 0],
                    w = [-.5, 0, -.5, -.5, 0, .5, .5, 0, -.5, .5, 0, .5],
                    A = new Hi,
                    o = new tl,
                    J = new br;
                return function (Z) {
                    var O = this;
                    if (!O.mat) return !0;
                    var _ = O.gv.getFrustum(),
                        I = "billboard" === Z ? q : w;
                    A.makeEmpty(), J.fromArray(O.mat);
                    for (var v = 0, b = I.length; b > v; v += 3) A.expandByPoint(o.fromArray(I, v).applyMatrix4(J));
                    return _.intersectsBox(A)
                }
            }(),
            _80o: function (k, p, N) {
                var m = this;
                if (m._rectOverlapping) return !0;
                var E = m.shapeModel;
                if (E || !m.shapeName) {
                    var U = m.s("shape3d");
                    if (("billboard" === U || "plane" === U) && !m._billboardInView(U)) return !0;
                    var i = m.gv,
                        u = m.data,
                        V = i._cube,
                        O = ts.for(k),
                        j = O.directAttribs();
                    gk(i, m.mat), m.s("shape3d.reflector") && !k._picking || (E ? pj(i, u, E, m, m.getBodyColor(), N) : (j.aPosition = bm(k, V.vs, F, F), j.aNormal = bm(k, V.ns, F, F), eo(k, V.is), m._18O(k, p, "left", 0, N), m._18O(k, p, "front", 6, N), m._18O(k, p, "right", 12, N), m._18O(k, p, "back", 18, N), m._18O(k, p, "top", 24, N), m._18O(k, p, "bottom", 30, N))), Gf(i), m.faceMat && (m._18O(k, p, "left", 0, N, !0), m._18O(k, p, "front", 6, N, !0), m._18O(k, p, "right", 12, N, !0), m._18O(k, p, "back", 18, N, !0), m._18O(k, p, "top", 24, N, !0), m._18O(k, p, "bottom", 30, N, !0))
                }
            }, _18O: function (K, r, M, h, k, m) {
                var E = this[M];
                if (E) {
                    if (!k(E.transparent)) return;
                    if (m && !E.mat || !m && E.mat) return;
                    var n = this.data.s("polygonOffset");
                    n && Ik(K, n), m && gk(this.gv, E.mat);
                    var Q = this,
                        X = Q.data,
                        y = ts.for(K),
                        l = y.directUniforms();
                    X._currentCubeElementId = h;
                    var B = Q.gv,
                        o = B.getTexture(E.texture, X, M),
                        f = E.uv,
                        a = E.uvScale,
                        T = E.uvOffset,
                        N = E.discardSelectable;
                    o ? f ? bi(K, r, o, N, B._buffer.uv, Q._cubeUvs, T, a) : bi(K, r, o, N, B._cube.uv, F, T, a) : bi(K), Ll(K, r, E.blend, E.light, E.opacity, E.reverseFlip, E.reverseColor, E.reverseCull), l.uDiffuse = E.color || z["color.empty"], os(K, h, 6), ol(K, r), Jf(K, r, o), m && Gf(B), n && rd(K), X._currentCubeElementId = null
                }
            }, drawReflector: function () {
                var h = new tl,
                    f = new tl,
                    R = new gg,
                    A = new br,
                    G = new tl,
                    i = new tl,
                    C = new tl,
                    l = new tl,
                    P = new br,
                    Q = new br,
                    Y = new Io,
                    W = new ye,
                    E = new ye,
                    z = function ($, f, C) {
                        $[C] = f[0], $[C + 1] = f[1], $[C + 2] = f[2]
                    },
                    B = function (f, B) {
                        z(f, B.getEye(), 0), z(f, B.getCenter(), 3), z(f, B.getUp(), 6)
                    },
                    k = function (I, e) {
                        e._eye = [I[0], I[1], I[2]], e._center = [I[3], I[4], I[5]], e._up = [I[6], I[7], I[8]], e._18Q = F;
                        var k = e._skybox;
                        k && (k.p3([I[0], I[1], I[2]]), e.getData3dUI(k).iv())
                    };
                return function (j) {
                    var $ = this;
                    $._reflectorInfo = null;
                    var J = $.data;
                    if (J._reflecting) return !1;
                    var w = $.gv;
                    if (w._picking) return !1;
                    var z = $._reflectorRenderTarget,
                        H = w.getDevicePixelRatio(),
                        r = w.getWidth() * H,
                        x = w.getHeight() * H;
                    z ? z.setSize(j, r, x) : z = $._reflectorRenderTarget = new Eh.RenderTarget(w, j, r, x), h.copy(J.p3()), f.copy(w.getEye()), A.makeRotationFromEuler(R.set(J.r3(), J.getRotationMode(), !0));
                    var U;
                    if (!$._reflectNormal) {
                        var U = bf($, $.s("shape3d"));
                        if (!U) return !1;
                        if (!U.ns && U.length && (U = U[0]), !U.ns || !U.vs) return !1;
                        $._reflectNormal = [U.ns[0], U.ns[1], U.ns[2]], $._reflectorVbuffer = Cm.Buffer.createVertexBuffer(j, new Float32Array(U.vs))
                    }
                    if (G.copy($._reflectNormal), G.applyMatrix4(A), i.subVectors(h, f), i.dot(G) > 0) return !1;
                    i.reflect(G).negate(), i.add(h), C.copy(w.getCenter()).negate().add(h), C.reflect(G).negate(), C.add(h), l.copy(w.getUp()), l.reflect(G);
                    var I = [0, 0, 0, 0, 0, 0, 0, 0, 0];
                    B(I, w), w._eye = i.toArray(), w._center = C.toArray(), w._up = l.toArray(), w._18Q = F;
                    var g = w._skybox;
                    g && (g.p3(w._eye), w.getData3dUI(g).iv()), So(j, z.frame), j.viewport(0, 0, z.width, z.height);
                    var a = J.s("shape3d.reflector.background");
                    if (a) {
                        var D = j.getParameter(j.COLOR_CLEAR_VALUE);
                        qe(j, a)
                    } else j.clearColor(0, 0, 0, 1);
                    ts.for(j).glState.depth.mask = !0, j.clear(j.COLOR_BUFFER_BIT | j.DEPTH_BUFFER_BIT);
                    var O = Mc(w),
                        s = wp(w);
                    Y.setFromNormalAndCoplanarPoint(G, h), Y.applyMatrix4(Q.fromArray(s)), W.set(Y.normal.x, Y.normal.y, Y.normal.z, Y.constant), E.x = (Math.sign(W.x) + O[8]) / O[0], E.y = (Math.sign(W.y) + O[9]) / O[5], E.z = -1, E.w = (1 + O[10]) / O[14], W.multiplyScalar(2 / W.dot(E));
                    var y = J.s("shape3d.reflector.clip"),
                        X = y === Z ? .003 : y;
                    O[2] = W.x, O[6] = W.y, O[10] = W.z + 1 - X, O[14] = W.w;
                    var c = w._computedProjectMatrix;
                    w._computedProjectMatrix = O, J._reflecting = !0, w.renderScene(), w._computedProjectMatrix = c, P.set(.5, 0, 0, .5, 0, .5, 0, .5, 0, 0, .5, .5, 0, 0, 0, 1), P.multiply(Q.fromArray(w._projectMatrix)), P.multiply(Q.fromArray(w._viewMatrix)), a && qe(j, D), Ar(j), k(I, w);
                    var u = J.s("shape3d.reflector.blur");
                    if (u) {
                        var q = w.getPostProcessingModule("Blur");
                        q && q.drawImpl(j, z, u, J.s("shape3d.reflector.blur.ratio"))
                    }
                    var S = j._compiledShader.reflector;
                    S || (S = j._compiledShader.reflector = new Cm.Shader(j, Gc.Reflector.vs, Gc.Reflector.fs)), S.bind(), j.activeTexture(j.TEXTURE0), an(j, z.texture), S.uniforms.tDiffuse = 0, S.uniforms.color = ns(J.s("shape3d.reflector.color") || "rgb(128,128,128)"), S.uniforms.textureMatrix = P.toArray(), S.uniforms.modelMatrix = sj(J), S.uniforms.viewMatrix = wp(w), S.uniforms.projectionMatrix = Mc(w), $._reflectorVbuffer.upload(), S.attributes.pos.pointer($._reflectorVbuffer);
                    var e = this.s("shape3d.transparent");
                    if (e) {
                        var n = ts.for(j).glState,
                            V = n.depth.mask;
                        n.depth.mask = !1
                    }
                    return j.drawArrays(j.TRIANGLES, 0, 6), e && (n.depth.mask = V), J._reflecting = !1, j.useProgram(w._prg), an(j, F), !0
                }
            }()
        }), Gc.Reflector = {
            vs: ["attribute vec3 pos;", "uniform mat4 textureMatrix;", "uniform mat4 modelMatrix;", "uniform mat4 viewMatrix;", "uniform mat4 projectionMatrix;", "varying vec4 vUv;", "void main() {", "	vUv = textureMatrix * modelMatrix * vec4( pos, 1.0 );", "	gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4( pos, 1.0 );", "}"].join("\n"),
            fs: ["precision highp float;", "uniform vec3 color;", "uniform sampler2D tDiffuse;", "varying vec4 vUv;", "float blendOverlay( float base, float blend ) {", "	return( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );", "}", "vec3 blendOverlay( vec3 base, vec3 blend ) {", "	return vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );", "}", "void main() {", "	vec4 base = texture2DProj( tDiffuse, vUv );", "   vec2 tUv = vUv.xy / vUv.w;", "   if (tUv.x < .0 || tUv.y < .0 || tUv.x > 1. || tUv.y > 1.) discard;", "	gl_FragColor = vec4( blendOverlay( base.rgb, color ), base.a );", "}"].join("\n")
        };
        var rs = function (V, f) {
            fi(rs, this, [V, f])
        };
        yc(rs, gf, {
            _80o: function () { }
        });
        var Ip = function (D, _) {
            fi(Ip, this, [D, _])
        };
        yc(Ip, Wj, {
            _25Q: 1,
            validate: function (Q) {
                var k = this;
                if (!k.s("geometry.cache") || !k.info) {
                    var b = k.gv,
                        X = k.data,
                        g = k.s,
                        E = g("edge.width"),
                        L = X._40I,
                        J = X._41I;
                    if (k.shapeModel = k.info = F, L && J) {
                        var B, Z, I, x, _, t, R, p, o, c, O = X.isLooped(),
                            K = g(ej),
                            S = u.getEdgeType(K);
                        if (S) {
                            var G = S(X, Ml(k, b, X, O, K), b, k._19Q);
                            if (!G.points || G.points.isEmpty()) return;
                            t = k.info = {}, R = G.segments, _ = G.points, p = _.size();
                            for (var s = L.getElevation(), N = J.getElevation(), C = 0; p > C; C++) {
                                var q = _.get(C);
                                q.e == F && (q.e = s + (N - s) * C / (p - 1))
                            }
                            o = bk(_.get(0)), c = bk(_.get(p - 1));
                            var v = p % 2;
                            0 === v ? (t.c1 = bk(_.get(p / 2 - 1)), t.c2 = bk(_.get(p / 2))) : t.p3 = bk(_.get((p - v) / 2)), t.s1 = o, t.s2 = bk(_.get(1)), t.t1 = bk(_.get(p - 2)), t.t2 = c
                        } else {
                            _ = new xr, t = k.info = {};
                            var $ = g("edge.offset"),
                                W = g("edge.center"),
                                h = g("edge.source.t3"),
                                T = g("edge.target.t3"),
                                H = Hb(b, X, "source"),
                                U = Hb(b, X, "target");
                            if (!H || !U) return b.invalidateData(X), delete k.info, !1;
                            if (h && (H[0] += h[0], H[1] += h[1], H[2] += h[2]), T && (U[0] += T[0], U[1] += T[1], U[2] += T[2]), K === _b) {
                                R = g("edge.segments");
                                var e = t.points = g(Ei) || Yh;
                                if (p = e.size()) {
                                    o = bk(e.get(0)), c = bk(e.get(p - 1)), !W && $ && (I = fn(o, H, !0), $ = V($, En(H, o)), H = [H[0] + I[0] * $, H[1] + I[1] * $, H[2] + I[2] * $], I = fn(U, c, !0), $ = V($, En(c, U)), U = [U[0] - I[0] * $, U[1] - I[1] * $, U[2] - I[2] * $]);
                                    var v = p % 2;
                                    0 === v ? (B = bk(e.get(p / 2 - 1)), Z = bk(e.get(p / 2))) : t.p3 = bk(e.get((p - v) / 2)), t.s1 = H, t.s2 = o, t.t1 = c, t.t2 = U
                                } else !W && $ && (I = fn(U, H, !0), x = En(H, U), $ = cr($, x), H = [H[0] + I[0] * $, H[1] + I[1] * $, H[2] + I[2] * $], U = [U[0] - I[0] * $, U[1] - I[1] * $, U[2] - I[2] * $]), B = H, Z = U;
                                _.add({
                                    x: H[0],
                                    y: H[2],
                                    e: H[1]
                                }), _.addAll(e), _.add({
                                    x: U[0],
                                    y: U[2],
                                    e: U[1]
                                })
                            } else {
                                var l = Ml(k, b, X, O, K);
                                if (k._19Q || (l = -l), O) {
                                    var d = H[0],
                                        m = H[1],
                                        A = H[2],
                                        r = L.getTall() / 2 + l;
                                    B = [d - l, m + r, A], Z = [d + l, m + r, A], _.add({
                                        x: d - l,
                                        y: A,
                                        e: m
                                    }), _.add({
                                        x: d - l,
                                        y: A,
                                        e: m + r
                                    }), _.add({
                                        x: d + l,
                                        y: A,
                                        e: m + r
                                    }), _.add({
                                        x: d + l,
                                        y: A,
                                        e: m
                                    })
                                } else {
                                    I = fn(U, H, !0), x = En(H, U);
                                    var M = {
                                        x: H[0],
                                        y: H[2]
                                    },
                                        z = {
                                            x: U[0],
                                            y: U[2]
                                        },
                                        D = pc(F, M, z, l),
                                        w = D.x - M.x,
                                        f = D.y - M.y;
                                    $ = cr($, x), I[0] *= $, I[1] *= $, I[2] *= $, B = [H[0] + I[0] + w, H[1] + I[1], H[2] + I[2] + f], Z = [U[0] - I[0] + w, U[1] - I[1], U[2] - I[2] + f], W ? (_.add({
                                        x: H[0],
                                        y: H[2],
                                        e: H[1]
                                    }), _.add({
                                        x: B[0],
                                        y: B[2],
                                        e: B[1]
                                    }), _.add({
                                        x: Z[0],
                                        y: Z[2],
                                        e: Z[1]
                                    }), _.add({
                                        x: U[0],
                                        y: U[2],
                                        e: U[1]
                                    })) : (_.add({
                                        x: B[0],
                                        y: B[2],
                                        e: B[1]
                                    }), _.add({
                                        x: Z[0],
                                        y: Z[2],
                                        e: Z[1]
                                    }))
                                }
                            }
                            t.c1 = B, t.c2 = Z
                        }
                        t._lastPointsSegments = {
                            points: _,
                            segments: R
                        }, t.list = g(Lm) === xk ? k.createTubeModel(_, R, E / 2, Q) : k.createLineModel(_, R, E, "edge", "edge.dash")
                    }
                }
            }, invalidateCachedGeometry: function () {
                this.info = F
            }
        });
        var Vp = function (v, d) {
            fi(Vp, this, [v, d]), this._needRecoverPosition = !0
        };
        yc(Vp, gf, {
            _80o: function (J, u, $) {
                var y = this,
                    B = y.gv,
                    H = y.shapeModel;
                gk(B, y.mat), H ? pj(B, y.data, H, y, y.getBodyColor(), $) : (io(y, J, u, "left", $), io(y, J, u, "front", $), io(y, J, u, "right", $), io(y, J, u, "back", $), io(y, J, u, "top", $), io(y, J, u, "bottom", $)), Gf(B)
            }, validate: function (l, f) {
                var m, M, v = this,
                    G = v.s,
                    y = v.data,
                    t = (y.p3(), y._thickness / 2),
                    Y = y.isClosePath(),
                    r = y.getPoints(),
                    Q = y.getSegments(),
                    C = G(cp),
                    o = l && l.uv;
                if (v.clear(), v.dispatchBoundingBoxChanged(), 0 > t) {
                    try {
                        M = v.shapeModel = wf(r, Q, G(Je), G(Ho), C, G(Sn), y.getTall(), y.getShapeElevation(), Y)
                    } catch (D) {
                        M = v.shapeModel = {}
                    }
                    G(lm) ? G("shape3d.image") || delete M.uv : (delete M.vs, delete M.ns, delete M.uv), G("shape3d.top.image") || delete M.top_uv, G("shape3d.bottom.image") || delete M.bottom_uv
                } else if (G(Lm) === xk) m = Yo(r, Q, C, Y), M = v.shapeModel = {
                    vs: []
                }, G("shape3d.image") && (M.uv = [], M.sum = G(Sn) || tj(m) || 1, M.len = 0), G(Je) && !Y && (M.top_vs = [], G("shape3d.top.image") && (M.top_uv = [])), G(Ho) && !Y && (M.bottom_vs = [], G("shape3d.bottom.image") && (M.bottom_uv = [])), v._12O(m, t);
                else {
                    var W, $, T, V, w, P, A, _, L, R;
                    if (m = Yo(r, Q, C, Y), w = v.vf(wg, o, !1, f), t && (P = v.vf(Qq, o, !1, f), A = Y ? F : v.vf(nq, o, !1, f), _ = Y ? F : v.vf(fm, o, !1, f), L = v.vf($c, o, !1, f), R = v.vf(Kd, o, !1, f)), t) {
                        for (var u = 0, X = m.length; X > u; u++) m[u] = v._tryRemoveBezierPoints(m[u], t);
                        v._12O(m, t)
                    } else w && m.forEach(function (y) {
                        if (V = y.length, V > 0)
                            for (W = y[0], T = 1; V > T; T++) $ = y[T], v.addV(w.vs, W, $), W = $
                    });
                    v._20Q(m), l || (w && (w.ns = Gb(w.vs), ed(w, "vs"), ed(w, ih)), t && (P && (P.ns = Gb(P.vs), ed(P, "vs"), ed(P, ih)), A && (A.ns = Gb(A.vs), ed(A, "vs"), ed(A, ih)), _ && (_.ns = Gb(_.vs), ed(_, "vs"), ed(_, ih)), L && (L.ns = Gb(L.vs), ed(L, "vs"), ed(L, ih)), R && (R.ns = Gb(R.vs), ed(R, "vs"), ed(R, ih))))
                }
                var z = v.mat = y.getPointsMatrix3d().getElements();
                l && (Mp(v, z, l, M), v.clear())
            }, _20Q: function (G) {
                var P, i, l, x, o, y, e, S = this,
                    r = S.front,
                    Y = S.back,
                    u = S.top,
                    V = S.bottom,
                    M = r ? r.tuv : F,
                    h = Y ? Y.tuv : F,
                    s = u ? u.tuv : F,
                    c = V ? V.tuv : F,
                    Z = 0;
                (M || h || s || c) && (P = S.s(Sn) || tj(G) || 1, G.forEach(function (h) {
                    if (i = h.length, i > 0)
                        for (y = h[0], l = 1; i > l; l++) e = h[l], x = Z / P, Z += En(y, e), o = Z / P, S._14O(r, x, o), S._14O(Y, 1 - o, 1 - x), S._14O(u, x, o), S._14O(V, x, o), y = e
                }))
            }, _14O: function (L, x, o) {
                if (L) {
                    var n = L.uv,
                        O = L.tuv;
                    if (O) {
                        if (n) var t = n[0] + (n[6] - n[0]) * x,
                            p = n[1] + (n[7] - n[1]) * x,
                            R = n[2] + (n[4] - n[2]) * x,
                            E = n[3] + (n[5] - n[3]) * x,
                            e = n[2] + (n[4] - n[2]) * o,
                            b = n[3] + (n[5] - n[3]) * o,
                            c = n[0] + (n[6] - n[0]) * o,
                            B = n[1] + (n[7] - n[1]) * o;
                        else t = x, p = 0, R = x, E = 1, e = o, b = 1, c = o, B = 0;
                        O.push(R, E, e, b, c, B, c, B, t, p, R, E)
                    }
                }
            }, _13O: function ($) {
                var s = $.uv,
                    T = $.tuv;
                T && (s ? T.push(s[2], s[3], s[4], s[5], s[6], s[7], s[6], s[7], s[0], s[1], s[2], s[3]) : T.push(0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1))
            }, _tryRemoveBezierPoints: function (y, U) {
                var R = y.length;
                if (4 > R) return y;
                var X, s, C, w, A, O, n = !1,
                    Z = function (u) {
                        return y[u]
                    },
                    Q = function (l) {
                        return y[R - 1 - l]
                    };
                for (A = 0; 1 >= A; A++)
                    for (O = A ? Q : Z, s = O(0), C = O(1), X = 2; R - 1 > X; X++)
                        if (w = O(X), !w.remove)
                            if (w.b) {
                                var m = pc(s, C, w, U);
                                m.adjust ? (w.remove = !0, n = !0) : (s = C, C = w)
                            } else s = C, C = w;
                if (!n) return y;
                var c = [];
                for (X = 0; R > X; X++) y[X].remove || c.push(y[X]);
                return c
            }, _12O: function (V, r) {
                var O, $, l, A, h, w = this.s("shape3d.point.epsilon"),
                    I = this;
                V.forEach(function (U) {
                    if (h = U.length, h > 0)
                        for (O = {
                            p: U[0],
                            n: !0
                        }, A = 1; h > A; A++) $ = U[A], l = h - 1 > A ? U[A + 1] : F, l && Math.abs($.x - l.x) < w && Math.abs($.y - l.y) < w || I.addPoint(O, $, l, r, U)
                })
            }, addPoint: function (r, T, b, $, B) {
                var C, H, Q, h, s, u, N, d, K, e = this,
                    E = r.p,
                    Z = r.f,
                    v = r.b,
                    U = e.s("shape3d.side") || rr,
                    q = e.s("shape3d.start.angle"),
                    V = e.s("shape3d.sweep.angle"),
                    m = e.shapeModel,
                    X = e.data.isClosePath();
                if (r.n && (r.n = !1, Z = X && B.length > 2 ? pc(B[B.length - 2], E, T, $) : pc(F, E, T, $), v = $l(E, Z), m ? m.top_vs && e._10O(v, Z, U, q, V, m.top_vs, m.top_uv) : (C = e.left) && (e.addV(C.vs, v, Z), e._13O(C))), H = b ? pc(E, T, b, $) : X && B.length > 2 ? pc(E, T, B[1], $) : pc(E, T, F, $), Q = $l(T, H), m) {
                    var Y, a, _ = m.vs,
                        n = m.uv,
                        k = m.sum;
                    for (n && (Y = m.len / k, m.len += En(E, T), a = m.len / k), u = e._9O(v, Z, U, q, V), N = e._9O(Q, H, U, q, V), d = 0; U > d; d++) K = d + 1, gc(_, u[K]), gc(_, N[d]), gc(_, u[d]), gc(_, N[d]), gc(_, u[K]), gc(_, N[K]), n && (h = d / U, s = K / U, n.push(Y, s, a, h, Y, h, a, h, Y, s, a, s));
                    !b && m.bottom_vs && e._10O(Q, H, U, q, V, m.bottom_vs, m.bottom_uv, !0)
                } else !b && (C = e.right) && (e.addV(C.vs, H, Q), e._13O(C)), (C = e.front) && e.addV(C.vs, Z, H), (C = e.back) && e.addV(C.vs, Q, v), (C = e.top) && e.addH(C.vs, Z, H, Q, v, !0), (C = e.bottom) && e.addH(C.vs, v, Q, H, Z);
                r.p = T, r.f = H, r.b = Q
            }, _10O: function (D, B, z, m, d, l, q, U) {
                var i, a, T = this,
                    C = T.data,
                    P = T._9O(D, B, z, m, d),
                    u = (D.x + B.x) / 2,
                    e = (D.y + B.y) / 2,
                    Y = C.getShapeElevation(),
                    r = 0;
                for (r = 0; z > r; r++) U ? (gc(l, P[r]), gc(l, P[r + 1])) : (gc(l, P[r + 1]), gc(l, P[r])), gc(l, [u, Y, e]), q && (U ? (i = $ * (r + 1) / z + m, a = $ * r / z + m) : (i = $ * r / z + m, a = $ * (r + 1) / z + m), q.push(.5 - .5 * k(a), .5 - .5 * n(a), .5 - .5 * k(i), .5 - .5 * n(i), .5, .5))
            }, _9O: function (r, l, t, D, C) {
                var W, u, s = this,
                    K = s.data,
                    p = [],
                    j = (r.x + l.x) / 2,
                    i = (r.y + l.y) / 2,
                    O = K.getTall() / 2,
                    e = K.getShapeElevation(),
                    J = 0;
                for (C == F && (C = $); t >= J; J++) W = C * J / t + D, u = k(W), p.push([j + (r.x - j) * u, e + O * n(W), i + (r.y - i) * u]);
                return p
            }, addV: function (b, B, x) {
                var c = B.x,
                    p = B.y,
                    R = x.x,
                    T = x.y,
                    m = this.data,
                    t = m.getShapeElevation(),
                    F = m.getTall() / 2;
                b.push(c, t - F, p, R, t - F, T, R, t + F, T, R, t + F, T, c, t + F, p, c, t - F, p)
            }, addH: function (A, R, U, b, c, p) {
                var m = this.data,
                    H = m.getTall() / 2,
                    W = m.getShapeElevation() + (p ? H : -H);
                A.push(R.x, W, R.y, U.x, W, U.y, b.x, W, b.y, b.x, W, b.y, c.x, W, c.y, R.x, W, R.y)
            }, vf: function (S, _, o, H) {
                var k, g = this,
                    U = g.gv.getFaceVisible(g.data, S);
                return (o || U) && (k = _e(g, S, H), k.vs = [], k.tuv = U && (k.texture || _) ? [] : F, k.visible = U), k
            }
        });
        var hs, jf, Co = function (Z, n) {
            fi(Co, this, [Z, n])
        };
        yc(Co, gf, {
            validate: function () {
                var s = this,
                    V = s.gv,
                    M = s.data,
                    r = s.s,
                    I = ns(r("points.color"));
                I = [I[0], I[1], I[2]];
                var C = r("points.size"),
                    f = r("points.image") || "rect";
                ("rect" === f || "circle" === f) && ("rect" === f ? (hs || (hs = s._createCachedImage(f)), f = hs) : (jf || (jf = s._createCachedImage(f)), f = jf));
                var i = r("points.model");
                if (i) {
                    if (s._lastShapeModel !== i || !s.shapeModel) {
                        var G = bf(s, i);
                        if (!G) return;
                        var h = [],
                            P = {};
                        s.eachShapeModel(function (t) {
                            for (var d = 0, S = t.length; S > d; d += 3) {
                                var o = t[d],
                                    $ = t[d + 1],
                                    D = t[d + 2],
                                    Z = "" + o + "_" + $ + "_" + D;
                                P[Z] || (P[Z] = !0, h.push(o, $, D))
                            }
                        }, G), s.shapeModel = {
                            vs: new fk(h)
                        }, M._pointsDirty = !0, s._lastShapeModel = i
                    }
                } else {
                    var b = M.points,
                        u = b.length,
                        U = u / 3;
                    if (M._pointsDirty || !s.shapeModel) {
                        var R = new fk(b);
                        s.shapeModel = {
                            vs: R
                        }, M._pointsDirty = !1, s._lastShapeModel = null
                    }
                } if (s.info = {
                    mat: sj(M),
                    size: C,
                    diffuse: I,
                    opacity: r("points.opacity"),
                    texture: f,
                    alphaTest: r("points.transparent") ? 0 : r("alphaTest")
                }, M._colorsDirty) {
                    for (var q, X, c, v = [], x = !1, S = M.colors, $ = 0; u > $; $ += 3) q = S[$], X = S[$ + 1], c = S[$ + 2], q === Z || X === Z || c === Z ? v.push(I[0], I[1], I[2]) : (x = !0, v.push(q, X, c));
                    s.shapeModel.cs = x ? new fk(v) : null, M._colorsDirty = !1
                }
                if (M._sizesDirty) {
                    for (var Y = [], n = !1, N = M.sizes, $ = 0; U > $; $++) N[$] ? (Y.push(N[$]), n = !0) : Y.push(C);
                    s.shapeModel.ss = n ? new fk(Y) : null, M._sizesDirty = !1
                }
                if (s._lastPointNumber !== U) {
                    var _ = V.pickColorMap,
                        H = _._pickIdUsed;
                    _._pickIdUsed = H + U;
                    for (var J = [], $ = 0; U > $; $++) {
                        var p = H + $,
                            D = rl(p);
                        J.push(D[0], D[1], D[2], D[3]), _[p] || (_[p] = {
                            data: M,
                            part: $
                        })
                    }
                    s.shapeModel.ps = new fk(J), s._lastPointNumber = U
                }
                this.dispatchBoundingBoxChanged()
            }, _createCachedImage: function (N) {
                var W = 128,
                    K = uo(),
                    z = K.getContext("2d");
                Bn(K, W, W, 1), Yd(z, {
                    width: W,
                    height: W,
                    comps: [{
                        type: N,
                        background: "white",
                        borderWidth: 0,
                        rect: [0, 0, W, W]
                    }]
                }, 0, 0, W, W);
                var h = O.Math.generateUUID();
                return Oe[h] = K, h
            }, _80o: function (M, d) {
                var f = this,
                    L = f.gv,
                    b = f.shapeModel,
                    W = f.info;
                if (b && b.vs && b.vs.length) {
                    var o = ts.for(M);
                    o.useProgram(f._asureProgram(M)), o.directState();
                    var m = o.directUniforms(),
                        h = o.directAttribs();
                    m.modelMatrix = W.mat, m.modelViewMatrix = xo([], L._viewMatrix, W.mat), m.projectionMatrix = L._projectMatrix, m.viewMatrix = L._viewMatrix, m.scale = L.getHeight() / 2, m.size = W.size, m.diffuse = W.diffuse, m.opacity = W.opacity, m.map = L.getTexture(W.texture, f.data), m.alphaTest = W.alphaTest, m.resolution = L.getDevicePixelRatio(), h.position = Sl(M, L._buffer.vs, b.vs, F), L._picking ? (m.picking = !0, h.pickColor = Sl(M, L._buffer.ps, b.ps, F), m.useColor = !1, h.color = null) : (m.picking = !1, h.pickColor = null, b.cs ? (m.useColor = !0, h.color = Sl(M, L._buffer.cs, b.cs, F)) : (m.useColor = !1, h.color = null)), b.ss ? (m.useSizeArray = !0, h.sizeArray = Sl(M, L._buffer.ss, b.ss, F)) : (m.useSizeArray = !1, h.sizeArray = null), ie(M, 0, b.vs.length / 3, M.POINTS), o.useProgram(d)
                }
            }, _asureProgram: function (b) {
                return b._pointsShader || (b._pointsShader = this.gv._postProcessing.createShader(b, Co.shaderSrc)), b._pointsShader.program
            }
        }), Co.shaderSrc = "!!~v!oj<g*p!s{n/!onpbjuu5j!tnppQewfnm!N.b!u0s!jfym<bd!tv!o)j!g>p+s!nf!{njbTuu5o!jnppQe`fmmhW!j*f!xfNwbjuusdjfyq<ts!fvQotjjg!p)s!ng!jn!bu<5*!!q1s/p2k!f.d!u>j>p!o^N!b4u!s]j^y!<3!!]vyojjsgupbsNno!pnjbuud5f!kwpjsfqx!N)b!u>s!jfyw<ju!dvfoqjtgspfsQnt!jg!mmppbpuc!!tdbm~f!<<o!pbjuuuvsmjpctvfusf!!+w!ffd{4j!tq!p>t!jfu{jjpTou<ojp!Qv`omjhg!ps|n!!fctpmpfm!!~v!tf<Doppmjpusv<mp!tbfusu!s+j!czvbusfs!Bwff{dj4t!!d>p!mfp{sj<Tu!owjbpsQz`jmohh!!w|f!d*5z!bwsDspBmfp{sj<Tft!vv)o!jggjp!sn<!ocppjpumj!tqpjQdwlnj!o+h!<yj!sbuubuNsojpcjvuudff!kwpfsdq5!!>q!jodpljDupjmtppsQ<`mh!!vo<jogppjsunj!tgpmQpwbnu!!+t!jy{jfs<ub!NvxofjjgWpmsfne!pgnm!p>b!uo!psjfutjptmpvQuwjnp!o<<*!!v1o/j2g!p-senf!ncspppgmt!ovbtsfuT!j){5fdBfsws!b>z!<op!jbuujutspjQcwvnu!f5!dgfmwp!bu<!*t!jo{pfjBusjstbpzq<!)4!dcfpwp!m>!!jetfQnfssptgqtfodbusjuw!f4Ndbfuws!jy~)!!n<b*u15/!2n!!-*s!p|mp!ds)f5udvfswo!!>n!]s!p3m!p^D]w!!4!|^!!*>s>p!m.p!D2f/t1v<)!!g~j!f!twmpfj!e!~n!bj<os)p*m!p|Dl!djjgq!!)>q!jsdplmjpoDhw*!!|^#!!~qs~f!dj<tsjppmop!Difjthvigqg!jgem!p>b!us<pm!p$DehfbgsjGo`fm!hV!TF|`!NfBtQmf!!v~o!jg<psspnm!pwDfwd!4>!!esjpgmgpvDthfb<sG!`vmohj!gp<sens!bgdmtpjbeu!!*p1q/b1d!j>u>z!<b/!svpomjpgDpfstnv!gggmjpeb)u!!gbjm!qi|b!U*fhtouj<ldj!qv)o!jggjp!sn<!ecspbpdmt!jvet!f*DuptmfpUsb<iq!mwbb!s=z!jbo/hs!pwmfpdD5f!twvDgpgmjpes)<!gj!!vogjjgeposfn$!!cp~p!m!<q*j!delsjpophD<uo!jvpoQj`gmphs!n-!qcbpnp!m)!Ee3jftsdvbusyefTuf!m>f+d!usbpcmmpfD<ftvg$gjjge!!ef|g!j*offmec)b!uVdTfFm`fNTBeQs!b*dt!jveoaj!g}p}s!nh!otjblndqjmqfas)3!Eg!jn!bq*<!Q$BfNo`eFjTgV!)wepfjoej!gnfbej!og)j*$!!|~!!wf<d*5!!zeujjgdgbvqtpf!D-pfmtpvsg<gj!ej!g)!5)dafqwj!d>l!jsophm!p%D%f!tvvtgfgDjpem!ps|*!!f|tm!fe!j~g!gv<t*f!Dzpumjpdsb!q>p!!w-f{dz5y)/!swpDmp";
        var Ds = function (i, D) {
            fi(Ds, this, [i, D]), this._needRecoverPosition = !0
        };
        yc(Ds, Wj, {
            _25Q: 1,
            validate: function (M) {
                var w = this,
                    k = w.data,
                    c = w.s,
                    h = k.getPoints(),
                    Q = h.size();
                w.dispatchBoundingBoxChanged();
                var P = k.p3(),
                    v = w.mat = kn();
                bo(v, P), Cl(v, k.getFinalRotation3d(), k.getRotationMode());
                var L = k.getScale3d(),
                    $ = k._dynamicScale3d;
                if ($ && (L[0] *= $[0], L[1] *= $[1], L[2] *= $[2]), Bd(v, L), bo(v, Cj(P)), (!w.s("geometry.cache") || !w.shapeModel) && (w.shapeModel = w.info = F, Q > 1)) {
                    var t = w.info = {},
                        _ = k.getSegments(),
                        s = k.getThickness(),
                        g = bk(h.get(0)),
                        r = bk(h.get(Q - 1)),
                        u = Q % 2;
                    0 === u ? (t.c1 = bk(h.get(Q / 2 - 1)), t.c2 = bk(h.get(Q / 2))) : t.p3 = bk(h.get((Q - u) / 2)), t.s1 = g, t.s2 = bk(h.get(1)), t.t1 = bk(h.get(Q - 2)), t.t2 = r, t.list = c(Lm) === xk ? w.createTubeModel(h, _, s / 2, M) : w.createLineModel(h, _, s, "shape.border", "shape.dash")
                }
            }, invalidateCachedGeometry: function () {
                this.shapeModel = this.info = F
            }, _80o: function (d, $, C) {
                var h = this,
                    e = h.shapeModel;
                if (e) {
                    var a = h.gv;
                    gk(a, h.mat), pj(a, h.data, e, h, h.getBodyColor(), C), Gf(a)
                }
            }
        });
        var Es = O.graph3d.VR = function (G) {
            var B = this;
            B.gv = G, B._controllers = [], B.switch = new Gs(B), B._enable = !1, B._defaultCallLater = O.Default.callLater, B._defaultCancelLater = td, "undefined" != typeof x && "VRFrameData" in x && (B._frameData = new x.VRFrameData), B.measureOflength = 1, B.eyesOffset = [0, 0, 0], B._orientation = new Rc.Quaternion, B._lastHeadPose = [0, 0, 0], B._offsetToBeAdd = [0, 0, 0], B._originalOrientation = null, B._fpsInfo = {
                time: 0,
                fps: 0,
                frames: 0
            }
        };
        yc(Es, o, {
            ms_fire: !0,
            setOriginalYRotation: function (n) {
                var B = this;
                if (null == n) return B._originalOrientation = null, void 0;
                var i = new Rc.Vector3(0, 1, 0),
                    P = (new Rc.Quaternion).setFromAxisAngle(i, -n),
                    F = (new Rc.Matrix4).makeRotationFromQuaternion(P);
                return P.setFromAxisAngle(i, n), B._originalOrientation = {
                    quaternion: P,
                    matrixInverse: F
                }, !0
            }, render: function (F, n, W) {
                var c = this,
                    E = c.gv;
                if (c._deviceInAction) {
                    var j = c._device;
                    if (j) {
                        var v = c._measureOflength;
                        j.depthNear = E.getNear() * v, j.depthFar = E.getFar() * v;
                        var i = c._offsetToBeAdd;
                        if (c.eyesOffset[0] += i[0], c.eyesOffset[1] += i[1], c.eyesOffset[2] += i[2], i[0] = 0, i[1] = 0, i[2] = 0, j.isPresenting === !1) return c._controllers.forEach(function (r) {
                            r && r.update()
                        }), E.iv(), !1;
                        var U = c._frameData;
                        j.getFrameData(U);
                        var m = U.pose.position;
                        if (m) {
                            var r = c.toViewPosition(m);
                            E.setEye(r), c._orientation.fromArray(U.pose.orientation), c._originalOrientation && c._orientation.premultiply(c._originalOrientation.quaternion);
                            var S = new Rc.Vector3(0, 0, -10 * c._scaleFactor);
                            S.applyQuaternion(c._orientation), E.setCenter([r[0] + S.x, r[1] + S.y, r[2] + S.z])
                        }
                        c._controllers.forEach(function (M) {
                            M && M.update()
                        }), E.setViewport(F, 0, 0, n / 2, W), c._viewMatrix = c._copyViewMatrix(U.leftViewMatrix), c._projectMatrix = c._copyProjectMatrix(U.leftProjectionMatrix), E.updateScene(), E.renderScene(), E.setViewport(F, n / 2, 0, n / 2, W), c._viewMatrix = c._copyViewMatrix(U.rightViewMatrix), c._projectMatrix = c._copyProjectMatrix(U.rightProjectionMatrix), E.updateScene(), E.renderScene(), c._lastViewMatrix = c._viewMatrix, c._lastProjectMatrix = c._projectMatrix, c._viewMatrix = null, c._projectMatrix = null, c.submitFrame();
                        var Y = Date.now(),
                            x = c._fpsInfo;
                        return Y - x.time > 1e3 ? (x.fps = Math.round(1e3 * (x.frames + 1) / (Y - x.time)), x.time = Y, x.frames = 0) : x.frames++, !0
                    }
                }
            }, onVRDisplayPresentChange: function () {
                var h = this.isPresenting();
                this._injectGraphView(h), this.fp("present", !h, h)
            }, getOrientation: function () {
                return this._orientation
            }, addController: function (i) {
                i = i || 0;
                var g = this,
                    s = g.getController(i);
                return s ? s : (s = new Fs(g, i), g._controllers.push(s), s)
            }, getController: function (K) {
                K = K || 0;
                for (var I = this._controllers, x = 0, C = I.length; C > x; x++)
                    if (I[x] && I[x].id === K) return I[x];
                return null
            }, removeController: function (x) {
                x = x || 0;
                for (var d = this._controllers, H = 0, q = d.length; q > H; H++)
                    if (d[H] && d[H].id === x) return d.splice(H, 1), !0;
                return !1
            }, getLastHeadPose: function () {
                return this._lastHeadPose
            }, toViewPosition: function (z, j) {
                var S = this,
                    _ = S._scaleFactor,
                    s = S._eyesOffset,
                    t = S._lastHeadPose;
                if (S._originalOrientation) {
                    var c = S._originalOrientation.quaternion,
                        V = new Rc.Vector3(z);
                    V.applyQuaternion(c).multiplyScalar(_).toArray(t)
                } else t[0] = z[0] * _, t[1] = z[1] * _, t[2] = z[2] * _;
                return j ? (j[0] = t[0] + s[0], j[1] = t[1] + s[1], j[2] = t[2] + s[2], j) : [t[0] + s[0], t[1] + s[1], t[2] + s[2]]
            }, addEyesOffset: function (x, P, A) {
                var Z = this._offsetToBeAdd;
                Z[0] += x, Z[1] += P, Z[2] += A
            }, _copyViewMatrix: function (U) {
                var d = this,
                    s = d.dup(U);
                if (d._originalOrientation) {
                    var w = (new Rc.Matrix4).fromArray(s);
                    w.multiply(d._originalOrientation.matrixInverse).toArray(s)
                }
                var j = d._scaleFactor;
                s[12] *= j, s[13] *= j, s[14] *= j;
                var Y = d._eyesOffset;
                if (Y && (Y[0] || Y[1] || Y[2])) {
                    var o = Y[0],
                        t = Y[1],
                        m = Y[2];
                    s[12] -= s[0] * o + s[4] * t + s[8] * m, s[13] -= s[1] * o + s[5] * t + s[9] * m, s[14] -= s[2] * o + s[6] * t + s[10] * m
                }
                return s
            }, shutdown: function () {
                var x = this._device;
                x && x.isPresenting && x.exitPresent()
            }, isPresenting: function () {
                var y = this._device;
                return y && y.isPresenting
            }, _copyProjectMatrix: function (j) {
                var M = this.dup(j),
                    _ = this._scaleFactor;
                return M[14] *= _, M
            }, dup: function (y, W) {
                for (var d = y.length, R = W || new Array(d); d--;) R[d] = y[d];
                return R
            }, getViewMatrix: function (k) {
                var R = this._viewMatrix;
                return R ? this.dup(R, k) : void 0
            }, getProjectMatrix: function () {
                var n = this._projectMatrix;
                return n ? this.dup(n) : void 0
            }, submitFrame: function () {
                var s = this;
                if (s._enable && s._deviceInAction) {
                    var w = s._device;
                    w && w.isPresenting && (w.submitFrame(), s.gv.iv())
                }
            }, getFps: function () {
                return this._fpsInfo.fps
            }, intersectWorld: function (b) {
                var o = this.gv;
                return o.intersectObjects(b, o.dm().getDatas())
            }, setDevice: function (P) {
                var U = this;
                U._device = P
            }, _injectGraphView: function () {
                var o, b, H;
                return function (J) {
                    var O = this.gv;
                    if (!J) return o && (O.getWidth = o, O.getHeight = b, O.getDevicePixelRatio = H), void 0;
                    var a = this._device,
                        r = a.getEyeParameters("left"),
                        j = r.renderWidth,
                        X = r.renderHeight;
                    o = O.getWidth, b = O.getHeight, H = O.getDevicePixelRatio, O.getWidth = function () {
                        return 2 * j
                    }, O.getHeight = function () {
                        return X
                    }, O.getDevicePixelRatio = function () {
                        return 1
                    }
                }
            }(),
            _injectCallLaterFunc: function (B) {
                var T = this;
                if (!B) return $e = O.Default.callLater = T._defaultCallLater, td = O.Default.cancelLater = T._defaultCancelLater, void 0;
                var T = this;
                $e = O.Default.callLater = function (V, H, s, J) {
                    var j = T._device;
                    return j && j.isPresenting ? J ? cd(function () {
                        $e(V, H, s)
                    }, J) : j.requestAnimationFrame(function () {
                        T._deviceInAction = !0, V.apply(H, s), T._deviceInAction = !1
                    }) : T._defaultCallLater(V, H, s, J)
                }, td = O.Default.cancelLater = function (f, P) {
                    var Y = T._device;
                    return Y && Y.isPresenting ? P ? nr(f) : Y.cancelAnimationFrame(f) : T._defaultCancelLater(f, P)
                }
            }
        }), o.defineProperties(Es.prototype, {
            enable: {
                get: function () {
                    return this._enable
                }, set: function (Y) {
                    var N = this;
                    N._enable !== Y && (N._enable = Y, Y ? (N.switch.showButton(), N._injectCallLaterFunc(!0)) : (N.shutdown(), N.switch.hideButton(), N._injectCallLaterFunc(!1)), N.fp("enable", !Y, Y))
                }
            },
            measureOflength: {
                get: function () {
                    return this._measureOflength
                }, set: function (X) {
                    this._measureOflength = X;
                    var S = this._scaleFactor = 1 / X;
                    this._controllers.forEach(function (P) {
                        P && P._setScaleFactor(S)
                    })
                }
            },
            eyesOffset: {
                get: function () {
                    return this._eyesOffset
                }, set: function (U) {
                    this._eyesOffset = U
                }
            },
            controllerModel: {
                get: function () {
                    return this._controllerModel
                }, set: function (c) {
                    var G;
                    "object" == typeof c ? (G = c.mtl, c = c.obj) : (G = c + ".mtl", c += ".obj");
                    var X = this,
                        A = X._controllerModel;
                    A && A.obj === c && A.mtl === G || (A = X._controllerModel = {
                        obj: c,
                        mtl: G
                    }, u.loadObj(c, G, {
                        finishFunc: function (v, x) {
                            X._controllerModel === A && u.setShape3dModel("vrControllerModel", x)
                        }
                    }))
                }
            },
            interactive: {
                get: function () {
                    return !!this._interactive
                }, set: function (N) {
                    !!N != !!this._interactive && (this._interactive = N, N && this.addController(0), this.gv.getCoreInteractor().enableVR(N))
                }
            }
        });
        var Fs = function (q, J) {
            function P(S) {
                var m = navigator.getGamepads && navigator.getGamepads();
                if (m)
                    for (var k = 0, M = 0, w = m.length; w > k; k++) {
                        var c = m[k];
                        if (c) {
                            var Y = c.id;
                            if ("OpenVR Gamepad" === Y || 0 === Y.indexOf("Oculus Touch") || Y.indexOf("Controller") >= 0) {
                                if (M === S) return c;
                                M++
                            }
                        }
                    }
            }

            function $(A, n, D) {
                return Math.abs(A[0] - n[0]) < D && Math.abs(A[1] - n[1]) < D && Math.abs(A[2] - n[2]) < D ? !0 : !1
            }
            var G = this;
            G.vr = q, G.id = J;
            var c, z, j = [0, 0],
                Y = [{
                    id: "thumbpad",
                    pressed: !1
                }, {
                    id: "trigger",
                    pressed: !1
                }, {
                    id: "grips",
                    pressed: !1
                }, {
                    id: "menu",
                    pressed: !1
                }],
                w = new Dp;
            w.s("shape3d", "vrControllerModel"), w.isController = !0, w.s("intersect", !1), G.getGamepad = function () {
                return z
            }, G.isButtonPressed = function ($) {
                for (var Z, q = 0, g = Y.length; g > q; q++)
                    if (Z = Y[q], Z.id === $) return Z.pressed;
                return !1
            }, G.getNode = function () {
                return w
            };
            var I = .003;
            G.setRotationEpsilon = function (V) {
                I = V
            };
            var n = 5e-4,
                m = n;
            G.setPositionEpsilon = function (C) {
                n = C, m = C * G.vr._scaleFactor
            }, G._setScaleFactor = function (x) {
                w.s3(x, x, x), m = n * x
            }, G._setScaleFactor(G.vr._scaleFactor);
            var l, f = new fs,
                R = new br,
                g = [0, 0, 0],
                v = [0, 0, 0],
                o = new gg,
                x = new tl,
                N = new Qi;
            G.getRay = function () {
                return l ? (N.origin.fromArray(g), N.direction.copy(x), l = !1, N) : N
            }, G.update = function () {
                if (c = z, z = P(J), !z || z.pose === Z) return z = null, w.s("3d.visible", !1), void 0;
                if (u.getShape3dModel("vrControllerModel")) {
                    w.dm() || q.gv.dm().add(w), w.s("3d.visible", !0);
                    var y = z.pose;
                    if (null !== y) {
                        if (y.position && (G.vr.toViewPosition(y.position, g), $(w.p3(), g, m) || (l = !0, w.p3(g))), y.orientation) {
                            f.fromArray(y.orientation);
                            var X = G.vr._originalOrientation;
                            X && f.premultiply(X.quaternion), x.set(0, 0, -1).applyQuaternion(f).normalize(), R.makeRotationFromQuaternion(f), o.set(0, 0, 0, w.getRotationMode(), !0).setFromRotationMatrix(R), v[0] = o.x, v[1] = o.y, v[2] = o.z, $(w.r3(), v, I) || (l = !0, w.r3(v))
                        }
                        l && q.fp("gamepad.pose", null, {
                            position: g,
                            rotation: v,
                            id: J
                        });
                        var U = z.axes;
                        (j[0] !== U[0] || j[1] !== U[1]) && (j = [U[0], U[1]], q.fp("gamepad.axes", null, {
                            id: J,
                            axes: j
                        }));
                        var T, V, r, E, t = z.buttons;
                        for (T = 0, V = t.length; V > T; T++)
                            if (r = t[T], r && (E = r.pressed, Y[T] || (Y[T] = {
                                id: "button" + T,
                                pressed: !1
                            }), E !== Y[T].pressed)) {
                                Y[T].pressed = E;
                                var H = {
                                    id: J
                                },
                                    K = "state";
                                H[K] = H._62O = E ? "down" : "up", q.fp("gamepad.button." + Y[T].id, null, H)
                            }
                    }
                }
            }
        },
            Gs = function (s) {
                this.vr = s, this._button = null
            };
        yc(Gs, o, {
            showButton: function () {
                var T = this.assureButton();
                if (!T.parentNode) {
                    var Y = this.vr.gv,
                        b = Y.getView();
                    Y._79O ? b.insertBefore(T, Y._79O) : b.appendChild(T)
                }
            }, hideButton: function () {
                var r = this._button;
                r && r.parentNode && r.parentNode.removeChild(r)
            }, assureButton: function () {
                var r = this._button;
                return r ? r : this._button = this.createButton(this.vr.gv)
            }, createButton: function (F) {
                function v(j, C) {
                    j.textContent = C && C.isPresenting ? "关闭 VR 显示" : "开启 VR 显示"
                }

                function _(n) {
                    h.style.display = "", h.style.cursor = "pointer", h.style.left = "calc(50% - 50px)", h.style.width = "100px", v(h, n), h.onmouseenter = function () {
                        h.style.opacity = "1.0"
                    }, h.onmouseleave = function () {
                        h.style.opacity = "0.5"
                    }, h.onclick = function () {
                        n.isPresenting ? n.exitPresent() : n.requestPresent([{
                            source: F.getCanvas()
                        }])
                    }, F.vr.setDevice(n)
                }

                function q() {
                    h.style.display = "", h.style.cursor = "auto", h.style.left = "calc(50% - 75px)", h.style.width = "150px", v(h, null), h.onmouseenter = null, h.onmouseleave = null, h.onclick = null, F.vr.setDevice(null)
                }

                function S(g) {
                    g.style.position = "absolute", g.style.bottom = "20px", g.style.padding = "12px 6px", g.style.border = "1px solid #fff", g.style.borderRadius = "4px", g.style.color = "#000", g.style.font = "normal 13px sans-serif", g.style.textAlign = "center", g.style.opacity = "0.5", g.style.outline = "none", g.style.zIndex = "999"
                }
                if ("getVRDisplays" in navigator) {
                    var h = this._button = U.createElement("button");
                    return h.style.display = "none", S(h), K(x, "vrdisplayconnect", function (j) {
                        _(j.display)
                    }), K(x, "vrdisplaydisconnect", function () {
                        q()
                    }), K(x, "vrdisplaypresentchange", function (e) {
                        v(h, e.display), F.vr.onVRDisplayPresentChange()
                    }), navigator.getVRDisplays().then(function (S) {
                        S.length > 0 ? _(S[0]) : q()
                    }), h
                }
                var o = U.createElement("a");
                return o.href = "https://webvr.info", o.innerHTML = "当前不支持 webvr", o.style.left = "calc(50% - 90px)", o.style.width = "180px", o.style.textDecoration = "none", S(o), o
            }
        }), o.defineProperties(Gs.prototype, {});
        var Hs = O.graph3d.PostProcessing = function (C) {
            function T() {
                if (!I) {
                    var h = C.getGL();
                    I = new Eh.RenderTarget(C, h, null, null, {
                        samples: z.renderTextureSamples || 1
                    }), d = new Cm.Shader(h, O.vs, O.fs), V = Cm.Buffer.createIndexBuffer(h, new Uint16Array([0, 2, 1, 1, 2, 3])), i = Cm.Buffer.createVertexBuffer(h, new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]))
                }
            }
            var I, d, V, i, G = this,
                q = {},
                s = !1;
            ! function () {
                o.keys(Hs).forEach(function (G) {
                    q[G] = new Hs[G](C)
                })
            }(), G.getModule = function (E) {
                return E ? q[E] : G
            }, G.getModuleList = function () {
                return o.keys(q)
            }, G._serializable = !0, G.handleDataModleChange = function (W, j) {
                W && (G._serializable && W.setPostProcessingData(G.serialize()), W.removeSerializeListener(G.onDataModelSerialize, G)), j && (j.addSerializeListener(G.onDataModelSerialize, G), G.deserialize(j))
            }, G.onDataModelSerialize = function (K) {
                "serialize" === K.type ? G._serializable && (C.dm()._postProcessingData = G.serialize()) : "deserialize" === K.type && G.deserialize(C.dm())
            }, G.isDeserializeDisabled = function (s) {
                return !G._serializable || s.a("sceneBloom") !== Z
            }, G.isSerializable = function () {
                return G._serializable
            }, G.setSerializable = function (L) {
                G._serializable = L, L || C.dm().setPostProcessingData(Z)
            }, G.serialize = function () {
                var a, B, p, Z, S = {};
                for (B in q)
                    if (p = q[B], Z = p.serializeProperties) {
                        a = {}, p.enable && (a.enable = !0);
                        for (var l in Z) {
                            var T = p[l];
                            T != Z[l] && (a[l] = T)
                        }
                        o.keys(a).length && (S[B.toLowerCase()] = a)
                    }
                return S
            }, G.deserialize = function (k) {
                var y, F, R, b, s, U = {},
                    z = {};
                for (y in q) {
                    R = q[y], b = R.serializeProperties;
                    var c = {},
                        E = "scene" + y,
                        N = k.a(E);
                    N !== Z && (c.enable = N);
                    for (var s in b) N = k.a(E + s[0].toUpperCase() + s.slice(1)), N !== Z && N !== b[s] && (c[s] = N);
                    wd(c) || (z[y[0].toLowerCase() + y.slice(1)] = c)
                }
                if (wd(z) && (z = k.getPostProcessingData()), z)
                    for (F in z)
                        if (F && (y = F[0].toUpperCase() + F.slice(1), R = q[y])) {
                            U[y] = !0, b = z[F];
                            var L = !!b.enable;
                            G.enableModule(y, L), y = "scene" + y, k.a(y, L), R.resetProperties && R.resetProperties();
                            for (s in b)
                                if ("enable" !== s) {
                                    var N = b[s];
                                    R[s] = N, k.a(y + s[0].toUpperCase() + s.slice(1), N)
                                }
                        }
                for (y in q) U[y] || (R = q[y], R.enable = !1, R.resetProperties && R.resetProperties())
            }, G.decodeShader = function (I) {
                var y, z, X, T = "",
                    E = "";
                for (X = 0; X < I.length; X++) y = I[X], "%" === y ? y = "'" : "a" === y ? y = '"' : "]" === y && (y = "\\"), z = String.fromCharCode(y.charCodeAt(0) - 1), X % 2 ? E += z : T = z + T;
                return E + T
            }, G.createShader = function (_, v, A) {
                var e = v.indexOf("^#"),
                    g = G.decodeShader(v.substr(0, e)),
                    O = G.decodeShader(v.substr(e + 2));
                if (A) {
                    var d = A(g, O);
                    d && d.vs && (g = d.vs), d && d.fs && (O = d.fs)
                }
                return new Cm.Shader(_, g, O)
            }, G.enableModule = function (z, h) {
                var u, E, o, U = z.split(",");
                for (u = 0, E = U.length; E > u; u++) o = U[u].trim(), q[o] && (q[o].enable = h);
                s = !1;
                for (o in q)
                    if (q[o].enable) {
                        s = !0;
                        break
                    }
                s && T()
            };
            var O = {
                vs: ["attribute vec2 pos;", "varying vec2 vUv;", "void main(void) {", "gl_Position = vec4(pos.x * 2.0 - 1.0, -pos.y * 2.0 + 1.0, 0.0, 1.0);", "vUv = vec2(pos.x, 1.0 - pos.y);", "}"].join("\n"),
                fs: ["precision highp float;", "uniform sampler2D image;", "varying vec2 vUv;", "void main() {", "gl_FragColor = texture2D(image, vUv);", "}"].join("\n")
            };
            G.render = function (h, L, w) {
                if (s) {
                    I.setSize(h, L, w), I.bind(h);
                    var T = h.getParameter(h.COLOR_CLEAR_VALUE);
                    T && 0 === T[0] && 0 === T[1] && 0 === T[2] && 0 === T[3] ? T = null : qe(h, [0, 0, 0, 0]), h.clear(h.COLOR_BUFFER_BIT | h.DEPTH_BUFFER_BIT), C.setViewport(h, 0, 0, L, w), C.renderScene(), I.unbind(h);
                    for (var Y = 0, b = C._glCapabilities.maxAttributes; b > Y; Y++) h.disableVertexAttribArray(Y);
                    var r, A = I;
                    for (r in q) A = q[r]._42(h, A) || A;
                    return C.setViewport(h, 0, 0, L, w), T && qe(h, T), h.clear(h.COLOR_BUFFER_BIT | h.DEPTH_BUFFER_BIT), d.bind(), h.activeTexture(h.TEXTURE0 + 0), an(h, A.texture), d.uniforms.image = 0, V.upload(), i.upload(), d.attributes.pos.pointer(i), h.drawElements(h.TRIANGLES, 6, h.UNSIGNED_SHORT, 0), an(h, null), h.useProgram(C._prg), !0
                }
            }
        },
            Is = O.graph3d.PostProcessing.Bloom = function (S) {
                function H() {
                    var B = S.getGL();
                    if (B)
                        for (var A = S._postProcessing, K = 0; f > K; K++) Z[K] = A.createShader(B, Is._35Q, function (i, R) {
                            return {
                                fs: R.replace(/DEFINE_VALUE/g, $[K]).replace("%OVERRIDE_ALPHA_DEFINE%", I ? "#define OVERRIDE_ALPHA" : "")
                            }
                        })
                }

                function k() {
                    var X = S.getWidth(),
                        _ = S.getHeight();
                    if (X && _) {
                        B = [X, _], L = !0;
                        var V, Q = S.getGL(),
                            r = Math.round(B[0] / 2),
                            P = Math.round(B[1] / 2);
                        for (x = new Eh.RenderTarget(S, Q, r, P), V = 0; f > V; V++) u.push(new Eh.RenderTarget(S, Q, r, P)), n.push(new Eh.RenderTarget(S, Q, r, P)), r = Math.round(r / 2), P = Math.round(P / 2);
                        var T = S._postProcessing;
                        O = T.createShader(Q, Is._34Q), H(), G = T.createShader(Q, Is._36Q, function (U, P) {
                            return {
                                fs: P.replace(/NUM_MIPS/g, f)
                            }
                        }), j = T.createShader(Q, Is.finalShader), M = Cm.Buffer.createIndexBuffer(Q, new Uint16Array([0, 2, 1, 1, 2, 3])), e = Cm.Buffer.createVertexBuffer(Q, new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]))
                    }
                }
                var F, W, K, I, r, M, e, E, m = this,
                    s = !1,
                    L = !1;
                this.serializeProperties = {
                    strength: 1.5,
                    threshold: .55,
                    radius: .4,
                    overrideAlpha: !0,
                    selective: !1
                }, this.resetProperties = function () {
                    var m = this.serializeProperties;
                    for (var R in m) this[R] = m[R]
                }, o.defineProperties(m, {
                    enable: {
                        get: function () {
                            return s
                        }, set: function (d) {
                            !!s != !!d && (s = d, d && !L && k(), S.iv())
                        }
                    },
                    strength: {
                        get: function () {
                            return F
                        }, set: function (Z) {
                            F !== Z && (F = Z, S.iv())
                        }
                    },
                    threshold: {
                        get: function () {
                            return W
                        }, set: function (q) {
                            W !== q && (W = q, S.iv())
                        }
                    },
                    radius: {
                        get: function () {
                            return K
                        }, set: function (C) {
                            K !== C && (K = C, S.iv())
                        }
                    },
                    overrideAlpha: {
                        get: function () {
                            return I
                        }, set: function (t) {
                            !!I != !!t && (I = t, L && H(), S.iv())
                        }
                    },
                    selective: {
                        get: function () {
                            return r
                        }, set: function (n) {
                            !!r != !!n && (r = !!n, S.iv())
                        }
                    }
                }), this.resetProperties();
                var x, O, G, j, B = [256, 256],
                    u = [],
                    n = [],
                    f = 5,
                    $ = [3, 5, 7, 9, 11],
                    Z = [];
                m._42 = function (_, P) {
                    function A(b, J, z, $) {
                        So(_, J.frame), S.setViewport(_, 0, 0, J.width, J.height), $ ? $(_) : _.clear(_.COLOR_BUFFER_BIT | _.DEPTH_BUFFER_BIT), V !== b && b.bind();
                        var k = 0;
                        for (var P in z) {
                            var a = z[P];
                            a instanceof WebGLTexture && (_.activeTexture(_.TEXTURE0 + k), an(_, a), a = k, k++), b.uniforms[P] = a
                        }
                        for (V !== b && (M.upload(), e.upload(), b.attributes.pos.pointer(e), V = b), _.drawElements(_.TRIANGLES, 6, _.UNSIGNED_SHORT, 0); k--;) _.activeTexture(_.TEXTURE0 + k), an(_, null);
                        Ar(_)
                    }
                    if (s && (L || (k(), L))) {
                        var V;
                        if (r) {
                            E || (E = new Eh.RenderTarget(S, _)), E.setSize(_, P.width, P.height), E.bind(_);
                            var z = _.getParameter(_.COLOR_CLEAR_VALUE);
                            z && 0 === z[0] && 0 === z[1] && 0 === z[2] && 1 === z[3] ? z = null : qe(_, [0, 0, 0, 1]), _.clear(_.COLOR_BUFFER_BIT | _.DEPTH_BUFFER_BIT), S.setViewport(_, 0, 0, P.width, P.height), _._blooming = !0, S.renderScene(), _._blooming = !1, z && qe(_, z), E.unbind(_)
                        }
                        A(O, x, {
                            smoothWidth: .01,
                            luminosityThreshold: W,
                            tDiffuse: r ? E.texture : P.texture
                        });
                        var U, d = x,
                            g = Math.round(B[0] / 2),
                            h = Math.round(B[1] / 2);
                        for (U = 0; f > U; U++) A(Z[U], u[U], {
                            colorTexture: d.texture,
                            direction: [1, 0],
                            texSize: [g, h]
                        }), A(Z[U], n[U], {
                            colorTexture: u[U].texture,
                            direction: [0, 1],
                            texSize: [g, h]
                        }), g = Math.round(g / 2), h = Math.round(h / 2), d = n[U];
                        return A(G, u[0], {
                            blurTexture1: n[0].texture,
                            blurTexture2: n[1].texture,
                            blurTexture3: n[2].texture,
                            blurTexture4: n[3].texture,
                            blurTexture5: n[4].texture,
                            bloomStrength: F,
                            bloomRadius: K,
                            bloomTintColor: [1, 1, 1]
                        }), A(j, P, {
                            image: u[0].texture
                        }, function (N) {
                            ts.for(N).glState.blend.apply({
                                enabled: !0,
                                equation: N.FUNC_ADD,
                                func: [N.SRC_ALPHA, N.ONE]
                            })
                        }), ts.for(_).glState.blend.apply({
                            equation: _.FUNC_ADD,
                            func: [_.SRC_ALPHA, _.ONE_MINUS_SRC_ALPHA, _.ONE, _.ONE_MINUS_SRC_ALPHA]
                        }), P
                    }
                }
            };
        Is._34Q = "~bu<u*szj/ctvpuqf!!.w!f1d/32!!q-pyt/<tpwqb)s3zdjfowh!!>w!fwdV3w!w<V*w1</2w!p-j1e/!1n!b-j1o/)2w!p,j!e1*/!3|!+h!mz`/Qtpptqj.u!j-p1o/!2>!!.w!f1d/53)!q+p!ty/^#~qs<f*d!jbtijqpmob!!i-jmhfiyqf!ug!m-psbpum<pDvuovjqgupvspn!!)tybjnnq!m>f!ss3pEm!puDEhjbgsgGv`tmfh<<v*o!jwg!p-sinu!egjmXpibuup!pmnvtn!j,o!petmjpuiztUfissifUtziupjmtep<ojvnovjmg!p-senm!pgimtpfbsui!UtznupjptupioXjjnevumi!<)qwfbustzijuophp!nwtf!d>3!!bwiVqwm<b!wupbjpem!gnb<j*o1)/*1!!|-1w/f1d!5-!1u/f1y!f-m1!/>1!)u5fdyfuwv!s>f!3sEp)m!puDEujvgqguvvtpf!-5!dwfVww!<**<!bwnfvdm4!!-m{vznyb/!m>f!ywffud!4))u!p1e/!3>:!:w-!!u1b/p6m9g8-<!*1!/522", Is._35Q = "~bu<u*szj/ctvpuqf!!.w!f1d/32!!q-pyt/<tpwqb)s3zdjfowh!!>w!fwdV3w!w<V*w1</2w!p-j1e/!1n!b-j1o/)2w!p,j!e1*/!3|!+h!mz`/Qtpptqj.u!j-p1o/!2>!!.w!f1d/53)!q+p!ty/^#~qsgfjdejotfj$po<!*ibj/hyijqQ!fgsmvpubyuf<u!w-bnsvzTjuoihh!jwffxd03n!vwTVfwt<vgvgojjeg)p5sdnf!wt!b>n!qsmpfmsp3DEh!bdspGm`pmshUffytumvfs$f<<*v1o/j2g!p-snnv!Twufidh3j!fuxf0ynTvjT{fft<vgvgojjeg)p5sdnf!ww!f>d!3s!pemjpsDfhdbusjGp`om<h$BeIfQgMjBo`fF!ELJFSSSOFFWMP`!SgBfEeJgVjT$!E~FG<JxO!F+`!W1B/M3V!F>,$!enfvgTjuoifh!jTfJxHN<Bx!!E+F!G*J3OfFm`qWnBbMtV!F,!&2PfWmFqSnSbJtE)F!`>B,M!QnIvBT`fEtFvGgJgOjFe&<gcmhpsb/u*!uhfbtvgtgtPjwbvo!Q.e!gw)Vjwo!!-gfmspvbuuy!fyU-s!pjmop!dg!m)pEb3uf!stvjuhynfbu*!!>|!3sffmuqvnsbot!!14/d4f:w9:<5c!h+s!/f*yuqf)t!g.g1P/w6v!!+,!!yw!V+w!!y-0f)s!vtujyhfnUbs!p+m!ptdj!h)nEb3*f*s0vtujyhfnub!<>!~2fwmpqjneb!tn!b4jdof)w*!<|y!w+f!df3{!jjTowwoTjj!{+f!!o>p!j2u/d1f!s0j!eu!f>y!Tujf{tfg<gPgwmvp!b3ud!fgwTj<h*nbbn!h>j!Tggm!p-byu))gTeJQHoNbBj*t<tvgbmhp!b>u!!xx!fujbhpimugTv<n*!j>)!uhbbpvmtgt!j>b!oyQ!eugb)p1m/g1-|!!g*T!j,h,n!bj*!<<TwVfJdE5B!Su`fMyFuOvSsFfLQ!j=y!!j>!!<u2f!y>u!vjs!fu3oEj)!!)dsppmgps<UnfvyTuuvishfj-f!xw!V+w!*c<hsw/fydj4Q!fesjvgugyvftuf!T>v!n", Is._36Q = "~bu<u*szj/ctvpuqf!!.w!f1d/32!!q-pyt/<tpwqb)s3zdjfowh!!>w!fwdV3w!w<V*w1</2w!p-j1e/!1n!b-j1o/)2w!p,j!e1*/!3|!+h!mz`/Qtpptqj.u!j-p1o/!2>!!.w!f1d/53)!q+p!ty/^#~qs<f*d!j*twjVpwo!!-i6jfhsivqu!ygfmUpsbvum<c)wEb3sfzsjvouhy!fwuf!d+3!!*w1V/w2<!-vsopjmgppDsuno!jtUbnnpqpmmfcs)35Ed!fcwm!v+s!U*f3y/u1v)ssfp2u<dbvGonjpgppmsCnq!stfbmnq!m,f!s*3wEV!wc!m-v5sfUsfvyuuyvfsUfs3v<mcv)oEj3gfpssvnu!ytfbun!q+m!f*s13/E2!!c-msvpsmUpfDyuuovjsUfn4p<pmvco)j5gdpfswn!!+t!b*n5q/m1f)ss3pEu!dcbmGvnspUpfmyCuqvssffm5<!,v!o*jwgVpws!n-!4tfbsnvqumyffsU3sEv!mccm)vEs3Uffsyvuuvysffu6!<+!v*o1j/g2p!s-ns!ptmbpnDqumofjsU3nEp!pemjcs)u5Udffywu!v+s!f*<7/v1o)jsgppusdnb!GgnmpppbmuC!qcsmfpmpn!T,u!s*fwoVhwu!i-<3fvsovjugypfsUns!vgmmcp)bEu3!fcsmvpupynfSub!e+j!v*t1</2v!o-jsgppmspnD!uwofjdU4n!pcpmmpcp)n5Udjfowu!D+p!m*p9s/<1)gsmppubdub!GmnfpspqmCCmqpspfnmGb!d,u!p*sw)Vdwp!o-t2uf!sjvou!ygfmUpsbvum!cg)bEd3ufpssv*u!y|fug!m+p!b*u1!/n2j!s-ssppsmGpbDduuopjsU!n>p!p2m/c3)!5.d!fgwb!d+u!p*s1</2s)fsupvusdob!Gnnjpyp)mgCbqdsufpms!-)!!n+j!sisuphsoGfbsduuTpnsp-p!mccm!p>p!nsSpbmepjDvhtb*s<G`~mhwp|j!e*!)nobj", Is.finalShader = "~bu<u*szj/ctvpuqf!!.w!f1d/32!!q-pyt/<tpwqb)s3zdjfowh!!>w!fwdV3w!w<V*w1</2w!p-j1e/!1n!b-j1o/)2w!p,j!e1*/!3|!+h!mz`/Qtpptqj.u!j-p1o/!2>!!.w!f1d/53)!q+p!ty/^#~qs<f*dwjVtwj!p-of!hibjnhji)qE!3gfmspvbuuy<fuv!o>j!gsppsmnp!DthbbnsqGm`fmsh3E|!!j*n)bohjfb<n!webjspzwjo<hw!Vwwf!d3";
        var Js = O.graph3d.PostProcessing.Dof = function (t) {
            function m() {
                e = !0;
                var A = t.getGL();
                w = new Eh.RenderTarget(t, A), r = t._postProcessing.createShader(A, Js._38Q), M = Cm.Buffer.createIndexBuffer(A, new Uint16Array([0, 2, 1, 1, 2, 3])), h = Cm.Buffer.createVertexBuffer(A, new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]))
            }
            var w, r, M, h, V, l, u, q, c = this,
                f = !1,
                e = !1;
            this.serializeProperties = {
                aperture: .025,
                maxblur: 1,
                image: null
            }, this.resetProperties = function () {
                var K = this.serializeProperties;
                for (var f in K) this[f] = K[f]
            }, o.defineProperties(c, {
                enable: {
                    get: function () {
                        return f
                    }, set: function (n) {
                        !!f != !!n && (f = n, n && !e && m(), t.iv())
                    }
                },
                image: {
                    get: function () {
                        return l
                    }, set: function (w) {
                        l !== w && (l = w, V && (t.getGL().deleteTexture(V), V = null), t.iv())
                    }
                },
                maxblur: {
                    get: function () {
                        return u
                    }, set: function (z) {
                        u !== z && (u = z, t.iv())
                    }
                },
                aperture: {
                    get: function () {
                        return q
                    }, set: function (b) {
                        q !== b && (q = b, t.iv())
                    }
                }
            }), this.resetProperties(), c._42 = function (n, W) {
                function k(Y, P, e, G) {
                    So(n, P.frame), t.setViewport(n, 0, 0, P.width, P.height), G ? G(n) : n.clear(n.COLOR_BUFFER_BIT | n.DEPTH_BUFFER_BIT), b !== Y && Y.bind();
                    var d = 0;
                    for (var o in e) {
                        var y = e[o];
                        y instanceof WebGLTexture && (n.activeTexture(n.TEXTURE0 + d), an(n, y), y = d, d++), Y.uniforms[o] = y
                    }
                    for (b !== Y && (M.upload(), h.upload(), Y.attributes.pos.pointer(h), b = Y), n.drawElements(n.TRIANGLES, 6, n.UNSIGNED_SHORT, 0); d--;) n.activeTexture(n.TEXTURE0 + d), an(n, null);
                    Ar(n)
                }
                if (f) {
                    e || m();
                    var b;
                    if (!V) {
                        var E = ii(this.image);
                        if (!E || !E.tagName) return W;
                        V = rg(n, E)
                    }
                    var i = W.width,
                        p = W.height;
                    if (i && p) return w.setSize(n, i, p), k(r, w, {
                        tColor: W.texture,
                        tDepth: V,
                        aspect: i / p,
                        aperture: this.aperture,
                        maxblur: this.maxblur
                    }), w
                }
            }
        };
        Js._38Q = "~bu<u*szj/ctvpuqf!!.w!f1d/32!!q-pyt/<tpwqb)s3zdjfowh!!>w!fwdV3w!w<V*w1</2w!p-j1e/!1n!b-j1o/)2w!p,j!e1*/!3|!+h!mz`/Qtpptqj.u!j-p1o/!2>!!.w!f1d/53)!q+p!ty/^#~qs<f1d/j2t!j>p!ob!/isjphmipqD!hgbmspGb`um<hw<b1s/z2j5o!h0!!wmfpdd3!!>w!Vswp<mpvDohjbgspGs`nm!hcp<p*m!!5vstvfmEcfgqpuei!<+!v*o!jugdpfssns!ptdbundqfmqftsb3!E+!!u*D!p5m/p1s!<-1v/o1j!g)p3sdnf!wt!b)n!q,m!fzsy3/Ew!VuwE!f-qsupim<pDvuo!j)gEp3sfns!vgumypfbuu!!>n,b!ymcpmdvs<<*!v5osjvgmpcsgnp!eg!m+p!b*u!!ubdqffsssupvdsufd<fqvtobj!g+p!s*n!!:g3m/p1b.u!!-o:f3b/s1D.m!j)q3<dfvwo!j)g!p,s!nz!yg/mwpVbwu!!-gsbpsmDpmDjuq!<)Ev3ofjsgvpusynf!ug!m>p,b!um!pgdpd<v*t!<5svvomjcggppsen!!+g!m*p!buud!fbstsqpfdduud<fqdtpbo!t+u!!*g!m1p/b1u!!-V5o/q1b.d!l)E3pdxfowt!d)b!m,f!!z>y!/3w6V6w/!!-0s!p3m6p7D/u<!!)0E03!f1s/v/u2y!f.u?!!>g,s!bmdpudjp<o*!!)5fsyvdmmcvgepjeo!h+!!2**!uddpfostsup!dwufddf4q!tQbb!d+l!G*b!d:u3p/s1t!!->:!3w/f1d.4!))!33d6f7w/!!)+!!,3!6z7y//!w+V!w3!6-7s/p-m!p3D6u7!/)!E+3!f3s6v7u/y-f!u3!6>7,/!!m*p<dd<p*o!t5us!vwmfcdg5p!eV!o+q!b*d!luGdbfdsusppsdtu!d>f!qVtobq!b+d!l*E!p5x/o1t.d!b-m1f/!10!!)w3fddf5w)!!)Q!b,d!lzGyb/dwuVpws!t--s!p2m/p!D*u<!)gEm3pfbsuv!uvyofqub!d>l,S!HmCpBdUp<E*f!q5usiv)m!cdgppoet!u+!!j*o!!uwdffds5s!pwd!u*d!f|qt!bs!f+u!v*s!o:!3e/p1u.)!!-w:-3!/V1o!q)b3ddlfGwb!d)u!p,s!tz!y*/<wV~w!g-msppbmup!Dhuf!u)EEf3qfusiv)u!ydfpuo!t>u,!!jmop!dwf<d*3!!5tsdvsmfcfgopQep!t+j!u*j!puod!f*s!s|pd\nusdffuqvtsbo!!+v!o*q!b1d/l1S!H-C5B/U1p!E)f3qdufiw)!!)u!f,y!uzvys/fw3VEw)!!-usEpfmqpuDiu-!!)tEd3sffsfvouQypftuj!u>j,p!om!p*d!*<<*!~5sgvmmpcbgup!eq!f+s!t*q!fuddufjswsfpEdfuqdufiqUtpbW!j+f!x*[!):!3d/p1o!t-u:!3j/o1!!g)m3pdbfuw!!j)o!w,D!mzjyq/[w-V!wd!p-ostpum!pjDou!!g)mEp3bfus!voufybfsu-!!>d,p!omtpud!j<o*!!g8mspvbmuc!ggpbes!!+*!!*|!u!dsffsusvpsdou!d)f!qotfbb!s+!!+*!!g5b/s1!!*-!10/!1)!!))3!dgfbws!!).!!,o!fzbys/!w*V!w+!!-jsopwmDpmDjuq![)!E.3!fgsbvsu!y*f<u!~>,g!mmppbdu!<h*f!u8Wsjvfmxc[g)p!ed!p+o!t*u!!ujdof!sgsmppdbuud!feqftqbu!i+!!**!!|:3\n/s1f.u!v-s:o3!/q1f.s!t)q3fddfuwj!w)f!E,f!qzuyi/UwpVWwj!f-xs[p)m!peDfuq!u)iE-3!fosfvbusyDfmuj!q>-,!!gmbpsdDm<j*q!!8*s<vm~cgwppej!e+!!n*b!juod)f*s!s|pdwufddf3q!tebp!g+c!m*v!s1</1w!f-d53/!1b.t!q)f3ddufdwp!s)s!f,d!uz!y>/!wwVfwd!3-)s!p2m/p1D-u!!b)tEq3ffdsuv!u*y<fuj!g>!,)!vmtpfdEf<q*u!i8*s!v|mc!ggpmep!b+u!!*w!jufdxf[s!s>p!dhufdufWqjtfbx![+)!!*h!f:u3E/f1q!u-i:)3!/w1V.w!!)*3!d*f<w!!)g!m,p!bzuy!/gwbVdwu!p-ss!p>m!p)D!ug!p)dEv3tf!s,v!uwyjffux![>!,*!<mp!dep<g*c!m8vssv!m>c!gwpfed!3+!!)*!!dumdbfnsqs)p!dgubddfuqptsb!!++!!b*q!f5s/u1v.s!f--1!/.1n!b)y3cdmfvws!-)!!n,b!yzcym/vwsV!w*!!-*s<pm~pDfum!t)fE!3|fs!veupygfcum!v>s,!!>m!pwdfd<3*!!)8!sdvmmbcngqp)e!!u+f!y*u!vusdff3sEs)p!duuEdffqqutib-!!+w!f*d!3:)3w/V1w./!y--:!32//11!!).3!dwfVww!/)z!*,!!*z/yb/!w+V!wb!q-fsspumvpsDfu-!!).En3bfyscvmuvysf-u!!n>b,y!cmmpvds!<**!!*8<sv~mcwgfpde3!!+e!p*g!cumdvfss:s!p>d!uedpfgqctmbv!s+!!+*!!11//:1<!-w1f5d/31!!e)p3gdcfmwv!s)8!!,>!!zeyp/gwcVmwv!s-!s+p!m1p/D8u<!)wEf3df3s!veupygfcum!v>s,5!!m>p!dep<g*c!m8vssv!m+c!g1p/e5!<+!w*f!du5d!fdspsmp!d>u!dwffqdt5b)!!+1!/*1!!:*3</1d!p-m:!3,/>1!!u)f3ydufvws!f)3!E,)!!zuyD/pwmVpws!--!swpVmwp/Dyuz!!)*E<3fdspvmu!y,f>u!!u>f,y!umvpsdf3<E*)!!:usDvpmmcpgsp-e!!w+V!w*/!yuzd!f,s!s)p!dwufddf3q)t!b1!/+1!-*!!18/45/!1*.!!+-!6b2t/q1f!d)u3ddpfsws!f)d!u,!!*z!y+/!weVpwg!c-msvpsm!p*D<u!d)pEm3!f,s>v!uuyffyuu!v>s,f!3mEp)d!u<D*p!m:pssv-m!cwgVpwe/!y+z!!*,!!u)d!fwsfsdp3d)u!d1f/q2t6b-!!+1!/*4!86!2*/!1+.!!b-t8q4f/d1u.d!p)s3sdffdwu!!)*!!,+!!zeyp/gwcVmwv!s-!s*p<mpdDpum!!),E>3!fusfvyuuyvfsuf!3>E,)!!mupDdpm<p*s!-:!swvVmwc/gypze!!,+!!)*!!wufddf3s)s!p1d/u3d:f-q!t1b/!3+:!!**!!6+2!/b1t!q-f8d4u/d1p!s)s3fddfuw!!*)!!+,!!ezpyg/cwmVvws!!-*s<pmdppDmu!!,)>E!3uffsyvuuvysffu3!E>),!!umDppdmp<s*-!!:wsVvwm/cygzp!e,!!+)!!*w!fudd3f)s!s.p1d/u4d8f-q!t1b/!2+6!!**!!8+4!/b1t!q-f6d2u/d1p.s!s)f3dduf!w*!!)+!!,e!pzgyc/mwvVsw!!*-<spdmppmD!u,!>)!Eu3ffysuvvusyff3uE!)>!,u!Dmppmdps<-*!!w:Vswv/myczg!p,e!!)+!!w*f!du3d)f!s1s/p5d1u-d!f1q/t1b!!*+!!+*!!b8t4q/f1d.u!d-p6s2s/f1d.u!!)*3!d+f!we!p)g!c,m!vzsy!/*w<Vwd!p-ms!p,m>p!Duuf!y)uEv3sffs3vEu)y!fuuD!p>m,p!sm-p!dwV<w*/!y:zs!v,m!c)g!pwef!d+3!)*!!1u/d4f8s-s!p.d1u/d2f6q!t*b!!++!!b*t!q6f2d/u1d.p!s-s8f4d/u1!!*)!3+d!fewp!g)c!m,v!sz!y*/<wVdwp!m-!s,p>m!puDfuy!u)vEs3ff3sEv)u!yufDup!m>p,s!-m!pwdVw</*y!z:!s,v!m)c!gwpfed!3+)!!*1!/u3d:f-s!s.p1d/u3d:f!q*t!b+!!+b!t*q!f6d2u/d1p!s-s8f4d/u1!.*!!)+3!defpwg!c)m!v,s!!z*y</wdVpwm!!-,s>p!mupfDyuu!v)sEf33fEs)v!uuyDfpum!p>s,-!!mwpVdw/<y*z!!:,s!v)m!cwgfpde3!)+!!.*1!/u2d6f-s!s.p1d/u4d8f!q*t!b+!!+b!t*q!f8d4u/d1p!s-s6f2d/u1!!*)!3+d!fewp!g)c!m,v!sz!y*/<wVdwp!m-!s,p>m!puDfuy!u)vEs3ff3sEv)u!yufDup!m>p,s!-m!pwdVw</*y!zs!v,m!c)g!pwef!d+3!)*!!1u/d1f-s!s.p1d/u5d!f*q!t+b!!b+t!q*f!d8u4d/p1s.s!f-d6u2!/*1!!+)!3edpfgwc!m)v!s,!!*z<y/dwpVmw!!,->s!pumfpyDuuv!s)fE33Ef)s!vuuDypfmup!s>-,!!wmVpwd/y<z*!!,s!v)m!cwgfpde3!)+!!.*1!/u2d6f-s!s1p/d4u8d!f*q!t+b!!b+t!q*f!d:u3d/p1s.s!f-d:u3!/*1!.+!!)e3pdgfcwm!v)s!!,*!<zyd/pwmV!w,!>-!supfmypuDvus!f)3EE3)f!suvDupymfpus!->!,w!Vmwp/dyz<!*,!!s)v!mwcfgdp3e)!!+.!1*/!3u:d-f!s1s/p3d:u!d*f!q+t!bb!t+q!f*d!u6d2p/s1s.f!d-u8!4*/!1+.!!e)p3gdcfmwv!s)!!*,<!zdyp/mw!V,w>!!-usfpymupvDsuf!3)EE)3!fusDvpumypfsu-!!>w,V!wm/pydz!<,*!!)s!vwmfcdg3p)e!!1+/!4*8!-u!d1f/s2s6p!d*u!d+f!qbttbq!f+d!u*d!p1s/s1f!d-u5!/*1!.+!!)e3pdgfcwm!v)s!!,*!<zyd/pwmV!w,!>-!supfmypuDvus!f)3E";
        var Ks = O.graph3d.PostProcessing.HueSaturation = function (D) {
            function g() {
                C = !0;
                var s = D.getGL();
                w = new Eh.RenderTarget(D, s), t = D._postProcessing.createShader(s, Ks.hueSaturationShader), y = Cm.Buffer.createIndexBuffer(s, new Uint16Array([0, 2, 1, 1, 2, 3])), x = Cm.Buffer.createVertexBuffer(s, new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]))
            }
            var y, x, t, w, T = this,
                q = !1,
                C = !1,
                A = [],
                Z = [],
                W = [];
            this.serializeProperties = {
                hue: [0, 0, 0, 0, 0, 0, 0],
                saturation: [0, 0, 0, 0, 0, 0, 0],
                lightness: [0, 0, 0, 0, 0, 0, 0]
            }, this.resetProperties = function () {
                var t = this.serializeProperties;
                for (var d in t) this[d] = t[d]
            }, this.resetProperties(), o.defineProperties(T, {
                enable: {
                    get: function () {
                        return q
                    }, set: function (_) {
                        !!q != !!_ && (q = _, _ && !C && g(), D.iv())
                    }
                },
                hue: {
                    get: function () {
                        return A
                    }, set: function (H) {
                        if (A !== H && 7 === H.length) {
                            for (var q = 0; 7 > q; q++) A[q] = H[q] / 180;
                            D.iv()
                        }
                    }
                },
                saturation: {
                    get: function () {
                        return Z
                    }, set: function (Y) {
                        if (Z !== Y && 7 === Y.length) {
                            for (var M = 0; 7 > M; M++) Z[M] = Y[M] / 100;
                            D.iv()
                        }
                    }
                },
                lightness: {
                    get: function () {
                        return W
                    }, set: function (Y) {
                        if (W !== Y && 7 === Y.length) {
                            for (var Z = 0; 7 > Z; Z++) W[Z] = Y[Z] / 100;
                            D.iv()
                        }
                    }
                }
            }), T._42 = function (J, N) {
                if (q) {
                    C || g();
                    var G = N.width,
                        O = N.height;
                    if (G && O) {
                        w.setSize(J, G, O), So(J, w.frame), D.setViewport(J, 0, 0, w.width, w.height), J.clear(J.COLOR_BUFFER_BIT | J.DEPTH_BUFFER_BIT), t.bind(), J.activeTexture(J.TEXTURE0 + 0), an(J, N.texture);
                        var _ = t.uniforms;
                        return _.image = 0, _.hue = A, _.saturation = Z, _.lightness = W, y.upload(), x.upload(), t.attributes.pos.pointer(x), J.drawElements(J.TRIANGLES, 6, J.UNSIGNED_SHORT, 0), an(J, null), Ar(J), w
                    }
                }
            }
        };
        Ks.hueSaturationShader = "!!b~u!us<j*czv/utfp!qw!f.d!31!/q2p!t-<y/!twpbqs)z3jdofhw!!w>f!dw3V!ww!Vw<<*1/!2w!p-j1e/!1n!b-j1o/)2w!p,j!e1*/!3|!+!!hzm/`tQppqt.j!u-j1p/o2!!>.!!w1f/d35!)+q!pyt/^#!!q~s!fd<j*txj/psop!mipjdh!i-q*!mgtmip)bcuh<s3!mvtoij)g5pdsfnw!!t>b!nsqpmmfpsD3hEb!sjGn`bmhhf!<<!*w!bs*zfjhoohb!Swtftdf3o!uwiVhwj<m!-!^$1e]ftgtjfoofu!iNhBjYm`!S-B{O/HmFt!i8)t!t$feofugijhojfm!`SqBbOnH!F`-B*MfMh!o1bSo!pvjoujbgspvsunb!tg!m-p^b1u]!oipvjfu]bNsBvYu`bStB!O-HzF/^m<ti!)voopjjgupbssnv!ugbmtp`bqub!nt!bu-v*sfbhuojbpSof]vNiB!Y-`^S1B]OfHvFi^!<-y!/vmotjig)pfsvni!`gqmbpnb!u!)m4jdhfiwu!o>f!tmtt]iN!BY`~S!BO~H!F^<<lbf!sgcm!pb<u^!snfbuqo`vipvdf`)fgvmip]btut!fjoouWibhmjvmf!->!!gfmhpobbuS!titvffoBumimh-j!mg!mp<b^us!fiuvofvSpbdo`hffv*i!]|op!jgumbpsbvuu!bwtb!m>v!ff!h>o!bjSooWpbjmuvbfs!v,u!b)ti!vf<B^msmf!u,o!vipvdf`Sfbvoih]ff*v!i0!!>3!/f1h<obS!fjvgi!!)w|b!m*vffh!o=b!s1!/>1>*!!ssffuuovvspod!`wfbvmiv)f!!g,j!!2/|1!<*,!,fsmftufo!vjpgd!`)fwvbim!v<fF!H?O!B2S/`1Y*B!Ns!f=u!vssfou!owvbpmdv`ff!v.i!!2</11!<>!!sffmutofv!psdf`ufvvsio!!uwobjm)v!fs<pg!!~<!2g!m,p!bfuh!onbbsq!`>t!bfuhvosbbsu!jp<o1)!g>m!pfbhuo!bjso!W*b7m!v>f?-!!fghmopbbsu)!!tgbju!vs~b!uj~p!oB<mlmb-f!sgcm!pb<us!ftubouvvpsdb`ufjvpio!S>b!ofhhfo*b!s|!!|g!m*p6b/u1!!w,b!m*vsff!u>o!vjpodW`bfmvvif)!u+b!p)m2g/!1=!!,i!)t!bgujv!sb|u!j*p,o,Bsmfmu!o,v!ptdb`ufvvsib!u<jFpHoOSBbSo`hYfB*N<!=!!ssffuuvosvop!dd`mfbvniq!)<w1b!m>v!fs-f!u1o/v1p-d!`2f/v1i*!<uo!j~)!!sgpmgp!bu!<nfbhqo`bmSjthtifuooufithtj)mg!m-pfbhuo!bjSooWpbjmuvbfs-v!ugbmtp!b-uf!hmojbhSifuvoif!tutbBpmmmg-!!g<m1p!b>u!!fmhjohbisu!oufotjt!Sb<oehmfp*i!t|fs!igum`pfbvui!!wu!b>p!mmgj!hi<u1o/f7t!t+B!mym/!m,t!im!j>h!iiu!oufbtptmSgb!oh<f*<{z!yj/gs!p)mwp!d=)!m1t/i13*ch!ss!f>u!vmstoi!!j4odWfbwm!vf<!*+w!V)ww!!-,f!h2b/n1j*)<E3!ffsmvtufyf!us!f>u!vsspom!pjdo!W5bdmfvwf!!,|!!)*w)!o+j!b)n2!/e1j!p.w!!joW~b!mv<f**m*!<-t!!~-i!)g4mdpfbwu!!oisvvfu3fssh!c)~g!mp<b1u/!7g!20-!!ig!m>p!biu!!g~3!-!<g1m/p7b!u>!,i!vif!*!||!*!1j/g1!!)=i!vif)!!=g!j1!/1*~!!i<vbfu!m,f>E!d2!/01!<*h!!f.m!tsf)!!j,g!!1)/i5v!f>!!?i!!2/|1!*ft!mifv!f~!!.><!b2u/m1f<Ed!!g0m!p*bsu!!.s!fct)<!,!!j1g/!3)!)>7!/i1!!+|!!i*vyfb*N!d=!!>2>/!1h*)!!gsjf!tf!t>m!fg!2~!!,!<)bgu3m!f.E!dg!20*!!*+c!!7./!1h!)+!!>i!vif!<|!!f*mytbfN!dj!g>!>)!)s3)/!1g!j+!!iv<f***!o=j!N2d/!1,*!y!bsNfdt)!!>.!!g13/<3)!!f0m!tbfu!mjfgE!d)!);4!/*1o!j+N!di!v,f!*y!b=N!d3)/!10*!b!usmfftE!d>!!@g!26!/,1!!)=g!3m!!.>!!gt2!*!+<!o)j)N3d/!1.!!0y!b4N/d1!*>!!.b!uimvffE*d!!+u!b7p/m1g<!!|f!m*tofjN!ds!f?t!!y>b!Ngd2)<!g!js!fuv<s1o/!3s!f0t!<*o!j~Nd!!,w!fydb4N!di)t!m>3!smh!c)w<f*d*4c!!i-thm)*y!b|n!!-wsf)dy4b!ns!h>c!<ybN!dj!gu!b)pimtgm!/z<!*>*>c!!1-/h1)*o!j|n!!-ssh)co!j>n!!w>f!do4j)Nidt!mu/b{p*m<g!!~<!cf/mdt!f>!!|c!!ugbmppmbgu!!g<3h</d!!>j!gh!!)uibtpmm/g{!!=<!s1//d6!*>!!sg!3u!b>p!migt!m/<{1!/+1!!)>2!/m1!!u,b!pimtgm!/z<*1</1!!f>m!ttf!u!bgp3m!g>!!i<t1m//2{.!!,>!!iit!mu/bzp!m.g!!it|m!/*zd!!+4!diftwm)/m{t<i3c!hgsm!p4bduf!wg!2!>~!!3/<1c!h+s!!iotsmv/u{f!s.!!g~3!<<*!*s1h/c4/0s1!/>2!)i!v.f!3ys/hmct)ig!2--3!gg!3--2!gi)tcmh/sy3!f,v!i)!2>/!1c0/4c/h1s*!*<<*!ys/hmct/ih!!->3!gi!v-f23gs)hc";
        var Ls = O.graph3d.PostProcessing.Blur = function (B) {
            function T() {
                d = !0;
                var V = B.getGL();
                z = new Eh.RenderTarget(B, V), k = B._postProcessing.createShader(V, Ls.hBlurShader), w = B._postProcessing.createShader(V, Ls.vBlurShader), c = Cm.Buffer.createIndexBuffer(V, new Uint16Array([0, 2, 1, 1, 2, 3])), G = Cm.Buffer.createVertexBuffer(V, new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]))
            }
            var c, G, k, w, z, R, D = this,
                C = !1,
                d = !1;
            this.serializeProperties = {
                value: 0
            }, this.resetProperties = function () {
                this.value = 0
            }, o.defineProperties(D, {
                enable: {
                    get: function () {
                        return C
                    }, set: function (H) {
                        !!C != !!H && (C = H, H && !d && T(), B.iv())
                    }
                },
                value: {
                    get: function () {
                        return R
                    }, set: function (h) {
                        R !== h && (R = h, B.iv())
                    }
                }
            }), this.resetProperties(), D._42 = function (r, m) {
                return C ? D.drawImpl(r, m, R) : void 0
            }, D.drawImpl = function (Z, x, L, R) {
                d || T();
                var P = x.width,
                    j = x.height;
                if (P && j) {
                    R && (P *= R, j *= R), z.setSize(Z, P, j), So(Z, z.frame), B.setViewport(Z, 0, 0, z.width, z.height), Z.clear(Z.COLOR_BUFFER_BIT | Z.DEPTH_BUFFER_BIT), k.bind(), Z.activeTexture(Z.TEXTURE0 + 0), an(Z, x.texture);
                    var A = k.uniforms;
                    A.image = 0, A.value = L / P, c.upload(), G.upload(), k.attributes.pos.pointer(G), Z.drawElements(Z.TRIANGLES, 6, Z.UNSIGNED_SHORT, 0), Ar(Z), So(Z, x.frame), B.setViewport(Z, 0, 0, x.width, x.height), Z.clear(Z.COLOR_BUFFER_BIT | Z.DEPTH_BUFFER_BIT), w.bind(), Z.activeTexture(Z.TEXTURE0 + 0), an(Z, z.texture);
                    var A = w.uniforms;
                    return A.image = 0, A.value = L / j, c.upload(), G.upload(), w.attributes.pos.pointer(G), Z.drawElements(Z.TRIANGLES, 6, Z.UNSIGNED_SHORT, 0), Ar(Z), an(Z, null), z
                }
            }
        };
        Ls.hBlurShader = "!!b~u!us<j*czv/utfp!qw!f.d!31!/q2p!t-<y/!twpbqs)z3jdofhw!!w>f!dw3V!ww!Vw<<*1/!2w!p-j1e/!1n!b-j1o/)2w!p,j!e1*/!3|!+!!hzm/`tQppqt.j!u-j1p/o2!!>.!!w1f/d35!)+q!pyt/^#!!q~s!fd<jntvjtp!o>!!isjphmipqD!hgbmspGb`um<h!!vo<j2g6p1s/n1!!t+b!n*q!m*f!sz3/Ew!Vjwn!b-hffv<mb!ww!b+s!z1j/o5h!!,w!fyd/3w!VwwV!w)<3d!fvwo!j-gfphsbnn!jg!m)pEb3uf!swvbumyvffu<!>,!!wnpvjte!!n<b9j2o:)1*/!1|!+!!w*f!d*5!!zt/vwnV!w>!!-wffvdm5b)w!!1+/!11!/*4<!,!!yt/vwnV!w,!>)!3udffywu!v-sffh3bEn)j!!j)nEb3hffs-v!uwyffdu3!)>!,w!Vnwv/ty!!.<!655/313!2+/!1w!b+m!v*f!-*!!wzV/ww/Vzw!!*-!f*v!m+b!w1!/+1!612/<3!!,t!vyn/!w,V>w!!u)f3ydufvws!f-3fEh)b!njjn!b)hEf3-f!swvfudy3f)u!!w>V,w!/nyv!t.!!4</214!6+2!/w1b!m+v!f*-!!*w!Vzw//wzV!w*!!-*f!v+m!b1w/!1+:!219/<2!!,t!vyn/!w,V>w!!u)f3ydufvws!f-3fEh)b!njjn!b)hEf3-f!swvfudy3f)u!!w>V,w!/nyv!t.!!3</414!7+2!/w1b!m+v!f*-!!*w!Vzw//wzV!w*!!-*y!/+w!V1w/!2)333d5f6w<!-!fthvbnn!j,!>)!Eu3ffysuvvusyff3uE!)>!,j!nnbvhtf!-!<w2f4d632)/!1w!V+w!/*y!!*.!!z2//w1V!w+!!-wfbvm", Ls.vBlurShader = "!!b~u!us<j*czv/utfp!qw!f.d!31!/q2p!t-<y/!twpbqs)z3jdofhw!!w>f!dw3V!ww!Vw<<*1/!2w!p-j1e/!1n!b-j1o/)2w!p,j!e1*/!3|!+!!hzm/`tQppqt.j!u-j1p/o2!!>.!!w1f/d35!)+q!pyt/^#!!q~s!fd<jntvjtp!o>!!isjphmipqD!hgbmspGb`um<h!!vo<j2g6p1s/n1!!t+b!n*q!m*f!sf3vEm!bjwn!b+h!f1</5!!w,b!szz/jwoVhw!!w-fyd/3w!VwwV!w)<3d!fvwo!j-gfphsbnn!jg!m)pEb3uf!swvbumyvffu<!>,!!wnpvjte!!n<b9j2o:)1*/!1|!+!!w*f!d*5!!ftvvmnb!w>!!+w!f1d/54)!!,1!/z1/!w*V<w!-!yt/vwnV!w,!>)!3udffywu!v-sffh3bEn)j!!j)nEb3hffs-v!uwyffdu3!)>!,w!Vnwv/ty!-!<w6V5w3/3z2!/.1!!5+/!1*!!+*!!wfbvmmvbfw!!*+!!*1!/+3!!1,/!1z6/2w<Vw!!t-vyn/!w,V>w!!u)f3ydufvws!f-3fEh)b!njjn!b)hEf3-f!swvfudy3f)u!!w>V,w!/nyv-t!!wV<w2/4z6!2./!14!/+1!!*+!!*w!bfmvvmfb!w*!!+*!!1+/!21!/,1!:z2/9w<Vw!!t-vyn/!w,V>w!!u)f3ydufvws!f-3fEh)b!njjn!b)hEf3-f!swvfudy3f)u!!w>V,w!/nyv-t!!wV<w4/4z7!2./!13!/+1!!*+!!*w!bzm/vwfV!w*!!-*y!/+w!V1w/!2)333d5f6w<!-!fthvbnn!j,!>)!Eu3ffysuvvusyff3uE!)>!,j!nnbvhtf!-!<w2f4d632)/!1w!V+w!/*y!-*!!wfVvwm/bzw!!.+!!21/", Uh(u, {
            accordionViewExpandIcon: lj(Fj),
            accordionViewCollapseIcon: lj(Fj, !0),
            accordionViewLabelColor: rf,
            accordionViewLabelFont: Fh,
            accordionViewTitleBackground: Kf,
            accordionViewSelectBackground: Bc,
            accordionViewSelectWidth: 3,
            accordionViewSeparatorColor: Z,
            splitViewDividerSize: 1,
            splitViewDividerBackground: Kf,
            splitViewDragOpacity: .5,
            splitViewToggleIcon: {
                width: 16,
                height: 16,
                comps: [{
                    type: _d,
                    rect: [2, 2, 12, 12],
                    background: Fj
                }]
            },
            propertyViewLabelColor: Dh,
            propertyViewLabelSelectColor: rf,
            propertyViewLabelFont: Fh,
            propertyViewExpandIcon: lj(cb),
            propertyViewCollapseIcon: lj(cb, !0),
            propertyViewBackground: Yl,
            propertyViewRowLineVisible: !0,
            propertyViewColumnLineVisible: !0,
            propertyViewRowLineColor: rh,
            propertyViewColumnLineColor: rh,
            propertyViewSelectBackground: Bc,
            listViewLabelColor: Dh,
            listViewLabelSelectColor: rf,
            listViewLabelFont: Fh,
            listViewRowLineVisible: !1,
            listViewRowLineColor: rh,
            listViewSelectBackground: Bc,
            treeViewLabelColor: Dh,
            treeViewLabelSelectColor: rf,
            treeViewLabelFont: Fh,
            treeViewExpandIcon: lj(hk),
            treeViewCollapseIcon: lj(hk, !0),
            treeViewRowLineVisible: !1,
            treeViewRowLineColor: rh,
            treeViewSelectBackground: Bc,
            treeViewDoubleClickToToggle: !0,
            tableViewLabelColor: Dh,
            tableViewLabelSelectColor: rf,
            tableViewLabelFont: Fh,
            tableViewRowLineVisible: !0,
            tableViewColumnLineVisible: !0,
            tableViewRowLineColor: rh,
            tableViewColumnLineColor: rh,
            tableViewSelectBackground: Bc,
            treeTableViewLabelColor: Dh,
            treeTableViewLabelSelectColor: rf,
            treeTableViewLabelFont: Fh,
            treeTableViewExpandIcon: lj(hk),
            treeTableViewCollapseIcon: lj(hk, !0),
            treeTableViewRowLineVisible: !0,
            treeTableViewColumnLineVisible: !0,
            treeTableViewRowLineColor: rh,
            treeTableViewColumnLineColor: rh,
            treeTableViewSelectBackground: Bc,
            tableHeaderLabelColor: Dh,
            tableHeaderLabelFont: Fh,
            tableHeaderColumnLineVisible: !0,
            tableHeaderColumnLineColor: qj,
            tableHeaderBackground: Yl,
            tableHeaderMoveBackground: od,
            tableHeaderInsertColor: Bc,
            tableHeaderSortDescIcon: mf(cb, !0),
            tableHeaderSortAscIcon: mf(cb),
            tabViewTabGap: 1,
            tabViewLabelColor: rf,
            tabViewLabelFont: Fh,
            tabViewTabBackground: Kf,
            tabViewSelectWidth: 3,
            tabViewSelectBackground: Bc,
            tabViewMoveBackground: od,
            tabViewInsertColor: Bc,
            toolbarLabelColor: Dh,
            toolbarLabelSelectColor: rf,
            toolbarLabelFont: Fh,
            toolbarBackground: Yl,
            toolbarSelectBackground: Bc,
            toolbarItemGap: 8,
            toolbarSeparatorColor: Yb
        }, !0);
        var Ms = {
            translateX: 1,
            sortColumn: 1
        },
            Ns = {
                sortable: 1,
                sortOrder: 1,
                sortFunc: 1
            },
            Os = {
                focusData: 1
            },
            Ps = {
                dataModel: 1,
                sortColumn: 1,
                sortFunc: 1,
                visibleFunc: 1,
                rootData: 1,
                rootVisible: 1
            },
            Qs = {
                dataModel: 1,
                sortFunc: 1,
                visibleFunc: 1,
                categorizable: 1
            },
            Rs = function (g, I) {
                I.add(g), g.hasChildren() && g.eachChild(function (N) {
                    Rs(N, I)
                })
            },
            Ss = function (Y, d, n, h, O, y, N, W, S, C, e) {
                var H, x = n.getValueType(C),
                    m = n.getAlign(C);
                if (n.getEnumValues(C)) {
                    var A = n.toEnumLabel(d, C),
                        v = kc || 0,
                        p = 0,
                        X = y,
                        I = u.getTextSize(h, A).width;
                    return H = ii(n.toEnumIcon(d, C)), H && (p = y + kc / 2, "center" === m ? p += (W - (v + I)) / 2 : "right" === m && (p = p + W - (v + I)), Ii(Y, H, p, N + S / 2, C, e), X = p + kc / 2), A != F && (H ? nd(Y, A, h, O, X, N, W - (X - y), S) : nd(Y, A, h, O, y, N, W, S, m)), void 0
                }
                return d = n.formatValue(d), d != F ? x === dg ? (fl(Y, y, N, W, S, d), void 0) : x === hm || !x && El(d) ? (H = ii(d ? tm : He), Ii(Y, H, y + W / 2, N + S / 2, C, e), void 0) : (nd(Y, d, h, O, y, N, W, S, m), void 0) : void 0
            },
            Ts = function (y, I) {
                var e = I.view,
                    S = Bq(y),
                    A = I.column || I.property;
                e.getDataModel().beginTransaction(), I.editor = y, y.info = I, e.setCurrentEditor(y), e.getView().insertBefore(S, e._79O), qp(y, I.editorRect), y.setFocus ? y.setFocus() : hr(y), y.commitValue = function (X, V) {
                    y._17Q && (y = y._17Q), V || e.setValue(I.data, A, y.getValue ? y.getValue() : y.value), y.close && y.close(), yj(S)
                }, A.onEditorCreated && A.onEditorCreated(I)
            },
            Us = function (i, C, S, P, W) {
                var I = $g(i, S),
                    M = C.value,
                    q = C.view,
                    a = W.getValueType(C.data);
                return I.onblur = I.onchange = function () {
                    q.endEditing()
                }, "input" === i ? (M = W.formatValue(M), M != F && (I.value = M), I.onkeydown = function (X) {
                    hd(X) ? q.endEditing() : bj(X) && q.endEditing(!0)
                }, (a === fj || a === Mo) && K(I, Ze, u.numberListener)) : i === nj && P.forEach(function (q) {
                    var G = U.createElement("option");
                    G.innerHTML = W.toEnumLabel(q), G.value = q, W.isEnumEqual(M, q) && (G.selected = !0), sn(I, G)
                }), Ts(I, C), I
            },
            Vs = O.widget = {},
            Ws = function (P, x, N) {
                yc(Y + ".widget." + P, x, N)
            };
        Uh(fb, {
            ms_value: function (m) {
                m.getValue = function (p) {
                    var u = this.getItemById(p),
                        $ = u.element;
                    return dk($) ? $ : $ ? $.getValue ? $.getValue() : $.value : u.selected
                }, m.setValue = function (M, i) {
                    var U = this.getItemById(M);
                    if (U) {
                        var o = U.element;
                        o && !dk(o) ? o.setValue ? o.setValue(i) : o.value = i : El(i) ? (U.selected = i, this.iv()) : (U.element = i, this.iv())
                    }
                }, m.v = function (b, a) {
                    var z = this;
                    if (2 === arguments.length) z.setValue(b, a);
                    else {
                        if (!xl(b)) return z.getValue(b);
                        for (var P in b) z.setValue(P, b[P])
                    }
                    return z
                }
            }, _46o: function (h) {
                h._icon = F, h._accessType = F, h._valueType = F, h._editable = !1, h._batchEditable = !0, h._align = nq, h._nullable = !0, h._emptiable = !1, h.setParent = jm, h.formatValue = function (t) {
                    var Q = this,
                        m = Q._valueType;
                    return Q.getEnumValues() ? Q.toEnumLabel(t) : m === hm ? !!t : t != F && m === fj ? A(t) : t
                }, h.setEnum = function (H, x, S, l, D, r, b) {
                    var e = this;
                    H && !ip(H) && H.values && (l = H.editable, S = H.icons, x = H.labels, D = H.strict, r = H.maxHeight, b = H.dropDownWidth, H = H.values), Xo(H) && (H = H._as), Xo(x) && (x = x._as), Xo(S) && (S = S._as), e._enumValues = H, e._enumLabels = x, e._enumIcons = S, e._enumEditable = l, e._enumStrict = D == F ? !0 : D, e._enumMaxHeight = r, e._enumDropDownWidth = b, H && H.length && Bp(H[0]) && (e._valueType = Mo), e.fp("enum", !1, !0)
                }, h.getEnumDropDownWidth = function () {
                    return this._enumDropDownWidth
                }, h.getEnumMaxHeight = function () {
                    return this._enumMaxHeight
                }, h.isEnumEditable = function () {
                    return this._enumEditable
                }, h.getEnumValues = function () {
                    return this._enumValues
                }, h.getEnumLabels = function () {
                    return this._enumLabels
                }, h.getEnumIcons = function () {
                    return this._enumIcons
                }, h.isEnumStrict = function () {
                    return this._enumStrict
                }, h.isEnumEqual = function (e, x) {
                    return this._enumStrict ? e === x : e == x
                }, h.toEnumLabel = function (U, B) {
                    var w = this,
                        C = w.getEnumValues(B),
                        Z = w.getEnumLabels(B);
                    if (C && Z)
                        for (var i = 0; i < C.length; i++)
                            if (w.isEnumEqual(U, C[i])) return Z[i];
                    return U
                }, h.toEnumIcon = function (f, v) {
                    var u = this,
                        z = u.getEnumValues(v),
                        d = u.getEnumIcons(v);
                    if (z && d)
                        for (var Y = 0; Y < z.length; Y++)
                            if (u.isEnumEqual(f, z[Y])) return d[Y];
                    return Z
                }
            }, _45o: function (d) {
                d._87o = function (M, E, D, $, Z, T) {
                    if (M) {
                        var H = this,
                            e = H._90I,
                            t = dd(1);
                        H._columnLineVisible && (Z -= 1), H._rowLineVisible && (T -= 1), 0 >= Z || 0 >= T || (H._90I || (e = H._90I = {}), e[E] || (e[E] = new xr), qp(t, H.tx() + D, H.ty() + $, Z, T), sn(t, M), H._view.insertBefore(t, H._79O), M.onParentAdded && M.onParentAdded(t), e[E].add(t))
                    }
                }, d._76o = function () {
                    var t = this,
                        v = t._90I;
                    if (v) {
                        for (var G in v) v[G].each(function ($) {
                            yj($)
                        });
                        delete t._90I
                    }
                }, d._77o = function (Y) {
                    var Q = this;
                    if (Q._90I) {
                        var C = Q._90I[Y];
                        C && (C.each(function (O) {
                            yj(O)
                        }), delete Q._90I[Y])
                    }
                }
            }, _47o: function (g) {
                g.getValue = function (P, p) {
                    return p.getValue ? p.getValue(P, p, this) : jq(P, p.getAccessType(), p.getName())
                }, g.setValue = function (f, _, I) {
                    if (_.isEmptiable(f) || "" !== I || (I = Z), _.isNullable(f) || I != F) {
                        var b = this,
                            j = _.getName(f),
                            k = _.getAccessType(f),
                            y = _.getValueType(f);
                        y === fj && dk(I) ? I = Zb(I) : y === Mo && dk(I) ? I = parseFloat(I) : y === hm && dk(I) && (I = "true" === I), b._batchEditable && _._batchEditable && b.isSelected(f) ? b.sm().each(function (x) {
                            _.setValue ? _.setValue(x, _, I, b) : Di(x, k, j, I)
                        }) : _.setValue ? _.setValue(f, _, I, b) : Di(f, k, j, I)
                    }
                }, g.setCurrentEditor = function (y) {
                    this.endEditing(), this._currentEditor = y, this.redraw()
                }, g.isEditing = function (c, O) {
                    var L = this,
                        D = L._currentEditor;
                    if (!D) return !1;
                    if (O) {
                        var $ = D.info;
                        return $ ? ($.column || $.property) === O && $.data === c : !1
                    }
                    return !0
                }, g.endEditing = function (J) {
                    var m = this,
                        q = m._currentEditor;
                    q && (delete m._currentEditor, q.commitValue && q.commitValue(q.info, J), m.redraw(), m.getDataModel().endTransaction())
                }, g.beginEditing = function (o) {
                    this.endEditing();
                    var U = this,
                        g = o.column || o.property;
                    if (g.beginEditing) g.beginEditing(o);
                    else {
                        var b = o.data,
                            D = o.value,
                            n = U.getSelectBackground(b),
                            G = g.getEnumValues(b),
                            v = g.getSlider(b),
                            R = g.getColorPicker(b);
                        if (v) {
                            var A = Wn(Vs.Slider, v);
                            return A.setValue(D), A.getView().onblur = function () {
                                U.endEditing()
                            }, A.isInstant() && (A.onValueChanged = function () {
                                U.setValue(b, g, A.getValue())
                            }), Ts(A, o), void 0
                        }
                        if (R || g.getValueType(b) === dg) {
                            var f = Wn(Vs.ColorPicker, R);
                            return f.setValue(D), f.onClosed = function () {
                                U.endEditing()
                            }, f.isInstant() && (f.onValueChanged = function (x, Z) {
                                U.setValue(b, g, Z)
                            }), Ts(f, o), f.open(), void 0
                        }
                        if (G) {
                            if (Vs.ComboBox) {
                                var Q = new Vs.ComboBox;
                                Q.setValue(D), Q.setValues(G), Q.setLabels(g.getEnumLabels(b)), Q.setIcons(g.getEnumIcons(b)), Q.setEditable(g.isEnumEditable(b)), Q.setStrict(g.isEnumStrict(b)), Q.setMaxHeight(g.getEnumMaxHeight(b)), Q.setDropDownWidth(g.getEnumDropDownWidth(b)), Q.onClosed = function () {
                                    U.endEditing()
                                }, Ts(Q, o), Q.open()
                            } else Us(nj, o, n, G, g);
                            return
                        }
                        var w = g.getValueType(b);
                        if (w === hm || El(D)) return U.setValue(b, g, !D), void 0;
                        if (g.getItemEditor(b)) {
                            var r = gp(g.getItemEditor(b)),
                                h = new r(b, g, U, o),
                                J = h.getView();
                            return J._17Q = h, h.setValue(D), uj(J), Ts(J, o), h.editBeginning && h.editBeginning(), void 0
                        }
                        Us("input", o, n, F, g)
                    }
                }
            }, _44o: function (D) {
                D.init = function (R) {
                    var Q = this,
                        v = Q.th = new jt(R),
                        C = Q._view = ve(1, Q);
                    Q.tv = Q._tableView = R, sn(C, v.getView()), sn(C, R.getView()), v.mp(function (g) {
                        g.property === Hh && Q.iv()
                    }), Q.iv()
                }, D.getTableView = function () {
                    return this.tv
                }, D.getTableHeader = function () {
                    return this.th
                }, D.getDataModel = function () {
                    return this.tv.dm()
                }, D.getColumnModel = function () {
                    return this.tv.getColumnModel()
                }, D.setColumns = function (D) {
                    this.tv.setColumns(D)
                }, D.addColumns = function (P) {
                    this.tv.addColumns(P)
                }, D.endEditing = function () {
                    this.tv.endEditing()
                }, D.validateImpl = function () {
                    var W = this,
                        H = W.th,
                        P = zp(H),
                        o = {
                            x: 0,
                            y: 0,
                            width: W.getWidth(),
                            height: P
                        };
                    qp(H, o), o.y = P, o.height = q(0, W.getHeight() - P), qp(W.tv, o)
                }
            }, ms_vs: function (y) {
                y._41o = function () {
                    return this._29I.height < this._59I
                }, y._43o = function () {
                    var r = this;
                    r._41o() && (r._58I || (cd(function () {
                        r._94O()
                    }, Lg), r.iv()), r._58I = new Date)
                }, y._94O = function () {
                    var Q = this;
                    if (Q._58I) {
                        var o = new Date;
                        o.getTime() - Q._58I.getTime() >= Lg ? (delete Q._58I, Q.iv()) : cd(function () {
                            Q._94O()
                        }, Lg)
                    }
                }, y._93I = function () {
                    var X = this,
                        O = X._27I;
                    if (X._58I || !X._autoHideScrollBar) {
                        O || sn(X._79O, O = X._27I = dd());
                        var J = X._29I,
                            $ = J.height,
                            v = X._59I,
                            m = X.getScrollBarSize(),
                            U = J.width - m - 2,
                            e = $ * (-X.ty() / v),
                            I = $ * ($ / v),
                            E = O.style;
                        v > $ ? (un > I && (e = e + I / 2 - un / 2, 0 > e && (e = 0), e + un > $ && (e = $ - un), I = un), E.visibility = Pd, E.background = X.getScrollBarColor(), E.borderRadius = m / 2 + oe, qp(O, U, e, m, I)) : E.visibility = fc
                    } else O && (O.style.visibility = fc)
                }
            }, ms_hs: function (e) {
                e._40o = function () {
                    return this._29I.width < this._91I
                }, e._42o = function () {
                    var e = this;
                    e._40o() && (e._95O || (cd(function () {
                        e._94I()
                    }, Lg), e.iv()), e._95O = new Date)
                }, e._94I = function () {
                    var v = this;
                    if (v._95O) {
                        var o = new Date;
                        o.getTime() - v._95O.getTime() >= Lg ? (delete v._95O, v.iv()) : cd(function () {
                            v._94I()
                        }, Lg)
                    }
                }, e._92I = function () {
                    var C = this,
                        t = C._28I;
                    if (C._95O || !C._autoHideScrollBar) {
                        t || sn(C._79O, t = C._28I = dd());
                        var a = C._29I,
                            R = a.width,
                            E = C._91I,
                            M = C.getScrollBarSize(),
                            r = a.height - M - 2,
                            H = R * (-C.tx() / E),
                            O = R * (R / E),
                            X = t.style;
                        E > R ? (un > O && (H = H + O / 2 - un / 2, 0 > H && (H = 0), H + un > R && (H = R - un), O = un), X.visibility = Pd, X.background = C.getScrollBarColor(), X.borderRadius = M / 2 + oe, qp(t, H, r, O, M)) : X.visibility = fc
                    } else t && (t.style.visibility = fc)
                }
            }
        }), _c(tm, ee(16, 16, [{
            type: Tq,
            rect: [1, 1, 14, 14],
            background: Bc
        }, {
            type: Xe,
            rect: [1, 1, 14, 14],
            width: 1,
            color: Em
        }, {
            type: bl,
            points: [13, 3, 7, 12, 4, 8],
            borderWidth: 2,
            borderColor: "#FFF"
        }])), _c(He, ee(16, 16, {
            type: Xe,
            rect: [1, 1, 14, 14],
            width: 1,
            color: Em
        })), _c(kj, ee(16, 16, [{
            type: Eq,
            rect: [2, 2, 12, 12],
            borderWidth: 1,
            borderColor: Em,
            background: "#FFF"
        }, {
            type: Eq,
            rect: [4, 4, 8, 8],
            background: Bc
        }])), _c(yb, ee(16, 16, {
            type: Eq,
            rect: [2, 2, 12, 12],
            borderWidth: 1,
            borderColor: Em
        })), fb._15Q = function (h) {
            h._29I = nl, h._59I = 0, h._91I = 0, h._5o = function (m) {
                var x = this;
                x._30I = new xr, x._rows = new xr, x._rowMap = {}, x._31I = 0, x._14I = 0, x._view = ve(1, x), x._canvas = uo(x._view), sn(x._view, x._79O = dd()), x.dm(m ? m : new jn)
            }, h.getCheckIcon = function (s) {
                var o = this.sm(),
                    V = o.co(s);
                return o.sg() ? ii(V ? kj : yb) : ii(V ? tm : He)
            }, h.checkData = function (V) {
                var t = this.sm(),
                    j = t.co(V);
                t.sg() && j || (this._32o = 1, j ? t.rs(V) : t.as(V), delete this._32o)
            }, h.getDataAt = function (i) {
                i.target && (i = this.lp(i));
                var Z = T(i.y / this._rowHeight),
                    P = this._rows;
                return 0 > Z || Z >= P.size() ? F : P.get(Z)
            }, h.onDataDoubleClicked = function () { }, h.onDataClicked = function () { }, h.adjustTranslateX = function () {
                return 0
            }, h.adjustTranslateY = function (E) {
                var z = this.getHeight() - this._59I;
                return z > E && (E = z), E > 0 ? 0 : A(E)
            }, h.onPropertyChanged = function (Y) {
                var E = this,
                    o = Y.property;
                Ps[o] ? E.ivm() : Os[o] || E.redraw(), o === gq ? E._42o() : o === wb && E._43o()
            }, h.getLabel = function (V) {
                return V.toLabel()
            }, h.getLabelFont = function () {
                return this._labelFont
            }, h.getLabelColor = function (w) {
                var x = this;
                if (x.isCheckMode()) {
                    if (x._focusData === w) return x._labelSelectColor
                } else if (x.isSelected(w)) return x._labelSelectColor;
                return x._labelColor
            }, h.getStartRowIndex = function () {
                return this._31I
            }, h.getEndRowIndex = function () {
                return this._14I
            }, h.getRowDatas = function () {
                return this._rows
            }, h.getRowIndex = function (E) {
                return this._rowMap[E._id]
            }, h.getRowSize = function () {
                return this._rows.size()
            }, h.getViewRect = function () {
                return Pm(this._29I)
            }, h.isVisible = function (T) {
                return this._visibleFunc ? this._visibleFunc(T) : !0
            }, h.getCurrentSortFunc = function () {
                return this._sortFunc
            }, h.setDataModel = function (P) {
                var a = this,
                    O = a._dataModel,
                    B = a._selectionModel;
                O !== P && (O && (O.umm(a.handleDataModelChange, a), O.umd(a.handleDataPropertyChange, a), O.umh(a.handleHierarchyChange, a), B || O.sm().ums(a.handleSelectionChange, a)), a._dataModel = P, P.mm(a.handleDataModelChange, a), P.md(a.handleDataPropertyChange, a), P.mh(a.handleHierarchyChange, a), B ? B._21I(P) : P.sm().ms(a.handleSelectionChange, a), a.fp("dataModel", O, P))
            }, h.validateModel = function () {
                var s = this;
                s._rows.clear(), s._rowMap = {}, s.buildChildren(s._dataModel._roots);
                var V = s._rows = s._rows.toList(s.isVisible, s),
                    _ = 0,
                    Q = s.getCurrentSortFunc(),
                    L = V.size();
                for (Q && V.sort(Q); L > _; _++) s._rowMap[V.get(_)._id] = _
            }, h.buildChildren = function (w) {
                var t = this;
                w.each(function (v) {
                    t._rows.add(v), t.buildChildren(v._children)
                })
            }, h.handleDataModelChange = function () {
                this.ivm()
            }, h.handleDataPropertyChange = function (x) {
                "parent" === x.property ? this.ivm() : this.invalidateData(x.data)
            }, h.handleHierarchyChange = function () {
                this.ivm()
            }, h.handleSelectionChange = function (s) {
                s.datas.each(this.invalidateData, this), this.onSelectionChanged(s)
            }, h.onSelectionChanged = function (m) {
                var p = this,
                    X = p.sm();
                !p.isAutoMakeVisible() || 1 !== X.size() || "set" !== m.kind && "append" !== m.kind || p._32o || p.makeVisible(X.ld())
            }, h.handleBackgroundClick = function (I) {
                jj(I) && !this.isCheckMode() && this.sm().cs()
            }, h.makeVisible = function (e) {
                e && (this._23I = e, this.iv())
            }, h.scrollToIndex = function (Q) {
                var p = this,
                    V = p._29I,
                    T = V.height,
                    q = p._rowHeight,
                    y = q * Q;
                Q >= 0 && Q < p._rows.size() && T > 0 && (y + q > V.y + T ? p.ty(-y + T - q) : y < V.y && p.ty(-y))
            }, h.autoScroll = function (r, w) {
                var t = this,
                    c = t._rowHeight,
                    I = c,
                    O = c / 4,
                    W = t._29I,
                    S = t.lp(r),
                    D = {
                        x: t.tx(),
                        y: t.ty()
                    };
                return c > 0 && W && (S.x - W.x < I ? t.translate(O, 0) : W.x + W.width - S.x < I && t.translate(-O, 0), S.y - W.y < I ? t.translate(0, O) : W.y + W.height - S.y < I && t.translate(0, -O)), D.x = t.tx() - D.x, D.y = t.ty() - D.y, w && (w.x += D.x, w.y += D.y), D
            }, h.getTopRowOrderSelection = function () {
                var D = this.sm().getTopSelection(),
                    g = {},
                    S = new xr;
                return D.each(function (f) {
                    g[f._id] = f
                }), this._rows.each(function (e) {
                    g[e._id] && S.add(e)
                }), S
            }, h.getRowOrderSelection = function () {
                var H = new xr;
                return this._rows.each(function (X) {
                    this.isSelected(X) && H.add(X)
                }, this), H
            }, h.ivm = function () {
                this.invalidateModel()
            }, h.invalidateModel = function () {
                var I = this;
                I._96I || (I._96I = 1, I._32I = 1, delete I._24I), I.iv()
            }, h.redraw = function () {
                var F = this;
                F._32I || (F._32I = 1, delete F._24I, F.iv())
            }, h.invalidateData = function (A) {
                var n = this;
                Xf ? n.redraw() : n._32I || (n._24I || (n._24I = {}), n._24I[A._id] = A, n.iv())
            }, h.getFocusData = function () {
                return this._focusData
            }, h.setFocusDataById = function (h) {
                this.setFocusData(this.dm().getDataById(h))
            }, h.setFocusData = function ($) {
                var q = this,
                    J = q._focusData;
                J !== $ && (q._focusData = $, q.fp("focusData", J, $), J && q.invalidateData(J), $ && (q.invalidateData($), q.isAutoMakeVisible() && q.makeVisible($)))
            }, h.drawRowBackground = function (S, W, w, L, Z, c, j) {
                var K = this,
                    T = K.isCheckMode();
                (W === K._focusData && T || w && !T) && fl(S, L, Z, c, j, K.getSelectBackground(W))
            }, h.drawData = function (q, C, o) {
                var y = this,
                    e = y._rowHeight,
                    F = e * o,
                    U = y._29I,
                    f = U.x,
                    d = U.width;
                q.save(), q.beginPath(), q.rect(f, F, d, e), q.clip(), y._87o(y.drawRow(q, C, y.isSelected(C), f, F, d, e), o, f, F, d, e), q.restore(), y._rowLineVisible && fl(q, f, F + e - 1, d, 1, y._rowLineColor)
            }, h._12I = function (t) {
                var e = this,
                    F = e._31I,
                    y = e._29I,
                    j = y.x,
                    T = y.y,
                    _ = y.width,
                    c = y.height;
                for (t.beginPath(), t.rect(j, T, _, c), t.clip(), t.clearRect(j, T, _, c), e._76o(), e._93db(t); F < e._14I; F++) e.drawData(t, e._rows.get(F), F);
                e._92db(t)
            }, h._13I = function (g) {
                for (var l, n = this, y = n._rowHeight, E = n._29I, p = E.x, D = E.width, W = n._31I, h = n._30I; W < n._14I; W++) l = n._rows.get(W), n._24I[l._id] && h.add({
                    data: l,
                    index: W
                });
                h.isEmpty() || (g.beginPath(), h.each(function (T) {
                    g.rect(p, T.index * y, D, y)
                }), g.clip(), h.each(function (n) {
                    g.clearRect(p, n.index * y, D, y)
                }), h.each(function (Y) {
                    n._77o(Y.index)
                }), n._93db(g), h.each(function (U) {
                    n.drawData(g, U.data, U.index)
                }), n._92db(g), h.clear())
            }, h.preValidateModel = function () {
                this.endEditing && this.endEditing()
            }, h.validateImpl = function () {
                var r = this,
                    c = r._canvas,
                    p = r.getWidth(),
                    B = r.getHeight(),
                    k = r._rowHeight,
                    v = r._32I;
                (p !== c.clientWidth || B !== c.clientHeight) && (Bn(c, p, B), v = 1);
                var I = _ && !Ad;
                r._96I && !I && (r.preValidateModel(), r.validateModel());
                var W = r._29I,
                    $ = {
                        x: -r.tx(),
                        y: -r.ty(),
                        width: p,
                        height: B
                    },
                    V = r._rows.size(),
                    C = Wd(c),
                    E = r._23I;
                v || jg($, W) || (v = 1), r._29I = $, r._59I = V * k, r._31I = T($.y / k), r._14I = s(($.y + $.height) / k), r._31I < 0 && (r._31I = 0), r._14I > V && (r._14I = V), r._99I && v && r._99I(), (r._40o() || r._41o()) && (r._59I += r.getScrollBarSize(), r._99I && v && (r._91I += r.getScrollBarSize())), tf(C, r.tx(), r.ty(), 1), v ? r._12I(C) : r._24I && r._13I(C), r._93I(), r._92I(), C.restore(), r._32I = r._24I = r._96I = F, E && (r.scrollToIndex(r.getRowIndex(E)), delete r._23I), r.tx(r.tx()), r.ty(r.ty())
            }, h.canHandleSelectMode = function () {
                return !0
            }
        }, fb._48o = function (L) {
            L._rootVisible = !0, L._rootData = F, L._35o = function () {
                this._expandMap = {}, this._levelMap = {}
            }, L.validateModel = function () {
                var $ = this,
                    U = $._rootData;
                $._rows.clear(), $._levelMap = {}, $._rowMap = {}, $._currentLevel = 0, U ? $._rootVisible ? $.isVisible(U) && $.buildData(U) : $.buildChildren(U) : $.buildChildren(), delete $._currentLevel
            }, L.buildData = function (K) {
                var J = this,
                    n = K._id,
                    b = J._rows;
                J._rowMap[n] = b.size(), b.add(K), J._levelMap[n] = J._currentLevel, J.isExpanded(K) && (J._currentLevel++, J.buildChildren(K), J._currentLevel--)
            }, L.buildChildren = function (u) {
                var O = this,
                    a = u ? u._children : O._dataModel._roots,
                    k = O.getCurrentSortFunc();
                k && O.isChildrenSortable(u) ? a.toList(O.isVisible, O).sort(k).each(O.buildData, O) : a.each(function (N) {
                    O.isVisible(N) && O.buildData(N)
                })
            }, L.getLevel = function (i) {
                return this._levelMap[i._id]
            }, L.getToggleIcon = function (s) {
                var G = this,
                    X = G._loader,
                    q = G._collapseIcon;
                return X && !X.isLoaded(s) ? q : s.hasChildren() ? G.isExpanded(s) ? G._expandIcon : q : F
            }, L.isCheckMode = function () {
                return this._checkMode != F
            }, L.isChildrenSortable = function () {
                return !0
            }, L.handleDataModelChange = function (p) {
                var h = this;
                p.kind === Ce ? delete h._expandMap[p.data._id] : p.kind === Tg && (h._expandMap = {}), h.ivm()
            }, L.toggle = function (I) {
                var C = this;
                C.isExpanded(I) ? C.collapse(I) : C.expand(I)
            }, L.isExpanded = function (W) {
                return 1 === this._expandMap[W._id]
            }, L.expand = function (Q) {
                var P = this,
                    H = P._loader;
                P.isExpanded(Q) || (H && !H.isLoaded(Q) && H.load(Q), P._expandMap[Q._id] = 1, P.ivm(), P.onExpanded(Q))
            }, L.onExpanded = function () { }, L.collapse = function (u) {
                var f = this;
                f.isExpanded(u) && (delete f._expandMap[u._id], f.ivm(), f.onCollapsed(u))
            }, L.onCollapsed = function () { }, L.expandAll = function (V) {
                if (V) this.expand(V), V.eachChild(function (y) {
                    this.expandAll(y)
                }, this);
                else {
                    var L = this;
                    L._dataModel.each(function (T) {
                        T.hasChildren() && (L._expandMap[T._id] = 1)
                    }), L.ivm()
                }
            }, L.collapseAll = function () {
                this._expandMap = {}, this.ivm()
            }, L.makeVisible = function (U) {
                if (U) {
                    var S = this;
                    if (!S._rootData || U.isDescendantOf(S._rootData)) {
                        for (var i = U._parent; i;) S.expand(i), i = i._parent;
                        S._23I = U, S.iv()
                    }
                }
            }, L.checkData = function (I) {
                var T, V = this,
                    q = V._checkMode,
                    S = V.sm(),
                    J = S.co(I);
                if (!S.sg() || !J) {
                    if (V._32o = 1, q === lp) J ? S.rs(I) : S.as(I);
                    else if (q === Wf) T = new xr(I), T.addAll(I._children);
                    else if ("descendant" === q) T = new xr, Rs(I, T);
                    else if ("all" === q && (T = new xr, Rs(I, T), !J))
                        for (var _ = I._parent; _;) T.add(_), _ = _._parent;
                    T && (J ? S.rs(T) : S.as(T)), delete V._32o
                }
            }, L.drawTree = function (F, P, w, g, m, B, C) {
                var Z = this,
                    l = Z._indent,
                    k = Z._levelMap[P._id],
                    t = Z.getIconWidth(P),
                    U = ii(Z.getToggleIcon(P));
                U ? (g += l * k, Ii(F, U, g + l / 2, m + C / 2, P, Z), g += l) : g += l * (k + 1), Z._checkMode && (Ii(F, Z.getCheckIcon(P), g + l / 2, m + C / 2, P, Z), g += l), Z.drawIcon(F, P, g, m, t, C), Z.drawLabel(F, P, g + t, m, C)
            }
        }, fb._14Q = function (p) {
            p.getIcon = function (E) {
                return E.getIcon()
            }, p.getIconWidth = function (K) {
                return this.getIcon(K) ? this._indent : 0
            }, p.drawIcon = function (Z, Y, $, S, L, s) {
                if (L) {
                    var p = this,
                        j = p.getBodyColor(Y),
                        b = ii(p.getIcon(Y), j);
                    b && (s -= p.isRowLineVisible() ? 1 : 0, qk(Z, b, Mg, $, S, L, s, Y, p, j), Ie(Z, p.getBorderColor(Y), $, S, L, s))
                }
            }, p.drawLabel = function (U, b, B, H, C) {
                var s = this;
                nd(U, s.getLabel(b), s.getLabelFont(b), s.getLabelColor(b), B, H, 0, C)
            }
        }, fb._50o = function (r) {
            r._98I = function () {
                var Z = this,
                    b = Z._39o = new jn;
                Z._60I = new xr, b.mm(Z._17o, Z), b.md(Z._18o, Z), b.mh(Z._19o, Z)
            }, r.setColumns = function (n) {
                this._39o.clear(), this.addColumns(n)
            }, r.addColumns = function (b) {
                var U = this._39o;
                b.forEach(function (h) {
                    if (!(h instanceof Ys)) {
                        var e = gp(h.className);
                        h = Wn(e ? e : Ys, h)
                    }
                    U.add(h)
                })
            }, r.onColumnClicked = function () { }, r.onCheckColumnClicked = function () { }, r._3Q = function (s) {
                for (var A, i = 0, L = this._60I, Y = L.size(); Y > i; i++)
                    if (A = L.get(i), A.column === s) return A;
                return F
            }, r.getColumnAt = function (H) {
                var b = this._4Q(H);
                return b ? b.column : F
            }, r._4Q = function (T) {
                for (var X = this, b = T.target ? X.lp(T).x : T.x, o = X._60I, L = 0; L < o.size(); L++) {
                    var l = o.get(L),
                        U = l.startX;
                    if (b >= U && b < U + l.column.getWidth()) return l
                }
                return F
            }, r.getToolTip = function (T) {
                var h = this,
                    t = h.getDataAt(T),
                    j = h.getColumnAt(T);
                return t && j ? j.getToolTip(t, h) : F
            }, r.adjustTranslateX = function (Z) {
                var h = this.getWidth() - this._91I;
                return h > Z && (Z = h), Z > 0 ? 0 : A(Z)
            }, r._99I = function () {
                var p = this,
                    Q = p._29I,
                    e = p._60I;
                e.clear(), p._91I = 0, p._39o._roots.each(function (f) {
                    if (f.isVisible()) {
                        var L = p._91I + f.getWidth();
                        p._91I <= Q.x + Q.width && L >= Q.x && e.add({
                            column: f,
                            startX: p._91I
                        }), p._91I = L
                    }
                })
            }, r.drawData = function (i, A, $) {
                var W = this,
                    V = W._rowHeight,
                    e = V * $,
                    c = W.isSelected(A),
                    l = W._29I,
                    y = l.x,
                    b = l.width;
                W.drawRowBackground(i, A, c, y, e, b, V), W._60I.each(function (S) {
                    var F = S.column,
                        g = S.startX,
                        E = F.getWidth();
                    E > 0 && !W.isEditing(A, F) && (i.save(), i.beginPath(), i.rect(g, e, E, V), i.clip(), W._87o(W.drawCell(i, A, c, F, g, e, E, V), $, g, e, E, V), W._columnLineVisible && fl(i, g + E - 1, e, 1, V, W._columnLineColor), i.restore())
                }), W._rowLineVisible && fl(i, y, e + V - 1, b, 1, W._rowLineColor)
            }, r.drawCell = function (H, O, X, $, b, c, D, a) {
                var P = this;
                if ($.drawCell) return $.drawCell(H, O, X, $, b, c, D, a, P);
                var U = P.getValue(O, $);
                Ss(H, U, $, P.getLabelFont(O, $, U), P.getLabelColor(O, $, U), b, c, D, a, O, P)
            }, r.getColumnModel = function () {
                return this._39o
            }, r._17o = function () {
                this.redraw()
            }, r._18o = function (R) {
                var v = this;
                R.data === v._sortColumn && Ns[R.property] ? v.ivm() : (v._42o(), v.redraw())
            }, r._19o = function () {
                this.redraw()
            }, r.getCurrentSortFunc = function () {
                var a = this,
                    I = a._sortColumn;
                if (I && I.isSortable()) {
                    var w = I.getSortFunc(),
                        u = Sh === I.getSortOrder() ? 1 : -1;
                    return w || (w = Sd),
                        function (Q, v) {
                            return w.call(a, a.getValue(Q, I), a.getValue(v, I), Q, v) * u
                        }
                }
                return a._sortFunc
            }, r.isCellEditable = function (H, b, m) {
                return b.isEditable() && this.isEditable() ? b.isCellEditable ? b.isCellEditable(H, b, m, this) : !0 : !1
            }, r._37O = function (x, a) {
                if (jj(a))
                    for (var H = this, S = H.lp(a), z = H._60I, J = H._rowHeight, R = H._29I, E = R.x, d = R.y, f = R.width, o = R.height, k = 0; k < z.size(); k++) {
                        var Q = z.get(k),
                            B = Q.startX,
                            y = Q.column,
                            q = y.getWidth();
                        if (y !== H._31o && y !== H._4o && S.x >= B && S.x < B + q && H.isCellEditable(x, y, a)) {
                            var O = {
                                x: B,
                                y: H.getRowIndex(x) * J,
                                width: q,
                                height: J
                            },
                                Y = {
                                    x: O.x + H.tx(),
                                    y: O.y + H.ty(),
                                    width: O.width,
                                    height: O.height
                                },
                                c = 0,
                                l = 0;
                            return O.x < E ? c = O.x - E : O.x + O.width > E + f && (c = O.x + O.width - E - f), c && (H.tx(H.tx() - c), Y.x -= c), O.y < d ? l = O.y - d : O.y + J > d + o && (l = O.y + J - d - o), l && (H.ty(H.ty() - l), Y.y -= l), H.beginEditing({
                                data: x,
                                column: y,
                                value: H.getValue(x, y),
                                event: a,
                                rect: O,
                                editorRect: Y,
                                view: H
                            }), void 0
                        }
                    }
            }
        }, Vs.BaseItemEditor = function (x, S, v, m) {
            this._data = x, this._column = S, this._master = v, this._editInfo = m
        }, Ws("BaseItemEditor", o, {
            ms_ac: ["data", "column", "master", "editInfo"],
            editBeginning: function () { }, getView: function () { }, getValue: function () { }, setValue: function () { }
        });
        var Xs = O.Tab = function () {
            fi(Xs, this)
        };
        ki("Tab", Qp, {
            ms_ac: ["view", "closable", "disabled", "visible"],
            _icon: F,
            _closable: !1,
            _disabled: !1,
            _visible: !0,
            setParent: jm
        });
        var Ys = O.Column = function () {
            fi(Ys, this)
        };
        ki("Column", Qp, {
            _46o: 1,
            ms_ac: ["accessType", "valueType", Pd, Me, Zh, ul, "align", dg, "sortOrder", go, "sortable", "clickable", "nullable", "emptiable", "slider", "colorPicker", "itemEditor"],
            _visible: !0,
            _width: 80,
            _sortOrder: Sh,
            _sortFunc: F,
            _sortable: !0,
            _clickable: !0,
            setWidth: function (p) {
                16 > p && (p = 16);
                var D = this._width;
                this._width = p, this.fp(ul, D, p)
            }, getToolTip: function (L, R) {
                return this.formatValue(R.getValue(L, this))
            }
        });
        var Zs = O.Property = function () {
            fi(Zs, this)
        };
        ki("Property", Qp, {
            _46o: 1,
            ms_ac: ["accessType", "valueType", Me, Zh, "categoryName", dg, "align", "nullable", "emptiable", "slider", "itemEditor", "colorPicker"],
            _categoryName: F,
            getToolTip: function (F, t, R) {
                var $ = this;
                return t ? $.formatValue(R.getValue(F, $)) : R.getPropertyName($)
            }
        }), Vs.AccordionView = function () {
            var X = this;
            X._20o = {}, X._21o = new xr, X._10o = F, X._9o = F, X._11o = F, X._view = ve(0, X), X.iv()
        }, Ws("AccordionView", o, {
            ms_v: 1,
            ms_fire: 1,
            ms_ac: [Zi, xj, "titleHeight", fe, Vm, "titleBackground", "selectWidth", op, "orientation", "separatorColor"],
            _expandIcon: u.accordionViewExpandIcon,
            _collapseIcon: u.accordionViewCollapseIcon,
            _titleHeight: Jk,
            _labelColor: u.accordionViewLabelColor,
            _labelFont: u.accordionViewLabelFont,
            _titleBackground: u.accordionViewTitleBackground,
            _selectBackground: u.accordionViewSelectBackground,
            _selectWidth: u.accordionViewSelectWidth,
            _orientation: "v",
            _separatorColor: u.accordionViewSeparatorColor,
            onPropertyChanged: function () {
                this.iv()
            }, getView: function () {
                return this._view
            }, getTitles: function () {
                return this._21o
            }, getCurrentTitle: function () {
                return this._10o
            }, add: function (x, p, P, g) {
                var q = this,
                    C = dd(),
                    b = {
                        content: p,
                        div: C,
                        canvas: uo(C),
                        icon: g
                    };
                if (q._20o[x]) throw x + " already exists";
                var J = b.downEventFunc = function (Y) {
                    Qc(Y)
                },
                    d = b.upEventFunc = function (F) {
                        Qc(F), jj(F) && (q._10o === x ? q.collapse() : q.expand(x))
                    };
                [Xd, fp].forEach(function (m) {
                    K(C, m, J)
                }), [Sj, cj].forEach(function (L) {
                    K(C, L, d)
                }), C.style.cursor = Zk, sn(q._view, C), q._20o[x] = b, q._21o.add(x), P && q.expand(x), q.iv()
            }, remove: function (y) {
                var i = this,
                    K = i._20o[y];
                if (K) {
                    var n = K.div;
                    yj(n), [Xd, fp].forEach(function (Y) {
                        b(n, Y, K.downEventFunc)
                    }), [Sj, cj].forEach(function (p) {
                        b(n, p, K.upEventFunc)
                    }), delete i._20o[y], i._21o.remove(y), i.iv()
                }
            }, clear: function () {
                var D = this;
                D._21o.toArray().forEach(D.remove, D), D._20o = {}, D._21o.clear(), D.iv()
            }, isExpanded: function (N) {
                return this._10o === N
            }, expand: function (s) {
                var R = this;
                R._20o[s] && R._10o !== s && (R._10o = s, R.onExpanded(s), R.iv())
            }, onExpanded: function () { }, collapse: function () {
                var w = this;
                w._10o && (w.onCollapsed(w._10o), delete w._10o, w.iv())
            }, onCollapsed: function () { }, initCanvas: function (X, f, C) {
                Bn(X, f, C);
                var i = Wd(X);
                return tf(i, 0, 0, 1), i.clearRect(0, 0, f, C), i
            }, drawTitle: function (V, C, A, f, r) {
                var o = this,
                    i = ii(r.icon),
                    R = o.isExpanded(C),
                    w = o._titleHeight,
                    S = o._titleBackground,
                    O = o._selectWidth,
                    u = o._separatorColor,
                    $ = ii(R ? o._expandIcon : o._collapseIcon),
                    T = O + 4;
                fl(V, 0, 0, A, f, S), R && O && fl(V, 0, 0, O, f, o._selectBackground), (R || o._21o.get(o._21o.size() - 1) !== C) && fl(V, 0, f - 1, A, 1, u ? u : Ee(S)), i && (Ii(V, i, T + xc(i) / 2, w / 2), T += xc(i) + 2), nd(V, C, o.getLabelFont(C), o.getLabelColor(C), T, 0, 0, w), $ && Ii(V, $, A - xc($) / 2 - 4, w / 2)
            }, validateImpl: function () {
                var Y = this,
                    m = Y._view,
                    k = 0,
                    P = 0,
                    i = Y.getWidth(),
                    b = Y.getHeight(),
                    G = Y._titleHeight,
                    l = Y._21o.size() * G,
                    W = Y._11o,
                    w = Y._9o;
                delete Y._11o, delete Y._9o, Y._21o.each(function (t) {
                    var z, r, e = Y._20o[t],
                        h = e.content,
                        T = Y._10o === t;
                    Oj(Y) ? (qp(e.div, k, 0, G, b), z = Y.initCanvas(e.canvas, G, b), wh(z, 0, b), jc(z, -N), Y.drawTitle(z, t, b, G, e), z.restore(), T ? (r = q(0, i - l), h && (Y._11o = h, Y._9o = Bq(h), qp(h, k + G, 0, r, b)), k += G + r) : k += G) : (qp(e.div, 0, P, i, G), z = Y.initCanvas(e.canvas, i, G), Y.drawTitle(z, t, i, G, e), z.restore(), T ? (r = q(0, b - l), h && (Y._11o = h, Y._9o = Bq(h), qp(h, 0, P + G, i, r)), P += G + r) : P += G)
                });
                var C = Y._9o;
                W && W !== Y._11o && W.endEditing && W.endEditing(), C && C !== w && sn(m, C), w && w !== C && yj(w)
            }
        }), Vs.SplitView = function ($, p, E, Q) {
            var w = this,
                o = w._dividerDiv = dd(),
                v = w._60O = uo(),
                h = w._61O = uo(),
                W = v.style,
                s = h.style;
            w._view = ve(1, w), sn(w._view, o), W.msTouchAction = iq, W.pointerEvents = iq, W.cursor = Zk, s.msTouchAction = iq, s.pointerEvents = iq, s.cursor = Zk, $ && w.setLeftView($), p && w.setRightView(p), E && w.setOrientation(E), Q != F && w.setPosition(Q), w.setStatus(Fk), new $s(w)
        }, Ws("SplitView", o, {
            ms_v: 1,
            ms_fire: 1,
            ms_ac: ["continuousLayout", "dividerSize", "dividerBackground", "toggleIcon", "togglable", "dragOpacity", "orientation", "draggable", "status"],
            _continuousLayout: !1,
            _position: .5,
            _togglable: !0,
            _orientation: "h",
            _draggable: !0,
            _dividerSize: u.splitViewDividerSize,
            _dividerBackground: u.splitViewDividerBackground,
            _dragOpacity: u.splitViewDragOpacity,
            _toggleIcon: u.splitViewToggleIcon,
            onPropertyChanged: function () {
                this.iv()
            }, getDividerDiv: function () {
                return this._dividerDiv
            }, getPosition: function () {
                return this._position
            }, setPosition: function (n, t) {
                var M = this,
                    g = M._position;
                isNaN(n) || (t || (M._82O = 0 > n ? -1 : n > 1 ? 1 : 0), M._position = n, M.fp(pr, g, n))
            }, getLeftView: function () {
                return this._leftView
            }, setLeftView: function (r) {
                var U = this,
                    q = U._leftView,
                    o = U._view;
                if (U._leftView !== r) {
                    if (q && q !== U._rightView) {
                        var l = Bq(q);
                        l.parentNode === o && yj(l)
                    }
                    if (U._leftView = r, r) {
                        var V = Bq(r);
                        V.parentNode !== o && o.insertBefore(V, U._dividerDiv)
                    }
                    U.fp("leftView", q, r)
                }
            }, getRightView: function () {
                return this._rightView
            }, setRightView: function (C) {
                var s = this,
                    g = s._rightView,
                    y = s._view;
                if (s._rightView !== C) {
                    if (g && g !== s._leftView) {
                        var $ = Bq(g);
                        $.parentNode === y && yj($)
                    }
                    if (s._rightView = C, C) {
                        var A = Bq(C);
                        A.parentNode !== y && y.insertBefore(A, s._dividerDiv)
                    }
                    s.fp("rightView", g, C)
                }
            }, validateImpl: function () {
                var Y = this,
                    R = Y._draggable,
                    S = Y._position,
                    F = Y.getWidth(),
                    G = Y.getHeight(),
                    b = Y._dividerSize,
                    D = Y._dividerBackground,
                    f = nf ? 18 : 8,
                    t = Y._dividerDiv,
                    e = Y._82O,
                    u = Y._60O,
                    g = Y._61O,
                    j = Y._toggleIcon,
                    p = Y._status,
                    I = t.style,
                    o = null,
                    M = nf ? 20 : 4,
                    Q = j.comps[0];
                b >= f || 0 === b ? Y._coverDiv && (yj(Y._coverDiv), delete Y._coverDiv) : Y._coverDiv || (Y._coverDiv = dd(), Uq && (Y._coverDiv.style.background = nb), sn(t, Y._coverDiv)), Y._togglable ? u.parentNode || (sn(t, u), sn(t, g)) : (yj(u), yj(g));
                var L = Y._coverDiv,
                    k = Y._leftView,
                    v = Y._rightView;
                if (Oj(Y)) {
                    if (b > F && (b = F), p === Fk)
                        if (1 === e) var X = V(S, F),
                            w = q(0, F - b - X);
                        else -1 === e ? (w = V(-S, F), X = q(0, F - b - w)) : (X = A((F - b) * S), w = q(0, F - b - X));
                    else "cl" === p ? (X = 0, w = q(0, F - b)) : "cr" === p && (w = 0, X = q(0, F - b));
                    k && qp(k, 0, 0, X, G), v && qp(v, X + b, 0, w, G), qp(t, X, 0, b, G), Y._22o = X, L && (qp(L, b / 2 - f / 2, 0, f, G), L.style.cursor = R ? Nc : ""), t.style.cursor = R ? Nc : "";
                    var n = t.clientHeight / 2,
                        i = t.clientWidth;
                    Bn(u, i, i), qp(u, 0, n - i - M, i, i), o = Wd(u), tf(o, 0, 0, 1), Q.rotation = -N, Yd(o, j, 0, 0, i, i), o.restore(), Bn(g, i, i), qp(g, 0, n + M, i, i), o = Wd(g), tf(o, 0, 0, 1), Q.rotation = N, Yd(o, j, 0, 0, i, i), o.restore()
                } else {
                    if (b > G && (b = G), p === Fk)
                        if (1 === e) var $ = V(S, G),
                            P = q(0, G - b - $);
                        else -1 === e ? (P = V(-S, G), $ = q(0, G - b - P)) : ($ = A((G - b) * S), P = q(0, G - b - $));
                    else "cl" === p ? ($ = 0, P = q(0, G - b)) : "cr" === p && (P = 0, $ = q(0, G - b));
                    k && qp(k, 0, 0, F, $), v && qp(v, 0, $ + b, F, P), qp(t, 0, $, F, b), Y._22o = $, L && (qp(L, 0, b / 2 - f / 2, F, f), L.style.cursor = R ? zi : ""), I.cursor = R ? zi : "";
                    var Z = t.clientWidth / 2,
                        i = t.clientHeight;
                    Bn(u, i, i), qp(u, Z - i - M, 0, i, i), o = Wd(u), tf(o, 0, 0, 1), Q.rotation = 0, Yd(o, j, 0, 0, i, i), o.restore(), Bn(g, i, i), qp(g, Z + M, 0, i, i), o = Wd(g), tf(o, 0, 0, 1), Q.rotation = W, Yd(o, j, 0, 0, i, i), o.restore()
                }
                I.background = D
            }
        });
        var $s = function (d) {
            this.sv = d, this.addListeners()
        };
        yc($s, o, {
            ms_listener: 1,
            getView: function () {
                return this.sv.getView()
            }, handle_touchstart: function (P) {
                var H = this,
                    k = H.sv,
                    a = k._dividerDiv,
                    l = k._60O,
                    C = k._61O,
                    b = k._status,
                    z = P.target;
                if (z === l) b === Fk ? k.setStatus("cl") : "cr" === b && k.setStatus(Fk);
                else if (z === C) b === Fk ? k.setStatus("cr") : "cl" === b && k.setStatus(Fk);
                else if (Bf(P) && (z === a || z === k._coverDiv) && (Qc(P), k.isDraggable())) {
                    k.getLeftView(), k.getRightView();
                    var R = H.maskDiv = dd();
                    if (R.style.left = 0, R.style.top = 0, R.style.width = k.getWidth() + "px", R.style.height = k.getHeight() + "px", k.getView().appendChild(R), !k.isContinuousLayout()) {
                        var Z = H.resizeDiv = dd();
                        Z.style.left = a.style.left, Z.style.top = a.style.top, Z.style.width = a.style.width, Z.style.height = a.style.height, Z.style.opacity = k.getDragOpacity(), Z.style.background = k.getDividerBackground(), sn(H.getView(), Z)
                    }
                    H._lastAbsPosition = k._22o, H._86o = Oj(k) ? lb(P).x : lb(P).y, Ui(H, P)
                }
            }, handleWindowTouchMove: function (y) {
                Bf(y) && this.update(y, this.sv.isContinuousLayout())
            }, handleWindowTouchEnd: function (d) {
                var O = this;
                O.update(d, !0), O.sv.setStatus(Fk), O.maskDiv && yj(O.maskDiv), O.resizeDiv && yj(O.resizeDiv), O.maskDiv = O.resizeDiv = F
            }, handle_mousedown: function (x) {
                jj(x) && this.handle_touchstart(x)
            }, handleWindowMouseMove: function (o) {
                this.handleWindowTouchMove(o)
            }, handleWindowMouseUp: function (C) {
                this.handleWindowTouchEnd(C)
            }, update: function (k, x) {
                var t = this,
                    q = t.sv,
                    h = Oj(q) ? q.getWidth() : q.getHeight(),
                    g = q._dividerSize,
                    W = t._lastAbsPosition - t._86o;
                Oj(q) ? (W += lb(k).x, W > h - g && (W = h - g), 0 > W && (W = 0), t.resizeDiv && (t.resizeDiv.style.left = W + oe)) : (W += lb(k).y, W > h - g && (W = h - g), 0 > W && (W = 0), t.resizeDiv && (t.resizeDiv.style.top = W + oe)), x && h !== g && (1 === q._82O ? q.setPosition(W, 1) : -1 === q._82O ? q.setPosition(W - h + g, 1) : q.setPosition(W / (h - g), 1))
            }
        }), Vs.TabView = function () {
            var t = this,
                P = t._view = ve(1, t),
                M = t._91O = dd(1),
                D = t._tabModel = new jn,
                A = D.sm(),
                u = t.invalidate;
            t._7o = new xr, t._canvas = uo(M), sn(P, M), sn(P, t._92O = dd(1)), A.setSelectionMode(vq), A.ms(t.handleSelectionChange, t), D.mm(u, t), D.mh(u, t), D.md(u, t), t._interactor = new _s(t), t.iv()
        }, Ws("TabView", o, {
            ms_v: 1,
            ms_fire: 1,
            ms_tx: 1,
            ms_ty: 1,
            ms_lp: 1,
            ms_ac: ["movable", "tabGap", "tabHeight", "tabPosition", fe, Vm, "tabHPadding", "tabBackground", "selectWidth", op, "moveBackground", "insertColor"],
            _tabHPadding: 0,
            _tabPosition: $c,
            _tabHeight: Jk,
            _tabGap: u.tabViewTabGap,
            _labelColor: u.tabViewLabelColor,
            _labelFont: u.tabViewLabelFont,
            _tabBackground: u.tabViewTabBackground,
            _selectWidth: u.tabViewSelectWidth,
            _selectBackground: u.tabViewSelectBackground,
            _moveBackground: u.tabViewMoveBackground,
            _insertColor: u.tabViewInsertColor,
            _movable: !0,
            handleSelectionChange: function () {
                this._selectionChanged = !0, this.invalidate()
            }, getContentDiv: function () {
                return this._92O
            }, getTitleDiv: function () {
                return this._91O
            }, getTabModel: function () {
                return this._tabModel
            }, add: function (Q, V, x) {
                var b, c = this._tabModel;
                return Q instanceof Xs ? (b = Q, V && b.setView(V)) : (b = new Xs, b.setName(Q), b.setView(V)), c.add(b), x && c.sm().ss(b), b
            }, getLabel: function (v) {
                return v.toLabel()
            }, onPropertyChanged: function () {
                this.iv()
            }, _7Q: function (s) {
                this._23o = s, this.iv()
            }, get: function (g) {
                var a = this,
                    p = a._tabModel;
                if (Bp(g)) return p._roots.get(g);
                if (dk(g)) {
                    var G;
                    return p.each(function (i) {
                        g === a.getLabel(i) && (G = i)
                    }), G
                }
                return g instanceof Xs ? g : F
            }, select: function (I) {
                this._tabModel.sm().ss(this.get(I))
            }, remove: function (G) {
                var v = this;
                if (G = v.get(G)) {
                    var w = v._tabModel,
                        s = w._roots.indexOf(G);
                    v._tabModel.remove(G), v.selectByIndex(--s)
                }
            }, getCurrentTab: function () {
                return this._8o
            }, hideTabView: function (B, t) {
                t.parentNode === this._92O && (Db(t) ? (t.style.display = Jc, t._tab_ = B) : yj(t), Um())
            }, showTabView: function (t, x) {
                Db(x) && (x.style.display = "block", x._tab_ = t), x.parentNode !== this._92O && (sn(this._92O, x), Um())
            }, _24o: function () {
                var p, b = this,
                    E = b._8o,
                    P = b._9o,
                    L = b._tabModel.sm().ld();
                L && (p = Bq(L.getView())), p !== P && (P && (E.getView() && E.getView().endEditing && E.getView().endEditing(), b.hideTabView(E, P)), p && b.showTabView(L, p)), b._8o = L, b._9o = p, E !== L && b.onTabChanged(E, L)
            }, onTabClosing: function () {
                return !0
            }, onTabChanged: function () { }, onTabClosed: function (F, M) {
                this.selectByIndex(--M)
            }, selectByIndex: function (M) {
                var x = this,
                    C = x._tabModel,
                    z = C.size();
                if (z && !C.sm().ld()) {
                    M == F && (M = 0), M >= z && (M = z - 1), 0 > M && (M = 0);
                    for (var $ = M; $ >= 0; $--) {
                        var U = x.get($);
                        if (!U.isDisabled()) return x.select(U), U
                    }
                    for ($ = M + 1; z > $; $++)
                        if (U = x.get($), !U.isDisabled()) return x.select(U), U
                }
            }, getTabWidth: function (u) {
                var E = this.getTabHPadding(),
                    x = 4 + 2 * E,
                    C = ii(u.getIcon());
                C && (x += xc(C, u) + 4);
                var P = this.getLabel(u);
                return P && (x += ln(this.getLabelFont(u), P).width + 4), u.isClosable() && (x += 10), x
            }, drawTab: function (f, c, V, $, e, q, H) {
                var x, S = this,
                    b = S._tabPosition,
                    Q = this.getTabHPadding(),
                    v = V + 4 + Q,
                    C = S._selectWidth,
                    m = ii(c.getIcon()),
                    z = c.isDisabled(),
                    i = S.getLabelColor(c),
                    d = S.getLabelFont(c),
                    k = S.getLabel(c),
                    J = S._selectBackground,
                    t = b === nq + "-vertical",
                    T = b === fm + "-vertical";
                (t || T) && (v = $ + 4 + Q), z && (f.globalAlpha = Nn), fl(f, V, $, e, q, H), c === S._8o && C && (b === $c ? fl(f, V, $ + q - C, e, C, J) : b === nq ? fl(f, V + e - C, $, C, q, J) : b === fm ? fl(f, V, $, C, q, J) : t ? fl(f, V + e - C, $, C, q, J) : T ? fl(f, V, $, C, q, J) : fl(f, V, $, e, C, J));
                var D = e / 2;
                if (t && (wh(f, D, $ + q / 2), jc(f, W), wh(f, -D, -$ - q / 2)), m) {
                    var j = oo(m, c),
                        G = xc(m, c);
                    if (t || T) {
                        var R = V + e / 2,
                            M = v + j / 2;
                        wh(f, R, M), jc(f, N), wh(f, -R, -M), Ii(f, m, V + e / 2, v + j / 2, c, S), wh(f, R, M), jc(f, -N), wh(f, -R, -M), v += j + 4
                    } else Ii(f, m, v + G / 2, $ + q / 2, c, S), v += G + 4
                }
                return t || T ? (wh(f, e / 2, v + e / 2), jc(f, N), wh(f, -e / 2, -v - e / 2), nd(f, k, d, i, V, v, q, e), wh(f, e / 2, v + e / 2), jc(f, -N), wh(f, -e / 2, -v - e / 2)) : nd(f, k, d, i, v, $, e, q), t && (wh(f, D, $ + q / 2), jc(f, -W), wh(f, -D, -$ - q / 2)), c.isClosable() && (x = T ? {
                    x: V + e - 12,
                    y: $ + q - 12,
                    width: 12,
                    height: 12
                } : {
                        x: V + e - 12,
                        y: $ + 2,
                        width: 12,
                        height: 12
                    }, this.drawCloseIcon(c, f, i, x)), z && (f.globalAlpha = 1), x
            }, drawCloseIcon: function (Z, $, v, P) {
                var D = P.x,
                    J = P.y;
                $.strokeStyle = v, $.lineWidth = 1, $.beginPath(), $.moveTo(D + 2, J + 8), $.lineTo(D + 8, J + 2), $.moveTo(D + 8, J + 8), $.lineTo(D + 2, J + 2), $.stroke()
            }, getTabAt: function (c) {
                var d = this._interactor._8Q(c);
                return d ? d.tab : null
            }, validateImpl: function () {
                var T = this;
                T._24o();
                var N, n = T._canvas,
                    W = T._tabPosition,
                    i = T._91O,
                    X = T._92O,
                    p = T._tabModel,
                    F = T.getWidth(),
                    c = T.getHeight(),
                    b = T._tabHeight,
                    d = T._7o,
                    v = T._tabGap,
                    B = W === $c,
                    C = W === nq,
                    L = W === fm,
                    k = W === nq + "-vertical",
                    r = W === fm + "-vertical",
                    g = T._23o,
                    e = 0;
                if ((C || L) && p._roots.each(function (n) {
                    e = q(T.getTabWidth(n), e)
                }), B ? (qp(i, 0, 0, F, b), N = {
                    x: 0,
                    y: b,
                    width: F,
                    height: q(0, c - b)
                }) : C ? (qp(i, 0, 0, e, c), N = {
                    x: e,
                    y: 0,
                    width: q(0, F - e),
                    height: c
                }) : L ? (qp(i, F - e, 0, e, c), N = {
                    x: 0,
                    y: 0,
                    width: q(0, F - e),
                    height: c
                }) : k ? (qp(i, 0, 0, b, c), N = {
                    x: b,
                    y: 0,
                    width: q(0, F - b),
                    height: c
                }) : r ? (qp(i, F - b, 0, b, c), N = {
                    x: 0,
                    y: 0,
                    width: q(0, F - b),
                    height: c
                }) : (qp(i, 0, c - b, F, b), N = {
                    x: 0,
                    y: 0,
                    width: F,
                    height: q(0, c - b)
                }), qp(X, N), k || r) {
                    T._9o && (N.x = 0, qp(T._8o.getView(), N)), Bn(n, b, c);
                    var Z = Wd(n),
                        y = 0;
                    if (tf(Z, 0, T.ty(), 1), Z.clearRect(0, 0, b, c), d.clear(), p._roots.each(function (h) {
                        if (h.isVisible()) {
                            var P, K = T.getTabWidth(h);
                            g && g.tab === h || (P = T.drawTab(Z, h, 0, y, b, K, T._tabBackground)), d.add({
                                _75o: P,
                                tab: h,
                                startY: y,
                                endY: y + K,
                                height: K
                            }), y += K + v
                        }
                    }), T._23Q = q(0, y - v), g) {
                        var P = g.position;
                        T.drawTab(Z, g.tab, 0, g.startY, b, g.height, T._moveBackground), fl(Z, 0, P, b, 1, T._insertColor)
                    }
                    if (Z.restore(), T._selectionChanged) {
                        T._selectionChanged = !1;
                        for (var H = T.ty(), U = 0; U < d.size(); U++) {
                            var K = d.get(U);
                            if (K.tab === T._8o) {
                                if (K.endY + H < 0) {
                                    T.ty(-K.startY);
                                    break
                                }
                                if (K.startY + H > c) {
                                    T.ty(c - K.endY);
                                    break
                                }
                            }
                        }
                    }
                    T.ty(T.ty())
                } else if (C || L) {
                    T._9o && (N.x = 0, qp(T._8o.getView(), N)), Bn(n, e, c);
                    var Z = Wd(n),
                        y = 0;
                    if (tf(Z, 0, T.ty(), 1), Z.clearRect(0, 0, e, c), d.clear(), p._roots.each(function (q) {
                        if (q.isVisible()) {
                            var B;
                            g && g.tab === q || (B = T.drawTab(Z, q, 0, y, e, b, T._tabBackground)), d.add({
                                _75o: B,
                                tab: q,
                                startY: y,
                                endY: y + b,
                                height: b
                            }), y += b + v
                        }
                    }), T._23Q = q(0, y - v), g) {
                        var P = g.position;
                        T.drawTab(Z, g.tab, 0, g.startY, e, g.height, T._moveBackground), fl(Z, 0, P, e, 1, T._insertColor)
                    }
                    if (Z.restore(), T._selectionChanged) {
                        T._selectionChanged = !1;
                        for (var H = T.ty(), U = 0; U < d.size(); U++) {
                            var K = d.get(U);
                            if (K.tab === T._8o) {
                                if (K.endY + H < 0) {
                                    T.ty(-K.startY);
                                    break
                                }
                                if (K.startY + H > c) {
                                    T.ty(c - K.endY);
                                    break
                                }
                            }
                        }
                    }
                    T.ty(T.ty())
                } else {
                    T._9o && (N.y = 0, qp(T._8o.getView(), N)), Bn(n, F, b);
                    var Z = Wd(n),
                        M = 0;
                    if (tf(Z, T.tx(), 0, 1), Z.clearRect(0, 0, F, b), d.clear(), p._roots.each(function (J) {
                        if (J.isVisible()) {
                            var k, B = T.getTabWidth(J);
                            g && g.tab === J || (k = T.drawTab(Z, J, M, 0, B, b, T._tabBackground)), d.add({
                                _75o: k,
                                tab: J,
                                startX: M,
                                endX: M + B,
                                width: B
                            }), M += B + v
                        }
                    }), T._64I = q(0, M - v), g) {
                        var P = g.position;
                        T.drawTab(Z, g.tab, g.startX, 0, g.width, b, T._moveBackground), cs(Z, T._insertColor, P, 0, b)
                    }
                    if (Z.restore(), T._selectionChanged) {
                        T._selectionChanged = !1;
                        for (var z = T.tx(), U = 0; U < d.size(); U++) {
                            var K = d.get(U);
                            if (K.tab === T._8o) {
                                if (K.endX + z < 0) {
                                    T.tx(-K.startX);
                                    break
                                }
                                if (K.startX + z > F) {
                                    T.tx(F - K.endX);
                                    break
                                }
                            }
                        }
                    }
                    T.tx(T.tx())
                }
                for (var l = [], w = X.children, U = 0; U < w.length; U++) {
                    var f = w[U],
                        j = f._tab_;
                    j && !p.contains(j) && l.push(f)
                }
                l.forEach(function (o) {
                    X.removeChild(o)
                })
            }
        });
        var _s = function (C) {
            this.tv = C, this.addListeners()
        };
        yc(_s, o, {
            ms_listener: 1,
            getView: function () {
                return this.tv._91O
            }, handle_mousewheel: function (W) {
                this.handleScroll(W, 10 * (W.wheelDelta / 40))
            }, handle_DOMMouseScroll: function (x) {
                this.handleScroll(x, 10 * -x.detail)
            }, handleScroll: function (w, j) {
                Qc(w);
                var O = this.tv,
                    T = O._tabPosition;
                !O._40o() || T !== $c && T !== Kd || O.tx(this.tv.tx() + j), !O._41o() || T !== nq && T !== fm && T !== nq + "-vertical" && T !== fm + "-vertical" || O.ty(this.tv.ty() + j)
            }, _8Q: function (g) {
                var P, Z, Q = this.tv,
                    N = Q._tabPosition,
                    q = Q._7o;
                if (N === $c || N === Kd) {
                    var s = Q.lp(g).x;
                    for (P = 0; P < q.size(); P++)
                        if (Z = q.get(P), Z.startX <= s && s <= Z.endX) return Z
                } else if (N === nq || N === fm || N === nq + "-vertical" || N === fm + "-vertical") {
                    var c = Q.lp(g).y;
                    for (P = 0; P < q.size(); P++)
                        if (Z = q.get(P), Z.startY <= c && c <= Z.endY) return Z
                }
                return F
            }, isClickable: function (K) {
                var j = this.tv,
                    p = j._tabPosition,
                    s = this._73o = this._8Q(K);
                return !j._40o() || p !== $c && p !== Kd ? !j._41o() || p !== nq && p !== fm && p !== nq + "-vertical" && p !== fm + "-vertical" ? s && (!s.tab.isDisabled() || j.isMovable()) : !0 : !0
            }, handle_mousemove: function (S) {
                var E = this;
                si ? E._74o = E._8Q(S) : E.getView().style.cursor = E.isClickable(S) ? Zk : ""
            }, handle_mousedown: function (E) {
                this.handle_mousemove(E), this.handle_touchstart(E)
            }, handle_touchstart: function ($) {
                var d = this,
                    H = d.tv,
                    S = H._tabPosition;
                Qc($), jj($) && d.isClickable($) && (S === $c || S === Kd ? (d.x = lb($).x, d.lp = H.lp($), d.tx = H.tx()) : (d.y = lb($).y, d.lp = H.lp($), d.ty = H.ty()), Ui(d, $))
            }, handleWindowMouseMove: function (P) {
                this.handleWindowTouchMove(P)
            }, handleWindowTouchMove: function ($) {
                var Q, R = this,
                    O = R.tv,
                    e = O._tabPosition,
                    G = R._73o;
                if (e === $c || e === Kd) {
                    if (Q = lb($).x - R.x, !R._25o && !R.moving && X(Q) > 2 && (O._40o() && !ik($) ? R._25o = 1 : G && O.isMovable() && (R.moving = 1)), R._25o) O.tx(R.tx + Q);
                    else if (R.moving) {
                        var C = R.lp.x + Q,
                            u = O._tabGap / 2;
                        O._7o.each(function (g) {
                            var i = g.endX,
                                y = C - g.startX < i - C;
                            C >= g.startX && i >= C && O._7Q({
                                tab: G.tab,
                                startX: G.startX + Q,
                                width: G.width,
                                front: y,
                                insertTab: g.tab,
                                position: y ? q(0, g.startX - u) : V(O._64I, i + u)
                            })
                        })
                    }
                } else if (Q = lb($).y - R.y, !R._25o && !R.moving && X(Q) > 2 && (O._41o() && !ik($) ? R._25o = 1 : G && O.isMovable() && (R.moving = 1)), R._25o) O.ty(R.ty + Q);
                else if (R.moving) {
                    var K = R.lp.y + Q,
                        u = O._tabGap / 2;
                    O._7o.each(function (l) {
                        var j = l.endY,
                            c = K - l.startY < j - K;
                        K >= l.startY && j >= K && O._7Q({
                            tab: G.tab,
                            startY: G.startY + Q,
                            height: G.height,
                            front: c,
                            insertTab: l.tab,
                            position: c ? q(0, l.startY - u) : V(O._23Q, j + u)
                        })
                    })
                }
            }, handleWindowMouseUp: function (q) {
                this.handleWindowTouchEnd(q)
            }, handleWindowTouchEnd: function () {
                var n = this,
                    E = n.tv,
                    B = E._tabPosition,
                    T = E.getTabModel(),
                    b = T._roots,
                    j = n._73o;
                if (n.moving) {
                    var z = E._23o;
                    if (z && z.insertTab !== z.tab) {
                        var p = z.tab,
                            X = b.remove(p),
                            x = b.indexOf(z.insertTab);
                        x >= 0 && (z.front || x++, x <= b.size() && (b.add(p, x), T._38I(p, X, x)))
                    }
                    E._7Q(F), delete n.moving
                } else if (!n._25o && j) {
                    p = j.tab;
                    var o = n._74o;
                    if (!o || o.tab === p)
                        if (!p.isDisabled() && cf(j._75o, n.lp)) {
                            var $ = function () {
                                var N = b.indexOf(p);
                                T.remove(p), E.onTabClosed(p, N)
                            };
                            E.onTabClosing(p, $) && $()
                        } else p.isDisabled() || E._8o === p || T.sm().ss(p)
                }
                n._25o = n._73o = n._74o = B === $c || B === Kd ? n.x = n.lp = n.tx = F : n.y = n.lp = n.ty = F
            }
        }), Vs.PropertyView = function (n) {
            var g = this;
            g._view = ve(1, g), g._canvas = uo(g._view), sn(g._view, g._79O = dd()), g._rows = new xr, g._28o = new xr, g._26o = {}, g._26Q = {};
            var R = g._propertyModel = new jn,
                b = g.ivm;
            R.mm(b, g), R.md(b, g), R.mh(b, g), g.dm(n ? n : new jn), new at(g)
        }, Ws("PropertyView", o, {
            ms_ac: [fe, Uo, Vm, Me, Zh, "categorizable", Vb, go, dj, Zi, xj, df, gd, Ji, "selectRowIndex", op, "background", Jj, Yc, Ln, jh, Gr],
            ms_v: 1,
            ms_dm: 1,
            ms_fire: 1,
            ms_sm: 1,
            _49o: 1,
            ms_txy: 1,
            ms_lp: 1,
            ms_vs: 1,
            _45o: 1,
            _47o: 1,
            ms_tip: 1,
            _29I: nl,
            _59I: 0,
            _9I: 0,
            _selectRowIndex: -1,
            _editable: !0,
            _batchEditable: !0,
            _categorizable: !0,
            _indent: kc,
            _background: u.propertyViewBackground,
            _expandIcon: u.propertyViewExpandIcon,
            _collapseIcon: u.propertyViewCollapseIcon,
            _scrollBarColor: Ch,
            _scrollBarSize: di,
            _autoHideScrollBar: jr,
            _selectBackground: u.propertyViewSelectBackground,
            _rowHeight: Oi,
            _rowLineVisible: u.propertyViewRowLineVisible,
            _rowLineColor: u.propertyViewRowLineColor,
            _10I: .5,
            _columnLineVisible: u.propertyViewColumnLineVisible,
            _columnLineColor: u.propertyViewColumnLineColor,
            _labelColor: u.propertyViewLabelColor,
            _labelSelectColor: u.propertyViewLabelSelectColor,
            _labelFont: u.propertyViewLabelFont,
            getRows: function () {
                return this._rows
            }, getColumnPosition: function () {
                return this._10I
            }, setColumnPosition: function (H) {
                0 > H && (H = 0), H > 1 && (H = 1);
                var v = this,
                    t = v._10I;
                v._10I = H, v.fp("columnPosition", t, H)
            }, getPropertyName: function (K) {
                return K.toLabel()
            }, getLabelFont: function () {
                return this._labelFont
            }, getLabelColor: function (y, x, D) {
                return D === this._selectRowIndex ? this._labelSelectColor : this._labelColor
            }, getPropertyFont: function () {
                return this._labelFont
            }, getPropertyColor: function (h, U) {
                return U === this._selectRowIndex ? this._labelSelectColor : h.getColor() || this._labelColor
            }, getCategoryFont: function () {
                return this._labelFont
            }, getCategoryColor: function () {
                return this._labelColor
            }, adjustTranslateX: function () {
                return 0
            }, adjustTranslateY: function (s) {
                var U = this.getHeight() - this._59I;
                return U > s && (s = U), s > 0 ? 0 : A(s)
            }, isExpanded: function (K) {
                if (!K) return !0;
                var d = this._26o[K];
                return d ? d.isExpanded : !(this._26Q[K] === !1)
            }, toggle: function (s) {
                var t = this;
                t.isExpanded(s) ? t.collapse(s) : t.expand(s)
            }, expandAll: function () {
                this.validate();
                for (var w in this._26o) this.expand(w)
            }, expand: function (V) {
                if (V && V !== Jc) {
                    var A = this,
                        k = A._26o[V];
                    k && !k.isExpanded && (k.isExpanded = !0, A.onExpanded(V), A.ivm())
                }
            }, onExpanded: function () { }, collapseAll: function () {
                this.validate();
                for (var m in this._26o) this.collapse(m)
            }, collapse: function (W) {
                if (W && W !== Jc) {
                    var H = this,
                        X = H._26o[W];
                    X && X.isExpanded && (X.isExpanded = !1, H.onCollapsed(W), H.ivm())
                }
            }, onCollapsed: function () { }, getCategoryName: function (Y) {
                if (!this.isCategorizable()) return Jc;
                var $ = Y.getCategoryName();
                return $ ? $ : Jc
            }, getPropertyModel: function () {
                return this._propertyModel
            }, handleSelectionChange: function () {
                this.ivm()
            }, setDataModel: function (U) {
                var V = this,
                    Z = V._dataModel;
                Z !== U && (Z && (Z.umd(V.handlePropertyChange, V), V._selectionModel || Z.sm().ums(V.handleSelectionChange, V)), V._dataModel = U, U.md(V.handlePropertyChange, V), V._selectionModel ? V._selectionModel._21I(U) : U.sm().ms(V.handleSelectionChange, V), V.fp(uk, Z, U))
            }, isVisible: function (R) {
                return this._visibleFunc ? this._visibleFunc(R) : !0
            }, onPropertyChanged: function (i) {
                var v = this,
                    u = i.property;
                Qs[u] ? v.ivm() : v.iv(), u === wb && v._43o()
            }, getCurrentData: function () {
                return this._27o
            }, updateCurrentData: function () {
                this._27o = this.sm().ld()
            }, getRawProperties: function () {
                return this._27o ? this._propertyModel._roots : Yh
            }, handlePropertyChange: function (a) {
                this._27o === a.data && this.iv()
            }, ivm: function () {
                this.invalidateModel()
            }, invalidateModel: function () {
                var r = this;
                r._96I || (r.setSelectRowIndex(-1), r._96I = 1, r.iv())
            }, redraw: function () {
                this.iv()
            }, validateModel: function () {
                var f = this,
                    $ = f._rows,
                    _ = f._28o,
                    S = {},
                    n = new xr,
                    h = f._27o;
                f.updateCurrentData(), h !== f._27o && f.endEditing(), $.clear(), _.clear(), f.getRawProperties().each(function (B) {
                    if (f.isVisible(B)) {
                        n.add(B);
                        var E = f.getCategoryName(B);
                        S[E] || (_.add(E, E === Jc ? 0 : Z), S[E] = {
                            isExpanded: f.isExpanded(E),
                            properties: new xr
                        })
                    }
                }), f._sortFunc && n.sort(f._sortFunc);
                for (var I in f._26o) f._26Q[I] = f.isExpanded(I);
                f._26o = S, _.each(function (V) {
                    V !== Jc && $.add(V);
                    var D = S[V];
                    D.isExpanded && n.each(function (L) {
                        f.getCategoryName(L) === V && (D.properties.add(L), $.add({
                            property: L,
                            data: f._27o
                        }))
                    }, f)
                })
            }, validateImpl: function () {
                var B = this;
                B._76o(), B._96I && (B.validateModel(), delete B._96I);
                var f = B._canvas,
                    P = B.getWidth(),
                    Y = B.getHeight(),
                    $ = -B.ty(),
                    k = B._rowHeight,
                    b = B._indent,
                    l = P - b,
                    y = B._rows,
                    r = y.size(),
                    c = B._9I = b + l * B._10I,
                    g = B._59I = r * k;
                Bn(f, P, Y), B._29I = {
                    x: 0,
                    y: $,
                    width: P,
                    height: Y
                }, B._31I = T($ / k), B._14I = s(($ + Y) / k), B._31I < 0 && (B._31I = 0), B._14I > r && (B._14I = r);
                var U, p = Wd(f),
                    Z = B._background;
                tf(p, 0, -$, 1), p.beginPath(), p.rect(0, $, P, Y), p.clip(), p.clearRect(0, $, P, Y), B._93db(p), Z && fl(p, 0, 0, b, g, Z);
                for (var S = B._31I; S < B._14I; S++) {
                    var G = y.get(S),
                        $ = k * S;
                    if (dk(G)) Z && fl(p, b, $, l, k, Z), U = ii(B.isExpanded(G) ? B._expandIcon : B._collapseIcon), U && qk(p, U, Mg, 0, $, b, k), p.save(), p.beginPath(), p.rect(b, $, l, k), p.clip(), B.drawCategoryName(p, G, S, b, $, l, k), p.restore();
                    else {
                        var C = G.property,
                            E = G.data,
                            U = ii(C.getIcon()),
                            t = B._selectRowIndex === S ? B.getSelectBackground() : F;
                        if (U && qk(p, U, Mg, 0, $, b, k), t && fl(p, b, $, l, k, t), p.save(), p.beginPath(), p.rect(b, $, c - b, k), p.clip(), B.drawPropertyName(p, C, S, b, $, c - b, k), p.restore(), !B.isEditing(E, C)) {
                            var z = c + 1,
                                q = P - c - 1;
                            p.save(), p.beginPath(), p.rect(z, $, q, k), p.clip(), B._87o(B.drawPropertyValue(p, C, B.getValue(E, C), S, z, $, q, k, E), S, z, $, q, k), p.restore()
                        }
                    }
                    B._rowLineVisible && fl(p, b, $ + k - 1, l, 1, B._rowLineColor)
                }
                B._columnLineVisible && (fl(p, c, 0, 1, g, B._columnLineColor), fl(p, P - 1, 0, 1, g)), B._92db(p), B._93I(), p.restore(), B.ty(B.ty())
            }, drawCategoryName: function (d, C, h, X, t, S, O) {
                nd(d, C, this.getCategoryFont(C), this.getCategoryColor(C), X, t, S, O)
            }, drawPropertyName: function (A, f, Z, O, o, T, i) {
                return f.drawPropertyName ? (f.drawPropertyName(A, f, Z, O, o, T, i, this), void 0) : (nd(A, this.getPropertyName(f), this.getPropertyFont(f, Z), this.getPropertyColor(f, Z), O, o, T, i), void 0)
            }, drawPropertyValue: function (F, P, p, I, A, W, S, w, k) {
                return P.drawPropertyValue ? P.drawPropertyValue(F, P, p, I, A, W, S, w, k, this) : (Ss(F, p, P, this.getLabelFont(P, p, I), this.getLabelColor(P, p, I), A, W, S, w, k, this), void 0)
            }, isPropertyEditable: function (e) {
                return e.isEditable() && this.isEditable()
            }, setProperties: function (M) {
                this._propertyModel.clear(), this.addProperties(M)
            }, addProperties: function (a) {
                if (a) {
                    var p = this._propertyModel;
                    a.forEach(function (W) {
                        if (!(W instanceof Zs)) {
                            var e = gp(W.className);
                            W = Wn(e ? e : Zs, W)
                        }
                        p.add(W)
                    })
                }
            }, getRowIndexAt: function (N) {
                var B = this,
                    Y = T(B.lp(N).y / B._rowHeight);
                return Y >= 0 && Y < B._rows.size() ? Y : -1
            }, getPropertyAt: function (A) {
                var x = this,
                    E = x.getRowIndexAt(A);
                return E >= 0 ? x._rows.get(E).property : F
            }, getToolTip: function (I) {
                var V = this,
                    S = V.getPropertyAt(I),
                    P = V._27o;
                return S && P ? S.getToolTip(P, V._9I < V.lp(I).x, V) : F
            }
        });
        var at = function (q) {
            this.pv = q, this.addListeners()
        };
        yc(at, o, {
            ms_listener: 1,
            getView: function () {
                return this.pv._view
            }, setCursor: function (A) {
                this.getView().style.cursor = A
            }, clear: function () {
                var A = this;
                A._62O = A.cp = A.ty = A.p = F, A.setCursor(lp)
            }, handle_mousedown: function (g) {
                this.handle_touchstart(g)
            }, handle_touchstart: function (X) {
                var i = this,
                    F = i.pv;
                Qc(X), F.setFocus(X) && (jj(X) ? (i.cp = lb(X), i.ty = F.ty(), i.p = F.getColumnPosition(), i.handle_touchmove(X)) : F.setSelectRowIndex(F.getRowIndexAt(X)))
            }, handleWindowMouseUp: function () {
                this.clear()
            }, handleWindowTouchEnd: function () {
                this.clear()
            }, handle_mouseup: function (J) {
                this.handle_touchend(J)
            }, handle_touchend: function (k) {
                var $ = this;
                if ($.cp && !$._62O) {
                    var p = $.pv,
                        x = p.lp(k),
                        F = x.x,
                        M = x.y,
                        s = p._indent,
                        Y = p.getRowIndexAt(k),
                        b = p._9I;
                    if (Y >= 0) {
                        var D = p._rowHeight,
                            U = D * Y,
                            r = p._rows.get(Y),
                            X = r.property;
                        if (dk(r)) ii(p.isExpanded(r) ? p._expandIcon : p._collapseIcon) && F >= 0 && s >= F && M >= U && U + D >= M ? p.toggle(r) : wm(k) && p.toggle(r);
                        else if (F > b && p.isPropertyEditable(X, k)) {
                            var u = {
                                x: b + 1,
                                y: U,
                                width: p.getWidth() - b - 1,
                                height: D
                            },
                                T = {
                                    x: u.x + p.tx(),
                                    y: u.y + p.ty(),
                                    width: u.width,
                                    height: u.height
                                },
                                i = 0,
                                W = p._29I;
                            u.y < W.y ? i = u.y - W.y : u.y + D > W.y + W.height && (i = u.y + D - W.y - W.height), i && (p.ty(p.ty() - i), T.y -= i), p.beginEditing({
                                data: r.data,
                                property: X,
                                value: p.getValue(r.data, X),
                                event: k,
                                rect: u,
                                editorRect: T,
                                view: p
                            })
                        }
                    }
                    p.setSelectRowIndex(Y)
                }
                $.clear()
            }, handleWindowMouseMove: function (k) {
                this.handleWindowTouchMove(k)
            }, handleWindowTouchMove: function (M) {
                var u = this,
                    Z = u.pv,
                    b = u.ty,
                    x = u.cp,
                    G = lb(M),
                    V = u._62O;
                if ("p" === V) Z.setTranslateY(b + G.y - x.y);
                else if ("c" === V) {
                    var H = Z.getWidth() - Z._indent;
                    if (H > 16) {
                        var h = u.p - (x.x - G.x) / H,
                            $ = 16 / H;
                        $ > h && (h = $), h > 1 - $ && (h = 1 - $), Z.setColumnPosition(h)
                    }
                } else "s" === V && Z.setTranslateY(b + (x.y - G.y) * Z._59I / Z._29I.height)
            }, handle_mousemove: function (w) {
                this.handle_touchmove(w)
            }, handle_touchmove: function (I) {
                if (!si && jj(I)) {
                    var Y = this,
                        x = Y.pv,
                        P = X(x.lp(I).x - x._9I) <= (nf ? 8 : 3);
                    Y.cp ? Y._62O || (P ? (Y._62O = "c", Ui(Y, I)) : X(lb(I).y - Y.cp.y) >= 2 && (Y._62O = Y.isV(I) ? "s" : "p", Ui(Y, I))) : (P ? Y.setCursor(Nc) : Y.setCursor(lp), Y.isV(I) && x._43o())
                }
            }, isV: function (Z) {
                var Y = this.pv,
                    f = Y._29I;
                return Y._41o() && f.x + f.width - Y.lp(Z).x < co
            }, handle_mousewheel: function (B) {
                this.handleScroll(B, B.wheelDelta / 40)
            }, handle_DOMMouseScroll: function (k) {
                2 === k.axis && this.handleScroll(k, -k.detail)
            }, handleScroll: function (_, o) {
                var b = this.pv;
                Qc(_), b.endEditing(), b.translate(0, o * b.getRowHeight())
            }, handle_keydown: function (j) {
                var L = this.pv,
                    Q = L._rows.size(),
                    R = L._selectRowIndex + (Nk(j) ? -1 : 1);
                (Nk(j) || ri(j)) && (0 > R && (R = 0), R >= Q && (R = Q - 1), L.setSelectRowIndex(R))
            }
        }), Vs.ListView = function (f) {
            this._5o(f), new bt(this)
        }, Ws("ListView", o, {
            ms_ac: [fe, Uo, Vm, Jj, Vb, Yc, Ln, go, dj, df, gd, Ji, Pi, op],
            ms_v: 1,
            ms_bnb: 1,
            ms_tip: 1,
            ms_fire: 1,
            ms_sm: 1,
            _49o: 1,
            ms_txy: 1,
            ms_lp: 1,
            ms_vs: 1,
            ms_hs: 1,
            _15Q: 1,
            _14Q: 1,
            ms_dm: 1,
            _45o: 1,
            _checkMode: !1,
            _indent: kc,
            _rowHeight: Oi,
            _rowLineVisible: u.listViewRowLineVisible,
            _rowLineColor: u.listViewRowLineColor,
            _scrollBarColor: Ch,
            _scrollBarSize: di,
            _autoMakeVisible: be,
            _autoHideScrollBar: jr,
            _selectBackground: u.listViewSelectBackground,
            _labelColor: u.listViewLabelColor,
            _labelSelectColor: u.listViewLabelSelectColor,
            _labelFont: u.listViewLabelFont,
            isCheckMode: function () {
                return this._checkMode
            }, setCheckMode: function (b) {
                var D = this,
                    t = D._checkMode;
                D._checkMode = b, D.fp(wi, t, b)
            }, drawRow: function (M, q, h, X, V, i, E) {
                var F = this,
                    m = 0,
                    H = F._indent,
                    e = F.getIconWidth(q);
                F.drawRowBackground(M, q, h, X, V, i, E), F._checkMode && (Ii(M, ii(F.getCheckIcon(q)), m + H / 2, V + E / 2, q, F), m += H), F.drawIcon(M, q, m, V, e, E), F.drawLabel(M, q, m + e, V, E)
            }
        });
        var bt = function (W) {
            this.list = W, this.addListeners()
        };
        yc(bt, o, {
            ms_listener: 1,
            getView: function () {
                return this.list._view
            }, clear: function (r) {
                var X = this,
                    f = X.list;
                r && "d" === X._62O && !X.dragCancel && f.handleDragAndDrop(r, "end"), f.draggingData && (f.draggingData = null, f.redraw()), X.dragCancel = X._62O = X._isV = X._isH = X.cp = X.tx = X.ty = F
            }, handle_mousedown: function (u) {
                this.handle_touchstart(u)
            }, handle_touchstart: function (F) {
                var p = this,
                    R = p.list;
                if (Qc(F), R.setFocus(F)) {
                    var v = R.getDataAt(F);
                    p.cp = lb(F), p.tx = R.tx(), p.ty = R.ty(), jj(F) ? v && R.handleDragAndDrop && !p.isV(F) && !p.isH(F) && (R.draggingData = v, R.redraw(), R.handleDragAndDrop(F, "prepare")) : (v ? p._33o(F, v) : this._cancelDataDoubleSelect(), p.clear(F))
                }
            }, handleWindowMouseUp: function (x) {
                this.clear(x)
            }, handleWindowTouchEnd: function (q) {
                this.clear(q)
            }, handle_mouseup: function (S) {
                this.handle_touchend(S)
            }, handle_touchend: function (l) {
                var Q = this,
                    g = Q.list;
                if (!Q._isV && !Q._isH && Q.cp && !Q._62O) {
                    var u = g.getDataAt(l);
                    u ? (g.isCheckMode() ? Q._34o(l, u) : Q._33o(l, u), wm(l) ? g.onDataDoubleClicked(u, l) : g.onDataClicked(u, l)) : (Q._cancelDataDoubleSelect(), g.handleBackgroundClick(l))
                }
                Q.clear(l)
            }, handleWindowMouseMove: function (D) {
                this.handleWindowTouchMove(D)
            }, handleWindowTouchMove: function (L) {
                var w = this,
                    z = w.list,
                    m = w._62O,
                    F = w.tx,
                    r = w.ty,
                    B = w.cp,
                    Z = lb(L),
                    R = z._29I;
                "p" === m ? z.setTranslate(F + Z.x - B.x, r + Z.y - B.y) : "v" === m ? z.ty(r + (B.y - Z.y) * z._59I / R.height) : "h" === m ? z.tx(F + (B.x - Z.x) * z._91I / R.width) : "d" === m && (w.dragCancel || z.handleDragAndDrop(L, "between"))
            }, handle_mousemove: function (e) {
                this.handle_touchmove(e)
            }, handle_touchmove: function (K) {
                if (!si && jj(K)) {
                    var p = this,
                        f = p.list;
                    if (p._isV = p.isV(K), p._isH = p.isH(K), p.cp) {
                        if (!p._62O) {
                            if (En(lb(K), p.cp) < 2) return;
                            p._isV ? p._62O = "v" : p._isH ? p._62O = "h" : f.draggingData && !this.dragCancel ? (p._62O = "d", f.handleDragAndDrop(K, "begin")) : p._62O = "p", p._62O && "d" !== p._62O && f.draggingData && (f.draggingData = null, f.redraw()), Ui(p, K)
                        }
                    } else p._isV && f._43o(), p._isH && f._42o()
                }
            }, isV: function (P) {
                var E = this.list,
                    m = E._29I;
                return E._41o() && m.x + m.width - E.lp(P).x < co
            }, isH: function (s) {
                var U = this.list,
                    y = U._29I;
                return U._40o() && y.y + y.height - U.lp(s).y < co
            }, handle_mousewheel: function (u) {
                this.handleScroll(u, u.wheelDelta / 40, u.wheelDelta !== u.wheelDeltaX)
            }, handle_DOMMouseScroll: function (n) {
                this.handleScroll(n, -n.detail, 1)
            }, handleScroll: function (w, n, g) {
                var T = this.list;
                Qc(w), T.endEditing && T.endEditing(), g && T._41o() ? T.translate(0, n * T.getRowHeight()) : T._40o() && T.translate(10 * n, 0)
            }, handle_keydown: function (T) {
                if (!u.isInput(T.target)) {
                    var s, V = this.list,
                        t = V.sm(),
                        J = V._rows,
                        x = J.size();
                    if (Dq(T)) V.selectAll();
                    else if (qq(T)) V.handleDelete && V.handleDelete(T);
                    else if (bj(T)) "d" !== this._62O || this.dragCancel || (V.handleDragAndDrop(T, "cancel"), this.dragCancel = !0);
                    else if (Cf(T)) V.isCheckMode() && (s = V.getFocusData(), s && V.checkData(s));
                    else if (Nk(T) || ri(T)) {
                        var y = V.isCheckMode();
                        if (s = y ? V.getFocusData() : t.ld()) {
                            var X = V.getRowIndex(s);
                            X >= 0 && (Nk(T) ? 0 !== X && (s = J.get(X - 1), y ? V.setFocusData(s) : t.ss(s)) : X !== x - 1 && (s = J.get(X + 1), y ? V.setFocusData(s) : t.ss(s)))
                        } else x > 0 && (s = J.get(0), y ? V.setFocusData(s) : t.ss(s))
                    }
                }
            }, _34o: function (f, F) {
                var a = this.list,
                    m = a.lp(f).x;
                return m >= 0 && m <= a._indent ? (a.checkData(F), void 0) : (a.setFocusData(F), void 0)
            }, _33o: function (X, W) {
                var z = this.list,
                    S = z.sm(),
                    k = S.ld();
                if (!z.canHandleSelectMode(X, W)) return this._cancelDataDoubleSelect(), void 0;
                if (ik(X)) z.isSelected(W) ? S.rs(W) : S.as(W);
                else if (Pf(X))
                    if (k)
                        for (var Z = z.getRowIndex(k), E = z.getRowIndex(W); Z !== E;) Z += E > Z ? 1 : -1, S.as(z._rows.get(Z));
                    else S.ss(W);
                else jj(X) ? (S.contains(W) ? z.handleDataDoubleSelect && (this._handleDataDoubleSelect(X, W), wm(X) && this._cancelDataDoubleSelect()) : this._cancelDataDoubleSelect(), S.ss(W)) : S.contains(W) || S.ss(W)
            }, _handleDataDoubleSelect: function (e, p) {
                this._cancelDataDoubleSelect(), this._doubleSelectTimer = cd(function () {
                    this.list.handleDataDoubleSelect(e, p), this._doubleSelectTimer = Z
                }.bind(this), u.doubleClickSpeed)
            }, _cancelDataDoubleSelect: function () {
                this._doubleSelectTimer && (nr(this._doubleSelectTimer), this._doubleSelectTimer = Z)
            }
        }), Vs.TreeView = function (p) {
            var G = this;
            G._35o(), G._5o(p), new ct(G)
        }, Ws("TreeView", o, {
            ms_ac: [fe, Uo, Vm, "rootVisible", wi, "rootData", go, dj, df, gd, Ji, Vb, Jj, Yc, Ln, Zi, xj, Pi, op, "loader", "doubleClickToToggle"],
            ms_v: 1,
            ms_bnb: 1,
            ms_tip: 1,
            ms_fire: 1,
            ms_sm: 1,
            _49o: 1,
            ms_txy: 1,
            ms_lp: 1,
            ms_vs: 1,
            ms_hs: 1,
            _15Q: 1,
            ms_dm: 1,
            _48o: 1,
            _14Q: 1,
            _45o: 1,
            _checkMode: F,
            _indent: kc,
            _rowHeight: Oi,
            _rowLineVisible: u.treeViewRowLineVisible,
            _rowLineColor: u.treeViewRowLineColor,
            _scrollBarColor: Ch,
            _scrollBarSize: di,
            _autoHideScrollBar: jr,
            _expandIcon: u.treeViewExpandIcon,
            _collapseIcon: u.treeViewCollapseIcon,
            _autoMakeVisible: be,
            _selectBackground: u.treeViewSelectBackground,
            _labelColor: u.treeViewLabelColor,
            _labelSelectColor: u.treeViewLabelSelectColor,
            _labelFont: u.treeViewLabelFont,
            _doubleClickToToggle: u.treeViewDoubleClickToToggle,
            drawRow: function (f, b, L, C, m, D, A) {
                var B = this;
                B.drawRowBackground(f, b, L, C, m, D, A), B.drawTree(f, b, L, 0, m, D, A)
            }, isOnToggleIcon: function (P) {
                var T = this.getDataAt(P);
                if (T) {
                    var f = this.getIndent(),
                        e = this.lp(P).x;
                    if (ii(this.getToggleIcon(T))) {
                        var N = f * this.getLevel(T);
                        if (e >= N && N + f >= e) return !0
                    }
                }
                return !1
            }
        });
        var ct = function (G) {
            fi(ct, this, [G])
        };
        yc(ct, bt, {
            toggle: function (Y, u, A, t) {
                var P = this.list,
                    Z = P.lp(Y).x;
                if (ii(P.getToggleIcon(u))) {
                    var M = A * t;
                    if (Z >= M && M + A >= Z) return P.toggle(u), !0
                }
                return P.isDoubleClickToToggle() && wm(Y) ? (P.toggle(u), !0) : !1
            }, _34o: function (B, S) {
                var Y = this.list,
                    N = Y.lp(B).x,
                    n = Y._levelMap[S._id],
                    L = Y._indent,
                    u = L * (n + 1);
                return N >= u && u + L >= N ? (Y.checkData(S), void 0) : (this.toggle(B, S, L, n) || Y.setFocusData(S), void 0)
            }, _33o: function (Y, O) {
                var N = this,
                    p = N.list;
                if (!N.toggle(Y, O, p._indent, p.getLevel(O)))
                    if (Pf(Y)) {
                        var J = p.sm();
                        if (J.size() > 0) {
                            for (var b = p._rows, v = null, l = 0, T = b.size(); T > l; l++)
                                if (p.isSelected(b.get(l))) {
                                    v = l;
                                    break
                                }
                            for (var L = null, l = b.size() - 1; l >= 0; l--)
                                if (p.isSelected(b.get(l))) {
                                    L = l;
                                    break
                                }
                            var A, n, s = p.getRowIndex(O);
                            for (v > s ? (A = s - 1, n = v) : s > L ? (A = L, n = s) : (A = v, n = L); A !== n;) A++, J.as(p._rows.get(A))
                        } else J.ss(O)
                    } else ct.superClass._33o.call(N, Y, O)
            }, handle_keydown: function (C) {
                if (Wk(C) || _i(C)) {
                    var j = this.list,
                        u = j._rows,
                        _ = j.isCheckMode(),
                        S = j.sm(),
                        Y = _ ? j.getFocusData() : S.ld();
                    Y ? Y.hasChildren() && (Wk(C) ? j.collapse(Y) : j.expand(Y)) : u.size() > 0 && (Y = u.get(0), _ ? j.setFocusData(Y) : S.ss(Y))
                } else ct.superClass.handle_keydown.call(this, C)
            }
        });
        var dt = Vs.TableView = function (D) {
            this._98I(), this._5o(D), new et(this)
        };
        Ws("TableView", o, {
            ms_ac: [fe, Uo, Vm, "sortMode", Me, Zh, Jj, Yc, Ln, jh, Gr, "sortColumn", go, dj, df, gd, Ji, Pi, op],
            ms_v: 1,
            ms_fire: 1,
            ms_sm: 1,
            _49o: 1,
            ms_txy: 1,
            ms_lp: 1,
            ms_vs: 1,
            ms_hs: 1,
            _15Q: 1,
            ms_dm: 1,
            ms_tip: 1,
            _50o: 1,
            _45o: 1,
            _47o: 1,
            _sortMode: qh,
            _editable: !0,
            _batchEditable: !1,
            _rowHeight: Oi,
            _rowLineVisible: u.tableViewRowLineVisible,
            _rowLineColor: u.tableViewRowLineColor,
            _columnLineVisible: u.tableViewColumnLineVisible,
            _columnLineColor: u.tableViewColumnLineColor,
            _scrollBarColor: Ch,
            _scrollBarSize: di,
            _autoHideScrollBar: jr,
            _autoMakeVisible: be,
            _selectBackground: u.tableViewSelectBackground,
            _labelColor: u.tableViewLabelColor,
            _labelSelectColor: u.tableViewLabelSelectColor,
            _labelFont: u.tableViewLabelFont,
            getCheckColumn: function () {
                var s = this;
                if (!s._31o) {
                    var U = s._31o = new Ys;
                    U.setEditable(!0), U.setWidth(40), U.getValue = s.getCheckColumValue, U.drawCell = s.drawCheckColumnCell
                }
                return s._31o
            }, isCheckMode: function () {
                return this._39o.contains(this._31o)
            }, setCheckMode: function (i) {
                var D = this,
                    b = D._39o,
                    V = D.getCheckColumn();
                i !== D.isCheckMode() && (i ? b.add(V, 0) : b.remove(V), D.fp(wi, !i, i))
            }, getCheckColumValue: function (b, W, I) {
                return I.isSelected(b)
            }, drawCheckColumnCell: function (d, M, C, W, w, e, J, r, y) {
                Ii(d, y.getCheckIcon(M), w + J / 2, e + r / 2, M, y)
            }
        });
        var et = function (c) {
            fi(et, this, [c])
        };
        yc(et, bt, {
            _34o: function (c, d) {
                var g = this.list,
                    J = g._31o;
                if (g.isCellEditable(d, J, c)) {
                    var G = g._3Q(J),
                        E = g.lp(c).x;
                    if (G && E >= G.startX && E < G.startX + J.getWidth()) return g.checkData(d), void 0
                }
                g._37O(d, c), g.setFocusData(d)
            }, _33o: function (v, L) {
                this.list._37O(L, v), et.superClass._33o.apply(this, arguments)
            }
        });
        var ft = Vs.TreeTableView = function (z) {
            var U = this,
                N = U._4o = new Ys;
            U._35o(), U._98I(), U._5o(z), N.setDisplayName("Name"), N.setEditable(!0), N.setWidth(180), N.drawCell = gt, N.getValue = ht, U._39o.add(N), new it(U)
        },
            gt = function (h, r, J, n, a, B, D, G, p) {
                p.drawTree(h, r, J, a, B, D, G)
            },
            ht = function (C, n, d) {
                return d.getLabel(C)
            };
        Ws("TreeTableView", o, {
            ms_ac: [fe, Uo, Vm, "sortMode", Me, Zh, Vb, wi, "rootData", "rootVisible", go, dj, "sortColumn", Zi, xj, df, gd, Ji, Pi, Ln, Jj, Yc, jh, Gr, op, "loader"],
            ms_v: 1,
            ms_bnb: 1,
            ms_fire: 1,
            ms_sm: 1,
            _49o: 1,
            ms_txy: 1,
            ms_lp: 1,
            ms_vs: 1,
            ms_hs: 1,
            _15Q: 1,
            ms_dm: 1,
            ms_tip: 1,
            _50o: 1,
            _48o: 1,
            _14Q: 1,
            _45o: 1,
            _47o: 1,
            _sortMode: qh,
            _checkMode: F,
            _editable: !0,
            _batchEditable: !1,
            _indent: kc,
            _rowHeight: Oi,
            _rowLineVisible: u.treeTableViewRowLineVisible,
            _rowLineColor: u.treeTableViewRowLineColor,
            _columnLineVisible: u.treeTableViewColumnLineVisible,
            _columnLineColor: u.treeTableViewColumnLineColor,
            _expandIcon: u.treeTableViewExpandIcon,
            _collapseIcon: u.treeTableViewCollapseIcon,
            _scrollBarColor: Ch,
            _scrollBarSize: di,
            _autoHideScrollBar: jr,
            _autoMakeVisible: be,
            _selectBackground: u.treeTableViewSelectBackground,
            _labelColor: u.treeTableViewLabelColor,
            _labelSelectColor: u.treeTableViewLabelSelectColor,
            _labelFont: u.treeTableViewLabelFont,
            getTreeColumn: function () {
                return this._4o
            }
        });
        var it = function (E) {
            fi(it, this, [E])
        };
        yc(it, bt, {
            _34o: function (g, u) {
                var M = this.list,
                    h = M._4o,
                    e = M._3Q(h),
                    n = M.lp(g).x;
                if (e) {
                    var H = M._indent,
                        d = e.startX + H * M.getLevel(u);
                    if (ii(M.getToggleIcon(u)) && n >= d && d + H >= n) return M.toggle(u), void 0;
                    if (M.isCellEditable(u, h) && (d += H, n >= d && d + H >= n)) return M.checkData(u), void 0
                }
                M._37O(u, g), M.setFocusData(u)
            }, _33o: function (O, N) {
                var j = this.list,
                    J = j.lp(O).x;
                if (ii(j.getToggleIcon(N))) {
                    var f = j._3Q(j._4o);
                    if (f) {
                        var W = j._indent,
                            Z = f.startX + W * j.getLevel(N);
                        if (J >= Z && Z + W >= J) return j.toggle(N), void 0
                    }
                }
                j._37O(N, O), it.superClass._33o.apply(this, arguments)
            }
        });
        var jt = Vs.TableHeader = function (l) {
            var v = this,
                P = v._view = ve(1, v),
                s = v._39o = l.getColumnModel(),
                k = v.iv;
            v.tv = v._tableView = l, v._60I = new xr, v._canvas = uo(P), P.style.background = u.tableHeaderBackground || "", P.style.height = um + oe, s.mm(k, v), s.md(k, v), s.mh(k, v), l.mp(function (o) {
                Ms[o.property] && v.iv()
            }, v), new kt(v), v.iv()
        };
        Ws("TableHeader", o, {
            ms_v: 1,
            ms_lp: 1,
            ms_fire: 1,
            ms_ac: ["checkIcon", "sortDescIcon", "sortAscIcon", fe, Vm, Vb, "moveBackground", "insertColor", jh, Gr, "resizable", "movable"],
            _checkIcon: He,
            _movable: !0,
            _resizable: !0,
            _labelColor: u.tableHeaderLabelColor,
            _labelFont: u.tableHeaderLabelFont,
            _columnLineColor: u.tableHeaderColumnLineColor,
            _columnLineVisible: u.tableHeaderColumnLineVisible,
            _sortDescIcon: u.tableHeaderSortDescIcon,
            _sortAscIcon: u.tableHeaderSortAscIcon,
            _moveBackground: u.tableHeaderMoveBackground,
            _insertColor: u.tableHeaderInsertColor,
            _indent: kc,
            getCheckIcon: function () {
                return this._checkIcon
            }, getTableView: function () {
                return this.tv
            }, getLabel: function (X) {
                return X.toLabel()
            }, getLabelFont: function () {
                return this._labelFont
            }, getLabelColor: function (r) {
                return r.getColor() || this._labelColor
            }, getLabelAlign: function (F) {
                return F._align
            }, onPropertyChanged: function () {
                this.iv()
            }, _5Q: function (V) {
                this._61I = V, this.iv()
            }, getLogicalPoint: function (r) {
                return Nm(r, this._canvas, this.tv.tx())
            }, validateImpl: function () {
                var I = this,
                    V = I._canvas,
                    E = I.getWidth(),
                    i = I.getHeight(),
                    z = I.tv,
                    K = I._60I,
                    C = I._61I,
                    l = -z.tx(),
                    d = 0;
                (E !== V.clientWidth || i !== V.clientHeight) && Bn(V, E, i), K.clear(), I._39o._roots.each(function (f) {
                    if (f.isVisible()) {
                        var I = d + f.getWidth();
                        l + E >= d && I >= l && K.add({
                            column: f,
                            startX: d
                        }), d = I
                    }
                });
                var p = Wd(V);
                if (tf(p, -l, 0, 1), p.beginPath(), p.rect(l, 0, E, i), p.clip(), p.clearRect(l, 0, E, i), K.each(function (c) {
                    var F = c.column,
                        S = c.startX,
                        _ = F.getWidth();
                    _ > 0 && (p.save(), p.beginPath(), p.rect(S, 0, _, i), p.clip(), C && C.column === F || I.drawColumn(p, F, S, 0, _, i), I._columnLineVisible && fl(p, S + _ - 1, 0, 1, i, I._columnLineColor), p.restore())
                }), C) {
                    var L = C.column,
                        d = C.startX,
                        G = C.position,
                        k = L.getWidth();
                    p.save(), p.beginPath(), p.rect(d, 0, k, i), p.clip(), p.fillStyle = I._moveBackground, p.fill(), I.drawColumn(p, L, d, 0, k, i), p.restore(), cs(p, I._insertColor, G, 0, i)
                }
                p.restore()
            }, _6Q: function ($) {
                var m = this.tv;
                return m._31o === $ && m.sm().getSelectionMode() === tb
            }, drawColumn: function (n, C, S, L, c, y) {
                var E = this,
                    h = E.tv,
                    H = ii(C.getIcon()),
                    W = E.getLabelAlign(C);
                if (E._6Q(C)) {
                    var R = ii(E._checkIcon);
                    Ii(n, R, S + c / 2, L + y / 2, C, E)
                } else {
                    var D = E.getLabel(C),
                        a = E.getLabelFont(C),
                        Q = E.getLabelColor(C),
                        N = ln(a, D).width,
                        k = H ? E._indent : 0;
                    W === nq ? (H && qk(n, H, Mg, S, L, k, y), nd(n, D, a, Q, S + k, L, c, y, nq)) : W === fm ? (H && qk(n, H, Mg, S + c - N - k, L, k, y), nd(n, D, a, Q, S, L, c, y, fm)) : (H && qk(n, H, Mg, S + (c - N - k) / 2, L, k, y), nd(n, D, a, Q, S + (c - N + k) / 2, L, 0, y, nq))
                } if (C.isSortable() && h.getSortColumn() === C && (H = ii(C.getSortOrder() === Sh ? E._sortAscIcon : E._sortDescIcon))) {
                    var g = xc(H, C) / 2 + 2;
                    Ii(n, H, W === fm ? S + g : S + c - g, L + y / 2, C, h)
                }
            }
        });
        var kt = function (J) {
            var O = this;
            O.th = J, O.tv = J._tableView, O.addListeners()
        };
        yc(kt, o, {
            ms_listener: 1,
            getView: function () {
                return this.th.getView()
            }, setCursor: function (O) {
                this.getView().style.cursor = O
            }, handle_mousemove: function (J) {
                if (!si) {
                    var $ = this;
                    delete $._29o, $.setCursor(lp);
                    for (var m = $.th, v = m._60I, F = m.lp(J).x, f = v.size() - 1; f >= 0; f--) {
                        var l = v.get(f),
                            W = l.column,
                            E = l.startX + W.getWidth();
                        if (m.isResizable() && X(E - F) <= (nf ? 10 : 3)) return $._29o = l, $.setCursor(Nc), void 0;
                        F > l.startX && E > F && ($._29o = l), (W.isClickable() || W.isSortable() || m.isMovable() || $.tv.getCheckColumn && W === $.tv.getCheckColumn()) && F > l.startX && E > F && $.setCursor(Zk)
                    }
                }
            }, handle_mousedown: function (P) {
                this.handle_touchstart(P)
            }, handle_touchstart: function (d) {
                var E = this;
                Qc(d), E.tv.endEditing(), E.handle_mousemove(d), E._29o && (E.x = lb(d).x, E.lx = E.th.lp(d).x, E.w = E._29o.column.getWidth(), Ui(E, d))
            }, handleWindowMouseMove: function (o) {
                this.handleWindowTouchMove(o)
            }, handleWindowTouchMove: function (P) {
                var B = this,
                    t = B.th,
                    b = B.getView().style.cursor,
                    o = B._29o,
                    F = lb(P).x - B.x;
                if (B.resizing || B.moving || (b === Nc ? B.resizing = 1 : t.isMovable() && b === Zk && X(F) > 2 && (B.moving = 1)), B.resizing) o.column.setWidth(B.w + F);
                else if (B.moving) {
                    var $ = B.lx + F;
                    t._60I.each(function (E) {
                        var S = E.startX,
                            q = S + E.column.getWidth();
                        if ($ >= S && q >= $) {
                            var h = {
                                column: o.column,
                                startX: o.startX + F,
                                front: q - $ > $ - S,
                                insertColumn: E.column
                            };
                            h.position = h.front ? S : q, t._5Q(h)
                        }
                    })
                }
            }, _16Q: function (F, o) {
                var S = this,
                    N = S.tv,
                    b = S.th,
                    B = b._checkIcon;
                if (b._6Q(F)) {
                    var g = ii(B),
                        Z = S.lx,
                        G = F.getWidth(),
                        i = xc(g, F);
                    if (Z >= o + G / 2 - i && o + G / 2 + i >= Z) {
                        b.setCheckIcon(B === tm ? He : tm);
                        var y = N.sm(),
                            U = N._rows;
                        return B === tm ? y.rs(U) : y.ss(U), N.onCheckColumnClicked(F), !0
                    }
                }
                return !1
            }, handleWindowMouseUp: function (T) {
                this.handleWindowTouchEnd(T)
            }, handleWindowTouchEnd: function (Z) {
                var L = this,
                    P = L.tv,
                    g = L.th,
                    u = L._29o;
                if (L.moving) {
                    var W = g._61I;
                    if (W && W.insertColumn !== W.column) {
                        var $ = W.column,
                            q = P.getColumnModel()._roots,
                            I = q.remove($),
                            _ = q.indexOf(W.insertColumn);
                        _ >= 0 && (W.front || _++, _ <= q.size() && (q.add($, _), P.getColumnModel()._38I($, I, _)))
                    }
                    g._5Q(F), delete L.moving
                } else if (!L.resizing && u) {
                    $ = u.column;
                    var R = g.lp(Z).x,
                        J = u.startX,
                        N = !0;
                    if (g.onColumnClicked) {
                        var v = g.onColumnClicked($, Z, J);
                        v === !1 && (N = !1)
                    }
                    if (N && R >= J && R <= J + $.getWidth() && !L._16Q($, J)) {
                        if ($.isSortable()) {
                            var m = P.getSortMode(),
                                e = $.getSortOrder();
                            m === qh ? P.getSortColumn() === $ ? (e === rj && P.setSortColumn(F), $.setSortOrder(e === Sh ? rj : Sh)) : P.setSortColumn($) : "bistate" === m && (P.getSortColumn() === $ ? $.setSortOrder(e === Sh ? rj : Sh) : P.setSortColumn($))
                        }
                        P.onColumnClicked($, Z, J)
                    }
                }
                L._29o = L.resizing = L.x = L.lx = L.w = F
            }
        }), Vs.TablePane = function (C) {
            this.init(new dt(C))
        }, Ws("TablePane", o, {
            ms_v: 1,
            _44o: 1
        }), Vs.TreeTablePane = function (Z) {
            this.init(new ft(Z))
        }, Ws("TreeTablePane", o, {
            ms_v: 1,
            _44o: 1
        }), Vs.Toolbar = function (O) {
            var p = this,
                B = p._view = ve(1, p),
                r = B.style;
            r.background = u.toolbarBackground || "", r.height = Jk + oe, p._canvas = uo(B), p._30o = new xr, p._90I = new xr, p.setItems(O || []), B.handleGroupSelectedChanged = function (O) {
                if (O.isSelected()) {
                    var m = O.getGroupId();
                    null != m && p._items.forEach(function (H) {
                        var F = H.element;
                        F && F !== O && F.setSelected && F.getGroupId && F.getGroupId() === m && F.setSelected(!1)
                    })
                }
            }, new lt(p)
        }, Ws("Toolbar", o, {
            ms_v: 1,
            ms_fire: 1,
            ms_tx: 1,
            ms_lp: 1,
            ms_tip: 1,
            ms_value: 1,
            ms_ac: [Uj, fe, Vm, Uo, op, "itemGap", "separatorColor", "currentItem", "stickToRight"],
            _labelColor: u.toolbarLabelColor,
            _labelSelectColor: u.toolbarLabelSelectColor,
            _labelFont: u.toolbarLabelFont,
            _selectBackground: u.toolbarSelectBackground,
            _itemGap: u.toolbarItemGap,
            _separatorColor: u.toolbarSeparatorColor,
            _stickToRight: !1,
            getSumWidth: function () {
                return this._64I
            }, getToolTip: function (u) {
                var X = this.getItemInfoAt(u);
                return X ? X.item.toolTip : F
            }, getLabelColor: function (m) {
                return m && m.selected && m.type !== tm && m.type !== Hp ? this._labelSelectColor : this._labelColor
            }, onPropertyChanged: function (w) {
                this.iv(), w.property === Uj && this._items.forEach(function (z) {
                    bh(z)
                })
            }, redraw: function () {
                this.iv()
            }, addItem: function (Q, d) {
                var N = this._items;
                d == F ? N.push(Q) : N.splice(d, 0, Q), this.fp(Uj, F, N)
            }, removeItem: function (G) {
                if (G)
                    for (var d = this._items, c = 0; c < d.length; c++) G === d[c] && (d.splice(c, 1), this.fp(Uj, F, d))
            }, removeItemById: function (b) {
                if (b != F)
                    for (var K = this._items, q = 0; q < K.length; q++)
                        if (b === K[q].id) {
                            var _ = K.splice(q, 1)[0];
                            return this.fp(Uj, F, K), _
                        }
            }, getItemById: function (x) {
                if (x != F)
                    for (var y = this._items, d = 0; d < y.length; d++) {
                        var H = y[d];
                        if (x === H.id) return H
                    }
            }, setItemVisible: function (y, f) {
                var z = this.getItemById(y);
                z && (z.visible = f)
            }, getItemInfos: function () {
                return this._30o
            }, getItemInfoAt: function (p) {
                var R = this,
                    e = 0,
                    Y = R._30o,
                    L = R.lp(p),
                    r = L.x,
                    Q = L.y;
                if (Q >= 0 && Q <= R.getHeight())
                    for (; e < Y.size(); e++) {
                        var Z = Y.get(e);
                        if (Z.startX <= r && r <= Z.endX) return Z
                    }
                return F
            }, drawItem: function ($, K, x, G, s) {
                if (K.visible === !1) return 0;
                if (Mf(K.visible) && !K.visible()) return 0;
                var q = this,
                    n = K.disabled;
                n && ($.globalAlpha = Nn);
                var v = q.drawItemImpl($, K, x, G, s),
                    o = q._itemGap;
                return n && ($.globalAlpha = 1), this._currentItem !== K || "separator" === K || K.separator === !0 || K.unfocusable || Ie($, q._separatorColor, x - o / 2, 0, v + o, G), v
            }, drawItemImpl: function (m, B, g, r, R) {
                var J = this,
                    A = J._view,
                    C = J._itemGap,
                    _ = r / 2,
                    M = B.type,
                    p = B.element,
                    f = B.label;
                dk(p) && (f = p, p = F);
                var x, I = J.getLabelFont(B),
                    v = J.getLabelColor(B),
                    X = B.selected,
                    H = ii(B.icon),
                    E = xc(H, B),
                    z = 0,
                    j = E + (f ? ln(I, f).width : 0);
                if ("separator" === B || B.separator === !0) return cs(m, J._separatorColor, g, r / 4, _), 1;
                if (p) {
                    H && Ii(m, H, g + E / 2, _, B, J), nd(m, f, I, v, g + E, 0, 0, r);
                    var Q = Bq(p);
                    R || J._90I.add(Q), Q.parentNode !== A && sn(A, Q), p.iv && p.iv(), p.validate && p.validate();
                    var l = Q.getBoundingClientRect(),
                        t = l.width,
                        S = Q.style;
                    return uj(Q), S.left = J.tx() + g + j + oe, S.top = (r - l.height) / 2 + oe, j + t
                }
                return M === Hp ? x = ii(X ? kj : yb) : M === tm && (x = ii(X ? tm : He)), x ? (z = xc(x, B), Ii(m, x, g + z / 2, _, B, J), g += z, j += z) : X && fl(m, g - C / 2, 0, j + C, r, J.getSelectBackground(B)), H && Ii(m, H, g + E / 2, _, B, J), nd(m, f, I, v, g + E, 0, 0, r), j
            }, validateImpl: function () {
                var O = this,
                    Y = O._canvas,
                    f = O.getWidth(),
                    B = O.getHeight(),
                    b = O._30o,
                    S = O._items;
                Bn(Y, f, B);
                var M = Wd(Y),
                    J = O._itemGap,
                    N = J / 2;
                tf(M, O.tx(), 0, 1), M.clearRect(0, 0, f, B);
                var T = O._90I;
                O._90I = new xr, b.clear(), S.forEach(function (L) {
                    var G = O.drawItem(M, L, N, B);
                    b.add({
                        item: L,
                        startX: N,
                        endX: N + G,
                        width: G
                    }), G && (N += G + J)
                }), T.each(function (N) {
                    O._90I.contains(N) || yj(N)
                });
                var p = O._64I;
                O._64I = q(0, N), M.restore(), O._stickToRight ? (O._65O = 0, M = Wd(Y), N = f - O._64I + J, tf(M, 0, 0, 1), M.clearRect(0, 0, f, B), b.clear(), S.forEach(function (I) {
                    var d = O.drawItem(M, I, N, B, !0);
                    b.add({
                        item: I,
                        startX: N,
                        endX: N + d,
                        width: d
                    }), d && (N += d + J)
                }), M.restore()) : O.tx(O.tx()), p !== O._64I && O.onSumWidthChanged(p, O._64I)
            }, onSumWidthChanged: function () { }, handleClick: function (i, S) {
                var m = this,
                    l = i.type,
                    K = i.action,
                    V = i.groupId,
                    f = i.selected;
                i.disabled || (V != F ? f || (i.selected = !0, this._items.forEach(function (a) {
                    a.groupId === V && i !== a && (a.selected = !1)
                }), K && i.action(i, m, S)) : l === tm || "toggle" === l ? (i.selected = !f, K && i.action(i, m, S)) : K && i.action(i, m, S)), Um(), m.iv()
            }
        });
        var lt = function (o) {
            this.tb = o, this.addListeners()
        };
        yc(lt, o, {
            ms_listener: 1,
            getView: function () {
                return this.tb._view
            }, handle_mousewheel: function (a) {
                this.handleScroll(a, 10 * (a.wheelDelta / 40))
            }, handle_DOMMouseScroll: function (z) {
                this.handleScroll(z, 10 * -z.detail)
            }, handleScroll: function (L, U) {
                Qc(L);
                var W = this.tb;
                W.isScrollable() && !W._stickToRight && (W.tx(W.tx() + U), ek())
            }, handle_mousemove: function (h) {
                var s = this;
                si || s.setItem(h)
            }, handle_mouseout: function (V) {
                var J = this;
                V.target === J.getView() ? J.tb.setCurrentItem(F) : J.handle_mousemove(V)
            }, handle_mousedown: function (q) {
                this.handle_mousemove(q), this.handle_touchstart(q)
            }, handle_touchstart: function (b) {
                var X = this,
                    g = X.tb,
                    c = b.target;
                jj(b) && (c === X.getView() || c === g._canvas) && (Qc(b), g.setFocus(b) && (this.setItem(b, !0), (g.isScrollable() || X.info && !X.info.item.disabled) && (X.x = lb(b).x, X.tx = g.tx(), Ui(X, b))))
            }, handleWindowMouseMove: function (A) {
                this.handleWindowTouchMove(A)
            }, handleWindowTouchMove: function (l) {
                var q = this,
                    W = q.tb;
                if (!W._stickToRight) {
                    var h = lb(l).x - q.x;
                    !q._25o && X(h) > 2 && W.isScrollable() && (q._25o = 1), q._25o && W.tx(q.tx + h)
                }
            }, handleWindowMouseUp: function (h) {
                this.handleWindowTouchEnd(h)
            }, handleWindowTouchEnd: function (v) {
                var j = this,
                    c = j.tb,
                    P = j.info,
                    k = j.tb.getItemInfoAt(v);
                if (!j._25o && P) {
                    var W = P.item;
                    k && k.item === W && c.handleClick(W, v)
                }
                j._25o = j.x = j.tx = F, j.setItem()
            }, setItem: function (i, $) {
                var G = this,
                    Q = G.tb,
                    u = G.info = i ? Q.getItemInfoAt(i) : F,
                    V = u ? u.item : F;
                Q.setCurrentItem(V), $ && V && Mf(V.onDown) && V.onDown(i)
            }
        }), Vs.BorderPane = function () {
            this._view = ve(1, this), this.iv()
        }, Ws("BorderPane", o, {
            ms_v: 1,
            ms_ac: ["topHeight", "bottomHeight", "leftWidth", "rightWidth"],
            ms_fire: 1,
            getLeftView: function () {
                return this._leftView
            }, setLeftView: function (O, B) {
                this._12o("leftView", O), B != F && this.setLeftWidth(B)
            }, getRightView: function () {
                return this._rightView
            }, setRightView: function (J, w) {
                this._12o("rightView", J), w != F && this.setRightWidth(w)
            }, getTopView: function () {
                return this._topView
            }, setTopView: function (M, S) {
                this._12o("topView", M), S != F && this.setTopHeight(S)
            }, getBottomView: function () {
                return this._bottomView
            }, setBottomView: function (Q, R) {
                this._12o("bottomView", Q), R != F && this.setBottomHeight(R)
            }, getCenterView: function () {
                return this._centerView
            }, setCenterView: function (j) {
                this._12o("centerView", j)
            }, _12o: function (k, T) {
                var f = this,
                    g = "_" + k,
                    Q = f._view,
                    X = f[g];
                X !== T && (X && (X.getView ? yj(X.getView()) : yj(X)), f[g] = T, T && (T.getView ? sn(Q, T.getView(), 1) : sn(Q, T, 1)), f.fp(k, X, T))
            }, onPropertyChanged: function () {
                this.iv()
            }, validateImpl: function () {
                var u = this,
                    m = u._topView,
                    W = u._bottomView,
                    f = u._leftView,
                    t = u._rightView,
                    E = u._centerView,
                    r = u.getWidth(),
                    T = u.getHeight(),
                    z = 0,
                    e = 0,
                    n = r,
                    P = T,
                    A = 0,
                    I = 0,
                    h = 0,
                    L = 0;
                m && (A = u._topHeight == F ? zp(m) : u._topHeight, e = A), W && (I = u._bottomHeight == F ? zp(W) : u._bottomHeight, P = T - I), f && (h = u._leftWidth == F ? oh(f) : u._leftWidth, z = h), t && (L = u._rightWidth == F ? oh(t) : u._rightWidth, n = r - L);
                var l = q(0, n - z),
                    k = q(0, P - e);
                m && qp(m, 0, 0, r, A), W && qp(W, 0, P, r, I), f && qp(f, 0, e, h, k), t && qp(t, n, e, L, k), E && qp(E, z, e, l, k)
            }
        })
    }
}("undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : (0, eval)("this"), Object);