Skip to content

Instantly share code, notes, and snippets.

@lwthatcher
Last active December 19, 2016 22:50
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lwthatcher/66349af9c4dca8176378f7bf0d76d9ab to your computer and use it in GitHub Desktop.
Save lwthatcher/66349af9c4dca8176378f7bf0d76d9ab to your computer and use it in GitHub Desktop.
Flocking V
license: gpl-3.0

Flocking

This example is an implementation of a simple flocking algorithm that uses the dynamics of repulsion, attraction, and orientation zones. This example is based off of the algorithm described by Couzin.

The basic principle is that each agent has three regions in a growing radius around it: a zone of repulsion, a zone of orientation, and a zone of attraction respectively. By editing the sizes of these zones you can expect to experience different behaviour.

This example allows you to see the behavior when two types of agents are used, allowing you to specify parameters for each group.

Parameters:

There are two basic types of parameters used: initial conditions and agent parameters. Agent parameters can be updated any time, including while in play. Initial conditions however require a reset before they take effect.

Note: If an initial condition is changed then the Reset button will turn yellow, indicating that a reset is required before some changes take effect.

Initial Conditions:

  • Agents: The number of agents to simulate
  • Sparsity: The spacing between agents at start, where higher numbers correspond to the agents being spaced further apart.
  • Distribution: The distribution between Group 1 and Group 2 agents. Agents from the second group are rendered as the larger dots.
  • Metric: The metric type used for the respective group for their zones of attraction. The two options are:
  • distance: The agent uses a zone of attraction, specified by the radius
  • knn: The agent uses the k nearest neighbors outside of the zone of orientation for their attraction vector.

Agent Parameters:

  • Zr: The radius of the zone of repulsion
  • Zo: The radius of the zone of orientation
  • Za: The radius of the zone of attraction (distance metric only)
  • k: The number of neighbors outside of the zone of orientation to use for the attraction vector (knn metric only)
  • s: The speed, or the distance per iteration an individual agent travels
  • θ: The turn rate (between [0, 180]) where the agent can not adjust their direction vector greater than this number for an individual iteration

Color Key:

  • Black: point is not being influenced by any other points (no points in any zones)
  • Red: point is being repulsed (contains points in its zone of repulsion)
  • Blue: point is being influenced by attraction forces only (contains points only in its zone of attraction)
  • Lawn Green: point is being influenced by orientation forces only (contains points only in its zone of orientation)
  • Turquoise: point is being influenced by both attraction and orientation forces (cointains points in both its zone of attraction and zone of orientation)

Controls:

  • Use the Play button to start animation
  • Use the Pause button to stop animation
  • Use the Next button to do one time step of the algorithm.
  • Clicking a point toggles display of its zone radii.
  • While paused, points can also be dragged around and positioned.

Dragging/Zooming behavior forked from mbostock's block: Drag & Zoom II

forked from lwthatcher's block: Directional Forces

forked from lwthatcher's block: Flocking

forked from lwthatcher's block: Flocking II

forked from lwthatcher's block: Flocking III

forked from lwthatcher's block: Flocking IV

forked from ojaneeo's block: Flocking IV

// === VARIABLES ===
// Agent Parameters
var R_r = [d3.select("#zr-1").attr("value"), d3.select("#zr-2").attr("value")];
var R_o = [d3.select("#zo-1").attr("value"), d3.select("#zo-2").attr("value")];
var R_a = [d3.select("#za-1").attr("value"), d3.select("#za-2").attr("value")];
var K = [d3.select("#k-1").attr("value"), d3.select("#k-2").attr("value")];
var TRAVEL_LENGTH = [d3.select("#speed-1").attr("value"),
d3.select("#speed-2").attr("value")];
var TURN_RATE = [d3.select("#theta-1").attr("value"),
d3.select("#theta-2").attr("value")];
var METRICS = [getMetric(d3.select("#metric-1").property("checked")),
getMetric(d3.select("#metric-2").property("checked"))];
// Start Conditions
var NUM_AGENTS = d3.select("#agents").attr("value");
var INIT_SPARSITY = d3.select("#sparsity").attr("value");
var GROUP_DISTRIBUTION = 1;
// Helper vars
var POINT_SIZE_1 = 20;
var POINT_SIZE_2 = 30;
var DT = 100;
var timer;
// === INIT ===
var svg = d3.select("svg"),
width = +svg.attr("width"),
height = +svg.attr("height"),
transform = d3.zoomIdentity;
var points = d3.range(NUM_AGENTS).map(phyllotaxis(INIT_SPARSITY));
var g = svg.append("g");
// === D3 FUNCTIONS ===
var t_p = d3.transition("points")
.duration(DT)
.ease(d3.easeLinear);
var t_r = d3.transition("radii")
.duration(DT)
.ease(d3.easeLinear);
var t = d3.transition()
.duration(DT)
.ease(d3.easeLinear);
var zoom = d3.zoom()
.scaleExtent([1 / 4, 8])
.on("zoom", zoomed);
function zoomed() {
transform = d3.event.transform;
g.attr("transform", d3.event.transform);
}
// === CONTROLS ===
var play = function() {
timer = d3.interval(() => {
next();
}, DT);
}
var pause = function() {
timer.stop();
}
// parameters
function updateR_r(value,i) {
R_r[i] = value;
d3.selectAll(".R_r-"+i).transition(t)
.attr("r", (d) => { return show_radius(d, R_r[i]); });
}
function updateR_o(value,i) {
R_o[i] = value;
d3.selectAll(".R_o-"+i).transition(t)
.attr("r", (d) => { return show_radius(d, R_o[i]); });
}
function updateR_a(value,i) {
R_a[i] = value;
d3.selectAll(".R_a-"+i).transition(t)
.attr("r", (d) => { return show_radius(d, R_a[i]); });
}
function updateK(value,i) {
K[i] = value;
console.log(K);
}
function updateSpeed(value,i) {
TRAVEL_LENGTH[i] = value;
console.log(TRAVEL_LENGTH);
}
function updateTurnRate(value,i) {
TURN_RATE[i] = value;
console.log(TURN_RATE);
}
function updateNumAgents(value) {
NUM_AGENTS = value;
d3.select("#reset").classed("btn-warning", true);
}
function updateSparsity(value) {
INIT_SPARSITY = value;
d3.select("#reset").classed("btn-warning", true);
}
function updateDistribution(value) {
var d2 = 100-value;
GROUP_DISTRIBUTION = d2/100;
console.log(GROUP_DISTRIBUTION)
d3.select("#d-g1").text(d2 + "%");
d3.select("#d-g2").text(value + "%");
d3.select("#reset").classed("btn-warning", true);
}
function changeMetric(value,i) {
var j = i+1;
console.log("metric", i, value);
METRICS[i] = getMetric(value);
if (value) { //distance
d3.select("#ak-box_" + j + "k").attr("hidden", "hidden");
d3.select("#ak-box_" + j + "a").attr("hidden", null);
}
else { //knn
d3.select("#ak-box_" + j + "a").attr("hidden", "hidden");
d3.select("#ak-box_" + j + "k").attr("hidden", null);
}
d3.select("#reset").classed("btn-warning", true);
}
//reset
function reset() {
d3.select("#reset").classed("btn-warning", null);
svg.selectAll(".point").remove();
svg.selectAll(".r").remove();
points = d3.range(NUM_AGENTS).map(phyllotaxis(INIT_SPARSITY));
start();
svg.transition().duration(750).call(zoom.transform, d3.zoomIdentity);
}
//eigenvalues
function printEigenvalues() {
var L = getLaplacian();
var eigs = getEigenvalues(L);
console.info("Eigenvalues", eigs);
var fiedler = getFiedler(eigs);
var components = getNumComponents(eigs);
d3.select("#eigs").text(fiedler);
d3.select("#num_coms").text(components);
}
// === START ===
function start() {
// SETUP POINTS
g.selectAll(".point").data(points).enter()
.append("g")
.attr("id", (d) => "pt-"+d.idx)
.attr("class", "point")
.attr("transform", (d) => {return getTransform(d.dir2,d.x,d.y);})
.on("click", onclick)
.call(d3.drag().on("drag", dragged))
.append("path")
.attr("d", (d) => {return getPointSymbolType(d)()} )
// overlay points on top
g.selectAll(".point").raise();
svg.call(zoom);
// color points
updateZones();
g.selectAll(".point").attr("class", (d) => {return "point " + d.next.style;});
}
// invoke immediately
start();
// === HELPER FUNCTIONS ===
function show_radius(d, r) {
if (d.show) return r;
else return 0;
}
function randomGroup(i) {
var x = Math.random();
var group = x > GROUP_DISTRIBUTION ? 1 : 0;
return group;
}
function getType(group) {
return METRICS[group];
}
function getMetric(checked) {
if (checked) return "dist";
else return "knn";
}
function getTransform(dir, x, y) {
var origin = [1, 0];
var dot = numeric.dot(origin, dir)
var angle = Math.acos(dot)
var nd = toDegrees(angle) - 90;
var result = ""
result += "rotate(" + nd + "," + x +"," + y +") "
result += "translate(" + x + "," + y + ") "
return result;
}
function getPointSymbolType(d) {
if (d.group === 0) return d3.symbol().size(POINT_SIZE_1).type(d3.symbolTriangle);
else return d3.symbol().size(POINT_SIZE_2).type(d3.symbolCircle);
}
// === UPDATE FUNCTIONS ===
function next() {
// get next positions
updateZones();
// move points
g.selectAll(".point").interrupt().transition(t)
.attr("transform",(d) => {d.dir2 = d.next.dir; d.x = d.next.x; d.y = d.next.y; return getTransform(d.dir2, d.x, d.y, d)} )
.attr("class", (d) => {return "point " + d.next.style;});
// move radii
g.selectAll(".r").interrupt().transition(t)
.attr("cx",(d) => { return d.x;})
.attr("cy",(d) => { return d.y;});
}
function updateZones() {
g.selectAll(".point").each((pt1) => {
var r_pts = pointsInRadius(pt1, R_r[pt1.group]),
o_pts = betweenRadii(pt1, R_r[pt1.group], R_o[pt1.group]),
a_pts;
if (pt1.metric === "dist") {
a_pts = betweenRadii(pt1, R_o[pt1.group], R_a[pt1.group])
}
else {
a_pts = knn(pt1, R_o[pt1.group], K[pt1.group]);
}
var neighbors = [];
Array.prototype.push.apply(neighbors, r_pts);
Array.prototype.push.apply(neighbors, o_pts);
Array.prototype.push.apply(neighbors, a_pts);
var ptclass = "";
// nr > 0
if (r_pts.length > 0) {
pt1.next.ddir = r_angle(pt1, r_pts);
ptclass = 'repulsed';
}
// nr == 0
else {
if (o_pts.length > 0 || a_pts.length > 0) {
if (a_pts.length > 0 && o_pts.length === 0) {
ptclass = "attracted";
pt1.next.ddir = a_angle(pt1, a_pts);
}
else if (o_pts.length > 0 && a_pts.length === 0) {
ptclass = "oriented"
pt1.next.ddir = o_angle(pt1, o_pts);
}
else if (o_pts.length > 0 && a_pts.length > 0) {
ptclass = "ao"
var dir_a = a_angle(pt1, a_pts);
var dir_o = o_angle(pt1, o_pts);
var nextdir = numeric.add(dir_a, dir_o);
numeric.diveq(nextdir, 2);
pt1.next.ddir = nextdir;
}
}
// n == 0
else {
pt1.next.ddir = pt1.dir2;
console.log("no friends", pt1.idx);
}
}
var dda = getNextAngle2(pt1);
if(isNaN(dda[0]) || isNaN(dda[1])) {
console.log("zero vector", dda)
dda = pt1.dir2;
}
var dx = pt1.x + TRAVEL_LENGTH[pt1.group] * dda[0];
var dy = pt1.y + TRAVEL_LENGTH[pt1.group] * dda[1];
pt1.next = {"dir": dda, "x":dx, "y":dy, "theta": pt1.next.theta, "style": ptclass};
pt1.neighbors = neighbors;
});
}
// === EVENT HANDLERS ===
function onclick(d) {
d.show = !d.show;
console.info(d);
if (d.show) {
// Attraction
if (d.metric === "dist") {
g.append("circle").datum(d).lower()
.attr("class", (d) => {return "r R_a r--" + d.idx + " R_a-" + d.group;})
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", 0)
.attr("opacity", 0.10)
.transition(t)
.attr("r", (d) => { return show_radius(d, R_a[d.group]); });
}
// Orientation
g.append("circle").datum(d).lower()
.attr("class", (d) => {return "r R_o r--" + d.idx + " R_o-" + d.group;})
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", 0)
.attr("opacity", 0.15)
.transition(t)
.attr("r", (d) => { return show_radius(d, R_o[d.group]); });
// Repulsion
g.append("circle").datum(d).lower()
.attr("class", (d) => {return "r R_r r--" + d.idx + " R_r-" + d.group;})
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", 0)
.attr("opacity", 0.35)
.transition(t)
.attr("r", (d) => { return show_radius(d, R_r[d.group]); });
}
else {
d3.select(".R_r.r--"+d.idx).transition(t).attr("r", 0).remove();
d3.select(".R_o.r--"+d.idx).transition(t).attr("r", 0).remove();
d3.select(".R_a.r--"+d.idx).transition(t).attr("r", 0).remove();
}
}
function dragged(d) {
dx = d3.event.x;
dy = d3.event.y;
// update point
var pt = d3.select("#pt-"+d.idx)
.attr("transform", (d) => {return getTransform(d.dir2,dx,dy);})
// update collision state
updateZones();
g.selectAll(".point").attr("class", (d) => {return "point " + d.next.style;});
// update radius
d3.select(".R_r.r--" + d.idx)
.attr("cx", d.x = dx).attr("cy", d.y = dy);
d3.select(".R_o.r--" + d.idx)
.attr("cx", d.x = dx).attr("cy", d.y = dy);
d3.select(".R_a.r--" + d.idx)
.attr("cx", d.x = dx).attr("cy", d.y = dy);
}
// === MATH FUNCTIONS ===
function dist(pt1, pt2) {
return Math.pow((pt1.x-pt2.x),2) + Math.pow((pt1.y-pt2.y),2);
}
function getNextAngle(pt) {
var θτ = TURN_RATE[pt.group];
var dθ = (pt.dir - pt.next.ddir);
var newDir = pt.next.ddir;
if (Math.abs(dθ) > θτ) {
newDir = pt.dir + Math.sign(dθ)*θτ;
}
return newDir % 360;
}
function getNextAngle2(pt) {
var θτ = TURN_RATE[pt.group];
var dθ = numeric.sub(pt.dir2, pt.next.ddir)
var newDir = pt.next.ddir;
var dot = numeric.dot(pt.dir2, pt.next.ddir);
var acos = toDegrees(Math.acos(dot));
pt.next.theta = acos
if (Math.abs(acos) > θτ) {
var theta = Math.sign(acos)*θτ;
pt.next.theta = theta
var rotMat = [[Math.cos(theta), -Math.sin(theta)],
[Math.sin(theta), Math.cos(theta)]]
newDir = numeric.dot(rotMat, pt.dir2)
}
return newDir;
}
function getLaplacian() {
var L = [];
g.selectAll(".point").each((p1,i,nodes) => {
L[p1.idx] = Array(nodes.length).fill(0);
for (var p2 of p1.neighbors) {
L[p1.idx][p2.idx] = -1;
}
L[p1.idx][p1.idx] = -1 * L[p1.idx].reduce( ( acc, cur ) => acc + cur, 0 );
});
console.info("Graph Laplacian:", L.join('\n'));
return L;
}
function getEigenvalues(L) {
var eigs = numeric.eig(L);
return eigs['lambda'].x.map((x) => +x.toFixed(3)).sort();
}
function getFiedler(eigs) {
return eigs.find((v) => {return v > 0;})
}
function getNumComponents(eigs) {
return eigs.filter((v) => {return v === 0;}).length;
}
function r_angle(d, pts) {
var sum = [0, 0];
for (var p of pts) {
r = [p.x-d.x, p.y-d.y];
r = normalize(r);
numeric.addeq(sum,r);
}
var ave = normalize(sum);
ave = numeric.neg(ave);
return ave;
}
function a_angle(d, pts) {
var sum = [0, 0];
for (var p of pts) {
r = [p.x-d.x, p.y-d.y];
r = normalize(r);
numeric.addeq(sum,r);
}
var ave = normalize(sum);
return ave;
}
function o_angle(d, pts) {
var sum = [0, 0];
for (var p of pts) {
numeric.addeq(sum, p.dir2);
}
var ave = normalize(sum);
return ave;
}
function knn(pt1,r, k) {
var neighbors = [];
var compare = (a,b) => {return a.dist - b.dist;}
g.selectAll(".point").each((d) => {
if (pt1.idx != d.idx && !withinRadius(pt1, d, r)) {
var item = {"dist": dist(pt1,d), "point": d}
neighbors.push(item);
}
});
neighbors.sort(compare);
var result = neighbors.map((n) => n.point);
return result.slice(0,k);
}
function pointsInRadius(pt1, r) {
var result = [];
d3.selectAll(".point").each((d) => {
if (pt1.idx != d.idx && withinRadius(pt1, d, r)) {
result.push(d);
}
});
return result;
}
function betweenRadii(pt1, r_inner, r_outer) {
var result = [];
d3.selectAll(".point").each((d) => {
if (pt1.idx != d.idx && withinRadius(pt1, d, r_outer) && !withinRadius(pt1, d, r_inner)) {
result.push(d);
}
});
return result;
}
function withinRadius(pt1, pt2, r) {
var dx = pt1.x-pt2.x;
var dy = pt1.y-pt2.y;
return dx*dx + dy*dy <= r*r;
}
function toDegrees (angle) {
return (angle * (180 / Math.PI)) % 360;
}
function toRadians (angle) {
return angle * (Math.PI / 180);
}
function getRandomNum(min, max) {
return Math.random() * (max - min) + min;
}
function normalize(v) {
var mag = numeric.norm2(v);
return numeric.div(v,mag);
}
function getUnitDir(x,y) {
var v = [x,y];
var mag = numeric.norm2(v);
return numeric.div(v,mag);
}
function angleToVector(a) {
var x = Math.cos(a);
var y = Math.sin(a);
var v = [x, y];
return normalize(v);
}
function phyllotaxis(radius) {
var theta = Math.PI * (3 - Math.sqrt(5));
return function(i) {
var r = radius * Math.sqrt(i), a = theta * i;
var group = randomGroup(i);
var dir = toDegrees(a)+getRandomNum(0,360);
var x = width / 2 + r * Math.cos(a);
var y = height / 2 + r * Math.sin(a);
return {
idx: i,
x: x,
y: y,
dir: dir,
dir2: angleToVector(a),
group: group,
next: {"dir": dir, "ddir": getUnitDir(x,y), "theta": 0},
metric: getType(group),
show: false
};
};
}
<!DOCTYPE html>
<meta charset="utf-8">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link href="https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css" rel="stylesheet">
<style> /* set the CSS */
.point {
fill: darkslategrey;
}
.repulsed {
fill: red;
stroke: red;
}
.attracted {
fill: blue;
stroke: blue;
}
.oriented {
fill: darkmagenta;
stroke: darkmagenta;
}
.ao {
fill: DarkTurquoise;
stroke: DarkTurquoise;
}
.moved {
stroke: black;
fill: black;
}
.R_r {
fill: lightsalmon;
}
.R_o {
fill: Chartreuse;
}
.R_a {
fill: lightskyblue;
}
.num {
float: left;
}
.counter {
width: 50px;
float: right;
margin-right: 40px;
}
.counter-small {
width: 50px;
float: right;
margin-right: 0px;
}
.Group {
font-size: 12px;
font-weight: bold;
}
hr {
margin-top: 2px;
margin-bottom: 2px;
}
input[type=range] {
width: 85%;
margin-left: 17px;
}
.g1 {
background-color: lightcyan;
}
.g2 {
background-color: lightgray;
}
</style>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="http://www.numericjs.com/lib/numeric-1.2.6.js"></script>
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script>
<div class="row">
<div class="col-sm-9">
<svg id="svg" width="740" height="500"></svg>
</div>
<div class="col-sm-3">
<div class="row">
<b>Start Conditions:</b>
</div>
<div class="row">
<div class="num">Agents: </div>
<input class="counter" id="agents" type="number" onchange="updateNumAgents(this.value)" value=30></input>
</div>
<div class="row">
<div class="num">Sparsity: </div>
<input class="counter" id="sparsity" type="number" onchange="updateSparsity(this.value)" value=45></input>
</div>
<div class="row">
<div class="num">Distribution: </div><br>
<input class="range" id="dist" type="range" value=0 onchange="updateDistribution(this.value)"></input>
</div>
<div class="row">
<div class="col-sm-6 g1">
<span id="d-g1">100%</span>
</div>
<div class="col-sm-6 g2">
<span id="d-g2">0%</span>
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-6 g1">
<input id="metric-1" type="checkbox" data-on="distance" onchange="changeMetric(this.checked, 0)" data-off="knn" checked data-toggle="toggle">
</div>
<div class="col-sm-6 g2">
<input id="metric-2" type="checkbox" onchange="changeMetric(this.checked, 1)" data-on="distance" data-off="knn" data-toggle="toggle">
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-6 g1">
<span class="Group">Group 1:</span><br>
<div class="num">Zr:</div>
<input class="counter-small" id="zr-1" type="number" onchange="updateR_r(this.value, 0)" value=20></input>
</div>
<div class="col-sm-6 g2">
<span class="Group">Group 2:</span><br>
<div class="num">Zr:</div>
<input class="counter-small" id="zr-2" type="number" onchange="updateR_r(this.value, 1)" value=50></input>
</div>
</div>
<div class="row">
<div class="col-sm-6 g1">
<span class="Group"></span>
<div class="num">Zo:</div>
<input class="counter-small" id="zo-1" type="number" onchange="updateR_o(this.value, 0)" value=100></input>
</div>
<div class="col-sm-6 g2">
<div class="num">Zo:</div>
<input class="counter-small" id="zo-2" type="number" onchange="updateR_o(this.value, 1)" value=100></input>
</div>
</div>
<div class="row">
<div class="col-sm-6 g1" id="ak-box_1a">
<span class="Group"></span>
<div class="num">Za:</div>
<input class="counter-small" id="za-1" type="number" onchange="updateR_a(this.value, 0)" value=150></input>
</div>
<div class="col-sm-6 g1" id="ak-box_1k" hidden="hidden">
<span class="Group"></span>
<div class="num">k:</div>
<input class="counter-small" id="k-1" type="number" onchange="updateK(this.value, 0)" value=5></input>
</div>
<div class="col-sm-6 g2" id="ak-box_2a" hidden="hidden">
<div class="num">Za:</div>
<input class="counter-small" id="za-2" type="number" onchange="updateR_a(this.value, 1)" value=150></input>
</div>
<div class="col-sm-6 g2" id="ak-box_2k">
<span class="Group"></span>
<div class="num">k:</div>
<input class="counter-small" id="k-2" type="number" onchange="updateK(this.value, 1)" value=5></input>
</div>
</div>
<div class="row">
<div class="col-sm-6 g1">
<span class="Group"></span>
<div class="num">s:</div>
<input class="counter-small" id="speed-1" type="number" onchange="updateSpeed(this.value, 0)" min=0 value=15></input>
</div>
<div class="col-sm-6 g2">
<div class="num">s:</div>
<input class="counter-small" id="speed-2" type="number" onchange="updateSpeed(this.value, 1)" min=0 value=15></input>
</div>
</div>
<div class="row">
<div class="col-sm-6 g1">
<span class="Group"></span>
<div class="num">θ:</div>
<input class="counter-small" id="theta-1" type="number" onchange="updateTurnRate(this.value, 0)" min=0 max=180 value=100></input>
</div>
<div class="col-sm-6 g2">
<div class="num">θ:</div>
<input class="counter-small" id="theta-2" type="number" onchange="updateTurnRate(this.value, 1)" min=0 max=180 value=100></input>
</div>
</div>
<hr>
<div class="row">
<b>Controls:</b>
<br>
<button onclick="play()"><span class="glyphicon glyphicon-play"></button>
<button onclick="pause()"><span class="glyphicon glyphicon-pause"></button>
<button onclick="next()"><span class="glyphicon glyphicon-step-forward"></button>
</div>
<hr>
<div class="row">
<button id="reset" class="btn" onclick="reset()">Reset</button>
</div>
<hr>
<div class="row">
<button class="btn btn-primary" onclick="printEigenvalues()">Get Eigenvalues</button>
</div>
<div class="row">
Fiedler: <span id="eigs"></span>
</br>
# Components: <span id="num_coms"></span>
</div>
</div>
</div>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="flocking.js"></script>
�PNG

IHDR�����
�iCCPICC ProfileH���T���̤Z � �#��k(ҫ��@%�@P�+�
���,E\�"kAD��(v� ���.l�� ������;��w�w����o��{��\a ���lQ��'#6.��� ��@���z��T3׿��mt4���S�����<7)��r"7����)4�s��l.��]�-���(+��Q.�b�4���i��>&2� �(l���w4�����: ʖ._��-ʮ�6:��22�N�!�����o5�5�l�������,a:{����[��9tР���ç�C׬6mi����Cf�ϝ�i�S��Q3���a.�;p��iQ3��>��fEΰhi��� }~��~K�IY>3���e�pnJd� ����pVZD��/i^$���,�cF�lo��\�)���=�J��&y�H�(�xa����0=t��t?i>+'B�l6��f8�:['T�>��p���O�+�T�B��d3<�S��` 8f kK+{����'}K�~� ���\f;�h�7�c�p�)���9�7�v���^�X�3���� H@(� t�0��8w�@�q`1���D`Xփ|Pv�=��A-8N�p\��u� � ����Ax�
� H ҇L!k� �B>P�A @bh�*���R���~�NC��Pt�F�7�g�)�"��sa&�‘�"�g¹p� .�+�p3|���<����m�a"^H�$#"d R�#�H҆t!7 ����ah����Da8�L��VL)�ӌ���� b�0߰T�:��eac�<�2l>�[�m�^�`���q8g�s����p��������F\;�7����*xS� >��g�����G�����a�G��E�&�� �B1����0B� ���N�"�����XEl#� 'H�$C� )��JZO*!5�.��ޒ�d�#9��'�#������ɟ(
�e!EL�F���S�Q�R�T�;5��M�F��^�>�~���XȰd�2ke�d�e�e^�e�e=d���˞��!�R�(g �%ǖ[#W&wZ�ܸ<M�J>D>C~�������

>
\�<��
�hM��E��6Ҫh�hÊ8ECE�b�b��1��1%%[�h��JeJg�$t�n@g�����'���h��4g˜�9�s>(�)�+')(7*(Va������TiQy��Q5Q S]�z@���K5E5g5�Z�� ��갺�z��J�������~B�}5^j�5�5S5wk��բi�j�vk��z�Pbx0�%�NƘ�����X�B�G{B�P'Jg�N��#]�.S7Yw�n��^��*�z���D}�~��^�.��1� Z �*� s � Q�܌2�*�n㌙�i���{M`;��2�����)�t�i����L`Vivǜb�a�c^o>hA���`�b�j�����;�v��fig�nYe��J�*�j�U��kk�u��-����Z�V�׶��I�l�����6�u�}�w��7؏:�9$8�;�a*2C�[�W����k�8~r�w�v:�����s���g� �%ͫ�7���v�p��2\\�Jܴ��n�nO�uݹ���#��G=^yZz�<�<?x9y��j�F��� �{||�|J}����|�}����V���c��w��ai�8�:�X�C���@J`D`i�� � QP[0�+��|����-! ��+�Q�ahf�/a��а����V�»"hK"�D����� �(J�-�0�.�C�wLQ�$vn����q�q���x||t|u���{ /�[����"�E�]]��8}��%�K�KN&`b�$|a��+�㉬���1�g/�ם��;��T�4��\�������MqK)Ny����_���L���V�6��ޘA�H�8-P� :�j.]��Oh*�J2�2�d��E�YP֢��lE��t���?�s\s�r>.�^vr��r���&+������i%f%ge�*�U�W ��X]�Z���c��ڼ�����ծ'�O[��� E�m��ؖ���.o����e�E�w69o:�����g�͖}[�p �Z~���z�G�K~�ܖ��g���;p;;n�t�Y[$_�[4�+xW�n�����,�s�ض��^�^�^IIPI�>�};�})M)(�,k,W/�R�a?w�� 5�|��n�_Es�Ae�a���O����~b�TW�Z]X��FP#� ���s��;�~d{=\/�=��h�1�c� � ���������~�}"�D�I�ɆS��ʛhM�P�汖�Ik\k���m�mM�X�RsF�L�Y���ϑ�坛<�{~�]�����Pǒ�c/�� ��x��e���<��_q�r����ט�Z��_o��n���צ���7Z{{������w�p����[�[���ݎ�}���;��ܻ���{}?��ău� �=*~����7��%����ރ�O"�<� ��=��/�yO�O�G�F�Y?;3�;��|����/�������ѫS���=;6�Z�z��ַ*ok�پ��>��ć��*k?1?u}��<2�� �K�W�m��=�̘��E��VANN�M �8�;�@�����M����O���B�K�;Q�B=�4�Q���)K�`i�CY�6�ӵ(���~��|�� ����ɉ���_��f�О9�ŧ�C�P�c��[s �W��"L�BOY�iTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:exif="http://ns.adobe.com/exif/1.0/">
<exif:PixelXDimension>960</exif:PixelXDimension>
<exif:PixelYDimension>500</exif:PixelYDimension>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
��2r�IDATx��]ݡ�8�v�t@:�H��t@: p:p:p .�%���ݝ��Ȳ df|��' �~��G�}�e>�kB��P��ǟ(�?�[�����B��'���<�B�?|A�� !
��U[���W)�ȴ��S�� ����Ʉ�2!zgG�i�e��k!�[�?�͕ !�۾c�����,D�,� �A8�r����Ba�ζ�l�E�&Y�lB���u xß\���P��� �K[�ok���l�%\���T�6�+Q-�//��GX!ڏ;�e=�o�� [���\SԊ��e�J!����e؆�q�x@�R_����v���8׺��g? Ǫ�_����<P�wf�'���}i�)��,�%Io�9��2�}~Ͳ3zf��W�|��
b_/�\�R��&c�(�m� ���\}���
!D�ui���(���A�2�ߓ��sX��u�ں3�� /�t[�;�86u��E�8.d��|"�������wd��>~�x�}��)�&���)V�e>xdRK��v��~7�G?E/�X������V��z�PKfYv2��~�~I=~P8DQ�N�C�g6��`'G{̲S��~ǜ�8�����P�77�3�4~���jE�� `9>?���;��SH�"h��2Sݧ���B;8�Au�`P_e�8�d>���!�:"š��ͽ:�J�&[��rq����( ���vlBDT� �D� 0uer.�(jiج���.���R�ך�y�J��������e�H�
��w%;c��Z���x:��Ə9Te��^?�1�����A��+�a�`��K�nB�:�7�(A�:C� D��–޽8��~�G��"B���?.���k���_gǪ'!2'ue2��@�&��'��ڳ��T°Ʀ�7{��Ēc�y�p9�v���}����6���%���gq\g�q����rqa��YDx8+%��f�4x]�n �Z��+�ǝ��Y9������i���13ެd1p"��k�� ��4Yn}Uik;�cW�s�k�����1�F�p�a�8?QFo�d���о�^�Ǒ"p3Ld��J��9SX��/�s���Su��q�%�j���ߨ���4��+ҟ�u�h8 �g9e��i��4^�pq��^mrZr���kj�n�ð��Wt�`.E�-�˹b�>U���)���R� �}*���S�u�Ї�7�J���wm�c�S[$LW�۸�� ���4k_/�ytз!2���m�[K��&қ��a��۶��F������ն= �w�ڷPJ6����sT������q�_�C��sy+�*����V�)�gb�^s7���D�F���J���`��� ��gd�6�y1"�3}�i�g�6�ϫ5������$|��g���-��Ō#�I���
i�J��\�~��uj�G�K��DX�p5�S������4R�#J�=���0'0���ry�תs���یf��WՁ�g'�F�H!
��&��G�TBd�v�NG���'[ym\
�w�<2}�J�v�>0��V�[� c�� �����#4��5��y`n�3���4�'�d�&OMu���o�j��V���N�?��eN������
L]�!��h��d +����9��1� H�a�L�a�/����|��ʿ���b}0,b�� ��2��Ja?�V�����pv��[��k���;�-�y�����tk�"ok�bU����� �nw�b�=V�eɃM���GݺS{�뺶Wuyk&�1 ē�������_����,T��m8��Cz����]�������K0��=�?����u﹞�+5Z�ʼn��e[_�j�ݾ�ĝU��男����Z�����;�!}�z� a#��0�d�8���2�fߪAi����+ SY.M~5.�-kd.Dk~o���S��Cw���}/ˑ�T(I�4`"pR�7��w���gN�!uuxS���Ǎ=
��e��|�vvS|���A` ͽf}ua�.�Dg�}�9%�f6�7��tۗ�KI�(��6ӵ�ظ �ٜ0�Z/��� �������m|��ϰ��&BT��۫� ���](�wu�g��3L6^�Lf[XPmj���u�zB���P��^ ���>|m_��EG��[ �y�?�;��� lG�Ja�J+����|2�솷K���x��;��Ӄ +;�Z��Xqƽ�>�8M������mر����0z�� ��8�C����uW���w����/�1]�~"�s�%��'@�k%3�U��U�{��Ч���>��㥼�޹>c��Q��w�w0�t��vv>��1�ȧ��?�V��%#&.9%0��Z� ����P����k�haqmv36רw3�)�F�"�SЪm'�Q�ݴ��N��������$BI��w��J��!2wl.4! /=��_��� P�!��D��nj|n��D�����b��R��*.������ܫ��<e\̄���Z���9�^�+=>t�ͻ�������o���/���$�j *�f:Ql+n�tg�@�� ӥS��WJ�K��1)��������&�<�^r{����.�ʜ��G36�
���C��r�9��CZ
'5�� ���w�V���C�7P����Y@s�z�I��!~W���3gyD��}��ww3��pD>C�*ˤ1^�����ϫe�ly �h�VͰW����ZI��h�]��pr �2�AR��*E)߿�2k=HdT{F�С_�̯,w�<�Pv1ߚ��޲]�����VU�%t��ѓq=���Y7#��O���\��/*�6Ӊ�^O \^K��o}��d>���e'�ĺp�A����?���:i������5�!�������S��9�7T��������=��.��%����NHQ��P�]�������l�O)�4 K�N��n���Q���v�8!]
qe�I*4G{��2u�,�>&k�B�F�Jfʉ)؅X��5�)х��GaS�f�{�U� 9��\�D �]`��;��]��'|�uI<��r��a��`�2��AMr�- q��Q� �'�9�+�����9� s�� f8�<�4�*����o�z��S�j�i�/��:!��L��Xb��X%���
���7��ZU[�-.�ͭlH�3�r�Xdȴ�X-��mj�sg�Ma�{��ʼn6h N���?bu����xM�C��mȜ������mQ��a��з�G��3ɷX��2�"R웞jo!�:-:"Zޟ~��a6�u<������y�g���h�� �n-P��_/�+T�Wq�^+�
i��g*w�b.-��2j�[�V�H1��蕓�� P�|������P
�D�t��R���ˏ�1��r���VdM�$�t[w얦��J�覊Ά��2'��H�]���d��Mb���Ϙv��+���ǣ�j���UT��;�H�Nt8�˖��d�0t��{�佅-'a�IG۞�:��~�t��d����̱#���l��r5�8Lx��o0�Ee ~�|��8(�f>��b���2�, ��í(��p�z0������s(M7�8�,�L�����Y@��3�U�#Nf�⩧Q�\X��-�Wf.NG���˿4��:` �tV&u���� �W2|���he���9�0�-��5}\�*.ۻ�s�*Z�/p��X�i�Y ��CȞ�(À��K�ϳ"=��nQ��w!J |[�е�O���9��iW����M�W�8n�u���V!�S ��E���'A� q��W" ���w�)ٖp�{wb@��k���_І����O.��_�|��J���Ǧy��aeٽ��q�.�f)�[<�wU7���C�m��F�'�N����7�5�Ǎ' 粻B������r�pͬZ<�.�8z��H�zȟ^�%�'p@X���� 5uN���-:�Z\i�@�����/����V��)����$�0���9� W�� 59*J~��f�L&�p�еt��f��Ö���q�WO|����A͂m�3quw�u�n���5�� ����eM:�Z��Mh� �� �N�$��OF��K����������x�{���$ ��v6��Yה�vܫ��[<N{��m5�Z�����͖R4���R��xe�bXh׏� `7Ԥ��0�M������;���u$-���y=L�U8�Gڹd�=C�Ӈ03]�I�^�Y�������_�kL�j�Ã5�N�����[*��Ϲ�B��L�w�-ts���������6�����x.���-b:�k'��1O�c� �&���"� n2m&F�E�1��y˿�T��:'.����d}��(���Ÿ��۶$�np�{o����K��E5��uwg��?f���VP#^�\L;�+�} Dƞ(�"� ��i
;'�p D�����x��1~�����q�clw�s��E7���� l�r{ǣ�)<8���Kf�e`хP���i�ZG�抲Z�<p2Yӌ��Œ�������&����=eIx3����#�z�W|��Z��C(�e b�
3 ��D�`:�MT'���9��3��4�����̃��%w���\?Ө#R�[ָ��Lj� ��ϸ��X����1�R�B\ `��j] �1F��]� ��M�j0F���M��|�PK]�:0��P�l�+(���j����E�$��{X��S�2L�w�����e��6�6�%̪1�͋w�M�nӼ{H���ȣR ⍷�DIkv�I,C8e�U�n��;��|��R�D�/:o�e�r��8��0���[�wp�۟y�g���v$;��"5A��5�á�0���V�����ې�^�
�}b롟��jj{��a��R�C1�}�NA�w.�_�{��x�����-�ڄ0ݙ` ���6�X�h���A � �����[O����HԆ�-<�u�)��0�|W:���G�O��b�P]oá����Y��W ѐ����匾dɌݱg��!n�2AX���h���`��^�E��VӬ��8�|��98i�,6�=�ST�WY׸o�l�9S
!�8��3��p��E�]�?�T�����j���Xr��4�3�$��rH�(>�s�?F�:CI��s�uޢ��}a�j'����qA���8P�t���W �v����L�&P;����6n�do��,�j
� ��Q��Ќ�T�>C�k4p@��¤�E&5��L�� 4 �j��2��T���$�Oa
��"6P�H/n�伡v�9X'���0gĦ��,��E@�X�-�Yb[g,��t�΀����w�3���E������u:g�$XM R��Jϼ^0Y��g�gs��`TK*�!�6R&�-���y T���{vd���`c�-𱹮���5�EϮ�رA%��b?/YF�ܝ� ���h]��i��%�\�-��1�|��tؙ�š�6� �@nU^�.�ႁ��4� +jx�~��_ �2hc�H !r���kf.�
ꂭ-��������ؽ���N��p�kV׼��2Ɲ79~0ќ����M����&�53��˧!LJJ���}Pc�\���ֽ�} �$�~酨�0��V�"밧ar����K]�>�.0Jy�!��53�3��%���&�
�6'3��N�"�+��D 9V��8k
*ǃ�}��&L P�2x��۠f��L�v�C*/}�NCMr�U�����x&c��@�>��DMk�L��á̷�ߏ����1����Bd|��J9���iq!۪�M��E�K� gZ�z'�����"ݾI��2�)���{�փ9���N����r�*p^�7:��:b�� �)"�DB/� ��륡[�P9�w,�� �;'sQ����;��N�/� D;����>xO�sH���Z���}%~S���Yf)����bus� �:'��p~WS��{�Y���.ivn�����]��d��}C7[�8ŭ�5d3ٖ�"��6‘���LJ*Z����Ewp��%W���_�r�%�M�nq+j��z��n�5;��Owz8 ���4V���y�0�F��8l[k��6� �O%~��n���ā��(eu�q�����*������i Mv���r`�/���(���-�G?�Uf�e��8�M��v����͠2��i%/F+�uTz���C���εC�iE<�M���T�j�q�S�F��Su��<J�9fL�� u�1�`�.&u��zՙ����_�n����N$�����o���R'KS�V�B0S�l� z/���΄�%;���-�&P��� btS���z}�6%١-���]Q}��b�B��M���4�h ��,{U��� #g�y��r���E=%<�}?g쳲K�Ma�G���7�Q�dْ�X��z��MK�sqEƦ�v�y@���T �u��4�O����L��%�<3�l�[T�'�n�*aU��`���u�gn��c8�Ja��s�1���@��:�&r�2�(�j�����zt#x'���Rg-�S�?u ���ٰ���f�\�
��N���F�}m�~t��B��ך�]K�K���Q��Z��up
o*"4���"�A ��/���k6<�L?����ua�?��k��Gל0M-��LHƐ0ޒ��S����y���v� �����{�ښU7q?��:�N�I��r,]� �z0���G���6i.ٓ��?jh^�W�9 |I����сV��I�ʉ5�6������gY8 <�p!⤂��l�ʃ��+�%�"%��V]/D�� �u�})O6�f��UKBQ�g�2��AU�5M���h�����;��yiR-ɖ ���;���p���t�Y�1^���fu�߰�&��j,�n�V� j �����������W�=K���҈���ؔ��v?�m�]4W�O��c�*����oE����xI,'/|����n�9���϶M0,���f����~����PvҜ��4�����`����/2���K̮�:��;$r��Ѡ�"T���Uٟ��_t5�7'�~#��ᐁ� ��v(��}Q��^}Y%��<!�ۃY��4��&�//�C��E�?_`]x8E|k ;�˧Z8j}qZ����x�<�����.�g_�9$�hZ��r�ƅ���fn�GoiM9A.b���X@9�H�z��\��a��:�O�����3�a�%�8=1���*��?_5@�J�b],�^`��&jI\۱��Q�"3�3x��0��pu�����+�j�>�������v ��#?�y4w�U�ac��K�Y�F!�46�UD�,��K�A �!*x(�U���O `�v� ��c<�7����9i��_^7��\�e���κ"�jt�5�S��6Nr�`g��?����)���"�o ��6�ɇT�6=c�$sNz��$�7Sc��91 �G���F-d�w,q�ʫC@�X���4hȠX� g֑�)��1}���S�)c�jQ��}_��O��o���3�Scm���.���z=|v���૝e��0m�܈�`E�����&a�,��i����q.����տd��eP�~W��3�D������O�����QV����7h���.hERH���Z�d�V���X����;�WA�C��N`MU�<p��m���Vu
����8 <�=�p��3�
)��s��b��?�Za����>�`!Ղ*A�u�|G���m/�Ps����pӊw��:�_;���S�������Cׅ��H�*��eJZ[� ��Ь]��h�Vl.!ep���F� b�1���c�5E�پ�};�ΐK��\����KK��6�5OwYK@��`��|`����fﯠ�W�oi���YDn���%jc���'r��N�k�^��j�M�,uG�>������=��� ����u�O�w�e�Q�&L=s�(�~�͹
��7͐scMd }��PHM[�Rdžd�=U!���7�(�3Q8�� _<��;�j�K�Sm�=Ȼ(�K�b���RN��>1�OU|oQaJ�_2zj���[<�zӺ�'���֐NF@������灘rq5�ӂ�mۘ&?L��V���]�o���L 륀p)h$�Ǹm��=��J�� *�<������I)ѰǰA/�7��n������X
Wl n�{�\/�lwc}�p!�?�����*'�_ �J��lS�3 v ��Z�� ހ7C�*pf�̹2C�i��~��9��.�Eے �=���.��Y��NW��ߓ�1E��)T�GFx�\ b�+�l�� �p�L<�v/Λf1�[�ݎ`� �\fhq�=�Z$}�D�0Y= (�~�U�l!BǪKj+�z`�eT�� ���c�Ʒ��3��]6͸!��̓�zWB�ҿ����of.�+^��p����{f��vy'u�sk�ܻ�~P�����*�o�\ӛ���'n����l'6Q�ٰ����?�GưO>3S� �p��#x]5�7�j '��r�d�5�C���A�W@�m��)�;;����~{�M�?�8�T����Q�x�=yS$��mG�K�VO�S�RY��Xq�f��G�To?i�pƚ����}����� �M�w~�E4�c;Ju�K9����D���Vs�`���?���P�l�dSd'v`��L6gVtN 1��(��@"lu�����y��Au���檀�ښ���T�����r��Ƙ ��X���^����=IbG.E��e
�Tߚq��M�&���_5���޲�®8+�_r}TD_�)M4�K•�!��%��5��SNWr��B�؜�������nNM�2 7����V�����đ�D-r�e����N���9���+��\��U~ ��C�n<�N���ܥ�������;%��1���ys��<�{P���>�r��+���O±�U#J��T�m�W��xU,����� f��ҫ�݀4,����tХ)?F�FƑ���R��y�J�:[p�8w�;�4�t���r�V=Z _��N�M�1��"��<�6��V�ͩ����ʼnC���)�5��W�Yfpɘ�M�>zd���N�C��8@�Y��p��J`x��L�PV}���;�Wk���L ��쀖�8q������$v ��-M2׉�+�;{v¥�{@��pMW���F���[�ǣhdL���1�����R�(ȇ��U��i>�\W����M��ɺ�h�v�fW�y�g�P�|�Gl�w���J$�ˢ;�}����4u2��(��s�v*�`.N�����{��������r_8�+f�:=)+��I�5�4���!g�x �WgᚽS�c.\� �~/ctm�n�D7��9�ӳ*�ao��������y�-�텐7Q��j��z�,�n�4o�!�}vv�'�d�v���4�-�����Z9k��`⌯J��� ��S��BP pP~����W��B�a�(lM��>M��R\�7�p̷�������9P��Iȋh����_�~q��S�?��+���uD+O`gB�����};�{B�ia#�!�(��4"����Er�+ 2�+��,b'��ӡ]1]V�1&��g��Vu�+�_�Y��:O�6%�]�����Y]vi����l�
�6���}zJ�3*�ͫ`l�T�� ͭ���8�4w'c��!��{�U hةS����1d!*��!:�vͶꟓ��9ᤒ�T� ��_�M��9k�$6�������%���.Ϧv_��K)���ѱw�M-ݧI%�̓�{��K��[�j�����( ���d�Ec�V�Y����O�J�q�l�iE��Έ�w�߬����R+�P`u�IH?TI�i��!�ә���j'_�GS1�gOq�K� _Ґ[�\Y*>Ȱ*_�� ����TBd
|�J����pZ7*����!3����-�fK,������V��H���!�!�ҁ�����<`��lOSx^����j�4l)2H�y�* ���2�7N_b�e����E���>�,��Jf�q�W ���=:᫕����Z�6$�U�D���x��DӺQ����h�x��<?�m ��5h�����!�*1#�8$���aC%��~�,��9x4N���,9l�-K��kny9�g�����m���x���O�˄�������}��?^ ��� �$_���|A��*�'��S�("��D��(��D�U_���v�g�ƺ�����M��28���Yf&OO��^��?A��\� �Շ��f��AkvZ�6I��iٿ��6�NL�@�����Z��{^�b�1�rc"��-7̔y �tt� ue��-V;Xl�~cs�<��M�q{$p ��US�f��qRP(�ͼ.���� �۟P���;^r6���F��]ŕ1��d���6I�� �V��j��Ȃ[ۙל���s�q̉�K$����e��a�\i���Ȇ1 h>V�"�U���?> &�rd�Cg��P0��
����P�P*�iK�&���_C:�<����S����ecH�fB�T|l���6�sE��!sC�k�۾ϱ hvΔ��^L��[��g����Xu�)�M�n���L���r]�׌�1Zo�D�O�`1��[e�B܃~�9>�Y�|Z��y����i$%U��F *[=�rm�/l\�ow)���<`�풳��A�#m-V���j�5�T&�53�����͌1�K~c�e�c�յ����K��A�ۍ���pF�sT^Z]B��� �>����^C}�a�:��WӦ��/���`��>��~�@�s��yZ�}L��:b�X�C5�>���3܏����j��]`��J��Z�|��>���p"^fꬴ��O��U#�V0q�x�i_A7�S�
F�E<7]\?޷8�ʀ��ي���W$,W��F�SnS�Y=�k�ݯ�R5ȣ�aoz� ����S��(��{��I�ZGl�x ���lY�8��)b�bV���a5��z�,]�ޏ[y T�VT�>^���Sn��4e��7�
�ce ��u\T!���^`h|���p��3嶁ㅯ�^�_�+��^Ֆ�?`ҩ�>����#��c�Җ��h�����՟�YO�T\[�V��R�.7r�xk<�2t����e!:^��կ���x��d� �P??]�� �6�DǬ��-Mx�! ��C
�C���GL�6�Ȧ�o�d����ͻ5�=o�m���p���}�y�A���?�"�\B��|l�3a@���s5�q�s��Tv԰w��n R�m�C���Q"�iC��=������:�q��3�;%��=�@
���]h2h��tr&�����r�~�rC�jV��P�z�s���"k��n�l��I��m�A+(R��5y`��8�@�6M��)�a����(���P}d�[���G�z��9������0LB�4!}�C����\Nя�kz����F���z�V�[��Y3]݅[\} 66��lj�_�׋� �r>���k����E|��W���t�^�v��5h��{�Z>.w����}��f�O?o�1���~���`��n��x�4�0�̜A�gDͰ�v��U��x��s�1r�RRo�,�N���68~��J����"[��\�h�F<�*�!֏X�{����.?�D�Qm���c���r�ӯ`s�5�屮��T�>_1����&�5x�s�0ͧ����T��J�/*=᧋�M�w�n��2��� +�j9�wϸ�O�s������1�u�A� �[�e��nx�%X:aT�X������9������Yо=� ����5$�2]� ��YfP�@����`SY��~��Yf.\k@�y@�� ]��C:��4�~�+J��]���Z4��vf��� �x�uT��p�ZwW�ۃ�Gu]���J7:zá���^Γ��]=L�}$�uq���wX�Y�&Nϔ����3;�.3��ض�S�fr�-ʾ[��Zz,ɝ�:�c���!{���;� G|�?�� kϼCx�;��3٩�`�Z湑k�Y�}���I����%��\�1W�;*>B�V��j��r���xӺ#ֈR�Wh�~��}�(:�D�����W�?��Մ�e���C �'(Я��\cr�\4Rzy?�����)��s2�`a���p�w���r��
��ÌWt .6]��aa)�8V��a3��v���~n7|��ڔ�"6�j�)��>Dld������+Վ��5E��L��Y��z �ZgA6]Q�+'�'o��f��芇I�����4����V�-2�8�"��|3�N;W�w@_ۧg����i��bW�¶��V��0㥼�����L�p��*�Yh����;��\���F������eR��6?Ov~�g�����_wu��.x̩9T�钑` s�gl��Ӓ$����o��3g@���MTv�!<>�)=A��D��˳��t��*��KN;{λ�S�)�\U�(Wl=����+�~��L�r�4;o2�Cm�/�_�;K�R�S%�j�*Nkϴ�:e��.���ZV � Uoe*����H����o3���e���)��o^+��������D��s)��O9����[��9eZQ�;���������mpk�`�f������H�z=��<����5+K�B�<���>�ў#~��?h]"4�f����4E%Ox7\� �֜a}u����bm����Wq#����c\# X6�� 4ή�7��JT �L�Q���X��|�&>�[��^�0�N��wh)e��N!I��
v �q�U�����̭h���g��ȕeS��B�
�%�V���Jբ8��+)��-��Y�v� �� ++��M�Rns Le��s�7�3xH_p���z��*,X��<���s�mIR_ D�m�VO��ݾ�������N�_c:J����B(�W�L
୰�*D�t�$޴R �����g�6��� �z��}�N����+�Љ7q�ɱ���w�t$p3��5kr���/����ĥ�T�O.��f����ㆬ�m�[��j���p%�E�w��,�$)b�U~��p���|'���D�_��* ]��n��o�[�h)�P��M�����"�Ym"�6z-�� ����xлxAvH�b�
$�U^��)���9��:�?Z��\%�tq�dsx= ���;�\�(�\�`a�:����~���@�x����|1�*R��U��>jju@���}����ʕ�kB�߳��W'1���1��߽8��'�.�� �m���{ �D%� w����s�G������k�b�
hv%���T������vJ��Zd�DŽ�k-��)�&ɮ�:a=��7��@�n]�Na�C�0O�Y��Y
��z�]"8C���U���8v����j�!k壄8�����|Ѿͤ�)����=�u��ߙ16���Óp*� V��{��A<���8� !��� z���ޡY���7���G����a�w!�J�M�L|����m�<C�x�M�׌ɶ�#���C����w ��G��<��3 �����[߭&�!�Q��S}̉�[�GE��(�iƚ� =n$���d&�0��-a!X��;C
\�0v��0�6�� r3�g�JtD�@�(kYScvK�G0� ���!�V?J=�7���� ��~׫�"P�P Q{�5w�����p�٬�����\~��f+'!ry���{%��؍��\�9b��?a�,����uG14@.݀����� �݃��� � �">QkXT�@���z�T� ����6P��m>,Jh {Cm����� 6 <�>0d�XF�'y��ŞQ���Y�*�إ�!�~ �����s����\ C66�ܠ�.t'C)*�!#k�}��2i�m�}�i��D�J6�;~ٻ
�h� �"F���:p��T}[�� kh�6~3x��ա�Z���V�{�I`?�׽�0�Wo' �k.��T�4���U�b�|ߒN��f��_�J͗2�G�EL�x�DU��AZo���7D� =�&&w�O|H���[K�^��h+�x����m�0�|e
�:�u��(�2:߃�h����d��!���� @g���%k�ҟNRօ0�A�‘�5�I8��[?_�p�i!�oI
O���<��Q�i������eE��<����ނ�� E[�$j��{����N����q�V��*� ��b���+ �㩩L�΅B��>(WW ���7%嚬��TA-����n��j����)��H������K�h9�£xϥ� '�z ����{=t3겳��1����?�����<� ��r�]\5s� �-}D����)PFth�u�(ʁ��� ����"����3-����vѦ�֗kI `��tu��?�e��z�#����*�+ yG'p
�6�XX����P�&�R����Ú�WdNE����N(E���}�%�"�W�x���e��c,vυ �;��$��л�m{�j���­����E��GG0>V?g�l%-�BQ���ə�����$ ��> �k|��}�-��7QO�?D�K�r� ~l�͙�7�iu4�1��W��U�z�sܫ��
�9�3'axE}�{�M� ����>�D�_q�R��A�ɞ!�{���r�&���2�$�-]����1�^A��2l�^���{���2��B�D�G;c�,��k�bڛؘ�hMF>�-� G��_=�%tD�W�; �ޡgo:�R�b�H�fRu՚�b�=�=�"���Ƞ�2p���!�&\Ec6,�RK� 7 �1/Q3�FH�-�^��i�Hu���3 l���Te[�3AE�%V�E�M���Hv�m�>G� OB\67m���g��jn ��
[� BVW֌�-�g{ϦV��C,��� j�*�ƿ9[c��B��a虎27g!r�׵�2�,��H�\�u�# �����.SEDž6�z�~z)}¦��R�Z�G��&��D% 'A�ۜ��9��q}���ߖ=��zn'-%;=��
!]&�0�#�b�8z�*�;����� Y�����¸ۏ�u�����_V���d\ ���c�݃� /|=]��k :MP�[a�d8aBו�76z����k/���¦C�Q�|� 2ÑSB�=��������;�O#�.01���")��H���������t���{.�������?�e���LβfM�S=�'�6��) �!�R�E)�H�V�}tM�����5TE��k����ƧZs����:��/|�ɀ���Ӊ�:#�3�s��ݎA��.Ƽ�����y�_fn���%㜹�q���)�.�KW'�rg"�N��"��xoh`U2K��R����Lj���lU�)�PYմ0ȉ��/��m���9�ZcUڢ�͗�#�UEh�տG70������Pg���L�PK�!�;9-D���f��:X� 釵��a%�y�XHn���Ђ�;�`�,��J����|r��ւb��1�Ygp��,�3S�ĕò�Ta��t��IF8��(P͍����C\������c��g)�eR����k�����M�8��V�M��# ��l�ʠ<gx��N����c9c���֖U!� ����Es�8n�3�q ��j%f�`���{!�͈~�GsE e��-�aH�/w��A�?�t�#�(<���uۆ���s+>@�焾���˔�>O8��"�'rF�"`ڋthpN?��# � �M����v� -]��&��6����1eڳ���z7%��x��{dZ&�p�(����H�ƹ��q��u���4u{�<���9n��ꩭw0��&�������5�4u��V�X]�c��`��J`�g��:a!� ��9�!���(9��3�ic:{�� ���YB�{�pa:)�s��0靷gr!J/�ՈH�iV����K���7r�<�C�~���ƞ3 ���2�y���,�$�l����N�BS�_��ٍ�'�}%����[��-�T2��5��cݶP����p�%�H#�f-�n�Kg>;�Qcͣ�k���/p����N�6m��|�`����8�KS�%b�@�q�{s7[ƨ�K0�}
����ܥ��eJ$��D��s�u�R2�M�k�(�p��|�o��C��ܺ��`����Z��%���ah�p��.�����B�L5��d��E�|���:�d�w��Kf"-�O�">ݮ�4��*l�?9;��O�%�Ї:j�1�*�""���x����q�Oe҅X�O�L*�M��\�s���/&�z��)+^* y:o�"vVw5grX������1��sZ
f�pG���)��bM���a��24 V ��B]/�y#�| hN�y�,��M�z�}���tBʡG]:ӆV#�8MԤ$��@�H��+��2e�=J�-W��z�3`�נg�-ҫr#�<6�L�� 3b�FDŽϊZ��M�0�S-�Q2��� w
��בԷ ��&E��� ���
-m����
]�i� `���[,a:7~s��ς��`p�;f*�q#�� �{��X��7�(���BO�9��&��L))�3��1{4�ΰ ]���jv�����S较�%��Gg��{D��č�Y���0j�ޚ%�S\���2,)=�3dȮe�o��g.��&��Fd'Y�GZK�Q~��8X?����5,p�\�:u��98�T��c�>ь�8�Vn�܍�K�������$*>��}Ch`3ս~�˼��7��޼�$�Z,�J4��>׬��k�Շ�<�F�w�s�\�k�{�����X&/B�[��?V���r��nʿ��.�7���^0Wz�"�q|��;�8��j�e��k�#{������t1�j�]M�����)��0��c9�X
��N૛[�ȳ���j^tA�v����^SȞ������ʁ��au��aœSiO��M+�X:�{��b�c��4խ y�\�`�=��C��f�< Q�K6a��F ��)�\.��_9� �%���vK)�fqy����Y���~��:�M':�;l���
O���~38�L���� ����� J���e��ݔ2� � ��F�;Bȗ�}�U[��}�5oo��w���FL�0�ρ��-���������C
�z��*�`_7�� ��֦ة"T� �PڼKt[�l��|\���\���1�BW��Wn�5톛�����d�2j�p�z�N[�JZ�14m̅[x�-�ڪ���.�3�U���:��@������5�c�z�՘�gD��V3��+����8��s�P�7�?�ze^����j��3Q��=��D�
/t�c�E�G.7����K!jec}����p�v/Բ� ]J�_�hz�m�l ���H����^8��W_�l�uY8X,\Y2՝�� ��Vժ�*�MWT3`�k�;��~6�RX7�t�1�����uo"��=*��6E|��M)�oj�wI�=��1�P�5)���k��HL���y쬋-�b����0M=;bwY�/������'܎Ֆ�� ��eX$�k���Y�:}�;���1,���6?O}���EL�|��X� *�F�_ �����]�����@fO���5.��p��N3��D����Bq�\����0�[��VARC�[�#�{qS��h��;���ʬ�̔�=M�sq�m�y�[1OB�j��~Vݚ�
�e\\��E��7T��6�xi�'+&�Lq�p��⳱�Eev�f9ᜋR{�|����^+\��
З[��!~��m6\5���Mb׬l��_�"Z�n5i���m�`����0_�����n�2a`��ʬ杗u�u"W|����_]3���Í��ݖ�D���WD�gvXQ���O�fز17^��Ԧ"����՜�9�5��^)�7<���5��u�gG-h��+�X��zt�J��6'Od���ǐx�c C-Da�����m��2_����1���k��3���t��5&�ޓ�nj�6g����zbw�D�3����Z= X��lc� !���ɒvz���ϴ,D�m���qMk��u�t ��{�`�&�U��j�v��U�<���9>ͣ) �3χf�\q���`!��P⣫+�pm����p�+�����)'e�O��V6�����~7S��ޑ�� �u�-G��>)R*�\����X�Z~:Ր�ȋN` 8:"7��%x���=�@EDz@����O
`3t��<* ����<Q��b@C���yv�N+�q�#~��<�l�1����3��X ������a���<0*� �9C��k`���Hç�BX1G�%�d(�ЄV��B�jer�V���c�dy[�ɮ�U�x�i�uz <�c��f5����9�����ε�$��ZLC�AFl V�@�f`��>��jW�HT!,@�g��RA%�z'r��x��&�7��[<�+zG D�kК����.>��q��ZdpA�y������~Y�}�q�N)�ժv ��W:sؐ�Ej+���Ұ��J��8 ��iW��p�`�O�zDe��q!�� �X<s�<4j���h�(6?f���n:��7Uxo�-���{��!ٱ ���zh>�b�e���+�k_}]�E�u�^�}��5m׹ݩGa��Ŏ����\�kz%O�x��
�G0�*-�?�Z�\䡮c�$\����E�=�i �>;0��K_��hw�j��-�k�9x�W?<�E��.;�v�{���'�`�֎�}���+�au˜�SE�Mk/�w�'A*��톾�?�\᎝`�>ym��x���%�*\ND���}` N���&2��:�*�ǟ�l���g.�[0P� ����j���,8���bX�=��ґ���ȧ�ߵaɺ��ֻ6#B��YX��|�jɐ�d"K���]�if<I'���~��n~�_cQ�˽����;���fD�/\tI����(�������/� e!�#�:���ȈJ/5�B��6kB������t6�B>�9� ��K)��KH�/c8�6�j�&?x��TX�G��Y�Q
�4���ј<�7B� �62ew��@hi����ԛVd�>��R���-�*U�7�y�P=+���WU�G+
1%�lc����H�2�G�l��4��K�� KF�|���d�*��W�{���$��d�����]�K�VOcl�=SY'��/�������}|�� \C�@|/D}&2�
f�u�֧���RT<VT�� u���>SG�^7��\W{�>��:�J��u�M�}�������Й=챒0o+�7WŖ[���8���W����̎(�2�(N0s-��YR�-����y��U3�'I�i�ĸq�o�m�zu�=P�>��T�� (i�ն5(��1�����1��I�g�t���5{ Ģu���*��Q\꺇�'� u���x� f����<� �;}Jpn��� ��h"E���LD/��
�d�V+d�b���ѣc�3���$�cLZV� � ��RfX!��%[;���)*GnR�/���}~g�"P����ʵ��#Ñ�q���6�φ=��"Š�2�߭�i˕�����M9�X��Jsn��Ė�`�Փu͞�Q'��uO����|5�A��i��sp�p;��,=���WY���J� �ӹ���ۙne���M����.�߸��a�}��<��W�+�1�K���E����C�ch�1���-H0����ndCg����O����i\��ݏ2�v]�� ��Ҧ�'��d�u�2�.�F����� $����R���}����hc)@Xܞ�v�q �ur|&y��ֶ� ��ĵI&W]}�Q�A���Z�!�v����f���yl��w�7p��K��>�!�dxo�����m�x�������v �]'ߧ��<·:��ڡ�O����)Rq��qdPE��>�*c�e�Ժ�1AVI�u����� `�Tg����*ʴ�L����2[�Rߚ�5��d'��/WҤ)Ժ�~���9�e7�H[�W����>�:�$�"�:^�#��{J@� <r��,��A�2��g �))���e�ǜ���S��N8�$#�]�׏0֬^���ҐI����b�( Nu���
y�n�(�<x�ͧ�
S�V�=��vR/�Y CD��Q��,��o���,-�����v����h6E��0+�t}XL=^;��^�=m�b��5 R��*���pi��۾R��鋢�����p�|Iᦩ�kd7�d|�i7#Aݚq��T�����'��.���x�ݓ�oX.�2If���x�օ�!-V�ѕ7n��T���5o�`�v���dL����%(;t_�M�������2�!V�2�w��.�#�.�(D�(���,��ċ�MӏM$+6�\(=�I�:��į�|$w�1K�= ���EmEdjk��B"SBt!&6�37w�.T4�ׄ�C���w5��� ��������u�<����0�����:vBѠ4�7����Е%��ډ�Y
6���p$����,��E�5�Z�!9 ��(�C&s9ո�����4o@_/;�/�vfE�6Hi���Ҵu,Q:))��*k�Ǹ���T@��՗��������R�k뵩��;�"���Dh^")��`�2ͱ٫� 6 k��kt����@���'�g߸��ڲ�>� �A�l| ���n��y<%�xC�q����kB���Mq�6�h�[�莡�1�������� �~ ��ڽ��>� ��%O_���IW~�keri�C��T4�©�N��Ja�_��-� ���8����'���Q��sM�$(k�N����ӏ�JY�k�$�Q<;����XLWXW�81=8� u_����>1&#��s������f@��0���p�#]1>��b/��_����=4�F����w�R����II��{�dzȄ�C� 4j�~���<�'U`̈́�� �f0,��P�0���^���*��]�2�Sf �Ѝ����������ڪE@��労����"5����&\j���^x����D���=���=�W������%^�k•��/k
b�[�v�ɢ��x{�� �i�aM�ީu�ѹ��9~uWf� ��:��` mЁ6��!�����֧�� �Z�X4(HW Ĕ��A��āa��u0�t9��,=-�W���І��L�lr�Tf=a���mYN �1��/�1 5"�ٚc�䜔=�c��WX�|*#w�����,E)��E\i6�;rN�q�v�1ѡ�c����|���ؚ�P%�T���߼R!b�m�v�]�����\�{)x[�d�p�����.^U�dJSb��'��A� W��9^ ;�ee��M���n� p�̭aj�bH��v�)Q������T���[u�������Y�1c'nN��>|�K���'7`���D��<]6 �\��V����v��*�C]U�R��f�b/u��ټJ��R���/ 5`-M~�^X��*��E���寗{��,�7E _7,���kR��n�z���c��)���2axmDΥ���1��{IͲ�ʹkPB��"G��pT����h!,�u~�2����v0*�AI�a�q����@���":1�*,��U�|�7=cP���`
�_���y/NW[(�}�/�S!���Ak�r7n,%,u��V�D~0 7LjL�;�;5]���C�L�B$0��z�'�!������>e�⯫Y�?�!��I^���v/x%�U�#�K���>~ߩu�~�s|�|�9s���Q�!:��\�U��`1Ž���=߈�F�x�+W�f�G{7V ���1&5I@J�؏���T���t�@�Q� �2I��@��!�Dv����^v@�uK�����@倆-E�� z�:z���N�]5�br��"�K�ħ-:���ԔXy�X����ޕ�:/���,��@Y=��w���+�o��˘�^�s�}��x#Wî�Ȩ��8��֚�|.�䥾��9m�]��p �&��qu3�l#��H ���j��6�k݆�E#t���c �q6S��&�uK�U1�:�4�[���b.D�߿ ���"�,O�j����}���- p1����Z�-0��c�i�9�� � �����Bl���N�`tI�ʓ0�l�l�nn�,w�ٓ-�46ك
*�3mVy��2���$�r$܇c,���n>{fJ��I��]��N:� ���Bp?(:��6�Ҁ_��������.�i&��/����ʄѕ���ə��95e��
,�*m� )��pʆ��x��} ��7Ż6��<y4�]<��\����l�]��%��KRz�W�ec�5�C��^�mڪ^�]:Ⲋ�l�,���L�XS2�n��PUA �N�;̌�U�~���8����<Ђ�*IqR��IdJRqZ���r_>ۚ�R؃����uy�tb��"�v�GL�� ��D����:0�_Dl����!�4R�w/D��….M��q<٭ZhJ*#��a��}�~�;ި��:~�he3hi�G����ތ��q�L+��6�>�j���9�D5�BnTd�$,,":�&��iҬɜ�І �q�\�x
{�xH�)~���ٲP�2�F��"�Fi|���_>��_�1Υ����!?���`�<��k硁�Y|=2�LRY��У��8'ȯX��N> ��M,�ZuZ����j�t:9������%�s���� �=�+���!�8f&�40{ �=��A���B
��y/@l�pb
���K0�*�j�׏�|��kJ�Yq���lk��R��'�Xs7�+�ۍ�3\; o�R��5�;+ɕ��!N�vͨ���8Jj��Q�,,ޖ���CT?DxB3�i��'�Z]���#Y�i��Zyk�������y%c�����~�K�x(V��1�d��!p�$l��}��; *e;����=�mD!�Y[1!�ر}�(n~��(; �D;��p��+05u��X��``���n��ћ�#�L����Q�l(�.�puF�; ȳ���ũ\#�x|�H��롩�ɤ�|7W#n&2,��!�L�`��Pg�LV8�e@���Aa�\�f~�����ڍTc��{!��`b J2�=*6��MIk/�`)c�yC�&_���
`�g�,����8@�`�i������� $X
�P�XǮ|=���7s�vlW�7���Ǥ�Q�xÞ
k�@���
݊b� �_}X�+�"��dK�Ѧ��7����ƛw�z;�y4�;;���<q i�zD��S����ƶ�����db�����dH��`��K[b��kx`-�9��}����unW�,��'^�ćGT2D3�Q)��Ι,.�� ,F��U[��/���᭄��5��ni�6(��j�S�O�@�5�A��A�6��A[=�]�lx��؍�� �����ݹ �R8��$y�uj��<u|����1�� Hpx$D��VHy+����v�}�rw�-n��y�>y0ݎ�������vV�}�x����y*^�p!g�{P���ㄽL3I��B��`����\9sk�rs֩�ե׏�i��Bk�\�1�[����x����q���z =}����RB�����)�r�nT��� ���� wj�\,���Ø6EJ*�<��O#�[���-��~�.�+����*c �&!��z�,a�BU�rE��B} 6�ͭid�;�b�D��މ�9n�[8x���j�"Q��\���H ����3��,3�
P�:�(���p���Cy=OP e/��6��6�����n�, e���xE]3E,l;��lSOÞmE��{���� �q�ъ�m�9y�*���_2~Æ����e6���R�=*Y�qqeĐ6@�gN�KXl�H��G*�
;����-�،v���G)˩;��86����r���6��qLG ��>�p�p�ˢ����Tam������{��$Yqf��2���<m {���۲�]��/��{����̹��6��U$��{�Oa�כּ 3~�J@�SQ��S��DZ�D'p����6C$_��x�K;��ء�W򫢐3��fy���#B���̫S�Ck�h��8���Q���d풿��U�9�(p���Bt �,9"3�S*�-Dž ��E��������X�I����5ҡt��K.�����Ia1k�c.�R�V��6����{�t�C�B>Ҭ���Z������7տ:,֨ŗt'}��L���-��K����lQ�"��M��s�k-��\h< �e�jTi���؛�5I�RIe� ü�/� ��s�m[��\����v�#'6���fYp�Yؓ�+;Y[bG��C�����u���ʁ��� SM6��{���#:�����ߩ���'�ԡ��J��� �r���p+_c��ь��Q�(���b[E�ʢª��a�J-��/�a�;u��1��@�(\T�r� �c���󃹸�3�b�U&b����:dw��nl9��w�X/�&U�㦺S m�.sv.C�Ü�Oj�We"�}�R��̵��������%�Np揁����P��~Ma?�`a�����6�UI�|�/cr���0�:3�g2�����pRXsR�x��v��=Rح|� ���R���|���]�gq�<5,�?�N6g���������V�R|����g��H�BY[��t"﫺� F�>���ɜ�:V�>:$���P�Kyc�+�QN;|U�sn�{��8�����ź�� �c�4����77d�إt�ͤ���fR�+J��:��%K0B~��8�t�v�G� �/���.��3��T� kֹvH�[�ѫ�ػ�ҳ �9�8������G���੝p>�yfU�U���#vs8ub�I�/\���V(�sI�K�V��j`� q�<�9 `mQ �V�L��be� Cb�ߦX(���̴-�q�/����~މ����q�4}D�D���b5��#�����ePǿ��{�|��7���n F@�y4�`�2�%��I���㍈x^�X���c�Vf������c�X3`���WBv���L#p“�o�әO@|����BH�� ������� ���Uka�z�2WQ�S�����B���3/�{_�5kmk]N[��xɪ�.P��Z����PLJ�pX���
+0������%D%�~�*q?�u4���E}C��KԾ��uJZiC��钷��� UU���I3�����P� �:|:�S$aD��?�Ú�'xsLWw�Q?wiy�m���}��:4���%�ء z��d�׼Y\���wYf��{'����Z�IP"?�xp�[� i�M�ϙ!���ٵ��%q+Ӈ���&�:�k<�MoCs����Os�u��;����� R$�b�P�@�^�O�m��""Ja�;~w��]m'����!G��.�����3�_u//#�:h^�E櫆��B�%��w���s��t������n�ʝ[��N�К��$�qHB���g�rv�C��̅��4L�X<'�ݧt\<o�s@��}��������0I�,XɁVB�.d���7�}�~�ź!�}6�6�Ț{� Q%�88�s+)�C�H�3�����d��t�qA7�����0��ߚXr&q�s⢉ (lD������@{Oᬹ]�.�� ��1����\Z�`eN�j�d���@�)���bN;��~�p���!8v�vBp �j��8�S bb�D���l��Bs���Q���^���{�Z�P��Æ�~�U�H;S�/ڞ���b����
p�_Y��vo`_���<���¯��d��+�_p�������"�aw\1���:�����*t� �Qz��_��5�E�/���T����r��G%`hs� �Xd��4������-m�2�cf��2mU�?��5���ז��Η0 �p�s��L _��jk]� [�h5�T??�閺6��ܤ���h�K��] g�+d^��}x6lR�K4R���V��0+��ݎ/P�-�����‰E�,i�x8�Q�{��/��f�S�:���"ƾ��H޿y|��Y�� oa��N��X� `��ո�j9����L��M8t���
��9\�ϛc'��P���9�/9 �J�B\7�j9��H�n�nDfY���I���r��0=��yLg�)Q�4���`�Ze}�u�\(5��1P�\����E���� ���2�$N�&{�X#�|�m��+��L܁k6��r@�h�%�qDZ�+j>ur�sX�n��'{@DP�=V��t�3���KpᆃZ�h�@;���'�xvS�4V�t2�skzrB���Wx��bP��k��i��@�"oWV
��!?�[�e�R�?m~3?�Ѹ��ox�(����Si���p}M��?c�O��9�u.q��67n�Lb”���7xr�r��|��#ߜ��n� Qj�۠���5iЀѕ{W_��L��{�*����r��1z~M��@(
A�mGz��P|?q%�VTK���C��d�Ku��N�`b.[�r����kC�~����},-!A���X;��{��ѕ�ܺdnF�aՌ�� �VZ�q$t����3f�WK�arN�������I��T������&��`�(g��p E�2
l˾t}���@�⿾��=ޒ$�����5�[�Z�-�ϫ~C ��2��]���d��RÞ��{����ŀ2r�5yv�ɵ�@z�mȓ�C�K@�jP(O�f�.xc ��\!Z��$�W48 ˳@WF�p}{C�����9A�U e���0�<�w ���PyRM�aD�е��8�e�%�#T�]���0jM9y��G�ʺ����}1�@�J$�4�� ����Ki�Y%"������yK���/�Q'#�8qX}|V��֛��?�J`O��� ����%�z�?�/`n�oi�sڗ�9��KJ��W�T���s]�)F�ơTW4������R�i�W{����e�Kם���o�����PU�Z�'�J��"k7e�*�਻��L~�Sڽ7f����w\�ޟU �ey?���%�D�}_��CH�s�5��A�ʝz�W���e���_h2 ���ō�R�9�!Lo΃�����OO;\(C:�Pg��p
����'����=�;]|�5Ԏ{�=4)�eT�{��6:!�����Z�ZA��� �tE5���_W�#[��t�S<6Wi��D���X�w ��̾g�O�xX�*�)����82g� ge�p��y�@��Gb?�Ǧ�=��N�c��b'�@+�����N
�; P��җzD0��}R�i��h(���1���_����`�����H����,����wT �Pן%�e�'Z������4=%�vc��=1��3`�q~l0���<~ Ⱦ�A�-!�SA�}� �]g�E/�oPaĕ�iLus
����Se�[��pJ ��iO1�3<J�רs�4�c�G�Ş�e!A��6ȋ� ��\]�Y�����rѸc$�~7���uz"2>
� *ɗUI��vl�v��u�s^h�l���c�ʚ����֑fT����<x�̓���lh�JD_�
`�EC9'��ܠ~��"j����A,5'�@M���9��Ew�`�6�M��m���Q�m��`\'&�M��d�ٸ�d3tn=����:��5�xz��M35 k*�c[@�*�j�/�<��'�9���jA%�d�9E����șj�T��-��HLTێ3-A��*� ��6q��wTv�b�_!�A�x���f���/��\���G��ʌ��x�s���9􅧌D�%�F���X֪��E�g�p��W���M�x�J5���_�uo,�;����h��E�7ӫ�l@OV\N� c����n�_Ǚ��p���=�'[�c��h����<n�4H�����nA~?��*���}�����C�@} �H'��uJ���p��E��t뾭��#�~��*,W�$@�U���
6��.5��+?�8#��e�8�Lga�3� ��1��@?i��m7�<[��kbJ�_�u>����{8S.1h~�X�K�L��B!B�~�$ `n�ef�6���|��s��`h��\���Y��.���L�����Pߟ����/ǧ�y���+Ŧ���a����K�4v���/ip�?���z���b��Ou4b����m&���.��8'��:\����� ~�Z6
4����yb��=�D�$�`@�vBT����J+\+> ۃ�6�_�� �sz��� ��&U�|��,�c�$��j���g��ܒ�`��%\��o� *�"����0�5��\��&�g�T6-h���b�ن|,9�]�*������`b�cIC�E0��Y�4y��*�,���#J\��N���l�l�~[��t�q���@:Hq��6W��?�ٞb�} E[�a�A݅�*�EuFĈ���%�������D7�Կ��>
�0��p�d�p�j��v�K�� "���;��G}��]b/�͸��@�<[ۨ�����f�
��2h�]�%���iHG��?���S�2�Ea5�=�&�a6�lb�5���tV �S �-�K��%���ܹ��؋����a��vr�nF;��~��7l��LBT���3�'�hg�@.���2�ܶ�x�{�}���T\�hG9�<�sF��m�w�Oa@!�E�M2�]���)Ag����Sxf��|�I��J��t&��b�g�p�M�o�[ ��o}�=KG��7�
j�1wb�np�k^��qF��
�}�4�6��UX�a�!��-o���r����\\�0czh�돣��M��-W>$�3����C��{��`k��n��O���M���)?H���� �ۢX?���A��ɝB'n�oP,�������l�b ��(p�2D�E���`\�DL��?��q8��P#8z@��30�[��Ƕ��A@ �B��S�О�C ?�Г�<�@���'s
���t������I ��CL ���  ��Q$�p�<�+��
��j�<����=�[�o�<yu�y������ޣ��:O�����;n Gd����h3�a�Ʒ�|�W3c�+q��^B=IEND�B`�
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment