From aee5908912ad126d4e57a0aea5fa0d2b5e4ed6e8 Mon Sep 17 00:00:00 2001 From: josdejong Date: Fri, 31 Jan 2014 16:00:20 +0100 Subject: [PATCH] Released version 0.4.0 --- dist/img/downarrow.png | Bin 0 -> 4460 bytes dist/img/leftarrow.png | Bin 0 -> 4531 bytes dist/img/minus.png | Bin 0 -> 4147 bytes dist/img/plus.png | Bin 0 -> 4341 bytes dist/img/rightarrow.png | Bin 0 -> 4514 bytes dist/img/uparrow.png | Bin 0 -> 4461 bytes dist/img/zoomExtends.png | Bin 0 -> 4464 bytes dist/vis.css | 8 + dist/vis.js | 10619 +++++++++++----- dist/vis.min.js | 18 +- docs/graph.html | 964 +- docs/img/vis_overview.odg | Bin 32645 -> 17762 bytes docs/img/vis_overview.png | Bin 49562 -> 64008 bytes docs/index.html | 2 +- docs/timeline.html | 151 +- download/vis.zip | Bin 941597 -> 1021812 bytes examples/graph/02_random_nodes.html | 13 +- examples/graph/07_selections.html | 8 +- examples/graph/17_network_info.html | 2 +- .../18_fully_random_nodes_clustering.html | 102 + .../graph/19_scale_free_graph_clustering.html | 141 + examples/graph/20_navigation.html | 181 + examples/graph/index.html | 3 + examples/timeline/02_dataset.html | 16 +- examples/timeline/06_event_listeners.html | 53 + examples/timeline/index.html | 1 + index.html | 2 +- 27 files changed, 8716 insertions(+), 3568 deletions(-) create mode 100644 dist/img/downarrow.png create mode 100644 dist/img/leftarrow.png create mode 100644 dist/img/minus.png create mode 100644 dist/img/plus.png create mode 100644 dist/img/rightarrow.png create mode 100644 dist/img/uparrow.png create mode 100644 dist/img/zoomExtends.png create mode 100644 examples/graph/18_fully_random_nodes_clustering.html create mode 100644 examples/graph/19_scale_free_graph_clustering.html create mode 100644 examples/graph/20_navigation.html create mode 100644 examples/timeline/06_event_listeners.html diff --git a/dist/img/downarrow.png b/dist/img/downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e77d5e6d4157b12a5b2fa08a9fc138f0ab9eb4e7 GIT binary patch literal 4460 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�EM>-Bgb&Rym2{we-b7Oawc(c4k4MzLw~<#m(JZ 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 Re)#|Z002ovPDHLkV1iMdkGuc? literal 0 HcmV?d00001 diff --git a/dist/img/minus.png b/dist/img/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..30698076b9ac59f0880752ddc13af3f6bf062403 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/dist/img/plus.png b/dist/img/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ab2a334e566b6deb9657d7d8370f591bfb81bc GIT binary patch literal 4341 zcmV!P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000IcNklZ0y)aS=B_F>$~A z_;!gITGr7pim8wdAki-d6r|q|UQ%GaA2{5x z_NzJ&Mktef;As^kcOJI-g}a1+A%P2GT4vz7P(aG4K?0SZH;(K^75onkoO1vh0oFj7 zfR5Na_mboluEkSVcIU+}7_dg9jsQT>`!hTn<*3!{LR@l-j_lG zI}XThicuj1p0xk8@#VR1oWr+}*V?wvukG5q7$iv9)3myG>!iSrf5{Hf#&!bOHfP7j zTO8Xu#~VE5J(2WkYh}rm!HYHpg{+ty&+~b^oP|kCz2kNFUHh}+jZ42>Wda#HPp$6R z9z0WHa;oq;74Yl1yN_&~@vAEndGgGe^`%z_J8X&y6b0Xxw_{sW$Bx){wV#&^+E+rT~oH-bXEW$I}#NTpm^$<_80R0aN)uH6DaD@ zcSSwseIlvIefh$Y{2K&!jLK2?>32+twlxPT5$YOh9`okFhI#Zgk=Db6PNE^F>PH)%II+(5)2FYk>urlGh$}C6*X2K&t4{^tc4JT$;(~g z(8Tok8z3zfs4##7#pWUfT1T$cB#Q{3FnM|R{gipFb$dzIP^T@}4uf8r&uUDLVHhZ_ zn^O(|40LIsLVC2_^NiyK=XVkcy#O#juAuuvcP&6J5fC|~V0Qe1fuOM+tn~1a-6H@&`zPfVo;IiKJj!p!Wj6 z)u9fX5(`eP@>GWk-_d0)lj{7izOcM|VQX*1Dv>CZXZGM4_xuB>=C(r*QGSPgb zfB-ZM^i#yzch?=67UdWQ0DEk%$2Hh#D?XN9uBbpNC@Kg{Dj6V-F8jP10MC?34jLk%K)fFEZ=xF z3To0yQ3AdSGNK)xr)O+)26a0J+v3GMyQm@3KuAebe}lEu`j`g*7A2H;|MAH2_a_S9 zqjmGj$EHQW0PtQ>W5{}F@ikim3qymD{6Ii7d7T+y<;|S2lXkKPNxSb{hN6Zt_@OkH zesR(uab@UI>LAsyYE-5Udms|Gd6;b|?em zK}-gOmXCYhpDk2Skjg4n`OWEc+q(w`41IpFr>%txT^Ed4>Zjph>>dv zdq&4%?Rwl3a5Dhxzp=OI;LW!)Co_^3W%rPR#~X^v%RXIN4ieL&vOJUN|EK40=8>L* zMT#0Ex74n$y*Fk9x$*Yk+4K$ZF+wSB^q$O4j7aI5HD%twcth#Y_TG-cmZUGfyb~*; zkQSBY*=(tgYQ^7RFxR00000NkvXXu0mjfp~Nvu literal 0 HcmV?d00001 diff --git a/dist/img/rightarrow.png b/dist/img/rightarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..c3a209d8b0a58355305aae03b5520a1e070d8eab GIT binary patch literal 4514 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 literal 0 HcmV?d00001 diff --git a/dist/img/zoomExtends.png b/dist/img/zoomExtends.png new file mode 100644 index 0000000000000000000000000000000000000000..74595c6358448fbdcfbd62629084841ca7e8b8a9 GIT binary patch literal 4464 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 select it + selection.push(item.id); + } + else { + // item is already selected -> deselect it + selection.splice(index, 1); + } + this.setSelection(selection); + + this._trigger('select', { + items: this.getSelection() + }); + + event.stopPropagation(); +}; + +/** + * Find an item from an event target: + * searches for the attribute 'timeline-item' in the event target's element tree + * @param {Event} event + * @return {Item | null| item + * @private + */ +Timeline.prototype._itemFromTarget = function _itemFromTarget (event) { + var target = event.target; + while (target) { + if (target.hasOwnProperty('timeline-item')) { + return target['timeline-item']; + } + target = target.parentNode; + } + + return null; +}; (function(exports) { /** * Parse a text source containing data in DOT language into a JSON object. @@ -8673,6 +8955,8 @@ function Node(properties, imagelist, grouplist, constants) { this.selected = false; this.edges = []; // all edges connected to this node + this.dynamicEdges = []; + this.reroutedEdges = {}; this.group = constants.nodes.group; this.fontSize = constants.nodes.fontSize; @@ -8689,24 +8973,53 @@ function Node(properties, imagelist, grouplist, constants) { this.y = 0; this.xFixed = false; this.yFixed = false; + this.horizontalAlignLeft = true; // these are for the navigation controls + this.verticalAlignTop = true; // these are for the navigation controls this.radius = constants.nodes.radius; + this.baseRadiusValue = constants.nodes.radius; this.radiusFixed = false; this.radiusMin = constants.nodes.radiusMin; this.radiusMax = constants.nodes.radiusMax; this.imagelist = imagelist; + this.grouplist = grouplist; this.setProperties(properties, constants); + // creating the variables for clustering + this.resetCluster(); + this.dynamicEdgesLength = 0; + this.clusterSession = 0; + this.clusterSizeWidthFactor = constants.clustering.nodeScaling.width; + this.clusterSizeHeightFactor = constants.clustering.nodeScaling.height; + this.clusterSizeRadiusFactor = constants.clustering.nodeScaling.radius; + // mass, force, velocity - this.mass = 50; // kg (mass is adjusted for the number of connected edges) + this.mass = 1; // kg (mass is adjusted for the number of connected edges) this.fx = 0.0; // external force x this.fy = 0.0; // external force y this.vx = 0.0; // velocity x this.vy = 0.0; // velocity y this.minForce = constants.minForce; - this.damping = 0.9; // damping factor + this.damping = 0.9; + this.dampingFactor = 75; + + this.graphScaleInv = 1; + this.canvasTopLeft = {"x": -300, "y": -300}; + this.canvasBottomRight = {"x": 300, "y": 300}; +} + +/** + * (re)setting the clustering variables and objects + */ +Node.prototype.resetCluster = function() { + // clustering variables + this.formationScale = undefined; // this is used to determine when to open the cluster + this.clusterSize = 1; // this signifies the total amount of nodes in this cluster + this.containedNodes = {}; + this.containedEdges = {}; + this.clusterSessions = []; }; /** @@ -8717,6 +9030,10 @@ Node.prototype.attachEdge = function(edge) { if (this.edges.indexOf(edge) == -1) { this.edges.push(edge); } + if (this.dynamicEdges.indexOf(edge) == -1) { + this.dynamicEdges.push(edge); + } + this.dynamicEdgesLength = this.dynamicEdges.length; this._updateMass(); }; @@ -8728,7 +9045,9 @@ Node.prototype.detachEdge = function(edge) { var index = this.edges.indexOf(edge); if (index != -1) { this.edges.splice(index, 1); + this.dynamicEdges.splice(index, 1); } + this.dynamicEdgesLength = this.dynamicEdges.length; this._updateMass(); }; @@ -8738,7 +9057,7 @@ Node.prototype.detachEdge = function(edge) { * @private */ Node.prototype._updateMass = function() { - this.mass = 50 + 20 * this.edges.length; // kg + this.mass = 1 + 0.6 * this.edges.length; // kg }; /** @@ -8750,15 +9069,20 @@ Node.prototype.setProperties = function(properties, constants) { if (!properties) { return; } - + this.originalLabel = undefined; // basic properties - if (properties.id != undefined) {this.id = properties.id;} - if (properties.label != undefined) {this.label = properties.label;} - if (properties.title != undefined) {this.title = properties.title;} - if (properties.group != undefined) {this.group = properties.group;} - if (properties.x != undefined) {this.x = properties.x;} - if (properties.y != undefined) {this.y = properties.y;} - if (properties.value != undefined) {this.value = properties.value;} + if (properties.id !== undefined) {this.id = properties.id;} + if (properties.label !== undefined) {this.label = properties.label; this.originalLabel = properties.label;} + if (properties.title !== undefined) {this.title = properties.title;} + if (properties.group !== undefined) {this.group = properties.group;} + if (properties.x !== undefined) {this.x = properties.x;} + if (properties.y !== undefined) {this.y = properties.y;} + if (properties.value !== undefined) {this.value = properties.value;} + + // navigation controls properties + if (properties.horizontalAlignLeft !== undefined) {this.horizontalAlignLeft = properties.horizontalAlignLeft;} + if (properties.verticalAlignTop !== undefined) {this.verticalAlignTop = properties.verticalAlignTop;} + if (properties.triggerFunction !== undefined) {this.triggerFunction = properties.triggerFunction;} if (this.id === undefined) { throw "Node must have an id"; @@ -8775,17 +9099,16 @@ Node.prototype.setProperties = function(properties, constants) { } // individual shape properties - if (properties.shape != undefined) {this.shape = properties.shape;} - if (properties.image != undefined) {this.image = properties.image;} - if (properties.radius != undefined) {this.radius = properties.radius;} - if (properties.color != undefined) {this.color = Node.parseColor(properties.color);} - - if (properties.fontColor != undefined) {this.fontColor = properties.fontColor;} - if (properties.fontSize != undefined) {this.fontSize = properties.fontSize;} - if (properties.fontFace != undefined) {this.fontFace = properties.fontFace;} + if (properties.shape !== undefined) {this.shape = properties.shape;} + if (properties.image !== undefined) {this.image = properties.image;} + if (properties.radius !== undefined) {this.radius = properties.radius;} + if (properties.color !== undefined) {this.color = Node.parseColor(properties.color);} + if (properties.fontColor !== undefined) {this.fontColor = properties.fontColor;} + if (properties.fontSize !== undefined) {this.fontSize = properties.fontSize;} + if (properties.fontFace !== undefined) {this.fontFace = properties.fontFace;} - if (this.image != undefined) { + if (this.image !== undefined) { if (this.imagelist) { this.imageObj = this.imagelist.load(this.image); } @@ -8794,9 +9117,9 @@ Node.prototype.setProperties = function(properties, constants) { } } - this.xFixed = this.xFixed || (properties.x != undefined); - this.yFixed = this.yFixed || (properties.y != undefined); - this.radiusFixed = this.radiusFixed || (properties.radius != undefined); + this.xFixed = this.xFixed || (properties.x !== undefined); + this.yFixed = this.yFixed || (properties.y !== undefined); + this.radiusFixed = this.radiusFixed || (properties.radius !== undefined); if (this.shape == 'image') { this.radiusMin = constants.nodes.widthMin; @@ -8819,7 +9142,6 @@ Node.prototype.setProperties = function(properties, constants) { case 'star': this.draw = this._drawStar; this.resize = this._resizeShape; break; default: this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; } - // reset the size of the node, this can be changed this._reset(); }; @@ -8847,6 +9169,7 @@ Node.parseColor = function(color) { c = {}; c.background = color.background || 'white'; c.border = color.border || c.background; + if (util.isString(color.highlight)) { c.highlight = { border: color.highlight, @@ -8859,6 +9182,7 @@ Node.parseColor = function(color) { c.highlight.border = color.highlight && color.highlight.border || c.border; } } + return c; }; @@ -8878,13 +9202,21 @@ Node.prototype.unselect = function() { this._reset(); }; + /** * Reset the calculated size of the node, forces it to recalculate its size - * @private */ -Node.prototype._reset = function() { - this.width = undefined; - this.height = undefined; +Node.prototype.clearSizeCache = function() { + this._reset(); +}; + +/** + * Reset the calculated size of the node, forces it to recalculate its size + * @private + */ +Node.prototype._reset = function() { + this.width = undefined; + this.height = undefined; }; /** @@ -8974,15 +9306,15 @@ Node.prototype.discreteStep = function(interval) { if (!this.xFixed) { var dx = -this.damping * this.vx; // damping force var ax = (this.fx + dx) / this.mass; // acceleration - this.vx += ax / interval; // velocity - this.x += this.vx / interval; // position + this.vx += ax * interval; // velocity + this.x += this.vx * interval; // position } if (!this.yFixed) { var dy = -this.damping * this.vy; // damping force var ay = (this.fy + dy) / this.mass; // acceleration - this.vy += ay / interval; // velocity - this.y += this.vy / interval; // position + this.vy += ay * interval; // velocity + this.y += this.vy * interval; // position } }; @@ -9002,9 +9334,16 @@ Node.prototype.isFixed = function() { */ // TODO: replace this method with calculating the kinetic energy Node.prototype.isMoving = function(vmin) { - return (Math.abs(this.vx) > vmin || Math.abs(this.vy) > vmin || - (!this.xFixed && Math.abs(this.fx) > this.minForce) || - (!this.yFixed && Math.abs(this.fy) > this.minForce)); + + if (Math.abs(this.vx) > vmin || Math.abs(this.vy) > vmin) { +// console.log(vmin,this.vx,this.vy); + return true; + } + else { + this.vx = 0; this.vy = 0; + return false; + } + //return (Math.abs(this.vx) > vmin || Math.abs(this.vy) > vmin); }; /** @@ -9052,6 +9391,7 @@ Node.prototype.setValueRange = function(min, max) { this.radius = (this.value - min) * scale + this.radiusMin; } } + this.baseRadiusValue = this.radius; }; /** @@ -9078,20 +9418,28 @@ Node.prototype.resize = function(ctx) { * @return {boolean} True if location is located on node */ Node.prototype.isOverlappingWith = function(obj) { - return (this.left < obj.right && - this.left + this.width > obj.left && - this.top < obj.bottom && - this.top + this.height > obj.top); + return (this.left < obj.right && + this.left + this.width > obj.left && + this.top < obj.bottom && + this.top + this.height > obj.top); }; Node.prototype._resizeImage = function (ctx) { // TODO: pre calculate the image size - if (!this.width) { // undefined or 0 + + if (!this.width || !this.height) { // undefined or 0 var width, height; if (this.value) { + this.radius = this.baseRadiusValue; var scale = this.imageObj.height / this.imageObj.width; - width = this.radius || this.imageObj.width; - height = this.radius * scale || this.imageObj.height; + if (scale !== undefined) { + width = this.radius || this.imageObj.width; + height = this.radius * scale || this.imageObj.height; + } + else { + width = 0; + height = 0; + } } else { width = this.imageObj.width; @@ -9099,7 +9447,14 @@ Node.prototype._resizeImage = function (ctx) { } this.width = width; this.height = height; + + if (this.width > 0 && this.height > 0) { + this.width += (this.clusterSize - 1) * this.clusterSizeWidthFactor; + this.height += (this.clusterSize - 1) * this.clusterSizeHeightFactor; + this.radius += (this.clusterSize - 1) * this.clusterSizeRadiusFactor; + } } + }; Node.prototype._drawImage = function (ctx) { @@ -9109,7 +9464,19 @@ Node.prototype._drawImage = function (ctx) { this.top = this.y - this.height / 2; var yLabel; - if (this.imageObj) { + if (this.imageObj.width != 0 ) { + // draw the shade + if (this.clusterSize > 1) { + var lineWidth = ((this.clusterSize > 1) ? 10 : 0.0); + lineWidth *= this.graphScaleInv; + lineWidth = Math.min(0.2 * this.width,lineWidth); + + ctx.globalAlpha = 0.5; + ctx.drawImage(this.imageObj, this.left - lineWidth, this.top - lineWidth, this.width + 2*lineWidth, this.height + 2*lineWidth); + } + + // draw the image + ctx.globalAlpha = 1.0; ctx.drawImage(this.imageObj, this.left, this.top, this.width, this.height); yLabel = this.y + this.height / 2; } @@ -9128,6 +9495,10 @@ Node.prototype._resizeBox = function (ctx) { var textSize = this.getTextSize(ctx); this.width = textSize.width + 2 * margin; this.height = textSize.height + 2 * margin; + + this.width += (this.clusterSize - 1) * 0.5 * this.clusterSizeWidthFactor; + this.height += (this.clusterSize - 1) * 0.5 * this.clusterSizeHeightFactor; +// this.radius += (this.clusterSize - 1) * 0.5 * this.clusterSizeRadiusFactor; } }; @@ -9137,9 +9508,26 @@ Node.prototype._drawBox = function (ctx) { this.left = this.x - this.width / 2; this.top = this.y - this.height / 2; + var clusterLineWidth = 2.5; + var selectionLineWidth = 2; + ctx.strokeStyle = this.selected ? this.color.highlight.border : this.color.border; + + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.graphScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + + ctx.roundRect(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth, this.radius); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.graphScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + ctx.fillStyle = this.selected ? this.color.highlight.background : this.color.background; - ctx.lineWidth = this.selected ? 2.0 : 1.0; + ctx.roundRect(this.left, this.top, this.width, this.height, this.radius); ctx.fill(); ctx.stroke(); @@ -9155,6 +9543,11 @@ Node.prototype._resizeDatabase = function (ctx) { var size = textSize.width + 2 * margin; this.width = size; this.height = size; + + // scaling used for clustering + this.width += (this.clusterSize - 1) * this.clusterSizeWidthFactor; + this.height += (this.clusterSize - 1) * this.clusterSizeHeightFactor; + this.radius += (this.clusterSize - 1) * this.clusterSizeRadiusFactor; } }; @@ -9163,9 +9556,25 @@ Node.prototype._drawDatabase = function (ctx) { this.left = this.x - this.width / 2; this.top = this.y - this.height / 2; + var clusterLineWidth = 2.5; + var selectionLineWidth = 2; + ctx.strokeStyle = this.selected ? this.color.highlight.border : this.color.border; + + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.graphScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + + ctx.database(this.x - this.width/2 - 2*ctx.lineWidth, this.y - this.height*0.5 - 2*ctx.lineWidth, this.width + 4*ctx.lineWidth, this.height + 4*ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.graphScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + ctx.fillStyle = this.selected ? this.color.highlight.background : this.color.background; - ctx.lineWidth = this.selected ? 2.0 : 1.0; ctx.database(this.x - this.width/2, this.y - this.height*0.5, this.width, this.height); ctx.fill(); ctx.stroke(); @@ -9183,6 +9592,11 @@ Node.prototype._resizeCircle = function (ctx) { this.width = diameter; this.height = diameter; + + // scaling used for clustering +// this.width += (this.clusterSize - 1) * 0.5 * this.clusterSizeWidthFactor; +// this.height += (this.clusterSize - 1) * 0.5 * this.clusterSizeHeightFactor; + this.radius += (this.clusterSize - 1) * 0.5 * this.clusterSizeRadiusFactor; } }; @@ -9191,9 +9605,25 @@ Node.prototype._drawCircle = function (ctx) { this.left = this.x - this.width / 2; this.top = this.y - this.height / 2; + var clusterLineWidth = 2.5; + var selectionLineWidth = 2; + ctx.strokeStyle = this.selected ? this.color.highlight.border : this.color.border; + + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.graphScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + + ctx.circle(this.x, this.y, this.radius+2*ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.graphScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + ctx.fillStyle = this.selected ? this.color.highlight.background : this.color.background; - ctx.lineWidth = this.selected ? 2.0 : 1.0; ctx.circle(this.x, this.y, this.radius); ctx.fill(); ctx.stroke(); @@ -9210,6 +9640,11 @@ Node.prototype._resizeEllipse = function (ctx) { if (this.width < this.height) { this.width = this.height; } + + // scaling used for clustering + this.width += (this.clusterSize - 1) * this.clusterSizeWidthFactor; + this.height += (this.clusterSize - 1) * this.clusterSizeHeightFactor; + this.radius += (this.clusterSize - 1) * this.clusterSizeRadiusFactor; } }; @@ -9218,13 +9653,29 @@ Node.prototype._drawEllipse = function (ctx) { this.left = this.x - this.width / 2; this.top = this.y - this.height / 2; + var clusterLineWidth = 2.5; + var selectionLineWidth = 2; + ctx.strokeStyle = this.selected ? this.color.highlight.border : this.color.border; + + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.graphScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + + ctx.ellipse(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.graphScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + ctx.fillStyle = this.selected ? this.color.highlight.background : this.color.background; - ctx.lineWidth = this.selected ? 2.0 : 1.0; + ctx.ellipse(this.left, this.top, this.width, this.height); ctx.fill(); ctx.stroke(); - this._label(ctx, this.label, this.x, this.y); }; @@ -9250,9 +9701,15 @@ Node.prototype._drawStar = function (ctx) { Node.prototype._resizeShape = function (ctx) { if (!this.width) { + this.radius = this.baseRadiusValue; var size = 2 * this.radius; this.width = size; this.height = size; + + // scaling used for clustering + this.width += (this.clusterSize - 1) * this.clusterSizeWidthFactor; + this.height += (this.clusterSize - 1) * this.clusterSizeHeightFactor; + this.radius += (this.clusterSize - 1) * 0.5 * this.clusterSizeRadiusFactor; } }; @@ -9262,9 +9719,35 @@ Node.prototype._drawShape = function (ctx, shape) { this.left = this.x - this.width / 2; this.top = this.y - this.height / 2; + var clusterLineWidth = 2.5; + var selectionLineWidth = 2; + var radiusMultiplier = 2; + + // choose draw method depending on the shape + switch (shape) { + case 'dot': radiusMultiplier = 2; break; + case 'square': radiusMultiplier = 2; break; + case 'triangle': radiusMultiplier = 3; break; + case 'triangleDown': radiusMultiplier = 3; break; + case 'star': radiusMultiplier = 4; break; + } + ctx.strokeStyle = this.selected ? this.color.highlight.border : this.color.border; + + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.graphScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + + ctx[shape](this.x, this.y, this.radius + radiusMultiplier * ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.graphScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + ctx.fillStyle = this.selected ? this.color.highlight.background : this.color.background; - ctx.lineWidth = this.selected ? 2.0 : 1.0; ctx[shape](this.x, this.y, this.radius); ctx.fill(); @@ -9281,6 +9764,11 @@ Node.prototype._resizeText = function (ctx) { var textSize = this.getTextSize(ctx); this.width = textSize.width + 2 * margin; this.height = textSize.height + 2 * margin; + + // scaling used for clustering + this.width += (this.clusterSize - 1) * this.clusterSizeWidthFactor; + this.height += (this.clusterSize - 1) * this.clusterSizeHeightFactor; + this.radius += (this.clusterSize - 1) * this.clusterSizeRadiusFactor; } }; @@ -9314,7 +9802,7 @@ Node.prototype._label = function (ctx, text, x, y, align, baseline) { Node.prototype.getTextSize = function(ctx) { - if (this.label != undefined) { + if (this.label !== undefined) { ctx.font = (this.selected ? "bold " : "") + this.fontSize + "px " + this.fontFace; var lines = this.label.split('\n'), @@ -9332,6 +9820,92 @@ Node.prototype.getTextSize = function(ctx) { } }; +/** + * this is used to determine if a node is visible at all. this is used to determine when it needs to be drawn. + * there is a safety margin of 0.3 * width; + * + * @returns {boolean} + */ +Node.prototype.inArea = function() { + if (this.width !== undefined) { + return (this.x + this.width*this.graphScaleInv >= this.canvasTopLeft.x && + this.x - this.width*this.graphScaleInv < this.canvasBottomRight.x && + this.y + this.height*this.graphScaleInv >= this.canvasTopLeft.y && + this.y - this.height*this.graphScaleInv < this.canvasBottomRight.y); + } + else { + return true; + } +} + +/** + * checks if the core of the node is in the display area, this is used for opening clusters around zoom + * @returns {boolean} + */ +Node.prototype.inView = function() { + return (this.x >= this.canvasTopLeft.x && + this.x < this.canvasBottomRight.x && + this.y >= this.canvasTopLeft.y && + this.y < this.canvasBottomRight.y); +} + +/** + * This allows the zoom level of the graph to influence the rendering + * We store the inverted scale and the coordinates of the top left, and bottom right points of the canvas + * + * @param scale + * @param canvasTopLeft + * @param canvasBottomRight + */ +Node.prototype.setScaleAndPos = function(scale,canvasTopLeft,canvasBottomRight) { + this.graphScaleInv = 1.0/scale; + this.canvasTopLeft = canvasTopLeft; + this.canvasBottomRight = canvasBottomRight; +}; + + +/** + * This allows the zoom level of the graph to influence the rendering + * + * @param scale + */ +Node.prototype.setScale = function(scale) { + this.graphScaleInv = 1.0/scale; +}; + +/** + * This function updates the damping parameter for clusters, based ont he + * + * @param {Number} numberOfNodes + */ +Node.prototype.updateDamping = function(numberOfNodes) { + this.damping = (0.8 + 0.1*this.clusterSize * (1 + Math.pow(numberOfNodes,-2))); + this.damping *= this.dampingFactor; +}; + + +/** + * set the velocity at 0. Is called when this node is contained in another during clustering + */ +Node.prototype.clearVelocity = function() { + this.vx = 0; + this.vy = 0; +}; + + +/** + * Basic preservation of (kinectic) energy + * + * @param massBeforeClustering + */ +Node.prototype.updateVelocity = function(massBeforeClustering) { + var energyBefore = this.vx * this.vx * massBeforeClustering; + this.vx = Math.sqrt(energyBefore/this.mass); + energyBefore = this.vy * this.vy * massBeforeClustering; + this.vy = Math.sqrt(energyBefore/this.mass); +}; + + /** * @class Edge * @@ -9360,7 +9934,7 @@ function Edge (properties, graph, constants) { // initialize variables this.id = undefined; this.fromId = undefined; - this.toId = undefined; + this.toId = undefined; this.style = constants.edges.style; this.title = undefined; this.width = constants.edges.width; @@ -9369,6 +9943,12 @@ function Edge (properties, graph, constants) { this.from = null; // a node this.to = null; // a node + + // we use this to be able to reconnect the edge to a cluster if its node is put into a cluster + // by storing the original information we can revert to the original connection when the cluser is opened. + this.originalFromId = []; + this.originalToId = []; + this.connected = false; // Added to support dashed lines @@ -9382,6 +9962,7 @@ function Edge (properties, graph, constants) { this.lengthFixed = false; this.setProperties(properties, constants); + } /** @@ -9394,41 +9975,41 @@ Edge.prototype.setProperties = function(properties, constants) { return; } - if (properties.from != undefined) {this.fromId = properties.from;} - if (properties.to != undefined) {this.toId = properties.to;} + if (properties.from !== undefined) {this.fromId = properties.from;} + if (properties.to !== undefined) {this.toId = properties.to;} - if (properties.id != undefined) {this.id = properties.id;} - if (properties.style != undefined) {this.style = properties.style;} - if (properties.label != undefined) {this.label = properties.label;} + if (properties.id !== undefined) {this.id = properties.id;} + if (properties.style !== undefined) {this.style = properties.style;} + if (properties.label !== undefined) {this.label = properties.label;} if (this.label) { this.fontSize = constants.edges.fontSize; this.fontFace = constants.edges.fontFace; this.fontColor = constants.edges.fontColor; - if (properties.fontColor != undefined) {this.fontColor = properties.fontColor;} - if (properties.fontSize != undefined) {this.fontSize = properties.fontSize;} - if (properties.fontFace != undefined) {this.fontFace = properties.fontFace;} + if (properties.fontColor !== undefined) {this.fontColor = properties.fontColor;} + if (properties.fontSize !== undefined) {this.fontSize = properties.fontSize;} + if (properties.fontFace !== undefined) {this.fontFace = properties.fontFace;} } - if (properties.title != undefined) {this.title = properties.title;} - if (properties.width != undefined) {this.width = properties.width;} - if (properties.value != undefined) {this.value = properties.value;} - if (properties.length != undefined) {this.length = properties.length;} + if (properties.title !== undefined) {this.title = properties.title;} + if (properties.width !== undefined) {this.width = properties.width;} + if (properties.value !== undefined) {this.value = properties.value;} + if (properties.length !== undefined) {this.length = properties.length;} // Added to support dashed lines // David Jordan // 2012-08-08 if (properties.dash) { - if (properties.dash.length != undefined) {this.dash.length = properties.dash.length;} - if (properties.dash.gap != undefined) {this.dash.gap = properties.dash.gap;} - if (properties.dash.altLength != undefined) {this.dash.altLength = properties.dash.altLength;} + if (properties.dash.length !== undefined) {this.dash.length = properties.dash.length;} + if (properties.dash.gap !== undefined) {this.dash.gap = properties.dash.gap;} + if (properties.dash.altLength !== undefined) {this.dash.altLength = properties.dash.altLength;} } - if (properties.color != undefined) {this.color = properties.color;} + if (properties.color !== undefined) {this.color = properties.color;} // A node is connected when it has a from and to node. this.connect(); - this.widthFixed = this.widthFixed || (properties.width != undefined); - this.lengthFixed = this.lengthFixed || (properties.length != undefined); + this.widthFixed = this.widthFixed || (properties.width !== undefined); + this.lengthFixed = this.lengthFixed || (properties.length !== undefined); this.stiffness = 1 / this.length; // set draw method based on style @@ -9596,10 +10177,10 @@ Edge.prototype._drawLine = function(ctx) { */ Edge.prototype._getLineWidth = function() { if (this.from.selected || this.to.selected) { - return Math.min(this.width * 2, this.widthMax); + return Math.min(this.width * 2, this.widthMax)*this.graphScaleInv; } else { - return this.width; + return this.width*this.graphScaleInv; } }; @@ -9677,12 +10258,12 @@ Edge.prototype._drawDashLine = function(ctx) { // draw dashed line ctx.beginPath(); ctx.lineCap = 'round'; - if (this.dash.altLength != undefined) //If an alt dash value has been set add to the array this value + if (this.dash.altLength !== undefined) //If an alt dash value has been set add to the array this value { ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, [this.dash.length,this.dash.gap,this.dash.altLength,this.dash.gap]); } - else if (this.dash.length != undefined && this.dash.gap != undefined) //If a dash and gap value has been set add to the array this value + else if (this.dash.length !== undefined && this.dash.gap !== undefined) //If a dash and gap value has been set add to the array this value { ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, [this.dash.length,this.dash.gap]); @@ -9935,6 +10516,16 @@ Edge._dist = function (x1,y1, x2,y2, x3,y3) { // x3,y3 is the point return Math.sqrt(dx*dx + dy*dy); }; + + +/** + * This allows the zoom level of the graph to influence the rendering + * + * @param scale + */ +Edge.prototype.setScale = function(scale) { + this.graphScaleInv = 1.0/scale; +}; /** * Popup is a class to create a popup window with some text * @param {Element} container The container object. @@ -9975,7 +10566,7 @@ function Popup(container, x, y, text) { style.boxShadow = "3px 3px 10px rgba(128, 128, 128, 0.5)"; style.whiteSpace = "nowrap"; this.container.appendChild(this.frame); -}; +} /** * @param {number} x Horizontal position of the popup window @@ -10165,2371 +10756,5073 @@ Images.prototype.load = function(url) { }; /** - * @constructor Graph - * Create a graph visualization, displaying nodes and edges. + * Creation of the SectorMixin var. * - * @param {Element} container The DOM element in which the Graph will - * be created. Normally a div element. - * @param {Object} data An object containing parameters - * {Array} nodes - * {Array} edges - * @param {Object} options Options + * This contains all the functions the Graph object can use to employ the sector system. + * The sector system is always used by Graph, though the benefits only apply to the use of clustering. + * If clustering is not used, there is no overhead except for a duplicate object with references to nodes and edges. + * + * Alex de Mulder + * 21-01-2013 */ -function Graph (container, data, options) { - // create variables and set default values - this.containerElement = container; - this.width = '100%'; - this.height = '100%'; - this.refreshRate = 50; // milliseconds - this.stabilize = true; // stabilize before displaying the graph - this.selectable = true; - - // set constant values - this.constants = { - nodes: { - radiusMin: 5, - radiusMax: 20, - radius: 5, - distance: 100, // px - shape: 'ellipse', - image: undefined, - widthMin: 16, // px - widthMax: 64, // px - fontColor: 'black', - fontSize: 14, // px - //fontFace: verdana, - fontFace: 'arial', - color: { - border: '#2B7CE9', - background: '#97C2FC', - highlight: { - border: '#2B7CE9', - background: '#D2E5FF' - } - }, - borderColor: '#2B7CE9', - backgroundColor: '#97C2FC', - highlightColor: '#D2E5FF', - group: undefined - }, - edges: { - widthMin: 1, - widthMax: 15, - width: 1, - style: 'line', - color: '#343434', - fontColor: '#343434', - fontSize: 14, // px - fontFace: 'arial', - //distance: 100, //px - length: 100, // px - dash: { - length: 10, - gap: 5, - altLength: undefined - } - }, - minForce: 0.05, - minVelocity: 0.02, // px/s - maxIterations: 1000 // maximum number of iteration to stabilize - }; +var SectorMixin = { - var graph = this; - this.nodes = {}; // object with Node objects - this.edges = {}; // object with Edge objects - // TODO: create a counter to keep track on the number of nodes having values - // TODO: create a counter to keep track on the number of nodes currently moving - // TODO: create a counter to keep track on the number of edges having values + /** + * This function is only called by the setData function of the Graph object. + * This loads the global references into the active sector. This initializes the sector. + * + * @private + */ + _putDataInSector : function() { + this.sectors["active"][this._sector()].nodes = this.nodes; + this.sectors["active"][this._sector()].edges = this.edges; + this.sectors["active"][this._sector()].nodeIndices = this.nodeIndices; + }, - this.nodesData = null; // A DataSet or DataView - this.edgesData = null; // A DataSet or DataView - // create event listeners used to subscribe on the DataSets of the nodes and edges - var me = this; - this.nodesListeners = { - 'add': function (event, params) { - me._addNodes(params.items); - me.start(); - }, - 'update': function (event, params) { - me._updateNodes(params.items); - me.start(); - }, - 'remove': function (event, params) { - me._removeNodes(params.items); - me.start(); + /** + * /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied (active) sector. If a type is defined, do the specific type + * + * @param {String} sectorId + * @param {String} [sectorType] | "active" or "frozen" + * @private + */ + _switchToSector : function(sectorId, sectorType) { + if (sectorType === undefined || sectorType == "active") { + this._switchToActiveSector(sectorId); } - }; - this.edgesListeners = { - 'add': function (event, params) { - me._addEdges(params.items); - me.start(); - }, - 'update': function (event, params) { - me._updateEdges(params.items); - me.start(); - }, - 'remove': function (event, params) { - me._removeEdges(params.items); - me.start(); + else { + this._switchToFrozenSector(sectorId); } - }; + }, - this.groups = new Groups(); // object with groups - this.images = new Images(); // object with images - this.images.setOnloadCallback(function () { - graph._redraw(); - }); - // properties of the data - this.moving = false; // True if any of the nodes have an undefined position + /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied active sector. + * + * @param sectorId + * @private + */ + _switchToActiveSector : function(sectorId) { + this.nodeIndices = this.sectors["active"][sectorId]["nodeIndices"]; + this.nodes = this.sectors["active"][sectorId]["nodes"]; + this.edges = this.sectors["active"][sectorId]["edges"]; + }, - this.selection = []; - this.timer = undefined; - // create a frame and canvas - this._create(); + /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied frozen sector. + * + * @param sectorId + * @private + */ + _switchToFrozenSector : function(sectorId) { + this.nodeIndices = this.sectors["frozen"][sectorId]["nodeIndices"]; + this.nodes = this.sectors["frozen"][sectorId]["nodes"]; + this.edges = this.sectors["frozen"][sectorId]["edges"]; + }, - // apply options - this.setOptions(options); - // draw data - this.setData(data); -} + /** + * This function sets the global references to nodes, edges and nodeIndices to + * those of the navigation controls sector. + * + * @private + */ + _switchToNavigationSector : function() { + this.nodeIndices = this.sectors["navigation"]["nodeIndices"]; + this.nodes = this.sectors["navigation"]["nodes"]; + this.edges = this.sectors["navigation"]["edges"]; + }, -/** - * Set nodes and edges, and optionally options as well. - * - * @param {Object} data Object containing parameters: - * {Array | DataSet | DataView} [nodes] Array with nodes - * {Array | DataSet | DataView} [edges] Array with edges - * {String} [dot] String containing data in DOT format - * {Options} [options] Object with options - */ -Graph.prototype.setData = function(data) { - if (data && data.dot && (data.nodes || data.edges)) { - throw new SyntaxError('Data must contain either parameter "dot" or ' + - ' parameter pair "nodes" and "edges", but not both.'); - } - // set options - this.setOptions(data && data.options); + /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the currently active sector. + * + * @private + */ + _loadLatestSector : function() { + this._switchToSector(this._sector()); + }, - // set all data - if (data && data.dot) { - // parse DOT file - if(data && data.dot) { - var dotData = vis.util.DOTToGraph(data.dot); - this.setData(dotData); - return; + + /** + * This function returns the currently active sector Id + * + * @returns {String} + * @private + */ + _sector : function() { + return this.activeSector[this.activeSector.length-1]; + }, + + + /** + * This function returns the previously active sector Id + * + * @returns {String} + * @private + */ + _previousSector : function() { + if (this.activeSector.length > 1) { + return this.activeSector[this.activeSector.length-2]; } - } - else { - this._setNodes(data && data.nodes); - this._setEdges(data && data.edges); - } + else { + throw new TypeError('there are not enough sectors in the this.activeSector array.'); + } + }, - // find a stable position or start animating to a stable position - if (this.stabilize) { - this._doStabilize(); - } - this.start(); -}; -/** - * Set options - * @param {Object} options - */ -Graph.prototype.setOptions = function (options) { - if (options) { - // retrieve parameter values - if (options.width != undefined) {this.width = options.width;} - if (options.height != undefined) {this.height = options.height;} - if (options.stabilize != undefined) {this.stabilize = options.stabilize;} - if (options.selectable != undefined) {this.selectable = options.selectable;} + /** + * We add the active sector at the end of the this.activeSector array + * This ensures it is the currently active sector returned by _sector() and it reaches the top + * of the activeSector stack. When we reverse our steps we move from the end to the beginning of this stack. + * + * @param newId + * @private + */ + _setActiveSector : function(newId) { + this.activeSector.push(newId); + }, - // TODO: work out these options and document them - if (options.edges) { - for (var prop in options.edges) { - if (options.edges.hasOwnProperty(prop)) { - this.constants.edges[prop] = options.edges[prop]; - } + + /** + * We remove the currently active sector id from the active sector stack. This happens when + * we reactivate the previously active sector + * + * @private + */ + _forgetLastSector : function() { + this.activeSector.pop(); + }, + + + /** + * This function creates a new active sector with the supplied newId. This newId + * is the expanding node id. + * + * @param {String} newId | Id of the new active sector + * @private + */ + _createNewSector : function(newId) { + // create the new sector + this.sectors["active"][newId] = {"nodes":{}, + "edges":{}, + "nodeIndices":[], + "formationScale": this.scale, + "drawingNode": undefined}; + + // create the new sector render node. This gives visual feedback that you are in a new sector. + this.sectors["active"][newId]['drawingNode'] = new Node( + {id:newId, + color: { + background: "#eaefef", + border: "495c5e" + } + },{},{},this.constants); + this.sectors["active"][newId]['drawingNode'].clusterSize = 2; + }, + + + /** + * This function removes the currently active sector. This is called when we create a new + * active sector. + * + * @param {String} sectorId | Id of the active sector that will be removed + * @private + */ + _deleteActiveSector : function(sectorId) { + delete this.sectors["active"][sectorId]; + }, + + + /** + * This function removes the currently active sector. This is called when we reactivate + * the previously active sector. + * + * @param {String} sectorId | Id of the active sector that will be removed + * @private + */ + _deleteFrozenSector : function(sectorId) { + delete this.sectors["frozen"][sectorId]; + }, + + + /** + * Freezing an active sector means moving it from the "active" object to the "frozen" object. + * We copy the references, then delete the active entree. + * + * @param sectorId + * @private + */ + _freezeSector : function(sectorId) { + // we move the set references from the active to the frozen stack. + this.sectors["frozen"][sectorId] = this.sectors["active"][sectorId]; + + // we have moved the sector data into the frozen set, we now remove it from the active set + this._deleteActiveSector(sectorId); + }, + + + /** + * This is the reverse operation of _freezeSector. Activating means moving the sector from the "frozen" + * object to the "active" object. + * + * @param sectorId + * @private + */ + _activateSector : function(sectorId) { + // we move the set references from the frozen to the active stack. + this.sectors["active"][sectorId] = this.sectors["frozen"][sectorId]; + + // we have moved the sector data into the active set, we now remove it from the frozen stack + this._deleteFrozenSector(sectorId); + }, + + + /** + * This function merges the data from the currently active sector with a frozen sector. This is used + * in the process of reverting back to the previously active sector. + * The data that is placed in the frozen (the previously active) sector is the node that has been removed from it + * upon the creation of a new active sector. + * + * @param sectorId + * @private + */ + _mergeThisWithFrozen : function(sectorId) { + // copy all nodes + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.sectors["frozen"][sectorId]["nodes"][nodeId] = this.nodes[nodeId]; } + } - if (options.edges.length != undefined && - options.nodes && options.nodes.distance == undefined) { - this.constants.edges.length = options.edges.length; - this.constants.nodes.distance = options.edges.length * 1.25; + // copy all edges (if not fully clustered, else there are no edges) + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + this.sectors["frozen"][sectorId]["edges"][edgeId] = this.edges[edgeId]; } + } - if (!options.edges.fontColor) { - this.constants.edges.fontColor = options.edges.color; + // merge the nodeIndices + for (var i = 0; i < this.nodeIndices.length; i++) { + this.sectors["frozen"][sectorId]["nodeIndices"].push(this.nodeIndices[i]); + } + }, + + + /** + * This clusters the sector to one cluster. It was a single cluster before this process started so + * we revert to that state. The clusterToFit function with a maximum size of 1 node does this. + * + * @private + */ + _collapseThisToSingleCluster : function() { + this.clusterToFit(1,false); + }, + + + /** + * We create a new active sector from the node that we want to open. + * + * @param node + * @private + */ + _addSector : function(node) { + // this is the currently active sector + var sector = this._sector(); + +// // this should allow me to select nodes from a frozen set. +// if (this.sectors['active'][sector]["nodes"].hasOwnProperty(node.id)) { +// console.log("the node is part of the active sector"); +// } +// else { +// console.log("I dont know what the fuck happened!!"); +// } + + // when we switch to a new sector, we remove the node that will be expanded from the current nodes list. + delete this.nodes[node.id]; + + var unqiueIdentifier = util.randomUUID(); + + // we fully freeze the currently active sector + this._freezeSector(sector); + + // we create a new active sector. This sector has the Id of the node to ensure uniqueness + this._createNewSector(unqiueIdentifier); + + // we add the active sector to the sectors array to be able to revert these steps later on + this._setActiveSector(unqiueIdentifier); + + // we redirect the global references to the new sector's references. this._sector() now returns unqiueIdentifier + this._switchToSector(this._sector()); + + // finally we add the node we removed from our previous active sector to the new active sector + this.nodes[node.id] = node; + }, + + + /** + * We close the sector that is currently open and revert back to the one before. + * If the active sector is the "default" sector, nothing happens. + * + * @private + */ + _collapseSector : function() { + // the currently active sector + var sector = this._sector(); + + // we cannot collapse the default sector + if (sector != "default") { + if ((this.nodeIndices.length == 1) || + (this.sectors["active"][sector]["drawingNode"].width*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || + (this.sectors["active"][sector]["drawingNode"].height*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { + var previousSector = this._previousSector(); + + // we collapse the sector back to a single cluster + this._collapseThisToSingleCluster(); + + // we move the remaining nodes, edges and nodeIndices to the previous sector. + // This previous sector is the one we will reactivate + this._mergeThisWithFrozen(previousSector); + + // the previously active (frozen) sector now has all the data from the currently active sector. + // we can now delete the active sector. + this._deleteActiveSector(sector); + + // we activate the previously active (and currently frozen) sector. + this._activateSector(previousSector); + + // we load the references from the newly active sector into the global references + this._switchToSector(previousSector); + + // we forget the previously active sector because we reverted to the one before + this._forgetLastSector(); + + // finally, we update the node index list. + this._updateNodeIndexList(); } + } + }, - // Added to support dashed lines - // David Jordan - // 2012-08-08 - if (options.edges.dash) { - if (options.edges.dash.length != undefined) { - this.constants.edges.dash.length = options.edges.dash.length; - } - if (options.edges.dash.gap != undefined) { - this.constants.edges.dash.gap = options.edges.dash.gap; + + /** + * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). + * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we dont pass the function itself because then the "this" is the window object + * | instead of the Graph object + * @param {*} [argument] | Optional: arguments to pass to the runFunction + * @private + */ + _doInAllActiveSectors : function(runFunction,argument) { + if (argument === undefined) { + for (var sector in this.sectors["active"]) { + if (this.sectors["active"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToActiveSector(sector); + this[runFunction](); } - if (options.edges.dash.altLength != undefined) { - this.constants.edges.dash.altLength = options.edges.dash.altLength; + } + } + else { + for (var sector in this.sectors["active"]) { + if (this.sectors["active"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToActiveSector(sector); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + this[runFunction](args[0],args[1]); + } + else { + this[runFunction](argument); + } } } } + // we revert the global references back to our active sector + this._loadLatestSector(); + }, - if (options.nodes) { - for (prop in options.nodes) { - if (options.nodes.hasOwnProperty(prop)) { - this.constants.nodes[prop] = options.nodes[prop]; + + /** + * This runs a function in all frozen sectors. This is used in the _redraw(). + * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we don't pass the function itself because then the "this" is the window object + * | instead of the Graph object + * @param {*} [argument] | Optional: arguments to pass to the runFunction + * @private + */ + _doInAllFrozenSectors : function(runFunction,argument) { + if (argument === undefined) { + for (var sector in this.sectors["frozen"]) { + if (this.sectors["frozen"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToFrozenSector(sector); + this[runFunction](); + } + } + } + else { + for (var sector in this.sectors["frozen"]) { + if (this.sectors["frozen"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToFrozenSector(sector); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + this[runFunction](args[0],args[1]); + } + else { + this[runFunction](argument); + } } } + } + this._loadLatestSector(); + }, - if (options.nodes.color) { - this.constants.nodes.color = Node.parseColor(options.nodes.color); + + /** + * This runs a function in the navigation controls sector. + * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we don't pass the function itself because then the "this" is the window object + * | instead of the Graph object + * @param {*} [argument] | Optional: arguments to pass to the runFunction + * @private + */ + _doInNavigationSector : function(runFunction,argument) { + this._switchToNavigationSector(); + if (argument === undefined) { + this[runFunction](); + } + else { + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + this[runFunction](args[0],args[1]); } + else { + this[runFunction](argument); + } + } + this._loadLatestSector(); + }, - /* - if (options.nodes.widthMin) this.constants.nodes.radiusMin = options.nodes.widthMin; - if (options.nodes.widthMax) this.constants.nodes.radiusMax = options.nodes.widthMax; - */ + + /** + * This runs a function in all sectors. This is used in the _redraw(). + * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we don't pass the function itself because then the "this" is the window object + * | instead of the Graph object + * @param {*} [argument] | Optional: arguments to pass to the runFunction + * @private + */ + _doInAllSectors : function(runFunction,argument) { + var args = Array.prototype.splice.call(arguments, 1); + if (argument === undefined) { + this._doInAllActiveSectors(runFunction); + this._doInAllFrozenSectors(runFunction); + } + else { + if (args.length > 1) { + this._doInAllActiveSectors(runFunction,args[0],args[1]); + this._doInAllFrozenSectors(runFunction,args[0],args[1]); + } + else { + this._doInAllActiveSectors(runFunction,argument); + this._doInAllFrozenSectors(runFunction,argument); + } } - if (options.groups) { - for (var groupname in options.groups) { - if (options.groups.hasOwnProperty(groupname)) { - var group = options.groups[groupname]; - this.groups.add(groupname, group); + }, + + + /** + * This clears the nodeIndices list. We cannot use this.nodeIndices = [] because we would break the link with the + * active sector. Thus we clear the nodeIndices in the active sector, then reconnect the this.nodeIndices to it. + * + * @private + */ + _clearNodeIndexList : function() { + var sector = this._sector(); + this.sectors["active"][sector]["nodeIndices"] = []; + this.nodeIndices = this.sectors["active"][sector]["nodeIndices"]; + }, + + + /** + * Draw the encompassing sector node + * + * @param ctx + * @param sectorType + * @private + */ + _drawSectorNodes : function(ctx,sectorType) { + var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; + for (var sector in this.sectors[sectorType]) { + if (this.sectors[sectorType].hasOwnProperty(sector)) { + if (this.sectors[sectorType][sector]["drawingNode"] !== undefined) { + + this._switchToSector(sector,sectorType); + + minY = 1e9; maxY = -1e9; minX = 1e9; maxX = -1e9; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + node.resize(ctx); + if (minX > node.x - 0.5 * node.width) {minX = node.x - 0.5 * node.width;} + if (maxX < node.x + 0.5 * node.width) {maxX = node.x + 0.5 * node.width;} + if (minY > node.y - 0.5 * node.height) {minY = node.y - 0.5 * node.height;} + if (maxY < node.y + 0.5 * node.height) {maxY = node.y + 0.5 * node.height;} + } + } + node = this.sectors[sectorType][sector]["drawingNode"]; + node.x = 0.5 * (maxX + minX); + node.y = 0.5 * (maxY + minY); + node.width = 2 * (node.x - minX); + node.height = 2 * (node.y - minY); + node.radius = Math.sqrt(Math.pow(0.5*node.width,2) + Math.pow(0.5*node.height,2)); + node.setScale(this.scale); + node._drawCircle(ctx); } } } - } + }, - this.setSize(this.width, this.height); - this._setTranslation(this.frame.clientWidth / 2, this.frame.clientHeight / 2); - this._setScale(1); + _drawAllSectorNodes : function(ctx) { + this._drawSectorNodes(ctx,"frozen"); + this._drawSectorNodes(ctx,"active"); + this._loadLatestSector(); + } }; - /** - * fire an event - * @param {String} event The name of an event, for example 'select' - * @param {Object} params Optional object with event parameters - * @private + * Creation of the ClusterMixin var. + * + * This contains all the functions the Graph object can use to employ clustering + * + * Alex de Mulder + * 21-01-2013 */ -Graph.prototype._trigger = function (event, params) { - events.trigger(this, event, params); -}; - +var ClusterMixin = { /** - * Create the main frame for the Graph. - * This function is executed once when a Graph object is created. The frame - * contains a canvas, and this canvas contains all objects like the axis and - * nodes. - * @private - */ -Graph.prototype._create = function () { - // remove all elements from the container element. - while (this.containerElement.hasChildNodes()) { - this.containerElement.removeChild(this.containerElement.firstChild); - } + * This is only called in the constructor of the graph object + * */ + startWithClustering : function() { + // cluster if the data set is big + this.clusterToFit(this.constants.clustering.initialMaxNodes, true); - this.frame = document.createElement('div'); - this.frame.className = 'graph-frame'; - this.frame.style.position = 'relative'; - this.frame.style.overflow = 'hidden'; + // updates the lables after clustering + this.updateLabels(); - // create the graph canvas (HTML canvas element) - this.frame.canvas = document.createElement( 'canvas' ); - this.frame.canvas.style.position = 'relative'; - this.frame.appendChild(this.frame.canvas); - if (!this.frame.canvas.getContext) { - var noCanvas = document.createElement( 'DIV' ); - noCanvas.style.color = 'red'; - noCanvas.style.fontWeight = 'bold' ; - noCanvas.style.padding = '10px'; - noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; - this.frame.canvas.appendChild(noCanvas); - } + // this is called here because if clusterin is disabled, the start and stabilize are called in + // the setData function. + if (this.stabilize) { + this._doStabilize(); + } + this.start(); + }, - var me = this; - this.drag = {}; - this.pinch = {}; - this.hammer = Hammer(this.frame.canvas, { - prevent_default: true - }); - this.hammer.on('tap', me._onTap.bind(me) ); - this.hammer.on('hold', me._onHold.bind(me) ); - this.hammer.on('pinch', me._onPinch.bind(me) ); - this.hammer.on('touch', me._onTouch.bind(me) ); - this.hammer.on('dragstart', me._onDragStart.bind(me) ); - this.hammer.on('drag', me._onDrag.bind(me) ); - this.hammer.on('dragend', me._onDragEnd.bind(me) ); - this.hammer.on('mousewheel',me._onMouseWheel.bind(me) ); - this.hammer.on('DOMMouseScroll',me._onMouseWheel.bind(me) ); // for FF - this.hammer.on('mousemove', me._onMouseMoveTitle.bind(me) ); + /** + * This function clusters until the initialMaxNodes has been reached + * + * @param {Number} maxNumberOfNodes + * @param {Boolean} reposition + */ + clusterToFit : function(maxNumberOfNodes, reposition) { + var numberOfNodes = this.nodeIndices.length; - // add the frame to the container element - this.containerElement.appendChild(this.frame); -}; + var maxLevels = 50; + var level = 0; -/** - * - * @param {{x: Number, y: Number}} pointer - * @return {Number | null} node - * @private - */ -Graph.prototype._getNodeAt = function (pointer) { - var x = this._canvasToX(pointer.x); - var y = this._canvasToY(pointer.y); + // we first cluster the hubs, then we pull in the outliers, repeat + while (numberOfNodes > maxNumberOfNodes && level < maxLevels) { + if (level % 3 == 0) { + this.forceAggregateHubs(); + } + else { + this.increaseClusterLevel(); + } + numberOfNodes = this.nodeIndices.length; + level += 1; + } - var obj = { - left: x, - top: y, - right: x, - bottom: y - }; + // after the clustering we reposition the nodes to reduce the initial chaos + if (level > 1 && reposition == true) { + this.repositionNodes(); + } + }, - // if there are overlapping nodes, select the last one, this is the - // one which is drawn on top of the others - var overlappingNodes = this._getNodesOverlappingWith(obj); - return (overlappingNodes.length > 0) ? - overlappingNodes[overlappingNodes.length - 1] : null; -}; + /** + * This function can be called to open up a specific cluster. It is only called by + * It will unpack the cluster back one level. + * + * @param node | Node object: cluster to open. + */ + openCluster : function(node) { + var isMovingBeforeClustering = this.moving; + if (node.clusterSize > this.constants.clustering.sectorThreshold && this._nodeInActiveArea(node) && + !(this._sector() == "default" && this.nodeIndices.length == 1)) { + this._addSector(node); + var level = 0; + while ((this.nodeIndices.length < this.constants.clustering.initialMaxNodes) && (level < 10)) { + this.decreaseClusterLevel(); + level += 1; + } + } + else { + this._expandClusterNode(node,false,true); -/** - * Get the pointer location from a touch location - * @param {{pageX: Number, pageY: Number}} touch - * @return {{x: Number, y: Number}} pointer - * @private - */ -Graph.prototype._getPointer = function (touch) { - return { - x: touch.pageX - vis.util.getAbsoluteLeft(this.frame.canvas), - y: touch.pageY - vis.util.getAbsoluteTop(this.frame.canvas) - }; -}; + // update the index list, dynamic edges and labels + this._updateNodeIndexList(); + this._updateDynamicEdges(); + this.updateLabels(); + } -/** - * On start of a touch gesture, store the pointer - * @param event - * @private - */ -Graph.prototype._onTouch = function (event) { - this.drag.pointer = this._getPointer(event.gesture.touches[0]); - this.drag.pinched = false; - this.pinch.scale = this._getScale(); -}; + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); + } + }, -/** - * handle drag start event - * @private - */ -Graph.prototype._onDragStart = function () { - var drag = this.drag; + /** + * This calls the updateClustes with default arguments + */ + updateClustersDefault : function() { + if (this.constants.clustering.enabled == true) { + this.updateClusters(0,false,false); + } + }, - drag.selection = []; - drag.translation = this._getTranslation(); - drag.nodeId = this._getNodeAt(drag.pointer); - // note: drag.pointer is set in _onTouch to get the initial touch location + /** + * This function can be called to increase the cluster level. This means that the nodes with only one edge connection will + * be clustered with their connected node. This can be repeated as many times as needed. + * This can be called externally (by a keybind for instance) to reduce the complexity of big datasets. + */ + increaseClusterLevel : function() { + this.updateClusters(-1,false,true); + }, - var node = this.nodes[drag.nodeId]; - if (node) { - // select the clicked node if not yet selected - if (!node.isSelected()) { - this._selectNodes([drag.nodeId]); - } - // create an array with the selected nodes and their original location and status - var me = this; - this.selection.forEach(function (id) { - var node = me.nodes[id]; - if (node) { - var s = { - id: id, - node: node, - // store original x, y, xFixed and yFixed, make the node temporarily Fixed - x: node.x, - y: node.y, - xFixed: node.xFixed, - yFixed: node.yFixed - }; + /** + * This function can be called to decrease the cluster level. This means that the nodes with only one edge connection will + * be unpacked if they are a cluster. This can be repeated as many times as needed. + * This can be called externally (by a key-bind for instance) to look into clusters without zooming. + */ + decreaseClusterLevel : function() { + this.updateClusters(1,false,true); + }, - node.xFixed = true; - node.yFixed = true; - drag.selection.push(s); + /** + * This is the main clustering function. It clusters and declusters on zoom or forced + * This function clusters on zoom, it can be called with a predefined zoom direction + * If out, check if we can form clusters, if in, check if we can open clusters. + * This function is only called from _zoom() + * + * @param {Number} zoomDirection | -1 / 0 / +1 for zoomOut / determineByZoom / zoomIn + * @param {Boolean} recursive | enabled or disable recursive calling of the opening of clusters + * @param {Boolean} force | enabled or disable forcing + * + */ + updateClusters : function(zoomDirection,recursive,force) { + var isMovingBeforeClustering = this.moving; + var amountOfNodes = this.nodeIndices.length; + + // on zoom out collapse the sector if the scale is at the level the sector was made + if (this.previousScale > this.scale && zoomDirection == 0) { + this._collapseSector(); + } + + // check if we zoom in or out + if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out + // forming clusters when forced pulls outliers in. When not forced, the edge length of the + // outer nodes determines if it is being clustered + this._formClusters(force); + } + else if (this.previousScale < this.scale || zoomDirection == 1) { // zoom in + if (force == true) { + // _openClusters checks for each node if the formationScale of the cluster is smaller than + // the current scale and if so, declusters. When forced, all clusters are reduced by one step + this._openClusters(recursive,force); } - }); + else { + // if a cluster takes up a set percentage of the active window + this._openClustersBySize(); + } + } + this._updateNodeIndexList(); - } -}; + // if a cluster was NOT formed and the user zoomed out, we try clustering by hubs + if (this.nodeIndices.length == amountOfNodes && (this.previousScale > this.scale || zoomDirection == -1)) { + this._aggregateHubs(force); + this._updateNodeIndexList(); + } -/** - * handle drag event - * @private - */ -Graph.prototype._onDrag = function (event) { - if (this.drag.pinched) { - return; - } + // we now reduce chains. + if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out + this.handleChains(); + this._updateNodeIndexList(); + } - var pointer = this._getPointer(event.gesture.touches[0]); + this.previousScale = this.scale; - var me = this, - drag = this.drag, - selection = drag.selection; - if (selection && selection.length) { - // calculate delta's and new location - var deltaX = pointer.x - drag.pointer.x, - deltaY = pointer.y - drag.pointer.y; + // rest of the update the index list, dynamic edges and labels + this._updateDynamicEdges(); + this.updateLabels(); - // update position of all selected nodes - selection.forEach(function (s) { - var node = s.node; + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length < amountOfNodes) { // this means a clustering operation has taken place + this.clusterSession += 1; + } - if (!s.xFixed) { - node.x = me._canvasToX(me._xToCanvas(s.x) + deltaX); - } + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); + } + }, - if (!s.yFixed) { - node.y = me._canvasToY(me._yToCanvas(s.y) + deltaY); - } - }); + /** + * This function handles the chains. It is called on every updateClusters(). + */ + handleChains : function() { + // after clustering we check how many chains there are + var chainPercentage = this._getChainFraction(); + if (chainPercentage > this.constants.clustering.chainThreshold) { + this._reduceAmountOfChains(1 - this.constants.clustering.chainThreshold / chainPercentage) - // start animation if not yet running - if (!this.moving) { - this.moving = true; - this.start(); } - } - else { - // move the graph - var diffX = pointer.x - this.drag.pointer.x; - var diffY = pointer.y - this.drag.pointer.y; + }, - this._setTranslation( - this.drag.translation.x + diffX, - this.drag.translation.y + diffY); - this._redraw(); + /** + * this functions starts clustering by hubs + * The minimum hub threshold is set globally + * + * @private + */ + _aggregateHubs : function(force) { + this._getHubSize(); + this._formClustersByHub(force,false); + }, - this.moved = true; - } -}; -/** - * handle drag start event - * @private - */ -Graph.prototype._onDragEnd = function () { - var selection = this.drag.selection; - if (selection) { - selection.forEach(function (s) { - // restore original xFixed and yFixed - s.node.xFixed = s.xFixed; - s.node.yFixed = s.yFixed; - }); - } -}; + /** + * This function is fired by keypress. It forces hubs to form. + * + */ + forceAggregateHubs : function() { + var isMovingBeforeClustering = this.moving; + var amountOfNodes = this.nodeIndices.length; -/** - * handle tap/click event: select/unselect a node - * @private - */ -Graph.prototype._onTap = function (event) { - var pointer = this._getPointer(event.gesture.touches[0]); + this._aggregateHubs(true); - var nodeId = this._getNodeAt(pointer); - var node = this.nodes[nodeId]; - if (node) { - // select this node - this._selectNodes([nodeId]); + // update the index list, dynamic edges and labels + this._updateNodeIndexList(); + this._updateDynamicEdges(); + this.updateLabels(); - if (!this.moving) { - this._redraw(); + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length != amountOfNodes) { + this.clusterSession += 1; } - } - else { - // remove selection - this._unselectNodes(); - this._redraw(); - } -}; -/** - * handle long tap event: multi select nodes - * @private - */ -Graph.prototype._onHold = function (event) { - var pointer = this._getPointer(event.gesture.touches[0]); - var nodeId = this._getNodeAt(pointer); - var node = this.nodes[nodeId]; - if (node) { - if (!node.isSelected()) { - // select this node, keep previous selection - var append = true; - this._selectNodes([nodeId], append); - } - else { - this._unselectNodes([nodeId]); + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); } + }, - if (!this.moving) { - this._redraw(); + /** + * If a cluster takes up more than a set percentage of the screen, open the cluster + * + * @private + */ + _openClustersBySize : function() { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.inView() == true) { + if ((node.width*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || + (node.height*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { + this.openCluster(node); + } + } + } } - } - else { - // Do nothing - } -}; - -/** - * Handle pinch event - * @param event - * @private - */ -Graph.prototype._onPinch = function (event) { - var pointer = this._getPointer(event.gesture.center); + }, - this.drag.pinched = true; - if (!('scale' in this.pinch)) { - this.pinch.scale = 1; - } - // TODO: enable moving while pinching? - var scale = this.pinch.scale * event.gesture.scale; - this._zoom(scale, pointer) -}; + /** + * This function loops over all nodes in the nodeIndices list. For each node it checks if it is a cluster and if it + * has to be opened based on the current zoom level. + * + * @private + */ + _openClusters : function(recursive,force) { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + this._expandClusterNode(node,recursive,force); + } + }, -/** - * Zoom the graph in or out - * @param {Number} scale a number around 1, and between 0.01 and 10 - * @param {{x: Number, y: Number}} pointer - * @return {Number} appliedScale scale is limited within the boundaries - * @private - */ -Graph.prototype._zoom = function(scale, pointer) { - var scaleOld = this._getScale(); - if (scale < 0.01) { - scale = 0.01; - } - if (scale > 10) { - scale = 10; - } - - var translation = this._getTranslation(); - var scaleFrac = scale / scaleOld; - var tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac; - var ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac; + /** + * This function checks if a node has to be opened. This is done by checking the zoom level. + * If the node contains child nodes, this function is recursively called on the child nodes as well. + * This recursive behaviour is optional and can be set by the recursive argument. + * + * @param {Node} parentNode | to check for cluster and expand + * @param {Boolean} recursive | enabled or disable recursive calling + * @param {Boolean} force | enabled or disable forcing + * @param {Boolean} [openAll] | This will recursively force all nodes in the parent to be released + * @private + */ + _expandClusterNode : function(parentNode, recursive, force, openAll) { + // first check if node is a cluster + if (parentNode.clusterSize > 1) { + // this means that on a double tap event or a zoom event, the cluster fully unpacks if it is smaller than 20 + if (parentNode.clusterSize < this.constants.clustering.sectorThreshold) { + openAll = true; + } + recursive = openAll ? true : recursive; + + // if the last child has been added on a smaller scale than current scale decluster + if (parentNode.formationScale < this.scale || force == true) { + // we will check if any of the contained child nodes should be removed from the cluster + for (var containedNodeId in parentNode.containedNodes) { + if (parentNode.containedNodes.hasOwnProperty(containedNodeId)) { + var childNode = parentNode.containedNodes[containedNodeId]; + + // force expand will expand the largest cluster size clusters. Since we cluster from outside in, we assume that + // the largest cluster is the one that comes from outside + if (force == true) { + if (childNode.clusterSession == parentNode.clusterSessions[parentNode.clusterSessions.length-1] + || openAll) { + this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); + } + } + else { + if (this._nodeInActiveArea(parentNode)) { + this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); + } + } + } + } + } + } + }, - this._setScale(scale); - this._setTranslation(tx, ty); - this._redraw(); + /** + * ONLY CALLED FROM _expandClusterNode + * + * This function will expel a child_node from a parent_node. This is to de-cluster the node. This function will remove + * the child node from the parent contained_node object and put it back into the global nodes object. + * The same holds for the edge that was connected to the child node. It is moved back into the global edges object. + * + * @param {Node} parentNode | the parent node + * @param {String} containedNodeId | child_node id as it is contained in the containedNodes object of the parent node + * @param {Boolean} recursive | This will also check if the child needs to be expanded. + * With force and recursive both true, the entire cluster is unpacked + * @param {Boolean} force | This will disregard the zoom level and will expel this child from the parent + * @param {Boolean} openAll | This will recursively force all nodes in the parent to be released + * @private + */ + _expelChildFromParent : function(parentNode, containedNodeId, recursive, force, openAll) { + var childNode = parentNode.containedNodes[containedNodeId]; + + // if child node has been added on smaller scale than current, kick out + if (childNode.formationScale < this.scale || force == true) { + // put the child node back in the global nodes object + this.nodes[containedNodeId] = childNode; + + // release the contained edges from this childNode back into the global edges + this._releaseContainedEdges(parentNode,childNode); + + // reconnect rerouted edges to the childNode + this._connectEdgeBackToChild(parentNode,childNode); + + // validate all edges in dynamicEdges + this._validateEdges(parentNode); + + // undo the changes from the clustering operation on the parent node + parentNode.mass -= this.constants.clustering.massTransferCoefficient * childNode.mass; + parentNode.fontSize -= this.constants.clustering.fontSizeMultiplier * childNode.clusterSize; + parentNode.clusterSize -= childNode.clusterSize; + parentNode.dynamicEdgesLength = parentNode.dynamicEdges.length; + + // place the child node near the parent, not at the exact same location to avoid chaos in the system + childNode.x = parentNode.x + this.constants.edges.length * 0.3 * (0.5 - Math.random()) * parentNode.clusterSize; + childNode.y = parentNode.y + this.constants.edges.length * 0.3 * (0.5 - Math.random()) * parentNode.clusterSize; + + // remove node from the list + delete parentNode.containedNodes[containedNodeId]; + + // check if there are other childs with this clusterSession in the parent. + var othersPresent = false; + for (var childNodeId in parentNode.containedNodes) { + if (parentNode.containedNodes.hasOwnProperty(childNodeId)) { + if (parentNode.containedNodes[childNodeId].clusterSession == childNode.clusterSession) { + othersPresent = true; + break; + } + } + } + // if there are no others, remove the cluster session from the list + if (othersPresent == false) { + parentNode.clusterSessions.pop(); + } - return scale; -}; + // remove the clusterSession from the child node + childNode.clusterSession = 0; -/** - * Event handler for mouse wheel event, used to zoom the timeline - * See http://adomas.org/javascript-mouse-wheel/ - * https://github.com/EightMedia/hammer.js/issues/256 - * @param {MouseEvent} event - * @private - */ -Graph.prototype._onMouseWheel = function(event) { - // retrieve delta - var delta = 0; - if (event.wheelDelta) { /* IE/Opera. */ - delta = event.wheelDelta/120; - } else if (event.detail) { /* Mozilla case. */ - // In Mozilla, sign of delta is different than in IE. - // Also, delta is multiple of 3. - delta = -event.detail/3; - } + // restart the simulation to reorganise all nodes + this.moving = true; - // If delta is nonzero, handle it. - // Basically, delta is now positive if wheel was scrolled up, - // and negative, if wheel was scrolled down. - if (delta) { - if (!('mouswheelScale' in this.pinch)) { - this.pinch.mouswheelScale = 1; + // recalculate the size of the node on the next time the node is rendered + parentNode.clearSizeCache(); } - // calculate the new scale - var scale = this.pinch.mouswheelScale; - var zoom = delta / 10; - if (delta < 0) { - zoom = zoom / (1 - zoom); + // check if a further expansion step is possible if recursivity is enabled + if (recursive == true) { + this._expandClusterNode(childNode,recursive,force,openAll); } - scale *= (1 + zoom); + }, - // calculate the pointer location - var gesture = util.fakeGesture(this, event); - var pointer = this._getPointer(gesture.center); - - // apply the new scale - scale = this._zoom(scale, pointer); - - // store the new, applied scale - this.pinch.mouswheelScale = scale; - } - // Prevent default actions caused by mouse wheel. - event.preventDefault(); -}; + /** + * This function checks if any nodes at the end of their trees have edges below a threshold length + * This function is called only from updateClusters() + * forceLevelCollapse ignores the length of the edge and collapses one level + * This means that a node with only one edge will be clustered with its connected node + * + * @private + * @param {Boolean} force + */ + _formClusters : function(force) { + if (force == false) { + this._formClustersByZoom(); + } + else { + this._forceClustersByZoom(); + } + }, + /** + * This function handles the clustering by zooming out, this is based on a minimum edge distance + * + * @private + */ + _formClustersByZoom : function() { + var dx,dy,length, + minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; + + // check if any edges are shorter than minLength and start the clustering + // the clustering favours the node with the larger mass + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + var edge = this.edges[edgeId]; + if (edge.connected) { + if (edge.toId != edge.fromId) { + dx = (edge.to.x - edge.from.x); + dy = (edge.to.y - edge.from.y); + length = Math.sqrt(dx * dx + dy * dy); + + + if (length < minLength) { + // first check which node is larger + var parentNode = edge.from; + var childNode = edge.to; + if (edge.to.mass > edge.from.mass) { + parentNode = edge.to; + childNode = edge.from; + } + + if (childNode.dynamicEdgesLength == 1) { + this._addToCluster(parentNode,childNode,false); + } + else if (parentNode.dynamicEdgesLength == 1) { + this._addToCluster(childNode,parentNode,false); + } + } + } + } + } + } + }, -/** - * Mouse move handler for checking whether the title moves over a node with a title. - * @param {Event} event - * @private - */ -Graph.prototype._onMouseMoveTitle = function (event) { - var gesture = util.fakeGesture(this, event); - var pointer = this._getPointer(gesture.center); + /** + * This function forces the graph to cluster all nodes with only one connecting edge to their + * connected node. + * + * @private + */ + _forceClustersByZoom : function() { + for (var nodeId in this.nodes) { + // another node could have absorbed this child. + if (this.nodes.hasOwnProperty(nodeId)) { + var childNode = this.nodes[nodeId]; + + // the edges can be swallowed by another decrease + if (childNode.dynamicEdgesLength == 1 && childNode.dynamicEdges.length != 0) { + var edge = childNode.dynamicEdges[0]; + var parentNode = (edge.toId == childNode.id) ? this.nodes[edge.fromId] : this.nodes[edge.toId]; + + // group to the largest node + if (childNode.id != parentNode.id) { + if (parentNode.mass > childNode.mass) { + this._addToCluster(parentNode,childNode,true); + } + else { + this._addToCluster(childNode,parentNode,true); + } + } + } + } + } + }, - // check if the previously selected node is still selected - if (this.popupNode) { - this._checkHidePopup(pointer); - } - // start a timeout that will check if the mouse is positioned above - // an element - var me = this; - var checkShow = function() { - me._checkShowPopup(pointer); - }; - if (this.popupTimer) { - clearInterval(this.popupTimer); // stop any running timer - } - if (!this.leftButtonDown) { - this.popupTimer = setTimeout(checkShow, 300); - } -}; -/** - * Check if there is an element on the given position in the graph - * (a node or edge). If so, and if this element has a title, - * show a popup window with its title. - * - * @param {{x:Number, y:Number}} pointer - * @private - */ -Graph.prototype._checkShowPopup = function (pointer) { - var obj = { - left: this._canvasToX(pointer.x), - top: this._canvasToY(pointer.y), - right: this._canvasToX(pointer.x), - bottom: this._canvasToY(pointer.y) - }; + /** + * This function forms clusters from hubs, it loops over all nodes + * + * @param {Boolean} force | Disregard zoom level + * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges + * @private + */ + _formClustersByHub : function(force, onlyEqual) { + // we loop over all nodes in the list + for (var nodeId in this.nodes) { + // we check if it is still available since it can be used by the clustering in this loop + if (this.nodes.hasOwnProperty(nodeId)) { + this._formClusterFromHub(this.nodes[nodeId],force,onlyEqual); + } + } + }, - var id; - var lastPopupNode = this.popupNode; + /** + * This function forms a cluster from a specific preselected hub node + * + * @param {Node} hubNode | the node we will cluster as a hub + * @param {Boolean} force | Disregard zoom level + * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges + * @param {Number} [absorptionSizeOffset] | + * @private + */ + _formClusterFromHub : function(hubNode, force, onlyEqual, absorptionSizeOffset) { + if (absorptionSizeOffset === undefined) { + absorptionSizeOffset = 0; + } + // we decide if the node is a hub + if ((hubNode.dynamicEdgesLength >= this.hubThreshold && onlyEqual == false) || + (hubNode.dynamicEdgesLength == this.hubThreshold && onlyEqual == true)) { + // initialize variables + var dx,dy,length; + var minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; + var allowCluster = false; + + // we create a list of edges because the dynamicEdges change over the course of this loop + var edgesIdarray = []; + var amountOfInitialEdges = hubNode.dynamicEdges.length; + for (var j = 0; j < amountOfInitialEdges; j++) { + edgesIdarray.push(hubNode.dynamicEdges[j].id); + } - if (this.popupNode == undefined) { - // search the nodes for overlap, select the top one in case of multiple nodes - var nodes = this.nodes; - for (id in nodes) { - if (nodes.hasOwnProperty(id)) { - var node = nodes[id]; - if (node.getTitle() != undefined && node.isOverlappingWith(obj)) { - this.popupNode = node; - break; + // if the hub clustering is not forces, we check if one of the edges connected + // to a cluster is small enough based on the constants.clustering.clusterEdgeThreshold + if (force == false) { + allowCluster = false; + for (j = 0; j < amountOfInitialEdges; j++) { + var edge = this.edges[edgesIdarray[j]]; + if (edge !== undefined) { + if (edge.connected) { + if (edge.toId != edge.fromId) { + dx = (edge.to.x - edge.from.x); + dy = (edge.to.y - edge.from.y); + length = Math.sqrt(dx * dx + dy * dy); + + if (length < minLength) { + allowCluster = true; + break; + } + } + } + } } } - } - } - if (this.popupNode == undefined) { - // search the edges for overlap - var edges = this.edges; - for (id in edges) { - if (edges.hasOwnProperty(id)) { - var edge = edges[id]; - if (edge.connected && (edge.getTitle() != undefined) && - edge.isOverlappingWith(obj)) { - this.popupNode = edge; - break; + // start the clustering if allowed + if ((!force && allowCluster) || force) { + // we loop over all edges INITIALLY connected to this hub + for (j = 0; j < amountOfInitialEdges; j++) { + edge = this.edges[edgesIdarray[j]]; + // the edge can be clustered by this function in a previous loop + if (edge !== undefined) { + var childNode = this.nodes[(edge.fromId == hubNode.id) ? edge.toId : edge.fromId]; + // we do not want hubs to merge with other hubs nor do we want to cluster itself. + if ((childNode.dynamicEdges.length <= (this.hubThreshold + absorptionSizeOffset)) && + (childNode.id != hubNode.id)) { + this._addToCluster(hubNode,childNode,force); + } + } } } } - } + }, - if (this.popupNode) { - // show popup message window - if (this.popupNode != lastPopupNode) { - var me = this; - if (!me.popup) { - me.popup = new Popup(me.frame); - } - // adjust a small offset such that the mouse cursor is located in the - // bottom left location of the popup, and you can easily move over the - // popup area - me.popup.setPosition(pointer.x - 3, pointer.y - 3); - me.popup.setText(me.popupNode.getTitle()); - me.popup.show(); - } - } - else { - if (this.popup) { - this.popup.hide(); - } - } -}; -/** - * Check if the popup must be hided, which is the case when the mouse is no - * longer hovering on the object - * @param {{x:Number, y:Number}} pointer - * @private - */ -Graph.prototype._checkHidePopup = function (pointer) { - if (!this.popupNode || !this._getNodeAt(pointer) ) { - this.popupNode = undefined; - if (this.popup) { - this.popup.hide(); + /** + * This function adds the child node to the parent node, creating a cluster if it is not already. + * + * @param {Node} parentNode | this is the node that will house the child node + * @param {Node} childNode | this node will be deleted from the global this.nodes and stored in the parent node + * @param {Boolean} force | true will only update the remainingEdges at the very end of the clustering, ensuring single level collapse + * @private + */ + _addToCluster : function(parentNode, childNode, force) { + // join child node in the parent node + parentNode.containedNodes[childNode.id] = childNode; + + // manage all the edges connected to the child and parent nodes + for (var i = 0; i < childNode.dynamicEdges.length; i++) { + var edge = childNode.dynamicEdges[i]; + if (edge.toId == parentNode.id || edge.fromId == parentNode.id) { // edge connected to parentNode + this._addToContainedEdges(parentNode,childNode,edge); + } + else { + this._connectEdgeToCluster(parentNode,childNode,edge); + } } - } -}; + // a contained node has no dynamic edges. + childNode.dynamicEdges = []; -/** - * Unselect selected nodes. If no selection array is provided, all nodes - * are unselected - * @param {Object[]} selection Array with selection objects, each selection - * object has a parameter row. Optional - * @param {Boolean} triggerSelect If true (default), the select event - * is triggered when nodes are unselected - * @return {Boolean} changed True if the selection is changed - * @private - */ -Graph.prototype._unselectNodes = function(selection, triggerSelect) { - var changed = false; - var i, iMax, id; + // remove circular edges from clusters + this._containCircularEdgesFromNode(parentNode,childNode); - if (selection) { - // remove provided selections - for (i = 0, iMax = selection.length; i < iMax; i++) { - id = selection[i]; - this.nodes[id].unselect(); - var j = 0; - while (j < this.selection.length) { - if (this.selection[j] == id) { - this.selection.splice(j, 1); - changed = true; - } - else { - j++; - } - } + // remove the childNode from the global nodes object + delete this.nodes[childNode.id]; + + // update the properties of the child and parent + var massBefore = parentNode.mass; + childNode.clusterSession = this.clusterSession; + parentNode.mass += this.constants.clustering.massTransferCoefficient * childNode.mass; + parentNode.clusterSize += childNode.clusterSize; + parentNode.fontSize += this.constants.clustering.fontSizeMultiplier * childNode.clusterSize; + + // keep track of the clustersessions so we can open the cluster up as it has been formed. + if (parentNode.clusterSessions[parentNode.clusterSessions.length - 1] != this.clusterSession) { + parentNode.clusterSessions.push(this.clusterSession); } - } - else if (this.selection && this.selection.length) { - // remove all selections - for (i = 0, iMax = this.selection.length; i < iMax; i++) { - id = this.selection[i]; - this.nodes[id].unselect(); - changed = true; + + // forced clusters only open from screen size and double tap + if (force == true) { + // parentNode.formationScale = Math.pow(1 - (1.0/11.0),this.clusterSession+3); + parentNode.formationScale = 0; + } + else { + parentNode.formationScale = this.scale; // The latest child has been added on this scale } - this.selection = []; - } - if (changed && (triggerSelect == true || triggerSelect == undefined)) { - // fire the select event - this._trigger('select'); - } + // recalculate the size of the node on the next time the node is rendered + parentNode.clearSizeCache(); - return changed; -}; + // set the pop-out scale for the childnode + parentNode.containedNodes[childNode.id].formationScale = parentNode.formationScale; -/** - * select all nodes on given location x, y - * @param {Array} selection an array with node ids - * @param {boolean} append If true, the new selection will be appended to the - * current selection (except for duplicate entries) - * @return {Boolean} changed True if the selection is changed - * @private - */ -Graph.prototype._selectNodes = function(selection, append) { - var changed = false; - var i, iMax; + // nullify the movement velocity of the child, this is to avoid hectic behaviour + childNode.clearVelocity(); - // TODO: the selectNodes method is a little messy, rework this + // the mass has altered, preservation of energy dictates the velocity to be updated + parentNode.updateVelocity(massBefore); - // check if the current selection equals the desired selection - var selectionAlreadyThere = true; - if (selection.length != this.selection.length) { - selectionAlreadyThere = false; - } - else { - for (i = 0, iMax = Math.min(selection.length, this.selection.length); i < iMax; i++) { - if (selection[i] != this.selection[i]) { - selectionAlreadyThere = false; - break; - } - } - } - if (selectionAlreadyThere) { - return changed; - } + // restart the simulation to reorganise all nodes + this.moving = true; + }, - if (append == undefined || append == false) { - // first deselect any selected node - var triggerSelect = false; - changed = this._unselectNodes(undefined, triggerSelect); - } - for (i = 0, iMax = selection.length; i < iMax; i++) { - // add each of the new selections, but only when they are not duplicate - var id = selection[i]; - var isDuplicate = (this.selection.indexOf(id) != -1); - if (!isDuplicate) { - this.nodes[id].select(); - this.selection.push(id); - changed = true; + /** + * This function will apply the changes made to the remainingEdges during the formation of the clusters. + * This is a seperate function to allow for level-wise collapsing of the node tree. + * It has to be called if a level is collapsed. It is called by _formClusters(). + * @private + */ + _updateDynamicEdges : function() { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + node.dynamicEdgesLength = node.dynamicEdges.length; + + // this corrects for multiple edges pointing at the same other node + var correction = 0; + if (node.dynamicEdgesLength > 1) { + for (var j = 0; j < node.dynamicEdgesLength - 1; j++) { + var edgeToId = node.dynamicEdges[j].toId; + var edgeFromId = node.dynamicEdges[j].fromId; + for (var k = j+1; k < node.dynamicEdgesLength; k++) { + if ((node.dynamicEdges[k].toId == edgeToId && node.dynamicEdges[k].fromId == edgeFromId) || + (node.dynamicEdges[k].fromId == edgeToId && node.dynamicEdges[k].toId == edgeFromId)) { + correction += 1; + } + } + } + } + node.dynamicEdgesLength -= correction; } - } + }, - if (changed) { - // fire the select event - this._trigger('select'); - } - return changed; -}; + /** + * This adds an edge from the childNode to the contained edges of the parent node + * + * @param parentNode | Node object + * @param childNode | Node object + * @param edge | Edge object + * @private + */ + _addToContainedEdges : function(parentNode, childNode, edge) { + // create an array object if it does not yet exist for this childNode + if (!(parentNode.containedEdges.hasOwnProperty(childNode.id))) { + parentNode.containedEdges[childNode.id] = [] + } + // add this edge to the list + parentNode.containedEdges[childNode.id].push(edge); -/** - * retrieve all nodes overlapping with given object - * @param {Object} obj An object with parameters left, top, right, bottom - * @return {Number[]} An array with id's of the overlapping nodes - * @private - */ -Graph.prototype._getNodesOverlappingWith = function (obj) { - var nodes = this.nodes, - overlappingNodes = []; + // remove the edge from the global edges object + delete this.edges[edge.id]; - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - if (nodes[id].isOverlappingWith(obj)) { - overlappingNodes.push(id); + // remove the edge from the parent object + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + if (parentNode.dynamicEdges[i].id == edge.id) { + parentNode.dynamicEdges.splice(i,1); + break; } } - } + }, - return overlappingNodes; -}; + /** + * This function connects an edge that was connected to a child node to the parent node. + * It keeps track of which nodes it has been connected to with the originalId array. + * + * @param {Node} parentNode | Node object + * @param {Node} childNode | Node object + * @param {Edge} edge | Edge object + * @private + */ + _connectEdgeToCluster : function(parentNode, childNode, edge) { + // handle circular edges + if (edge.toId == edge.fromId) { + this._addToContainedEdges(parentNode, childNode, edge); + } + else { + if (edge.toId == childNode.id) { // edge connected to other node on the "to" side + edge.originalToId.push(childNode.id); + edge.to = parentNode; + edge.toId = parentNode.id; + } + else { // edge connected to other node with the "from" side -/** - * retrieve the currently selected nodes - * @return {Number[] | String[]} selection An array with the ids of the - * selected nodes. - */ -Graph.prototype.getSelection = function() { - return this.selection.concat([]); -}; + edge.originalFromId.push(childNode.id); + edge.from = parentNode; + edge.fromId = parentNode.id; + } -/** - * select zero or more nodes - * @param {Number[] | String[]} selection An array with the ids of the - * selected nodes. - */ -Graph.prototype.setSelection = function(selection) { - var i, iMax, id; + this._addToReroutedEdges(parentNode,childNode,edge); + } + }, - if (!selection || (selection.length == undefined)) - throw 'Selection must be an array with ids'; - // first unselect any selected node - for (i = 0, iMax = this.selection.length; i < iMax; i++) { - id = this.selection[i]; - this.nodes[id].unselect(); - } + _containCircularEdgesFromNode : function(parentNode, childNode) { + // manage all the edges connected to the child and parent nodes + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + var edge = parentNode.dynamicEdges[i]; + // handle circular edges + if (edge.toId == edge.fromId) { + this._addToContainedEdges(parentNode, childNode, edge); + } + } + }, - this.selection = []; - for (i = 0, iMax = selection.length; i < iMax; i++) { - id = selection[i]; + /** + * This adds an edge from the childNode to the rerouted edges of the parent node + * + * @param parentNode | Node object + * @param childNode | Node object + * @param edge | Edge object + * @private + */ + _addToReroutedEdges : function(parentNode, childNode, edge) { + // create an array object if it does not yet exist for this childNode + // we store the edge in the rerouted edges so we can restore it when the cluster pops open + if (!(parentNode.reroutedEdges.hasOwnProperty(childNode.id))) { + parentNode.reroutedEdges[childNode.id] = []; + } + parentNode.reroutedEdges[childNode.id].push(edge); + + // this edge becomes part of the dynamicEdges of the cluster node + parentNode.dynamicEdges.push(edge); + }, - var node = this.nodes[id]; - if (!node) { - throw new RangeError('Node with id "' + id + '" not found'); + + + /** + * This function connects an edge that was connected to a cluster node back to the child node. + * + * @param parentNode | Node object + * @param childNode | Node object + * @private + */ + _connectEdgeBackToChild : function(parentNode, childNode) { + if (parentNode.reroutedEdges.hasOwnProperty(childNode.id)) { + for (var i = 0; i < parentNode.reroutedEdges[childNode.id].length; i++) { + var edge = parentNode.reroutedEdges[childNode.id][i]; + if (edge.originalFromId[edge.originalFromId.length-1] == childNode.id) { + edge.originalFromId.pop(); + edge.fromId = childNode.id; + edge.from = childNode; + } + else { + edge.originalToId.pop(); + edge.toId = childNode.id; + edge.to = childNode; + } + + // append this edge to the list of edges connecting to the childnode + childNode.dynamicEdges.push(edge); + + // remove the edge from the parent object + for (var j = 0; j < parentNode.dynamicEdges.length; j++) { + if (parentNode.dynamicEdges[j].id == edge.id) { + parentNode.dynamicEdges.splice(j,1); + break; + } + } + } + // remove the entry from the rerouted edges + delete parentNode.reroutedEdges[childNode.id]; } - node.select(); - this.selection.push(id); - } + }, - this.redraw(); -}; -/** - * Validate the selection: remove ids of nodes which no longer exist - * @private - */ -Graph.prototype._updateSelection = function () { - var i = 0; - while (i < this.selection.length) { - var id = this.selection[i]; - if (!this.nodes[id]) { - this.selection.splice(i, 1); + /** + * When loops are clustered, an edge can be both in the rerouted array and the contained array. + * This function is called last to verify that all edges in dynamicEdges are in fact connected to the + * parentNode + * + * @param parentNode | Node object + * @private + */ + _validateEdges : function(parentNode) { + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + var edge = parentNode.dynamicEdges[i]; + if (parentNode.id != edge.toId && parentNode.id != edge.fromId) { + parentNode.dynamicEdges.splice(i,1); + } } - else { - i++; + }, + + + /** + * This function released the contained edges back into the global domain and puts them back into the + * dynamic edges of both parent and child. + * + * @param {Node} parentNode | + * @param {Node} childNode | + * @private + */ + _releaseContainedEdges : function(parentNode, childNode) { + for (var i = 0; i < parentNode.containedEdges[childNode.id].length; i++) { + var edge = parentNode.containedEdges[childNode.id][i]; + + // put the edge back in the global edges object + this.edges[edge.id] = edge; + + // put the edge back in the dynamic edges of the child and parent + childNode.dynamicEdges.push(edge); + parentNode.dynamicEdges.push(edge); } - } -}; + // remove the entry from the contained edges + delete parentNode.containedEdges[childNode.id]; -/** - * Temporary method to test calculating a hub value for the nodes - * @param {number} level Maximum number edges between two nodes in order - * to call them connected. Optional, 1 by default - * @return {Number[]} connectioncount array with the connection count - * for each node - * @private - */ -Graph.prototype._getConnectionCount = function(level) { - if (level == undefined) { - level = 1; - } + }, - // get the nodes connected to given nodes - function getConnectedNodes(nodes) { - var connectedNodes = []; - for (var j = 0, jMax = nodes.length; j < jMax; j++) { - var node = nodes[j]; - // find all nodes connected to this node - var edges = node.edges; - for (var i = 0, iMax = edges.length; i < iMax; i++) { - var edge = edges[i]; - var other = null; - // check if connected - if (edge.from == node) - other = edge.to; - else if (edge.to == node) - other = edge.from; + // ------------------- UTILITY FUNCTIONS ---------------------------- // - // check if the other node is not already in the list with nodes - var k, kMax; - if (other) { - for (k = 0, kMax = nodes.length; k < kMax; k++) { - if (nodes[k] == other) { - other = null; - break; - } - } + + /** + * This updates the node labels for all nodes (for debugging purposes) + */ + updateLabels : function() { + var nodeId; + // update node labels + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.clusterSize > 1) { + node.label = "[".concat(String(node.clusterSize),"]"); } - if (other) { - for (k = 0, kMax = connectedNodes.length; k < kMax; k++) { - if (connectedNodes[k] == other) { - other = null; - break; - } + } + } + + // update node labels + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.clusterSize == 1) { + if (node.originalLabel !== undefined) { + node.label = node.originalLabel; + } + else { + node.label = String(node.id); } } - - if (other) - connectedNodes.push(other); } } - return connectedNodes; - } + /* Debug Override */ + // for (nodeId in this.nodes) { + // if (this.nodes.hasOwnProperty(nodeId)) { + // node = this.nodes[nodeId]; + // node.label = String(Math.round(node.width)).concat(":",Math.round(node.width*this.scale)); + // } + // } - var connections = []; - var nodes = this.nodes; - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - var c = [nodes[id]]; - for (var l = 0; l < level; l++) { - c = c.concat(getConnectedNodes(c)); - } - connections.push(c); - } - } + }, - var hubs = []; - for (var i = 0, len = connections.length; i < len; i++) { - hubs.push(connections[i].length); - } - return hubs; -}; + /** + * This function determines if the cluster we want to decluster is in the active area + * this means around the zoom center + * + * @param {Node} node + * @returns {boolean} + * @private + */ + _nodeInActiveArea : function(node) { + return ( + Math.abs(node.x - this.areaCenter.x) <= this.constants.clustering.activeAreaBoxSize/this.scale + && + Math.abs(node.y - this.areaCenter.y) <= this.constants.clustering.activeAreaBoxSize/this.scale + ) + }, -/** - * Set a new size for the graph - * @param {string} width Width in pixels or percentage (for example '800px' - * or '50%') - * @param {string} height Height in pixels or percentage (for example '400px' - * or '30%') - */ -Graph.prototype.setSize = function(width, height) { - this.frame.style.width = width; - this.frame.style.height = height; + /** + * This is an adaptation of the original repositioning function. This is called if the system is clustered initially + * It puts large clusters away from the center and randomizes the order. + * + */ + repositionNodes : function() { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + if (!node.isFixed()) { + var radius = this.constants.edges.length * (1 + 0.6*node.clusterSize); + var angle = 2 * Math.PI * Math.random(); + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + } + }, - this.frame.canvas.style.width = '100%'; - this.frame.canvas.style.height = '100%'; - this.frame.canvas.width = this.frame.canvas.clientWidth; - this.frame.canvas.height = this.frame.canvas.clientHeight; -}; -/** - * Set a data set with nodes for the graph - * @param {Array | DataSet | DataView} nodes The data containing the nodes. - * @private - */ -Graph.prototype._setNodes = function(nodes) { - var oldNodesData = this.nodesData; - if (nodes instanceof DataSet || nodes instanceof DataView) { - this.nodesData = nodes; - } - else if (nodes instanceof Array) { - this.nodesData = new DataSet(); - this.nodesData.add(nodes); - } - else if (!nodes) { - this.nodesData = new DataSet(); - } - else { - throw new TypeError('Array or DataSet expected'); - } - if (oldNodesData) { - // unsubscribe from old dataset - util.forEach(this.nodesListeners, function (callback, event) { - oldNodesData.unsubscribe(event, callback); - }); - } + /** + * We determine how many connections denote an important hub. + * We take the mean + 2*std as the important hub size. (Assuming a normal distribution of data, ~2.2%) + * + * @private + */ + _getHubSize : function() { + var average = 0; + var averageSquared = 0; + var hubCounter = 0; + var largestHub = 0; + + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + if (node.dynamicEdgesLength > largestHub) { + largestHub = node.dynamicEdgesLength; + } + average += node.dynamicEdgesLength; + averageSquared += Math.pow(node.dynamicEdgesLength,2); + hubCounter += 1; + } + average = average / hubCounter; + averageSquared = averageSquared / hubCounter; - // remove drawn nodes - this.nodes = {}; + var variance = averageSquared - Math.pow(average,2); - if (this.nodesData) { - // subscribe to new dataset - var me = this; - util.forEach(this.nodesListeners, function (callback, event) { - me.nodesData.subscribe(event, callback); - }); + var standardDeviation = Math.sqrt(variance); - // draw all new nodes - var ids = this.nodesData.getIds(); - this._addNodes(ids); - } + this.hubThreshold = Math.floor(average + 2*standardDeviation); - this._updateSelection(); -}; + // always have at least one to cluster + if (this.hubThreshold > largestHub) { + this.hubThreshold = largestHub; + } -/** - * Add nodes - * @param {Number[] | String[]} ids - * @private - */ -Graph.prototype._addNodes = function(ids) { - var id; - for (var i = 0, len = ids.length; i < len; i++) { - id = ids[i]; - var data = this.nodesData.get(id); - var node = new Node(data, this.images, this.groups, this.constants); - this.nodes[id] = node; // note: this may replace an existing node + // console.log("average",average,"averageSQ",averageSquared,"var",variance,"std",standardDeviation); + // console.log("hubThreshold:",this.hubThreshold); + }, - if (!node.isFixed()) { - // TODO: position new nodes in a smarter way! - var radius = this.constants.edges.length * 2; - var count = ids.length; - var angle = 2 * Math.PI * (i / count); - node.x = radius * Math.cos(angle); - node.y = radius * Math.sin(angle); - // note: no not use node.isMoving() here, as that gives the current - // velocity of the node, which is zero after creation of the node. - this.moving = true; + /** + * We reduce the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods + * with this amount we can cluster specifically on these chains. + * + * @param {Number} fraction | between 0 and 1, the percentage of chains to reduce + * @private + */ + _reduceAmountOfChains : function(fraction) { + this.hubThreshold = 2; + var reduceAmount = Math.floor(this.nodeIndices.length * fraction); + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { + if (reduceAmount > 0) { + this._formClusterFromHub(this.nodes[nodeId],true,true,1); + reduceAmount -= 1; + } + } + } } - } + }, - this._reconnectEdges(); - this._updateValueRange(this.nodes); -}; - -/** - * Update existing nodes, or create them when not yet existing - * @param {Number[] | String[]} ids - * @private - */ -Graph.prototype._updateNodes = function(ids) { - var nodes = this.nodes, - nodesData = this.nodesData; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; - var node = nodes[id]; - var data = nodesData.get(id); - if (node) { - // update node - node.setProperties(data, this.constants); - } - else { - // create node - node = new Node(properties, this.images, this.groups, this.constants); - nodes[id] = node; - - if (!node.isFixed()) { - this.moving = true; + /** + * We get the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods + * with this amount we can cluster specifically on these chains. + * + * @private + */ + _getChainFraction : function() { + var chains = 0; + var total = 0; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { + chains += 1; + } + total += 1; } } - } - - this._reconnectEdges(); - this._updateValueRange(nodes); + return chains/total; + } }; -/** - * Remove existing nodes. If nodes do not exist, the method will just ignore it. - * @param {Number[] | String[]} ids - * @private - */ -Graph.prototype._removeNodes = function(ids) { - var nodes = this.nodes; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; - delete nodes[id]; - } - - this._reconnectEdges(); - this._updateSelection(); - this._updateValueRange(nodes); -}; -/** - * Load edges by reading the data table - * @param {Array | DataSet | DataView} edges The data containing the edges. - * @private - * @private - */ -Graph.prototype._setEdges = function(edges) { - var oldEdgesData = this.edgesData; +var SelectionMixin = { - if (edges instanceof DataSet || edges instanceof DataView) { - this.edgesData = edges; - } - else if (edges instanceof Array) { - this.edgesData = new DataSet(); - this.edgesData.add(edges); - } - else if (!edges) { - this.edgesData = new DataSet(); - } - else { - throw new TypeError('Array or DataSet expected'); - } + /** + * This function can be called from the _doInAllSectors function + * + * @param object + * @param overlappingNodes + * @private + */ + _getNodesOverlappingWith : function(object, overlappingNodes) { + var nodes = this.nodes; + for (var nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + if (nodes[nodeId].isOverlappingWith(object)) { + overlappingNodes.push(nodeId); + } + } + } + }, - if (oldEdgesData) { - // unsubscribe from old dataset - util.forEach(this.edgesListeners, function (callback, event) { - oldEdgesData.unsubscribe(event, callback); - }); - } + /** + * retrieve all nodes overlapping with given object + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes + * @private + */ + _getAllNodesOverlappingWith : function (object) { + var overlappingNodes = []; + this._doInAllActiveSectors("_getNodesOverlappingWith",object,overlappingNodes); + return overlappingNodes; + }, - // remove drawn edges - this.edges = {}; - if (this.edgesData) { - // subscribe to new dataset - var me = this; - util.forEach(this.edgesListeners, function (callback, event) { - me.edgesData.subscribe(event, callback); - }); + /** + * retrieve all nodes in the navigation controls overlapping with given object + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes + * @private + */ + _getAllNavigationNodesOverlappingWith : function (object) { + var overlappingNodes = []; + this._doInNavigationSector("_getNodesOverlappingWith",object,overlappingNodes); + return overlappingNodes; + }, - // draw all new nodes - var ids = this.edgesData.getIds(); - this._addEdges(ids); - } + /** + * Return a position object in canvasspace from a single point in screenspace + * + * @param pointer + * @returns {{left: number, top: number, right: number, bottom: number}} + * @private + */ + _pointerToPositionObject : function(pointer) { + var x = this._canvasToX(pointer.x); + var y = this._canvasToY(pointer.y); + + return {left: x, + top: y, + right: x, + bottom: y}; + }, - this._reconnectEdges(); -}; + /** + * Return a position object in canvasspace from a single point in screenspace + * + * @param pointer + * @returns {{left: number, top: number, right: number, bottom: number}} + * @private + */ + _pointerToScreenPositionObject : function(pointer) { + var x = pointer.x; + var y = pointer.y; + + return {left: x, + top: y, + right: x, + bottom: y}; + }, -/** - * Add edges - * @param {Number[] | String[]} ids - * @private - */ -Graph.prototype._addEdges = function (ids) { - var edges = this.edges, - edgesData = this.edgesData; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; - var oldEdge = edges[id]; - if (oldEdge) { - oldEdge.disconnect(); + /** + * Get the top navigation controls node at the a specific point (like a click) + * + * @param {{x: Number, y: Number}} pointer + * @return {Node | null} node + * @private + */ + _getNavigationNodeAt : function (pointer) { + var screenPositionObject = this._pointerToScreenPositionObject(pointer); + var overlappingNodes = this._getAllNavigationNodesOverlappingWith(screenPositionObject); + if (overlappingNodes.length > 0) { + return this.sectors["navigation"]["nodes"][overlappingNodes[overlappingNodes.length - 1]]; } + else { + return null; + } + }, - var data = edgesData.get(id); - edges[id] = new Edge(data, this, this.constants); - } - - this.moving = true; - this._updateValueRange(edges); -}; -/** - * Update existing edges, or create them when not yet existing - * @param {Number[] | String[]} ids - * @private - */ -Graph.prototype._updateEdges = function (ids) { - var edges = this.edges, - edgesData = this.edgesData; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; + /** + * Get the top node at the a specific point (like a click) + * + * @param {{x: Number, y: Number}} pointer + * @return {Node | null} node + * @private + */ + _getNodeAt : function (pointer) { + // we first check if this is an navigation controls element + var positionObject = this._pointerToPositionObject(pointer); + overlappingNodes = this._getAllNodesOverlappingWith(positionObject); - var data = edgesData.get(id); - var edge = edges[id]; - if (edge) { - // update edge - edge.disconnect(); - edge.setProperties(data, this.constants); - edge.connect(); + // if there are overlapping nodes, select the last one, this is the + // one which is drawn on top of the others + if (overlappingNodes.length > 0) { + return this.nodes[overlappingNodes[overlappingNodes.length - 1]]; } else { - // create edge - edge = new Edge(data, this, this.constants); - this.edges[id] = edge; + return null; } - } + }, - this.moving = true; - this._updateValueRange(edges); -}; -/** - * Remove existing edges. Non existing ids will be ignored - * @param {Number[] | String[]} ids - * @private - */ -Graph.prototype._removeEdges = function (ids) { - var edges = this.edges; - for (var i = 0, len = ids.length; i < len; i++) { - var id = ids[i]; - var edge = edges[id]; - if (edge) { - edge.disconnect(); - delete edges[id]; - } - } + /** + * Place holder. To implement change the _getNodeAt to a _getObjectAt. Have the _getObjectAt call + * _getNodeAt and _getEdgesAt, then priortize the selection to user preferences. + * + * @param pointer + * @returns {null} + * @private + */ + _getEdgeAt : function(pointer) { + return null; + }, - this.moving = true; - this._updateValueRange(edges); -}; -/** - * Reconnect all edges - * @private - */ -Graph.prototype._reconnectEdges = function() { - var id, - nodes = this.nodes, - edges = this.edges; - for (id in nodes) { - if (nodes.hasOwnProperty(id)) { - nodes[id].edges = []; - } - } + /** + * Add object to the selection array. The this.selection id array may not be needed. + * + * @param obj + * @private + */ + _addToSelection : function(obj) { + this.selection.push(obj.id); + this.selectionObj[obj.id] = obj; + }, - for (id in edges) { - if (edges.hasOwnProperty(id)) { - var edge = edges[id]; - edge.from = null; - edge.to = null; - edge.connect(); + + /** + * Remove a single option from selection. + * + * @param obj + * @private + */ + _removeFromSelection : function(obj) { + for (var i = 0; i < this.selection.length; i++) { + if (obj.id == this.selection[i]) { + this.selection.splice(i,1); + break; + } } - } -}; + delete this.selectionObj[obj.id]; + }, -/** - * Update the values of all object in the given array according to the current - * value range of the objects in the array. - * @param {Object} obj An object containing a set of Edges or Nodes - * The objects must have a method getValue() and - * setValueRange(min, max). - * @private - */ -Graph.prototype._updateValueRange = function(obj) { - var id; - // determine the range of the objects - var valueMin = undefined; - var valueMax = undefined; - for (id in obj) { - if (obj.hasOwnProperty(id)) { - var value = obj[id].getValue(); - if (value !== undefined) { - valueMin = (valueMin === undefined) ? value : Math.min(value, valueMin); - valueMax = (valueMax === undefined) ? value : Math.max(value, valueMax); - } + /** + * Unselect all. The selectionObj is useful for this. + * + * @param {Boolean} [doNotTrigger] | ignore trigger + * @private + */ + _unselectAll : function(doNotTrigger) { + if (doNotTrigger === undefined) { + doNotTrigger = false; } - } - // adjust the range of all objects - if (valueMin !== undefined && valueMax !== undefined) { - for (id in obj) { - if (obj.hasOwnProperty(id)) { - obj[id].setValueRange(valueMin, valueMax); + this.selection = []; + for (var objId in this.selectionObj) { + if (this.selectionObj.hasOwnProperty(objId)) { + this.selectionObj[objId].unselect(); } } - } -}; + this.selectionObj = {}; -/** - * Redraw the graph with the current data - * chart will be resized too. - */ -Graph.prototype.redraw = function() { - this.setSize(this.width, this.height); - - this._redraw(); -}; - -/** - * Redraw the graph with the current data - * @private - */ -Graph.prototype._redraw = function() { - var ctx = this.frame.canvas.getContext('2d'); + if (doNotTrigger == false) { + this._trigger('select', { + nodes: this.getSelection() + }); + } + }, - // clear the canvas - var w = this.frame.canvas.width; - var h = this.frame.canvas.height; - ctx.clearRect(0, 0, w, h); - // set scaling and translation - ctx.save(); - ctx.translate(this.translation.x, this.translation.y); - ctx.scale(this.scale, this.scale); + /** + * Check if anything is selected + * + * @returns {boolean} + * @private + */ + _selectionIsEmpty : function() { + if (this.selection.length == 0) { + return true; + } + else { + return false; + } + }, - this._drawEdges(ctx); - this._drawNodes(ctx); - // restore original scaling and translation - ctx.restore(); -}; + /** + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection + * + * @param {Node} node + * @param {Boolean} append + * @param {Boolean} [doNotTrigger] | ignore trigger + * @private + */ + _selectNode : function(node, append, doNotTrigger) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } -/** - * Set the translation of the graph - * @param {Number} offsetX Horizontal offset - * @param {Number} offsetY Vertical offset - * @private - */ -Graph.prototype._setTranslation = function(offsetX, offsetY) { - if (this.translation === undefined) { - this.translation = { - x: 0, - y: 0 - }; - } + if (this._selectionIsEmpty() == false && append == false) { + this._unselectAll(true); + } - if (offsetX !== undefined) { - this.translation.x = offsetX; - } - if (offsetY !== undefined) { - this.translation.y = offsetY; - } -}; -/** - * Get the translation of the graph - * @return {Object} translation An object with parameters x and y, both a number - * @private - */ -Graph.prototype._getTranslation = function() { - return { - x: this.translation.x, - y: this.translation.y - }; -}; + if (node.selected == false) { + node.select(); + this._addToSelection(node); + } + else { + node.unselect(); + this._removeFromSelection(node); + } + if (doNotTrigger == false) { + this._trigger('select', { + nodes: this.getSelection() + }); + } + }, -/** - * Scale the graph - * @param {Number} scale Scaling factor 1.0 is unscaled - * @private - */ -Graph.prototype._setScale = function(scale) { - this.scale = scale; -}; -/** - * Get the current scale of the graph - * @return {Number} scale Scaling factor 1.0 is unscaled - * @private - */ -Graph.prototype._getScale = function() { - return this.scale; -}; -/** - * Convert a horizontal point on the HTML canvas to the x-value of the model - * @param {number} x - * @returns {number} - * @private - */ -Graph.prototype._canvasToX = function(x) { - return (x - this.translation.x) / this.scale; -}; + /** + * handles the selection part of the touch, only for navigation controls elements; + * Touch is triggered before tap, also before hold. Hold triggers after a while. + * This is the most responsive solution + * + * @param {Object} pointer + * @private + */ + _handleTouch : function(pointer) { + if (this.constants.navigation.enabled == true) { + var node = this._getNavigationNodeAt(pointer); + if (node != null) { + if (this[node.triggerFunction] !== undefined) { + this[node.triggerFunction](); + } + } + } + }, -/** - * Convert an x-value in the model to a horizontal point on the HTML canvas - * @param {number} x - * @returns {number} - * @private - */ -Graph.prototype._xToCanvas = function(x) { - return x * this.scale + this.translation.x; -}; -/** - * Convert a vertical point on the HTML canvas to the y-value of the model - * @param {number} y - * @returns {number} - * @private - */ -Graph.prototype._canvasToY = function(y) { - return (y - this.translation.y) / this.scale; -}; + /** + * handles the selection part of the tap; + * + * @param {Object} pointer + * @private + */ + _handleTap : function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null) { + this._selectNode(node,false); + } + else { + this._unselectAll(); + } + this._redraw(); + }, -/** - * Convert an y-value in the model to a vertical point on the HTML canvas - * @param {number} y - * @returns {number} - * @private - */ -Graph.prototype._yToCanvas = function(y) { - return y * this.scale + this.translation.y ; -}; -/** - * Redraw all nodes - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @private - */ -Graph.prototype._drawNodes = function(ctx) { - // first draw the unselected nodes - var nodes = this.nodes; - var selected = []; - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - if (nodes[id].isSelected()) { - selected.push(id); - } - else { - nodes[id].draw(ctx); - } + /** + * handles the selection part of the double tap and opens a cluster if needed + * + * @param {Object} pointer + * @private + */ + _handleDoubleTap : function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null && node !== undefined) { + // we reset the areaCenter here so the opening of the node will occur + this.areaCenter = {"x" : this._canvasToX(pointer.x), + "y" : this._canvasToY(pointer.y)}; + this.openCluster(node); } - } + }, - // draw the selected nodes on top - for (var s = 0, sMax = selected.length; s < sMax; s++) { - nodes[selected[s]].draw(ctx); - } -}; -/** - * Redraw all edges - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @private - */ -Graph.prototype._drawEdges = function(ctx) { - var edges = this.edges; - for (var id in edges) { - if (edges.hasOwnProperty(id)) { - var edge = edges[id]; - if (edge.connected) { - edges[id].draw(ctx); - } + /** + * Handle the onHold selection part + * + * @param pointer + * @private + */ + _handleOnHold : function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null) { + this._selectNode(node,true); } - } -}; + this._redraw(); + }, -/** - * Find a stable position for all nodes - * @private - */ -Graph.prototype._doStabilize = function() { - var start = new Date(); - // find stable position - var count = 0; - var vmin = this.constants.minVelocity; - var stable = false; - while (!stable && count < this.constants.maxIterations) { - this._calculateForces(); - this._discreteStepNodes(); - stable = !this._isMoving(vmin); - count++; - } + /** + * handle the onRelease event. These functions are here for the navigation controls module. + * + * @private + */ + _handleOnRelease : function() { + this.xIncrement = 0; + this.yIncrement = 0; + this.zoomIncrement = 0; + this._unHighlightAll(); + }, - var end = new Date(); - // console.log('Stabilized in ' + (end-start) + ' ms, ' + count + ' iterations' ); // TODO: cleanup -}; -/** - * Calculate the external forces acting on the nodes - * Forces are caused by: edges, repulsing forces between nodes, gravity - * @private - */ -Graph.prototype._calculateForces = function() { - // create a local edge to the nodes and edges, that is faster - var id, dx, dy, angle, distance, fx, fy, - repulsingForce, springForce, length, edgeLength, - nodes = this.nodes, - edges = this.edges; + /** + * + * retrieve the currently selected nodes + * @return {Number[] | String[]} selection An array with the ids of the + * selected nodes. + */ + getSelection : function() { + return this.selection.concat([]); + }, - // gravity, add a small constant force to pull the nodes towards the center of - // the graph - // Also, the forces are reset to zero in this loop by using _setForce instead - // of _addForce - var gravity = 0.01, - gx = this.frame.canvas.clientWidth / 2, - gy = this.frame.canvas.clientHeight / 2; - for (id in nodes) { - if (nodes.hasOwnProperty(id)) { - var node = nodes[id]; - dx = gx - node.x; - dy = gy - node.y; - angle = Math.atan2(dy, dx); - fx = Math.cos(angle) * gravity; - fy = Math.sin(angle) * gravity; + /** + * + * retrieve the currently selected nodes as objects + * @return {Objects} selection An array with the ids of the + * selected nodes. + */ + getSelectionObjects : function() { + return this.selectionObj; + }, - node._setForce(fx, fy); - } - } + /** + * // TODO: rework this function, it is from the old system + * + * select zero or more nodes + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. + */ + setSelection : function(selection) { + var i, iMax, id; - // repulsing forces between nodes - var minimumDistance = this.constants.nodes.distance, - steepness = 10; // higher value gives steeper slope of the force around the given minimumDistance + if (!selection || (selection.length == undefined)) + throw 'Selection must be an array with ids'; - for (var id1 in nodes) { - if (nodes.hasOwnProperty(id1)) { - var node1 = nodes[id1]; - for (var id2 in nodes) { - if (nodes.hasOwnProperty(id2)) { - var node2 = nodes[id2]; - // calculate normally distributed force - dx = node2.x - node1.x; - dy = node2.y - node1.y; - distance = Math.sqrt(dx * dx + dy * dy); - angle = Math.atan2(dy, dx); + // first unselect any selected node + this._unselectAll(true); - // TODO: correct factor for repulsing force - //repulsingForce = 2 * Math.exp(-5 * (distance * distance) / (dmin * dmin) ); // TODO: customize the repulsing force - //repulsingForce = Math.exp(-1 * (distance * distance) / (dmin * dmin) ); // TODO: customize the repulsing force - repulsingForce = 1 / (1 + Math.exp((distance / minimumDistance - 1) * steepness)); // TODO: customize the repulsing force - fx = Math.cos(angle) * repulsingForce; - fy = Math.sin(angle) * repulsingForce; + for (i = 0, iMax = selection.length; i < iMax; i++) { + id = selection[i]; - node1._addForce(-fx, -fy); - node2._addForce(fx, fy); - } + var node = this.nodes[id]; + if (!node) { + throw new RangeError('Node with id "' + id + '" not found'); } + this._selectNode(node,true,true); } - } - /* TODO: re-implement repulsion of edges - for (var n = 0; n < nodes.length; n++) { - for (var l = 0; l < edges.length; l++) { - var lx = edges[l].from.x+(edges[l].to.x - edges[l].from.x)/2, - ly = edges[l].from.y+(edges[l].to.y - edges[l].from.y)/2, + this.redraw(); + }, - // calculate normally distributed force - dx = nodes[n].x - lx, - dy = nodes[n].y - ly, - distance = Math.sqrt(dx * dx + dy * dy), - angle = Math.atan2(dy, dx), + /** + * TODO: rework this function, it is from the old system + * + * Validate the selection: remove ids of nodes which no longer exist + * @private + */ + _updateSelection : function () { + var i = 0; + while (i < this.selection.length) { + var nodeId = this.selection[i]; + if (!this.nodes.hasOwnProperty(nodeId)) { + this.selection.splice(i, 1); + delete this.selectionObj[nodeId]; + } + else { + i++; + } + } + } - // TODO: correct factor for repulsing force - //var repulsingforce = 2 * Math.exp(-5 * (distance * distance) / (dmin * dmin) ); // TODO: customize the repulsing force - //repulsingforce = Math.exp(-1 * (distance * distance) / (dmin * dmin) ), // TODO: customize the repulsing force - repulsingforce = 1 / (1 + Math.exp((distance / (minimumDistance / 2) - 1) * steepness)), // TODO: customize the repulsing force - fx = Math.cos(angle) * repulsingforce, - fy = Math.sin(angle) * repulsingforce; - nodes[n]._addForce(fx, fy); - edges[l].from._addForce(-fx/2,-fy/2); - edges[l].to._addForce(-fx/2,-fy/2); - } - } + + /** + * Unselect selected nodes. If no selection array is provided, all nodes + * are unselected + * @param {Object[]} selection Array with selection objects, each selection + * object has a parameter row. Optional + * @param {Boolean} triggerSelect If true (default), the select event + * is triggered when nodes are unselected + * @return {Boolean} changed True if the selection is changed + * @private */ + /* _unselectNodes : function(selection, triggerSelect) { + var changed = false; + var i, iMax, id; + + if (selection) { + // remove provided selections + for (i = 0, iMax = selection.length; i < iMax; i++) { + id = selection[i]; + if (this.nodes.hasOwnProperty(id)) { + this.nodes[id].unselect(); + } + var j = 0; + while (j < this.selection.length) { + if (this.selection[j] == id) { + this.selection.splice(j, 1); + changed = true; + } + else { + j++; + } + } + } + } + else if (this.selection && this.selection.length) { + // remove all selections + for (i = 0, iMax = this.selection.length; i < iMax; i++) { + id = this.selection[i]; + if (this.nodes.hasOwnProperty(id)) { + this.nodes[id].unselect(); + } + changed = true; + } + this.selection = []; + } - // forces caused by the edges, modelled as springs - for (id in edges) { - if (edges.hasOwnProperty(id)) { - var edge = edges[id]; - if (edge.connected) { - dx = (edge.to.x - edge.from.x); - dy = (edge.to.y - edge.from.y); - //edgeLength = (edge.from.width + edge.from.height + edge.to.width + edge.to.height)/2 || edge.length; // TODO: dmin - //edgeLength = (edge.from.width + edge.to.width)/2 || edge.length; // TODO: dmin - //edgeLength = 20 + ((edge.from.width + edge.to.width) || 0) / 2; - edgeLength = edge.length; - length = Math.sqrt(dx * dx + dy * dy); - angle = Math.atan2(dy, dx); + if (changed && (triggerSelect == true || triggerSelect == undefined)) { + // fire the select event + this._trigger('select', { + nodes: this.getSelection() + }); + } - springForce = edge.stiffness * (edgeLength - length); + return changed; + }, +*/ +/** + * select all nodes on given location x, y + * @param {Array} selection an array with node ids + * @param {boolean} append If true, the new selection will be appended to the + * current selection (except for duplicate entries) + * @return {Boolean} changed True if the selection is changed + * @private + */ +/* _selectNodes : function(selection, append) { + var changed = false; + var i, iMax; - fx = Math.cos(angle) * springForce; - fy = Math.sin(angle) * springForce; + // TODO: the selectNodes method is a little messy, rework this - edge.from._addForce(-fx, -fy); - edge.to._addForce(fx, fy); + // check if the current selection equals the desired selection + var selectionAlreadyThere = true; + if (selection.length != this.selection.length) { + selectionAlreadyThere = false; + } + else { + for (i = 0, iMax = Math.min(selection.length, this.selection.length); i < iMax; i++) { + if (selection[i] != this.selection[i]) { + selectionAlreadyThere = false; + break; + } } } - } - - /* TODO: re-implement repulsion of edges - // repulsing forces between edges - var minimumDistance = this.constants.edges.distance, - steepness = 10; // higher value gives steeper slope of the force around the given minimumDistance - for (var l = 0; l < edges.length; l++) { - //Keep distance from other edge centers - for (var l2 = l + 1; l2 < this.edges.length; l2++) { - //var dmin = (nodes[n].width + nodes[n].height + nodes[n2].width + nodes[n2].height) / 1 || minimumDistance, // TODO: dmin - //var dmin = (nodes[n].width + nodes[n2].width)/2 || minimumDistance, // TODO: dmin - //dmin = 40 + ((nodes[n].width/2 + nodes[n2].width/2) || 0), - var lx = edges[l].from.x+(edges[l].to.x - edges[l].from.x)/2, - ly = edges[l].from.y+(edges[l].to.y - edges[l].from.y)/2, - l2x = edges[l2].from.x+(edges[l2].to.x - edges[l2].from.x)/2, - l2y = edges[l2].from.y+(edges[l2].to.y - edges[l2].from.y)/2, + if (selectionAlreadyThere) { + return changed; + } - // calculate normally distributed force - dx = l2x - lx, - dy = l2y - ly, - distance = Math.sqrt(dx * dx + dy * dy), - angle = Math.atan2(dy, dx), + if (append == undefined || append == false) { + // first deselect any selected node + var triggerSelect = false; + changed = this._unselectNodes(undefined, triggerSelect); + } + for (i = 0, iMax = selection.length; i < iMax; i++) { + // add each of the new selections, but only when they are not duplicate + var id = selection[i]; + var isDuplicate = (this.selection.indexOf(id) != -1); + if (!isDuplicate) { + this.nodes[id].select(); + this.selection.push(id); + changed = true; + } + } - // TODO: correct factor for repulsing force - //var repulsingforce = 2 * Math.exp(-5 * (distance * distance) / (dmin * dmin) ); // TODO: customize the repulsing force - //repulsingforce = Math.exp(-1 * (distance * distance) / (dmin * dmin) ), // TODO: customize the repulsing force - repulsingforce = 1 / (1 + Math.exp((distance / minimumDistance - 1) * steepness)), // TODO: customize the repulsing force - fx = Math.cos(angle) * repulsingforce, - fy = Math.sin(angle) * repulsingforce; + if (changed) { + // fire the select event + this._trigger('select', { + nodes: this.getSelection() + }); + } - edges[l].from._addForce(-fx, -fy); - edges[l].to._addForce(-fx, -fy); - edges[l2].from._addForce(fx, fy); - edges[l2].to._addForce(fx, fy); - } - } - */ + return changed; + }, + */ }; + + /** - * Check if any of the nodes is still moving - * @param {number} vmin the minimum velocity considered as 'moving' - * @return {boolean} true if moving, false if non of the nodes is moving - * @private + * Created by Alex on 1/22/14. */ -Graph.prototype._isMoving = function(vmin) { - // TODO: ismoving does not work well: should check the kinetic energy, not its velocity - var nodes = this.nodes; - for (var id in nodes) { - if (nodes.hasOwnProperty(id) && nodes[id].isMoving(vmin)) { - return true; + +var NavigationMixin = { + + /** + * This function moves the navigation controls if the canvas size has been changed. If the arugments + * verticaAlignTop and horizontalAlignLeft are false, the correction will be made + * + * @private + */ + _relocateNavigation : function() { + if (this.sectors !== undefined) { + var xOffset = this.navigationClientWidth - this.frame.canvas.clientWidth; + var yOffset = this.navigationClientHeight - this.frame.canvas.clientHeight; + this.navigationClientWidth = this.frame.canvas.clientWidth; + this.navigationClientHeight = this.frame.canvas.clientHeight; + var node = null; + + for (var nodeId in this.sectors["navigation"]["nodes"]) { + if (this.sectors["navigation"]["nodes"].hasOwnProperty(nodeId)) { + node = this.sectors["navigation"]["nodes"][nodeId]; + if (!node.horizontalAlignLeft) { + node.x -= xOffset; + } + if (!node.verticalAlignTop) { + node.y -= yOffset; + } + } + } } - } - return false; -}; + }, -/** - * Perform one discrete step for all nodes - * @private - */ -Graph.prototype._discreteStepNodes = function() { - var interval = this.refreshRate / 1000.0; // in seconds - var nodes = this.nodes; - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - nodes[id].discreteStep(interval); + /** + * Creation of the navigation controls nodes. They are drawn over the rest of the nodes and are not affected by scale and translation + * they have a triggerFunction which is called on click. If the position of the navigation controls is dependent + * on this.frame.canvas.clientWidth or this.frame.canvas.clientHeight, we flag horizontalAlignLeft and verticalAlignTop false. + * This means that the location will be corrected by the _relocateNavigation function on a size change of the canvas. + * + * @private + */ + _loadNavigationElements : function() { + var DIR = this.constants.navigation.iconPath; + this.navigationClientWidth = this.frame.canvas.clientWidth; + this.navigationClientHeight = this.frame.canvas.clientHeight; + if (this.navigationClientWidth === undefined) { + this.navigationClientWidth = 0; + this.navigationClientHeight = 0; + } + var offset = 15; + var intermediateOffset = 7; + var navigationNodes = [ + {id: 'navigation_up', shape: 'image', image: DIR + '/uparrow.png', triggerFunction: "_moveUp", + verticalAlignTop: false, x: 45 + offset + intermediateOffset, y: this.navigationClientHeight - 45 - offset - intermediateOffset}, + {id: 'navigation_down', shape: 'image', image: DIR + '/downarrow.png', triggerFunction: "_moveDown", + verticalAlignTop: false, x: 45 + offset + intermediateOffset, y: this.navigationClientHeight - 15 - offset}, + {id: 'navigation_left', shape: 'image', image: DIR + '/leftarrow.png', triggerFunction: "_moveLeft", + verticalAlignTop: false, x: 15 + offset, y: this.navigationClientHeight - 15 - offset}, + {id: 'navigation_right', shape: 'image', image: DIR + '/rightarrow.png',triggerFunction: "_moveRight", + verticalAlignTop: false, x: 75 + offset + 2 * intermediateOffset, y: this.navigationClientHeight - 15 - offset}, + + {id: 'navigation_plus', shape: 'image', image: DIR + '/plus.png', triggerFunction: "_zoomIn", + verticalAlignTop: false, horizontalAlignLeft: false, + x: this.navigationClientWidth - 45 - offset - intermediateOffset, y: this.navigationClientHeight - 15 - offset}, + {id: 'navigation_min', shape: 'image', image: DIR + '/minus.png', triggerFunction: "_zoomOut", + verticalAlignTop: false, horizontalAlignLeft: false, + x: this.navigationClientWidth - 15 - offset, y: this.navigationClientHeight - 15 - offset}, + {id: 'navigation_zoomExtends', shape: 'image', image: DIR + '/zoomExtends.png', triggerFunction: "zoomToFit", + verticalAlignTop: false, horizontalAlignLeft: false, + x: this.navigationClientWidth - 15 - offset, y: this.navigationClientHeight - 45 - offset - intermediateOffset} + ]; + + var nodeObj = null; + for (var i = 0; i < navigationNodes.length; i++) { + nodeObj = this.sectors["navigation"]['nodes']; + nodeObj[navigationNodes[i]['id']] = new Node(navigationNodes[i], this.images, this.groups, this.constants); } - } -}; + }, -/** - * Start animating nodes and edges - */ -Graph.prototype.start = function() { - if (this.moving) { - this._calculateForces(); - this._discreteStepNodes(); - var vmin = this.constants.minVelocity; - this.moving = this._isMoving(vmin); - } + /** + * By setting the clustersize to be larger than 1, we use the clustering drawing method + * to illustrate the buttons are presed. We call this highlighting. + * + * @param {String} elementId + * @private + */ + _highlightNavigationElement : function(elementId) { + if (this.sectors["navigation"]["nodes"].hasOwnProperty(elementId)) { + this.sectors["navigation"]["nodes"][elementId].clusterSize = 2; + } + }, - if (this.moving) { - // start animation. only start timer if it is not already running - if (!this.timer) { - var graph = this; - this.timer = window.setTimeout(function () { - graph.timer = undefined; - graph.start(); - graph._redraw(); - }, this.refreshRate); + + /** + * Reverting back to a normal button + * + * @param {String} elementId + * @private + */ + _unHighlightNavigationElement : function(elementId) { + if (this.sectors["navigation"]["nodes"].hasOwnProperty(elementId)) { + this.sectors["navigation"]["nodes"][elementId].clusterSize = 1; } - } - else { - this._redraw(); - } -}; + }, -/** - * Stop animating nodes and edges. - */ -Graph.prototype.stop = function () { - if (this.timer) { - window.clearInterval(this.timer); - this.timer = undefined; - } -}; + /** + * un-highlight (for lack of a better term) all navigation controls elements + * @private + */ + _unHighlightAll : function() { + for (var nodeId in this.sectors['navigation']['nodes']) { + if (this.sectors['navigation']['nodes'].hasOwnProperty(nodeId)) { + this._unHighlightNavigationElement(nodeId); + } + } + }, -/** - * vis.js module exports - */ -var vis = { - util: util, - events: events, - Controller: Controller, - DataSet: DataSet, - DataView: DataView, - Range: Range, - Stack: Stack, - TimeStep: TimeStep, - EventBus: EventBus, + _preventDefault : function(event) { + if (event !== undefined) { + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + } + }, - components: { - items: { - Item: Item, - ItemBox: ItemBox, - ItemPoint: ItemPoint, - ItemRange: ItemRange - }, - Component: Component, - Panel: Panel, - RootPanel: RootPanel, - ItemSet: ItemSet, - TimeAxis: TimeAxis + /** + * move the screen up + * By using the increments, instead of adding a fixed number to the translation, we keep fluent and + * instant movement. The onKeypress event triggers immediately, then pauses, then triggers frequently + * To avoid this behaviour, we do the translation in the start loop. + * + * @private + */ + _moveUp : function(event) { + this._highlightNavigationElement("navigation_up"); + this.yIncrement = this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + this._preventDefault(event); }, - graph: { - Node: Node, - Edge: Edge, - Popup: Popup, - Groups: Groups, - Images: Images + + /** + * move the screen down + * @private + */ + _moveDown : function(event) { + this._highlightNavigationElement("navigation_down"); + this.yIncrement = -this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + this._preventDefault(event); }, - Timeline: Timeline, - Graph: Graph -}; -/** - * CommonJS module exports - */ -if (typeof exports !== 'undefined') { - exports = vis; -} -if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { - module.exports = vis; -} + /** + * move the screen left + * @private + */ + _moveLeft : function(event) { + this._highlightNavigationElement("navigation_left"); + this.xIncrement = this.constants.keyboard.speed.x; + this.start(); // if there is no node movement, the calculation wont be done + this._preventDefault(event); + }, -/** - * AMD module exports - */ -if (typeof(define) === 'function') { - define(function () { - return vis; - }); -} -/** - * Window exports - */ -if (typeof window !== 'undefined') { - // attach the module to the window, load as a regular javascript file - window['vis'] = vis; -} + /** + * move the screen right + * @private + */ + _moveRight : function(event) { + this._highlightNavigationElement("navigation_right"); + this.xIncrement = -this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + this._preventDefault(event); + }, -},{"hammerjs":2,"moment":3}],2:[function(require,module,exports){ -/*! Hammer.JS - v1.0.5 - 2013-04-07 - * http://eightmedia.github.com/hammer.js - * - * Copyright (c) 2013 Jorik Tangelder ; - * Licensed under the MIT license */ + /** + * Zoom in, using the same method as the movement. + * @private + */ + _zoomIn : function(event) { + this._highlightNavigationElement("navigation_plus"); + this.zoomIncrement = this.constants.keyboard.speed.zoom; + this.start(); // if there is no node movement, the calculation wont be done + this._preventDefault(event); + }, -(function(window, undefined) { - 'use strict'; -/** - * Hammer - * use this to create instances - * @param {HTMLElement} element - * @param {Object} options - * @returns {Hammer.Instance} - * @constructor - */ -var Hammer = function(element, options) { - return new Hammer.Instance(element, options || {}); -}; + /** + * Zoom out + * @private + */ + _zoomOut : function() { + this._highlightNavigationElement("navigation_min"); + this.zoomIncrement = -this.constants.keyboard.speed.zoom; + this.start(); // if there is no node movement, the calculation wont be done + this._preventDefault(event); + }, -// default settings -Hammer.defaults = { - // add styles and attributes to the element to prevent the browser from doing - // its native behavior. this doesnt prevent the scrolling, but cancels - // the contextmenu, tap highlighting etc - // set to false to disable this - stop_browser_behavior: { - // this also triggers onselectstart=false for IE - userSelect: 'none', - // this makes the element blocking in IE10 >, you could experiment with the value - // see for more options this issue; https://github.com/EightMedia/hammer.js/issues/241 - touchAction: 'none', - touchCallout: 'none', - contentZooming: 'none', - userDrag: 'none', - tapHighlightColor: 'rgba(0,0,0,0)' - } - // more settings are defined per gesture at gestures.js -}; + /** + * Stop zooming and unhighlight the zoom controls + * @private + */ + _stopZoom : function() { + this._unHighlightNavigationElement("navigation_plus"); + this._unHighlightNavigationElement("navigation_min"); -// detect touchevents -Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled; -Hammer.HAS_TOUCHEVENTS = ('ontouchstart' in window); + this.zoomIncrement = 0; + }, -// dont use mouseevents on mobile devices -Hammer.MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i; -Hammer.NO_MOUSEEVENTS = Hammer.HAS_TOUCHEVENTS && navigator.userAgent.match(Hammer.MOBILE_REGEX); -// eventtypes per touchevent (start, move, end) -// are filled by Hammer.event.determineEventTypes on setup -Hammer.EVENT_TYPES = {}; + /** + * Stop moving in the Y direction and unHighlight the up and down + * @private + */ + _yStopMoving : function() { + this._unHighlightNavigationElement("navigation_up"); + this._unHighlightNavigationElement("navigation_down"); -// direction defines -Hammer.DIRECTION_DOWN = 'down'; -Hammer.DIRECTION_LEFT = 'left'; -Hammer.DIRECTION_UP = 'up'; -Hammer.DIRECTION_RIGHT = 'right'; + this.yIncrement = 0; + }, -// pointer type -Hammer.POINTER_MOUSE = 'mouse'; -Hammer.POINTER_TOUCH = 'touch'; -Hammer.POINTER_PEN = 'pen'; -// touch event defines -Hammer.EVENT_START = 'start'; -Hammer.EVENT_MOVE = 'move'; -Hammer.EVENT_END = 'end'; + /** + * Stop moving in the X direction and unHighlight left and right. + * @private + */ + _xStopMoving : function() { + this._unHighlightNavigationElement("navigation_left"); + this._unHighlightNavigationElement("navigation_right"); -// hammer document where the base events are added at -Hammer.DOCUMENT = document; + this.xIncrement = 0; + } -// plugins namespace -Hammer.plugins = {}; -// if the window events are set... -Hammer.READY = false; +}; /** - * setup events to detect gestures on the document + * @constructor Graph + * Create a graph visualization, displaying nodes and edges. + * + * @param {Element} container The DOM element in which the Graph will + * be created. Normally a div element. + * @param {Object} data An object containing parameters + * {Array} nodes + * {Array} edges + * @param {Object} options Options */ -function setup() { - if(Hammer.READY) { - return; - } +function Graph (container, data, options) { + // create variables and set default values + this.containerElement = container; + this.width = '100%'; + this.height = '100%'; + // to give everything a nice fluidity, we seperate the rendering and calculating of the forces + this.renderRefreshRate = 60; // hz (fps) + this.renderTimestep = 1000 / this.renderRefreshRate; // ms -- saves calculation later on + this.stabilize = true; // stabilize before displaying the graph + this.selectable = true; - // find what eventtypes we add listeners to - Hammer.event.determineEventTypes(); + this.forceFactor = 50000; - // Register all gestures inside Hammer.gestures - for(var name in Hammer.gestures) { - if(Hammer.gestures.hasOwnProperty(name)) { - Hammer.detection.register(Hammer.gestures[name]); + // set constant values + this.constants = { + nodes: { + radiusMin: 5, + radiusMax: 20, + radius: 5, + distance: 100, // px + shape: 'ellipse', + image: undefined, + widthMin: 16, // px + widthMax: 64, // px + fontColor: 'black', + fontSize: 14, // px + //fontFace: verdana, + fontFace: 'arial', + color: { + border: '#2B7CE9', + background: '#97C2FC', + highlight: { + border: '#2B7CE9', + background: '#D2E5FF' } - } - - // Add touch events on the document - Hammer.event.onTouch(Hammer.DOCUMENT, Hammer.EVENT_MOVE, Hammer.detection.detect); - Hammer.event.onTouch(Hammer.DOCUMENT, Hammer.EVENT_END, Hammer.detection.detect); + }, + borderColor: '#2B7CE9', + backgroundColor: '#97C2FC', + highlightColor: '#D2E5FF', + group: undefined + }, + edges: { + widthMin: 1, + widthMax: 15, + width: 1, + style: 'line', + color: '#343434', + fontColor: '#343434', + fontSize: 14, // px + fontFace: 'arial', + //distance: 100, //px + length: 100, // px + dash: { + length: 10, + gap: 5, + altLength: undefined + } + }, + clustering: { // Per Node in Cluster = PNiC + enabled: false, // (Boolean) | global on/off switch for clustering. + initialMaxNodes: 100, // (# nodes) | if the initial amount of nodes is larger than this, we cluster until the total number is less than this threshold. + clusterThreshold:500, // (# nodes) | during calculate forces, we check if the total number of nodes is larger than this. If it is, cluster until reduced to reduceToNodes + reduceToNodes:300, // (# nodes) | during calculate forces, we check if the total number of nodes is larger than clusterThreshold. If it is, cluster until reduced to this + chainThreshold: 0.4, // (% of all drawn nodes)| maximum percentage of allowed chainnodes (long strings of connected nodes) within all nodes. (lower means less chains). + clusterEdgeThreshold: 20, // (px) | edge length threshold. if smaller, this node is clustered. + sectorThreshold: 50, // (# nodes in cluster) | cluster size threshold. If larger, expanding in own sector. + screenSizeThreshold: 0.2, // (% of canvas) | relative size threshold. If the width or height of a clusternode takes up this much of the screen, decluster node. + fontSizeMultiplier: 4.0, // (px PNiC) | how much the cluster font size grows per node in cluster (in px). + forceAmplification: 0.6, // (multiplier PNiC) | factor of increase fo the repulsion force of a cluster (per node in cluster). + distanceAmplification: 0.2, // (multiplier PNiC) | factor how much the repulsion distance of a cluster increases (per node in cluster). + edgeGrowth: 11, // (px PNiC) | amount of clusterSize connected to the edge is multiplied with this and added to edgeLength. + nodeScaling: {width: 10, // (px PNiC) | growth of the width per node in cluster. + height: 10, // (px PNiC) | growth of the height per node in cluster. + radius: 10}, // (px PNiC) | growth of the radius per node in cluster. + activeAreaBoxSize: 100, // (px) | box area around the curser where clusters are popped open. + massTransferCoefficient: 1 // (multiplier) | parent.mass += massTransferCoefficient * child.mass + }, + navigation: { + enabled: false, + iconPath: this._getScriptPath() + '/img' + }, + keyboard: { + enabled: false, + speed: {x: 10, y: 10, zoom: 0.02} + }, + minVelocity: 2, // px/s + maxIterations: 1000 // maximum number of iteration to stabilize + }; - // Hammer is ready...! - Hammer.READY = true; -} + // Node variables + this.groups = new Groups(); // object with groups + this.images = new Images(); // object with images + this.images.setOnloadCallback(function () { + graph._redraw(); + }); -/** - * create new hammer instance - * all methods should return the instance itself, so it is chainable. - * @param {HTMLElement} element - * @param {Object} [options={}] - * @returns {Hammer.Instance} - * @constructor - */ -Hammer.Instance = function(element, options) { - var self = this; + // navigation variables + this.xIncrement = 0; + this.yIncrement = 0; + this.zoomIncrement = 0; - // setup HammerJS window events and register all gestures - // this also sets up the default options - setup(); + // create a frame and canvas + this._create(); - this.element = element; + // load the sector system. (mandatory, fully integrated with Graph) + this._loadSectorSystem(); - // start/stop detection option - this.enabled = true; + // apply options + this.setOptions(options); - // merge options - this.options = Hammer.utils.extend( - Hammer.utils.extend({}, Hammer.defaults), - options || {}); + // load the cluster system. (mandatory, even when not using the cluster system, there are function calls to it) + this._loadClusterSystem(); - // add some css to the element to prevent the browser from doing its native behavoir - if(this.options.stop_browser_behavior) { - Hammer.utils.stopDefaultBrowserBehavior(this.element, this.options.stop_browser_behavior); - } + // load the selection system. (mandatory, required by Graph) + this._loadSelectionSystem(); - // start detection on touchstart - Hammer.event.onTouch(element, Hammer.EVENT_START, function(ev) { - if(self.enabled) { - Hammer.detection.startDetect(self, ev); - } - }); + // other vars + var graph = this; + this.freezeSimulation = false;// freeze the simulation - // return instance - return this; -}; + this.nodeIndices = []; // array with all the indices of the nodes. Used to speed up forces calculation + this.nodes = {}; // object with Node objects + this.edges = {}; // object with Edge objects + this.canvasTopLeft = {"x": 0,"y": 0}; // coordinates of the top left of the canvas. they will be set during _redraw. + this.canvasBottomRight = {"x": 0,"y": 0}; // coordinates of the bottom right of the canvas. they will be set during _redraw -Hammer.Instance.prototype = { - /** - * bind events to the instance - * @param {String} gesture - * @param {Function} handler - * @returns {Hammer.Instance} - */ - on: function onEvent(gesture, handler){ - var gestures = gesture.split(' '); - for(var t=0; t (node.x - node.width)) {minX = node.x - node.width;} + if (maxX < (node.x + node.width)) {maxX = node.x + node.width;} + if (minY > (node.y - node.height)) {minY = node.y - node.height;} + if (maxY < (node.y + node.height)) {maxY = node.y + node.height;} + } + return {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; +}; /** - * when the mouse is hold down, this is true - * @type {Boolean} + * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; + * @returns {{x: number, y: number}} + * @private */ -var enable_detect = false; +Graph.prototype._findCenter = function(range) { + var center = {x: (0.5 * (range.maxX + range.minX)), + y: (0.5 * (range.maxY + range.minY))}; + return center; +}; /** - * when touch events have been fired, this is true - * @type {Boolean} + * center the graph + * + * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; */ -var touch_triggered = false; +Graph.prototype._centerGraph = function(range) { + var center = this._findCenter(range); + center.x *= this.scale; + center.y *= this.scale; + center.x -= 0.5 * this.frame.canvas.clientWidth; + center.y -= 0.5 * this.frame.canvas.clientHeight; -Hammer.event = { - /** - * simple addEventListener - * @param {HTMLElement} element - * @param {String} type - * @param {Function} handler - */ - bindDom: function(element, type, handler) { - var types = type.split(' '); - for(var t=0; t= this.constants.clustering.initialMaxNodes) { + var zoomLevel = 38.8467 / (numberOfNodes - 14.50184) + 0.0116; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. + } + else { + var zoomLevel = 42.54117319 / (numberOfNodes + 39.31966387) + 0.1944405; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. + } + } + else { + var xDistance = (Math.abs(range.minX) + Math.abs(range.maxX)) * 1.1; + var yDistance = (Math.abs(range.minY) + Math.abs(range.maxY)) * 1.1; - // mousebutton must be down or a touch event - else if( sourceEventType.match(/touch/) || // touch events are always on screen - sourceEventType.match(/pointerdown/) || // pointerevents touch - (sourceEventType.match(/mouse/) && ev.which === 1) // mouse is pressed - ){ - enable_detect = true; - } + var xZoomLevel = this.frame.canvas.clientWidth / xDistance; + var yZoomLevel = this.frame.canvas.clientHeight / yDistance; - // we are in a touch event, set the touch triggered bool to true, - // this for the conflicts that may occur on ios and android - if(sourceEventType.match(/touch|pointer/)) { - touch_triggered = true; - } + zoomLevel = (xZoomLevel <= yZoomLevel) ? xZoomLevel : yZoomLevel; + } - // count the total touches on the screen - var count_touches = 0; + if (zoomLevel > 1.0) { + zoomLevel = 1.0; + } - // when touch has been triggered in this detection session - // and we are now handling a mouse event, we stop that to prevent conflicts - if(enable_detect) { - // update pointerevent - if(Hammer.HAS_POINTEREVENTS && eventType != Hammer.EVENT_END) { - count_touches = Hammer.PointerEvent.updatePointer(eventType, ev); - } - // touch - else if(sourceEventType.match(/touch/)) { - count_touches = ev.touches.length; - } - // mouse - else if(!touch_triggered) { - count_touches = sourceEventType.match(/up/) ? 0 : 1; - } + this.pinch.mousewheelScale = zoomLevel; + this._setScale(zoomLevel); + this._centerGraph(range); + this.start(); +}; - // if we are in a end event, but when we remove one touch and - // we still have enough, set eventType to move - if(count_touches > 0 && eventType == Hammer.EVENT_END) { - eventType = Hammer.EVENT_MOVE; - } - // no touches, force the end event - else if(!count_touches) { - eventType = Hammer.EVENT_END; - } - // because touchend has no touches, and we often want to use these in our gestures, - // we send the last move event as our eventData in touchend - if(!count_touches && last_move_event !== null) { - ev = last_move_event; - } - // store the last move event - else { - last_move_event = ev; - } +/** + * Update the this.nodeIndices with the most recent node index list + * @private + */ +Graph.prototype._updateNodeIndexList = function() { + this._clearNodeIndexList(); + for (var idx in this.nodes) { + if (this.nodes.hasOwnProperty(idx)) { + this.nodeIndices.push(idx); + } + } +}; - // trigger the handler - handler.call(Hammer.detection, self.collectEventData(element, eventType, ev)); - // remove pointerevent from list - if(Hammer.HAS_POINTEREVENTS && eventType == Hammer.EVENT_END) { - count_touches = Hammer.PointerEvent.updatePointer(eventType, ev); - } - } +/** + * Set nodes and edges, and optionally options as well. + * + * @param {Object} data Object containing parameters: + * {Array | DataSet | DataView} [nodes] Array with nodes + * {Array | DataSet | DataView} [edges] Array with edges + * {String} [dot] String containing data in DOT format + * {Options} [options] Object with options + * @param {Boolean} [disableStart] | optional: disable the calling of the start function. + */ +Graph.prototype.setData = function(data, disableStart) { + if (disableStart === undefined) { + disableStart = false; + } - //debug(sourceEventType +" "+ eventType); + if (data && data.dot && (data.nodes || data.edges)) { + throw new SyntaxError('Data must contain either parameter "dot" or ' + + ' parameter pair "nodes" and "edges", but not both.'); + } - // on the end we reset everything - if(!count_touches) { - last_move_event = null; - enable_detect = false; - touch_triggered = false; - Hammer.PointerEvent.reset(); - } - }); - }, + // set options + this.setOptions(data && data.options); + + // set all data + if (data && data.dot) { + // parse DOT file + if(data && data.dot) { + var dotData = vis.util.DOTToGraph(data.dot); + this.setData(dotData); + return; + } + } + else { + this._setNodes(data && data.nodes); + this._setEdges(data && data.edges); + } + this._putDataInSector(); - /** - * we have different events for each device/browser - * determine what we need and set them in the Hammer.EVENT_TYPES constant - */ - determineEventTypes: function determineEventTypes() { - // determine the eventtype we want to set - var types; + if (!disableStart) { + // find a stable position or start animating to a stable position + if (this.stabilize) { + this._doStabilize(); + } + this.moving = true; + this.start(); + } +}; - // pointerEvents magic - if(Hammer.HAS_POINTEREVENTS) { - types = Hammer.PointerEvent.getEvents(); +/** + * Set options + * @param {Object} options + */ +Graph.prototype.setOptions = function (options) { + if (options) { + // retrieve parameter values + if (options.width !== undefined) {this.width = options.width;} + if (options.height !== undefined) {this.height = options.height;} + if (options.stabilize !== undefined) {this.stabilize = options.stabilize;} + if (options.selectable !== undefined) {this.selectable = options.selectable;} + + if (options.clustering) { + this.constants.clustering.enabled = true; + for (var prop in options.clustering) { + if (options.clustering.hasOwnProperty(prop)) { + this.constants.clustering[prop] = options.clustering[prop]; } - // on Android, iOS, blackberry, windows mobile we dont want any mouseevents - else if(Hammer.NO_MOUSEEVENTS) { - types = [ - 'touchstart', - 'touchmove', - 'touchend touchcancel']; + } + } + else if (options.clustering !== undefined) { + this.constants.clustering.enabled = false; + } + + if (options.navigation) { + this.constants.navigation.enabled = true; + for (var prop in options.navigation) { + if (options.navigation.hasOwnProperty(prop)) { + this.constants.navigation[prop] = options.navigation[prop]; } - // for non pointer events browsers and mixed browsers, - // like chrome on windows8 touch laptop - else { - types = [ - 'touchstart mousedown', - 'touchmove mousemove', - 'touchend touchcancel mouseup']; + } + } + else if (options.navigation !== undefined) { + this.constants.navigation.enabled = false; + } + + if (options.keyboard) { + this.constants.keyboard.enabled = true; + for (var prop in options.keyboard) { + if (options.keyboard.hasOwnProperty(prop)) { + this.constants.keyboard[prop] = options.keyboard[prop]; } + } + } + else if (options.keyboard !== undefined) { + this.constants.keyboard.enabled = false; + } - Hammer.EVENT_TYPES[Hammer.EVENT_START] = types[0]; - Hammer.EVENT_TYPES[Hammer.EVENT_MOVE] = types[1]; - Hammer.EVENT_TYPES[Hammer.EVENT_END] = types[2]; - }, + // TODO: work out these options and document them + if (options.edges) { + for (prop in options.edges) { + if (options.edges.hasOwnProperty(prop)) { + this.constants.edges[prop] = options.edges[prop]; + } + } - /** - * create touchlist depending on the event - * @param {Object} ev - * @param {String} eventType used by the fakemultitouch plugin - */ - getTouchList: function getTouchList(ev/*, eventType*/) { - // get the fake pointerEvent touchlist - if(Hammer.HAS_POINTEREVENTS) { - return Hammer.PointerEvent.getTouchList(); + if (options.edges.length !== undefined && + options.nodes && options.nodes.distance === undefined) { + this.constants.edges.length = options.edges.length; + this.constants.nodes.distance = options.edges.length * 1.25; + } + + if (!options.edges.fontColor) { + this.constants.edges.fontColor = options.edges.color; + } + + // Added to support dashed lines + // David Jordan + // 2012-08-08 + if (options.edges.dash) { + if (options.edges.dash.length !== undefined) { + this.constants.edges.dash.length = options.edges.dash.length; } - // get the touchlist - else if(ev.touches) { - return ev.touches; + if (options.edges.dash.gap !== undefined) { + this.constants.edges.dash.gap = options.edges.dash.gap; } - // make fake touchlist from mouse position - else { - return [{ - identifier: 1, - pageX: ev.pageX, - pageY: ev.pageY, - target: ev.target - }]; + if (options.edges.dash.altLength !== undefined) { + this.constants.edges.dash.altLength = options.edges.dash.altLength; } - }, + } + } + if (options.nodes) { + for (prop in options.nodes) { + if (options.nodes.hasOwnProperty(prop)) { + this.constants.nodes[prop] = options.nodes[prop]; + } + } - /** - * collect event data for Hammer js - * @param {HTMLElement} element - * @param {String} eventType like Hammer.EVENT_MOVE - * @param {Object} eventData - */ - collectEventData: function collectEventData(element, eventType, ev) { - var touches = this.getTouchList(ev, eventType); + if (options.nodes.color) { + this.constants.nodes.color = Node.parseColor(options.nodes.color); + } - // find out pointerType - var pointerType = Hammer.POINTER_TOUCH; - if(ev.type.match(/mouse/) || Hammer.PointerEvent.matchType(Hammer.POINTER_MOUSE, ev)) { - pointerType = Hammer.POINTER_MOUSE; + /* + if (options.nodes.widthMin) this.constants.nodes.radiusMin = options.nodes.widthMin; + if (options.nodes.widthMax) this.constants.nodes.radiusMax = options.nodes.widthMax; + */ + } + if (options.groups) { + for (var groupname in options.groups) { + if (options.groups.hasOwnProperty(groupname)) { + var group = options.groups[groupname]; + this.groups.add(groupname, group); } + } + } + } - return { - center : Hammer.utils.getCenter(touches), - timeStamp : new Date().getTime(), - target : ev.target, - touches : touches, - eventType : eventType, - pointerType : pointerType, - srcEvent : ev, - - /** - * prevent the browser default actions - * mostly used to disable scrolling of the browser - */ - preventDefault: function() { - if(this.srcEvent.preventManipulation) { - this.srcEvent.preventManipulation(); - } + this.setSize(this.width, this.height); + this._setTranslation(this.frame.clientWidth / 2, this.frame.clientHeight / 2); + this._setScale(1); - if(this.srcEvent.preventDefault) { - this.srcEvent.preventDefault(); - } - }, + // load the navigation system. + this._loadNavigationControls(); - /** - * stop bubbling the event up to its parents - */ - stopPropagation: function() { - this.srcEvent.stopPropagation(); - }, + // bind keys. If disabled, this will not do anything; + this._createKeyBinds(); - /** - * immediately stop gesture detection - * might be useful after a swipe was detected - * @return {*} - */ - stopDetect: function() { - return Hammer.detection.stopDetect(); - } - }; - } + this._redraw(); }; -Hammer.PointerEvent = { - /** - * holds all pointers - * @type {Object} - */ - pointers: {}, - - /** - * get a list of pointers - * @returns {Array} touchlist - */ - getTouchList: function() { - var self = this; - var touchlist = []; +/** + * Add event listener + * @param {String} event Event name. Available events: + * 'select' + * @param {function} callback Callback function, invoked as callback(properties) + * where properties is an optional object containing + * event specific properties. + */ +Graph.prototype.on = function on (event, callback) { + var available = ['select']; - // we can use forEach since pointerEvents only is in IE10 - Object.keys(self.pointers).sort().forEach(function(id) { - touchlist.push(self.pointers[id]); - }); - return touchlist; - }, + if (available.indexOf(event) == -1) { + throw new Error('Unknown event "' + event + '". Choose from ' + available.join()); + } - /** - * update the position of a pointer - * @param {String} type Hammer.EVENT_END - * @param {Object} pointerEvent - */ - updatePointer: function(type, pointerEvent) { - if(type == Hammer.EVENT_END) { - this.pointers = {}; - } - else { - pointerEvent.identifier = pointerEvent.pointerId; - this.pointers[pointerEvent.pointerId] = pointerEvent; - } + events.addListener(this, event, callback); +}; - return Object.keys(this.pointers).length; - }, +/** + * Remove an event listener + * @param {String} event Event name + * @param {function} callback Callback function + */ +Graph.prototype.off = function off (event, callback) { + events.removeListener(this, event, callback); +}; - /** - * check if ev matches pointertype - * @param {String} pointerType Hammer.POINTER_MOUSE - * @param {PointerEvent} ev - */ - matchType: function(pointerType, ev) { - if(!ev.pointerType) { - return false; - } +/** + * fire an event + * @param {String} event The name of an event, for example 'select' + * @param {Object} params Optional object with event parameters + * @private + */ +Graph.prototype._trigger = function (event, params) { + events.trigger(this, event, params); +}; - var types = {}; - types[Hammer.POINTER_MOUSE] = (ev.pointerType == ev.MSPOINTER_TYPE_MOUSE || ev.pointerType == Hammer.POINTER_MOUSE); - types[Hammer.POINTER_TOUCH] = (ev.pointerType == ev.MSPOINTER_TYPE_TOUCH || ev.pointerType == Hammer.POINTER_TOUCH); - types[Hammer.POINTER_PEN] = (ev.pointerType == ev.MSPOINTER_TYPE_PEN || ev.pointerType == Hammer.POINTER_PEN); - return types[pointerType]; - }, +/** + * Create the main frame for the Graph. + * This function is executed once when a Graph object is created. The frame + * contains a canvas, and this canvas contains all objects like the axis and + * nodes. + * @private + */ +Graph.prototype._create = function () { + // remove all elements from the container element. + while (this.containerElement.hasChildNodes()) { + this.containerElement.removeChild(this.containerElement.firstChild); + } - /** - * get events - */ - getEvents: function() { - return [ - 'pointerdown MSPointerDown', - 'pointermove MSPointerMove', - 'pointerup pointercancel MSPointerUp MSPointerCancel' - ]; - }, + this.frame = document.createElement('div'); + this.frame.className = 'graph-frame'; + this.frame.style.position = 'relative'; + this.frame.style.overflow = 'hidden'; - /** - * reset the list - */ - reset: function() { - this.pointers = {}; - } -}; + // create the graph canvas (HTML canvas element) + this.frame.canvas = document.createElement( 'canvas' ); + this.frame.canvas.style.position = 'relative'; + this.frame.appendChild(this.frame.canvas); + if (!this.frame.canvas.getContext) { + var noCanvas = document.createElement( 'DIV' ); + noCanvas.style.color = 'red'; + noCanvas.style.fontWeight = 'bold' ; + noCanvas.style.padding = '10px'; + noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; + this.frame.canvas.appendChild(noCanvas); + } + var me = this; + this.drag = {}; + this.pinch = {}; + this.hammer = Hammer(this.frame.canvas, { + prevent_default: true + }); + this.hammer.on('tap', me._onTap.bind(me) ); + this.hammer.on('doubletap', me._onDoubleTap.bind(me) ); + this.hammer.on('hold', me._onHold.bind(me) ); + this.hammer.on('pinch', me._onPinch.bind(me) ); + this.hammer.on('touch', me._onTouch.bind(me) ); + this.hammer.on('dragstart', me._onDragStart.bind(me) ); + this.hammer.on('drag', me._onDrag.bind(me) ); + this.hammer.on('dragend', me._onDragEnd.bind(me) ); + this.hammer.on('release', me._onRelease.bind(me) ); + this.hammer.on('mousewheel',me._onMouseWheel.bind(me) ); + this.hammer.on('DOMMouseScroll',me._onMouseWheel.bind(me) ); // for FF + this.hammer.on('mousemove', me._onMouseMoveTitle.bind(me) ); -Hammer.utils = { - /** - * extend method, - * also used for cloning when dest is an empty object - * @param {Object} dest - * @param {Object} src - * @parm {Boolean} merge do a merge - * @returns {Object} dest - */ - extend: function extend(dest, src, merge) { - for (var key in src) { - if(dest[key] !== undefined && merge) { - continue; - } - dest[key] = src[key]; - } - return dest; - }, + // add the frame to the container element + this.containerElement.appendChild(this.frame); +}; + + +/** + * Binding the keys for keyboard navigation. These functions are defined in the NavigationMixin + * @private + */ +Graph.prototype._createKeyBinds = function() { + var me = this; + this.mousetrap = mousetrap; + + this.mousetrap.reset(); + + if (this.constants.keyboard.enabled == true) { + this.mousetrap.bind("up", this._moveUp.bind(me) , "keydown"); + this.mousetrap.bind("up", this._yStopMoving.bind(me), "keyup"); + this.mousetrap.bind("down", this._moveDown.bind(me) , "keydown"); + this.mousetrap.bind("down", this._yStopMoving.bind(me), "keyup"); + this.mousetrap.bind("left", this._moveLeft.bind(me) , "keydown"); + this.mousetrap.bind("left", this._xStopMoving.bind(me), "keyup"); + this.mousetrap.bind("right",this._moveRight.bind(me), "keydown"); + this.mousetrap.bind("right",this._xStopMoving.bind(me), "keyup"); + this.mousetrap.bind("=", this._zoomIn.bind(me), "keydown"); + this.mousetrap.bind("=", this._stopZoom.bind(me), "keyup"); + this.mousetrap.bind("-", this._zoomOut.bind(me), "keydown"); + this.mousetrap.bind("-", this._stopZoom.bind(me), "keyup"); + this.mousetrap.bind("[", this._zoomIn.bind(me), "keydown"); + this.mousetrap.bind("[", this._stopZoom.bind(me), "keyup"); + this.mousetrap.bind("]", this._zoomOut.bind(me), "keydown"); + this.mousetrap.bind("]", this._stopZoom.bind(me), "keyup"); + this.mousetrap.bind("pageup",this._zoomIn.bind(me), "keydown"); + this.mousetrap.bind("pageup",this._stopZoom.bind(me), "keyup"); + this.mousetrap.bind("pagedown",this._zoomOut.bind(me),"keydown"); + this.mousetrap.bind("pagedown",this._stopZoom.bind(me), "keyup"); + } + /* + this.mousetrap.bind("=",this.decreaseClusterLevel.bind(me)); + this.mousetrap.bind("-",this.increaseClusterLevel.bind(me)); + this.mousetrap.bind("s",this.singleStep.bind(me)); + this.mousetrap.bind("h",this.updateClustersDefault.bind(me)); + this.mousetrap.bind("c",this._collapseSector.bind(me)); + this.mousetrap.bind("f",this.toggleFreeze.bind(me)); + */ +} + +/** + * Get the pointer location from a touch location + * @param {{pageX: Number, pageY: Number}} touch + * @return {{x: Number, y: Number}} pointer + * @private + */ +Graph.prototype._getPointer = function (touch) { + return { + x: touch.pageX - vis.util.getAbsoluteLeft(this.frame.canvas), + y: touch.pageY - vis.util.getAbsoluteTop(this.frame.canvas) + }; +}; + +/** + * On start of a touch gesture, store the pointer + * @param event + * @private + */ +Graph.prototype._onTouch = function (event) { + this.drag.pointer = this._getPointer(event.gesture.touches[0]); + this.drag.pinched = false; + this.pinch.scale = this._getScale(); + + this._handleTouch(this.drag.pointer); +}; + +/** + * handle drag start event + * @private + */ +Graph.prototype._onDragStart = function () { + var drag = this.drag; + var node = this._getNodeAt(drag.pointer); + // note: drag.pointer is set in _onTouch to get the initial touch location + + drag.dragging = true; + drag.selection = []; + drag.translation = this._getTranslation(); + drag.nodeId = null; + + if (node != null) { + drag.nodeId = node.id; + // select the clicked node if not yet selected + if (!node.isSelected()) { + this._selectNode(node,false); + } + + // create an array with the selected nodes and their original location and status + var me = this; + this.selection.forEach(function (id) { + var node = me.nodes[id]; + if (node) { + var s = { + id: id, + node: node, + + // store original x, y, xFixed and yFixed, make the node temporarily Fixed + x: node.x, + y: node.y, + xFixed: node.xFixed, + yFixed: node.yFixed + }; + + node.xFixed = true; + node.yFixed = true; + + drag.selection.push(s); + } + }); + } +}; + +/** + * handle drag event + * @private + */ +Graph.prototype._onDrag = function (event) { + if (this.drag.pinched) { + return; + } + + var pointer = this._getPointer(event.gesture.touches[0]); + + var me = this, + drag = this.drag, + selection = drag.selection; + if (selection && selection.length) { + // calculate delta's and new location + var deltaX = pointer.x - drag.pointer.x, + deltaY = pointer.y - drag.pointer.y; + + // update position of all selected nodes + selection.forEach(function (s) { + var node = s.node; + + if (!s.xFixed) { + node.x = me._canvasToX(me._xToCanvas(s.x) + deltaX); + } + + if (!s.yFixed) { + node.y = me._canvasToY(me._yToCanvas(s.y) + deltaY); + } + }); + + // start animation if not yet running + if (!this.moving) { + this.moving = true; + this.start(); + } + } + else { + // move the graph + var diffX = pointer.x - this.drag.pointer.x; + var diffY = pointer.y - this.drag.pointer.y; + + this._setTranslation( + this.drag.translation.x + diffX, + this.drag.translation.y + diffY); + this._redraw(); + this.moved = true; + } +}; + +/** + * handle drag start event + * @private + */ +Graph.prototype._onDragEnd = function () { + this.drag.dragging = false; + var selection = this.drag.selection; + if (selection) { + selection.forEach(function (s) { + // restore original xFixed and yFixed + s.node.xFixed = s.xFixed; + s.node.yFixed = s.yFixed; + }); + } +}; + +/** + * handle tap/click event: select/unselect a node + * @private + */ +Graph.prototype._onTap = function (event) { + var pointer = this._getPointer(event.gesture.touches[0]); + this._handleTap(pointer); +}; + + +/** + * handle doubletap event + * @private + */ +Graph.prototype._onDoubleTap = function (event) { + var pointer = this._getPointer(event.gesture.touches[0]); + this._handleDoubleTap(pointer); + +}; + + +/** + * handle long tap event: multi select nodes + * @private + */ +Graph.prototype._onHold = function (event) { + var pointer = this._getPointer(event.gesture.touches[0]); + this._handleOnHold(pointer); +}; + +/** + * handle the release of the screen + * + * @param event + * @private + */ +Graph.prototype._onRelease = function (event) { + this._handleOnRelease(); +}; + +/** + * Handle pinch event + * @param event + * @private + */ +Graph.prototype._onPinch = function (event) { + var pointer = this._getPointer(event.gesture.center); + + this.drag.pinched = true; + if (!('scale' in this.pinch)) { + this.pinch.scale = 1; + } + + // TODO: enabled moving while pinching? + var scale = this.pinch.scale * event.gesture.scale; + this._zoom(scale, pointer) +}; + +/** + * Zoom the graph in or out + * @param {Number} scale a number around 1, and between 0.01 and 10 + * @param {{x: Number, y: Number}} pointer Position on screen + * @return {Number} appliedScale scale is limited within the boundaries + * @private + */ +Graph.prototype._zoom = function(scale, pointer) { + var scaleOld = this._getScale(); + if (scale < 0.00001) { + scale = 0.00001; + } + if (scale > 10) { + scale = 10; + } +// + this.frame.canvas.clientHeight / 2 + var translation = this._getTranslation(); + + var scaleFrac = scale / scaleOld; + var tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac; + var ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac; + + this.areaCenter = {"x" : this._canvasToX(pointer.x), + "y" : this._canvasToY(pointer.y)}; + + // this.areaCenter = {"x" : pointer.x,"y" : pointer.y }; +// console.log(translation.x,translation.y,pointer.x,pointer.y,scale); + this.pinch.mousewheelScale = scale; + this._setScale(scale); + this._setTranslation(tx, ty); + this.updateClustersDefault(); + this._redraw(); + + return scale; +}; + +/** + * Event handler for mouse wheel event, used to zoom the timeline + * See http://adomas.org/javascript-mouse-wheel/ + * https://github.com/EightMedia/hammer.js/issues/256 + * @param {MouseEvent} event + * @private + */ +Graph.prototype._onMouseWheel = function(event) { + // retrieve delta + var delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta/120; + } else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail/3; + } + + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta) { + if (!('mousewheelScale' in this.pinch)) { + this.pinch.mousewheelScale = 1; + } + + // calculate the new scale + var scale = this.pinch.mousewheelScale; + var zoom = delta / 10; + if (delta < 0) { + zoom = zoom / (1 - zoom); + } + scale *= (1 + zoom); + + // calculate the pointer location + var gesture = util.fakeGesture(this, event); + var pointer = this._getPointer(gesture.center); + + // apply the new scale + scale = this._zoom(scale, pointer); + + // store the new, applied scale -- this is now done in _zoom +// this.pinch.mousewheelScale = scale; + } + + // Prevent default actions caused by mouse wheel. + event.preventDefault(); +}; + + +/** + * Mouse move handler for checking whether the title moves over a node with a title. + * @param {Event} event + * @private + */ +Graph.prototype._onMouseMoveTitle = function (event) { + var gesture = util.fakeGesture(this, event); + var pointer = this._getPointer(gesture.center); + + // check if the previously selected node is still selected + if (this.popupNode) { + this._checkHidePopup(pointer); + } + + // start a timeout that will check if the mouse is positioned above + // an element + var me = this; + var checkShow = function() { + me._checkShowPopup(pointer); + }; + if (this.popupTimer) { + clearInterval(this.popupTimer); // stop any running calculationTimer + } + if (!this.drag.dragging) { + this.popupTimer = setTimeout(checkShow, 300); + } +}; + +/** + * Check if there is an element on the given position in the graph + * (a node or edge). If so, and if this element has a title, + * show a popup window with its title. + * + * @param {{x:Number, y:Number}} pointer + * @private + */ +Graph.prototype._checkShowPopup = function (pointer) { + var obj = { + left: this._canvasToX(pointer.x), + top: this._canvasToY(pointer.y), + right: this._canvasToX(pointer.x), + bottom: this._canvasToY(pointer.y) + }; + + var id; + var lastPopupNode = this.popupNode; + + if (this.popupNode == undefined) { + // search the nodes for overlap, select the top one in case of multiple nodes + var nodes = this.nodes; + for (id in nodes) { + if (nodes.hasOwnProperty(id)) { + var node = nodes[id]; + if (node.getTitle() !== undefined && node.isOverlappingWith(obj)) { + this.popupNode = node; + break; + } + } + } + } + + if (this.popupNode === undefined) { + // search the edges for overlap + var edges = this.edges; + for (id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + if (edge.connected && (edge.getTitle() !== undefined) && + edge.isOverlappingWith(obj)) { + this.popupNode = edge; + break; + } + } + } + } + + if (this.popupNode) { + // show popup message window + if (this.popupNode != lastPopupNode) { + var me = this; + if (!me.popup) { + me.popup = new Popup(me.frame); + } + + // adjust a small offset such that the mouse cursor is located in the + // bottom left location of the popup, and you can easily move over the + // popup area + me.popup.setPosition(pointer.x - 3, pointer.y - 3); + me.popup.setText(me.popupNode.getTitle()); + me.popup.show(); + } + } + else { + if (this.popup) { + this.popup.hide(); + } + } +}; + +/** + * Check if the popup must be hided, which is the case when the mouse is no + * longer hovering on the object + * @param {{x:Number, y:Number}} pointer + * @private + */ +Graph.prototype._checkHidePopup = function (pointer) { + if (!this.popupNode || !this._getNodeAt(pointer) ) { + this.popupNode = undefined; + if (this.popup) { + this.popup.hide(); + } + } +}; + + +/** + * Temporary method to test calculating a hub value for the nodes + * @param {number} level Maximum number edges between two nodes in order + * to call them connected. Optional, 1 by default + * @return {Number[]} connectioncount array with the connection count + * for each node + * @private + */ +Graph.prototype._getConnectionCount = function(level) { + if (level == undefined) { + level = 1; + } + + // get the nodes connected to given nodes + function getConnectedNodes(nodes) { + var connectedNodes = []; + + for (var j = 0, jMax = nodes.length; j < jMax; j++) { + var node = nodes[j]; + + // find all nodes connected to this node + var edges = node.edges; + for (var i = 0, iMax = edges.length; i < iMax; i++) { + var edge = edges[i]; + var other = null; + + // check if connected + if (edge.from == node) + other = edge.to; + else if (edge.to == node) + other = edge.from; + + // check if the other node is not already in the list with nodes + var k, kMax; + if (other) { + for (k = 0, kMax = nodes.length; k < kMax; k++) { + if (nodes[k] == other) { + other = null; + break; + } + } + } + if (other) { + for (k = 0, kMax = connectedNodes.length; k < kMax; k++) { + if (connectedNodes[k] == other) { + other = null; + break; + } + } + } + + if (other) + connectedNodes.push(other); + } + } + + return connectedNodes; + } + + var connections = []; + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + var c = [nodes[id]]; + for (var l = 0; l < level; l++) { + c = c.concat(getConnectedNodes(c)); + } + connections.push(c); + } + } + + var hubs = []; + for (var i = 0, len = connections.length; i < len; i++) { + hubs.push(connections[i].length); + } + + return hubs; +}; + +/** + * Set a new size for the graph + * @param {string} width Width in pixels or percentage (for example '800px' + * or '50%') + * @param {string} height Height in pixels or percentage (for example '400px' + * or '30%') + */ +Graph.prototype.setSize = function(width, height) { + this.frame.style.width = width; + this.frame.style.height = height; + + this.frame.canvas.style.width = '100%'; + this.frame.canvas.style.height = '100%'; + + this.frame.canvas.width = this.frame.canvas.clientWidth; + this.frame.canvas.height = this.frame.canvas.clientHeight; + + if (this.constants.navigation.enabled == true) { + this._relocateNavigation(); + } +}; + +/** + * Set a data set with nodes for the graph + * @param {Array | DataSet | DataView} nodes The data containing the nodes. + * @private + */ +Graph.prototype._setNodes = function(nodes) { + var oldNodesData = this.nodesData; + + if (nodes instanceof DataSet || nodes instanceof DataView) { + this.nodesData = nodes; + } + else if (nodes instanceof Array) { + this.nodesData = new DataSet(); + this.nodesData.add(nodes); + } + else if (!nodes) { + this.nodesData = new DataSet(); + } + else { + throw new TypeError('Array or DataSet expected'); + } + + if (oldNodesData) { + // unsubscribe from old dataset + util.forEach(this.nodesListeners, function (callback, event) { + oldNodesData.unsubscribe(event, callback); + }); + } + + // remove drawn nodes + this.nodes = {}; + + if (this.nodesData) { + // subscribe to new dataset + var me = this; + util.forEach(this.nodesListeners, function (callback, event) { + me.nodesData.subscribe(event, callback); + }); + + // draw all new nodes + var ids = this.nodesData.getIds(); + this._addNodes(ids); + } + this._updateSelection(); +}; + +/** + * Add nodes + * @param {Number[] | String[]} ids + * @private + */ +Graph.prototype._addNodes = function(ids) { + var id; + for (var i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + var data = this.nodesData.get(id); + var node = new Node(data, this.images, this.groups, this.constants); + this.nodes[id] = node; // note: this may replace an existing node + + if (!node.isFixed()) { + // TODO: position new nodes in a smarter way! + var radius = this.constants.edges.length * 2; + var count = ids.length; + var angle = 2 * Math.PI * (i / count); + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + + // note: no not use node.isMoving() here, as that gives the current + // velocity of the node, which is zero after creation of the node. + this.moving = true; + } + } + this._updateNodeIndexList(); + this._reconnectEdges(); + this._updateValueRange(this.nodes); +}; + +/** + * Update existing nodes, or create them when not yet existing + * @param {Number[] | String[]} ids + * @private + */ +Graph.prototype._updateNodes = function(ids) { + var nodes = this.nodes, + nodesData = this.nodesData; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + var node = nodes[id]; + var data = nodesData.get(id); + if (node) { + // update node + node.setProperties(data, this.constants); + } + else { + // create node + node = new Node(properties, this.images, this.groups, this.constants); + nodes[id] = node; + + if (!node.isFixed()) { + this.moving = true; + } + } + } + this._updateNodeIndexList(); + this._reconnectEdges(); + this._updateValueRange(nodes); +}; + +/** + * Remove existing nodes. If nodes do not exist, the method will just ignore it. + * @param {Number[] | String[]} ids + * @private + */ +Graph.prototype._removeNodes = function(ids) { + var nodes = this.nodes; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + delete nodes[id]; + } + this._updateNodeIndexList(); + this._reconnectEdges(); + this._updateSelection(); + this._updateValueRange(nodes); +}; + +/** + * Load edges by reading the data table + * @param {Array | DataSet | DataView} edges The data containing the edges. + * @private + * @private + */ +Graph.prototype._setEdges = function(edges) { + var oldEdgesData = this.edgesData; + + if (edges instanceof DataSet || edges instanceof DataView) { + this.edgesData = edges; + } + else if (edges instanceof Array) { + this.edgesData = new DataSet(); + this.edgesData.add(edges); + } + else if (!edges) { + this.edgesData = new DataSet(); + } + else { + throw new TypeError('Array or DataSet expected'); + } + + if (oldEdgesData) { + // unsubscribe from old dataset + util.forEach(this.edgesListeners, function (callback, event) { + oldEdgesData.unsubscribe(event, callback); + }); + } + + // remove drawn edges + this.edges = {}; + + if (this.edgesData) { + // subscribe to new dataset + var me = this; + util.forEach(this.edgesListeners, function (callback, event) { + me.edgesData.subscribe(event, callback); + }); + + // draw all new nodes + var ids = this.edgesData.getIds(); + this._addEdges(ids); + } + + this._reconnectEdges(); +}; + +/** + * Add edges + * @param {Number[] | String[]} ids + * @private + */ +Graph.prototype._addEdges = function (ids) { + var edges = this.edges, + edgesData = this.edgesData; + + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + + var oldEdge = edges[id]; + if (oldEdge) { + oldEdge.disconnect(); + } + + var data = edgesData.get(id, {"showInternalIds" : true}); + edges[id] = new Edge(data, this, this.constants); + } + + this.moving = true; + this._updateValueRange(edges); +}; + +/** + * Update existing edges, or create them when not yet existing + * @param {Number[] | String[]} ids + * @private + */ +Graph.prototype._updateEdges = function (ids) { + var edges = this.edges, + edgesData = this.edgesData; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + + var data = edgesData.get(id); + var edge = edges[id]; + if (edge) { + // update edge + edge.disconnect(); + edge.setProperties(data, this.constants); + edge.connect(); + } + else { + // create edge + edge = new Edge(data, this, this.constants); + this.edges[id] = edge; + } + } + + this.moving = true; + this._updateValueRange(edges); +}; + +/** + * Remove existing edges. Non existing ids will be ignored + * @param {Number[] | String[]} ids + * @private + */ +Graph.prototype._removeEdges = function (ids) { + var edges = this.edges; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + var edge = edges[id]; + if (edge) { + edge.disconnect(); + delete edges[id]; + } + } + + this.moving = true; + this._updateValueRange(edges); +}; + +/** + * Reconnect all edges + * @private + */ +Graph.prototype._reconnectEdges = function() { + var id, + nodes = this.nodes, + edges = this.edges; + for (id in nodes) { + if (nodes.hasOwnProperty(id)) { + nodes[id].edges = []; + } + } + + for (id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + edge.from = null; + edge.to = null; + edge.connect(); + } + } +}; + +/** + * Update the values of all object in the given array according to the current + * value range of the objects in the array. + * @param {Object} obj An object containing a set of Edges or Nodes + * The objects must have a method getValue() and + * setValueRange(min, max). + * @private + */ +Graph.prototype._updateValueRange = function(obj) { + var id; + + // determine the range of the objects + var valueMin = undefined; + var valueMax = undefined; + for (id in obj) { + if (obj.hasOwnProperty(id)) { + var value = obj[id].getValue(); + if (value !== undefined) { + valueMin = (valueMin === undefined) ? value : Math.min(value, valueMin); + valueMax = (valueMax === undefined) ? value : Math.max(value, valueMax); + } + } + } + + // adjust the range of all objects + if (valueMin !== undefined && valueMax !== undefined) { + for (id in obj) { + if (obj.hasOwnProperty(id)) { + obj[id].setValueRange(valueMin, valueMax); + } + } + } +}; + +/** + * Redraw the graph with the current data + * chart will be resized too. + */ +Graph.prototype.redraw = function() { + this.setSize(this.width, this.height); + + this._redraw(); +}; + +/** + * Redraw the graph with the current data + * @private + */ +Graph.prototype._redraw = function() { + var ctx = this.frame.canvas.getContext('2d'); + // clear the canvas + var w = this.frame.canvas.width; + var h = this.frame.canvas.height; + ctx.clearRect(0, 0, w, h); + + // set scaling and translation + ctx.save(); + ctx.translate(this.translation.x, this.translation.y); + ctx.scale(this.scale, this.scale); + + this.canvasTopLeft = { + "x": this._canvasToX(0), + "y": this._canvasToY(0) + }; + this.canvasBottomRight = { + "x": this._canvasToX(this.frame.canvas.clientWidth), + "y": this._canvasToY(this.frame.canvas.clientHeight) + }; + + this._doInAllSectors("_drawAllSectorNodes",ctx); + this._doInAllSectors("_drawEdges",ctx); + this._doInAllSectors("_drawNodes",ctx); + + // restore original scaling and translation + ctx.restore(); + + if (this.constants.navigation.enabled == true) { + this._doInNavigationSector("_drawNodes",ctx,true); + } +}; + +/** + * Set the translation of the graph + * @param {Number} offsetX Horizontal offset + * @param {Number} offsetY Vertical offset + * @private + */ +Graph.prototype._setTranslation = function(offsetX, offsetY) { + if (this.translation === undefined) { + this.translation = { + x: 0, + y: 0 + }; + } + + if (offsetX !== undefined) { + this.translation.x = offsetX; + } + if (offsetY !== undefined) { + this.translation.y = offsetY; + } +}; + +/** + * Get the translation of the graph + * @return {Object} translation An object with parameters x and y, both a number + * @private + */ +Graph.prototype._getTranslation = function() { + return { + x: this.translation.x, + y: this.translation.y + }; +}; + +/** + * Scale the graph + * @param {Number} scale Scaling factor 1.0 is unscaled + * @private + */ +Graph.prototype._setScale = function(scale) { + this.scale = scale; +}; + +/** + * Get the current scale of the graph + * @return {Number} scale Scaling factor 1.0 is unscaled + * @private + */ +Graph.prototype._getScale = function() { + return this.scale; +}; + +/** + * Convert a horizontal point on the HTML canvas to the x-value of the model + * @param {number} x + * @returns {number} + * @private + */ +Graph.prototype._canvasToX = function(x) { + return (x - this.translation.x) / this.scale; +}; + +/** + * Convert an x-value in the model to a horizontal point on the HTML canvas + * @param {number} x + * @returns {number} + * @private + */ +Graph.prototype._xToCanvas = function(x) { + return x * this.scale + this.translation.x; +}; + +/** + * Convert a vertical point on the HTML canvas to the y-value of the model + * @param {number} y + * @returns {number} + * @private + */ +Graph.prototype._canvasToY = function(y) { + return (y - this.translation.y) / this.scale; +}; + +/** + * Convert an y-value in the model to a vertical point on the HTML canvas + * @param {number} y + * @returns {number} + * @private + */ +Graph.prototype._yToCanvas = function(y) { + return y * this.scale + this.translation.y ; +}; + +/** + * Redraw all nodes + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @param {Boolean} [alwaysShow] + * @private + */ +Graph.prototype._drawNodes = function(ctx,alwaysShow) { + if (alwaysShow === undefined) { + alwaysShow = false; + } + + // first draw the unselected nodes + var nodes = this.nodes; + var selected = []; + + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + nodes[id].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight); + if (nodes[id].isSelected()) { + selected.push(id); + } + else { + if (nodes[id].inArea() || alwaysShow) { + nodes[id].draw(ctx); + } + } + } + } + + // draw the selected nodes on top + for (var s = 0, sMax = selected.length; s < sMax; s++) { + if (nodes[selected[s]].inArea() || alwaysShow) { + nodes[selected[s]].draw(ctx); + } + } +}; + +/** + * Redraw all edges + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @private + */ +Graph.prototype._drawEdges = function(ctx) { + var edges = this.edges; + for (var id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + edge.setScale(this.scale); + if (edge.connected) { + edges[id].draw(ctx); + } + } + } +}; + +/** + * Find a stable position for all nodes + * @private + */ +Graph.prototype._doStabilize = function() { + //var start = new Date(); + + // find stable position + var count = 0; + var vmin = this.constants.minVelocity; + var stable = false; + while (!stable && count < this.constants.maxIterations) { + this._initializeForceCalculation(); + this._discreteStepNodes(); + stable = !this._isMoving(vmin); + count++; + } + this.zoomToFit(); + + // var end = new Date(); + + // console.log('Stabilized in ' + (end-start) + ' ms, ' + count + ' iterations' ); // TODO: cleanup +}; + + +/** + * Before calculating the forces, we check if we need to cluster to keep up performance and we check + * if there is more than one node. If it is just one node, we dont calculate anything. + * + * @private + */ +Graph.prototype._initializeForceCalculation = function() { + // stop calculation if there is only one node + if (this.nodeIndices.length == 1) { + this.nodes[this.nodeIndices[0]]._setForce(0,0); + } + else { + // if there are too many nodes on screen, we cluster without repositioning + if (this.nodeIndices.length > this.constants.clustering.clusterThreshold && this.constants.clustering.enabled == true) { + this.clusterToFit(this.constants.clustering.reduceToNodes, false); + } + + // we now start the force calculation + this._calculateForces(); + } +}; + + +/** + * Calculate the external forces acting on the nodes + * Forces are caused by: edges, repulsing forces between nodes, gravity + * @private + */ +Graph.prototype._calculateForces = function() { +// var screenCenterPos = {"x":(0.5*(this.canvasTopLeft.x + this.canvasBottomRight.x)), +// "y":(0.5*(this.canvasTopLeft.y + this.canvasBottomRight.y))} + // create a local edge to the nodes and edges, that is faster + var dx, dy, angle, distance, fx, fy, + repulsingForce, springForce, length, edgeLength, + node, node1, node2, edge, edgeId, i, j, nodeId, xCenter, yCenter; + var clusterSize; + var nodes = this.nodes; + var edges = this.edges; + + // Gravity is required to keep separated groups from floating off + // the forces are reset to zero in this loop by using _setForce instead + // of _addForce + var gravity = 0.08 * this.forceFactor; + for (i = 0; i < this.nodeIndices.length; i++) { + node = nodes[this.nodeIndices[i]]; + // gravity does not apply when we are in a pocket sector + if (this._sector() == "default") { + dx = -node.x;// + screenCenterPos.x; + dy = -node.y;// + screenCenterPos.y; + + angle = Math.atan2(dy, dx); + fx = Math.cos(angle) * gravity; + fy = Math.sin(angle) * gravity; + } + else { + fx = 0; + fy = 0; + } + node._setForce(fx, fy); + + node.updateDamping(this.nodeIndices.length); + } + + // repulsing forces between nodes + var minimumDistance = this.constants.nodes.distance, + steepness = 10; // higher value gives steeper slope of the force around the given minimumDistance + + + // we loop from i over all but the last entree in the array + // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j + for (i = 0; i < this.nodeIndices.length-1; i++) { + node1 = nodes[this.nodeIndices[i]]; + for (j = i+1; j < this.nodeIndices.length; j++) { + node2 = nodes[this.nodeIndices[j]]; + clusterSize = (node1.clusterSize + node2.clusterSize - 2); + dx = node2.x - node1.x; + dy = node2.y - node1.y; + distance = Math.sqrt(dx * dx + dy * dy); + + + // clusters have a larger region of influence + minimumDistance = (clusterSize == 0) ? this.constants.nodes.distance : (this.constants.nodes.distance * (1 + clusterSize * this.constants.clustering.distanceAmplification)); + if (distance < 2*minimumDistance) { // at 2.0 * the minimum distance, the force is 0.000045 + angle = Math.atan2(dy, dx); + + if (distance < 0.5*minimumDistance) { // at 0.5 * the minimum distance, the force is 0.993307 + repulsingForce = 1.0; + } + else { + // TODO: correct factor for repulsing force + //repulsingForce = 2 * Math.exp(-5 * (distance * distance) / (dmin * dmin) ); // TODO: customize the repulsing force + //repulsingForce = Math.exp(-1 * (distance * distance) / (dmin * dmin) ); // TODO: customize the repulsing force + repulsingForce = 1 / (1 + Math.exp((distance / minimumDistance - 1) * steepness)); // TODO: customize the repulsing force + } + // amplify the repulsion for clusters. + repulsingForce *= (clusterSize == 0) ? 1 : 1 + clusterSize * this.constants.clustering.forceAmplification; + repulsingForce *= this.forceFactor; + + + fx = Math.cos(angle) * repulsingForce; + fy = Math.sin(angle) * repulsingForce ; + + node1._addForce(-fx, -fy); + node2._addForce(fx, fy); + } + } + } + +/* + // repulsion of the edges on the nodes and + for (var nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + node = nodes[nodeId]; + for(var edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + + // get the center of the edge + xCenter = edge.from.x+(edge.to.x - edge.from.x)/2; + yCenter = edge.from.y+(edge.to.y - edge.from.y)/2; + + // calculate normally distributed force + dx = node.x - xCenter; + dy = node.y - yCenter; + distance = Math.sqrt(dx * dx + dy * dy); + if (distance < 2*minimumDistance) { // at 2.0 * the minimum distance, the force is 0.000045 + angle = Math.atan2(dy, dx); + + if (distance < 0.5*minimumDistance) { // at 0.5 * the minimum distance, the force is 0.993307 + repulsingForce = 1.0; + } + else { + // TODO: correct factor for repulsing force + //var repulsingforce = 2 * Math.exp(-5 * (distance * distance) / (dmin * dmin) ); // TODO: customize the repulsing force + //repulsingforce = Math.exp(-1 * (distance * distance) / (dmin * dmin) ), // TODO: customize the repulsing force + repulsingForce = 1 / (1 + Math.exp((distance / (minimumDistance / 2) - 1) * steepness)); // TODO: customize the repulsing force + } + fx = Math.cos(angle) * repulsingForce; + fy = Math.sin(angle) * repulsingForce; + node._addForce(fx, fy); + edge.from._addForce(-fx/2,-fy/2); + edge.to._addForce(-fx/2,-fy/2); + } + } + } + } + } +*/ + + // forces caused by the edges, modelled as springs + for (edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + if (edge.connected) { + // only calculate forces if nodes are in the same sector + if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { + clusterSize = (edge.to.clusterSize + edge.from.clusterSize - 2); + dx = (edge.to.x - edge.from.x); + dy = (edge.to.y - edge.from.y); + //edgeLength = (edge.from.width + edge.from.height + edge.to.width + edge.to.height)/2 || edge.length; // TODO: dmin + //edgeLength = (edge.from.width + edge.to.width)/2 || edge.length; // TODO: dmin + //edgeLength = 20 + ((edge.from.width + edge.to.width) || 0) / 2; + edgeLength = edge.length; + // this implies that the edges between big clusters are longer + edgeLength += clusterSize * this.constants.clustering.edgeGrowth; + length = Math.sqrt(dx * dx + dy * dy); + angle = Math.atan2(dy, dx); + + springForce = edge.stiffness * (edgeLength - length) * this.forceFactor; + + fx = Math.cos(angle) * springForce; + fy = Math.sin(angle) * springForce; + + edge.from._addForce(-fx, -fy); + edge.to._addForce(fx, fy); + } + } + } + } +/* + // TODO: re-implement repulsion of edges + + // repulsing forces between edges + var minimumDistance = this.constants.edges.distance, + steepness = 10; // higher value gives steeper slope of the force around the given minimumDistance + for (var l = 0; l < edges.length; l++) { + //Keep distance from other edge centers + for (var l2 = l + 1; l2 < this.edges.length; l2++) { + //var dmin = (nodes[n].width + nodes[n].height + nodes[n2].width + nodes[n2].height) / 1 || minimumDistance, // TODO: dmin + //var dmin = (nodes[n].width + nodes[n2].width)/2 || minimumDistance, // TODO: dmin + //dmin = 40 + ((nodes[n].width/2 + nodes[n2].width/2) || 0), + var lx = edges[l].from.x+(edges[l].to.x - edges[l].from.x)/2, + ly = edges[l].from.y+(edges[l].to.y - edges[l].from.y)/2, + l2x = edges[l2].from.x+(edges[l2].to.x - edges[l2].from.x)/2, + l2y = edges[l2].from.y+(edges[l2].to.y - edges[l2].from.y)/2, + + // calculate normally distributed force + dx = l2x - lx, + dy = l2y - ly, + distance = Math.sqrt(dx * dx + dy * dy), + angle = Math.atan2(dy, dx), + + + // TODO: correct factor for repulsing force + //var repulsingforce = 2 * Math.exp(-5 * (distance * distance) / (dmin * dmin) ); // TODO: customize the repulsing force + //repulsingforce = Math.exp(-1 * (distance * distance) / (dmin * dmin) ), // TODO: customize the repulsing force + repulsingforce = 1 / (1 + Math.exp((distance / minimumDistance - 1) * steepness)), // TODO: customize the repulsing force + fx = Math.cos(angle) * repulsingforce, + fy = Math.sin(angle) * repulsingforce; + + edges[l].from._addForce(-fx, -fy); + edges[l].to._addForce(-fx, -fy); + edges[l2].from._addForce(fx, fy); + edges[l2].to._addForce(fx, fy); + } + } +*/ +}; + + +/** + * Check if any of the nodes is still moving + * @param {number} vmin the minimum velocity considered as 'moving' + * @return {boolean} true if moving, false if non of the nodes is moving + * @private + */ +Graph.prototype._isMoving = function(vmin) { + var vminCorrected = vmin / this.scale; + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id) && nodes[id].isMoving(vminCorrected)) { + return true; + } + } + return false; +}; + + +/** + * /** + * Perform one discrete step for all nodes + * + * @param interval + * @private + */ +Graph.prototype._discreteStepNodes = function() { + var interval = 0.01; + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + nodes[id].discreteStep(interval); + } + } + + var vmin = this.constants.minVelocity; + this.moving = this._isMoving(vmin); +}; + + + +/** + * Start animating nodes and edges + * + * @poram {Boolean} runCalculationStep + */ +Graph.prototype.start = function() { + if (!this.freezeSimulation) { + + if (this.moving) { + this._doInAllActiveSectors("_initializeForceCalculation"); + this._doInAllActiveSectors("_discreteStepNodes"); + this._findCenter(this._getRange()) + } + + if (this.moving || this.xIncrement != 0 || this.yIncrement != 0 || this.zoomIncrement != 0) { + // start animation. only start calculationTimer if it is not already running + if (!this.timer) { + var graph = this; + this.timer = window.setTimeout(function () { + graph.timer = undefined; + + // keyboad movement + if (graph.xIncrement != 0 || graph.yIncrement != 0) { + var translation = graph._getTranslation(); + graph._setTranslation(translation.x+graph.xIncrement, translation.y+graph.yIncrement); + } + if (graph.zoomIncrement != 0) { + var center = { + x: graph.frame.canvas.clientWidth / 2, + y: graph.frame.canvas.clientHeight / 2 + }; + graph._zoom(graph.scale*(1 + graph.zoomIncrement), center); + } + + graph.start(); + graph._redraw(); + + //this.end = window.performance.now(); + //this.time = this.end - this.startTime; + //console.log('refresh time: ' + this.time); + //this.startTime = window.performance.now(); + + }, this.renderTimestep); + } + } + else { + this._redraw(); + } + } +}; + + + + +Graph.prototype.singleStep = function() { + if (this.moving) { + this._initializeForceCalculation(); + this._discreteStepNodes(); + + var vmin = this.constants.minVelocity; + this.moving = this._isMoving(vmin); + this._redraw(); + } +}; + + + +/** + * Freeze the animation + */ +Graph.prototype.toggleFreeze = function() { + if (this.freezeSimulation == false) { + this.freezeSimulation = true; + } + else { + this.freezeSimulation = false; + this.start(); + } +}; + +/** + * Mixin the cluster system and initialize the parameters required. + * + * @private + */ +Graph.prototype._loadClusterSystem = function() { + this.clusterSession = 0; + this.hubThreshold = 5; + + for (var mixinFunction in ClusterMixin) { + if (ClusterMixin.hasOwnProperty(mixinFunction)) { + Graph.prototype[mixinFunction] = ClusterMixin[mixinFunction]; + } + } +} + +/** + * Mixin the sector system and initialize the parameters required + * + * @private + */ +Graph.prototype._loadSectorSystem = function() { + this.sectors = {}; + this.activeSector = ["default"]; + this.sectors["active"] = {}; + this.sectors["active"]["default"] = {"nodes":{}, + "edges":{}, + "nodeIndices":[], + "formationScale": 1.0, + "drawingNode": undefined}; + this.sectors["frozen"] = {}; + this.sectors["navigation"] = {"nodes":{}, + "edges":{}, + "nodeIndices":[], + "formationScale": 1.0, + "drawingNode": undefined}; + + this.nodeIndices = this.sectors["active"]["default"]["nodeIndices"]; // the node indices list is used to speed up the computation of the repulsion fields + for (var mixinFunction in SectorMixin) { + if (SectorMixin.hasOwnProperty(mixinFunction)) { + Graph.prototype[mixinFunction] = SectorMixin[mixinFunction]; + } + } +}; + + +/** + * Mixin the selection system and initialize the parameters required + * + * @private + */ +Graph.prototype._loadSelectionSystem = function() { + this.selection = []; + this.selectionObj = {}; + + for (var mixinFunction in SelectionMixin) { + if (SelectionMixin.hasOwnProperty(mixinFunction)) { + Graph.prototype[mixinFunction] = SelectionMixin[mixinFunction]; + } + } +} + + +/** + * Mixin the navigation (User Interface) system and initialize the parameters required + * + * @private + */ +Graph.prototype._loadNavigationControls = function() { + for (var mixinFunction in NavigationMixin) { + if (NavigationMixin.hasOwnProperty(mixinFunction)) { + Graph.prototype[mixinFunction] = NavigationMixin[mixinFunction]; + } + } + + if (this.constants.navigation.enabled == true) { + this._loadNavigationElements(); + } +} + +/** + * this function exists to avoid errors when not loading the navigation system + */ +Graph.prototype._relocateNavigation = function() { + // empty, is overloaded by navigation system +} + +/** + * * this function exists to avoid errors when not loading the navigation system + */ +Graph.prototype._unHighlightAll = function() { + // empty, is overloaded by the navigation system +} + + + + + + + + + + + + + + + + + + + + + + + + + +/** + * vis.js module exports + */ +var vis = { + util: util, + events: events, + + Controller: Controller, + DataSet: DataSet, + DataView: DataView, + Range: Range, + Stack: Stack, + TimeStep: TimeStep, + EventBus: EventBus, + + components: { + items: { + Item: Item, + ItemBox: ItemBox, + ItemPoint: ItemPoint, + ItemRange: ItemRange + }, + + Component: Component, + Panel: Panel, + RootPanel: RootPanel, + ItemSet: ItemSet, + TimeAxis: TimeAxis + }, + + graph: { + Node: Node, + Edge: Edge, + Popup: Popup, + Groups: Groups, + Images: Images + }, + + Timeline: Timeline, + Graph: Graph +}; + +/** + * CommonJS module exports + */ +if (typeof exports !== 'undefined') { + exports = vis; +} +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = vis; +} + +/** + * AMD module exports + */ +if (typeof(define) === 'function') { + define(function () { + return vis; + }); +} + +/** + * Window exports + */ +if (typeof window !== 'undefined') { + // attach the module to the window, load as a regular javascript file + window['vis'] = vis; +} + + +},{"hammerjs":2,"moment":3,"mousetrap":4}],2:[function(require,module,exports){ +/*! Hammer.JS - v1.0.5 - 2013-04-07 + * http://eightmedia.github.com/hammer.js + * + * Copyright (c) 2013 Jorik Tangelder ; + * Licensed under the MIT license */ + +(function(window, undefined) { + 'use strict'; + +/** + * Hammer + * use this to create instances + * @param {HTMLElement} element + * @param {Object} options + * @returns {Hammer.Instance} + * @constructor + */ +var Hammer = function(element, options) { + return new Hammer.Instance(element, options || {}); +}; + +// default settings +Hammer.defaults = { + // add styles and attributes to the element to prevent the browser from doing + // its native behavior. this doesnt prevent the scrolling, but cancels + // the contextmenu, tap highlighting etc + // set to false to disable this + stop_browser_behavior: { + // this also triggers onselectstart=false for IE + userSelect: 'none', + // this makes the element blocking in IE10 >, you could experiment with the value + // see for more options this issue; https://github.com/EightMedia/hammer.js/issues/241 + touchAction: 'none', + touchCallout: 'none', + contentZooming: 'none', + userDrag: 'none', + tapHighlightColor: 'rgba(0,0,0,0)' + } + + // more settings are defined per gesture at gestures.js +}; + +// detect touchevents +Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled; +Hammer.HAS_TOUCHEVENTS = ('ontouchstart' in window); + +// dont use mouseevents on mobile devices +Hammer.MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i; +Hammer.NO_MOUSEEVENTS = Hammer.HAS_TOUCHEVENTS && navigator.userAgent.match(Hammer.MOBILE_REGEX); + +// eventtypes per touchevent (start, move, end) +// are filled by Hammer.event.determineEventTypes on setup +Hammer.EVENT_TYPES = {}; + +// direction defines +Hammer.DIRECTION_DOWN = 'down'; +Hammer.DIRECTION_LEFT = 'left'; +Hammer.DIRECTION_UP = 'up'; +Hammer.DIRECTION_RIGHT = 'right'; + +// pointer type +Hammer.POINTER_MOUSE = 'mouse'; +Hammer.POINTER_TOUCH = 'touch'; +Hammer.POINTER_PEN = 'pen'; + +// touch event defines +Hammer.EVENT_START = 'start'; +Hammer.EVENT_MOVE = 'move'; +Hammer.EVENT_END = 'end'; + +// hammer document where the base events are added at +Hammer.DOCUMENT = document; + +// plugins namespace +Hammer.plugins = {}; + +// if the window events are set... +Hammer.READY = false; + +/** + * setup events to detect gestures on the document + */ +function setup() { + if(Hammer.READY) { + return; + } + + // find what eventtypes we add listeners to + Hammer.event.determineEventTypes(); + + // Register all gestures inside Hammer.gestures + for(var name in Hammer.gestures) { + if(Hammer.gestures.hasOwnProperty(name)) { + Hammer.detection.register(Hammer.gestures[name]); + } + } + + // Add touch events on the document + Hammer.event.onTouch(Hammer.DOCUMENT, Hammer.EVENT_MOVE, Hammer.detection.detect); + Hammer.event.onTouch(Hammer.DOCUMENT, Hammer.EVENT_END, Hammer.detection.detect); + + // Hammer is ready...! + Hammer.READY = true; +} + +/** + * create new hammer instance + * all methods should return the instance itself, so it is chainable. + * @param {HTMLElement} element + * @param {Object} [options={}] + * @returns {Hammer.Instance} + * @constructor + */ +Hammer.Instance = function(element, options) { + var self = this; + + // setup HammerJS window events and register all gestures + // this also sets up the default options + setup(); + + this.element = element; + + // start/stop detection option + this.enabled = true; + + // merge options + this.options = Hammer.utils.extend( + Hammer.utils.extend({}, Hammer.defaults), + options || {}); + + // add some css to the element to prevent the browser from doing its native behavoir + if(this.options.stop_browser_behavior) { + Hammer.utils.stopDefaultBrowserBehavior(this.element, this.options.stop_browser_behavior); + } + + // start detection on touchstart + Hammer.event.onTouch(element, Hammer.EVENT_START, function(ev) { + if(self.enabled) { + Hammer.detection.startDetect(self, ev); + } + }); + + // return instance + return this; +}; + + +Hammer.Instance.prototype = { + /** + * bind events to the instance + * @param {String} gesture + * @param {Function} handler + * @returns {Hammer.Instance} + */ + on: function onEvent(gesture, handler){ + var gestures = gesture.split(' '); + for(var t=0; t 0 && eventType == Hammer.EVENT_END) { + eventType = Hammer.EVENT_MOVE; + } + // no touches, force the end event + else if(!count_touches) { + eventType = Hammer.EVENT_END; + } + + // because touchend has no touches, and we often want to use these in our gestures, + // we send the last move event as our eventData in touchend + if(!count_touches && last_move_event !== null) { + ev = last_move_event; + } + // store the last move event + else { + last_move_event = ev; + } + + // trigger the handler + handler.call(Hammer.detection, self.collectEventData(element, eventType, ev)); + + // remove pointerevent from list + if(Hammer.HAS_POINTEREVENTS && eventType == Hammer.EVENT_END) { + count_touches = Hammer.PointerEvent.updatePointer(eventType, ev); + } + } + + //debug(sourceEventType +" "+ eventType); + + // on the end we reset everything + if(!count_touches) { + last_move_event = null; + enable_detect = false; + touch_triggered = false; + Hammer.PointerEvent.reset(); + } + }); + }, + + + /** + * we have different events for each device/browser + * determine what we need and set them in the Hammer.EVENT_TYPES constant + */ + determineEventTypes: function determineEventTypes() { + // determine the eventtype we want to set + var types; + + // pointerEvents magic + if(Hammer.HAS_POINTEREVENTS) { + types = Hammer.PointerEvent.getEvents(); + } + // on Android, iOS, blackberry, windows mobile we dont want any mouseevents + else if(Hammer.NO_MOUSEEVENTS) { + types = [ + 'touchstart', + 'touchmove', + 'touchend touchcancel']; + } + // for non pointer events browsers and mixed browsers, + // like chrome on windows8 touch laptop + else { + types = [ + 'touchstart mousedown', + 'touchmove mousemove', + 'touchend touchcancel mouseup']; + } + + Hammer.EVENT_TYPES[Hammer.EVENT_START] = types[0]; + Hammer.EVENT_TYPES[Hammer.EVENT_MOVE] = types[1]; + Hammer.EVENT_TYPES[Hammer.EVENT_END] = types[2]; + }, + + + /** + * create touchlist depending on the event + * @param {Object} ev + * @param {String} eventType used by the fakemultitouch plugin + */ + getTouchList: function getTouchList(ev/*, eventType*/) { + // get the fake pointerEvent touchlist + if(Hammer.HAS_POINTEREVENTS) { + return Hammer.PointerEvent.getTouchList(); + } + // get the touchlist + else if(ev.touches) { + return ev.touches; + } + // make fake touchlist from mouse position + else { + return [{ + identifier: 1, + pageX: ev.pageX, + pageY: ev.pageY, + target: ev.target + }]; + } + }, + + + /** + * collect event data for Hammer js + * @param {HTMLElement} element + * @param {String} eventType like Hammer.EVENT_MOVE + * @param {Object} eventData + */ + collectEventData: function collectEventData(element, eventType, ev) { + var touches = this.getTouchList(ev, eventType); + + // find out pointerType + var pointerType = Hammer.POINTER_TOUCH; + if(ev.type.match(/mouse/) || Hammer.PointerEvent.matchType(Hammer.POINTER_MOUSE, ev)) { + pointerType = Hammer.POINTER_MOUSE; + } + + return { + center : Hammer.utils.getCenter(touches), + timeStamp : new Date().getTime(), + target : ev.target, + touches : touches, + eventType : eventType, + pointerType : pointerType, + srcEvent : ev, + + /** + * prevent the browser default actions + * mostly used to disable scrolling of the browser + */ + preventDefault: function() { + if(this.srcEvent.preventManipulation) { + this.srcEvent.preventManipulation(); + } + + if(this.srcEvent.preventDefault) { + this.srcEvent.preventDefault(); + } + }, + + /** + * stop bubbling the event up to its parents + */ + stopPropagation: function() { + this.srcEvent.stopPropagation(); + }, + + /** + * immediately stop gesture detection + * might be useful after a swipe was detected + * @return {*} + */ + stopDetect: function() { + return Hammer.detection.stopDetect(); + } + }; + } +}; + +Hammer.PointerEvent = { + /** + * holds all pointers + * @type {Object} + */ + pointers: {}, + + /** + * get a list of pointers + * @returns {Array} touchlist + */ + getTouchList: function() { + var self = this; + var touchlist = []; + + // we can use forEach since pointerEvents only is in IE10 + Object.keys(self.pointers).sort().forEach(function(id) { + touchlist.push(self.pointers[id]); + }); + return touchlist; + }, + + /** + * update the position of a pointer + * @param {String} type Hammer.EVENT_END + * @param {Object} pointerEvent + */ + updatePointer: function(type, pointerEvent) { + if(type == Hammer.EVENT_END) { + this.pointers = {}; + } + else { + pointerEvent.identifier = pointerEvent.pointerId; + this.pointers[pointerEvent.pointerId] = pointerEvent; + } + + return Object.keys(this.pointers).length; + }, + + /** + * check if ev matches pointertype + * @param {String} pointerType Hammer.POINTER_MOUSE + * @param {PointerEvent} ev + */ + matchType: function(pointerType, ev) { + if(!ev.pointerType) { + return false; + } + + var types = {}; + types[Hammer.POINTER_MOUSE] = (ev.pointerType == ev.MSPOINTER_TYPE_MOUSE || ev.pointerType == Hammer.POINTER_MOUSE); + types[Hammer.POINTER_TOUCH] = (ev.pointerType == ev.MSPOINTER_TYPE_TOUCH || ev.pointerType == Hammer.POINTER_TOUCH); + types[Hammer.POINTER_PEN] = (ev.pointerType == ev.MSPOINTER_TYPE_PEN || ev.pointerType == Hammer.POINTER_PEN); + return types[pointerType]; + }, + + + /** + * get events + */ + getEvents: function() { + return [ + 'pointerdown MSPointerDown', + 'pointermove MSPointerMove', + 'pointerup pointercancel MSPointerUp MSPointerCancel' + ]; + }, + + /** + * reset the list + */ + reset: function() { + this.pointers = {}; + } +}; + + +Hammer.utils = { + /** + * extend method, + * also used for cloning when dest is an empty object + * @param {Object} dest + * @param {Object} src + * @parm {Boolean} merge do a merge + * @returns {Object} dest + */ + extend: function extend(dest, src, merge) { + for (var key in src) { + if(dest[key] !== undefined && merge) { + continue; + } + dest[key] = src[key]; + } + return dest; + }, /** @@ -13397,7 +16690,7 @@ else { })(this); },{}],3:[function(require,module,exports){ //! moment.js -//! version : 2.5.0 +//! version : 2.5.1 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com @@ -13409,7 +16702,7 @@ else { ************************************/ var moment, - VERSION = "2.5.0", + VERSION = "2.5.1", global = this, round = Math.round, i, @@ -13425,6 +16718,19 @@ else { // internal storage for language config files languages = {}, + // moment internal properties + momentProperties = { + _isAMomentObject: null, + _i : null, + _f : null, + _l : null, + _strict : null, + _isUTC : null, + _offset : null, // optional. Combine with _isUTC + _pf : null, + _lang : null // optional + }, + // check for nodeJS hasModule = (typeof module !== 'undefined' && module.exports && typeof require !== 'undefined'), @@ -13456,19 +16762,21 @@ else { parseTokenTwoDigits = /\d\d/, // 00 - 99 parseTokenThreeDigits = /\d{3}/, // 000 - 999 parseTokenFourDigits = /\d{4}/, // 0000 - 9999 - parseTokenSixDigits = /[+\-]?\d{6}/, // -999,999 - 999,999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf // iso 8601 regex // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - isoRegex = /^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', isoDates = [ - 'YYYY-MM-DD', - 'GGGG-[W]WW', - 'GGGG-[W]WW-E', - 'YYYY-DDD' + ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/], + ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/], + ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/], + ['GGGG-[W]WW', /\d{4}-W\d{2}/], + ['YYYY-DDD', /\d{4}-\d{3}/] ], // iso time formats and regexes @@ -13578,7 +16886,7 @@ else { return leftZeroFill(this.weekYear() % 100, 2); }, gggg : function () { - return this.weekYear(); + return leftZeroFill(this.weekYear(), 4); }, ggggg : function () { return leftZeroFill(this.weekYear(), 5); @@ -13587,7 +16895,7 @@ else { return leftZeroFill(this.isoWeekYear() % 100, 2); }, GGGG : function () { - return this.isoWeekYear(); + return leftZeroFill(this.isoWeekYear(), 4); }, GGGGG : function () { return leftZeroFill(this.isoWeekYear(), 5); @@ -13662,6 +16970,23 @@ else { lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin']; + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; + } + function padToken(func, count) { return function (a) { return leftZeroFill(func.call(this, a), count); @@ -13753,6 +17078,17 @@ else { return a; } + function cloneMoment(m) { + var result = {}, i; + for (i in m) { + if (m.hasOwnProperty(i) && momentProperties.hasOwnProperty(i)) { + result[i] = m[i]; + } + } + + return result; + } + function absRound(number) { if (number < 0) { return Math.ceil(number); @@ -13764,7 +17100,7 @@ else { // left zero fill a number // see http://jsperf.com/left-zero-filling for performance comparison function leftZeroFill(number, targetLength, forceSign) { - var output = Math.abs(number) + '', + var output = '' + Math.abs(number), sign = number >= 0; while (output.length < targetLength) { @@ -13944,21 +17280,6 @@ else { } } - function initializeParsingFlags(config) { - config._pf = { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso: false - }; - } - function isValid(m) { if (m._isValid == null) { m._isValid = !isNaN(m._d.getTime()) && @@ -14327,6 +17648,10 @@ else { case 'GGGG': case 'gggg': return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; case 'YYYYYY': case 'YYYYY': case 'GGGGG': @@ -14339,8 +17664,10 @@ else { if (strict) { return parseTokenTwoDigits; } /* falls through */ case 'SSS': + if (strict) { return parseTokenThreeDigits; } + /* falls through */ case 'DDD': - return strict ? parseTokenThreeDigits : parseTokenOneToThreeDigits; + return parseTokenOneToThreeDigits; case 'MMM': case 'MMMM': case 'dd': @@ -14382,7 +17709,7 @@ else { case 'W': case 'e': case 'E': - return strict ? parseTokenOneDigit : parseTokenOneOrTwoDigits; + return parseTokenOneOrTwoDigits; default : a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i")); return a; @@ -14510,1255 +17837,2059 @@ else { } } - // convert an array to a date. - // the array should mirror the parameters below - // note: all values past the year are optional and will default to the lowest possible value. - // [year, month, day , hour, minute, second, millisecond] - function dateFromConfig(config) { - var i, date, input = [], currentDate, - yearToUse, fixYear, w, temp, lang, weekday, week; + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, + yearToUse, fixYear, w, temp, lang, weekday, week; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + fixYear = function (val) { + var int_val = parseInt(val, 10); + return val ? + (val.length < 3 ? (int_val > 68 ? 1900 + int_val : 2000 + int_val) : int_val) : + (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]); + }; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + temp = dayOfYearFromWeeks(fixYear(w.GG), w.W || 1, w.E, 4, 1); + } + else { + lang = getLangDefinition(config._l); + weekday = w.d != null ? parseWeekday(w.d, lang) : + (w.e != null ? parseInt(w.e, 10) + lang._week.dow : 0); + + week = parseInt(w.w, 10) || 1; + + //if we're parsing 'd', then the low day numbers may be next week + if (w.d != null && weekday < lang._week.dow) { + week++; + } + + temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow); + } + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = config._a[YEAR] == null ? currentDate[YEAR] : config._a[YEAR]; + + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } + + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // add the offsets to the time to be parsed so that we can have a clean array for checking isValid + input[HOUR] += toInt((config._tzm || 0) / 60); + input[MINUTE] += toInt((config._tzm || 0) % 60); + + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + } + + function dateFromObject(config) { + var normalizedInput; + + if (config._d) { + return; + } + + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; + + dateFromConfig(config); + } + + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } + + // date from string and format string + function makeDateFromStringAndFormat(config) { + + config._a = []; + config._pf.empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var lang = getLangDefinition(config._l), + string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, lang).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } + + // handle am pm + if (config._isPm && config._a[HOUR] < 12) { + config._a[HOUR] += 12; + } + // if is 12 am, change hours to 0 + if (config._isPm === false && config._a[HOUR] === 12) { + config._a[HOUR] = 0; + } + + dateFromConfig(config); + checkOverflow(config); + } + + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } - if (config._d) { + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); return; } - currentDate = currentDateArray(config); + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = extend({}, config); + tempConfig._pf = defaultParsingFlags(); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - fixYear = function (val) { - var int_val = parseInt(val, 10); - return val ? - (val.length < 3 ? (int_val > 68 ? 1900 + int_val : 2000 + int_val) : int_val) : - (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]); - }; + if (!isValid(tempConfig)) { + continue; + } - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - temp = dayOfYearFromWeeks(fixYear(w.GG), w.W || 1, w.E, 4, 1); + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; + + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; + + tempConfig._pf.score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; } - else { - lang = getLangDefinition(config._l); - weekday = w.d != null ? parseWeekday(w.d, lang) : - (w.e != null ? parseInt(w.e, 10) + lang._week.dow : 0); + } - week = parseInt(w.w, 10) || 1; + extend(config, bestMoment || tempConfig); + } - //if we're parsing 'd', then the low day numbers may be next week - if (w.d != null && weekday < lang._week.dow) { - week++; - } + // date from iso format + function makeDateFromString(config) { + var i, l, + string = config._i, + match = isoRegex.exec(string); - temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow); + if (match) { + config._pf.iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be "T" or undefined + config._f = isoDates[i][0] + (match[6] || " "); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(parseTokenTimezone)) { + config._f += "Z"; } + makeDateFromStringAndFormat(config); + } + else { + config._d = new Date(string); + } + } - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; + function makeDateFromInput(config) { + var input = config._i, + matched = aspNetJsonRegex.exec(input); + + if (input === undefined) { + config._d = new Date(); + } else if (matched) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = input.slice(0); + dateFromConfig(config); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else { + config._d = new Date(input); } + } - //if the day of the year is set, figure out what it is - if (config._dayOfYear) { - yearToUse = config._a[YEAR] == null ? currentDate[YEAR] : config._a[YEAR]; + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); - if (config._dayOfYear > daysInYear(yearToUse)) { - config._pf._overflowDayOfYear = true; - } + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } - date = makeUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); } + return date; + } - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; + function parseWeekday(input, language) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = language.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } } + return input; + } - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + /************************************ + Relative Time + ************************************/ + + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) { + return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime(milliseconds, withoutSuffix, lang) { + var seconds = round(Math.abs(milliseconds) / 1000), + minutes = round(seconds / 60), + hours = round(minutes / 60), + days = round(hours / 24), + years = round(days / 365), + args = seconds < 45 && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < 45 && ['mm', minutes] || + hours === 1 && ['h'] || + hours < 22 && ['hh', hours] || + days === 1 && ['d'] || + days <= 25 && ['dd', days] || + days <= 45 && ['M'] || + days < 345 && ['MM', round(days / 30)] || + years === 1 && ['y'] || ['yy', years]; + args[2] = withoutSuffix; + args[3] = milliseconds > 0; + args[4] = lang; + return substituteTimeAgo.apply({}, args); + } + + + /************************************ + Week of Year + ************************************/ + + + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; + + + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; } - // add the offsets to the time to be parsed so that we can have a clean array for checking isValid - input[HOUR] += toInt((config._tzm || 0) / 60); - input[MINUTE] += toInt((config._tzm || 0) % 60); + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } - config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + adjustedMoment = moment(mom).add('d', daysToDayOfWeek); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; } - function dateFromObject(config) { - var normalizedInput; + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } + + /************************************ + Top Level Functions + ************************************/ + + function makeMoment(config) { + var input = config._i, + format = config._f; - if (config._d) { - return; + if (input === null) { + return moment.invalid({nullInput: true}); } - normalizedInput = normalizeObjectUnits(config._i); - config._a = [ - normalizedInput.year, - normalizedInput.month, - normalizedInput.day, - normalizedInput.hour, - normalizedInput.minute, - normalizedInput.second, - normalizedInput.millisecond - ]; + if (typeof input === 'string') { + config._i = input = getLangDefinition().preparse(input); + } - dateFromConfig(config); - } + if (moment.isMoment(input)) { + config = cloneMoment(input); - function currentDateArray(config) { - var now = new Date(); - if (config._useUTC) { - return [ - now.getUTCFullYear(), - now.getUTCMonth(), - now.getUTCDate() - ]; + config._d = new Date(+input._d); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } } else { - return [now.getFullYear(), now.getMonth(), now.getDate()]; + makeDateFromInput(config); } + + return new Moment(config); } - // date from string and format string - function makeDateFromStringAndFormat(config) { + moment = function (input, format, lang, strict) { + var c; - config._a = []; - config._pf.empty = true; + if (typeof(lang) === "boolean") { + strict = lang; + lang = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = lang; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); + + return makeMoment(c); + }; - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var lang = getLangDefinition(config._l), - string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; + // creating with utc + moment.utc = function (input, format, lang, strict) { + var c; - tokens = expandFormat(config._f, lang).match(formattingTokens) || []; + if (typeof(lang) === "boolean") { + strict = lang; + lang = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = lang; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); + + return makeMoment(c).utc(); + }; - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - config._pf.unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - config._pf.empty = false; - } - else { - config._pf.unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - config._pf.unusedTokens.push(token); + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; + + // duration + moment.duration = function (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso; + + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === "-") ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === "-") ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; } - // add remaining unparsed input length to the string - config._pf.charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - config._pf.unusedInput.push(string); + ret = new Duration(duration); + + if (moment.isDuration(input) && input.hasOwnProperty('_lang')) { + ret._lang = input._lang; } - // handle am pm - if (config._isPm && config._a[HOUR] < 12) { - config._a[HOUR] += 12; + return ret; + }; + + // version number + moment.version = VERSION; + + // default format + moment.defaultFormat = isoFormat; + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; + + // This function will load languages and then set the global language. If + // no arguments are passed in, it will simply return the current global + // language key. + moment.lang = function (key, values) { + var r; + if (!key) { + return moment.fn._lang._abbr; } - // if is 12 am, change hours to 0 - if (config._isPm === false && config._a[HOUR] === 12) { - config._a[HOUR] = 0; + if (values) { + loadLang(normalizeLanguage(key), values); + } else if (values === null) { + unloadLang(key); + key = 'en'; + } else if (!languages[key]) { + getLangDefinition(key); } + r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key); + return r._abbr; + }; - dateFromConfig(config); - checkOverflow(config); - } + // returns language data + moment.langData = function (key) { + if (key && key._lang && key._lang._abbr) { + key = key._lang._abbr; + } + return getLangDefinition(key); + }; - function unescapeFormat(s) { - return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - }); - } + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment || + (obj != null && obj.hasOwnProperty('_isAMomentObject')); + }; - // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function regexpEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - } + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; - // date from string and array of format strings - function makeDateFromStringAndArray(config) { - var tempConfig, - bestMoment, + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } - scoreToBeat, - i, - currentScore; + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; - if (config._f.length === 0) { - config._pf.invalidFormat = true; - config._d = new Date(NaN); - return; + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; } - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = extend({}, config); - initializeParsingFlags(tempConfig); - tempConfig._f = config._f[i]; - makeDateFromStringAndFormat(tempConfig); + return m; + }; + + moment.parseZone = function (input) { + return moment(input).parseZone(); + }; + + /************************************ + Moment Prototype + ************************************/ + + + extend(moment.fn = Moment.prototype, { + + clone : function () { + return moment(this); + }, - if (!isValid(tempConfig)) { - continue; - } + valueOf : function () { + return +this._d + ((this._offset || 0) * 60000); + }, - // if there is any input that was not parsed add a penalty for that format - currentScore += tempConfig._pf.charsLeftOver; + unix : function () { + return Math.floor(+this / 1000); + }, - //or tokens - currentScore += tempConfig._pf.unusedTokens.length * 10; + toString : function () { + return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ"); + }, - tempConfig._pf.score = currentScore; + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; + toISOString : function () { + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); } - } + }, - extend(config, bestMoment || tempConfig); - } + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, - // date from iso format - function makeDateFromString(config) { - var i, - string = config._i, - match = isoRegex.exec(string); + isValid : function () { + return isValid(this); + }, - if (match) { - config._pf.iso = true; - for (i = 4; i > 0; i--) { - if (match[i]) { - // match[5] should be "T" or undefined - config._f = isoDates[i - 1] + (match[6] || " "); - break; - } - } - for (i = 0; i < 4; i++) { - if (isoTimes[i][1].exec(string)) { - config._f += isoTimes[i][0]; - break; - } - } - if (string.match(parseTokenTimezone)) { - config._f += "Z"; - } - makeDateFromStringAndFormat(config); - } - else { - config._d = new Date(string); - } - } + isDSTShifted : function () { - function makeDateFromInput(config) { - var input = config._i, - matched = aspNetJsonRegex.exec(input); + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } - if (input === undefined) { - config._d = new Date(); - } else if (matched) { - config._d = new Date(+matched[1]); - } else if (typeof input === 'string') { - makeDateFromString(config); - } else if (isArray(input)) { - config._a = input.slice(0); - dateFromConfig(config); - } else if (isDate(input)) { - config._d = new Date(+input); - } else if (typeof(input) === 'object') { - dateFromObject(config); - } else { - config._d = new Date(input); - } - } + return false; + }, - function makeDate(y, m, d, h, M, s, ms) { - //can't just apply() to create a date: - //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply - var date = new Date(y, m, d, h, M, s, ms); + parsingFlags : function () { + return extend({}, this._pf); + }, - //the date constructor doesn't accept years < 1970 - if (y < 1970) { - date.setFullYear(y); - } - return date; - } + invalidAt: function () { + return this._pf.overflow; + }, - function makeUTCDate(y) { - var date = new Date(Date.UTC.apply(null, arguments)); - if (y < 1970) { - date.setUTCFullYear(y); - } - return date; - } + utc : function () { + return this.zone(0); + }, - function parseWeekday(input, language) { - if (typeof input === 'string') { - if (!isNaN(input)) { - input = parseInt(input, 10); - } - else { - input = language.weekdaysParse(input); - if (typeof input !== 'number') { - return null; - } - } - } - return input; - } + local : function () { + this.zone(0); + this._isUTC = false; + return this; + }, - /************************************ - Relative Time - ************************************/ + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.lang().postformat(output); + }, + add : function (input, val) { + var dur; + // switch args to support add('s', 1) and add(1, 's') + if (typeof input === 'string') { + dur = moment.duration(+val, input); + } else { + dur = moment.duration(input, val); + } + addOrSubtractDurationFromMoment(this, dur, 1); + return this; + }, - // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) { - return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture); - } + subtract : function (input, val) { + var dur; + // switch args to support subtract('s', 1) and subtract(1, 's') + if (typeof input === 'string') { + dur = moment.duration(+val, input); + } else { + dur = moment.duration(input, val); + } + addOrSubtractDurationFromMoment(this, dur, -1); + return this; + }, - function relativeTime(milliseconds, withoutSuffix, lang) { - var seconds = round(Math.abs(milliseconds) / 1000), - minutes = round(seconds / 60), - hours = round(minutes / 60), - days = round(hours / 24), - years = round(days / 365), - args = seconds < 45 && ['s', seconds] || - minutes === 1 && ['m'] || - minutes < 45 && ['mm', minutes] || - hours === 1 && ['h'] || - hours < 22 && ['hh', hours] || - days === 1 && ['d'] || - days <= 25 && ['dd', days] || - days <= 45 && ['M'] || - days < 345 && ['MM', round(days / 30)] || - years === 1 && ['y'] || ['yy', years]; - args[2] = withoutSuffix; - args[3] = milliseconds > 0; - args[4] = lang; - return substituteTimeAgo.apply({}, args); - } + diff : function (input, units, asFloat) { + var that = makeAs(input, this), + zoneDiff = (this.zone() - that.zone()) * 6e4, + diff, output; + units = normalizeUnits(units); - /************************************ - Week of Year - ************************************/ + if (units === 'year' || units === 'month') { + // average number of days in the months in the given dates + diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2 + // difference in months + output = ((this.year() - that.year()) * 12) + (this.month() - that.month()); + // adjust by taking difference in days, average number of days + // and dst in the given months. + output += ((this - moment(this).startOf('month')) - + (that - moment(that).startOf('month'))) / diff; + // same as above but with zones, to negate all dst + output -= ((this.zone() - moment(this).startOf('month').zone()) - + (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff; + if (units === 'year') { + output = output / 12; + } + } else { + diff = (this - that); + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, + from : function (time, withoutSuffix) { + return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix); + }, - // firstDayOfWeek 0 = sun, 6 = sat - // the day of the week that starts the week - // (usually sunday or monday) - // firstDayOfWeekOfYear 0 = sun, 6 = sat - // the first week is the week that contains the first - // of this day of the week - // (eg. ISO weeks use thursday (4)) - function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { - var end = firstDayOfWeekOfYear - firstDayOfWeek, - daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), - adjustedMoment; + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, + calendar : function () { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're zone'd or not. + var sod = makeAs(moment(), this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.lang().calendar(format, this)); + }, - if (daysToDayOfWeek > end) { - daysToDayOfWeek -= 7; - } + isLeapYear : function () { + return isLeapYear(this.year()); + }, - if (daysToDayOfWeek < end - 7) { - daysToDayOfWeek += 7; - } + isDST : function () { + return (this.zone() < this.clone().month(0).zone() || + this.zone() < this.clone().month(5).zone()); + }, - adjustedMoment = moment(mom).add('d', daysToDayOfWeek); - return { - week: Math.ceil(adjustedMoment.dayOfYear() / 7), - year: adjustedMoment.year() - }; - } + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.lang()); + return this.add({ d : input - day }); + } else { + return day; + } + }, - //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { - // The only solid way to create an iso date from year is to use - // a string format (Date.UTC handles only years > 1900). Don't ask why - // it doesn't need Z at the end. - var d = new Date(leftZeroFill(year, 6, true) + '-01-01').getUTCDay(), - daysToAdd, dayOfYear; + month : function (input) { + var utc = this._isUTC ? 'UTC' : '', + dayOfMonth; - weekday = weekday != null ? weekday : firstDayOfWeek; - daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0); - dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + if (input != null) { + if (typeof input === 'string') { + input = this.lang().monthsParse(input); + if (typeof input !== 'number') { + return this; + } + } - return { - year: dayOfYear > 0 ? year : year - 1, - dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear - }; - } + dayOfMonth = this.date(); + this.date(1); + this._d['set' + utc + 'Month'](input); + this.date(Math.min(dayOfMonth, this.daysInMonth())); - /************************************ - Top Level Functions - ************************************/ + moment.updateOffset(this); + return this; + } else { + return this._d['get' + utc + 'Month'](); + } + }, - function makeMoment(config) { - var input = config._i, - format = config._f; + startOf: function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } - if (typeof config._pf === 'undefined') { - initializeParsingFlags(config); - } + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } - if (input === null) { - return moment.invalid({nullInput: true}); - } + return this; + }, - if (typeof input === 'string') { - config._i = input = getLangDefinition().preparse(input); - } + endOf: function (units) { + units = normalizeUnits(units); + return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1); + }, - if (moment.isMoment(input)) { - config = extend({}, input); + isAfter: function (input, units) { + units = typeof units !== 'undefined' ? units : 'millisecond'; + return +this.clone().startOf(units) > +moment(input).startOf(units); + }, - config._d = new Date(+input._d); - } else if (format) { - if (isArray(format)) { - makeDateFromStringAndArray(config); - } else { - makeDateFromStringAndFormat(config); - } - } else { - makeDateFromInput(config); - } + isBefore: function (input, units) { + units = typeof units !== 'undefined' ? units : 'millisecond'; + return +this.clone().startOf(units) < +moment(input).startOf(units); + }, - return new Moment(config); - } + isSame: function (input, units) { + units = units || 'ms'; + return +this.clone().startOf(units) === +makeAs(input, this).startOf(units); + }, - moment = function (input, format, lang, strict) { - if (typeof(lang) === "boolean") { - strict = lang; - lang = undefined; - } - return makeMoment({ - _i : input, - _f : format, - _l : lang, - _strict : strict, - _isUTC : false - }); - }; + min: function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + }, - // creating with utc - moment.utc = function (input, format, lang, strict) { - var m; + max: function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + }, - if (typeof(lang) === "boolean") { - strict = lang; - lang = undefined; - } - m = makeMoment({ - _useUTC : true, - _isUTC : true, - _l : lang, - _i : input, - _f : format, - _strict : strict - }).utc(); + zone : function (input) { + var offset = this._offset || 0; + if (input != null) { + if (typeof input === "string") { + input = timezoneMinutesFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + this._offset = input; + this._isUTC = true; + if (offset !== input) { + addOrSubtractDurationFromMoment(this, moment.duration(offset - input, 'm'), 1, true); + } + } else { + return this._isUTC ? offset : this._d.getTimezoneOffset(); + } + return this; + }, - return m; - }; + zoneAbbr : function () { + return this._isUTC ? "UTC" : ""; + }, - // creating with unix timestamp (in seconds) - moment.unix = function (input) { - return moment(input * 1000); - }; + zoneName : function () { + return this._isUTC ? "Coordinated Universal Time" : ""; + }, - // duration - moment.duration = function (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - parseIso; + parseZone : function () { + if (this._tzm) { + this.zone(this._tzm); + } else if (typeof this._i === 'string') { + this.zone(this._i); + } + return this; + }, - if (moment.isDuration(input)) { - duration = { - ms: input._milliseconds, - d: input._days, - M: input._months - }; - } else if (typeof input === 'number') { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; } - } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { - sign = (match[1] === "-") ? -1 : 1; - duration = { - y: 0, - d: toInt(match[DATE]) * sign, - h: toInt(match[HOUR]) * sign, - m: toInt(match[MINUTE]) * sign, - s: toInt(match[SECOND]) * sign, - ms: toInt(match[MILLISECOND]) * sign - }; - } else if (!!(match = isoDurationRegex.exec(input))) { - sign = (match[1] === "-") ? -1 : 1; - parseIso = function (inp) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - }; - duration = { - y: parseIso(match[2]), - M: parseIso(match[3]), - d: parseIso(match[4]), - h: parseIso(match[5]), - m: parseIso(match[6]), - s: parseIso(match[7]), - w: parseIso(match[8]) - }; - } + else { + input = moment(input).zone(); + } + + return (this.zone() - input) % 60 === 0; + }, - ret = new Duration(duration); + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, - if (moment.isDuration(input) && input.hasOwnProperty('_lang')) { - ret._lang = input._lang; - } + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add("d", (input - dayOfYear)); + }, - return ret; - }; + quarter : function () { + return Math.ceil((this.month() + 1.0) / 3.0); + }, - // version number - moment.version = VERSION; + weekYear : function (input) { + var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year; + return input == null ? year : this.add("y", (input - year)); + }, - // default format - moment.defaultFormat = isoFormat; + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add("y", (input - year)); + }, - // This function will be called whenever a moment is mutated. - // It is intended to keep the offset in sync with the timezone. - moment.updateOffset = function () {}; + week : function (input) { + var week = this.lang().week(this); + return input == null ? week : this.add("d", (input - week) * 7); + }, - // This function will load languages and then set the global language. If - // no arguments are passed in, it will simply return the current global - // language key. - moment.lang = function (key, values) { - var r; - if (!key) { - return moment.fn._lang._abbr; - } - if (values) { - loadLang(normalizeLanguage(key), values); - } else if (values === null) { - unloadLang(key); - key = 'en'; - } else if (!languages[key]) { - getLangDefinition(key); - } - r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key); - return r._abbr; - }; + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add("d", (input - week) * 7); + }, - // returns language data - moment.langData = function (key) { - if (key && key._lang && key._lang._abbr) { - key = key._lang._abbr; - } - return getLangDefinition(key); - }; + weekday : function (input) { + var weekday = (this.day() + 7 - this.lang()._week.dow) % 7; + return input == null ? weekday : this.add("d", input - weekday); + }, - // compare moment object - moment.isMoment = function (obj) { - return obj instanceof Moment; - }; + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, - // for typechecking Duration objects - moment.isDuration = function (obj) { - return obj instanceof Duration; - }; + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, - for (i = lists.length - 1; i >= 0; --i) { - makeList(lists[i]); + set : function (units, value) { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + return this; + }, + + // If passed a language key, it will set the language for this + // instance. Otherwise, it will return the language configuration + // variables for this instance. + lang : function (key) { + if (key === undefined) { + return this._lang; + } else { + this._lang = getLangDefinition(key); + return this; + } + } + }); + + // helper for adding shortcuts + function makeGetterAndSetter(name, key) { + moment.fn[name] = moment.fn[name + 's'] = function (input) { + var utc = this._isUTC ? 'UTC' : ''; + if (input != null) { + this._d['set' + utc + key](input); + moment.updateOffset(this); + return this; + } else { + return this._d['get' + utc + key](); + } + }; } - moment.normalizeUnits = function (units) { - return normalizeUnits(units); - }; + // loop through and add shortcuts (Month, Date, Hours, Minutes, Seconds, Milliseconds) + for (i = 0; i < proxyGettersAndSetters.length; i ++) { + makeGetterAndSetter(proxyGettersAndSetters[i].toLowerCase().replace(/s$/, ''), proxyGettersAndSetters[i]); + } - moment.invalid = function (flags) { - var m = moment.utc(NaN); - if (flags != null) { - extend(m._pf, flags); - } - else { - m._pf.userInvalidated = true; - } + // add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear') + makeGetterAndSetter('year', 'FullYear'); - return m; - }; + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; - moment.parseZone = function (input) { - return moment(input).parseZone(); - }; + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; /************************************ - Moment Prototype + Duration Prototype ************************************/ - extend(moment.fn = Moment.prototype, { + extend(moment.duration.fn = Duration.prototype, { - clone : function () { - return moment(this); + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years; + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; + + hours = absRound(minutes / 60); + data.hours = hours % 24; + + days += absRound(hours / 24); + data.days = days % 30; + + months += absRound(days / 30); + data.months = months % 12; + + years = absRound(months / 12); + data.years = years; }, - valueOf : function () { - return +this._d + ((this._offset || 0) * 60000); + weeks : function () { + return absRound(this.days() / 7); }, - unix : function () { - return Math.floor(+this / 1000); + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; }, - toString : function () { - return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ"); + humanize : function (withSuffix) { + var difference = +this, + output = relativeTime(difference, !withSuffix, this.lang()); + + if (withSuffix) { + output = this.lang().pastFuture(difference, output); + } + + return this.lang().postformat(output); }, - toDate : function () { - return this._offset ? new Date(+this) : this._d; + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); + + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; + + this._bubble(); + + return this; }, - toISOString : function () { - var m = moment(this).utc(); - if (0 < m.year() && m.year() <= 9999) { - return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } else { - return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } + subtract : function (input, val) { + var dur = moment.duration(input, val); + + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; + + this._bubble(); + + return this; }, - toArray : function () { - var m = this; - return [ - m.year(), - m.month(), - m.date(), - m.hours(), - m.minutes(), - m.seconds(), - m.milliseconds() - ]; + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); }, - isValid : function () { - return isValid(this); + as : function (units) { + units = normalizeUnits(units); + return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's'](); }, - isDSTShifted : function () { + lang : moment.fn.lang, - if (this._a) { - return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + toIsoString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; } - return false; - }, + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + } + }); - parsingFlags : function () { - return extend({}, this._pf); - }, + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } - invalidAt: function () { - return this._pf.overflow; - }, + function makeDurationAsGetter(name, factor) { + moment.duration.fn['as' + name] = function () { + return +this / factor; + }; + } - utc : function () { - return this.zone(0); - }, + for (i in unitMillisecondFactors) { + if (unitMillisecondFactors.hasOwnProperty(i)) { + makeDurationAsGetter(i, unitMillisecondFactors[i]); + makeDurationGetter(i.toLowerCase()); + } + } - local : function () { - this.zone(0); - this._isUTC = false; - return this; - }, + makeDurationAsGetter('Weeks', 6048e5); + moment.duration.fn.asMonths = function () { + return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12; + }; - format : function (inputString) { - var output = formatMoment(this, inputString || moment.defaultFormat); - return this.lang().postformat(output); - }, - add : function (input, val) { - var dur; - // switch args to support add('s', 1) and add(1, 's') - if (typeof input === 'string') { - dur = moment.duration(+val, input); - } else { - dur = moment.duration(input, val); - } - addOrSubtractDurationFromMoment(this, dur, 1); - return this; - }, + /************************************ + Default Lang + ************************************/ - subtract : function (input, val) { - var dur; - // switch args to support subtract('s', 1) and subtract(1, 's') - if (typeof input === 'string') { - dur = moment.duration(+val, input); - } else { - dur = moment.duration(input, val); - } - addOrSubtractDurationFromMoment(this, dur, -1); - return this; - }, - diff : function (input, units, asFloat) { - var that = makeAs(input, this), - zoneDiff = (this.zone() - that.zone()) * 6e4, - diff, output; + // Set default language, other languages will inherit from English. + moment.lang('en', { + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); - units = normalizeUnits(units); + /* EMBED_LANGUAGES */ - if (units === 'year' || units === 'month') { - // average number of days in the months in the given dates - diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2 - // difference in months - output = ((this.year() - that.year()) * 12) + (this.month() - that.month()); - // adjust by taking difference in days, average number of days - // and dst in the given months. - output += ((this - moment(this).startOf('month')) - - (that - moment(that).startOf('month'))) / diff; - // same as above but with zones, to negate all dst - output -= ((this.zone() - moment(this).startOf('month').zone()) - - (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff; - if (units === 'year') { - output = output / 12; + /************************************ + Exposing Moment + ************************************/ + + function makeGlobal(deprecate) { + var warned = false, local_moment = moment; + /*global ender:false */ + if (typeof ender !== 'undefined') { + return; + } + // here, `this` means `window` in the browser, or `global` on the server + // add `moment` as a global object via a string identifier, + // for Closure Compiler "advanced" mode + if (deprecate) { + global.moment = function () { + if (!warned && console && console.warn) { + warned = true; + console.warn( + "Accessing Moment through the global scope is " + + "deprecated, and will be removed in an upcoming " + + "release."); } - } else { - diff = (this - that); - output = units === 'second' ? diff / 1e3 : // 1000 - units === 'minute' ? diff / 6e4 : // 1000 * 60 - units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 - units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst - units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst - diff; + return local_moment.apply(null, arguments); + }; + extend(global.moment, local_moment); + } else { + global['moment'] = moment; + } + } + + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + makeGlobal(true); + } else if (typeof define === "function" && define.amd) { + define("moment", function (require, exports, module) { + if (module.config && module.config() && module.config().noGlobal !== true) { + // If user provided noGlobal, he is aware of global + makeGlobal(module.config().noGlobal === undefined); } - return asFloat ? output : absRound(output); - }, - from : function (time, withoutSuffix) { - return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix); - }, + return moment; + }); + } else { + makeGlobal(); + } +}).call(this); - fromNow : function (withoutSuffix) { - return this.from(moment(), withoutSuffix); - }, +},{}],4:[function(require,module,exports){ +/** + * Copyright 2012 Craig Campbell + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Mousetrap is a simple keyboard shortcut library for Javascript with + * no external dependencies + * + * @version 1.1.2 + * @url craig.is/killing/mice + */ - calendar : function () { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're zone'd or not. - var sod = makeAs(moment(), this).startOf('day'), - diff = this.diff(sod, 'days', true), - format = diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; - return this.format(this.lang().calendar(format, this)); - }, + /** + * mapping of special keycodes to their corresponding keys + * + * everything in this dictionary cannot use keypress events + * so it has to be here to map to the correct keycodes for + * keyup/keydown events + * + * @type {Object} + */ + var _MAP = { + 8: 'backspace', + 9: 'tab', + 13: 'enter', + 16: 'shift', + 17: 'ctrl', + 18: 'alt', + 20: 'capslock', + 27: 'esc', + 32: 'space', + 33: 'pageup', + 34: 'pagedown', + 35: 'end', + 36: 'home', + 37: 'left', + 38: 'up', + 39: 'right', + 40: 'down', + 45: 'ins', + 46: 'del', + 91: 'meta', + 93: 'meta', + 224: 'meta' + }, - isLeapYear : function () { - return isLeapYear(this.year()); - }, + /** + * mapping for special characters so they can support + * + * this dictionary is only used incase you want to bind a + * keyup or keydown event to one of these keys + * + * @type {Object} + */ + _KEYCODE_MAP = { + 106: '*', + 107: '+', + 109: '-', + 110: '.', + 111 : '/', + 186: ';', + 187: '=', + 188: ',', + 189: '-', + 190: '.', + 191: '/', + 192: '`', + 219: '[', + 220: '\\', + 221: ']', + 222: '\'' + }, - isDST : function () { - return (this.zone() < this.clone().month(0).zone() || - this.zone() < this.clone().month(5).zone()); - }, + /** + * this is a mapping of keys that require shift on a US keypad + * back to the non shift equivelents + * + * this is so you can use keyup events with these keys + * + * note that this will only work reliably on US keyboards + * + * @type {Object} + */ + _SHIFT_MAP = { + '~': '`', + '!': '1', + '@': '2', + '#': '3', + '$': '4', + '%': '5', + '^': '6', + '&': '7', + '*': '8', + '(': '9', + ')': '0', + '_': '-', + '+': '=', + ':': ';', + '\"': '\'', + '<': ',', + '>': '.', + '?': '/', + '|': '\\' + }, - day : function (input) { - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.lang()); - return this.add({ d : input - day }); - } else { - return day; - } - }, + /** + * this is a list of special strings you can use to map + * to modifier keys when you specify your keyboard shortcuts + * + * @type {Object} + */ + _SPECIAL_ALIASES = { + 'option': 'alt', + 'command': 'meta', + 'return': 'enter', + 'escape': 'esc' + }, - month : function (input) { - var utc = this._isUTC ? 'UTC' : '', - dayOfMonth; + /** + * variable to store the flipped version of _MAP from above + * needed to check if we should use keypress or not when no action + * is specified + * + * @type {Object|undefined} + */ + _REVERSE_MAP, + + /** + * a list of all the callbacks setup via Mousetrap.bind() + * + * @type {Object} + */ + _callbacks = {}, + + /** + * direct map of string combinations to callbacks used for trigger() + * + * @type {Object} + */ + _direct_map = {}, + + /** + * keeps track of what level each sequence is at since multiple + * sequences can start out with the same sequence + * + * @type {Object} + */ + _sequence_levels = {}, + + /** + * variable to store the setTimeout call + * + * @type {null|number} + */ + _reset_timer, + + /** + * temporary state where we will ignore the next keyup + * + * @type {boolean|string} + */ + _ignore_next_keyup = false, - if (input != null) { - if (typeof input === 'string') { - input = this.lang().monthsParse(input); - if (typeof input !== 'number') { - return this; - } - } + /** + * are we currently inside of a sequence? + * type of action ("keyup" or "keydown" or "keypress") or false + * + * @type {boolean|string} + */ + _inside_sequence = false; - dayOfMonth = this.date(); - this.date(1); - this._d['set' + utc + 'Month'](input); - this.date(Math.min(dayOfMonth, this.daysInMonth())); + /** + * loop through the f keys, f1 to f19 and add them to the map + * programatically + */ + for (var i = 1; i < 20; ++i) { + _MAP[111 + i] = 'f' + i; + } - moment.updateOffset(this); - return this; - } else { - return this._d['get' + utc + 'Month'](); - } - }, + /** + * loop through to map numbers on the numeric keypad + */ + for (i = 0; i <= 9; ++i) { + _MAP[i + 96] = i; + } - startOf: function (units) { - units = normalizeUnits(units); - // the following switch intentionally omits break keywords - // to utilize falling through the cases. - switch (units) { - case 'year': - this.month(0); - /* falls through */ - case 'month': - this.date(1); - /* falls through */ - case 'week': - case 'isoWeek': - case 'day': - this.hours(0); - /* falls through */ - case 'hour': - this.minutes(0); - /* falls through */ - case 'minute': - this.seconds(0); - /* falls through */ - case 'second': - this.milliseconds(0); - /* falls through */ - } + /** + * cross browser add event method + * + * @param {Element|HTMLDocument} object + * @param {string} type + * @param {Function} callback + * @returns void + */ + function _addEvent(object, type, callback) { + if (object.addEventListener) { + return object.addEventListener(type, callback, false); + } - // weeks are a special case - if (units === 'week') { - this.weekday(0); - } else if (units === 'isoWeek') { - this.isoWeekday(1); - } + object.attachEvent('on' + type, callback); + } - return this; - }, + /** + * takes the event and returns the key character + * + * @param {Event} e + * @return {string} + */ + function _characterFromEvent(e) { - endOf: function (units) { - units = normalizeUnits(units); - return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1); - }, + // for keypress events we should return the character as is + if (e.type == 'keypress') { + return String.fromCharCode(e.which); + } - isAfter: function (input, units) { - units = typeof units !== 'undefined' ? units : 'millisecond'; - return +this.clone().startOf(units) > +moment(input).startOf(units); - }, + // for non keypress events the special maps are needed + if (_MAP[e.which]) { + return _MAP[e.which]; + } - isBefore: function (input, units) { - units = typeof units !== 'undefined' ? units : 'millisecond'; - return +this.clone().startOf(units) < +moment(input).startOf(units); - }, + if (_KEYCODE_MAP[e.which]) { + return _KEYCODE_MAP[e.which]; + } - isSame: function (input, units) { - units = units || 'ms'; - return +this.clone().startOf(units) === +makeAs(input, this).startOf(units); - }, + // if it is not in the special map + return String.fromCharCode(e.which).toLowerCase(); + } - min: function (other) { - other = moment.apply(null, arguments); - return other < this ? this : other; - }, + /** + * should we stop this event before firing off callbacks + * + * @param {Event} e + * @return {boolean} + */ + function _stop(e) { + var element = e.target || e.srcElement, + tag_name = element.tagName; - max: function (other) { - other = moment.apply(null, arguments); - return other > this ? this : other; - }, + // if the element has the class "mousetrap" then no need to stop + if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { + return false; + } - zone : function (input) { - var offset = this._offset || 0; - if (input != null) { - if (typeof input === "string") { - input = timezoneMinutesFromString(input); - } - if (Math.abs(input) < 16) { - input = input * 60; - } - this._offset = input; - this._isUTC = true; - if (offset !== input) { - addOrSubtractDurationFromMoment(this, moment.duration(offset - input, 'm'), 1, true); - } - } else { - return this._isUTC ? offset : this._d.getTimezoneOffset(); - } - return this; - }, + // stop for input, select, and textarea + return tag_name == 'INPUT' || tag_name == 'SELECT' || tag_name == 'TEXTAREA' || (element.contentEditable && element.contentEditable == 'true'); + } - zoneAbbr : function () { - return this._isUTC ? "UTC" : ""; - }, + /** + * checks if two arrays are equal + * + * @param {Array} modifiers1 + * @param {Array} modifiers2 + * @returns {boolean} + */ + function _modifiersMatch(modifiers1, modifiers2) { + return modifiers1.sort().join(',') === modifiers2.sort().join(','); + } - zoneName : function () { - return this._isUTC ? "Coordinated Universal Time" : ""; - }, + /** + * resets all sequence counters except for the ones passed in + * + * @param {Object} do_not_reset + * @returns void + */ + function _resetSequences(do_not_reset) { + do_not_reset = do_not_reset || {}; - parseZone : function () { - if (this._tzm) { - this.zone(this._tzm); - } else if (typeof this._i === 'string') { - this.zone(this._i); - } - return this; - }, + var active_sequences = false, + key; - hasAlignedHourOffset : function (input) { - if (!input) { - input = 0; - } - else { - input = moment(input).zone(); - } + for (key in _sequence_levels) { + if (do_not_reset[key]) { + active_sequences = true; + continue; + } + _sequence_levels[key] = 0; + } - return (this.zone() - input) % 60 === 0; - }, + if (!active_sequences) { + _inside_sequence = false; + } + } - daysInMonth : function () { - return daysInMonth(this.year(), this.month()); - }, + /** + * finds all callbacks that match based on the keycode, modifiers, + * and action + * + * @param {string} character + * @param {Array} modifiers + * @param {string} action + * @param {boolean=} remove - should we remove any matches + * @param {string=} combination + * @returns {Array} + */ + function _getMatches(character, modifiers, action, remove, combination) { + var i, + callback, + matches = []; + + // if there are no events related to this keycode + if (!_callbacks[character]) { + return []; + } - dayOfYear : function (input) { - var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add("d", (input - dayOfYear)); - }, + // if a modifier key is coming up on its own we should allow it + if (action == 'keyup' && _isModifier(character)) { + modifiers = [character]; + } - quarter : function () { - return Math.ceil((this.month() + 1.0) / 3.0); - }, + // loop through all callbacks for the key that was pressed + // and see if any of them match + for (i = 0; i < _callbacks[character].length; ++i) { + callback = _callbacks[character][i]; - weekYear : function (input) { - var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year; - return input == null ? year : this.add("y", (input - year)); - }, + // if this is a sequence but it is not at the right level + // then move onto the next match + if (callback.seq && _sequence_levels[callback.seq] != callback.level) { + continue; + } - isoWeekYear : function (input) { - var year = weekOfYear(this, 1, 4).year; - return input == null ? year : this.add("y", (input - year)); - }, + // if the action we are looking for doesn't match the action we got + // then we should keep going + if (action != callback.action) { + continue; + } - week : function (input) { - var week = this.lang().week(this); - return input == null ? week : this.add("d", (input - week) * 7); - }, + // if this is a keypress event that means that we need to only + // look at the character, otherwise check the modifiers as + // well + if (action == 'keypress' || _modifiersMatch(modifiers, callback.modifiers)) { - isoWeek : function (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add("d", (input - week) * 7); - }, + // remove is used so if you change your mind and call bind a + // second time with a new function the first one is overwritten + if (remove && callback.combo == combination) { + _callbacks[character].splice(i, 1); + } - weekday : function (input) { - var weekday = (this.day() + 7 - this.lang()._week.dow) % 7; - return input == null ? weekday : this.add("d", input - weekday); - }, + matches.push(callback); + } + } - isoWeekday : function (input) { - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); - }, + return matches; + } - get : function (units) { - units = normalizeUnits(units); - return this[units](); - }, + /** + * takes a key event and figures out what the modifiers are + * + * @param {Event} e + * @returns {Array} + */ + function _eventModifiers(e) { + var modifiers = []; - set : function (units, value) { - units = normalizeUnits(units); - if (typeof this[units] === 'function') { - this[units](value); - } - return this; - }, + if (e.shiftKey) { + modifiers.push('shift'); + } - // If passed a language key, it will set the language for this - // instance. Otherwise, it will return the language configuration - // variables for this instance. - lang : function (key) { - if (key === undefined) { - return this._lang; - } else { - this._lang = getLangDefinition(key); - return this; - } - } - }); + if (e.altKey) { + modifiers.push('alt'); + } - // helper for adding shortcuts - function makeGetterAndSetter(name, key) { - moment.fn[name] = moment.fn[name + 's'] = function (input) { - var utc = this._isUTC ? 'UTC' : ''; - if (input != null) { - this._d['set' + utc + key](input); - moment.updateOffset(this); - return this; - } else { - return this._d['get' + utc + key](); - } - }; - } + if (e.ctrlKey) { + modifiers.push('ctrl'); + } - // loop through and add shortcuts (Month, Date, Hours, Minutes, Seconds, Milliseconds) - for (i = 0; i < proxyGettersAndSetters.length; i ++) { - makeGetterAndSetter(proxyGettersAndSetters[i].toLowerCase().replace(/s$/, ''), proxyGettersAndSetters[i]); - } + if (e.metaKey) { + modifiers.push('meta'); + } - // add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear') - makeGetterAndSetter('year', 'FullYear'); + return modifiers; + } + + /** + * actually calls the callback function + * + * if your callback function returns false this will use the jquery + * convention - prevent default and stop propogation on the event + * + * @param {Function} callback + * @param {Event} e + * @returns void + */ + function _fireCallback(callback, e) { + if (callback(e) === false) { + if (e.preventDefault) { + e.preventDefault(); + } - // add plural methods - moment.fn.days = moment.fn.day; - moment.fn.months = moment.fn.month; - moment.fn.weeks = moment.fn.week; - moment.fn.isoWeeks = moment.fn.isoWeek; + if (e.stopPropagation) { + e.stopPropagation(); + } - // add aliased format methods - moment.fn.toJSON = moment.fn.toISOString; + e.returnValue = false; + e.cancelBubble = true; + } + } - /************************************ - Duration Prototype - ************************************/ + /** + * handles a character key event + * + * @param {string} character + * @param {Event} e + * @returns void + */ + function _handleCharacter(character, e) { + // if this event should not happen stop here + if (_stop(e)) { + return; + } - extend(moment.duration.fn = Duration.prototype, { + var callbacks = _getMatches(character, _eventModifiers(e), e.type), + i, + do_not_reset = {}, + processed_sequence_callback = false; + + // loop through matching callbacks for this key event + for (i = 0; i < callbacks.length; ++i) { + + // fire for all sequence callbacks + // this is because if for example you have multiple sequences + // bound such as "g i" and "g t" they both need to fire the + // callback for matching g cause otherwise you can only ever + // match the first one + if (callbacks[i].seq) { + processed_sequence_callback = true; + + // keep a list of which sequences were matches for later + do_not_reset[callbacks[i].seq] = 1; + _fireCallback(callbacks[i].callback, e); + continue; + } - _bubble : function () { - var milliseconds = this._milliseconds, - days = this._days, - months = this._months, - data = this._data, - seconds, minutes, hours, years; + // if there were no sequence matches but we are still here + // that means this is a regular match so we should fire that + if (!processed_sequence_callback && !_inside_sequence) { + _fireCallback(callbacks[i].callback, e); + } + } - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; + // if you are inside of a sequence and the key you are pressing + // is not a modifier key then we should reset all sequences + // that were not matched by this key event + if (e.type == _inside_sequence && !_isModifier(character)) { + _resetSequences(do_not_reset); + } + } - seconds = absRound(milliseconds / 1000); - data.seconds = seconds % 60; + /** + * handles a keydown event + * + * @param {Event} e + * @returns void + */ + function _handleKey(e) { - minutes = absRound(seconds / 60); - data.minutes = minutes % 60; + // normalize e.which for key events + // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion + e.which = typeof e.which == "number" ? e.which : e.keyCode; - hours = absRound(minutes / 60); - data.hours = hours % 24; + var character = _characterFromEvent(e); - days += absRound(hours / 24); - data.days = days % 30; + // no character found then stop + if (!character) { + return; + } - months += absRound(days / 30); - data.months = months % 12; + if (e.type == 'keyup' && _ignore_next_keyup == character) { + _ignore_next_keyup = false; + return; + } - years = absRound(months / 12); - data.years = years; - }, + _handleCharacter(character, e); + } - weeks : function () { - return absRound(this.days() / 7); - }, + /** + * determines if the keycode specified is a modifier key or not + * + * @param {string} key + * @returns {boolean} + */ + function _isModifier(key) { + return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta'; + } - valueOf : function () { - return this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6; - }, + /** + * called to set a 1 second timeout on the specified sequence + * + * this is so after each key press in the sequence you have 1 second + * to press the next key before you have to start over + * + * @returns void + */ + function _resetSequenceTimer() { + clearTimeout(_reset_timer); + _reset_timer = setTimeout(_resetSequences, 1000); + } - humanize : function (withSuffix) { - var difference = +this, - output = relativeTime(difference, !withSuffix, this.lang()); + /** + * reverses the map lookup so that we can look for specific keys + * to see what can and can't use keypress + * + * @return {Object} + */ + function _getReverseMap() { + if (!_REVERSE_MAP) { + _REVERSE_MAP = {}; + for (var key in _MAP) { + + // pull out the numeric keypad from here cause keypress should + // be able to detect the keys from the character + if (key > 95 && key < 112) { + continue; + } + + if (_MAP.hasOwnProperty(key)) { + _REVERSE_MAP[_MAP[key]] = key; + } + } + } + return _REVERSE_MAP; + } - if (withSuffix) { - output = this.lang().pastFuture(difference, output); - } + /** + * picks the best action based on the key combination + * + * @param {string} key - character for key + * @param {Array} modifiers + * @param {string=} action passed in + */ + function _pickBestAction(key, modifiers, action) { - return this.lang().postformat(output); - }, + // if no action was picked in we should try to pick the one + // that we think would work best for this key + if (!action) { + action = _getReverseMap()[key] ? 'keydown' : 'keypress'; + } - add : function (input, val) { - // supports only 2.0-style add(1, 's') or add(moment) - var dur = moment.duration(input, val); + // modifier keys don't work as expected with keypress, + // switch to keydown + if (action == 'keypress' && modifiers.length) { + action = 'keydown'; + } - this._milliseconds += dur._milliseconds; - this._days += dur._days; - this._months += dur._months; + return action; + } - this._bubble(); + /** + * binds a key sequence to an event + * + * @param {string} combo - combo specified in bind call + * @param {Array} keys + * @param {Function} callback + * @param {string=} action + * @returns void + */ + function _bindSequence(combo, keys, callback, action) { - return this; - }, + // start off by adding a sequence level record for this combination + // and setting the level to 0 + _sequence_levels[combo] = 0; - subtract : function (input, val) { - var dur = moment.duration(input, val); + // if there is no action pick the best one for the first key + // in the sequence + if (!action) { + action = _pickBestAction(keys[0], []); + } - this._milliseconds -= dur._milliseconds; - this._days -= dur._days; - this._months -= dur._months; + /** + * callback to increase the sequence level for this sequence and reset + * all other sequences that were active + * + * @param {Event} e + * @returns void + */ + var _increaseSequence = function(e) { + _inside_sequence = action; + ++_sequence_levels[combo]; + _resetSequenceTimer(); + }, + + /** + * wraps the specified callback inside of another function in order + * to reset all sequence counters as soon as this sequence is done + * + * @param {Event} e + * @returns void + */ + _callbackAndReset = function(e) { + _fireCallback(callback, e); + + // we should ignore the next key up if the action is key down + // or keypress. this is so if you finish a sequence and + // release the key the final key will not trigger a keyup + if (action !== 'keyup') { + _ignore_next_keyup = _characterFromEvent(e); + } + + // weird race condition if a sequence ends with the key + // another sequence begins with + setTimeout(_resetSequences, 10); + }, + i; + + // loop through keys one at a time and bind the appropriate callback + // function. for any key leading up to the final one it should + // increase the sequence. after the final, it should reset all sequences + for (i = 0; i < keys.length; ++i) { + _bindSingle(keys[i], i < keys.length - 1 ? _increaseSequence : _callbackAndReset, action, combo, i); + } + } - this._bubble(); + /** + * binds a single keyboard combination + * + * @param {string} combination + * @param {Function} callback + * @param {string=} action + * @param {string=} sequence_name - name of sequence if part of sequence + * @param {number=} level - what part of the sequence the command is + * @returns void + */ + function _bindSingle(combination, callback, action, sequence_name, level) { - return this; - }, + // make sure multiple spaces in a row become a single space + combination = combination.replace(/\s+/g, ' '); - get : function (units) { - units = normalizeUnits(units); - return this[units.toLowerCase() + 's'](); - }, + var sequence = combination.split(' '), + i, + key, + keys, + modifiers = []; - as : function (units) { - units = normalizeUnits(units); - return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's'](); - }, + // if this pattern is a sequence of keys then run through this method + // to reprocess each pattern one key at a time + if (sequence.length > 1) { + return _bindSequence(combination, sequence, callback, action); + } - lang : moment.fn.lang, + // take the keys from this pattern and figure out what the actual + // pattern is all about + keys = combination === '+' ? ['+'] : combination.split('+'); - toIsoString : function () { - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var years = Math.abs(this.years()), - months = Math.abs(this.months()), - days = Math.abs(this.days()), - hours = Math.abs(this.hours()), - minutes = Math.abs(this.minutes()), - seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + for (i = 0; i < keys.length; ++i) { + key = keys[i]; - if (!this.asSeconds()) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } + // normalize key names + if (_SPECIAL_ALIASES[key]) { + key = _SPECIAL_ALIASES[key]; + } - return (this.asSeconds() < 0 ? '-' : '') + - 'P' + - (years ? years + 'Y' : '') + - (months ? months + 'M' : '') + - (days ? days + 'D' : '') + - ((hours || minutes || seconds) ? 'T' : '') + - (hours ? hours + 'H' : '') + - (minutes ? minutes + 'M' : '') + - (seconds ? seconds + 'S' : ''); - } - }); + // if this is not a keypress event then we should + // be smart about using shift keys + // this will only work for US keyboards however + if (action && action != 'keypress' && _SHIFT_MAP[key]) { + key = _SHIFT_MAP[key]; + modifiers.push('shift'); + } - function makeDurationGetter(name) { - moment.duration.fn[name] = function () { - return this._data[name]; - }; - } + // if this key is a modifier then add it to the list of modifiers + if (_isModifier(key)) { + modifiers.push(key); + } + } - function makeDurationAsGetter(name, factor) { - moment.duration.fn['as' + name] = function () { - return +this / factor; - }; - } + // depending on what the key combination is + // we will try to pick the best event for it + action = _pickBestAction(key, modifiers, action); - for (i in unitMillisecondFactors) { - if (unitMillisecondFactors.hasOwnProperty(i)) { - makeDurationAsGetter(i, unitMillisecondFactors[i]); - makeDurationGetter(i.toLowerCase()); - } - } + // make sure to initialize array if this is the first time + // a callback is added for this key + if (!_callbacks[key]) { + _callbacks[key] = []; + } - makeDurationAsGetter('Weeks', 6048e5); - moment.duration.fn.asMonths = function () { - return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12; - }; + // remove an existing match if there is one + _getMatches(key, modifiers, action, !sequence_name, combination); + + // add this call back to the array + // if it is a sequence put it at the beginning + // if not put it at the end + // + // this is important because the way these are processed expects + // the sequence ones to come first + _callbacks[key][sequence_name ? 'unshift' : 'push']({ + callback: callback, + modifiers: modifiers, + action: action, + seq: sequence_name, + level: level, + combo: combination + }); + } + /** + * binds multiple combinations to the same callback + * + * @param {Array} combinations + * @param {Function} callback + * @param {string|undefined} action + * @returns void + */ + function _bindMultiple(combinations, callback, action) { + for (var i = 0; i < combinations.length; ++i) { + _bindSingle(combinations[i], callback, action); + } + } - /************************************ - Default Lang - ************************************/ + // start! + _addEvent(document, 'keypress', _handleKey); + _addEvent(document, 'keydown', _handleKey); + _addEvent(document, 'keyup', _handleKey); + var mousetrap = { - // Set default language, other languages will inherit from English. - moment.lang('en', { - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); + /** + * binds an event to mousetrap + * + * can be a single key, a combination of keys separated with +, + * a comma separated list of keys, an array of keys, or + * a sequence of keys separated by spaces + * + * be sure to list the modifier keys first to make sure that the + * correct key ends up getting bound (the last key in the pattern) + * + * @param {string|Array} keys + * @param {Function} callback + * @param {string=} action - 'keypress', 'keydown', or 'keyup' + * @returns void + */ + bind: function(keys, callback, action) { + _bindMultiple(keys instanceof Array ? keys : [keys], callback, action); + _direct_map[keys + ':' + action] = callback; + return this; + }, - /* EMBED_LANGUAGES */ + /** + * unbinds an event to mousetrap + * + * the unbinding sets the callback function of the specified key combo + * to an empty function and deletes the corresponding key in the + * _direct_map dict. + * + * the keycombo+action has to be exactly the same as + * it was defined in the bind method + * + * TODO: actually remove this from the _callbacks dictionary instead + * of binding an empty function + * + * @param {string|Array} keys + * @param {string} action + * @returns void + */ + unbind: function(keys, action) { + if (_direct_map[keys + ':' + action]) { + delete _direct_map[keys + ':' + action]; + this.bind(keys, function() {}, action); + } + return this; + }, - /************************************ - Exposing Moment - ************************************/ + /** + * triggers an event that has already been bound + * + * @param {string} keys + * @param {string=} action + * @returns void + */ + trigger: function(keys, action) { + _direct_map[keys + ':' + action](); + return this; + }, - function makeGlobal(deprecate) { - var warned = false, local_moment = moment; - /*global ender:false */ - if (typeof ender !== 'undefined') { - return; - } - // here, `this` means `window` in the browser, or `global` on the server - // add `moment` as a global object via a string identifier, - // for Closure Compiler "advanced" mode - if (deprecate) { - global.moment = function () { - if (!warned && console && console.warn) { - warned = true; - console.warn( - "Accessing Moment through the global scope is " + - "deprecated, and will be removed in an upcoming " + - "release."); - } - return local_moment.apply(null, arguments); - }; - extend(global.moment, local_moment); - } else { - global['moment'] = moment; - } - } + /** + * resets the library back to its initial state. this is useful + * if you want to clear out the current keyboard shortcuts and bind + * new ones - for example if you switch to another page + * + * @returns void + */ + reset: function() { + _callbacks = {}; + _direct_map = {}; + return this; + } + }; - // CommonJS module is defined - if (hasModule) { - module.exports = moment; - makeGlobal(true); - } else if (typeof define === "function" && define.amd) { - define("moment", function (require, exports, module) { - if (module.config && module.config() && module.config().noGlobal !== true) { - // If user provided noGlobal, he is aware of global - makeGlobal(module.config().noGlobal === undefined); - } +module.exports = mousetrap; - return moment; - }); - } else { - makeGlobal(); - } -}).call(this); },{}]},{},[1]) (1) diff --git a/dist/vis.min.js b/dist/vis.min.js index 8ca53878..083f0f1f 100644 --- a/dist/vis.min.js +++ b/dist/vis.min.js @@ -4,11 +4,11 @@ * * A dynamic, browser-based visualization library. * - * @version 0.3.0 - * @date 2014-01-14 + * @version 0.4.0 + * @date 2014-01-31 * * @license - * Copyright (C) 2011-2013 Almende B.V, http://almende.com + * Copyright (C) 2011-2014 Almende B.V, http://almende.com * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy @@ -22,8 +22,10 @@ * License for the specific language governing permissions and limitations under * the License. */ -!function(t){if("object"==typeof exports)module.exports=t();else if("function"==typeof define&&define.amd)define(t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.vis=t()}}(function(){var t;return function e(t,i,n){function s(o,a){if(!i[o]){if(!t[o]){var h="function"==typeof require&&require;if(!a&&h)return h(o,!0);if(r)return r(o,!0);throw new Error("Cannot find module '"+o+"'")}var d=i[o]={exports:{}};t[o][0].call(d.exports,function(e){var i=t[o][1][e];return s(i?i:e)},d,d.exports,e,t,i,n)}return i[o].exports}for(var r="function"==typeof require&&require,o=0;oi;++i)t.call(e||this,this[i],i,this)}),Array.prototype.map||(Array.prototype.map=function(t,e){var i,n,s;if(null==this)throw new TypeError(" this is null or not defined");var r=Object(this),o=r.length>>>0;if("function"!=typeof t)throw new TypeError(t+" is not a function");for(e&&(i=e),n=new Array(o),s=0;o>s;){var a,h;s in r&&(a=r[s],h=t.call(i,a,s,r),n[s]=h),s++}return n}),Array.prototype.filter||(Array.prototype.filter=function(t){"use strict";if(null==this)throw new TypeError;var e=Object(this),i=e.length>>>0;if("function"!=typeof t)throw new TypeError;for(var n=[],s=arguments[1],r=0;i>r;r++)if(r in e){var o=e[r];t.call(s,o,r,e)&&n.push(o)}return n}),Object.keys||(Object.keys=function(){var t=Object.prototype.hasOwnProperty,e=!{toString:null}.propertyIsEnumerable("toString"),i=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],n=i.length;return function(s){if("object"!=typeof s&&"function"!=typeof s||null===s)throw new TypeError("Object.keys called on non-object");var r=[];for(var o in s)t.call(s,o)&&r.push(o);if(e)for(var a=0;n>a;a++)t.call(s,i[a])&&r.push(i[a]);return r}}()),Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),Function.prototype.bind||(Function.prototype.bind=function(t){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var e=Array.prototype.slice.call(arguments,1),i=this,n=function(){},s=function(){return i.apply(this instanceof n&&t?this:t,e.concat(Array.prototype.slice.call(arguments)))};return n.prototype=this.prototype,s.prototype=new n,s}),Object.create||(Object.create=function(t){function e(){}if(arguments.length>1)throw new Error("Object.create implementation only accepts the first parameter.");return e.prototype=t,new e}),Function.prototype.bind||(Function.prototype.bind=function(t){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var e=Array.prototype.slice.call(arguments,1),i=this,n=function(){},s=function(){return i.apply(this instanceof n&&t?this:t,e.concat(Array.prototype.slice.call(arguments)))};return n.prototype=this.prototype,s.prototype=new n,s});var A={};A.isNumber=function(t){return t instanceof Number||"number"==typeof t},A.isString=function(t){return t instanceof String||"string"==typeof t},A.isDate=function(t){if(t instanceof Date)return!0;if(A.isString(t)){var e=P.exec(t);if(e)return!0;if(!isNaN(Date.parse(t)))return!0}return!1},A.isDataTable=function(t){return"undefined"!=typeof google&&google.visualization&&google.visualization.DataTable&&t instanceof google.visualization.DataTable},A.randomUUID=function(){var t=function(){return Math.floor(65536*Math.random()).toString(16)};return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},A.extend=function(t){for(var e=1,i=arguments.length;i>e;e++){var n=arguments[e];for(var s in n)n.hasOwnProperty(s)&&void 0!==n[s]&&(t[s]=n[s])}return t},A.convert=function(t,e){var i;if(void 0===t)return void 0;if(null===t)return null;if(!e)return t;if("string"!=typeof e&&!(e instanceof String))throw new Error("Type must be a string");switch(e){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(A.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(I.isMoment(t))return new Date(t.valueOf());if(A.isString(t))return i=P.exec(t),i?new Date(Number(i[1])):I(t).toDate();throw new Error("Cannot convert object of type "+A.getType(t)+" to type Date");case"Moment":if(A.isNumber(t))return I(t);if(t instanceof Date)return I(t.valueOf());if(I.isMoment(t))return I(t);if(A.isString(t))return i=P.exec(t),i?I(Number(i[1])):I(t);throw new Error("Cannot convert object of type "+A.getType(t)+" to type Date");case"ISODate":if(A.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(I.isMoment(t))return t.toDate().toISOString();if(A.isString(t))return i=P.exec(t),i?new Date(Number(i[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+A.getType(t)+" to type ISODate");case"ASPDate":if(A.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(A.isString(t)){i=P.exec(t);var n;return n=i?new Date(Number(i[1])).valueOf():new Date(t).valueOf(),"/Date("+n+")/"}throw new Error("Cannot convert object of type "+A.getType(t)+" to type ASPDate");default:throw new Error("Cannot convert object of type "+A.getType(t)+' to type "'+e+'"')}};var P=/^\/?Date\((\-?\d+)/i;A.getType=function(t){var e=typeof t;return"object"==e?null==t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":t instanceof Array?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":e},A.getAbsoluteLeft=function(t){for(var e=document.documentElement,i=document.body,n=t.offsetLeft,s=t.offsetParent;null!=s&&s!=i&&s!=e;)n+=s.offsetLeft,n-=s.scrollLeft,s=s.offsetParent;return n},A.getAbsoluteTop=function(t){for(var e=document.documentElement,i=document.body,n=t.offsetTop,s=t.offsetParent;null!=s&&s!=i&&s!=e;)n+=s.offsetTop,n-=s.scrollTop,s=s.offsetParent;return n},A.getPageY=function(t){if("pageY"in t)return t.pageY;var e;e="targetTouches"in t&&t.targetTouches.length?t.targetTouches[0].clientY:t.clientY;var i=document.documentElement,n=document.body;return e+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)},A.getPageX=function(t){if("pageY"in t)return t.pageX;var e;e="targetTouches"in t&&t.targetTouches.length?t.targetTouches[0].clientX:t.clientX;var i=document.documentElement,n=document.body;return e+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0)},A.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},A.removeClassName=function(t,e){var i=t.className.split(" "),n=i.indexOf(e);-1!=n&&(i.splice(n,1),t.className=i.join(" "))},A.forEach=function(t,e){var i,n;if(t instanceof Array)for(i=0,n=t.length;n>i;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},A.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},A.addEventListener=function(t,e,i,n){t.addEventListener?(void 0===n&&(n=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,n)):t.attachEvent("on"+e,i)},A.removeEventListener=function(t,e,i,n){t.removeEventListener?(void 0===n&&(n=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,n)):t.detachEvent("on"+e,i)},A.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},A.stopPropagation=function(t){t||(t=window.event),t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},A.fakeGesture=function(t,e){var i=null;return L.event.collectEventData(this,i,e)},A.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},A.option={},A.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},A.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},A.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},A.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),A.isString(t)?t:A.isNumber(t)?t+"px":e||null},A.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null};var Y={listeners:[],indexOf:function(t){for(var e=this.listeners,i=0,n=this.listeners.length;n>i;i++){var s=e[i];if(s&&s.object==t)return i}return-1},addListener:function(t,e,i){var n=this.indexOf(t),s=this.listeners[n];s||(s={object:t,events:{}},this.listeners.push(s));var r=s.events[e];r||(r=[],s.events[e]=r),-1==r.indexOf(i)&&r.push(i)},removeListener:function(t,e,i){var n=this.indexOf(t),s=this.listeners[n];if(s){var r=s.events[e];r&&(n=r.indexOf(i),-1!=n&&r.splice(n,1),0==r.length&&delete s.events[e]);var o=0,a=s.events;for(var h in a)a.hasOwnProperty(h)&&o++;0==o&&delete this.listeners[n]}},removeAllListeners:function(){this.listeners=[]},trigger:function(t,e,i){var n=this.indexOf(t),s=this.listeners[n];if(s){var r=s.events[e];if(r)for(var o=0,a=r.length;a>o;o++)r[o](i)}}};s.prototype.on=function(t,e,i){var n=t instanceof RegExp?t:new RegExp(t.replace("*","\\w+")),s={id:A.randomUUID(),event:t,regexp:n,callback:"function"==typeof e?e:null,target:i};return this.subscriptions.push(s),s.id},s.prototype.off=function(t){for(var e=0;er;r++)i=s._addItem(t[r]),n.push(i);else if(A.isDataTable(t))for(var a=this._getColumnNames(t),h=0,d=t.getNumberOfRows();d>h;h++){for(var c={},u=0,l=a.length;l>u;u++){var p=a[u];c[p]=t.getValue(h,u)}i=s._addItem(c),n.push(i)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=s._addItem(t),n.push(i)}return n.length&&this._trigger("add",{items:n},e),n},r.prototype.update=function(t,e){var i=[],n=[],s=this,r=s.fieldId,o=function(t){var e=t[r];s.data[e]?(e=s._updateItem(t),n.push(e)):(e=s._addItem(t),i.push(e))};if(t instanceof Array)for(var a=0,h=t.length;h>a;a++)o(t[a]);else if(A.isDataTable(t))for(var d=this._getColumnNames(t),c=0,u=t.getNumberOfRows();u>c;c++){for(var l={},p=0,f=d.length;f>p;p++){var m=d[p];l[m]=t.getValue(c,p)}o(l)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");o(t)}return i.length&&this._trigger("add",{items:i},e),n.length&&this._trigger("update",{items:n},e),i.concat(n)},r.prototype.get=function(){var t,e,i,n,s=this,r=A.getType(arguments[0]);"String"==r||"Number"==r?(t=arguments[0],i=arguments[1],n=arguments[2]):"Array"==r?(e=arguments[0],i=arguments[1],n=arguments[2]):(i=arguments[0],n=arguments[1]);var o;if(i&&i.type){if(o="DataTable"==i.type?"DataTable":"Array",n&&o!=A.getType(n))throw new Error('Type of parameter "data" ('+A.getType(n)+") does not correspond with specified options.type ("+i.type+")");if("DataTable"==o&&!A.isDataTable(n))throw new Error('Parameter "data" must be a DataTable when options.type is "DataTable"')}else o=n?"DataTable"==A.getType(n)?"DataTable":"Array":"Array";var a,h,d,c,u=i&&i.convert||this.options.convert,l=i&&i.filter,p=[];if(void 0!=t)a=s._getItem(t,u),l&&!l(a)&&(a=null);else if(void 0!=e)for(d=0,c=e.length;c>d;d++)a=s._getItem(e[d],u),(!l||l(a))&&p.push(a);else for(h in this.data)this.data.hasOwnProperty(h)&&(a=s._getItem(h,u),(!l||l(a))&&p.push(a));if(i&&i.order&&void 0==t&&this._sort(p,i.order),i&&i.fields){var f=i.fields;if(void 0!=t)a=this._filterFields(a,f);else for(d=0,c=p.length;c>d;d++)p[d]=this._filterFields(p[d],f)}if("DataTable"==o){var m=this._getColumnNames(n);if(void 0!=t)s._appendRow(n,m,a);else for(d=0,c=p.length;c>d;d++)s._appendRow(n,m,p[d]);return n}if(void 0!=t)return a;if(n){for(d=0,c=p.length;c>d;d++)n.push(p[d]);return n}return p},r.prototype.getIds=function(t){var e,i,n,s,r,o=this.data,a=t&&t.filter,h=t&&t.order,d=t&&t.convert||this.options.convert,c=[];if(a)if(h){r=[];for(n in o)o.hasOwnProperty(n)&&(s=this._getItem(n,d),a(s)&&r.push(s));for(this._sort(r,h),e=0,i=r.length;i>e;e++)c[e]=r[e][this.fieldId]}else for(n in o)o.hasOwnProperty(n)&&(s=this._getItem(n,d),a(s)&&c.push(s[this.fieldId]));else if(h){r=[];for(n in o)o.hasOwnProperty(n)&&r.push(o[n]);for(this._sort(r,h),e=0,i=r.length;i>e;e++)c[e]=r[e][this.fieldId]}else for(n in o)o.hasOwnProperty(n)&&(s=o[n],c.push(s[this.fieldId]));return c},r.prototype.forEach=function(t,e){var i,n,s=e&&e.filter,r=e&&e.convert||this.options.convert,o=this.data;if(e&&e.order)for(var a=this.get(e),h=0,d=a.length;d>h;h++)i=a[h],n=i[this.fieldId],t(i,n);else for(n in o)o.hasOwnProperty(n)&&(i=this._getItem(n,r),(!s||s(i))&&t(i,n))},r.prototype.map=function(t,e){var i,n=e&&e.filter,s=e&&e.convert||this.options.convert,r=[],o=this.data;for(var a in o)o.hasOwnProperty(a)&&(i=this._getItem(a,s),(!n||n(i))&&r.push(t(i,a)));return e&&e.order&&this._sort(r,e.order),r},r.prototype._filterFields=function(t,e){var i={};for(var n in t)t.hasOwnProperty(n)&&-1!=e.indexOf(n)&&(i[n]=t[n]);return i},r.prototype._sort=function(t,e){if(A.isString(e)){var i=e;t.sort(function(t,e){var n=t[i],s=e[i];return n>s?1:s>n?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},r.prototype.remove=function(t,e){var i,n,s,r=[];if(t instanceof Array)for(i=0,n=t.length;n>i;i++)s=this._remove(t[i]),null!=s&&r.push(s);else s=this._remove(t),null!=s&&r.push(s);return r.length&&this._trigger("remove",{items:r},e),r},r.prototype._remove=function(t){if(A.isNumber(t)||A.isString(t)){if(this.data[t])return delete this.data[t],delete this.internalIds[t],t}else if(t instanceof Object){var e=t[this.fieldId];if(e&&this.data[e])return delete this.data[e],delete this.internalIds[e],e}return null},r.prototype.clear=function(t){var e=Object.keys(this.data);return this.data={},this.internalIds={},this._trigger("remove",{items:e},t),e},r.prototype.max=function(t){var e=this.data,i=null,n=null;for(var s in e)if(e.hasOwnProperty(s)){var r=e[s],o=r[t];null!=o&&(!i||o>n)&&(i=r,n=o)}return i},r.prototype.min=function(t){var e=this.data,i=null,n=null;for(var s in e)if(e.hasOwnProperty(s)){var r=e[s],o=r[t];null!=o&&(!i||n>o)&&(i=r,n=o)}return i},r.prototype.distinct=function(t){var e=this.data,i=[],n=this.options.convert[t],s=0;for(var r in e)if(e.hasOwnProperty(r)){for(var o=e[r],a=A.convert(o[t],n),h=!1,d=0;s>d;d++)if(i[d]==a){h=!0;break}h||(i[s]=a,s++)}return i},r.prototype._addItem=function(t){var e=t[this.fieldId];if(void 0!=e){if(this.data[e])throw new Error("Cannot add item: item with id "+e+" already exists")}else e=A.randomUUID(),t[this.fieldId]=e,this.internalIds[e]=t;var i={};for(var n in t)if(t.hasOwnProperty(n)){var s=this.convert[n];i[n]=A.convert(t[n],s)}return this.data[e]=i,e},r.prototype._getItem=function(t,e){var i,n,s=this.data[t];if(!s)return null;var r={},o=this.fieldId,a=this.internalIds;if(e)for(i in s)s.hasOwnProperty(i)&&(n=s[i],i==o&&n in a||(r[i]=A.convert(n,e[i])));else for(i in s)s.hasOwnProperty(i)&&(n=s[i],i==o&&n in a||(r[i]=n));return r},r.prototype._updateItem=function(t){var e=t[this.fieldId];if(void 0==e)throw new Error("Cannot update item: item has no id (item: "+JSON.stringify(t)+")");var i=this.data[e];if(!i)throw new Error("Cannot update item: no item with id "+e+" found");for(var n in t)if(t.hasOwnProperty(n)){var s=this.convert[n];i[n]=A.convert(t[n],s)}return e},r.prototype._getColumnNames=function(t){for(var e=[],i=0,n=t.getNumberOfColumns();n>i;i++)e[i]=t.getColumnId(i)||t.getColumnLabel(i);return e},r.prototype._appendRow=function(t,e,i){for(var n=t.addRow(),s=0,r=e.length;r>s;s++){var o=e[s];t.setValue(n,s,i[o])}},o.prototype.setData=function(t){var e,i,n;if(this.data){this.data.unsubscribe&&this.data.unsubscribe("*",this.listener),e=[];for(var s in this.ids)this.ids.hasOwnProperty(s)&&e.push(s);this.ids={},this._trigger("remove",{items:e})}if(this.data=t,this.data){for(this.fieldId=this.options.fieldId||this.data&&this.data.options&&this.data.options.fieldId||"id",e=this.data.getIds({filter:this.options&&this.options.filter}),i=0,n=e.length;n>i;i++)s=e[i],this.ids[s]=!0;this._trigger("add",{items:e}),this.data.subscribe&&this.data.subscribe("*",this.listener)}},o.prototype.get=function(){var t,e,i,n=this,s=A.getType(arguments[0]);"String"==s||"Number"==s||"Array"==s?(t=arguments[0],e=arguments[1],i=arguments[2]):(e=arguments[0],i=arguments[1]);var r=A.extend({},this.options,e);this.options.filter&&e&&e.filter&&(r.filter=function(t){return n.options.filter(t)&&e.filter(t)});var o=[];return void 0!=t&&o.push(t),o.push(r),o.push(i),this.data&&this.data.get.apply(this.data,o)},o.prototype.getIds=function(t){var e;if(this.data){var i,n=this.options.filter;i=t&&t.filter?n?function(e){return n(e)&&t.filter(e)}:t.filter:n,e=this.data.getIds({filter:i,order:t&&t.order})}else e=[];return e},o.prototype._onEvent=function(t,e,i){var n,s,r,o,a=e&&e.items,h=this.data,d=[],c=[],u=[];if(a&&h){switch(t){case"add":for(n=0,s=a.length;s>n;n++)r=a[n],o=this.get(r),o&&(this.ids[r]=!0,d.push(r));break;case"update":for(n=0,s=a.length;s>n;n++)r=a[n],o=this.get(r),o?this.ids[r]?c.push(r):(this.ids[r]=!0,d.push(r)):this.ids[r]&&(delete this.ids[r],u.push(r));break;case"remove":for(n=0,s=a.length;s>n;n++)r=a[n],this.ids[r]&&(delete this.ids[r],u.push(r))}d.length&&this._trigger("add",{items:d},i),c.length&&this._trigger("update",{items:c},i),u.length&&this._trigger("remove",{items:u},i)}},o.prototype.subscribe=r.prototype.subscribe,o.prototype.unsubscribe=r.prototype.unsubscribe,o.prototype._trigger=r.prototype._trigger,TimeStep=function(t,e,i){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale=TimeStep.SCALE.DAY,this.step=1,this.setRange(t,e,i)},TimeStep.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},TimeStep.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},TimeStep.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},TimeStep.prototype.roundToMinor=function(){switch(this.scale){case TimeStep.SCALE.YEAR:this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case TimeStep.SCALE.MONTH:this.current.setDate(1);case TimeStep.SCALE.DAY:case TimeStep.SCALE.WEEKDAY:this.current.setHours(0);case TimeStep.SCALE.HOUR:this.current.setMinutes(0);case TimeStep.SCALE.MINUTE:this.current.setSeconds(0);case TimeStep.SCALE.SECOND:this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case TimeStep.SCALE.MILLISECOND:this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case TimeStep.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case TimeStep.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step);break;case TimeStep.SCALE.HOUR:this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case TimeStep.SCALE.MONTH:this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case TimeStep.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},TimeStep.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},TimeStep.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case TimeStep.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case TimeStep.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case TimeStep.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case TimeStep.SCALE.HOUR:this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case TimeStep.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case TimeStep.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case TimeStep.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case TimeStep.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()+this.step);break;case TimeStep.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()+this.step);break;case TimeStep.SCALE.HOUR:this.current.setHours(this.current.getHours()+this.step);break;case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case TimeStep.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case TimeStep.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case TimeStep.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},TimeStep.prototype.setAutoScale=function(t){this.autoScale=t},TimeStep.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,n=864e5,s=36e5,r=6e4,o=1e3,a=1;1e3*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=5),e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=TimeStep.SCALE.MONTH,this.step=3),i>t&&(this.scale=TimeStep.SCALE.MONTH,this.step=1),5*n>t&&(this.scale=TimeStep.SCALE.DAY,this.step=5),2*n>t&&(this.scale=TimeStep.SCALE.DAY,this.step=2),n>t&&(this.scale=TimeStep.SCALE.DAY,this.step=1),n/2>t&&(this.scale=TimeStep.SCALE.WEEKDAY,this.step=1),4*s>t&&(this.scale=TimeStep.SCALE.HOUR,this.step=4),s>t&&(this.scale=TimeStep.SCALE.HOUR,this.step=1),15*r>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=15),10*r>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=10),5*r>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=5),r>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=1),15*o>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=15),10*o>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=10),5*o>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=5),o>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=1),200*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=200),100*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=100),50*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=50),10*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=10),5*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=5),a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=1)}},TimeStep.prototype.snap=function(t){if(this.scale==TimeStep.SCALE.YEAR){var e=t.getFullYear()+Math.round(t.getMonth()/12);t.setFullYear(Math.round(e/this.step)*this.step),t.setMonth(0),t.setDate(0),t.setHours(0),t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0)}else if(this.scale==TimeStep.SCALE.MONTH)t.getDate()>15?(t.setDate(1),t.setMonth(t.getMonth()+1)):t.setDate(1),t.setHours(0),t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0);else if(this.scale==TimeStep.SCALE.DAY||this.scale==TimeStep.SCALE.WEEKDAY){switch(this.step){case 5:case 2:t.setHours(24*Math.round(t.getHours()/24));break;default:t.setHours(12*Math.round(t.getHours()/12))}t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0)}else if(this.scale==TimeStep.SCALE.HOUR){switch(this.step){case 4:t.setMinutes(60*Math.round(t.getMinutes()/60));break;default:t.setMinutes(30*Math.round(t.getMinutes()/30))}t.setSeconds(0),t.setMilliseconds(0)}else if(this.scale==TimeStep.SCALE.MINUTE){switch(this.step){case 15:case 10:t.setMinutes(5*Math.round(t.getMinutes()/5)),t.setSeconds(0);break;case 5:t.setSeconds(60*Math.round(t.getSeconds()/60));break;default:t.setSeconds(30*Math.round(t.getSeconds()/30))}t.setMilliseconds(0)}else if(this.scale==TimeStep.SCALE.SECOND)switch(this.step){case 15:case 10:t.setSeconds(5*Math.round(t.getSeconds()/5)),t.setMilliseconds(0);break;case 5:t.setMilliseconds(1e3*Math.round(t.getMilliseconds()/1e3));break;default:t.setMilliseconds(500*Math.round(t.getMilliseconds()/500))}else if(this.scale==TimeStep.SCALE.MILLISECOND){var i=this.step>5?this.step/2:1;t.setMilliseconds(Math.round(t.getMilliseconds()/i)*i)}},TimeStep.prototype.isMajor=function(){switch(this.scale){case TimeStep.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case TimeStep.SCALE.SECOND:return 0==this.current.getSeconds();case TimeStep.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case TimeStep.SCALE.HOUR:return 0==this.current.getHours();case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:return 1==this.current.getDate();case TimeStep.SCALE.MONTH:return 0==this.current.getMonth();case TimeStep.SCALE.YEAR:return!1;default:return!1}},TimeStep.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case TimeStep.SCALE.MILLISECOND:return I(t).format("SSS");case TimeStep.SCALE.SECOND:return I(t).format("s");case TimeStep.SCALE.MINUTE:return I(t).format("HH:mm");case TimeStep.SCALE.HOUR:return I(t).format("HH:mm");case TimeStep.SCALE.WEEKDAY:return I(t).format("ddd D");case TimeStep.SCALE.DAY:return I(t).format("D");case TimeStep.SCALE.MONTH:return I(t).format("MMM");case TimeStep.SCALE.YEAR:return I(t).format("YYYY");default:return""}},TimeStep.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case TimeStep.SCALE.MILLISECOND:return I(t).format("HH:mm:ss");case TimeStep.SCALE.SECOND:return I(t).format("D MMMM HH:mm");case TimeStep.SCALE.MINUTE:case TimeStep.SCALE.HOUR:return I(t).format("ddd D MMMM");case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:return I(t).format("MMMM YYYY");case TimeStep.SCALE.MONTH:return I(t).format("YYYY");case TimeStep.SCALE.YEAR:return"";default:return""}},a.prototype.setOptions=function(t){A.extend(this.options,t)},a.prototype.update=function(){this._order(),this._stack()},a.prototype._order=function(){var t=this.parent.items;if(!t)throw new Error("Cannot stack items: parent does not contain items");var e=[],i=0;A.forEach(t,function(t){t.visible&&(e[i]=t,i++)});var n=this.options.order||this.defaultOptions.order;if("function"!=typeof n)throw new Error("Option order must be a function");e.sort(n),this.ordered=e},a.prototype._stack=function(){var t,e,i,n=this.ordered,s=this.options,r=s.orientation||this.defaultOptions.orientation,o="top"==r;for(i=s.margin&&void 0!==s.margin.item?s.margin.item:this.defaultOptions.margin.item,t=0,e=n.length;e>t;t++){var a=n[t],h=null;do h=this.checkOverlap(n,t,0,t-1,i),null!=h&&(a.top=o?h.top+h.height+i:h.top-a.height-i);while(h)}},a.prototype.checkOverlap=function(t,e,i,n,s){for(var r=this.collision,o=t[e],a=n;a>=i;a--){var h=t[a];if(r(o,h,s)&&a!=e)return h}return null},a.prototype.collision=function(t,e,i){return t.left-ie.left&&t.top-ie.top},h.prototype.setOptions=function(t){A.extend(this.options,t),null!==this.start&&null!==this.end&&this.setRange(this.start,this.end)},h.prototype.subscribe=function(t,e,i){function n(e){s._onMouseWheel(e,t,i)}var s=this;if("move"==e)t.on("dragstart",function(e){s._onDragStart(e,t)}),t.on("drag",function(e){s._onDrag(e,t,i)}),t.on("dragend",function(e){s._onDragEnd(e,t)});else{if("zoom"!=e)throw new TypeError('Unknown event "'+e+'". Choose "move" or "zoom".');t.on("mousewheel",n),t.on("DOMMouseScroll",n),t.on("touch",function(){s._onTouch()}),t.on("pinch",function(e){s._onPinch(e,t,i)})}},h.prototype.on=function(t,e){Y.addListener(this,t,e)},h.prototype._trigger=function(t){Y.trigger(this,t,{start:this.start,end:this.end})},h.prototype.setRange=function(t,e){var i=this._applyRange(t,e);i&&(this._trigger("rangechange"),this._trigger("rangechanged"))},h.prototype._applyRange=function(t,e){var i,n=null!=t?A.convert(t,"Number"):this.start,s=null!=e?A.convert(e,"Number"):this.end,r=null!=this.options.max?A.convert(this.options.max,"Date").valueOf():null,o=null!=this.options.min?A.convert(this.options.min,"Date").valueOf():null;if(isNaN(n)||null===n)throw new Error('Invalid start "'+t+'"');if(isNaN(s)||null===s)throw new Error('Invalid end "'+e+'"');if(n>s&&(s=n),null!==o&&o>n&&(i=o-n,n+=i,s+=i,null!=r&&s>r&&(s=r)),null!==r&&s>r&&(i=s-r,n-=i,s-=i,null!=o&&o>n&&(n=o)),null!==this.options.zoomMin){var a=parseFloat(this.options.zoomMin);0>a&&(a=0),a>s-n&&(this.end-this.start===a?(n=this.start,s=this.end):(i=a-(s-n),n-=i/2,s+=i/2))}if(null!==this.options.zoomMax){var h=parseFloat(this.options.zoomMax);0>h&&(h=0),s-n>h&&(this.end-this.start===h?(n=this.start,s=this.end):(i=s-n-h,n+=i/2,s-=i/2))}var d=this.start!=n||this.end!=s;return this.start=n,this.end=s,d},h.prototype.getRange=function(){return{start:this.start,end:this.end}},h.prototype.conversion=function(t){return h.conversion(this.start,this.end,t)},h.conversion=function(t,e,i){return 0!=i&&e-t!=0?{offset:t,scale:i/(e-t)}:{offset:0,scale:1}};var F={};h.prototype._onDragStart=function(t,e){if(!F.pinching){F.start=this.start,F.end=this.end;var i=e.frame;i&&(i.style.cursor="move")}},h.prototype._onDrag=function(t,e,i){if(d(i),!F.pinching){var n="horizontal"==i?t.gesture.deltaX:t.gesture.deltaY,s=F.end-F.start,r="horizontal"==i?e.width:e.height,o=-n/r*s;this._applyRange(F.start+o,F.end+o),this._trigger("rangechange")}},h.prototype._onDragEnd=function(t,e){F.pinching||(e.frame&&(e.frame.style.cursor="auto"),this._trigger("rangechanged"))},h.prototype._onMouseWheel=function(t,e,i){d(i);var n=0;if(t.wheelDelta?n=t.wheelDelta/120:t.detail&&(n=-t.detail/3),n){var s;s=0>n?1-n/5:1/(1+n/5);var r=A.fakeGesture(this,t),o=c(r.touches[0],e.frame),a=this._pointerToDate(e,i,o);this.zoom(s,a)}A.preventDefault(t)},h.prototype._onTouch=function(){F.start=this.start,F.end=this.end,F.pinching=!1,F.center=null},h.prototype._onPinch=function(t,e,i){if(F.pinching=!0,t.gesture.touches.length>1){F.center||(F.center=c(t.gesture.center,e.frame));var n=1/t.gesture.scale,s=this._pointerToDate(e,i,F.center),r=c(t.gesture.center,e.frame),o=(this._pointerToDate(e,i,r),parseInt(s+(F.start-s)*n)),a=parseInt(s+(F.end-s)*n);this.setRange(o,a)}},h.prototype._pointerToDate=function(t,e,i){var n;if("horizontal"==e){var s=t.width;return n=this.conversion(s),i.x/n.scale+n.offset}var r=t.height;return n=this.conversion(r),i.y/n.scale+n.offset},h.prototype.zoom=function(t,e){null==e&&(e=(this.start+this.end)/2);var i=e+(this.start-e)*t,n=e+(this.end-e)*t;this.setRange(i,n)},h.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,n=this.end+e*t;this.start=i,this.end=n},h.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,n=this.start-i,s=this.end-i;this.setRange(n,s)},u.prototype.add=function(t){if(void 0==t.id)throw new Error("Component has no field id");if(!(t instanceof l||t instanceof u))throw new TypeError("Component must be an instance of prototype Component or Controller");t.controller=this,this.components[t.id]=t},u.prototype.remove=function(t){var e;for(e in this.components)if(this.components.hasOwnProperty(e)&&(e==t||this.components[e]==t))break;e&&delete this.components[e]},u.prototype.requestReflow=function(t){if(t)this.reflow();else if(!this.reflowTimer){var e=this;this.reflowTimer=setTimeout(function(){e.reflowTimer=void 0,e.reflow()},0)}},u.prototype.requestRepaint=function(t){if(t)this.repaint();else if(!this.repaintTimer){var e=this;this.repaintTimer=setTimeout(function(){e.repaintTimer=void 0,e.repaint()},0)}},u.prototype.repaint=function H(){function H(i,n){n in e||(i.depends&&i.depends.forEach(function(t){H(t,t.id)}),i.parent&&H(i.parent,i.parent.id),t=i.repaint()||t,e[n]=!0)}var t=!1;this.repaintTimer&&(clearTimeout(this.repaintTimer),this.repaintTimer=void 0);var e={};A.forEach(this.components,H),t&&this.reflow()},u.prototype.reflow=function z(){function z(i,n){n in e||(i.depends&&i.depends.forEach(function(t){z(t,t.id)}),i.parent&&z(i.parent,i.parent.id),t=i.reflow()||t,e[n]=!0)}var t=!1;this.reflowTimer&&(clearTimeout(this.reflowTimer),this.reflowTimer=void 0);var e={};A.forEach(this.components,z),t&&this.repaint()},l.prototype.setOptions=function(t){t&&(A.extend(this.options,t),this.controller&&(this.requestRepaint(),this.requestReflow()))},l.prototype.getOption=function(t){var e;return this.options&&(e=this.options[t]),void 0===e&&this.defaultOptions&&(e=this.defaultOptions[t]),e},l.prototype.getContainer=function(){return null},l.prototype.getFrame=function(){return this.frame},l.prototype.repaint=function(){return!1},l.prototype.reflow=function(){return!1},l.prototype.hide=function(){return this.frame&&this.frame.parentNode?(this.frame.parentNode.removeChild(this.frame),!0):!1},l.prototype.show=function(){return this.frame&&this.frame.parentNode?!1:this.repaint()},l.prototype.requestRepaint=function(){if(!this.controller)throw new Error("Cannot request a repaint: no controller configured");this.controller.requestRepaint()},l.prototype.requestReflow=function(){if(!this.controller)throw new Error("Cannot request a reflow: no controller configured");this.controller.requestReflow()},p.prototype=new l,p.prototype.setOptions=l.prototype.setOptions,p.prototype.getContainer=function(){return this.frame},p.prototype.repaint=function(){var t=0,e=A.updateProperty,i=A.option.asSize,n=this.options,s=this.frame;if(!s){s=document.createElement("div"),s.className="panel";var r=n.className;r&&("function"==typeof r?A.addClassName(s,String(r())):A.addClassName(s,String(r))),this.frame=s,t+=1}if(!s.parentNode){if(!this.parent)throw new Error("Cannot repaint panel: no parent attached");var o=this.parent.getContainer();if(!o)throw new Error("Cannot repaint panel: parent has no container element");o.appendChild(s),t+=1}return t+=e(s.style,"top",i(n.top,"0px")),t+=e(s.style,"left",i(n.left,"0px")),t+=e(s.style,"width",i(n.width,"100%")),t+=e(s.style,"height",i(n.height,"100%")),t>0},p.prototype.reflow=function(){var t=0,e=A.updateProperty,i=this.frame;return i?(t+=e(this,"top",i.offsetTop),t+=e(this,"left",i.offsetLeft),t+=e(this,"width",i.offsetWidth),t+=e(this,"height",i.offsetHeight)):t+=1,t>0},f.prototype=new p,f.prototype.setOptions=l.prototype.setOptions,f.prototype.repaint=function(){var t=0,e=A.updateProperty,i=A.option.asSize,n=this.options,s=this.frame;if(s||(s=document.createElement("div"),this.frame=s,t+=1),!s.parentNode){if(!this.container)throw new Error("Cannot repaint root panel: no container attached");this.container.appendChild(s),t+=1}s.className="vis timeline rootpanel "+n.orientation;var r=n.className;return r&&A.addClassName(s,A.option.asString(r)),t+=e(s.style,"top",i(n.top,"0px")),t+=e(s.style,"left",i(n.left,"0px")),t+=e(s.style,"width",i(n.width,"100%")),t+=e(s.style,"height",i(n.height,"100%")),this._updateEventEmitters(),this._updateWatch(),t>0},f.prototype.reflow=function(){var t=0,e=A.updateProperty,i=this.frame;return i?(t+=e(this,"top",i.offsetTop),t+=e(this,"left",i.offsetLeft),t+=e(this,"width",i.offsetWidth),t+=e(this,"height",i.offsetHeight)):t+=1,t>0},f.prototype._updateWatch=function(){var t=this.getOption("autoResize");t?this._watch():this._unwatch()},f.prototype._watch=function(){var t=this;this._unwatch();var e=function(){var e=t.getOption("autoResize");return e?(t.frame&&(t.frame.clientWidth!=t.width||t.frame.clientHeight!=t.height)&&t.requestReflow(),void 0):(t._unwatch(),void 0)};A.addEventListener(window,"resize",e),this.watchTimer=setInterval(e,1e3)},f.prototype._unwatch=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0)},f.prototype.on=function(t,e){var i=this.listeners[t];i||(i=[],this.listeners[t]=i),i.push(e),this._updateEventEmitters()},f.prototype._updateEventEmitters=function(){if(this.listeners){var t=this;A.forEach(this.listeners,function(e,i){if(t.emitters||(t.emitters={}),!(i in t.emitters)){var n=t.frame;if(n){var s=function(t){e.forEach(function(e){e(t)})};t.emitters[i]=s,t.hammer||(t.hammer=L(n,{prevent_default:!0})),t.hammer.on(i,s)}}})}},m.prototype=new l,m.prototype.setOptions=l.prototype.setOptions,m.prototype.setRange=function(t){if(!(t instanceof h||t&&t.start&&t.end))throw new TypeError("Range must be an instance of Range, or an object containing start and end.");this.range=t},m.prototype.toTime=function(t){var e=this.conversion;return new Date(t/e.scale+e.offset)},m.prototype.toScreen=function(t){var e=this.conversion;return(t.valueOf()-e.offset)*e.scale},m.prototype.repaint=function(){var t=0,e=A.updateProperty,i=A.option.asSize,n=this.options,s=this.getOption("orientation"),r=this.props,o=this.step,a=this.frame;if(a||(a=document.createElement("div"),this.frame=a,t+=1),a.className="axis",!a.parentNode){if(!this.parent)throw new Error("Cannot repaint time axis: no parent attached");var h=this.parent.getContainer();if(!h)throw new Error("Cannot repaint time axis: parent has no container element");h.appendChild(a),t+=1}var d=a.parentNode;if(d){var c=a.nextSibling;d.removeChild(a);var u="bottom"==s&&this.props.parentHeight&&this.height?this.props.parentHeight-this.height+"px":"0px";if(t+=e(a.style,"top",i(n.top,u)),t+=e(a.style,"left",i(n.left,"0px")),t+=e(a.style,"width",i(n.width,"100%")),t+=e(a.style,"height",i(n.height,this.height+"px")),this._repaintMeasureChars(),this.step){this._repaintStart(),o.first();for(var l=void 0,p=0;o.hasNext()&&1e3>p;){p++;var f=o.getCurrent(),m=this.toScreen(f),g=o.isMajor();this.getOption("showMinorLabels")&&this._repaintMinorText(m,o.getLabelMinor()),g&&this.getOption("showMajorLabels")?(m>0&&(void 0==l&&(l=m),this._repaintMajorText(m,o.getLabelMajor())),this._repaintMajorLine(m)):this._repaintMinorLine(m),o.next()}if(this.getOption("showMajorLabels")){var v=this.toTime(0),y=o.getLabelMajor(v),w=y.length*(r.majorCharWidth||10)+10;(void 0==l||l>w)&&this._repaintMajorText(0,y)}this._repaintEnd()}this._repaintLine(),c?d.insertBefore(a,c):d.appendChild(a)}return t>0},m.prototype._repaintStart=function(){var t=this.dom,e=t.redundant;e.majorLines=t.majorLines,e.majorTexts=t.majorTexts,e.minorLines=t.minorLines,e.minorTexts=t.minorTexts,t.majorLines=[],t.majorTexts=[],t.minorLines=[],t.minorTexts=[]},m.prototype._repaintEnd=function(){A.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},m.prototype._repaintMinorText=function(t,e){var i=this.dom.redundant.minorTexts.shift();if(!i){var n=document.createTextNode("");i=document.createElement("div"),i.appendChild(n),i.className="text minor",this.frame.appendChild(i)}this.dom.minorTexts.push(i),i.childNodes[0].nodeValue=e,i.style.left=t+"px",i.style.top=this.props.minorLabelTop+"px"},m.prototype._repaintMajorText=function(t,e){var i=this.dom.redundant.majorTexts.shift();if(!i){var n=document.createTextNode(e);i=document.createElement("div"),i.className="text major",i.appendChild(n),this.frame.appendChild(i)}this.dom.majorTexts.push(i),i.childNodes[0].nodeValue=e,i.style.top=this.props.majorLabelTop+"px",i.style.left=t+"px"},m.prototype._repaintMinorLine=function(t){var e=this.dom.redundant.minorLines.shift();e||(e=document.createElement("div"),e.className="grid vertical minor",this.frame.appendChild(e)),this.dom.minorLines.push(e);var i=this.props;e.style.top=i.minorLineTop+"px",e.style.height=i.minorLineHeight+"px",e.style.left=t-i.minorLineWidth/2+"px"},m.prototype._repaintMajorLine=function(t){var e=this.dom.redundant.majorLines.shift();e||(e=document.createElement("DIV"),e.className="grid vertical major",this.frame.appendChild(e)),this.dom.majorLines.push(e);var i=this.props;e.style.top=i.majorLineTop+"px",e.style.left=t-i.majorLineWidth/2+"px",e.style.height=i.majorLineHeight+"px"},m.prototype._repaintLine=function(){{var t=this.dom.line,e=this.frame;this.options}this.getOption("showMinorLabels")||this.getOption("showMajorLabels")?(t?(e.removeChild(t),e.appendChild(t)):(t=document.createElement("div"),t.className="grid horizontal major",e.appendChild(t),this.dom.line=t),t.style.top=this.props.lineTop+"px"):t&&t.parentElement&&(e.removeChild(t.line),delete this.dom.line)},m.prototype._repaintMeasureChars=function(){var t,e=this.dom;if(!e.measureCharMinor){t=document.createTextNode("0");var i=document.createElement("DIV");i.className="text minor measure",i.appendChild(t),this.frame.appendChild(i),e.measureCharMinor=i}if(!e.measureCharMajor){t=document.createTextNode("0");var n=document.createElement("DIV");n.className="text major measure",n.appendChild(t),this.frame.appendChild(n),e.measureCharMajor=n}},m.prototype.reflow=function(){var t=0,e=A.updateProperty,i=this.frame,n=this.range;if(!n)throw new Error("Cannot repaint time axis: no range configured");if(i){t+=e(this,"top",i.offsetTop),t+=e(this,"left",i.offsetLeft);var s=this.props,r=this.getOption("showMinorLabels"),o=this.getOption("showMajorLabels"),a=this.dom.measureCharMinor,h=this.dom.measureCharMajor;a&&(s.minorCharHeight=a.clientHeight,s.minorCharWidth=a.clientWidth),h&&(s.majorCharHeight=h.clientHeight,s.majorCharWidth=h.clientWidth);var d=i.parentNode?i.parentNode.offsetHeight:0;switch(d!=s.parentHeight&&(s.parentHeight=d,t+=1),this.getOption("orientation")){case"bottom":s.minorLabelHeight=r?s.minorCharHeight:0,s.majorLabelHeight=o?s.majorCharHeight:0,s.minorLabelTop=0,s.majorLabelTop=s.minorLabelTop+s.minorLabelHeight,s.minorLineTop=-this.top,s.minorLineHeight=Math.max(this.top+s.majorLabelHeight,0),s.minorLineWidth=1,s.majorLineTop=-this.top,s.majorLineHeight=Math.max(this.top+s.minorLabelHeight+s.majorLabelHeight,0),s.majorLineWidth=1,s.lineTop=0;break;case"top":s.minorLabelHeight=r?s.minorCharHeight:0,s.majorLabelHeight=o?s.majorCharHeight:0,s.majorLabelTop=0,s.minorLabelTop=s.majorLabelTop+s.majorLabelHeight,s.minorLineTop=s.minorLabelTop,s.minorLineHeight=Math.max(d-s.majorLabelHeight-this.top),s.minorLineWidth=1,s.majorLineTop=0,s.majorLineHeight=Math.max(d-this.top),s.majorLineWidth=1,s.lineTop=s.majorLabelHeight+s.minorLabelHeight;break;default:throw new Error('Unkown orientation "'+this.getOption("orientation")+'"')}var c=s.minorLabelHeight+s.majorLabelHeight;t+=e(this,"width",i.offsetWidth),t+=e(this,"height",c),this._updateConversion();var u=A.convert(n.start,"Number"),l=A.convert(n.end,"Number"),p=this.toTime(5*(s.minorCharWidth||10)).valueOf()-this.toTime(0).valueOf();this.step=new TimeStep(new Date(u),new Date(l),p),t+=e(s.range,"start",u),t+=e(s.range,"end",l),t+=e(s.range,"minimumStep",p.valueOf())}return t>0},m.prototype._updateConversion=function(){var t=this.range;if(!t)throw new Error("No range configured");this.conversion=t.conversion?t.conversion(this.width):h.conversion(t.start,t.end,this.width)},g.prototype=new l,g.prototype.setOptions=l.prototype.setOptions,g.prototype.getContainer=function(){return this.frame},g.prototype.repaint=function(){var t=this.frame,e=this.parent,i=e.parent.getContainer();if(!e)throw new Error("Cannot repaint bar: no parent attached");if(!i)throw new Error("Cannot repaint bar: parent has no container element");if(!this.getOption("showCurrentTime"))return t&&(i.removeChild(t),delete this.frame),void 0;t||(t=document.createElement("div"),t.className="currenttime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",i.appendChild(t),this.frame=t),e.conversion||e._updateConversion();var n=new Date,s=e.toScreen(n);t.style.left=s+"px",t.title="Current time: "+n,void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer);var r=this,o=1/e.conversion.scale/2;return 30>o&&(o=30),this.currentTimeTimer=setTimeout(function(){r.repaint()},o),!1},v.prototype=new l,v.prototype.setOptions=l.prototype.setOptions,v.prototype.getContainer=function(){return this.frame},v.prototype.repaint=function(){var t=this.frame,e=this.parent,i=e.parent.getContainer();if(!e)throw new Error("Cannot repaint bar: no parent attached");if(!i)throw new Error("Cannot repaint bar: parent has no container element");if(!this.getOption("showCustomTime"))return t&&(i.removeChild(t),delete this.frame),void 0;if(!t){t=document.createElement("div"),t.className="customtime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",i.appendChild(t);var n=document.createElement("div");n.style.position="relative",n.style.top="0px",n.style.left="-10px",n.style.height="100%",n.style.width="20px",t.appendChild(n),this.frame=t,this.subscribe(this,"movetime")}e.conversion||e._updateConversion();var s=e.toScreen(this.customTime);return t.style.left=s+"px",t.title="Time: "+this.customTime,!1},v.prototype._setCustomTime=function(t){this.customTime=new Date(t.valueOf()),this.repaint()},v.prototype._getCustomTime=function(){return new Date(this.customTime.valueOf())},v.prototype.subscribe=function(t,e){var i=this,n={component:t,event:e,callback:function(t){i._onMouseDown(t,n)},params:{}};t.on("mousedown",n.callback),i.listeners.push(n)},v.prototype.on=function(t,e){var i=this.frame;if(!i)throw new Error("Cannot add event listener: no parent attached");Y.addListener(this,t,e),A.addEventListener(i,t,e)},v.prototype._onMouseDown=function(t,e){t=t||window.event;var i=e.params,n=t.which?1==t.which:1==t.button;if(n){i.mouseX=A.getPageX(t),i.moved=!1,i.customTime=this.customTime;var s=this;i.onMouseMove||(i.onMouseMove=function(t){s._onMouseMove(t,e)},A.addEventListener(document,"mousemove",i.onMouseMove)),i.onMouseUp||(i.onMouseUp=function(t){s._onMouseUp(t,e)},A.addEventListener(document,"mouseup",i.onMouseUp)),A.stopPropagation(t),A.preventDefault(t)}},v.prototype._onMouseMove=function(t,e){t=t||window.event;var i=e.params,n=this.parent,s=A.getPageX(t);void 0===i.mouseX&&(i.mouseX=s);var r=s-i.mouseX;Math.abs(r)>=1&&(i.moved=!0);var o=n.toScreen(i.customTime),a=o+r,h=n.toTime(a);this._setCustomTime(h),Y.trigger(this,"timechange",{customTime:this.customTime}),A.preventDefault(t)},v.prototype._onMouseUp=function(t,e){t=t||window.event;var i=e.params;i.onMouseMove&&(A.removeEventListener(document,"mousemove",i.onMouseMove),i.onMouseMove=null),i.onMouseUp&&(A.removeEventListener(document,"mouseup",i.onMouseUp),i.onMouseUp=null),i.moved&&Y.trigger(this,"timechanged",{customTime:this.customTime})},y.prototype=new p,y.types={box:_,range:E,rangeoverflow:T,point:b},y.prototype.setOptions=l.prototype.setOptions,y.prototype.setRange=function(t){if(!(t instanceof h||t&&t.start&&t.end))throw new TypeError("Range must be an instance of Range, or an object containing start and end.");this.range=t},y.prototype.repaint=function(){var t=0,e=A.updateProperty,i=A.option.asSize,n=this.options,s=this.getOption("orientation"),r=this.defaultOptions,o=this.frame;if(!o){o=document.createElement("div"),o.className="itemset";var a=n.className;a&&A.addClassName(o,A.option.asString(a));var h=document.createElement("div");h.className="background",o.appendChild(h),this.dom.background=h;var d=document.createElement("div");d.className="foreground",o.appendChild(d),this.dom.foreground=d;var c=document.createElement("div");c.className="itemset-axis",this.dom.axis=c,this.frame=o,t+=1}if(!this.parent)throw new Error("Cannot repaint itemset: no parent attached");var u=this.parent.getContainer();if(!u)throw new Error("Cannot repaint itemset: parent has no container element");o.parentNode||(u.appendChild(o),t+=1),this.dom.axis.parentNode||(u.appendChild(this.dom.axis),t+=1),t+=e(o.style,"left",i(n.left,"0px")),t+=e(o.style,"top",i(n.top,"0px")),t+=e(o.style,"width",i(n.width,"100%")),t+=e(o.style,"height",i(n.height,this.height+"px")),t+=e(this.dom.axis.style,"left",i(n.left,"0px")),t+=e(this.dom.axis.style,"width",i(n.width,"100%")),t+="bottom"==s?e(this.dom.axis.style,"top",this.height+this.top+"px"):e(this.dom.axis.style,"top",this.top+"px"),this._updateConversion();var l=this,p=this.queue,f=this.itemsData,m=this.items,g={};return Object.keys(p).forEach(function(e){var i=p[e],s=m[e];switch(i){case"add":case"update":var o=f&&f.get(e,g);if(o){var a=o.type||o.start&&o.end&&"range"||n.type||"box",h=y.types[a];if(s&&(h&&s instanceof h?(s.data=o,t++):(t+=s.hide(),s=null)),!s){if(!h)throw new TypeError('Unknown item type "'+a+'"');s=new h(l,o,n,r),t++}s.repaint(),m[e]=s}delete p[e];break;case"remove":s&&(t+=s.hide()),delete m[e],delete p[e];break;default:console.log('Error: unknown action "'+i+'"')}}),A.forEach(this.items,function(e){e.visible?(t+=e.show(),e.reposition()):t+=e.hide()}),t>0},y.prototype.getForeground=function(){return this.dom.foreground},y.prototype.getBackground=function(){return this.dom.background},y.prototype.getAxis=function(){return this.dom.axis},y.prototype.reflow=function(){var t=0,e=this.options,i=e.margin&&e.margin.axis||this.defaultOptions.margin.axis,n=e.margin&&e.margin.item||this.defaultOptions.margin.item,s=A.updateProperty,r=A.option.asNumber,o=A.option.asSize,a=this.frame;if(a){this._updateConversion(),A.forEach(this.items,function(e){t+=e.reflow()}),this.stack.update();var h,d=r(e.maxHeight),c=null!=o(e.height);if(c)h=a.offsetHeight;else{var u=this.stack.ordered;if(u.length){var l=u[0].top,p=u[0].top+u[0].height;A.forEach(u,function(t){l=Math.min(l,t.top),p=Math.max(p,t.top+t.height)}),h=p-l+i+n}else h=i+n}null!=d&&(h=Math.min(h,d)),t+=s(this,"height",h),t+=s(this,"top",a.offsetTop),t+=s(this,"left",a.offsetLeft),t+=s(this,"width",a.offsetWidth)}else t+=1;return t>0},y.prototype.hide=function(){var t=!1;return this.frame&&this.frame.parentNode&&(this.frame.parentNode.removeChild(this.frame),t=!0),this.dom.axis&&this.dom.axis.parentNode&&(this.dom.axis.parentNode.removeChild(this.dom.axis),t=!0),t},y.prototype.setItems=function(t){var e,i=this,n=this.itemsData;if(t){if(!(t instanceof r||t instanceof o))throw new TypeError("Data must be an instance of DataSet");this.itemsData=t}else this.itemsData=null;if(n&&(A.forEach(this.listeners,function(t,e){n.unsubscribe(e,t)}),e=n.getIds(),this._onRemove(e)),this.itemsData){var s=this.id;A.forEach(this.listeners,function(t,e){i.itemsData.subscribe(e,t,s)}),e=this.itemsData.getIds(),this._onAdd(e)}},y.prototype.getItems=function(){return this.itemsData},y.prototype._onUpdate=function(t){this._toQueue("update",t)},y.prototype._onAdd=function(t){this._toQueue("add",t)},y.prototype._onRemove=function(t){this._toQueue("remove",t)},y.prototype._toQueue=function(t,e){var i=this.queue;e.forEach(function(e){i[e]=t}),this.controller&&this.requestRepaint()},y.prototype._updateConversion=function(){var t=this.range;if(!t)throw new Error("No range configured");this.conversion=t.conversion?t.conversion(this.width):h.conversion(t.start,t.end,this.width)},y.prototype.toTime=function(t){var e=this.conversion;return new Date(t/e.scale+e.offset)},y.prototype.toScreen=function(t){var e=this.conversion;return(t.valueOf()-e.offset)*e.scale},w.prototype.select=function(){this.selected=!0},w.prototype.unselect=function(){this.selected=!1},w.prototype.show=function(){return!1},w.prototype.hide=function(){return!1},w.prototype.repaint=function(){return!1},w.prototype.reflow=function(){return!1},w.prototype.getWidth=function(){return this.width},_.prototype=new w(null,null),_.prototype.select=function(){this.selected=!0},_.prototype.unselect=function(){this.selected=!1},_.prototype.repaint=function(){var t=!1,e=this.dom;if(e||(this._create(),e=this.dom,t=!0),e){if(!this.parent)throw new Error("Cannot repaint item: no parent attached");if(!e.box.parentNode){var i=this.parent.getForeground();if(!i)throw new Error("Cannot repaint time axis: parent has no foreground container element");i.appendChild(e.box),t=!0}if(!e.line.parentNode){var n=this.parent.getBackground();if(!n)throw new Error("Cannot repaint time axis: parent has no background container element");n.appendChild(e.line),t=!0}if(!e.dot.parentNode){var s=this.parent.getAxis();if(!n)throw new Error("Cannot repaint time axis: parent has no axis container element");s.appendChild(e.dot),t=!0}if(this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)e.content.innerHTML="",e.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);e.content.innerHTML=this.content}t=!0}var r=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=r&&(this.className=r,e.box.className="item box"+r,e.line.className="item line"+r,e.dot.className="item dot"+r,t=!0)}return t},_.prototype.show=function(){return this.dom&&this.dom.box.parentNode?!1:this.repaint() -},_.prototype.hide=function(){var t=!1,e=this.dom;return e&&(e.box.parentNode&&(e.box.parentNode.removeChild(e.box),t=!0),e.line.parentNode&&e.line.parentNode.removeChild(e.line),e.dot.parentNode&&e.dot.parentNode.removeChild(e.dot)),t},_.prototype.reflow=function(){var t,e,i,n,s,r,o,a,h,d,c,u,l=0;if(void 0==this.data.start)throw new Error('Property "start" missing in item '+this.data.id);if(c=this.data,u=this.parent&&this.parent.range,c&&u){var p=u.end-u.start;this.visible=c.start>u.start-p&&c.start0},_.prototype._create=function(){var t=this.dom;t||(this.dom=t={},t.box=document.createElement("DIV"),t.content=document.createElement("DIV"),t.content.className="content",t.box.appendChild(t.content),t.line=document.createElement("DIV"),t.line.className="line",t.dot=document.createElement("DIV"),t.dot.className="dot")},_.prototype.reposition=function(){var t=this.dom,e=this.props,i=this.options.orientation||this.defaultOptions.orientation;if(t){var n=t.box,s=t.line,r=t.dot;n.style.left=this.left+"px",n.style.top=this.top+"px",s.style.left=e.line.left+"px","top"==i?(s.style.top="0px",s.style.height=this.top+"px"):(s.style.top=this.top+this.height+"px",s.style.height=Math.max(this.parent.height-this.top-this.height+this.props.dot.height/2,0)+"px"),r.style.left=e.dot.left+"px",r.style.top=e.dot.top+"px"}},b.prototype=new w(null,null),b.prototype.select=function(){this.selected=!0},b.prototype.unselect=function(){this.selected=!1},b.prototype.repaint=function(){var t=!1,e=this.dom;if(e||(this._create(),e=this.dom,t=!0),e){if(!this.parent)throw new Error("Cannot repaint item: no parent attached");var i=this.parent.getForeground();if(!i)throw new Error("Cannot repaint time axis: parent has no foreground container element");if(e.point.parentNode||(i.appendChild(e.point),i.appendChild(e.point),t=!0),this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)e.content.innerHTML="",e.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);e.content.innerHTML=this.content}t=!0}var n=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=n&&(this.className=n,e.point.className="item point"+n,t=!0)}return t},b.prototype.show=function(){return this.dom&&this.dom.point.parentNode?!1:this.repaint()},b.prototype.hide=function(){var t=!1,e=this.dom;return e&&e.point.parentNode&&(e.point.parentNode.removeChild(e.point),t=!0),t},b.prototype.reflow=function(){var t,e,i,n,s,r,o,a,h,d,c=0;if(void 0==this.data.start)throw new Error('Property "start" missing in item '+this.data.id);if(h=this.data,d=this.parent&&this.parent.range,h&&d){var u=d.end-d.start;this.visible=h.start>d.start-u&&h.start0},b.prototype._create=function(){var t=this.dom;t||(this.dom=t={},t.point=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.point.appendChild(t.content),t.dot=document.createElement("div"),t.dot.className="dot",t.point.appendChild(t.dot))},b.prototype.reposition=function(){var t=this.dom,e=this.props;t&&(t.point.style.top=this.top+"px",t.point.style.left=this.left+"px",t.content.style.marginLeft=e.content.marginLeft+"px",t.dot.style.top=e.dot.top+"px")},E.prototype=new w(null,null),E.prototype.select=function(){this.selected=!0},E.prototype.unselect=function(){this.selected=!1},E.prototype.repaint=function(){var t=!1,e=this.dom;if(e||(this._create(),e=this.dom,t=!0),e){if(!this.parent)throw new Error("Cannot repaint item: no parent attached");var i=this.parent.getForeground();if(!i)throw new Error("Cannot repaint time axis: parent has no foreground container element");if(e.box.parentNode||(i.appendChild(e.box),t=!0),this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)e.content.innerHTML="",e.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);e.content.innerHTML=this.content}t=!0}var n=this.data.className?" "+this.data.className:"";this.className!=n&&(this.className=n,e.box.className="item range"+n,t=!0)}return t},E.prototype.show=function(){return this.dom&&this.dom.box.parentNode?!1:this.repaint()},E.prototype.hide=function(){var t=!1,e=this.dom;return e&&e.box.parentNode&&(e.box.parentNode.removeChild(e.box),t=!0),t},E.prototype.reflow=function(){var t,e,i,n,s,r,o,a,h,d,c,u,l,p,f,m,g=0;if(void 0==this.data.start)throw new Error('Property "start" missing in item '+this.data.id);if(void 0==this.data.end)throw new Error('Property "end" missing in item '+this.data.id);return h=this.data,d=this.parent&&this.parent.range,this.visible=h&&d?h.startd.start:!1,this.visible&&(t=this.dom,t?(e=this.props,i=this.options,r=this.parent,o=r.toScreen(this.data.start),a=r.toScreen(this.data.end),c=A.updateProperty,u=t.box,l=r.width,f=i.orientation||this.defaultOptions.orientation,n=i.margin&&i.margin.axis||this.defaultOptions.margin.axis,s=i.padding||this.defaultOptions.padding,g+=c(e.content,"width",t.content.offsetWidth),g+=c(this,"height",u.offsetHeight),-l>o&&(o=-l),a>2*l&&(a=2*l),p=0>o?Math.min(-o,a-o-e.content.width-2*s):0,g+=c(e.content,"left",p),"top"==f?(m=n,g+=c(this,"top",m)):(m=r.height-this.height-n,g+=c(this,"top",m)),g+=c(this,"left",o),g+=c(this,"width",Math.max(a-o,1))):g+=1),g>0},E.prototype._create=function(){var t=this.dom;t||(this.dom=t={},t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content))},E.prototype.reposition=function(){var t=this.dom,e=this.props;t&&(t.box.style.top=this.top+"px",t.box.style.left=this.left+"px",t.box.style.width=this.width+"px",t.content.style.left=e.content.left+"px")},T.prototype=new E(null,null),T.prototype.repaint=function(){var t=!1,e=this.dom;if(e||(this._create(),e=this.dom,t=!0),e){if(!this.parent)throw new Error("Cannot repaint item: no parent attached");var i=this.parent.getForeground();if(!i)throw new Error("Cannot repaint time axis: parent has no foreground container element");if(e.box.parentNode||(i.appendChild(e.box),t=!0),this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)e.content.innerHTML="",e.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);e.content.innerHTML=this.content}t=!0}var n=this.data.className?" "+this.data.className:"";this.className!=n&&(this.className=n,e.box.className="item rangeoverflow"+n,t=!0)}return t},T.prototype.getWidth=function(){return void 0!==this.props.content&&this.width0},x.prototype=new p,x.prototype.setOptions=l.prototype.setOptions,x.prototype.setRange=function(){},x.prototype.setItems=function(t){this.itemsData=t;for(var e in this.groups)if(this.groups.hasOwnProperty(e)){var i=this.groups[e];i.setItems(t)}},x.prototype.getItems=function(){return this.itemsData},x.prototype.setRange=function(t){this.range=t},x.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(A.forEach(this.listeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this._onRemove(e)),t?t instanceof r?this.groupsData=t:(this.groupsData=new r({convert:{start:"Date",end:"Date"}}),this.groupsData.add(t)):this.groupsData=null,this.groupsData){var n=this.id;A.forEach(this.listeners,function(t,e){i.groupsData.subscribe(e,t,n)}),e=this.groupsData.getIds(),this._onAdd(e)}},x.prototype.getGroups=function(){return this.groupsData},x.prototype.repaint=function(){var t,e,i,n,s=0,r=A.updateProperty,o=A.option.asSize,a=A.option.asElement,h=this.options,d=this.dom.frame,c=this.dom.labels,u=this.dom.labelSet;if(!this.parent)throw new Error("Cannot repaint groupset: no parent attached");var l=this.parent.getContainer();if(!l)throw new Error("Cannot repaint groupset: parent has no container element");if(!d){d=document.createElement("div"),d.className="groupset",this.dom.frame=d;var p=h.className;p&&A.addClassName(d,A.option.asString(p)),s+=1}d.parentNode||(l.appendChild(d),s+=1);var f=a(h.labelContainer);if(!f)throw new Error('Cannot repaint groupset: option "labelContainer" not defined');c||(c=document.createElement("div"),c.className="labels",this.dom.labels=c),u||(u=document.createElement("div"),u.className="label-set",c.appendChild(u),this.dom.labelSet=u),c.parentNode&&c.parentNode==f||(c.parentNode&&c.parentNode.removeChild(c.parentNode),f.appendChild(c)),s+=r(d.style,"height",o(h.height,this.height+"px")),s+=r(d.style,"top",o(h.top,"0px")),s+=r(d.style,"left",o(h.left,"0px")),s+=r(d.style,"width",o(h.width,"100%")),s+=r(u.style,"top",o(h.top,"0px")),s+=r(u.style,"height",o(h.height,this.height+"px"));var m=this,g=this.queue,v=this.groups,y=this.groupsData,w=Object.keys(g);if(w.length){w.forEach(function(t){var e=g[t],i=v[t];switch(e){case"add":case"update":if(!i){var n=Object.create(m.options);A.extend(n,{height:null,maxHeight:null}),i=new S(m,t,n),i.setItems(m.itemsData),v[t]=i,m.controller.add(i)}i.data=y.get(t),delete g[t];break;case"remove":i&&(i.setItems(),delete v[t],m.controller.remove(i)),delete g[t];break;default:console.log('Error: unknown action "'+e+'"')}});var _=this.groupsData.getIds({order:this.options.groupOrder});for(t=0;t<_.length;t++)!function(t,e){var i=0;e&&(i=function(){return e.top+e.height}),t.setOptions({top:i})}(v[_[t]],v[_[t-1]]);for(;u.firstChild;)u.removeChild(u.firstChild);for(t=0;t<_.length;t++)e=_[t],n=this._createLabel(e),u.appendChild(n);s++}for(e in v)v.hasOwnProperty(e)&&(i=v[e],n=i.label,n&&(n.style.top=i.top+"px",n.style.height=i.height+"px"));return s>0},x.prototype._createLabel=function(t){var e=this.groups[t],i=document.createElement("div");i.className="label";var n=document.createElement("div");n.className="inner",i.appendChild(n);var s=e.data&&e.data.content;s instanceof Element?n.appendChild(s):void 0!=s&&(n.innerHTML=s);var r=e.data&&e.data.className;return r&&A.addClassName(i,r),e.label=i,i},x.prototype.getContainer=function(){return this.dom.frame},x.prototype.getLabelsWidth=function(){return this.props.labels.width},x.prototype.reflow=function(){var t,e,i=0,n=this.options,s=A.updateProperty,r=A.option.asNumber,o=A.option.asSize,a=this.dom.frame;if(a){var h,d=r(n.maxHeight),c=null!=o(n.height);if(c)h=a.offsetHeight;else{h=0;for(t in this.groups)this.groups.hasOwnProperty(t)&&(e=this.groups[t],h+=e.height)}null!=d&&(h=Math.min(h,d)),i+=s(this,"height",h),i+=s(this,"top",a.offsetTop),i+=s(this,"left",a.offsetLeft),i+=s(this,"width",a.offsetWidth)}var u=0;for(t in this.groups)if(this.groups.hasOwnProperty(t)){e=this.groups[t];var l=e.props&&e.props.label&&e.props.label.width||0;u=Math.max(u,l)}return i+=s(this.props.labels,"width",u),i>0},x.prototype.hide=function(){return this.dom.frame&&this.dom.frame.parentNode?(this.dom.frame.parentNode.removeChild(this.dom.frame),!0):!1},x.prototype.show=function(){return this.dom.frame&&this.dom.frame.parentNode?!1:this.repaint()},x.prototype._onUpdate=function(t){this._toQueue(t,"update")},x.prototype._onAdd=function(t){this._toQueue(t,"add")},x.prototype._onRemove=function(t){this._toQueue(t,"remove")},x.prototype._toQueue=function(t,e){var i=this.queue;t.forEach(function(t){i[t]=e}),this.controller&&this.requestRepaint()},D.prototype.setOptions=function(t){A.extend(this.options,t),this.range.setRange(),this.controller.reflow(),this.controller.repaint()},D.prototype.setCustomTime=function(t){this.customtime._setCustomTime(t)},D.prototype.getCustomTime=function(){return new Date(this.customtime.customTime.valueOf())},D.prototype.setItems=function(t){var e,i=null==this.itemsData;if(t?t instanceof r&&(e=t):e=null,t instanceof r||(e=new r({convert:{start:"Date",end:"Date"}}),e.add(t)),this.itemsData=e,this.content.setItems(e),i&&(void 0==this.options.start||void 0==this.options.end)){var n=this.getItemRange(),s=n.min,o=n.max;if(null!=s&&null!=o){var a=o.valueOf()-s.valueOf();0>=a&&(a=864e5),s=new Date(s.valueOf()-.05*a),o=new Date(o.valueOf()+.05*a)}void 0!=this.options.start&&(s=A.convert(this.options.start,"Date")),void 0!=this.options.end&&(o=A.convert(this.options.end,"Date")),(null!=s||null!=o)&&this.range.setRange(s,o)}},D.prototype.setGroups=function(t){var e=this;this.groupsData=t;var i=this.groupsData?x:y;if(!(this.content instanceof i)){this.content&&(this.content.hide(),this.content.setItems&&this.content.setItems(),this.content.setGroups&&this.content.setGroups(),this.controller.remove(this.content));var n=Object.create(this.options);A.extend(n,{top:function(){return"top"==e.options.orientation?e.timeaxis.height:e.itemPanel.height-e.timeaxis.height-e.content.height},left:null,width:"100%",height:function(){return e.options.height?e.itemPanel.height-e.timeaxis.height:null},maxHeight:function(){if(e.options.maxHeight){if(!A.isNumber(e.options.maxHeight))throw new TypeError("Number expected for property maxHeight");return e.options.maxHeight-e.timeaxis.height}return null},labelContainer:function(){return e.labelPanel.getContainer()}}),this.content=new i(this.itemPanel,[this.timeaxis],n),this.content.setRange&&this.content.setRange(this.range),this.content.setItems&&this.content.setItems(this.itemsData),this.content.setGroups&&this.content.setGroups(this.groupsData),this.controller.add(this.content)}},D.prototype.getItemRange=function(){var t=this.itemsData,e=null,i=null;if(t){var n=t.min("start");e=n?n.start.valueOf():null;var s=t.max("start");s&&(i=s.start.valueOf());var r=t.max("end");r&&(i=null==i?r.end.valueOf():Math.max(i,r.end.valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},function(t){function e(t){return D=t,l()}function i(){M=0,C=D.charAt(0)}function n(){M++,C=D.charAt(M)}function s(){return D.charAt(M+1)}function r(t){return L.test(t)}function o(t,e){if(t||(t={}),e)for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function a(t,e,i){for(var n=e.split("."),s=t;n.length;){var r=n.shift();n.length?(s[r]||(s[r]={}),s=s[r]):s[r]=i}}function h(t,e){for(var i,n,s=null,r=[t],a=t;a.parent;)r.push(a.parent),a=a.parent;if(a.nodes)for(i=0,n=a.nodes.length;n>i;i++)if(e.id===a.nodes[i].id){s=a.nodes[i];break}for(s||(s={id:e.id},t.node&&(s.attr=o(s.attr,t.node))),i=r.length-1;i>=0;i--){var h=r[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(s)&&h.nodes.push(s)}e.attr&&(s.attr=o(s.attr,e.attr))}function d(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=o({},t.edge);e.attr=o(i,e.attr)}}function c(t,e,i,n,s){var r={from:e,to:i,type:n};return t.edge&&(r.attr=o({},t.edge)),r.attr=o(r.attr||{},s),r}function u(){for(N=S.NULL,O="";" "==C||" "==C||"\n"==C||"\r"==C;)n();do{var t=!1;if("#"==C){for(var e=M-1;" "==D.charAt(e)||" "==D.charAt(e);)e--;if("\n"==D.charAt(e)||""==D.charAt(e)){for(;""!=C&&"\n"!=C;)n();t=!0}}if("/"==C&&"/"==s()){for(;""!=C&&"\n"!=C;)n();t=!0}if("/"==C&&"*"==s()){for(;""!=C;){if("*"==C&&"/"==s()){n(),n();break}n()}t=!0}for(;" "==C||" "==C||"\n"==C||"\r"==C;)n()}while(t);if(""==C)return N=S.DELIMITER,void 0;var i=C+s();if(x[i])return N=S.DELIMITER,O=i,n(),n(),void 0;if(x[C])return N=S.DELIMITER,O=C,n(),void 0;if(r(C)||"-"==C){for(O+=C,n();r(C);)O+=C,n();return"false"==O?O=!1:"true"==O?O=!0:isNaN(Number(O))||(O=Number(O)),N=S.IDENTIFIER,void 0}if('"'==C){for(n();""!=C&&('"'!=C||'"'==C&&'"'==s());)O+=C,'"'==C&&n(),n();if('"'!=C)throw _('End of string " expected');return n(),N=S.IDENTIFIER,void 0}for(N=S.UNKNOWN;""!=C;)O+=C,n();throw new SyntaxError('Syntax error in part "'+b(O,30)+'"')}function l(){var t={};if(i(),u(),"strict"==O&&(t.strict=!0,u()),("graph"==O||"digraph"==O)&&(t.type=O,u()),N==S.IDENTIFIER&&(t.id=O,u()),"{"!=O)throw _("Angle bracket { expected");if(u(),p(t),"}"!=O)throw _("Angle bracket } expected");if(u(),""!==O)throw _("End of file expected");return u(),delete t.node,delete t.edge,delete t.graph,t}function p(t){for(;""!==O&&"}"!=O;)f(t),";"==O&&u()}function f(t){var e=m(t);if(e)return y(t,e),void 0;var i=g(t);if(!i){if(N!=S.IDENTIFIER)throw _("Identifier expected");var n=O;if(u(),"="==O){if(u(),N!=S.IDENTIFIER)throw _("Identifier expected");t[n]=O,u()}else v(t,n)}}function m(t){var e=null;if("subgraph"==O&&(e={},e.type="subgraph",u(),N==S.IDENTIFIER&&(e.id=O,u())),"{"==O){if(u(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,p(e),"}"!=O)throw _("Angle bracket } expected");u(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function g(t){return"node"==O?(u(),t.node=w(),"node"):"edge"==O?(u(),t.edge=w(),"edge"):"graph"==O?(u(),t.graph=w(),"graph"):null}function v(t,e){var i={id:e},n=w();n&&(i.attr=n),h(t,i),y(t,e)}function y(t,e){for(;"->"==O||"--"==O;){var i,n=O;u();var s=m(t);if(s)i=s;else{if(N!=S.IDENTIFIER)throw _("Identifier or subgraph expected");i=O,h(t,{id:i}),u()}var r=w(),o=c(t,e,i,n,r);d(t,o),e=i}}function w(){for(var t=null;"["==O;){for(u(),t={};""!==O&&"]"!=O;){if(N!=S.IDENTIFIER)throw _("Attribute name expected");var e=O;if(u(),"="!=O)throw _("Equal sign = expected");if(u(),N!=S.IDENTIFIER)throw _("Attribute value expected");var i=O;a(t,e,i),u(),","==O&&u()}if("]"!=O)throw _("Bracket ] expected");u()}return t}function _(t){return new SyntaxError(t+', got "'+b(O,30)+'" (char '+M+")")}function b(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function E(t,e,i){t instanceof Array?t.forEach(function(t){e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}):e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}function T(t){function i(t){var e={from:t.from,to:t.to};return o(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var n=e(t),s={nodes:[],edges:[],options:{}};return n.nodes&&n.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};o(e,t.attr),e.image&&(e.shape="image"),s.nodes.push(e)}),n.edges&&n.edges.forEach(function(t){var e,n;e=t.from instanceof Object?t.from.nodes:{id:t.from},n=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var e=i(t);s.edges.push(e)}),E(e,n,function(e,n){var r=c(s,e.id,n.id,t.type,t.attr),o=i(r);s.edges.push(o)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var e=i(t);s.edges.push(e)})}),n.attr&&(s.options=n.attr),s}var S={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},x={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},D="",M=0,C="",O="",N=S.NULL,L=/[a-zA-Z_0-9.:#]/;t.parseDOT=e,t.DOTToGraph=T}("undefined"!=typeof A?A:n),"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1)},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i)},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath();var n=2*i,s=n/2,r=Math.sqrt(3)/6*n,o=Math.sqrt(n*n-s*s);this.moveTo(t,e-(o-r)),this.lineTo(t+s,e+r),this.lineTo(t-s,e+r),this.lineTo(t,e-(o-r)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath();var n=2*i,s=n/2,r=Math.sqrt(3)/6*n,o=Math.sqrt(n*n-s*s);this.moveTo(t,e+(o-r)),this.lineTo(t+s,e-r),this.lineTo(t-s,e-r),this.lineTo(t,e+(o-r)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath();for(var n=0;10>n;n++){var s=n%2===0?1.3*i:.5*i;this.lineTo(t+s*Math.sin(2*n*Math.PI/10),e-s*Math.cos(2*n*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,n,s){var r=Math.PI/180;0>i-2*s&&(s=i/2),0>n-2*s&&(s=n/2),this.beginPath(),this.moveTo(t+s,e),this.lineTo(t+i-s,e),this.arc(t+i-s,e+s,s,270*r,360*r,!1),this.lineTo(t+i,e+n-s),this.arc(t+i-s,e+n-s,s,0,90*r,!1),this.lineTo(t+s,e+n),this.arc(t+s,e+n-s,s,90*r,180*r,!1),this.lineTo(t,e+s),this.arc(t+s,e+s,s,180*r,270*r,!1)},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,n){var s=.5522848,r=i/2*s,o=n/2*s,a=t+i,h=e+n,d=t+i/2,c=e+n/2;this.beginPath(),this.moveTo(t,c),this.bezierCurveTo(t,c-o,d-r,e,d,e),this.bezierCurveTo(d+r,e,a,c-o,a,c),this.bezierCurveTo(a,c+o,d+r,h,d,h),this.bezierCurveTo(d-r,h,t,c+o,t,c)},CanvasRenderingContext2D.prototype.database=function(t,e,i,n){var s=1/3,r=i,o=n*s,a=.5522848,h=r/2*a,d=o/2*a,c=t+r,u=e+o,l=t+r/2,p=e+o/2,f=e+(n-o/2),m=e+n;this.beginPath(),this.moveTo(c,p),this.bezierCurveTo(c,p+d,l+h,u,l,u),this.bezierCurveTo(l-h,u,t,p+d,t,p),this.bezierCurveTo(t,p-d,l-h,e,l,e),this.bezierCurveTo(l+h,e,c,p-d,c,p),this.lineTo(c,f),this.bezierCurveTo(c,f+d,l+h,m,l,m),this.bezierCurveTo(l-h,m,t,f+d,t,f),this.lineTo(t,p)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,n){var s=t-n*Math.cos(i),r=e-n*Math.sin(i),o=t-.9*n*Math.cos(i),a=e-.9*n*Math.sin(i),h=s+n/3*Math.cos(i+.5*Math.PI),d=r+n/3*Math.sin(i+.5*Math.PI),c=s+n/3*Math.cos(i-.5*Math.PI),u=r+n/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(o,a),this.lineTo(c,u),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,n,s){s||(s=[10,5]),0==l&&(l=.001);var r=s.length;this.moveTo(t,e);for(var o=i-t,a=n-e,h=a/o,d=Math.sqrt(o*o+a*a),c=0,u=!0;d>=.1;){var l=s[c++%r];l>d&&(l=d);var p=Math.sqrt(l*l/(1+h*h));0>o&&(p=-p),t+=p,e+=h*p,this[u?"lineTo":"moveTo"](t,e),d-=l,u=!u}}),M.prototype.attachEdge=function(t){-1==this.edges.indexOf(t)&&this.edges.push(t),this._updateMass()},M.prototype.detachEdge=function(t){var e=this.edges.indexOf(t);-1!=e&&this.edges.splice(e,1),this._updateMass()},M.prototype._updateMass=function(){this.mass=50+20*this.edges.length},M.prototype.setProperties=function(t,e){if(t){if(void 0!=t.id&&(this.id=t.id),void 0!=t.label&&(this.label=t.label),void 0!=t.title&&(this.title=t.title),void 0!=t.group&&(this.group=t.group),void 0!=t.x&&(this.x=t.x),void 0!=t.y&&(this.y=t.y),void 0!=t.value&&(this.value=t.value),void 0===this.id)throw"Node must have an id";if(this.group){var i=this.grouplist.get(this.group);for(var n in i)i.hasOwnProperty(n)&&(this[n]=i[n])}if(void 0!=t.shape&&(this.shape=t.shape),void 0!=t.image&&(this.image=t.image),void 0!=t.radius&&(this.radius=t.radius),void 0!=t.color&&(this.color=M.parseColor(t.color)),void 0!=t.fontColor&&(this.fontColor=t.fontColor),void 0!=t.fontSize&&(this.fontSize=t.fontSize),void 0!=t.fontFace&&(this.fontFace=t.fontFace),void 0!=this.image){if(!this.imagelist)throw"No imagelist provided";this.imageObj=this.imagelist.load(this.image)}switch(this.xFixed=this.xFixed||void 0!=t.x,this.yFixed=this.yFixed||void 0!=t.y,this.radiusFixed=this.radiusFixed||void 0!=t.radius,"image"==this.shape&&(this.radiusMin=e.nodes.widthMin,this.radiusMax=e.nodes.widthMax),this.shape){case"database":this.draw=this._drawDatabase,this.resize=this._resizeDatabase;break;case"box":this.draw=this._drawBox,this.resize=this._resizeBox;break;case"circle":this.draw=this._drawCircle,this.resize=this._resizeCircle;break;case"ellipse":this.draw=this._drawEllipse,this.resize=this._resizeEllipse;break;case"image":this.draw=this._drawImage,this.resize=this._resizeImage;break;case"text":this.draw=this._drawText,this.resize=this._resizeText;break;case"dot":this.draw=this._drawDot,this.resize=this._resizeShape;break;case"square":this.draw=this._drawSquare,this.resize=this._resizeShape;break;case"triangle":this.draw=this._drawTriangle,this.resize=this._resizeShape;break;case"triangleDown":this.draw=this._drawTriangleDown,this.resize=this._resizeShape;break;case"star":this.draw=this._drawStar,this.resize=this._resizeShape;break;default:this.draw=this._drawEllipse,this.resize=this._resizeEllipse}this._reset()}},M.parseColor=function(t){var e;return A.isString(t)?e={border:t,background:t,highlight:{border:t,background:t}}:(e={},e.background=t.background||"white",e.border=t.border||e.background,A.isString(t.highlight)?e.highlight={border:t.highlight,background:t.highlight}:(e.highlight={},e.highlight.background=t.highlight&&t.highlight.background||e.background,e.highlight.border=t.highlight&&t.highlight.border||e.border)),e},M.prototype.select=function(){this.selected=!0,this._reset()},M.prototype.unselect=function(){this.selected=!1,this._reset()},M.prototype._reset=function(){this.width=void 0,this.height=void 0},M.prototype.getTitle=function(){return this.title},M.prototype.distanceToBorder=function(t,e){var i=1;switch(this.width||this.resize(t),this.shape){case"circle":case"dot":return this.radius+i;case"ellipse":var n=this.width/2,s=this.height/2,r=Math.sin(e)*n,o=Math.cos(e)*s;return n*s/Math.sqrt(r*r+o*o);case"box":case"image":case"text":default:return this.width?Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i:0}},M.prototype._setForce=function(t,e){this.fx=t,this.fy=e},M.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},M.prototype.discreteStep=function(t){if(!this.xFixed){var e=-this.damping*this.vx,i=(this.fx+e)/this.mass;this.vx+=i/t,this.x+=this.vx/t}if(!this.yFixed){var n=-this.damping*this.vy,s=(this.fy+n)/this.mass;this.vy+=s/t,this.y+=this.vy/t}},M.prototype.isFixed=function(){return this.xFixed&&this.yFixed},M.prototype.isMoving=function(t){return Math.abs(this.vx)>t||Math.abs(this.vy)>t||!this.xFixed&&Math.abs(this.fx)>this.minForce||!this.yFixed&&Math.abs(this.fy)>this.minForce},M.prototype.isSelected=function(){return this.selected},M.prototype.getValue=function(){return this.value},M.prototype.getDistance=function(t,e){var i=this.x-t,n=this.y-e;return Math.sqrt(i*i+n*n)},M.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.radius=(this.radiusMin+this.radiusMax)/2;else{var i=(this.radiusMax-this.radiusMin)/(e-t);this.radius=(this.value-t)*i+this.radiusMin}},M.prototype.draw=function(){throw"Draw method not initialized for node"},M.prototype.resize=function(){throw"Resize method not initialized for node"},M.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},M.prototype._resizeImage=function(){if(!this.width){var t,e;if(this.value){var i=this.imageObj.height/this.imageObj.width;t=this.radius||this.imageObj.width,e=this.radius*i||this.imageObj.height}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e}},M.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;this.imageObj?(t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2):e=this.y,this._label(t,this.label,this.x,e,void 0,"top")},M.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e}},M.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,t.strokeStyle=this.selected?this.color.highlight.border:this.color.border,t.fillStyle=this.selected?this.color.highlight.background:this.color.background,t.lineWidth=this.selected?2:1,t.roundRect(this.left,this.top,this.width,this.height,this.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},M.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),n=i.width+2*e;this.width=n,this.height=n}},M.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,t.strokeStyle=this.selected?this.color.highlight.border:this.color.border,t.fillStyle=this.selected?this.color.highlight.background:this.color.background,t.lineWidth=this.selected?2:1,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},M.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),n=Math.max(i.width,i.height)+2*e;this.radius=n/2,this.width=n,this.height=n}},M.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,t.strokeStyle=this.selected?this.color.highlight.border:this.color.border,t.fillStyle=this.selected?this.color.highlight.background:this.color.background,t.lineWidth=this.selected?2:1,t.circle(this.x,this.y,this.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},M.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.widthc;c++)t.fillText(o[c],i,d),d+=h}},M.prototype.getTextSize=function(t){if(void 0!=this.label){t.font=(this.selected?"bold ":"")+this.fontSize+"px "+this.fontFace;for(var e=this.label.split("\n"),i=(this.fontSize+4)*e.length,n=0,s=0,r=e.length;r>s;s++)n=Math.max(n,t.measureText(e[s]).width);return{width:n,height:i}}return{width:0,height:0}},C.prototype.setProperties=function(t,e){if(t)switch(void 0!=t.from&&(this.fromId=t.from),void 0!=t.to&&(this.toId=t.to),void 0!=t.id&&(this.id=t.id),void 0!=t.style&&(this.style=t.style),void 0!=t.label&&(this.label=t.label),this.label&&(this.fontSize=e.edges.fontSize,this.fontFace=e.edges.fontFace,this.fontColor=e.edges.fontColor,void 0!=t.fontColor&&(this.fontColor=t.fontColor),void 0!=t.fontSize&&(this.fontSize=t.fontSize),void 0!=t.fontFace&&(this.fontFace=t.fontFace)),void 0!=t.title&&(this.title=t.title),void 0!=t.width&&(this.width=t.width),void 0!=t.value&&(this.value=t.value),void 0!=t.length&&(this.length=t.length),t.dash&&(void 0!=t.dash.length&&(this.dash.length=t.dash.length),void 0!=t.dash.gap&&(this.dash.gap=t.dash.gap),void 0!=t.dash.altLength&&(this.dash.altLength=t.dash.altLength)),void 0!=t.color&&(this.color=t.color),this.connect(),this.widthFixed=this.widthFixed||void 0!=t.width,this.lengthFixed=this.lengthFixed||void 0!=t.length,this.stiffness=1/this.length,this.style){case"line":this.draw=this._drawLine;break;case"arrow":this.draw=this._drawArrow;break;case"arrow-center":this.draw=this._drawArrowCenter;break;case"dash-line":this.draw=this._drawDashLine;break;default:this.draw=this._drawLine}},C.prototype.connect=function(){this.disconnect(),this.from=this.graph.nodes[this.fromId]||null,this.to=this.graph.nodes[this.toId]||null,this.connected=this.from&&this.to,this.connected?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this))},C.prototype.disconnect=function(){this.from&&(this.from.detachEdge(this),this.from=null),this.to&&(this.to.detachEdge(this),this.to=null),this.connected=!1},C.prototype.getTitle=function(){return this.title},C.prototype.getValue=function(){return this.value},C.prototype.setValueRange=function(t,e){if(!this.widthFixed&&void 0!==this.value){var i=(this.widthMax-this.widthMin)/(e-t);this.width=(this.value-t)*i+this.widthMin}},C.prototype.draw=function(){throw"Method draw not initialized in edge"},C.prototype.isOverlappingWith=function(t){var e=10,i=this.from.x,n=this.from.y,s=this.to.x,r=this.to.y,o=t.left,a=t.top,h=C._dist(i,n,s,r,o,a);return e>h},C.prototype._drawLine=function(t){t.strokeStyle=this.color,t.lineWidth=this._getLineWidth();var e;if(this.from!=this.to)this._line(t),this.label&&(e=this._pointOnLine(.5),this._label(t,this.label,e.x,e.y));else{var i,n,s=this.length/4,r=this.from;r.width||r.resize(t),r.width>r.height?(i=r.x+r.width/2,n=r.y-s):(i=r.x+s,n=r.y-r.height/2),this._circle(t,i,n,s),e=this._pointOnCircle(i,n,s,.5),this._label(t,this.label,e.x,e.y)}},C.prototype._getLineWidth=function(){return this.from.selected||this.to.selected?Math.min(2*this.width,this.widthMax):this.width},C.prototype._line=function(t){t.beginPath(),t.moveTo(this.from.x,this.from.y),t.lineTo(this.to.x,this.to.y),t.stroke()},C.prototype._circle=function(t,e,i,n){t.beginPath(),t.arc(e,i,n,0,2*Math.PI,!1),t.stroke()},C.prototype._label=function(t,e,i,n){if(e){t.font=(this.from.selected||this.to.selected?"bold ":"")+this.fontSize+"px "+this.fontFace,t.fillStyle="white";var s=t.measureText(e).width,r=this.fontSize,o=i-s/2,a=n-r/2;t.fillRect(o,a,s,r),t.fillStyle=this.fontColor||"black",t.textAlign="left",t.textBaseline="top",t.fillText(e,o,a)}},C.prototype._drawDashLine=function(t){if(t.strokeStyle=this.color,t.lineWidth=this._getLineWidth(),t.beginPath(),t.lineCap="round",void 0!=this.dash.altLength?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.dash.length,this.dash.gap,this.dash.altLength,this.dash.gap]):void 0!=this.dash.length&&void 0!=this.dash.gap?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.dash.length,this.dash.gap]):(t.moveTo(this.from.x,this.from.y),t.lineTo(this.to.x,this.to.y)),t.stroke(),this.label){var e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}},C.prototype._pointOnLine=function(t){return{x:(1-t)*this.from.x+t*this.to.x,y:(1-t)*this.from.y+t*this.to.y}},C.prototype._pointOnCircle=function(t,e,i,n){var s=2*(n-3/8)*Math.PI;return{x:t+i*Math.cos(s),y:e-i*Math.sin(s)}},C.prototype._drawArrowCenter=function(t){var e;if(t.strokeStyle=this.color,t.fillStyle=this.color,t.lineWidth=this._getLineWidth(),this.from!=this.to){this._line(t);var i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),n=10+5*this.width;e=this._pointOnLine(.5),t.arrow(e.x,e.y,i,n),t.fill(),t.stroke(),this.label&&(e=this._pointOnLine(.5),this._label(t,this.label,e.x,e.y))}else{var s,r,o=this.length/4,a=this.from;a.width||a.resize(t),a.width>a.height?(s=a.x+a.width/2,r=a.y-o):(s=a.x+o,r=a.y-a.height/2),this._circle(t,s,r,o);var i=.2*Math.PI,n=10+5*this.width;e=this._pointOnCircle(s,r,o,.5),t.arrow(e.x,e.y,i,n),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(s,r,o,.5),this._label(t,this.label,e.x,e.y))}},C.prototype._drawArrow=function(t){t.strokeStyle=this.color,t.fillStyle=this.color,t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var n=this.to.x-this.from.x,s=this.to.y-this.from.y,r=Math.sqrt(n*n+s*s),o=this.from.distanceToBorder(t,e+Math.PI),a=(r-o)/r,h=a*this.from.x+(1-a)*this.to.x,d=a*this.from.y+(1-a)*this.to.y,c=this.to.distanceToBorder(t,e),u=(r-c)/r,l=(1-u)*this.from.x+u*this.to.x,p=(1-u)*this.from.y+u*this.to.y;if(t.beginPath(),t.moveTo(h,d),t.lineTo(l,p),t.stroke(),i=10+5*this.width,t.arrow(l,p,e,i),t.fill(),t.stroke(),this.label){var f=this._pointOnLine(.5);this._label(t,this.label,f.x,f.y)}}else{var m,g,v,y=this.from,w=this.length/4;y.width||y.resize(t),y.width>y.height?(m=y.x+y.width/2,g=y.y-w,v={x:m,y:y.y,angle:.9*Math.PI}):(m=y.x+w,g=y.y-y.height/2,v={x:y.x,y:g,angle:.6*Math.PI}),t.beginPath(),t.arc(m,g,w,0,2*Math.PI,!1),t.stroke(),i=10+5*this.width,t.arrow(v.x,v.y,v.angle,i),t.fill(),t.stroke(),this.label&&(f=this._pointOnCircle(m,g,w,.5),this._label(t,this.label,f.x,f.y))}},C._dist=function(t,e,i,n,s,r){var o=i-t,a=n-e,h=o*o+a*a,d=((s-t)*o+(r-e)*a)/h;d>1?d=1:0>d&&(d=0);var c=t+d*o,u=e+d*a,l=c-s,p=u-r;return Math.sqrt(l*l+p*p)},O.prototype.setPosition=function(t,e){this.x=parseInt(t),this.y=parseInt(e)},O.prototype.setText=function(t){this.frame.innerHTML=t},O.prototype.show=function(t){if(void 0===t&&(t=!0),t){var e=this.frame.clientHeight,i=this.frame.clientWidth,n=this.frame.parentNode.clientHeight,s=this.frame.parentNode.clientWidth,r=this.y-e;r+e+this.padding>n&&(r=n-e-this.padding),rs&&(o=s-i-this.padding),o0?s[s.length-1]:null},N.prototype._getPointer=function(t){return{x:t.pageX-R.util.getAbsoluteLeft(this.frame.canvas),y:t.pageY-R.util.getAbsoluteTop(this.frame.canvas)}},N.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.touches[0]),this.drag.pinched=!1,this.pinch.scale=this._getScale()},N.prototype._onDragStart=function(){var t=this.drag;t.selection=[],t.translation=this._getTranslation(),t.nodeId=this._getNodeAt(t.pointer);var e=this.nodes[t.nodeId];if(e){e.isSelected()||this._selectNodes([t.nodeId]);var i=this;this.selection.forEach(function(e){var n=i.nodes[e];if(n){var s={id:e,node:n,x:n.x,y:n.y,xFixed:n.xFixed,yFixed:n.yFixed};n.xFixed=!0,n.yFixed=!0,t.selection.push(s)}})}},N.prototype._onDrag=function(t){if(!this.drag.pinched){var e=this._getPointer(t.gesture.touches[0]),i=this,n=this.drag,s=n.selection;if(s&&s.length){var r=e.x-n.pointer.x,o=e.y-n.pointer.y;s.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._canvasToX(i._xToCanvas(t.x)+r)),t.yFixed||(e.y=i._canvasToY(i._yToCanvas(t.y)+o))}),this.moving||(this.moving=!0,this.start())}else{var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw(),this.moved=!0}}},N.prototype._onDragEnd=function(){var t=this.drag.selection;t&&t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed})},N.prototype._onTap=function(t){var e=this._getPointer(t.gesture.touches[0]),i=this._getNodeAt(e),n=this.nodes[i];n?(this._selectNodes([i]),this.moving||this._redraw()):(this._unselectNodes(),this._redraw())},N.prototype._onHold=function(t){var e=this._getPointer(t.gesture.touches[0]),i=this._getNodeAt(e),n=this.nodes[i];if(n){if(n.isSelected())this._unselectNodes([i]);else{var s=!0;this._selectNodes([i],s)}this.moving||this._redraw()}},N.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},N.prototype._zoom=function(t,e){var i=this._getScale();.01>t&&(t=.01),t>10&&(t=10);var n=this._getTranslation(),s=t/i,r=(1-s)*e.x+n.x*s,o=(1-s)*e.y+n.y*s;return this._setScale(t),this._setTranslation(r,o),this._redraw(),t},N.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){"mouswheelScale"in this.pinch||(this.pinch.mouswheelScale=1);var i=this.pinch.mouswheelScale,n=e/10;0>e&&(n/=1-n),i*=1+n;var s=A.fakeGesture(this,t),r=this._getPointer(s.center);i=this._zoom(i,r),this.pinch.mouswheelScale=i}t.preventDefault()},N.prototype._onMouseMoveTitle=function(t){var e=A.fakeGesture(this,t),i=this._getPointer(e.center);this.popupNode&&this._checkHidePopup(i);var n=this,s=function(){n._checkShowPopup(i)};this.popupTimer&&clearInterval(this.popupTimer),this.leftButtonDown||(this.popupTimer=setTimeout(s,300))},N.prototype._checkShowPopup=function(t){var e,i={left:this._canvasToX(t.x),top:this._canvasToY(t.y),right:this._canvasToX(t.x),bottom:this._canvasToY(t.y)},n=this.popupNode;if(void 0==this.popupNode){var s=this.nodes;for(e in s)if(s.hasOwnProperty(e)){var r=s[e];if(void 0!=r.getTitle()&&r.isOverlappingWith(i)){this.popupNode=r;break}}}if(void 0==this.popupNode){var o=this.edges;for(e in o)if(o.hasOwnProperty(e)){var a=o[e];if(a.connected&&void 0!=a.getTitle()&&a.isOverlappingWith(i)){this.popupNode=a;break}}}if(this.popupNode){if(this.popupNode!=n){var h=this;h.popup||(h.popup=new O(h.frame)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupNode.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},N.prototype._checkHidePopup=function(t){this.popupNode&&this._getNodeAt(t)||(this.popupNode=void 0,this.popup&&this.popup.hide())},N.prototype._unselectNodes=function(t,e){var i,n,s,r=!1;if(t)for(i=0,n=t.length;n>i;i++){s=t[i],this.nodes[s].unselect();for(var o=0;oi;i++)s=this.selection[i],this.nodes[s].unselect(),r=!0;this.selection=[]}return!r||1!=e&&void 0!=e||this._trigger("select"),r},N.prototype._selectNodes=function(t,e){var i,n,s=!1,r=!0;if(t.length!=this.selection.length)r=!1;else for(i=0,n=Math.min(t.length,this.selection.length);n>i;i++)if(t[i]!=this.selection[i]){r=!1;break}if(r)return s;if(void 0==e||0==e){var o=!1;s=this._unselectNodes(void 0,o)}for(i=0,n=t.length;n>i;i++){var a=t[i],h=-1!=this.selection.indexOf(a);h||(this.nodes[a].select(),this.selection.push(a),s=!0)}return s&&this._trigger("select"),s},N.prototype._getNodesOverlappingWith=function(t){var e=this.nodes,i=[];for(var n in e)e.hasOwnProperty(n)&&e[n].isOverlappingWith(t)&&i.push(n);return i},N.prototype.getSelection=function(){return this.selection.concat([])},N.prototype.setSelection=function(t){var e,i,n;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(e=0,i=this.selection.length;i>e;e++)n=this.selection[e],this.nodes[n].unselect();for(this.selection=[],e=0,i=t.length;i>e;e++){n=t[e];var s=this.nodes[n];if(!s)throw new RangeError('Node with id "'+n+'" not found');s.select(),this.selection.push(n)}this.redraw()},N.prototype._updateSelection=function(){for(var t=0;ti;i++)for(var s=t[i],r=s.edges,o=0,a=r.length;a>o;o++){var h=r[o],d=null;h.from==s?d=h.to:h.to==s&&(d=h.from);var c,u;if(d)for(c=0,u=t.length;u>c;c++)if(t[c]==d){d=null;break}if(d)for(c=0,u=e.length;u>c;c++)if(e[c]==d){d=null;break}d&&e.push(d)}return e}void 0==t&&(t=1);var i=[],n=this.nodes;for(var s in n)if(n.hasOwnProperty(s)){for(var r=[n[s]],o=0;t>o;o++)r=r.concat(e(r));i.push(r)}for(var a=[],h=0,d=i.length;d>h;h++)a.push(i[h].length);return a},N.prototype.setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight},N.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof r||t instanceof o)this.nodesData=t;else if(t instanceof Array)this.nodesData=new r,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new r}if(e&&A.forEach(this.nodesListeners,function(t,i){e.unsubscribe(i,t)}),this.nodes={},this.nodesData){var i=this;A.forEach(this.nodesListeners,function(t,e){i.nodesData.subscribe(e,t)});var n=this.nodesData.getIds();this._addNodes(n)}this._updateSelection()},N.prototype._addNodes=function(t){for(var e,i=0,n=t.length;n>i;i++){e=t[i];var s=this.nodesData.get(e),r=new M(s,this.images,this.groups,this.constants);if(this.nodes[e]=r,!r.isFixed()){var o=2*this.constants.edges.length,a=t.length,h=2*Math.PI*(i/a);r.x=o*Math.cos(h),r.y=o*Math.sin(h),this.moving=!0}}this._reconnectEdges(),this._updateValueRange(this.nodes)},N.prototype._updateNodes=function(t){for(var e=this.nodes,i=this.nodesData,n=0,s=t.length;s>n;n++){var r=t[n],o=e[r],a=i.get(r);o?o.setProperties(a,this.constants):(o=new M(properties,this.images,this.groups,this.constants),e[r]=o,o.isFixed()||(this.moving=!0))}this._reconnectEdges(),this._updateValueRange(e)},N.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,n=t.length;n>i;i++){var s=t[i];delete e[s]}this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},N.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof r||t instanceof o)this.edgesData=t;else if(t instanceof Array)this.edgesData=new r,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new r}if(e&&A.forEach(this.edgesListeners,function(t,i){e.unsubscribe(i,t)}),this.edges={},this.edgesData){var i=this;A.forEach(this.edgesListeners,function(t,e){i.edgesData.subscribe(e,t)});var n=this.edgesData.getIds();this._addEdges(n)}this._reconnectEdges()},N.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,n=0,s=t.length;s>n;n++){var r=t[n],o=e[r];o&&o.disconnect();var a=i.get(r);e[r]=new C(a,this,this.constants)}this.moving=!0,this._updateValueRange(e)},N.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,n=0,s=t.length;s>n;n++){var r=t[n],o=i.get(r),a=e[r];a?(a.disconnect(),a.setProperties(o,this.constants),a.connect()):(a=new C(o,this,this.constants),this.edges[r]=a)}this.moving=!0,this._updateValueRange(e)},N.prototype._removeEdges=function(t){for(var e=this.edges,i=0,n=t.length;n>i;i++){var s=t[i],r=e[s];r&&(r.disconnect(),delete e[s])}this.moving=!0,this._updateValueRange(e)},N.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var n=i[t];n.from=null,n.to=null,n.connect()}},N.prototype._updateValueRange=function(t){var e,i=void 0,n=void 0;for(e in t)if(t.hasOwnProperty(e)){var s=t[e].getValue();void 0!==s&&(i=void 0===i?s:Math.min(s,i),n=void 0===n?s:Math.max(s,n))}if(void 0!==i&&void 0!==n)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,n)},N.prototype.redraw=function(){this.setSize(this.width,this.height),this._redraw()},N.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d"),e=this.frame.canvas.width,i=this.frame.canvas.height;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this._drawEdges(t),this._drawNodes(t),t.restore()},N.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e)},N.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},N.prototype._setScale=function(t){this.scale=t},N.prototype._getScale=function(){return this.scale},N.prototype._canvasToX=function(t){return(t-this.translation.x)/this.scale},N.prototype._xToCanvas=function(t){return t*this.scale+this.translation.x},N.prototype._canvasToY=function(t){return(t-this.translation.y)/this.scale},N.prototype._yToCanvas=function(t){return t*this.scale+this.translation.y},N.prototype._drawNodes=function(t){var e=this.nodes,i=[];for(var n in e)e.hasOwnProperty(n)&&(e[n].isSelected()?i.push(n):e[n].draw(t));for(var s=0,r=i.length;r>s;s++)e[i[s]].draw(t)},N.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var n=e[i];n.connected&&e[i].draw(t)}},N.prototype._doStabilize=function(){for(var t=(new Date,0),e=this.constants.minVelocity,i=!1;!i&&t0&&e==s.EVENT_END?e=s.EVENT_MOVE:c||(e=s.EVENT_END),c||null===r?r=h:h=r,i.call(s.detection,n.collectEventData(t,e,h)),s.HAS_POINTEREVENTS&&e==s.EVENT_END&&(c=s.PointerEvent.updatePointer(e,h))),c||(r=null,o=!1,a=!1,s.PointerEvent.reset())}})},determineEventTypes:function(){var t;t=s.HAS_POINTEREVENTS?s.PointerEvent.getEvents():s.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],s.EVENT_TYPES[s.EVENT_START]=t[0],s.EVENT_TYPES[s.EVENT_MOVE]=t[1],s.EVENT_TYPES[s.EVENT_END]=t[2]},getTouchList:function(t){return s.HAS_POINTEREVENTS?s.PointerEvent.getTouchList():t.touches?t.touches:[{identifier:1,pageX:t.pageX,pageY:t.pageY,target:t.target}]},collectEventData:function(t,e,i){var n=this.getTouchList(i,e),r=s.POINTER_TOUCH;return(i.type.match(/mouse/)||s.PointerEvent.matchType(s.POINTER_MOUSE,i))&&(r=s.POINTER_MOUSE),{center:s.utils.getCenter(n),timeStamp:(new Date).getTime(),target:i.target,touches:n,eventType:e,pointerType:r,srcEvent:i,preventDefault:function(){this.srcEvent.preventManipulation&&this.srcEvent.preventManipulation(),this.srcEvent.preventDefault&&this.srcEvent.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return s.detection.stopDetect()}}}},s.PointerEvent={pointers:{},getTouchList:function(){var t=this,e=[];return Object.keys(t.pointers).sort().forEach(function(i){e.push(t.pointers[i])}),e},updatePointer:function(t,e){return t==s.EVENT_END?this.pointers={}:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e),Object.keys(this.pointers).length},matchType:function(t,e){if(!e.pointerType)return!1;var i={};return i[s.POINTER_MOUSE]=e.pointerType==e.MSPOINTER_TYPE_MOUSE||e.pointerType==s.POINTER_MOUSE,i[s.POINTER_TOUCH]=e.pointerType==e.MSPOINTER_TYPE_TOUCH||e.pointerType==s.POINTER_TOUCH,i[s.POINTER_PEN]=e.pointerType==e.MSPOINTER_TYPE_PEN||e.pointerType==s.POINTER_PEN,i[t]},getEvents:function(){return["pointerdown MSPointerDown","pointermove MSPointerMove","pointerup pointercancel MSPointerUp MSPointerCancel"]},reset:function(){this.pointers={}}},s.utils={extend:function(t,e,n){for(var s in e)t[s]!==i&&n||(t[s]=e[s]);return t},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){for(var e=[],i=[],n=0,s=t.length;s>n;n++)e.push(t[n].pageX),i.push(t[n].pageY);return{pageX:(Math.min.apply(Math,e)+Math.max.apply(Math,e))/2,pageY:(Math.min.apply(Math,i)+Math.max.apply(Math,i))/2}},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.pageY-t.pageY,n=e.pageX-t.pageX;return 180*Math.atan2(i,n)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.pageX-e.pageX),n=Math.abs(t.pageY-e.pageY);return i>=n?t.pageX-e.pageX>0?s.DIRECTION_LEFT:s.DIRECTION_RIGHT:t.pageY-e.pageY>0?s.DIRECTION_UP:s.DIRECTION_DOWN},getDistance:function(t,e){var i=e.pageX-t.pageX,n=e.pageY-t.pageY;return Math.sqrt(i*i+n*n)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==s.DIRECTION_UP||t==s.DIRECTION_DOWN},stopDefaultBrowserBehavior:function(t,e){var i,n=["webkit","khtml","moz","ms","o",""];if(e&&t.style){for(var s=0;si;i++){var r=this.gestures[i];if(!this.stopped&&e[r.name]!==!1&&r.handler.call(r,t,this.current.inst)===!1){this.stopDetect();break}}return this.current&&(this.current.lastEvent=t),t.eventType==s.EVENT_END&&!t.touches.length-1&&this.stopDetect(),t}},stopDetect:function(){this.previous=s.utils.extend({},this.current),this.current=null,this.stopped=!0},extendEventData:function(t){var e=this.current.startEvent; -if(e&&(t.touches.length!=e.touches.length||t.touches===e.touches)){e.touches=[];for(var i=0,n=t.touches.length;n>i;i++)e.touches.push(s.utils.extend({},t.touches[i]))}var r=t.timeStamp-e.timeStamp,o=t.center.pageX-e.center.pageX,a=t.center.pageY-e.center.pageY,h=s.utils.getVelocity(r,o,a);return s.utils.extend(t,{deltaTime:r,deltaX:o,deltaY:a,velocityX:h.x,velocityY:h.y,distance:s.utils.getDistance(e.center,t.center),angle:s.utils.getAngle(e.center,t.center),direction:s.utils.getDirection(e.center,t.center),scale:s.utils.getScale(e.touches,t.touches),rotation:s.utils.getRotation(e.touches,t.touches),startEvent:e}),t},register:function(t){var e=t.defaults||{};return e[t.name]===i&&(e[t.name]=!0),s.utils.extend(s.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}},s.gestures=s.gestures||{},s.gestures.Hold={name:"hold",index:10,defaults:{hold_timeout:500,hold_threshold:1},timer:null,handler:function(t,e){switch(t.eventType){case s.EVENT_START:clearTimeout(this.timer),s.detection.current.name=this.name,this.timer=setTimeout(function(){"hold"==s.detection.current.name&&e.trigger("hold",t)},e.options.hold_timeout);break;case s.EVENT_MOVE:t.distance>e.options.hold_threshold&&clearTimeout(this.timer);break;case s.EVENT_END:clearTimeout(this.timer)}}},s.gestures.Tap={name:"tap",index:100,defaults:{tap_max_touchtime:250,tap_max_distance:10,tap_always:!0,doubletap_distance:20,doubletap_interval:300},handler:function(t,e){if(t.eventType==s.EVENT_END){var i=s.detection.previous,n=!1;if(t.deltaTime>e.options.tap_max_touchtime||t.distance>e.options.tap_max_distance)return;i&&"tap"==i.name&&t.timeStamp-i.lastEvent.timeStamp0&&t.touches.length>e.options.swipe_max_touches)return;(t.velocityX>e.options.swipe_velocity||t.velocityY>e.options.swipe_velocity)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},s.gestures.Drag={name:"drag",index:50,defaults:{drag_min_distance:10,drag_max_touches:1,drag_block_horizontal:!1,drag_block_vertical:!1,drag_lock_to_axis:!1,drag_lock_min_distance:25},triggered:!1,handler:function(t,e){if(s.detection.current.name!=this.name&&this.triggered)return e.trigger(this.name+"end",t),this.triggered=!1,void 0;if(!(e.options.drag_max_touches>0&&t.touches.length>e.options.drag_max_touches))switch(t.eventType){case s.EVENT_START:this.triggered=!1;break;case s.EVENT_MOVE:if(t.distancee.options.transform_min_rotation&&e.trigger("rotate",t),i>e.options.transform_min_scale&&(e.trigger("pinch",t),e.trigger("pinch"+(t.scale<1?"in":"out"),t));break;case s.EVENT_END:this.triggered&&e.trigger(this.name+"end",t),this.triggered=!1}}},s.gestures.Touch={name:"touch",index:-1/0,defaults:{prevent_default:!1,prevent_mouseevents:!1},handler:function(t,e){return e.options.prevent_mouseevents&&t.pointerType==s.POINTER_MOUSE?(t.stopDetect(),void 0):(e.options.prevent_default&&t.preventDefault(),t.eventType==s.EVENT_START&&e.trigger(this.name,t),void 0)}},s.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==s.EVENT_END&&e.trigger(this.name,t)}},"object"==typeof e&&"object"==typeof e.exports?e.exports=s:(t.Hammer=s,"function"==typeof t.define&&t.define.amd&&t.define("hammer",[],function(){return s}))}(this)},{}],3:[function(e,i){(function(n){function s(t,e){return function(i){return u(t.call(this,i),e)}}function r(t,e){return function(i){return this.lang().ordinal(t.call(this,i),e)}}function o(){}function a(t){T(t),d(this,t)}function h(t){var e=v(t),i=e.year||0,n=e.month||0,s=e.week||0,r=e.day||0,o=e.hour||0,a=e.minute||0,h=e.second||0,d=e.millisecond||0;this._milliseconds=+d+1e3*h+6e4*a+36e5*o,this._days=+r+7*s,this._months=+n+12*i,this._data={},this._bubble()}function d(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return e.hasOwnProperty("toString")&&(t.toString=e.toString),e.hasOwnProperty("valueOf")&&(t.valueOf=e.valueOf),t}function c(t){return 0>t?Math.ceil(t):Math.floor(t)}function u(t,e,i){for(var n=Math.abs(t)+"",s=t>=0;n.lengthn;n++)(i&&t[n]!==e[n]||!i&&w(t[n])!==w(e[n]))&&o++;return o+r}function g(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=Ge[t]||Be[e]||e}return t}function v(t){var e,i,n={};for(i in t)t.hasOwnProperty(i)&&(e=g(i),e&&(n[e]=t[i]));return n}function y(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}re[t]=function(s,r){var o,a,h=re.fn._lang[t],d=[];if("number"==typeof s&&(r=s,s=n),a=function(t){var e=re().utc().set(i,t);return h.call(re.fn._lang,e,s||"")},null!=r)return a(r);for(o=0;e>o;o++)d.push(a(o));return d}}function w(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function _(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function b(t){return E(t)?366:365}function E(t){return t%4===0&&t%100!==0||t%400===0}function T(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[ue]<0||t._a[ue]>11?ue:t._a[le]<1||t._a[le]>_(t._a[ce],t._a[ue])?le:t._a[pe]<0||t._a[pe]>23?pe:t._a[fe]<0||t._a[fe]>59?fe:t._a[me]<0||t._a[me]>59?me:t._a[ge]<0||t._a[ge]>999?ge:-1,t._pf._overflowDayOfYear&&(ce>e||e>le)&&(e=le),t._pf.overflow=e)}function S(t){t._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function x(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length)),t._isValid}function D(t){return t?t.toLowerCase().replace("_","-"):t}function M(t,e){return e._isUTC?re(t).zone(e._offset||0):re(t).local()}function C(t,e){return e.abbr=t,ve[t]||(ve[t]=new o),ve[t].set(e),ve[t]}function O(t){delete ve[t]}function N(t){var i,n,s,r,o=0,a=function(t){if(!ve[t]&&ye)try{e("./lang/"+t)}catch(i){}return ve[t]};if(!t)return re.fn._lang;if(!p(t)){if(n=a(t))return n;t=[t]}for(;o0;){if(n=a(r.slice(0,i).join("-")))return n;if(s&&s.length>=i&&m(r,s,!0)>=i-1)break;i--}o++}return re.fn._lang}function L(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function I(t){var e,i,n=t.match(Ee);for(e=0,i=n.length;i>e;e++)n[e]=Ke[n[e]]?Ke[n[e]]:L(n[e]);return function(s){var r="";for(e=0;i>e;e++)r+=n[e]instanceof Function?n[e].call(s,t):n[e];return r}}function k(t,e){return t.isValid()?(e=A(e,t.lang()),qe[e]||(qe[e]=I(e)),qe[e](t)):t.lang().invalidDate()}function A(t,e){function i(t){return e.longDateFormat(t)||t}var n=5;for(Te.lastIndex=0;n>=0&&Te.test(t);)t=t.replace(Te,i),Te.lastIndex=0,n-=1;return t}function P(t,e){var i,n=e._strict;switch(t){case"DDDD":return Pe;case"YYYY":case"GGGG":case"gggg":return n?Ye:De;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return n?Fe:Me;case"S":if(n)return ke;case"SS":if(n)return Ae;case"SSS":case"DDD":return n?Pe:xe;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Oe;case"a":case"A":return N(e._l)._meridiemParse;case"X":return Ie;case"Z":case"ZZ":return Ne;case"T":return Le;case"SSSS":return Ce;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return n?Ae:Se;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return n?ke:Se;default:return i=new RegExp(j(W(t.replace("\\","")),"i"))}}function Y(t){t=t||"";var e=t.match(Ne)||[],i=e[e.length-1]||[],n=(i+"").match(We)||["-",0,0],s=+(60*n[1])+w(n[2]);return"+"===n[0]?-s:s}function F(t,e,i){var n,s=i._a;switch(t){case"M":case"MM":null!=e&&(s[ue]=w(e)-1);break;case"MMM":case"MMMM":n=N(i._l).monthsParse(e),null!=n?s[ue]=n:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(s[le]=w(e));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=w(e));break;case"YY":s[ce]=w(e)+(w(e)>68?1900:2e3);break;case"YYYY":case"YYYYY":case"YYYYYY":s[ce]=w(e);break;case"a":case"A":i._isPm=N(i._l).isPM(e);break;case"H":case"HH":case"h":case"hh":s[pe]=w(e);break;case"m":case"mm":s[fe]=w(e);break;case"s":case"ss":s[me]=w(e);break;case"S":case"SS":case"SSS":case"SSSS":s[ge]=w(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=Y(e);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":t=t.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=e)}}function R(t){var e,i,n,s,r,o,a,h,d,c,u=[];if(!t._d){for(n=z(t),t._w&&null==t._a[le]&&null==t._a[ue]&&(r=function(e){var i=parseInt(e,10);return e?e.length<3?i>68?1900+i:2e3+i:i:null==t._a[ce]?re().weekYear():t._a[ce]},o=t._w,null!=o.GG||null!=o.W||null!=o.E?a=J(r(o.GG),o.W||1,o.E,4,1):(h=N(t._l),d=null!=o.d?Z(o.d,h):null!=o.e?parseInt(o.e,10)+h._week.dow:0,c=parseInt(o.w,10)||1,null!=o.d&&db(s)&&(t._pf._overflowDayOfYear=!0),i=X(s,0,t._dayOfYear),t._a[ue]=i.getUTCMonth(),t._a[le]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=u[e]=n[e];for(;7>e;e++)t._a[e]=u[e]=null==t._a[e]?2===e?1:0:t._a[e];u[pe]+=w((t._tzm||0)/60),u[fe]+=w((t._tzm||0)%60),t._d=(t._useUTC?X:q).apply(null,u)}}function H(t){var e;t._d||(e=v(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],R(t))}function z(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function U(t){t._a=[],t._pf.empty=!0;var e,i,n,s,r,o=N(t._l),a=""+t._i,h=a.length,d=0;for(n=A(t._f,o).match(Ee)||[],e=0;e0&&t._pf.unusedInput.push(r),a=a.slice(a.indexOf(i)+i.length),d+=i.length),Ke[s]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(s),F(s,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(s);t._pf.charsLeftOver=h-d,a.length>0&&t._pf.unusedInput.push(a),t._isPm&&t._a[pe]<12&&(t._a[pe]+=12),t._isPm===!1&&12===t._a[pe]&&(t._a[pe]=0),R(t),T(t)}function W(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,n,s){return e||i||n||s})}function j(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function V(t){var e,i,n,s,r;if(0===t._f.length)return t._pf.invalidFormat=!0,t._d=new Date(0/0),void 0;for(s=0;sr)&&(n=r,i=e));d(t,i||e)}function G(t){var e,i=t._i,n=Re.exec(i);if(n){for(t._pf.iso=!0,e=4;e>0;e--)if(n[e]){t._f=ze[e-1]+(n[6]||" ");break}for(e=0;4>e;e++)if(Ue[e][1].exec(i)){t._f+=Ue[e][0];break}i.match(Ne)&&(t._f+="Z"),U(t)}else t._d=new Date(i)}function B(t){var e=t._i,i=we.exec(e);e===n?t._d=new Date:i?t._d=new Date(+i[1]):"string"==typeof e?G(t):p(e)?(t._a=e.slice(0),R(t)):f(e)?t._d=new Date(+e):"object"==typeof e?H(t):t._d=new Date(e)}function q(t,e,i,n,s,r,o){var a=new Date(t,e,i,n,s,r,o);return 1970>t&&a.setFullYear(t),a}function X(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function Z(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function K(t,e,i,n,s){return s.relativeTime(e||1,!!i,t,n)}function Q(t,e,i){var n=de(Math.abs(t)/1e3),s=de(n/60),r=de(s/60),o=de(r/24),a=de(o/365),h=45>n&&["s",n]||1===s&&["m"]||45>s&&["mm",s]||1===r&&["h"]||22>r&&["hh",r]||1===o&&["d"]||25>=o&&["dd",o]||45>=o&&["M"]||345>o&&["MM",de(o/30)]||1===a&&["y"]||["yy",a];return h[2]=e,h[3]=t>0,h[4]=i,K.apply({},h)}function $(t,e,i){var n,s=i-e,r=i-t.day();return r>s&&(r-=7),s-7>r&&(r+=7),n=re(t).add("d",r),{week:Math.ceil(n.dayOfYear()/7),year:n.year()}}function J(t,e,i,n,s){var r,o,a=new Date(u(t,6,!0)+"-01-01").getUTCDay();return i=null!=i?i:s,r=s-a+(a>n?7:0),o=7*(e-1)+(i-s)+r+1,{year:o>0?t:t-1,dayOfYear:o>0?o:b(t-1)+o}}function te(t){var e=t._i,i=t._f;return"undefined"==typeof t._pf&&S(t),null===e?re.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=N().preparse(e)),re.isMoment(e)?(t=d({},e),t._d=new Date(+e._d)):i?p(i)?V(t):U(t):B(t),new a(t))}function ee(t,e){re.fn[t]=re.fn[t+"s"]=function(t){var i=this._isUTC?"UTC":"";return null!=t?(this._d["set"+i+e](t),re.updateOffset(this),this):this._d["get"+i+e]()}}function ie(t){re.duration.fn[t]=function(){return this._data[t]}}function ne(t,e){re.duration.fn["as"+t]=function(){return+this/e}}function se(t){var e=!1,i=re;"undefined"==typeof ender&&(t?(he.moment=function(){return!e&&console&&console.warn&&(e=!0,console.warn("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.")),i.apply(null,arguments)},d(he.moment,i)):he.moment=re)}for(var re,oe,ae="2.5.0",he=this,de=Math.round,ce=0,ue=1,le=2,pe=3,fe=4,me=5,ge=6,ve={},ye="undefined"!=typeof i&&i.exports&&"undefined"!=typeof e,we=/^\/?Date\((\-?\d+)/i,_e=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,be=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,Ee=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,Te=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,Se=/\d\d?/,xe=/\d{1,3}/,De=/\d{1,4}/,Me=/[+\-]?\d{1,6}/,Ce=/\d+/,Oe=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Ne=/Z|[\+\-]\d\d:?\d\d/gi,Le=/T/i,Ie=/[\+\-]?\d+(\.\d{1,3})?/,ke=/\d/,Ae=/\d\d/,Pe=/\d{3}/,Ye=/\d{4}/,Fe=/[+\-]?\d{6}/,Re=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,He="YYYY-MM-DDTHH:mm:ssZ",ze=["YYYY-MM-DD","GGGG-[W]WW","GGGG-[W]WW-E","YYYY-DDD"],Ue=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],We=/([\+\-]|\d\d)/gi,je="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),Ve={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},Ge={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},Be={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},qe={},Xe="DDD w W M D d".split(" "),Ze="M D H h m s w W".split(" "),Ke={M:function(){return this.month()+1},MMM:function(t){return this.lang().monthsShort(this,t)},MMMM:function(t){return this.lang().months(this,t)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(t){return this.lang().weekdaysMin(this,t)},ddd:function(t){return this.lang().weekdaysShort(this,t)},dddd:function(t){return this.lang().weekdays(this,t)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return u(this.year()%100,2)},YYYY:function(){return u(this.year(),4)},YYYYY:function(){return u(this.year(),5)},YYYYYY:function(){var t=this.year(),e=t>=0?"+":"-";return e+u(Math.abs(t),6)},gg:function(){return u(this.weekYear()%100,2)},gggg:function(){return this.weekYear()},ggggg:function(){return u(this.weekYear(),5)},GG:function(){return u(this.isoWeekYear()%100,2)},GGGG:function(){return this.isoWeekYear()},GGGGG:function(){return u(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return w(this.milliseconds()/100)},SS:function(){return u(w(this.milliseconds()/10),2)},SSS:function(){return u(this.milliseconds(),3)},SSSS:function(){return u(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+u(w(t/60),2)+":"+u(w(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+u(w(t/60),2)+u(w(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},Qe=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];Xe.length;)oe=Xe.pop(),Ke[oe+"o"]=r(Ke[oe],oe);for(;Ze.length;)oe=Ze.pop(),Ke[oe+oe]=s(Ke[oe],2);for(Ke.DDDD=s(Ke.DDD,3),d(o.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,i,n;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(i=re.utc([2e3,e]),n="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[e]=new RegExp(n.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,n;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=re([2e3,1]).day(e),n="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(n.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var i=this._calendar[t];return"function"==typeof i?i.apply(e):i},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,n){var s=this._relativeTime[i];return"function"==typeof s?s(t,e,i,n):s.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return $(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),re=function(t,e,i,s){return"boolean"==typeof i&&(s=i,i=n),te({_i:t,_f:e,_l:i,_strict:s,_isUTC:!1})},re.utc=function(t,e,i,s){var r;return"boolean"==typeof i&&(s=i,i=n),r=te({_useUTC:!0,_isUTC:!0,_l:i,_i:t,_f:e,_strict:s}).utc()},re.unix=function(t){return re(1e3*t)},re.duration=function(t,e){var i,n,s,r=t,o=null;return re.isDuration(t)?r={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(r={},e?r[e]=t:r.milliseconds=t):(o=_e.exec(t))?(i="-"===o[1]?-1:1,r={y:0,d:w(o[le])*i,h:w(o[pe])*i,m:w(o[fe])*i,s:w(o[me])*i,ms:w(o[ge])*i}):(o=be.exec(t))&&(i="-"===o[1]?-1:1,s=function(t){var e=t&&parseFloat(t.replace(",","."));return(isNaN(e)?0:e)*i},r={y:s(o[2]),M:s(o[3]),d:s(o[4]),h:s(o[5]),m:s(o[6]),s:s(o[7]),w:s(o[8])}),n=new h(r),re.isDuration(t)&&t.hasOwnProperty("_lang")&&(n._lang=t._lang),n},re.version=ae,re.defaultFormat=He,re.updateOffset=function(){},re.lang=function(t,e){var i;return t?(e?C(D(t),e):null===e?(O(t),t="en"):ve[t]||N(t),i=re.duration.fn._lang=re.fn._lang=N(t),i._abbr):re.fn._lang._abbr},re.langData=function(t){return t&&t._lang&&t._lang._abbr&&(t=t._lang._abbr),N(t)},re.isMoment=function(t){return t instanceof a},re.isDuration=function(t){return t instanceof h},oe=Qe.length-1;oe>=0;--oe)y(Qe[oe]);for(re.normalizeUnits=function(t){return g(t)},re.invalid=function(t){var e=re.utc(0/0);return null!=t?d(e._pf,t):e._pf.userInvalidated=!0,e},re.parseZone=function(t){return re(t).parseZone()},d(re.fn=a.prototype,{clone:function(){return re(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=re(this).utc();return 00:!1},parsingFlags:function(){return d({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(t){var e=k(this,t||re.defaultFormat);return this.lang().postformat(e)},add:function(t,e){var i;return i="string"==typeof t?re.duration(+e,t):re.duration(t,e),l(this,i,1),this},subtract:function(t,e){var i;return i="string"==typeof t?re.duration(+e,t):re.duration(t,e),l(this,i,-1),this},diff:function(t,e,i){var n,s,r=M(t,this),o=6e4*(this.zone()-r.zone());return e=g(e),"year"===e||"month"===e?(n=432e5*(this.daysInMonth()+r.daysInMonth()),s=12*(this.year()-r.year())+(this.month()-r.month()),s+=(this-re(this).startOf("month")-(r-re(r).startOf("month")))/n,s-=6e4*(this.zone()-re(this).startOf("month").zone()-(r.zone()-re(r).startOf("month").zone()))/n,"year"===e&&(s/=12)):(n=this-r,s="second"===e?n/1e3:"minute"===e?n/6e4:"hour"===e?n/36e5:"day"===e?(n-o)/864e5:"week"===e?(n-o)/6048e5:n),i?s:c(s)},from:function(t,e){return re.duration(this.diff(t)).lang(this.lang()._abbr).humanize(!e)},fromNow:function(t){return this.from(re(),t)},calendar:function(){var t=M(re(),this).startOf("day"),e=this.diff(t,"days",!0),i=-6>e?"sameElse":-1>e?"lastWeek":0>e?"lastDay":1>e?"sameDay":2>e?"nextDay":7>e?"nextWeek":"sameElse";return this.format(this.lang().calendar(i,this))},isLeapYear:function(){return E(this.year())},isDST:function(){return this.zone()+re(t).startOf(e)},isBefore:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)<+re(t).startOf(e)},isSame:function(t,e){return e=e||"ms",+this.clone().startOf(e)===+M(t,this).startOf(e)},min:function(t){return t=re.apply(null,arguments),this>t?this:t},max:function(t){return t=re.apply(null,arguments),t>this?this:t},zone:function(t){var e=this._offset||0;return null==t?this._isUTC?e:this._d.getTimezoneOffset():("string"==typeof t&&(t=Y(t)),Math.abs(t)<16&&(t=60*t),this._offset=t,this._isUTC=!0,e!==t&&l(this,re.duration(e-t,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?re(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return _(this.year(),this.month())},dayOfYear:function(t){var e=de((re(this).startOf("day")-re(this).startOf("year"))/864e5)+1;return null==t?e:this.add("d",t-e)},quarter:function(){return Math.ceil((this.month()+1)/3)},weekYear:function(t){var e=$(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==t?e:this.add("y",t-e)},isoWeekYear:function(t){var e=$(this,1,4).year;return null==t?e:this.add("y",t-e)},week:function(t){var e=this.lang().week(this);return null==t?e:this.add("d",7*(t-e))},isoWeek:function(t){var e=$(this,1,4).week;return null==t?e:this.add("d",7*(t-e))},weekday:function(t){var e=(this.day()+7-this.lang()._week.dow)%7;return null==t?e:this.add("d",t-e)},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},get:function(t){return t=g(t),this[t]()},set:function(t,e){return t=g(t),"function"==typeof this[t]&&this[t](e),this},lang:function(t){return t===n?this._lang:(this._lang=N(t),this)}}),oe=0;oei;++i)t.call(e||this,this[i],i,this)}),Array.prototype.map||(Array.prototype.map=function(t,e){var i,n,s;if(null==this)throw new TypeError(" this is null or not defined");var o=Object(this),r=o.length>>>0;if("function"!=typeof t)throw new TypeError(t+" is not a function");for(e&&(i=e),n=new Array(r),s=0;r>s;){var a,h;s in o&&(a=o[s],h=t.call(i,a,s,o),n[s]=h),s++}return n}),Array.prototype.filter||(Array.prototype.filter=function(t){"use strict";if(null==this)throw new TypeError;var e=Object(this),i=e.length>>>0;if("function"!=typeof t)throw new TypeError;for(var n=[],s=arguments[1],o=0;i>o;o++)if(o in e){var r=e[o];t.call(s,r,o,e)&&n.push(r)}return n}),Object.keys||(Object.keys=function(){var t=Object.prototype.hasOwnProperty,e=!{toString:null}.propertyIsEnumerable("toString"),i=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],n=i.length;return function(s){if("object"!=typeof s&&"function"!=typeof s||null===s)throw new TypeError("Object.keys called on non-object");var o=[];for(var r in s)t.call(s,r)&&o.push(r);if(e)for(var a=0;n>a;a++)t.call(s,i[a])&&o.push(i[a]);return o}}()),Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),Function.prototype.bind||(Function.prototype.bind=function(t){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var e=Array.prototype.slice.call(arguments,1),i=this,n=function(){},s=function(){return i.apply(this instanceof n&&t?this:t,e.concat(Array.prototype.slice.call(arguments)))};return n.prototype=this.prototype,s.prototype=new n,s}),Object.create||(Object.create=function(t){function e(){}if(arguments.length>1)throw new Error("Object.create implementation only accepts the first parameter.");return e.prototype=t,new e}),Function.prototype.bind||(Function.prototype.bind=function(t){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var e=Array.prototype.slice.call(arguments,1),i=this,n=function(){},s=function(){return i.apply(this instanceof n&&t?this:t,e.concat(Array.prototype.slice.call(arguments)))};return n.prototype=this.prototype,s.prototype=new n,s});var z={};z.isNumber=function(t){return t instanceof Number||"number"==typeof t},z.isString=function(t){return t instanceof String||"string"==typeof t},z.isDate=function(t){if(t instanceof Date)return!0;if(z.isString(t)){var e=P.exec(t);if(e)return!0;if(!isNaN(Date.parse(t)))return!0}return!1},z.isDataTable=function(t){return"undefined"!=typeof google&&google.visualization&&google.visualization.DataTable&&t instanceof google.visualization.DataTable},z.randomUUID=function(){var t=function(){return Math.floor(65536*Math.random()).toString(16)};return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},z.extend=function(t){for(var e=1,i=arguments.length;i>e;e++){var n=arguments[e];for(var s in n)n.hasOwnProperty(s)&&void 0!==n[s]&&(t[s]=n[s])}return t},z.convert=function(t,e){var i;if(void 0===t)return void 0;if(null===t)return null;if(!e)return t;if("string"!=typeof e&&!(e instanceof String))throw new Error("Type must be a string");switch(e){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(z.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(L.isMoment(t))return new Date(t.valueOf());if(z.isString(t))return i=P.exec(t),i?new Date(Number(i[1])):L(t).toDate();throw new Error("Cannot convert object of type "+z.getType(t)+" to type Date");case"Moment":if(z.isNumber(t))return L(t);if(t instanceof Date)return L(t.valueOf());if(L.isMoment(t))return L(t);if(z.isString(t))return i=P.exec(t),L(i?Number(i[1]):t);throw new Error("Cannot convert object of type "+z.getType(t)+" to type Date");case"ISODate":if(z.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(L.isMoment(t))return t.toDate().toISOString();if(z.isString(t))return i=P.exec(t),i?new Date(Number(i[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+z.getType(t)+" to type ISODate");case"ASPDate":if(z.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(z.isString(t)){i=P.exec(t);var n;return n=i?new Date(Number(i[1])).valueOf():new Date(t).valueOf(),"/Date("+n+")/"}throw new Error("Cannot convert object of type "+z.getType(t)+" to type ASPDate");default:throw new Error("Cannot convert object of type "+z.getType(t)+' to type "'+e+'"')}};var P=/^\/?Date\((\-?\d+)/i;z.getType=function(t){var e=typeof t;return"object"==e?null==t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":t instanceof Array?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":e},z.getAbsoluteLeft=function(t){for(var e=document.documentElement,i=document.body,n=t.offsetLeft,s=t.offsetParent;null!=s&&s!=i&&s!=e;)n+=s.offsetLeft,n-=s.scrollLeft,s=s.offsetParent;return n},z.getAbsoluteTop=function(t){for(var e=document.documentElement,i=document.body,n=t.offsetTop,s=t.offsetParent;null!=s&&s!=i&&s!=e;)n+=s.offsetTop,n-=s.scrollTop,s=s.offsetParent;return n},z.getPageY=function(t){if("pageY"in t)return t.pageY;var e;e="targetTouches"in t&&t.targetTouches.length?t.targetTouches[0].clientY:t.clientY;var i=document.documentElement,n=document.body;return e+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)},z.getPageX=function(t){if("pageY"in t)return t.pageX;var e;e="targetTouches"in t&&t.targetTouches.length?t.targetTouches[0].clientX:t.clientX;var i=document.documentElement,n=document.body;return e+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0)},z.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},z.removeClassName=function(t,e){var i=t.className.split(" "),n=i.indexOf(e);-1!=n&&(i.splice(n,1),t.className=i.join(" "))},z.forEach=function(t,e){var i,n;if(t instanceof Array)for(i=0,n=t.length;n>i;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},z.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},z.addEventListener=function(t,e,i,n){t.addEventListener?(void 0===n&&(n=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,n)):t.attachEvent("on"+e,i)},z.removeEventListener=function(t,e,i,n){t.removeEventListener?(void 0===n&&(n=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,n)):t.detachEvent("on"+e,i)},z.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},z.stopPropagation=function(t){t||(t=window.event),t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},z.fakeGesture=function(t,e){var i=null;return N.event.collectEventData(this,i,e)},z.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},z.option={},z.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},z.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},z.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},z.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),z.isString(t)?t:z.isNumber(t)?t+"px":e||null},z.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null};var F={listeners:[],indexOf:function(t){for(var e=this.listeners,i=0,n=this.listeners.length;n>i;i++){var s=e[i];if(s&&s.object==t)return i}return-1},addListener:function(t,e,i){var n=this.indexOf(t),s=this.listeners[n];s||(s={object:t,events:{}},this.listeners.push(s));var o=s.events[e];o||(o=[],s.events[e]=o),-1==o.indexOf(i)&&o.push(i)},removeListener:function(t,e,i){var n=this.indexOf(t),s=this.listeners[n];if(s){var o=s.events[e];o&&(n=o.indexOf(i),-1!=n&&o.splice(n,1),0==o.length&&delete s.events[e]);var r=0,a=s.events;for(var h in a)a.hasOwnProperty(h)&&r++;0==r&&delete this.listeners[n]}},removeAllListeners:function(){this.listeners=[]},trigger:function(t,e,i){var n=this.indexOf(t),s=this.listeners[n];if(s){var o=s.events[e];if(o)for(var r=0,a=o.length;a>r;r++)o[r](i)}}};s.prototype.on=function(t,e,i){var n=t instanceof RegExp?t:new RegExp(t.replace("*","\\w+")),s={id:z.randomUUID(),event:t,regexp:n,callback:"function"==typeof e?e:null,target:i};return this.subscriptions.push(s),s.id},s.prototype.off=function(t){for(var e=0;eo;o++)i=s._addItem(t[o]),n.push(i);else if(z.isDataTable(t))for(var a=this._getColumnNames(t),h=0,d=t.getNumberOfRows();d>h;h++){for(var c={},l=0,u=a.length;u>l;l++){var p=a[l];c[p]=t.getValue(h,l)}i=s._addItem(c),n.push(i)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=s._addItem(t),n.push(i)}return n.length&&this._trigger("add",{items:n},e),n},o.prototype.update=function(t,e){var i=[],n=[],s=this,o=s.fieldId,r=function(t){var e=t[o];s.data[e]?(e=s._updateItem(t),n.push(e)):(e=s._addItem(t),i.push(e))};if(t instanceof Array)for(var a=0,h=t.length;h>a;a++)r(t[a]);else if(z.isDataTable(t))for(var d=this._getColumnNames(t),c=0,l=t.getNumberOfRows();l>c;c++){for(var u={},p=0,f=d.length;f>p;p++){var g=d[p];u[g]=t.getValue(c,p)}r(u)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");r(t)}return i.length&&this._trigger("add",{items:i},e),n.length&&this._trigger("update",{items:n},e),i.concat(n)},o.prototype.get=function(){var t,e,i,n,s=this,o=this.showInternalIds,r=z.getType(arguments[0]);"String"==r||"Number"==r?(t=arguments[0],i=arguments[1],n=arguments[2]):"Array"==r?(e=arguments[0],i=arguments[1],n=arguments[2]):(i=arguments[0],n=arguments[1]);var a;if(i&&i.type){if(a="DataTable"==i.type?"DataTable":"Array",n&&a!=z.getType(n))throw new Error('Type of parameter "data" ('+z.getType(n)+") does not correspond with specified options.type ("+i.type+")");if("DataTable"==a&&!z.isDataTable(n))throw new Error('Parameter "data" must be a DataTable when options.type is "DataTable"')}else a=n?"DataTable"==z.getType(n)?"DataTable":"Array":"Array";void 0!=i&&void 0!=i.showInternalIds&&(this.showInternalIds=i.showInternalIds);var h,d,c,l,u=i&&i.convert||this.options.convert,p=i&&i.filter,f=[];if(void 0!=t)h=s._getItem(t,u),p&&!p(h)&&(h=null);else if(void 0!=e)for(c=0,l=e.length;l>c;c++)h=s._getItem(e[c],u),(!p||p(h))&&f.push(h);else for(d in this.data)this.data.hasOwnProperty(d)&&(h=s._getItem(d,u),(!p||p(h))&&f.push(h));if(this.showInternalIds=o,i&&i.order&&void 0==t&&this._sort(f,i.order),i&&i.fields){var g=i.fields;if(void 0!=t)h=this._filterFields(h,g);else for(c=0,l=f.length;l>c;c++)f[c]=this._filterFields(f[c],g)}if("DataTable"==a){var m=this._getColumnNames(n);if(void 0!=t)s._appendRow(n,m,h);else for(c=0,l=f.length;l>c;c++)s._appendRow(n,m,f[c]);return n}if(void 0!=t)return h;if(n){for(c=0,l=f.length;l>c;c++)n.push(f[c]);return n}return f},o.prototype.getIds=function(t){var e,i,n,s,o,r=this.data,a=t&&t.filter,h=t&&t.order,d=t&&t.convert||this.options.convert,c=[];if(a)if(h){o=[];for(n in r)r.hasOwnProperty(n)&&(s=this._getItem(n,d),a(s)&&o.push(s));for(this._sort(o,h),e=0,i=o.length;i>e;e++)c[e]=o[e][this.fieldId]}else for(n in r)r.hasOwnProperty(n)&&(s=this._getItem(n,d),a(s)&&c.push(s[this.fieldId]));else if(h){o=[];for(n in r)r.hasOwnProperty(n)&&o.push(r[n]);for(this._sort(o,h),e=0,i=o.length;i>e;e++)c[e]=o[e][this.fieldId]}else for(n in r)r.hasOwnProperty(n)&&(s=r[n],c.push(s[this.fieldId]));return c},o.prototype.forEach=function(t,e){var i,n,s=e&&e.filter,o=e&&e.convert||this.options.convert,r=this.data;if(e&&e.order)for(var a=this.get(e),h=0,d=a.length;d>h;h++)i=a[h],n=i[this.fieldId],t(i,n);else for(n in r)r.hasOwnProperty(n)&&(i=this._getItem(n,o),(!s||s(i))&&t(i,n))},o.prototype.map=function(t,e){var i,n=e&&e.filter,s=e&&e.convert||this.options.convert,o=[],r=this.data;for(var a in r)r.hasOwnProperty(a)&&(i=this._getItem(a,s),(!n||n(i))&&o.push(t(i,a)));return e&&e.order&&this._sort(o,e.order),o},o.prototype._filterFields=function(t,e){var i={};for(var n in t)t.hasOwnProperty(n)&&-1!=e.indexOf(n)&&(i[n]=t[n]);return i},o.prototype._sort=function(t,e){if(z.isString(e)){var i=e;t.sort(function(t,e){var n=t[i],s=e[i];return n>s?1:s>n?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},o.prototype.remove=function(t,e){var i,n,s,o=[];if(t instanceof Array)for(i=0,n=t.length;n>i;i++)s=this._remove(t[i]),null!=s&&o.push(s);else s=this._remove(t),null!=s&&o.push(s);return o.length&&this._trigger("remove",{items:o},e),o},o.prototype._remove=function(t){if(z.isNumber(t)||z.isString(t)){if(this.data[t])return delete this.data[t],delete this.internalIds[t],t}else if(t instanceof Object){var e=t[this.fieldId];if(e&&this.data[e])return delete this.data[e],delete this.internalIds[e],e}return null},o.prototype.clear=function(t){var e=Object.keys(this.data);return this.data={},this.internalIds={},this._trigger("remove",{items:e},t),e},o.prototype.max=function(t){var e=this.data,i=null,n=null;for(var s in e)if(e.hasOwnProperty(s)){var o=e[s],r=o[t];null!=r&&(!i||r>n)&&(i=o,n=r)}return i},o.prototype.min=function(t){var e=this.data,i=null,n=null;for(var s in e)if(e.hasOwnProperty(s)){var o=e[s],r=o[t];null!=r&&(!i||n>r)&&(i=o,n=r)}return i},o.prototype.distinct=function(t){var e=this.data,i=[],n=this.options.convert[t],s=0;for(var o in e)if(e.hasOwnProperty(o)){for(var r=e[o],a=z.convert(r[t],n),h=!1,d=0;s>d;d++)if(i[d]==a){h=!0;break}h||(i[s]=a,s++)}return i},o.prototype._addItem=function(t){var e=t[this.fieldId];if(void 0!=e){if(this.data[e])throw new Error("Cannot add item: item with id "+e+" already exists")}else e=z.randomUUID(),t[this.fieldId]=e,this.internalIds[e]=t;var i={};for(var n in t)if(t.hasOwnProperty(n)){var s=this.convert[n];i[n]=z.convert(t[n],s)}return this.data[e]=i,e},o.prototype._getItem=function(t,e){var i,n,s=this.data[t];if(!s)return null;var o={},r=this.fieldId,a=this.internalIds;if(e)for(i in s)s.hasOwnProperty(i)&&(n=s[i],i==r&&n in a&&!this.showInternalIds||(o[i]=z.convert(n,e[i])));else for(i in s)s.hasOwnProperty(i)&&(n=s[i],i==r&&n in a&&!this.showInternalIds||(o[i]=n));return o},o.prototype._updateItem=function(t){var e=t[this.fieldId];if(void 0==e)throw new Error("Cannot update item: item has no id (item: "+JSON.stringify(t)+")");var i=this.data[e];if(!i)throw new Error("Cannot update item: no item with id "+e+" found");for(var n in t)if(t.hasOwnProperty(n)){var s=this.convert[n];i[n]=z.convert(t[n],s)}return e},o.prototype.isInternalId=function(t){return t in this.internalIds},o.prototype._getColumnNames=function(t){for(var e=[],i=0,n=t.getNumberOfColumns();n>i;i++)e[i]=t.getColumnId(i)||t.getColumnLabel(i);return e},o.prototype._appendRow=function(t,e,i){for(var n=t.addRow(),s=0,o=e.length;o>s;s++){var r=e[s];t.setValue(n,s,i[r])}},r.prototype.setData=function(t){var e,i,n;if(this.data){this.data.unsubscribe&&this.data.unsubscribe("*",this.listener),e=[];for(var s in this.ids)this.ids.hasOwnProperty(s)&&e.push(s);this.ids={},this._trigger("remove",{items:e})}if(this.data=t,this.data){for(this.fieldId=this.options.fieldId||this.data&&this.data.options&&this.data.options.fieldId||"id",e=this.data.getIds({filter:this.options&&this.options.filter}),i=0,n=e.length;n>i;i++)s=e[i],this.ids[s]=!0;this._trigger("add",{items:e}),this.data.subscribe&&this.data.subscribe("*",this.listener)}},r.prototype.get=function(){var t,e,i,n=this,s=z.getType(arguments[0]);"String"==s||"Number"==s||"Array"==s?(t=arguments[0],e=arguments[1],i=arguments[2]):(e=arguments[0],i=arguments[1]);var o=z.extend({},this.options,e);this.options.filter&&e&&e.filter&&(o.filter=function(t){return n.options.filter(t)&&e.filter(t)});var r=[];return void 0!=t&&r.push(t),r.push(o),r.push(i),this.data&&this.data.get.apply(this.data,r)},r.prototype.getIds=function(t){var e;if(this.data){var i,n=this.options.filter;i=t&&t.filter?n?function(e){return n(e)&&t.filter(e)}:t.filter:n,e=this.data.getIds({filter:i,order:t&&t.order})}else e=[];return e},r.prototype._onEvent=function(t,e,i){var n,s,o,r,a=e&&e.items,h=this.data,d=[],c=[],l=[];if(a&&h){switch(t){case"add":for(n=0,s=a.length;s>n;n++)o=a[n],r=this.get(o),r&&(this.ids[o]=!0,d.push(o));break;case"update":for(n=0,s=a.length;s>n;n++)o=a[n],r=this.get(o),r?this.ids[o]?c.push(o):(this.ids[o]=!0,d.push(o)):this.ids[o]&&(delete this.ids[o],l.push(o));break;case"remove":for(n=0,s=a.length;s>n;n++)o=a[n],this.ids[o]&&(delete this.ids[o],l.push(o))}d.length&&this._trigger("add",{items:d},i),c.length&&this._trigger("update",{items:c},i),l.length&&this._trigger("remove",{items:l},i)}},r.prototype.subscribe=o.prototype.subscribe,r.prototype.unsubscribe=o.prototype.unsubscribe,r.prototype._trigger=o.prototype._trigger,TimeStep=function(t,e,i){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale=TimeStep.SCALE.DAY,this.step=1,this.setRange(t,e,i)},TimeStep.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},TimeStep.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},TimeStep.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},TimeStep.prototype.roundToMinor=function(){switch(this.scale){case TimeStep.SCALE.YEAR:this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case TimeStep.SCALE.MONTH:this.current.setDate(1);case TimeStep.SCALE.DAY:case TimeStep.SCALE.WEEKDAY:this.current.setHours(0);case TimeStep.SCALE.HOUR:this.current.setMinutes(0);case TimeStep.SCALE.MINUTE:this.current.setSeconds(0);case TimeStep.SCALE.SECOND:this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case TimeStep.SCALE.MILLISECOND:this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case TimeStep.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case TimeStep.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step);break;case TimeStep.SCALE.HOUR:this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case TimeStep.SCALE.MONTH:this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step); +break;case TimeStep.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},TimeStep.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},TimeStep.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case TimeStep.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case TimeStep.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case TimeStep.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case TimeStep.SCALE.HOUR:this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case TimeStep.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case TimeStep.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case TimeStep.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case TimeStep.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()+this.step);break;case TimeStep.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()+this.step);break;case TimeStep.SCALE.HOUR:this.current.setHours(this.current.getHours()+this.step);break;case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case TimeStep.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case TimeStep.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case TimeStep.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},TimeStep.prototype.setAutoScale=function(t){this.autoScale=t},TimeStep.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,n=864e5,s=36e5,o=6e4,r=1e3,a=1;1e3*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=5),e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=TimeStep.SCALE.MONTH,this.step=3),i>t&&(this.scale=TimeStep.SCALE.MONTH,this.step=1),5*n>t&&(this.scale=TimeStep.SCALE.DAY,this.step=5),2*n>t&&(this.scale=TimeStep.SCALE.DAY,this.step=2),n>t&&(this.scale=TimeStep.SCALE.DAY,this.step=1),n/2>t&&(this.scale=TimeStep.SCALE.WEEKDAY,this.step=1),4*s>t&&(this.scale=TimeStep.SCALE.HOUR,this.step=4),s>t&&(this.scale=TimeStep.SCALE.HOUR,this.step=1),15*o>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=15),10*o>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=10),5*o>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=5),o>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=1),15*r>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=15),10*r>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=10),5*r>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=5),r>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=1),200*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=200),100*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=100),50*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=50),10*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=10),5*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=5),a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=1)}},TimeStep.prototype.snap=function(t){if(this.scale==TimeStep.SCALE.YEAR){var e=t.getFullYear()+Math.round(t.getMonth()/12);t.setFullYear(Math.round(e/this.step)*this.step),t.setMonth(0),t.setDate(0),t.setHours(0),t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0)}else if(this.scale==TimeStep.SCALE.MONTH)t.getDate()>15?(t.setDate(1),t.setMonth(t.getMonth()+1)):t.setDate(1),t.setHours(0),t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0);else if(this.scale==TimeStep.SCALE.DAY||this.scale==TimeStep.SCALE.WEEKDAY){switch(this.step){case 5:case 2:t.setHours(24*Math.round(t.getHours()/24));break;default:t.setHours(12*Math.round(t.getHours()/12))}t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0)}else if(this.scale==TimeStep.SCALE.HOUR){switch(this.step){case 4:t.setMinutes(60*Math.round(t.getMinutes()/60));break;default:t.setMinutes(30*Math.round(t.getMinutes()/30))}t.setSeconds(0),t.setMilliseconds(0)}else if(this.scale==TimeStep.SCALE.MINUTE){switch(this.step){case 15:case 10:t.setMinutes(5*Math.round(t.getMinutes()/5)),t.setSeconds(0);break;case 5:t.setSeconds(60*Math.round(t.getSeconds()/60));break;default:t.setSeconds(30*Math.round(t.getSeconds()/30))}t.setMilliseconds(0)}else if(this.scale==TimeStep.SCALE.SECOND)switch(this.step){case 15:case 10:t.setSeconds(5*Math.round(t.getSeconds()/5)),t.setMilliseconds(0);break;case 5:t.setMilliseconds(1e3*Math.round(t.getMilliseconds()/1e3));break;default:t.setMilliseconds(500*Math.round(t.getMilliseconds()/500))}else if(this.scale==TimeStep.SCALE.MILLISECOND){var i=this.step>5?this.step/2:1;t.setMilliseconds(Math.round(t.getMilliseconds()/i)*i)}},TimeStep.prototype.isMajor=function(){switch(this.scale){case TimeStep.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case TimeStep.SCALE.SECOND:return 0==this.current.getSeconds();case TimeStep.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case TimeStep.SCALE.HOUR:return 0==this.current.getHours();case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:return 1==this.current.getDate();case TimeStep.SCALE.MONTH:return 0==this.current.getMonth();case TimeStep.SCALE.YEAR:return!1;default:return!1}},TimeStep.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case TimeStep.SCALE.MILLISECOND:return L(t).format("SSS");case TimeStep.SCALE.SECOND:return L(t).format("s");case TimeStep.SCALE.MINUTE:return L(t).format("HH:mm");case TimeStep.SCALE.HOUR:return L(t).format("HH:mm");case TimeStep.SCALE.WEEKDAY:return L(t).format("ddd D");case TimeStep.SCALE.DAY:return L(t).format("D");case TimeStep.SCALE.MONTH:return L(t).format("MMM");case TimeStep.SCALE.YEAR:return L(t).format("YYYY");default:return""}},TimeStep.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case TimeStep.SCALE.MILLISECOND:return L(t).format("HH:mm:ss");case TimeStep.SCALE.SECOND:return L(t).format("D MMMM HH:mm");case TimeStep.SCALE.MINUTE:case TimeStep.SCALE.HOUR:return L(t).format("ddd D MMMM");case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:return L(t).format("MMMM YYYY");case TimeStep.SCALE.MONTH:return L(t).format("YYYY");case TimeStep.SCALE.YEAR:return"";default:return""}},a.prototype.setOptions=function(t){z.extend(this.options,t)},a.prototype.update=function(){this._order(),this._stack()},a.prototype._order=function(){var t=this.parent.items;if(!t)throw new Error("Cannot stack items: parent does not contain items");var e=[],i=0;z.forEach(t,function(t){t.visible&&(e[i]=t,i++)});var n=this.options.order||this.defaultOptions.order;if("function"!=typeof n)throw new Error("Option order must be a function");e.sort(n),this.ordered=e},a.prototype._stack=function(){var t,e,i,n=this.ordered,s=this.options,o=s.orientation||this.defaultOptions.orientation,r="top"==o;for(i=s.margin&&void 0!==s.margin.item?s.margin.item:this.defaultOptions.margin.item,t=0,e=n.length;e>t;t++){var a=n[t],h=null;do h=this.checkOverlap(n,t,0,t-1,i),null!=h&&(a.top=r?h.top+h.height+i:h.top-a.height-i);while(h)}},a.prototype.checkOverlap=function(t,e,i,n,s){for(var o=this.collision,r=t[e],a=n;a>=i;a--){var h=t[a];if(o(r,h,s)&&a!=e)return h}return null},a.prototype.collision=function(t,e,i){return t.left-ie.left&&t.top-ie.top},h.prototype.setOptions=function(t){z.extend(this.options,t),null!==this.start&&null!==this.end&&this.setRange(this.start,this.end)},h.prototype.subscribe=function(t,e,i){function n(e){s._onMouseWheel(e,t,i)}var s=this;if("move"==e)t.on("dragstart",function(e){s._onDragStart(e,t)}),t.on("drag",function(e){s._onDrag(e,t,i)}),t.on("dragend",function(e){s._onDragEnd(e,t)});else{if("zoom"!=e)throw new TypeError('Unknown event "'+e+'". Choose "move" or "zoom".');t.on("mousewheel",n),t.on("DOMMouseScroll",n),t.on("touch",function(){s._onTouch()}),t.on("pinch",function(e){s._onPinch(e,t,i)})}},h.prototype.on=function(t,e){var i=["rangechange","rangechanged"];if(-1==i.indexOf(t))throw new Error('Unknown event "'+t+'". Choose from '+i.join());F.addListener(this,t,e)},h.prototype.off=function(t,e){F.removeListener(this,t,e)},h.prototype._trigger=function(t){F.trigger(this,t,{start:this.start,end:this.end})},h.prototype.setRange=function(t,e){var i=this._applyRange(t,e);i&&(this._trigger("rangechange"),this._trigger("rangechanged"))},h.prototype._applyRange=function(t,e){var i,n=null!=t?z.convert(t,"Date").valueOf():this.start,s=null!=e?z.convert(e,"Date").valueOf():this.end,o=null!=this.options.max?z.convert(this.options.max,"Date").valueOf():null,r=null!=this.options.min?z.convert(this.options.min,"Date").valueOf():null;if(isNaN(n)||null===n)throw new Error('Invalid start "'+t+'"');if(isNaN(s)||null===s)throw new Error('Invalid end "'+e+'"');if(n>s&&(s=n),null!==r&&r>n&&(i=r-n,n+=i,s+=i,null!=o&&s>o&&(s=o)),null!==o&&s>o&&(i=s-o,n-=i,s-=i,null!=r&&r>n&&(n=r)),null!==this.options.zoomMin){var a=parseFloat(this.options.zoomMin);0>a&&(a=0),a>s-n&&(this.end-this.start===a?(n=this.start,s=this.end):(i=a-(s-n),n-=i/2,s+=i/2))}if(null!==this.options.zoomMax){var h=parseFloat(this.options.zoomMax);0>h&&(h=0),s-n>h&&(this.end-this.start===h?(n=this.start,s=this.end):(i=s-n-h,n+=i/2,s-=i/2))}var d=this.start!=n||this.end!=s;return this.start=n,this.end=s,d},h.prototype.getRange=function(){return{start:this.start,end:this.end}},h.prototype.conversion=function(t){return h.conversion(this.start,this.end,t)},h.conversion=function(t,e,i){return 0!=i&&e-t!=0?{offset:t,scale:i/(e-t)}:{offset:0,scale:1}};var Y={};h.prototype._onDragStart=function(t,e){if(!Y.pinching){Y.start=this.start,Y.end=this.end;var i=e.frame;i&&(i.style.cursor="move")}},h.prototype._onDrag=function(t,e,i){if(d(i),!Y.pinching){var n="horizontal"==i?t.gesture.deltaX:t.gesture.deltaY,s=Y.end-Y.start,o="horizontal"==i?e.width:e.height,r=-n/o*s;this._applyRange(Y.start+r,Y.end+r),this._trigger("rangechange")}},h.prototype._onDragEnd=function(t,e){Y.pinching||(e.frame&&(e.frame.style.cursor="auto"),this._trigger("rangechanged"))},h.prototype._onMouseWheel=function(t,e,i){d(i);var n=0;if(t.wheelDelta?n=t.wheelDelta/120:t.detail&&(n=-t.detail/3),n){var s;s=0>n?1-n/5:1/(1+n/5);var o=z.fakeGesture(this,t),r=c(o.touches[0],e.frame),a=this._pointerToDate(e,i,r);this.zoom(s,a)}z.preventDefault(t)},h.prototype._onTouch=function(){Y.start=this.start,Y.end=this.end,Y.pinching=!1,Y.center=null},h.prototype._onPinch=function(t,e,i){if(Y.pinching=!0,t.gesture.touches.length>1){Y.center||(Y.center=c(t.gesture.center,e.frame));var n=1/t.gesture.scale,s=this._pointerToDate(e,i,Y.center),o=c(t.gesture.center,e.frame),r=(this._pointerToDate(e,i,o),parseInt(s+(Y.start-s)*n)),a=parseInt(s+(Y.end-s)*n);this.setRange(r,a)}},h.prototype._pointerToDate=function(t,e,i){var n;if("horizontal"==e){var s=t.width;return n=this.conversion(s),i.x/n.scale+n.offset}var o=t.height;return n=this.conversion(o),i.y/n.scale+n.offset},h.prototype.zoom=function(t,e){null==e&&(e=(this.start+this.end)/2);var i=e+(this.start-e)*t,n=e+(this.end-e)*t;this.setRange(i,n)},h.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,n=this.end+e*t;this.start=i,this.end=n},h.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,n=this.start-i,s=this.end-i;this.setRange(n,s)},l.prototype.add=function(t){if(void 0==t.id)throw new Error("Component has no field id");if(!(t instanceof u||t instanceof l))throw new TypeError("Component must be an instance of prototype Component or Controller");t.controller=this,this.components[t.id]=t},l.prototype.remove=function(t){var e;for(e in this.components)if(this.components.hasOwnProperty(e)&&(e==t||this.components[e]==t))break;e&&delete this.components[e]},l.prototype.requestReflow=function(t){if(t)this.reflow();else if(!this.reflowTimer){var e=this;this.reflowTimer=setTimeout(function(){e.reflowTimer=void 0,e.reflow()},0)}},l.prototype.requestRepaint=function(t){if(t)this.repaint();else if(!this.repaintTimer){var e=this;this.repaintTimer=setTimeout(function(){e.repaintTimer=void 0,e.repaint()},0)}},l.prototype.repaint=function V(){function V(i,n){n in e||(i.depends&&i.depends.forEach(function(t){V(t,t.id)}),i.parent&&V(i.parent,i.parent.id),t=i.repaint()||t,e[n]=!0)}var t=!1;this.repaintTimer&&(clearTimeout(this.repaintTimer),this.repaintTimer=void 0);var e={};z.forEach(this.components,V),t&&this.reflow()},l.prototype.reflow=function G(){function G(i,n){n in e||(i.depends&&i.depends.forEach(function(t){G(t,t.id)}),i.parent&&G(i.parent,i.parent.id),t=i.reflow()||t,e[n]=!0)}var t=!1;this.reflowTimer&&(clearTimeout(this.reflowTimer),this.reflowTimer=void 0);var e={};z.forEach(this.components,G),t&&this.repaint()},u.prototype.setOptions=function(t){t&&(z.extend(this.options,t),this.controller&&(this.requestRepaint(),this.requestReflow()))},u.prototype.getOption=function(t){var e;return this.options&&(e=this.options[t]),void 0===e&&this.defaultOptions&&(e=this.defaultOptions[t]),e},u.prototype.getContainer=function(){return null},u.prototype.getFrame=function(){return this.frame},u.prototype.repaint=function(){return!1},u.prototype.reflow=function(){return!1},u.prototype.hide=function(){return this.frame&&this.frame.parentNode?(this.frame.parentNode.removeChild(this.frame),!0):!1},u.prototype.show=function(){return this.frame&&this.frame.parentNode?!1:this.repaint()},u.prototype.requestRepaint=function(){if(!this.controller)throw new Error("Cannot request a repaint: no controller configured");this.controller.requestRepaint()},u.prototype.requestReflow=function(){if(!this.controller)throw new Error("Cannot request a reflow: no controller configured");this.controller.requestReflow()},p.prototype=new u,p.prototype.setOptions=u.prototype.setOptions,p.prototype.getContainer=function(){return this.frame},p.prototype.repaint=function(){var t=0,e=z.updateProperty,i=z.option.asSize,n=this.options,s=this.frame;if(!s){s=document.createElement("div"),s.className="panel";var o=n.className;o&&("function"==typeof o?z.addClassName(s,String(o())):z.addClassName(s,String(o))),this.frame=s,t+=1}if(!s.parentNode){if(!this.parent)throw new Error("Cannot repaint panel: no parent attached");var r=this.parent.getContainer();if(!r)throw new Error("Cannot repaint panel: parent has no container element");r.appendChild(s),t+=1}return t+=e(s.style,"top",i(n.top,"0px")),t+=e(s.style,"left",i(n.left,"0px")),t+=e(s.style,"width",i(n.width,"100%")),t+=e(s.style,"height",i(n.height,"100%")),t>0},p.prototype.reflow=function(){var t=0,e=z.updateProperty,i=this.frame;return i?(t+=e(this,"top",i.offsetTop),t+=e(this,"left",i.offsetLeft),t+=e(this,"width",i.offsetWidth),t+=e(this,"height",i.offsetHeight)):t+=1,t>0},f.prototype=new p,f.prototype.setOptions=u.prototype.setOptions,f.prototype.repaint=function(){var t=0,e=z.updateProperty,i=z.option.asSize,n=this.options,s=this.frame;if(s||(s=document.createElement("div"),this.frame=s,t+=1),!s.parentNode){if(!this.container)throw new Error("Cannot repaint root panel: no container attached");this.container.appendChild(s),t+=1}s.className="vis timeline rootpanel "+n.orientation;var o=n.className;return o&&z.addClassName(s,z.option.asString(o)),t+=e(s.style,"top",i(n.top,"0px")),t+=e(s.style,"left",i(n.left,"0px")),t+=e(s.style,"width",i(n.width,"100%")),t+=e(s.style,"height",i(n.height,"100%")),this._updateEventEmitters(),this._updateWatch(),t>0},f.prototype.reflow=function(){var t=0,e=z.updateProperty,i=this.frame;return i?(t+=e(this,"top",i.offsetTop),t+=e(this,"left",i.offsetLeft),t+=e(this,"width",i.offsetWidth),t+=e(this,"height",i.offsetHeight)):t+=1,t>0},f.prototype._updateWatch=function(){var t=this.getOption("autoResize");t?this._watch():this._unwatch()},f.prototype._watch=function(){var t=this;this._unwatch();var e=function(){var e=t.getOption("autoResize");return e?void(t.frame&&(t.frame.clientWidth!=t.width||t.frame.clientHeight!=t.height)&&t.requestReflow()):void t._unwatch()};z.addEventListener(window,"resize",e),this.watchTimer=setInterval(e,1e3)},f.prototype._unwatch=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0)},f.prototype.on=function(t,e){var i=this.listeners[t];i||(i=[],this.listeners[t]=i),i.push(e),this._updateEventEmitters()},f.prototype._updateEventEmitters=function(){if(this.listeners){var t=this;z.forEach(this.listeners,function(e,i){if(t.emitters||(t.emitters={}),!(i in t.emitters)){var n=t.frame;if(n){var s=function(t){e.forEach(function(e){e(t)})};t.emitters[i]=s,t.hammer||(t.hammer=N(n,{prevent_default:!0})),t.hammer.on(i,s)}}})}},g.prototype=new u,g.prototype.setOptions=u.prototype.setOptions,g.prototype.setRange=function(t){if(!(t instanceof h||t&&t.start&&t.end))throw new TypeError("Range must be an instance of Range, or an object containing start and end.");this.range=t},g.prototype.toTime=function(t){var e=this.conversion;return new Date(t/e.scale+e.offset)},g.prototype.toScreen=function(t){var e=this.conversion;return(t.valueOf()-e.offset)*e.scale},g.prototype.repaint=function(){var t=0,e=z.updateProperty,i=z.option.asSize,n=this.options,s=this.getOption("orientation"),o=this.props,r=this.step,a=this.frame;if(a||(a=document.createElement("div"),this.frame=a,t+=1),a.className="axis",!a.parentNode){if(!this.parent)throw new Error("Cannot repaint time axis: no parent attached");var h=this.parent.getContainer();if(!h)throw new Error("Cannot repaint time axis: parent has no container element");h.appendChild(a),t+=1}var d=a.parentNode;if(d){var c=a.nextSibling;d.removeChild(a);var l="bottom"==s&&this.props.parentHeight&&this.height?this.props.parentHeight-this.height+"px":"0px";if(t+=e(a.style,"top",i(n.top,l)),t+=e(a.style,"left",i(n.left,"0px")),t+=e(a.style,"width",i(n.width,"100%")),t+=e(a.style,"height",i(n.height,this.height+"px")),this._repaintMeasureChars(),this.step){this._repaintStart(),r.first();for(var u=void 0,p=0;r.hasNext()&&1e3>p;){p++;var f=r.getCurrent(),g=this.toScreen(f),m=r.isMajor();this.getOption("showMinorLabels")&&this._repaintMinorText(g,r.getLabelMinor()),m&&this.getOption("showMajorLabels")?(g>0&&(void 0==u&&(u=g),this._repaintMajorText(g,r.getLabelMajor())),this._repaintMajorLine(g)):this._repaintMinorLine(g),r.next()}if(this.getOption("showMajorLabels")){var v=this.toTime(0),y=r.getLabelMajor(v),_=y.length*(o.majorCharWidth||10)+10;(void 0==u||u>_)&&this._repaintMajorText(0,y)}this._repaintEnd()}this._repaintLine(),c?d.insertBefore(a,c):d.appendChild(a)}return t>0},g.prototype._repaintStart=function(){var t=this.dom,e=t.redundant;e.majorLines=t.majorLines,e.majorTexts=t.majorTexts,e.minorLines=t.minorLines,e.minorTexts=t.minorTexts,t.majorLines=[],t.majorTexts=[],t.minorLines=[],t.minorTexts=[]},g.prototype._repaintEnd=function(){z.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},g.prototype._repaintMinorText=function(t,e){var i=this.dom.redundant.minorTexts.shift();if(!i){var n=document.createTextNode("");i=document.createElement("div"),i.appendChild(n),i.className="text minor",this.frame.appendChild(i)}this.dom.minorTexts.push(i),i.childNodes[0].nodeValue=e,i.style.left=t+"px",i.style.top=this.props.minorLabelTop+"px"},g.prototype._repaintMajorText=function(t,e){var i=this.dom.redundant.majorTexts.shift();if(!i){var n=document.createTextNode(e);i=document.createElement("div"),i.className="text major",i.appendChild(n),this.frame.appendChild(i)}this.dom.majorTexts.push(i),i.childNodes[0].nodeValue=e,i.style.top=this.props.majorLabelTop+"px",i.style.left=t+"px"},g.prototype._repaintMinorLine=function(t){var e=this.dom.redundant.minorLines.shift();e||(e=document.createElement("div"),e.className="grid vertical minor",this.frame.appendChild(e)),this.dom.minorLines.push(e);var i=this.props;e.style.top=i.minorLineTop+"px",e.style.height=i.minorLineHeight+"px",e.style.left=t-i.minorLineWidth/2+"px"},g.prototype._repaintMajorLine=function(t){var e=this.dom.redundant.majorLines.shift();e||(e=document.createElement("DIV"),e.className="grid vertical major",this.frame.appendChild(e)),this.dom.majorLines.push(e);var i=this.props;e.style.top=i.majorLineTop+"px",e.style.left=t-i.majorLineWidth/2+"px",e.style.height=i.majorLineHeight+"px"},g.prototype._repaintLine=function(){{var t=this.dom.line,e=this.frame;this.options}this.getOption("showMinorLabels")||this.getOption("showMajorLabels")?(t?(e.removeChild(t),e.appendChild(t)):(t=document.createElement("div"),t.className="grid horizontal major",e.appendChild(t),this.dom.line=t),t.style.top=this.props.lineTop+"px"):t&&t.parentElement&&(e.removeChild(t.line),delete this.dom.line)},g.prototype._repaintMeasureChars=function(){var t,e=this.dom;if(!e.measureCharMinor){t=document.createTextNode("0");var i=document.createElement("DIV");i.className="text minor measure",i.appendChild(t),this.frame.appendChild(i),e.measureCharMinor=i}if(!e.measureCharMajor){t=document.createTextNode("0");var n=document.createElement("DIV");n.className="text major measure",n.appendChild(t),this.frame.appendChild(n),e.measureCharMajor=n}},g.prototype.reflow=function(){var t=0,e=z.updateProperty,i=this.frame,n=this.range;if(!n)throw new Error("Cannot repaint time axis: no range configured");if(i){t+=e(this,"top",i.offsetTop),t+=e(this,"left",i.offsetLeft);var s=this.props,o=this.getOption("showMinorLabels"),r=this.getOption("showMajorLabels"),a=this.dom.measureCharMinor,h=this.dom.measureCharMajor;a&&(s.minorCharHeight=a.clientHeight,s.minorCharWidth=a.clientWidth),h&&(s.majorCharHeight=h.clientHeight,s.majorCharWidth=h.clientWidth);var d=i.parentNode?i.parentNode.offsetHeight:0;switch(d!=s.parentHeight&&(s.parentHeight=d,t+=1),this.getOption("orientation")){case"bottom":s.minorLabelHeight=o?s.minorCharHeight:0,s.majorLabelHeight=r?s.majorCharHeight:0,s.minorLabelTop=0,s.majorLabelTop=s.minorLabelTop+s.minorLabelHeight,s.minorLineTop=-this.top,s.minorLineHeight=Math.max(this.top+s.majorLabelHeight,0),s.minorLineWidth=1,s.majorLineTop=-this.top,s.majorLineHeight=Math.max(this.top+s.minorLabelHeight+s.majorLabelHeight,0),s.majorLineWidth=1,s.lineTop=0;break;case"top":s.minorLabelHeight=o?s.minorCharHeight:0,s.majorLabelHeight=r?s.majorCharHeight:0,s.majorLabelTop=0,s.minorLabelTop=s.majorLabelTop+s.majorLabelHeight,s.minorLineTop=s.minorLabelTop,s.minorLineHeight=Math.max(d-s.majorLabelHeight-this.top),s.minorLineWidth=1,s.majorLineTop=0,s.majorLineHeight=Math.max(d-this.top),s.majorLineWidth=1,s.lineTop=s.majorLabelHeight+s.minorLabelHeight;break;default:throw new Error('Unkown orientation "'+this.getOption("orientation")+'"')}var c=s.minorLabelHeight+s.majorLabelHeight;t+=e(this,"width",i.offsetWidth),t+=e(this,"height",c),this._updateConversion();var l=z.convert(n.start,"Number"),u=z.convert(n.end,"Number"),p=this.toTime(5*(s.minorCharWidth||10)).valueOf()-this.toTime(0).valueOf();this.step=new TimeStep(new Date(l),new Date(u),p),t+=e(s.range,"start",l),t+=e(s.range,"end",u),t+=e(s.range,"minimumStep",p.valueOf())}return t>0},g.prototype._updateConversion=function(){var t=this.range;if(!t)throw new Error("No range configured");this.conversion=t.conversion?t.conversion(this.width):h.conversion(t.start,t.end,this.width)},m.prototype=new u,m.prototype.setOptions=u.prototype.setOptions,m.prototype.getContainer=function(){return this.frame},m.prototype.repaint=function(){var t=this.frame,e=this.parent,i=e.parent.getContainer();if(!e)throw new Error("Cannot repaint bar: no parent attached");if(!i)throw new Error("Cannot repaint bar: parent has no container element");if(!this.getOption("showCurrentTime"))return void(t&&(i.removeChild(t),delete this.frame));t||(t=document.createElement("div"),t.className="currenttime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",i.appendChild(t),this.frame=t),e.conversion||e._updateConversion();var n=new Date,s=e.toScreen(n);t.style.left=s+"px",t.title="Current time: "+n,void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer);var o=this,r=1/e.conversion.scale/2;return 30>r&&(r=30),this.currentTimeTimer=setTimeout(function(){o.repaint()},r),!1},v.prototype=new u,v.prototype.setOptions=u.prototype.setOptions,v.prototype.getContainer=function(){return this.frame},v.prototype.repaint=function(){var t=this.frame,e=this.parent,i=e.parent.getContainer();if(!e)throw new Error("Cannot repaint bar: no parent attached");if(!i)throw new Error("Cannot repaint bar: parent has no container element");if(!this.getOption("showCustomTime"))return void(t&&(i.removeChild(t),delete this.frame));if(!t){t=document.createElement("div"),t.className="customtime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",i.appendChild(t);var n=document.createElement("div");n.style.position="relative",n.style.top="0px",n.style.left="-10px",n.style.height="100%",n.style.width="20px",t.appendChild(n),this.frame=t,this.subscribe(this,"movetime")}e.conversion||e._updateConversion();var s=e.toScreen(this.customTime);return t.style.left=s+"px",t.title="Time: "+this.customTime,!1},v.prototype._setCustomTime=function(t){this.customTime=new Date(t.valueOf()),this.repaint()},v.prototype._getCustomTime=function(){return new Date(this.customTime.valueOf())},v.prototype.subscribe=function(t,e){var i=this,n={component:t,event:e,callback:function(t){i._onMouseDown(t,n)},params:{}};t.on("mousedown",n.callback),i.listeners.push(n)},v.prototype.on=function(t,e){var i=this.frame;if(!i)throw new Error("Cannot add event listener: no parent attached");F.addListener(this,t,e),z.addEventListener(i,t,e)},v.prototype._onMouseDown=function(t,e){t=t||window.event;var i=e.params,n=t.which?1==t.which:1==t.button;if(n){i.mouseX=z.getPageX(t),i.moved=!1,i.customTime=this.customTime;var s=this;i.onMouseMove||(i.onMouseMove=function(t){s._onMouseMove(t,e)},z.addEventListener(document,"mousemove",i.onMouseMove)),i.onMouseUp||(i.onMouseUp=function(t){s._onMouseUp(t,e)},z.addEventListener(document,"mouseup",i.onMouseUp)),z.stopPropagation(t),z.preventDefault(t)}},v.prototype._onMouseMove=function(t,e){t=t||window.event;var i=e.params,n=this.parent,s=z.getPageX(t);void 0===i.mouseX&&(i.mouseX=s);var o=s-i.mouseX;Math.abs(o)>=1&&(i.moved=!0);var r=n.toScreen(i.customTime),a=r+o,h=n.toTime(a);this._setCustomTime(h),F.trigger(this,"timechange",{customTime:this.customTime}),z.preventDefault(t)},v.prototype._onMouseUp=function(t,e){t=t||window.event;var i=e.params;i.onMouseMove&&(z.removeEventListener(document,"mousemove",i.onMouseMove),i.onMouseMove=null),i.onMouseUp&&(z.removeEventListener(document,"mouseup",i.onMouseUp),i.onMouseUp=null),i.moved&&F.trigger(this,"timechanged",{customTime:this.customTime})},y.prototype=new p,y.types={box:w,range:S,rangeoverflow:E,point:b},y.prototype.setOptions=u.prototype.setOptions,y.prototype.setRange=function(t){if(!(t instanceof h||t&&t.start&&t.end))throw new TypeError("Range must be an instance of Range, or an object containing start and end.");this.range=t},y.prototype.setSelection=function(t){var e,i,n,s,o;if(t){if(!Array.isArray(t))throw new TypeError("Array expected");for(e=0,i=this.selection.length;i>e;e++)n=this.selection[e],s=this.items[n],s&&s.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)n=t[e],s=this.items[n],s&&(this.selection.push(n),s.select());o=this.selection.concat([]),F.trigger(this,"select",{ids:o}),this.controller&&this.requestRepaint()}},y.prototype.getSelection=function(){return this.selection.concat([])},y.prototype._deselect=function(t){for(var e=this.selection,i=0,n=e.length;n>i;i++)if(e[i]==t){e.splice(i,1);break}},y.prototype.repaint=function(){var t=0,e=z.updateProperty,i=z.option.asSize,n=this.options,s=this.getOption("orientation"),o=this.defaultOptions,r=this.frame;if(!r){r=document.createElement("div"),r.className="itemset";var a=n.className;a&&z.addClassName(r,z.option.asString(a));var h=document.createElement("div");h.className="background",r.appendChild(h),this.dom.background=h;var d=document.createElement("div");d.className="foreground",r.appendChild(d),this.dom.foreground=d;var c=document.createElement("div");c.className="itemset-axis",this.dom.axis=c,this.frame=r,t+=1}if(!this.parent)throw new Error("Cannot repaint itemset: no parent attached");var l=this.parent.getContainer();if(!l)throw new Error("Cannot repaint itemset: parent has no container element");r.parentNode||(l.appendChild(r),t+=1),this.dom.axis.parentNode||(l.appendChild(this.dom.axis),t+=1),t+=e(r.style,"left",i(n.left,"0px")),t+=e(r.style,"top",i(n.top,"0px")),t+=e(r.style,"width",i(n.width,"100%")),t+=e(r.style,"height",i(n.height,this.height+"px")),t+=e(this.dom.axis.style,"left",i(n.left,"0px")),t+=e(this.dom.axis.style,"width",i(n.width,"100%")),t+="bottom"==s?e(this.dom.axis.style,"top",this.height+this.top+"px"):e(this.dom.axis.style,"top",this.top+"px"),this._updateConversion();var u=this,p=this.queue,f=this.itemsData,g=this.items,m={};for(var v in p)if(p.hasOwnProperty(v)){var _=p[v],w=g[v],b=_.action;switch(b){case"add":case"update":var S=f&&f.get(v,m);if(S){var E=S.type||S.start&&S.end&&"range"||n.type||"box",T=y.types[E];if(w&&(T&&w instanceof T?(w.data=S,t++):(t+=w.hide(),w=null)),!w){if(!T)throw new TypeError('Unknown item type "'+E+'"');w=new T(u,S,n,o),w.id=_.id,t++}w.repaint(),g[v]=w}delete p[v];break;case"remove":w&&(w.selected&&u._deselect(v),t+=w.hide()),delete g[v],delete p[v];break;default:console.log('Error: unknown action "'+b+'"')}}return z.forEach(this.items,function(e){e.visible?(t+=e.show(),e.reposition()):t+=e.hide()}),t>0},y.prototype.getForeground=function(){return this.dom.foreground},y.prototype.getBackground=function(){return this.dom.background},y.prototype.getAxis=function(){return this.dom.axis},y.prototype.reflow=function(){var t=0,e=this.options,i=e.margin&&e.margin.axis||this.defaultOptions.margin.axis,n=e.margin&&e.margin.item||this.defaultOptions.margin.item,s=z.updateProperty,o=z.option.asNumber,r=z.option.asSize,a=this.frame;if(a){this._updateConversion(),z.forEach(this.items,function(e){t+=e.reflow()}),this.stack.update();var h,d=o(e.maxHeight),c=null!=r(e.height);if(c)h=a.offsetHeight;else{var l=this.stack.ordered;if(l.length){var u=l[0].top,p=l[0].top+l[0].height;z.forEach(l,function(t){u=Math.min(u,t.top),p=Math.max(p,t.top+t.height)}),h=p-u+i+n}else h=i+n}null!=d&&(h=Math.min(h,d)),t+=s(this,"height",h),t+=s(this,"top",a.offsetTop),t+=s(this,"left",a.offsetLeft),t+=s(this,"width",a.offsetWidth)}else t+=1;return t>0},y.prototype.hide=function(){var t=!1;return this.frame&&this.frame.parentNode&&(this.frame.parentNode.removeChild(this.frame),t=!0),this.dom.axis&&this.dom.axis.parentNode&&(this.dom.axis.parentNode.removeChild(this.dom.axis),t=!0),t +},y.prototype.setItems=function(t){var e,i=this,n=this.itemsData;if(t){if(!(t instanceof o||t instanceof r))throw new TypeError("Data must be an instance of DataSet");this.itemsData=t}else this.itemsData=null;if(n&&(z.forEach(this.listeners,function(t,e){n.unsubscribe(e,t)}),e=n.getIds(),this._onRemove(e)),this.itemsData){var s=this.id;z.forEach(this.listeners,function(t,e){i.itemsData.subscribe(e,t,s)}),e=this.itemsData.getIds(),this._onAdd(e)}},y.prototype.getItems=function(){return this.itemsData},y.prototype._onUpdate=function(t){this._toQueue("update",t)},y.prototype._onAdd=function(t){this._toQueue("add",t)},y.prototype._onRemove=function(t){this._toQueue("remove",t)},y.prototype._toQueue=function(t,e){var i=this.queue;e.forEach(function(e){i[e]={id:e,action:t}}),this.controller&&this.requestRepaint()},y.prototype._updateConversion=function(){var t=this.range;if(!t)throw new Error("No range configured");this.conversion=t.conversion?t.conversion(this.width):h.conversion(t.start,t.end,this.width)},y.prototype.toTime=function(t){var e=this.conversion;return new Date(t/e.scale+e.offset)},y.prototype.toScreen=function(t){var e=this.conversion;return(t.valueOf()-e.offset)*e.scale},_.prototype.select=function(){this.selected=!0,this.visible&&this.repaint()},_.prototype.unselect=function(){this.selected=!1,this.visible&&this.repaint()},_.prototype.show=function(){return!1},_.prototype.hide=function(){return!1},_.prototype.repaint=function(){return!1},_.prototype.reflow=function(){return!1},_.prototype.getWidth=function(){return this.width},w.prototype=new _(null,null),w.prototype.repaint=function(){var t=!1,e=this.dom;if(e||(this._create(),e=this.dom,t=!0),e){if(!this.parent)throw new Error("Cannot repaint item: no parent attached");if(!e.box.parentNode){var i=this.parent.getForeground();if(!i)throw new Error("Cannot repaint time axis: parent has no foreground container element");i.appendChild(e.box),t=!0}if(!e.line.parentNode){var n=this.parent.getBackground();if(!n)throw new Error("Cannot repaint time axis: parent has no background container element");n.appendChild(e.line),t=!0}if(!e.dot.parentNode){var s=this.parent.getAxis();if(!n)throw new Error("Cannot repaint time axis: parent has no axis container element");s.appendChild(e.dot),t=!0}if(this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)e.content.innerHTML="",e.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);e.content.innerHTML=this.content}t=!0}var o=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=o&&(this.className=o,e.box.className="item box"+o,e.line.className="item line"+o,e.dot.className="item dot"+o,t=!0)}return t},w.prototype.show=function(){return this.dom&&this.dom.box.parentNode?!1:this.repaint()},w.prototype.hide=function(){var t=!1,e=this.dom;return e&&(e.box.parentNode&&(e.box.parentNode.removeChild(e.box),t=!0),e.line.parentNode&&e.line.parentNode.removeChild(e.line),e.dot.parentNode&&e.dot.parentNode.removeChild(e.dot)),t},w.prototype.reflow=function(){var t,e,i,n,s,o,r,a,h,d,c,l,u=0;if(void 0==this.data.start)throw new Error('Property "start" missing in item '+this.data.id);if(c=this.data,l=this.parent&&this.parent.range,c&&l){var p=l.end-l.start;this.visible=c.start>l.start-p&&c.start0},w.prototype._create=function(){var t=this.dom;t||(this.dom=t={},t.box=document.createElement("DIV"),t.content=document.createElement("DIV"),t.content.className="content",t.box.appendChild(t.content),t.line=document.createElement("DIV"),t.line.className="line",t.dot=document.createElement("DIV"),t.dot.className="dot",t.box["timeline-item"]=this)},w.prototype.reposition=function(){var t=this.dom,e=this.props,i=this.options.orientation||this.defaultOptions.orientation;if(t){var n=t.box,s=t.line,o=t.dot;n.style.left=this.left+"px",n.style.top=this.top+"px",s.style.left=e.line.left+"px","top"==i?(s.style.top="0px",s.style.height=this.top+"px"):(s.style.top=this.top+this.height+"px",s.style.height=Math.max(this.parent.height-this.top-this.height+this.props.dot.height/2,0)+"px"),o.style.left=e.dot.left+"px",o.style.top=e.dot.top+"px"}},b.prototype=new _(null,null),b.prototype.repaint=function(){var t=!1,e=this.dom;if(e||(this._create(),e=this.dom,t=!0),e){if(!this.parent)throw new Error("Cannot repaint item: no parent attached");var i=this.parent.getForeground();if(!i)throw new Error("Cannot repaint time axis: parent has no foreground container element");if(e.point.parentNode||(i.appendChild(e.point),i.appendChild(e.point),t=!0),this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)e.content.innerHTML="",e.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);e.content.innerHTML=this.content}t=!0}var n=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=n&&(this.className=n,e.point.className="item point"+n,t=!0)}return t},b.prototype.show=function(){return this.dom&&this.dom.point.parentNode?!1:this.repaint()},b.prototype.hide=function(){var t=!1,e=this.dom;return e&&e.point.parentNode&&(e.point.parentNode.removeChild(e.point),t=!0),t},b.prototype.reflow=function(){var t,e,i,n,s,o,r,a,h,d,c=0;if(void 0==this.data.start)throw new Error('Property "start" missing in item '+this.data.id);if(h=this.data,d=this.parent&&this.parent.range,h&&d){var l=d.end-d.start;this.visible=h.start>d.start-l&&h.start0},b.prototype._create=function(){var t=this.dom;t||(this.dom=t={},t.point=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.point.appendChild(t.content),t.dot=document.createElement("div"),t.dot.className="dot",t.point.appendChild(t.dot),t.point["timeline-item"]=this)},b.prototype.reposition=function(){var t=this.dom,e=this.props;t&&(t.point.style.top=this.top+"px",t.point.style.left=this.left+"px",t.content.style.marginLeft=e.content.marginLeft+"px",t.dot.style.top=e.dot.top+"px")},S.prototype=new _(null,null),S.prototype.repaint=function(){var t=!1,e=this.dom;if(e||(this._create(),e=this.dom,t=!0),e){if(!this.parent)throw new Error("Cannot repaint item: no parent attached");var i=this.parent.getForeground();if(!i)throw new Error("Cannot repaint time axis: parent has no foreground container element");if(e.box.parentNode||(i.appendChild(e.box),t=!0),this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)e.content.innerHTML="",e.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);e.content.innerHTML=this.content}t=!0}var n=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=n&&(this.className=n,e.box.className="item range"+n,t=!0)}return t},S.prototype.show=function(){return this.dom&&this.dom.box.parentNode?!1:this.repaint()},S.prototype.hide=function(){var t=!1,e=this.dom;return e&&e.box.parentNode&&(e.box.parentNode.removeChild(e.box),t=!0),t},S.prototype.reflow=function(){var t,e,i,n,s,o,r,a,h,d,c,l,u,p,f,g,m=0;if(void 0==this.data.start)throw new Error('Property "start" missing in item '+this.data.id);if(void 0==this.data.end)throw new Error('Property "end" missing in item '+this.data.id);return h=this.data,d=this.parent&&this.parent.range,this.visible=h&&d?h.startd.start:!1,this.visible&&(t=this.dom,t?(e=this.props,i=this.options,o=this.parent,r=o.toScreen(this.data.start),a=o.toScreen(this.data.end),c=z.updateProperty,l=t.box,u=o.width,f=i.orientation||this.defaultOptions.orientation,n=i.margin&&i.margin.axis||this.defaultOptions.margin.axis,s=i.padding||this.defaultOptions.padding,m+=c(e.content,"width",t.content.offsetWidth),m+=c(this,"height",l.offsetHeight),-u>r&&(r=-u),a>2*u&&(a=2*u),p=0>r?Math.min(-r,a-r-e.content.width-2*s):0,m+=c(e.content,"left",p),"top"==f?(g=n,m+=c(this,"top",g)):(g=o.height-this.height-n,m+=c(this,"top",g)),m+=c(this,"left",r),m+=c(this,"width",Math.max(a-r,1))):m+=1),m>0},S.prototype._create=function(){var t=this.dom;t||(this.dom=t={},t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this)},S.prototype.reposition=function(){var t=this.dom,e=this.props;t&&(t.box.style.top=this.top+"px",t.box.style.left=this.left+"px",t.box.style.width=this.width+"px",t.content.style.left=e.content.left+"px")},E.prototype=new S(null,null),E.prototype.repaint=function(){var t=!1,e=this.dom;if(e||(this._create(),e=this.dom,t=!0),e){if(!this.parent)throw new Error("Cannot repaint item: no parent attached");var i=this.parent.getForeground();if(!i)throw new Error("Cannot repaint time axis: parent has no foreground container element");if(e.box.parentNode||(i.appendChild(e.box),t=!0),this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)e.content.innerHTML="",e.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);e.content.innerHTML=this.content}t=!0}var n=this.data.className?" "+this.data.className:"";this.className!=n&&(this.className=n,e.box.className="item rangeoverflow"+n,t=!0)}return t},E.prototype.getWidth=function(){return void 0!==this.props.content&&this.width0},x.prototype=new p,x.prototype.setOptions=u.prototype.setOptions,x.prototype.setRange=function(){},x.prototype.setItems=function(t){this.itemsData=t;for(var e in this.groups)if(this.groups.hasOwnProperty(e)){var i=this.groups[e];i.setItems(t)}},x.prototype.getItems=function(){return this.itemsData},x.prototype.setRange=function(t){this.range=t},x.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(z.forEach(this.listeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this._onRemove(e)),t?t instanceof o?this.groupsData=t:(this.groupsData=new o({convert:{start:"Date",end:"Date"}}),this.groupsData.add(t)):this.groupsData=null,this.groupsData){var n=this.id;z.forEach(this.listeners,function(t,e){i.groupsData.subscribe(e,t,n)}),e=this.groupsData.getIds(),this._onAdd(e)}},x.prototype.getGroups=function(){return this.groupsData},x.prototype.setSelection=function(t){var e=[],i=this.groups;for(var n in i)if(i.hasOwnProperty(n)){var s=i[n];s.setSelection(t)}return e},x.prototype.getSelection=function(){var t=[],e=this.groups;for(var i in e)if(e.hasOwnProperty(i)){var n=e[i];t=t.concat(n.getSelection())}return t},x.prototype.repaint=function(){var t,e,i,n,s=0,o=z.updateProperty,r=z.option.asSize,a=z.option.asElement,h=this.options,d=this.dom.frame,c=this.dom.labels,l=this.dom.labelSet;if(!this.parent)throw new Error("Cannot repaint groupset: no parent attached");var u=this.parent.getContainer();if(!u)throw new Error("Cannot repaint groupset: parent has no container element");if(!d){d=document.createElement("div"),d.className="groupset",this.dom.frame=d;var p=h.className;p&&z.addClassName(d,z.option.asString(p)),s+=1}d.parentNode||(u.appendChild(d),s+=1);var f=a(h.labelContainer);if(!f)throw new Error('Cannot repaint groupset: option "labelContainer" not defined');c||(c=document.createElement("div"),c.className="labels",this.dom.labels=c),l||(l=document.createElement("div"),l.className="label-set",c.appendChild(l),this.dom.labelSet=l),c.parentNode&&c.parentNode==f||(c.parentNode&&c.parentNode.removeChild(c.parentNode),f.appendChild(c)),s+=o(d.style,"height",r(h.height,this.height+"px")),s+=o(d.style,"top",r(h.top,"0px")),s+=o(d.style,"left",r(h.left,"0px")),s+=o(d.style,"width",r(h.width,"100%")),s+=o(l.style,"top",r(h.top,"0px")),s+=o(l.style,"height",r(h.height,this.height+"px"));var g=this,m=this.queue,v=this.groups,y=this.groupsData,_=Object.keys(m);if(_.length){_.forEach(function(t){var e=m[t],i=v[t];switch(e){case"add":case"update":if(!i){var n=Object.create(g.options);z.extend(n,{height:null,maxHeight:null}),i=new T(g,t,n),i.setItems(g.itemsData),v[t]=i,g.controller.add(i)}i.data=y.get(t),delete m[t];break;case"remove":i&&(i.setItems(),delete v[t],g.controller.remove(i)),delete m[t];break;default:console.log('Error: unknown action "'+e+'"')}});var w=this.groupsData.getIds({order:this.options.groupOrder});for(t=0;t0},x.prototype._createLabel=function(t){var e=this.groups[t],i=document.createElement("div");i.className="label";var n=document.createElement("div");n.className="inner",i.appendChild(n);var s=e.data&&e.data.content;s instanceof Element?n.appendChild(s):void 0!=s&&(n.innerHTML=s);var o=e.data&&e.data.className;return o&&z.addClassName(i,o),e.label=i,i},x.prototype.getContainer=function(){return this.dom.frame},x.prototype.getLabelsWidth=function(){return this.props.labels.width},x.prototype.reflow=function(){var t,e,i=0,n=this.options,s=z.updateProperty,o=z.option.asNumber,r=z.option.asSize,a=this.dom.frame;if(a){var h,d=o(n.maxHeight),c=null!=r(n.height);if(c)h=a.offsetHeight;else{h=0;for(t in this.groups)this.groups.hasOwnProperty(t)&&(e=this.groups[t],h+=e.height)}null!=d&&(h=Math.min(h,d)),i+=s(this,"height",h),i+=s(this,"top",a.offsetTop),i+=s(this,"left",a.offsetLeft),i+=s(this,"width",a.offsetWidth)}var l=0;for(t in this.groups)if(this.groups.hasOwnProperty(t)){e=this.groups[t];var u=e.props&&e.props.label&&e.props.label.width||0;l=Math.max(l,u)}return i+=s(this.props.labels,"width",l),i>0},x.prototype.hide=function(){return this.dom.frame&&this.dom.frame.parentNode?(this.dom.frame.parentNode.removeChild(this.dom.frame),!0):!1},x.prototype.show=function(){return this.dom.frame&&this.dom.frame.parentNode?!1:this.repaint()},x.prototype._onUpdate=function(t){this._toQueue(t,"update")},x.prototype._onAdd=function(t){this._toQueue(t,"add")},x.prototype._onRemove=function(t){this._toQueue(t,"remove")},x.prototype._toQueue=function(t,e){var i=this.queue;t.forEach(function(t){i[t]=e}),this.controller&&this.requestRepaint()},C.prototype.setOptions=function(t){z.extend(this.options,t),this.range.setRange(t.start,t.end),this.controller.reflow(),this.controller.repaint()},C.prototype.setCustomTime=function(t){this.customtime._setCustomTime(t)},C.prototype.getCustomTime=function(){return new Date(this.customtime.customTime.valueOf())},C.prototype.setItems=function(t){var e,i=null==this.itemsData;if(t?t instanceof o&&(e=t):e=null,t instanceof o||(e=new o({convert:{start:"Date",end:"Date"}}),e.add(t)),this.itemsData=e,this.content.setItems(e),i&&(void 0==this.options.start||void 0==this.options.end)){var n=this.getItemRange(),s=n.min,r=n.max;if(null!=s&&null!=r){var a=r.valueOf()-s.valueOf();0>=a&&(a=864e5),s=new Date(s.valueOf()-.05*a),r=new Date(r.valueOf()+.05*a)}void 0!=this.options.start&&(s=z.convert(this.options.start,"Date")),void 0!=this.options.end&&(r=z.convert(this.options.end,"Date")),(null!=s||null!=r)&&this.range.setRange(s,r)}},C.prototype.setGroups=function(t){var e=this;this.groupsData=t;var i=this.groupsData?x:y;if(!(this.content instanceof i)){this.content&&(this.content.hide(),this.content.setItems&&this.content.setItems(),this.content.setGroups&&this.content.setGroups(),this.controller.remove(this.content));var n=Object.create(this.options);z.extend(n,{top:function(){return"top"==e.options.orientation?e.timeaxis.height:e.itemPanel.height-e.timeaxis.height-e.content.height},left:null,width:"100%",height:function(){return e.options.height?e.itemPanel.height-e.timeaxis.height:null},maxHeight:function(){if(e.options.maxHeight){if(!z.isNumber(e.options.maxHeight))throw new TypeError("Number expected for property maxHeight");return e.options.maxHeight-e.timeaxis.height}return null},labelContainer:function(){return e.labelPanel.getContainer()}}),this.content=new i(this.itemPanel,[this.timeaxis],n),this.content.setRange&&this.content.setRange(this.range),this.content.setItems&&this.content.setItems(this.itemsData),this.content.setGroups&&this.content.setGroups(this.groupsData),this.controller.add(this.content)}},C.prototype.getItemRange=function(){var t=this.itemsData,e=null,i=null;if(t){var n=t.min("start");e=n?n.start.valueOf():null;var s=t.max("start");s&&(i=s.start.valueOf());var o=t.max("end");o&&(i=null==i?o.end.valueOf():Math.max(i,o.end.valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},C.prototype.setSelection=function(t){this.content&&this.content.setSelection(t)},C.prototype.getSelection=function(){return this.content?this.content.getSelection():[]},C.prototype.on=function(t,e){var i=["rangechange","rangechanged","select"];if(-1==i.indexOf(t))throw new Error('Unknown event "'+t+'". Choose from '+i.join());F.addListener(this,t,e)},C.prototype.off=function(t,e){F.removeListener(this,t,e)},C.prototype._trigger=function(t,e){F.trigger(this,t,e||{})},C.prototype._onSelectItem=function(t){var e=this._itemFromTarget(t),i=e?[e.id]:[];this.setSelection(i),this._trigger("select",{items:this.getSelection()}),t.stopPropagation()},C.prototype._onMultiSelectItem=function(t){var e,i=this._itemFromTarget(t);if(i){e=this.getSelection();var n=e.indexOf(i.id);-1==n?e.push(i.id):e.splice(n,1),this.setSelection(e),this._trigger("select",{items:this.getSelection()}),t.stopPropagation()}},C.prototype._itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},function(t){function e(t){return C=t,u()}function i(){M=0,D=C.charAt(0)}function n(){M++,D=C.charAt(M)}function s(){return C.charAt(M+1)}function o(t){return N.test(t)}function r(t,e){if(t||(t={}),e)for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function a(t,e,i){for(var n=e.split("."),s=t;n.length;){var o=n.shift();n.length?(s[o]||(s[o]={}),s=s[o]):s[o]=i}}function h(t,e){for(var i,n,s=null,o=[t],a=t;a.parent;)o.push(a.parent),a=a.parent;if(a.nodes)for(i=0,n=a.nodes.length;n>i;i++)if(e.id===a.nodes[i].id){s=a.nodes[i];break}for(s||(s={id:e.id},t.node&&(s.attr=r(s.attr,t.node))),i=o.length-1;i>=0;i--){var h=o[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(s)&&h.nodes.push(s)}e.attr&&(s.attr=r(s.attr,e.attr))}function d(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=r({},t.edge);e.attr=r(i,e.attr)}}function c(t,e,i,n,s){var o={from:e,to:i,type:n};return t.edge&&(o.attr=r({},t.edge)),o.attr=r(o.attr||{},s),o}function l(){for(O=T.NULL,I="";" "==D||" "==D||"\n"==D||"\r"==D;)n();do{var t=!1;if("#"==D){for(var e=M-1;" "==C.charAt(e)||" "==C.charAt(e);)e--;if("\n"==C.charAt(e)||""==C.charAt(e)){for(;""!=D&&"\n"!=D;)n();t=!0}}if("/"==D&&"/"==s()){for(;""!=D&&"\n"!=D;)n();t=!0}if("/"==D&&"*"==s()){for(;""!=D;){if("*"==D&&"/"==s()){n(),n();break}n()}t=!0}for(;" "==D||" "==D||"\n"==D||"\r"==D;)n()}while(t);if(""==D)return void(O=T.DELIMITER);var i=D+s();if(x[i])return O=T.DELIMITER,I=i,n(),void n();if(x[D])return O=T.DELIMITER,I=D,void n();if(o(D)||"-"==D){for(I+=D,n();o(D);)I+=D,n();return"false"==I?I=!1:"true"==I?I=!0:isNaN(Number(I))||(I=Number(I)),void(O=T.IDENTIFIER)}if('"'==D){for(n();""!=D&&('"'!=D||'"'==D&&'"'==s());)I+=D,'"'==D&&n(),n();if('"'!=D)throw w('End of string " expected');return n(),void(O=T.IDENTIFIER)}for(O=T.UNKNOWN;""!=D;)I+=D,n();throw new SyntaxError('Syntax error in part "'+b(I,30)+'"')}function u(){var t={};if(i(),l(),"strict"==I&&(t.strict=!0,l()),("graph"==I||"digraph"==I)&&(t.type=I,l()),O==T.IDENTIFIER&&(t.id=I,l()),"{"!=I)throw w("Angle bracket { expected");if(l(),p(t),"}"!=I)throw w("Angle bracket } expected");if(l(),""!==I)throw w("End of file expected");return l(),delete t.node,delete t.edge,delete t.graph,t}function p(t){for(;""!==I&&"}"!=I;)f(t),";"==I&&l()}function f(t){var e=g(t);if(e)return void y(t,e);var i=m(t);if(!i){if(O!=T.IDENTIFIER)throw w("Identifier expected");var n=I;if(l(),"="==I){if(l(),O!=T.IDENTIFIER)throw w("Identifier expected");t[n]=I,l()}else v(t,n)}}function g(t){var e=null;if("subgraph"==I&&(e={},e.type="subgraph",l(),O==T.IDENTIFIER&&(e.id=I,l())),"{"==I){if(l(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,p(e),"}"!=I)throw w("Angle bracket } expected");l(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function m(t){return"node"==I?(l(),t.node=_(),"node"):"edge"==I?(l(),t.edge=_(),"edge"):"graph"==I?(l(),t.graph=_(),"graph"):null}function v(t,e){var i={id:e},n=_();n&&(i.attr=n),h(t,i),y(t,e)}function y(t,e){for(;"->"==I||"--"==I;){var i,n=I;l();var s=g(t);if(s)i=s;else{if(O!=T.IDENTIFIER)throw w("Identifier or subgraph expected");i=I,h(t,{id:i}),l()}var o=_(),r=c(t,e,i,n,o);d(t,r),e=i}}function _(){for(var t=null;"["==I;){for(l(),t={};""!==I&&"]"!=I;){if(O!=T.IDENTIFIER)throw w("Attribute name expected");var e=I;if(l(),"="!=I)throw w("Equal sign = expected");if(l(),O!=T.IDENTIFIER)throw w("Attribute value expected");var i=I;a(t,e,i),l(),","==I&&l()}if("]"!=I)throw w("Bracket ] expected");l()}return t}function w(t){return new SyntaxError(t+', got "'+b(I,30)+'" (char '+M+")")}function b(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){t instanceof Array?t.forEach(function(t){e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}):e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}function E(t){function i(t){var e={from:t.from,to:t.to};return r(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var n=e(t),s={nodes:[],edges:[],options:{}};return n.nodes&&n.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};r(e,t.attr),e.image&&(e.shape="image"),s.nodes.push(e)}),n.edges&&n.edges.forEach(function(t){var e,n;e=t.from instanceof Object?t.from.nodes:{id:t.from},n=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var e=i(t);s.edges.push(e)}),S(e,n,function(e,n){var o=c(s,e.id,n.id,t.type,t.attr),r=i(o);s.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var e=i(t);s.edges.push(e)})}),n.attr&&(s.options=n.attr),s}var T={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},x={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},C="",M=0,D="",I="",O=T.NULL,N=/[a-zA-Z_0-9.:#]/;t.parseDOT=e,t.DOTToGraph=E}("undefined"!=typeof z?z:n),"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1)},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i)},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath();var n=2*i,s=n/2,o=Math.sqrt(3)/6*n,r=Math.sqrt(n*n-s*s);this.moveTo(t,e-(r-o)),this.lineTo(t+s,e+o),this.lineTo(t-s,e+o),this.lineTo(t,e-(r-o)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath();var n=2*i,s=n/2,o=Math.sqrt(3)/6*n,r=Math.sqrt(n*n-s*s);this.moveTo(t,e+(r-o)),this.lineTo(t+s,e-o),this.lineTo(t-s,e-o),this.lineTo(t,e+(r-o)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath();for(var n=0;10>n;n++){var s=n%2===0?1.3*i:.5*i;this.lineTo(t+s*Math.sin(2*n*Math.PI/10),e-s*Math.cos(2*n*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,n,s){var o=Math.PI/180;0>i-2*s&&(s=i/2),0>n-2*s&&(s=n/2),this.beginPath(),this.moveTo(t+s,e),this.lineTo(t+i-s,e),this.arc(t+i-s,e+s,s,270*o,360*o,!1),this.lineTo(t+i,e+n-s),this.arc(t+i-s,e+n-s,s,0,90*o,!1),this.lineTo(t+s,e+n),this.arc(t+s,e+n-s,s,90*o,180*o,!1),this.lineTo(t,e+s),this.arc(t+s,e+s,s,180*o,270*o,!1)},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,n){var s=.5522848,o=i/2*s,r=n/2*s,a=t+i,h=e+n,d=t+i/2,c=e+n/2;this.beginPath(),this.moveTo(t,c),this.bezierCurveTo(t,c-r,d-o,e,d,e),this.bezierCurveTo(d+o,e,a,c-r,a,c),this.bezierCurveTo(a,c+r,d+o,h,d,h),this.bezierCurveTo(d-o,h,t,c+r,t,c)},CanvasRenderingContext2D.prototype.database=function(t,e,i,n){var s=1/3,o=i,r=n*s,a=.5522848,h=o/2*a,d=r/2*a,c=t+o,l=e+r,u=t+o/2,p=e+r/2,f=e+(n-r/2),g=e+n;this.beginPath(),this.moveTo(c,p),this.bezierCurveTo(c,p+d,u+h,l,u,l),this.bezierCurveTo(u-h,l,t,p+d,t,p),this.bezierCurveTo(t,p-d,u-h,e,u,e),this.bezierCurveTo(u+h,e,c,p-d,c,p),this.lineTo(c,f),this.bezierCurveTo(c,f+d,u+h,g,u,g),this.bezierCurveTo(u-h,g,t,f+d,t,f),this.lineTo(t,p)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,n){var s=t-n*Math.cos(i),o=e-n*Math.sin(i),r=t-.9*n*Math.cos(i),a=e-.9*n*Math.sin(i),h=s+n/3*Math.cos(i+.5*Math.PI),d=o+n/3*Math.sin(i+.5*Math.PI),c=s+n/3*Math.cos(i-.5*Math.PI),l=o+n/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(c,l),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,n,s){s||(s=[10,5]),0==u&&(u=.001);var o=s.length;this.moveTo(t,e);for(var r=i-t,a=n-e,h=a/r,d=Math.sqrt(r*r+a*a),c=0,l=!0;d>=.1;){var u=s[c++%o];u>d&&(u=d);var p=Math.sqrt(u*u/(1+h*h));0>r&&(p=-p),t+=p,e+=h*p,this[l?"lineTo":"moveTo"](t,e),d-=u,l=!l}}),M.prototype.resetCluster=function(){this.formationScale=void 0,this.clusterSize=1,this.containedNodes={},this.containedEdges={},this.clusterSessions=[]},M.prototype.attachEdge=function(t){-1==this.edges.indexOf(t)&&this.edges.push(t),-1==this.dynamicEdges.indexOf(t)&&this.dynamicEdges.push(t),this.dynamicEdgesLength=this.dynamicEdges.length,this._updateMass()},M.prototype.detachEdge=function(t){var e=this.edges.indexOf(t);-1!=e&&(this.edges.splice(e,1),this.dynamicEdges.splice(e,1)),this.dynamicEdgesLength=this.dynamicEdges.length,this._updateMass()},M.prototype._updateMass=function(){this.mass=1+.6*this.edges.length},M.prototype.setProperties=function(t,e){if(t){if(this.originalLabel=void 0,void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.originalLabel=t.label),void 0!==t.title&&(this.title=t.title),void 0!==t.group&&(this.group=t.group),void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.value&&(this.value=t.value),void 0!==t.horizontalAlignLeft&&(this.horizontalAlignLeft=t.horizontalAlignLeft),void 0!==t.verticalAlignTop&&(this.verticalAlignTop=t.verticalAlignTop),void 0!==t.triggerFunction&&(this.triggerFunction=t.triggerFunction),void 0===this.id)throw"Node must have an id";if(this.group){var i=this.grouplist.get(this.group);for(var n in i)i.hasOwnProperty(n)&&(this[n]=i[n])}if(void 0!==t.shape&&(this.shape=t.shape),void 0!==t.image&&(this.image=t.image),void 0!==t.radius&&(this.radius=t.radius),void 0!==t.color&&(this.color=M.parseColor(t.color)),void 0!==t.fontColor&&(this.fontColor=t.fontColor),void 0!==t.fontSize&&(this.fontSize=t.fontSize),void 0!==t.fontFace&&(this.fontFace=t.fontFace),void 0!==this.image){if(!this.imagelist)throw"No imagelist provided";this.imageObj=this.imagelist.load(this.image)}switch(this.xFixed=this.xFixed||void 0!==t.x,this.yFixed=this.yFixed||void 0!==t.y,this.radiusFixed=this.radiusFixed||void 0!==t.radius,"image"==this.shape&&(this.radiusMin=e.nodes.widthMin,this.radiusMax=e.nodes.widthMax),this.shape){case"database":this.draw=this._drawDatabase,this.resize=this._resizeDatabase;break;case"box":this.draw=this._drawBox,this.resize=this._resizeBox;break;case"circle":this.draw=this._drawCircle,this.resize=this._resizeCircle;break;case"ellipse":this.draw=this._drawEllipse,this.resize=this._resizeEllipse;break;case"image":this.draw=this._drawImage,this.resize=this._resizeImage;break;case"text":this.draw=this._drawText,this.resize=this._resizeText;break;case"dot":this.draw=this._drawDot,this.resize=this._resizeShape;break;case"square":this.draw=this._drawSquare,this.resize=this._resizeShape;break;case"triangle":this.draw=this._drawTriangle,this.resize=this._resizeShape;break;case"triangleDown":this.draw=this._drawTriangleDown,this.resize=this._resizeShape;break;case"star":this.draw=this._drawStar,this.resize=this._resizeShape;break;default:this.draw=this._drawEllipse,this.resize=this._resizeEllipse}this._reset()}},M.parseColor=function(t){var e;return z.isString(t)?e={border:t,background:t,highlight:{border:t,background:t}}:(e={},e.background=t.background||"white",e.border=t.border||e.background,z.isString(t.highlight)?e.highlight={border:t.highlight,background:t.highlight}:(e.highlight={},e.highlight.background=t.highlight&&t.highlight.background||e.background,e.highlight.border=t.highlight&&t.highlight.border||e.border)),e},M.prototype.select=function(){this.selected=!0,this._reset()},M.prototype.unselect=function(){this.selected=!1,this._reset()},M.prototype.clearSizeCache=function(){this._reset()},M.prototype._reset=function(){this.width=void 0,this.height=void 0},M.prototype.getTitle=function(){return this.title},M.prototype.distanceToBorder=function(t,e){var i=1;switch(this.width||this.resize(t),this.shape){case"circle":case"dot":return this.radius+i;case"ellipse":var n=this.width/2,s=this.height/2,o=Math.sin(e)*n,r=Math.cos(e)*s; +return n*s/Math.sqrt(o*o+r*r);case"box":case"image":case"text":default:return this.width?Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i:0}},M.prototype._setForce=function(t,e){this.fx=t,this.fy=e},M.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},M.prototype.discreteStep=function(t){if(!this.xFixed){var e=-this.damping*this.vx,i=(this.fx+e)/this.mass;this.vx+=i*t,this.x+=this.vx*t}if(!this.yFixed){var n=-this.damping*this.vy,s=(this.fy+n)/this.mass;this.vy+=s*t,this.y+=this.vy*t}},M.prototype.isFixed=function(){return this.xFixed&&this.yFixed},M.prototype.isMoving=function(t){return Math.abs(this.vx)>t||Math.abs(this.vy)>t?!0:(this.vx=0,this.vy=0,!1)},M.prototype.isSelected=function(){return this.selected},M.prototype.getValue=function(){return this.value},M.prototype.getDistance=function(t,e){var i=this.x-t,n=this.y-e;return Math.sqrt(i*i+n*n)},M.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.radius=(this.radiusMin+this.radiusMax)/2;else{var i=(this.radiusMax-this.radiusMin)/(e-t);this.radius=(this.value-t)*i+this.radiusMin}this.baseRadiusValue=this.radius},M.prototype.draw=function(){throw"Draw method not initialized for node"},M.prototype.resize=function(){throw"Resize method not initialized for node"},M.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},M.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.radius||this.imageObj.width,e=this.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.width>0&&this.height>0&&(this.width+=(this.clusterSize-1)*this.clusterSizeWidthFactor,this.height+=(this.clusterSize-1)*this.clusterSizeHeightFactor,this.radius+=(this.clusterSize-1)*this.clusterSizeRadiusFactor)}},M.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.graphScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},M.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*(this.clusterSize-1)*this.clusterSizeWidthFactor,this.height+=.5*(this.clusterSize-1)*this.clusterSizeHeightFactor}},M.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=2;t.strokeStyle=this.selected?this.color.highlight.border:this.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.graphScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.radius),t.stroke()),t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.graphScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},M.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),n=i.width+2*e;this.width=n,this.height=n,this.width+=(this.clusterSize-1)*this.clusterSizeWidthFactor,this.height+=(this.clusterSize-1)*this.clusterSizeHeightFactor,this.radius+=(this.clusterSize-1)*this.clusterSizeRadiusFactor}},M.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=2;t.strokeStyle=this.selected?this.color.highlight.border:this.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.graphScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.graphScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},M.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),n=Math.max(i.width,i.height)+2*e;this.radius=n/2,this.width=n,this.height=n,this.radius+=.5*(this.clusterSize-1)*this.clusterSizeRadiusFactor}},M.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=2;t.strokeStyle=this.selected?this.color.highlight.border:this.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.graphScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.circle(this.x,this.y,this.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.graphScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.color.background,t.circle(this.x,this.y,this.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},M.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.graphScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.graphScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},M.prototype._drawDot=function(t){this._drawShape(t,"circle")},M.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},M.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},M.prototype._drawSquare=function(t){this._drawShape(t,"square")},M.prototype._drawStar=function(t){this._drawShape(t,"star")},M.prototype._resizeShape=function(){if(!this.width){this.radius=this.baseRadiusValue;var t=2*this.radius;this.width=t,this.height=t,this.width+=(this.clusterSize-1)*this.clusterSizeWidthFactor,this.height+=(this.clusterSize-1)*this.clusterSizeHeightFactor,this.radius+=.5*(this.clusterSize-1)*this.clusterSizeRadiusFactor}},M.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,n=2,s=2;switch(e){case"dot":s=2;break;case"square":s=2;break;case"triangle":s=3;break;case"triangleDown":s=3;break;case"star":s=4}t.strokeStyle=this.selected?this.color.highlight.border:this.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?n:1)+(this.clusterSize>1?i:0),t.lineWidth*=this.graphScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t[e](this.x,this.y,this.radius+s*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?n:1)+(this.clusterSize>1?i:0),t.lineWidth*=this.graphScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.color.background,t[e](this.x,this.y,this.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top")},M.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=(this.clusterSize-1)*this.clusterSizeWidthFactor,this.height+=(this.clusterSize-1)*this.clusterSizeHeightFactor,this.radius+=(this.clusterSize-1)*this.clusterSizeRadiusFactor}},M.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y)},M.prototype._label=function(t,e,i,n,s,o){if(e){t.font=(this.selected?"bold ":"")+this.fontSize+"px "+this.fontFace,t.fillStyle=this.fontColor||"black",t.textAlign=s||"center",t.textBaseline=o||"middle";for(var r=e.split("\n"),a=r.length,h=this.fontSize+4,d=n+(1-a)/2*h,c=0;a>c;c++)t.fillText(r[c],i,d),d+=h}},M.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.fontSize+"px "+this.fontFace;for(var e=this.label.split("\n"),i=(this.fontSize+4)*e.length,n=0,s=0,o=e.length;o>s;s++)n=Math.max(n,t.measureText(e[s]).width);return{width:n,height:i}}return{width:0,height:0}},M.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.graphScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.graphScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.graphScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.yh},D.prototype._drawLine=function(t){t.strokeStyle=this.color,t.lineWidth=this._getLineWidth();var e;if(this.from!=this.to)this._line(t),this.label&&(e=this._pointOnLine(.5),this._label(t,this.label,e.x,e.y));else{var i,n,s=this.length/4,o=this.from;o.width||o.resize(t),o.width>o.height?(i=o.x+o.width/2,n=o.y-s):(i=o.x+s,n=o.y-o.height/2),this._circle(t,i,n,s),e=this._pointOnCircle(i,n,s,.5),this._label(t,this.label,e.x,e.y)}},D.prototype._getLineWidth=function(){return this.from.selected||this.to.selected?Math.min(2*this.width,this.widthMax)*this.graphScaleInv:this.width*this.graphScaleInv},D.prototype._line=function(t){t.beginPath(),t.moveTo(this.from.x,this.from.y),t.lineTo(this.to.x,this.to.y),t.stroke()},D.prototype._circle=function(t,e,i,n){t.beginPath(),t.arc(e,i,n,0,2*Math.PI,!1),t.stroke()},D.prototype._label=function(t,e,i,n){if(e){t.font=(this.from.selected||this.to.selected?"bold ":"")+this.fontSize+"px "+this.fontFace,t.fillStyle="white";var s=t.measureText(e).width,o=this.fontSize,r=i-s/2,a=n-o/2;t.fillRect(r,a,s,o),t.fillStyle=this.fontColor||"black",t.textAlign="left",t.textBaseline="top",t.fillText(e,r,a)}},D.prototype._drawDashLine=function(t){if(t.strokeStyle=this.color,t.lineWidth=this._getLineWidth(),t.beginPath(),t.lineCap="round",void 0!==this.dash.altLength?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.dash.length,this.dash.gap,this.dash.altLength,this.dash.gap]):void 0!==this.dash.length&&void 0!==this.dash.gap?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.dash.length,this.dash.gap]):(t.moveTo(this.from.x,this.from.y),t.lineTo(this.to.x,this.to.y)),t.stroke(),this.label){var e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}},D.prototype._pointOnLine=function(t){return{x:(1-t)*this.from.x+t*this.to.x,y:(1-t)*this.from.y+t*this.to.y}},D.prototype._pointOnCircle=function(t,e,i,n){var s=2*(n-3/8)*Math.PI;return{x:t+i*Math.cos(s),y:e-i*Math.sin(s)}},D.prototype._drawArrowCenter=function(t){var e;if(t.strokeStyle=this.color,t.fillStyle=this.color,t.lineWidth=this._getLineWidth(),this.from!=this.to){this._line(t);var i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),n=10+5*this.width;e=this._pointOnLine(.5),t.arrow(e.x,e.y,i,n),t.fill(),t.stroke(),this.label&&(e=this._pointOnLine(.5),this._label(t,this.label,e.x,e.y))}else{var s,o,r=this.length/4,a=this.from;a.width||a.resize(t),a.width>a.height?(s=a.x+a.width/2,o=a.y-r):(s=a.x+r,o=a.y-a.height/2),this._circle(t,s,o,r);var i=.2*Math.PI,n=10+5*this.width;e=this._pointOnCircle(s,o,r,.5),t.arrow(e.x,e.y,i,n),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(s,o,r,.5),this._label(t,this.label,e.x,e.y))}},D.prototype._drawArrow=function(t){t.strokeStyle=this.color,t.fillStyle=this.color,t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var n=this.to.x-this.from.x,s=this.to.y-this.from.y,o=Math.sqrt(n*n+s*s),r=this.from.distanceToBorder(t,e+Math.PI),a=(o-r)/o,h=a*this.from.x+(1-a)*this.to.x,d=a*this.from.y+(1-a)*this.to.y,c=this.to.distanceToBorder(t,e),l=(o-c)/o,u=(1-l)*this.from.x+l*this.to.x,p=(1-l)*this.from.y+l*this.to.y;if(t.beginPath(),t.moveTo(h,d),t.lineTo(u,p),t.stroke(),i=10+5*this.width,t.arrow(u,p,e,i),t.fill(),t.stroke(),this.label){var f=this._pointOnLine(.5);this._label(t,this.label,f.x,f.y)}}else{var g,m,v,y=this.from,_=this.length/4;y.width||y.resize(t),y.width>y.height?(g=y.x+y.width/2,m=y.y-_,v={x:g,y:y.y,angle:.9*Math.PI}):(g=y.x+_,m=y.y-y.height/2,v={x:y.x,y:m,angle:.6*Math.PI}),t.beginPath(),t.arc(g,m,_,0,2*Math.PI,!1),t.stroke(),i=10+5*this.width,t.arrow(v.x,v.y,v.angle,i),t.fill(),t.stroke(),this.label&&(f=this._pointOnCircle(g,m,_,.5),this._label(t,this.label,f.x,f.y))}},D._dist=function(t,e,i,n,s,o){var r=i-t,a=n-e,h=r*r+a*a,d=((s-t)*r+(o-e)*a)/h;d>1?d=1:0>d&&(d=0);var c=t+d*r,l=e+d*a,u=c-s,p=l-o;return Math.sqrt(u*u+p*p)},D.prototype.setScale=function(t){this.graphScaleInv=1/t},I.prototype.setPosition=function(t,e){this.x=parseInt(t),this.y=parseInt(e)},I.prototype.setText=function(t){this.frame.innerHTML=t},I.prototype.show=function(t){if(void 0===t&&(t=!0),t){var e=this.frame.clientHeight,i=this.frame.clientWidth,n=this.frame.parentNode.clientHeight,s=this.frame.parentNode.clientWidth,o=this.y-e;o+e+this.padding>n&&(o=n-e-this.padding),os&&(r=s-i-this.padding),r1)return this.activeSector[this.activeSector.length-2];throw new TypeError("there are not enough sectors in the this.activeSector array.")},_setActiveSector:function(t){this.activeSector.push(t)},_forgetLastSector:function(){this.activeSector.pop()},_createNewSector:function(t){this.sectors.active[t]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:void 0},this.sectors.active[t].drawingNode=new M({id:t,color:{background:"#eaefef",border:"495c5e"}},{},{},this.constants),this.sectors.active[t].drawingNode.clusterSize=2},_deleteActiveSector:function(t){delete this.sectors.active[t]},_deleteFrozenSector:function(t){delete this.sectors.frozen[t]},_freezeSector:function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},_activateSector:function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},_mergeThisWithFrozen:function(t){for(var e in this.nodes)this.nodes.hasOwnProperty(e)&&(this.sectors.frozen[t].nodes[e]=this.nodes[e]);for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.sectors.frozen[t].edges[i]=this.edges[i]);for(var n=0;n1?this[t](n[0],n[1]):this[t](e)}this._loadLatestSector()},_doInAllFrozenSectors:function(t,e){if(void 0===e)for(var i in this.sectors.frozen)this.sectors.frozen.hasOwnProperty(i)&&(this._switchToFrozenSector(i),this[t]());else for(var i in this.sectors.frozen)if(this.sectors.frozen.hasOwnProperty(i)){this._switchToFrozenSector(i);var n=Array.prototype.splice.call(arguments,1);n.length>1?this[t](n[0],n[1]):this[t](e)}this._loadLatestSector()},_doInNavigationSector:function(t,e){if(this._switchToNavigationSector(),void 0===e)this[t]();else{var i=Array.prototype.splice.call(arguments,1);i.length>1?this[t](i[0],i[1]):this[t](e)}this._loadLatestSector()},_doInAllSectors:function(t,e){var i=Array.prototype.splice.call(arguments,1);void 0===e?(this._doInAllActiveSectors(t),this._doInAllFrozenSectors(t)):i.length>1?(this._doInAllActiveSectors(t,i[0],i[1]),this._doInAllFrozenSectors(t,i[0],i[1])):(this._doInAllActiveSectors(t,e),this._doInAllFrozenSectors(t,e))},_clearNodeIndexList:function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},_drawSectorNodes:function(t,e){var i,n=1e9,s=-1e9,o=1e9,r=-1e9;for(var a in this.sectors[e])if(this.sectors[e].hasOwnProperty(a)&&void 0!==this.sectors[e][a].drawingNode){this._switchToSector(a,e),n=1e9,s=-1e9,o=1e9,r=-1e9;for(var h in this.nodes)this.nodes.hasOwnProperty(h)&&(i=this.nodes[h],i.resize(t),o>i.x-.5*i.width&&(o=i.x-.5*i.width),ri.y-.5*i.height&&(n=i.y-.5*i.height),st&&n>s;)s%3==0?this.forceAggregateHubs():this.increaseClusterLevel(),i=this.nodeIndices.length,s+=1;s>1&&1==e&&this.repositionNodes()},openCluster:function(t){var e=this.moving;if(t.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(t)&&("default"!=this._sector()||1!=this.nodeIndices.length)){this._addSector(t);for(var i=0;this.nodeIndices.lengthi;)this.decreaseClusterLevel(),i+=1}else this._expandClusterNode(t,!1,!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels();this.moving!=e&&this.start()},updateClustersDefault:function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},increaseClusterLevel:function(){this.updateClusters(-1,!1,!0)},decreaseClusterLevel:function(){this.updateClusters(1,!1,!0)},updateClusters:function(t,e,i){var n=this.moving,s=this.nodeIndices.length;this.previousScale>this.scale&&0==t&&this._collapseSector(),this.previousScale>this.scale||-1==t?this._formClusters(i):(this.previousScalethis.scale||-1==t)&&(this._aggregateHubs(i),this._updateNodeIndexList()),(this.previousScale>this.scale||-1==t)&&(this.handleChains(),this._updateNodeIndexList()),this.previousScale=this.scale,this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.lengththis.constants.clustering.chainThreshold&&this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/t)},_aggregateHubs:function(t){this._getHubSize(),this._formClustersByHub(t,!1)},forceAggregateHubs:function(){var t=this.moving,e=this.nodeIndices.length;this._aggregateHubs(!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.length!=e&&(this.clusterSession+=1),this.moving!=t&&this.start()},_openClustersBySize:function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];1==e.inView()&&(e.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||e.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight)&&this.openCluster(e)}},_openClusters:function(t,e){for(var i=0;i1&&(t.clusterSizei)){var r=o.from,a=o.to;o.to.mass>o.from.mass&&(r=o.to,a=o.from),1==a.dynamicEdgesLength?this._addToCluster(r,a,!1):1==r.dynamicEdgesLength&&this._addToCluster(a,r,!1)}}},_forceClustersByZoom:function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];if(1==e.dynamicEdgesLength&&0!=e.dynamicEdges.length){var i=e.dynamicEdges[0],n=i.toId==e.id?this.nodes[i.fromId]:this.nodes[i.toId];e.id!=n.id&&(n.mass>e.mass?this._addToCluster(n,e,!0):this._addToCluster(e,n,!0))}}},_formClustersByHub:function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,e)},_formClusterFromHub:function(t,e,i,n){if(void 0===n&&(n=0),t.dynamicEdgesLength>=this.hubThreshold&&0==i||t.dynamicEdgesLength==this.hubThreshold&&1==i){for(var s,o,r,a=this.constants.clustering.clusterEdgeThreshold/this.scale,h=!1,d=[],c=t.dynamicEdges.length,l=0;c>l;l++)d.push(t.dynamicEdges[l].id);if(0==e)for(h=!1,l=0;c>l;l++){var u=this.edges[d[l]];if(void 0!==u&&u.connected&&u.toId!=u.fromId&&(s=u.to.x-u.from.x,o=u.to.y-u.from.y,r=Math.sqrt(s*s+o*o),a>r)){h=!0;break}}if(!e&&h||e)for(l=0;c>l;l++)if(u=this.edges[d[l]],void 0!==u){var p=this.nodes[u.fromId==t.id?u.toId:u.fromId];p.dynamicEdges.length<=this.hubThreshold+n&&p.id!=t.id&&this._addToCluster(t,p,e)}}},_addToCluster:function(t,e,i){t.containedNodes[e.id]=e;for(var n=0;n1)for(var n=0;n1&&(e.label="[".concat(String(e.clusterSize),"]"))}for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(e=this.nodes[t],1==e.clusterSize&&(e.label=void 0!==e.originalLabel?e.originalLabel:String(e.id)))},_nodeInActiveArea:function(t){return Math.abs(t.x-this.areaCenter.x)<=this.constants.clustering.activeAreaBoxSize/this.scale&&Math.abs(t.y-this.areaCenter.y)<=this.constants.clustering.activeAreaBoxSize/this.scale},repositionNodes:function(){for(var t=0;tn&&(n=o.dynamicEdgesLength),t+=o.dynamicEdgesLength,e+=Math.pow(o.dynamicEdgesLength,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r);this.hubThreshold=Math.floor(t+2*a),this.hubThreshold>n&&(this.hubThreshold=n)},_reduceAmountOfChains:function(t){this.hubThreshold=2;var e=Math.floor(this.nodeIndices.length*t);for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&e>0&&(this._formClusterFromHub(this.nodes[i],!0,!0,1),e-=1)},_getChainFraction:function(){var t=0,e=0;for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&(2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&(t+=1),e+=1);return t/e}},W={_getNodesOverlappingWith:function(t,e){var i=this.nodes;for(var n in i)i.hasOwnProperty(n)&&i[n].isOverlappingWith(t)&&e.push(n)},_getAllNodesOverlappingWith:function(t){var e=[];return this._doInAllActiveSectors("_getNodesOverlappingWith",t,e),e},_getAllNavigationNodesOverlappingWith:function(t){var e=[];return this._doInNavigationSector("_getNodesOverlappingWith",t,e),e},_pointerToPositionObject:function(t){var e=this._canvasToX(t.x),i=this._canvasToY(t.y);return{left:e,top:i,right:e,bottom:i}},_pointerToScreenPositionObject:function(t){var e=t.x,i=t.y;return{left:e,top:i,right:e,bottom:i}},_getNavigationNodeAt:function(t){var e=this._pointerToScreenPositionObject(t),i=this._getAllNavigationNodesOverlappingWith(e);return i.length>0?this.sectors.navigation.nodes[i[i.length-1]]:null},_getNodeAt:function(t){var e=this._pointerToPositionObject(t);return overlappingNodes=this._getAllNodesOverlappingWith(e),overlappingNodes.length>0?this.nodes[overlappingNodes[overlappingNodes.length-1]]:null},_getEdgeAt:function(){return null},_addToSelection:function(t){this.selection.push(t.id),this.selectionObj[t.id]=t},_removeFromSelection:function(t){for(var e=0;ee;e++){n=t[e];var s=this.nodes[n];if(!s)throw new RangeError('Node with id "'+n+'" not found');this._selectNode(s,!0,!0)}this.redraw()},_updateSelection:function(){for(var t=0;tt.x-t.width&&(n=t.x-t.width),st.y-t.height&&(e=t.y-t.height),i=this.constants.clustering.initialMaxNodes)var n=38.8467/(e-14.50184)+.0116;else var n=42.54117319/(e+39.31966387)+.1944405;else{var s=1.1*(Math.abs(i.minX)+Math.abs(i.maxX)),o=1.1*(Math.abs(i.minY)+Math.abs(i.maxY)),r=this.frame.canvas.clientWidth/s,a=this.frame.canvas.clientHeight/o;n=a>=r?r:a}n>1&&(n=1),this.pinch.mousewheelScale=n,this._setScale(n),this._centerGraph(i),this.start()},O.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},O.prototype.setData=function(t,e){if(void 0===e&&(e=!1),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=U.util.DOTToGraph(t.dot);return void this.setData(i)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);this._putDataInSector(),e||(this.stabilize&&this._doStabilize(),this.moving=!0,this.start())},O.prototype.setOptions=function(t){if(t){if(void 0!==t.width&&(this.width=t.width),void 0!==t.height&&(this.height=t.height),void 0!==t.stabilize&&(this.stabilize=t.stabilize),void 0!==t.selectable&&(this.selectable=t.selectable),t.clustering){this.constants.clustering.enabled=!0;for(var e in t.clustering)t.clustering.hasOwnProperty(e)&&(this.constants.clustering[e]=t.clustering[e])}else void 0!==t.clustering&&(this.constants.clustering.enabled=!1);if(t.navigation){this.constants.navigation.enabled=!0;for(var e in t.navigation)t.navigation.hasOwnProperty(e)&&(this.constants.navigation[e]=t.navigation[e])}else void 0!==t.navigation&&(this.constants.navigation.enabled=!1);if(t.keyboard){this.constants.keyboard.enabled=!0;for(var e in t.keyboard)t.keyboard.hasOwnProperty(e)&&(this.constants.keyboard[e]=t.keyboard[e])}else void 0!==t.keyboard&&(this.constants.keyboard.enabled=!1);if(t.edges){for(e in t.edges)t.edges.hasOwnProperty(e)&&(this.constants.edges[e]=t.edges[e]);void 0!==t.edges.length&&t.nodes&&void 0===t.nodes.distance&&(this.constants.edges.length=t.edges.length,this.constants.nodes.distance=1.25*t.edges.length),t.edges.fontColor||(this.constants.edges.fontColor=t.edges.color),t.edges.dash&&(void 0!==t.edges.dash.length&&(this.constants.edges.dash.length=t.edges.dash.length),void 0!==t.edges.dash.gap&&(this.constants.edges.dash.gap=t.edges.dash.gap),void 0!==t.edges.dash.altLength&&(this.constants.edges.dash.altLength=t.edges.dash.altLength))}if(t.nodes){for(e in t.nodes)t.nodes.hasOwnProperty(e)&&(this.constants.nodes[e]=t.nodes[e]);t.nodes.color&&(this.constants.nodes.color=M.parseColor(t.nodes.color))}if(t.groups)for(var i in t.groups)if(t.groups.hasOwnProperty(i)){var n=t.groups[i];this.groups.add(i,n)}}this.setSize(this.width,this.height),this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2),this._setScale(1),this._loadNavigationControls(),this._createKeyBinds(),this._redraw()},O.prototype.on=function(t,e){var i=["select"];if(-1==i.indexOf(t))throw new Error('Unknown event "'+t+'". Choose from '+i.join());F.addListener(this,t,e)},O.prototype.off=function(t,e){F.removeListener(this,t,e)},O.prototype._trigger=function(t,e){F.trigger(this,t,e)},O.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="graph-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),!this.frame.canvas.getContext){var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}var e=this;this.drag={},this.pinch={},this.hammer=N(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",e._onTap.bind(e)),this.hammer.on("doubletap",e._onDoubleTap.bind(e)),this.hammer.on("hold",e._onHold.bind(e)),this.hammer.on("pinch",e._onPinch.bind(e)),this.hammer.on("touch",e._onTouch.bind(e)),this.hammer.on("dragstart",e._onDragStart.bind(e)),this.hammer.on("drag",e._onDrag.bind(e)),this.hammer.on("dragend",e._onDragEnd.bind(e)),this.hammer.on("release",e._onRelease.bind(e)),this.hammer.on("mousewheel",e._onMouseWheel.bind(e)),this.hammer.on("DOMMouseScroll",e._onMouseWheel.bind(e)),this.hammer.on("mousemove",e._onMouseMoveTitle.bind(e)),this.containerElement.appendChild(this.frame)},O.prototype._createKeyBinds=function(){var t=this;this.mousetrap=A,this.mousetrap.reset(),1==this.constants.keyboard.enabled&&(this.mousetrap.bind("up",this._moveUp.bind(t),"keydown"),this.mousetrap.bind("up",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("down",this._moveDown.bind(t),"keydown"),this.mousetrap.bind("down",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("left",this._moveLeft.bind(t),"keydown"),this.mousetrap.bind("left",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("right",this._moveRight.bind(t),"keydown"),this.mousetrap.bind("right",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("=",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("=",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("-",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("-",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("[",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("[",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("]",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("]",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pageup",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("pageup",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("pagedown",this._stopZoom.bind(t),"keyup"))},O.prototype._getPointer=function(t){return{x:t.pageX-U.util.getAbsoluteLeft(this.frame.canvas),y:t.pageY-U.util.getAbsoluteTop(this.frame.canvas)}},O.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.touches[0]),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer)},O.prototype._onDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,null!=e){t.nodeId=e.id,e.isSelected()||this._selectNode(e,!1);var i=this;this.selection.forEach(function(e){var n=i.nodes[e];if(n){var s={id:e,node:n,x:n.x,y:n.y,xFixed:n.xFixed,yFixed:n.yFixed};n.xFixed=!0,n.yFixed=!0,t.selection.push(s)}})}},O.prototype._onDrag=function(t){if(!this.drag.pinched){var e=this._getPointer(t.gesture.touches[0]),i=this,n=this.drag,s=n.selection;if(s&&s.length){var o=e.x-n.pointer.x,r=e.y-n.pointer.y;s.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._canvasToX(i._xToCanvas(t.x)+o)),t.yFixed||(e.y=i._canvasToY(i._yToCanvas(t.y)+r))}),this.moving||(this.moving=!0,this.start())}else{var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw(),this.moved=!0}}},O.prototype._onDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed})},O.prototype._onTap=function(t){var e=this._getPointer(t.gesture.touches[0]);this._handleTap(e)},O.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.touches[0]);this._handleDoubleTap(e)},O.prototype._onHold=function(t){var e=this._getPointer(t.gesture.touches[0]);this._handleOnHold(e)},O.prototype._onRelease=function(){this._handleOnRelease()},O.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},O.prototype._zoom=function(t,e){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var n=this._getTranslation(),s=t/i,o=(1-s)*e.x+n.x*s,r=(1-s)*e.y+n.y*s;return this.areaCenter={x:this._canvasToX(e.x),y:this._canvasToY(e.y)},this.pinch.mousewheelScale=t,this._setScale(t),this._setTranslation(o,r),this.updateClustersDefault(),this._redraw(),t},O.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){"mousewheelScale"in this.pinch||(this.pinch.mousewheelScale=1);var i=this.pinch.mousewheelScale,n=e/10;0>e&&(n/=1-n),i*=1+n;var s=z.fakeGesture(this,t),o=this._getPointer(s.center);i=this._zoom(i,o)}t.preventDefault()},O.prototype._onMouseMoveTitle=function(t){var e=z.fakeGesture(this,t),i=this._getPointer(e.center);this.popupNode&&this._checkHidePopup(i);var n=this,s=function(){n._checkShowPopup(i)};this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(s,300))},O.prototype._checkShowPopup=function(t){var e,i={left:this._canvasToX(t.x),top:this._canvasToY(t.y),right:this._canvasToX(t.x),bottom:this._canvasToY(t.y)},n=this.popupNode;if(void 0==this.popupNode){var s=this.nodes;for(e in s)if(s.hasOwnProperty(e)){var o=s[e];if(void 0!==o.getTitle()&&o.isOverlappingWith(i)){this.popupNode=o;break}}}if(void 0===this.popupNode){var r=this.edges;for(e in r)if(r.hasOwnProperty(e)){var a=r[e];if(a.connected&&void 0!==a.getTitle()&&a.isOverlappingWith(i)){this.popupNode=a;break}}}if(this.popupNode){if(this.popupNode!=n){var h=this;h.popup||(h.popup=new I(h.frame)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupNode.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},O.prototype._checkHidePopup=function(t){this.popupNode&&this._getNodeAt(t)||(this.popupNode=void 0,this.popup&&this.popup.hide())},O.prototype._getConnectionCount=function(t){function e(t){for(var e=[],i=0,n=t.length;n>i;i++)for(var s=t[i],o=s.edges,r=0,a=o.length;a>r;r++){var h=o[r],d=null;h.from==s?d=h.to:h.to==s&&(d=h.from);var c,l;if(d)for(c=0,l=t.length;l>c;c++)if(t[c]==d){d=null;break}if(d)for(c=0,l=e.length;l>c;c++)if(e[c]==d){d=null;break}d&&e.push(d)}return e}void 0==t&&(t=1);var i=[],n=this.nodes;for(var s in n)if(n.hasOwnProperty(s)){for(var o=[n[s]],r=0;t>r;r++)o=o.concat(e(o));i.push(o)}for(var a=[],h=0,d=i.length;d>h;h++)a.push(i[h].length);return a},O.prototype.setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,1==this.constants.navigation.enabled&&this._relocateNavigation()},O.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof o||t instanceof r)this.nodesData=t;else if(t instanceof Array)this.nodesData=new o,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new o}if(e&&z.forEach(this.nodesListeners,function(t,i){e.unsubscribe(i,t)}),this.nodes={},this.nodesData){var i=this;z.forEach(this.nodesListeners,function(t,e){i.nodesData.subscribe(e,t)});var n=this.nodesData.getIds();this._addNodes(n)}this._updateSelection()},O.prototype._addNodes=function(t){for(var e,i=0,n=t.length;n>i;i++){e=t[i];var s=this.nodesData.get(e),o=new M(s,this.images,this.groups,this.constants);if(this.nodes[e]=o,!o.isFixed()){var r=2*this.constants.edges.length,a=t.length,h=2*Math.PI*(i/a);o.x=r*Math.cos(h),o.y=r*Math.sin(h),this.moving=!0}}this._updateNodeIndexList(),this._reconnectEdges(),this._updateValueRange(this.nodes)},O.prototype._updateNodes=function(t){for(var e=this.nodes,i=this.nodesData,n=0,s=t.length;s>n;n++){var o=t[n],r=e[o],a=i.get(o);r?r.setProperties(a,this.constants):(r=new M(properties,this.images,this.groups,this.constants),e[o]=r,r.isFixed()||(this.moving=!0))}this._updateNodeIndexList(),this._reconnectEdges(),this._updateValueRange(e)},O.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,n=t.length;n>i;i++){var s=t[i];delete e[s]}this._updateNodeIndexList(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},O.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof o||t instanceof r)this.edgesData=t;else if(t instanceof Array)this.edgesData=new o,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new o}if(e&&z.forEach(this.edgesListeners,function(t,i){e.unsubscribe(i,t)}),this.edges={},this.edgesData){var i=this;z.forEach(this.edgesListeners,function(t,e){i.edgesData.subscribe(e,t)});var n=this.edgesData.getIds();this._addEdges(n)}this._reconnectEdges()},O.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,n=0,s=t.length;s>n;n++){var o=t[n],r=e[o];r&&r.disconnect();var a=i.get(o,{showInternalIds:!0});e[o]=new D(a,this,this.constants)}this.moving=!0,this._updateValueRange(e)},O.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,n=0,s=t.length;s>n;n++){var o=t[n],r=i.get(o),a=e[o];a?(a.disconnect(),a.setProperties(r,this.constants),a.connect()):(a=new D(r,this,this.constants),this.edges[o]=a)}this.moving=!0,this._updateValueRange(e)},O.prototype._removeEdges=function(t){for(var e=this.edges,i=0,n=t.length;n>i;i++){var s=t[i],o=e[s];o&&(o.disconnect(),delete e[s])}this.moving=!0,this._updateValueRange(e)},O.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var n=i[t];n.from=null,n.to=null,n.connect()}},O.prototype._updateValueRange=function(t){var e,i=void 0,n=void 0;for(e in t)if(t.hasOwnProperty(e)){var s=t[e].getValue();void 0!==s&&(i=void 0===i?s:Math.min(s,i),n=void 0===n?s:Math.max(s,n))}if(void 0!==i&&void 0!==n)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,n)},O.prototype.redraw=function(){this.setSize(this.width,this.height),this._redraw()},O.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d"),e=this.frame.canvas.width,i=this.frame.canvas.height;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._canvasToX(0),y:this._canvasToY(0)},this.canvasBottomRight={x:this._canvasToX(this.frame.canvas.clientWidth),y:this._canvasToY(this.frame.canvas.clientHeight)},this._doInAllSectors("_drawAllSectorNodes",t),this._doInAllSectors("_drawEdges",t),this._doInAllSectors("_drawNodes",t),t.restore(),1==this.constants.navigation.enabled&&this._doInNavigationSector("_drawNodes",t,!0)},O.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e)},O.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},O.prototype._setScale=function(t){this.scale=t},O.prototype._getScale=function(){return this.scale},O.prototype._canvasToX=function(t){return(t-this.translation.x)/this.scale},O.prototype._xToCanvas=function(t){return t*this.scale+this.translation.x},O.prototype._canvasToY=function(t){return(t-this.translation.y)/this.scale},O.prototype._yToCanvas=function(t){return t*this.scale+this.translation.y},O.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,n=[];for(var s in i)i.hasOwnProperty(s)&&(i[s].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[s].isSelected()?n.push(s):(i[s].inArea()||e)&&i[s].draw(t));for(var o=0,r=n.length;r>o;o++)(i[n[o]].inArea()||e)&&i[n[o]].draw(t)},O.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var n=e[i];n.setScale(this.scale),n.connected&&e[i].draw(t)}},O.prototype._doStabilize=function(){for(var t=0,e=this.constants.minVelocity,i=!1;!i&&tthis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},O.prototype._calculateForces=function(){var t,e,i,n,s,o,r,a,h,d,c,l,u,p,f,g,m,v,y=this.nodes,_=this.edges,w=.08*this.forceFactor;for(g=0;gn&&(i=Math.atan2(e,t),r=.5*b>n?1:1/(1+Math.exp((n/b-1)*S)),r*=0==v?1:1+v*this.constants.clustering.forceAmplification,r*=this.forceFactor,s=Math.cos(i)*r,o=Math.sin(i)*r,l._addForce(-s,-o),u._addForce(s,o));for(f in _)_.hasOwnProperty(f)&&(p=_[f],p.connected&&this.nodes.hasOwnProperty(p.toId)&&this.nodes.hasOwnProperty(p.fromId)&&(v=p.to.clusterSize+p.from.clusterSize-2,t=p.to.x-p.from.x,e=p.to.y-p.from.y,d=p.length,d+=v*this.constants.clustering.edgeGrowth,h=Math.sqrt(t*t+e*e),i=Math.atan2(e,t),a=p.stiffness*(d-h)*this.forceFactor,s=Math.cos(i)*a,o=Math.sin(i)*a,p.from._addForce(-s,-o),p.to._addForce(s,o)))},O.prototype._isMoving=function(t){var e=t/this.scale,i=this.nodes;for(var n in i)if(i.hasOwnProperty(n)&&i[n].isMoving(e))return!0;return!1},O.prototype._discreteStepNodes=function(){var t=.01,e=this.nodes;for(var i in e)e.hasOwnProperty(i)&&e[i].discreteStep(t);var n=this.constants.minVelocity;this.moving=this._isMoving(n)},O.prototype.start=function(){if(!this.freezeSimulation)if(this.moving&&(this._doInAllActiveSectors("_initializeForceCalculation"),this._doInAllActiveSectors("_discreteStepNodes"),this._findCenter(this._getRange())),this.moving||0!=this.xIncrement||0!=this.yIncrement||0!=this.zoomIncrement){if(!this.timer){var t=this;this.timer=window.setTimeout(function(){if(t.timer=void 0,0!=t.xIncrement||0!=t.yIncrement){var e=t._getTranslation();t._setTranslation(e.x+t.xIncrement,e.y+t.yIncrement)}if(0!=t.zoomIncrement){var i={x:t.frame.canvas.clientWidth/2,y:t.frame.canvas.clientHeight/2};t._zoom(t.scale*(1+t.zoomIncrement),i)}t.start(),t._redraw()},this.renderTimestep)}}else this._redraw()},O.prototype.singleStep=function(){if(this.moving){this._initializeForceCalculation(),this._discreteStepNodes();var t=this.constants.minVelocity;this.moving=this._isMoving(t),this._redraw()}},O.prototype.toggleFreeze=function(){0==this.freezeSimulation?this.freezeSimulation=!0:(this.freezeSimulation=!1,this.start())},O.prototype._loadClusterSystem=function(){this.clusterSession=0,this.hubThreshold=5;for(var t in H)H.hasOwnProperty(t)&&(O.prototype[t]=H[t])},O.prototype._loadSectorSystem=function(){this.sectors={},this.activeSector=["default"],this.sectors.active={},this.sectors.active["default"]={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:void 0},this.sectors.frozen={},this.sectors.navigation={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:void 0},this.nodeIndices=this.sectors.active["default"].nodeIndices;for(var t in R)R.hasOwnProperty(t)&&(O.prototype[t]=R[t])},O.prototype._loadSelectionSystem=function(){this.selection=[],this.selectionObj={};for(var t in W)W.hasOwnProperty(t)&&(O.prototype[t]=W[t])},O.prototype._loadNavigationControls=function(){for(var t in j)j.hasOwnProperty(t)&&(O.prototype[t]=j[t]);1==this.constants.navigation.enabled&&this._loadNavigationElements()},O.prototype._relocateNavigation=function(){},O.prototype._unHighlightAll=function(){};var U={util:z,events:F,Controller:l,DataSet:o,DataView:r,Range:h,Stack:a,TimeStep:TimeStep,EventBus:s,components:{items:{Item:_,ItemBox:w,ItemPoint:b,ItemRange:S},Component:u,Panel:p,RootPanel:f,ItemSet:y,TimeAxis:g},graph:{Node:M,Edge:D,Popup:I,Groups:Groups,Images:Images},Timeline:C,Graph:O};"undefined"!=typeof n&&(n=U),"undefined"!=typeof i&&"undefined"!=typeof i.exports&&(i.exports=U),"function"==typeof t&&t(function(){return U}),"undefined"!=typeof window&&(window.vis=U)},{hammerjs:2,moment:3,mousetrap:4}],2:[function(t,e){!function(t,i){"use strict";function n(){if(!s.READY){s.event.determineEventTypes();for(var t in s.gestures)s.gestures.hasOwnProperty(t)&&s.detection.register(s.gestures[t]);s.event.onTouch(s.DOCUMENT,s.EVENT_MOVE,s.detection.detect),s.event.onTouch(s.DOCUMENT,s.EVENT_END,s.detection.detect),s.READY=!0}}var s=function(t,e){return new s.Instance(t,e||{})};s.defaults={stop_browser_behavior:{userSelect:"none",touchAction:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},s.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled,s.HAS_TOUCHEVENTS="ontouchstart"in t,s.MOBILE_REGEX=/mobile|tablet|ip(ad|hone|od)|android/i,s.NO_MOUSEEVENTS=s.HAS_TOUCHEVENTS&&navigator.userAgent.match(s.MOBILE_REGEX),s.EVENT_TYPES={},s.DIRECTION_DOWN="down",s.DIRECTION_LEFT="left",s.DIRECTION_UP="up",s.DIRECTION_RIGHT="right",s.POINTER_MOUSE="mouse",s.POINTER_TOUCH="touch",s.POINTER_PEN="pen",s.EVENT_START="start",s.EVENT_MOVE="move",s.EVENT_END="end",s.DOCUMENT=document,s.plugins={},s.READY=!1,s.Instance=function(t,e){var i=this; +return n(),this.element=t,this.enabled=!0,this.options=s.utils.extend(s.utils.extend({},s.defaults),e||{}),this.options.stop_browser_behavior&&s.utils.stopDefaultBrowserBehavior(this.element,this.options.stop_browser_behavior),s.event.onTouch(t,s.EVENT_START,function(t){i.enabled&&s.detection.startDetect(i,t)}),this},s.Instance.prototype={on:function(t,e){for(var i=t.split(" "),n=0;n0&&e==s.EVENT_END?e=s.EVENT_MOVE:c||(e=s.EVENT_END),c||null===o?o=h:h=o,i.call(s.detection,n.collectEventData(t,e,h)),s.HAS_POINTEREVENTS&&e==s.EVENT_END&&(c=s.PointerEvent.updatePointer(e,h))),c||(o=null,r=!1,a=!1,s.PointerEvent.reset())}})},determineEventTypes:function(){var t;t=s.HAS_POINTEREVENTS?s.PointerEvent.getEvents():s.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],s.EVENT_TYPES[s.EVENT_START]=t[0],s.EVENT_TYPES[s.EVENT_MOVE]=t[1],s.EVENT_TYPES[s.EVENT_END]=t[2]},getTouchList:function(t){return s.HAS_POINTEREVENTS?s.PointerEvent.getTouchList():t.touches?t.touches:[{identifier:1,pageX:t.pageX,pageY:t.pageY,target:t.target}]},collectEventData:function(t,e,i){var n=this.getTouchList(i,e),o=s.POINTER_TOUCH;return(i.type.match(/mouse/)||s.PointerEvent.matchType(s.POINTER_MOUSE,i))&&(o=s.POINTER_MOUSE),{center:s.utils.getCenter(n),timeStamp:(new Date).getTime(),target:i.target,touches:n,eventType:e,pointerType:o,srcEvent:i,preventDefault:function(){this.srcEvent.preventManipulation&&this.srcEvent.preventManipulation(),this.srcEvent.preventDefault&&this.srcEvent.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return s.detection.stopDetect()}}}},s.PointerEvent={pointers:{},getTouchList:function(){var t=this,e=[];return Object.keys(t.pointers).sort().forEach(function(i){e.push(t.pointers[i])}),e},updatePointer:function(t,e){return t==s.EVENT_END?this.pointers={}:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e),Object.keys(this.pointers).length},matchType:function(t,e){if(!e.pointerType)return!1;var i={};return i[s.POINTER_MOUSE]=e.pointerType==e.MSPOINTER_TYPE_MOUSE||e.pointerType==s.POINTER_MOUSE,i[s.POINTER_TOUCH]=e.pointerType==e.MSPOINTER_TYPE_TOUCH||e.pointerType==s.POINTER_TOUCH,i[s.POINTER_PEN]=e.pointerType==e.MSPOINTER_TYPE_PEN||e.pointerType==s.POINTER_PEN,i[t]},getEvents:function(){return["pointerdown MSPointerDown","pointermove MSPointerMove","pointerup pointercancel MSPointerUp MSPointerCancel"]},reset:function(){this.pointers={}}},s.utils={extend:function(t,e,n){for(var s in e)t[s]!==i&&n||(t[s]=e[s]);return t},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){for(var e=[],i=[],n=0,s=t.length;s>n;n++)e.push(t[n].pageX),i.push(t[n].pageY);return{pageX:(Math.min.apply(Math,e)+Math.max.apply(Math,e))/2,pageY:(Math.min.apply(Math,i)+Math.max.apply(Math,i))/2}},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.pageY-t.pageY,n=e.pageX-t.pageX;return 180*Math.atan2(i,n)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.pageX-e.pageX),n=Math.abs(t.pageY-e.pageY);return i>=n?t.pageX-e.pageX>0?s.DIRECTION_LEFT:s.DIRECTION_RIGHT:t.pageY-e.pageY>0?s.DIRECTION_UP:s.DIRECTION_DOWN},getDistance:function(t,e){var i=e.pageX-t.pageX,n=e.pageY-t.pageY;return Math.sqrt(i*i+n*n)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==s.DIRECTION_UP||t==s.DIRECTION_DOWN},stopDefaultBrowserBehavior:function(t,e){var i,n=["webkit","khtml","moz","ms","o",""];if(e&&t.style){for(var s=0;si;i++){var o=this.gestures[i];if(!this.stopped&&e[o.name]!==!1&&o.handler.call(o,t,this.current.inst)===!1){this.stopDetect();break}}return this.current&&(this.current.lastEvent=t),t.eventType==s.EVENT_END&&!t.touches.length-1&&this.stopDetect(),t}},stopDetect:function(){this.previous=s.utils.extend({},this.current),this.current=null,this.stopped=!0},extendEventData:function(t){var e=this.current.startEvent;if(e&&(t.touches.length!=e.touches.length||t.touches===e.touches)){e.touches=[];for(var i=0,n=t.touches.length;n>i;i++)e.touches.push(s.utils.extend({},t.touches[i]))}var o=t.timeStamp-e.timeStamp,r=t.center.pageX-e.center.pageX,a=t.center.pageY-e.center.pageY,h=s.utils.getVelocity(o,r,a);return s.utils.extend(t,{deltaTime:o,deltaX:r,deltaY:a,velocityX:h.x,velocityY:h.y,distance:s.utils.getDistance(e.center,t.center),angle:s.utils.getAngle(e.center,t.center),direction:s.utils.getDirection(e.center,t.center),scale:s.utils.getScale(e.touches,t.touches),rotation:s.utils.getRotation(e.touches,t.touches),startEvent:e}),t},register:function(t){var e=t.defaults||{};return e[t.name]===i&&(e[t.name]=!0),s.utils.extend(s.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}},s.gestures=s.gestures||{},s.gestures.Hold={name:"hold",index:10,defaults:{hold_timeout:500,hold_threshold:1},timer:null,handler:function(t,e){switch(t.eventType){case s.EVENT_START:clearTimeout(this.timer),s.detection.current.name=this.name,this.timer=setTimeout(function(){"hold"==s.detection.current.name&&e.trigger("hold",t)},e.options.hold_timeout);break;case s.EVENT_MOVE:t.distance>e.options.hold_threshold&&clearTimeout(this.timer);break;case s.EVENT_END:clearTimeout(this.timer)}}},s.gestures.Tap={name:"tap",index:100,defaults:{tap_max_touchtime:250,tap_max_distance:10,tap_always:!0,doubletap_distance:20,doubletap_interval:300},handler:function(t,e){if(t.eventType==s.EVENT_END){var i=s.detection.previous,n=!1;if(t.deltaTime>e.options.tap_max_touchtime||t.distance>e.options.tap_max_distance)return;i&&"tap"==i.name&&t.timeStamp-i.lastEvent.timeStamp0&&t.touches.length>e.options.swipe_max_touches)return;(t.velocityX>e.options.swipe_velocity||t.velocityY>e.options.swipe_velocity)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},s.gestures.Drag={name:"drag",index:50,defaults:{drag_min_distance:10,drag_max_touches:1,drag_block_horizontal:!1,drag_block_vertical:!1,drag_lock_to_axis:!1,drag_lock_min_distance:25},triggered:!1,handler:function(t,e){if(s.detection.current.name!=this.name&&this.triggered)return e.trigger(this.name+"end",t),void(this.triggered=!1);if(!(e.options.drag_max_touches>0&&t.touches.length>e.options.drag_max_touches))switch(t.eventType){case s.EVENT_START:this.triggered=!1;break;case s.EVENT_MOVE:if(t.distancee.options.transform_min_rotation&&e.trigger("rotate",t),i>e.options.transform_min_scale&&(e.trigger("pinch",t),e.trigger("pinch"+(t.scale<1?"in":"out"),t));break;case s.EVENT_END:this.triggered&&e.trigger(this.name+"end",t),this.triggered=!1}}},s.gestures.Touch={name:"touch",index:-1/0,defaults:{prevent_default:!1,prevent_mouseevents:!1},handler:function(t,e){return e.options.prevent_mouseevents&&t.pointerType==s.POINTER_MOUSE?void t.stopDetect():(e.options.prevent_default&&t.preventDefault(),void(t.eventType==s.EVENT_START&&e.trigger(this.name,t)))}},s.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==s.EVENT_END&&e.trigger(this.name,t)}},"object"==typeof e&&"object"==typeof e.exports?e.exports=s:(t.Hammer=s,"function"==typeof t.define&&t.define.amd&&t.define("hammer",[],function(){return s}))}(this)},{}],3:[function(e,i){(function(n){function s(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function o(t,e){return function(i){return p(t.call(this,i),e)}}function r(t,e){return function(i){return this.lang().ordinal(t.call(this,i),e)}}function a(){}function h(t){x(t),c(this,t)}function d(t){var e=_(t),i=e.year||0,n=e.month||0,s=e.week||0,o=e.day||0,r=e.hour||0,a=e.minute||0,h=e.second||0,d=e.millisecond||0;this._milliseconds=+d+1e3*h+6e4*a+36e5*r,this._days=+o+7*s,this._months=+n+12*i,this._data={},this._bubble()}function c(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return e.hasOwnProperty("toString")&&(t.toString=e.toString),e.hasOwnProperty("valueOf")&&(t.valueOf=e.valueOf),t}function l(t){var e,i={};for(e in t)t.hasOwnProperty(e)&&_e.hasOwnProperty(e)&&(i[e]=t[e]);return i}function u(t){return 0>t?Math.ceil(t):Math.floor(t)}function p(t,e,i){for(var n=""+Math.abs(t),s=t>=0;n.lengthn;n++)(i&&t[n]!==e[n]||!i&&b(t[n])!==b(e[n]))&&r++;return r+o}function y(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=Xe[t]||Ze[e]||e}return t}function _(t){var e,i,n={};for(i in t)t.hasOwnProperty(i)&&(e=y(i),e&&(n[e]=t[i]));return n}function w(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}re[t]=function(s,o){var r,a,h=re.fn._lang[t],d=[];if("number"==typeof s&&(o=s,s=n),a=function(t){var e=re().utc().set(i,t);return h.call(re.fn._lang,e,s||"")},null!=o)return a(o);for(r=0;e>r;r++)d.push(a(r));return d}}function b(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function S(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function E(t){return T(t)?366:365}function T(t){return t%4===0&&t%100!==0||t%400===0}function x(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[ue]<0||t._a[ue]>11?ue:t._a[pe]<1||t._a[pe]>S(t._a[le],t._a[ue])?pe:t._a[fe]<0||t._a[fe]>23?fe:t._a[ge]<0||t._a[ge]>59?ge:t._a[me]<0||t._a[me]>59?me:t._a[ve]<0||t._a[ve]>999?ve:-1,t._pf._overflowDayOfYear&&(le>e||e>pe)&&(e=pe),t._pf.overflow=e)}function C(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length)),t._isValid}function M(t){return t?t.toLowerCase().replace("_","-"):t}function D(t,e){return e._isUTC?re(t).zone(e._offset||0):re(t).local()}function I(t,e){return e.abbr=t,ye[t]||(ye[t]=new a),ye[t].set(e),ye[t]}function O(t){delete ye[t]}function N(t){var i,n,s,o,r=0,a=function(t){if(!ye[t]&&we)try{e("./lang/"+t)}catch(i){}return ye[t]};if(!t)return re.fn._lang;if(!g(t)){if(n=a(t))return n;t=[t]}for(;r0;){if(n=a(o.slice(0,i).join("-")))return n;if(s&&s.length>=i&&v(o,s,!0)>=i-1)break;i--}r++}return re.fn._lang}function L(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function A(t){var e,i,n=t.match(Te);for(e=0,i=n.length;i>e;e++)n[e]=Je[n[e]]?Je[n[e]]:L(n[e]);return function(s){var o="";for(e=0;i>e;e++)o+=n[e]instanceof Function?n[e].call(s,t):n[e];return o}}function k(t,e){return t.isValid()?(e=z(e,t.lang()),Ke[e]||(Ke[e]=A(e)),Ke[e](t)):t.lang().invalidDate()}function z(t,e){function i(t){return e.longDateFormat(t)||t}var n=5;for(xe.lastIndex=0;n>=0&&xe.test(t);)t=t.replace(xe,i),xe.lastIndex=0,n-=1;return t}function P(t,e){var i,n=e._strict;switch(t){case"DDDD":return Fe;case"YYYY":case"GGGG":case"gggg":return n?Ye:De;case"Y":case"G":case"g":return He;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return n?Re:Ie;case"S":if(n)return ze;case"SS":if(n)return Pe;case"SSS":if(n)return Fe;case"DDD":return Me;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Ne;case"a":case"A":return N(e._l)._meridiemParse;case"X":return ke;case"Z":case"ZZ":return Le;case"T":return Ae;case"SSSS":return Oe;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return n?Pe:Ce;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Ce;default:return i=new RegExp(V(U(t.replace("\\","")),"i"))}}function F(t){t=t||"";var e=t.match(Le)||[],i=e[e.length-1]||[],n=(i+"").match(Ge)||["-",0,0],s=+(60*n[1])+b(n[2]);return"+"===n[0]?-s:s}function Y(t,e,i){var n,s=i._a;switch(t){case"M":case"MM":null!=e&&(s[ue]=b(e)-1);break;case"MMM":case"MMMM":n=N(i._l).monthsParse(e),null!=n?s[ue]=n:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(s[pe]=b(e));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=b(e));break;case"YY":s[le]=b(e)+(b(e)>68?1900:2e3);break;case"YYYY":case"YYYYY":case"YYYYYY":s[le]=b(e);break;case"a":case"A":i._isPm=N(i._l).isPM(e);break;case"H":case"HH":case"h":case"hh":s[fe]=b(e);break;case"m":case"mm":s[ge]=b(e);break;case"s":case"ss":s[me]=b(e);break;case"S":case"SS":case"SSS":case"SSSS":s[ve]=b(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=F(e);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":t=t.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=e)}}function R(t){var e,i,n,s,o,r,a,h,d,c,l=[];if(!t._d){for(n=W(t),t._w&&null==t._a[pe]&&null==t._a[ue]&&(o=function(e){var i=parseInt(e,10);return e?e.length<3?i>68?1900+i:2e3+i:i:null==t._a[le]?re().weekYear():t._a[le]},r=t._w,null!=r.GG||null!=r.W||null!=r.E?a=te(o(r.GG),r.W||1,r.E,4,1):(h=N(t._l),d=null!=r.d?K(r.d,h):null!=r.e?parseInt(r.e,10)+h._week.dow:0,c=parseInt(r.w,10)||1,null!=r.d&&dE(s)&&(t._pf._overflowDayOfYear=!0),i=Z(s,0,t._dayOfYear),t._a[ue]=i.getUTCMonth(),t._a[pe]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=l[e]=n[e];for(;7>e;e++)t._a[e]=l[e]=null==t._a[e]?2===e?1:0:t._a[e];l[fe]+=b((t._tzm||0)/60),l[ge]+=b((t._tzm||0)%60),t._d=(t._useUTC?Z:X).apply(null,l)}}function H(t){var e;t._d||(e=_(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],R(t))}function W(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function j(t){t._a=[],t._pf.empty=!0;var e,i,n,s,o,r=N(t._l),a=""+t._i,h=a.length,d=0;for(n=z(t._f,r).match(Te)||[],e=0;e0&&t._pf.unusedInput.push(o),a=a.slice(a.indexOf(i)+i.length),d+=i.length),Je[s]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(s),Y(s,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(s);t._pf.charsLeftOver=h-d,a.length>0&&t._pf.unusedInput.push(a),t._isPm&&t._a[fe]<12&&(t._a[fe]+=12),t._isPm===!1&&12===t._a[fe]&&(t._a[fe]=0),R(t),x(t)}function U(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,n,s){return e||i||n||s})}function V(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function G(t){var e,i,n,o,r;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(o=0;or)&&(n=r,i=e));c(t,i||e)}function B(t){var e,i,n=t._i,s=We.exec(n);if(s){for(t._pf.iso=!0,e=0,i=Ue.length;i>e;e++)if(Ue[e][1].exec(n)){t._f=Ue[e][0]+(s[6]||" ");break}for(e=0,i=Ve.length;i>e;e++)if(Ve[e][1].exec(n)){t._f+=Ve[e][0];break}n.match(Le)&&(t._f+="Z"),j(t)}else t._d=new Date(n)}function q(t){var e=t._i,i=be.exec(e);e===n?t._d=new Date:i?t._d=new Date(+i[1]):"string"==typeof e?B(t):g(e)?(t._a=e.slice(0),R(t)):m(e)?t._d=new Date(+e):"object"==typeof e?H(t):t._d=new Date(e)}function X(t,e,i,n,s,o,r){var a=new Date(t,e,i,n,s,o,r);return 1970>t&&a.setFullYear(t),a}function Z(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function K(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function $(t,e,i,n,s){return s.relativeTime(e||1,!!i,t,n)}function Q(t,e,i){var n=ce(Math.abs(t)/1e3),s=ce(n/60),o=ce(s/60),r=ce(o/24),a=ce(r/365),h=45>n&&["s",n]||1===s&&["m"]||45>s&&["mm",s]||1===o&&["h"]||22>o&&["hh",o]||1===r&&["d"]||25>=r&&["dd",r]||45>=r&&["M"]||345>r&&["MM",ce(r/30)]||1===a&&["y"]||["yy",a];return h[2]=e,h[3]=t>0,h[4]=i,$.apply({},h)}function J(t,e,i){var n,s=i-e,o=i-t.day();return o>s&&(o-=7),s-7>o&&(o+=7),n=re(t).add("d",o),{week:Math.ceil(n.dayOfYear()/7),year:n.year()}}function te(t,e,i,n,s){var o,r,a=Z(t,0,1).getUTCDay();return i=null!=i?i:s,o=s-a+(a>n?7:0)-(s>a?7:0),r=7*(e-1)+(i-s)+o+1,{year:r>0?t:t-1,dayOfYear:r>0?r:E(t-1)+r}}function ee(t){var e=t._i,i=t._f;return null===e?re.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=N().preparse(e)),re.isMoment(e)?(t=l(e),t._d=new Date(+e._d)):i?g(i)?G(t):j(t):q(t),new h(t))}function ie(t,e){re.fn[t]=re.fn[t+"s"]=function(t){var i=this._isUTC?"UTC":"";return null!=t?(this._d["set"+i+e](t),re.updateOffset(this),this):this._d["get"+i+e]()}}function ne(t){re.duration.fn[t]=function(){return this._data[t]}}function se(t,e){re.duration.fn["as"+t]=function(){return+this/e}}function oe(t){var e=!1,i=re;"undefined"==typeof ender&&(t?(de.moment=function(){return!e&&console&&console.warn&&(e=!0,console.warn("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.")),i.apply(null,arguments)},c(de.moment,i)):de.moment=re)}for(var re,ae,he="2.5.1",de=this,ce=Math.round,le=0,ue=1,pe=2,fe=3,ge=4,me=5,ve=6,ye={},_e={_isAMomentObject:null,_i:null,_f:null,_l:null,_strict:null,_isUTC:null,_offset:null,_pf:null,_lang:null},we="undefined"!=typeof i&&i.exports&&"undefined"!=typeof e,be=/^\/?Date\((\-?\d+)/i,Se=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,Ee=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,Te=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,xe=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,Ce=/\d\d?/,Me=/\d{1,3}/,De=/\d{1,4}/,Ie=/[+\-]?\d{1,6}/,Oe=/\d+/,Ne=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Le=/Z|[\+\-]\d\d:?\d\d/gi,Ae=/T/i,ke=/[\+\-]?\d+(\.\d{1,3})?/,ze=/\d/,Pe=/\d\d/,Fe=/\d{3}/,Ye=/\d{4}/,Re=/[+-]?\d{6}/,He=/[+-]?\d+/,We=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,je="YYYY-MM-DDTHH:mm:ssZ",Ue=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],Ve=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Ge=/([\+\-]|\d\d)/gi,Be="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),qe={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},Xe={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},Ze={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},Ke={},$e="DDD w W M D d".split(" "),Qe="M D H h m s w W".split(" "),Je={M:function(){return this.month()+1},MMM:function(t){return this.lang().monthsShort(this,t)},MMMM:function(t){return this.lang().months(this,t)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(t){return this.lang().weekdaysMin(this,t)},ddd:function(t){return this.lang().weekdaysShort(this,t)},dddd:function(t){return this.lang().weekdays(this,t)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return p(this.year()%100,2)},YYYY:function(){return p(this.year(),4)},YYYYY:function(){return p(this.year(),5)},YYYYYY:function(){var t=this.year(),e=t>=0?"+":"-";return e+p(Math.abs(t),6)},gg:function(){return p(this.weekYear()%100,2)},gggg:function(){return p(this.weekYear(),4)},ggggg:function(){return p(this.weekYear(),5)},GG:function(){return p(this.isoWeekYear()%100,2)},GGGG:function(){return p(this.isoWeekYear(),4)},GGGGG:function(){return p(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return b(this.milliseconds()/100)},SS:function(){return p(b(this.milliseconds()/10),2)},SSS:function(){return p(this.milliseconds(),3)},SSSS:function(){return p(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+p(b(t/60),2)+":"+p(b(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+p(b(t/60),2)+p(b(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},ti=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];$e.length;)ae=$e.pop(),Je[ae+"o"]=r(Je[ae],ae);for(;Qe.length;)ae=Qe.pop(),Je[ae+ae]=o(Je[ae],2);for(Je.DDDD=o(Je.DDD,3),c(a.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,i,n;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(i=re.utc([2e3,e]),n="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[e]=new RegExp(n.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,n;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=re([2e3,1]).day(e),n="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(n.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var i=this._calendar[t];return"function"==typeof i?i.apply(e):i},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,n){var s=this._relativeTime[i];return"function"==typeof s?s(t,e,i,n):s.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return J(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),re=function(t,e,i,o){var r;return"boolean"==typeof i&&(o=i,i=n),r={},r._isAMomentObject=!0,r._i=t,r._f=e,r._l=i,r._strict=o,r._isUTC=!1,r._pf=s(),ee(r)},re.utc=function(t,e,i,o){var r;return"boolean"==typeof i&&(o=i,i=n),r={},r._isAMomentObject=!0,r._useUTC=!0,r._isUTC=!0,r._l=i,r._i=t,r._f=e,r._strict=o,r._pf=s(),ee(r).utc()},re.unix=function(t){return re(1e3*t)},re.duration=function(t,e){var i,n,s,o=t,r=null;return re.isDuration(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(o={},e?o[e]=t:o.milliseconds=t):(r=Se.exec(t))?(i="-"===r[1]?-1:1,o={y:0,d:b(r[pe])*i,h:b(r[fe])*i,m:b(r[ge])*i,s:b(r[me])*i,ms:b(r[ve])*i}):(r=Ee.exec(t))&&(i="-"===r[1]?-1:1,s=function(t){var e=t&&parseFloat(t.replace(",","."));return(isNaN(e)?0:e)*i},o={y:s(r[2]),M:s(r[3]),d:s(r[4]),h:s(r[5]),m:s(r[6]),s:s(r[7]),w:s(r[8])}),n=new d(o),re.isDuration(t)&&t.hasOwnProperty("_lang")&&(n._lang=t._lang),n},re.version=he,re.defaultFormat=je,re.updateOffset=function(){},re.lang=function(t,e){var i;return t?(e?I(M(t),e):null===e?(O(t),t="en"):ye[t]||N(t),i=re.duration.fn._lang=re.fn._lang=N(t),i._abbr):re.fn._lang._abbr},re.langData=function(t){return t&&t._lang&&t._lang._abbr&&(t=t._lang._abbr),N(t)},re.isMoment=function(t){return t instanceof h||null!=t&&t.hasOwnProperty("_isAMomentObject")},re.isDuration=function(t){return t instanceof d},ae=ti.length-1;ae>=0;--ae)w(ti[ae]);for(re.normalizeUnits=function(t){return y(t)},re.invalid=function(t){var e=re.utc(0/0);return null!=t?c(e._pf,t):e._pf.userInvalidated=!0,e},re.parseZone=function(t){return re(t).parseZone()},c(re.fn=h.prototype,{clone:function(){return re(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=re(this).utc();return 00:!1},parsingFlags:function(){return c({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(t){var e=k(this,t||re.defaultFormat);return this.lang().postformat(e)},add:function(t,e){var i;return i="string"==typeof t?re.duration(+e,t):re.duration(t,e),f(this,i,1),this},subtract:function(t,e){var i;return i="string"==typeof t?re.duration(+e,t):re.duration(t,e),f(this,i,-1),this},diff:function(t,e,i){var n,s,o=D(t,this),r=6e4*(this.zone()-o.zone());return e=y(e),"year"===e||"month"===e?(n=432e5*(this.daysInMonth()+o.daysInMonth()),s=12*(this.year()-o.year())+(this.month()-o.month()),s+=(this-re(this).startOf("month")-(o-re(o).startOf("month")))/n,s-=6e4*(this.zone()-re(this).startOf("month").zone()-(o.zone()-re(o).startOf("month").zone()))/n,"year"===e&&(s/=12)):(n=this-o,s="second"===e?n/1e3:"minute"===e?n/6e4:"hour"===e?n/36e5:"day"===e?(n-r)/864e5:"week"===e?(n-r)/6048e5:n),i?s:u(s)},from:function(t,e){return re.duration(this.diff(t)).lang(this.lang()._abbr).humanize(!e)},fromNow:function(t){return this.from(re(),t)},calendar:function(){var t=D(re(),this).startOf("day"),e=this.diff(t,"days",!0),i=-6>e?"sameElse":-1>e?"lastWeek":0>e?"lastDay":1>e?"sameDay":2>e?"nextDay":7>e?"nextWeek":"sameElse";return this.format(this.lang().calendar(i,this))},isLeapYear:function(){return T(this.year())},isDST:function(){return this.zone()+re(t).startOf(e)},isBefore:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)<+re(t).startOf(e)},isSame:function(t,e){return e=e||"ms",+this.clone().startOf(e)===+D(t,this).startOf(e)},min:function(t){return t=re.apply(null,arguments),this>t?this:t},max:function(t){return t=re.apply(null,arguments),t>this?this:t},zone:function(t){var e=this._offset||0;return null==t?this._isUTC?e:this._d.getTimezoneOffset():("string"==typeof t&&(t=F(t)),Math.abs(t)<16&&(t=60*t),this._offset=t,this._isUTC=!0,e!==t&&f(this,re.duration(e-t,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?re(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return S(this.year(),this.month())},dayOfYear:function(t){var e=ce((re(this).startOf("day")-re(this).startOf("year"))/864e5)+1;return null==t?e:this.add("d",t-e)},quarter:function(){return Math.ceil((this.month()+1)/3)},weekYear:function(t){var e=J(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==t?e:this.add("y",t-e)},isoWeekYear:function(t){var e=J(this,1,4).year;return null==t?e:this.add("y",t-e)},week:function(t){var e=this.lang().week(this);return null==t?e:this.add("d",7*(t-e))},isoWeek:function(t){var e=J(this,1,4).week;return null==t?e:this.add("d",7*(t-e))},weekday:function(t){var e=(this.day()+7-this.lang()._week.dow)%7;return null==t?e:this.add("d",t-e)},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},get:function(t){return t=y(t),this[t]()},set:function(t,e){return t=y(t),"function"==typeof this[t]&&this[t](e),this},lang:function(t){return t===n?this._lang:(this._lang=N(t),this)}}),ae=0;ae-1?!1:"INPUT"==i||"SELECT"==i||"TEXTAREA"==i||e.contentEditable&&"true"==e.contentEditable}function o(t,e){return t.sort().join(",")===e.sort().join(",")}function r(t){t=t||{};var e,i=!1;for(e in M)t[e]?i=!0:M[e]=0;i||(I=!1)}function a(t,e,i,n,s){var r,a,h=[];if(!x[t])return[];for("keyup"==i&&u(t)&&(e=[t]),r=0;r95&&112>t||b.hasOwnProperty(t)&&(_[b[t]]=t)}return _}function g(t,e,i){return i||(i=f()[t]?"keydown":"keypress"),"keypress"==i&&e.length&&(i="keydown"),i}function m(t,e,i,s){M[t]=0,s||(s=g(e[0],[]));var o,a=function(){I=s,++M[t],p()},h=function(t){d(i,t),"keyup"!==s&&(D=n(t)),setTimeout(r,10)};for(o=0;o1)return m(t,d,e,i);for(h="+"===t?["+"]:t.split("+"),o=0;o":".","?":"/","|":"\\"},T={option:"alt",command:"meta","return":"enter",escape:"esc"},x={},C={},M={},D=!1,I=!1,O=1;20>O;++O)b[111+O]="f"+O;for(O=0;9>=O;++O)b[O+96]=O;i(document,"keypress",l),i(document,"keydown",l),i(document,"keyup",l);var N={bind:function(t,e,i){return y(t instanceof Array?t:[t],e,i),C[t+":"+i]=e,this},unbind:function(t,e){return C[t+":"+e]&&(delete C[t+":"+e],this.bind(t,function(){},e)),this},trigger:function(t,e){return C[t+":"+e](),this},reset:function(){return x={},C={},this}};e.exports=N},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/docs/graph.html b/docs/graph.html index 2c679bc1..8dfe2594 100644 --- a/docs/graph.html +++ b/docs/graph.html @@ -15,25 +15,6 @@

Graph documentation

-

Contents

- -

Overview

Graph is a visualization to display graphs and networks consisting of nodes @@ -51,6 +32,37 @@ vis.js library.

+ +

Contents

+ + +

Example

Here a basic graph example. Note that unlike the @@ -147,7 +159,7 @@ The constructor accepts three parameters: -

Data Format

+

Data format

The data parameter of the Graph constructor is an object which can contain different types of data. @@ -605,7 +617,7 @@ var graph = new vis.Graph(container, data); -

Configuration Options

+

Configuration options

Options can be used to customize the graph. Options are defined as a JSON object. @@ -628,239 +640,353 @@ var options = {

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
edges.colorString"#2B7CE9"The default color of a edge.
edges.dashObjectObject - Object containing default properties for dashed lines. - Available properties: length, gap, - altLength. -
edges.dash.altLengthnumbernoneDefault length of the alternated dash in pixels on a dashed line. - Specifying dash.altLength allows for creating - a dashed line with a dash-dot style, for example when - dash.length=10 and dash.altLength=5. - See also the option dahs.length. - Only applicable when the line style is dash-line.
edges.dash.lengthnumber10Default length of a dash in pixels on a dashed line. - Only applicable when the line style is dash-line.
edges.dash.gapnumber5Default length of a gap in pixels on a dashed line. - Only applicable when the line style is dash-line.
edges.lengthNumber100The default length of a edge.
edges.styleString"line"The default style of a edge. - Choose from line (default), arrow, - arrow-center, dash-line.
edges.widthNumber1The default width of a edge.
groupsObjectnoneIt is possible to specify custom styles for groups. - Each node assigned a group gets the specified style. - See Groups for an overview of the available styles - and an example. -
heightString"400px"The height of the graph in pixels or as a percentage.
nodes.colorString | ObjectObjectDefault color of the nodes. When color is a string, the color is applied - to both background as well as the border of the node.
nodes.color.backgroundString"#97C2FC"Default background color of the nodes
nodes.color.borderString"#2B7CE9"Default border color of the nodes
nodes.color.highlightString | ObjectObjectDefault color of the node when the node is selected. Applied to - both border and background of the node.
nodes.color.highlight.backgroundString"#D2E5FF"Default background color of the node when selected.
nodes.color.highlight.borderString"#2B7CE9"Default border color of the node when selected.
nodes.fontColorString"black"Default font color for the text label in the nodes.
nodes.fontFaceString"sans"Default font face for the text label in the nodes, for example "verdana" or "arial".
nodes.fontSizeNumber14Default font size in pixels for the text label in the nodes.
nodes.groupStringnoneDefault group for the nodes.
nodes.imageStringnoneDefault image url for the nodes. only applicable with shape image.
nodes.widthMinNumber16The minimum width for a scaled image. Only applicable with shape image.
nodes.widthMaxNumber64The maximum width for a scaled image. Only applicable with shape image.
nodes.shapeString"ellipse"The default shape for all nodes. - Choose from - ellipse (default), circle, box, - database, image, label, dot, - star, triangle, triangleDown, and square. - This shape can be overridden by a group shape, or by a shape of an individual node.
nodes.radiusNumber5The default radius for a node. Only applicable with shape dot.
nodes.radiusMinNumber5The minimum radius for a scaled node. Only applicable with shape dot.
nodes.radiusMaxNumber20The maximum radius for a scaled node. Only applicable with shape dot.
selectableBooleantrueIf true, nodes in the graph can be selected by clicking them. - Long press can be used to select multiple nodes.
stabilizeBooleantrueIf true, the graph is stabilized before displaying it. If false, - the nodes move to a stabe position visibly in an animated way.
widthString"400px"The width of the graph in pixels or as a percentage.
NameTypeDefaultDescription
clusteringObjectnone + Clustering configuration. Clustering is turned off by default. See section Clustering for an overview of the available options. +
edgesObjectnone + Configuration options applied to all edges. See section Edges configuration for an overview of the available options. +
groupsObjectnoneIt is possible to specify custom styles for groups. + Each node assigned a group gets the specified style. + See Groups configuration for an overview of the available styles + and an example. +
heightString"400px"The height of the graph in pixels or as a percentage.
keyboardObjectnone + Configuration options for shortcuts keys. Sortcut keys are turned off by default. See section Keyboard navigation for an overview of the available options. +
navigationObjectnone + Configuration options for the navigation controls. See section Navigation controls for an overview of the available options. +
nodesObjectnone + Configuration options applied to all nodes. See section Nodes configuration for an overview of the available options. +
selectableBooleantrueIf true, nodes in the graph can be selected by clicking them. + Long press can be used to select multiple nodes.
stabilizeBooleantrueIf true, the graph is stabilized before displaying it. If false, + the nodes move to a stabe position visibly in an animated way.
widthString"400px"The width of the graph in pixels or as a percentage.

-

Groups

+

Nodes configuration

+

+ Nodes can be configured with different styles and shapes. To configure nodes, provide an object named nodes in the options for the Graph. +

+ +

+ For example to give the nodes a custom color, shape, and size: +

+
+var options = {
+  // ...
+  nodes: {
+    color: {
+      background: 'white',
+      border: 'red',
+      highlight: {
+        background: 'pink',
+        border: 'red'
+      }
+    },
+    shape: 'star',
+    radius: 24
+  }
+};
+
+ +

+ The following options are available for nodes. These options must be created + inside an object nodes in the graphs options object.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
colorString | ObjectObjectDefault color of the nodes. When color is a string, the color is applied + to both background as well as the border of the node.
color.backgroundString"#97C2FC"Default background color of the nodes
color.borderString"#2B7CE9"Default border color of the nodes
color.highlightString | ObjectObjectDefault color of the node when the node is selected. In case of a string, the color is applied to + both border and background of the node.
color.highlight.backgroundString"#D2E5FF"Default background color of the node when selected.
color.highlight.borderString"#2B7CE9"Default border color of the node when selected.
fontColorString"black"Default font color for the text label in the nodes.
fontFaceString"sans"Default font face for the text label in the nodes, for example "verdana" or "arial".
fontSizeNumber14Default font size in pixels for the text label in the nodes.
groupStringnoneDefault group for the nodes.
imageStringnoneDefault image url for the nodes. only applicable to shape image.
widthMinNumber16The minimum width for a scaled image. Only applicable to shape image.
widthMaxNumber64The maximum width for a scaled image. Only applicable to shape image.
shapeString"ellipse"The default shape for all nodes. + Choose from + ellipse (default), circle, box, + database, image, label, dot, + star, triangle, triangleDown, and square. + This shape can be overridden by a group shape, or by a shape of an individual node.
radiusNumber5The default radius for a node. Only applicable to shapes dot, + star, triangle, triangleDown, and square.
radiusMinNumber5The minimum radius for a scaled node. Only applicable to shapes dot, + star, triangle, triangleDown, and square.
radiusMaxNumber20The maximum radius for a scaled node. Only applicable to shapes dot, + star, triangle, triangleDown, and square.
+ + +

Edges configuration

+ +

+ Edges can be configured with different length and styling. To configure edges, provide an object named edges in the options for the Graph. +

+ +

+ For example to set the width of all edges to 2 pixels and give them a red color: +

+
+var options = {
+  // ...
+  edges: {
+    color: 'red',
+    width: 2
+  }
+};
+
+ +

+ The following options are available for edges. These options must be created + inside an object edges in the graphs options object. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
colorString"#2B7CE9"The default color of a edge.
dashObjectObject + Object containing default properties for dashed lines. + Available properties: length, gap, + altLength. +
dash.altLengthnumbernoneDefault length of the alternated dash in pixels on a dashed line. + Specifying dash.altLength allows for creating + a dashed line with a dash-dot style, for example when + dash.length=10 and dash.altLength=5. + See also the option dahs.length. + Only applicable when the line style is dash-line.
dash.lengthnumber10Default length of a dash in pixels on a dashed line. + Only applicable when the line style is dash-line.
dash.gapnumber5Default length of a gap in pixels on a dashed line. + Only applicable when the line style is dash-line.
lengthNumber100The default length of a edge.
styleString"line"The default style of a edge. + Choose from line (default), arrow, + arrow-center, dash-line.
widthNumber1The default width of a edge.
+ +

Groups configuration

It is possible to specify custom styles for groups of nodes. Each node having assigned to this group gets the specified style. @@ -932,9 +1058,10 @@ var nodes = [ color.highlight - String + String | Object "#D2E5FF" - Color of the node when selected. + Default color of the node when the node is selected. In case of a string, the color is applied to + both border and background of the node. color.highlight.background @@ -995,35 +1122,267 @@ var nodes = [ +

Clustering

+

+ The graph now supports dynamic clustering of nodes. This allows a user to view a very large dataset (> 50.000 nodes) without + sacrificing performance. When loading a large dataset, the nodes are clustered initially (this may take a small while) to have a + responsive visualization to work with. The clustering is both outside-in and inside-out. Outside-in means that nodes with only one + connection will be contained, or clustered, in the node it is connected to. Inside-out clustering first determines which nodes are hubs. + Hubs are defined as the nodes with the top 3% highest amount of connections (assuming normal distribution). These hubs then "grow", meaning + they contain the nodes they are connected to within themselves. The edges that were connected to the nodes that are absorbed will be reconnected to the cluster. +
+
+ A cluster is just a node that has references to the nodes and edges it contains. It has an internal counter to keep track of its size, which is then used + to calculate the required forces. The contained nodes are removed from the global nodes index, greatly speeding up the system. +
+
+ The clustering has the following user-configurable settings. The default values have been tested with the Graph examples and work well. + The default state for clustering is off. +

-

Methods

+
+// These variables must be defined in an options object named clustering.
+// If a variable is not supplied, the default value is used.
+var options = {
+    clustering: {
+      initialMaxNodes: 100,
+      clusterThreshold:500,
+      reduceToNodes:300,
+      chainThreshold: 0.4,
+      clusterEdgeThreshold: 20,
+      sectorThreshold: 50,
+      screenSizeThreshold: 0.2,
+      fontSizeMultiplier:  4.0,
+      forceAmplification:  0.6,
+      distanceAmplification: 0.2,
+      edgeGrowth: 11,
+      nodeScaling: {width:  10,
+                    height: 10,
+                    radius: 10},
+      activeAreaBoxSize: 100
+    }
+}
+// OR to just load the module with default values:
+var options: {
+    clustering: true
+}
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
initialMaxNodesNumber100If the initial amount of nodes is larger than this value, clustering starts until the total number of nodes is less than this value.
clusterThresholdNumber500While zooming in and out, clusters can open up. Once there are more than absoluteMaxNumberOfNodes nodes, + clustering starts until reduceToMaxNumberOfNodes nodes are left. This is done to ensure performance is continuously fluid.
reduceToNodesNumber300While zooming in and out, clusters can open up. Once there are more than absoluteMaxNumberOfNodes nodes, + clustering starts until reduceToMaxNumberOfNodes nodes are left. This is done to ensure performance is continiously fluid.
chainThresholdNumber0.4Because of the clustering methods used, long chains of nodes can be formed. To reduce these chains, this threshold is used. + A chainThreshold of 0.4 means that no more than 40% of all nodes are allowed to be a chain node (two connections). + If there are more, they are clustered together.
clusterEdgeThresholdNumber20This is the absolute edge length threshold in pixels. If the edge is smaller on screen (that means zooming out reduces this length) + the node will be clustered. This is triggered when zooming out.
sectorThresholdInteger50If a cluster larger than sectorThreshold is opened, a seperate instance called a sector, will be created. All the simulation of + nodes outside of this instance will be paused. This is to maintain performance and clarity when examining large clusters. + A sector is collapsed when zooming out far enough. Also, when opening a cluster, if this cluster is smaller than this value, it is fully unpacked.
screenSizeThresholdNumber0.2When zooming in, the clusters become bigger. A screenSizeThreshold of 0.2 means that if the width or height of this cluster + becomes bigger than 20% of the width or height of the canvas, the cluster is opened. If a sector has been created, if the sector is smaller than + 20%, we collapse this sector.
fontSizeMultiplierNumber4.0This parameter denotes the increase in fontSize of the cluster when a single node is added to it.
forceAmplificationNumber0.6This factor is used to calculate the increase of the repulsive force of a cluster. It is calculated by the following + formula: repulsingForce *= 1 + (clusterSize * forceAmplification).
distanceAmplificationNumber0.2This factor is used to calculate the increase in effective range of the repulsive force of the cluster. + A larger cluster has a longer range. It is calculated by the following + formula: minDistance *= 1 + (clusterSize * distanceAmplification).
edgeGrowthNumber11This factor determines the elongation of edges connected to a cluster.
nodeScaling.widthNumber10This factor determines how much the width of a cluster increases in pixels per added node.
nodeScaling.heightNumber10This factor determines how much the height of a cluster increases in pixels per added node.
nodeScaling.radiusNumber10This factor determines how much the radius of a cluster increases in pixels per added node.
activeAreaBoxSizeNumber100Imagine a square with an edge length of activeAreaBoxSize pixels around your cursor. + If a cluster is in this box as you zoom in, the cluster can be opened in a seperate sector. + This is regardless of the zoom level.
+ +

- Graph supports the following methods. + Graph has a menu with navigation controls, which is disabled by default. + It can be configured with the following settings.

+
+// simple use of navigation controls
+var options: {
+  navigation: true
+}
+
+// advanced use of navigation controls
+var options: {
+  navigation: {
+    iconPath: '/path/to/navigation/icons/'
+  }
+}
+
+ - - + + + - - - + + + + + +
MethodReturn TypeNameTypeDefault Description
setData(data)noneLoads data. Parameter data is an object containing - nodes, edges, and options. Parameters nodes, edges are an Array. - Options is a name-value map and is optional. - iconPathstring"/img"The path to the icon images can be defined here. If custom icons are used, they have to have the same filename as the ones originally packaged with vis.js.
+ +

Keyboard navigation

+

+ The graph can be navigated using shortcut keys. + It can be configured with the following user-configurable settings. + The default state for the keyboard navigation is off. The predefined keys can be found in the example 20_navigation.html. +

+ +
+// simple use of keyboard controls
+var options: {
+    keyboard: true
+}
+
+// advanced configuration for keyboard controls
+var options: {
+  keyboard: {
+    speed: {
+      x: 10,
+      y: 10,
+      zoom: 0.02
+    }
+  }
+}
+
+ + + + + + + - - - + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
setOptions(options)noneSet options for the graph. The available options are described in - the section Configuration Options. + speed.xNumber10This defines the speed of the camera movement in the x direction when using the keyboard navigation.
speed.yNumber10This defines the speed of the camera movement in the y direction when using the keyboard navigation.
speed.zoomNumber0.02This defines the zoomspeed when using the keyboard navigation.
+ +

Methods

+

+ Graph supports the following methods. +

+ + + + + + + @@ -1034,12 +1393,43 @@ var nodes = [ + + + + + + + + + + + + + + + + + + + + + + + + @@ -1063,7 +1453,7 @@ var nodes = [

Events

- Graph fires events after one or multiple nodes are selected. + Graph fires events after one or multiple nodes are selected or deselected. The event can be catched by creating a listener.

@@ -1072,22 +1462,35 @@ var nodes = [

-function onSelect() {
-  alert('selected nodes: ' + graph.getSelection());
+graph.on('select', function (properties) {
+  alert('selected nodes: ' + properties.nodes);
+});
+
+ +

+ A listener can be removed via the function off: +

+ +
+function onSelect (properties) {
+  alert('selected nodes: ' + properties.nodes);
 }
 
-vis.events.addListener(graph, 'select', onSelect);
+// add event listener
+graph.on('select', onSelect);
+
+// do stuff...
+
+// remove event listener
+graph.off('select', onSelect);
 
+

The following events are available.

MethodReturn TypeDescription
getSelection()
on(event, callback)noneCreate an event listener. The callback function is invoked every time the event is triggered. Avialable events: select. The callback function is invoked as callback(properties), where properties is an object containing event specific properties. See section Events for more information.
off(event, callback)noneRemove an event listener created before via function on(event, callback). See section Events for more information.
redraw() none Redraw the graph. Useful when the layout of the webpage changed.
setData(data,[disableStart])noneLoads data. Parameter data is an object containing + nodes, edges, and options. Parameters nodes, edges are an Array. + Options is a name-value map and is optional. Parameter disableStart is + an optional Boolean and can disable the start of the simulation that would begin at the end + of this function by default. +
setOptions(options)noneSet options for the graph. The available options are described in + the section Configuration Options. +
setSelection(selection) none
- - - - @@ -1096,18 +1499,19 @@ vis.events.addListener(graph, 'select', onSelect); - + -
name Description
selectFired after the user selects or unselects a node by clicking it, - or when selecting a number of nodes by dragging a selection area - around them. Not fired when the method setSelection - is executed. The ids of the selected nodes can be retrieved via the - method getSelection. + Fired after the user selects or deselects a node by clicking it. + Not fired when the method setSelectionis executed. + +
    +
  • nodes: an array with the ids of the selected nodes
  • +
none
-

Data Policy

+

Data policy

All code and data is processed and rendered in the browser. No data is sent to any server. diff --git a/docs/img/vis_overview.odg b/docs/img/vis_overview.odg index 7659955f2fb858c383c3b5b082a352ee45b32523..0be797e9e3bd0fe567a4911f67019ebb0d433bb6 100644 GIT binary patch delta 13414 zcmaKT1ymf%w)Wrz2@o`Ra7obMPH=a3cXw+7!Gk1&yAwRPySux)LvV+moO|xQIqSXm z*IF~vB~x9pdw<{F)jQxBVm%ZBQBD#H8UqA^2Z4sZA;hbe{jHj zo_ODa(1BwR2m%BT2?Bw*s+O2RApA9PAps?~o_xL*lN)-}~TlsVkjVkj5E zZv^|PW!;OiHYCtWYHJ-tci1I%GPp>z>~}KQBkM3k-vOfR(LtlyBh)-I(<%+;D@)bZ z=q)Db+T3ZBLhtK!($e)Xx{*#Dsr z5G?(oF|qJtA|8{&SYtmhTC8x8DA{XS6B*QeEt-(cz1XaKI&^W77&N6OKHlMUBvqf` zeTa>YUQvLHtU|E#Tt^XD7K;98ZFr{CWH1b^(YuyRW~v=ZJGMW8>aXs$8*Hq$KXoXDI-cW2_oVYrZmpu%_El(Z|F z*66;+V*S`A$05U_uys^?-k6m(bDe^V+r&O(J#Vj7l`Ci7mydWbM7$2NyaxGa8XJB9 zZr10RzCS7zf33hSFJ$>DOH|wSkx7}(JvLe8xI2VNyo;C2X8V+yHj?kM;%BBI5YF*x zNAhSIZn|V8F6!tYK;H;CZ}hx`5!@8X=Zr;YqXRGR!(#-Li7pxv0#P{=SKq z_gYsXm%yILh1Tm0bez zh=^A5K#JkLrh^|NIg^;7zo%0w@NLDaE-rtg1|J0{I;mTZOkWsBCN^``3QOQyRusG9 z$88e zQ16uBb}+t)HHvc#HgOj$BvM<8<{1Wb9zM&e9idS zlI6>8gH(Lv&+&RUtld@`f#b7P%Z$r(-JZ&MqG{JZ@h`U3Zfwi9ib9N7m^G`SwklYK zZNcj*coiPM zK~hiC@4VLnP5yPR+~dnvJL(Mqv(cga1r>)D1dQmVt0V`#yZos=P4w=fnvhgyJ&(nA zp0{)su)9sXANs@R*r4NJ4oNIAF_36m8g9>5DG}y#o4H!bqKz@hh0_`}EFW5i z@Y|x^ZANp$-c8(%`sjBGaUBM({&qXq-?2Q@gtwl9mzB1<5JFC zOUO$*Q+0Y3oR{!PcqVOAXf|;wkI+#VdK1A~Tg^*9To{D*4A{F%9_S;P?0l`njm`J( zUZJt>_$ZUXXEKH9sttIs^{Wl>HK-a*&w1yqco_*Y=<)$i^=-bPGl;R{rtN+{E3ha4 zJZ}E1hXd$__fjok(Y39v2xjqJ(B@cjPe@SiSr2=}(7oZ5-~A(2Xs`d4$B9jQ9XxznSZpO&GPcMWv7@4_H{5iZU83yirec`j91ny~cJzLxQW zI`SK4_YIa2d0P?#QLju%r#p7rbkmdw>ty%o(;o}xKNqZ( zN(N?m&x73uw?ifef2>y1I3cpP?p{*OXC-g4kuT3Y)33A+VT7R!O_sWqFP!rSHr_F~ z-XBWO-Z|giWx1eK3u$|Q|0K17${Wc>-ga|6pMP^WxqqJkRU>+2U&MhvSPaP7 z8YrbCojT1RlLA}MghsfN+o@{kv1%f6;nv0*&qaiSv`Sh|W;NET&x<&jNL1e4GCA%+ z_&M<<46$A7b=MeCD$&LCgZV5Jvwj*vpQPO}Gm83}JxhZ*BIlKYX%hw$`FXRd9X2qG zlhr#*<;KkfspLXTDPinCOWqgiJQ#_HWz>Rnt` z4MT3QLaYg?z*Q9U)K*-KWTX7A2R0i`R539W?komWlq#mACYecmycD%;g&78zI9^T0 zwFlTFwDrp_5ekkoSO?z?yl*Y2gUtO=ngFoB?=mVTaXsEA#jk4jL25Mz_W($>scj7? zqOLD{er!vrZK(6{5ozM)9@=ntBEG5m!G0r)&$gtRTt8axd#(j*B)yGI!Vpykf{ac3 z6iLU@7c91I1JzOx_J5%JSpPR}b8B5W5iU%xF}1njG;^?*_|X(rko2#})D=dWz$`f; zXmcCBLp5#{cL3&^yvw4uc7Rl|QvILjGVgaTQ`Fsq+$%n%v?IVtY%w{1oujwdeyUx_ zaRW~bpXs07)?T_@rQFASn9@PnzAU#UipHp9%PEgF-)?ZUKf)5Vad&x@5}k7GG!w30 zsATBvzT_qO=sna>T~jBTxft(yj>YI;)e`Hehdveg`UGf{E1*(TExoT>sf0K&S9#$G z{_i7WwzXYoR|5}QzQc0`eV*L*y8}jqo_wfzKY5pDrT73@;v08W-dV@3El7r^y)lrm5`X)<%n`qX0z1qQ5cRc)vh!u<} z;OTTX7O+5cZ?Y10&)KnIgq4vi9T_e)qCFpID%DTCLwq>AlQ3p=Jx8d56eR?XmZSTxT~Ma9ZxO}wfBE>HYHzuE2hnT z($e_7?U=6ACAF(c-AFU9`(l6(jtJ~<>r*9636$1%(M2qva*^pttq*4k<5}yjNc-Hh zNY0Uc$f~2=-WzAwUrlHp$d=qd_SUAoI-?bBzD zp`3GE2@YHbY?hn6J}TzgLd8swO?*H1ly&T>ziHT0;IavwZH@U5I~0PFT0x>94;Xh! z0iwleZr-NLQ2C8M#`rry5i`i5liYl@6fJF2mg1*VDpTxLRJbOJL#1RG49XYA`O=E^ z{nQfm1tTayIY{SiH%ng5*4q5Pey${Af|eh8>=2#gxKw^P1ZMdeCWsJ^Iup8zmNp%bQG(o;ELc(i!p+^)*)-b*%Eu zVU|xrCW}c>rgY^LC303R+Ixo8T6T+ID-{oae6FLxDU^)Kre*oQIrvbMg1)Gw^y8!`pUqn9{f_<}Km@MS zRo^Iw)q!iS`nC~0*t%RYJvoru;(Gm{vK5C9&C-JAbneV3PpG#lVM6K{r=5gO9l5k+ zR8vyqClp8H>0z&03{D$Bs!Ma}{81p6(>uho3%#+@GJ&vFON0?zK$&;_K$63u@6bW8 zEVB+y%rLNyV|gCWR7~bzX2{F{G6h9qHBvP-bUm!E&87KdJ6I{!PNM9{(HnT_5pkpM z^2Z!j3RYVIxbh4)D?P-sIKCC8Y*mKRNmIRNSB)m6bOh zO|Q5=Q>gxO0UgtdRDL~2!t!ABnv*zIl>0$&9pV`LV2AaL>Q1&(dV3cOED4xW$;{&M zeP$D?L3kJ|Fz)1(Jtnp84-EJazFF1zkkppkbGhiP+^XSYjINWCo~v@6v`K?=pTS#x z52;$NUbYy>_G9N@T40Mc-9rPP;vEkT(}NMzFP}GP#vo4E7gNHQ>YCy7rWyt2e}S@H z;EF120okpymoL)z-yV2?k<6iVz3sF6#}~yAG$Fti`0 z^T~U_XZih}CC!uco!$S5{%4xYM-Y!uZ-`$L_uIN(pV<*9Kz2g>rSTVW597%(UM@3T zg>O4tbF?pSQGCovn3`z&@iQAUDr=X*3+|_ktz5O@veSigUTc=km}bJ(<#=tQoyQNM zW7Y$&Hsf_izfFEG@7$#1=)6GY>gMrD{tKJ4O5yUXBI^5Tk#rYJ zB`4tIVV59!es#}>(g>=9y{~o9EI)^cx4>=txZrl4pKS|L2)zwv*)H_gDcn0FRk6y{ zQCFW&rw>3+j;G$U*d}@{$*3VPJZMID2pFImj|OC4LVX{B{n%12`xEVJ!rRLOspZz# zFY-$jR{ve$eWq&JyE~#%Z!V>)!JCL?X5&YyIoAUt5txL*0?`m~2}&5Ahv{0c@z^@|9iL~%7j;=ny}*XE2W>#5V1fGcAsg(J zIUc@iEDCreZzy!O2$l6<#2n3}#YemODfpEuMe-~ETJ-589A!4=rd!(QYvPG?*6Ys1 zpPfv87FM))&!(5C8X4=EpBk*E#Ize;qi)s5siqc4F({hP{hX?S^p+jK8>PW8@j0-h zjyy-OobchIWN~eV2xkTsqnz*ZvJ%|9{lBUDRqQ$-Cw)O7_31F)@pjfvZ@kf-hd>+e``D1|89U-TaH4Tw3YD8?Kw zcK3|1?$U=OVZ^cO5Uojj)S75O$g57*w;=VvPL^>mFLl269 zn~fJaGzh(GEMWszg(e%6-@%I(|0II4o8M%FDlvs0DV7vpcR3-!IQr&qxL!J`i9EG= z7+VP|Uz)=<$x?mc`UXc}6-QV=CpYs#8NxWZIsYr{rL+80;h{rfRa~Cca?TG@q?Oy! zr;_Z~CyL)Xn8w(Yk4Zxo6gBvWeVA+#hvZjrY!OE4mX{m4>9L{OlKGlFqW>8dFUyRti?z05=9vZ)tJy{2*&5KgJgKxo?ST3Woz;G9g=DLwwgW)qsLwm&4_P37M_OVmz8SZh(N?RcAB9He=7 z<y+X%9sc+COaObY-bbQ`AZEQv<>OpnND0t4<`uxI+Jf>N&Hk0sj}*LoY># zsv#U{c5Ern!L7;qWIvX11Uf8L=_-Qo39P(s&wE_9z0OX#f=)c53s=W55NA^HGL{6yZJ@USgzsb@o` z8gwYzz0Ua0P1?ozmV&^^@ojNGJqNsnPsL2N=QKnn5^v~@i@|RT{tw$ts5H#sv>}B<3 z413Dga;lTvcdy@n_~5xfBZ<%63VMOrf4L6+xG}U)9n>#PesKu-V}1(@nrwBFe~pa5 zpP)i$S6lumS_p8l(YUGCH1bf5=AhF;)vngk($l5me8B{e@;{OCWlS~!w^l79eIf)1 z`n(bNo(aYU#U`xYS2!kuz4==1oDC7eB_k4ja&Hf~y_dD1>W=HwnRhXQ9V}}rQ^AEO zhAZC`5?5`siV7NMj6O7+W{K|Qs{rJT>&`se;+xuY-(YRUETPYpA5!^qmn~{&0s{{$ zXqQv^rg%OnG1*WOEk+&H1ujl}fVTFdstKHM%DwSY$40m3;L6&s`Q=oFHq2bS+-W6S z6iYgWENv_X!?PqfN)hZp`w=RV`1pKWk1Iog#J_ zxSV!5Kc$ZU*#0R*dAn*!aFCJJb7kH1Z9nyqP@T^*hPp`<_tiYCJeJBW!#Bn`*C{z% z(^^)Z1nt`koo`)cS5-}?w}&3Wa0?G<8zIfen~d85`6KAZ7mj5rpN}Y6SBp_a?4D4I z`)7@16&(7yVJG{)!*Xl@`4w8{KGO1|WyzcH99Z2eH7n{ zyZ>-bixWmh@K(;zan#vh7g3O-li*IvWLZ!_u1=fvtr5hbGhKhI5@(+0Ba@^ zC0^w#*05T0XBvS8Ph<9#bWC=*Pm7HWrk|mZe1l)Sz}j9O)k883wT@U^BJ?-(zphU9 zAzT)$*Xc^fW7cQ%c;`6H?YoY%t+$zmCX|+uuhj`tlVvZ;5IJv?;?gZN_X!_YHx)5G z$R}}+E1`Lp?z5y62yIqMZ%jNqfT0eHBCC>h%Dj~{rez02AB_uQSuWd>SY`xQ zyw<#?xD2Smgh^Ca7Rq`pSF$*V668-;B!usvlPy!9`ETf1;@(EfLK1SQ>(Xq zJ_Rb>bBJ?OxZQauiw3v}G;!RLGPJH6LJ8RhL~q#6Z=z#*((csN#`bcuhx^)Kv6|W5Q4nsz{jQh(zn6%;_GYUC)Zh9$OAV1}e7j46*i5 zhUE9cZFBGaNJQ7VBW`oYy(GsSW4I0|=(&Z}&@*UoirjljxEVjF$3eO8)?i@9U z!LEcWy~|;tf3>r0^mP?K{U;3AZU?0`$dbOlwsDM%=a9zTZ_W-`5!l=9VSQbpO(mYn z97q_2%dk@;NvgyShXZ5U*xh3gyOQ$p`?geDNo|AWn!*T8dE#ZcE+l0R?0f41FT0>O zK&k>11(4flt(peXWKnqK`c}el#-qor0p~%E&frP6Kpiu8z*KMS?HrJFzQ zXXyYe%9CQ7l5Ki!z#gPJ_Z{O`AHvIN$s*${qvY==L+B**EbmZ@i>;Wd<@jk9i{wh# z>m-z^Cjc?i^SOQli}z^rvb2TQW=dm7VjR45koi6Xy6k=yXsphfDuND+8kPDKO%9?o z(vDxfMtd(PC=2z4N-{76y}_sSp;=grD!AMT6@R@3y*5(Xy-@uX*1HVXy_Xj8F1*z~ zhc?R5X}-ds%teIrIiECeI44HC7e2=o(}0rZkk#EG&5oSQWG!!;`-tdqx4c99vVt=maMfXVBwzgrp~Sz<-oDoxB!9nMuT_%(7%%tGWFE@y4XbE%fSe`{V#c4^blkvL~Y zw73f90v|+KRlGIsiGAt8t4<4!H%p^Rfl8ym-}+pT`4{{;FFkTKI*qd9irFl;)ozX4 zW-%mzKUJ9E1hzTRWmAW!O#5S{M<`Copk5N4hH)N+o94ma%GsR$hMYmD&hu5;&S(hw zcV4eI!+FZ0s(fMfwP|!bGXxF?BcdF}k35gb*^WB7yfQawUp3}0opkzuNr)fKTR%!> zC@lv$-~N)$ca5%jw>-%snicLC8@a65#AMVLjB*li@ZHvzZ+itKL!uvUm6-hIaYeNh zub1M{`2!37hppq5)i^!WEuGx5Up4_?E}s+f3AxA_o|;OJ6?3cTxls)Q#sleX()dz3 zq6O!m&*}}4H0C&fn2Hr3<5sap=_#RF`bN{q}d_je(QBIj+~$TNy+DDy19hi z;(aGADCO#U(j0RW$eu)rYvZ2;{8VW_6(_+N^DYeDuWcFy5t_w_2}Cc9$6u%0^)sdQ zRZd1tJWq#b@3Gh3srRvLCVNE7C#V~8XsNt+9c;oEs{0WAnQj2q0e~x-`LNE7%X)N@ zeK!(;bkb+?`RWe^{V(6MIwZWVV(z_+1lEI_&>LVjNFbU#fLQ0q>-@Tm+V--8@|E;Y z{?f4WFHd&T=_##kotSVpKsP|xp=gVvWbRyf5ejf!&;Qz+< z9ST7hW+rJSHgFCF9V9ygc#0wuf*tHe$pkS3E~F#^wluVD*V!?=S9Ilt?|&9zl8?HW z@P8=$rLK{V3JJ3;weA;YC|W(y`fyhT<@6RlT0C(|Y~YhT`hD`jL6T=Aechwy-g+2Y zFMH;u%z*a(JPaADGit(;IaFclZSJG?-BE0FBQYKpfyF%?8A(S5ssnsW)Wj?L65ADX zUQ%HMfPGyUQmZ$tolXJe`%&fk@vebbb#r-V@cZM+I#eCTBxJu;rrP>!tJon-ga9iy zSFTCJC`l?}LH`lb#gqz3OT{xklby^W(Ual4=w`fPiXv<*+|-%NgTuS$BeP=?FSI<(dsrg*G5 z3*pQ&x^KzS3k~)S9My~WWWZm#*r5Hd%_cIpAK6WVYaQa-h=2abv$hS5p|m9-sZ^l2 zzD)8-;(@-S{)Od*HntmZP?*&DYor(Loa%vImCeK9;N)H65b06Ncqw9l<0&)UFQ#C2 zJK$A{Hyw_Uttz{y2$g1vAtO@aaB6}U!&^iRabXdRxc1tf?u3BOy0 zS6(Udb_ni_QO9F!5U#P@e{c`_U#gN_g*WB8XhI`$@_>j*gKef1x1zF$j?$04|ZmqV6;z zB85AnGonDwWLx7jd5W=-=NiQ>&jnQzaq16;*R^QwzQ%-$*SnZqOQ&ottV3!%FIhIqKvMWB@-k{HgxRl zS{iOGTSzkbbOCzZbsL^@36mC(b8pHi6}YoD<@-qm2GXm!l8W>lwne@gPCQUd+7!9+ z{3{0nuz@f4QtYDVNa;3=kqCsKzE%sUFVHOTaE;A=P};)YKbWPh*!ZRbk=C>AWZ=+_ zy=wT*{GLQZ?m=pfW7)V+kySVXs_*`a{G_fbJNuIK<8!xaROgbX?kSM~!G&QzdMhgX zZn?GG2)k_T8WP&n=g@FD(qW+QR{VUiM;L)!%&+V9sXF(_3Y2~iP_k`bxJ7Ezx#}>| zz*`oOHeFZP*MTLGFb)&A_tD<_*YSP9ASA4I25mldD$ILj*qD%yE}S8flAjF)SLOV!5hnoCq5@=y>$mt( z{;wxRM7+aSj=_|v)JEk`4a8@@I29izW0(xOec4X#OOjL^kV*4*puToCFMuzC1l4*I z%N+`c+Kr{HK2Paqnc+#t!@i|2`vY|;L?w5}a<+halX4G}&zvkh+aYqZ=h5j8|D%AQl+cnIT{wZxQPU1HytWqC zL=kVMsFg7D5r#V(h=lNZ-ebH01nSb(^Kjm`EQl&uPu@%(ZpmLgG8L`2=L4@z8gOJo zI9zdWtnU&Jq)Q2%7K%M1)|zBW`oW$!7*#@1o_vW?eu_}6A^Qm*4T+ii|;uEq1iHz91pCQ?y*9=R-f@cEAs#kfbPlAIMgk zLXHyjCr!2ra&`cZri@#I=^&m$R{Y2dt(hWZ!tg{6{K?qM9ghr4x^70GYtNsJU8`mC zREQ@2>?4A}3arCzzLSRFE;u|hz7=ZZ+q!5!?TlYZkSu)0#+!9BHd4=D>rz*1n`u#r83y6XD_3;3Qjc!cu5!H0F9dhdT;o-g( zWK*3HiusA+b=;xg{xC#HT%(2AagcZ)-?yFz-Da{TJ#$n02QlbdVU z41ba#TZT}K;(r7T`MQe;FPYTp%dP0{a`OQ%qM%9m)aew3ku)ewE!pH9 zB9V8|V%C-vmM_+~`Fx18w(HD>)D1w(j@hD-^VI>@VZ(!=c zO(At82S*(%7|76yO`4xtHY5&~99gsuKFxQ4-MhamC^7o&DKSFIvt5N=f|?`l5{$~@ zM$&L~*4!+#m8y+th_b94*y<{Oq~)3~DHXKBaaop>nCJGlAdWZ4pAv|`bo$lu(Hwhz z)71pH!|%U}Z2C%&8P(=Qm%^d32=S(;7jidX4g0rcKHuI>U<1g8rD!5S0mjjr0dXH= z`wTIpMLzewj+&MnHKLK58y;fN+Ks-3y^~Om zK&|e2s_W_bBGp}M!@WR`J5%@w8DtF0tMfPB_KMPiwG(|)oNWsj)W#+B6;$6>yjI76 zFHI5;%+?o|B)zSfQt&)X7KGw&A_p9{i&q5+RJ7M3_7ObiaBr0zw)Ht#40Mf3gnFD- z*YxCLGz)s)mZ5dR_|*yF@$Yx+(F?s3M{lQkC;qxInf>`h4iXrzN^2%x(c`yRETQ>K zfMDh}iXmO|P#d$ACohrtOBME>b|9PwctGsTP9PIx>8~%#?$3mNTk&}NF0>bZZ~`7i zP(nNDMa7xLaA3$8V9V;{;XEcPRQKw9QGuR>5A155jK%G;H9DT~)69(N+ z6DNDjqH1+98$x})!GEQ%4bM2_&yP2cjZ)rzb^1m81PJsg`_#p`gfaP}6jitcn~1S& zmx}AFj?0BbwVEOKSUA3DxFR$FxKl6(vEf|v*`7fLM4q^=a+RV|o2j{h`Rx-dhKI4Q zKg1?u!sFg^StyHf5@cmpzbF2}S<=Dpxi;#C`)MnOVs3|spw05IFJ;2W!>m{PYO@4; z#kE&(c8&4El5Uck1W#;f634T{#G@&txOHcGz*#MoJ4-+ZSDn3-n=2XIw&F%Ve!aS{CLC*u{37UhLA&>1v?7yS7Hmu} zs>2j59$7+iBWEI8V`-{-WPDgZ!{=E9G$lwsA7h1fGpsA`bDK#KSgxM z*AXe&Ahx&fMV%aT1Ns;4z6kgbq>nmsFilu|dH+kcJ*Bz76K=4wlLNraN-2$OIH+Z} z=iSFZ8ku(B}+StkV|1sSZk z_qZ2CeU+^8wdkL&SDq)? z;R8OJNu^48y>ncmk7NY)y4G<@N5&Y6S1L*(owtKa_GR~JX8M>%Czr zwnjAB=|0-tA~>^d=4o)*CcSBF2xw0~LSEi;XHj!0|bzf;8T@Z3Q>VSTbmYILIV@dD7 zKm>$>f$P3dAdXO*a7ZN)<}zuK7;yuw@u3!|u%r+DF}6+Z_mE*s@p5xCKaH?QMFnbv zM~ks`r}5KOb;==^l%&o<+tUz(&Jnk|yNnAkr#tU#YEWx*4dO?9YunIlKYRPWbEOJI zlUNNPhJpqd;a)Ml!^I2TbJ><`RsLw-E;NlBDE4Ll9v&?gE?AGw<_Y2?CsG{??R-2f zrEZnWx0EHgl$;aPv<14r4mpoqf1kDoA@+m zMvbu^w~*begV2&Ri;LTvM_u}ioq$h~S@C+@7n2x!$UJxU89nj%9{4Zat@%!%@Wd5Y zDe?nrt50(<0i-VJLn^zB^q`blL)&{|VznBV!}YqCv*7A=PJf#ve5V7AG|d{=#rox1 z=eUn@khtcPDzFg;MaEz$Tm(q%u~w3wiC97;erkliZC`@P zkIo5p8%^8mHBb71i&l#q9vgSolx-n|n~o|VmE8xajd!L|v~Nq6;+eM~XIeT59&`0K z8gm6B{8E`3sz}LAQSz$^q$)?Ll)Dnh^TRC-V&^ljmAJDQ+Z-pm7;;HW)lly9-U3vx zU$3^XSy_Tz;~a^LfFi1{Q;M?^Y+cK7BBv>>ABGxwx?$6gaGEfBTCyh-VB1f`;RkQ; zJq8<@rU+F(Helk86QQV@U9vd&r7qdZcxzeKl^U~NQD!4$j^mw<7zJ+zKZ^!0*in0H z3#e@yya~;Cpz5I#IHj<`-}Py}ZUxS7#R^gkOb1(@GzyOnTc6rMVRZGGb1Ifq$^#c& zaa(#`W%ug?qZWwpr(I;>(N6wK^|3p1dycRlra847HBY-z$eSx!6->Egl`*!;Q5df~ zCF4zz2OHlDvr&#TCi6ZuKt0$Fm5NmryYDehjH7~&uhhE zY}ydMr;YiSyxuq&O`g72tb9sO9C0L0kvtExe2|k(caz=kM|jO)(63-TA~mjU;E&TP zr$u2%w;}ZA)eo?PYkHrLQnUDsLHNtks1R1LzQuU!@M<)zR`(uR7nh1XAa*Ap6v>ZB zzWJ2o;-J_5uA={$BD~^b2Jqaxn-6tpOl)>E{c&x2bkU{JISvxKGi2e)9yLBl`eS3g zr%G8`6ST2W>K%q2CC0Ot-X2T}uh!?Q&7TXQxc3VpC|(sS=GLwkT6ro5)6z{|+|Ngb zAdCr|kf4^jgC6ei}kNgBTC{b+BaKDX%yI#K#^bJH1NYLRQ)^EF@BE*YLilTEE2$9b5Fa>`o7V5BsB7U6^Qd9-N(K z2A^rsYr78NB1D50Rs2P~i%7|g1b>OqCTlefWT{bC%xk#EOcEnCnvMJWs{_$iar!-V z=lesS8ne$<%{JVbHKRLFrm8w%wN$E;9WPy z|6GxRr`+DWxZ-x*NWu5s2(SJVGXX|$<9I38b|nR;xMBQ#h3}2@M~fj>?!U^JVg53x zz|QW}0JzPjgBU6B#5*+DQ}4iBP}<{1CFL%mFB+vVq<^c@&;otPB*jFu`IJM)?9(#} zRM5uI+&Ti|+el2$E&3wRWHaNe^5MpVPIH-I6Bm0xZh+8PGgTn3ROC+sj?4?11TuLJ zvG0`^5I;{jx%j`Y9Bge~1Y?0bRZc?ZN?EY_fegMYN9UyC5B`~wU7d-&jYsK>1=+m( zT}trNX2PEmY7IIl^_n*~wUyQkoDA0AMx2v3$SQSH2wan+%of|>BD{cjugPwN)xw_El#f@FMt=$p!XHguVrW=EAV(*6D`Ut1Z3MrY{tln{ohbkH^Y?c? z518Ja8vGuB|6ATteFz{yyx=Aul0OPqdBLte6fctWyVi;qOz(pQe)dLvDe(0sfXw6t zr+L%7WKdsf7k}4M{hh(!10#4-{WZTo?@IJ%1|-D?UUnr#{By;BcND@0ws9o{uX@3f h{d*z*+#<|>^wGu#Rs)D$qk>RDtk573mcZ}Y{|9O{j+Foa delta 28389 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 KqiY`jwEusXp{gqY diff --git a/docs/img/vis_overview.png b/docs/img/vis_overview.png index ea53362dde056ff701afa980594f3706e1793cb5..d2de2359ad74df648068623ba60fbffecd43db72 100644 GIT binary patch literal 64008 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

$yjCu6Q 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 XrM8|M{4^DcZ?&AX;>%*mH~#+tnUvxd literal 49562 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 V>_4#~vI3+(k&#doFBdiX@*f7Yf4cwx diff --git a/docs/index.html b/docs/index.html index bbaf818b..0fcc85ca 100644 --- a/docs/index.html +++ b/docs/index.html @@ -179,7 +179,7 @@ var timeline = new vis.Timeline(container, data, options);

License

- Copyright (C) 2010-2013 Almende B.V. + Copyright (C) 2010-2014 Almende B.V.

diff --git a/docs/timeline.html b/docs/timeline.html index c2335c60..eaaf2339 100644 --- a/docs/timeline.html +++ b/docs/timeline.html @@ -14,6 +14,16 @@

Timeline documentation

+

Overview

+

+ The Timeline is an interactive visualization chart to visualize data in time. + The data items can take place on a single date, or have a start and end date (a range). + You can freely move and zoom in the timeline by dragging and scrolling in the + Timeline. Items can be created, edited, and deleted in the timeline. + The time scale on the axis is adjusted automatically, and supports scales ranging + from milliseconds to years. +

+

Contents

-

Overview

-

- The Timeline is an interactive visualization chart to visualize data in time. - The data items can take place on a single date, or have a start and end date (a range). - You can freely move and zoom in the timeline by dragging and scrolling in the - Timeline. Items can be created, edited, and deleted in the timeline. - The time scale on the axis is adjusted automatically, and supports scales ranging - from milliseconds to years. -

-

Example

The following code shows how to create a Timeline and provide it with data. @@ -342,7 +343,7 @@ var options = { end - Date + Date | Number | String none The initial end date for the axis of the timeline. If not provided, the latest date present in the items set is taken as @@ -387,7 +388,7 @@ var options = { max - Date + Date | Number | String none Set a maximum Date for the visible range. It will not be possible to move beyond this maximum. @@ -404,7 +405,7 @@ var options = { min - Date + Date | Number | String none Set a minimum Date for the visible range. It will not be possible to move beyond this minimum. @@ -482,7 +483,7 @@ var options = { start - Date + Date | Number | String none The initial start date for the axis of the timeline. If not provided, the earliest date present in the events is taken as start date. @@ -544,12 +545,32 @@ var options = { Retrieve the custom time. Only applicable when the option showCustomTime is true. + setCustomTime(time) none Adjust the custom time bar. Only applicable when the option showCustomTime is true. time is a Date object. + + + getSelection() + ids + Get an array with the ids of the currently selected items. + + + + on(event, callback) + none + Create an event listener. The callback function is invoked every time the event is triggered. Avialable events: rangechange, rangechanged, select. The callback function is invoked as callback(properties), where properties is an object containing event specific properties. See section Events for more information. + + + + off(event, callback) + none + Remove an event listener created before via function on(event, callback). See section Events for more information. + + setGroups(groups) none @@ -560,6 +581,7 @@ var options = { must correspond with the id of the group. + setItems(items) none @@ -572,12 +594,107 @@ var options = { setOptions(options) none - Set or update options. It is possible to change any option - of the timeline at any time. You can for example switch orientation - on the fly. + Set or update options. It is possible to change any option of the timeline at any time. You can for example switch orientation on the fly. + + + + + setSelection([ids]) + none + Select or deselect items. Currently selected items will be unselected. + + + + + + +

Events

+

+ Timeline fires events when changing the visible window by dragging, or when + selecting items. +

+ +

+ Here an example on how to listen for a select event. +

+ +
+timeline.on('select', function (properties) {
+  alert('selected items: ' + properties.nodes);
+});
+
+ +

+ A listener can be removed via the function off: +

+ +
+function onSelect (properties) {
+  alert('selected items: ' + properties.nodes);
+}
+
+// add event listener
+timeline.on('select', onSelect);
+
+// do stuff...
+
+// remove event listener
+timeline.off('select', onSelect);
+
+ + +

+ The following events are available. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nameDescriptionProperties
rangechangeFired repeatedly when the user is dragging the timeline window. + +
    +
  • start (Number): timestamp of the current start of the window.
  • +
  • end (Number): timestamp of the current end of the window.
  • +
+
rangechangedFired once after the user has dragging the timeline window. + +
    +
  • start (Number): timestamp of the current start of the window.
  • +
  • end (Number): timestamp of the current end of the window.
  • +
selectFired after the user selects or deselects items by tapping or holding them. + Not fired when the method setSelectionis executed. + +
    +
  • items: an array with the ids of the selected items
  • +
+
diff --git a/download/vis.zip b/download/vis.zip index 687e8b81a0b7339e38cf01ba138e178b604a5700..be2fa4b4cb946f730738f41a96555c79c60451d4 100644 GIT binary patch delta 323359 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

7`xA>PxSa;Fu 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 z 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

ma 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%0A|8~z;; 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

V5ve&zBoKkSbGwabuwzqE`=37H~ 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 oMl2rJm_`D< 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 delta 243256 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

  • WHUOO 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

    I=wxCQhInRyc1+ATr}`| zp(0qxLsEsAw7^~S7ywF?i)!HrfG8Xujy_uw1{6NhaNb3%iKP1=R`~a(`hXc$11FF%CW-Ak?+IOWuF!RGkJ2Ax`#Nm4zUHZe~15AB(sewyUaIY z4>DY%L*m-p9$}qElI`Hv1k>mYPxh%jjPJ#vIdu-rvdPVy8BCOWr`6qW*~VqzTw@yn z(rX*vc8|K9uwy{fCk|1Ha^;l$bKo`Whz=E8X2F2%J`1~@e!t(*H4i0AWy#_8%QCqc z`vv@IvtWy_S`PMMf24kVbyYRo_ZAPFX-vy0c^GktwiiW&y0?myFHr4{^8QZEEug*9X|EuU_ud)eC}E0f#Paup$4lF!SY!cC zaV|zx5da>?f49guMgyjJifG6*5{q`3pp>IWOZFwc1>ztAdKIp7`g6knobo>-{wL;t z82UiqM`w`rXzN{BXfBreCeo7$+&jZR+(=YYz0jyA4 zmLXI;&&u`! zP!rU>jHU4Z-EI2+dffn4NRSY_w(M+os&} zO}UZiH1N8U^E=;<)ggYmA;7cZ+7E29*l?mN84G1zEDQaR5)~3Ssv_e z=MvO+hG?7E6Pf2ltdyJHp}Lfi!J0eSjGJ(Pj+|z`uMMKRA8yM(Unn7f0G!eK8<0- zf2g?Mg_)yvP$)du|myvB<~DbsreoAgQ;z(nnZU1oyLjafn^la_WMy$kJN z{7PtN>Tjoqxiyu<@vOB}sJ!pno8C!?Lc}D z+JTZOwBz3u>?LLAR8o&efa^KCXc^#z7~mB&eAPNY)OWt10baQ0V7}hI5tZJ$X>~8x z_$oab1<6h#r@$(Mue(P z&b!@j%G1$oZ$h0P8_p5d?uqQbFyE)l+{w{#^45|8k>mDa+FjR zZjaf?B=vS;=wQ3ujC#Y(IJG*%chYk-KpWoQp^??_R&|AmPX^uH!M4#lf8S=il`5^p z<8GE#76kFvzEB(A0}}wunX;Fj(5IpGBsEio%^hh|i$t>&#cP+Pc<^?SXqF<~1zCz) zB8x<`)E8Oe3x1e6H!|l2Kg=8wA<10&kcqNXEYD$MwVOr zWpZv6$8RIc(a7TqpnZMNH|~YNr15hGrYu6hFTe1CPn&Y zkYM(7lzegWlP@yBAORaU!;&;whbvc4%H&$u&fw1jkt=!ZiZ+w7`G+iE+CyQ;4R34T z7hhT%f;_VgE@tpIfAfO!T3h1TW@Cb6_qTS)Gh3Sz`DS~3YrL(!#;n%1DA#NWNdbRD z?;)qP9n3VFK|hlI{VUoVIYuZjTjBB+e?!NVw|-kv%Fr@7k^AuWP-?NdO)T+%IoCMyWdM)IZ92s>UIA9r`1>uE-+=zZP{ zI7Ibn4^}0kxY$?58K~8eoKjmOdZzRXZpqXo!S3@>%Iqz+YOmw5bX9$x+NjN)dGVXY zGzS(*b{jzDf4nC`uEj)$s5^&T&bZY6eepeCK%XJYaAaPm!p6xs4vH=}FC~fnHF7hD z!tb|k<{)>&P(emJ5kbUMa0Ds6%<%O~i!PCMgzri{F>O~nny)Fh%P#Oop>esHw}64i zB_?P@+|&N|=tuIY3e0it7^4W8T||z3#~67ScC%=(e{_JLA|GYvu00W_tbn-Y%Y1PY zJKK1cOeQNTc6H6JTNNPS944C{*Xi7K(6njLOp=GL5>mLC{nqOK=C0ej|{qvV_ufDr;5^pGR)9TDFa)I?|a#>D$DvRIvi{CiK z-SHkv1k^HRiJ%&|>dS)jr%ayKwTQXV(pPg0xo)p_J7; zbq`rEH@k`hoJ4t8R{%0Z2avjPmDbZ@Le4?5Jgc*028fqibCCLu-H;$t8cqE~=?`oy ztKNN1%ULqV)A&nfT2R+EP@wh9b6|hO^(&LQ8d2_XSCb;MF6PhiYOZVLmDmZivqz4> zf0|dNB*e`rDnQ`w?WK9P4x&InU;?9LCnbiq6RDYz3iOLxCayiZi1bgyi)?3ZAz?DZ z-Gjv|8gOci3<|*V1%kfd>=jXLi^qu7SS@u?YagOt?AT&*59A58?k}!aWOL$U^m8wJ z53DTRm1@?ARcua3xp=ziS{}Kw&ve~l7SE^Rmum)>1G0OT952|*(Nzb^=-ask$-fc`v~ z5<+9o?vP9rWi;r~LAX!S3Gu2%93{1t4UuTr*VwVEN9b)vNWZ-e*!pAs z>L^I|pHM1uFS7yX%)k@v^t&sR(8KV_Z_FY5w>?rP>FHNtWbqij-bu2#e-E3Z_+MVQ zKs@~aEl<%HfeAC1`A>t)S0SO9;|5QM>ft^vV4UcsZRBEGGc#ras)E5#8k42uN046jjR72B6f18Rf1|7@iXw)zg z%qjwPh|`f>T;yqmTEs>jrjL$zOe9+~@9R8jT$;)N!aB`YbRV-CWqaa2Xs_~u3Rt=t zu+F{qF&#j*F|Jk01z5~MX<{Q9Pr>+5XYUbWEvf02%!ON#e-i_XaC3L~7`FQer5(ZDfQ|;5JMRXx&Y_0o8e@ZfBrCqnT^*e^n`?F=yp4+AE!8JGaN|rn|A(-e1N2{8>wLc8~jB^HiX|8 z&w)Qyq16Ym?$h`MoZ76a10(9BcAU01wTGq-xJ{lnIWR)QO$O);{T9n4VaKIkvvBa6 za9#x$(fUZqIVw4rNVKHN~sl6 z8Y&?oaZkn+90%x0=}Wg%j7JXNH@yn*0ne#KN~vFf#4x2yPUzD!XHr6B$+u;#$vNO? zt##XRBY2U7ws_?ONKvG>(hw110ONL4+M8CaE^7p{CZt%F4ay|I0AvGx zW|J{?fBN-WgQBU3+dtY}aW2lW1Z{8I&jorp!21^W>ls6#_oiLjnY@T#L=-ejx*BaQ zDgaTmwkXlMiyEXSDzw5vKK8-fr|@U(FrFeXmgW&tLMtwSnuJ9oklNSc6z1+R7JmU` zXorL{9b0qTCNIaeVf4}lmCOT+!keQ(88eFpe`cP}>=LKi|Ge9jzR;{1|FXfJA~EyN z9nBV@l_m0bvG?e~2+nB0qrY+cB?^XkYa3JO*4uixH;w!oBmbtQx5i78ZHBhH9pt@7 zJAVx&HW{hW)ZI+mgaN|8iPB!C&A=+}`7p?JkH+olgW??Jbul9Y zf4-|gK*-r#&@)oM;7j0e(0yWDC!^NuoSXawV*hEG?-h&w6U4z%5eGyFImAI?5C@4Q z4ibYn5Q%$9~l%$})Lq!vb7Ax}Z{*(? z`8-mlpW5R#tMdAok)g4MzRU$|1-MX>J7QW5v>Z2HJoJ*efH_^zC8Myw6}x1ge`Vk) zaxHXiJcVhAy#7S@Wr`*&u?D(8cLouOM_+Ed6Kb=`)P+bDtZ?+`9>YIWD}I zgAZaQ=8!wVF$Zy{Ew3(33u0k0e+=g!2r9hXi!K0k8g3`y&U7@{8;&ROFdC4#@FX7a z(~M^PlkI{G`6p0$7N7Sj0PsbxY-;n)wrAb>Hkz!zbA~bakVX z(q?1+Comp-#0Vtq)SEg;)rf8#lRg9w%WaWiyiGIgtClS29Kxzv$lwHBf3a#;D+~Q% zvL>W1-Ay^8GfyUyEWg}CCwe7rXU|Lq-ut=vO@*uiBMuFGy+=hivzx6bRzlUwoMsER z*}`s?8M86s%oidCy_<<|j%7>U=d8*;WwWfli97UrmUe^=Ef(eB4eTv-L*=Y&6ADk# zyt8D@5TX3$oTW)AkEsyhf4)Ye@pvHX^bZbS?*IJeeS9L#p*sJ2_xoor4!`S|#!#LA z{oS({yDwjKJXTyS6%KX}pS*n8fitZOzI?g=WH4|FzJ&i^qOaxF3j2?omiGty!$!gH zpB?^n*wV7M!pr@a-w*AU9}oAx8$5LiKKuS~__(EIZ-xEg;frTaf9;kJhr8dsbcb;G z{j-CYkNqusE4&)@Hc z<(3LB_MbYd@pyN4@bY`7;M2pWhc6FW*4bC#yYIjI9xB+daqwjS*|X*l1~0yEfen9! zgWBrbe~{%s6aQvBS#HyLGMnMX zE5k=#%?XH=qa%P9vS>3LmCUI<^|5N(_VB^1+MW@Q|76&Xt2(qEMQ*o`QLp82wzl+d z{<4HSR+T_%8QbyJo-0KUa^-+%^ExSrdXXUsL`VQLI*jEJ9NXbeHAIl+jWnyLX^F1E z;pVL27nyIOe|KCXZJuP1L49;Kl6FwrI0aW0(q2eixAfhx*8TyCG zQCm}x%l}h3mu z6#kHoVa_JSu}qRw0fj?BBE;DmUtBhi6PNWg7i|4pf2lyI)J9Fc6E)(%o`RWa)gak= z^2tzFQ7KlobOv1+aTN#~ic}eP!WVf}h#|;3Xf0geoTR71$u|B3VpI*u^pK-=OUiU( z;itP&{CG?ITK&TOWKL1Lsd(7m1$NG=q2_H$_WeDY$}&7fDp!clhU$n;b`(h5rfr3i zMw+>!e@3RET;gqzE1TE}Elo8PPrMD9iYUJ1kbLOK19+=K_R18ww`%|qS6(0>l0V_t ziu#VGi@n=kw>d_Z9Ha;rYQ^EH%^;#J5kxZ`ZBJf^*{K=yjmM=XFZdF5ab-|Lj-U^^ zfv4V=NnXtoj!(QCr_|MKGO1crirv9glLkWve{G%BWp;VlZ~*Y3FVcC)Rq`-x*W=OL z%!`ejwaeA#alS+tVO%YWHp=mFI12s68gWS*CCo6=T4;$uk5`Acw-!jnNhXz;9wmD? z(YcgWbjlPr;Ipp~jJKrtz>=}Fx+4E^twZD4&gdv@y%Ct9nHx=nY_r*{h{2YAsU@A; ze>S#**MGx64q_nu_`oP89VXKd^ZmlFC3>UPIYKHBcZLIE@eN^2M+8H^DHi3%Cm>8J zpeZIrS`q0`E#~v0tT(XehFBfX;#l+MKKacki<2_BRP^IK%g?9kYnohL0j$4iE*HC< zm+5Di`k7SQ+8oFbb-WgkazUp~=IBV}f2_#gC-eTNET53y2e;Ui)`QBuf}iaLX?UXK zkNCU2Xk9E+(f9bfy(q2#kKx9PAHer9#c*3$#VEbHAVz%CWe@We6TB)GReC*5)0wDo zgbBZ3LVKlycSlt0_#DIKJ)k1>Mge<`I!7o`M$g{t%E$yga_8sFN64YaV5ctmom2o5e@jQVI!WkFLfOMs$}!=><)&HyBqZ z@}oCA6%i-h@&Aa@X6LO`zre!zy-a`Y2?`vF?|-U_*`iJ{5VsG}+=x0KJayg|b5E6} zGbRDiP0kIWtv?sTRjVP!kGFAJf5EU(q6pQ2AQ+rV$sJY16J@yIq3?c$7ol#9-;3@p z8;7PP{v!4;lGHLH>624b@zB?`?!vsoLlJ`I^~B!YeOOvKQyIyF3J8r&QR$S&0lGCk zd<3D;n>piy;kT@=B40)|id2L4hL+%jOr~foiViH_?kScF!>lN0U!t6ze^>JU4dY%- zFoAxs8~H8Vsf=U}dQ_6BzRiw}!8=~0AYD5%K zW@}4v2Es#k+W*qa<#xdmpvB0Ik#aLy74LxW3;>UGONj5yu;2#ffR8Wl3+{lH&`6hD zs4E|ZP~*m|@d0bx7&UIfe{K66DWO;- zOE-}cn49PV=z-P?VNEDBaX}hNm{h?mbD?x?pYrU~*z!0aLhBt$KoPj=hV)D&d#kzZ^~IA*$3;DlcQ0DHp$eGLbe zzDD!H0y<;|=o8dsf2hz3>`NDpFnPz9DL0UEqn)rhJZBp_i%L6BZXLT}0?5aO^hPwlxPEdnC`L**1BktZ3%}5oF@7p-Lq<07HA^`E}&Jbfb zpu{TQiHE%$&c=2;?B+r(b-#a+{GR^6H(W5=A@k5Wl>$4tf3*T4q#=)YjM);13eMOZ zaK6Sv>DW}VXO;bf%$kFA&c?i$FXnG4&aNPVr|J3cud+${BjyB|33$wU3&=&`<7sg% z3ongU-)BJcZ*9?2&ui@Rb21B@Y{UNb`vnlyIhvWPEmg&01WWi)Eb5?Qj|PJVHnd05 zTp(BqPRo1ge}5$Jy&M3i_`P)m6X2`1lz3FFuK74&=P1Ab3h$1T{Eg&U9K|(OQ|5%t$EtkuC#wZjDNPwuvSl}3owlOAgA;y?!`x~tYoLB=+ z)*EnQ4%i)NBWW|vWk6^muBSYU0z%U-dK`KOU!0W;f0;-(bzyMFdykN|>pijxkXHCq z_h!t;CHTD;mdE)U9iVfX6L&`#?(Z zmO9`k8DmPzxVe?}j(c~fUvmqrAO$Wq=_w$)e+ZYW;Ey9Dg28Ewp(UKr%fJ&!I8tN< z-^1jzuXfO>MC@>a6c~V+d=swZfoyJD<(E~hVJoM{1DDy!sU0aH4O3sFg!Cjo^vrR4g+0mRfgs(Aw)HBKrM-MB5^LeqHD zxtBS#NfWG$M}9H@6>t0$I73VX!=&aIAQc7e7pO(^Eyi4233<8Tr4;w%pl^zR;@w9b z^%f9P8@4q;Pp?`n-p!=+XqykCgH7UUm-fPV(O`wdMg6Wl=2Oq7{R2~f05x# zqGWbpp>mg=q~$?Gk%z?1JGi0>^-7oVNe;KxDX!kA7E4ybDvC3n0RY_c~UO`&?iOJ^t3Q*}v*X(UaAVS8E8-m;BHJy10Tc_E;R4PEMHtXCi=tZ!k8tSZFy zNKr(Mkj8FV#9Jk^6Y0Uc4pkuU+Q4z|VelNqb*MemQNlXMX>Em}_w<6N1W2HLB?Huj z-egss=4n|m13WSmwFBN>e5%gN>=W7=*Gj5N)zssn>dDd%Te~OZFO2Eye;!ln(G=0> zQh@DVPw+*ZQv|SPoMw@j+r`lh94>3vNK&H3Hk^2y5;AODNODXl?JH@)kAS77e6AK} z>K!_IIr>3gsdeRe~AliUpPf$^&6Rj z_JvbRm`d_yDWDP@Cf6IYf8&E`&kM!`{I}(b#kOfMdr^hUCAATi8RN8s&Bzg>rYGeo zEI>wEP==#oT-ctHg2Y|)C@91}%~h#&H;iF_als0`M~xQ-876h@1#Ad7xl+j5>()-4 z^9y`5fwNGj8|aN{ouL^=XYC~*=pKSrRfRRssxE7wRh9T>f1y>U7e891LJvo) zR865()zd1p+TIhPRXzPxXjPYLqE!wWc^fo0v1$_l9DwCSWaf0e{y`rVTU&+Y9caV} zC3XDic;fcF5a-@Kz)SnAt_|P3#J_ZgauOJO6epXEgT!`)lsKrZXrL!06{KgdL@Y(& zT?zx%aMhBpUK@_Cf7V```_L8o*aJ*8Le0j~UH}7;{S%`#;kfaH%6ylSmeJNN!U2>3 z0IyM>ilYpSyDpz0kI;y`SStm}3^~ADdt_p{bhX5Cy`e7K=T6ltq!*H$T>Q{-=9=qv zw#b<);=Ywvra&t$6ALHXjpH~QSCNuqRcHa4>&#qbCSM>ke-EwTl5uAEWXeNhXr6Ix zZPADVcmTFux^~D6zu*%$|KwXe@I=+hsa;7lHEvuvFS;M;viYx zGw%B-Y1K!@hm5pnyMlg7x-{m4A*QGSxFgW!KYsaUfK&z0H7Oe?45wLBxCj20&WiJ_ zzJb-<9F8^t%?p93Q7ZZJx=u^lyGp!50VvJR7l_y>x|e24%)o6@nFpHYnKDcnGT>;I zC`Qpgk7u_S?%nyt9ztVJG+`pSl~7;+Q@{< zc!6XB>`Cvkk74Mp;O~umMdA)iP+3Mg6+v!454YzsY#{Rb^nIy=?~y(VX_J3;x6w8k zVmI+n+lOAakM>%O_6$aQtxwjc_8Ol=jYFvMe+lPz*#FWyqZuCdZ{QcYE!2J%((SaH zZD*lp;z>NjknWTW%v%stJD+>Qa2x$j*^81mi;}Q29au2vm8@5U?9fP}by}*On&C`l zZ9DZop5actHxFEp#_zdbnD^2tOvY1gWD0s=k@l@txce1To>>&@Wupmk?MNLNgyG0d|~y(tL;FDveB)mjhS3L&_a`y=>^a#)1Tn9 z?+nvNY}Me}M`rfcz|)nhCM_j-oFS2}u^xcYM#coZ*mPtvJPz)w!=*a_r7B#LVvw;* zBb^*yXZfVK?i>0*#+*`7NH7tpRGVd~e@QF5OKxdqw9wQQ`onOE^qMO;1!7DdMW@=( zaWaP%E@}0Cif>UFKiX%c{#8XE7?R^?QIVF>f(gk^RMM}%W$ATPFybVlDT7Pz{P!qf zxDL22k^I39v9a$LRaCL_;%Z*x)b?#wr&sU?uCc4=n&F@Ci!ad`{UYtK=o9_se;phy zVJxC@G-E#|c{+>c?5Cor`R@xVjKjO3G3nIA0B^)>9e4&bO@i3nW z%eJ#m=`{JA6=ie_>t1qdIqKv9_Z>#+()-klm4t2#0QJZ;v{Hg;{ZK zRWq5tlCCqzyfx~Sm!A^if0*IFA-dqG`mgqn&whOO`tAF}pJ+jj;~a)}nE)dz75NWy zH2j|2-RYdG>PIV2H1z)6&o5qyW;!rP96L8UL#YK6I(qm0>orCK!6iN`G_s^1bxgYNr4EW87KH z?X;g>|L_V5lO`wTh}GpYh`BwQnNIVFr7fRM|M3upGEZqFe8|V|_kV(xg&Cg-{n+g1 zv|~bb+#!=Z4f4vae-qN?v&ChWSA6;c(1%O|a;x^Zim5Gc>XaMG$(Qkz!-JAH3eOI( zWq9#G{uhAUN#K0aFywg&#Tl|1=zGr)Vi4XCW(#fR?|Gr`MVY`H<{E7_u|{og05eIu zOwQOwX0$~I^l3h0ER7}BmwkK-$K76VMT4R51s;NBql5JAe_)h9R}3?X$j#Z|Lk?kO z`RWm5C^=8jU!AFkzhuS5#h=ro5N)s3snAV}e6Xd#R9YQ>CYxjW(?RVI^#9HiYX;DT z4%sq!Q^cwDX2Zv(4Iw#*!2RSBUD2e2ilf3`|4p++@AV7*Y6kONkHi$uNFX<8R=itDs|fdMz^fqru$ zQ0)%kww>_qZZipQ1C>mu4U<)hxLFX^3#wFu!fdT``(9_2Z$p;!c zdA-4Hf5u=h{>fY8fF)XE`XP-ba6y?l6@gew$y^Yv;5-y!@*8!l70Y% z8M#!z_@rad7mR=KTaf>Ti)Dj;oFlrObxtF*#s+~Jzv*?|4Z~X8+X^oLSN^GUVyr9T zG_FquZ6$EmvB0pc0BjEC@16p018gUDj)&Zbe|*+kL)8QE0B&o7$J;vC?SEifoURa<6;(Pc9e}E7C3|! zbR3eeOD8>Kx7;2nlJ^3>Nl{9Gew~S@O|IsV65@v3#^Q?JmiY8Dd4b3k%sE4i1Bp^5 ze-IOWm8>eyX{=GkY_qG#39Zz^p$ zUxoduK&edA#+Ou1=#4^`Mq7a;d84zie_`Zh|7shx(<;e^fVhr;)X+yOPG#Qf3A2ix z7&)ggoC<3qX30=oIZLJ>-x(QR$f`Namr}!_(AK?ODh2!#=Wv|HR?QebkB-&p1SG|a z-Q79G8fWjsIn?(zOvP3-O!-#Bz#rY;EEHPNDC9EKEg(SSH%$|IPdWy*vH|V$f3E|6 zb%;E=JXGEhzd%IZV!k1Mi91A<`+2T^zYw?7lF?<_ID7_J(V-#a72k3W%Er05rX(va z#I1og-yuF#LAryMarkJjk}{seo7yKIVWCC|3AZoZ8=GE(871Y9Y+G8qZw{8-^TRD*`CKmE!FPP~iEZB%Dj^e-%<>84$Ys3zvGH zP9o&Cv^dFGX8sz+8XDOYZ z6XBMIg3UX(xf1!rCVJf3+B63QqZI-g>doL<_4|R;mf#Kaal}$w#|+z8^{C*}k}T~q z!mWrk6nw!f`#3kee-<}~XuLj6^2sbMIiFp!nl(le##mMo!v-BI4a7~6kXi$4N&0GW zV^SGYY=gs_Z`O{Cp*NKDyU{O0-_m}{o6`&epj`2*@}$fM720s3qkk$$0{r1@nziqq zozp-z`d|Eb2kw+M2f@l7I;8xRK5fYj!(9k0r=_0wYPk ze~k+M<3p6N&!U-MqbUX&5nmtR>xN0q6qC=@x0DzglVc7=FchP(xLukhCyJi1nih$^ z8l;kDmgY`if7Ax)od{Ve??j`xyeIuN41AU@$z61uJ z^f$^K8;=*V36yeUU=VJ}9gDwrcK}L2wZEuSVdE)IzJ^XJ@ue+yKQ;9{<$uS$VI-3F zWYREF-Y8{*bkoR>SpUSS8aaJ(AoVLuMFvxFATbLLTj;C6FH_gSucX0e zi1^jt7SdMAY@V-1Og1xk~dPhn}6nZLdF?zG-q^du$5@{$$-gJg)N3WEty>>H&wI=EffoUo`p13X4g#3 zgaS(RXfRl|fB|XJ`>#6v0Hk+EUR!|Ng`1DQ!h^=*HfDs^hi4PqISLMTgqj<;Trv7J zBtS56f2OZ$o%&q2+FSv0S1_K&sfSs&8+=A_ z@AeMbhw6@Ol$SXOHtOzdEfre3X5gQYd6K&b3gSleEI0YB6syhM?DEBaVlFmj zoLyzPb$>W{qO}2(^a)1!``NT8vp>*>?F?ymBjdB={bVww*2P(ZT2xk|)#L6H^=`{q zk=Ctk1GY_#t7Y(Z*`9R4;#)tiy&!K)RRx(EVX1>Oy#X`s!rTKgZt*Z&^R8-)r}akQ zh|7Zz+xz>7fE!z;`^0QPCu`Z3007%ha2eRt6aaH97#fre*|x1=_D#-6)Ld98EuU8)DI zTYrETyi&A}Oi*{%6O#avxdghLB|#enJ6*9KW(L1|`Qk(<;r>4vCAvuO`L4ok21VhW zn{O-GpN9|~f%C9eOA9+o)GW7vluNSbzCo)U+}g@p3#fM1$DIGVvz+hUH%yBUp~RH> z$XaWP6)=fO5j?;`9wMMPzb$3bn2+Jqu~6f~Qis0a3yr$u2_ix~aAL$95JUZ1soI>1;nP3p9d)vvgUV1LnG z@pu}QSJA!CmD!0?qF?>wYNEe@|EAgHSUf{kh@S ztFpkteEkM7elCo}D(+6Y!}QViwEHxDyq$C(Jx!l%7t&$} zZjrcKcAsqvM+#>&Hb~36!`bP0`-uMSuUCypZWp}yPXcci|?WCt-Qq3QJBY_L8qHb1*vMBjXPaHI*$`@UAd6 zmzwNcuYc!+qbctD<`fW5EHr7fWtH4^aXyWPE<6pP0@!-(I9__l!hcpZeP!vwNqbGp zv#EUGRrZOT7!t2PI=2vUNKrFeYD@%ZL41MuL2^OqsI{fU1-mmYU_-=`-j{81r8jpOmz za=wY$N8~cK#g7G@>wh%9M9ph*kWQi9=zT_+9_Y4jjJA_fu19P*E)xP@eH8dfSmJGynjmSt^k~XYwvW>_xEBp z+l-Y%+XVgm;2I;Oq{5xzMEH#j3cZjM<4U^L!{}llb7^8K-AAA|uRN<$9)k~VAwW)J z1G%LF)e+u9r`DNn`>bIxg@+@+fBHYae}TE(Asd9GXbB0FYn;nZ27*0=-{VJ5pGJ?K zKG7u(O-+Vx9)ANApz!CL;Q&WJfRp*n;{n3PKv#LMCOiTR2Z*b;OTcqBzfb|(2oy2* zWRade$9BZ;z2R`YNF(~3LDo=Y!S6koE&e=5Pp_hQIG%~ZbE6&jy|?>lJQrCPMi%_u zd-C1*LS$VTSyw#kN@QIcS@3)ByYIdmU#37&Gd`6wIe(XfpTC5+L21 zrTnzV!ipap?M-FENZNo_& zW9Wyl|3{JIWA0f&mp9OkVZ<|L1xkwyPHZF))tyckNP=@xI*038-eEJD043aHTUo ze&lJo)z>z?AR9hRL&NKK)6q843I7gc4uAYT9m^ll8zLaoji;}0sVUS^zPwdaWjDr3 z1}*neR2yTuu)~4NIl@obbZH=?-`%Hteh!0h3?1#GmqEcThU_1la0=*e{F<&#`i&42 z$#N2%xHsdzV3y=}X6y(?G0!g#xN8MiLr$VDIkWMEX8k@TsXK*-M_ywOuT4m-(|-z! zk3!V&m0R_mylmN3Sl)|=qbAMwqpbs&N;Ef;Z!BDp*g1gzbRtpz$CLz6oe%JzPDDR{ zfd7b}m+&7|G#`IRqXVP7s`0_8ZB{qyzf7YeQUACTQPe4s_q$AX()U&Rv1rpAd_Mj$ zjlPH?M@L7Z$dUdznW!JeuZe2moqwpDh|GPJ^A>UIECd!UEwf3MUj2v>i+Sl^RjJn^ z)>Hg=^-BDhPQ{O_EAgYM#E`*R@Y+SZ2o0cuhhGo0rZz}#C8r}R(-AGxY)LW)Y=BM=X@PErZ_}d~u957P(HI4GdYi)GBDHonyE@h;rR8yu0Y@K-qQ6j4 zK+9-^e+o#w8$2Cs=cpCjy#{o(tI!oN_vj+6LAg! z`Kb!&QDg{1K=p>$w*j+x{C^h12Ljk}!2rP=MQo$C@-c5IkFo|?6sKmx2L>>is+Vs*n+Al#rO|SbzU8ejQ`AOR9!a zyr47ace>6({z}uE#EMJ9k`y8R<*Z0*cil~71NDFo1*#B@|KX$l<0}5(4Dh;v5e&>= z9sO2x=^k{vqqz1qX?Bln^u*D=jk}C%L0l158@pWc05iD8gLO^HbNB;kQ%jEflSQgD zT%(-`y<=EUPVD9JAAj6YnK z^VleGjRmkD)#BFHfcz;h)vC=PLwEWDl)Y+BP+KkhP z*KsRYrA1Lan4g89CE;AO)-Q*GI|RPI1x;$ zS-YDl0e|EB7kd3Y7KxOELxU%HiqMZAj;lbPZPgbthT{D2Om$u zJN$DBe@=pv|NMCR@#J(n{CJ9~{Sdfo+eQ%qNPqK)cXt_}^}D-jX>|5?e`hDXkI>%h6Z2s&*#d}ky%oUgM0N^GOGT0f&XK{jS zZWv~?Mz&!kFr;bBEjvPXjKnH1P8ZZG`bPN~Q@(HsHZb{VbI%zh4+q<6n^=wUoa($N z(|@>R0Y{ave)(R>UCETl0sxJK&zP{ZrWo}H)9pB&*gXCTAJ5ZsjC#r=ACm`7z9bbo zJ%I^59;JJ5SbIGRq=e!O#1R+qAHZq=kI{v+r@(2Trx;;}BqbV;1$u{iKch?mcnsMc zZ=)OY^uei&7p3_b4wO&?h`f*?Y7$-xt$&@#j0t{kJ|DsKviMp|4~W2&yq#N>qs;ye zx*6F7~ zWe`7A*3MNXxZgb+U?61*K%kI5Kw+X={uOFW-lb)p|IuV3Iq58%$YlAOg>s|>UxGyT>yY4%W9JfHRM14?!h(a0u%jI zU`XLBSaYQ1Ha7uLqlZDT+ZMH7AOr#Ge)YEbwQ!v-=ot82DN2 zJbL;B{l7kbvX^gdodEa5@MRPo3x8Gkebs?4$mAba9af3l5)-DFySux`Kc*d4irfMd zCY1YRPkc=}tl*9Dgd@y;1fTrtsKfYx2BByq!Sov}1%GZjEKy>_De(Vs%BClePUCuS z06!iBp~wDR00^MAsj*srX$S&(DSFh#fY!-Ppth#mqsPZy{0x?__iV4^7=Q2?D&BEP zJ%)gRX<_8(TZ9VZH80n+a1ic59i+aZoQSZ%q}=|^+;tMKB0Hpk9hDxQqM*6k=?#YP zzm9(KGX|RprXd?=5k`8gdPz4(_VV$wi1zu}b^v$}nEb3)h263{WVbY;Vs9|6qq;X_ zYP^(IM4y5hD-_09>$HKa5P#cA$&2>7Y3MEiR^Hme$1ou$*U{4HJ-HwOJIYV zXiU8F#3@j3A*zbag-`_`IVDHGSLB`yv0N;zab2W_+++x-6Qf^`@v4mwH%H&oxS&{K z6S!$Ah0*;B45S!~A6+;Qr`D^8cJe1*cRKJ7>X(cR8~~U>M87?oz<;4i>rOZ8lDL{R zlsHgPixhprNY%JhHB8XSQciR9CkyWKTnx6U1E#fz@KHs#kn4GxZFG_f$YW1K6O0|e_ZMIMCQA2uz&VYkssaWT_B`qxRB(~B!y>}Fcf**`x| zs|vtng9E_^hG1G;PJiKVx^X!xJ|(jaAUo#iMpkW1Qh=RvdO_Ss^2x?EFgO^flsn^_ zplU^uZ!G5LvG+uG07kyG-M!?0<8LT3|QOlHaGU;Xl_` zB4yWUyz`$QcgA=uJ_fF-~{zwEF> z8vF^+@j%5RQGXwN{0Q}qio2tuG5+`Nptw6Ypnt~r-@D0VGM>PnVtjXfQrumij_-bf zzrVm=F44Tx|H40amzTliT|@xOO7s(*)NkD=_x$;Sz-?iczAIgge* z>_C1zhL0ooIO%@uosKE#DI~q1{O%5Whk39>r`sprCcQsCE(U}BK@a{sdHE9leKx?4 zgJ<~h@;mx?dGG>14qnp7%fpwaU0_xggQt``cnU>#fNK6&ZIA8b({2d8?=As`-a@ax zK`k5<4u3xy5s8kfyJM~)3Ex^>vLhef?|>Wn8z3(;Ga9mE`73?IL_5*b z^nWpZ|s8e8z z#Lp|t!X5zqqW$)w1OhW6{Wf-he=+Ae;_7egm#71*?Z0U(F7F^sEQz% zIxOY&sIfy;l|C;oc^)tL!w)K#5|-?H7=JeuEG~!~GaH3+qEWj=k#39-KY4ZClPJZL z?Joa8x5%%!jRyxC*BifV9BmwIOgg6b)ZZW%Q(tXNH?B4+EM?{YJ8q`OX`Kibz?D^p zOLla0sRxP0fm&=xdjh1Oj zfC5^J8t2p)2VN8R?35hJ4=rVV?SIo~(p3`_;C^^d=b~8BR!kmOp@_kUf*4puF5#FN zKY`I*vi(1$C3NZhs;wnaY00Mdl=x=2dv`b7U9ziIY$v;1GLIuf5qXVYbXextQ|4L( zSut+MAl!ld$MU`ki=eGaNFa0EQp;0^J>umbR^hkindFYtNUaeMC7eg44u8Ezx|&b| z(@|LuPbbWPgiyO7o?M=QPhT{F-~QYV?8g6S+a_##|I;TrN`I^@^)|VpE9KX=LW?~6 zf(8Dgt-wDPNs0b*(Rl1XkWS>+8M%5>7b1K~yl(t-v*4ELoQ{4?m6l|Y#=oNf&UrwO zK}Fi_6rIz!4Cvz&*io(*IDh)hs`Hy&2TI13tg_2%{CnC*B@;@=UjPii1sB@HgWXzw zI1N(+!-9cFJ@*;ArR1lNOq59cand>Kbn$D+gt1N3`L`s8wYxccnSLti$5B$APtW$} zWj2G~H)sF0$W!=dc5}ABxLj2A*>O6rQkS&PoBeF{Up*T#WgWe?n71>C%YIK>l9_Ao&W4~H91%X87hc%J9l<6 zr*tTf`5HHM&T_49)_*5;Gp=pstta&{m2Eg|kvuO^=XjCBk2ByX@Xz~2TH)Vc(n-#L zy`KW|#~&}@rhz}l2{eM#x4BWOxz=5hB~FBB`P3MMfD{-B4g<%4{bSGADfZ~?>>jwV ziut+)T!EcJpU@@r2pvLy(4Dt8EPZcZP{`=XdLFqK2CdQx3V*Fs1&7aEFtmzkK;%F; zJPm0~sRfIQN_L^qro7v7k)AhU)g8h5(CXIo!K>gUBKpG(7iwHkLy5G>kHsw)xH(-Ciuv zfIq?rSlJ- z%%bRLwRMrIaiv;_Dt#Kh!2n;#;p4izWlX04VRdR zn=!iO+LMqTJ%u#GbR_BsaC2aKd!)sZVY7)1JSh} ziGLi#QW)Rz0RYeAi?LmDjp&+}k}r+EaA{meB(7OO@7d}p9v^xSL_IWSElJp0JI48w zs20ZgN0dj0b{RE{itBMuq6jn{mt-j&l@^N|*I^VC@tM%WfjfB&bOo@LsL60LJVn2v zLm1`l4MI$G9Tccp8g6HRYVc#uKd$KGf`5Nh^l>F}_}3+UEvd6lx-&8rc6;*%?%vum zl*|od3 zz|=vCR%Z-9G;{GhAyDJG3ZGN5=*Ebye0`Xtdx+w4a7N;st?{4O|J^c(%zbT zD@*~sr}2Mio19UBrt70#uSmn2;D0|zBEaPV&~T2MgK^z|&a=AmHGZjv%<-bvjGyob z>MXj76O(`x2+?*h^%(?{!XGtHr{T9EPg{^s9qJ+^$LGEQ;=~kRoCD41!|Yg}JJAvT zOqyl7LeGLcy$BvfoA)jm;zv)*hDQLdV1XK2OD26~wB0f^P@qgnC`xeK=YKb4fW+Sh zk@teWm+yibCqEp$KmF~u4mH2>3ghD*YaJR(B?YU$K7Q96AeYq1wc>Y!lF~h|h0Gqo zod0?re}~rhX#8nBl%BjlHQzo@emjLjsmiP>g##l$CjK`AF_aV8JyWt1CY`SccPSOm zRN~}X%Wx^(l!%^Epa_IV&wp}$kzfM{@c8}lG`m1^{I+FJ#zL|#j9<~xSmdz4R5KC> zM&xnZaq$~j7g~cL4EF})@(aNpcIxFUx%A1XwR3woUpQ2Ly7qlxsbn!_^$&1epRbaY z64OLh?e~;o#sp;`h9&cme;jB0E}pvX?%bQgilHfA4Kyi#O1 zc4d@#DhlaWs!}(mynmj;Ddb4d@ITWFO3W;qIbpa1lkR!u+18dU5R^tyPs?(humim~ zNK5aa-2#wwJmyBPgjq`+1X{8jvAfbm5J@mVp_3pIQ1yW;Cx~_K72ytPK?n^6Bl+pz z@n0bw==W?~MdtzHnv2p2lxkdK1_;rn0lXmD$&ZP7U^v0ipMNf{k{qu0U^5jhzb&p? z`991KO2VU|Ph23e@sTKGZv)PlUUc=ySch}v+~}+KbT1uuq)eg{^@jK@MHroEAU_YF zrD!M%)7LJ33E@d6dM3YkMct-_I|RZomqpGg;NICnLhWzTWKPPnO$>Kvg1o#3R${{N zxpl$wvoMfAcYk+xPst~;(mdb1sCvt+=d+$Nd#v6kH|?oXG}o@hF2yW*fK&ydA|gw>DJ&aW&T0l1lT~rHPKkK{tx4u<_HR z+Mi{Y0QaZ|%D2D|9kuC8D~txrqVh=LgB;i~16g~faAxV9nUpBMLWNyS6TBvA5Hx8? zB7b5$G$vv2P|$HlqK@dC$FiQgd1* zb-7r(sLy*fug#A;Hj~O@j`MGcs)iHj z)yXKaUqq^JC^}mV+$FasP5SDw1hwi?$l=O%i6kB46f-i&NJRz_n{oEd?qf6=KMyi) zcq&%-n@0myU~-8zpV$sx(n(@2?n#x4G_A*^kDniQi{Ss!WAZXW)CLla*0j+AHYa#+Dw$!`5Hp72Y-yLw_;>H z@5p-hjcgs{XX6pF0ws-Szv`D!lUq`1C?j4ke=bLXz1zO-X^c?Qz@W3d3%b59C(p*1jgyvCI^pLHBUt{_(v#@L+S(m~djJcW>FR}%-htSyPk%W>&`jS95hV@gF+iR1aR(&`LlPFKiL_*qeBDC+|tTx6GM(#n6~Q;7cE&x;?(z83=#54N_TS5GDq z61ecoFv5LVhB~|ikAH=M|1fl)K{{ij{})h80|XQR000O8aD*;Iee6R=({%v=zTE}@ z3jiDdWNCABFLr5jE^2dCR0#kBLs`{QLs`{Qb$AN^0R-p+000E&0{{T*T>Ep|HuC@7 ze+8nOvB+4aq&!>e)SluvSKl|WGqKaAiNQxPOlR_wPOc5TNKs9(~MB z)lMwou~_VWcCib9Y~R1XA?}OwC=cG}_-$4ci+rcuo<_xNISfYWydB1KnT%x{8bJ$e zG!WyBx!-CG>)PYh@TaWbbnZc&^CnDi%X=IPV9yvEELmf zHWwEcK}gI7X*O*undI%4`@4GwM|;~3NQ~IwZ4%2o7n%I;GRk1G!%Gn^fT2-11UBRF zLZq1prJ(#uK03;SBqA@rU`$rA& zY;d%H)IbtH?H~Ve`1Tly{WN&xCE`{4D-&|KNE` zNRSqcBR?!MoB^;Ip(N!v5J!_O&ozI$y>V}{Oh(wqlm1mS@fzvyy&M&de!sX}NKh1T zm}W)p&(rZTmVx@&m!98~F-iyeXc}d&v7AJS+}z~9K{y}#{1t|weplyVCMLZGa)#yO z#y#ElB1*>T#rKmwf7z*PGmX<>7(*NWQrjk%@nmz;oAmLE-J-(MnpGe`QK?FKsPJZugRt^pw99^bP5TniU1me!mpe=B6s_ zVV~vZX6UN{Lm+yu<70WG%OX`)%)s%8L|%x!EK4)5u^T2}qF|Pwapqq%8(ZmCquKCR zB;!7E*1uA-+PPY-ddT5P=QMv9g>mdnv`$+#6tHX3r-t3r6M3qok$cJa$&U0_tx2ow zDO)U=m1>1U>Pq4wx|1XT<{q|A`<-6;_biBIGA(AkbZg7cy$r=_*jV}ARd?sau&hW_ zbm(7gv~5?fMFh5n)nox1?Y211F3~^4X*dQjEYO!Gqez0g%hEX+4dZ`IVNg!8$~dK=N?R?1f!LIB^y-;BDUVA3SM6c;m@h-{gVKOv8;);Zx_ z;H)%F@Q7xdWiF_&%!9qpk?GY2Igcy5v#~0VnG}N2&PZ>Tyhe)MQsy?V zEz$>+Bq^+j@ACl16JiBplCJlY0z9TH#NLNRoMtfeH{>tV7#;sO1+622e7Qi3h(VTx zmjTR6emI=qvLP;{au`T0Dg;Re#w%uFAx0s3R;W;GS)Rsn9FBhhQsG$U6j(gybe^_5 zkK5g+?GT9*?R2soCGbDRbf=-ILEBsvvC|id6w=bQBL;tHZD1D~Zev-1ec@vGI+h?&v0PBh1W`$*8#R<#fo52YX2O$M#u6b_ zf3BuMLVFN;e4?f?b{xxd8K=YhP8`+Mgsa83=#9q&6!D1mLN_==&8I050Hr zPi$>Px)=0Ic*P)MXxiAPB@{?nBI56U&w$~JG%*hst`$DSi@gl(9qkHa{y4Dmi@$v++t=zDhOgH# zRM`4OoeY1&(HTpBkWH}{sQ{IH+!BM9IO}l(`~oGdBUlUc(Tk?{k?`KmZuNA`W(JMq6TkM?qmP0YVwNY+bUOCX;Bo zw8~a3dl;NPIrPAp%zmPy*qr@^j(m893)l&2{#t7L4flcKIK9A-*``+8$%9oNCwavR ztIPLmQaEEhLG(Ia(bYlQqWQw(LP1mS&qY@jLF*#5{PVe14L|GpnTpx^ba$1hd zlkS)9;H0Z+aqX&R#gzSEHZ00?Sa=aByewnNU|=|ZBglbzijA zDM2NBJz}ecG&q6sebWwsoCk|#J_GJzznW{?P=|&k*gpg9%7vWC%lwZ5JO6DX3ygJ( zCziNXfIDdG`$edXS(w|)f<~cb7jBEvT|@bESi{iCKU+?r=RNPLQ1Qgd##sil2*F00bZ)n=E zL6hS%oFq-Q)o_+&Sz)pYp4f@#9T4p)P>K|P+uAeYIk|daBZp=!>f`&0E}JzKt&Ogz zSYWirD7{r*`KpRSDt_x$zD##;U={wHs-7XZ+Hn7tP6&EhyFb3?f63yDDIWZ7A%Tid z`u$d4#e}sFt4i!eR~0#%*ymQ#ssyy=inJ?WZEz37b>oDg$>dKPUlPc?P#gu2_Kg33 zC|PPI+QRm0Mm?K9*vxHcXdLskT-|YM{n?P!j?`a5j>7+2LGk(5zLnHp|aMM<$n5G}V@-zwy?=CX%ecNd%FOJ-l{q)YaDNrFH zP26dQD#pH^Us>L$sbitPMO?&NSWaZbMNVwQMXs6HCSpWm!f${{O=#^dor)@dZuUs* z&G%gR3~q#*lDs`IiLxBGcC!$2aF}${ItdUZM=uCuRQAG=aN4uwifp{#$o|s>`;#30 z<(K~QOMm$#%Y67E#IlIu2ofVLIlcseTErTlcZCe8#>a@qi*gb zdp_iQMgJhH7gzUJssR-$POhGRrD-g~WCgtrbeHx9ju+?>TbH`bV^XYHeH%xQU#d|N z!1G9xGhh?U8kj@6ad78ZA(yWej7c(m^ac8Br((g7aMWA+8xk@%aWmeC@gSY59 zoF;8;*mAW!W&ABZs;0M1Uv)NVtlNb>U2Sj*vB7 z-4Ty!Y*`e11Ypk@1u`b4l?R*C6$0>JN3W5GH*zXJ1oDF%Y2xJ$6*VorO@&Rp+8I{w z0h+@D52*$q+uVr3zl8?*S8dCux}QDd~81{NGkz&d+YSj<{R;Ix^qoFbF(^oJZpA+x_QQny1Um zI^_q-qcgmeIf>H?zDV5eb{==0K5BO#JbCc+@k2+p+Q62}Xk5w^kI>RNj$n(_DpkuJ zLigxV?K-Ficoi1209b+5->f)P#>AlcebM>Q?Z8L0?~5moA3uD5f^1+r-{hxW_lXX~ zEEOt(M~{HYmj2V+Zi+2yf&7}q)*n^rDroORAu$nVEr;cqzS{J{8-1lG9kMsfW#*LA zeegq!ZLMBJNnw)@RKUtIJWX6ga%`IrN0uuQ+J!+72wgFB^lvv;%9lI~Td8473|XN5^?TTVbhVNkhP?|ORd>P7-WE1>_v@&rvVqE*SQJNL?Fs%oC37~`Y{zDy zYS6cvuU{jxyjL>nz?#CBs1&wTDFXdmY6T|g0G*H zQJP|{-A+<}Ah(bz4~CooX)LF+{p1Kd%xHFmr$wl*e;q;loXU8q)PvH=Qgf&fvSXD! zbIQ!TRdE@|SY1?fY*RU~iwqGb9uL%Ugy*}|)O>AfM|P2+=7wz!4T7a^Zbf=-LSXw7 zYq!7-GOI_*x5t~;6LTi)k~Lu--^T_{+1~EX=?%nxZ;f>EbH~V4)2l?U_9LBTqzMq3=S1ezIXNT0+Mf2@k z{;3dutl0ex@%ujkTOBL>7M|FE?9T92xGhp(OTp-CK-Z9Ee{)Cre=0a%?~p6A`2u)X z^?5DjKRMhrrt1-}L*mate6vmRL9P^|kiq)x=9eRXjdJO{ZyV!l;#6I7Dlh7N33SiZ z<$L@M`bjRWbK7#{UaPGYb3p~c6I|&ndz#+sFMlJJh_uFs2?R@jJ`?T};3CJ9` zYwD`DJ5M_us7ErRbS(LyO|>1z%fWko@{W!cWlDV?193O+eF7CaAX-oDAIHv-iThRU}UNju-J>OyDQ`qaoi zEij3q4>S*G1tSMcV4Uvuqv!)Qw%U%6WuwmjHUFfM_U#3JUEeYy8PsjC-Jg1J>$2zDd-0crhmYY8W1$j7Er5~L`i)$c+HD4b=1&wE+1cv$g_`y*u_^2_s+yaj&zZE+L zwp^_**jigHfssu#!Y6}Le9pmWj=}_3&jDxjps59+a|Y14hL%RgfkFmq?Po`8ud$?} zFD~mSY!`x6C$4i$-IHMS!mH)Xsk@lKJm|<9uE=MzencJjM14Phi zp-zd)l}eFBS+BRIH-*?^S|{As5va5`yx)$~n~-XWNe@^?q8<^43B#WfMRT?K^ierpiEyBUOkwBXmHP*>dw!&(|{RUHt+@fhE_6^D6Fr<3X`Azv3!3l?6D zxpZ%VI4kJ->F27XSfUSx+BM@?2(-&-&1#js%jJuT=!q>_WlW18U&K)X**7PXh%?nx zzvjfVs6qU?ZEmybcJv%W*@#kqlnV-iinUbeNpS@#n+JSORndBXpGJvc=8uweCg()}vn7LdxogdE%X@W7K(ZsrE${*;X@R-56k%Sr^hK(`r&1-p0!2Lt zjIrJ@rRRWwD!&^|-Si-TyRRPC! z@vR{chX{Or*}aTQg6-7a-ug8X@sS7DI|dlZ>LGADgda_@x@jn^%2z$`XIKAZo?7}z zsEL+VR6w*GC3m`BQ1VPyXz0-wb=M}7vb+I)$14w-RqvdW*y0`#of3a^5e9;EFUEOQ zj#Af6lLq4>BNsN@dpDLTz2&zqg&MM#^rEe#=3b1x#&q3{nUy$`4p8r}lT70w4xoxJ zCt1}(*p+>ItNXf>d*c}crP*1Nm*XLSKi#Ca0l~xQtZ}E?L}=ORvQQW44Bm4#CD{)&5T zpL}s~Ob#eWs;zr%p5$+Uto0#fPm2n!@G!$mBC*2qjPM10bl3tAamX{l3XPn6`^6J( z#?9exlRxGffBtZ9c+bNJ1==0*uDNA7k{722?k;_b<*6OZkj*`Rf(4{GKoOmrOE828 z?*MuB`3cqj5xMQ|-fU_-pr5044?u9JJPHITEYTi?AO#Ha2TIfe?9IWX|KwtU9t7r| z1enw)X&e!Zb0gaddw5aFJ6@WwxA4w{WgA`@+I5M-e@3rxWufHp-sbo``ZEjr?Oi~9|d2C+r1qlZ#y3l=hCfSzt?pa+>N(d^a*V{Ep>Fb z08v1$zj&+bUVps*s-0$YGUo5yR;IW1{cL~TS6DrSI_|#6N7{B@>bTJoTVHoI{#R{1 z8ynKrzrz++K$gUUJsBkgo$K8P(u(8xVSI_-|O+pkzSRNXg5oY zvy_UPRDVj@&OW84z)U9))dH)7lX8z`0B%Y_m^mXWN9!n=x`frx4@X|kZbIUh&+@BU z)j;46H6n?>9mqA-cIshE0HReKN2pR^Z-W^N`Zvk75S|GMpreECa0n3=r1o{em~k+$I4Y1DSoOF$$HQ z2mm5x3UnsXVTX|N3Y)z4#u2wBkpwNXjr~!JdG4VY8T%5ti>~Bnb*vD8h`_-z&*Q_lb$lG&#QHcZ^bc~=cFV5Z5NNb{;3hrBV zaSUk-j?vnT%8<*k8A+6!hojWfldlZ1xa-^-p1#1Wj~e&FjwKMAWVXL8P9I;*{WJJd zc?}h+I~c#16a@Tv{a$mP{IU*@m*cM28tI4t{-Ifd@_y|CFf|u4Tegb ze)Q50GOHD%DA%X%7+jk^3(LJp6rJRD_Bn$sRS;J~a3Z7{eGw`n{oU`~fqxJ)|L^}@ z-tBRK5Ev(zzL31-_>i|Qih9-O5RusPq5d{to(HCUsK3!yS>jAehN!16sV0i=j0@~IySY2PY$uAJ};U(F@%iJsyzYv^)@IV(CXrs?V|x=z6d%ib3LC& zf&x&|aiz-dK2a6Ce;Atx`;RF&iTPz0O+S9{WZbXt4fK^w7%;n5`hOfY@~-G=NGCtu z9lQQ^M#lf)@)?!~@{Mt3Fj_ylra)Tq`U74y;p(0^ci|m8-;kJO>2udakN;zM;G0pw zb-h3zm-wT9Ws-1?q(tJ4fW8JC&9EM8&L#^@0emgcTsNqf{SA(S(E1R9c(MjHw0jLI z$4o5zBr7D>ncxuYsegd_`9&e=$-e{nsgeTdNkZj5*Z}<1|Jhm_74+t7>)(=F+h>6hb{ zqRN-aPJu5CR|B)5wH0jtjaAlZdA@YQ-bp0fE&n zEpM08(LyCE14j=Co{fxBm0ipsFdiB)SK{&ME5n1!DX4cTQ8f)$g7AM)&K&uVf4lqV z@J_{ZikY@oyrkD|89ve=e_TtjDqdmubi{!BH?Vqi7_nq2Y?sH@`~XO~t?oI12NeJ- zGKOpCL`xff`hS9vw|c?QMcH^B4Leyb7|}fra?S-60Vn)Ck2}$T=V0u*P|L z)L}F+r8n%`R$iq(2Rr2`O3I2Yj?mc zM0b=y)^X^LYXU{jSUMDtx*v?MpWWyH8Asfq1v%PTLw|t!PJQIbwG%~BK#r(_x%tyq zTRl57?pvM^efOvtUV`S@&Hcp$6LuF+Od41x-Yf3m6*e()K(B!Zo(2O;z<&Bq66GlT zs^MV*!prU}kCfdH!d1XeOQfB22T`P;l+2G6r-v>*D`*0YB?t0kUkoSCYoKH-CNsp;vqKUUUfF z$|A-fUQE)bEAr=})R^y6e9^6mx~Y*49fzzo8BNVIuH9?vkjdgHi8dJD*+dF@Y%Kx~ z&#r|q6oZu!45FUP6v-V4I}lA*Lr2+tTVGZB=6@TB41SJe6(;BE^>#No!9XPX-GQ|o zni}@|V)`L>Jh9=OwwAM6n&f|Vp|F_TsW8~2z0M--&~@E`G#1Qv+SbO4P%|nLFn`S# z;W-Q3f!^Y0kgBi@b5XvP^a}Mu`hiK#)CtiX270fIiwD`BI$VFJ=XXCH8cYVDHg`-o z8}c70)ti#HFKU!d+?%EL77NgYEsA`+k~9)jkHhF! zK&qAF7Dr_Yt4_%iu9f9!xdRIQ^ob*pG$_ z1FyWjD=ZBNt_Y?yk`eEttrHDgj^(#=q1e=9o5|ruhvEmJL$Ogdky9}qQoBnr68etN z_`yx?saqqCX)`m*r0K08_E~|VZusXDbRbh~Ci^$cis6q^VS6;2T%1o8zyIL)>wky% z3EcB56&Ki50$Ra!Vmx_XsB1^h{_~S>-Dj|0hkBo4CHy_MtU^e<&wNWTfSVHy;C_Jt zc#gW6Q2r?v;_so}&Xf7t@Rj@5lH6`!Pu$Av(JHU+=83~5a(KpPC1RG14k`w!Q0D6n z>IE6xLFZeIAi}*T2aOCmYp=j}(|T&)#*vE1p#2+T~yepYNIA3O(tUI^c=syx^8^Tl`dnIME)?SDVC_qXTi z*gSu(TS8uAqYQBH%nMX_HV{ok^}FQPl(_AD0N<%0HomLBCiXYm9wGie@cXZi z-|cA_aCvtO9v|~>4@mp5;?e^qqU2D4F1r|%C@$2p|pjW#Lw5)_yA`ZB*H{5;#XN7 zU}ILta&!CR<1k@c5!~KD6=O&Xc;sJW!d93FLbcd+z^y1y&ettQlYjj=rp!9DuM|g{ zA{smV#LlJbCz)2xeCB4&65!We7y9b8YeXgquLH$QxYqUEd0Eyg5(~Xn8vr@OF7q)C zMxa((jG?3F@DK5q&{uZ6>S&;LViala@w%v%v-7M1C7%p}{PWKVl9TlLu9v4LV3F~* zbU1Lp;|mp=&*y+M$A1)Ju3W!J0&sBefkB4Zw*>@aC{V8bl&cEqUY@mAJ$Q(b#>ayS>*MtIpKEuhFeR zmJ$|x9md~w(<9uLz0z5{hTrkrwmk=C$0WkQE8%?EK9{iq&VLsiybd1y`h@BB)}~dp z&Z~Ow6AOlK9y&F|Uegf!uay+Qm>BLhpO;gD2orUD%Ll!eGnHW=6Cq<`n>mf+dl!rd@yK*i#VK)SYOurQY8xh*pP$-on&fPdw&SbZt&F!pTOSXW0VZMnh z%!b)hCU-PjEPsk>KAW=Q2Xf1m4grmW9iYC0FVJh4o;`>HZ}tE(;kEMsn}81Zn6okeJ1et#IrBW4_gs4?h7h;VV}^ztR* z(tufZyGzV6xb3k@+%x#R0)QUY*dUi=gqhTnxC$rE6)@J?`CS}W6!J(GmI~Ndj@uKX zHms|{Xo=z4SYOD?!v`a^I<|pfnSm82T-O&{Tb6t2a+P#(9&k%lfGcZt{q(RQT1EaUA)w~e;~#~GC0Ig5`T4>_$HNWWhC3f2H(yuSz^jlA$-{? zF&xe2E5iuzAVQzlN4x3ites_Lbv+3$a3P1A5zExXwOzZzHRSJI(cPD}9SbEe21|u_ ztIO{C`M%565}oOhQ?QfP#3|ZITNqhCxvBpMM2#d9yjVnYHG5U1Zc-$~V&Q}0e&E>1 z?tg>PmD>#a)FqU#p-t#}l~DYiIqg^<<9524RVCGk@pH81md3zX-&?OTSx2%-O?t_a z6|qR_y$d0!8fz2$x~|2>*T(!_`6^=0v1Q4*km2-j>909Hp7`Dd7!);cv~X8_B2N98 zAzuTrKbaoK*g`N!jl>xzND=$SG|;KO*MDZJrj4#i`==;RRHH|j4tdu{e9TX{AhK81 z=r-Z=oOsdbJT9h*6Z!4!|Jdw)xYo62A^%NEEFwC)6?DO$>eqx`Ub5;)Q^fQifF^(@ z+Z2FRC$MQ?P2}y43=keu$a2W^Q44C0K|LIBuOyR#lA;wk9in=IaKGg^K*|B49DkK` zjo0`tuYdP%@VkRX2z%@(0>TbseA8} zR`(RNMvy3BbAPA(08xoZ!)R`?$5AUv;57n1{CUtBN3A(4Y!RQ4GCJzk5(dJhLPMX>%#K%n)y6Fp>cBxxDa{<# zJ@THUT8GFGyeY<{VUQh%)_;uoTTp7hf@Vr*U`k2&ejI)mcO}>6GgkpLll$3W)`t(D z@`oMxvKRR*MftlS>pO{-l3{1<4g^OKughL`Y(~Dz#nlod?%Idux^wR%?9rjT(c^Ma zV8{H0d!e68bTZK@5`3nYS0ge^8W--jtp;;PQ0KCWnchvWSJu|q#O zxpB(M-1ihZ${^J~@WskU-~*dBlTPVv*AV>LzdpVif5J-mVPIc1id`P`!_Te$y~uz z>7&E~wi!84O6TnlLlRDF4*~}`hZ09~g|CDm;{r8$=$T-HOvb_{TV~wTZ50(KHCj3} zn}`d?i~#1qI>EvUo$-{i4Eagox7KA)jkQY&s~OGK(`ZRtRDX}{5AjukFevX4iNOSn zR}Dq;#KKl*8jSf8z)l^%ks^e-&^N`Z@(^MoY>YL6##U3D0kRjP?;&QmbG7f|9t~JyID4fn(H~buf zYT5{ENbRoEtbb86AEyt$JYk;>&3^Q*ES&K{iEp?R$(S|5+h0Md!Z;o&{97=6hjx7F zXFC6g=ey#*kL)))DE{8S_bE?ywH8p^5&p&jrJUXfP_S75DCP8b1SoDc0ib-U^A7=~ zoYn!wFSIM5l+!w(0O}m0ccnX6Jhti`0E7`W_ro3@Hh;QgeY7E%zT0P_>4$`6;~AU5 zVxQ!r9?o=Nj9!|1vy&3D7rGukfnQm9FO0UnUY>au2Ic}>QxzLGDGPKXZUFea!H@1Oq?Xiz0E4kRIb%_05eL_%&?XcIeoPA{!em zG8L-<7k^b(Yf1wXElOIocP zD+G#Bg$G3%rKV_ZSXSFCxV$nAA+@Zr` zgI0y}@M6vG_(1kFIA6dwA>~~67oGBLVd*c+pm?EWQUk$2TWSlVBqG`z8m*rQdh$#A@(9&~2+x&mt2D&$ ze_kUYsu!>3GF!0~_)Qc9pY=!t7VcHf6tG$G4Uh?@!uu)6o5{0?CBN(vxQ`w$SGg9W z4+O0j%lQQv7?Fg3;LyRSm@jq4WQAy+B!8X}B#5LnqOjstUy`NSwbrs{@Xj?{BBsB? zJGn+F9Ahd+v0La>Dr*2G+%u3*)1nw#-T1%xK6i_C$hShq@m0VM{~ULWaa+Qbn#jDPlq z20p|m`@dd1|9VKeg7Rd=GxEN1*XGGgqdrTO;4rY$)1J*-)oF^%5U1z~On7GkI)Ht> z2aeIjVu7L7@QD6Rp7eFEcOC`+BPR*=AxCz#9^b?Rwehze2jwAfgT8a*eN#FZPfmOksc+o1`O=jHQrDUE#>XB%UWJ7%{PG=z5B@jX zAt!v}AT;d(X#B8M9CK!1#Yc5TChWl9%i@wf@hJw%Tlc};fD?##X#7U#^M8~pp%)1y z=s^BS8md#jxhN2F`WGFm9u%uvF!HP_3Jz48ooYD!TDWXp&Tbg>8oo-HtIdO7v&cjU zQf?!`g8^$t9)N;TCo907=f(MKvC8`B>cdi^%BMI-`M|dHyDreSr)4Srb@$-cwSdU! z@X1@Xmc z@|1hVD|YQQO|0{MqL{KU1!o^7HG#)l;@nC=;lTY&fuE%k*3Tglq06O8cqD@r{u&F| zT4c4*r69bq{?i&gnx~g68X&*EwnHJ911z4vh(3?c>m}BH9t+ zi27k+Xe>FZAl|7SlYj4@9NPLn(`7mg(Ui<2wAQ?~@!dA{q9+}-wY`?(W6_M4r(UOy zG7Le+=O|kcn!jzsptOB*Moqd@$8~{fUq;K z<1@~WQK`?UfO%7tn5qQ3me$9|G-~v9QLf+5a;P3M=}^huBBO{#;%c=)>H%lBOf;&C zISIvpK4js`q<@^gkw_(8rQ=Teft-~R_icffYy+X$E0qn^OU))=t$Gb_N2d{GlEgFQ z?IhOJ+dc%{)q}$R5l`b^5l^Fz+t&uvK-0!1mJFrugdCp8HA>vcBO_{~zm+LidsW$@ z#SUWm)3vwP+~A;-F1J^1u>CiRGZXvQ1uJgxzSnlaq<;b#KohqZ^l+FZqL&;t1}~xh zQ$ee(2%*)d*P2Zwrbe4MwoBr$T!ZXoTTovBGY@U!s;^_fh4@kt7avWms#v#0)wcv zTChnRk3HC@Fv=>)mGyGLD_-G$(NF3Sh)+I3+kXcxS*X=9G9_FKmC)W369I;P4UptjG@^+|AdE#v>@? zC)0|8j2Ym-9ief!)9THx9xe`rkJmq_95~U>yq^$ z_J0tQK~36+b-gxaeQ4`iR=uX{CfBxf*DS^5IDUjMw>IU;_9n|;Lh;Roo`MP#tJ%x)ym+xJ=35+sXf(;IO27I%Z;KqN!&QKj za(vA{W*5SQqepE{d8!K}jYz@>3_W}rntz_lWmQa0{F_qY#XEM_KC2v4T4enS#;wYq zitX&!-Cv-yGEOtCOg|0hR$B~k6#5NDX7?4CylAYSp4hLjBrh355>N(&qS4u`0@G;s z+r<3_zszS%I&`eZqI7f)t;*|NX)0go}g(9Ofq|F{XT#&gF;lvUyG-WZ8% z{>2^bg}Y9J%pL2Z!VJLUeC7Ujo3JYKg(j%^yE{E_n$Px!2X#vfko@8fN`Kl=Qf2r} z9Z&?as~mLjs2+n>{e!)I_o)4KkR9x=m*1m{R-&c*-$#S&<9mZ_Z*My>F?TkvO)oFa zaoO6E==YTYckk^v%$~7hnz^piU|W&f(Sz`;O&_-b5yimXC3-^~@^{Ql2@)F3FfC_( z->-LDttEb-T}_w4!om_M%6~7Gvln=^3|U7e6ZrMM!qD)=!v|kI9y$!*tI&$}MN}Ex zJb<)f%UfW43x78*oB3%Fx=vv~Vfd|Za8Rea{+>Pk>Z_+O9zT5k^&Uct2Lmkr z`n#8p53`Tpk1wBp_w8Z!G5qRgewf{Z-@bqR`2XNvpJ4sxU%&kFFn{|q{Qi%}4_x)X z;8a2r4cI(h&>y%v#NBOIKD_T_7URxzxaLCI+n8?T$ny7fDMOh;w3Pu*;BJb-JS&)Hou&?>CYDZP=Nm}6xAPRo+(Y^9NO`t4V}|{bhlJu!f-r7 zATLLSx0DZh^q1NboK35@^Q~_JL|La<&$5%r4ALRNx2Mm(d4K-x%LiY-Jj^Z&M>{y0 zV>%;#trFWQmTKLigC;cO5Eo>Mb6rel4&>(?F6T);nE<3;oSr?MzQATLmTu0V1o^KQ zTV6os-yO9E239$Gfe=SqHj6h0!0O4xWbzM3p!EIw1OWnThSe{!R07 z%HsZ?&8Ewh;_N`JpS^|_eBmQ!Xm>0u~KjVP#xER;a}LyAB|O(48LJQV21*-79!LvB!-1@s4b zr7g30UV$KN8FJ1^GK57O2~&OvBp7Uf5?Y=W`4KGevP7OT$CJ8)W$y-GShu zV1KRr6oSw6QTqi#Mh9Pq+1^=p?=1W4SvDLFk!dY*1Wfn+T|=P{Ai*X3}@}>(drF z+om`mbvR0Ow;heh1vh3Fsd`#A1*+CHS3GsO!R;_VDVD43ya030vVwRbC(6WuE`J4u z$V)IHb=(k|go1Vh9BRFuJH>|h7xw;rWPSp{exp1+=H7%wwZ`u;p9#|pSX0syX`Po* z{U)~0YsTx$pS9rUzK&w;L#|fkfZ&GNgNx-1euc9V=cRF3fvT1a6P_5IHXsXV*0-qO z#UQ)4O>HR?Ewn-n6^IZ4!qE2Xo`2WFqYVinUoB;FKMsHp0^2nl1WsVR9{qtV@Zs4E z^pt2IP{Z4U^&MGUJIL(9Txecyt{PbFXof8xC_XHGj(f`yORKy_Tjy zZoHP%Qr`0*`>B;Qj&akK)W&EY;l>LI#=v`j=cAi#7Cz8Ni7`H^kI}M_n~f2!!y%)# z<7giPjNY_n^LfA+2k(81gLsU#BfsGowY}QC@j94XJ6baap!+)?-|&6_{g{N^k85Mx z_!GBge>>^cslo;b)a*!LnB+Y~Dr3PudBsUu*wU8U0dhEm8UPyH6N^adbNRSX~PF;D=qYy9d#qjG# zNf9bH8zrVt>?kQhC(9JsCgF72&67BWWrh*2g@=Js#S1=9~fnh z0e;dP-ZV&23y~xW&(PVeNK$JyzQBsoK%wPptS3NwN8E$Hl#38^SJ=9Ynp)k1X@iJi$8|OhuT48QYhbJLqT7^X8sqZm2BHbq!y#BAcc`Df94Rq z$vtLQv#;9eaOv?LqwNyc1R?nOe70ET;Dk(uf*|~O#4xiz$nq0%`E)EM31Shb&Y`oR z%5@_*)#SX`iSjqJ*^UhK!2w%qGSTRjP@5SL$C{|62!Bf82W9a04((qD-b5qZuEf<5 zHOVdrELd!jR=?e(Pj?+z))I^I|3zm8WN#d}plMS-t}j{Un!-V<<=O>tP12;MaVtCa z`w{m0(O%njZnAA%u?kYA9}ar=L-5_-yYU9ygZ;T@>};BL1%B$Ptb6r=rD0-VuT8zd ziFfR`%YTW#(}f@cjghmkGa(-!dOy~I$b9#Zrx&(wL>wx^K ztngR|%)o+5bryIDlDob*&WfUQ7}zBsiclY6(au{$!&V~DnV(QzWw+1H4$seTr#yIJ z(AQ!uK_NCUZ|c(cCdYV#v)(nDZeTu-nt%IZ$T?$QDIF*kMCKjLDcu~~_~4f_c;{&{ zL)xT%@5PH3z4h273jiY7QPtK>Xj9hK&6i)g<7(?FG!%QMu0jj2wywtGarUUKtI!av zt*h2)NYw+dg}Ey#|Mbw0Uu-^6d|zP5f?#U6n_;& zd&4J0ETLjt@hc;Wn6h{eh~mR~Gh4*6_U;{4tw_P*mew1SIbeU5t-a2cbXkWv)?RiT zvkUU*gc8==Dv1mX#@TbA*pY_E ztVqFCgQPAmiX{f;EK<=sO{CzhAb)`oj+6DNT`GSOl~8m|yeU$!E}0PTh!2HL_kzQ- znsDla?AYeK6&me$cv+5@;5d}iZx~~vpARR+$TqX512=4%*m+s4bcXr>-3pRW9(IE6sW3&4?Zx;_CH8<}h5WkzIpB*l^_8qM$} zv68XclHw{uh4TEo7?-ZjWEE&35o`Kb%+ zy7;a}_Wx#Esy9PpDtO_SPk$~-C# zGo=y~yRBKUo$?GbOjG1)fCPk=Nm04w&lYdoV?@Btvky>@tjH0(R}d@qXiEbhS0Y86 zXZ`7na&v6Ub#s{Lv7;;cJZL(OyryP-TVgmfkDhrBuW($O(SIGA!NmE%=h+9?a4!w_0~t|d#NKw}Ia6QUNFq4- zEQ01#c|V45lzseTJM~uZZ()v7a@@vT)sC6a3#H+KIk0>izCjuhIB|`i@%ur? z?qnU^+}oC#giY0bB1Ez_Q-DFc*{u{0$xZI3S_CSmsCsHirl~;;?)XO+aN7Y02S~Q^ z0b>9Fg^aD2oD~5WBubDlaAIspQJR6vny1$pg~3Lgg9il0MU?>B`UaZJ1c-@F9hcY@ z0VyO;#bU<&#j7B;ANqSvbL$J>LUsYzK}RX>5BSKGOayodyShb}B^CiFe@le=U}E^~ zZuIS}zz7j{^$JKYEmU;t06SF7{q8jO%S5$1{}LiA2OX`^f{if{`$|C_aNud_wvG>+ zj*sK8C7Kb!+i3RFa{gK&jXXhO7h+WQ7Q5BQ|z77 z1KMQ0Y$}G}2Dt_NjYxMyf0N6eppvfMK|Ls@tODlxRo>D_bbC=U4+DCbPXj!^6xngQ zshNl5VErNI0Gp-$Pzy=V#<;DOt$-k>)I}|}>hf|HW{zv^$n^rd?3W}+XQglB8gD*T zrt*Z2i{)j(pKvY}dkc|cP-|Zl&HtYl4vK?~sK3A#8`*a__%76$f5O{ft9k6UABD4l z0FNR&oBEv&ToI;x5bo>J5v4PS2k>?k6jhRgr#h1U60+LN=d-F%Dg_y=5e1gz7fuK9 z?p7Yfb1RI*TFDFGzEm88PpHA13C`-3?o61izT^sSq3{lVcHi%S`+H}{zJ|xXGkypa z@54kPPOIrAJ6X8}hjFC@q> zeMGtxIR?C=-~m}7Yc>$cmc!k|vk~SFFv`Q(`Fu7l0I%dY)0Z0X(C4_XRXx_KZ2KG6 z{R27$72WsB>2s$~Xd9`?nI| z`vLumZ2Dq0!FYKWjwvli9Eq4H435AnG2F=DT<#zBK!LZ&ub7%@{)qD#aIwt4%^(cj z?9^Qk^j8+4e-*m7n{4ux)K_@p$jBA7Ajz8-qOc5WZKl8%1yWa?_qxsi)6Sr1!OeF(JOA#xr;m*INu$>T%0sgj#1K-<0qn6bGsSBa z58A)3qVI)Wmc<6Ap_YUoYSQgz!5e?-@wv7;|e-EvA8bE@%sBbTRYk&IGEHhv;#MO`_+<1o<8~XeHk#d;hJoSYuNmA` zf9W>9<9yl{9GOu2^FVkq=RqLuut+h%PdYRf;P-}EJcA0~LxnDTkyx)Ep*JwYiLFLZ z_tEobINpm9yya1SSO=IwJ$a)0Juj!DvqV35kJs<;OQ_Zl_A~AYM_Av}H&Cr3u+&7% zt>}=>6j34l+JXk*77_x4^Eb#Z&VUQaf4L%3DTT2pU9(YNgo&Vfqe(e>12_kd32}h! z((9Zdtj{qhCj4(ag+W$M-_G9HgjqrJj(<2OXnm7oVCOssc2%RJ$ zt*73t?Pp>$^ZJ8;BnL4Az4nk}{zMdYiROSifMe*%Ii^{zAijL`E4+L?eL#b89s?NAC~#z*$ADv{x7Gb( z`=>=p+5j5=Qxk2I2l_Pgi=?4s23pY8-#M6VNtn1Ax2SOfwX$(}cSixI4efUPB#u1j zQnS1F`P2fC)~{Z3D^n{de*{E+Wd!5_oQ4K~+#$9Im7KZ}uB1`9nAjUT0Y7+hXA&dJ zzHsRdmezJ`49E|{`>o(6Ara6e|?pf>=+!pjd!@# zfUKfUr(|;lx_W#K2B5YAQ@4DwDDv?N8-59@%1oT$x#@{;BEP-IQRw zrqKi>WxIB=#O`b#)n~`>2u`fE$=$7&bpxBvL`>HRHi`SDV1tiXE7<6DQ?PMu>R^*! zbp;!p@P=R$;-edZe+`K*e=V?yMia0}?a59S?sYJ`1Zc!4t_5sDDmj#J`Z2`BOUNR6 zfsGvBXSvl!&}s;<{*lq4@{nPs##AO{B90S=5!cy+X*MGp3Ciyi5Y>*LoP%VnsFGCX zX@Y?W6lt6BK*2g5sy!H+HNT~F%#Is8!K~R3zX<)dfSd{ze>zYt6q4pPm?>(7Q#7|P zV5&a*`DYsGkg2o*4JUtIUzcaH0F1}aBQPp zV}1u&W}Emu%KFavVe@Ir{;4V_E@0iv2ixz4UA7Z9I}S*Y%(>kK+(TbKhFTYcA_6ql(C=Q<=RUPJ4DfDtI+-2kldR9I-?m&`G)4hDjj~kS z>S_y+63XY%*QLJIgD9?CSfH9$3Ba8sd5zJ#_$5j}?d zxSW8n4h<7U&Wc||=7N6++~Oau_tm5Tf6oe?MoHOFlcs!AEWjDi!vWxXhf}7f!!GCE zRio2gf2Gz5YLcSKl>C^59Fc0SZw1W1bLax#7#EWzn1vbj;{8y)2x1JJw|lZH*R~j9 zoBz%ZQ=k8#*6$os5NVnSNO$Uht#;>x4%bb{!!p%BG+)TP#fngb(Ac5X?(!gabdsKq zvI5Hb?Yrx{8`Q3zDKvr8f!NKATv9H=8sTPue{E;;b(gHz_>!%^DMVX0UzXoLdL@I! z04u6Xdic495+T1r&q|u=Cq3?P)Z^%^18tGfm6O7dPvD{=mI+uABzI?H&PsB&T+R=7 zck}V=JO}@e)7>BQw>cRv?O;zk*wgNB6hV94XWP4eLoCg_4dQ?Z`|ZhNNEi+G=n<5; zfBv)GJK596yU*d?4PoAhRk&eXA0roHZ`YBQ*rCT|UQW2fXS1Km$s|Y5dF>Q3%ul7r zk+6<`2K^O{<#=d7F9pS*flLeTGCX}el$H-B)okGF+Wgud4TCxF*!e)DI19#4&3Mz< z6r4i_43F$q<|=*RZYI)q16%o$y${~vf2s*$FF|*Ly5#~qNC(s&xPfVLnnT?|LuE*_ zHsn(o^HIoJ=S+FPy+@9oqzl9Bk)O@t9Ldpr0K%PpRbX?v&s@jn6?iW(=n!rEr^MA# z`QC6}xKZtn z{u}zEFGK<2;G%l9_j(ZH)Or_>Otg_7_}j}F#;!_T{(-a;gAi;8YwA~&AIS6@s2RTD zhe&c55&Tqcw-C1;uOj;mOinzhe~2@l=d9n;Ck$hU(Ox2t3?Qr?qx|SSqM=v=9C{N^ znS}&ZuyrCu6FuEn|f(XHut>WcYeM>$1NN%^ee~95gf&}8L z7@!TsTa0DGF6e6M)dl$6_}(TKu%f9a8-7LX)_z7TGObniMWcwpxeQj^VeWm)+2NDf&VeV`&lEqfE zGW&s-LPwH;FN?|C`li=~e~Wa)xVJ#$@>{yeRsZ?wkd563*-C!Bz7~}Ku2?|?Z7e{P zM2c(BMF43{2A_%d%Q%yXL{ccy7B<+ciiBy7*kZA-Gg40WP*ZWS2!^2|ubC$`yvlY> zTaFZa*M1`LW5U1=GoX`~$^9B<-eFeky^@^PYNKfxsFYlqLa$6_eYep0!CweaT! zCwe@|!KZ4N{T-}+D)w#Pr^zA}=@z{%d*@qfdt6K$-(}m1e?wes7e*)-JeqJ=w~PD^als1Qv>hnU$6AmPQEn+1&=Q~Umq#4XFbsDH;SIrH?ku02sP7;> zijO38BS6I?yagoEVFDslsViAwRjhZtABd=ElR+hF4|(*AbLV%1&UbXFcRU{$yw_1P zdYx;HwmQ7Pe+JJzlTZnPLmpi%qG|-sfj^;x+y#2KhPMnlA}=DjLvqcA^_!q#lp(R( zd+Dpd_29?N5#i3US?*oPz7fHJ84{B&FIbe@3Wmzc$E{(3Nyx-f8x7M77{o}R0mN#L zg@;{{DX|$r+FU}!QJ&1An_LH}07|jbJG6l{DAJMQe|lR%@UPLE8H+T)jEXWRUon-p zwV4?~GqhozAy^iJHojF!4`!`jwykfGPK0w#n=7Pm9hLY-Z-NQ5EHak4I zqnluY;QouvTl%d0wJ-?MVh9#@*Wu z(bSYwf2%@*!gOharLFN@^}UJym9NORB@?G0N zkPrRz{`9A;v68Gc5xL7a!uY9Z=&q^u0{|1af5Pat`AK8}T!sd|u($D!`Q7rTr=D*$ zSbAkQ_qF9OB3mXz@)kr?SF{F5vR^V`89PABqKICTjK0J$gYh*G#3=^V7%1FmZC2_N z6%8F+JinZNLsnHQ*FFxafsp1`D;8sB=WxGF9c!-_WFv`8)Tn!n3GE2_Ws&N<#&Ug2 zf3X@sFNQao0wtPL#<#i}ofYGYNuky3si^zHE4OW<;x*3CCs3dIu#?;vNJy+Y27Leu zUDtX+Lld8yqv4owDc{lqi8XEv-K$ySZ;HWn_X&NJS z)L7Extf}IyF)OJxNnrkdgIytVypoVSQ+C zuzxpM4^&HCRq#M!NOKlPfF-qg+bf@|(>w(JeWcRL0z<7(Bbs{P85dFbJXx44z+?*U z;k7ZLx5H;6o&`mC4Wm3o8#R=e>hTvl(zS6DN$yluE~{d4!mQ2W4LI(>R&z5CU49e~ zgYLOhlW3|BP3g&G)s4RhTTwLF=q((`{C||)GqI87nWBJkMKLbK#VO_e7(W-v&tYr~ zT>n%<=}jpv5)=BnLgWwB@CL$=g|`@|()|+GA3vI&Ug1Sil|Q}v6|OyhsT=Go9mN}V z!~2Vid57zZ+w!HeCT?RdObGiKe++66k;o=g+)_-p< zkKg|Izu&9-jq+XS61t9mmwm3W?-HptOkfdwWmtJO?&kyQ7zLzGn752En$UsT<+7sszM;r%3p71{J<-}n-dayqmDZ-kqcxP@qQ=+6;b z$%tWz`~!a2H7N*)*K|y$58v==G=Isf>TB2jb$eShl=$MJ0>^LubxjK$jU%uI!@@ql zOM7>2@6sGk^<6q3Ab8C$n4+W32^PWtRwnMX-0Y4qtpW~Sr7qrPgYZMZOem@h3oQ#) zBf|fNUO7B8OTUj-82AE;F(jod5&@jvDTxniZYueLkOmEz6s(RF$q%X?ihnz$VV99r zg?Z;%V`ZgJLNu;r<#HNCEL>!= z->^#9J+GT5novG-dIJZzq6B7Hx1ld(KQloki&|Unas@=G)4>yqDR2$pD;^Iy*SH*+!p1r)Jvl zci%rzhO`naM)VC)b6?NKp;Rg^WC`{|KnbR^(E3K`=(Im#l(`W!KR zsm|b%EoDf0EG4&@G=D3uiqXYVLaj&rlGyw1}5^NOAP77W1S$y;w+0C&NmiG5>hx z+iDzsNnur)=AXCi@MijnHT&DHB)IwRHtG(#Y%Vmu;ocgFRe#5=ec-B1iwTl3lG7<* zPgBa-SJd_EWbv!lkRg?LQP2%M^khzhj720Y)mjA*{Pc^fQ8D*lvB#jM(}<)-q%3yXe4>t?$G$WnFt|WP}6Lhi?GB@T-r#ZMC&}`LLp*aIoY_Dfvjk)IK>&7hImLP) z`S%3)-T0702}HYyVgu$8QSFTx$3~_kX71v}H1S^_k`syNkl;d+8bu9}p;;jDqSIeu zRiSCpsu$qd!FA~F4C!OHoNXfMv}{irlON5XkVgAMaJylTWBTGp_>!&|{e&aP@4 z=m(T!aNzHlCKkkGJH5U6RgcbjT|e+(U`J6ul)-0%ju7QTPfCv=A*G!f|Mx>}zYDqDNLRiqVL95I zfb*#TFeKg5G-f!=W~5t!!*~mE@Wq=Frhh_@5Crf}B%(gr>d1y9nUF?CAOeddTkr?% zxe4t_aS^B=G$DC>UM}G^Fz+W9f1fWYWy^;nS<{H-53=<)OtyYU+kFYZA^FScNJYSk zp^>HuI%TUCMImwg7Wf)~z(1FAq~2_#=L>t9T*QA1^NU;xgeR0Lcn_vQ4YLb0J%6&N zfQ_m|zlpPA*&N%NJ)i0Z!B+lt~ZTg@1d-;I;c+!T`H393l9ZUsR%%WpRDFe%yeAThv@M z5*A;9Csyds8-fg&M^7*2ndUlDj>B)Su8$nJV14rB;v1lem@Z4lPF*@wLL1>wiNc0? zK5*}i6UtMLrP3_)I{9uK3 zOLF5{jUIr}zN5_@Y~+yE_dhKuSmM08BnCqR@l)7Dx|O=0nB?4QcjX;es1#MXY%+#@ ztul94M^2xrzj|%XId104T`hSJ+^@s=MRnFUDaqE6Q1zFxelf`!8SM2q4GXv5E^*6|@uX5w*QUStW>N z)7Yx?W8+*4?mg1d8igmFfq2Rhq{GSV)G=PzF?f|L%;7!5IR)tevzf7Fz#=y$csqEU zAPCv@e2S5+GCNhhe{q!4aDtf!mV~2+l*MffW;!V+OF~5)csF0TM}PZPR9!mK*o3z5 zI{5qA{$UQu-yB(*CiSt9ah9K-*C(t6uKAbvi*SDN!q^$&2Nuq$2(EFu;cRJ?p$RGL zuXNmmA6^p~jkXlr;g2Z{BRfLJ627MDiASQMcp0pn!IxT76vo8n0~2Q-dGaj3Dw_;x zsK?)x84dhEvUPZHAAekxHZ{5SWj3e7OlD1zXc?l5@rcyT{xt?9V+^50_uxGLaklu% z(IC~Kd%y<%+e^0w`>mYT>%q6Ep5rqdRg;6kom{lk5a~hE!^8tw>Qy$uaphi~jv-$B z_?+%V*?P?LvS<2+j6E-w#oT?RzNrl4Q;rv>uh;J^AFw3u3&ha8+%u70U(C6uyU1j;K8toj${j&5s=?N*He7i|~9*QMlY7 zs9xZbwcrr=Y}CHBrPpkY0g^swv-5MKY)G`fnQ)qNa?Wl#wJUot@*)W9J{ zDwttTSk7p|;(t$IFoF(=FilT9&P9~8f+=58C0U#J zZ&*)j)D@aQL&O!%I1mJ0>9%AaJ|+MI{5Q;*L`f>)HNs$A5dLt=@$?<;E3X{LZPRlF zlqUeSJ)aU@9r(F||9oS*KzRst;|M$ID3A$4>?~-DZ-3fLj!un#kQ{O0_$LQSXP~xM2t>t8}d)gq8<0! zWw$rjqX#}3sq7(dKW_d@jB(k10AecUH@ERcRgRD&$ho2G+<9{UU(lfD1Yr6b9|E>A zDN=V5+kfun6Ccm}Fg8mp>$j-^GfzuG8fr>=8sb>qVgD#=5-In-W*W(?nAb81y+^CI zO{}*P`YCu$IHR^_=U~obRsaw9x=)Bex9`4{oV$ zgnvaoVz++~^>Ah6+82NQeLyX|4EeNX)(E-~__W|Cn zp1?Ox*vGPFsdsKOxMmF4eeBg;>#yBa=_4(Aj_F@f@^0mC`PJRKUdn-Q)dfoKp##7@ zq@?Sc5cu$OC0I(H^S)~q)hR2Sy>!NZnwNz(0TF)%ISrAVZ&Xzoh-gkRHgV;<)H5&- zUBo^0wnI@T~2EH^!#foIa<89?hRRHsI=Ei9-(LLzdc zIhs1)n7rRKZTnZadSU77tEaj?=C9$?BjbC!fY#WL63eSpVmOD z?HVZ{?G1DRNqK4tNj{#AeRPXD@42!^>2T+ z9pb-+UdG53{fDD^MHD64iufU_sFFyjs2>s)gC6w*PBNU0>IuWK!_Ri;=(DYDmA})m z1%rp8DROtmLBt{i2R^(IAT~M2IEy2lVqMo4oS4=38Qm$<9H0>;3>Ai}gh`X`bU2^Q zJ<7&>M^NV8OZYdzgVC)EiUKMh%2Ize5q!l|;Gz!#>_0yUsyqN0tfMai(NQffdGJxx z@k@7-n{2w$7QxoLmlirQdTz)uW{wu7%U5i|FM9oK3~UXnv+_h}Oym_O7F+ul5_m-E zU1cxJg0E`8q(jHB{r#RWg))^6+&oqdP$iEOlm{F<>40?*G3f%C6`XF+}+1fCVMc82FoVR`9kl8vD` z0j)6MUN?x}5Ssl~yboxmFnWI$T9u*;p>@p_XaMFL!ZPD#Am45T${V0yc$hHFJCS$?M;y=>9T7dGkH85k;;7co_iP|s>I#zinZblr?Zg#M(OUwqi(uznfhe+Vw?ZLriIFk^My$6z_&G9a|lRYno!Bi!23tw9u>kJU$-8%rAve zm9#VzrqHf6;0hG*d~tsgE|Yw{zdni_^!jXqr5mr1fed?z*32{u4;rLG?w>$JQoAMQ zg`d=JNh0q6cI=oj?1(t7$2LD;^KK7=nc7SsGGV{p*9pXIMDLQtehfCl=P;wda{>r0 z7UgYvm8{4Dk18;k(=8ScqPl4Q1Z& zy3`iT;=t5qp!IL~N%fM+9fW)N&O6A;j}3PaS~W2jEjx(KZoY%K;D#OKb;O^J;=6n^ zFTbQM#joMyr}BSEwte!3Q2u5aW3Nrs{?u(8M^8cSU*cJ)^r2!W!K-7dt#ueu_YILCE4^AY}o4G`vH=I27);PJBKBGc~Z=~t*q5916C?|qmeKtOYCLectW_rNx*6; zJjyAZXyOWz4UGR!WQx;|Fi~J9b0@pE?d`|4H~87Ho$Q%fhM{6}X!O@`)nN3#ItEZy z?}2~!6aYt$ft_jNq0p2U?An1H^#+-w3GdRzjpbSt({ac8W>&pmj(**qd0A`F@-P&A zpi4xKvO54s6ppm{lu*KEv}aK-1dxx6CFS~Cu+Ifx%PAqiiMWJQ#*nNAksz1RBmuMO zh(m2~f{~0)8N+Qr05x$>FyV4L`8CvsO-g@lQ`}}JX7lT{EG1nM@9z*tjra44YjU&$ z#TBV|CqW0_#vKHA+T7M!$ARanM1Vog`8aRN&HX#|TD@6VJ@_#xZ-E?Q8(aXodbo2_ z*y6Wpa=!Wc|03Vj8#-S`J8`ISUnp$4DO%&Zn5_AMB5*sP{_yd)(+m1nMBz@)q}_iv z%570nE~k)X;4Cb&%VTrQ2B(>=z-OkbK+nyr*@Ndg>a^yF)2a7P4mf_Ol$^}$d8k%% z1H|U8-g(DraG+vJcVqmnn0ob*l>D5`Fm#k1lw+=9DC6dr03L##uR_W!B@)1~>$sXt z+(TZgL>e#S5aWxK+$M(-CQsYEnf!l-1b%4lbL!+1Pc9cEiDTmrHAN}6(ui1yz8@Z- z)xTmY*+>1t5+*rNDCRi5hvs=b#CRmG6H)cDKQI<9(7bqznO)?igISR`ugOT`L5<=c z-AcJ4)N}I2?Rax7ti@G=ebP{qJ}wP>E;(2eu#wqrRyz&$$KA~i6a#3JPqTlI)Y-!H z^UWTCI7B{3MM>FOBC1~T_f113*7L6+p%N4MgM#|76qIcF@0oytHTtf*XaiT4h|O|c7w>ax;0 zsc2+{7su6TQ68(v6<`MsD|r)cPEn>P#|Y_fN=3d@>M`o5os@w9K8BbHvJg<%5{?zq zfbxE*!1>s`REcOIEzemP9K=7+hA<0o^>R@bZ#lFKlg+i+hmmPUmd<}@TEuD7B7zsh z&pKRCumDRYx|c4D7l|=GS%3*1(-=>#Vqt3Z{M56)q{jhD<#$>Lz6=F;Hy(+1z?f6*lz;}?J9-*UZabTmum+d^MN z+%TJB1oM1^=DYaj5Y9TjST5ZcxNCwbT;Uh^m8XXT4T%HzoFR$-yzf~5?d(uKa%cEe z;VA4cOvS8#!7)H+PC|QZ38on0_x~2w&(-`UKP~>-L`KzmZ_zf9-$P#zyi%!$6wH2W z(2N+I?ybNRy-jGdN&T`WaVu19!madA`ql{X7oe^|Vjil1 zO03|!d3yfe%{$KiyZQT=`^CIA^Y7*!$6zNA%N}e{^V8gf@l~wC5o;e2Z?B~WiF{Km z9OgflV`tyF=_!&TFF}B#3wDRW1!Ml^I=gJHvj(NxE=e|;EpJNpa~XEag5T@XKX zEmKiLYhHhN4bL?36EKu~UJ~lle$cc6>U!EdB>9QXmrXb+!6gZM;q#Nl@ssX|snb(^ z&U?P1yQ@EsjG!z+z8uQAon3SoYbXFr((p~@g`$pB*E&K65> zfCL)%MShYm%J6z6UM`ZoVz=+|!ZbXA5*+tBIS+sT{&b#2^IMU8#QgX%o_XsLOX@m| zP2~G^H)7o3O2oDr)9mT8I0vR4GEoAO0b?G=sg&+>g#_q=a@_=y+HqOUC;7@v&w+mq zJ&|z;Mk6H&3uYc+UoVvEdaZ(RLOe8iPoZ}uM`gQ{Zf*01;QWRSjPLJMj{@<~c~3rI zICOs=A<&}uw464g^#U%>oCp?-O?(WrzB~94;7RbVum@)Tl> zj|xy6^2c=eaV$E|7pLXa2TUh7qyu%4f=PcKX8S>K^tmH+-T545_qGDH5yzIlR;TQM zv7pU|H9yLixu7iELim6HW31bJ1;$(&n46$G`@<%;wt0tLbP{1lEZ$G8GOe!n(Kcj zK@ZRenZ&o)b?YQTsG)a&^4ro$^DUywPIp@}rz}=r&zU1wN(cYEC@^9PcR+p6N9>{; z@8-Bj2iSP}13d-z8>wA-(wPG)Orrv{=nMFrUqJ#o)_l{GTrM7aDd6QV~R!s={x zF=20B5;Y}L`QSBRnpK}keu#nQdQ*RBDge;H3SMu?0le!mJnkT(j|#KK!J8}WKru!- zOM9eRbb%bEp@n=gy8>Y1d<*b}g38M`2t5Ygn5OJGe}X#mSqY+ADEkI}jWqzX=xLI< zWRKl)mqbNV4VgW?G{txqM!sA?9+~Ny6vjYHoXjR}O18s%VP3*DRtE2y%NT#FlJHhm z%1=e7aUoZ+JDm07FlT}X9*#839-hr+RYCj)z9egV>+@^0?d}gAWDi3H_VD0)M5A$) zwSBz+U6N3J=IG$*bbLekwj5vN6GM%4*c5yO*N*%EY9U)3Y{-B_j`@5(DMxr!T=Ck@ z_)6$*$^#ti6+75==#Eo(bX|Y2dEnP}{oJ^s7*ZF=azA_U;OaC_iC?YDTsLKji$jFR zP+~E({yf9F4nUTdMd4#OC{<5Sh$bUgGlk4w2iM2J-i9-#r)RSn#}l*@*zY_6rn}Y- z{teZW)8znS6}oHFTsGOOXJFjtT`IithZZ%e!sXl}%}(t#x_LI2WG;V~0JFcpWG=~R z*K)bYxBqE5U2bTZRNvHuS(574e~-B@YTQ|ZXZuje<+W;P*TZClSlx6=qu!86{T)-O zs|}NnkmLifQ!09$qABQT&Ls82)%))~yF;O^kyNoJ+Yr|wn1ui1C|(6byGpLY6m&a2 ztskz!e{WocuM)2!n1p}-qqYisNyGW$r%p46nn}3Z(M&2ZR(;-39M71Cg@00}QLWir zwyc@nX10br<2D0;o8?=17ZXLDR7W$#H92Y8jP4`_OL}ANzRDqOI6%<0aiA@h`>XvP z&TFf4R*`INUXgC8PU;IWAb*k=uVC>xOw+x^}n0egLdB zq{wNHc~l>jPqQCxkp>u$?Gh*_w^bBBMdL$9HyGK(?=S-ik=5k>9*9kaWDp6L7k63l ztjJSC0c%hrC{?1x)r#fG{4@kPhi$=0Sxm-|iL>uVcC@YjF~kZ_F#$xcbokSFqO*H> zkNFY!6^KFnBrktR@3n{u)!pc9cDZ|2jtj7IDaN~e2)iW09IF(a1$1wURn^BW+D@c6 zE{!S-Bg{{iigW6J^Lk-KU{_33bV3*fZ|86i#Q3TAvrx?UQ^m zfhXYN^z7;M1%?lL;Xn>i`hUH^77|p5CK5*vLMe9eMFfA#dR#Ia29JgVbI+FBmVt!^ zF-#VMP&x^-cA##a#Een_C57(jO)dD*4w&QN@$n19Y;b?G=xDp%SdnnDYm`?VMYFQH zsQW58L@6eT%Yt0e3hrkRgHElc=-!Y3dHOb=lw;hY&ohKY#{r!q{{%@4A?Z-Q0LJR` z3?)hMv^#&ktALmNb2F4|W}JHmQ?4Lq!*cDg$t}AeU>Ez$!z-6*Ds0D{lPQQudy$Y( zAu`=7w+wYYNK7F>d{8=sWmE4Orcg zM+nZJr)O)^Q^m8m-il7;R>QIIz{z8=o1R<{3*diEy*}_vvOZN#4kG@swzC~p)UdBf zF~WD#H&ZZ>^gux&Y2Y^-d1md-!GkbcK-N2@Tl+x7k^t2ZAT~$}o}IC#kBShXG8Fh} zm|^{8LCmb*8H6Kr4L_+6RiXi_A-eD=y(J1{Q8D6DQ)k`nNX{KpJyksS=t0?JRkcV& z0Cj&e@Y0x__Ir5nhuH-mJil#t>il~caYz%@M`Ywg1o7Dmz?Os~@w72B7F#O4Evpjb z=8h%Ew^F%bSk7+VWwY^e5JT?9ynN9{18HEg!Z2L%Wcy|@(dB46Fthfx0c*qo(Qw)| z{w$D=1#X1CRfCYsz06Mn9$vO9C`h;zhTMODa>_=;vB8vmtL7o#PYJ-Z@m+OukF{keY;-K5rlfZjrxhsk=4mA;b zFEJ?`XuoBG!dqF}2%bj}t?fL&(#U>t4t);^Txg6lsIjDmpjTn)A5=5KVQ;io6qIhr`X zWlt?LPTM(KjNuFov5UjcvMGcsyUbU>lbp&+Q%=Y}!}bpwVf(M;QsYA^ft$4zA>~gH zlhmh$O;mFvLj2VpN9`uq%FTBHQ3}qCLPD0)zWW~$$x$H4jOV7YBi;W7Oe=rT{OC0& zaIgfJ`CWknT4y^jHi&`@%Dih(Txhsdqp`KKPR&gaX1y;0;&tHF?GRC4e2=bMWKtbt zGg?^o5cO*X6>n|U9+NVPGnW)5uO;8UBu3s^;`(dt$o-orHj$w=uQ`#HiKpEAd3hE? z$Mu18=!ufNz)jNqWML3!z}J6>Hr{$|m~mAdBSW`{{+r6{6KK!@M4ltO0x4QD|0 z+JA>=hHOEa{esu&S}QeZ^aT%FjXr)Ov1Y;>S;eViuP2_2pEinL4fiz3M|8Fz-$2VQ zFLJ1YO{`hRT2L3hsIr0|UH30pvh43=aoIQo{+_r_NudF@X)rzDSww#^3GDtD4}^=U zcL~Sq=IWWPNzqek7ir%SaiI-7$m4Svn$c>W#C3X$FCy@{<3-LQ62gil+I|OpyI1+? zxC&ysdIMNjKirOR`^|>lcH^{xhw+Fs~t4udIv4rB&&ZRaX|GVs%`#>cdpP2rL|y9(hTakK;F+E*G=O z#M?3K?s9Y#*Fm-XHsEB#5*yd^ z24!DRnnI-f83upM;SJhhgDD{BCxDT_9<>DdBm7*!f4(u3BM`?4stIl)L=XjpBs+SZ zIm;Ra#91{7>c?rAfiwke1hW>z#E;tWCiZ-y6Fb_fha9@fc1;@&nR(ZKq8l9ITYqM{ zus(FhMylHo@NyQNsNb|-=lFs%cz_cP&WMi}5BH_X#@Byzz~b5J53kYaT8*peU}5Mc z!(_!g!Kq5aNLG;45D1!_X5A%UHkzM0CB$Hz~yaQQytK9sSWj?_y93ZmJa4)N5 zSD`TcwJ3k^M1bCDB`Pu;7tBF;|1RIpZs;a!qLsEPp*tzz0;A*PFSv zMjyDgRIiGO+d(Tt;Q~=R#^0AdDGjko6t~WQkbr&ui%Q}4Fu18oA0`NjhB?u@8ORr~ zS|DA3FMYG6W)UR&FjwfiY1M6@i)no*`PML4BHVx88SAm0l1+(7p|UhfD-m5+@md^3KtXz&~cH`N!$mkkpV?7^A!D^cfy4K@?Ox;+u zQ$o--P-FVg1Z;HBGDFo!Hcv2CMt0CdzPITykL@k1AVrg%qV&ER$OVIC~=O5xkn3AgLZ^grN9a>sCkSBbNX5{ogOEqxFJ z!0?A&TkakJ^A|#e`I~UP`#^#&`V6tyeScvGQSWQ|+Y(z=gk=z|v5KSHdXL1l8=OmH z*KT^w;jtZvrZjr10(1c0wF`&r^lAlt-t2$fvTAB-4_vXlLdj=slR4e|iR(VGo8k6w zo?Xy8P3Am*gYxs@8+4tPPYJfuR$O_lYvf+6}TWTOUgJ>4i=>ZT4Q?c2a+I z#>TlThyYD1*Xs3CsqYkKh-liXz-ukqDr`ygA@W@lF4D&x%;Zxt+kqrGwu zLgQAkqgk{`WdHT6Zco~#t-dj+S&g^Et+30Ec$-sk1lNsHE^f$0V2_}J-ssZ%uZmGj zOS^4BU89g>(>%MCunw*{ET?V{Fq(hx{j6t<`fZ(>TbWEWX{ph;##+e5wz=4G))<7; zAVZATvfJFj?d-g)DxeBWHo(>Z={QN%xcM=!v>{xFCpBsPM0G9Ag zw2k|mY?3~T4t5J?hBfQPWK$Fs;+3E#gt>vP97Rn}{FtovrbRIpmBWTaOAA{b_acHd3ASPZuT0*oRjKgS6Dw_?njw9KI z2eJyc5LT$>{x2xKkuu|_1)8l%F%k7mvRhBdO_4y~%?FOpEp+Ye!i60s=^cWXIQ z>)k28vzl-#e)T!aa^gK~dC0I)$7c-j;@H?niL5x#Vlqu6re;i$1-gIDG5akBDo*98 z^3llAXg-b;33Ov`ohb90&kddJWJdjHmDgUR+&3HcnXT>`YmPPy^I|G~>NS~Qo$6D$ zr8T4p0d{CT6nVs?n7ar&wVTu*S;*AWfIp5xFpV4yjx3x;gmjoa#&3pVID}{8J3xOo z_y}O(QE*A#qff(8{Z@aO-tE_hzDyPGU)GQ`+o4HomMe(Wny1%Zfpi~Y8yj|EGqyMP z01rUa1-=7?UYxEC@ij=Feh48PZ!2+IrGZ3(e?bl5tYJKQFQ*ZUHa&9V%v zN)kk1rOs5L#*X;j&@j5Gvo(AMSmB9qcA>H6)=!I4T83S(v)q54khONV)8sZXvM=-F zcLefePXO(kc0>TS<2zvGp6wwOb^_W3TtBK2340i?)iu`g)`g+lVRE<&E%uRT)M3Wr z+t>$#rWrKY36z>U?_mw?PL=y<#;Dm6{~^0~Pd&erG@%N~GZu9QhEpQ_R01tczt_a3 zR4oW#Z2iB{WfFgMMVS)xS#x}(M^FDQOfht!?4^5?)PmH=hy7p@s1LgDm(xnvAtOZt zUSUXiEHQmo{sxFJI?+n!=LIz#=4j;}VQN4Q)Ny3jT@yoj35=`*Gwv>D5_QINCf(;# z=jD-&H%7?lW*!a!-#U*Fa{g`r;Q4DD>9^kbS!hW}n-PC9Efg3BqXgv`AQ8jbTvR^m z&O)?@3ytPm3pH;8zpm#@OqN5daZu;yh6@nzA_2wM68-KS2%?A_ML9L!9fYQV;vj_& zI(%Osr;10$003|pBq8*M9X=VMtwvZ;%|WEnmW&+sW}dBDpX;9r(;u6j1RVqw&H|Kf zr`CXGqxgSB(Q8o~x^Mb5kHB_^8L69H{k4%71^Nvi7c1@duoXSK1Bd^kb@H`brp^IA z*N(y011nscF>g*Pre_uo`voYpnKdDH_-E} z(+a+eUd|tnm#4Tc_lNh~n-+Dbo$c;+?e1GX^1XC_f{eTA>uG2D;SR?_&26*nf01e| ze)xY4_1Z5pg$=Y{gb&y2zd&P=FGbRu zbx}@56RMk~igv1PCSr*9+tgqsL}~9^hm}$}`R!`e1f{Ar>XvGNL-jp2Q-y?7FhzF6 z-QA{MzU4PKq&jRsFf|3rVi z55)$BdU@Z9ji}e(h+-q2)o)j^5zq7w#m4_o#YU6g!n?aI)^rs*@E@v*{{gCslse+` ztly}s*hc-s2T?zyeaR^0(7&VZq4qfbn>%{N>-~MZdi~yX4s}xECOU^3X&E>pw*M0; zQ~oQ^H$b#687bB`q}3kAI+6NC`K5n+Vzl~|@wiI+X8miF8S#*yJJ@hQ*W`DmJ8`%a zXwz!ukUYVOCo9wX5v%s_DiPSM&uWU6Uri-)Q+0=iX*2s9YZetE-7P!y+E;KldgiO!!rJ)ZlUh7li1>07k5^6C-snXb0tk_BTI&ptnwA?>0 zm-WjwcehAY78+n0Wc%COM;1m# zZ`@{M)Y)UqM3fo)`!7;u#q{KdRAuq;H)yij-Mrq19!rP%P&%u2kF9^-s;(#@o&2?Q zMQeSA>J?jkkix1GY8LC#A8V9Klax9s8l{6K=egTrV8Ut|9k1v4L#^|#QR~Rj{0r4P z9FG6pbUd<-q^^e*SV@J?J7_TKWB#GZ_(PNNhbH3>O@cezGH>5*XOWj)Z*>>SgeM~xuKrBA4#ZIcxe>G$F%S6H`sJ}n&m z#`$b~)*Z+KkUIq89u)_u&{aMjBeyua1o6VyUGd5)FRLh7yN-we7ca)OeyCG2h$9j6 z-%~BxqQ9NYA&P(3NpuMaZKR9EUr`S$(O>fHZRt+HaK)}E=9@E(&$TA^k?&jWRg(QHW`v)^r&8-1B!&sZth64z_ETa zoJYO8%%(HtshgG1i|enx#RMkHICtj3ny@9yN&5DJH_U&5c@cLO%;pd~5_a6M9r&OH zu`ozWW%mccf65Odg)51XMG6*p7X zg*N2RVwhgblfA#RCiS6j?g7`N)7n}q;EjRr^YD=1kvL=rjrA&@@Zi)x7sM99R33t&16n;5Ay_UB00QuR0+bfP;YtzhK$^(OKwHi5!3tfyxpNuy4!Juv1K8*zH8LivT17%uL~egR z56|-I`Q=n7Hpp`wW`JSB+I9uWuZ6xQb}*Wym6}C4>-{bXZMyL`y_Y=oFdDriY=Z*2 zSFqIzt_Q)!FPU5uYLPwg&yC~kXEl{x(BrV>xNESd?301P;MHR*z-T3Ps>tl>wJ&a( z$KT|gvJ;_?eG5JTE*B1<ISRlb9U-aL!&hQp zt|utpzzo4X>Td%PzeBvf)1jG*U}|Y80BSr@SrFhVpsChW_ly=8UI6SLKyF+GG69eF zA;cGZSt$64+|qgh1}m040!LQ-N$b!^!$BWnN5$BPFw5?-#Zj zAa zA%4&-B}kszV)_!4zbKZq8t$8*WR}cgzgx{3@^$KHI_hHCtRuhPvavd>6uM2^%rlA_ zZ9c0|Dc+z77i<4pxEnHvoIwY3GOQY^6=e!Nb6fQw0dN52dJ2z!F0#Qs1V7&Os|Jm)ZpWEni#wybYSZLSB?ucz%d;5EP|A}4Iwo>sxeFz2BcVBj`tDAqFOcTo^A}%lQk`k5p z83HLRdt}_dECID8spBtq(JRwo`eH1hoOTJw$DVj3GS?{g-W02B`;FPEWlL z2z(JL*eKSrS6`aqpj4Rz`H{_qrwj?=KD_Ws%sx-fGZMnM^{CK;d>DvQW5Xn1 zmg>#%Amvn}Nde6hszGU^?JTZs6BU~=wN0yv2Buk$Eq8w^>`x!LC{uUr=(uH3he!B1 zcBlBp=IB8X5qWI{B1s5|_K)^#T(s>OPbhH*Qd`E#|Mk1Z`vtsdb;ISe<*{8jXn|&6 zAwN6q_mDtxCo_FB1(OrL>$kxej(>Of?{=J7*>bbqexq250td8c1?-nqn^xQ+()k$F zXFP09%eQ|8DEda_0(>YIpnWdfGmcUd#34qprgLG3*ZF+1;;Fb6rRyk|N8uar4x_W) zY_1M$Q3DA{Fq$nEAl#dgnY~8*-*He!Z=h;_(`(CEu^-JJ=jPjah~8#-)2m>6UzM+453+Pgwv+9@ zejRdBZU_2{V%sFXQrad1jq;?(JRRaq0U}Zs3TqT>)WXuRH-He7hQ&)gvXc-PW<&h1 z;9Gy+mYh3L0wOd5y3AL%Zrw6BgKujjb+3sT z15jUQwp$avCoOkFfoV+yucF4<J8Ong871=DwkL`OE1h9zj?qD&04&wTxd65|*aQ`u;XKS7_LM_14}8KrLRQq(M8ZD#4JHz19(Th>+1Gy%qShvj zg=zQ`l|!g+uLj5vSyp_~*OoSGv7S8(!knzJ+qH-4lTfdV%wSt_Sc}$XB4@PiyfLh* z7y`&}%P-FzbOgvRP(K8YCGGIA2`sFE1EoX+gAyo^k)OVd23;mUvRBM6zj!`QmZNbj zSPJV03oLTFSnk@rm+10c=tO@FSEsnVIkZ|=C2&iOI`4F;8aHuw(=Q1vLSu!16ANqc z7Rt+}PRQLu`Dx5Uzc<|iAEHULshi9{kMb+Qi20F|kW&E`&T*qVnI+>LI@1w1nvjcyfoRM%HYIrT;23*Hh zz2u&G`{z%y+4(c5vA;LS*8G46f|-wR4_)r>?d`d3`$Ye9@Ui>PN1s4~7$|eyr`p3e zcV*Bz93RJlXT90tLdvB+4B1v+%CSDYK5l)p#aHYEfo*(I{$o?oL$W}H(>?%TK%c*~ zQEaKKavNML$}g6)Z;{!5@69;7Z(DxefnR}1tjTQ{@#6BZo|(ZK4l*tz8>G z2&a+k1%?Ow1VK`~l#>;2#dMj>;Lgq$f(YGCkffMS?pyiW;smpQUH;~#+(NZCJ$1_5 z$)_%!xt-6+R2Jv>`YHJ>^>S|?tKmBC=Q5VwBs$V{XavQsy_1+)ES7DF!kHARZNA-q z+WT-b2idFF1KU^oA!wI+2*gX-Q@}5skHOZCRu~lV5hcrN%MVJM4~1`;2xNh|aTJK- zX$_dik~s(nDLt8gsF41A(+&IEjkl1S?xn7f(YCBRL%ZhoL-d_`1WM7@2-{)El&Eglal_yZaIgJvG;zF@d+K45y>Y&(9HqGP(e@CX;+~)Mw+Cw~e{AZy zsx4l~LKeuAiLNB(J+w1bOZ0fhdq~5Ae8*80KLI+M^lIyWY;Fz1t!X`*_IvmnJrKP? z0)RPU)(Gh*4X6`aM_57?Yi|ps+cx0%gN$eoWq!etY}H$_MAsO#0|Jf&4#+)GrS?^3lQgcTQus4gxQoJFR7sTygNFSYnC z0`c|0{TU&DZ$cPRkK46QqHq%uXQBnONJ~9v@le7eILwPerSj+TG?Z-h_Cn158#Q9`gX4IU9QP&5{|m*U5*`f z?d2nT3JlWr)hq|$W)H@0sgd$E~$4e*e*+RyU z!2YqG*+p|eSbP*@VljdVdMw17R>Egjis(50tSkH0l0xhzZt)RyHy&sA{xhrQ;G^r% z!12t{HdQ$;e3;8~%!r{qf}qdq!_V`purR;!%5iAP+FRHMs9RI!#(C^rC4XOm0WYV2 z!TqIHw9DM;)B9l-1-C3Ps6NA2s6DKGEdhU89 zK`-@GpF>u3SGy^a!`hewX+ghnKTbavHTUD@=mUz2l1}c7*2uL)q$l`h92d*WqL@l} zyUYYeO1vX4DJDxi(C5C*VHQ6$jWLO#GmFGH=D=(+)+ve;dmP$09UM7`N?31yr06+F z4U)v)?D9}nu4D=Z@2ItxC&6C*)F6MWnb4$bGz=41>|Dp|OvFzN12Ows!n8jin0Q0c zY`=RvL`!Nbm90krrsZkN_(&?gE>DY<%0;5=Bdz2O-lGW6wzYE3Ceun?Jib#GkJrb! zR`+s@if>(-IOG)Z{Be-iPCF8R>k0Ve61svLtgq9aB~=P$Frfw;HpO^zr57BlO}q&g zYp}CX1*sk|M$)8wQ}A|TMxBrLz^k!o^SohKup-1d2(hIY{Usa4E*xIr1ei&bPGq}S zT+J!ZGN@NIgtGSK-Gjp2PN{hO2Hg0}x*bjE-rICONrg#0EP)?EU7rGfynbIdt}eO? zL^H1~doITn!JS?@_SipHWc`RMdc!+eEN`jXe{P=B&wM=nFJaUpJCdIlX9ZekL3bGU{P#H zjDUF}n8wGOx@81zQ3#*NWRtg#0u1s2I|AQPMm?NX&+=ig9AUcA-wuplxgLWX%}eTj zF24~WZU%h~``tx;~YlcRn}rKrOt&L0f!RLqcJ@NHCB^U_rF17S24mB$%M$tw5wKj3&i4_HsBzD3a(9So=uR^PpTv&E8e9b%#kEYtEug+@`1FwCmi z1;|)U)Hg&?ZhDV@p1*WY(e(5pN7pj<>gU;iy?FjL2Z|d~XAoyGj2u^G%gY(L{vKwt zDdVW=Yz%I(Ag7g2#rU+Ss2l1l7*XA353{r7a(=kGdwF^35OO|0dt3hGNYc~Y@ocnP zPETgL&}ewJJfE1(VuQJ{q_BDk%QoxHGwhU?yfd9G**GkJvvN+6l2hFbV*Azu=E1^! z9;`#^qVb3O1S3D(o$l3f=dk*&`>&$NIUFo(B4)LfD=?ldS*SzcDPF5k`ERhAejr0z z&fb6>u0zF@drU6Qi-l|lGLp~#&*QIO{^Og+YU}m&cVB&#X|9AvkH32Q?CHzL-?~rx z^y%p%*W&4alc$frJP|Fx_0(U!4E(txrUzOKOBq;4O1Xzluij@|pY zXYHhV*WsV9!arY!e;$Q@-VgsA=%4iW&Szoy&JO>r3!qFh$Q8D&6;*R!8Z{p^4jF0&@n9V_zsMa$45I>nb-dUTpK2&gcNBMGo3La-;bI8z zfb21fDI}jPHnT`b2qJV3HnUPQds(ExGiL6F?VR~-deQXgHPb|Be?I$MpvZzpk z2C_-^2oAPBpUlr3!?i3&!094_EJx`lXB5p{eHO~<0rc{F%q1 z=cfld|M!Qzoxctb|Ks)UkzI1wS$`BQyVl``>;EIRFJebjJj5 z@>jTKc^~ui=i_KA!s@{hp5rX~`5-&C=3}>VPtyS*FUed@Qn+JZLjwp;F+uAzJC21p z$FUF86obqK{CfThK7!r)G5wa{+6@`Yi_7afOS)d7!QEsu+Ad_)0TDPx1YwIsgkD!Y%R!)iV$ zm;K&Q*b>}cSLoW)2M(M8ZKBv!+L^14#noAPvJA!F$z~k1#^Io{n)a58>F2X@x(s0Z z*6fw*;dKbi^v&EH3&t7E9;>Y3i2NiPW}pM%4mR*adNsfwC`SS~Ll%PwZ00e4_(5YO z5j&J|ZMX!~1^UtAJ*Q`_TtK9#MR^P^4C-ixcx60HLoAM(E`q`85R;F`;1bryh6Ai* zVWk{o?)W@x2>o;>L}fz8w*0SHZ92C*69fYH4=@U+%YkkQ zptgboWgw$7gos6Oj-OGapq-s4tiRUB12G$M>okTK2fp+PE>I22;pQ>;Abt4!q_2nN zKxAh>(G%SSsn)b7MA1ZlTdp7o-+k8|PQkabYV8_MouZhaj#M{BfY4160X}vGf&igX zK&}z2prj(gAN0{20_~S6qiw}5z0}W_M^PT_PW^m6FdcasW)1X1<#5YstMxl+e3J)R z-+pmBeCHF;3?!OLR4N00?^+k~Gp2|!V9--jQL8vuXan7zh6#>;B4oe<=IP$#*#Jiy zWER-r@Nk1XdV}hR)QG<cm;_(hMH;W39u-I^bYGl3Gvx3nq5rrKQ2d zatF{ZEf7FfnB*`Lwl9(w8F2vB1B~hgc42xOup^6Vy_6FVPVE#TU$|0bm|FxpzMN!5 zisPy`D>L3i_?`;s2u-y`4z35RX>8EoT=HmSDO=W_BtZ z&;~d-C^1mVutQ4*2iiXyhnzSO_FJ&Kg%J3A@rof61@*IG{-x{W&JV3_}bL7=zn^cUr$1Xd=qp|!j7>^XVLz;<$ zkP3p)IL-rqbRK#Ksx{}E{uU9>AsEz*DB9ts%PB-?Ac?g;6yAzwZ{>k9utrk0~3tGU42(mI9_!u%FyAX6*F;uHeO4E(Rn3*+evm1 z0|j!y2X3@cb~l7WPvUtM&#Tda5nptith`I31Njnv?sfRrjhD6`;rw{!?=bP3%`}Ig zl@4COme}!7lpYd#(=2>#hr*^)l@AqJ4lkO|=z9K?1%OgoQUD^@6~$}vLK6{GLA`3 zA9bpKE)~9KKr6|P5#Mau@2#@>I{&)Qrf=BQc47nWXF-jlXb?KaXpA%*dd+NSNE6ji zF?B>U=Yb#3E`Z$p=f%wOwgd#X&Gv+6Rexvs_uGh2wSD^8a{aD_jc68%?@?-5jq-Vl zcx!vtn}JPc9@-AGS>lV;beUhVUE*Ux-@J`~x79!~4pbhG_HHLw&CUx)z_}46Ub?r) zx?IfMcaNJ~QZ=%z3-NsP%^TU(S?{_%1)E41o|Ra6O$?ifHkcOVxhem8li_4O!DDxS z4ECF1bvavj`KHGxRG}A3Ot@W0$k>s><7Q!ld&5flwRu1+#~bIrajV)aII}BOTt5k2 zG@I8%qZ2TtfjJ(S^5AtH7CGKi2aCrJqTg6g1Y9A2=g$^CllSz2?ZF|B_?})j9(EaXCN+BlI1H5yjskDg#7k@3$_|S zEr8!fvQ7qZpZ_+%)U(u!s(jyNzr)=I*FjvMXwnpg%Li2FLI?bJu*tB+s)Ms^RkR9w zTvqm}ZI#MRKh8AA^gip1S@wu^A4t74aKOAnr9#`ds%{D~^R0E5IgJaRdOjqL3Vd2q zMCTY?O8xbfyhKvdP_i`y5`zDK{gCY~$I%9+uEd7Ry}^P#DTk-S5fEFSF~g?$Ox+-W z$un;p;gQts{0I2sFnjvw{?kXo}mT~eck@Zu^4l1#teWI{fF3Nhpxrq0wK zYML6_m>x0{s1rqPn7=c5bUz}G63anmwT>AZcI-OdIR=fu=)e@?yK%qv;F}t(G>YGT zQ$uD^rvp+XTAfI%qwW?;t&LW@DYa&BM-rU6Qcp?|1>1YnP-gcsE(;DTE)-i2JHb;3 zHnk9ag2e|GjF`XSjzVpJeOQ##+DCOracoY{06*g$DXbHLZSOGKnIUYxs?PFxaUT+V zxidVOO_z{v;Qsz6uf^c(f$HEG;ZRnf9yEtwWU$ZhFCh-2)l>bF$MJQwq*^p_Humv4 zg2`~aswF0*%hQ9HFIbKixoDAhBBusI9vz#yTl<5C4WvD1b?f$jfUIS~`U6Nq6h?IH zt*m$+30vd_dMK+Af{8QrvMP`H@Pt~CpX&>upk_l5V6SjqUzJr&oXcZb+9)AmL`YdT zAH;_Z^I=@sWj;98n)%cO1IY=oxlejV0pY!7O7>+9udxqyleoeW@3H=Vq-`j!`I%0D zTod)=0j@p;4!AsjwgwMi&Be3;KbVcgzTKfZiLXXMt{wbi&oO1IXxRS*H&f$fm@rI| zgly(Q;$da~ypPh2b{-8F`RA#6GvL>>L1t~rP&dhUqjKW2NanR;)fMF3a%BHnBl*6$3} ztKD{Wn_$D#9Fjbf-vml_0{<0soanl%_wV-x(Wa&vcuSzIxQ9Amr8naX=D}WfItG(lK@iuPlXG*oOi&x@+cPsM!GllOjQ z*DzxJ_D9R-ej=Z-SP{pyK+ERn`B{q&4s$9kvL1#(BPYAwc1kh#&^30i`U!cV=O@T2 zYP15f{Z21^DUN@&9G$N9SGHlq^<39?1D4p&Rl z<)XiTH^>hDjN36B4pVD?Oev4tdc8yGlyE+zo}TCB0x75oOU}U>^m67{$VI-2NGgd= zcITRk_uGpP!eSZTkz3RH=5S7zgFf{<;4a+LsOjyI4#iR%APh$}-g;Oeks<~bxF4f_ z8lfEeQoM4iU~m;0c`b5Xc2BeptWy`=Kw$N zA*KUF8>!y`*ZSq`ZzOmghoN7HETz0>FTM7Z!vJu&841ZijXj5_LmFNXx8o2ZV9TL@ z!LHa39DwQ25m$6fMvXk1Qy@_dB_TG!7)B*>g$X_<;LVlWglEC5zYaNA9LbUP++jkZ1TdN?LadmVM4^#fwu*#A>!=lN+7(GFUO)HBHKu~sj2 z_w{V7kB|1?Z%RFGpPYg6zQGwpzA$`$wX*PfF*D6qiLU}&BQC&;^Y^kMn51&wP0VS# zp&xsGr`h%;sI)75jJ}dIIplb_$0TGt4xKr$4|M3@Mnmh^0YBi}A!U{|OhUk8lqO2` z2m-VQB@c(#v)VB$R)FV+C%fk`-t4mHUhN(jfEy67HUf{0C|s$_;3U)6Cbc<#!b*k! zYd6Kd3Un~rwQZ!>3fhE#v)kK6t;08w@2vJ`pG4DXa>@=K*Gw2?1HSqOlf{G-j3jl&l`T?3t{h%G&u@dc$8!O-?WPsdd0u!LaceYg`cN< z3n$9LDw$*?0m1NS2s%S_tDfP1KlV~JUdGLLp!52#V}`g5B<(r7`L~?1l>R2qIQ*7) zZhW$d@WBZs#D07qK-Shwv9{XAGcmgvM-_8_@NYv6Jmm?VBU5aMsQZSZawmDc-RDG5 z5ciXWLmG0r=a4miK9rueO=`z{`Zljf7*=H$Y>EuK@i&q#yJrlA0n|NzRsXhdeFG%| zK{6f5cOoNA*S`)s zQt|)FySK>4L0fn3ZY=l90f{3yRI;Bk*igKj;WoIseF!#CF19Tk z0fh)Pvb(MqsCE}>q$=#Jsn9$I+Ld?+?gEw+1@3ZsnJ>mR+v=|cu5=bR0l!D!eDDVd zCPDCSHxS%e2ZBw16`IHB1cKlaOyD<=zmOZfNAZ8EUkms?Jg&sGbpcWcNeXdC?~Sn2 z<;Bvi)jiI`(d>M8k{?&QSh_>SJJ9b=HAmptZ39~$zKp^`PP0$5efZagv7r=_2$7E6 zoo4@;9bhnYTy;P;0gIob(++Z)~!iqb-aAvpoOxU)Nd48-Nsb?UB-eE8<6yAk_) z+m?gJw>4-snpNp$+$tnvJ3t?AwcESV8*tTyJX^TGnEMb2+1>qvd-v|`AMBpZE_ar* zow0-0oqT5j{!PVr2WSBVft}fO2hM|!V-twLzP>F+%Q{$GIyf}Ifv0jX7F6)f)7|~Q zaA3&tq@P`X!Xtp2v&gpHsqSUqng-AYWey>^4a%-Fz<<>RMuuYpI^Jat{WY6qlN_Q< z0Hj=L?`JK&pWU$c)jC>BP}tqYV3k5UcQ1FM5+rTuvuou3?_hlA;Lm&b??<2P4Lp5Y z>&mq_+gUVq=89Z*)X`tt`oYTeUVI?k00vieU4nTge|L220 z|Mf2+kWY7JZ}Z7cNq~Lt29RA$Cgr?Jkc9x(LHN6TJ_m92@ZPj@|EyyN@=R#+E0{eXuuGdX-Zj74aVytqE2su9 z;8|3EZ533zI+xyHJ_Fm^c{v_W3g6+mbcmFM?T~ABy*h5g&+Yf);-|7$JiJ)=Vt2D= z?o_Vu7doM{dV^zbfmE(E+dbGG_y&`So96Ls2?;G3`#o;a?%luO;{EEl zrT$c6$?@9dAJ^A^EE{m#X$OvZ*~fMdj+1i=(Nc})nP#Xg;ycry&M;=s_9jS%I;dfP z7$issSs3FLLbl}PM3KhT5--e-@Hd9U#`Z>`yjmjM##Mocm#Q)Z@vb_MdYt7Ghj~H& zLdjOkpNec;o?sS+B@0^p%*uFXd&9rB&aaH;XBwnt30b@RaFE&2?Z#bczMFki8_ktE zKF6~ic64aJO1Ia+6YXU(3(c{GvsrY1naxh~Y!+Q+Q*XZkHIX7!C+_)wzoQs@)4D(7K z?Cl@y?ES_4|7NsKC?Ny0 z`}g;#BK--XfZ^WWJ_?e)%sC{>i~J;ClnPr={h?!4Ddz`|A@OkAKm{8kDROnNbLHO4 zG13#OgB@F=n#|CAV!YZNUzvt~WwrdaIA`k{D+P0X-WkK2KVIE&J=($C?4E*+;QhS; zLd1O^+(P2y*=|3(zc<|9w!)8KYjm-%wBx&X|5LX^J;%Z=&OQt09_@Efc4UUWda*3# z(L%N19n;5d*53!o9qij3{O`7G0?*~@Q+LYJ-wysFK6H zIMDS)3kN#q-fMtN9X33zo%?3$S_QhgpWT9gMPQTpOfCFijK{98{CqYYv$n)1oB!XV zNnTai*XXNpCwo8+D*Uh51atb#0>V>fGt9U^Heqke9P*a?tJSys@MjO?5N24jefW5>pr0?`uj^SsGZNMk}Q)?ZqVO~{{Fkjb8pt0tdcYy z2udn`76;42jndM=&u!uQZV$5CB*2H?n3TUg*u2Bz*%kDF24(Pn3%nKZuX~kl(j5qi zu^Sd#+uuQZa-%*`m3q7Tp5tOL%N6~0u~?q~P#Z7H<%Am3Z)9K1cmB(l&%RpURX$z8 zGt0S_9onFOC0m4qhVZxmwf@7WFxiTyk3O^+q?_>Gv{+CLv***vN>e0nw40b*S%5e@ z%Q0;Zc3YngrIO@-MWm)f`6Y+h*Ekcny&KMEQMf%X-U61R9kTx4b$h_@2f`XIbFeVa zY(lfZ?HIi|svFEq+?NC+VTukk%TU`I^c3?G9{6J$_$?dwX%d@+^h;Gt=;5%jeX+y@ z7e~Keh^f8uxFyLfviYD&?6k*)g#LIkJlLQzonA?#2? zWi0d47&TNKX*Gy)P%Pyb{lgc;2cTq_u!(8`qcaji*?0*2uC)j|)NA2)t)!?=DF{|`6z%gF4fxGRzOKzrTK?(I>4^EaoELb9SH6XPE* zD#?h9c#Ok^o|qd#rg93LSHyZ8vH91sSOC9CD~+eaXCiFK<`La=)^2 z`UHElry(D8pT`dO5GS%X{3|7E=PxJuXzB2fNzMCzV7UaZn_PqSTM9)GD46I;)O&}* z(3ITBc(4n$1oYWA)of7H5EBh6=_RN_kXypk3UeS_%hGAT%pE5%;btL^3cC=^ zq_){o#zp&5Y`(&#B^~jSsot%I^+5`yQ9+dknu=}hD!;=5@9Mx8!Euak?GC=j5JT)7 zP?;Ei1bP4u9s(3V+<^lxm+pE%R9q_G`7Apt^0y^(Biqb#EXud}GP!4FvUbzVbEWsu zv4RJCFsk1N$yI~*)UFhghPgWmvX9F}xh$IanAAgW`IhiuZzm88Nr1Up>lA@|nkTd4 zd=hq4+mis5*G*wooNM`zJ4`eRN&# zgE*>sH`E7}2HoJNR8K?(H}yoNK~MN8)f15^O+5(_6E{fpbd}y9?&&J*6FF7PHw{1vrqQ*SXJy`BZdvD4^4ovhl&Pxcb!dS;3>w&MYg^F;k z=!1xFVlO@r`j5-E%Rw$4o?GYj;9N#;sD_F%8%Td`c$P znx#4dw$ZNf9d*C#GMV`7(4Dxf00Z6q>&0Cp~)YN^q%&#OGHg$?z zOM9ox*d!Xl4g~izar#~+9umzqyrg_L7ftI8C$oHP+BSRMDi$y@0m-y^`zX97AwOdO zf`H`BxU+N5Qu91yxVSfC6h{fzW`TIiLZh*b{MG@6Z4Si>HZHgg+i} zts|arQ4!En4f@m9F$qU#kmK2v^xrbb7qhFj{;{~$HHjE~@9C}|Vy(8`rABQ4mR#xx z=>gahqHP4NVuomu_4^qRfE})X**%oawT;geY6}GMp*@{+_aFps>z&GLosVbB4k!O; z*4pdqD)@xpL0vj?IjkgA-?o!t2cK69#P5ev4(q;7W8TA~_i6uQ-^0LdeTen&W}v zhemHs7nIH+pQ1z?av?7<88UU0;P$d#GR;)Z!r6Lk1T1;Z@q3lcQv%3xc0>TFlwc%c z0Px`(mKDbUpjwLKGw)?U>7gDlg9*2Pr6P<^ckjWB3>%H&d-Qc|#sX;5Tlf68+w2@B4c zH*OdpyGU`FQHD+5NS5jFoeo5b!0C+YwJXO!OL$xqm}h>NT0R6AV<}Ly0X#)7C<+$% zP&XQFu1a!%7a=x(gETMU>qu1CWaI=|!qM`|Ru$hXGECzi3SsS72;dI#X=Qe_@}>Yf zr!0Gvo*v}&aV*XxDMpm$FK1uKUG}c|ZkB9F>0ce{^m~SwedUR6c}NO5A$-}PD-)<| zcRDMl6-0xBah|w$0NBWj)3c}37s#$?=-2;x(Sd~#79b{nI~ilyBWAwtu3ZNk{zcS2 zH^z{SLZ{G0QLjec5h>-%5)}g#)Q_w%-AU%#w$hna^0u9>(y>;OPJK1r#EaYc!`9=_*K4 zNSWvsWV}?z<$|t$venAAQkPZRrvAD)yf0cy#qTG74tbrd%rl2-){`r5696LglU0E5 zA+!5$W0CF8c|IO@TJYU?#dm8<{-#(!m@BjgbO140VCDfZmuymkshu5o5x;fwc0Vu6 z^TK~9;VB-?rsJkZ2S;I>OkIF9H`*#AB(xfWG3@&NY$s4g-w_SCW~Eo9G;EbN&Z%)< z_sDgB2hQlKNhIBPJ{mbvZlQkvs$X|o=(^a|)y9r2Mz8MMxiRnF*DjKcA?6($^2rtU zd$6kS!K!5sR_pd)W%po(_QT!x0Kv$0vEd%9%pNo}j`slFMuZr{G?}HLGRZtFJ3$HV z6>3yhroEv+IW;I-XaOq#9brQb_riG-Qt(=TdPA2a@z}SbY>2#U4lE=m>nm{op3mO0 zt~|bAZ{6dCn^$D+H;mk>78{r|*I{f(A5mqusgv6s7ELwHs>>zrqa(Hbk-1GUZxyD& zph>g186PfvO&oZ^9N##)-666JIQr97eHWkM$aWiHf#Ft$uk2fQF+ZbiaExPAwlZaZ z{P+b31CAnWa)R9vjI&A0cCGQMsqw1bI6U4_@_3mcOrMN$iw=YG`9$r;1A6iCxYE%1 z!mymp+>P`X@t5(^lJ#0`yfS5fw<6y&&nu19hzC5mu7sRK#}7t`JK5@JDkoX6DouAovW=?xh&fVm=$POLLdKS7~^eJ7DSI;KuD12okWT zVQP0Az$ZWFR}Ho)cj9oZwHfU1-p2o`bUNex~?C9~mEiu_MyN z-Hmi@+n!TP2-naV$04{P?kR_}47-M&a6&scpQD!P(5k2&$hUBWyHS5uFlOz~K%{O^ z%hW)J*j6kBt7(J-u#4?%~dVC*@CUJqgRa9igjHfEv7{?Dw-Ps`_Z$mv5=YMmrOd z7Ocd8-yCx>$>&G{;-k$*%BY~%#DR4~HCK{lHQP4HAzGpPC`7HC56F2_e72hj5P9De zL6?le2>~^UTg&RXU&8k#ik)=lW@6+MP+~AQPf~sgOBgO#E^Y57*1KzeMLVBiUHl$a zbqkFsTFHMda7vuz>>v)0tEAc4$- z;k%62(y@USSKIUv3e0_f!|UXUtHwTk-Zi~FOHj8g=w_C@s0%19;2MIXCaYv>W%U)B zS8m02L&lKK&0(k$533CPyaqb*z|3l32j(}DhV+xWTc2D_{Rg&o1o2BCYrs&+A%@{_ zm?3>Lrbn_c{(95dWok4PN7G(oeG+-oO5kt)9mu+`=x@DA;59aXo8K0?EPbQDz~Cc^ z^KB5B!#SMii&Hcl;*esP9?Lx{FO0$*^cnm~MeC6=N1E`5yBM{K`cA>CR_8Bq{bnd` zT%(0yS1AR--Qaf(@B&nlYx)b0O&%)ZKBvDM6q1Lw)GH>T(-Q|^n|0~6r(w5&78SY% z7vk?NRx({54EJ1r^ZntTRMy~V{Y~!Jz@pA=yQaSWMcdXl$FlAo&`GpI{iAx^pAQZC z_&jl~PJl1hq+*Y<_&&(@X1H%(r3HSesq_8g0&I2xL{HUEY}W360c;6@QqMSsf@4qn;msJtIDfn8t|$+yoeJcCMVCp+Qy0pXHD9W>y|Pz| z>iuz{Zg`EP#Dv!2co$3Zuaku zPEAgX)7;i^iZ1#OR&6tsLbYGvw!VJXmsKAbL>hrXT{pZ^7o`NEi=I0x$(-2?(ir#X z-(7ssyhwX3pw@?aXWs*(AsRYN>;!Jeuk>AGO&L8 zcs3blw;jCSzP&B*rT&k1v)l74S8BdX0G5Uu>OC@l`NefUaTo8luMV?%Fri$|ICZQ= zi3_4?U+|J#O<5gQrr5Q&O^{$Hsu)@@KEkr!`+x53@rHg-L&E!EZ4MvcYZ#Bue!K-A zo1RvG9J>&M9tTawUijm&nUsCH1D6^YeoV&tfO%Lj;<>`A3Otd6{?+XJkz1}x9Jm9j z$f`EXn}5IdB?_dJxE>AkLG4r2Qwk;wp(=FG{cK-s5eAtw;< z2I(e1-qagdW})xL74L=REE42v{g6CxZA^4qtZJp<%UQBClJ)3+AkbZ;gT@hj&{;de zb=cTVIc(|%Z*CZRCg?%v(c*5j92>Z)b&nER&aG4y5@{2jkPf0-dzbd{Ws{C6CTZrlgiw_kdCM_&}aMS-vJ~C~G z0iGdE080=(?;!1jEvEezEcXNaX)Ob_8pv%zYA6upWSpQLCYMwMd=N4VZt08YxLx(R=@k}5uny&WfT(F(e=b)#;~Tw?!S+WnDQ28-o`F}rCv zNVX=n)d!hB*v*eMcp3l3G$9%$&?W_R$s;e9r&3^l!yT=M`Pwi`8`j1M14?|73%m&v zFia9!O4+ntXnWo2lvi-syf$B)@Eih`Z=ru)dbLfZ{IRsB z$HnpzXx*fOx*6GZL3NW5&4nJBjNTo3%Ml(K+W<<75{RPOpHf1a_itcdylsmOr5?O_ z1OLu{C5*)ywuHnvgcXR(E+!`fhH^l=7SH+hsa`j4(}wCS>rrrpjL zqxe1#(CUWMy>k4M4m(Psf26fAl&A^WNjFs}II=g&@?}PGAa1nD5-}EvH{JX;I9_KU zmbM2|x8srHl8NPu;#87=$(a0fMin({pe-~n-x|F@cQQAfKsc2?__s|Gi|F)MC5r`Ef}L+difB%Vs*N6h z;;&vnOSftsd7@u zBg@d_XV!&==|;s|*WTT&IzN`?#*`C(T*HsO2eLiqfo4;~yvMKayjXx{CI?!cgqK2) z?qz7;nSu9+ds6{4_W6^;G}{5iuC^*L;97iRRvf(QelCI3ls4|_kSvjHr8`z2<`YVF?E$d9y@+CwdBqBXrB^$9SIuoDX;s+aV#`H-85&)o)gIDAQ8@ z_z!X7hY}}-_Xbpo0AW?_qU;SLl>Nb=evKUSw|5KHO!!@H1!`h8dc*#Wo~-x9g1(3M zDSChOVhF5tROk4ZcYJSh6u+H%g9&}4-v0xIfm|CantCf+FCNQWea`=X+#c`MSFhQH>dJ&OP*L;dqDuP9pD{+uer>;cjLL7C`fLtSpFgH>Y(E4$i2 zx7)H(yFP5=SNC$3S{qfu2|$G!>*LDPYien@sx@30nO`J>37BZBYpyfSqI+JCdWl@i zNyk)xlR|VK-tD3BkA_!&hkx+LqAQF4p~tEgk8eKc5oM8YP9j;c7t{5*hTpr`)T{$RDgjb6uB2ZPnY zHmdi}mdp9!?yl>1^ahN`P9| znJZ4Ya0OZ49U(;Y-v?R%>-1OfVMQM>lZy7FQkn~gz4rxwRH2{!nik?B`!w6LRraU~ zuK*XY?}od;ab-@p3jM58MXD7u4}27)9>A;vA2D(MAKBNlr9+WV3D4xCzIk>sv(b!TYX;-0*V z$+A*2X{kSdfX=xQuu^EKt0p1twqSUtv7aR)OK#FHhsDs<2Re)EgKXCgdzzOd$X|lx z^PCbNK@Y~J&(h>~m?FQU`4=Q-(rkV)2N-kD0ftS0^)CuaV>-ve%W^t)&lPf*01GvZ z{$t9?<#;>x^DW5d_9c3^%NH{BOj;qox_X`byb3;li$TFF82@$XF^|jW>tG_`@D>07 zlUf|u&ifhO_p?n{^3*DiXQK;P_waZ&UP%M2btUkQf31SQ=J|L`xALCer>oE&8kBUa z=u~g6hAA0}xxO|Ju zKbdcT2a0`Y=^gCxm!Tvz0)2gcT+JpI%i^{#ep^=MaXEp!K(4}BIUW~NQ>=MfZ|^&7 z_0yF=l-)eJ+3XUGu+7p13uQ zcen6jN8aZif)eR!^a5h)>8B1tO{lAt{T^Y$7vk^&_ecEj?R>!R!YAk^DOr?Ht_p2` zo|4m#!gLucC39)YsXHAUf?_;{Gd-JKwr;gg$^!2@ck7QRUM*QC&RIx&F&_o`nv!T3_H+gb#N7qh`lw0T`fW#cr>xkS_EJha21Q&sn#^p&lLPSVa$oYn|`DRa^Jh->FS8E0Y0)9>p*3#<1M>5!| zm`pIihi&*^@4!dGO?meHm^69*wru$NLZdy7x(~)t|orb3ly0 zc)b5{^H>e79_&AU_~%b#tkZ?#*Tc~s?;rg2NqvrwzxeZ`Cm%PC*3jz7-WMM|f4L{4 zK~fb*nuOyyXh^ku@aQl19ygEI(CX1gUp#W3dA#|>Vm^uBk3RY6L9Lm)-w(cMzTpk69)I%W$z!;5$n~6q zROPkJ%?c~f?LM4xTI3(4&(|DaV6mT?_8Va{KLN1t~qiE5J!+A56ktbgq;U!MGrKNZdE&4*aCa7I#+KfMIGI@C;LjPy;ioKt0f3z&u*LT z5)k0Wvi^YnXBIw%L$7yEf4sMH^fK9>ug%}eC5Jt}!ogpg9&4-1?o$s+*z=L_$0!4N z&cbz`1#9f0Dej)y4winkOff^BVHW5!>2HbOsmTX%!y<4gJX2$nYe=~^3hqg zgzW9EDUQo12s+{L4GdY*(Y5w%mJ+h-&v6b9{fxai3V*ZoudgP*+I6Kw1s98n2hQ)@ zA1n#c1t?tN?5mY^kKL^aWRR} z8crv;F~F=WE=KMKWEhVYi3X9FQ)E@gn_WOSg`9K%dvztUrgM9Wu zZVjrn5z+4aJq!8+_cnW`zN$aU(|m3&Pv!$C$D65-9o2RG?vvSKgr-D$_w?J}i^*(M zE?4;ZKqs_I#x&>o)l-Ms@j0t-%6r5-=U3(Vf5ka7Z9ut{QVnBl3Od@tw^o@a3O+8x z0U{Q97m-TL%nwLAOoSkyb@_v$B!rT+Ezz9PxAflN@^FtJH$?#geWY_8LIg670}1){ z(LB%cw}4U=H@;(cql*Qo8Qe>JK7)?mrAOM1aDu@mLkiE#Mh~Z`n(&zeQ^T)+FN@1y ze}^|{7CffKTX-4W^R+Cd5ZOth^j8@CR2FAgk(A;m`r`xu+FT;+`*-LbLKk>RrsitGnwMRQm?Q zko8B`VW{>d!)!4f?2r1LHxn+~udtane;DQ_o4Ls_is(W)An-jTCFoN;e2bby%oy>@ z$}6SXl+3W(Hg#sTA9LgxAzxS-SRt~WO1&FGksn(A5-XBXfP`Vor>pSh zIuwMAxHn-DUB3yO4-_bA@?X7HAOseE5sC%^l#-Ku3gQOwWMRWcs^R@L^7-6hf7O{V z1!@7qY(if+fG7ZgU$m)+D?%b;nKcXxm8^~UMyydeh-H_H>rZMqC|^9J=*NH8{;-Spgj{fre`Y5^Kt<; zJZ|vY2x7N!=-Xtt4Z`>1+45}I3#_?-iED=YV2$x5zyJ@EiQI$Ko){?*e~KRI+)DO0 zC{G$2uy@f+&fu+^7p4($9lV_3S@pGzpxN*yQd=$bIV6(q5QG<8V|o*VdEu4@Ar@Rc zLia&EI%&JRlw$}9Trj^>Bc=tp-@8+CIC+U|_pDxT%cyUZMh;UWj%P2Vps!+FX+RH7 zBrf$Z-y|Vvx(*B!fdn@Ye~rLogAW<$k2!pwOOV4e|n^CRq(L2)iiuM zn2i}-suPxWcQ^Q;?srLPcGK)-)GS^=pn6NRj>k;4&LC&^!M&r@;%|iwR4}o2#x~_i z*oS(&27`4-iow;Q#2EZFNRE*{I-4V-xkfrw#ya?lQfM@GTZgsAdDNpKb(;jG+DLb} z!SIdQH#$wiCgy1Ce>`>f3|!c`(K8w1kQjeNbrKzHjz1`KL5x4l*N*suh99lDJ*HMd ztD5SoewFS>=k?)zD!f_QL< zYp42(0m9o^giv7(F2WuHn~MmHc#M2Jw(58Mb-Nk%ZF&Spe;Hv~XHT9CtnS7eIRe%A za*W?MlVG#lB~m9jR&F!8X{Ep1#WIJh53V<+v#Z$T1zFQF8IlD|5O`yagc@eLi5pw zUjKX!oE1q0f5dX1rlB?sIy3~txGF{$6eoUEP%es`m4rUDy{buHdWV=hK9OP0q6cF7 zm+TmTAv3hfM0T!nPw5+)X?|5A-3Fc6w4-es$a0Umg#}XK=p05-?@$fNd1aS@^OaZb zg6cfGMd}rm>ClNUeqg*lLLte?0rt#i^(_F5mY2g^&xASJl_l zu7`rG9W3ZY^=f`by+r|6^KC;-@jr!{WJleLBu=V3l{4zBL>kmW2Bsbl0FIfXf)bE8y z%X$zyf47$VkYv>-F-ZG!} z2K=Of;CeQFna_vE<#gN!v&CeaGuZWkZS$r3f3l_#E{R)Fqi^8LnpVr%Mbzpgd|A^9 zHWY;&t|hg4AEdBpIuaidqavzZ$Ryy!I$sh%bKQ- zomWKDCFI=OrGgKjMPTMeg&AcjyXL&c>z>F{67W3;O?SC_Z|kOZwLj2x zdpY}Wsl?%rFiK9X)<3ishckj|ki#$O$#C?IY0pQ0!bFgIIN`Dw^P)wI%bWP zGw81_+Eg>l*Q|i2b@O({d2%p04(yU-jfp!DM*K7I{r{Ya>$uXZrdB)I{_E_JGnFOM zPVgD{ls}vs0P%}{4d8C>F7a+Vc-v22GG|9QrAJ^H#|=Zia1g_k}Vbue{rU6 z3sfTRI(oqV(O)^}O1$hE1l9NOkA@yz&gO{@2>#4YKcBJy8%_RcUr&q5%@=K#!KBO_ zgxP7sk+f|NWBxiTU~?e?uAb`_DnRnCQvD&%YKU`mFtzu3`zY)I9wwXH&c4b+Ni(Ls z6TcO*TW5|=ceU_kr)}xHOns^ne^fhaK!{q<=^_@udDoSq_<89WOgnAMcW!HCKp9WR z@oj#v?AyJ?>JDX0F=|Gz>zIrM4NdjLAm#*LL(Uc!U%Rb(ped5om?^1QG5l$C2?n`2 zws`c0)51Vipxssw?2pqesAPfyP?gmSF6bM%fw0j~Laau6rcCs9+ zpd;QyY2uAGxZe2C{m+^JLMw_kHP|wr(R>sxxUP&sXk1bHK3Lrfe;rWJB+>L|%i`P- z*7>5GtTL=%I!%PNN(SM|e|Q+FP6OFCws;i|bA9C3VVWBUbW^qp%d{}Od&Bufb=I%h zi__bG-Gn1H!VXP1(1-9hSS(CO6mTLp!;~=_qgJ>PUQ#PcgO$Rqk{j)7{OM1=IzR2n z@R#FavdnvQsX%e=A8>|ctnlA%L?zMO>t+#^g)6N54^w#+SC(*we{K?FKomru00~NX z+qZ&+C$4Liysd=xjsj&)#V~1aE60z+>utzU`0MH=Go5|ca2o>m;7-&f&fNJb-T5l& z{2$o)%5=Wc&i|2yb;b)urwt-BkChh}(=d9rE0FFQ!b8^h6u2~D^moS6jpUrA3XqHj2r}wVOS&nYZnIz}O>mz=YNhgGj+@GJz3t*XK+vA-qoIZZ_>dT*Iv-3WF8^{)H+ui@aGuBU$PNhV{x!FZB zOCSv>aRD5AhS>`DN$sY&Z-#sOl<{Wo-K37!Xfa$Ce`6E};M0P?fD>_fUIJ+dtRV-} zKZdzD#-|HbfjzM{r_uKKR~NoNp9B~}WfT13;*>tcRqLb6M+M)GwtO%^`u>^Qn7HPC z7?888d_m{!@uw@u|s=2_q3nhC@%bN70q3dzCP#hfDBGFN?y z3gbaT^D+3>m-I^5>_yvy6FfO#6M1_ASz8cW8W?}PQ_7+xUY)R0&&@GX zrTy7ulxCJ=V-ROj8~@oQyaK-m)C#|Ee~5PON^yGTu{J_y#jhfGuz(c)B!5%rJ|ZLKQI5#( zcxCY-KpkBW)^tCjRw98HM4n}f*NfVV$(+b0;xsF`cxa`=F~y$GX_ zsw*2xwxmL0u1B@Cz68fIX^s)Rf1X11xA~-2iNh((=IGeQQZ8KY!cbSlpn&f8i;LxQ zHhtvqX-I}^k8oogxj`G&*Le@JkM{QJ?Ce9cjSJjDzggliOR1bxgeeK0BqT|np&xAi z#;3(LhV80mL^zimr(C)`!$eYeLok3625?Qq|1Ou6zeo|S?Mdy;wWi@gf3_>}Q+oGi zrGBW8Z&vGvn)-G9i3-2Dzb)(YUMgJ-y8CbB;^`|VAHqC{b6+nVfv0jH%yD2yKLxmv zwd;Y!02%;H(L@($As|s8Q2q znd~sYbO3<4dmbk)W&uaae<&egNN#p7BZ<7PaJ(q;H~vF|8Ssq`f*kP8LFm>>qyp>` z|EO(k&V?ly-U3;$&p;BMX51}VNJedFTOLnVCten;96273u&HjCC`gfu`36-fxeoSXZt3;L- zKpie-Z|OMTil~$x?BGOF97gXWKZRGXuT5|8V?5G*0bAe?e<(blk#gV3*8Q+E01-#t z%N5c;sc(dx*B26YpM4le5}#p48VHlnXVz$YU~Ee~_p$B=z?3=$F(kk#8>Q4YN~D@P zqtO|}3?6e&612h3f;}U++IlbzMEHSRQ@R_3yWq(;nTj#YLK10^mCy340n$oa4Z20I zI1-@o^RLWfe+r@|>JRDe&=}z;E3;3r@CX9rn&)4K+#__p%OU@v5bz75tcK z>|XV<_)+58H(5jkSI&?9<7*%_%9Pum@2PV9`l#stILP+5?Gx*FI5dFqu7`nA27Z3@ zfr8U-vPta}&H`wO))j_MD(jCc*;)IUMVr^@;F`C}eI~3v zt-w=QW_!@BtBw(565>GB7oRQ9i}O9_xddWq(O?Tog%^uhMx`CVz{}zmtc%Nb9VFw_U8j!?oz|3tzB@bjic4gk7 za@^ApWi?ls&dx%yG$UZPK(e98yDk(HwQ&%Y=v%vsBowhj2Tcc5z6fr!0o;=*qE$-8H#{`QAt zEn^>uhSu|=irgiS?s28A*7Rt3%ge;0^^VL!8>`UDDAVw&JR+Iw)kxia!O~){a?I>M%=Qu4BoSXlQ^HFM89H ziAaDNi(YybJz*88S$b;1w3qB#f3p%E0NAAhq6xAo0;aaf&MuBA_L@e&s9`0^zBzHo zToX<_3*$GFfK052}PyA2^dWiEdh!Z!_%VB9xQ>q~@2@NpCkB&Cie=B9c#SY0T z(a0$@``Hv6nIj-4kiQJdJ$f>P$d81iek3F{HJ-Oe8OW)AL_+pX;sE@7Fh2 zN_aoIuPJQzt1K?DI#V-R2)@WvDJJs+xkAuNv5~`Wq_5}e z8Wxz~o9+Jjlu)SqH9Q{ZU?gOE9X*b=qut2tGHKIBfd-2g?Osy93o%l1K;t0^JF=L` z{T?7D=!!@3EgWW2@l?czLH*G94YOd8@B_k+%G<6cK5;53ilLfi6mQI(&b+*Gs0dgU zcMf1c2CDLY5C-foe|r#Cr|l7i$i(;d{Y0PNQk2?+e5f7SXXec17 zKFJ)Q?aX9TM!>a!o+QTXrKF6m)zHYX95FVGR~1HPYRK%9s98()ldOALPe08iQKIX5 zg=8LW+g7q&$0^n*?lzbt_{XCe&f21aQ&ahQ$+6>Yh;Jo%e>y}wlX%Vcgbk{}C!K?o zaUf}rrQn0|u0p_499GA0=-hwFl4Y=(Kvh09gG@d0G>?3(AKa(rPTYOwSp-~`*1@2K zwA$KOw*rK_zVBKzY+)2%x_xFok&cx!c);EiS98RrMqG$bk=b!0gLJ&I=JG&F3B2dv z@ZBL|9kPIBe_v2PWlb|NFl?KoYZC)mMfrB{p&3#l32F*BM(TmRD)XEa4@W2@Ka)(e z6RLW1npmh`rlaU!5A7lohD7gW-4go&*WG2+GFwb#fV8=rX=vjIymx$KKuq>@9JyO+ zVieaR;`w9dJL3K!_h&cBn5q-o@PSOk;scnIXY$9*e-E~+*!oZ-ukR`as)2C|t-vOE zfvRPW+#bUO`;=G?TTxaH{)57i@*f(YwRZi18WM9wADabPsdINn7sY&%k0=Bvh)6`{ zZCobVMiSkhBM(qgE~>$>!UeqAXrQ(L>z2!Wb<0p{6g*aTq9Hu?o$TPqv>7qKY&PDM z=F?NOf1N)7^M26jee)E|mCJ0G8Y<<6O99%Q=fKrRv#O7MgcVn{id8w)ihdVpOQ+}> z3T|0qRr(A)A^Y1IXypcwvjYwEfFrN0^xOCJmUCv=yeGz_45h^R3G69`moe6QIHVOA zC1N9l!DxS26ih`@egfmAMi=q#ApSw=pFuU@f1Uh}f?foW<3Mt@Fkvpw#juFNJ4oI4 zbBj$5q{fTftZK3ET>RSK^y;gqFTVbP&_hM91~D|?gnC#WA8o`4Ls-(f{6;hGSj-XQ zhlI$`B#;h!waCcl^Vt|BWmyd$1u;jO&`evbk5rK5P2f5K(%;g<9)dKR8Uh@R>6&9X zf0?7O92Mn1>lus3<1k%y-x%F9WAWHzyz|!j0b@b4OEVV9 zvKnJy)9R@#G$8hC{nQzYAU9tFW1)4Bf3dL1Y%F6DxE`$U`#m!jy5sN0ScLiOx-u3z z_`5L{lBdwmB*9n|iG{v9V{wCZpBDx&-aljE`)*(?2=ycwi#l?O_=;L4=y&2PVswy& zsJia7BlJkof+XG>GS{yRrdiFy$6TNqP(uP5-b`<=A5${HNqI^}hvC}~{TU)9e@Qp^ zQ>+mH4R45GqZTribL;)uWa{q(F4_;V*)dGsmlUB2-_2qYP{akDDOj#wgT)rQHk!l+ zP#8X748qp1j!<_?06q{$FG{^6g%-k4AKLD%L6}}oliHX&ygZFq$ zJR&8@@Q+9P_S#3NZZ<}{5wNC7f2OtN1a7QA^JYrY`>S}*np{e|Ih3}!lNyD1pyyOg zcl~SP)?X(OK9Ka3Kv2SQN-`Gf?@rbr`Dip-j5)tzAe_0whA;~N2elF9EG*m;_7Sjq zf!V4xTs15Q=}BCV1QKqCzZL;!!_P}IG#bEBPF&$Z9i~Rebs)tFVH$oaf38R%eqK%? z1n<>$2R%xBKP(^z7Otfx*&Tz0t{a06B(;s)1oxRTRs}AEz6=%bL79O|9iB;;;~&?; zB%SPiXo}$PH&EaWdZJpln$rB4Y4`o_VeQX(s6+2`fFB0h+W1?Uwf6n*?H%SqAZ(JXEIO16o01kQGP>r#9ft|VdO*nQUPUYqnJQJB6|JJ*KX zJ^kJRa?}JZ7}td6Ai1%jo6BS;stHHihh!Degl905A@=?)U~@+}f4Kj@9AsxYG`hAs z&JnRCL`wI;)wp@(5Fp)F_)E(90D^dMd=No=H*JWqhuB?%f*bkY?V-W05*O)O8BrE| zXG0PEF3fxsj<$U*Ts@JB7b9+%czTRJYx;DFIY?0f{u?gFmu~Q%;LVX(0nPRQ0rme5 zwD%~gy+#1`G6?nOf8PU|#X!3E_KopL#MsTqjKVO2f+wyH9jx&0EB8C$fKUd+dyvFY zb?|^!fLe$!%6IaQj-9NulYbn=_~>t4j!|q^g?g}+vo`maD+<(rUN2`F+_IBZYQy0L z&J48PtHZ>;`II5G-Pp>aWFQpjs}*u94wLzUZ^}tNa(5!ze;@9F2JB*r<(>Q~ml9Vj zjF4%Obr^WeO*A?y^>)OH?z9??>wQoDG%@*vb4e|5q(k3t3yh<6=5Ia5Ymn#?Hp?6n zx>q|yNz5d~mgAmMcHUQJ$(4TY5Pw2K9@*7g1CwK&06VxM0tKFXPRAQMY6KWdU&}>iNvhRKE*Qkn-`hURHW{! z>UA`y6bBT@sD9JnR+Ee=xOEXdehArAJ|1w`U0(g*FzR4uQl4Qr7{WP1ln@RC7KJBd+<~(g5J_@x&kHq5#ncgm(vLtGmV9UqUx6#_BfbH3OiWv;H-zWlAfcE~iwb~we-9DPf0;X+ zLWJF9eu}l+w`$^!KzId$Wlo6U6(rF_qEHn3n;i3g;+*%*LGRZcx61KBB1CNKCM;J81$vV9^t3~wI6ksvgN4w@){M(!>hY} z{ji+jg^em~@6tmzS=Ab^!p5sw;}tgE+6;{-{-|C}U*n7>BuZ7Zfdw$ygs7g5*aGV| zqX{?Bt<4d{?k;+6NWsake~BFoS~z(Zv@qCU%-V?U_@Eyn1V;#MC$PdMQ&@)%up%Dz zIy`Wqh(p0DeY-=j4$y>yaEB*$52A|hKD1Q3*8ez`g85IPcYFp9HM<^=s1K6JKtdU$ z=c}y`X?W7k+~Wn6a0`ku1YLM+i1$_Nt%7Qa#|L}B6R+(aI^WwCc7c9^e(cCvLxMwP9jT>Gw31;Q zW!!36o}3^BeTR06r?r!*pS?D3xTU67Kc9ws8q^K8BXJMo=UVo)@wtA7N4kws(Mp{- z6}qPZr}E+1lnqITf8E{x1KBGTtCN2K#@|2$LQH%}y-a|km^k3uKZ4&sHPQn=!hsnA z?Q2P_)>mXKcSJwv_2(}KwK@k<2`!1`NN)FH?_Xq z`#>0A@Gqv>pz(nj`k*%UK|J_DZS;dxy@OTM!K&WD&8bG1e{x7J!W{mf6My@3;(EUE zUrHgap#ja?(?|f;>m1a&N|2lfubUsSfQq!iY&01MM0PZO(3MY8Mn>K#y)Y^_$ex2w z#d}}F!&QzkDS{(Kd(=rUu=vmz<@mGY@ZVH(Kza~LYCo;b%+9GzED{Dt3hRE9q zOv;Ka*~hbjeN<5d9qK~{E?N85hltc9 znU+K?Yc(>ShRKKmeT$80*JP~h|xGxR~*av6up<0O81 zT%>Yb+MIx@f0>IdtPtkDZg!uOO$|*xzc}tF{a{DhD$29tE8xug+wtcp#kt#-K@Ex)gM!(5WZ6^q z=OO-gV7`1YyE>F#>~~BWdgy<(Wjt^Fl^}p#{cWQ?cTes$_fBOA%*GG=TSAWD z8SaPto>GN2Y!@dIO)dufT$an6lPL1Ef7u>^+6}S^M3=y1T#Mq=JyeU#=Sa^^N=#Zz zbzk+|^m?z&o@`wYe!fjv(SNLNA07;DpU*&=a{KV3>(_&W!&mxHE{cC%l#60Oa~SYi zwtseOyp?@PdDR_c>|}5EhkL_&?w5nT{f~C`KHk~;GwcCpaz}>$9FnmQO^SBSf6Km= zF`&&?m;oW{kG8R+?7wD<@=f*%L(-K85(qbRgQ`&$YxME%ZGOt5kOe5x6^jetXchNUMN8-Km;>oJ0$Z>d zih8d#0ddFA*W%Z)s~N4`gTF*MH+R6_<@M3jB^dRQo>K?YBoobJI~*6FfQ4}V@F+L zB5+53K7G8umwh&%1enN4e?h#FMTr&FGYbWl)Mr)D_?X8*&K?IUtIF{;c$F)6m(2x! z3_JA3*yI8&2J@|NE7qXmPjLsf#%zM8Q{QS`II*w}e-=z_r&2;&HXER3%pVrG^ zcOEVBM2S1dFXbE`&L(gUy~XKq-rpPG|84h}P?XdC|J!@h_BM_re?j=O{VPhG_5dIO z@X%#bqWG{y>gY!lH74D%1hMHNP$bI&P-qk&3Kq4$eKU@{GYbG^&(8bqqT3=+l^JNlYOwS~ z+8W$F@j9Wj@#0_VAQ<8eigU1Y>}8*FAY2Up@aXR^UmcwNeDM4Ld>+=R)D0RYPHys1 zJ?-6GiOIexdW{>grN>3yThCSZULTzu9{qBBpn4bSHVD;ff3UEQdzYeLZNYzcuj+xW z@K~_-aD0}yE_%w7I*z`H`CXe}5ZQq8u#n;;?9+7}!^H}1<=Bf1=n29sK=PeTM{+dS z*|U>(Zw_E6U*vk{V~)5_IHKlm|K-mIPfuPRy*}GNdiz?`sEJh=)*kuqUmZL8uf{B3Hc>ig)xs71S%i`Xpr(ft_!@!>Ga>fIl!@u zvLQEygOV`L=JDJ(y4V<_E*0Q_@y3DrqMrG}ED(oq7EkFkz8Qpj3H zOg9iGf2WLX7FT!Py80sk;uy%O?$h*w3S`WEbfI;i`l)9Pq-PD{DH+%uSR!|}is1>A zuRBQBOgxlt`u(JD+@D*36}zPhsvH$_h2kJb)sH~jJ7$X#dr5hzr571dQLu=-3niNi zZ(;c;iP5)M5sgD7HL76jG5xIEFAsf$gIiQpqF=IAtOrQD#cwx0Ps+B$7IC!*p}Y zJm8L;H=|cThSyPHrO<@I8TFYDk%*vJqilScS&d_H$snpD9`sBC%4b1ZdUdtKLNC93 ze>Jd{WQK<3-CU`|5+#I?nsm$Mr3X)JDDtr+tmbgqK`!1TIM#rm^ga#Y?^NgST%~TV zNi$iX4VQwG2G>}xVWQc*IK@y+`X_SJK-&(X=w#-n8N zSe=m4R%7C4Y%y^VqFrKlWL(6$Iu$3Us%w1x7ciK077SnUJ-fLq)8YTng}Jyee^=(> z;(yZ8aP+djesx&)pafc-AoUijVx7bYX&=M8EVVA&BV%p&iL*WmzOh2uZEOGN&>Rb| z9vukkfRap9n<`NQHT(mM`Q3L!Nb_MnaT@3J-Qr)PoSefQ-8VaDm7HwmAqCBZRA=fk zE_XO3Nw_T#qoBG+5 zusm+t;4_>$CR%>)6o)I`5lHtmwG@5z(Q?>J#}n8jNadT-Iq7rK$J4)Sa|bcilWa*0 zrB)3Dr3ZC{<%RmzTok^q8lic^f(w0B^x5gIpO%w^!YO_toItfRW|F(ee?KSLU^JPr z`eWE5{TxZ0BpWj`z&L~U1Q3OB)K7;TvquacPgc2$l?oY}K7*#uO}KED>wT*>1#?#4uRgIhb!kmgnB$O(7JS`q@l5uNV$F zP>;tb(aJP&Pfj1jVv2sZf1E{F6Vldrg{;%gJ?{u7;f&oc2HOEi1z_sqEV0isQUmNH zbb&qpB*XGm$5@oPz?zGkUBP3@TzFJf6Rurw80J510WzuLkPrI#$IKVqZ?#6e2Q7Zk zVbN9d)`ETaU0A$SG=^6{!s?^CvZFws8sV?G;*spfCwDoq;bJ=Oe`@6q()l(b%%pf# zTxa8_X_+a}Q+~jAcZjPr9nocr-oikl#7Sf9UeH8QGJ-3y9BmhpdF&wsR#I~|5tNWI z*L#|9lS(?uhCK@!h&J|sSjoJOHP_L;%OMedDnnb#rV-ffIKmWzpBOowfiOaN%+y3{ zXA_~pUEQ5}*;A~ye~xCyG(G0_K-FjeI-QaFTJSd6(Cd8!Fl&vWhXh`0k`)6ln)1Lc zFr@-#XtCfjeY0Uq4=k(@*2^-pSE}Jpx_e5P=`&(W06NZbMoD~(iE7dX9`IrKP@e~2 z4T*vZFnK{tlo{Z<#qgq^L-RhDps*X%mOYgL+WL&>97!kuReV?xuZ!+M*D?iJIFvVVt%*e$8!ogGgl8)_Cl z?(E8I7QX01f1!f<#*ga8`Cutn^tuOz7v8dx##ED-MY|3s0{!qDohti=iyQ6RodxJ{ zs5g-@O-JhxYIY;pri9aO|3V!U(wRv>GO5Zijme z7SqcsB19U21XcsE5C+=gd?H3-q2A8osAp92xtj&oe{NVvD$`~_0$s59XXC@q z+mL^yf9|TGo5&-#yI{21C6x`#dXT*qwM)S>*>()cu#)~SFIUxkdjv& zNF`yw9!0tpSTbke?%t3;gE#xex_II4mFWOfd|3}_!wFmWh#7At`O&dB!TV|V<9Rk7&zgKOTS_A+6i30j1jYy+ ze_4jDl%dI_11)Ik6zhA(!@inftmPju^cGEHVlVOdfiGmvSUZhO0H7cEa7o)B#!ALQ z5?2P0u~0p-bkC>?>0XWD%C(R-W#x~|@$}OXg@iQb<`y$R6OCq4RdYebmYEf)7_etY zeGO<#{QJ_=gjHo_XTtz9uP*RZqN=L9f4M|maZEr}RaZuO3eg>z{|N>Shn3j8BQXm` zoW02Pj&X65eX7)vnffs^=*30)F&j+#lbn!&45utg1hKi{9Vi415@bFW$JqL+aZ0bQ zJH+UcC3a}dqA7aJw;?O6iH}ef-MtuLxil3CRwpEd(Be^~ZCxPJ2AKBJxb^ZPe^)}{ zu@U{!XgSza$3J)To)~L>k;ApyroW#?>1FmS_zAV~Te!eGRp6apfUbkE1bwwnRgYi= zv76XBdF=)4G!QhlW%|AJ@%F!42kclPxi_G+4_xll*b9p?uC5MWF^Z@Rc6L-V%)v>E zz(Po|ypvAUcAQ7rMZZQJlbXkdI>mwVPm=n1;5rGpVx)j?Kq=Eb|ZTb}NDxhb^;oI<>aR7eV_ zRuK~~w+)nt&e68{%Pv-qyF@q{R@33_<+hWb)u1_*G(=0g+7`^HGAPPPe}AU#Ddiol z^1+bKi1HGdsZeR@7UKkutN!MLtqTUek~+z1T-+|{&~1E7EnZc3&HbJoKilvCG} zvF48ly>}Av@0i884=N&O4tb<#i6iOe!_h&J~0iBw_XI z+!-MYxH*$ya~q}&odi%Jb()p}0je6hvnC?~ur6h4pifHY!rvH`EV`Y1k?UcA1ag+5 zJ_NR~2UeL;V1i>h4;|j9k}0gaC!BTlX}-|B5QW`0kGE^g@Pyhtf6fJ*lsVYd*up3} z$CLF9I7lf7G%M|o*{md6NIA?#yDY#TU1bd%2+M4Be z7GkPX1FG=r7zLjjsp54e28V+mSMI1{aLhThR@Bl<8B0o52xc|M-gL5{k_>5yoJ01^ zP;*$t{+eyKHODJJe^_t$$IITMc(a{wjZ+6!6*pp{mj%0FU7!Tkyek96WSNS9QM}a5R7HF_$VKUNoBqoVj``&V&;q$H+hf5GcUda!h$Xl5sMssoiUB3@rsE8 zBqfK&bc&$@tyTfw#FN8g#ncJ`oZX`!VxU(z1h+A#ab%Pie{P(7uNG+>OU`Tj&B5!1 zn+CV8MH&|60<;QSH!4=>DK6!GS7{-U(%?l-0x7>*h*C3577{Ta`nB)tk7PmA9;t$d zz6MDa6buo6V+E3`^vg(pe@ZGh1>rQhZ#f7)+^@LDAij!>I!5olS|;)+xr9!C@~~jX zoThw=1~bT)e}f3!?H8EA6>l?pf|Y{v5bOidsE~5BRZ6>1r?PUk<)gCVAhX zE6I1?^$N`TI=&2;VuqVxOH3S`X^BbxBv7ykjW!9YIiD&@ks!So*=XD)8>{c~3#`}? zFHZd|p$d>F`5ibS=R>f%5I=0bP=nY3*!Z==JR6F~e|HLs=nxZ(atLT6VG0sSoVsEL z^Ai}*)hc6ruED!N-L)9iw$gtW}6JxTq#Vuf^Qv5AhA%CQeh`h z%bDMhZH)QL$j#6uU=U!XV!@0fDMs6@EE&joEA3zwSOu3$&H|jYu?q;YOF2nnVJlW0 zEr!EXe^V~$Uy*a>M6~5Qmyg!wpUFm3FeW>Wl}9ppjET?#mY@uuIA5;TnVgai(UEYt z^d)|}9OJJI8PIT$eh$9JSiX)DhgF=Fkl)RL{Ei`e z;#^4EX=Tq*!Te;z+R1f6r&9o*Wd6nkQ^!xze=|^6El}+90%c~EsAPV$>$uK^Ok2={2M$-K4y0Z(4T)b~p!j z9rk5ydo9%CIqRXqqXNDcXqXR=G}leUq2^Lc9K~{DywK6 zjna0*6QcF(PV9;W1$e)8cM!4Ge|ZyX8)9-Sbbs+=?Qs0G$7#^oSSyS zj(?Riiwl$HN{6Vx(&p&vG2&yWC*5*rv##s$k$-*3-y?LgFU{5R%*kZ z`6#yS`F2qum8jO)IK@tMHctg_<1yi06>J_W(YH-M_=eHq=At+Kp+^Jji;uc&;w_@e&FD@yzTEq@~|=Z09$R&+V3yj(%KmK&98xe;GW79C}9 z9evE^rAm|REl2od_EyF6_RPyO2Oh0VUjCCG8w;Z!))n{wH>zJ6sxs^75xit|890b4 z$RXX>IajVSN(6bsK?ID^xEO_G{K=rdh!KQiydWT+nGk8B;^8ffiK~c#p$r-ncz^dO zf`|5b^GV=ifvT@g?K(UEm``fW+Q%y~Eb(_x`~m-#;-5nNS39-Ym^-Q+ScN;%IS~U8 zhWA8J)`Z(6bD9A!vXW!t^)i74(qPULoO8<6ktdJkK$Pg5`!chvH3B_PaE^?@srPP7 zq*2su1B$~XMZofz$N3499>aAzxPKL=q|D$k&w`aiPk3aV{500E(YP)wSOIv}E~n=u z?&bPMGudpkC&e$Lk#sBc3vC9j!Qm6Qgy%s?#Vf9Ru#klr9cU2rcWQ<^qf@_4*Qh$s z4{&V45Rb$-lDE1U<?*A!=Pao8-{eJV>F+(K}MX(xbQaG zjB9v=znLIE)6xaR)v--k9#r3A5+N&YAN+Z^D++`R`yu;gsK;d)w+rkbp95RcEe2W1 z@goG2s%D7-6OP&b07&R41AomntW@w!fYpx8OW+i60vZ6u4d*EB6{ZF4*o=@r7VX!8 zfS>_0PKV9X$guP0({e`CHI1*c_&?l7m}gg_O>B56mLTY4kV2De`2Sn4^iH7;Xoz}PI+Ph#5rSYEXNehh>xY`v45$9L21t-IE$og z2pOsKff=q=e!#&(+I>mnLep;W_;J>mKNzJ?4YyXqozGJv7mCK057(s;O%qKo&a*kSkMv zrX!iSqn7@f6v_ojxfKP;U3p1bgd}FpQAZvg7FaCID5-HH|rj?G+ zDsFSc^o@EY+qK;1{7_0we+eo0eYBVGQ6mmpugTB3p!Xkd%SDlMVp{5Rm^Os%pg8A1 zum-0|p%t$w+&nPF+UpmxrYJv2)GlB+OLQ12O(z&Mie}L5N>@O@lsiWFBqz zY(Ty4#MmVxsZ}T_mvLb2+g=)W9N@?iY8&a)~dzRNwhG&|;; zgcs&DK7_4>1UE{y1U~>3RO1u7F&nI%bw!ZqSR%HMI@zQON>ZE9nd4Xw*g-#=31Oat zkz)!qGk@x*0`)Ln326qHdF9Rr7JE_ROpOE?oPa zt0QFlh#k+BXE7@SW2=WI6x^u3`27WMp9I7r1NQfRv0v%?wrbWd^3E){fcGe zuYdOE@GQKuOS!<5fRKb-pX{p|HS0~iF3t@z-N?)SyWotgf(2k{J$blm@~XTFp1mva z5-`>|<0?&WD|72O-BZ_0L1^|hP848;?9adS<}~qAadYvbSH%*C!)TE(t&$BPg4V=v zkw!uj(kgJM`!smJV%~~5r@ORmr9K%)vww=l&lOzFP_KvD9t!TMy2z3k9mC^{4k$8& zv`CniN2S!G@(^JJam!~hEST+>#-A=Fj#P0h4TC~F`>Hze+x6+eD5r zPne*T&v!c|p|XJ4v(n}uVLH{26Wm@^M3e@@B36on zcsQQ+IhU9$-loKCQilR0Hh+dH01p%{O0B>ZC?1FGcU=VzqF9yWL>wIXK(4?D*L%AfubXD*WeSz61{f#e?lPD!Yz>n-rL<`TQ4E;CX zJ4*Lu4PRf)Z>xInF&*|z{Fm{x7M0!_kF~m4i`HA7eWV=C+GOHysN`hx0Lhnq! zQ$tbF*4M)%1OjTHWlz$RodEGw;Yrk8d_ROkjif5sk^qyl}QZ8|O3Jj6V3s-JgYgsTn zR5MMYZouN{25f?F&;ZzJP>ZL*IhXG%CfgMITo~}q2tJ{NG_bKNlP#^NGvJwmp9@dD zn*-1wdGIl#dARfHOq~&d>INdu+@N!|Ib0)}hr3O2lVD^&8GpDGk7KktKE_LAA>$na z$pNQHr<105>g|8Izp({4r3}-k6fY$|WlalQ)d$WqRPG~9&&Tp=rL9gm$pI<(3Q(W9B(;pAm!8?D;yd6JF#BsW}&t0B2w@ zZyi>Bd!2Uja)K8?vGdzsi~wKlV_|?-(!m({nyF3dYSM0}sNYu7g2q<74hCE!XM5+` z2DK2V|3h)-)@4smsCCiF# zFgSq_X}1e=EqWJSE}lm{*I|7HDMuDP*l76BVa{9WpTR;jE zfvQOzuYZc*#aOVfDN zJ&&g9H0%KQ9g{>!lheg0a(zYVFjm;?0);YEp??tS68hveJ)0R(sGGD%nLweQA-G7{ zN)vsRmvs@c{}ylRhbAqtWLj6rBo)RinNLMAsnsP`jBolV{iU@zW%5xa_P#U4Ueh?p z&)*7=2kCGs3e8xeC`)U4)QJh0fRjnnv91(iFN!|)5IGgEGHx3^^#{Ac&MM~Qy!Uuq`y_kDvuk?tNabYZ@k82YqoS`|W3u2UyxqlSI zQVEz(Lj9GSFdDo)iqZ3DC^Tfh??U?XyS{j{jvbz9?Jr5>Njh5J$AkC;&(h?-rn%T& zoZ14|W+IY!JBT(<9s#weCLZVNWDn9$(U40%(RA3Ro)zR%ls+4zpDDaNj9pO4t@{QI zl?CMTen;f^yYJuyB~1G6yYIH0w0}RU*Jiz~jZgtpxP40dqQKpa4U<6o^jMUyBFBV? zOC=A0DC-VC)C^gsNrN=0x(2U89jM-8AZ@Zq9$J`WqJq(b2sypHcc!K$U}Dc*Ru;Ev z*^pM|msdm%Ik8~+S!QW6&4n07F*Z{Wg7Qi0h=7qQie%tsz~P;)w2#hK_kWNnxw-K+ zQU$4SaqadA#FWIRm(U#uF35lWCoYU8=dgRkQ?J>&W7UJTl!T&RHIm2nn0!PJfj1{5 z3c#EeKo2sjt$}F#$Pca0**1Ft)#%mpanpQiJ+FO7k^-is_-2SKc)N4S?NX_N*+`eB}OPs`qR%YCj4~_;ZgZJ zr0c^k;42@b)z~?gT4NQPUf-)A*UUg|Ac>j|`$E)4zY%q{B*=Rqkrp;LE&!^6ch-Ia_gDp(-2StgVLVsJ$F@kickO%4Z zWJn>LseMPiyCkvY039rELr5l)F-9dMC8OR$W#;Gq)fE5Ymt~%x7hUTbFmjn+)+UNga!Ts!%@n16wfQgN;0bHl2m$W5mz5DdEF#c0avN?x2H5CI%ydD0`WQVZ3d zOnHFSIOkRXByjM7fZ#*Y)rit*+ag>5s|o*(h-|@crdse7h!*^f(kz%Amt>)`)S_7T zD<~F}J{#mib$TUQo@Z3~c8W%gLreBP;AFwgVSl*3?Ur=_~}h#GDvEa99%G$~}lV~!phJ-aH#`5&Mq z?I+q*F;q|nbin6cL0|`bbJ7Px2u^93pgORhi`_kQGDta*I;@d8n``U7 zrR0)nysR1UPj3KMb$AEdSMw6~6A~EMthjghU^B5(dVg#TvUC`5tZsA!Zal;e?U$%AJRG z$1C%V8h>6SsYqM}Jp&rN8=ARjBU-3dBrfYIaxMhWz{asCK6?)bN|>whc*j_~Xyg|t z6X-=qkfsTDpMdHI^D`Q;jN%h)j9nHF@WF(3fo{pnr@E~>6tX-RiOE?uINpsD*E`m| zgI^!=bF}AVd2a-UvO5`_e7OL|%qjKLJF(q18h^KqT3Eei*ls*oYgM;?jdp9nP>$6- z3vXyP`$6j*DR#k18Nn_>NOY(AoKz)a=Ow3JjNfH==Rj=JRLPG+!RHHBFfxiN`7s1l zFPdr9rA43x#~u!jK!lrGBwi zDu0OPvKg4*^9|QH2EMr5qcOwZi0={pkOuRuOprY-&b^YBcUQskW~_6_qQRzMT+o`5 z^%q+@+@X1yB!M(3I4A$fhy0}g=VSsCzG;&6z56El!qH;huhe2vVA7@=arBR(5QjAJ zZ-M~^F%KTWt?+axu+h5X*i-;jAMl9RW`C@pw%o840m|+)S79$BV6^q>?UV^dgj-~| z9LsbK?wszt|0Gp{8pN&j33?hxwNErc3DLI^FBQoDCu9CKGG;mfTQq@0Dx0jMcXuSm z$Fb<9u?Ae6S14{qEC{2xE9-{w%Zt=kb&C9dSaQV}8bG16QG^+6e6uA+g6{+841d&> zWGP%-RF(xIJjwqAvDqEJBRYr3c|>>)%tj?JH93E#D6N|KE5zyl|8e(KTsxkJX_ZV!5bPqN8T&mad)Fs_L`{1LS4pYt5!Eud@ZTh zC2-UK}RQBg| zr1z{N*W~yaR)CjBqac@$hle%~-+DQ`fV-GkB`c2%m3>sBVVe3=2!aj>5r z7Bdb=ifd7_SGVXu_oE5axGPqVd7jRCDkC$8s`Vxy;~e$0oER#P-D_a+>Z0*cHoVgi zYc+zaQfctwC>UgW2rH9$0$nyfz_3FrbF4WmQWR(iBkC`f4ASTQ;*k+6_|#aZdg1KR zi?Wyj%as5-xtI{(kd+V-_ zN=sS*%{2j9dKMw?17xSmK97p=MyaWhyF(2nIrD9sYL!+g&ZFm+ z;I2RV{wuWk`xFD74SPbwhbaHj$t4G0* zD9R3XQ!W7x$9msR2iD`rb%YJd5_E~Vy zkI6oXMM3&dlhOA2 zdavk;4bm@4LCRbG{Cu2_XYI?Pxa?#gs#@3rr?x00=mjeAKs%DTkmvAIw$>*jC~ln!U;;iz%D zEcT~k6xZ}L*2QeRf$0$c?`*VwYPL^T8}Dd_)bB&*_dfnUv7Wt{Q|A~a@<#uD+xVM1 zt+e!$;(uc{v;uXDrx54n1Ygh^b~^w1&^cZGaN4-3fA}DpIxKDu4|m~zH~YoS{yzS* z3;(<6^?JKK@u%3mx$YD<*QdKTZ^hrY;_o~B+~|MBKR1_`^~=jk=xrJ+{c6^XR(&S$*r|EXt{JU*oPX9eJ8K_Wr@L7H0oQMd zx_?daAAxCxA(?HjQN3X?{39C|$q*xIfLzqWLV?~e}+Gv9XvZ-yXlCc5Af~A15tGSbgllOT-~)F zpRP5;__n?ZqJ>K7;SAC@^iW!vTo(-p|9=bD47}g8kL&@F@zArz{^k<-Mz!bqkG5SHfqys#J7#NWA5on6A6jW5pkHuQf@;*xl=CNW5SX_yC+ zah{i}I0G#@n?Lkg@Q)ylZ{hFX=rJ+TTBU@nU;0*e=WWHM=mdAQ+3;5(JEzHQOh* zCeD-Rt@5#k6{GnN23_tzFVr5Wr0h zQ}KEB9N(0C!`?A{14IKXx_@~gs6lyim=C7{rEZQf00aE)_j8KIP}bVzsGm>jwVRp| zICv_gU!&ABv==D7v_drtl6_N;?~jdF+1;jF8M_59A7uBOm)LW7b@xGb-+8y6&hXWb z5AJ#I4&l(kw_Epr+R7fdNS~z)R;<>8?12`jjd_RB@AdPv%={q_Kz|sn4fMF3ZH2Fc zZw6Em#_YVgN-*%kbnHCu!Sh}^a~|*0V-L(VJipGekIwVA@LcTExBja`>=R6x^I`@s zW@573w)eU9+0n&2|8*w2;P?8#=!O6G@{%hCfIfe&YvSwRqIJc-=*!rU{ z5`B@QUn$X|2Frde5b01LUr&*Y#3UIbjJ=|(K+zWhwFhELh^lrar_aQ>MAz;R{xOuD zRcQiINr@PZX&BwO#t!-)9@>DZJM+MU4y4|oR?6cm2<=Rl6@OfPUYm#C+U63??Jqlb zKv-O*zY9}f!;&z0zs&*MTfVcic_4eqH!LwzgHjw-OU!u>8vW)rmqn}|H2cl1F45q1 zk}S7c(8iqQdb=!4CY*D?zI(SgSn$<+FC_eD;*6&|j~QZa@&g9*NVeuRB^vw2rkcsU z`HlPut=wOrm4ErofChagO=%?PGQR}d{28S3-T+gDHMCS{)%=@z?k3h)vwN#7t7Zb^ zgX-R1UMAnL#`2h6c%3iBXKCzTfCgSJ1Gs7&bC>t|^KY3jgJW5E&OjW!&F)@c+MX{1 zd(LR)&Rn+i!p}db4sJ6s^TDR@&oYoDqmhmCUY-qTdVfGTDPdxWy&}O4e^bJaiVp1k zwH=@=kCi=mv1|{xu}YvhvAy&2c`U#m%R_yg4(18Fn3Q1|xYJ?&c@E6~ zS_F#qW|B9|S>#Td zdVjk}2dyHDb}m1qnsfTJW%Vgkti2EVra7>n5S?_lHXeg4V8wW8`!R)7uh=rGt}NKT zDhorhk%QZsNdd-8DnpqGfC|;g?8;mNw5vM$l#MU?#kG8|mw>bC5q4T{bqA!8jyY7j zby=d`<1cRNVe$nRSk`-qM$bF?3B`^7Wq+7YN?qN#P=JdUvkpN)eF3n;8xH%6Br8y! zj1v3`K(|8WQBm&~2ND-34Vr(yFtYA}((pXgcjClDoyRwUD$K0~s<sP%E0t3pS-* zV`Vqd_6TxqbAn7tnVC+qyNkQDw0{cs ze!2|&-Uv+mD&7G;vWnSd#hbr#N@}pjF-IaK)C}&fx9%~tv@}A;qSak$!T}6GC%x-p z{E-rXp=sy-@ktXr&SY4B%C6#v|XS@E>vnk zr503@K1%Q!NHe9k9Ek0dmw)V5pk~D4hN-D0C+T~I3>n_XbhG39(mR#KMyA79smkTF z3jWZwO(2~-&oC(FjV&m7R)nV=)y-~rS%qcWwT+r+j()ncYAit=JFts4Q#2ZVF;HvJ z^+3Y`q!;B1x3-=&nBB9sU`;U?Hr!&Lwae-G1WX)HWXNreb-muv_6nR%o1FCly---G8HBu1qXBH7Eh!>%pGNwnEc@*Wc<3U?cWw&e(B+!@Y*SqB(;8 z22go<7lCW80mKKY#z<}yTymyH5okWPY{r5F7LHPcFiSE6BjO=OY3&(Fvlm!By=L5m zvvg|7u+<9UtfI^37;GekB&GIV7gGuk>*$;r&;yXT(pJ)#I)5ff%;#$8-PPgLJP7c# z7CzDP5{&Jl&E2Lw0C-vpMUo-t`jTVWt&1Z zCWe6HF6#(mvq`YFATP#nA|y$Ojpb59adODhNGvqhItxK;DAK^5Wj-)zUp_J z%B&xiAQ}k6c!-dK3?mL|Z7t3$I_O4|ux3nW7;BZpNOC(EJ(eyr<~>xa40*rN-5!ew zjD7`Ao~ETBnr$IoLOzxHdcEB!|F+&tYJc0TIr|;!aesX_w(Q`uQy?O?HD8CD!&m&h zg3mxOa|UgyEO1NFgZWC2FODu(mjE8xeg_%y9(`{kA3OsYBGRawdE>Rqq635=rr2FE zl>#(QtQfvqu&c%{8JyYZ*tI~cF}mG>=1%?QzD5z*T}P+6@QOlYgI9SusbA!oo#6=9 z5B11Rwtt;=I3ldjMhEMoi#l1(5*hYH4+JBI_s|{=n`G~hm2LT#C zFdz`x0lf0A~>CN#lOIM(Yk5h@?_Ue#sujfLXYaGx1M^gIlc33=2~#>r>J_-T=i zyMF;ScNd;#JxZ7j`mI2nrn4LR(=4&2X;=gs5}fxN7#_KN2Ehd~`@KideF#qiq{3|9 z&~VtGovDf~rUeHTER|p?2sc6suLDR4FNf%*Q3oYqljMZ}+dRy!k+-eGKkZ*mo|@&s zw7V&$qtO;PB;M^CR?Fcg(Xf2|di?%F-&9uA#g!;8l z&jp+g#wj=jy&MX8#-k_6=BAi23S{8NjKZQ2(f}%Ns><}_iG>jO0zxF5Hq91bJ%2DJ zLIgNON3eTFPo5-OcOe=y1W$-mr7#N4u=v@NAIrsoun}M@{R{u<{@4mFf2h6CeRewyODMaJy(G#5XAg8I31Puyqy^nbDp-H+lEXvT9L$p)jz%uhf9pXqQ~DuO0XGpC}0 ziT_f)Vw^zoQ=w_lU7I6pE7ORN*(`8Wil>6KiGL$%gxVQcCbjU2K$LQoT|e`66SLlQ zsf&VWlXD`K6f|R9u;lCL&wmSnWW@4h6v%r}^s;{27c2KzHPECIfu2)MF$;nP5kp|! zpA>pz=*J}rRKns-e8VB!b|viSH(i0s$zJ{vlYdYUY>6!EB}DR@Z;Ipv+R6~Uk=l8_v&nKG|v0t`|Ru=(_tq5>CevgrkB%l za(0}JCK>SKXGh&h0e@c$LWvLdvo3yFVPDIYvlT-@sv6ZxH*hD)G=t+_cGRtfu?&IH zpamfh35EkBfpN%Dz<(fM3@`xbI&>R)T-8|#bGaU4t-0N%vcOr`-W>S+bs*mlD?RX{ z5ThUj$od_#9|${yie4dBeAt*1+BHhh-rR~x*_iX{Bi-g;KcQ#WkWYD7n~=3fK9RAa zgB!~q1!}Cr+d|BT*7ShRqqDUEu0W!OzdPVF=I|V~f5BGL{(rh9-NDxI3b=OTz9n}^ zStJZP)NfFO3Q6+k?DF9AsE&>6gQZyZK!8pS9J_* zmumXGiI5g)zY9C@csdkc&jjZKe@>=Z34h;ay&-)&xtfmg%d>F~e~wepwD=O<6Q=r;5j`U^dUPC^f>JGU&wu<9+^&BJ_1ofLf(T@*bO9Tfc& z-K*{$Ra~}jqSlj!-t+)q74M@IhaM{JCTNKSu!Fo)8H%QSvV$f`9#DcnKOoB_!Leyn zWfMlrU<2rgO3uE-4Z@XVc9lRaA)Wm)8cFFaxOe8Z?7+}B#V`>!;{W^m5L>age%Um} zDMYn7n13Qlv`Yv#Ti*>!0Pwl$K=1J z`S@d*9762m{}fLiCdZRh9NXg_KkOAkoaT6(N!smZCB~-X7%-GcjVwJ}@V{U|P!H@) zlJcsU_InU89YcVkmB$23joYE&)v3>DO4x9ObAJL@-(bU)kx4#m@qit9<>9p6Nk^w2 z+Pi~Y@sAl`RTi`+4XuHi%FGQE@6d_RZ3&qxfi}A0#*6EN;o)e2mWOW+otOksDbNRz z5{NwyM0hG7cLOY{N0CZF4EHJOQ0Jro8}xK?DhPsOz&R8Wx-KSGa16*0EBTgV6k%YH zPJgf%#5I=y-wEQJjiYTtQ3wO6$eSu^IsB525wEI`#{{Qy0a zTomaCWIa1r_bxwgr=wAShSqVSCsq6TY@GGQUipMU+`JXMm}0UkLD&V4_e1Fr{Sjn` z67PN}lk~E1ULvoaCKuw6W-~vhz<>(S9)ED(;maR-a)&studwP6P5IncS6mbKjq|cc zO@c7s#nYi$aIib?4!NHo`p3pPh5*F577>%=$CzH{tM*2{?{u(B!p(uy&LK#Fe`0ZYC?SK59Q8=jzDcU2SJ-kZWz-Y6iw!nO7Ldc*DT=0NX z&|o7@WuOudklQ)o5~TTuj09;uER%l-8n{_bY@k?7u)FzEkpDlq?V;%Mz&W$gs#LVtEe0-InW zpcL<1z{Z=BwFtIyMphf8sQ2;$dCh!iCC`P@!-7jmaA0H%Nr3WR*282y*WfVI7d^(h zs>_f>KnC_tl0E1_7mQAki^cJ!Y2)qJE!vR1oH69rz>zsE(HbYoCE2a{RIBH6aRe!E~f@n}ezNWNH zYT2+B0xatr-3GlB6&L6S0-~&s8GmGw#q%s9l*@XQuu4K=RXB9RnR9TY5>NM4Q|{E0 zgCW?jC%-onGX4WjUi1XCicX-gY+_j@dO18ph!7Ln7*R=m6-YUOjDK0sRxqc!58d4mt`^ZTv%3?}f~f0R%aYREqc#ZXF#@1`3B3gM zT&tUpyVD$#K8|OCP+?x+GV_RpSQN1|2+CKpK!K`YK2|UN2?DCUlQ<%el`3|WbIx<0 zRA^5bDhjLI5qRB7r=SHCUoOvUr;O~@!zS;C6t@_;RbP#Z>3`)FHI;)xaEy7`veZa^ zE2eIGP8a{}mQFK3dg`y(ve^K=eI~UM@A$=uqacV4 zlVdjStCYxuOkq4O3hkZ5u8p8$1{IVaL{tofXp=7zZdxsK}TEzVkirr zDB8lu-`nVE0K*bQ2*<@{Cr@_7B#LLY(-F};CV&`djtaJtpn?ZJ0;xmTQwnO0R@{gu zX;NOH9!)&Z_=$X=C|L~sM7!{D@<+x8`FpEXwS{xjm4C-KsR>c6TbY6A3^Dj<89NXo zs~l`fH`k1>$W#t1?Ez5x`uc}X=R^77_;lT)rc#GCw1n1wedyeLIQ<)FeOFe3yi~Z} zhYwbjkZ;H{D=Ky%C@x0lLS&IX13U^hOHiW;_hoXAtNQvHOTJ9lJ5168>1jsa!_H>G z067Rn(0`twu3f%V-HugWP`hcsi>$jWv4kafrEF?US@M2&q{$9S&JoY9NSLNo&Up*dJScwbHjZ71@$}=_8R+ zv40o_2os16GVEz?6>}?i@*ZA#VL~D?6BND-3pNARk9ZJ~(ziQN=8w`)SkFs&ouf#F zfGj(B$R-Q98un}3A(RZ}mU`q=hpT9#Iz5Eo%HBf=R2^=Jhp-#YOSK)(@)qh$pgZBG z&!fFuyqh`?me))5%I)N_10Cq2GVb>0UVkPHd*qxe>#Janj|qlJv|3$v8(Oj@m2&Jh zO&xnP8O5u>JetYNyqT=PzQe;quieAY!(K1&DEO>5Z!PQk~V#t^3~V-~0EAfCHO!7uLz#iXO%vd#LDDimh(|tpfWyu(<;}+kboX z;)VC<>dJdG7<`!zmq=>LEyyLMhuBXP=E6x z_t-gg0-sF&z>IR>mEgkccu#aJmCaLv<{B$dhV{CHO6EUikL)yd)TdfYOtFxGHym&} zZqr&FL3c#65WW!%9my@59&eqRQidid;?>3}T@kOr-Ed1n+?KFC(Mx-M(|A;=~UT1_L`OQ2zvrYcXu>3KZqr0HC1rlRefY$a5ey1{G!9AVw_sx_T4=45rrc zwAL!uA~`(t>8i6=luo8941m>V>CY?U(y+AB@{(v-zZ|`oKE`7`5A@ydeM;)e_|a+@ z*Kl_Fq&JAN3M&? zT{dSlbA}Tbhv0IYj@fgFj_~eoTubWK?pjdL7)7Jq(tJZ}b#U=Xs)_1Z=o-BF1YtYUcVxkLEn^~+zAlb44F$0vJ- zZ<4n!PhKR4$8%&;MGct)M};!-g3tPe)@&}=1!(>K(Q6mq-bdE<{d>3I``G56mKnHW z@8EsmqhOKAA3z@Bto#Cq5EGa}B4f1>858Pmr`}jpNJI7$(SHbpB)S8I+hEssV!oaz zAcH&lwy5|X)YiE=ysF;1IcC(cUUi&b8=Uzy$Sq&K`j@(@KnL4Ay#+JoMJ;79L`EzH zyiReGOM@tFqanRC2KjhgjPbd)j!Mq6esL}93=6O~g#AL6Wn^hC4I0rrPg?k)9Tr+Y zN#UA}E#M|xRDV)I=Mj?XRmX_B)I>YXCR&V3pNu9OtvAhJ!Kb!l1;d0L_7vwe5HWy# z5uqFlTIfF5l=d7zZv1=_C&e$ND1VWEeusSoJJf72l9p5KXhvVW*j!A{!nZfUO9-Pc zfJFKi*$%198wRBVg9ga>V3@Dsx}Y%(uonv2r>%ja46?t%GB5g$XuGEdx0?`l z$Xt}-oxENRuF`co^XdX-iRXw}5VjWXO_gOi7=<^S#gN@GQS-WeO#oni0_E4&Q5#Sj zBPqq(cya22-Fh~ZL=bl=+4+~rAO#aoy4r)rJb#F^?s_W3PLy->*cn93S_$5}fqiKe zZ-pb5mkpwI2I;dp;{Lv_7Gk|Eg}uOxJz>tu5|yE-dJr*I%r98~VpGSwgdj6O*e}6J z1+tu6V;mo_-w%^<*^oQc>Xd+-XHc8H`X9F9rSWG)INdGY$5*D zS$~}#9YbJ7A>$t!XW~ZFUzJ99)%3YR><9%^q=0l}3OyesYinM>S%14AaZL2pMCCkYB%DCD5w)+tpgFltOLY3+ z4x=~6u-l(PY629N?4DOeY>0QR9vWZ+*#Xq=ZviKOB;VSA@o}U*vcRD5TBYP@p}+9` zoTz=)1518%2;vkJ7&0PFy8TS?<1j3YvWd3@WM8Fe4UT~nD{D&pHYG}m?1kwuAAdR3 zr1qn#;ty2udv^|d=B%-ByK8QGxC9Zu;A?|@Suti{Vv4bTL{#F(DNuKWANQhfe=`HU zU|-wkv;ABNhcRrWP~CP1wnTuNdJ>VXHcNVlRT+u3F`^rz{lpdW13m)ZY;*0;c2{ zEJYhww6i6A3C>uUyAEUNq`0`vB+CWG9HZxP@|#@q-x5I$f0Kcif3vV-0e|tq@o$$m z;WbcJs@?5`BW*INe#wCw+1`*ZU(1jAXq5FrfL}?QYrZ+>R3nZGX_EHeX!xp*8MB+3 zbS+_Je=k_Di5Z8}O?uESoDR#08EG?ka9WD4(lbLg=EpM>Sj5y&nhta}0`XrA;30OE z=U>mVR>ScFncBbv6!9owV1LT{Bc9dTKyo73j<$QMlUI5Z4Q&AAMk{*%@+<_|b$shxS3#05hIFEZB^ zAvC?^lsScAJ;^3wkrw6{YFKo{%a-edR5?0qgImnCHD|7t9#GI%f`1v=aW+T=Efsh= z9WvWWs!-l1%-kAhiqi!r1h7pXTM=Bf4|j`(hIVG45vW#<^i7DNPcLhWeMEg*u;N|>oSw`+( z7vtIxPCVta%hWlBZ-17{yR^nLJ*Mg(I*l9nb1MFH>YaamIQ`H$U2S|gg{SR?9eN9o z7mx-=o8rGM@!wtX-@ORiH^TV-qb>aRF8+JZ7{8a6`YD9ALf(nOi%5@hrj)2%^OXS6D00ShdSYiT?_DpRV+HF*9doP zM(12i7C8_#ZFN!EEyjXk{yj@4F5_h*Fo_7qP&^{?U0Bh=D+q)gF1_kb*1A@HoxTp* zX9hQtpMl2iWPeygVGPpuL(y}KydcKJ{_-_)lthvgXc&zcaM4FYDS6?sdsT9R1>WNc z?nw7Aqgdqh5)AAdJtNUi+;Eg}aVBjjQJ=zUBR;R-7)z5;Hca~yQmJ4mLjCv>tnFCy z;vQv>+#Ug3JZP5z8H#rg_6iPkr&h^064@7W%8l)%^nc2b#?I{0V`RNkbSKUCJsjJ% zZ95a&wrx(Fd}7XKxo&hzwiQ@Wlch zb%&=RymOE(2opA9{Y5Y`o~wPk@Q!0MBL*vQ^eFx3Q1GE}+i(jcOO#2F<3DaM+?Uq& zgCxqDEs+!vJz-P{1*EV3v3x?#3)aJ$mbS$tesmC3AtbK~G4WBfl(a+|m0cz&d=KF8 zSSKpsfu?|}ZVDYg|Ikg^acO^p&{^S`3xh$_zThYQrDcq3x(SeOl_9);E&kQu8I&rz zeLHNIod;)}a07-$g%D3_K722B$KTSnxcwHu-*VxI@ZnVp>!U$mGvEY z);9UNx&Iw7G-GCaNmnJ&(TNti!NPtr#+|_dWaO6V*%gBmS2^v+qO%SHjVK+vBHFNJ z>x+l~tIG^Dv%*MZ_<3#;AKGwrx)3Znuv-?P>D$`tcCtHYSBVZD0dA&c-pmbSmD&F> zbKVq7-CUzg5n>Bn_M|~`5Ml%R8z0~9KY@NnuU6brXE}udX%T^v{?ET&d^V|i`~~X) z?}sPb-U2l$SwQ{60UQcY=-RH9^K{KK7WCm5K(%V}$*EY)f;Cp|%F#MTM4&sCYR zdvA1R)eoXfK$P7iv_@-4_wH=@ROv*Bf1l=3bu7M^nsSglWT`tWgbv75AUn&8s(&l5 zPBFwdjnX`itoSC&7HV>2eFl5#aXP>O?AN^~{|P#HnEH@$#*Pn=1#{a;TA}ZhXoip1 zvZ(H_@Y7a=(7BVbp@UCH))6%6!XsSHWT91z6n*rEe(k6ig|kdiIG_)oSj4hqW{uIF zk$1n;HvCZG>ijc?A>!?u;mF>tCC(w2y!mS5#4lAu-!YJbJXaj^;_%96;LDW-P@ZA6 zx@#?&?X5`aYGBVUBZ?V8#4(XpIqxZR{OxeD(9c`D`&CDTgBex4I;a>9#{he81mpCu zsut;nin0|@2=6fk9e*LM>0xv;L@qv^MMp&o0b|U9q7`c$&?!F1iMBjkH^X!E>>3IE z09I_;3-;HWu*ol5TPq2pCOu;dunA*rnul0K6Qpe>1@FyNRz7#qPs4|a^Q4Bwmg1dd zYv)v7iKBHM+P^SmRo2ar&W z9n_iYX~oNV$!_A%PJA+o*J+{_k$hSQBFjbiGYU_r*2h$x~BfnBFI$`Kt;{ zIX6`$no&nt*MO|=t{VA<>Q5j2wi0QHgFesq^#oU6g&{c?HtYt^q$S=XOnpO2c&Tr?oOMrnsQO#Q_l zcGjzi!|SP=o}gncS5U(DWQJjBLy7?6xsy0N&grcBXrHglhPmto3MJ(NGBCM$QNLC{ zsb~i1RN}f>CyafYqrqY`#?oYsCo2IFbabg@k+I2)1x|Mh$%O6zU^@8n`-hp(teejc z^KkO_TQh?q^0m*bKmAW!sZ}rUbz!he>OmoElL{Ydn{Q}+ZEKFQlQG*27%17}>smT4 zlMscs+~@;Wu=0({C@8^!TA{C*mSFI;%|l`W$_~SM?k*;M;UkFjQ+rW`~lxeGQ7vR)=>1#s71C80?BJ zH)1fP^eiCSq&;;>8~4w_U-s<2txfY_Kks;oF{UDQF}Nt7pA!1Z<0Lza0d@%5y`39O z+)BvIk(~5QBE2;^f(ES~U|DPi0a?EctRlgoS-HaMu>8<8G{D-*u!GebntE>&CBva)44LyutA8IJarWK*;&^K~X0sQ!`j>mb2VnUY2J9e}4zv&MPWWe<@hN{3 z+EX#$l4Dx^cq{D9*|_v6^Au}<8dXPhw?h!-Sm(48!20SGlO`zg5k&Xe(elOQ=9I&I z%~R&Qru*vNS^D=03}44Sk@)4pd6A7Q$5CYWbTFtLE|}FaU=Rdu?T~`+(>7Oujhe+G zKqG-&(~CY^j1>do@c|-`7XGAqjp=Xn3>sDlLaJniFwTm!FtYN zYX-*UP5Em)w0JM3KLpZ4V9&Erh^ML6<~W;; zrqvE@k}>QBmD!7NKs}?I4)*m%n*jTB>+e{;5genSy^Q#umyF{5M|9>2JSKskPZ4-X z6Z&;Ful~!{@WgezfI|SHBM3JBlr{^f%owErzzv3)zNYvx<8ajh?s_J>L)W>38a!n7 zo(dnrLAIM5vm8YT;@gjnQD^nA=eb{A;4O!}id~jHHE-hQUlGf?!<6USY|?us7$q0pxQ0NH1T>D< zRLHiC){&{(FyFdL%jj}3kH3kP$bC%#Kstu$MN#I9Gy?ZIu_I}Z?z+*jR~381^BTSh zjePDheia_B`8SFTL+IB-<{KAlTp5+EHEUdrE{eNyYRLwoaU6M)Su8bnL}uywQ@e)i z79Y<)-%Yn+K`&)5+obOlU_=@yWH2UEi}AT29)`Ug-Xj?UlI!kVztXdUeHsBtUypmI zhiMYE@FPLKzu^}-#{K4S&BkcLCs`517-(}fGbWj)COktsX)mF5XG71-{zyxSpb^MY z8dtum=B1>)sa}~9Lnh{~jMCv^-&DtYmuA6t4*ii5(5SPr*4bKvay6Au9VSzR=d+>Z ziMHBQJs|G_9e#r%m-vNvyq5^r3k~VnFRgO4k|KcPxm3?UH2lQX>Mo+?5=yO`g417_ z!(z_zsn3^n2-IFzhlsL>u+9| zR*cW4_90R~ZGxpFgO$#amayLro2jE91sn}V6k9QdlSqYuR5YZ*+8xmq z?xZdHBV2bhQLU$JVc*rHvx^9=1>4MMv%#;3Q5;V=70nZk(PC-2VXc)9FWBTq4zpSx zI>TmSWwl`)m*3g8yh#n=%KRoA=@iUVCt$ccOTZhH?2H32U;wv>OBvkT7tfT3 zp2wFUAt9k`BIHj#+Lg@uKU|M-F28z*5hwm=45H^}nLA}Yx5_8LUI1RQG8rL(6|+N~-E9fAZn$Cz`i z%uF5@f`{5T*lPoP$^}^``w4a>38KCwSDPFg%5LM_6LW_s$&j?$ZCx8E;Tku2_-wCl z-R0$vkDBA+;&^Wrwv&UD*d@^K$onKH;)VY(vUoDt#0lH1-G|`kH2PzS=JO2HdRZzH zcm=sBAbXhFp!o+b zv)wF|Nfbt{RV_ewaB8K0gcoXPCrLm(7j-hxgRWN-6i%lLRHCS2g?bIzV7P8`dLi5M z$6F96d>;Y~8$4-~a>aZkd(Bis78%IY!&IF21i8|-%cv-Q))aLTB0wocYj>#vLptb( zushBAxm+?KnxI4078d8r{MV`tvA|yP{=hq5qxW+DK}zb_zwHyd&E6;d*qhXNW{+;g zj^;4PKSlszp&$}J_1uXa8C`rF=em|BlR<2)T2ThP5It4mx;r!Qq`Qkunfq{)(OmCJ+S&A3YNuY zMye7Z_GE9N zfX>+16hwan{|+tX3)|w{*C%W?K`MmANcF!X#S%d$g;5>4Zp;@eqNw@0=gl~g92N9J74}D>Bt?+}QW_t~DmQC%(fNI1=Iee_VxALlz@=QWz;y6d zIeH5}AfcdXkBkf>cCE|TEE0=7n>}-cl%WKJ@KeGxf&W!iR@l0jWsT00IMx{!gPo-8 zwoMNB4Y4JoXNH!8bQ=L&Z_R&4gpDyn&dyVY&OaS;2F%-p)FOHYk!Bg9F9=)>h`@#N zkY?L_p{1tPuKMP(;zwH30KM=dqDuTz^v~{xSra3CARg(R-ac<)0Jq`l*VWlX!Jh`i z$0*^xZJZ&lT!W{4x`}M|Q0%lVO{Xj#ys(aVmXKs>HG#L z)k}Y0+e)E`-Sv1%qcIyh`|HmO0A5VpaqI+r`a$qkodrrjN=GPrK}k};N|Lh2qLySm zHz$AQ@!D0JI_@O?EP6nQVBk;UQ&BN#8$q~`kDl@-^#xr)Z&CaXtQ`4z$%cv+Dgf!$ z2KWHj4`i$e5-jH3rM-&Dn!&%l^@Ln3nxidTq>XvM$4$fU%P=Ou6vC?ofY$%}AZRSk z?_9d^;##Ygw5=IBI5k8~N5&ee-3=!j7#@vL2CPwimEU?|wPX!_LJ+yG#qqh-#lnuj zxDr?&0SV}_qz zw0ALN36jY~KD#ViNd1W!V26zE-)jej@<*aa@;x+z44WFnV5ez|;FpZ!{15Ib zcdOM*AF(tF9^B_0J)N*E)da&XHcpN zIt;?iEIBnre^M4tiU<%yZ3bp>LEeX*jozJq@;}QNhg;*s7?X>cHO053qFi^| zFs^xGuO9fd>O0ygf?BPtJpQ92sRnZ$?X_DI(hqM6kBck7Nj$->z2vCyh^Cw1)9VQZ zFq~#jslTZWu-c0-fFDD3`pO=7pmI~er|cGJKqxWryCjoLjLC&j9U@n}BgyY)vh&gO z{^o0cV_OvaPB^pHE0m=*K~4DU8RmX9CoH{!?ESJBCFCGH2w!pD*<(sr9>7#+ImNd0Ud6K zb-N8D4sg<7FPjFg)Lx>XND_ch@&j$g>Cj9L+piw~&ZYh8sC#tK>8fnnx;#xgX!0h0 z+a`^mb+JSPfCHkgVcP-xgP4!2Sy&D)R_|d(X65}M;ul+xPK3n0Xv3GWG#N!*olrFy z2le^ZHkrceA-`lo^fYBFi;ZOz)62ZxVqu><=5d)iT$Nu5;3GMau`>CHO{w4;JEbj} z7j f=Y{{hC;t?%g@AGkbLL%O|D?o=eId1usSyZvDk3qUnNn~m(e9lP@V`FSHTi96{tX!4pd?&BHzNQDR?XSBFCeeNkiW=N8<=pLeR7H}JPl=n6 zh9~TyT3T`h>a*9%*)da>&FK0kjF*nn(BRU0Z(Hk#wYCpB=9`C}CP`90_NYgy|5X-_(nX(Ie}nUFoS@px0t03z|6ndjiQS zFbdHc0(`&!MwOPj}lQ5xYbuXSjhDCoBd8J|nO}l1@ovOi%xS(mM(AtOL5c~6n z^k)}cpsvVq7v|KspMF?0DE5%4_(y1h{_s8?d6gYR54Z8^837ZvPl(m8#unOeHa(^R z;CyH)M3E?$77Wl2rQCU-k8(U?alIYZct;qYjbI>mflc3+|4myfaBTNs@&1kNH(pSP;xhz(cje>7 zfDrxOBkR_LwK45-a4~26ID#0uqGU6DcV_{G^1&%1nZ$+!B5Z#Xuyv!+^v&E>oW=z$ zVte7e$?&h2GJ`7VJiL2}c!zx*-~{cD%BP~ow0`Q!G$5FXnJ%0~*9WP^<62{rziK~* ze|d^%iGJp)nx+QfqfS0ss>EJwa{)onw)dOK8GI*Fg22DBa?Am^jm5cr-ip-26R4s} z5CD*Dx#31aPFsNs7f*i#;uGipdK7V9#pTS;hE@pMLV(v!BKvv(-8j$&9GklS<~OB* zG4CXfZ{RB|^*NRHfNl3I=SUfbkXV5q)EiJ+-8~u4Yv={9$JD`e(cxVfl>Sa(OKsqtm(C7`BridD>e<-*A*Ic=hJMSANccAYj zS#xSe(TZ`>(#IvmIpeDS+7uV8J#&n>_K#V1c`-SR*c#>7dmAV4KmR?c`$~ZaLxMf0u2S<9o;w*W>mL7 zkE5kwTHbt=_p4pK2;9{&w5lT63f8%}Ph17RP$V^wY%RC@p}l;gQ63w#lh zp(ZYiQ#b+*31DBuA#{=_zA2Iv@coc#fgkcc(iO%4Vz-7K)aut0u+ZTF;h7_F3CB_R zd_i5f!e7VSp-$rNCUfGdP$It*7orDnJS#y zhDi<^vcW!lW^jJ!_esawD>8ROS(IoF(f6Qt?huXzYxA}@D~YCqoF+8Fjp)Zzzr z%WQfBT1i<**WXk)IDi8cKXBpCIeV6i=M~Way+U3=a#^psdS3q-g#yqhAH6y zJ}}f#C8Weuf=Mp>F^zr{@+odq#jOsP)Q_S#9=-9$HK@cH>}M;P8=d2bS~$XC@-fn@ z@}QlwJh`F%-lFBwe?ej*UZOjDA+G9uP7 zRsQ53H9+zUQEohSH$LZ9z9E@9Ryb4uftervX`@b;(#);#xo#HsT-F}JI<80H(YQv! z<}mOWNNAMeSQu$mMn{euU&l!Nn(DSN&S0on`avd>AU{CEBKfCT~uJNviv zf5WtfjKd}qT+gWn6ji9bSanHUQH%>#OL5Oj!za;ZbfH=*oR%k>$lp)0QTb#|^#u%2 z2+T5i<)cvrvf({&`uYL@H`4_0_j&h=7r$+-5p^&P6l6&;6na5XBn$xwbTn0mf4x3B zY`h9ZDskpK8~CrA^I^>~G}G{!D0CX|LTa9<(i3LhK;5b!&8on}8tT~r?M=Fv%5MAd zOJJU0y*bIM?`bv2CiQSA3+1UOl;lx)p@pWvMNR|m1nlEw30xEaDRbR|iA+R6%b;P! z#VWbnvTWn>Er2DLHE&&(efJlTP6eozgA?-3bn`0}PvPbl;#W~Ot)c=8c#04MSG2oL zy`uEdOr3&IujezEkovIEdx8UQ5^6~jghm(5w66ENc-q*q~>AK-wba{v* zDKJ@Vwdevu&Tqf4L8{0bLJ09T1S$o95qiPA<X7tjD3!YjU zLoLUxqM_{oNfk6DXqA|K3`BMSHHxeaP7lwWwv)DN$0ou+c^!8-A1A(1THp)_8@!HdH*GT5nNuZY;NhQ*o!>63=43dZ=nQS>z% z#19s?858=`i5O4MctO1-g#ZU>>uXYB%1oyn++kaHf?Q>H#hQ-_z-h_b@yuBi^;T zvF}prS8`Ph4)hUkQ_io`-5s&6Lq#(C*?fObzX>Ai)AG#{T=#W* zyX_E*5rtnfe9OY^jjJQ7pk=+p{n!}TjuQaZ|Y)9xlg;nJAcL21(h91u}k?b$)wAfX+D7)09*%pNDx82Ld7!AvxkmH#&lnAX&B z*=#}aTdiGt$ZxPPolhgXt~Z;eYVoe%uGx;rHf70{ha@3}=5PQf8n?apyW;??j6zO6 zN~ti4hyi@#i@D3N_Q^0qs)LbO!Xfujo%6T97R{+wY^iaAqCr5T?)x|J9ai`EWK_Hu%OM((5VSFL^A_Qn`?WvqD^rcP;W*uttySHxaKfn z*$5}m2eP3r*oiUc2C_j5Z08UZ(L{6A(E`bg>BmV_Solb!R9I|BOG+p^cN>y}qy*Ld zS-nFQCo|DVhI#L~S2k(TJaM)2qXpEVIW4s>mrP1Rlf-l9CL4DVZZ`xAV8j#Zzd`Z6 z6P<|9Ynu|SC_spD?O{@0l*GbDJ(?0N_;Ch-TCvHWtU2t-o$v}08(Jung24E*D4B>> zax|KefS(yjCof3nl67;cYa3 zXF8eMF8cs75-t7OLs_u_NY~cM3eA^9O2HbRR#AogV>TNkARaMB5cJd6ThzLZxUEn1 zarsd)%5Z?`seObE5;atvgS>aB2VC=DV$C?>nRo=7B6nAE!mqc=BEu&@vmj9A*+&BPLMq3*G{hPI1e{idnQyeA5RMWEz-QMjmE91lA+*ZBN^Zcj7}oHLR_qb2Rx1bN8BaO+v_6%YFkvSc zyqy|Mh^n1Taq*y@!O!wKmK9c}m14k`by&6HsxAZbk6$8bfPt(gtHDT~Gw{rLU_4S~ zNwv@%k>m6xUgZ*C3g;$!j`sv=$}lZOlUnIxT7?RhrX*$poFh^#)qq9XHuwf!-UVz7 z-q^QDUkeYrc}b7fB1V<6!UzXztdhJGh>FGOvP1nDWW0v4=zS;=hU5ZvSOGFl$EHOo zs_@bj8hk3sMWYO$jb)=A9&?~9XyYA=SOXn%vkhO%YwJ8Q8e^E z@QlF-)vQtt&>OMg!oTGEjSI`oQU(pFit7k7k67~O62E+{=&rc~quhoH?qhW)n!;!2 z^l0jSx(ZaGz!bvJ+(tcnxiEs+XUR7|DCfR>$|AG6L|FC+#-JC8(UkKK-rM7|ukmb8 zXIFRI-=|CTZ=b)D&#$Q7D+hXhz1n$lo#4ofv@W{+fNKA2J;ZKEU{qGK<%?C1)zLJ& zm2Hv96IE0Oc-XYm`^eJpFr{9h0 z(_ODRfIkLbJNfr?QCoTSVK+?M?kqhR5UCB%|8ar zT+9invHHyFxGDbxz3D~QzX=CeAtx8oUD)zMV7<0EUQ$_2N;A720`XaSzdxXK$e&5r zYJL*yF*}-Z30d8xB`Fe1r{%>a0yR|SQK%rb0fhqX@@Kq>`pt#{I370>c_lc#)F=jW zg^<`-U+S@b=kh^xGlEs!`J#?@*H{l;6T zV+FS-ahJ4B^BYGlkIYY4VlLTfBlv>@WbGe^`o@HN&!;_Ga&xCcZi;B98|&1 z4*1LA)6B* z3e71+6Cw)dgYWKHtr+&0wI0M=!zSe^EpB=O)Jo0%@-&;G3TX9#)?an+g7~Te@n7B9 zNHgX=9C&~N#k#;X#$0wej=SA-#=33B1;A{6ve)u9oId?=Ice@+s^h*0vi!1BUlD>0g{E?G64OuCmMckpVR(T?z$d8FXz~l&aWbeK8U~Y1CMbXm3BOb6KA(duhZlKwdX0Zc zCo0ni|NNmd>Kgnm82UZ&paB7;DIzo8@3;cn9`el%D21)2)5eZuCfp2}>ya9s(A;{mXi3QALHIH= zi}9~b#0C%I#n}OWa&zSDdMy6yXgzCZ~D5MT{ZGYr|v91$}4@WfYc9Y8nYNE69^yBf2@G01q3S1PYjgt z|BL+N2~hv!(m{DaM>LjOp~OKgfd7Y_B|uC5L%33)%>N+;Y0#bj5R)t@4%q+J$ti+X zgZ>YFtAO7AH+!oF`u$(*RtvP~zgVgcXcP!&D%)}^nLa2!?*Hx(^#ol2`5(ge0X_O3 zY5{;M{&$0lKPVQ+f8@n45L62p@Q>z*{ww=od1C?r?OOu@A^u$7$ z`YT120YW${r9*akIEEuBH|9-G7t^^LZO*DuS&LdG+rmP{p0)3!eCAiUSw6<;U_0~T z@B9g6MmN+qW;Cw(_c~R=N$PI~Rj*%c#|&!b<*M9hi%}lY$gx83j{eAqOwORumi_=G z_P%f=&>S#u93j^j|lC~8zAM~=y)?6F3+wDI?N z?b{wkSM^^WZ^ls9D88g@T^Xl>$l2w_l4w58_rG!L_qcob+qsfRl4ybM$)AE=+1k4t zd-IN=;d-R#n zX_Y#UMk3HRh?-VxoeV>g3iictkdK9qVUmda^jofp5{FS7SeILq4vUI|M{ZyeKQihN{L|#nFuuFpV3<*T~?S6m{yiOr`QsM(F$Ka+on!E5Izx zl!P~{L!rZqfUF@D7FGNDq-ZY74gF}vkvQZtb|jOcx&GWFxi-$Khqw9nE3 z&uXZ;5TTeFFO-2SBP|13Y((;@X++qOcOnagA>uR_O(S`neJqe5OnM;S=g3NNrFuwz1 z)o*8;S!;=^8i)W)waV^0P1#ZvX2xVXC8-cPm^xsxb@^!rQzO9gf$mq3?YRRFH@d=z z;9iEb!Y~wkhX>0CTg^_+(oT-3L+;AXub7=*mEFD=-M;$XpFU5}`ahC%XTl+_>jlEQ zw5k|lJtU?RczJH9VhXt<3JP!MjVqSb8Qpg&5XDog z3&R*~Yr&%bw!Z;lO33W99w0%5B(onNf4v`d9Cw*Rul}w~a)vJQetEn9I1J}yOzF{2 z{V`h0o*v^q`%G2MM%xb>mLaCh5>aa}go!KQOWO^4Ffcl{toydw6)x|Rto%csBzogoWYmDB7tW~ES6@D&(B@W?7# z{5d(Vt7*6f0z=S7P*Bw+blPW#g3pu%t7|x_oi*$i6Gf`jxZQyoh6&bPXL$CBxa?f+TX=^_ z%7n#&i$MZF76yWQa*9AZ!bI&LLJe!97puqmV1G7j!ES{b@(s_>`V#7do1Z1E-CJ|e zl#WjYiyLa74*8BIqtRMoJRM>?pT<8t@qr-vyS^;hN-(v$tYJI)rk0O8C2;H=+rkma znh@WsAI)zB>^)anS4DUrF8+aw#617iTN1(aJvkgaT$QFd@F#;o<1`w?`cnDn+gl0`Ga)64 z%tS>gDN`b0^5$d;kU=iG2}u^pgb01QzR#&OFKj&M()2Z{{)UqGmJ$J!s^}P~WEUu% zzC(akH+?lOcq0T8l@Avo15l=fPG|abU#3XB-+9Rva6!k}+y+Jr|DS_7%r4s7n}4!UMvj@goV* z1uvv0@4InEQo9KcuxWaM$A*}Sgo?nreM|reRlvDOusKw5!?-$N&L+h&g7zB?AXg|W zXmVX^0g>+awgf{g-F}KbW1p#Bon!MxO>obu1!4+935UhhVFNLg+L#0_Kbir%YV`}W z6GxK(d0mDng=soQ-d`8xI)x#zFH=*hw?+pQ2XezfEwhCl|J8)!kJ}^l`ads$R0V+V zowUMS);TxBpfRN5~@`74}LduUs7Iqs+ZV-n_RP7o!a^Ax+>ZrfkqVhz;N~ z!WE0od8z-N#J74l8p}4CTN9+elnxLF&j)}z4Du(J*PDzD8D>N$mj)_rfUV>@emI~H zKV3)bd85>*GaXj&Q|z^M%};zgrybVku;@vv%H(q86LS{QqVq^mjoWGb{kiQ$eLqPT z2k0I8NiGz|OTa;0HJlAj%E$t=F)(#6aJ>Fd_dfY@L%K(;Kawa_YZ9hsd;qrHR>;@7 z(d>3Dk~Vn+iW)YHg&%WilK&p=wdpWyVJo`#XKjK6VO1YG?b@reV!gW0Lx#%;k%mX} z0+XGsG`5Pp^L1irt;TA%*F{0x=X7RIiJM~i4n#t7p|j11>XwwV>zl%lR}84S`8iTv zIsSm7j!dOllOrkuub!vrg#wHOfb~UI1%<`}JC2*fO7^B|k9D`555QgRa@}R)?CjOy z98?p=WDyeTM6@h35WEFn^#4|D1Q$Y@w#oS4RXt0jWa`X|Q%XRcAm{~avT$bnfCtKC zYc3YU&su|rXwXG(Gh4~qcs6L2?kOj)S()k%I_&el0fg+cg_U$emjOO17q|jPW}%Jq zd`KpF79`c?(ZjYX3#P1Me+bByAnyzk9&t#_yr4#QBhjXT%Mjs#oLocwtDxDRI>&yg z>PuPjG({vY2=~>@`WeDzoXN$2YatrF2Yd`iMYUD=4`Zfl9eq3Ss_U?< z4)dw)q^`X&%RO(Dl>ltQ<$q*9IAhbAY{b{0iI7@dxgMZ&VxScit3bMJx0(t^cpATL z7|6P>C8UL)J$ia8I{zTc(W^41dD`!(CDf86E|)z5`DnCDO@Usg)POCsPi~trE)woJfobL<*QsgNRmyQ{d2ptNBJw zkko1fzfhPr6Xw_x>+2uZ6jhq6Bp{K0V$Ca&Gebav<2_)!-GK-mCPZLhW$XT&CrdK% zK&y#s$Xa+wC;}iJc6JxI1QBquR#z747foJwJxvNhzd*hvJiv_9LxQGVuQ-`gtw%G{ zX`$Tc*}5P?i>lO-xB6!Psqs+KZTFKL-uZ&Qh!wg7{#pNJV}xc-Esa4Ip@a3NJ(YIn zs$V?$cNDss%TU$|^9>{2xD_JN?|92Fe*h(>H=jH&01xoq%O;*4`F(OR?cVh53S?P{ zFj`Zb<_2%g`UQnlX*dRZSPavQ>mv4t#bA8lM9nb+DR0HASqqr?N|E+Gfnd(m{;M!6 zIu!k}2IGys`h{ff3X0#Kh7eY7McpJV3k|`d&!R_4ss^fjq51}r>;B$@!6ymxL&MaA zW~F^z*AZ}tw;zu`nHs8uXQ9>TpCfgYnrD<9w(WMLje&IDCtK!y2D4<+i(}n+sPuU| zGE^PTzJD2_j?4e+MaUM2FiWArIm}7=*BJf+s`i{9Eo<6EZn<-%pt0SrSY6Ml4wuk5 z3y5qIPIXSS3XjrxhQ@XSJj>hyMOZYYt=@?sxfB46Swv2!hHmI{n<}Z;_OHb?#^y0I z%;u#6HVJZ!!3B7Ex(*)r520q9pwwWJGyoX%aJ<}K%Et)bl{A@FjNlA*vSDEFWXZ;8 ziHjsL7Y?u8RBn)fLKS6h75#ih-=1GYoi079Zh8zhH?z&UtzKCy^u4f~3SMv2P;+Ew z9#w$;1HYNCKEaAHOXR+QpeHbOlF&8YquttNT}C%an$ylBHOR+jwPTt0hP1Cj8V+*S3ZSLyo`Zj^tTFFvEi8AWojS6Y+M z&^!HQ7*3+0m&l)Bt-w6FgYxTXL9el}5ubolA`sB8Klg2&Pn7h6YVn58u~!?v_z;F% z@hgA$iQ?W!{J#PO8tQi4@05&+jgbM}`6Z@~+zN{!!cXD_qc5?Wqtk1yz<{I|a5eZK(n%@u)SKoOHfFsR}(y;(w znOVA!><*I6JIBe=c_&i$HG&F3m3-e#rIrHO1b}IPLnRTp9=ovuX z7^KHRX+3zphqLr5JgaIw^a^v|QbMbof}nebX?weKrxSS#H(tr)ARQx;D`2f`p2*X| zjiTJ$5(kVesG8GLB}Frdg3(R&$3_E)Z}lpR$S2`EG?ritRJ{$=-1Ai6SBVbyR1iMp zJHer$81|n|s}H<7J}XK(C$gb}Q6uZlJsc7&RB70erbT^Hrd*6->7SqmG#CFLzweA*)^0(^`lc1K_6?x?T(7foz`P%jfbJSHigLE9>6OH)%nOmB%kHw zM2mO!{sVO08(S3rB#F2Jfxr)Gwpn?$DfERlx1OjHSQmrpzarrpv;5v@Y2F1(S$d7L zF!5K{2@8c-w z1~rC)bEn1e&?#*nM#)OEX2ev9Y{Q5K`AMGl{Ic9^&kEoM)Is@mCA0{Unn1ZFG|vF$ z+vR9ToW~>S(z1HATD{-uT4$V%TWEo&-!R+x*a|ea4rmbL>)~G~In|9rxCx$LJD1vK`$W*uZvl?K#&*XL)oH_TyUit}uz(iudmc>A1)G&35$H zi~=*0wiXdvY%TZqBN*gmgY&A^edVW*@qg`S4=@rtGx%yAnq1+kY>7n{F1g3QHI3ZzXc+=xM7MvS+i1~l9_2mCyorcu@!AZ#*a zU6;3T`1*%OR>a-)^8w*6FZ)tBp!MwH7t+eyN>lsfb85&ba|wQ#ov`4P(Ev-u9i8=n zd@wBZ@VsBVU#?0#wlsTmGdjKwKk^H*=UdyBxB`Lne|(A1Vnua((+K6KtSjVxgi1mZ zi3=aCLrbi-03@NrZ?zx!{X;vk@oA45<%tk)EuKoXT}cYEP4$GpYyFKp7XsP~U~Ugj z9>fZp-|xh$*4T&c0;B49qB=TFGkoGWd3gKM884zrWHcIXg>5=y?A?}&UPBu|CEuL{ z;tlw0fUH!?UV%+fC(6n?MNsYbEn90ZCp(IH;TG@Q0idtX^41-<#RZ=~m+e-({^w?_ zW*m%J{^X?-%IfOY!rszPbC|RT=Mi-CoILAeO{2otgaAv-{!=|4`U+O0mY2)AGw|jl zejwhmLHM;S7>PQq=QctlM5{X~(j!+KpI4?(!H15x?ZNlnsYliE@Cvi~h(g*sqP_XG z?5&s?fNrO?#S69K#|h986ax?i?$(r?sh`aAe;yFEXY>q(wbL9#fk?wkK}8|JW@r)L)Sc(|4neWJ2+XKvy)Ey zrD!>_@@wo_0eo8_C{OS0pakmHjsk!3?@#_wfW+DliU1AJbHI!8&Kx@s!%oSA64r;~ zlJD`O4+HU$GPs|6U574_Bv{a4z|kGaNOycGPPFBCWBhUxUh&xFX+?_%B!OuE`<(s}hgBD+y^?Ni|P+fv%a8E}DoJ~zVMFv+P8`&w+ zM<1^t_!-FBtP?6dY^dhi{y95trXj7q03x>ry*m=}uC)%+yEwhv9ccwg&D|~~yqmUc zE=Um$I3GmaKKQkQv4Yj1Ui9S^A@fqF&hp-Of?huZxDtt~@3uYy14Z(lF_PTs>|Nx9 z;EPg|=B|HdYgMb^(XWymcesRy{e4)LwRox6sJJ;3oLVKnlvr9`SrGbSqN=eo2VC(; zF89K4$bW&cE-0-S4iwg+SOS+D)LW+n2F$1=3aaBzn^x0*>)P|$wlV0Zu%Eomjsa7`CHwwZn@QtChjm~ zg`6(70hM{;dwx?m8W3afj{BVE1Ip7{mbNemo~zsz%D2!mEFTTLI%r<($01c$T*qDx z*z0w7IFNU5d#@Ylf9gzIq0M{v(!#HA!=8dN%g{ePUr+=My6gwRHgKXGa*Bk4XgNQV zku_dre>t|65s-{}J6h@09hlCoSn1L0)QCmhQdZrh5VgKFGMZlok#X(c0<1hkaS*5Huu=pNyT6Y(U^*<@#S5!1u{$Z=MRxViHHd#r`914u6RPKzSFHy>!_JHUiOHOElgo*CWDl0ljVmcze?2}*HC`>Fu$>38Fn+OSdk8FE~aeuk01U?In*HygK-H{r^^$Uk# z_b_)qA7(^$gf=8)yG9C^)uX?J(CsbXa*$pJbKs#-_dD=3oC$)X)B~xSFiEZ0JQgj{ z&7op1Wfh5_ zQ~qRX{lKh$;zZZqH|G(7Kqq1o-E6lP7j0Mf_-1~&7tDU1LzuPKpBr&t$*M~qH3T3j zSJ>v6J-283lnyHNoi)+8l!@Ban^j5ER&g9YBxbTSanfSteUq0!nK5OyAnSWV% z(F9mpELgu!7UGQ*CD#-tZGX?ISX+j&b|U-yL7Tx!XI*wl z`)yURM6_@H5&nMNqN7&4`fFZr)_%>+>#VUpf%o^0Fe4x%;^E`-5(1!6b7{OwaGi1+ zT~C_;n$_{MxsRW=E#l>Kdnb7rSVt!gv4Mugt@(*b681R{mZ zVcCx8j2|b56N@$=PS5Y?IHvjI#dvWLUq3Fkz@h-z6Iw5shu-{H7+ ztJarOGIeBFIK7{uF|&htpjtqist%S|#UNEj`%=gNGgZB&Rmmo{BeSto*Q{S}8^U){yIk;{n&ezFHf zIs$NbTJQ6F%usJ(-2VQN;SJ<$_q;x}$hn@NcSJ0t@@H$LL4Xdv{aK!85c0oZZbk8R%?j+FGN>r!1DK!Kc39=c0(2M2K4xMwY zVgr))yvhl*pnpr?%WpF=PzGd3W0tBJ>xA2a>7Ye&44hA+FoxD%VTA*>8DM?>?MwLf zY!DB?oPtZIsPG-NK;JZM2vX|#ni~9%C~w3Ks2}YxeQ=4Hzepl9Sk&i(wGu#wC7&Xa zW@-h>ych@pCS7?L(oT}P?*ytsb25*T)pR9Y*d46-x}IlJg%!fNY~2iQ4w`Kb!DUEXF(H&Rx&hRC{MIXVa$KbW{_ z?aesO)_uoDD#P8!Fv%xflaVS?F~B`WRO5E#U}k9mE)>FjppM23Vc7h+`KyJC{vQTD zLyZ$7dN0=B2|R(R-W&jo9^A-#%wfDz>NEGPZ$CPQUr3H#(x-?Hhp!az9K}5~2arQE zduF27{s&7ebD8|~jqY9okZ z%Hs@{z)K0GQ7U7D*<-KR9qG3&y<$JY&KK#N57p0xfCD0hoNj;;-bO1^9Afix^#Ftnog&#TzK`^jE&IN z-d?cfHC|K7>{CD%j6)S$K)Oap*d~;(?n*QkmaX)h0 z__`L6MZ)@%$$FDpXi6BHXfIO4)B}|s)eU576Vu9&e_2jZ)DZl;OOK5IWrYc$U}t_Q z^3S`oYgj30ZP=g7NyTN|&6C)4P*%W69Po-_^dRX>zpSQSih=_h z$ga3=b}ZN7F?oaV?#^Y=SEl~cmCP5g>i4i-%hKN9&T>rYkU1oJ@AqKcFyN= zEwm${%*>a&O<*CN!Z6LmL$!y)bKLCe)$pMqcI5Bi@l-{^q3sE@$#&VwVMgPT-yV-F z3%%qJU(X1(Cefsht4 z<>D%h@5H(ZM;2U(kK1S5BIlb!+Gc0QT-y~P?1u7LLSi}n0YTV1`BsvaEWrp@aS;L1 zAZ#2_LPv|N6qFIO3TbQ3CCB1H@}#fWOosRkgED|Xnas8jP3vE?sU5e?Kt@tE<;>?W z8GCPf|I!gaTkXV=U}u8xM-D8YXa!wP=+hgBcfaJAf8`$1=W`~$l8KU!j>9DV-I%5uvW<%hC;BH$Un`s3_C z#g>amL)8FJIw-3jM(c1boqa6`UzQkFPkB2uff@@!7uBb0IO@@~t)itzYc*rbbJkfU z(9}E`;1Jx$n`=?{cGPpW7IYk|QiFiFeGUMSQX^gPcgEKEwgWVav}fOE%kJIrJ=WAw zY{^#&uQufuzUdR!VBe`_$)lNY_D1e3@31z8#jks=)-ffoDxa)0A<(s^&}APkussHz)!u zsTkzNoDAw#*FSQMibcnkDmAfpkU=2}n&y_+6_Lghesqb)1 zPfvaM26ej>5gm(4czHH^;=v1CNzZGyU^eW>5~OMjgUWxNNp|TkKi9>O-ee1$wen}z zHmmn;1nVUm3V27t<-oB9zfbnRtil806;Ig{m#}1wLxfhrPBvi4OL3&)<6om%``LDT zgJuqK(aRlOE_?LU^N${a3x`F7fT(rNGXRiZNB$N`ub?- z9c|B%s61n2jhPXK-7}_ZIcQ(~;Z^H;K{ySBH-xvZ(21p6J5D*gn^@XPKokIFRS@oI zD8_^qRLG75Tzc37uvdlC;4@3r*+5I09dDlgUMhj{Y&Lc2m2mJ>;0k=#Fr8cR1%MsbojyQ$<1`PU*Zw#J}TQ2@j2XO z<{buOQA5uwro#`lN0N}I%iW9DwVaR1favWIY& zH$FXsJvGl*#d>v*R8tH%m&w@|?s1m*b09AfUYWXMQV=cYH=-9ZFT!BAj0Rc3e(g>? z3tGr<(?PzirJc5ED3;|PjT>~*CNc&RL9#V(-QqoLWapsnB$OIZ`X!XHW7Y*+He<;g zs)7D8Y$$hnVsi!ziO@O_s3bm5b^^9nodHf{K4~TzJD}JcMh*s8v2a0KX~8Q&2y%hO z0tTV+ma!Yc=4!|7+L;|1-DRW5OIyEq1jF5`;p%MGbJ>h3fO)aKXc0lO&45t|07iiM zn|2T8&j*@fptKl0K^S!cuYs$)h|6~OTVqhAWZokOOXJaJ^%rK*pz3GY%oRQbZ$16= z6mSi%uK7mA_9;JrjgKK+-^wNB>|U)-J7xfca^&`iGb?BynpR6U^--m>oTNS$MKk)C z$1>lF00Sdmm0-ZuM6Rv5Lzk_&EHg4f`dOuMR8HK}h{iio!6pAh8aSQh5pm~p-b%25ra}^+CNMD z{T&1if0C-1xV<`cq`HA;kv{k!z$krSa1Ti5knQ%oKlLgFCuBZbbx$221_;;k zBUraTOVkkUB15NSM7_0Kz2i&&-kZ$w%$uyQk!jC#Jlze!Md~u1`@SYj&384KTV_4Y z#)Pd-&v8e3Y8;Nvp5_$Y;*(s)j@sViz1|;A$H5Nek@}SLzi%)GI871XTp+hNeYgSs z6g4h{@Qb|6(f4JtOGcZ`FM;|fFd)-5^O{CKPj|jw+I2QfVRF`U)LS{1?u2hjcr}I( zJ~|Dw&Glbe;Qkmlzeai$2teXPrL`qzGHqd0N%Re%;o;8QcjA?x3tNyFAoIs%U1B*` zS!^FC*^y{ai8C&Vaks7uS?ab)2t@!~u-oo%qR$E3x=U-m?{)7P2r2Ld!N#AXUbDCF z5#hY!x0Nv)Yu5uosWZdife|WpEgbwXCR9EhjPqXRVa+h6y)A^0S@tttIU5(>xol0a z@v3+7(JqwREUNn$G}lT=jfi`WkDY;0kqTR#>;XSBq-=d)KjZmU{+N=s(12O5Q36X-n?U70!PHtOsYH zCK?EjhHN5yTr!cO%|Jlu|5CCU!SMhNcIN;0=0EuB|9_~ivddLNM?aZEiwn%%-92>Y z>I&iCCOsGQ)qe)~C>xvXtsU=GAMM`7-rZ^TW>;N+Os_K=P467?Yp><9Ns-k2POuNk zOog9wKzhI-cT4~&fZ{zit zP}3+N?YF@$I=ZcT#O$BN@DjNsqC`tGlM+a%hzjpcp~Jpf>9)Y0@oW=F0=`5*K@gvxKWm5qW#q-M!K4V@~c`Cp!^>66QQM2X8)hmaNuMLM^&&FKsGvE;AiptPB z^*gPO(Zz{zRwo9~!VE4Xjp>GE-z`XND5YoY8b*>hZ!?xbpgGT)UBi=pC{+;f@MSC7 z;McQT1Rbkb$&BL?@qL^wi!<(*C%3siwgah&BkYgvZaH-?Q&120QL7}p%wvEYV12U@ zDX{+1GXAFdg__4A2?N1TDEUJhgvh^63nb_nsq97Sl7R3|C#;A(u^cS;90u7v6b)-H zoPzFEggEz-vX<6ua4Eau(8~Bsw|jY%l7Kc#iB(4yc$vSvu275~72MEXaix5y!?mX> zKpC(s2l{5df-elZU%KlUJl6oDr3b3vOlBKf>h~MxH@K)7&cFH_4W73__Er5%?W~wA ze_-aylz1HYZo`G+%T<%>H5EN&WM;~}{V#C)^BL9(3Z=^~|!3Nz<%;f%i z$E~Lg!pM^6lTFKd(s-jcGug;_E-@bZbi0$m%p_d6%R)*JRMUfveh~-E^%dd3B$0%H z=NUf}BUsle8uHS@H@WSB3B-@%)DU{5TR$W;01J4p*sMuVFe!i1=nf;CL0xL(1^^ie zIWY)vnjv#7geqpyHdK@x>FOnWjomomi17n>-X)uBlWfeofH;L#ig$bjhKzh;ooYg) z|2?>zp&A*D2=AJDymtVQ&dniQhtR(_Ynr<|n__Yf&Hud(AWT5WhD`i^g;%)B*JlzF zo+n~mVY)5K!a!i8#~#=R5iIZx9;88V@_V~|nhA^;OsJWgjNsYCtPks?l(9eC_$rtK zg5XI`;Z+7g57saQucw7BSApHzFz6iSAYy~aOQFse4`j%?J~aSnnu$hBO_em?UsC$) z7&`q~gupK|AgL06)cEU9*aXD9i8T~6U$Wk-++L)7$J10$>(sgqDJ)0Ic~ng`Cq{0( zd!561?}eAp9|8j}q&(KVGl&72t^&@)|4MuN_z)*`et-|-XnXHGdPoLNX&gua7$@*G?g>-HShOQW@fYooRxhxqhuhT=iNJk6pZJ;Ly)$1*mcy#8(`+0Rdyb z-Z|moaRsm9F;`v|rpU0#>w$9h4fc8b1ymxplgg%e$SeYG%tz3uJOxB~uN8UOK|&S? z3nK8J!A(^>{5msy_nvHCESY+$G0Pw!8(-*ou{F0xp|37O_br=nY;)qc!ik+2@C2QF zym+8r?O2=q!;sXgqXJ%lGL(e8ew)T1J6&lMsE3>K(a>r2O@N{eWMhWsx0GzHdE4mKT-}@ql>?p1fVPJS9hIHRJMS*Jm#6FDrRpic$GG^P%NX`^%v*{ZK zpI7nXx3h3)-+0pdP+8-=*g=Hy1TctX1%(Y`K_>wo*#nG@c6>PPd9KSl?Q5VA-SV!P z-00Vx=I=1KvQ=m@jQDde-ng{LM896ik5TC=uNR+b4s+LvDb&^1C%v4V)!_$eyIf5c zz{b;F#g%gSy8_7Nj5&|)s=b^wI?W$xE;C2FZafb~h*Q~wOh7lct=se>PO9VuHwxh1~<^xC5z>jsbF2EJ?O3EaBK$ML> z*5Ny&0HdR-syP71qpjM zU!lx+3`B*n>vd;q*o<`cf$V|`(abQ%jnMvSATkmM3#3D_U#kavUv=LNUvHdUW5Q5U z>16Q=5t6yV+rXYV;^u#c9K&$dHP8+>taElz{5a#}`ECkHQ>}LiY>2EIQzK1l|3(9@ z{}D>K9xFCw-{0Htd`~@1{!_G=Bs?R+JIWTsUEi5+0dbZJBSFQNJ}gWf1usdydmTJZ zoRMn;41fQkoIiX&U~>#eJ)nar=Znv&)mym*!6NC>ihcj&W5%Ei$FfYF^`e2X@ZP{drP{E-@0K$971J` zTqT>4p%b#XcQ>H}>n~%8eO(JSNAF2NN^%;EjPzY@otYdM7j0o#Gz`}(!1fT85ir;YfqXyIvJ;~MG>ZtI7E zW{q}cj{z~{c>z>-&^YPPoGS=`?U2VWYHSfquiJ?pK@A}rKZ>D@R*rRg7RcAcG=?}V z!738uVufXj7G8ldBb>>!Ns9f&P%AS`iKB~C+*%JY#EvVi9k1>ak^2|@+|;~oDB4;G zZ2(6deq%pRB$Evy&0^rP)hYSwjG`pw3C-7HWgZh%_mxubK#${2H%t-Wr)7pzQd7~% z!mtibkJMZYyie12Y9)BZCsUuz8|%`&aw5LGSNodGps-Xju%#wS=xOS(k~|LExpt10 zOLT~k-&0Xa5cVW?xZ-OVHfzy5-kDFT&N1f|^)~m;%)rfqoW9^_yl_KpTFYinM)qP>;v}X@l<6N@Hq-|KS-eagbPA2kRRvTqmU7*aS-?u1JZxFu<)fG2Y{-pv|CK$_iQ7 z>Gl*BAk}r;w0U8=TS4kp2Bwe@bHIK5I1$XM5pF5y-8EwlQ{mDWQN^YQn2>?y`2_=x z?#~yq+S){E3`YQJ#fYCd=O1%%at#A^Kc9^)t55ONf;Y;k!hDPSoVdtLrYv_s9@O8z zg_y9f_x76pkxRAG+{7B1I39Tl+3U_W_iUC-8_&VO&vD%)M+pBy1SwOQHUC$`g)qy< zw;CG<5Q9UR%~Z4$%wVRNK4zAPKCI%ZK{L4W!w-#WCN%(jbE-fjiDXLemC4PPRGg5i zhliB*po+jH#E{StOy|fAPnCns7PAbn$t**A)XW(Lo;|c~=9HioTH3F#V%xOw?k1AV zQ&CwwY7yYlnm44ftR|VTZIw0jO>f%S)BdJ5v~UOHaSTQb8OdLji$p@#XQ+~w`U3cQ8h_hI7?>GwY3qA8H*>_;T)EJd zTK=K&1v7eV>4zt@$SIVt<${0KW&TRPCk}p03~YG{YYZf6BEgF(3!cH)J22poSZi(5 z)IxpA#2=*Zj^Nt6de)kD*F+{Vp%sv29SEpoYO(tRksRpxXY*%_T&nhS+D*;DD*7 zY*92l>jY}~V%i~4&@NQ;agL*?!Xszs67u^^;81q>Nx33`N%+X{o{g>PvpL8ZxLBNX z@b^n_pmuM4NUuip+OGF?S6Rd<5xI9HxNQRj@M4Q2Zsq)Wvt|_@41WBf9kgCb@%4|6 zLnp%b4H;hbdI26PJW9HMslhax4;6u}a8(P-*ymFvoq7V-*jugUJ?c{FADGq;kw=vw zd#XPo3GOP+Cb#Syn?h)4hc5EmCRGSEr} zv~+>??BfY`qv#E`6cWCZxMd99ZL`3}T_ikPV=fVQd3txpT8XLakq144lGRiQcVoa&-^qkECaaHh&)h>^`HYy$yh6z3g+h z`&5vWL91hWSwe+0kpG?L*~X&zd~QUdg!kDEBXv8qyT8;NM0s`c_7ek#Y)j3G207~+ z!l~E}yDvne5f3OC^{tuq%=Fu_?WFg=|H+BWxKWwOWhp4O5GzVCt$Pgp#W#QBYWyCq z1YfPO2gv#MF@`AJV?W{)xQ(x};i!DMYz6z5MB43x zYbFe6Hw<8V^efyCLL6}3r#JPoS{*EcaQ?=4iny!!^ISyu+%|Fps0`e?$0=k`DPZeL(&i}Qh-WmAw%XjwZKNEKnQh~Nq&)a%hlK)1@ZJX4 z1nuXUm<}av^H@;?dI5G!OcttN6`7=j%NL7TZ}S3?XI$Gcw}9*RVv=pr1D!$W(2gM^ zL@6GXW@~A)v!Kbr9OccfKxWitFFCUX$aerI>Udfi{Yl6D+smHj{qW0iqD$o4n@T24 zmu{8ZV{A?pc-KfeeKmy@>+Q&JxN&RMH`K;7VZSx!@ZI^wK>O1;OfzL^MErnn1iMpP zN+7?pl_ACF(FI6DyLr@IACt;eG59g!Mk)0JZ{DC6mG;RrCeXJ+^=5x5v2C0vdp@Ah z<#nJ$t>-yf$oN?o6H!rNbnbczXL0%e&Y$DMHL@qo+_7={BGRwMw9M-+^->#F;9BohR$=?XRRZI7vy zNOrKSO#$@mr0ZjCudz1~TQ9w~JGpfeDH1J?8D38hW{Rzto~LTZptGmb=*NX^66dK` zbk9{N6S=-!DsYTMApHm>nzr^nKqboqZPd~sv(2VYQ!Z)|vH7=w4u7#R7U)zmbFB;< zo-{0kGJJk|K_69f&S8e|q>&;S6H`G635k(Qg#w8CLW97P7FczG9POCNi?@YbEw|PP z{^@DlK*OLxk8T65);}1_0$DLlQF3PdESx14YISL+UE$GD5FtfeKhPN56M`gX2~c#& z2E(Uew&2FG7a*6dj$tXyG7_#$E)lr`19eEuiFH|?QP*)B%!ywgE@yerf2g-~L8!bk zHb5X@xg)&RaK*8y?6u0f$5@EyrwllF4$KlXCZ&8w!^nA#lCMCyUEIceFo(?@r)Z$g zv|Ukfc6}c6Khy*>#p|(`bCo1WHVA^h`V#ZY=sxro9oUK8rDHSfak%=BbDoGtuI(TpslRl@&|%35SKP)25{L) zzNQ4_fhh0A6y}SU4!D@u--C$e6H<%ieQwLJi}Cgq{hFp*?@}OYAC!8wVgpU$WdJ|g zVL2JD^|J0@h>6<3Ko6^CHDyHkn?Fs~GoHW}3Rtd)2xr}Q=!3{W<&n>ij0 zy}xoS{W)h;Xu@9eK{SWvUyFOs=(DyZ1jEHA{)vnoJ`L>;$u@~^dl1FrNYz#L^jP?{ z_nv~LY)WIbd3jdeapB=F#|H`Xc>_2U$nt~>#5HQE_?T{(Z`>jg0}LilEg;@C8~}o= zx!wQ^s)y5|&VNSjqdGzX`obch$h&G)50=U2v5p_c&=BGm67!TU?J?@+Yv@AE0~gRp zNDnWUH5#~x)Jv;&tItAoUGMnzal1eM3a4iC9WKA>^BffKr(^C@ zw_ZvB4uv3%J?}VSMJV^G3JpN7l6H_jx8Gh91W^e?tJJ_o@WQPR4YkMsnR$Ri@ z6=O6n3d+arl`BRtu3)A^u3q_zOZ`jxqV~@(nm$V*(O%1x7pvJGN+^Jwt0KN0)me&9 zx^Ql>m2RF6TZ5oqJ{s8E&85B0pD-#+;6{n5*pmX~BgW#{pJrOAY!>1RJrvLm zwvBk4^Xsrb=MF_9KAQl;un!w1jlFeevOTNm~*x9Yc&{Ijnmn*~m{lF~Nz6Bz9c*_nRQy!WU zi!{<5ZR3}C_9~g=N|n81&UHeW-~7LZ@gz^X=SoO*1v`^qMy~bH)qzNN8tf z_YsFd>uC8`7E@aakVLL&ot1EjXykO14|?TfkF%NiJ*T;CQJ%VTtHo^pI=Y;^>|yv# zrO(Yh2;mT+Z2xS(k&gbp7$6R1TP-0PDpS)x@Fk0xFuB~sqMoq!<@Y8_hqCl(KX2#99tle;+oVXH0LKaCikgu(JKsVi=a`*~ThbMLW_8NQQ zYx$ekHS(9N8BiULJ27DAON0(smoehWQ{`Wa`y{&9bqrFncwA3TncZAEe~5n6j+6fd zFj#A8;xRt|iU-=)pqTu1#490E*2BHyIJxVnxR09emxu}=oz1WTQOXe4*vWI+HhqF+ z{5n-{=MZo9t`}LU^WU5A-Oc6dI2482UV5XpCCbtUi?KK%U25nGcfh z+lmyk1ALz)GTk+k;k00Q2m#entdWX8#CX_y6<#XYz}k zZx)Q~?1l@_Q%%7j5xi6$tRSP;n^@73n39muG3iyu z#+iO&p+(6J2OV9tXv+ok@>H3OfUd~5>H0ur$$+a{0!69GAEc0ram9~fb}+P z68NKxyi9uSD9azKFw_d7q77z@ou*lSC$rHXOL;!WH;23qI2gNvTZ-#!3nm^Vm>3~2t(FlH14kTyD+F)obASCM{&s*cAP*B3E*xU~M|T70 zRd4oE5Mv)S&t-p@wUn(U!di$o^L~zi&)Irv+q9**ku8%e$iHisn$XmA8ma5v(laD% zIoIM9*IA53O=OOpR##L5s*nnF5xX&JIA8WPx=KT#4vXIwD2FKZ(X8>g!EPcxxdqps zKZvp9FiNZ?^cmjtQA-ppZ6H-EMwJ1qQjN#v9{f1w?u&a~!T>F47uF64J^O7!vzQug zw*QQyHeQl*=duC*hlKXYKKCA9^fk6WK~zcm8T764p=&rG$^xH{#ngx<8`R%C8+6UgxIZ-^AAYD0`FF6npLieCgSGMDTs-z$1$2L5DqTsb#xx~En*88x z6;or0P8@{S)Xs;Br^?hFujS~7#4@%^M@#AHS%SeN5I(gUw}MD{3V&AT5G2FW!FTZL znH)?+(WP}~%h*vxC_OsCj&1<5?$?IWOds?JyG2rZ(Wk+nWHftGIIP2cwGTrrEXm{> zYRI}sKMYkOaXd9AkqO2!T~~3XchtK$sSx83Gb)u5tO^ql(LG$EkilAhD~w=Q{^4|2 zPMKO4227SL2Fxq@Id1e8yR?b%i{JR@?sNEP1DM<}%5i%}sU$5(b&G(A338H3t2oHb zYvU9ph$M*H!@I@0EqK)g5oSBqaijnYKP#EsaeBEjTJU{=4nxMQ0h3~E7?4e6javQj zRTVKa&g->~k_Q86EppG&d?%KPS}(ad2k|7)Tj~Iocvwnvg$-S3`CP!Cg@Lbg*WA^Q zeWtU2L)sGho2Ww(SlEDqz)oj`;=wuA<7hD3*#_~1DgidAc6r`I&}bC`p_drRPcDV*95P31Q&a<_bAge#A=CFL*_oDi^@zlVn~t?;>%gv4$WC zH$nmg_Ib1te*86y_P81GWw+Dot8d}7s(-?PeqPb*xp9~AieGiDHIq(nH!FUSiD`_% zEyKKJ^E^D&jTcc;ST+n8ah4n+?-htrPUi40QYnn>99Lk=#IA-!7>7x+uBsN`br1e} z5_H*x5oWv`2kYtxQ$*SuX#QO*Eeh@10%9JklIC=j4xC&5-=Y0oM5q7HWWAC%uAJ z6Qv$#ImX<3PBub}P$qr_+3xYPU5s$|QcdBlWhHf99%Fs)(oD$ZHcvJpp{DT_vw}Ox zGpeuScQ+Oe@{06HT%4dZ5)8V;|(ZfMPamz0e zyn%di^&j>kcgcC0igp)>nm&6)uIH@jsyX+AoT)bRS`x32a3B(|`!(2LR@ee0zP0yT z6`^$X>@3%8f>>29=_}aoDLOIAIVdD+j?e(Z6g>cw!O2xrZ>Xbfer-r<1U^ z_QOXtw>SKMPIawkmJ=;s@7}IBO#|(F2dcCg@wqhmToM<9n~~37-0CW_a1XEPLRUyo z@q2)p{&`%o06=br5ueB20q}=A+AKXt>|8#wC{rlFe@mZ;8t$^O;dha;S~CYN9WAZ4 zrfP5$nC_ct)%b9QAYNAVst*Vv4o+eSH7{>Rf6wIM32!YL+*wAB1m@lIH(RHQH60~o zC>%Jx7SkgVTlSP*9Ihd=qBu|t3%l;kDk9+Qy5a*q+IYPfZAd-=uwZ+`d#$Ty5hHXD zyD>Qqiylxp_{B#XmuOy?%aJ&zw}Sw#W?lG~9n5jpAen4H7|&WW9%pk5g3Yv;hyCwx zufzscf0mNFbTaEhTbJ>qomrw&$qpp(*y5s-s0@2kbzH9FFq-ZvZUsszZVw;Oe?2Fk?fLP`KaB3O zuj*{W?2;K`OphSXYt->6HNHJJupS_o$AE^;-{l$59Qxg`#N)&8@L{th8QK{bC zMN$jV;T9SN%)_Xop&X2@yX;sERD2Ol4|PQCy4q1D6j{@hlE9PB)AKgL2Z7@QucF2< z`!Jx96E9@R56UHQ5EH*;LVqIu0cjurlA2xqr)&IKVF+tnboL2%VIAOuBLfheu|Ndv zT_GYRdHei&3Je0PepBt4XAOh0n6-z6*y2w}2t(T;Iw@0vMsq5Y-R^c_5=!AIEG|M8 z`OZrGtZD@U7XmE3W%H)o9HCTPy+aS=KwNEOh`*Vu0nLR)u^~U$UYgUQI>?gXKsgs? zo)uI$2Xp8Kflan#Pb(iCt^(>*&d|_~)t|IomJV229$>J}hdv#qu!|p!x7EYKp#Fxe zx8RuKO277yl3Xo$XTOm#50qipGeLNHer4-$fCeC-r-^{cTXBI z#8K0904{gIDKXQaCe|;g@q5Vy6%|-0iq%Y!>t)3e5z>TECmf6P>M3en*zK@RN*KZ! z>#N+gH`7OdqG7(#8Zh4;utKeMtqV+LrLE{lgmHAV%LMf3V)RJ}TeVmkq*QYsWdSpauz`gIyQ_gYf2Ld+fS@RgrmM$Xpe!z;4*5Q)WcQGq0p!(Eb* z=<~;y^H!|Hu88mbw?6XA>LOigC0cc129hJ@WMVQ(R%Nkw@fZO=6)@#f1&<;dsvvGV z^Pd)#YDFp~c^U|2Mw@Ws(9pGY^0Jd`7_W0iSl#!4y!~@Fn;_ zCSO{Sfk~pw9l&ku1c7#d1c{@n*FRus`IK7vPppTVN7K>`Al$>FvC#wbKAVwRQaLpp z5a}^VDIq^cH*p_Sd^XJ2&B9SxVgDtMDHVKK`&7BNG8M!^6h2aJ8H6y8Uxl?oFYHt7X=qe(cAX^;8Gm&5$n3tIOR>rlLc8k}XhCQ`{4%e$Z5VH%GD#d$C>B5p(b zQ=5&9wDxBiF(pU>vT0gGwpzj3`<2Ee?p7>LA>o}Y7{$O`U6jB2OYMfE-HU)c!eSo? z0}@rQ1K_yJG*l%=tNL&Id%T}t4MTVsSW%A|V_V>{r-Wk->q{0pSA4OUkZhq_n@My0 zf&xX##rv(FTdt=3#hU6!wiRNT%HSyZV>U+y$*;*x9R-=E+B z&1||vZ9Bev%fZwAj@`4GdFxswYEu{>M}ID_1g4*rcwKkF?fRne70I(5s*Uv#DWoMOfiznf=g)q9qL)N68 zfTXK`@ft-K7n_4^8l8XUqX-*jMp)(w-^B*Z-qwt{NYt82>i z5v?OnpN-ce<-n(1bLDBNvTA0R6xQgb>dpdTsRqmz4fw6;}jm%-=+V@D~2w1Mqx4OSOM9)tzlkv&YspXGH$tr@qbf*)xgNPG{}j zT3HVulHnMzo_y9`1QhjrC^F5nPEa{|pS+jbIUObA_i=kNS*Y75OLMgHVc~tmu5x64 zA0X@nEB3;H$|B{>)W2^yt{|pv=_fVMp$=zbJ3}5n?owkR8C7Pr+ofDI#G`sy3i@=F%?e0Wa*crO67J=SB z3@->A&OYKW)^&Jr-qphp*rxF3K$@3ksM`j)E{Oln;Iv~+$lbF}medGmf4B<%(Yl@} zF*uMGClt&0Dg~f@#(RP8P+l5L}8sUo@e6v zsFM(er>wYHOQGfXg|KNeAx%LRc7wz2Qq)x1f-#;V-3lxAWqjQ_=WJv$R}b>dZH&tqkf9D zIoZ72k6eDxu)J5zXR~eZ>S5kFcOelj7{x3{($Nm1{XSXs5N`XjWKVmHKq4pQDAACy z-4dD8_NH3_kMJOsiMZK~5p-@O{K-9J;@RKURMF);V&ZiaJp8y3t3K)yt;Q;$MPHV^##s|KBkmO zh8x9+M0S12mq=rb#2~tQl#RZO9x{z*SGf6?4WO|FD46|2F8Q`TDQ+ zjD^cae|yX1i6FZQGOZ5HFl^ZO|eL zds<~v3*b(uzpf8;no~JWdv{UIa?NiJ-^ku~ze;&dnS9{t^G%~dYfJoSoNFpQLz4Zs z0N=-;?Ptopt64vZ&b3x+xDL|Pp0^U52*jAb8ENAw%Q*7+9OIv%=sO_rYks_6>nZs^ zX>^y!A$Z%g)T4{O1#(40OpvXbwnnMRnLX|qOTZfs^;x0=O<_QBb(OrK!w_OwamEt| zW@qJSF}re7s^0W2q}9+<0=dKu^9RhL@D*@^BeY7*l-l*iw zX0>El+SsNYNVdAvO#8`VFD$Cr^qLM~)G#>|brj6JabBxn3V#N}IUnN0hx=S3O)6eg zO3p5PKkrgLM^Xs+L0+MOK`}s9Tvq~9o6?FXhDKt4EyXu(2~TQ$O!NIlN_w9lH0^6G zlt6`YjI9mgX#f+ET)ynMB^^(hJN^F1OXL^<>w}zo{)>jRc(S0Vdv$xtBz;%6{ZxIp z%Y|V=i_hU%9?aN1bj2sKSKF1d&{Ek53ltJF$=`Lf4JTG+Dtz3xVN;H(yUSWnT9;(F z6lRrw`>1@ltSC5HEeHB0H`nDHr`uhqca!^LkXP?eqghfj#sh8RD#`O2WZ_RMm8+9nY8ELC1+OELk>$2K(ng z*~J8AaY~XNpo?4lbFcy9r(dLu7gWxHykX>$%T37i+xv9EPPq@I+I=SyA$p%gl2;kc zP5_3YrLm|6rUmq0@wDkbe`9_bHkpG`1D@&RcIKZ-#2<fDJ!WxvvH6M!9{5Oq z#Lq;O#F35O;r9XwZ`lWR^$ny9y8lYPyb#6RgJ(P7@gMQ_&(Z(W9|^cCI7zwbUFT9U z*H2mr3Sv8Wy#KV_|1cvx+P!&Urh$!rTtHn|Ve?CW_D;VNBvABF-!th!BBA+gZrbRf z!2yN}HgGf%ZD(iKX7>|et0S8$^#TijP?*!t?VY7hFu1)VXOYuq#g?0$^@HwEP1ObX zR4bMvXIlAUYCv&pIJPL}FU3iABL#Q|+J0CLn{?c1Se9QTPBkt-ZWb?8g@EE|-k_Be zf-J+hVI~^{x*I$e1740->HyG39UT}h;T-Lz7zW?FjzX&$#8~dLH>Z1PXcGv3`;3_F zs=k9HWfqSgq$Dqf;CAv$fX}>Yp%L!~swQhGn;nbcCek5-0w8Z~r=%iXK5wcf-tzaV zU&Az(NiIhi35Uv2P}ccu@)f=sQb7W+6ekY**NPTMS>tQ=vrdadB=uT@uzmPRsnXTJ z0MaQSFrjltfsN`jCnWmzD8!3@(6wZJks0L?(O5ulF%8^x&N`qFRnE*o7J@#TocGrT zs=7#paYb>1JRa>Mq#p%EJ`~;2)6}b58QKNRKNu%g$SL+sXEE~V$9MYdcuA6&L>ZYe z&wQEO1hZv6@lm3O0A5BI!_X#mHc>Et3LM3#Mc0u+Gdmx}_OA&wrYZ@4!}Vu-H=oHV zg@GH z%xFrClCs-k_I1h!t|@-sDymYdn1(>Ct_H zyqOl}lzGy}1Wd0&hyzy%3~)QX95&$v@(3LF_qloncXTHqSxAt7h0${!T1r%MufoJD zsQErcYcfTBu#(cn=gP~z1+s&alQ==2l5F2d_qt|fYj#4WbRy3g>S zJW$-Adgq`Gwe+-%gA7jz>MIS!%VM}DIw!^D&-C4MMHiSCDw@umBynYq`D@{JzVdxf zYE>_%H*RH2tqRG1LM$x-Q42TFW_J_!mEl2gVqHwj(YK^k&_3@j)9YusxLbzoQv0e1 zsw2M0w!SekG$s$W#P$-Y6tgZm(kk|Ez%5ee;^v(Ba>QZ0$`|g_#MC+W_B1i(w?n!> zj%t*%VTPi#x;;Yqt0rF z{4fun%PDYGj7C-7=OvzEWL|pg@MNBPNDrSp@=LHG8tR6QJ-?Ms*b0nmc;Awa*_2C!@FR0ahx78tC^lgb zH(SnznFiE<688AdMQAGdyr=K1Fjj;X5_T)Dq$U@5iO3IziWcgw2O>7#Jq^#b#E|sX zg|~_X!zsBDN;liBmqJ~g7uerv4TXf9Tfxgzfi_fp^wkOMu}N?WFQ^XpwA@s_0u5wz-CA7OkHt)}dM`D$@c8aEceZ<}E+DWv zoMq&<@GJfP2U>lT&GJmAm-}AN&B5fsi@`qMMhZ3MiSyF1oh$^vBKpr;>a1xCEgfff zvFL3Ix{}5DMiu9Bt|xtzJp$si7{<^MN!!j1az8Y2Jf{7(qU}PlfzA+EaL}$vF)3eU z)W^a(DsB^DHVTS6UU^c=DoZsIx**PnK;aA5(^Z{`I1bbjJ)ucc+~e5YORemi@yiI~~t- z4vTGQ4|*?!eF6oF8Pec|;ozoWUFH?83L>6ih*=N-WMZdt(z$40lpn{T>MC9RWNp`N z(PhC}X;IEv-s?g1o&YC@G((@bC?(7y@8SpL3Xzm_l=KE0&+JZ|WG*~5h+;TA71%(3 zZhB9oyg1(D<{kBu!M*->4xhIoZ{~H4+4I-}BQF4;Xw5(I$YMF73oW5rpTLdlnb%hd z@FxjA$+52IBvHscb2;?gX?&ocgd`&$35fucSRD!4A)RFx`=D0yrmnV+`&9zsL)SGa z#bVBZdX)ehH~_8`Fjuu?RAn8Z{0iZJ6Rp>RUX`y?<$HVBVznui5|~9ViZ;M7qJ?*@-TK z?|tNXkH3uYoo_vu-D6~&w{EVsJuNX=38JPi381SoaXz8lvG}U}p0zS%Ne*v+Z#EvZ zG`14-NCfe4AZ02LY4E!dU?R%RgKT)$&eb6uY+B6m{me}?$7ok@0t&) zkL)I6pPCpoeNh^6QKGrJcjg!tAQMoWzA=AjJJ_yz$T|my08#;E_5_5@>_9@of3SqV z@t@Mqv65t=Uylm1)A+wDrYr9GhGPKx^_c$CBH}X+r(I@p@<2(y5wj0}Clk|WKZ1gI z-~cM$@87?F-Td=XRIlSJa}VejK|!%dd>*&{aP&`L!h%3qr3eZNlWG;})6rOG-mXV8 z5Fj8xB_2m>#t`r!;ByBm0>#9VVnoCcs7;^oS})*vUI~kBj;`xPt^)JVzm_0>Cpc)) zzD5*e&hoPc3{{su3oX~>H9CLtF+T_c$enBS)uBag4p`sCLoV14H*PI9Hd_;KCSh|4emPllq- zfh~@SnD~Pmn${oW+v|_o?mKZ018Du=yQAZ$52pnBK%yl-yXu2>nP$h zZCLZbbmaX7L9vh?aRT=&Zc1`e9jiG%W-gYs1p_mojoR(a+DrNw(r0|^{YA@7*Zg{L zJPu(0=%1>+emR7HM1ll6Ef`>l1pX`#~1u>_M?KyOjo~HoV7Qr;-4-0)_*nM z>$mCYI7r^qW>=@FdzKlVU_lSx%)*}+jq1WarMbU@kmErToHMH{isT!_Scdy;@0QoShB&m zkpQwTzt`InX<^~P4>s4QnILFJpf)nL$uw43R6x^)*g6=peU{!G#zkN@3L*_;v02sO4f<*S1`yq z7M*O5+Man%^cpwrT2xs#@tCB0ZBk_GNb3L5*Z#c(77P!4*Y8<|C0c;Dv+((41oXl zc*0FVSZILaOxu^7oU>ZX_XMMvj>YQ=T3#eMfd3~rDy@Bfj;&L%Ht*vQ9-f$Wt_R*C zS2a6-tABZANJ$ijyUH`^?Qqt&CZ1*1kW>G0Te;Eah~edirZ@WLA;(=A&5bd(usG^m z){4oA*!W8U0st2(kzu-=vgp?Q!;nN^wEmtCkIKh=tmD3vz$@p+3B2Sf*FYw=Gq+2u z&G{=L0Ub|beKkfxd1D&uLG@y#l}71HgQiD+z5X`yz&WhU9}^sr@qMXWMV)=Op&FGN z*!)u7?sdC?);Jp|FD5pCVicQh@?(~9s>m#Dh*mew(1^6vl}mPQdDdKzG6UYF$7=07 zJE_oKxvK>YsItUpdASwPwiZh_J)Qk=N~87MfR6%6C{p6A-a5Pbj0}GBG5?{r?}Z?DYC~uG|B$G=FwluA{TMytJf$qpeOGtq>Xd6$9s)jgIa!*{-F-{4xIo?ASua6P$SHt+8< zNtczAyFv!^Kl0#@_jUptoP{b}cg)?Xyve@+GX)lCkx|1U@v6{(zbo~^%+rb@9lJU+CNP^j0RnYb7g+Qpegq^tM#U%BkymW z&-eI+RaGj=UBb%BGaH?&?&oW4CPRpN?FhMCS=@K)9Ukm$UjT_@Z7xSL25fPeW1Wd% z;h#Evcn;6kPuwpyrlzTlt##Ia2L?7)RwgE@+me!89c{+y%?*i(6?%Gvg++3vM4g3%TsN`#(IUj&H+Y)xM$bKwh z&}VwkT{4WHb6I7#u{ zZ543=M*dgl36y#UZGr7G3NK$PE33GW@71jI^tM5fkry;*7**s&fefza?E*wUQ;;mj zMk$@e?>dl;(aB)Y_80ikS=XZ_Zkf=3`2!T$tE;Ous&$!JSUm5J=Q*Elb8~Y^?5&VV zSXfw!KO!S>YIsI}A#3awT1IWcHf_2MjwiWqM%K!;RUcW6mc*Rwd=9f=Vql)!gG(01 zc@gWzA2Ap?D(|VAs34tN`f|B$Mj%-`r$sS@ANtrR9_+xDAD)W zk8CvSp4OY+xxR0AB&{R3ypPl44@9{qrINI78f2%z1hRuqi}LR)R5J5&k&%PdotitcG>}6; ziVVBgJA9-uo{*iDkUTDOn-xNwAzZ|g|5|jy*-$XIq1G$bBmPEUGwsG|IzDri*3Nbh zqc3@f;*1Q1H-Z3|C~K!L44QJT8w^=Jd@@>()#H4Ti#_HtCA%Ixfvzn~6EFarK}mhjIn*Z&ii`d6EOK6~zrr#&(t_i-r3J{JNU zAczU~uQ|NmTu`|TO$h+_)B8Wl@_!a8`sv?)XT(eb0iZ$>yB8JZjYt2NUjqD#u@!lH zRVkmdmP`0udV0UNW{N}K@Zqv0$a5H`QW^cMQ>bIaXszwM8G{=9zWnUjTElZiVZ501 zzWEgD%1kr%P-~njIumG$NQLrbpq~C%nPjsUKz@a_fxS=fsNJ0;>Ey2wpoKk0-W^) z=~^3YVF#}RH--3dcW`jFn#wGXeoK9S31gTtgN(HfFAr~)tJweacgoqd#h0~{sBXub ztDw9p?hU!pj)NW#^I6%=B98*`a0=Ox3|zi7sEx?SrOL@UzR>{~3-y^BA-i=@f{v*g zlkV%^SJCsguTVM=&ZC`QuqZN3lQ6sMY?~HqPEg^>C$#+>L}i@QQE`7CeLj?b{c`wr zl%)+BSU9%fv(auz9ts0c!&1!1=_bW&w(EE)dpK`(xlW;m<)}I7dhA|0Qb=)5z^575 z%v32j(T)ppZV%7931;JYlK8!4=!AHzUXqj{aRK#m|6r>)&Y43M#UZ`dyE%V*SAa~xLY2y7)`{Nau`2XQ zVMgylao2r)`GH)he#Sog+XDle0P5Jr%jig((x>U;)yfmm8hOj~H+rO$D-Uo6KL$?n!&A zFGnX@(B13*98_gP1Gtz$GG!SlBulDb`_Fb1+L_rw3Jg|WHCV=zGfnGX+hx1 zk50gOD(-g>{N0AThm!T~UIt-NG6m=%jK2{lQNF2A22R-E!DbhZL5*>LIVcHkX61JL%t4cuI!vKw(^@sfyoG>EUL*BO)ctG&~F|<>4Lwwtj!P4ZTR#;WJK_YFIg0g8iXJMmNOr z=>vmNZM|-P)WNgQZw=SuotzjPJD6*0reKWbfdr({+RGK6snIzY}&4jvm?N6$VOrf#!axi){?zir&zoOmoY zf3f08UH8G07)e=NtdP8kiN+x!SpD5BrprUcpM+$8tE?oLEnSdxve@EqW9a#{GFUrS zuDO_%eIaciq+6a`o%DWIT!SSL>?bE%?uecrG3pD7vd%eXo2!Mj|9O8Ft)p#L-8ja^ znnC?&tbu#x0`~1ob`WVgHHJ5qcbVT!Q%_w}$j42yN+!6BXJ2FJSTOBfNCRdBgbG=$ zm;R7{r@c5|bBsKG%cbOv(9J#Ftuoq*m%_C~hM6$w30TSm*YR#g8ObceRx?7YJGRS# zqsxgmq&l6QtaS*>ZOt89>znmD7`Mj|dD}+=6;jwloTV@EXsm zhMJIdDYVoRdHa+=f$g2-4(<1}!VbVvq&C%QKF+C7Fae{uN-$2rZ+`!>>Gbp0WhWmy zJ(@7Sh%r7x9xVxp9;vahv4<>${A(LJY?miI@FBRRp7uOfq9qa%>)Y&nSJ*pcSbqDy zUHb4yrE#1ld@!p=1r4Z;OWxjpq&Bc~lC-HMvqUBZgnE~+vmGy(7Tm*L*c0^8-`l|U zdfQh@7@-VLyu>l=1(NfMUL&Y(7vJ**9Cv(flSzqH5H)XYzj`!w6iuh9DletEsy0NLAr#M0zuBl)BE z()QhXqy*EFTU0JHhLqZ5^r zySF>#X83W-mAj$Yw7c6Qe)Xu@j%22xNV87QVMeDd35lAVi4Z#{diH5g$JBKl36^uoN-g(NqB;y zG^zMOrRmFZ;ZmCX`i2$PKf+3*|GdD|VeuVIBeYGtOUUfSX}DwQ zr;lPVzqq)F!AGBMha#Peko*46i&+U^rrt;5V{U@=)s`!UV_*;%V&PfOeN zX`_*g>oJiJR@i2BnqqkNJ79q-PhfJ%*A%{OY+^@wsL;?d7vz; z90kWpChoimo$n{Oho+u>3nrp*OVBWLgZ0w&!emqNOV)K}dSl2Ga03q>n9wC&AXzwUdR=IKO8*wr|*I0TrCE3wV;qOf72am*KppiGB|ph4n(FqaYU)rn?=xDmbW7#cYwc!S?G}YJaRKmX zm!pyn@2_JRC$&ZC^-bXeq>03SUr6{)7g-rxUk$2?qLx!x%GYqus_ z$*WVo{W<87i?Zpvk7^-C`ltU8w;^W_RG1d$Z)Zgc-y+r7{yOf_rS*bcW%1WZ5TE*c zR_*CfL?Fg1Q!mV0(_Jnnk)s|9c_R^G#fCF~u~&o>{k7KrI#WG^`i-ZS)^7T2uXQ7d zu!j-DL4$&Z690GQ>%X5YAqM})4O_-!4oVK6PbT?no?GWO6&P@^2?;&D?Nx*02$$Lz zz2BR4Rd$z9TnY$qG)vq%QKTG=*)Ux>%b)k?>SJT{1qCE%32mO9{ThEek#gI;5Pi0P zsx@to!*3~ml>`FZy3<+E-hw?%`JbaGg4LZRyw7rf9XJtGcTpiw^;=b@dUF}2(>L}q z^mxb!FNXteT8ne*<8&QDSLFm3>eBt!kdm@ADG5ftY(HpFg+2t2qD_rYZ9sRGM$J;# zy60Z{V&A~ef#oQY@3NMK;eFP4`%uC$vv)w1NA55OnZWi<;Olfr?HP`Mt5# zl`2$J8sS1>Ac6oInDCi*m#ND=IIT5mRUBf&I{6?Z8R5iTS!I!HqTpq?c?bYVsfBb{ z&B>b0Bno-54F~rxKk-mVVpkJ?xq7@v($#*|QN3vZv>^GYw^e6m6=p-;Eo>;|E;2Fv zUWqWkA3#PJpx9{tR*m6xB7sR3S0wC0P_AwJy$sh4v>B=VA0v& z5w3)u9`iIso_{VA0=0qzfX3n#BT6Ki-VUQlhRUhyL<;qlG60uzDh-M{Oi~v*$koHc2OaWVUVRF z%FSjBpap?~lx0b3VGg7p#zfyUZGB5d~dvDvOgZpWvOn`ZQ zfR+TO3QFgQCo$DL2^9%{GODyNmTZp+x;^2IhHyg|=pB1NUYIACq8wPP?bm1>oiI}` zb7>U!?QEKUel-f!>{yYqMTL3GQI|%$hioKcHL(V8qOV<1@T}cu##lU%a)bmLNcb z!KHP}*I4-5rFTNgsh+Y;1qC912B2C4=t~x5k7P?=C27>GALLbHkiQ+)HUX#H4o>ef zRtDK2FJ%MFQvu3M*P0_8;{_NB4ww7Oc25%G*AqTdrxuJG)09f@f)lE%Re;#S!3T8T zousbXa(g#K85;h7;@-Q_+0%x|i6?qKej4=mtL9Z<{qgR#7{}kl{>f6&Pl}v9$sw8x zR1u;$&9R@Z*y~$Cgrn~34sw-phy9___)4$Q4MJ7EL9$er!eA;6HE#K5(Rvd`@?R^KGl4Kl_3Xm;u}OC@mLTG%w5>TC?9Z ztZT4`HbL2`+Wo!w_sd0X5c~2gP^WaK`zf-mDk>()1N;`SkM-_ov3I zsGAsn@^X6p90R2q=Rx#3h(@;@_pf`J+zD-5zbM8GJAX=~V~b_u*{s@B|DJ9Oc8+QD zxHyTRzyehi>m^csW905nZy4H~Sfj*C*Lzlc+}$_VhiEJ(_Dh*;{)HE>T2uj^Bp=$u zQvbGJ@}NQ*eSUY}?!7g3M`f0wTOxtZroL`}mMh4lm@dHIy*B8Y8aL_q?RVXx-xZy) zJ!Q#w-J7TsSx-(Z`Qy0|1iWBW?|e89H9koT`DfhFB6XMj{Cl0rLR!k*$f*wue-v+M zccr8%WNe|^91Pv-zR_R(JWdngNw7^>nRVk=&HlP7!}#qjRnsTSjNaTb3X3cjb6e_v zLr@|j5e{Lu-gi>`8t)B1jlbqypMudas0iz$q2!gGl1bKf>Ahba9RX=2eRyPKCbMyH zQc@DzbXwi14q&7fD*fq=;4XaoH;pdw{%3BKleAmLpKKSoVH)2D7ZaKcHO^nCYU8u6 ze||B|h9P%9l|=N~kPK<~VIE#bf(he)ebmh@%Tg3@Eg8e-myIjd9ofm!H9hqJ`is0x zw7+GL3>X8tC6tiE9LR05_6}tZ+7{}3}%hJAI+AW z937plwI)<0%|9E{>_ZC(1M9Li}dbcK<IZjVN1T9iw_N;h-316d%ZnQ` z>E&rk)GR2eSpubny((_{`0nn1ApN8&kY@1f3(7BiSGo(tbZK{KA85zWU2=@(bi~<| znYmg2cYBA;&*I~<*w!Wt-58r;5Xgq_Q z4*zFtEnWCgg853VdMHGK-Sp4LDkNFwKgd^H03>z2uda$xfO1DbzF1jgLA!1<$!H9% zHSKV_PVkd|4IzSs3W{)lQL*>aW^DTCy*WY-r~StMcm|_xi(nz8B&+TkK5BC)_ z;iDRNx|pOfS4u`$+E6H<+z#N0`C%~}@NwpNZ_477Wg*EqIM+8xUvLVWsgi(X?ZH!s z-Df0eb0~EeS!0veZLf%{cT-^~8-1I8am5mt-}MzCzW`B2%w~aqQ-9@AIgyV*e`6!t zB^mn|UN8w>aD?t|s*mU(VMc}-=cGY%+LJRR%@su+r2-j0*ou5&MrMP^&&*ZW2B^L< z_b(fT65l0BYIQqD@WfyB$&~qXv|U8eU~M2ML>`gIGLdpokff4M-xpun7|%NAh)>B%yXY1G zMGr8=V%T+kWzlW#p78iRT$m#R3BB<)_K;6HXOSmwh}tuMH%au{Yjd*``&ntx6znj} zv3#tgB=#JlgE;*-Ms2fo!;Xj96SY>e5e(04y>QalcaXW^P(+r6L}L|vn-^a7z85FD z@C= zXr?eqa`En)a%I(JrAF?gU_hp~^4#<>MrU)He3{1MiB|xgmpg3KHodv(j7~5Y++zS?}kCCx$nB zrJsQ(5PXGO2dhs`y-UF#BJ7~0b|6%v-}iAbW1|e>MM9q5vKi!Q58M%DK8fRlmUe+q zsmQ5+B}A<2PxFDqVe;9>Fg8Ez9W@F8`_4hAbeuco(|F45eY@B`-dl3s+}7zK^ASLZ z0DJRI>VspFqN|rK(_x4&qp$Rdnlx~0nQ%Zt>wt>OnA<+~9(cPHVBg8;cO4}Y@g8T& zf<1P#o?QS6oSo#)E#akG@Z^%>{H6RevlyCx-}%l_vq6qTk*H`%@L-{+@>8{kIkTp= zG`Ds*x7iwZy+;M@srl~JS2d^AGv1RJdpb}>^uoUFnf0G-J6B@#$T3~rI;(6~sRuzc z;Lw7K8_FtyTi+F^pacQmuQBkbIw9P@YFdOdX=y>YLj%Bb>5MRWP6A%t(}VO*8Juc= zE8IgrqDKYssfy;E>(2e^tnW}7dH^6)xXy>EVIyLq7-k=a1ze&00t@dWr$V%FNd8Vn zx43+HLqzOfd*E!|32ppLA&44!a#tXUl%@vG?V5d_LJoat-s>u6Q8q&~STnvz+jHI# zv`qZ$kpFtgqaILJ@(?q+39dqAgG1GS_7QncQCi(JPYufGry zuo?D$2gA+&a@^wa{`L^e?&SW6W{yKu_}4l&0MV7IwYu_kO~>|cC~ns4crb8(i|>q^ zA$~p`?oOjKVb%JUP@o%@2Qv2Itnj;rc50K>2YI|;$UeF0kVKHpSrpiNtUf{+jWJFL zgti(b2g{3DXI^vy>&A(CStSN#_w3ijpZn7wuV>jygM|O+S|%9R;}nKxBRs?TH)IZV zr``!ZTXn+yQI=wDD_fmOhjZl@RD}nMz^r)o1Sx=|18he`{cFL1@J>0@g?1 zz-j~V=lb*YUv5=Fft8@*HUJ$jXR;<8q?A_x3qS;{u>}F30B~Tj4!r(HqP}|Ft&2 z)zYYJDtuyiA0D8}+)ToqAoM@1R$dwx3sj;;2wRdlp;7+L$xC`=yiA21wFG11L5OPTJ$P%nkm6&u{ zwxi8QiYUUVRNTO)CM1$?_j|sOBOFfdq_4xVpdJ>^qw?wq55Lt9 zus)4_cbllD;sVZpQHI^Rf@6Id)4Anxr5#fYi+h?mh!N-KDsG>^EJe zu6kf2ys&hsc8T$WLI-L#*QM?rB#cC1*&UlOyOx6oFuV>W8a9Jv(~ofOd>HL}w7l_S zRQbJVnKzLXXnaIfgwFGgb&N<$d(@wPO1}y49lx@AwU2^-fL7V7z@4a{tYkPO5&#Fr z)a6WS@Y=4dz8t~C4BU?17C!d%U0@>x6qOenF?A8ti#Yd&$so8lv3B}-&i4f5H0!$y zO@n|UB?`f}x>gDW%j>2)__Ti~a zCIN$h0;1u6^(RBN)b#z!(oxUBIn$_3tcOC|&~>`%aa3Z$wbvrCVr0J4 zG)QnFs`NwH$!zmormfvOBK0}rhc5i4iwC&ROw3+?9aaU%1k&)~-5toh1$GA_UWavx z4M2m7rEbP)6ufLD+^k3%ls0xe{wA-{3OFc3o$r#%HJi6jMIV6y+TpY)Q-&zyeR2N< z5KLj<2H<~O^*^Q1yp7W8R#>(FVuej`-R1TH7E;3F!@p)Y7om=P;9mYCOi{E+7qP<8 zZbV0a_&tp$5t!U6;y_0*fdXUiQ*LR(w;{qsxt}w;8DrV2`l>uA7UYOT&Y*>x=skZnIGyvK+^3M90QY_SPQiWMRzO}5nYck=c8`KYp2lmWF zu0l81h}-&FDkY%P85vtR!*F3!;F#QY+TH$t#^%_3vJ=dvCN~m3#^d*9Klm{ja>QMf zi60Ntc&-V;SB{hE-fF@RYKeQ6*E$I-VhLNdp2t=d^0(^1u}|p8sFvjM4F}jU+}Jbn z8=z?}ZDiuDpui0UC~YRNf}Lvnv{Pc+wr^5$@dROMQ)0SZ7}}Rw8=<4)3^m~G*!8`C z)7gKk8VgOS80NcZrahZi?D(Vo!{%$lZf~%0iH#1*lj#eeZ<{(8<+_|VdYlKD#mTFt zT{`N1_a>y#Fygtg|LPzA{PjP*&HaA3lB7W{fSEHnI3NZ9^;W9?{Q2|c*A8~;h1@Zq zu#pT!DmWMzAua&WubWdC4QBj~0EwA@nU&?`;h-QuZxYxUh#Eaj!C?U`uPDU0M zp~C+qnE&UfKhm>vrKk*0BdR1g#IYiQN;x@XH*xguwGp} z-E)?^#p(+I5QGT1Y#_f&pmK)}?2o#~{hYs`C^z4no>jgOEk4BvKjg|b!iso>`3;std6R0YHgFB`)+XX0nzWA0^^6$>JDyec$*!&8Du_PmsJ zW+<@Z6SvfV6^*eCbP&0~FQLR%8@ycOU38nps;DooA2Oe&2v*vCLM*T<@U;sZt{2z>E_CJyu)4vaK zqMkfx2?`8MTwPV`929|o^nHE2QjwLF%~X{Y?pa(~N-ZpZ1Q*7Vk_x*8PxC`XJt7Vq zRV(=@FLPx5P(~B`m|s|!o|>APDHr;fpPy&v2tHcSE4}NXuZhH*<7i&8h&2;qqLyLUfkXEB|1ld5&{AO5~8!<0}`sc#49pVwzBeg zzRY;O)61NHo?Z@|$e-q<`(whO+xO|pxGO=Wq{()5b$QwSWTBZ?Lr_g^e4v?iX5W(qYs_q1 zduBb6x}G%z9K2(t-Q8MPxaamr#n#pqh^jORav5%aU0<(UhT|J?IZn$XPYjyvd>Cus zU1Bup-ft#{ftZ@k<4yrwfPAV<<$zRTLL+Lj$EY@$K~Li0GtbBVfja~UbZ-7?hlj!Z zi=x;4Yf5r*b*ZL2A`TFmsfw<4LJ0W1qknx-O;Zq6G8s#Kmx#s_0)Unt-k0cicR6%V7@uaB3GQ8>%$ z`FDQruge>qI)`L-BZ)x2*wB8b1!DGP0UNtDopu9P{l`}CU{{yK`Fi_uwca3y?MkD? zbb7y$TI?NKSRV+8yWM)5+uL)|{O>0%AKBahYT;KPEG>} zl+8H;2LfLAmpg+*&dxHOd1$>8-Nd9EaB>#l~K4^}gihHeYN)0WAxQ;A?ND zzB({atwgH7GjQM3WP3ExYwQa_%>XoU&J%<&?d4Yl7fN@VuU~a#WkqdlTx@JiTwF|l zbah=!Ouh;W^Tz2zBny6O$B7)U~|})xgl)}DJRx%UGC_en4geBn|eR( zIp)3^U!CvHs)W>sIC{U);?*Sbr&}(e!Tn|P+Z$XAmoERA5@G)*AR9C~lO6unY;ahr zIt9Lk=EycXIKhh=X6a zd}xjOd|9?0RmGZ&u!%&G$hcOTv?~hQ$#&Cy+Eo0#vhJ*mLvg>O|+cBEWsIsJVz zNelok zzKI%`3UIvn1-Q68Haa|rS-2#o<$l~8jK1HGd3;Y#OG}H6jt&nW+3t@xf;${d$+>1$ z!7wQicaLi6)zjDc&Pg+aH*RQi^MkT8E+9a}qd&_= z6_PkzdQ4p=CtE7wvsd5C{WxsOg*bCY(LrYEWi8N6ib8wtLqq3-k;~o&Z4U@>GVBi^ zwm6PlEq2S_>oF!CbX2lwlK@vhsK4>Ue3c6>G!k8r-b%u7JdVzoe_ZT$`?zRJ=y42)H=Hc7Njq0-E$|PyeQW?@T^_UHv6%!SLFue;}=PCKl|%79e(zQJDK@L+CK>!ErmJ$1`{R-(#^;3Oaa9vfLBmk#I2w zDH1)f5ZI{_=) z#x!?~e4RO1&r4?iXMaLc&6KFho2u$s3$oTz#>u!x4(!fz=UZ~_qn@fRl^CZUEAu#< zymYmw5Sd$+T-$hleGe%SbzOC?kDJ9QtQa8B<=NP?-eKR%e+!KFmz&Xuhhu^Y!zyd< z4z6N)<9?Q$P0K-_qR4i8<}oxSVzmZw_KIGus;Mf7ZJUd-u_)$B7vY_*;Bl(sMSS zg5hmn?oLh)m%;~i9$+fGR3Ti? zMk?ZSe@+(H@}34u%gWl?+zNSGjRkz3@vyP+v9YlU2(azH8*4 z+6zY)m5shT9d+wgx7F1-Md5IJdO~t@b3;OUvTzR!G)6|@Hd@Y>Dkma>B6XEsjt+en zt2)*N{qNpH{WrJ&Nl!Nw;OZ-HA{ro3(vbkMf1jZO0tAo?1Nq+zQG^FY5>ujr0001j zuz&t(D*y)R&nF7epHH$sCvgChf6n0mVu2MI06+u+`e!I8IPlXS9Qr>@@Ha^Pvk(59 z7*L=@|D2M_YxvVYGyJWf{u=g=>8g+{po>lR-87mDn+`{B&LUBoo8n=@ZZ1}hmvRfV ze~r~41a`I+$$ZA!^IJ^;j78F3@Pm3CT+Mk#wHpezmhR>+9yNuXo+6VQS}UTha~0X| zR%yl|QF&>Mx51fhXZQ&w zdbCfuisqM*$<_m#NmFl(O$2awzqMi#f0DM=^xKZ*qBmbyWuhmp@a-~N)#F2*ty$^` zg-?rP%4;;wixONO{OmUC2(@?L-*@mp@7)&6RPU^aqj@>YZc0(NTc zo_5PjOz=)?#H3xj9AqP=u`WJ2e=D=9St@8>=D~CpKZ)<_bnL~hOJKOqOnz9R5PWrI zYkd>Sv?f|K+!|gdtxAGjjU&at!(&-tbpBA8MaPWhdA_r`>ZZJnC~Ux%F$@ul)q^lJfAP(dZ~yYD zwTi9i$=GvhBQNXVk#bb4`uln&ti+%Wt#k|zg5BrG^260oMjr0P4WZDx?>v|i8O0-B z?n;kAPv->>o#+P!mLfEpPHiH%Bgn!G+~fAvhaFUiMU2}IVK$~|2R(F?Wd%4EjR`aQbiA0CIM+&jM+ zH(xtWgzI%qV$9xoX&P?uEG8(nFAMDGDK?YdnJT!ex;oms%f8>@B|W@^xTO2MyuBmK zF~V{A4308P9`Tpe=+Ei-U04wsAN5HoEIv5uJ?X|Dc26zuZ*)QNfB4PP5kZYWuT5>< zFq7-F?_0ay*7O^~uXUcA)DJ%#8a(}=_bG1h`7s=q;kWOtf7 zxbq7B?r!7*59jH^@5j1UfYNaoY{I))Qo_y3m~&+%Wi~f+K*s#fe^Gi26HE#Od>F^;)RMY{W;)YsJqaU8un|A*KmT?zETqmjaUt3@ zo*LN1OYTfzP;`SH6EE{`#(+V%x8-6LOnz}lm%m!(X*GrCh$HJ-yO?&LNP7G&vZF(w zeSgqzU5~r3-xJcgYR%Ak@0*IA6%^j90B3))MM*}sX5Ocoe^S!ETDBGOcYBETIzA%> zRPYo@sO#JCIdl)4+@#|uCPQYBwJ>6%y|E`jpzG?q(2YOue4%($?-fAzlE*xUqp;S!P!neJ5pntb zAxiV$oPF06f14WdpuK8Dm&HXVnYEf1TlGMY3&FGjf&_&m03zuVV zXUpeu9Efd%Cty5gAF?y#i^RG*eC`I)k8lYEwr{`+f4VQ4kp~JTrCa1s?I*G`(%z6x zo)+aJnMW%XWbFbBz3flg*a>_x2(a5MSK{&xg0c2#DhK?k2#u0j5u;6~3>y;4H?@wU z%jSlt@&Zc@34ySyng$+9#g4~XbR|Do;$mOwzR8>hrd4&|!4{8ysq_P{>&NJT&_ST6 zi?i-Se})$8vOIo9>y3YYX{8V(sl4v90T|Z{nP&J?^^~-XH2SCkE@Z}de9D{Rm2bk@ zgCEZbMH^3T*j3-FO4xT?p=(1V!A=B8p&qko@_%XABi#78}e-NGRR^p=`wyfK?)=zgn5zIG?nqm@X zUc!A}sJH2?0f5qS7$n2_`QXT`_?y2Hdy%-~hGiH5cVjP9g!m?4}QAN7ay zx=rzZ&t6K7_2Z||cRBdYv)Y-bo*B25nH^q*6!*irs{*=jR`tZcH#a<6{j5|N;7*$! ze=o0=Z5y;i(Oi9`Hpgb|p{LI|tFkg9TKbU(#o-?0MpnFBZr`8PJrD*9`3%vmaU(;DeOF+u^6YgOSaeVU13VTrrXer=9kiwG_R_b^Rny29r zJ;tsQ8C5s8(#I+@GBI+KseVQjWDXt!oPq_<^T=mR44I41m-{vMo$)^RvWfVhGM=tK z3ocH1(s&Z-iYw1FU||q|j<5S^an9tYJ5jN^Y!>i-+%$3Ke`2&? z9pR{=?JXmy85|(rZP(%`nX?B%{T&Pp7k{YHxvcdd3=Gv~?)qK0{*(eve*JX8!n!)o zQ*SY6Wob~9c=I@n-^M*9Yo9dBV(8tp>N+Pff5~EDI_SL$L)!1Azy~tY5pHR7??p2x zSnoC(-mZ>vk&atWJ!fTZGcv(le~CQ3g$eKE=)ESZBcz?an=o(}>4 z-llArte}apWzG;;Ab{){!Sc(kZHFfquIn}3xAPa53tLdrDpGopCc_e;riguMg=cx* zBQqc6^l$>7mR7a*XJh_*Cx?R%vo?j#&&+RI$NU@>&e5jY@XKzOH4Ketf0trlK%SBX znC_luy?{2usN*acPv-ni4-skNU`v_(RiO3|(Uf<)?u+RC=*OGh>C6wT14=B7Inm+* z23YYuETXXI?9h2^$IESm`Rz^}W{L^FWe*U{eAf94dEWQx%lxf5Y@g$uL!;!tBL{nj31j<@B5#7&bqfkpX~mn}4BMihI3tXU^hN2j;SH z|3g;xZ*)uQ>T5@q`CIKb;Ar1INew6^kAjk>|F$cqQo66a8x!^K zr2_uXV5I{8V{WD#rJd^8TN0G~Mxt%Nu3$`JDZ!b^E0^ zoZ!*H`Ve11WC7wr#gJvUNne}so-rZsn`lIaM&%Ei{x&h{#>>sYI+eop)|O02AU3~>ANsr?H< zqf^JHfy(D_4~phiBCJJ8rzJW_qJe8$u4Zu>)*Y$6d5E zVt1o!fBM@2m@o=8 zC0*u$U2l@;f9CqzL%3cSh~cp4^3;Uu?JGpDhjwLV2G3r>=EU7uljVYf2-Ks&PBW8t~olL5;O+sNASw| zQ^-Il*;H&}oz3ib56A~y<(WsXeST3-^Rj@4dmYz|?HO}-xAkl{`*w?eRPW1!6>rM4 z#YPmXv9-B^IOqVo>rtJfb zUReF$vAc681z>GbpfU+ehG_J*m=ep(sJs9o0%#**OGY}C@oa8x72SO?XrS&eRV!KhX;dH zo9*|qja6T%JuqX%|I|l%@~g>DSBLj!#ohQ*R96-1dTcj;FZan(X1>xO1XRjebI!~4 ze^Z!$i{U_$Vb4lc&vXNAQ!L{TsVnF-y$z zbnT3MR9}HX^po;~PaeypRBf$!=Zi5Yf6z(FgYu?Z641Ax!U^6U$c~zuthhKjmX|8N z*Df>mZ}ID$nemQygV$r2NwP1V>j{?N=MY zHMUia4>t<_3TVEH7hlm5xvRQEcarblr5e?b5JT(aB@;wfsS+Z#WxJUmir2`SCgWJ;%w>fluTK7QT}(QTDhD-5uYGqcV-w%aF>+bUBtvPZs^- z3Pk}<{2 z`W_U3WjW{AF@}3!Tt**eWMo(&$18C(cDL9=0TDJ=x>yi1VCCYe;6&Gcv28>2*VweJ z;Kk-ymE2vcs&L;RrhCofyZhXQUbu_4ntsiFBig5zeq$Oc>3Zzx1I}Mpe?|#7GrlzJ zrvt^q1&eEP$z76Cl5w#Y8nXgvzpNizPQHm%n@Pjb?CmTEi444>imGOE5M-#P_>v+w zDct2Rn4Mio)$mkzbJXSeOrp0Z-`kf?#8Z%htPUXRd(wuLy080KJC}?+yP+@bk7v+c ztwiiRN_d}(O0~ehz_~p)e<^T%2(~5|dV!$i9?O+YTn5+&qtcu?|CGuhHJ_}y*F?Wg zvNK^#YJ{h^)p6H)tkJ1yDyHeTn5^JA^M2W%ubtOlrC3Q5osCc|TP{^Ie{jsump98i z9?WpLnBFh=#rIzMX8XLKVMi~y!m)0-vL0*FR9vQ4@(b!5&N`;Tf4J1Oa8TO*pL`VzV5w%tFxZll^yLn=L8A^e2w_ebEhsVuGCO~ZCQon7Vboy|1?92-^ z(LQ%=nC9%>6NN#v1(*R$gYz^if>vGHXyyBdymC@)WbNL3VG(b2Qtd@^cJh3>?#wS% z3@teb8cvsTO(8lWf38ADzau+sh;(u*rFZFc2TG5Uc1Knwday-BG7QiuUj@l%!cDpxwHIRR{njk zPyvc__&*~GyFEKskKX(vc__9uKq8}r@V}uy|JF`Zw(0uU$Jp7{3i5P#&TC8eJ)?xa|aa*5DLP; zdrXh!cbWVqSApAXQB|2A&H^$=DEI~fgwFn|Y*zAm2{AR-#ba`Un+`>azX%O*Bjt5K z(Z$6kXR0v~e_`sX>aFf)C~l%)$B4P_f6{+lojbodEFx@wv;|NSP#h?@n%4cqLFNxq z97R9CUn?giIUhL7FCoMKMU#MmW;N1%!$o--3i*%aA%@qVGEx6YtTH&EKw&X-qwAd$ zLS$6<80+rv+p3ZQcpE#slF>i5M#Cq<8u9wjjDK|ef5T{!84UqA_ZabiK?DCQi~NW7 z*ws2c34Ok;0=)7JcIT3PKeh)(wwZau<9PNZhWYUs{EvJj;2N(u+|Q6MAx{1V)m`+6 zLI2qz|L;lbZw=2YrZ4N?kDfweTwI4(`>Y4Mfy$sAb^2?9;5VEVc1|W17(`flll0;$ zJTfE4f30P4F&%`zR-hWoWM8GYch4h3X*IUSN$c>vcIe+QPO{_rYtdZ65t{PO;7I;1 z_lmVzoE2^cJCQ?6n)ScSHspSA?DpByeFsxWgUUEvb+0TO1^H`hLBoE(%Uqx`XjcBQ zjcdZMH0!^L!<+E_(i~=hqK$aC__fg6Zqg^Ce{XA++4HjTig1Z)uCX^iXJhbe$}Rp9 zrC9a%G@zi1rv*BjXNi;$Qi>GBok7?Wkc95NpUC zf91I(TW(oO{$W~UBpwNorW=i4%h9dchF@OEWw{5cWN zXE!mB{&gFLMDT0;Mlu%f-so^f{FXp|C%Fan#Eof!N1yuXc8LdXyGnC!cle?>_& zSKf}^S+w|walX7_+~q8MohAJvz9bJX4ugXsQ_^_{bMLue3qrL4osbRrC&zv zqf9S*)xwc#>Kp5Z7D)6ui)xpFi1)6Mz!P73$1LV4BGBlCaszp}q0B0g&HX=f?)uJq z-mS%ys8e(V4!WYvQ%tr_a|%S{pIaIYC$oD(S! zth!=vII$VmFRV2Jb!7Tm_)A3KW<1A>`5KmfUr6BHq#p^2lM$d0tz_z9Hm6hETqMbf zbKa_&gkhkfC*vS?gy=}3Mu>ez-TlqFf|DH0rv(i$L+mW3Ig;2WMxAeZe=XzaZ7+}? zm3Xe?>_~Qhh<0oeXWNqfQubYk8pvz7&Oj6`+L2Z^LFQH5)5p!_sQ|gp#P|Nu9G7aN z|0cIr34@bL;>H_moV{%;$&Z?c6*20o{(JSvBwsQ{p-%p!pC82};;!0%prXc~`v`J@ zWoftyHBiM-Nr)f!tm?a7f32u+d}^ag!+h+M)@Xo85_P5EixD?DDx1%ex4$mHLBBem zA}DZ;WeQ)h)Jd0qLJi6s~hi%-9q00vHA~h?wPC?7?|%e~bZCBqvmAsKL}7 zGP8ek0%x;qD)wLnNQihVATFesH%nPkU9!Taz!q8O3Br>sz=*yy4(wawR0{HH4kleA)rPYi$mpS^F(xX zid8gaQ?av-2=uFxf7MDFQ>TzREsoT70;Q#oZ=Qnt*-5>dx*Ir`U0y?-^QCOR+~-({ za#eCf9IN2x|L*w}!EPqoN?@}?JtNCyk#HS&Q-~(Q6u*sPO5LiNCy2}vrJC?OPpo3| zhS59hgF!p>h@6H5qd2)6(xV!pa#VYp5PEc`hi z4jM>rK5{e2jP!74ZsF$AK!@yBy2{a~q@HPrT0AeagZgPYQmC^t&)2;@apq=L{Ph|R zThe$Y1VOWT`=j>|Yt{JR{EV{lD}J zLOw*Jg3s=(U{n-FWd(UYtWL1@@q$ca-5@hvX-Wl|hf7u}>YqPC&KX9{W-{p}6ut1` zkSZV|^oBI4kwt3DI`=~leSx!{HaUEK4z;^K{kz^@e{hhx!LHkA8EHz=kL#vNnu(Q& z6HLE#7~SvB*j|gvWzUu6C;LtHYA$q)B;@g7LV122b6ntFXz^$>f5)LKV z`+io~7&BwzZ$w=2KdG_P<$BQFvDdhTUo03;(eLP!hRE@`(*w7kZ>Qyc1rMX{O?UTk z@1gnXe;3OQz5-`{416PjJdrnQvMs;{@hwj)zDwB@ybiOuvvNQQ??=j53DgFFY)_BR z{cm~H=*col01M4#4;3-r1;+any1!k}9($38CY+0;ngBQh#!21oC&fr|P5YVRu#a`$ zl?J@PWad7honuaouwffB0|cbY}5$MCy?VSsC_HJ?}FXb(Po{ z&1^oq_#FR3=Ik!3677XJU=}UhkSe4_3&SnpsjD>I$Mo-lxhTRhf)i5-a$rm~9XX9J zqFZhp^W_C<8hN_xaQD6a=n?9@+Q%QjqsILS%S0A?F z2OTF;rSb&&G~aNX>*2&G2X9zRIO_UI|4J#d>&<+1$7y_uj4(KRgAH?rXbiFWBdA37JrI@R(dRc6s&$CnK8UMnHz^T;dH| ztn820y^v$IRLs=lIK_fzxbN_#r@)3ce${?klkc1GZY$L7wr8Xo{PEPY(PTbvaThVn zRmE{V#WAGl%T@_x%pcDnVawHkm-P>d{*q%PVhS?5RNc`N)3Xjh>F83FYZU zdorl%z7UUUH!T9c-{lE8aMrk2ez=>lZW|HVFJBOHbKqB|K(O1lDgUrr2U0H)`XmI< zqW(x@^?+lFTQ*4FE(lxGuP$OXc*!);rH+gHf<^?zl>Lm*mMO-~ys&VWe{F$;!$u}; z8I2ejPbR#%8)6l*t^9+tNXP-o(pj@V)oG|D;nG<*Tg3ru?V1S~t z#Ovj|-T`}vY%ZFxcgge9koJdtd)_+^)$RJz#j-)}lT@d2frf1oGh!V_%V8sX=k`7cntw!49ySP2G;29x|hTleCJD`?W< zvUQA=@?cFQ>V;eCf>1brn=R~pYH0iJeY5ggT`mf)^eFt{-Exj`i+Xf7p*k5ceZQqas)xXLWV8DneM6Gw>LjJRK@fyz=B9A`7fCX0q@fG1&NU?sg``-0W$d>Rv-joxEU=;$D~bMENvZVw85~l5 z`>}Qw{C=z5Bu7W`QzcD>MT3>VJ@_wYaXC$ja+KA$e6T;w=9+1(UuoN>qOvl%u#bmn z)@}3JOcmhn`rKx&c0cS5mpQ~!ArIV0O~LB@Y+d&a>A6qCf4dgS8uZ56^e>DW70Bi8 z*3H7&WNN%6HgmwO>#KIJ_ag(?^y8_ZR^QW|X<)e>?!H16*Vcexm1^c(j4!X&J^uluazrhT$xo|kJ?&` zQ|JfS!kcwlu#m;Q=8h4%6N2*KQKYK*WL^Xxj3`}oQ~N3CY5 zQpjbkHA}w?ye9;PrK$Ingc7hY(%uxHokNQW z>%C|tv(P3>H-kKT$0XgYDcT3drwCwM_Gw+zwVT>Bbh-?<&D&=j>?&+RDM&+~^SpZ| zk=b^wY9=5LMi421a@Q{iilv)TFkPs9#*N^ z;Fu<^+A}-Ha6eKr&49pPi#F-m-h3FDlCkZP!dEFu?_AA!QLbfV#3}%$xMO}s?MlV@ z{sT4K$W($v`%Rgj@-ycfJ_rfXDW~aQM!&(3e@Ylk6;XDP_w^BUc_}YxJ1dwLb((@| zA;xU(NrGU389TJ8YM$Bc2^M0#Zj{N4KicIQGWzGl^{}I5WE`E+-db2z*6A%z|N024Iw~qe!?q^fKXuyl}{RO6;Kc9b8DS>z#l{7f| ze=hH-HR5d(G{f86Zy(uc5kb<=9r=a2N(Cu>x((jAu+O8+-x!)iP0ePkN77%)vP>$3 z=tj>5n0~|F`(Xo&t}ZE|7CO>VDJD*tJ;$uOC?B-31x|Fg|sW1ggfMv;yh z%+}Q)ijigdj+6XIGg@iIkiHY5m1kZTqV&oOe||(?z)&)LZbot9k7VH&GWDyQe=kg2 zEN;HhKRry9&mPJwQ%O5=#&`3q=g@Tc524w#^1kEpK61*9UJvA+Yi}O?VPuxwjvewt zO9<@Fy7uz!#A0u?;i79(<^vJ!{A@tUgH_p-XlizxATDJTngP{$d+^y49k9tfd-(Vm zjfYv@9tMg0%tF>SMu?$;+Q^Wye}%J5cwV8a^axXGhfKJ6H$+__QY|A;7PZ@bBsFC| zSk|dpLV#r~_FNKeCt9D-v+%X)yQUV3;#dIJs%*g{-mf%$4GYUNbd|m^dMVU;yWCHz zgM}Y`d4Gsf^)e|AP^LuN(!~o-O~TJr5BURr@RPTtCa6fA7Jb1lZym-M!$qq+;2A3iy9*i;{z(jBdw4n&Fh=Df85=QIEa)FCGsr= zxXMW|#Gi7rbfq7>1bElq(rGhsFj(m1w-eMYSypQ(*KOuaY2>s5BugBo01TQxqGe6y z%wg03>hH8I53xjeNt9dm96yRxkS1O{Er|&kd3*_$_-HO9RuZZ z%$8uSK&cAvpG1>gLkfblq>^H%N~yhMy*{rPLQdO(}C0uViuQM8X;yZsOckZg-2$WC5q~rY=a2 zqm-j^XZx1me=~7}$zju^UOEobIodc&nOfYcWE1xrbB+IULQw11c;w0u9!2a*Q>lx1Px1afx!dMe;Y92E_>;{ik9{kFCFg zJ|4Eze`Ij9n*u<%~q9~4f%qB4Zd z1bsbs9s~j{uP~F*yU(CND!&DNTX__E*6^vZMfn=W8o*KpeF$^#kEOfigpY7;`@)Xc zZ3{WR)5F$n!cVJuLwx7Ffm|+OnK*Cz9Y1-nf9TBZPY)(x;+`Bl%~BIi5o|Pj2yaqu z$L$QH2ZHBL1YWtgxR>SX_e7-LdViLyBmF$u<9WnHNBR=+Ol~4PtMgKb%HDncZu<04 z9meE6c^m&s^;kRq)|VxT$eTHB^i$Limw~ef*Z~qNul%9~J%*9)H0bZFoZf_WbvfW0 zq7}bgVp%)9?F)@yfATzI1@wAP;A#-le@&q0e5!P%o$l&*IdV)|oe?<+D z$9_-a;^Z3W;C_o<_;yK=@^DdBR*93tcln;~xZ;%|V}s+4gsn!7HG{k^;(HE!KZ$s* zOe~9~)L}!ZRReY**F;cxIcsrf`CKAC=||3J@&yQPlv+*DP}-M<1ZoZ1AiKAGeSm{$ z@gUl_^TS7W0_6y6C^FmapBj;Se;Utyhh8~kJ3V>*IfP56#`=DLJ=Oi{Jqf+i8`l)! zrWq#xys|K?`=aazOi^94l#4o~RE0|Kf#~+~l!i3c2u&+3R=_}*w6?p$6_>Djolp1V zIm@@i%_;`{pEXYQTE2l ztb_{US?!*|Cll?ojz1)Ef6ZmvfAY^kS;T?a$9It*-%o!$7W#M{@rv@}yXtVEJCrqN zerdwXOJB=B+`Ug1l~Mow_^1E<^?xlFQZ+n097QF)!RGGdaL|J;zik9yC(YWV&cmKS(_WPGX2t6gc|+$jBoDm{PpVz?x+>@KMqy<dg-Fa%a>bGX~_B;v=Ng^Uk3kI;C!!nGb>46jreZwWn4$7#8+I+wMq0dgWNS{oePLek#b; zY1g>|Ipm0YfBmMIWn!!C-*Zb=%5z>=cQjep*_yB0Us`_S)7lu{uVQ3$-Q^X{Hkd-2 zM{bP{Me=jAXy|WL~|+6mra z-tmS5(LQ^HDXaozqah9tp%(}h`U zxRlepe{9HnDjGRWw&dDgU_(>s8gyRV%Lq$bnevvi7qxWW3tyFfWjl+vB?Jtrd#6EM z>sc>M_sV;bRRPvOcg1*ndd^ZOr) z))g9IT-y0RY@Dv*A&2Q5q%$g2#S&T18d6w+%?2lRuw5d=i{OaK8g>$pJU&G}+PV ze@B)Ri~M%@ZgUj&HNM(P#O^K&i|4k4?9mG;R3+bS<6n919iI2=8S@_ju711E zhBQ{}{;HV@Y8kqpIbXn;NmzaU-=v@uRf)S+pXut)W6J1Y2A8)tEklXK-}xcx$`3Y* zt7S}wR^!mu&Gk;O^)xQi+B$2l!)TSxe~Sz#A?-ImRX}Gz%x>3!KA{MomA16HTLeBL zLy7eeV(T@5lKgckh~6jqm@g8p8#c2@O3has`*yLC&YPR?mzzEH{Y&7gtIB(LTikr= zU*q3LN2gW(fs{#ORRxih=u=#eFE73E$e|M>K z=%4F6-HdxC@>DHPf)q`^33yn+<&Hawj7hZ%9GE?SGd4D{k^VWi9@3!cozA3%^vZ4r zr_OGsZC`pVN}20D23bn755KV^gqWs-g(fxmfYZuB40b{YsH;q4iQTDLzMKxxe~-w7 zzrFv432j{H6?s$^h^(XUYNv5jf7>=;!hC{s@h`Mq?FpRvzuCcBh-aIx>eQ8{q*u>Y z@)5E2X|X_KNhs`&2QkJpRs7&qBt8HNnk@G1j}5%%Okc!I zevRnS!h11+-&_pjm$l5>u738M&0>MeKPen9DSOt-t^>6ydDAuVDo+0D_-gf1WHUD6 zHTSffy5l0F+yT@r;|2_;f6FA~*=}f0L#i=y`8q|P!6QqhCkOup%Z;f~w-F^lH@9yf3@ua5TVA>sf)uEav<8B7e{WM`{^${~LY+8t zUXL?|L4R2)T-9BjRHW^OO=R1j>)v(;_U-HW)fuZro^ZNx9DHd01?($m0N^0&a6vNo zSr+|JXuvOY$UiXLU$5FqxbSjeVv@16zC`SlC8Kmk+a~6w8ObCZH_OwFj8u}mEAMU^ zi*w;^T|Nz$(?rOxe_}o4q*=jnI+lwGt*guYx(f&0Ly?B|ac|V^6`n9#8}6+-Kk0H> ztx@;A$!P9-9^=9JZDEwwGWSoz>QEA3tk0J*j%=n6&`{A1jQjM5-H!S)S)RY*4j8;?%>f8VO+e^O21!$SBQ^vk@I zfo*}P(h;Od+%{UflcoHI2oVkF`rm}kGpdOGWZrVsY$-1w9NC zmdB!B|C8q_e5Q;(T7|@)v9YmS_e+0}$jDL=pCmApMu3$kA7bXN;+UA3!w?V~4j!26 zPMO#Q+7Q|mf0Q(*8hMUjBf|V6_xitZ_`4^J1-}Q&o3~yfA?8-IUu;f_jWsthiK=54 z5V+2bHtUX%l#uwOqcdWPP*&J8A|m3dJaTVkr4lgomKf!Kh8F+UNS}*PGHx$C;Y^-h z|63gICE}4Np5Xr|_MZTne=DAm^|Yt6Q<61dEaS);nkAaB3UbbnJ` zbu$&x?kY;ZTl4U{qey_10KOW|Q~G`IVFqA3KX&tem8%H2IoS8(wopAa7{GJiG8@?|7%a6J|iVOXIpDsR8{mSHe#nAhX z64`E93P`x?uurXD-#3SyIvtW!Zs01ukE^L|PxhKa{xOu&jl+O7#?avHF z@}T1_QC~B{gmJ4CNKcrJRcsOuLxL4qD%}~VylgIJv&HdO3Jg~d{o!DRDv!{juk>>( zOI}Jn{?hWT4b;HDzc?ztPQlZ6O1Ar{&0TlX&H}nnzG`{Ymo)Qj0_7KR0SAcw zfAo85rtOz)W5cq(&ZChkzW0+(_%&!IdT^Kq_hb3Hk>YWO^KCzV+@#)-1aa{QQejs| z==~{2($}NQGv^E9zf21Ju-&7|q^U{P9wq9mj`r1^nF#NOG87WRTVeiRo{NK(VEMWM zTOBpZmvPB8{R|`bd%OEw%9F`{vab(Vf427*Rs!8?#+OD8^vEp-#_bvo@)zTY#dg-k zW(W|$)EgXvv02qkM*ID_H@{WU_9qQ%IPPw?3|-#*7}@t00{G!lepkI8zbWCJ zt9E6pi5{5|5R+1UI#tMuk1N}CY8_J<-+1LGnPwZw8xK7B$aHL+)Bqw3R;4(Z*Oou!R-qb_7vgsM- zL-i;iL98q_ZK;<1ws!eKBZ^pBMV{>IDq$AuWjl1lE;<=y6oF0eM+wY03bV28)tN zX~hMjTec3=x}^Z_IrnplFKSX`6{m8)1nj4aoQf^{W7&^$tv8kG3kfajf1@~eL(O09 zJzGp3{(9UJY#(prTl21|to_XT#|ckAzYF~SJ%W^<)4w4!^shXPAZYJbWo1_9Bj!8V znJl$2Gs7hyfPpRM=jS;&Ib}p1v#s>UkDrO0IJwa81yV~(_qWILFZSo8|Dk4N@Z8%T z^y=dLoW;?;H=0K1!-ozFe=GXOG}*bZ;5$`ja3$F0ECA81vsc7@6cL4A*t$j3jWn ztqi8{lfU(2V`Su{rQNx|`w{f&p|+Y?y|Fs3!P6Q&RBdA;mzh~EG}6?(qJn`AOA-=e ziqnTF-q5=ZiAiDz45Its@tO>m3hN>}>mW4p;!s*jYLSbRf0I?SudlzqZGOJ3t1C~7 z1t2evZYT+N(eG}0PEOd?h#A~XtzPGqiO!^?ecDADx%v$u5fSU18Dj;iT;MI57caiA zyyF?)B~)kRDmM(T_dJ~qC($m~Z*bk6(>B09hHC#YVTA z<5lVQ_CvVAf4QxO>ve00?dCuPD8%`WveZD+ul-n2ibmkLv^3Dxa4#-h#P>i_PF^<6 zDoZkDW%ne7PDqM0yrSUMjODYjd}5#K>G9Ya<}hf2VWZ5hA&riYJ3AFpVP#7x_AxZL zYz~Itqnnv#Nrw~96{rd!D%L}M!W17}ev!yMk&L=ef3>ac9^?*G$XDs<@)`0l>$W?I z1Fu?_+R-t%V`F1hLCS%;Qc_(pbjq5Cb(V;8{!s${hQg*DyzN0vHdaEv26Ty1^R=$7o|U9PeZP=w#F5Btu}&iM{E ze$ae09I{jaly9##w?!U4xF0SWfk0SsjGCn?e+q4Nx;ZUuJJzkMFJhviJP!@0OZBEY zOFZwcAMBy6I(cDs6GelX#gj!Eg?k}J#J>pKBEG*nNFhVc*#;gTR8n8Pb`bK#J!cyi; zWvIV?`J$>+0|Ww1m#gZA{O!L{upW(;va6}1*W*i>u8j5f_xnfBXYWOKtDK{4JqC2$Sj9+46L)He}j8CxEk{`?KvsqA^s}0Z7&#EJEXEP8RN%0Ty?&~ z{-=49Z5KuJ=SHDXk@z(NIjc-l6L*2mgZiN(K=pJlbca;kJ@2B<`D;(Vmh3VbuJNga z){3;XP_F#oZRy#zi_b<2n+e1m?DQrEWmQa-j!YpavImU{x&%s1%brbja0XNZGk2-KNM3jN%*D3LqAprKFCc!#p#?^&AIn2)M-bkioAde~rMLwtJD! z@9cM;;+Ms2kO#V0u1WHRS8Q(NV<8)fk{Rcgn90XfN2wb@UuaHCNt(CY>VF$y(I&1r zfpS(g1kZYFrg%9y4e^j1SdSk!EbUsJ-I~4SCL2Q=XbfpD7$<2B_bP={`b@$=_d<#j zd<2h-f{6PLe0uTLHTk;pGZc2=zA|hz|H_Z>$(4tX(hxN0^ zdb#|5LB6Okxn>U3c79oOjC5;R|6+*VN;VWWHp#YQoV_Aq1M#`4)L?XTbiAa7@zBt~ zGn>mqktRH!u971@(xGucYQk+^<q4Du?C=}Y(wz3L+Nal6$@)UY-O9O*-lQ=DA>l~oD z@`RMwh!1gScadpECndchAlOLWj|r6s5e#hv>Ak)O(@?|6Ht#+Z7OvkkTQI&&(dV__ zXuSL*+9UvWrqhPkhkt@y`p@tkqx$t4P&GMQbI)66g;lp*=oetU)I*05! z_39wc(lGf<{_0LZnzu>b^ucA_o_9?U^~SC2W*fA(5E8r~aC0yugy+@E=QV@zf=P*q zL^wD&q@*P$QS=V;g>WJ~mZwO<4LnmLoaTl4oEEld>ee`x-z}`E7iRix;wE#)T6B@0 zY_T8LnRC;*Lw|n@)eKZY<;GSAS(D#8cO4m7PGg|Y>@8OLWsPbXf__RXI2NRt^LPNd!LZN31%M>6i~8MbU)At2Y;7V7V}Vk%b$sUDXrIqusmTulxvTP z59emxqve+;fIrYi71};Rx5Ho7>WI%G?i);21Tq@l=l_<$BPV~5y?w5rkt-LMk?{@} zH)iEHxqm$NS4;x_3N&{&j;qIyA08#gB&F(M|?kRwoHgJ55MSw>xRgsINbja_(;I zT-BcNni0+!uThA*+X6(||c`IUY(sNNd zW^ky$b3-dc&BNly74PoXC(oCt;=J4jf93K%&)gf9%qDw}{KsT3E7QBFtbYG+Thn(a z#LK}qb*o=mI)Sz2XB;ZAkIpxnzKkE{IUf`~PS$2Nqms5|l~)c7g<4#y9=@aNK+Ve7 zjeqaTD3o;Aq=UhET9eY?kidz-Zh=> zm5U5Yy?5stQ)z8~^adXFJ%{_{4iN_|O!v?};gmJYdb8DU+@UPgVgD`nsM`ftn1Jmf za6xx+2Bh<6q8Au3Q&FHTX-7;TxmI3tFn=-GdW2Gt1S-*|9Gc55sZj2z zN%n>qHI5W(?(=TRRXOS>y2%b_Bx?=8`?eAYk!p- zhd`Lw*EO?6J2GzHZV(qiU2>FzRKi4lWAi7<5tb8pr^|ZxNF(134>iP9`&N+4Z3|oHpE&g-QSYd1& z*FK#^hGhrISy~nUiavD`0zIC(6EE?WBd2t?kp8y}x$;SDSFh z&wahkXNW(}Kj}c`u@`q4Xs!9Ch0ggbS(#^Y;TdJqx>D!c`pb%Sm+V}5WNH4-FYJb)n6UkGj zrJ*GtM3DnPu>Z{cLX@8Ry}w{I3fSY&f`4mHl}I1_%82%LzLott~rNodzeQAbU& zENis|r&Vdq9>+fV`eE5-l7Daov9R#>_xh5-@p+w#$r6+uoeQtfo8V}7ok^Q@q24K1 z0<{V_Q3R(kP4)|5MesNdifG~|AL76#&!1fWAR^wWvz_@wdNSm7wsl-%!wU!IZkvOt zM@Qbv%kDAJI4mrs@(HYFCaSaZ&9QJ8&sC*nsx&$}$|}r~r;^jrwSO2H9PD+pVGL3j8%+NeU$j!ouZ5rljGxk5TxyGYinzU=)Gj5{M_6ST>e!C zhF&zuMztgc0$Msc_#YjO5PohBb#RBYlRk4V<6xT4EgyxD5FG1I!|`&36Dqt+sjI6y zjgD8F_eRrFx|~LHCK)Di!oC_0F~QAOK-{3OMCI6g1Uox({c0OugB_GL4`&5n4KT^~ z>Pi$ul&M&Ij=uU&yN&-J%}R2{C%x;=y0}lC+~%V(IUFGlr_qD{(-!lQ(UpjC*|gnf z4it9y^(V5DN)lya#$W#zP)h>@6aWAK2mtkAG($&V@Ho_U004!5m!2;LB!5jHJW?+k z)lzkM3jhHG=mP)%1n2_*0G<5@M53ZQHi>^*J;1 z-Z^t;?sxA$>KA+O%vjH}RzyawjFlM`DK7;Kf&u^l0RUib&Lor#OxsTd008hu{=Eyp z+T7aM$=%La-_Fj;+)&@i+<(@F&c()v)>hxq+>zGS&e+Dt*3jA7*v5(0)Is0Q%-qmX z{x5_B?S$i+ga814WQ^a0%4W{i1~&TUR*rN||M*F3XJZ;JFDnKMg$4Cn1Xe;^Sn>Dw zD*yl>00hwQU#Qpbxc~r!1QNmm%5E7Knc(Wk64-uh(P;Shv^nbXrGI{eA{5DW`drke z98>`)sEDZN0Z{7I-*<#(wl?J>vJTGG*?C0D$;lN#ggqc=4&)$$&;(_~*RQ;tRx-yY zCrNEt>$WB*cQIkWfB=pGwl+`!0D1shfysfKz~w=X;c_6Rzwsk#J2h2TBY5!u_~Es? z-Q?{MKIMBRNCV(UFn{ye2^oU%BhsA7PDMI2!hOR+x9(g!jb-jKElTtby{wLD>!@eT z7D;V7t*I1wZcys}0I3;DFY9jIF{(6hm zcaJ~0TLZB8pbdj7m#=TX|K;*^;=o=aXzj4i5-SHy21D5(Y|q zRwUW%h;pT*4v@@Xo;zu(u;dG{!hi*SuVJxdYNDkjr6HTlnaRC^pT=r;8XCrkIu2YP z;DBRRU`b~G92^w{rL%2X{qT(>ec%(E&hoeoDSrW~V@U8G82AJ-sQJwE2bp^;UsKq! zhU?^I>wH}&ZX5QkEk|5^8iT%|{SI#1K0bck;&T(#^JFSc;wk0Or`nR`>deSp%zooG zt_{7BZTgr=j5ZTeXHm>NElS}wlDM`I;i%4Gt@iFdY#gN0F!-E9(~4&h=iuKi*G&gF zm4EG_>q*S+Tj&!(*uIuht3v=xmf4Nl6{VgROPus%8bkHYlgcEPT{2f=r zm3FMYZD%(>=(Xf!;7fHLjdA~QXaRP#e%Xo77}-?9Av1K*aA7AOc_m5PxOHej}F*b2{3oTuZGe<`U5!o~w=%z$r>( zFVxve#B3bkuP1O0mmeX&>wm%ja)x)FZSGvcW)>`batmrP6ja*4dJ3>y{aAWbTWjXT z^5BQuJ*ItT7+GD`QZl0oVJ^eIDs5~fs;HdoFqpqDbIibH|LU+bI4I;B)TNG#$A84~ zvC9kwsghCgfpuI}MA{~5u!rZMkCHO6m^>Nbt@?-w`suyJL=onR>jM~#nPYs773ed^ z?fkLz-ZOB+_ZnMEx)EtL~i^0YK6vA|XDXx1!Nd@?zAS2J_x-M1NkGWy{Z zf%%HToh93sOhS!ae`bytP0H%_g@3$cC8r7o)e zZ@Fcanhiz(W1y-}PHnQyL)bg=tcTpuvV6U|JM$4y7aZw!Lx#CcQ*Qd(HmI&;P(|-2 z^3Jkunai;07ra2fXWO~v^Z8|k&X{j80%D&7XSAfLF|{~^I#ywqbx7{}-hFRt!%5*6 zm@Q8k{g-c~(*P9iqDh!%Mt_!AS!LxGSjbD2&o(}_ZU#RwA_lWh6gEgJG*JLwiP;Tz zQjXzXvCAdRp|%dR`9uJ`ynra?_lWv2uNl>f?Q$}IgNMXSegtFrw^ z>;3w(cabAhT!(BR?o}s85i77pYZu4O)EH_|O@B`5%4@}(_zQN) z_MT0^C4g%igfy;9$S> ztH?ok%iI^;I0q+d7=L%s;Y`qi*qfGcE;W!Wa}4H0nlA}vJi;4-&S8s`CdJ_pcF2R$ zE5%8~vx-Y=y*ci7H^ylKUS@jQbm=(_H@jEYrlj+GiceBGKD5G?iN?4D5=C`2BN=gG1H~7?Kt_B{cWIvEv9#5_->gwC7KkL^+ zQ~1ulY|0eXvVTkKe;TUk@rFw+Vw#$=nv}mDWtcQrYiIi@Y}vAI5h03cYsj%)%~a6U zu}I+A7X84C4h#XYH;2TLg`txrrkAuF#4(*7rC`ngfg9s#7th~G46%iAntQpasowSR z=CoA5v(TlRki_KRSoi2V zF*U7&#;DbV?Ab%!eo>d)PCC!L=>67(B2m&-L&<}xjH7b|ACEkjxqWC(nDqICAlKCS zlP)eUn}0==@|y-iqG4X@T}+-~`888gWzj$}u|x`rB*L+9knSr%R)SdDHug-h7>9;v zYk^a@!4)DU;p?{_=NCxqHici3p&jfSC7W5k?Qr{u%mp9qmzP+PEb8_awONB}hdUxs z>-?@M#9x?mvdHs;c=r!jk;w}poO-OfWlsEf=iBRkX6 zOgM6Ep#+JV3_1x!0FA&;gud_EHL%&rcZD9;R>7?Z9~ZjKDnNOY}_ zapaETd6+&TNb#=IGB6P`RQ!)!cIo}%@Ho}h&epd^D1?gO!+fbX>p1HQ$|E)neA?4C z)_)84cq?Jm>>o;3zw=$y%#D^1OUp`{H2CasCornTXe05Nq%uJ!WGnEC2&=e)6zw-Z zKi3U7N4mge^bD^E^v$7b^j#An+Lv!KN*coBJ+h&ik~}w}=&rlWC0M@hkU8)Dyo-r8hT!Z%@FcHn?j9=H@KPniP)IC0Z5^0MB#uQqf`RV08z90JpRZFQX5zp7<^>(w{ z^BASE=A(Ad3ia!;g-8($Im#S#0ObU?V_!1OIG#1*d#{hPAC9k1m7AlT+H2y$s(*s# z=`YK{63F*6lFd3+db)Nev9)hiFGF7jU*9KTU>6N#8&V$2JdGY_yg0x&3`LoU27IV8_HUT7Rlo3_h*dt?|r`KO)04jllHIZ~&YjW@f(uaDx7M z1=hhp{8d)kh4Sw&!|0+x$GQu8&;rM_^|1vgs}UrJ^2(5PPW7Sw_sSK39S|p5#7d!T zRymYaL`DC@zhT^aoFPt<;jX9S5q*UDT`Q1mNk;X;EsQsG5c&5JbvI-j!(`Cf7M~m0 znp+O{?I%aEpAnBmgT!570tJf47hi73;yzL05c<(Tzn&Fyz3U74bAJvqvYPFl$UqR4 zY96&4CK|e68fm?2r!2dO2o@E+D*fe;H}@VC2W-V!+Pf1sn|&lw9q8pob-p(MJ^MGG zWaWD@SJ9<)yd`dkCSCaG+m4_(peDUU42^F0m3f3#nEsk(5xe59bNfO4tE_2rqIIwA z7RL6t@!0`1;5`zb6MrIaRCAX426RIN4@S4OD=GRm$+bn8EG0Ggrm8a2Ekia1%jf&i zX-~7X%jiiFeAfh?5%J=}+NJD<#LAKfZ}y@`r!7Q$D1OL$6#_njnehmuoG<07L??`0 z;u_Rz038CRU7b<(93d4Gg`t^l*^Izd1FVrgyG zFBgrApq&l=y~A;kOzl+$;)&X+n21?!oUl@I(Ab@vqJM%dr)`OMxxpx3-amP`LPI=* z9-lA*=F7QEb@HqCevdL8X{=VpGC#}Y3f0P1%3)n4b+?tY4oh^TWLn=X@!2=dbZmDr z+FH)eg*#e6A;<_okbjj8v9K_dPcMs!J#e&Y8?82Tvx^1zCE+~ zLU8fP_J8o&Ej5qnmeF}N2w>?^?U#>1a-|)FFc_2jeDi5_*jykw)zXF+P1SN7l^%9w zn>n}O0WI(Zk2!mw%akwX8&o5}+K1gLY;w}yz*2g+SoH4qNtE>-ZX#r`dlWdu=dlvV zU0jES2AkJ@DU;lB9S-k+-dtP$ zTK;U&$Uz7kh(rz}1`1row;Ik#QZi$gVBl7ipe>p!zF*xBFa_j|?v26uIm8G9)?;89 zW1hii{vIX_CHVBK@~&M~bowOU`w`QVcR@3bN2qG>J0wdRU3l>iSLcq)`f{nWJ(!PB zK7UvbVxi}ZyLW+>b|h89(OL=4ayIeuqkfXIK?;;D-Ijw{hJ$m)nqB4)i9g1a)vHhM8(Fd~mtw-o$TBK^yU|AfBeA%v zinYo2?J%qg5GZrLswonFe64c z- z<$Jt;Ev!A)+`w*~46)|U+&t(YOMg=ppBW`^6}bNiK{75Sxk%PpP%EtKxbrh5c!V93`Mqly59CxH{HV_U!AD($$RyL__VISvqw*a{kRz|*7F_lT0;K35>#@NE-Ti6~ z0qm?N<5yMNy_$Ex1N&jYp%#a$xeU-7Hm9-DaH2`@XNxbBuLTu9rD9BFG{F=^OP$|6 z123EXQA9TrY(9DI0blr`5PvamKf1=ntt!+C!cfe(aCuW}lef&B+t>(y=<{@UvlXL^ z=}ynd)`n{BT+wqn_lJ7oA?uo`Y_fP^_(MiDn?tE?ifihQuVF~r&2k!=*Tx70*wUzZ z_^3SN8N3tWF&L!}F*@a1^kPB+sk)|*{hcL_$V%%3@$y-~#wPxNbAS4-AhzH)NEEK+0%BvKGa0UJzo2hU4?dC*ZhckZx}(T7lRT4U!C+` zv~RKgNnx}i_`%+b(LZ^YZf$#@@L z1=iA-@lvm;tL=s6qXLIdeza4{6^ySlT?K72LG`Yk1SN;~-LLm;kG%nu;?YH8z4LkJ zO5zGYw=~>!y@O(E%M?Tfto`#2;`|~_iY{I@A6OUOVq+?Pp zSca#CY?bEyzM?+}7vm3)<5!&yJx!G7M!|&xCxuNwg78-_$7CAmzZTB2x<4JtYS0_{ z&27hTe{@>Y(8M;Ek6A+Gfb@t2rG~m6CKB<4j!R~|D}OaSCOUN<>RI~(OuK-10|s3b z?=5V?fazUM0s-JUO+9qBB`7X4O~5|_bn~^o+_Dx4%<5j5KJ6Xx=yuaZRNo((%_8_d ze;f`5p$#o}8&pGsmmj~2&hQK)Vj-e!q|;09vH4_&yO>;aVgRTJ?=)SmUm28pbZuBV zhc5+Rgnz`tGS%5yz+A_zHix$Nh}kHKf5657OoLtvxLSyww@b(!eO{<+x9;8quy`Lc zQxmZbdTOZy1#isBG+od1K&KYM!GN)l4Z0GMbu>Q2^wimS^&28+?({808q`YE#ZU{p zFX^EtB+;jzW%y9<(xg_d%N5~s$fXkhGAB-bHh**(uSJSgp-aJC-NEm>%IdwqltM*d zea_+1-7u&>e8IkL%&A|`?hOVfY>&kE z8g+XXqL0paNSkv{k^{UV^jgJNb7YjFr}diK_WS$q`IT4vL#S??(Z{{nx&vu_6$dVv zO4>Ggel#YuOruJZ)?7F3Kvgzu?`xgaOMg(IXsD|6^bmoHDU+9gVwT!47e}yiP3i?- zxA`5ny7)=uZ@U~%k`9des3FT|J513<4+l@*NBoZavXxW>vo+NC>aHA=i!WG>rdm>5 zRY!HJPKJu}pDZPYN5D5Z)^Zq~y`z@rxN0)892+RauT1*N8HTU2OwHLV&z2sVI)4GW za5fOai0^e>p1Wwz4uj*IwLOPw$|Qk(tb>>@;Q-zN{%gD+bLfVX_N3!<(tH`h-a06W@hXMFMg%wTk%^fNQfE#N=k?3^YZZn{NvTfRI1JJepA;n*HnaM5a>gIfG zH5Z+u=1N*q6Tmt(0;wsm0a@w{K7S4N?;{p>{;_D?>W2h#UrjLk-NUVT9^iPH@kEkD z8dDgGurO)jVdPT!wB%Ef@R6^9LW>w|17@GoV_q-!SDNYH6x=(< z0!0d`)5r6*=gd&{K^289HJvfclZ(QPA6cnK8M;A>&>*d-)0t%V?*+vbXMbHgzpmu_ zHk240bsLLqC+1M29xKMZ-bio856#9NeCUBfhXGpeg4~_5YfZ2Y_InH&h!$>kwE4YL_AuNa(~}kG-5G2x6Ny6(u(F5f2!I@gvk+%*;YRu=>WyOuOpUw18*s zGbKy$2DhRA&DGP~R?z#`=+m0mINhcv->`J8O+)gBR*-hU@SpGj=rr3ZOmEZE2){HWP4!J{@D*;4s$J1niwvlp#0$KCJ<(<;|? zkpCZ_cu8PRWv}^$S9RpNWuJIX!pyqkDrR@7qZ2KBO-(PrLB*m?wZCrr*f-9s3pm(X zHV%?|VBlo2v0X+}eH{01xhP{TSPODaN`P65yE9?Ib3S0b>TdCDIYc zEYE`4{(n6>DHuw3)289=3r*(KHzs9Jjg-wQ>C9e@tS>MEP8Yg?kUd@A zw(tfXz&gaV52J|XNpx{NZDn|#+9fTh75z&~A$`VB$MZ>;p1)bA!2hoM5pXXzg89#${^SA-{&$D$ z;e54^*xFYHol_?>bQ%((%YVF(DPdKf!}pz+XSFtb%k|R9s7v!T{#{ZJSow_h)DGn0 z=YN)rSqZ|Vst@3mfU82VxqgcJCS^uNbqBiniGVAj$+KOuFVK&y4g!-kx%q4+xYkJe zb4U12$tlE4ykKbDX`Ov@a-Q^(%>&fzsoKN*p7Wln>NX36~Ocdah67k*hsR!%uI=lm4B(3oGD5WQ{BMKwzw2GxRNIRYm4bFV-C8N z5}GTAOYZnZLP2ZEw@+p(H>9n|=&;>NLC;>bb*3{Z)pmbLYy zu_ub(p_nW#HyV>74d2bEzhU`cl;hWaSo4*EVzZ>3oe75KB?|dLx*NQB1r2w2RD(Jg;SzSMmH&stGOxL8)9tVtdHC+f#6Qmhh z$dNHGxVng0Ufg%w4}22kC z?K3I$Pyja8z+M)BquN3b`KEl}m@2|$Crcq#k_#&5mZYmbDxpz4d=#CY8GlxG3Bw^- z6Mqgh1J+`gP{tI9csah9QM@>3)k?@fQU0a@>bM>_pey9*zjnX6D#Q+B0_7Z*pU>uz zywz5ARjWX?D@B$&FVn*@9!phOs~>2^rkwBayR`O8{@6E{L&uBdUA9eW(tWWQ=4_=q zjeL8t8(WgIC^4FYV>a=#0e^I|1!kYH_rYax+KmxBiWU zr>>U-Ic>+YcJxf0E_O%ipV0RUfEywhF}^aKC{E*_$#9!peg`=66>oIcXXC%ZT{(f=#U*3Q1(Q$Q?roEQx6>&ZO4)R|5->yf`e1Dr5dx5EB!>j$@NCg1^_#^*0!Nu4~pVrOVikt8E2fmB3gQK~v4G$p$Ej=N= zv5ldvk-3d2521>(C=ELyA1@TQt%-@bp)uz_X1&n-fye(1wQ=P9TM-YTvx5!ipYvll zZS<{;9XXv0IsbX041ec8OLP9I=x=-6tjujJc?iv%oa{L1=v-Z0XSM7&tgM z=>9DIhp3U^|C6(GcCh+W%E*w;*vj}14UTjSvoj{xqGDo}QWRZ`=QncCZpu_y#MHxe;htu?mrKrxsAD#x&H5FaWK|*vUT8w^25xG)B%2f70{HE3=C;a>y{! zEB#&Zf0Ott(9qq`%Gi;YjpJX$|Gxik!luSH#twgKm47xja4?qpv+3xVXjzG+&260B z^wil|^;ntl|EW;V&cW8g*wBfNiIv`(fmqPl+{%cC@$WkRi|%jq|Iafx{&5O8I++{d z|GD4R;17!5-PGB}iHDGpgOHAwo9-{ijqcz17T&+PF9-;TKiwC=KP8yo+0oePj~Y7u z;legFWq%xZ*%3Ofs>E9!tF^R1(to7-Oa5fcCIAE)MA#;^0!1+zAsJy9uhLuL4*?Vk z`(`Uc6DnU*_@r6k@}#tvekBF2*Dg4SNYWJHQbLLTLw#P<$fXQs+~Y9)w&Q*X*4sxE zje2$d7Drq-M2KJ?!H1v-Syy|jQ-xbJ0>!RB5`TpK2YRqd0WI;G`M}1^zz-{L<8VZc zbxKEqbpzJ3x6eXfXNeW+GE}HwD>qlJdE*~a8P2xi%MV4U%xKQF7dr+)#zCb6^4>no0!Y)+mlJJRC$)WzfB4BFD50m1^`zOLN~n8@O#4Q%l2~k3 zIfjIR!_8rWkUA$_$kaF-$Os21j_x;9EwQZ#<-q$lZP$efFWqk4Y8pI~8AZCId^&%= zmZf2Q!sV@S&wj3_WVo>U3c!IQ(!K(J^ywJL*{n^9% zok`fugScl4jqsX$fUNn%{uPKu!SvSPlv;-}JJ$(qZUDCnxPS1+*)n+9Qyv?l#(!}I zC2(D**X;GpMK~THOB9ZITJD9GFOdq+`Ykq+H(uq?Q^8+f=2+Ovxu_8*x#1&$ z8`tzk6pQKjYJ9_t?Rw-#i6dfUhkuT9q3R~gX5ib|Q0x2py zK~f5JGc$x4L8QdR0~zig*qMt0<~F_Fk`pg^Pg@)s>zn!&TOw||GM2(E z`u!3G8gRK6Pbr8Hzeh=Y2vR(X6Fv@Pg0ku#*cj}tSxeUyx(9$8c=0ZL0F4b!dLx1* z-Eh9K=q4xw0_4@xNR0ad&3_UokAYD^R1wSfbz1=FYYS29rPNQykvV9XBp3o%@~9rn zDNx63wvifts}!t9US(J{9wDX)>V=y=7c&Bx?H?Lka1m+7a}!tU*gm3KWEEkB9p7{z zwdr6fA#x@n{uy0`AKvz)+wBYDJRMsi3m~+eGtwx)v&XIx!Xz93rhjY|gjFLqDVKJ% zS*6e|ibU-aHnr>i2?s&->BthRMU96~#F^r``4C3ZULT_)gX0TB@ebp z7|nD_J2YbBWPqdrJ$E7;a_mejTN1So;;N4Z%dTkd5{d)pK~_QPH2j?qX6_*&T(O34 zIEOKAP?pTzoT3^Q!hcHg+DHF2N~M8d8#fTxVcKtXxVY-3&HJ{SDOh^Z7hE_C-q0nu zRZ(;t!|up?%6?X|QlI#N+b?d})ieH49s*iJNp*7D)lLIh>$~$Z*{Ue=FCS4TorsR_ zso~^AS*J8o(8E7ELJ1S5bjY;S@StqKUOl%hz9=0Cm z=0ZAp;G1}GovRz{YIGD99>=<4Fgi%OQrfL}U(K00+=q5POBF5BzuEdOx} z#jR78piuXn^^}h^|1ET+n2dAb*W%)a+E|a9WK_#Wchwwv1zSg}8cosVYU>+g2W4A= zLfiCZivf2l8Gn)~gO3Bt*(d^X_zH{jX63U_St(zXBPi_=Eopu&ROxAHep_dfmcbgP z1IJ~L1;%6n!?=GD++|ur<_)rI1~y6oO^3ilv8fP#u;OOxb0Ad&~pY zV|iOH=P-@lMX6S!*kGA1-4t0%E~F@}kG6Ox7qAwSPJh+JsEX2pM@R0B)qE&V9V>2Asv%t5U}_3)n zOQ{>8gCs-2p#id>>7iBveKsP`>rLs$<#hEzUqE>&a0rHssR}hP0Dv(P0D%8|L8AGc z<;@M9oPU3h0O=U$f2ThNE`OxIeg63^#3;nhNY6_D$E5G1HfLq64P;giBp?tn`SlIx z#NEqF`2uzn^6A~mo{hqRT%bY}ic3JrIK_1qd2+?|%=9PMuZ}aHvoTK3%%qGC(?fTY z$MKAY+C8WG#G7i08bE+cEkA=C8-EkrgU4d*ekIujfQVNRfeQnLt(tXZ zX>LHj($_A)+8pV8(GT&RLbLP2D~qcG%ZnSR>xT#L*Vl@=qKbyKvZ6{{ICpTQL;!yH zV#;Bx=YuQs=c6^O&aU&-+N#RpQhN5K^u_zkAP-0`?6%<_tz$pQzsFCLxA4t)yY5;) zCVv#f_GZ4KK6r{?IZK`5H1h@Dj(QSpkSz^}=k|-f?EXPk9gJVzSb+@apgkgtfuMlY2Y=tV%eAKjWS4L5`{^rp`67ox+}25Y4$KW) ziMQzI=Fnf|YCu?V5^k6oEgDQ^h=ut$!T;_e50<`;(Xt-Q(A&Rz#zMF^3f{Pyobeq* z>FboXSuF=oZClgWc!x)zo^*{LfyK3y-EMR%dGPb)m=8?{riV@i+z?IYHJbSvk$(lL z6!Hjc*Yy)(GQ;AP-n>4^IhHkzmk-}VX%Pjzy|BqQne38P#(#hAuDZW`wf{AI@MvK0 zWmT;_uQCi@&-}~|I!IY)HXJl{>UJh13FK7T!wPWWJGA`405uPPWb*i^;9T$%)(3nT zH@5_=hMzOIWB&G=77ezeaP+y*d4H(9%=diuljNt))Oq99qX17n`9-ESA4M@SVW62| z<=Fv;Y;5k5l!Wz?zoH z^mnTF==m|ef;?4b9Gbey+m;P-ZX)vnD-wezy`5T-t@XQt9}*CaT)D9*;eS6>#a15n z2MnNR>)<9Yd=HC=hC^#>@HUVFl1RN9a!(1p705oVRX3U!e=R_a0Tc(A+aC50j6oe?3Ki4H)B69LBiU5rU<267R zbv!5sJ`{lxDXH-NlRz@=d$FPblN!NIJ`X9BR&h!uAm;|J=1#00B7bkAm1BQ_Yj3n5 zoIa2bDs{Kn!Q;;bMxmbvOcaS0VMx!ZUA;({6h;f+-BZa7~T~l=?w3ZZpe-ZeU9Ded|4hHzHZOqO zyzqr^ZP-YE4zxD-U8(RaxUMDLh!_?~=;}=uSt#JaR32`X8h>ttigV$8NwTH^!@Yw( zMXrzTmvU>^a1UGSVd-X`U21wwLG$6a)~{uD zLA;8`SHaH&WE}Y#S{E=fAOy*fL&0Obb!Rq+z~uPQwGlRO{@vGYT49GO*j- zb>wvxA~!4}QX-wTCmV<;jK9B0DiUDXE z3&3R=wZFB%_G|?wnvttb@T(KZhporuO&})}Y=4zbgXegH0|put7?()+{QUeVYW_ys z^ODiwhK?;1s=Bztgc}R^GGlph3VAJ8PlR=5c%QC0^Z2kq+uI{>9JQc$ZQSDifo$w+ zC;SpGotKQ~mK0rhe7#El1kOB;G-@YeJrQPk7M|{dB?{IqJkugg z-=ZnaQ%qV5pob4lH&7q74{-1Lo6Y_YTKAx505}3+hh^cS&Ht0a$&wK;XXS%n%DC^aZ{<4>o3q8>XO%w3|nHS0RxGlz&)* z(FClZNI6k;H3;$nx5#ffGkT&B>2g~?f_m<=zLj!x)hOicb%;XBE%LX zy=+A-;{clma#k}k3-;V0v{9Md!rJ}L-=K$<*o8itM{*^)^T@o8omL}+FHrAZSLpd| zF|MJtz1fSL&GJ-u97Mg@d7e3xp@08qY@oF0fNVu!s8fs1Yn6zq6@6Glp8s4u@%v*d zJP)FoELO{~g1(uLphH?Ozy!8NG!jLTpKEm++K^(2i?6)IcTKmqF87$cS84MI!)T`dxKoMgQ$3vmp{knk4fqxrz4cu#= zZC|C3Y;>hugAk3BI86rDqp3J>;g%p4A;YoT6IL;~umxm+iCdJwrC?GeUDZAAqF=?Y zkB{Ptlk79q_FbsQkNZ>*9kdjI9?3^U%}?3iv-6#CkyZpECd!7zm7bXyADp*n6RYr+1Nq_q>R`5nt*D@bye6?baU!*2Hq*&JB0NMq{qLM(X&mbuwFeKS1sO?SP3gFUO;2)9l^dB?}QpfAqda2)t&VeafxdGJq z-0-AL`%5I|Xqi*u3wO3I1MUevu^rycBm+lKK$3K$B)uDm6RHRp1%I7Efg$G`p01r( zl0xf2#DM6>{4hYG7$DoQ%z;y!YD%kI#xi0+dp0^fBs4uv zw@GkjcnFF@jWt-dd=5WACFs~7_QILQvDFg7c5qf#Eo|>v@_#cbL{5^`Yd{T19MfGl zr$P|-8v8a~b1UNjT|~*R;mO+y$O1oF*25$7y*r!{D(wy+< z+gkE_zHFplNX;$1&$$+8mBF}tc4`2K?dqu+V};iJSFSBPZ&Lz!@$U#r%O8mG*Zi@o zk(gYjSc>q{Ir@xOn*Y12P7f+Ako^94jS<5 z?hP;%YjziDFU5bzP8s?)21)SnG_*1;Id@w5qkm(l#Pd;7?};3Jj!_PoOTiJJrC5F2 zB5{tb3W3L^_ZqtITZpEILY3}#EY%H>4(X^QK|Q}yQG~Ck^t>;BT36vS+RyWZCs3wn zGlyrW{t>tO%9#?&0Qmex}TKj7xgD<8}dFHHk543&MZiZYU$c`l=g~43rA%Za06G?h3l#O;BCgIg8=_?AJSa*&Y7* z2{8tpZmm5@>$Od34Ss*c4VaKwXc;|RXk<2qUM#loDgn39#Uvx;ZI?eDAj=zLW3$(W z5bhQqg(s@9M)!?09m`On6PKy6*Eb6wpDQ(QOxthHYKN%6Zj4#(TwwVQ5nD=%jYZk) znc#nL>YDd5yM-X*!UJ&?@Kah`C$loN(Ez86rjkmIl7miY3IYAzT_{LYdkd0Z2*;)R zexE~*aaBv&Yb(Tk{ulGdC`Hvi+v}@ZilkVr zxKnw_@1Td`{E{45r6Djfcsx+)yFmy1O@)6~=x~#ZscGh<(a~vM=aqoF_w$ZzncR%KgD0N(4Hht6e zH+vuyc0)%dTE^78@fy?tE!19?YwA0-=l9at?XuZX4nr6?E5 ztPztqHieH(8-L~EPoJhvyP3t*de$? zz5NOXx9LZi^OZKoBIIe+?|33xp6`FlfZ~KLEQtj7j`fVcl5XFS{a=jh_L6JTLi_wA zOAVebii^!BkPNYhs;F z>0pzD)mUds!?g~CP<}xznt19Jk=(T*h&G_zibt|g@U)-}t&SnZL02ua1onRdroIfR z{%Bb^@=YrsdNs9~R-R@2aWA$D)Cz^ucV2oE=ocG@Oci7e{$*urvC{Bd0cU}(qNvdt z3Xl0@vwk9P*18ofJu|uB0Es%iQd zu4Wj@wC}91#a>o4>9CS7sK0-Sfu|ZQLyGk^x){j)LXdipTueFNnKFD2G|SZuOXeU$6b+ z*-HXmsyJT3-&EFjC60d>!dWABE5jt*-TZnru2GTYXFQ(KFc-|xC>QuqM>Bf}`et~L zSe6JNQ`Va>$+sa1ueb8bZpYL@eh+=hLW-2sQyEvp~f z77XdW^ze+8_ktpwYkFO!(w|j+{P^_&z>DXS4{&Ae`SMv256+W!g8?_ zbgR|C9d;<$CKfgUY@*;1xCj<3(O6-3+&VjY{Co#E)YX56l|p8;2(6+c$8sW8rOSae z-RbHfc^Kau!xPBCro>N8eD&i&@$sn{x;wLBotQE_O_>t93hqd+-MAA=y}dGX@1J_B zmr>uEgKeKkk}nYlXLO1!{W12$TzS3}*D#1QV)=!Ff0?+ip6)lio-Y^LBgaHRZdLdL zPRyrO<8*&yJaB5|F6NW37#&M18-2lCC802~yqxgvInV616^>PQb|g*~ymc7eFVIA& z)qn zn@L+6%gbDarlTRa^hV-17>qX)8{R;xQRWb~9OS8{%R30l7W}>Xo6nq-cmvm1V%Tt> zhW&p|?tuJkPt^V;JC1j*E2ETU`!BKnp}^eqqcg)67E3Gs?I>)~#waepwQB|Ptp5AJ z(bbO`85rI-756r=J0Y#SrVB%Y+#4Qr_c5E$v4sO(o1<^KqWZPjWS;M! zcC5~v`dWM2crO05bziqY@Tn`!ZUI6GdCh-3$^>(GG-@Wwwt}Pkt7+b}?--BO3k&BQ zc>Mq}rM1~;DY!L_=i@7%<4R_~3KoCx+MgF((t6_FGP1#F4JreELPR~^E4W1OK-{}& z@XnoRlb*ui)hR@nq=#K(_FmY83v;~V=?D*^gVvfj)b1@U^fy9A$*0Ib?tv6 zJ-U=ImY)%DQ~pM(jiMM*=t;K(wc&4YHrJ@UjgS^3nvANPx;+&0rKNF3Y{=}i-i{g5 zg}?z{<_Sj#S4JjmMyRWj`bmJy^%FFff-%T_hR=iJx!&v$JZ_LWdnStZo6(X3l?o5Q zq@wF5)VQzA*}X?HNO_0M+}*EFpu~Sk11=SOA*HlFaQVBSUtS35y~Zdxrq4f(w{)En zu3d6X;pCRl=(}6x^03SusqC&Y8Nc3c`w&PB zUdMEJ-!G|MjdbSIuL~kcK7N0OYrzCL!A-Jl*qx(|*l7OOrpwH)@N+X^KG^r|YCH_G z=SdsR>s*ViP|WqO3nNzo{Jkn~pK0VA0!vkOva=;RMhSynxkQoUdJ?JEb}3?*{hqE# z_%t-*@X=cqHP=Qg6BYFk9yc(GgZHhkK~K^LZ0*Svm1s2NXGt)~OcZ|*bSWUqjb?}- zU$_|q{#Tl;E3WxUeTGl8*Ub`Qsc++jQbZNXrXQ((tkh3idrVE*M2tX(*cltw?tZz% zTTJ)K$Y@XJ1y+s5HQHJPB82HdF(8sc+goF z6Cv!9Wvtbaq;u$n*T&6ZrWnth;_o!I{*L5vz6@~W;k(njLWx#PJWGz47r~bdTs&RboP7AfhB5 z@X2eNUB0%~rsy2Jl~ntTp=MrnGd6FpY<7>?fZgDSlS zUOeAqO7P0W9Sk$Ked3@GVF#ro-J$a1;K$krNf)2Q6ps((sTLWqcDa3Xs{878D&nH! z^7?=Kkle>es=zcyRN(}gfW`|eTX_kN1E{XBo2d{{N^sO(kyJID>EeQR*ZfqgLW!@e z^{mwZ+U7A&A48;ecZoTn5m_!(S0Blh z1mD{rkru9WPWrd6`DWezTNA>g({@coC!&AXLQ63;(u(Yb=R(P~o4ru1!{(6AuKb@$ zc!DLM8>f2f)V<^0oh)B zlJM^Pw|w;7e;RQZnqp-2l{K*~ z-1_K69rmW2OCtfa0y08pi8NXD)02Pw%8jR=#7!x$+^*_|-=-o=UXhtn_+9af7U;V< z_$ImIQxYl3uUhEB-?aZsDHObDX0Wt+|OK|l2!&%P83X7@?%>0E|=Yfn-;hVBc zAQ}}AMQhK+)do3Np-}M%yl<~4k##X9o7|FXE}-3A*3DgMV=4xV7?+ZTWz{xSQ#K6w zpH}e#lbdB(z{i}x+LXe^EQfzkGs8&GUhND#?d-xb7Eq(m+|W`Nc-U~)EE-6gf$1J& z_-MhG7beEg4>v+{AQ1vEiF7;cc2Lq#`JgL7)u4@cGz4BE7|&F|>3Z7nYu1SM2uC_4 zE_Ov}eqL@P@_C@e7;4u4q?{Zq>3ZxEbRs1SO=5Ae=_-F-I``&BhKV;?ALEBs0Ih*jv>DH*L{1uSU{s*aDAEsa zgd7~pZKt=i)hNlE-fVw3{-mH!q8{hmss2JNF)$!e^F6}u6_bHsWld{SXT5q$LL-0( z-Q{D3mX;}OB3geOs!f3>siQ}6sjJhGbB_we31-Z*x+yci9fJ3XJ4e`6!vdENo$$?Z zUJBpasg2mT#Fxc8w|NwMZ3OR#^p2}3JXoWXaoLX z?{&An%ZP%!6AR+>*I@S~^*)^3cdm(L?MmJUqNe_&PM$^96=(qbnCGi5fKZyTc>lOz zNN3$E+i!q_E8eHcY#v7-AB!n)iWd`y1yGoRw;u&8JZ^uc4bVF*<93n0Wz(UBP;d$& z4YJ~n?}tx(CBYbpZbA$diDPkpf<3KwDb8ZOmzs;aXAWD-yEJdEi(swl#kqsKB-lxnJeJ5^yVp}J z#ht_^Vhw);@6ta)*_(fn`dDu4HZm>qU44*Ex5q>?j_fsUQ#Y&~*YcF=PBwm_f@Gn* zbTIk02W&ORBaucjoxN50s>m6*U#CsOU4(`!Xy2M3XiC^?N6IB7zXBbLZ0RD4M=+c* zil8Cs{pA0BQvGZQ4c`lP>uJ(~Z}+r*D^j`3g06oWGi&7QB#~6K;4u3r>P;hX&?=g- z56k@e6kQo#_CR=1LlGjc3z_wv(0Gr#UfSYG5_9s)3J%^&%kk<6x;%_tth#u@$F<`> zRDWmk?IRn=fqjY?0$)o-wML8wJdohE-TRoc~lv;5=%gkC~pjct|eSzvpVUno*vBT*LN4FsnHIIjB2PVDl1=VJ*@6RM@6dn z`xse`cq2R)t#@HDF|yuCWG`-mb~n{#P3xeBW*Cnf1qd|8tv~I;RxcW2-~u;C?v(}+d-UeW5OP6@3}{YPr(ZXbC(&zQ#q;i|PT8=ABsw5O zWp^8i_!dG}J0@Cr&M7Up&c~@*w;Y$R&CGcU^73kRti0~<_QECfxb5$*WT2{$gXV0& z>0I%ka!!ROX(fxz^4%>T1bdvt9CCj=8J`J84HLr;Zk9R~LFfS5Lvky=rc3=55GS|Ecybg z9)G3un)>G2+Qz1bhf^>x)C{(=Vaf23yJr66-)>K^Z2FSD)QYHS(_0nA@sNM3ZXGv9|)(1Z8etEXiE<2czG4L(_1Gl4!tM)UguLoq~TT3V@AsXxXk(;86;fk6O17Jeiq#d@|2nyqnT0A z=m!>RS57hK%eRj_Fxd*QmT5A;8Icj{peG3RxAvJujT}$Ugi>fJ1a|D#(pC4H!Jksn zrYVsJ9=;1Z4trkex3sy=XK>I(;1@~pkK!RUaasCdtxufUbJ)h6wdsFmNj>Rv+PFMK z_&j@4xwD@F-v~I7_!79oB)Bi2bvnB8C}>v+4kI*`h&g8tC(J1NBW&0VZI^dHIK-|L z$@IR9vwq}5zqDt9`sK`vca51LU8hYENmF$d2Ajf3Z5Hc+d|YfmKu&jxB}7DY)nA|* zP!dH~uu^#&q?z72?5}^R%|HMiOlc-kme!elcq14A?cycn)0i{CLJyw)NX}Hx$&a9L zzU_UZioKpa2|^k$z!VyWe9M(y5(sIT3Y(CjY2lZ|d;8T}g2Q7(Gxk_cj&QcwgYz)y z*CYO+iJWqGJNL1|LxS9c<7-SFe49mx;58Pbnizo-lu?+G>pVj-NT05cR1D z@k2SHYjUE1mr6%SV;AZPHA4?lfV1vS&-{h{lqu^ zC_Aho+CVFVC*hK5=|LY-ola~y`zVy&V>nXm^?Rt-#gIGWvH`7O8#v4Od#Hryt3;8} zuPL2d9W%2@Zk>NHk1^-P^U47PjAZ|_-p}zVXdh*2J-D$N=GOJN0(*50|D+mLsMSuN8}>DV?&W9hCp@eC)@HcES6uRwlDJla5|A{I zp{Mr};X|;l!TB^}ar&DqMeg4>f+ z?qGt`9VR@qO;)_WI(St6dU_Ood>e zfUueOjt-nq=@<_|ebxPGyLNQ^m>fk3Yu%N(&s)ZHbc6*44l$8k{!=)l`J(LAQtm}) zhED6d_QNPQrMXwDbT-`)0b?*|CCZOWR0w~n{wHuhI^C%65vzjHA}Fa0JIO{gf!S@S;2mbjn_R4g?$z?{aic~_5~!{ee|M(#$Ci0nzu^e3HfMQ%0oQ-3Fsrgb zP7#$afeX=1)SNoZ$t|`8ir_~RFWTHH@*idezK`Fd4qR$@h8?vGIoP(}*R+SPhF_ab znk)Hnjm7==!?5l8wCWefqip%(218L{4fnx3*GmKt2Oba%9IoSum&FU^3ZWwjc65m0_`RUM6opmK~2wR|h0LzG*v@xUL>D zU43H`GTiYzY;IZo-nXPuZ4ezXEzQWig>MZ)877<&6zLNVuKrdV2#fG!&`x;A=3pE4^=Z!xL1b+elS$zRio|GheSDe4CY;%=XCp~W z@#{!aAKvbz-D7`i9a&F^-h2IQw(AFid%Osc6{uC?nQ465Rl$%rS$b9Y`(Pr(kfj6O zTZt1fle|vqOw+a1;)gwQ-|nOgazDpJPF2Pp%6_!-u~{_7 zxyC*}vl8s6pli9NC^gZsa1lmII>D=}i%wC+80YAh=jDIZk5bQ3Q5Zm09j5j&$7a{) z?1#~JR_rxZr&Qs5n!j(hJz`qTa^`Fop5`cQ*XuC|lM-d8!L=jBoq4)(%5`WWFUo5P zTp^{4@S}L1Kl7rZwQWF^ve4$PzI!iQZED&Y`T{YEn zk6w4}%btHK^UV60eVgsC(0=qu^%L$)zlK8{x9dn_T zz)SWh*2BA*7$e}K ze$2Fe#j0{KK{u6na6OXF_M4&Ud(`WI;evNH#M6Jh*=ck^$5S!!O+tc^hj$RKHUFs1X7SyxrTIwdIFdZ)0jut&JkR9t zIT0hymMwRoQ`S%qOOC>#HtvK9-t-M{Jruo895iTnoBC4xCdf=%k9O5-eeO*7?S~f- z{Oy0SoA%qep!sy?ycrA@eUh7fsJQWQP7tL~Iv>2tSD_l|cbdzxh%^*dHCWYVUI(c5 z^aeEs48kz0Z#)lZYtAjA7O2m!jCw}Yi-=uQsgUK)qKJHYPW|Eg3j>5v$BXVFlAjeN zZx>b%=*mP*O-0vB$Z@JZz)&(f$fWRUiM)TULMt^@{Zwjs36_hG2!Mat zG|xO4y1k{$2ByL*-Igu+B~xj5IPloUuWz5*aqWabq1QsKLd1Ml1}-G1ni35Y&m$t6 z1*s7zN(F4lf|b( z2F^iRq{LVR(&CmY0;;tWwiD0qG}3Uj4T(j!Mvdrc?BKvIKhj!E$dh?m z6IEUlA1rv-9K`sT&BtLjS_oyMlSy$Ai65@CIJ5v2W<8wK9=9$LIoV1L+u(nGRIw^> zGZla%P}7B0oHB?WichHpAeY3yzuX0z7Odl$2#sNx3avp#7r(*z6LGgo?vM;!C?~)E zjWgFuATJl^4&26wf6ezIUYjsO^Roi`3nT+V+uRCH3m zLAf4zUo2OY{WkE0Wz)Znb2NVzdTBKgpPWlF9)A~^s|!NoJW0u7!~mKo!hhu}%Q}z) z-I2@Bq#J$^>*)BWHkhg4PW;z91?05>Kh2zx>2=^Y{m!}hK`HhML4{YQQJ{f2QYNh~ zZb9;db(jS^E3bv}`f3^x-@lXWso1(x_ zvrHV20PPp2h;xz%ts`Pm2UEx%`Bv5FZ&S!TXR+b$7ad zpdMX!D?}B8Fo=Q&9aw+MkrQo29H;B}ih3R5F~CLbRx$5Y#_#kHfrp3GKHVbWVWI!X zEnLbpyO@$Mue6zq3w(axS3gYG-!y5;4i!aLWf57-Ld&fwRAFMvP(PsbWZwo`@) z004>kfBHWi=-+?Y(ALK3kGD3sSzBG`ti-Q1qk2!NRkJgxj1aF=SWvjSa=4HtQF0w% zxssN&OA8Q__Z+g~lQg^|yN`bzNCgB#lhfwSpEk}X;}Rn_qmS``KLO#BceHv!0Gq?w zN9-PpvMTE&f8QU(jX-0&<-7D%B)#3ZxY8ZyjMZkpGjM-J?Il-QXCECd60Xm88g#VX zM~yLI5Le)g5#oPYZB#k&t#hAX=}xerGUpARcC(>d7wIitLK0YLUZB3UiE~T@Z@w@ z5YSTM?E!vXh&UIDbhK$oZ^@Fzeb;8!+cB*^1f_nxp1OcSntySvG*;esdMM$>z{Niaq2Pduks7OJslftG(D^OF$3ULCW#r~Dg@~@A8R4~} zc6Wc7+L5v!{TY`C2`#VQl+xl+pdC;ll?th|nFyt-{?K%z%cnzS!+Y#@z`da$2Eujx z-SZ|5NEV2oJvnwv#vj%LKawf+CDp}5)iTCGE2v~n!`;&1=MIA-LR`15Fca!8Zll4{f5lLtg z*^6IvBANK6xt#brpmBwkvp;qzG)z2+L*zclcTN@qbSSkv!&Ttrgh&TRR1yN#0Cpkz zBr{-fZ}v}VlstCAD5Q84_=5hIuOPzbvXZaYWNm@i`DR@dAng5_>zuMy4u?L?WNd$M zhVb64-!3o(8|WR=U{)F_m(q9+OUYOvAZq2&3lG!?YbUCI@vczGVp&pj|l2sco}?gJgsq4!?BST{tO#B^nR~NQ2$02 z%IEWjY$)0&^`BQ{LSbQNp()~EXXe9pV8gB+{#5rk9&ecMeh|Gap|CwF+>ERUVRUf_ z`BVfU?g+>HN2da4%N!Z>H}A+!b+Dt!HpN z5!(~^&J1=f@ZHHA4_egm#0Lk<>cg%RE~iDeE63*YXbBgJCz*&$Q}hSwz6Q*aX?Xcy z_#(uSLH*c+{Zn*}+yuEEI!TK=R{q=kVas){*A~V|2Uy=YumC%37(>fdvczOWGJf+QLyXVf&1C3$M)L@teuQ;??IkVi6$olDHBQ!>p zHxbQYj@00Cbo1<+lk+>lkNbTiv|7F5?5wP5LAp7)Ihi%&R5K@y7|r3yqB+eY;3W4! z?#IRhkmtjm%b` z3*YUOE$e{;iMr*x9fAdddd`FV`AqnPHlw53CG4FVTowX-o%Ro*-7r`@pW_K6b22<`D>YZpdflp%vW|aHGD-wRroB9cc(sX^yrLOx6OG@> z3mQjO$7?fO4Xh(F;4RSOWdb=$u?!L(4miUf=JWha$GPj8O}A3(#|v#%5?XhUQ1Aij zr-^ZcJ?DXG5hH++2dM%%!4KPz_yJh6taxE=*k}~BP{VFXLIo>DENH(W6m)}2xO{uT zx1)dUkx2~5K=)ytM%DT4IfnD*TR2>IIS0TU1&*J7S_X*xj9 zF?JSvzk;wuggtg}hAh;BG&mkiYf3KGf?zo5&(cd}DGEomeiU`Z`XJu6-ZaWdKKENf zbpeuag~XaR@fQDfNo{GAU}s&t9S^hPe(`^J{dkv(iMWc$GLQNl$;pjhvLqxKGu4ZsUh`6Aj)hPB$Wnwfu- z*$df}%BGfkg-|IrsuW(5iMZo6O$O4r5ycwobf0XjLx8JK?zn3GI#K*{7R@K5@&&U= zpZpv4;R=^Dc6MCW3!EjJo=0BcKtF_t8EAjon zMT2AHU4mgySJVQpXu8;qA#L3*1pqg_*ErA>M$W;t5GDn+G-O3%0}w zp1-)ZjIQP*XXGM{X5`YLu2qvJ97$EUNCm**@(~oG?{9|r zk_i!uynhj1zSrD)1L|i*N??SHszNFR^{S}9Ol^2wci+8;Q)U_%j`MvHmR+8UN0^r$ z%G#A!ztkA3Qp}<04rcBQm_vWl>5NeeLC~?97Z}AanU!RiMB2`p*R1L^nA3Dh%OUAe zFVwz1X2!I|m6o151MkkyRo>M5R$4?U&*5@krPa^)t_pmuo=4ORWhCG-k~}b+Sf%Uy z8d@$aXt6`f*>eExj?bK&(03LV2VSaV*3mqS;#T1qj^7@o__w1tLC!PZV!|PYb3yXI0KI z09v=g`-bUJ1o-p@snu{10tmZ+vvjWZ5?!$!au-r#adaaTyY}t8hjQAux3d}u3=6)b<_*s?>c!?D`o3C+2sZObsrB6HR^;gzW0a^I&793ci1Xz)`D zfG}VI!A@EVCb@w}4~_caMn5peA$}u&8$Gd-->>r?N7zmI#deoIoapsReki8;cckCA zpdzDA?X8(zBR#|-W+MY1_pr@5l2fec8wLuw@Xf+{J3K# z-uTMoVvu4LI)Hy_8YGmoWho$;JQ9)winu}dNNRo0yUQmYPU0iiY9tQ%%BB??Ka8De zcRcnkl&P%!`GnRmL5q<1;AJ&k2G~~cHf)G_tFiglap!J59Yqi<*B4Rhxk>tLi#^+ib*oNlkBB z6Hz4Fo-6Bkr4#kFO?mYpsI<;aP%LU^0t^X`2sc%A9=PT@Lz=IqXNls#=#y*Ph7()1 zL(PNf*ugB@yy#Bx4wYmNj2g~M5MoE_z3E)4-kpi?PR*;iu3BOHIID0}2pE-@Q)w_h zl6trHMaqAk?*6FL`m4y{nEfZmesP`}wGedLi(U=Ux|J-pkp9 zZG~RA)wyn36R--g8N;gd*u|*hB(_R}AFNBh4F(AG7BAO&Tf#Y)04gG!r&BynFSP~2 zkp`YwH`|>*aGch~ZS)4Faef8ZCLmc4$2ZuHLmqzzmE0b@`s-2jf^9(-KjOUv+H)jU z3L+IuY+1}S%{m(qoTu6VPDi|1a1grILZhegGv&a!m}+i2kOa*xVuPRS>z<0=(Vo+a zAoc8`8|A~Sl}3?t4{Lb9q48U&!gA7rQW3SBH>XD+6(?2j*spw_SYS^)fH4~=-DOi@ zJ5qm~Wf}_a51=b(`dgoc`}^Ou%IY3{&;kNcfBaO%I@EjKScN9-A%-En>#h_s88N92 zG4Y^*4V=o->yV@D;X_0*Ol_s}mT|ll!+5`eT9i1~P?R?AxyEgvPJrv6oC^>xP2QHA z?8bRQWQezQ?uGiL)+3Y1QC~fV1y`e3Vpo4jhw{LwZU`+bjig8qv?}=Iz^|Cj=&k+vIc7t~;0`ml{L=12L_5AwL09^t7rz1$k6|zI6iu z>*^&fiC0X1Nc3PvOPHfIBwPLPeG`9z0CH6zrA(8kC2N7iB7u>*Z+U~OUo*B-WnG+gf zBD(}i>lxMx$)#s_g9MxZCvbnLr6wC#Az-E*Y)W(wY^;V!Jq0F_g+aK-hBD!unS}V( z^3rDZ*O%U&*rb%E+HL6Up}wpaINY^Owl(|Rq(lkp6iuZM{f+(TPbO*Du2E$w!_sf7 z2xchK0-cNC#^jh2h<(^U%-^3^D;9jof)3GzASzwtka7n=5nJ8kA#{IqU~=tR-G2Yj zgUNkK=s$WnxOUHTe?2sSpvf}J($z)CElMpi?HRytef1=<2-SYj{FEPaa=-`j6w0n$ z09zByJw+-VXq7mwToo;7TfE0#sKvA_=pUU5*aok&_>pgNt*-&j@XbG+XjrO{&5Dyc z)CfhPWcz?sWMQ4^$bEn6e9zP@e#N*5r!L)MRDbDoL*y4*=}mDPZCO&j2P8iv7vAZd zr&_L7SJkasUe1#6w8x=I-o60~w-{o^pvfh@doeW6a@e3?h1vLi~R{J8IX(T?uapCz}*ibm~>BV$Waq`A;8)a$q zgr>e#A=WF9q-5TuB&JI}>0o3%d(L2m^?o7r{q8=Mg@9WHIVNm~Mc)f$g_7%$z4tDb zs6Bh{xGf9h;!2Ox^ars*y|#~@DLv`%1#RfYt`qAt9czD3)*Vlk@j346d$~b863&^_ z)t+fG9lu^~3q-6fTJh53cwIZl_HvTgJeVkgJ^eL0hoR4AW;0Q~>v@ zsxVW4F$FH6?gpW|O#%ikYxp$CKG?JdI`D6qyW6WdzS>X|IPw9P#(lFE+5vx^>CJq{Xs85zikM4VO?Z4jvK|t# zrE8{7bt2G4clLXT9l_sWVl$D4^%o%w1ngV_@+HYRrLbwgrs1F^jmvo(CwsbT^>`b? zi=qQrB{O2_;`Zo#pl<<_eZG7b-CofD7@ZiDho753005jb{9|zf)o(g~V7S?k+5 z{tsZBf2Y*J*3`k+@&Avx82<+8WNT~nf3M^pC_8-{W2^t8HWMpbeJA7ptBrrO=6~7v z?}nFT{|2RRXlQKpwW&G2<=Z))R$mGp_GF54q@|-@F(E%?JhsQ3seh_Y%MjWiK&p3F4%o{ z)lbDt9UUau{JfOG#2P;}j>Jl4U6GbArT9CX#=w zikCo23M7`0!UNE%ssko|VbYV8PB|9kpID?DNUCB&8`byb)~Rc=vc^QYz$U%)*AD$w zFPh{8HBFBiz@jA%d$MBpivTxjKGi1lXd?EVzGn8|DKD3F^|^g$1L|w-KAOi`q)vGVtKEp<2J;tG4%uJV|NK|vKR*nj`3sVP_W!t0+rLu(b1(+|7wQ%L zzdT#|SKvSUNvOX7>uvrya{Je|`)5h4zu**I|7V~2zvYSeH$4CBWB)S`-d}in{|(Q7 z^SS?-4CgOoU;oaizxd$)%=B2-j>_ToKl$YUZ6n$K2bO>M=>M%XMgNB9zkK%pmSyAL zu>6+~|7*wlL;fF*nCves$nO7ZpZ>3;|Lkc{|3Yfv{vSNLyc8(d9|DNK|KfhbHa-5> z`u_o!vTFr40z3ehAz=>_mmszR2$uzH1v>-ASJjuH*#aY%pwI&bw`^<$Y!U;;SJkK6 zeg$P+cRbbK|G(~auX*p=4%s^@BP24Ck(rUb_ui3x?Gag(H_6Cu*rF&&$|xdxXA?z4 zGV1qs`9$B}A3V*!}u4)82*Y2d%@J(+Pt+GVh44W zU%fFGOI-+=@>6}odPP+jC18$N{Yc(vz971$4<0eldn$}}CY2M4u6m~rWa`=cS(uvo zBuxMHX7Tp*niJ98?{_~8JIj{b?{*Xpm>EJTVnTK8GsK!qow4gL?GN73mxkTL&&qkKr#vB=g?i=@3I=1{?;UEe zaRfxm$3l%OGgZqY*zpglognQT(KNYO08!^f%o0^{uN1rqq z}uTCHW7jteHeu?FCAz zYg0X45vdPs60PRS+)o;D+I?ouzm&%@H!WImR@?&lN$Bf2(j6tI=JxA_FRy1sv*opB zRbIyuOiZ-{?^~7FUNkSRp1ss)-LUrl%Gg!$6ZdPb*UNSq5N<21!1*Ugvu`5?Hs}U6 zY;JaM5Vib>xAIS)zB4r!KQ$-x);CSKV29CMT(wQffPlNxH2Xq8(9lr!vTFW?rGZY} zUTLmCFNLi+p-F3@J5qlJ?A7u)81A`gee@JM>p0Sk@QwaaAw$Y}K&sQyiqBmT>|CCHHpK0}b|2t1nJ;`{Cx3>Prw&&8*nxy)#JGXwmxMUhdmo$;H z;Frzi4ZNG|y6)C$ZWflG9Q=usOGn(8&#P}7pSMBj6%2eij#R|CgxV7m$b1ACJByS# zphstsTnGd-V?g90QsiiM)M_pwd-4AIB%BMAT|z1#S|Asu*@!+@)Ubpk*{5n>Zz9uB zfAQMHJtRnaL>d#L%qegr#3u}WNf3B-B@1X^(n*;(*IN1a$)MzyX7yDBAyZz+i7E>abVOhM|a2G)N!W_{Yc-nN`N%#V*quaYe$7 z?T-W#{wl`s&?+rH{`0v?oPtNr>Am|Lc7EIvHJ@Hs-aS3uvn zI4#)AOujkALZ`A}+u;>5{N@to&YX3)bZ#N+28+0v^;6fWJBv)taeK86ltrq5x%U~3 zFt(qC9Zmv@8&oso^m)<2B`;#J+J)TZ91neDANOsksHA5<=;3B1>QqRY@+6J$WsCH~ zUm^kn@_dHfDFxu$lAQMrin#b0J)AC%dW zn?~^zvFT!}E@kmC_u!+50Sw0@+pPvZK@lW$6(!PiN=z+rDs(0 zZyIkFpK8>m4I=yU1i_Na1zXR09s|%w~*?g%Ue9W$JICit*6VOuNt1;Yd{wC2xd5p z^JoX9jRxNv4g18a{o5N&uk+n++qktwuZ%mV!s~6vS8KMw1r>!WIrBG1+PqkU#lNK$ z`jzmEkD0!FNzUWn>JD{$yMQa!wXER^bZxm?hdUNkImSD+G@v)F_o=C&rnJOMG86BO zjMegvhW-sEBC?-^+j7$)n~PUJIMC)i{;4fzH4{C^>1s55y8pHD7vrcE`XUJ_qSFcj z+=T2WE}M8AWys}mK)2{f>Nq|sVu>(cu(4B;%(?s(SJ+peD4bZJp7cX0UVZU9&-U{B^iNz9 zIM>xHnwfZdW-KUJh*EP?sCmyne7#iPeyvTe#Qe}6cJEiHa7l#6d*piMSCQfkZ?WOfD z0y}ntGxE3MUp!NZVXl)w6FPA;dGucCI-AfbLvE`n_I&jL)rYfTHleRmbDC^47b7Z? z7I_!Gd1t#+$GeF8b5YSvHcm+ZdG|fmk|}fJDSTv!{AGv+i8GYodo$g4u!=*^Sd{44 znd@P*>_4|PbmD9s9K!X>l-eFm-?*n5W}KPuS&44MN&o9LF3pC5G#?WRJ8va11B&Q? z*MdqhYps(cI`$F<)WZp!kI5be?lHEPG|_D+Wu=>Z6rHE7;Y>ee{n)7NWz&$^`Nv^f}h_rTSgd+2*|pMnU&=*I`R``Z^^wdbt`hcd^LKZUM6x3E2&>Cw6r-| zB(Pg`kp^x3CaX)ZuX`k=o8RWVmiWav4tShbRSI`uTI7yYom;L8vkSAtk_f5rTZ?4& z%g$`~MqfuS^OddzRMCu%BWf)sHyNz)%SL@28N~uH_Ynls?$jlIujR)o45y}@Keh~6 zP;|XmYb8PC>M>(wOXucw+^H~%RW`|yp z4PEjwPxEWhrEYKIIr(~b{X5H>@WgKGdA_QoxEi|@kC!}=&sW{?*ReTX3J;PuV#iMx zYhT^&Il=EQ+0*;>BIlVhq2)_Ym44~ZwxIo|n#eHKLP(B>V^HFI{1 zg*dl5|EbEU^c}GT#d}mwX-LarqGrZ=ue?_-0eWVw)X!VH`x@vzBj+2B42`~k5fv*% zJP|oh5#SrD(eujvn`|YU5?QNL+aK6|SWXP>Qed!s$B0XSNwz2g5R-~xJ-(#kLJW;m zl=$DE1KQ;ff<>t)rTslp?RqMzffARheuT1w<5F}bC~7#uT)3}Runctu4~JQlqgYk; zQ()u{%6C6evx}O+<$?2isE;_N=f6>s1h~{MB!LV3UzKnD01EIfA%W;VLv$x0L2V}? z;Wz@vUPek7BZtGqH3_4|HHn}gR$P;`6dxDBEa{M1&fpdZ4RQ44W8VLfINAsQ zU=cYdjjn+oBzG^Ni;)M(T19jr;vng+f}TB0+FwPh;~k)F8t4K9Sbq&ohDW&{UC@x| zTqA-Z28Ob){f1ARn}O`uQXy6_;>lb%5j9g8H@zoUf?BFX*uv$h6-$vl=DONOyN)&zD|j3PB| zG+ab6C;umqEjW+S#x-DnFJ8+eh7lpakx+zst~OR0lXno8;z-NOm_h{N!hannrHHu= z9FYWi7^Y*Sku8SeZ?~SS&GW`E97M*rO~2nK40-Kl0A>e%B!C->!5$MZnt-7>CV(dk zLy8M_4?4v0AqGGll`Sj7upbP>f8xn%2^%o?@Q+vqn=kX#8Lo;8a z1JL-OD#w3Z=^TK}A=ffDa0-dpcM3(pOJE!V2D?WDdL%;obax?u?r7Fv`*hV3M?}e9 z?&zuNu%ueGc*325?bQeJ$uw8|?LA30WmKx=!?}=&f6A~Pp%KffkoBHMhmGjfd zD;~mccB7S3=Y}m-;frK{JbeFvWv!2Xtq%j8fa#6kDsry7&g9u zB)KLRC6%7vD_#kMNf?-5Cm-(+mxE3Dt3ExnU2+Q_(%rtTxAbg$PF=L(ej1MDCD`jnqYkh&`v&in?#2M8WBJh%SHp4Q? z-N$L7ZRv{}~p26V57mI$<0W4KcsVb! zhMrDrNHeR6J1t*3VXXCys9jOhksp3ET~HFPQ&+TFV=yi z*PCSQx8dUnwO=EL`2w#Jn-4X+=9~GH*Y#!f;1eX*eeBB|Yo+?5$o1Z9ON7%Aj|qIg z5=rZK!kuJ-XP`Roc~EQtQdTMpUNmLy=!;${%y&t)7*w?UvVqM~d1(2wZ-9wr!-=3e zti&;_rdFCw{SMjzfuyF5JprES)wIKd&t}@>*%m|yJtNsH4u2!@|`fS^r z`4w4pTxc~5Qz0F!r#N$~l##>zSw61F=nfU4;UvcCW&Y+d%D@YSBP5LXO&b%?=f$RT z2HTa&ztEk2mzj2L(Dfq^i#opxk3#gjIGN780oorA*5A37P=64a^{rmlNu&0-Om$(= zBNMxRKTwFvqRdvG{Y&jfW@#A@z2Nn$L1d4JRIYwvLk2J;Jja%OaGmj47rMF|X_;C- z5<+F1@+f9k^*!5C-wCfFS+b|L;krE2iEwj3F@C02Q9xZ)@Mp%jmiZo9%v?M7{V4eW>ybGVt4- zS?!7{qly6X<*#_WYW+Q80c7L;^ck)N9$L@&2BrT!YP)c+e?$s8X~RQ;Dx$#YV>37C zj#^@d0CfKNi@N8Bc^BJYM++w&=I*1KPc`6X&2V^l=I59}!hotvBfCEnTv&*POR0#2 zR(y9~Y?3Z=7ZUgMGbno%uPF^ni`o3bXAx<-cJWVtS6#%b)eOBC0ynb!_1*O9y6|^86LgR6Zk^l%K?3TKkI_E! zu<=o|5WUx`&%@sC1qB)2s7Q%3aZq@D%aPVicU2=>=CQIsu``XXQ&9VmYv!|;-QH6! zS3ljdEC~|wz<*uoKwzFOc*hK%wbn64T}q13iAyQRUQC3c7=M_B;GQ7omAB6n_O4)0 z{=v{)ywG(1b&_=0O;_Ki@HG-0UzYiW+)jlr%L3u;9Y-So<_g@R8 z?(_+#{ux|R>C*c;U6AZ2r{MikRsDE-9#Zt%Y#}O@&=*UN!9mW#>Q@J%nPDb_v%VJ?$>{FXP0|{(` zW=qV@pa-f{wO6mDK=P}(x)(y0nB5+UK;VawqaEXV0zdx_dGi})6{NNi5tP{RGVt9^ zJ+phl->Ys_eQUUW5Is^sK_eloJ>slfKDP=dHvtTmP6mS!!5Cm#@|Wb)X7N@XjvaS~c$<1=9( zM^`?%>K%E8PJrG3yHLO}Yi(gg->02HkGzd15?SCybR*TNH8agj=i6s3njE#LyYoLM z%B@b_%1cl2n=2uz3=Mojoc>tr-Sqq~&KYC5k)g+#b7pN+W>fFkr z$dLu&jYippxib>loMbn99~OK#X~|wCg&)*c*Vz7E-z@$E?Ksv=;aZ%cGg%dD_*@{d z)5ANi1s!&Vr)qPw*snF&*sba?{E{$<5*sDvY3!nQwHodkW8t?>SE`Gdzz&;<>1A@n z5(Wsm?!YW_&4M3TIApf2^EjSJ;wyea9Dz4Uz{j$zzAQR)tt{VxXwN_6N54j)o=vH| zyA6T2?e)p?bLFMjEG?TKFIC5suD1xBagRbo4P8E;nCbk>z1IsZi}Zc(CuPk5%p>sJDzU3^^9WB(-n@NS=73v>Y&E&^QG=yM-P z{k&v#?`)D;-Msg5vjt$yF!-!qAlA{Fa&0bIsu2HV1cK$4ALFE|ezc$#YmY-m_sNe1 z^_bAWZqll~muJuc1Z761%-4fJvgMKU(+Na&Trc!VVydecpUwg%uc!)V@l>g~2`1(ntISzw)G{5^h#uVzeS zl|L4ewC{>W-SBExJA~V4HmL(B(y`?qhx5 zBq@?L8SC5U-@ISS=-yxrQRuFx80&;CzGG`+hy}F%6n4CA|0v{zz3%--IqJ(@O-$|0 z_Ch;X&iMFeaZ@4&^=JNE&)G7lzSQW}km4Usj#iYcqm7Ts3;tmt_Iq!0EKQ1Zyn%5v zK6-$?E=UEeJ+JrX`|2jj?A52wbL@LwzFv`^&?_=TYi|U6VAqx}1drd!AJrP~RFC+e z)<>FmIibb%7B_y!_iM_+3|SHRXYV|1AZEAAHKuNl)wp}(Lu}shWpaN%H5+@&b$>sV z2`!bx&@y>NN&DJWErb8o$)o4PkveLL)1su%&Wdbssd@UtfX~nVZ@Kb-HdW@OfTzxa z6}HxGNi)8qW)q4dO80XbvnWQ`evMDFdkY9+<9gH50%@zb3cf9U{rbAOHf^W;W94!W zcO731kYQOrBsJOP~MtT=+(=}}J8mA0NvtWig3`>t-D zLTreepq6Uh?4SU*<4#(!Wu>V@#G0a=no9~}+b`CZUlSvpp6}HucFsQV%@-04-s+DI z87M29O}W$4Qk(Nho!`sfdc)m!|BxAl5L)kc%39Cr?H#)yzg^E$nxGisqzrZp~J4+ib!t8|Zdvxno=2Rvf$dm3 zV^)eTeBS*+|C=)-E!sCLa@ub7L}A=XLvrIs1QY5j6^KL$&90zVNd{`4 zR04Q`yv(_4!e;LRkV_ugqh?LpO6GfQcyxxdj;Y&hh1X)ty5+?PuBko!aDjm`t^7g- zXt$Al>-HB(+mk_=j8D})@vxsQyngx;eXfG}YF7IHHYp7&EfWw&XNl{);!8&`_?Sq{ zmhLuA5-4R?&OXw&b!y8?oD0$>KoZc!FJinr&vEKX>PlbBY_Vz3jQGq4Pq^`^+N$}< zI;Y${iR7j}_DfQC$lA3f49fx}7@1r-RDIr6lLRL(&YSy8Q^$Vo;f$qdVHUTQ4FBU! zeQQvUHRmq6W0bLP676{pvNP%ksF8 zSBKC=6JiE?v;kJEt2=Q4ADafRNCCCtc|WBI-ilja$+lPgF!FF0OziS`ChWPPimShW zwS5}AJv~S3{_>fjar+X=VI;Yf@MqiEbXC|zFQsAaNYfg|rsO0;o%Z>Q=@yEeRo&0j zX|^blJ?r-V9w*MI7b+I1cX8$X(vb9`0D5yH=RH^dJ~H}sb#)aseNV=nEyb5G-R{EK zgmB{Ne(dv$C7 zut5jlhASLo3cEv@LCcpFd%W>r4Pz)635*se0vcpkekeg93})@%b)DbG!RxG}m(DdL z3~?w{#0@GL#(N7E4Y_whXct8KPf2D5_)$qKuY;npIHf1RtGWQ{?EWt5sLC)H@~}J% zMh5$OX_*-+?`Gx2kJGt)P}@{{03Up90MH}&Sm2}AVG6Q=#fB;5yU@y?l?|v3@9VWMUF#K$_N55$QWY% zE_xhiQiVi(-p8RM^8E@Nik2_|ln@P4$DwQ!;0mHb<~TI214$(^g-Vyn9pUN-9fczb z3AUO-)tS9=2th3(0xOLGUeL%4Y7yM}IBSv_pn@2&Jq~S}0g8x5hvU%KU`PbiZZ426 z1c3pL%%wV%(&;#(OvnKv8*bQ^%prXeE^tsI3_%4lSO9FS`xZd`s)07(1PnIm_`jpp z7Yql@EC6cwvB77YzFx^UtYi*zkqRjEZZ5zM{L0g9p>f1tmXyP+oe=Vcw}lBxYYN8yI&TAS0*w z+pGJ2A+`9f}-z`q0kZPrY9qZl=L2w68zu-S*?l_ zq|9^S5XU+Jh6swCL#luQy5Wd$hQyqJBM^M2<) z>W)2%3KaE#$~`eXWJvV@&K+3CkOzRFWHLv>Y~JU>u~tZy&w%A zoRDCU7r+A=xdU`KkIwk_>I&r1+5ge=&IJkjB%-+X^$3BI*CFe+xsC+MQ&A_ubpvRK z_E(sF^I<~NLU^b*zy!8mhYSYeeMp`01~d_EF*wQ_Ar^NCpYQ?H5Sq6Rsgq?WQZU&E z>b2km9K;MNm7_2q-VF%K8#?52*?}PUeTZrJ5L(!WCiWr3=piKI3uqvE{-ZK~L*w|y z7h)ir!7;FcV@LuD@PZ!%#m^zZO922U_`naU@|XW85`RDm-u4A#^#$lbcYi<+p}|jZ zz_{WMTt)1jBiW~naMLX(0P53fTGIVKp#%NI(I<|L31uLZsmMqQ3IqbS2r?E@@WmxG z7x*d=Qr^Z%3VJJ|c|hJEh`M=-6m$s!%n^ZSNWrckhkY;x{h z>JuUbL$9G}KxQm7dm#oU1lu`MusalTt&CWxE&c}-52&t#rUWywkcJ9b9K$JaFA^XC z$wDCCWuko?O5BGsEFdTh;09g8(PSWXC{z&74ada;hJ*s@h{r)V3X3R?!zGyapZhX^ z31JYYZWgX^B%-qHut-!l)E{Z#P+r4JTpl+FkAS+6vI)m<3Ji*XWY@tVgtX#`j?;p%@P4(knu7GiW*`d$#k5@@|F}Z zG@w~51P=)xgEjUrNU&TNLl4gH=LyLj&$|g2!b7$HB8=epO-O%_!7-#f0Mcd|2Nm5k z{tHupII&%EfC;?P`8a$NAO({WFaYQg4;8@=JeJp$1faqBcu0X#^f4IMCd*q89DVB; z3@IQ6$8G^v;WHV>V4M)k1cb$JfUYNSh9vs^b`ftJdl_NQZqgq$7Cb-#l7yG5OG|Wsn2^I==UdXz&p^ zWC-cE4_UsXK=aV+D;gxY4b7~s?`Y8dHlTu=zg%~qtaF=a(2V1FiP(KO>K7U;yaUMM zobk~U>wlf(*U;VHXwX~;T9W?L$9VL347!N^k3*e-V?Yg2D9YI975e`VIF6#c{LmmI z=J?|dXiIP`LgV@O#OHXqc~Z==^B?fL0i-Tm9-ufDLgt6okYT{JRNyrK|KDyNm-U$m j^LO(JRX~Rj!~>zw!yE)qnA@=1FfU0M><$YC+F$%1q5q}g diff --git a/examples/graph/02_random_nodes.html b/examples/graph/02_random_nodes.html index 24e5926a..f5a05364 100755 --- a/examples/graph/02_random_nodes.html +++ b/examples/graph/02_random_nodes.html @@ -74,6 +74,7 @@ nodes: nodes, edges: edges }; + /* var options = { nodes: { shape: 'circle' @@ -83,12 +84,18 @@ }, stabilize: false }; + */ + var options = { + edges: { + length: 50 + }, + stabilize: false + }; graph = new vis.Graph(container, data, options); // add event listeners - vis.events.addListener(graph, 'select', function(params) { - document.getElementById('selection').innerHTML = - 'Selection: ' + graph.getSelection(); + graph.on('select', function(params) { + document.getElementById('selection').innerHTML = 'Selection: ' + params.nodes; }); } diff --git a/examples/graph/07_selections.html b/examples/graph/07_selections.html index 25faf4c9..98e44ade 100644 --- a/examples/graph/07_selections.html +++ b/examples/graph/07_selections.html @@ -51,11 +51,9 @@ graph = new vis.Graph(container, data, options); // add event listener - function onSelect() { - document.getElementById('info').innerHTML += - 'selection: ' + graph.getSelection().join(', ') + '
    '; - } - vis.events.addListener(graph, 'select', onSelect); + graph.on('select', function(params) { + document.getElementById('info').innerHTML += 'selection: ' + params.nodes + '
    '; + }); // set initial selection (id's of some nodes) graph.setSelection([3, 4, 5]); diff --git a/examples/graph/17_network_info.html b/examples/graph/17_network_info.html index ec4379e2..0b7e033f 100644 --- a/examples/graph/17_network_info.html +++ b/examples/graph/17_network_info.html @@ -17,7 +17,7 @@ } - + + + + + + +

    Clustering - Fully random graph

    +
    + This example shows a fully randomly generated set of nodes and connected edges. + By clicking the checkbox you can turn clustering on and off. If you increase the number of nodes to + a value higher than 100, automatic clustering is used before the initial draw (assuming the checkbox is checked). +
    +
    + Clustering is done automatically when zooming out. When zooming in over the cluster, the cluster pops open. When the cluster is very big, a special instance + will be created and the cluster contents will only be simulated in there. Double click will also open a cluster. +
    +
    + Try values of 500 and 5000 with and without clustering. All thresholds can be changed to suit your dataset. +
    +
    +
    + + + + + +
    +
    + +
    + +

    + + diff --git a/examples/graph/19_scale_free_graph_clustering.html b/examples/graph/19_scale_free_graph_clustering.html new file mode 100644 index 00000000..cced805b --- /dev/null +++ b/examples/graph/19_scale_free_graph_clustering.html @@ -0,0 +1,141 @@ + + + + Graph | Scale free graph clustering + + + + + + + + + +

    Clustering - Scale-Free-Graph

    +
    + This example shows therandomly generated scale-free-graph set of nodes and connected edges from example 2. + By clicking the checkbox you can turn clustering on and off. If you increase the number of nodes to + a value higher than 100, automatic clustering is used before the initial draw (assuming the checkbox is checked). +
    +
    + Clustering is done automatically when zooming out. When zooming in over the cluster, the cluster pops open. When the cluster is very big, a special instance + will be created and the cluster contents will only be simulated in there. Double click will also open a cluster. +
    +
    + Try values of 500 and 5000 with and without clustering. All thresholds can be changed to suit your dataset. + Experiment with the clusterEdgeThreshold, which increases the formation of clusters when zoomed out (assuming the checkbox is checked). +
    +
    +
    + + + + + + + +
    +
    + +
    + +

    + + diff --git a/examples/graph/20_navigation.html b/examples/graph/20_navigation.html new file mode 100644 index 00000000..cc9ed615 --- /dev/null +++ b/examples/graph/20_navigation.html @@ -0,0 +1,181 @@ + + + + Graph | Navigation + + + + + + + + + +

    Navigation controls and keyboad navigation

    +
    + This example is the same as example 2, except for the navigation controls that has been activated. The navigation controls are described below.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Icons:
    Keyboard shortcuts:
    Up arrow
    Down arrow
    Left arrow
    Right arrow
    =
    [
    Page up
    -
    ]
    Page down
    None
    Description:
    Move up
    Move down
    Move left
    Move right
    Zoom in
    Zoom out
    Zoom extends
    +
    + Apart from clicking the icons, you can also navigate using the keyboard. The buttons are in table above. + Zoom Extends changes the zoom and position of the camera to encompass all visible nodes. + + +
    +
    + +
    + + + +
    +
    + +
    + +

    + + diff --git a/examples/graph/index.html b/examples/graph/index.html index 7cb11657..d48f7c87 100644 --- a/examples/graph/index.html +++ b/examples/graph/index.html @@ -29,6 +29,9 @@

    15_dot_language_playground.html

    16_dynamic_data.html

    17_network_info.html

    +

    18_fully_random_nodes_clustering.html

    +

    19_scale_free_graph_clustering.html

    +

    20_navigation.html

    graphviz_gallery.html

    diff --git a/examples/timeline/02_dataset.html b/examples/timeline/02_dataset.html index e493663d..c15e9c7b 100644 --- a/examples/timeline/02_dataset.html +++ b/examples/timeline/02_dataset.html @@ -39,18 +39,18 @@ } }); items.add([ - {id: 1, content: 'item 1
    start', start: now.clone().add('days', 4)}, - {id: 2, content: 'item 2', start: now.clone().add('days', -2)}, - {id: 3, content: 'item 3', start: now.clone().add('days', 2)}, - {id: 4, content: 'item 4', start: now.clone().add('days', 0), end: now.clone().add('days', 3).toDate()}, - {id: 5, content: 'item 5', start: now.clone().add('days', 9), type:'point'}, - {id: 6, content: 'item 6', start: now.clone().add('days', 11)} + {id: 1, content: 'item 1
    start', start: '2014-01-23'}, + {id: 2, content: 'item 2', start: '2014-01-18'}, + {id: 3, content: 'item 3', start: '2014-01-21'}, + {id: 4, content: 'item 4', start: '2014-01-19', end: '2014-01-24'}, + {id: 5, content: 'item 5', start: '2014-01-28', type:'point'}, + {id: 6, content: 'item 6', start: '2014-01-26'} ]); var container = document.getElementById('visualization'); var options = { - start: now.clone().add('days', -3), - end: now.clone().add('days', 7), + start: '2014-01-10', + end: '2014-02-10', orientation: 'top', height: '100%', showCurrentTime: true diff --git a/examples/timeline/06_event_listeners.html b/examples/timeline/06_event_listeners.html new file mode 100644 index 00000000..8ea72e1b --- /dev/null +++ b/examples/timeline/06_event_listeners.html @@ -0,0 +1,53 @@ + + + + Timeline | Event listeners + + + + + + + +
    +

    +
    + + + + \ No newline at end of file diff --git a/examples/timeline/index.html b/examples/timeline/index.html index 91b28ffe..2ff3984b 100644 --- a/examples/timeline/index.html +++ b/examples/timeline/index.html @@ -17,6 +17,7 @@

    03_much_data.html

    04_html_data.html

    05_groups.html

    +

    06_event_listeners.html

    diff --git a/index.html b/index.html index ae57caf3..a0c18d7f 100644 --- a/index.html +++ b/index.html @@ -73,7 +73,7 @@ bower install vis

    download

    Click here to download vis.js -(version 0.3.0) +(version 0.4.0)

    Example