Skip to content

Instantly share code, notes, and snippets.

@kristw
Last active October 17, 2016 23:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kristw/6b96f6ae9b5fafb240efd8f83fdfd865 to your computer and use it in GitHub Desktop.
Save kristw/6b96f6ae9b5fafb240efd8f83fdfd865 to your computer and use it in GitHub Desktop.
Smoother polygon transitions
license: mit

Smooth transitioning US tour in the same vein as this example. Steps:

  1. Compares both shapes and adds evenly-spaced points to whichever polygon has fewer so that both have the same number of points
  2. Picks the winding of the first polygon that minimizes the sum of the squared distances between point pairs

Some possible improvements:

  • Adding additional points to both shapes first such that every segment longer than a certain distance is bisected
  • Tweaking the placement of added points with simulated annealing
  • Using a cost function that factors in self-intersections at the halfway mark in addition to distance traveled
  • Try reversing the order of points too

States are preprojected to appropriate State Plane projections and don't include islands or multipart states (AK, HI, MI).

See also: Jigsaw morphing

forked from veltman's block: Smoother polygon transitions

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<style>
path {
fill: #e3e3e3;
stroke-width: 1px;
stroke: #666;
}
circle {
stroke: none;
fill: #fc0;
}
.added {
fill: #f0f;
}
</style>
</head>
<body>
<svg width="960" height="500"></svg>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.3/d3.min.js"></script>
<!--script src="https://cdnjs.cloudflare.com/ajax/libs/topojson/1.6.20/topojson.min.js"></script-->
<script>
var svg = d3.select("svg"),
path = svg.append("path"),
circles = svg.append("g");
d3.json("https://rawgit.com/kristw/gridmap-layout-thailand/master/examples/data/thailand.json", function(err, thailand){
var states = thailand.features.map(function(d){
return d.geometry.coordinates[0];
});
d3.shuffle(states);
draw();
function draw() {
var a = states[0].slice(0),
b = states[1].slice(0);
// Same number of points on each ring
if (a.length < b.length) {
addPoints(a, b.length - a.length);
} else if (b.length < a.length) {
addPoints(b, a.length - b.length);
}
// Pick optimal winding
a = wind(a, b);
path.attr("d", join(a));
// Redraw points
circles.datum(a).call(updateCircles);
// Morph
var t = d3.transition().duration(800);
path.transition(t)
.on("end", function(){
states.push(states.shift());
setTimeout(draw, 100);
})
.attr("d", join(b));
circles.selectAll("circle").data(b)
.transition(t)
.attr("cx",function(d){
return d[0];
})
.attr("cy",function(d){
return d[1];
});
}
});
function updateCircles(sel) {
var circles = sel.selectAll("circle")
.data(function(d){ return d; });
var merged = circles.enter()
.append("circle")
.attr("r", 2)
.merge(circles);
merged.classed("added", function(d){
return d.added;
})
.attr("cx",function(d){
return d[0] * 100;
})
.attr("cy",function(d){
return d[1] * 100;
});
circles.exit().remove();
}
function addPoints(ring, numPoints) {
var desiredLength = ring.length + numPoints,
step = d3.polygonLength(ring) / numPoints;
var i = 0,
cursor = 0,
insertAt = step / 2;
do {
var a = ring[i],
b = ring[(i + 1) % ring.length];
var segment = distanceBetween(a, b);
if (insertAt <= cursor + segment) {
ring.splice(i + 1, 0, pointBetween(a, b, (insertAt - cursor) / segment));
insertAt += step;
continue;
}
cursor += segment;
i++;
} while (ring.length < desiredLength);
}
function pointBetween(a, b, pct) {
var point = [
a[0] + (b[0] - a[0]) * pct,
a[1] + (b[1] - a[1]) * pct
];
point.added = true;
return point;
}
function distanceBetween(a, b) {
return Math.sqrt(Math.pow(a[0] - b[0], 2) + Math.pow(a[1] - b[1], 2));
}
function join(d) {
return "M" + d.join("L") + "Z";
}
function wind(ring, vs) {
var len = ring.length,
min = Infinity,
bestOffset,
sum;
for (var offset = 0, len = ring.length; offset < len; offset++) {
var sum = d3.sum(vs.map(function(p, i){
var distance = distanceBetween(ring[(offset + i) % len], p);
return distance * distance;
}));
if (sum < min) {
min = sum;
bestOffset = offset;
}
}
return ring.slice(bestOffset).concat(ring.slice(0, bestOffset));
}
</script>
�PNG

IHDR��}��^tEXtSoftwareAdobe ImageReadyq�e<g�IDATx��� |SU�����%Iw�([K[�MVeq��
�uP�Ǚq�q������(3>�㮠ψ,.8� ����Z�-(]�6i�$���b[J�nI>����ޛ��%$ߜ�{���v �B 4@�� @hJ�4@�� @S�
�4@���h�
�4@�Д @h�
�4@�� @h�
�4%� @h�
�)@�� @h�M 4@����e"W!�²�b�H�v��GJ�v��Z���y*..���%��1v����?��ODGz�VU��{���"66V�щ�� R#>>�T
te�@о�9"��[�v��-==�'r�Տ��<��ڰ��q�)O�
)UKIZ���>~t�e�D�9E�o���WRR"��͛7�T*)7gff�t�V�֛�����T]ZZ*�j��:�Ǟ��?7��/T}(8�a�@[����sseeeFFƬY�bbb.�N
EL�F۽�N�f~f�u�H�@�6����?:t(33S��={�l����I(��i��Y&�F��誜�r��R?S���ٳg���۶mKOO�rs���;�-�U���G�R��<&�.��qj����!~�������P(:��ꫯz��q��W��1�\��
�W]������n����������@���u��ӳ$..����< @�� ����M?����մ��I��㋋�yD�F4�/��:��ӳ$44422���� @�E��7`��.���KV���q:�pp�~������Çw�&ҺDo^X�J��xt��A4�U[[�e˖.��%Z��
-�^ϼ��t)_}��O~�.��(\�Б
WT��4]Η_~y�Wt��D_�����p���4?G�����hOE�i�����b�ƍ���j���X��������Y^��Fu����� �!: �@�O�ry-na�/"'�2}~��3f���6��'*G�K):�d�9|��ѣG�|�� �߭�� �hg�|os�?+��eff&&&�p���\�^��?i�3GJ�R#�)�� y��oLMM���� <G$<�� �hG.�땷�� 4J�Z��^s�(ڰa���2d����
��V_|�ŨQ�:���S$y�N�ؙ7�l��&z-��:�@���Ç�y��￿[�n
W�;���U^^~����JǤ��Ka:33�`0��e5'>�r�b�5ot��n{7���#l���SW������(�
:�|�ͦM���ޖs�\r��.�'�א�� K;}��U�V����s�=?�D�����\}��XO.�X(�+#�0k�u���ȑ#R�9rd����
pV�����1c233/�m�Uѣ,S�<�79��]��ڴiӖ-[���!iQ�yEZ=�4ͱ��@�����k��w�}���}Oj��ڰ�]�W���^�j���
S�_�������\ g�ȋv�t�e��O��p��R��+���J�Ϣ*�+N�r)=K�
q�u���]�ʌ�Wt#y�4N7��t*{��j_�p�Z�ݟ�sx���@ *[��"�=쎛ؿh�Ҥg}K%D��@G`%B@ ������1�1��u)��5Yɣt�p�N���l�k�G�_*��
g�/x�4.Y�bq Mͥ�Pxxx0�ڰ�'� ?;�d��t�c0�#pU.��y�'�3\Q7k��jj H��j
�_6==��~=z4�;@��%p�{�[7��r�Dmm��fs8�F�ކ�6�=7�0� �tYYY���)))�~���b��� @��gV;W
�R ��h�d����v�֓�t�FEE�����v��n�_h����}�����}322�n�:q�Dz����4���s�F �r��f�B�����[yO-d�f3�tI�йt:��ZT�믿&@h\<�m#??��[n������-�M����˦�[�V�e�v��6��R3�� �:N"��ѣ��l.))�����и���iii����]h���}�~nűũe��g/R6�T8@�I�
W�ʵ����ӓGqL�6�G @�b�L�����V�[j��f9s�q9s�a�����-����^��b��-5�!۷�9�@�S�\XMB;\�on9@v��YЭt��.���T&KzŊh����s��`x
���m��&�!�Pq�e�y��O�<��m�Z���w�o�n���W�K����vc3�C�ڃv�0K��h��J������y�����OAAArr2��� �k׮������PN3*"_�׿�Ԩ��K8�{����vo� �X,�O�������.)|K�o4nD܍����o���_{���3/��T��m4
>�5�����N����FO�l~�P�Ӌ�޶�HOO߲e hW
��M�[o�%�� :�Rt
�p�F�[n�fnoo�o'�Ԗ���^Ө-����W�:Q8Y8������ã��e?,rS�f���2�����\O�X+7�-#�l�s�&����'��yY�c�_��Kɸ�����o~���A���|��g�}�g
�~�L���=�u�,a�.h9�F�ʗ555eee���;�D��+�l9L�������P?Z�6���y�4g����� K�=b�g���� U�!1B$&&6=,Ğ-*���Ne�@����}����vŒ%w>��w�uW\\\tt������4���t��A�T�V�����;��F�x�]��y��Ƚ�2)�G���j���*��oyV�F����u|��g����=���.�e�Q����kUSjT{B����o��s&��������O?}�����z�������GI��W\q�*j�F����� _T����1�z�T훰���#L�
�4J9[K���������F���q&�%������/o��VJ!�����w��˧����/^����z�ꗟ��P��P���O�q�F��R�Mx��l6s�m�oo����&�i�w���P���by��}�QJ!���IS���R �����{䚾/����+E�����h�;FzF[~�>�����t6J��FEE�ɓ'%�jb?,N=#��"� ���/ ,���{����o��3���a�1QZߪX�y��
�Ѳ��lƽ��P*��\"z�F�ڷa�X|������j�B����E��[T,?\:X�RI��6��-[6~����hJ�e�-2V=.5�4rH��{>�R�@��y�L�k���:��]�4&���&�Fuuuyy��68O��S�kū��*q��锒��M�H-�j�!wxK
)���^�^m��'6S�w��[�N�0����
_՚�5�i!�����������g�u{�si�'bJ� �Ѣ��2��ܭ[7J� Ԛ�&N���Yx�u�ܹs}÷<�D&��[� .�璯Ji�{��1)�yS�7���[�߭I�?��S�J!�~�{�X����߼y�=���3���!�0��-\����1�Bh�P� �=ߠ>����=p�@���Y;Ϣ�#�]�h]:)|_IJ�M���5Jލ�VVV�
)��Fp�D�r���+��a93;E�w|��)��NBCC�ΐ���FW�^��9���g�y�駟�۲̤�ƪ���q�ry;.�d3���B�"�7ӷ
4��db�:�<���Ӯ�^R�]���R��w]m�p�Kި2LLMM�b�����-5jkk���ۥ�Y�c���r���i!�f�D��M����./)�;�E�º����!O��<���5_lp�ľ}���w:8\���[����j��v�m��kR�l���(�/�Y�Q�����c`H��~g�s�l��{����w���}�6�9�K�'��s�\.%�F[�F�nM���=LI�{2��!��hY�j�Zw{��;G�8U����_*�u�]���ٖ�F�`c�~�
�h������T�X0j�U�����ծ?�����r�-�V��l6�mM��g�؄9 �L� �U�Xn (�x���/��rŊR�5j��'��ž/ 3��>����oF��+���9� ��W_}Uz�$C�wJgABŘ�� '� )�E;u����_PP ���_�Mí�ץd�(|L�Z��oyqҤIz�>o�+Jm�������v�����T&�)T�*�!�a|I����ӟVUUm޼�|��f\�ó��B1�u}g�U�Wu������޳�}���Nm�X/7@�ܹs���
��R ��K�����, s�H툈�޽{������4Z�H���R
�@��pg�b+F�cG���������!C�P
=GW4Ls�t���yU���׌8�_�7�&������Z�~�m3F��
j���Վ�q�{ZJ��nl 1�#@dgg?�������mO��8���4\���nŊ<999�֭���ۜ�#j�F���ZNq�້�f7\�\.��394@���ؿbbb� ��D�������vϴ{��P���;�}���^�z���Mw�C������[�<��A����A���?�ɡ$�>�����Ћ��X���3��,��1k֬���СC|���w��|hpU��Tu;k�7Ԇ�������.aj�n�i�
N" YYY��
�r*�kT�F��r���O��Y²:z��;�s��,�����.�X,����t���u�?f�`��WXX�V�
NW4v�����R!ʗ�R����\.J_��w������ȅ~�����V>|�M3� wRp��v��9`��hJ�<��r�Ez�TE�$���HC�{jO�
�n{�|�����V>72e�Zs�P)8��;v�>}:u4U����v�԰�G�|�_�Ng͏ �n����� ������u��(|@Dϡ� @��>}Zz�KHH��f�j�56'�]%�F�T*#��2�^���Q$B�Es��޿�u����Nh�����\�!�h�<�S��Jg��|ϭw�q��f�^W?��A�Y8�ێ;��Ktq�Y�����<1�� � @�?���;v�W�^���������J)@�������e �Y֮]{�L]4���db;@�ظq�1c�z=�~��v���0��l6��͛o��&J4�IvvvZZut��k��q��A�i��UVV�7I᪈�}�Q��!��Q�� Z�@����l�o:RD�{z�ؐ�f���@0��/�۷�{��j��Rڊ�Ye}UjTi�����ҮQ��%_U�����fE~���6W9&���pZw���V�U*�R��W/��~M�^X*�b��
�3��}�]wQ@[fWC�]������l���Z�B��ͯE֯ҝ/DF�p&=�
?SPP��j�zж
k�N�|)5�}_�h����p��),�{���P=�4� �7�a�;}_�����P����&z�#*?�E�T @�k�����
�\���;� ��of�����S"��i��LII��f���������o�ZG�M)�֠��0�3�
EZ���_�+��VR
��L&Ӹq������f�ɂ����~!�[h�p����������dJ�һɦM���.?��feZ�h������J����p�C���� 4(9m�p|-�����gR"��L&SFFu�R]]]~=)7K����+����� ?s��E�t�r�\{��1c�����H�ǏOMMMOO�>}zbbb�G��t����NKK�_��7ij�ׅ��U�ۏ9r�Сnݺedd�z�����D:x�L& ���WI���v^'�Zh }p„ s���h4 @C�ܹs�ĉ� � ���s�Ȇ�So�KD�IY4������S�RQ
��dڶm��h�2���h�eBw3�hF�v��B���{�i�ڑ#GR
6:�*���F5�b
ۺu�-[.���ɓ'w�ޝ���h����}�=�P6F����������>������y� �qG��������l��ɍ�p!Eg
t,��������O �BF7�� @��X���?���H�b��
1��j]C8��S�N�����8J�f�޽*���e��@�BtW���=p�@�A��>����@�ƅٱc��_|�ӟ�T���\�ة�W �a*����\RR���D) H(�1� �.KR�+/@[Z�]�Z&�BT��R"��1�Kc���s�u�Ըz�^y�ѼC��D�c�( @�F�L���S�7f�o{¸��nVm��Y��] 22��D@�cG��t:���� �T,ڟ����M=��m����vy��cq�[K���|J�qN���iii���C�y<��(����F�ƍ�r�JJ�qN&�i��� �j����o���jh4�3�L���ѺIbg�(f04@�Ə�ٳ�W�^��7@��1��y:)�r����FU���"���#YYY����v��ֵ�%4��ʼc7� @�I�f���n��17 �x��1�: �@wE�����������iڴ��y"r����P� @�FcYYYL� ����O���R]C8�"��H��ݛ��?g�Jt)�@w9'N�p:�qqq��S��]Uݮ#�v�6<��# @�<�������U���u�QOw(3E��ƪǥF�V�?��h���d�8q"u�``�Y^���\�����
0��6���B3�*h��������gϞ��A��;��Q����.��g�8Q<ҳI)�~&%�8N��b��L�X�ii��kf5l�/V���D}���Y8����h�N\�l�b��"�}v��Hz�h�ñ��~��Q
xj��IJ�Q��7�)&.h\���촴4��-̙#]F�<Z'T�"��/�,�,�a t��
��P>U��K)jî�7�B��܀_�� ٹs'g@��VJ�������+l�R��Ͼ�999�#�@w���}��
��@i]��}ת�sK�srJ����f�I�c�|PWW7t�Pj�z�����,�o@���W�� U��y�!q�HzF�o*�k��R�1��v����m�F�4.3@@@R:�z�#)D�|��a�
o�޽���лk֬Y��Q1��V���7��L�jz������ʂ�?��G}TSS��2cƌ��޳�P�B�E�4Z��
TNe�S<R��+2��dzm��OZ�ti�3G[�J�2iH�JQ�*].쇩@�FK���8����3�7���ϕ �Sc*�F%���;Y��ݭ4P=���K�111���Un{OW���c��uLl�gr#J%f�x��Y�17�����ɡ�.����vS�εf͚����'R
$F����=-����hV��Բ���a���g2�&O�L ��9�khمg��f{��=#t#={��5��:������=z��`���� =-�8�x i{�j��@w������T��Ǭ�W������+�m�d21�*�2١��!J��6�v{~~~JJ
��@ճg�P��������
lIII�m������KKKm6��h;w�dBx�z�� @�
������W�TR
l=z��<B��6`2��~�@�thkW)\�~4�h��o@���Wu+S9�GY�����) @��%9x�`LL�N��x��
-�P;6*�ʁ}T��?�2/++��7 P�C�x�}~M�����b���Ł4��q������굏���E��Š/��Vz�m
;�{��0��](%�xǏ ����x֬Y3f̘ni�[b�_)N՟D�BՇh\�}9k�&��n�mɉ��8��&L��}ݞ�~�����K���p��T��X։C��SXDLE|6��y7uU�8��p%~���5c�;V�kRz�D��0g��y7uW���,� mGw��Y�H����Ӯ1��J���(@�Fۉ��U4��9�̰�b�0����o*։ ���D54ڌ͡}�q5ݾ�QM�����!��.̩�@P�z����NMM�H��G4��G�Q2A�rj>���P;v�`��k
WE����j�F�۝����ް�Ny4�ڮ]����"j�ӛh�k��on��;V��}1s� ��q��
��R��R�ey�/<��� �O g� A�莓������,��ZZѐ�%J#� @��egg3~�]m��c�9Ϭ����J54�Ѿ}��u��h(�;w��ƕZRRB)4��7 �����R��Ѿ��Ԏ�w��uZ�PQ��-�ײN�_%��lE�����@����zJ ��9�V����㏵������X/�B>@�t�c�$��]��YGit�3�L��
ì{�.T��bkэo��v��o��B%N�����{��tRj��JJJ�v{||<���P6�Dt��ž�^���Z�`A�ܯ~��p']�k�ȑ#�_�ڵ�j�`�����
TÇ�8q�y�N�8�&w���l0\.�SO=��W_��� @�;v0~XϞ=�ϟ��+�lݺ�sݲ��p���6m���zkxx��O>y��I� ����b�^����(���йs���\]�]!�O;�Y��#l&Ͽ��ׯ�J�:r��1b�m����/~��7��"����B�ٲe���f�!=�96zZna�Sq�X��lv�\�'�S�^��!��E�����X��Ğ���:C4�#G�ܾ}�w�}w�WPg���ݾL&���S���.�镗��v�ڗ_~YQ��a���+� �zsj���� c�-�\s����|��={�Pj�s)�n7Uh'uuu���/�|�IJA"���Ʊ�ve�f�wcbYR�<�s�͢��V����²_n��q��������=��2a^- �E��);@�۷o����g̘A) �)�:���E���X��~"f�����M�t͕���u��Dta��'��yx�
W2�E:C8ڑ�d8p u� �T&���z%:��E�rqdr ���<��#!�O��Y]fX�4=K�Rz۟����_^^N��J ��Ν;���j��(�rZ�s�m۶O>����h4!��f��\i}M��3D����n>��S�&�d��a=�%�A�s)��C8�Knn�5kn��vJ�ã�U�{Z� ��G�<y�nj��9s|��ӧ���92,��W�5le�@��#o��vTT����)@���Ϻ'�&L���ŋ�����,uF���� �@�a t{���fB��JK�R������N�3G�菷�3���x���¦�R�C�3~��V1�c��šC��Fcxx8�x�l��o
���gZh�S�bfy��W[}�2���S�����g~�����q��Q��0��]�X���t�=�Rd1�9!Uk�Ck�m�.�iZ�ص�Ȼ�u��G,n�o�z�j���Q�C8��|�9s�ֵ�0^����_�<yr��3+#�p)�M=�J��v��S�N�ի�o�[�p�IT��.C8�����
ELL �45n��ֳ��Y�3k�u�7MOOONNޱf�����k�H�O��E���egg�� ��PfZ��J�6����N�"##'?�p�*���W��Dt�3�L��h�4r����6N���pgw ��ȃ����������ݻS
@WS�{�:$�]�ֿ��G�Ӈ)�����6��
@��1Tkf���f������7��NMt�c�
�_x�������:�Nf�َ9�_�]_tt�UW]����Ł4Q�,Z�1�m)+++--�:�BfGB���,�y�P����h
z�ے�d0`u��c��+�|
�;��]�RSS��/Ԩ������R?��莖��Mz�w��xL�+��~�3���eee1~�w�Guu5uН���H���t'طo_�n�4
���͋
�;�7~J��Z,��;!@3~��h����J(((�^}�z=���ކm�.a�D��0~��m������"o�� @k0��
�L&f��#�c}C�)�e�����n����S
�߱�]�а�c���f���"�p\*N��j�l{�`�cW�jZ���z����j/R6P�\聾T&��
�_e���!��5l2KYt{1�ͧN�JJJ�W�!7��}h�E. �wFyċ:��'O�ض3ev:�Ή�Kb2�����d�v����������(@�n{uuu����߿?��뮻����@�n{���L� <F�1--m͚5� @�1����'~����Ք @���;w��jڴio��u�m&77�w�ޡ�LcLiii���{���mdee1� �q6!@�nK�Ax�!==}��Ք @_�C�����pJlW]u�W_}e�X(@��$���&З�Y.������90�b�Ajj��j��ͥ�L�v���8:S������#N�?��`P[�Yw�n�B�<(z.� @�/D�B��E�� b�s�ֵ
W2�5A0c���Y�jS��� �R�^Q(��A;�8p����J1A�J� �z�K)6����<
� �������v���n��R��ʕ+����9%�����4���K��r�s�4R��F�����(..�����`s������I�%���[١ɢt�(�/ʖ5��f%�
�a�聾H+V�p:��G���`��TRCK%DF� �:Q8�������<|��C�ʋ��J_$��)��}tttlllL��-ݬ�4�|H����4f̘]�vQ@:{&}d�
�ҳUH��rg͝;��w�)((�'\U�h؟0蕛o�yذaz����t���r��޺��w<@(%�8���Z��رc=z����R�?���VUU��R�A�O=��B��KDa�3�N��1��Dll��H�=TT� ������}OL�<9%%�'��b�����o���;u�TJ6����կ~t�y�r�YRz��YT����I�Zc��F5ݩL޽{�֭[CBB�L�r���\�G�@_��6� {R{ZT�?a��k����P��s�U}�Y�E���p�����~��#J���W�74�j?�QOw(3=������zǎ۲e�|0y��I�&��j�T�r�I��lw��҅_��RO�Tʗ
�B�`���a�t�ʾ �l�B����Z��/>����n���<ozN(���:Ҳ�d�j)@7:�G�7�tSuu�֭[}��#FL�2�G�NX��|)���#:@)�6���\.�����t8*�Q��Y;�9\�%�W����>h�IZ��ԓ�ʼm>��l��X,A��+�������=Y���9c~�#����R��������O��re�/=;N���M�
c�/�e�8�'O#�"bR���L��pa�0^�l�n�2tu=��ǷQUU%'l�t)EpoΖHy�Q��^U*�< �����.\�Pz
�_{�@a�/}-�ji ��_^w������L'/���a[�-�1���䦷�*N�R�Ye"#�Nh4.����
�ިm6��ި-hoΖ��}s���-_��� �tDY_�S�����[_R�׸�ia���s�"�a����lS�8����~�c�]��͆,��~��&
�T��rv��V�|X��:$��%z�BO:�s����<��hG6�MӾ��r��
�V��7UK�R�nګ-���¨*@�X�Z�iT9ET�?y��,z-�Z�>:x�V�n/�X|6Q�*z�e
�����^u�}Mު�(]���w��1cF�3��쫤���^��[�N�0��+���G�F������l����.m�˥;�i��o� i�O�3'��e�sw�f^��tYޥ-�"B�Z����V��^y�~׽�x7���5V=�p%�7�����m_�u�mt���-�v�Z�Bq�=3<gj�1������p4��;zD�-7���h4����G�+݉�-6UoP�Ta��t�$$�_b+o��n���,Q�m�UDE���9�̑waM�m۶y��3f�W��nx����}�{ظq�~x��7��86���6�k׮I1��ap� @�X��FgC�k�O���.���JK��m6��n�����J�R�ݡ���3�`-o���^o��n�)k叧���Y�����=��3� ��cù� ��{�������>Rԏ���~��c�I�E�=�����s�d�ʕUUU&L����϶�|j�С����+�}j����MO.T;6ƕ��p%~���OE4T�rQ8�3��9����՞q��ͥW)p��/���k9g7���.o���M���zV����˚�yc�s�ֵ-A�/�˒%K����-[������q��!����_�:8˲t�Ҕ��A��n��_���+��v���'D�"��tf����g:wz�!���T�
��@?S�[�`&Gۈ�����?o��B��RxMM���˗�.�\���]+7B��~��C�V+�xޡ��y�޳-���n[�r��r�9th�He�^��}�0aŠ+�ݷo�}��mذ��T�Ν��?�1666>>޻��[o}����L�J9��e�,o����k�~b8�Zg[���)<�����h�b)
y��Z�^�Z��Z��sb !��s�^}�վ�����W�a�V�544��LJ�Z훰�9��O᪈�}_m��F{�j��.C�Tu��w��]u�C��@��������2`��U���T�>u���~�СQQQAX)@K1��'��~��ׯߘ����+���&�(=�䳍�)�73o�C�Y���)�{シ����4����C��̂�'_3+!!�\��ݴ��n�]�g���@�1PN��l-�m����kkk�aZ��ۛ���V�E��|��-)�pUUUU�{��7 ��f�xy�_�����F]=�R&]6
�����|�94�a�-���ެ0g=�@��s��S�N�{セ��ꫢ��)S�H����
6<����Y��'O���K=԰���
\~����.�^�\.ׂ �.]���ѕ��WRV������L���5�&w-GGG��H镮iԖO�T�m��#�޻��z111��}E�缜���<9��Y�|�Ç�U��v�Ԑ׶�����Mo�P(B��7�7M�-�F�=���O.�R��1�<c�.���<..���q����w��tRRRbb�_~y��Wa}f͚����}���GJ��y�nd+�d̘1����ǟ��'$��[o���/�K��h�}�����Ç322���J�t���g��&{��׊qS�Ѯ��
�(��g�t��[W��t���!�i[���g9�7J�w%��߷���̯�� �����t9p{g\�5]������~��5�P<xpnn��:y��W^ye�СM�v0����هFTx��E���lUV}"�)��xn�ر�-j!@K�����7�L�8��%h������R��4�cס��$��=��k�5���ѹc(�����nߐV#*L���7��K����2�Gy&DoXot)ݕ<�o�������%��
W�ξ:�]Y���tnW��TTT���6�>a„�˗g��1HWg͚�����O�5���"Τ��u"|��߅���NHH��q�+z]s�5���������E���TUU�r���
cRRR'�p���Ґ,
y&���Ɵ�H�0��;Ӣ�^��z3�o�n�EN���j�6��/4�7�����cF�􃅇.8����pۻ�[ؕ՚;Ds'�$�zt�S��O��ZK���Iψ#���p�5�����"'$7nܖ-[ZВ�o���^X�`OT4�^����>�͝Li� \iq����Q(o �M侻�&��ߊ� B��፴.�W/���O���x���}��*�ֺ��iw�P+����q��ey������_�pթyW��U�N��e������/����zK���a���ґ����ٳy������h��"�"�g����9��N����D^tD���cS���8�y���L>lV�BQ_�Ț�hQW��۶^�7껿�&D�q��&��;�bƬ�=�w��S��Oӂ�;��?3�=:;;{Ĉ�nHT�'Lwz����32h�mX�%9��N5�9��N�VY/��~��B]H��,��#�kO�����O;:���h�m9
����r�|�git[�<C��,�U�R��'m�.#""<C�� �w)xN�����=P�č�3�e��*w5�X/�����d�G�E��}�}=��|Q��g���
rW�����#�cZ>}B�,�x�Ӳ Q���14Z����"D�9��OK�Y�k�`0DGG�?9��ܜ���P��;�fQ|�1�RZm6�z�w};z}�)���Ky�B)��
������e����hš�����oV�\��u'w����V��|m�X�]�ξJg��;$�t���W�2eʴi����ˊ�����,4�����'�
��6����s~���߭�jh�v*<S� av�\��111Rn�щ��C��������(,
_�3�}c���m�\�WڢV�}hz.c�9t�J|�����+���'E���t�<��@���w4��,ŏ g��y�nΎ|�!�(����m�[_��w���G>�v(�p ��?.� Ϣ$o�$�'ͽo���n4C�z����_7�R�r�v�pU4 Y���������e�Y����Z�׶|`�f��_\�ڏ�{�1t����B1������x����J&D��g���GGGGDD���`K�-OĎ��1T�<�N;��m�)H���h�'��<�4rYkONN�^UL&�#@mGidz
tUo��?"�-�?����#��)N( ��uɒ%����,�j��S�L����ty�������+�s ��������SSS���+JG�P>�u?!�A����˔��S�TWW��&S�LY�b���zh�� �����K/Q�Nd0�f���k��������N�����/R�N �UUUt��#G��䔔�P=4�������^x�J�)bbb.4@�����>�#@��B��]~�o߾Æ
{���)ENj����=`��8v*�����p@�,%%e�ȑ�=���`F��B�@���8���82dz~$������gԨQ�/�\�S�kh��"�{�fel?,�
Zһwo�d�".R��Okol?,��1��K)f+]�I��~>�PZ'g��)c��оu��IϞ@,�6�qӦM�w�>v��ٹ�+��\�ة�O�������O�<"�B8�8��'L�u�FcӵT�΂��c�m��'� � K�{�]�+��~���P&{�搜���\UU%]:�^��k� �^��/�+**"##���nz,�;��`*�*,,�j�j�Z��(�+Z��^��5�i���MI� ���۷�=�J�@g����'���a�?�t���VWW'����O��빮w�y�������I6�#���9ǯ>t$kƌ>���F��E
�Jg���/a�5u!�L��r
ùn����m�6t�a8?�v�)���ō:>CCC��W��l�u��b\j0���8�ɧ���)�����n߾z�g�G�U �8/�0h��s�uMh��(�����rٲ��n�,�~��<x�f�QF4�j��JA�Dta�jڹ�7:cD�
� ��ũ��eͮ���C s'�Ϻ뮻�|���۷������;v젌h�_�$B4d�Ot�Q���C8�gL��jg�&�x�&��ݻ���>[]]��{�����7�GqPF4�cNer��v�%f!�� �
��E��7'>{+�_"���γgϾ����������4�շo���|��J% ��� �G,>_����O[���y�w��l6�?e0--��_.**Z�b���Rq6�iFq�@����زe uh�-�3gθq�>��3J��W��6���2��
�W�������~��:�7@{�R���i9@K�
6���r[e/P: ���{��Fq��ߋ��U*���j�Z��<]UU�^����Şuw*j ��q��W_}���:p�;M�g��uРA-�ԁ��B*��edd����Ɍ�n��h�U������]/\�?z�.Q��|L�O�Qs����8p���_�U����,����8ƍG1�=����I�h*33s���J������,��>�م�\~v���k�AL�>=555$$�b0k�F.�
+�MII)((�����h��C���O��&�<>_�Sttt��x��n��v���0����=�� 4��8���I�hDk{��e�YNA�a3�4�g���D �s���xDL)F�϶����V�aE4��3�rU��^�:� 2LD�EO�<}=�h����o�ʕ-�M�>}����5Y@����@+\�?J�*tO�����]�� .I�~�z�왕��t�sVFq�"Һ���L韾z�6��#���MW�� �Ѽ�'����>陖;��5sr�
�J���4�(4�����m|�s��%eee���W�/<��_�N��h4���P��i��4��p����9��R���Ue/����ջw��Ǐ��f��V�О��I�|+4���ԏv�t��i)0 ����AÓ���?:�љ�ZzJ$%%Q�K���m����C���v��q�WR-4�˫�V���F��V/4����6�����TaI�N�I��K�:\��9���ou�H^���A�mܸ��V��hO ��_� s.��򤤤��,<�^�g�^�3e&u
NF��ԩS��R)��o,�b^�f���ի�Tꪪ*�E�tyq�Ő2����$\�E��Q��e0�&T*���t�\-#��Vh�?P��O�{�A��aۨ�KE�?(ťS��v����Ȩ���W��Ô�1�i�fsxx8u�V΂����� qd�P�~&5����h�u� ��B� q�u�<-z-�b��h@�p�\6�M��R�
|���0��RIѹ������<Ӫ͡\h�_2���!hYCǸ��TgQ�K�@r�!V��r��6�E��k�ft0s�v�d����<��j�Q��Х�ˊc6��Y��閏�u4��\UUUE��שF+i4�F�X�,���nq*���-w�}��ŋ���لh������������J�H��� ٽ{��Ư{���Q��#@���bia����Jt[�j��'��ޗ����N�����֮J��n�^���]��t���*z�y��у:��Fc��BDh��*e�n����j�����8��h�g“Z�P�Ɂz<�#@���l����!�Y,���mC�Ֆ��{���7Ϛ��2����y|������<��a�@Oz��#�����O.C8�����Y8�\ee%��4�کL�t�
�ؗ�u@
�O~��n77�6�=�q�ϵJ(ZF4�sp!�Q趢V��y��s�����`�G4�Y,z����������6�彴���B�0Ԇ��6��v���x�O�QDϡZh���:�UVV ��6ʖ%)^�RYo/�-��Ϝc�~
�N��n�3�]0c�F�~]��p�0g���lym&q�I�%�e?�ʿ�w7.
��K1��ξj`�=7y�T�6b��օ
�2�GZ�����B�%K�����0�ʔxa�z\᪠A�`���9�/z�8�k�q�>Y�ɡ��Y}"�P�r������Y��Vh�r��}rWQ�`��3��o��%*++��.��5r߳,Bl�c�X,o}V�ݸccf�?�Py��8G;���#��y>I������w޹��k}��<�4}� WD���Y}�g�l*�Z$]n�.���=�:J�e8ǥP��n��x�ׯ?x�`�7~QqU�C �֭�֭��W_MA.��$�'�����v�w�ڱ1��v�]���<b��-
v=7:�+C�<����
�Ç߳guZRz�.'M�����s�N
r���{����zߔ�}7ەgۡC�(����
��38 ��ٽ{�#G�P� w�-�|�����Ŕ�”���ħ�>���Ym�<jQ�jZ�9�|"�vU$@��ȑ#����Ν��'ݧ�`lnkX,���~����=tD㔬̬ �Z3[���%Eꢨ�u���g��F��{�n��S�V(
�����q.���~���O?%�m��|B�W��݋fؗ�#\����Ec)o@� ONN���OI!3�H�v�oمp��9ڈ�������o��檫�z��G�-N�d&�.���j��f��t���
�L��̪���8Y)��9�C�+z@�"W�c�����s8�?���Q�.���M� ���(���y'cV��:�VWW��8~�xPW�Y.N-�4�"1���ߏ3���[��X�V�uh�_�*O<t�����H�kT#�9����Ǐ�馛^{���+Wa<��G=��3���-�qC��[��j��`!@�*Y,
���1�X��6lذ���s�v��-�ټ�<S��������Ь����|TU���35�I&�L*)��1��T��Aa]�� ,b��q�y�wU|\�磏����.)+X���%$�� �@z�I���ޙ!DHuf�����̙��Ι �ߛs� �}ݡN��?�t��[�z��Q�F���r��n"xU��Ƣ�2Oo"@���w����7��ׯ߸q�Z�g<x�����333����<gΜ�� ��j1�Z7�N�)m�oW�^U�!N�VaVv���G��R��4���c���Ĵ��#���� )78p�]�vRn�ҥ�j�X�~�]w�5p�@-4�%�5k� 2���6�TQQѺu�c�ر�
v�
�M���`�Z333���<صk��.^9]ܲeK||����9���B�I{��1b�2�
4��W_��'�m�_�?(���>WWW�s�ɓ'�t��n���]ڱcGPP�ĉ9�������rժU%%%Ç����B�(�(-H�y^���sf�0��)�w�7�;wΝ�۷o� ;�qdןY�V��vE�pD�-JNN��իCBBF��xg��`�f�&���r���n�X����Պ>[����6�Q.l�������֊����?w��M�ܹsRR�oV�P �F$@Z���N��=z����h`��6��
��e�-n6�r��>]*8U� �lk�a�#[W�-��e���Y��z�_�[�#/��ueC�E�Haujvv��C�'�v ���D�]�oJ�!�z��\���C�v���2FM'@Z�][_`��m�&ѥ ����"Zo��A��.�w��#��1�c�K�/��WŦ� �)�aŊ���;j}H�!�K
���Ӽ;Ao�`,��R5[�/����@?��0�O���
������򍛆����R�2���m��%UU���#���8U�4d��\����5���%R���m�?w��z�>%%�}���cBB{���n���F����ǫ����j�c�:�V�x��o���
hьS�?�׊r�� ��15Ξ=�駟��������ծj���
!4"+gX���'N lvy�#�݂V��u�������ң֞i�=��C�^���������_}�UQQQrr�;LK ��y��E���n6-�����{ ,���m6[@���TnM8~�Q�cw��c�ƌss��ݷo߽��{���Q�FQ�R .9�;CD����{V>t�л�;x��>}�4�q%�a�+4S,a��� v�9����Q�������Ǎ��v���
�_�~����Ǐ��}����d�{��J���K���OLL����ӥ�4o޼�s�.^�X�PP��O?��W�^��sOӉ+W���͝8qbX��7�}��щ����z��Z<2�Au�:p^�_��)++�X��s_2���(�*D��+�+��&�2d�?~�7oNHH` ����
~g֬Y�|�I��ۮ����҄�������_m�X���jժ#F��9�+�L�>}ڴiR�޹sg��[�n
I�����"i�S3Í��! ��*G�}d��T�I�%�G�w�ʵRz���/'��4= O��|4������߿m�6��0�4�]n�bYx�U6l�6s�̢�����ۗj�v���k�nɒ%���o��f���0�U�ܺ��-�ʥ9p^~D�A��o&���
3�M̕���]�v��|˥�6}�_�Z��#�
h]F����S\\�tbU�< �ѣG�/Ί�n�q͚5]�vu��\�r�ȑ#����N�5n��4iғO>X�@P��6�
sF�4/jQY�p4�j�4����}�eh�I�x����CE�IXO�`��9�(9SJv+�͛w�С^�gWY5������wl6�V� �_͚5��wߝ={�a���OG�DX겁���������׻͌�?��3lC���R!;;��p�Ȉʾ�jW��Hb���leM��M^���E�)��zINo]�X�lŌ���+�N4�<5�v����b���j����b�9p���h4��JHHx`�qS~�A�v�o���J{�DϞ=�|���d�]bI)Z�.?O�>���2@��ᵄ�E�x
ne���x����j�~����b��|׽��?U:P�D�֭��ӟ�EE&4�z�E��/�j�l,�o�k4���sđ�=�
ä�-[�t����>%�W�e��D��;WWwrk��s B i�Un��7Ǭ��(��V��ƖeӤi�����J�۬�k���� �4G�S��@���^RYʈ~���ŋ��+]�
�%���fͽ&g��������ܠ ����M���LC���K3s�SD�%��æ4+��kB���l�4�
��5�y�D�n<�H�&@�'L��1䤟��X�������z���.�pVD�OKK��,��l�n�7o^w����E����Q���j�� �\ ]�]��q�ҋ�}׹����w��1l�0����8���s��p�\�@�"�@Z���L�Z���DU\������]�JaԻ&�>t����3gΤ}���]}��E�>�`:K�&@pV�Z��_��zh*�<;�� �aI2�iuB�,T��?���߯_���P���TVV���_�p�������jӪ����������:�����W+ ���J�9���j�R}�����C��*��/INWI%D��%˗��0�U|wz@|�Uԡ/������ϟ?/�jubbb�v풒�ڇ�S����qD>}���999'N�����3wR�/<�w�/wV4��EŎ�R���G���"*'���/B���׵Ι)�t����ݠ�
�8�N�5fwb���iL����!!!?X�ݭ���Py���3p��ϣ���r��#�>7���ʃ_�J��r��~��v�-�Sл3��5����¶m�JY9%%E
�QQQ7�9�)��"j]�?v!�$�@Z"奫nvU��Tqq��S��<��[-�a/��ݩO~��|GUTT4��)e�.]��=ZJϷ�u�|��L��E��Na��[�G}4�y���ӧ��j�Ȏ;�������&��#4�l�uW�vl�͇����_W�n �&�����4��'=j�Z)1������?99Y��P�h�0�)Q���R�і�M;v,((�K�.7�zlllQQ��d�&�Ao�`��+��S!�m�`���H�ȋW/�OI���g�ؒ�R__���(%��ݻK��`0P�h�f���ߝ_١C�N�:]~�U��iӦg�y�W���+..�ܹ35y
�����O���h}��]����tdd$��_����_$J_�A"~�������YYYz�ޝ�cbbZ�����+�����7ߨT�|𦷼o߾�{�N�<�C�Y�Ν��'B�m�}�y&��5���!�����DGrh|X^^���"%�;���P#���0�U��2>fli��!�C^���h�n��^~��7�x�V6~!oO�W ��^0�#��cǎ}���J�r�ȑ={����1o�V''�Dg4��������������G�k<c�Z\9ܱ?�8��K�xZ@��G��֯_���:`���ߺ�\dyZ?_��[xZrV����� �Sb�P��r����ƿ���{����Kѹ}����j
h
huL&�q��_���z���fSuJ�ep߱��{<� ]�Ν{K[��h,j�Yբ�h�u����붿� +��Y��5��C%����]߾}���?�L�� @�>0��p[��-�3}[�TY�������/�����'>(/����n:x��l��>�^;�5 EEE���~���3��K��p��]���[�NG�~�M8�ڶm�rssG��~�;+��W��]��N�<+\�2�Z���E��[}G�����>mZH�_��z�}��6(#��O�W�oAII��Z�WҫCD�"a^' �:<��G�72:Z�@Z���@���#;�r�Ծ�l(��(%H�����ß��q�
�(-�~�;�o�.�e���&���j��{R��R�;M�+�֍Z{V�fЕ�>JuZ��q�Z7�\�wnv8}��y���۴isq�&��r�#���E� "@@���0��t��RAc��Foj�X,5���;L��p��Q��ae�B�?y[vR�T�ȟ��wh.SM�td�N3���e��U����ֵ����)Ed�c'���Hs�օ�}|��݃f͚���p�7�&��e��!@�zt]]���֞�.(l7��ɓ'322
&�Q�Kn��u�Wv���mM{
�B��>�k�u_r69>
z�&h��z��.
n�oԎ3��c7���r�����gD�g�>����:���m�/2���/��j׺I�&iE���l���2Au�j�U}
Ջ�d�K�9..n�Сiii���� K��Gt�2��>��f
1S8^��o^��{�fy���ׯ���ہ�Ŧ���˷b�,N�;c �� 4�����+:p��o��D�k���;>���o��N�(����,N���+>��N��� �L�l�ϡP�J�WNՔ��C�����I:�m۰���9���n�Y0���{��gD���6-W�&�ҡ��H���+В�:�S�(zI�ԢB��t�#��T��
q��o��{�L���P�T���O6�}䑯ER�e�'��XT�5"�a�k��_
����W@о�?6��R��O�N�)r��Ps�cv��sܶ��4@=z4:::��,3�p?'ETp��
�m澙L����3Gv��5��A�%��"iY�s����� zfC��k�_!�S��}� Ǘ_~9u����Ͼ����|�tt��� ۓ/�2W7ƪ0)C��^�/�a�X )--�Zt��+���驩�����ώ_&Rs�:��;�}��Ƒ�ؾY�74�5r��={�4�4����9@oݺ��?�����&ӥ��):���@�T��si�̦���w��Ɔ����k�{�ބc�Ν#F��j�� @��ӄ�O�-1����.o�+E�Ƌ����vo��w��f۽{�� 8nA��kt:�/4�8r�H|||D�CͶ=9����p��.��V�j¡r�j�����/��䠅w�4��
�+�۷oꩧ�67���I���"���sg;$�k�v�/t��Y�_m����� 1��^�h@k�����������������{O�)��������Mg���j�W�pH�٣f;-�x�/�±}���'^k��æԫc�t�����t���+�栅wф@�,,,��deeu��122�Z ���2a;��)r�CUK �ZI�>x������f�Q��4�
�V��+o`�\�/���W��Ҫ0�G�\>p��?�W���R)�m��5����y:ۮ3e22?��� @�+�+m�Ί��iRa|!�
1�z��&���ީ��SCu��<��읮�6���B�Z���9P�;h
@{'@����".�^�/�(��

�^��Ц�fo�Kp�c�QY��*��]!��ߺ�W9��VJ����k>˹4Cߋ��&��z�`:�s����i=��E];&�}C�O<q'6�qdG��q�Wm~b��'D�/�k�aS�qh|+@{�h]�}��[���rrrn�6�fs�Kr���x��?��.L��R�3��^��b?�QQQ�RW'N���m�Z�.*))),,T�T����f5ѿ�k�r��82A��W��
��n�K����5MHHHqq���N�<9iҤk/��n5ϕ
�A/V�fHM��RPv�嚚).��ť�� 8P*_Z�.��fC�̑ 4�K������ ��XF����T�n˻�o��,�(2r�O�Q�Z�7u�ha�W�g��`�e��!��uEnLL���۶m���&�刈�k~=i�ߧ��p���g�}v�ԩ���׳pLY���E��y��ֆڥF��(D��|T!j]�8q��
g�r����N�B���n�����
wz�ת[q޺q#R<u��nx�
w^=WWW���{ٕ�G>ʤH� @�2��p�_�/I�)K�8�����K��S�i��[�,���3R�OZ�)����]-* ��}�����~��0�?�K�ҏq
�Z$�@ _�vXK �oʿ�BU��%��R��ׯ�+��v"���Ǿ��'�)94b�un߽���qM�M;��˗�?h�H*���s�j�ҥ;δD?g��k׮5����
���
AAAM�p\����_�J�:::�M�nZ����ۅϝ��^��O1*C�3=��1X��otg�ӧO�\�r������[/u�����mR=t�ܹ�ErrrV�^=gΜ=zp �
@k!eeK��Ұ�P����2`�k���������o\�GgGc�����Yw6�MU㭚����Xn�ҥK}�R��E�H�#Dub�w
nڴ������_W�TE @Њ�����Js�<��ĩ����1c@���E�b�NΆ��o�޸�Y�R<e�͡���;���3|�Rj����E�3���֬Y3r�ȟ��g?hm��� Fػw s��K��Dǭ"5����`������ի4I�I�'&DW��Y�`�si�x�����ۧ�n��| �<����|�����I�h����7�dee�?��&��P �n�z��{D��O+~�j�,))Y�|��Y�RSS=��L����M�}�R���)ңqjI�aӦMcf�����P�6���Z4�@���j���G�����C��7� е�g�m��6(��={�<���AAA��&�mN U�/wWw���S~D��1c�Ț�n�c��AkF�&
�2wyO��K3�}�[��|Y?�
g��!'ˍ7>��s?H�n�d�H�͊Z�
�BD/�AkF@�W��8�K���k�Էo�)Å(���$��W3y�zJT~���� ݞ����T�~X��/�EW��=hР�YW�r?>�����/��U1��N����}US�4>�wU��U[CA��s����V�%�
4�� Hi,�D�}�+��^|�����o^�d�&��r�Z*h�
h�������߈��׻V��+�E��G�ܮ�h�p���ǚ����ο��@������'4��
�4@�� @h�
�44@�� @hh�
�4@��� @h�
��4@�� @ @h�
�4@�@�� @h�
�4@����`"z��eE-�IEND�B`�
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment