From d553142cc29cad5de49fc7d7d8471fbf12e734cf Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Thu, 16 Aug 2018 17:07:16 -0400 Subject: [PATCH 01/10] fix dynamic heatmap ordering --- src/traces/heatmap/plot.js | 63 +++++++++++-------------- test/jasmine/tests/heatmap_test.js | 74 +++++++++++++++++++++--------- 2 files changed, 80 insertions(+), 57 deletions(-) diff --git a/src/traces/heatmap/plot.js b/src/traces/heatmap/plot.js index 3d5f73828f4..6976b62eb1c 100644 --- a/src/traces/heatmap/plot.js +++ b/src/traces/heatmap/plot.js @@ -16,38 +16,36 @@ var Registry = require('../../registry'); var Lib = require('../../lib'); var Colorscale = require('../../components/colorscale'); var xmlnsNamespaces = require('../../constants/xmlns_namespaces'); -var getUidsFromCalcData = require('../../plots/get_data').getUidsFromCalcData; var maxRowLength = require('./max_row_length'); module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) { - var uidLookup = getUidsFromCalcData(cdheatmaps); + var heatmaps = heatmapLayer.selectAll('g.hm') + .data( + cdheatmaps.map(function(d) { return d[0]; }), + function(cd) { return cd.trace.uid; } + ); - heatmapLayer.selectAll('.hm > image').each(function(d) { - var oldTrace = d.trace || {}; + heatmaps.exit().remove(); - if(!uidLookup[oldTrace.uid]) { - d3.select(this.parentNode).remove(); - } - }); + heatmaps.enter().append('g') + .classed('hm', true); - for(var i = 0; i < cdheatmaps.length; i++) { - plotOne(gd, plotinfo, cdheatmaps[i], heatmapLayer); - } + heatmaps.each(function(cd) { + plotOne(gd, plotinfo, cd, d3.select(this)); + }).order(); }; -function plotOne(gd, plotinfo, cd, heatmapLayer) { - var cd0 = cd[0]; - var trace = cd0.trace; +function plotOne(gd, plotinfo, cd, plotGroup) { + var trace = cd.trace; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; - var id = 'hm' + trace.uid; - var z = cd0.z; - var x = cd0.x; - var y = cd0.y; - var xc = cd0.xCenter; - var yc = cd0.yCenter; + var z = cd.z; + var x = cd.x; + var y = cd.y; + var xc = cd.xCenter; + var yc = cd.yCenter; var isContour = Registry.traceIs(trace, 'contour'); var zsmooth = isContour ? 'best' : trace.zsmooth; @@ -111,8 +109,8 @@ function plotOne(gd, plotinfo, cd, heatmapLayer) { if(isContour) { xc = x; yc = y; - x = cd0.xfill; - y = cd0.yfill; + x = cd.xfill; + y = cd.yfill; } // make an image that goes at most half a screen off either side, to keep @@ -135,16 +133,11 @@ function plotOne(gd, plotinfo, cd, heatmapLayer) { // if image is entirely off-screen, don't even draw it var isOffScreen = (imageWidth <= 0 || imageHeight <= 0); - var plotgroup = heatmapLayer.selectAll('g.hm.' + id) - .data(isOffScreen ? [] : [0]); - - plotgroup.enter().append('g') - .classed('hm', true) - .classed(id, true); - - plotgroup.exit().remove(); - - if(isOffScreen) return; + if(isOffScreen) { + var noImage = plotGroup.selectAll('image').data([]); + noImage.exit().remove(); + return; + } // generate image data @@ -362,8 +355,8 @@ function plotOne(gd, plotinfo, cd, heatmapLayer) { gd._hmpixcount = (gd._hmpixcount||0) + pixcount; gd._hmlumcount = (gd._hmlumcount||0) + pixcount * avgColor.getLuminance(); - var image3 = plotgroup.selectAll('image') - .data(cd); + var image3 = plotGroup.selectAll('image') + .data([cd]); image3.enter().append('svg:image').attr({ xmlns: xmlnsNamespaces.svg, @@ -377,8 +370,6 @@ function plotOne(gd, plotinfo, cd, heatmapLayer) { y: top, 'xlink:href': canvas.toDataURL('image/png') }); - - image3.exit().remove(); } // get interpolated bin value. Returns {bin0:closest bin, frac:fractional dist to next, bin1:next bin} diff --git a/test/jasmine/tests/heatmap_test.js b/test/jasmine/tests/heatmap_test.js index 692a6513d88..28e18931514 100644 --- a/test/jasmine/tests/heatmap_test.js +++ b/test/jasmine/tests/heatmap_test.js @@ -479,15 +479,20 @@ describe('heatmap calc', function() { describe('heatmap plot', function() { 'use strict'; + var gd; + + beforeEach(function() { + gd = createGraphDiv(); + }); + afterEach(destroyGraphDiv); it('should not draw traces that are off-screen', function(done) { - var mock = require('@mocks/heatmap_multi-trace.json'), - mockCopy = Lib.extendDeep({}, mock), - gd = createGraphDiv(); + var mock = require('@mocks/heatmap_multi-trace.json'); + var mockCopy = Lib.extendDeep({}, mock); function assertImageCnt(cnt) { - var images = d3.selectAll('.hm').select('image'); + var images = d3.selectAll('.hm image'); expect(images.size()).toEqual(cnt); } @@ -502,15 +507,44 @@ describe('heatmap plot', function() { return Plotly.relayout(gd, 'xaxis.autorange', true); }).then(function() { assertImageCnt(5); + }) + .catch(failTest) + .then(done); + }); - done(); - }); + it('keeps the correct ordering after hide and show', function(done) { + function getIndices() { + var out = []; + d3.selectAll('.hm image').each(function(d) { out.push(d.trace.index); }); + return out; + } + + Plotly.newPlot(gd, [{ + type: 'heatmap', + z: [[1, 2], [3, 4]] + }, { + type: 'heatmap', + z: [[2, 1], [4, 3]], + contours: {coloring: 'lines'} + }]) + .then(function() { + expect(getIndices()).toEqual([0, 1]); + return Plotly.restyle(gd, 'visible', false, [0]); + }) + .then(function() { + expect(getIndices()).toEqual([1]); + return Plotly.restyle(gd, 'visible', true, [0]); + }) + .then(function() { + expect(getIndices()).toEqual([0, 1]); + }) + .catch(failTest) + .then(done); }); it('should be able to restyle', function(done) { - var mock = require('@mocks/13.json'), - mockCopy = Lib.extendDeep({}, mock), - gd = createGraphDiv(); + var mock = require('@mocks/13.json'); + var mockCopy = Lib.extendDeep({}, mock); function getImageURL() { return d3.select('.hm > image').attr('href'); @@ -538,19 +572,18 @@ describe('heatmap plot', function() { imageURLs.push(getImageURL()); expect(imageURLs[1]).toEqual(imageURLs[3]); - - done(); - }); + }) + .catch(failTest) + .then(done); }); it('draws canvas with correct margins', function(done) { - var mockWithPadding = require('@mocks/heatmap_brick_padding.json'), - mockWithoutPadding = Lib.extendDeep({}, mockWithPadding), - gd = createGraphDiv(), - getContextStub = { - fillRect: jasmine.createSpy() - }, - originalCreateElement = document.createElement; + var mockWithPadding = require('@mocks/heatmap_brick_padding.json'); + var mockWithoutPadding = Lib.extendDeep({}, mockWithPadding); + var getContextStub = { + fillRect: jasmine.createSpy() + }; + var originalCreateElement = document.createElement; mockWithoutPadding.data[0].xgap = 0; mockWithoutPadding.data[0].ygap = 0; @@ -591,7 +624,6 @@ describe('heatmap plot', function() { }); it('can change z values with connected gaps', function(done) { - var gd = createGraphDiv(); Plotly.newPlot(gd, [{ type: 'heatmap', connectgaps: true, z: [[1, 2], [null, 4], [1, 2]] @@ -615,7 +647,7 @@ describe('heatmap plot', function() { .then(function() { expect(gd.calcdata[0][0].z).toEqual([[1, 2], [2, 4], [1, 2]]); }) - .catch(fail) + .catch(failTest) .then(done); }); }); From 8faefde0f1ddb7e9fa6fd94b11a00adead238aa5 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Thu, 16 Aug 2018 18:53:22 -0400 Subject: [PATCH 02/10] fix dynamic ordering of carpets, and :hocho: getUidsFromCalcData --- src/plots/get_data.js | 17 ----------- src/traces/carpet/plot.js | 47 +++++++++++++++---------------- test/jasmine/tests/carpet_test.js | 33 ++++++++++++++++++++++ 3 files changed, 55 insertions(+), 42 deletions(-) diff --git a/src/plots/get_data.js b/src/plots/get_data.js index de6710a5159..3455d50fa7c 100644 --- a/src/plots/get_data.js +++ b/src/plots/get_data.js @@ -124,20 +124,3 @@ exports.getSubplotData = function getSubplotData(data, type, subplotId) { return subplotData; }; - -/** - * Get a lookup object of trace uids corresponding in a given calcdata array. - * - * @param {array} calcdata: as in gd.calcdata (or a subset) - * @return {object} lookup object of uids (`uid: 1`) - */ -exports.getUidsFromCalcData = function(calcdata) { - var out = {}; - - for(var i = 0; i < calcdata.length; i++) { - var trace = calcdata[i][0].trace; - out[trace.uid] = 1; - } - - return out; -}; diff --git a/src/traces/carpet/plot.js b/src/traces/carpet/plot.js index c1a04ba4087..966f7666002 100644 --- a/src/traces/carpet/plot.js +++ b/src/traces/carpet/plot.js @@ -17,37 +17,34 @@ var orientText = require('./orient_text'); var svgTextUtils = require('../../lib/svg_text_utils'); var Lib = require('../../lib'); var alignmentConstants = require('../../constants/alignment'); -var getUidsFromCalcData = require('../../plots/get_data').getUidsFromCalcData; module.exports = function plot(gd, plotinfo, cdcarpet, carpetLayer) { - var uidLookup = getUidsFromCalcData(cdcarpet); + var carpets = carpetLayer.selectAll('g.trace') + .data( + cdcarpet.map(function(d) { return d[0]; }), + function(cd) { return cd.trace.uid; } + ); - carpetLayer.selectAll('g.trace').each(function() { - var classString = d3.select(this).attr('class'); - var oldUid = classString.split('carpet')[1].split(/\s/)[0]; + carpets.exit().remove(); - if(!uidLookup[oldUid]) { - d3.select(this).remove(); - } - }); + carpets.enter().append('g') + .classed('trace', true); - for(var i = 0; i < cdcarpet.length; i++) { - plotOne(gd, plotinfo, cdcarpet[i], carpetLayer); - } + carpets.each(function(cd) { + plotOne(gd, plotinfo, cd, d3.select(this)); + }).order(); }; -function plotOne(gd, plotinfo, cd, carpetLayer) { - var t = cd[0]; - var trace = cd[0].trace, - xa = plotinfo.xaxis, - ya = plotinfo.yaxis, - aax = trace.aaxis, - bax = trace.baxis, - fullLayout = gd._fullLayout; +function plotOne(gd, plotinfo, cd, axisLayer) { + var trace = cd.trace; + var xa = plotinfo.xaxis; + var ya = plotinfo.yaxis; + var aax = trace.aaxis; + var bax = trace.baxis; + var fullLayout = gd._fullLayout; var clipLayer = fullLayout._clips; - var axisLayer = Lib.ensureSingle(carpetLayer, 'g', 'carpet' + trace.uid).classed('trace', true); var minorLayer = Lib.ensureSingle(axisLayer, 'g', 'minorlayer'); var majorLayer = Lib.ensureSingle(axisLayer, 'g', 'majorlayer'); var boundaryLayer = Lib.ensureSingle(axisLayer, 'g', 'boundarylayer'); @@ -65,12 +62,12 @@ function plotOne(gd, plotinfo, cd, carpetLayer) { drawGridLines(xa, ya, boundaryLayer, aax, 'a-boundary', aax._boundarylines); drawGridLines(xa, ya, boundaryLayer, bax, 'b-boundary', bax._boundarylines); - var labelOrientationA = drawAxisLabels(gd, xa, ya, trace, t, labelLayer, aax._labels, 'a-label'); - var labelOrientationB = drawAxisLabels(gd, xa, ya, trace, t, labelLayer, bax._labels, 'b-label'); + var labelOrientationA = drawAxisLabels(gd, xa, ya, trace, cd, labelLayer, aax._labels, 'a-label'); + var labelOrientationB = drawAxisLabels(gd, xa, ya, trace, cd, labelLayer, bax._labels, 'b-label'); - drawAxisTitles(gd, labelLayer, trace, t, xa, ya, labelOrientationA, labelOrientationB); + drawAxisTitles(gd, labelLayer, trace, cd, xa, ya, labelOrientationA, labelOrientationB); - drawClipPath(trace, t, clipLayer, xa, ya); + drawClipPath(trace, cd, clipLayer, xa, ya); } function drawClipPath(trace, t, layer, xaxis, yaxis) { diff --git a/test/jasmine/tests/carpet_test.js b/test/jasmine/tests/carpet_test.js index 3e784c9772b..ca5896c1c0d 100644 --- a/test/jasmine/tests/carpet_test.js +++ b/test/jasmine/tests/carpet_test.js @@ -537,6 +537,39 @@ describe('Test carpet interactions:', function() { .catch(failTest) .then(done); }); + + it('preserves order of carpets on the same subplot after hide/show', function(done) { + function getIndices() { + var out = []; + d3.selectAll('.carpetlayer .trace').each(function(d) { out.push(d.trace.index); }); + return out; + } + + Plotly.newPlot(gd, [{ + type: 'carpet', + a: [1, 2, 3], + b: [1, 2, 3], + y: [[0, 0.8, 2], [1.2, 2, 3.2], [2, 2.8, 4]] + }, { + type: 'carpet', + a: [1, 2, 3], + b: [1, 2, 3], + y: [[10, 10.8, 12], [11.2, 12, 13.2], [12, 12.8, 14]] + }]) + .then(function() { + expect(getIndices()).toEqual([0, 1]); + return Plotly.restyle(gd, 'visible', false, [0]); + }) + .then(function() { + expect(getIndices()).toEqual([1]); + return Plotly.restyle(gd, 'visible', true, [0]); + }) + .then(function() { + expect(getIndices()).toEqual([0, 1]); + }) + .catch(failTest) + .then(done); + }); }); describe('scattercarpet array attributes', function() { From 4e01efec4136d8427aa4aa478e5f5f84e71c2afc Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Thu, 16 Aug 2018 22:03:48 -0400 Subject: [PATCH 03/10] DRY trace group management for (nearly) all cartesian traces (all except scatter because of its animations) --- src/plots/cartesian/make_trace_groups.js | 48 ++++ src/traces/bar/plot.js | 207 ++++++++------- src/traces/box/plot.js | 97 ++++--- src/traces/carpet/plot.js | 27 +- src/traces/contour/plot.js | 37 +-- src/traces/contour/style.js | 4 +- src/traces/contourcarpet/plot.js | 14 +- src/traces/heatmap/plot.js | 36 +-- src/traces/ohlc/plot.js | 69 +++-- src/traces/violin/plot.js | 309 +++++++++++------------ test/jasmine/tests/carpet_test.js | 4 +- test/jasmine/tests/contour_test.js | 2 +- 12 files changed, 414 insertions(+), 440 deletions(-) create mode 100644 src/plots/cartesian/make_trace_groups.js diff --git a/src/plots/cartesian/make_trace_groups.js b/src/plots/cartesian/make_trace_groups.js new file mode 100644 index 00000000000..7c4e73e3ae0 --- /dev/null +++ b/src/plots/cartesian/make_trace_groups.js @@ -0,0 +1,48 @@ +/** +* Copyright 2012-2018, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + + +'use strict'; + +var d3 = require('d3'); + +/** + * helper for cartesian trace types to manage trace groups and plot traces + * into them + * + * @param {div} gd: plot div + * @param {object} plotinfo: the cartesian subplot info object + * @param {array} cdModule: array of calcdata items for this + * module and subplot combination + * @param {d3.selection} traceLayer: a selection containing a single group + * to draw these traces into + * @param {string} cls: the class attribute to give each trace group + * so you can give multiple classes separated by spaces + * @param {function} plotOneFn: a function that will plot one trace + * takes arguments: + * gd + * plotinfo + * cd: calcdata array for this one trace + * plotGroup: d3 selection of the single group to draw into + */ +module.exports = function makeTraceGroups(gd, plotinfo, cdModule, traceLayer, cls, plotOneFn) { + var traces = traceLayer.selectAll('g.' + cls.replace(/\s/g, '.')) + .data(cdModule, function(cd) { return cd[0].trace.uid; }); + + traces.exit().remove(); + + traces.enter().append('g') + .attr('class', cls); + + traces.each(function(cd) { + plotOneFn(gd, plotinfo, cd, d3.select(this)); + }) + .order(); + + return traces; +}; diff --git a/src/traces/bar/plot.js b/src/traces/bar/plot.js index 309f6eca7c4..c8802bc2567 100644 --- a/src/traces/bar/plot.js +++ b/src/traces/bar/plot.js @@ -19,6 +19,7 @@ var svgTextUtils = require('../../lib/svg_text_utils'); var Color = require('../../components/color'); var Drawing = require('../../components/drawing'); var Registry = require('../../registry'); +var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); var attributes = require('./attributes'), attributeText = attributes.text, @@ -31,138 +32,128 @@ var attributes = require('./attributes'), var TEXTPAD = 3; module.exports = function plot(gd, plotinfo, cdbar, barLayer) { + var bartraces = makeTraceGroups(gd, plotinfo, cdbar, barLayer, 'trace bars', plotOne); + + // error bars are on the top + Registry.getComponentMethod('errorbars', 'plot')(bartraces, plotinfo); +}; + +function plotOne(gd, plotinfo, cd, plotGroup) { var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; var fullLayout = gd._fullLayout; + var cd0 = cd[0]; + var t = cd0.t; + var trace = cd0.trace; - var bartraces = barLayer.selectAll('g.trace.bars') - .data(cdbar, function(d) { return d[0].trace.uid; }); - - bartraces.enter().append('g') - .attr('class', 'trace bars') - .append('g') - .attr('class', 'points'); - - bartraces.exit().remove(); - - bartraces.order(); + if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; - bartraces.each(function(d) { - var cd0 = d[0]; - var t = cd0.t; - var trace = cd0.trace; - var sel = d3.select(this); + var poffset = t.poffset; + var poffsetIsArray = Array.isArray(poffset); - if(!plotinfo.isRangePlot) cd0.node3 = sel; + var pointGroup = Lib.ensureSingle(plotGroup, 'g', 'points'); - var poffset = t.poffset; - var poffsetIsArray = Array.isArray(poffset); + var bars = pointGroup.selectAll('g.point').data(Lib.identity); - var bars = sel.select('g.points').selectAll('g.point').data(Lib.identity); + bars.enter().append('g') + .classed('point', true); - bars.enter().append('g') - .classed('point', true); + bars.exit().remove(); - bars.exit().remove(); + bars.each(function(di, i) { + var bar = d3.select(this); - bars.each(function(di, i) { - var bar = d3.select(this); + // now display the bar + // clipped xf/yf (2nd arg true): non-positive + // log values go off-screen by plotwidth + // so you see them continue if you drag the plot + var p0 = di.p + ((poffsetIsArray) ? poffset[i] : poffset), + p1 = p0 + di.w, + s0 = di.b, + s1 = s0 + di.s; - // now display the bar - // clipped xf/yf (2nd arg true): non-positive - // log values go off-screen by plotwidth - // so you see them continue if you drag the plot - var p0 = di.p + ((poffsetIsArray) ? poffset[i] : poffset), - p1 = p0 + di.w, - s0 = di.b, - s1 = s0 + di.s; + var x0, x1, y0, y1; + if(trace.orientation === 'h') { + y0 = ya.c2p(p0, true); + y1 = ya.c2p(p1, true); + x0 = xa.c2p(s0, true); + x1 = xa.c2p(s1, true); - var x0, x1, y0, y1; - if(trace.orientation === 'h') { - y0 = ya.c2p(p0, true); - y1 = ya.c2p(p1, true); - x0 = xa.c2p(s0, true); - x1 = xa.c2p(s1, true); - - // for selections - di.ct = [x1, (y0 + y1) / 2]; - } - else { - x0 = xa.c2p(p0, true); - x1 = xa.c2p(p1, true); - y0 = ya.c2p(s0, true); - y1 = ya.c2p(s1, true); - - // for selections - di.ct = [(x0 + x1) / 2, y1]; - } + // for selections + di.ct = [x1, (y0 + y1) / 2]; + } + else { + x0 = xa.c2p(p0, true); + x1 = xa.c2p(p1, true); + y0 = ya.c2p(s0, true); + y1 = ya.c2p(s1, true); - if(!isNumeric(x0) || !isNumeric(x1) || - !isNumeric(y0) || !isNumeric(y1) || - x0 === x1 || y0 === y1) { - bar.remove(); - return; - } + // for selections + di.ct = [(x0 + x1) / 2, y1]; + } - var lw = (di.mlw + 1 || trace.marker.line.width + 1 || - (di.trace ? di.trace.marker.line.width : 0) + 1) - 1, - offset = d3.round((lw / 2) % 1, 2); + if(!isNumeric(x0) || !isNumeric(x1) || + !isNumeric(y0) || !isNumeric(y1) || + x0 === x1 || y0 === y1) { + bar.remove(); + return; + } - function roundWithLine(v) { - // if there are explicit gaps, don't round, - // it can make the gaps look crappy - return (fullLayout.bargap === 0 && fullLayout.bargroupgap === 0) ? - d3.round(Math.round(v) - offset, 2) : v; - } + var lw = (di.mlw + 1 || trace.marker.line.width + 1 || + (di.trace ? di.trace.marker.line.width : 0) + 1) - 1, + offset = d3.round((lw / 2) % 1, 2); - function expandToVisible(v, vc) { - // if it's not in danger of disappearing entirely, - // round more precisely - return Math.abs(v - vc) >= 2 ? roundWithLine(v) : - // but if it's very thin, expand it so it's - // necessarily visible, even if it might overlap - // its neighbor - (v > vc ? Math.ceil(v) : Math.floor(v)); - } + function roundWithLine(v) { + // if there are explicit gaps, don't round, + // it can make the gaps look crappy + return (fullLayout.bargap === 0 && fullLayout.bargroupgap === 0) ? + d3.round(Math.round(v) - offset, 2) : v; + } - if(!gd._context.staticPlot) { - // if bars are not fully opaque or they have a line - // around them, round to integer pixels, mainly for - // safari so we prevent overlaps from its expansive - // pixelation. if the bars ARE fully opaque and have - // no line, expand to a full pixel to make sure we - // can see them - var op = Color.opacity(di.mc || trace.marker.color), - fixpx = (op < 1 || lw > 0.01) ? - roundWithLine : expandToVisible; - x0 = fixpx(x0, x1); - x1 = fixpx(x1, x0); - y0 = fixpx(y0, y1); - y1 = fixpx(y1, y0); - } + function expandToVisible(v, vc) { + // if it's not in danger of disappearing entirely, + // round more precisely + return Math.abs(v - vc) >= 2 ? roundWithLine(v) : + // but if it's very thin, expand it so it's + // necessarily visible, even if it might overlap + // its neighbor + (v > vc ? Math.ceil(v) : Math.floor(v)); + } - Lib.ensureSingle(bar, 'path') - .style('vector-effect', 'non-scaling-stroke') - .attr('d', - 'M' + x0 + ',' + y0 + 'V' + y1 + 'H' + x1 + 'V' + y0 + 'Z') - .call(Drawing.setClipUrl, plotinfo.layerClipId); + if(!gd._context.staticPlot) { + // if bars are not fully opaque or they have a line + // around them, round to integer pixels, mainly for + // safari so we prevent overlaps from its expansive + // pixelation. if the bars ARE fully opaque and have + // no line, expand to a full pixel to make sure we + // can see them + var op = Color.opacity(di.mc || trace.marker.color), + fixpx = (op < 1 || lw > 0.01) ? + roundWithLine : expandToVisible; + x0 = fixpx(x0, x1); + x1 = fixpx(x1, x0); + y0 = fixpx(y0, y1); + y1 = fixpx(y1, y0); + } - appendBarText(gd, bar, d, i, x0, x1, y0, y1); + Lib.ensureSingle(bar, 'path') + .style('vector-effect', 'non-scaling-stroke') + .attr('d', + 'M' + x0 + ',' + y0 + 'V' + y1 + 'H' + x1 + 'V' + y0 + 'Z') + .call(Drawing.setClipUrl, plotinfo.layerClipId); - if(plotinfo.layerClipId) { - Drawing.hideOutsideRangePoint(d[i], bar.select('text'), xa, ya, trace.xcalendar, trace.ycalendar); - } - }); + appendBarText(gd, bar, cd, i, x0, x1, y0, y1); - // lastly, clip points groups of `cliponaxis !== false` traces - // on `plotinfo._hasClipOnAxisFalse === true` subplots - var hasClipOnAxisFalse = d[0].trace.cliponaxis === false; - Drawing.setClipUrl(sel, hasClipOnAxisFalse ? null : plotinfo.layerClipId); + if(plotinfo.layerClipId) { + Drawing.hideOutsideRangePoint(di, bar.select('text'), xa, ya, trace.xcalendar, trace.ycalendar); + } }); - // error bars are on the top - Registry.getComponentMethod('errorbars', 'plot')(bartraces, plotinfo); -}; + // lastly, clip points groups of `cliponaxis !== false` traces + // on `plotinfo._hasClipOnAxisFalse === true` subplots + var hasClipOnAxisFalse = cd0.trace.cliponaxis === false; + Drawing.setClipUrl(plotGroup, hasClipOnAxisFalse ? null : plotinfo.layerClipId); +} function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { var textPosition; diff --git a/src/traces/box/plot.js b/src/traces/box/plot.js index afc98857029..e3ed5e03dfc 100644 --- a/src/traces/box/plot.js +++ b/src/traces/box/plot.js @@ -12,71 +12,62 @@ var d3 = require('d3'); var Lib = require('../../lib'); var Drawing = require('../../components/drawing'); +var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); // constants for dynamic jitter (ie less jitter for sparser points) var JITTERCOUNT = 5; // points either side of this to include var JITTERSPREAD = 0.01; // fraction of IQR to count as "dense" function plot(gd, plotinfo, cdbox, boxLayer) { + makeTraceGroups(gd, plotinfo, cdbox, boxLayer, 'trace boxes', plotOne); +} + +function plotOne(gd, plotinfo, cd, plotGroup) { var fullLayout = gd._fullLayout; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; + var cd0 = cd[0]; + var t = cd0.t; + var trace = cd0.trace; + if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; + var numBoxes = fullLayout._numBoxes; + + var groupFraction = (1 - fullLayout.boxgap); + + var group = (fullLayout.boxmode === 'group' && numBoxes > 1); + // box half width + var bdPos = t.dPos * groupFraction * (1 - fullLayout.boxgroupgap) / (group ? numBoxes : 1); + // box center offset + var bPos = group ? 2 * t.dPos * (-0.5 + (t.num + 0.5) / numBoxes) * groupFraction : 0; + // whisker width + var wdPos = bdPos * trace.whiskerwidth; + + if(trace.visible !== true || t.empty) { + plotGroup.remove(); + return; + } - var boxtraces = boxLayer.selectAll('g.trace.boxes') - .data(cdbox, function(d) { return d[0].trace.uid; }); - - boxtraces.enter().append('g') - .attr('class', 'trace boxes'); - - boxtraces.exit().remove(); - - boxtraces.order(); - - boxtraces.each(function(d) { - var cd0 = d[0]; - var t = cd0.t; - var trace = cd0.trace; - var sel = d3.select(this); - if(!plotinfo.isRangePlot) cd0.node3 = sel; - var numBoxes = fullLayout._numBoxes; - - var groupFraction = (1 - fullLayout.boxgap); - - var group = (fullLayout.boxmode === 'group' && numBoxes > 1); - // box half width - var bdPos = t.dPos * groupFraction * (1 - fullLayout.boxgroupgap) / (group ? numBoxes : 1); - // box center offset - var bPos = group ? 2 * t.dPos * (-0.5 + (t.num + 0.5) / numBoxes) * groupFraction : 0; - // whisker width - var wdPos = bdPos * trace.whiskerwidth; - - if(trace.visible !== true || t.empty) { - sel.remove(); - return; - } - - var posAxis, valAxis; + var posAxis, valAxis; - if(trace.orientation === 'h') { - posAxis = ya; - valAxis = xa; - } else { - posAxis = xa; - valAxis = ya; - } + if(trace.orientation === 'h') { + posAxis = ya; + valAxis = xa; + } else { + posAxis = xa; + valAxis = ya; + } - // save the box size and box position for use by hover - t.bPos = bPos; - t.bdPos = bdPos; - t.wdPos = wdPos; - // half-width within which to accept hover for this box - // always split the distance to the closest box - t.wHover = t.dPos * (group ? groupFraction / numBoxes : 1); - - plotBoxAndWhiskers(sel, {pos: posAxis, val: valAxis}, trace, t); - plotPoints(sel, {x: xa, y: ya}, trace, t); - plotBoxMean(sel, {pos: posAxis, val: valAxis}, trace, t); - }); + // save the box size and box position for use by hover + t.bPos = bPos; + t.bdPos = bdPos; + t.wdPos = wdPos; + // half-width within which to accept hover for this box + // always split the distance to the closest box + t.wHover = t.dPos * (group ? groupFraction / numBoxes : 1); + + plotBoxAndWhiskers(plotGroup, {pos: posAxis, val: valAxis}, trace, t); + plotPoints(plotGroup, {x: xa, y: ya}, trace, t); + plotBoxMean(plotGroup, {pos: posAxis, val: valAxis}, trace, t); } function plotBoxAndWhiskers(sel, axes, trace, t) { diff --git a/src/traces/carpet/plot.js b/src/traces/carpet/plot.js index 966f7666002..86fdf8a0b1d 100644 --- a/src/traces/carpet/plot.js +++ b/src/traces/carpet/plot.js @@ -17,26 +17,15 @@ var orientText = require('./orient_text'); var svgTextUtils = require('../../lib/svg_text_utils'); var Lib = require('../../lib'); var alignmentConstants = require('../../constants/alignment'); +var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); module.exports = function plot(gd, plotinfo, cdcarpet, carpetLayer) { - var carpets = carpetLayer.selectAll('g.trace') - .data( - cdcarpet.map(function(d) { return d[0]; }), - function(cd) { return cd.trace.uid; } - ); - - carpets.exit().remove(); - - carpets.enter().append('g') - .classed('trace', true); - - carpets.each(function(cd) { - plotOne(gd, plotinfo, cd, d3.select(this)); - }).order(); + makeTraceGroups(gd, plotinfo, cdcarpet, carpetLayer, 'trace', plotOne); }; function plotOne(gd, plotinfo, cd, axisLayer) { - var trace = cd.trace; + var cd0 = cd[0]; + var trace = cd0.trace; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; var aax = trace.aaxis; @@ -62,12 +51,12 @@ function plotOne(gd, plotinfo, cd, axisLayer) { drawGridLines(xa, ya, boundaryLayer, aax, 'a-boundary', aax._boundarylines); drawGridLines(xa, ya, boundaryLayer, bax, 'b-boundary', bax._boundarylines); - var labelOrientationA = drawAxisLabels(gd, xa, ya, trace, cd, labelLayer, aax._labels, 'a-label'); - var labelOrientationB = drawAxisLabels(gd, xa, ya, trace, cd, labelLayer, bax._labels, 'b-label'); + var labelOrientationA = drawAxisLabels(gd, xa, ya, trace, cd0, labelLayer, aax._labels, 'a-label'); + var labelOrientationB = drawAxisLabels(gd, xa, ya, trace, cd0, labelLayer, bax._labels, 'b-label'); - drawAxisTitles(gd, labelLayer, trace, cd, xa, ya, labelOrientationA, labelOrientationB); + drawAxisTitles(gd, labelLayer, trace, cd0, xa, ya, labelOrientationA, labelOrientationB); - drawClipPath(trace, cd, clipLayer, xa, ya); + drawClipPath(trace, cd0, clipLayer, xa, ya); } function drawClipPath(trace, t, layer, xaxis, yaxis) { diff --git a/src/traces/contour/plot.js b/src/traces/contour/plot.js index e0e11f7fb34..e3cb5f08679 100644 --- a/src/traces/contour/plot.js +++ b/src/traces/contour/plot.js @@ -16,6 +16,7 @@ var Drawing = require('../../components/drawing'); var svgTextUtils = require('../../lib/svg_text_utils'); var Axes = require('../../plots/cartesian/axes'); var setConvert = require('../../plots/cartesian/set_convert'); +var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); var heatmapPlot = require('../heatmap/plot'); var makeCrossings = require('./make_crossings'); @@ -27,37 +28,19 @@ var constants = require('./constants'); var costConstants = constants.LABELOPTIMIZER; exports.plot = function plot(gd, plotinfo, cdcontours, contourLayer) { - plotWrapper(gd, plotinfo, cdcontours, contourLayer, plotOne); + makeTraceGroups(gd, plotinfo, cdcontours, contourLayer, 'contour', plotOne); }; -function plotWrapper(gd, plotinfo, cdcontours, contourLayer, plotOneFn) { - var contours = contourLayer.selectAll('g.contour') - .data( - cdcontours.map(function(d) { return d[0]; }), - function(cd) { return cd.trace.uid; } - ); - - contours.exit().remove(); - - contours.enter().append('g') - .classed('contour', true); - - contours.each(function(cd) { - plotOneFn(gd, plotinfo, cd, d3.select(this)); - }) - .order(); -} -exports.plotWrapper = plotWrapper; - function plotOne(gd, plotinfo, cd, plotGroup) { - var trace = cd.trace; - var x = cd.x; - var y = cd.y; + var cd0 = cd[0]; + var trace = cd0.trace; + var x = cd0.x; + var y = cd0.y; var contours = trace.contours; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; var fullLayout = gd._fullLayout; - var pathinfo = emptyPathinfo(contours, plotinfo, cd); + var pathinfo = emptyPathinfo(contours, plotinfo, cd0); // use a heatmap to fill - draw it behind the lines var heatmapColoringLayer = Lib.ensureSingle(plotGroup, 'g', 'heatmapcoloring'); @@ -69,7 +52,7 @@ function plotOne(gd, plotinfo, cd, plotGroup) { trace._input.zmax = trace.zmax = trace.zmin + pathinfo.length * contours.size; } - cdheatmaps = [[cd]]; + cdheatmaps = [cd]; } heatmapPlot(gd, plotinfo, cdheatmaps, heatmapColoringLayer); @@ -96,8 +79,8 @@ function plotOne(gd, plotinfo, cd, plotGroup) { // draw everything makeBackground(plotGroup, perimeter, contours); makeFills(plotGroup, fillPathinfo, perimeter, contours); - makeLinesAndLabels(plotGroup, pathinfo, gd, cd, contours, perimeter); - clipGaps(plotGroup, plotinfo, fullLayout._clips, cd, perimeter); + makeLinesAndLabels(plotGroup, pathinfo, gd, cd0, contours, perimeter); + clipGaps(plotGroup, plotinfo, fullLayout._clips, cd0, perimeter); } function makeBackground(plotgroup, perimeter, contours) { diff --git a/src/traces/contour/style.js b/src/traces/contour/style.js index dfbd81b88f4..f7005a03d14 100644 --- a/src/traces/contour/style.js +++ b/src/traces/contour/style.js @@ -21,12 +21,12 @@ module.exports = function style(gd) { var contours = d3.select(gd).selectAll('g.contour'); contours.style('opacity', function(d) { - return d.trace.opacity; + return d[0].trace.opacity; }); contours.each(function(d) { var c = d3.select(this); - var trace = d.trace; + var trace = d[0].trace; var contours = trace.contours; var line = trace.line; var cs = contours.size || 1; diff --git a/src/traces/contourcarpet/plot.js b/src/traces/contourcarpet/plot.js index 6b1a9eb2784..fc9f1087347 100644 --- a/src/traces/contourcarpet/plot.js +++ b/src/traces/contourcarpet/plot.js @@ -13,6 +13,7 @@ var map1dArray = require('../carpet/map_1d_array'); var makepath = require('../carpet/makepath'); var Drawing = require('../../components/drawing'); var Lib = require('../../lib'); +var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); var makeCrossings = require('../contour/make_crossings'); var findAllPaths = require('../contour/find_all_paths'); @@ -26,23 +27,24 @@ var lookupCarpet = require('../carpet/lookup_carpetid'); var closeBoundaries = require('../contour/close_boundaries'); module.exports = function plot(gd, plotinfo, cdcontours, contourcarpetLayer) { - contourPlot.plotWrapper(gd, plotinfo, cdcontours, contourcarpetLayer, plotOne); + makeTraceGroups(gd, plotinfo, cdcontours, contourcarpetLayer, 'contour', plotOne); }; function plotOne(gd, plotinfo, cd, plotGroup) { - var trace = cd.trace; + var cd0 = cd[0]; + var trace = cd0.trace; var carpet = trace._carpetTrace = lookupCarpet(gd, trace); var carpetcd = gd.calcdata[carpet.index][0]; if(!carpet.visible || carpet.visible === 'legendonly') return; - var a = cd.a; - var b = cd.b; + var a = cd0.a; + var b = cd0.b; var contours = trace.contours; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; - var pathinfo = emptyPathinfo(contours, plotinfo, cd); + var pathinfo = emptyPathinfo(contours, plotinfo, cd0); var isConstraint = contours.type === 'constraint'; var operation = contours._operation; var coloring = isConstraint ? (operation === '=' ? 'lines' : 'fill') : contours.coloring; @@ -110,7 +112,7 @@ function plotOne(gd, plotinfo, cd, plotGroup) { makeFills(trace, plotGroup, xa, ya, fillPathinfo, perimeter, ab2p, carpet, carpetcd, coloring, boundaryPath); // Draw contour lines: - makeLinesAndLabels(plotGroup, pathinfo, gd, cd, contours, plotinfo, carpet); + makeLinesAndLabels(plotGroup, pathinfo, gd, cd0, contours, plotinfo, carpet); // Clip the boundary of the plot Drawing.setClipUrl(plotGroup, carpet._clipPathId); diff --git a/src/traces/heatmap/plot.js b/src/traces/heatmap/plot.js index 6976b62eb1c..5406136f62a 100644 --- a/src/traces/heatmap/plot.js +++ b/src/traces/heatmap/plot.js @@ -9,43 +9,31 @@ 'use strict'; -var d3 = require('d3'); var tinycolor = require('tinycolor2'); var Registry = require('../../registry'); var Lib = require('../../lib'); var Colorscale = require('../../components/colorscale'); var xmlnsNamespaces = require('../../constants/xmlns_namespaces'); +var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); var maxRowLength = require('./max_row_length'); module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) { - var heatmaps = heatmapLayer.selectAll('g.hm') - .data( - cdheatmaps.map(function(d) { return d[0]; }), - function(cd) { return cd.trace.uid; } - ); - - heatmaps.exit().remove(); - - heatmaps.enter().append('g') - .classed('hm', true); - - heatmaps.each(function(cd) { - plotOne(gd, plotinfo, cd, d3.select(this)); - }).order(); + makeTraceGroups(gd, plotinfo, cdheatmaps, heatmapLayer, 'hm', plotOne); }; function plotOne(gd, plotinfo, cd, plotGroup) { - var trace = cd.trace; + var cd0 = cd[0]; + var trace = cd0.trace; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; - var z = cd.z; - var x = cd.x; - var y = cd.y; - var xc = cd.xCenter; - var yc = cd.yCenter; + var z = cd0.z; + var x = cd0.x; + var y = cd0.y; + var xc = cd0.xCenter; + var yc = cd0.yCenter; var isContour = Registry.traceIs(trace, 'contour'); var zsmooth = isContour ? 'best' : trace.zsmooth; @@ -109,8 +97,8 @@ function plotOne(gd, plotinfo, cd, plotGroup) { if(isContour) { xc = x; yc = y; - x = cd.xfill; - y = cd.yfill; + x = cd0.xfill; + y = cd0.yfill; } // make an image that goes at most half a screen off either side, to keep @@ -356,7 +344,7 @@ function plotOne(gd, plotinfo, cd, plotGroup) { gd._hmlumcount = (gd._hmlumcount||0) + pixcount * avgColor.getLuminance(); var image3 = plotGroup.selectAll('image') - .data([cd]); + .data(cd); image3.enter().append('svg:image').attr({ xmlns: xmlnsNamespaces.svg, diff --git a/src/traces/ohlc/plot.js b/src/traces/ohlc/plot.js index f915612c957..e2e8c28e17e 100644 --- a/src/traces/ohlc/plot.js +++ b/src/traces/ohlc/plot.js @@ -8,57 +8,46 @@ 'use strict'; -var d3 = require('d3'); - var Lib = require('../../lib'); +var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); module.exports = function plot(gd, plotinfo, cdOHLC, ohlcLayer) { + makeTraceGroups(gd, plotinfo, cdOHLC, ohlcLayer, 'trace ohlc', plotOne); +}; + +function plotOne(gd, plotinfo, cd, plotGroup) { var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; + var cd0 = cd[0]; + var t = cd0.t; + var trace = cd0.trace; + if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; - var traces = ohlcLayer.selectAll('g.trace') - .data(cdOHLC, function(d) { return d[0].trace.uid; }); - - traces.enter().append('g') - .attr('class', 'trace ohlc'); - - traces.exit().remove(); + if(trace.visible !== true || t.empty) { + plotGroup.remove(); + return; + } - traces.order(); + var tickLen = t.tickLen; - traces.each(function(d) { - var cd0 = d[0]; - var t = cd0.t; - var trace = cd0.trace; - var sel = d3.select(this); - if(!plotinfo.isRangePlot) cd0.node3 = sel; + var paths = plotGroup.selectAll('path').data(Lib.identity); - if(trace.visible !== true || t.empty) { - sel.remove(); - return; - } + paths.enter().append('path'); - var tickLen = t.tickLen; + paths.exit().remove(); - var paths = sel.selectAll('path').data(Lib.identity); + paths.attr('d', function(d) { + var x = xa.c2p(d.pos, true); + var xo = xa.c2p(d.pos - tickLen, true); + var xc = xa.c2p(d.pos + tickLen, true); - paths.enter().append('path'); + var yo = ya.c2p(d.o, true); + var yh = ya.c2p(d.h, true); + var yl = ya.c2p(d.l, true); + var yc = ya.c2p(d.c, true); - paths.exit().remove(); - - paths.attr('d', function(d) { - var x = xa.c2p(d.pos, true); - var xo = xa.c2p(d.pos - tickLen, true); - var xc = xa.c2p(d.pos + tickLen, true); - - var yo = ya.c2p(d.o, true); - var yh = ya.c2p(d.h, true); - var yl = ya.c2p(d.l, true); - var yc = ya.c2p(d.c, true); - - return 'M' + xo + ',' + yo + 'H' + x + - 'M' + x + ',' + yh + 'V' + yl + - 'M' + xc + ',' + yc + 'H' + x; - }); + return 'M' + xo + ',' + yo + 'H' + x + + 'M' + x + ',' + yh + 'V' + yl + + 'M' + xc + ',' + yc + 'H' + x; }); -}; +} diff --git a/src/traces/violin/plot.js b/src/traces/violin/plot.js index 6af773346f0..ed6740207ed 100644 --- a/src/traces/violin/plot.js +++ b/src/traces/violin/plot.js @@ -11,11 +11,17 @@ var d3 = require('d3'); var Lib = require('../../lib'); var Drawing = require('../../components/drawing'); +var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); + var boxPlot = require('../box/plot'); var linePoints = require('../scatter/line_points'); var helpers = require('./helpers'); -module.exports = function plot(gd, plotinfo, cd, violinLayer) { +module.exports = function plot(gd, plotinfo, cdViolins, violinLayer) { + makeTraceGroups(gd, plotinfo, cdViolins, violinLayer, 'trace violins', plotOne); +}; + +function plotOne(gd, plotinfo, cd, plotGroup) { var fullLayout = gd._fullLayout; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; @@ -32,176 +38,163 @@ module.exports = function plot(gd, plotinfo, cd, violinLayer) { return Drawing.smoothopen(segments[0], 1); } - var traces = violinLayer.selectAll('g.trace.violins') - .data(cd, function(d) { return d[0].trace.uid; }); - - traces.enter().append('g') - .attr('class', 'trace violins'); - - traces.exit().remove(); - - traces.order(); - - traces.each(function(d) { - var cd0 = d[0]; - var t = cd0.t; - var trace = cd0.trace; - var sel = d3.select(this); - if(!plotinfo.isRangePlot) cd0.node3 = sel; - var numViolins = fullLayout._numViolins; - var group = (fullLayout.violinmode === 'group' && numViolins > 1); - var groupFraction = 1 - fullLayout.violingap; - // violin max half width - var bdPos = t.bdPos = t.dPos * groupFraction * (1 - fullLayout.violingroupgap) / (group ? numViolins : 1); - // violin center offset - var bPos = t.bPos = group ? 2 * t.dPos * (-0.5 + (t.num + 0.5) / numViolins) * groupFraction : 0; - // half-width within which to accept hover for this violin - // always split the distance to the closest violin - t.wHover = t.dPos * (group ? groupFraction / numViolins : 1); - - if(trace.visible !== true || t.empty) { - d3.select(this).remove(); - return; - } + var cd0 = cd[0]; + var t = cd0.t; + var trace = cd0.trace; + if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; + var numViolins = fullLayout._numViolins; + var group = (fullLayout.violinmode === 'group' && numViolins > 1); + var groupFraction = 1 - fullLayout.violingap; + // violin max half width + var bdPos = t.bdPos = t.dPos * groupFraction * (1 - fullLayout.violingroupgap) / (group ? numViolins : 1); + // violin center offset + var bPos = t.bPos = group ? 2 * t.dPos * (-0.5 + (t.num + 0.5) / numViolins) * groupFraction : 0; + // half-width within which to accept hover for this violin + // always split the distance to the closest violin + t.wHover = t.dPos * (group ? groupFraction / numViolins : 1); + + if(trace.visible !== true || t.empty) { + d3.select(this).remove(); + return; + } - var valAxis = plotinfo[t.valLetter + 'axis']; - var posAxis = plotinfo[t.posLetter + 'axis']; - var hasBothSides = trace.side === 'both'; - var hasPositiveSide = hasBothSides || trace.side === 'positive'; - var hasNegativeSide = hasBothSides || trace.side === 'negative'; - var groupStats = fullLayout._violinScaleGroupStats[trace.scalegroup]; - - var violins = sel.selectAll('path.violin').data(Lib.identity); - - violins.enter().append('path') - .style('vector-effect', 'non-scaling-stroke') - .attr('class', 'violin'); - - violins.exit().remove(); - - violins.each(function(d) { - var pathSel = d3.select(this); - var density = d.density; - var len = density.length; - var posCenter = d.pos + bPos; - var posCenterPx = posAxis.c2p(posCenter); - var scale; - - switch(trace.scalemode) { - case 'width': - scale = groupStats.maxWidth / bdPos; - break; - case 'count': - scale = (groupStats.maxWidth / bdPos) * (groupStats.maxCount / d.pts.length); - break; - } + var valAxis = plotinfo[t.valLetter + 'axis']; + var posAxis = plotinfo[t.posLetter + 'axis']; + var hasBothSides = trace.side === 'both'; + var hasPositiveSide = hasBothSides || trace.side === 'positive'; + var hasNegativeSide = hasBothSides || trace.side === 'negative'; + var groupStats = fullLayout._violinScaleGroupStats[trace.scalegroup]; + + var violins = plotGroup.selectAll('path.violin').data(Lib.identity); + + violins.enter().append('path') + .style('vector-effect', 'non-scaling-stroke') + .attr('class', 'violin'); + + violins.exit().remove(); + + violins.each(function(d) { + var pathSel = d3.select(this); + var density = d.density; + var len = density.length; + var posCenter = d.pos + bPos; + var posCenterPx = posAxis.c2p(posCenter); + var scale; + + switch(trace.scalemode) { + case 'width': + scale = groupStats.maxWidth / bdPos; + break; + case 'count': + scale = (groupStats.maxWidth / bdPos) * (groupStats.maxCount / d.pts.length); + break; + } - var pathPos, pathNeg, path; - var i, k, pts, pt; + var pathPos, pathNeg, path; + var i, k, pts, pt; - if(hasPositiveSide) { - pts = new Array(len); - for(i = 0; i < len; i++) { - pt = pts[i] = {}; - pt[t.posLetter] = posCenter + (density[i].v / scale); - pt[t.valLetter] = density[i].t; - } - pathPos = makePath(pts); + if(hasPositiveSide) { + pts = new Array(len); + for(i = 0; i < len; i++) { + pt = pts[i] = {}; + pt[t.posLetter] = posCenter + (density[i].v / scale); + pt[t.valLetter] = density[i].t; } + pathPos = makePath(pts); + } - if(hasNegativeSide) { - pts = new Array(len); - for(k = 0, i = len - 1; k < len; k++, i--) { - pt = pts[k] = {}; - pt[t.posLetter] = posCenter - (density[i].v / scale); - pt[t.valLetter] = density[i].t; - } - pathNeg = makePath(pts); + if(hasNegativeSide) { + pts = new Array(len); + for(k = 0, i = len - 1; k < len; k++, i--) { + pt = pts[k] = {}; + pt[t.posLetter] = posCenter - (density[i].v / scale); + pt[t.valLetter] = density[i].t; } + pathNeg = makePath(pts); + } - if(hasBothSides) { - path = pathPos + 'L' + pathNeg.substr(1) + 'Z'; - } - else { - var startPt = [posCenterPx, valAxis.c2p(density[0].t)]; - var endPt = [posCenterPx, valAxis.c2p(density[len - 1].t)]; - - if(trace.orientation === 'h') { - startPt.reverse(); - endPt.reverse(); - } - - if(hasPositiveSide) { - path = 'M' + startPt + 'L' + pathPos.substr(1) + 'L' + endPt; - } else { - path = 'M' + endPt + 'L' + pathNeg.substr(1) + 'L' + startPt; - } - } - pathSel.attr('d', path); - - // save a few things used in getPositionOnKdePath, getKdeValue - // on hover and for meanline draw block below - d.posCenterPx = posCenterPx; - d.posDensityScale = scale * bdPos; - d.path = pathSel.node(); - d.pathLength = d.path.getTotalLength() / (hasBothSides ? 2 : 1); - }); + if(hasBothSides) { + path = pathPos + 'L' + pathNeg.substr(1) + 'Z'; + } + else { + var startPt = [posCenterPx, valAxis.c2p(density[0].t)]; + var endPt = [posCenterPx, valAxis.c2p(density[len - 1].t)]; - var boxAttrs = trace.box || {}; - var boxWidth = boxAttrs.width; - var boxLineWidth = (boxAttrs.line || {}).width; - var bdPosScaled; - var bPosPxOffset; + if(trace.orientation === 'h') { + startPt.reverse(); + endPt.reverse(); + } - if(hasBothSides) { - bdPosScaled = bdPos * boxWidth; - bPosPxOffset = 0; - } else if(hasPositiveSide) { - bdPosScaled = [0, bdPos * boxWidth / 2]; - bPosPxOffset = -boxLineWidth; - } else { - bdPosScaled = [bdPos * boxWidth / 2, 0]; - bPosPxOffset = boxLineWidth; + if(hasPositiveSide) { + path = 'M' + startPt + 'L' + pathPos.substr(1) + 'L' + endPt; + } else { + path = 'M' + endPt + 'L' + pathNeg.substr(1) + 'L' + startPt; + } } + pathSel.attr('d', path); + + // save a few things used in getPositionOnKdePath, getKdeValue + // on hover and for meanline draw block below + d.posCenterPx = posCenterPx; + d.posDensityScale = scale * bdPos; + d.path = pathSel.node(); + d.pathLength = d.path.getTotalLength() / (hasBothSides ? 2 : 1); + }); - // inner box - boxPlot.plotBoxAndWhiskers(sel, {pos: posAxis, val: valAxis}, trace, { - bPos: bPos, - bdPos: bdPosScaled, - bPosPxOffset: bPosPxOffset - }); + var boxAttrs = trace.box || {}; + var boxWidth = boxAttrs.width; + var boxLineWidth = (boxAttrs.line || {}).width; + var bdPosScaled; + var bPosPxOffset; + + if(hasBothSides) { + bdPosScaled = bdPos * boxWidth; + bPosPxOffset = 0; + } else if(hasPositiveSide) { + bdPosScaled = [0, bdPos * boxWidth / 2]; + bPosPxOffset = -boxLineWidth; + } else { + bdPosScaled = [bdPos * boxWidth / 2, 0]; + bPosPxOffset = boxLineWidth; + } - // meanline insider box - boxPlot.plotBoxMean(sel, {pos: posAxis, val: valAxis}, trace, { - bPos: bPos, - bdPos: bdPosScaled, - bPosPxOffset: bPosPxOffset - }); + // inner box + boxPlot.plotBoxAndWhiskers(plotGroup, {pos: posAxis, val: valAxis}, trace, { + bPos: bPos, + bdPos: bdPosScaled, + bPosPxOffset: bPosPxOffset + }); - var fn; - if(!(trace.box || {}).visible && (trace.meanline || {}).visible) { - fn = Lib.identity; - } + // meanline insider box + boxPlot.plotBoxMean(plotGroup, {pos: posAxis, val: valAxis}, trace, { + bPos: bPos, + bdPos: bdPosScaled, + bPosPxOffset: bPosPxOffset + }); - // N.B. use different class name than boxPlot.plotBoxMean, - // to avoid selectAll conflict - var meanPaths = sel.selectAll('path.meanline').data(fn || []); - meanPaths.enter().append('path') - .attr('class', 'meanline') - .style('fill', 'none') - .style('vector-effect', 'non-scaling-stroke'); - meanPaths.exit().remove(); - meanPaths.each(function(d) { - var v = valAxis.c2p(d.mean, true); - var p = helpers.getPositionOnKdePath(d, trace, v); - - d3.select(this).attr('d', - trace.orientation === 'h' ? - 'M' + v + ',' + p[0] + 'V' + p[1] : - 'M' + p[0] + ',' + v + 'H' + p[1] - ); - }); + var fn; + if(!(trace.box || {}).visible && (trace.meanline || {}).visible) { + fn = Lib.identity; + } - boxPlot.plotPoints(sel, {x: xa, y: ya}, trace, t); + // N.B. use different class name than boxPlot.plotBoxMean, + // to avoid selectAll conflict + var meanPaths = plotGroup.selectAll('path.meanline').data(fn || []); + meanPaths.enter().append('path') + .attr('class', 'meanline') + .style('fill', 'none') + .style('vector-effect', 'non-scaling-stroke'); + meanPaths.exit().remove(); + meanPaths.each(function(d) { + var v = valAxis.c2p(d.mean, true); + var p = helpers.getPositionOnKdePath(d, trace, v); + + d3.select(this).attr('d', + trace.orientation === 'h' ? + 'M' + v + ',' + p[0] + 'V' + p[1] : + 'M' + p[0] + ',' + v + 'H' + p[1] + ); }); -}; + + boxPlot.plotPoints(plotGroup, {x: xa, y: ya}, trace, t); +} diff --git a/test/jasmine/tests/carpet_test.js b/test/jasmine/tests/carpet_test.js index ca5896c1c0d..ffadb31317b 100644 --- a/test/jasmine/tests/carpet_test.js +++ b/test/jasmine/tests/carpet_test.js @@ -541,7 +541,7 @@ describe('Test carpet interactions:', function() { it('preserves order of carpets on the same subplot after hide/show', function(done) { function getIndices() { var out = []; - d3.selectAll('.carpetlayer .trace').each(function(d) { out.push(d.trace.index); }); + d3.selectAll('.carpetlayer .trace').each(function(d) { out.push(d[0].trace.index); }); return out; } @@ -691,7 +691,7 @@ describe('contourcarpet plotting & editing', function() { it('keeps the correct ordering after hide and show', function(done) { function getIndices() { var out = []; - d3.selectAll('.contour').each(function(d) { out.push(d.trace.index); }); + d3.selectAll('.contour').each(function(d) { out.push(d[0].trace.index); }); return out; } diff --git a/test/jasmine/tests/contour_test.js b/test/jasmine/tests/contour_test.js index 7f19e18c7d4..af831c2cb83 100644 --- a/test/jasmine/tests/contour_test.js +++ b/test/jasmine/tests/contour_test.js @@ -487,7 +487,7 @@ describe('contour plotting and editing', function() { it('keeps the correct ordering after hide and show', function(done) { function getIndices() { var out = []; - d3.selectAll('.contour').each(function(d) { out.push(d.trace.index); }); + d3.selectAll('.contour').each(function(d) { out.push(d[0].trace.index); }); return out; } From b0693daab071826dcd6079b7bc9e8cbc155cb67c Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Thu, 16 Aug 2018 22:54:32 -0400 Subject: [PATCH 04/10] updated baseline images --- test/image/baselines/connectgaps_2d.png | Bin 104454 -> 104795 bytes .../baselines/contour_heatmap_coloring.png | Bin 43814 -> 43938 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/test/image/baselines/connectgaps_2d.png b/test/image/baselines/connectgaps_2d.png index fb5e18862bef484f6f5bdb658371417c61eb0247..99438b3d0ffb588b9ab5dd09e5e5b79f2032defa 100644 GIT binary patch literal 104795 zcmeFZWkX!svIUB}G}gFl2=49#*Wm6D+=B*(#x1x73-0b7+=4re1VV6kUhjSGIq%;6 ze!%;3K6bBOYt1=pR*kArV|JvfvJ5&35egI(6uO+OlsXg?ECm!4^feL!od5`lY+wKAvDK&m!s7ZonogYuJMIT00qS}WMMeqCGf(*mEIsVu3LgEphKLq8W z{C05iw!zxOypDS`m?V6Gh~$2NyLC4eX*dv#qwEa9=RGN^zAM*sK7;CjfvpFO@SYn| zIQ38Kyn^VyeW9PdD`xFJLzzt_WD5*_1S$S}duX_fcr32Pd>b~leFHXMRh7Sl!lo8h zSy0BeDPml;kx;Ev-e(W^@kGM}GFF6%c51z6sj3ngI-~U)9qLI-Ev&7{%}0rw(3-Bj zbdcuM?Zg9Z%Q6J(m5{!j?T3snq?8$wLR$sMd~^y~(b#@b@dA=rl^SKCc%2MIv@##* zb&*xHFILZ2-#kxV=%rWlW} zUGk@+=w7^#ka_>IG-$6w+?eFf^jCTiQXLuiI*mLXCe#~`XC(UiXxezc(Q2X8aBf72 zc*FkP4;W?u{a{b#8#hhGmN&?4m#I1eR2|t*oZe4a+G!@GhTe09H<(vtCLh1G94@`v z62S|eHtX|gLG`}SvCI<^O+98^G2Z{8+g(Nf)WI<+f((E%e!Wa{8Kq6zUbU;)@A-MU z(Q&bC9uIcQdoqyz!i`N4ZEo}q#^P}6R60N?s7!;%5Gd$bywkey9=-9V-^3KUA93oZ ztUd|Nco^oOcvEdWjWXI4b8Oc*Nhon7u|w9FwLJbMl65_jWdoA68UN7hxIs_Vp#cT60-Y!NT6zpmT>$HwmS)oT8Gl~s?9wQyugvQ)tNI2EEbB%OyxsY2 z1aWZG>2W19+JB^t9q@?OG3=kg%~8uh+afNAg;eOAbTqt>B*Xz|LBDbMTevK) zc?v3gh3!4Ff=sY(wNVLUkrG4W82Cc{@hAu2Mh-{CNrYPQTQ+r-?ycb7N$Bj-RQV%0ja=FUd-79`v z*JHKbzGU%iG%06uHA&aaqGRGt=x(5H8k@_ZKaLY ze@MsDIM#dD_gDlBA@lElF&9#!U-qo;DL&b9Jr#$6>&+GRb>8y70~2rEBjj0H_nVKW zGJ7p`Y-%QMg~N@I2ST;o2@*Umc6m971QVst+SQrs3q_H2zzTbI@U7M4_VEHKGIf1# zwpVPLjZSpcd^O!+-L}H;`&+y@E43qhX^hqr&t?1aD+T(*?vNv=$(piv3?(~-n{qAjOr07;id{~z`(uQ2s3TG3W+ebHbIEA zpm)Yw#zF;TD~LmJT=$Z4FuSZ8amABO9fj66*EblrjWz2d3P+hV#L0RlCS#61Wjt5C zB6D&x<0UC|HZq&|?wC&?O0>-uwh|yrX8^K*camcn7RG-uHzgs%-2HXqz~~fC!7v|e zu~sM7=uL8X<1L+7fQOd^_3(R!@6_f~V632}6lSFSw_1nyv#+VSs_NeLL;RSd;g%@y za2$kiKMCRLk2Abe8%mp2RP9Tv>H6mnWyuZ%qld*aG^P zMc8k$fzLrm2>~7W#@Pe|q?<(7=?-4hcmrN6(RW@i{k>Y$1oPpB?BCaA$2ZYk#Hw$D zOA(vPU%ZMEl|ywZ%4Z(Z-VmEwdOoj6&NI5?WIGa1g#37wHo8auPWA<=O-fNHR{e@$GCoOF!2EgoiR{hvppaTh{>->oXFxUd zNY;I}5vE`~3l&h5zf~;_m7oItnCZ<*CpeMe#i0@=2H$AB+r*SqiJ+2AKV-j*k%h4k z5sEI!^CLM6c=H9jtZME^;!+{x>;Ce?z?tLpIx61Ur9Si4SG!*<$k%xgGFs*ZNr*)J znLfeoq$!{u{5l?Glpqvd@~h6=hUiSV<|8gzRILda`l#E*TH&tFpSyzbafyobT9bUe z;3Y{PQaP*hkx04qjZG$doUn*5Zz&c53r6y^UfN5&9y{r^(&!PYQ1(FIO9vo+a`)&x>(ZW&>?Xz#PErVe4N|i9=hKh{jb6O0M_ebl-2DWb zfts(XOtdtAtb5iXP&wb z3;PV%K=rs`9hxB02GjLb9oA@Ek5@z-s^9ishL(+$rgHfnEcVna>2i@{FEmhg%eXMN z99#ruj%o{6KFK6Yrhij~lOfzh8-Q*VQPi&D!X2*h8XE=%tRp(b?xAh8zbVnZXtA z_Rio8C}H2K&^j_e=_5(Q8c8EkP+nM(UCG zYMwgXXHRBi$h>@pp$edDlggTDNvXwtdQzLIWZ=vO2D{Z}D5M-HbgKcUIjY}8kP|pt zvaJu$CSGr49I-E1-Q^C{F(P(~RcYf`DX8jy)5MYb!_tRid@H&0b9bTKS;*1HVzCu3 z#289~11)4nAnOX<>=m}&7fc@7*nugvjyf@O(;Wdxc##vk+S8pef=-=i3oNs~ROA&j z-%!0Nl1e0HMMPa)iHu+NEAIPbwxG2Vj4=AJrDdH(A|tj4`XgBXXnKpy=YI^Q-%Uf5 zanV&kC(7~EEjkQC8BaDddmSU{*`WoKVY9ahXASF6bsgVovkKwHH)}ynSaI;>%7QI8 zBK`6MH67^%vXxo-ivmgvr6g%Fq7YslpZOO|3<>9mK_rDR3?C$hOC54@lB-HtG<2#y zeO)16Fo?}RWVo$Qco7!#bfV1;gBwA)$CC~GN+!nQi&yCsfVg$PegFui% z%>h;bzw;|2i^TTiYjFy!LX=V_W8H_>)k(16L`Eao44U0VoSkby-msh6r%I0|GTdoX z8)6=UrP>RQiA8f&898a`(We!;exQ&KW0EU67M_nU%g|kS9s158QP-$hle@YSPnSoW zrOjI^L=n6!N5^@8dKGa|SF!ZTji+daQBCOC?@i8NO)Xw8OLGJ-QL+ZNuHIY#O`$vR zs;hr5j!9MHNfe02Qt^`FCOp4sms3RsqIYHj%Fv_@*tVcn2(!$uIG`%Ke${?ZWmC>1 z;Z33M9~o$GU1qoyK)S729;jgHD|ImDN=E<}XOf6C5vi?cOE-Mw{VjQW*HcnO2VD>I zMH`!<7%}0!c;NGO^xd~Ui$2>1C5%3^JUb_WpkUz9o`70CSoFRtDe*70FT zo1N=0>lp8gm*{7w&tSHrTRlvFc>RzVt5#B)@>^Gx&NOB$H7{seRq2!fc$uJ5HC{pe z)X^C31fQMr*Y?MPKt2RQo;$M2bBOE#@w{ZW|93z?qnf5GG zrmg62FOTYBiLWEDkPTleJWr|fNd2=Rnc!tp8%wYqlb%|R1Xacxc^DXvv$5dluI;$-bkYIp;+3APd zVs9U@)kkOP?oDAPG7{pevVCHx)al-`vodq~bRYT7;OH)Y%4`9dkeyOkzqbMGJakf{ z=O=rcE1DJdM<93F)Yq8|{v$NL*3-=1S6ArbPSlNWt25)Z&aXct$TSPjnfoHugh0I4 z_6#gYP05nn&~D|P%EVUXd|}Z8T{QWHcN_|9qp#Jt-w$0jGo_b0~0dmo!N@=qLAdKRwc6RR>&2{aN}^(kv-F6tF^+Ie73OnBGN&H!8Wwa6B@8}Sy%evPhLP0kJa5z9l9Ft~*Iz_VshW=_LeZ>q zkH(0K#&ultN1K&`IqPcGz6b`v?4=2Y*Oqmq8o#&2locrq)fR5OY*S_q2&W0;+$gd~8W+-{6Q$hHok?!eu%GXn|3Aqk8R ze+WU;7hO14$RgkYGW(n&$Gog#C(DVg`eq3j3*8IU*kq`8!hr^!(3e%d7sb7ba5z?grt8fZ2FKH%IEXk9C5L@x2fxEobNI{kp>8@cq5MUPP zayeR%<{M-!W(;C}n*SEBsEd7*jX{Y*JQ6mtbwoz*R>6pF2=(y zPwMc=(u^~lD+MZzt(Bo-)OER62ku_EkmSXK?+r+*jPM0240ZP12Bzu!ul0(vr^~J+ z?56UcFf0Pzo9inyNx&50=A(3~z!Y6WxwgTNB-RArkiT4)T-?2WFa@$E<4abAW=Y_} z3nixyKb6~ZQEEpaN@cy7s!x|jZUTPY96r9+0+%-~Nh-zsWfwO_7%2gLleHSQt9zA1 z1^GYWNM{6eA@YcL8+@_WaMKSg-eQaV~%bIUrnH~sW@sf$|$-l$w`>B^D!xfNP6Y0ds`qokctOK;s@3hB`7?zVCJ zXK|~I<^~-KexOp(Wxe@rAsZ~s_TtZRVgubGxyS_B!!R3pM=ABzQ40i&xpIbhOX$<) zUtKXHtb#!=Rps_0CymHBWw^PS$UEWR_1xPH8GTt}P8EE4W5#B49Ulzql$5F?%|hpQ zJ!gH&fV4l?ICqh8)f&Fi^X%oM@DrBxm3d*)QzK_*$D51fNc*Osl8WF9bUJ!@!;8Q8 z$VqbwSpN%vUe0jznyY+#DvbTQbl+f0JxV)o$kEM+SBfmu{W5;gCuN|+s_Brq-IE34@LlS3x=on1p_w3IIKg+M@azW z$(ZflQwJMI!&vmJ>g^E!Q|LM*N}Z&0)d)*c;ZFRyIdiWk^rh&09ow@A7X~f5l-`=W zwYc}ZRnjtr##yNSSE5B8VvWeZpCahka59I{i3K%A4|PfMP{5OYgq@$~7*C56T!k$1 z6W?to!qU6w+A$N6dV>9PR5POJE_S@2&OUuojnfWuu5%0fNZ857+hTF6ol`;|olqc0 zg+ukgl$(ySeJLQ?-c?zUQC$l%l@`(z31h--#K9q2%U>;#6$3SpN2N&-7TMh~199Y| zOWtt}uB4f%ePrS>%V7Gx^GML^m- z56jJ{Tp$xSm}5!>#$q2eLD=|}k?e8FY1_dwAFhT%tO(8xOgEpWM4d1Vc5Nxq36$lu z+hNLdA82??U)n9Sc}xCy^_N+8`>{Xs<3Lk2Vf&q`DT-cv+*@HhiuUFQVv%0b^FaUU zmV_yKHg^7WXK{PiH2ZnLs$rZ`RhkT4Nd%NIO&MW#QOg|S;77jO2{2tRpQJTiyFK$m zsI*fJe;+1+{OBz<_@g;I_VCHiw#Eqi;70QGi#qIS><4MZbkMnas z3~m2q!7c>JRF{d;-^&aEF@nx{O39t@nS!f6gGT$L8o3# zq;e3hs_Nherm!+8ls3O0)Hpg!Up{b?uG%i{7}onY_dM~R?8Uc~kaP^8F4&qLT3vh@ zm0S96FX3y>gJJuC&}z>pYwfrS*3iQ zduq0YLvq#idkbrEKKRArH81yzk#(3;hQ9Uwu;SLHi+o3TJ)-U-tZB3y?p@Qpv|uoj6@rHgLiUT`I5iI^=PXuNMSiu+vX6(sz- zmFg_qMiiIQY+G%XnZ}E8Q|D$7^h*ziSaJVS*1}Epm#eImo2=B#{FEY*uCh3qv}B@s8>J77-OcF8QEXLh8=m(ZifCQI zej>4Pn}5_a=jb9VMm1|J;-y{G+w*01(LzU5-!K&8Nc)P@wqnW|of6NtDRm3j2n9Tm zh9e$b#+iBh`YX)X^C>lc?BLbATYg??Hem}LZs`i{aOy@Oi;ylWqNOiBcrXiLK$@$M)eip-X3KC9?;_}C46}`d zv7o>mIyWF$T6}0SH7I|{MG3oyy0>38mb{=qMKKMQrDmC+o3M2Aa(6{Ib8?bM+0eW0 zUWGMlU6ke@-C=Z!^vv#(MM_&GRxO9Cv8h0T+Q}f^&y3!4^-PaglP|Wbo1KX>WRN%!te&h`<_17XE+a-<+*6nVU(-{$10~m zfT+K5S>#oL<;SCMHAV&@^lwr3y+H*<%5q;vj-;Nw zj>LynoglekO91Q57YU?AQa>0UPc!l#5ys*khL~D6hL{xusm0SbGod!0B+AevD#n0R zdhuhUeL2go&ng$-p4W0le5vzb21?!jKcqE1NNH!_B)jTWy3|NT^tuu7t0hzRuVUZpa2(OH@dhqfe9~ zXN1U9Br4#jMS+X1Z0zck(LzxI@aU-aQaKz*K!qlGc+&>A%^n7-z1W951>!iFg1|I!7lg15Yb9~(~4~^hHe*cO|9(^motK`%QuFl z$r-2qIz{nyg5s;$^ru%LEQNx;{lGO_utc!vz1@4Oop+UxT@;3}<_H`N6Je64C*ayr z>Ndf@v$0XmuW7V&ex+(w7eobN*Y_wm@J~NK(}+!Fg9-D3Ah{W&`GlHqk_Vw@yUxC3 zJGqRwj9n@zmgkxwDDQC)j9NRVbjat*nVcvMXjM?%X_ur_<=JBeFgs@DF3zND~BRttn>ke*=^9vg=a}2u#zBDbAIO z0^#`0F9`SswaCI1f`|nb&*SG6lIG^9SKA*j+;?n=xY5i~ljTN7Q zy>=&KCTr)?|lZPqqaW+qGV%pF8uW`=Bx$E`=lXnIQs5Y zkfo8&gHos9PO_6wdU>qxg5Ph%m=!f)Re`ntG2r1+_r|9*GV!k(HB~;a_KL%4WN*4V z?w;My5d=opY7MD=S#;9=HxbtHvgaF$T`u&=fM9v(fS%3!@=jK&WTyKU(L7I;Hjr{2 z8H+am87&NyeauoBD#Gc4Yd(Bu`e)&6aWB}W!VDR#)9|s->-Uhg^P0n1c#k~8q&`Vh z@r}EpvNAaGz<9{GE05VWT|3O4y(W@}@?}W)rPNceuDC-y1(7P$?B#x+y4A(-{WSbG z89>dX7Eo!z6)A%evpvn@PK5N8BwT`>1YO!icpO?S!n#aqM8A%J>i6-dl`X1#3h&BT zsn9;(c$KN0bz9cO`_LUKq0dtE>U)fOm)tcdSsbf$m_;fZ9WG2HlFh1O6p0@wGJe=o z!FLP=`?QdHupk~8dh#(@8U6AUFRn9TNZzC)ppU8$rW(^`7bt6Qu0CD=&_+Zn73qpl zT%~R%xyHD%m11!N;Z*{SAt}JWyoUbuY-<;M_68MjjNK3Cg~wD#$k~AWhKIVVl}9ep zLoOU}#a{V1lgILj^>6l)sTe9z53}o@z$))ig`HQ*gOkT=<<5ylEcLp8FD#k!>1pg@ zZ698$IKxs7G%<-`ay0no*`H3zk2^=ci7CZ;z~%(ASZ}dEUpIW;S1kd4xFP=KeYM|O zPHBams;fAYx+aqY-=fKzI2z{7uHjiXAuN}+<7fi%S*|M zR#Bm`u+WXYlV3POKQk1-yw68x5$cy@En%uyG*@B~umOzbLDQmTnKx~4{n^&{)Pp%q z{gGkYHrK0q3{x#^L*7ivQ}$4pFmvX;$ItM?-kFGxaESpZeR;xFUS!3Si8kCn^0?3tI43jcrw#Cp5^-)Dr7P zq~eVNUwKB@^gjrO|L-|C|UrjZCx(7(5}npE_nBpgc7 zZ`pBpdv$1Coi_T5bc1-?sb~r$yNgwHMoE5qK&O%Sl6>rzgDEn2YMp;#e|oxP!=V@p zRJ{$At1s6m1%O?aLIdGA}B87T@s`>^C~=-$QgEHYQeG2if+ zrnf9y9XqkY&S>)7ePJ`*gRp5AfKn$w5?tqJlrvk|>9 zbGGo)vDQhHf6{k$+ZG!WR(n2&nlL|SwVZdm27CjzO^iiFt!%gi?XfbdpmM&*VB|a7m>!2jo{OvNBVHooV4uRZv`Bh`9kUOiS+H@tpt$i(I0ImBN z&8lte%c8ev+z*^(LHs@?2lQvb-$RkJb(f_^KsbbI6@PA~Kws|kne-T1b}|L3)Jbsv z2T^=tW+VJg9@w*R62fA1usWP7Keg+EN1ZC)d~is>g^m)ZWw>-1tBhp4?C)u#Dbv-8 zTu5`R6Eop2h5_Z@9^~`|OeS=D6EJ|M)#4Wtdi3FkqpXLvL6lq1jb^LB>igA-f4L5j zqEh%2-TRza7LAPQF%Y5;_K9R#C1~hjCG&0BhE|J4cTxSp`+M^}u4|{+;_)(BICuYXvNY<#TFi;4fz=3>Z~>l%vKC3FPhrzD2nLYz13SgJ5{`eZN-KS0`0ZR zARgTJd2-t++PRW;3e+q@Zw4$3I<6 zK6gDv%dz%!A$Jajs3rW@_l5Z%@ST{(F++KePU}&^V=7 zkqX|I2N$^9FRJ_K&^|rNWC@mSI%q_ew|Adm&#+y^id^!HKuniLHb-p1$xm20mK)s{Hj0ZL()iLpb1Ba3CCm@V#SArZO?D9zI@rvI^Kx~ zW_4<|F5)Q+@34^&qVnyr>b_Cw7$|19Ynx$tXnap#YotWoo274)c^7;+#`K!s!j5Q{2ugyvVsKsqXkq!0&uzzb12vlUmP z{k9Qy^iZ$`6{x(NE`3r$IcUf}d|)51+-VfAHZ-a0h@%4nOF@!71BVy>t=k1HrkeDq z!(-78m1qPPYCIR`$}B4^BtzAMEFRl1Y@cx|nKWt`7vb^1FIjnP8_1IeRpyUdVgzogd#b zJzJsjw867BTr+@-z8cP^=f7zBa(u~?qtF`J{ZVc^hvYvaN$Bcvz%=%c*=sa)*JAVVmZDTFXSe=FuX%RlbBQ<9{Ea1 zGA4SmLr?vrFEU!Zo(wml{*(D?9RfO-6ls!yMRY%0t~uXgW{3s%blZdz88%~vW=!k* zKe1E8Zr6);5V!ch7>_+SO}{$+jZ={G9D}|dXG;)u!pnQ`_0-7mnOlSt)^J#VuQc)y zBc<%1ctK-02;d2CG3PP?kLcolH$AiLNqHH@gz`Z01Ho8IVaZacB$)YpxRZ{|3D%bA zNp-Cep$T2s?AAv*zP2t2pHLuTo)?+^V$BErF3csv8G5?h==a|aIF?=R`7kh)w!_^7Yuh)e z4?@}cYEQNatok8!?iyO&!Wimj+0B?OGQx;=#=YECH?@0T!%zz&(Z28tMS2+V@_1`d zN$IV#C5I%wC=~>9p_tIloLF(b7Il9K%0@4a(qzaRkYxPGma6zF-HEgCk%TwIy9_P92Xh^70s4WzHBJ) zxcVb1@Bzn$H9U!`V6e&U!_IaLhDcYmPk!OZYp!9gwHFUIg*DQ-J&E#PZHxM!FncRC z8zHdq&m^f**nbRJT2blRo=>aWkg~mT@F^zzyH5uK;+XRwJNXc$!~+A;8-JRH6vNvM zdYB_b*c2rTOKCe4Rsng!?wq1ci?CEvJgf||U+?xaK4~IrHZfpLF-H-{+Ccw|Wb5aA zL7FC$7UGD^3^&rL!?1ireaE}`$V#Q1Gg&RQ|I^sq@|bA%+)4OZTd5*4Tzos zx7*bO&simEi{f8Ogu;2;v{R0Hp|PGVk4x5<3oF~7It)Kl5KB8Dj=viho;uXT)E0arfruP5VdT-~axCTi;WH^4nNj6Dh>%U?ETE(l1H=T}Ln0V`PlZObFK5fIB1NJY zwHXh8H>)AWfplgThWb-&ViL{7(^d2?snOHngTfO+_sloka9ZSOKc3(a!8|b~2VtJ< zfMNq~g+KhJlzPF=rjbX8w-ANVljlyRU3EXdzp$$j=&N(JoO)XFVgo@|cEA2hh}UUT zSL<%3lFpJ^e5x%kKILx>>>5&%A9Z!Q2F>4*v$Pg2Pev@+d5HTIoMNxSE?ACAB{}s= zRj+N(l&5!Za2lNTCze(9!;~@KyBKZfCdpELY<{t{v^CV?REIYa$s6+HiFn99H=$H# zGO+bXLG{28Br@>i>d5J=PicG|R%9FyCQgpzqQjQ+I?>|t&GxJ7QP8)0*sA{qHj^}f zHl!80f0C9MpeQOI6j5ho(d!tnVaN2}n|nv=o&9=qxdoQ3?|HwgP4kyt1o3aZ2&5ij z{c`q)z~@ohh6A=jNcmjvdPOK;Q&1SOW+lc#Ai|j=)~`BHN+d!`BtCj80N?R-0za*a z{$DJFVW9mSazafKlx{QXhb1-^{9l$wZtQxSfiwmCD1_aJ7Klr(QJ4Pz4jibO>R zAQ(=RtjyFz$(jV0Sjd_2dCeA6%S{Pk|pO za5yQCg#`MS;M!^{$ne=HlW>xj?$A_rW6kGmZUtN%qsdP+9aoykh%k3&qzEAGKYnlUwNnUpI+4+nDANT1OEZX8GSh$WOOxzKqT`s+pA8)ok%0V9Uv#&a+<(GX z*Y>*_cr!8g!~|HLX#DV&KduiyKFg34LbaxVb_G)8{(ko_VyGBuG`xiUYNW+^`>uu( zSILwQFr+~<>J-kCUORObhC{b(8r-A`u=-u^{Xn1Dp`m}CQ-)m9VYi3nb#ipOZ4M5DR7n|LW1|k3O zVb2Fr%45_E&?w+d(T3aA>3TG*gv#0gaE6V;Caq)+GONy)T7dfzit#7I=d;=~KNknW zKyy<`o5h3fn!)Xiq89dh1Q_J2ArJ!IuDTmL)`Q!OAyp?>8!wYK)W*`}okedblCLm3 zcbH7>8g$8I%+v?b#ioV)nxXi*-+)`pSn!?(!GY(znSTX&tP$}Y=vYuB zsz#z^E5xTIWNprT?yAHxfL}!pm+hPm$83cO<~I{e8CP%_8r_au(G~oB+j0L9m_;jc zEY7C|ho|B`D{9ykTq>AHk~xg3RThN@dXndtM7UQRuH7-q$MgrS8fl?7zy)13 zT!O(o?c-ySwY!KpxB+6IcQ0@XO;=Ia6lEGHHC?wvKZb`N?i}pw1{SOIO-?2OQtkCIz``!QuAI?XDuqvx=sB*`sa;+i@;rSHl zmX+vQ9kj^E{Z?{5@7Bk^Zq(n<{ta020E+yBFDwBwxiv!F_Ag;Xi;ynuoxW(U<=g`U zZV{pak#&t5!(Iaeu1*^=&IGXIzP8WIrPs`(-^`x~0+K8pe5+OcnM5!W$O@8?Y=6z3AfA0l5 zi7Xm8F7KV$3df-4#u82x{`tDM5S&MY6mZHH+}4QAwD~d&${jkrsG=Rj0d%PQBEV8=3=G*u)3&%KhunN zQB&h^rlU`pI=iFHN@3gS+0Km1pIS8#kmL=`NCl=9oO~+n&-}oeSx#bYACTN8l+;G@ z^Fc`KLC9dQHcG>``iR@e0yF%2pgamqR)V_kQZ|WD>Zh)hIw47RreySVm_&Xc3Cakb z&UHrZCSm|H0s&r8P_^T?$++aLq%9mH+2PtACc5+KQ;UZ%p6F+1*&5yM=*j+QB%PQ` z31D04-gNVF7(M2^iV_l2wfnduyygEMW?9`2>2F-L{urou?1i#M{=^Hf3`nX!Ek9vzoYj-Rvo=Uv0nt_xU&S?)0bdI-_- zV*LO=GL7Y9gxq)376B)#o6`X!2%#J+mTGXcwN zCyY}h=Sm6?eqbb&5+Iad#1i8WLCxAgPb)!YaY8lFtU7;OwHPY&5)1uVYb%b8j%jYO z?R{^nH{(C$;kL$FBtZT;?3cx#wHu~J5<5K;|lJw@F;_?<8v}7 zfYkfhm2>{wseXG7>f~|Cj8V!&pole9^8U0Ru`jb@i~fWG2uWfHCCw0vUh!N* z@MK+bdJxsuD&G~OqIK-iEYk$5xV{twK43CN`s&&IHK3Y`)09Eu>s8`QRiG(zVI-um zJ8l2NB6OYL8j>pF%SANww0S2YbTj|a(l1AJ!tifU&P9jDMpxYFIeiiOfPh&0y$Rt< z3#pO_e)v7)_0!8YT#voL?_CxiutGdI^%+dTi8KMV&k3qbVHpoJI+KrzBJo6Nq)QtY z!>xNNZ#|ZO{Qiy$`#?yb&w#>`tVQWP@+H%6ew9GCLuPw=8b4VY3y~53e25*nu!*de zeux8#jt0C#KJJtbakKb%1(F#~1jSJU3HQlxYI<-qxx3Dn?)v&&)dm4f;(@gZOwtK4 z=pylLD_`96++dHgw4yfw`8#+x)DMbq^aw`cHdX{(5T4U|NnijTqgY<|=w}z_$3i~u z9Rg(%aw#Pbyea)24B;GyU~Q@E&=JiBjesnTg@)xXmHmtM&SW9x9}N=NR4!KbsaiQ@zF0wFQ_(Fcd>)3=i;{*)ctNB5?8vrX0$GmLR7y!k0b`7*K`WKrlhjq4r{7 zl=kMEPyPabrbxpKMXQaDBbTbNEC6?2(q}<=0yZxN4h84EZmf-|8EwiWRmSAi$xrI6 zX}7xmPF1GRzzS&BT?hH=hSvOXYT(gfcHd`KTE9 z(C}8>d%E)E!|7p(HaZod2tSq(DR;PT0XnJ0{;gV|6{kXyc7I*bbHYO}d(5?HZ20Zf z?8@g99&y8or*urR;n5&%Zyl|(_UM`A`S$Zw%JLbeUz(PI1ANw(hG9t9Kduif(Es$9U`619Y|(u`O==o*1GY{l79C9Jz@ zd%ta%fv49$nw~rLJ;xOA0>}4MaR-8T?Kei&oxfFYmFCSZMH9SyTa#_Y4K(QP?P6fc zOY}C-aiqp^s?$jI4WcUJDi~!dD63?cN|$XIIH=8EwcItryPbF+M(9l#gYbrTUP@qx zy%C}IB6s^aGS)Vu#F!n%!qE{!(DPW#&5bjlXzo+CkTL zP?KaKhbOm%zDr^$UdZ4!ks)T58`h?y=xk|4f5=1SPTR!Tl0GwPj{EReD_j=~W-rWm zWX`Rk2XZoMg@wRyVB+<4XQ;wm-(wT?w_z8)WHA%hfO^-+3*9g{Ku`;a;oWEIWP|pt%#y_*H&xJJ<+=9balA^;gq*1bA2reUIDR2bNvk zuXEA2;P-L8jv6k!peU+RmP(Pg?5ZEtz&On`EhiHFPgzUXQkS)dBE#76Aiene;Z6qpsptNbiSm@iWB11W#LG6J@2SIe?Ol4r|RR;^$0$D1XCg z3ANbc-O1o}WXpDQ?Y+Jy?8G>X6gJh-LD>qxDxHEbt8YXD06BB}JgdGd?Vp14-H+^J zzBdU!f2=)AbcQnt=atL)b*`Yx#zr0=sxbIkS^RIaKorIO(^y}?_?NwAH~3`2UF2DD z0)HS1ApgUM_bFFL!W8vJd@1UsLLfUZfK(|ojVDjaR+*XOvW>3*EUuXAMW(C*tJhu~ z-t#4vjwCwFs;g=D%U*+=drc4W4YM7-0gi?JJ$ejAPh|KH4EMX-i1t+kaj!$^=yH2j z98RlLb2IEvC7xt46Dy*=l}~W6&~Pvfe5;~?Rr)+GrayH)#{SSFFE_ZQZR+_F4~s6s zOSDqB8XIoQI~}3=;j&*<<6EUCda2CFPiM^)tDl3H1f(UJSkKSW{R7*4F1^eFWQDtX z@%aKqRg5vp9SLIWMB8~$GDBkDY5}}-QaX-kS7LRtfhIy>VoXEHhkv>-=Ic=`j1Y;0 zl;^$Y6Pc}9l$GVu32a#Fd#pENau<=cW1vh!NR$G5Eok{p~N)Yx(N>*R#@D*UZ}g>T0Ub-}Dh58~5l(j7RwGZm9v)Q8s2iN@~Iz7CNShkAfBfxTgSODE98n& zPD~Ju$iy$0Eh}IcXoco^^4QA63T4zQCOXl?q?zjWvlUBthO>qjs74pBESb~PV0kVI zhP8%iqTcNdmUp9|Bww{R?v>qOeQAtUF_mE|6tU*p&@DUkZXbh>t|Mrz&-&S)1+jd? zv$hlKH(Br0CnlZwLSyMY+-ST{s?{3-;)zr!q>?HlFqtxEmJIvSvquH+LJSByp^@0Y zM;>C!cp58nxm@G9W4D5`s4%XM8H0VPrg6vrho`R!i>nKk9enV?-Q8V+4({&m5+Jw+ zch?X!xVyW%B{;!@ySu~XKj%C5X}0A(CZ3+SPx`u;SYF~3H@uFc zhVh6R#5DLeuccTLGO<&CcET-0`e9^=chop=Gc$$`cNs0kTuN*1b6dL5h+_RJyI!g1 z?We;X)vGD~kKlPd#{qIckfRW`3o8*Pj2nxdvKE$yzsv?&%2 zXWeAR#@Pn@kU8aFAsvzD&(knC{)%q_RXk`v-nqZ+wv7vRCHQmPTGzh4rYMqupuImegiZE(SL2VI;yQUPeEac!Me^a4 zF1$6%^*>_#`eZ;Pjp|aDKd^7}mnW1tkMxn{X!i0S$u_!r{rD$G-0*n9z>zb|&@nXKP95i&i?=SaJ2x9y^sN4s^kr>T_S-*yUA66JYk-tA1 za#pv?S0@j}r4wyLUTxv17;FT0D_p=KPHE8_M*c(ANYn7N1pFv~L;Hm%`BL6=sNDn` ztMEsFQx2Up=uz3OLWV+8ox4T!p691*L01{}S!~l~>*=9QHAW|{4|v>;o1hXgD9D>m zeJY=S&@t1obNfisyKDK&lCH()q5uWhrwqa^ZS*Z`$UJNGF?npi7AP)58XEzWM?poy zpU1D0u-X^0S>(Vq3<<_bT$YGD<0hko)w zsQR{UZF2-RQ|k~&Z>ar-B`#fb>cELTFgS?$Z_Oh@t2>Gc-MaKDFRvIMnM=dEvTWO= zWfnRKWHWTyMXRV@lWx2PDS>4=ajzj-RrmlcQg%9Wj}`)f0g*0`ou>_%CylMO{rd-gj$CUh>EkJrfN}mAd z7BDLv5OVOt^Xj1>4Y_D2liXaTFBB$zPa_iPC$35l3lOb2&cBOW&jcHvlGqYZB~>fub zC;dROm(nfB3P&zB3GYFinb6w14H3Qw9kZ}5ov18-7f*Jck7{11((%iXd?05U^GqhSMp^X zCITmft0vGhG`3vH`=|+72xw z3YWZZD1!F~R_q@W4JjG{;&?{YLSKqRkZ2%X<(Xb=i-E_VdN-x(|1@!S@t?dTiy&h> zM7z+2R-#VKv!pGB8=>sFS5Qj=eOn_yGe+Z zkrXvoFugy?@k;e(G{*HSXaO?xcnIM~ozw4_Z{b6xJEDVX>-6D{77b|3qD%Cr@6QX` zP4}?GDMd8_MTRN{^b-@OhV*ztr}M1-zeA~8aje?T9B6r?^ZFpto*r29#!mvLPPWJz zLw$(P{vg+8{L!Ch6X|DghY^bqFDR|Kf_M`6>)vwH+1+l#Vq~CCFW(;$sV=C(qz)}& zN(nAxWpPTVy4I#8Ggx_0Jz`|J62h}A`e%llnFYnbwDuc1l2$gucFj?@Dr!-p+KC|~ z68=Eb**JMoR1cA+t6~t0moLt7sTJyQq^4e|%`}j}b`I{IjZJtW_PLkru=Rb1o|amxt5nyEN{RjlpVuQMq!JIW$%&%#b?~_RX8iv` z@%E2}$96z+@Wkj}6YnoW!ppCc%2cUY+RBZ%FYri_ ztx|)eN|c;ks2l|~y>@lR14Sf@mH9#>rz0~4sJT@K^scvtaN!dp1NDW4u6cwtHi95I zMITfi3haBZC~Gez$SL0gP{aK`^>gl%+yBcS=p#p0NkX*{`4iLKl4!r?b~w zVxELNY9_cS82nSOBYYq4rMZ2@nshqM%@GCZEG-_4d%O|aaq$j#-=4B2>%aD&89#3$ z7p-mmk8V^39|->dl-aRpw{lT~-`}@?{iycO#)nl43uCHKVtEUzBR#j#jvTiR%&K;i8tl{{D2v^Vx zDb>)O3m>0AS?lD$HWd>Ak8=A4m(LvZ(SLUc47F|R064m{W_$S zqK-0<+6Yp@RHS0?r&(+lMV%`w)EpYpyyJM<@pJV2ikxD+0Bp;6>S9>h}ZQGE$e}ez;e!Sj9_mt!z8hsOJ z498q2zvBQrd*}2CYVZ{#;Pib^gpt5E9WECqVuXWYKkfZ3>E47PXWPepuQ~#fYeHZA zkd9o@iLy?N8?K8TSGJSs(g%@#pn!43J2gG_Uk+%$0s1I%dHV5}-H=$OgeW0Xunu`jrTOe;+y|Mj#jX{vr7Uiw3NOatL!70(HpCw}gCuyAj>PrLg)fMA^ARBX?Mw zycg^C`P3JhqfK<|-cY|%x%S;xi+?)W9EAu*e5^51O0sYeaq)xzsjHD~o0PCG52kaW zdMZXnQ$OB$9NM&R?|~Ya4-jTTDx<;>16NTMrsruXkOCcHg$Q$v@qimH*VqO_68EY@x0jb2SR}(hE#}t%?GN z?r!6Y%9TKbBEI3+a?|uFsX|zL}MUI#o`B0OCekc_h z5!m|Kg0rR_#@-07$AlRZrPuPtlEz4iaw$HpTW|A5y(|ygO1GIOYk8)CP@t0>`vLk)EJ7I|S?sC~VF3VVm%w z<3S&5pc}G5>v58z&-G4=R{O;G*{6Z|33B(2#1}b_NU5M=azYE?{FMfsbi%#w5Z@9q zIv`C^!%dC#Q=ej#gR8oIL+~?xM>Vm&_r*yJ9{yR%brJ>ze*OtAR zT8vW(u3Ajrd;&Bioe}=i7>+bW2)3*!B(%_Xnx$dmxfsOO2XdU{dZyK51KqC+P0u;} zE*HPMI2tMp&Z;@78>Y;(&nDN>+xTz(d7pbtdC8T3<5f{*3QQbKb3{^7O6Zji;k+si z5S3HnHIw;eS7IiO^kB6a00&PTvHbKUw%4!~UXoUs3=x8c-j24kam)NC@|Q?9Tz1x# zs2)rBc00BKMmO;I#6*$I$Jh@V6LqXC;QZSiIUmM$uS6PZ<{wKSI88BF7%mBa|0|3~ zfi3Cc{i}C9N}!Rna)>_UJBY**LK{eza}70Nh9hM3LtDDJB_+QgtMYL^zoGzsefMacb%7`%-}o`di-Hmw*FvzTd-mL`h7{k0q< zhX_HJmBrn-Tro56sQD~~@O6l4Ushvc4t5GGE?-}q6QWxOZqbfUaSK{QMQLnWp+r<* zCq>JhSy2sd-q%%6-6NytgE2{j2gb{TwaxQiKY&jTkU|j)mR4GDx|!u5Tuey4KQc(t zc!3qnk$oBs5wGmq~lnLgKIcO|v| zXmB>8FWZzTwGb5nt{%ARR6&b#?_~{96*RE2Q$UE# z!8&%g2tuJt%vZ}bIrql_jR!Rn#cA5nz7txVM&zX#^zsf@0?iEKT#N^!dJJI=NY3r? zVMFGhM}PlLKK2a>4LxF>VHF&MBNB-sPBIg|ofeapkx4|D!DAzRhb8^+v4SjVLk~5O z{mXihS!E%{Wy)IM8!_c$>q54oHLM`pQa11a6E?7Lj)wYbmYZ3#iP~B4_?u z2y`w@OJbwT`czI~UnG^fc#FZWtY(0)QUec{kRrcDM#xH9S!F`2xAUz`FVIELd}}J9 zVx5r~Jj$vX_ZWP$0AE{&NFaf&9|2zpuCpKSr6fy~p+}*35*4=97`40aex^d3%*bz7 zEeNx4$k)CcjIZ;T<2{#njnFT(j4e#vFyK3m?NqGuKM^P zKn_(^R|LHlyZ%!h910o^16Wc*5Pbecx*&^@T2u_>f$VtQ#}XYUC%4J#rAU$=W!e&* zi+gt^?9bjfU~iD_+qEwGyLUEK9=Nor3WH|CCc#KGSXYlj(h?=P7g+bafa2eky4kB1TFsQUHmH)d}>9zg3-|s(d_g8@<(mDuy7PNM#x6xadA< zKy+!z>+BSGy>IE!(2O60{!v*jAt||ClxisIT;INZZl9TLFV*{}p(Y+}D1P=P->Vgg zSiXv+nO$T*yKmB6R0Jn?!4Hzm#Qdi}P;@}UAhti>8aH`=ILnb2pN-TjFM*>H5{-+i zqN@stt0;$p>`rx%Iu0Abip_|8iuM1r03wApM0f!y#iq%>-Z8%hvq*`K^Y-P1BGX18 zBEbmlUXP7y{HTIfxEtd2Iusrq?UI)bN67!GGMJiEi{-9|2Mcne#o#8$; z<9b9mMeBhUdx_lBVo4_o8%jMAX()LRacF5#t<`_{g~v&XocRHD9bYwS@e$YAVrY2? z!SJ5FaivAfVh+&IZAH8L`Gm`VMlCKOA!i(1q%{T>hb7%@7*8_eb+;C@)c3(kQcL1m zt;?XTC+#V($30o}4Gg_umXaI?C&K3eLNxRjHI1!uv=+EGr?2K7t=G9<_wOs%7#SqW z=<;DGWPQ<6>Mcl3twvN3Xz=YB^5EyWn@M|0@t>#`B9M@WM`OgzsfLY>?V#Z#kR(=_M_Idi((^Ow+Yt4nGNSRB01m)E4q$s>7HAkb34FTfxB~Tu{J|A;vd(#NRO@!9HJL+Y0!M7o*=g@>qG~m{D5* z5yB)OmQ`*vPoAqm(EMAkazO`}g6u9FIQoy-xL+w9o3 zcOtRskd$!|`w4qT--jehY8|GS^<9QU$4q1>;16e@;y}9d{cRtKxa0{)6WW_yNgZHn*QE%%!TS>{$ujksd&3oSIF0cE^`=7z zguIU6av0IUO>@42`t78^`Xf+e9GlZdM6=tl$yi*7i)bTGJIhJFZ9il2KRRj$w zZzl5m5pweHjRdDr0>H~DRtO~EskrZuKPaaYV6sJrpV%hER8diYqCu5I#(f2eB%NJ| zF!xh~zAnkZW#;5Wh~HUqL0+4z6_b^+puQJ zB$4&JklH5DBX6Zs&12O>9vOmkQ5#9xNFck5FN_W_n(`3<0dhvu>1hH;*Z9c`pNa!U z=W62qGXCZ@5q(nEDnS(9h<%*kKr|zx?snZ%FJw0W{vGxE8xwYr6^5U0t0z1>j%-%}l;QABNHCo<|= z6UZBd)0s_o$7YYxt+b&E{ZFjdp>>U@`EM9tJbn=aW}(uFv(Pj<$usv0nydR?QlTSf z2vTc2Uz>{in#_dc|ARdwPYhA*&A5HI>-vYy%J>@9P1a~lO`w}|JX6W zOjIgmdI5k=-ANZsm2ivz)07tpNYa{V34A^_Rq6>w!H^um51c`xVVj$y24|cIMC0qi zg!P3t4F3fe4Mg_+Z%=TNN;*+#t%0&DSQx2@Zi=+4i7gilGCb@~=uWe$eUZ(qX3Ah1 z&FV)`s?m2gRdl%0AXll9esk7hs9fWam!4dVqx0duos!y{Y53hj)WLqd9kL4s4qRPs zam;cxWpZm_+=;$k#E+fP7E|mh`F$0Gf_qMRPrGXa=YqYC}a<{ z2I#_Z)ZeDx(60K_vP8UL#5toI)&zQ^diEo_KLgeB?>j>T%I>Tj3zz)B@x?r&|GU2A z&*_c#TF9v$-O740#W|>eY7~MD0@S>!Jx+2nYT3$gemY3OHaog=4TyDG;TPUn7yrmy z&^8&1Qs-Wu49auRBn2z@y0oTdE$sK!1eGr=MqR~A8B7E4k=N~#YB#O}IWkg4yPXz4 zn%ShS3Sl^=y4-oNVw;Kz$7Kl|XF!O0l$Cra61ld`&x|mOOT2a` z+7HgSUjor0Ws$9}v%n19A%}|Q6a5P^4$|)@hME^*nF9(sXnQ;-l3x`l+;Nig`~K0_ zkrgzcw=M8G1Om;BU8S@2cGVC8C&ZG?piQKR%f<-lLExRt(w^?sB4I(mSHLJ!%UY1f zKd%wOuGtYQ6KL=#U2;m(mPh=r;q$lHe%a3FO1HdachLRtTSNqYcxkK5p=2(vqIId% z6GXD!=7?J0d7+VPZcz0#&w_)bwKjVG_HcP`a3CndyCMkmT_EG$l zMVFS57K9Br+JPG$7)XZ-@PURD)z%c>|7ZY2gbNpJaMN5pIDF7RfxZx0&*`_3_W3Wo ztw;3`o!yP%yN7}{o?s}r`swrjZt~2``)sycs=aDVvPpAEd@UD_KFbjd7~1gGb8AgH z_GNWyBTi7)`qh6mpvU?Vl{w!|Dy!kSU%D4iP=Ph|_J;SmUGhLKAifY(S{Yiw$@mj1 z5h55#lQ7HR(Q=AxemR5Hd)%6GNCF-pX{o6GH@L|9NWbARnbE#7bxL7CpLQeqNXLr) zn37afwZT4}3tLR>YobBux5OMcvjfI#v@I|yk0)PEYju#)g1iypuS1L#43LQnp$Y#T zY~yy#Mt_+Uawcp*0{!kF0uNhazI{CN&g;J=Jb;PT-Cwx9$3=!@5>--DHxOGpKRI!BdsZtN(`??_TL7|@0bV)^7DimDI+bFcc)?D%=D4#uRSUq zs|UfHKGJ*Y01-OpsPF-u0;+$M^C0Fl+K)Zx-jkNr zV-XE4l0t{74`zWO-P!Emj41@p2Yse3O@S%R9% z&@R{9S&nN!Co~GbfO`G}>Ez^uE9joot^{gfQJ7k3w}6^eOJcL}tX54+fPhYaGme4I z38S*%!+qS8IFv#_sPno&`<=}WYxcPT0W!>#4@c%gbqNGT6fquFo0*;&Dc37?^Tjq8 zim9-c41ydjuMeFfNiZR9ijTA(3i+Kk*>?uv3)0Z>xEKv%b2}vY_qui;;(pOQl!(y- zt05y7aicjv!j$j_;YH7f(EguH8l8=>kPx6Cr}w>`%WWFTWIhc*6h%jLDIr|RWVKq9 zljl@SE0sv4P7Q>fvW4kcDj$iqGjk(Ll4&fLeHjQ*TH#4@HHL_WpF%qi&1TBAWOc@5 zk;I|-_i_&iAFHXkxb%P%gETUAAuH~je?$KLT)q~b;QHc&bIdLxKvhFt|Zugioh5_P89~>pq%TP*AYX zkLCZQz7lpEY;D6E+gD&e-LNJfGU?W6nLYwgpOz_V@cqS2`kpZv!{@cxH%u#pT+u9m zip({_`hC_-w8$kNLZugIH6hn4qbDcWZSasnDNVxbNZLZuaPc!eVK%8@RM;J;^*g7e z(B$ZwC-Q7*$ULJNcVT%uO3t@`u^~&ejOl_J@&~i?D2Zukig5XmsQDC$4%Q{r>X0Bb zh)CT!B3_?jQAlzbr$ls+Ol-VsJ{lV=Ir&ZhI!0IqCI#s>AJ+sh0+==ufLym-!-F>G z@$&gj{-+UVt~q`>$az@T$gHID008;-gkLR~gq{o0;{aa0u2$3Y#VBo=ro9dL(5#J| z=MdAOOM}tk+`(o7F}>1acg(Kt^JH$Iyax+bG41%(YJvdU{h|9u+g2#BHiePh*P(H@ zKl$9^xBz7FWWnq}ODI0a`uv#1Ke3ItAf=aD)D|8@z*kBnVAihXKL>~ep-vcm;;7HR z|6MQ$R_)z?EsCBL0<|AfYFJT3{I>Om@4Y-)PJKj5CvH0kD}p#7y3n=1yaK89IB0LZ z#*)_bp;1QR)k0Sw@36{Mus2Xa$+VwJSX|v4Q=v!oBnSk`w-6b%qCs(>R>r`f!4TnF z@OS*MiqmD#>Ws&mD<-AkSA!(W_gtezp1>n8EyOwM56cRlHg7SToM(%Oj&dw#Lj#BR zhehPONM6txOQiGi%B3gq>%fq&FL~6`I8T==B$>SyM9Jh+~W*A#>x-HiegT(1h}3|4n>)2x7aIEn2m z@7WT+5LD`B#^-hIVWQ7fs|1AbCaCEB0~i)EBhE8SR*Qp`S=pUy213{pAMXUmr11`a z-EDpvhycLln(}JI55FGx5k(K&e*k;t&O6T=R<`#h7YeX;!uxlx72!9x>^C=kH9*1{ zNuJXxf<^D-V-pPc`NVIUSPPPrC2q6QV(4-C-**)ERpL)7g@WFm4>EXHc2=;CYP&z) zkYHx+{XME@C6tQT+O=_U>$J`zLC^<2A8r?js37=mXb-E&!*g=w7=(vV@?os8HufMf z(gXH1=d2Hx#~D0if86W~{gojh6|Sx`C=w^tEhvXkoWCOST`Ve1d+{SMH@*`ZWsDku*f`-8%Z@+`}v1l zLT@0Bf{kWL0iw5JvMiXAn;o-7pB1)p~zY z?Gpqji-6;Zp%ObTRd+;=#v1Pcypf7y{j&#NUKB6TQsTRf-_Pu4Cq( zYD{VCS77w$OdtwhY*PG5T$_~e@J2>G@@Fwe6s17tr5OO1jWYBkm^<)BUN;z-T^<%i zL?~*2rEB=KbR{09qKAyIB9zhixD-DZDwKPoBB0jvRt}*eB1Irji%W(SS!IoH1U73D z6w7B?ibJ~xqo^WlRDd#h5%adj`g5rQv50QSP=SS6k!AHfCxS$&av z>!%Z+KQrs2@eRk&b0e&vgl~-yXn>TOQM1(RvEC^i4dHatavJ~VHw0KSAOO^CY=s=~ z=0t-_@?&sg1PD-pBG)}DF>X0a0!yi%hL)GXWp2`%q?pNxbDEOc9MCAeZpCnY?~duA z)a3e0Bwq1GIP0927=fP?I#e70ShBfRHfY9Jrbr=Wm&7jezGYup>%ta@?}>U3Zs)%C z|MB3Z_YpYr!$DkLKM0!Ib6@Pk&{7n#oxk=fdXe>JmVwfYP^PnbT?@U2|8mHxVrF(N zB-6fAgpPPLkvdd= z6b=G7q~c&J3C-!;b;y;dsEPY@ltt1i6$%GMX(YE$+dwy^PA}z|^b1bL%~xacOJ!<) z0pJ!kgm&&iJ;`Ugc}REvGW=ODy>T9V01g14?c1G)+|^poRNvoGz1ibA=s~tw&rP#R zcot>z;5_pYg6yEtG!=waWmsAGfC#UFx|zOKTQ7F|PQJW@ILG=>9zY1!(=yMW$0;25 zvZ!_`7CvHpFxj%+|en*TWPHtFo}hC(@kjcJk({zKy)fw4c zN}Rw!IQh12Wb8}49yTn;C$dgk5;sSF*Frw@*xo&E6Vx&!Udu(P^ncr{wULQ)M|%fw zlSl1!>2a4EZ%B^`G7FO{9}gXM0w#5C=|hp+sx?h@HKt;KS`T7B42RM%4NLt_^|6{s zSVSdFk%ld($SBw{6onq2$tKmRlU><}#esCX&$8!1>pxfRBCz}geIVc3+hD-2D_!SY z=ZFB&ICa&PsEyY=K*v4j^pJo?GL?J>GMrKuLkct_=dF+44V$am-%sX6l}tEoBLyN! z21k4+&&ZOT>C1dq+$9BoOaX&?_sQcM@AvwykxoGWeyb16G#_bTASn`1X5hFcl?9;d zpXF^txX1}G56=kt`5x`@vOQa6);a@4`7ZQaV`6P96j>aW1&k*Q8(k{XHvp|f{Am5E zE+(@n(b$dSi|HS`-BQp1Ule*l?tAG5j90|au?xP{@!r8p#`23COoo>p@030VDp+&I zB#(!0wH8u@UXE>01PU*xpAJ;A9Uz#$*=l0tAkZ`QhsQLZ_j{kVGl^l80m{;rU`%}ZA^q> zNk1nOVa#HoC*6I&Psi+y6p1JwTK#qnL0}y!HybjbZ7Yo6vLBI!lrC}~{l0G~a}U%F zNqYL-(7Ocs!}E#|pMd|V5>ld;If~-0H(0P@Wq||za8>VmM*V|Hwf+JNmc_3&Iu?F- zy`^Nkn5z4U$ycz?uwyLl!)Ipji$z&*;q4^dJxJ?P`$Jzi2LRGZTOnaFdQkG$4;GI9 ziVc`;bO}vL`SI?881Q(*^H6w}YUGFK|2<#V`8YbN14NcrHXP(?|8K6KInI8!Ykls#Ie%F3GsP%jyS#KJR=S-A&g}9`$nk8I^;dc+=f6V{3JG`Y{cBhzKqnd0- zh@^2kv(f|{AYjuE!TG|7H^%Ac`bNBZ_^Khg6S7F^e4|j^&Uf5PCL6ZbVU{?|HxxHO zW|f_obd`S)GqG03N@u2C2209GW%aRWs;8(hTb;Pgn zyYcYcCSvbT?oe^rHmN8@N(_fy%I5d+=zw%92+*9M_HBqf1lYYAJU97s7A%i_RtYgJ z;DH#~)8k#JXen4|d{kU52Efa%`|}B%1R_{x6Kbc*;0mgm{~A51cecVs zM6QhKF@^eDMB&e{Ac1k~a3ziNJ35d@+&^Fks09K>(-_4BBWg(?XgLL%o96SYitxWN zY0Q3nLU1X&ZRrp+FnS_m9X;EX*yoHfbhFkPK6jJ_3OOP`<2#POSIUTVi?mQh6>rdU zxfw3k(f2qA6+BclALTx;fY%Q*xJ3$bcF2NZ`M=g+brU`lMc^Yamo%hP*rQq*lKkmu z#POz{An|9qVpjcana*$bMd{AT6S0`t_U>gjU^wFBW?0)?Vj||$k*GG`PXe&Gj0ZVb z+??B$OB`vgK4uwIe?ij`SJ0k^hn6SO`WnF3^GHG6pEG4nktpR zANmr9<==&nF0{JL3D}MIf2B~&;tP$6LMVg$>gn0)m{`;OTt3CTVu$>M5s+X@Wj9*m z@1buZwj^EgM{S>2Wm)Xk?4miCOd<=Hv~IPTjM5cAZZ<5tDxZlN-Sf(fb5v%Rd-V3{lEoz8k zW6itC{}$Xovk>&x5-)i^`9e}#oV=YcV|v+MiihyhQvsqxiaSa-LK~yc zQBzPRV;3$!qVsImjNe+%)oLSXk`l(b6F%P4$!Ff!hJ-+W1p~42)O!1Z(XPA4Gy~uG zg@#@$>=%n1=vHBQLAbOWr1T&s=?g?erLCoz0U#>!&=OlgLV9*_p=DeB$pRGW0n+$Y zzspkd1?@2M#PDsM7^VvUoNKL2du7dLMajfNhkgEJBPsrgVITe?6nDt45ds2~yt+2z zD;1Mg_h(1(@Nn9x%+cmcV-X8^B!+Sh9F|z)^)~P)!S`=i&gk3$A0Ubg(yBpZ>6}ho z{8rxliVR*F>VDQ_%YMQ!5o?9?RfJA5C&BZaCY|hZaQG5<-|R9v-UccBB!X?Px36P> zs>I(@L%sCjcLNZ5uLrJ+K%o(*Ga@Hlm*?;yT$9T-UrXYGlEM~@YPyee-rI#7;%$im z^-;yxu6lsMRg#79mmiNWmm4l$jPw!2ZcV=+C@po$G~FL6L^0U@9wi;jdL+nc1j}TZ z)~#^iCW^$4+X04PYAC*4nubV>|Awg{nZb`PtyA(VS(rFdt)WeG0RVObxb$8<| zs2GTwoV0{bR>$@YE?u&7HjRjoO+1bZkt+I*>ECo@HXI`jP$Yf@jHT}+CUc9Tf}t<- z+6~wO>a0#=ktT^kD^JN_Hzh1Z8+*l!#UVSKj_2VC`JHhS6BDHs<$DL=aU8#@t*93jfi$@9U9ABtmw4 zhh-2k?kK8`P8D+aq-K6)u}b}Umax!>gf4c@zo9^K6i?P#${eN6_5afXK$)RHAK?<> z<$gxV>N84VpHUL}cy&p|skfdXuVJ45&Hq3JFnPNi&kRAP<8&NX^^S@m>W|U^15C}t zE*nTJb|&|ZeE$}`vGo}?%)~7U@dl39V^~-6$0gMAQWnaK%J(ZLjWHVV6I`Y;Hv*({ z){(k+6Fz4U)f%o6Xwol7dR?vPwmAN`fXE(yzcBd#S5;n-!8}$hatktS!uc)CuI5RQ ztK-N%&GX9R1n$vr23JH>X3X@ZJW)knEm=&HWp1!p9p0+Qtdp!_S6E};A{nD;E*sF~ zWvqe!h^m$dJ)6}u@~DLH8{;Ngm=H8+K|KT0y(;J5tYfx!1PRP0;}A19!mK~Mjdx$< zvt5KmgP<%(w-9`+yI<}rwAh~dVWbJu%v*EP{3KNCcsE7n8YmM)LyoB=mTKQ^f2aH6 z)pKy@7n10?`hR+ zsZQ^c&=?5H_(4?}0t3C-Uv}lWy|pzek8}6s{e1r&K)RbjZ`*!3)pG2(YtC=S^`vV5 zX&t0nP9$cC6-sgA(yO31d5FM~x zwu+tmdb7VcFE1S1mDW=Xz)`(ZgCH58`C`IL7#o4-Shs0P6@=;rAww|XWo%Zl99&&Z zjU?ZrKl4;~;bj0XLCkq4n;ABABpL(wd=Qmn5Tn4i6knHwVXfX~$>A%8quA|Kci&b2 zC-o^}i%gEGLjb_+9 zi9P8VwrF4;%4LKU-9^~1Ov~-&&FePKQyol@8&bWO;;}jYMq5@o?BBf>rSn5-=en!_ z4IQ(z7J8QLXwZ=P`)G*;-WLPB==s=R^{!ua+qWa=3$E{r1(q^aS^Zy)k>r$EX-!A# zSjIWZn_x7v=`H-ZsG{Li1F-zxFy#g9{&E5a4?AT{GO-vmbL;ETAJ#o`!c*Pf?fw}7 zLhhy+9I&^_4$Qej#K^~OwC(Iz{jPTUT2GpP`yI`{XB&U^vB6ET*7k0>?XEaB4ELlI z9%!Z*VbZ>ht|pD2l;+-~<3;X1fRv=biN^%IE5iOpgAH)HSiJerL;F*YrT7{9) z9|VMS^Wwj*>8yk%;He&&UL*Ydi!IA#jD6ah^{SO4p`X6oB?dUc`#ni>Ml(^ zj5_i6Q0x;?*5H|>bSg?5jMR1N9r~;7KaKiMm9K;Y%@0`3A3y`;HPe<6cD$)VU_YfPcUKzI%8R zdoFgufglZmNQB$D&FM7RXMU;SPlU|9Z(O_;o;LNbm5Um6hH#B!hJ*oN6kIfV-HuqsvG&C$ZwKCevgfzr|x>|}e z+akl&4jW>!Hr$di>E-pLt|TH4XteCa?3>d**wS|1M7++Aq$sBw;V?J*{ z$RarX!Jy$^z}}E{gRAfH=k`8L-&hp083xwA?y$0lFF|q)2SbrYUH*z%zzP$e4`}`D za3W@&FzNfcWEVWuS5MJ_ktnD?ml7_gjiI>3}e&g+ec~2R3P6 zxHlHu-kyx&Ix~p&n|=ZHpUEjsLG^-pQmeBTV_Geh^dSgVlBnOQt>o1pFrdhSR&fr_ zv2X*nAyq@z(9^|O*o;MhfFo>9VstA*i}MlUV1e^?%}K`#I5wO~ocQ*j zyj_QDcy=4zFo^qq26_h}@TmvWQN$TFON-5}+$2YLvoW$fJPPWIu}|Cy6NVf0YFfo1 z1j1H8`)Lapz?pfJ84faa!fLe8iJnrR=BSsQpk@dL6_++EnG|{%0gjY;1*E<19etDH zCna5@ef+iKlS+8GKbyEs)caxAc_~bjwo4l|7Yib0&vDx5|#o)97~o}_mFWdi{4Pk>yyQ0O$llljUtPs8{u!ACcZEW`2>F7EpidZ3^Xnh=1a7AtoOZ~M%{EXy z4E#$#FFK?TQ>en2;r$(gY97Z85}Do2i6a%gHqCvdJ<+gGT2ZAZ|oBO zIa|jZTl(|^oJHgHK($s^S8VFt!d7I_U-19DYR!g>dcxFO2zZbIWQ^hW5}KXis3dV6 z=k17*k&*UB^H0rrcz{v0sWO1LQ%i1zbd+%-K`-+!>~NZQPC`6iQt68ccuEt&_xJBi zC^^(~f(SwRkZfq2He9Z>ZFi6;+SaIIVY(jMJn5hE8yb1OBq_T)Bpj=_abJmgqL-i% zLkJvI+$3yr&KppN;#}0&xb~C(w)6D{r@rb z7Hmi($c7eN=bKjcS?76halbi_TAri>^(o>o-5Zn z*Sc&l@wP(q7&`~;d`JqHFRy###?wDb(CmAqg==bhz{`XobGXjo!Y~!!@uTK?Tt!e8 zUk4L~(^y%0gYR7-gt)&yPw~RL7bC+!QWm0K_0p_@gDcry5Hm-It{;vb=Dk@wij+w? zCD>*<+@YvLzUY#J_MNkci77(fhA76DIb^)`gno6e_+PfEIZ|}4ZN3v8dgCmcoF1Nf z?bZ+NYd!G}FaWrqS=`w{W(@}-=pGpkS`fzj*0eK6LnJdraUr4Qk7BRLI@#WQ+;Iu& zPQfwR#aRL0!q5N8*$jj5{-z|o*C+x{O=?9j(nMW68nd6^ zRlk45&GNGug$}lOz$=2OxDOH{nkZy#@bm&J*bh4EWmAODJ-|m+#VFEe46oWOSZvZ@ z-yifXsOaluIahK@SB8nA?vk*!i^%R3}c`iTBoOvc{nd+pfAq`9yMOHqGYQf&22 znInnz(>C_TNb2+D@OYr$YWX!8Aa|&_1iTd^=5-BcAo%Cw&Q6?`c;s&@;yjZkZ7ONy zNf(pXwYG&?YnrpyzE=j#5kyZG89U`GvQj9_bzDtMUA>r?AyGZuVxM{OqPVDu#IbZO z=$CF$;}$jb6Ja#|4Thw_;?)#t#~d(OQMo`6<^3 zk{DC%fK(RuzVjO>x4xdR7w)*_H*neO&;_BGN;HOAnu1*FZDbMRzYj&6|GgaHq@`bD z_pIxHll$OKpW$Cd=uNLD6a61}+}Fry=)po`iBkBfL;G=eY1MiL_}Flu#Y4(q;NGneTLw?W%n-uT_I&iW6c% z7&Wk}0Wtan_G^ZnDN zJ>{P;{~3?|pS@!8aCP_vYp3Ob3mtU7ysm<3_AkPW-;alZO;Tk`OYY_j(JDBiD_H z=s{`NpdED{T#%&p7T4LcSbU(RE%NJC5P~@6*JEm@2?>*s-El;m2>3T?c{-?#!8!cj z#(6uX&~1G10z;&>37$hL#m2*l`<=L~Q?`GWd0;nF*vl!lXyBLIZs)3P_cRG5JHkaf zKhc@1f4CrY^K77@@oXiv&Y%hH#o-oXnUz5L}9 zlZK~hT}j24vt~8H#en%SimA}o?jrS24d(CnPUWbZaG%w567sd0;9=MGZ-g)RY*tzi zsAGmkRj2D{J2zUDBa<%@)H{f&Egvv2@v=>6ck~thgwqA#E$zKbe-O~n`Fv~{Bd+Kr zS0N6#jL&!qBKEU@;kQ`*!Rw@IAmM9|W-g+tjt+yS#Op=~ws2ehb@ zQ0h$v58=CN&H4}8y&L_^z_$C9Y8gBB?&0NdlyT|C4-Lpd^nQ36gom~rz6(5|0VlAS zlNseuf3hp@?IFNYj0EKnF&Y^48yk`m4rq~SOB0118d6{uGU$bsZmt)wG_u(2>uwmq zp%(=8wcII~@xv*$%s*pnvwK50QQuy*@;c}sS?k<{y9&6vVZJf)$t*9ANDZeGGP`il zS>|gGgZ1>AtDea<8KJ;IgJ;We&?ViezoEXj_r6~CaH}<&9ZpL1y|<&qRy+uUrdx^+ zD#@tV;wu6xsJoUm__(f zNvYCd5GFOCSr)-R>q{~lh-WGe0M|bF?UM(EKklhNLuitJ;r&!u$ja zFI#_SvieOq;=XJ%#2&7DYC01p$cO&fS_55brPA$MyqAY%N_KNoGxD>FjO-W>nq=W# zPDFMnvS&bWZ>|Og1*b&)QQqt*X4t`ujkZ2xTYzbQ)R2~T|^C9WZ?vm0#$d_~qcN;?@@~D^&j5qm^%t?Y#X@yRFgbqft zZ!9Iqj#_KjC)zZ~!<-){j!S?hXIE4+L@g)7O#nn3Hn@;T={xXouL{Hv;b1_MO_ORjjcV_VS7b%!tzM2##tS4I<9#S90cc$^sKMrLUDn?d^U6Hh$ebDX;u7o~c zSN{tFwX&a4IR@%4ukqr7yOEZDQ?>2bf1Lw*v*3`#{eGD3O3(ii`am?-+8){AN5<87 zP{i=7)ZMmNEOIQ)=bucZ)RVnA!Tm-Wo#pO<(q`itum%;~pmucw6FS;K5;^6X(-Xuf zoV9yNym72I^7to#$X`D`6T@HTE=KNH5vOY*hfIBVt_Vo*gpimWuGb`)Aj?OG7jgNVW?pdNFI9B)2$RW+!rob|g* zqRx$tR{@D%xj4_(jcTf_mjH?9qhxMB{=Rrla2TNHNol52%#RTR;gA(>6yW>E2N$G_ z0)u;JcXzW3nW}f8%AC_;5OP?JhK81qnHfJo6=*OS=H=a%zp{!C+F4YGfstQ=ON;TY$OldKPimuLRt^tx+!+h!)!`du7%ZrhPvllqSibBaSA zBH_$ppGnZJVTBGFPYF^f2b2)Rx$D}eJpA)R3oK0~?f>PNOG9DA-soSdwX)3i~IXANqTPP&p_31zgL&L|C>dTd1$;@+|0ASv+vm zDWhN;U%|jwp_v z{@eLNNb(%xh*pi>)TdBc3wdVirz|2eycpjb`U-tAkkN@JsI&S)UhYGT zkcSy#sD0;WX++dr{`>}Byc~c(;{#?yR~j2`D^nxBBgI9sQ>y9Mt%QzEh>{&Ql1)-rOh~@VXc3L;q!6 z5frJ;Y)C=>6zMxJe~QoL78)s<1p zO`Ar@6)VMx@Y70k#}TzQ)MnTdpt5idrS`nPg%d!CBe#8xr1mDF6H?Q*JxH}C58JG& zHRYh8GtW?Jw+1&#T!BgS@$@{~x;kF--6#T`S`$&EH@&wE|Caf*GbuP^o(~Ej@>mEmE+A?*%k|(!<9c}3n{4m1o2?~z0_MaDE3BDqG^&aYj+~6T zlAcR-NX!R;E{`rX@ZOFe@sK5NnApkc*k`aAmlsoEGAWCUJ>U*;3aNj4X;Ix!OFoYDhJ$gx zv9{Ln!I|X6P)dTxUn2xW#F2tUeaM#7Ug#&n_62BWxVzN|RRZ^sEN!mQ#(PpN?E(sK z{fwU4w;j?>PC;M7>2y!zt#z+5&pr7)90RBf4ee8TJ)3?9Cq(VDp?sjq`VPcb1t0zA70h}m2ff;{ zqmnyY12XB4ZOmi-p>T}cI5;vq{-nsvL|C7A+@cuuMS9h>!>O8mlnkCUiGk<)*57MX zqJ1vf#`!6r_+QVKE^hxz<+ugp&GO~h!_h4<=Y>zMMU2Pya5^~LV(cn@EtB-d5)MCeF`Q|T^!?9Icx&}3_9Hjkcgn@=TjDahjP>@*;m0W~Z$2~_piRky_fSBx z=N=$-K1EqA`R#DbbM^yCL@MGQHfHST1l5l#g*q@qG9*#emXWufDsHKu!N)SExDJm3N1VTv(-*A9Qo_egV zDpk&w%9t&=q>~Xkf{T>EsluX29j_nq<1n51KGBvA;EktjcTN(1e9vxZv8FIF6?gdAN4{1f+MT(`^;NxHJV+hID zH=iKcryC?bIBpX&W@E(-`B%^%M=IubcYO{8rZ~`Q&qw*%20qg{;qG83%`r?gteeze zI-NTgk2d^Xzwf?%el&Nd2Rwk6mAatAMl4c`kcZpERuxc7YFl|`h?n31y zw7k&@p6e@KBPnc0lppEs11XG6Jn||j-$ro2Z17Nr+;xkVqNJ?`kGWyj+{uL;pfBhD z=R(mZ`z#eRf>7QbP8X;slxx4nvIEXXfeLVHzB<&BJ}CA@aaP75mu1d(ZHMmNSe~GCg7Z1{nqS_L)!mk0Tu(NhZ64|J2R)l6g&!4p(;AW zhqA2%CFu1{;d}?}@f~_?#;)dYdZ(6&X-(pe=4X4^aUI(g^$RBVixrcL4m}%_3Yr7V zHa*K<$+X_tiYT81qJRB1d~ilUcVbm%Ij#$1Mb$6x-FTWQjA5KC`NBJL3y z8jMF3l(1LtQM!^5|DNP?Di@C?2uL~bz6<>)qOVHW1f&T#OUk!QwL3H)zUjCoF5>_D zcZ5BsvJ$enx%uV5|6;2zKq#Z$)D@HfPZD&F5n1n3E};amG?Vr1`4}2XM?>xNjlpEz zd$NQt!B79|z`Jcvv2kfV7nD0x3-1rel#kjZSd?_Pkzcd5WV5=}(<8VV1skF)LP$)- zo`jKp_c^JXEVt1B-t88=5ydqif2@bp;((JdfmN#Xil3G=n z^L4H@u%(IgA30vQJQ`|pux9g&q2>py%HKa|NAtAJEqX%&y^&}+ppa`#>=`)}JE z;@in>$RJW4Q5W7SMwT^c$`6o=F_7T7ssl=H^#K56{RJ*H8*R61J*k}L5JJNIZ5(=x;ZJ9fZ+v#TQhmQPyYk+Az3_ZhVxJDGm7xG7Q1vut%DcwVefLftiG#UGdN z95+<%v@u08i^9qqsTWvO{uW*xK|g|^$7^1s6a^lpD_OMG5CA@@2$1hMk>2|A`l$Y6 zp`Or7plS^Euq!K6;mO9X1|V zD|)hWYq?4n^}t&v6Do4U^i)A_>JJiD#rPk@H8=&aC3#9w%C2F0N6qgg()A7ks-5Y% zzHD*2|Ar7jr3ng32n4>@5MT@LAS)MMz;c5R;i6g&b?THx)dc6ldZqywI0a?tQC0~o z?$CCv_3!PA{K8v_T87L0@c|hk!0YjH3pi~R`D8!5p+0^bzxEc>K?cHfh(ULer{`?` z3K>@48DEk!{i*&VL5GkgTMYwYPt!!Nl@*=P;we^Qt~0G!$&6|5t8d}%7LVw}Z|`NL zW&2umzo{xsQ)Bc`hLAZ~y!x=bzGSXe?k4r^X5^YA>e0Bn&)$99mNf`m#g*b`(Hc!7 za%9eA#L_N4>nSXMr!qTrd_;DBz|8EtUVT3}D(6w53Zv)H28F8Ctpoxuu64yFEywF# z%v*%~%S78ZtcC+Q_LB9Mh#88e?Kq+HlbUgA#-e>vf_4GZf2%UudG9o0FhqS&VlNf_ z6OQw*tRaG8YheMPoMeNGs|11*XTYns128kgA zVJN8TZB=^&AWZ$P*-8qwsfNe>gf6UMMdPLQ%nKq$|mVDKOF7dF$n`!be z!zicppW2((FIXWp8%a|&F=$w5P-zxgh8oD3hJxpYfi4~2iE!vo!r#&wUWFs1u&Bn? z6sYvWbrO7daa(zdqMUWvXjI3W=odid?s&PbxVX%GCI9|Cm)icd&B%L~00MCt7r8~D z?-GZ9-8^krFF(L*eQW;3N7jgc-LHm!)T{1KjtXUe&FezU*_kY(2_h05jes;8?Vxyw z`kv&Zd!)6F$MQ!6q<<7(A0Tr6-Po$`gxNRz`XNvy4csBK-C|`mNAt$r`4SC$2pV!m zS}mGjU78AoB;9%b|5(9_nEojlmmfNTt%J|*54k`A2({nT*!>a;IAtwO>~qKKBazuWV?#DkypT%GUxMY$gVOMv5}@j< zEwV!oDfj6_F!UXrsmX%{z(7w|B0#!ralv2!OA0k_G49IM?MRp^{q{gLaTp|GCr311LB;(Xa1T}T;b&A;I(=r_D&eq-b`hMJQ5eQ~7PfD!&qxr=(f z;e-i2=<3etdK(ECH4*a);ETg3LB-emXwk#O*BiJAOVG}yVh`GZ0}=I!=7ScI;IhiE zk{rl^gN%vO4!wI-dGe5&nE#^O%Yx zQLChUTt*ds(fH&OzACOg?<~+91@r}Fnlo8IHZj~7>`--;Y}h6IcO&FTo@^0ZHhLgV z90RQ26qc4#VnIFTgjBwFWxdDUg7XWR?fb*~Of}hMbY?7W4blfMeoTJz^^9tjSbnHq z!uzyds{i=Rc@kOG?PvmB7rw7lYHuHU_+uh)zIKC@d`EoTgicUUVx*i73wKHQQE&Yau?$NCIAdfB5`a5pfC}*>fvlp;*^Es24ZBO@J zF|l3Ce~^$454B{exAQ{(TEH%Cw*o3>fEj01(r>`vN%I|*cEqemM9#@uM>dj$#djwMi}&eAy2Imz1q19aH}Bty_J zvJNcaB?*T$>A)W7=ONQ(WwqTOdj~Au4~TvV)4T+rO|8F!((O6B=%LaEK^qAy>FMQc zbR(T5?d4nc7;OXUyR zycQlziGZ#20c_muv7yjxHXnQPM;DY!<$%~D#RSSlPLE()9saDI%)BuHaqAmnfBQ0cgV=Q;D%$9F&&7?Sm;_tw$tjb3odvX0)$txFbn1siSYgRFgPMa%^Nxb(J-eC=Dv?ykG|tq|HCRy z0L1$#g9A#*LFMoXyH4btC4t~_d{#>fNf*oC8nbQyCZ7iT!7ZnDD)GFx;sXj`ZT^nX%W+6$kN{)Vv%RyMi^TBnze-W zM%Z#AerOr9?iu^s|*Z-?=(Nqu{BwR zmo})P;WZcAIh2lU)RCgKY-%Ko*#*jQR5>h*e$$xQD5tB5jmH0L5;C1KsEBAi4GLv& zm%Uma$_hp%P5YXBCN#S@4>ax&BLa*z%EsM!5B9~&@Q3i!uxki}k=T~>Mc>KYA%up0Bn^Qa5wRZ&3k>W3$lCwa(tPQ?~)A6sHxYts*^2$?rTdy0?m3(e(N>3tFJj!YmvTx zh-V!=3jmKF8T6Nc6a_4aym%s%dDigQCs>IC`tQAYrb(cT9P=5tAt-`eX4g9r%o_U# z3gtlS`elxT{~Og9apRZg`qB8^$iUzFIot)CTWVh4&w7s`EOQ+8=_*?#HczJHndt-T zp|wLm6BaCa>d;?2GdpW?x##F~${YO_CWuHZf;Jdi zZ*JzyWK>{Z=mT`Ax+>vx5C0JKYc-`mYyQaBEg9@qt`kf{WV{~&ru0$mI+VZwMX3r& z;}oh_nu1gZPi=rgkQjJi2mAlo`$Rnv*eN~{8Zv>KVMHAM4{rbJqW2Cs#nQqUL4#lE z&kxouK-~}&X6e~g&B*d{Zj|^R$N16$IdwzBnQhKONVLYxA$X#v!y6)|B4_Qa1pKTd zg;%wcXgBYG+tfn@ua$#y@BRAc-7e%*dz{0vJGRqpQgJLl^*3CNYL}{PxbI6YL~#G&$L9 zX!cQxW-oDA{%DrLtEclO1^(+xWJfnVZhCG*U2?Zp3t7?P{BV^PJh@BS4C~pI)YB~6 z$G5!lrh-yz1SQp0^i0vWCI@$UfE}9j=BD^Ajf+g<6$Zw=X=|pa*`v$a{5>QBsO9Ec zGu|RW*w~a4zip`_n;E&Izg=-7_dVpIVpj9gnvy>X1hx78#KOKFc&F ztdJM>=&_tfDQ9lfr zIC7*j=J6uoX=&t}wdm;R7oA}2APxD~^7h{#aZ3Nc2$VS(k+nYaN~|u7C8ia=@QIw! zIJlg$N_kt0SVVu0hu38#m(&mt@f0NWZlzlMO+atr=cEoGxUVWYj0iz* zu|b0p-9dgbZ~^>CtM?lJ-yNVLFthvqPj%)H@8zc6u`?k>nGl3r5Jv(=ef;ZeAkWVk zUF?}4&>M{N;;)a62n{LUCA6IBBSlQOQh##)h{q1bnItu;O2R(qZ`wA_Dr+KrYfePN zCI3;>t6!?TtE)iA`453=b};^z?%KoX*PfZ^@_ta<^8^>A(W??1imm18k_xB!0}m~x zB8O9Zwzza5)7c88wuzt{B6?GInBYh0*|?dxw6 zg*aRIp&Y}LKzSkw0`LbAvg(Bb5WHOb;?syjLrBn9Ufa3Uym7w(NmQmqMlmVZP`luoE48PaeMwf4vLtM>F|ibi#Cft&&A;@nWZ z=Pf>gUs!U!yyDN>EQf4JY$~B&oCT1A4k zWr<-(c^nh%hi7qQ@qERYzDz3Om@AFM>kY@?44|JSxe}(*uJgIouRB~7smDrY3}hk~ zLjRm*DY>v;NAResdxa_4v&CVzg*~GwKD=en0Y#fv|K%4bJO@k#W6+>rUs4}nEN%bC zDVpCKq3sG01%=kZYNbFyZ|IIU zx}LwxnN5XWkTM&+hnDAy98Tv0@~kDi`&gH}84r&h1e2qvw5Tsd|8_gB#PV~}0^({! zIL;&ii5s=Nr|Gyt233;MrUZ(8H0AogGQAGqfARMA_B!uE=JYtx!64z1K1vS`hTqxW z-@X{2(sqOG9q_GZ{M$V61|+5`cMwH?Xb;Ukf__Y{{iUNecjTD)Bo~s`znAbSG495! zwt-w~r4zu9C3WJd){{QzCr2^I%ZeOhflMFEp0eQ_D~e@YqiYqjcNj-ZBoW^@6 zS59XV_ts@(YrCV?b53KH90Y^;rz?pSe(C*fo{HdLMQK{>bE{ylKS5-KZ~13zN=Kv4>DMTj*Xi%$rWJ3ju9X2_?X; zfXaW8eX`x3m{s;vo)}ox0qyvKpvE~b6M}*gAf(lo(D*;_B~5ELATYEIk;*U~$p_n0 z2iwT3n+B)3qGPL~-mnMWpBz-hPcCcuP6T(_;^wDibS$AosQm-VZxc+Wvv8VBHObiv&&G0;o zVsb!&#r5&fHbgEH&>Zedvs>{aF0o8sTAPXqDzNOV)T;$g885DCt%bJS>Ai zS7p_{9Grum6OI{mkJZw*Bjvth(HNOSgFH9Xlo6A6?$I1fMuXa_mL^8nlBIXc%T|ZW z&%lNfdF|jfHr)jngBSp8LY6!)++s=Fg`)X0kOy!}vX|;c!)GwhE2vcbqK; zna+0_c6@5chEW?3HSt8W6+|SNyhqeK9T)G$pW54xqbwj7N>G9n@CR(n%cISi0DqwIp!1)@9duux(q!vH#+spu+uM_a~*{r*_f?Ohxg#TIK-LqAHL0UUHyA zcJIqGhr!G*s5m04EK98?U}ss(xUpol9}y3aJ4oqR2yfxKBzzH3VpEl)zeT&-AO`x* z1dwGB_M}(^7p4rN%Z}H3Lm4j<5=9J@+SG_K88S(#sKZGibgT*p)MFqyDSuYJz(>q- zT|Zt#=nozyes{8B;J!^;UX*+GrlxxT9Ce0=$87R9>P)bKevB#->Qj{_W+aM$MS`RR zqOaplj7(RQ$$m-IHqg$_9+DUD$qldvfV|;xmSTTZW(~6Q_NyiBG*hruMBc&C- zuPEUNhth=K9WH#ShZ&beKPYUj4;Z5&8cShaZ3t7m)&5%1d~ zYQ8ZW9Z!OfH!JS+jql-*a#>_m1T35eNSP@o8{2r8|1)={^#A3%FZ}A;p-SIs!T1wFamkK2 zI4z+81Dv$2ZER$};lU6xyx`aS_k3qM8EeOx<3xCaD(w!vzP5H&)^uPril>7ka#N9E z<-kvo2Rs;*H8JI1CO>K67}_Ajku$rDo^Tkre)m1JXgfn764JwnJT|)Sd)_|%qZMe? zh9Q0+zp}ARd0GFTZ6MWk5J-Flp32b5;f`OjJ0B)s$7NW%sf&9QMK}JvF+21K6-ajq z7U14q$~=82m6f_?3VnwurLls54T>aRFOi?4W-}$HHbX7}g~ms>PJauhdy}VvKS6y0 zrW^Ai1Mc{%b9&K#x%E}mJs?fyDNsgpcu%|RZB<^vVmSljytF){&x)UieK;WMZZ}XS z`8f0by!p>85eT>pgBxl^7;q8avh(xxFIYZ5ylsg6q?KDz0;UQ$hjTCt;6@g&O>RK) zXbt}zIjm}>i#ltnFzZj8uWTJOS~V?m_fds1nY9t+b5$?vR2T(&Y`oq^Z-G(MXlUa< zlk)og`BgOupbL^YG{XHe#KJMRg{R>X1fl<)mJ@wApkZg9ZEg7p4%*pH902AYJ}o?B z=SJ_r=yg1eO=lYl8c7z(V6Pi1*MWfmFQtm8FgeNLS{1nchq%_9+ZL7M%=Q6ee>g%G zki#k}H1Rp}>+Rh?==@ysWM(uGuuCV=c;liF>M%$D`yV7bPY+JGc9UI-?P|~i_5OUh z+HFSzITtOfu9h$9w@ZkN^91+2vF?oMXBtB*AE? zg?Ow#MWX0fks*OXbq?CE_kK2B-Yi=&eZ5?wS{mw53!3;YL@;aEs60N^Xpa-YqJ)_! zMUUp3p9`vil=xFt%Z{mI|YGv$;1_U>y>S)}dhmTMlpK;EwT&M5I;&{SzyzK+zj& z8G57MtoOH24h|h8D9?@ccZDEO&Ki*_~=XIT1>u6gVo`2Pfd|9n?#ls+Lql)?N z##4Jk83`T2+QG`}?-Sob3W$g&()w1g_kxJ@hZ8KsU4(h)37dDeHJ+mIT4dx6Wyx0(sc{9OToD~tGuh; zt5#g5FJ_YP$q8+8uO1<9%GyVMz$Mhz^W80u2Ou@9dXS9=^#%O+`P17FLP#~$a(m|L zTx3)_TUUq*YI5K-c#Q3vlnk{AvRU`WuDuaK@TrSIL*f~GYleL{ZhIScvHe$9q!J+- z2{L!PMWoez8*tB5x-6=TUDzD{`KwGHnVW*r#9})|a+?>?$x1uc%R2H{2>Lj&`l=NB zxfOhZ58xG;Y;)fpDRTH4y4inn1i2@@gC`d+CuTgwWpFYeW9qGst1rk}X(H5nNLxU> zL(vzR`BCaIE7=*WzWZ^u!>ekL1&vqYaZEd_&HgP0rAKg;o%sl|%TEFaeRwrNA-=93 zyA3^eMJWe7$D|yP$PGQRbZwrdK^$KB84NH`&!hE$q>KCRA1^FS!yMG;r1wJ+;K7)`W9T|!9IV- zJ%NGKTGK>{b`6&Ftzo*_N+nm&e_9LYs|`$@Ou6gV2Y#td<3^RQI~U65O?Pi-E&IDG zKiP(AV8e0)FRgxWEzMyB73!OvSGnxU8=*MP6uzHWB4t^JqA&$QkQ+J+L`6~8Ue`p>i9ULQBAW+=s8+B7TYZI2tS$}F z%>Wao!-d^W=TaDhiW{$AiHh3EyFFp?0y}P+uMdQn=3OQ} zr8WM%cI#Z&;c-3@1_IT$H8=U#>Omd@_46i=$$cC)-OD{$CU8h-Tm!oGs=rr{K45p& zk5=?h(qM0#!>VbEubSeRQ;L?QRrP%bheBdXj8&=(>9XEe_cA)z-)GvV45H&)N18E!O ztZ!MiU6Ke}+duYvY`k6@*hrPS2_y04#zt)jG?3#UWXAn(d}N>PsO8P$?6M-0(TxEx zV;ZzZ=K@FJIDZS1J0z4JHukCP?|UxiI^~1 zHbH;qjlFTTSp2cD(l4X1Y8Fvk8GH9Mt*0=di8K`{<2C#PJ^FaZyI{Z(|kjN<;gB_X<&f zY2YiK^AX5v$a(0xFDC*+e%|ld`>h0S`H`22dj7M^qx!_m3VfMA)`nL6xDg+s=v@U~ zixOYycE%6!wd+B)#_N~#N>`!~c21OHxU1NdKcC8et_5M1WQHs{wjk*}4$iU{b}sML zb{4sMWah=OK(9^UnvCHiQxneoH+fed(tnNBD2RgwQPQm5S(X>OIfNPtorNW@VTj6l zox}3~V^~hgPE@V*W~is_Qu~r0SQV|wNIDNAjAz>Isl7=Sw9Bd7w1W5~GsONtT+Fz$H!gC|Q?DN&3D#4k=16ig;dMmB!q#RbhJ ze-z_R4$saFx-OSOIb1(^s1k~&1sy6MemrR*1ci1Xdv;AF%YQ{g#|}+TXBWpi3EEZ> zAbEKdLhj7iE~z+9e9!Vw36$!3bk~uMoOd*w1f?Wb+c9RR&K~ja!D$GZ-Zh4pT=n++ zYO>(UtAyK{q0!&mS!`jK{S3-g1_B?C?!3mNppsemRZn5$1a`SbCzEXZ{T@{&%ujpC z&!v4NAL4%9Q;GOrpn8UB|wlpQ!~A%?$k zs{EqV&nRRB)`gKP3{Gk9^-RrYg!jY=f{`$YxB47Vw3#1Q1TopqMo^g=vU*XCh#psb zV5T6`Tj%}PRjddK4~7_0PDyd;-^K3}>S#zg&NMX#RB6gcag`~3kG#E3iikF*i85gw zE6yn;*{s0$Zc)k9n&yU+Z^yV&<<$*!{?s0k?kl@O_mQ zvtu~}0pfnsA+m<`dU^bA^Kc*li97xt0fRy$y#L)Nd4Fb@{$KzfgDtKry9^6Hp=spd+_%=b(O z3wYbZ1oIu~_O8DSjF6s@(upcnmlsQ%6bI^+N>euk4){&Av0dqB}u0&b`lTtV2re`f1e#cr*w{u~6UTaJI5 zk1Zoro^`tqdq4jHTIizy3~mRtd`%ApkXl}6^Y%G#`mqf|PbOtqO{z7Ir-WO7o^wkT z{1ATzk*XbEg@c}$8R^&K1o(Oiu^5jOBa@wP5JHmqjj-N0ie$65?w+4DAoL+fgVX>Q z@C01B`TcSCh_-W$$Y3>R9VV!20M8aw$g^`QL=~1lg<|FKo%$+UE#^&zW}^)qVw$$% zGvt^4`>dAv%maq}K;4hUE(5L;Gc%}V{@8QL807^&!)9UM5Tosv8~5H2b8TT9%nCAG z2-vwVHXo84*sX(l`ZKKbHFJ;gfp6k(bg@J+(J~Gp=H1j`HqZ93cMn3;m#BBpfv*tp zME@&7I2YIh3S>*TIK`PVzn^AaCB+ij{#1I2pnd0l7Bl;p0 z{&Qg$Mj@Xxy!e=T z64XLz8vG6Ih&5l zUWMC6`KjmmLVW&|xY)tUTP;u&o>K-2)k_tUiz1;UKUQwrX@He=IvQ)4uXi$r-9_i= z@GfR23smY|X4!JDI3jp(iT_V1Tu4DzC#>6D{@S`pwdiz#OU))2vm^tw7tp76dSn+Y z_|t5tK2#t%{`6;Z_m{qgo{YyKFR0A@+`MHapoWIZ3d6h$}huel>ysW_$l@G$7`Txp7gSXCf_<*_X}Alh;8cA?T# zgxvM&J&G_cQ`~?V&y|P7%CD%M*{+x>k5E=7c-%8@H@MQZN>sN0hrO?Si?UlEof&56 z7#gI85~M*CB!^H+0coU$R=T8NhDJa_1yrQFySoJG?iQrG`;2?<_gwpT&WH04oNIlU zdS-OswaBzCFDym`(%93LHpf9fY835Jd|SEeFy;8sh|#z3fsCKu6$`v8@e0HWe? zj7KyMk?8*PH-ki$tsOY^)gwY)FMY1}Bskj*qIUhg*7sHeV9w1Z7^x4wT%7@h?}mU5 z9l(0I7hqT=0W87LoA#;LHQ>vvYd2nDOU7}t8pih!9zO*D26mNd#jZQ{_wOMx#fGD- z2~!lfv)^NgB)BNKaReAsHm2T-R-Ao<^cQ-G@aQ}&4=>zbe|zM{I^Shv1A31OjCqZphLXJ)hT+-Z@jExTUVL zH6%onJ2z_kE^bWlsG{^6s>I z)hS4-8%Xmm*I4_gUX&q_zdg7GC#2M!6GA@^V1!>)YY9pMs}xj!>$ zMep#_rJ4jV=70F=bjj~NG={k=dJnqAOv-1weJ8ciXKQ_YHH&D8ZcnY;ch7fK|I|BC zL}%YJ@sZ1Uyne^OJWsl=2N4vouvWFky9mNK|B5fuMT_sM>5B7UDyX+K1>LU)m&D?u6w??wC2ZHL@wA!N?aw6$kAFSkz zlxfcUmly~Fc0&&wg?H|~=mL5^lb?si1gShvlRCqpD-U3}6auY5lnr+6;T(Wo-rl@+ z7XRK}w6v4iKznr}iLTh}5Qc5V{?5)n@{GL1dE0x+^a~z|YfGI|smZ!=vQR-Ck>@!b zFd&4XW3bSmgjSoA{5o}@)^@bF#CKe5%Bwm2)<&PuJ&>cZ`D%v&5fyXY7V7x8c9z_& zR@zSc-Ib8p`)x8El)<^yiL#W- zT6t(@xt-Ly9Ni1_qSweS0Ns&K8_S*Tr=Ki0rST-^B7tIufO&ZZ_IAozU1q9G!;VO= zW+p!J@>-1QsXL6;XQ;w1;J?Yo1JoEwzCbAl0;pYQ5M6HaD1vlcfSe)WTIeo{n*`Ym zLSRgyjq%+T7Cnr=({#q(9LA@`_O1<0FsB=wLGOED| zj(Vn%J@+2?yesByH2-e3y)On@m!}Zks8PDS{ot~0e9mbM{IG3AM@j<31hW40FMWS3 z;=VGhhnVqoM%;94M&iX=@A6IH{vOc`>SQJ>{`BZ43+9uRx#r9M;-#D8!GJgmUG4T# zXor=zyTg($^-E1h2(crlyco=&LaN0NhHWHMTTXg+bY9EnIR*Xdvn1iGXk43Os;7#N ze>q*c`YeX$;cdbzA=mTQVAwqOGX53;L3^*-%GBZe-oqb+sxyg(^~9iO-k$B z4f|TT*n)2_HA%z>$o+V3`CCb)rFm|3TQVUC6^ih##^MnO4#*D z!fuW1B|nwbr^Vqad{;X!4!c|U1U{$ve%yMhZI=_(v%4>ObH!D*9t0DOmsBrj?pNS_ z@^#nboM$s5^$ZaS-dxRYbS`MsX^IK00LjEfLHTy(N+Ey5kJzTXj->b;kAM$T=7T74 zaQG+lS1(9}`t7FHdg>%-u}I2-Q&K#hQa7JYNVa}pO9IGX5(rFZfZ_;gjfg7{I<}ui zR)Py*5D6+YKFjjv+1aSrkL<|DX2qeCel{=l5lk>%oZ zT*3TYW^G?LH}t3|En| zYj>tHT&6q2k$HKD`tz|AT2gMXD$|=GMY)9QP8Q*qt-sa{HFuQYjqi0q z6e!pfoKP(?R)$U^cwk^$bx#M9NXMC~X4oYaI8ONJNtB=3u>xb^QXtm@-m*MgFK;lWA!k#vbwm8QO#B3ZVS~6R*}KF!pgSK;pNz~WYy8QN&TL2LcCs7jub$H$rq386J^3!vp@5*pO6(4b~;?Q84<9d$ek&H=gW1y zF9)N|b|;$YVD_avf2W0&I(fzyQZB7r4|j(q&ICh3o!Brw(W!1d!BxzB4R}>Jr#3P+ z*5yZX&9bE*JHV~_h&P}r@f^Mgv=4}rc>Kd^)iHEqM+Z+&XpX=uLWI<_692@YN^Fu7 zgJfHK0pfG@F{HJfu%PGG>Nc--Xu6c(=g#efe2-!C8CE2bhwX47pIL_n75^T5&o|Sc zkZDhw3ogEj8{4@Xw)wj%QO~&bcePCB2##E`y96?_>PcI5pqY4bX$_(}AAV3%mM2^O z?$-yASq7Z6uF0FRQ9R?Wvt2&Rvlt4L4g}{j7b%WNF9A%uls1VR3`v;1X1M^*6~3g% zFUgd+plDj0S2lTG{SkZR^U72@=>&%{Rm%P%E6VaBcHKo%)u)#A4zJI@x z$}A&Q?EjsbI~IRW;6(GqP1>@HBu8T=MSENJu-ROYcW!-R7)t8SAp5kqp5TgLj_B&7 zt96TAi{;C&yfN@v*zYz#-xZ+_&=PuA64NEEYz#oFbS;clm?-|(KXkfT{vCg&%q_L zK2)6YT*@6fB7K!9h(oxl=ai;W-B0ysSUyr3a6T|kh}5QleoO2$h;_pHFtnH;RInPbnDHp2<+a>kaP@%2M08w{ z{wF&bz{ul$qH@oh)1NemyU!{uzsfD!qWx}%U^!Z4uYXcmmsG32R+d-~(;xitfRYWE zg_Jz*d~K+YDG^{v{aW-@PUxJ;rT(EU#ZL{9RJ8@dM7m<<19t7Io*6fW=Ui)Acjtl{&$?8l#DLK?T=k&3$uRbTwd_P7?@`Ah7OGnC`M)? zp#$RFX}@rys$G2yPQymJtO0N23ZLo}-1sB}li<8*PyE=4j)TR338`HJ5gD@H44~dN4 zcsanx?fzh$c9Q>-@O89E%_erbVqJn5Mi(gE2|&zsi<2<2tOmDWPCZ)pPVF5`ctF7k z1j4vbb52zxY>pAIZzyn4CuUbj98a`IVAoH7PA;@n%A3> z=ObU$8O}mD`&VMBj3`;m1|L(66;+AuX=<5}W*?-|9P9zG%Y94WC*=boqoWE>x#Ux# zb#tUieSxq;fMfAb`8JdAVL!V(eHS_@cHDioTfKt2*~CUP#FRICozWcd9xSkLY5_Qc zVL)*h(x9nF!?l=^EjTnT_ZUm{s?ZVdV`-*JmHkuq(V$ujGow6u4A zS7Eyd>ZP2+nw@M)RWB%OJzvYTZ<~+eK~>Xxz+NT@zn~mZ`(`+YuVVs2U@kqfG)g*; z%{YT7pfI}QsZfEa_7~V+x;ajFR$|zo5nHX6Bu#Ri@+|(LF4Rd>G!*e(hida{n{D z-+osviOt=J)iGbp<;L}zxKaK#-1O1Kx!?wUCNAO6lScho6;LGNr>xMOtdtia8dc5~o)(>aNOGrI=sTp<<-9$?S}Qp!=NBvhE;Y&FT-+lg0iRV%e^jLmqP zkmtL#0suunaDRygiI5-H*5QJreF6|FL4~WGpgO_XAo3G4f?O#%U_JRxl-8-^9iR7V z;KtHKy&EZQ-Mxb_VuoJR;3-i4yg}01$Om(RD+w!cx85w6bD2H`zS93>dpW6#q7A6d z*2Xw`{t4=j`BKQ7^(Z~b^K3oe^QVi$xdLi)agYO`AcGmj)`l{!H+a80qdSLH1gFP{ zdH6P@fBO#q7LyL&2W!W)GaPKnN1L)V5yjdZRI1M79~TF#>W!oEYAgPw^ISx@KMUY%12ABe0mn zN+Rf{i6TW!URqdV1LaHqQpkqV1K?DZD@5^{iXL2TGfU_uSqFVVM1wEKASR9xh+Q3= zYl$rCp8R~(!w4jV8O2dR$5k-fArj`XA(ng*8c^@430z9WD%%Dc&r^EfEf(FDSx*@^ zOzP`9w9QQHES+J8|45$3kk4CouK20F4tQ3m8S{5`Q@YZgwmpvrHlU|uU4l((%{P-H z)pDenR~#5Z>*#55YdsFaX^|6D?s$N)Lj@JW78iA>nV^uY0!J|;Z@2GT8AE9C)8#%o z2^hZ@zo4mC?bKIH2X5MFaTUGL3~srBN?!?utmOM;fniS$pxE%RM7V1gvkwZ`eZ$QT zSE~W&Ob~Xt-1p!)FZY{=FGn-0ga8AAE&Per+D7XusV#OTY0qXY-)`+fQDo1piFZ_gp$TXyF~(3d~@6L*N|V$hy;8r1lF zb5Y}*M`Bxu55)+xxRozAbPuv+Zr$0dJy;|XKXIdy^c8!VRN*EFHGqRh%!{@)dVG1A zwfr+DYaDaW7swdKzLj#x=Pr;)UsYpiYPV)H0Uqh37;HuYGHP(lv{#ce`!Q5(f zc)AVCcw5Bc6r0Gui6%fiRPth#NvGbIGz86+uUIg%_njv!%Nkr=UJ}Xw#Ymq_HXzIF ztIMEkof(7A!&d7PkQOUne0pCi5n)+?*=@`{aHd=o9urv@(p^&Y|-<#RQGosT6VzU*r9};xWyv1RU2~a;kIkU zb=AkYqu~)I|DMq$nMYScJ$lwkk7*kgvA^=a*Ex8K13zk%v^LZOa~l01O5C-5@W2LJ zp=ZIL5sbJ?(_X68j%)i>P82xY9(-~8YrM^8;L63Vxoiyi0>=yjEnVTU`BLi(G6?is zlUl_UrbSIvni7{3XyZ$K_d3Nx`Gd*Fixe;`(-E9KN>VD(slFlH5PEA*C42$^i@@M44q`?61Ci5Z%N|odS0u9<{*p4T ziw3uSAfLs^>!fSVoP(5HBBr_W3%BuKvQvpyLU`Uw)@3FN1t)dv331@qii#$MqNbG} zZI$mXkIWCyhNN}{w#FyXIGnon%NLPTpa^@`U$~D}YBZE^HW%?9Y$vay^|}Y{abTE1 z0{m<>{rZ|z5A7We3@(T3cWBjeHMK~#ynP9Ab zD#&Oy{$#ZZK<)Or{Hk(&xj#N>g}P{ttae-`l!)8D;0@lnSRIrwk)N7y&eH#@O`5bJ z7$$zX`$~dxv^lxivj7#q`I%K`RJ*6!$7E7~E1r!k&140`J-FuGOMmr8#FE3G+RXrv$R(ir zWc@)%71uYoh*WDdoe%GgLh5&Bs*m0SnrDyL& z>cEV3RPj_pLN*IMkIi1uKBl!`5RNs;Fe!M@!%=3n+0W;Gu{?x4Sgkq5 zsP)n1r**m>=@e?)Xk0*B`}t8NoJGeX%rP8W_yr;})ve|CHS~l&z3Z2bGnKKO?mBx~ zk=L>K@{99VLYQDfgs0lv3$@PICn&S7-l7mw25gx+#kW}~)37v|T%AlCtmJMU3&2e!6STR5$a%#H z%nc_ov@dtJU~jAO2&!y%=^7Bm$rBX9o81`i#bY-2n+mebC*&!+PWIP~G%29T(rs`* zC==NzaTw(6dbo#rbeXegXErR{V9i3cnG`|T0!lJl(R`LDJO11ozeTLdZYm(7|L-J0_VZu84$ z-kozi;g=I>Qu+#_7SY$_`;V@iJ}LG@mo*J6bn>MUxCAT z0*GaKG|AJfp#H!dvsUcBR#Xj87iXji*pOlaQ0#-Q6v*{rzUD$@pUf=(X&p`xI$iVNpC+y@LR@@k&K% z@Z*jgOV$DB`#DR*@x-n}&(61@Y8AYl>pi7P!HxF4SQH@IQOmoQh>k=!4@JM)lh5KL?coAi%!QzSnZX;?2VdlTI%H zVxhsqVY{%pZL;aClHS7(4EtrG#X04JZZHwEPAu|E=2)oRbOhAacb_o98vuz~1YY-j zB_L(nwbvEzFq0-g*SJl~pJ&<*RR?OTjB#H$^c}=Vv4w9M0i)mh7#`Hq%KF2;?7pFQ zUy>k%k+LZ}V3IuxT{`*5m~7mo2}k)oK#^cd3AxYp+867mZMP7y;0M_=ffs77>W zRjRZX(d8TOtg7d^Hk(ZPZzGrb{9Us+W9+o;W%jf)kco%SzY1KGv)*#TUU1oc8$`zp zs2r1`04?ZN^+b|a!%>LtXvP~H@!ONpgTEzInr?UPx7p6njh}kFJSmO5`2(x8ufHaH zZarEs`_uPr{Hbl|?`hnp*RLPhx^=y>-<+eVie&>h6X`Txk?RPb^P)Q|=o#-MjWY3Q zvrmZ;2v$I(b(l5iJx-?=EI^B=xX}W~&V@8s42{wui0;L>ikUb9_@90+T6EkG;IYL{ zg4GHU0a;OU>9ZFEWu@egn|q1~c%AsdiprLKJ8Mmfa10vv)(v$rqjBm+c2s79VEcIv^bL(87B zqc+~^VOcL+JdQ~8W;`*;^~!wGc7q8dWkj`V4lBJXvD#crQMrH3XLHi}6XYK-m6-{y zcYUNJpE*aUB92xcP733*>x?cB7*F=q(F7O6vN7nS*!55V-PK2XV|S<~^<;kvBPwV( zU2a_~@naG47&jUK1}va;_}0ovLp;+iT*;*_dM|vt=3CcZP+9?*&QiR-6HZ{&x)1wU z5(}IJhGP~37?t{XBXd<9lPobWs(?6GOc_44H{AUD^fa{%Alb>jBD5YE*i22Ae-ez* zE`@`bC~uZx?_6;O)W2qk2Frt3fS&;9kLWMZ2z0*S#rrogTm)}|P2v#eVk}z%f<@~9 zXyp3OWq;TG&%fY)Brrfs+s!W(U$pb*vN_4;Y}#S3w)5gG zrGI7~YXoD%x9*5X2>xq_|DIq=4g`js9;2C|!arO8XXf|3Ku~lYGSCI%|JEbdlj0YY&g5>_$b$fDP*7bP@`$l9YN|nuvU{-e|qB zIP<}2Wm$}874sOZDiS9*PJ2aC|!3mvv85w9rlOK;El%% z0}?V2y6uY3*B%Ucyv0Umr-VE4w@>4HTJGXgNEKt1-{yrbW-5l<6;#Jg-x1bI`r4@1 z;;TNAQLk0MDf$9**E{`oy9Z|PZJzdcosi{(r6Izpy2mb)S&knYiTh>E{;c}6Hk~QT zc$QOj*_LFc=eB`iUh6b!HmoT^nejHi2`r8LbXVDxa8RQbxboKJHbFZW4D(>sfqQ|X z%@|2gq5MIBKtRWBmf#gY9>A1})*dKOZ-MM32uhh^P)4J0i7Pg7M+kJSebXEOeO&6n!1U1$o0|TJ*^#P2O z1w}b&FO2-qJ=xKN|9gObiGI9!8Op_6e>3+fTKi(%3_OOS{ykitlM|y<@v)=u7%91& zTAA>$b>Vdap*ug(7ph%wY89aVCQTW-FGJqi*#++-@2~k>Hiqau1i`R>4};g}EB}rs zJ8_CUI+{{`v0UIM_~-5GI`oZqL-IL)ckfxrP@wgJwKzS*eBFCmw84!Ci2bi2 zukG^BTWnzH7gT(eghUZ~)lZNN?A#bg$EOwTrX%vNVjcp2i}jVf8+|CekrJ?k!Egbn zsHh<0+?BWgzc%upeNjugy3v%O*-V$j89x;t0-*1)7TYj2FVu8MK*+M5=$7Ow5l+c_ zmNb5{IhvZD&V2s(=Cl~ue_gYY7VdO@Iylu@WKdtDr;jehxHnsGU+nW2335VaXjcPX zN_2NN9zK~QHE&Jh()j|xD`Zz^l+JeG)rDIrze~qs0sv7;yp3P#jdq*w@AL%+#g6gk z+<$*OKrdhr9wrrb-3}VBwweBPeYxN=`l^8lU#wR2mTfDgkK+&o&(-Mh(T>{nlHZfS zhQD-l%irQLH_pX%4Ra^{1(K$KmZ72{vYRAfz*MSerk}A%TLEacTvWd&BD@mHyc9^P zyyTQDiIkZ0+%9xD9oIhZc7{)7Utbw+a^3F-ml?g^S07sSgx-shhSspkX zLt`v=@l(GilR1Z2&SMXrp6XU(s9ry3(4F~k960kNz9;1_o`bFhp01ERXC6mX@zGZM zdi<=cBJyB&Yf1oK+js4!Nd0|kg>ZHd*}LoAe5+friOO!v|7*Uz19TFygU^H}Kt`%2s*fF7NFd)yWLN*d3vK;$Z+4DS@w=>p!;(|!bZhed% zjlRxdMA&cuqSYVbaC0u`S2T| z6S*NJoW+r^55y>MOw(zntr5Q+fF1XM4nD-88+KE$p8kh$p@nVj16EZx;w@3dw}rBf zfV1mGuOm0LE^+VE;MgF8MhIw08VDl6(|}fF03xucDOxUIZA`Mzj!U`HK0&j+zYbP6SYp8ts}KkfLxNNFD>3^cU`Yn zucp6OpOS`R03K&R_67rT0SJX>x*wj`i&;QM_JUIe#Iu#HIQCjWDL-b?(XyQKAu);_ zC?J$GYghmA-UHnw<_PAZMU=tjiw*aL!hcfWz>exL0<;`79~qwp6ZyY|L=lnh>_Y?1 z=xh!zRh8eDp=z{n8fG?iB!*y|m^@yPQKQ#i)T27ab;eYbA?1rIdjr!lK0^0LQCj4# z7=5jyWuER7g!rt0s!p(;O351Y^d}QNMH@Wa5Te`W&jFz&C^NsP3x0eSu**~&ku3xV zh#Npc$N;j7=#-Ym#>87M55_iMYndR$=j69m=$;vQ9e2eKVpL1s+UGJ9Yw@JmG|H(ftn z!ky2tb$lvht!F40yE?+~_dMZ5iM!@ue9{iQoJBiQVW@~rLID2*!HiY0AS%cBm9Ax+ z;wRIm1|Y6u!CFM>I5!Q+POKUw^oJ%tz8i%%3m}!=#;4>^d+vb!hmjka?_6|lPp(p? z8Op&?t=upm?1S!$AG=L>T3S&4I4GV3St!aOsEvZaoPeL_4Uf0578H}@wHv3!TJ!`l zK0ApRS)hgpbs%DrV>5WI?u{eo2gk{>xe|T6Ffi2jWw4K@UobadIp{&AT&1$$qCrCm z+VX~Uy;@l`YA~@s{pcbcPmx;it(rhs;q%Q>o@Cho%qN4Qq_4(oJ2@v`2T|JT4|GGj zT634AhAM?&>hcfIIq=L_Y%rG|S{S#cIs7IMSEc=*Omf5-ogKvg8PDA$E4=9Pq%L0o zCx4Ghnl>H-1oZ+4eZGwV_`f>cW5Li(v7!7Jef{RW9l-?R+p+DBL&=Y}z}lnc$+a)A zD;`lt`l9zt)6c_o;Zya-^>(cO@ys&ojV&?nHYg<3QF;Pu9625X^r? z`U`}GmWZi`qED0i32Kb}f=;QP5 z;YQ@Z7k~+OP7uYL9ctf}&R^8C7n9r$i^NOAgN$Ihg(`d}_JNDO{fxhw(V7zAleRyk z0v$3U1)w(ILb0ot*{-!@cm7ZgRb_o&s_TMDco?kzKcTx z$cb9Bf&Sg?X^=s~hvAa>{72f3f3Y zYITQFW0-V?zNO?^3m*3a4Q0k+v;C8qF4;$AZMw1q(e8p%lte4%u*Yjqg@Yy6?O1GPT9APmE}mxZp_7ogcw>_W;FXg{LlSFZTq{gW|tqE^Wf#Jf0fPeS+}tu73; zH13iC_JQJLm~>Lau($y;*AEqwlduyso4@8tQq09;#igz1g$OoCQ4-XGLbXW>$2C`7 z%`Zb|VGqi1b?uzo`*^yEtQQ$>E3wHns(rlw)FBNT+42p?3WX zV|Rx_dJ=(({8%@ej!z_hq!7$kBzzYfO>2td;8#rLsD(X0`A6@JKou#j3oEZ%%82{r z%?pocgmPZiv1F(W1?ssaS}3%HvlD8&x2`PsB2ALPG$KGnFlq$VZccExCWj}=-y8l! zf^t1%eB(-}_=pwnzYd6ODZqrx!e6pjlwCML*=BrR&!Zd;Au1@snXl{GPX@()R8;a?LRT2Reafyj5?>-`0OcPYIww4aAeJpImKLY zPzDK|H-@C7Y5El!jM9{7!dgSl*t zA9D2t*T%Za-hjiIYMN?pn-9>s5iCMV_=RH;L`DX;>`RL2&Qmp{Y|Hb$5cRO-WnEWU zr2C(^4vHp)TTOMmU#m5WT2*G8K83VfFSDK05&kBpW$hQS=|7w zNDZ305DtGR#x-y4;cUD4dsv|G;QhpVzg+qszs!UmGA_B2_C6^#z+J^900qG!md3sF zRY1^6zCW+9^}qchS8o(x`@^5)6{7q6$z#8i`q(7ZserOd4xJP{csda({%*aht!YpM zQVhWzQH%jF4I@rf4Wi*GqF!_kAEBBjLl7t-L;u4k#Z$ba$BNz1=~9gdEJDSo_K-00 z;X@c2I={nM3mE8z#y>j)MqP#BbRiEX&N4)%%ZRJht{s^TlqIdDP>&V%^Tt~YU*2`%qwUA55xV$S(_dF<;`oG7r3F=oS0!4I2~?O zN+Fvx^=3F5IN-*7mQ1x3RVPd4)tTp?7iq8qD zuXOM~C2*a8f6^$Pyq~2||7OFBqU zvg`AXK%fAQhppz|c|<*9QAjrZPG3d$&}mQTZC50nH)KebnvqjPJIYh6XNi)t`77#O}pM5e?OV2|Jp~vII_P z;jjKQhotv58Em6_1B_>sA#lRw@Zlw~8DO*d|3bwnHW1>D6Xuw7Ab`G$bL63C{mrrKq7~VGrXih zp0BjKy@(;r73Y1l`Jo)criQv3MUnryiwUhhGfD}o==oD-vjfhPnY`lkTDf@f4q{;R z!IhHV#~}!~s0$PcDjeK7`3oHmBT#e$30DeQMIZuo4>jVto8;gX_!%G#1uyZxPXm|6 zVvARs=t0pZ=h^H4-4nmhyRD-~4cK3=WqgM$-U*(UC*K9!_s+|SyB)-AgY_wnmaWa?t#H-Z^r%#d!`7kP)4=7Rb>k`y ztMex%CoaUF$qSyArv%x zT)E6b$0wLlU+gVTtNaGVNQ;7`KUp>BNOMq5FOvu(;E{CLvuhYYAsJ3l*@o<*?*z#Y zO;SEG?#16{_ntT#(=7hu?FGPwk1Qs)0aj(Q4?cfbe?Y&HMhdtTAQQf8t=JcOit@hL zhSVWag*haKS79V&W`T1R5#|_^q@|3{QLm=@doigd zKwjm<$2X)!*yZF`$S}e0M3OvGTosX`LzYepYTb~x44ixO(XiAwOQf26b>W*?;*dz+ za3ZiKwB*CwkIqlTjNiDTiTyL6Z&_$9ftoutJdthalTpw9bUxxA%=skY$Au3Me#y1; zfiX5B_U&6p@9+Xobb~DcP~MM-WlA%KM`sXuq4Ar9_yIQaJ_?HtQVV){ZHSgm(3P6Z zpmmP+!=+$aMVq&wx&pE{<^K5Q1dd@O4}qb-^D^^N^eCWRE5xpYCVOg6-5q*E2{p7& z;Tq8*Wr6aXI2e?#aT-Z$o^flyqIh@AWN`& z@sHU57gNlEwLYqc0FvSGKUtuB8LQEE+wrTu0smmhqRQi*(FZ=mPgw9TAlwa`pLa)> z07riL;rSRQYCkxj#6(|_+V6pil`1;I1zbAR^ZCLPN6_MeZ<; zOBbHfSr+MF{Q;0jnDjH*+i}&7)Vc^A^@dB2 zukszn3gyRE+~kHx?4M~vOWq&L@ss!wWfnD$Oy4W-{*^wmFLI#9hCqtpBmj#KNS6wQ zzoQJ0I*+NFV25i=}WZcRuQazcNBEhmTQiRk%fYhueH zPd=KHqRLwy`;p^zNGMk63cNy(+^JM;)`8Cxk>D`-X*XI^wlzGAx^%uEV_O5jBxRls@B!IwrN7fx}#BfGys+oX^ZpkoshYF8=?v^W5Z0KiM9C&8Q*Yx>Y?xCUM z{i5+>=ue{AHm0YS6cn?0#MB9DY{&fD@@1Edy;Jdd@^q-J9!l|F8>6vzb5H-L>EkaO z=m8zY-=XWhj5p(3+URNdFlVF7mt0+|lc5?;avwWM7Bh){y-G$tDyy&C-fq;kW8e8c zja#~FVXl=kI#;f-#4Dlv5?}Wt^z#5^{kv&9-CuyTksVyTkg&_>W*MG0k!u|t0fGL* zw>CO<4WSOLRw17vF^Gp4)eaS5ukCcG9-LUt-sbrmlt$~tmica^yeDMrwpF6zEJsjZ zH~`XWGYl#Y_~*9#q?j&hzbsQ>Sy3&8k_5E2`F$1jKb7XwLBu(gfLRYx z@F}Wcz1-RviFCj+j0j1Ae5TgK$`l1|&VZRFTg4st?F4!Zeg=@zS(=!@=e`ogp7w;} z;nbO5`fbnnGmV~vozxrSg}M%Y;?eDoeM-nEwuhlDqg~24P!*Q&JsucX1Z0}epIWRD zPSq5W1t;j`dcS6v-a@4mXx15q=KMA$Cy^cR=k8vzRn0RrcrHFv3;|BPSLh2CcY}#5 zJPlm2BiYZA%sszWbp6nC&HBh&!pJ?uW52|Dm&O1ceQuRS{*Ni6hdeJq zQt@0YV!k}FY*MhZ?9#q43Y9%-1jvbtNE%_mV~0k;IvJ4FwZR7FT^I2>WDoMDR&G$+ znyr3GJwLpjg;PfuM2Ablgjmsgi60&MkTE~(tJ#}4%BSnLcK&KOFQIj$h`ovXAqo-# z=5A^K6$LIlMH6pqLS;${=w0)Og?{NAC|WlzfHRJ6IysPed zLGkjRs<*W9wq z&0f2%nU?-l$<5~dB}*&-`m!iQ^3~j*6txdPd7O)V3kVbYX_575HwHUvwVFs(7(0|0 z(6$2q&bcBKMLv8_;BbJup+@8*65oF)G}^FR@JZ zAQ~SGyRu*7VMFHQZuHnI>%OQPvOIY{h8YPK=*A^ja6H3Ytu*K9`sR{7*g6`;K1KS> zvv3?)y9P>~5uk-#rpI%^|1IpIsoY9tHr^1s=|PEcx*EkFVuFX}VD<(& zr{$i@8_T=1yC34w5SCY{=WpPKmvf?{%9H8WY{=hL^x{T^i90({jk;5;x#-FdzdIFD z^U4X{#Xk^Acul4HGTHCc*a-<9#K{u;yK1>Voi+dj3MXqV#R6e6}Yf_ z_g5$#jfqq!iqIJN8n9xY@1hkLo30KBy6W=_u>X9JDq*U+S%5vrf_wp$Gb zT@Q>tT{cEjzTFY8um{Ab)mQ}Z-$uDOLuW!PY#=qvmoq1tg2*~qYyuu0NIp@7O7=mX zOwKi;xBo9O*BI!rcKierHu>Z!>c{2qT5Ypr76w~*jC!_|vZ-ynckQZ;`HSbsuTj5J z+KPbLYHN6BeQ0s5q=YrFa0@SAeh9+3VP(D*S~FcC*v&FQ#7_YQ(t=))h4OKRmV}1x zwp}qU2T<~N@G(^#-{!R#f75+2g@n+Pvp?QYZSkveMtcG%@Zf=f-MR-<^mLO#I~>^~ z<5ndtKFjO*eRv|jP#LPHZm*r!O@iYzgp7G{lr|E+#JRIN6#l|jkB&}*eO~hqQ>Xq+ zqmMSrviu*kp!4*;Ehm6;{oz?cYX~Ov@|(;Dhsu>}vJCckuF67`rBNV=`LBG3ixJ)X z7Y`Pu07pec&97Ukhc>0_|Ije_{GLhE8l|(5${(Eh)W%kp(_QhsuV*(8%SN*`js%mM zE6Apsq|F4X*pDmAf~e7o;_}<{v)bZNHR$|;JrzAq|KBH(w0a{|B;;(nV?HMNj0 zn5 z9%qi#Gm5#-oNvm^3n*SeA1V%zq53vnZ}<1?Wv{Tq;q|VQoAD5AY0@&Vx#s=2O-t*P|{|!R!Q0v)2ezyc>S*5`k;`1TH zp)&YMlq&P)Uz!^p??ik+zZc{AuRlqi7|Kk?fq+-QfeWcF69C;B0{!m(-*)Dkn-R}- zp!Rv{a;-{=I1F%DA7nnj#xx}2Q22`BJ;r}TgsLyjVNv`ZZ()! z%AMZjmpE|TW#^{k&-l_0Vyo4h2!xe2%nP3%*)mKqZNaOf!ES;(G>FRSRD#017L#~gE?zaC#Oq+yklY;WJ&!SZ zJhG;*yjWQT`$Q+9g~*rF2gEdM8kO;1T@Kz8*Z==>cpp5%Hwa?aJFi62!K<(j*>Xm~ zPcH~U6Zg+Ptyvpi0VV)I^+y?Ee0#h+i5SIaHSthRS(!00a|t+c7&2?<$>#mGQ7nZg z6V;w0GQsYSwH_z?f(in^8gT!T+S|u~+GbtujZKxhDe>Ffd+orYk{KDIge(1lGy!vk z9a8Lw6uXclg+}j!k|1JgDA78@WS%>0-k%KHJhxr7jY?+SlwJ*e-z{Vy98@QrGMhfz zAUJ>T_jh$rQkr}MP2WVlEVmoC#Wtf2W70gt_NXoXH@eGfWIysARN_V`h-J{CkIy4S zE_J25pKvd?2K4p6kt!w@#9iqW-m+b@Rlvtkk_lZXC$xk)D0QcKzIX2r528SEhcg62IRI@E)x;ku`>X2rDdW&gQ`+x~%ScsS zVwIDQM#?p6-6nzLBV|?}$BSaf@0|(;D%T@1RGQ3ibB0YImEQrQx0}eh?PDM%8AQn1 z_W4&0gRD=`G2q&~{wy~)@;-!KLsChaSjT`zWJD#^afVn>o5}N_@{N8h1%gn_&X1QcRozDIG}tnRN8eB_<9*r^>YHqj)*wn(tiGi8 zGy!w85uZ>sQs%5whktklgcQ|KTV$Y6WxgHW5{rLXQ*Cdu za?Y6yj1c^G^t3_s4s*P|mp|k!hT_N`x`z{~F+6@vgwD>+cHS&F0f`7TVK9v4SuZIX zxQjC6g^x523hwnsDa@y(g;{%Au0;XN4HUXEvRBVX%R@B?KCGV%pg0im%``ShWs5`Wrp!C1m%hNWR^tr|knU$Gd`xq{kx9{#1tLiadtr?{G-9F(5Ybbigz zofjN-MAAdXT^5ARJne=l#tg+&sB57X(OeQphkn}#fk)BXD7u-CV2}xI32RuJkDxIM zAPLvxw=llN-mADFBvG8$;X;tHptI%eFt6A%W~o0G_)&<}hs4T&vz4#r1X}AV_z)8R z_91h{wuUpfA>ud79;Z8e!Ox;_pCOa5s)QsZ;rs5FWEC_tkW_cy*=N6WGF%Nf%KYC} zz;UK3vTC@FObnfZ<<{savE^(skVXAT&S|2+AO+$5#(XP0=g*`C%3~F}R#Q(5#ld>Z zU*%)x|IiTKzP87^Fl&qev&YYj9f*!@HSv=n=Z;^M!%4^OA#kCA7Wd+i7@NMA0*voh z>fuch1|q1Q{9Oj2tXINI!+*016^}`RzWb9O8a*0-(4$C*2#T7m zKmto-+3Q>S{xUZ%DMUn4G04wMPZS*~?$Ng2e0P(?;1(D@8gFT|ZZ3va2@@-&ena5* z9b13EqKS{}hU!dAB4b}fJ9*VH3{0G$oNf%~`ocqdRO`vJy1qQMw`mZEl7BU4P*zIf za|K2=G(}sg4(JexhYf;(jHh=cjgRucm)#$^T9*L7KZ)E^L2dELQ zOToEor*I1_$p|p?&UC%Li?D__4@s;PceOAfQ_6q1`R2ka#SOe?8@lCSvmOQlX1aD2$6_xXi}vq z7X%7uJjp^5WBK|rajiw`APir>;uyTROfYqPu1lv#;ZE$_;W@O@Gi9Zo6C2E!oqeH$ z#zK{_t;ffd?c4X@EIB{3yhP!>GqPxAh zKCACcgApl|qw0c+$F7O*s*Ld}g9Lqv2|mn%#(Emu*8QzYLjfQa~l z_}q8LjOC%+=jwY4%uV7htM`m(>~5SEIbSE3^lnz0 z4rk!VU?j`Nwg(MWu8HuQBF9&9lvpAQ#hA})RBPq2$QbDU&L*B@QR#SJxJ8&=Jkloe z-0e4Z>FSr_fKV;KnAxS)wE2z)L|vNJmh4HDfXicVO(xcC z%MCXB(@(LkY<5R{dAzdJ{*6UB^Yp0a&k*1Fszd4Z#O66*+~zT^oC%1Z<)IK}Vkx6a zp(BGcg6prSZ&@yW^AzP$iJzHgJsIGK*so8VyIYI=>i3~f-zdAp^42uycQ;eP^VYB? zydy@2fAH^@@409@ZlmMNoAqHkqZ|y)Le1Qmo50SM3!Yc} zg}jjx{%kmJlQ^Jn!0yr)L(6R@eY6brKT1NRrkdaIoTWQu@tm#y@V5AJ$lEV>`}9HeO3Zl$ZQkD@1F9}Z&9 zrvcvGOQ%ItkKJ$o@c9>iot&I%J@>W#+)f7LpZL#pm|y>1=ryjNp8Q@YbFt!AaD~Iy z**n={Kf?(yvz~zrUK!NRGaDJuC%g(lB_5yDzhiQcv~Id9ZN@3#Mpt|=*!CjrOEf-o z&?gEn6AX?=YKqAZ?s=nh>^zE`%H7Y1w0%`Gorz|>nMJjPEVz3#`RnN^8-LJ;YBJb$ zSIWE=G8C15I_3~a%>2u$l&m@=Z>DMt$1qD5KjVWi&U7}nfwu`^HHy%S`TPutrew`i z2CvF_4wD$;ptxj#z8R%S%OGygy0KA~cNc$&MW)v{9rS$jk<(no%v0clD-_B?+|3^$ z-Za{b`Q>P=tm`Z2IA~l*>~1EVolnIN#u_P^+1&5jDx!!9Na2T>4h*sSGL9`gxXPO! z?bJ5-Kru!*E)-5o0=&o9G*tgUH~2r!N`+9scKJas9T)0{!V-!p z@^)Qn{TXDFK$j0+J_p61re7zJ}m4{9GxZl;scVg#_pW{1zjbbCZ>^T{R41!%Z`tr8G zl73!IWj_f|`R4`Rj+0EKvCSZ-oTiA*w59d8EGUj3w0IY;1P1Zm6LZM%d#A{u(ESO0 zZ^)VAZJB9F5tvSkshr3G-)q|}@@H}LF(KOR=V9wZj>m;U(R?L?I=HLLq#{?sV=)BI zxbXG$$q7mJoY7hk6zm}04O|luTd2N%|9IGj6 zqiAo}I3%p6gZy_)7K<+r+MA?*Rfnwpb5Id0mVrx|%UZVq!B@{^^>^nalmeEhG{FyN zt_wCZu3$Kh?qr)e$L$5N*&EM`P$_-kiLAsrpa0>|Pu}bc?QS1`0*YeO8DK*4hXV(PI_O-DkQFoSj$rbrMP8YHQ9bOgP>nnfFuAUL@{ zKE%ai6=26girwP1^dt>?W|wNMCwzh}KIp)IJM%LwzPBC~EIq?W8-Ah~mK|UgGr8?? zu8lC9WfHfOZC`02hIQU)WghBtYZt*{1adTq>0FGLi@6SVUVP_G8(dnL;gb&YBL(j;t#jG73^HZ|Fswn!^r({gik>9LnrtAwkf%s z&sE*Zc+!Qw)Zh_xo|YehsBXuWOQb^MCTFomip}lx#ff>nZn5J?&ax~uu6t02G-V2x z`DAD9IvrWd*q3P0V=XxzXL2jvSY+pdbH^bpT*w{$_Qpj{MjWi`^*2;8qJzGJ+@we9M7^3;t$@&WNuwPfkSr(lyS4KrU?EqLS5g zh1f=MgFuGd8rKlws$`DJjP38bpV32(+wikm#|6P`VHY}#h)>B9V*id;@?zq-E8q?Q zNV|4zW2>XhN0gZLygS{Z|4S*CMDyNv)ftH}em(Ie#hOsSd18j>Q)(NR=C6Q*ekJ4E zc$lD_O~S{^k{KD;f$FQ_v0seKsExr5*r}fAL|*t0OM6heq7ZZsb#yv~`B3*&RH?Cf zQ@8j=j`hTcou=C~j(-#g(o@b^8w!m4Q|pbn+=YH3!?!{Q(?4en`egQf_5QlAL+*r4 zS!j(Ua5a22w1)bL9T36DeLb^(ioQrSx`yAF#LEX(rV@MT)?|EpX_fY>6thJDk7)G3 zLMpN`HKN%KfKST~#@716`D57EW5VT?&Y*9JG&6~eH&!@fVoVw@?Tq75+dKR;KZW!0m!C7sZTMo{3LrPnvYaa@1=I4E zro7~Zc<4-6v{-%xN)gXj=U!2xKR?8%LZgfxm(dclO$lr#1Rv3*`oa=7ml51Gi!mP^ zT^W>lqhdt}jEiRj$;pYAHZ90nXUxN}7tfJfbHC#tHlcwf zbjnV&FeUmCf1gb}hKgX!_P}EG3}i^(_=YnWdi@*$&vCwNwfOVKR_OKiyKdTG^6!0x z5iS(>wP9!51-d)jCbsC%CTt4hpo>c8>x$eCdrNhN^RA4Z_9Wo%MEz+*fdwA#HZ=m( z@9yB?gGXMcJRw_)Gj+>hHVtzVpCBr)rt&c4i0UOkZr1qk~tg-}{NQ{?i09(Suf*UqZL4&r<}xTztZ_8JW}Ce`(%& zJZ0ZO+&O?;j0XP5caMjc;}~flbdG7jk*^XNwI=YP8dA z>|kbl48rF1ck_gf97HJjht4+5?;o45PzVgiY#_Z+cr=R#p^yQ`=j5rjxM0Pb^)CH`MSiL+||UP!Kem|Cq6yKGusn8`(^~&5-Hl|(Ul@LJ;_E)qC2GcPMff#ukX&> z*0T=ngZ*JyYcGSE9Rz(&(aoXsMb-xz986>&H`i8yIpfKrGMV)Ss`ZJbMM5H~C@lks zeG7ublAwmF0L{O1uMkUO#Js3lisIFv8!h{+Ooyih*!BAG!A4g+7T#0-$Jt1@0x@2l?dwl}U)3D7R!unWq?2*O!>;2yEZHYS3&>7lGovE zA4`@oGSEFr{Wo`zMTs%BIM=?XFHu8g&TUsX{jSiK#kiB(0r) zxEA(^PE)~;Qce*B>9o9@h#0~GtLdQO6F#W+qFFE9^ zq95e#E_ic=&0|&vyE+}qt`DOetp!KIxaBiR&nD`J6HW2M3Mq@`7G6pW+;t7^~q_VQ22zta7 zaZPvi3WdfOK1todWD++iW(K)p|F7#!|B)dhgto#mZsff6?)#CT9|=mz7u>7dE9u<} zUieGBTOdZ)aM;XE#n$Qoy(x$Zk$3H(A*CF=6ztuQj>KbpnX?yEA4J0s_mb~0#WGkZ zuqF7jA#K%KW3A7znalJKCHN(XFvPPb!DsFnzDR`#sE&rqZM~s|G6ff3zpC8;N633! z(OV1dRYdI=xAQDC-sTb00D9Ss8Brz;CjKZr*+CV9*&>`a#C?)RPaSS$IA}*rQwtlw z=WppnDLI>2(iD$vN+e^`$(Z6%j&w~U&ct2HjWgoPvGV%G?IhI)`lNNZxD=6r^m&C0 zC9f{3EMp{lNoSCgaTolKP&5h|7X=m)^YI(Dkt%aB;v~l5dPp%wIvd)M9f^ihoh)Q4bkwTuf9;Pp@wvo0ZFFNwXO}^$j{1r{6@K+V<2ZLze z*3r7Rv+b(4vpLMHo$I)h$1Pu5ys5Q1mp;~R9(VlXJKkQzv+{-fL>jG1Ou5#(m{PjY zW(2Q)B)Gxcb8ZK_!xn2i8jrQru$>di{%(AW2BK+DH#oTF)20PtyteS+w4PBwCfFH^ zOcHRl3X!qd(Bg9O#>EJWh=D;zyhN(?$z#gqNw9F5(U`EH6BL{@MwY8juBt?hYxUa& zE_l0q4?}o^L;fCxfi7M^{}VWcCk7Y zcn{17BzXK2$Ts(1Z{?3q03kEOJ@^>RL8thY7sN5{V}=utKpMyF=dSE<-5VYU*_Xoe zjlL3iJmd-UyWDEuhc2zjG*m{PO6tvoJZ{QG9N#!#P3Ev9J)gxV8B9vn*65!)cXxg%? zqXY=+dOE!oVozp5dh-2NhyO2EC!lTjHm4>t&wV;C06a?DhrIEHJ9k`wix2n&S+O#gwSBUo|EDWJ26qPVx ziNTL?Z$j}gdHnT{q(09k8f2O%N4KySA4Hg&*OA9L_QpuXWT0^!hRb^4z|wk4Aud?* zq8-cgnHnpkwzBrTFmA3G96~A$Qr|Z|T-I0L$q7*zG2eXnXnkjl0rAynZw$=#>=0oh zuZAD%%U6I1aLm)G$+N1jWip?Y^5bR)z0>8||2D%ysHu=Q9evCAmN2%}j>Qma*>~{9 zLN~T=lK8`wO%naTon;LwFjD)cZE-fXRaI5xcT#@5`1cZXyx^lXhBw_-S3=R|uLbzh-cBG6`7lraJt5RjZKeAgBNEe?xpejxwq@(ZyZ~dkUoD@0G zkbwE8*Oif*y`R(4Qcgv(gcXf?if7ELrGB~6)j0YjbEm_jjXYUD0joKRoeMc&;CD72 zpK?YZR=6AeqM^k=LT&YYZQmLpZMywHQe6e*AHt{D%~s!p=w*6TQpZTQdsqw4iHVuL z+uO?#q1LCb)y4zzKwbE7mK+=ri9>O22xgK?SV!ACC0M$iywhe5QF*;>!N5whWd2C| zEnha zRt2TrqbcqeD1Z#kau<=|by-3pAvC5mA>a;ysr>Vuu{~3=sSZGRzg-xWZ@!1xXP;OR@|cXXF>6!J)|3re%hqP}e1)ZP zd7wT-YL7K75i{>*6Z*X_2{wdGG(!+gB6NlcQPSe~e=*F2%1Bu`*cCU2=0sp1gMHp- z59|eeepf#OwE<1u2KCyXsMlC>K0cGLZ??PUJ~){HCnoxbf%cNJ(S80?VL5Mgad>Ye z3dY|P2zB%FItx4QQ=beQiiYt(V{%7{$BY91BQD3Yw`2 zH`?4G#`BL9#zW7BO?88v5wK;`gTkK#0WYqy?eRy8pYzausGlE5zA~{K5)#$57k9BF z5#cJ2&er)nw8}Dkgq9ld=h&oVPjs`FFdB8~`vy^h6Y53>EhM%#+7NeO$TjG+_PPH? zD?S=AgR&g4_529+VKfdH8ETwWp>NB@=8cMmI5cETx?;vjXNTAF5IcV`5l$NL%I_!f zvr;5-)<(MFrA2kVrUv&0#b>=<=u#Sr{R3xMCG~uV@ut6ylii5C-dpz*{jwE+EBlo~ z8yuBk?l;xBqPzA~6wixHj^PgQjL}zWpWd4^#G%5!Jf}~W`51^kOTqKDSLRcN{ik)5 z$6wzWkf4wFE+ppX69dtDe+5N&fRExxegX}`qu+a$k&Lk7CS|bS9A`X=gxb4bgSgsh6Jv)}z zBy{cJm$2W-XWk{CIZea22Bp?op0wMdwaV<%I^Q*~hjZ|V!hM%AU{C`nbV)Xu_Wk{P zQqjKd^`8!vjoEwGKfFD@NJ+F*vfetM{5l~H*-kU}KLl#quYdj3@2~<+V+8WwsN|MI z9W7VmNd4<=kY&Og1b*BxU-Ty%hLX=EQ^?c;jwNmxt^|jTl?DN{POhlv)Ck zepOCd#y}CbJNLptp$`T44-=;S8MsEWl{)A3yqM?&xXfK5I@XUa9dGKum#OFk8&M@l z&^CaEe!BQJ;8BEt+BB7ivp*=lOKP~ND2{9qRFvfL^Vi}mJ}#H7G<|(cL>1?-^oF4l z|7h9drcbKuV3JYYeT?m8YVU@D1$KSNe;8FSAnyO0@V6dRAj|=4rT-#7a8>~)e|-YL z4Hr`O3nE)gba$QsWbEwA!9%0HCN-!=m?9}#NejHmTOA+G&pJih^5s)N?oVub_jBPW zmn&V@50GP?B#84<%?}}#{ACL5a9UDq@EQVuwfI`0#3cD~-F4v%es2pYaP4a;VALZB zG=W{eZPRX3l(ggzL!Nn`8_bDfZ2{!f~Dp%Js2-I~Q0H!hBxhI=1AT}h@utJZ*w?WceFYJYC z$3~D~f%(2liv1U=E_jV>%+v|_zw0o8v%<*L|9CwBAorX5lv$}dkh|vMzQ5<+?Bu`g z|KUDAy4R|-YtBaw@enKarjSn-@=eYNEAVx2F2>zzxcO3&r+cB;jbMkx#cmAfrfXbF zJM_4pXzh9n>b*r^G;1k*Pzb}GGqg++!ZB1bwFjt1e7~&8eNP<{i^;B$e~$NZlWRK2 zQ)NT1M?g@tQV$W1*m-zrWhx!FS`3m53MMu;f#U^NH6p}ogSW&|j-Nfo$+jnUUt^&P znVd*if5ok*UTP4eRl ze_QZb$9qO3>;8oMuR*#(+Se=1wdXCvbZE@P(t~`js*0$rO@r>{m)-e@A>SSc$M&wE zL$C}QM90cna56V|MzQkl6VRxim>EB!d0NE_(BH#^uTAew)J69S`*{Uz$?y$C!g?(> zzb49xHui=d;*|Rlx8r1>uS6ovT`3ufSaSSu`!1$NnTjmHC^4ws#0%+5zQB}5ro*p9 z;}$h!{~0UsP5)bl!OHc4G_6v6ryj--PCdbAN^)mIBv5P!T7xyJ#n3_$64c-ouBV6_ zL!OZ?dnr@;73X%;jtdDG%vE*h*@g{G|41H{_JR&`=NOX4#7cv!F^x1ryV2xf|`}|9gfY7{D3aGvafbuwoqr@n+Yi>JGyd=lilomvZ zE==H`h)6Rko-v&Y-4?m>1MyC{v46DK7RgnkZSyU^RvM-fF~(`jwuswd7ovMZZ<4-- z-FA#!Di9vs7>em*hAZAK`P>V4*grxG^OH`$2-rkM0mP5$S&JNnDdC$Fjlxt`g$K5I zBQ3x%jBWY(P{`Tf9hny&i_74-g`iEF)UiP&JuBT{b4-jFlLg#W`!_ZrR>^S_4?d=T zC$293`e{wV)@Dh|!qSxxy4DFREPzki?q4k88UP;MKfNA_%R&Obn+5>R^9PVFL#BV+ zlfPJX_}UB{(y)3*OX=}NBE@Rzy?|AUn_-DHIV1j)iaNi#y_A#WAFZShSfB^|F9?3=VTKpNV;CrIQUJ;Y}`DNC5`$ z6aZaQAEd=O4)G+R=)Y@DPC3@ck~$b}8mo(9Znr2j_nf>d#HMVYO$Nn)apJyN+K@ei zMq>W(cJhOOh?D?9rWt$A zUA1|v<8g~%Sa+dcvQq&^^Eke|4?iw2_$fHx1j$)Zvov`Q7i>Tn8v4bW@Ro^u+)@eS%O{Glg5~JUB?hyYEzly(oeKQ%Q%Pq5k>bUBp4f z9jDh#8w`LGeO`MvDB7a#<8`$Z)LqfC$|vsg?J~4|;4Ht#vf%FL$+ybezdBQi#6~ZK z><%kKb)P44vB#3GzN2N7)Aj9bWu$snr)L_&zbPm?*zeKh4kN1>PV-(kCnfVxgHSRa zMDF_Apb?Ts93vQ2<6<;rrqf|Ktj-}p3j8@b14LwlsKwM|;g&D@|G>YaDciK3&k!Me zb@qJ>G};;H)k?V$Q4wgkO^n3j39ul&8T1r4W=(0WHbXyVsLjVX4tg1wOrUHSM){oe zqGg=yA;gPz%VHEQ`D|V4;2nQp!f$||QN6Tgj4GcK@=w+1oK9gUTfi#HLlTFan^5v` zUwsHs)6Mx!;{Nw?0PXyRGBF%$00P6+&3d2M_TZnZE!wA6#Vp;|B#Zt z%{iBcgDki#IZ=eVy}T0L(eb)T@?Fn(fY>|DSH6jfV?>0Bi7bp3py)&C8K~HYbkgCM zjCG9dn2yG1ii2;b;rIyKTIBjgvT;o=nnN1{5h|2y4~rg(=YPtNjs?oijXoVQ4SYI zda-U95+e65rNPi_Tz%fQT3PJZvQUf>jD`9S#`TLSaEPJ>R9eDF5=T#4){6x7B#&B| zp>hwQH_iVO?7i}2+b?|X1u5&lMIjIe|I-<+I~%5cbt8jr-87?1^0QQxWNUb5PI(l~ zq4gV|5@faw;VRs98GE4T=-z!e!~Wc9Hzhm_Q{mlpeJaVQ`qBNX1y~l;H@)ad-3t+^ zKkBusHu}y~19HH?efuQtb4<4|iLgf5y6LF2_V`p?RSsJ`bEoxr4{-_I2ONvYCN-Rz z*o3-T_1yHz-&Cx$gFQ=qr&DNYvo{89b(-O946#Eorxpz47Z$@r@_6M;+|blbsb4wi zr@cYc&$Y@~rmhl*@YH8C>|>}gQoVoFdr7KvMl;h2*~hSQh&|8TiX%(KB|F?WNF`>ZqK`-qa*3DYHER%NAL{AGr3e|WG06-$4ei^Z6XGCwkNbCeAY2wAA$sxtfGl3; zmk{^ZE@grfDI?vT)?7XYaF2R!Q&G1UF3{scRI+Ehkk9{S1Ozd1Mr`8Xdttikzo6iv zr7Ew3G9LR2Jroak{5UuHoJ0EC-ctcRpFnDZ-wQ7n>^0!)*w+WyQDCR%hO7X@UPZZv zslu?SPrQa1OPS@s%0rrOGY&>XFfvoYh#8o#%~Y(Vtr9AELGB#_fc!Oj;WiUWBazHMCoZkk+ns|0kh$DXdkNvo z)X%=|W-)^iHC}cC>{L6R0}6p==0?S*U(7PTgvn+Z`tO%CoH%_9dV#cIV6bfanBM=( zC{IwZgRLU;a1sNF1J$PfeLbr6R{wFNoL&lYynng zVXtF7)iDg8wff@z3R)Q~ITuc8_ALmNah)ezYz7;v-h3Z>7tc#NeXP)=-ZQF#lcna1 zE^H|Dlra*ff>raOS`k@KZE6T-CZ48rJJDveBBqO%kkYM$%4)QSde`DQpxlp^g7=Ea z>$#t(LA??Y+<9qj`OMlJbM*P7I1@X`Y?`_R2m5J`%XXZsEH=fAlLl7I3szGiX&7D? z6^+U;@nc`9+H|~)`jdMt=IHG6yq6OLiB1**JPG>cKDBEgo|4tNxm{+RK^ z@Qa(Vccv`V*|jGuEFY=8oK!cwlCiHO=%A~llYOi&x>GlW=3gpw!FpTMc=Z+zO)cf@ zx1>9DI+s_Pn?AzewsX8{XxQ?6BU%|ZxI5t(Wzl_mq`P(e?7EZ{^v?Y4+V|mlP?!BU zGSs>NvPl*!fJl2K!EK?rJwy(!B*hIjla*tC7tsMDLVCM62bJD*HcZHAWX3G#HaNcG zdGCg)@lyzUKK@_O#l(mTnaF!>q>?KJ`&VBQ0Sc<^B7fGy(Na=@LerGSd)~sbs%dtt zYcBM44>OX1)7MmN1);}GKl&i|KE2}3lV?)z|9;1)cjFTceHb)VfB*D{%#U`p569Ur zVvyr|wx5r%F$g&o%VKMvWi8)s(uc(6g=t_m0dO=!1A&o!&Z``qAC_j!H5*y>G27&K zN@v#FZ7%K>^PZEjWL$B|QANdjo;G&PXaPvVGm}sLo(+PwFa)Qq6yk1p^4*Y{s}@lM z#53=MF!@Cawy`?;Cp~EKg6z0zIf659B%a{F-0LE!B(AJyMT|kso2yDggjeq}sU+;j zmCw5&4>Q`cBm@iVL>1SE)E3#ROGxZ#Mp~Q(s+WRsk%dB%{0o5hR(jr{-ODy^?+HZS z(9hHLZ_fLcy#plvlH~u1P#NghPE{WB2Ny?u|ECYEWIHMbAQ%FiJsNW~(nBiU+*K{bT$L}spNBx-ogsY+ zu6{~UxPRCQYCm;hheQc48+l1Q@wvITEPn;$Qok9YFcFOijOg2A9nYYLuQF10ee2@v zQ7BZ)MLahh;`+SQif5AkJr(EU?HDJc7-dd}p(wAu7#Bq{MeOf}(7o9sMT{~dvVmcj zV&oBr2J0c?`bHcIoTxcBqr|>_G;aC1BNyHX6d8y&P(!)>kfn$v)76)n_#mVVtaatN zo2IokzY4FB=09w+X<`)bq|xcYL$cGOr;aMLM3GYqX9!evjV;dyJ8xQk``y(7nTf|I z-z)`FGG^7I!Ls`s?=!%JPw?b;I35BKWN;Mk+P=Tw##CTheH1sJy1T)h+=)^WBR->% zVtc%1;#4Zf{?#58qo_#DV>(ZxC+KOpu{dkZa;1wp!i$c!P)$Q@85>(pq4lv|Sdua~ z4L5G%y8wf#L7n9o1_wK9xNZj3TZgt-NTm_XgeKa1Z4+sy={`Zs(n>kd2cduE zF_IBSMxQ{AX{=u|o=D2!m|M|OXc|-XD%DN`0y#gWrbKo>|H2mU({sPF2^a#@itOfi zpbiCTxb@$k^q93@gY%y7w( zZvR}eC3IRu;2t~g47H4I@Qyz9Gx1-ncVnS46ZDeX0TI2Y!!@5=@An!5iJj?mPdwgw zMjSExW$^$Z+Aq_Y=libVP%Wf`cT}s*)p~X2=h^YP6$%!`xKOmoL1EjolAz?}6BdGnafU!Q{rh7Fr}&TlFwjKnj@ky8no?(Mw1OASD1j|F|IvGvm&O^YP75rexCO*Voy;hem6h z_^&TD6xGOQs(=9Gr6h{1rT(&Uiin9>g{OR)#0R4BmiSSsA2%nZqG^~`ia>`O)Scm= zue~0~5AsKGjEk}EP8a@~o3ju`=-O8iUCWL1{{3U8(o24~Qg_(V!ArL;Af$y+;%0b? zd~IT)6^G=GJa;8y;(Mjr8Dha5PhRta_oycDi*Kjdgj^JsVnu_>Bm2ii6W+JwdcrXR z(;YvLO*y$^&#Hh`v8f?B?jL7}`eNCL;Od6m0zIxN3ZnH^7N0&P*Fncqc?zT1( zccrnz*#r)E9o0{z++dfLR(WO7*C*%0k;W1adv#N9{zZ7$`ZhH_+`Vt zGG-u@0bECYduaBTGtct>E((MN>Fib%4(gBc*a8r{{WYUg!aAv=6oqA_;Kjy#zg(cpSx4{7G45lDx45 z-HBc=3ojfZf2iz|*)a5jpnVeqPpAV->(+dbxhT-J$S&-MmlMIA-rrq4dAoyXEoGhW zeuO7|2O*;;#0GUm)%r7MQzgoJ9KsO;Y|PG8aLNrzd}7N6r#eSNF=no zM=84cp-z`+LM#JSv&o@9Sqe|Ixgt>HM1$UYj6sM9mHO_1$ENWQ1+iHWj-N^!1UNtM z^rQjn%4zpLs_K8u1B~@=fxd9swv5u^hn!aHf#aHPJESCkum^e)CWm6s2_az@@yPQU z-!l&TWo5g)Dah?Yt>^FfSD5vNY&+t$gExG6ssArVXNLU#_`jQ!f1&(R_+asaMs^5l zB*s#!o((50jVB%8xZp^sR}|xvIPBFZss{ZDP+qMajjP_skopQ3(Lw20c)r{*9!tYn z?Dp;VyvCxb;>9f)zbFRncCjLHD`DOR2!cMi0LvW zR?OELoCmN3Ut`RbaBEUn5CNhHdKiiN4A7m5waKS0+Bs~0q-Avc)d<`i$)~gAq4Ljp zoG({AwWac1I*wj0DBcBr6`C6@xRmwcQi8B%FoE5ZYOo?cM~EOib$@Qe)l7R=<*jf%=lKO{j6Z$puTTpx=d z8SGXU)l4d|(@NP^#(h6k+AF`KTXvdJSN(`D=AtN8Hj8cq5yTOjRiPT7Ok7czzEVid zq)Sewpl0^rWF(F=e$j3wdd4vJ+DYJ(qYgCOW>9e7*Pt?{n!s}EP%J{`^XApmrI?ap zCB%ZSTA%Eef8W>7(1bj}SiL7_^zqRa_`#x`V{ z*NU$0G>qxfOu#MJNC0krRSg;yHp52N0u3*+Dsh4*Cvt_BSB}ab6$A3;exAiI_HE7a zDnmpht~fj{mJwRT1K7MTEN0T)Ub*OJe=nU*M1OxTi`{mwS$~8o`pjWPEu34ou9a{= za7s~}YKG8-VN|l4tdCN5I9h+%F_qwOys`Oo5+_mD}7qA zh^8HUx#XA@?{xU@1-7VjD?@TrIOKlW9qTRAj+e0%Ue@TIRu&P%i6u0k5(w~U_A8im zh!v^~L8cTd0(=2uKf6fX=V+;%B@lI6=gCt0>Vzz{hliQT0=~DAtVzXFS-f9P{hHX` ztV9CW^%65a)>O@_z=Dz8RqX0CMXS+s& z#lR5}R+VcYxI;QPc$1b6C#o>D4=c_f$)J(#(7(-?oLPHIQ3Y41ozPD*%0NU-4<{5a zw{*ts#linHNsFgyq;-wWKCxFOQR=ZD;RCV(vew)Tng@}09TFldJpOyBgxHvY;SYScig^$z*6p@1i1d`m}M79!^161>ZM`(Rwut->A@PwB& zI?u8C!-w>?#n%(Kfe#|D{7X$Rf5+^9KH@oZUiLS5dKENMLN?aHbj^WP5~Rz$^DoHai)Nt!~{+bN@e_{bcy&TOhRwEy63$Z#6rCA_Vp^IE8# zxa?uLa#k;vrdwt#cr9(LLN2SmgNZ1-(XE6J(lIi0cVyhRFfs<_%Rq+P?G;R5o=+zF z6Z|`IWbGzzcVtQ@g{+Iav{KZiD-ZR=_`4X%Uk^rF+l*S;%V(DguXzGB_b)~fe$?&4 zXgXrR8=}&8?S7RlhEM~Ka8X`rkCeK8)&Fp3)#30WS>o2|o|VBLa>jEtQ6NSru@4%AdgVA^){uumb-m6Cq6kNi$G)v+6#Q&RpW zU8kRpYA%GSQ79YAzFLyCTI0!@T*p)RU*|g3Pn6EX{e5DDq$=+$$OsNoO9ZWMc@4jC z>kdD1dJYLX!%}b!JG*+D;z`NKFZ#Yj>qs}^=&tj^)QROXBTiqmFFyN$p1ZW}sdo$C zdg+6(Jhqss#ACt&=7-cG=usixoiuphM$T=r{}jzF0i|inv2+egAZ}&O{J3w@+_~ES z`8gi&9aXNZAL9&abJRo@?507g+h#hZsPy<54J}#erKs%olNkRYekp+@5Y9NRH6yo~ ztSffou{>A2&XXQ{^O6v5@i&nS2H{-@p1)rjM`Jzm^5%=?b04X0wpB!9CYrNAeok&U z$;tO>*0t5S?Z7RlV&%IDLKH<;Jx+lPWs1`AxXoJN+vecWmq*r^Ns*4(3Wjd#to(^V z*yPgZ)x;r|G4o4KvYI%oa#A8maPH%gu5?S^F6+x;_s>c&6@o4K>%7fzA1CCSSzp z$ZlOXUl^vqIjaX-U&Ew!iCU_DnO~uPiJeAr8%0rGpdOC&J)_UjpDx|Ui%lpe)9R%H zre?pSMKn;EZ)}xv)OpRI(zf3`agv+>AiC5AK*P!X^E3Y`J!k=#Ga5DvI4w5*Zl0ZA zmtSz&Lob>NhVGY{X^t~69T!k151i_aiT7+YBc*zWR>|5@4EqcIc)Ffj&0Ij{In^0{ z&!=qL(!TdXgE)V#`f&_`^xUtehCnCyZsq;VZ0n~zmS=Nii?9I8g}SJ4&%KX@%|Z7c zn;YKFh?u^LNJ*nZ{`pB3vyH>Cscfsws4Zm&78uRp_h#TU+v&LhAqkp;G7*W<-vI&% zf|Z)R`H&EuCMiRV(vSWO&bpPP7C(5+uFCzmC@Mq2470Qor9Z32&0!QdbniYZC~JQ( zeP`Oezt{fwRo1lta}vl{)TvnHRj3C>)1D=L?|$#^9E~WAaG) z`_KL+rw6FVKYlT@+7iO}CwhOrWa6_T^!b_JvC=?M$R23aw7xpx-Iphjm@BpdVfHH2 zxt>0&wFH7Y3Jef<^+-5EQJM*n`lDYe@uzgW_E-pQQzd;Je4b~MhXHdG6hrlT%md#LCatwFC=7eNs{ieCDtCt-83)$zxMt*D2{GxA3%{I4DJ#LFt}@gKp-%OwnEY)aWwA2F_o{r69oqXIurZ6Nv9cgZQC6B z$EVG_daOzY4v=OhHm(w$z=N0p_&F<~#OBE?O{UTGMDzYa%>-Uyvu=cvNl#Gdm8|PY z_CiBvGZ+^eIoE)O_)uco`G=z7!9u<0{o=dBR8KkCAYXMdASUMetg&r(qZiS<*^UVL zX_vXlw_X89Lj&JR^fEIqUi4~Uym+6jM?_?e##L)Rg>A7<@Q>35rC59f0=_Sy1wG$7 zM-pr*0KPAp3)102UV(UFcDc1}spdF`M$t%mvLJ8KsnlJONT$N&pFiKAKei1K} z8&SfjDp*b|5n1rNFtSOPf2}jFg@7K%$u~SMvU=tVhj8^;?vD=rSp4`km)ax}qOr6P z8{I17(KguG_fapm{(WaA-(Vf|wa-~jgwfm`-UlzveDC5!4p>ay?F)ooI@As_AudWrQ8=wJO5XI$U5;ueO<@ z@jcx#+er5h-E|buU_@BtlM64Yk})?aE#@$YDUa7SY}n{fjfFQ*pr zZ`P-qqgj0E+{BP5$1*TLvl}2xbCIH#%-!`H>0}#EbxYNh4(H{0y*xRoqe4*hNS-8v+Os)|1RMK&26mc(NqF#uA%C#q+jg>)EC+AI=LLZ? zX&`HA*IZJQf#H7@KIQ-*CdN474RT)Fv4Z(`6rP)8jF2+_>7$R_}$VEvJn#brM%T zOIu0aH|4CAR=)05IQWM57JKB+-eKIUPBNIWJ5Da8B{UUC5u&Lo^YfnQ?hzLqM?Lv0 zADM2(PPVuElPYHpM4a$Vy=2 zYmioDm%;W(NG~Hbt9jnAy$p3s?aJphM=5RP8xrK2sa2448KvSC_^ECUar<-Q3gI{% zA-tbwvrpH$U-TEVe%&AX`hI#(tK5{8kZ=NH<-o9+p`bL=q-)mmuTIMYg+$$LI|6;* zf`}7c$kCFP>LFg#4Y23n9qIm{^Yrg8O~pDM@xT>vmJYlJcS) zD=wX7QF6R)=HLhhk~btjS-3|140uOTi*)2Cx;Cz9DFfCcOx>5?s4vI1Z0t>bF$_e} z#4}SsIhj~TxBhE)&-h(p)}`%jy42U(DWHX*g%u5k8&()ClEqUU2YoXniU$MxM6V|L zpe~`pXTlmRzjT_630G!+Qs~UG(4~31+*DwM*~TX(TneyJQWukNqeTB;U5)f*kqMr_ zm6H7~wr|%*O!(RNh(jNjAUCpYQ#JM03kvVb>c(xkix7W9 z(TY9qi+RWg4F-+964@Qu%O~nk+8ftl^Ahx2Wj=gy_AQ!unC?$Hj z`y}>is;iiG%;P7{_LJ1-v} zgB8>%3%KMLUN41NpV)hZgo)EvqxrD|RD(TSDT7K-M2w)Yd_f9i$ zLGX)nCIBBN;bThN3l_Win@33?%d1ppwl}MBSh`SI(U)0;q5MPvq}oo17yOS)a8E5!Y_;NL zWDv^sBXdu7Q@}7b?Q=P@n8PRgc+B>u97lAjQWNWYi0DCB;Zv5CSQ za0DxBRaI2KgauQGZrx^MUKpyV1f3g=bos|JHiS9|yH#@4TQK+&6Egp|Xq zA+w<_e_3kOaYDaqJ)=-s8EJzoIG$wC9Vnrrz1paJh)YV~Cm4aSKA0xKIP{WW(i5oS zxWQ%EvQZZk7z$!+ZW5t+r`A%685DFF5o)SJ$YvcwZ(Yj1!AWl8vfrCnMK>W2R9!(! z-h_0gqh;Tw7PY--CBaVsB1z7^tT#TX4zGrsic%e%ChB$4U@1&AQK6@bqNm4knFQ|b zC+CcV5prBHEk^kX3{PJRgM!$C1Ih4gO+uz3j%~8-O;iCB@1Bl$HO9! zT1Uktco=moA2Z?^Qq3wS@`_^kb@{4z-3f148D#Iv{P3!>eyPcePmg_G6mOIf6TkR` z4ho+9Bmd~dbLqZE78^l+eUZ-J98q{7K&%5>GQh11JTMVQ^bo^@+*}axFZcP@G2ydL z2KPq^1s*87Mt;aDJ*^&aQD+nVe@RX@r2cu$}D-6lRb zjTo*m{v!P)cXBQ+6W%H^D`Og2&Q>2-@n-moy0A3-hhpDkT!M=Y8Jn!6=p@~`N#VI3 z8@iTEQ)#zxg=Ogtg%@W!?CANENXW4P30#W<(Cv&&Oae}H?{t6EE4PIKGlEHyMn_vt zr4#rf00>0>kiiErkaeRxXryl)6@U|ZBJ5SQ<5<6Q5#OlBpAb~L26F448P0mk&0DKc zjeW+a*KQ>?h#wFl&~XRR1zJNH7a zXns-#W4uyrdr!yzb7>P>qI|32YSd%~GLQ{Z_og2+io&2?DsJvMQQCaPL^`4219*f% zAkAP>p@)6c4aaB1TZwj(m3+sS;LpC&_Rc)%oPKw|)tnL+asb>-mom{T@k*{2?|J2} z^+!EhTlMzS2AA+gh0IZ|HL#neWYt*DBB*|H>vIxVx?1!@`jh<%<^dbP4|4a(Db)sp{O z+fu4wg%EEYb=#_k4>0`<9_$%9FiKMNtH9rYwNC=X33;%z9W&wbZ<5J!?(_vE8JQDW zsqUia2tE_Hya70Dbjsyq_{UO5Ju4UY42j(14Y*nfSRjD)>l={$XJh4W-ins^JGZ|E zaG5gOW{}lsxc+=tzHc2ZffJ(#bJq)55Ax%Y=r2xzzbN>6<~8!+-K?jI`ym2pPipBF zz90&iJ^I`hD!g0HZPM5dWOuDqPx-V%U8w~g<9WVd{sP`$r&eKgBV(!UG3WSG*W`Hr zi=n&8KnLDk`XqP9tZF}z+*Bo!0AJW)+W;ckkQZvNjmqm7MqKd&c~ysKUnEDVOX=T+9*ea(1Ym>&oOl`7~c z|55_c>0s`+kX&&MNDi1wA!e|)pLej6snPX-6$PlTZ0&Eov1B+TFN$Er!bzu}&dYruwW#;L;z8TW{NJk3Nr36=F_2y?>w(gVybl^I;~Descd!ht>9vz! zz6S-JGk4zb9v1?Oj}D>{x0N4`^8|;*fPI=9G+UcbYd22=0Bu6?kr~nmWHUJ+zZSk4 z&3&h@l)`LK(=`gOE<*r9rlhWM>%FPuiI$e|hwUu#_V>H;7=^ zq&OnFM2|3mOvM|~-#39NG8%9FUek=O!Mr)EgpFj&aqi@)&L~f}LX759^Zm<$-n)vy z|>4j#$RT-lljJ5fr557565%Ji*43NWpDgECJ!OpK-%%>iI^4=T`5dkZ#(o+69 zHxkW)?t`)ri1CfD{bVms#!k|XbRq00sNy*;{HtqIK`;Bcop$myupdoG59u&Wdk)Zt zmsS!bM9M$+0QLb&Tq1C=g1j(U?UEQV;tcWC)kY?z7vn3y%-5xHPBM~hksXZ8V%rf! zVHvwAOEl?6-uo`;HQ?{fqw{=w;(a@5kxK!(;#-uLqPpB?Yz zyO{RPT+Wy7PD>m@0OYV9zKTA>IXkSPxNAPK7{FAT(@P5Z@CIq@=yfLq2PefhV8hgN z!o{nx=zMB={W3ewbOM)470RY-78$1Uo|2gcqp$$y>Q$*+xuYrUO%NK6u3erRM zY_h6jH%ag?GHzwx4K(6dHiVwRrl-7tFB3_qojV6pS>kx7D806?dDQ@nCK=etP~ztg zTq%{_`$9*8v!4;8gJa1g6H#j4^u7v#88O};s>2y?@Qj6u2B=4Zr{F0O23;oUG87nq zVoHTcu6S8JA7dz34q&cIo>Z7U=-Qxv=~@ot<_2iIH&G&EfU}-9aq;Wzs?G+-zo?0K zb4?R`2gg8*22VyQpmInxk0y(Cj;X7<|CGR%e-Q#CEL|<#DgI5up%9_bt8Lbp`Zb5e z2ASO~1-gjj$_YJL@73aKgPj+bns2C>L0V~+x=EtQC6?_%uN=VNMld1{&#lbG47ANR z`!ipigH}cY&qQy?2*~LulYHe7HPBMXX_bP4J=3v6(1G%vaV>PH(KX#%V$tkfOc#81 z6~qi-)J15o-#qFeC4`sAGxWB{_P&Wb&7k|KgPqR`YN@%0>U9HObX%7Xz z+|Ft!O#d05emUgB{raNF61D$_0b{H1U&WFCHj*m#jT2#VmVmb*-rZi~78}$>c=NJx1MY9i%$HEMC@s?>N2EJytJ8 zzg3YA0Y~P$@Ss4sT~9?;HOp3^{AM-xLy>h-9OXfpQ%;{Eq!pwjOG`Lcw zvrXn}LZ6U?5aS=1SSiRAyGVm&Nx1VCDz(c^Klth+x{a$Q&WO#-q(3VdM;aH&{wVf5 zi<%E;Crr%zUZi>YndwTP(r~gsJT**@;8QIF!$;a^qVk=7YyS`{2UlQ0ACN!#$2gJz zIA{Vz&x1CxL~Gut=m%*&ZjIQT)p)9BKc)Xe0|L2y7m$5fd3d7zGy%;t_3`QDLS?fS zF71&2nQU8NDsw89r1he97-wC{W+DR_?}?^L$Ih_El3)pOMR30lQ`z^f^9&^tJO;0b zM_%=%^ejx5^X^2HTCCJ#`wsyP5=)N0=a-6dLB!e&-NlrggW+_1yl9e)JPLl+WvPY$ zJCsm8myr>tf^S??b{~d(kheCMqTr-sphLO@qT36sL|U; z(G-tt-}-blyPK5Tm~~w3{F|>33_Ep3@iB5m$>Xyc?B;n(x&8g6#~*^5^6cA3fw0rV zTc1C6&$i}#fZd@?Z?amNhN-Sh5!^H-{p}ljJ7)&A+%liooMtv%c=hwRW7X`RQ-svI z0U^A}+OhH4scy646WVR{igH?vXARQy8*Y85Gwm6KD*ScdQm?X%YQA#FCn1T#O^-*iSu$mzyE^p9k?c55d(x8usIAx+0*bZM*#R^Q166Yz#` z=e+Bu5EV&z8xq~GdDrS7#23>IYD#^p6TG*g`FAcN6t(F>d(_}qc=S*vs zzU&ET$@N)z0hacbA_*IVS#=A1eAl8l1b+Q;-(5bU>cm?yvgEA^kiBxTl=V@8YT*H% z=>8p^;L+LaNAOanKXjo(wL_e;ir;sVgq?GREQbeYZjk{5yZOCUU&P0yfrcdl$_E%E z5^=L|$5c(e(6r&3S3JZ5isnsFWWR}c@35U0bNIz1fTb8FG)9@iMk?bfY$(ChPsqL* zSVa*r1@-2ac)Hgb`Gl0DCP{X0avaTLiA}w)F2706`Z1)(WUd&>NaBC=_WICfqA3P&S$Im1cC|h(|!%;NK=3nHpWfu!@EnrXZwh}$T7);T~bB7Ww}A55w#!q zq*HDrF)_bZg=_N(xO$FnWe#oCWMJvah{{NRh|w}JgLWdCOJ)e*0p5P*PG-D)OqGaY z4!wh09qGc-H?JKR9IzR`mF&K?*#C9Cr8ORinWFyw_7xIaVjryY)`0JazH)Oe}Uslc*hxj15rT#Z}XH;oO@7 zJVV3OjbEv(4!g8CJXRwYM(x@C#}Zs&epJ*iD>!a=sl={|Y4H>UdhF>*d8k>q9czt9 zv?S-3-Hp#apy$|IF_f=psB~%BzF{YP#eC_Htq|SW-a>Qioh*;$DUjSiGM$h7`)sDc z2w_pxec0a=`Tmk${8zrpA2cmNyWlQP;pzk3W5`jqf_$&%$DK`Fg%baF*=nGF z#)i5fD)M7CH?(2YzqZDN5+))3@Vy=`$T#P)N6H%Qm;56?$%tDoWA+;rl)o?Y5soRI zHeR~r7K!t&*AKn(@0*`7?7lUc@9*O|`>f^pOxqP=$P; zgHdCx9n@ohlxEMt55yT=Cgli$(2#$?Xi4r4K_}yDWNsL<@=ZYP3%p|BE$+Fer7H zOO#LH<$7~e_d?~9&>*#CdTIJuS*k&sIg^6wSNa9jZZme%9}6E@R`KZX` zBq|k|UV8*Gf6iPcaut(zrLpvRlJ&tIK~VA8UX!12W?3S_M1vha!ES6r?Z|>l&9}?= zm4bu}?uR{YERyXJF0?;ivL-{>sRWs%oBi}Q?ehpDNot%7eX3TU=ZNuF1#0-8+u1J) z4;?}l{D{CmNus|FI~}zoQ#2kMJ>wDesU$l3S!-0!Kw;+69_6^Q*5ldiwi__f{A#i< zfF-MfOxa=2g!Jm@smA0VDlPF3VyyQn%raF0;uUi)D5GT<@2amlVQqRS264@HA?|=U=lz*+icMRG_`@|0xCVfFAd|(k`Mh zuzVjE%2a7cYby7*x$e(&WCVRu*TPx1j%>RI;;+RrB#_Ne({%Z~@fj&yZlgMICCo}V zCReLco^X@DpuRDSRJVwMerxntPzxwoPmJC$E2|Rt1cEbsc2P<=KOt_)TegnnOZINT z)uLZ>je$%MBtWSYifI)37&B|9+BQAc%hGuvO`hW&-l`>I}OiYv`}rQ(7OK zn3FHz!LVY5ZTyH}FU1zLbCn-f9#jcJ1R9ERL@V-1`^rYw%b4Q&T9)kQ*3m!C>DlB)E7AjVZF4bpirs2$VH+x5|HWmdn8%Wkge#I z)3{J4CkkNX(L>z10&4dyY(;;1cGp^3+HmPp4<@8dDUBAhFS}ioWq#*^Kx|RW{qpOv z^l)aDgFhXXE?YL6SL&B@MP$$Rf(nmbs2gU*#F7i)S`xzhf{pfcf(Z-_nU z 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 literal 104454 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

gQkQ@tE)CK4&Cky?s_ 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 From 07aee8fac1ea83e347bf4662cfa7da0159ae853c Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Fri, 17 Aug 2018 10:10:16 -0400 Subject: [PATCH 05/10] :hocho: obsolete setClipUrl on contour heatmap fill since it's inside the contour group now it's unnecessary and in fact since I removed the uid-based class it was unused --- src/traces/contour/plot.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/traces/contour/plot.js b/src/traces/contour/plot.js index e3cb5f08679..44f6a8f9a8a 100644 --- a/src/traces/contour/plot.js +++ b/src/traces/contour/plot.js @@ -636,8 +636,6 @@ function clipGaps(plotGroup, plotinfo, clips, cd0, perimeter) { else clipId = null; plotGroup.call(Drawing.setClipUrl, clipId); - plotinfo.plot.selectAll('.hm' + cd0.trace.uid) - .call(Drawing.setClipUrl, clipId); } function makeClipMask(cd0) { From 69dee7514ba57d86a044ddf56cb79f4cc142075e Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Fri, 17 Aug 2018 13:25:26 -0400 Subject: [PATCH 06/10] refactor make_trace_groups to more general lib function instead of cartesian-specific --- src/lib/index.js | 2 + .../cartesian => lib}/make_trace_groups.js | 25 +- src/traces/bar/plot.js | 197 +++--- src/traces/box/plot.js | 79 ++- src/traces/carpet/plot.js | 54 +- src/traces/contour/plot.js | 99 ++- src/traces/contourcarpet/plot.js | 157 +++-- src/traces/heatmap/plot.js | 608 +++++++++--------- src/traces/ohlc/plot.js | 59 +- src/traces/violin/plot.js | 296 +++++---- 10 files changed, 778 insertions(+), 798 deletions(-) rename src/{plots/cartesian => lib}/make_trace_groups.js (52%) diff --git a/src/lib/index.js b/src/lib/index.js index abe8e1a8fa8..cd9f7e2ad6b 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -118,6 +118,8 @@ lib.clearThrottle = throttleModule.clear; lib.getGraphDiv = require('./get_graph_div'); +lib.makeTraceGroups = require('./make_trace_groups'); + lib._ = require('./localize'); lib.notifier = require('./notifier'); diff --git a/src/plots/cartesian/make_trace_groups.js b/src/lib/make_trace_groups.js similarity index 52% rename from src/plots/cartesian/make_trace_groups.js rename to src/lib/make_trace_groups.js index 7c4e73e3ae0..b4a571f8e8d 100644 --- a/src/plots/cartesian/make_trace_groups.js +++ b/src/lib/make_trace_groups.js @@ -9,28 +9,18 @@ 'use strict'; -var d3 = require('d3'); - /** - * helper for cartesian trace types to manage trace groups and plot traces - * into them + * General helper to manage trace groups based on calcdata * - * @param {div} gd: plot div - * @param {object} plotinfo: the cartesian subplot info object - * @param {array} cdModule: array of calcdata items for this - * module and subplot combination * @param {d3.selection} traceLayer: a selection containing a single group * to draw these traces into + * @param {array} cdModule: array of calcdata items for this + * module and subplot combination. Assumes the calcdata item for each + * trace is an array with the fullData trace attached to the first item. * @param {string} cls: the class attribute to give each trace group * so you can give multiple classes separated by spaces - * @param {function} plotOneFn: a function that will plot one trace - * takes arguments: - * gd - * plotinfo - * cd: calcdata array for this one trace - * plotGroup: d3 selection of the single group to draw into */ -module.exports = function makeTraceGroups(gd, plotinfo, cdModule, traceLayer, cls, plotOneFn) { +module.exports = function makeTraceGroups(traceLayer, cdModule, cls) { var traces = traceLayer.selectAll('g.' + cls.replace(/\s/g, '.')) .data(cdModule, function(cd) { return cd[0].trace.uid; }); @@ -39,10 +29,7 @@ module.exports = function makeTraceGroups(gd, plotinfo, cdModule, traceLayer, cl traces.enter().append('g') .attr('class', cls); - traces.each(function(cd) { - plotOneFn(gd, plotinfo, cd, d3.select(this)); - }) - .order(); + traces.order(); return traces; }; diff --git a/src/traces/bar/plot.js b/src/traces/bar/plot.js index c8802bc2567..433b30d628d 100644 --- a/src/traces/bar/plot.js +++ b/src/traces/bar/plot.js @@ -19,7 +19,6 @@ var svgTextUtils = require('../../lib/svg_text_utils'); var Color = require('../../components/color'); var Drawing = require('../../components/drawing'); var Registry = require('../../registry'); -var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); var attributes = require('./attributes'), attributeText = attributes.text, @@ -32,128 +31,128 @@ var attributes = require('./attributes'), var TEXTPAD = 3; module.exports = function plot(gd, plotinfo, cdbar, barLayer) { - var bartraces = makeTraceGroups(gd, plotinfo, cdbar, barLayer, 'trace bars', plotOne); - - // error bars are on the top - Registry.getComponentMethod('errorbars', 'plot')(bartraces, plotinfo); -}; - -function plotOne(gd, plotinfo, cd, plotGroup) { var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; var fullLayout = gd._fullLayout; - var cd0 = cd[0]; - var t = cd0.t; - var trace = cd0.trace; - if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; + var bartraces = Lib.makeTraceGroups(barLayer, cdbar, 'trace bars').each(function(cd) { + var plotGroup = d3.select(this); + var cd0 = cd[0]; + var t = cd0.t; + var trace = cd0.trace; - var poffset = t.poffset; - var poffsetIsArray = Array.isArray(poffset); + if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; - var pointGroup = Lib.ensureSingle(plotGroup, 'g', 'points'); + var poffset = t.poffset; + var poffsetIsArray = Array.isArray(poffset); - var bars = pointGroup.selectAll('g.point').data(Lib.identity); + var pointGroup = Lib.ensureSingle(plotGroup, 'g', 'points'); - bars.enter().append('g') - .classed('point', true); + var bars = pointGroup.selectAll('g.point').data(Lib.identity); - bars.exit().remove(); + bars.enter().append('g') + .classed('point', true); - bars.each(function(di, i) { - var bar = d3.select(this); + bars.exit().remove(); - // now display the bar - // clipped xf/yf (2nd arg true): non-positive - // log values go off-screen by plotwidth - // so you see them continue if you drag the plot - var p0 = di.p + ((poffsetIsArray) ? poffset[i] : poffset), - p1 = p0 + di.w, - s0 = di.b, - s1 = s0 + di.s; + bars.each(function(di, i) { + var bar = d3.select(this); - var x0, x1, y0, y1; - if(trace.orientation === 'h') { - y0 = ya.c2p(p0, true); - y1 = ya.c2p(p1, true); - x0 = xa.c2p(s0, true); - x1 = xa.c2p(s1, true); + // now display the bar + // clipped xf/yf (2nd arg true): non-positive + // log values go off-screen by plotwidth + // so you see them continue if you drag the plot + var p0 = di.p + ((poffsetIsArray) ? poffset[i] : poffset), + p1 = p0 + di.w, + s0 = di.b, + s1 = s0 + di.s; - // for selections - di.ct = [x1, (y0 + y1) / 2]; - } - else { - x0 = xa.c2p(p0, true); - x1 = xa.c2p(p1, true); - y0 = ya.c2p(s0, true); - y1 = ya.c2p(s1, true); + var x0, x1, y0, y1; + if(trace.orientation === 'h') { + y0 = ya.c2p(p0, true); + y1 = ya.c2p(p1, true); + x0 = xa.c2p(s0, true); + x1 = xa.c2p(s1, true); - // for selections - di.ct = [(x0 + x1) / 2, y1]; - } + // for selections + di.ct = [x1, (y0 + y1) / 2]; + } + else { + x0 = xa.c2p(p0, true); + x1 = xa.c2p(p1, true); + y0 = ya.c2p(s0, true); + y1 = ya.c2p(s1, true); - if(!isNumeric(x0) || !isNumeric(x1) || - !isNumeric(y0) || !isNumeric(y1) || - x0 === x1 || y0 === y1) { - bar.remove(); - return; - } + // for selections + di.ct = [(x0 + x1) / 2, y1]; + } + + if(!isNumeric(x0) || !isNumeric(x1) || + !isNumeric(y0) || !isNumeric(y1) || + x0 === x1 || y0 === y1) { + bar.remove(); + return; + } - var lw = (di.mlw + 1 || trace.marker.line.width + 1 || - (di.trace ? di.trace.marker.line.width : 0) + 1) - 1, - offset = d3.round((lw / 2) % 1, 2); + var lw = (di.mlw + 1 || trace.marker.line.width + 1 || + (di.trace ? di.trace.marker.line.width : 0) + 1) - 1, + offset = d3.round((lw / 2) % 1, 2); - function roundWithLine(v) { - // if there are explicit gaps, don't round, - // it can make the gaps look crappy - return (fullLayout.bargap === 0 && fullLayout.bargroupgap === 0) ? - d3.round(Math.round(v) - offset, 2) : v; - } + function roundWithLine(v) { + // if there are explicit gaps, don't round, + // it can make the gaps look crappy + return (fullLayout.bargap === 0 && fullLayout.bargroupgap === 0) ? + d3.round(Math.round(v) - offset, 2) : v; + } - function expandToVisible(v, vc) { - // if it's not in danger of disappearing entirely, - // round more precisely - return Math.abs(v - vc) >= 2 ? roundWithLine(v) : - // but if it's very thin, expand it so it's - // necessarily visible, even if it might overlap - // its neighbor - (v > vc ? Math.ceil(v) : Math.floor(v)); - } + function expandToVisible(v, vc) { + // if it's not in danger of disappearing entirely, + // round more precisely + return Math.abs(v - vc) >= 2 ? roundWithLine(v) : + // but if it's very thin, expand it so it's + // necessarily visible, even if it might overlap + // its neighbor + (v > vc ? Math.ceil(v) : Math.floor(v)); + } - if(!gd._context.staticPlot) { - // if bars are not fully opaque or they have a line - // around them, round to integer pixels, mainly for - // safari so we prevent overlaps from its expansive - // pixelation. if the bars ARE fully opaque and have - // no line, expand to a full pixel to make sure we - // can see them - var op = Color.opacity(di.mc || trace.marker.color), - fixpx = (op < 1 || lw > 0.01) ? - roundWithLine : expandToVisible; - x0 = fixpx(x0, x1); - x1 = fixpx(x1, x0); - y0 = fixpx(y0, y1); - y1 = fixpx(y1, y0); - } + if(!gd._context.staticPlot) { + // if bars are not fully opaque or they have a line + // around them, round to integer pixels, mainly for + // safari so we prevent overlaps from its expansive + // pixelation. if the bars ARE fully opaque and have + // no line, expand to a full pixel to make sure we + // can see them + var op = Color.opacity(di.mc || trace.marker.color), + fixpx = (op < 1 || lw > 0.01) ? + roundWithLine : expandToVisible; + x0 = fixpx(x0, x1); + x1 = fixpx(x1, x0); + y0 = fixpx(y0, y1); + y1 = fixpx(y1, y0); + } - Lib.ensureSingle(bar, 'path') - .style('vector-effect', 'non-scaling-stroke') - .attr('d', - 'M' + x0 + ',' + y0 + 'V' + y1 + 'H' + x1 + 'V' + y0 + 'Z') - .call(Drawing.setClipUrl, plotinfo.layerClipId); + Lib.ensureSingle(bar, 'path') + .style('vector-effect', 'non-scaling-stroke') + .attr('d', + 'M' + x0 + ',' + y0 + 'V' + y1 + 'H' + x1 + 'V' + y0 + 'Z') + .call(Drawing.setClipUrl, plotinfo.layerClipId); - appendBarText(gd, bar, cd, i, x0, x1, y0, y1); + appendBarText(gd, bar, cd, i, x0, x1, y0, y1); - if(plotinfo.layerClipId) { - Drawing.hideOutsideRangePoint(di, bar.select('text'), xa, ya, trace.xcalendar, trace.ycalendar); - } + if(plotinfo.layerClipId) { + Drawing.hideOutsideRangePoint(di, bar.select('text'), xa, ya, trace.xcalendar, trace.ycalendar); + } + }); + + // lastly, clip points groups of `cliponaxis !== false` traces + // on `plotinfo._hasClipOnAxisFalse === true` subplots + var hasClipOnAxisFalse = cd0.trace.cliponaxis === false; + Drawing.setClipUrl(plotGroup, hasClipOnAxisFalse ? null : plotinfo.layerClipId); }); - // lastly, clip points groups of `cliponaxis !== false` traces - // on `plotinfo._hasClipOnAxisFalse === true` subplots - var hasClipOnAxisFalse = cd0.trace.cliponaxis === false; - Drawing.setClipUrl(plotGroup, hasClipOnAxisFalse ? null : plotinfo.layerClipId); -} + // error bars are on the top + Registry.getComponentMethod('errorbars', 'plot')(bartraces, plotinfo); +}; function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { var textPosition; diff --git a/src/traces/box/plot.js b/src/traces/box/plot.js index e3ed5e03dfc..e8538b22957 100644 --- a/src/traces/box/plot.js +++ b/src/traces/box/plot.js @@ -12,62 +12,59 @@ var d3 = require('d3'); var Lib = require('../../lib'); var Drawing = require('../../components/drawing'); -var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); // constants for dynamic jitter (ie less jitter for sparser points) var JITTERCOUNT = 5; // points either side of this to include var JITTERSPREAD = 0.01; // fraction of IQR to count as "dense" function plot(gd, plotinfo, cdbox, boxLayer) { - makeTraceGroups(gd, plotinfo, cdbox, boxLayer, 'trace boxes', plotOne); -} - -function plotOne(gd, plotinfo, cd, plotGroup) { var fullLayout = gd._fullLayout; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; - var cd0 = cd[0]; - var t = cd0.t; - var trace = cd0.trace; - if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; var numBoxes = fullLayout._numBoxes; - var groupFraction = (1 - fullLayout.boxgap); - var group = (fullLayout.boxmode === 'group' && numBoxes > 1); - // box half width - var bdPos = t.dPos * groupFraction * (1 - fullLayout.boxgroupgap) / (group ? numBoxes : 1); - // box center offset - var bPos = group ? 2 * t.dPos * (-0.5 + (t.num + 0.5) / numBoxes) * groupFraction : 0; - // whisker width - var wdPos = bdPos * trace.whiskerwidth; - - if(trace.visible !== true || t.empty) { - plotGroup.remove(); - return; - } - var posAxis, valAxis; + Lib.makeTraceGroups(boxLayer, cdbox, 'trace boxes').each(function(cd) { + var plotGroup = d3.select(this); + var cd0 = cd[0]; + var t = cd0.t; + var trace = cd0.trace; + if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; + // box half width + var bdPos = t.dPos * groupFraction * (1 - fullLayout.boxgroupgap) / (group ? numBoxes : 1); + // box center offset + var bPos = group ? 2 * t.dPos * (-0.5 + (t.num + 0.5) / numBoxes) * groupFraction : 0; + // whisker width + var wdPos = bdPos * trace.whiskerwidth; + + if(trace.visible !== true || t.empty) { + plotGroup.remove(); + return; + } - if(trace.orientation === 'h') { - posAxis = ya; - valAxis = xa; - } else { - posAxis = xa; - valAxis = ya; - } + var posAxis, valAxis; + + if(trace.orientation === 'h') { + posAxis = ya; + valAxis = xa; + } else { + posAxis = xa; + valAxis = ya; + } - // save the box size and box position for use by hover - t.bPos = bPos; - t.bdPos = bdPos; - t.wdPos = wdPos; - // half-width within which to accept hover for this box - // always split the distance to the closest box - t.wHover = t.dPos * (group ? groupFraction / numBoxes : 1); - - plotBoxAndWhiskers(plotGroup, {pos: posAxis, val: valAxis}, trace, t); - plotPoints(plotGroup, {x: xa, y: ya}, trace, t); - plotBoxMean(plotGroup, {pos: posAxis, val: valAxis}, trace, t); + // save the box size and box position for use by hover + t.bPos = bPos; + t.bdPos = bdPos; + t.wdPos = wdPos; + // half-width within which to accept hover for this box + // always split the distance to the closest box + t.wHover = t.dPos * (group ? groupFraction / numBoxes : 1); + + plotBoxAndWhiskers(plotGroup, {pos: posAxis, val: valAxis}, trace, t); + plotPoints(plotGroup, {x: xa, y: ya}, trace, t); + plotBoxMean(plotGroup, {pos: posAxis, val: valAxis}, trace, t); + }); } function plotBoxAndWhiskers(sel, axes, trace, t) { diff --git a/src/traces/carpet/plot.js b/src/traces/carpet/plot.js index 86fdf8a0b1d..c7ad270a55c 100644 --- a/src/traces/carpet/plot.js +++ b/src/traces/carpet/plot.js @@ -17,47 +17,45 @@ var orientText = require('./orient_text'); var svgTextUtils = require('../../lib/svg_text_utils'); var Lib = require('../../lib'); var alignmentConstants = require('../../constants/alignment'); -var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); module.exports = function plot(gd, plotinfo, cdcarpet, carpetLayer) { - makeTraceGroups(gd, plotinfo, cdcarpet, carpetLayer, 'trace', plotOne); -}; - -function plotOne(gd, plotinfo, cd, axisLayer) { - var cd0 = cd[0]; - var trace = cd0.trace; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; - var aax = trace.aaxis; - var bax = trace.baxis; var fullLayout = gd._fullLayout; - var clipLayer = fullLayout._clips; - var minorLayer = Lib.ensureSingle(axisLayer, 'g', 'minorlayer'); - var majorLayer = Lib.ensureSingle(axisLayer, 'g', 'majorlayer'); - var boundaryLayer = Lib.ensureSingle(axisLayer, 'g', 'boundarylayer'); - var labelLayer = Lib.ensureSingle(axisLayer, 'g', 'labellayer'); + Lib.makeTraceGroups(carpetLayer, cdcarpet, 'trace').each(function(cd) { + var axisLayer = d3.select(this); + var cd0 = cd[0]; + var trace = cd0.trace; + var aax = trace.aaxis; + var bax = trace.baxis; - axisLayer.style('opacity', trace.opacity); + var minorLayer = Lib.ensureSingle(axisLayer, 'g', 'minorlayer'); + var majorLayer = Lib.ensureSingle(axisLayer, 'g', 'majorlayer'); + var boundaryLayer = Lib.ensureSingle(axisLayer, 'g', 'boundarylayer'); + var labelLayer = Lib.ensureSingle(axisLayer, 'g', 'labellayer'); - drawGridLines(xa, ya, majorLayer, aax, 'a', aax._gridlines, true); - drawGridLines(xa, ya, majorLayer, bax, 'b', bax._gridlines, true); - drawGridLines(xa, ya, minorLayer, aax, 'a', aax._minorgridlines, true); - drawGridLines(xa, ya, minorLayer, bax, 'b', bax._minorgridlines, true); + axisLayer.style('opacity', trace.opacity); - // NB: These are not ommitted if the lines are not active. The joins must be executed - // in order for them to get cleaned up without a full redraw - drawGridLines(xa, ya, boundaryLayer, aax, 'a-boundary', aax._boundarylines); - drawGridLines(xa, ya, boundaryLayer, bax, 'b-boundary', bax._boundarylines); + drawGridLines(xa, ya, majorLayer, aax, 'a', aax._gridlines, true); + drawGridLines(xa, ya, majorLayer, bax, 'b', bax._gridlines, true); + drawGridLines(xa, ya, minorLayer, aax, 'a', aax._minorgridlines, true); + drawGridLines(xa, ya, minorLayer, bax, 'b', bax._minorgridlines, true); - var labelOrientationA = drawAxisLabels(gd, xa, ya, trace, cd0, labelLayer, aax._labels, 'a-label'); - var labelOrientationB = drawAxisLabels(gd, xa, ya, trace, cd0, labelLayer, bax._labels, 'b-label'); + // NB: These are not ommitted if the lines are not active. The joins must be executed + // in order for them to get cleaned up without a full redraw + drawGridLines(xa, ya, boundaryLayer, aax, 'a-boundary', aax._boundarylines); + drawGridLines(xa, ya, boundaryLayer, bax, 'b-boundary', bax._boundarylines); - drawAxisTitles(gd, labelLayer, trace, cd0, xa, ya, labelOrientationA, labelOrientationB); + var labelOrientationA = drawAxisLabels(gd, xa, ya, trace, cd0, labelLayer, aax._labels, 'a-label'); + var labelOrientationB = drawAxisLabels(gd, xa, ya, trace, cd0, labelLayer, bax._labels, 'b-label'); - drawClipPath(trace, cd0, clipLayer, xa, ya); -} + drawAxisTitles(gd, labelLayer, trace, cd0, xa, ya, labelOrientationA, labelOrientationB); + + drawClipPath(trace, cd0, clipLayer, xa, ya); + }); +}; function drawClipPath(trace, t, layer, xaxis, yaxis) { var seg, xp, yp, i; diff --git a/src/traces/contour/plot.js b/src/traces/contour/plot.js index 44f6a8f9a8a..7a7879d733d 100644 --- a/src/traces/contour/plot.js +++ b/src/traces/contour/plot.js @@ -16,7 +16,6 @@ var Drawing = require('../../components/drawing'); var svgTextUtils = require('../../lib/svg_text_utils'); var Axes = require('../../plots/cartesian/axes'); var setConvert = require('../../plots/cartesian/set_convert'); -var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); var heatmapPlot = require('../heatmap/plot'); var makeCrossings = require('./make_crossings'); @@ -28,60 +27,60 @@ var constants = require('./constants'); var costConstants = constants.LABELOPTIMIZER; exports.plot = function plot(gd, plotinfo, cdcontours, contourLayer) { - makeTraceGroups(gd, plotinfo, cdcontours, contourLayer, 'contour', plotOne); -}; - -function plotOne(gd, plotinfo, cd, plotGroup) { - var cd0 = cd[0]; - var trace = cd0.trace; - var x = cd0.x; - var y = cd0.y; - var contours = trace.contours; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; var fullLayout = gd._fullLayout; - var pathinfo = emptyPathinfo(contours, plotinfo, cd0); - - // use a heatmap to fill - draw it behind the lines - var heatmapColoringLayer = Lib.ensureSingle(plotGroup, 'g', 'heatmapcoloring'); - var cdheatmaps = []; - if(contours.coloring === 'heatmap') { - if(trace.zauto && (trace.autocontour === false)) { - trace._input.zmin = trace.zmin = - contours.start - contours.size / 2; - trace._input.zmax = trace.zmax = - trace.zmin + pathinfo.length * contours.size; + + Lib.makeTraceGroups(contourLayer, cdcontours, 'contour').each(function(cd) { + var plotGroup = d3.select(this); + var cd0 = cd[0]; + var trace = cd0.trace; + var x = cd0.x; + var y = cd0.y; + var contours = trace.contours; + var pathinfo = emptyPathinfo(contours, plotinfo, cd0); + + // use a heatmap to fill - draw it behind the lines + var heatmapColoringLayer = Lib.ensureSingle(plotGroup, 'g', 'heatmapcoloring'); + var cdheatmaps = []; + if(contours.coloring === 'heatmap') { + if(trace.zauto && (trace.autocontour === false)) { + trace._input.zmin = trace.zmin = + contours.start - contours.size / 2; + trace._input.zmax = trace.zmax = + trace.zmin + pathinfo.length * contours.size; + } + cdheatmaps = [cd]; + } + heatmapPlot(gd, plotinfo, cdheatmaps, heatmapColoringLayer); + + makeCrossings(pathinfo); + findAllPaths(pathinfo); + + var leftedge = xa.c2p(x[0], true), + rightedge = xa.c2p(x[x.length - 1], true), + bottomedge = ya.c2p(y[0], true), + topedge = ya.c2p(y[y.length - 1], true), + perimeter = [ + [leftedge, topedge], + [rightedge, topedge], + [rightedge, bottomedge], + [leftedge, bottomedge] + ]; + + var fillPathinfo = pathinfo; + if(contours.type === 'constraint') { + fillPathinfo = convertToConstraints(pathinfo, contours._operation); + closeBoundaries(fillPathinfo, contours._operation, perimeter, trace); } - cdheatmaps = [cd]; - } - heatmapPlot(gd, plotinfo, cdheatmaps, heatmapColoringLayer); - - makeCrossings(pathinfo); - findAllPaths(pathinfo); - - var leftedge = xa.c2p(x[0], true), - rightedge = xa.c2p(x[x.length - 1], true), - bottomedge = ya.c2p(y[0], true), - topedge = ya.c2p(y[y.length - 1], true), - perimeter = [ - [leftedge, topedge], - [rightedge, topedge], - [rightedge, bottomedge], - [leftedge, bottomedge] - ]; - - var fillPathinfo = pathinfo; - if(contours.type === 'constraint') { - fillPathinfo = convertToConstraints(pathinfo, contours._operation); - closeBoundaries(fillPathinfo, contours._operation, perimeter, trace); - } - // draw everything - makeBackground(plotGroup, perimeter, contours); - makeFills(plotGroup, fillPathinfo, perimeter, contours); - makeLinesAndLabels(plotGroup, pathinfo, gd, cd0, contours, perimeter); - clipGaps(plotGroup, plotinfo, fullLayout._clips, cd0, perimeter); -} + // draw everything + makeBackground(plotGroup, perimeter, contours); + makeFills(plotGroup, fillPathinfo, perimeter, contours); + makeLinesAndLabels(plotGroup, pathinfo, gd, cd0, contours, perimeter); + clipGaps(plotGroup, plotinfo, fullLayout._clips, cd0, perimeter); + }); +}; function makeBackground(plotgroup, perimeter, contours) { var bggroup = Lib.ensureSingle(plotgroup, 'g', 'contourbg'); diff --git a/src/traces/contourcarpet/plot.js b/src/traces/contourcarpet/plot.js index fc9f1087347..4507e7e87d6 100644 --- a/src/traces/contourcarpet/plot.js +++ b/src/traces/contourcarpet/plot.js @@ -13,7 +13,6 @@ var map1dArray = require('../carpet/map_1d_array'); var makepath = require('../carpet/makepath'); var Drawing = require('../../components/drawing'); var Lib = require('../../lib'); -var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); var makeCrossings = require('../contour/make_crossings'); var findAllPaths = require('../contour/find_all_paths'); @@ -27,96 +26,96 @@ var lookupCarpet = require('../carpet/lookup_carpetid'); var closeBoundaries = require('../contour/close_boundaries'); module.exports = function plot(gd, plotinfo, cdcontours, contourcarpetLayer) { - makeTraceGroups(gd, plotinfo, cdcontours, contourcarpetLayer, 'contour', plotOne); -}; + var xa = plotinfo.xaxis; + var ya = plotinfo.yaxis; -function plotOne(gd, plotinfo, cd, plotGroup) { - var cd0 = cd[0]; - var trace = cd0.trace; + Lib.makeTraceGroups(contourcarpetLayer, cdcontours, 'contour').each(function(cd) { + var plotGroup = d3.select(this); + var cd0 = cd[0]; + var trace = cd0.trace; - var carpet = trace._carpetTrace = lookupCarpet(gd, trace); - var carpetcd = gd.calcdata[carpet.index][0]; + var carpet = trace._carpetTrace = lookupCarpet(gd, trace); + var carpetcd = gd.calcdata[carpet.index][0]; - if(!carpet.visible || carpet.visible === 'legendonly') return; + if(!carpet.visible || carpet.visible === 'legendonly') return; - var a = cd0.a; - var b = cd0.b; - var contours = trace.contours; - var xa = plotinfo.xaxis; - var ya = plotinfo.yaxis; - var pathinfo = emptyPathinfo(contours, plotinfo, cd0); - var isConstraint = contours.type === 'constraint'; - var operation = contours._operation; - var coloring = isConstraint ? (operation === '=' ? 'lines' : 'fill') : contours.coloring; - - // Map [a, b] (data) --> [i, j] (pixels) - function ab2p(ab) { - var pt = carpet.ab2xy(ab[0], ab[1], true); - return [xa.c2p(pt[0]), ya.c2p(pt[1])]; - } - - // Define the perimeter in a/b coordinates: - var perimeter = [ - [a[0], b[b.length - 1]], - [a[a.length - 1], b[b.length - 1]], - [a[a.length - 1], b[0]], - [a[0], b[0]] - ]; - - // Extract the contour levels: - makeCrossings(pathinfo); - var atol = (a[a.length - 1] - a[0]) * 1e-8; - var btol = (b[b.length - 1] - b[0]) * 1e-8; - findAllPaths(pathinfo, atol, btol); - - // Constraints might need to be draw inverted, which is not something contours - // handle by default since they're assumed fully opaque so that they can be - // drawn overlapping. This function flips the paths as necessary so that they're - // drawn correctly. - // - // TODO: Perhaps this should be generalized and *all* paths should be drawn as - // closed regions so that translucent contour levels would be valid. - // See: https://github.com/plotly/plotly.js/issues/1356 - var fillPathinfo = pathinfo; - if(contours.type === 'constraint') { - fillPathinfo = convertToConstraints(pathinfo, operation); - closeBoundaries(fillPathinfo, operation, perimeter, trace); - } + var a = cd0.a; + var b = cd0.b; + var contours = trace.contours; + var pathinfo = emptyPathinfo(contours, plotinfo, cd0); + var isConstraint = contours.type === 'constraint'; + var operation = contours._operation; + var coloring = isConstraint ? (operation === '=' ? 'lines' : 'fill') : contours.coloring; - // Map the paths in a/b coordinates to pixel coordinates: - mapPathinfo(pathinfo, ab2p); + // Map [a, b] (data) --> [i, j] (pixels) + function ab2p(ab) { + var pt = carpet.ab2xy(ab[0], ab[1], true); + return [xa.c2p(pt[0]), ya.c2p(pt[1])]; + } - // draw everything + // Define the perimeter in a/b coordinates: + var perimeter = [ + [a[0], b[b.length - 1]], + [a[a.length - 1], b[b.length - 1]], + [a[a.length - 1], b[0]], + [a[0], b[0]] + ]; + + // Extract the contour levels: + makeCrossings(pathinfo); + var atol = (a[a.length - 1] - a[0]) * 1e-8; + var btol = (b[b.length - 1] - b[0]) * 1e-8; + findAllPaths(pathinfo, atol, btol); + + // Constraints might need to be draw inverted, which is not something contours + // handle by default since they're assumed fully opaque so that they can be + // drawn overlapping. This function flips the paths as necessary so that they're + // drawn correctly. + // + // TODO: Perhaps this should be generalized and *all* paths should be drawn as + // closed regions so that translucent contour levels would be valid. + // See: https://github.com/plotly/plotly.js/issues/1356 + var fillPathinfo = pathinfo; + if(contours.type === 'constraint') { + fillPathinfo = convertToConstraints(pathinfo, operation); + closeBoundaries(fillPathinfo, operation, perimeter, trace); + } - // Compute the boundary path - var seg, xp, yp, i; - var segs = []; - for(i = carpetcd.clipsegments.length - 1; i >= 0; i--) { - seg = carpetcd.clipsegments[i]; - xp = map1dArray([], seg.x, xa.c2p); - yp = map1dArray([], seg.y, ya.c2p); - xp.reverse(); - yp.reverse(); - segs.push(makepath(xp, yp, seg.bicubic)); - } + // Map the paths in a/b coordinates to pixel coordinates: + mapPathinfo(pathinfo, ab2p); + + // draw everything + + // Compute the boundary path + var seg, xp, yp, i; + var segs = []; + for(i = carpetcd.clipsegments.length - 1; i >= 0; i--) { + seg = carpetcd.clipsegments[i]; + xp = map1dArray([], seg.x, xa.c2p); + yp = map1dArray([], seg.y, ya.c2p); + xp.reverse(); + yp.reverse(); + segs.push(makepath(xp, yp, seg.bicubic)); + } - var boundaryPath = 'M' + segs.join('L') + 'Z'; + var boundaryPath = 'M' + segs.join('L') + 'Z'; - // Draw the baseline background fill that fills in the space behind any other - // contour levels: - makeBackground(plotGroup, carpetcd.clipsegments, xa, ya, isConstraint, coloring); + // Draw the baseline background fill that fills in the space behind any other + // contour levels: + makeBackground(plotGroup, carpetcd.clipsegments, xa, ya, isConstraint, coloring); - // Draw the specific contour fills. As a simplification, they're assumed to be - // fully opaque so that it's easy to draw them simply overlapping. The alternative - // would be to flip adjacent paths and draw closed paths for each level instead. - makeFills(trace, plotGroup, xa, ya, fillPathinfo, perimeter, ab2p, carpet, carpetcd, coloring, boundaryPath); + // Draw the specific contour fills. As a simplification, they're assumed to be + // fully opaque so that it's easy to draw them simply overlapping. The alternative + // would be to flip adjacent paths and draw closed paths for each level instead. + makeFills(trace, plotGroup, xa, ya, fillPathinfo, perimeter, ab2p, carpet, carpetcd, coloring, boundaryPath); - // Draw contour lines: - makeLinesAndLabels(plotGroup, pathinfo, gd, cd0, contours, plotinfo, carpet); + // Draw contour lines: + makeLinesAndLabels(plotGroup, pathinfo, gd, cd0, contours, plotinfo, carpet); - // Clip the boundary of the plot - Drawing.setClipUrl(plotGroup, carpet._clipPathId); -} + // Clip the boundary of the plot + Drawing.setClipUrl(plotGroup, carpet._clipPathId); + }); +}; function makeLinesAndLabels(plotgroup, pathinfo, gd, cd0, contours, plotinfo, carpet) { var lineContainer = Lib.ensureSingle(plotgroup, 'g', 'contourlines'); diff --git a/src/traces/heatmap/plot.js b/src/traces/heatmap/plot.js index 5406136f62a..48130d77238 100644 --- a/src/traces/heatmap/plot.js +++ b/src/traces/heatmap/plot.js @@ -9,356 +9,356 @@ 'use strict'; +var d3 = require('d3'); var tinycolor = require('tinycolor2'); var Registry = require('../../registry'); var Lib = require('../../lib'); var Colorscale = require('../../components/colorscale'); var xmlnsNamespaces = require('../../constants/xmlns_namespaces'); -var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); var maxRowLength = require('./max_row_length'); module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) { - makeTraceGroups(gd, plotinfo, cdheatmaps, heatmapLayer, 'hm', plotOne); -}; - -function plotOne(gd, plotinfo, cd, plotGroup) { - var cd0 = cd[0]; - var trace = cd0.trace; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; - var z = cd0.z; - var x = cd0.x; - var y = cd0.y; - var xc = cd0.xCenter; - var yc = cd0.yCenter; - var isContour = Registry.traceIs(trace, 'contour'); - var zsmooth = isContour ? 'best' : trace.zsmooth; - - // get z dims - var m = z.length; - var n = maxRowLength(z); - var xrev = false; - var yrev = false; - - var left, right, temp, top, bottom, i; - - // TODO: if there are multiple overlapping categorical heatmaps, - // or if we allow category sorting, then the categories may not be - // sequential... may need to reorder and/or expand z - - // Get edges of png in pixels (xa.c2p() maps axes coordinates to pixel coordinates) - // figure out if either axis is reversed (y is usually reversed, in pixel coords) - // also clip the image to maximum 50% outside the visible plot area - // bigger image lets you pan more naturally, but slows performance. - // TODO: use low-resolution images outside the visible plot for panning - // these while loops find the first and last brick bounds that are defined - // (in case of log of a negative) - i = 0; - while(left === undefined && i < x.length - 1) { - left = xa.c2p(x[i]); - i++; - } - i = x.length - 1; - while(right === undefined && i > 0) { - right = xa.c2p(x[i]); - i--; - } - - if(right < left) { - temp = right; - right = left; - left = temp; - xrev = true; - } - - i = 0; - while(top === undefined && i < y.length - 1) { - top = ya.c2p(y[i]); - i++; - } - i = y.length - 1; - while(bottom === undefined && i > 0) { - bottom = ya.c2p(y[i]); - i--; - } + Lib.makeTraceGroups(heatmapLayer, cdheatmaps, 'hm').each(function(cd) { + var plotGroup = d3.select(this); + var cd0 = cd[0]; + var trace = cd0.trace; + + var z = cd0.z; + var x = cd0.x; + var y = cd0.y; + var xc = cd0.xCenter; + var yc = cd0.yCenter; + var isContour = Registry.traceIs(trace, 'contour'); + var zsmooth = isContour ? 'best' : trace.zsmooth; + + // get z dims + var m = z.length; + var n = maxRowLength(z); + var xrev = false; + var yrev = false; + + var left, right, temp, top, bottom, i; + + // TODO: if there are multiple overlapping categorical heatmaps, + // or if we allow category sorting, then the categories may not be + // sequential... may need to reorder and/or expand z + + // Get edges of png in pixels (xa.c2p() maps axes coordinates to pixel coordinates) + // figure out if either axis is reversed (y is usually reversed, in pixel coords) + // also clip the image to maximum 50% outside the visible plot area + // bigger image lets you pan more naturally, but slows performance. + // TODO: use low-resolution images outside the visible plot for panning + // these while loops find the first and last brick bounds that are defined + // (in case of log of a negative) + i = 0; + while(left === undefined && i < x.length - 1) { + left = xa.c2p(x[i]); + i++; + } + i = x.length - 1; + while(right === undefined && i > 0) { + right = xa.c2p(x[i]); + i--; + } - if(bottom < top) { - temp = top; - top = bottom; - bottom = temp; - yrev = true; - } + if(right < left) { + temp = right; + right = left; + left = temp; + xrev = true; + } - // for contours with heatmap fill, we generate the boundaries based on - // brick centers but then use the brick edges for drawing the bricks - if(isContour) { - xc = x; - yc = y; - x = cd0.xfill; - y = cd0.yfill; - } + i = 0; + while(top === undefined && i < y.length - 1) { + top = ya.c2p(y[i]); + i++; + } + i = y.length - 1; + while(bottom === undefined && i > 0) { + bottom = ya.c2p(y[i]); + i--; + } - // make an image that goes at most half a screen off either side, to keep - // time reasonable when you zoom in. if zsmooth is true/fast, don't worry - // about this, because zooming doesn't increase number of pixels - // if zsmooth is best, don't include anything off screen because it takes too long - if(zsmooth !== 'fast') { - var extra = zsmooth === 'best' ? 0 : 0.5; - left = Math.max(-extra * xa._length, left); - right = Math.min((1 + extra) * xa._length, right); - top = Math.max(-extra * ya._length, top); - bottom = Math.min((1 + extra) * ya._length, bottom); - } + if(bottom < top) { + temp = top; + top = bottom; + bottom = temp; + yrev = true; + } - var imageWidth = Math.round(right - left), - imageHeight = Math.round(bottom - top); + // for contours with heatmap fill, we generate the boundaries based on + // brick centers but then use the brick edges for drawing the bricks + if(isContour) { + xc = x; + yc = y; + x = cd0.xfill; + y = cd0.yfill; + } - // setup image nodes + // make an image that goes at most half a screen off either side, to keep + // time reasonable when you zoom in. if zsmooth is true/fast, don't worry + // about this, because zooming doesn't increase number of pixels + // if zsmooth is best, don't include anything off screen because it takes too long + if(zsmooth !== 'fast') { + var extra = zsmooth === 'best' ? 0 : 0.5; + left = Math.max(-extra * xa._length, left); + right = Math.min((1 + extra) * xa._length, right); + top = Math.max(-extra * ya._length, top); + bottom = Math.min((1 + extra) * ya._length, bottom); + } - // if image is entirely off-screen, don't even draw it - var isOffScreen = (imageWidth <= 0 || imageHeight <= 0); + var imageWidth = Math.round(right - left), + imageHeight = Math.round(bottom - top); - if(isOffScreen) { - var noImage = plotGroup.selectAll('image').data([]); - noImage.exit().remove(); - return; - } + // setup image nodes - // generate image data + // if image is entirely off-screen, don't even draw it + var isOffScreen = (imageWidth <= 0 || imageHeight <= 0); - var canvasW, canvasH; - if(zsmooth === 'fast') { - canvasW = n; - canvasH = m; - } else { - canvasW = imageWidth; - canvasH = imageHeight; - } + if(isOffScreen) { + var noImage = plotGroup.selectAll('image').data([]); + noImage.exit().remove(); + return; + } - var canvas = document.createElement('canvas'); - canvas.width = canvasW; - canvas.height = canvasH; - var context = canvas.getContext('2d'); - - var sclFunc = Colorscale.makeColorScaleFunc( - Colorscale.extractScale( - trace.colorscale, - trace.zmin, - trace.zmax - ), - { noNumericCheck: true, returnArray: true } - ); - - // map brick boundaries to image pixels - var xpx, - ypx; - if(zsmooth === 'fast') { - xpx = xrev ? - function(index) { return n - 1 - index; } : - Lib.identity; - ypx = yrev ? - function(index) { return m - 1 - index; } : - Lib.identity; - } - else { - xpx = function(index) { - return Lib.constrain(Math.round(xa.c2p(x[index]) - left), - 0, imageWidth); - }; - ypx = function(index) { - return Lib.constrain(Math.round(ya.c2p(y[index]) - top), - 0, imageHeight); - }; - } + // generate image data - // build the pixel map brick-by-brick - // cruise through z-matrix row-by-row - // build a brick at each z-matrix value - var yi = ypx(0); - var yb = [yi, yi]; - var xbi = xrev ? 0 : 1; - var ybi = yrev ? 0 : 1; - // for collecting an average luminosity of the heatmap - var pixcount = 0; - var rcount = 0; - var gcount = 0; - var bcount = 0; - - var xb, j, xi, v, row, c; - - function setColor(v, pixsize) { - if(v !== undefined) { - var c = sclFunc(v); - c[0] = Math.round(c[0]); - c[1] = Math.round(c[1]); - c[2] = Math.round(c[2]); - - pixcount += pixsize; - rcount += c[0] * pixsize; - gcount += c[1] * pixsize; - bcount += c[2] * pixsize; - return c; + var canvasW, canvasH; + if(zsmooth === 'fast') { + canvasW = n; + canvasH = m; + } else { + canvasW = imageWidth; + canvasH = imageHeight; } - return [0, 0, 0, 0]; - } - function interpColor(r0, r1, xinterp, yinterp) { - var z00 = r0[xinterp.bin0]; - if(z00 === undefined) return setColor(undefined, 1); - - var z01 = r0[xinterp.bin1], - z10 = r1[xinterp.bin0], - z11 = r1[xinterp.bin1], - dx = (z01 - z00) || 0, - dy = (z10 - z00) || 0, - dxy; - - // the bilinear interpolation term needs different calculations - // for all the different permutations of missing data - // among the neighbors of the main point, to ensure - // continuity across brick boundaries. - if(z01 === undefined) { - if(z11 === undefined) dxy = 0; - else if(z10 === undefined) dxy = 2 * (z11 - z00); - else dxy = (2 * z11 - z10 - z00) * 2 / 3; + var canvas = document.createElement('canvas'); + canvas.width = canvasW; + canvas.height = canvasH; + var context = canvas.getContext('2d'); + + var sclFunc = Colorscale.makeColorScaleFunc( + Colorscale.extractScale( + trace.colorscale, + trace.zmin, + trace.zmax + ), + { noNumericCheck: true, returnArray: true } + ); + + // map brick boundaries to image pixels + var xpx, + ypx; + if(zsmooth === 'fast') { + xpx = xrev ? + function(index) { return n - 1 - index; } : + Lib.identity; + ypx = yrev ? + function(index) { return m - 1 - index; } : + Lib.identity; } - else if(z11 === undefined) { - if(z10 === undefined) dxy = 0; - else dxy = (2 * z00 - z01 - z10) * 2 / 3; + else { + xpx = function(index) { + return Lib.constrain(Math.round(xa.c2p(x[index]) - left), + 0, imageWidth); + }; + ypx = function(index) { + return Lib.constrain(Math.round(ya.c2p(y[index]) - top), + 0, imageHeight); + }; } - else if(z10 === undefined) dxy = (2 * z11 - z01 - z00) * 2 / 3; - else dxy = (z11 + z00 - z01 - z10); - - return setColor(z00 + xinterp.frac * dx + yinterp.frac * (dy + xinterp.frac * dxy)); - } - - if(zsmooth) { // best or fast, works fastest with imageData - var pxIndex = 0, - pixels; - try { - pixels = new Uint8Array(imageWidth * imageHeight * 4); - } - catch(e) { - pixels = new Array(imageWidth * imageHeight * 4); + // build the pixel map brick-by-brick + // cruise through z-matrix row-by-row + // build a brick at each z-matrix value + var yi = ypx(0); + var yb = [yi, yi]; + var xbi = xrev ? 0 : 1; + var ybi = yrev ? 0 : 1; + // for collecting an average luminosity of the heatmap + var pixcount = 0; + var rcount = 0; + var gcount = 0; + var bcount = 0; + + var xb, j, xi, v, row, c; + + function setColor(v, pixsize) { + if(v !== undefined) { + var c = sclFunc(v); + c[0] = Math.round(c[0]); + c[1] = Math.round(c[1]); + c[2] = Math.round(c[2]); + + pixcount += pixsize; + rcount += c[0] * pixsize; + gcount += c[1] * pixsize; + bcount += c[2] * pixsize; + return c; + } + return [0, 0, 0, 0]; } - if(zsmooth === 'best') { - var xForPx = xc || x; - var yForPx = yc || y; - var xPixArray = new Array(xForPx.length); - var yPixArray = new Array(yForPx.length); - var xinterpArray = new Array(imageWidth); - var findInterpX = xc ? findInterpFromCenters : findInterp; - var findInterpY = yc ? findInterpFromCenters : findInterp; - var yinterp, r0, r1; - - // first make arrays of x and y pixel locations of brick boundaries - for(i = 0; i < xForPx.length; i++) xPixArray[i] = Math.round(xa.c2p(xForPx[i]) - left); - for(i = 0; i < yForPx.length; i++) yPixArray[i] = Math.round(ya.c2p(yForPx[i]) - top); - - // then make arrays of interpolations - // (bin0=closest, bin1=next, frac=fractional dist.) - for(i = 0; i < imageWidth; i++) xinterpArray[i] = findInterpX(i, xPixArray); - - // now do the interpolations and fill the png - for(j = 0; j < imageHeight; j++) { - yinterp = findInterpY(j, yPixArray); - r0 = z[yinterp.bin0]; - r1 = z[yinterp.bin1]; - for(i = 0; i < imageWidth; i++, pxIndex += 4) { - c = interpColor(r0, r1, xinterpArray[i], yinterp); - putColor(pixels, pxIndex, c); - } + function interpColor(r0, r1, xinterp, yinterp) { + var z00 = r0[xinterp.bin0]; + if(z00 === undefined) return setColor(undefined, 1); + + var z01 = r0[xinterp.bin1], + z10 = r1[xinterp.bin0], + z11 = r1[xinterp.bin1], + dx = (z01 - z00) || 0, + dy = (z10 - z00) || 0, + dxy; + + // the bilinear interpolation term needs different calculations + // for all the different permutations of missing data + // among the neighbors of the main point, to ensure + // continuity across brick boundaries. + if(z01 === undefined) { + if(z11 === undefined) dxy = 0; + else if(z10 === undefined) dxy = 2 * (z11 - z00); + else dxy = (2 * z11 - z10 - z00) * 2 / 3; } - } - else { // zsmooth = fast - for(j = 0; j < m; j++) { - row = z[j]; - yb = ypx(j); - for(i = 0; i < imageWidth; i++) { - c = setColor(row[i], 1); - pxIndex = (yb * imageWidth + xpx(i)) * 4; - putColor(pixels, pxIndex, c); - } + else if(z11 === undefined) { + if(z10 === undefined) dxy = 0; + else dxy = (2 * z00 - z01 - z10) * 2 / 3; } - } + else if(z10 === undefined) dxy = (2 * z11 - z01 - z00) * 2 / 3; + else dxy = (z11 + z00 - z01 - z10); - var imageData = context.createImageData(imageWidth, imageHeight); - try { - imageData.data.set(pixels); + return setColor(z00 + xinterp.frac * dx + yinterp.frac * (dy + xinterp.frac * dxy)); } - catch(e) { - var pxArray = imageData.data, - dlen = pxArray.length; - for(j = 0; j < dlen; j ++) { - pxArray[j] = pixels[j]; + + if(zsmooth) { // best or fast, works fastest with imageData + var pxIndex = 0, + pixels; + + try { + pixels = new Uint8Array(imageWidth * imageHeight * 4); + } + catch(e) { + pixels = new Array(imageWidth * imageHeight * 4); } - } - context.putImageData(imageData, 0, 0); - } else { // zsmooth = false -> filling potentially large bricks works fastest with fillRect - - // gaps do not need to be exact integers, but if they *are* we will get - // cleaner edges by rounding at least one edge - var xGap = trace.xgap; - var yGap = trace.ygap; - var xGapLeft = Math.floor(xGap / 2); - var yGapTop = Math.floor(yGap / 2); - - for(j = 0; j < m; j++) { - row = z[j]; - yb.reverse(); - yb[ybi] = ypx(j + 1); - if(yb[0] === yb[1] || yb[0] === undefined || yb[1] === undefined) { - continue; + if(zsmooth === 'best') { + var xForPx = xc || x; + var yForPx = yc || y; + var xPixArray = new Array(xForPx.length); + var yPixArray = new Array(yForPx.length); + var xinterpArray = new Array(imageWidth); + var findInterpX = xc ? findInterpFromCenters : findInterp; + var findInterpY = yc ? findInterpFromCenters : findInterp; + var yinterp, r0, r1; + + // first make arrays of x and y pixel locations of brick boundaries + for(i = 0; i < xForPx.length; i++) xPixArray[i] = Math.round(xa.c2p(xForPx[i]) - left); + for(i = 0; i < yForPx.length; i++) yPixArray[i] = Math.round(ya.c2p(yForPx[i]) - top); + + // then make arrays of interpolations + // (bin0=closest, bin1=next, frac=fractional dist.) + for(i = 0; i < imageWidth; i++) xinterpArray[i] = findInterpX(i, xPixArray); + + // now do the interpolations and fill the png + for(j = 0; j < imageHeight; j++) { + yinterp = findInterpY(j, yPixArray); + r0 = z[yinterp.bin0]; + r1 = z[yinterp.bin1]; + for(i = 0; i < imageWidth; i++, pxIndex += 4) { + c = interpColor(r0, r1, xinterpArray[i], yinterp); + putColor(pixels, pxIndex, c); + } + } } - xi = xpx(0); - xb = [xi, xi]; - for(i = 0; i < n; i++) { - // build one color brick! - xb.reverse(); - xb[xbi] = xpx(i + 1); - if(xb[0] === xb[1] || xb[0] === undefined || xb[1] === undefined) { - continue; + else { // zsmooth = fast + for(j = 0; j < m; j++) { + row = z[j]; + yb = ypx(j); + for(i = 0; i < imageWidth; i++) { + c = setColor(row[i], 1); + pxIndex = (yb * imageWidth + xpx(i)) * 4; + putColor(pixels, pxIndex, c); + } } - v = row[i]; - c = setColor(v, (xb[1] - xb[0]) * (yb[1] - yb[0])); - context.fillStyle = 'rgba(' + c.join(',') + ')'; - - context.fillRect(xb[0] + xGapLeft, yb[0] + yGapTop, - xb[1] - xb[0] - xGap, yb[1] - yb[0] - yGap); } - } - } - rcount = Math.round(rcount / pixcount); - gcount = Math.round(gcount / pixcount); - bcount = Math.round(bcount / pixcount); - var avgColor = tinycolor('rgb(' + rcount + ',' + gcount + ',' + bcount + ')'); + var imageData = context.createImageData(imageWidth, imageHeight); + try { + imageData.data.set(pixels); + } + catch(e) { + var pxArray = imageData.data, + dlen = pxArray.length; + for(j = 0; j < dlen; j ++) { + pxArray[j] = pixels[j]; + } + } - gd._hmpixcount = (gd._hmpixcount||0) + pixcount; - gd._hmlumcount = (gd._hmlumcount||0) + pixcount * avgColor.getLuminance(); + context.putImageData(imageData, 0, 0); + } else { // zsmooth = false -> filling potentially large bricks works fastest with fillRect - var image3 = plotGroup.selectAll('image') - .data(cd); + // gaps do not need to be exact integers, but if they *are* we will get + // cleaner edges by rounding at least one edge + var xGap = trace.xgap; + var yGap = trace.ygap; + var xGapLeft = Math.floor(xGap / 2); + var yGapTop = Math.floor(yGap / 2); - image3.enter().append('svg:image').attr({ - xmlns: xmlnsNamespaces.svg, - preserveAspectRatio: 'none' - }); + for(j = 0; j < m; j++) { + row = z[j]; + yb.reverse(); + yb[ybi] = ypx(j + 1); + if(yb[0] === yb[1] || yb[0] === undefined || yb[1] === undefined) { + continue; + } + xi = xpx(0); + xb = [xi, xi]; + for(i = 0; i < n; i++) { + // build one color brick! + xb.reverse(); + xb[xbi] = xpx(i + 1); + if(xb[0] === xb[1] || xb[0] === undefined || xb[1] === undefined) { + continue; + } + v = row[i]; + c = setColor(v, (xb[1] - xb[0]) * (yb[1] - yb[0])); + context.fillStyle = 'rgba(' + c.join(',') + ')'; + + context.fillRect(xb[0] + xGapLeft, yb[0] + yGapTop, + xb[1] - xb[0] - xGap, yb[1] - yb[0] - yGap); + } + } + } - image3.attr({ - height: imageHeight, - width: imageWidth, - x: left, - y: top, - 'xlink:href': canvas.toDataURL('image/png') + rcount = Math.round(rcount / pixcount); + gcount = Math.round(gcount / pixcount); + bcount = Math.round(bcount / pixcount); + var avgColor = tinycolor('rgb(' + rcount + ',' + gcount + ',' + bcount + ')'); + + gd._hmpixcount = (gd._hmpixcount||0) + pixcount; + gd._hmlumcount = (gd._hmlumcount||0) + pixcount * avgColor.getLuminance(); + + var image3 = plotGroup.selectAll('image') + .data(cd); + + image3.enter().append('svg:image').attr({ + xmlns: xmlnsNamespaces.svg, + preserveAspectRatio: 'none' + }); + + image3.attr({ + height: imageHeight, + width: imageWidth, + x: left, + y: top, + 'xlink:href': canvas.toDataURL('image/png') + }); }); -} +}; // get interpolated bin value. Returns {bin0:closest bin, frac:fractional dist to next, bin1:next bin} function findInterp(pixel, pixArray) { diff --git a/src/traces/ohlc/plot.js b/src/traces/ohlc/plot.js index e2e8c28e17e..85adb7eaada 100644 --- a/src/traces/ohlc/plot.js +++ b/src/traces/ohlc/plot.js @@ -8,46 +8,47 @@ 'use strict'; +var d3 = require('d3'); + var Lib = require('../../lib'); -var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); module.exports = function plot(gd, plotinfo, cdOHLC, ohlcLayer) { - makeTraceGroups(gd, plotinfo, cdOHLC, ohlcLayer, 'trace ohlc', plotOne); -}; - -function plotOne(gd, plotinfo, cd, plotGroup) { var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; - var cd0 = cd[0]; - var t = cd0.t; - var trace = cd0.trace; - if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; - if(trace.visible !== true || t.empty) { - plotGroup.remove(); - return; - } + Lib.makeTraceGroups(ohlcLayer, cdOHLC, 'trace ohlc').each(function(cd) { + var plotGroup = d3.select(this); + var cd0 = cd[0]; + var t = cd0.t; + var trace = cd0.trace; + if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; - var tickLen = t.tickLen; + if(trace.visible !== true || t.empty) { + plotGroup.remove(); + return; + } - var paths = plotGroup.selectAll('path').data(Lib.identity); + var tickLen = t.tickLen; - paths.enter().append('path'); + var paths = plotGroup.selectAll('path').data(Lib.identity); - paths.exit().remove(); + paths.enter().append('path'); - paths.attr('d', function(d) { - var x = xa.c2p(d.pos, true); - var xo = xa.c2p(d.pos - tickLen, true); - var xc = xa.c2p(d.pos + tickLen, true); + paths.exit().remove(); - var yo = ya.c2p(d.o, true); - var yh = ya.c2p(d.h, true); - var yl = ya.c2p(d.l, true); - var yc = ya.c2p(d.c, true); + paths.attr('d', function(d) { + var x = xa.c2p(d.pos, true); + var xo = xa.c2p(d.pos - tickLen, true); + var xc = xa.c2p(d.pos + tickLen, true); - return 'M' + xo + ',' + yo + 'H' + x + - 'M' + x + ',' + yh + 'V' + yl + - 'M' + xc + ',' + yc + 'H' + x; + var yo = ya.c2p(d.o, true); + var yh = ya.c2p(d.h, true); + var yl = ya.c2p(d.l, true); + var yc = ya.c2p(d.c, true); + + return 'M' + xo + ',' + yo + 'H' + x + + 'M' + x + ',' + yh + 'V' + yl + + 'M' + xc + ',' + yc + 'H' + x; + }); }); -} +}; diff --git a/src/traces/violin/plot.js b/src/traces/violin/plot.js index ed6740207ed..6912fd6f0f3 100644 --- a/src/traces/violin/plot.js +++ b/src/traces/violin/plot.js @@ -11,17 +11,12 @@ var d3 = require('d3'); var Lib = require('../../lib'); var Drawing = require('../../components/drawing'); -var makeTraceGroups = require('../../plots/cartesian/make_trace_groups'); var boxPlot = require('../box/plot'); var linePoints = require('../scatter/line_points'); var helpers = require('./helpers'); module.exports = function plot(gd, plotinfo, cdViolins, violinLayer) { - makeTraceGroups(gd, plotinfo, cdViolins, violinLayer, 'trace violins', plotOne); -}; - -function plotOne(gd, plotinfo, cd, plotGroup) { var fullLayout = gd._fullLayout; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; @@ -38,163 +33,166 @@ function plotOne(gd, plotinfo, cd, plotGroup) { return Drawing.smoothopen(segments[0], 1); } - var cd0 = cd[0]; - var t = cd0.t; - var trace = cd0.trace; - if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; - var numViolins = fullLayout._numViolins; - var group = (fullLayout.violinmode === 'group' && numViolins > 1); - var groupFraction = 1 - fullLayout.violingap; - // violin max half width - var bdPos = t.bdPos = t.dPos * groupFraction * (1 - fullLayout.violingroupgap) / (group ? numViolins : 1); - // violin center offset - var bPos = t.bPos = group ? 2 * t.dPos * (-0.5 + (t.num + 0.5) / numViolins) * groupFraction : 0; - // half-width within which to accept hover for this violin - // always split the distance to the closest violin - t.wHover = t.dPos * (group ? groupFraction / numViolins : 1); - - if(trace.visible !== true || t.empty) { - d3.select(this).remove(); - return; - } - - var valAxis = plotinfo[t.valLetter + 'axis']; - var posAxis = plotinfo[t.posLetter + 'axis']; - var hasBothSides = trace.side === 'both'; - var hasPositiveSide = hasBothSides || trace.side === 'positive'; - var hasNegativeSide = hasBothSides || trace.side === 'negative'; - var groupStats = fullLayout._violinScaleGroupStats[trace.scalegroup]; - - var violins = plotGroup.selectAll('path.violin').data(Lib.identity); - - violins.enter().append('path') - .style('vector-effect', 'non-scaling-stroke') - .attr('class', 'violin'); - - violins.exit().remove(); - - violins.each(function(d) { - var pathSel = d3.select(this); - var density = d.density; - var len = density.length; - var posCenter = d.pos + bPos; - var posCenterPx = posAxis.c2p(posCenter); - var scale; - - switch(trace.scalemode) { - case 'width': - scale = groupStats.maxWidth / bdPos; - break; - case 'count': - scale = (groupStats.maxWidth / bdPos) * (groupStats.maxCount / d.pts.length); - break; + Lib.makeTraceGroups(violinLayer, cdViolins, 'trace violins').each(function(cd) { + var plotGroup = d3.select(this); + var cd0 = cd[0]; + var t = cd0.t; + var trace = cd0.trace; + if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; + var numViolins = fullLayout._numViolins; + var group = (fullLayout.violinmode === 'group' && numViolins > 1); + var groupFraction = 1 - fullLayout.violingap; + // violin max half width + var bdPos = t.bdPos = t.dPos * groupFraction * (1 - fullLayout.violingroupgap) / (group ? numViolins : 1); + // violin center offset + var bPos = t.bPos = group ? 2 * t.dPos * (-0.5 + (t.num + 0.5) / numViolins) * groupFraction : 0; + // half-width within which to accept hover for this violin + // always split the distance to the closest violin + t.wHover = t.dPos * (group ? groupFraction / numViolins : 1); + + if(trace.visible !== true || t.empty) { + plotGroup.remove(); + return; } - var pathPos, pathNeg, path; - var i, k, pts, pt; - - if(hasPositiveSide) { - pts = new Array(len); - for(i = 0; i < len; i++) { - pt = pts[i] = {}; - pt[t.posLetter] = posCenter + (density[i].v / scale); - pt[t.valLetter] = density[i].t; + var valAxis = plotinfo[t.valLetter + 'axis']; + var posAxis = plotinfo[t.posLetter + 'axis']; + var hasBothSides = trace.side === 'both'; + var hasPositiveSide = hasBothSides || trace.side === 'positive'; + var hasNegativeSide = hasBothSides || trace.side === 'negative'; + var groupStats = fullLayout._violinScaleGroupStats[trace.scalegroup]; + + var violins = plotGroup.selectAll('path.violin').data(Lib.identity); + + violins.enter().append('path') + .style('vector-effect', 'non-scaling-stroke') + .attr('class', 'violin'); + + violins.exit().remove(); + + violins.each(function(d) { + var pathSel = d3.select(this); + var density = d.density; + var len = density.length; + var posCenter = d.pos + bPos; + var posCenterPx = posAxis.c2p(posCenter); + var scale; + + switch(trace.scalemode) { + case 'width': + scale = groupStats.maxWidth / bdPos; + break; + case 'count': + scale = (groupStats.maxWidth / bdPos) * (groupStats.maxCount / d.pts.length); + break; } - pathPos = makePath(pts); - } - if(hasNegativeSide) { - pts = new Array(len); - for(k = 0, i = len - 1; k < len; k++, i--) { - pt = pts[k] = {}; - pt[t.posLetter] = posCenter - (density[i].v / scale); - pt[t.valLetter] = density[i].t; - } - pathNeg = makePath(pts); - } + var pathPos, pathNeg, path; + var i, k, pts, pt; - if(hasBothSides) { - path = pathPos + 'L' + pathNeg.substr(1) + 'Z'; - } - else { - var startPt = [posCenterPx, valAxis.c2p(density[0].t)]; - var endPt = [posCenterPx, valAxis.c2p(density[len - 1].t)]; + if(hasPositiveSide) { + pts = new Array(len); + for(i = 0; i < len; i++) { + pt = pts[i] = {}; + pt[t.posLetter] = posCenter + (density[i].v / scale); + pt[t.valLetter] = density[i].t; + } + pathPos = makePath(pts); + } - if(trace.orientation === 'h') { - startPt.reverse(); - endPt.reverse(); + if(hasNegativeSide) { + pts = new Array(len); + for(k = 0, i = len - 1; k < len; k++, i--) { + pt = pts[k] = {}; + pt[t.posLetter] = posCenter - (density[i].v / scale); + pt[t.valLetter] = density[i].t; + } + pathNeg = makePath(pts); } - if(hasPositiveSide) { - path = 'M' + startPt + 'L' + pathPos.substr(1) + 'L' + endPt; - } else { - path = 'M' + endPt + 'L' + pathNeg.substr(1) + 'L' + startPt; + if(hasBothSides) { + path = pathPos + 'L' + pathNeg.substr(1) + 'Z'; + } + else { + var startPt = [posCenterPx, valAxis.c2p(density[0].t)]; + var endPt = [posCenterPx, valAxis.c2p(density[len - 1].t)]; + + if(trace.orientation === 'h') { + startPt.reverse(); + endPt.reverse(); + } + + if(hasPositiveSide) { + path = 'M' + startPt + 'L' + pathPos.substr(1) + 'L' + endPt; + } else { + path = 'M' + endPt + 'L' + pathNeg.substr(1) + 'L' + startPt; + } } + pathSel.attr('d', path); + + // save a few things used in getPositionOnKdePath, getKdeValue + // on hover and for meanline draw block below + d.posCenterPx = posCenterPx; + d.posDensityScale = scale * bdPos; + d.path = pathSel.node(); + d.pathLength = d.path.getTotalLength() / (hasBothSides ? 2 : 1); + }); + + var boxAttrs = trace.box || {}; + var boxWidth = boxAttrs.width; + var boxLineWidth = (boxAttrs.line || {}).width; + var bdPosScaled; + var bPosPxOffset; + + if(hasBothSides) { + bdPosScaled = bdPos * boxWidth; + bPosPxOffset = 0; + } else if(hasPositiveSide) { + bdPosScaled = [0, bdPos * boxWidth / 2]; + bPosPxOffset = -boxLineWidth; + } else { + bdPosScaled = [bdPos * boxWidth / 2, 0]; + bPosPxOffset = boxLineWidth; } - pathSel.attr('d', path); - - // save a few things used in getPositionOnKdePath, getKdeValue - // on hover and for meanline draw block below - d.posCenterPx = posCenterPx; - d.posDensityScale = scale * bdPos; - d.path = pathSel.node(); - d.pathLength = d.path.getTotalLength() / (hasBothSides ? 2 : 1); - }); - var boxAttrs = trace.box || {}; - var boxWidth = boxAttrs.width; - var boxLineWidth = (boxAttrs.line || {}).width; - var bdPosScaled; - var bPosPxOffset; - - if(hasBothSides) { - bdPosScaled = bdPos * boxWidth; - bPosPxOffset = 0; - } else if(hasPositiveSide) { - bdPosScaled = [0, bdPos * boxWidth / 2]; - bPosPxOffset = -boxLineWidth; - } else { - bdPosScaled = [bdPos * boxWidth / 2, 0]; - bPosPxOffset = boxLineWidth; - } + // inner box + boxPlot.plotBoxAndWhiskers(plotGroup, {pos: posAxis, val: valAxis}, trace, { + bPos: bPos, + bdPos: bdPosScaled, + bPosPxOffset: bPosPxOffset + }); - // inner box - boxPlot.plotBoxAndWhiskers(plotGroup, {pos: posAxis, val: valAxis}, trace, { - bPos: bPos, - bdPos: bdPosScaled, - bPosPxOffset: bPosPxOffset - }); + // meanline insider box + boxPlot.plotBoxMean(plotGroup, {pos: posAxis, val: valAxis}, trace, { + bPos: bPos, + bdPos: bdPosScaled, + bPosPxOffset: bPosPxOffset + }); - // meanline insider box - boxPlot.plotBoxMean(plotGroup, {pos: posAxis, val: valAxis}, trace, { - bPos: bPos, - bdPos: bdPosScaled, - bPosPxOffset: bPosPxOffset - }); + var fn; + if(!(trace.box || {}).visible && (trace.meanline || {}).visible) { + fn = Lib.identity; + } - var fn; - if(!(trace.box || {}).visible && (trace.meanline || {}).visible) { - fn = Lib.identity; - } + // N.B. use different class name than boxPlot.plotBoxMean, + // to avoid selectAll conflict + var meanPaths = plotGroup.selectAll('path.meanline').data(fn || []); + meanPaths.enter().append('path') + .attr('class', 'meanline') + .style('fill', 'none') + .style('vector-effect', 'non-scaling-stroke'); + meanPaths.exit().remove(); + meanPaths.each(function(d) { + var v = valAxis.c2p(d.mean, true); + var p = helpers.getPositionOnKdePath(d, trace, v); + + d3.select(this).attr('d', + trace.orientation === 'h' ? + 'M' + v + ',' + p[0] + 'V' + p[1] : + 'M' + p[0] + ',' + v + 'H' + p[1] + ); + }); - // N.B. use different class name than boxPlot.plotBoxMean, - // to avoid selectAll conflict - var meanPaths = plotGroup.selectAll('path.meanline').data(fn || []); - meanPaths.enter().append('path') - .attr('class', 'meanline') - .style('fill', 'none') - .style('vector-effect', 'non-scaling-stroke'); - meanPaths.exit().remove(); - meanPaths.each(function(d) { - var v = valAxis.c2p(d.mean, true); - var p = helpers.getPositionOnKdePath(d, trace, v); - - d3.select(this).attr('d', - trace.orientation === 'h' ? - 'M' + v + ',' + p[0] + 'V' + p[1] : - 'M' + p[0] + ',' + v + 'H' + p[1] - ); + boxPlot.plotPoints(plotGroup, {x: xa, y: ya}, trace, t); }); - - boxPlot.plotPoints(plotGroup, {x: xa, y: ya}, trace, t); -} +}; From e8929237c0d0da6f54d6e027b434c9f096f31a90 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Fri, 17 Aug 2018 13:46:06 -0400 Subject: [PATCH 07/10] fix ordering for choropleths --- src/traces/choropleth/plot.js | 14 ++--------- test/jasmine/tests/choropleth_test.js | 36 +++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/traces/choropleth/plot.js b/src/traces/choropleth/plot.js index fc0f0d176ac..2e29c3e467d 100644 --- a/src/traces/choropleth/plot.js +++ b/src/traces/choropleth/plot.js @@ -22,18 +22,8 @@ module.exports = function plot(gd, geo, calcData) { calcGeoJSON(calcData[i], geo.topojson); } - function keyFunc(d) { return d[0].trace.uid; } - - var gTraces = geo.layers.backplot.select('.choroplethlayer') - .selectAll('g.trace.choropleth') - .data(calcData, keyFunc); - - gTraces.enter().append('g') - .attr('class', 'trace choropleth'); - - gTraces.exit().remove(); - - gTraces.each(function(calcTrace) { + var choroplethLayer = geo.layers.backplot.select('.choroplethlayer'); + Lib.makeTraceGroups(choroplethLayer, calcData, 'trace choropleth').each(function(calcTrace) { var sel = calcTrace[0].node3 = d3.select(this); var paths = sel.selectAll('path.choroplethlocation') diff --git a/test/jasmine/tests/choropleth_test.js b/test/jasmine/tests/choropleth_test.js index 15a807543fa..f994387a459 100644 --- a/test/jasmine/tests/choropleth_test.js +++ b/test/jasmine/tests/choropleth_test.js @@ -8,6 +8,7 @@ var d3 = require('d3'); var createGraphDiv = require('../assets/create_graph_div'); var destroyGraphDiv = require('../assets/destroy_graph_div'); var mouseEvent = require('../assets/mouse_event'); +var failTest = require('../assets/fail_test'); var customAssertions = require('../assets/custom_assertions'); var assertHoverLabelStyle = customAssertions.assertHoverLabelStyle; @@ -175,7 +176,7 @@ describe('Test choropleth hover:', function() { }); }); -describe('choropleth bad data', function() { +describe('choropleth drawing', function() { var gd; beforeEach(function() { @@ -196,7 +197,38 @@ describe('choropleth bad data', function() { // only utopia logs - others are silently ignored expect(Lib.log).toHaveBeenCalledTimes(1); }) - .catch(fail) + .catch(failTest) + .then(done); + }); + + it('preserves order after hide/show', function(done) { + function getIndices() { + var out = []; + d3.selectAll('.choropleth').each(function(d) { out.push(d[0].trace.index); }); + return out; + } + + Plotly.newPlot(gd, [{ + type: 'choropleth', + locations: ['CAN', 'USA'], + z: [1, 2] + }, { + type: 'choropleth', + locations: ['CAN', 'USA'], + z: [2, 1] + }]) + .then(function() { + expect(getIndices()).toEqual([0, 1]); + return Plotly.restyle(gd, 'visible', false, [0]); + }) + .then(function() { + expect(getIndices()).toEqual([1]); + return Plotly.restyle(gd, 'visible', true, [0]); + }) + .then(function() { + expect(getIndices()).toEqual([0, 1]); + }) + .catch(failTest) .then(done); }); }); From 9ddad4c51463e0f4fab4bd5b19d7193970823a3e Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Fri, 17 Aug 2018 13:58:20 -0400 Subject: [PATCH 08/10] use makeTraceGroups in pie --- src/traces/pie/plot.js | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/traces/pie/plot.js b/src/traces/pie/plot.js index a1efb11946d..2e71d08674b 100644 --- a/src/traces/pie/plot.js +++ b/src/traces/pie/plot.js @@ -24,24 +24,17 @@ module.exports = function plot(gd, cdpie) { scalePies(cdpie, fullLayout._size); - var pieGroups = fullLayout._pielayer.selectAll('g.trace').data(cdpie); - - pieGroups.enter().append('g') - .attr({ - 'stroke-linejoin': 'round', // TODO: miter might look better but can sometimes cause problems - // maybe miter with a small-ish stroke-miterlimit? - 'class': 'trace' - }); - pieGroups.exit().remove(); - pieGroups.order(); - - pieGroups.each(function(cd) { + var pieGroups = Lib.makeTraceGroups(fullLayout._pielayer, cdpie, 'trace').each(function(cd) { var pieGroup = d3.select(this); var cd0 = cd[0]; var trace = cd0.trace; setCoords(cd); + // TODO: miter might look better but can sometimes cause problems + // maybe miter with a small-ish stroke-miterlimit? + pieGroup.attr('stroke-linejoin', 'round'); + pieGroup.each(function() { var slices = d3.select(this).selectAll('g.slice').data(cd); From 521d27fe17533dbf89cfca1bbdd230e037ed6e65 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Fri, 17 Aug 2018 14:11:10 -0400 Subject: [PATCH 09/10] fix ordering for scattergeo --- src/traces/scattergeo/plot.js | 11 +------ test/jasmine/tests/scattergeo_test.js | 46 +++++++++++++++++++++------ 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/traces/scattergeo/plot.js b/src/traces/scattergeo/plot.js index 9bba530371e..ac963f80c24 100644 --- a/src/traces/scattergeo/plot.js +++ b/src/traces/scattergeo/plot.js @@ -24,22 +24,13 @@ module.exports = function plot(gd, geo, calcData) { calcGeoJSON(calcData[i], geo.topojson); } - function keyFunc(d) { return d[0].trace.uid; } - function removeBADNUM(d, node) { if(d.lonlat[0] === BADNUM) { d3.select(node).remove(); } } - var gTraces = geo.layers.frontplot.select('.scatterlayer') - .selectAll('g.trace.scattergeo') - .data(calcData, keyFunc); - - gTraces.enter().append('g') - .attr('class', 'trace scattergeo'); - - gTraces.exit().remove(); + var gTraces = Lib.makeTraceGroups(geo.layers.frontplot, calcData, 'trace scattergeo'); // TODO find a way to order the inner nodes on update gTraces.selectAll('*').remove(); diff --git a/test/jasmine/tests/scattergeo_test.js b/test/jasmine/tests/scattergeo_test.js index b7368d1aa8c..50c70e48704 100644 --- a/test/jasmine/tests/scattergeo_test.js +++ b/test/jasmine/tests/scattergeo_test.js @@ -12,7 +12,7 @@ var mouseEvent = require('../assets/mouse_event'); var customAssertions = require('../assets/custom_assertions'); var assertHoverLabelStyle = customAssertions.assertHoverLabelStyle; var assertHoverLabelContent = customAssertions.assertHoverLabelContent; -var fail = require('../assets/fail_test'); +var failTest = require('../assets/fail_test'); var supplyAllDefaults = require('../assets/supply_defaults'); describe('Test scattergeo defaults', function() { @@ -252,7 +252,7 @@ describe('Test scattergeo hover', function() { lat: [10, 20, 30], text: ['A', 'B', 'C'] }]) - .catch(fail) + .catch(failTest) .then(done); }); @@ -287,7 +287,7 @@ describe('Test scattergeo hover', function() { Plotly.restyle(gd, 'hoverinfo', 'lon+lat+text+name').then(function() { check([381, 221], ['(10°, 10°)\nA', 'trace 0']); }) - .catch(fail) + .catch(failTest) .then(done); }); @@ -295,7 +295,7 @@ describe('Test scattergeo hover', function() { Plotly.restyle(gd, 'text', 'text').then(function() { check([381, 221], ['(10°, 10°)\ntext', null]); }) - .catch(fail) + .catch(failTest) .then(done); }); @@ -303,7 +303,7 @@ describe('Test scattergeo hover', function() { Plotly.restyle(gd, 'hovertext', 'hovertext').then(function() { check([381, 221], ['(10°, 10°)\nhovertext', null]); }) - .catch(fail) + .catch(failTest) .then(done); }); @@ -311,7 +311,7 @@ describe('Test scattergeo hover', function() { Plotly.restyle(gd, 'hovertext', ['Apple', 'Banana', 'Orange']).then(function() { check([381, 221], ['(10°, 10°)\nApple', null]); }) - .catch(fail) + .catch(failTest) .then(done); }); @@ -329,7 +329,7 @@ describe('Test scattergeo hover', function() { fontFamily: 'Arial' }); }) - .catch(fail) + .catch(failTest) .then(done); }); @@ -337,12 +337,12 @@ describe('Test scattergeo hover', function() { Plotly.restyle(gd, 'hoverinfo', [['lon', null, 'lat+name']]).then(function() { check([381, 221], ['lon: 10°', null]); }) - .catch(fail) + .catch(failTest) .then(done); }); }); -describe('scattergeo bad data', function() { +describe('scattergeo drawing', function() { var gd; beforeEach(function() { @@ -362,7 +362,33 @@ describe('scattergeo bad data', function() { // only utopia logs - others are silently ignored expect(Lib.log).toHaveBeenCalledTimes(1); }) - .catch(fail) + .catch(failTest) + .then(done); + }); + + it('preserves order after hide/show', function(done) { + function getIndices() { + var out = []; + d3.selectAll('.scattergeo').each(function(d) { out.push(d[0].trace.index); }); + return out; + } + + Plotly.newPlot(gd, [ + {type: 'scattergeo', lon: [10, 20], lat: [10, 20]}, + {type: 'scattergeo', lon: [10, 20], lat: [10, 20]} + ]) + .then(function() { + expect(getIndices()).toEqual([0, 1]); + return Plotly.restyle(gd, 'visible', false, [0]); + }) + .then(function() { + expect(getIndices()).toEqual([1]); + return Plotly.restyle(gd, 'visible', true, [0]); + }) + .then(function() { + expect(getIndices()).toEqual([0, 1]); + }) + .catch(failTest) .then(done); }); }); From d295d36f5475b81a05b1adc9ab47370d7707f524 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Fri, 17 Aug 2018 14:36:04 -0400 Subject: [PATCH 10/10] oops - put scattergeo in the right container --- src/traces/scattergeo/plot.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/traces/scattergeo/plot.js b/src/traces/scattergeo/plot.js index ac963f80c24..e3b46277461 100644 --- a/src/traces/scattergeo/plot.js +++ b/src/traces/scattergeo/plot.js @@ -30,7 +30,8 @@ module.exports = function plot(gd, geo, calcData) { } } - var gTraces = Lib.makeTraceGroups(geo.layers.frontplot, calcData, 'trace scattergeo'); + var scatterLayer = geo.layers.frontplot.select('.scatterlayer'); + var gTraces = Lib.makeTraceGroups(scatterLayer, calcData, 'trace scattergeo'); // TODO find a way to order the inner nodes on update gTraces.selectAll('*').remove();