From fa822b1f79a05a6c1cc46575852299d1b97ed627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 27 Jun 2017 17:16:26 -0400 Subject: [PATCH 01/10] add & coerce 'cliponaxis' attribute for scatter and scatterternary - N.B. dflt and current behavior has `cliponaxis: true`. --- src/traces/scatter/attributes.js | 12 ++++++++++++ src/traces/scatter/defaults.js | 2 ++ src/traces/scatterternary/attributes.js | 1 + src/traces/scatterternary/defaults.js | 2 ++ 4 files changed, 17 insertions(+) diff --git a/src/traces/scatter/attributes.js b/src/traces/scatter/attributes.js index 726bb94bfef..d8068e77d93 100644 --- a/src/traces/scatter/attributes.js +++ b/src/traces/scatter/attributes.js @@ -168,6 +168,7 @@ module.exports = { ].join(' ') } }, + connectgaps: { valType: 'boolean', dflt: false, @@ -178,6 +179,17 @@ module.exports = { 'in the provided data arrays are connected.' ].join(' ') }, + cliponaxis: { + valType: 'boolean', + dflt: true, + role: 'info', + editType: 'doplot', + description: [ + 'Determines whether or not markers, text nodes and errobars', + 'are clipped about the subplot axes.' + ].join(' ') + }, + fill: { valType: 'enumerated', values: ['none', 'tozeroy', 'tozerox', 'tonexty', 'tonextx', 'toself', 'tonext'], diff --git a/src/traces/scatter/defaults.js b/src/traces/scatter/defaults.js index e7ed99fdda2..9699469615f 100644 --- a/src/traces/scatter/defaults.js +++ b/src/traces/scatter/defaults.js @@ -75,4 +75,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout errorBarsSupplyDefaults(traceIn, traceOut, defaultColor, {axis: 'y'}); errorBarsSupplyDefaults(traceIn, traceOut, defaultColor, {axis: 'x', inherit: 'y'}); + + coerce('cliponaxis'); }; diff --git a/src/traces/scatterternary/attributes.js b/src/traces/scatterternary/attributes.js index c6d3b709760..4b5b73bca6f 100644 --- a/src/traces/scatterternary/attributes.js +++ b/src/traces/scatterternary/attributes.js @@ -95,6 +95,7 @@ module.exports = { smoothing: scatterLineAttrs.smoothing }, connectgaps: scatterAttrs.connectgaps, + cliponaxis: scatterAttrs.cliponaxis, fill: extendFlat({}, scatterAttrs.fill, { values: ['none', 'toself', 'tonext'], description: [ diff --git a/src/traces/scatterternary/defaults.js b/src/traces/scatterternary/defaults.js index 5a3b8dd3e4f..9a1ca4f4fcd 100644 --- a/src/traces/scatterternary/defaults.js +++ b/src/traces/scatterternary/defaults.js @@ -99,4 +99,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout dfltHoverOn.push('fills'); } coerce('hoveron', dfltHoverOn.join('+') || 'points'); + + coerce('cliponaxis'); }; From 1079c274aa5c196949722a6b73107d46602ef405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 27 Jun 2017 17:19:25 -0400 Subject: [PATCH 02/10] add 'noclip' layers to cartesian and ternary subplots - with nested to implement `cliponaxis: false` - apply on ax._offset values to this new layer, but don't attach clip path! --- src/plot_api/subroutines.js | 7 +++++-- src/plots/cartesian/dragbox.js | 23 +++++++++++++++-------- src/plots/cartesian/index.js | 12 +++++++++++- src/plots/cartesian/transition_axes.js | 22 +++++++++++++++------- src/plots/ternary/ternary.js | 4 +++- 5 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/plot_api/subroutines.js b/src/plot_api/subroutines.js index 64d1663910d..6809f836e65 100644 --- a/src/plot_api/subroutines.js +++ b/src/plot_api/subroutines.js @@ -164,9 +164,12 @@ exports.lsInner = function(gd) { 'height': ya._length }); + plotinfo.plot + .call(Drawing.setTranslate, xa._offset, ya._offset) + .call(Drawing.setClipUrl, plotinfo.clipId); - plotinfo.plot.call(Drawing.setTranslate, xa._offset, ya._offset); - plotinfo.plot.call(Drawing.setClipUrl, plotinfo.clipId); + plotinfo.plotnoclip + .call(Drawing.setTranslate, xa._offset, ya._offset); var xlw = Drawing.crispRound(gd, xa.linewidth, 1), ylw = Drawing.crispRound(gd, ya.linewidth, 1), diff --git a/src/plots/cartesian/dragbox.js b/src/plots/cartesian/dragbox.js index 603e88d2f78..744c93a05b0 100644 --- a/src/plots/cartesian/dragbox.js +++ b/src/plots/cartesian/dragbox.js @@ -749,16 +749,23 @@ module.exports = function dragBox(gd, plotinfo, x, y, w, h, ns, ew) { subplot.plot .call(Drawing.setTranslate, plotDx, plotDy) - .call(Drawing.setScale, 1 / xScaleFactor2, 1 / yScaleFactor2) + .call(Drawing.setScale, 1 / xScaleFactor2, 1 / yScaleFactor2); - // This is specifically directed at scatter traces, applying an inverse - // scale to individual points to counteract the scale of the trace - // as a whole: - .select('.scatterlayer').selectAll('.points').selectAll('.point') - .call(Drawing.setPointGroupScale, xScaleFactor2, yScaleFactor2); + subplot.plotnoclip + .call(Drawing.setTranslate, plotDx, plotDy) + .call(Drawing.setScale, 1 / xScaleFactor2, 1 / yScaleFactor2); + + var points = subplot.plotgroup + .selectAll('.scatterlayer') + .selectAll('.points'); + + // This is specifically directed at scatter traces, applying an inverse + // scale to individual points to counteract the scale of the trace + // as a whole: + points.selectAll('.point') + .call(Drawing.setPointGroupScale, xScaleFactor2, yScaleFactor2); - subplot.plot.select('.scatterlayer') - .selectAll('.points').selectAll('.textpoint') + points.selectAll('.textpoint') .call(Drawing.setTextPointsScale, xScaleFactor2, yScaleFactor2); } } diff --git a/src/plots/cartesian/index.js b/src/plots/cartesian/index.js index 883acb4d0d8..fadbaf1171b 100644 --- a/src/plots/cartesian/index.js +++ b/src/plots/cartesian/index.js @@ -162,6 +162,12 @@ exports.clean = function(newFullData, newFullLayout, oldFullData, oldFullLayout) .selectAll('g.trace') .remove(); } + + if(subplotInfo.plotnoclip) { + subplotInfo.plotnoclip.select('g.scatterlayer') + .selectAll('g.trace') + .remove(); + } } oldFullLayout._infolayer.selectAll('g.rangeslider-container') @@ -334,6 +340,9 @@ function makeSubplotLayer(plotinfo) { plotinfo.xaxislayer = joinLayer(plotgroup, 'g', 'xaxislayer'); plotinfo.yaxislayer = joinLayer(plotgroup, 'g', 'yaxislayer'); plotinfo.overaxes = joinLayer(plotgroup, 'g', 'overaxes'); + + plotinfo.plotnoclip = joinLayer(plotgroup, 'g', 'plotnoclip'); + plotinfo.overplotnoclip = joinLayer(plotgroup, 'g', 'overplotnoclip'); } else { var mainplotinfo = plotinfo.mainplotinfo; @@ -345,16 +354,17 @@ function makeSubplotLayer(plotinfo) { plotinfo.gridlayer = joinLayer(mainplotinfo.overgrid, 'g', id); plotinfo.zerolinelayer = joinLayer(mainplotinfo.overzero, 'g', id); - plotinfo.plot = joinLayer(mainplotinfo.overplot, 'g', id); plotinfo.xlines = joinLayer(mainplotinfo.overlines, 'path', id); plotinfo.ylines = joinLayer(mainplotinfo.overlines, 'path', id); plotinfo.xaxislayer = joinLayer(mainplotinfo.overaxes, 'g', id); plotinfo.yaxislayer = joinLayer(mainplotinfo.overaxes, 'g', id); + plotinfo.plotnoclip = joinLayer(mainplotinfo.overplotnoclip, 'g', id); } // common attributes for all subplots, overlays or not plotinfo.plot.call(joinPlotLayers); + joinLayer(plotinfo.plotnoclip, 'g', 'scatterlayer'); plotinfo.xlines .style('fill', 'none') diff --git a/src/plots/cartesian/transition_axes.js b/src/plots/cartesian/transition_axes.js index 44344a35132..aae06a268a1 100644 --- a/src/plots/cartesian/transition_axes.js +++ b/src/plots/cartesian/transition_axes.js @@ -143,15 +143,23 @@ module.exports = function transitionAxes(gd, newLayout, transitionOpts, makeOnCo subplot.plot .call(Drawing.setTranslate, xa2._offset, ya2._offset) - .call(Drawing.setScale, 1, 1) + .call(Drawing.setScale, 1, 1); - // This is specifically directed at scatter traces, applying an inverse - // scale to individual points to counteract the scale of the trace - // as a whole: - .select('.scatterlayer').selectAll('.points').selectAll('.point') - .call(Drawing.setPointGroupScale, 1, 1); + subplot.plotnoclip + .call(Drawing.setTranslate, xa2._offset, ya2._offset) + .call(Drawing.setScale, 1, 1); + + var points = subplot.plotgroup + .selectAll('.scatterlayer') + .selectAll('.points'); + + // This is specifically directed at scatter traces, applying an inverse + // scale to individual points to counteract the scale of the trace + // as a whole: + points.selectAll('.point') + .call(Drawing.setPointGroupScale, 1, 1); - subplot.plot.select('.scatterlayer').selectAll('.points').selectAll('.textpoint') + points.selectAll('.textpoint') .call(Drawing.setTextPointsScale, 1, 1); } diff --git a/src/plots/ternary/ternary.js b/src/plots/ternary/ternary.js index fa9fcbfcf67..b5225ba0a02 100644 --- a/src/plots/ternary/ternary.js +++ b/src/plots/ternary/ternary.js @@ -89,7 +89,8 @@ proto.makeFramework = function() { 'grids', 'frontplot', 'zoom', - 'aaxis', 'baxis', 'caxis', 'axlines' + 'aaxis', 'baxis', 'caxis', 'axlines', + 'frontplotnoclip' ]; var toplevel = _this.plotContainer.selectAll('g.toplevel') .data(plotLayers); @@ -113,6 +114,7 @@ proto.makeFramework = function() { d3.select(this).classed(d, true); }); } + else if(d === 'frontplotnoclip') s.append('g').classed('scatterlayer', true); }); var grids = _this.plotContainer.select('.grids').selectAll('g.grid') From 58273fae20813cb1643a0279b406b94e721e4ce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 27 Jun 2017 17:31:09 -0400 Subject: [PATCH 03/10] revamp scatter/plot.js to handle plotnoclip layer logic - factor out markers/text nodes renderer out plotOne - add plotOneNoClip which draw markers, text nodes and errorbars in the plotnoclip layer - always draw lines and fills in regular (clipped) plot layer! --- src/traces/scatter/plot.js | 153 +++++++++++++++++++++++++++---------- 1 file changed, 112 insertions(+), 41 deletions(-) diff --git a/src/traces/scatter/plot.js b/src/traces/scatter/plot.js index 0a877aee4de..a944a01d222 100644 --- a/src/traces/scatter/plot.js +++ b/src/traces/scatter/plot.js @@ -21,47 +21,51 @@ var linkTraces = require('./link_traces'); var polygonTester = require('../../lib/polygon').tester; module.exports = function plot(gd, plotinfo, cdscatter, transitionOpts, makeOnCompleteCallback) { - var i, uids, selection, join, onComplete; + var i; var scatterlayer = plotinfo.plot.select('g.scatterlayer'); - // If transition config is provided, then it is only a partial replot and traces not - // updated are removed. - var isFullReplot = !transitionOpts; - var hasTransition = !!transitionOpts && transitionOpts.duration > 0; - - selection = scatterlayer.selectAll('g.trace'); - - join = selection.data(cdscatter, function(d) { return d[0].trace.uid; }); + // Sort the traces, once created, so that the ordering is preserved even when traces + // are shown and hidden. This is needed since we're not just wiping everything out + // and recreating on every update. + var uids = {}; + for(i = 0; i < cdscatter.length; i++) { + uids[cdscatter[i][0].trace.uid] = i; + } - // Append new traces: - join.enter().append('g') - .attr('class', function(d) { - return 'trace scatter trace' + d[0].trace.uid; - }) - .style('stroke-miterlimit', 2); + var join = bindData(gd, plotinfo, cdscatter, scatterlayer, uids); // After the elements are created but before they've been draw, we have to perform // this extra step of linking the traces. This allows appending of fill layers so that // the z-order of fill layers is correct. linkTraces(gd, plotinfo, cdscatter); - createFills(gd, scatterlayer); - // Sort the traces, once created, so that the ordering is preserved even when traces - // are shown and hidden. This is needed since we're not just wiping everything out - // and recreating on every update. - for(i = 0, uids = {}; i < cdscatter.length; i++) { - uids[cdscatter[i][0].trace.uid] = i; + var scatterlayerNoClip, cdscatterNoClip, joinNoClip; + + if(plotinfo.plotnoclip) { + scatterlayerNoClip = plotinfo.plotnoclip.select('g.scatterlayer'); + cdscatterNoClip = []; + + for(i = 0; i < cdscatter.length; i++) { + var cdi = cdscatter[i]; + + if(cdi[0].trace.cliponaxis === false) { + cdscatterNoClip.push(cdi); + } + } + + joinNoClip = bindData(gd, plotinfo, cdscatterNoClip, scatterlayerNoClip, uids); } - scatterlayer.selectAll('g.trace').sort(function(a, b) { - var idx1 = uids[a[0].trace.uid]; - var idx2 = uids[b[0].trace.uid]; - return idx1 > idx2 ? 1 : -1; - }); + // If transition config is provided, then it is only a partial replot and traces not + // updated are removed. + var isFullReplot = !transitionOpts; + var hasTransition = !!transitionOpts && transitionOpts.duration > 0; if(hasTransition) { + var onComplete; + if(makeOnCompleteCallback) { // If it was passed a callback to register completion, make a callback. If // this is created, then it must be executed on completion, otherwise the @@ -85,21 +89,54 @@ module.exports = function plot(gd, plotinfo, cdscatter, transitionOpts, makeOnCo scatterlayer.selectAll('g.trace').each(function(d, i) { plotOne(gd, i, plotinfo, d, cdscatter, this, transitionOpts); }); + + if(scatterlayerNoClip) { + scatterlayerNoClip.selectAll('g.trace').each(function(d, i) { + plotOneNoClip(gd, i, plotinfo, d, cdscatter, this, transitionOpts); + }); + } }); } else { scatterlayer.selectAll('g.trace').each(function(d, i) { plotOne(gd, i, plotinfo, d, cdscatter, this, transitionOpts); }); + + if(scatterlayerNoClip) { + scatterlayerNoClip.selectAll('g.trace').each(function(d, i) { + plotOneNoClip(gd, i, plotinfo, d, cdscatter, this, transitionOpts); + }); + } } if(isFullReplot) { join.exit().remove(); + if(joinNoClip) joinNoClip.exit().remove(); } // remove paths that didn't get used scatterlayer.selectAll('path:not([d])').remove(); }; +function bindData(gd, plotinfo, cdscatter, layer, uids) { + var selection = layer.selectAll('g.trace'); + var join = selection.data(cdscatter, function(d) { return d[0].trace.uid; }); + + // Append new traces: + join.enter().append('g') + .attr('class', function(d) { + return 'trace scatter trace' + d[0].trace.uid; + }) + .style('stroke-miterlimit', 2); + + layer.selectAll('g.trace').sort(function(a, b) { + var idx1 = uids[a[0].trace.uid]; + var idx2 = uids[b[0].trace.uid]; + return idx1 > idx2 ? 1 : -1; + }); + + return join; +} + function createFills(gd, scatterlayer) { var trace; @@ -142,11 +179,8 @@ function createFills(gd, scatterlayer) { } function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transitionOpts) { - var join, i; + var i; - // Since this has been reorganized and we're executing this on individual traces, - // we need to pass it the full list of cdscatter as well as this trace's index (idx) - // since it does an internal n^2 loop over comparisons with other traces: selectMarkers(gd, idx, plotinfo, cdscatter, cdscatterAll); var hasTransition = !!transitionOpts && transitionOpts.duration > 0; @@ -155,12 +189,18 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition return hasTransition ? selection.transition() : selection; } - var xa = plotinfo.xaxis, - ya = plotinfo.yaxis; + var xa = plotinfo.xaxis; + var ya = plotinfo.yaxis; + var trace = cdscatter[0].trace; + var line = trace.line; + var tr = d3.select(element); - var trace = cdscatter[0].trace, - line = trace.line, - tr = d3.select(element); + // Option passed to errorbar and marker/text renderers: + // if 'cliponaxis' is undefined in full trace at this stage, + // it means that the callee does not support `cliponaxis: false`, + // hence the renderers don't need to worry about which layer + // (e.g. plot vs plotnoclip) they're plotting in. + var clipOnAxis = trace.cliponaxis === undefined ? undefined : true; // (so error bars can find them along with bars) // error bars are at the bottom @@ -374,7 +414,29 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition trace._prevPolygons = thisPolygons; } + plotPoints(gd, tr, cdscatter, xa, ya, hasTransition, transition, clipOnAxis); +} + +function plotOneNoClip(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transitionOpts) { + var hasTransition = !!transitionOpts && transitionOpts.duration > 0; + + function transition(selection) { + return hasTransition ? selection.transition() : selection; + } + + var trace = cdscatter[0].trace; + var tr = d3.select(element); + var xa = plotinfo.xaxis; + var ya = plotinfo.yaxis; + if(trace.visible !== true) return; + + transition(tr).style('opacity', trace.opacity); + + plotPoints(gd, tr, cdscatter, xa, ya, hasTransition, transition, false); +} + +function plotPoints(gd, tr, cdscatter, xa, ya, hasTransition, transition, clipOnAxis) { function visFilter(d) { return d.filter(function(v) { return v.vis; }); } @@ -406,12 +468,18 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition markerFilter = hideFilter, textFilter = hideFilter; - if(showMarkers) { - markerFilter = (trace.marker.maxdisplayed || trace._needsCull) ? visFilter : Lib.identity; - } + if(trace.cliponaxis === clipOnAxis) { + if(showMarkers) { + markerFilter = (trace.marker.maxdisplayed || trace._needsCull) ? + visFilter : + Lib.identity; + } - if(showText) { - textFilter = (trace.marker.maxdisplayed || trace._needsCull) ? visFilter : Lib.identity; + if(showText) { + textFilter = (trace.marker.maxdisplayed || trace._needsCull) ? + visFilter : + Lib.identity; + } } // marker points @@ -501,7 +569,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition var pointSelection = tr.selectAll('.points'); // Join with new data - join = pointSelection.data([cdscatter]); + var join = pointSelection.data([cdscatter]); // Transition existing, but don't defer this to an async .transition since // there's no timing involved: @@ -514,6 +582,9 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition join.exit().remove(); } +// Since this has been reorganized and we're executing this on individual traces, +// we need to pass it the full list of cdscatter as well as this trace's index (idx) +// since it does an internal n^2 loop over comparisons with other traces: function selectMarkers(gd, idx, plotinfo, cdscatter, cdscatterAll) { var xa = plotinfo.xaxis, ya = plotinfo.yaxis, From 968adb5b6f4947391a2498d373cd8fdca96f7c22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 27 Jun 2017 17:24:11 -0400 Subject: [PATCH 04/10] add ax.isWithinRange helper method - use in Drawing.translatePoint to clear out-of-range markers/text nodes when `cliponaxis: false` --- src/components/drawing/index.js | 11 +++++++---- src/plots/cartesian/set_convert.js | 18 +++++++++++++++--- src/traces/box/plot.js | 2 +- src/traces/scatter/plot.js | 4 ++-- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/components/drawing/index.js b/src/components/drawing/index.js index c2e2540ef97..ec4c5957b30 100644 --- a/src/components/drawing/index.js +++ b/src/components/drawing/index.js @@ -62,17 +62,20 @@ drawing.setRect = function(s, x, y, w, h) { * @param {sel} sel : d3 selction of node to translate * @param {object} xa : corresponding full xaxis object * @param {object} ya : corresponding full yaxis object + * @param {object} trace : corresponding full trace object * * @return {boolean} : * true if selection got translated * false if selection could not get translated */ -drawing.translatePoint = function(d, sel, xa, ya) { +drawing.translatePoint = function(d, sel, xa, ya, trace) { // put xp and yp into d if pixel scaling is already done - var x = d.xp || xa.c2p(d.x), - y = d.yp || ya.c2p(d.y); + var x = d.xp = xa.c2p(d.x); + var y = d.yp = ya.c2p(d.y); - if(isNumeric(x) && isNumeric(y) && sel.node()) { + if(isNumeric(x) && isNumeric(y) && sel.node() && + (trace.cliponaxis !== false || xa.isPtWithinRange(d) && ya.isPtWithinRange(d)) + ) { // for multiline text this works better if(sel.node().nodeName === 'text') { sel.attr('x', x).attr('y', y); diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js index 5b885f80503..c72492a4d0e 100644 --- a/src/plots/cartesian/set_convert.js +++ b/src/plots/cartesian/set_convert.js @@ -58,6 +58,8 @@ function fromLog(v) { module.exports = function setConvert(ax, fullLayout) { fullLayout = fullLayout || {}; + var axLetter = (ax._id || 'x').charAt(0); + // clipMult: how many axis lengths past the edge do we render? // for panning, 1-2 would suffice, but for zooming more is nice. // also, clipping can affect the direction of lines off the edge... @@ -277,7 +279,6 @@ module.exports = function setConvert(ax, fullLayout) { ax.cleanRange = function(rangeAttr) { if(!rangeAttr) rangeAttr = 'range'; var range = Lib.nestedProperty(ax, rangeAttr).get(), - axLetter = (ax._id || 'x').charAt(0), i, dflt; if(ax.type === 'date') dflt = Lib.dfltRange(ax.calendar); @@ -341,8 +342,7 @@ module.exports = function setConvert(ax, fullLayout) { // set scaling to pixels ax.setScale = function(usePrivateRange) { - var gs = fullLayout._size, - axLetter = ax._id.charAt(0); + var gs = fullLayout._size; // TODO cleaner way to handle this case if(!ax._categories) ax._categories = []; @@ -435,6 +435,18 @@ module.exports = function setConvert(ax, fullLayout) { ); }; + if(axLetter === 'x') { + ax.isPtWithinRange = function(d) { + var x = d.x; + return x >= ax.range[0] && x <= ax.range[1]; + }; + } else { + ax.isPtWithinRange = function(d) { + var y = d.y; + return y >= ax.range[0] && y <= ax.range[1]; + }; + } + // for autoranging: arrays of objects: // {val: axis value, pad: pixel padding} // on the low and high sides diff --git a/src/traces/box/plot.js b/src/traces/box/plot.js index f7e5b58ae7c..df618b239f6 100644 --- a/src/traces/box/plot.js +++ b/src/traces/box/plot.js @@ -204,7 +204,7 @@ module.exports = function plot(gd, plotinfo, cdbox) { }); }) .enter().append('path') - .call(Drawing.translatePoints, xa, ya); + .call(Drawing.translatePoints, xa, ya, trace); } // draw mean (and stdev diamond) if desired if(trace.boxmean) { diff --git a/src/traces/scatter/plot.js b/src/traces/scatter/plot.js index a944a01d222..40f429bb64e 100644 --- a/src/traces/scatter/plot.js +++ b/src/traces/scatter/plot.js @@ -508,7 +508,7 @@ function plotPoints(gd, tr, cdscatter, xa, ya, hasTransition, transition, clipOn join.each(function(d) { var el = d3.select(this); var sel = transition(el); - hasNode = Drawing.translatePoint(d, sel, xa, ya); + hasNode = Drawing.translatePoint(d, sel, xa, ya, trace); if(hasNode) { Drawing.singlePointStyle(d, sel, trace, markerScale, lineScale, gd); @@ -542,7 +542,7 @@ function plotPoints(gd, tr, cdscatter, xa, ya, hasTransition, transition, clipOn join.each(function(d) { var g = d3.select(this); var sel = transition(g.select('text')); - hasNode = Drawing.translatePoint(d, sel, xa, ya); + hasNode = Drawing.translatePoint(d, sel, xa, ya, trace); if(!hasNode) g.remove(); }); From 15534fbe3ecc3c74d9569d4548ecbb389df10825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 27 Jun 2017 17:25:30 -0400 Subject: [PATCH 05/10] implement `cliponaxis: false` for scatterternary - mock plotinfo.plotnoclip before calling scatter/plot.js - override isPtWithinRange methods for ternary --- src/plots/ternary/ternary.js | 11 +++++++++++ src/traces/scatterternary/plot.js | 7 ++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/plots/ternary/ternary.js b/src/plots/ternary/ternary.js index b5225ba0a02..32d3818376f 100644 --- a/src/plots/ternary/ternary.js +++ b/src/plots/ternary/ternary.js @@ -182,6 +182,16 @@ proto.adjustLayout = function(ternaryLayout, graphSize) { }; setConvert(_this.xaxis, _this.graphDiv._fullLayout); _this.xaxis.setScale(); + _this.xaxis.isPtWithinRange = function(d) { + return ( + d.a >= _this.aaxis.range[0] && + d.a <= _this.aaxis.range[1] && + d.b >= _this.baxis.range[1] && + d.b <= _this.baxis.range[0] && + d.c >= _this.caxis.range[1] && + d.c <= _this.caxis.range[0] + ); + }; _this.yaxis = { type: 'linear', @@ -194,6 +204,7 @@ proto.adjustLayout = function(ternaryLayout, graphSize) { }; setConvert(_this.yaxis, _this.graphDiv._fullLayout); _this.yaxis.setScale(); + _this.yaxis.isPtWithinRange = function() { return true; }; // set up the modified axes for tick drawing var yDomain0 = _this.yaxis.domain[0]; diff --git a/src/traces/scatterternary/plot.js b/src/traces/scatterternary/plot.js index 0ecfaa25601..6452fd98f5c 100644 --- a/src/traces/scatterternary/plot.js +++ b/src/traces/scatterternary/plot.js @@ -15,14 +15,15 @@ var scatterPlot = require('../scatter/plot'); module.exports = function plot(ternary, moduleCalcData) { var plotContainer = ternary.plotContainer; - // remove all nodes inside the scatter layer - plotContainer.select('.scatterlayer').selectAll('*').remove(); + // remove all nodes inside the scatter layers + plotContainer.selectAll('.scatterlayer').selectAll('*').remove(); // mimic cartesian plotinfo var plotinfo = { xaxis: ternary.xaxis, yaxis: ternary.yaxis, - plot: plotContainer + plot: plotContainer.select('.frontplot'), + plotnoclip: plotContainer.select('.frontplotnoclip') }; // add ref to ternary subplot object in fullData traces From 431b53300a945514d608cc1eeaf032ee6de4c5e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 27 Jun 2017 17:26:19 -0400 Subject: [PATCH 06/10] implement `cliponaxis: false` for errorbars --- src/components/errorbars/plot.js | 41 ++++++++++++++++++-------------- src/traces/scatter/plot.js | 4 +++- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/components/errorbars/plot.js b/src/components/errorbars/plot.js index 84bc05504bf..5571afc7fc5 100644 --- a/src/components/errorbars/plot.js +++ b/src/components/errorbars/plot.js @@ -14,22 +14,24 @@ var isNumeric = require('fast-isnumeric'); var subTypes = require('../../traces/scatter/subtypes'); -module.exports = function plot(traces, plotinfo, transitionOpts) { +module.exports = function plot(traces, plotinfo, transitionOpts, clipOnAxis) { var isNew; - var xa = plotinfo.xaxis, - ya = plotinfo.yaxis; + var xa = plotinfo.xaxis; + var ya = plotinfo.yaxis; var hasAnimation = transitionOpts && transitionOpts.duration > 0; traces.each(function(d) { - var trace = d[0].trace, - // || {} is in case the trace (specifically scatterternary) - // doesn't support error bars at all, but does go through - // the scatter.plot mechanics, which calls ErrorBars.plot - // internally - xObj = trace.error_x || {}, - yObj = trace.error_y || {}; + var tr = d3.select(this); + var trace = d[0].trace; + + // || {} is in case the trace (specifically scatterternary) + // doesn't support error bars at all, but does go through + // the scatter.plot mechanics, which calls ErrorBars.plot + // internally + var xObj = trace.error_x || {}; + var yObj = trace.error_y || {}; var keyFunc; @@ -44,8 +46,8 @@ module.exports = function plot(traces, plotinfo, transitionOpts) { if(!yObj.visible && !xObj.visible) return; - var errorbars = d3.select(this).selectAll('g.errorbar') - .data(d, keyFunc); + var errorbars = tr.selectAll('g.errorbar') + .data(trace.cliponaxis === clipOnAxis ? d : [], keyFunc); errorbars.exit().remove(); @@ -66,7 +68,7 @@ module.exports = function plot(traces, plotinfo, transitionOpts) { if(sparse && !d.vis) return; - var path; + var path, yerror, xerror; if(yObj.visible && isNumeric(coords.x) && isNumeric(coords.yh) && @@ -77,11 +79,9 @@ module.exports = function plot(traces, plotinfo, transitionOpts) { coords.yh + 'h' + (2 * yw) + // hat 'm-' + yw + ',0V' + coords.ys; // bar - if(!coords.noYS) path += 'm-' + yw + ',0h' + (2 * yw); // shoe - var yerror = errorbar.select('path.yerror'); - + yerror = errorbar.select('path.yerror'); isNew = !yerror.size(); if(isNew) { @@ -108,8 +108,7 @@ module.exports = function plot(traces, plotinfo, transitionOpts) { if(!coords.noXS) path += 'm0,-' + xw + 'v' + (2 * xw); // shoe - var xerror = errorbar.select('path.xerror'); - + xerror = errorbar.select('path.xerror'); isNew = !xerror.size(); if(isNew) { @@ -124,6 +123,12 @@ module.exports = function plot(traces, plotinfo, transitionOpts) { xerror.attr('d', path); } + + if(trace.cliponaxis === false && + !(xa.isPtWithinRange(d) && ya.isPtWithinRange(d))) { + yerror.remove(); + xerror.remove(); + } }); }); }; diff --git a/src/traces/scatter/plot.js b/src/traces/scatter/plot.js index 40f429bb64e..112a8646c8a 100644 --- a/src/traces/scatter/plot.js +++ b/src/traces/scatter/plot.js @@ -204,7 +204,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition // (so error bars can find them along with bars) // error bars are at the bottom - tr.call(ErrorBars.plot, plotinfo, transitionOpts); + tr.call(ErrorBars.plot, plotinfo, transitionOpts, clipOnAxis); if(trace.visible !== true) return; @@ -429,6 +429,8 @@ function plotOneNoClip(gd, idx, plotinfo, cdscatter, cdscatterAll, element, tran var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; + tr.call(ErrorBars.plot, plotinfo, transitionOpts, false); + if(trace.visible !== true) return; transition(tr).style('opacity', trace.opacity); From ecf65dfa5ab54812ca36a12a4695dd1968822319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 27 Jun 2017 17:26:47 -0400 Subject: [PATCH 07/10] add handler for 'doplot' editType values in restyle --- src/plot_api/plot_api.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/plot_api/plot_api.js b/src/plot_api/plot_api.js index c067d798f58..33ae5bfd865 100644 --- a/src/plot_api/plot_api.js +++ b/src/plot_api/plot_api.js @@ -1635,8 +1635,13 @@ function _restyle(gd, aobj, _traces) { } // some attributes declare an 'editType' flaglist - if(valObject.editType === 'docalc') { - flags.docalc = true; + switch(valObject.editType) { + case 'docalc': + flags.docalc = true; + break; + case 'doplot': + flags.doplot = true; + break; } // all the other ones, just modify that one attribute From 810a2d49f91cdbb4e5d6a4e44366384a3c71ad70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 27 Jun 2017 17:28:17 -0400 Subject: [PATCH 08/10] add cliponaxis false mock --- test/image/baselines/cliponaxis_false.png | Bin 0 -> 29529 bytes test/image/mocks/cliponaxis_false.json | 39 ++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 test/image/baselines/cliponaxis_false.png create mode 100644 test/image/mocks/cliponaxis_false.json diff --git a/test/image/baselines/cliponaxis_false.png b/test/image/baselines/cliponaxis_false.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a63f2c2f7b58ed3ac14bb8eebf6c9800c2687d GIT binary patch literal 29529 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 DWc-}8 literal 0 HcmV?d00001 diff --git a/test/image/mocks/cliponaxis_false.json b/test/image/mocks/cliponaxis_false.json new file mode 100644 index 00000000000..15aaab4d57d --- /dev/null +++ b/test/image/mocks/cliponaxis_false.json @@ -0,0 +1,39 @@ +{ + "data": [ + { + "mode": "markers+text", + "x": [1, 1, 2, 3, 3, 2], + "y": [2, 1, 1, 1, 2, 2], + "marker": { + "size": [50, 20, 40, 25, 15, 40] + }, + "text": "not
clipped", + "textposition": ["left", "left", "bottom", "right", "right", "top"], + "error_y": { + "array": [0.1, 0.2, 0.3, 0.1, 0.3, 0.2], + "arrayminus": [0.1, 0.2, 0.1, 0.1, 0.1, 0.2] + }, + "error_x": { + "array": [0.1, 0.2, 0.3, 0.1, 0.1, 0.2], + "arrayminus": [0.1, 0.2, 0.1, 0.1, 0.1, 0.2] + }, + "cliponaxis": false + } + ], + "layout": { + "xaxis": { + "range": [1, 3], + "showline": true, + "linewidth": 2, + "mirror": "all" + }, + "yaxis": { + "range": [1, 2], + "showline": true, + "linewidth": 2, + "mirror": "all" + }, + "dragmode": "pan", + "hovermode": "closest" + } +} From 41c0e83337af48358e8d5975d119e1462ca8edfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 27 Jun 2017 17:28:46 -0400 Subject: [PATCH 09/10] show off `cliponaxis: false` in `ternary_markers` mock --- test/image/baselines/ternary_markers.png | Bin 44884 -> 52006 bytes test/image/mocks/ternary_markers.json | 21 +++++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/test/image/baselines/ternary_markers.png b/test/image/baselines/ternary_markers.png index f131b3266f58e6ac6c0476c1bc5704f99f7bc7bc..7dc7f72f9eadbbd8a4e96b451fa6766a11c9426a 100644 GIT binary patch literal 52006 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

TMjmI5J?rRst)o(7qOaY2bzUvc(# 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 literal 44884 zcmeFZWn7ir)-|q3OGtN!(hXA5QX(y}kuK@(PU#YqZV*MfLmJ$K2uOE>Al)7Rb$Rad zob&#F@8|c^^KIYWn{};gt-0nLbBwWexU!-QCORqly?ggCWnW6ZzIP9y>E6Bj9jM6A zzj%_`-MdG9PgYV~&0TMM&P|7)dm3dw%OC%t0i4ZsyV)p~_H$~o`Ll}eq>UAk&BlAe zLj^;Uczt8v=Lra;;PXiM1k6VHSH7m+k7;&33Wo}N`Cbh+hc|K$dYkR7iwvY>(9g}3 zx7965-A7mUN5Id%hr}RuKN|g$aYxZm%33-2kAMIBr+avMEvWx|1Nz5QLW7Q?KY!L1 z|LaT1`-c?&8sqPu{i+6kq@cu(BJ)4PFtoi(+WY&Ie+}&a87X<+($iCb|KAS+!_hT) zqx{#X&sf{u!A3^<+ExB%is&3mYl8oo97DDR_@mTJJ*=32zXTW#jeX%i&lS6`@Q`C^ z?D*Kx{=Z&A-u(jWKQE4MuH}zb_W4UvP~Ly0XwcE;_Mhh}i;W=2yYmP)laoVB_0Oci z(meRDQU7;o{qH)^05`0oQ%&GLwZBv?t?t=mjtGsmv3R*RCUTN)gpHU@Bbr4J4a z(Urwm5zbyv=K3hHS6dt~`dS|)XmxN|kjv6GvFkTWe`$F#RG_EeY;hGme{)y0MQy3U z7;F7T_ry058#=|xMIhhQ3}CF}-a|UZHR!mq4L*A_`LKHT`J)p{b@;EAj1w;J8#;2< z=g07L*-quAutvSXLsRGwTSD3F_mrVEezyMrIN^6Q!~4&kVWe=smApK5eSQ^Ac1Cdu zU!CeJH`qj_Yx3+p0DmU71HL&XA`umffd5ODI{)3-ast`8(}-)>oi`pORvr12N|^?M z_n8YfzrgdZI;sijnMD0;-6D3}lbMn`;)}h+pWbI#%bUW^H0VS>W9M~Sx_^lB8BYY{ zxu0xec47PpXCipDk~BtUzrP{NlFo};G+`GUyJzt(L|Epu_>FRdH>0!p4S`NNH|@sO zkCS`WGft>q2K72V{4%p2NSCF{HY$={3cOg}Q?QhiaJ=&LQOf8HDQU#97bG^K<%^8u zenrS0#V%s&Uzs0aeEji(-}R7XzQrevI*~KTtE0+OD&x05ACz?e&xL)-wj}KQ6C2Nr zP3pF(VYOvko`id`t7K-f;SLp@peOVVUT9nUyx!?s^Nuv0$cNT8){k+=JTuizwEIOb zP;CV&d*8X;+_`3pwaoUU3DT2J6a}-C4%B<^5NednAk?K#l{^0?{v?;g=G#<7Sn^{3 z=8+l`3|*k|ZG!CHZyPThO3HwQhjg7|v{g;8iFYvKsH_&^guW!{5=#ODW8Yp)#eFV^`Gac9!`yhwx}V${d^*h6$B*{9tg@xG(&z6l!gf4 z5Hw(I4zakM!%{EsB{XWD2erScAtB}SyE6*zjZKcxWYsA@?YW0j>_nCYzY^( z&UWnI(rT!q#H5DY&dub#$$QR-C3HOHRJ}b)MWMyleYW8J8P>rZKWXEIWt>?Di|}$v z*(W{SJzxa!eFMd}s7%y*5Z~g|U*EYM*ln%0jMd0}c`Q@Q60VifcjMDHRsYj*t( zp9retD5zQD5#i}EUr}L(%H3xM>B~y$Lx0X|u|8<$9lqdUY>we5kdD53c1;=7)i*W} z&Ai@|bp}_uTYge!*J>S6y3?Xy-#V$d|8_>NCyPF*7gx{0WSVHlhpd#IiE*WL}gt1^qOH&l8uy|tFFj#qi_mQI*esSi}TAW>5bbJw|H7QI^_PDQ}GHKBu=O6MMO2h zvx}Y*WTUOl(Di+$hK?)sMv2w;r8F21faH zGyWBhJOUuU?79&?p&#sAoTnJ7_g!wKHb0qLss|Ni2Lf@ozXYeI5uBPD!8&phq~cf9 z`LC>&(`Re^?joI%N|)D)Ccq+)ZH^a5jkAg$Sx%wZW7<{ zw%b>y5yu=%kcQ^9hKb;!(+k4%N5S;pU8BbJ{b*nwMKHE6Zs4%n^4&BN1-R`lUqmKV zI;QdSX%^c?=Hl(?ue0fO#wTpy;Cn0WKBkka;lDHO*ODMu;; z-vvvBZY~4*0oUL0Pjc=du_%i@ZG0f3B+-STSfE+^^!l288Pr_oy-D<}XN6V)PmFq? z7GRVfG%G$%9bq6?nQ_m(`q<7hpND=mMyA&N=Ipqd8#r4GD$*Ez^sfe+hs?u^%FuI? zrNMJ7bf%b~o+1PB^UoV~jZmw*xg@k*QMUuqCc2-}X?7w~X@psuql9(<-7ts+d;*Qr zVL#Muy$?ai6*_Fs^VQ^Vk-SE?)8VIA%<5*?yGZ8xCi)|ZEiOc*(hAy(M9@f0RIbMk zsrn-jvh6RgF<0;X3Epe53`y)4ReY8TZ!PJBGxKo_desNVep~|I!hb0U%A$ErY(8 z8_oJ_rQ@w}LMlHs!Iq2np|JBt7l=7ieheL@Olv89zS zTIR(reYqq?U22DSYA`nPDI5g7CPQb)uEoqWZoUc)Q)%I$LBL3q=7V=Z_vZM-|FpLF?86^DFgGe%7j?8O(V`HbjB?|$iv z?Q&n;_cN?0wR^%C4yC)GJiUjHO}%<6U=6L_CRFuX1Pmp?!$=S%jkGxYDBpC{b!Q)h z_$DR4^92ha@u?qCln1_U{6tT3WvlAP0$6G+-5XK4--=M=hL2maa+S z(mBxSw|p;M({gpN)QAi%s^m7BEkFXMio`T`K6f~(<&Nzp_1{d!*$w6aS^yLCgvv)+ z6x1zf;et74aGk+S>>cGDcp^){t4KMlj z&QRgez2lu}-gXpoqcjP4CGF5{Bl}9XBseX`U#l^!1c>PRy?=6LyuzD; zA4|OdK`7CBCR0N5XhQVdW!Jrat%p$5vka|DCGVAo$LHOvq?d)UR~hh6I5#X}5s#tV zTdo5lB2mySDjl3xG3thQuxG4_+R1l)q+tm7B7U6-XK#Y_Ip>l&c@a`pEw*sDE9o`{W-QJ?) zs+AXfPaLKlxMqFN&ewAHn;TEM^D~r|G|NDR*~;*W0n_KmX$z83T4ls)9UzJI_LzOW z&3HclzQqH2^68h&s{l_rS)>u2^hDS#yFn2ugx?xZX{D(#RfyS|< zJ`m3e<+S$*52O{OK3ry+PybS7kIT67F5mJ8T?1M1gi})rh;L96LFd`W_YR8nK!lky z@~)OAEy=v5+2SQwq}&vkRxp_=X%`I7Ozgk)S^3V zt#T2l`a%3PhTup}PEC=HB2)dVQoIAxzmNv+jIaFC06wjN>T^nd<5kU92v2zkqlqly zhWc!koqf=MgYUS50+wWl0PPYI;_fV__{44A+K*!XjP_)?^l@s9h@=7X$ZHQLk`eqY zuy){U|EB90o^XJGtS9P;`&eBGpXO-y_lL00p zx%mChk>>TxbCxVY@wn4v(m#`Ch`yV@(8rh()T?!Q|8fJ<;QVXNL^(Bq^;t$}4w09P z93;yV-?5CSZNBS4v!47$cJu`U_J8|&F2dbR3${_P+wy)(L@n9GeHQwDmO0|TjNR*$<8CcH_U^p1Xmva1kNp3`4hesJZPWopDgks z$E4E1^fI{3xW4ur5wWkmIy`m=Qm$6M|KSwg^>=U;FgT%Ef-%@Rc{Yw8ULv4=KNi*C z?xq#d6ZAS@>cZT48?!r!0zQ$D$!sFW`abRlGk`H@(r6jly|{9 z;yDjfT8+Nz-^CmTm_h3jgUc7Z`Zj{DFJ*L$P0Ne^LV};uXB8iAHCtTq68lN5#(k$q zpa;kifhOb+ch5PPS`~WnLem3SDT={p_O9s;Uul)Y2w{7k=3@vhrydU~{ymAg;3UeW z^K{AINB;V-{=g}AfC!X>kolVt=W&92I$Jv zC5Wc%dcjd7+}Uz7cEe1FQ+t)_ek)^J6B}o$jnATkGN3Y3jt`|OF4d?H0Gp@=$ieK4 zwyT33-;TA9jV3}(AQCGm4BT9*V|Q300- zGDOXbVS+#!<9HYq0FF&Q)bSs#lrQ{NlFZZ*P$yYwejmE=%c}l5nGH6uT^JQ74yB5h zR$xvR!Vk8yz~7X#0ovd#?o?^QH<%I(uq<)u*t>HoDt(|Qd|azg&u=E(`Fu>J-atfZ z#>^O6gP%}-)EV9m1#8X_03nUv9SM$W&j5-ojJW|-z>)TwU+gJB!k=g=*mQ2`0Upkl zeV~Lm*ANN@-IvY#cK%g@`IC~}mzPx5f74q7*oRcP)Elq_gtYrdVT|XWR4AU6>i5ws z&-*Mg)b0pGy}=71rr0~t7Jt-T9$rEY=(mqM;eLF8C|Pyw3pmhgUfNhRa2B-&@0acW z-{U>m-`fr1-&lc=wx;|~nqQ!o&(1U>@Sd*ERB_mw^g?XJB8UGx2*RsAI+tZYj!t2# z^N=T>C*tMhl|JbVg`ziE4jjIQPgB^S{@@_Q#i^K2I1x)9?}c#DM!u2!=^(BL&>o&C zTYDkW2SdB8`NhdH9qhKYp%D|oH&yjd&DR0&+z@aVYOx-FBQ zFBj*Z8~>?3XT_Fw>H60+HNiB)1Ev6cGY~*nUMZ#w>h4SE2RtY%{r(w^&*5>3PL3YG z%Tx5dG*HUK zWJ%9ysoU=^tB0{ZjQkuOuT8?H-xv&lT5gLO&l`(@@o|k>dd1*JXnX#d6!?M!G-F~O z51<6|1VjXBK(`E7{TtUrFbRXD9bDZhk^yX^9zXSCdr@)T*jbQLoCd6ZZJk59>4 z8-F)Bsd;>o8Wj(Z%$DiiTXkA?4jGz%_@1@s;q$s1X~IR#t25DhS8i0OD%`}`q$bNl zT`LEq>F;GHdE|vzPXDaNcdrZ2yt*==cJZGwN%&vuH zl+KMI#_OWfVInfAZ2wAMy8?8%piD%QCiLYkDD5mRr_17LkOO>^?E{Y6be3@pXcAsZ z8H}`g+5f&KxCls0ELE95QmH6LX}PRciSN_`{dDzt6PlyxAnD!uV256|`uhFJ3SZgy zqB=wzdLl=c3jEt6UqUnH8ikww;z`X^C^x5ZcF6(gz(oCO zBZAp>urN2eD4SEFYob`4&svKIrlIO}av6PXudt0|JF=`w5Eb?qN?5=2!RpmIHQ5b%?MgX7(7Gp8*i~x$TXMa!Rwi_arE<_zOWO;K!AD<7p z89?rXP#iC>sc9cp_Y+Tl#$na*9$yLX(fX+CZ4Q#98lxRSQ}@lla?%3dhVy{^QEjtI zrMn?rqsD=${d@d!EU?kzoP*@FNGz`n2I9xU!lR|`c6U}*h!WZ*FLcVX8keQpY{C-y zPFe^2Baa#hbRBZV`V?Uh2JY`5-t%ny@@Y`t=BWjPFZ0-5wy_kwW-!1yc+#BB9 zZxlQ+FVf6&U|$U0D+Cf--5mvN)2AqWg95tP~Kj`TVGt?-2u9S1tcYa z_UwcCSmj{3Y=Lewt`_edKTi7!eGZfrpWpsMSbIfS2T?uazj|6_tUYLA|)*h5TWiMPgn@;Na;oi8S_R0MH!z;>zas*`WeSvVu(i zo>=&83roOEiBF&83qbt8t8${lXWoth?AlV|lQaSb1Z+y-fb)lvJ)JV{x7W13zIJ1? zO!pwlt*sCOHYdkU`}oRr{x65S6m`RLgCAzUAi>@Sso!u=-(a z%vX2$ZaG_-$T|cHW=rtMLRU*-Vk8C*gHg4Q%<3;Pe>`%#Iqfzj7yc6qXs{l{^SzSB z_}O9QA}zS2mpV#pO2B1J(eejrm$yzvaBgi47(UZ`*vRDlx*&%?o2=f`=X3RNjrR{^ z6pc2M@267o{T0rs6(J=%>>c^izr6rRAUo6`=+|ro;XLqtv38ihY}^FYlgrrjKpQ`{ zuARlJjcGsmc&d_cpH?Gv{@v-CI|kQn!N8Q2yO~>RjmX%n=dmF*MKnI1Hon;eBm}{8 zC^5YW+x6I2?_}@dR1X|Fr_G166D`-X0w5%z{0f}@*YVZ>3MlJ{S(~|EY}Q=ARIpZY zKYoh8yowAM6~GW`pVBi0g!>WFvxVL19L{*oHV_5Ua!dF55yGskS*Fj9U))jds8m?@ zB0A`O^HjZc0ub%d!Qy=y2}+vHHw@O~6icgmkFacQBVzl~F(XPamLs(1qPMPoUi2k5 z*wbpTCFAdz4Af5&L50H!7yx*_@Lv5D`X2S}M%1KH54^|pI=~%B;mR=`J3O!GhgBjZ z*GvAdp7A7OCJ$O0J9k6k#iGedfE#D3r(89Ovt{;g_*7F(G@ucY5&1{gc<( zac>%4dRL7XJ($=WJC4xBys}lKr=}UpDd1&u$uOTrNeqn+YT`8|?F|c5)D>i^X+xf$5Z$ z>WF_23O#I%Oqg%l@e8}-=80mhA^yH;`v+IbWGLoSDPYRhew=~Ec=apc-z;vf4)#LB zED@48Kec^qXlyglbQUAUW$Xgs4bcuCbqoJ2dx4KT8p4+J*(=%YaMul#ax zbV@E6$UF^7JZudLdz*oQKAz%FE8SqXSaI9GcYYBLT5sF0dEVO`D~vBVo7}gb)osu! zJvA+X!E7CruV^*giqsfNMg%&I66%yDsBpc>3r-I}76)bJ5@ModBF{iMAf)|eSI;M6 z^%^^RbL^wTf^H3|9fIAHb)u{lcth1;tC`(2zpr1ZCXS24z&o1V3%qD<5ph>%$))y9 zk%2AKMT(Rrzw;a|#}9Sui=5X$88%fSw^TXmg9vZ*4JH8RVT|*@g`)Y<|K(x~xhT?} z%FW7(ugecJ3gMCL-mwz z7G8m7*8>QfqDt?e?SXcT{75j;lxi#>TH$%~V>n4S2^W7Z=(hexK>shU{+JLI6Z z@Wa}xw}h~D#KEn~4ra=FpEHr&Ilp&6T79Di6bLu?59ffUh7(sj>~|twY_P6%MaqyD zNJk|9un*bNpbA)~6Ld)ed6k93cADnG$+zz}6}{z?A6yMU){#-5Dt{Val#VI+Ktw3C>Hj&h_dSM)_Y+=!VQ1)4|Dutpf zdA_N+XkPPrp3Wa!^8*iKiL^y0sIyah0*(WZYP%Sif&@}WW~AbGyy8T+<9)G&nG~E>o%mvl@rvmOD6$S-T_7BO;4eKV}07z-EDv7i7;6 zi+v}WH-0WVOdy^2sGH&h@xSi>Y9M|tge`MGg9NE#K{HC5;wnwKcVUc&E22c}KO<`U zyP#D_)&^&$0X{_qmb$*}T7R5+Q;|cYE?TkDrou6;Mo&297oAJ^r}Lo!-7u_&a>v~? zD!y93D0ZXC9((b^;KoW{#pA3)i?8J98hUkyVz3w{H?>o)nS5CFDzJt)hc?D8yzA6u(> z%B6%04?V)#X3l8Ql1jNrun@UZ>6chn21ZrF9{>kv3Gy~ zmom?^_+*Q3=`gtxP0#0;&BV}p!8;SG6!9RnCXAYBgO5{4kgRj^V{QL!RS4bA%-ONP z>Ojf^q(c(dt`d><@OQlSy9g4Vom$=6E$FtAvWI5EqC(!FOAb*?zAvoHmhNkr3Wf&2kpOOUZiu#5Y67(hKUP#(R5U2}kYky?XoBVV$ zm&!#^frG;^`2`k#6$9tRI#8MV620|Gx1{en@%SiX&ZP^T@Iz|ZJn7Om@9rx}#C zKLPo9{#l+`HyEE20RXoU?Ep89COos-ctbF+etU~;gUt;ZecdNs<705bkJb82*M=n~zxs$TXy?m>0FYz+6mZJYM zJ~ZG=uyVKagMiFHq7+7xYNV8?aQ>~iI+!N6zW%ZPKtq}1MV7D(09zl;*;L4uQ7c2W zYv~%@&KBlES5Zu)W{>FIPye)cIt* z<96v_M*arWqp;?m4?LZfy=Sfe%2A8}hNiwwvH{p5;$eEDJLbGoVsC=9px}tFP@>NM zV{FP5Pch|q+NfxXeLro|+10NP_wA{v7BOw*d6A>iBj_-NhN^SE^j;Z(;qM`Rd;}DlcQiBLqdXh+Kqi5DEArW& zcZd0M$xWiV&mqSV@C2xIDSfqSoDUFEJi?-4>*}!!tD;bg9}PY(EKWJ{JU{=c<8b%(lz+8v#dM%_>Mw?F29dL=&;>bd zogT`k)?n-+9cC*;D)rCRDBfJ0XG-S;Uc9G=DQ4_WoP74erd;~j&{y!Glc20rPfD`q zfn;cKdsq8?#a*Ph3Q4puR%{EG641>d*ewK24C(^@_7o5e%3}0jyPtC&0AdLcypnHb z{t=`#j{R)If_;XG=6bP*rI2cZ!8I4pci$!){= z^Fhj=N2jj~;BNgo4V2VMtB+vOOlvA7uiyNO>-2X4JbF#(#cy*)1C_s$LCco`!{IPr zAd{^X@$q}lVq;puLi2)}RSrUAB#riRRtofsn7B-xxe8gGgtmdFs}RN(%AUrf_Nh^# z`?RQ#UzCRqb2`yG^W>Nq=}`w#iSw>5@}W*vP()!=ei~BsZ&|$ z_*YceRosQKGkrXHFXKw$D2$2O$=O0Ezovg4366K|bLLzer8+w+V)u#At0~rmB z2Hv77!B+8&StIOdz5i{`ip8n?sDj6Wl25aq`~d0-aQ ztr%Jo&H6c-BH7gVEmQ^8pp9x0F#eAJtEnyd>%+Gvm3A%WMsdc#E`$Xr^HD(yg5E2bl-ew{Amexw{M4cy%9m;*y3`5ta6QpdHR1vC;0B zsk5uF88mF*O79Q!E8QFS!UQkaE6}&heG${45ZMxd!X>^tqq= z=TQ_pi=BgAb{6e&li%hUFQxzs#%nVZdG$D!W4_4EdzkF>8VNZnl}oVJN0bL6pn^12fLw#btYZcinPDl1G3iR z+PYbQnSdWHp?9BC)UQ~x@r|vUvUbWJHIzOwkTjnGheMj_@pdv$8}-G=g~v*}Ieun7 z8!d><9R0);A=Bi3flknuD9_1qkdw+EDE~E=z`|yKH&4Q@Sc_kv{fG5yhhQ1WZ1peq zC!0Jed4UJ2Z^AlC$x|vfjoHjK>?oPfZU)66P@O^nJ) zU)oBI@x~q3THkW=TF=p*IY#=ivsDbfnGhaI?N~JcX*3UHR8oZ=Wbn}#38KIO^Sc_c z7)r%JGUKWx>c_r{gJ6r&S*0~hH4~wbBQXjfqco*77aOEK3)%Q*`U(Pzf ze7cSMmbjASq2GtGvG0^~d#xApL-mt@Ycj|H5VFK+UceH);FZDT`BZ^=34(~7mcF_J zBSDmAdw-lT^X$>O>@SnW46l0kwUFN$ZY#(QF6;Nng_mM`pQy57HXjb&0l7?A%kKs) zCgV8tEL|Tc{HZKu*SCK#U-hFvb-GvyEY?ZCfQUzf86;7YS>D5U z2vB#Nkx^p({5c&mWc5o}I8&lluGHtL9y6PK>OEEb7?840rtGmOjymI3zO02>(M(Zr zF4C)&XiD4K@%#NDmEQ6wEhFvfCkD#}rC{|5Zw^v)%?zXN+y)%utVA;1Jx`wGl`pI#THgBgE_HS*T`u59hGFPErrRbDWY88g!Db{(hh45JP)JLHH&q=8{KZ_u$D0MQa z+vN`{NM^wJGuQjE$vO=H6EUclxiA71jS(F<>`@nd#xQbCieK7R)j#h`nE##S{WNQ) zcK!Wz{YKK%3U2ii5sgCK=6E5clg_@o4g$y(WuxsIuq-uOVu@V3fF78UL4i(C9y2yq z-`niU{ix{nnyTs2Et;LmS{-k&9l#$8(7o{~Tuccdjk4|^j#+t+mBto(^OjGj)p5^7Jj@=7qzsbNo@0;J4r&I!r4`sGRm(w=j`5*$v~1|M0~g+$(sZPoRBcLV6*9QbiADzsjsl}+w3;{yBb z4lr0R;ONVfaX&JuIU3vI)2LV`!odj_4vooE?EewJQcxxeY{uv)C|A|VT2-fv5mxx@ zn=wYg=mx)%|CnnwK2PN-G#)3O1ls(6`C~pYP{&sfP9L{HHZoDWQs4#W4e@iO{N7>l zz@LjbC#Ot7m@xT-vvQPVp@R>{1uOr>z?sa8uO4%bl7T{V=Jlb9{i1 zHnO?sIh}^5ajvoQXA@3^*sFsPvwdL~wwC&?hRBK4H;u~=YU{bfc`)0c3t5E_#*VNs zc!aN9=Fd-G2ValIQxn$)DwmK4X$a1PZ;v+ygq?Rp>3UD*6b%RPYwj!wwyR;V4t z-fd4*Qh8r^v`|aD8C6=E@N!!qCi7TkB&5c`%!*z+GCVp?^a#cVd$k)mz6q#A=8p$r z^Roggq5Qz}UH@D#Z{i;Mr_005qA>9)(EUuR+@uvB!_pDDDJ4yVdZAx9ep+ z1mD6tufE#><-+!}&<9w0GxM!euicizx*lrcPhtu`jXj7p=QW7Znd*yUwF)%MdW7fy?Eumzt35y&Q$bL)Y3}wTIzSl+V}hqRKgxiu*;;M z#6bw88BR6*NGm!2Z56~q$OS@jNh73w9Im-afYJ^wSisNe;XruZf5#w?Lv}?-@WZob zmCx+-4tM51J?aNZ;Ru3Xs_SgM*ptf|VlJqCG`2X*lgnxmN@NoXTzVCU+8p|sh|Jl9 zoaJhP_{@`nr;q!a{bj++6NyY#{tFeJDcMb3RK0`Lr{fbak{Je9Qfpe44 zqa{ihYm|1Bc=2uo!R+cOgQzDi6HFYAVy*S(j@QKD7L?^5T#vw zPW9XsJ$iHeU690K{s-*y^zRGWu7OZ^KVaQ>y$YTc5lC#At9_PZ#(wFc?k-M>iyd5xp6n#AS~=4o{c{4!C1G@7U`((9_~(DYE*fYN9Rfhtw7=f9Q+ZsTlcdQQ z1w3_dHkP%B=y3R{kIX8%%{U7ia_|kfk7dTDBmQ8p@IXos!?Ncm_8&)#HAYQQsS z@A%BtuXwl}X}%#+CRReBc2KjJe7z?VY4;*wiY9mTTuQy(C)5YH0@O`@YlQy1G z1)J5N+q*buRQ@@y1#G+j-k&3`DJ45Ivv?5<3$2y9?nnGibWC$#q0^c;WsDjd_Wc&*EA2dVuGGbs#UGKKnXNX4 z68`N4*vHBYZkEhHv{1dj1EkuX<#>`{g2Ii@TdU39C&(zVnUcWRH?nG84>bN4*HWDy z=>s+_+poZC^?{6H<>Ay7#`yj>0`NM7NysP}{@A#+AdJ+s@V+?Y0sIh$HU>G(py$CMfn>uPa^~3LqJdp4v1BD<47FU}GL=NvfaIK3!hwbH+Mp*d z*;7HFQV)Z;vP&(mQbpG+^?!LeeM0^@f=Lr4CR6gyvef%d`FuBaofa%@LBWqK8Vm~b zfK9z8DI=9<{nf}cyi+az!wIHHY3c&7-1Vn!Z;{dO0c!d`cWkmP1N1fQ{0qG4PE|jj zxbUq$MhFUAdea==D}e@F&N51uD=Q&2;QEH~;qB{9YC1Z?D<8#d#|D7&EmH%D_Rj7~ zohwm5=1lp#LYNWhvy#FE(p@dkFM%#bV^E9>K}lp(`bw+*g@*2!KC)f~*Y?XCFs7^{`(XiUgpd}9X~Sf}3c ziGqll9Mj^L9K%DRkc;`wCA~HwnGO=f?ohBD>QL~GIdc%B7ib&IR!cFc{G=#J_V6Y9bCL1Zs4) zc<8pm@eU-WL>i@`Mi;rhypm=~6V_mT4DWudL2YAWtqeR# zAHLK14ihndovJeBl)Vb!y*#&I7|{O~gIrTYGA$V~sN3TDkh7wKVMS&1=?>Y5d6IA5 z(4WvU=xTv+>QWVWOaf$`iVy$I!Dvtn`Rs(6U?`P zmGRuTlNa2EejWaM5*eT%2LSv@vkb6e5niEMU%Fu{W;I3~bb2xmrOQs&6X0W1v{pp~ z=DX>)q9uh_Yl;)d=999k!WlGb;1M3+cJwH}HOWYi?9r-6kG{|J%NkBD4uDB0AP)p5 zc2pojA;F{dmIx*oAXmjII)0SWFbSJiY|HtQ#)+1<5R<4RVDuRo6Lb z#Al0~+$J@xKT|$xPqjJ<-)lU*>e>CC7;c#$e`T0Gy!Qao&v1dEZA}|w_D>AuixZ;n z*>s;DZ=7dr=2HrJ1{U!>P=N*55E=Ou^QSy!{joucz^ai8Z)ke8%}rR;2;FurO`pO* zgBK670Piihv>geqFfkAB~Q%)hChS?gz^R-inufK6O~9 zAwJe`OSx?mqm z*Vf)qIMCxRp>Y$fT=rA{JfbX3d4#;rd+<^^LTyPWb;6Nsm>uXhY-`S`Di|z@LZw9ws*{>UR9q}B53&@!& zQfE0wxIOD8N$K``IlX+c>%*79ed9eGV$N(bQIiq56h2kz9gr42-;i@40OR^%Z1jvh z_hQVosH{r)85GvKqt!a5}sI1USYxqT!M@O+Hvu`1o% znQo+T-`iJ&QtjTKS%<7&jiPZUX1~n2HU}2T=PoP2{O6Qd+SPM^ZUyuL8jgOHORS=! z>EL!^IyoMt3?Fp)#@?|qESBHp#i9a!IW9QS8eBuYE?O`7j{7Jyn;<05fO7(lBSbWaQJFcT_}Fn zRb6M58Q6X^l;h&0YwiI&;n~o%m{L$f#P8Rj{?w_)EgeXKWZN;^_;v>&-$M+dQXLte z!O=4p5$|I}`WtpF?_r`)m;Gcap@{lUR#*n)&MCNupkIGjde;6 zvs=72q38S#%4IPJXW=XT-_h;BuTE4B&jOLdfqgY+c3L$j3MJ;^!Wcf?@7Ngh(i38| z6M>Oq!tr-R-0QYggnwL&tLQ1`qCTuTW&`@-pQ9AN681lm)z3f7f3F>iIE1V7-8Cky zZa3RC`W0h{7r2m8I*&RkpG!qR!0MN?zd3>QR<2o4i{+~oaG@UR%u%)6=-eJ;26eAe z8dMxIpW0z>4Bc;-b6oVBIWs(}^?5|kAC^mZ<7=6=*=T~chhqH6zXm#FwIu8AjPC>6 zvWG^7$`xInS*gizE0*cCwu3vWhsj(AcrLGD|HgFaiL@FIvKIhy`Mntkj6-xJ18MvA z+k)N*m_kJ~63FyC?}}ey{Jj^|*}|ClnOehrQ1@F1U~_)Np7>te*j-<%3f6z)U#S!2 z?bAmlR3IbpLrl@UA-MY28Ue65!L=T(q6*qf==zmYE4FD2Rk8bw#oS^|n)st$-HTyb z++Z3FL^le4CfEyIuGXv9`phtZaQ9CH=|9|n9|0KDYeJAgk@?7Asnd?k<9R|QKmhu| zTnmZ8r=4EF0|}VD&e5RO%^m=bSJJ98aizg|hi<+L zAzv6bW>0p5oBT{LREczKX!S=vzpeGntIsDOMR?(2YE6XEllp znjD};SJ(#_j0N&X~6P@VRH5zoh7^dt=lBvUE8GT;H2&avC1o$#$@DmAd zw@#>(+<-V?hm>QSR;JSQQaoM2j|5yCB&wpr2w(V} zZNUJ397=;4gabNVio|H5|D@NX)4n@!s1O^69!F5kCT!h@F1v@7?Q)yizW{gkHqLKg zW$G|==-gLvb336CHg=QaBSJHb!UC^vf2 zI$!2URT`fiwT5~0jYD^gQul}6J_5-giON2F8N&!ZqBWrE18!-v>9-=)ZNCAuOtd2- z`BZ*n9_`#n%NHU~w+l-3XRhd>wEg#u^To6PDpA-XF}TD3r6N}RB08h?5nBrP6T98? zdiN7)?~X=bQrn*13j%WJ_c}Tab{Q}BwgqNWASe06Hy;BcCUcA_*D}BIxwPR$U3doq zur|kW=HVUITe#g>zUHQ_EekWA20s#mA}FZcmnBajV}E$;K`!V*cyw_;HO8nZ8etl= zB}L5wYhllrs6}!cT)CD1Kd#<6tkO4Z8=abJ;^dl)$+k7s%65}&+mmfiwr$%p8Ix_> zwV!_9_r7}{`|sA#de;5iIIk1eor%+Gef?Fl0~smnB5ZC2=r%K~T;5F0!~~nwaOmr{ zrVS8ya>VGD*QbrV!IO`{7`F5O>@+Dmz==0I(9t3yuyAA9o6(6sMV#Y6@MRb^oOFUYicrhj7R_)Csx!~aZEz- z2BNi(BBUHBLc%k+psZ=Zw+!mV>yq>bA9{vkX~S{vf?>`l?ds%8g=0xj*ND8h0P8a> zOtUb|9KbEP6?eV|mf1HbdKTy19{+FoZ$1_sZw&>N=X@LXlb{hdizY*}l4PaUqz^1B z9_Y!?N5%IOwTM0>(dyD}Yo(xT?Dbr0*~$gzW(NcZuFGDhb|Bpwclkgp+#^YLx?Bm>et%Zf9dQa8%wMN+WgqdnwS^3 zD9hwKxDLr?d;|ivqkp3ioEnWCg$Y8|d(o(OpSCqS-WtDzqPh5;Z?E}_7HhYpk2@#1 zZl_&9tLry+nkc*3iyzeOUnNI!#s^cr3^YEd+y)jK?LUA@_~2;<$0$L*A(iSTweR(NSusN}wYYrrB( zuw`1h;Xwq`=n~S4+F3-Ot#?{lJ!88GbBRe@6L-3m&YAg?vaY@}5if}^UNk2O@Hjej z{fn)33p(%1l<_{7m>@s}{B`?L4rR9NiLsJgY$gRIS7~n#t@TZvB5ntMyTb#ezOoVv%b9yNaFH&V@n?`2tVC7_V+va+-)g;_!`u} zSQSml&iAwqcTmJDbqP4Ve`4f+_+Cf0bw6xhT)?xG8sL9}1YB7c|Hq@j1$Z=4Ep-6n z&3Bi|lgk1ZY5W8%F4x;9)~^o_AIzP7mV-j_zwM`;L*~EeWB{fC9P%5PfADuda`Rs- zf%aY^gYZ~?7;yFux9(P-ksw7BN^{BY29qx-f<8PVnc4r~fKC~OKj>%>%Aa zVEdfe$KcS5gl0F9Wm$Bdyw*^I%paifw(GMQ_M%JKphyw*kog1o-gEdgsqg9w!p57w zD2Er_?exeN+ULv7+<$Mmfz)h(oA{hJ-Tcr{-mD5Rx2m=1G6ANG<>hk7&rty9DF%c| zlWia&%LN1y5HaTF`!RxNE1Rd=wjzE?b^%VqL~_mi`e{sd5j&~HIUL_&jk?+bM2$gu z6&Dbt7SKXW0WVq&jQ&)fO<+{#x}uy^~CeqxHWC zb|}d8A^+g$4+B<)2Rf;#m&`++cLfy}sT3ExiU}RHeu-v{@&9NQ ztUTpLYQR8*vXIbt>iKUw3GaE+<0zeG@ozXl%T<1`*5kCIB4B_i6dVXHMY^r^-Oh73 zo}fvfIV~KL+jZcuUw#Jcz<~LuShEIgfc2)OKg?B0iDfjY_Rn$zMa21l;7dTXv+S?iZZQQR zrRxB9S>t#`DIo1Yovwx&l)Uz9mqW_)KF1&f3qSuW~gJyNPS)1bAV7C8$!01 zm+Bv8V}?F>+w2eHCRG+;kSLfC1U{d47;xBq$RNX6?8!vZ!zRLqtH8N2OpI}kSw234y)*F*`vmV?E&b>*(vpobXLUJ#2K>ru!iQQP&a?bP3Itk};c!g5V2$zFXcp!tNak8FuP7qP ziZXNy_D!Hw3;e+pQG>?gJ}{R9KMI*@7=vasF=>JFE9s2qGR>0Oh6d@=JEeCXCMpS) z?NV*=SKwD+tpXA~VY0@Z(on$|LXv_zd%^TbYs7V*2cY%^QHbUA>)^s4>MWS_(<9~T zirE*$J6VyR@zwZfyf85}%aW@nrF`huc);*3rAkHxfGg;36q}hURgv)lZd-j~076~v zn5C3TorPRV>rK4G>jsyuOvRq=K*tH5mk?-oGk+T^( zIDvBf+!Encry7Ao5sOsUkO%3>cO!u* zzGXH1mOKxOu5c#c2?DwY^l&i|79!L&73f=ojafy@rDrtNdfMcM z5|}20cFTUkPJ-Or+f9&%%lsdtZ~|a^FKegN$QSqxJ&b5A*vF7vbja5%Z*aH@SR^+b zw%~uWl_PL}9?zUJs`WeP|IjXH%YSMoFaLFp1|+8hN+8FwDm885C>24YtL22R58PN4F=DUYV^ZtZ^g2(#Ie(W-BThD)L4PZFn@Of+%kLN>n0K8hR4+o(? z1|$>k>rCl+c)&dnpO3V-)YsMer@TMv%jwiXywf6^t`CupArkoNndVw$*c9dN^x(a+ zlAE)R7*QmGSvQq3Q+u1sA1gq>YbR4hBdz{5RU@6O+8`@h(+*>3BJ~M{`XCT?M+j&f zAhoJodK#{L3dE^4<;&$t@3B4nQ3f<3B7G+SmTnXPF3N+k6+p`bh(B5w|GArF%dml; zHUrbI`m{%dX8Shnl;70kFDgGnu0h!$cSVmkHAP_|0K7D9r5aVWlXwhBvFWR)D#zL) zV$rihCJcj7hvR9!bHHBq=YzW789xaGCqq2|q6M9AZ@uvUfRJ&NRT* zjEs-07iVy;@H@K6W?g?dvo9=BX5Qs&03!}LesABqKD8fPb@^kG5x3L-7QNH0C_(3Ck(|Dutfu&;aErx zpf^|QQpJbaLLd-8TFM-h@S)%(Fd+_N&(SHws_B~PGiRQ&Kz`|;i&{cMMXss(a>5{e zqr%SEX%Ns-reM%;n*XDg{cuauTBIp-gEgJM`MB*Xkm0GCM}}8Gx|{`O8>3&Ri@!YG z;ylLYPZz{1;_L_e;NQIjzJQGO0*H*)WpZuGKUT^A052N3jrS#P#Ny&gvZ!|u8agCe zeh4fvEXE1YhLS9clu_P*1=}E!^lr`LoUAcLEst@kAI;#r!=(p`f>=US80muBVPp%u z?ZWw<)-u&YMh2zX=`y&pnfziKE}zvp)j|RJF%D&?GW8+2U!%To29-0{esyc22*i$K;}dI3sFyGd$fXX`Fbl` zuFj&Iw&!lfP`U{aVtg%FlNQg}zPTo*5~{)Fk(q$~hu0PC`XxI~RlUPj+0lLZ zJm(^=5Xmw~j)LdkT-yC)dk+1T+QCEx2@MZQ!o_!XEi9%hd2oC=;29V}6 zjC8>VrGBAn8))+;t)!+*ze_Ad*ewn9DHKri0!3BQ27-2VT6@-{(Aj~&dUoD@LFY4$;QICUi!V>Y@ zFS}{Bc63qG?iUr2;o(Cy%$N>5cjaiqU_W|Xk?~>Hj}i-%7MjNgESluoQ}9+K+ss!~ zvJlotNVbMcu1yu1Fv=_7M)}aZ1mtrOg=){J$T+=vTzZ$@)Pv`1C(^hL!KDQFA=EbK z5LM3-VTNT0nW#iGf2%XP@QgMmCUp2{ag#jK0k62hNVdb{c2EnAGOkS=v35&Hg&*-g z&ekrD-MzPNGC8{iCwE$u2Oomxhvgq?rDRSrJ9`PHH{NuIl6cnD=jhK_`Uej!ThpfU z+&I!{4qjy45ca;GsM}jUWds|7FCnSbSX0BQspsfSOw^lYez&q-yA7h;K37vY+&(yBngb>LX5B1;RTIZqt*$Zhubd|SQ;tVqlK zBo9h7MWGa&KV4P}wTQ_sC%so495wMHU>Jao9M!#Lc{Am=)$KbG+J?8}TO42;q}yKIL@RfBxMm zYx2lsN=kQ>9gD(HDgs+GrizuoZoo^73*W{Akk1;_S#0 z!=uAHsG__ju38vfPWUgRHw;QyM#`3*84Q@G%Pgo#YFcAEE!3bt zoA?>a;gttAx_$FH1MBboo3BQ7xyMxGO(x)jV!!hKK!5%pF95JKHCdAu%b{;@S$;gg zjOsD|rL>*U3D|tgBg{}ZkHZliZF4EM6i%v`RqMfg3r8D7O`LGYnlNQLd?G9(36+e(Z1UkGo_1yU`&mp)z=U49zQs?x!FL z-ObWSTgPhAiAp?p<$lZE=|S2b%|blz!g=njb*Jlc)B&O*n@_a-n=`-3qw8ne@+V&$ z4oHsXOJO}ei)WN0tjC+s_tjaNHFHQri(8rkr%CF4A)e0$NR2}T@r<^Fv!(Lo;Tr#e zA6g)?6#a5;pCH^6-h%zr&wprKcjQk^YWd5}waz_$_s{VwvQS1Mn?bbc89kAu5;E)vZ<1 zeEXdN>C$E`+nkhM{1%}>;UL`hffrU_yLFmR4W8Ahw$Ss?KTyU{1mTTJgI|NI1B=fN z|0hccdE9VJt!9<8^3C}o*6hTJ(Xrj_p4Ok=3~1V!M$^KJK0Ecc7HV7;<%L^zUSzs= zz(cY=({_J?kL?Z_ftxIJ6RI~?Sw|X}5hH`8y(6XpZy*I$;=ek1`I=&N>H8RCY?zYZ z(MubYfZBDSje{EIDA%p^%CRdhw-@qXoVg!8;6XSh>Qsf)3+KJ_DnF(4TZ>gj%F25R zWRkd4cijQA3Nq|rT&h8>C7<`6!fc5;Bp&~Zz-*iS_SgBh8_D0hY^0=+>sBkiUcs`t z8b#5QwPs$MY(K&-s^56!s+?J^`hnBCyBwyv*J6HbBA#6s{P}A}e{B4IjqMYK5SlD? zs!T=~6$(=`2WPQWR?GuNa8wq0(hrI6maw}$+l2j{?vY1)hc>Gw>B|io-qmzUpLTgx zr1X|TA|v|_!xsW1gOxGFQ3VBc{7{^~ZG%{y;8@*{h%Yy%8$sU_mBmu6mW_Ui5$9dp zcO1V%JN|I`6SD>#9T8Mk_r1LQYP&Zv?cd$8PPVPf*MXDC=Wtm=7$0MlvMcwK;H}GqzO4D3l|D_?zyZ z;?CK78pZTHE69HLzKZ&$)LeMP&{qWpLekJ)>+i64$aOih+S#231FrD%*m$4^RLuh( zCUE3Ck^_%^2H*09j1bN@yNC!7rdzAwIg4wc%(;=&TeVMK69TUO)7poQtG2Ym|FxDXoM(2~3#}ZnH~yZZhiiYTzjorQ&o|U ztEW-)71kqJwrRn@MiY}9R|$8y$zPiFRG+LYo|cA3A$|4(i=JkZm01}o!Tb3MRXa@Z z#VQHPqoAN(c1?8k%(GrQ!8#ODa#v13NTmYErm(%0hdqy&!Q%3#t9ydTLiF+|6}!4) zR{1g^+NUF#do&oe1o1PFbs{YW7y-K1CEyXv= za$ksG9=1;>x{OE{JwGZk)@-7N z%eg^s`K}tHOM8eCGA;_$Ti3!q-hdhO$GqAh0_GJDZVM(ep#U<(+dmhGXz;9DxgPN1 zGsPeMf9vV*wB_@vh566lG;p`M&|L)XC*H{Qt&CNHZh3*@cpCmuuDdjbb6)kjj5Out z8*it&dVfbNV-jg>2dL!#I*j(8lv=!a?9R6BjD5R*LMT;cI|Jq%q1@5x_aeIN9-pKW zR1^9jTlbP9Ydo-xP38ZTKS2j5cTF@V9iC}K0H!8c$2)d(~UE`k7$P^xPfh0!L`xh@U zTr-6jx0di;7ga?#m5V*v-l3@m6PHCVH?t_iO$U41Zr~LK?9#V!G}t?gRJjHa4}XnuJHD>?p@CfCU%;_Zf6NIRs+8T18l^SAHmL^IjCXdO;({e!AEtB_jK) z?)zJrdTTrSry(V(dJpAq@rKbgD*8w9OeEEhI)fAdmu?0OV6-rkaOMyBj}In8*mm*m zqwUJJ&W=bqL1?>0Sw5Kb508qX#khfV_D%#07(!3pImvJuZq_TG4zj3}FDk=s!a2j7 z&&}r`+Nn*&#k}ekE^UMfy|^`SkacF$N4L9mkt@qQ)!pbJvAOy#LMV_88VzB{?F5NE zT3j&Q=(OhDt1O<_iIu%uo14u0oMTyQs-1{R{x;*I>Vh+&>ISMBXRl;DB5`q9#(pZ!WcE#b==n&j~sCW<et#Kb|u6sHhpF$8?D;si}5W_=+9i?bA)5G%Q zez<*So?N+pD4=TpdG3VpE|PyGBPR9%FhdcSe(3nnHDE0m07GaDK&(;tgf?bGa2S}- zZyfGHVhBr}(#(v9Y#GmRlGbw)=dbdV^9R3TXD)~4l~c=q=08NFHh!xk`#Ny^05Mys zBJS)ObUbaV6`+yJQLdnHKKhj`nTzDu+Epn55Yx?t=nzO9#N*QORARYW1Rramy|9AZ z8%js%el^k|goRr?*_#n&88s=;rSO=LVo2ebF)iL0>Ij_0z#M$+dhSqvR@3mo6r3py zQYUG0r!K%0$kWiS(WmWu(iIpjLu(2i5&x9KBEKr`&1bX z?rnlLTifH_?D-)|9!MKbiAF~SUL5l-E?z;d#m_`0G=_THP$~l#87s1^=`2V6vyPhD zPONfaeYN4*?&h?*yBbr8-X9k9r1CZ(EFiPIydIGmTA5WZeIGGdFAJPCDZiXQs`n_I zCMF^91az~PKLx~vd#bB^ghs%$15Fi_7bT-%$3L;|~$yJqc%d`7IldyYzjM0WBMfTkJEZL1tFom}2J5#JEO zLCs9NS4VRe>Fu^4wN6;I-DE}2d`a4qJ*YHuWxZ2nI@(q9^mQ))QhZg2qBO3OT$nIK z6cs_Hq+pr*5_yy@09NLB-DZ1>k&YYILo0NorB1Y?Z<6ry-^kPtLtI5VU)e088&LB| zAx7cs$c;-ZBm80-I}C^W6FATg+?P18!bl4%_NVI*-KDQ+DtI`nS)5tbkY?N0Qc)1* zx|V%l2qL^-@AZCem7n!lwY{^jK0e%Jfy$Na#J5ymzKAi8)*MMuH)g6)*jR1@a5A8> z(?-=)%8Yw~7*=R|ZR%2XUa6Q7HN()cSI(9*+-cjFE2rQ)p5!`Jz+o-iUZMXIIaKO~ z3Q{SE7&w13AZeEtL??wS)~pkUMnDe}P;jhYqNBC43aqu*z2QSB*W8YO&#jQwOHkJ9 ziHe9C*tKX9HZEy@R~OjDW^a0SyL%zU|H6w-8K8__`_h_hA6OP{U>#0%{4g>y^1vQG zJK~tb%(a(zVUXN*;88UbtoP6Nb4c5MmBP(8QSx?2C!u5K)EUuWMliCNkDa2OIz`|sidv&F94sbX0N*Ni2`(!sC-BmjMtv z$VX+oM16aBTGFh&L{3FWVkP%z+pceZU4Wdc4@yinCI?esg%XwF`$w5OrGKsDko*bn zbX>DtM9sOp)>hqBP#!+B3$3%aPyr}6rb3M{Vdng>*3=pltw?+2O$;ufk5kj z^I-auF*rZz1HFjh2pTNoD$-5pv_;KSO=1&A|H0vH27!cOy7o>a%#T*T#fHuOlYB{o zz~yw)RyZ<@b-zC`VzE)ffh?bXX2<#drPf@P;v5XI>0}#Tr`;K6AbhdJ@scsWB_71S z(S>CEwL$|nklg_0E6e~;$@QA3BQpYUJ+1o2n8t^ICknVzOYdzqHi$(!DG(-w20#MR z&Sq}_-DG-YX+nOA7oLs7fEH+i8Q5P06FGvcYvrT4MSbEA%EVu%) z_iE7hddr{daz%gb8NuQ|0Okk{sce4?jOXKD*Uc)`yfDWxqtafWU>!5|mdC!*Of+iS zzDGL$q;w?_$xB_p(){`Ac>QHn(?5e9ZV*B$@Z;^*#_=HflUBR!Ysa9l8xKF1 zTPg$;kYMi2ES2k7p;4*HNuc_dqT-4xPk)24{93yZ}_^lK`a{57kkNlcYTR>h>c zV~zDLACwndSs_7rS;~?SGK0)EN1*@;>fPV&*XwE$`uZqe@%g{gT(kY`pD&oS+C-j; z^Xzc&7gvF$S8q5ZDNGmLoB3ugii|_yR8uO5d4B+5I&;K%80WAvi0dXrru)GevF^_8 zw(N5GK2o!VB&$V_FKO5e+Y29>%mp@#-intZ{nFk-{G6Ga^R?+5bhNsIrZi4mo|yCZ zb+yfF;1N zrV(}3j9wfJ;Z19G1&x5`uFZnEoFdYLk`+veddK0*mh@aFsoc(JMwfLX_X{rC`Ac2 z-0v%+VaR|$IK21C zjG%BK#wv^OWpFR#_}5b)Nazjv`DKNhQXP3F)rC)I(~ReAn_MpVZmY3*q<>YgR|G1+ z*^fcFheDnF4CZc^!Q}#ZT?n6C;1VV+iP<82qy=Zz^k#&m)+e*pF5X?koIKgxgdJwO zIaFfa%#2ytQ{f2H%!T88v|7e~o-4N5dqJZpA!J@!#_#$9QB$RDlvXd8)Z=&%AVWxD z7gUHjH;W)HPCeX^qwc>%k-Z)4|8-_`R;hnet5d>|JfEW-WWLbf6)YPbpPcKQDoZ%M zbzzJ=NV842ZA=5|Yh~>ZX8NyaB?VSMJ5LKc*{^_pVLKS3(PCfqLghI$bR+XI3$swz zUHJQy=e>+);-u212&PW>@P4cJFQz}c8ViT*%iqGQq2-|2!bqu2IKB7c#5Oh#2tx z!^S>H0E4Oft++Dfx0j{t|3tZBVB4d&LHM8m5H!3&nw~tJr$t;G9gThRTnb!!m0G=E z=YE-le1u3aIXSu9u;w(3Wv5774dEdXgL4}9ll9)TJAczui#nOuI-Rfa zfdd}`V4{ppRV&A3{^Oe@a|7z0fai_?Q5I6V|M;xaC)MHcZilqBr9FlZ0*(SmQCS_~ z#OcamhjZ)J4(r{W0KYS9_x0oaW|6F}Ujh3$*<&V3rYG(5^C3Q05a(;1=u?;!$dIq; zu&=yvxso77Bh?!Iq^f1`V?oHNqUWL|ODyX?h?EZ;@+IZh8;l(G>W@5=jW!~ko(erJ z^)LC~=Z4yRhT6U$)}1t|#fwnP=hu`QNFGL5m$q?mXV;g7CmdnVg@)(Nwj~Qo=|~Lf ziIHxIGYrFOwYeL0ga95!T7dEUPmmcJrQAphfWYM=q6KK;?P+bqmuDT4_09|w(nnMTzSY`7hwUdRLUx$y zKz8=S>wjdTx=$U^aR!0(?K+-3z@3I|>p!0JAj!bKY}C_+qMAc?BCeaEY|QiuA%5IP<&)wS8OPc{Uc ztORoK`>1hp65E7hxZW@+Xj+e`9UQP44$;}w1eLcNp3b@C{Hq(1(eaZ7$#S4kmo{yh z;)aQ9HrTuQi+6Yoy%Vh!d`fID0OSrRq(|qynqmL2-COP`rA6Sl7Jy;md&wrc8ukoj zvV8v`Ck(N4{Fuf%a5^c*Vw3RL7t43$=d(n7tgWi%TxTyzn6-O^Ul8MY5F^G))6`p` z=HJ;@lz79 z#$Fk;wk*Bgz0H?!gK5bHo4&R2uSP4H%2XYO2!-xvLSM|B%1cALfx$w4-$N)>xth*T zRdGU~ytQ^bp+*kUNu&Oj{rJlQuHe*UoL8ia3Q#Y zX$T;?^oGv79;`PFTQ2PR|3BP+a(MSy*VoWVDdxcrRcqGJp43EK*kigDikLERbcIGB zY)Rz#^LlqI-Cfm=hPp^2kP1tuD+)6?TbVv5<(-F^r_ z7eg@^Mh}uoP1Ikf%95EJnvIReoIPV~xpQ|GC;kWrejXanm0!iKemu|n-p1B?=1+O8 z5(?*=^->jBsb%N!|B+N2Ns&;WB{Z4TIlRzD-P&Drpj(%R4z7gA59y1yna#>g% z**$S5=1ib%#+P@D_7#MCzC~iGYjy1g3kJgGr!`gb)LF=uxEyZ#>7!_Q5Li=I< zw01&<*X{P_7OUG;1VYw5HdKR(9X=1R^q9#R4c5DHiRc zdp=;(2M}#3XPHp6flzs`#=~%}o zXGe|^qJ0;dl!cLtB=qOVS9DieNk8| z(4AaZ-8qPQ)&)0~1WMOBE%(f3TnI6+6b6fy>TbCcsoh+gz~n(#*DHAXK4PZ8{!y5~ z`;&rWiru4#IJ&DRI|+46*iaB-D9+s9$Jw@M@XTMt*;<->|=7g{`DzlJSg_y)J} zV6EoEK2V*pQXmK60+>bKl@div&NgJ&vQTpxO`Dq9H3E;+i7WNUsNf>bsVT0hXmrx{ zNyU}Yh&6-oZ|V(gI}ZZ;VZ{7K3lZut5m3wRA(`S2vcO3Ft^;o<_DJM_Vj4?Tcho8cdHgvC*6q4R|qux@*6F&)#dL#KA0khk(UJnQzRVa(U5e zWBr{oLUO^{U_KycQF(Wr8H_AD=;LT&P5G4s5tY#y0w|eCU|Y)QE%X&7ZNEg!tj?eK zfgn%Abbrh-adfF0X%R{I_Aa(ERkj+Pk(1(Z;!KGP0%^zf|8Vc<_GGtor;HN6a-ze{ zM?IwG3Rrj7MMVZSt|Ga&z%{hPXDz+$Po11FCx=@l#X(91F7x-mM_Lf^xpA@@ZAd+y z%xMXHRw7`&;Q>2XB(Tlu3K4zus{D{Ooy-eGWaQ|=FmnnjDxgUVCB@<95%eGz<(ZrdXFC-AKyD4I2}sIRC&5Wie~L4DkzWddKcHw>+*ap z%a`D%ki^yRF*_T$6$S2f6Js&Z@f^)q?Skp~k9c1(WsHgPte@sXv`rctkDm|h9=m|{ zfcFc^%Qt z@%hlCcU3qN72&$BF9Z&g{?5E+46I%Y%|3<;P8C|(R`Plrw0GrKKnXC$JV&Nb(T!j< z(UUc#%G?fHg_n=P6-EkY@|5U(Ld4?_FR)df1uYU%@=BC&0)W)v#*W}aZY zu;`*(a2CoaJ=R;DU7xR{PQp-}(X3X~j-@nrs-&B4!k3Tfoodr zFam=tinAtd)d$??MYKz-OsnD>68Q-0s2Vq`A_`bc|#uH)T5;d5(hMzMj4G% zd-S#&S3|-=dqR9W^0#J7)?U#0Lz*Xe+nmJ~fJ=VffNd75)$0kl)#*vBh_RUwbr|Mj zbAvF#?=ys6X?GxSNUj=Ms`-5Jv`33v%ty(Eoxk(5g`;O_4315??BJGE48yRNZ0HLF zbU1yY-&ukDtiE{vfe9psAwpT;TYd$A? zt(}Q1hbh8@UBU%lQ!dt#>V=B*^w@*L&|v!SwS8}Dq;Hbm#=8+vk@@(lVcWAdTj`k2}6XL=Fit{y?gPt&x+s*n5)uI>4o z#YHTt5H4xdf1C1)3K){BPF-+pr0jB0wBUNHa1reK(Z$kzI-TIMI%bKMQA~n+J2{5l z@43RzY(i8!LRjr)Wpd8f2~?4$1O&6iiJUTJwMOkq?|fABLM6W!jvv^!?A2zV8kh&v z+0edLZEpw4QU_8}D^>rp)ZcYHGPHsq_fdG(ccxHW0=$e=%LmL(wVHxw+>R(fkOgxQ z?^bKrrfWYN=HSUr!}07N*^I4)_fjZeV$k>B|v?Divj{i6U z#ObJIC9J{IoL_t~>H8Sn#cW#I<|Ta$Pr2QnP=3#rmCVR{0yLvcRu|Ql_0OM$P*3a$ zD76mBfJR>2URb!+;2Z2QB9&_%=X-WifJ33&3qvY7ypNqL>s(Uel9lIuTFQkWw0TFI zXCTj<40ubZcpmHHYR>^DwH3aZKqjlf zSd_?3fJ9YmbcVxTC<~;+TZYck4x5+DX%7w&9|t_8Ou(6q;O3;p=1(X@woaZIqJa+J%668$jgmwnMlPO>g8z#sXTr{D0w7Qf^ zBNL`nt+e0}=APA;y%F=SKtAU4C_B1RUm>)ar=WOlj!CT+%e9EKs#>d$^00$-V4A^{ zYo;+=db)c^7uWPnGH005@v7c#K&rX*;7*T>62I-~Q3z1H{EwCK}!*sn6%iU`Y z+0B6yE4-#0Yb@0RpqT#h-tpANBBiuh@=CODmQ-WP?Ow{;zRO){JG{3 z?AJc{NBa^5&GR*%fSr89#1fY}bJ15)@}iA{L%8D2?MQv7v!PTwJ>tAvyT?H-7Ml&Y z@b=%&HaHT%DrH+KxmJ~*&&UnoFkN{uQX>IQFEg}Ccr5ZJr-dwHzH=Z9#+un=|2b+f z8{U)CQ!6@N5x7qRYYUCQeT)y z>`g2KY1&<02}1vv{>A_t#MhUAx5*pD)s!l_@YVw%Go;6>^$-mdn8#=;k#UTJ^MTH+ z2GrJYNf{hpa2;PRK5s6Vl#{ZOR(1>zlQ!_cyZRlZs20l?_|1}WYRhIIRtX}FM%?kR zz&n|D%66n>AfA`0R@uFrkorqxlvAqNOLEu)>el1Dz-I5E;+FATa!!HFyyKeE`)DLL zaa;(QHO$UeyW_RbdG%*h-{eDTKcFnS1G!kQ$mSg&z)d(VM&>b!^$sOQBmjt3q}7(D z@eKyRTi?bto5Nb-gO7a}c%uZ8+9Vf%5*ANQ;-bzYKIT^+`FNiA>k@^fmRxk);d}$J zgpi8fAXDMmUpk4tIh=c40|VNq!N?XKXji|K1K{^4FMWZ_fS9cCF$j@~nQLti^N5V! zrwbp(hAc0y)#}aPF$Cgs*tcF~q2W=3nu8OXVNacNQ~+SCUMe z2sCSi1g?}^Rzn&+d8Y+m}7@24YBxNeL&0?bcb*d3MAr8p4<*o$9(*3Y_68?p2^ATTnXJ zw+hw-aXS+D>4U5W)|;sclJgi3+-jPiHG#U&rc!tR2SP^ol62RvsG#7xW9x%li8y*j zMi^0`iPQfzn>I=d8^Vukw+1y5u=oW+g4S72h?y#0>mey&V2D?#3%(Yj^^Wd7&EZsc zI(%_`kb6K#YlHnhZphmyiBE{!(_X~2eFl-4aDT&{93ft2YYa=1u z&45-^SuFww?#Qrdh;%~_25g*p03}>KTIDefE2LYkzp8?qN>YXd4AayByFQf)eM$rn zsLYcnxS~qbjvCa3rXFP)76-~lPBVKQvL74r8;bC046-P z*eeCi*9=Z2uhxarbEz{?{BJm!5JrW)(dy<&%413z3MP*mh96+8z*=oz7Xf|Wda&!) z?kZ8ZbHT@V)f&f9Rt`|h3xPL8E>|prwG2mNYi%(hwFM}ibRhco7yFSotH7wRbTE!f zJq?r-9~MV9PQ||#K?X@3ie6U#^_!uGYm7sXLbB_SgVl_5blw ztJ^?Ol>OVw@Xz9wZg zcZ*>4B*3Y=9On0_1OL#zBAoB}kY69W^JMymJ-n5Q`)v#MN>dIJp#00J`0X-4ga7WN zfEP4H2yFIzWeZzcEabk*59dS6$N{{!2p-ItM+uDd7iLehZBvXj96q~+a$!p90+A-p zN2Fe92?2TJ%o^1bn(a~3mE$7u!1y#|!=pfp#q_P)U@j{P7wF4l6f)}jaq9;2Y^r9FU=Bf2T!Wj~b zQhos?dQsGxCfU+ODZCc|VZU1p;5u}KwxtTR<=BC`xD?rJYN`*U_sx}M1w4-#xU;B;=Dgn=@` zZr^@Kvii*~pbZ0~R*y9_xg_Tbf)(e;w_z7Tjoj4(=ad1w@VKJmpO3-?BqU(DZn1;p z{W~RG)C~Z$8F14h(?@BvJ9&S`KUiD>2Q-ft*bZ0wvLjCm?J z`5En>`Qab5b&^5QF{TR?bn1wT#(Z1e%e|Renl?iO8D~f1Xy5=>I;5<27C@5#_qhiE zzIYrEaq7ulUzZ7ZD=?i^G2K_@v!N#o^0ocRw-yMJ3%Glq^^R?_w>uV5yOgQV`xnPH zchv{8_xgGnz&`A;q#O4ec1aU_TF?7;Qr&6*Vz!{69Vjv+JNh*;STs2G5C4G;!X@PVyI+D7`Xvxqundjd`-6P%si#~=Rt=YOJs^LMXl zkBoaeW-^($qL3;Xs)h@nd)B&8dvLApV@QyoCM zB&88Vx@!QXL!?v$2|-#Kl!oVA-+#SdpU)2;?{AoU?wNDXUVH7e_VL(pj87LR`)BON2z7&y=6+#d23k1zgMk=n4`ldCN|| z$iR1lP3P}t@S{vedT{93#=-t!^sTgYt352mk;UN&9*+?jIQHnzKsj+5z`AA?P}|^m zL>TkZWA|gT#Bk&bKL&2AUz?xD^E4J0SsZC!{WYXOGH7ccK)jF!8p6LG28?qk13b?} z)sMvgTr;Z=D1`<6GoKfGzqFXtAZ+D0u0jjgSb z5)F~mC*&}4HlrPv04mxScbGoT9)@#*dU=*s)n#TIOVgcQ{w2Z|0BJ-5=-NQEoL#eu zM&`D19X2b6ZGc(t0t+H&@rkVlp5(D#5GW|5>}r2+NFxM~H(-|Sm6}TSwZW2(_L8VH z2!gcumrQ5()EMddJ-Rde1f6&8Cw`<3$JIWpI10&x63P`*eA~-|p*Hc-KHtg$OuI7z zI*z=PcCX5BVps*ZOpFFysg5J8^z_21$!WrqX33bBX7kI8~q{{hhvddrUIS_sqNy_;;4a*eLJvDjUnXOS~eBd=D@s*;gzr=j_Tm5_sm&p#U@%s!R|IqR^ z7FdJZ&?Z1urFGj4ri?}eP!jN5%ZQ3N>O%9Ltdj0?mY02L)s;R!YQ?SqdllA;UA+4U zn4`GN_rxn`T~7`>1G(BptZhW25@MeK-D_K%el`}LZFf-`D0mjwgJgn@fP*`YK5vZL@Ow# zPA17+<)kp*|J1;m-0aFeQRBb}ZvxsCz-;SQTTiPR=m`6ry;XfWhDw1Iog6Be*ptV9 z^;o{kzkYI2!6NDbp{4A7LjNd`KxIP~ksLXZ_|&2uGn8R7hKi^aYNMexv)}AY2Skp; zqlovPJA2m>rqVo4Dy)8~NNi{FTg3F1oNk`qyxhQAqRUI}Uc1TO#5)Y~lmnX{sfgoR zQeWGHx{XeviTc6w@>g-uQ2?oR1Jhys8w}Ia=09 ziV~Bf(#GEHZH;Hk&38-*U!2}&FmYDrSK)yi@G!wKFew+)y}W#RM4dIX;Qr z+u{7kCNms1-8P~4N?VvuI?4)-_2!v!i8^uXEqOMXxLj#bl>ckEY{`<@$edwyc(7;S z{cyHUW3y2NX+PNKb7Ys?53-!5T<1nxXvJI#57G>IO{=+-Bh4*vsR7b>bjQG8Jb}=x zV2u`7bZ*qG%RF3GaGE^UJ^pg=_FK2ivBVm{Mi7se`l&3vwisyEWu>hD=x7Ifx_=$h zc|2t^*6iVa*vest?y;)7cxa2t;L^LfzzWm#@*z!s9^hX5pv5<_?RC56lWNw4X`JRp zqp|7JlmxWK#7`h531@FTdEx)qpK(&~;rm=u|1c?u4HnnbY*p7gxhCcAqa1?%i#Y(5 z(9O@3U{xZlM@J3x1HO<7f8mf{di%g7t;USxgbvSW0sDe+rOrpw@lt?ht)m0K!3o$~B$=;K*LE0~!tQ4O^e3 z-l#ocgnM_||2mabHXWZBuo|xxh5T>K4INJ|!9gy<1eQnnK@W?F z9Uj)}0+8zSx5=`n5ybZ9sFW%WO15(b ztUgR&n>Az8FcwM)R0i++XF@swesWxRVrVffRW4TyJ+H^Ow?VTP1?UN-KvDX_zZR&< zPs)As)l5`Bu(Q#_(uJ!L-A#F0Q8zyk4NxD=4W4#OS#dX3=lkxd43pgR7s3-O(@*GS z8qyJ0?GXwSI#KKIY701=X)oBCA9u+<7>8HzAKqAp30!V0IcNS($QVr>3S{=FYla1W zDKAG9dbPWhA4e=kt{ORJI`pLN`*8=)#xLgn2pJene@@vi$|SV%+~VYe`P{`p?lJ~Y zO}dp+8beoCh#um}cQe*?f#Rsp;44{Paa`ADDfHxK#3C{%VxZZ(jS?7kdgBZ<)t8rp zt14KquztovLG>JP(qC^`jbEBYz3VzZB>JzAY(?~yIlu6siB|FUXZ1z%7(V5C_gahf zS_9{h)BdPs_STLo1;TDeg+JuRy4mXjq8ISU*)Pq=tGhcdR}7_w;_>c5(lq~htFy4GNpdP zT5~Tt=cbEpEt_P}mlO-FyB+o19=nMVCTd`er5E(rDOWr@a1E1mxbkfbb#PHQZ!oGPusq-*%9mCB_U6DxPMyin<&?5{n|^tmQNkl1c+q@ zT51Bu8#7jf5vi3|>A?6`9tMoj9alIVJIs#iPZd0^pRZXTYjs>-6q&ugZ=Q5z?(2{a z5wZ!W+$j08WE+tNt?MCjRgbdzyX`x+TMNluT82?>WoZ+s8gnl}6=b&iW!0!sBz%@@ zlp?&`Y|q1CRTrUTkM>?WrKDN<#=kv6D0Zp*OO)<_+o?)88s*?`N9kGFt#}gXjTEc_HMdb@l4uuMfbtv zpONlJpD8#+y85a+9p@F+C8dYE!v#ckJP3a#iJAdQF~RjG@8C;=E+)8(QUJ)g=-Fo! z$>1^XAr>+@EG&tD?SOul@=ydE(6eH-f93;+oQc345#?Tzmj6php7Zc2DwD@Bcbm9y z2UJG_+j!OFXMuC*&aGuCV5zxeug}YUm&-h<)8I+9W!;!LzP&h&`j=+9+S6e0{>+){ z-~na?C2EM2sc7pS59}~kgMelnctP}@{;*hlaO-T~#)-?;-KUZg(#&)){RFW9(N}^# zgrEm36y><5rt|Sg;4`lM`@0c{Yc!i0J28# z%`nGpm0Jabs==tf`!Xx;FZ&0C_ql-o)A*3@i)*{kKwLNQn*4#$Wic#h zY2cqZw}MC{k{~LdUmYEF2g|!bEBUbkPYmI;s8H_L3OR=BHdfzqZo?4FMvfZhn6dAP z&o7yPEo~4lI3g|5XP>ShGLA`wR)>OxfTCdTjam);M4k0z*$@-&MEV*ZZo!V0u=YN$ z>n>*ZX`d7R#RXD7cnrhT`RaP`+DDgPPPlO4%8Z=U15H)^hp!HPv$wU~aXPJ~%fJ&0 zdFH34NOMYp?SIMjhN_~?R<-{eDAPJ{J`F zv6K^a!l3@6x;e5($3+4ZpQgu+m%Qo1@r`huAxoG;&gJP$iCO#4#iGD{o-Q{5si3x3 zGmVUmgFqUN(8iNQ0!ZB_Uk-Kin1|!2dqQB!ZQw*vQWWMJrW-y+fJu&kldNiv73q}y zn7IWMjhGUm6}OukuLzf)f%SWoW%JI@qF^g-c?pH?2JI1sfm2nHdR%PE4p>YpPRClE z_C8(05=RFr#kN6QhPT@~Gh4f659}&vJ3{l5A}DGmp})yvb4&WXq8$7Zz*JLkx(ZN4 z`Tk5U0qjbU`7{%30uFN5(>(io`^23m zOi|0xl^d_i7Yows-S%53pA}DoQnUC1Y=OJvI}o1&fBhx^0EvPlF2Lu%E93V3Gs9!i z{^}zD=Ylns%Dxw9RXKfMrds>DOPbM2Aej_pFFj-MhpR}v+9N;v+8-3cb7r;*nRVX5 z(puA)*jmEq7rd0*;^X7Dm(EPT2F&vU-#0zO0!^4OTpA>C%aau(AYz82vE&F;SE&F3O% zNd?FVIk{d+KDXPn_@bR5>^E`~ig+?Yf(fN-jNaqwhy+{X_yIUj+t{!m{18hJ+ie_1b8&=8>8dfUz zjDq~h*w1r|8EUt2&A(T{G8zLUxjCerC*Y9cOQq9T){~k0lk)T|_YmLwPl*6km473C z0wSVkl#^MHvb^HsHut|*cnX0-O&)xD#QZyN>&)#tWy|VsuI1J=z8y@u5}9Vn8U}#K zlyQe2Dd+`P!-xHD<)J5*mclaRH1Op-#NpGL1!XO^mm zNh&4*y+4AB!msy)8JWL)`&C`YXPY|zgFXgDS0|mhkv@XNx~e_-5thOXIDGBQqg5`) zSE>^Npc}{UUEq$L8{bVj02Ki^%fT7f$&PY!ewiMR4FQhk4L!g>#z-

}qRpI1rLxD}SKQZjyddxc|Bih^u6G#I=!Ve%TUDb_e+JA??U9y&({(j;c=BQvF2M0`kWUNJarm~bK8 zkUo8)M)8r@p1B}6;~GUfxp(1_wx;tsrsk-+to%z9^`2HE<2*u^$rwx}+-4K>?eM89 zkr#H;IEga2S$k4Rk)}N;$0KF6>wl}iv@(u;-`g>u3lc2;Kns`LO?tbvad;dfh)5N6 z=UhG3zV2VK-b(puA=!29*U#vFDH?T6OAg(%k4J@DB(!41WsZ-tBw&T-?SX8^TFjYm z4XAtYlO}K1mg$GiogZFh^{53EFDFe|3eg@?_NK%5w6>hjV)@9SC61YQc|xp}3DKei z%kAR2v#*H)K<2=W_R6-r1s}Ex%%jRlV%>ShQwR@x}zFf(?&qREQtD>yj=IpL9 zTUL(ztlu#|A<-jyc&rb+^J8tOgO?SYOtOY+GBKuD+j6%7N_8yKBj2Ho#DXqG?zAgkR}B^jfg-uy{-O zqfI}wegag%OPXbgJC4K#sbtKiaq-NqE#KOpWv1`4I>LSwB;l4)rE~QNn#B8r!~zMs zLO~;0;SE3%0R^ZV$^l*&GYi;d&5?kDRL1Jy+DJFv;2B`fzh`G7Cj6 zMrrG;WfG`0jg+Y>%8Z=RJXyjWNpUZZ<;Nl{{62!7ac*&QF+Y5us2-!xhr)2>hP-yp zb~H9)hbHm0VEmqHK5)zm6cLEY{38FNi+OzGR8gn~vV(U>>ZvjJ8?=&Xr~%h_y*M*$ z%0FL!=q;*i_<+{~Gg-W~+9=r|0#cAZz;1bh#-buQn3aR@;w*SlA_}hR zihFN_iKxK&HYVA*P(x(rXNg8t*a4q3>n%)7R9U0{BtJT>r0J}KqjeL1Au}s$?rj{0 z-NZKj8(K7r?Zi6@3=u_Je>p+y)u$3k11Y?UC2b0=Sws|&TwooE$WtP-B@5Y~xl;gI zO7SEPQe`5P6}bW$zawa=*iT%M9n>^arxlxTLUHZ~^o6>fHS)HC>cSm1`fDVDWv!T zWCG*8tBFU&VPhMppndK4A8$e`WWP^mnJQuUm|_)$Vun zt}5Jag=>E;<}MK-_N3>2H&y?G31y(lSPiNsbGyoPufx-elEpB@cQF2gGa=IM0+r&U zp3S10Z$@gK7SjMS_J$>gAqCaqa<($ey?NsE^SH-(Y!~3C(b1t={3F1 z^UDXJ&aaGBD(zEv(aXe%>qldsnkR$#IVR94>b!=c9v7^_jPD zZFyCxQlmUyOSU}+DxN$KJu3x!0LnDR_AhQSGKzyFdBM*}8xIaEbH>V7;l7JEhcdh# zslc3x4?26z57#6sJjufZbh9%>i8_Hdo{XF(9#N{EZ`^Q$F$-dJYTCLYBVGnd%xWnk zjEh~28~zmJ8sq{|MZ+sJm@-W*eur<7nI7lQ#A-|BJw_7KxOcxULZNXN?Njwi=&!^c z#N<8kz&JGaV!1Z5q}+tEa_34KC+RR(S-Bs2QR=$))sQALTwPFGND>Iuh2HAo#5AUU zU>Kw&JgL|u(6;}2WrkXm-iHybnrmqXBw#o5d}s$VOm}*MQc#~()b4Ji621ZMIF2V* zs-R{^y6gffiC}6)u4fUMC$yY84QUt;3|LwdGRgWJXfiWN=%|09Ln*$y3Pm)6qIcYX z*E0W98cjV7oz?xf`Y5WP!Gi5av0mizbOvr dzJb#OCv>3B*vD}dxp4vf$w@0ql}Z>r{U3c46HovE diff --git a/test/image/mocks/ternary_markers.json b/test/image/mocks/ternary_markers.json index 369460167a7..b029e127522 100644 --- a/test/image/mocks/ternary_markers.json +++ b/test/image/mocks/ternary_markers.json @@ -2,7 +2,7 @@ "data": [ { "type": "scatterternary", - "mode": "markers", + "mode": "markers+text", "a": [ 75, 70, @@ -55,6 +55,22 @@ "point 10", "point 11" ], + "textposition": [ + "left", + "right", + "top right", + "top", + "bottom right", + "left", + "top", + "left", + "right", + "bottom", + "top" + ], + "textfont": { + "color": "#DB7365" + }, "marker": { "symbol": 100, "color": "#DB7365", @@ -62,7 +78,8 @@ "line": { "width": 2 } - } + }, + "cliponaxis": false } ], "layout": { From 1152d19f8a34eeec7d4119c8663e7e9cf2418edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 27 Jun 2017 17:29:16 -0400 Subject: [PATCH 10/10] add / update jasmine test for `cliponaxis: false` behavior --- test/jasmine/tests/plot_interact_test.js | 4 +- test/jasmine/tests/scatter_test.js | 64 +++++++++++++++++++++++ test/jasmine/tests/scatterternary_test.js | 62 ++++++++++++++++++++++ 3 files changed, 128 insertions(+), 2 deletions(-) diff --git a/test/jasmine/tests/plot_interact_test.js b/test/jasmine/tests/plot_interact_test.js index f8fba331d24..19859651da5 100644 --- a/test/jasmine/tests/plot_interact_test.js +++ b/test/jasmine/tests/plot_interact_test.js @@ -70,9 +70,9 @@ describe('Test plot structure', function() { expect(countDraggers()).toEqual(1); }); - it('has one *scatterlayer* node', function() { + it('has two *scatterlayer* node (one clipped, one non-clipped)', function() { var nodes = d3.selectAll('g.scatterlayer'); - expect(nodes.size()).toEqual(1); + expect(nodes.size()).toEqual(2); }); it('has as many *trace scatter* nodes as there are traces', function() { diff --git a/test/jasmine/tests/scatter_test.js b/test/jasmine/tests/scatter_test.js index 658285ec965..4366e7b8549 100644 --- a/test/jasmine/tests/scatter_test.js +++ b/test/jasmine/tests/scatter_test.js @@ -670,3 +670,67 @@ describe('scatter hoverPoints', function() { .then(done); }); }); + +describe('Test scatter *clipnaxis*', function() { + afterEach(destroyGraphDiv); + + it('should show/hide point/text/errorbars in clipped and non-clipped layers', function(done) { + var gd = createGraphDiv(); + var fig = Lib.extendDeep({}, require('@mocks/cliponaxis_false.json')); + var xRange0 = fig.layout.xaxis.range.slice(); + var yRange0 = fig.layout.yaxis.range.slice(); + + function assertVisible(cnt, cntNoClip, msg) { + var selectors = ['.point', '.textpoint', '.yerror', '.xerror']; + var scatterLayer = d3.select('.plot > .scatterlayer'); + var scatterLayerNoClip = d3.select('.plotnoclip > .scatterlayer'); + + selectors.forEach(function(s) { + expect(scatterLayer.selectAll(s).size()) + .toBe(cnt, s + ' ' + msg); + expect(scatterLayerNoClip.selectAll(s).size()) + .toBe(cntNoClip, s + ' (noclip) ' + msg); + }); + } + + Plotly.plot(gd, fig) + .then(function() { + assertVisible(0, 6, 'cliponaxis:false'); + return Plotly.restyle(gd, 'visible', false); + }) + .then(function() { + assertVisible(0, 0, 'visible:false'); + return Plotly.restyle(gd, {visible: true, cliponaxis: null}); + }) + .then(function() { + assertVisible(6, 0, 'cliponaxis:dflt'); + return Plotly.restyle(gd, 'visible', 'legendonly'); + }) + .then(function() { + assertVisible(0, 0, 'visible:legendonly'); + return Plotly.restyle(gd, 'visible', true); + }) + .then(function() { + assertVisible(6, 0, 'back to clipnaxis:dflt'); + return Plotly.restyle(gd, 'cliponaxis', false); + }) + .then(function() { + assertVisible(0, 6, 'back to cliponaxis:false'); + return Plotly.relayout(gd, 'xaxis.range', [0, 1]); + }) + .then(function() { + assertVisible(0, 2, 'smaller x-range'); + return Plotly.relayout(gd, 'yaxis.range', [0, 1]); + }) + .then(function() { + assertVisible(0, 1, 'smaller y-range'); + return Plotly.relayout(gd, {'xaxis.range': xRange0, 'yaxis.range': yRange0}); + }) + .then(function() { + assertVisible(0, 6, 'back to original xy ranges'); + }) + .catch(fail) + .then(done); + }); + +}); diff --git a/test/jasmine/tests/scatterternary_test.js b/test/jasmine/tests/scatterternary_test.js index 34c5e764370..5c5a5fcf390 100644 --- a/test/jasmine/tests/scatterternary_test.js +++ b/test/jasmine/tests/scatterternary_test.js @@ -6,6 +6,7 @@ var ScatterTernary = require('@src/traces/scatterternary'); var d3 = require('d3'); var createGraphDiv = require('../assets/create_graph_div'); var destroyGraphDiv = require('../assets/destroy_graph_div'); +var fail = require('../assets/fail_test'); var customMatchers = require('../assets/custom_matchers'); @@ -374,3 +375,64 @@ describe('scatterternary hover', function() { }); }); + +describe('Test scatterternary *cliponaxis*', function() { + afterEach(destroyGraphDiv); + + it('should show/hide point/text/errorbars in clipped and non-clipped layers', function(done) { + var gd = createGraphDiv(); + var fig = Lib.extendDeep({}, require('@mocks/ternary_markers.json')); + + function assertVisible(cnt, cntNoClip, msg) { + var selectors = ['.point', '.textpoint']; + var scatterLayer = d3.select('.frontplot > .scatterlayer'); + var scatterLayerNoClip = d3.select('.frontplotnoclip > .scatterlayer'); + + selectors.forEach(function(s) { + expect(scatterLayer.selectAll(s).size()) + .toBe(cnt, s + ' ' + msg); + expect(scatterLayerNoClip.selectAll(s).size()) + .toBe(cntNoClip, s + ' (noclip) ' + msg); + }); + } + + Plotly.plot(gd, fig) + .then(function() { + assertVisible(0, 11, 'cliponaxis:false'); + return Plotly.restyle(gd, 'visible', false); + }) + .then(function() { + assertVisible(0, 0, 'visible:false'); + return Plotly.restyle(gd, {visible: true, cliponaxis: null}); + }) + .then(function() { + assertVisible(11, 0, 'cliponaxis:dflt'); + return Plotly.restyle(gd, 'cliponaxis', false); + }) + .then(function() { + assertVisible(0, 11, 'back to cliponaxis:false'); + return Plotly.relayout(gd, 'ternary.aaxis.min', 20); + }) + .then(function() { + assertVisible(0, 5, 'zoomed about a-axis'); + return Plotly.relayout(gd, 'ternary.baxis.min', 20); + }) + .then(function() { + assertVisible(0, 3, 'zoomed about b-axis'); + return Plotly.relayout(gd, 'ternary.caxis.min', 10); + }) + .then(function() { + assertVisible(0, 1, 'zoomed about c-axis'); + return Plotly.relayout(gd, { + 'ternary.aaxis.min': null, + 'ternary.baxis.min': null, + 'ternary.caxis.min': null + }); + }) + .then(function() { + assertVisible(0, 11, 'back to original view'); + }) + .catch(fail) + .then(done); + }); +});