Make tuple deformation faster

Started by David Rowleyover 1 year ago41 messages
#1David Rowley
dgrowleyml@gmail.com
6 attachment(s)

Currently, TupleDescData contains the descriptor's attributes in a
variable length array of FormData_pg_attribute allocated within the
same allocation as the TupleDescData. According to my IDE,
sizeof(FormData_pg_attribute) == 104 bytes. It's that large mainly due
to attname being 64 bytes. The TupleDescData.attrs[] array could end
up quite large on tables with many columns and that could result in
poor CPU cache hit ratios when deforming tuples.

Instead, we could make TupleDescData contain an out-of-line pointer to
the array of FormData_pg_attribute and have a much more compact
inlined array of some other struct that much more densely contains the
fields required for tuple deformation. attname and many of the other
fields are not required to deform a tuple.

I've attached a patch series which does this.

0001: Just fixes up some missing usages of TupleDescAttr(). (mostly
missed by me, apparently :-( )
0002: Adjusts the TupleDescData.attrs array to make it out of line. I
wanted to make sure nothing weird happened by doing this before doing
the bulk of the other changes to add the new struct.
0003: Adds a very compact 8-byte struct named TupleDescDeformAttr,
which can be used for tuple deformation. 8 columns fits on a 64-byte
cacheline rather than 13 cachelines.
0004: Adjusts the attalign to change it from char to uint8. See below.

The 0004 patch changes the TupleDescDeformAttr.attalign to a uint8
rather than a char containing 'c', 's', 'i' or 'd'. This allows much
more simple code in the att_align_nominal() macro. What's in master is
quite a complex expression to evaluate every time we deform a column
as it much translate: 'c' -> 1, 's' -> 2, 'i' -> 4, 'd' -> 8. If we
just store that numeric value in the struct that macro can become a
simple TYPEALIGN() so the operation becomes simple bit masking rather
than a poorly branch predictable series of compare and jump.

The state of this patch series is "proof of concept". I think the
current state should be enough to get an idea of the rough amount of
code churn this change would cause and also an idea of the expected
performance of the change. It certainly isn't in a finished state.
I've not put much effort into updating comments or looking at READMEs
to see what's now outdated.

I also went with trying to patch a bunch of additional boolean columns
from pg_attribute so they just take up 1 bit of space in the attflags
field in the new struct. I've not tested the performance of expanding
this out so these use 1 bool field each. That would make the struct
bigger than 8 bytes. Having the struct be a power-of-2 size is also
beneficial as it allows fast bit-shifting to be used to get the array
element address rather than a more complex (and slower) LEA
instruction. I could try making the struct 16 bytes and see if there
are any further wins by avoiding the bitwise AND on the
TupleDescDeformAttr.attflags field.

To test the performance of this, I tried using the attached script
which creates a table where the first column is a variable length
column and the final column is an int. The query I ran to test the
performance inserted 1 million rows into this table and performed a
sum() on the final column. The attached graph shows that the query is
30% faster than master with 15 columns between the first and last
column. For fewer columns, the speedup is less. This is quite a
deform-heavy query so it's not like it speeds up every table with that
column arrangement by 30%, but certainly, some queries could see that
much gain and even more seems possible. I didn't go to a great deal of
trouble to find the most deform-heavy workload.

I'll stick this in the July CF. It would be good to get some feedback
on the idea and feedback on whether more work on this is worthwhile.

As mentioned, the 0001 patch just fixes up the missing usages of the
TupleDescAttr() macro. I see no reason not to commit this now.

Thanks

David

Attachments:

deform_test.sh.txttext/plain; charset=US-ASCII; name=deform_test.sh.txtDownload
faster_deforming_graph.pngimage/png; name=faster_deforming_graph.pngDownload
�PNG


IHDR �4�\�sRGB���gAMA���a	pHYs�����e��IDATx^���E���_����X;6;��
VP�������{��7D�����"�
��


��~�K���ea/��r
�y��l6�������of�h���_�z#4��@
Fh0@����` �#4��@
Fh0@����` �#4��@
Fh0@����` �#4��@
Fh�@8"�4�?����|�I+))q�
d[o��{�2�B!������?�9s�X0t�sssm������?�rrr�44�Q�F�G}���n���=�\k���{�&)//�������g���w�0�t��kW����=���6c�7�������s�Wg/���M�8�=�����r�)����^���K�Nv�������O?���W���$�'��d��]�h�}���6y�d���w����\z��������n�2pM@���f�����x�
{���m��Y�
����&���F���TI����)S�S����b{���l��������t&��-((p�*D��K��5�~��PZD��9s��w�}��7�,>���K�Zvvvt
�#�[�43c������>�jE�������B}� d���v�m����~�Z�7W
2P���������;F���������x?��?��<`/���-\�0:���RTT�R�zc��y��q@�"�f����&M��*�%%%���~{����������.����g�F���
VmaYs���_�5��,==�z����������!h^�^Z������c���6{���$
a8o���+��m��1�cW]u�Ko�S�N�w��p���@��M��e�f�mfGu��������Z���m���U*v�e;��]ZS�S�SK9�`:��s���ow�SH.�O`eRw/�EA�Jk;����wPz�`�
�t$h��]w��r|V��TP���XYrss�}���WHf �#4X �
��M��9s���1cl��i�t�R7-;;�6�xc���������'�|���*�
�����=�����Ow��B���b-[��M6����c�����������?�|gM��o?�w�}����n�}Z�
7��z��i]�tq�U�Q�F�G}��w�������=�}�]���?����-s�-���������d�{���l������e��v�����V^^n���}���`��������.��b�n�m�1A�;f����A����7hQ��>����__��O?����1#:%>m�SN9e�w������s�u�{��E��g���?��,M��t��)������/��bc��u�����M�2��k�����;��M���~�^x!��f�q�����WSZ�0a��ms��]�o���v�j{����n������_��~p���yQ���s����z��������K6q�D�<v�7��������e�]��Zk-�V��b���G��������+oy������������L7�:��k�D������G�!��M��z*�8����l���V\\����R^���{�aJjJSuo����]����V[me�����i��}&Q�����c\����ui]���������J���O>�����������w����:������u���k���7��y�}�����D�Yii���m��L���A�-W��������C7=�x��������:6�_)�����.����������g�y�����k�Gy�m��v�vlU�����J��~�i�s�w�/]x�����������_i�m����k.��_c�;?�G�#c�=��������
�<6
T��s�~�~��_���w�i�*��]���w��vm����{�����^�\���������}�Q�O��f�W�g�������hh=�N4^~]��X�q?���V}^����o����F-Z�p��=z���nw���}u���x�����.]/(/��Z��������D��x���wky�`��vr��c�>��
=6��Y�����X�N�|O�Q�S�P�W�y����d9�������������@c���
����?6��;����#��@=�p��W^����������^T��C���Q7����
UQS��
4�z�)�����U���^k�*Pf���
�T����`{�Y��o��F�W�tC�u�
v�:�~����o�'Ov�*8�����n����{�=��sn;y�Z�*nt����
��*�P��
@�q��T��}Vu���@j�pI�[�~����v��-W��;T�����6Va���&*�P%�~����
K��
.T��_���>|�`F�����
AT���w����������n���S�k�u)L�������8��~J*8��)-����D�{�����xM�K�]���O��Q��M�Z��i�:��N��*+srr�sT��(G��B�P�Y���
���]�k_k?�7��V���y�w��PTi��<��)�i{�`��B��t�����D������G�!��M�ZO��
�U��}�����q��TiK��������{��
V�w)���@��9^�����>�E���W_u�m�����1�����eV�/��W�]�?���9�m���������o�*B�x�
W����eeenyZ���u�Y�M�>�6�2e��=m;�#�.�z����@����>��K�����~Z��mOU���c��*V��G��,`@���Tz���uE����A���������������Ai_iC�Gi��m���������"�������yt�����m\S���5����*����;�����G���K��il�Nu�L}�����a��In����{�z]�W�/�k�Dh��:B�f�e(�Ww���<S�O�[y�P�\�}�|A�)��t����{�������U��^���O�7h7�������Gq�O���7j������e��
��������:��(��[����?�}�������oh���N�F��������c�/��a����
b�G���u��������&��t��]o)
��=�F���~���C{��
=g��sy"b�����C�����}�����X�@C�[m������w}�����	������?�n^�7����n6�~�mW`���Q+v�F�W��
T��XTp�u�
Nk��|�A�[�!m��G�ju�*���Q��&*:t�+�{���k�O����_w9��
��z�-W0�/�G�_�*�����V6/����B����E�&*<�Z+%�D�����_~�*�K��m��k�%��<:F�����)MO�F��}�/������W�l<*TU�
TkKw����7�|3�<mUJ�<C�*�-O���{_~����m]x��
�k�]���mVS>�2���<�E��<��;g�4�x�B����5��U%��PM��u|i����tljY��*W���_�>�z�\�|�m}��qAj������F�GU|�[Ub��K�@J���R��G�*!VF�A,�&#�D�i[h���Ub��.�Uuyp��KDm���=�DKd��_iR�Fm�'Q�^������;_)�*��U}�M���������J���vSE����4������Aj�<�Gi��V����f��J������+U����H��Dh�6��O�W:�G-��+G]i�#��V>��@��D4����>@$�����������9g����sy}��K���]�h;+����_���@]5�������XS0���V�<����m�������B!�S��*�u���W���E7��u��AW��Z6��WE�k�*�P����:x�tR�~��n]b����ZQ��"U�p!�Zc�������:hh>(� �[�R8�������e�Z�����F-Cj��n,������z��^���o_�H�%j}�D�{��c���Y���:k�����+��2�����_H�nM<�����Q!Vm��{��FR�e��b����P��?=U�-��BC����r�����UZQ+?��
�����A]���hm��k������.N���z�K��V�W���V�m��y�g�!Qb���Z�I4��6�zh��.w�h=z�Kk�B��>�u�K��^�w�]����xPE�G�����Z��W�����nT���_q��v�����nUv���+��6Q��af�����I��'V"�)������H�N��*���{-1U)�m�a^����mu���U]�{��:�`\���������b��4E������_-���=^>����K�v4�B���;���q���7v�z����&�rT��m���^�����qm�X�}��{�M��}���V��ZO��h�����[���:����}����L���g������E�F�������6���y��#��������>��C���7(�T����R[~�k"U�z�M�����r�������z���f�� �.������J��&:>u���Q�W��z��9!V��k�}�
C^�����w^���������r��<t��!n�y����Y�W��������<�5]�&*6��5�������OA���Eb������?�,?�����������mP]�Su��h�k+�[�=�w~P���t�i������t��=v?���k���G�G������toP��,Ol��z��D���g��[uo����R�ulS�R[���J��_���V�����>���4��*�x����C��
O]�Y��@V��<Q�]��MS^�
w#�����k�XMu�U��V�o���x�
i��w��@=�FZ�	���
u��n�Z��DM����t�n�c�t���@D<p�f�������(��?R�&Y7�^a�nz5���kE��"���Ux�pQ��
?���[��:�PB��^�=�T0�d���G���.UXq�I'����h9Z�
Y�Zb�[���|�9��B�;�>*XT!���U�
*�R�
|�n:��R��������h����
qTx�������m�uS%�	'��
q��[�������*TcUQ�V|^��*�R��������Z��zU�Zd�����k�D����wq���i�>Vz������[=���]����I�J�Ml��t�8R!�x�E���)J3�v��U!���W@�u��z������FVW5u]��*�����V���l��W���{���~
"���P������:�[^��Z�~��m;����0��h?�����kU
� �"��M�Z��y����J}��C��2�e���7���R��Wl�"J����o���������
������
������_���rT����E�W���'���������z���ez��t���Q����u��Z�^��x�V�����`:����3���U9�-W�P��cR�^���m���~�~�k~���?m��cH�u,���_wh;���Z�w=�����u�w�Vb��v�>:6���Q���+5��^I��Q�V�x�Z�I�::o�������k>�{�g�5��6���4�����b�{����N����E��s��[����y�f���GyO�ua]��Ti��K�������<��D��m�4���VeY�����$�k�Di{���*������:���*��[T���=�7�|�u�h�4�����V��:7��W:��]��El>]��DS][i?�������2_��
*�/�K���m�D�������]�zV��O�Y��x���+�����Jc/���)�T�����[-[�&��������:6����O�k��z�������~����Gi����E��+���cD��1��+�q�R:�6X�����w�/�h���Ti�s���h�����_S�c���m��'�������I��z�
�n�u�-*DP��n���t�8�JTG-/��Y����Q7�z��� H�i=���*<�C7��n�U@����~�
T0�!�
F�����f\wu��PaRu�S�*4�S��x���yU��Q!�
aV&�eLu�[��/\QA�W`�Q��Z�z�U��4�]�Tx��<�~Q����J��J���CY������.�,+ 4z�Ou��U`������2��v������+X���-�s�+��G������(�QA���UwS�{l��KcJK^��
5>qS���H�<C��T�����k�}U4v^�����_V�K��
�����h���Vf��X��Z��[j�j���S?Ud���W0�t�J���L�6�Q���e`��W�{
Z�w���9�O�A��x�M��zx����]/(��*�U�Q�u��S�����W�UG�X-��[����^�Z�AVE�A<��5~�s��������_�]������Kt�5�����*�R<�1-S�\
!���Ly��V�TyT����^�7)���b����&:��bMt���[}Q����[Gm7Ulz�
������9������G���m�����J��^����?,�m�')����������y�S����_��j%���S���������:+����~�=i�������������;�i6����V���!��n�.�h;(������A$�=�>���O�h������!�zP����HT�]�
�'���:���n�U`��gt�� ���_W*�P���t�~P���G����P\�Q���
����+���
Pk*lT���p^�!�_,����%�j����'*�SE��Z���
�����/�Ly���dS[Z�+^4�hl%�Z��M�)�$Rq�A��wM]���Y�B<U*�+&�QZR>�u���^���VK^%���NM��m+E�Zmy=�$�d�3TA^�2������n��@��n�Q!�{i���^��Kc�����;��c�Z�Y�@Y�N]-+��[��i���
�~�f��W���* <J3�s������Xjy]]�G^�4�oV�J��J���ukl�X[%����|�:
>���}�J��AV6]����}�O������h��<���jS�}��`�����z��n����ZI[�c������^<�N��W���������5�=�� x�`c���u������~u���������.��W�UZ6��qm�s��|���+������j���*7�ke��r��R`�w��<���y�{:�h��de�5����=���������������
u�Z����V���!��S�6��������� �������i��w�4 P�h�
Ht��4�PFM��V+�n�)�P��T�R�V$*��W$�����
��_-�<Z�~Sut�^[�V<*����T�XyUN�VX���U�"A�$��3��jJKj}��PM�0]]�z(J���Q��
���:�D��
����W\�
���_Z�T0��_U�*���S���tV��\�*�|E^>�6UX%B��?8J�$��!��:h��iH����yBi�6����
H�%+3i�c��M��m"����*�������U�Bu-Q��u=����5iMb��vHtH�V��(�oV~�JKm���DZ-*]��%^��z>H�����Cy���Z���6����x�����;kPm�Gy�����zW��Zn{��}][Z?����J$?�+�3�O��R]�W����W)���
\����:�k�v
��V�����}�W9��4����uHuAb�ee����7��������I��9���@V��Y�(O���7�|O_� m������m�Uq.o
����{��� ��K��1��b���������@��7���TAD"T�R���*���cQW��_~�k9V���k����h"b�A�2��(�F��j��J9�$`������f��N<�)=5F��
��-_~����&�C���7�d�������K_|���x��K���f^���JM�_�F���o�����J�ZOc|6�d�3t\����P�u�o3��VZ+3i�c\�����q��-��j��<Y�sBc�C�BiA��G�e�=�X�k�D���*����*�U���_�$����+s��u�)����|A��������]�������1:�����c�=�Gyb��X��6��*eu �LS�g�����3��:^�Qs��<�.y��]E����j��
s��!v+S]����K�G-�s�w�5�\c�?�������\_+���������?t�����S�LmAT+�����7�=���k�O�6�V}�Y���<V��$�������A4�=Vc�?��e���@2"�z�W���&��>�T���J6���P�:��B�_Y����(�n��P�d����ais�t�V�c���W^y����nW��.|���NW��>M=�B,�1��J�F%���rl����?$s:!����j[���SV�������`UQH]�g����Y��/����~����S-���^����l���M�Y�����W���!�zcI����N�j7;^o�t��O?���5D���'�4Z���u��������W���xS���;����R`�a��B����W��>���}���*��S!����J��_�~q{��wL�>���p�M7���_�c��
���CU�����RYZ[ D2lK�����W���e5�d9�'�.�:�yQm���Ec�?��Q@=4��heU���~eT�D�[���O2Z�,*����\:��>|���������Di�d��1��|���de�/���h	�����p��zh�UVO�8����m����V��JZ�����i���������Z_x���~u=���W�1b��3���?�T�����f�-�\6���+b{�P��vR��Z�kuu�����-t��U���O{�]������R���'�l�~x���h{*0��{�q����L+36��xA0M%�9���m|��+���X��@=��UE}���~�Y}�]vYB�Q76�V]ZO��h?�w�yq�I"�#�8"��5��	\�����.xG-|T!��W/�MW�X��t<������1��G���������Mdc,�c[���zZ�{��~��x��f9��s���uC(���c�uih��6�N�����������x�/���;���<�H\�J`U������t��I.��V��Z���Syh\�UA��y���zY���7�6��XP��H:�j�+�`����[��+�G���3���X�:Mym�����.�B��K/�=������ki�J�g�y���V��k���@������M�_&^Z[��X�OV
��M�Zj$:��ZT��
3��}U�(Va��k���z�m<S�*<��E�T���oWi���*�V��UW]e7�|�{�����*jVf�0�����=��vAZ�^S��5fK����N�7�}��W�9�J��-Q�`���e;4Wj%����<��>�s�������Ow��k�yU~�u�Y�����
��������A�\���a��^e�*t�q(��)��k�}�m������������*������������F_�]l���{��������{j���E��-!Q:�o��vv�I'�aT���7�x�^*���{W�2��k+�o���>����jT�[����;��S������<
6��u�_�-/M�cS��=�z�J�����c�U0�?�I�{,��~����A-�T�%*�P�����yM�����Js���M��uuT���9A���j�U�f�����������`^�M�~AU�>�}����3m�����b�0[�+j�[��J��T�7+t�
�)��Y�M*�{������~syX�6m�sT��Z�n�c���������o^������� ���?^vl^���/��6��O������JU��2dH��A�G������u]p�q����_�*��v��*|�U��|Qi��v����������F��R[z'������w���z����Np�#�{|E���o�������Za�^
�`��.�?�@eQ�[M�/�D���k
�q��g� ���|}��i�ySZ��VZ�l`�r����!���,X��=�cu��V���J{�^K�v������u���Mj�u�d(]����#��D�T����G���
�U��5��H��
Z��� O�:uYEMM~����8T���;F_�����+�`K���|���M� IT����T�%/��
Z��$������\]i��X����z������T�S%����^������''���2Y��*pS+T�
��J	��Q�P�����u����
ZH��$��������YU`��o���{xV��Ei|�
7���bI������:mB�3��y�&���S��*������(��o�^C����n8�O?��zhn��
�w:n������wA9:�k�s�*�7�t����Uz�Zg�u�U0��T���E��yC]h����5�zC��g��
9�zJx�������v-�k��� xC?HC�C�������Te��7���Em�vz��}Uy�K4x<��z}�
uP�z�P:��������$���}���:'0��������W���)oJ$hU���C��y�*�����!�z���?�Xk��n��������*@]�z��j	�.tUPV� ���
��RSc������[c�z�{�ba����$�&^-��-
�u�Vm*����
y<*�;vlB�-#��S
kzkm�����D��
�Vv+/U���A�5Q���q���{�
��_�VA_}�UB�����2eJ�Ue�0�
�D����TR[>��d��FiA�wm�����)�M6���yV��E�^@�~��zm�:��O�}e���9�)?��K���q����g����UV�
#����g
��H��&�n��$�}��e��I��[��
��k%�*��{]�
$������o{���\K�[n���x���<���k
����3f����S�/�TG�H���tN�����uNCh�7����5������_]�	����W��k�cz����)}��>�M����M������Q����/�}D��Z��2o�-���}��1����/�[x�2�����!�zP�����B�|�Nu7���p���Uz��
����h{�UZSE�"�_�u��J�q*�S+��ZTG5��5� ����-�R��
o�����sQ*`E���7���{�Q�E��RSSa�*Ta���L�J��5�����D-y������T ����m�Th��Zg������Zyi��R�������{*(��j
������jL��o����"\����2C��J�W�"O���a�Vz���F��5���A������v�e���:�/*4V�b����������1&������{���~��Q�P�PS����}���UI�����[�Ue�V�������W�D��*_b�ou}X�1�
,�Q]������n_�s��^�����PS�T��~�����u����wU���5��O�X��:���_	�J���Ale����i�)h�Mqm���{�P�������T��e{��{m�6��x���������u���������$���t�����OkB���������W�F�����������?�����T�@u�;n��	$��I�J�=��C�5���L7�&L�{����&B�8�zh�J9uey�]w�ey]��[���!��{����uS+��RE�A�lt������BL�.�_�U�U�xX���8��1����
�#F�B:*}��P���t�Re�_$)P����v��+��~T���^z�^|��eiL�S�bM�k������P��g�u�����70���
�����}�2��
XU�Q���Y��^��}�}�}�c�[/U��V&k��-���M��9���WA��O>��RV�w�^��ZU���W>���������*�����]�|T����U����t�x��g��J��T�����/�Wyy��}���[���x���[V9�����t����O������R����;W	�[���TW�:.�P�����t�
�;���"�Vd��njJW
�r�4���������Mv�����;C��[�
F�q�
%����t}�����;�uM����3<u�^��o�������X�o�z�����S���{��������}��g�w���?�����W!�m�
<�������={.����@��m���}��o��o��l�����6���M�)��L�RB�I?���G�/[����lU|���;�������?�R=�:H�����������x������������_n�5M�b:�������$�����k-K�l]�j�(��/Z]O>��.=z�KyT�>}�P��R����s��@�Q=#���o?�w��k/�����Xu9n��	�.9��x	����!C\�W"T!�B'�~��A�f8���0��6jU�����
s$��rQe����:*8��F��r�ke�����K-�D-��=��Z[��u�E�}^��
>N9�������N;��*-��Jo*�S!F,�q�Yg-kEQ�m��TU{�������Qu�\��>�;"� ����D$��z�+$Ulw�q���>iAjK*}������PA�*t�k�V�n���B�^x�J���QK��N:�u�K�������^��4�}t�G���c%��U���D
�U�����7\C���yF"�9���5�/Oc��@��V�mkm����;n^.M��4�1�Q~��oMmTYw�QGUI�M����c=��8��+o�v���N��U~k\t���+���]�����^�u�������� ��R�y���i>v��K�����;�
V�W�$B�C-�c���\/I}��u��i� ���w�����H�g�yf�kx?��
*P�[J#G}t����#�4���Vu�v�SOs�sL��8�}�]WyK��O<�J/:�t��+]<�6���W��7�M���86�.����zVP ����1�{��N�������\^��SO+
FId;���t�g����.�mc�?���Q�}����C4�*�U)�B��ZK����Np7��P��y��W�_MTY�����Vp�(P�f:�u�|Z��
������k���Vu��j�y��.�j���T8{��P8�������D�Ok:>/��B��������5��
�O>�d���k�^�p�J�x���3U���Mdy��JS*��|P
�R����&�c?�p�B���/��t��Pm�k���5������Z��Dz3���m��mh:_�l��&6`������O�G]t��G�}��]m��7��o����b������S~��wox�2U�(��| Z��\/y�?U��v����]���������+T�)oN���{�/�m�xT������ES^[��A�-����������x�������$�7b�������5��g�]���������C"����2��e&��4�����??n�As��K�Gj������/�@���.�mc�?���@�IZ��W���nhU��FN�`7�B2�Z��@��s��w��U��o�u���;�k������
�u�n�W�5���/�.��J����Z��5�
���j��u��2h?i]y��� I����#��Q�0��PZR�Mc�Nt,]z���x�s�����I����t]�*����}h]{-�/���k��R�R�����U��cW�g�u���Cy���_�~g��)�xiDi��5��p����������j}���*W9��Qa�Z��B��7��������4���H�:�/*�V���[��kJs:��7���4'���+�p�����s�w
�� �W�G��P��U�*?�ml������3��^���!��k�i��������U�����c^���5�u�^�1���:/�7���7yt��VE�*�u��l���7�[�j(�����@k?�>��m��.������j�k+}V�K�O������>I����q��g�q�;G���x����]����w�k���{�n
������SCM�����+U����o�+��u�����4��cu�����:~U��
��O#*�PpAm�SM������5���C0�f��A��t�hnV� ��h�&K����R�����
Eh�4������]�w��������?���oZII�_����!4+�p���ks������������G��EhV�������v�jg�}�m���w@C�����^�N?�t���St
h(@�����4��@
Fh0@����` �#4��@
Fh0@����` �#4��@
Fh0@����`�pD�9u����U��/I���77��b���O�U�H[w��i�W`e P/�,���
F_5���-�dYJ :k��1���.��jD�����>���3:45������+�$�@�����E_aMWp�m�g�,��n��+�:[X���.��wi���o�����O��%K�S�L��2-^}��B���>[����_��3�XIIItJ����o��O;���l������x���l�u��{��7:��"�$����/��>��S��6��g��v�g��)S�SX}�@Q�AEEE����`�i�7�����I��k�{=,X`c���c�9��E���;����?7]���o������n������j�����a�������/�������w�e��w�}w�}��>h}��u�o���v��g�a����sU����V[�����C�5�����������n�=���-O�Z�cy��2�F�a�{�v��������y�P���������2f��m?��y��n��5m��*i��{�u����/.�m���.�*�y���l������z��{�UIK~��������/��^<uIc�������K\��c����1hfR#7��G��������_�n��M:��n��E_�OII�����V\\l���]}����eK�d�M\��g�}�*S�Zk-W?q�D�p�
]E���~���v[W��Q��^x��M���onl��-^��UB>��[o=�l��,,��Yg�eo�������6�lc�[�v�����Zzz�������j�����7����-++���~{��{��������>�s�=�/�m��-����MW����o���������4{��W�r:v�h���v����Ye**�����/_ �Ms�;%����m�����m{=o���K'�����n��,o�1v�X;���]�����������_~i�F�rA&J3�
|,Y�������������������0�|W���&L��L�w�e�������Zaa������]�W������/��P������~�O�g�~�m;�����~p����z}��'.�)8g��v��={���L��X��7�>��C{���]�*�?��#�u�]]/j����{��V�R�?�����5�>��c7&��bX-�U���T�����s�����K�.u��gU1� �����}��/��Z����;��v����������!A�
|�C�}�QW�+?���k�.���<�.�����o�)S��y��^���~�O�V���"��B�X�G�p��a.�@�Q�S��3w�\����\��<���}���4�@�1����R��SN9����[���W�^�������OZ�#�<��
�+�^�z(�Fi����s��OA
3f�p�)�(�j=O8�����+��S�4���v�m.��;���Q���1�y ��S��>����u�Zp�Ky����N;�4���q�edd�y�����w-����q-�>�`���������r�k}���:]T���j��������%A]��=�������UZ�k{���_����>�;�����(�B�/x�Q+y�M��]��+�\�(��Q0���h�*h��Cu��}��E;���\�3g�t�-�Q��8�a��k}��s��v�����;���r���a�u��+A��4�}}��Z/}��.��}�9��cp�{
X�-��`
��^w�!�����	 77���o����|u�����=�X����n��4����Wkq�����P(}�l��A��*�k�p�B�4i��dVer��
������e�����B�)�@���z��] �z��3g�����]@=c��U<����(-[C�����U�L�(�����.��Jp���[l}���VP�����&�����s�����
!h@��T�����VRR���Ww�O<��k�>~�����T|�A�����������k]���|��rX����Ow-���C-������G=:�H�n�����3��@�E�E�V�`��/������^�������R��z��
���~�3�Ic��:�����O=G�H�4���aPe�������k�>u�TKKK����Z����Kv��������SO=����{�?���x4�Z�k/h������}4��� �`�{�����n���Y@�nh���=�
Q�L�����B0���O=��H��n��&���+m���v��'��w�io�������6b���Z�+H��/���?��n��V���*r���GY6�Cu�Z]�������Wvu��#G�	4.���Q��-@�ZC-�}��.����s�OCrhX�dR�4�����r4_ �u���s�Y��}m��!v�-���\/^�����V��'�p�������
�	&�����+}UX�^+��&�����J�m���:t���)0��?t�*C��������?��hH�p8\�
{/����_������k��]t�E�����O�g`�!"�������f��}X��@������~�&M�~�!���*^�<�L;��sm��%���4���k�m����N���w��������[	������]z��n<4������l���~�o���6�l3��JJJ\��h�������}7n�8�2eJtJ����l�(� ���uh������E��M}���K�QC7�3f�����������u��J^�B�h�{����4���T�����=A����2{���]eo�n�,777�N�9s�Ti����a����u�]����~{����2D�������>u�T�|���M�6�=4���������e�E�]�W�q�n?s�1���2Pp���]Cmx�����j�������+s�
�A!vD��=����<�����OS M�>}l������z�
1�����!�q{��7�k�����{��F�m���������=�X�m��l����g�C=�����e��BX]�o�������v�a;��������n����k/4h��J���lW����r��z��6m�4��Z�_u�U.���.p���>��Cl���v���v����a4.mc�����n?j�t�An�<����W �*�_�u�F4�J�����������"��C���:ur���RA�.(}�}��v���K/��l����Ai�[���O�p�
����v����~����W�.������@ ��@-����JWA�.����	�
��SE�*n����+z�������
��6���`W�������[��'�t����,;���\E���1b��_T���`��p�g�i�������o���]w�u.��O���<����W ���z=:t��pOKK��i��kW7����n-Z�p�]������w�}�����z����t���m��.���}����JK���w�)
�s�=����V[m����$��/�`�:�G}����z:��---ui�K�..}��?���X��^�	���r�������B�m�l����WXS���l���G_5�@F��������P����HW� >z@
FX#�������-�m�8���v���3��4DB�;G_5��={G���!��> ac�U�K_�YqytB#(�����v����)X��/��G���o�F�4��n[Z��1���N����z��?�|���c]tQt*�Eh0�`
Fh0@����` �#4��@
Fh0@����` �#4��@
Fh0@����` �#4��@
Fh0�����m�m����:�����S�
�B������Gm�����-[�`C������\�k������E�������'F������^x�;��C��7��M7��,|���v��G��7�h�����k���4O $�`0h�?�����_����b?~��;�>��s�0a�t�A�������s����h�@H�q��G����[��]�S��p������9�l;��C���6��n��[w�u�<�M�6��<@�EB�={��p�
�����E]d999�w��3g����W�^��g����6�d�m��\����{tj�{y����UL��s�=.������;F�Y�?��c?���h��ut�r
\X���|S�L�N�^c/�|��
��a2d�=���v�UW��[o}'�������-//�����S���	�H���<@�E�*�^���~4h�~������`i���edd��
���4_ �"K�.��n��=?���,77�=`uk�Tv��w���_{����C��c6u�T;��c�g��v�=�Xvvv���^z��?�x�����k��N�*�y<���X�}�]�`u��;D���V�/���z�!;�������N�]������b�P�������5���= �����k����Y������^�n����_m�����!���������\�y�~�������N����h��ah��������c�=,//�6�`�w�}]�Azz���Zk�e[o��M�>�/^��������i��|�m�Ytj�{y����U@C/|���qO<��m��F������a�\�z-�;w�w��F��z/��������g���>S��^��"a5���iG}�����o�o����4~��w����l���v�GX�6m���4������w��.��2���_l��v�]w����sO�v�m����sA�vXt�J,p=*���/�S+�gy�"a5���f��s����;v�QG����j&L��v���|�M���k-777:w�{y��)����'z@
Fh0@����` �#4��@
GD�'����>}�-X���N���u�����k��fgg�i`�K���K�����kO?��}����������N9�;����e����`eH��r����n��.\���m���w�n�o������n��)Sl���6q��e�m��v����I'��zG�V��+�0�
�~�*�O�py�2�,}���3�4K�b����\���f�������y�{����Z8�J�m%����^�Z�q�D���%UB(�>��.��R7��z30`�����:w�l)))�9������/=z�=��S6f�7,�M7�d�����s���[���Y�;oF^�,�Uk��LY� �"��rO:�r�Tc������������� (��d�p+��]��{�[iH ��)ij������k�q}����~���
f���^�� ���N<�D���O?�ehH-S��I�'�����<ku�������+���[#���-��j�o�j���G?_���l�����	��g��;����g[Z��,��Z�w�n�&����=@p����Fmd�����`�����-c��qn��$�pi��~<��6�2z�����H���{��m��B�Yp����qh���g����,m����u���u���^j��am�x��6�*�&�M� �k������~���xK��|�����ov��FE�,3�R:t��
6�N\.��e)�����y����4�B�Zh�7TC�z]��$.�m{ku�C�}�1�C@@$MB<#F������B��q��5A '�Z�x�r!c�]�S�S��0KK��n[D�V�
���������TXu�6!??�^~�e����m������,��������m�e����o�#��r��Z�~���������eee������ol�[�=<.6�|J�N}����Vh�o)�n/���+�q�U����yV��G��3�������U��s��`�&�Ya�%��l�MW��}w�y���Eg
�����N�]�Bp��C/l}V��
@h���u���~��W[�pat*P?eA�[����CKm���e��un�R#G���!���{���*Az���2���7���g�Y-���K���J��UZn6���-*X�E)-[YJ�N�GG��[���JG��zA����U� dff�%�\�z?8���l��n(���������_����+�e�;����s"s���2,5`6bb�~�]���^�|S��k�[���-k��
3%��P���i��E��Z\0���2<�x������� 4�_[z�eU�z@2K��E��M7�d��������v�X���]`B �����m���%����6�����������i��R��z5��#�6����E�e��1>�)h�A�]7M��vMw��>��Vi����������A�i��"�k��<�/��e�O���w���EV2�=7���H$!����-:���nn����iK�8���X�uF����y4��L��ZF���Bu�#���4T� �B!���������N�'Xa��V9�B�+&�����y�����C�}f��
pq�����y���S�M�r�JK�������������}��z��!���&W������/|�q�z��C,4�����A���>���'Y '�
�a��V6~�-��L+z���A���o�d��=���y�}V�Xz��}z�[vB{y@#I��v���a��p����~y����,7|B�-��S�S����B������<$(p����3'�������~�S��|�u�v�����bO=����F��HO7KMu�-����*��=�s���E�{���}��N��{�U��GV������g�n������>��[#�P���*~�U�;��|�D"�G��!7"��2���OFX�w��yj���5�h�*Bf?�Ya7)���������G���a�?�
������*l�N)v����w��n��r��sf���e�A�6�=M���ECd��ke%s5��]�p��1��n������`��.-���GD��,g�I��s��]Z��XV��-m��n�������#JF}`��b��s�e�;by`�����Y���\z���h���e�	@PK�,�	&�aJKK����"�H���X�[
m��
��Kl����#��<4�2��?xhd������iO���������Yn���H�ki����*��y���)�ND(d���me������,k���o�_��?����'E��^*�f���=Ll�at�r��"�U�<4�_��E��3i]6^����N��'	
����Q� �B!5j����^��uk�n���������+))�K/��.��B[�pa�@�4$��Z�,-rCf�O���*�T�'7�*?y(HA�������*����>���uO��k�/8���-�����c����iq�e��m�����E��mV<�5+|�>F�A]rr���wV�8�����������f���-�o���]t��Lv�c+�����V>�g�<}�m��5���F���`�~�a�����3�����c���w� ���_���Yg�e�-��T��C3m��96��zI���`IQ�n~��&����U�I{fT~&�x��\;�w���a���R���`t��Z�Y��o��W���6��(A2w�e�z�2���^7D +�2v��*�S7�b����;h4���O��[�uCg�����{D��F$�T�=�
�����k��lgY}��Y��<��$���/����;��]w]����l���r=��1�^z�%k�����3�l/�������n~�.�+��z����Qa}�I��'VI�������m�~��> ��S�o�YXz��V:zd�U$3MO��'Y�1��p����>�x�UD ���l-����-����"i{@������{�=���{m��w���W�s��v��W[�������r�"u���.*��?��. !��]q�� l�%I��&�����t�ytt���r+����:

��L�� �p�J�me?|�z1���^�I��t�R���m�=��n��E����z�Y�=���~��B��GUs����'�������?k�.P0BZ��(,
�e/��������}�6�n��e/[qY���%a�g��������+�#�w���[�	�[h�������
B��l�3������w�5n��������*:W�{y@C$mBH������ciii���KM��{��I>��`����:'�����1�rz��@$=�3��LZ\��3�-L��rz^v��3"�E��)�Q�/�B6���cQ���7����[d�D����z�x�e����/�������(%����g�������}�"�^��zh��u����cG�9sf��,^���~���9��mn�v�8�U��2����}y���^����N���}��vQ��6O������\������)h�N�p=�3��3����:����H���m�%�J�f��*�?�]���(�>�Qd�]���NP��IK��������J��?���oh��*.r����$*iZ�ha�n���1�=���g�^��y5j��_�b�k�u_?��hp��%v�]Enx�C�.�g>+s���+�x��n�6Osw�_j��*�~��n^��Q8t�t;���:4t��5)hO|Rf�����zV8�W�u[+�f-��O����<����������v�>�W$������Sl���Xp�������f��..������:$�>H�9Kn���)ik�4�B���m��v�s�9�l��O��������b�����.�+���v�yg������un���e������Xiy�#�v]R��������k��n���L���L4�
�P^v�5���.����p�S�	��M�����w�e�����{XZY���eg���i���Y����Sz�������}zt�O0h�����);���@z��+*,4o�����{/Vp�/�o�u7�CM{y@c
���Z I�;��>�l�8qbt���u�f�?�������)���^x�
�{�R:t����b�[l]�F(d���e���c��ku�}��B(��#[���]0@��W[������Q6�K�����A��7Z����g�b�n���������N�������2o�<7��o�a����N�<8�����N���_?:�F� ���~��}��{����YF����{� �?���O8Xn���g���y�@�<�`e�Z�8��X���[�q�T�3��-��b+��K������^��V�W��+�j��-??�rss-###:��J9���A{nL��Z�`�rx��;����3l��Rk�g��8l�~�G?��.]���}�o�BV:z����U����AA��`9'�aim��G�LoE/?c�_&Y����`���V�3���gw�,����g���',k��,�����"?�S��+A� ��/�h�Z��#�8��`���2�C������[o�6m�D��:+���^�}�K�"�f,=���<l�e�u�G��ng��Q��]AoWn�'m~~�}V��H�s��=���ak�"`i)�	V���i������o�g�}f����}��1�B�Pt*������]�AvF����i�\�cC.��������������A�y��<��E!;��b{c\�>X�u����o��v���6fJ��� ��	@P��	l������W_����m���6f��e��=}�Q1b����Y���r��������|p�i�g��e��Fr��=��0�%a�e������L[��=����r���sl�������
���*�����0�]����YR
���;���A�,???:�n���^���,����j/�8l�
)��Bv���{����x���������/�����FR����,/�j���_����a�c`���h��*����^}�U�?�����nm�����������s�(55�v�qG�e�],333:��l^~�.}���,	���2�(x�����]�Z��"9��Gg�V��F�1�;��CK��)A�k�4��p�4_I���`�;����K�.v�=�Xvvv��YE���Y��'e6�����5��9<�2j}�!�!��������[���2m��R��4l�}^n��/�6����,��C��j�tI�
�l��%���b-[��uX�`0�zP���s��f��<i�����v�^��S��
	@����S��l������z�R��C2��Z�;h����l��E6`��������$:5>
�p�y��1��>`�������GN�Cf�O���"O�����M�Y������#7�2�aA~������\XAdG����-:���n6o��l�A{��+����'VvyQ����V<�M[t�@+z�����k���JkD����2+((���&���Lra�
�(��^�c��H�%Ea���R�4ky��mqa��Rj����Ms���vi��vl�e��=�qe�Hn�`�<t�-|�'O�@N��t�d��ne��������W�]!AAE/?cO<�s�������z�s�Mc/ Y$����v�=����������
]�v�qX��3g���S��3�t������`MU^av�k%���
��M�
>83���2����������S����V��������e�N��'��zG@r*��=�����9��
��2v�-r���P���}�
���-�������������E�j��D�M��.Y���*��c�'�a9�Ns�%����L�����t���������>��>��S[�p�.5j��V�C���u��|4��f]:Tfa�,���������6[;u����K��el�����O�d.-���GD��,g�I��s���II���[�V�-�x��M��.)K[g=kq���������-m���o�Cc/ �$�[o���;����o��M���{��'�l�f�r��{(Pa��I���{F�`u7gI�N{���{��~����#�5QnV�)H�f������l�� �PA��L7�B�F'.����Vm�����_Ii��Z���e~L���������H&I��U�V��];��p�
m�u�Y���G�6m,---�k���!�^
�.	��sV�Y@���W9�}^`Yc���^��lR�PtO��4+dK���w����h%�`��\ku������������������fX�dbi���N@]$U���
�x�	���kYYY�������i�T7��+c�����w/�^	^��������}�jx��Bv���*�#{m^9����*��O���� #�������� ��i��Y*�
Yp�T���Z�6��������}u�������~kO=��=���VPP`n������\�$���n��O���a���;��";��";��B{��27�i��m�.��y}�����Km���=�I������m�n���W�����/���,t�p��Ev�K%�� l��J���d4Y/h|Ko����������-:k�������p����
��G�@]$}Bqq��s�=�����N;�d��v�����.��������.;��Cl��)�OXS��
������~�+-�`��K��}|��C�+�5|�����i�bY��~��{O�v=2h�CAi�:���{g���e�u��#�e+K��)��h��t��[���]/��@8"�<�(������{�����mk�o����7�:w�l/��������g�io���������/�:���4`U�f���=7��f-Y0d��f�q��{���Qj��#����!/&�������*2�>��)��(�.�K��3
6�.-���^��W��@nk��-m���wW��JG������A�E��_c/`UI�>��#7���A�����a��Y��=����i���{�9������O?��C�F��jeA�[����CKm���e�\O
�<;dW�^b�}R�������.x���N����2Z�\���%a{xT���V�[v�*BfyY���'��e�O���w���EV2���;H�DR������Sl����3���-��|+�ybe�Ks����]o���l����m%�>0EF���S���`M��^���>��6�����j��A<���v����{�a'N�����;�Ui�����/A����2��Krl��9���v�^�011h?���~���,l��)s=��a��vA�3�39nZ���6fJb��E'�[BZ��^*f�e�C��T8Xn�eK�o���,�������t+?�_|����
A��y�{���|����
�����*��a��������-;!�e��Rdy'��7��������;nL|y���6!??�~���������z����k����b������
��,8}���}�!�*[�6�C���]�N�1��m�/AW'|�i�g��eC-( ��47�
~��������o��zpV��W��}�J��6Ku�8���r����<-\`��?��zL�����@zzd%S�����~��������Y����vo~h�^n��i-.l���*~�U�;��
�����G��=��~�]�W���J?a��}�D��'|g���������n�����wi�d���4gI��IM���^�fS���Os���VBo��|�]�N����fi�C.t����F�!�������/�Po%�f��O���U��N�uIu/
����#��,� =����V���*�)��%��o������+��\���J?y��'YF��������{��m���M���}���A���Z �E���f���e����C��T&�������pI�e�9�������,/k��t�c��O\Z��J�
�������S��3g�M�0�������W�wn+��S�
4�����}|�r���i���)���E!L����OEs�TV��:`�q:!h�"`�i+,
[IY������~�����m/WI\���V��O�oH(d���me������,k���o�_��?���GT�23�p�l��\ 3�RZ�q�C��u%8�gX�&�,��Z��Q
B�nG7��RB��7�Yh�\�<��.�	�O�������.[�y8�"irrr�g��6f�{�����JY
�p�w��q������*�������l���g@�����g��0��f/
������(,,�*����A���L��A� �E���X��{Zh�\[|������l��~6�+��v7O��.��n[����
���n����Y���Y��0��*��k�n��
w������������f�`�~��������z��X)��Z ;�BK�X�#:5�@v����vk��{�u�-:����y�oJ�Nn~���
@�C9�?�p������C���z����k�`��L�b�=��t�A��#���>���'����v�:�h*W�Zb�o)��n+��_,�isBvx�t����e�4�@�<ku������Z�����#H�����C�Y�>}���de[��=]�w�],��}�&r����z�:C�V�o�#��/ �z!FJ�v��u�$TD�@�Ki��R�w�@���2\Zb�_}�/%�����@3GD�'��3g��_lC��NY�~��g>��u��5:X=��w���U���o����u�;����
����$l�P�p
�98�zl�|�*|�{����n����N]N�6\�|����#�lG�g��[z��V:zd�U�"&=���d9�r�1x��rO<�r����]p�@hu�����V�w����W���{-}�������^h��>A4����c]�?�`&L�-���6�l30`�����������sB�������
+�eL��j�i���i6�g�m�y�H@@s������m�w�����������$ 5�P�c�D��-�x����-u�u,��]�ge ����-��R������-�q�h�V���(�@�����{d����VB �Ey��U���^�n�f����~U hyY�z�������A{nL��Zr=V�E��u����{�����n��gU�#��osCV4����m7H�3����#�mL�������g-���Z��AK���'�������,�?�6�����6�	)Nb��%�����G������� �.P?��`e��S�
4W��f]:T���Yv	��Ee��������K�V9t�s��m-0mN��}���z���'
�uX��8��f�Yz�Y�������� ����w�+�K^,���C�u����G�5vZ�]�\e`Ic���O���w���EV2���;M������
�����N�������*"����om�����vsAv�����B"�
�>��\q��?h�������w�U��':G�����:�~1�,T�^�#�B���5���k/k���m��v���{�[layyy��7<9�>4���2��`�����$l�=Ql�=\d?�Y�q�`���N�*�
.J�S`�xr3��QsBai�.{������>�9����/����������/A�qE�L~i�
�0���$��1������6���;h��
{��r����5���E>sQ��y��a�������e6?����ii�z=����Y�r?�����V�����
-\`��B�sBj�N���Q���+.���g[��S-g��F�+
�����l���-8y�Yf��h[G�������
A��|h��=����s�S:t�L,����G��d�ZV�"�.~����KOw���u����+,�����GRW��A���;�O�>6f�k���>�o��l�=�pC���}��+��B�Lc��*��'X#�Ou��/8��ka����w�;�UFZ�0s����9+�0�{jM/���}��:���n6s~h��e���Va��uL�695W�f�����6qf� �)WN���
��.�8lO
�m}�i�g��C-�F�N��n�vN�����S�u|6��l�~�p�W��nx�������!=�n�W
X|�)���c��w���������Z9$Gj����������B�Z���RZ�2���#��K\�
>��� �xR�J���xJG~`���i)�k�V7�m����v���o���Nw�����O���K��iV���V�y�����n�H����������-�dq�5���{�=oq�`��Z�vo~��I�V��+������$u��{��g7�|�u���>��C�;w�}��'�����^2��^{m���������~VU�.��47�|��(:�����w�;�5�mn�v�8�Ud�2��J���<~��r�3BNf���*-��������%E�-�����Q�����
�������U�O�'��
��z5��y��W�M��X��S�>�\�z>�:h��NA�.���+n����m�n����}�`��s+#zF���O�`�c�������� �JO�py�U�9�u�/��^���Ti-);/�� m�-]��_�����H����g�6��RZ�E����������&X���[����@Ze��*\Th%#�G��,g�I��s���D��X�1�,}��-\Rl�_���Q��g.� c�=�wrr���[Z��"y��V6�K7�6%�>p����@��w��`���d���e����/7�QxE�I����>��#����O>�z=HK�Z������`x�������#�/�Lj�.]�]Z�;�����]�]%�z ���;��"7��w�3�U����J���,��V�y�eZ����
�`�3��3Ev��R+.[���l�M��4�������'>)s��=tO�^�������]��uX��CwL�����7S�Z���'e�S�������B����D�aaI��Y���
;T�;oi����MJ^K��m/W�]���V��O�w"B!+~�m+���� k���o��m���o��������s=8
>������Y����]^1Q1�7l@l7���+x�N+�����kq�5	Y���.$m�����2�,c�����7LF0h��NvO3w�c�����ud��.-��@��x��[
���e�*�������X��K����B������[l�Etj|=z��}���~������N������Z�6��;I��
������~�+-�`��K��}|��������J�;���]��Zz�����.�s����o�]�f��D-hyj�N���
����W�i�����
�P^v�5���+�M6W�����[V��@�,�����P��ae�BZ��7oA4�1e~�e���������j����g���q��K��.��n��T�����-��ZV�����#�9������%�\+dz��o�C�f��"���6+��>z�k��)~�U���)V��8[x�Qn�=�uj�R���6>cm�y���v�N��"Z������o����K���
\�'��F�o�?W�?qE����pC.d�?6:q�p��������o���h��
@HIIq=������k�4_NN�������2�]����Of��V��3gf��W���W���������u��n:*������2�^:7���H_��~�Ng����"����
C)��=7K��O��W.O�Z�	>H��?1���]v^BvF��o_�S��������2����V�P�y������U�uC&��Y���{/k��s��O_��/u�
��]�ZV�#3fE>�����Z��],���,��s+G�zD����.*"��b����;���
�,�h���j^o�Y�ZLA)m���)"�p��O��m��mw���9����pa���$"	���YVp��V��XK�f��4h�pD�yR����n���
f����u�����5�h�z������-��}K--(��*B����S����aT�Zc�74�|Wn�,�6�����e�*���+��!%n���vH����p�"������mx������S����,/������C�G������"���������������!��k�o�l��e-���j�B�s�/<iE�?a�[v�V��k������E>[����W���{��8��j{\�]��+���N�-Z��W^i���{������g7�x������>��y������*�������x��r;��B;��";��"{;��S��]nL��������*\
Xs�~����n���g9'��,�@2�����cE/?k��9#\Z���_�L�'-7�C'��������V���.��8�����{��m���]�����c�Y��m����-��2�����3����wO9�������.hH= TEK��a�aM��o���K��<l���pCj����1S����������������{�������a���(�n;�����h�+^+���p=)�#��a�S����������������&�NT$���>�����7�t����,m�M,�������P�J>z�
�'��J����[���E�4D� ,X���;�8����S��o����K/Y�v��S���P���~���|pf�;|�t�>z�
nZj�M��;�������v�{�+4J��}���5�Z���,l��
���V�!!�?!��n�X
����m�5�Z�����s�e��7�N���/�0�
�|�����Ii]7�����������k,�Wk�7���������-c�=��u���C��������S-\^n��tK�����r�el�c�b���b�?V��cV:v����RR,u��-g�����y������c��,��3,g�i�w$��	@(--�~��JJJ�S�.++���n;����NjFBUTd��
k"
�p�%6� lG��ng��Q���9��v�����(l�������<T��?��Qe�W+**
�^�3�2��&'`7�e�[�c��0��S/��)�YB������.�N�#����w����O�l��
+�lz���e����w�x�Z�zc������D��|����-k��V`�&��[�����{�9�3�����+��-��
K������!K�k}��
��������7��B�w.� �b�'�n9��Re�}����t���.q�
��m"�,�d�{?�������-�V�M�^Ko�������&H^I��
 TEEv������c^��|�2���t;�w��(���%���
��A��vL�e4��������
�^����7��D����J��_�.��(-/*��/?��'�\`��Zd����0�Zv��j���~��N�'dvL����j����.��f[�IgV�#1������e�������Y���F��O�������N�������v��������V����-��^%���o���<�|]���_��������23��&,|����KZD�w 3�%��q_Z��7X(?���s�e�w��L]y���!H^�W�YP��������v�_�!�fT��������;�W�
�����5�]
(@�_���3vE�L~i�
�0���$�
�!�~_n�~[�������]��z�zI�
�H��q������6,��D�^�����3�2�����{���>p���x�*f�i���di�o}�z��WTXh�\+�������Sq�Z�U�7s��B+1�U�k_e��}��JI��cY���[���J�]9="���oR;��z�X�-#��22tYf�7_UN�#�>����mgiw�N��@���~�M�[��X�G?PdG�����U�J����Y���e/���tl�����-��z�����Q����'e�_L�L��m�qd;���vH�>[/jA�'��+�6��b���<�"�g�����
���fXNF���Y-c�n�n��I�|07�r��_-�|�3�T�x����D�B�U����k%#�����-��3W���b�V��]V>yRtJDZ�e����-���~���#j���V��;n�
����pQ�U���z�H��{t�r
,��f{�\=QxB�Z���R�w���D��������.-u�����'��������D���@���Q]���W+���1u�z���"��Z)v�����Y9+����K�� _�m�eE+�Qw�%a[�Y�f��O�N]N�z�u+�/,X�����Mn�Ze������)�,��l���Qzi��D�������	f������-8�P[0�_�G�[�F?UI�s���W[t��n9���o��w��m�It�Jn���n����Y����V���=���������7^i����;���zf��9��b�{��D���<���}�uK��-:���h�A������:����U�5��zQE$a��:�=M�����.JG~`ec�X�.{Xf��S$�@8"�hvz����bU������J���)�l��0���3��
�����y�������-+u!7-��&��t;�O������]�Z��"����L�j����:�g�c�^��������x�MW[����W5�����'����-�UkK�h�>�HW���Y��W����������.���A���	����g,��$�����i[l�ze��v�����L�������z?hu�}�����oD�q�SY�k/ZZ��,o����I7�+B��/Yqd��t�l�n��+$JC/,������[�z,KW�i@� �UQ�]?�7�l���]�b������Y�s��@]��A��?1hk���e�6��ZAi������_�zG���,���f5k��Rp���pY�`y�]S%�CC%��������K������K���P-o��W���.���8�M'H~ �Y#����"{�����u�}3���j���Zd���q�
��n�t^��� Y�*��wJm�/Axp�Y���AC0<5���}_�����.��<$�
������-����� �`�-������\���"���BK[ ���8���ho%���oq=_����e�_�$?J��v|p��%�B�������w�;����P`�S��!/`���Q%�@�l��
|��Z�,7���xA~�~�U���|y����|�
��������&Z�1���[Y�W�[�!Y����@V��}��~�Q�5����>f)m�Y����?����� �B![�h�{�1M�����Aip����;���:x��r{xd�e���3WFaqa��Rj����M�!���sl��9v��Y���=�qe�
Q2{c\�tG�����>��u��������;���]f�[n����~��>H�v{�9�t��'}������:\+z�e�P
�P���Z��rO:�R�� ���E� ����j��s�����i3g��#�<���m�����}����=k>
�������3����*�������J��6��� b��A|�i�;{���X�=~��R����M�^ot�
����<j�t��e�Cf�NZ����� ,��RY�K�������SU�����C��e�*�-��ik�����gG��W��WV6v�[^�]7�!��
� ��=�^/x����s�$��@�7o��z��6`��������=x�:t����Y����o���.���M��$�5��v�:������v�������v������aF��
���Z%���}�T��
���a�1�����{daA��KV]>��i���o�PA��:���=�,�b�p�'�@��A.NJdz r�
[��� >
������t���8Z������G�����+W��.��[[t�)6���\��������T)�<���O� ��E/<�d���O�%W�o���}�[��/F�+��\X%u���a����^��>��8�����3f��Q��{��6n�8�����^�_~�����xh���	����ZqY���n���^]��A�CA<����"�V�Zz,(,
�e/�����?�\���j�F�q���g�-��K\o�'�n9N�L�H�`C��|��n�X�iS,�p��������S���iWk���j�����9b�{����-�m;7
)�����%�����If�Y.PC�Z��^zzYB �����GG7���Y�&���jYv�/��sO����"|�;"�	���uXz����q�
�I[�[RRb�������v�������n)))���?���m�}���7��M��������&L�`�%4��5o��������ng��QS������2��9!+�30iV���]��[�������h�P
g��V��w�����e��q�^h�����r�j9O�1�@2v��RZ���o�Z���Vi���U�[0h;�b)�;F�1����{O���8JG~`���i)yy�������Q.P��[#-����<E�>o��&��
(h��kU�<b-���,5��6�j�[o�>W-[CdH���v�z�C�NZ��OFX�w��y��I����B����l�m����;�i6~�x�|�v����\��kg��������i������6���C������C,�<����lY�2��
{���i�l�j��Y~�8������o_h�^
zE��^��{��zz���?������}�Js������S�v�����B�}K������mG���Q9O"��F����������	f��S������Cm��~q�o��>��qWkq�%HK�������zU�s�������b����]�=��e���"���6+��>z���
�t���a����'!�kEF������X�1�,}��-\Rl�_���^�H�+���KK-��n�������}Gf��g�
�Y���w���{Y���r8���6!�E��?�`]�v����::��	N�jKo���k�1��1�������@c����VF|�K��~��
��������[��j'��n�������;����]d��T�����b��Y����]�&��O�,�xy�������iV�\�~wU.����n^9,��;��������z�P0��CKm����G6M����������e��2�����	�@�t�\�K�p0�F(d��,4on��p��^�2��k�y!�w?����g�bK]o}���*ky�]U*�Y���cO���],��}�.*���v������G�.����m�w�C�����	�>���m���k;��Z%�Hf�!��l�<�y�yO]�~�����RTTd^x���5�^x�k���}���v����|�Ik������?����������v����u����U��g�T9�*u�zt��~�ju�o�J��/<���\������'S����T���&���>��H���C���2���
+.��3��2`��O�CvHsC0xt���'e�������iv���Uz3��c�����nHU���|�)v�.��G���$����.�'>-sCR\�_��B�G=O<2������2"����Y�s�����zz���V�uj�b����j�3��NA#�E��-�����+����s���7�rO<�r��Z�H�(x�+~�E�9��=��������[��/����Z���D���$i{@�����={��#��[n���{�n��V����]w�uY��?�����7�z������1�.��R�l��,���oo��v���W}��P(d�~��}��n���-[���!C�Xi=*�{y�:�x�+;�@���n�1�vl��J��>���N�[���w/�|������9.`�| ��>�w�}tE�]��j����=7K��O��W.O�Z���^N�G|<�r���vH�>[/�>����^��i�����bH�����A+�0���Z�dIQ�B��a5��b)m�E����������'���1:�z����YJ����_tj=E��Wp��V��XK�f;��s`�M�i�6A>�`;���\�z� �C=���_�d�]p���O���gu��������ow�}�{��~������J�����;�M����p=B������������;��Gi7�x�&�:������o��>[���}���/	����e��u_��
������$!���
�G�u��^�%6��gS�������G'`�[�OZ��?-s�^���V�7�W������z!u���S�F������-<����aY}�V��:$""����om�����v��)�W�5�E�@C����-<���Ix�����l���T�����I��N�:�3�<c����4��O=���.���K�.v�UW� o��`���v�������~�����m����w����.�b�"u����_m�]w�m��6~�x��@�	&�Ad<��
><:w�{y��	E��|����3�M�V)��I����9�M�Y
<X�]������c��J��c�T��:��&�����.��?��������";��"�{Q(:���O?���-u��,��3��jNQo	%�p�%d�9��ctr[XJ�N����$���~9:�
��DCS<t�-|�'O2�l+m3��kM/z����,2����m��C���G�b��;�TKm������@z�����l_�tt������Q�&I� ���������N=�T7D�'##���������C�������G�aN>�d��R�D���n(��;�
?1u�T7]4��1f��i��v�!���Fm���Xw�u�<���4���
���U�
d����8l�gWXf��6���������Va�r�o�������Bnf�J��-�Y\qY��^D���F=��q��s,o�u���:�w�W:z�U��e;�L����d�?���2�=�my�]���,�����o������X�;oZJ^����nk?tT�6{k���p��GC6�O���/[�+�Z���Y���
����w��{�[��vCr$B�m�zm����hy�M�L+�Eiu�����~`EI��&�����c�=l�}�uA~iii���c����`���T�9s��^
z��e={��N]n�M6��v���j�j���@���������a��KjBL�����a�N\��������;���]f�[n���D=�����E�h���zKHXJdy����~�-\^n���eF�l��E��w
��3�$�����'"�,��A����.)v�G��n�o�j��T����<�j���f�@ �"H�"H�4���Q���,(D��*l`�H���"JU@z�R�@��2����$�$lB6��=�33g��'[����>5���C�j��b$�,,]E��������DDDDDDDT���uR�a?x�`9���z�n���B�F:����zH�:������������s'7n,KL�=z�������Z�����5k���o�������GDDDD�o��^�����Xu4�t���-��>�-�[3cQ3��EDd���1�F������`���o��6��yK���^)������R�8�'��*�M�k��D�
s�`?R��\R8���S����[�U�R�������`�^CN�k����-b�:$'�Z_�dI�S������a���x��Gey�x
f��<q����+�$�E�N��XP��#"""����z/�.��l�a�m�I8������H�T��Fx����?t��^E +�~�`�|kX����%�t�����-��%�2FGj���,��3���J�]�D��
�?C����������������HO�����Y������2U�Id?H\�@F:,7t���b%m#Q�"�W����=ZNb9�.���B��Ec����dB��m�f�|�������+0@*T��l������GDDDDE�f����ryP�{a�s���o�z��*�9�%�����_�?G��L�����?������]����Z��3����$�w��Zkn�[�\WA�����e���MZc���x7������V���9�@j25j�����<Rno���m�����N�b���.:qw���`��]NDDDDDDDD��ST�2] ����*��[����Z�Jf%:t(F������G_�5������^�K/�$���>!�}�����vm��X62��e�G�)!q����o���~�i��f��b�n?����������	���w��+�|�w�1�x��D�Q���E�ks�v�����y��Jt>D����nx�
�d���Ma������yP7A�	}���*\�q��y�756��;�7�3l8��K��a1�����
�k=R���3^y���`�7��(������xm$<��1�E�=}�-y��������
��M�V���d�=Z�>3
�o@�����^)33�L	�/�K�N�Q�'�9�z�m8���Y,b�U�-���W,G��#�����x��k%�ii���_��c���Zu�^�/��>�#Xo����GK��]<�b��x�
���������~�z\{��x���1u�T��~mO"��O<��I[}%| d�!�%�)�M|�6t�IKK<�@P�2���5�����.��i�On8���;���>������r�f�BU��9eW���+gj��OA�E�����>u��`��\�"�oY!��9{�vT�o�x�\}Be��k���MdN��oa�pGv`����������@�k/ ����k��Mffdf����``Hs������Uf����+N'��F�Of"���r�������CpL�H��������Z�8X������Q�!B�2={�D�:u��7��V�ZX�t)�v��^xA�l0����X���o��
R��;���t�n�-]��m���j>���ta|�m)���r++������x4V[+]��e�o�#�Z��l���'�m\���.G��H���FT8��UC�*UN����3]H�R���	�u28�'����������n������B�8���������r������u{�xe��o�g�92��%�=����}h�(�!A\��v���CHOO�����iU�VE�J�
|nC\.����������.��!����,�/_5j���zv����G�@�pD?�0l�W|>d�W���;����S��9����+W5k���bA��G��)�����
Q�����,����x6����������%3"�l
���,J	h���'�VO�:%�/E�����P�;���gd��tQ6�3�&��-A���������0\VC���k�_z:[4����2 !����O�"��.��r���R���]X��	�^|�t��?v���.E			�����������?���;�x���L0�o������z�V�������g�j��}�����'�WJ8�9�%����o��w7�M������\L,,����G`�RM�#���I�~���������(Z�j�-�"T�z���Y3���O��'��bJNN�?��e���r.~�8��>Q8���]��4�L�iKT�Em�[[*}����D�%��th�Zd;�-�z�2���>B���x�����Q^�W���9���������;\r=��z���G�C�����|�����������N?61h��w���x>E��'�@}!�AD�6�@���D�}���L&�|&1H,���3�>�F��xU��uz�T>��A������w���=;�^x�t����v�x��m��TTZ��<���u�:�p�����D������-��5y�\�y�����������| �7��FM2�d&A���A���nE�@k���#R`�����\���Bff��vi��y
��%YS& }���m���`�>����u�����������������B�>g�XI�<��
"�	�.������W<6���&�DDDDDDD%�.q����?��7�����48�
����q��q|��wh��8 ��C"3���"'�C��!C��������3
���Wuz3;e���ld��X���-���o!����Z�E
�]F}����~9[.J��S����>�.sq�k�]�2����VD��[���\�}<�z�~�Zs�k�q4���w���z��N�c���tks#���~@��I�����^N
��|k�����&���x��&Jm<������,P�h��o�e������>��3@���(�������e.b�������6r�2�x�fW���'3%�$�b����|Q����.y�Z��������P��we&:�k�<dN|z�?����>�_��_}���@'����U-����)�8��@�}$����|{v!��'HO���@D�[=�^/��dN����xE#��������������J3 \"�f���j�*9��W�_����W�~��2u� R��n�III��3�l	���C�v�P�n]�5�}>""""
��^ ���"A�=�I4�����z���jP'����6�W�6���Q��Vu=�������k�0�d�����(�Z^��;���[|�����yn�6�������E��\����yB7?��S�O{��yg����]~�@e���d�{��L��"��A_!^lN��������2
��\ �_�8��t�\������A�����l}��������a���-���p�L
�kd���7�"���<����S0�r���t6b�z^�v��g�J�NDDDDDDT�p���z�B�Z���{����~�591_�t)�.����^T�PA.���b]7n�8�]��t��(�0r�Hl��
w�u��c
R��#"""�����*���3
�����d��7x�+�� �?���%#�����T3^����b����%��������I.�����b�V��B1��������6�8,w��IX���������Rp����
�������<e?D���>V��� C^D�������GN�B����_�?G���.��m%j����Ax�X��f���)��+T,����?������0��Fk�3�����E�������M�����"�AN��t�`H�"����w�6�h��F����������� 	����DDDDDDD�'�N��};RSS����(g0v�XY���;���W^�n���y��]e��o�����[;"��k����>��[��m��������}{�h�.�A={�����-��Q�q���w>�|DDDDD��L��e�}2A�VFt�*����x��	
��e��_��Nw���_�����J��xl?o���nif��(���h��@����,0�@���"��]r�����n�K.2���o�;�-�n����u��}��2�m������E���v��wB_��������
�?C�������Zkn~-��X����(�2AW�tf��Zx��
%#C.�@��j3���#�6���
@p:�x��w��G:tHk�x�`���{���~��a�d��%K�\���C���h�m!b�����?��{��;w���
p�����~��/������d�������.v�,V����)%D��&5��'�rg8���)��C������c�>?bu��Q�SP��O�(3@�Sp-����=���{��s�L�(���VX���@f&��=����"��[p����9S��=p��`��@���p���'�9���E�)�O���s����� �qf�!p2�����F�����*�H>���F��������g�=��G�=��`T�,������������(Dl���������iST�tq�y!�7n�	&�l�����u�.��E���c������dv���,Z�H�Je���������3�|DDDDD��*���< 
���RyI�.���O�t�����`��t���o���V���U�J.������2d�&#�|<�)� ���}fb������@ -
��U��S(��$�)!D��[��0��}�����p-�#3'��\�+s��t|9M�������M�
A��{���{<�VTb�Z����7KEN:����:�����2�E.���������*�a�v;�x�	�����O>A�
�-D����6
��������BJH,�A�o���~a��V��o��f��b�n?����cZ�3�O;�W=;^��Vv���/�]��Ck-b�M����c��Sd��ci
����t���{Y��~v��O|���5*��9����@�:<|�5�Z(��'x��;���YqE��DT2��F�;�A_�*��}�j��-A"�@��0�k��'������`�]��������7nr� ���@��OAQ?OE	����D0���/���9��&�Q��w��1���>��
�`�����%�9��L0���zf����B�/?���Z��D�Wx��+%h-���
�G���{c0E�;C������nr�������,������?�0����7�|S�a�V"""*M"���/\H��+��!�
y-qMqm�8�������NZZ�����)�%�)�MTDx��I��Ppum�*�i_r�=����	b��.?�������`c-��C�C��!�W�Qi	��l���Y����m��n��R!��N��z������w���m05j�=}��������K�dG��p|�	5��m�Md���2����Od��X�O�"�b]�;��4�f�����Vq��s;��iC�Y0�����?��c_�Gge� """""*#"�����,l���������Q�fM\{�����[�����q��)�DDDT\D�����$�)�M��@�AX��5���J��?��m�	�:�h���

��t����I
=>%3�$����[�C�K��D��E{��~����tkf<�&^"*!�-��5y�\�
LM����0]��fW���=;���/p[��P~��06���.Kyj��m����n����~�q/]��?@���OD�9���1�f/���`�����y�\Y&�����X	����������V�����O�H.�<5��'������}~����J\��%r"""""��&b�n7��������ZK��U��d��<'fI ""*�����n�v{0�y�����Y�J["*9?��b�R�&��fA��������	s�����Q�[9�]	�l	����j��`�����.��Er��&5���@D%Cd���1�F��������F�,���/��?����6�0�s$,Y%'�,�<����]!��:��Z<_]��g��n�.�����
S��P\N�W&�5�D����}T"������.�!��]����X��o���1�W,��������(�DlB�
0c�����=���qDDDT�J��B~D9�8�F����rD%i�?�%3��`B�z��o^������o
KdM��v?�:��U���/Q��:��q�"�~���
����� ����#���s��tFcp^D��)�n\�5
��-��K[(��(sal�\k�&��Z��@J���2�e��@g�i��'�T���es�k��[%�]�dd@���0�=����e0A|||���_GDDDDDTZD����nx�
�d��Z��-�#D��W��n�[|8�@�Jz\[��D%���_�?G����>��A_�2Pdz��=Zk6���2HA�5�ZO�ya�x2�����-���h[.m����0�3T��;�h���������y���!t��Ag�h���������?s!�m��Zs?��T���5ef�^Q���c��
��(� �����]����N��;��pgkS������w�ONw�lg����m�X���L5���������A����;�E�|`�7��,0�@����i�E���)�ck[���'SH>S�&0��C�`����m����@���������}�J�~���E�����2A</y='��F�h���J0��I�i�������y���e�HX��}\�+%@g9;�A\�������0��#CQ���������������G�FVV\.�y�:'O��� """""*y��x�{R��jc�#7�+������x�����@d/8��A�WZ������o;����7!V��_�v":7������P_���s���R�t�sr��<H}���� �W�	�cp7R{���sR�������t��C��E�CD���Ic���-�N���������y�o��@>.C��(��{0����E7�|9Mf������M�
A��{�\��g����2�\{�
p��0��%��?a��*�8���������@��|�:u*z���+V 66�+W����0s�p��!����x��Gq��)mQ�I�R0v�[�lu��A��m�Y>H�`��� �4���y�\�Ph[7�������^k�^����G=��M>���unjD�8�1KT����$@ 5����N"�A�.&�^���a#a�V����>'��-������_��w��[��e�j���_�_<�z���Q����0m�
����������=��|�s�W�LfO0����BB�$,]�
S���n��B���@����(<��Mp|������~���A(DDDDDDe�N���+W�D��}Q�F
L�0M�6�����������8v���/��_}����(\��<�����ld�D
�I��R��r++����������.�7������U��2��\������W1��Y.��#�cEP��c��,�_���0��m��[���\2�A��zL�k=���x��v!���;�[QW������^�32�y
�(���S�f������#�����6���i[�'�2^zFf��}�eXn��m!"""""*{"6������^�7�|�~��[������O?�+A��cz������^*X�V�Nt.P����a���_n|����Vt��0c�kv�e���cZ�3�O;S����oe�H9����kV"�ph�%C�,�������
���3b�+��g��t	 ��8o�s�{�����"�@d=����*d�~���.�`�Z/�o`�����#��>����������sfb "��b��������������mCx�G���?G��`��>�~��<_��g�:�?�~�����Bg2��~g�~�1�[����:��g��C�x�~��-����
�G���{�>	=[���\��3�����.]� �)���+V��)Sd����*�1�l':����������/7����~+|��.�}��u�b��������oe�>H:���������I�":��&�/�;|�������y���]�����M���1���]�{��3]Hw(g��c�a?>X����YFC\�J9�jkB�V&8vET�r�k�[�<����(���z ;g����@D�{ �����8	�PW2hQd�}(�_��aq��d�6���'��o�����o`�tj0�A{��HO�����v�<=:�I;����������	��|��l0�Q{�L:�C�������Hf>(��A\S\�."�Ai����D�I��5������?9��O��h���u�.���/�#���%��I�G���v$ ��c��u8��`�R��j!�AD%C���9�U�2��sA�"�����2b��L>��^:��W92��c�b��v���{�"|���E��'���D����J������Gfl��Q.�G�Gd�(
qn����r�S����c���g���cs/_�z���+b�ec6�Q�re8pv{�w]���a��=rqA�]�P������B�]�P<�ViKD�c�:/�o�!������&������h��:x���?�X����Oq�M����Nf�	i=x��
=��� �1����S?�u��a���K&p���Re ���g��=Zk6���2HA�5�Z&2F���
�v��w��Aq��Z<_]�>3��!���z�z���EK(.'�+���y�'���}�x����Z��J\$�a�r����4�>�5��|C�����`;)�|NN=�Rn�^fFs�.��sE�iD����]��r��>�z�|{4Rzv��H��'�W�+��@"""":��-Z`���r��R�����_ 11Q�/�#"""�`��%��o��p8�������DE��T�l�O�q�leD���K-�ru0�AU=�>����Q������\��+�?h�q��6��5�k`D���K-��"� D��o�N?�.�����3��(y`����}�89�-���LP�=�mQ_��,�?��@�	�6��ism�?�O����Yk	��&��w�_2�B�|E�>�O>]t�9����
s��r9��,�g��>����TDx��kk[�$����}Bk�;�oG]7������H>��k!}�������W�9s�.�_|~p��R�����b��p-�	P_����������~d��*2'�!�ADDDD�/bDY�^�z�������?����c����x<r�����M���SOa�����k��{wyQN�.'�
�&�y��K��Mj�Of�=*���T���	�U(�?������<w������d�`W�u]�@2���}�D�u�k��p.R��@j��yN��3��/����|u�`9�w�;�S���������r��* �������!����Ic���-�N�w�������uzx��V�w�Y�MY����"������P���`������_�7��#�g
�^0_{#,]n�ZA�[���Yr!��}Zc61x���E.��4�s���"��1�#�N���fY2#~��� """*!� ��]�����������Y�f�������?���/G������a��7n��������������W���D���64�#AH�.���������P�������Fo+�|,
���1$gS@�����DT|���$�wQ���;��!��X�{}b����Zuy��z��-������_��������5
���dYC����-�U�1(�c8u�����2���D����X)����)�n\/�{S��Zk���b?Q�Y'Ef����<k������v�M�xi������e�� z��ICR�(�a��]��p-[$�������OD �^{-�.]*D���D���1c�d��o�^k%""""""�M�:�Z^��q:��Zc��l;��E������9K/<����9�E��$��d��(����t���~��x�1"*�^|	�k��l�iG����z���YHX�J���"�<�����4��W�wHX�;b����!��g^+�I<^
�����4������A��K/����q���m����������v���L�A+$"�t���}�*2�oC�jZ�F!\�Z�N� �`DDDD�-����<��3X�j�^/N�<	��������_D��5�=�������
G���q�'2\]�pV�����Z2���n�;�P7A�nW!������e����P�r�x8W��p���!��	U�$��]��.~�_k�,$3\��*���r.�F����q���
fq��V""""*�2���Q��X�B��f��������������o�}2;���f��H�p����f����df�b������\��F�;�AeC��Wd���J��BT��?c��*�OB��/���o������.qR:#�]A*�pq~]T��� 26����EQp��!,[�S�N��o������"++�FQA~\�����M:���:	���\��E������`P��;�����	Y�����'���I3�RR�����zKwDu����s�l���6R�.P�""""*y�`��O�X���3��#F�;��;W�f """""":1�?-�+���/�������N���M�W����@Dt1�/=��@��Q�t��m�&�����4B������m����T�g���\O��_���/*c�+�<�|��Q�.T�""""*y:E��P_�5���#66�:uB�6m`0�'H�����11y��":S�7�����ld��$��{!%$���"�-���o!�������h�o�����H�~+�|�w�1�x��D�Q��!��X�[�����0����s���u��NfYZAwF���7���Bw���+D��^+.�^��>xa�)Y
z�2���f">O!��%����8��G����>���������{K[;�������]����R����L������hxwlC��/���:mK6����xu���������'���.g��rc&���B�q�������Sse?�x}��~�a��
�Zv�cD����������@DDDD��?m8$%%�V�Z2�����1r�H<����N�>�(�������4"� m� ��{IJV������v�eBY�lc�3�@0��6����B��������y�(�Y
��s�����0���|p."���>���nc�2�N���h�/Pd�a?������r�h����SKS��J/�������J�:���At���"@ ~��|'qg�`���\�{��|�����G �8����Zs���*���
�Y�r�r���DDDDT""��
���C��}��2��.�LQ�D�������D"��K���jc�#7���B�&F�j�wj^3�����&�>mp��?��]��
F~����\[��{ZO3P�D9������7��}hR�/�!�b]��r9���'I���mG2�Cc1��1~r���.y�p������7����g����)�0�dQ�2��9�U|`�7���7��|��C��	�n�����FXo�&������uY��FP��U�������L�v����t�Jg�+%��?��D��������*Z+U� ��z�{�6�M��������pD����n��9rf%

>8_;������~�%��QdY|���/��0� s�y�|�QfFt�`�3�2���a�2����O/V��~����5^���Mf�o��<�8���~��^�?�2�����H�TpY��1�Y�����N���
���s-����=���{��s�L�����&��s���8	�#������������@�k/ ����k��Mffdf���!Xn�Y;�BDY@�R��~�`�|k�$:�I���9�2K��b�_I��,��c�RM�'S�������j�;�/W�X�V""""*��
@(W�Z�l�={� --Mk%""""���>�����w�t�%9��`�����Oi�]��(�iD�1�/���{�w��IyO��Z���v�"�������{����=��^����c.[��g���?�~��H$��e�s)n4����.WO�Y��u0�AU=��`���%�d�u
��{��t�ql��F��c�O�sX�?w�H~��������Ff>a���P�r���Bt�QB�����B~���_T:k�����Z��3gH����!�����a��5����r�u�.J,������3c�&2��o�v�Xr�+D����el���XmU��K�`0�O�>�������HJDDDDT�D �S_����'��.iY��lq-qM!��.T�_d�;Y
!��~���u���AxW���U]��x�����r.\���tR}>�&�.{��x������
>g����(�P����q.�^)6�:�\���0��(<p����DTz�����5�;��%t���U� Dy����#v���K)���W�A�;SQi���b.�E�Yo8��^:Ce�[��Me�J�'��$����+�N\$O����������NQi��0�����r�������F���7��.]��^�z�������Y�V\}���0U�I��w!-�-��u��GsY�~����[�/7����~+�[ne��D6p!t����z��.�~+��t1�#��
��W1F�g�������m>�jc��.f�5�m��.l>��
DPAQ����e6��.��&s�+p%.�e��,�`��/�z����-��Qp'-E��
�3�G=
���`j���z:[��GDpB�����(t&tq��i�N��}=�	 ����������G�c���&| �X�/��2���{�>�I/�CDDDDTV��^*���n��	| "*��$Q��Nf �+��X��mG����Z�9;CBN��}'3��-���_E�-M�V""*n�P:C0����>���m���^��0�����_A��!> """*&�A|��WHO�R`A������111ZQ�xghn��7<�����������������-<�������J�k�"8����SZk�����A�}�a��Pk-�/�����������G����^����cL�70��[-��}���������r����?����������/7����~+�[n�����..�����{����vk-�Cg� n��2���z/�.��B�o�gE���=~����
���p+������]������7�2���.Z��y�a��~���D�ze�
��=!���`n�:�w����4	��7��e\����FM�����X�#�C����2����8���(2DL	"""""""3�(��A\S\���M:���o��0���������h<�������En,���3DDD9)>/��L@��'���Y���'T�s�.�_LE�.;��iC�g�j�$�������~d�}���&�]T�q}<YQ�bQ��Y�-�>��U�Rd[���iI��ALh[/���0��{�1�S#|`��~m#�-�?�����(��DT�����Qi�R������E���rY�nX����r�S�Qi~�<&�����h�=�����K�>E!����E��
@HMM�-���N���Q#�q�3f�m�V� """""��&�phK�O����"�>3�
�W�#���WK���p]Z8�� �������a�k�|u![�0��!���^[�~0�h	���{eR�]d?X4W�Y�����w�}%�Xk�[e�8�{�r�W��C������B_1�zWh�DDD�.�;v�������/��n���~� """"""����cL��
�G��mL������HNv��g�q��I,;G��02?$��8�'�.:�����l:��f-�r %X
Aq:8~\.��\�����v����S�RS�K/�LE��G`��������"Q��;>>,���c�g�}�v�����A^�����[o���+������c��w�^|���HHH��#�~�z��DDDDDDDTV�K���]H�R���	��l�3�@0u��4���������`{l�Q�|ND�M���v~�D��vtz�.�b]��w����~<1��[�����}�80{�W�maL
�E������s>"����0Pa�g���w0^�Pk���k��s]�
�^���an{�l;S(XA_����0B����K�[�V"""�T�/�L�8Q�7�����l���F#j��-��}|��gX�j����GyS�N�����y�����#QY���`�<�>�����Ad5����2��
��b��o~����:75��Cv
�-�Zk�������A>���qcr&#��s�.�?X��� �?I�`�W.l;����:KW0e��g����%����.����z\�-�|S=xuv��GDtQ��e��b%��g�9
�L�w�z��Q0�hlT?��q�����l�Aq�����~z�[��!�9K/�~"��D9��������!���������u���C7���~��������Zk����F��'�r{��c��	�o����Qm""��El�����E�p�����[oU�����D���b?��8Nh��
:w��m��!++K�Q�#�.�>�^���{�w��
yM�����������p���w�`��{Lt`��`��M���Q�/��
b���>|���Lg�?��E����>R��A��^���1?��Q����]=��Y���%2L��n��g�1k�
?���3�z�zOv��o;}���+��������aH��c������P���j_���c��O�0�?����$�j�|+�3�����/��� ,7t��qSmC�\����O���J��K/���P^��5e��?	�����
}B9��]�� ��|������w ��q����n(Z� ����6�x�������j���?�������.j��p8��~T�\V�Uk���.�����!�f�!33>�IDDDDDDTV�R������,���d��J�������;-hXM�$����u��X����]�W�fN�^Q��^X�}{�Y���%I���;i)���� ��ls0�D�VFt��x����CLhPU/DD)A����l���}�3�}q�Z�b��;�j_�d���������-��8��~qS#|��F����AQ���%p-�C��a{�a�#��%�-�����cc�������-����#�/��?�����QiN"�g�G��Ka�?X������7�eA��8��C������v]�V���o�.dM������4?I}?k),7uB ��p��iG��(bDA��Ay��	�\.�5ob��O�/��_����X��#�������.2��0f���;d����zL��k�k]���g����aM�.�1����S������b.�E{��A��A�%#��J/K��y	=��k*Pv(Zv�����r@!���'�
�&�y���H���F��dVp�?K=&53����!����]���9w���#~��@�Jz\���!q�P��?��r0��(?����w^�.������P���%"� ��g��Eb�x�&��-����#���(�����
�:A���w?�Z�����+����^c��3����>��F�e������� 4b����������0^���;�Y�R���)bG�cbb��qc��3?��C�Y����'�����C�a���h�������$"""""**��N$m����%-�
y���p1�((.|;�����Rz<�ViK��Jy=&��'�mh�G����b�:����/�B�+�>&93�^��������5����(����b����4]�D A���r9�@�Y�9�U23a��,�j[���
Oq8�O>]t�M�k��t+��Z�e�� D_���3Qw���|��ZD>��� �r��g���[�k/�$���Z���b������5�\��~��5k���*���d�\�C���O>)������v�x�b<�����w/n��&���w?����2uxis�ym"����f�1�sm�t�r�Dd�Z^��q:Y�L��l;��E���N02@�����e�������Z��/���n�,H(�B�%��+���bR�N=���@DD���b0lTX�"� }�S2����@��0�n�0x��.K/����	�#�s�\�(?$��$�S��W�A�K��Qa�g���w0^�Pk���=G�Zu���)7���,!�b�]W��G��Y������W\�w�}m���_|!�*U�$���+��n������Q#���� �1��;IIIx�����sg�lDDDDDD%k��0
���u{.@��b��y"LQ���<8�����s�n�;�P7A�nW���8�QAf1����� X;�z�@�@F�<FX���+
�����J	�'T�sw���bb��!�R��q�Q��E��h�W����x7���S��Zk13���F�g�9]�"�S�]�v���_0c��s�=�X��l�;��_���.��~?Z�j��~�
���g�"""""*5�Qv!?�QY0�O/~����u4�Y�Lk��1k�OfF��F�'-��U���;�m������X�b{AD���Vz��>H�h�����OLw��q����-;�Nq`�Z/��@DT"d���@����a�3���"O��������� ��y�����u��1?��|��r?�]}�z�����w���f��r���rC�7�6/��C�zr���
YJ#�q����V���bV&�E�}������N�_P�*1�?>����\A111<x0���z���'"""""""�?��b�R�&��fA��s�4%���u��U0��	m���1�����5������?9������X�,��� �>T������?p���yp���@b���?I�`�W.l;�4��f��X��)����Y.�X�����bn	��B����n�KfJ��Ox����5e��6k-T���,�k�|�_�%8nb���,� Jh8��\�c
�w�������@�����t]�y����������4�@�iI��!�
$������pz�hm��Z�N��R\N8�������5������G��{�v��4g����N��n��g�1k�
?���j_��b���!��
�L���"%S�eq:��=[�o;}��&�7��Mf,x6�l����c�_f� ��c�:Qf1���u-����=���{��s�Ly�������Y�'����b�zo�<Fq:�9i,�s����IPv�N����gd��tQ6��j��-%���	l������4�W�`���
����P���F�Px�Z�SO>��[�~oP�b]���wQj�9��|?_��]q���.�p��)��@Lb9���[�����DDDDDDDD9rf1x��9�@|��LR��le�#7��u�Y*j����9�r"C��9�~Y��E��YRD�rw�R�
�A�N�6K,�leD�����{�x��	
����K4����*�����&�|��/��n����(������u
��{�I^[�EA�v����~x�� ��<)>�u ���@��|����C�(�1�N����)#]���F�����#�P�6tf�l�����If�b�x�&��r�R��m}B�q����JT"�����6[�~r7}Be�l,���(Y!���>��bU��*r.�E�8#A	8��'�����>�}����(��|Dti������u��!9�����%K��B�Qd�u,;���mLr��\�"``�<�>��
��|z��0��^��]�s�Z\��Sm��j��x=dij%Hq������Y2]
N����4�yv�
Q�I�`���U�t��`���J����s�RCjf��m������]������/"*�^|	�k��l��c�<��yM������A$,���F�] ��B����������Y&b����������j��
*L�	KV�I,�6��?�.�zW�9es/]��?@���OD�9���1�f/���`�������Q.��d�z�!�?�@�L1��C�j���+����+bbbb0z�h9����/���:���������.<������Yz�	/�A�]��o]�}<�k��bO+�E,W���A�H	`��Xr7����_mw�W�i�,y�ni��[�-E�*���< 
���YB(����%��b�U�7z[��cQ�xe��!93����:�?�C�9�U�2e��������L�Y���^f�05m��� 2E��W��s���L���#L-Z�2Q��I�vA��������X�
c����"(���%+b,��k''�Z���C�S�X""""""""��rf1��������n|���/���|��ho��Z�7w��+k�epA�C�������"� q�+w�aQ�s��;�'������J	�"��6Q��Nf4���?��`���s��N���K�GB�(���%2�$�VV�����c8�������_&�^��?XfG��(/`�x2�����-���h[HP���Cc��Zk6��
s��rYd)�W����LA����/��]q����~������|)�^���m�\���3�f���E�������<&�k;�|�^��^�w���H�qs��0&����#�JV� ��C�]����>���wM�{��W����^�������<��?��1v�"�%
>^�A�3�G^Q*��������!?�����=&:0v~�,D��F�� 8��x<���&H(o�7���<8������@8��Vy��Xu��vUQ*DD�@F��| �l���%|�?�YS&���������
�k�Or�;��G�3��H�W�G�����g��xEC�57�x`�UG�)2���ZH�$|��`�B�PE���hw|��YA���6d�|]��R��}l9��G���"s�����3���� ���TY�'������ET�">AQ_����e�0u�T�����N~�!�J�FL�6���"�(���d�����LW����P��2��������q�|�jz��k��W`2i�cw��;��l�n���������W(O������>��`PG3L �`�?f�����1�F]��{��.4������P�]�"�o�������=S;�������9�[�?�$��I�?���H��:�z���5j�����X������� ��WpF��-Zk�	�K���������QiN"�g�G��Ka�?X������7�eAq����i�`i3��Y=f���s�s��/�w���������|+���Tn����c�+`���O�tDt��n��/���5k�s��2dF���4w�\����X����������{��FF�5
�b���y^�����<�h'3����+�,y������{�X�l������z�1��A��v���-�?Sn?��b�R�&��fA����iQ������`P���0��"���R�H>�����~#�7�n'��6��
���m�&�/����tuk�{e,*L�����P�6_dg�����M�
t�������B@�;1��!;��^[�~0�h	���{eR�]���[f@�	���7$�X�5����;��e�d���x���P�nDu���XmQ���P���o"66={��o���c��;�},��?������������(���	����d��Hg������/������,�!Jg�hm��Z2�w^�X���}�������M���u���X���^���;�����}�80{��tF���r��'�;q����a�F_��GD+��HH\�d�7H;�l�����N'�;$,���F�@�3�c�9�g-A�;Sa��f�]("�/K� �����=�p��7]���q@`l�\k���Xan�R.��o��#��T�Z5"������ ���m(��]������������V���������Z�j�@���gc���x�����}�Q��h�BDDDDDDDDD� RHg�~^��Oy��u��N�2�/�^��BJ����Lx�f���)���5������_}�D���h���u���2�YAk����t����W=G�M'��KW05��Wg����!��I���ra����2"�����a�O�B����R�^�32�y
�(b��C�����lF�����g��xEC�57�x`�UG����r.�J�
(��UT�<
��t���<��������<"{�(�ATZ"6��t���Ch��=��i������ """""""���5u�,�@y�u,;���mL������S�������]a��7�O����~���o�fd�wR����������2^����#��u^,��C�Y��-��L4f
���a����z�z�_.�o�X�A�KA�:|��
��#���s�s�������E�s�Z����Mfy��c(����.E�-��5y�\�y�Y��4��A�z� ����8�����l��Ek�5;�>Tz�����h�%AdX(*�?��NZ}|���k�D�#b���h4�f��9��u����Yz��0Y��
F~����\[��{Za>��B��r�al����vw_mC�S�2�NZ����".!��`��`������r��t����:����n_�DC����=�Y�d�sA���752���_�!�%��5�k`D��L��EB�k]'x����� ��(�>�x�(Nb����cWm�����i�>(����(�Md�$���5jj�D�#b��+��-[b��=HKK�Z����������c�^��x��S]�S�	vy-qM"�H�3�@I�<�q4 ��29�;��Y��_�]}^�a9;��:[���\�i����_hk�Ad08iW`5�k��l��B����j��l9����������.}~um�"����S��#D���3%jU���7#�+�s>���H:8���1Ez�
"��������o�7����<�L��\���2����BI�\����.��o�J]� �����������>�:'DDDDDDD��O}�B�V��*iY�?o���5�@D�J�]��H����5)���_=r����y���>|��#���r��v��o�[��g���?f�v�����\ym��x����"C��zL�O��,�A�9
������`����,F��+�9>'E_�t�E�\����f�����g_����Aq��8��Z����DD!�$T������������A"�@�;�AeC��WJ<(2/��D����u��}�(bD���U����tz:~�8���a���������o��&�>9'q<�������0f����+���3�k�kE"�%�hOw(�B~��<~�w�����^Q��"���1�����vh��PZ�5bP;����jy�����q,M��#~X�m��dG�2D[�~�*���b�EfA(
���N0f�[�Q��=Zj���������z	���DDB #]f>��~a����<����)���Yk��"�gdM/�c�x�&��ri�O\���k�;J=�B��~I��s��>��~w��b��!o"kS��'�r{��Y�2�
�����#������M]���C��P��TVELBVVF���;��F�%��X�/��2���{�>�I/�CDDDDDD�5�/\
�u{�kpE���Y�ldtX��.g��:O~����G;��dD4^�e�u�8��k�7���(.�:9�5D��I��Pd�G���4e�G������9����{}��c�e�f\��N���i�+��������A�`\�"�o�������=S;�������9�[�?��Qr�g.5��,��g�s3l,�j[r�WJ�sJ���I���@���h��s��+|�v���	L�[j���t���I�k�������+��Dd�H���]b�\�'TV]p-�ImP����k��Xy�8�8�>���#s�+2���+�7-DL��bA��=1v��"O�xq""""""�p�F����rDDT|D*���$�ZH����m�!!V�A�y�Z(	��@1��"��}���/�%�G���H�\AD$(>-0Yd�IM��c�M���7���Q2-��+�P�6tf����2�����k�[��`a�RM�'S�P��H;�~.:���
9�)���.����{Bg�����w��z�?��->���@WA��7��]��:Q}��a�?��'!~���Z
�M�d e�{�HO��(��>b�6Ef?/�s�����(��D�����p/_�Q�DLBLL}�Q<���E����<DDDDDDDDDti?�;����8Jo@;������K=0�tv�uJ�'����5�&��F�lE����X�%8�����7���"��Y��@B���&1����y��G������a�������#y�|���d�����a�3 ��Av��������^����z|>4�>&V���ke&
C�0��Fk�3�F�4F�������7Y}�jj[����2�@|g�����>�}Jg�!���a��|�w��z�l?����>(R�>�E��������K�����<k~��1�@DDDDDDDDDT�V�6��{��Wj����5{���L�;��	m��R��<��=�������`�^QI���V]�5�HDDTF���E�|`�7Pw| ����qS��B���D����p'.��*���:���>dM��o�����h�^���N�+V����DpG�w����@pN�s���M.Z��:�I.�������e����5Zk�Ng��TY���X#�df@q�����p��)|���������8�8�87��B��������Nf��e��C*�7R��.It"C��D�u��B��*�htY0��z�LW����w�	����,�O�(3@�xt-����=���{��s�Ly���=���a�Z
�U��d����w ��n2�B 3Q=���E+�� JeN��oa�p��c��m[���>�2�b0����qC����y��u����<��L�j�e����yf�<��^�����R)�`00�|�j�
_}��N����D�����q����s�s]
v`�On8=
�lc���M���Y�|p�)��Hp���)���`5�`w+x�����2��B~L��uZ�16��R�(��LM�����iC�����~<1��[����M;�o����p05��Q8g���X;~����>��vJ"��������� �|<�I�g�Uj�A�	���6�bU��@ 3�����+�8$W��������iT��
���i�q����r���Z.��m�b�~G�Y�%r���0�����e�I������.��2b�/����'�_�}��#���	@(W�>������?�8����7{��U_���f�S_\[�n��1c��I<������;>��cyn"""""""""�����^����,��������A7�n��H	`�zlNb0|��x�[Y�
���F��7��`��<�T��	��F�dV��-����P��;��{���91k�7��!?��b�W.l;��8��>��]~<5���{�������I����D���h,&��������v�Sp<�%���o !qMX��� �� Q�?����4wYp�%�P���`�|k00/'��\�wHX�;b��������#^�������Bu��e��+d��\�Q��=�J�D�x�����8�X$w�)����P���6^fJ(�"&A�����/����$��_�?�<�����u��w��x��71g��]LbY��{���R��<x���q�u�a��x�������������.6��d�����N���zL��k�kE"1`=v�[�lu����z\��P0e������N����]~X���M����ho���9�-�thl���"��
>yA�����/��2�A��F��H?�@����%h��`����|Hw*�UI�Xk�������������������:��c��-D�djp���e����Mf�8L=�P�:�aDw�Y�����@DD��M�e��+���s��BP�.���9Cm+$%=
����9Di}B����m�c��0��H�1� ��o�-[��?�������Dff&���;�5
�z�B���$�E���/�:t(���oY��y���\DDDDDDDtq�O}�B�V���a&�
y-qM�|e�'IDAT!Q$ev�?-W���}�!�!�5}��G�g3��DW�ct����OV���@����,����74���R�Z�
/� ���|ks:46��>����z9����	�5������g|��/AFd��]����
��YQ�\��m�o�_4�i��7�e�� ��a���z>@�������}v���}�3�>���]���c�O��Z�?��
DDDS�&���W.�)�� �Ow���
����P���.%+o���a����� ~�|��Z���>�e7�&��/K�#���@���2��O?�����n�:L�2�=��v���o�]L�6
���=�w�}M�6����m�*��K^��5����"M�F��YNd4�������B�jz��k��W`2i��"��jy�l�n���~ ����tP���P)�Y=��Y���y�PI�_�����N����'�Y���y|�jQ���F�L��| x�8h���A>�9U���M]��;�+������(�P��.W_b]�S8y��DDD%�����!��>�
�T���HM��v]�&�}Be�l�r� �����-a�?Xf@1]yb~R�|V�����V(k��H}TTZ�j�������?���D�-`6�����������R�f���s���&��3�>+���k�%���5��x��L�/�'�������M���!b@��Nf,�WzYN�R��72�A�E���s�.�C���4������
�����
���P'!�i�J�y����Yra@��g��y;��?����?""�D�����������d����h�l�S�b�w������5���I�\�!�&���P��������Zv���I�Qv!?����8>���?�Z(\�dC(�A��PDf�}'3��-���_E�-M�V"""'S���^�M05m��L��u�3�8C�j�N��\��/{��@ """""""""�R���K��8����*�(�5+�_��/3�$����q���tz���o�1h��������*�4Q������d���e[7���X���{�o��8�o�v������R��Zv0�����������J�����?�O[����J#�&`�A?>Z��_�7���$z0���3�m�4��� �����r�������s�������X	�>�1w� �}'k�x�m�Z����}\x���7������q|>��^}������DDDDDDDDDDDeH�:�~up�c�:/zL���I���s��*qE��@{3f
��i���x��E����X�����&""*.��3���v$�rN=��o��FM��=����
R�dN��oa�p�]��]����Ag4����H���}�#��[�����?0_������}�DDDDDDDDDDDe��x��/�i��\^ ���j�^����(���ClT�.z��kL���_X���?�������������2^���F0�b���&zp�{��>O9�����p�x��r}�80{��t6����X��u�s��DDT<{���������(��XT�6���Ag���u;�h��Vm��mK���n���Ku�0�H>�@z��D���(���bb��� �1"�}##>{8
�/D�I,������u�g��e9?�� ��������b�\.	JV&�IK�6tPD!���Y����4��Yk�HU�������!��dI����`3�p,]���g��9�D���yd@
�����I#!q
,7������o��/~���3U�f����j��"a���6J"��X�.��|��.��MX�
?���zBg�j{�=@ """"""""""�HKS���#��V0p� v��g�q���Qb����U����S���v�1�m-r������X���t��Z�����m"����_�p��y���f������:���E�?v�1�O�vD����ji*���. ]���S��q"CA����}��Q'����������O�]�s�2k��^�LE]<�ViK���>�"����f�y��I���\���]�8�@�h�l������UF��� 3+��[�Qz��U^�S��z��QIaQ&��������}�_@�`���;���<7���Y
:46������p�O�b��o~����:75���@�)RNWJ�(�iZ�2`��Q������BD	$R!Z��j��F���M�K��S�
��N���pY���1�@������[����<���y�����������.v���A�w���]�Q�}< ���^+�����Qja�On$n����d:��omnB��F�}��t�`�%zLt`�|�������k
~?|{v�w`op��ry����+8��Z�D���` T.���4�P��f5
2(����Ba����3��������D���Z��DD�Hw(2��jz<s����| �}���tP����"S�����;-�<��^�"�E�c���i���O���7(G�����2=njd������_d�LY���;}H����
� �YzA����/B|;���c����m�M)=;!��Q����]���.5�����������b���h��!��}�<y2����,|���r{�=0}�ty""""""""�L"��/\H��������"�
y-qM!QY��G���ld4nk��H�fH��o�36Y@�����x��KFD��^���B������<��G����X����@z\�~�{��`�M<�Ot���6&$g*�������D��`P����mE����n�,�pE��
����(��NZ�����@Dt�����,\��G������a��!�P���%(::����e���5k���_��""""""""�L3Vy�����7����DDTt��G���C8��Tk��J�
`���"q�:Y�An�T��p0+B�
SzA_�*,7u�>.�XKIP�n8f~����$b�v;����n����n�.^��6m��s�����?�����Q�Y���-��u{|����/���08���Z��DY�����s" �U���
���d���Ya6�]���?����B��b<������@g�i�%��n���D��>�O�&zp�{��������q�;y�{�k%5
+%S��j����@��v�=��N1{�=��r�p��Q��A���OM�]����	����$"""""""�T�Qv!?������?�O[��H����
���Xg3l��/��5��
&�O���}2X� �*����d���505o���Q�!R���Y�����91k��Yy?��lN6�j7�)���c����>p���^KS�W�����9��(R��X��f3*W��={� --Mk���c��a���8������������(���?X^��e�\�!-kk�!%C�����|�e�O�^��h���;���
f���+�s�M�����R�\�T������X���t��Z������(q������M��a���+����A;�`�������$�j�]����������68
U�3�����
@���A�-�����>�N�S����z��;�`��������m!"""""""""""�~-�@R�E��j�E������-����)T�!������n�`��K{`[<"����f�y��I���\����$�y���nif��y8��c�F���d��wYQS}\DDeY������}��G�=z4����3K�.ERR�������|����N��_���&"""""""""""����dv�
g�|8 K*��U�
������]���y����67���w�+^�C._�Z�2`��Q��������r��u��H����F�A�����R����\c�(DDe]D�QU�R�&M��������/��2�v���;��X��?�8�M����K;eQI�},�1s��>�qV����zL��k�k�u75�X���lB(#�����~	�5�e@�
��7;���<���
��������|�@Q���V������#!�����~X�@��&����@D�">�K�Z�0c�l��S�L��d�������b����X��v���.$m���Q���������&����kZ��o2�t�s�yq�x;���@��<���Y
V���.��w���
&��F�f>^�A����{�������������������$�$����
��e����q��q���;�-��5� ��z4n�Xf:�������?����q���k������������$�X���W��!����DDe]�V&��?
m�`�ivYnU��0����Z�=�!�1\];�o��zX����m����^�{��Z�E}2P@���_%�a��n��-9#��g����
A'�d8=
�n���O�2�!���O����������2^�����
�L ���fw���.�u{�(�ND!b�t�hP����m-�Zk�_��[��X�l��?��h|=����5��������v2c��h���v����Y���t1k-��rAq:�5*�����'�(tkf<��"�R��n���Jy=�>���lr�@]N���2
�4�W��5\^�FM�+%@���;i)��bY� $''c��	���;p����l�M��rRSS�##��(��m�y�4j�H�?�����{��/���@ ��r�]l�����+�[o��f������
_q����������.N�Qv!?���r��s+'S�*�7ye�@���ft���
���0��
�f�]�.�j��
[�p0%���-�J��v�1�m���p":a��]���;�}�Y,\��V����}"���o��
7���'���]��A�����q��7���^��n��B�~?���K���C�'�o��V�\��������Y����GDDDDDDDDDDD�#��������(f@(.�|������]�2����Lu+�QG��$���aw+�
@0�/��&�K�g��3&GD�+bB��W���q��	����;��1*T������o9��`�����������c��5���k���ob����A"��W^��W^�u����?������
6���o��������k{�[q�������������"������v��Mf�A1K���ejW������>�Q1X���]�Ag2�!3 ����5������%I�c��%,2^��u�����Rzv��b��������7�����{�:uBBB�,��$����N�p��e�d����z
��v���-�0�i��tp�J�����r�}�8�����U�V�]�[��X�Q������S�����������������.v�$��->�����Q�`���D��L�@�s�����`�E�G��&���;i)��#�E���5�@� bG�}>�x��V���^\.N�<��
�tp�Z�j� �������c���,:t@�v�d[N������_/����Wk�_q��������������b��?v !V����iZ��j�8������`����#9#�X�u��y���@F�YD8��/.H�����6���f��+W�����.&V�c�������^Dv� G���D`@\\����f��f��r?q�s)��]�<>`�&�,����U�
�~��ho�sc�^����-���_����]��w`�������!;�����!�L���f��T�<�ViKDN� ��7�tV�\���wk��p����]�v�m����D6�B<7Fc�u"k�N���>E���3��������D���Z��DD�?�����q6:^Yp��[����H�����=�t������&\w�N���w�_�9���>s"9SA�*z<���P"m��C���\��Ue�#�1]h� �w�}���#�{�9Y* �4������x�����qc�}��0�]*T�"�Wq�����������"�x����d���������&���b��������jfg&�������
0��U���U]��l^�e�����Z^'����
*�t��:���UfJ�]������������a����Ft��)Z� ++_}�:������W_}5���D��q�������?��c�=&3|������tZh�x������^�K/�$���>!�}�3�_�^[�\�n�-]�����P��������hK����[Y���_n|����V4����o�a���_n|����Vt����������r++������x4V[+]��e�o�#�Z��lb��M������5j�{��>KII�7s^~��0�L���edd��,����"�/_������d�m��F-��r��s��u�>~��Zc����%�+U�$�[�|���r��?���S�N�qC�e<��
"J���c�9��V�Z����<g�d*\�~���/��rF�_RIi����T���� �|����7�|�t����_a��%yN����fId�/��>(�������{o������������r�~"Z[*};�m�Qdq:�2` ?^�v�]�'����������[b�[/�@1`
>������GO�S���k��R>�$��%�5j�*U��@����DP��f�SA�D�DEEikA111�V����sN}�xD��Qw���]:"6�$o��	(���2�H����$2
6L����������K�.E��]��/`��1yF��2��
�_A��|e��Iw!-�����jKFB�m)���r++���������������-<��������������}�_s�a���_n|����vq`��M����p?��~�s�wZK��������X��'��ho�m-�Agrz<�������B������
��1L
���l8�W����*�t���	=Z�d�
���>|�?VJ_wt�E�H�|�o�������e-�@D����+0`�,-1k�,Yv!�����X9%''�����	�H+s.�}>""""""""""""*'���D"t��D�,p��I����5^�f|���x|�J1�u�C>w��]~x����t��u8��`�RF�r����J5X��:3�������,���GRR��I����J�
z���dv��@�����C��[Dj����
�w�FZZ���M�o��]r?���\��|DDDDDDDDDDDDD%a�>?�����M>�;���G����2]
N�������Q23���Cmae?HS����^8�
��7`�0f��������,:����yj�5�Fj����e�u�l~?��D�c�d���RzvB������C���#�D����3��eK��S;v<=���M�b��e.Ad>1b>���s�=���O�9�_�jU�n�Z_�Z�Jk��o�>�[������p����GDDDDDDDDDDDDT����'��1�i&���r�s �	�dY�(��XD��p<=���:<��,3���.WqcC����n�_�������������{�g�P�2�NZ����.� ��@A�����~��76l(3�&��c�����0aB�
B�?>���K������>�W��m���b�����Z�ja��qX�v��&L+#J%�9��m�]w�%�Q�Kq���������������$��e���pgkSX�BN�x|�(�qy9�%�TP�U>��s��z�r)pz��&t�De��l��v=�+V�ZJ��v�1�m�������@w�/Y�[�n��?�|z���y���4i���O�����������?����D �.�5�r�-HMM�����<������m��������}{�h�.�A={���������\�Rk
*����������������Q�����:X��Euy����+8��Z��=����*��#*t-��W+�p����LM�����iC�7���'>w����|��'9�����P��z���������:��������g�������
@���X�x�\�8q"�t��>����]l���+��t������1�x���e��(��s�Nl���_=~�����������>��>Q�p{�%D����r��q��k1�{��?���2=njd��������_�g�9���Nbu�w���@��O>���c��KP(������91k��j����6QR��?X�A����QD9��I� ddd`��M���3��i���Ml����YYYZk�j��������sA�����A"��c������dv�\-Z�H�Je�$����g*�����������������}����'�v$pzP[�����S�]X�7��u:��������L��r��[v�����u^T����w[Q'!8�8��n���#r�R�~�OLwb�&��FQ��>�R"���]A�(>�e#���~j�e�s^��6������
@��|��l�.����b?Q�@CDDDDDDDDDDT��>���ntL]�S�	vy-qM"��I�8b�thRC���_����������nQ �����Yl8��f#��e��L[�"���a�\�����'��1�i&���r�s 8=��=e���(���*�n�^����
'b�f3*W��'N��ri�y��~bqQY&������>8<%�:�
y-qM!���W�>m�{��P�rphTd2�������j��`��s�
/�F�rc��nka����0k�
���a�}V��s�w����������r}���������`�lm
+�A�)����T����s	�^�p*���T�
���}Fcbb��E$&&�r�|@^D��.�k���<������������,�������R�k�k]
��2�A5���>����->|����u6�f�oS���7� ��������`���
���>Q�����:Xs<��+Tz�YM�����:���~;����G}����?��#K3b.�E��.������qDDDDDDDDDDDe����.��=,uLD���h��}a$�k��B����BZ�6���S2�O	�PC�jr����K0��R��WN�:.X2H�_�����at�r�^x��Y�����9%DF��_~+V��#P�zud �b]���b�F�iG�]�Qv!?���@���w�ONw��H�������\�5��!�}E��W:�(����tj����P��%���'�v$ K'b��.?���������Yz���=L^�E�3+
z�����$:T�$�E��.�c�"""""""""""""���e��=��~��;��p0% ��1 }y|p�����s�|8 �Ev��q��e���.S����_l�Mj����(,���1�~+�ct�t)����3�$/�)���\��:AWAk��(��k��������d�<y)))r.�E��NDDDDDDDDDDDDD���eD��=�w";!����e9�]I��u
�`�����>���K,l9��G�=�3"�1��`[�ZT��U�nRS�2��W�>m�{��P�r����_����;,���#'X���Y
[zA_1Qw�A��G����V
W�@8r�V�\	�^�
* >>�����������n�k{�u0�a5�L�?�'z���]���=�������7�������`�On$n����d:���oZ��o2���*���c�wMr��D�����,E^��.fym!p��{wW�X4�e@�j������-r*j���S�k`j�Jk�pEt��(�9s&�5k�/��Ngvz�����W��{�E���j�*m����V�hF�X��Y�,:tjb���h�#��(� ��e�W��������	���B�z�}D	�,��*�t��Z����p���
x�m��T<LjwY�,�����V�,� Jq�������BY.f�����'9����Iu�10TJ����@����1b��\�n]91��<x0�x�	l������k���������������.v"c�G���ld4nkQpN}Tp��&�|�����1"���\��J��d���x��Ev���ez������%�������������78�\������Sxr�Sx����,�!�1�mT���M'�B��B����`�8u_�>��:��B�O
[� �������xd�����#**J�
X,�x��x������b������oe�"""""""""""�A�3����g�i[�S�	vy�s� '�R������`���'�F
W�8��X��x�����v(5��)����9J*�,�������F����$��
�B��������t�e
_� ddd`��M���3��i���MD��~�����6n�(�#"""""""""""*m"��/\H����S�7Lf�!�%�� �����
�/?A����?|Pk��H���em��r�A��Nd����.��y�Jz��Q>c�����>]V�|�����}��+b�|>l6������r������������p�J?S����6]x���?E ���B�%*�`F�jz>��O����w�S��X���X��o6�R���`�On$n����d:����p?�?~���Z�+bDPA���q����v�5o.�'N�����������������J����s�mQ���4�������V�hF�X2���ze���
S��M��6�W�6���+�aU����}2�z��?k-T��-Z`���X�p����EQ�h�"$&&�A��8"""""""""""��Ve�#�1E:����AQX62��(8�*��Zf>aC�����O�0���U�=�-�&<���%#��J/L��	{�U�wH���������QaEl�N�+���;���<���:t(��Y���������1|�p<������+��woyQa(.'�;�"p2Ek������+���q�p�e�a���2�R�J�����
������~b""""""""""""""���&�9�{8�����*�����c���x���q�M7i�Ab] �X�B�GDDDDDDDDDDDDDDT���"����O������B||<�x�	$%%AQ���X��g�����IDDDDDDDDDDDDT4��0f���;��M{�N=&����5��.e"��������������$�@���p"i������,7������ "�h���@ �m��a���x��1x�`�:u
�.���G�=�������������
o�*/�>m��}��6�� ����e���W^�!C����?��C�dP������s��cG,^�X�e """"""""""""*�5���R�[��D>���@YD����~�o����*�u��m
fF�X�"����1;w�����4�.�G�c "�Dt��������c���������s��v���V &&o����}l��Q��,DDDDDDDDDDDDDDD�/b�N'��]+38QQQ����z=n��v�r�-2BVV������������������JK� 8���W^y%������EGG�V�Z8q�<��JDDDDDDDDDDDDDDD�%�K0~���e�v�]� ���WO�a8t�������wc���rq���
@�Z����+����	& 99Y����0r�Hl��
�:u��Q����;wF�~�����M�6x���y�f����������>��-[b���x�����[7�H"""""""""""""""*M� �)�;Vf88y�$&M�$K-�^��=������v|0f��_ """"""""""""""�@":A���������;wb��5jn��v<��s�6m<���'�b���DDDDDDDDDDDDDDDT�">A��t�Z�*���>��`��7���_.���S&����!�1�X�'N��Z����������������B���C�a��ax����r�d���k��}{�p�
r��qc��9����DDDDDDDDDDDDDDDT�":a����������������n���S�q�F\s�5���;��#F������2���@�3g�,���������C����g����cG��5�����������������DDDDDDDDDDDDDDDTz"6��p`�������,�P�Z5�.�/������C��Ue[��-e)�m��!++K�Q������C��^�z����m�[�l��"�`0�e�������L�|>�F����	�]��?�'��V������4H4j��5�Z��VMQb*�->�h�dh���*�%$R�b�"2�Hr�}���J�Nr�"�}]��{�k�������Z������o�����-�������OY����N)�V����Uz���7.}���x���s��������2�B�7_���1e��+��!O�����j���iQ���7���*{��]�v��A�0~���6r��2dHl�����j���4z��:tht��)��iSk>�{7��X��������60��Z�n��w�{��7=��8��S��O,���f�P�5kV�w�}��O�5jTY>�|�=8zf�Y�{�9C���*=^A�=�o��1p�����_����w������)S��o~��4hPi���%CS�0/9_a���i��_L����,�i�s����_�Y� �O=�T0 F�\pAiOm���.]��
7���w��v�)�G^�vyrF��H2,����W�#���U:���7o�;w.U2l��e����-Z�QG{��W�j���
@U
�nL[#XL�QW�m����xp�������s� ��@��4�����1�� �&�4��h� ����1c���+��*@�>}z�~����{�����Z+PE�
 L�4)�|��Xu�U�C��V��*@h��e�o�>�M�3g���UT��r�-���o<8����D�������j���?=�����?_����������>����K/���'�>h*�
 d����O�SO=���0aB�s�=����<N8���[n�E�X*@Xf�e�'?�I	��������U�B�V��k����;��������U���X,�f��Q�F��_�rHv�a1q���>}z�~����+�����^��8�p�
��#��?��1f��J�1cF�r�-��[����;�����.�)U:��U2t����.��v�8����G��������
+��/�'�pB<��3�9@S�t���n����>~�������O�>��k��F,��2����,.���9rdYVhz�
 ������C�����w�M�6�9sj��y���+z��Y* L�<�6h*�
 L�:5^x���p�
�c������k�.:u�c�������Z��R�!���3?tX�����FeY�`���.�0�3������G���C���>�iU6���u��y�������s�=7^����9������o�5jTt����hZ��a�w��:(.����b�-��O�'�x"�x�������{��^t��%n������w�����N�)U:���)�u�Y����	��.(C-><������������~��~�JR�����3��g�y&'�tR���+����_~y�����_�����
+��4��R�f�b�UV�����������9�����w����l�,:�E!M�2%�
_|q�}���q��1}�����R���I���SO��W_=��j�8��#��N(��o�y���zq�%���i�j��Z�Y� �����w�}7��c���Og�uV�q���g��0aB�����~���k��R��\sMja�=���{,n������o���?�SN9%������^�z�E]�
��hJ�
 L�:5�
o�q��g?���Z�6gN������<f��w����Je9���1c�k�������Z��S��b�-����+�6M����-[F���K%�3f�Z?X.���Ve�.�ll��6����=y��Zk�F�C�������hZ�
 4k�,���o�v�m?���b��A���PWWW�	}�����[/8���>�iU6�0q�����o�������G�=b�u���v��<�i��6+S�^{��8���g���;���Y��S���Y�b��1q�����I�J��/��.���}�����
6���S~F~��T6���C�0`@�7�QS~F~��T6���y����c�����,`�qeh4���F@Mh4���F[lo��V:4����;vl�X*@3fLs�1q��G�;��S�z���n��b�m�)�l�A\s�5QWWW�/�f��'�tR���3��_k}�Y�f�=�����ot��1�]v��e�]��o�i�������X�T:���/�����8������^*��L�_|q�92��r��u�]��'�pB�1�<_e���K/��.������3g��W^���{\����z��&�lR�A����q�g����Z��������o��\?�����/���[.�{�����[�r��m��7�tSY��[o-�7�&M�SN9%~����d��aq�i���n?�p<������={�����W	0��d~-��`�T����S��'��w���������~��g���]��*��R��t�R�b5jTL�<��-����w���w���:+V^y�h��}m��e����.^|��8���c��6���Xk�������j��e&N�X�3o��XrU6����o��1cb������_��M�>=�����yZ�hQ��l�2��m[��E������c��w���z*~����y�^^}��R�`�v(�n���Nl��������?_k���y,�*=�����>�hl�����s�ZkD]]]z!���/>_i����3�8#�x��R�c���9
{��W���/���P�{ec��W/�e���,��`�U������+�r�������#G��!Cb�M7-C�=zt:4:u�m����V�[l��rJ��??��[�<�0
�hH}���X��?�%We�[����������zh�z��q��'�y�l�M	(��5+�������O�5�,������@���C���X��Xr5���*j��)���2����w�s�9%����8�����+�h_\=�����~��*��W_}���d��<����2?��[��7�#F��U����=[4��1�������g��?��������9-.����7'�����>�mN����������n�Xo�u7'����������n�Xo��6'�m�Xo�c���v7����z�����6�l���V�
)�������z*P.h_p��Cm���.]��
7���w�b>��Y�+ ,i>���w�;��s�"�-Z�������Y5�~��yY���8��J���qW�9C3������Ec����U��6��e�����d��?���c���z�?�[�Xs���������d��?�[�Xs���������d����q��9�������XosZ������S����������i�j�sz��������^?���<�\� ���s�=7v�u��j���Y�f��z���������g�UW��6�(F�o��F���&M��>�lYn��?|���y,�*@���_��W������o�=�
V��d��6�|�2dH��������~8�v�k��V�u������l���.����>|x�~0x��;vl�7n����C��O��i��U������S�8��s���*��C%���7F�{���|������l������#G��[n^xat��=VZi�����<��H��y�G�h��{dE�'�|2���/������n��b�M6)U"24��{�����"���a*�Zk����y0��^��1cFL�4�\�����-[F������s���>��3��c�=[o�u�p�
q���F�v�jK��y,�*@Xz��c��W��3g����s�����w�Q*:�KVy���[\w�u��AV���_�Z�J�a����������~����������o_�=zt��������_�����O<���1k����J*@�<yr\y��������O?[l�E�h�"�t�=z�hp:���b����O�Je��M�[n�%���/��b�5��G�A�58�3F�X*@���C0 ��7�S.���Ve��7/a��;���������X]��>}z�?~����E������9rd|����W\�}�����<�HYX4*@�P��7����{\q�1i��������_}���Nq���
!�"R����?'�|r	�w�y1a��2���u��3�8#�|���hZ�
 d���[o��^z).���8����C�������=��rY-Ahz�
 ���[1r���q�c�]v�f�����)�s~.��3�����ks��R���3��+��r�n���������;6�O�^k�Je-[��������SK����\.���M���e�Y&6�`�<xp<��C�����\n�u�-��Ve-Z���v�-�^z����w�~��������=��r�z�*��Vei�M6�#�8"^~���u�]�S��T|��_�=z��|��9?��r�-k��R�-[��c�=6n����v�mc��	q�=���A��c��������@��t!5o�<v�q�2dH�;6����>��|��9?�����}VZi��z��c�v(��Z���\��5kVL�8�L��������{�/��*@�������2����+�8�S�{��e���*@���c�q�e��������{�/��>1f��o��f��5��4����={���}�{���o�Z�����~��'N��M�Qa���1y���+��U&������9��=z�(�>��=�P�q���n��noh�r�-�����5�X#��m[�D��T&���RK�!���
�{��'&L�/��b<���kz����s����o|#��iS�D��Tj��6�(x��7n\<�����{�8��C���^*m��2���O�v�mW�$�)U*���Y�Xn���c��eZs�5�3�������:t�-[��}
��*@x�\v�e��_�h��y��_������3g��w�]�_�5kV�X*@�7l���f�m�����;��Z#�M����_��0f�����U:�0j��8��������������[����Fm�n�m\q����0^{���\�)U6�PWW7�xc<���q��W����h��}mn�2�,Gyd�y���:���������ks��T��[o�#G��w�1z����7�_m��Uv�a��g�x��c��I�9@S�la��%L���+G���k�
k��]t��)��[�j�Ve-[�,C.�?�CCV�:ujY>�4���Yf��`�
b���1|��Zk�z��<xp�����}@��l�E���n��
+��~x��w���'�����)S�������{��K/_�������U�B�l�����1a����w�S���5�=e���:(^~���\.4�J2d���=����8����}���9�����g�2dHY.��^�)Co�q����q���o�����K�.��U>��^K/�tt��q����Eo�
 ��������^����@��t���.�����n�������o���J���1m������R���#����v�{����y���k	*�j���4��f��7�tS����q�i���	b������~7��{��:�+��2:u��z����?>�Yf��'M�����'���>;��C~����C�h��Mt��9�~��x���J��g�uV\~��q�����
4��f���&M*������?�?�x�;�����;�lw�qG��4����S��T����1f��ZKD�v��0Y1!+'M����m��k�Q*���;����/���%lPWWWk��������U�B�6m�����o�=f��U�WZi�Xs�5���G������W_��{,��o-[�,m@������kl���q�A��'N,���j���������n���?��������c�
6�e�Y��n��T:�����������[lQ��[��f������{\��q�I'���c�-�,A�-Z��
4�JR��]�����~���B���>W_}u�����o}�[q�E�m��V@��|!�l�2VZi�R��^�v�J� C?���|`�X,
y���b���q������ck���P���1c��c����>:�y�����C�v�m�l�My�`�
��k�����2hZ� ������=�?��x���b��i1e������c������[����Z�=��b���9��*@�����0�w\\x����r��s�=W��u�7�xc�v�mq�M7��o����9sfy4���N�O>�d����e�UW]�����>�lt��5VYe����K�2��Q�b����
h:�
 ����1f��X{��c���/m��O�����_y��-Z��-[���m���I�b���
h:��an����G}46�x����s�5������A��������Z��]�R� �a?~|i9rd2$6�t�Xm��J[=zt:4:u�m����M�����[G�����{��C=4N=��8����m���f����w_���'F�U���M������#����~���
�{��������2eJ��7��A���\hz� d��<��S1`��1bD\p��=�m�6�t�7�pC�w�y����U�Bj��yt���T=��A��-ks"Z�hGuT���^��U�Z+��*@�����_=�=���u�]c����f���s���g�?��N��T:������W���8������o�a����UR�B]]]\{��1|��R�`���1v��7n�<�D�j�4���z��9rdl���q��F���c��V��;�s��A���U>q*{�~��1i���d�Mb�UV��UT���K/+��r��9��TWe�������>��G���UT�B����[�n��O�x���c��Y�9@�T6�0y�����+c������~:��b�h��Et��%z����t�a����k�4���M���rK���?^|��Zk���>�
jp3f�*	�T6���C�0`@�7n��\>�4���7o^�;v��)���M��z��*@�5kV<���1d��yN���o�_�~q�!�����k��J�S�L�c�9&�_�����<�C=4N=��x��Wj��R���rK\p���
+�A��~zl������[�����ot���,{��g�������Cy
4���y������c�UW����>����8����+_�J,��R�����^��
�����<�m�6�7�����S���9��s�=W�l��f��E�e8���~z�p���J�x����SO����Z���U�r;v���^��*b���.����_���5�\36�|�x��GJ��iU6���e�h��}�������������r�~!+&d��iU6���M���g?�=�X������(��:�a�O�^�f��S�N-���W�B���6��������N�g�}6f��U��;w����������2�.��.M�����G����w0 ����&M*�]v�%��������7��v�����;����U�B�v���s���/��T=h��Ui���W�}����
+��9,��'�{��Gy�I�� �����w�}�c�������P��7���M�-5������ta���%����?�<��h��uio��ei�*�>�h����_�q�e�O���\y���������_���^l��&1t���{����a��)��?���<�L�
 �����}�1�����k�sZn������k�Y�f��O�a���i��n�a<����������x���Je��.�(n�����nAK���z��1bD�7.�^z�Z��-�C������_���?>6�l������Z+������ZYf����9���?�%W��`H�Z��-Z�^-�^}��R�`�v��]��Z�k�u������T5��)>���<�\�
 ,�����N;��w�Y.������,�^y��x���K0 �>sk��m����e���z��:o��XrU6����o|���� ��c���W������o�9����A�V��j���1i��h��}�l���:�:!�O���y,�*@�8qbt�A��O�r���;��SO=5����E�n��~�������k�������C�Xz�����X�������V�Z��g�u�|O�|�hZ��r�W_}ux��q�g�)��Rk���,SoA��6�|��3W?�p���l�i����a������3g�Z����������>�C0������������I��-k��mAK��V@?~|p���k����m����y���~��G�/�P�����cm�'K2v�y��o����.��m����W�~���SO�������>���<�\����9�7�|�r�8qb��1#�O�&L�������J	y�~���-��h���jl��F1z��x��7j��5i��x��g�r���~�u������������.V\q�2����q�]w����Xm��f�74u��=�]�t�e�]��i�<���Jl���1d��R�`n���W�����k���Z��y[�����RC0����q��'���}��9rd�o���>���RK-��u�C9$VXa�Z�'���C�P����J��Y�f������G��~�G.aAK�J�+�V���k��F�����M���%[Kq���F��}�	Y� 9E������kW{�������/��z�����y0���M��>�h�n�:6�h�h��Em�f�����oq�%��a*�ZD�
=���u�]�U�V�%�����~���`������	 �&�4��h@�	 �&���/��{l������Y����K�u�Y������`q0h��Xv�ec�����h��Y�����k��F���1_�92���jKR5S�L�K.�$v�a�m1w��w��?�����_����9sf����lk��������o�]{U2��2�O��s�8p`��1��Uq��W�o���d�Y]yNw�1��>��s�3�<3^~���T����G�~�t�I��g�?~|����M�7�xc���.���c�������=��S�Y4�����nX~�>���k��]9�������hN�<�����������q�[���1�m�����\_�~xl��&���O�ZiJ����2������dC�k
Mk~�������>:X{���������+�w�q��0aB�x��q�����>[�����}�����I�j-TQX�{����G���o+��B�����1_o�����_��,G����kq�!�D�������n������j�-���������J��*�<y�c��T�/8��9��������[n)'��;h�����C�U�����t������u�r|�N9����W�R���������V���<�H9�\}������s|Y1�.�������j-
���9��{��w����1���������_|�u�����O�5jT�e��w]�p��z����m���?�}��S>�}k�c�S4�����b���^_���g��et��[o��������������.������7.�/�Uu��6�������{�����N9�������o��cMh���u{��g]�����}�P��������'��v�iy�E�~����S��v�g���u�]w]]�N�����������jX��-�������5kVi���������UW]��o�[i�r���o��}}����{���J{��\��>s�=��C��������{��_�q��9T��O�����/�����uo��F���{�6v�	'4��������v�/���W_]�[��\�T��/�\���;�>�{��wJ{>^x���}�}���0aBi��|����>��/:���1c�����=��su�z�*���[n�����oY���?����n��q��s0`@Yo���X&�}��|����>��o����w�UW����GY�,<�����>���d�a�V�}������>��6r���
6�������������c�=v�1
Wc�}C���'��������aa���q��w^Y���s��E��ls��X��\�
�/���o9O�* @���{���o.w�f���-[��v������>�/�39L��{��?�|YwY�1�V������T������;�(U*�Z�[lQJ&���������R����e�q�������o�=��r��*n��}i����1��_|1�����N5�~��'Zq�
7��<�-��y������2�,Sk���
W^ye9��jZs�/��/e�@���_�B�
�����'�����>�k��Ui���w�m�rl�$n��o\�����?���b��V���Xk����?�yy���'N���)��iy|��{�2De�o���5$�SV��������S��^�x�g���\&+%�p��d��P�w�A�%u]�p|���w���9���~��9�QVZi�8����>6��s����Q��</���[��GydYG�}c���Vu2dH�3���p4v������V����H��(�\���G�]�Wr}�h|�m.�7���P�����[o=��2��70��s{��	 @�����w_y���������c��0���S=���e��������S1p��<hx��7��B���[@�x])�on�TC���@���|�3�����8������nyN�dG������ C�e�'[���h���J�ep����*�-/������<�[o�U��T����^�������������[W\q����e�T��v�����J<���e�d��O��������k��%���4������L�z�����\#
��\O���,�lPk��M7���~��x��Wk�,o��v�~��q��g�1�s�#�8�6��>��f�������^*�
�m54DT���!P2|��[��������	'C�o����i��X&�q���a�Xx����^xa�9�����4>�6��=����y����Q���u�=��#��j�Z��o�M7������hByA��g���6�(>����Z����k���[&���<X�l���]iyGo�pQmyP�c5e��s����9M�:���*���K�������^���y����O���^�Zj���j�pH�VYe�8���m���9TQ�S?�]�D�xwy&;����K.)�1TK�������%P��fgVv���h�AL5����s&��2��^y�%/�����$SQe�5�|�����M��I�7�k4�<���Ye$�R���cmN�r=���c���7e[���9|^8e�����_K���4�������������w�=x��2vC�\]K��(�[����{����k�-����?�������j�,���e���>+���V4������;>��u�Y�����]������o�
�y����Q����s����2S�	 @�N�����W�5$qo�q����+&/f���?-��#���2���_��,�9���j��<1>����IWv~d5�';�~�����O����XP-z��+/���'?���%4������OV�o��J���?~|��3������������7J'����C�gp2����1s�YOul��&q�A��W_]���9^�����/!����kv�-��������;D�����7�#M+��������^k�`/��ry\n��>0T�r����,M��g���������cA���p�CeUw�.<u{���:h��8��CKH��C)7��|�m.���Ag���/�x��������bZV1bD9/�jL�o�y�����}�k���~W��Xx>�6W_-�yN��SsN�,w�y��/����SA���qe��t>�t�b��7�X���DR]Y�*O�r��,y�']������+*�W���h�m�]��*�-�w��5Y�.�n��r@�my�E�TB���!;,��2�����wyf�F����,z������tlT\��E�,���{78t���,���?���K'T���N�eGb��|��j���P��s�����{�o`v��a6���0����,|y�o��r_�C���]]>����W.���B��]u�U�����������/�������.��T_}��Z/����������^{m9����Bu������9�e��U��A��s����������@`�S���%������Ns�v�e'q�������.+)}|��w���xyw�����h��emU�%���<����_I����O�m���5�\S�Z�r��	�?��q�����_\� d�Fvpd��� ��w(���������T?�j#-Z�����f��U��+����?�Dg�-�CCe'c�T���k)C��_}	��7��w~�9A���h�BM�>}�0�Y9-��v!����A^d�c�<���jY� �B����������+��#�<2�_���,�2$�C�d0�+_�����G��>���42����M���jh���U%s���dJ����qY9&���j�|0�(y2����vXy�wi�C��r��<��?�;������L�fg��wR��jyA4�^P�b�����0+�4���"v�s��|��Z+��RK-5��V�
s��.	��z�*wU�z�
9����+���N;�T�	��2,�!��&��y�|�bLvHe�~����j�!�2$���[�������-�r���t���b!��������w�E��g�0�;��-������g��������l�_���jKQy��U?��R�_�g����y�|n_
��u�0�9LCX�r����l���%<��k��)o����n��w�yg����	 @�r��������i��d�`�_��X�������%�]�����{�Jy�!�^}e�?���%��Io>9r?���k�������@�e��]w�R������7�h�x����9�9�V����%����7j,_��k>��e�T�+Z����[�H���������h���2r�m���>yLy�=����E]T�f[u�U�rJ�/���������#�<R�y��,Yf<+���?v9��SKh9��7���$��Zk��J��9�'��+�X�����Z�E/�Z�kw)"��[�?d�������\��&�c�f
x����,�2n��R:7��n���
4V�%����4����v�A�`1��y���{������w
����i��������~�f�m�r����3����TG��r�'��Sn�����!�eU#��,���������7���JU�8�Y��s��\	�4����|	�<��3���j���N8�����Z����f9������G�g���/��	���'y\�����c���n���2|[��>������<6e���5y7��/�o��F��Ei����Ja�%�7���+y��Cf�5��!������;���!�<���l��R=�����������e(��#�M(����^)�3f��Z���x������sG4^v:e)�,	x�A��ryrEu��[m�U9�jHvx����5�<��G���k��e��}������Ou����#;������������N����b��.rf�'��Q]���:Evf�.����#�������WT]�Kz�������:u��Re9�FV������ d�����:@�#/�����(����-C$�;��^x���o��b�]v)���9`��<'��E/��s���O;��c9V���m����>�:rh�\/9e �!����8F�fu��w����n��}ew&��>�(hBY�����|�a�*B���?<9��xy���#�(��,	��_�������31�F�1	��pny��w���2��,zyr��}�:kh��/~Q�������.�]��E/+�d�EnW
uJ�I���������l�I��E-����o_*����{x�<9���{K��K�.������P�������V�/Pmy���>�T�hH��G�Q���p���+��|�{�{_�bn�w�uW%C���I�!�\o�F����W�����:���}�5�\�{��O��e�����[�����fD������2���3l����*"�i���R?�z����d�f�J������w��e���&���r{�<o�u�%�s87}c����2��}c

�P��}c�,��4�L����9��UW]5;��c��w�yq�W�n��6�r����;vs���A� �X�J.��p�}�)cI^p�s�����>}��2t{����%,y���'�]�~��e��zY�����*whr�!B?�O��u+��g����Z�����������8;�*!����+�|Ik��vy���[n�r��rX����/����:���X���Xc�X}���O�S����-��'�|r�_|����]Ld�����[��q���H����f��b����u
��%�/���Xa�J�B�Z.�,���x�9���c������y��w��>��'�`��_/�\n[y�Y���\V}�mq�-�,�z��WGVs?����{~��'g�/��,����,����+L�X��;�L(z��e|��v�����X�L:��c
�@����v�����<9nhj�N(��L����L�����_�r�#-�&0`@9H�NE�Kh���%/��qH�A�!��m./�4(���[�\N���3��Ls7�V��H��<�� ����Z�#��RX����#�f�s�/,>2�s�)����O����G�����=������� �/���gy���\o����t����_.f�����Jw��~{�$��v��!���/�m1�_�5�8y��k�-�2<Y>��4t���;��<&�?v��c�]��y-S�g	F�����?&L�P�3�<�~�;��#���
3+�Q���!����'�,���~1�g��eY�0���N������[��c�)��\`v����Y�,�c*�x����^�w�fGp&L�|����-}�����7�tS	l����}��%�I~�';o���2�I&���2;:�>���������y"M��0C���+FUiZ|dgS�����w�����e���SK�<K��x�:��'��2d��s�\o)_g{��m�x�c���p�
%���c��>~���g[���ac��,�:v������,)���}�o , �����y^0�6�������r�����2���������t�M���Y��S��Tmi>H�����
@�	 �&�4��h@�	 �&�4��h@�	 �&�4��h@�	 �&�4��h@�	 �&�4��h@�	 �&�4��h@�	 �&�4��h@�	 �&�4��h@�	 �&�4��h@�	 �&�4��h@�	 �&�|�M�6-���?��#j-�\�����={�&�lO?�t�����v�y�����N�X�O�3f����h�"�����Yg�]�t�f���k��zh�92���jKEL�2%�8������x���ks���W_�]w�5�]v�����O=�Tl��&q������l�My��W_]^�c�������[n�/|���c���w�c��)���5+x�����~���~Y>�v�!~��_�����r�?���8��3?��������/��{���Q�9���{@c	 �L^��i����O�	&��;����j�����m��6~��_�B�]�vq�QG��[n��c��A�=�2�_~y�~����o~3��s�Xz���s��eJ]�v��w�9�Yf����m��V>7?�s��\	:�2��?����K_�R\x����C��������o%�a��^{��I���{��SN9e��]a�f����M7��m�]Y~������]����|
1���M�w�y��m��9��=z�����f�� �D����O�x���Kx�����;��3����1bDl��V��o�����k��Xw�uKX ]p�����<�e�9�����[�p�	��M�Xk����k��8�,�����{y]������O?=�ZW\qE	�E���������>[���||��'����?�9�R����7���/�<����z�]w�`AV:��N�?�x�|��1i�����~W*�����w�}�����/n������d���Cy��N�??'�����e�]V���"q��7����|�Z��U�����p'�tR�D�U�"z�����sO�s?�g�qFY6/��3��-9z���z������M��rH��{,�Yg�8�����{m����~����<�Ly�0y�?�oVN���f�!�yXq����^��3g�`��Q�������>x����z��H��8qby��w�y'^y����h����S>n���%���9��@����}��2�.��-[������X�A�����eu�#�<������|^���9\�G����!��{l<��#���}��:����Ar���~8��o_��W��}3p��G�
Yq!�g�J�pD�-jK�W~�\v��a������������K%�W_}u�p��Y�!��5@c M.c�����'��y!}�i�}��'�x���k�����C1�����U���o5d�0���J�n����aY!�dE���p�G�����o�]�o��������������U�!����gK8�~(��,��r�o��RK��)2���f��)��>�`L�>��$4���2������{��A��o<xp�����w����nZ.���������JV	9rd|�����VZ)VXa��p�
KE�+��2�}�����F���C��<��d�������;9���=����g�Y�(���zq�%���i�jK��#�4��8��]�r'���>[.��4��YQ����e	�?�����?��<_PrX���p�
7����2T�_���x��'KE�3�8������2��V^y��8/9���o\�`��	9��g�]����w\u�U����@����/������g�y��
�#�:�g�}b����������)a���7�,�
��K/�������}�F�^�b�
6(���9�����jx���c��q��9�y����K�8��sKe�*!����
S�L�^x�,��~��%��|�����?���?��C%����r��������g��Q��_O?�t�<���{�,��6���?����{��q�G������/\ �_}�����y�>+��[o�w�uW���k��}2b^�7_2�����kF��c�-�(���o����Cr���l��S�Z���1"���/�1���a�7o���N�4������W���2�E]TyG��^z�y���^{�X}��K{�2d�a�t��5Z�htP�N�AC1<��s�g.YY �x����!���W\qE�e�d�"��������0��Y����o����:v�m��f�m�w�{��K��_�����_>��:th�`����o��+�X�7$+M��]~��q�����]2��n�+����KX$�]w�8��s��>}���>���i��b����
7�0����2�B�k��U������}�
2t���*��Gydy�a�Q�F��)����>�T����A2�����?�����?=z�(U��{�m��)��RB
Y-��w���s��Xc����y���Z*�gn��������a)N8��2TC�h����3�,��o������R�����A����kd��+d���;��"�O�\rI�����7�W�>�?���s�&�C���^����~������K����:�\�_n����O=�T���7^��8��s������:uj\s�5%���;��K/]*(���O>�=�Xt����{��'���n�n�����o_����������o����?J�!?�������?������-����`@�j����?f��8�g>�����}���-�)�����U	��c�Bx��J��c|����BVU�a����i���%�Q_!�s��=�{_{���w?~|�~�w����b@c4��	y]�9��b���F@Mh4���F@Mh4��"�?�.p�|�[�IEND�B`�
v1-0001-Use-TupleDescAttr-macro-consistently.patchapplication/octet-stream; name=v1-0001-Use-TupleDescAttr-macro-consistently.patchDownload
From 77f22576c04e37be9c51042166c88c1226d0aeb5 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 28 May 2024 10:47:17 +1200
Subject: [PATCH v1 1/4] Use TupleDescAttr macro consistently

A few places were directly accessing the attrs[] array.  Fix that.
---
 contrib/pageinspect/gistfuncs.c          |  2 +-
 src/backend/catalog/heap.c               | 11 ++++++-----
 src/backend/commands/prepare.c           |  2 +-
 src/backend/executor/nodeIndexonlyscan.c |  4 ++--
 src/backend/executor/nodeMemoize.c       |  8 ++++----
 src/backend/optimizer/util/plancat.c     |  2 +-
 6 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c
index b38f1d32f7..1cc3b8c9e9 100644
--- a/contrib/pageinspect/gistfuncs.c
+++ b/contrib/pageinspect/gistfuncs.c
@@ -309,7 +309,7 @@ gist_page_items(PG_FUNCTION_ARGS)
 					bool		typisvarlena;
 					Oid			typoid;
 
-					typoid = tupdesc->attrs[i].atttypid;
+					typoid = TupleDescAttr(tupdesc, i)->atttypid;
 					getTypeOutputInfo(typoid, &foutoid, &typisvarlena);
 					value = OidOutputFunctionCall(foutoid, itup_values[i]);
 				}
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index ae2efdc760..00074c8a94 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -839,18 +839,19 @@ AddNewAttributeTuples(Oid new_rel_oid,
 	/* add dependencies on their datatypes and collations */
 	for (int i = 0; i < natts; i++)
 	{
+		Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+
 		/* Add dependency info */
 		ObjectAddressSubSet(myself, RelationRelationId, new_rel_oid, i + 1);
-		ObjectAddressSet(referenced, TypeRelationId,
-						 tupdesc->attrs[i].atttypid);
+		ObjectAddressSet(referenced, TypeRelationId, attr->atttypid);
 		recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
 		/* The default collation is pinned, so don't bother recording it */
-		if (OidIsValid(tupdesc->attrs[i].attcollation) &&
-			tupdesc->attrs[i].attcollation != DEFAULT_COLLATION_OID)
+		if (OidIsValid(attr->attcollation) &&
+			attr->attcollation != DEFAULT_COLLATION_OID)
 		{
 			ObjectAddressSet(referenced, CollationRelationId,
-							 tupdesc->attrs[i].attcollation);
+							 attr->attcollation);
 			recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 		}
 	}
diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c
index 5e85585e9d..07257d4db9 100644
--- a/src/backend/commands/prepare.c
+++ b/src/backend/commands/prepare.c
@@ -717,7 +717,7 @@ pg_prepared_statement(PG_FUNCTION_ARGS)
 
 				result_types = palloc_array(Oid, result_desc->natts);
 				for (int i = 0; i < result_desc->natts; i++)
-					result_types[i] = result_desc->attrs[i].atttypid;
+					result_types[i] = TupleDescAttr(result_desc, i)->atttypid;
 				values[4] = build_regtype_array(result_types, result_desc->natts);
 			}
 			else
diff --git a/src/backend/executor/nodeIndexonlyscan.c b/src/backend/executor/nodeIndexonlyscan.c
index b49194c016..612c673895 100644
--- a/src/backend/executor/nodeIndexonlyscan.c
+++ b/src/backend/executor/nodeIndexonlyscan.c
@@ -658,7 +658,7 @@ ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags)
 	/* First, count the number of such index keys */
 	for (int attnum = 0; attnum < indnkeyatts; attnum++)
 	{
-		if (indexRelation->rd_att->attrs[attnum].atttypid == CSTRINGOID &&
+		if (TupleDescAttr(indexRelation->rd_att, attnum)->atttypid == CSTRINGOID &&
 			indexRelation->rd_opcintype[attnum] == NAMEOID)
 			namecount++;
 	}
@@ -676,7 +676,7 @@ ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags)
 
 		for (int attnum = 0; attnum < indnkeyatts; attnum++)
 		{
-			if (indexRelation->rd_att->attrs[attnum].atttypid == CSTRINGOID &&
+			if (TupleDescAttr(indexRelation->rd_att, attnum)->atttypid == CSTRINGOID &&
 				indexRelation->rd_opcintype[attnum] == NAMEOID)
 				indexstate->ioss_NameCStringAttNums[idx++] = (AttrNumber) attnum;
 		}
diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c
index 45157ffb9c..df8e3fff08 100644
--- a/src/backend/executor/nodeMemoize.c
+++ b/src/backend/executor/nodeMemoize.c
@@ -175,10 +175,10 @@ MemoizeHash_hash(struct memoize_hash *tb, const MemoizeKey *key)
 
 			if (!pslot->tts_isnull[i])	/* treat nulls as having hash key 0 */
 			{
-				FormData_pg_attribute *attr;
+				Form_pg_attribute attr;
 				uint32		hkey;
 
-				attr = &pslot->tts_tupleDescriptor->attrs[i];
+				attr = TupleDescAttr(pslot->tts_tupleDescriptor, i);
 
 				hkey = datum_image_hash(pslot->tts_values[i], attr->attbyval, attr->attlen);
 
@@ -242,7 +242,7 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
 
 		for (int i = 0; i < numkeys; i++)
 		{
-			FormData_pg_attribute *attr;
+			Form_pg_attribute attr;
 
 			if (tslot->tts_isnull[i] != pslot->tts_isnull[i])
 			{
@@ -255,7 +255,7 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
 				continue;
 
 			/* perform binary comparison on the two datums */
-			attr = &tslot->tts_tupleDescriptor->attrs[i];
+			attr = TupleDescAttr(tslot->tts_tupleDescriptor, i);
 			if (!datum_image_eq(tslot->tts_values[i], pslot->tts_values[i],
 								attr->attbyval, attr->attlen))
 			{
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index 775955363e..9efdd844aa 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -174,7 +174,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
 	{
 		for (int i = 0; i < relation->rd_att->natts; i++)
 		{
-			FormData_pg_attribute *attr = &relation->rd_att->attrs[i];
+			Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i);
 
 			if (attr->attnotnull)
 			{
-- 
2.34.1

v1-0002-Move-TupleDesc.attrs-out-of-line.patchapplication/octet-stream; name=v1-0002-Move-TupleDesc.attrs-out-of-line.patchDownload
From 7eb968d4cd94082616c6e7b9bf6c2c74bff86b41 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 28 May 2024 13:49:07 +1200
Subject: [PATCH v1 2/4] Move TupleDesc.attrs out of line

Change TupleDesc attrs field so that it's no longer memory allocated at
the end of the TupleDesc struct.  Here we change this so that 'attrs' is
a pointer that always points to memory beyond the end of the struct.

This is just refactoring work to make way for a follow-on patch which
adds another variable length array to TupleDesc.
---
 src/backend/access/common/indextuple.c |  2 +-
 src/backend/access/common/tupdesc.c    | 11 +++++++++--
 src/backend/access/spgist/spgutils.c   |  3 +++
 src/backend/utils/cache/typcache.c     | 15 ++++++++++++++-
 src/include/access/tupdesc.h           | 12 ++++++++----
 5 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index bb2c6a2bcc..79ae29989d 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -588,7 +588,7 @@ index_truncate_tuple(TupleDesc sourceDescriptor, IndexTuple source,
 		return CopyIndexTuple(source);
 
 	/* Create temporary descriptor to scribble on */
-	truncdesc = palloc(TupleDescSize(sourceDescriptor));
+	truncdesc = CreateTemplateTupleDesc(sourceDescriptor->natts);
 	TupleDescCopy(truncdesc, sourceDescriptor);
 	truncdesc->natts = leavenatts;
 
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 47379fef22..fba0026520 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -85,7 +85,7 @@ CreateTemplateTupleDesc(int natts)
 	 * could be less due to trailing padding, although with the current
 	 * definition of pg_attribute there probably isn't any padding.
 	 */
-	desc = (TupleDesc) palloc(offsetof(struct TupleDescData, attrs) +
+	desc = (TupleDesc) palloc(MAXALIGN(sizeof(TupleDescData)) +
 							  natts * sizeof(FormData_pg_attribute));
 
 	/*
@@ -96,6 +96,7 @@ CreateTemplateTupleDesc(int natts)
 	desc->tdtypeid = RECORDOID;
 	desc->tdtypmod = -1;
 	desc->tdrefcount = -1;		/* assume not reference-counted */
+	desc->attrs = TupleDescAttrAddress(desc);
 
 	return desc;
 }
@@ -252,9 +253,15 @@ TupleDescCopy(TupleDesc dst, TupleDesc src)
 {
 	int			i;
 
-	/* Flat-copy the header and attribute array */
+	/* Flat-copy the header */
 	memcpy(dst, src, TupleDescSize(src));
 
+	/* restore original attribute array pointer and replace contents from src */
+	dst->attrs = TupleDescAttrAddress(dst);
+	memcpy(TupleDescAttr(dst, 0),
+		   TupleDescAttr(src, 0),
+		   sizeof(FormData_pg_attribute) * dst->natts);
+
 	/*
 	 * Since we're not copying constraints and defaults, clear fields
 	 * associated with them.
diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c
index 76b80146ff..94d49b7571 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -331,6 +331,9 @@ getSpGistTupleDesc(Relation index, SpGistTypeDesc *keyType)
 		/* In case we changed typlen, we'd better reset following offsets */
 		for (int i = spgFirstIncludeColumn; i < outTupDesc->natts; i++)
 			TupleDescAttr(outTupDesc, i)->attcacheoff = -1;
+
+		populate_TupleDescAttr(TupleDescDeformAttr(outTupDesc, spgKeyColumn),
+							   att);
 	}
 	return outTupDesc;
 }
diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
index aa4720cb59..426eabd9d9 100644
--- a/src/backend/utils/cache/typcache.c
+++ b/src/backend/utils/cache/typcache.c
@@ -222,12 +222,18 @@ shared_record_table_compare(const void *a, const void *b, size_t size,
 	TupleDesc	t2;
 
 	if (k1->shared)
+	{
 		t1 = (TupleDesc) dsa_get_address(area, k1->u.shared_tupdesc);
+		t1->attrs = TupleDescAttrAddress(t1);
+	}
 	else
 		t1 = k1->u.local_tupdesc;
 
 	if (k2->shared)
+	{
 		t2 = (TupleDesc) dsa_get_address(area, k2->u.shared_tupdesc);
+		t2->attrs = TupleDescAttrAddress(t2);
+	}
 	else
 		t2 = k2->u.local_tupdesc;
 
@@ -245,7 +251,10 @@ shared_record_table_hash(const void *a, size_t size, void *arg)
 	TupleDesc	t;
 
 	if (k->shared)
+	{
 		t = (TupleDesc) dsa_get_address(area, k->u.shared_tupdesc);
+		t->attrs = TupleDescAttrAddress(t);
+	}
 	else
 		t = k->u.local_tupdesc;
 
@@ -1780,6 +1789,7 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
 					tupdesc = (TupleDesc)
 						dsa_get_address(CurrentSession->area,
 										entry->shared_tupdesc);
+					tupdesc->attrs = TupleDescAttrAddress(tupdesc);
 					Assert(typmod == tupdesc->tdtypmod);
 
 					/* We may need to extend the local RecordCacheArray. */
@@ -2737,7 +2747,7 @@ share_tupledesc(dsa_area *area, TupleDesc tupdesc, uint32 typmod)
 	dsa_pointer shared_dp;
 	TupleDesc	shared;
 
-	shared_dp = dsa_allocate(area, TupleDescSize(tupdesc));
+	shared_dp = dsa_allocate(area, TupleDescFullSize(tupdesc));
 	shared = (TupleDesc) dsa_get_address(area, shared_dp);
 	TupleDescCopy(shared, tupdesc);
 	shared->tdtypmod = typmod;
@@ -2780,6 +2790,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 		result = (TupleDesc)
 			dsa_get_address(CurrentSession->area,
 							record_table_entry->key.u.shared_tupdesc);
+		result->attrs = TupleDescAttrAddress(result);
 		Assert(result->tdrefcount == -1);
 
 		return result;
@@ -2843,6 +2854,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 		result = (TupleDesc)
 			dsa_get_address(CurrentSession->area,
 							record_table_entry->key.u.shared_tupdesc);
+		result->attrs = TupleDescAttrAddress(result);
 		Assert(result->tdrefcount == -1);
 
 		return result;
@@ -2855,6 +2867,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 						record_table_entry);
 	result = (TupleDesc)
 		dsa_get_address(CurrentSession->area, shared_dp);
+	result->attrs = TupleDescAttrAddress(result);
 	Assert(result->tdrefcount == -1);
 
 	return result;
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 8930a28d66..2c435cdcb2 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -84,7 +84,7 @@ typedef struct TupleDescData
 	int			tdrefcount;		/* reference count, or -1 if not counting */
 	TupleConstr *constr;		/* constraints, or NULL if none */
 	/* attrs[N] is the description of Attribute Number N+1 */
-	FormData_pg_attribute attrs[FLEXIBLE_ARRAY_MEMBER];
+	FormData_pg_attribute *attrs;
 }			TupleDescData;
 typedef struct TupleDescData *TupleDesc;
 
@@ -99,9 +99,13 @@ extern TupleDesc CreateTupleDescCopy(TupleDesc tupdesc);
 
 extern TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc);
 
-#define TupleDescSize(src) \
-	(offsetof(struct TupleDescData, attrs) + \
-	 (src)->natts * sizeof(FormData_pg_attribute))
+#define TupleDescSize(src) MAXALIGN(sizeof(TupleDescData))
+
+#define TupleDescFullSize(src) \
+	(MAXALIGN(sizeof(TupleDescData)) + sizeof(FormData_pg_attribute) * (src)->natts)
+
+#define TupleDescAttrAddress(desc) \
+	(Form_pg_attribute) ((char *) (desc) + MAXALIGN(sizeof(TupleDescData)))
 
 extern void TupleDescCopy(TupleDesc dst, TupleDesc src);
 
-- 
2.34.1

v1-0003-Use-a-compact-struct-to-deform-tuples.patchapplication/octet-stream; name=v1-0003-Use-a-compact-struct-to-deform-tuples.patchDownload
From d022fc14b5c5a67dd538e2464d55c05c4a68dddd Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 28 May 2024 20:10:50 +1200
Subject: [PATCH v1 3/4] Use a compact struct to deform tuples

---
 contrib/amcheck/verify_heapam.c             |  6 +--
 contrib/pageinspect/heapfuncs.c             |  4 +-
 contrib/postgres_fdw/postgres_fdw.c         | 12 ++---
 src/backend/access/brin/brin_inclusion.c    | 18 +++----
 src/backend/access/brin/brin_tuple.c        |  4 +-
 src/backend/access/common/attmap.c          | 14 +++--
 src/backend/access/common/heaptuple.c       | 60 +++++++++++----------
 src/backend/access/common/indextuple.c      | 28 +++++-----
 src/backend/access/common/tupdesc.c         | 58 +++++++++++++++++---
 src/backend/access/gin/ginbulk.c            |  6 +--
 src/backend/access/gin/ginget.c             |  8 +--
 src/backend/access/gist/gistbuild.c         |  6 ++-
 src/backend/access/heap/heapam.c            | 10 ++--
 src/backend/access/heap/heapam_handler.c    |  2 +-
 src/backend/access/heap/heaptoast.c         |  6 +--
 src/backend/access/nbtree/nbtutils.c        |  6 +--
 src/backend/access/spgist/spgdoinsert.c     |  2 +-
 src/backend/access/table/toast_helper.c     |  2 +-
 src/backend/catalog/index.c                 |  2 +
 src/backend/commands/copy.c                 |  6 +--
 src/backend/commands/tablecmds.c            |  5 ++
 src/backend/executor/execExpr.c             |  8 +--
 src/backend/executor/execExprInterp.c       |  8 +--
 src/backend/executor/execJunk.c             |  2 +-
 src/backend/executor/execTuples.c           | 14 ++---
 src/backend/executor/functions.c            |  3 +-
 src/backend/executor/nodeMemoize.c          | 12 ++---
 src/backend/executor/nodeModifyTable.c      |  8 +--
 src/backend/executor/nodeValuesscan.c       |  4 +-
 src/backend/executor/tstoreReceiver.c       |  8 +--
 src/backend/optimizer/util/plancat.c        |  8 +--
 src/backend/replication/pgoutput/pgoutput.c |  2 +-
 src/backend/utils/adt/expandedrecord.c      | 22 ++++----
 src/backend/utils/adt/ri_triggers.c         |  4 +-
 src/backend/utils/cache/relcache.c          | 12 +++++
 src/include/access/htup_details.h           |  8 +--
 src/include/access/itup.h                   | 11 ++--
 src/include/access/tupdesc.h                | 52 ++++++++++++++++--
 src/include/access/tupmacs.h                |  2 +
 39 files changed, 290 insertions(+), 163 deletions(-)

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index f2526ed63a..125d594826 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1567,11 +1567,11 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	struct varlena *attr;
 	char	   *tp;				/* pointer to the tuple data */
 	uint16		infomask;
-	Form_pg_attribute thisatt;
+	TupleDescDeformAttr *thisatt;
 	struct varatt_external toast_pointer;
 
 	infomask = ctx->tuphdr->t_infomask;
-	thisatt = TupleDescAttr(RelationGetDescr(ctx->rel), ctx->attnum);
+	thisatt = TupleDescDeformAttr(RelationGetDescr(ctx->rel), ctx->attnum);
 
 	tp = (char *) ctx->tuphdr + ctx->tuphdr->t_hoff;
 
@@ -1612,7 +1612,7 @@ check_tuple_attribute(HeapCheckContext *ctx)
 									tp + ctx->offset);
 
 	/* Get the (possibly corrupt) varlena datum */
-	attdatum = fetchatt(thisatt, tp + ctx->offset);
+	attdatum = fetchatt_fast(thisatt, tp + ctx->offset);
 
 	/*
 	 * We have the datum, but we cannot decode it carelessly, as it may still
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 3faeabc711..e610aa69c6 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -331,11 +331,11 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 
 	for (i = 0; i < nattrs; i++)
 	{
-		Form_pg_attribute attr;
+		TupleDescDeformAttr *attr;
 		bool		is_null;
 		bytea	   *attr_data = NULL;
 
-		attr = TupleDescAttr(tupdesc, i);
+		attr = TupleDescDeformAttr(tupdesc, i);
 
 		/*
 		 * Tuple header can specify fewer attributes than tuple descriptor as
diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index 0bb9a5ae8f..10906a1363 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -1804,9 +1804,9 @@ postgresPlanForeignModify(PlannerInfo *root,
 
 		for (attnum = 1; attnum <= tupdesc->natts; attnum++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+			TupleDescDeformAttr *attr = TupleDescDeformAttr(tupdesc, attnum - 1);
 
-			if (!attr->attisdropped)
+			if (!DeformAttrIsDropped(attr))
 				targetAttrs = lappend_int(targetAttrs, attnum);
 		}
 	}
@@ -2177,9 +2177,9 @@ postgresBeginForeignInsert(ModifyTableState *mtstate,
 	/* We transmit all columns that are defined in the foreign table. */
 	for (attnum = 1; attnum <= tupdesc->natts; attnum++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+		TupleDescDeformAttr *attr = TupleDescDeformAttr(tupdesc, attnum - 1);
 
-		if (!attr->attisdropped)
+		if (!DeformAttrIsDropped(attr))
 			targetAttrs = lappend_int(targetAttrs, attnum);
 	}
 
@@ -4291,12 +4291,12 @@ convert_prep_stmt_params(PgFdwModifyState *fmstate,
 			foreach(lc, fmstate->target_attrs)
 			{
 				int			attnum = lfirst_int(lc);
-				Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+				TupleDescDeformAttr *attr = TupleDescDeformAttr(tupdesc, attnum - 1);
 				Datum		value;
 				bool		isnull;
 
 				/* Ignore generated columns; they are set to DEFAULT */
-				if (attr->attgenerated)
+				if (DeformAttrIsGenerated(attr))
 					continue;
 				value = slot_getattr(slots[i], attnum, &isnull);
 				if (isnull)
diff --git a/src/backend/access/brin/brin_inclusion.c b/src/backend/access/brin/brin_inclusion.c
index 750276998c..289418706d 100644
--- a/src/backend/access/brin/brin_inclusion.c
+++ b/src/backend/access/brin/brin_inclusion.c
@@ -146,12 +146,12 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
 	Datum		result;
 	bool		new = false;
 	AttrNumber	attno;
-	Form_pg_attribute attr;
+	TupleDescDeformAttr *attr;
 
 	Assert(!isnull);
 
 	attno = column->bv_attno;
-	attr = TupleDescAttr(bdesc->bd_tupdesc, attno - 1);
+	attr = TupleDescDeformAttr(bdesc->bd_tupdesc, attno - 1);
 
 	/*
 	 * If the recorded value is null, copy the new value (which we know to be
@@ -160,7 +160,7 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
 	if (column->bv_allnulls)
 	{
 		column->bv_values[INCLUSION_UNION] =
-			datumCopy(newval, attr->attbyval, attr->attlen);
+			datumCopy(newval,  DeformAttrByVal(attr), attr->attlen);
 		column->bv_values[INCLUSION_UNMERGEABLE] = BoolGetDatum(false);
 		column->bv_values[INCLUSION_CONTAINS_EMPTY] = BoolGetDatum(false);
 		column->bv_allnulls = false;
@@ -225,13 +225,13 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
 	Assert(finfo != NULL);
 	result = FunctionCall2Coll(finfo, colloid,
 							   column->bv_values[INCLUSION_UNION], newval);
-	if (!attr->attbyval &&
+	if (!DeformAttrByVal(attr) &&
 		DatumGetPointer(result) != DatumGetPointer(column->bv_values[INCLUSION_UNION]))
 	{
 		pfree(DatumGetPointer(column->bv_values[INCLUSION_UNION]));
 
 		if (result == newval)
-			result = datumCopy(result, attr->attbyval, attr->attlen);
+			result = datumCopy(result, DeformAttrByVal(attr), attr->attlen);
 	}
 	column->bv_values[INCLUSION_UNION] = result;
 
@@ -479,7 +479,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	BrinValues *col_b = (BrinValues *) PG_GETARG_POINTER(2);
 	Oid			colloid = PG_GET_COLLATION();
 	AttrNumber	attno;
-	Form_pg_attribute attr;
+	TupleDescDeformAttr *attr;
 	FmgrInfo   *finfo;
 	Datum		result;
 
@@ -487,7 +487,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	Assert(!col_a->bv_allnulls && !col_b->bv_allnulls);
 
 	attno = col_a->bv_attno;
-	attr = TupleDescAttr(bdesc->bd_tupdesc, attno - 1);
+	attr = TupleDescDeformAttr(bdesc->bd_tupdesc, attno - 1);
 
 	/* If B includes empty elements, mark A similarly, if needed. */
 	if (!DatumGetBool(col_a->bv_values[INCLUSION_CONTAINS_EMPTY]) &&
@@ -522,13 +522,13 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	result = FunctionCall2Coll(finfo, colloid,
 							   col_a->bv_values[INCLUSION_UNION],
 							   col_b->bv_values[INCLUSION_UNION]);
-	if (!attr->attbyval &&
+	if (!DeformAttrByVal(attr) &&
 		DatumGetPointer(result) != DatumGetPointer(col_a->bv_values[INCLUSION_UNION]))
 	{
 		pfree(DatumGetPointer(col_a->bv_values[INCLUSION_UNION]));
 
 		if (result == col_b->bv_values[INCLUSION_UNION])
-			result = datumCopy(result, attr->attbyval, attr->attlen);
+			result = datumCopy(result, DeformAttrByVal(attr), attr->attlen);
 	}
 	col_a->bv_values[INCLUSION_UNION] = result;
 
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index 997eb6d822..213b873867 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -699,7 +699,7 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
 			 datumno < brdesc->bd_info[attnum]->oi_nstored;
 			 datumno++)
 		{
-			Form_pg_attribute thisatt = TupleDescAttr(diskdsc, stored);
+			TupleDescDeformAttr *thisatt = TupleDescDeformAttr(diskdsc, stored);
 
 			if (thisatt->attlen == -1)
 			{
@@ -712,7 +712,7 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
 				off = att_align_nominal(off, thisatt->attalign);
 			}
 
-			values[stored++] = fetchatt(thisatt, tp + off);
+			values[stored++] = fetchatt_fast(thisatt, tp + off);
 
 			off = att_addlength_pointer(off, thisatt->attlen, tp + off);
 		}
diff --git a/src/backend/access/common/attmap.c b/src/backend/access/common/attmap.c
index b0fe27ef57..a341f0bf50 100644
--- a/src/backend/access/common/attmap.c
+++ b/src/backend/access/common/attmap.c
@@ -135,7 +135,9 @@ build_attrmap_by_position(TupleDesc indesc,
 	/* Check for unused input columns */
 	for (; j < indesc->natts; j++)
 	{
-		if (TupleDescAttr(indesc, j)->attisdropped)
+		TupleDescDeformAttr *attr = TupleDescDeformAttr(indesc, j);
+
+		if (DeformAttrIsDropped(attr))
 			continue;
 		nincols++;
 		same = false;			/* we'll complain below */
@@ -299,25 +301,27 @@ check_attrmap_match(TupleDesc indesc,
 
 	for (i = 0; i < attrMap->maplen; i++)
 	{
-		Form_pg_attribute inatt = TupleDescAttr(indesc, i);
-		Form_pg_attribute outatt = TupleDescAttr(outdesc, i);
+		TupleDescDeformAttr *inatt = TupleDescDeformAttr(indesc, i);
+		TupleDescDeformAttr *outatt;
 
 		/*
 		 * If the input column has a missing attribute, we need a conversion.
 		 */
-		if (inatt->atthasmissing)
+		if (DeformAttrHasMissing(inatt))
 			return false;
 
 		if (attrMap->attnums[i] == (i + 1))
 			continue;
 
+		outatt = TupleDescDeformAttr(outdesc, i);
+
 		/*
 		 * If it's a dropped column and the corresponding input column is also
 		 * dropped, we don't need a conversion.  However, attlen and attalign
 		 * must agree.
 		 */
 		if (attrMap->attnums[i] == 0 &&
-			inatt->attisdropped &&
+			DeformAttrIsDropped(inatt) &&
 			inatt->attlen == outatt->attlen &&
 			inatt->attalign == outatt->attalign)
 			continue;
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 9e3407bf98..963b88c27b 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -83,6 +83,9 @@
 #define VARLENA_ATT_IS_PACKABLE(att) \
 	((att)->attstorage != TYPSTORAGE_PLAIN)
 
+#define ATT_IS_PACKABLE_FAST(att) \
+	((att)->attlen == -1 && DeformAttrIsPackable(att))
+
 /*
  * Setup for caching pass-by-ref missing attributes in a way that survives
  * tupleDesc destruction.
@@ -147,14 +150,14 @@ Datum
 getmissingattr(TupleDesc tupleDesc,
 			   int attnum, bool *isnull)
 {
-	Form_pg_attribute att;
+	TupleDescDeformAttr *att;
 
 	Assert(attnum <= tupleDesc->natts);
 	Assert(attnum > 0);
 
-	att = TupleDescAttr(tupleDesc, attnum - 1);
+	att = TupleDescDeformAttr(tupleDesc, attnum - 1);
 
-	if (att->atthasmissing)
+	if (DeformAttrHasMissing(att))
 	{
 		AttrMissing *attrmiss;
 
@@ -173,7 +176,7 @@ getmissingattr(TupleDesc tupleDesc,
 			*isnull = false;
 
 			/* no  need to cache by-value attributes */
-			if (att->attbyval)
+			if (DeformAttrByVal(att))
 				return attrmiss->am_value;
 
 			/* set up cache if required */
@@ -223,15 +226,15 @@ heap_compute_data_size(TupleDesc tupleDesc,
 	for (i = 0; i < numberOfAttributes; i++)
 	{
 		Datum		val;
-		Form_pg_attribute atti;
+		TupleDescDeformAttr *atti;
 
 		if (isnull[i])
 			continue;
 
 		val = values[i];
-		atti = TupleDescAttr(tupleDesc, i);
+		atti = TupleDescDeformAttr(tupleDesc, i);
 
-		if (ATT_IS_PACKABLE(atti) &&
+		if (ATT_IS_PACKABLE_FAST(atti) &&
 			VARATT_CAN_MAKE_SHORT(DatumGetPointer(val)))
 		{
 			/*
@@ -268,7 +271,7 @@ heap_compute_data_size(TupleDesc tupleDesc,
  * Fill in either a data value or a bit in the null bitmask
  */
 static inline void
-fill_val(Form_pg_attribute att,
+fill_val(TupleDescDeformAttr *att,
 		 bits8 **bit,
 		 int *bitmask,
 		 char **dataP,
@@ -307,7 +310,7 @@ fill_val(Form_pg_attribute att,
 	 * XXX we use the att_align macros on the pointer value itself, not on an
 	 * offset.  This is a bit of a hack.
 	 */
-	if (att->attbyval)
+	if (DeformAttrByVal(att))
 	{
 		/* pass-by-value */
 		data = (char *) att_align_nominal(data, att->attalign);
@@ -349,7 +352,7 @@ fill_val(Form_pg_attribute att,
 			data_length = VARSIZE_SHORT(val);
 			memcpy(data, val, data_length);
 		}
-		else if (VARLENA_ATT_IS_PACKABLE(att) &&
+		else if (DeformAttrIsPackable(att) &&
 				 VARATT_CAN_MAKE_SHORT(val))
 		{
 			/* convert to short varlena -- no alignment */
@@ -427,7 +430,7 @@ heap_fill_tuple(TupleDesc tupleDesc,
 
 	for (i = 0; i < numberOfAttributes; i++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupleDesc, i);
+		TupleDescDeformAttr *attr = TupleDescDeformAttr(tupleDesc, i);
 
 		fill_val(attr,
 				 bitP ? &bitP : NULL,
@@ -461,7 +464,8 @@ heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
 	Assert(!tupleDesc || attnum <= tupleDesc->natts);
 	if (attnum > (int) HeapTupleHeaderGetNatts(tup->t_data))
 	{
-		if (tupleDesc && TupleDescAttr(tupleDesc, attnum - 1)->atthasmissing)
+		if (tupleDesc &&
+			DeformAttrHasMissing(TupleDescDeformAttr(tupleDesc, attnum - 1)))
 			return false;
 		else
 			return true;
@@ -570,15 +574,15 @@ nocachegetattr(HeapTuple tup,
 
 	if (!slow)
 	{
-		Form_pg_attribute att;
+		TupleDescDeformAttr *att;
 
 		/*
 		 * If we get here, there are no nulls up to and including the target
 		 * attribute.  If we have a cached offset, we can use it.
 		 */
-		att = TupleDescAttr(tupleDesc, attnum);
+		att = TupleDescDeformAttr(tupleDesc, attnum);
 		if (att->attcacheoff >= 0)
-			return fetchatt(att, tp + att->attcacheoff);
+			return fetchatt_fast(att, tp + att->attcacheoff);
 
 		/*
 		 * Otherwise, check for non-fixed-length attrs up to and including
@@ -591,7 +595,7 @@ nocachegetattr(HeapTuple tup,
 
 			for (j = 0; j <= attnum; j++)
 			{
-				if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
+				if (TupleDescDeformAttr(tupleDesc, j)->attlen <= 0)
 				{
 					slow = true;
 					break;
@@ -614,18 +618,18 @@ nocachegetattr(HeapTuple tup,
 		 * fixed-width columns, in hope of avoiding future visits to this
 		 * routine.
 		 */
-		TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
+		TupleDescDeformAttr(tupleDesc, 0)->attcacheoff = 0;
 
 		/* we might have set some offsets in the slow path previously */
-		while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
+		while (j < natts && TupleDescDeformAttr(tupleDesc, j)->attcacheoff > 0)
 			j++;
 
-		off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
-			TupleDescAttr(tupleDesc, j - 1)->attlen;
+		off = TupleDescDeformAttr(tupleDesc, j - 1)->attcacheoff +
+			  TupleDescDeformAttr(tupleDesc, j - 1)->attlen;
 
 		for (; j < natts; j++)
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, j);
+			TupleDescDeformAttr *att = TupleDescDeformAttr(tupleDesc, j);
 
 			if (att->attlen <= 0)
 				break;
@@ -639,7 +643,7 @@ nocachegetattr(HeapTuple tup,
 
 		Assert(j > attnum);
 
-		off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
+		off = TupleDescDeformAttr(tupleDesc, attnum)->attcacheoff;
 	}
 	else
 	{
@@ -659,7 +663,7 @@ nocachegetattr(HeapTuple tup,
 		off = 0;
 		for (i = 0;; i++)		/* loop exit is at "break" */
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, i);
+			TupleDescDeformAttr *att = TupleDescDeformAttr(tupleDesc, i);
 
 			if (HeapTupleHasNulls(tup) && att_isnull(i, bp))
 			{
@@ -707,7 +711,7 @@ nocachegetattr(HeapTuple tup,
 		}
 	}
 
-	return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
+	return fetchatt_fast(TupleDescDeformAttr(tupleDesc, attnum), tp + off);
 }
 
 /* ----------------
@@ -892,7 +896,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 		{
 			if (attrmiss[attnum].am_present)
 			{
-				Form_pg_attribute att = TupleDescAttr(tupleDesc, attnum);
+				TupleDescDeformAttr *att = TupleDescDeformAttr(tupleDesc, attnum);
 
 				targetDataLen = att_align_datum(targetDataLen,
 												att->attalign,
@@ -1021,7 +1025,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 	for (attnum = sourceNatts; attnum < natts; attnum++)
 	{
 
-		Form_pg_attribute attr = TupleDescAttr(tupleDesc, attnum);
+		TupleDescDeformAttr *attr = TupleDescDeformAttr(tupleDesc, attnum);
 
 		if (attrmiss && attrmiss[attnum].am_present)
 		{
@@ -1370,7 +1374,7 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		TupleDescDeformAttr *thisatt = TupleDescDeformAttr(tupleDesc, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
@@ -1411,7 +1415,7 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 				thisatt->attcacheoff = off;
 		}
 
-		values[attnum] = fetchatt(thisatt, tp + off);
+		values[attnum] = fetchatt_fast(thisatt, tp + off);
 
 		off = att_addlength_pointer(off, thisatt->attlen, tp + off);
 
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index 79ae29989d..aac4214cc7 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -303,15 +303,15 @@ nocache_index_getattr(IndexTuple tup,
 
 	if (!slow)
 	{
-		Form_pg_attribute att;
+		TupleDescDeformAttr *att;
 
 		/*
 		 * If we get here, there are no nulls up to and including the target
 		 * attribute.  If we have a cached offset, we can use it.
 		 */
-		att = TupleDescAttr(tupleDesc, attnum);
+		att = TupleDescDeformAttr(tupleDesc, attnum);
 		if (att->attcacheoff >= 0)
-			return fetchatt(att, tp + att->attcacheoff);
+			return fetchatt_fast(att, tp + att->attcacheoff);
 
 		/*
 		 * Otherwise, check for non-fixed-length attrs up to and including
@@ -324,7 +324,7 @@ nocache_index_getattr(IndexTuple tup,
 
 			for (j = 0; j <= attnum; j++)
 			{
-				if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
+				if (TupleDescDeformAttr(tupleDesc, j)->attlen <= 0)
 				{
 					slow = true;
 					break;
@@ -347,18 +347,18 @@ nocache_index_getattr(IndexTuple tup,
 		 * fixed-width columns, in hope of avoiding future visits to this
 		 * routine.
 		 */
-		TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
+		TupleDescDeformAttr(tupleDesc, 0)->attcacheoff = 0;
 
 		/* we might have set some offsets in the slow path previously */
-		while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
+		while (j < natts && TupleDescDeformAttr(tupleDesc, j)->attcacheoff > 0)
 			j++;
 
-		off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
-			TupleDescAttr(tupleDesc, j - 1)->attlen;
+		off = TupleDescDeformAttr(tupleDesc, j - 1)->attcacheoff +
+			TupleDescDeformAttr(tupleDesc, j - 1)->attlen;
 
 		for (; j < natts; j++)
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, j);
+			TupleDescDeformAttr *att = TupleDescDeformAttr(tupleDesc, j);
 
 			if (att->attlen <= 0)
 				break;
@@ -372,7 +372,7 @@ nocache_index_getattr(IndexTuple tup,
 
 		Assert(j > attnum);
 
-		off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
+		off = TupleDescDeformAttr(tupleDesc, attnum)->attcacheoff;
 	}
 	else
 	{
@@ -392,7 +392,7 @@ nocache_index_getattr(IndexTuple tup,
 		off = 0;
 		for (i = 0;; i++)		/* loop exit is at "break" */
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, i);
+			TupleDescDeformAttr *att = TupleDescDeformAttr(tupleDesc, i);
 
 			if (IndexTupleHasNulls(tup) && att_isnull(i, bp))
 			{
@@ -440,7 +440,7 @@ nocache_index_getattr(IndexTuple tup,
 		}
 	}
 
-	return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
+	return fetchatt_fast(TupleDescDeformAttr(tupleDesc, attnum), tp + off);
 }
 
 /*
@@ -490,7 +490,7 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDescriptor, attnum);
+		TupleDescDeformAttr *thisatt = TupleDescDeformAttr(tupleDescriptor, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
@@ -531,7 +531,7 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 				thisatt->attcacheoff = off;
 		}
 
-		values[attnum] = fetchatt(thisatt, tp + off);
+		values[attnum] = fetchatt_fast(thisatt, tp + off);
 
 		off = att_addlength_pointer(off, thisatt->attlen, tp + off);
 
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index fba0026520..ee996f465a 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -56,6 +56,30 @@ ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
 	ResourceOwnerForget(owner, PointerGetDatum(tupdesc), &tupdesc_resowner_desc);
 }
 
+void
+populate_TupleDescAttr(TupleDescDeformAttr *dst, Form_pg_attribute src)
+{
+	dst->attcacheoff = -1;
+	dst->attlen = src->attlen;
+
+	dst->attflags = 0;
+
+	if (src->attbyval)
+		dst->attflags |= DEFORM_ATTR_FLAG_BYVAL;
+	if (src->attstorage != TYPSTORAGE_PLAIN)
+		dst->attflags |= DEFORM_ATTR_FLAG_IS_PACKABLE;
+	if (src->atthasmissing)
+		dst->attflags |= DEFORM_ATTR_FLAG_HAS_MISSING;
+	if (src->attisdropped)
+		dst->attflags |= DEFORM_ATTR_FLAG_IS_DROPPED;
+	if (src->attgenerated)
+		dst->attflags |= DEFORM_ATTR_FLAG_IS_GENERATED;
+	if (src->attnotnull)
+		dst->attflags |= DEFORM_ATTR_FLAG_IS_NOTNULL;
+
+	dst->attalign = src->attalign;
+}
+
 /*
  * CreateTemplateTupleDesc
  *		This function allocates an empty tuple descriptor structure.
@@ -85,7 +109,8 @@ CreateTemplateTupleDesc(int natts)
 	 * could be less due to trailing padding, although with the current
 	 * definition of pg_attribute there probably isn't any padding.
 	 */
-	desc = (TupleDesc) palloc(MAXALIGN(sizeof(TupleDescData)) +
+	desc = (TupleDesc) palloc(offsetof(struct TupleDescData, deform_attrs) +
+							  natts * sizeof(TupleDescDeformAttr) +
 							  natts * sizeof(FormData_pg_attribute));
 
 	/*
@@ -118,8 +143,11 @@ CreateTupleDesc(int natts, Form_pg_attribute *attrs)
 	desc = CreateTemplateTupleDesc(natts);
 
 	for (i = 0; i < natts; ++i)
+	{
 		memcpy(TupleDescAttr(desc, i), attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
-
+		populate_TupleDescAttr(TupleDescDeformAttr(desc, i),
+							   TupleDescAttr(desc, i));
+	}
 	return desc;
 }
 
@@ -156,6 +184,9 @@ CreateTupleDescCopy(TupleDesc tupdesc)
 		att->atthasmissing = false;
 		att->attidentity = '\0';
 		att->attgenerated = '\0';
+
+		populate_TupleDescAttr(TupleDescDeformAttr(desc, i),
+							   TupleDescAttr(desc, i));
 	}
 
 	/* We can copy the tuple type identification, too */
@@ -184,6 +215,10 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
 		   TupleDescAttr(tupdesc, 0),
 		   desc->natts * sizeof(FormData_pg_attribute));
 
+	for (i = 0; i < desc->natts; i++)
+		populate_TupleDescAttr(TupleDescDeformAttr(desc, i),
+							   TupleDescAttr(desc, i));
+
 	/* Copy the TupleConstr data structure, if any */
 	if (constr)
 	{
@@ -208,10 +243,10 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
 			{
 				if (constr->missing[i].am_present)
 				{
-					Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+					TupleDescDeformAttr *attr = TupleDescDeformAttr(tupdesc, i);
 
 					cpy->missing[i].am_value = datumCopy(constr->missing[i].am_value,
-														 attr->attbyval,
+														 DeformAttrByVal(attr),
 														 attr->attlen);
 				}
 			}
@@ -275,6 +310,9 @@ TupleDescCopy(TupleDesc dst, TupleDesc src)
 		att->atthasmissing = false;
 		att->attidentity = '\0';
 		att->attgenerated = '\0';
+
+		populate_TupleDescAttr(TupleDescDeformAttr(dst, i),
+							   TupleDescAttr(dst, i));
 	}
 	dst->constr = NULL;
 
@@ -329,6 +367,8 @@ TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
 	dstAtt->atthasmissing = false;
 	dstAtt->attidentity = '\0';
 	dstAtt->attgenerated = '\0';
+
+	populate_TupleDescAttr(TupleDescDeformAttr(dst, dstAttno - 1), dstAtt);
 }
 
 /*
@@ -528,10 +568,10 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
 					return false;
 				if (missval1->am_present)
 				{
-					Form_pg_attribute missatt1 = TupleDescAttr(tupdesc1, i);
+					TupleDescDeformAttr *missatt1 = TupleDescDeformAttr(tupdesc1, i);
 
 					if (!datumIsEqual(missval1->am_value, missval2->am_value,
-									  missatt1->attbyval, missatt1->attlen))
+									  DeformAttrByVal(missatt1), missatt1->attlen))
 						return false;
 				}
 			}
@@ -721,6 +761,9 @@ TupleDescInitEntry(TupleDesc desc,
 	att->attcompression = InvalidCompressionMethod;
 	att->attcollation = typeForm->typcollation;
 
+	populate_TupleDescAttr(TupleDescDeformAttr(desc, attributeNumber - 1),
+						   att);
+
 	ReleaseSysCache(tuple);
 }
 
@@ -828,6 +871,9 @@ TupleDescInitBuiltinEntry(TupleDesc desc,
 		default:
 			elog(ERROR, "unsupported type %u", oidtypeid);
 	}
+
+	populate_TupleDescAttr(TupleDescDeformAttr(desc, attributeNumber - 1),
+						   att);
 }
 
 /*
diff --git a/src/backend/access/gin/ginbulk.c b/src/backend/access/gin/ginbulk.c
index 7f89cd5e82..c2c03261fa 100644
--- a/src/backend/access/gin/ginbulk.c
+++ b/src/backend/access/gin/ginbulk.c
@@ -127,11 +127,11 @@ ginInitBA(BuildAccumulator *accum)
 static Datum
 getDatumCopy(BuildAccumulator *accum, OffsetNumber attnum, Datum value)
 {
-	Form_pg_attribute att;
+	TupleDescDeformAttr *att;
 	Datum		res;
 
-	att = TupleDescAttr(accum->ginstate->origTupdesc, attnum - 1);
-	if (att->attbyval)
+	att = TupleDescDeformAttr(accum->ginstate->origTupdesc, attnum - 1);
+	if (DeformAttrByVal(att))
 		res = value;
 	else
 	{
diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c
index 0b4f2ebadb..d869cf2d77 100644
--- a/src/backend/access/gin/ginget.c
+++ b/src/backend/access/gin/ginget.c
@@ -122,7 +122,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 				   GinScanEntry scanEntry, Snapshot snapshot)
 {
 	OffsetNumber attnum;
-	Form_pg_attribute attr;
+	TupleDescDeformAttr *attr;
 
 	/* Initialize empty bitmap result */
 	scanEntry->matchBitmap = tbm_create(work_mem * 1024L, NULL);
@@ -134,7 +134,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 
 	/* Locate tupdesc entry for key column (for attbyval/attlen data) */
 	attnum = scanEntry->attnum;
-	attr = TupleDescAttr(btree->ginstate->origTupdesc, attnum - 1);
+	attr = TupleDescDeformAttr(btree->ginstate->origTupdesc, attnum - 1);
 
 	/*
 	 * Predicate lock entry leaf page, following pages will be locked by
@@ -232,7 +232,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 			 * tuple after re-locking
 			 */
 			if (icategory == GIN_CAT_NORM_KEY)
-				idatum = datumCopy(idatum, attr->attbyval, attr->attlen);
+				idatum = datumCopy(idatum, DeformAttrByVal(attr), attr->attlen);
 
 			LockBuffer(stack->buffer, GIN_UNLOCK);
 
@@ -291,7 +291,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 				stack->off++;
 			}
 
-			if (icategory == GIN_CAT_NORM_KEY && !attr->attbyval)
+			if (icategory == GIN_CAT_NORM_KEY && !DeformAttrByVal(attr))
 				pfree(DatumGetPointer(idatum));
 		}
 		else
diff --git a/src/backend/access/gist/gistbuild.c b/src/backend/access/gist/gistbuild.c
index ba06df30fa..0779948dbd 100644
--- a/src/backend/access/gist/gistbuild.c
+++ b/src/backend/access/gist/gistbuild.c
@@ -657,10 +657,12 @@ gistInitBuffering(GISTBuildState *buildstate)
 	itupMinSize = (Size) MAXALIGN(sizeof(IndexTupleData));
 	for (i = 0; i < index->rd_att->natts; i++)
 	{
-		if (TupleDescAttr(index->rd_att, i)->attlen < 0)
+		TupleDescDeformAttr *attr = TupleDescDeformAttr(index->rd_att, i);
+
+		if (attr->attlen < 0)
 			itupMinSize += VARHDRSZ;
 		else
-			itupMinSize += TupleDescAttr(index->rd_att, i)->attlen;
+			itupMinSize += attr->attlen;
 	}
 
 	/* Calculate average and maximal number of index tuples which fit to page */
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 91b20147a0..205e601642 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -4080,8 +4080,6 @@ static bool
 heap_attr_equals(TupleDesc tupdesc, int attrnum, Datum value1, Datum value2,
 				 bool isnull1, bool isnull2)
 {
-	Form_pg_attribute att;
-
 	/*
 	 * If one value is NULL and other is not, then they are certainly not
 	 * equal
@@ -4111,9 +4109,11 @@ heap_attr_equals(TupleDesc tupdesc, int attrnum, Datum value1, Datum value2,
 	}
 	else
 	{
+		TupleDescDeformAttr *att;
+
 		Assert(attrnum <= tupdesc->natts);
-		att = TupleDescAttr(tupdesc, attrnum - 1);
-		return datumIsEqual(value1, value2, att->attbyval, att->attlen);
+		att = TupleDescDeformAttr(tupdesc, attrnum - 1);
+		return datumIsEqual(value1, value2, DeformAttrByVal(att), att->attlen);
 	}
 }
 
@@ -4194,7 +4194,7 @@ HeapDetermineColumnsInfo(Relation relation,
 		 * that system attributes can't be stored externally.
 		 */
 		if (attrnum < 0 || isnull1 ||
-			TupleDescAttr(tupdesc, attrnum - 1)->attlen != -1)
+			TupleDescDeformAttr(tupdesc, attrnum - 1)->attlen != -1)
 			continue;
 
 		/*
diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c
index 6f8b1b7929..16d6a62ee1 100644
--- a/src/backend/access/heap/heapam_handler.c
+++ b/src/backend/access/heap/heapam_handler.c
@@ -2524,7 +2524,7 @@ reform_and_rewrite_tuple(HeapTuple tuple,
 	/* Be sure to null out any dropped columns */
 	for (i = 0; i < newTupDesc->natts; i++)
 	{
-		if (TupleDescAttr(newTupDesc, i)->attisdropped)
+		if (DeformAttrIsDropped(TupleDescDeformAttr(newTupDesc, i)))
 			isnull[i] = true;
 	}
 
diff --git a/src/backend/access/heap/heaptoast.c b/src/backend/access/heap/heaptoast.c
index a420e16530..ffc8d15d31 100644
--- a/src/backend/access/heap/heaptoast.c
+++ b/src/backend/access/heap/heaptoast.c
@@ -369,7 +369,7 @@ toast_flatten_tuple(HeapTuple tup, TupleDesc tupleDesc)
 		/*
 		 * Look at non-null varlena attributes
 		 */
-		if (!toast_isnull[i] && TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (!toast_isnull[i] && TupleDescDeformAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
@@ -483,7 +483,7 @@ toast_flatten_tuple_to_datum(HeapTupleHeader tup,
 		 */
 		if (toast_isnull[i])
 			has_nulls = true;
-		else if (TupleDescAttr(tupleDesc, i)->attlen == -1)
+		else if (TupleDescDeformAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
@@ -584,7 +584,7 @@ toast_build_flattened_tuple(TupleDesc tupleDesc,
 		/*
 		 * Look at non-null varlena attributes
 		 */
-		if (!isnull[i] && TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (!isnull[i] && TupleDescDeformAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c
index d6de2072d4..bfc9daff41 100644
--- a/src/backend/access/nbtree/nbtutils.c
+++ b/src/backend/access/nbtree/nbtutils.c
@@ -4874,17 +4874,17 @@ _bt_keep_natts_fast(Relation rel, IndexTuple lastleft, IndexTuple firstright)
 					datum2;
 		bool		isNull1,
 					isNull2;
-		Form_pg_attribute att;
+		TupleDescDeformAttr *att;
 
 		datum1 = index_getattr(lastleft, attnum, itupdesc, &isNull1);
 		datum2 = index_getattr(firstright, attnum, itupdesc, &isNull2);
-		att = TupleDescAttr(itupdesc, attnum - 1);
+		att = TupleDescDeformAttr(itupdesc, attnum - 1);
 
 		if (isNull1 != isNull2)
 			break;
 
 		if (!isNull1 &&
-			!datum_image_eq(datum1, datum2, att->attbyval, att->attlen))
+			!datum_image_eq(datum1, datum2, DeformAttrByVal(att), att->attlen))
 			break;
 
 		keepnatts++;
diff --git a/src/backend/access/spgist/spgdoinsert.c b/src/backend/access/spgist/spgdoinsert.c
index a4995c168b..1cac593ec4 100644
--- a/src/backend/access/spgist/spgdoinsert.c
+++ b/src/backend/access/spgist/spgdoinsert.c
@@ -1974,7 +1974,7 @@ spgdoinsert(Relation index, SpGistState *state,
 	{
 		if (!isnulls[i])
 		{
-			if (TupleDescAttr(leafDescriptor, i)->attlen == -1)
+			if (TupleDescDeformAttr(leafDescriptor, i)->attlen == -1)
 				leafDatums[i] = PointerGetDatum(PG_DETOAST_DATUM(datums[i]));
 			else
 				leafDatums[i] = datums[i];
diff --git a/src/backend/access/table/toast_helper.c b/src/backend/access/table/toast_helper.c
index 53224932f0..361f0cbd88 100644
--- a/src/backend/access/table/toast_helper.c
+++ b/src/backend/access/table/toast_helper.c
@@ -324,7 +324,7 @@ toast_delete_external(Relation rel, const Datum *values, const bool *isnull,
 
 	for (i = 0; i < numAttrs; i++)
 	{
-		if (TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (TupleDescDeformAttr(tupleDesc, i)->attlen == -1)
 		{
 			Datum		value = values[i];
 
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index a819b4197c..b59ba2b45c 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -477,6 +477,8 @@ ConstructTupleDescriptor(Relation heapRelation,
 
 			ReleaseSysCache(tuple);
 		}
+
+		populate_TupleDescAttr(TupleDescDeformAttr(indexTupDesc, i), to);
 	}
 
 	pfree(amroutine);
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index df7a4a21c9..ecd2044a15 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -867,9 +867,9 @@ CopyGetAttnums(TupleDesc tupDesc, Relation rel, List *attnamelist)
 
 		for (i = 0; i < attr_count; i++)
 		{
-			if (TupleDescAttr(tupDesc, i)->attisdropped)
-				continue;
-			if (TupleDescAttr(tupDesc, i)->attgenerated)
+			TupleDescDeformAttr *attr = TupleDescDeformAttr(tupDesc, i);
+
+			if (DeformAttrIsDropped(attr) || DeformAttrIsGenerated(attr))
 				continue;
 			attnums = lappend_int(attnums, i + 1);
 		}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 8fcb188323..96034cdefc 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -944,6 +944,9 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
 			cookedDefaults = lappend(cookedDefaults, cooked);
 			attr->atthasdef = true;
 		}
+
+		populate_TupleDescAttr(TupleDescDeformAttr(descriptor, attnum - 1),
+							   attr);
 	}
 
 	/*
@@ -1350,6 +1353,8 @@ BuildDescForRelation(const List *columns)
 			att->attstorage = entry->storage;
 		else if (entry->storage_name)
 			att->attstorage = GetAttributeStorage(att->atttypid, entry->storage_name);
+
+		populate_TupleDescAttr(TupleDescDeformAttr(desc, attnum - 1), att);
 	}
 
 	if (has_not_null)
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index ccd4863778..4d87186ce9 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -594,9 +594,9 @@ ExecBuildUpdateProjection(List *targetList,
 	 */
 	for (int attnum = relDesc->natts; attnum > 0; attnum--)
 	{
-		Form_pg_attribute attr = TupleDescAttr(relDesc, attnum - 1);
+		TupleDescDeformAttr *attr = TupleDescDeformAttr(relDesc, attnum - 1);
 
-		if (attr->attisdropped)
+		if (DeformAttrIsDropped(attr))
 			continue;
 		if (bms_is_member(attnum, assignedCols))
 			continue;
@@ -690,9 +690,9 @@ ExecBuildUpdateProjection(List *targetList,
 	 */
 	for (int attnum = 1; attnum <= relDesc->natts; attnum++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(relDesc, attnum - 1);
+		TupleDescDeformAttr *attr = TupleDescDeformAttr(relDesc, attnum - 1);
 
-		if (attr->attisdropped)
+		if (DeformAttrIsDropped(attr))
 		{
 			/* Put a null into the ExprState's resvalue/resnull ... */
 			scratch.opcode = EEOP_CONST;
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index d8735286c4..22440cd10b 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -2798,7 +2798,7 @@ ExecEvalRowNullInt(ExprState *state, ExprEvalStep *op,
 	for (int att = 1; att <= tupDesc->natts; att++)
 	{
 		/* ignore dropped columns */
-		if (TupleDescAttr(tupDesc, att - 1)->attisdropped)
+		if (DeformAttrIsDropped(TupleDescDeformAttr(tupDesc, att - 1)))
 			continue;
 		if (heap_attisnull(&tmptup, att, tupDesc))
 		{
@@ -4838,10 +4838,10 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
 
 		for (int i = 0; i < var_tupdesc->natts; i++)
 		{
-			Form_pg_attribute vattr = TupleDescAttr(var_tupdesc, i);
-			Form_pg_attribute sattr = TupleDescAttr(tupleDesc, i);
+			TupleDescDeformAttr *vattr = TupleDescDeformAttr(var_tupdesc, i);
+			TupleDescDeformAttr *sattr = TupleDescDeformAttr(tupleDesc, i);
 
-			if (!vattr->attisdropped)
+			if (!DeformAttrIsDropped(vattr))
 				continue;		/* already checked non-dropped cols */
 			if (slot->tts_isnull[i])
 				continue;		/* null is always okay */
diff --git a/src/backend/executor/execJunk.c b/src/backend/executor/execJunk.c
index b962c31383..bff4213a6c 100644
--- a/src/backend/executor/execJunk.c
+++ b/src/backend/executor/execJunk.c
@@ -169,7 +169,7 @@ ExecInitJunkFilterConversion(List *targetList,
 		t = list_head(targetList);
 		for (i = 0; i < cleanLength; i++)
 		{
-			if (TupleDescAttr(cleanTupType, i)->attisdropped)
+			if (DeformAttrIsDropped(TupleDescDeformAttr(cleanTupType, i)))
 				continue;		/* map entry is already zero */
 			for (;;)
 			{
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 00dc339615..e651934918 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -187,10 +187,10 @@ tts_virtual_materialize(TupleTableSlot *slot)
 	/* compute size of memory required */
 	for (int natt = 0; natt < desc->natts; natt++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, natt);
+		TupleDescDeformAttr *att = TupleDescDeformAttr(desc, natt);
 		Datum		val;
 
-		if (att->attbyval || slot->tts_isnull[natt])
+		if (DeformAttrByVal(att) || slot->tts_isnull[natt])
 			continue;
 
 		val = slot->tts_values[natt];
@@ -223,10 +223,10 @@ tts_virtual_materialize(TupleTableSlot *slot)
 	/* and copy all attributes into the pre-allocated space */
 	for (int natt = 0; natt < desc->natts; natt++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, natt);
+		TupleDescDeformAttr *att = TupleDescDeformAttr(desc, natt);
 		Datum		val;
 
-		if (att->attbyval || slot->tts_isnull[natt])
+		if (DeformAttrByVal(att) || slot->tts_isnull[natt])
 			continue;
 
 		val = slot->tts_values[natt];
@@ -1044,7 +1044,7 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 
 	for (; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		TupleDescDeformAttr *thisatt = TupleDescDeformAttr(tupleDesc, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
@@ -1085,7 +1085,7 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 				thisatt->attcacheoff = off;
 		}
 
-		values[attnum] = fetchatt(thisatt, tp + off);
+		values[attnum] = fetchatt_fast(thisatt, tp + off);
 
 		off = att_addlength_pointer(off, thisatt->attlen, tp + off);
 
@@ -2237,7 +2237,7 @@ BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
 	 */
 	for (i = 0; i < natts; i++)
 	{
-		if (!TupleDescAttr(tupdesc, i)->attisdropped)
+		if (!DeformAttrIsDropped(TupleDescDeformAttr(tupdesc, i)))
 		{
 			/* Non-dropped attributes */
 			dvalues[i] = InputFunctionCall(&attinmeta->attinfuncs[i],
diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c
index 539cd0a999..7cd37fde34 100644
--- a/src/backend/executor/functions.c
+++ b/src/backend/executor/functions.c
@@ -1885,7 +1885,8 @@ check_sql_fn_retval(List *queryTreeLists,
 		/* remaining columns in rettupdesc had better all be dropped */
 		for (colindex++; colindex <= tupnatts; colindex++)
 		{
-			if (!TupleDescAttr(rettupdesc, colindex - 1)->attisdropped)
+			if (!DeformAttrIsDropped(TupleDescDeformAttr(rettupdesc,
+														colindex - 1)))
 				ereport(ERROR,
 						(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
 						 errmsg("return type mismatch in function declared to return %s",
diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c
index df8e3fff08..d73a4bb0c2 100644
--- a/src/backend/executor/nodeMemoize.c
+++ b/src/backend/executor/nodeMemoize.c
@@ -175,12 +175,12 @@ MemoizeHash_hash(struct memoize_hash *tb, const MemoizeKey *key)
 
 			if (!pslot->tts_isnull[i])	/* treat nulls as having hash key 0 */
 			{
-				Form_pg_attribute attr;
+				TupleDescDeformAttr *attr;
 				uint32		hkey;
 
-				attr = TupleDescAttr(pslot->tts_tupleDescriptor, i);
+				attr = TupleDescDeformAttr(pslot->tts_tupleDescriptor, i);
 
-				hkey = datum_image_hash(pslot->tts_values[i], attr->attbyval, attr->attlen);
+				hkey = datum_image_hash(pslot->tts_values[i], DeformAttrByVal(attr), attr->attlen);
 
 				hashkey ^= hkey;
 			}
@@ -242,7 +242,7 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
 
 		for (int i = 0; i < numkeys; i++)
 		{
-			Form_pg_attribute attr;
+			TupleDescDeformAttr *attr;
 
 			if (tslot->tts_isnull[i] != pslot->tts_isnull[i])
 			{
@@ -255,9 +255,9 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
 				continue;
 
 			/* perform binary comparison on the two datums */
-			attr = TupleDescAttr(tslot->tts_tupleDescriptor, i);
+			attr = TupleDescDeformAttr(tslot->tts_tupleDescriptor, i);
 			if (!datum_image_eq(tslot->tts_values[i], pslot->tts_values[i],
-								attr->attbyval, attr->attlen))
+								DeformAttrByVal(attr), attr->attlen))
 			{
 				match = false;
 				break;
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index a2442b7b0d..bf8d1e9702 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -495,14 +495,14 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
 
 	for (int i = 0; i < natts; i++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+		TupleDescDeformAttr *attr = TupleDescDeformAttr(tupdesc, i);
 
 		if (ri_GeneratedExprs[i])
 		{
 			Datum		val;
 			bool		isnull;
 
-			Assert(attr->attgenerated == ATTRIBUTE_GENERATED_STORED);
+			Assert(TupleDescAttr(tupdesc, i)->attgenerated == ATTRIBUTE_GENERATED_STORED);
 
 			econtext->ecxt_scantuple = slot;
 
@@ -513,7 +513,7 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
 			 * memory for a pass-by-reference Datum is located.
 			 */
 			if (!isnull)
-				val = datumCopy(val, attr->attbyval, attr->attlen);
+				val = datumCopy(val, DeformAttrByVal(attr), attr->attlen);
 
 			values[i] = val;
 			nulls[i] = isnull;
@@ -521,7 +521,7 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
 		else
 		{
 			if (!nulls[i])
-				values[i] = datumCopy(slot->tts_values[i], attr->attbyval, attr->attlen);
+				values[i] = datumCopy(slot->tts_values[i], DeformAttrByVal(attr), attr->attlen);
 		}
 	}
 
diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c
index 92948917a0..2ab8c52ead 100644
--- a/src/backend/executor/nodeValuesscan.c
+++ b/src/backend/executor/nodeValuesscan.c
@@ -142,8 +142,8 @@ ValuesNext(ValuesScanState *node)
 		foreach(lc, exprstatelist)
 		{
 			ExprState  *estate = (ExprState *) lfirst(lc);
-			Form_pg_attribute attr = TupleDescAttr(slot->tts_tupleDescriptor,
-												   resind);
+			TupleDescDeformAttr *attr = TupleDescDeformAttr(slot->tts_tupleDescriptor,
+															resind);
 
 			values[resind] = ExecEvalExpr(estate,
 										  econtext,
diff --git a/src/backend/executor/tstoreReceiver.c b/src/backend/executor/tstoreReceiver.c
index de4646b5c2..616530b5b6 100644
--- a/src/backend/executor/tstoreReceiver.c
+++ b/src/backend/executor/tstoreReceiver.c
@@ -65,9 +65,9 @@ tstoreStartupReceiver(DestReceiver *self, int operation, TupleDesc typeinfo)
 	{
 		for (i = 0; i < natts; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(typeinfo, i);
+			TupleDescDeformAttr *attr = TupleDescDeformAttr(typeinfo, i);
 
-			if (attr->attisdropped)
+			if (DeformAttrIsDropped(attr))
 				continue;
 			if (attr->attlen == -1)
 			{
@@ -154,9 +154,9 @@ tstoreReceiveSlot_detoast(TupleTableSlot *slot, DestReceiver *self)
 	for (i = 0; i < natts; i++)
 	{
 		Datum		val = slot->tts_values[i];
-		Form_pg_attribute attr = TupleDescAttr(typeinfo, i);
+		TupleDescDeformAttr *attr = TupleDescDeformAttr(typeinfo, i);
 
-		if (!attr->attisdropped && attr->attlen == -1 && !slot->tts_isnull[i])
+		if (!DeformAttrIsDropped(attr) && attr->attlen == -1 && !slot->tts_isnull[i])
 		{
 			if (VARATT_IS_EXTERNAL(DatumGetPointer(val)))
 			{
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index 9efdd844aa..5e1c452753 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -174,19 +174,19 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
 	{
 		for (int i = 0; i < relation->rd_att->natts; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i);
+			TupleDescDeformAttr *attr = TupleDescDeformAttr(relation->rd_att, i);
 
-			if (attr->attnotnull)
+			if (DeformAttrIsNotNull(attr))
 			{
 				rel->notnullattnums = bms_add_member(rel->notnullattnums,
-													 attr->attnum);
+													 i + 1);
 
 				/*
 				 * Per RemoveAttributeById(), dropped columns will have their
 				 * attnotnull unset, so we needn't check for dropped columns
 				 * in the above condition.
 				 */
-				Assert(!attr->attisdropped);
+				Assert(!DeformAttrIsDropped(attr));
 			}
 		}
 	}
diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c
index abef4eaf68..02d0211911 100644
--- a/src/backend/replication/pgoutput/pgoutput.c
+++ b/src/backend/replication/pgoutput/pgoutput.c
@@ -1305,7 +1305,7 @@ pgoutput_row_filter(Relation relation, TupleTableSlot *old_slot,
 	 */
 	for (i = 0; i < desc->natts; i++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, i);
+		TupleDescDeformAttr *att = TupleDescDeformAttr(desc, i);
 
 		/*
 		 * if the column in the new tuple or old tuple is null, nothing to do
diff --git a/src/backend/utils/adt/expandedrecord.c b/src/backend/utils/adt/expandedrecord.c
index 7e85ae3825..d0b28d48fb 100644
--- a/src/backend/utils/adt/expandedrecord.c
+++ b/src/backend/utils/adt/expandedrecord.c
@@ -699,10 +699,10 @@ ER_get_flat_size(ExpandedObjectHeader *eohptr)
 	{
 		for (i = 0; i < erh->nfields; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+			TupleDescDeformAttr *attr = TupleDescDeformAttr(tupdesc, i);
 
 			if (!erh->dnulls[i] &&
-				!attr->attbyval && attr->attlen == -1 &&
+				!DeformAttrByVal(attr) && attr->attlen == -1 &&
 				VARATT_IS_EXTERNAL(DatumGetPointer(erh->dvalues[i])))
 			{
 				/*
@@ -1115,7 +1115,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 								   bool check_constraints)
 {
 	TupleDesc	tupdesc;
-	Form_pg_attribute attr;
+	TupleDescDeformAttr *attr;
 	Datum	   *dvalues;
 	bool	   *dnulls;
 	char	   *oldValue;
@@ -1146,8 +1146,8 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 	 * Copy new field value into record's context, and deal with detoasting,
 	 * if needed.
 	 */
-	attr = TupleDescAttr(tupdesc, fnumber - 1);
-	if (!isnull && !attr->attbyval)
+	attr = TupleDescDeformAttr(tupdesc, fnumber - 1);
+	if (!isnull && !DeformAttrByVal(attr))
 	{
 		MemoryContext oldcxt;
 
@@ -1201,7 +1201,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 	erh->flat_size = 0;
 
 	/* Grab old field value for pfree'ing, if needed. */
-	if (!attr->attbyval && !dnulls[fnumber - 1])
+	if (!DeformAttrByVal(attr) && !dnulls[fnumber - 1])
 		oldValue = (char *) DatumGetPointer(dvalues[fnumber - 1]);
 	else
 		oldValue = NULL;
@@ -1279,18 +1279,18 @@ expanded_record_set_fields(ExpandedRecordHeader *erh,
 
 	for (fnumber = 0; fnumber < erh->nfields; fnumber++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, fnumber);
+		TupleDescDeformAttr *attr = TupleDescDeformAttr(tupdesc, fnumber);
 		Datum		newValue;
 		bool		isnull;
 
 		/* Ignore dropped columns */
-		if (attr->attisdropped)
+		if (DeformAttrIsDropped(attr))
 			continue;
 
 		newValue = newValues[fnumber];
 		isnull = isnulls[fnumber];
 
-		if (!attr->attbyval)
+		if (!DeformAttrByVal(attr))
 		{
 			/*
 			 * Copy new field value into record's context, and deal with
@@ -1541,9 +1541,9 @@ check_domain_for_new_field(ExpandedRecordHeader *erh, int fnumber,
 	 */
 	if (!isnull)
 	{
-		Form_pg_attribute attr = TupleDescAttr(erh->er_tupdesc, fnumber - 1);
+		TupleDescDeformAttr *attr = TupleDescDeformAttr(erh->er_tupdesc, fnumber - 1);
 
-		if (!attr->attbyval && attr->attlen == -1 &&
+		if (!DeformAttrByVal(attr) && attr->attlen == -1 &&
 			VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
 			dummy_erh->flags |= ER_FLAG_HAVE_EXTERNAL;
 	}
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 62601a6d80..f4637e466a 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -2833,9 +2833,9 @@ ri_KeysEqual(Relation rel, TupleTableSlot *oldslot, TupleTableSlot *newslot,
 			 * difference for ON UPDATE CASCADE, but for consistency we treat
 			 * all changes to the PK the same.
 			 */
-			Form_pg_attribute att = TupleDescAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
+			TupleDescDeformAttr *att = TupleDescDeformAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
 
-			if (!datum_image_eq(oldvalue, newvalue, att->attbyval, att->attlen))
+			if (!datum_image_eq(oldvalue, newvalue, DeformAttrByVal(att), att->attlen))
 				return false;
 		}
 		else
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 930cc03ee2..0b9a97d174 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -586,6 +586,10 @@ RelationBuildTupleDesc(Relation relation)
 			   attp,
 			   ATTRIBUTE_FIXED_PART_SIZE);
 
+		populate_TupleDescAttr(TupleDescDeformAttr(relation->rd_att,
+												   attnum - 1),
+							   attp);
+
 		/* Update constraint/default info */
 		if (attp->attnotnull)
 			constr->has_not_null = true;
@@ -1967,6 +1971,9 @@ formrdesc(const char *relationName, Oid relationReltype,
 		has_not_null |= attrs[i].attnotnull;
 		/* make sure attcacheoff is valid */
 		TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
+
+		populate_TupleDescAttr(TupleDescDeformAttr(relation->rd_att, i),
+							   TupleDescAttr(relation->rd_att, i));
 	}
 
 	/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
@@ -4436,6 +4443,9 @@ BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs)
 		memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
 		/* make sure attcacheoff is valid */
 		TupleDescAttr(result, i)->attcacheoff = -1;
+
+		populate_TupleDescAttr(TupleDescDeformAttr(result, i),
+							   TupleDescAttr(result, i));
 	}
 
 	/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
@@ -6174,6 +6184,8 @@ load_relcache_init_file(bool shared)
 				goto read_failed;
 
 			has_not_null |= attr->attnotnull;
+
+			populate_TupleDescAttr(TupleDescDeformAttr(rel->rd_att, i), attr);
 		}
 
 		/* next read the access method specific field */
diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h
index 5e38ef8696..92f5882b27 100644
--- a/src/include/access/htup_details.h
+++ b/src/include/access/htup_details.h
@@ -758,12 +758,12 @@ fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 	*isnull = false;
 	if (HeapTupleNoNulls(tup))
 	{
-		Form_pg_attribute att;
+		TupleDescDeformAttr *att;
 
-		att = TupleDescAttr(tupleDesc, attnum - 1);
+		att = TupleDescDeformAttr(tupleDesc, attnum - 1);
 		if (att->attcacheoff >= 0)
-			return fetchatt(att, (char *) tup->t_data + tup->t_data->t_hoff +
-							att->attcacheoff);
+			return fetchatt_fast(att, (char *) tup->t_data + tup->t_data->t_hoff +
+								 att->attcacheoff);
 		else
 			return nocachegetattr(tup, attnum, tupleDesc);
 	}
diff --git a/src/include/access/itup.h b/src/include/access/itup.h
index 94885751e5..f9d33e3bb1 100644
--- a/src/include/access/itup.h
+++ b/src/include/access/itup.h
@@ -117,18 +117,21 @@ IndexInfoFindDataOffset(unsigned short t_info)
 static inline Datum
 index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 {
+	TupleDescDeformAttr *attr;
+
 	Assert(PointerIsValid(isnull));
 	Assert(attnum > 0);
 
 	*isnull = false;
+	attr = TupleDescDeformAttr(tupleDesc, attnum - 1);
 
 	if (!IndexTupleHasNulls(tup))
 	{
-		if (TupleDescAttr(tupleDesc, attnum - 1)->attcacheoff >= 0)
+		if (attr->attcacheoff >= 0)
 		{
-			return fetchatt(TupleDescAttr(tupleDesc, attnum - 1),
-							(char *) tup + IndexInfoFindDataOffset(tup->t_info)
-							+ TupleDescAttr(tupleDesc, attnum - 1)->attcacheoff);
+			return fetchatt_fast(attr,
+								 (char *) tup + IndexInfoFindDataOffset(tup->t_info) +
+								 attr->attcacheoff);
 		}
 		else
 			return nocache_index_getattr(tup, attnum, tupleDesc);
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 2c435cdcb2..908c32254e 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -45,6 +45,43 @@ typedef struct TupleConstr
 	bool		has_generated_stored;
 } TupleConstr;
 
+/*
+ * Cut-down version of FormData_pg_attribute for faster access for tuple
+ * deformation.
+ */
+typedef struct TupleDescDeformAttr
+{
+	int32	attcacheoff;
+	int16	attlen;
+	uint8	attflags;
+	char	attalign;
+} TupleDescDeformAttr;
+
+#define DEFORM_ATTR_FLAG_BYVAL			(1 << 0)
+#define DEFORM_ATTR_FLAG_IS_PACKABLE	(1 << 1)
+#define DEFORM_ATTR_FLAG_HAS_MISSING	(1 << 2)
+#define DEFORM_ATTR_FLAG_IS_DROPPED		(1 << 3)
+#define DEFORM_ATTR_FLAG_IS_GENERATED	(1 << 4)
+#define DEFORM_ATTR_FLAG_IS_NOTNULL		(1 << 5)
+
+#define DeformAttrByVal(att) \
+	(((att)->attflags & DEFORM_ATTR_FLAG_BYVAL) != 0)
+
+#define DeformAttrIsPackable(att) \
+	(((att)->attflags & DEFORM_ATTR_FLAG_IS_PACKABLE) != 0)
+
+#define DeformAttrHasMissing(att) \
+	(((att)->attflags & DEFORM_ATTR_FLAG_HAS_MISSING) != 0)
+
+#define DeformAttrIsDropped(att) \
+	(((att)->attflags & DEFORM_ATTR_FLAG_IS_DROPPED) != 0)
+
+#define DeformAttrIsGenerated(att) \
+	(((att)->attflags & DEFORM_ATTR_FLAG_IS_GENERATED) != 0)
+
+#define DeformAttrIsNotNull(att) \
+	(((att)->attflags & DEFORM_ATTR_FLAG_IS_NOTNULL) != 0)
+
 /*
  * This struct is passed around within the backend to describe the structure
  * of tuples.  For tuples coming from on-disk relations, the information is
@@ -85,12 +122,19 @@ typedef struct TupleDescData
 	TupleConstr *constr;		/* constraints, or NULL if none */
 	/* attrs[N] is the description of Attribute Number N+1 */
 	FormData_pg_attribute *attrs;
+	TupleDescDeformAttr deform_attrs[FLEXIBLE_ARRAY_MEMBER];
 }			TupleDescData;
 typedef struct TupleDescData *TupleDesc;
 
 /* Accessor for the i'th attribute of tupdesc. */
 #define TupleDescAttr(tupdesc, i) (&(tupdesc)->attrs[(i)])
 
+/* Accessor for the i'th TupleDescAttr of tupdesc */
+#define TupleDescDeformAttr(tupdesc, i) (&(tupdesc)->deform_attrs[(i)])
+
+extern void populate_TupleDescAttr(TupleDescDeformAttr *dst,
+								   Form_pg_attribute src);
+
 extern TupleDesc CreateTemplateTupleDesc(int natts);
 
 extern TupleDesc CreateTupleDesc(int natts, Form_pg_attribute *attrs);
@@ -99,13 +143,15 @@ extern TupleDesc CreateTupleDescCopy(TupleDesc tupdesc);
 
 extern TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc);
 
-#define TupleDescSize(src) MAXALIGN(sizeof(TupleDescData))
+#define TupleDescSize(src) \
+	(offsetof(struct TupleDescData, deform_attrs) + \
+	 (src)->natts * sizeof(TupleDescDeformAttr))
 
 #define TupleDescFullSize(src) \
-	(MAXALIGN(sizeof(TupleDescData)) + sizeof(FormData_pg_attribute) * (src)->natts)
+	(TupleDescSize(src) + sizeof(FormData_pg_attribute) * (src)->natts)
 
 #define TupleDescAttrAddress(desc) \
-	(Form_pg_attribute) ((char *) (desc) + MAXALIGN(sizeof(TupleDescData)))
+	(Form_pg_attribute) ((char *) (desc) + TupleDescSize(desc))
 
 extern void TupleDescCopy(TupleDesc dst, TupleDesc src);
 
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index 58b3a58cfd..f96820f64a 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -45,6 +45,8 @@ att_isnull(int ATT, const bits8 *BITS)
  */
 #define fetchatt(A,T) fetch_att(T, (A)->attbyval, (A)->attlen)
 
+#define fetchatt_fast(A, T) fetch_att(T, DeformAttrByVal(A), (A)->attlen)
+
 /*
  * Same, but work from byval/len parameters rather than Form_pg_attribute.
  */
-- 
2.34.1

v1-0004-Optimize-alignment-calculations-in-tuple-form-def.patchapplication/octet-stream; name=v1-0004-Optimize-alignment-calculations-in-tuple-form-def.patchDownload
From 3b8b55f3b2790d709751cc6736f39cd6c17fd4af Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Wed, 29 May 2024 12:19:03 +1200
Subject: [PATCH v1 4/4] Optimize alignment calculations in tuple form/deform

This converts TupleDescDeformAttr.attalign from a char which is directly
derived from pg_attribute.attalign into a uint8 which specifies the
number of bytes to align the column by.  This removes the complexity of
checking each char value and transforming that into the appropriate
alignment call.  This can just be a simple TYPEALIGN passing in the
number of bytes.
---
 contrib/amcheck/verify_heapam.c        |  6 +--
 contrib/pageinspect/heapfuncs.c        |  6 +--
 src/backend/access/brin/brin_tuple.c   |  8 ++--
 src/backend/access/common/heaptuple.c  | 52 +++++++++++++-------------
 src/backend/access/common/indextuple.c | 22 +++++------
 src/backend/access/common/tupdesc.c    | 20 +++++++++-
 src/backend/executor/execTuples.c      | 19 +++++-----
 src/include/access/tupdesc.h           |  8 ++--
 src/include/access/tupmacs.h           | 15 ++++++++
 9 files changed, 93 insertions(+), 63 deletions(-)

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index 125d594826..ac8e38d2a6 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1592,7 +1592,7 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	/* Skip non-varlena values, but update offset first */
 	if (thisatt->attlen != -1)
 	{
-		ctx->offset = att_align_nominal(ctx->offset, thisatt->attalign);
+		ctx->offset = att_align_nominal_fast(ctx->offset, thisatt->attalign);
 		ctx->offset = att_addlength_pointer(ctx->offset, thisatt->attlen,
 											tp + ctx->offset);
 		if (ctx->tuphdr->t_hoff + ctx->offset > ctx->lp_len)
@@ -1608,8 +1608,8 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	}
 
 	/* Ok, we're looking at a varlena attribute. */
-	ctx->offset = att_align_pointer(ctx->offset, thisatt->attalign, -1,
-									tp + ctx->offset);
+	ctx->offset = att_align_pointer_fast(ctx->offset, thisatt->attalign, -1,
+										 tp + ctx->offset);
 
 	/* Get the (possibly corrupt) varlena datum */
 	attdatum = fetchatt_fast(thisatt, tp + ctx->offset);
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index e610aa69c6..a0d5e511be 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -354,8 +354,8 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 
 			if (attr->attlen == -1)
 			{
-				off = att_align_pointer(off, attr->attalign, -1,
-										tupdata + off);
+				off = att_align_pointer_fast(off, attr->attalign, -1,
+											 tupdata + off);
 
 				/*
 				 * As VARSIZE_ANY throws an exception if it can't properly
@@ -373,7 +373,7 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 			}
 			else
 			{
-				off = att_align_nominal(off, attr->attalign);
+				off = att_align_nominal_fast(off, attr->attalign);
 				len = attr->attlen;
 			}
 
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index 213b873867..f3ea5b3097 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -703,13 +703,13 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
 
 			if (thisatt->attlen == -1)
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_align_pointer_fast(off, thisatt->attalign, -1,
+											 tp + off);
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, thisatt->attalign);
+				/* not varlena, so safe to use att_align_nominal_fast */
+				off = att_align_nominal_fast(off, thisatt->attalign);
 			}
 
 			values[stored++] = fetchatt_fast(thisatt, tp + off);
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 963b88c27b..0a6eb663be 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -250,13 +250,13 @@ heap_compute_data_size(TupleDesc tupleDesc,
 			 * we want to flatten the expanded value so that the constructed
 			 * tuple doesn't depend on it
 			 */
-			data_length = att_align_nominal(data_length, atti->attalign);
+			data_length = att_align_nominal_fast(data_length, atti->attalign);
 			data_length += EOH_get_flat_size(DatumGetEOHP(val));
 		}
 		else
 		{
-			data_length = att_align_datum(data_length, atti->attalign,
-										  atti->attlen, val);
+			data_length = att_align_datum_fast(data_length, atti->attalign,
+											   atti->attlen, val);
 			data_length = att_addlength_datum(data_length, atti->attlen,
 											  val);
 		}
@@ -307,13 +307,13 @@ fill_val(TupleDescDeformAttr *att,
 	}
 
 	/*
-	 * XXX we use the att_align macros on the pointer value itself, not on an
-	 * offset.  This is a bit of a hack.
+	 * XXX we use the att_align_nominal_fast macro on the pointer value
+	 * itself, not on an offset.  This is a bit of a hack.
 	 */
 	if (DeformAttrByVal(att))
 	{
 		/* pass-by-value */
-		data = (char *) att_align_nominal(data, att->attalign);
+		data = (char *) att_align_nominal_fast(data, att->attalign);
 		store_att_byval(data, datum, att->attlen);
 		data_length = att->attlen;
 	}
@@ -333,8 +333,7 @@ fill_val(TupleDescDeformAttr *att,
 				 */
 				ExpandedObjectHeader *eoh = DatumGetEOHP(datum);
 
-				data = (char *) att_align_nominal(data,
-												  att->attalign);
+				data = (char *) att_align_nominal_fast(data, att->attalign);
 				data_length = EOH_get_flat_size(eoh);
 				EOH_flatten_into(eoh, data, data_length);
 			}
@@ -363,8 +362,7 @@ fill_val(TupleDescDeformAttr *att,
 		else
 		{
 			/* full 4-byte header varlena */
-			data = (char *) att_align_nominal(data,
-											  att->attalign);
+			data = (char *) att_align_nominal_fast(data, att->attalign);
 			data_length = VARSIZE(val);
 			memcpy(data, val, data_length);
 		}
@@ -373,14 +371,14 @@ fill_val(TupleDescDeformAttr *att,
 	{
 		/* cstring ... never needs alignment */
 		*infomask |= HEAP_HASVARWIDTH;
-		Assert(att->attalign == TYPALIGN_CHAR);
+		Assert(att->attalign == sizeof(char));
 		data_length = strlen(DatumGetCString(datum)) + 1;
 		memcpy(data, DatumGetPointer(datum), data_length);
 	}
 	else
 	{
 		/* fixed-length pass-by-reference */
-		data = (char *) att_align_nominal(data, att->attalign);
+		data = (char *) att_align_nominal_fast(data, att->attalign);
 		Assert(att->attlen > 0);
 		data_length = att->attlen;
 		memcpy(data, DatumGetPointer(datum), data_length);
@@ -634,7 +632,7 @@ nocachegetattr(HeapTuple tup,
 			if (att->attlen <= 0)
 				break;
 
-			off = att_align_nominal(off, att->attalign);
+			off = att_align_nominal_fast(off, att->attalign);
 
 			att->attcacheoff = off;
 
@@ -683,19 +681,19 @@ nocachegetattr(HeapTuple tup,
 				 * either an aligned or unaligned value.
 				 */
 				if (usecache &&
-					off == att_align_nominal(off, att->attalign))
+					off == att_align_nominal_fast(off, att->attalign))
 					att->attcacheoff = off;
 				else
 				{
-					off = att_align_pointer(off, att->attalign, -1,
-											tp + off);
+					off = att_align_pointer_fast(off, att->attalign, -1,
+												 tp + off);
 					usecache = false;
 				}
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, att->attalign);
+				/* not varlena, so safe to use att_align_nominal_fast */
+				off = att_align_nominal_fast(off, att->attalign);
 
 				if (usecache)
 					att->attcacheoff = off;
@@ -898,10 +896,10 @@ expand_tuple(HeapTuple *targetHeapTuple,
 			{
 				TupleDescDeformAttr *att = TupleDescDeformAttr(tupleDesc, attnum);
 
-				targetDataLen = att_align_datum(targetDataLen,
-												att->attalign,
-												att->attlen,
-												attrmiss[attnum].am_value);
+				targetDataLen = att_align_datum_fast(targetDataLen,
+													 att->attalign,
+													 att->attlen,
+													 attrmiss[attnum].am_value);
 
 				targetDataLen = att_addlength_pointer(targetDataLen,
 													  att->attlen,
@@ -1397,19 +1395,19 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_align_nominal_fast(off, thisatt->attalign))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_align_pointer_fast(off, thisatt->attalign, -1,
+											 tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_align_nominal_fast */
+			off = att_align_nominal_fast(off, thisatt->attalign);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index aac4214cc7..5445300ceb 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -363,7 +363,7 @@ nocache_index_getattr(IndexTuple tup,
 			if (att->attlen <= 0)
 				break;
 
-			off = att_align_nominal(off, att->attalign);
+			off = att_align_nominal_fast(off, att->attalign);
 
 			att->attcacheoff = off;
 
@@ -412,19 +412,19 @@ nocache_index_getattr(IndexTuple tup,
 				 * either an aligned or unaligned value.
 				 */
 				if (usecache &&
-					off == att_align_nominal(off, att->attalign))
+					off == att_align_nominal_fast(off, att->attalign))
 					att->attcacheoff = off;
 				else
 				{
-					off = att_align_pointer(off, att->attalign, -1,
-											tp + off);
+					off = att_align_pointer_fast(off, att->attalign, -1,
+												 tp + off);
 					usecache = false;
 				}
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, att->attalign);
+				/* not varlena, so safe to use att_align_nominal_fast */
+				off = att_align_nominal_fast(off, att->attalign);
 
 				if (usecache)
 					att->attcacheoff = off;
@@ -513,19 +513,19 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_align_nominal_fast(off, thisatt->attalign))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_align_pointer_fast(off, thisatt->attalign, -1,
+											 tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_align_nominal_fast */
+			off = att_align_nominal_fast(off, thisatt->attalign);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index ee996f465a..cd6e3be4fd 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -77,7 +77,25 @@ populate_TupleDescAttr(TupleDescDeformAttr *dst, Form_pg_attribute src)
 	if (src->attnotnull)
 		dst->attflags |= DEFORM_ATTR_FLAG_IS_NOTNULL;
 
-	dst->attalign = src->attalign;
+	switch (src->attalign)
+	{
+		case TYPALIGN_INT:
+			dst->attalign = ALIGNOF_INT;
+			break;
+		case TYPALIGN_CHAR:
+			dst->attalign = sizeof(char);
+			break;
+		case TYPALIGN_DOUBLE:
+			dst->attalign = ALIGNOF_DOUBLE;
+			break;
+		case TYPALIGN_SHORT:
+			dst->attalign = ALIGNOF_SHORT;
+			break;
+		default:
+			dst->attalign = 0;
+			elog(ERROR, "invalid attalign value: %c", src->attalign);
+			break;
+	}
 }
 
 /*
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index e651934918..ffb0666e91 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -202,12 +202,12 @@ tts_virtual_materialize(TupleTableSlot *slot)
 			 * We want to flatten the expanded value so that the materialized
 			 * slot doesn't depend on it.
 			 */
-			sz = att_align_nominal(sz, att->attalign);
+			sz = att_align_nominal_fast(sz, att->attalign);
 			sz += EOH_get_flat_size(DatumGetEOHP(val));
 		}
 		else
 		{
-			sz = att_align_nominal(sz, att->attalign);
+			sz = att_align_nominal_fast(sz, att->attalign);
 			sz = att_addlength_datum(sz, att->attlen, val);
 		}
 	}
@@ -242,8 +242,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 			 */
 			ExpandedObjectHeader *eoh = DatumGetEOHP(val);
 
-			data = (char *) att_align_nominal(data,
-											  att->attalign);
+			data = (char *) att_align_nominal_fast(data, att->attalign);
 			data_length = EOH_get_flat_size(eoh);
 			EOH_flatten_into(eoh, data, data_length);
 
@@ -254,7 +253,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 		{
 			Size		data_length = 0;
 
-			data = (char *) att_align_nominal(data, att->attalign);
+			data = (char *) att_align_nominal_fast(data, att->attalign);
 			data_length = att_addlength_datum(data_length, att->attlen, val);
 
 			memcpy(data, DatumGetPointer(val), data_length);
@@ -1067,19 +1066,19 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_align_nominal_fast(off, thisatt->attalign))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_align_pointer_fast(off, thisatt->attalign, -1,
+											 tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_align_nominal_fast */
+			off = att_align_nominal_fast(off, thisatt->attalign);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 908c32254e..5150b155b3 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -51,10 +51,10 @@ typedef struct TupleConstr
  */
 typedef struct TupleDescDeformAttr
 {
-	int32	attcacheoff;
-	int16	attlen;
-	uint8	attflags;
-	char	attalign;
+	int32	attcacheoff; /* fixed offset into tuple, if known, or -1 */
+	int16	attlen;		/* attr len in bytes or -1 = varlen, -2 = cstring */
+	uint8	attflags;	/* bit flags for compact storage of bool fields */
+	uint8	attalign;	/* alignment requirement in bytes */
 } TupleDescDeformAttr;
 
 #define DEFORM_ATTR_FLAG_BYVAL			(1 << 0)
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index f96820f64a..7cce4e48a8 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -92,6 +92,12 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	att_align_nominal(cur_offset, attalign) \
 )
 
+#define att_align_datum_fast(cur_offset, attalign, attlen, attdatum) \
+( \
+	((attlen) == -1 && VARATT_IS_SHORT(DatumGetPointer(attdatum))) ? \
+	(uintptr_t) (cur_offset) : \
+	TYPEALIGN(attalign, cur_offset))
+
 /*
  * att_align_pointer performs the same calculation as att_align_datum,
  * but is used when walking a tuple.  attptr is the current actual data
@@ -113,6 +119,12 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	att_align_nominal(cur_offset, attalign) \
 )
 
+#define att_align_pointer_fast(cur_offset, attalign, attlen, attptr) \
+( \
+	((attlen) == -1 && VARATT_NOT_PAD_BYTE(attptr)) ? \
+	(uintptr_t) (cur_offset) : \
+	TYPEALIGN(attalign, cur_offset))
+
 /*
  * att_align_nominal aligns the given offset as needed for a datum of alignment
  * requirement attalign, ignoring any consideration of packed varlena datums.
@@ -139,6 +151,9 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	   ))) \
 )
 
+#define att_align_nominal_fast(cur_offset, attalign) \
+	TYPEALIGN(attalign, (uintptr_t) cur_offset)
+
 /*
  * att_addlength_datum increments the given offset by the space needed for
  * the given Datum variable.  attdatum is only accessed if we are dealing
-- 
2.34.1

#2Andy Fan
zhihuifan1213@163.com
In reply to: David Rowley (#1)
Re: Make tuple deformation faster

David Rowley <dgrowleyml@gmail.com> writes:

Currently, TupleDescData contains the descriptor's attributes in a
variable length array of FormData_pg_attribute allocated within the
same allocation as the TupleDescData. According to my IDE,
sizeof(FormData_pg_attribute) == 104 bytes. It's that large mainly due
to attname being 64 bytes. The TupleDescData.attrs[] array could end
up quite large on tables with many columns and that could result in
poor CPU cache hit ratios when deforming tuples.

...

To test the performance of this, I tried using the attached script
which creates a table where the first column is a variable length
column and the final column is an int. The query I ran to test the
performance inserted 1 million rows into this table and performed a
sum() on the final column. The attached graph shows that the query is
30% faster than master with 15 columns between the first and last
column.

Yet another a wonderful optimization! I just want to know how did you
find this optimization (CPU cache hit) case and think it worths some
time. because before we invest our time to optimize something, it is
better know that we can get some measurable improvement after our time
is spend. At for this case, 30% is really a huge number even it is a
artificial case.

Another case is Andrew introduced NullableDatum 5 years ago and said using
it in TupleTableSlot could be CPU cache friendly, I can follow that, but
how much it can improve in an ideal case, is it possible to forecast it
somehow? I ask it here because both cases are optimizing for CPU cache..

--
Best Regards
Andy Fan

#3David Rowley
dgrowleyml@gmail.com
In reply to: Andy Fan (#2)
Re: Make tuple deformation faster

On Mon, 1 Jul 2024 at 21:17, Andy Fan <zhihuifan1213@163.com> wrote:

Yet another a wonderful optimization! I just want to know how did you
find this optimization (CPU cache hit) case and think it worths some
time. because before we invest our time to optimize something, it is
better know that we can get some measurable improvement after our time
is spend. At for this case, 30% is really a huge number even it is a
artificial case.

Another case is Andrew introduced NullableDatum 5 years ago and said using
it in TupleTableSlot could be CPU cache friendly, I can follow that, but
how much it can improve in an ideal case, is it possible to forecast it
somehow? I ask it here because both cases are optimizing for CPU cache..

Have a look at:

perf stat --pid=<backend pid>

On my AMD Zen4 machine running the 16 extra column test from the
script in my last email, I see:

$ echo master && perf stat --pid=389510 sleep 10
master

Performance counter stats for process id '389510':

9990.65 msec task-clock:u # 0.999 CPUs utilized
0 context-switches:u # 0.000 /sec
0 cpu-migrations:u # 0.000 /sec
0 page-faults:u # 0.000 /sec
49407204156 cycles:u # 4.945 GHz
18529494 stalled-cycles-frontend:u # 0.04% frontend
cycles idle
8505168 stalled-cycles-backend:u # 0.02% backend cycles idle
165442142326 instructions:u # 3.35 insn per cycle
# 0.00 stalled
cycles per insn
39409877343 branches:u # 3.945 G/sec
146350275 branch-misses:u # 0.37% of all branches

10.001012132 seconds time elapsed

$ echo patched && perf stat --pid=380216 sleep 10
patched

Performance counter stats for process id '380216':

9989.14 msec task-clock:u # 0.998 CPUs utilized
0 context-switches:u # 0.000 /sec
0 cpu-migrations:u # 0.000 /sec
0 page-faults:u # 0.000 /sec
49781280456 cycles:u # 4.984 GHz
22922276 stalled-cycles-frontend:u # 0.05% frontend
cycles idle
24259785 stalled-cycles-backend:u # 0.05% backend cycles idle
213688149862 instructions:u # 4.29 insn per cycle
# 0.00 stalled
cycles per insn
44147675129 branches:u # 4.420 G/sec
14282567 branch-misses:u # 0.03% of all branches

10.005034271 seconds time elapsed

You can see the branch predictor has done a *much* better job in the
patched code vs master with about 10x fewer misses. This should have
helped contribute to the "insn per cycle" increase. 4.29 is quite
good for postgres. I often see that around 0.5. According to [1]https://chipsandcheese.com/2022/11/05/amds-zen-4-part-1-frontend-and-execution-engine/
(relating to Zen4), "We get a ridiculous 12 NOPs per cycle out of the
micro-op cache". I'm unsure how micro-ops translate to "insn per
cycle" that's shown in perf stat. I thought 4-5 was about the maximum
pipeline size from today's era of CPUs. Maybe someone else can explain
better than I can. In more simple terms, generally, the higher the
"insn per cycle", the better. Also, the lower all of the idle and
branch miss percentages are that's generally also better. However,
you'll notice that the patched version has more front and backend
stalls. I assume this is due to performing more instructions per cycle
from improved branch prediction causing memory and instruction stalls
to occur more frequently, effectively (I think) it's just hitting the
next bottleneck(s) - memory and instruction decoding. At least, modern
CPUs should be able to out-pace RAM in many workloads, so perhaps it's
not that surprising that "backend cycles idle" has gone up due to such
a large increase in instructions per cycle due to improved branch
prediction.

It would be nice to see this tested on some modern Intel CPU. A 13th
series or 14th series, for example, or even any intel from the past 5
years would be better than nothing.

David

[1]: https://chipsandcheese.com/2022/11/05/amds-zen-4-part-1-frontend-and-execution-engine/

#4Matthias van de Meent
boekewurm+postgres@gmail.com
In reply to: David Rowley (#1)
Re: Make tuple deformation faster

On Mon, 1 Jul 2024 at 10:56, David Rowley <dgrowleyml@gmail.com> wrote:

Currently, TupleDescData contains the descriptor's attributes in a
variable length array of FormData_pg_attribute allocated within the
same allocation as the TupleDescData. According to my IDE,
sizeof(FormData_pg_attribute) == 104 bytes. It's that large mainly due
to attname being 64 bytes. The TupleDescData.attrs[] array could end
up quite large on tables with many columns and that could result in
poor CPU cache hit ratios when deforming tuples.

Instead, we could make TupleDescData contain an out-of-line pointer to
the array of FormData_pg_attribute and have a much more compact
inlined array of some other struct that much more densely contains the
fields required for tuple deformation. attname and many of the other
fields are not required to deform a tuple.

+1

I've attached a patch series which does this.

0001: Just fixes up some missing usages of TupleDescAttr(). (mostly
missed by me, apparently :-( )
0002: Adjusts the TupleDescData.attrs array to make it out of line. I
wanted to make sure nothing weird happened by doing this before doing
the bulk of the other changes to add the new struct.
0003: Adds a very compact 8-byte struct named TupleDescDeformAttr,
which can be used for tuple deformation. 8 columns fits on a 64-byte
cacheline rather than 13 cachelines.

Cool, that's similar to, but even better than, my patch from 2021 over at [0]/messages/by-id/CAEze2Wh8-metSryZX_Ubj-uv6kb+2YnzHAejmEdubjhmGusBAg@mail.gmail.com.

One thing I'm slightly concerned about is that this allocates another
8 bytes for each attribute in the tuple descriptor. While that's not a
lot when compared with the ->attrs array, it's still quite a lot when
we might not care at all about this data; e.g. in temporary tuple
descriptors during execution, in intermediate planner nodes.

Did you test for performance gains (or losses) with an out-of-line
TupleDescDeformAttr array? One benefit from this would be that we
could reuse the deform array for suffix truncated TupleDescs, reuse of
which currently would require temporarily updating TupleDesc->natts
with a smaller value; but with out-of-line ->attrs and ->deform_attrs,
we could reuse these arrays between TupleDescs if one is shorter than
the other, but has otherwise fully matching attributes. I know that
btree split code would benefit from this, as it wouldn't have to
construct a full new TupleDesc when it creates a suffix-truncated
tuple during page splits.

0004: Adjusts the attalign to change it from char to uint8. See below.

The 0004 patch changes the TupleDescDeformAttr.attalign to a uint8
rather than a char containing 'c', 's', 'i' or 'd'. This allows much
more simple code in the att_align_nominal() macro. What's in master is
quite a complex expression to evaluate every time we deform a column
as it much translate: 'c' -> 1, 's' -> 2, 'i' -> 4, 'd' -> 8. If we
just store that numeric value in the struct that macro can become a
simple TYPEALIGN() so the operation becomes simple bit masking rather
than a poorly branch predictable series of compare and jump.

+1, that's something I'd missed in my patches, and is probably the
largest contributor to the speedup.

I'll stick this in the July CF. It would be good to get some feedback
on the idea and feedback on whether more work on this is worthwhile.

Do you plan to remove the ->attcacheoff catalog field from the
FormData_pg_attribute, now that (with your patch) it isn't used
anymore as a placeholder field for fast (de)forming of tuples?

Kind regards,

Matthias van de Meent

[0]: /messages/by-id/CAEze2Wh8-metSryZX_Ubj-uv6kb+2YnzHAejmEdubjhmGusBAg@mail.gmail.com

#5David Rowley
dgrowleyml@gmail.com
In reply to: Matthias van de Meent (#4)
Re: Make tuple deformation faster

On Mon, 1 Jul 2024 at 22:07, Matthias van de Meent
<boekewurm+postgres@gmail.com> wrote:

Cool, that's similar to, but even better than, my patch from 2021 over at [0].

I'll have a read of that. Thanks for pointing it out.

One thing I'm slightly concerned about is that this allocates another
8 bytes for each attribute in the tuple descriptor. While that's not a
lot when compared with the ->attrs array, it's still quite a lot when
we might not care at all about this data; e.g. in temporary tuple
descriptors during execution, in intermediate planner nodes.

I've not done it in the patch, but one way to get some of that back is
to ditch pg_attribute.attcacheoff. There's no need for it after this
patch. That's only 4 out of 8 bytes, however. I think in most cases
due to FormData_pg_attribute being so huge, the aset.c power-of-2
roundup behaviour will be unlikely to cross a power-of-2 boundary.

The following demonstrates which column counts that actually makes a
difference with:

select c as n_cols,old_bytes, new_bytes from (select c,24+104*c as
old_bytes, 32+100*c+8*c as new_bytes from generate_series(1,1024) c)
where position('1' in old_bytes::bit(32)::text) != position('1' in
new_bytes::bit(32)::text);

That returns just 46 column counts out of 1024 where we cross a power
of 2 boundaries with the patched code that we didn't cross in master.
Of course, larger pallocs will result in a malloc() directly, so
perhaps that's not a good measure. At least for smaller column counts
it should be mainly the same amount of memory used. There are only 6
rows in there for column counts below 100. I think if we were worried
about memory there are likely 100 other things we could do to reclaim
some. It would only take some shuffling of fields in RelationData. I
count 50 bytes of holes in that struct out of the 488 bytes. There are
probably a few that could be moved without upsetting the
struct-field-order-lords too much.

Did you test for performance gains (or losses) with an out-of-line
TupleDescDeformAttr array? One benefit from this would be that we
could reuse the deform array for suffix truncated TupleDescs, reuse of
which currently would require temporarily updating TupleDesc->natts
with a smaller value; but with out-of-line ->attrs and ->deform_attrs,
we could reuse these arrays between TupleDescs if one is shorter than
the other, but has otherwise fully matching attributes. I know that
btree split code would benefit from this, as it wouldn't have to
construct a full new TupleDesc when it creates a suffix-truncated
tuple during page splits.

No, but it sounds easy to test as patch 0002 moves that out of line
and does nothing else.

0004: Adjusts the attalign to change it from char to uint8. See below.

The 0004 patch changes the TupleDescDeformAttr.attalign to a uint8
rather than a char containing 'c', 's', 'i' or 'd'. This allows much
more simple code in the att_align_nominal() macro. What's in master is
quite a complex expression to evaluate every time we deform a column
as it much translate: 'c' -> 1, 's' -> 2, 'i' -> 4, 'd' -> 8. If we
just store that numeric value in the struct that macro can become a
simple TYPEALIGN() so the operation becomes simple bit masking rather
than a poorly branch predictable series of compare and jump.

+1, that's something I'd missed in my patches, and is probably the
largest contributor to the speedup.

I think so too and I did consider if we should try and do that to
pg_attribute, renaming the column to attalignby. I started but didn't
finish a patch for that.

I'll stick this in the July CF. It would be good to get some feedback
on the idea and feedback on whether more work on this is worthwhile.

Do you plan to remove the ->attcacheoff catalog field from the
FormData_pg_attribute, now that (with your patch) it isn't used
anymore as a placeholder field for fast (de)forming of tuples?

Yes, I plan to do that once I get more confidence I'm on to a winner here.

Thanks for having a look at this.

David

#6Matthias van de Meent
boekewurm+postgres@gmail.com
In reply to: David Rowley (#5)
Re: Make tuple deformation faster

On Mon, 1 Jul 2024 at 12:49, David Rowley <dgrowleyml@gmail.com> wrote:

On Mon, 1 Jul 2024 at 22:07, Matthias van de Meent
<boekewurm+postgres@gmail.com> wrote:

One thing I'm slightly concerned about is that this allocates another
8 bytes for each attribute in the tuple descriptor. While that's not a
lot when compared with the ->attrs array, it's still quite a lot when
we might not care at all about this data; e.g. in temporary tuple
descriptors during execution, in intermediate planner nodes.

I've not done it in the patch, but one way to get some of that back is
to ditch pg_attribute.attcacheoff. There's no need for it after this
patch. That's only 4 out of 8 bytes, however.

FormData_pg_attribute as a C struct has 4-byte alignment; AFAIK it
doesn't have any fields that require 8-byte alignment? Only on 64-bit
systems we align the tuples on pages with 8-byte alignment, but
in-memory arrays of the struct wouldn't have to deal with that, AFAIK.

I think in most cases
due to FormData_pg_attribute being so huge, the aset.c power-of-2
roundup behaviour will be unlikely to cross a power-of-2 boundary.

ASet isn't the only allocator, but default enough for this to make sense, yes.

The following demonstrates which column counts that actually makes a
difference with:

select c as n_cols,old_bytes, new_bytes from (select c,24+104*c as
old_bytes, 32+100*c+8*c as new_bytes from generate_series(1,1024) c)
where position('1' in old_bytes::bit(32)::text) != position('1' in
new_bytes::bit(32)::text);

That returns just 46 column counts out of 1024 where we cross a power
of 2 boundaries with the patched code that we didn't cross in master.
Of course, larger pallocs will result in a malloc() directly, so
perhaps that's not a good measure. At least for smaller column counts
it should be mainly the same amount of memory used. There are only 6
rows in there for column counts below 100. I think if we were worried
about memory there are likely 100 other things we could do to reclaim
some. It would only take some shuffling of fields in RelationData. I
count 50 bytes of holes in that struct out of the 488 bytes. There are
probably a few that could be moved without upsetting the
struct-field-order-lords too much.

I'd love for RelationData to be split into IndexRelation,
TableRelation, ForeignTableRelation, etc., as there's a lot of wastage
caused by exclusive fields, too.

0004: Adjusts the attalign to change it from char to uint8. See below.

The 0004 patch changes the TupleDescDeformAttr.attalign to a uint8
rather than a char containing 'c', 's', 'i' or 'd'. This allows much
more simple code in the att_align_nominal() macro. What's in master is
quite a complex expression to evaluate every time we deform a column
as it much translate: 'c' -> 1, 's' -> 2, 'i' -> 4, 'd' -> 8. If we
just store that numeric value in the struct that macro can become a
simple TYPEALIGN() so the operation becomes simple bit masking rather
than a poorly branch predictable series of compare and jump.

+1, that's something I'd missed in my patches, and is probably the
largest contributor to the speedup.

I think so too and I did consider if we should try and do that to
pg_attribute, renaming the column to attalignby. I started but didn't
finish a patch for that.

I'm not sure we have a pg_type entry that that supports numeric
attalign values without increasing the size of the field, as the one
single-byte integer-like type (char) is always used as a printable
character, and implied to always be printable through its usage in
e.g. nodeToString infrastructure.

I'd love to have a better option, but we don't seem to have one yet.

Kind regards,

Matthias van de Meent
Neon (https://neon.tech)

#7David Rowley
dgrowleyml@gmail.com
In reply to: Matthias van de Meent (#6)
Re: Make tuple deformation faster

On Mon, 1 Jul 2024 at 23:42, Matthias van de Meent
<boekewurm+postgres@gmail.com> wrote:

On Mon, 1 Jul 2024 at 12:49, David Rowley <dgrowleyml@gmail.com> wrote:

On Mon, 1 Jul 2024 at 22:07, Matthias van de Meent
<boekewurm+postgres@gmail.com> wrote:

One thing I'm slightly concerned about is that this allocates another
8 bytes for each attribute in the tuple descriptor. While that's not a
lot when compared with the ->attrs array, it's still quite a lot when
we might not care at all about this data; e.g. in temporary tuple
descriptors during execution, in intermediate planner nodes.

I've not done it in the patch, but one way to get some of that back is
to ditch pg_attribute.attcacheoff. There's no need for it after this
patch. That's only 4 out of 8 bytes, however.

FormData_pg_attribute as a C struct has 4-byte alignment; AFAIK it
doesn't have any fields that require 8-byte alignment? Only on 64-bit
systems we align the tuples on pages with 8-byte alignment, but
in-memory arrays of the struct wouldn't have to deal with that, AFAIK.

Yeah, 4-byte alignment. "out of 8 bytes" I was talking about is
sizeof(TupleDescDeformAttr), which I believe is the same "another 8
bytes" you had mentioned. What I meant was that deleting attcacheoff
only reduces FormData_pg_attribute by 4 bytes per column and adding
TupleDescDeformAttr adds 8 per column, so we still use 4 more bytes
per column with the patch.

I really doubt the 4 bytes extra memory is a big concern here. It
would be more concerning for patch that wanted to do something like
change NAMEDATALEN to 128, but I think the main concern with that
would be even slower tuple deforming. Additional memory would also be
concerning, but I doubt that's more important than the issue of making
all queries slower due to slower tuple deformation, which is what such
a patch would result in.

I think in most cases
due to FormData_pg_attribute being so huge, the aset.c power-of-2
roundup behaviour will be unlikely to cross a power-of-2 boundary.

ASet isn't the only allocator, but default enough for this to make sense, yes.

It's the only allocator we use for allocating TupleDescs, so other
types and their behaviour are not relevant here.

I'm not sure we have a pg_type entry that that supports numeric
attalign values without increasing the size of the field, as the one
single-byte integer-like type (char) is always used as a printable
character, and implied to always be printable through its usage in
e.g. nodeToString infrastructure.

I'd love to have a better option, but we don't seem to have one yet.

yeah, select typname from pg_Type where typalign = 'c' and typlen=1;
has just bool and char.

I'm happy to keep going with this version of the patch unless someone
points out some good reason that we should go with the alternative
instead.

David

#8Andy Fan
zhihuifan1213@163.com
In reply to: David Rowley (#3)
Re: Make tuple deformation faster

David Rowley <dgrowleyml@gmail.com> writes:

You can see the branch predictor has done a *much* better job in the
patched code vs master with about 10x fewer misses. This should have
helped contribute to the "insn per cycle" increase. 4.29 is quite
good for postgres. I often see that around 0.5. According to [1]
(relating to Zen4), "We get a ridiculous 12 NOPs per cycle out of the
micro-op cache". I'm unsure how micro-ops translate to "insn per
cycle" that's shown in perf stat. I thought 4-5 was about the maximum
pipeline size from today's era of CPUs. Maybe someone else can explain
better than I can. In more simple terms, generally, the higher the
"insn per cycle", the better. Also, the lower all of the idle and
branch miss percentages are that's generally also better. However,
you'll notice that the patched version has more front and backend
stalls. I assume this is due to performing more instructions per cycle
from improved branch prediction causing memory and instruction stalls
to occur more frequently, effectively (I think) it's just hitting the
next bottleneck(s) - memory and instruction decoding. At least, modern
CPUs should be able to out-pace RAM in many workloads, so perhaps it's
not that surprising that "backend cycles idle" has gone up due to such
a large increase in instructions per cycle due to improved branch
prediction.

Thanks for the answer, just another area desvers to exploring.

It would be nice to see this tested on some modern Intel CPU. A 13th
series or 14th series, for example, or even any intel from the past 5
years would be better than nothing.

I have two kind of CPUs.

a). Intel Xeon Processor (Icelake) for my ECS
b). Intel(R) Core(TM) i5-8259U CPU @ 2.30GHz at Mac.

My ECS reports "<not supported> branch-misses", probabaly because it
runs in virtualization software , and Mac doesn't support perf yet :(

--
Best Regards
Andy Fan

#9Matthias van de Meent
boekewurm+postgres@gmail.com
In reply to: David Rowley (#7)
Re: Make tuple deformation faster

On Tue, 2 Jul 2024 at 02:23, David Rowley <dgrowleyml@gmail.com> wrote:

On Mon, 1 Jul 2024 at 23:42, Matthias van de Meent
<boekewurm+postgres@gmail.com> wrote:

On Mon, 1 Jul 2024 at 12:49, David Rowley <dgrowleyml@gmail.com> wrote:

On Mon, 1 Jul 2024 at 22:07, Matthias van de Meent
<boekewurm+postgres@gmail.com> wrote:

One thing I'm slightly concerned about is that this allocates another
8 bytes for each attribute in the tuple descriptor. While that's not a
lot when compared with the ->attrs array, it's still quite a lot when
we might not care at all about this data; e.g. in temporary tuple
descriptors during execution, in intermediate planner nodes.

I've not done it in the patch, but one way to get some of that back is
to ditch pg_attribute.attcacheoff. There's no need for it after this
patch. That's only 4 out of 8 bytes, however.

FormData_pg_attribute as a C struct has 4-byte alignment; AFAIK it
doesn't have any fields that require 8-byte alignment? Only on 64-bit
systems we align the tuples on pages with 8-byte alignment, but
in-memory arrays of the struct wouldn't have to deal with that, AFAIK.

Yeah, 4-byte alignment. "out of 8 bytes" I was talking about is
sizeof(TupleDescDeformAttr), which I believe is the same "another 8
bytes" you had mentioned. What I meant was that deleting attcacheoff
only reduces FormData_pg_attribute by 4 bytes per column and adding
TupleDescDeformAttr adds 8 per column, so we still use 4 more bytes
per column with the patch.

I see I was confused, thank you for clarifying. As I said, the
concerns were only small; 4 more bytes only in memory shouldn't matter
much in the grand scheme of things.

I'm happy to keep going with this version of the patch

+1, go for it.

Kind regards,

Matthias van de Meent
Neon (https://neon.tech)

#10John Naylor
johncnaylorls@gmail.com
In reply to: David Rowley (#3)
Re: Make tuple deformation faster

On Mon, Jul 1, 2024 at 5:07 PM David Rowley <dgrowleyml@gmail.com> wrote:

cycles idle
8505168 stalled-cycles-backend:u # 0.02% backend cycles idle
165442142326 instructions:u # 3.35 insn per cycle
# 0.00 stalled
cycles per insn
39409877343 branches:u # 3.945 G/sec
146350275 branch-misses:u # 0.37% of all branches

patched

cycles idle
24259785 stalled-cycles-backend:u # 0.05% backend cycles idle
213688149862 instructions:u # 4.29 insn per cycle
# 0.00 stalled
cycles per insn
44147675129 branches:u # 4.420 G/sec
14282567 branch-misses:u # 0.03% of all branches

You can see the branch predictor has done a *much* better job in the
patched code vs master with about 10x fewer misses. This should have

Nice!

helped contribute to the "insn per cycle" increase. 4.29 is quite
good for postgres. I often see that around 0.5. According to [1]
(relating to Zen4), "We get a ridiculous 12 NOPs per cycle out of the
micro-op cache". I'm unsure how micro-ops translate to "insn per
cycle" that's shown in perf stat. I thought 4-5 was about the maximum
pipeline size from today's era of CPUs.

"ins per cycle" is micro-ops retired (i.e. excludes those executed
speculatively on a mispredicted branch).

That article mentions that 6 micro-ops per cycle can enter the backend
from the frontend, but that can happen only with internally cached
ops, since only 4 instructions per cycle can be decoded. In specific
cases, CPUs can fuse multiple front-end instructions into a single
macro-op, which I think means a pair of micro-ops that can "travel
together" as one. The authors concluded further down that "Zen 4’s
reorder buffer is also special, because each entry can hold up to 4
NOPs. Pairs of NOPs are likely fused by the decoders, and pairs of
fused NOPs are fused again at the rename stage."

#11David Rowley
dgrowleyml@gmail.com
In reply to: Matthias van de Meent (#9)
4 attachment(s)
Re: Make tuple deformation faster

On Tue, 16 Jul 2024 at 00:13, Matthias van de Meent
<boekewurm+postgres@gmail.com> wrote:

On Tue, 2 Jul 2024 at 02:23, David Rowley <dgrowleyml@gmail.com> wrote:

I'm happy to keep going with this version of the patch

+1, go for it.

I've attached an updated patch series which are a bit more polished
than the last set. I've attempted to document the distinction between
FormData_pg_attribute and the abbreviated struct and tried to give an
indication of which one should be used.

Apart from that, changes include:

* I pushed the v1-0001 patch, so that's removed from the patch series.
* Rename TupleDescDeformAttr struct. It's now called CompactAttribute.
* Rename TupleDescDeformAttr() macro. It's now called TupleDescCompactAttr()
* Other macro renaming. e.g. ATT_IS_PACKABLE_FAST to COMPACT_ATTR_IS_PACKABLE
* In 0003, renamed CompactAttribute.attalign to attalignby to make it
easier to understand the distinction between the align char and the
number of bytes.
* Added 0004 patch to remove pg_attribute.attcacheoff.

There are a few more things that could be done to optimise a few more
things. For example, a bunch of places still use att_align_nominal().
With a bit more work, these could use att_nominal_alignby(). I'm not
yet sure of the cleanest way to do this. Adding alignby to the
typecache might be one way, or maybe just a function that converts the
attalign to the number of bytes. This would be useful in all places
where att_align_nominal() is used in loops, as converting the char to
the number of bytes would only be done once rather than once per loop.
I feel like this patch series is probably big enough for now, so I'd
like to opt for those improvements to take place as follow-on work.

I'll put this up for the CF bot to run with for a bit as the patch has
needed a rebase since I pushed the v1-0001 patch.

David

Attachments:

v2-0001-Move-TupleDesc.attrs-out-of-line.patchapplication/octet-stream; name=v2-0001-Move-TupleDesc.attrs-out-of-line.patchDownload
From bf8e270dfd8ee228333adb980b92282ca0f0ad66 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 28 May 2024 13:49:07 +1200
Subject: [PATCH v2 1/4] Move TupleDesc.attrs out of line

Change TupleDesc attrs field so that it's no longer memory allocated at
the end of the TupleDesc struct.  Here we change this so that 'attrs' is
a pointer that always points to memory beyond the end of the struct.

This is just refactoring work to make way for a follow-on commit, of which
adds another variable length array to TupleDesc.
---
 src/backend/access/common/indextuple.c |  2 +-
 src/backend/access/common/tupdesc.c    | 11 +++++++++--
 src/backend/utils/cache/typcache.c     | 15 ++++++++++++++-
 src/include/access/tupdesc.h           | 12 ++++++++----
 4 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index bb2c6a2bcc..79ae29989d 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -588,7 +588,7 @@ index_truncate_tuple(TupleDesc sourceDescriptor, IndexTuple source,
 		return CopyIndexTuple(source);
 
 	/* Create temporary descriptor to scribble on */
-	truncdesc = palloc(TupleDescSize(sourceDescriptor));
+	truncdesc = CreateTemplateTupleDesc(sourceDescriptor->natts);
 	TupleDescCopy(truncdesc, sourceDescriptor);
 	truncdesc->natts = leavenatts;
 
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 47379fef22..fba0026520 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -85,7 +85,7 @@ CreateTemplateTupleDesc(int natts)
 	 * could be less due to trailing padding, although with the current
 	 * definition of pg_attribute there probably isn't any padding.
 	 */
-	desc = (TupleDesc) palloc(offsetof(struct TupleDescData, attrs) +
+	desc = (TupleDesc) palloc(MAXALIGN(sizeof(TupleDescData)) +
 							  natts * sizeof(FormData_pg_attribute));
 
 	/*
@@ -96,6 +96,7 @@ CreateTemplateTupleDesc(int natts)
 	desc->tdtypeid = RECORDOID;
 	desc->tdtypmod = -1;
 	desc->tdrefcount = -1;		/* assume not reference-counted */
+	desc->attrs = TupleDescAttrAddress(desc);
 
 	return desc;
 }
@@ -252,9 +253,15 @@ TupleDescCopy(TupleDesc dst, TupleDesc src)
 {
 	int			i;
 
-	/* Flat-copy the header and attribute array */
+	/* Flat-copy the header */
 	memcpy(dst, src, TupleDescSize(src));
 
+	/* restore original attribute array pointer and replace contents from src */
+	dst->attrs = TupleDescAttrAddress(dst);
+	memcpy(TupleDescAttr(dst, 0),
+		   TupleDescAttr(src, 0),
+		   sizeof(FormData_pg_attribute) * dst->natts);
+
 	/*
 	 * Since we're not copying constraints and defaults, clear fields
 	 * associated with them.
diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
index aa4720cb59..426eabd9d9 100644
--- a/src/backend/utils/cache/typcache.c
+++ b/src/backend/utils/cache/typcache.c
@@ -222,12 +222,18 @@ shared_record_table_compare(const void *a, const void *b, size_t size,
 	TupleDesc	t2;
 
 	if (k1->shared)
+	{
 		t1 = (TupleDesc) dsa_get_address(area, k1->u.shared_tupdesc);
+		t1->attrs = TupleDescAttrAddress(t1);
+	}
 	else
 		t1 = k1->u.local_tupdesc;
 
 	if (k2->shared)
+	{
 		t2 = (TupleDesc) dsa_get_address(area, k2->u.shared_tupdesc);
+		t2->attrs = TupleDescAttrAddress(t2);
+	}
 	else
 		t2 = k2->u.local_tupdesc;
 
@@ -245,7 +251,10 @@ shared_record_table_hash(const void *a, size_t size, void *arg)
 	TupleDesc	t;
 
 	if (k->shared)
+	{
 		t = (TupleDesc) dsa_get_address(area, k->u.shared_tupdesc);
+		t->attrs = TupleDescAttrAddress(t);
+	}
 	else
 		t = k->u.local_tupdesc;
 
@@ -1780,6 +1789,7 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
 					tupdesc = (TupleDesc)
 						dsa_get_address(CurrentSession->area,
 										entry->shared_tupdesc);
+					tupdesc->attrs = TupleDescAttrAddress(tupdesc);
 					Assert(typmod == tupdesc->tdtypmod);
 
 					/* We may need to extend the local RecordCacheArray. */
@@ -2737,7 +2747,7 @@ share_tupledesc(dsa_area *area, TupleDesc tupdesc, uint32 typmod)
 	dsa_pointer shared_dp;
 	TupleDesc	shared;
 
-	shared_dp = dsa_allocate(area, TupleDescSize(tupdesc));
+	shared_dp = dsa_allocate(area, TupleDescFullSize(tupdesc));
 	shared = (TupleDesc) dsa_get_address(area, shared_dp);
 	TupleDescCopy(shared, tupdesc);
 	shared->tdtypmod = typmod;
@@ -2780,6 +2790,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 		result = (TupleDesc)
 			dsa_get_address(CurrentSession->area,
 							record_table_entry->key.u.shared_tupdesc);
+		result->attrs = TupleDescAttrAddress(result);
 		Assert(result->tdrefcount == -1);
 
 		return result;
@@ -2843,6 +2854,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 		result = (TupleDesc)
 			dsa_get_address(CurrentSession->area,
 							record_table_entry->key.u.shared_tupdesc);
+		result->attrs = TupleDescAttrAddress(result);
 		Assert(result->tdrefcount == -1);
 
 		return result;
@@ -2855,6 +2867,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 						record_table_entry);
 	result = (TupleDesc)
 		dsa_get_address(CurrentSession->area, shared_dp);
+	result->attrs = TupleDescAttrAddress(result);
 	Assert(result->tdrefcount == -1);
 
 	return result;
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 8930a28d66..2c435cdcb2 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -84,7 +84,7 @@ typedef struct TupleDescData
 	int			tdrefcount;		/* reference count, or -1 if not counting */
 	TupleConstr *constr;		/* constraints, or NULL if none */
 	/* attrs[N] is the description of Attribute Number N+1 */
-	FormData_pg_attribute attrs[FLEXIBLE_ARRAY_MEMBER];
+	FormData_pg_attribute *attrs;
 }			TupleDescData;
 typedef struct TupleDescData *TupleDesc;
 
@@ -99,9 +99,13 @@ extern TupleDesc CreateTupleDescCopy(TupleDesc tupdesc);
 
 extern TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc);
 
-#define TupleDescSize(src) \
-	(offsetof(struct TupleDescData, attrs) + \
-	 (src)->natts * sizeof(FormData_pg_attribute))
+#define TupleDescSize(src) MAXALIGN(sizeof(TupleDescData))
+
+#define TupleDescFullSize(src) \
+	(MAXALIGN(sizeof(TupleDescData)) + sizeof(FormData_pg_attribute) * (src)->natts)
+
+#define TupleDescAttrAddress(desc) \
+	(Form_pg_attribute) ((char *) (desc) + MAXALIGN(sizeof(TupleDescData)))
 
 extern void TupleDescCopy(TupleDesc dst, TupleDesc src);
 
-- 
2.34.1

v2-0002-Introduce-CompactAttribute-array-in-TupleDesc.patchapplication/octet-stream; name=v2-0002-Introduce-CompactAttribute-array-in-TupleDesc.patchDownload
From 6a263bd9c2a72cb4da8d4b7a2dbb1d83108c5c04 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 28 May 2024 20:10:50 +1200
Subject: [PATCH v2 2/4] Introduce CompactAttribute array in TupleDesc

This array stores a subset of the fields of FormData_pg_attribute,
primarily the ones for deforming tuples, but since we have additional
space, pack a few additional boolean columns in the attflags field.

Many areas of the code can get away with only accessing the
CompactAttribute array, which because the details of each attribute is
stored much more densely than FormData_pg_attribute, many operations can
be performed accessing fewer cachelines which can improve performance.

This also makes pg_attribute.attcacheoff redundant.  A follow-on commit
will remove it.
---
 contrib/amcheck/verify_heapam.c             |  4 +-
 contrib/pageinspect/heapfuncs.c             |  4 +-
 contrib/postgres_fdw/postgres_fdw.c         | 12 ++--
 src/backend/access/brin/brin_inclusion.c    | 18 +++---
 src/backend/access/brin/brin_tuple.c        |  2 +-
 src/backend/access/common/attmap.c          | 14 +++--
 src/backend/access/common/heaptuple.c       | 57 +++++++++--------
 src/backend/access/common/indextuple.c      | 24 +++----
 src/backend/access/common/tupdesc.c         | 69 +++++++++++++++++----
 src/backend/access/gin/ginbulk.c            |  6 +-
 src/backend/access/gin/ginget.c             |  8 +--
 src/backend/access/gist/gistbuild.c         |  6 +-
 src/backend/access/heap/heapam.c            | 10 +--
 src/backend/access/heap/heapam_handler.c    |  2 +-
 src/backend/access/heap/heaptoast.c         |  6 +-
 src/backend/access/nbtree/nbtutils.c        |  6 +-
 src/backend/access/spgist/spgdoinsert.c     |  2 +-
 src/backend/access/spgist/spgutils.c        |  5 +-
 src/backend/access/table/toast_helper.c     |  2 +-
 src/backend/catalog/index.c                 |  2 +
 src/backend/commands/copy.c                 |  6 +-
 src/backend/commands/tablecmds.c            |  5 ++
 src/backend/executor/execExpr.c             |  8 +--
 src/backend/executor/execExprInterp.c       |  8 +--
 src/backend/executor/execJunk.c             |  2 +-
 src/backend/executor/execTuples.c           | 12 ++--
 src/backend/executor/functions.c            |  3 +-
 src/backend/executor/nodeMemoize.c          | 12 ++--
 src/backend/executor/nodeModifyTable.c      |  8 +--
 src/backend/executor/nodeValuesscan.c       |  4 +-
 src/backend/executor/tstoreReceiver.c       |  8 +--
 src/backend/optimizer/util/plancat.c        |  8 +--
 src/backend/replication/pgoutput/pgoutput.c |  2 +-
 src/backend/utils/adt/expandedrecord.c      | 22 +++----
 src/backend/utils/adt/ri_triggers.c         |  4 +-
 src/backend/utils/cache/relcache.c          | 24 +++++--
 src/include/access/htup_details.h           |  4 +-
 src/include/access/itup.h                   | 11 ++--
 src/include/access/tupdesc.h                | 69 +++++++++++++++++++--
 src/include/access/tupmacs.h                |  4 +-
 src/tools/pgindent/typedefs.list            |  1 +
 41 files changed, 314 insertions(+), 170 deletions(-)

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index f2526ed63a..08772de39f 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1567,11 +1567,11 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	struct varlena *attr;
 	char	   *tp;				/* pointer to the tuple data */
 	uint16		infomask;
-	Form_pg_attribute thisatt;
+	CompactAttribute *thisatt;
 	struct varatt_external toast_pointer;
 
 	infomask = ctx->tuphdr->t_infomask;
-	thisatt = TupleDescAttr(RelationGetDescr(ctx->rel), ctx->attnum);
+	thisatt = TupleDescCompactAttr(RelationGetDescr(ctx->rel), ctx->attnum);
 
 	tp = (char *) ctx->tuphdr + ctx->tuphdr->t_hoff;
 
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 3faeabc711..6234bb8729 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -331,11 +331,11 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 
 	for (i = 0; i < nattrs; i++)
 	{
-		Form_pg_attribute attr;
+		CompactAttribute *attr;
 		bool		is_null;
 		bytea	   *attr_data = NULL;
 
-		attr = TupleDescAttr(tupdesc, i);
+		attr = TupleDescCompactAttr(tupdesc, i);
 
 		/*
 		 * Tuple header can specify fewer attributes than tuple descriptor as
diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index fc65d81e21..632643be68 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -1814,9 +1814,9 @@ postgresPlanForeignModify(PlannerInfo *root,
 
 		for (attnum = 1; attnum <= tupdesc->natts; attnum++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+			CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
 
-			if (!attr->attisdropped)
+			if (!CompactAttrIsDropped(attr))
 				targetAttrs = lappend_int(targetAttrs, attnum);
 		}
 	}
@@ -2187,9 +2187,9 @@ postgresBeginForeignInsert(ModifyTableState *mtstate,
 	/* We transmit all columns that are defined in the foreign table. */
 	for (attnum = 1; attnum <= tupdesc->natts; attnum++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
 
-		if (!attr->attisdropped)
+		if (!CompactAttrIsDropped(attr))
 			targetAttrs = lappend_int(targetAttrs, attnum);
 	}
 
@@ -4301,12 +4301,12 @@ convert_prep_stmt_params(PgFdwModifyState *fmstate,
 			foreach(lc, fmstate->target_attrs)
 			{
 				int			attnum = lfirst_int(lc);
-				Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+				CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
 				Datum		value;
 				bool		isnull;
 
 				/* Ignore generated columns; they are set to DEFAULT */
-				if (attr->attgenerated)
+				if (CompactAttrIsGenerated(attr))
 					continue;
 				value = slot_getattr(slots[i], attnum, &isnull);
 				if (isnull)
diff --git a/src/backend/access/brin/brin_inclusion.c b/src/backend/access/brin/brin_inclusion.c
index 750276998c..a6b88e5f4a 100644
--- a/src/backend/access/brin/brin_inclusion.c
+++ b/src/backend/access/brin/brin_inclusion.c
@@ -146,12 +146,12 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
 	Datum		result;
 	bool		new = false;
 	AttrNumber	attno;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 
 	Assert(!isnull);
 
 	attno = column->bv_attno;
-	attr = TupleDescAttr(bdesc->bd_tupdesc, attno - 1);
+	attr = TupleDescCompactAttr(bdesc->bd_tupdesc, attno - 1);
 
 	/*
 	 * If the recorded value is null, copy the new value (which we know to be
@@ -160,7 +160,7 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
 	if (column->bv_allnulls)
 	{
 		column->bv_values[INCLUSION_UNION] =
-			datumCopy(newval, attr->attbyval, attr->attlen);
+			datumCopy(newval, CompactAttrByVal(attr), attr->attlen);
 		column->bv_values[INCLUSION_UNMERGEABLE] = BoolGetDatum(false);
 		column->bv_values[INCLUSION_CONTAINS_EMPTY] = BoolGetDatum(false);
 		column->bv_allnulls = false;
@@ -225,13 +225,13 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
 	Assert(finfo != NULL);
 	result = FunctionCall2Coll(finfo, colloid,
 							   column->bv_values[INCLUSION_UNION], newval);
-	if (!attr->attbyval &&
+	if (!CompactAttrByVal(attr) &&
 		DatumGetPointer(result) != DatumGetPointer(column->bv_values[INCLUSION_UNION]))
 	{
 		pfree(DatumGetPointer(column->bv_values[INCLUSION_UNION]));
 
 		if (result == newval)
-			result = datumCopy(result, attr->attbyval, attr->attlen);
+			result = datumCopy(result, CompactAttrByVal(attr), attr->attlen);
 	}
 	column->bv_values[INCLUSION_UNION] = result;
 
@@ -479,7 +479,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	BrinValues *col_b = (BrinValues *) PG_GETARG_POINTER(2);
 	Oid			colloid = PG_GET_COLLATION();
 	AttrNumber	attno;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 	FmgrInfo   *finfo;
 	Datum		result;
 
@@ -487,7 +487,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	Assert(!col_a->bv_allnulls && !col_b->bv_allnulls);
 
 	attno = col_a->bv_attno;
-	attr = TupleDescAttr(bdesc->bd_tupdesc, attno - 1);
+	attr = TupleDescCompactAttr(bdesc->bd_tupdesc, attno - 1);
 
 	/* If B includes empty elements, mark A similarly, if needed. */
 	if (!DatumGetBool(col_a->bv_values[INCLUSION_CONTAINS_EMPTY]) &&
@@ -522,13 +522,13 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	result = FunctionCall2Coll(finfo, colloid,
 							   col_a->bv_values[INCLUSION_UNION],
 							   col_b->bv_values[INCLUSION_UNION]);
-	if (!attr->attbyval &&
+	if (!CompactAttrByVal(attr) &&
 		DatumGetPointer(result) != DatumGetPointer(col_a->bv_values[INCLUSION_UNION]))
 	{
 		pfree(DatumGetPointer(col_a->bv_values[INCLUSION_UNION]));
 
 		if (result == col_b->bv_values[INCLUSION_UNION])
-			result = datumCopy(result, attr->attbyval, attr->attlen);
+			result = datumCopy(result, CompactAttrByVal(attr), attr->attlen);
 	}
 	col_a->bv_values[INCLUSION_UNION] = result;
 
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index 997eb6d822..aae646be5d 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -699,7 +699,7 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
 			 datumno < brdesc->bd_info[attnum]->oi_nstored;
 			 datumno++)
 		{
-			Form_pg_attribute thisatt = TupleDescAttr(diskdsc, stored);
+			CompactAttribute *thisatt = TupleDescCompactAttr(diskdsc, stored);
 
 			if (thisatt->attlen == -1)
 			{
diff --git a/src/backend/access/common/attmap.c b/src/backend/access/common/attmap.c
index b0fe27ef57..e2d46843bc 100644
--- a/src/backend/access/common/attmap.c
+++ b/src/backend/access/common/attmap.c
@@ -135,7 +135,9 @@ build_attrmap_by_position(TupleDesc indesc,
 	/* Check for unused input columns */
 	for (; j < indesc->natts; j++)
 	{
-		if (TupleDescAttr(indesc, j)->attisdropped)
+		CompactAttribute *attr = TupleDescCompactAttr(indesc, j);
+
+		if (CompactAttrIsDropped(attr))
 			continue;
 		nincols++;
 		same = false;			/* we'll complain below */
@@ -299,25 +301,27 @@ check_attrmap_match(TupleDesc indesc,
 
 	for (i = 0; i < attrMap->maplen; i++)
 	{
-		Form_pg_attribute inatt = TupleDescAttr(indesc, i);
-		Form_pg_attribute outatt = TupleDescAttr(outdesc, i);
+		CompactAttribute *inatt = TupleDescCompactAttr(indesc, i);
+		CompactAttribute *outatt;
 
 		/*
 		 * If the input column has a missing attribute, we need a conversion.
 		 */
-		if (inatt->atthasmissing)
+		if (CompactAttrHasMissing(inatt))
 			return false;
 
 		if (attrMap->attnums[i] == (i + 1))
 			continue;
 
+		outatt = TupleDescCompactAttr(outdesc, i);
+
 		/*
 		 * If it's a dropped column and the corresponding input column is also
 		 * dropped, we don't need a conversion.  However, attlen and attalign
 		 * must agree.
 		 */
 		if (attrMap->attnums[i] == 0 &&
-			inatt->attisdropped &&
+			CompactAttrIsDropped(inatt) &&
 			inatt->attlen == outatt->attlen &&
 			inatt->attalign == outatt->attalign)
 			continue;
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 9e3407bf98..70595c55b7 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -83,6 +83,9 @@
 #define VARLENA_ATT_IS_PACKABLE(att) \
 	((att)->attstorage != TYPSTORAGE_PLAIN)
 
+#define COMPACT_ATTR_IS_PACKABLE(att) \
+	((att)->attlen == -1 && CompactAttrIsPackable(att))
+
 /*
  * Setup for caching pass-by-ref missing attributes in a way that survives
  * tupleDesc destruction.
@@ -147,14 +150,14 @@ Datum
 getmissingattr(TupleDesc tupleDesc,
 			   int attnum, bool *isnull)
 {
-	Form_pg_attribute att;
+	CompactAttribute *att;
 
 	Assert(attnum <= tupleDesc->natts);
 	Assert(attnum > 0);
 
-	att = TupleDescAttr(tupleDesc, attnum - 1);
+	att = TupleDescCompactAttr(tupleDesc, attnum - 1);
 
-	if (att->atthasmissing)
+	if (CompactAttrHasMissing(att))
 	{
 		AttrMissing *attrmiss;
 
@@ -173,7 +176,7 @@ getmissingattr(TupleDesc tupleDesc,
 			*isnull = false;
 
 			/* no  need to cache by-value attributes */
-			if (att->attbyval)
+			if (CompactAttrByVal(att))
 				return attrmiss->am_value;
 
 			/* set up cache if required */
@@ -223,15 +226,15 @@ heap_compute_data_size(TupleDesc tupleDesc,
 	for (i = 0; i < numberOfAttributes; i++)
 	{
 		Datum		val;
-		Form_pg_attribute atti;
+		CompactAttribute *atti;
 
 		if (isnull[i])
 			continue;
 
 		val = values[i];
-		atti = TupleDescAttr(tupleDesc, i);
+		atti = TupleDescCompactAttr(tupleDesc, i);
 
-		if (ATT_IS_PACKABLE(atti) &&
+		if (COMPACT_ATTR_IS_PACKABLE(atti) &&
 			VARATT_CAN_MAKE_SHORT(DatumGetPointer(val)))
 		{
 			/*
@@ -268,7 +271,7 @@ heap_compute_data_size(TupleDesc tupleDesc,
  * Fill in either a data value or a bit in the null bitmask
  */
 static inline void
-fill_val(Form_pg_attribute att,
+fill_val(CompactAttribute *att,
 		 bits8 **bit,
 		 int *bitmask,
 		 char **dataP,
@@ -307,7 +310,7 @@ fill_val(Form_pg_attribute att,
 	 * XXX we use the att_align macros on the pointer value itself, not on an
 	 * offset.  This is a bit of a hack.
 	 */
-	if (att->attbyval)
+	if (CompactAttrByVal(att))
 	{
 		/* pass-by-value */
 		data = (char *) att_align_nominal(data, att->attalign);
@@ -349,7 +352,7 @@ fill_val(Form_pg_attribute att,
 			data_length = VARSIZE_SHORT(val);
 			memcpy(data, val, data_length);
 		}
-		else if (VARLENA_ATT_IS_PACKABLE(att) &&
+		else if (CompactAttrIsPackable(att) &&
 				 VARATT_CAN_MAKE_SHORT(val))
 		{
 			/* convert to short varlena -- no alignment */
@@ -427,7 +430,7 @@ heap_fill_tuple(TupleDesc tupleDesc,
 
 	for (i = 0; i < numberOfAttributes; i++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupleDesc, i);
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, i);
 
 		fill_val(attr,
 				 bitP ? &bitP : NULL,
@@ -461,7 +464,8 @@ heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
 	Assert(!tupleDesc || attnum <= tupleDesc->natts);
 	if (attnum > (int) HeapTupleHeaderGetNatts(tup->t_data))
 	{
-		if (tupleDesc && TupleDescAttr(tupleDesc, attnum - 1)->atthasmissing)
+		if (tupleDesc &&
+			CompactAttrHasMissing(TupleDescCompactAttr(tupleDesc, attnum - 1)))
 			return false;
 		else
 			return true;
@@ -570,13 +574,13 @@ nocachegetattr(HeapTuple tup,
 
 	if (!slow)
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		/*
 		 * If we get here, there are no nulls up to and including the target
 		 * attribute.  If we have a cached offset, we can use it.
 		 */
-		att = TupleDescAttr(tupleDesc, attnum);
+		att = TupleDescCompactAttr(tupleDesc, attnum);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, tp + att->attcacheoff);
 
@@ -591,7 +595,7 @@ nocachegetattr(HeapTuple tup,
 
 			for (j = 0; j <= attnum; j++)
 			{
-				if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
+				if (TupleDescCompactAttr(tupleDesc, j)->attlen <= 0)
 				{
 					slow = true;
 					break;
@@ -614,18 +618,18 @@ nocachegetattr(HeapTuple tup,
 		 * fixed-width columns, in hope of avoiding future visits to this
 		 * routine.
 		 */
-		TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(tupleDesc, 0)->attcacheoff = 0;
 
 		/* we might have set some offsets in the slow path previously */
-		while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
+		while (j < natts && TupleDescCompactAttr(tupleDesc, j)->attcacheoff > 0)
 			j++;
 
-		off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
-			TupleDescAttr(tupleDesc, j - 1)->attlen;
+		off = TupleDescCompactAttr(tupleDesc, j - 1)->attcacheoff +
+			TupleDescCompactAttr(tupleDesc, j - 1)->attlen;
 
 		for (; j < natts; j++)
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, j);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, j);
 
 			if (att->attlen <= 0)
 				break;
@@ -639,7 +643,7 @@ nocachegetattr(HeapTuple tup,
 
 		Assert(j > attnum);
 
-		off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
+		off = TupleDescCompactAttr(tupleDesc, attnum)->attcacheoff;
 	}
 	else
 	{
@@ -659,7 +663,7 @@ nocachegetattr(HeapTuple tup,
 		off = 0;
 		for (i = 0;; i++)		/* loop exit is at "break" */
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, i);
 
 			if (HeapTupleHasNulls(tup) && att_isnull(i, bp))
 			{
@@ -707,7 +711,7 @@ nocachegetattr(HeapTuple tup,
 		}
 	}
 
-	return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
+	return fetchatt(TupleDescCompactAttr(tupleDesc, attnum), tp + off);
 }
 
 /* ----------------
@@ -892,7 +896,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 		{
 			if (attrmiss[attnum].am_present)
 			{
-				Form_pg_attribute att = TupleDescAttr(tupleDesc, attnum);
+				CompactAttribute *att = TupleDescCompactAttr(tupleDesc, attnum);
 
 				targetDataLen = att_align_datum(targetDataLen,
 												att->attalign,
@@ -1020,8 +1024,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 	/* Now fill in the missing values */
 	for (attnum = sourceNatts; attnum < natts; attnum++)
 	{
-
-		Form_pg_attribute attr = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (attrmiss && attrmiss[attnum].am_present)
 		{
@@ -1370,7 +1373,7 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index 79ae29989d..37133ed7f8 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -303,13 +303,13 @@ nocache_index_getattr(IndexTuple tup,
 
 	if (!slow)
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		/*
 		 * If we get here, there are no nulls up to and including the target
 		 * attribute.  If we have a cached offset, we can use it.
 		 */
-		att = TupleDescAttr(tupleDesc, attnum);
+		att = TupleDescCompactAttr(tupleDesc, attnum);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, tp + att->attcacheoff);
 
@@ -324,7 +324,7 @@ nocache_index_getattr(IndexTuple tup,
 
 			for (j = 0; j <= attnum; j++)
 			{
-				if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
+				if (TupleDescCompactAttr(tupleDesc, j)->attlen <= 0)
 				{
 					slow = true;
 					break;
@@ -347,18 +347,18 @@ nocache_index_getattr(IndexTuple tup,
 		 * fixed-width columns, in hope of avoiding future visits to this
 		 * routine.
 		 */
-		TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(tupleDesc, 0)->attcacheoff = 0;
 
 		/* we might have set some offsets in the slow path previously */
-		while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
+		while (j < natts && TupleDescCompactAttr(tupleDesc, j)->attcacheoff > 0)
 			j++;
 
-		off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
-			TupleDescAttr(tupleDesc, j - 1)->attlen;
+		off = TupleDescCompactAttr(tupleDesc, j - 1)->attcacheoff +
+			TupleDescCompactAttr(tupleDesc, j - 1)->attlen;
 
 		for (; j < natts; j++)
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, j);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, j);
 
 			if (att->attlen <= 0)
 				break;
@@ -372,7 +372,7 @@ nocache_index_getattr(IndexTuple tup,
 
 		Assert(j > attnum);
 
-		off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
+		off = TupleDescCompactAttr(tupleDesc, attnum)->attcacheoff;
 	}
 	else
 	{
@@ -392,7 +392,7 @@ nocache_index_getattr(IndexTuple tup,
 		off = 0;
 		for (i = 0;; i++)		/* loop exit is at "break" */
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, i);
 
 			if (IndexTupleHasNulls(tup) && att_isnull(i, bp))
 			{
@@ -440,7 +440,7 @@ nocache_index_getattr(IndexTuple tup,
 		}
 	}
 
-	return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
+	return fetchatt(TupleDescCompactAttr(tupleDesc, attnum), tp + off);
 }
 
 /*
@@ -490,7 +490,7 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDescriptor, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDescriptor, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index fba0026520..44d24585b0 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -56,6 +56,30 @@ ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
 	ResourceOwnerForget(owner, PointerGetDatum(tupdesc), &tupdesc_resowner_desc);
 }
 
+void
+populate_compact_attribute(CompactAttribute *dst, Form_pg_attribute src)
+{
+	dst->attcacheoff = -1;
+	dst->attlen = src->attlen;
+
+	dst->attflags = 0;
+
+	if (src->attbyval)
+		dst->attflags |= COMPACT_ATTR_FLAG_BYVAL;
+	if (src->attstorage != TYPSTORAGE_PLAIN)
+		dst->attflags |= COMPACT_ATTR_FLAG_IS_PACKABLE;
+	if (src->atthasmissing)
+		dst->attflags |= COMPACT_ATTR_FLAG_HAS_MISSING;
+	if (src->attisdropped)
+		dst->attflags |= COMPACT_ATTR_FLAG_IS_DROPPED;
+	if (src->attgenerated)
+		dst->attflags |= COMPACT_ATTR_FLAG_IS_GENERATED;
+	if (src->attnotnull)
+		dst->attflags |= COMPACT_ATTR_FLAG_IS_NOTNULL;
+
+	dst->attalign = src->attalign;
+}
+
 /*
  * CreateTemplateTupleDesc
  *		This function allocates an empty tuple descriptor structure.
@@ -74,18 +98,20 @@ CreateTemplateTupleDesc(int natts)
 	Assert(natts >= 0);
 
 	/*
-	 * Allocate enough memory for the tuple descriptor, including the
-	 * attribute rows.
+	 * Allocate enough memory for the tuple descriptor, the CompactAttribute
+	 * array and also an array of the full FormData_pg_attribute data.  We
+	 * store a pointer to this in the 'attrs' field.
 	 *
-	 * Note: the attribute array stride is sizeof(FormData_pg_attribute),
-	 * since we declare the array elements as FormData_pg_attribute for
-	 * notational convenience.  However, we only guarantee that the first
+	 * Note: the 'attrs' array stride is sizeof(FormData_pg_attribute), since
+	 * we declare the array elements as FormData_pg_attribute for notational
+	 * convenience.  However, we only guarantee that the first
 	 * ATTRIBUTE_FIXED_PART_SIZE bytes of each entry are valid; most code that
 	 * copies tupdesc entries around copies just that much.  In principle that
 	 * could be less due to trailing padding, although with the current
 	 * definition of pg_attribute there probably isn't any padding.
 	 */
-	desc = (TupleDesc) palloc(MAXALIGN(sizeof(TupleDescData)) +
+	desc = (TupleDesc) palloc(offsetof(struct TupleDescData, compact_attrs) +
+							  natts * sizeof(CompactAttribute) +
 							  natts * sizeof(FormData_pg_attribute));
 
 	/*
@@ -118,8 +144,11 @@ CreateTupleDesc(int natts, Form_pg_attribute *attrs)
 	desc = CreateTemplateTupleDesc(natts);
 
 	for (i = 0; i < natts; ++i)
+	{
 		memcpy(TupleDescAttr(desc, i), attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
-
+		populate_compact_attribute(TupleDescCompactAttr(desc, i),
+								   TupleDescAttr(desc, i));
+	}
 	return desc;
 }
 
@@ -156,6 +185,9 @@ CreateTupleDescCopy(TupleDesc tupdesc)
 		att->atthasmissing = false;
 		att->attidentity = '\0';
 		att->attgenerated = '\0';
+
+		populate_compact_attribute(TupleDescCompactAttr(desc, i),
+								   TupleDescAttr(desc, i));
 	}
 
 	/* We can copy the tuple type identification, too */
@@ -184,6 +216,10 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
 		   TupleDescAttr(tupdesc, 0),
 		   desc->natts * sizeof(FormData_pg_attribute));
 
+	for (i = 0; i < desc->natts; i++)
+		populate_compact_attribute(TupleDescCompactAttr(desc, i),
+								   TupleDescAttr(desc, i));
+
 	/* Copy the TupleConstr data structure, if any */
 	if (constr)
 	{
@@ -208,10 +244,10 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
 			{
 				if (constr->missing[i].am_present)
 				{
-					Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+					CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 					cpy->missing[i].am_value = datumCopy(constr->missing[i].am_value,
-														 attr->attbyval,
+														 CompactAttrByVal(attr),
 														 attr->attlen);
 				}
 			}
@@ -275,6 +311,9 @@ TupleDescCopy(TupleDesc dst, TupleDesc src)
 		att->atthasmissing = false;
 		att->attidentity = '\0';
 		att->attgenerated = '\0';
+
+		populate_compact_attribute(TupleDescCompactAttr(dst, i),
+								   TupleDescAttr(dst, i));
 	}
 	dst->constr = NULL;
 
@@ -329,6 +368,8 @@ TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
 	dstAtt->atthasmissing = false;
 	dstAtt->attidentity = '\0';
 	dstAtt->attgenerated = '\0';
+
+	populate_compact_attribute(TupleDescCompactAttr(dst, dstAttno - 1), dstAtt);
 }
 
 /*
@@ -528,10 +569,10 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
 					return false;
 				if (missval1->am_present)
 				{
-					Form_pg_attribute missatt1 = TupleDescAttr(tupdesc1, i);
+					CompactAttribute *missatt1 = TupleDescCompactAttr(tupdesc1, i);
 
 					if (!datumIsEqual(missval1->am_value, missval2->am_value,
-									  missatt1->attbyval, missatt1->attlen))
+									  CompactAttrByVal(missatt1), missatt1->attlen))
 						return false;
 				}
 			}
@@ -721,6 +762,9 @@ TupleDescInitEntry(TupleDesc desc,
 	att->attcompression = InvalidCompressionMethod;
 	att->attcollation = typeForm->typcollation;
 
+	populate_compact_attribute(TupleDescCompactAttr(desc, attributeNumber - 1),
+							   att);
+
 	ReleaseSysCache(tuple);
 }
 
@@ -828,6 +872,9 @@ TupleDescInitBuiltinEntry(TupleDesc desc,
 		default:
 			elog(ERROR, "unsupported type %u", oidtypeid);
 	}
+
+	populate_compact_attribute(TupleDescCompactAttr(desc, attributeNumber - 1),
+							   att);
 }
 
 /*
diff --git a/src/backend/access/gin/ginbulk.c b/src/backend/access/gin/ginbulk.c
index 7f89cd5e82..91c83a3282 100644
--- a/src/backend/access/gin/ginbulk.c
+++ b/src/backend/access/gin/ginbulk.c
@@ -127,11 +127,11 @@ ginInitBA(BuildAccumulator *accum)
 static Datum
 getDatumCopy(BuildAccumulator *accum, OffsetNumber attnum, Datum value)
 {
-	Form_pg_attribute att;
+	CompactAttribute *att;
 	Datum		res;
 
-	att = TupleDescAttr(accum->ginstate->origTupdesc, attnum - 1);
-	if (att->attbyval)
+	att = TupleDescCompactAttr(accum->ginstate->origTupdesc, attnum - 1);
+	if (CompactAttrByVal(att))
 		res = value;
 	else
 	{
diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c
index 0b4f2ebadb..d394e4baeb 100644
--- a/src/backend/access/gin/ginget.c
+++ b/src/backend/access/gin/ginget.c
@@ -122,7 +122,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 				   GinScanEntry scanEntry, Snapshot snapshot)
 {
 	OffsetNumber attnum;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 
 	/* Initialize empty bitmap result */
 	scanEntry->matchBitmap = tbm_create(work_mem * 1024L, NULL);
@@ -134,7 +134,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 
 	/* Locate tupdesc entry for key column (for attbyval/attlen data) */
 	attnum = scanEntry->attnum;
-	attr = TupleDescAttr(btree->ginstate->origTupdesc, attnum - 1);
+	attr = TupleDescCompactAttr(btree->ginstate->origTupdesc, attnum - 1);
 
 	/*
 	 * Predicate lock entry leaf page, following pages will be locked by
@@ -232,7 +232,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 			 * tuple after re-locking
 			 */
 			if (icategory == GIN_CAT_NORM_KEY)
-				idatum = datumCopy(idatum, attr->attbyval, attr->attlen);
+				idatum = datumCopy(idatum, CompactAttrByVal(attr), attr->attlen);
 
 			LockBuffer(stack->buffer, GIN_UNLOCK);
 
@@ -291,7 +291,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 				stack->off++;
 			}
 
-			if (icategory == GIN_CAT_NORM_KEY && !attr->attbyval)
+			if (icategory == GIN_CAT_NORM_KEY && !CompactAttrByVal(attr))
 				pfree(DatumGetPointer(idatum));
 		}
 		else
diff --git a/src/backend/access/gist/gistbuild.c b/src/backend/access/gist/gistbuild.c
index ba06df30fa..86512f2c89 100644
--- a/src/backend/access/gist/gistbuild.c
+++ b/src/backend/access/gist/gistbuild.c
@@ -657,10 +657,12 @@ gistInitBuffering(GISTBuildState *buildstate)
 	itupMinSize = (Size) MAXALIGN(sizeof(IndexTupleData));
 	for (i = 0; i < index->rd_att->natts; i++)
 	{
-		if (TupleDescAttr(index->rd_att, i)->attlen < 0)
+		CompactAttribute *attr = TupleDescCompactAttr(index->rd_att, i);
+
+		if (attr->attlen < 0)
 			itupMinSize += VARHDRSZ;
 		else
-			itupMinSize += TupleDescAttr(index->rd_att, i)->attlen;
+			itupMinSize += attr->attlen;
 	}
 
 	/* Calculate average and maximal number of index tuples which fit to page */
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 91b20147a0..7cf06058f7 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -4080,8 +4080,6 @@ static bool
 heap_attr_equals(TupleDesc tupdesc, int attrnum, Datum value1, Datum value2,
 				 bool isnull1, bool isnull2)
 {
-	Form_pg_attribute att;
-
 	/*
 	 * If one value is NULL and other is not, then they are certainly not
 	 * equal
@@ -4111,9 +4109,11 @@ heap_attr_equals(TupleDesc tupdesc, int attrnum, Datum value1, Datum value2,
 	}
 	else
 	{
+		CompactAttribute *att;
+
 		Assert(attrnum <= tupdesc->natts);
-		att = TupleDescAttr(tupdesc, attrnum - 1);
-		return datumIsEqual(value1, value2, att->attbyval, att->attlen);
+		att = TupleDescCompactAttr(tupdesc, attrnum - 1);
+		return datumIsEqual(value1, value2, CompactAttrByVal(att), att->attlen);
 	}
 }
 
@@ -4194,7 +4194,7 @@ HeapDetermineColumnsInfo(Relation relation,
 		 * that system attributes can't be stored externally.
 		 */
 		if (attrnum < 0 || isnull1 ||
-			TupleDescAttr(tupdesc, attrnum - 1)->attlen != -1)
+			TupleDescCompactAttr(tupdesc, attrnum - 1)->attlen != -1)
 			continue;
 
 		/*
diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c
index 6f8b1b7929..9178cdcfc9 100644
--- a/src/backend/access/heap/heapam_handler.c
+++ b/src/backend/access/heap/heapam_handler.c
@@ -2524,7 +2524,7 @@ reform_and_rewrite_tuple(HeapTuple tuple,
 	/* Be sure to null out any dropped columns */
 	for (i = 0; i < newTupDesc->natts; i++)
 	{
-		if (TupleDescAttr(newTupDesc, i)->attisdropped)
+		if (CompactAttrIsDropped(TupleDescCompactAttr(newTupDesc, i)))
 			isnull[i] = true;
 	}
 
diff --git a/src/backend/access/heap/heaptoast.c b/src/backend/access/heap/heaptoast.c
index a420e16530..c3a85d8d32 100644
--- a/src/backend/access/heap/heaptoast.c
+++ b/src/backend/access/heap/heaptoast.c
@@ -369,7 +369,7 @@ toast_flatten_tuple(HeapTuple tup, TupleDesc tupleDesc)
 		/*
 		 * Look at non-null varlena attributes
 		 */
-		if (!toast_isnull[i] && TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (!toast_isnull[i] && TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
@@ -483,7 +483,7 @@ toast_flatten_tuple_to_datum(HeapTupleHeader tup,
 		 */
 		if (toast_isnull[i])
 			has_nulls = true;
-		else if (TupleDescAttr(tupleDesc, i)->attlen == -1)
+		else if (TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
@@ -584,7 +584,7 @@ toast_build_flattened_tuple(TupleDesc tupleDesc,
 		/*
 		 * Look at non-null varlena attributes
 		 */
-		if (!isnull[i] && TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (!isnull[i] && TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c
index d6de2072d4..a732af4c5a 100644
--- a/src/backend/access/nbtree/nbtutils.c
+++ b/src/backend/access/nbtree/nbtutils.c
@@ -4874,17 +4874,17 @@ _bt_keep_natts_fast(Relation rel, IndexTuple lastleft, IndexTuple firstright)
 					datum2;
 		bool		isNull1,
 					isNull2;
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		datum1 = index_getattr(lastleft, attnum, itupdesc, &isNull1);
 		datum2 = index_getattr(firstright, attnum, itupdesc, &isNull2);
-		att = TupleDescAttr(itupdesc, attnum - 1);
+		att = TupleDescCompactAttr(itupdesc, attnum - 1);
 
 		if (isNull1 != isNull2)
 			break;
 
 		if (!isNull1 &&
-			!datum_image_eq(datum1, datum2, att->attbyval, att->attlen))
+			!datum_image_eq(datum1, datum2, CompactAttrByVal(att), att->attlen))
 			break;
 
 		keepnatts++;
diff --git a/src/backend/access/spgist/spgdoinsert.c b/src/backend/access/spgist/spgdoinsert.c
index a4995c168b..2cb7ce43ba 100644
--- a/src/backend/access/spgist/spgdoinsert.c
+++ b/src/backend/access/spgist/spgdoinsert.c
@@ -1974,7 +1974,7 @@ spgdoinsert(Relation index, SpGistState *state,
 	{
 		if (!isnulls[i])
 		{
-			if (TupleDescAttr(leafDescriptor, i)->attlen == -1)
+			if (TupleDescCompactAttr(leafDescriptor, i)->attlen == -1)
 				leafDatums[i] = PointerGetDatum(PG_DETOAST_DATUM(datums[i]));
 			else
 				leafDatums[i] = datums[i];
diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c
index 76b80146ff..d0978b2ce9 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -330,7 +330,10 @@ getSpGistTupleDesc(Relation index, SpGistTypeDesc *keyType)
 		att->attcollation = InvalidOid;
 		/* In case we changed typlen, we'd better reset following offsets */
 		for (int i = spgFirstIncludeColumn; i < outTupDesc->natts; i++)
-			TupleDescAttr(outTupDesc, i)->attcacheoff = -1;
+			TupleDescCompactAttr(outTupDesc, i)->attcacheoff = -1;
+
+		populate_compact_attribute(TupleDescCompactAttr(outTupDesc, spgKeyColumn),
+								   att);
 	}
 	return outTupDesc;
 }
diff --git a/src/backend/access/table/toast_helper.c b/src/backend/access/table/toast_helper.c
index 53224932f0..b16fd21b8d 100644
--- a/src/backend/access/table/toast_helper.c
+++ b/src/backend/access/table/toast_helper.c
@@ -324,7 +324,7 @@ toast_delete_external(Relation rel, const Datum *values, const bool *isnull,
 
 	for (i = 0; i < numAttrs; i++)
 	{
-		if (TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			Datum		value = values[i];
 
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index a819b4197c..6ffc536317 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -477,6 +477,8 @@ ConstructTupleDescriptor(Relation heapRelation,
 
 			ReleaseSysCache(tuple);
 		}
+
+		populate_compact_attribute(TupleDescCompactAttr(indexTupDesc, i), to);
 	}
 
 	pfree(amroutine);
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index df7a4a21c9..f611ac40ec 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -867,9 +867,9 @@ CopyGetAttnums(TupleDesc tupDesc, Relation rel, List *attnamelist)
 
 		for (i = 0; i < attr_count; i++)
 		{
-			if (TupleDescAttr(tupDesc, i)->attisdropped)
-				continue;
-			if (TupleDescAttr(tupDesc, i)->attgenerated)
+			CompactAttribute *attr = TupleDescCompactAttr(tupDesc, i);
+
+			if (CompactAttrIsDropped(attr) || CompactAttrIsGenerated(attr))
 				continue;
 			attnums = lappend_int(attnums, i + 1);
 		}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 0b2a52463f..02e3b063b5 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -944,6 +944,9 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
 			cookedDefaults = lappend(cookedDefaults, cooked);
 			attr->atthasdef = true;
 		}
+
+		populate_compact_attribute(TupleDescCompactAttr(descriptor, attnum - 1),
+								   attr);
 	}
 
 	/*
@@ -1349,6 +1352,8 @@ BuildDescForRelation(const List *columns)
 			att->attstorage = entry->storage;
 		else if (entry->storage_name)
 			att->attstorage = GetAttributeStorage(att->atttypid, entry->storage_name);
+
+		populate_compact_attribute(TupleDescCompactAttr(desc, attnum - 1), att);
 	}
 
 	return desc;
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index 66dda8e5e6..5e59022938 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -598,9 +598,9 @@ ExecBuildUpdateProjection(List *targetList,
 	 */
 	for (int attnum = relDesc->natts; attnum > 0; attnum--)
 	{
-		Form_pg_attribute attr = TupleDescAttr(relDesc, attnum - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(relDesc, attnum - 1);
 
-		if (attr->attisdropped)
+		if (CompactAttrIsDropped(attr))
 			continue;
 		if (bms_is_member(attnum, assignedCols))
 			continue;
@@ -694,9 +694,9 @@ ExecBuildUpdateProjection(List *targetList,
 	 */
 	for (int attnum = 1; attnum <= relDesc->natts; attnum++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(relDesc, attnum - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(relDesc, attnum - 1);
 
-		if (attr->attisdropped)
+		if (CompactAttrIsDropped(attr))
 		{
 			/* Put a null into the ExprState's resvalue/resnull ... */
 			scratch.opcode = EEOP_CONST;
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 1535fd6b98..623d72cd53 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -2824,7 +2824,7 @@ ExecEvalRowNullInt(ExprState *state, ExprEvalStep *op,
 	for (int att = 1; att <= tupDesc->natts; att++)
 	{
 		/* ignore dropped columns */
-		if (TupleDescAttr(tupDesc, att - 1)->attisdropped)
+		if (CompactAttrIsDropped(TupleDescCompactAttr(tupDesc, att - 1)))
 			continue;
 		if (heap_attisnull(&tmptup, att, tupDesc))
 		{
@@ -4962,10 +4962,10 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
 
 		for (int i = 0; i < var_tupdesc->natts; i++)
 		{
-			Form_pg_attribute vattr = TupleDescAttr(var_tupdesc, i);
-			Form_pg_attribute sattr = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *vattr = TupleDescCompactAttr(var_tupdesc, i);
+			CompactAttribute *sattr = TupleDescCompactAttr(tupleDesc, i);
 
-			if (!vattr->attisdropped)
+			if (!CompactAttrIsDropped(vattr))
 				continue;		/* already checked non-dropped cols */
 			if (slot->tts_isnull[i])
 				continue;		/* null is always okay */
diff --git a/src/backend/executor/execJunk.c b/src/backend/executor/execJunk.c
index b962c31383..af6db46f5d 100644
--- a/src/backend/executor/execJunk.c
+++ b/src/backend/executor/execJunk.c
@@ -169,7 +169,7 @@ ExecInitJunkFilterConversion(List *targetList,
 		t = list_head(targetList);
 		for (i = 0; i < cleanLength; i++)
 		{
-			if (TupleDescAttr(cleanTupType, i)->attisdropped)
+			if (CompactAttrIsDropped(TupleDescCompactAttr(cleanTupType, i)))
 				continue;		/* map entry is already zero */
 			for (;;)
 			{
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 00dc339615..550b8e8f34 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -187,10 +187,10 @@ tts_virtual_materialize(TupleTableSlot *slot)
 	/* compute size of memory required */
 	for (int natt = 0; natt < desc->natts; natt++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, natt);
+		CompactAttribute *att = TupleDescCompactAttr(desc, natt);
 		Datum		val;
 
-		if (att->attbyval || slot->tts_isnull[natt])
+		if (CompactAttrByVal(att) || slot->tts_isnull[natt])
 			continue;
 
 		val = slot->tts_values[natt];
@@ -223,10 +223,10 @@ tts_virtual_materialize(TupleTableSlot *slot)
 	/* and copy all attributes into the pre-allocated space */
 	for (int natt = 0; natt < desc->natts; natt++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, natt);
+		CompactAttribute *att = TupleDescCompactAttr(desc, natt);
 		Datum		val;
 
-		if (att->attbyval || slot->tts_isnull[natt])
+		if (CompactAttrByVal(att) || slot->tts_isnull[natt])
 			continue;
 
 		val = slot->tts_values[natt];
@@ -1044,7 +1044,7 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 
 	for (; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
@@ -2237,7 +2237,7 @@ BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
 	 */
 	for (i = 0; i < natts; i++)
 	{
-		if (!TupleDescAttr(tupdesc, i)->attisdropped)
+		if (!CompactAttrIsDropped(TupleDescCompactAttr(tupdesc, i)))
 		{
 			/* Non-dropped attributes */
 			dvalues[i] = InputFunctionCall(&attinmeta->attinfuncs[i],
diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c
index 692854e2b3..5c393e1267 100644
--- a/src/backend/executor/functions.c
+++ b/src/backend/executor/functions.c
@@ -1886,7 +1886,8 @@ check_sql_fn_retval(List *queryTreeLists,
 		/* remaining columns in rettupdesc had better all be dropped */
 		for (colindex++; colindex <= tupnatts; colindex++)
 		{
-			if (!TupleDescAttr(rettupdesc, colindex - 1)->attisdropped)
+			if (!CompactAttrIsDropped(TupleDescCompactAttr(rettupdesc,
+														   colindex - 1)))
 				ereport(ERROR,
 						(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
 						 errmsg("return type mismatch in function declared to return %s",
diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c
index df8e3fff08..cdec311687 100644
--- a/src/backend/executor/nodeMemoize.c
+++ b/src/backend/executor/nodeMemoize.c
@@ -175,12 +175,12 @@ MemoizeHash_hash(struct memoize_hash *tb, const MemoizeKey *key)
 
 			if (!pslot->tts_isnull[i])	/* treat nulls as having hash key 0 */
 			{
-				Form_pg_attribute attr;
+				CompactAttribute *attr;
 				uint32		hkey;
 
-				attr = TupleDescAttr(pslot->tts_tupleDescriptor, i);
+				attr = TupleDescCompactAttr(pslot->tts_tupleDescriptor, i);
 
-				hkey = datum_image_hash(pslot->tts_values[i], attr->attbyval, attr->attlen);
+				hkey = datum_image_hash(pslot->tts_values[i], CompactAttrByVal(attr), attr->attlen);
 
 				hashkey ^= hkey;
 			}
@@ -242,7 +242,7 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
 
 		for (int i = 0; i < numkeys; i++)
 		{
-			Form_pg_attribute attr;
+			CompactAttribute *attr;
 
 			if (tslot->tts_isnull[i] != pslot->tts_isnull[i])
 			{
@@ -255,9 +255,9 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
 				continue;
 
 			/* perform binary comparison on the two datums */
-			attr = TupleDescAttr(tslot->tts_tupleDescriptor, i);
+			attr = TupleDescCompactAttr(tslot->tts_tupleDescriptor, i);
 			if (!datum_image_eq(tslot->tts_values[i], pslot->tts_values[i],
-								attr->attbyval, attr->attlen))
+								CompactAttrByVal(attr), attr->attlen))
 			{
 				match = false;
 				break;
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 4913e49319..09a17bf0f0 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -496,14 +496,14 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
 
 	for (int i = 0; i < natts; i++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+		CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 		if (ri_GeneratedExprs[i])
 		{
 			Datum		val;
 			bool		isnull;
 
-			Assert(attr->attgenerated == ATTRIBUTE_GENERATED_STORED);
+			Assert(TupleDescAttr(tupdesc, i)->attgenerated == ATTRIBUTE_GENERATED_STORED);
 
 			econtext->ecxt_scantuple = slot;
 
@@ -514,7 +514,7 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
 			 * memory for a pass-by-reference Datum is located.
 			 */
 			if (!isnull)
-				val = datumCopy(val, attr->attbyval, attr->attlen);
+				val = datumCopy(val, CompactAttrByVal(attr), attr->attlen);
 
 			values[i] = val;
 			nulls[i] = isnull;
@@ -522,7 +522,7 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
 		else
 		{
 			if (!nulls[i])
-				values[i] = datumCopy(slot->tts_values[i], attr->attbyval, attr->attlen);
+				values[i] = datumCopy(slot->tts_values[i], CompactAttrByVal(attr), attr->attlen);
 		}
 	}
 
diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c
index 92948917a0..9838977f08 100644
--- a/src/backend/executor/nodeValuesscan.c
+++ b/src/backend/executor/nodeValuesscan.c
@@ -142,8 +142,8 @@ ValuesNext(ValuesScanState *node)
 		foreach(lc, exprstatelist)
 		{
 			ExprState  *estate = (ExprState *) lfirst(lc);
-			Form_pg_attribute attr = TupleDescAttr(slot->tts_tupleDescriptor,
-												   resind);
+			CompactAttribute *attr = TupleDescCompactAttr(slot->tts_tupleDescriptor,
+														  resind);
 
 			values[resind] = ExecEvalExpr(estate,
 										  econtext,
diff --git a/src/backend/executor/tstoreReceiver.c b/src/backend/executor/tstoreReceiver.c
index de4646b5c2..39aa472d1c 100644
--- a/src/backend/executor/tstoreReceiver.c
+++ b/src/backend/executor/tstoreReceiver.c
@@ -65,9 +65,9 @@ tstoreStartupReceiver(DestReceiver *self, int operation, TupleDesc typeinfo)
 	{
 		for (i = 0; i < natts; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(typeinfo, i);
+			CompactAttribute *attr = TupleDescCompactAttr(typeinfo, i);
 
-			if (attr->attisdropped)
+			if (CompactAttrIsDropped(attr))
 				continue;
 			if (attr->attlen == -1)
 			{
@@ -154,9 +154,9 @@ tstoreReceiveSlot_detoast(TupleTableSlot *slot, DestReceiver *self)
 	for (i = 0; i < natts; i++)
 	{
 		Datum		val = slot->tts_values[i];
-		Form_pg_attribute attr = TupleDescAttr(typeinfo, i);
+		CompactAttribute *attr = TupleDescCompactAttr(typeinfo, i);
 
-		if (!attr->attisdropped && attr->attlen == -1 && !slot->tts_isnull[i])
+		if (!CompactAttrIsDropped(attr) && attr->attlen == -1 && !slot->tts_isnull[i])
 		{
 			if (VARATT_IS_EXTERNAL(DatumGetPointer(val)))
 			{
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index 78a3cfafde..f25da68e4d 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -175,19 +175,19 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
 	{
 		for (int i = 0; i < relation->rd_att->natts; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i);
+			CompactAttribute *attr = TupleDescCompactAttr(relation->rd_att, i);
 
-			if (attr->attnotnull)
+			if (CompactAttrIsNotNull(attr))
 			{
 				rel->notnullattnums = bms_add_member(rel->notnullattnums,
-													 attr->attnum);
+													 i + 1);
 
 				/*
 				 * Per RemoveAttributeById(), dropped columns will have their
 				 * attnotnull unset, so we needn't check for dropped columns
 				 * in the above condition.
 				 */
-				Assert(!attr->attisdropped);
+				Assert(!CompactAttrIsDropped(attr));
 			}
 		}
 	}
diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c
index abef4eaf68..bbb5003e5e 100644
--- a/src/backend/replication/pgoutput/pgoutput.c
+++ b/src/backend/replication/pgoutput/pgoutput.c
@@ -1305,7 +1305,7 @@ pgoutput_row_filter(Relation relation, TupleTableSlot *old_slot,
 	 */
 	for (i = 0; i < desc->natts; i++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, i);
+		CompactAttribute *att = TupleDescCompactAttr(desc, i);
 
 		/*
 		 * if the column in the new tuple or old tuple is null, nothing to do
diff --git a/src/backend/utils/adt/expandedrecord.c b/src/backend/utils/adt/expandedrecord.c
index 7e85ae3825..970a45c896 100644
--- a/src/backend/utils/adt/expandedrecord.c
+++ b/src/backend/utils/adt/expandedrecord.c
@@ -699,10 +699,10 @@ ER_get_flat_size(ExpandedObjectHeader *eohptr)
 	{
 		for (i = 0; i < erh->nfields; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+			CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 			if (!erh->dnulls[i] &&
-				!attr->attbyval && attr->attlen == -1 &&
+				!CompactAttrByVal(attr) && attr->attlen == -1 &&
 				VARATT_IS_EXTERNAL(DatumGetPointer(erh->dvalues[i])))
 			{
 				/*
@@ -1115,7 +1115,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 								   bool check_constraints)
 {
 	TupleDesc	tupdesc;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 	Datum	   *dvalues;
 	bool	   *dnulls;
 	char	   *oldValue;
@@ -1146,8 +1146,8 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 	 * Copy new field value into record's context, and deal with detoasting,
 	 * if needed.
 	 */
-	attr = TupleDescAttr(tupdesc, fnumber - 1);
-	if (!isnull && !attr->attbyval)
+	attr = TupleDescCompactAttr(tupdesc, fnumber - 1);
+	if (!isnull && !CompactAttrByVal(attr))
 	{
 		MemoryContext oldcxt;
 
@@ -1201,7 +1201,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 	erh->flat_size = 0;
 
 	/* Grab old field value for pfree'ing, if needed. */
-	if (!attr->attbyval && !dnulls[fnumber - 1])
+	if (!CompactAttrByVal(attr) && !dnulls[fnumber - 1])
 		oldValue = (char *) DatumGetPointer(dvalues[fnumber - 1]);
 	else
 		oldValue = NULL;
@@ -1279,18 +1279,18 @@ expanded_record_set_fields(ExpandedRecordHeader *erh,
 
 	for (fnumber = 0; fnumber < erh->nfields; fnumber++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, fnumber);
+		CompactAttribute *attr = TupleDescCompactAttr(tupdesc, fnumber);
 		Datum		newValue;
 		bool		isnull;
 
 		/* Ignore dropped columns */
-		if (attr->attisdropped)
+		if (CompactAttrIsDropped(attr))
 			continue;
 
 		newValue = newValues[fnumber];
 		isnull = isnulls[fnumber];
 
-		if (!attr->attbyval)
+		if (!CompactAttrByVal(attr))
 		{
 			/*
 			 * Copy new field value into record's context, and deal with
@@ -1541,9 +1541,9 @@ check_domain_for_new_field(ExpandedRecordHeader *erh, int fnumber,
 	 */
 	if (!isnull)
 	{
-		Form_pg_attribute attr = TupleDescAttr(erh->er_tupdesc, fnumber - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(erh->er_tupdesc, fnumber - 1);
 
-		if (!attr->attbyval && attr->attlen == -1 &&
+		if (!CompactAttrByVal(attr) && attr->attlen == -1 &&
 			VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
 			dummy_erh->flags |= ER_FLAG_HAVE_EXTERNAL;
 	}
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 62601a6d80..550af1befb 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -2833,9 +2833,9 @@ ri_KeysEqual(Relation rel, TupleTableSlot *oldslot, TupleTableSlot *newslot,
 			 * difference for ON UPDATE CASCADE, but for consistency we treat
 			 * all changes to the PK the same.
 			 */
-			Form_pg_attribute att = TupleDescAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
+			CompactAttribute *att = TupleDescCompactAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
 
-			if (!datum_image_eq(oldvalue, newvalue, att->attbyval, att->attlen))
+			if (!datum_image_eq(oldvalue, newvalue, CompactAttrByVal(att), att->attlen))
 				return false;
 		}
 		else
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 66ed24e401..71c4626b7a 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -584,6 +584,10 @@ RelationBuildTupleDesc(Relation relation)
 			   attp,
 			   ATTRIBUTE_FIXED_PART_SIZE);
 
+		populate_compact_attribute(TupleDescCompactAttr(relation->rd_att,
+														attnum - 1),
+								   attp);
+
 		/* Update constraint/default info */
 		if (attp->attnotnull)
 			constr->has_not_null = true;
@@ -673,12 +677,12 @@ RelationBuildTupleDesc(Relation relation)
 #endif
 
 	/*
-	 * However, we can easily set the attcacheoff value for the first
-	 * attribute: it must be zero.  This eliminates the need for special cases
-	 * for attnum=1 that used to exist in fastgetattr() and index_getattr().
+	 * We can easily set the attcacheoff value for the first attribute: it
+	 * must be zero.  This eliminates the need for special cases for attnum=1
+	 * that used to exist in fastgetattr() and index_getattr().
 	 */
 	if (RelationGetNumberOfAttributes(relation) > 0)
-		TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(relation->rd_att, 0)->attcacheoff = 0;
 
 	/*
 	 * Set up constraint/default info
@@ -1965,10 +1969,13 @@ formrdesc(const char *relationName, Oid relationReltype,
 		has_not_null |= attrs[i].attnotnull;
 		/* make sure attcacheoff is valid */
 		TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
+
+		populate_compact_attribute(TupleDescCompactAttr(relation->rd_att, i),
+								   TupleDescAttr(relation->rd_att, i));
 	}
 
 	/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
-	TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
+	TupleDescCompactAttr(relation->rd_att, 0)->attcacheoff = 0;
 
 	/* mark not-null status */
 	if (has_not_null)
@@ -4434,10 +4441,13 @@ BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs)
 		memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
 		/* make sure attcacheoff is valid */
 		TupleDescAttr(result, i)->attcacheoff = -1;
+
+		populate_compact_attribute(TupleDescCompactAttr(result, i),
+								   TupleDescAttr(result, i));
 	}
 
 	/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
-	TupleDescAttr(result, 0)->attcacheoff = 0;
+	TupleDescCompactAttr(result, 0)->attcacheoff = 0;
 
 	/* Note: we don't bother to set up a TupleConstr entry */
 
@@ -6172,6 +6182,8 @@ load_relcache_init_file(bool shared)
 				goto read_failed;
 
 			has_not_null |= attr->attnotnull;
+
+			populate_compact_attribute(TupleDescCompactAttr(rel->rd_att, i), attr);
 		}
 
 		/* next read the access method specific field */
diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h
index 5e38ef8696..0d1adff540 100644
--- a/src/include/access/htup_details.h
+++ b/src/include/access/htup_details.h
@@ -758,9 +758,9 @@ fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 	*isnull = false;
 	if (HeapTupleNoNulls(tup))
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
-		att = TupleDescAttr(tupleDesc, attnum - 1);
+		att = TupleDescCompactAttr(tupleDesc, attnum - 1);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, (char *) tup->t_data + tup->t_data->t_hoff +
 							att->attcacheoff);
diff --git a/src/include/access/itup.h b/src/include/access/itup.h
index 94885751e5..74461c6073 100644
--- a/src/include/access/itup.h
+++ b/src/include/access/itup.h
@@ -117,6 +117,7 @@ IndexInfoFindDataOffset(unsigned short t_info)
 static inline Datum
 index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 {
+
 	Assert(PointerIsValid(isnull));
 	Assert(attnum > 0);
 
@@ -124,11 +125,13 @@ index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 
 	if (!IndexTupleHasNulls(tup))
 	{
-		if (TupleDescAttr(tupleDesc, attnum - 1)->attcacheoff >= 0)
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, attnum - 1);
+
+		if (attr->attcacheoff >= 0)
 		{
-			return fetchatt(TupleDescAttr(tupleDesc, attnum - 1),
-							(char *) tup + IndexInfoFindDataOffset(tup->t_info)
-							+ TupleDescAttr(tupleDesc, attnum - 1)->attcacheoff);
+			return fetchatt(attr,
+							(char *) tup + IndexInfoFindDataOffset(tup->t_info) +
+							attr->attcacheoff);
 		}
 		else
 			return nocache_index_getattr(tup, attnum, tupleDesc);
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 2c435cdcb2..ec721f75bc 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -45,6 +45,46 @@ typedef struct TupleConstr
 	bool		has_generated_stored;
 } TupleConstr;
 
+/*
+ * CompactAttribute
+ *		Cut-down version of FormData_pg_attribute for faster access for tasks
+ *		such as tuple deformation.
+ */
+typedef struct CompactAttribute
+{
+	int32		attcacheoff;	/* fixed offset into tuple, if known, or -1 */
+	int16		attlen;			/* attr len in bytes or -1 = varlen, -2 =
+								 * cstring */
+	uint8		attflags;		/* bit flags for compact storage of bool
+								 * fields */
+	char		attalign;		/* alignment requirement */
+} CompactAttribute;
+
+#define COMPACT_ATTR_FLAG_BYVAL (1 << 0)
+#define COMPACT_ATTR_FLAG_IS_PACKABLE (1 << 1)
+#define COMPACT_ATTR_FLAG_HAS_MISSING (1 << 2)
+#define COMPACT_ATTR_FLAG_IS_DROPPED (1 << 3)
+#define COMPACT_ATTR_FLAG_IS_GENERATED (1 << 4)
+#define COMPACT_ATTR_FLAG_IS_NOTNULL (1 << 5)
+
+#define CompactAttrByVal(att) \
+	(((att)->attflags & COMPACT_ATTR_FLAG_BYVAL) != 0)
+
+#define CompactAttrIsPackable(att) \
+	(((att)->attflags & COMPACT_ATTR_FLAG_IS_PACKABLE) != 0)
+
+#define CompactAttrHasMissing(att) \
+	(((att)->attflags & COMPACT_ATTR_FLAG_HAS_MISSING) != 0)
+
+#define CompactAttrIsDropped(att) \
+	(((att)->attflags & COMPACT_ATTR_FLAG_IS_DROPPED) != 0)
+
+#define CompactAttrIsGenerated(att) \
+	(((att)->attflags & COMPACT_ATTR_FLAG_IS_GENERATED) != 0)
+
+#define CompactAttrIsNotNull(att) \
+	(((att)->attflags & COMPACT_ATTR_FLAG_IS_NOTNULL) != 0)
+
 /*
  * This struct is passed around within the backend to describe the structure
  * of tuples.  For tuples coming from on-disk relations, the information is
@@ -75,6 +115,18 @@ typedef struct TupleConstr
  * context and go away when the context is freed.  We set the tdrefcount
  * field of such a descriptor to -1, while reference-counted descriptors
  * always have tdrefcount >= 0.
+ *
+ * The attrs field stores the fixed-sized portion of FormData_pg_attribute.
+ * Because that struct is large, we also store a corresponding
+ * CompactAttribute for each attribute in compact_attrs.  This is stored
+ * inline with the struct.  Because CompactAttribute is significantly smaller
+ * than FormData_pg_attribute, code, especially performance-critical code
+ * should prioritize using the fields from the CompactAttribute over the
+ * equivalent fields in FormData_pg_attribute whenever possible.
+ *
+ * Any code making changes manually to the fields in 'attrs' must subsequently
+ * call populate_compact_attribute() to flush the changes out to the
+ * corresponding 'compact_attrs' element.
  */
 typedef struct TupleDescData
 {
@@ -85,12 +137,19 @@ typedef struct TupleDescData
 	TupleConstr *constr;		/* constraints, or NULL if none */
 	/* attrs[N] is the description of Attribute Number N+1 */
 	FormData_pg_attribute *attrs;
+	CompactAttribute compact_attrs[FLEXIBLE_ARRAY_MEMBER];
 }			TupleDescData;
 typedef struct TupleDescData *TupleDesc;
 
-/* Accessor for the i'th attribute of tupdesc. */
+/* Accessor for the i'th FormData_pg_attribute of tupdesc. */
 #define TupleDescAttr(tupdesc, i) (&(tupdesc)->attrs[(i)])
 
+/* Accessor for the i'th CompactAttribute of tupdesc */
+#define TupleDescCompactAttr(tupdesc, i) (&(tupdesc)->compact_attrs[(i)])
+
+extern void populate_compact_attribute(CompactAttribute *dst,
+									   Form_pg_attribute src);
+
 extern TupleDesc CreateTemplateTupleDesc(int natts);
 
 extern TupleDesc CreateTupleDesc(int natts, Form_pg_attribute *attrs);
@@ -99,13 +158,15 @@ extern TupleDesc CreateTupleDescCopy(TupleDesc tupdesc);
 
 extern TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc);
 
-#define TupleDescSize(src) MAXALIGN(sizeof(TupleDescData))
+#define TupleDescSize(src) \
+	(offsetof(struct TupleDescData, compact_attrs) + \
+	 (src)->natts * sizeof(CompactAttribute))
 
 #define TupleDescFullSize(src) \
-	(MAXALIGN(sizeof(TupleDescData)) + sizeof(FormData_pg_attribute) * (src)->natts)
+	(TupleDescSize(src) + sizeof(FormData_pg_attribute) * (src)->natts)
 
 #define TupleDescAttrAddress(desc) \
-	(Form_pg_attribute) ((char *) (desc) + MAXALIGN(sizeof(TupleDescData)))
+	(Form_pg_attribute) ((char *) (desc) + TupleDescSize(desc))
 
 extern void TupleDescCopy(TupleDesc dst, TupleDesc src);
 
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index 58b3a58cfd..9078d03231 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -30,7 +30,7 @@ att_isnull(int ATT, const bits8 *BITS)
 
 #ifndef FRONTEND
 /*
- * Given a Form_pg_attribute and a pointer into a tuple's data area,
+ * Given a CompactAttribute pointer and a pointer into a tuple's data area,
  * return the correct value or pointer.
  *
  * We return a Datum value in all cases.  If the attribute has "byval" false,
@@ -43,7 +43,7 @@ att_isnull(int ATT, const bits8 *BITS)
  *
  * Note that T must already be properly aligned for this to work correctly.
  */
-#define fetchatt(A,T) fetch_att(T, (A)->attbyval, (A)->attlen)
+#define fetchatt(A, T) fetch_att(T, CompactAttrByVal(A), (A)->attlen)
 
 /*
  * Same, but work from byval/len parameters rather than Form_pg_attribute.
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index 547d14b3e7..a1d1ca58ba 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -453,6 +453,7 @@ CommitTimestampEntry
 CommitTimestampShared
 CommonEntry
 CommonTableExpr
+CompactAttribute
 CompareScalarsContext
 CompiledExprState
 CompositeIOData
-- 
2.34.1

v2-0003-Optimize-alignment-calculations-in-tuple-form-def.patchapplication/octet-stream; name=v2-0003-Optimize-alignment-calculations-in-tuple-form-def.patchDownload
From c0234e83381d56dda74152b3c1297f960e9ebc03 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Wed, 29 May 2024 12:19:03 +1200
Subject: [PATCH v2 3/4] Optimize alignment calculations in tuple form/deform

This converts CompactAttribute.attalign from a char which is directly
derived from pg_attribute.attalign into a uint8 which specifies the
number of bytes to align the column by.  Also, rename the field to
attalignby to make the distinction more clear in code.

This removes the complexity of checking each char value and transforming
that into the appropriate alignment call.  This can just be a simple
TYPEALIGN passing in the number of bytes.
---
 contrib/amcheck/verify_heapam.c        |  6 +--
 contrib/pageinspect/heapfuncs.c        |  6 +--
 src/backend/access/brin/brin_tuple.c   |  8 ++--
 src/backend/access/common/attmap.c     |  2 +-
 src/backend/access/common/heaptuple.c  | 52 +++++++++++++-------------
 src/backend/access/common/indextuple.c | 22 +++++------
 src/backend/access/common/tupdesc.c    | 20 +++++++++-
 src/backend/executor/execExprInterp.c  |  2 +-
 src/backend/executor/execTuples.c      | 19 +++++-----
 src/include/access/tupdesc.h           |  2 +-
 src/include/access/tupmacs.h           | 23 ++++++++++++
 11 files changed, 100 insertions(+), 62 deletions(-)

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index 08772de39f..b66eb178b9 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1592,7 +1592,7 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	/* Skip non-varlena values, but update offset first */
 	if (thisatt->attlen != -1)
 	{
-		ctx->offset = att_align_nominal(ctx->offset, thisatt->attalign);
+		ctx->offset = att_nominal_alignby(ctx->offset, thisatt->attalignby);
 		ctx->offset = att_addlength_pointer(ctx->offset, thisatt->attlen,
 											tp + ctx->offset);
 		if (ctx->tuphdr->t_hoff + ctx->offset > ctx->lp_len)
@@ -1608,8 +1608,8 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	}
 
 	/* Ok, we're looking at a varlena attribute. */
-	ctx->offset = att_align_pointer(ctx->offset, thisatt->attalign, -1,
-									tp + ctx->offset);
+	ctx->offset = att_pointer_alignby(ctx->offset, thisatt->attalignby, -1,
+									  tp + ctx->offset);
 
 	/* Get the (possibly corrupt) varlena datum */
 	attdatum = fetchatt(thisatt, tp + ctx->offset);
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 6234bb8729..54ecea28e1 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -354,8 +354,8 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 
 			if (attr->attlen == -1)
 			{
-				off = att_align_pointer(off, attr->attalign, -1,
-										tupdata + off);
+				off = att_pointer_alignby(off, attr->attalignby, -1,
+										  tupdata + off);
 
 				/*
 				 * As VARSIZE_ANY throws an exception if it can't properly
@@ -373,7 +373,7 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 			}
 			else
 			{
-				off = att_align_nominal(off, attr->attalign);
+				off = att_nominal_alignby(off, attr->attalignby);
 				len = attr->attlen;
 			}
 
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index aae646be5d..e65c1efff4 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -703,13 +703,13 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
 
 			if (thisatt->attlen == -1)
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, thisatt->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, thisatt->attalignby);
 			}
 
 			values[stored++] = fetchatt(thisatt, tp + off);
diff --git a/src/backend/access/common/attmap.c b/src/backend/access/common/attmap.c
index e2d46843bc..676ef9d85f 100644
--- a/src/backend/access/common/attmap.c
+++ b/src/backend/access/common/attmap.c
@@ -323,7 +323,7 @@ check_attrmap_match(TupleDesc indesc,
 		if (attrMap->attnums[i] == 0 &&
 			CompactAttrIsDropped(inatt) &&
 			inatt->attlen == outatt->attlen &&
-			inatt->attalign == outatt->attalign)
+			inatt->attalignby == outatt->attalignby)
 			continue;
 
 		return false;
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 70595c55b7..91aa407b31 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -250,13 +250,13 @@ heap_compute_data_size(TupleDesc tupleDesc,
 			 * we want to flatten the expanded value so that the constructed
 			 * tuple doesn't depend on it
 			 */
-			data_length = att_align_nominal(data_length, atti->attalign);
+			data_length = att_nominal_alignby(data_length, atti->attalignby);
 			data_length += EOH_get_flat_size(DatumGetEOHP(val));
 		}
 		else
 		{
-			data_length = att_align_datum(data_length, atti->attalign,
-										  atti->attlen, val);
+			data_length = att_datum_alignby(data_length, atti->attalignby,
+											atti->attlen, val);
 			data_length = att_addlength_datum(data_length, atti->attlen,
 											  val);
 		}
@@ -307,13 +307,13 @@ fill_val(CompactAttribute *att,
 	}
 
 	/*
-	 * XXX we use the att_align macros on the pointer value itself, not on an
-	 * offset.  This is a bit of a hack.
+	 * XXX we use the att_nominal_alignby macro on the pointer value itself,
+	 * not on an offset.  This is a bit of a hack.
 	 */
 	if (CompactAttrByVal(att))
 	{
 		/* pass-by-value */
-		data = (char *) att_align_nominal(data, att->attalign);
+		data = (char *) att_nominal_alignby(data, att->attalignby);
 		store_att_byval(data, datum, att->attlen);
 		data_length = att->attlen;
 	}
@@ -333,8 +333,7 @@ fill_val(CompactAttribute *att,
 				 */
 				ExpandedObjectHeader *eoh = DatumGetEOHP(datum);
 
-				data = (char *) att_align_nominal(data,
-												  att->attalign);
+				data = (char *) att_nominal_alignby(data, att->attalignby);
 				data_length = EOH_get_flat_size(eoh);
 				EOH_flatten_into(eoh, data, data_length);
 			}
@@ -363,8 +362,7 @@ fill_val(CompactAttribute *att,
 		else
 		{
 			/* full 4-byte header varlena */
-			data = (char *) att_align_nominal(data,
-											  att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = VARSIZE(val);
 			memcpy(data, val, data_length);
 		}
@@ -373,14 +371,14 @@ fill_val(CompactAttribute *att,
 	{
 		/* cstring ... never needs alignment */
 		*infomask |= HEAP_HASVARWIDTH;
-		Assert(att->attalign == TYPALIGN_CHAR);
+		Assert(att->attalignby == sizeof(char));
 		data_length = strlen(DatumGetCString(datum)) + 1;
 		memcpy(data, DatumGetPointer(datum), data_length);
 	}
 	else
 	{
 		/* fixed-length pass-by-reference */
-		data = (char *) att_align_nominal(data, att->attalign);
+		data = (char *) att_nominal_alignby(data, att->attalignby);
 		Assert(att->attlen > 0);
 		data_length = att->attlen;
 		memcpy(data, DatumGetPointer(datum), data_length);
@@ -634,7 +632,7 @@ nocachegetattr(HeapTuple tup,
 			if (att->attlen <= 0)
 				break;
 
-			off = att_align_nominal(off, att->attalign);
+			off = att_nominal_alignby(off, att->attalignby);
 
 			att->attcacheoff = off;
 
@@ -683,19 +681,19 @@ nocachegetattr(HeapTuple tup,
 				 * either an aligned or unaligned value.
 				 */
 				if (usecache &&
-					off == att_align_nominal(off, att->attalign))
+					off == att_nominal_alignby(off, att->attalignby))
 					att->attcacheoff = off;
 				else
 				{
-					off = att_align_pointer(off, att->attalign, -1,
-											tp + off);
+					off = att_pointer_alignby(off, att->attalignby, -1,
+											  tp + off);
 					usecache = false;
 				}
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, att->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, att->attalignby);
 
 				if (usecache)
 					att->attcacheoff = off;
@@ -898,10 +896,10 @@ expand_tuple(HeapTuple *targetHeapTuple,
 			{
 				CompactAttribute *att = TupleDescCompactAttr(tupleDesc, attnum);
 
-				targetDataLen = att_align_datum(targetDataLen,
-												att->attalign,
-												att->attlen,
-												attrmiss[attnum].am_value);
+				targetDataLen = att_datum_alignby(targetDataLen,
+												  att->attalignby,
+												  att->attlen,
+												  attrmiss[attnum].am_value);
 
 				targetDataLen = att_addlength_pointer(targetDataLen,
 													  att->attlen,
@@ -1396,19 +1394,19 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index 37133ed7f8..3947b4a4d8 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -363,7 +363,7 @@ nocache_index_getattr(IndexTuple tup,
 			if (att->attlen <= 0)
 				break;
 
-			off = att_align_nominal(off, att->attalign);
+			off = att_nominal_alignby(off, att->attalignby);
 
 			att->attcacheoff = off;
 
@@ -412,19 +412,19 @@ nocache_index_getattr(IndexTuple tup,
 				 * either an aligned or unaligned value.
 				 */
 				if (usecache &&
-					off == att_align_nominal(off, att->attalign))
+					off == att_nominal_alignby(off, att->attalignby))
 					att->attcacheoff = off;
 				else
 				{
-					off = att_align_pointer(off, att->attalign, -1,
-											tp + off);
+					off = att_pointer_alignby(off, att->attalignby, -1,
+											  tp + off);
 					usecache = false;
 				}
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, att->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, att->attalignby);
 
 				if (usecache)
 					att->attcacheoff = off;
@@ -513,19 +513,19 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 44d24585b0..4252904fc8 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -77,7 +77,25 @@ populate_compact_attribute(CompactAttribute *dst, Form_pg_attribute src)
 	if (src->attnotnull)
 		dst->attflags |= COMPACT_ATTR_FLAG_IS_NOTNULL;
 
-	dst->attalign = src->attalign;
+	switch (src->attalign)
+	{
+		case TYPALIGN_INT:
+			dst->attalignby = ALIGNOF_INT;
+			break;
+		case TYPALIGN_CHAR:
+			dst->attalignby = sizeof(char);
+			break;
+		case TYPALIGN_DOUBLE:
+			dst->attalignby = ALIGNOF_DOUBLE;
+			break;
+		case TYPALIGN_SHORT:
+			dst->attalignby = ALIGNOF_SHORT;
+			break;
+		default:
+			dst->attalignby = 0;
+			elog(ERROR, "invalid attalign value: %c", src->attalign);
+			break;
+	}
 }
 
 /*
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 623d72cd53..86eafe7e86 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -4970,7 +4970,7 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
 			if (slot->tts_isnull[i])
 				continue;		/* null is always okay */
 			if (vattr->attlen != sattr->attlen ||
-				vattr->attalign != sattr->attalign)
+				vattr->attalignby != sattr->attalignby)
 				ereport(ERROR,
 						(errcode(ERRCODE_DATATYPE_MISMATCH),
 						 errmsg("table row type and query-specified row type do not match"),
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 550b8e8f34..75d17a0dfe 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -202,12 +202,12 @@ tts_virtual_materialize(TupleTableSlot *slot)
 			 * We want to flatten the expanded value so that the materialized
 			 * slot doesn't depend on it.
 			 */
-			sz = att_align_nominal(sz, att->attalign);
+			sz = att_nominal_alignby(sz, att->attalignby);
 			sz += EOH_get_flat_size(DatumGetEOHP(val));
 		}
 		else
 		{
-			sz = att_align_nominal(sz, att->attalign);
+			sz = att_nominal_alignby(sz, att->attalignby);
 			sz = att_addlength_datum(sz, att->attlen, val);
 		}
 	}
@@ -242,8 +242,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 			 */
 			ExpandedObjectHeader *eoh = DatumGetEOHP(val);
 
-			data = (char *) att_align_nominal(data,
-											  att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = EOH_get_flat_size(eoh);
 			EOH_flatten_into(eoh, data, data_length);
 
@@ -254,7 +253,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 		{
 			Size		data_length = 0;
 
-			data = (char *) att_align_nominal(data, att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = att_addlength_datum(data_length, att->attlen, val);
 
 			memcpy(data, DatumGetPointer(val), data_length);
@@ -1067,19 +1066,19 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index ec721f75bc..7d1b42eea7 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -57,7 +57,7 @@ typedef struct CompactAttribute
 								 * cstring */
 	uint8		attflags;		/* bit flags for compact storage of bool
 								 * fields */
-	char		attalign;		/* alignment requirement */
+	uint8		attalignby;		/* alignment requirement in bytes */
 } CompactAttribute;
 
 #define COMPACT_ATTR_FLAG_BYVAL (1 << 0)
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index 9078d03231..1e2e2be021 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -90,6 +90,16 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	att_align_nominal(cur_offset, attalign) \
 )
 
+/*
+ * Similar to att_align_datum, but accepts a number of bytes, typically from
+ * CompactAttribute.attalignby to align the Datum by.
+ */
+#define att_datum_alignby(cur_offset, attalignby, attlen, attdatum) \
+	( \
+	((attlen) == -1 && VARATT_IS_SHORT(DatumGetPointer(attdatum))) ? \
+	(uintptr_t) (cur_offset) : \
+	TYPEALIGN(attalignby, cur_offset))
+
 /*
  * att_align_pointer performs the same calculation as att_align_datum,
  * but is used when walking a tuple.  attptr is the current actual data
@@ -111,6 +121,12 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	att_align_nominal(cur_offset, attalign) \
 )
 
+#define att_pointer_alignby(cur_offset, attalignby, attlen, attptr) \
+( \
+	((attlen) == -1 && VARATT_NOT_PAD_BYTE(attptr)) ? \
+	(uintptr_t) (cur_offset) : \
+	TYPEALIGN(attalignby, cur_offset))
+
 /*
  * att_align_nominal aligns the given offset as needed for a datum of alignment
  * requirement attalign, ignoring any consideration of packed varlena datums.
@@ -137,6 +153,13 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	   ))) \
 )
 
+/*
+ * Similar to att_align_nominal, but accepts a number of bytes, typically from
+ * CompactAttribute.attalignby to align the offset by.
+ */
+#define att_nominal_alignby(cur_offset, attalignby) \
+	TYPEALIGN(attalignby, (uintptr_t) cur_offset)
+
 /*
  * att_addlength_datum increments the given offset by the space needed for
  * the given Datum variable.  attdatum is only accessed if we are dealing
-- 
2.34.1

v2-0004-Remove-pg_attribute.attcacheoff-column.patchapplication/octet-stream; name=v2-0004-Remove-pg_attribute.attcacheoff-column.patchDownload
From 66b9bc418f7a79fbe98c7dd644da1ffbe1f65a62 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 6 Aug 2024 03:03:12 +1200
Subject: [PATCH v2 4/4] Remove pg_attribute.attcacheoff column

This is no longer needed as the offset is now cached in the
CompactAttribute struct.
---
 doc/src/sgml/catalogs.sgml                | 11 -----------
 src/backend/access/common/tupdesc.c       | 17 ++---------------
 src/backend/bootstrap/bootstrap.c         |  1 -
 src/backend/catalog/heap.c                | 16 ++++------------
 src/backend/catalog/index.c               |  1 -
 src/backend/utils/cache/relcache.c        | 18 ------------------
 src/include/catalog/pg_attribute.h        |  9 ---------
 src/test/regress/expected/type_sanity.out |  3 +--
 src/test/regress/sql/type_sanity.sql      |  3 +--
 9 files changed, 8 insertions(+), 71 deletions(-)

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index b654fae1b2..6c6abd53ca 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -1186,17 +1186,6 @@
       </para></entry>
      </row>
 
-     <row>
-      <entry role="catalog_table_entry"><para role="column_definition">
-       <structfield>attcacheoff</structfield> <type>int4</type>
-      </para>
-      <para>
-       Always -1 in storage, but when loaded into a row descriptor
-       in memory this might be updated to cache the offset of the attribute
-       within the row
-      </para></entry>
-     </row>
-
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>atttypmod</structfield> <type>int4</type>
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 4252904fc8..e2aaa38bd4 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -368,17 +368,7 @@ TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
 
 	memcpy(dstAtt, srcAtt, ATTRIBUTE_FIXED_PART_SIZE);
 
-	/*
-	 * Aside from updating the attno, we'd better reset attcacheoff.
-	 *
-	 * XXX Actually, to be entirely safe we'd need to reset the attcacheoff of
-	 * all following columns in dst as well.  Current usage scenarios don't
-	 * require that though, because all following columns will get initialized
-	 * by other uses of this function or TupleDescInitEntry.  So we cheat a
-	 * bit to avoid a useless O(N^2) penalty.
-	 */
 	dstAtt->attnum = dstAttno;
-	dstAtt->attcacheoff = -1;
 
 	/* since we're not copying constraints or defaults, clear these */
 	dstAtt->attnotnull = false;
@@ -508,9 +498,8 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
 		 * them (since atttypid will be zero for all dropped columns) and in
 		 * general it seems safer to check them always.
 		 *
-		 * attcacheoff must NOT be checked since it's possibly not set in both
-		 * copies.  We also intentionally ignore atthasmissing, since that's
-		 * not very relevant in tupdescs, which lack the attmissingval field.
+		 * We intentionally ignore atthasmissing, since that's not very
+		 * relevant in tupdescs, which lack the attmissingval field.
 		 */
 		if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0)
 			return false;
@@ -751,7 +740,6 @@ TupleDescInitEntry(TupleDesc desc,
 	else if (attributeName != NameStr(att->attname))
 		namestrcpy(&(att->attname), attributeName);
 
-	att->attcacheoff = -1;
 	att->atttypmod = typmod;
 
 	att->attnum = attributeNumber;
@@ -816,7 +804,6 @@ TupleDescInitBuiltinEntry(TupleDesc desc,
 	Assert(attributeName != NULL);
 	namestrcpy(&(att->attname), attributeName);
 
-	att->attcacheoff = -1;
 	att->atttypmod = typmod;
 
 	att->attnum = attributeNumber;
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 7637581a18..e6b4ff6f10 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -547,7 +547,6 @@ DefineAttr(char *name, char *type, int attnum, int nullness)
 	if (OidIsValid(attrtypes[attnum]->attcollation))
 		attrtypes[attnum]->attcollation = C_COLLATION_OID;
 
-	attrtypes[attnum]->attcacheoff = -1;
 	attrtypes[attnum]->atttypmod = -1;
 	attrtypes[attnum]->attislocal = true;
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 01b43cc6a8..9a9f4c1562 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -144,7 +144,6 @@ static const FormData_pg_attribute a1 = {
 	.atttypid = TIDOID,
 	.attlen = sizeof(ItemPointerData),
 	.attnum = SelfItemPointerAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = false,
 	.attalign = TYPALIGN_SHORT,
@@ -158,7 +157,6 @@ static const FormData_pg_attribute a2 = {
 	.atttypid = XIDOID,
 	.attlen = sizeof(TransactionId),
 	.attnum = MinTransactionIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -172,7 +170,6 @@ static const FormData_pg_attribute a3 = {
 	.atttypid = CIDOID,
 	.attlen = sizeof(CommandId),
 	.attnum = MinCommandIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -186,7 +183,6 @@ static const FormData_pg_attribute a4 = {
 	.atttypid = XIDOID,
 	.attlen = sizeof(TransactionId),
 	.attnum = MaxTransactionIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -200,7 +196,6 @@ static const FormData_pg_attribute a5 = {
 	.atttypid = CIDOID,
 	.attlen = sizeof(CommandId),
 	.attnum = MaxCommandIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -220,7 +215,6 @@ static const FormData_pg_attribute a6 = {
 	.atttypid = OIDOID,
 	.attlen = sizeof(Oid),
 	.attnum = TableOidAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -684,11 +678,10 @@ CheckAttributeType(const char *attname,
  *		Construct and insert a set of tuples in pg_attribute.
  *
  * Caller has already opened and locked pg_attribute.  tupdesc contains the
- * attributes to insert.  attcacheoff is always initialized to -1.
- * tupdesc_extra supplies the values for certain variable-length/nullable
- * pg_attribute fields and must contain the same number of elements as tupdesc
- * or be NULL.  The other variable-length fields of pg_attribute are always
- * initialized to null values.
+ * attributes to insert.  tupdesc_extra supplies the values for certain
+ * variable-length/nullable pg_attribute fields and must contain the same
+ * number of elements as tupdesc or be NULL.  The other variable-length fields
+ * of pg_attribute are always initialized to null values.
  *
  * indstate is the index state for CatalogTupleInsertWithInfo.  It can be
  * passed as NULL, in which case we'll fetch the necessary info.  (Don't do
@@ -740,7 +733,6 @@ InsertPgAttributeTuples(Relation pg_attribute_rel,
 		slot[slotCount]->tts_values[Anum_pg_attribute_atttypid - 1] = ObjectIdGetDatum(attrs->atttypid);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attlen - 1] = Int16GetDatum(attrs->attlen);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attnum - 1] = Int16GetDatum(attrs->attnum);
-		slot[slotCount]->tts_values[Anum_pg_attribute_attcacheoff - 1] = Int32GetDatum(-1);
 		slot[slotCount]->tts_values[Anum_pg_attribute_atttypmod - 1] = Int32GetDatum(attrs->atttypmod);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attndims - 1] = Int16GetDatum(attrs->attndims);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attbyval - 1] = BoolGetDatum(attrs->attbyval);
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 6ffc536317..d0dc7d049a 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -320,7 +320,6 @@ ConstructTupleDescriptor(Relation heapRelation,
 
 		MemSet(to, 0, ATTRIBUTE_FIXED_PART_SIZE);
 		to->attnum = i + 1;
-		to->attcacheoff = -1;
 		to->attislocal = true;
 		to->attcollation = (i < numkeyatts) ? collationIds[i] : InvalidOid;
 
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 71c4626b7a..d6200dc6db 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -662,20 +662,6 @@ RelationBuildTupleDesc(Relation relation)
 		elog(ERROR, "pg_attribute catalog is missing %d attribute(s) for relation OID %u",
 			 need, RelationGetRelid(relation));
 
-	/*
-	 * The attcacheoff values we read from pg_attribute should all be -1
-	 * ("unknown").  Verify this if assert checking is on.  They will be
-	 * computed when and if needed during tuple access.
-	 */
-#ifdef USE_ASSERT_CHECKING
-	{
-		int			i;
-
-		for (i = 0; i < RelationGetNumberOfAttributes(relation); i++)
-			Assert(TupleDescAttr(relation->rd_att, i)->attcacheoff == -1);
-	}
-#endif
-
 	/*
 	 * We can easily set the attcacheoff value for the first attribute: it
 	 * must be zero.  This eliminates the need for special cases for attnum=1
@@ -1967,8 +1953,6 @@ formrdesc(const char *relationName, Oid relationReltype,
 			   &attrs[i],
 			   ATTRIBUTE_FIXED_PART_SIZE);
 		has_not_null |= attrs[i].attnotnull;
-		/* make sure attcacheoff is valid */
-		TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
 
 		populate_compact_attribute(TupleDescCompactAttr(relation->rd_att, i),
 								   TupleDescAttr(relation->rd_att, i));
@@ -4439,8 +4423,6 @@ BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs)
 	for (i = 0; i < natts; i++)
 	{
 		memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
-		/* make sure attcacheoff is valid */
-		TupleDescAttr(result, i)->attcacheoff = -1;
 
 		populate_compact_attribute(TupleDescCompactAttr(result, i),
 								   TupleDescAttr(result, i));
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index 1c62b8bfcb..30d1e8cfcc 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -73,15 +73,6 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
 	 */
 	int16		attnum;
 
-	/*
-	 * fastgetattr() uses attcacheoff to cache byte offsets of attributes in
-	 * heap tuples.  The value actually stored in pg_attribute (-1) indicates
-	 * no cached value.  But when we copy these tuples into a tuple
-	 * descriptor, we may then update attcacheoff in the copies. This speeds
-	 * up the attribute walking process.
-	 */
-	int32		attcacheoff BKI_DEFAULT(-1);
-
 	/*
 	 * atttypmod records type-specific data supplied at table creation time
 	 * (for example, the max length of a varchar field).  It is passed to
diff --git a/src/test/regress/expected/type_sanity.out b/src/test/regress/expected/type_sanity.out
index 88d8f6c32d..8eff3d10d2 100644
--- a/src/test/regress/expected/type_sanity.out
+++ b/src/test/regress/expected/type_sanity.out
@@ -550,8 +550,7 @@ WHERE pc.relkind IN ('r', 't', 'm') and
 SELECT a1.attrelid, a1.attname
 FROM pg_attribute as a1
 WHERE a1.attrelid = 0 OR a1.atttypid = 0 OR a1.attnum = 0 OR
-    a1.attcacheoff != -1 OR a1.attinhcount < 0 OR
-    (a1.attinhcount = 0 AND NOT a1.attislocal);
+    a1.attinhcount < 0 OR (a1.attinhcount = 0 AND NOT a1.attislocal);
  attrelid | attname 
 ----------+---------
 (0 rows)
diff --git a/src/test/regress/sql/type_sanity.sql b/src/test/regress/sql/type_sanity.sql
index e88d6cbe49..303f90955d 100644
--- a/src/test/regress/sql/type_sanity.sql
+++ b/src/test/regress/sql/type_sanity.sql
@@ -397,8 +397,7 @@ WHERE pc.relkind IN ('r', 't', 'm') and
 SELECT a1.attrelid, a1.attname
 FROM pg_attribute as a1
 WHERE a1.attrelid = 0 OR a1.atttypid = 0 OR a1.attnum = 0 OR
-    a1.attcacheoff != -1 OR a1.attinhcount < 0 OR
-    (a1.attinhcount = 0 AND NOT a1.attislocal);
+    a1.attinhcount < 0 OR (a1.attinhcount = 0 AND NOT a1.attislocal);
 
 -- Cross-check attnum against parent relation
 
-- 
2.34.1

#12David Rowley
dgrowleyml@gmail.com
In reply to: David Rowley (#11)
8 attachment(s)
Re: Make tuple deformation faster

On Tue, 6 Aug 2024 at 13:11, David Rowley <dgrowleyml@gmail.com> wrote:

I'll put this up for the CF bot to run with for a bit as the patch has
needed a rebase since I pushed the v1-0001 patch.

I've been doing more work on this patch set as I'd been concerned
there wasn't any validation to ensure the TupleDesc's
FormData_pg_attribute and the CompactAttribute are kept in sync when
the TupleDesc is altered in various places around the codebase. To
make this more robust, in USE_ASSERT_CHECKING builds, I made it so the
TupleDescCompactAttr() macro is turned into an inline function with an
Assert to validate the stored CompactAttribute vs one freshly
populated from the FormData_pg_attribute. Doing this caused me to find
a missed call to populate_compact_attribute(), so was worth the
effort. There's no apparent performance difference when running all
the tests with and without this extra checking.

I also spent time doing performance tests using 3 different machines.
I didn't document the previous performance tests, but I expect I ran
them on my AMD 7945hx laptop. On testing again today, I used that
Zen4 laptop plus an AMD 3990x (Zen2) and a 10-core Apple M2. I found
that it was only the 7945hx laptop that was showing any decent gains
from this patch :(. After thinking for a bit, I decided to expand the
CompactAttribute.attflags where I'd been bit packing in 5 boolean
fields from pg_attribute and expand those into bool fields. This made
the performance much better. The 0005 contains this change
independently.

Please see the attached "patches-0001-0005_results.png". This shows
the test query running 25% faster on the 7945hx laptop with gcc. The
least gains were from the Apple M2 at about a 9-10% increase.

The "patches-0001-0004_results.png" shows the results with the smaller
bit-packed CompactAttriubute struct. You can see that without the 0005
patch, there are some performance regressions, so I propose including
0005 which widens CompactAttribute from 8 bytes to 16 bytes.

David

Attachments:

v3-0001-Move-TupleDesc.attrs-out-of-line.patchapplication/octet-stream; name=v3-0001-Move-TupleDesc.attrs-out-of-line.patchDownload
From f296345bd8f1332d2b42b3585ff577352fe30067 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 28 May 2024 13:49:07 +1200
Subject: [PATCH v3 1/5] Move TupleDesc.attrs out of line

Change TupleDesc attrs field so that it's no longer memory allocated at
the end of the TupleDesc struct.  Here we change this so that 'attrs' is
a pointer that always points to memory beyond the end of the struct.

This is just refactoring work to make way for a follow-on commit, of which
adds another variable length array to TupleDesc.
---
 src/backend/access/common/indextuple.c |  2 +-
 src/backend/access/common/tupdesc.c    | 11 +++++++++--
 src/backend/utils/cache/typcache.c     | 15 ++++++++++++++-
 src/include/access/tupdesc.h           | 12 ++++++++----
 4 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index bb2c6a2bcc..79ae29989d 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -588,7 +588,7 @@ index_truncate_tuple(TupleDesc sourceDescriptor, IndexTuple source,
 		return CopyIndexTuple(source);
 
 	/* Create temporary descriptor to scribble on */
-	truncdesc = palloc(TupleDescSize(sourceDescriptor));
+	truncdesc = CreateTemplateTupleDesc(sourceDescriptor->natts);
 	TupleDescCopy(truncdesc, sourceDescriptor);
 	truncdesc->natts = leavenatts;
 
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 47379fef22..fba0026520 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -85,7 +85,7 @@ CreateTemplateTupleDesc(int natts)
 	 * could be less due to trailing padding, although with the current
 	 * definition of pg_attribute there probably isn't any padding.
 	 */
-	desc = (TupleDesc) palloc(offsetof(struct TupleDescData, attrs) +
+	desc = (TupleDesc) palloc(MAXALIGN(sizeof(TupleDescData)) +
 							  natts * sizeof(FormData_pg_attribute));
 
 	/*
@@ -96,6 +96,7 @@ CreateTemplateTupleDesc(int natts)
 	desc->tdtypeid = RECORDOID;
 	desc->tdtypmod = -1;
 	desc->tdrefcount = -1;		/* assume not reference-counted */
+	desc->attrs = TupleDescAttrAddress(desc);
 
 	return desc;
 }
@@ -252,9 +253,15 @@ TupleDescCopy(TupleDesc dst, TupleDesc src)
 {
 	int			i;
 
-	/* Flat-copy the header and attribute array */
+	/* Flat-copy the header */
 	memcpy(dst, src, TupleDescSize(src));
 
+	/* restore original attribute array pointer and replace contents from src */
+	dst->attrs = TupleDescAttrAddress(dst);
+	memcpy(TupleDescAttr(dst, 0),
+		   TupleDescAttr(src, 0),
+		   sizeof(FormData_pg_attribute) * dst->natts);
+
 	/*
 	 * Since we're not copying constraints and defaults, clear fields
 	 * associated with them.
diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
index 0b9e60845b..fe583a75df 100644
--- a/src/backend/utils/cache/typcache.c
+++ b/src/backend/utils/cache/typcache.c
@@ -222,12 +222,18 @@ shared_record_table_compare(const void *a, const void *b, size_t size,
 	TupleDesc	t2;
 
 	if (k1->shared)
+	{
 		t1 = (TupleDesc) dsa_get_address(area, k1->u.shared_tupdesc);
+		t1->attrs = TupleDescAttrAddress(t1);
+	}
 	else
 		t1 = k1->u.local_tupdesc;
 
 	if (k2->shared)
+	{
 		t2 = (TupleDesc) dsa_get_address(area, k2->u.shared_tupdesc);
+		t2->attrs = TupleDescAttrAddress(t2);
+	}
 	else
 		t2 = k2->u.local_tupdesc;
 
@@ -245,7 +251,10 @@ shared_record_table_hash(const void *a, size_t size, void *arg)
 	TupleDesc	t;
 
 	if (k->shared)
+	{
 		t = (TupleDesc) dsa_get_address(area, k->u.shared_tupdesc);
+		t->attrs = TupleDescAttrAddress(t);
+	}
 	else
 		t = k->u.local_tupdesc;
 
@@ -1797,6 +1806,7 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
 					tupdesc = (TupleDesc)
 						dsa_get_address(CurrentSession->area,
 										entry->shared_tupdesc);
+					tupdesc->attrs = TupleDescAttrAddress(tupdesc);
 					Assert(typmod == tupdesc->tdtypmod);
 
 					/* We may need to extend the local RecordCacheArray. */
@@ -2762,7 +2772,7 @@ share_tupledesc(dsa_area *area, TupleDesc tupdesc, uint32 typmod)
 	dsa_pointer shared_dp;
 	TupleDesc	shared;
 
-	shared_dp = dsa_allocate(area, TupleDescSize(tupdesc));
+	shared_dp = dsa_allocate(area, TupleDescFullSize(tupdesc));
 	shared = (TupleDesc) dsa_get_address(area, shared_dp);
 	TupleDescCopy(shared, tupdesc);
 	shared->tdtypmod = typmod;
@@ -2805,6 +2815,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 		result = (TupleDesc)
 			dsa_get_address(CurrentSession->area,
 							record_table_entry->key.u.shared_tupdesc);
+		result->attrs = TupleDescAttrAddress(result);
 		Assert(result->tdrefcount == -1);
 
 		return result;
@@ -2868,6 +2879,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 		result = (TupleDesc)
 			dsa_get_address(CurrentSession->area,
 							record_table_entry->key.u.shared_tupdesc);
+		result->attrs = TupleDescAttrAddress(result);
 		Assert(result->tdrefcount == -1);
 
 		return result;
@@ -2880,6 +2892,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 						record_table_entry);
 	result = (TupleDesc)
 		dsa_get_address(CurrentSession->area, shared_dp);
+	result->attrs = TupleDescAttrAddress(result);
 	Assert(result->tdrefcount == -1);
 
 	return result;
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 8930a28d66..2c435cdcb2 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -84,7 +84,7 @@ typedef struct TupleDescData
 	int			tdrefcount;		/* reference count, or -1 if not counting */
 	TupleConstr *constr;		/* constraints, or NULL if none */
 	/* attrs[N] is the description of Attribute Number N+1 */
-	FormData_pg_attribute attrs[FLEXIBLE_ARRAY_MEMBER];
+	FormData_pg_attribute *attrs;
 }			TupleDescData;
 typedef struct TupleDescData *TupleDesc;
 
@@ -99,9 +99,13 @@ extern TupleDesc CreateTupleDescCopy(TupleDesc tupdesc);
 
 extern TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc);
 
-#define TupleDescSize(src) \
-	(offsetof(struct TupleDescData, attrs) + \
-	 (src)->natts * sizeof(FormData_pg_attribute))
+#define TupleDescSize(src) MAXALIGN(sizeof(TupleDescData))
+
+#define TupleDescFullSize(src) \
+	(MAXALIGN(sizeof(TupleDescData)) + sizeof(FormData_pg_attribute) * (src)->natts)
+
+#define TupleDescAttrAddress(desc) \
+	(Form_pg_attribute) ((char *) (desc) + MAXALIGN(sizeof(TupleDescData)))
 
 extern void TupleDescCopy(TupleDesc dst, TupleDesc src);
 
-- 
2.43.0

v3-0002-Introduce-CompactAttribute-array-in-TupleDesc.patchapplication/octet-stream; name=v3-0002-Introduce-CompactAttribute-array-in-TupleDesc.patchDownload
From 35a6cdc2056decc31d67ad552826b573d2b66073 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 28 May 2024 20:10:50 +1200
Subject: [PATCH v3 2/5] Introduce CompactAttribute array in TupleDesc

This array stores a subset of the fields of FormData_pg_attribute,
primarily the ones for deforming tuples, but since we have additional
space, pack a few additional boolean columns in the attflags field.

Many areas of the code can get away with only accessing the
CompactAttribute array, which because the details of each attribute is
stored much more densely than FormData_pg_attribute, many operations can
be performed accessing fewer cachelines which can improve performance.

This also makes pg_attribute.attcacheoff redundant.  A follow-on commit
will remove it.
---
 contrib/amcheck/verify_heapam.c             |   4 +-
 contrib/pageinspect/heapfuncs.c             |   4 +-
 contrib/postgres_fdw/postgres_fdw.c         |  12 +--
 src/backend/access/brin/brin_inclusion.c    |  18 ++--
 src/backend/access/brin/brin_tuple.c        |   2 +-
 src/backend/access/common/attmap.c          |  14 ++-
 src/backend/access/common/heaptuple.c       |  57 +++++------
 src/backend/access/common/indextuple.c      |  24 ++---
 src/backend/access/common/tupdesc.c         |  68 ++++++++++---
 src/backend/access/gin/ginbulk.c            |   6 +-
 src/backend/access/gin/ginget.c             |   8 +-
 src/backend/access/gist/gistbuild.c         |   6 +-
 src/backend/access/heap/heapam.c            |  10 +-
 src/backend/access/heap/heapam_handler.c    |   2 +-
 src/backend/access/heap/heaptoast.c         |   6 +-
 src/backend/access/nbtree/nbtutils.c        |   6 +-
 src/backend/access/spgist/spgdoinsert.c     |   2 +-
 src/backend/access/spgist/spgutils.c        |   4 +-
 src/backend/access/table/toast_helper.c     |   2 +-
 src/backend/catalog/index.c                 |   2 +
 src/backend/commands/copy.c                 |   6 +-
 src/backend/commands/tablecmds.c            |   4 +
 src/backend/executor/execExpr.c             |   8 +-
 src/backend/executor/execExprInterp.c       |   8 +-
 src/backend/executor/execJunk.c             |   2 +-
 src/backend/executor/execTuples.c           |  12 +--
 src/backend/executor/functions.c            |   3 +-
 src/backend/executor/nodeMemoize.c          |  12 +--
 src/backend/executor/nodeModifyTable.c      |   8 +-
 src/backend/executor/nodeValuesscan.c       |   4 +-
 src/backend/executor/tstoreReceiver.c       |   8 +-
 src/backend/jit/llvm/llvmjit_deform.c       |  19 ++--
 src/backend/optimizer/util/plancat.c        |   8 +-
 src/backend/replication/pgoutput/pgoutput.c |   2 +-
 src/backend/utils/adt/expandedrecord.c      |  22 ++---
 src/backend/utils/adt/ri_triggers.c         |   4 +-
 src/backend/utils/cache/relcache.c          |  21 ++--
 src/include/access/htup_details.h           |   4 +-
 src/include/access/itup.h                   |  11 ++-
 src/include/access/tupdesc.h                | 102 +++++++++++++++++++-
 src/include/access/tupmacs.h                |   4 +-
 src/tools/pgindent/typedefs.list            |   1 +
 42 files changed, 351 insertions(+), 179 deletions(-)

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index f2526ed63a..08772de39f 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1567,11 +1567,11 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	struct varlena *attr;
 	char	   *tp;				/* pointer to the tuple data */
 	uint16		infomask;
-	Form_pg_attribute thisatt;
+	CompactAttribute *thisatt;
 	struct varatt_external toast_pointer;
 
 	infomask = ctx->tuphdr->t_infomask;
-	thisatt = TupleDescAttr(RelationGetDescr(ctx->rel), ctx->attnum);
+	thisatt = TupleDescCompactAttr(RelationGetDescr(ctx->rel), ctx->attnum);
 
 	tp = (char *) ctx->tuphdr + ctx->tuphdr->t_hoff;
 
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 3faeabc711..6234bb8729 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -331,11 +331,11 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 
 	for (i = 0; i < nattrs; i++)
 	{
-		Form_pg_attribute attr;
+		CompactAttribute *attr;
 		bool		is_null;
 		bytea	   *attr_data = NULL;
 
-		attr = TupleDescAttr(tupdesc, i);
+		attr = TupleDescCompactAttr(tupdesc, i);
 
 		/*
 		 * Tuple header can specify fewer attributes than tuple descriptor as
diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index adc62576d1..ca5052bdfb 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -1821,9 +1821,9 @@ postgresPlanForeignModify(PlannerInfo *root,
 
 		for (attnum = 1; attnum <= tupdesc->natts; attnum++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+			CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
 
-			if (!attr->attisdropped)
+			if (!CompactAttrIsDropped(attr))
 				targetAttrs = lappend_int(targetAttrs, attnum);
 		}
 	}
@@ -2194,9 +2194,9 @@ postgresBeginForeignInsert(ModifyTableState *mtstate,
 	/* We transmit all columns that are defined in the foreign table. */
 	for (attnum = 1; attnum <= tupdesc->natts; attnum++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
 
-		if (!attr->attisdropped)
+		if (!CompactAttrIsDropped(attr))
 			targetAttrs = lappend_int(targetAttrs, attnum);
 	}
 
@@ -4314,12 +4314,12 @@ convert_prep_stmt_params(PgFdwModifyState *fmstate,
 			foreach(lc, fmstate->target_attrs)
 			{
 				int			attnum = lfirst_int(lc);
-				Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+				CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
 				Datum		value;
 				bool		isnull;
 
 				/* Ignore generated columns; they are set to DEFAULT */
-				if (attr->attgenerated)
+				if (CompactAttrIsGenerated(attr))
 					continue;
 				value = slot_getattr(slots[i], attnum, &isnull);
 				if (isnull)
diff --git a/src/backend/access/brin/brin_inclusion.c b/src/backend/access/brin/brin_inclusion.c
index 750276998c..a6b88e5f4a 100644
--- a/src/backend/access/brin/brin_inclusion.c
+++ b/src/backend/access/brin/brin_inclusion.c
@@ -146,12 +146,12 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
 	Datum		result;
 	bool		new = false;
 	AttrNumber	attno;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 
 	Assert(!isnull);
 
 	attno = column->bv_attno;
-	attr = TupleDescAttr(bdesc->bd_tupdesc, attno - 1);
+	attr = TupleDescCompactAttr(bdesc->bd_tupdesc, attno - 1);
 
 	/*
 	 * If the recorded value is null, copy the new value (which we know to be
@@ -160,7 +160,7 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
 	if (column->bv_allnulls)
 	{
 		column->bv_values[INCLUSION_UNION] =
-			datumCopy(newval, attr->attbyval, attr->attlen);
+			datumCopy(newval, CompactAttrByVal(attr), attr->attlen);
 		column->bv_values[INCLUSION_UNMERGEABLE] = BoolGetDatum(false);
 		column->bv_values[INCLUSION_CONTAINS_EMPTY] = BoolGetDatum(false);
 		column->bv_allnulls = false;
@@ -225,13 +225,13 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
 	Assert(finfo != NULL);
 	result = FunctionCall2Coll(finfo, colloid,
 							   column->bv_values[INCLUSION_UNION], newval);
-	if (!attr->attbyval &&
+	if (!CompactAttrByVal(attr) &&
 		DatumGetPointer(result) != DatumGetPointer(column->bv_values[INCLUSION_UNION]))
 	{
 		pfree(DatumGetPointer(column->bv_values[INCLUSION_UNION]));
 
 		if (result == newval)
-			result = datumCopy(result, attr->attbyval, attr->attlen);
+			result = datumCopy(result, CompactAttrByVal(attr), attr->attlen);
 	}
 	column->bv_values[INCLUSION_UNION] = result;
 
@@ -479,7 +479,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	BrinValues *col_b = (BrinValues *) PG_GETARG_POINTER(2);
 	Oid			colloid = PG_GET_COLLATION();
 	AttrNumber	attno;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 	FmgrInfo   *finfo;
 	Datum		result;
 
@@ -487,7 +487,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	Assert(!col_a->bv_allnulls && !col_b->bv_allnulls);
 
 	attno = col_a->bv_attno;
-	attr = TupleDescAttr(bdesc->bd_tupdesc, attno - 1);
+	attr = TupleDescCompactAttr(bdesc->bd_tupdesc, attno - 1);
 
 	/* If B includes empty elements, mark A similarly, if needed. */
 	if (!DatumGetBool(col_a->bv_values[INCLUSION_CONTAINS_EMPTY]) &&
@@ -522,13 +522,13 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	result = FunctionCall2Coll(finfo, colloid,
 							   col_a->bv_values[INCLUSION_UNION],
 							   col_b->bv_values[INCLUSION_UNION]);
-	if (!attr->attbyval &&
+	if (!CompactAttrByVal(attr) &&
 		DatumGetPointer(result) != DatumGetPointer(col_a->bv_values[INCLUSION_UNION]))
 	{
 		pfree(DatumGetPointer(col_a->bv_values[INCLUSION_UNION]));
 
 		if (result == col_b->bv_values[INCLUSION_UNION])
-			result = datumCopy(result, attr->attbyval, attr->attlen);
+			result = datumCopy(result, CompactAttrByVal(attr), attr->attlen);
 	}
 	col_a->bv_values[INCLUSION_UNION] = result;
 
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index 997eb6d822..aae646be5d 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -699,7 +699,7 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
 			 datumno < brdesc->bd_info[attnum]->oi_nstored;
 			 datumno++)
 		{
-			Form_pg_attribute thisatt = TupleDescAttr(diskdsc, stored);
+			CompactAttribute *thisatt = TupleDescCompactAttr(diskdsc, stored);
 
 			if (thisatt->attlen == -1)
 			{
diff --git a/src/backend/access/common/attmap.c b/src/backend/access/common/attmap.c
index b0fe27ef57..e2d46843bc 100644
--- a/src/backend/access/common/attmap.c
+++ b/src/backend/access/common/attmap.c
@@ -135,7 +135,9 @@ build_attrmap_by_position(TupleDesc indesc,
 	/* Check for unused input columns */
 	for (; j < indesc->natts; j++)
 	{
-		if (TupleDescAttr(indesc, j)->attisdropped)
+		CompactAttribute *attr = TupleDescCompactAttr(indesc, j);
+
+		if (CompactAttrIsDropped(attr))
 			continue;
 		nincols++;
 		same = false;			/* we'll complain below */
@@ -299,25 +301,27 @@ check_attrmap_match(TupleDesc indesc,
 
 	for (i = 0; i < attrMap->maplen; i++)
 	{
-		Form_pg_attribute inatt = TupleDescAttr(indesc, i);
-		Form_pg_attribute outatt = TupleDescAttr(outdesc, i);
+		CompactAttribute *inatt = TupleDescCompactAttr(indesc, i);
+		CompactAttribute *outatt;
 
 		/*
 		 * If the input column has a missing attribute, we need a conversion.
 		 */
-		if (inatt->atthasmissing)
+		if (CompactAttrHasMissing(inatt))
 			return false;
 
 		if (attrMap->attnums[i] == (i + 1))
 			continue;
 
+		outatt = TupleDescCompactAttr(outdesc, i);
+
 		/*
 		 * If it's a dropped column and the corresponding input column is also
 		 * dropped, we don't need a conversion.  However, attlen and attalign
 		 * must agree.
 		 */
 		if (attrMap->attnums[i] == 0 &&
-			inatt->attisdropped &&
+			CompactAttrIsDropped(inatt) &&
 			inatt->attlen == outatt->attlen &&
 			inatt->attalign == outatt->attalign)
 			continue;
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 9e3407bf98..70595c55b7 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -83,6 +83,9 @@
 #define VARLENA_ATT_IS_PACKABLE(att) \
 	((att)->attstorage != TYPSTORAGE_PLAIN)
 
+#define COMPACT_ATTR_IS_PACKABLE(att) \
+	((att)->attlen == -1 && CompactAttrIsPackable(att))
+
 /*
  * Setup for caching pass-by-ref missing attributes in a way that survives
  * tupleDesc destruction.
@@ -147,14 +150,14 @@ Datum
 getmissingattr(TupleDesc tupleDesc,
 			   int attnum, bool *isnull)
 {
-	Form_pg_attribute att;
+	CompactAttribute *att;
 
 	Assert(attnum <= tupleDesc->natts);
 	Assert(attnum > 0);
 
-	att = TupleDescAttr(tupleDesc, attnum - 1);
+	att = TupleDescCompactAttr(tupleDesc, attnum - 1);
 
-	if (att->atthasmissing)
+	if (CompactAttrHasMissing(att))
 	{
 		AttrMissing *attrmiss;
 
@@ -173,7 +176,7 @@ getmissingattr(TupleDesc tupleDesc,
 			*isnull = false;
 
 			/* no  need to cache by-value attributes */
-			if (att->attbyval)
+			if (CompactAttrByVal(att))
 				return attrmiss->am_value;
 
 			/* set up cache if required */
@@ -223,15 +226,15 @@ heap_compute_data_size(TupleDesc tupleDesc,
 	for (i = 0; i < numberOfAttributes; i++)
 	{
 		Datum		val;
-		Form_pg_attribute atti;
+		CompactAttribute *atti;
 
 		if (isnull[i])
 			continue;
 
 		val = values[i];
-		atti = TupleDescAttr(tupleDesc, i);
+		atti = TupleDescCompactAttr(tupleDesc, i);
 
-		if (ATT_IS_PACKABLE(atti) &&
+		if (COMPACT_ATTR_IS_PACKABLE(atti) &&
 			VARATT_CAN_MAKE_SHORT(DatumGetPointer(val)))
 		{
 			/*
@@ -268,7 +271,7 @@ heap_compute_data_size(TupleDesc tupleDesc,
  * Fill in either a data value or a bit in the null bitmask
  */
 static inline void
-fill_val(Form_pg_attribute att,
+fill_val(CompactAttribute *att,
 		 bits8 **bit,
 		 int *bitmask,
 		 char **dataP,
@@ -307,7 +310,7 @@ fill_val(Form_pg_attribute att,
 	 * XXX we use the att_align macros on the pointer value itself, not on an
 	 * offset.  This is a bit of a hack.
 	 */
-	if (att->attbyval)
+	if (CompactAttrByVal(att))
 	{
 		/* pass-by-value */
 		data = (char *) att_align_nominal(data, att->attalign);
@@ -349,7 +352,7 @@ fill_val(Form_pg_attribute att,
 			data_length = VARSIZE_SHORT(val);
 			memcpy(data, val, data_length);
 		}
-		else if (VARLENA_ATT_IS_PACKABLE(att) &&
+		else if (CompactAttrIsPackable(att) &&
 				 VARATT_CAN_MAKE_SHORT(val))
 		{
 			/* convert to short varlena -- no alignment */
@@ -427,7 +430,7 @@ heap_fill_tuple(TupleDesc tupleDesc,
 
 	for (i = 0; i < numberOfAttributes; i++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupleDesc, i);
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, i);
 
 		fill_val(attr,
 				 bitP ? &bitP : NULL,
@@ -461,7 +464,8 @@ heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
 	Assert(!tupleDesc || attnum <= tupleDesc->natts);
 	if (attnum > (int) HeapTupleHeaderGetNatts(tup->t_data))
 	{
-		if (tupleDesc && TupleDescAttr(tupleDesc, attnum - 1)->atthasmissing)
+		if (tupleDesc &&
+			CompactAttrHasMissing(TupleDescCompactAttr(tupleDesc, attnum - 1)))
 			return false;
 		else
 			return true;
@@ -570,13 +574,13 @@ nocachegetattr(HeapTuple tup,
 
 	if (!slow)
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		/*
 		 * If we get here, there are no nulls up to and including the target
 		 * attribute.  If we have a cached offset, we can use it.
 		 */
-		att = TupleDescAttr(tupleDesc, attnum);
+		att = TupleDescCompactAttr(tupleDesc, attnum);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, tp + att->attcacheoff);
 
@@ -591,7 +595,7 @@ nocachegetattr(HeapTuple tup,
 
 			for (j = 0; j <= attnum; j++)
 			{
-				if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
+				if (TupleDescCompactAttr(tupleDesc, j)->attlen <= 0)
 				{
 					slow = true;
 					break;
@@ -614,18 +618,18 @@ nocachegetattr(HeapTuple tup,
 		 * fixed-width columns, in hope of avoiding future visits to this
 		 * routine.
 		 */
-		TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(tupleDesc, 0)->attcacheoff = 0;
 
 		/* we might have set some offsets in the slow path previously */
-		while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
+		while (j < natts && TupleDescCompactAttr(tupleDesc, j)->attcacheoff > 0)
 			j++;
 
-		off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
-			TupleDescAttr(tupleDesc, j - 1)->attlen;
+		off = TupleDescCompactAttr(tupleDesc, j - 1)->attcacheoff +
+			TupleDescCompactAttr(tupleDesc, j - 1)->attlen;
 
 		for (; j < natts; j++)
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, j);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, j);
 
 			if (att->attlen <= 0)
 				break;
@@ -639,7 +643,7 @@ nocachegetattr(HeapTuple tup,
 
 		Assert(j > attnum);
 
-		off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
+		off = TupleDescCompactAttr(tupleDesc, attnum)->attcacheoff;
 	}
 	else
 	{
@@ -659,7 +663,7 @@ nocachegetattr(HeapTuple tup,
 		off = 0;
 		for (i = 0;; i++)		/* loop exit is at "break" */
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, i);
 
 			if (HeapTupleHasNulls(tup) && att_isnull(i, bp))
 			{
@@ -707,7 +711,7 @@ nocachegetattr(HeapTuple tup,
 		}
 	}
 
-	return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
+	return fetchatt(TupleDescCompactAttr(tupleDesc, attnum), tp + off);
 }
 
 /* ----------------
@@ -892,7 +896,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 		{
 			if (attrmiss[attnum].am_present)
 			{
-				Form_pg_attribute att = TupleDescAttr(tupleDesc, attnum);
+				CompactAttribute *att = TupleDescCompactAttr(tupleDesc, attnum);
 
 				targetDataLen = att_align_datum(targetDataLen,
 												att->attalign,
@@ -1020,8 +1024,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 	/* Now fill in the missing values */
 	for (attnum = sourceNatts; attnum < natts; attnum++)
 	{
-
-		Form_pg_attribute attr = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (attrmiss && attrmiss[attnum].am_present)
 		{
@@ -1370,7 +1373,7 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index 79ae29989d..37133ed7f8 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -303,13 +303,13 @@ nocache_index_getattr(IndexTuple tup,
 
 	if (!slow)
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		/*
 		 * If we get here, there are no nulls up to and including the target
 		 * attribute.  If we have a cached offset, we can use it.
 		 */
-		att = TupleDescAttr(tupleDesc, attnum);
+		att = TupleDescCompactAttr(tupleDesc, attnum);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, tp + att->attcacheoff);
 
@@ -324,7 +324,7 @@ nocache_index_getattr(IndexTuple tup,
 
 			for (j = 0; j <= attnum; j++)
 			{
-				if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
+				if (TupleDescCompactAttr(tupleDesc, j)->attlen <= 0)
 				{
 					slow = true;
 					break;
@@ -347,18 +347,18 @@ nocache_index_getattr(IndexTuple tup,
 		 * fixed-width columns, in hope of avoiding future visits to this
 		 * routine.
 		 */
-		TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(tupleDesc, 0)->attcacheoff = 0;
 
 		/* we might have set some offsets in the slow path previously */
-		while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
+		while (j < natts && TupleDescCompactAttr(tupleDesc, j)->attcacheoff > 0)
 			j++;
 
-		off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
-			TupleDescAttr(tupleDesc, j - 1)->attlen;
+		off = TupleDescCompactAttr(tupleDesc, j - 1)->attcacheoff +
+			TupleDescCompactAttr(tupleDesc, j - 1)->attlen;
 
 		for (; j < natts; j++)
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, j);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, j);
 
 			if (att->attlen <= 0)
 				break;
@@ -372,7 +372,7 @@ nocache_index_getattr(IndexTuple tup,
 
 		Assert(j > attnum);
 
-		off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
+		off = TupleDescCompactAttr(tupleDesc, attnum)->attcacheoff;
 	}
 	else
 	{
@@ -392,7 +392,7 @@ nocache_index_getattr(IndexTuple tup,
 		off = 0;
 		for (i = 0;; i++)		/* loop exit is at "break" */
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, i);
 
 			if (IndexTupleHasNulls(tup) && att_isnull(i, bp))
 			{
@@ -440,7 +440,7 @@ nocache_index_getattr(IndexTuple tup,
 		}
 	}
 
-	return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
+	return fetchatt(TupleDescCompactAttr(tupleDesc, attnum), tp + off);
 }
 
 /*
@@ -490,7 +490,7 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDescriptor, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDescriptor, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index fba0026520..65bb099634 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -56,6 +56,35 @@ ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
 	ResourceOwnerForget(owner, PointerGetDatum(tupdesc), &tupdesc_resowner_desc);
 }
 
+void
+populate_compact_attribute(TupleDesc tupdesc, int i)
+{
+	Form_pg_attribute src = TupleDescAttr(tupdesc, i);
+	CompactAttribute *dst = &tupdesc->compact_attrs[i];
+
+	memset(dst, 0, sizeof(CompactAttribute));
+
+	dst->attcacheoff = -1;
+	dst->attlen = src->attlen;
+
+	dst->attflags = 0;
+
+	if (src->attbyval)
+		dst->attflags |= COMPACT_ATTR_FLAG_BYVAL;
+	if (src->attstorage != TYPSTORAGE_PLAIN)
+		dst->attflags |= COMPACT_ATTR_FLAG_IS_PACKABLE;
+	if (src->atthasmissing)
+		dst->attflags |= COMPACT_ATTR_FLAG_HAS_MISSING;
+	if (src->attisdropped)
+		dst->attflags |= COMPACT_ATTR_FLAG_IS_DROPPED;
+	if (src->attgenerated)
+		dst->attflags |= COMPACT_ATTR_FLAG_IS_GENERATED;
+	if (src->attnotnull)
+		dst->attflags |= COMPACT_ATTR_FLAG_IS_NOTNULL;
+
+	dst->attalign = src->attalign;
+}
+
 /*
  * CreateTemplateTupleDesc
  *		This function allocates an empty tuple descriptor structure.
@@ -74,18 +103,20 @@ CreateTemplateTupleDesc(int natts)
 	Assert(natts >= 0);
 
 	/*
-	 * Allocate enough memory for the tuple descriptor, including the
-	 * attribute rows.
+	 * Allocate enough memory for the tuple descriptor, the CompactAttribute
+	 * array and also an array of the full FormData_pg_attribute data.  We
+	 * store a pointer to this in the 'attrs' field.
 	 *
-	 * Note: the attribute array stride is sizeof(FormData_pg_attribute),
-	 * since we declare the array elements as FormData_pg_attribute for
-	 * notational convenience.  However, we only guarantee that the first
+	 * Note: the 'attrs' array stride is sizeof(FormData_pg_attribute), since
+	 * we declare the array elements as FormData_pg_attribute for notational
+	 * convenience.  However, we only guarantee that the first
 	 * ATTRIBUTE_FIXED_PART_SIZE bytes of each entry are valid; most code that
 	 * copies tupdesc entries around copies just that much.  In principle that
 	 * could be less due to trailing padding, although with the current
 	 * definition of pg_attribute there probably isn't any padding.
 	 */
-	desc = (TupleDesc) palloc(MAXALIGN(sizeof(TupleDescData)) +
+	desc = (TupleDesc) palloc(offsetof(struct TupleDescData, compact_attrs) +
+							  natts * sizeof(CompactAttribute) +
 							  natts * sizeof(FormData_pg_attribute));
 
 	/*
@@ -118,8 +149,10 @@ CreateTupleDesc(int natts, Form_pg_attribute *attrs)
 	desc = CreateTemplateTupleDesc(natts);
 
 	for (i = 0; i < natts; ++i)
+	{
 		memcpy(TupleDescAttr(desc, i), attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
-
+		populate_compact_attribute(desc, i);
+	}
 	return desc;
 }
 
@@ -156,6 +189,8 @@ CreateTupleDescCopy(TupleDesc tupdesc)
 		att->atthasmissing = false;
 		att->attidentity = '\0';
 		att->attgenerated = '\0';
+
+		populate_compact_attribute(desc, i);
 	}
 
 	/* We can copy the tuple type identification, too */
@@ -184,6 +219,9 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
 		   TupleDescAttr(tupdesc, 0),
 		   desc->natts * sizeof(FormData_pg_attribute));
 
+	for (i = 0; i < desc->natts; i++)
+		populate_compact_attribute(desc, i);
+
 	/* Copy the TupleConstr data structure, if any */
 	if (constr)
 	{
@@ -208,10 +246,10 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
 			{
 				if (constr->missing[i].am_present)
 				{
-					Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+					CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 					cpy->missing[i].am_value = datumCopy(constr->missing[i].am_value,
-														 attr->attbyval,
+														 CompactAttrByVal(attr),
 														 attr->attlen);
 				}
 			}
@@ -275,6 +313,8 @@ TupleDescCopy(TupleDesc dst, TupleDesc src)
 		att->atthasmissing = false;
 		att->attidentity = '\0';
 		att->attgenerated = '\0';
+
+		populate_compact_attribute(dst, i);
 	}
 	dst->constr = NULL;
 
@@ -329,6 +369,8 @@ TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
 	dstAtt->atthasmissing = false;
 	dstAtt->attidentity = '\0';
 	dstAtt->attgenerated = '\0';
+
+	populate_compact_attribute(dst, dstAttno - 1);
 }
 
 /*
@@ -528,10 +570,10 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
 					return false;
 				if (missval1->am_present)
 				{
-					Form_pg_attribute missatt1 = TupleDescAttr(tupdesc1, i);
+					CompactAttribute *missatt1 = TupleDescCompactAttr(tupdesc1, i);
 
 					if (!datumIsEqual(missval1->am_value, missval2->am_value,
-									  missatt1->attbyval, missatt1->attlen))
+									  CompactAttrByVal(missatt1), missatt1->attlen))
 						return false;
 				}
 			}
@@ -721,6 +763,8 @@ TupleDescInitEntry(TupleDesc desc,
 	att->attcompression = InvalidCompressionMethod;
 	att->attcollation = typeForm->typcollation;
 
+	populate_compact_attribute(desc, attributeNumber - 1);
+
 	ReleaseSysCache(tuple);
 }
 
@@ -828,6 +872,8 @@ TupleDescInitBuiltinEntry(TupleDesc desc,
 		default:
 			elog(ERROR, "unsupported type %u", oidtypeid);
 	}
+
+	populate_compact_attribute(desc, attributeNumber - 1);
 }
 
 /*
diff --git a/src/backend/access/gin/ginbulk.c b/src/backend/access/gin/ginbulk.c
index 7f89cd5e82..91c83a3282 100644
--- a/src/backend/access/gin/ginbulk.c
+++ b/src/backend/access/gin/ginbulk.c
@@ -127,11 +127,11 @@ ginInitBA(BuildAccumulator *accum)
 static Datum
 getDatumCopy(BuildAccumulator *accum, OffsetNumber attnum, Datum value)
 {
-	Form_pg_attribute att;
+	CompactAttribute *att;
 	Datum		res;
 
-	att = TupleDescAttr(accum->ginstate->origTupdesc, attnum - 1);
-	if (att->attbyval)
+	att = TupleDescCompactAttr(accum->ginstate->origTupdesc, attnum - 1);
+	if (CompactAttrByVal(att))
 		res = value;
 	else
 	{
diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c
index 0b4f2ebadb..d394e4baeb 100644
--- a/src/backend/access/gin/ginget.c
+++ b/src/backend/access/gin/ginget.c
@@ -122,7 +122,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 				   GinScanEntry scanEntry, Snapshot snapshot)
 {
 	OffsetNumber attnum;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 
 	/* Initialize empty bitmap result */
 	scanEntry->matchBitmap = tbm_create(work_mem * 1024L, NULL);
@@ -134,7 +134,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 
 	/* Locate tupdesc entry for key column (for attbyval/attlen data) */
 	attnum = scanEntry->attnum;
-	attr = TupleDescAttr(btree->ginstate->origTupdesc, attnum - 1);
+	attr = TupleDescCompactAttr(btree->ginstate->origTupdesc, attnum - 1);
 
 	/*
 	 * Predicate lock entry leaf page, following pages will be locked by
@@ -232,7 +232,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 			 * tuple after re-locking
 			 */
 			if (icategory == GIN_CAT_NORM_KEY)
-				idatum = datumCopy(idatum, attr->attbyval, attr->attlen);
+				idatum = datumCopy(idatum, CompactAttrByVal(attr), attr->attlen);
 
 			LockBuffer(stack->buffer, GIN_UNLOCK);
 
@@ -291,7 +291,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 				stack->off++;
 			}
 
-			if (icategory == GIN_CAT_NORM_KEY && !attr->attbyval)
+			if (icategory == GIN_CAT_NORM_KEY && !CompactAttrByVal(attr))
 				pfree(DatumGetPointer(idatum));
 		}
 		else
diff --git a/src/backend/access/gist/gistbuild.c b/src/backend/access/gist/gistbuild.c
index ba06df30fa..86512f2c89 100644
--- a/src/backend/access/gist/gistbuild.c
+++ b/src/backend/access/gist/gistbuild.c
@@ -657,10 +657,12 @@ gistInitBuffering(GISTBuildState *buildstate)
 	itupMinSize = (Size) MAXALIGN(sizeof(IndexTupleData));
 	for (i = 0; i < index->rd_att->natts; i++)
 	{
-		if (TupleDescAttr(index->rd_att, i)->attlen < 0)
+		CompactAttribute *attr = TupleDescCompactAttr(index->rd_att, i);
+
+		if (attr->attlen < 0)
 			itupMinSize += VARHDRSZ;
 		else
-			itupMinSize += TupleDescAttr(index->rd_att, i)->attlen;
+			itupMinSize += attr->attlen;
 	}
 
 	/* Calculate average and maximal number of index tuples which fit to page */
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 91b20147a0..7cf06058f7 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -4080,8 +4080,6 @@ static bool
 heap_attr_equals(TupleDesc tupdesc, int attrnum, Datum value1, Datum value2,
 				 bool isnull1, bool isnull2)
 {
-	Form_pg_attribute att;
-
 	/*
 	 * If one value is NULL and other is not, then they are certainly not
 	 * equal
@@ -4111,9 +4109,11 @@ heap_attr_equals(TupleDesc tupdesc, int attrnum, Datum value1, Datum value2,
 	}
 	else
 	{
+		CompactAttribute *att;
+
 		Assert(attrnum <= tupdesc->natts);
-		att = TupleDescAttr(tupdesc, attrnum - 1);
-		return datumIsEqual(value1, value2, att->attbyval, att->attlen);
+		att = TupleDescCompactAttr(tupdesc, attrnum - 1);
+		return datumIsEqual(value1, value2, CompactAttrByVal(att), att->attlen);
 	}
 }
 
@@ -4194,7 +4194,7 @@ HeapDetermineColumnsInfo(Relation relation,
 		 * that system attributes can't be stored externally.
 		 */
 		if (attrnum < 0 || isnull1 ||
-			TupleDescAttr(tupdesc, attrnum - 1)->attlen != -1)
+			TupleDescCompactAttr(tupdesc, attrnum - 1)->attlen != -1)
 			continue;
 
 		/*
diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c
index 1c6da286d4..c584718060 100644
--- a/src/backend/access/heap/heapam_handler.c
+++ b/src/backend/access/heap/heapam_handler.c
@@ -2520,7 +2520,7 @@ reform_and_rewrite_tuple(HeapTuple tuple,
 	/* Be sure to null out any dropped columns */
 	for (i = 0; i < newTupDesc->natts; i++)
 	{
-		if (TupleDescAttr(newTupDesc, i)->attisdropped)
+		if (CompactAttrIsDropped(TupleDescCompactAttr(newTupDesc, i)))
 			isnull[i] = true;
 	}
 
diff --git a/src/backend/access/heap/heaptoast.c b/src/backend/access/heap/heaptoast.c
index a420e16530..c3a85d8d32 100644
--- a/src/backend/access/heap/heaptoast.c
+++ b/src/backend/access/heap/heaptoast.c
@@ -369,7 +369,7 @@ toast_flatten_tuple(HeapTuple tup, TupleDesc tupleDesc)
 		/*
 		 * Look at non-null varlena attributes
 		 */
-		if (!toast_isnull[i] && TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (!toast_isnull[i] && TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
@@ -483,7 +483,7 @@ toast_flatten_tuple_to_datum(HeapTupleHeader tup,
 		 */
 		if (toast_isnull[i])
 			has_nulls = true;
-		else if (TupleDescAttr(tupleDesc, i)->attlen == -1)
+		else if (TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
@@ -584,7 +584,7 @@ toast_build_flattened_tuple(TupleDesc tupleDesc,
 		/*
 		 * Look at non-null varlena attributes
 		 */
-		if (!isnull[i] && TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (!isnull[i] && TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c
index c22ccec789..e1428221c5 100644
--- a/src/backend/access/nbtree/nbtutils.c
+++ b/src/backend/access/nbtree/nbtutils.c
@@ -4874,17 +4874,17 @@ _bt_keep_natts_fast(Relation rel, IndexTuple lastleft, IndexTuple firstright)
 					datum2;
 		bool		isNull1,
 					isNull2;
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		datum1 = index_getattr(lastleft, attnum, itupdesc, &isNull1);
 		datum2 = index_getattr(firstright, attnum, itupdesc, &isNull2);
-		att = TupleDescAttr(itupdesc, attnum - 1);
+		att = TupleDescCompactAttr(itupdesc, attnum - 1);
 
 		if (isNull1 != isNull2)
 			break;
 
 		if (!isNull1 &&
-			!datum_image_eq(datum1, datum2, att->attbyval, att->attlen))
+			!datum_image_eq(datum1, datum2, CompactAttrByVal(att), att->attlen))
 			break;
 
 		keepnatts++;
diff --git a/src/backend/access/spgist/spgdoinsert.c b/src/backend/access/spgist/spgdoinsert.c
index a4995c168b..2cb7ce43ba 100644
--- a/src/backend/access/spgist/spgdoinsert.c
+++ b/src/backend/access/spgist/spgdoinsert.c
@@ -1974,7 +1974,7 @@ spgdoinsert(Relation index, SpGistState *state,
 	{
 		if (!isnulls[i])
 		{
-			if (TupleDescAttr(leafDescriptor, i)->attlen == -1)
+			if (TupleDescCompactAttr(leafDescriptor, i)->attlen == -1)
 				leafDatums[i] = PointerGetDatum(PG_DETOAST_DATUM(datums[i]));
 			else
 				leafDatums[i] = datums[i];
diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c
index 76b80146ff..9e46c017ab 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -330,7 +330,9 @@ getSpGistTupleDesc(Relation index, SpGistTypeDesc *keyType)
 		att->attcollation = InvalidOid;
 		/* In case we changed typlen, we'd better reset following offsets */
 		for (int i = spgFirstIncludeColumn; i < outTupDesc->natts; i++)
-			TupleDescAttr(outTupDesc, i)->attcacheoff = -1;
+			TupleDescCompactAttr(outTupDesc, i)->attcacheoff = -1;
+
+		populate_compact_attribute(outTupDesc, spgKeyColumn);
 	}
 	return outTupDesc;
 }
diff --git a/src/backend/access/table/toast_helper.c b/src/backend/access/table/toast_helper.c
index 53224932f0..b16fd21b8d 100644
--- a/src/backend/access/table/toast_helper.c
+++ b/src/backend/access/table/toast_helper.c
@@ -324,7 +324,7 @@ toast_delete_external(Relation rel, const Datum *values, const bool *isnull,
 
 	for (i = 0; i < numAttrs; i++)
 	{
-		if (TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			Datum		value = values[i];
 
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 33759056e3..bdcfa5d188 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -477,6 +477,8 @@ ConstructTupleDescriptor(Relation heapRelation,
 
 			ReleaseSysCache(tuple);
 		}
+
+		populate_compact_attribute(indexTupDesc, i);
 	}
 
 	pfree(amroutine);
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 3bb579a3a4..b270d79111 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -901,9 +901,9 @@ CopyGetAttnums(TupleDesc tupDesc, Relation rel, List *attnamelist)
 
 		for (i = 0; i < attr_count; i++)
 		{
-			if (TupleDescAttr(tupDesc, i)->attisdropped)
-				continue;
-			if (TupleDescAttr(tupDesc, i)->attgenerated)
+			CompactAttribute *attr = TupleDescCompactAttr(tupDesc, i);
+
+			if (CompactAttrIsDropped(attr) || CompactAttrIsGenerated(attr))
 				continue;
 			attnums = lappend_int(attnums, i + 1);
 		}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index b3cc6f8f69..c3fc71726e 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -940,6 +940,8 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
 			cookedDefaults = lappend(cookedDefaults, cooked);
 			attr->atthasdef = true;
 		}
+
+		populate_compact_attribute(descriptor, attnum - 1);
 	}
 
 	/*
@@ -1345,6 +1347,8 @@ BuildDescForRelation(const List *columns)
 			att->attstorage = entry->storage;
 		else if (entry->storage_name)
 			att->attstorage = GetAttributeStorage(att->atttypid, entry->storage_name);
+
+		populate_compact_attribute(desc, attnum - 1);
 	}
 
 	return desc;
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index 63289ee35e..26c1683e57 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -598,9 +598,9 @@ ExecBuildUpdateProjection(List *targetList,
 	 */
 	for (int attnum = relDesc->natts; attnum > 0; attnum--)
 	{
-		Form_pg_attribute attr = TupleDescAttr(relDesc, attnum - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(relDesc, attnum - 1);
 
-		if (attr->attisdropped)
+		if (CompactAttrIsDropped(attr))
 			continue;
 		if (bms_is_member(attnum, assignedCols))
 			continue;
@@ -694,9 +694,9 @@ ExecBuildUpdateProjection(List *targetList,
 	 */
 	for (int attnum = 1; attnum <= relDesc->natts; attnum++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(relDesc, attnum - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(relDesc, attnum - 1);
 
-		if (attr->attisdropped)
+		if (CompactAttrIsDropped(attr))
 		{
 			/* Put a null into the ExprState's resvalue/resnull ... */
 			scratch.opcode = EEOP_CONST;
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 77394e76c3..f4b1d956f5 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -2934,7 +2934,7 @@ ExecEvalRowNullInt(ExprState *state, ExprEvalStep *op,
 	for (int att = 1; att <= tupDesc->natts; att++)
 	{
 		/* ignore dropped columns */
-		if (TupleDescAttr(tupDesc, att - 1)->attisdropped)
+		if (CompactAttrIsDropped(TupleDescCompactAttr(tupDesc, att - 1)))
 			continue;
 		if (heap_attisnull(&tmptup, att, tupDesc))
 		{
@@ -5076,10 +5076,10 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
 
 		for (int i = 0; i < var_tupdesc->natts; i++)
 		{
-			Form_pg_attribute vattr = TupleDescAttr(var_tupdesc, i);
-			Form_pg_attribute sattr = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *vattr = TupleDescCompactAttr(var_tupdesc, i);
+			CompactAttribute *sattr = TupleDescCompactAttr(tupleDesc, i);
 
-			if (!vattr->attisdropped)
+			if (!CompactAttrIsDropped(vattr))
 				continue;		/* already checked non-dropped cols */
 			if (slot->tts_isnull[i])
 				continue;		/* null is always okay */
diff --git a/src/backend/executor/execJunk.c b/src/backend/executor/execJunk.c
index b962c31383..af6db46f5d 100644
--- a/src/backend/executor/execJunk.c
+++ b/src/backend/executor/execJunk.c
@@ -169,7 +169,7 @@ ExecInitJunkFilterConversion(List *targetList,
 		t = list_head(targetList);
 		for (i = 0; i < cleanLength; i++)
 		{
-			if (TupleDescAttr(cleanTupType, i)->attisdropped)
+			if (CompactAttrIsDropped(TupleDescCompactAttr(cleanTupType, i)))
 				continue;		/* map entry is already zero */
 			for (;;)
 			{
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 00dc339615..550b8e8f34 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -187,10 +187,10 @@ tts_virtual_materialize(TupleTableSlot *slot)
 	/* compute size of memory required */
 	for (int natt = 0; natt < desc->natts; natt++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, natt);
+		CompactAttribute *att = TupleDescCompactAttr(desc, natt);
 		Datum		val;
 
-		if (att->attbyval || slot->tts_isnull[natt])
+		if (CompactAttrByVal(att) || slot->tts_isnull[natt])
 			continue;
 
 		val = slot->tts_values[natt];
@@ -223,10 +223,10 @@ tts_virtual_materialize(TupleTableSlot *slot)
 	/* and copy all attributes into the pre-allocated space */
 	for (int natt = 0; natt < desc->natts; natt++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, natt);
+		CompactAttribute *att = TupleDescCompactAttr(desc, natt);
 		Datum		val;
 
-		if (att->attbyval || slot->tts_isnull[natt])
+		if (CompactAttrByVal(att) || slot->tts_isnull[natt])
 			continue;
 
 		val = slot->tts_values[natt];
@@ -1044,7 +1044,7 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 
 	for (; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
@@ -2237,7 +2237,7 @@ BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
 	 */
 	for (i = 0; i < natts; i++)
 	{
-		if (!TupleDescAttr(tupdesc, i)->attisdropped)
+		if (!CompactAttrIsDropped(TupleDescCompactAttr(tupdesc, i)))
 		{
 			/* Non-dropped attributes */
 			dvalues[i] = InputFunctionCall(&attinmeta->attinfuncs[i],
diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c
index 692854e2b3..5c393e1267 100644
--- a/src/backend/executor/functions.c
+++ b/src/backend/executor/functions.c
@@ -1886,7 +1886,8 @@ check_sql_fn_retval(List *queryTreeLists,
 		/* remaining columns in rettupdesc had better all be dropped */
 		for (colindex++; colindex <= tupnatts; colindex++)
 		{
-			if (!TupleDescAttr(rettupdesc, colindex - 1)->attisdropped)
+			if (!CompactAttrIsDropped(TupleDescCompactAttr(rettupdesc,
+														   colindex - 1)))
 				ereport(ERROR,
 						(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
 						 errmsg("return type mismatch in function declared to return %s",
diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c
index df8e3fff08..cdec311687 100644
--- a/src/backend/executor/nodeMemoize.c
+++ b/src/backend/executor/nodeMemoize.c
@@ -175,12 +175,12 @@ MemoizeHash_hash(struct memoize_hash *tb, const MemoizeKey *key)
 
 			if (!pslot->tts_isnull[i])	/* treat nulls as having hash key 0 */
 			{
-				Form_pg_attribute attr;
+				CompactAttribute *attr;
 				uint32		hkey;
 
-				attr = TupleDescAttr(pslot->tts_tupleDescriptor, i);
+				attr = TupleDescCompactAttr(pslot->tts_tupleDescriptor, i);
 
-				hkey = datum_image_hash(pslot->tts_values[i], attr->attbyval, attr->attlen);
+				hkey = datum_image_hash(pslot->tts_values[i], CompactAttrByVal(attr), attr->attlen);
 
 				hashkey ^= hkey;
 			}
@@ -242,7 +242,7 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
 
 		for (int i = 0; i < numkeys; i++)
 		{
-			Form_pg_attribute attr;
+			CompactAttribute *attr;
 
 			if (tslot->tts_isnull[i] != pslot->tts_isnull[i])
 			{
@@ -255,9 +255,9 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
 				continue;
 
 			/* perform binary comparison on the two datums */
-			attr = TupleDescAttr(tslot->tts_tupleDescriptor, i);
+			attr = TupleDescCompactAttr(tslot->tts_tupleDescriptor, i);
 			if (!datum_image_eq(tslot->tts_values[i], pslot->tts_values[i],
-								attr->attbyval, attr->attlen))
+								CompactAttrByVal(attr), attr->attlen))
 			{
 				match = false;
 				break;
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 8bf4c80d4a..e5931d9b75 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -496,14 +496,14 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
 
 	for (int i = 0; i < natts; i++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+		CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 		if (ri_GeneratedExprs[i])
 		{
 			Datum		val;
 			bool		isnull;
 
-			Assert(attr->attgenerated == ATTRIBUTE_GENERATED_STORED);
+			Assert(TupleDescAttr(tupdesc, i)->attgenerated == ATTRIBUTE_GENERATED_STORED);
 
 			econtext->ecxt_scantuple = slot;
 
@@ -514,7 +514,7 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
 			 * memory for a pass-by-reference Datum is located.
 			 */
 			if (!isnull)
-				val = datumCopy(val, attr->attbyval, attr->attlen);
+				val = datumCopy(val, CompactAttrByVal(attr), attr->attlen);
 
 			values[i] = val;
 			nulls[i] = isnull;
@@ -522,7 +522,7 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
 		else
 		{
 			if (!nulls[i])
-				values[i] = datumCopy(slot->tts_values[i], attr->attbyval, attr->attlen);
+				values[i] = datumCopy(slot->tts_values[i], CompactAttrByVal(attr), attr->attlen);
 		}
 	}
 
diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c
index 92948917a0..9838977f08 100644
--- a/src/backend/executor/nodeValuesscan.c
+++ b/src/backend/executor/nodeValuesscan.c
@@ -142,8 +142,8 @@ ValuesNext(ValuesScanState *node)
 		foreach(lc, exprstatelist)
 		{
 			ExprState  *estate = (ExprState *) lfirst(lc);
-			Form_pg_attribute attr = TupleDescAttr(slot->tts_tupleDescriptor,
-												   resind);
+			CompactAttribute *attr = TupleDescCompactAttr(slot->tts_tupleDescriptor,
+														  resind);
 
 			values[resind] = ExecEvalExpr(estate,
 										  econtext,
diff --git a/src/backend/executor/tstoreReceiver.c b/src/backend/executor/tstoreReceiver.c
index de4646b5c2..39aa472d1c 100644
--- a/src/backend/executor/tstoreReceiver.c
+++ b/src/backend/executor/tstoreReceiver.c
@@ -65,9 +65,9 @@ tstoreStartupReceiver(DestReceiver *self, int operation, TupleDesc typeinfo)
 	{
 		for (i = 0; i < natts; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(typeinfo, i);
+			CompactAttribute *attr = TupleDescCompactAttr(typeinfo, i);
 
-			if (attr->attisdropped)
+			if (CompactAttrIsDropped(attr))
 				continue;
 			if (attr->attlen == -1)
 			{
@@ -154,9 +154,9 @@ tstoreReceiveSlot_detoast(TupleTableSlot *slot, DestReceiver *self)
 	for (i = 0; i < natts; i++)
 	{
 		Datum		val = slot->tts_values[i];
-		Form_pg_attribute attr = TupleDescAttr(typeinfo, i);
+		CompactAttribute *attr = TupleDescCompactAttr(typeinfo, i);
 
-		if (!attr->attisdropped && attr->attlen == -1 && !slot->tts_isnull[i])
+		if (!CompactAttrIsDropped(attr) && attr->attlen == -1 && !slot->tts_isnull[i])
 		{
 			if (VARATT_IS_EXTERNAL(DatumGetPointer(val)))
 			{
diff --git a/src/backend/jit/llvm/llvmjit_deform.c b/src/backend/jit/llvm/llvmjit_deform.c
index b07f8e7f75..22a23e50f4 100644
--- a/src/backend/jit/llvm/llvmjit_deform.c
+++ b/src/backend/jit/llvm/llvmjit_deform.c
@@ -110,7 +110,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 	 */
 	for (attnum = 0; attnum < desc->natts; attnum++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, attnum);
+		CompactAttribute *att = TupleDescCompactAttr(desc, attnum);
 
 		/*
 		 * If the column is declared NOT NULL then it must be present in every
@@ -123,9 +123,8 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 		 * combination of attisdropped && attnotnull combination shouldn't
 		 * exist.
 		 */
-		if (att->attnotnull &&
-			!att->atthasmissing &&
-			!att->attisdropped)
+		if (CompactAttrIsNotNull(att) && !CompactAttrHasMissing(att) &&
+			!CompactAttrIsDropped(att))
 			guaranteed_column_number = attnum;
 	}
 
@@ -393,7 +392,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 	 */
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, attnum);
+		CompactAttribute *att = TupleDescCompactAttr(desc, attnum);
 		LLVMValueRef v_incby;
 		int			alignto;
 		LLVMValueRef l_attno = l_int16_const(lc, attnum);
@@ -438,7 +437,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 		 * into account, because if they're present the heaptuple's natts
 		 * would have indicated that a slot_getmissingattrs() is needed.
 		 */
-		if (!att->attnotnull)
+		if (!CompactAttrIsNotNull(att))
 		{
 			LLVMBasicBlockRef b_ifnotnull;
 			LLVMBasicBlockRef b_ifnull;
@@ -619,7 +618,8 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 			known_alignment = -1;
 			attguaranteedalign = false;
 		}
-		else if (att->attnotnull && attguaranteedalign && known_alignment >= 0)
+		else if (CompactAttrIsNotNull(att) && attguaranteedalign &&
+				 known_alignment >= 0)
 		{
 			/*
 			 * If the offset to the column was previously known, a NOT NULL &
@@ -629,7 +629,8 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 			Assert(att->attlen > 0);
 			known_alignment += att->attlen;
 		}
-		else if (att->attnotnull && (att->attlen % alignto) == 0)
+		else if (CompactAttrIsNotNull(att) &&
+				 (att->attlen % alignto) == 0)
 		{
 			/*
 			 * After a NOT NULL fixed-width column with a length that is a
@@ -667,7 +668,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 		 * Store datum. For byval: datums copy the value, extend to Datum's
 		 * width, and store. For byref types: store pointer to data.
 		 */
-		if (att->attbyval)
+		if (CompactAttrByVal(att))
 		{
 			LLVMValueRef v_tmp_loaddata;
 			LLVMTypeRef vartype = LLVMIntTypeInContext(lc, att->attlen * 8);
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index 78a3cfafde..f25da68e4d 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -175,19 +175,19 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
 	{
 		for (int i = 0; i < relation->rd_att->natts; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i);
+			CompactAttribute *attr = TupleDescCompactAttr(relation->rd_att, i);
 
-			if (attr->attnotnull)
+			if (CompactAttrIsNotNull(attr))
 			{
 				rel->notnullattnums = bms_add_member(rel->notnullattnums,
-													 attr->attnum);
+													 i + 1);
 
 				/*
 				 * Per RemoveAttributeById(), dropped columns will have their
 				 * attnotnull unset, so we needn't check for dropped columns
 				 * in the above condition.
 				 */
-				Assert(!attr->attisdropped);
+				Assert(!CompactAttrIsDropped(attr));
 			}
 		}
 	}
diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c
index 00e7024563..5710d392fd 100644
--- a/src/backend/replication/pgoutput/pgoutput.c
+++ b/src/backend/replication/pgoutput/pgoutput.c
@@ -1305,7 +1305,7 @@ pgoutput_row_filter(Relation relation, TupleTableSlot *old_slot,
 	 */
 	for (i = 0; i < desc->natts; i++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, i);
+		CompactAttribute *att = TupleDescCompactAttr(desc, i);
 
 		/*
 		 * if the column in the new tuple or old tuple is null, nothing to do
diff --git a/src/backend/utils/adt/expandedrecord.c b/src/backend/utils/adt/expandedrecord.c
index 7e85ae3825..970a45c896 100644
--- a/src/backend/utils/adt/expandedrecord.c
+++ b/src/backend/utils/adt/expandedrecord.c
@@ -699,10 +699,10 @@ ER_get_flat_size(ExpandedObjectHeader *eohptr)
 	{
 		for (i = 0; i < erh->nfields; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+			CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 			if (!erh->dnulls[i] &&
-				!attr->attbyval && attr->attlen == -1 &&
+				!CompactAttrByVal(attr) && attr->attlen == -1 &&
 				VARATT_IS_EXTERNAL(DatumGetPointer(erh->dvalues[i])))
 			{
 				/*
@@ -1115,7 +1115,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 								   bool check_constraints)
 {
 	TupleDesc	tupdesc;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 	Datum	   *dvalues;
 	bool	   *dnulls;
 	char	   *oldValue;
@@ -1146,8 +1146,8 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 	 * Copy new field value into record's context, and deal with detoasting,
 	 * if needed.
 	 */
-	attr = TupleDescAttr(tupdesc, fnumber - 1);
-	if (!isnull && !attr->attbyval)
+	attr = TupleDescCompactAttr(tupdesc, fnumber - 1);
+	if (!isnull && !CompactAttrByVal(attr))
 	{
 		MemoryContext oldcxt;
 
@@ -1201,7 +1201,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 	erh->flat_size = 0;
 
 	/* Grab old field value for pfree'ing, if needed. */
-	if (!attr->attbyval && !dnulls[fnumber - 1])
+	if (!CompactAttrByVal(attr) && !dnulls[fnumber - 1])
 		oldValue = (char *) DatumGetPointer(dvalues[fnumber - 1]);
 	else
 		oldValue = NULL;
@@ -1279,18 +1279,18 @@ expanded_record_set_fields(ExpandedRecordHeader *erh,
 
 	for (fnumber = 0; fnumber < erh->nfields; fnumber++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, fnumber);
+		CompactAttribute *attr = TupleDescCompactAttr(tupdesc, fnumber);
 		Datum		newValue;
 		bool		isnull;
 
 		/* Ignore dropped columns */
-		if (attr->attisdropped)
+		if (CompactAttrIsDropped(attr))
 			continue;
 
 		newValue = newValues[fnumber];
 		isnull = isnulls[fnumber];
 
-		if (!attr->attbyval)
+		if (!CompactAttrByVal(attr))
 		{
 			/*
 			 * Copy new field value into record's context, and deal with
@@ -1541,9 +1541,9 @@ check_domain_for_new_field(ExpandedRecordHeader *erh, int fnumber,
 	 */
 	if (!isnull)
 	{
-		Form_pg_attribute attr = TupleDescAttr(erh->er_tupdesc, fnumber - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(erh->er_tupdesc, fnumber - 1);
 
-		if (!attr->attbyval && attr->attlen == -1 &&
+		if (!CompactAttrByVal(attr) && attr->attlen == -1 &&
 			VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
 			dummy_erh->flags |= ER_FLAG_HAVE_EXTERNAL;
 	}
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 62601a6d80..550af1befb 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -2833,9 +2833,9 @@ ri_KeysEqual(Relation rel, TupleTableSlot *oldslot, TupleTableSlot *newslot,
 			 * difference for ON UPDATE CASCADE, but for consistency we treat
 			 * all changes to the PK the same.
 			 */
-			Form_pg_attribute att = TupleDescAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
+			CompactAttribute *att = TupleDescCompactAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
 
-			if (!datum_image_eq(oldvalue, newvalue, att->attbyval, att->attlen))
+			if (!datum_image_eq(oldvalue, newvalue, CompactAttrByVal(att), att->attlen))
 				return false;
 		}
 		else
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 63efc55f09..a16aaa777c 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -584,6 +584,8 @@ RelationBuildTupleDesc(Relation relation)
 			   attp,
 			   ATTRIBUTE_FIXED_PART_SIZE);
 
+		populate_compact_attribute(relation->rd_att, attnum - 1);
+
 		/* Update constraint/default info */
 		if (attp->attnotnull)
 			constr->has_not_null = true;
@@ -673,12 +675,12 @@ RelationBuildTupleDesc(Relation relation)
 #endif
 
 	/*
-	 * However, we can easily set the attcacheoff value for the first
-	 * attribute: it must be zero.  This eliminates the need for special cases
-	 * for attnum=1 that used to exist in fastgetattr() and index_getattr().
+	 * We can easily set the attcacheoff value for the first attribute: it
+	 * must be zero.  This eliminates the need for special cases for attnum=1
+	 * that used to exist in fastgetattr() and index_getattr().
 	 */
 	if (RelationGetNumberOfAttributes(relation) > 0)
-		TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(relation->rd_att, 0)->attcacheoff = 0;
 
 	/*
 	 * Set up constraint/default info
@@ -1965,10 +1967,12 @@ formrdesc(const char *relationName, Oid relationReltype,
 		has_not_null |= attrs[i].attnotnull;
 		/* make sure attcacheoff is valid */
 		TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
+
+		populate_compact_attribute(relation->rd_att, i);
 	}
 
 	/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
-	TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
+	TupleDescCompactAttr(relation->rd_att, 0)->attcacheoff = 0;
 
 	/* mark not-null status */
 	if (has_not_null)
@@ -3623,6 +3627,7 @@ RelationBuildLocalRelation(const char *relname,
 		datt->attgenerated = satt->attgenerated;
 		datt->attnotnull = satt->attnotnull;
 		has_not_null |= satt->attnotnull;
+		populate_compact_attribute(rel->rd_att, i);
 	}
 
 	if (has_not_null)
@@ -4434,10 +4439,12 @@ BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs)
 		memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
 		/* make sure attcacheoff is valid */
 		TupleDescAttr(result, i)->attcacheoff = -1;
+
+		populate_compact_attribute(result, i);
 	}
 
 	/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
-	TupleDescAttr(result, 0)->attcacheoff = 0;
+	TupleDescCompactAttr(result, 0)->attcacheoff = 0;
 
 	/* Note: we don't bother to set up a TupleConstr entry */
 
@@ -6172,6 +6179,8 @@ load_relcache_init_file(bool shared)
 				goto read_failed;
 
 			has_not_null |= attr->attnotnull;
+
+			populate_compact_attribute(rel->rd_att, i);
 		}
 
 		/* next read the access method specific field */
diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h
index 5e38ef8696..0d1adff540 100644
--- a/src/include/access/htup_details.h
+++ b/src/include/access/htup_details.h
@@ -758,9 +758,9 @@ fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 	*isnull = false;
 	if (HeapTupleNoNulls(tup))
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
-		att = TupleDescAttr(tupleDesc, attnum - 1);
+		att = TupleDescCompactAttr(tupleDesc, attnum - 1);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, (char *) tup->t_data + tup->t_data->t_hoff +
 							att->attcacheoff);
diff --git a/src/include/access/itup.h b/src/include/access/itup.h
index 94885751e5..74461c6073 100644
--- a/src/include/access/itup.h
+++ b/src/include/access/itup.h
@@ -117,6 +117,7 @@ IndexInfoFindDataOffset(unsigned short t_info)
 static inline Datum
 index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 {
+
 	Assert(PointerIsValid(isnull));
 	Assert(attnum > 0);
 
@@ -124,11 +125,13 @@ index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 
 	if (!IndexTupleHasNulls(tup))
 	{
-		if (TupleDescAttr(tupleDesc, attnum - 1)->attcacheoff >= 0)
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, attnum - 1);
+
+		if (attr->attcacheoff >= 0)
 		{
-			return fetchatt(TupleDescAttr(tupleDesc, attnum - 1),
-							(char *) tup + IndexInfoFindDataOffset(tup->t_info)
-							+ TupleDescAttr(tupleDesc, attnum - 1)->attcacheoff);
+			return fetchatt(attr,
+							(char *) tup + IndexInfoFindDataOffset(tup->t_info) +
+							attr->attcacheoff);
 		}
 		else
 			return nocache_index_getattr(tup, attnum, tupleDesc);
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 2c435cdcb2..478ebbe1f4 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -45,6 +45,46 @@ typedef struct TupleConstr
 	bool		has_generated_stored;
 } TupleConstr;
 
+/*
+ * CompactAttribute
+ *		Cut-down version of FormData_pg_attribute for faster access for tasks
+ *		such as tuple deformation.
+ */
+typedef struct CompactAttribute
+{
+	int32		attcacheoff;	/* fixed offset into tuple, if known, or -1 */
+	int16		attlen;			/* attr len in bytes or -1 = varlen, -2 =
+								 * cstring */
+	uint8		attflags;		/* bit flags for compact storage of bool
+								 * fields */
+	char		attalign;		/* alignment requirement */
+} CompactAttribute;
+
+#define COMPACT_ATTR_FLAG_BYVAL (1 << 0)
+#define COMPACT_ATTR_FLAG_IS_PACKABLE (1 << 1)
+#define COMPACT_ATTR_FLAG_HAS_MISSING (1 << 2)
+#define COMPACT_ATTR_FLAG_IS_DROPPED (1 << 3)
+#define COMPACT_ATTR_FLAG_IS_GENERATED (1 << 4)
+#define COMPACT_ATTR_FLAG_IS_NOTNULL (1 << 5)
+
+#define CompactAttrByVal(att) \
+	(((att)->attflags & COMPACT_ATTR_FLAG_BYVAL) != 0)
+
+#define CompactAttrIsPackable(att) \
+	(((att)->attflags & COMPACT_ATTR_FLAG_IS_PACKABLE) != 0)
+
+#define CompactAttrHasMissing(att) \
+	(((att)->attflags & COMPACT_ATTR_FLAG_HAS_MISSING) != 0)
+
+#define CompactAttrIsDropped(att) \
+	(((att)->attflags & COMPACT_ATTR_FLAG_IS_DROPPED) != 0)
+
+#define CompactAttrIsGenerated(att) \
+	(((att)->attflags & COMPACT_ATTR_FLAG_IS_GENERATED) != 0)
+
+#define CompactAttrIsNotNull(att) \
+	(((att)->attflags & COMPACT_ATTR_FLAG_IS_NOTNULL) != 0)
+
 /*
  * This struct is passed around within the backend to describe the structure
  * of tuples.  For tuples coming from on-disk relations, the information is
@@ -75,6 +115,18 @@ typedef struct TupleConstr
  * context and go away when the context is freed.  We set the tdrefcount
  * field of such a descriptor to -1, while reference-counted descriptors
  * always have tdrefcount >= 0.
+ *
+ * The attrs field stores the fixed-sized portion of FormData_pg_attribute.
+ * Because that struct is large, we also store a corresponding
+ * CompactAttribute for each attribute in compact_attrs.  This is stored
+ * inline with the struct.  Because CompactAttribute is significantly smaller
+ * than FormData_pg_attribute, code, especially performance-critical code
+ * should prioritize using the fields from the CompactAttribute over the
+ * equivalent fields in FormData_pg_attribute whenever possible.
+ *
+ * Any code making changes manually to the fields in 'attrs' must subsequently
+ * call populate_compact_attribute() to flush the changes out to the
+ * corresponding 'compact_attrs' element.
  */
 typedef struct TupleDescData
 {
@@ -85,12 +137,52 @@ typedef struct TupleDescData
 	TupleConstr *constr;		/* constraints, or NULL if none */
 	/* attrs[N] is the description of Attribute Number N+1 */
 	FormData_pg_attribute *attrs;
+	CompactAttribute compact_attrs[FLEXIBLE_ARRAY_MEMBER];
 }			TupleDescData;
 typedef struct TupleDescData *TupleDesc;
 
-/* Accessor for the i'th attribute of tupdesc. */
+extern void populate_compact_attribute(TupleDesc tupdesc, int i);
+
+/* Accessor for the i'th FormData_pg_attribute of tupdesc. */
 #define TupleDescAttr(tupdesc, i) (&(tupdesc)->attrs[(i)])
 
+#ifdef USE_ASSERT_CHECKING
+
+/*
+ * Accessor for the i'th CompactAttribute of tupdesc.  In Assert enabled
+ * builds we verify that the CompactAttribute is populated correctly.
+ * This helps find bugs in places such as ALTER TABLE where code makes changes
+ * to the FormData_pg_attribute but forgets to call populate_compact_attribute
+ */
+static inline CompactAttribute *
+TupleDescCompactAttr(TupleDesc tupdesc, int i)
+{
+	CompactAttribute snapshot;
+	CompactAttribute *cattr = &tupdesc->compact_attrs[i];
+
+	/*
+	 * Take a snapshot of how the CompactAttribute is now before calling
+	 * populate_compact_attribute to make it up-to-date with the
+	 * FormData_pg_attribute.
+	 */
+	memcpy(&snapshot, cattr, sizeof(CompactAttribute));
+
+	populate_compact_attribute(tupdesc, i);
+
+	/* reset attcacheoff back to what it was */
+	cattr->attcacheoff = snapshot.attcacheoff;
+
+	/* Ensure the snapshot matches the freshly populated CompactAttribute */
+	Assert(memcmp(&snapshot, cattr, sizeof(CompactAttribute)) == 0);
+
+	return cattr;
+}
+
+#else
+/* Accessor for the i'th CompactAttribute of tupdesc */
+#define TupleDescCompactAttr(tupdesc, i) (&(tupdesc)->compact_attrs[(i)])
+#endif
+
 extern TupleDesc CreateTemplateTupleDesc(int natts);
 
 extern TupleDesc CreateTupleDesc(int natts, Form_pg_attribute *attrs);
@@ -99,13 +191,15 @@ extern TupleDesc CreateTupleDescCopy(TupleDesc tupdesc);
 
 extern TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc);
 
-#define TupleDescSize(src) MAXALIGN(sizeof(TupleDescData))
+#define TupleDescSize(src) \
+	(offsetof(struct TupleDescData, compact_attrs) + \
+	 (src)->natts * sizeof(CompactAttribute))
 
 #define TupleDescFullSize(src) \
-	(MAXALIGN(sizeof(TupleDescData)) + sizeof(FormData_pg_attribute) * (src)->natts)
+	(TupleDescSize(src) + sizeof(FormData_pg_attribute) * (src)->natts)
 
 #define TupleDescAttrAddress(desc) \
-	(Form_pg_attribute) ((char *) (desc) + MAXALIGN(sizeof(TupleDescData)))
+	(Form_pg_attribute) ((char *) (desc) + TupleDescSize(desc))
 
 extern void TupleDescCopy(TupleDesc dst, TupleDesc src);
 
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index 58b3a58cfd..9078d03231 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -30,7 +30,7 @@ att_isnull(int ATT, const bits8 *BITS)
 
 #ifndef FRONTEND
 /*
- * Given a Form_pg_attribute and a pointer into a tuple's data area,
+ * Given a CompactAttribute pointer and a pointer into a tuple's data area,
  * return the correct value or pointer.
  *
  * We return a Datum value in all cases.  If the attribute has "byval" false,
@@ -43,7 +43,7 @@ att_isnull(int ATT, const bits8 *BITS)
  *
  * Note that T must already be properly aligned for this to work correctly.
  */
-#define fetchatt(A,T) fetch_att(T, (A)->attbyval, (A)->attlen)
+#define fetchatt(A, T) fetch_att(T, CompactAttrByVal(A), (A)->attlen)
 
 /*
  * Same, but work from byval/len parameters rather than Form_pg_attribute.
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index 9e951a9e6f..bd27688a24 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -453,6 +453,7 @@ CommitTimestampEntry
 CommitTimestampShared
 CommonEntry
 CommonTableExpr
+CompactAttribute
 CompareScalarsContext
 CompiledExprState
 CompositeIOData
-- 
2.43.0

v3-0003-Optimize-alignment-calculations-in-tuple-form-def.patchapplication/octet-stream; name=v3-0003-Optimize-alignment-calculations-in-tuple-form-def.patchDownload
From c75d072b8bc43ba4f9b7fbe2f99b65edc7421a15 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Wed, 29 May 2024 12:19:03 +1200
Subject: [PATCH v3 3/5] Optimize alignment calculations in tuple form/deform

This converts CompactAttribute.attalign from a char which is directly
derived from pg_attribute.attalign into a uint8 which specifies the
number of bytes to align the column by.  Also, rename the field to
attalignby to make the distinction more clear in code.

This removes the complexity of checking each char value and transforming
that into the appropriate alignment call.  This can just be a simple
TYPEALIGN passing in the number of bytes.
---
 contrib/amcheck/verify_heapam.c        |  6 +--
 contrib/pageinspect/heapfuncs.c        |  6 +--
 src/backend/access/brin/brin_tuple.c   |  8 ++--
 src/backend/access/common/attmap.c     |  2 +-
 src/backend/access/common/heaptuple.c  | 52 +++++++++++++-------------
 src/backend/access/common/indextuple.c | 22 +++++------
 src/backend/access/common/tupdesc.c    | 20 +++++++++-
 src/backend/executor/execExprInterp.c  |  2 +-
 src/backend/executor/execTuples.c      | 19 +++++-----
 src/backend/jit/llvm/llvmjit_deform.c  | 17 +--------
 src/include/access/tupdesc.h           |  2 +-
 src/include/access/tupmacs.h           | 23 ++++++++++++
 12 files changed, 101 insertions(+), 78 deletions(-)

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index 08772de39f..b66eb178b9 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1592,7 +1592,7 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	/* Skip non-varlena values, but update offset first */
 	if (thisatt->attlen != -1)
 	{
-		ctx->offset = att_align_nominal(ctx->offset, thisatt->attalign);
+		ctx->offset = att_nominal_alignby(ctx->offset, thisatt->attalignby);
 		ctx->offset = att_addlength_pointer(ctx->offset, thisatt->attlen,
 											tp + ctx->offset);
 		if (ctx->tuphdr->t_hoff + ctx->offset > ctx->lp_len)
@@ -1608,8 +1608,8 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	}
 
 	/* Ok, we're looking at a varlena attribute. */
-	ctx->offset = att_align_pointer(ctx->offset, thisatt->attalign, -1,
-									tp + ctx->offset);
+	ctx->offset = att_pointer_alignby(ctx->offset, thisatt->attalignby, -1,
+									  tp + ctx->offset);
 
 	/* Get the (possibly corrupt) varlena datum */
 	attdatum = fetchatt(thisatt, tp + ctx->offset);
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 6234bb8729..54ecea28e1 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -354,8 +354,8 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 
 			if (attr->attlen == -1)
 			{
-				off = att_align_pointer(off, attr->attalign, -1,
-										tupdata + off);
+				off = att_pointer_alignby(off, attr->attalignby, -1,
+										  tupdata + off);
 
 				/*
 				 * As VARSIZE_ANY throws an exception if it can't properly
@@ -373,7 +373,7 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 			}
 			else
 			{
-				off = att_align_nominal(off, attr->attalign);
+				off = att_nominal_alignby(off, attr->attalignby);
 				len = attr->attlen;
 			}
 
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index aae646be5d..e65c1efff4 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -703,13 +703,13 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
 
 			if (thisatt->attlen == -1)
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, thisatt->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, thisatt->attalignby);
 			}
 
 			values[stored++] = fetchatt(thisatt, tp + off);
diff --git a/src/backend/access/common/attmap.c b/src/backend/access/common/attmap.c
index e2d46843bc..676ef9d85f 100644
--- a/src/backend/access/common/attmap.c
+++ b/src/backend/access/common/attmap.c
@@ -323,7 +323,7 @@ check_attrmap_match(TupleDesc indesc,
 		if (attrMap->attnums[i] == 0 &&
 			CompactAttrIsDropped(inatt) &&
 			inatt->attlen == outatt->attlen &&
-			inatt->attalign == outatt->attalign)
+			inatt->attalignby == outatt->attalignby)
 			continue;
 
 		return false;
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 70595c55b7..91aa407b31 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -250,13 +250,13 @@ heap_compute_data_size(TupleDesc tupleDesc,
 			 * we want to flatten the expanded value so that the constructed
 			 * tuple doesn't depend on it
 			 */
-			data_length = att_align_nominal(data_length, atti->attalign);
+			data_length = att_nominal_alignby(data_length, atti->attalignby);
 			data_length += EOH_get_flat_size(DatumGetEOHP(val));
 		}
 		else
 		{
-			data_length = att_align_datum(data_length, atti->attalign,
-										  atti->attlen, val);
+			data_length = att_datum_alignby(data_length, atti->attalignby,
+											atti->attlen, val);
 			data_length = att_addlength_datum(data_length, atti->attlen,
 											  val);
 		}
@@ -307,13 +307,13 @@ fill_val(CompactAttribute *att,
 	}
 
 	/*
-	 * XXX we use the att_align macros on the pointer value itself, not on an
-	 * offset.  This is a bit of a hack.
+	 * XXX we use the att_nominal_alignby macro on the pointer value itself,
+	 * not on an offset.  This is a bit of a hack.
 	 */
 	if (CompactAttrByVal(att))
 	{
 		/* pass-by-value */
-		data = (char *) att_align_nominal(data, att->attalign);
+		data = (char *) att_nominal_alignby(data, att->attalignby);
 		store_att_byval(data, datum, att->attlen);
 		data_length = att->attlen;
 	}
@@ -333,8 +333,7 @@ fill_val(CompactAttribute *att,
 				 */
 				ExpandedObjectHeader *eoh = DatumGetEOHP(datum);
 
-				data = (char *) att_align_nominal(data,
-												  att->attalign);
+				data = (char *) att_nominal_alignby(data, att->attalignby);
 				data_length = EOH_get_flat_size(eoh);
 				EOH_flatten_into(eoh, data, data_length);
 			}
@@ -363,8 +362,7 @@ fill_val(CompactAttribute *att,
 		else
 		{
 			/* full 4-byte header varlena */
-			data = (char *) att_align_nominal(data,
-											  att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = VARSIZE(val);
 			memcpy(data, val, data_length);
 		}
@@ -373,14 +371,14 @@ fill_val(CompactAttribute *att,
 	{
 		/* cstring ... never needs alignment */
 		*infomask |= HEAP_HASVARWIDTH;
-		Assert(att->attalign == TYPALIGN_CHAR);
+		Assert(att->attalignby == sizeof(char));
 		data_length = strlen(DatumGetCString(datum)) + 1;
 		memcpy(data, DatumGetPointer(datum), data_length);
 	}
 	else
 	{
 		/* fixed-length pass-by-reference */
-		data = (char *) att_align_nominal(data, att->attalign);
+		data = (char *) att_nominal_alignby(data, att->attalignby);
 		Assert(att->attlen > 0);
 		data_length = att->attlen;
 		memcpy(data, DatumGetPointer(datum), data_length);
@@ -634,7 +632,7 @@ nocachegetattr(HeapTuple tup,
 			if (att->attlen <= 0)
 				break;
 
-			off = att_align_nominal(off, att->attalign);
+			off = att_nominal_alignby(off, att->attalignby);
 
 			att->attcacheoff = off;
 
@@ -683,19 +681,19 @@ nocachegetattr(HeapTuple tup,
 				 * either an aligned or unaligned value.
 				 */
 				if (usecache &&
-					off == att_align_nominal(off, att->attalign))
+					off == att_nominal_alignby(off, att->attalignby))
 					att->attcacheoff = off;
 				else
 				{
-					off = att_align_pointer(off, att->attalign, -1,
-											tp + off);
+					off = att_pointer_alignby(off, att->attalignby, -1,
+											  tp + off);
 					usecache = false;
 				}
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, att->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, att->attalignby);
 
 				if (usecache)
 					att->attcacheoff = off;
@@ -898,10 +896,10 @@ expand_tuple(HeapTuple *targetHeapTuple,
 			{
 				CompactAttribute *att = TupleDescCompactAttr(tupleDesc, attnum);
 
-				targetDataLen = att_align_datum(targetDataLen,
-												att->attalign,
-												att->attlen,
-												attrmiss[attnum].am_value);
+				targetDataLen = att_datum_alignby(targetDataLen,
+												  att->attalignby,
+												  att->attlen,
+												  attrmiss[attnum].am_value);
 
 				targetDataLen = att_addlength_pointer(targetDataLen,
 													  att->attlen,
@@ -1396,19 +1394,19 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index 37133ed7f8..3947b4a4d8 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -363,7 +363,7 @@ nocache_index_getattr(IndexTuple tup,
 			if (att->attlen <= 0)
 				break;
 
-			off = att_align_nominal(off, att->attalign);
+			off = att_nominal_alignby(off, att->attalignby);
 
 			att->attcacheoff = off;
 
@@ -412,19 +412,19 @@ nocache_index_getattr(IndexTuple tup,
 				 * either an aligned or unaligned value.
 				 */
 				if (usecache &&
-					off == att_align_nominal(off, att->attalign))
+					off == att_nominal_alignby(off, att->attalignby))
 					att->attcacheoff = off;
 				else
 				{
-					off = att_align_pointer(off, att->attalign, -1,
-											tp + off);
+					off = att_pointer_alignby(off, att->attalignby, -1,
+											  tp + off);
 					usecache = false;
 				}
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, att->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, att->attalignby);
 
 				if (usecache)
 					att->attcacheoff = off;
@@ -513,19 +513,19 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 65bb099634..cc749ff789 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -82,7 +82,25 @@ populate_compact_attribute(TupleDesc tupdesc, int i)
 	if (src->attnotnull)
 		dst->attflags |= COMPACT_ATTR_FLAG_IS_NOTNULL;
 
-	dst->attalign = src->attalign;
+	switch (src->attalign)
+	{
+		case TYPALIGN_INT:
+			dst->attalignby = ALIGNOF_INT;
+			break;
+		case TYPALIGN_CHAR:
+			dst->attalignby = sizeof(char);
+			break;
+		case TYPALIGN_DOUBLE:
+			dst->attalignby = ALIGNOF_DOUBLE;
+			break;
+		case TYPALIGN_SHORT:
+			dst->attalignby = ALIGNOF_SHORT;
+			break;
+		default:
+			dst->attalignby = 0;
+			elog(ERROR, "invalid attalign value: %c", src->attalign);
+			break;
+	}
 }
 
 /*
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index f4b1d956f5..7aeb4700d7 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -5084,7 +5084,7 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
 			if (slot->tts_isnull[i])
 				continue;		/* null is always okay */
 			if (vattr->attlen != sattr->attlen ||
-				vattr->attalign != sattr->attalign)
+				vattr->attalignby != sattr->attalignby)
 				ereport(ERROR,
 						(errcode(ERRCODE_DATATYPE_MISMATCH),
 						 errmsg("table row type and query-specified row type do not match"),
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 550b8e8f34..75d17a0dfe 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -202,12 +202,12 @@ tts_virtual_materialize(TupleTableSlot *slot)
 			 * We want to flatten the expanded value so that the materialized
 			 * slot doesn't depend on it.
 			 */
-			sz = att_align_nominal(sz, att->attalign);
+			sz = att_nominal_alignby(sz, att->attalignby);
 			sz += EOH_get_flat_size(DatumGetEOHP(val));
 		}
 		else
 		{
-			sz = att_align_nominal(sz, att->attalign);
+			sz = att_nominal_alignby(sz, att->attalignby);
 			sz = att_addlength_datum(sz, att->attlen, val);
 		}
 	}
@@ -242,8 +242,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 			 */
 			ExpandedObjectHeader *eoh = DatumGetEOHP(val);
 
-			data = (char *) att_align_nominal(data,
-											  att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = EOH_get_flat_size(eoh);
 			EOH_flatten_into(eoh, data, data_length);
 
@@ -254,7 +253,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 		{
 			Size		data_length = 0;
 
-			data = (char *) att_align_nominal(data, att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = att_addlength_datum(data_length, att->attlen, val);
 
 			memcpy(data, DatumGetPointer(val), data_length);
@@ -1067,19 +1066,19 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/jit/llvm/llvmjit_deform.c b/src/backend/jit/llvm/llvmjit_deform.c
index 22a23e50f4..905ff967e7 100644
--- a/src/backend/jit/llvm/llvmjit_deform.c
+++ b/src/backend/jit/llvm/llvmjit_deform.c
@@ -394,7 +394,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 	{
 		CompactAttribute *att = TupleDescCompactAttr(desc, attnum);
 		LLVMValueRef v_incby;
-		int			alignto;
+		int			alignto = att->attalignby;
 		LLVMValueRef l_attno = l_int16_const(lc, attnum);
 		LLVMValueRef v_attdatap;
 		LLVMValueRef v_resultp;
@@ -493,21 +493,6 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 		}
 		LLVMPositionBuilderAtEnd(b, attcheckalignblocks[attnum]);
 
-		/* determine required alignment */
-		if (att->attalign == TYPALIGN_INT)
-			alignto = ALIGNOF_INT;
-		else if (att->attalign == TYPALIGN_CHAR)
-			alignto = 1;
-		else if (att->attalign == TYPALIGN_DOUBLE)
-			alignto = ALIGNOF_DOUBLE;
-		else if (att->attalign == TYPALIGN_SHORT)
-			alignto = ALIGNOF_SHORT;
-		else
-		{
-			elog(ERROR, "unknown alignment");
-			alignto = 0;
-		}
-
 		/* ------
 		 * Even if alignment is required, we can skip doing it if provably
 		 * unnecessary:
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 478ebbe1f4..dc0f64c6d2 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -57,7 +57,7 @@ typedef struct CompactAttribute
 								 * cstring */
 	uint8		attflags;		/* bit flags for compact storage of bool
 								 * fields */
-	char		attalign;		/* alignment requirement */
+	uint8		attalignby;		/* alignment requirement in bytes */
 } CompactAttribute;
 
 #define COMPACT_ATTR_FLAG_BYVAL (1 << 0)
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index 9078d03231..1e2e2be021 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -90,6 +90,16 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	att_align_nominal(cur_offset, attalign) \
 )
 
+/*
+ * Similar to att_align_datum, but accepts a number of bytes, typically from
+ * CompactAttribute.attalignby to align the Datum by.
+ */
+#define att_datum_alignby(cur_offset, attalignby, attlen, attdatum) \
+	( \
+	((attlen) == -1 && VARATT_IS_SHORT(DatumGetPointer(attdatum))) ? \
+	(uintptr_t) (cur_offset) : \
+	TYPEALIGN(attalignby, cur_offset))
+
 /*
  * att_align_pointer performs the same calculation as att_align_datum,
  * but is used when walking a tuple.  attptr is the current actual data
@@ -111,6 +121,12 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	att_align_nominal(cur_offset, attalign) \
 )
 
+#define att_pointer_alignby(cur_offset, attalignby, attlen, attptr) \
+( \
+	((attlen) == -1 && VARATT_NOT_PAD_BYTE(attptr)) ? \
+	(uintptr_t) (cur_offset) : \
+	TYPEALIGN(attalignby, cur_offset))
+
 /*
  * att_align_nominal aligns the given offset as needed for a datum of alignment
  * requirement attalign, ignoring any consideration of packed varlena datums.
@@ -137,6 +153,13 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	   ))) \
 )
 
+/*
+ * Similar to att_align_nominal, but accepts a number of bytes, typically from
+ * CompactAttribute.attalignby to align the offset by.
+ */
+#define att_nominal_alignby(cur_offset, attalignby) \
+	TYPEALIGN(attalignby, (uintptr_t) cur_offset)
+
 /*
  * att_addlength_datum increments the given offset by the space needed for
  * the given Datum variable.  attdatum is only accessed if we are dealing
-- 
2.43.0

v3-0004-Remove-pg_attribute.attcacheoff-column.patchapplication/octet-stream; name=v3-0004-Remove-pg_attribute.attcacheoff-column.patchDownload
From 168783b2e2fdfed23a4491040b31728e725afa2f Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 6 Aug 2024 03:03:12 +1200
Subject: [PATCH v3 4/5] Remove pg_attribute.attcacheoff column

This is no longer needed as the offset is now cached in the
CompactAttribute struct.

catversion bump
---
 doc/src/sgml/catalogs.sgml                | 11 -----------
 src/backend/access/common/tupdesc.c       | 17 ++---------------
 src/backend/bootstrap/bootstrap.c         |  1 -
 src/backend/catalog/heap.c                | 16 ++++------------
 src/backend/catalog/index.c               |  1 -
 src/backend/utils/cache/relcache.c        | 18 ------------------
 src/include/catalog/pg_attribute.h        |  9 ---------
 src/test/regress/expected/type_sanity.out |  3 +--
 src/test/regress/sql/type_sanity.sql      |  3 +--
 9 files changed, 8 insertions(+), 71 deletions(-)

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index b654fae1b2..6c6abd53ca 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -1186,17 +1186,6 @@
       </para></entry>
      </row>
 
-     <row>
-      <entry role="catalog_table_entry"><para role="column_definition">
-       <structfield>attcacheoff</structfield> <type>int4</type>
-      </para>
-      <para>
-       Always -1 in storage, but when loaded into a row descriptor
-       in memory this might be updated to cache the offset of the attribute
-       within the row
-      </para></entry>
-     </row>
-
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>atttypmod</structfield> <type>int4</type>
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index cc749ff789..74f22cffb9 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -369,17 +369,7 @@ TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
 
 	memcpy(dstAtt, srcAtt, ATTRIBUTE_FIXED_PART_SIZE);
 
-	/*
-	 * Aside from updating the attno, we'd better reset attcacheoff.
-	 *
-	 * XXX Actually, to be entirely safe we'd need to reset the attcacheoff of
-	 * all following columns in dst as well.  Current usage scenarios don't
-	 * require that though, because all following columns will get initialized
-	 * by other uses of this function or TupleDescInitEntry.  So we cheat a
-	 * bit to avoid a useless O(N^2) penalty.
-	 */
 	dstAtt->attnum = dstAttno;
-	dstAtt->attcacheoff = -1;
 
 	/* since we're not copying constraints or defaults, clear these */
 	dstAtt->attnotnull = false;
@@ -509,9 +499,8 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
 		 * them (since atttypid will be zero for all dropped columns) and in
 		 * general it seems safer to check them always.
 		 *
-		 * attcacheoff must NOT be checked since it's possibly not set in both
-		 * copies.  We also intentionally ignore atthasmissing, since that's
-		 * not very relevant in tupdescs, which lack the attmissingval field.
+		 * We intentionally ignore atthasmissing, since that's not very
+		 * relevant in tupdescs, which lack the attmissingval field.
 		 */
 		if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0)
 			return false;
@@ -752,7 +741,6 @@ TupleDescInitEntry(TupleDesc desc,
 	else if (attributeName != NameStr(att->attname))
 		namestrcpy(&(att->attname), attributeName);
 
-	att->attcacheoff = -1;
 	att->atttypmod = typmod;
 
 	att->attnum = attributeNumber;
@@ -816,7 +804,6 @@ TupleDescInitBuiltinEntry(TupleDesc desc,
 	Assert(attributeName != NULL);
 	namestrcpy(&(att->attname), attributeName);
 
-	att->attcacheoff = -1;
 	att->atttypmod = typmod;
 
 	att->attnum = attributeNumber;
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 7637581a18..e6b4ff6f10 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -547,7 +547,6 @@ DefineAttr(char *name, char *type, int attnum, int nullness)
 	if (OidIsValid(attrtypes[attnum]->attcollation))
 		attrtypes[attnum]->attcollation = C_COLLATION_OID;
 
-	attrtypes[attnum]->attcacheoff = -1;
 	attrtypes[attnum]->atttypmod = -1;
 	attrtypes[attnum]->attislocal = true;
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 01b43cc6a8..9a9f4c1562 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -144,7 +144,6 @@ static const FormData_pg_attribute a1 = {
 	.atttypid = TIDOID,
 	.attlen = sizeof(ItemPointerData),
 	.attnum = SelfItemPointerAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = false,
 	.attalign = TYPALIGN_SHORT,
@@ -158,7 +157,6 @@ static const FormData_pg_attribute a2 = {
 	.atttypid = XIDOID,
 	.attlen = sizeof(TransactionId),
 	.attnum = MinTransactionIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -172,7 +170,6 @@ static const FormData_pg_attribute a3 = {
 	.atttypid = CIDOID,
 	.attlen = sizeof(CommandId),
 	.attnum = MinCommandIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -186,7 +183,6 @@ static const FormData_pg_attribute a4 = {
 	.atttypid = XIDOID,
 	.attlen = sizeof(TransactionId),
 	.attnum = MaxTransactionIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -200,7 +196,6 @@ static const FormData_pg_attribute a5 = {
 	.atttypid = CIDOID,
 	.attlen = sizeof(CommandId),
 	.attnum = MaxCommandIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -220,7 +215,6 @@ static const FormData_pg_attribute a6 = {
 	.atttypid = OIDOID,
 	.attlen = sizeof(Oid),
 	.attnum = TableOidAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -684,11 +678,10 @@ CheckAttributeType(const char *attname,
  *		Construct and insert a set of tuples in pg_attribute.
  *
  * Caller has already opened and locked pg_attribute.  tupdesc contains the
- * attributes to insert.  attcacheoff is always initialized to -1.
- * tupdesc_extra supplies the values for certain variable-length/nullable
- * pg_attribute fields and must contain the same number of elements as tupdesc
- * or be NULL.  The other variable-length fields of pg_attribute are always
- * initialized to null values.
+ * attributes to insert.  tupdesc_extra supplies the values for certain
+ * variable-length/nullable pg_attribute fields and must contain the same
+ * number of elements as tupdesc or be NULL.  The other variable-length fields
+ * of pg_attribute are always initialized to null values.
  *
  * indstate is the index state for CatalogTupleInsertWithInfo.  It can be
  * passed as NULL, in which case we'll fetch the necessary info.  (Don't do
@@ -740,7 +733,6 @@ InsertPgAttributeTuples(Relation pg_attribute_rel,
 		slot[slotCount]->tts_values[Anum_pg_attribute_atttypid - 1] = ObjectIdGetDatum(attrs->atttypid);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attlen - 1] = Int16GetDatum(attrs->attlen);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attnum - 1] = Int16GetDatum(attrs->attnum);
-		slot[slotCount]->tts_values[Anum_pg_attribute_attcacheoff - 1] = Int32GetDatum(-1);
 		slot[slotCount]->tts_values[Anum_pg_attribute_atttypmod - 1] = Int32GetDatum(attrs->atttypmod);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attndims - 1] = Int16GetDatum(attrs->attndims);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attbyval - 1] = BoolGetDatum(attrs->attbyval);
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index bdcfa5d188..d4c5edecec 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -320,7 +320,6 @@ ConstructTupleDescriptor(Relation heapRelation,
 
 		MemSet(to, 0, ATTRIBUTE_FIXED_PART_SIZE);
 		to->attnum = i + 1;
-		to->attcacheoff = -1;
 		to->attislocal = true;
 		to->attcollation = (i < numkeyatts) ? collationIds[i] : InvalidOid;
 
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index a16aaa777c..6a3b876098 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -660,20 +660,6 @@ RelationBuildTupleDesc(Relation relation)
 		elog(ERROR, "pg_attribute catalog is missing %d attribute(s) for relation OID %u",
 			 need, RelationGetRelid(relation));
 
-	/*
-	 * The attcacheoff values we read from pg_attribute should all be -1
-	 * ("unknown").  Verify this if assert checking is on.  They will be
-	 * computed when and if needed during tuple access.
-	 */
-#ifdef USE_ASSERT_CHECKING
-	{
-		int			i;
-
-		for (i = 0; i < RelationGetNumberOfAttributes(relation); i++)
-			Assert(TupleDescAttr(relation->rd_att, i)->attcacheoff == -1);
-	}
-#endif
-
 	/*
 	 * We can easily set the attcacheoff value for the first attribute: it
 	 * must be zero.  This eliminates the need for special cases for attnum=1
@@ -1965,8 +1951,6 @@ formrdesc(const char *relationName, Oid relationReltype,
 			   &attrs[i],
 			   ATTRIBUTE_FIXED_PART_SIZE);
 		has_not_null |= attrs[i].attnotnull;
-		/* make sure attcacheoff is valid */
-		TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
 
 		populate_compact_attribute(relation->rd_att, i);
 	}
@@ -4437,8 +4421,6 @@ BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs)
 	for (i = 0; i < natts; i++)
 	{
 		memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
-		/* make sure attcacheoff is valid */
-		TupleDescAttr(result, i)->attcacheoff = -1;
 
 		populate_compact_attribute(result, i);
 	}
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index 1c62b8bfcb..30d1e8cfcc 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -73,15 +73,6 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
 	 */
 	int16		attnum;
 
-	/*
-	 * fastgetattr() uses attcacheoff to cache byte offsets of attributes in
-	 * heap tuples.  The value actually stored in pg_attribute (-1) indicates
-	 * no cached value.  But when we copy these tuples into a tuple
-	 * descriptor, we may then update attcacheoff in the copies. This speeds
-	 * up the attribute walking process.
-	 */
-	int32		attcacheoff BKI_DEFAULT(-1);
-
 	/*
 	 * atttypmod records type-specific data supplied at table creation time
 	 * (for example, the max length of a varchar field).  It is passed to
diff --git a/src/test/regress/expected/type_sanity.out b/src/test/regress/expected/type_sanity.out
index 88d8f6c32d..8eff3d10d2 100644
--- a/src/test/regress/expected/type_sanity.out
+++ b/src/test/regress/expected/type_sanity.out
@@ -550,8 +550,7 @@ WHERE pc.relkind IN ('r', 't', 'm') and
 SELECT a1.attrelid, a1.attname
 FROM pg_attribute as a1
 WHERE a1.attrelid = 0 OR a1.atttypid = 0 OR a1.attnum = 0 OR
-    a1.attcacheoff != -1 OR a1.attinhcount < 0 OR
-    (a1.attinhcount = 0 AND NOT a1.attislocal);
+    a1.attinhcount < 0 OR (a1.attinhcount = 0 AND NOT a1.attislocal);
  attrelid | attname 
 ----------+---------
 (0 rows)
diff --git a/src/test/regress/sql/type_sanity.sql b/src/test/regress/sql/type_sanity.sql
index e88d6cbe49..303f90955d 100644
--- a/src/test/regress/sql/type_sanity.sql
+++ b/src/test/regress/sql/type_sanity.sql
@@ -397,8 +397,7 @@ WHERE pc.relkind IN ('r', 't', 'm') and
 SELECT a1.attrelid, a1.attname
 FROM pg_attribute as a1
 WHERE a1.attrelid = 0 OR a1.atttypid = 0 OR a1.attnum = 0 OR
-    a1.attcacheoff != -1 OR a1.attinhcount < 0 OR
-    (a1.attinhcount = 0 AND NOT a1.attislocal);
+    a1.attinhcount < 0 OR (a1.attinhcount = 0 AND NOT a1.attislocal);
 
 -- Cross-check attnum against parent relation
 
-- 
2.43.0

v3-0005-Try-a-larger-CompactAttribute-struct-without-flag.patchapplication/octet-stream; name=v3-0005-Try-a-larger-CompactAttribute-struct-without-flag.patchDownload
From d1ec19a46a480b0c75f9df468b2765ad4e51dce2 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 3 Sep 2024 14:05:30 +1200
Subject: [PATCH v3 5/5] Try a larger CompactAttribute struct without flags

Benchmarks have shown that making the CompactAttribute struct larger and
getting rid of the flags to reduce the bitwise-ANDing requirements makes
things go faster.
---
 src/backend/access/common/tupdesc.c | 21 ++++++----------
 src/include/access/tupdesc.h        | 39 ++++++++++-------------------
 2 files changed, 20 insertions(+), 40 deletions(-)

diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 74f22cffb9..95c92e6585 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -67,20 +67,13 @@ populate_compact_attribute(TupleDesc tupdesc, int i)
 	dst->attcacheoff = -1;
 	dst->attlen = src->attlen;
 
-	dst->attflags = 0;
-
-	if (src->attbyval)
-		dst->attflags |= COMPACT_ATTR_FLAG_BYVAL;
-	if (src->attstorage != TYPSTORAGE_PLAIN)
-		dst->attflags |= COMPACT_ATTR_FLAG_IS_PACKABLE;
-	if (src->atthasmissing)
-		dst->attflags |= COMPACT_ATTR_FLAG_HAS_MISSING;
-	if (src->attisdropped)
-		dst->attflags |= COMPACT_ATTR_FLAG_IS_DROPPED;
-	if (src->attgenerated)
-		dst->attflags |= COMPACT_ATTR_FLAG_IS_GENERATED;
-	if (src->attnotnull)
-		dst->attflags |= COMPACT_ATTR_FLAG_IS_NOTNULL;
+
+	dst->attbyval = src->attbyval;
+	dst->attispackable = (src->attstorage != TYPSTORAGE_PLAIN);
+	dst->atthasmissing = src->atthasmissing;
+	dst->attisdropped = src->attisdropped;
+	dst->attgenerated = src->attgenerated;
+	dst->attnotnull = src->attnotnull;
 
 	switch (src->attalign)
 	{
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index dc0f64c6d2..7bff43b4f7 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -55,35 +55,22 @@ typedef struct CompactAttribute
 	int32		attcacheoff;	/* fixed offset into tuple, if known, or -1 */
 	int16		attlen;			/* attr len in bytes or -1 = varlen, -2 =
 								 * cstring */
-	uint8		attflags;		/* bit flags for compact storage of bool
-								 * fields */
+	bool		attbyval;		/* as FormData_pg_attribute.attbyval */
+	bool		attispackable;	/* as FormData_pg_attribute.attstorage !=
+								 * TYPSTORAGE_PLAIN */
+	bool		atthasmissing;	/* as FormData_pg_attribute.atthasmissing */
+	bool		attisdropped;	/* as FormData_pg_attribute.attisdropped */
+	bool		attgenerated;	/* as FormData_pg_attribute.attgenerated */
+	bool		attnotnull;		/* as FormData_pg_attribute.attnotnull */
 	uint8		attalignby;		/* alignment requirement in bytes */
 } CompactAttribute;
 
-#define COMPACT_ATTR_FLAG_BYVAL (1 << 0)
-#define COMPACT_ATTR_FLAG_IS_PACKABLE (1 << 1)
-#define COMPACT_ATTR_FLAG_HAS_MISSING (1 << 2)
-#define COMPACT_ATTR_FLAG_IS_DROPPED (1 << 3)
-#define COMPACT_ATTR_FLAG_IS_GENERATED (1 << 4)
-#define COMPACT_ATTR_FLAG_IS_NOTNULL (1 << 5)
-
-#define CompactAttrByVal(att) \
-	(((att)->attflags & COMPACT_ATTR_FLAG_BYVAL) != 0)
-
-#define CompactAttrIsPackable(att) \
-	(((att)->attflags & COMPACT_ATTR_FLAG_IS_PACKABLE) != 0)
-
-#define CompactAttrHasMissing(att) \
-	(((att)->attflags & COMPACT_ATTR_FLAG_HAS_MISSING) != 0)
-
-#define CompactAttrIsDropped(att) \
-	(((att)->attflags & COMPACT_ATTR_FLAG_IS_DROPPED) != 0)
-
-#define CompactAttrIsGenerated(att) \
-	(((att)->attflags & COMPACT_ATTR_FLAG_IS_GENERATED) != 0)
-
-#define CompactAttrIsNotNull(att) \
-	(((att)->attflags & COMPACT_ATTR_FLAG_IS_NOTNULL) != 0)
+#define CompactAttrByVal(att) ((att)->attbyval)
+#define CompactAttrIsPackable(att) ((att)->attispackable)
+#define CompactAttrHasMissing(att) ((att)->atthasmissing)
+#define CompactAttrIsDropped(att) ((att)->attisdropped)
+#define CompactAttrIsGenerated(att) ((att)->attgenerated)
+#define CompactAttrIsNotNull(att) ((att)->attnotnull)
 
 /*
  * This struct is passed around within the backend to describe the structure
-- 
2.43.0

deform_test.sh.txttext/plain; charset=US-ASCII; name=deform_test.sh.txtDownload
patches-0001-0005_results.pngimage/png; name=patches-0001-0005_results.pngDownload
patches-0001-0004_results.pngimage/png; name=patches-0001-0004_results.pngDownload
�PNG


IHDR"*����sRGB���gAMA���a	pHYs�����e��IDATx^���dE�@�gvYr�9G�A%cE��
"*�
��(�A��QA���s�%od�t���t-o�=�3=;a�����~�B�
���[��T�""""""""""""""m�����������������H��)"""""""""""""mGG����������������"""""""""""""�vtD�������������H��)"""""""""""""mGG����������������"""""""""""""�vtD�������������H��)"""""""""""""mGG����������������"""""""""""""�vtD�������������H��)"""""""""""""mGG����������������R%���3^{������%�;6���
a�=�#G����<'N����s�=�^z����|&�:���_[g��	���o��{ox��7���S�q�9����
7�0��}��F�����<�>�������{T�I��;��z��������3O�����s��'��v�e�
�����l��V�ux����'��_��~����dXc�5��z�9����������W�/<������k�4iR����d(�o��o���g��K.�22����3�<�s���s�1GX����[o�r��[o
��sO��������g�=�7�|���DXp��1�<c��	'�|rx������M^��z������/<��C���2.Co�t�M�"�,J�R<�*�zd�m��F�=�x�����UW]5���@z_y��p��7�'�x"� ���;oXm���&�l�n������V��F���,��"""""����^xat������^9!Q�1R<������'O���:$H�/~��p�WDc��q��}�`y�������~���D�e2�4�_t�E��U�r�<�y|�L�R�Ef������Z���D��?��c���R�������/��r���K����^�z��������uM���v��e_���H�]�C�]�Dd��)����7�|s���?>�������O<1��8��-���i|2\hF6K�������?!_�s�1�����u�I�)�i�L 8����g��p\]��X�1=c��x���g�yf8��c��UHi#���4���.���;���s�p=��t�V?<k��[�J3�ZA��/'u@����a�-���������a�������d����=-���0����s4��������s�E���G4"���s>�e������e�.Cf����za�E������otZ��`4�x��?���h#+q��{���9QDdz��"��g�}3�^x��7�<��_|�f�w"(�C���Y��Mxi<�8�V��85�=��<�\���1<cy����2����p���������K���D�Hc�w�yW����'i����&""""":"�!�o������5�\a��7���G�>�h4�ad�(��Y��4AGGG\�e����o����a�����I����w�/04������*��V�Po��b�Xo)��/��i�p�<�����=�2�I�����T�X*"��6����"���[,���:����+NsD��QP�6���e9���ei��2��fJ0g<��>��G��$K�2��
6�`�**���+p,63c����1<���eK,�D���>>��8��~������9,�|�L[����(K�����V~��W�������w&b9�w#^��i�N���k������Yf��z����������f�`_{����IA!F�n�����I�>����,Kl&��}����/���0,��B� ������:h���0��>(��H����0\Q7�Yf������w�}w�{8����#����xU����4�Gd�F1���N0�'0�c���W�v�}�����>��"!��
�!���\���}�c��n��l���(�hO}��}��7�I��d<�����K�3^��L.�������`��K/�4�����6��{����q���-��2:$��}�q��Ex6i@�H�`2�������N;�1#������)��wf	�f��Di�<b<��}h��k�CZ���]��DDDDDtD3�g����J��s�6�h��D7��k��&�|Fildph��B��;!��{�h,`�5��I��$����1:��F��6�,�1��x���n�,�<��>C�(/"����LpZ~����Q�b_��d�@b���;�m�9����t>�1IHTsr1���G?���4��/��R��Vt�����{-������p]w�u�>��i���x����.[=;���Gy�����l��t
VQ��'>u�Y|�;��s�
x��$m=�{�H���q�&����t����������F`$d�
�C�4��Y���?�)�	�_~��$�QR�1B0��%�������d�M����&����K�Q_�6{�ZDDf,E�;���6��1>��Y%"K��l+��R�T�7���d�	��,i^&+<����>�F���)W��'z0�����;���Z�����	DX�s��n8C���yQ�b��,���������
���?I�5J=��63#��W������X3������Zk����B��K��zJ�3C�����8W��Uf���U�z��/""��t3��D+��H{a�t�=�Ls�110�d=p��|*�q�>����N�8z����V^y�'C"�l������{.N�,�3yvrt&=���F gdzW���H�)�j08U.�`�����#r��b}�m�M32����7m{8�z��1r1-w�����|$l��v=*�������~����Ye�=^�O�{��^8�����>��U!3�����z`&<������H��\{������4M�M����,�H�[��)��}���I�V���I8
97AZqj��y%B>��>��j$/xN-��r����o!��)DDDDDD�N�RoJ��%@Y������M�!�+����/X���J���=��������~a���[m�U�[c�������}Y�'i����6MAf��O��8y�
Q\�E��G,O��)yXn��K�q��q��?���7�<�w3�<��,��f)�����-o��3�8#���=W�{����?~��|������)�"Q�7�|s����/~����� _^�}2~��8,��`������g�91����p����������k��7���������{��Dd���ja��7��3�nX��:H�Jif�cDb�*�Q[u��'�i�'���������?�����}6�/��?�����d��k_�Z��FPg�y�4${������f��
��������^�������o�3��������a�}�i���������w+������,��R��O~��1O!/o�|O��z�n^A�M#��\s�����=��I�R�8�7�p���j=�|�a��dN{AA��f�z���Z�}�)�L3�e@�Y>:iM>��� _����`�u"���zHZ�_����O���6B4	}I>��{S�����o���W�S��er�V?���Q6�
�������e4�&����n�il����<��so�'�%����f�� �Y:9�LI����D?L�R��v�;���~��vS���t!C�����|�z�@��b��D�;�'�'o<'_��2+��g}����J���*������������^���2Y����m�V['��c-�co��������>�1 �/��3c)�������v��Z���'�<�=-��rq��l^^t�E��n�S���S&��SO=u�X��2Nc��f O�>�	�w�=���n���v�i�d2�I���?������_�BM������.�S6�����\(�r�6B�A?K^!��u������u�{�_���
�'<�:��F5����j�����s��(""""2T��QF��
�����������R���b�2��(G��h�
]=����_w�qG��J�T�p��wG��
nr$��t0[��1�`�g�hg(�([������.ui/�A�E��!��/�;����(����X����SO��1D}��l�Q�b�aen��w���E0��'�H�F������:�������������	��y�O/�������NY�8}��'��
#*�S&�0X���1����Q``>���c=�N������7e�Lul���`#������^zi��|����%/�s����Q=�:�{�Np.F���6i���������X������G��''9r�z���:�s�9����^x���_����g\���<�[�'�$E�=/o�P��5|�Ey�`j�	�-T0�^w�u���My�����`���4��y���s���N��yYN>���������
�����<����((���w��'�I�|y���(�����!��|������}��0�n�
�fde��!��=�(�P��=��.���X�����, _�W��Z�z�������zKy�u�Y1}8�R�y�cO/���~�'�J�<���d��:Q�����zO�����)e����P����_j��G����f����;�t!S���3u��V���m��V�2(}Oe��<\�?�(��cL��t5�S��/P��s����V6���m=/�2���1%my��6���q��N]Mc-�%e���6hv��</_~���L�BF�j��O��~r
��f ��=�j���JPf�e���#8e��:���_?����L�l��Q���c�����_�>&�4��Q��{�
��L�5��}��G&u��C�\}��q\�X�<�-p��fdQ���0���9��:�_�1�����=��^�O�����j��<�R}E���<�z���q�|��}B���8-O;��4�JuPDDDDd��|�E��t��Ge�?F����w��w���
b	
+Q��/�G�d��=YJ�$f�b��}���}�J�����%P��5�����n���o��8$�1P7")�	��� ���� ��_�:�?����QGkf=��2F��h�����U9���GL�����}=Q�Ii�U�8�o�A
=�!�D!PW1@����B�/�&
'�xb4����@z0���Y0Ny���#C#�/��yhwyg_-�/�<����������H4�F�F2Y�AclO`�������`��|���O�*�
u��e8��1`�v�i��&�a�<�\(���_����X���\W�\�c�|����8j����p�I'Ms�r}�����%��Q�� /��x��=���;����IIyN#H�����W���S��O�����Fp���_+_��y6�SV,���_�,��)���;��@�!�)/��@A:�sL��z����X�S�5�W��@3#�z�����\s���*^�w�Km�1���R��/��sy>����Y�{���U��;�+��I=y�X=�x
�U�}Z��U�0Q�P�y��S��	#��.�,��#���yp�B�pJ��y9My��������1�������@�M)�b����U�a�vD�K����=A��qm=9	���J�C3�h���sCY�HD$3$12��<3q���6���6�,.O�3
�.)�((}�����g:�tT��eQ�z�T@�Gt�x��@a���2X���G�&M\������q��a9��%�e�X�%8uP�����8cj����n�i��E�ii�������=�@�����s������3�����L��A=�<��u8")��O-�}��`��Rd`���g?g0����f�r�[�#(��7y���w�a�b����(��c�h�2���wFy�n$���c�.Ne>�?�.�)N3�=�!���<,�f5�u�%_h������z�R�y�Q>��9�P+���~�����|"���Q���[��Q�R�&���7k�|&�-oh��,�T��
�0�����t��1�0K?�;8J��N�v��T)W�#�������1/����S��6����o�}��Kc�OeN���1@dB-��2�N����
��Y�|���3��o���N���}�4#�k����}(k�����(��Y��<M��'Y�8�p ���Z���_�Gk�'��%�\eY:?�S���}�{�1E'���G�P6�O-hk8����o�|���S�r�Kj�<�g!���bD$���$�����P&��P�����p�I�^�_�9�c���<$?H��[n���G��������K��h�N��hS	������+�������x�R�{"�3�W�M�4�GR�}}Bj��i���|}O�,m�1m%��H�kS[�<du���7��;K~R�������1!PN��S�S[I}�g�E�?i�<��<���m�/��UHK��b��;}-����~+�k�e@>1��h����@���C^�w�h�I���s���� 
���Y���Y��HW�$�U�V1j/O��Z�qF~�A��}7���R���IF���zD�"���������R3������	hiL�}���8T���+�7�"���N����>�*�"��|�Z�dQ�N�F��B<�rLu��$���J�S����{�f��=u������B�3i�<����<��yp>y�s�x2�[]
�C�.:������Pe�;"�3[�#`(c��0��%nP�PPx�J���VTp�
F;"��1����������g���uR��B�2����O:����7�����%�O�w���(�Q��l��W����qD����fy/�'e7�(c��|#Ox������0VP��L�O(�(����FJh�[��=��B�r%=)���������P���!M)SDyF)O����.C�]O����9'���K�L�%������o��oq���A}�x����$$�����)��z�%�_�Q�(X�|��A=�_Z2-�K�tQ?j��48/��@;���ok���[���������\��G~�=��y�I��F��8�H���Z�KdU2@���D(B9c�bRE�b���$�F{�>�^�~�<���8�H9"�K��<�:��������sL7����������LHg^��.��//k�3W^ye�C@����}L�Hy�����V��{���(S"�X�0�/u���1�a�K������1�S����E=��&x�|��y|�S���ot>�>�2�V���!MEh���T������1���)��+���1N��|�X-c2i!�3�1��J����&yo��L�9� �%�R�{��G����8��;�>
�0���J��1�:Az�,I�,d.�;�y�8�^���Tf�#�%�g�=�,��_cB~��Q�)��'�Y����u�A��E��7���L2�/��U����$��
c?��#?��U�-��2��&�#8��3�G���?��x�T�
2������D��������eG9���x����:���3�|���T�01�L��W�I@��.��?���}���G	�&e�,�9&$�2��p�$������3��:�,��|Oy�V���R'�����Ke����S��I�n����.�����xd6��>��J��{�+�"�{2�(�#�Q~��o�A�G&R�)o>�w��>������8�!��j��?���������ej{�����2��r��("|P�PpQ40X����lO����4�{����c|��+��b���Lv9�����9V��%4}��^y��/�W��� ��r�'P(Q&8����o}+|�_��m2���(�,���")����V��"0>a��);�Ku��;��ST���@�AUDi$�����O}*�A�?������:�@����C��t_������������a�\�Z��a������Cr��P�8�P�����	����Rb2�����B�o>E����=�o��1���@:���z��������)��!_iL���a�/�4���#,�-A��U��IJ�<����Z��aI�d���8�j�d�w�u�iu,�Ar�y��4�W��\)�b;������	��y�o��T��'N�u�Y'�u�|)s���t�T�����3�~�Sk�w��]��O����R�'��y��y�{��g�? ��'9���^2
�y�]v�}Z����L�h����4�����)}i*�3����Y�#���|����J�rH�"����"����1!�xVXH���u�V��31���\��G��I��)������2#�z��}�$���C�p���t�6I�D��g��/�1M=���q�|�c�V7����K����qg����x��m<��/	���{%��?���C�~��C��������Au6���Ei#Lf��������=���w�$�v�3p\3�@���$�S]��F7Mm(�w�i����8w�q����}�|�#��-��������S$�[����sj1�t@���wDbP�+y(��R�ER�Y����Q�x?�<(:(�(����7�`�IK���x���=QL���@��d�'���F�Y�a��2���c�����k��v:c~;A�fV.3_��p���������=#!OQ��E����#����Hsf2''N�|���("����o��S�k�3��Q`��Y������0�`��;�/BLNJ�s!@�e|�a<�(f$����K��AY"�R�eX4^������c�/_>EhG�&��K�G��$^�x5�HUt��@���H�����H k0&0����8d0:6j������`
��Zu�K���c_���`G��w�����i%�zy��8q85j�_���r�A�z��7o�D���E��������H2�K�w�-�1/�+�����(/�
t	����f$�5&�^�.���RV�����w���{!��q������p-}��F�����[�^��I��4D[��/JusF���'�Q#G{����Z���xJjC���!��0Yy�w�,eD���\d��������XJ�?�mR���jA�)�!�8��*���qF�IEi2T#x~~br<���@����S�t(��"""""C����~e>���*)��@	��G?����������;������"EJ$0&��4�u���eDB�+�Iyl�v��6*����O>b�avq>��`vy�1���H-�����������0���#H#�<�3
�/�Po��H��\Q��8uO��C�/�Op/��Np���F�F�����o	����&8���#6�H�`$��X�t��<k eV2������Y�y��-oX��f��@]�p�7^1���N����|�rCVOm��q��N�3Df���1��;���X����'�8y(o�t��is�.�H��9A�x_dS���1�7�'�<�Z����|H�5�����A&��`�;�9��x��h����FK?���7�"�j-)[�\�ZRQ���Z�/��5&Dv�tt�<���SY%����X/��?���^�$l&��w���|�K�������f���0�i$�)j*���86
�)�
�X�����zhKY���`l�#�V��+��bX�)NE���Z��#��������f�]3��V�/=�CM��n��#Q�'P8�7��N�KPa��e�B��`����3�8���f~�7)����'�(�S��z0#3o�Aa���iF@�o����f���r���;��Q������f�"�7RGJ��o���(��&yO�@����
-�0N���Lf�y�TO`�,FG�
	����;�1�4�Q�%�����_r1ADJ2&� ����a8���:���q�4[��&��L�C>"�V� �7�c$��GO�D	�Qoy��K\"�D��d�Lp.�����f\~-��0��1���[C�O�%����p�)��h<���������H�!],������=����M�@V���-�����@V 3���~����~y'u?oX���_������;��9�W�����|�����|_A�����q~b	�HQ,�z��|��ft�v��Z�&����i)>���O2�~�������|����>������4/#`(���68���-���u����E�I0���bFoA/b��lJ�L�(F�1�}y<��8��/�Z�6�$����k\v�����S��������uf��
�{%���<�f��1������_�"�������~�
��V�	��]�H�&�;A0`�
��	�!�Q�@�f����p��0��R�*��	�|� � ��k�G����5y�����:��[tV���xF>MS��V�(�����bF�%� ��/��>o��|Tu���J~��f�%�S:)��n�����.����`�h�l6J
0jRf�������N��2�A�W_}u8����o������$u�Q�/�K�����#�'�2&�� c�5�A2�r
m�Q}�=��p=�K��_&�=���~�<�����������i��<����n�����l'��YR/��
��cQ��'���2f�/��d����7�)�z��/c��j-����w[�E+m�H�y���<h���S�8�?�}y��P+��x��e�,�Y��c�p�FN���M^oAV�{�s���r#�'0.-:"�����C>�I.LA�t�I����Gyd�����dY��� �_zN-h�CI��V�ED���W0��0��{�
��sN4@��\w�u����(�BH�`P�P�����2o~�z�3;8l������]4����J�`����Y����Y�
��g^���)�
P�)�RN����5�Xt^2����P��N����B����s�m��>?��X�1r����g?�Y8��c���?��O\.-%���q�4�f8?�pR5kH�?y*��w��f?�����#��l�F����z��7��GAs�|���cLX�S�W��{�eRo"�E�������u����HO����`O'��F3���/��$H�f���D~������;��w^67C1=�,�
�1?9�<�/�������E��<�W���<9��c����p��'G'$[ci�� c���9f�/=GDDDDD�qDblbs����/.YT�����%�,qw�UWE������J�n�F
�gf�6Jg~F8ubF/�6)��5C�hd���_��x������A���K�Q��,����8,��rf�'�����i���%���M��`�?��p��+���}�����o�1�����o��~�E��d����%;Y�'�k�����%�u=o(�V�%���`b���?�����?�����g�<k���OC���s�xM_�^q���S�qQ��E��'�=?��:����{��^�I�G^���������Vt�f�GDB���+L~��K� oX���s����p8�o0`b��� ���0�����n�K���g�F�8��]v������C9$�����{^�M��tb������RT}�,���*�E�3�����@�������d����y���D6�z�c<�0���,#��t\��@0�����(��2�ad_&���p�����B�^{���N;�}������}�{q(���.~���A?��^�3����V�3�=&�j��j�q+��3��n����q_{(.#��#��V\�����GV+e��^�Z������C1���4l�-����D�v@������z��8�M�L}acX���W���?���������;4��F�8^���#	�}�
6� n0�����}�kq67�)�P(`��s�5�L������,`���J,P��e�Z-��L��Px�����>t����S~�{���jw4F��i7,���*u��������a$��D.��c"�IG>����,���p�u�����}C�@;|0��#y����}�h0����;Q�_�����s��v�m�Y4 "71#��+z���;o&�����
m3�x��w����oy�hQ��Z���{�������k�a~OH�����fi�����C.�*�V>��Q���m��A���c�����8�P���c�|���kEV�x�=,�w~9Y&	�i�-:"��y�Kt�j� '����&�y�j�<n�
qnq�v���K����TQ�s�����]�y������	!|��g��t\g�u��Ms�w����sDDDDDd���Q,1.�t��`��b�-�����hl���WQ�p0��p��<�(�������+�(��,��r�W>1�
�qt0Q4�b�i���^/���/�	'���z��������V<���W��'^��0c(������?1��:�sL���c�"��I)O��$���r��]�'?`0m�0��.oC����zc�k7�i����V�P��3�8#��7�	��zj�����Q�����G�����;.��Y���i�p�=z�jE��"c���1�w\\�����������|������wq2L�r��\�+�w����s��#�~f i��������7�����zC�,N�h��g���	3��8��z�LY������AQ����������_���gh����=�zK�7����y����a������������u����[q�sn��h���@����&��c��� O|��i�1��G?���M~��
�e~+�I��4�/=GDDDDD����X���b������mM���(!(�(����^4���h�����D�)�b*�?y�1�Z��?P������O�7� ���7|P���3#5�Fb�O�F	����0�w�=�L+��[l:���Z1�����$r��s���y���v8�0���<��������@�c:F���Ay$�u�����9C��yCQ;���Q�<�H�[7=E��b|C�7k��O���'�|�i��������b�`�:�������n�i����3�gO��A�@K��JD�|d����;[�#}�h�M)��� xN�wl6b��(�vB����8nRDw��X�xN]jwO=�sLXtZp��sg03#�z��Zb�%��������B_�&`%�x�q#�J�^��G���s���!�g~��o��9@��}�{w'xn^��/5;�(���q [H7�/t�Vm<#�|%��N��B=�%#��;�������a�w&���}��e����?&�@�9"""""2��P9F	���~{4�� a��	(Oy�(�F�����wL`�iF�p:�P�q^t�$���
����^3PO�
.���2�f��|d�M^5�e��-��4�=�T�����I�7�p�v;�i����3�N����<�0�PO��I��WY�Y����E��4JQ(D*���p�h\��J��?od%k9"���C.���X��i^�����0��^y�����0��u�]OC�L9��7D? ���f�������N��wD�'�����:�'W+F[�D�
s��'������Q��r�1r��)��5��I�w�����6�S�n�����M(�������1!�9�����s����#���N��5�����9���3������g8����6�L�$�8:��7����5�XcZ�A��{��M�H��|T�ygV"��= �)k�U�A����������`��MO��D��D���jQ��)::>��M�#�q��7N7N�?���Ajy�]���I������D~��:F���c�vO����sDDDDDd����:(�IA���3F���H����|�<0h�d���t�M7MS��(�yc����` A�_y������z�"���1\�/R2�`�\w�u�c4�!��dx��R{����a���G�^2��?�9�s�#R�� �v�a.�N1�7c�m��E^ax�xLpXn����y(�|$e�KW�9q�
JyO~a���{���@$pz�2#	p��d|���������7��H���o'�(�I��|~�������2����!MEC?�Y{���3Fb�l�|q2���W���4o�g�p�e�55�@�]w�u���!F����w��o*�f�$e����)�q����w&��6�S=��8=��Z�_cB�������BO�sSd
}F����E���m������3�3��)�!?y
GdO�<�9�;�
�T�'#p���<�NOeM[���������k�5~[}���E���f��#�� ���������qsO�.�#/[�S_��KOeR��/_���1k-h��������eJ+���/=GDDDDD���$�(o`��s�E5���h}��WN�`�>��[#T~rOFH�����MG�
F����8�]Q$(�[n��t�Rf��u�Yu
2(������e�a����@]i�"<�A���'(o��^�OR���$�
6�`����Y�-o��N?���Q �����u���������ad�i9�V(F�����L��,�F��@���(���������a3f���Y{��g��]�8F���0�c��0r-�z=�����g�=���U���8p��G;�M����p��u�v~��IS^S���=������n����/�8���}����O��2N`����/���{`���M�G�m��&5��� ��K0�;�E�i���K�N�c\���5�\3~O ��Zk���\���zFR@�]>
���y�1�zTo\��9����;���g�9&,�2�e`yw����L���mfbI�d��j��
����&	��G��s�'Y��SC��:�BGz���?�^��K�O�C]c�����Z>Z-��O��T���������n2��O (��IC����z��{���r_�X��
����Q���h�z��$/�M�}_��h'�m��(�Zr����������i��6z�S���w��<F��*/����������/��z������#"""""O��2�������(((,5���`PA�@�����/)\8>����G���u���0���%	#����h4E�'
(��x�}0:U�������+���H����,��=ATV2H4z����?���@����G(��(����(��;��T���By��'�r�L.�����w������O�`���#���3u������f�r^~ft�e,�7�5����zy������@�Rwy/��}�u�����;��ST��
:e�A�k�S��bp i��c���^g�Sv��p,��������z�a$��F�.D�%�N��q���V>���
,������4f���:/L�M����[6���)��s��S�?�G�1��4�e4[W�-#��2��%�@G$P���[���M=J.��G>����_*,�S!-Q
�	�� ���M}������s�6��F2�4S�S��M�*" �_��/Q�����)C��r�����r�wD�b8��uE�G���yy�;�=/O��C��7<�� ����]�|9��M��|�K��d���_�8�B�����-����'E����h�<<�*�����k�s�9F�%�H;�+��"�?�)��~���3����F���$�E��}��\rI����<���CO�>�����<�zVW���P'pP�	v���'���K�:����F���R�	)g�
�Ur����y��w�����g'���;�P��!����f�|����z_�d����&�r'����"�R�;�r�
u�H+ik���X����O��$+�Gy�|��S��O���4Gf�:Dt+��t��{��T/�����h?�5u�6F�y���wdP��B��W�X�o��R������1y�S�|O�����n[���|��gE��������(/o!/8��ei��D�2^I�JY���x"/�Ic��{s����5}<����qu�<�N����p.�K�����2kVW�����PDDDDd(3��INF@iD�@�A�c6&�
�$���n��
CEE��!�OR�����������IIC	����P`j%zk�h���h������W��;�`���8")5�(�(��	�e��T��
��BRj1h`�a��bY'8Ny�|'PZ1Xr(���8\�P�-(����$�xo���[n�%~���A�{>�����2$/)_��/+�'����[cy�������u�]���s���f����dL�yE=�W/z�CK��H^����hB�KF�����*�h�NQV��r�@����1�&z+�i�p�l]m���w��!u%���>��$o�m���������'�O*w�$�9��T�����;��s�;��,�i���g0fR��W���,o��O�S�C�q><yG�������z��h�'O��4�Q�B�E��w���.������-��W8�w�9�o����O���!�{"Sw�q�ir7��GQv�3xr/�c<N�����BySoR�9��@�n� g�A�����n�&u�w�U�>�2%?���	�l����'����g�U��_���Ho�)_����#���������I}%�h�K�B��<y�|����O:��V��n���V�m�/m�YG$��2 �)���+��y�-��}O������k;"�o~���ToA���Pgi@�h����dW^.2��s�=�c�V;H��b�-���&��=��Fg�Xj���G?���(��}��'�^��|��\�S���s<��\�	b��
R�������6����k��M���)���7�[%����v�=�KH�E���R'8�4��|�n�p���<�yW�#|oEW���stD�����,��n[E�C�P���>
&�t��7J����x���~
s��O}�S����IJj�7�5
KJ�����%Q[	2>�A�R���?
�|y�Rd)k�c��1l�d����!���0t�P7�~_��b^%����~�6�a!z0�`P�z��c��F	���_��{������+��I����zr�����p+)m��h��RP@TC='$P���E�����w%�,��1r-�s�{��6#��qT}�+_�N�b����-��q^"p����	��g?����F����S���{���ZP����*�Ez�`�+��A�D!���/��5�����`����Gz������0�RN�e���z�_qF�}���a��w2������>�vK:0��<��(��us�
7lX7�_�)e���|�>�2�����(_�I���;��b���O��K@��H�i,�cB����(�����0�;�
i�j���g>��(w��
��K6���>#�\�|�#(_���y�%�>�L;:3��`O����g����O����>i&��E��z� �B�:��iW�w��)@^�?6�w����)���v�����w�k���r6�r+�,�<J�����#��C���v�����g���[M�4����(��|M�K����P�6���sk���F����#"""""���L``A�����b����r���[f��2����U�k+��r4��'�x.Q�o�qT��Y����%�9(�E���
��H����y��/�<	��DD&P(I;e���E�L����~�7�z��6���f������l�T�0ja�I{P
�����r�@&�(��1���#m�m��Jn{R��/}�`���=xw��a�n4*�b�!m�DDb�`�DfN�!���t���g1�<���;���kh{)oh�,���\�V��d�#"��H�v�+=�8�����jQW�
y�|���IA������o�y4�6#C�\��������<;_�i��7���d�F�`�����K�}xv�������<B.#�x�YE:Z�����>�����<N�3���<M}P^�"�HW�O��o�8m0z����K�/l�?i6"2�=��zyi�����c�R�i$��#�]�i!�S�)_0����%�(�w����]4���~C�R^�-�(�F�:����f��s�cL��)������Ph���M+��U���l�}i��FD&�'c1N�#u3��������
��������v�Y���wDd�2���T_���Zz�����]����=�7\K�����6�w��J��F���3��<����R�i�A��|�k�t}^gIu5�����g���5��f)���S��F����Ku��7J��HF���c~�E^Pp���8�C<�	)��2`�L�iEWK��v�9FD�����,�L	����brPBPNQ*��PR�o^q����$�,)��1UE#i��	��+��\���������==��d#�1"$�$BQ���4��')�z�B�$_����QR[-k���C��@z��#_��lY�GN��;�����:�D^���Ik��e�=�����C��1��v�I'ECl��v����:X�b�h���>����{5S�[�S�a��I����$������-#��|]�������L���4%���M��_�~����2$��C�������3�'�/�U������O�^�<�������=�}���Z��=x�kt���i��Pl��m�U3��shW�LyS+_�@�����;���������Y�O������#�[}W�Ki��'����_�z�����i�^&�O3����t�)�g_�z�\k�S�|}�V�d�]��y&����q�F���5�x_��l�%�xW�9��<��V�7��DHO+�Q-��|{Np���yN_ ��E����*+�����G�7���*�3�8#.�� z���oG	�Ro��/�b^���	Z�I���z$9�O3������Zu����������f(����+"""""�eP8"�=���u�YQ�Dd9��28"C
�������Q�(1�,#DDDDDd�R�)"""""2���Qt���u�6Y�J?�e�i�&�c�7c�O���F�L{&�T��ie���#�<����7���l�I������a�����
��7�|3�y���o��{�P���=`6�x����V�����a��Q��V[m�#��������W:
��O���Xb���
)""""""""""2�(U�Dp�A�UW]�����}�-�;��S�*������{n�[���n���V[��mx����~zx��G���#��{�V_}u��������q�q����{��\s��7����E���d����^:FE�u�]��_��*�����c���sf�������O��7�l����+��b����=��a�ws�1G7n\����������������`o�o�1:^�Yf�������HZ�4�0���+L�0!FE��b�H����w�y�����u�Yg
gd�\����;;;����n�����'N7�]��y"""""2�)"""""""""""""m��YEDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD������S�dT���\W������6S���1"��dg���F��_	/�g��}�z���\g�0��~������qV���9V
K}��EDf�=qUx��g�����s,>��Nad�����rj��V��f�Y<�-����V���tD��������O�9)��T=�v*a�Q�p�.��K���T��o�a�3O�P.W����������?�����GDdf���C��33�2�z���f	��w
����z@D������p��������#�eDGg�|����|�zDD�$W�4�����m��
�o��.�>���a�QM
W��?F�<��52��,�o3'��_��'�?����v�U���[o�.���p����G}4,���a�
7��G����::j�^.���>�������/��]w����[�m��&�3�<�3��������p�W����/tvv�
6� ����a���#G����^�L�n����\�����?���2� r������"��t.�d������fN������/9��o~��a��Q�_��M�����p�]w������6����g�	]tQ�������>V^y���V[�v�!,��"�3�K_d��}��������~{3f���n��a��f��9����+������$�S��h��u�L����':g��_Js�S=0�A���X`�8�Hm7��f�������[����o��������;��f�(�x��7��G^z��p��G���^����0�}a�����z������r,T�9K8�?�,�Z���G����E�S���o#S&��Kd��V[�����>v��h���E�-6�d����p}��'��\rI����e$��5�X#���.a�u�ii<""2���QF�o�!���t������<����^}�^^�����]vY���?V[mz������������;/<��cQ���W�q�c@�5#FL���&M
��vZ��~n�����s��7�|3<����q�wDg��/\��]p6��'?	'�xb|�{��W�#�<����`~�Yg�^�./N8����_�"/����^�i����'���^[g�a����)�����)�����l���	
3mn��V�N�|���q����sx��������Uj����k���{�b]]]��K/
���w�������!�?�|t,�x��a���,�L(�J�������g�uV�#��rK4@2������r+94��3��������$-2��Py���/�HeJ�Xl�P�u����������^��8��l��Fa��7����?;��p��gN�Mi�������>�����5�9;��c�����N���_�����>���������������t�m��<,9���#3�����nm����tM����_��rWk���kU�\$�b���NN7�5�M���_�4}����I����6V8�BDD�
���~���,`&�����ix�UW��}�{����?�!��0#��.���ob�����s����?����@=���c���.���0���������X80$0���x�I'�����D]��0��g?�Y����b���2�"2����d<��S�Cq�W�w\�T�]��_p�������fQ����i��&�%����_�z48r"��E��!�P�>��(CH���������������~OzEd��1y��s�A�s�d&"*�d��\r���_�2��l��o#�O�{��M�ud+DL�0�z�6�&S�����i����~5�2������|��M�E��mZDf��l'�����J.�"Du��0)
��=Dd��#RDD�
hz�V&*���-�\�B�c�=�R+Q���W���8�r�D 1?���Zk��]v���"�q�>����b��#�H(����_~����&���p�=�T��&=���������l+��B��$�����?�F�]�JD���8��Xb�(>����H�"��[��V4�!��
�"����q-�%"CV]u���^{Eg$�D8<}�!��/��b������d��>��=E&�H�"2p�7�|1���g���q�m�����LV`|�YD�F�>9��hk�DC79���Hl ���A�62�V+�|�Zj)�a�����i��P�6-"3����'�G�U�qI�����e�:�A��p�����
��6~����l����bV�s�6�t����\K4%�GcK~�S�����$���;�����D)�9�d	F���x��l�����0C�kDH���6�,l���q��������7�,�""=�3C Q�����+���[o���*��%P�pL`�c�"��{���������+�����$f��Doe�\�9�}�?�I2��sO��G�Ed��m��k}�=��~zc|�3��m:��	�_����ktN ���:�����o���x]-���3�����1���w�`�Lc��ZiO��������yl�"2�@�a<���1)��@~��0��l�����P�Q��� �\.G�K�����)���c�"�g�9,-�}��w��m��6*�,o��
���~��diUr���/~1.qXoi#,��2"8�� QP8�L�2]D{"`�yA�Q2"��8�<�lx���1
��qva`����<g!��w
��Y������%�pZ�f�*�9���'EjEH����pn��u%�p������{����.��ev8�����LI7F��L����N���|~�v���O>���y���h?s��R?���[���"�����E�78����q�7*�������k���@>���FA�&���Hb�B-9�^M����|L�V�r�}��!�,�H���$�)i%�"-��^s)�-�s�s�1���iwI����a�TOH�QGeA+��]u./#����V���D�$9�������z�����]�|�����g��O�����u�1�Q.i\����c�>rz��H��~)���
u�e�y��>���M�-�=���c�=�8�d*���#��"<��,��`�BO��������9���z��![���-e���<���lS;.��
�<�����]�I��rd��|�;��v�O���Vl{��M�E�3��4�2O�2>��X�^���]}Bj�������UY��T�=:c��X��_�8N|��'�����L�i��B����/������z������F��D�Z��D���y]IDd(������""C�=����1��,�@G�z��m�����NGyd���r`�P����3����e����?F�=Fu�4D�g�31�=��c���~?��O�������:���	�r�G,e�������n�)��}|���G���z������ �����=Y.������������K�<�e`��(����a#!JKA���R'E2���2P���_���+Ex'��%$���r�-������������L���}��e��@y�{���o}��R��E�q _����lJf��$)n���cd���D��Lq������]��'8����(��E8c���������
S������(��%����U���b~�6�`�,m������s�9'���^8�3�;�0��d�.{'�����~/:��7%�N8�xJ6#�:�Y�"R��- ��)��=�02i!��B���1�������eh��!����E� �j91�;���3��w$?.���XV,E�d)��_��WtD��X"2���[����$�>�g�Y�3����%2�4��u�-�rR����Zdr��(��Kx&�G��D� W�����~�Dy*&��N�~�_:�|(��8*��W���Y��>���Hu��DY�.��|�eK�3��
e������]Pn����Z���}�������/�>����d9N�k��	����D������|�'���T�-Fr��DH'S ?0�2��e�y'�{��%������1.�G.}9���1	m���!�KYq���y���a�g�g8���|�������7�i00v��p���V��/;.������V����	���/S>�i�d�R��1!m!�Q�S����g��i(�9������by����}�(�����`zk1�H�������p���_���w
a���_�NodP������u�i��F{�m���J���(�������!�+�m�z�&���a�����z�8@S�O�,��g�y&�u�Q;�/���(��Zr/:r�}���+"2T1"RDd��p�q�	~��q�������6J�%�$��"(��T���^���8��������Q�Y����/�0���b~/�#����I4 �F�d`���|%���Y��!����W����2I(���0�l�j�2�}��P'E�����Hf7�J3`�G��pH��p,`�do9�x>y���3�=��8��	�OfgR��q����e��"��Q�������tr-��@I3S�A�%��>����{����)2N�C1�������7b�Nr����<��(�"(���N��i�(�(�(�D[cp�^��������rM��	<��x���>����c;�p�,��4����O|��E ����8��?��
&9@�L���2������81��GI��/�������o�1�1��S����o����.o��-��J�Cv,5K}�����RO���Q�8���O��!c�d��@N��2e��?�!:qd�d�e04c�l�^IsP/(kb8�1,��Swh��9�u���9E��Q�)Sf��~C�0.��Z�E1���N��|�����E�Q��y�X�B��(�7���TLm�I6��1,��:��
�L�UOp.c�z���N;-�'�O�	yQ������143!��!q�0��i�Ez���S6I�$Y��������_��<������q
�b���������I+��2����i\F��3f�����D��d��G�I�@7b�c��W�����Y�o8�?��O��E=�;nq"3!�6V$�i�81y.���o��ROj�7�0��������M!���a�
;��wn'����[�D���t��w����zZ*ZDd��#RDd�aP�@��eY������(���V��L���,�GK������01c�9��$30fI�Z����@�9���G"��4������4�b��r"�xP�d6!������I�&8E��,����c7�4�M-e#J/iFa�;�����A�fSF)]�O�`�������c��L�
������{�df�(��@y�oDi2���e�@�� ��Cd���-�%r�&������,���Y��K�,WG���1��w����
�
9@~c��P�I���@��R���|c�A������u�1&P��������y�<h�
��!c���cLfh��'"u���g2*?;�:J=���fk&0�a8�9-w�[��t�Z�I'h���4���I�!i���)O�w���_�����[��"�\@�c�IeIY#�q��GDs ����:w�������kw�e����~6>����L�����{���%�C�a�a�L�NH{�^"��o�w�7IP��%�=��ZP�qLp^*3�#�<��{��@����/�#!�D�2G���p>�g�IE�{�,�!��G�-Bdi��yy����<;?���������YM����(�"�������s�y��g>�p-��*�/�,����!��KtT�v������I���$d8���S���(/�%�&���]�������Pj����,���C�\>��i��-�a��v�	�����%2�r���;~���v�
��v�,O}	�;�1�Il��7��	��m��s�����S}��=����~7NL��wb,J��-����x�v�X=A�'�_��{���(n����H���(�8�P��J:��;l`r^�N0K%%=)�8�-���Hb�w^y����6�XQ�Q&Q�r)\K��)�f@QgI/�+F*��(:ye�������l��0n`���_�H�Nz���9,#����d�$
y�w `����[�C�2��<#
�H���#�W"0���JN\�!�%� r	#_��2�%u��<����e6q�(��KfJ
���)�N%�&�G�b���c �H�B�o��O9��#b�vT�x��d���(+�E�	�X�{���D>�;����p��:��MI~���N�{OPG0P`$�o��8�������."0P�y_�����-�wl%z+C�}��V �iC11�0�?��v��Q�u+��i��F#&���hs���a�x��+�v�9�B�~���iN�g���R�B:y���S[m�U<&��L���IJy���|�Xh��Z`����~�2����i�,Q�3P'�/�����.�>gC�\��!��s��,%��Q����p_����BN0>!��G�d,�HC�
�,ULu���l�N[C�a���6r�L�h���<b|T���*���Z}8�M��I��M��N�$�A9�fiw���y������ilWd��i��V�����?I/zK��$�0��/O=�k��'��)��,�����XW�����(�JY���C�G��|i�i���v���/o����z�D�6�z������R�#-���s�ki�a�h���t~&k�'L�M�<�(�DD���R6i9 ��(�����An�0p1�Ia�����}������d]%��P�q@��T`�R#�Zd�me���8!pV��!�A=3Y��GC���?�E�AD����CT��2�1
QZ���0����(,u�;�78�^q}��aI*�Z�")'��0����\�����3Kq�$�Ar�����	"�^c)���UO�yhSi����(;f�������>eY4�%0*�U�&�O��16������V�C~���������{�f0�c`��#�'������,u��9�>*DTP���Hoe����d�%�������c$F�d(�+��7�9{���w�E�#f�7*�v�9dD-I2���_H��T/�`���$��|�PNY3{���\0�1K��"�St����J2$&�WK`xN'����K���������N���>��a�Q�K{$��+��K��x��!B�>=
�Yd����L.��������'�����A�	 8�J��z}8�'o)�"����)��9�K�D�!o���i���@�$2�s���0��4�'�q���w`��gq=��'P���8�R�Lc������2���l��$�����fb�e-'?V���'��F�0��?��G�b<�3Y���v���:V-+3���1��Hk�������&�k5�
iv6AGy�@����Bg�B�I�E�k�P�`��=��%#\=��Av�K2������Y��������	�����`�"-((�8�C�k�wc9%o��EY�����`�M�bL:��N�GQah���A4��Q�0f�����B4���ziF�/�Q,�(�� �(m�i22{��c����=)�v���
m��I��B}���S������3?E���:���,�F����W��7��U�
3�i�X�YG����nDQ��#2���A��P�q.��Xj��-o����6+���s_�y�p��*q�N��k=C>������|kW�+F�6C�l�3��Z$y$��<�o�������j��i/!i/�h�|��1�u-�"�Vk94�`�d�M&G4��H#K������M�9��	d�I��+����l+}m
���z�)�I��Tk�Y+4��s�		Ez���S6Is��V�8��Cb}�M�D���Q��m�7:�Pl�����+����ze�k;��ZN�z������z��q�c�b�;�%��m7�!����or,2�����>_��Wc]c^o%���NyY��D��;,:!i��K�s+�IDd�� "2�0�fF-t,���`�L3���p#��k��@�41�������qO�	,���@~� ����1�������� 3S���(9i�e���������
�|�	���7)�Cr�5Z&,-S�3k)a�;?���bvg��x���F�N>��k�kh�� ]�����%�����N!�P�)�{"Np�5���*�|�k����5�x���G� Fi&%$�'p�q�$D1"�,��5���_��;�F�����q�Ix.2#���t`<�����x��o����
��s��l���7�8��@[`�b�5}&��������������ri���y��P�X������>9��`�	��fF4�K����|�1�_a�d���d�`0����o�q�V�=�A��m�/4���U�����)��9�9��M�H��1{��������[��b�n��l�v�	�`�?p�KV�$�)�b��{3e��y�Y��}�kk}�S��o}msE��oc�����&2������>c{���RMDd��i��@�QX���C�����U��Q��3s��|>J��{o`@��Xz�����e&>�
a�a��^"��3GF���N���w����
1����� EE���#9IHwq�1J
<f>�a1Q^Ia�+<3�n��?��>��Q09[�C��5�QOQ�w���{�!����??�|��q	c�!����F3��I��Q��e���V��S��7�k-�D�$��,��r��_�^2�"�[�!��d������'�W����P��}��Tr�)�4�����v�-��]D���K���������gvh���zj\y��6g�yf4���.�D�uT/j�?HK~2������t��"��d`��z�IEh��8�	����~2F�����!�,LVb��x�h�d)S����+�E�A��'K�=�A��h�m�%4��S�����o�l����b�e��L�����S��w�u���so��M���6M�1c����f�>��`h���>��:�iK��[�p��ui����}�>8P�d�F�K�����B[d�d"�q�����/����@�#RDd�a�/�`��#R���l�`6>K�(x&�|��j)8��>
yP,�>��8�n��lr�aLJ.��2��)b�FD���S~�4���C��/j9x����������R������1�����k�G����LR����8 *S��v�a�}|cH=#��,y��V�0���9���&3�Q���M>j5�G�9�[��tC�cR��n�,e���|���b��(�i'�~�C��b��C���K/�}/����d�F���33��^�$��?�&�"C�[
#m����v�>O�
�M�\�!�6��TDZ�'K��P��*8O1���V���)�&� �1u�|C� S�3���v�N��6�X�~�	NDQ�p���O`kT_�
c���W-�x�S���s��v���c,y�h��-�z���o�������Q����FQ�|��4]Bd6����a�I@�����+������'L������M�3���k�����8�(s�����=}qO�-���j����b�����J��7>��d5t�k���z��D�`�?0�KVP�������W\����^���2c�FP/���G�T�u���m���O����>~����}�)��"2\�)"2���(}|�O:�0�����FE��%
k)��o�����w�Z�x(�8 j-w�l?�f�2�xw�����w������<50�s�-��b��H�=���-:E���8p���_����Y������t�M�yxWf�4��K?��Lb��[-�Fo �H�{��"<�<G��������SK�$o)����:%��?8Rx���#%��D���������5�2Z�8�)�b��'�7����@���IS��G����oD�2H������h����")�!�+u�I��\��RL��-���}�!�wr<��->�v�}1��.�2�s�/�k�
6�N=d��"�1v����a��q������h�����,L��Q�(#�`���U7x7�+��.�M4e]�PCy�|C��(�������2���+��q�FI&D�6�iu����?�~��d����`������|0�"���7�R� �<��xO��E�
�������B432-�kQ�!��_������o�l������s������~��b?:��6�`(�i���1({�[��$��_�����@�	��C�dE#]��X�AQ�s��9/��~��6�����I��w?�����L��7�f0@Z��8!���j$lIa�("��""��
:�:�?���}�{Q��Q`�FQ�����D	�T���r�-qp_+"���N�u��$*��$�\�}�=�{��`o���`�K�p�	��\�����Y�8.p�m����9�5�����DF�L/���Gq/"���D�m�]t��gz.����� �#�~�EE����t(x
��s����7����B=!
��4a�����Y-��c�.�u�]���kQ�p��@&�+Q����'b}��/~���������G,_��Y����f����\YB)�is���,�4#���`�
{��QaF.�z�1�r�&�>�EEvQ�8�����5f3��zF���B�b��vZ|&���L��.�q��s�{�/2��O{!���\�En�n��DV���'�F��g�}b[%�<�c�X|6m�'�k3`��e�]��s�N������lH7K}�ny>yR���s�k��7�i�nP�
O�����#���!�9���/�����|hW�J��SiFA�O��^�S���udmAA��S���C�'h�8s��N����	��!3?��/U��8N?1.Ic=�/��e�i�z.m�%��}x�_�a&�k�Oz���S6I���IcR����@YR��id7�COQN�d��t_t��2m�|�`�c���O���
�j3VA�c2B=�O /��g<��y] �r�����~���	~���6S��1&�����{��}q���G�L�	@�0�e�S&�&�b0B�(����a���>����p@G��������w�1.E�?���������x`tl1�/���%`�QS��/c
���Hl������%GK#b<@	���������0���?�NIF� ���(��e9$"��	y�!��GYaA���~16py�r��}��7����;�y6Jpz.��% 1��TJ��FT"�;��~��
!�?�	x�qN��V������&�7��xO"��]L=���)7���_�����-���2��{�}�p�Pv�KiQ7q�P7QQQ��P�2��������{����<&�isi�c����������I>������R����Fq�XX�e>S[�~q>��kY�9��	9���c@��a�?�v������wc;����8"9���.i���~(&$p.��q6�������>P�%��l�{<����H'F�����;�>�tc������c���g�4d�d���^1�S����tH����Y>��y&����]��0}:�th�q��n�|��2}
u�c�=��^{�XO�A{J��9U��k���e�q���`I|��i��@��tP��-���<��I��\�/��<@6��x.��3�}x�_�GJ-�������Iz���D!�QE����Q�(#���c�C;��k1Pm�/:@o�6
Dq|����?){�:c�?�"��O�����KVPX�?�u�O:$:0���Yt	Vw*�Mt����6�C���<���y�%�ML$��2�������
���I�A����\w�u�\��������~b8�0�i�����y�2���>r���o0&`�&
�f����J���v�m�gO�9�-�830`�F��@A�Kx���98��
e�k�u����bz�Xc����N��k�F�i�3I/�f��X%Ok���g�����J����H��[D�A	�+;�JJ�pn;��Hi����!�,C�cC!i����m�M�~�����)��1��@4dr�_��Wb��"�+3�1QA����o��"���E�������@�&��		D����7iR�=2!u�v�>_�j�h��1��-�9!�F=*����q�����geQ~@oe���I�%���o��1=i�`0���C�%�0�������feu�i��eR�<hw�?	�G�����c�9��S��@�9�c4�L��4,���k��w���u*}�<���w�_1�>�9�	�#i�G�3b�u�:@�%DFPq2V@�4������;�O�m6���<�~3���L"x�W#M87��B!��A�������=#+9Z�w@�2�A�!�_2������z���K6I�P��!G���6M����8��	�X��"}M��@�����a��4ct��1;������8��c}��Fy7P}�����]��v�X8�1�A���C�a"�a��	cM�"���	���<��S�S�C�8��cb{G�P�q��?�|o���?���P�T�V,�������������+�G���Y�@�
��AQ������a���Z�d��\�E��iE�������s�I��*DkAWK�F! ��Qp����Z�-��s-��f��\Gzy&�EI�����Z��Z�#��W�yN
�
�������P�p@R^83�)h�PL'�%_H�/��e�*�G���x-����O��%/qD`P�X��3��Z���f�9���'�����(�>GX��W���z�C��|�?�T&b�Z�����b����&O_�C]��I����	9@�"M�v��i�����;�#�L���u�|����d��dH�k1����?2�V{�����sj�oo�-�.yW�I��.��]�@9�[������k��p���5r�|����%�0�a�LT���nY��������4�&�o}��,'������G���:����j��}���J��B��Zu(o~�=���~�y�
\O�������vA�g5����L#
I~��.��p���O�J���/�m#�4xq����K�Z�����?�,�v�[�����c��h��e�&������;D�.�)��h��������+��������}��C���������o����!l�W�K�������??FKQ�������u\O��<����H$${�3Y�~����~�V�@���>�}R��;u(�O;�������=����^[j���a�PuD��{�������h��QE����:*�bf�hQ)�Y��H���c�\��c~��0��%������PvD���}=�79�``k��c�w"�1���eG��Pb���C��[��HV�h��_tDn����_DDdff��P���1���j��zj42C"��P��w�euX�ffuB������]vY\��}y��&S����1b?"����a�@��i����%
�� ��%�Y��j?����ji'��"""37Z)Edx1������z�H�sa�%��d��Ra_>l��RF,]s������Bg�H����N;�n���8��}��c8C��{�8��}����%�E�uX�����d\����c�����hk�?��#��1�[l��e�ED���������K����������.����?���G��>��M�1��=����%�\R=�l��s�(H�����*����=�X����7�x������5�X#FB��t��lx�����[oV������0���~�����:��g?�~k�}��7���>�oC���;������q��w��s��X���S��RK-�o�k����P��c������Ci����u/��H������?�{�X�����W\qE�>���J+�6�d���hs��53;"����Cn�e���;�G����_>���a���W(��v�����j+���R��lv�����B+���[3Ec����c(/��.�[DD���HVL�\	W��������
;��>���0������e��������>�h�Hk���^a�W�s/�Uc��w�y'c_'��(�,�6�S�
���5�s���<�����2r���#�c�y�GDzgN���g�w�~��~L�81N���)S���nd��s����^^z�����OCe���mf�C�r�f�/_= 3,Sx�gT����+�>��O�Yf�%L�:u��a��	�w�i��9���o�S:?<��3�#�e�9�]��a�y�����v������������
�����������7CXvp�M9�<&�~��nz�
��r}���X���������"2��9fb�K?0w6��m������eIU����b���5*S&���o�J����gs�]�&�LH��V!bf�vTL*��� m�cT(��p��c����z�D�\n�5���v���?�����5w�(�����mz1���@{7���LV�9
����}E�[Dd��#RDDDDDDDDDDDDD��S�DDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;�JF�o�P<�?�x8����-��^~����*�����:���Na�E��Y�_|1�s�9��n�<�LXf�e�;�������}������^��������?l����s��\�`�
BG�{}��;�}�g���>:���j�_DDDDDDDDDDDDd��#r�����������SO=��&O�f�}�0�|����[/z��a�M6	�R�z���u�]�����v[x����;��f�u����k���u�]�zv����T�+��"|�;����W\1<���a�����?�y�n����/��B�����K/�s�=w���4� ��[o
�~xx����^{�������������������/�s�=W��]�X<����5�\��f����3^���n�i�����ut�Bo�������N;-�?����#������G������5���\.�K.�$��>�\sU�����A�������{���|)���o�y\�t���
?����;���,w����+��2\v�ea���?����>��x-�y����E]�������u�[l��?�9���OW�������o��J�e��O�����?>:��Yg���n�E�]ggg�m���a�e����w�=��I�&����RY���=��3.��5��+��r<��l7n\��'�r_��di��5|�x���^xa�2eJ�K���������������BG� e�y�	tP�
$r������c��7{4�L���w�VYe����k�s�����~��w�����Kc�r_���Yf�%��H����Gy$�q�1r�5�0RDDDDDDDDDDDd�#r�B��RK-V]u���DB��$����a��Q�ox������>�^z����V�N{5.�����W���}�/����o��/��r|�%�\2~�a�����:k�}���{/:��b�\�C=�8��p�Yg�-��2F��_}��x�Bz��m�����/�)_|���������/�|�h���M7�4�A����v[Xk���2�,������s�	����R�""""""""""""24�9�����6�l�)x�)��������et���Y#F����)���,jZ6�'�r_����x�u������]�����o<��K�(�3�<3,�������{�q�����!{(�s�=���o<�@x��7���W\qE3fL��n��������"�C9$<�������=�X8����q����.�����O}*,��r���+\}������|�x������0EDDDDDDDDDDDdpR�dT��AN�G}4����a�����;�'�|r=zt�k���Co�y����z��a�}�
_����1��K-2q��p�A�O<1��o����v�g�K/�����g�)9��s�������O<N:���?��W^�����='��|�����u�Qa�m����<�������s�5W�[��9� ��O)2� �����^{��p��g�m��&�w�g��|�3mwD��}��K/
_���������[o�o|���^���C�='���9��3��a���^�������~�9!0,��:"�0���R�'�pB��O~=���������N;�>������;.:��YIt�?�����)�M�D��(I�,7��="�����,�?��O���D��=��#bZ��b��ZG$N���%�XBG�����)���(|�k_��������������.���V[-�v�ia�E�^�.�?�|t�=��S��.���^�����}y���;/|�������g*����n������W���8B��c�=�G[���)S��DDDDDDDDDDDDfNF�F�Q��~tDR~����?�!F�w��.X��]&M�#"�����?<���%Lqr��/�8l���+��e]�8$��/�K���'�������~5���_�:,���8�F�h=����r���<l+��������������������2���?������o���E����p���G���n����B�-��2����q�T�m��w�6;vl�h������_��1��/����<�@���?��o��/!.�:���������+�������A
k�����v��G�+��r�����������1:q��w�l�I�
�%*q�UW
��rJ8����k�������w����Zk��|�#�	���M7�4x��q��D_�[��g���[o�uLr��2�,��^��	88���������VX!���K�R(�'�|2y������
K-�T�0$R���+:�^x���O"K������9��y��p�9���~����b�-�y�<yr��������w�=�5�zU7<�e^��n��jZ.�r�<�r9w�q��O�K��t-�J�_C�������xX�����/tP\����EDDDDDDDDDDDd`��QF�oD���w�y�z��VYe��x|���b$����^;|������_X~���sB���-�\Xg�u��1c�u,����������a�9��^�.,����;�������D\"5����y��'��~����d���S�+�����o��{n<���w${J�����������������!K��=:.�:i�������������zVm8���_�K����l��\p���c��B�e|����#t��V���jo��g��	��G��/����EC��������%kuB������������~tD�������������H��~=O�6�#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD���*��EDDDDD3��P~��Py����v1w(��E�X|���t�'�������W�0uL��F�7���7Be��o����~�c�O��+cn�g*�_�~�����|;����EDDDDDD���)"""""MQ�p(?��Py�������K�P�*�^a�|�c�����~B�l��O~9T�8,�_�:��og�/�}��C1�{�o���B�
�	e���i2�]��c��B�����O��C_��2��&���fi�5t,�{��_��VDdf��������3Y�l��+�#Bi������Ci�M�g�`���&�C�����3��C�X�3��#�'�F���C���d2���^�Z����k��K�g��B���4�2����4���1/�*����}�s�P�k����!��H���H��_Ce��U#��P�c�PZ�����U������C���A�yCc��g~�]sg|fi��Bi�o���VO�I��C�#_�r�4�*�c���0j��x%T��o(?�SN
+�4tdr���?*�F�J+�2�f[>GW;$T�����FT&<���6����c��f�Z�����f]:K����_B��o��R_�K��%dR�z��Y�\�\��i�@�������Ed�����s������������Xw�(Cyr_w�pD(��M����iP��}��%���d����3������w[��A����B��c���J��:�8��c���7��������`�����3���c���g�����P@G����;�1���8!_�Q�eGG��;���9[���PZ��P�e���HrZv���4r����B���98�z�c�_�����>��W��g�{Mx$����g/�������UC���4���O����]��P�g�F.*Y�K��:V;1����DDfB*�	]w��x�*���E?�i�(�)o����*��J�:�:;:����hw$������1k���w�2�8K�:��g��T�����.�F�:�����u(?��P~������q���;���u���`����}C�|��!{��x���p���M���|�^��},�����.?��Py�?�4���}�w����o��K���������G���1��r6�#��d�	�c���Oi����?B6���#�������I�3���a��P~`����f}�����~@_��!d���%���3TDd('{��=�{jn���k���'i��=I�25��#Bi��Bi�/��<�T���x��o`�J�O��[�������������B�����f���b�	~�z���8J�~���i���J%t�zb�X��������{���k�e��U�����P~��'���C��g����:�:/o*o��O�=�m@\�'d6H.-�Kv���3�����]�Q���/��4����q	���+FCK�r��F���������%�t���,��T&w'������y7���0r�P��:9d����g�����'���]'$����v����{cu�xQ��2��Q	�����@T
�	�����RvNi�}�c:!Ed�S��(K16YX�g�P�k�LVoJ���9O���I��7��d���{i�����{��������R�o\�o�(�����8�����WD��s���;K��������d�_�$�_�[]�wd���L6��#���G��W�0����r��B���C����9L�.?�������>���y�y��e�6'���'���Z�W������'�����,�]~���z���>&{�?��Ed�AG����/S^��F�K�2��Ei����^d��[x��8*�gi�$so:��Z���H�Y(-�����%���W���na��1��c�C�������>�+c�
�L���QK���+�%�:�X%���&�V=gL�ss��4b��c""3��7�k�:��S��E��cZ�x�l����B����9��>���Ce���ZK������2�[?�_��s�����u������Y_���1.�=b�P~��P~��Ln��������cgd}�
Y��O�/�[�JDd�����=���@(��v��:�\#.����	%%�EX`�8���o��@n���y��B2y��-e����}4J�������	0�����P��|���=��w����DDfZ����$�zLw��>�]^���5��,����y<�������6������4G�X�����wBi������u���$�8����KtD��H�
�v�e��%P;s{pa��s��j��B��x�4����,��3}�K)�m�����v���M	��"���b{�(�<q���9{�L[�$E�5S�;�����2+/�-T���F�DD�9#�Q4L$�r8F��[7er}��%����m f	������������=�B������dv��gB��KCe���<�5T^�,�OY~��YB�w���:�J�^�K�Fc5�K��q\����IY�|���%�	�X��qY�����y���1���z�!�Z�P2�q?��e�B�Z!Gyb�_�c������I������F���_���Q�o��������y������1_\�5L��/u@&���""3�����$�:���q�F�
����q��&�}���Kf���Psg�qr�QnO�^��qk��B��e�{��WtD��H��@�c����5��{�.��!��{�d��!t,wX�X���{�k�n��,T=Z�w:��a6��\�e�e�*����P�vG�%C���h$'���ScT
�5�q���N��^7t,�������""3+,����!L|<�����}w�Ly=��\��s��u�.����fr|����X��	�_���Kl:��G�\�����%q�I��\4JG�&d��c�����������s����U����&���q��/u/C�����\3�������T^�8�Ks��������,d�����2�.?yd���'N$��)*�L�����5��[���	�%�������/�_>=����2�dc���q��c����G��]^[Dfz5���I����h��W�k��>+eR4z)�?V���0�;K_��4�{j��t������������9���v���������m�}��/3�_�2�vd�m��6����lf�D6h��vi(?���w4x���#����,9Cs���#z&t��=�C�(1g��������C�SG�h�U�
���1f���Z������Fe�=}��P�e�PZ�[�&�L��k\�q�=l&�*�_	��w�>�J|8t�����o��c�|[��+��;/t��9w����m�����^g,'����d<�y!����i��v"c��,P��x���qBI��O��z1"f����|�Py����8'k/��|�n�'�:��f�|���s�B'W�e(�Z*.X*�B���=X"VDd&�W��[��]��_��K�}�=������;f�r>2"���^�h/?�����������7�K��}�gY(��4�DdH�#RDD����>:c������0=�S#h������mp���Z6�m>"���Y���k���z|�������
vK�4�f1j���h��!�����C���Bi��Ugok���|z(?b���qc�M�+~������~:V;%Mp(�F�#Z*��{��aY�������,��\�lp�~4��[�i�������*�������(��+g��IDdf�2���Hd9�{u,Xo�F&����f\"���JvMwO����SAd<�����b��F�4&.�=���4�V�4��4��������o��V�eZEDf6�4��d�V'i��'���q��;�f�Y&;g�����Hv&
�N�;��D��^y����?��Bv����"2��)""{-N�f�o�R��w,�A��WB��BX"h�i�
�)����m<������|��@y����g�������P~����I�����F��3���������B���f2t�����s���H�{�����Ci�}2��v(�>�[>�����gt����p��S�
K|1�G��]��C ��}#�:2T^��z�����	�'��w�qo�2���0�8+'�t����������R���N&�GYi�
�$��,��6	e�I��}�=>*�`r�����mC�}��7���)"2�d����}Ku�����{�v&7��v�I���'i�F������?���f2~�w�.��F�h�\��j��i1��2��Py��P�'�
�j�e�E�5:"EDd��z��q&5�o4�������4k�5t���� ��}k�<��n�s����z�?g�� ��T��4��:"T&>U=��|�������d�h��>���w�'�R:DD�Q�?�q�34:��{����~���9��5�(;*�^�)oU�C����tOP)P�tu�A_Rzod��Kgt:�T���}:V�Yt���?<KN���W��s��O��<'R��u"���R{�1���y6
�}.��1���W���T��@|�O��X����� ��8+l����������B���������� �{���8��y&{��N�^��K�8I�������'&i7��I-����������'�����8����Bi�|���o�8t,}P\�DD�7:"EDd�R{Ww�	Kv,�_�X�Kug^�5vG��gj��G1w(���Ps[��&`�2�3�z�}6�~7�[�l����UOz/�������4��z4����!�QKf��/�����Ddf!�xF�Ox,�%�����^^E*S�������i��E*;*�B�H����w�uD���z4�������0k&�G�����
F�y*.MU�7��Y?�1����9�#�ED�;�\,?yX(�_#�<���l��v���K�V2�X���5'���/t��YvI&��!{B������	Gcw���������[�9��|/?���T^�$��6	s���^����=*;��A(-u`�L|�{IB����&{�v�v-g?��P~���l�X��F���}K�����'G.���B�]Y�p��������/tD���#��n���+��:��V�,R��]��/�*��R���N@=���'�zJ��R|s��mT)>'�L�gJ�R���l���;B�_��0t���P�m�P~���=rDD�9�	������(�����Lnc|������"c���Q��Z7 �	O���WD�F�4�����������^��n��.�����>�����>���Qb��9bTN\����w�2�;��p���������m(�������Q�r���������g~����;��L��;!���JX�o����*\�������r�9����/`�f2J�&��5��H���Ks�/.���C��j�SDd8�=��'���_���N��?I������Cej�?�/��]�LwRcRK��O<R����5T�:2���2b��I��]*�����}tD���a�r�?��N�`��l��d����8�m^9�z�]*S��.���1{��:0���y���K!b14�)?�Ar�\��
T^>#���)��'�������4�Vq�*f��QKd�y��#"2��:6.�Wy������L?wl(?v�{>����d�����Wb�$Q,]�}*��z��w��k���Dd|��M_Q~�z��J���2��F��������G
�����(��Bi��Ci�OW/�������Ci�U���dK"0�}�Lz>�����W/	f�O}-;�i�B�a[<��P~��P1g(���L�m���@��%Q��*/��{�\%FK�~y����i�b#w_�2T�T�����75>��a�`�/���}������$|5��+e������l����L.������DD�?�N���:I����G��&i�S�v&�<���?9���d�:.�C^����l9�-X��c�#��	�����5���[�HD�:"ED���NH�4ef�����{���X����/�-��������J��y6���AtM�L|w	���Kd�_��W��WU�v��%�@2b�l��Y���T���/�����>�1G�%��&���R��=(�Nk�I&"2�����{��D�0����k|*c��B)t,�}�\�OQ�V�������8;V=!�M���a�S�2��L��]=�M��Y�������-�����<��L�J�.t�xt��|::���c�cc������>��]��/����,K���W�������2�_���@a2I\�o��o/�o���l��w��I %���;���������T��=�����98��!:�Z����U#���Xv�t��{�t��B���f7��^Z;{.}R�t8���`���������gZ����I�E�������l���OB{�71�	,L*,-�}�*���E�<e�����(��������T���-""�/��v(�����)��\�s��/��1���n�`��P~���	Y��}���0.:��l�=:t,wh�X�����e�bT����{�:V�Cv~6���j�z��q���l+�0�Z�4j��>��v���2��PZl����/����>	�U~�������c���#��>W��>��	�����]����\��D��������h�i��B`����Nx"�)�f��F�t��������[�s�������t��t�b9�R���d�GdusT�����|w���$:3�4��E�������8��3�cp�Z����+�V��o(?{ln�����Q�4��q�����euG��g<��=���\ek#��\\����;�8�z4�<������2��������G�*���c��B�R_����g��O�M�~��8I��r�ed�q,r����f�q����Iq�����/�����sBi�t��d�L��qe%�*�\Uf��)�C�
?�~�=��Z��O��'N��X��h�!����o����������s��������"2<�)""�N��^�E���/-�G�\��l���
D�����
3���Y����b�X�c�-9R~������Bi��C��V���P�H�����
���w��J#�3�K�|�vt&{�X`��4�����*��}�p3%�QKuGx���k�T&>��������lK��[��dc�G�����M�P��yYR���Y����;��{4��������Ce�!0Ip�����}�%���������XsIB��F�<�O������G��5���$����=I�%��3y�s0��'N�+N�.?�����s1���8�;�p���3�}_�0H�����<�s��_���1wd��W �X��Y�:C����{>����8!����%!��|<&"C�""��0��{���t�J�7 ��L]���q�:b������<������SK��:����ZwMyBvb9����8B$N�3��������4�3r�,��e�"zDDDDDDDD���'{�b�v���8&��B���q�J\��#��k�W������-��s1�a��B������sbv����\���+Sig6���n�wF��kN���J��(���zV:Fv�����]c�{>������L>�+S���]D�:"EDDDDDDDDDDDD������:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD�������#RDDDDDDDDDDDDD���Hi;:"EDDDDDDDDDDDD���*�����Nx����O<����e�]6�7�|a�WK.�d�e�Y�q|
G������������p��w�W^y%�3&L�2%�;6�3�\s�Q�F�y��',���a���;��CXk�����#�9"""""""""""""28PG$��[o�5�s�9���o�>�lx������.Zh�����G$��$J��_o��FX`��2�,6�d���{��6�H������� �2����r���S�e�F�]�&"""""""3�qD��'�|2�v�i��K.�N�UW]5l��fa�V/�p�m����s�=������������G��?�x�����C=��y���>�����R)^#"""""3���Py��P}AS�p���`�c�P�g�PZx�P�s��A�of�#���+\y�������H"��z��H$$K��1�zvmX��$��O=�T�����M7���w����=.����Y=[DDDDD�����
�����'�G�,J��:V=!��|_����������'3���{��^�t��G?V[m������p������_>�`������q��/~������Ae�]!�~e(��;��;������Bi��Ci��Ci�e�ED�H���C����0�����K��_
�[�&""��:&T^� ���������P�e�PZx�P���A*�pG�;��������K���Z�m��DZ!�>����~�u�Y�����`�������1!L|6T����Z�eP�%�Q�D'd��?�NIy/����/�\�6��e�0b���3RD$���B���0��P�����J!t���K��:���)""""C����q8
{Z~��!�s�}"ED?��o��m����G�G/�y?:����MDD�t��q�����m������4�j�o""R~�������?&W�RF-:�� ��Z�z@DD�C�*�_���o�����Q��^;���	���W����wD��$\z��a���a����{=�������O,�7(���Js�R= ""���/�����?��Js�W�&"2�S����rDB:��A�X�G�o""2���~*c��I/g2~J��AKm�\0�Y��~/���@��tT�P&L�.���p����7������H{��yC��!@6x�����EDD��F.T�KDD����'$T��o�/)�E��+�����C`���o���7Be�����5�����@��(�A
G��I����?���m���GEDd�SLK�4����?DDd:F�U�CDD�Cl�;�u�y.T^� ������K��|�?�o"2���Yg�5,��R���^2"RDdf��|EDDDD�J#��GD�8���1�o��J9���W���w�#r���K.�d8�����7������t�Q�CDD�T&�^�khP�2��+"��T��q���O<1\q�����K/�tX`����#C�A�����>��0�\.%"2)?��P~�����O��'��%��~�D�m���;��?��Js�W�&"2s��F����q��+�Y�
�W�����gPDDN�<9�p�
����
���z�����S���/]tQ������x��������������.ED�����?�����/T�4�K,v�}�0�.�!"21"RDdx`D������H����"2X��r��~�����U=����a�y�	�"�SDDZDG����@G����EG����@G��V�G�|��\p��>\�RDDDDDDDDDDDDd�1(�x���N���������:��p����q���� o���0f����"""""""""""""2T�H�f���<�����|%~���w��]���k���/���p���x�z��������������6�#'�\���o�3�8#����a�E��@N�81��%����z*�u�Y��c�
�G��^-"""""""""""""��A��|����o����K/�o~�����N
�vXX~���g�0����/~��a��7��~����W�EDDDDDDDDDDDDD��Y.����^n��������8 |���{���l��V=+��#G������_�B����o�Q�"""""""""""""2�������[o�5����a��v�K��J����3b������VZ)<��#a��	�_DDDDDDDDDDDDDd�0(�S�L	o��FXl�����/^=Z�9��3�;���	���"""""""""""""2������0��s�1c��q��U��g���������3O������pD�>��a���?�p����0���n���x.�p��������������.�#r���a���s�5W8����g��|�����2y��p�������wa�Yf	[l�E�VDDDDDDDDDDDDD��	o�q�w�}���>~�������;����_x�����W��U8�����y�������M7��z��������������&J�������>N?��p���F�#��&M�������������g���/9,��2�������c$��w��z��0��s�UVY%F�����
�B����/w�qGx�����/��r���V[�\�zV����,�{��7�K/�4<��ca�5����K��T*U�z��e�].�����o;���
�_Dd�P~�+���)�o���UOK�W�&""���6�1wV�
~:7�%��^��MDd���* ���""2=�W����`g����rD��������p���Fg���c���f�-���Ja�5�k��vt|�r^
'(�o�1{������/��rx������,�@t�����1:m�|0��7�	�_}�������RK�h�o}�[a��W���<��/�����7v�a���3,�����7����|e��by���+1
v�Yg
�sL��"28�)"2<�)"2t�)"2<�)"��A���4f���Od��1bD���cddG��YQ�_y����!�xD?���1�N������,W��~�Ee��E�~g�yf��#�HtV��<��s�M7�#K�8��x�f��})��|�;����?����+��?��OcD��G��o���Y�Y.�g����GuT�~�����YdfDG����@G����EG����@G��V�G�%W���?��p�������%H��,'�*�����?�!:�R��pc��)���/�����v�m~���}3w�m���{�H�<0:j�����g�y�ze�#����wt��&����g�����8~�9������zU����,){�E��7�<l��6a��V����������?�����K>:!EDDDDDDDDDDD����3��+������'�sqvM�<�ztx������Q��^{��Zk��<-��]t�E���l�A��|����o�s��'L��]w�u�����\��q������:��}�/�F�)q*���;�qT&�K����������������w�Q������M'tBB/���T��`C�.v��^�^���k�(bE@��z/	�)�'���o&�@�����o�����N�3�""""�.�$)����Xl��]-R�����j��%�O�H�K�H���)'�L%�*%L�7o^����Gaaa�����d�]�
6D���UY��d]���u��!%%��sj�s���d``�z-Q�^:h)AI);��o_t�����DDDDDDDDDDDD^��"%��q�F<���j���;v�P��/�~���7�TA1	���(���T/���{u��5��%�J�%���$�PJ����[��Y�&����2)������v>������#�����{/�����R��+%_����v""""""""""""�.�$)�E�4i�����,�HPM���S-�������U�D)]ZI9R����O��[��_��+W���d!���dI��U�L��4��;�������v>����u��*SR���J@Z�EFFF�m�w���	0x�`U����������������%�)��o��6>��S�*�(YJ��j������3� **��-�)��}��
�I���p-Q�gS��-��f;L<���s])!{�-�������>&O��^�-[���/�?e��G�q�`'��%DJ��c��������4h�Z��l;�"���5:�G��Bz/��������p�UW�����`c���O/����o��6�z��X�|9^y��^�Ze��5
����4���Sq�
7���������#G��k����@=�qU""""""""""""2�K�,M��$#N��e��&�A�����yyy���Cbb�
B�?^e�>����4ki��;��u����GyD��|����/��DDD��s�4i�U���C���K	B�1���L�+V0IDDDDDDDDDDDdr�	":�����������{�Z��z2r��O>��~���*xU����={��`��)h��-�{�9�����>������U���?,����A��������
?����J<����b���x�����O��{�U����~�7oV�Rz6>>o����')Oj��i�}v��%}*���
9�,�~5���H��(�z��FDD%��_���������������M�o�����2�QY��������5�+�r+�k�e���T�Jk�%	D�����n�[�K`����S������"%8���L:	�U�^��S1��K�%r�������
�v��Ee��?����^���JO��e[Kdgg����d���6����u])�*����wc��q*sr��-����p�5�����
z�!*�K�n��+�	B���kDt)������S�5�Kz��#�5""*�8�N�;vk�[�'�47���.o�]ht�c��
�-���FDD%d~E�Y�����<]z
4P����%D�����������7���Ziiii��;��Se�{*��8o�<���;��a���j�l���I{d�]�V�:t������j�2�#}&%[q��]�1c������q]�� �����x�������%�������*�Z��~P�P)�z��7[��"��>�Dtv�����#�5����:�+�b�Q�ZI�a/�f�������e�]�d��q�[��-�8�%�+2��-d~E�Y����\�r�D
��7z�h�w�$;�k�����d�I_Io$A��s���7�����q�=�����G�f�N��,}$o��6$$$`��ih�������(���O�{u��1����q]	*K)���"t,9���~�-����~�I��-QR�l����p��%�K��X|g����������X#"������������.*�7���.s����qo���j'"�2d~E�Y�����<]zo������w����O�V��^��}�����c��[��4����WQQQ:RJ�>����L� ��������8�|�������?�-���������HJ�O2,��g�}/���i�P���������������:�~4��`��|�����)�o3f����>}��OD����a���k�gm>�����pEw�'{��f~��k`	�`�]�d��q�[��-�8�%�+2��-d~E�Y����d����r���*�MJp�j�J-�^��j���T�������/q��5����p�]w�^�����9a� a	:T�����&LP��*���Hf�w|�p��)���[��[o�k�8��/55Ue8J����{�����k���U0������n��-Z�a��j��%��,MzDJ�I�m�����*������T�7	��*R�7�|��@�>��QX�F
u���-((Pe^���U��=�������9��8h� (�h���niRU�#���E9d��2�}r�>��~���9��	B���/j]�$Ou}"���$"��ID���IDT10#����������l6����"���G��W||<233�U����9myRo'=%3Q>|�v�:���M���W/�djdd��,�`�����j�*�3���?��*�Z^��K�b��Eh����>-�yz>�-M�L���������3K����|���+1s�Lddd�LK��U��q$y3�����x�����0N\���2(J5���~?,~a��eN��8�%d��q�������g�2�"�,DT��"#����l��=[�RRRT�K��^|�EUT��*W�������7��m��<S�[�V=3�'�L����~�������V�`��J��|���0t���L��r��������,/�,5%��s�N8p�k�V����V�@4����DD3"���3"��*fD�Y�*�w�^|���7o���T�K���,���G�@����/�}�������;0IDT10ID���$"��$"����\ZZ>��c|����V��������T��t���+T��?�\e����&�x�bL�8}���o��|7�t�*Z���#F�������"��?N���KDDDDDDDDDDDDDfa�@daa!�/_��<�z���*U��f�G��/`��5UH�E(}�\"""""""""""""2S"

��������z�o�N�:�[�.222P\\ll%"""""""""""""�0E �����p����� �#����^��������������\L����W� ccccl=���u��#����&��kWUj������}��f=/%%���S��;wf ���������������L����@�^�0}�t<������/�f�����e����:u*��y���o_8���$���������������3M�~��x�����];��9���^y����S-�=��Z�4i�7o�g�y
40�&"""""""""""""31M ���={��������dLLL������}�v������S���r���s�f���|;x�����C������!44����U�l6��NDD����a���k�gm>�����pEw�'{��f~��k`	�`�]�d��q�[��-�8�%�+2��-d~E�Y���3]�E����5k�[�n���kq����e���������$""""""""""""29�"���Bjj*V�Z�3f�e��u*S�d	�DDDDDDDDDDDDDTS�f�dtt4�M��;v ##yyyj����V�:t�����-Z�P��DD��X����b`iV""����DDK��Y�&#R���f����_|����;w.����p8������S���O?���>���W3;���������������L���s'�~�m�9x�`|�����������E��0`-Z�w�yqqq��DDDDDDDDDDDDDd&�D:�N�)A�;��/�����4W\q�Z��{���=����Z��7������6�BDDDDDDDDDDDDDfa�@dAA��[�
����F�V�`���������(�w�}�]�6�-[���|c/��)��233���C��
����X,h��"""T���bc��)�~~~CVVrrr��'WXX��(�W�^n�$]Z�D�>��9s�L{N$�$�$kBB������@c��EDz<���!77��"}�u���C�b������O�{��2eW�}bb"����;�_=��fADDDDDDDDDDDDDfa�Hd�"����}��l�bl9&>>7nD�5�^}||�>��������������]���k��C=���`uy����Ng�����X�GkDDT����
����:��%���FDty��[�qo!����DDT����<�����g!����"���1j�(��3��r�
�2(�W$y"��*"����DD�DdV=)��,Y���dc��G��}���gl!""o�@$Q��@$��b ���b` �����"���J0IDT10ID���$"��$"���DDDDDDDDDDDDDD�DDDDDDDDDDDDDt�1IDDDDDDDDDDDDD�DDDDDDDDDDDDDt�1IDDDDDDDDDDDDD�DDDDDDDDDDDDDt�1IDDDDDDDDDDDDD�DDDDDDDDDDDDDt��.�v�QTTd��


�p�B|��'�����c�%"""""""""""""�1M R�`|��7��/����Xm����w�}�^x����z�-<����3g�
Z���&y��A|�����O�`���Y��7o��~�-[��y�������y���qqq�"""""""""""""2S"%r��e�0aZ�j��#G���N�K�.ELL�W^y���*n��6�X�B�keV$���"�p8�v�Z�������UW]___dgg#::���������[7��y����5kPXXh\�����������������H��o�>4n���wW��"))	6lP���k������__-8Z������������������H�����<T�T	AAA�V�������Bhh��* )�dR�4+���"i��Q�jU���!++Km������W���m�"88Xm���*��f��G�'��������������<L�D�6m�3f����X�r%,X�zAv��U���x<*������0�BDDDDDDDDDDDDDfa�@����
DFF��/��?��������k����[�����O<�&M������f3�BDDDDDDDDDDDDDfa�@�����O?�5j��?�����1b�<��C�V����f���3�����/���!"""""""""""""��x���I���b��
����)��-Z�P�.�K�mMMMU��v���?$��s�z��q���Y���5|��FDD%\�]���`�����XB:kDD�7�e�2~�8NDDe�����x�_�y"��L�)�����O�u�]����T R��BJ�0�G�V=#�$""""""""""""2/S"O�R�JG�DDDDDDDDDDDDDd^�4k^^���[���-[��������l;%�[�����4+Q����DD���Y��*�f%"�������t�5
s����A�0~�x��d��(9�z���""�&DUDy/"��*"���.z ���3f�@BB"""0l�0��d��(9?  ��BDD���H"����H""��@$Q��@$��ED��+..V�����j{���Qr����a ���b` ���{1IDT10IDfe5^/	������_��z�mg���ODDDDDDDDDDDDD�r��DDDDDDDDDDDDDT�1IDDDDDDDDDDDDD�DDDDDDDDDDDDDt�1IDDDDDDDDDDDDD�DDDDDDDDDDDDDt�1IDDDDDDDDDDDDD�i��7o�����p8�-DDDDDDDDDDDDD��L�,,,���S�� %%��JDDDDDDDDDDDDD��4�H����s',������������������)�6�
p�\j!"""""""""""""�f�@�!���Z�r���8x� <�������������������c��_QQ�������c��]���B��
Q�V�S�j�Z�*����@cy����Ng�����X�GkDDT����
����:��%���FDty��[�qo!����DDT����<�����g!�������,<��sX�r%������T�T	U�T9e �s��;v,�U�fl!""o�@$Q��@$��b ���b` �����Y%�������+�TeZ��������]�v']$kR�K���"#RzC���[�h=~~~h���v������	3"��*fDy/fDU��$"�2E ���.ODUDy/"��*"���LQ��x���V�"/^�+V�lI�����T8�N�H"""""""""""""2#S"%�����c���'��3�<���������QPP�J�����������f�EDDDDDDDDDDDDDfc�@�!7n��W^y������7�`���X�~=�����!%+r��Ex��w���?"77�8����������������4����|����<y2��i���~/��2�6mj���a��!��1c�m�6c��)��
�d�L�>���/���������j�����o�=�����$�?R�����"YXX�����R�J������cG���{��c$X��Q#l��E�KDDDDDDDDDDDDD�b�@�d8FFF�e������U�������,fD��izDZ,�*eZO��t��n�=�����������������������c�����m�)���O��E��s��������������\L����C�n�����q��a���*��x������_���t��Y�KDDDDDDDDDDDDD�b�@��W�����9s���_��o�����#33S-K�,�7�|�g�}3g���W_�����4+�	��Gd��u������+����K������S�������o��3f�g��x��'a�MDDDDDDDDDDDDDfb�@��jU�V_x����K4h���P�fM�8t��Q�����?t��E�CDDDDDDDDDDDDD�c�H�E�������������F
�5�J�*�mDD�����;y��f~��c`
m�Q	WtWx�7k�g�������M�o�����2�QY2�"�,�B�Wd���*>S��U�V*+����W���C��M!���������������)3"�|[���p����IiV���X,���O~.k����+p�w�V�Z���edd`�����c���T�[)q��S'T�Z�8����u��r����hBB�4i�������u��e��������3�QE��H"����DD���DD3"���L����RA��[��@WQQ�
F�L���q����^����������M���o��Y�f������|�
�����gff� a��-��_?��k���q��;������
���o�?[	 �\.H}��'��}������x��'�����>�u��1�QE�@$Q��@$��b ���b` �������xIIp��/�T������#::���d�]w�u����@��_|�~��WU����nB�5��e����O>�W_}����9�\s�
����������fS�<S�z���u�#z�!�x������U��G����3���'�������=�:w�|Ye�].<�g���=���8qMDTO�8�(�X3?k�����kDD�9m�V�����[�q""*K�Wd��[�����Q�g��H�f���T����W�~v��8�|����dED��'>>_�5���;����m��'��,���`�����}�9�����Ne[rr2�����g���\W�\%`9l�0���;z�dw�5e���2���o��?����|����+U<��$"��ID���IDT10#����j�^RR�u��%����|����SO�?���)���@UE����Y�f��W^����U?��eA�������3��S�HJ������z�W���R�U���8�����_S[�jU�Y�����dC.X�qqq5j�i�{�������������|L�����l���
d�n�Z�� ��)�Y��u.\�Pen����z+}�Q�W�TRRR�j�*��_={�<!�T�e��_�v-8`�9�����f!!!��D���g-������]�tA���Y���������������")%?].��x� ��f���h��9��y<����$��J�JP�56l�P�L�S�vm��W;w�T�'���\�j���U2<K���R�!�W����N��3)Y���r��j;yS"������UFF�����TRza���[O�������uO�?S���233�8y>��~��g�e������*��	+���h�0a�*���sg����������������)��'�%n���GU�o�M�6��f3����rR��d��������L��s]������-���~������e������C��uU��i����#�g���x�.�E$�F�5�p8�-:��;v,���U����^�V��c�R��N�:*�u���{7F������oh���z_�W_}��z>� >��C8<^AA����c��g�5��sr�{�;v��O>Q�f���T����}�����El��
�G���a���O���1)����D�9��W/u��������vkDt)��?����5�sD~w���������M���G-�'���FDty��[�qo!����DDT����<�����g!�KO�p��{.�������G}��R��R�k��EPP��� ���-[�T}CBB�-��"���k<��<y����j���S�III*���[7DDD����}��9S�����a����[HOOWY�<�^�O=���=�`���LKK3���R���*�N2��/�����t��FDD%��������%�NB�_+c����&�����B�o�������������f~9�7�p�W�5"��j���*U�k�EDJ�Gy7n4��;	F}���V�����;�@����q���_�@��u]�j�*�my�w���Cqq1^~�e,X�����T�dLL>��St������V�j�}v$���`���T'�
T)�b��_J���
��X#"�
�n��c��f~����B{c����&�����B�o����,�_�yo!�+2�BD��$�U�@��\�d���<_�	��o_U��rq&�H��8|�p�{����d�O�7Jv��	0c�\}���������������/�w�}��a%cv�����?�{�=�/R�������������cG�
gG����$�K/0�)��d��_~�w��q��FDD%��\[�c��r���+���FDty��[�qo!����DDT����<�����g!�KO�/R���r��t~�$)���^{��������F���cRSSUv��`�5k:w�l�9������o���x��'q�}�� �������T���w��?��O�h�@�B�L���D�����;y��f~��c`
m�Q	WtWx�7k�g�������M�o�����2�QY2�"�,�B�Wd���*��7`$����c��]8p���������>��k�6����q���LP�c����B2f�<��ew}}}�k~~�z%""""""""""""s2E RN�W�V�qg�DGGc��}*��p8�+��U���D���������4Y����������jDz&.�u%R��W�X�[o�U�!.!�%8==]W�����
�y�^��/�+���c�����[����
����u��t:Q�^=���W��$07y�d����n*�<jIV��E�T�bxx�Z$�'?��3g���>C@@����.X�c��EBB��Wr�����>���_{�1T�\����9o�<�9`��5


T����4U��L39���<�g���=��,5���Q9<)���Tc�������f�]���[��^B�o����,�_�yo!�+2�BD�)�EEEX�l�����a����#G� ((U�TQ���,���`��*#O��:�b8��g�*���I�l6����"�l�L�9s�`�����$?c���������C=�n�����Y�������_W.�200��s~�-��v����%��KX,c/����+�\�������������k�Q����OD���H"����H""/�@$Q��@$��)�V�!!!HJJR�F�x��w������!C��_?t��U������W/�'��w��j� e�������7:�@�d%6l��*UB\\���;w.����F���;��������o���*�Q�AJ@�t �|�[Zjj*�y���[>��	�V%R�\%)�[%)7��m����_e���c ���b` ����1IDT!0IDfe��n�w	I�K2���o���~�Z�:!�Q��v���?�������~�=z���_|������[�:5+2##���z?|�p�z*�Y*?���X��^����FEE��ny�g�d9J�Q�%�x�s�ni`�>}�:�[�ne�!K�_M�~�@�=4h���_�~����q�z�d����6k�hc���J������=��:���%DD�e�2~�8NDDe�����x�_�y"��L������~��g|���*��T�?�d�����/����7o�-�����|��*�JDD��@$Q��@$��b ���b` ����j�^R���d�5k���zrRT��s�\!e<��gZZ��IDDDDDDDDDDDDD��)����r������#OG��c����Ny���t�FDDDDDDDDDDDDD��)���P�����`����h�}r�+����j��N<p�����������a�@����@|���0a����p8�#�����'�c$�8`��2!!S�LQ�[�n}48IDDDDDDDDDDDDD��)��w�����{UP������/������"�d�s�=��o���<����o�����?|||����`�@��T�@�������������7�|S-�~����Q�������P��y�f4m�O?�4����+��b�h�������
6`��-��czz:�[�Z��
<v��I-�*UR�K RzF��v�����DD����;y��f~��c`
m�Q	WtWx�7k�g�������M�o�����2�QY2�"�,�B�Wd���*>�"K��n 33S"+W���� �l6�""�vDUDy/"��*����s`���,�A���+�����\�Xs`b���P{/�!��Ah[�9��7��R�Xd���L��}�<�X}��Zct
m�����e�����Z�*�X�n]��W!!!B]<������7�'���c�����S�*��/{f������:?a%f�/����m+R7�k�8����wN������I��������m5� ��q�3"���1q�D����q���������mg��|�c%"�N��$"��ID���IDT1T�����4���lL���oiz5�l�z2`�3_n���������XN�{��c���h�;?�!���?��������C�:��{m���6�+]�_�.���� �7�C[�������E���r�&L�o��^e����YJ�'""""""""""����va��E�9����Pc���9�1;~)�]���*����������-F�i�HlO��5�g���`�X�/�3W�@�:�T	9)������vN��#IB�%����E#I�QQQ���7��o��^f��,%�����	O��d�Xjc
Q9<)���Tc�������f�]���[��^B�o�O�d{a�,HG�*
�=�&�42!='~�*}p+���A����j�f)�6��v��qK�L;vC�dA��P���]d2�"�,�B�Wd��d�����&��EY��cT�����8�|��x�'s?"*���&CP�7����c[�^���Q��^������&h�&�?���h�n��[�����m�M)�Ze����0T����#�3s�K���+**R��~~~j{���Qr����aiV"����Y���WE-��)m'^Z�)R��[�v�����S��`��-���*;����#�9j�zPDO�ht�l�����<|�c2V�lP���������0�y��"��*RiV_�Z�����;����=��g��fu����NR��������yH��5cA�j<��6��|��.�Z?��#n����Ng$���R���7�K]�����|�x�jv
nh<H}>�����b$h�������*�����Rr>��	��1����fl93��Y�k:���S7����nV����]�T�N��Y�U6��
��&����X��=f��J�>�Y��	p"":5�L_��V�N���������3%��&U��t2�Q�I�UY����T�����}�;a^�J|�}"~�=���1��@�O�d�3�Q�\��AH�s�5DDDDDDDDT!��>��C�[��7k�d����F�ht�6��2f�����#���.�PL�=�Bg�
Z6��N���kj����H=���*�
>LODtZ	9��=fB|�ps���d?VZ�le��m�r�|�m��9�>����p4�R�8

�����]���������h]�����`�M���_e�":�
Dc����4i���;���[������.?��#��������������rV2�]��2z��]n)�Z�*B����\��*=��T ������v4�e
i+%�F���s�B��Q��h��NCz2N����9IZ�/ZTkl�97��wY�:,HZ������H��kT?��odH]�l2D=�"A�.�m�-c�%���z���V+�H":[��5��K*//S�L��1c����c����5k,X��K�����k�E``�q""�&�D]��{i���bDD'����R�5�����_��FDt���o5�{	�e/�������>�2�\+����G������q��M��������JU��4��87a9��T�7*�#���������P��
�g'���������bW�>|�c
����k"��0�MDt!�����xK�>�T��X�mH��z�F����Gjcm%�]��m�{U���B?S�H��*hW��:�vPMlI��dm�o^5R��'�Qx_m�
nxp���9�9�����V���Cm���-'p9��+���]������h�C����2r�\�iE�l��_���?�ld�I�������]��5"��]�Ot	��Q�
6���3g��b��=q�-���{�9������
��������������.�IX��Ubp����E�d�d��n�!�7��z�dE��X;�HQ����j\9m�����������T�>�����/�0����q����4�]��N�@H����q4<(��s�|��7������kJ/���Z�x��8)�-����U�I�������[vg��������8\�i�a(��|��20�=0(����`��z��LH�r�X`������E���n��-���?�~$ob��6N<e���.	S".\���������K/����K���5���DDDDDDDD�9����w6�]��x���u6$)%�,|��V����j���R��B����t(niv5ZVo�����In)�� i�*�:���f>�	�5�7��������=���U��%���B^e}f��^�<Gvd� �H����%j�WE�:�a��T���.������Rz�v��F{�Y��������f����Ik��l�a����p`��`�K�"�����[e|G���@@����WN\�v��M���h:�"0�=r�=HYb�\`��3�] �DJ�G	B6h��>�(���j4i�D��j�[�.l6�� """""""�\�d�D���u:�{X;c���f@5\��*���F���z���
�y�05v>��h����GQ��}����f`5T���7c^���KR�u������;�zy2
����i�u��c=}����I�m��o��^�n�77,�#�HZTk�>������X�U=���(4��8���G)��q$p��.w���o~%pp�q�q�i���r�J��>������:Q������|���^�I�5#�7�63��1K��8�Ee�@���Bnn.5j��DDDDDDDDD'����jv2���@����`�O�������)1sP����d0sR������7����7R&���.{��A�u���V7��DU�c�*�C��}��
`fe�u�k�coV<&�22,��=����f��n4��PeF�&�����Xu`#���f�1GiCw��]2�K����N�R(��j����7d�����N���������K���A5�^�g���K����)��q@�A8�>�D�)����GNN���{J���������.{���7:	��;��i�_M,������&��E��c\�*�'e[+��\>�Lp/M^�!
���bS=���L���_��c�����._��D���}���*�g�K=������+�T���'�����������z��������i�4��[�J�~�c2��������^u|i2���&U��^�6�U����D�r�K����<��V�gU�RB	J�
zmnl4HPP����3�}�sP��
)��;`��z��Eqk�k�������}6m�$��,�^7�#���������mGM�']<�D�_�~8|�0-Z���bc���[vwC��O\	�������f�$�}(�������1sT/��H ��o%8��d�[���d����qU���s �0&�����jcX�~���{��pK���?�f��x����g����"s�o���#IjL]��bc|�[}p]�����u(v;�����Z�l�-�_�U��V7�I�����Op�����U?I!�����e|�c�����*�3T�KXm@��@���I�>'������@P5��0c�iH�H�oJ���,�������-;g�zot���D��*0G;^���R^�~�}O�@������@�/����E���q��p]�N'*W��}��a���T�����W��������Qy�����l0���Rc,!��
DJtH��M���1����@�!�Z�v��kxr|p'�a"�C�!��$D�}
���X�C�&�����������~	�����:yO�8�(�X3?k�����OU]���[��^�R��v_>�XV�n@lv"���8����#�G���C�w� �	s��I��+���lK��z���k�6�X	)�:c�"�
���_	[�r|����{�R}*�ku#�V�T%Y�}���vw"T;�vPM��L��A�{g]2�"�,��R���g9S�
��V+U-g�EIDATm�>vo��TO�.�m��zc�H0P#Y�-�5Vco��p���Z�6�����}��d;O�>��a�x]Z��Z��j ����!hS�9������K����������?���:��}�����px���(���o�����]�5����=�����Z�m��H�~l}-�a�^[��hv�D[�/@t�X<�����/�����c�1;v�P����h��j��
���I��7�m�������� ""�r�z�d����6k�hc��(����o�$i7��t����g�M:��	�x@/�q*r;�s��{�����-eI
2�����Ms�{�]� ��&�mP���}��O���7�io����+�+<���`������`�Lx�,R���dd]�]yB�Q/}\>������r
2��a�>�!��d�q�����l���c�"o ������v;l-�3��=���?'�X+k����;M�4��-�#�7�jE�l���}j��HM.�������|�m��=������v)�����0U��u��t��'�����F������6���G���u}���TF��0{p�K���{?��HDt������x�_�y�
I������'�
��y���3e��@�;��>93��B;�6���>�"s/R�u��@�V��7�+�2N(�����}�����?��M]=����Q�Fa��9��s7h� �?��W7��7a �$8��z��k5��l�A�fY�K<p��{�����d�
�#{�O�����/��������7k��t�OLNN�!k_���z�{�,��%��&2-"M@&7�w����������7F&A��zhcm�Q�K%3~��J9��SV�^��!��C�z� ��"�����j�!GR��1H���J�D"23�DV�[�������o>����j���}��o��Y�q�8R����
S�J!��w���)��_���h��������d��������/!}�$�Q2�>��i��Wec�����b��]�j��ht%j}��k"�$<���+v/�6��#e�=���A#��v���+��x�L��s�v�3��5�w��j��w���D���pN�E����Q�;v��~���4g1�w���"��k*i���s~�������3���>�^<�����,�K����k�]��$����o��aY��������w���������kl9w�5�
7������a �������������W��j�pM{X9��;Q�i=�/\���n�K�����D�.����^�D�����WL��v�	��#�����u��r�:���/��=��w��s"���4�_�A���@�[�j
�Z'��X�P�p�6�Kf���I�jc�I���2�[N�����]>/$�]>/k����_�~g}���R����Xh���D&�u�Hm��q�L�,�������ot}��1��=}/~�3C�X�LI	Dfk�IpqH�����@��4	D�;�M����]������X��6��P?$�9�
U�"�T���!"���h�B-�����`h�G�`�������a������������P�n
�wh������JO��������
��?�g�^�}���z<y���6���w��ND������?`��@���'��-�k��aQ�c���������O���$�)}#�!��
��8�u�K@x����ED�` ��N��g�����b�0l���0��7�%���L�w��k|�_������I�G��7��"'>��LK RzS�{[;�{��O��C�c������������K�{
����%eX%Cq��z?���#����-��������y`���X/�H��.j����_������c�F�����}����H"S���H���49u�kch���V �83���U��"z���%<��$P)��#�9�i3	<6��N�Z�n=��$��6���b�k�kc��1k�]�t�I"2��
���mx
�/Y�
`�������y��[���|��A���b�������R)���j�W�j��]{o���p���#/���o�����"��1�����;��I8���),�o�w�r��1y�i��*�*�������s5P9��" �l�2J�%���L�a�-��3�oG�_���y�[<��l�}	��	��>Ggi�{j��C_��#���#UlRZOn:�zN/�z<�t�������2�����+pj�9����>����'�������d{����#eY���d�Hsu��!"�����YI��	���XRT�{���.���J��r��Y���SKo����^��>�����DtQ5��D�,��|�pK��qw�e��B���xs�!�����������nwVAH!����T}��������AH"r8P�p\)��|
G����~��B�mw��Up�T�pi�+��c�����A����~�4J���e���u�������>����
�-[�����wf�'����M=�@&T��?�7�z��I���_�����06�"��r-Jdn�4y0p����T��
���~Wht�m��~g�~��[����^=YPP��"33��r�dee�k�� ""������>�/��4���Y��q�������=�����n����U��[k�&o6N��8|������Bn|��
�Y��5����5����v��K��p�=�?��&"��I9�O��O4O&#Dp
��\H��Lx�����+��<�"��$#S>���f��-������^�DDtr2i,%���n�#������=�����|��\o���N��R��}�6��c_�9�b�$�|�����J������i���k�����)�~_>)�Z8w�z
��v�u�}�����*��v�h�\�������!I&$=�b�JO�{]�UJ�{�/.�����?�-��>������]�����(�)�����U�{n�K������������k��Wi�N��C1t��^��/���\�3k��U�-j��������������O?a��-���78iIDdv����y������V�z����Y�����)�W��viRR�W�<��{r�{$	���0Q/�������zPJ@2���^Y�� f�@���M�o��_��}r���"�����R�5�����_��V��$
���������[�,�P�T������9�������_�3/KHpS&�w�lv�����k=�O��x�RW����Dd>����q/!������E��O��R���^`��}�a�!��j���P��w�7��2)�D[���u�m\7����d�I�[6���vDt����.n7,�}��u;mi��l�+%	E��'���]�J���;9	�?��@�v���K�X��m��NO��f�2�I)[�l��=)�P���
����r�_9��8�z���w�Qy��-�+2��-d~E�Y*)��,��B�
���=�p�����W����g��V�9�y�m��4Y�enD�q�@���)����\mO�>V&�s6���O�}�P_���`��l��^~?���D���)���|O-�M'�}.z �j�"??,��%K��~��`dpp��&�:w��9���_1e�ddd`��ah��5||�����L��H���f������'������y��8�9H�
���������n���+��LHK��&�������������?zV$��&%OUG���Q�P����%���
��} e�V�'�M�����M�1]��a$���>��o90X�L���8��L���KOJ�M{F��iq%��6}rX��e�Y��%���v?}|���$�8�`�6�K�.wQ�����,�t���+���Y8S���;�e�k����?����6A���3|$�)��* 	<�4m�����p9Q8g�� ���G�5v���u�:�T	��}���+1�����g���� ��50��"�[��Q:6F�SP��7���_��'?Aw?k�q�Ka ���������2�"cn�j=��TS�k��mo8v?-�/��j������v!AI?m��H�	)yK��}E��7������
����mo�}f���2�v������
YR���of�HZ�E&A�u��a��i�����o�
6D���Q�n]�����)YXX���T$$$ &&qqq������������:u���""2%i�.����4Q�f���?�?	��N`�+@��}s�����_�I��������}�S�g���v�
�����>�����>�"7���#��'��L���l�y���y���`��Y�O��7~���9�,s9���I�[�jc�m�������~������e���K�o�����2�W(+���~��~=�[�V3}�d���LzL�"��\�����D��7�����"{���L��}���������]����h}-0r�~
���V���I���v�>�-%[���N�+�]f$0�����#���a�g�)_��_����*�i������U���cr�l��!��G�?T�O2�uge�x���C*���q3un��E���k�q�>������<�����g�p$+2v��`v���~A�|F#m�-��]�]7�JZ
�u4vJ�����%s&RN5����H�v�3�����^%-x�C��9 ����~@t.I ���T���y��a�����oj���z���N�:'�W���)))������U�c�p�W`����R���VDDdjD������1��"O`}����ys^��7�I��?8V�Un��}����'�e�Cz��G������;R��������<�-O��h���cD��@�	%Dkc��@�V�����2r������[�M:�'�s����
p$H\��	TI�V�gL�F��Dt�1i���zV/e]����t�����?8M��9�����?�'�IY�r_�� =S]�f��T��^@����_��I��#�"e��W��k#0����D���X�~�{v!����7h�i{4��4y?��O���S�7���,x�.���_~�z
P��a�|��l��d��2lu"���*z*D�Y]����I�c�-��K4j�HeCJ�QJ�n��+W�T��7n��]��������k��\s
n��6�~�����#{B�y;����D7���P%��Jg�D���N������)��t���&,����.������K��U�dA����K��H�!`������{�^�K��	y�N���L�'O�H	���l���	��=iJ�d���>gRj�7z��+��KS��w��zfd���IDd,�j2����W���@����M���������e3�kHf����v����
��1\�������]C�J��,��@�YJYW"��X���si�bk�%B�q���k���S	����H%�����
�����Ku��"�oB���%{^��r�dKn�����~��1��vo.��R���'�����^������E��G���9h��
pl^��W!`�5G��,��%k�P�[�zN���k�R��J+.F�������{R�Z%���a-�1{`�g�1=y��I�f�����T���DtR�4#�xEEE*�Qz?&%%�2����+$�X�vmU��q���o���DD�"_bv&���Fj��R�H�t��k������p+���"lIpk'*�~�K���E�����_�owb��a,���}M7z4���=||=`��H�����?�u�~]�3p��r����7w�����a��6�wN���aOc�AMR�X��]�>��j�s�zr�"����_�v�'�������0N$"�`F��H�m	�m��p0�y��������U���� ������t�7?��g�G/'x`0L���A�s��c����w'U �����!8v�����}�{�3i�p�p���N�V�!�z�fy�d�h�2U�R��a���|f_���H��<�^�o��s�#~�>�K���ficz�~�-��i�r�6��������|F/;�]�Zm�x��`
����}���������g_�1�Zg�K�$#2���ye��8���(�������.=�eI�1����7t|;vF����:���)��^���W�L�;m:�[N��d�It���P���zl��)
����/��^}�U�<������{p��W"22�AH":o��8s�?,s���X�D\�E��3tE����[�r��D�����Z����cAn!0m�Vm�����K;�m=fov ����*p ���[��.0��"TIR��^����S��	Y����$����q��5B�u��OY�^�&K�11K�������M������F
��'D��k��"�H������&L�3���
�Lvq.�����{f���1;~����"W1%���;��c���CZA���,Iv�<X"AH���r�����`~���r�U#�� ���/��y��Q}[�6 ���+�����F��P��$�@��(^�TMZ��4�?�E��i�8���O��t��i=��.8�R0��}������)(@���(�6���pl���_�G��j?U�p����7V=��o?[����+ ?So�P��l��ky���g��}�{�6��-%��aB�])�%0�{q��xrsP��$�����#p��g�T�ykw~�z=��sR���?�#�)�&�^��B��%p�����7#��p�
(�>3�W/7��Yl�.�JDt��*IDt1;=��B�J\����]��t��\���a`�O�K�H�
<�Z���M�e�)��@�Mj[���aVtklCA1���v.������P�'��f���w���c�`�d`����d;
)�$�g�������o���o�'���	�{[/���W������_�d���wd	�\�O��|H�_f�":��5~��Lr�?$�m��X{p&���ovL��m�kb�6.��-�w���S�����u~�=��{�� ��;~W��m�{��?���9�<��3$Cy�D�^)�}�����+�o�^}l-����6���+�g�dv�v����I_`5�&�vU2�]r�u��7"o$��B��_���_�����8�e<�u&�v��2g�]n��:ua����U[u�+)3����#���������������c�UVP�p��HE� �]�����Xz6��C	(Jfe�66�m+5��C���z����������4����O �\�p�Lm,�{�(�|lu����Rlu�����?��x,<9�*��\	�����hcu���p&�#���`
	�c�6uM�>����{�Z����Zi&��91ID�-_�w�a�}pwo��^�����s�����s!����Z�8�r���2�C+%Sr;�]X�����m�xa�'�2dB"=N{����[
�zY[^:q�Rz� S���E�g��zN��Z;G��-Rr�(���}4�SN�a����O�K�����r-����*���A7=����������U�q���X����$j���#����X|�c�|����&Cqo�1�~��'���n,j���nF��-1m���<6�������Hq����${q������]K_�C�O|�D���qk���K?
��m�m��g�4��s<���9W����LrKI��V@�:=�)�&��#Y��q"��sed��w7�-Z#����?�:X������G�z(w�i�
����5�o�N��������G�4h{T[�[��+)Am*�f�x���[r�LI�{�u?kcp[�O����	�L�0Q�|�T���)R)�,��zP�����&0_�������CTIr�<L���Fu/|66v�OJ�������7k����=;Q�r�
.*d\���xUJ�V������1*��g?���?vY���>?$SHj��a��D�y�^����.+6���[U�O��J���[�*c�K��z~�jH&���q8���{��Q�����c\H�� \��E���N$e�1��]C�\�LJ����*��������xOO1i�^�z�9���2I����*��-��(�RN�7P
6�O2�������V����L�^��@�����O�%K��$�2!]����:���z��<�]�=��}2��\�)�/�)Y� ����_��������b�k�klNpc{���T� ����?��p!:���;���u�r�_��yR�E����Y�������T�,�������a��][b���,��=Q7��KqIp��m���6\9�6�+"��M�f.�����L����N��pK���PM�j���eh���j$n���\��
�vC�d��8�����(��d��]\�"��,2�,�R:[��i��Ge&���u�h�2���dX��w�+��~B�_����g}� i��=��G��������}�-<~W�o�N�^�h�X�T���a��g��L\/������=��p%�W����-)��
��X�����J�^{la���h�������2�WX�������G�zh���g{,��g���_����������}M�w���������.�9zY�����;,�8����R���.�E)�j�RE=�!������!UTvc��	(^�
>��k��{��l��h���i�w;U�������P��o��f�=V���/3E+������;��~UXl6��U�nk������e]�X=�"�UO�O��������Q��@$��B"7'�0%��2!o��?��R�D�h��$7����3��]).�mnG�>X����[���&�v��oz"M@������-%ON��!%�X�,!Y��Ldw����yr�L`K���!���fr��N/�i�����KZ�����*��e�������Cn��s���v�����������n$���^��vm��)�V��R�~=y�d�Z�lq���vcc���4�uyE"�=)O��b`���_�+�U
��������"����=v��
�����Pu����a��hP9��tT�sR� iz�n�fUb����n�T������f)gY"��e(m�]l,oi�UO%c1��>��6	�(��T�}R
�����db[\�il0To�}6�����������U����eS�^E&����u����t�����������ju�]&���/R��5�NIB��Y�U
���C�dy�O�����\�&���@�y�'��l���!/�}�O<,��y������W��rg��IJ� ��O���������/j��}������H���]8�{|"��2���kU��d�K�]���',��U����Y���)�����{�B��K���Z���\�@dq�*8wn���m��z8��RA�����ZJ~����+1�
k���V����v���R�tr�6x�f���D�"��2Y�~]�P��7t��>�%�>�^u�Z�gB,hW��!m�������4�c��]�g5y���$�!%��Ik�1{���9q����,�h���6g�<������U�z�>��]� ��M:%CR���z6�h��<H���"tn�������{C�{x����*.$8��Q�+��_y{ �f��AH8���hFVU�uF���D�<n���'ve��������,�8�mW�$ Y3�Z�����
H/�D��0��a~�J���bD�+�������Z�����dJQ&�%px�E��"D�o�^��/�tRH/��}�l�3	B��U����Y�k���k�A���B"�W/E������>q-��4�� x
�	n����&����:����{x�rt��j���4)q-�?	Jc�[�1�T?�3��N�jL��>��b��&��o90�M��uz[�-1���j�3]��������t+{GR�S\�z1�[�V���^�"�Wmh�Y�oo�Je�[���X����������V��[���1�[��7�����
��O$3R�����'�b���O�e��dk�i��5�c ���qy=�MDt��;�VekW��k��^���~-}pWo_���#:��g���p�<��W�����DD��l7v��U����|qE+(<[2noIp�a�w����.v\��Ge�_���v��;�*()R3�((�7��Y�#mhZ���vy�E���`���N�N��x������i;1v�D��g~�;_m�
��O������J�A���U(v9TOI����Vm��+G`^�JlK���_�2+���#e�
�|}������)!��#F��)����9G�	���Q�v���Q����drR�z�[@~0�	���S!%{��.���������dTJ_�����������^������A��W�����T�r����U(~��D���v�Kn������[�VeS�'���|�����o�G��>�>�����qS�u�u����~C��ci�B�
���&�.i�KD��\�p�t����hbC��g6����X'���F%flt�������U{]p�������*����{����a���s�<���g<vklCD�cc�\�}}�Y�W�AF�>�&�_��_j��[�G}���DJ��"m�]���Q�#Y�9*�rC�t
m��[��}-oD�:}h�*����g�Jf���z�.���5�#�r]��xF5���L�7�k�@���X"��8vl�c�&�[�V����,�a�#���x��j������?��i�n�O��&�9�S/��
�RW���}&�ir�e�|=)��f������#)z��m3���@�P��������y�9%${Rz@�|�i�]��^��c�{VJ�_��w#P�>�lH""":3���x<X�d	&N����tc+�wJ�����LX�ouf��<�'�L|K�t����������N�����0����<������U�-�5�*����E��'f����'Y�F��U,�����D�A76��s��Z�-�O�di���T�[����I^��v��U������F��&C��@����JlI��%������WE�������
#�E�=���E����A�LH�e�ST��e��R�5�����Q8�O�ss��
p�B��	�Lk�U����{�.���z�O��9,x������1��M�~��Q����O�e��(��m3��dQ.�����3_�~~�~N	����@�����u;�G�A�9���R�Z�1��r�DDDD�1E ������+�����,c+�wZ���G���c��f%�q�d�1��2�<����
l����z����X�D^�q]p�Z�`T;��8v�Jq��Y��:U�����qW��c�~~Z���+(���k:�U�r�:��9�������Az;��[��,Q���wQanN���I�����X����C��j�;����w��e)�U���*>���[���`����zj���Q�t���_?���
��3f�*�����p%'G����dB�W�W�)��6��_��lFI��C�����
��*����w���w
YZ���k5��U�
	Nx����=�"{h��3@����%""�3f�@dQQRRR�t:`l%"�>�l�n������v��9������N�l�g��9�V���j����6tnh��:�s���.��LfnrB*c�o�� ?}l�^�7v���cDuZ�����v�oa��=.lKtaH[��f�[n��|�6Jo��4���%f����I�;��1�� $=�t������b��mX��������k�����r9U@���	�>�a�|�2���LL�kX8�^���K���
�����D��#P�1�kVg,g���.��N��7N��yL��(��~
�t�}�(5�C^*����*����R����{�
�������IDDDtz�����CDD���p��ac+��H�bb���bu�qi.�%�������|��t��������)nk�'L-%�e']42NO�v�R��#m����L@�J\���������[��P�nt�y+��({<UlV�6�
n�����_��A}����.���_������kFa��[�.�mTi�{[�����{�R�(���r%'�x�2�Bk��KO����sn7����3~�
<ZC*����z����
����o���V�	G�n�$K�����H�p�


��_��E&%%!??_�m=�RXX�J],kc�����Ru�����B`�.��#��GO'9����n�`G=#c�qm+����%+=�\�9�:�s���.�B0k���:���Ue?J��S�s$�W���Nv8���k�u�C4c��'y�J�A
��g�d�[���N���B����7��������e��Uwf����������F3t��-�6V����\�,"�F��|��{O��������=`

3v��s
�L�_�~����?���p���?�nT����Q�+��L�,)�*~������x������o�r�0a�
H],[�X���U{]pI��R6���'����V�hb��9��@`Dg;z5�}�Y����cU���Y[$�9���h9@""�{I�m��c���H�U_��s���
q.�����V6��-��mvb[�K��_�@\���d/��$#�y���`{ z������[�������RR�f��sh���,-�(��F�o0F4�R*=��H�(�����#�).F��?����p��al<�������`�\~}����4�[h��d?Z�?�:��b���YK���Q�r	\RP�v����ld�h8E�Z""""��e�� �0==�F���9s�-gf��A?~<�W�nl!":wE�Xv�WD���kc�KM27�aE��>��:$z���]��iU����t*i9,��T%���d��hj;�������a���k�gm>������:m<~��B�W���Q��pvc���]���� �[�U���/z5+;��G��wg�����0_L]�T��w���Yv$���2��h�]���Y�+�+<��5��u^KHc�D�m��������wz��j�5��$y-$�FT�&��J���\	9�xm���������C�V��)'6����K��Z���1��R�����#znkv
�m8�����&����1�Ai���||��g���Q��P�d�MDf���
G��'|4B��>�%���UO~���$���������k�=�������{��=�O<���$�����)�+S�U�$��wVl
�JL��F
���Z/���
��(c��d��q�������g�2�"�,����RM$�0S���G�_u����{�������L����S��{��1����M�����BP'"�FD���|��`������[{�1����AH	^����?7:��_�h���~)�$��{���,�<���}U���O3��e.�@�G�~�/�g�shk���i���?S��X�����M�w!��N�.�mk4�u���N�&T�sR���6\�CeE���l|�c2V�nB���u�#�(#���
��fR���r:�������?x,����=N'���+%I����T������:w��o����ng�8���1{P�v<���{o��ox4X)<9[�Z��X3?"���WQ��R�aIr4�f��P~:�����$��
��&U��oxg�����CD�c�@�|���Q�����JDD���"]E�>�
���p��M���*�[�v�P�8��d�zW�>l��9Z�O&�[Uo�����p�	���v`��85���N�Z�~H�q���L���d�aU,e������2�������|��s�{��n�
�����U�|��B�������1�u�Z��M���DED��15v>�gcH����tb���[�Y�.���Y�����1Y	Xs`�v
��cU�t��
+�;��L��O\�J���K�*
�'�����UKD����2�{�S"eVi���d���,�tw��0T�~G "��T�@d�6����S���ol1�fU"�J������L�<�������SG���#Q�P��5���E��)ylB��v�
��v��������W'#����k1#n	6�����\K2h������]`������c��I*`Y��
���u��x �f�
`�r���.Y���s ������m}=����:��\hj��Nv���	���u=|����M����e{���0?U�[|6��w9q_?_4�c��d7�-*���>j[ER��DD���������)�3#���M��L��!u��v;�P
���""�^�5~�9��m��
�����kDt*�D�\.���b�����?�����n�	v�K�.EXX�5k���S�DD�}*B rV�R���[�98�Bk���������6\�`�h7�}N]�1.'/��Iyp�v�fF�rwV�$,GxP(���T��b����B�{��(���49������K-�|+R6�]����]N��)���_�������M]�h��mN���"X�bA�o��ET���a����K�U����i~�G��7�_Z��\���@g�J����k�����a ���{U�@�<�'}v�w���2���<8����e���"��""O���,c�������y����d�	:N�2���:^|�E<��sx��W�������@eG���^{
�W����6�$""��
�E��T{-���p_�q]��������
��Tz��$g�������N@���`�H�d�,��}������R2p��^'(�uC��
qeDOU�/�H�:F,J^�wM���c���vn�bW��R�x���������]e6��[�����1R�>���7�����g�O��h������-�!E�0+��eG�f>*��S{���/�V� $�����N�MXa� ����_o�d�����������R3�,H~~>~��wx�?>����o�Q�����U�V����>�����""���R6�q� �GQ��2���
��X@�u��*@(7���x*�mWMm�����%��4A�}�mU�������=�!�_';���L���F���NP-���r!�{����.v��KE
v��t����1R2������-'�����hT]��mW�IP�Y��L�����������;�����AA"���=��x�M�+��f�@�������`����o����x�����iS��O�'��9s��2�&nqIDD��lyU)���W��Z�e�2��>hRO=���{��Z>�p<\�	?�_���#C��}��3��~6_���y��2u�IT���g�~�p:�05v
����������������{����Q�g�@���������G��GE��Q�V-X���Et��<�TyV)�JDDtQ��Yx�.�|�o�5�S#��z�,<u��Bg!r��`���^���m�/�Y����6;����~!�a��f�d��[�n�����D��EIkT��V�?CDDDD���4�y��BDDDt�0E R��n��

6T�������I�d��-��qc$''�����CDD�7;.���S�>Vl�ceYKH�Pd��Gc��X��g�dRO��>�E)��kh���zt
�BXPM�����6���{�B����A�2�b���������o�l�,�X��y���;��i�7JtqX<&�m����Q�F�2����G�5�l��zu�������v	J��NDD����a���k�gm=	�Z��5��}��F���V�>��������/!�[�[��z���7P7��z_�t�KHi��wM���9�g�;qeDc������
����:��%���FDty��[�qo!������9������X3���ZTkd�]2�"�,��>��c�5]��n4�y�����w��i�Q���k�i���@�)����F=�^������E�)2"�v;�T��C�� ��dee�c�9�����0w_�����=�:�m�f���?���������U�w�����8��
�r���\AHQ�$�},|��H��3E RJ�J��}��a��Y���5��(//O#��9�*�JDDta��W]�=P�e-v;���"�#E%{�z=)��������Oz�H����r���.�U%Y�V;�i8W���cY�:,M��w��YqK���������������1�X1��?GR����)�>>>���BCC�������������������������&M���cQ�V-���[�KDDtQx\�]5�����"�Qp�wci�G�kh��K���`���Dv���$%�(�J�A*`Y��������5������a��f���&�
��_��DZA�q]0{o���HXo���L��:u�#�<�2�z�-����������O?�o���~�mU����V�]4=��D5��*+2�(�Y�V��e'�f��NP-ck��l��PEnsS������#������ ��rR�{��g���^j=S����������%�5���Eza&���:����tL���_�Z�	D���o�SO=��m�b��������w�^����;�:u��������;���*U2�&""��e�Ck�q�d����e������]����[IK�1	9�e�5��>�P������S�I)$�)��4k������:�05v>r�s1��PT�Q%^��r�c�
�jq)�9��t u���<KF�����K����ra�'"""""����s������X�e�@dBB\.���jExx8:w��.]���%y7����Ng�����X�Gk�9	�����T����Xy�|,O]��)�qeD<��%U�g��o����5x4����W�|���d\9�h�roV���CM�jx�����r��^"%��Y�z�����n��j������B�ZQ���u����agF,>�����mG�v�R�	��4��j@��@��@�v�F"2WtWx�7k�g�����Zr8�����v�������V3�� �Fcc#����2�{�e/�������}����x���<�HDt!�����x�_�y��:�v���;D��l�3���b���F~	�|�X!���.YZQQ�N=��f�����E�	Z���2����{T�@�d6N�3���!�0��� ����q�[�v���DUo���p���Wc��(������V=���$Gc����$J�=Hrq�8��F���0�A�,6u|	)�� q5z��x�l��?���y�+Q/����L�=���q[�k�k������e`���`�l��#�ao���
Dd&D�@n0�i`�oz�3�G���il$�K������H"������B���g	����v-%����$:3�D`��Y����C���z
%�K�r���4��7��HQ�,���u�=��b�C�D��_�vC�q�!���5��a�zR�w����T�rx7��mG�
f�6��(eYK�Z=�#E9*��w�u�k����������t��Q���)u���Gc�����HX�0�c��n��r��BD���D&�r��}�{v�u8�\���J�i�>�[�V3��z��Dg�����t�5J�?~<�W������C����%y&��9U�@�W��o`�����I ���������H��?��X1��}�.2V��Rc ��c ���
��������y���\l������n�����D^|D��3O��������;���7"''G-��d������c������U�#����%xO�@��4s�X"�K)a���x��JDDD�
Wb<�k� ����p��(Z4��BDd~�$�'I�[�l�[o��W^y���.bcc�"�e���w�yG��iS���W%""��f����y�""*���G��DDDdB�����l��[�_�STd���%+�*��/������t:�{�n��Y�f���Q�O�b��N�:��?��n���u""�>,�j�v����	���u4V��,X����e�b>qo��Rci�����Y=@�f�����,4������E~��F��'�?���{~?���T����5�f�X����\�@dqq�
F���!;;[eG�g�}!!���$����H��_�AH""/�@�	0ID�&�@$�#"/�r����-������������M�����#����DK�#w��g��f~U��>M��{d ��c ���\��V��c��]1`��2D-%��Z����
0IDDDDDDDD�o�������S�C���$�,������_������K��@DDD^�����{�Q��'""""""""�,��K>
2�
&����Nc������L����RfU)����a��9rs���_|���[�lQ}%��.�H��`��4Kb���7HDDDDD��)��31��1�Y\)I�/<�C1��M��dc������m3�"""���d="��v��k�.��5u���M7������\���/7n�
@V�V
�z�����U�V9���|lOrak�I�3O������V�
��M�
�>��
�="M�="��`�H`�H�K���[6��c+�����<OZa�{T;�[�1����	="Wi���E=�z=����BTq�G����&��t��&����W_}?��#n��f|�����+T����,t��I�n�:DEEa���h����FDt.$��2��w[��Y��w������d ��$���"�(r�'��c�!�7�X;	"�.��!�op��al1�]x�'#���ND���L^{����k�
������H` �.S"�[�4iz�!�l�Re;�r�-�d�;�����^�?��S��o��V,?�����lj;���r��M,4u�D��V�w�?jT�[*"M��H"�*J 2.;�l���8�����jG5��h_��Wmhl=�D��;=
Y�y��xc�yI0���I�c���D��@���@�	0I�)�EEEx���1~�x�3�_=�V+������b������oT���b����1r�H����}�����+����n�;��X3�g���pY�D��DtT�@���x��{:f�/��c� Y��.���Pt�el)��H�K�p�l������U��7��GkD^
D���&�@$]$��m���IIIh��	�t����"116l@dd$��o����n��h��<���DD�"��wM��x��KDt���`u��781%�a�e�F'6�w�H�y�����>����6)�$��W[' �8��BDf����x���{�wDDDDD?S"].rssQ�R%[��[�b���h��BCC��z)W���Dt~���kB��<����Lgw�V:���b|1���h3��.-��5�d�������U���m:�[{W������������_""""�n�D��vT�\iii8r���VXX�u�����:uBpp�z/$8�j�������JDDDD��"���bL��@�!7.s=hR��`g�V9����%���c����$""""""/a�@d@@�*���3g��%K�`����]�6�v�
�������o��?����du��K'����e�����~�'�|�^������cqn������g�L�8Q�3u�TU~�TmJ7m������2�����K�d�mq!#�%Z��H���_lG����%"""""���i2"���
��q��1x������oc��]���k��eKc���x��71a������
PR�$X��w����^�����_�R������.����^w���x���������_U�|���^���������G�����<�{O��"���<+]L�m����O?���p,Z�)))���p�����N���.\���;��'�DTT�q6O2%KQ�����k���S�J�o��_~�E��<�z���<�?^eQJp���_��A�TpY2\ei�%�z�j�Z�
�F�B�z��=DDDDe�{Y�az�DDDDDDDty0M Rz=�x��x�����3���g�Uv;v��b��������;	v�1��!OA��J6a��5��S2?��c�*_�.�7l�`�qf���			�<y2z�������WY���,-==]4%KV���V��U%"""""""""""�3`����w��Tw�}7�4i���BJ�>O<��
N�����t")c:c������p�u�!$$D��W	�����8�e*eo���\w����k��m��#��]���^��9�u�V�
)}B��������������xU���������R�?%xu�A�����|�rU�V�h�9*��]�K��C�{N�|�����^�V��^K��gdd�W!�IW)���_?fCy!SEx���0n�8|��g�\>��#U�3??�8�JH�={�����u�[��`add$�o����Tc����u+U��^%�����`�\��Z� ����#�����������������i�YYY*��^����/���8�������W_��M���x�+P		�fgg#44AAA���d{�Z������3q>���d�z��s����cy��c��������d`�����YR����������������i�k����~����;��M�6U�o��V�v�m4h�
rIv�
7��������d
	
����d!V�RE�/)�z:�s�����s��E�2e
������z:t����2��f�R���n���u���������������"�p8�l�2�����o��>�C�Q%;���������o��GyD(;v��k������U����O/���nHH�
.K�����2Z��G�g)���9>>����.]���vc����<y2>��sL�6
qqq��%"""2��3��ADDt���CDDD�U,Du����>��"'M��:��?��z�!L�:U��d�����*�����F����v:��/���?�~��eZ^�����������?��Q�F{N�|�+��m�����#66��5SY��sR�!����������;c��]���s-,,T�������GU��+�����D[R�p��X3��z6\���m��w�as@��N|�x�Vk^��-��o�T!^��5�+�,��44��t�w`[����Z������<��B��<c�;?��?h����gP���������������W��m��B~��x��o��xG��YI��9�w:��Ypl�l���}� 8����:���������e��};
k�ww����W�X���/�u�c�4����w+D:����k�������wp:`����-w�Y;�X�����g,�T����wk�7�y�=�sQe��C6~�[a�����-��h����e���S���v��")�%`�t:U�H�A(V�X����ZeBJ����u�T�N	�=��S��l��3����/x �����~�t���d��_K�����}�����(����oq�5���g�UY��b���x��w�5���|�h��i*T��#�x����u�{�^�x����������h�U����(�����5��t������asf+@��ty��%G���_��>�/>6�8�=�xYkr{A�o����tw�=���T�y���;�F?l��Uu9�w���-Gl�������]�
ye���U9������c�xUk>������t<wPC8[>e����(~[�5�t�6�Z�(���������z�x����nX���X�\tn$&��Oc��3E 2++��srssU�K�@
��9r��!����
8JF�������E'=#���������UO����Z�����?p�u�{N����/%0(�K����[c��=�����S'�)A���|����D�|/m��5�pv$)�QE�z�F��wx�Q{���ST�G�vk����1u�kDD�/���;��8�	��(����0���Q������M�*| RQO>��
M�0Ae����T�SeAK�P��v�
(U�^]m'����1l�00���C�j'f	<xPe7FGGc��9�����������Y��?�8���)}}}1o�<�T�ae��x�G2"%*�H�.bbbT���"���;����X���'����ok���W�����FDt����]�����xGDD%�����c���U.��=�5"��[pp07nl�]x�D��nh|��gT@JY����o�#�<��7���o�.����?��f{�N��F��0P1@���������Q�%L�����e;f��=<��K:��y��sg��}f�u���;����C7w�.W�����Z�ha�����;{h�Ee�j^�/���������3��.p���}�����h�W��>��.p��!s?2�.���!y����u�����8���@a������������3@@������+�W�/�~C+����+8r��)Xe�F?@IJ�m�:�����y�C]�Ja�f�}��_HL�f:t�O<���}�Y���])�SN9���Yc�/���-*��t�R�k���Nsl*h������-==����^���o�3T��J�*y[��h�w���6j�(������[�[k.�U�;w������Y�� ��D R�	�	15?����m��a�������l��e��s�=n��?���4ibg�q�+���i��n���L�>��&M���W=�7�e*P��S'���q�T�w���.�1�H����m�l���V�Bw���=����Y�-s����7RSS]Y�*U�X����:�����y��U�Pe<`,_����k���{��S�V��?�x����K�.{���>K���@�2K���y�f�5k�M�0�����W\q�+s������}���u�V������Gz��Tbw������
7��&B
�)����r�J�a��(�o��
B+{���."+����;������y��-�-����W�/�\y�=���
��������l��h�mKB�}7#�{����9-"�W��)$���M��2��lG���a������t�p���#y�-r%m���b�
��}��.]����om��q@}��=�����#�X��]]����9�ys��i��q����`����U�Z������5o��/�h;v�p����T6�2c�%�3p	U�	sD(��#
>���'$��-[�����j�g�v�\��x��'[���]�a^���{1b�5n�������Ps;����y?�}�]k����l�<���?���K=�|�J��� $��H(�D(�D@�G ���Dj^He����������z���@$|"u"��#	�O�"�~���7�&M���LJJ����N�:v�UWY����5P�����@$���@$|"�	�@��������/���-::��M�W����|����(F"��#	��#	�H@~B"�r�����=��C��Ik����*U��U�����
@^x�������@$|"u"��#	�OH"�����n�1c��+���������H(�D(�D@�G ���������c�k����k�� $P��D R���+��dff��@A����X��������~��7KOO��(�B"f]�vu��_m_~����5���Yck���w��q#��/��������Q����=�W��~�����������Dk���U�Z�)�S�V-���+�x���(Z6u>�{V0T5�{�X8���t��*�E�ohe���{G��3����a���g����,���d��3$�����#���,z
T�"-Zd�<��
6�"��+�J����'�l�����-[�[E�H(�D(�D@����4�{�O�U�����c
+�D�@(�B"���a����|�7nl�w���[�J�(���7 /��"�����@�B 
>��:�P8�������l�F�m����:��C���Tj��?%$������_?3f�����=z0@ 
��:�Px(���L[��o����P�3+kvR�p;�~�E�	���Dn���.��2KJJ��>���T��m��H(�D(�D@��9#���!��3�X2������e+V���t�
��(�S*t����	�@��x����+�:i�$KM
��}�*$�>����kg��v�
4��
f����Z����[���q�F����� T��������?��q�\ 266�N8��U��EGG{{�K����
+^���������9"u�	^!���u�]w�u6e�o��i������;V�lYo
-"��#	��#	^!�LLLt�X�<
@^|��V�?M��nkY�)�����������^D(�D�WH"�g�7X����W�-��V����W���:�@��=
��s�7_T��*t�u����@$`Q����]-�J5oM����u������P���o����,}��'�������%,���]2�to- 'J�(�(�
^"����0��M����+_�|�+@^D(�D��H�_D @QG (��#@��t"]�"SRRl����]v��i'N��>���n,���Lo+�P2����,[�d�}���6z�h���p������o���������������g����'��@h	�@��M�l��v��w���#-55���={�=��36w�\;����N�:.+�������W�}���D*r��I��'�X�
��O���0W~��_�y��Y������^x�z���2"��g~��;�P����4�0a�*�u�]��_?������x���?��.��Z�j��n����+�����BKH"LT�UeC�z����k�_�e�j�rY�>����Y����[���[G A!����p��%K�����{kw��h�"k���U�T�[����R�M!�����%J���[m���n]jj�������!s(W�\i�V��2e�Xdd��@��@d\\�5k��/^l����2N�2��Y�|yk���V*8�}�b��/������#�cgJ���<�����_fg�����E��aG�����g�n{�MY������p��~��a�����������R��������W^i�����cG[�`��=�.��R{���t��6f����/��o�����������O��<������^���z
����x���uz&�{V0�~�����5��l��\��o��>KI���h��in��i��8GF=��wf��-~�8om�M[���}�W�������	i�!>��e���$��>6�z�i��|�^�RHdDJ�-�����+���W_�����[�nv����������A��
�����2"����c
���W����Wr�������	in���H���H;��H+[�g��g�S�-!���1��f��)���/i��/�6ya����+�&#�l����x���?1��ki'���ff��A���e,���	dJ�?!��l���J�6i��k��mm�������(}>�[����^�zv��7Z��]-**�;(�|�q�:�G�J�5Wz�����"�����#���t�Y�pe�"`���{c�,6�g7u�vA�&������V����/����Y��V�Sj�y2S�d�OgX��a��>w��e��s�o�]���l�o��#,��FY��aV���~��a�c}vR�p���E��Q�wO���pt�DFdff�%$$��b�v�\���7�l�7vHQ��w�������)��b���n=P����sc�_h������T��Ok������I�Yv\�]�G�{�=�P+����YrZ��?��k��Y��"��3��_�(kXeW01?�����$\����^��"���aJ��rio'�Q��������l���$kRR��eo
>�@a}�Y���E��c��}���We����Yd�f��r�]���KA�n�"�m�p�I}�aaZ���#����r��|,u�;F�g���>��3����U�u��L�g�U*�����N�-	Yv���uN���ee���k�n�j}���9s�X����e��.�n��V�JJ����JJ���-}�L��P�V_X��J���S�Z�q�{k x:=��=+F?P�{8T�7����)n��s�b�z�C~?#�^�>�Z�	��.�w��y���t7e�2>�������%�(_�>�Non���r�W���D&&&����n�F��+V�����\�*�z�I'�y#���c�����p�!(,D@����e�&��7���[�H�������47?�f��[ZF����Y�&�n�����f�����y�V�lH
�"!$����aK�,���������K�.�-[����om�������,I%K�*E�V
8�P��,��������V����{v��=����
D�E�YG��n�MN���D���#�-�B�"sJMM����q�l���.KRA���L�T��&M�X�
\P2LE�@�C 
��	Y���L�����E��z�+����SgZ��S����FY��"T���N r�&�=�m���f�:F��-~�����~�b>k\5���M�Q�������m���.K��?��e��� eLL�]y��v�}�Y�b�'#�2V.���k��R����8�U�����^�,���n���+���,�I3o���O��yn~3������,�f����@��H(xf�����O��toE��H������j������yk���O��9!�z�a=[�����LJ���Ms�Z�:+��o��/������R���=[G��
",�.8*���=I���V�B�U��U�X�eK�Z��$K�,i��w���Xoo(��RR,m�dK�j��|�����ni�~w��;�[x�JV����~d�J�o�f��[����6i�%3�27��������J�i������_Y��%���w3W,����-�to/ oO���]\�&�{EW��gqQ>kX%�e�^��[��=�����G��l��,;����U�EEF*�gQ��~[�iU��Y��Nc��8����ag6��U���~Ls���e�j���MY���9�<!;�CsF�_��&O�l��W^y�y�����]p��3��N�:Ytt�wm����7_��%-���wq����"4��Q?X������7n��o�Y��W-��W,e�/��|��a�yH�;�R�aQ'����n���{YF���G�ef��)�XeLf�Z��5(�*��Y���.�X�Z�Vo����\Fd�&�n���.��1>���#�j��n�#l��,WR�[�;�^��V?�Non�wf���!]4
��
Dj��7��)Sl��������{���o�����e@����$�z�-���CYV����j��}c�m[-��V��{,�G/��u���-�^K�8��g����_��E�6i��U8�b��k��;{[���xA��I���u��;1�Xx���>��.�o�h������vEpp���{���2��7
��O����d��@A�R
����Nw�HH��Yz��sG������?��gf�WGKH"�������a�l��v����
7�`���~��P��w�y. ��k�����={Z����w83@!����}�a�'�l1���/|�da��Zd�����f�+�{k�^���]y����!+v�-������aa���J	<�=|v���2�GW�5���>O%(0����������+�s%PWn���d�e����-~���t='c�y'���,��0�N�n'���GR�L��E���"��=-�gZ�X�+�
8:B"���do���]w�u.��s�NWv��[o�_|��~�m����q���\��/&�b{^fq�_k�R��e��[VZ����E^��E���|�Kxk�/��1Qb�s�6��M��h�en\oa�Tr�����-u������S�;
F+6g�/�3,=�,�o���t{sT�>����\�Rf���/���`db0�"}f�����N��o�v�r>k�0��X�i�&��g��m�j��oa�J���%d2"�<�����k����z��{�={�����N���XoO@^|��Y��[�<@����Y���-�BE�l���<��O��FM����_
qsQ�?��h��K�����`1��4���	
�b�f����#�q�p�Z6,�E��@q�:��c�k�0�e-��r�1:o���_�X�gW�����' 6�g}N��3�F�?����v9.�.=5r�r����e����,11���c��7��U�Z8�p�T�5���.�OJ��I�Z��U����^|�^����:a��?~�E�?�J>���vo��X�O#��e��bc,��iu���:�GK��C+~��uJ[oo`�N�$z�
�����]B"	��-���{-k�&�'&ZVr�E5;���p�E����u�&��G���������EG{[�=D�WH�f��K��K��^K������b�,��.�Q��-O���,���n����)���Dk���~��N�5�zGY��������	(�D@���f�����w��������.��X�9�l�=�b+v��V���-�I3K���M��ueeY����:y��t��,=��>���>}���b����[V�N�@aD 
��H����b{^����8�JO7��
���e�l�9��+��Y>����n����G��FK�f�E�k`�����������-��K]y��[Y��A��`�w�0"	�/2��O��2s.��[��.[2���������/.�|�f���u��
�����27m��{�/,������--�S7�l|����#��'�2�.��F"�0��-u�XK�z�e,Y�WV���������T�Q{W@�m�2���y.W�������.����e�3�RS-,6���s�����z��,+#��N"���*c��O���K�j���6�e"���a���l��F[x��}z{����k-e��:a�e��yk�@f���ae�YL���7_L����m�����fw]��a��T�F!�������4�dffzk��lk��Yt�.��t��|�9K��%���%����J���/��cxGd����Z���[���[Vr����eeeYx����2+W���EG[t�.���l���g�_q�GF69��m	(�|Y�9!
:�\���.]j6lp�H�����U�Z�:u�J�*������b�cGY���-+a�Y�������6,�����������x�%d��kZ�����a^���v�E6i��}<TY.Sr��MgY�m|X��{�E^�����N�$z�
����8��
Dn�����g�}���5�$sj����q�v�9��)��b�������@$Px�L 2!!�>��{���m�����A+[�������*��i�&[�x�U�^�~�a;���-&&�m�H��
�@������k�u�X�?�|������W��d�l�={�}��76t�PW��������?�m�H��
�@����?������|�A���[�-��}�v{�����W_�'�x������Y�@a��b�ed/���Y������������/+%���E��c�+V�~�g�`��[�����f�ee��/6�"��oa��z;��A (�B"����W_m��/�������3g�������N��Z�%�-@������4�3�EEf���yk���������{��������,e��:�W3�?����t��3����v#3V.���>pP+�RS���`��^l>�fp�
�}{5�����~+W���.]�[���+�y"w��a����Z���/�\��|QQ���E�q�>KD�z����o�f����FZd�F{��n�l��R~������dfZ��#,}���}zY�����N����X���������������_H"cbb�n���z�j[�b��6k��uK�j�,::�[|Yii���`�b�����������D�:��;�3�g/Zd�����[��W�E�#�6��Y�}$+-������cXL�nQ����sA���p�X4��#�gZ��o��fo
@�B"k��us���|��-[��233��{(sr���6d��
��K������@z���,^<{9�)�~K�>����;t��2{�y���N����i��lH�q������������y�~������ba��XX�
n���D 2##��Z=�����/��^x�F�i��M��e��Y6z�h{�����w��-Z�L�I�&���w/������yg
���$���f��8�X��R'�ss<�M�d��W�������*�*�gu����Q��������EDXX����iC��\d��[,}���[X���1u�(�\��b/�����H�e)��_o/���8N�>��,Yb*T��M�Z��U�>			6s�L�-)����3�I�&��+[v��o���X��v�}�Yx���*m���i�]l�E�:�b��a���f���?�Ps8n���o�b����\���K�������\vc�_7_�R���K��-�R��������2_�bV���f�o��|�I�:������|������D�Y�0��b�3���������[gU�T�6m�X��
]������e�7'��i9��c�D��,
`��1��*3��J�u��UkXt�����E��ki��l���i���y;�-+5����]0������������'%��S-�O_���X��Q����&���N�v������� $8h!���!�����QQQV�vm����uY;�[��_��c\2H�\��v��s�>{���F��}e����m���y�m����L������@�w��[��Q�����oj�I62"��+$�@Q�,��9[VF��&��<"�"�4��%�5yK?�v>�H�����S�s��y	V 2s���1��^��_w�e�Y�����|V���[?�����
��(�
�
�,������������}����4��
�������J�FGg�1�ee�{+s�gj~�EE�}����b)?7KL��s/���[�;,���,q�{��������]��CH"5�J�.\����c��"�ly�=���^�g���Z��o�f�������bD�ee�]�1?���<���jY	;��{��������)�}���*�����n��~����[�����U���H�%}�����KH�f�����_~���������d����
��K�q��x��~�����m�%c��~�-^���~a�������-+=�v>����>�J>��E�>���K��-��,��S��O���2@���/?���g%�~��W,��G����=nQ�v�+���-��W�T�uD�����AiV��
�����L[�r�M�>=�e��i6j�(>|�}��'���?��E�l����(4|>�X����~ji�'�UVU�R��O�������|�q��,��g����z�M���&��<�i��WW�����[D���!M7�2W���z��Ti�Y�D��z�����,�ee���%��l���������[�6m�c���,m�������%::�*W�lW^y��w�yV�R%�g^�@	s�W����2�,t%Q-5�27n�����/���]z��W������Ri�m[-�Z
�y��a�KX�����`�{����FK�k�%�������b}���9(�����yRkW���}M
��N�������U]04m�8�g����{XX	*�8|O�c.�ve�(��	���K��d�{���m��-��;��c��@���a��C-����q��W��2���X�1�,���s~����_������u]������zeJ��eIC��J��+p����<��9{�f����m�������gYx��n��1?|����fQ�Ot���3�[T�6w�5���S���4+Px�DF��R�d��e�L�2��������-[ZXXHT���2#6��������,���Xq�l��b{���]w!��t���aQM�[��'�/"b���{���u��SSO��������������M%_#����(t��
���-c�r��d�:����R���x{��!#(�
TFd�����O�>.���oZ�{:I@�AF$Px�@�����w��n^�A��,��d���l�2;����g�?III�t�R��a�%$$���W�����Xo�Cw8��jk��u�u�m�f*T�z��Y���]�k^�7��2_K�.��"��������h#F��������oo,R�;w��g�}����{2d�5h����/����/�����m��i�f��Z�����w�n�;w�r��y{��=���+]���m���V�Z5����]v�e.�����5������>pAK@�B (�B"���f���m���[�7]�2���}�3g����K��_�"3G���#G��|�J�,��@�2?��{��'-&&�����SRRl������n�>��]~��n��:��j������[o�e�\r���6c��������o�k�[O�4�������'<�\H�B�@$Px�D Rv�����~����Jt�k��"�=�Xom��u�V���~��7�o ���~�k���z�!����L�2�$�g�}f/���f*����p��x�b�����Y�f�����>�?����������_��f��;���E��;��c5k���
�@���.�v����wi���u���e�=��{�
+e���;��&U2##��������T>|��]u�U����G�~��y��w��,��q$��<�3g��N8a�c�Z�5d�b�S�Lq%\�+�
������8�����|��[�}�]:t���Tf�����Px)[��G�����n����9��?~�s�1.p����^k��k�Ee��#9����
*������ey��
Nw������(LB"���N�w�~�z��Y�%�D2`��Q�b�
�i���������m��5.+Q�i�5��{S0S����g�����W�fQVeN���.#6�����]�s�����k���z,���8`5���K<�R��>TVa�J�\�6/���������kwg+����V�Zn�J���z\�`�U�R�j����)3r��Av��'Z�N��T��0�eiB���
TV�2��Tll�5j��eT
�����=2d��N�M�<��x�
7�+���>�����q���[o���~j}������H��u�V����m��������
Jj���
�r�%K�t������^x��9�wl�����?{@>�|)�{V0�pw���@�����g���
Hi���s�zk_���]���e�zk
��	D����v�5�=y$��f����G}�����<��6mrA��{���m�J��x��V�N{����T�R�n�:[�l���TF�2'U��H2%�o�n����+����O�y�
�.��=
>%��.]�{|�x r�������i��5{��������c��U�B�
n�@���[�lq�*��R���w�'�|�����	D����v�-�=y���j���}��W6g�k��������������>�������c��ic+W�����	\�R�Oj}��}�Z�j�Y����/�^�Mw}_�{V0�|�"�P�)�V����SIN=�����k����+�Yg�e'�t������
T��=�~��3f��k������X��-\iVe�M�<�{�����[�z��+��YD��_�~v�	'���?���v}��7��m�����9��j�^{��������>4���.3������U�����=	��CUG�+��
�<��?�����6mj>�`�o��|��g]@J��=zXXX���`�4i��~�����i�De���`���
s��
�����y������]�_|a^x��%G��iii.����o�`���K�.u�S��X�2e,!!����������������3����a�G��(lB"���������x��W���f�r�����r�x?���+�Z�(�v��g���/�`i�EE�U�T��yIJJr�/j�*U�xk��h�W��#F�������[�o
�/^�N<�D�7o��7�+$���S�Ue���[�[���+��5��J�4��9rd��%�\��u�*U�d�{�+����h��U�VY��
�|�����;�U�R���o���/�]�w�����Vez}>�['��
� t�LMSU�Up)>>�[�?�4��J����{k��Ee��?�������������Ms���{�P2"�}�Y�f�w�}g�{��F�yk�e�j����f�q���(����H�T�T�8����s��e_��ms������X^�u%K���]�Ztt�}��.�(���3f����J�v��a��P����o�������ys�����TP�{���m1�Y����TP3P~W%|�/_�&N�Z��[���X6���F�o
2���/6s�L�R���[��SV�Ju*@��$�x�
����;�v���Y�e�*x'*e�W�S�2��5k������k�������m���6`�?~�]t�Ev�u���sz����z��=��sv���9)v����������t�baa{��
N.Z�����c�������'R���P�}21�{�4s�m��,_�"<!@�q/������{.���U+7�b�j��v�TT���n��6����w�XT,X��z����2����e,>��S6u�T7w��aT�N%S���{����iSo�=�|�I{��G\���A��\�r��]��9�������[�t�����V�V-o�.��r��������L����a�N?�����}{l���d��!�5q@��}6�.*3+$2"Ep�WP�E���������2���,Ie��t�Mv�W���E����X��j��a;vt���Q��m��V�bEL���N;�e �x���f�*�1))�}�:^�����9�[��&M���'O=��}��z��������*`y�	'��w�i�[�&	������fk�D�P;�:5��^8����������)S\����[���*��9!O9�#@����L{nx�mI�`d��>���h;�V�����\ 2']ZFF�{�y$|�:��C~O�q�2\029�["b�v!�5��^�#��F�"�~��wP�A��2����w��
F.\��J�.������yG��l�z���2��n���UJ��Y�p�W�>�P�T 299��c9r��5�f����u���
������{������~��dG!(d�����������;�����[BB�5k����+���+[Rq����������m��-BI�"-ZdO>���X��z��m/���
8�Z�h��a.#��s��O<��b����L-!������~���M�f}���^x��8��^�����{{�EFFZ�n��������t;v�{ZB"�y g��i5k���={Z�%�-������l����Z�� ��D 255�6l�`�j��J�*yk��@e���m��������*B"���qqqo			���%%%�}uL���BCH"Pl���-\��&L��2$����f�����W��X�%$�QQQv�)�XDD�
8�~��'[�b�%&&ZVV�[���m���6q�D������l���;@h	,���_��!w��i���������q�F��i��~T)��e���q����^�X��}���.���X�B�/K��!b��5������#l������2�U�T�.]��}��g��W��%!�����9r�H[�h�+�*>��j�����g�y��*U��zB.�Srr��R4'�2"�����������~��=����������LKK�U�V��"7l�`k���
*����o������[��%]�V�zB*�c��2e�}���6j�(���]���A�,&&�n��7��]w�e-Z�pY�BK��fUpq���v�M7��1c\��i��f�����0W�U�D�9��}����J�%d��f��^x�233��[o��>���j'�t���Y����_�~��sg���m��	.8	 ��D R��~���-[f��~��}��V�N����������q���&5?�������BKH"l���V�~};���\�q5jd��5�u�����BK�dD������/o�K����O��111���LiV �D 2""�J�(a[�n�-[�xk��}�v�����BKH"����i���p�B����->>������$3f���7��4i��ZB&#�}��V�R%8p�
2����c7n�����t����m������Z�2e�]�vdDP��g�����9�3mKB��6Y���'g���~[��o��9c���')-��go��"�f������oE�/+���_���b������m��Y����y�����?���^z�-]�����{��|v��w��������y
:n����;���E����L��C��u|��S�lc|��H��yk�6q~�ef���;�J�����P���a���2%�.3�YvL�0��.�U	�����	D�J������������]�J����K���+Z��=���ov�@�2{u��2+��,���t��,5������D*sq��=;��n�[D��v�dY�
a�r��D�yo���CR�V��he[�6hR�U/f�_c����[��o~�je�,��<��e����������O�6m�X�
�\�rV�lY�U���x��v����w�a^x�+V�;
$o��f��fY�R>kY7�S��%f���"�^�}g����o��M��p��;&��g��|��J���k���<�����g��L�� ���e��kw�Yg��[��V"��2,��n����e��Ip��r��aaa��I����]f���������}��g'�t�EFzC@���V���e�����:GY���$���~���������1��a��F����G5�|�������z��g?N^�i��tA�H��{	�qz��OHHp�YW�Z���7�.�

.O�~����*����"�r�0<\�z��q>���b���&d������������
;���?��I�0��8��-��,��
@*�8u�T:t����+��SO����^��������/��}�w����j�5�n#�J�aS���	i�l���6
��h�
��n��f��r��-d�
B�X��^�u���K�������z��
�"���*�|��'�a��H��+[�g7v��&��m��]Y�gi�ZG��U�6v^��on���d�)�_2w�[�l�_|��~�i��S�Nv�WX��}���;vt%[|�A{��w->>��p4T/f�=;���'�^�cW�iif���[��s2�����YH"�
������~hM�6u��o������o/���[�����veZk���2$��7w,;S�l��L�{��E������45;��o��'GZ��gsV��{���o[��B"���b�G����{����W�^�m��X�b��gO���;-))�~��KOO���P�t����&��r���Z_�i��e�IuT�5�������R����3���W��6����H�/_n��7���[�o?5M����s����Y3[�t�;���%}��y���"b���Z_�%�f��[X����U����a?�J�6
#��3���z6|z�����m!�Tp1..�����r ���n����f �T.fW���k�G�^�Z�*u?��8��\�i�a5�����2���^O�n�O��r��l�����	CH�P���N:���Yc3f�����G*�8o�<����T ��4���,���
;�����V�r�uma��Y���eqQ>�������f���
@�"����{w�^��}��G6u�T��m�^Ie>&&&��9s�����R�J�9���2(5Od`�_~)�fd��33l[��u���3lg�Y�V�V<�g1�>�
�)�o�f���,[�����V,Yp3?�`
,���_���������~k�&M���TKHH�u�����+�|��'O�����s����V�re[�l�-Y�d���1������7jv������X�W��A<�;v^�������@Fb��m~{~D���8��W	�Z��>�����7[��o5*�Y�&��v������6g��v�d�32,3�g���*�-,���dq��-��O�����5��k��6h� +W��������l�Z�]�:�N�w������}ol�U(��[�DY\����	Y���TKL5��.*�����s �QQ���gXR�Y�h�sN��Vu�w+��,$�;v��'�x��d=R'�|�=��#�t+�GH".LX �B.#2==�222,66�[c���b�V�rsI���X�J��b��FE!��el������O�������[xx�������c��W^����[����G���o_�_���@h	�����x{����W�^6x�`KMMu�-Zd���M�0��U���o���=���.p	 ��D R��S�L��_���)���~�[F���$O9��]K�N�����'�c���DjN���G���;��t��������>}�EEE�LI ;w�l��s���c4$������d[�r�5j��:v��{��u����3�z����uk��|n������1"������t��m��-[�J�.��5�;w���5��4ibU�T��f_tX�[�[���D*��J�*;R��:u�{~���[�%�s��a�[�+f�Z�"$�
(6n��,X`S�L��[��������~ssA�z�����Tr���.[�i����@��@dTT�u���e7������;��3�<c'N�N�:�q����������k���Y���o��(�_V6���J%Y`|����|�*�Z�vm{����K�.���h��v�
6�*U�d7�x�[bcc�3!�#G��2!��������-Z�����0`���=�z��e:t Q!�<���4|��|���@"a�#
�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t��l�s����4��e����[rr�EDDX\\��-[�J�*e>���s_:v����c�KMM���hw\�2e,**�����y������m��M���d%J���+���h_-�j�r��������S��/��	&����]��y��v�����v��.8�[bb�M�2�>��Cw����]@������.��Z�li����>x�{^.u��_mK�.��M�Z�^���.pA���|�����o��O?���4i�m@�,��!&!!��{�=����l��E.�W�J�TPo���6{�lk���U�Pa��He,j���7o��.]����?�����Y��������=ozz�}��G�����i��f}��qY�o������{������f���_~�z��m��w��0*	DvB�q����_|�����~���_�����i����l:tp����K�DjN
*�P�\������f���o��v�^�)�y(��k��qY�m���g�}����z���Z�v�Zo�]T����?we^�?��C
���G 2D)[��o�u�#����n��V7���###]V���>j�{��BT�0 ##�����5�\c7�|��/_�m��]w���O�>�F�a���n���y�,Y�2&U�5�1z��*�� ��z_�]v���S�����@d���q���Z�j��k�<37n�y*��l�2o��c�=Y�\9W�466����^k��O�8��n��m��#9�����c����c@�u��H�������F�v�y�Q��"���M��Y3;��3\&d^�����^����@e�����{�U��5l��e7j��q$�U�UQVeN�;R���l����~�������	\�` �Tru�����o��S����-..�e!l���eIV�T�J�,���[�%�1+W�<���#9����w��H=.^��*T�`u��u��o�n�
��M��Yg����(xDP���n�I�&Y��m�I�&��,]���O2/���v�1������r$�U ��3��1c���3\U����^����~?~�M�0�z���o&(B��HAH��}�]�}��o_�R���u����r$�-_��]y��.���O<a>��������]V��}��G��M����+���%K���Y��<������|Y����HIIqY���s���~�������bcc�=�^{�5������n�W^ye�m���v�w�[o�e�~���������#=o ���?�?���Z�je�]w��l��m6l�R�m���])X���W_�`�q�g=z�p��e����z�4���
���
>�����$[�t��jo*G�_IR�L������/_��x��w�>A9��x�e�=y��+�;�_�~�D��/������SO=���T�r�����w��`���_oQQQ���FY�k���^MU�VuS�-"��h<����W{S���~�{���g������o��F���;�T�R�{2�.�������?������������j������g�������*;QA�g�y��>&/��R�\�������������?�qsK�������ph�Y��EY�5D6���]q�����|��.30@�<��
�EGG�,He���(����u���.��8p`��J�S��c��q�i���m���:�������n��M���O?���2?�<�L���P����}��w�{WPV����;)�
�<�f-Q���*�D�0��l��������J�*�� /�����%�;w��D,^���0�U���e�E��}4_��5j�m���8oZZ�����.����?v%X%�}��G��
��=������y�A*E��u�;����]}���Q�L�={���3��~��e�����]��-ZX�j��-�w4��`����/\����{k�"##-,,�4s
d2*B��E 2D)���w��+��be��u%K�v���$����
��o�.]�:�t]�b����/_�25�c�6m\�cN�6mr�F�s�ysKMM�����RRR�G�{Xk������?�����u����W[�b�\v(BW�c���!K�.us#����.���[���k] .�E��j>E�.\h#G��m���`fbb����������9o��6+Y��;.@��_|���7��>�lX�#=oN
�������X=��s]d�2"�y��#�)����-s%\���������82��>����������x�	{����W����v��w����;w���uX�T);�����g���N:��{�'�|�y����9��+�m��p��SRR�=��6e����O��c������,�z�����
4pe\t}���]�T�Q�&2"C�����2+T�pPK����e�����T�Z��RUfbxx��*<���_�~v�}���^^������q����111��]��9��*�z�%�X������<��]V��	�q����\;t����-dD:���HAG @��t"�HA����=������7[JJ�U�R�����-���			�}�vKNNv��+f�K����8��|n]����a��_�.Y���p���n����V�jQQQ�������}�f�����K�*�����Ho��%%%�c������y[�xq�w�g||��]��}s�1�|]jj�k[��+�=4�����V�?�|�����j
��GF$I7��?��]w�u��8?~����Yc~������N8��\u�U�����m�''7{�1k����1�[8T��~��w�G��l�2om���1e������s���
���O>i�������S���+���k�e����^�z����������k?��j�GF�������q��C@�������g�����ozk�v8�)B�H��]��1t�PoM���_o>���s�=�3Z9Z���g7�|����G@p)�q�������{k��L�~�����
���o]c�
��G}d�]v���W@Q��/����z��6s�L�X��;V#?���r�-�x�b��8:��r�J{��7l��%�Z@(����M�����v���p"	�������n�u�?�������>��m�����m���n���O�u��n�u��C��'N�;�����������y���m����}�����:=��?�q�_x��}:�U�U��X��um�������v^�g�u����������A,��� �������(��i������~��W����?(�D���j�>������|K����/���j���J��v�in.I-����g�}�mS��:OGF�A
Q��m����c4��:�L�1c�]s�5.�X�B�M���{�[���
.�,���������x��w�n111.��y�������I'����*[<j{5H�����;���F���
�
�[�`�=�����[oY�%�-��?(�D@���j�kt�nz�M�n�4�a�rr����c�+9�}t��U��~��Is^-]��V�^�g9;�G��X���v�Ms{�t=9�A���f������QG���@{��Y�������S�up���Q&�:�5�X�-�-{h��M�:�u�,��g��$d�E����j��nk�Z��j��[�O;�6t�����1j3t|��u^���G�rnj���k�2�����#� 
�W���Y������o������2bT&U�
*��]���7]��1c�l��v�y�Yll��e��zm�0a�^�����]�e����O7���m��V�Z.+RY����Q��S5����P������U����/w%�4w�����^�5��t]����t�z������{~w���V��TmWy���!�k����XQ_���n����}i����^j_��k�5���3;�������l��u��������>�PD����n>+u�N�6���?�x����
4h�M�:8t��s�{�v����.��������'@7q�:u��/�������:�����u�f�-�����Nu�j�[���������u���O<����#B���7�[�lq�r��:5r���2!������>���vr�cC���i���tl��5i��=�>}z����tC����Z��-��K.q�d�hP[�Q�j�8S[��K��t�M���	j�~��WfTm��Q�L�*cD��Cm�+����Q���MQ��v\�����o�6V��3�<c��z��!��Pg��N��j�u��m��*W����y"�������}��*SQ�d^�oN��Q@�q���-��Q�F���}��C�K:�L�2��=Uf�2$�^�C�@�9(�y������zO�0P����������3��{�9�^������s��5o��W���'t�~W����u����g�����������������6k��n���}�P���D�_y��.����Q�����K���F��zMc *����/����^�G�������S�L}W�{+���{l�'�`�>o��o{��H�A �8�����nL5�:N���]G�n���f��j�X�*U�~���MW]u��G��:��?�.�I�����+���>��S���n*u�K���H���������+�kW�������H�P���~9)�E7�_|��{��lD7�����e��3�`���#/��W��O>i���s�*�j�j����EQ�Ou���@9:��~����O�>���?��\me\\���S��C�~���'�p�{T��;�Z�w��V��FK�����V{�@Q���gT)ke��cX��vN��:������1�W��������T�I�-��tL�F@���r��V�T)o��T>J��,�������V�Z�%`�U�ti�9(�]���������r��j����kQQQ��"����|��j'��JcJ[�k���o�o�q��Y���]��J����~�2xP�������@�������`���7��S(S;����@[���s���
d�+Wnw�������}h`����	J��S�hP��r���v^�c�RA����c]��
l�g������^����@$q�	���nT�#�0��U7���w��q���~��������~����6��}�d����C�����s4�F����nB�i�Q�9��(kD�	6l��!*m��`���m�����5��@e9t����r��S�:vQGCN�q����
�~LuL�=��~~*U����B#����P#����$/��"AH�S;�N_��jx�q�XV;��XS[��j+����Z���/��Z}�8PvH�G�����PG��km����v����Ov�:Fm�~����.�G��k��h����O>�d�A*����^^�r^����m����v�zH��9�j]C^��������������Ps��_�:���� ��4y��YCm~�m�q��:�5P�P���2�t�*���z_�~T{�{��z�e*i���+�����������{��T[�L���T{�A)z����t��e;*�(�V�
*��`t�?EY����g�����225XGsU���>c��]�j��]�|^��9�P���S� �G�n������<�/��7�Z%>4�O����/��������vuR�f\7t
�(�Q7u*��s�F=g	m�1�[��5j�u����c�6m\i��H:��5Qy�y����	�ju���N�#��j�����Hu��{����h@!��mK(��9�����];�6P?����j�+T��~x�4i �O�z���|�~���@�:$rvthd��g
�P�mu��%�N
u���S��k�1����S�L��X���+����8���N
����]�kQVx~��"gG��P�����:�g���:>�Q�������
������9�����<u_��L��Q��w��������v}���R��V�|?��5([��Lt��N��
@��A���D'@�j�UF�|��n]Q�O�4���X�����<�LW�U5�]Y���.}�;K��%�{0�� 	E�~T�-7eq((�ku0nds�:�+���F
�?����#p��[����Fk��n�%��]7��,��s���n�u3�si�����G�(��d���:r��F�i��.�����{0�x(x���9�g��$��T.Z�v��}��f
������k���p��yS�~�G�: �n)+/����m�����^�z�u`���6_���uf��E?�5�X��F4��:N��:���6> p\^�r^K�o��������Ku4��N%
5
]�!�D��6?'��7'u�+�(���*��v"s�������F���$p������lpe\�;B�����j{u��*���V�b�)���*���!����%
��)��@V&��"	E�n��*m���*(����P�Q����/*�Q|*���	��i�H+Hy�I'�s����N�����������]�tq�r�e��I�U�_7���T�n(��z�����)*��"����!�=����A��_��hN-�����|��T�Y�j��hU��Fv�}W��s��m��V'I��C��W6���]�:4T�I��,�:F��6u��Ou�)}���F%������r�r��?:UW�s������OQ��*S�6Z<T&z�-������A#x� �����)�y�����G �'���;���_��F�U��
6�F���C7��:�n�uS��f���N���H<���~��sbr�_�B4��:����-����v����J��F#u��V���]�������
o�k�M5��
��?��FE���Q��<��rR��,������� �H�@�'���eu4�#Bm�:���j��:d�i�F�=W&M`����uJ�}Vg������ip�Fn�����<9;;�\#y��y-��Fi��mu~����l�%g;��vmS���
�����g��J���o���c�6���w
mG���~"d>�46:��h��(���
&����~��(��)
h="y�
��3�������Y:I#��A���F�-[��u��Q�����k'\�:mW����4bM��u�������g�����6l�+����5�b������������#�>��M`y^V�^��U��ggH��u�D�z�:�{���~0���@����_����?�5�[���uF�D��~��Z��:��N�d�\a�Q{����Ne���gv�
7�s�c['��Hl���\�wC����l��Z4����U�I�����������{u�k�@�&=dS���W���+\)��:��=x�w���*���_��_~���E������O��-[�t���k��U
�P[�2�����oQ`N�FTvU�:WNE�?@h"	��:Z52Z���!yQ�F�)�1gy(uh�#C��t�8�|�1��@����
D��Y7���V��������+���u�]g_|��������������]�QD7��rN��(>��k$�h�z^��T�U?:w�l}��qA*������: Y/1�_G���K��=�A�Gud�Q��Q{��u���	d���UpM��j�s������w��I��_|�E���=���V�>}�t����w�t^]^�r^�:'�1_X�J�\��F�����W��S�|���>u���6������g�W����o��~�+���_?�|��7�g��������H�St���Xm��[��(sRm������?E�O�6��l
��(��)Bwt�<��90�Y7�yuth]`D�n�sN��W�k�n�u��k
>�F\��Z���������i����G7B/g�����PO=����@7�����k�u�<��[�n���O�7�_G2zOyun+�N����:&7}6
����5�\�:4�P�29�[��
�����Ls��E>��h?uB�l{�I�����E����u�����d����Ow�G�A��N\p��p��Q��2e���n�N���k}w|�������-���w����\��{_�p��P���^�{K�qj��A�y��}�}���D�>'�w}��1��]���;��3����rs)��������H�S4hN�U5J��<�kT�������T����[���=�(��M"y���������O���F3F�) �u��}t���Y7��1�6�4q�:>�l������W�h���.a�s�#D����r�<k4�2V�u��s9'�W'��u�K���#�������?������L���}���:t�y�:�4jQ�z�-�i���@E�uh��	\{�����5Z��]��vN
�)���E�e��Y�2	d�O�8����9�N@��I�0j�4�:p
��O���\i���.��M^�r^��
Fv���N}�|���n�x��H�������nP{�����]�����o�q�5�.+9u�T���Sg��:/:��yu&}��W�Lk~��@���H�S4�M������j�u��g`�^�*���e�A#R��S���yRG��_����#�?�������D�����:9:u��FD���tc��o�����SI�r#q�������9����'����Qo=���{������s�=g�����y�������� ={�t���>���s!������p?@4�N (�?�<4�Q�6����vw��(�E�h)������^z���V��
�v�zu+�N���e��^�r��Q't��
������[���buH+�0'e����:]����;���]�Fj:����v�����7�m�ut���u�?����;E���|����R�9���������^��^�����v��w�����/w��C��D�:Y��������������3<x�kcu������g}�;�mS6anE�?@� 	��j�?����V���{�v�C���M�Jp(+D�<T�)7�	���hfurFD�:5�X5�����F��r�-n���I�����r����Y�1w����������|�
�
��������u��N�K.�d��k~42����wI��A�U4zD���W^iO<���<Q��v��P��Nj�����~�;9�i��(h�W*��5�X��e�h�tn�0T���by����k� ��n��e�h�y��w������8up�����m���z���w���u������"+�U?�n����\v�>�o��u}�p��}}�*>�rT@������\k 8���������vi��e�������i�����.������WJC�Dm�]��&��O#��%������� �%""�uB�[��S6��ju�j�v����7�����������$���F�i�v���:�uC��g�N��~(h��Q?@�i�����*#T���<���n�s��@�Q�H���w����
��
jo���vQ�����N�A��<������cj�4G��x�o�`��j{�i��^�n��Q:G�6m\G���k�C�&���5�Z��r4���������s�����:l�:�D}f���wK~����T.+�^U^K��L�����	���e�\��V�ZY�v����UbK�����
n�S@�A���3S��$��U @��9�vE�?�������SOuY�*���U��6l�k������%T�S4����TZ
����O���r��9_�
+5�Y�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�H@����e����y�fKOO�����t���
�5(�DB�k)))��#�u�V����U�P��N���=8�_��x�'�kP���4 ��g���O�5���@$ �}���v�9���u��58���+W���,Y�|>���Y"!-##�{����U+7G���C�l���Z�g�����L��c�%$$�����n���;wZVV�[�}������G��������?����h��ms�����<����4w�:W���.�u,�����9����}
���������gK��r�g��&�5�t���/��H@HZ�x��k������^?�������_��`
�M�6����k����G��?���6{���fU*��}n��&�[����Q�z��e�|���J�M��7��~h=z�p�������i��Fs��:���^s�	��S�N��SO���s�yS�L�����^>��-={���3�g���L.��2�9i��;Z���m��d���H@H
�R�JY�������XWf�D���=T��_�.]��G}d�V�r�hY�|��)x7f��|�#G�tAC�t���H7n�]r�%v����`����������r�-��XTT����3g����jW\q�-X�����K�.��/��z�!����w�S���_~��:�,=z������.���^�-,,��/Y�R%�wD���z��7����Rt��%K��G��.��~���C�(�DB�����t���e�
6�� ����\ �r�����������>6l��c�� ��5kl��A��j^�<������6m��k��s��_��~�m{���\����[��'L�`g�}������:t�����L�_�����x0�e���@�u�]��u�=����m�����[o����}f�����^�q9t�P�V���~�����b}�����/���O>����(p
w�}��*#U�I 	(�XT Rs�{����h\\�����-Z��>���T:TsF�E�*{�������OX���m��!�l�2o��)(:b��]y�)����?�u:�J�>��sv������~����4W�� k��eW_}��*�Q��+�w�y���E����� �2LU�VA����'�g�}�������us�Q��T����S����"+�n"��t�����C������{
�)�PJ�wU&����]f_n
j>��+zkv���8�7��g���m���E�����9y*T�.����Q�F������U�V�Yu~�������{U�UY���F�yG<}V
���|������;���g�y3[�n�m�C�_}�*����f{(�D
$e��l�?�`�k����xW�Ts'j�2���z`����6n��{�7��4i����?�=�GeQ,�7U�0���c�q�E���������s�w�q���}�d��������]������:�/�������Rg��N�yJ����g��=i)V���j_��!	(�RSS����;�����X�F
k���]r�%6`�[�p��*�Oll������"�*3ptIII���g���0�Z:v�����/C37]�2,U6�J�*6o�<{���\@R�?�O�zU �P��
 >������25U�6P�6@�;p�7�pC��IK���]iVc�}(D
$�
��|��+u��j��;v�[�6m�����<
\*�QsK�o�>*�z0�\����}��G�j��U�5�=�����km������J�b~����M�e��<mn*��{�����P��Hs�������^�uW��������.��r;��\�cff�w��Tz4����v)Y��{���!**�4h`����>�Ks/���^�z��������/_�.��"���Om��%n�F�����|��
:���"U����?��_~�]�SO=���������><���{i����D
��A�Y�f����:u�=z�ys����-���
�i�+������
2�/�R4�c��u������
����?&h��j���]	��7zk�O<�DW�����r�4?cJJ�{���oc����{���Ui�SO=���/ec6l��e_��j~A�@	W����!	(��9W�J�*@��[����S�n��!���)�p��u�h:��|T��w�}g]�t����m�Q�d���-22���]�b�^A;�S�����������u<�b����;\��)S����uN6������r���S���9�/5O��)��_�Y<�-S��}���������~��-[��W^��� "!M�0���j�*�y�������Q�F�i�����\���6m�d���������
����_A���S��;�p����o�5k��o�a��w�+���T�T�;"
�]p��|7�x��?��l���I���+��s�=�r�)V�lY���U�R��=�\�<��~��{:����]`��7��r��Y�n�v�Q����k]r��i.`�,K�|���Z`�!�������l��{]������t�R;����f���8�e�;p-�%
^|������5�����]R��'�x���M?q\T�QY���r�T�������?�i�����a�>}\ MAC2u�@����*���&����I�&����n]�v�A���TJ���o��'�uM
���,T)U]���<�����{\P5�s������3�k��e�]��+����?��g$�kPV��A�S��w�~�\�S�BF$ �i~��^z���k�J�*#R�|��P�x�����\����R�
,*+��+�p�K������Y�*G��U��c��6t�Pp�9�T����c� �(�����s�5�W��+���G�uM-Z�p�X�-�@��!�b�����o����K]_�s�z��{]g^��`��iQ�������edj���54j������}���	B�����HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @��t"�HAG @���?z�%��+�5IEND�B`�
#13Andres Freund
andres@anarazel.de
In reply to: David Rowley (#12)
Re: Make tuple deformation faster

Hi,

A few weeks ago David and I discussed this patch. We were curious *why* the
flags approach was slower. It turns out that, at least on my machine, this is
just a compiler optimization issue. Putting a pg_compiler_barrier() just
after:

for (; attnum < natts; attnum++)
{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDesc, attnum);

addressed the issue. The problem basically is that instead of computing the
address of thisatt once, gcc for some reason instead uses complex addressing
lea instructions, which are slower on some machines.

Not sure what a good way to deal with that is. I haven't tried, but it could
be that just advancing thisatt using++ would do the trick?

I think this generally looks quite good and the performance wins are quite
nice! I'm a bit concerned about the impact on various extensions - I haven't
looked, but I wouldn't be surprised if this requires a bunch of of changes.
Perhaps we could reduce that a bit?

Could it make sense to use bitfields instead of flag values, to reduce the
impact?

From 35a6cdc2056decc31d67ad552826b573d2b66073 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 28 May 2024 20:10:50 +1200
Subject: [PATCH v3 2/5] Introduce CompactAttribute array in TupleDesc

This array stores a subset of the fields of FormData_pg_attribute,
primarily the ones for deforming tuples, but since we have additional
space, pack a few additional boolean columns in the attflags field.

Many areas of the code can get away with only accessing the
CompactAttribute array, which because the details of each attribute is
stored much more densely than FormData_pg_attribute, many operations can
be performed accessing fewer cachelines which can improve performance.

This also makes pg_attribute.attcacheoff redundant. A follow-on commit
will remove it.

Yay.

diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 2c435cdcb2..478ebbe1f4 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -45,6 +45,46 @@ typedef struct TupleConstr
bool		has_generated_stored;
} TupleConstr;
+/*
+ * CompactAttribute
+ *		Cut-down version of FormData_pg_attribute for faster access for tasks
+ *		such as tuple deformation.
+ */
+typedef struct CompactAttribute
+{
+	int32		attcacheoff;	/* fixed offset into tuple, if known, or -1 */

For a short while I thought we could never have a large offset here, due to
toast, but that's only when tuples come from a table...

+	int16		attlen;			/* attr len in bytes or -1 = varlen, -2 =
+								 * cstring */

It's hard to imagine fixed-dith types longer than 256 bits long making sense,
but even if we wanted to change that, it'd not be sensible to change that in
this patch...

+#ifdef USE_ASSERT_CHECKING
+
+/*
+ * Accessor for the i'th CompactAttribute of tupdesc.  In Assert enabled
+ * builds we verify that the CompactAttribute is populated correctly.
+ * This helps find bugs in places such as ALTER TABLE where code makes changes
+ * to the FormData_pg_attribute but forgets to call populate_compact_attribute
+ */
+static inline CompactAttribute *
+TupleDescCompactAttr(TupleDesc tupdesc, int i)
+{
+	CompactAttribute snapshot;
+	CompactAttribute *cattr = &tupdesc->compact_attrs[i];
+
+	/*
+	 * Take a snapshot of how the CompactAttribute is now before calling
+	 * populate_compact_attribute to make it up-to-date with the
+	 * FormData_pg_attribute.
+	 */
+	memcpy(&snapshot, cattr, sizeof(CompactAttribute));
+
+	populate_compact_attribute(tupdesc, i);
+
+	/* reset attcacheoff back to what it was */
+	cattr->attcacheoff = snapshot.attcacheoff;
+
+	/* Ensure the snapshot matches the freshly populated CompactAttribute */
+	Assert(memcmp(&snapshot, cattr, sizeof(CompactAttribute)) == 0);
+
+	return cattr;
+}
+
+#else
+/* Accessor for the i'th CompactAttribute of tupdesc */
+#define TupleDescCompactAttr(tupdesc, i) (&(tupdesc)->compact_attrs[(i)])
+#endif

Personally I'd have the ifdef inside the static inline function, rather than
changing between a static inline and a macro depending on
USE_ASSERT_CHECKING..

#ifndef FRONTEND
/*
- * Given a Form_pg_attribute and a pointer into a tuple's data area,
+ * Given a CompactAttribute pointer and a pointer into a tuple's data area,
* return the correct value or pointer.
*
* We return a Datum value in all cases.  If the attribute has "byval" false,
@@ -43,7 +43,7 @@ att_isnull(int ATT, const bits8 *BITS)
*
* Note that T must already be properly aligned for this to work correctly.
*/
-#define fetchatt(A,T) fetch_att(T, (A)->attbyval, (A)->attlen)
+#define fetchatt(A, T) fetch_att(T, CompactAttrByVal(A), (A)->attlen)

Stuff like this seems like it might catch some extensions unaware. I think it
might make sense to change macros like this to be a static inline, so that you
get proper type mismatch errors, rather than errors about invalid casts or
nonexistant fields.

From c75d072b8bc43ba4f9b7fbe2f99b65edc7421a15 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Wed, 29 May 2024 12:19:03 +1200
Subject: [PATCH v3 3/5] Optimize alignment calculations in tuple form/deform

This converts CompactAttribute.attalign from a char which is directly
derived from pg_attribute.attalign into a uint8 which specifies the
number of bytes to align the column by. Also, rename the field to
attalignby to make the distinction more clear in code.

This removes the complexity of checking each char value and transforming
that into the appropriate alignment call. This can just be a simple
TYPEALIGN passing in the number of bytes.

I like this a lot.

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index 08772de39f..b66eb178b9 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1592,7 +1592,7 @@ check_tuple_attribute(HeapCheckContext *ctx)
/* Skip non-varlena values, but update offset first */
if (thisatt->attlen != -1)
{
-		ctx->offset = att_align_nominal(ctx->offset, thisatt->attalign);
+		ctx->offset = att_nominal_alignby(ctx->offset, thisatt->attalignby);
ctx->offset = att_addlength_pointer(ctx->offset, thisatt->attlen,
tp + ctx->offset);
if (ctx->tuphdr->t_hoff + ctx->offset > ctx->lp_len)

A bit confused about the change in naming policy here...

From d1ec19a46a480b0c75f9df468b2765ad4e51dce2 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 3 Sep 2024 14:05:30 +1200
Subject: [PATCH v3 5/5] Try a larger CompactAttribute struct without flags

Benchmarks have shown that making the CompactAttribute struct larger and
getting rid of the flags to reduce the bitwise-ANDing requirements makes
things go faster.

I think we have some way of not needing this. I don't like my compiler barrier
hack, but I'm sure we can hold the hands of the compiler sufficiently to
generate useful code.

But this made me wonder:

---
src/backend/access/common/tupdesc.c | 21 ++++++----------
src/include/access/tupdesc.h | 39 ++++++++++-------------------
2 files changed, 20 insertions(+), 40 deletions(-)

diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 74f22cffb9..95c92e6585 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -67,20 +67,13 @@ populate_compact_attribute(TupleDesc tupdesc, int i)
dst->attcacheoff = -1;
dst->attlen = src->attlen;
-	dst->attflags = 0;
-
-	if (src->attbyval)
-		dst->attflags |= COMPACT_ATTR_FLAG_BYVAL;
-	if (src->attstorage != TYPSTORAGE_PLAIN)
-		dst->attflags |= COMPACT_ATTR_FLAG_IS_PACKABLE;
-	if (src->atthasmissing)
-		dst->attflags |= COMPACT_ATTR_FLAG_HAS_MISSING;
-	if (src->attisdropped)
-		dst->attflags |= COMPACT_ATTR_FLAG_IS_DROPPED;
-	if (src->attgenerated)
-		dst->attflags |= COMPACT_ATTR_FLAG_IS_GENERATED;
-	if (src->attnotnull)
-		dst->attflags |= COMPACT_ATTR_FLAG_IS_NOTNULL;
+
+	dst->attbyval = src->attbyval;
+	dst->attispackable = (src->attstorage != TYPSTORAGE_PLAIN);
+	dst->atthasmissing = src->atthasmissing;
+	dst->attisdropped = src->attisdropped;
+	dst->attgenerated = src->attgenerated;
+	dst->attnotnull = src->attnotnull;

It'd sure be nice if we could condense some of these fields in pg_attribute
too. It obviously shouldn't be a requirement for this patch, don't get me
wrong!

Production systems have often very large pg_attribute tables, which makes this
a fairly worthwhile optimization target.

I wonder if we could teach the bootstrap and deform logic about bool:1 or such
and have it generate the right code for that.

Greetings,

Andres Freund

#14David Rowley
dgrowleyml@gmail.com
In reply to: Andres Freund (#13)
6 attachment(s)
Re: Make tuple deformation faster

On Fri, 4 Oct 2024 at 10:23, Andres Freund <andres@anarazel.de> wrote:

A few weeks ago David and I discussed this patch. We were curious *why* the
flags approach was slower. It turns out that, at least on my machine, this is
just a compiler optimization issue. Putting a pg_compiler_barrier() just
after:

for (; attnum < natts; attnum++)
{
-             Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+             CompactAttribute *thisatt = TupleDescCompactAttr(tupleDesc, attnum);

addressed the issue. The problem basically is that instead of computing the
address of thisatt once, gcc for some reason instead uses complex addressing
lea instructions, which are slower on some machines.

Not sure what a good way to deal with that is. I haven't tried, but it could
be that just advancing thisatt using++ would do the trick?

I'm not seeing the same thing when I test with GCC. Subsequent calls
to TupleDescCompactAttr() are just adding 8 to the pointer value in
the register. Here's perf annotation output using gcc11.4.0:

patches 0001-0004 applied:

│ for (; attnum < natts; attnum++)
1.02 │ f7: add $0x1,%r12d
0.02 │ add $0x8,%r15
2.81 │ add $0x1,%r14
11.02 │ add $0x8,%rbp

and with 0005 applied:

│ for (; attnum < natts; attnum++)
4.45 │ e9: add $0x1,%r12d
0.09 │ add $0x8,%r15
0.09 │ add $0x1,%r13
9.09 │ add $0x10,%rbx

You can see the final add switches to adding 16.

With clang, it's a different story. I'm unsure what happened to the
debug symbols, but I think it's this part:

0.30 │ ↓ jne 220
1.10 │1e9: mov 0x30(%rsp),%rcx
0.62 │ mov %rax,(%rcx,%r15,8)

and with 0005:

0.70 │ movzbl %bpl,%ebp
1.34 │ cmovle %r8d,%ebp
1.95 │ d1: add $0x1,%r15
1.20 │ add $0x10,%r13

With clang, the performance does improve quite a bit after applying
0005. 152 tps with 0001-0004 and 167 tps with 0005. See attached
bench_v4.txt. I tried pg_compiler_barrer() after the
TupleDescCompactAttr() in slot_deform_heap_tuple() and it does not
switch using "add".

I think this generally looks quite good and the performance wins are quite
nice! I'm a bit concerned about the impact on various extensions - I haven't
looked, but I wouldn't be surprised if this requires a bunch of of changes.
Perhaps we could reduce that a bit?

Could it make sense to use bitfields instead of flag values, to reduce the
impact?

Yeah. That's a good idea. Using bitflags allows me to get rid of the
macros I had which were extracting the bool values from attflags.
That allows me to leave the fetchatt() macro along so it still uses
the attbyval field. With bitflags both Form_pg_attribute and
CompactAttribute have that field, so the macro works for both. I think
this is likely the easiest way to reduce the number of changes and not
break existing users of that macro.

+#else
+/* Accessor for the i'th CompactAttribute of tupdesc */
+#define TupleDescCompactAttr(tupdesc, i) (&(tupdesc)->compact_attrs[(i)])
+#endif

Personally I'd have the ifdef inside the static inline function, rather than
changing between a static inline and a macro depending on
USE_ASSERT_CHECKING..

Yeah, that's a good idea. I must have been trying to keep it a macro
the same as TupleDescAttr().

-#define fetchatt(A,T) fetch_att(T, (A)->attbyval, (A)->attlen)
+#define fetchatt(A, T) fetch_att(T, CompactAttrByVal(A), (A)->attlen)

Stuff like this seems like it might catch some extensions unaware. I think it
might make sense to change macros like this to be a static inline, so that you
get proper type mismatch errors, rather than errors about invalid casts or
nonexistant fields.

That's no longer required after switching to bitflags since the
CompactAttribute has an attbyval field again so I've left this macro
untouched in the latest patch.

From c75d072b8bc43ba4f9b7fbe2f99b65edc7421a15 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Wed, 29 May 2024 12:19:03 +1200
Subject: [PATCH v3 3/5] Optimize alignment calculations in tuple form/deform

This converts CompactAttribute.attalign from a char which is directly
derived from pg_attribute.attalign into a uint8 which specifies the
number of bytes to align the column by. Also, rename the field to
attalignby to make the distinction more clear in code.

This removes the complexity of checking each char value and transforming
that into the appropriate alignment call. This can just be a simple
TYPEALIGN passing in the number of bytes.

I like this a lot.

Great.

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index 08772de39f..b66eb178b9 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1592,7 +1592,7 @@ check_tuple_attribute(HeapCheckContext *ctx)
/* Skip non-varlena values, but update offset first */
if (thisatt->attlen != -1)
{
-             ctx->offset = att_align_nominal(ctx->offset, thisatt->attalign);
+             ctx->offset = att_nominal_alignby(ctx->offset, thisatt->attalignby);
ctx->offset = att_addlength_pointer(ctx->offset, thisatt->attlen,
tp + ctx->offset);
if (ctx->tuphdr->t_hoff + ctx->offset > ctx->lp_len)

A bit confused about the change in naming policy here...

The idea here is that after making CompactAttribute's attalign a uint8
of bytes instead of the char attalign, I renamed it "attalignby" so
that any code using a field named attalign wouldn't compile. That
gives me a bit more confidence when changing FormData_pg_attributes
into CompactAttributes that nothing is looking at the uint8 and
treating it like the attalign char. The reason I swapped the order of
the words around is because att_alignby_nominal() didn't really sound
correct. I was wondering if I'd keep that macro at all and not just
use TYPEALIGN() directly...

From d1ec19a46a480b0c75f9df468b2765ad4e51dce2 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 3 Sep 2024 14:05:30 +1200
Subject: [PATCH v3 5/5] Try a larger CompactAttribute struct without flags

Benchmarks have shown that making the CompactAttribute struct larger and
getting rid of the flags to reduce the bitwise-ANDing requirements makes
things go faster.

I think we have some way of not needing this. I don't like my compiler barrier
hack, but I'm sure we can hold the hands of the compiler sufficiently to
generate useful code.

I'm not sure what to do about this part. I did quite a bit of staring
at the attached benchmark results. Using gcc13.2 on my Zen2 machine,
the 0005 patch is quite a bit faster (138 tps vs 127 tps) than with
just 0004 and both versions use an "add" instruction to bump to the
next CompactAttribute element. So, with that CPU, maybe it's just
faster from getting rid of the bitwise-AND code to extract the
booleans.

It'd sure be nice if we could condense some of these fields in pg_attribute
too. It obviously shouldn't be a requirement for this patch, don't get me
wrong!

Production systems have often very large pg_attribute tables, which makes this
a fairly worthwhile optimization target.

I wonder if we could teach the bootstrap and deform logic about bool:1 or such
and have it generate the right code for that.

It would be good to do something about this. I think the reduction in
the sizeof(FormData_pg_attribute) would be good for using less memory
in RelationData.rd_att.

David

Attachments:

bench_v4.txttext/plain; charset=US-ASCII; name=bench_v4.txtDownload
v4-0001-Move-TupleDesc.attrs-out-of-line.patchapplication/octet-stream; name=v4-0001-Move-TupleDesc.attrs-out-of-line.patchDownload
From 14c82d10fa2f3db891b76871af87f542a371b4a5 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 28 May 2024 13:49:07 +1200
Subject: [PATCH v4 1/6] Move TupleDesc.attrs out of line

Change TupleDesc attrs field so that it's no longer memory allocated at
the end of the TupleDesc struct.  Here we change this so that 'attrs' is
a pointer that always points to memory beyond the end of the struct.

This is just refactoring work to make way for a follow-on commit, of which
adds another variable length array to TupleDesc.
---
 src/backend/access/common/indextuple.c |  2 +-
 src/backend/access/common/tupdesc.c    | 11 +++++++++--
 src/backend/utils/cache/typcache.c     | 15 ++++++++++++++-
 src/include/access/tupdesc.h           | 12 ++++++++----
 4 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index bb2c6a2bcc..79ae29989d 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -588,7 +588,7 @@ index_truncate_tuple(TupleDesc sourceDescriptor, IndexTuple source,
 		return CopyIndexTuple(source);
 
 	/* Create temporary descriptor to scribble on */
-	truncdesc = palloc(TupleDescSize(sourceDescriptor));
+	truncdesc = CreateTemplateTupleDesc(sourceDescriptor->natts);
 	TupleDescCopy(truncdesc, sourceDescriptor);
 	truncdesc->natts = leavenatts;
 
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 47379fef22..fba0026520 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -85,7 +85,7 @@ CreateTemplateTupleDesc(int natts)
 	 * could be less due to trailing padding, although with the current
 	 * definition of pg_attribute there probably isn't any padding.
 	 */
-	desc = (TupleDesc) palloc(offsetof(struct TupleDescData, attrs) +
+	desc = (TupleDesc) palloc(MAXALIGN(sizeof(TupleDescData)) +
 							  natts * sizeof(FormData_pg_attribute));
 
 	/*
@@ -96,6 +96,7 @@ CreateTemplateTupleDesc(int natts)
 	desc->tdtypeid = RECORDOID;
 	desc->tdtypmod = -1;
 	desc->tdrefcount = -1;		/* assume not reference-counted */
+	desc->attrs = TupleDescAttrAddress(desc);
 
 	return desc;
 }
@@ -252,9 +253,15 @@ TupleDescCopy(TupleDesc dst, TupleDesc src)
 {
 	int			i;
 
-	/* Flat-copy the header and attribute array */
+	/* Flat-copy the header */
 	memcpy(dst, src, TupleDescSize(src));
 
+	/* restore original attribute array pointer and replace contents from src */
+	dst->attrs = TupleDescAttrAddress(dst);
+	memcpy(TupleDescAttr(dst, 0),
+		   TupleDescAttr(src, 0),
+		   sizeof(FormData_pg_attribute) * dst->natts);
+
 	/*
 	 * Since we're not copying constraints and defaults, clear fields
 	 * associated with them.
diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
index 2ec136b7d3..a8992b6a2d 100644
--- a/src/backend/utils/cache/typcache.c
+++ b/src/backend/utils/cache/typcache.c
@@ -222,12 +222,18 @@ shared_record_table_compare(const void *a, const void *b, size_t size,
 	TupleDesc	t2;
 
 	if (k1->shared)
+	{
 		t1 = (TupleDesc) dsa_get_address(area, k1->u.shared_tupdesc);
+		t1->attrs = TupleDescAttrAddress(t1);
+	}
 	else
 		t1 = k1->u.local_tupdesc;
 
 	if (k2->shared)
+	{
 		t2 = (TupleDesc) dsa_get_address(area, k2->u.shared_tupdesc);
+		t2->attrs = TupleDescAttrAddress(t2);
+	}
 	else
 		t2 = k2->u.local_tupdesc;
 
@@ -245,7 +251,10 @@ shared_record_table_hash(const void *a, size_t size, void *arg)
 	TupleDesc	t;
 
 	if (k->shared)
+	{
 		t = (TupleDesc) dsa_get_address(area, k->u.shared_tupdesc);
+		t->attrs = TupleDescAttrAddress(t);
+	}
 	else
 		t = k->u.local_tupdesc;
 
@@ -1797,6 +1806,7 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
 					tupdesc = (TupleDesc)
 						dsa_get_address(CurrentSession->area,
 										entry->shared_tupdesc);
+					tupdesc->attrs = TupleDescAttrAddress(tupdesc);
 					Assert(typmod == tupdesc->tdtypmod);
 
 					/* We may need to extend the local RecordCacheArray. */
@@ -2762,7 +2772,7 @@ share_tupledesc(dsa_area *area, TupleDesc tupdesc, uint32 typmod)
 	dsa_pointer shared_dp;
 	TupleDesc	shared;
 
-	shared_dp = dsa_allocate(area, TupleDescSize(tupdesc));
+	shared_dp = dsa_allocate(area, TupleDescFullSize(tupdesc));
 	shared = (TupleDesc) dsa_get_address(area, shared_dp);
 	TupleDescCopy(shared, tupdesc);
 	shared->tdtypmod = typmod;
@@ -2805,6 +2815,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 		result = (TupleDesc)
 			dsa_get_address(CurrentSession->area,
 							record_table_entry->key.u.shared_tupdesc);
+		result->attrs = TupleDescAttrAddress(result);
 		Assert(result->tdrefcount == -1);
 
 		return result;
@@ -2868,6 +2879,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 		result = (TupleDesc)
 			dsa_get_address(CurrentSession->area,
 							record_table_entry->key.u.shared_tupdesc);
+		result->attrs = TupleDescAttrAddress(result);
 		Assert(result->tdrefcount == -1);
 
 		return result;
@@ -2880,6 +2892,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 						record_table_entry);
 	result = (TupleDesc)
 		dsa_get_address(CurrentSession->area, shared_dp);
+	result->attrs = TupleDescAttrAddress(result);
 	Assert(result->tdrefcount == -1);
 
 	return result;
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 8930a28d66..2c435cdcb2 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -84,7 +84,7 @@ typedef struct TupleDescData
 	int			tdrefcount;		/* reference count, or -1 if not counting */
 	TupleConstr *constr;		/* constraints, or NULL if none */
 	/* attrs[N] is the description of Attribute Number N+1 */
-	FormData_pg_attribute attrs[FLEXIBLE_ARRAY_MEMBER];
+	FormData_pg_attribute *attrs;
 }			TupleDescData;
 typedef struct TupleDescData *TupleDesc;
 
@@ -99,9 +99,13 @@ extern TupleDesc CreateTupleDescCopy(TupleDesc tupdesc);
 
 extern TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc);
 
-#define TupleDescSize(src) \
-	(offsetof(struct TupleDescData, attrs) + \
-	 (src)->natts * sizeof(FormData_pg_attribute))
+#define TupleDescSize(src) MAXALIGN(sizeof(TupleDescData))
+
+#define TupleDescFullSize(src) \
+	(MAXALIGN(sizeof(TupleDescData)) + sizeof(FormData_pg_attribute) * (src)->natts)
+
+#define TupleDescAttrAddress(desc) \
+	(Form_pg_attribute) ((char *) (desc) + MAXALIGN(sizeof(TupleDescData)))
 
 extern void TupleDescCopy(TupleDesc dst, TupleDesc src);
 
-- 
2.34.1

v4-0002-Introduce-CompactAttribute-array-in-TupleDesc.patchapplication/octet-stream; name=v4-0002-Introduce-CompactAttribute-array-in-TupleDesc.patchDownload
From 9b171b63ad6980faddec2055cb2b1fe5f6fedf0d Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 28 May 2024 20:10:50 +1200
Subject: [PATCH v4 2/6] Introduce CompactAttribute array in TupleDesc

This array stores a subset of the fields of FormData_pg_attribute,
primarily the ones for deforming tuples, but since we have additional
space, pack a few additional boolean columns in the attflags field.

Many areas of the code can get away with only accessing the
CompactAttribute array, which because the details of each attribute is
stored much more densely than FormData_pg_attribute, many operations can
be performed accessing fewer cachelines which can improve performance.

This also makes pg_attribute.attcacheoff redundant.  A follow-on commit
will remove it.
---
 contrib/amcheck/verify_heapam.c             |  4 +-
 contrib/pageinspect/heapfuncs.c             |  4 +-
 contrib/postgres_fdw/postgres_fdw.c         |  6 +-
 src/backend/access/brin/brin_inclusion.c    |  8 +-
 src/backend/access/brin/brin_tuple.c        |  2 +-
 src/backend/access/common/attmap.c          |  8 +-
 src/backend/access/common/heaptuple.c       | 52 ++++++-------
 src/backend/access/common/indextuple.c      | 24 +++---
 src/backend/access/common/tupdesc.c         | 56 +++++++++++---
 src/backend/access/gin/ginbulk.c            |  4 +-
 src/backend/access/gin/ginget.c             |  4 +-
 src/backend/access/gist/gistbuild.c         |  6 +-
 src/backend/access/heap/heapam.c            |  8 +-
 src/backend/access/heap/heapam_handler.c    |  2 +-
 src/backend/access/heap/heaptoast.c         |  6 +-
 src/backend/access/nbtree/nbtutils.c        |  4 +-
 src/backend/access/spgist/spgdoinsert.c     |  2 +-
 src/backend/access/spgist/spgutils.c        |  4 +-
 src/backend/access/table/toast_helper.c     |  2 +-
 src/backend/catalog/index.c                 |  2 +
 src/backend/commands/copy.c                 |  6 +-
 src/backend/commands/tablecmds.c            |  4 +
 src/backend/executor/execExpr.c             |  4 +-
 src/backend/executor/execExprInterp.c       |  6 +-
 src/backend/executor/execJunk.c             |  2 +-
 src/backend/executor/execTuples.c           |  8 +-
 src/backend/executor/functions.c            |  2 +-
 src/backend/executor/nodeMemoize.c          |  8 +-
 src/backend/executor/nodeModifyTable.c      |  4 +-
 src/backend/executor/nodeValuesscan.c       |  4 +-
 src/backend/executor/tstoreReceiver.c       |  4 +-
 src/backend/jit/llvm/llvmjit_deform.c       |  4 +-
 src/backend/optimizer/util/plancat.c        |  4 +-
 src/backend/replication/pgoutput/pgoutput.c |  2 +-
 src/backend/utils/adt/expandedrecord.c      | 10 +--
 src/backend/utils/adt/ri_triggers.c         |  2 +-
 src/backend/utils/cache/relcache.c          | 21 ++++--
 src/include/access/htup_details.h           |  4 +-
 src/include/access/itup.h                   | 10 ++-
 src/include/access/tupdesc.h                | 82 ++++++++++++++++++++-
 src/include/access/tupmacs.h                |  5 +-
 src/tools/pgindent/typedefs.list            |  1 +
 42 files changed, 272 insertions(+), 133 deletions(-)

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index f2526ed63a..08772de39f 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1567,11 +1567,11 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	struct varlena *attr;
 	char	   *tp;				/* pointer to the tuple data */
 	uint16		infomask;
-	Form_pg_attribute thisatt;
+	CompactAttribute *thisatt;
 	struct varatt_external toast_pointer;
 
 	infomask = ctx->tuphdr->t_infomask;
-	thisatt = TupleDescAttr(RelationGetDescr(ctx->rel), ctx->attnum);
+	thisatt = TupleDescCompactAttr(RelationGetDescr(ctx->rel), ctx->attnum);
 
 	tp = (char *) ctx->tuphdr + ctx->tuphdr->t_hoff;
 
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 38a539dad1..397259d168 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -335,11 +335,11 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 
 	for (i = 0; i < nattrs; i++)
 	{
-		Form_pg_attribute attr;
+		CompactAttribute *attr;
 		bool		is_null;
 		bytea	   *attr_data = NULL;
 
-		attr = TupleDescAttr(tupdesc, i);
+		attr = TupleDescCompactAttr(tupdesc, i);
 
 		/*
 		 * Tuple header can specify fewer attributes than tuple descriptor as
diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index adc62576d1..80ff34ffaf 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -1821,7 +1821,7 @@ postgresPlanForeignModify(PlannerInfo *root,
 
 		for (attnum = 1; attnum <= tupdesc->natts; attnum++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+			CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
 
 			if (!attr->attisdropped)
 				targetAttrs = lappend_int(targetAttrs, attnum);
@@ -2194,7 +2194,7 @@ postgresBeginForeignInsert(ModifyTableState *mtstate,
 	/* We transmit all columns that are defined in the foreign table. */
 	for (attnum = 1; attnum <= tupdesc->natts; attnum++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
 
 		if (!attr->attisdropped)
 			targetAttrs = lappend_int(targetAttrs, attnum);
@@ -4314,7 +4314,7 @@ convert_prep_stmt_params(PgFdwModifyState *fmstate,
 			foreach(lc, fmstate->target_attrs)
 			{
 				int			attnum = lfirst_int(lc);
-				Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+				CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
 				Datum		value;
 				bool		isnull;
 
diff --git a/src/backend/access/brin/brin_inclusion.c b/src/backend/access/brin/brin_inclusion.c
index 750276998c..faec0a9da8 100644
--- a/src/backend/access/brin/brin_inclusion.c
+++ b/src/backend/access/brin/brin_inclusion.c
@@ -146,12 +146,12 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
 	Datum		result;
 	bool		new = false;
 	AttrNumber	attno;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 
 	Assert(!isnull);
 
 	attno = column->bv_attno;
-	attr = TupleDescAttr(bdesc->bd_tupdesc, attno - 1);
+	attr = TupleDescCompactAttr(bdesc->bd_tupdesc, attno - 1);
 
 	/*
 	 * If the recorded value is null, copy the new value (which we know to be
@@ -479,7 +479,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	BrinValues *col_b = (BrinValues *) PG_GETARG_POINTER(2);
 	Oid			colloid = PG_GET_COLLATION();
 	AttrNumber	attno;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 	FmgrInfo   *finfo;
 	Datum		result;
 
@@ -487,7 +487,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	Assert(!col_a->bv_allnulls && !col_b->bv_allnulls);
 
 	attno = col_a->bv_attno;
-	attr = TupleDescAttr(bdesc->bd_tupdesc, attno - 1);
+	attr = TupleDescCompactAttr(bdesc->bd_tupdesc, attno - 1);
 
 	/* If B includes empty elements, mark A similarly, if needed. */
 	if (!DatumGetBool(col_a->bv_values[INCLUSION_CONTAINS_EMPTY]) &&
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index 997eb6d822..aae646be5d 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -699,7 +699,7 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
 			 datumno < brdesc->bd_info[attnum]->oi_nstored;
 			 datumno++)
 		{
-			Form_pg_attribute thisatt = TupleDescAttr(diskdsc, stored);
+			CompactAttribute *thisatt = TupleDescCompactAttr(diskdsc, stored);
 
 			if (thisatt->attlen == -1)
 			{
diff --git a/src/backend/access/common/attmap.c b/src/backend/access/common/attmap.c
index b0fe27ef57..0805c4121e 100644
--- a/src/backend/access/common/attmap.c
+++ b/src/backend/access/common/attmap.c
@@ -135,7 +135,7 @@ build_attrmap_by_position(TupleDesc indesc,
 	/* Check for unused input columns */
 	for (; j < indesc->natts; j++)
 	{
-		if (TupleDescAttr(indesc, j)->attisdropped)
+		if (TupleDescCompactAttr(indesc, j)->attisdropped)
 			continue;
 		nincols++;
 		same = false;			/* we'll complain below */
@@ -299,8 +299,8 @@ check_attrmap_match(TupleDesc indesc,
 
 	for (i = 0; i < attrMap->maplen; i++)
 	{
-		Form_pg_attribute inatt = TupleDescAttr(indesc, i);
-		Form_pg_attribute outatt = TupleDescAttr(outdesc, i);
+		CompactAttribute *inatt = TupleDescCompactAttr(indesc, i);
+		CompactAttribute *outatt;
 
 		/*
 		 * If the input column has a missing attribute, we need a conversion.
@@ -311,6 +311,8 @@ check_attrmap_match(TupleDesc indesc,
 		if (attrMap->attnums[i] == (i + 1))
 			continue;
 
+		outatt = TupleDescCompactAttr(outdesc, i);
+
 		/*
 		 * If it's a dropped column and the corresponding input column is also
 		 * dropped, we don't need a conversion.  However, attlen and attalign
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 9e3407bf98..d0a922011e 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -83,6 +83,9 @@
 #define VARLENA_ATT_IS_PACKABLE(att) \
 	((att)->attstorage != TYPSTORAGE_PLAIN)
 
+#define COMPACT_ATTR_IS_PACKABLE(att) \
+	((att)->attlen == -1 && att->attispackable)
+
 /*
  * Setup for caching pass-by-ref missing attributes in a way that survives
  * tupleDesc destruction.
@@ -147,12 +150,12 @@ Datum
 getmissingattr(TupleDesc tupleDesc,
 			   int attnum, bool *isnull)
 {
-	Form_pg_attribute att;
+	CompactAttribute *att;
 
 	Assert(attnum <= tupleDesc->natts);
 	Assert(attnum > 0);
 
-	att = TupleDescAttr(tupleDesc, attnum - 1);
+	att = TupleDescCompactAttr(tupleDesc, attnum - 1);
 
 	if (att->atthasmissing)
 	{
@@ -223,15 +226,15 @@ heap_compute_data_size(TupleDesc tupleDesc,
 	for (i = 0; i < numberOfAttributes; i++)
 	{
 		Datum		val;
-		Form_pg_attribute atti;
+		CompactAttribute *atti;
 
 		if (isnull[i])
 			continue;
 
 		val = values[i];
-		atti = TupleDescAttr(tupleDesc, i);
+		atti = TupleDescCompactAttr(tupleDesc, i);
 
-		if (ATT_IS_PACKABLE(atti) &&
+		if (COMPACT_ATTR_IS_PACKABLE(atti) &&
 			VARATT_CAN_MAKE_SHORT(DatumGetPointer(val)))
 		{
 			/*
@@ -268,7 +271,7 @@ heap_compute_data_size(TupleDesc tupleDesc,
  * Fill in either a data value or a bit in the null bitmask
  */
 static inline void
-fill_val(Form_pg_attribute att,
+fill_val(CompactAttribute *att,
 		 bits8 **bit,
 		 int *bitmask,
 		 char **dataP,
@@ -349,8 +352,7 @@ fill_val(Form_pg_attribute att,
 			data_length = VARSIZE_SHORT(val);
 			memcpy(data, val, data_length);
 		}
-		else if (VARLENA_ATT_IS_PACKABLE(att) &&
-				 VARATT_CAN_MAKE_SHORT(val))
+		else if (att->attispackable && VARATT_CAN_MAKE_SHORT(val))
 		{
 			/* convert to short varlena -- no alignment */
 			data_length = VARATT_CONVERTED_SHORT_SIZE(val);
@@ -427,7 +429,7 @@ heap_fill_tuple(TupleDesc tupleDesc,
 
 	for (i = 0; i < numberOfAttributes; i++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupleDesc, i);
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, i);
 
 		fill_val(attr,
 				 bitP ? &bitP : NULL,
@@ -461,7 +463,8 @@ heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
 	Assert(!tupleDesc || attnum <= tupleDesc->natts);
 	if (attnum > (int) HeapTupleHeaderGetNatts(tup->t_data))
 	{
-		if (tupleDesc && TupleDescAttr(tupleDesc, attnum - 1)->atthasmissing)
+		if (tupleDesc &&
+			TupleDescCompactAttr(tupleDesc, attnum - 1)->atthasmissing)
 			return false;
 		else
 			return true;
@@ -570,13 +573,13 @@ nocachegetattr(HeapTuple tup,
 
 	if (!slow)
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		/*
 		 * If we get here, there are no nulls up to and including the target
 		 * attribute.  If we have a cached offset, we can use it.
 		 */
-		att = TupleDescAttr(tupleDesc, attnum);
+		att = TupleDescCompactAttr(tupleDesc, attnum);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, tp + att->attcacheoff);
 
@@ -591,7 +594,7 @@ nocachegetattr(HeapTuple tup,
 
 			for (j = 0; j <= attnum; j++)
 			{
-				if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
+				if (TupleDescCompactAttr(tupleDesc, j)->attlen <= 0)
 				{
 					slow = true;
 					break;
@@ -614,18 +617,18 @@ nocachegetattr(HeapTuple tup,
 		 * fixed-width columns, in hope of avoiding future visits to this
 		 * routine.
 		 */
-		TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(tupleDesc, 0)->attcacheoff = 0;
 
 		/* we might have set some offsets in the slow path previously */
-		while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
+		while (j < natts && TupleDescCompactAttr(tupleDesc, j)->attcacheoff > 0)
 			j++;
 
-		off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
-			TupleDescAttr(tupleDesc, j - 1)->attlen;
+		off = TupleDescCompactAttr(tupleDesc, j - 1)->attcacheoff +
+			TupleDescCompactAttr(tupleDesc, j - 1)->attlen;
 
 		for (; j < natts; j++)
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, j);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, j);
 
 			if (att->attlen <= 0)
 				break;
@@ -639,7 +642,7 @@ nocachegetattr(HeapTuple tup,
 
 		Assert(j > attnum);
 
-		off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
+		off = TupleDescCompactAttr(tupleDesc, attnum)->attcacheoff;
 	}
 	else
 	{
@@ -659,7 +662,7 @@ nocachegetattr(HeapTuple tup,
 		off = 0;
 		for (i = 0;; i++)		/* loop exit is at "break" */
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, i);
 
 			if (HeapTupleHasNulls(tup) && att_isnull(i, bp))
 			{
@@ -707,7 +710,7 @@ nocachegetattr(HeapTuple tup,
 		}
 	}
 
-	return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
+	return fetchatt(TupleDescCompactAttr(tupleDesc, attnum), tp + off);
 }
 
 /* ----------------
@@ -892,7 +895,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 		{
 			if (attrmiss[attnum].am_present)
 			{
-				Form_pg_attribute att = TupleDescAttr(tupleDesc, attnum);
+				CompactAttribute *att = TupleDescCompactAttr(tupleDesc, attnum);
 
 				targetDataLen = att_align_datum(targetDataLen,
 												att->attalign,
@@ -1020,8 +1023,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 	/* Now fill in the missing values */
 	for (attnum = sourceNatts; attnum < natts; attnum++)
 	{
-
-		Form_pg_attribute attr = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (attrmiss && attrmiss[attnum].am_present)
 		{
@@ -1370,7 +1372,7 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index 79ae29989d..37133ed7f8 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -303,13 +303,13 @@ nocache_index_getattr(IndexTuple tup,
 
 	if (!slow)
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		/*
 		 * If we get here, there are no nulls up to and including the target
 		 * attribute.  If we have a cached offset, we can use it.
 		 */
-		att = TupleDescAttr(tupleDesc, attnum);
+		att = TupleDescCompactAttr(tupleDesc, attnum);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, tp + att->attcacheoff);
 
@@ -324,7 +324,7 @@ nocache_index_getattr(IndexTuple tup,
 
 			for (j = 0; j <= attnum; j++)
 			{
-				if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
+				if (TupleDescCompactAttr(tupleDesc, j)->attlen <= 0)
 				{
 					slow = true;
 					break;
@@ -347,18 +347,18 @@ nocache_index_getattr(IndexTuple tup,
 		 * fixed-width columns, in hope of avoiding future visits to this
 		 * routine.
 		 */
-		TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(tupleDesc, 0)->attcacheoff = 0;
 
 		/* we might have set some offsets in the slow path previously */
-		while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
+		while (j < natts && TupleDescCompactAttr(tupleDesc, j)->attcacheoff > 0)
 			j++;
 
-		off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
-			TupleDescAttr(tupleDesc, j - 1)->attlen;
+		off = TupleDescCompactAttr(tupleDesc, j - 1)->attcacheoff +
+			TupleDescCompactAttr(tupleDesc, j - 1)->attlen;
 
 		for (; j < natts; j++)
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, j);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, j);
 
 			if (att->attlen <= 0)
 				break;
@@ -372,7 +372,7 @@ nocache_index_getattr(IndexTuple tup,
 
 		Assert(j > attnum);
 
-		off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
+		off = TupleDescCompactAttr(tupleDesc, attnum)->attcacheoff;
 	}
 	else
 	{
@@ -392,7 +392,7 @@ nocache_index_getattr(IndexTuple tup,
 		off = 0;
 		for (i = 0;; i++)		/* loop exit is at "break" */
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, i);
 
 			if (IndexTupleHasNulls(tup) && att_isnull(i, bp))
 			{
@@ -440,7 +440,7 @@ nocache_index_getattr(IndexTuple tup,
 		}
 	}
 
-	return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
+	return fetchatt(TupleDescCompactAttr(tupleDesc, attnum), tp + off);
 }
 
 /*
@@ -490,7 +490,7 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDescriptor, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDescriptor, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index fba0026520..2f9a9a2636 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -56,6 +56,27 @@ ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
 	ResourceOwnerForget(owner, PointerGetDatum(tupdesc), &tupdesc_resowner_desc);
 }
 
+void
+populate_compact_attribute(TupleDesc tupdesc, int i)
+{
+	Form_pg_attribute src = TupleDescAttr(tupdesc, i);
+	CompactAttribute *dst = &tupdesc->compact_attrs[i];
+
+	memset(dst, 0, sizeof(CompactAttribute));
+
+	dst->attcacheoff = -1;
+	dst->attlen = src->attlen;
+
+	dst->attbyval = src->attbyval;
+	dst->attispackable = (src->attstorage != TYPSTORAGE_PLAIN);
+	dst->atthasmissing = src->atthasmissing;
+	dst->attisdropped = src->attisdropped;
+	dst->attgenerated = (src->attgenerated != '\0');
+	dst->attnotnull = src->attnotnull;
+
+	dst->attalign = src->attalign;
+}
+
 /*
  * CreateTemplateTupleDesc
  *		This function allocates an empty tuple descriptor structure.
@@ -74,18 +95,20 @@ CreateTemplateTupleDesc(int natts)
 	Assert(natts >= 0);
 
 	/*
-	 * Allocate enough memory for the tuple descriptor, including the
-	 * attribute rows.
+	 * Allocate enough memory for the tuple descriptor, the CompactAttribute
+	 * array and also an array of the full FormData_pg_attribute data.  We
+	 * store a pointer to this in the 'attrs' field.
 	 *
-	 * Note: the attribute array stride is sizeof(FormData_pg_attribute),
-	 * since we declare the array elements as FormData_pg_attribute for
-	 * notational convenience.  However, we only guarantee that the first
+	 * Note: the 'attrs' array stride is sizeof(FormData_pg_attribute), since
+	 * we declare the array elements as FormData_pg_attribute for notational
+	 * convenience.  However, we only guarantee that the first
 	 * ATTRIBUTE_FIXED_PART_SIZE bytes of each entry are valid; most code that
 	 * copies tupdesc entries around copies just that much.  In principle that
 	 * could be less due to trailing padding, although with the current
 	 * definition of pg_attribute there probably isn't any padding.
 	 */
-	desc = (TupleDesc) palloc(MAXALIGN(sizeof(TupleDescData)) +
+	desc = (TupleDesc) palloc(offsetof(struct TupleDescData, compact_attrs) +
+							  natts * sizeof(CompactAttribute) +
 							  natts * sizeof(FormData_pg_attribute));
 
 	/*
@@ -118,8 +141,10 @@ CreateTupleDesc(int natts, Form_pg_attribute *attrs)
 	desc = CreateTemplateTupleDesc(natts);
 
 	for (i = 0; i < natts; ++i)
+	{
 		memcpy(TupleDescAttr(desc, i), attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
-
+		populate_compact_attribute(desc, i);
+	}
 	return desc;
 }
 
@@ -156,6 +181,8 @@ CreateTupleDescCopy(TupleDesc tupdesc)
 		att->atthasmissing = false;
 		att->attidentity = '\0';
 		att->attgenerated = '\0';
+
+		populate_compact_attribute(desc, i);
 	}
 
 	/* We can copy the tuple type identification, too */
@@ -184,6 +211,9 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
 		   TupleDescAttr(tupdesc, 0),
 		   desc->natts * sizeof(FormData_pg_attribute));
 
+	for (i = 0; i < desc->natts; i++)
+		populate_compact_attribute(desc, i);
+
 	/* Copy the TupleConstr data structure, if any */
 	if (constr)
 	{
@@ -208,7 +238,7 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
 			{
 				if (constr->missing[i].am_present)
 				{
-					Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+					CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 					cpy->missing[i].am_value = datumCopy(constr->missing[i].am_value,
 														 attr->attbyval,
@@ -275,6 +305,8 @@ TupleDescCopy(TupleDesc dst, TupleDesc src)
 		att->atthasmissing = false;
 		att->attidentity = '\0';
 		att->attgenerated = '\0';
+
+		populate_compact_attribute(dst, i);
 	}
 	dst->constr = NULL;
 
@@ -329,6 +361,8 @@ TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
 	dstAtt->atthasmissing = false;
 	dstAtt->attidentity = '\0';
 	dstAtt->attgenerated = '\0';
+
+	populate_compact_attribute(dst, dstAttno - 1);
 }
 
 /*
@@ -528,7 +562,7 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
 					return false;
 				if (missval1->am_present)
 				{
-					Form_pg_attribute missatt1 = TupleDescAttr(tupdesc1, i);
+					CompactAttribute *missatt1 = TupleDescCompactAttr(tupdesc1, i);
 
 					if (!datumIsEqual(missval1->am_value, missval2->am_value,
 									  missatt1->attbyval, missatt1->attlen))
@@ -721,6 +755,8 @@ TupleDescInitEntry(TupleDesc desc,
 	att->attcompression = InvalidCompressionMethod;
 	att->attcollation = typeForm->typcollation;
 
+	populate_compact_attribute(desc, attributeNumber - 1);
+
 	ReleaseSysCache(tuple);
 }
 
@@ -828,6 +864,8 @@ TupleDescInitBuiltinEntry(TupleDesc desc,
 		default:
 			elog(ERROR, "unsupported type %u", oidtypeid);
 	}
+
+	populate_compact_attribute(desc, attributeNumber - 1);
 }
 
 /*
diff --git a/src/backend/access/gin/ginbulk.c b/src/backend/access/gin/ginbulk.c
index 7f89cd5e82..46359268ae 100644
--- a/src/backend/access/gin/ginbulk.c
+++ b/src/backend/access/gin/ginbulk.c
@@ -127,10 +127,10 @@ ginInitBA(BuildAccumulator *accum)
 static Datum
 getDatumCopy(BuildAccumulator *accum, OffsetNumber attnum, Datum value)
 {
-	Form_pg_attribute att;
+	CompactAttribute *att;
 	Datum		res;
 
-	att = TupleDescAttr(accum->ginstate->origTupdesc, attnum - 1);
+	att = TupleDescCompactAttr(accum->ginstate->origTupdesc, attnum - 1);
 	if (att->attbyval)
 		res = value;
 	else
diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c
index 0b4f2ebadb..2e347b6a32 100644
--- a/src/backend/access/gin/ginget.c
+++ b/src/backend/access/gin/ginget.c
@@ -122,7 +122,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 				   GinScanEntry scanEntry, Snapshot snapshot)
 {
 	OffsetNumber attnum;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 
 	/* Initialize empty bitmap result */
 	scanEntry->matchBitmap = tbm_create(work_mem * 1024L, NULL);
@@ -134,7 +134,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 
 	/* Locate tupdesc entry for key column (for attbyval/attlen data) */
 	attnum = scanEntry->attnum;
-	attr = TupleDescAttr(btree->ginstate->origTupdesc, attnum - 1);
+	attr = TupleDescCompactAttr(btree->ginstate->origTupdesc, attnum - 1);
 
 	/*
 	 * Predicate lock entry leaf page, following pages will be locked by
diff --git a/src/backend/access/gist/gistbuild.c b/src/backend/access/gist/gistbuild.c
index ba06df30fa..86512f2c89 100644
--- a/src/backend/access/gist/gistbuild.c
+++ b/src/backend/access/gist/gistbuild.c
@@ -657,10 +657,12 @@ gistInitBuffering(GISTBuildState *buildstate)
 	itupMinSize = (Size) MAXALIGN(sizeof(IndexTupleData));
 	for (i = 0; i < index->rd_att->natts; i++)
 	{
-		if (TupleDescAttr(index->rd_att, i)->attlen < 0)
+		CompactAttribute *attr = TupleDescCompactAttr(index->rd_att, i);
+
+		if (attr->attlen < 0)
 			itupMinSize += VARHDRSZ;
 		else
-			itupMinSize += TupleDescAttr(index->rd_att, i)->attlen;
+			itupMinSize += attr->attlen;
 	}
 
 	/* Calculate average and maximal number of index tuples which fit to page */
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index da5e656a08..7028c45d86 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -4197,8 +4197,6 @@ static bool
 heap_attr_equals(TupleDesc tupdesc, int attrnum, Datum value1, Datum value2,
 				 bool isnull1, bool isnull2)
 {
-	Form_pg_attribute att;
-
 	/*
 	 * If one value is NULL and other is not, then they are certainly not
 	 * equal
@@ -4228,8 +4226,10 @@ heap_attr_equals(TupleDesc tupdesc, int attrnum, Datum value1, Datum value2,
 	}
 	else
 	{
+		CompactAttribute *att;
+
 		Assert(attrnum <= tupdesc->natts);
-		att = TupleDescAttr(tupdesc, attrnum - 1);
+		att = TupleDescCompactAttr(tupdesc, attrnum - 1);
 		return datumIsEqual(value1, value2, att->attbyval, att->attlen);
 	}
 }
@@ -4311,7 +4311,7 @@ HeapDetermineColumnsInfo(Relation relation,
 		 * that system attributes can't be stored externally.
 		 */
 		if (attrnum < 0 || isnull1 ||
-			TupleDescAttr(tupdesc, attrnum - 1)->attlen != -1)
+			TupleDescCompactAttr(tupdesc, attrnum - 1)->attlen != -1)
 			continue;
 
 		/*
diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c
index 1c6da286d4..2e585edcf8 100644
--- a/src/backend/access/heap/heapam_handler.c
+++ b/src/backend/access/heap/heapam_handler.c
@@ -2520,7 +2520,7 @@ reform_and_rewrite_tuple(HeapTuple tuple,
 	/* Be sure to null out any dropped columns */
 	for (i = 0; i < newTupDesc->natts; i++)
 	{
-		if (TupleDescAttr(newTupDesc, i)->attisdropped)
+		if (TupleDescCompactAttr(newTupDesc, i)->attisdropped)
 			isnull[i] = true;
 	}
 
diff --git a/src/backend/access/heap/heaptoast.c b/src/backend/access/heap/heaptoast.c
index a420e16530..c3a85d8d32 100644
--- a/src/backend/access/heap/heaptoast.c
+++ b/src/backend/access/heap/heaptoast.c
@@ -369,7 +369,7 @@ toast_flatten_tuple(HeapTuple tup, TupleDesc tupleDesc)
 		/*
 		 * Look at non-null varlena attributes
 		 */
-		if (!toast_isnull[i] && TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (!toast_isnull[i] && TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
@@ -483,7 +483,7 @@ toast_flatten_tuple_to_datum(HeapTupleHeader tup,
 		 */
 		if (toast_isnull[i])
 			has_nulls = true;
-		else if (TupleDescAttr(tupleDesc, i)->attlen == -1)
+		else if (TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
@@ -584,7 +584,7 @@ toast_build_flattened_tuple(TupleDesc tupleDesc,
 		/*
 		 * Look at non-null varlena attributes
 		 */
-		if (!isnull[i] && TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (!isnull[i] && TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c
index b4ba51357a..78b9514ec7 100644
--- a/src/backend/access/nbtree/nbtutils.c
+++ b/src/backend/access/nbtree/nbtutils.c
@@ -4863,11 +4863,11 @@ _bt_keep_natts_fast(Relation rel, IndexTuple lastleft, IndexTuple firstright)
 					datum2;
 		bool		isNull1,
 					isNull2;
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		datum1 = index_getattr(lastleft, attnum, itupdesc, &isNull1);
 		datum2 = index_getattr(firstright, attnum, itupdesc, &isNull2);
-		att = TupleDescAttr(itupdesc, attnum - 1);
+		att = TupleDescCompactAttr(itupdesc, attnum - 1);
 
 		if (isNull1 != isNull2)
 			break;
diff --git a/src/backend/access/spgist/spgdoinsert.c b/src/backend/access/spgist/spgdoinsert.c
index a4995c168b..2cb7ce43ba 100644
--- a/src/backend/access/spgist/spgdoinsert.c
+++ b/src/backend/access/spgist/spgdoinsert.c
@@ -1974,7 +1974,7 @@ spgdoinsert(Relation index, SpGistState *state,
 	{
 		if (!isnulls[i])
 		{
-			if (TupleDescAttr(leafDescriptor, i)->attlen == -1)
+			if (TupleDescCompactAttr(leafDescriptor, i)->attlen == -1)
 				leafDatums[i] = PointerGetDatum(PG_DETOAST_DATUM(datums[i]));
 			else
 				leafDatums[i] = datums[i];
diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c
index 72b7661971..38fbc81694 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -331,7 +331,9 @@ getSpGistTupleDesc(Relation index, SpGistTypeDesc *keyType)
 		att->attcollation = InvalidOid;
 		/* In case we changed typlen, we'd better reset following offsets */
 		for (int i = spgFirstIncludeColumn; i < outTupDesc->natts; i++)
-			TupleDescAttr(outTupDesc, i)->attcacheoff = -1;
+			TupleDescCompactAttr(outTupDesc, i)->attcacheoff = -1;
+
+		populate_compact_attribute(outTupDesc, spgKeyColumn);
 	}
 	return outTupDesc;
 }
diff --git a/src/backend/access/table/toast_helper.c b/src/backend/access/table/toast_helper.c
index 53224932f0..b16fd21b8d 100644
--- a/src/backend/access/table/toast_helper.c
+++ b/src/backend/access/table/toast_helper.c
@@ -324,7 +324,7 @@ toast_delete_external(Relation rel, const Datum *values, const bool *isnull,
 
 	for (i = 0; i < numAttrs; i++)
 	{
-		if (TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			Datum		value = values[i];
 
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 6084dfa97c..80bb1ee507 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -477,6 +477,8 @@ ConstructTupleDescriptor(Relation heapRelation,
 
 			ReleaseSysCache(tuple);
 		}
+
+		populate_compact_attribute(indexTupDesc, i);
 	}
 
 	pfree(amroutine);
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 03eb7a4eba..046d9ef671 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -903,9 +903,9 @@ CopyGetAttnums(TupleDesc tupDesc, Relation rel, List *attnamelist)
 
 		for (i = 0; i < attr_count; i++)
 		{
-			if (TupleDescAttr(tupDesc, i)->attisdropped)
-				continue;
-			if (TupleDescAttr(tupDesc, i)->attgenerated)
+			CompactAttribute *attr = TupleDescCompactAttr(tupDesc, i);
+
+			if (attr->attisdropped || attr->attgenerated)
 				continue;
 			attnums = lappend_int(attnums, i + 1);
 		}
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index af8c05b91f..036c32c378 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -952,6 +952,8 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
 			cookedDefaults = lappend(cookedDefaults, cooked);
 			attr->atthasdef = true;
 		}
+
+		populate_compact_attribute(descriptor, attnum - 1);
 	}
 
 	/*
@@ -1357,6 +1359,8 @@ BuildDescForRelation(const List *columns)
 			att->attstorage = entry->storage;
 		else if (entry->storage_name)
 			att->attstorage = GetAttributeStorage(att->atttypid, entry->storage_name);
+
+		populate_compact_attribute(desc, attnum - 1);
 	}
 
 	return desc;
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index c8077aa57b..87f955d4c2 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -598,7 +598,7 @@ ExecBuildUpdateProjection(List *targetList,
 	 */
 	for (int attnum = relDesc->natts; attnum > 0; attnum--)
 	{
-		Form_pg_attribute attr = TupleDescAttr(relDesc, attnum - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(relDesc, attnum - 1);
 
 		if (attr->attisdropped)
 			continue;
@@ -694,7 +694,7 @@ ExecBuildUpdateProjection(List *targetList,
 	 */
 	for (int attnum = 1; attnum <= relDesc->natts; attnum++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(relDesc, attnum - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(relDesc, attnum - 1);
 
 		if (attr->attisdropped)
 		{
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 9fd988cc99..337291dee7 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -2934,7 +2934,7 @@ ExecEvalRowNullInt(ExprState *state, ExprEvalStep *op,
 	for (int att = 1; att <= tupDesc->natts; att++)
 	{
 		/* ignore dropped columns */
-		if (TupleDescAttr(tupDesc, att - 1)->attisdropped)
+		if (TupleDescCompactAttr(tupDesc, att - 1)->attisdropped)
 			continue;
 		if (heap_attisnull(&tmptup, att, tupDesc))
 		{
@@ -5078,8 +5078,8 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
 
 		for (int i = 0; i < var_tupdesc->natts; i++)
 		{
-			Form_pg_attribute vattr = TupleDescAttr(var_tupdesc, i);
-			Form_pg_attribute sattr = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *vattr = TupleDescCompactAttr(var_tupdesc, i);
+			CompactAttribute *sattr = TupleDescCompactAttr(tupleDesc, i);
 
 			if (!vattr->attisdropped)
 				continue;		/* already checked non-dropped cols */
diff --git a/src/backend/executor/execJunk.c b/src/backend/executor/execJunk.c
index b962c31383..7d0afca418 100644
--- a/src/backend/executor/execJunk.c
+++ b/src/backend/executor/execJunk.c
@@ -169,7 +169,7 @@ ExecInitJunkFilterConversion(List *targetList,
 		t = list_head(targetList);
 		for (i = 0; i < cleanLength; i++)
 		{
-			if (TupleDescAttr(cleanTupType, i)->attisdropped)
+			if (TupleDescCompactAttr(cleanTupType, i)->attisdropped)
 				continue;		/* map entry is already zero */
 			for (;;)
 			{
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 00dc339615..875515777b 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -187,7 +187,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 	/* compute size of memory required */
 	for (int natt = 0; natt < desc->natts; natt++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, natt);
+		CompactAttribute *att = TupleDescCompactAttr(desc, natt);
 		Datum		val;
 
 		if (att->attbyval || slot->tts_isnull[natt])
@@ -223,7 +223,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 	/* and copy all attributes into the pre-allocated space */
 	for (int natt = 0; natt < desc->natts; natt++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, natt);
+		CompactAttribute *att = TupleDescCompactAttr(desc, natt);
 		Datum		val;
 
 		if (att->attbyval || slot->tts_isnull[natt])
@@ -1044,7 +1044,7 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 
 	for (; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
@@ -2237,7 +2237,7 @@ BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
 	 */
 	for (i = 0; i < natts; i++)
 	{
-		if (!TupleDescAttr(tupdesc, i)->attisdropped)
+		if (!TupleDescCompactAttr(tupdesc, i)->attisdropped)
 		{
 			/* Non-dropped attributes */
 			dvalues[i] = InputFunctionCall(&attinmeta->attinfuncs[i],
diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c
index 692854e2b3..08f41d532e 100644
--- a/src/backend/executor/functions.c
+++ b/src/backend/executor/functions.c
@@ -1886,7 +1886,7 @@ check_sql_fn_retval(List *queryTreeLists,
 		/* remaining columns in rettupdesc had better all be dropped */
 		for (colindex++; colindex <= tupnatts; colindex++)
 		{
-			if (!TupleDescAttr(rettupdesc, colindex - 1)->attisdropped)
+			if (!TupleDescCompactAttr(rettupdesc, colindex - 1)->attisdropped)
 				ereport(ERROR,
 						(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
 						 errmsg("return type mismatch in function declared to return %s",
diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c
index df8e3fff08..aff3d9d921 100644
--- a/src/backend/executor/nodeMemoize.c
+++ b/src/backend/executor/nodeMemoize.c
@@ -175,10 +175,10 @@ MemoizeHash_hash(struct memoize_hash *tb, const MemoizeKey *key)
 
 			if (!pslot->tts_isnull[i])	/* treat nulls as having hash key 0 */
 			{
-				Form_pg_attribute attr;
+				CompactAttribute *attr;
 				uint32		hkey;
 
-				attr = TupleDescAttr(pslot->tts_tupleDescriptor, i);
+				attr = TupleDescCompactAttr(pslot->tts_tupleDescriptor, i);
 
 				hkey = datum_image_hash(pslot->tts_values[i], attr->attbyval, attr->attlen);
 
@@ -242,7 +242,7 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
 
 		for (int i = 0; i < numkeys; i++)
 		{
-			Form_pg_attribute attr;
+			CompactAttribute *attr;
 
 			if (tslot->tts_isnull[i] != pslot->tts_isnull[i])
 			{
@@ -255,7 +255,7 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
 				continue;
 
 			/* perform binary comparison on the two datums */
-			attr = TupleDescAttr(tslot->tts_tupleDescriptor, i);
+			attr = TupleDescCompactAttr(tslot->tts_tupleDescriptor, i);
 			if (!datum_image_eq(tslot->tts_values[i], pslot->tts_values[i],
 								attr->attbyval, attr->attlen))
 			{
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 1161520f76..c445c433df 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -496,14 +496,14 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
 
 	for (int i = 0; i < natts; i++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+		CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 		if (ri_GeneratedExprs[i])
 		{
 			Datum		val;
 			bool		isnull;
 
-			Assert(attr->attgenerated == ATTRIBUTE_GENERATED_STORED);
+			Assert(TupleDescAttr(tupdesc, i)->attgenerated == ATTRIBUTE_GENERATED_STORED);
 
 			econtext->ecxt_scantuple = slot;
 
diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c
index 92948917a0..9838977f08 100644
--- a/src/backend/executor/nodeValuesscan.c
+++ b/src/backend/executor/nodeValuesscan.c
@@ -142,8 +142,8 @@ ValuesNext(ValuesScanState *node)
 		foreach(lc, exprstatelist)
 		{
 			ExprState  *estate = (ExprState *) lfirst(lc);
-			Form_pg_attribute attr = TupleDescAttr(slot->tts_tupleDescriptor,
-												   resind);
+			CompactAttribute *attr = TupleDescCompactAttr(slot->tts_tupleDescriptor,
+														  resind);
 
 			values[resind] = ExecEvalExpr(estate,
 										  econtext,
diff --git a/src/backend/executor/tstoreReceiver.c b/src/backend/executor/tstoreReceiver.c
index de4646b5c2..658d1724c8 100644
--- a/src/backend/executor/tstoreReceiver.c
+++ b/src/backend/executor/tstoreReceiver.c
@@ -65,7 +65,7 @@ tstoreStartupReceiver(DestReceiver *self, int operation, TupleDesc typeinfo)
 	{
 		for (i = 0; i < natts; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(typeinfo, i);
+			CompactAttribute *attr = TupleDescCompactAttr(typeinfo, i);
 
 			if (attr->attisdropped)
 				continue;
@@ -154,7 +154,7 @@ tstoreReceiveSlot_detoast(TupleTableSlot *slot, DestReceiver *self)
 	for (i = 0; i < natts; i++)
 	{
 		Datum		val = slot->tts_values[i];
-		Form_pg_attribute attr = TupleDescAttr(typeinfo, i);
+		CompactAttribute *attr = TupleDescCompactAttr(typeinfo, i);
 
 		if (!attr->attisdropped && attr->attlen == -1 && !slot->tts_isnull[i])
 		{
diff --git a/src/backend/jit/llvm/llvmjit_deform.c b/src/backend/jit/llvm/llvmjit_deform.c
index b07f8e7f75..f49e7bce7d 100644
--- a/src/backend/jit/llvm/llvmjit_deform.c
+++ b/src/backend/jit/llvm/llvmjit_deform.c
@@ -110,7 +110,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 	 */
 	for (attnum = 0; attnum < desc->natts; attnum++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, attnum);
+		CompactAttribute *att = TupleDescCompactAttr(desc, attnum);
 
 		/*
 		 * If the column is declared NOT NULL then it must be present in every
@@ -393,7 +393,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 	 */
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, attnum);
+		CompactAttribute *att = TupleDescCompactAttr(desc, attnum);
 		LLVMValueRef v_incby;
 		int			alignto;
 		LLVMValueRef l_attno = l_int16_const(lc, attnum);
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index b913f91ff0..ef44bfd89c 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -175,12 +175,12 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
 	{
 		for (int i = 0; i < relation->rd_att->natts; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i);
+			CompactAttribute *attr = TupleDescCompactAttr(relation->rd_att, i);
 
 			if (attr->attnotnull)
 			{
 				rel->notnullattnums = bms_add_member(rel->notnullattnums,
-													 attr->attnum);
+													 i + 1);
 
 				/*
 				 * Per RemoveAttributeById(), dropped columns will have their
diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c
index 00e7024563..5710d392fd 100644
--- a/src/backend/replication/pgoutput/pgoutput.c
+++ b/src/backend/replication/pgoutput/pgoutput.c
@@ -1305,7 +1305,7 @@ pgoutput_row_filter(Relation relation, TupleTableSlot *old_slot,
 	 */
 	for (i = 0; i < desc->natts; i++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, i);
+		CompactAttribute *att = TupleDescCompactAttr(desc, i);
 
 		/*
 		 * if the column in the new tuple or old tuple is null, nothing to do
diff --git a/src/backend/utils/adt/expandedrecord.c b/src/backend/utils/adt/expandedrecord.c
index 7e85ae3825..ef8196af35 100644
--- a/src/backend/utils/adt/expandedrecord.c
+++ b/src/backend/utils/adt/expandedrecord.c
@@ -699,7 +699,7 @@ ER_get_flat_size(ExpandedObjectHeader *eohptr)
 	{
 		for (i = 0; i < erh->nfields; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+			CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 			if (!erh->dnulls[i] &&
 				!attr->attbyval && attr->attlen == -1 &&
@@ -1115,7 +1115,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 								   bool check_constraints)
 {
 	TupleDesc	tupdesc;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 	Datum	   *dvalues;
 	bool	   *dnulls;
 	char	   *oldValue;
@@ -1146,7 +1146,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 	 * Copy new field value into record's context, and deal with detoasting,
 	 * if needed.
 	 */
-	attr = TupleDescAttr(tupdesc, fnumber - 1);
+	attr = TupleDescCompactAttr(tupdesc, fnumber - 1);
 	if (!isnull && !attr->attbyval)
 	{
 		MemoryContext oldcxt;
@@ -1279,7 +1279,7 @@ expanded_record_set_fields(ExpandedRecordHeader *erh,
 
 	for (fnumber = 0; fnumber < erh->nfields; fnumber++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, fnumber);
+		CompactAttribute *attr = TupleDescCompactAttr(tupdesc, fnumber);
 		Datum		newValue;
 		bool		isnull;
 
@@ -1541,7 +1541,7 @@ check_domain_for_new_field(ExpandedRecordHeader *erh, int fnumber,
 	 */
 	if (!isnull)
 	{
-		Form_pg_attribute attr = TupleDescAttr(erh->er_tupdesc, fnumber - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(erh->er_tupdesc, fnumber - 1);
 
 		if (!attr->attbyval && attr->attlen == -1 &&
 			VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 6896e1ae63..58b2a79840 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -2928,7 +2928,7 @@ ri_KeysEqual(Relation rel, TupleTableSlot *oldslot, TupleTableSlot *newslot,
 			 * difference for ON UPDATE CASCADE, but for consistency we treat
 			 * all changes to the PK the same.
 			 */
-			Form_pg_attribute att = TupleDescAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
+			CompactAttribute *att = TupleDescCompactAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
 
 			if (!datum_image_eq(oldvalue, newvalue, att->attbyval, att->attlen))
 				return false;
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index c326f687eb..cd7e705556 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -584,6 +584,8 @@ RelationBuildTupleDesc(Relation relation)
 			   attp,
 			   ATTRIBUTE_FIXED_PART_SIZE);
 
+		populate_compact_attribute(relation->rd_att, attnum - 1);
+
 		/* Update constraint/default info */
 		if (attp->attnotnull)
 			constr->has_not_null = true;
@@ -673,12 +675,12 @@ RelationBuildTupleDesc(Relation relation)
 #endif
 
 	/*
-	 * However, we can easily set the attcacheoff value for the first
-	 * attribute: it must be zero.  This eliminates the need for special cases
-	 * for attnum=1 that used to exist in fastgetattr() and index_getattr().
+	 * We can easily set the attcacheoff value for the first attribute: it
+	 * must be zero.  This eliminates the need for special cases for attnum=1
+	 * that used to exist in fastgetattr() and index_getattr().
 	 */
 	if (RelationGetNumberOfAttributes(relation) > 0)
-		TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(relation->rd_att, 0)->attcacheoff = 0;
 
 	/*
 	 * Set up constraint/default info
@@ -1965,10 +1967,12 @@ formrdesc(const char *relationName, Oid relationReltype,
 		has_not_null |= attrs[i].attnotnull;
 		/* make sure attcacheoff is valid */
 		TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
+
+		populate_compact_attribute(relation->rd_att, i);
 	}
 
 	/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
-	TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
+	TupleDescCompactAttr(relation->rd_att, 0)->attcacheoff = 0;
 
 	/* mark not-null status */
 	if (has_not_null)
@@ -3623,6 +3627,7 @@ RelationBuildLocalRelation(const char *relname,
 		datt->attgenerated = satt->attgenerated;
 		datt->attnotnull = satt->attnotnull;
 		has_not_null |= satt->attnotnull;
+		populate_compact_attribute(rel->rd_att, i);
 	}
 
 	if (has_not_null)
@@ -4437,10 +4442,12 @@ BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs)
 		memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
 		/* make sure attcacheoff is valid */
 		TupleDescAttr(result, i)->attcacheoff = -1;
+
+		populate_compact_attribute(result, i);
 	}
 
 	/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
-	TupleDescAttr(result, 0)->attcacheoff = 0;
+	TupleDescCompactAttr(result, 0)->attcacheoff = 0;
 
 	/* Note: we don't bother to set up a TupleConstr entry */
 
@@ -6181,6 +6188,8 @@ load_relcache_init_file(bool shared)
 				goto read_failed;
 
 			has_not_null |= attr->attnotnull;
+
+			populate_compact_attribute(rel->rd_att, i);
 		}
 
 		/* next read the access method specific field */
diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h
index 5e38ef8696..0d1adff540 100644
--- a/src/include/access/htup_details.h
+++ b/src/include/access/htup_details.h
@@ -758,9 +758,9 @@ fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 	*isnull = false;
 	if (HeapTupleNoNulls(tup))
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
-		att = TupleDescAttr(tupleDesc, attnum - 1);
+		att = TupleDescCompactAttr(tupleDesc, attnum - 1);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, (char *) tup->t_data + tup->t_data->t_hoff +
 							att->attcacheoff);
diff --git a/src/include/access/itup.h b/src/include/access/itup.h
index 94885751e5..4393b19a7f 100644
--- a/src/include/access/itup.h
+++ b/src/include/access/itup.h
@@ -124,11 +124,13 @@ index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 
 	if (!IndexTupleHasNulls(tup))
 	{
-		if (TupleDescAttr(tupleDesc, attnum - 1)->attcacheoff >= 0)
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, attnum - 1);
+
+		if (attr->attcacheoff >= 0)
 		{
-			return fetchatt(TupleDescAttr(tupleDesc, attnum - 1),
-							(char *) tup + IndexInfoFindDataOffset(tup->t_info)
-							+ TupleDescAttr(tupleDesc, attnum - 1)->attcacheoff);
+			return fetchatt(attr,
+							(char *) tup + IndexInfoFindDataOffset(tup->t_info) +
+							attr->attcacheoff);
 		}
 		else
 			return nocache_index_getattr(tup, attnum, tupleDesc);
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 2c435cdcb2..5256e14268 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -45,6 +45,26 @@ typedef struct TupleConstr
 	bool		has_generated_stored;
 } TupleConstr;
 
+/*
+ * CompactAttribute
+ *		Cut-down version of FormData_pg_attribute for faster access for tasks
+ *		such as tuple deformation.
+ */
+typedef struct CompactAttribute
+{
+	int32		attcacheoff;	/* fixed offset into tuple, if known, or -1 */
+	int16		attlen;			/* attr len in bytes or -1 = varlen, -2 =
+								 * cstring */
+	bool		attbyval:1;		/* as FormData_pg_attribute.attbyval */
+	bool		attispackable:1;	/* FormData_pg_attribute.attstorage !=
+									 * TYPSTORAGE_PLAIN */
+	bool		atthasmissing:1;	/* as FormData_pg_attribute.atthasmissing */
+	bool		attisdropped:1; /* as FormData_pg_attribute.attisdropped */
+	bool		attgenerated:1; /* FormData_pg_attribute.attgenerated != '\0' */
+	bool		attnotnull:1;	/* as FormData_pg_attribute.attnotnull */
+	char		attalign;		/* alignment requirement */
+} CompactAttribute;
+
 /*
  * This struct is passed around within the backend to describe the structure
  * of tuples.  For tuples coming from on-disk relations, the information is
@@ -75,6 +95,18 @@ typedef struct TupleConstr
  * context and go away when the context is freed.  We set the tdrefcount
  * field of such a descriptor to -1, while reference-counted descriptors
  * always have tdrefcount >= 0.
+ *
+ * The attrs field stores the fixed-sized portion of FormData_pg_attribute.
+ * Because that struct is large, we also store a corresponding
+ * CompactAttribute for each attribute in compact_attrs.  This is stored
+ * inline with the struct.  Because CompactAttribute is significantly smaller
+ * than FormData_pg_attribute, code, especially performance-critical code
+ * should prioritize using the fields from the CompactAttribute over the
+ * equivalent fields in FormData_pg_attribute whenever possible.
+ *
+ * Any code making changes manually to the fields in 'attrs' must subsequently
+ * call populate_compact_attribute() to flush the changes out to the
+ * corresponding 'compact_attrs' element.
  */
 typedef struct TupleDescData
 {
@@ -85,12 +117,52 @@ typedef struct TupleDescData
 	TupleConstr *constr;		/* constraints, or NULL if none */
 	/* attrs[N] is the description of Attribute Number N+1 */
 	FormData_pg_attribute *attrs;
+	CompactAttribute compact_attrs[FLEXIBLE_ARRAY_MEMBER];
 }			TupleDescData;
 typedef struct TupleDescData *TupleDesc;
 
-/* Accessor for the i'th attribute of tupdesc. */
+extern void populate_compact_attribute(TupleDesc tupdesc, int i);
+
+/* Accessor for the i'th FormData_pg_attribute of tupdesc. */
 #define TupleDescAttr(tupdesc, i) (&(tupdesc)->attrs[(i)])
 
+/*
+ * Accessor for the i'th CompactAttribute of tupdesc.
+ */
+static inline CompactAttribute *
+TupleDescCompactAttr(TupleDesc tupdesc, int i)
+{
+	CompactAttribute *cattr = &tupdesc->compact_attrs[i];
+#ifdef USE_ASSERT_CHECKING
+	CompactAttribute snapshot;
+
+	/*
+	 * In Assert enabled builds we verify that the CompactAttribute is
+	 * populated correctly.  This helps find bugs in places such as ALTER
+	 * TABLE where code makes changes to the FormData_pg_attribute but forgets
+	 * to call populate_compact_attribute.
+	 */
+
+	/*
+	 * Take a snapshot of how the CompactAttribute is now before calling
+	 * populate_compact_attribute to make it up-to-date with the
+	 * FormData_pg_attribute.
+	 */
+	memcpy(&snapshot, cattr, sizeof(CompactAttribute));
+
+	populate_compact_attribute(tupdesc, i);
+
+	/* reset attcacheoff back to what it was */
+	cattr->attcacheoff = snapshot.attcacheoff;
+
+	/* Ensure the snapshot matches the freshly populated CompactAttribute */
+	Assert(memcmp(&snapshot, cattr, sizeof(CompactAttribute)) == 0);
+#endif
+
+	return cattr;
+}
+
+
 extern TupleDesc CreateTemplateTupleDesc(int natts);
 
 extern TupleDesc CreateTupleDesc(int natts, Form_pg_attribute *attrs);
@@ -99,13 +171,15 @@ extern TupleDesc CreateTupleDescCopy(TupleDesc tupdesc);
 
 extern TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc);
 
-#define TupleDescSize(src) MAXALIGN(sizeof(TupleDescData))
+#define TupleDescSize(src) \
+	(offsetof(struct TupleDescData, compact_attrs) + \
+	 (src)->natts * sizeof(CompactAttribute))
 
 #define TupleDescFullSize(src) \
-	(MAXALIGN(sizeof(TupleDescData)) + sizeof(FormData_pg_attribute) * (src)->natts)
+	(TupleDescSize(src) + sizeof(FormData_pg_attribute) * (src)->natts)
 
 #define TupleDescAttrAddress(desc) \
-	(Form_pg_attribute) ((char *) (desc) + MAXALIGN(sizeof(TupleDescData)))
+	(Form_pg_attribute) ((char *) (desc) + TupleDescSize(desc))
 
 extern void TupleDescCopy(TupleDesc dst, TupleDesc src);
 
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index 58b3a58cfd..622adfa5f8 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -14,6 +14,7 @@
 #ifndef TUPMACS_H
 #define TUPMACS_H
 
+#include "access/tupdesc.h"
 #include "catalog/pg_type_d.h"	/* for TYPALIGN macros */
 
 
@@ -30,8 +31,8 @@ att_isnull(int ATT, const bits8 *BITS)
 
 #ifndef FRONTEND
 /*
- * Given a Form_pg_attribute and a pointer into a tuple's data area,
- * return the correct value or pointer.
+ * Given a Form_pg_attribute or CompactAttribute and a pointer into a tuple's
+ * data area, return the correct value or pointer.
  *
  * We return a Datum value in all cases.  If the attribute has "byval" false,
  * we return the same pointer into the tuple data area that we're passed.
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index a65e1c07c5..ce3003d73a 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -454,6 +454,7 @@ CommitTimestampEntry
 CommitTimestampShared
 CommonEntry
 CommonTableExpr
+CompactAttribute
 CompareScalarsContext
 CompiledExprState
 CompositeIOData
-- 
2.34.1

v4-0003-Optimize-alignment-calculations-in-tuple-form-def.patchapplication/octet-stream; name=v4-0003-Optimize-alignment-calculations-in-tuple-form-def.patchDownload
From d937a477ce8c520818ffaabc458dd32854be7c68 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Wed, 29 May 2024 12:19:03 +1200
Subject: [PATCH v4 3/6] Optimize alignment calculations in tuple form/deform

This converts CompactAttribute.attalign from a char which is directly
derived from pg_attribute.attalign into a uint8 which specifies the
number of bytes to align the column by.  Also, rename the field to
attalignby to make the distinction more clear in code.

This removes the complexity of checking each char value and transforming
that into the appropriate alignment call.  This can just be a simple
TYPEALIGN passing in the number of bytes.
---
 contrib/amcheck/verify_heapam.c        |  6 +--
 contrib/pageinspect/heapfuncs.c        |  6 +--
 src/backend/access/brin/brin_tuple.c   |  8 ++--
 src/backend/access/common/attmap.c     |  2 +-
 src/backend/access/common/heaptuple.c  | 52 +++++++++++++-------------
 src/backend/access/common/indextuple.c | 22 +++++------
 src/backend/access/common/tupdesc.c    | 20 +++++++++-
 src/backend/executor/execExprInterp.c  |  2 +-
 src/backend/executor/execTuples.c      | 19 +++++-----
 src/backend/jit/llvm/llvmjit_deform.c  | 17 +--------
 src/include/access/tupdesc.h           |  2 +-
 src/include/access/tupmacs.h           | 23 ++++++++++++
 12 files changed, 101 insertions(+), 78 deletions(-)

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index 08772de39f..b66eb178b9 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1592,7 +1592,7 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	/* Skip non-varlena values, but update offset first */
 	if (thisatt->attlen != -1)
 	{
-		ctx->offset = att_align_nominal(ctx->offset, thisatt->attalign);
+		ctx->offset = att_nominal_alignby(ctx->offset, thisatt->attalignby);
 		ctx->offset = att_addlength_pointer(ctx->offset, thisatt->attlen,
 											tp + ctx->offset);
 		if (ctx->tuphdr->t_hoff + ctx->offset > ctx->lp_len)
@@ -1608,8 +1608,8 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	}
 
 	/* Ok, we're looking at a varlena attribute. */
-	ctx->offset = att_align_pointer(ctx->offset, thisatt->attalign, -1,
-									tp + ctx->offset);
+	ctx->offset = att_pointer_alignby(ctx->offset, thisatt->attalignby, -1,
+									  tp + ctx->offset);
 
 	/* Get the (possibly corrupt) varlena datum */
 	attdatum = fetchatt(thisatt, tp + ctx->offset);
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 397259d168..6bdb3c930c 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -358,8 +358,8 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 
 			if (attr->attlen == -1)
 			{
-				off = att_align_pointer(off, attr->attalign, -1,
-										tupdata + off);
+				off = att_pointer_alignby(off, attr->attalignby, -1,
+										  tupdata + off);
 
 				/*
 				 * As VARSIZE_ANY throws an exception if it can't properly
@@ -377,7 +377,7 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 			}
 			else
 			{
-				off = att_align_nominal(off, attr->attalign);
+				off = att_nominal_alignby(off, attr->attalignby);
 				len = attr->attlen;
 			}
 
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index aae646be5d..e65c1efff4 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -703,13 +703,13 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
 
 			if (thisatt->attlen == -1)
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, thisatt->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, thisatt->attalignby);
 			}
 
 			values[stored++] = fetchatt(thisatt, tp + off);
diff --git a/src/backend/access/common/attmap.c b/src/backend/access/common/attmap.c
index 0805c4121e..29ce51ec3b 100644
--- a/src/backend/access/common/attmap.c
+++ b/src/backend/access/common/attmap.c
@@ -321,7 +321,7 @@ check_attrmap_match(TupleDesc indesc,
 		if (attrMap->attnums[i] == 0 &&
 			inatt->attisdropped &&
 			inatt->attlen == outatt->attlen &&
-			inatt->attalign == outatt->attalign)
+			inatt->attalignby == outatt->attalignby)
 			continue;
 
 		return false;
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index d0a922011e..ef601dde6e 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -250,13 +250,13 @@ heap_compute_data_size(TupleDesc tupleDesc,
 			 * we want to flatten the expanded value so that the constructed
 			 * tuple doesn't depend on it
 			 */
-			data_length = att_align_nominal(data_length, atti->attalign);
+			data_length = att_nominal_alignby(data_length, atti->attalignby);
 			data_length += EOH_get_flat_size(DatumGetEOHP(val));
 		}
 		else
 		{
-			data_length = att_align_datum(data_length, atti->attalign,
-										  atti->attlen, val);
+			data_length = att_datum_alignby(data_length, atti->attalignby,
+											atti->attlen, val);
 			data_length = att_addlength_datum(data_length, atti->attlen,
 											  val);
 		}
@@ -307,13 +307,13 @@ fill_val(CompactAttribute *att,
 	}
 
 	/*
-	 * XXX we use the att_align macros on the pointer value itself, not on an
-	 * offset.  This is a bit of a hack.
+	 * XXX we use the att_nominal_alignby macro on the pointer value itself,
+	 * not on an offset.  This is a bit of a hack.
 	 */
 	if (att->attbyval)
 	{
 		/* pass-by-value */
-		data = (char *) att_align_nominal(data, att->attalign);
+		data = (char *) att_nominal_alignby(data, att->attalignby);
 		store_att_byval(data, datum, att->attlen);
 		data_length = att->attlen;
 	}
@@ -333,8 +333,7 @@ fill_val(CompactAttribute *att,
 				 */
 				ExpandedObjectHeader *eoh = DatumGetEOHP(datum);
 
-				data = (char *) att_align_nominal(data,
-												  att->attalign);
+				data = (char *) att_nominal_alignby(data, att->attalignby);
 				data_length = EOH_get_flat_size(eoh);
 				EOH_flatten_into(eoh, data, data_length);
 			}
@@ -362,8 +361,7 @@ fill_val(CompactAttribute *att,
 		else
 		{
 			/* full 4-byte header varlena */
-			data = (char *) att_align_nominal(data,
-											  att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = VARSIZE(val);
 			memcpy(data, val, data_length);
 		}
@@ -372,14 +370,14 @@ fill_val(CompactAttribute *att,
 	{
 		/* cstring ... never needs alignment */
 		*infomask |= HEAP_HASVARWIDTH;
-		Assert(att->attalign == TYPALIGN_CHAR);
+		Assert(att->attalignby == sizeof(char));
 		data_length = strlen(DatumGetCString(datum)) + 1;
 		memcpy(data, DatumGetPointer(datum), data_length);
 	}
 	else
 	{
 		/* fixed-length pass-by-reference */
-		data = (char *) att_align_nominal(data, att->attalign);
+		data = (char *) att_nominal_alignby(data, att->attalignby);
 		Assert(att->attlen > 0);
 		data_length = att->attlen;
 		memcpy(data, DatumGetPointer(datum), data_length);
@@ -633,7 +631,7 @@ nocachegetattr(HeapTuple tup,
 			if (att->attlen <= 0)
 				break;
 
-			off = att_align_nominal(off, att->attalign);
+			off = att_nominal_alignby(off, att->attalignby);
 
 			att->attcacheoff = off;
 
@@ -682,19 +680,19 @@ nocachegetattr(HeapTuple tup,
 				 * either an aligned or unaligned value.
 				 */
 				if (usecache &&
-					off == att_align_nominal(off, att->attalign))
+					off == att_nominal_alignby(off, att->attalignby))
 					att->attcacheoff = off;
 				else
 				{
-					off = att_align_pointer(off, att->attalign, -1,
-											tp + off);
+					off = att_pointer_alignby(off, att->attalignby, -1,
+											  tp + off);
 					usecache = false;
 				}
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, att->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, att->attalignby);
 
 				if (usecache)
 					att->attcacheoff = off;
@@ -897,10 +895,10 @@ expand_tuple(HeapTuple *targetHeapTuple,
 			{
 				CompactAttribute *att = TupleDescCompactAttr(tupleDesc, attnum);
 
-				targetDataLen = att_align_datum(targetDataLen,
-												att->attalign,
-												att->attlen,
-												attrmiss[attnum].am_value);
+				targetDataLen = att_datum_alignby(targetDataLen,
+												  att->attalignby,
+												  att->attlen,
+												  attrmiss[attnum].am_value);
 
 				targetDataLen = att_addlength_pointer(targetDataLen,
 													  att->attlen,
@@ -1395,19 +1393,19 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index 37133ed7f8..3947b4a4d8 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -363,7 +363,7 @@ nocache_index_getattr(IndexTuple tup,
 			if (att->attlen <= 0)
 				break;
 
-			off = att_align_nominal(off, att->attalign);
+			off = att_nominal_alignby(off, att->attalignby);
 
 			att->attcacheoff = off;
 
@@ -412,19 +412,19 @@ nocache_index_getattr(IndexTuple tup,
 				 * either an aligned or unaligned value.
 				 */
 				if (usecache &&
-					off == att_align_nominal(off, att->attalign))
+					off == att_nominal_alignby(off, att->attalignby))
 					att->attcacheoff = off;
 				else
 				{
-					off = att_align_pointer(off, att->attalign, -1,
-											tp + off);
+					off = att_pointer_alignby(off, att->attalignby, -1,
+											  tp + off);
 					usecache = false;
 				}
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, att->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, att->attalignby);
 
 				if (usecache)
 					att->attcacheoff = off;
@@ -513,19 +513,19 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 2f9a9a2636..78c26e769f 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -74,7 +74,25 @@ populate_compact_attribute(TupleDesc tupdesc, int i)
 	dst->attgenerated = (src->attgenerated != '\0');
 	dst->attnotnull = src->attnotnull;
 
-	dst->attalign = src->attalign;
+	switch (src->attalign)
+	{
+		case TYPALIGN_INT:
+			dst->attalignby = ALIGNOF_INT;
+			break;
+		case TYPALIGN_CHAR:
+			dst->attalignby = sizeof(char);
+			break;
+		case TYPALIGN_DOUBLE:
+			dst->attalignby = ALIGNOF_DOUBLE;
+			break;
+		case TYPALIGN_SHORT:
+			dst->attalignby = ALIGNOF_SHORT;
+			break;
+		default:
+			dst->attalignby = 0;
+			elog(ERROR, "invalid attalign value: %c", src->attalign);
+			break;
+	}
 }
 
 /*
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 337291dee7..3b603d81a3 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -5086,7 +5086,7 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
 			if (slot->tts_isnull[i])
 				continue;		/* null is always okay */
 			if (vattr->attlen != sattr->attlen ||
-				vattr->attalign != sattr->attalign)
+				vattr->attalignby != sattr->attalignby)
 				ereport(ERROR,
 						(errcode(ERRCODE_DATATYPE_MISMATCH),
 						 errmsg("table row type and query-specified row type do not match"),
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 875515777b..1f36d675a1 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -202,12 +202,12 @@ tts_virtual_materialize(TupleTableSlot *slot)
 			 * We want to flatten the expanded value so that the materialized
 			 * slot doesn't depend on it.
 			 */
-			sz = att_align_nominal(sz, att->attalign);
+			sz = att_nominal_alignby(sz, att->attalignby);
 			sz += EOH_get_flat_size(DatumGetEOHP(val));
 		}
 		else
 		{
-			sz = att_align_nominal(sz, att->attalign);
+			sz = att_nominal_alignby(sz, att->attalignby);
 			sz = att_addlength_datum(sz, att->attlen, val);
 		}
 	}
@@ -242,8 +242,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 			 */
 			ExpandedObjectHeader *eoh = DatumGetEOHP(val);
 
-			data = (char *) att_align_nominal(data,
-											  att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = EOH_get_flat_size(eoh);
 			EOH_flatten_into(eoh, data, data_length);
 
@@ -254,7 +253,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 		{
 			Size		data_length = 0;
 
-			data = (char *) att_align_nominal(data, att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = att_addlength_datum(data_length, att->attlen, val);
 
 			memcpy(data, DatumGetPointer(val), data_length);
@@ -1067,19 +1066,19 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/jit/llvm/llvmjit_deform.c b/src/backend/jit/llvm/llvmjit_deform.c
index f49e7bce7d..88ef2bb06c 100644
--- a/src/backend/jit/llvm/llvmjit_deform.c
+++ b/src/backend/jit/llvm/llvmjit_deform.c
@@ -395,7 +395,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 	{
 		CompactAttribute *att = TupleDescCompactAttr(desc, attnum);
 		LLVMValueRef v_incby;
-		int			alignto;
+		int			alignto = att->attalignby;
 		LLVMValueRef l_attno = l_int16_const(lc, attnum);
 		LLVMValueRef v_attdatap;
 		LLVMValueRef v_resultp;
@@ -494,21 +494,6 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 		}
 		LLVMPositionBuilderAtEnd(b, attcheckalignblocks[attnum]);
 
-		/* determine required alignment */
-		if (att->attalign == TYPALIGN_INT)
-			alignto = ALIGNOF_INT;
-		else if (att->attalign == TYPALIGN_CHAR)
-			alignto = 1;
-		else if (att->attalign == TYPALIGN_DOUBLE)
-			alignto = ALIGNOF_DOUBLE;
-		else if (att->attalign == TYPALIGN_SHORT)
-			alignto = ALIGNOF_SHORT;
-		else
-		{
-			elog(ERROR, "unknown alignment");
-			alignto = 0;
-		}
-
 		/* ------
 		 * Even if alignment is required, we can skip doing it if provably
 		 * unnecessary:
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 5256e14268..9854b05c9d 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -62,7 +62,7 @@ typedef struct CompactAttribute
 	bool		attisdropped:1; /* as FormData_pg_attribute.attisdropped */
 	bool		attgenerated:1; /* FormData_pg_attribute.attgenerated != '\0' */
 	bool		attnotnull:1;	/* as FormData_pg_attribute.attnotnull */
-	char		attalign;		/* alignment requirement */
+	uint8		attalignby;		/* alignment requirement in bytes */
 } CompactAttribute;
 
 /*
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index 622adfa5f8..029324e147 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -91,6 +91,16 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	att_align_nominal(cur_offset, attalign) \
 )
 
+/*
+ * Similar to att_align_datum, but accepts a number of bytes, typically from
+ * CompactAttribute.attalignby to align the Datum by.
+ */
+#define att_datum_alignby(cur_offset, attalignby, attlen, attdatum) \
+	( \
+	((attlen) == -1 && VARATT_IS_SHORT(DatumGetPointer(attdatum))) ? \
+	(uintptr_t) (cur_offset) : \
+	TYPEALIGN(attalignby, cur_offset))
+
 /*
  * att_align_pointer performs the same calculation as att_align_datum,
  * but is used when walking a tuple.  attptr is the current actual data
@@ -112,6 +122,12 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	att_align_nominal(cur_offset, attalign) \
 )
 
+#define att_pointer_alignby(cur_offset, attalignby, attlen, attptr) \
+( \
+	((attlen) == -1 && VARATT_NOT_PAD_BYTE(attptr)) ? \
+	(uintptr_t) (cur_offset) : \
+	TYPEALIGN(attalignby, cur_offset))
+
 /*
  * att_align_nominal aligns the given offset as needed for a datum of alignment
  * requirement attalign, ignoring any consideration of packed varlena datums.
@@ -138,6 +154,13 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	   ))) \
 )
 
+/*
+ * Similar to att_align_nominal, but accepts a number of bytes, typically from
+ * CompactAttribute.attalignby to align the offset by.
+ */
+#define att_nominal_alignby(cur_offset, attalignby) \
+	TYPEALIGN(attalignby, (uintptr_t) cur_offset)
+
 /*
  * att_addlength_datum increments the given offset by the space needed for
  * the given Datum variable.  attdatum is only accessed if we are dealing
-- 
2.34.1

v4-0004-Remove-pg_attribute.attcacheoff-column.patchapplication/octet-stream; name=v4-0004-Remove-pg_attribute.attcacheoff-column.patchDownload
From 349110ca0985aabc521c65ddd67e4e6746fde1d2 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 6 Aug 2024 03:03:12 +1200
Subject: [PATCH v4 4/6] Remove pg_attribute.attcacheoff column

This is no longer needed as the offset is now cached in the
CompactAttribute struct.

catversion bump
---
 doc/src/sgml/catalogs.sgml                | 11 -----------
 src/backend/access/common/tupdesc.c       | 17 ++---------------
 src/backend/bootstrap/bootstrap.c         |  1 -
 src/backend/catalog/heap.c                | 16 ++++------------
 src/backend/catalog/index.c               |  1 -
 src/backend/utils/cache/relcache.c        | 18 ------------------
 src/include/catalog/pg_attribute.h        |  9 ---------
 src/test/regress/expected/type_sanity.out |  3 +--
 src/test/regress/sql/type_sanity.sql      |  3 +--
 9 files changed, 8 insertions(+), 71 deletions(-)

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 964c819a02..0436c495eb 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -1186,17 +1186,6 @@
       </para></entry>
      </row>
 
-     <row>
-      <entry role="catalog_table_entry"><para role="column_definition">
-       <structfield>attcacheoff</structfield> <type>int4</type>
-      </para>
-      <para>
-       Always -1 in storage, but when loaded into a row descriptor
-       in memory this might be updated to cache the offset of the attribute
-       within the row
-      </para></entry>
-     </row>
-
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>atttypmod</structfield> <type>int4</type>
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 78c26e769f..363226c967 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -361,17 +361,7 @@ TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
 
 	memcpy(dstAtt, srcAtt, ATTRIBUTE_FIXED_PART_SIZE);
 
-	/*
-	 * Aside from updating the attno, we'd better reset attcacheoff.
-	 *
-	 * XXX Actually, to be entirely safe we'd need to reset the attcacheoff of
-	 * all following columns in dst as well.  Current usage scenarios don't
-	 * require that though, because all following columns will get initialized
-	 * by other uses of this function or TupleDescInitEntry.  So we cheat a
-	 * bit to avoid a useless O(N^2) penalty.
-	 */
 	dstAtt->attnum = dstAttno;
-	dstAtt->attcacheoff = -1;
 
 	/* since we're not copying constraints or defaults, clear these */
 	dstAtt->attnotnull = false;
@@ -501,9 +491,8 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
 		 * them (since atttypid will be zero for all dropped columns) and in
 		 * general it seems safer to check them always.
 		 *
-		 * attcacheoff must NOT be checked since it's possibly not set in both
-		 * copies.  We also intentionally ignore atthasmissing, since that's
-		 * not very relevant in tupdescs, which lack the attmissingval field.
+		 * We intentionally ignore atthasmissing, since that's not very
+		 * relevant in tupdescs, which lack the attmissingval field.
 		 */
 		if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0)
 			return false;
@@ -744,7 +733,6 @@ TupleDescInitEntry(TupleDesc desc,
 	else if (attributeName != NameStr(att->attname))
 		namestrcpy(&(att->attname), attributeName);
 
-	att->attcacheoff = -1;
 	att->atttypmod = typmod;
 
 	att->attnum = attributeNumber;
@@ -808,7 +796,6 @@ TupleDescInitBuiltinEntry(TupleDesc desc,
 	Assert(attributeName != NULL);
 	namestrcpy(&(att->attname), attributeName);
 
-	att->attcacheoff = -1;
 	att->atttypmod = typmod;
 
 	att->attnum = attributeNumber;
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index ed59dfce89..77dcca4b7a 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -549,7 +549,6 @@ DefineAttr(char *name, char *type, int attnum, int nullness)
 	if (OidIsValid(attrtypes[attnum]->attcollation))
 		attrtypes[attnum]->attcollation = C_COLLATION_OID;
 
-	attrtypes[attnum]->attcacheoff = -1;
 	attrtypes[attnum]->atttypmod = -1;
 	attrtypes[attnum]->attislocal = true;
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 78e59384d1..95deedbee6 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -144,7 +144,6 @@ static const FormData_pg_attribute a1 = {
 	.atttypid = TIDOID,
 	.attlen = sizeof(ItemPointerData),
 	.attnum = SelfItemPointerAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = false,
 	.attalign = TYPALIGN_SHORT,
@@ -158,7 +157,6 @@ static const FormData_pg_attribute a2 = {
 	.atttypid = XIDOID,
 	.attlen = sizeof(TransactionId),
 	.attnum = MinTransactionIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -172,7 +170,6 @@ static const FormData_pg_attribute a3 = {
 	.atttypid = CIDOID,
 	.attlen = sizeof(CommandId),
 	.attnum = MinCommandIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -186,7 +183,6 @@ static const FormData_pg_attribute a4 = {
 	.atttypid = XIDOID,
 	.attlen = sizeof(TransactionId),
 	.attnum = MaxTransactionIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -200,7 +196,6 @@ static const FormData_pg_attribute a5 = {
 	.atttypid = CIDOID,
 	.attlen = sizeof(CommandId),
 	.attnum = MaxCommandIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -220,7 +215,6 @@ static const FormData_pg_attribute a6 = {
 	.atttypid = OIDOID,
 	.attlen = sizeof(Oid),
 	.attnum = TableOidAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -684,11 +678,10 @@ CheckAttributeType(const char *attname,
  *		Construct and insert a set of tuples in pg_attribute.
  *
  * Caller has already opened and locked pg_attribute.  tupdesc contains the
- * attributes to insert.  attcacheoff is always initialized to -1.
- * tupdesc_extra supplies the values for certain variable-length/nullable
- * pg_attribute fields and must contain the same number of elements as tupdesc
- * or be NULL.  The other variable-length fields of pg_attribute are always
- * initialized to null values.
+ * attributes to insert.  tupdesc_extra supplies the values for certain
+ * variable-length/nullable pg_attribute fields and must contain the same
+ * number of elements as tupdesc or be NULL.  The other variable-length fields
+ * of pg_attribute are always initialized to null values.
  *
  * indstate is the index state for CatalogTupleInsertWithInfo.  It can be
  * passed as NULL, in which case we'll fetch the necessary info.  (Don't do
@@ -740,7 +733,6 @@ InsertPgAttributeTuples(Relation pg_attribute_rel,
 		slot[slotCount]->tts_values[Anum_pg_attribute_atttypid - 1] = ObjectIdGetDatum(attrs->atttypid);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attlen - 1] = Int16GetDatum(attrs->attlen);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attnum - 1] = Int16GetDatum(attrs->attnum);
-		slot[slotCount]->tts_values[Anum_pg_attribute_attcacheoff - 1] = Int32GetDatum(-1);
 		slot[slotCount]->tts_values[Anum_pg_attribute_atttypmod - 1] = Int32GetDatum(attrs->atttypmod);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attndims - 1] = Int16GetDatum(attrs->attndims);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attbyval - 1] = BoolGetDatum(attrs->attbyval);
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 80bb1ee507..cd9e2d54a3 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -320,7 +320,6 @@ ConstructTupleDescriptor(Relation heapRelation,
 
 		MemSet(to, 0, ATTRIBUTE_FIXED_PART_SIZE);
 		to->attnum = i + 1;
-		to->attcacheoff = -1;
 		to->attislocal = true;
 		to->attcollation = (i < numkeyatts) ? collationIds[i] : InvalidOid;
 
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index cd7e705556..8c48997f6b 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -660,20 +660,6 @@ RelationBuildTupleDesc(Relation relation)
 		elog(ERROR, "pg_attribute catalog is missing %d attribute(s) for relation OID %u",
 			 need, RelationGetRelid(relation));
 
-	/*
-	 * The attcacheoff values we read from pg_attribute should all be -1
-	 * ("unknown").  Verify this if assert checking is on.  They will be
-	 * computed when and if needed during tuple access.
-	 */
-#ifdef USE_ASSERT_CHECKING
-	{
-		int			i;
-
-		for (i = 0; i < RelationGetNumberOfAttributes(relation); i++)
-			Assert(TupleDescAttr(relation->rd_att, i)->attcacheoff == -1);
-	}
-#endif
-
 	/*
 	 * We can easily set the attcacheoff value for the first attribute: it
 	 * must be zero.  This eliminates the need for special cases for attnum=1
@@ -1965,8 +1951,6 @@ formrdesc(const char *relationName, Oid relationReltype,
 			   &attrs[i],
 			   ATTRIBUTE_FIXED_PART_SIZE);
 		has_not_null |= attrs[i].attnotnull;
-		/* make sure attcacheoff is valid */
-		TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
 
 		populate_compact_attribute(relation->rd_att, i);
 	}
@@ -4440,8 +4424,6 @@ BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs)
 	for (i = 0; i < natts; i++)
 	{
 		memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
-		/* make sure attcacheoff is valid */
-		TupleDescAttr(result, i)->attcacheoff = -1;
 
 		populate_compact_attribute(result, i);
 	}
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index 1c62b8bfcb..30d1e8cfcc 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -73,15 +73,6 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
 	 */
 	int16		attnum;
 
-	/*
-	 * fastgetattr() uses attcacheoff to cache byte offsets of attributes in
-	 * heap tuples.  The value actually stored in pg_attribute (-1) indicates
-	 * no cached value.  But when we copy these tuples into a tuple
-	 * descriptor, we may then update attcacheoff in the copies. This speeds
-	 * up the attribute walking process.
-	 */
-	int32		attcacheoff BKI_DEFAULT(-1);
-
 	/*
 	 * atttypmod records type-specific data supplied at table creation time
 	 * (for example, the max length of a varchar field).  It is passed to
diff --git a/src/test/regress/expected/type_sanity.out b/src/test/regress/expected/type_sanity.out
index 88d8f6c32d..8eff3d10d2 100644
--- a/src/test/regress/expected/type_sanity.out
+++ b/src/test/regress/expected/type_sanity.out
@@ -550,8 +550,7 @@ WHERE pc.relkind IN ('r', 't', 'm') and
 SELECT a1.attrelid, a1.attname
 FROM pg_attribute as a1
 WHERE a1.attrelid = 0 OR a1.atttypid = 0 OR a1.attnum = 0 OR
-    a1.attcacheoff != -1 OR a1.attinhcount < 0 OR
-    (a1.attinhcount = 0 AND NOT a1.attislocal);
+    a1.attinhcount < 0 OR (a1.attinhcount = 0 AND NOT a1.attislocal);
  attrelid | attname 
 ----------+---------
 (0 rows)
diff --git a/src/test/regress/sql/type_sanity.sql b/src/test/regress/sql/type_sanity.sql
index e88d6cbe49..303f90955d 100644
--- a/src/test/regress/sql/type_sanity.sql
+++ b/src/test/regress/sql/type_sanity.sql
@@ -397,8 +397,7 @@ WHERE pc.relkind IN ('r', 't', 'm') and
 SELECT a1.attrelid, a1.attname
 FROM pg_attribute as a1
 WHERE a1.attrelid = 0 OR a1.atttypid = 0 OR a1.attnum = 0 OR
-    a1.attcacheoff != -1 OR a1.attinhcount < 0 OR
-    (a1.attinhcount = 0 AND NOT a1.attislocal);
+    a1.attinhcount < 0 OR (a1.attinhcount = 0 AND NOT a1.attislocal);
 
 -- Cross-check attnum against parent relation
 
-- 
2.34.1

v4-0005-Try-a-larger-CompactAttribute-struct-without-bitf.patchapplication/octet-stream; name=v4-0005-Try-a-larger-CompactAttribute-struct-without-bitf.patchDownload
From c5ce7a7b6b06d8a6cb708582e7b8f5da4e25ad33 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 3 Sep 2024 14:05:30 +1200
Subject: [PATCH v4 5/6] Try a larger CompactAttribute struct without bitflags

Benchmarks have shown that making the CompactAttribute struct larger and
getting rid of the flags to reduce the bitwise-ANDing requirements makes
things go faster.
---
 src/include/access/tupdesc.h | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 9854b05c9d..cf776f7186 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -55,13 +55,13 @@ typedef struct CompactAttribute
 	int32		attcacheoff;	/* fixed offset into tuple, if known, or -1 */
 	int16		attlen;			/* attr len in bytes or -1 = varlen, -2 =
 								 * cstring */
-	bool		attbyval:1;		/* as FormData_pg_attribute.attbyval */
-	bool		attispackable:1;	/* FormData_pg_attribute.attstorage !=
-									 * TYPSTORAGE_PLAIN */
-	bool		atthasmissing:1;	/* as FormData_pg_attribute.atthasmissing */
-	bool		attisdropped:1; /* as FormData_pg_attribute.attisdropped */
-	bool		attgenerated:1; /* FormData_pg_attribute.attgenerated != '\0' */
-	bool		attnotnull:1;	/* as FormData_pg_attribute.attnotnull */
+	bool		attbyval;		/* as FormData_pg_attribute.attbyval */
+	bool		attispackable;	/* FormData_pg_attribute.attstorage !=
+								 * TYPSTORAGE_PLAIN */
+	bool		atthasmissing;	/* as FormData_pg_attribute.atthasmissing */
+	bool		attisdropped;	/* as FormData_pg_attribute.attisdropped */
+	bool		attgenerated;	/* FormData_pg_attribute.attgenerated != '\0' */
+	bool		attnotnull;		/* as FormData_pg_attribute.attnotnull */
 	uint8		attalignby;		/* alignment requirement in bytes */
 } CompactAttribute;
 
-- 
2.34.1

#15Victor Yegorov
vyegorov@gmail.com
In reply to: David Rowley (#14)
8 attachment(s)
Re: Make tuple deformation faster

ср, 9 окт. 2024 г. в 17:00, David Rowley <dgrowleyml@gmail.com>:

I'm not sure what to do about this part. I did quite a bit of staring
at the attached benchmark results. Using gcc13.2 on my Zen2 machine,
the 0005 patch is quite a bit faster (138 tps vs 127 tps) than with
just 0004 and both versions use an "add" instruction to bump to the
next CompactAttribute element. So, with that CPU, maybe it's just
faster from getting rid of the bitwise-AND code to extract the
booleans.

Hey.
I've been testing this patch for the last week, I have M3 and i7 based MBP
around.

I've modified deform_test.sh to have an equal number of columns for all
cases, so that table size is always
the same, and also increased the extra count to 48. Attached.

i7 shows nice and stable results, there's a clear win from this patch (see
pic-1).
M3 behaves very strangely, I cannot explain the first birst and the
following drop in TPS. But it's reproducible.
Also, making tests do some IO yields better TPS up to 20 extra columns (see
pic-2). I tend to just ignore M3
results, as it's smth to do with the HW, not the patch.
Combined results for in-memory sets are on pic-3.

Construct
sizeof(FormData_pg_attribute) * (src)->natts
is used in 7 places (in various forms), I thought it might be good
to use a macro here, say TupleArraySize(natts).

In v4-0002-Introduce-CompactAttribute-array-in-TupleDesc.patch

+#define COMPACT_ATTR_IS_PACKABLE(att) \
+>  ((att)->attlen == -1 && att->attispackable)

Seems second att needs parenthesis around it.

Although I haven't seen 30% speedup, I find this change very good to have.

--
Victor Yegorov

Attachments:

deform_test.sh.txttext/plain; charset=US-ASCII; name=deform_test.sh.txtDownload
pic-1.jpegimage/jpeg; name=pic-1.jpegDownload
����JFIF��C		
		



! #'2*#%/%+;,/35888!*=A<6A2785��C	



5$$55555555555555555555555555555555555555555555555555��"��������Z*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B����*�
�B�5E���U�TZ�h@N���+��tu�P�}T��Jf�/P(Fi�S6�k��M�;�7�*�JW@
^�L����AH��t����`
���Um����g|���<>�Q��ij�m��I���I�Q�=|�y�jR��e���<M%��s	m�T����$�/���F��-o���(�R:k�J�0�id�)O�X�������2����W�V�k�m��[�b��_���y��s���>|�D��n�O�i�W=f�{�.C��h����{ps��z�K��T���'�����C���[UE����@��Q�� ������0���?���>�|�*� �Ob��C�������94���<z�<�d|�dx��GZ�y�<=��N#H� � � ���?^�id~{��*� ��A[��^����}�j��(�$�?��y$+Z�j��V���,�>=���_f�������s��Y
f@�d�5��0C�`�����.Vl�B���&��=�������/}��j)�63��}�4��
����M��#Z�q���
O������Gc?�w�w���YMU8�R��j3��,��;DU�TZ�hV�+I(�%�����8����4������)��*-��.
�>��l
WB���5��~�
�����h@�S�qZ;�J��(�bR��� �(�;B�^,
��+z�U�a��j��V�
���Um\��_��y<��{�����y�����?������9_GWc����$��r��r����H�1�T��w4>s'U[&���t�rR[�H8��|������<]�{U�2�p��|��W�-�lA���kW�:8���Y����Bl��>ryt��n��?����N�	�&D��<��IM��������K��5�s�����?"s��j��V�����
����>�>}>�����V�>}�j��V���#��U�TZ�h����_��4�4�4�4�4�4�4�4�4�4�4�4�4�/���������������KH#H#H#H#H#H#H#H#H#H#H#H#H#H"��� � � � � � � � � � � � � �����4�4�4�4�4�4�4�4�4�4�9[UE���gh� 9#�����@rFH[UE���gh� 9#�����@rFH[UE���gh� 9#�����@rFH[UE���gh� <��h�H�G$d�9#���V�Qj���9���t����\����Y�ff�HmG$r#�2@���H��j��V���Z�~~����r5oy����bv6�Pm������G$r#�2@*��-U�����X�z���C����eO-W�u������G$r#�2@*��-U�;G8�����o���^}�\�i��WP�H�G$d�9#���V�Qj���9Y���s�d}5���'Z+��z�#��#���<��u��@rFH#�9� mU���Q�h�R���H�I����v�>>������fQ������WY�������$F$F$F$F$F$F$F$F$F$F$F$F$F$�a�������������I^BDbDbDbDbDbDbDbDbDbDbDbDbDbH�������������=�*��-U����S����������g���w�#Q���A=q
�~�x�����V����x�d�*�#�9� �H�G$d�U�TZ�h���s_�s83�r�5X�zE�������;fi�������/>��o�O/Y��������j6Y�v����H�G$d�9#���V�Qj��F�C���~��9��k-������j�B�cI��.��l'�=����}��h����7�S���r*|���<���.s>j}n>���ejm�@9#$�����
���Um16�0z\M�gh� 372>�y�=��5�����*k'�G��V.�+^Vc�?vc��b��mv��u��&��7�Me{�7@� �H�G$d�U�TZ�h��\��_�@���h��������8���Z����;2-�v���nC\d\�G�K���k���_)�YZ���
���f����#�2@���H��j��V���g+�q=�3�s�
�9/��6Md3r��9#��������q�c�������Q�PK����fn����4rFH#�9� mU��`�f��k��9��|�3��u��r�=\d�4����_D�0�p��MV77R<|����oE] 9#$�����
���Um)]�2���v�q�*T���dz��YNcA���&������J����\���s2'T�����W4�������{���]#y�.��	��t#�9� mU��g�P*�dt���4@rG +�nd��u�������^�:	�8k-*�e������i#�r9����������_ �-q���1i����F�A^�N�SR
�#�9� mU��`�s����a���h���@�/e�2Z����'i�3s��Vc���S�k<zH3c�y�����*������p��U�����o�}������Q��Q����s������>}o������������vG�YR-�O��W�����V�Qj��?�c�������3��iiiiiiiiiiiiiy��������������lR��������ix�n�+<�4��������#R�x�/?{W��9UXt%��e��x���Y�V,KI���+w������O/C6	5}Td��?���f�boY�
6g�E���s��$�����������*��-U�;G8������J���e5[�_5�\� $�>#U�5Yvsm��5������LC2v����u>\=��Y�u*k'�d�E8�L�����l{���X�Mv8���������������������|r~k���Xd��\����(��uX�ru�#Y�5��[a��j��V���DG$r#�2@|�m�C��M/7�_�efKXeZ��$�"5b�f��Q����-*�j����4W���v��������T[�j����I�1�l��;^�:�������x���39]�1�������������k;�*mU�����h���@rFH#�9<�;r�:K���s%�2d��U��E�y�
VW�Z<����~:�k�Fm���hs���l�{VX��ly�6������2�l|���*��-U�;G8������G$r#�2@U����t����fKXd��O�O�
��iV�Qj���9���H�G$d�9#���V�Qj���9���H�G$d�9#���V�Qj���9���H�G$d�9#���V�Qj���9���H�G$d�9#���V�Qj���9���H�G$d�9#���V�Qj���8���Q`WX�u�]`WX�u�]`WX�u�]`WX��+�
�����+�
�����+�
�����+�
���u�]`WX�u�]`WX�u�]`WX�u�NK����+�
�����+�
�����+�
�����]`WX�u�]`WX�u�]`WX�6��V�Qj���A�,�-�
��~�� (gK�i�s��4�>���Kx&��7�
���Um�j��V�O`��U�TZ�hKC����t�t
>��S���n-*�o� 5��xU�TZ�h[UE���U�T�c�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�[�]~p��04@ 013!#p"$25P`A����
�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km�D��-�Km��
���<z���<z���<z���<z�~��A��4,9�"��O�)�m�,Y(��������O�RE���n�*�
i��ZF���yc��K���}��I�7��O>�x�<sXx���!�����������6�C{jR��Jsz�����V�X��/a�w���w;?�6;R�D���������������$A!?�����3�U����U�6�1Krai��Y'��%Y����C���Z���]��5j�4lY�	�������)�j�� �����JJp��R��,��m�M#M��X�J	���F
�h��'&��<F`!o����~!��X�
�M)�lk���q�I���B��&�czy	��G,�����c�l�����A�3;��2��d���p�q��y��$������6S�#�����LP��f�Jh�C��Ue�X��s�fe���94��\z���d?�-[
!y��$�o%����H�#�U\�F95���3��w,��q��%���0D5�i|F���&��0�k5���Y��*����|ON6��Y�����W�+��#a�x��*p�2��F:�>��c����!r'�w�O�C��3�J�>��xw��e[�c�|A�V����G�0�Oh��R�l�*�r�oZh�*�-���
?
����9�3W�h�h��i�r���o���Sj�<�/�E���.��<C��yW�p�L#
�^���Y������x��,9���d4���p����kG\���r��b�_����6�d���Ks�-sg�el�L#k
��ri�4U�*�E[�g�[��8�O�W���*�1�F1�F"Gr8����T��.q���x���d`�8��26qg�E�B.1�;A���X]�Y�E�F1���G``�cZc�4b%�9���D���!ba��j�		�6Q�����!`��1��P#���RB��1}1c�\cs�9PF�F"D,l5�(����r�F1��5XD�14B�/8
x�h��x�q8#��B�������D#�%M^&g�H�1s!`�nQ��,�ag������Y������L���M.�z���K�92?���Hf��H�7�	�}$Y@8{X�f��L�������r��>�d������=n?��C���#Ek v�c'��	��B�H#�&�����P����|�-��<c��q��,�Z<`g�s� af��;��a�+V	�
v&|�Ax�j'b�,JL�8��|��9�L�9�4�OME�v+ff�����!�/�Z�������m�b�c��m������[�#��ID�
4���X��Y+����q����,/�f��fG�-�gd��D�1@�{`���`��m�L"`)#ik����t���lbz��!����<,��[��������>���t��'������g�s��E��fZ#�B�z
ecG�D�l$��h�-4��&����s��IH��	h��@����RB�[q�q��@�m�{a�(����'��<z���<z���<z���<z��9�fe���;%	���
Z�����.�IB�
�
�![�H��P�����Jg���1fY�b��s��;���y���	�&�X�k�W)�B8�K�E'�v��Q�b�&����X����PZ��#T����]�Cb����r��"����+P����,�r�;�K%��@0�x^�a8��4�������5��]�+p�������6���)��\�Cb����9��b����C;Gz��5�
X�A4��B(2���'5�k�!1Iv\��V�hEf)��F2��
�=n?��6;	�X�*�����X�����a��Z���K� >r2�W	������\E���<�]:�VH&P~�!���Zj�$��X��
;:��xD���	�u#�"����C��)�&�v������]o�l�����Ec���3�L��Z�����G�H�eE,P��;y\����jQ�a�xZ�`o1�L.p�|���Q�X�S�m����V����LI����_Z+�w[R`���� ��H������X� y	�,�!�z�/�$.�8�\�A4��l��q��V�����
������������������Q��1���,��q���>���{���A���:����:����:����:����:����:����:��u�gY�u�gY�u�gY�u�gY�u�gY�u�gY�u�gY������:����:����:����:����:����:����:�Y�u�gY�u�gY�u�gY�u�gY�u�gY�u�gY�u�gZ�:����:����:����:����:����:���l��q��5�
z���v�c��/���_��?��������r����>�����;vx�����_p�{�����gn�������p���w��������9}���u������<z�z�/�_=�������g�[��X����}��;��v���q����|���gq����=n?�c�����%��>�����;vx�����Z"�#�bq!66���p���w��������9i�z_�C��#��GtJ~�|���gq����=n?�c�1���A���&���^*bt���>�|���gq����=n?�i���qD��8K4V�vu,#0G)�?��|���gq����=n?�c��E�U��?�#B��St��}��;��v���q���U����W����|���gq����=n?�c�����#,��HX��8?�_=�������g�[��X��]�jM�pIz-������_=�������g�[��X��oI���B�?�@i#�o��/���_��?�����������]j�u����+��k���@Y��c�{^�|���gq����=n?�=��������1X��XY�0�G�O�4��}���u������<z�n�@2|x��~�X��kX���&�5��M9��
crlMbkVa7x,<���MbkX���&�5��MbkE�MbkX���&�5��MbkX���&�5��MbkX���&�5��MbkX�,�X���&�5��MbkX���&�5��MbkX���&�5��MbkX���&��>&�5��MbkX���&�5��MbkX���&�5��MbkX���&�5��M>l����&�5��MbkX���&�5��MbkX���&�5��MW����=���PN��H�U=X��Q1�&	��/0�7�@�2	���pq���8=i@�@����}��;��v���q���Zaj��6����%�x"v/�i[�o�7�x���	�#�4��>+��Z3|�e��>�����;vx������b����W��%�e�]E|	�,L�P�4��=U
������}��;��v���q�&��s���p5%��e����L��Q]	�q8�r��&���������{�����gn����0�(J/f�-K^9��xV��[�e����^9�mb��%�M3��H�,���
i�C������y �������5� 11��u������<z�E�����Y���G���R-;5�w����I^)S�x�qb�dX�����HV���`/���H�H��\�����>�����;vx����kGc{jb�/�$A+=I!q������%X�^]��^\�g��111F$�VyA����F �d����x��u������<z�D�
xO�9}��d����WkrB� ���1(���X	��@$�V���D���iY�5�����u������<z�E���b�A�X��n�Lt�v�$.�����������h��n��n+�Z/����pt���v�IJYg����H���w�������'�+����������������Q������e����s�x����� ���51����L�M�>�����;vx���������,r�2��E��u���K�OH%v��K=�Z7	l�MRf)J�i��,�",�����rD��9}�������g�[���OU��?b�/�-x�[YaMt�p�%������eGn��N���:S�
��L�M�u������<z�G��!0{69}WlX��O�j%�pAf)?%���Bk$�����-��N���_��?�������x�8�}��8<>B&����N�2-������]������ft�,��g��LTv���>�����;vx������N��1���/�,1�����Sx�����2�
1$t���s�kU��Fa�'������bMzMb"L�����w�������<P��	���������=h�=l0Ym���.Bk}��IIE�e�R-�n��$��&x��z��I-�Q����*���.�����;vx�������:�
������:���9{q/0�1�0�E8L�����6<b�KL"��H�E2��Y����/.�[#O�Q��f�����;vx�������4,}���|��2���m��% ��B�P��)�������o�ZqL��Y��������:2�N��������2�����(���w�������-E<v��_b�/�_>����Zkxr-+R��-�g����.�.(��-�8#��1�%bgw��Qi�1�����U��`xLm2cc��Q\��D����x�bG"���������i5�d�"���gn���,P��_�Z������W"��/�_=��;{-;��pv�8j�-9	4�����.��:*�����N�QCS(�HX��q�Jh�=�[������'J[I����b����M*�������
����?�������J��������IW<27c���RYIe%��RYIe%��RYIe%��RYIe%��RYIe%��RYIe%��RYIe$L��%��RYIe%��RYIe%��RYIe%��RYIe%��RYIe%��RYIe%��RS�rx������K),���\����K),����K),����K))h���V$����RYIe$���A�y�WA8J�0
{�2���N��e-\Eetqj�5U��e%%��4�f[{+F��uf�+w0��lFI��e%��RYIe%�����K),����K),����K),����K),����K),����K),�g�[��*5�-����_p�{�+�+�{2��+5�Z���u�qQ��OvXBa�c�Q ���T�h9/���jJp��BM^!Y������K�2��	���Pea�H��UUAfoS��*���m&��I�@Y��Y�b���������9}����JqH��D������3�����#MrC �p���G�q	���2�e� �&6��XMyl)�:MJ[8�������*��+5�[��������&������Q^\+��l�e�lW�����������[�e��~�������p��ft��$Tau�!Zv�k�� mBKZ5��naM4n����~J&����t��l��h[u���s����m�K�md��3��O��-�2�����z��9�Fz�+�nr�l��>������E��d�^� ���x�����_p�{��vgEV[���=?�D�$�%�[��5����.�P%���M���gZ$�n��e���Mj��5��4����Ag�E�U�*��g�����'��D�}��_����k�����Z�#[�[�R����S^��b+��^e
����5�I�x�����_p�{��!b��B��@���^\��yp�����+^�-�����y�I�@��B��	<@Ko��3,�2�&_�"D}E�x\K4���&�K���qe�L�P/c���n��-�)�D��������r����>�����:x#t�!t���odW���6o�M������@�����O:���J���hb���0Z��Y������M8�z,��q����|���gQ�]=h�=(y|+��[�E��<6X����W�
�[�[��kZu����o���	�������z��t���y������e��<z�z�/�_=�������:���W�B�������Z���v[�^`��cCz#/E�=n?�c��/���_��?����A�������9}���u������<z�z�/�_=�������g�[��X����}��;��v���q����|���gq����=n?�c��/���_��?��������r����>�����;vx�����_p�{�����gn�������p���w��������9}���u������<z�z�/�_=�������g�[��N�g��:BV�c���������W[��y]o+��u��������W[��y]o+��u��������W[��y]o+��u��������WEr�;��y]o+��u��������W[��y]o+��u��������W[��y]o+��u��������W[��y]o+��tW+��u��������W[��y]o+��u��������W[��y]o+��u��������W[��y]o+��u�������{��7�����W[��y]o+��u��������W[��y]o+��u��������W[��y]o+��u��������W[���W���������W[��y]o+��u��������W[��y]o+��u��������W[��y]
��x��������!vbZ`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i���L�-0Z`��i�zl��q���fF�F������7���!���s�����!���S�o8���!���a�^#'��!���������S��O
>��'/��y�����^z���5�
�}���y`�
������`������\�Y����Y����Y����Y�����^@�����,��q������_�U�Ivl�����D��n�n�L�6g���m���$�e����v��"m,RA���������Z��x�I~�()Ltf�Q�Uj=;1���&�����6���3�Oh4�k;iV�U��Y����Y����Y����Y����Y��1j���j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PV��AZ��j
��+PU���A��4Q!1A"2`aR P�#0Bq��3������?�$q�CO����I�I�!����6{�5�st	�s���D�X����x5��vc��d��D�S]We/�'3������L.���{$�,@���$<�����5vq�5�D�L�Od	O586+�M��'��FG�@�*=���k����Px������N��s�'p�~����=UE�H8;��,W8U��b��[*��Q/�atjnO����E��]I�\�����;�t����F���^�-�,oM����u
���A��T�<�Iud����G�T��A������u�SP���)�FOj�(�p�1�����HUI*�����Rvk��=6+H�L'l��0t�I������@RpU�P����!r���T�6�����H��uQ�*��-��Jz��8DD~0�aG�s"3�)�N��u9���):�� �xL*��q�cDp�(=�t��2)�;��H�$�h�������c$�����E�TOR�m�-��j�na=8K"�����A���fg���J0��t�O���]JD������y}�`��u�,[�H��U:���b
�U�����imU:���3����X��Rg%D�*�K��/����S	�/LL�s��a<tL_l���?*��\��Yb7u0~�X&��u'��������X�J|#E_�X�-�m�#Dn���X���E���
�N�Ia3g�6{����x^��,��O��u���a�X~UT�7A��{F��lN��K���HP�*e��E��S}�s��c?��C�;wX��l;)0�<�3��F����V�f��OX�^z��w�b���_���p��u86?���}���T6�
��*N��S}�N���b/Q�c�c�YxX��U����;*<�2��n�,i�a��
��*�]I�B{��O��7!1AQ"2`Ra�� #3BPq�0b��S�����?�$la������8�\��N�p[�o��x�BH@��L���D��C��#�\�LA��Y2*�����dv��������S�$}� ��M�^��A��tUJ�N�;}��W�j��{8����h�6
:'�q*��bY|#���� ����S�G~���A�;���oe���M-�*j���0$`�g�����#�o�Z
���X�S��70U��#d�Z�R�U����B,�\�Y��V)P�{S��}�Vq[��5n[�$�����&�Uk������XyJt76��CU:�,��Y�����D���]qT���k�pU���YO��,}�tT��Ac���,</
�\��5�	����+��N�IYO��1��{N���W�g��Gl���������Um<�^��P���������	��r��"�p�n[������}���v
��	+Ry�UC���v|�[���p
�h�uT�:7bk�������6�6��@`�54A5��d���y�Z?Ul�P-�s�Nii���U�qB=7E��py5(��z�X�g���E��l�)����M�^q2�����gER�U���)z��+#�F� �}��c����V�������m�lF�.R����AL�
����RW��P����r���[{�p�J�g5e�F�J����UT�sC���p0qV.��6)��M��H�R
T. �:*�����)���))+��S
eL��S��C��Z?Uh�U��V�����������[�<��C��V����5��� ����UFn"j�V��4��J�+���������+w�!!U�����5�tv
���SbBq�2T�U'UI�;U����\�Dx�[;5h3hUC�{�(z��Vm�+p�G��-���4���a$��X���Y�HV1;��J3<}�3�[�
�1����z(Dx��h��g��5hU�����N���A?��D2!1�"3@Qq 0Aa��#Br��Rp4Pb�`�$%Cc��Ss���?i-�PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP8����>�����~��3�}���������K��t	=���������6�{������1�AZ{l��@a����V9K��6������*L�^8�x�������X�od�|WX�d�q
%;}��2�n�t�&I��H���R��9����Nda�q�s ��=��'����.����N}/�*|{
ki�Mi�:�x/�,���7�WC�����=P�F���i�1m���$�_��L�1]k�;��bup��0Du��t8o���JhtN���GZfp<�����bu�����N���LRL�]q�#)�]g[c��V�.V��;�t�'4����)U�8�v
��C���M�b1�x'6%�a�.>�1L1�t��`S�ZZ�qN���&Df�00WTn
���b��pp����d��b�J������E��KG�.3OH&���AA�$|zCK�.RQ��Ba��ZC-�,<��� oS�bXl��Du�	�������
b:��*,;d7y(�F- �e���H��������.�#����Xl�d���~�������
�aZ]o\],BdKWj�9���q&SV���O��]o^I��An�����M���8�]|X���j/1���|(�e��E�a���$������l7Y�S��c������A�e7^��C�n��
�1$���3Gc��{�������uN���:%�p�V����BG�}zf���{�&�����%�2��:��1+JQl}W�%|_�}!D6o�i�oIDn�p7���z�x;�.}�x�P����q�����&rO,��"D�xME����H����qx`����L���I�!X{�\�)�[H���'}=�(~��]���Y��)�tp/3$'���<�L�P�Qk\]��Kg�6]2� i�3�Z?4����:|�Qbx����;�ZG5��`��'�=!D6o���b�<T^KI����9�E��
��e�Mi�]|7-Ql����J��?��h[e��"��1d�
�K�����v%m��y�#��Q�^1�OXd�MQ
�4��9�Y��l�	�������qPC����Py&�.���'�9h�RS,�<WY
%��&�_�����]�����	S
�������
Lh�4qS{*L�v��X-v��-����#�M��C��0��we�AYk@�6�Z�'��`�Rh�S�����
M�h��n`%I�Aj4	�vE�=����dZ��'����&�����XW��m�����@��F
�M3�D�&��
L$Hh�����F�����k�$�%��dZ>(��qD��O��V�@D��N*N
m`��,�&�<����S�4-4`��0��<���XxtM��4��J���B�E���_J$�kcr�h]��&6��qh$`��E��Rp�Sk(�H�H��m����>������.����cWCG�2��~�����4Y�t�	�v2@���&\�����qE�\;����3�[�gX9��L������a����x�2�Z)��!dJ�<Kq�����o���Q"����$e�����?��(}\��Q-_����L�DY,?�1�u����CO�*u�2DX1%t�{A��CP�>�e���Pm�M�H��|K��������i�`���b���Bk���<S�������nq�:���Jc5"�`&�%!�'�C�S��'�c�#6uh�.'����A��������	���}���v|&�
�w^��c��1I���
�4�|�������I��v�7�L\��/_�V�n)��Y�L�bG��el�j �|76���u���|z�����vT9���M��-����9��$�~����i�Je�S2<B?5�f�\�:/�Mm���qi8�Y���qs��2�3A���U��;�R(8��#���Y�(6gW��<d�o��9�a4d�4@Mm���/�3V�|���:���f�4�x�H�P��@�d��b���Fd��)���$%�!:��>(�.sg����d�|a&
�qi�O���|SZ�s���KO��Mq�S��FNsA��"�$��L�3 �����P����#��e+�W|� ��%0��'Pt�\<Bp������ZOY�WW|���?��3�}����L��zg�,B�t����Y�2L�Y4ul��jS85�Jf�d[u�I�#X&���N#�D�z.�� �GDm�`x��a��	�d@l	���<y�D%	��]wM�b��+a:��@��hAR@yl����>l�x�P���~le�#6eJ,@��A�||���hr�3���Y�����'�����v�npsZG��O�	��sMt`�|������
������mCt��
+�f�D���=���a������.]P�-�V������`����
�c6s�,�9��u}sm`�D���b��~k��[o	.��|�.�!b:���7`�X�s�k���@Z��C�����a��x��6 m�n�Kp(u�
�
���o|��0�Y��XdV�.�Em�
�8�s�@���Z0Mq�VLf�rC��5
�pp��M�(�D{D;��]oX���"a�:X�L�������OL����`3A��D�J�a��X�� �/��-B�e��+{+Z�q��?���5� iY�o�$�!��h�3Y������l�#M�i�������@����KB�"Yd1e��;.����� u�]f@��] �	IR3E�R������`�����s?�c�l���	������-}�+F3l~����3���&x��s��
&��@{�k^fxb��ZKmDs��*�-&l���r��XcmkY��������m�l�:\�`� ��<�OH
'���G�I���Lax��ZLGNl�|�Z(�%���p����	� �Yq��A1��D�`�^EB��������?�F"��zx��?�'�V2A�N���s��hb;���j6�J�j\�)U�B,��
����+��-�p������h���X�o�Q�����a�l�@.S�h��|4wFu���=i�(�~���sF$*Fj��h>;��+G�i�;��SCm��b��pse;����.�Z�p����
� �	l��&4r��E���{Ll�����w��H�o�S�h�>O1�
ZgV5��������
��j>�m3�,|�2����5l-.����YT���lBqf\��NL��f0ZO��M��Sd����&����
Xl�]h�rZA����Y� |�� ������OL���`�^?��|�<�?�/L��zg���;�h�;��{[���������3����#������dV1��&���]
�{[��`�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�9,���,���,���,���,���,���,���,���,���,���,���,���,���,���,Kd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vK���,���,���,���,���,���,���,���,���,���,���,���,���,���,����vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�vKd�9v^��B��W=�"�t���0S��q"Nr�~���������G-����;��?��[�}o=�r�[�=3��~���������G-����;��?��[�}o=�r�[�=3��~���������G-����;��?��[�}o=�r�[�=3��~���������G-����;��?��[�}o=�r�[�=3��~����N�������G-����;��?���E���mf����{�y�������������K�oL��U����:��;�y�����[�w��w�/������k���7�u:G���y�����[�w��w�1���X�Od������.]\k���ro=�����}n����?S�����u7�t�p�N���;�y�����[�w��w�/���<nM���0;�y�����[�w��w�/��l!��P=���O��[���{�y���������������F?1�Ng�#���)�������G-����;��?��1u�����=����'T�������G-����;����w�j��WA`��|��'�2�,�������\�������G-����;�p��H����l0�D���Z��b�qh�Q�Oj�:K���q]S�{;���[�}����L�4w��9�Cfx��hf��
Lk�������f��k��f��j�����L��f��k��$����<�X�5��`3X�5��`3X�5��`3M�c�`3X�5��`3X�5��`3X�5��`3X�5��`3X�5��`3X�5��`3X�5���<V5��`3X�5��`3X�5��`3X�5��`3X�5��`3X�5��`3X�5��`3X��f��k��f��k��f��k��f��k��f��k��f��k��f��k��f��5��`3X�5��`3X�5��`3X�5��`3X�5��`3X�5��`3X�/L��p`�+�������u\�1k����mhu��,d6�h�Z;�d��U���^�U���B�I�������9�������G-����;/l�8H�tFy�(�t`�0\���%CrW�nJl.a�Z�A��<"�0�f����OJ��������[�}����L����9xc/�;}kL'��t_�����m�>J�"�Yx0����)���S����X��T�w�7���{����|zgfpc2�s�L].12����f�����H�;���������U�j?������xt^$x������j�{m�����9o����1#��[��E�4m���gg���~����f����1��Zw%�!��U������1�89|hv���WtM�9^��Z��s��`*l.a�+R5��_
����w+���vJ����M�c|o=�r�[�=3���d�<��[�8��Vm����?��S#�/����
�@a��]��`S���y��ZZ���zpZ��k�|�2��,:����:���i
�x�)�����G-����;.�
sO�n^�Bv�����}������OG�J��0��Si��k2�!T��o�]���{|���-G��>K�Ky�I�aOG�w�*Q������{����|zge��x+&��D���?����0�h�,<���)�������^�T�~�7���%���M����d�/��c����-�Z��y�����������=���i�Xv��b>�C��o.�E���{�5j�7)i�pZ����[��IW�/[w�H��R��6���;���^Z�+q��ad�)�����M�76��G-����;&$JGu��G�=�����/���W��[�����|V������7�=���S�^}6���!X�G�����[�}����L�����|��t�mk�L��>�E���w)�Wq���u#�x���-7Q�B�a��
�Z���_��j}hw5s�
f^<����+%�<��h��*ZD)y���{���G-����;/au�\FF��P���]y�s��G�;��~��D���(��|��p=���/Z�-^k^���W�j���&�W.�H\J��w����[�w��v_�"�c����Do�X�t_��'v�M�a�Z����������}��j:c�Rx�T�'6����M�;���G-����;1I��Lt:3�\eJ3CC}����/��^�r_1�W��hqjm�y������KV�m�@2�R��J�H�=�y����������t �7[�������� )1�����~����ZhS��W�)Dc�Uy������F��d+���O���r����e_��#sW�{����|zge�+�1h��dF����E���w����M_
��}����������p���5ww��j<����`�+��@��������~<����+��rZ�^������x����L���#:�i�)�Z8���������E���w���u���sV�DA����K�_6KP�Z�j����V���!+�R�x��3Q�Z�#z�q��
�rW=�����v��h��g�����[�w��v[������B�:��kV:�����~��������F���W�.���ph����h�s���[��p����,�������Z�i�%��|�,NK����|[�~�p��r��?S���������}n��������e�l�^j�����~�E���w���$�5��!p��|���<��7�5�f�,�W����V�@<�>#���oW�5L+��P��#%��`���,������X�-f��[��e�<����&�R���)Dk�V��R���Gr�G[���^
����L���L�YY�V����3�>�(L��V�.s�������$�_��'}o=���s�qR�����jJ�x-Ff��.K��v/]r�p>�Qa8�+���cj4G<���KX�h����[���y���-m���'�j�����9����+�=j�x*�"�(���>�*��Z���(�0�����w��vb3Id-V�s`g�k�h��f��mK�G}��q"M�<�����U{*��^��eW���U���U{*��^��eW���U���U{*��^��eW���U���U{*��^���*�eW���U���U{*��^��eW���U���U{*��^��eW���U���U{*��^��eW���u�t�f!��|Uj�eW���U��;�*��^��eW���U���U{*��^��eW��
�r�p���;W��Q�y*��^��e{���o,w����P@�*�;V� �w�j�
�O��!����U���1�N	����|���W��-�_	�J�am��1R�k�x��s����&��U{*��^��eW���eW���U���U{*��^��eW���U���U{*��^��eW���U���U{*��/L���^��5��<���?��[�}m�z����X���c���G+�AsB�x�d��r�/�y_
�r��z�c�j���]
�)Y���%�c9��
������5�W�����k���������K\x����
���\���zA��f��J#��^#����;��?��[�}o>�2>K������|���.V�������j��q<
�}��M�k���r��^��_6k����
�uu��Z���y�T1�Q�9����j�5D�/�5S����R�3��m^��Z�C�����E�/�|�_K^���>{��;��?��[�}o>�������W�������Z�'��v����[s[F����\���=���j�I���oW�\���G�[p��_��]��tp��Z�D�-x�r��]h}�������g�Vc��r�L�o]�u���7��e���V��R�
�+]�X����!��$����Z�'���Oe�������������xW�*=�f��W�����{_�|H����am����� A
��
��\��+dV���Z�!c���Adq*��[E��Ap�����
��D-�*��7q_+���j�x+R=�kZ%�����Z�+��m#����Q�~K��U����h���3��~���������D�7-�U2�����U�V�tG�M ��,z��+�w-hO
�C���[@�sO�`�\B�H*�e~�����W���+�f���.X�8Cr[6d�M�LC��w�/������{���^���l��������c�����|��'�x���]���}��^�Z�!\��H5��U�����[5�[2��j���
B}��w�/������{��������P�9����c</���
k�z����_
�]	��Wh�]*X�Z��a9�����*��f�j������W�Z�%S�zg��G�;�y�����[�{������`sWZu�����k��+�r������K�A�s>]��w�/������{����w�v^����Q�N��{�y�������������������9o������Q�N��{�y�������������������9o������Q�N��{�y�������������������9o������Q�N��{�y�������������������9o������Q�N��{�y�������������������9o���������v�i����.�bY�Z3�CZo<���-�/P[x^����Am�z�������o���-�/P[x^����Am�z�������o���-�/P[x^����Am�z�������o���-�/P[x^����A7�������o���-�/P[x^����Am�z�������o���-�/P[x^����Am�z�������o���-�/P[x^����Am�z�������o���-�/PM����Am�z�������o���-�/P[x^����Am�z�������o���-�/P[x^����Am�z�������o���-�/P[x^����Am�z�������o����Am�z�������o���-�/P[x^����Am�z�������o���-�/P[x^����Am�z�������o���-�/P[x^����Am�z�������o�~<?P[x^����Am�z�������o���-�/P[x^����Am�z�������o���-�/P[x^����Am�z�������o�
����zgz�&MKl��>,����@�W�����*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*F]��w������$�$^�b��8O{�a�#���_�D���B��Xp���+'{���n��\����^�H��j4���%d�ln��7����������P���-����H��f<����*��l,�Y;��;�'GxwX\��SP�����k����u3�9��a�����>iL7�F���E�[������������z�e�_s��V�4F��}R���d�n�dC��e���'Bt;0���+Li�~)25��3�3m�a��3�}����L��zg�:E�}���n_�����u�3��F��g%����|�l�(����meN��������������/5$���������!������3Fl6�Uu�'�����e���V[h�xc%����r�����(�
��ZDHl�b��st��
t0�Q||�\�����3�A�3�6��Rx^~	�tH ����w��t��d�������0�x�,3��/l�y&�q��(������:w�f��{�X��J��<V�m���j~$����}SL�������F��Z,+Bp^�9-&�8�qt���������c�l+V���zg���?g���>�������T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U�C5P�T3U����C��,!1@AQ�aq�� ���0Pp���`��?!Zv���3333333333333333333333333333333333333333333333333333333333333333333333333333331i�*3m�?�6���cm�?�6���cm�m�������"��V^�=Rj9��3�����EF"s��H5�IJ���	���dD�����r�p�\�"@���RL�Y�nck�%?�M��:
�e����)���'������8�I����H\���i&�
"�+P���0��7�'z�I
�qK���~E��ZuIs_�<�D�v���y�A?�m��??��.�Kgr�p��n�t���-�<ud^
��>�,��u��S�J�)�.�Z1nz�sGV3X��w��Q���dH��+A!���v�����*B��WB6�Y�U1m'YiQ��fm,UJ�G�pj&�YY.�qgU=�YP:�thK0�|�r�&l�{7�5
�%��BnP��%\��/����6vN7)F
Vc_�e^.����L�C(�^�XD8yu>�,��U��(;��3bnd��f�����(v��!�2z�������x�)q	f�}lUI	�
�J�K�Pi�e�r
�A�e0�AFW:�BaR���Kk2r�KW�@���U��f��D� ���r���z�1���@�zE�A�T#�R��4�D�*��-���5&���o:`g4�9�v����Q���\)N�`�i�]�V�B�z>��8t4����v����������6j!R����iV_�U�z��e����o�li�BVV��m�H*B�{SS�S-�����4�"��v=G_HE�����O8g�������I�H5c0>��Ju'P��I{����b(�4ivm�]���7�l�Gy���~�����=�c 2I�R1����p^�s,d���c��9� ���/spPf��������Y�+8��9�O�}E�D���,X��@.�G������Id��F������|�@]�2�^B%8�W��z��`�Q��!����R�m�]p����]����"��L���Z�$b�e�{:��v���$*�9��)/*K!U;O�X��/J2W9�f�M).�6���%b4�j������
G$���z�3# �"I�P�G@��l����*�}@+d�7+��DK�"C��-#�QADY!�9y��ar�VI�B���AE�z�����Q^1��D�wDD��b�J��3&�v��4��DS5A�LB�	Q"��5aFK)��et�B(��J�.nW>�*"ir�	.�8W�7T<^J�h���VT�,��@+d�<�z�F��E��J�j��������j����c��E�XC�L�dB�����XdQ�L��h�=ic�)��I(TH� �>�9�f���,�����uJ�.u��Dm�D�B������*���h�� ��MXC��wL�����o�����[i]�T�I�fA]�`�4�B�AD���*bj6����!�����2�R��h����XJ��i��*n%����n�&���B�$���	�z�&��	M�m+��6�$�	���W��WpJ�*bI�TL�6!�J���B��J�����B&W��L���xJy���m+�
�r!Tk��WpO	Bi���lm�V�Bq
�(���bR���C9��
������U�GP3�I��5�6%
�+��e�M����m��f�N���Q���!7S+u36��	PhL����RR�F�E�+���%|�4�a)7���LI7C����B2��e*'��H����NT���%��u �&�&\D�X��1��B�����d)��\���Um�qK�G��%�b$,�R3������$�����w-����"���ME�$Mg����8(9G"7��hM$��w(;r��P�JR�$H���8�j#zT��~������%J��H������b�_�h;�R){P�+���"����
K:�����?�Y7+�{cm�����7v8s*�]D�������e0��r�.cX��m�uj>�a�5��a�dS}f[*3���YL�C�<Q!�}5tf&#M�`�7G�2Uc�\��~�Y����&Q�TV`�"���
x8�V	9�j��(B�D~���H�4��"�j�S�
-5:�D����$�D�YU�6QTx2�\Q6Y�!%T�5fn���")�a����\&�"R�(�����+�-���9iB������5FT� _�fw�d��	cv�Tgi�����6��^�Nch���F��3!
�����q���r���E��cjJ3��T���7/���������������~��xM$�#4�g6�d��6�Y�]J����R�����������LC�q��g������`���=�K���:%��t;#G���'��r���4'(>���9�\*,�.W�n�kfk��>i���28�K��-��9�=���ryu�o���d�������M��5�B���#��BZ.����	]���dh9���WnE<�)�[�H�M
sw���b�]_VZ�����*���'~������(�������2�[A1C�)�lrq�.��������,�SV_�T�G�.9����B�xf��D��6xczi]�	S~��y��Md��O:%QO��CyYk�R{�|.r�>��B}tr-��V-��\����T�#7�*��S]��6}�PV{�G��yC�����~��y�T�����4[M�MWddx�d�gvwp�)�����Y�+���Uf �G�
����Z�8��]D�r-���M��#��H���XQ$�%����<]F���Y���V�[�'6s��A()8��DC�JZ���"0�I����Q�"���"�Z�j�� �E�Xe��t�t�K�j��BT���..I]���NJ����!]]s��i***��[X9%bh�]�����"\���H�j��{�r
U�ZU�r$(�y�H�Q��=R�w�u}vSQ��T�hUS&zE�b�z��N�2���J'j�)SZ��Lj�Z��(H������L���'��v2U['5���V&�S��S���k#��NV��I�!�+@<�F�\5�����,���WQ0F��O���v�|�������P*�n�&<�,�!����n�W,�5��(��P}
��Gfy���2�HJP�����[cm�����-&��	%e-IB���b�.�U����3 �3R�A$��J-a��5<RJ��)��
f+����N��)���jUK
&���IYp���
f+�f��V��'tA	�n)$��������������~K���uY�JL����#�6��Iah�?r����{�m.�mHMq���������������\�k33333333333331��7ffffffffffffffBb�5��������������	��vffffffffffb��N�o��u�1�����������_%�8g}�v5���s�6���r���wlo��m���w���c]��1�cm����,m��v���f��~�g}�v5���s�6���r���wlo��m���w���c]��1�cm����,m��v���f��`�4������6�k�c~�3lm�#�����F]���M���cn���7�c6��2����nWDe�
��������cn���7�c6��1�%OGG8|5J!u<u$��������c]��1�cm����f1�������$�f��(P�t�'��/�&�S��=�,m��v���f��~w�iF���e��-aY�x�����z`{�X�����������}�����C���YD����cn���7�c6��1�z��U_E�He���X��6�k�c~�3lm��������+�����B�)�_�����������l(�F9��^�*R�6�H3J�����cn���7�c6����e�wZ?���L����� h����p�y�s�zS��?7}�v5���s�6������b�kGXY�<@��+���Ro4�5)���(j����Ju9X�y���r���wlo��m���������{k5�K�T����!Bm�LF��d�W�B-J�;
��'�!B�!F��cD!B�!B�!B�!��4B�!B�!B�!B��!B�!B�!B�!F����B�!B�!B�Nu���oK"MW�0��p���SoNI�%3����^�Jk$*�k���/�s|�$�V&�y?SR���5�T���Y�9��}�v5���s�6���]cQ��o���R�u�v��_���>��>/'��S���VRc��j��	-(i15)��g�M"i������������oO��9g8�v�$�)=��{��R4�c��K's���NU=%4u�$���.`z�yW�n��6�k�c~�3lm�9$�~U��W�W������{9%�2��1u���R^>�����Y�g�c)�<�On�(�R�s���cn���7�c6�����b�K�7��iG5����������a�
bF�����sH+4��[JDL��W	SE��(V��\<}I
�`CM��X�37���I��q�:���X������������Z%��gBr���~a�$��_T�&���!Ah��4�^��z��I{�u%{d��j�3O�3r�4�Q�������*����R}	����������5��������oJa*i���'!QR�sE���$|#y ��O�o=�4�4V4���3��MfY���G,f��(���&����}��"���tD��t/�zg��������oL�Ed����>Jx1�����x'AE��/W��~Q�Lk�1����]q��lKy��n�����u+K�����3���.Q���k�c~�3lm�,X�au�Q��\mec�H�b�4+���&���9�j����'����7Y2S����U�`3��-OsF��YG��5�*�e#z~k]����wc]��1�cm�z�C0��b"D����uNd�SQ����zg��"�(���5��g���j�L~�L��C�0��-C�l���f�7c]��1�cm�W]���;�*�4�b�5*�hI:K��;�r�./�}�>����6t&�������8�t(DyR\���������M3��c]��1�cm�X ��S�6j
%��4b
M��.���
������~$$��rJ(��|�4li�SE(��q�D/�Yje���c]��1�cm�iN�[2�)���&�gZ,����~9���������WBS���&WV����u�.���7�c6����*�����
���b�W�HN�8���C�l[Z��[��R��&��U���bS�
(F�'��]�t)�5Te;������7�c6���|��wZ���}�f�!#��'u.�**@u6���D �k����i�9�v�u3�g�[�:��)!�m��`Y��h�^���v5���s�6�����5�!+b��~�g}����G�r�a����]4w7�aM��"D�Mr�wz�EzfM��gO7:�s������s��\�hUt�8�OUI�����vs����s�6�������]z��p!Il�6������~�z���[�t2���-s���?9Z�w�0�>���i��F;���f�(T,W����GX�&u#�4[�B�?r�5�EX�v���f��zZ�������by'��;�_�	�|X������NT��*������6����C����?��+��wN��+��
�H��jm�!Q�������zfM���=�)W�����s�6��x�S	�RL������g}���6�y����'�U��9��3�g`�YM��
�o)r���Xr����t$L�\�V<C��Q�������X��^M��^�TB����R����m)��ePS��}��[lR]����WVg���Fr�j�������s�6��f��6r�yf
�������^Q0H����b���	�X�z�C$�Se��9SQ���m����������U9{��Z��_[T;�M�C�sB�����XI��F��%�����Ji���Mo�5WP��e�4�X��i3�C
�=����B&�k�1�cm���F���T�)�}r>b�f��
��tF��Kl�/J���;(vP���C��e��;(vP���C��e��;(vP���C��e��;(vP���vP���C��e��;(vP���C��e��;(vP���C��e��;(vP���CC�����$	�T���C��e�����C��e��;(vP���C��e�����3��p�Bjz�T���C��2D�h{:J
��,�!gt�E�|��-��q|���
��h'�KT���Nr��6B�����yh
�k����,���3���.����jT��H���C��e��5j��;(vP���C��e��;(vP���C��e��;(vP���C��[��-�������D�i
~�3���b_D�
�xe����d�����w]$���b4t���<�kH��U���f5�CB��c�����S��z:��8�[�o����ZGS�,3����t��U4��1���FB��l�V��#������p����7��<�
Q�1�cm����,m���U*O����%�B��,y�$y����k��eo�u��[���dC�D������pO��j�5��V�t��d66m]y������3�����g;J=K!I��4�����Cgd<�
�S/z�R����?3�����7����i�m���w���~V�>��grm��>�a���U��A�R����}�v�:G�����$����
�%���a%�tD�(>�3�!����u�Q}�*3v����`:MpW��p�����������g\b��D#({�
�E�+���HR�;cm����,m�5,!�g���9�r�,�=�
�C/�G�-
t�����N�#�D�H�g&r,�3��HQb�O������>�����:�����
A�I��fG��2Bj
�Ylt��s}�d����
��y8B`a���|�����#�F�=�|~e�r_#��c���^����`���6�j��.�����]�<��lS���F�����e��Dub���ee�}����@J��W���V?�#Jf�DNE�R��I-�F��/���/G� �C}�!�;�K�L$�,�������w���c]��\�T\�����-]?�Br�1>b?@������ �g����G���	�4�Nd��H�i&�.z�F�A���xrN
�>����q����6���r���wl-��?��+�cm��?�_b"���A�i�(��� Ep�	.}���������l�����aOJ,y#F��Yr��=�Lu�Z���=��$�zv����;�X����������jf�UN��+5o!�\�ZH�����2;N��{5!�L�>���~�g}�v5���s�t�Rjt�����w���c]��1�cm����,m��v���f��~�g}�v5���s�6���r���wlo��m���w���c]��1�cm����,m��v���f��~�g}�v5���s�6���r���wlo��m���w���c]��1�cm����,m��v���f��~Y�2�*���3��RH6BU�z����������������������vX����������������������1������������������������������������������������Z�{�������������������"�������
��)�-�i��Y
M<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`���<`��1)mg�m���L��O�M$u����B]���C����9:
���Rh]i+�dotQ,��Ld�I�C1z�_6h��3z�-����rP��<[a���B�	ar�Kq�L�t1��6��Ink��o)�b��X��2-�Xn������	��)�
�T��E����).��Z�
K�4�U��I��8�YIW<\�#i�t�L�����Z�cum\^�������������:`�"F��}m�K����6���|�Z��eF_��^}(U.���#M�,���)u�z���i�Y!��&��L#��";
�Pi\+�an�
.e[sY��7Z4iA'I�A4� Og���o�r���6�1MA�r�
��?�����I/z
�����3��)����"���(�X���z���Y�T1��D�!Q\�5��)D��Q����<���\���lm������lm������l(Pq��s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9�s��9B�����>���s�<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��,��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��4��<��<��0��<�M4��<��<��8��8��<��<��<��<��<��<��<��<��<��<��,c�� ��<���C��4��0��A<Q�<Q�(���<��<��<��<��<��<��<��<p�2�0�������<��<��<2�3�,r�<3���<��<��<��<��<��<��<��<��<�� ����<���� ��"$q@ �� �<��<��<��<��<��<��<��<��<��<��<��1�������<��<����<q���<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<���1���Y�S�<��p��M(C�a�(���<��<��<��<��<��<��<��<��<��<��3�<������<��<2�,s�<����s�<��<��<��<��<��<��4��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��$0�0�0�0�0�0�0�`�0�0�0�$0�0�0�1�0�0�3�<��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��<�_<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��<�T<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��=3���<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��.s���|��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��<��>��|��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��>��X��t��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��8� _��0�0�0�0�0�0�0�0��0�0�0�L0�0�0�O<��4��v��?��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��=��/��j�
<��<��<��<��<��<��<��<����<��<��<��<��<��<��<����<�����uXf�dx��<��<��<��<��<��<����<��<��<��<��<��<��<��<��<��=c�����q�������<��<��<��<��<����<��<��<��<��<��<��<����<��<�����
����K0��<��<��<��<��<����<��<��<��<��<��<��<����<��<��<t�=��?w��{]<��<��<��<��<����<��<��<��<��<��<��<��<��<��<��<��
����<�z���<��<��<��<����<��<��<��<��<��<��<��,��<��<��<��<��Hm����z\C\���<��<����<��<��<��<��<��<��<����<��<��<��<��<��}o���w.$C3=|���<����<��<��<��<��<��<��<����4��<��<��<��<��<��M��)���1��JTe���\t��<��<��<��<��<��<��<��0�0�0�0�0�0�0�n���0��0�%�!o}w�A�0�0�3�<��<��<��<��<��<��<��<��<��<��,���_�tKO;�<��=�xE)��]�q�O<��<��<��<��<��<��<��<��<��<��<��<��������W����A�M������Pco<��<��<��<��<��<��<��<��<��<��<��<��<����<��o�?�������,��I�<��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<����-r����<��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��0@ �<��<��,��<��<��<��<��<��<��<!O<��<��<����<��<��<�M<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��4��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��2�@<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<c0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�$��,!1AQaq����`���� P0�����?�R?W��B��8b@)����>��M���0���dL��j��,l���-}���V������ ���Mr��w�lL�e"��2���r��3>���f����/D�#���i�������G)w�p�-.)L���+�A�"4��z�o<�#	�t��x��<JN������+E>�h��qij��%z�2�����K���!���sP�9r|����d0v���7�h�m>I����)&���Y���4����7��w�v��3I���w�.����Of`��w�r�?��z~����3G�Je�*���[��%��Y��������c�Z3`�x��vb�*7n{u���z�d?�X���j�&�p�P��2�[Az������g����x���8t�����D���A���������'��+���R	����\�r����t<J%�)��pG�LG9���1�&�g33�^�o�D�l��f+�CS����S�15{��-��l�Vs}L�a�|M'�c0lz��ycj�?�+U���'�OyG�9=���6%�C��F�r>���9B������gR��x@d}��I*��'�G3�'D�f�������~�U��]2�
?X��`��lm�l�����n�8�d�}�j�����D�:E4��6x�o�Z�6x�q,�q������G:�AA��p�>a�5�>%.����
����3Vie�oYvV���8����o�I���+��(�(�1?�uh�3���z@�NLc��-��<���x>f���]��'p���V{������|Ms�|�!�x	��b��C���W%�|K����Jh����t�9#�S�K�%[H����T��o��M��(�yJs����r�2�K�a�����s)�0Fa��"���VG�������s��T�+sgG����?�m�O	n]���{~&�<,�W��,\��[���c����2yL�n'�7M���J�f��&���3^!���	�t�h�72�a��(j2�Qk��5�Q���K�*	���
3�4
q�Ly�e�8�*����:���M\g�c^L����������]F�f��������9��\%�\�%��&!��|x�2)��9��O�+��a��Q���})6���C19B�M����Ku��`
���n=_0w=�g'C3(�<�����"nS`W	c%6���Nk�����,!1QAaq����`���� 0P�����?��;�o0,?�,
�"Bo}�F����`\�
����r�{�&o���)�;��F��&O�s��2{,(#(�������m��6��a/7��#����k����k�g-Ni���~�x=��[)�Sh�JX�Vm,~!�S���i/
���(K"YQ&/d7XJ�L:=��q&qSK{��.�^+�'��Z�%�9��*!L���3����{[PE�jm�:A)f��'����[ ���M�p7�� ��������l
�����bS�U<Fl\@�k;D�7�:�d:�777�����=���2�.����+���?�QO��I����5S�5!�.�?3"��'S.d�n�rnP�r�Pb�w��i]��5�51=Unn����CG���lq���h86���V�I������[�K����O|Kc��EB��n�3}u��qF7����-���Y17"D����V�3m81�������c�T&�������C��	�i���)����`v�9������l�<?K�n���Q�7�c���gi�'�&]��:������0V<�%9����j���}s����];�g�n��>�Z3~�(�@��H6'o<w�T�����z��0�Ya��F[�dN8��D�}f������?0J�09���C���	������si����G;GW�6���0����T_�P?�K4G�M�v����E��7�6�7�{����N��6C��f�s&�c��_�����E+8�'`�=���odus�Kf�\/��/I+Y(����`�[� ��)�.d�2������������1���=_3jG�I�3��Y�y��L�K��D-��J�\,�
/�����~���v�;����=���n���+)�3QM���]���2��Yc>�'R�q���r`r���dz
�����fI��`[}Xm���oo��#��K�g/�]|[aMP�P�,������8����b��+�M��i���2�������n�fj������
���g1��GS��xV{��.�{Bu�3T
������c�Q����C)�O�J�t����Q�#�-�x���>fl��&-����?X�2=�D���f�:�|$��+�l^�uQz��p&-[�3��>��tg����:Y��m��|�c��>�
K����B����Xd������+��fz����p'��'��,!1�AQa���@q����� 0Pp`��?�^�q����;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=grz������;��w'��OY����=e���$����/ix�����4�_�K��^/�?��M/���z���Z���\l����R?�R�L}�����f{=?�J������p���.*��2��1c��P�]�N���c��q;������7���5S�]xr��0��M^����������R���_awb�+����=#��2JWIt�r�&�SD�r����P�=��D�[�n0,o��3��Al6�Gyt����c�t��v��a�1�~o�`�����]��_��ix��wT5���^�
XY��.���+��7�@�&�_�n�F���QF�49���dD�n�?�ix�K������� ��r����v1@{EiP�z$W���VV�tV��$&�
`������1t_��2(��_��`Y�Z���K��ll��#��2xfz���/wyC��[�M��Sn{�P
��\%�Y4Tak�8��������d��\O�����]>yB8H
�o�����/�������A��iU��7��{1A�u��fgU���\)�nP�B��r4��k�e��8a�����V��dW�����r�Q�Y���������!����^�`��2��
�Q���%���&1*JE(��_-��Qb�.hJ���Y,�oq!�XP��S"���������>a;��\���-9{�������`�r%SB*u���	��vyTt'l��?����%��(�����,���*�Ixd��8��s��f		�>�\<�����e����+���ur��;#�pluV�>��d���
���0�F���p�`(�d!^�AU�����,
4=^��6S8l���r�k
�{�hj�-q�,.#x����j>�-!^aYq�YF���L=I�<���j�]o���q�`}��:,�e��@�����,�#d���.���}�{��������7�a�@k����/�,�2)9��+X���g�D*����\=j4�^7K��^/��p�t6��<F\��oU�o�[�OV,/�XA����4#��O�I���4��{�s��������A��Lt�%I�x�����/��1�U�gt���3���{��O���<����#U���Bt7��g��F9�r�&������[R�C:��J�A��6�h^??]��.0
Y�����q8Z�\!Z�P�93�~���_������h���7���X|"qJ0�u������7��;*�<�P�+�N/��xtj��F|,��Z�m���^�����eq���[W��w?�/�qF�_o�!���Na�|e[�lNAG�>��y���u��#q>����EA��L{��R�>>""�8y�����6\}`��c};+����WE�=yh�[��P�A
����&-��X>LN�F�@��Qm�6�����K���tM�|����>W�a:�z����Z��!=���p��J��D[�:'��El���S�K��b��������#����{�A~��>�����Ep
��yc�
.<K��m<�����>�;\�#�����[�R���W���&����B�e;�Q�n*����W=8�y`LBp!x�O(�M����2�|��R3��j*�_����A�� "��
��5yF�N!��@�����Ut:Y�1��X8>���5�qU�Q��P�
�����^vA'-�:xG��	{�v�@�9���-���r�����YD��l�
��PK������o����H�AU���p�~���@#�g/��q6������8��eZ��a�8�6L�yxa��d���)E��6�[�'TS��H��1���KJ����������J��2��� /|@Gt����u��((��w�`�q0�C�����=e���m�B|T���#������6^�(��S�eW���b���qxa������1�0K�L���q�`�0�Xj�y��c	,,qS�X���{3��
�*"���Nf3����P���6��o�
�lAq�f^�
�h]f��(\�6�����=��L�J���fCv��%���R���QL�b<�Dwx������L-���(Q�x�/ix�����4�_�y ^�)MV�U�� ��*�;�#2r��K8LM6v�X1���p^3$����EP���a�(�o�-	�b�l�	G`\J�����q`��e�vV���F$�q�Q��lM�T�]*{�Z���{	v���(R�P�x2������`�h����6�9�
��|�h
�K?�l�F&9c�P�B�Vv\Fd<�V
�x@Bo �X����ffA�(��{����"@�v,P�	�
�K"0�mX�i����P�T��T�.���1��`X"X����G�E��PV%�K�d����bc�e���bfn�ZP���^��4�_�gy���� t��Y�A��
�`�~�:������@6�J����������JKMm
nUZ�m�q���]��=:Z-�^�:�����&w�i(F���qTb�Y�T	�
��)���j�Vn��5����������2Y�p���29��W���f�Q)"4�m�F��k��,HS��q�dK�F�8ZV����4�X���`�I�Q��B8� 3-���3}v7���
��%�R(��E���P�H*�L<���(o���4
�����)l�����y����`(�����1W�n�X��M�3�Z�s+�0����i�~��~��zO0��� �v�tu�l���!�"[��+��n��i�H5��/����\��.�F���p�7�	x{���d��Y3,Ic��4o�Dr���.���!�vt��Q��+�8G��h��&S"�� ���o�����W��Ym�	q/AN��*�Pi�r�:��5���/ix���YR ����q;�<��T����>�0"�	��2�Mnw��&�a�$��5��k����������A�7�e>��X@-�YC�n�`������KK!i
�D��R#,�`�����%G��!����(%EC	��p����[G�`���[b��[�a�����+�[��h���w@����L��]eu���SYn��P�p)������w�T��y0���e��������x2*l0�(
�)�
e7;���L}a�����;q�f6���B]��aXK_/(�_�/�!JC
J�^���q���88��,Z�jgQr�S��i.{M���%7�"��J� ���o6a-cw��9
`#o�`��O1z<��9�\<�,��1M�&: 
IeZ������c��*����1��Zq��4�ks-l�cV[*m�37�UA^#�-���w�����0�i
�>�����z^$����/ix�����4�_�K��^/�.���+o��E�C6�LZV!K���x��F1��Sf�#��11�5���a���+#x��k���FM��z-��%q0[p�x?J���z��*!��.���|m�;T���Z�
B�ci�p���l�k��v��/��_�FB�7��YE]�;%��
�Wd-0�dx��(!���fn��VR�e+a�������8��%�����T$���l���l����\�S$j�:�H��~����([�/Y��`�
`��c���N�;�,��5����m��DX&Q�+����>����Up*������<B6���+���eV���"!l����b3���{��kAUGz5G��
�0�%zL�ZYGuS�35v�s�^�������������-{�*�5��;���*q��6'��a�l��\^sG+z�_D|El���Ks%y�%����\�����"�3Y�����DG$����7X�tq�~�C8����X����1LLG>R.�����]���\0m��I�Q��Ft� >P6n�D�3�m��!�r�']�w���R�7���}�"FrggE��}�a�&��HehYZ��p[
�X�L��7�-q�c��}���gPV�*08����
�(��`�3[=�
�l����z��,U���,����4�_�F���gk�����j[�?3~��,� ���k��H�$�yKC,���K
U ��.��P������:�
6��*\VIj�����tz�����cM���o������,i�cn�����Va���b�#UMV�����
.6<���W�n�e���,G`)N<�&KJ7CF�w��Q���a\��U�2��w�5.>�\H5�W�4�������S��R@S,Z��M57mb8"�i���e��W.�	{.a��\��fk�+:���bc�������y�����N��v��N
=��*W�jTU��Sj��*��Z@d�U���U���;����u�X�����������������)�_I\1*P�7�p�A�@>Vz��K���F#�7�:��m��bUc�
���[go���UE��:��f
�bV���k�@���J�����Y
��(@�����P��"�\=�0F��O� �(��8�6��>�P�����#�CPV�Kqq�W���Z�-��op$�"[f\�]�"���+�c=QJ�����L�D�R��
���P,�x�N�+[�C�g����fb;���6�Mb`oeC��#{q���2%B4��_�8�m��)�����������	bMc����"
@�A�<��^xaq{5�	X6e�9A��TM�
�_���I������� �CpW�J	�%��C�S)Neg ?����`��bX��D-��X ����JA7E�
d�_�	HV��@m�����P��`A(@;�U��--� �X�k0����t���g)��D�k)��*����G1�
����(���-]����*��s`*�yE�L�G8���Y��Ee)D7A��h�����M/���&�����x�K��L�=~B�]�����V�6!��:^$���������f�E��XT1��
�nqM�3���j:��-ahz)�e?l�������S��~�O�)�e?l�������S��~�O�)�e?l�������S��~�O�)�e?l�����p"�-c)�e?l�������S��~�O�)�e?l�������S��~�O�)�e?l�������S��~�O�)�e?l��������Z������S��~�O�)�e?l�������S��~�O�)�e?l�������S��~�O�)�e?l�������S��~��V�[)�e?l�������S��~�O�)�e?l�������S��~�O�)�e?l�������S��~�O�)�e?l�����0��[O�)�e?l�������S��~�O�)�e?l�������S��~�O�)�e?l����������@]/ix��/����Wy��u7�(�9/����0I��~+������_��4�I������������y�~/���^$���D�qx���|n�����x�/ix��"i8�o�}>7A�x���<f��4�_��4�^7�����<o���3K��^/���N/�_O��w�7��O��M/�dM'������;��~����&���2&����W��t����S�ix�K��Q�����^7�����<o���3K��^/���`�{�\.�M����rJv�6��#I��~+������_��4�I����;��@�%���/C��2�Td�������qx���|n�����x�/ix�&<%l&/Nk{�0��
\,�KG��%J	�>+���dl�������i8�o�}>7A�x���<f��4�_���6���?���[�K)���f����@P%��n�)�Ve7<8l��L�<����W��t����S�ix�K��sc0f0_<�����h��n�P�l�v���Ow�����Y����'������;��~����&����_�{���K<����zBSktz���~I��~+������_��4�I���h��9�W��7���a��Qpc��Wj�����qx���|n�����x�/ix�"B�pE�f���'��U�^�O�=��
���N/�_O��w�7��O��M/��TX������3L���7�]?�=��;y����������qx���|n�����x�/ix���1���~�����Oj��(qG�lA6�~��m�_�Lz8�8�y�����P���h_����!���B8�����^7�����<o���3K��^/��6AW��G�#9�ggY��?�D��������h��_�����#����O��qx���|n�����x�/ix���(B��2�)R6�l�l%�H=fh���Z���I��'st���w7I��'st���w7IC9�V|@����*��}'st���w7I�&
�l�����(W�e;���n���N��;���n���N��;���n���N��@L��O	��'st���w7I��'st���w7I��'st���w7I��'st���w7I��'st���w7I��'st���w7I��'st���w7H�V��O	��'st���w7I��'st���w7I��'st���w7I��'st���w7I��'st���w7I��'st���w7I��'st���w7Irj�8N��;���n���N��;���n���N��;���n���N��;���n���N��;���n���N��;���n���N��;���n���K�@�jr�;���n���N��;���n���N��;���n���N��;���n���N��;���n���N��;���n��%�D���^$���S�D��S��;����)` ��e���(�T����&e��i���^�������p����)6����H��Bx��S�>7��c�!J��2�!�d��rO�������D�;�<�I��~+������_��4�I���\/�`|�S�N�3�������y��2,��n��6T����{��3��|�a����}.�G�@��OX���a�a�2F�a�H�$0>���yC,�?�I��~+������_��4�I���^H�T]0��V���3���>����[���S5����e<���@����""�Y���6�g�������/�9�h������qx���|n�����x�/ix���}�A��V8��Xd�E�hx.��ebrJz��3dn�����<��cc����<�)0�s��yJ�&�"�=j
�D���n�v?O�	��o�i�m��|��k)+�)�����8�o�}>7A�x���<f��4�_�gS �������36,�(�/>�C�����B4���$����?��#F��8ya[���q*�g��vw���{�,�,����i��L�;��w�7��	X{����X������)��� S1/8�^@u���X�p����
T��������;��~����&���m��%q�A %�2��]�GbY;1�938Q��Jn!��g��d�������#�����������%X�����X��@w%�+z�����`'�&�����#�fL|��qP@,qGY�����9
W����	c��+������_��4�I���Z��p�V"����$�J+dp�����O��0y9�@��������B���M��\%]���:���H��l��5j����8V��bL�;�>�'�K&�������(A�7�i8����^[�k(��y�����y�
�����>+������_��4�I���[��l�UC�f������]e���|���*�+���%Xc���	�j����}�1Km���z��z���������Z���e��q,�,l�A�b\Qf}����h~['�Xr��E�m���>�����<o���3K��^/�w=�N��`c(}�%*�H|���	�!c�o��0����k(y��=��n��4d���T�lr�+0}�l^��z�
`�/������,�[�avM����2{�"oOq�5�����Y��E}�2�����g��-u&��8�?��|n�����x�/ix��61@��  @������X�[:�^�����^��p�.�������i��D�v�V3�/L8L���z�L���w�1m����<��N����-E���dj�h���h�c�~+������_��4�I���T�1���`qZ+�k�J�3,=|T@@�1~u��(�=��}����pq���6;�I��&t�0��s"���N)����Y�6Tvc��1��S����.���U��<W��o��c�����,.Q����J�r��d��������y�~/���^$����AMxP��Q���0��<dD��X���c�����g�Ppy��m'�'"f%��g%���~���g�p�{�z�;X���%��7a���@
6��~+������_��4�I���Q�(�Z��
��%0e���c�ac/X���S��#���wk��*�]�����O�I�����A���2q��d���<C�'u�c��)��6Cw������;��~����&���O:���^�n���[�Q�"��)|?��9�.U<�]!�y��l���_)j\���(1�!'����.y}����s8��5X�;���H���'�:�N��|W��t����S�ix�K���}��[�}(��)���_(h�i�����J��E���,�~#�����oa�b�.��3-N����e���������	����bS���b8�����+��0�����R�a�/��AO�z� :��|')�t N�q��c������_��4�I���Q�(�����
��21�������N��7���"3���nc���
�������z��a��B�V��b�14b���2/i�{Z>��Tx��3LRa2B�`��]�"C�_�w�-��B�XC���_�r��E��G�'+�c������>�����x�/ix����E����#{`��
�dd�
��n?���q�p��'�F;�������Pd=T����X.g��� �z�	Id�=�����1�F�l&�`�Z��{������5������c�����*P����z�D|�|������?%�����}�����}����
�6�����;��~����&���I�(��kN8D+C�
��4M'���8���M���N!�R0����� ����4Cp����aY�n��_L9�~���Co2-�������������1E���Gi��m��K�z|\}��������o�+iK#7c�k��-<��M�prY�o��e��8&���w�7��O��M/��b�"6���L��q9�@�
(��I��9�y���'`��Z��M�G��!��u�Zr�>�Y���{����8�oL=�wt&����T��[9�C�,^�����C7����B�I�������@2/D�)�>"@�L*oP#�����?X\X��$�{��Tp�?��P�lq�j��x}yJT������6;c���/�v�]��_�5��p��z��>�0��t%�+b�8��F	�y���?�.���~����&���Il��!f8��R����z�1@����A�kn����N/PQ�67�p��lJ9L�p����@`�b��)�_[��������p�/�����8�����@�=�>���'�X����������o�=���1�|������/U=�[�6F7��-g�V�6C�����)�9D���L������U7-��LL��M�;0���a=��u}��7l�#���l�_�1��Q������K��_��4�I���\(&�k�i
2���Kog�ncbB������=T�Ljb&o��m�OY����.\8�qp������.\8�qp������.\8�qp������.N�`�.\8�qp������.\8�qp������.\8�qp������.\8�m@z����p���N�fgh���.\i8�qp������.\8�qp���K��gT{<��2�m�Q�G\��������\8�qpT|2��2<F�yzA�XW�������!��9��dA�|�_�Gh�	��B{1��Z��|6��z����F�t5���t��9 yo�\/C-!���!��/��-��I����}2�m�u�=� �Q]�\�iAAv���m���\8�qp������Mj(��.\8�qp������.\8�qp������.\8�qp��U@8�/��x�K�����	Y3#W`�����������y�"������?q�	!���{��gC��"��AB�o�?�]D���a��c>/1���)��q���-R@�~T� �2����e��h��sa<����~��2���������y!��%�9�r1j�4,��Q`��p��H*|��8�@-���bop>c����������E�7�[�;o��m���sF�>�d��X�M�!�9?�a��`�'��y3��?��:^$���D�qx���� sv$�;�8�Yh�������(���V�"ZCn'�+i��������/����Vda����1!������S����+m$���y����v%��Ka�����3�>��#y��O�g9�����wN�z����M��������
�_��Q������i�"X����D�I�=���<����o'H���iP�;z��H:���I��������G��d\z��[n�M��A��_�`s7������s	@����6���4�_��4�^7����
���*[{
�M�4���6T��� gc�
���~%}5�����=���/����h;��,�'�Y0�0����H���^+���"�q�?������|��`z=g�	�k����Gm0��h����W��W�f���n+����bP���#���"�|�++�G�_����`|�����8~{J�M8������[�GB:�S4��zu�Pz�f�<�������6
_s��3���>2[����M/�dM'������R����i���y� {o>������G8�K��#�D�V�3l���og3�l$�5��e���'���p�'K�/3X�����S�n������ ����Nvp^���'yzB�s}_I_Iv``�7���/T�����/���G8���M�>a��`��R��G�Z���y;",�l=q���o�����6`��6�}�S�uS�O��)�+�f�����)Q�a}&���0���T(�t=�`|@���q�%�\s9���<��z��Rm}����4�_��4�^7�����K���<����p:N��;W��l��t�B���2`�yJ������� ������g+G)�����Q��?P���&�;���l������VhOq���/��w0}�z�:��Sno��b���O�������j+n�y���&g��	8/�9��&d�����G8��Q�z$��w�]/ix��"i8�o�}>7A������g�I�1���t9g�L�!�f���6q3W�����E}��s-����o��A���7�>/���w��.�Q
�isc��m��K�Mw]������t��Y�P�&L������2�������j���h
�6��7�,uf��x�K���I��~+����� �\�m�X�S��>i^r�����o�zg=t9Vz�T����M��/�mP3V�����/W����6+�CV�d�|�ue��9g�8��c������w����>f9��B�-����xJ�M�9��<����&��8�3���
�7
��^$���D�qx���|n�����(. �z������Wwwlo������u	�a����eCo�~���;f�<�Fu���~lu��b\����M/�dM'������;��~���T.H���?�K��^/���N/�_O��w�7��O��M/�dM'������;��~����&���2&����W��t����S�ix�K���I��~+������_��4�I������������y�~/���^$���D�qx���|n�����x�/ix��"i8�o�}>7A�x���<f��4�_��4�^7�����<o���3K��^/���N/�_O��w�7��O��M/�dM'������;��~����&�������DA������1@V��A�>����%�i.sIs�K��\���4�9���%�i.sIs�K��\���4�9���%�i.sIs�K��\���4�9���%�i.sIs�K�i��,\f��4�9���%�i.sIs�K��\���4�9���%�i.sIs�K��\���4�9���%�i.sIs�K��\���4�9���%�]��O���%�i.sIs�K��\���4�9���%�i.sIs�K��\���4�9���%�i.sIs�K��\���4�9���%�i.sIs�b_+��\���4�9���%�i.sIs�K��\���4�9���%�i.sIs�K��\���4�9���%�i.sIs�K��\���4�9���������i.sIs�K��\���4�9���%�i.sIs�K��\���4�9���%�i.sIs�K��\���4�9nH"7��]/ix����Q�!�d�������b�.�|�E�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.SQr����\���5)��ME�j.P������^$���50�T���2���0����,k,V1���^Y_�>&�b
�����;�A/ �dKWey�������V����A(K��9� ������4K��d�����Tb�����`��(�����e1��������I����%�I��X*7�J*���/��_�a�fD��%}��*�w�a�!���8���M�cv����&�����0�������D�5�R#u����%e���������^�a���7,�`�~^P��F���M/���&�����x�K�����I�����T���`;������@��������x�K��������iW�����F���4��Q(^���4Z[��Td��F,��!��e�Q�E�[@T���]�zVJ�^;")M��2��LyR�_��/��� ���;0�/��E�0�j��`���J4���a8���H�����p6�G?�K��^/��R�b���/�U���J��f��6x�0��!�\��f�(�]�6m5�S�@A`��d�z��q���A>.K���0d7�1_HB������n#�����v�-�����)@�h�&��n����������������&�����x�K�����I�����^$����/��1geN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���S��eN���;*vT���&U�����D��
pic-2.jpegimage/jpeg; name=pic-2.jpegDownload
����JFIF��C		
		



! #'2*#%/%+;,/35888!*=A<6A2785��C	



5$$55555555555555555555555555555555555555555555555555��"�����������c��e|.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.����s��]��������p���p���p���p���p���p���p���p���p���p���p���p���p���p���p���p���p���p��F��u��N�V`���4ru�n�:�E�qO�2�����h�}��;D>e�P�|>��>�OO�s��������}?>~��7�~
p9N��I��|�4\���l�|>�������y=3tO�������>g� 3tO�2���,}>^}�;�'[&����X���5��>urZG��N�f��	���Z��I�����r������>�n�?Z'.�f��I��������1�\>{�\�sy��c�����D#{���0|��[��sCC�|��rK���^�?g+H����:>|�!�OG�s��=>:�s����u*�O~:�,{<�}W��������l���N�`3�@s���<{���|��l���N�`6�-l����=��"t�e���=���i|����/�������'�G�9���'oV^�����ttb�����;���oy�4<����6��k�v{����*��.CN�
>/�Jz��v���;#;���t{��^��M<�J{��:�����2�h���d�d�5�u�����B�'����b_h#OB_h<���!��_,'@��	�����	z�'����b�%��/�����;}?=�}j<y����^�	{�'����:�7
l�`"�d�d�5�u������^�=�G��K��>���3�����=����.3���:�s���Lm�{v���u��s����w
��t�O�b����|�M._�����:���G��x���������rr��T���.��9��<�w���y(hq��u�:'^O�K��������������5�}���kH����?!��<�K�Gq���|�:��gG=�r=��X� 2u�n�:�E��@���2u�n�:�E�v;��2u�n�:�E�`y�Q���;TPMA5�PMA5�PMA5�PG���PMA5�PMA5�PMA5��i��PMA5�PMA5�PMA5���5�PMA5�PMA5�PMA5��aA5�PMA5�PMA5�=��l���N�`3�s�:N�	�e�:'I�'[&����X��D�����:'I����&P�l���N�`3�s���#�k��d�sa���������t���	�tN�(N�M�['X��9����(��^o<��hwT������J��G��3��F�b��	�tN�('I�:L�:�7
l�`"�gh� }�}��si������-���i}�|u�|�]�k����-���p'I�:L��'@�2�d�d�5�u�����h�n4m��Vl}}���-5��ry���t���	�tN�(N�M�['X����^M��F��&�~-�� 2����7�{���2t���	�tN�(N�M�['X�����C8�PMA�����"�^�F�A5�PMA5�?�L~����O&���E	�&���j	�&���j	�&���j	�'>���PMA5�PMA5�PMA5��P��j	�&���j	�&���j	�&���s��PMA5�PMA5�PMA5�2u�n�:�E����4@��gJu{��>�#�G�l���^��$q�y�3u0�cp�gI�:L��'@�2�d�d�5�u�����h����w_z�U�E9���������_��1�m���A�*����������~������HV3���&PN��t�@2u�n�:�E��8N=�~��9=��G�}������{�|���|�O�\{�zd�,�rs���Ez�Ea:N�<�������x7~�S������t������p���-����������3�s��z��^���������K�6��@cl�g��~�/}{B��'@�?����t�i�x�_��zz�����|�����5���^������t�}^ ���&P�l��n��[�_C?C������@dk�����T����_.�^��p�@c�g��y]����4�t�9����\,;�����~�q���/�[�~����������6��������e�O��������}'o���g�t��w1�,����N��	�e���/����,�l6�F�������9���2��i��zh���q���w�������=�~_Gl5����@>�_�e?F�qA��GZ�U�{�[X��g��~z;��=r�����k~�*o��d{������y4W9-e�KXpx�/��v{p�B9����6Y�]����2�f�d���u��~����qv���'Y���b�|c�z������uLQ1D�LQ1�����tM��s�ej�L[��'������
��'��������=��l���i!���F/4��_��0���
&)�I�����9���
����J��i*}g�&�~�����S:���g����B�z��s��m:�����j��������sO�{�,��)��V������/Y���=�l1��;���M��b��M3�1D�LQ1D�LQ1D�N��l���N�n�3�_��O����x���q�'T����������P_�>o���4�t���j���}�{�K���u����3mn>�0=:L����9�c�}�����n����>�84��3����z��
�5��CI�d����Wn��'���+�����k�r�5���?�_'?W)�<�&�'������
�:�7
l�`"��y�g���l��9��/V4�������g�}����ll��i:N�M���;V��K�	�e����V��:9�2�O���8i��/;�9���#��.�nn6|�R��g���?,W�~�s�V���v����q�[=r���2�/�w2~���������; '[&����[7K���6�@;G8�6�|����:����k0������v�J�t~{o+�����'I����uGyc�����2���?����y����3nu+�,�q��]o�����/?:,�/�W�9�X�'�AY����vd9�N�M�['X�fQ=O����9��}�((�\K�C:���3���r2~���8>�|9���l��u���������������p�wsy���t�@:N�	�e���f�_v�oxr�g�x����i�-���?��q�j�s;�o�����z��v�jd�d�5�u��~k���:7?'��gh� t��n#�����������>v9��;��@'I����&P1�9}�����kd����9��9���'@�2�t������p���,v�q�'I�:L��'@�2�d�d�5�u��a�b���4LQ1D�LQ1D�LQ1D�L)�B��&(��b��&(��b��&(��b��M3�1D�LQ1D�LQ1D�LQ1D���(��b��&(��b��&(��b��&(���:LQ1D�LQ1D�LQ1G�`�l���N�`3�s�:N�	�e�:'I�'[&����X��DN��t�@:N�	�e����kd�;G8����&PN��t�@2u�n�:�E����4@�:'I����&P�l���N�`3�s�:N�	�e�:'I�'[&����X��DN��t�@:N�	�e����kd� _;������&PN��t�@2u�n�:�E�0�3�N�v�!���!���!���!���!���!���!��^��kHf��kHf��kHf��kHf��kHf��kHf��kHf���!���!���!���!���!���!���!��^��kHf��kHf��kHf��kHf��kHf��kHf��kHf���!���!���!���!���!���!��2u�n�:�E����8l�B�����{��n�?VG���n�����7@���������:�7
l�`"�d�d�5�u����:�<.�l���N�`~k������dk��1=v{1=���������{��t.2u�n�:�E�����kf�:@2u�n1�{<���(�`��������53@ 041!#$"5Pp2A`%BDE���JM�u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\���Z�9x5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]pk�
u���5����\��]p��4������
������������nG��@�����M��Q�E�#��������V����������9��q������W����7��2)I��y�2��#b���3e�f�����i
�������Z��]��3e������MnC�4���Xl{c���;���)����������5�=�9�O�^��z3��f������S:�)���kSf�l������o�zC1�|�m�m$�0<BC;?�;:��������X�k��
��t�]��[�z���C3�����>l��%$�5��8l�^>�c�n�F���-W�e�#R*�=j�rP��1�m�4� J�a�����TkS����d-���k1��u+���_G������=��=.�7=��9�~t���B
%�>!uR�N����|���H��Z3�Ry�H��	+�"��1��Mq�G�P ��1U�!�1
\f
� ���0���MF`�1JNXLU�(�x$j�0KZ�����}
��+#���v����cr�M)C
���O[�Y������{xwo�%�����W#�^����j�q��$5UsygQ
P�������]����6��'���7q/�c��� &�dS@Qg��.U�����Q�AF����)\pY��f)�a������;E����Id�jS�I-��U|d!��a�����RmI�������3J�b1s�����G�I!7��o�l;'`MYgi�}K"��A3O��8��	�p!����I���/��5��@�5�LPM�U���=]��\�3��<������q���dV���@�i`�:�A_�#������Q��I"�����=L�����__�����Ob=�;��(�ye��0H�b1r�o��dl����oG���X����F���dDL
��1O���9L�@L;����fD�!)4���F��V`	�GC<dE<`� �<�Q�`NA�	��9�7���]��H�[����m���bki-�S�$R.Dy	�����2s#a�	km\����&695,������pV����P���b=�;��(���c��Ky����<�����8��R35q���/��\Y����w�YG����v�;�:^�94�j��7���/������#ej�|rx����{R��B�C��P~�����<c�^"��,������W�7���U����9����f�-����T?�b�f��grg�"�;,��f�o�'���8�����dZ2���������Q���K9lG���(����lG��t��D��CC&�1�;10����
d�a���d��-������z������B[1�m������Mm�F�
7B,	���KfQ�����9��XY���Y����K;�mL,(�M���	�����	�X��iqbE��;a���im_�����Ob=�;����{xwo�=������vb���(�	�+���nL��NsW%b��r��i�S�h�H
���3������o��:����;�����V�-����8��F��k�jMhq@ ���%��Rb"�Hn���Z�{\������o�g��(�W�C���MJ��sO0����j�2�I(���%LK*���!bQ���+����S��lk�T\a.��f�p���,F1��,~�j(���`����:�X�L`�h&R[�LB��u�����$;��P��� 96"/]Gx��ic���!�>���;��<m%���V�Sb>v#���~t�w����^;��6������]��I. ���_��PZ�����U$����F�W8�z����l�;9W*smmO�$�l��(��0b;�xC��6,3=���*��*
h�mJF��9!�k��*��l����%Y�cf���Z,0]�G$���Xd<y:,�LvjW�Z���%f���������l��PV�i��)`#�5dh}f��/LU�q���Ud�y���
����J�pY����z�k�
�������$M�by���1����	���-��f(	�T �+Iu�O�����=C�H��G�.#�����G��v����o��rb0Ds\��b?��#����l���������<�fK2Y���d�%�,�fK2Y���d�%�,�fK2Y���d�%�,�fK2Y��L�%�,�fK2Y���d�%�,�fK2Y���d�%�,�fK2Y���d�%�,�fI��fK2Y���d�%�,�fK2Y���d�%�,�fK2Y���d�%�,�fK2Y�����2Y���d�%�,�fK2Y���d�%�,�fK2Y���d�%�,�fK2Y���d�y���d�%�,�fK2Y���d�%�,�fK2Y���d�%�,�f^�G��v�>��(� �V���������1��^#���5�����?5��c�<�G��v�ko�/��~k�<��yx�o���>��_�0���y��������}��-FR�e���~����/���������&�5��w'���&�>a�������=�;��X�~��������D����Q�Gf)~b�����s�~��������c�������f!OvOz�KK�<+�4H.�i���/��~k�<��yx�o���>����U�G�[���0AL6��0�)kG2�b���r�����e��I��x��_y~|��_��?s��{xwo�����?vR�M�l���i�UCj9���J��LE���>a�������=�;��X�~���k���0��n|�c�j�U
�I	�+���B�W�_�0���y��������}�m�6�T�j������1�*��z�a��oa~|��_��?s��{xwo�����z�����J-��G]l,�_a~|��_��?s��{xwo������rI��o���/���/��~k�<��yx�o��v��x����'�����&�j���Vf���;q���X���>a�������=�;���7�+�o��X�;b��m��pX����U��[b��m���+lV���[b��m���+lV"%`m�[b��{b��m���+lV���[b��m���+lV���[b��m���+lV���[b��m��@+lV���[b��m���+lV���[b��m���+lV���[b��m���+lV���[b���[b��m���+lV���[b��m���+lV���[b��m���+lV���[b��m�p{b��m���+lV���[b��m���+lV���[b��m���+lV�on#���5�������r9�q�Q����
R�W��>a�������=�;��X�~��4Ei�hb��xU\8���_�0���y��������}�\A�!�1����&��i����M�p���K�����1��^#���5���4���@vI�&�9�}�6,L��\p
������)�X�!�1?l��z���?5��c�<�G��v�ko���B!�;���5����n?n�tU�4xx���XR�4Aj����K�����1��^#���~�E>|Kl�y\}�>���/$��cZ�A���M]�mE�����Z�j��6L��z��"ao��yz����1��^#���~��4���e��-���L�1?*��w�(�(���^�[0|n���
��R�k��_�|��$I����1U�z4~k�<��yx�o��/��H�i~mZ����`��?��O�^�`��BQ�Y��/��?���r �`�AZ��F{L/}�R�uTwa����y�������c/�*N���n��U��>��Z�M����_,���*�7�~|is���ubf+�30�����'�1��h=P�+X&?���)�����f4�D�LM��s�~�����X�7�_�j��f�/��`|����m�ff��\C�}��oB����
<�1b30��-�A�A>�z��������a��UE�L���HlDh�	Y��g�n���Qe��Aj=��������[�{-�GT �|[;>�|�	��L���:��-u�����G/�~|[e���fao[c�bFv(g���f�a�����Ch�x��
�I8�"�	.����4�
�]�kK::P���-W"C��	��?s�~��g�Q2�=�*OiR��c���?����f��i�T8ygZ�f���������J�������MKb&R3������AY�DPq������s��&*���kCC�(c4T!u����[�r�6 ��B\k��\��4���C�<��Q���[���������������A��G�f��X��{.U�����������i�,~���wh��9d�9�"z�e�-V�m;O"��"�bv�����+�f4��hlD�b�l��5�c0�����������	�����/����e�f0�d�"y�EY��&�����0
_�Z�G�1OR���^��|6D5-F��)������|����6����N
 S7B�3,�Z����x��F
��.��:�1N���.2��v��~�7a$�%�!b2�	.��8�7n�RjD����C<��{K�b���\������/����e���F�bom��6�8��Mc��%���Z�ju4�l��H�%���Z�j%���Z�j%���Z�j%���Z�j%i�-�%���D���Z�j%���Z�j%���I(�A9[��C=�[��u
(o�I����j%h���_���j%���Z�j$N���K�5�10��Z�j%���Z�j%���Z�j$��l��u�f_��Y��
`������)��[Z��Z�j%���Z�j%��*B���yeE$*�����[�Ese��Cz"C.����Z�j%���Z�;��D��KQ-D��KQ-D��KQ-D��KQ-D��KQ-D�����o��.�1T�bl��ub�O%j�Z+o�{A
���� �����[�E��~~B�I(It�\"E����K�jv]CKW�c��v��_bu�1,�����
wwN:���Bl��� !�!t3��"�	.��dk�a��O-RMF	C�0/���L	�����_���=�;������ ��,}�Ie�i���X���x6�UZe���~|)+G*:r��[(}��v'p{M���!��G�q�m����P:�F�fe��[��s�CzC(��O���oG$T�%�pY��s�.��Q&��Af)<�G��v���s�������c��3l�N�}��xD�����_���4M�^��*�����{^0u���d�i��h���B���+z�.d���!���,�D,c=9}��<�d���(MpH�Ar-
�&�bCf_�����f!KFQ�d0��>�m���9D�d�E��:��w��>$��}�F������]<���h�i���%�`���f@�����<D��b�5u����1.�k�:�7���"�.���-��p��b��)�]
�I13�X�o��-��c��,}�Sl�n1������z��������~���'�q�F$56��D��z���������Y!d�qkP�i�m�

Y�xR.�$��(��<ZSL`����$��(-Bo��{xwo�xf����!�M��>����m��t_*�.y�������H%�LZ!�?�����d@:�u�O	����'��Zde�i�\�6	_}��^��Y��H/�vgO^"EBOD�iF_f#���~��Eet�Q���rR��~C�khl*���z�&�%��[��r�e��u�]��X����kq������������1���D�ENW��.��+���t��x��gOZ��4l��+]�\�,���������������������]�?�g�y���x���-�\p[�nD��������-S�i�������+6�5c�?���~��_��?s�r'e�4dL,w�����&��5�l�-�\p\v[�CG��{xwo���!7,��X�~a~~'u�lV�N�����Vs2�6E;8D�E�?5��c�=�IFA��1��b=�;����uql?�~o�/��~k�<��yx�o��$���6�`w�,}�0�>a�������=�;��4��l}�0�>a�������=�;��X�~a~|��_��?s��{xwo����������s�~��������~��b��Cc������~����/��������,Z����C-�2��C-�2��C-�2��C-�2��C-�2��C-�2��C-�2 l�2��C-�2��C-�2��C-�2��C-�2��C-�2��C-�2��C-�he���Zhe���Zhe���Zhe���Zhe���Zhe���Zhe���Zhmzhe���Zhe���Zhe���Zhe���Zhe���Zhe���Zhe���N
�C-�2��C-�2��C-�2��C-�2��C-�2��C-�7��������������1��^#���5�����?5��c�<�G��v�ko�/��~k�<��yx�o���>��_�0���y��������}�0�>a�������=�;��X�~a~|��_��?s��{xwo����������s�~��������c������~����/�������������1��^#���5�����?5��c�<�G��v�ko�/��~k�<��yx�o���>��_�0���y��������}�0�>a�������=�;��K<p����~a~|��_��?s��{xwo�!iq�7�d��d�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:{n��u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�tV��1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�-��sssssssssssssssssssssssssss=���u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�u�t���������b��5Z�Z?��#���6��Yw��V��0�$_�{C���Z�� ��m����DR�[8����U�x��h0�B��������P����b+����
1��k������$�D,Y��Z��	m!myV)�c���1��k��{xwo�=������{������#�������������Dd��SM���{xwo����a`�W�LB�`o������x�1;�!����I���Op
a�L��9�oJM��,G��v���a�4�46��O4T#�I�G$���hd�b�����A��;5pi8Q��H�#��'���������#�����G��v����n��z��g�S�<����k������k������k������k������k������k������k������k������k������k������k������k������k������k������k������k������k������k������k�������5q�������k������k������k������k������k������k������k������k������k������k������k������k������k������k������k������k������k������k������k�k����W��51!Qa0A` "2P@BRq���#3b�����?b����tT���P:*E@����tT���P:*E@����tT���P:*E@����tT���P:*E@����tT���P:"�.�CE����tT���P:*E@����tT���P:*E@����tT���P:*E@����tT���P:*E@����tT���P:#�.�m��d6���tyY
�<���VCn�+!�G����UK���O6�Q��7��"���S^3�Y��g,�����VCn�+!�G������m�!q�A����j6d������p�&����VCnxa�k�c��L�z�����f��B;��a��I#������� �;�e7�pg�T��A�����us���p���4ES��f���Y�&���
�m�'}rN��s~�<�g���p�d�/3��
�]R���VCn!���h��]�4�]�.�N.����w���pa�����F]�a�2(�)�wu�*��}���S'�&w���K��ed6���fDmD1�`��J!f�����������^)<�k��o�C����d6�06!}�����!�h�v��t9�&�qM���w������V,�0x�U���&�t����i�,����g�O����o����]�i��9���|Ha�Ofe%Y5���M6�K�y�'�(�;V�)���j!��A~��Z�#����T�����S����?��B1�{�sql���oT����N,���.����gF���>7y���C��S�I����-�E�M�q��$/#�x����g�c�:�nJ��X��{S��U	�+	�����������"*Ue��v�B�b��~+=���?'o��/����o�����)�Dn]�����si��p2�����4�3�Y9���b&��~fXp]`�"XQ9;:v�7����5&u�*��Q��h��e��C�,_g{��`��`�L��D�Cv�"�pjr�T(mRw�����h
6X�9��Q#x�d���p��d�S�p�����z����%��	�8������5e�:�8����j�<XK������L'��`�s_���(1��+!��M�hT�����|"�?�n��w��� ��sX��g�*!?����:�~F�����h�qLtd�5Mk��A�	�y]c���X����'e�bX�����D�Mv���������;�J�]� �>���?}���%Sh���V-�a"XN9�2�.�QZ���vuX��������E�h���e�<����_�?�aY
���l�������TB~K9;�=���rvTFnK�>U��]b75Q�CE����/����!��y,G����+��
��.D�N��+!��T�n�	V��94������Y�Ed6���tyY
�<���VCn�+!�G������m��d6���tyY
�<���VCn�+!�G������m��d6����v�:�uN���;�wT���S��uN���;�wT���S��uN���;�wT���S��uN���;�wT���S��uN���;�wT����@i��uN���;�wT���S��uN���;�wT���S��uN���;�wT���S��uN���;�wT���S��uN���;�wT��������51Q!0A` 2�"@Pa#BRq����3C���?���T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�63�u�:3�u�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�T~UG�C��n�~�e�����}�=�O�G�����]>������t��������	���L!�6�T�����������.�~�e�����}�=�O�G����k�A�������Siu;V��.�~�����Y����J�;�=�)�0����.�~w���(�}.��#ce#_�N�G�!�����}�N�D����a��Q�;���}�Gw ��D#�9y���q�O�	����y��o��]>��mM�s�:�>3tqM��X�F�7a���t��Kt"d��wN��3a��L��l&�a�[*qE��=y	����������I�/��+R�������y�:��W�v�X������t���n���e�Gw\}C��6�����#Bd1�������Z�������N>����0�<��{���������y"�����t����A��5@���1���rS0��Xg�����
#n�%6B�{40�uO�
��+��Bo���V�5��wD~��~��,0�����>�����eQ���T������D����x�e�&����#����j�y�p�ot`9�G6�S�,�}�D���Ly�Y��[��T��/��"~�I
q�N����0���'5��M�
�os�C�*z	H��O~Ou�4�#�M��X���b�?�����3v- ��Ri���Tb���m���)����t��u��7����������Uq�����N`h�mWg��!��	�k�Axv�N�R����H��O]���z�����e2�w�X����v~�NM��H�vV�S�jv��x��}��_CIN�A.��}C��,2S��� `�u��4.AP���Y����/uU��>���S{C
�s�M�7C�K�*$�ta<rE�RJS��-N�v�G��O���t���l8qh����L8]�}����u���������Q'�)#��Cy{��\4sO���9���i�y�����
�C���u�
�����R7����Ko�����SZ4S�W�g��S�����?�M]���C���U��u�aeN
��'��`�:nA���_�?��h��j�4>[*/�jX�ou,���8����b���w2��������J��xh|�����g��n��_�5��N��\��t��{.�~�e�����}�=�O�G�����]>������t��{.�~�e�����}�=�O�G�����]>������t��{.�a��e8��aN0�S�)��
q�8��aN0�S�)��
q�8��aN0�S�)��
q�8��aN0�S�)��
q�8��aN0�S�)�e:���GH�S�)��
q�8��aN0�S�)��
q�8��aN0�S�)��
q�8��aN0�S�)��
q�8��aN0�S�)��
q�8��av3�����C	!13"2@Aqr��� 04Q�#a�B�PRbp�C$`���c����?k���d��XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�C��+��j�����XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�XAa�N|��d��o���6H��{�M����_7Zwp%�������8C�u�w.��������8Xu��X��{�M���������L�V��k��k���Z{m)���-��2'U�������X{/R����i�eZ��W�3r��-=����H�@7vU"��s@��Sa�!����S���!# �b:�+;-*�!:���	�d@��<2%@�%i�X{%5Y��]�
���j������$�=���s�
��3\r[r��������8"$������ua��_���E��6ov;yE����P��cNC�*I�N})���0���3wdG������X���Lm�&���8&�V8L����B,D��A��F��p���S��"�^G�!����_R$������r1?Q)���,�k�sQ��2�tBI7[r{	�GI9��w��qw�:���}rj�rt&��'�I�0��_�F�(��mI���+�ZuD]��c�P���ERZ��s���'���7'�i���">,�Zd��ru(�7���5���-Qf0�bs�/�j�����������G�[J�D���uG-��W�Hsu�C�s�UYr��v��������T�E�&�u�2O
��%����7����4_I�K�|0����S�����9�����/��f�}�'����}��u���.�	��E~P��U2���������O�B���E�����7�+M�#����E�
R��dD6]5IZ0��:H���a�����
G����6V'���
��� C5��C���w�f�	!
O��GP_�������� 
q7TfK):	8�3������j������$��>�s}��u��btr���(���^����^������Ld0j�2��U�~��{���vR|W^lQ��Bp!��&�v�c��3CuR�E���R6�F�s#C�I��_Nl!�����v���h��q�j�m���!t�f���B�_N��T`��OP,%�9Q�e�7-�U�j�����{��w-N��)�-"m����[�2�=�-�]���B-i�z��!�v~�F���TuZ��Y0�x}�c_x����Q7�'�\g:���$��e���>���������Q7�����Q7�+�����	Rk��\�g^��XT�l_M���<*�����*���Rk�V�V&��f�� ���z�re����r�['�I�R.�0N��cr���m�E�������z�]>�Z�\�N�t��Zhs�e�d��1�'9Z��&�����S���z�M�=e:Jm3	�k���'>�"�P������� �Y���:��k(�	:�Vv����2Si�YFH�R�e:H[�r�<���K%��W�����[��	�P�e�r����c>Uj��&���p&V�L�-R�y����(�-�j|�g��X������,��������{T9���C��������?t��������,��C�����`��T{f'c7�I�J��$?���b��N�d���ymF6v�@�l���Q�h5l����%b}J�W�(����o�9L\���j�48��l��2��Q$Z�'�n�j�u�:���Q�{��?J����~��2��j��PF_����U�>���T
�M��>Z�PZ�C���t�G6��a�d��[�T=��\=��&�O�ssAB�e�r�)�Y�r�Rh���ebV��UZ�^���`�U�%��D���X��PMU�$�hDU�����Z&����TIV"�u:�}���P2�vL4MN���TK�-Ueg��h(��	��e74�D��D���2����Q��k��Ym�e4&�	"@�L�M.�V���^���H�)8MX�Yd� E�MYBj�Q%hYMU���QW�	��iZ?�����o������o������o������o�����+?��r�����nqk~�&���"m���mjD�u��l�!6	�&�q����"�tu&�������Z�B��0L�P�'w�>VM>Pb=����5���+���o��,}X��K�>�(�l<�4X�>){k
�W�?�g�*�3
!���Ht����b�9yfE��L�r���*�J����iQ;�X�{~����j�2�S���D�"�X��Q"��U�����E<~�����d��X D���u	(o`s�\���G<:���z���HS$;]����\�U�^�����6��D�x�'��e��cBl����G��T����67����!�^�Vrs���2��
$:�m'Za�����+��1"�gU��1���HhRd�-p5Ct0��.k[z�N�
"Mv�X�����/���Ml8o����o�k�^\�T�5����@ ��X!DtB���"�y��U�����3����t�Y��3�dVEq,s�S�$@w��}��
"�!����e�C2�^�����-!���_���(��mO
��yn�&���@����$��I[5�7���b����Qc&	g�O��N�+8;�Q��{������4������s��;���l2/�!������h�'t�TD��7x��"�~��a��\Ei7��8�:�d��������{����(��4����,O��������,F�!����+:!��`D��Rq?N�_��[�����lO�O�Ey��� "V&��{��u��dj��
>�*#*���������y&�T�%��=�a��3'��3�1�!$N�(�4x�K�KK_!o��jI��V��?'���A���@/-*��W�!E�Kt���'q�Bp���N��-b����<��������4O���<[%�w��V���',�_T�����De�WI��C�.&�f���	�B��j��RgU���Es�9������1d�����t�����lei�l�!g,���	��h
�/���(������}��Q"n��2��)�cEMk��c�~]�����F�(���K��O|2�����d�}�(�Y�#\�������*'y4F���7��u�Gv�Q�`��"��t��<V��@C���5H1��!�#j�T��2����;'��{1��C�7J����Xw������0���D9HGt�k�"��NiP����y��}yO��>��>������^��C6�;��_G�Z�q?H��?��	��Gl8�Z��J�]G1�[��	�������� D��"Bt�����}��k_T�qpa�-T�����Y�$�1.�����=X.���12U3�!�n&^�;��P�:j���!�q��e�!E|c9�
��U�{�G�*@�m��6J���Os��t���#L&��:E�(Q�NdB�����TH��a��=>�E����bM�K&�XP����E��~�E��~�E�����W8��52d��44L���a��Q7�y��P�;����l����F�U2Y��cek���qW*��\8��p��U���qW*��\8��p��U���qW*��\8��p��U���qW*��\8��p��U���qW*��\8��p��U���qW*��\8��p��U���qW*��\8��p��U���qW*��\8��p��U���qW*��\8��p��U���qW*��\8��p��U���qW*��\8��p��!�\8��p��U���qW*��\8��p��U���qW*��\8��p��U���qW*��\8��p��T�8��p��U���qW*��\8��p��U���qW*��\8��p��U���qW*��������s�X�.32�������e*���j��i�[�Mn�4l�[�C���o�������5�t���F�5�d=��&�O>��i�[�Mn�4l�[�C���o�������5�t���F�5�d=��&�O>��i�L9���Dn�5�t��Mn���������|�?�)�9��J/�����=	�t���F�5�d=��&�O>��i�!���
]������]��YP����d�y����n�6i��!��Q7�y�]��O�.�X<�,�q?�uGp_B4������j���a����kv��f��2�E��E�?����{���u�17ud6�VP��,����H�����8Q�c�}���sC���n���h���L���D����w��>8P�3�
���e}�O����2w���MLd���Wg���n�5�t��Mn���������|qcj�v�k���u���I��e}V{���Y$�����n�5�t��Mn���������|N:��4k�������`*l.a�"{����/c�n�5�t��Mn���������|P�����Y����x�(���[�Mn�4l�[�C���o�������X��C���kmw�[�x[�Mn�4l�[�C���o�� ����kK��B�#��\��U���"g:RT]��O����?=���Vv{�>x���n���h���L���D���Q���Fi2My����*�l�
����W�k�F�?�\�W+�(#Y�W+��/�����r�\�W+���r�\�W&8 d�W+�l��W+���r�\�W+���r�\�W+���r�\�W+��Y�\�W+���r�\�W+���r�\�W+���r�\�W+��\�W+���r�\�W+���r�\�W+���r�\�W+��\�W+���r�\�W+���r�\�W+���w��E��E�?��bD��`��^�[�@�)���n�5�t��Mn���������|w�@�u�������/���|
���n�6i��!��Q7�y�]��O����r��D�6���e\U��<�=�Fx�Mn�4l�[�C���o�������g[���w���5Hx$��*�J�(m�����YQ�dw+#8�U�^�D
O�
�p>���7n���h���L���D����w��=�ae;�.����	h��X�6�>�5x�
�8n,^��b*�{�O�P��^��[�M4�����(��<&����/��T�N$�s��kC����E�?����)B�����3�d�[�<S��tO���<}�~�(o�>����/v��f��2�E��#��Fq��/��H�V�7�0����U�'cT�hm��y��'Y� 5�|�FK�����kv����NYsVPD�qk�h��8_���h���L���D���{A��Q��7r��i��c%��w���� �����?'���������Eo����
^���txm��WwG����:���Z�0f������0�@u�;�oe��p_���
��J4�����(��<#����9T�JTs1��u�Mx�������)������	��U���|�n������kv����U{
eM�0F�u!`U���X��;4����\�G)�Q��c�����b;�d�s\�b��W��=�O��M�~P���L���Tk����>��N��+�D0�6�����S����}�7�C�5��/:��a�����1)��`��&�R�������SC��m�{8\Ws����D����c[�������7hV<,��)�{��hB���l'�hp�+<#f��2��ZX��P��������o�����s����<�07V?��J������y��ja�(QK��F�9�B���q�
D+�PSo���t��k%���.u�W�g~��.�6TO��hfKb�Q^�alE����gKj�p*�d�/���k[)Ec�VC�Cf��2.�O�g'xK[H�FmI����������w��>=�An3��{��K���VK& *���,"���tVCS�ow���j��a��yTv���r]��\u'>-�6}��4����Z
 ��YHc����l+)� �j���q��2���V��}8�U��l6�e�����+S�C��=��
������Wj�3�[�2����o��� :�yw���'�����|mks���~���48N�Z�}�X����Z�^4)��l�.���)���{�Y�������`��s�}CV���[J�yw��l ��V]K!��W���}H5�,�����*����}v�;�����`*tx��e����Y�v����tf����(��<1!��2��J�c?�i��V���h{�^j���z����psN������q�#���p�7od�&��Z����"+5�V�V���h�+-�[���:��S�?9�vVs+�>9�����k4v��Y���0�uU���~VLP��*]�}HOj����A�	����d�����A���9[	�b��9�m#v,��&��
�&���ma�VD
�����C���o���(mj���xv�w����Gh����02x�[Fh�b�o��>Vg���Y�+7�P�E�F�lY�+3�f|������>Vg���Y�+3�f|������>Vg���Y�*IIf|��������f|������>Vg���Y�+1[,"6��x�LE��+"�+*~�� ���mY"����>S`������f|������>Vg���C'Zlv�E������Y�*R�}����>Vg���Y�+3�f|������>Vg���V�Y������	W���X��}8��ek�� <-aXG$'�Y�+3�f|������>Vg���YP�Y-s����u�(��.�Z�����T����=��mr�����k������������>Vg���Y�+3�����>Vg���Y�+3�f|������>Vg���Y�+3�f|������>Vg���Y�+3�f�a��Q7�x^�0D���DtZ-�Q}Vj>�(u�����b5���5Tl��$�J���|6��)�5�(�CB�(q���nSA�,�lV9�Y�=���'��lO��+�Bs\�Gu��!�T��:������Z%�!�-NYpAYP$�k5}*W�"/��b�m�K�����Y����g
���V���e�����U��	�����C���������Y���!��Q7�xb�+T��tF�
W6������{L@g9O9���s��3�kv�yM��!D��\�Y>Cv���e���(N�Zt�f�r���z���,�E�Dw5dR��X�9eAb�����-�%��|��`��Lv�Xc���W5\����B���hp�,��"�E���k����!Z=����1�Qw��=���)��Z{Z=�2������a3����{D/����
�,��V�
���[
����!���c1�U�A����YP��m
����E���D�9���r�Z����c���=eQ��eQ�����VDn�����������
�D"-a|9U��Ua���i�(������
�{���V�*s������n�����M<�@W+B�!Y���Lr��F����Y�eU���wqXI��c��&}��jEb��'�~��w�\6+C��g�5�������{����C�Tv/��[X~�� �P��(��<1b�����M������h����1�lB�\T����C��tW;��Cv��f������6�V�aYTq�Xon��#P�`���p������jt��
��������>3�N�����i_
�B��0�X1Y�����^�,�<�eVn��b=��&�O�B|	HX���cF<Q
p5o��E�?��-k.�a���kXVT�B�\���X�:��M��7n�6i�&��%�,��YM\��V�p�VK�1d�O�,�nYp����47k.V������X���h��x+&��d��M.��x�����o�������,!eG�=��b*���a�Aso��nv�j�
�$oY�r�c����Ip���0�_�����=�*����,�dF�V�K9��e�8~���Y�7n�6i���`��gm�8H^EXz��*�v��
;��%a#��#�,�W�!�[	��V\k^?
�?
A��������0����9��_�W�iwR�3��F�?�Mn����U�Z�y_��*O�eA!X\��HpVR��8?�{
�k��G*����-�=��>Cv��f���9�8,�����f�B*C��hY�f�X��z�'�����=��&�O�H|��\'X(_�V�����.���Mn�.��B�
��Y0�_�\
�DH�����h������%F8�s��`$=��&�OGF����4a���2�7O����t���[�M4�����(��<1�mF�4Mf����&��i�[�Mn�4l�[�C���o���4����.���Mn�5�t��Mn���������t���[�M4�����(��<�.���Mn�5�t��Mn�������	�a��	s�����;��b���t���[�M4�����(��<��<	���eZ_e����li�Ta�����+_����k���Z��|V�+_����k���Z��|V�+_����k���Z��|V�+_����6����+_����k���Z��|V�+_����k���Z��|V�+_����k���Z��|V�+_������Z��|V�+_����k���Z��|V�+_����k���Z��|V�+_����k���Z��|V�+_/���Z��|V�+_����k���Z��|V�+_����k���Z��|V�+_����k���Z��|V�(_�k���Z��|V�+_����k���Z��|V�+_����k���Z��|V�+_����E��E�?������n�6i��!��Q7�y�]��N���kv��f��2�E��E�?������n�6i��!��Q7�y�]��N���kv��f��2�E��E�?������n�6i��!��Q7�y�]��N���kv��f��2�E��E�?������n�6i��!��Q7�y�]��N���kv��f��2�E��E�?������n�6i��!��Q7�y�]��N���kv��f��2�E��E�?������n�6i��!��Q7�y�]��N���kv��f��2�E��E�?������n�6i��!��Q7�y����}�aXT]��N���kv��f��2�E��'��A�A��P�c"��e#X��8�6����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^������g��MH��R9B���P�5#�/MH��R9B���P�5#�/MH��R9B���P�5#�/MH��R9B���P�5#�/MH��R9B���P�5#�/MH��R9B���P�5#�/MH��R9B���P�5#�!�m��^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(@�
�zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r�����4~U���zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(^�����r����zjG(@OYo��E�����wQZ%9NaX��5�����a��Q7�y��G}�c�!�u�JC{��*=P�{�����������"=�r^������!d?�T��L�"9��&�s��u�=X������?��>��
����R��sC�a�	�8lH�lY������^H��Lo�T�������6$G�)���N�}.�E��a���Z���L�?Ce������A|xB`��:�Kl8�|�#�D��8�	deMAtxB`��:�Kc��p����1"	�@
l�w�����&����c������
����s�8�5k:{
����&��:u�������?�����?�����?�����0�\-�d��%�M�$�a�]h���|�������o�����wy��y���FCu�|9��b�-���~���|&F����G��E�E��+%��O�f�/Q�K������{������&��2�z���n�g�$�����2�nr���#
��\��c�s��5�vH��2/�A��T�	(q|�F?A��������%������o����^�+D�GI:��{]}g���K*.!C��{����N}x����!����kDh}�c]c�p���=��5�K�4mUkE�9�V�(��qs�V��Ao�E�l��]�M-|Hnkj������4�p��(��?����(��?����(��?����'�e��T����9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��Mu�`Nu�aXC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�ae�9��XC�aex���,!1a�@AQ�q���� 0�Pp��`��?!a��D�����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J&�0��dMc������J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*����J�*��"tsE~0J����+��T��aR���p��	�Ab��g���aG��"8L���#>+
?�u���.��p��XQ�"�B�$H��-�/$�D� N�4
%%>2PsS���$�� E��-�
�g��y�89�'�RP>��)�5*�����D 
?0������(9�A���@8.80�X%�f?���q$�vT7�x�d s���� @98���M��i��P0����nh`�� .5(DI��%%"�0���	��"wp0	�C)*	��C����������xI��SM9q���H��x�vC�Lt!U,��.���S��H�	���aR���w�G�u��t�	��������dS�"~��^��E�;�#�dlDY3�^/�1A�����)���}Y� W�
#�
z��
~��1����� T!�*1@,&����p{�9�L�e�3��P�0U�)�
2#S8��w�8��1���\q��?�%������6��4�:-���pO����������Dh���OM�x���'�,%�A��4�/B�"5�Q>����H�@���8�VqD�N�:�R2vO�B�������D�!���:bE9�j���Y8BSADD	.QWw���30�&!�`����)e`��t���GPrU�%o�DC�4~�@�K�����F(����8d��DL��XDN����XQ�1%�����kL`�5�t�!:�@v(���i�@��),/�X2"�<$�:���(N�q�[�*@��zLjBGPK���!�@L!�B�$5`�"�m�"���A��Zb�
Pc�� 
 Hx]����DA�{14$:��C�r������t���!���q�N2���N�����q� !��%����$9&BH�1%���I;�(��#S�|�D�	���O��B�D�d���t��!�7b� �
0��1�T)����oO(��$��#9�`]�UG}�S�+�v����w@��Hq)`� $������\�V@��-	��Q�;"���ZZ&b"���d �����J������z'q��g$> 4���|���?��N��4�D<�$<�!�`.��.$0�h��g��� ��3IMK�X����aR���~��aG���b��C$j��"DES��R����13�d�E��ho��`�,�A#�vm�D�2�����
�Ff���C�hp����DRF��qCw*Pd���E�@H���D�s�\�E�&�!A4]'��?4������D :��7���H����ZJ�qHN�@�"9 q	�G�2��2�L�W�0J���	�5�4fds�S�"Z*��"�AEf&�$���36� 2�f�E*�h��OQdfd]8�ED2�]�J�����?&cB�x�bHB����2�X��(T��2@�������I"� phO!���I�Mr����]�g�y�4MjCk��%CPA��()�c ����fB�P!)
�)�!��:�R(�g	�e�8�urtd������	�&�$
9  <(�p���rps��f�6App5D�49�b�J�-4L�:tN�1U��h����X��`
� �'NbL q��4�\��y4�@H�OX8S��N�H�E�����E���#�N�A����fp�$#|���E�\��A����*V-�
T6�4�a�tZ��(����M�M���0�"L��:�5D��$����'����I'B�n��"���H��3�b�`�DJi��5O��� ��d��%�@����W0�g4J�d"����x��G�t!�	���N��D�E��Z�9��%��1����BD�����gd���d0��@ �&C�f:��jdN>�0�%B�s������0��"�)�����5��	(��46j��2��2�5A����H�����8e��T�(���XQ�?aR���~��aF<���p���!�@��@�����=�-�NhfR�>
(��b�������8��B��L������j���@�qR�C\Q&
,���3w>mE81��3���+���2(�� t�9���	�������$`PoH�p�r�����iY ��A�mPb	gsD��`�@�w�@a8�
�� ����7@�+B�Iq Bd���"��E���-�����,����P|��$e��b�M!0��� �o8�D� �t�@	gsO���H��T���Ie$M9��K�g'�KGr"s�o�e��D��s0�%>uQ	q��d�����"NTG��U�\���X���qt�|��r��K
HC���J?�Bg�b���j��T>�SGm���e4P�jR�����a�p��M
4b O�AT��'��=(�	�c:�$8�P�>�PA)��E��!�(�D5F�6eCXC�q�+
1�������I�)��,4 ~���Xy"��LL�@�(�n�Y�b��]�D
IvQ!9�6��%5��d�������7�)�Rq�X�NC_�y{�W�k�� ���	��1~�n���Iw�3,'A�6L�Z�	���s���,��D'�����hB�#�s;?U:��2M5kBD#o�HP���"��DK��,��A3A��Z��Y�����������?��:�JY��K���w���bg�����h6EF��8&�h����&G�pbE��
���V�#��i��i)3�� ��w���y��V�
�e�/r?8B��
����RD�	\���*�h��Q�L0a�?�������n~�3��d�� ������������������
�$O��L��P��E�7m<�e?�����x�� ���;p���c��BJT��; Y�!�V6O�i2�Jy2`��
��?pphN��H�'-�j��0�3LQ�3-��bf��
�����0����1�AM����aG���J����
��c���
�\����?_�c����XQ�<q���Q=gF�R����A�������c�1�c�1�c�1�a ��1�c�1�c�1�c�0<b���1�c�1�c�1�c�01Gc�1�c�1�c�1�c��8s�1�c�1�c�1����XT�(�����:��sC� �K���p��cf��[�c,*V0e�1�c^���1�+
?�2�����V����
���}Ll���c{�e�J��@�]I�,%�1�c^���1�+
0�J�42��@�H�&O�+�cf��[�c,*Va�yp�C�`�1�^����4�������}Ll���c{�e�J��8�i��dEV��
`F��)�"��� ���������V����
��a������ON}�8�q�P���<�]}&bW2u�w_5����ug'�<~w����z�7��XT�(�?P;tu�Z��n��&3L(.�pd4!d�\E�uEO���6lk����2��aFdk!���9��~�E7)J9&0�h(��L]��9�������V����
��Q�,n'na�0TD�}f�(� �H�T����S65����aR��
2��'0!��>���b|W����z�7��XT�(�������_i��s����6lk����2��aG��d�����-�t
�,0 ~!����~�h!��\�
Q�a�����7����z�7��XT�(�%���#he�5.I����"W,����m���&	�CN������g�������������������[65������������B7����������������������1�C�aR��3[��[��R�%��W�}Ll���c{�e�J������Mz��MJ��H�0,�B�Ly�_S65����aR��0��\�v@s��o��`�`���/0�+��}r2u�?�cf��[�c,*V`�84��@|��BwL�
q+T�������� ��,ML��*$�8
��}�/����loy���XQ��)�B!���$���c�8�;��o��'����]e�$0�T�RI�x�_S65����aR���I�����R��DU}#
��G4�MV(�(ct�z�L����~��"4�&�o��g������Bb���loy���XQ��T�p�����6w�N�y�����2r@@!�c��b��Rf��}���+`d�#��9Oo��hPM~T\)!�T�&u���	��V����
���#�&2<�����������$�����M_�}���bB�&q���s�����P��D��CQ|�Fi�h���%���������7�������aR���	���CpJd�����4*�s�0"��9w�����#���a�'��H������#�>��#��T�{&��� �UZ>��A�D"Z�i:����z�(S��][�c,*G$"�:H`8fy!�������i����dl���
`�u���8�S�HL�]�'UE� �@ �#s2:bk'�)��1A�t���p�X�0��8A�L��Q<�����(@`�o�Me&��}��&y�0@��[�cH�un�����82xK� O�������A���g��`�����T�'C���g������@|
An�G��=8��|=j4�T���/l�G�(�������v���eR�][����]	�3��S�-aF?n_Y��0��I���7��
�h�Sd?!�h%�>���!`!�1����f�fP���R�5���#p@A�A���O���*1)��N��.��By>9*!B��;���Y� ��q����8�/1,�x���hF6OF.��y�~��o�QPGI�����>�������4��,.��
,�*Sa��{�aD��nEXQ���$����q���e !x�\���d"����B,r��s!���K�I9���FQ`E��$lG�H=�[�"GD(3')0�����Na����]�
D�L����Z����)����k�+O�0]��@{V�)�mRZEP������,/y���XQ�"�����9��������z��R6
H3���&�0����K�
����E�(��!:.G�e%\�gvJQ�WQ�SD^��'y}Z��Q�_0��y`p�Q!4A�&y��~ #"�RT��1_�@!^8��f��`� �Ng���J�P�A�*F%C!����bL)��"8��g��2H��O#j�TAY�:+j�j��
|��x0]:��y���XQ�,^&���xi8@2M��C���3 �*{0��5Q�TlUF�F�r-b$�H�����6*���b���6*���b���6*���b���6*���b���)�9����b������b���6*���b���6"q��3�)a),�t��HMGB�Gy��j|!���Gx#��6*��"����UF�Q�TlUF�yyd^���#�*���N�#5Q�TlUF�Q�TlUF�Q�TlU���+�����q��r�'��N�	 T+�L�1x�=!UF�Q�TlUF�Q�TlC[��>���p4/�}��H�B�����%�����1�� �fA��Q�TlUF�Q�TlU�x��F�Q�TlUF�Q�TlUF�Q�TlUF�Q�TlUF�Q�TlUF�Q����
�� �D���d�p'�G�!O�7c�t�\#�T�����S�+��(��
�>��|i���<o���6O,>����w��kp���4��Bh��QZ|�H��c	�c1u��2V����)]�]v�����S��]f!#"|���_6y��Mi�t
��e����u��������r��U<��@��xw��
�����T@�7����xF���	��t��q_S+_D
+ra<�5�|���$�'��2:1.�!�,�9">���4�M���$�����+�E����p� &#Z���={VHs��g�M����� {E�6�3��-���XQ�%���O=4C�V.�T2!$Ap~���9��#�[(�|k�aidK�/���<�&�uo�54�D�9�e�d@��/C����a@�	��xy��7T��@�C�@��k���1�;�T�*M�f(T)�����B�����H��j��@�p\`l*V|[�)�Y+�x�8(���0xh��-DM�p3�~b���4p����}L)�O��V�����0_�B�+�K����-�"����Af2��(� 8�C,l��9�s���%�\�#��2�M5��^���1�T:����c����B�Ug5N�� {A��*V|X����u'��C���^"�0��\o��/65��BI�T��D��
�������]�c����'3v��o���������"JL���'y|z
d)D2V?�_�����Z�vV�S�$k�%�;�-��A��� I9K�aR����&����RL���FSQAbd��`��J�#�x��F����������la4��"�9�Z3�L	�^Rz3����sC�����q������uC�����42RU&o��%9������h��	���T�(��5���@��
��j@�{$C�c��$���	�E@�4V���	6�@��:��O|���2\��\�� &�#�M_����P������V�����t(H������)����T�S�c{F���%���P����v��1�"&|l*V|LQ�!��4���o����W�}N%\��_(�3�d�4C�0'���tVq��9���+��@�[GU��U�,�����8tC�&��[�|IAN�Y��hS�%K()AY��(��_�k�-�"\��"?V��DB�~��X,r
���XQ��X|�����a'?�}O�`o�-���M��/3B�
6������h����loy�j<���+p��XT�(�����1y'8	�LA���_S@3L���c{�e�J���b�AD�42�����V����
����������/����loy���XQ�������z�7��XT�(�`��cf��[�c,*V}���K>j ���8e�1�c^���1�+
>��r��E
����'\��[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�h�m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U���8�m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��bye[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m�[yV�U��m��x�2���o*�������o*�������o*�������o*�������o*�������o �����XQ�������z�7��XT�(�`��cf��[�c,*V0e�1�c^���1�+
?�2�����V����
���}Ll���c{�e�J�����6lk����2��aG�_S65����aR����/����loy���XQ�������z�7��XT�(�`��cf��[�c,*V0e�1�c^���1�+
?�2�����V����
���}Ll���c{�e�J���P�X�Gb@�8e�1�c^���1�+
>�J�������'E����A]U��]U��]U��]U��]U��]U��]U��]U��]U��]U��]U��]U��]U��]U��g�Oj����*����*����*����*����*����*����*����*����*����*����*����*����*����*
��=����<����<����<����<����<����<����<����<����<����<����<����<����<����<�x���<����<����<����<����<����<����<����<����<����<����<����<����<����<���.[|����]U��]U��]U��]U��]U��]U��]U��]U��]U��]U��]TT�2a�?
��i���"�&ll��l*V}��4��)�EH��s�����sA�!ra���2s���$�&�>�$*00�����8
1q�F8�D(p</�pt��$8
1l�4EV#-\"vDd�8
1v+
>�7��p�\���,��#-"�I��9
���Q���A)�(�"��?z�������������>���P� ����q�&a6D�!��S�wP���i]�J����
����+
?��*V�������C�/�����9&�5�e�����
���t�'���6@3WO�84���^�+0�FG@�Ei�>�j���Y3�@2����4�t�0df��ch���b���Fjb:��?2&P�,\�1��aR����f�LL�!���G
�A=l�2r^���;���pI�@I�bN�-�jtXU	���Z���Qy	���2
���������XQ�?aR���~��aG���H.t�?!�>:[�F���!,�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o����������bg%o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�J��[�+�o��������V�H����<����p��<��<��<��<��<��<��<��<��<��8��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��=��<��<��<��<�L0�0�8��4�M8�O0��0��0�O8�
0�L0�<��<��<��<��=��<��<��<��<��C,#�,F �<�
8SO3�(K$F���E<��<��<��<��=��<��<��<��<��,q�<r�<��<��<��<����,��<��2�<��<��<��<��<��=��<��<��<��<��<�� �O0��<�� �B��<p�N,b��<��<��<��<��<��=��<��<��<��<��<��,��2�,����,0�<��2�0�,0�<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��=��<��<��<��-/�42,��4r�B��X@�0�I<��+�LbI��,s�<��<��<��=��<��<��<��<��<��<��<��,��<��<��<��<��<��<��<s�<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��=��<��0�0�0�0�0�0�0�`�0�0�0�$0�0�0�1�0�0�1�=��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<��9�/���<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<��=�����|��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<����<;�c��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<�����<�����<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<��~�<��,��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��,0�Y0�0�	��0�0�0�`�0�0�0�$0�0�0�1�0�0�3�=��<��<����<��+W�<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<�G���z���<��<��<��<��<��<��<����<��<��<��<��<��<��=����>fO/�<��c�<��<��<�����<��<��<����<��<��<��<��<��<��=����<��*��<��?{�<��<��<���X�|��8c|����<��<��<��<��<��<��=����<{�+��<��+[U<��<��<��>�����|�MU�T��<��<��<��<��<��<��=s���<����<��8�����<��<�O<>���x���6�D����<��<��<��<��<��,��4���	��0�0�2��^��0�\�4���OO[4[��}�\0�L0�0�0��=������^��<��<��<��<��1<�����<��<��N����[/z�y�4��<��<��=��8��<�����<��<?�<��<��<��<�����<��<�������U���P�3�P��<��=����<M�<��<��<�����<��<��<��<��<��<����<��<���x\��]`����=����)s�<��<��<��<l����k�<��<��<��<����<��<��<��=`y
A�o=����<��<��<��<��<��-��^O�<��<��<��<����<��<��<��<0�<��<��=��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��8�0�0�0�0�0�0�0�0�0�0��0�0�0�L0�0�0�O=��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��40�0�0�0�0�0�0�p�0�0�0�,0�0�0�1�0�0�1�=��<��<��<��<��<��<��<��<��<��<��<��<����<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��8��4��<��<��<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��02D$C�<��<��<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��=��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��8��+!Q�1aq����0A`�� P�@���?���W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�W,��%r�\�Vq��z�XUoW��
���}aU�_�*�����V�|>������[���@r�&�J��&
���g��}��<:��
��f$X��������[�����z�XUoW��
���	0���[������)��l=�=���"@#c�����7�aU�^���S������=P��C������WF�k���1����z�8������I����]��u������x8����V�zB�"pD=�.����k��@�H5��*����d2D��������>���*����8���W��X
�R���*����8wE�>����{����K�XX��u�V�z,��0�m�:9�[�2�X�	QX��@6��yP`	\T.��dx�U n��{A��}�6��aU�_��5�5�����~�C�����Bi�����<�NpD��i���V�z
����Tpg'���a�8D�8�a[o�i��Q���	�VpD<;���yP����W��[��q��'�+�"�G(0���4DX����#=��1��H|�1p�	qw�o��r��#�8=A�1�c���Il;���v!�qdf.��`���+U����zj��p2,�L���:�=�w8��0:�U3O��3#|���C`���6`�	�����Cf�#�q�2���m �DDi��w%�a���\D}���
xQ�^�q��!��-ea�=�m��bJ8��!���@����&��k��=������k�V�^���c��3q���c��m��z�&���'��g�F���q$c�V�����qB�{��CP����2����!.M��(L�D�-A�Y�1-�|�b��>�a��j<{LN*�2���#`�k~��c=�1�>��i3`�B�Hu 6
	[PR�@��8��v
J���b8%0�=�YP�4V�1��*���%�&�bfS��1
�@�mD��D�F�����������I�����S��-;t�S',�Eg',,�)��&�>�M��-�?�@�b��j�����4*�fR����q�p��0�W���R����@�Z0B �A��zP���:���'�����d%<�6\�F��
�1��{���c ��E� vq� H�a���>A�]�b��z��#u��5e�~��-^��!�~��a��k
����
��I%�M�.A#�=�b
 @�gF0�[
��Y
p1/�Pa�W
�T��Q%��
vY/p�;����v3P-������	U��l�3P�������zm�XUoW�!1@0X:� 	� ���T����)�M��	���dNR �����g`����}F@(�H�F�H@5�'{ ",o_J�h����
��.��V��	"[I@_�,u���#C�t�
���}aU�_�*�����V�|>������[�����z�XUoW��
���}aU�_�*�����V�|>������[�����z�XUoW��
�l���|�F�h�M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�5�1�����6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M�	�i�t�p�6�'M��O��+!1a�Aq���0Q��` P��@���?�h	B��R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*x3����u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�u*�R�q@�5V�����lX}>��V�����lX}>��V�����lX}>��V�����lXu�$�d���J���9����X���!��]�N#���f�[O�lU�a��f�[O�lU�a��f�[@}��V��M��!O�UD ~�l��b���>"�g`��G����}Qgo�c�"?��lU�a����)���9>O�y����1�}W!|$���lU�a�2 ��q!�'���Bd`�,E��-�lXt�h���>`��=v���f�[(�w����zT���0��6*�����/$�2�s�cT�>G�l�#i��f�[��%���|h��QC�8�R��Q����z��8k F 	����<F�<�]�t%U�����lX~cS
}����h>H����a��0��e�vCL�c�l��v�e�b�����@a��
��D~hj��03�F��s��O0!��0b*����\�f�I���lP8�?7	������Q�w�1�'�x"�z�N6e<fQ�K�����P�!�`y@�/�Z%�f&��2<�0`�a��y�G�X�xL8��&]H�����@��2�PD�v�<��tag�owQc� 9��f&��7D�kS=�� �10�@62&,�8�(�Cvp���0M�:�0x,�?��1p�������E�q�'`NH`'$xq�L�{rR�@�G��:��-���x�lXt� ���xm����Q��&e�@�/
b��^T7q��������lO�m��3P���,"���aE�<�b|&��q�tp���b���f�+�E��&b��T��|�)�c�Y#R��2N��{T��M��VBP��l��b��������:0�]H�RcFB`p�����7�b*l�8�RO�80D��H;�;�M���� xX�6�/�
��d���D&v(e?���0NLu)�g���	<���&&$�fj����b���B���#q��D�y�&��F�� �.o�%�#"E�&%���X@��d����{^�u��H��E��c����a�r��@���xX��T��XC�bb2�0�
nh�A�T@�?��b���� ���f� Ld��)X�1S���{�e�&�B���O}wD>�<,b�E��G.C�"�(u��H��
���O�l��IC4,0�F�8����u�{�L(!���b���	:�1R���.*6��	�
����2#�	�Y�&o�]L4 B��r�>��s�o�!��D�:����N�:S�=������Q�1#�<�`����1������lU�a�XVBPt��$]we�F7s6/�G��*N��b����6*���}�b����6*���}�b����6*���}�b����6*���}�b����6*���}�b����6*���}�b����6*���}�b����6*���}�b���,>�M�lPa�B���C�*�~U���T;��w�P�����C�*�~U���T;��w�P�����C�*�~U���T;��w�P�����C�*�~U���T;��w�P�����C�*�~U���T;���d�����
�~U���T;��w�P�����C�*�~U���T;��w�P�����C�*�~U���T;��w�P�����C�*�~U���T;��w�P�����C�*�~U���T;��w�P�� B��_��,
!1A@Qa�������q� 0P�p`��?[y�HE0�)XVnw����e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.�n����
�Su���-f��u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wW���e�^����u{.��]�����wP�$������%�Cb���8�������p*x��8��lH� ����l
�%��7�Q(\�F`.�DAl
�%��*�jq)@@}�8<K�%:���3���hH�\�(#���1@��Pa$�R���FD�*J����U$���FG3���PTvv/�r)��`��X*J^�.v��&�mAwj��@���K�P$���K�Kx '�m��b�0MM��$��E����I�oQ;�@���,�O�c����42I�#4�(��d�N�	�Nt"I�D%�'hr\0���~x8e���
�)�R\��	Bp��^�';s��������l� L#��'Z�����f�r)���5�i����a���, q����U,��%��3�@D���-v`b� ��R�� I�P������
����v )QaF����w~9P'u J�����n�|T���%�N�j`���N9���� 1k��Y�*���BP�%�����>�>0G�JJ��2���
 AAp*V��)���b���*x��o��OR�(��Rn�AV��N��L��nh1�J��h)>�����"R��,
�KT�@}l����*X�4�]d1������R�,M��)��J��X�k�0\�*���u�	.%�--,�D��)�C�kF���ZN���ffk�-7�)g��W�L��S�/D_,2��X���/���t���*^'sIRB�U'�K�{|Z�bl���p�D@e�j���sF��H�9�W�*'44���s�����P��7��jG#���>�K���vV��������(s��J>Jz��T����O��C���9��Y�O�B!X�l�i&�0�9��X ������2����0Y(-` !..xU��&��A�5�Q���&�4���K�K���L�FBd���I��]�,�In���Q���b��0��K����>#�W��R�*kO�=Y��?���G�P��{�.^�\J���K�l�Yo�f�X ��H%/�� �,�w�9T�����N�����|!p�3�Op�E��G����W���E�9�
��
��.���1'ft���&O�]UYA3a14ll�_9p�CP��]��S���d�����ES����v�W	!�U�.l%��U�k$�������LE6�Dc�M}����CI:�
�EO�b$.o���)�V8�h2
-�V�`�.E��PA+��h�=�Fe}��RN�DAX�>)�Dgd����!�3j���#nM>$�u�hCl�7��R�e�h��d��9RJBE�)5������� �D���	�REL�$�3�oVJa�;�}L!+2��kb�~EH�,�.�%��q���9�v����������~iKP�}������0��O/#^U�;���(E��n�:��7h��]F{�b.bFU}�o���c�g��e�$	;���!Z�j������0��3AE����d��2���B���"D�x���$�s�
`������L0�@���I�P�<J�(�`z�]/�;5}�Fd�����1�����+
:c���;�B5��]V6�����M��I���k��+T�2-���
��-#���"~�2���U�M�N�H��P�:-�o�5�rd��)$P���1cd��Y�Q��|;{�x8V!�����������K5(�f/c����.O�@��$�������@�����jO�	
�
G�X���b�\P���_��A1�X��$$����2U��	������G&�?2����~,P��
��X��@@b��gL�T�^�^�V�f0��@"��#����`���,X��|
�%���
�%�[gw6*b�jh�7�R�1�D��a��-5\@j�D���0�cL081:��46��N?��A����B�Ln��� ��c����n�[�ISd����TLr�+��%��Y`Y>�� 0e�1�+J�1KlhK�U���k��"1��BM���>,a.����(�B�T��	aK�v�c)�`��i�Dpc�p�A��F8a�!
'�� �����'���a�>c
�I+4�����j��"	N|������S&�c����M�t~��T������*���y�?Lk�0�N�I�����^��a����b�3�(`��4�1	v>S
xV�8���J���4UJ���:���O.D�d�IPu� �B7Lj���N��}����/Wu
Z�����E!����]����(	8�>�3#.-T2-#�5��k0R�!Kc���O�-q{��'U@Q�%k���\1���3������|�O��8��54��������1���
�T�K�
B ���W}\�|"�0�Fo��E$�	�����mU�������aa	�*�����e&s��E�����\Zi�.�5p���������5P+�����[�	s����������@	O=�?#k����j���
����$�+8�&5M�P]H����h��1��<)M�'�D��T�$3�S�|^T��dK@��X��Mr�]/-�9	"H�DxB�dM�����j���ezm��s������������+�)��e"[
c
$3��qf;Tq	�>i���/���D��������Rd��q�b��.O{�vN�Z�$gg4��X�[H\��cn�0����b���D�����(q.�S��7;^����*����A	j@#|V����a1��@���;���w7��b��D��/�S���L��E�����$r���w��eg�Zg�(�saI�q?48&Y��XK3�*i-"���E���o�����A4�C&nE��4�H�����*�&U��E�hF���<L�(��Jp�h�i���c��@@"6T9a[��1���u���& ����N��/,b�"B9��<0|j�.���@���DE`�
MD�"�aG	��t�xF	L��0��^��P?4��L1-OOD��j�*����$Q�V���z
1��Hic�M"(�)s��`S9b�e9�.��4����y�DpPY��Q"�����3 0���A�+`��5|� 0�b�;��QE��.i0j*��`�e�\��I���0h�U�_}e	h�	L�q��#2��K���|
�%���
�%���
�%���
�%�����
�|6T�`n?'�CV�MR��)�-���T�z� 2 ,����r�%F�/��F,A6$�-Mp�,�JC�RS���)�� �SNi&"F�e���Ha�)�k�F�(VD��m6�tVh1B�bW��2�#	�&������l;*�ca&����4���V}T�1���FH�����	��E>s�]i_>0���K��������W���j �&.MFh�!(�/��������1��q1.�&�1G�v�*�b���	��(.�TT�� �@��TP��W8&��NV�=��������5���3-���oV9���Y8N�����gm4�y�X�b�`�o�l�A�����,B�E���	i�����C0�����e.G@�$%���b�h��;�Y���	�Ij@��# q�$"Ap �.���P-t�q����`�8����j>�I��'V4hf	`�sS:9Y
d��v�+s�bZ�{���c1��3�b&/�#����+b��F(�.??������C�U�+��'�N��Hf&f�J������T$��!r�X"�j�!���K���E�l4(1��A�_��������!��Y�f�0��t!`�b�']b-V�1����q�uq�e��k�Z�6��p�I,U&�68���k�/�EH�Y�o���rQ���q��.G��.�@����@NF-LA"�L��!��SLe�A
2E�O�T�-=��cD����e���o�M�d�_���	)���G�%�)!�!�L��0�$a�~i�G!��d��4��S	-��B���L�)��yg��3���V��[�����k��\2FX�5�J�w�@�0M(�zE7lXf��IVV�-�E�f������W�T��)@Tr�) ����cM�q��%��:?4��&��!���Bc��Z)�i
�hjp��c��mn;���[
`q.X�Dj��� ��[��&;�X�H�?�S�"��������X�(�� @
Ai���@���@5%#@&+N��KUy{���]�)k���9��x��	��	�e���T�f*�!aa���"��6��5+�PTn#g%�����`$�A���*Q�S-���/	��j���22u��>� 6s7�]T��'Z��c9����{U��� ��/|�At�F����T�����D���$���S�
�T3�pYR�.����"����	���:�N
�y�0���c�F3R��QLr�D��9�d]�<�T��
I��jA m�HDFm��H�i�m)CW�Y*���Xgn�����O������b�%�.`�����:��
k��cI�#3&p���=�:I5��s�`
� ��M���M��d�/�����U��AR���e�Z�jH����4���H�#(bHo/������H|������QC"z]�`�o��?�S���RH�j�*��wj��6�����J���
�%���
�%���
�%��*�duS��lR�0gBIi0��
�r�O���E�C6aCj�Z��U�f9��tOoI�U���o�^�����{j��������W���o�^�����{j��������W���o�^�����{j��������W���o�^�����{j�I��:�W���o�^�����{j��������W���o�^�����{j��������W���o�^�����{j��������W���o�^�����.pR3n�o�^�����{j��������W���o�^�����{j��������W���o�^�����{j��������W���o�^�����{j\"�}m�o�^�����{j��������W���o�^�����{j��������W���o�^�����{j��������W���o�^�����{j_^c��^�����{j��������W���o�^�����{j��������W���o�^�����{j��������SI]%?^O���N	L�*�!G<����*��W^����xW'M�:�7��4�O�1��mi�+���f����g�����6����|�M�yM3�S���bx�Zo
���Y��������ZC\�5���<M�7�rt���x^SL�T�-���;X1I��Xp���B�����}��jL�/kM�\�7��4���8<KGb%���<_����-H�B$i�x1�����4�v�y��[��)��o�����x�Zo
���Y��������Z;���)����!�����%������X��f��a|�r�3������W��M��x�Zo
���Y��������Z3�@����T�)��|8G�]d�]������x�0�Z�X��<�O�u��������JVf���Y��s��GF�B�����'�t1m�
��������N��u�o�i�
�%�1����� � ?6-�����,��[~���c�C�����������\D�$��0}aM���w�DV~��|M�7�rt���x^SL�T�-��J�Q��7W��������;�P4�3��7s�,����G�s�?4���8�V��MF��~�����6t�|M�7�rt���x^SL�T�-�1�+9K�P�8����AQ��X)�71����2����$U�����u>7$j{��&����:o��i�/)�p*x������f0�k�Xk
D
��������|��PN�.#���6����|�M�yM3�S��F"����I�O��%���W#���;��lLWjW�����N��u�o�i�
�%��S�-�b�^#�D"C�`�)9��`��{��$�}���H�����~{����\Fa���+~�N�������N��u�o�i�
�%�"�,;�`�&4D��5gI��Dx��&T��c��7���7��ok`�������\���6�A�U[=36~n��d������{[��
�l��7��ok`������{[��
�l��7�W�����
�l��7�!v�5�ok`������{[��
�l��7��ok`������{[��
�l��7��ok`������{[��
�l��7��ok`������{P(B7nC[��
�l��7��ok`������{[��
�l��7��ok`������{[��
�l��7��ok`������{[��
�l��7�C�$�el��7��ok`������{[��
�l��7��ok`������{[��
�l��7��ok`������{[��
�l��7��ok`��A"[�V����{[��
�l��7��ok`������{[��
�l��7��ok`������{[��
�l��7�d"H���*x�������:;���������4���������/�t�<M�7�rt���x^SL�T�-
�,�;N\b��qF�~�?B�O�L��h6.X�i��_|����mi�+���f����g��hlD���Q�R���� ]1��	�X~��Z��F@�k�\���8���kJ���x�Zo
���Y��������Z>��;��R������`4�/�Z04�/e;� �/��Y�f���%����Wb)���J�u���	f"<��������f����`u�<M�7�rt���x^SL�T�-	�M������9�/���QW��69�Z���cu��e����q���xR�H��N4
��hhsi��bF:��\�>J9x#��O����xW'M�:�7��4�O�S�����0��Q�}�j��?�BQ�����Lf��Z��&,v'c����/��k`[\����3H<f���a�u������C��J�YJ��p���jj���?>&��	="\���d�E^K����N��u�o�i�
�%����1E�0�t��n bg�g�P�#�S����_��hR���8�������kcFjh���?�jA���?�)�/���l6�R\P>�x-])T;K<O���������K�>AG���8;Ta$a9|���>����
���Y��������_�Y�&�Fr��`����������F�[:�1�����[SX�<���
�e����Bm��hR�|����>��kG[}���I����R���5�{XST5q�R)%�3#����k�j1!������|S��uiy�u�@��?���4���8<K�Wu8<J�����]f	�b` ���DC�tK+H�@�Y��Y�8�5p�kr7�\���u~���b{������/��mh�p5L<)�8�k��-S�y�YQ���l[�}�#7/r���De�M8�����R�!d�c�eX�}{s��NK�����b8�4D1Yd�������P�7g��B��/��x^SL�T�Z�Q@3������RG���"��������y)B5�������������<�f��]���?�bk��FJL�H�y�����(R�
#|�V���k<�,(���8'T`���#
���R���$���Y1������������y��Jp@r��u.8I%���S�T�����
 �i�&�=�jTl����e
���}B����@%�~�Y������k	T�^4�����A�� Mj��4DE�Rx�!��`��A�����(0E�\��:�A��>���.G��k\?%�P�1"8������x�Z5����h�I�j�hn�~���2k}���8h�6�
�b�{����V�eL����������	�B$��!��zh�6l�P��?7k\[*~
��`����$���j[�0R��p�GZg{��j���8��K�B�����&��xZ��0I��O����Z�=��
,�rCq�xf����c`?�-\3�&����� �#0��S#f 12���">|t
Dc�GM�	�?�����T���}i�ZI���I�g��������%�0C]4��E�W�7tB/��o�w������HK��������AB��;=c��F!��*<��{�|�z��������R�p��A��3KA����� �.�w���*�r�Wv����qQ;���N�5:@0�9���l��VD�xtRhw��,��M��Y��F���`b��eeQ����Rc^�CxQ�����U�I�����5p�$�7�q/����uH���E�E�+&�I��/Wc+H��W�4s����D��7R���R�q(+(�l���(p�T@���K��zAUq�6�g�~��N{�QI���^����Wu|���,��9��Q�,@�*[>�D�Q���s�EHu������f����6��:!�l�Y��*O�h	#�K�y�g��&�a�Np��'4����"&��(�3���>e���p����6��g���H��Y��/M����h�j�h��.|�n�@��
��6h�/)�p*x���h�0���ah4�k����?e�0��s�vQ&0b��K�|�����&�����08OV��X���m~2d���`�����-P�$Ph��(y���-;�'6�9�M��`�o�j�&��1�v��#���.X-�oM�+'�=��91��\�`@RU���7��M�*�s��"
M��GZK��@a���G�/k�Q�l��V�}g�kR 8E�2��u���t��]���I�Q��>O�	�I��Y�9r�_k��_�NM5������i��<w[JF����QPj)0����q���������i���j�;<���i�
�%��E�W�;j�9����\�s����h(��s@��j��K}��e�n������ �@J�%3A�
��V_BAAAAAEbH8��?� �@����AB��j�TVU����������V�P�JB���P���Q�C�w/*g�T�� �����\�1�b)o����e���� �e
[vR� ������l��f��[���}��[����� � � �\z��
�gZ����j���������
d��^�d��Sy�����+�$�I��=�.J���*PD2p��A@@6�f�������y�:�2f���l�����7�>��!��E��s@l��<:+�I=(��)<�	u���AA��!
���AAAAA@���?^O�Q�A$��h�K��q��cC$���2��0�4EL`���*W� ��b!u�m�GP���o��@��LSk���������GT����>&��>jnJsN�.e���%$'i!~�is:�����@q"w�<e���Z��Y}������,���W&���i$-Y�����x`���CjI�P�n)D�����1�@Y>=
8����m���r�v����T_u�yS������f���jU����(Mg��~J��sL�����V&;�p�ar�yW:f��s:��6�nJ)�&b3
dx��8�
��V�d�c2rN41;.�"\	����/)�p*x������fV^���ER !�@:��@M`{m���������
"0hP�,?������c�~|M�e���Z[�lp8S���	
�~�+����d1E�������7��'zG�����<)(�+f�������2>�A����2��j�j4��}`��a�h����{KK�>����)QRNA;�g����I�Z�xq(�d���:��
����*�@�pt����G��3LW�u��5!�Z�����I4~O�W�8�	#"BhX�$f��G��`lO��I������ ���7��5����>�_���R��lO��|M��ZE��Q|�%�~�� ��8���Y���
'��?P�����Y��Rwce2�������~a�r�����6��P�([k$��QH�x�����+��{��4�t����E��IFR(_8g����K~L	c�F3a^�^�I��*yU���I��;S�f
�X �o�[��zW�t��Q3�)[�0$�4O�[�p"@20A\R0��� \C34�{��E��<P�o�j����&����zt/sDj��\3���6�W��&���B���\������u��'�(���RL����8	��v��~�jg2��:��PNsJ�\5�^���f���WcfWu���`�5.���;Q�L�81�������Gn�'�aT����n�i4�����O�Rk�i�����)}����+J�	�6����e�8sY[����Ds'�p*x���[��f���� ���\?�I��g,��f\�g:$�7���K%�	����Z&\x�����|�D~\�#�9-(#l'��I?+*|Ij��������Imm����nIE��HG��h"���5�����J�p;�����gx�j��L�nD��P�?��6���U�BJK,xT�������9����*�����l)
�T�Ej��������M>L�� }]��HP&K�����~��b1P�h�KPD���&���l���11�1�f;������2��(�i�^=(;o��)�4.I��w�=G^r'B�� ���E�?/��\�7��4�"A��Bd/b�F�����r���4��9��T�Gs1;�����Us�QX�?�V���c?SCa�	Q<7�3s].�+� �c�j�5T�����	i0����7�q�r^O�[�c�C_g��LB�-e��>v��%�y.�I�S��<�Mr�E`� ��r,�)w"���]�M��n�(��0�W1��a���Qp��v����u�^�t�]��4~#���xE��r����=������qC���\�7��4���l3��R����?��c��A��
}S�e1�����}V���i�6`��I����T��+PH��L�<
���o��[�3y��#�c?0�N|�������~��r�eJ����tF�gU����V9�7��� ��R�u�R���+��T�����EB=G�����o_Y:��Q�n�u�7V/�/�82��h>���H
aL���jM��B���5���W�J���Y�+���f���������_���T,�q���-�W��W^�|��
��in��F�J�S������\��7Z~OWmM�6������_��d��
�>MJ$Z����������I$7�/��g|V��a�FR�P�+9�����w`��Z�B��,���p�N��u�o�~�"$�#H^4E��?�+XKg~4!2d3��S��T�p�$1�R$�@�'���<M��P���\�7��4���8<K�]M@����1@��$K�����xW'M�:�7��4�O�Q�'����:'�����N��u�o�i�
�%�c���xW'M�:�7��4�O�1��mi�+���f����g��Tv�^
8�$U��,��N��mi�+���f����g��Vm:k��"EGlR��nd���8
a-��0�2�^e����y�Z�.��]k����u�2�^e����y�Z�.��]k����u�2�^e����y�Z�.��]k����u�2�^e����y�Z0u��.��]k����u�2�^e����y�Z�.��]k����u�2�^e����y�Z�.��]k����u�2�^e����y�Z�.��]k����u��2�;k����u�2�^e����y�Z�.��]k����u�2�^e����y�Z�.��]k����u�2�^e����y�Z�.��]k����u�2�^e��n-����.��]k����u�2�^e����y�Z�.��]k����u�2�^e����y�Z�.��]k����u�2�^e����y�Z�.��]k����u�,L���u�2�^e����y�Z�.��]k����u�2�^e����y�Z�.��]k����u�2�^e����y�Z�.�lJ3t9��
�%�c���xW'M�:�7��4�O�1��mi�+���f����g�����6����|�M�yM3�S���bx�Zo
���Y��������_�1<M�7�rt���x^SL�T�/��&����:o��i�/)�p*x���OkM�\�7��4���8<K��'�����N��u�o�i�
�%�c���xW'M�:�7��4�O�1��mi�+���f����g�����6����|�M�yM3�S���bx�Zo
���Y��������_�1<M�7�rt���x^SL�T�/�����Q8��8p5������xW'M�:�7��4�O��X��� "j*I��)�i�z����^�z����^�z����^�z���T���M���^�z����^�z����^�z����T���7��^�z����^�z����^�z����^����t��z����^�z����^�z����^�z����o?�^�z����^�z����^�z�]�!;t;~�
�%�[���F0�r��v+�����x<K��8��H38�@zX
��!d
�QM$��6���tH\�f2���{ha)�tL`����2�1Ix���1�������� ���(�1H�il�����b�5
�a�*:Q��R3i|
�%���	��rXe#��f�~�K(Q����*d�c]�a[� �}zZ;r^�o)@�4�XL$�J��.��������� T�_m��B�-�4>�. %��.|�2�n�����.�e\�Yb�]������_�����_�����_�����_�r"T0J�g���	V�a#BF���
$�fNV��x<K��C�f�"\i
� ��T�0��	���i��%1��jp����7��IA���*k.��.�U������K�RB@��a�P�:Q4x��	.A'��c;K�qm�Y�D
TX����
����0��D��t������qF�!����<K��p���Bk�%�,3x�
F��``�;�r�eD+<�",/��JM�! *��&��Tg��8��� P^|P>�
�79�F�m<���qiW�K""���a/).E������bH���6������*���������*x��>�*x��>�*x��>�*[���N������N�������r�
}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����j>,mD�M��������W���k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-}���_e����k���Z�-Q����(�kj��
pic-3.jpegimage/jpeg; name=pic-3.jpegDownload
20241129-i7-48-deform-master-5.txttext/plain; charset=US-ASCII; name=20241129-i7-48-deform-master-5.txtDownload
20241127-M3-48-deform-master-5.txttext/plain; charset=US-ASCII; name=20241127-M3-48-deform-master-5.txtDownload
20241129-i7-48-deform-patched-5.txttext/plain; charset=US-ASCII; name=20241129-i7-48-deform-patched-5.txtDownload
20241127-M3-48-deform-patched-5.txttext/plain; charset=US-ASCII; name=20241127-M3-48-deform-patched-5.txtDownload
#16David Rowley
dgrowleyml@gmail.com
In reply to: Victor Yegorov (#15)
5 attachment(s)
Re: Make tuple deformation faster

On Sat, 30 Nov 2024 at 02:54, Victor Yegorov <vyegorov@gmail.com> wrote:

I've been testing this patch for the last week, I have M3 and i7 based MBP around.

Thanks for having a look at this and running the benchmarks.

Construct
sizeof(FormData_pg_attribute) * (src)->natts
is used in 7 places (in various forms), I thought it might be good
to use a macro here, say TupleArraySize(natts).

I ended up adjusting the code here so that TupleDescSize() returns the
full size and TupleDescAttrAddress() manually calculates the offset to
start the FormData_pg_attribute array. That allows
TupleDescFullSize() to be deleted. I changed how TupleDescCopy()
works as it used to perform the memcpy in 2 parts. I've changed that
to now perform a single memcpy() and reset the ->attrs field after the
memcpy so that it correctly points to the address for its own
TupleDesc rather than the one from the source.

In v4-0002-Introduce-CompactAttribute-array-in-TupleDesc.patch

+#define COMPACT_ATTR_IS_PACKABLE(att) \
+>  ((att)->attlen == -1 && att->attispackable)

Seems second att needs parenthesis around it.

Adjusted. Thanks.

Although I haven't seen 30% speedup, I find this change very good to have.

I think there's a bit more juice to squeeze out still. I started
another thread for a much different approach to increasing the tuple
deform performance over in [1]/messages/by-id/CAApHDvo9e0XG71WrefYaRv5n4xNPLK4k8LjD0mSR3c9KR2vi2Q@mail.gmail.com. The benchmarks I showed over there
show the results with all the v4 patches on this thread plus that
patch, and also another set of results from just the v4 patches from
here. My Apple M2 very much likes the patch from the other thread. I
don't have any decent Intel hardware to test on.

I've attached a v5 set of patches, which I think addresses everything
you mentioned. I've also shuffled the patches around a little to how
I think they should be committed. Here's a summary:

v5-0001: Adds the CompactAttribute struct, includes it in TupleDesc
and adds all the code to populate it. Also includes a very small
number of users of CompactAttribute.

v5-0002: Adjusts dozens of locations to use CompactAttribute struct
instead of the Form_pg_attribute struct. Lots of churn, but not
complex changes. Separated out from v5-0001 so it's easier to see the
important changes 0001 is making.

v5-0003: Change CompactAttribute.attalign char field to attalignby to
uint8 field to optimise alignment calculations and remove branching.

v5-0004: Delete the now unused pg_attribute.attcacheoff column and
Form_pg_attribute field.

v5-0005: This is the patch from [1]/messages/by-id/CAApHDvo9e0XG71WrefYaRv5n4xNPLK4k8LjD0mSR3c9KR2vi2Q@mail.gmail.com rebased atop of this patch set.
I'll pick up the discussion on that thread, but offering a rebased
version here in case you'd like to try that one.

I spent all day today reviewing and fixing up a few missing comments
for the v5 patch series. I'm quite happy with these now. If nobody
else wants to look or test, I plan on pushing these tomorrow (Tuesday
UTC+13). If anyone wants me to delay so they can look, they better let
me know soon.

David

[1]: /messages/by-id/CAApHDvo9e0XG71WrefYaRv5n4xNPLK4k8LjD0mSR3c9KR2vi2Q@mail.gmail.com

Attachments:

v5-0001-Introduce-CompactAttribute-array-in-TupleDesc.patchapplication/octet-stream; name=v5-0001-Introduce-CompactAttribute-array-in-TupleDesc.patchDownload
From b032c2cc5bae8d1df9e47cc030e3f633015662ca Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 28 May 2024 13:49:07 +1200
Subject: [PATCH v5 1/5] Introduce CompactAttribute array in TupleDesc

The new compact_attrs array stores a few select fields from
FormData_pg_attribute in a more compact way, using only 16 bytes per
column instead of the 104 bytes that FormData_pg_attribute uses.  Using
CompactAttribute allows performance-critical operations such as tuple
deformation to be performed without looking at the FormData_pg_attribute
element in TupleDesc which means fewer cacheline accesses.  With this
change, NAMEDATALEN could be increased with a much smaller negative impact
on performance.

For some workloads, tuple deformation can be the most CPU intensive part
of processing the query.  Some testing with 16 columns on a table
where the first column is variable length showed around a 10% increase in
transactions per second for an OLAP type query performing aggregation on
the 16th column.  However, in certain cases, the increases were much
higher, up to ~25% on one AMD Zen4 machine.

This also makes pg_attribute.attcacheoff redundant.  A follow-on commit
will remove it, thus shrinking the FormData_pg_attribute struct by 4
bytes.

Author: David Rowley
Discussion: https://postgr.es/m/CAApHDvrBztXP3yx=NKNmo3xwFAFhEdyPnvrDg3=M0RhDs+4vYw@mail.gmail.com
Reviewed-by: Andres Freund, Victor Yegorov
---
 src/backend/access/common/heaptuple.c  | 53 +++++++-------
 src/backend/access/common/indextuple.c | 26 +++----
 src/backend/access/common/tupdesc.c    | 67 +++++++++++++++---
 src/backend/access/spgist/spgutils.c   |  4 +-
 src/backend/catalog/index.c            |  2 +
 src/backend/commands/tablecmds.c       |  4 ++
 src/backend/executor/execTuples.c      |  4 +-
 src/backend/utils/cache/relcache.c     | 21 ++++--
 src/backend/utils/cache/typcache.c     | 13 ++++
 src/include/access/htup_details.h      |  4 +-
 src/include/access/itup.h              | 10 +--
 src/include/access/tupdesc.h           | 97 +++++++++++++++++++++++++-
 src/include/access/tupmacs.h           |  5 +-
 src/tools/pgindent/typedefs.list       |  1 +
 14 files changed, 243 insertions(+), 68 deletions(-)

diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 9e3407bf98..982e7222c4 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -83,6 +83,10 @@
 #define VARLENA_ATT_IS_PACKABLE(att) \
 	((att)->attstorage != TYPSTORAGE_PLAIN)
 
+/* FormData_pg_attribute.attstorage != TYPSTORAGE_PLAIN and an attlen of -1 */
+#define COMPACT_ATTR_IS_PACKABLE(att) \
+	((att)->attlen == -1 && (att)->attispackable)
+
 /*
  * Setup for caching pass-by-ref missing attributes in a way that survives
  * tupleDesc destruction.
@@ -147,12 +151,12 @@ Datum
 getmissingattr(TupleDesc tupleDesc,
 			   int attnum, bool *isnull)
 {
-	Form_pg_attribute att;
+	CompactAttribute *att;
 
 	Assert(attnum <= tupleDesc->natts);
 	Assert(attnum > 0);
 
-	att = TupleDescAttr(tupleDesc, attnum - 1);
+	att = TupleDescCompactAttr(tupleDesc, attnum - 1);
 
 	if (att->atthasmissing)
 	{
@@ -223,15 +227,15 @@ heap_compute_data_size(TupleDesc tupleDesc,
 	for (i = 0; i < numberOfAttributes; i++)
 	{
 		Datum		val;
-		Form_pg_attribute atti;
+		CompactAttribute *atti;
 
 		if (isnull[i])
 			continue;
 
 		val = values[i];
-		atti = TupleDescAttr(tupleDesc, i);
+		atti = TupleDescCompactAttr(tupleDesc, i);
 
-		if (ATT_IS_PACKABLE(atti) &&
+		if (COMPACT_ATTR_IS_PACKABLE(atti) &&
 			VARATT_CAN_MAKE_SHORT(DatumGetPointer(val)))
 		{
 			/*
@@ -268,7 +272,7 @@ heap_compute_data_size(TupleDesc tupleDesc,
  * Fill in either a data value or a bit in the null bitmask
  */
 static inline void
-fill_val(Form_pg_attribute att,
+fill_val(CompactAttribute *att,
 		 bits8 **bit,
 		 int *bitmask,
 		 char **dataP,
@@ -349,8 +353,7 @@ fill_val(Form_pg_attribute att,
 			data_length = VARSIZE_SHORT(val);
 			memcpy(data, val, data_length);
 		}
-		else if (VARLENA_ATT_IS_PACKABLE(att) &&
-				 VARATT_CAN_MAKE_SHORT(val))
+		else if (att->attispackable && VARATT_CAN_MAKE_SHORT(val))
 		{
 			/* convert to short varlena -- no alignment */
 			data_length = VARATT_CONVERTED_SHORT_SIZE(val);
@@ -427,7 +430,7 @@ heap_fill_tuple(TupleDesc tupleDesc,
 
 	for (i = 0; i < numberOfAttributes; i++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupleDesc, i);
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, i);
 
 		fill_val(attr,
 				 bitP ? &bitP : NULL,
@@ -461,7 +464,8 @@ heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
 	Assert(!tupleDesc || attnum <= tupleDesc->natts);
 	if (attnum > (int) HeapTupleHeaderGetNatts(tup->t_data))
 	{
-		if (tupleDesc && TupleDescAttr(tupleDesc, attnum - 1)->atthasmissing)
+		if (tupleDesc &&
+			TupleDescCompactAttr(tupleDesc, attnum - 1)->atthasmissing)
 			return false;
 		else
 			return true;
@@ -570,13 +574,13 @@ nocachegetattr(HeapTuple tup,
 
 	if (!slow)
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		/*
 		 * If we get here, there are no nulls up to and including the target
 		 * attribute.  If we have a cached offset, we can use it.
 		 */
-		att = TupleDescAttr(tupleDesc, attnum);
+		att = TupleDescCompactAttr(tupleDesc, attnum);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, tp + att->attcacheoff);
 
@@ -591,7 +595,7 @@ nocachegetattr(HeapTuple tup,
 
 			for (j = 0; j <= attnum; j++)
 			{
-				if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
+				if (TupleDescCompactAttr(tupleDesc, j)->attlen <= 0)
 				{
 					slow = true;
 					break;
@@ -614,18 +618,18 @@ nocachegetattr(HeapTuple tup,
 		 * fixed-width columns, in hope of avoiding future visits to this
 		 * routine.
 		 */
-		TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(tupleDesc, 0)->attcacheoff = 0;
 
 		/* we might have set some offsets in the slow path previously */
-		while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
+		while (j < natts && TupleDescCompactAttr(tupleDesc, j)->attcacheoff > 0)
 			j++;
 
-		off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
-			TupleDescAttr(tupleDesc, j - 1)->attlen;
+		off = TupleDescCompactAttr(tupleDesc, j - 1)->attcacheoff +
+			TupleDescCompactAttr(tupleDesc, j - 1)->attlen;
 
 		for (; j < natts; j++)
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, j);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, j);
 
 			if (att->attlen <= 0)
 				break;
@@ -639,7 +643,7 @@ nocachegetattr(HeapTuple tup,
 
 		Assert(j > attnum);
 
-		off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
+		off = TupleDescCompactAttr(tupleDesc, attnum)->attcacheoff;
 	}
 	else
 	{
@@ -659,7 +663,7 @@ nocachegetattr(HeapTuple tup,
 		off = 0;
 		for (i = 0;; i++)		/* loop exit is at "break" */
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, i);
 
 			if (HeapTupleHasNulls(tup) && att_isnull(i, bp))
 			{
@@ -707,7 +711,7 @@ nocachegetattr(HeapTuple tup,
 		}
 	}
 
-	return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
+	return fetchatt(TupleDescCompactAttr(tupleDesc, attnum), tp + off);
 }
 
 /* ----------------
@@ -892,7 +896,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 		{
 			if (attrmiss[attnum].am_present)
 			{
-				Form_pg_attribute att = TupleDescAttr(tupleDesc, attnum);
+				CompactAttribute *att = TupleDescCompactAttr(tupleDesc, attnum);
 
 				targetDataLen = att_align_datum(targetDataLen,
 												att->attalign,
@@ -1020,8 +1024,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 	/* Now fill in the missing values */
 	for (attnum = sourceNatts; attnum < natts; attnum++)
 	{
-
-		Form_pg_attribute attr = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (attrmiss && attrmiss[attnum].am_present)
 		{
@@ -1370,7 +1373,7 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index bb2c6a2bcc..37133ed7f8 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -303,13 +303,13 @@ nocache_index_getattr(IndexTuple tup,
 
 	if (!slow)
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		/*
 		 * If we get here, there are no nulls up to and including the target
 		 * attribute.  If we have a cached offset, we can use it.
 		 */
-		att = TupleDescAttr(tupleDesc, attnum);
+		att = TupleDescCompactAttr(tupleDesc, attnum);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, tp + att->attcacheoff);
 
@@ -324,7 +324,7 @@ nocache_index_getattr(IndexTuple tup,
 
 			for (j = 0; j <= attnum; j++)
 			{
-				if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
+				if (TupleDescCompactAttr(tupleDesc, j)->attlen <= 0)
 				{
 					slow = true;
 					break;
@@ -347,18 +347,18 @@ nocache_index_getattr(IndexTuple tup,
 		 * fixed-width columns, in hope of avoiding future visits to this
 		 * routine.
 		 */
-		TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(tupleDesc, 0)->attcacheoff = 0;
 
 		/* we might have set some offsets in the slow path previously */
-		while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
+		while (j < natts && TupleDescCompactAttr(tupleDesc, j)->attcacheoff > 0)
 			j++;
 
-		off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
-			TupleDescAttr(tupleDesc, j - 1)->attlen;
+		off = TupleDescCompactAttr(tupleDesc, j - 1)->attcacheoff +
+			TupleDescCompactAttr(tupleDesc, j - 1)->attlen;
 
 		for (; j < natts; j++)
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, j);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, j);
 
 			if (att->attlen <= 0)
 				break;
@@ -372,7 +372,7 @@ nocache_index_getattr(IndexTuple tup,
 
 		Assert(j > attnum);
 
-		off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
+		off = TupleDescCompactAttr(tupleDesc, attnum)->attcacheoff;
 	}
 	else
 	{
@@ -392,7 +392,7 @@ nocache_index_getattr(IndexTuple tup,
 		off = 0;
 		for (i = 0;; i++)		/* loop exit is at "break" */
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, i);
 
 			if (IndexTupleHasNulls(tup) && att_isnull(i, bp))
 			{
@@ -440,7 +440,7 @@ nocache_index_getattr(IndexTuple tup,
 		}
 	}
 
-	return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
+	return fetchatt(TupleDescCompactAttr(tupleDesc, attnum), tp + off);
 }
 
 /*
@@ -490,7 +490,7 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDescriptor, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDescriptor, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
@@ -588,7 +588,7 @@ index_truncate_tuple(TupleDesc sourceDescriptor, IndexTuple source,
 		return CopyIndexTuple(source);
 
 	/* Create temporary descriptor to scribble on */
-	truncdesc = palloc(TupleDescSize(sourceDescriptor));
+	truncdesc = CreateTemplateTupleDesc(sourceDescriptor->natts);
 	TupleDescCopy(truncdesc, sourceDescriptor);
 	truncdesc->natts = leavenatts;
 
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 47379fef22..cbc1350b89 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -56,6 +56,33 @@ ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
 	ResourceOwnerForget(owner, PointerGetDatum(tupdesc), &tupdesc_resowner_desc);
 }
 
+/*
+ * populate_compact_attribute
+ *		Fills in the corresponding CompactAttribute element from the
+ *		Form_pg_attribute for the given attribute number.  This must be called
+ *		whenever a change is made to a Form_pg_attribute in the TupleDesc.
+ */
+void
+populate_compact_attribute(TupleDesc tupdesc, int attnum)
+{
+	Form_pg_attribute src = TupleDescAttr(tupdesc, attnum);
+	CompactAttribute *dst = &tupdesc->compact_attrs[attnum];
+
+	memset(dst, 0, sizeof(CompactAttribute));
+
+	dst->attcacheoff = -1;
+	dst->attlen = src->attlen;
+
+	dst->attbyval = src->attbyval;
+	dst->attispackable = (src->attstorage != TYPSTORAGE_PLAIN);
+	dst->atthasmissing = src->atthasmissing;
+	dst->attisdropped = src->attisdropped;
+	dst->attgenerated = (src->attgenerated != '\0');
+	dst->attnotnull = src->attnotnull;
+
+	dst->attalign = src->attalign;
+}
+
 /*
  * CreateTemplateTupleDesc
  *		This function allocates an empty tuple descriptor structure.
@@ -74,18 +101,19 @@ CreateTemplateTupleDesc(int natts)
 	Assert(natts >= 0);
 
 	/*
-	 * Allocate enough memory for the tuple descriptor, including the
-	 * attribute rows.
+	 * Allocate enough memory for the tuple descriptor, the CompactAttribute
+	 * array and also an array of the full FormData_pg_attribute data.
 	 *
-	 * Note: the attribute array stride is sizeof(FormData_pg_attribute),
-	 * since we declare the array elements as FormData_pg_attribute for
-	 * notational convenience.  However, we only guarantee that the first
+	 * Note: the 'attrs' array stride is sizeof(FormData_pg_attribute), since
+	 * we declare the array elements as FormData_pg_attribute for notational
+	 * convenience.  However, we only guarantee that the first
 	 * ATTRIBUTE_FIXED_PART_SIZE bytes of each entry are valid; most code that
 	 * copies tupdesc entries around copies just that much.  In principle that
 	 * could be less due to trailing padding, although with the current
 	 * definition of pg_attribute there probably isn't any padding.
 	 */
-	desc = (TupleDesc) palloc(offsetof(struct TupleDescData, attrs) +
+	desc = (TupleDesc) palloc(offsetof(struct TupleDescData, compact_attrs) +
+							  natts * sizeof(CompactAttribute) +
 							  natts * sizeof(FormData_pg_attribute));
 
 	/*
@@ -96,6 +124,7 @@ CreateTemplateTupleDesc(int natts)
 	desc->tdtypeid = RECORDOID;
 	desc->tdtypmod = -1;
 	desc->tdrefcount = -1;		/* assume not reference-counted */
+	desc->attrs = TupleDescAttrAddress(desc);
 
 	return desc;
 }
@@ -117,8 +146,10 @@ CreateTupleDesc(int natts, Form_pg_attribute *attrs)
 	desc = CreateTemplateTupleDesc(natts);
 
 	for (i = 0; i < natts; ++i)
+	{
 		memcpy(TupleDescAttr(desc, i), attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
-
+		populate_compact_attribute(desc, i);
+	}
 	return desc;
 }
 
@@ -155,6 +186,8 @@ CreateTupleDescCopy(TupleDesc tupdesc)
 		att->atthasmissing = false;
 		att->attidentity = '\0';
 		att->attgenerated = '\0';
+
+		populate_compact_attribute(desc, i);
 	}
 
 	/* We can copy the tuple type identification, too */
@@ -183,6 +216,9 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
 		   TupleDescAttr(tupdesc, 0),
 		   desc->natts * sizeof(FormData_pg_attribute));
 
+	for (i = 0; i < desc->natts; i++)
+		populate_compact_attribute(desc, i);
+
 	/* Copy the TupleConstr data structure, if any */
 	if (constr)
 	{
@@ -207,7 +243,7 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
 			{
 				if (constr->missing[i].am_present)
 				{
-					Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+					CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 					cpy->missing[i].am_value = datumCopy(constr->missing[i].am_value,
 														 attr->attbyval,
@@ -252,9 +288,12 @@ TupleDescCopy(TupleDesc dst, TupleDesc src)
 {
 	int			i;
 
-	/* Flat-copy the header and attribute array */
+	/* Flat-copy the header and attribute arrays */
 	memcpy(dst, src, TupleDescSize(src));
 
+	/* adjust 'attrs' to point to the dst array rather than the src's  */
+	dst->attrs = TupleDescAttrAddress(dst);
+
 	/*
 	 * Since we're not copying constraints and defaults, clear fields
 	 * associated with them.
@@ -268,6 +307,8 @@ TupleDescCopy(TupleDesc dst, TupleDesc src)
 		att->atthasmissing = false;
 		att->attidentity = '\0';
 		att->attgenerated = '\0';
+
+		populate_compact_attribute(dst, i);
 	}
 	dst->constr = NULL;
 
@@ -322,6 +363,8 @@ TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
 	dstAtt->atthasmissing = false;
 	dstAtt->attidentity = '\0';
 	dstAtt->attgenerated = '\0';
+
+	populate_compact_attribute(dst, dstAttno - 1);
 }
 
 /*
@@ -521,7 +564,7 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
 					return false;
 				if (missval1->am_present)
 				{
-					Form_pg_attribute missatt1 = TupleDescAttr(tupdesc1, i);
+					CompactAttribute *missatt1 = TupleDescCompactAttr(tupdesc1, i);
 
 					if (!datumIsEqual(missval1->am_value, missval2->am_value,
 									  missatt1->attbyval, missatt1->attlen))
@@ -714,6 +757,8 @@ TupleDescInitEntry(TupleDesc desc,
 	att->attcompression = InvalidCompressionMethod;
 	att->attcollation = typeForm->typcollation;
 
+	populate_compact_attribute(desc, attributeNumber - 1);
+
 	ReleaseSysCache(tuple);
 }
 
@@ -821,6 +866,8 @@ TupleDescInitBuiltinEntry(TupleDesc desc,
 		default:
 			elog(ERROR, "unsupported type %u", oidtypeid);
 	}
+
+	populate_compact_attribute(desc, attributeNumber - 1);
 }
 
 /*
diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c
index e93d9869b2..da85818217 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -331,7 +331,9 @@ getSpGistTupleDesc(Relation index, SpGistTypeDesc *keyType)
 		att->attcollation = InvalidOid;
 		/* In case we changed typlen, we'd better reset following offsets */
 		for (int i = spgFirstIncludeColumn; i < outTupDesc->natts; i++)
-			TupleDescAttr(outTupDesc, i)->attcacheoff = -1;
+			TupleDescCompactAttr(outTupDesc, i)->attcacheoff = -1;
+
+		populate_compact_attribute(outTupDesc, spgKeyColumn);
 	}
 	return outTupDesc;
 }
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 1c3a9e06d3..2a03a506c0 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -477,6 +477,8 @@ ConstructTupleDescriptor(Relation heapRelation,
 
 			ReleaseSysCache(tuple);
 		}
+
+		populate_compact_attribute(indexTupDesc, i);
 	}
 
 	pfree(amroutine);
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 6ccae4cb4a..4937478262 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -980,6 +980,8 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
 			cookedDefaults = lappend(cookedDefaults, cooked);
 			attr->atthasdef = true;
 		}
+
+		populate_compact_attribute(descriptor, attnum - 1);
 	}
 
 	/*
@@ -1396,6 +1398,8 @@ BuildDescForRelation(const List *columns)
 			att->attstorage = entry->storage;
 		else if (entry->storage_name)
 			att->attstorage = GetAttributeStorage(att->atttypid, entry->storage_name);
+
+		populate_compact_attribute(desc, attnum - 1);
 	}
 
 	return desc;
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 00dc339615..a09aa251e6 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -1044,7 +1044,7 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 
 	for (; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
@@ -2237,7 +2237,7 @@ BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
 	 */
 	for (i = 0; i < natts; i++)
 	{
-		if (!TupleDescAttr(tupdesc, i)->attisdropped)
+		if (!TupleDescCompactAttr(tupdesc, i)->attisdropped)
 		{
 			/* Non-dropped attributes */
 			dvalues[i] = InputFunctionCall(&attinmeta->attinfuncs[i],
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index d0892cee24..e230450d2c 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -585,6 +585,8 @@ RelationBuildTupleDesc(Relation relation)
 			   attp,
 			   ATTRIBUTE_FIXED_PART_SIZE);
 
+		populate_compact_attribute(relation->rd_att, attnum - 1);
+
 		/* Update constraint/default info */
 		if (attp->attnotnull)
 			constr->has_not_null = true;
@@ -674,12 +676,12 @@ RelationBuildTupleDesc(Relation relation)
 #endif
 
 	/*
-	 * However, we can easily set the attcacheoff value for the first
-	 * attribute: it must be zero.  This eliminates the need for special cases
-	 * for attnum=1 that used to exist in fastgetattr() and index_getattr().
+	 * We can easily set the attcacheoff value for the first attribute: it
+	 * must be zero.  This eliminates the need for special cases for attnum=1
+	 * that used to exist in fastgetattr() and index_getattr().
 	 */
 	if (RelationGetNumberOfAttributes(relation) > 0)
-		TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(relation->rd_att, 0)->attcacheoff = 0;
 
 	/*
 	 * Set up constraint/default info
@@ -1965,10 +1967,12 @@ formrdesc(const char *relationName, Oid relationReltype,
 		has_not_null |= attrs[i].attnotnull;
 		/* make sure attcacheoff is valid */
 		TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
+
+		populate_compact_attribute(relation->rd_att, i);
 	}
 
 	/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
-	TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
+	TupleDescCompactAttr(relation->rd_att, 0)->attcacheoff = 0;
 
 	/* mark not-null status */
 	if (has_not_null)
@@ -3579,6 +3583,7 @@ RelationBuildLocalRelation(const char *relname,
 		datt->attgenerated = satt->attgenerated;
 		datt->attnotnull = satt->attnotnull;
 		has_not_null |= satt->attnotnull;
+		populate_compact_attribute(rel->rd_att, i);
 	}
 
 	if (has_not_null)
@@ -4399,10 +4404,12 @@ BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs)
 		memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
 		/* make sure attcacheoff is valid */
 		TupleDescAttr(result, i)->attcacheoff = -1;
+
+		populate_compact_attribute(result, i);
 	}
 
 	/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
-	TupleDescAttr(result, 0)->attcacheoff = 0;
+	TupleDescCompactAttr(result, 0)->attcacheoff = 0;
 
 	/* Note: we don't bother to set up a TupleConstr entry */
 
@@ -6166,6 +6173,8 @@ load_relcache_init_file(bool shared)
 				goto read_failed;
 
 			has_not_null |= attr->attnotnull;
+
+			populate_compact_attribute(rel->rd_att, i);
 		}
 
 		/* next read the access method specific field */
diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
index 6590cbe5c6..8ce32a475f 100644
--- a/src/backend/utils/cache/typcache.c
+++ b/src/backend/utils/cache/typcache.c
@@ -241,12 +241,18 @@ shared_record_table_compare(const void *a, const void *b, size_t size,
 	TupleDesc	t2;
 
 	if (k1->shared)
+	{
 		t1 = (TupleDesc) dsa_get_address(area, k1->u.shared_tupdesc);
+		t1->attrs = TupleDescAttrAddress(t1);
+	}
 	else
 		t1 = k1->u.local_tupdesc;
 
 	if (k2->shared)
+	{
 		t2 = (TupleDesc) dsa_get_address(area, k2->u.shared_tupdesc);
+		t2->attrs = TupleDescAttrAddress(t2);
+	}
 	else
 		t2 = k2->u.local_tupdesc;
 
@@ -264,7 +270,10 @@ shared_record_table_hash(const void *a, size_t size, void *arg)
 	TupleDesc	t;
 
 	if (k->shared)
+	{
 		t = (TupleDesc) dsa_get_address(area, k->u.shared_tupdesc);
+		t->attrs = TupleDescAttrAddress(t);
+	}
 	else
 		t = k->u.local_tupdesc;
 
@@ -1867,6 +1876,7 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
 					tupdesc = (TupleDesc)
 						dsa_get_address(CurrentSession->area,
 										entry->shared_tupdesc);
+					tupdesc->attrs = TupleDescAttrAddress(tupdesc);
 					Assert(typmod == tupdesc->tdtypmod);
 
 					/* We may need to extend the local RecordCacheArray. */
@@ -2953,6 +2963,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 		result = (TupleDesc)
 			dsa_get_address(CurrentSession->area,
 							record_table_entry->key.u.shared_tupdesc);
+		result->attrs = TupleDescAttrAddress(result);
 		Assert(result->tdrefcount == -1);
 
 		return result;
@@ -3016,6 +3027,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 		result = (TupleDesc)
 			dsa_get_address(CurrentSession->area,
 							record_table_entry->key.u.shared_tupdesc);
+		result->attrs = TupleDescAttrAddress(result);
 		Assert(result->tdrefcount == -1);
 
 		return result;
@@ -3028,6 +3040,7 @@ find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
 						record_table_entry);
 	result = (TupleDesc)
 		dsa_get_address(CurrentSession->area, shared_dp);
+	result->attrs = TupleDescAttrAddress(result);
 	Assert(result->tdrefcount == -1);
 
 	return result;
diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h
index 5e38ef8696..0d1adff540 100644
--- a/src/include/access/htup_details.h
+++ b/src/include/access/htup_details.h
@@ -758,9 +758,9 @@ fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 	*isnull = false;
 	if (HeapTupleNoNulls(tup))
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
-		att = TupleDescAttr(tupleDesc, attnum - 1);
+		att = TupleDescCompactAttr(tupleDesc, attnum - 1);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, (char *) tup->t_data + tup->t_data->t_hoff +
 							att->attcacheoff);
diff --git a/src/include/access/itup.h b/src/include/access/itup.h
index 94885751e5..4393b19a7f 100644
--- a/src/include/access/itup.h
+++ b/src/include/access/itup.h
@@ -124,11 +124,13 @@ index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 
 	if (!IndexTupleHasNulls(tup))
 	{
-		if (TupleDescAttr(tupleDesc, attnum - 1)->attcacheoff >= 0)
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, attnum - 1);
+
+		if (attr->attcacheoff >= 0)
 		{
-			return fetchatt(TupleDescAttr(tupleDesc, attnum - 1),
-							(char *) tup + IndexInfoFindDataOffset(tup->t_info)
-							+ TupleDescAttr(tupleDesc, attnum - 1)->attcacheoff);
+			return fetchatt(attr,
+							(char *) tup + IndexInfoFindDataOffset(tup->t_info) +
+							attr->attcacheoff);
 		}
 		else
 			return nocache_index_getattr(tup, attnum, tupleDesc);
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 8930a28d66..bca2ae8afb 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -45,6 +45,39 @@ typedef struct TupleConstr
 	bool		has_generated_stored;
 } TupleConstr;
 
+/*
+ * CompactAttribute
+ *		Cut-down version of FormData_pg_attribute for faster access for tasks
+ *		such as tuple deformation.  These values are populated using the
+ *		populate_compact_attribute function, which must be called directly
+ *		after the FormData_pg_attribute struct is populated or altered in any
+ *		way.
+ *
+ * Currently, this struct is 16 bytes.  Any code changes which enlarge this
+ * struct should be considered very carefully.
+ *
+ * Code which must access a TupleDesc's attribute data should always make use
+ * of the CompactAttribute when the required fields are available there.  It's
+ * more efficient to access the memory in CompactAttribute due to it both
+ * being a more compact representation of FormData_pg_attribute, but also
+ * because accessing the FormData_pg_attribute requires an additional pointer
+ * indirection through TupleDescData.attrs
+ */
+typedef struct CompactAttribute
+{
+	int32		attcacheoff;	/* fixed offset into tuple, if known, or -1 */
+	int16		attlen;			/* attr len in bytes or -1 = varlen, -2 =
+								 * cstring */
+	bool		attbyval;		/* as FormData_pg_attribute.attbyval */
+	bool		attispackable;	/* FormData_pg_attribute.attstorage !=
+								 * TYPSTORAGE_PLAIN */
+	bool		atthasmissing;	/* as FormData_pg_attribute.atthasmissing */
+	bool		attisdropped;	/* as FormData_pg_attribute.attisdropped */
+	bool		attgenerated;	/* FormData_pg_attribute.attgenerated != '\0' */
+	bool		attnotnull;		/* as FormData_pg_attribute.attnotnull */
+	char		attalign;		/* alignment requirement */
+} CompactAttribute;
+
 /*
  * This struct is passed around within the backend to describe the structure
  * of tuples.  For tuples coming from on-disk relations, the information is
@@ -75,6 +108,18 @@ typedef struct TupleConstr
  * context and go away when the context is freed.  We set the tdrefcount
  * field of such a descriptor to -1, while reference-counted descriptors
  * always have tdrefcount >= 0.
+ *
+ * The attrs field stores the fixed-sized portion of FormData_pg_attribute.
+ * Because that struct is large, we also store a corresponding
+ * CompactAttribute for each attribute in compact_attrs.  compact_attrs is
+ * stored inline with the struct.  Because CompactAttribute is significantly
+ * smaller than FormData_pg_attribute, code, especially performance-critical
+ * code, should prioritize using the fields from the CompactAttribute over the
+ * equivalent fields in FormData_pg_attribute whenever possible.
+ *
+ * Any code making changes manually to the fields in 'attrs' must subsequently
+ * call populate_compact_attribute() to flush the changes out to the
+ * corresponding 'compact_attrs' element.
  */
 typedef struct TupleDescData
 {
@@ -84,13 +129,53 @@ typedef struct TupleDescData
 	int			tdrefcount;		/* reference count, or -1 if not counting */
 	TupleConstr *constr;		/* constraints, or NULL if none */
 	/* attrs[N] is the description of Attribute Number N+1 */
-	FormData_pg_attribute attrs[FLEXIBLE_ARRAY_MEMBER];
+	FormData_pg_attribute *attrs;
+	CompactAttribute compact_attrs[FLEXIBLE_ARRAY_MEMBER];
 }			TupleDescData;
 typedef struct TupleDescData *TupleDesc;
 
-/* Accessor for the i'th attribute of tupdesc. */
+extern void populate_compact_attribute(TupleDesc tupdesc, int attnum);
+
+/* Accessor for the i'th FormData_pg_attribute of tupdesc. */
 #define TupleDescAttr(tupdesc, i) (&(tupdesc)->attrs[(i)])
 
+/*
+ * Accessor for the i'th CompactAttribute of tupdesc.
+ */
+static inline CompactAttribute *
+TupleDescCompactAttr(TupleDesc tupdesc, int i)
+{
+	CompactAttribute *cattr = &tupdesc->compact_attrs[i];
+#ifdef USE_ASSERT_CHECKING
+	CompactAttribute snapshot;
+
+	/*
+	 * In Assert enabled builds we verify that the CompactAttribute is
+	 * populated correctly.  This helps find bugs in places such as ALTER
+	 * TABLE where code makes changes to the FormData_pg_attribute but forgets
+	 * to call populate_compact_attribute.
+	 */
+
+	/*
+	 * Take a snapshot of how the CompactAttribute is now before calling
+	 * populate_compact_attribute to make it up-to-date with the
+	 * FormData_pg_attribute.
+	 */
+	memcpy(&snapshot, cattr, sizeof(CompactAttribute));
+
+	populate_compact_attribute(tupdesc, i);
+
+	/* reset attcacheoff back to what it was */
+	cattr->attcacheoff = snapshot.attcacheoff;
+
+	/* Ensure the snapshot matches the freshly populated CompactAttribute */
+	Assert(memcmp(&snapshot, cattr, sizeof(CompactAttribute)) == 0);
+#endif
+
+	return cattr;
+}
+
+
 extern TupleDesc CreateTemplateTupleDesc(int natts);
 
 extern TupleDesc CreateTupleDesc(int natts, Form_pg_attribute *attrs);
@@ -100,9 +185,15 @@ extern TupleDesc CreateTupleDescCopy(TupleDesc tupdesc);
 extern TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc);
 
 #define TupleDescSize(src) \
-	(offsetof(struct TupleDescData, attrs) + \
+	(offsetof(struct TupleDescData, compact_attrs) + \
+	 (src)->natts * sizeof(CompactAttribute) + \
 	 (src)->natts * sizeof(FormData_pg_attribute))
 
+#define TupleDescAttrAddress(desc) \
+	(Form_pg_attribute) ((char *) (desc) + \
+	 (offsetof(struct TupleDescData, compact_attrs) + \
+	 (desc)->natts * sizeof(CompactAttribute)))
+
 extern void TupleDescCopy(TupleDesc dst, TupleDesc src);
 
 extern void TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index 58b3a58cfd..622adfa5f8 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -14,6 +14,7 @@
 #ifndef TUPMACS_H
 #define TUPMACS_H
 
+#include "access/tupdesc.h"
 #include "catalog/pg_type_d.h"	/* for TYPALIGN macros */
 
 
@@ -30,8 +31,8 @@ att_isnull(int ATT, const bits8 *BITS)
 
 #ifndef FRONTEND
 /*
- * Given a Form_pg_attribute and a pointer into a tuple's data area,
- * return the correct value or pointer.
+ * Given a Form_pg_attribute or CompactAttribute and a pointer into a tuple's
+ * data area, return the correct value or pointer.
  *
  * We return a Datum value in all cases.  If the attribute has "byval" false,
  * we return the same pointer into the tuple data area that we're passed.
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index 2d4c870423..dd5c8867d2 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -454,6 +454,7 @@ CommitTimestampEntry
 CommitTimestampShared
 CommonEntry
 CommonTableExpr
+CompactAttribute
 CompareScalarsContext
 CompiledExprState
 CompositeIOData
-- 
2.34.1

v5-0002-Use-CompactAttribute-instead-of-FormData_pg_attri.patchapplication/octet-stream; name=v5-0002-Use-CompactAttribute-instead-of-FormData_pg_attri.patchDownload
From 5cef2ced3221252f6dda1d2fd82149485bc7d22d Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Mon, 2 Dec 2024 13:39:04 +1300
Subject: [PATCH v5 2/5] Use CompactAttribute instead of FormData_pg_attribute

This adds more usages of TupleDesc's CompactAttribute rather than using
FormData_pg_attribute.

Author: David Rowley
Discussion: https://postgr.es/m/CAApHDvrBztXP3yx=NKNmo3xwFAFhEdyPnvrDg3=M0RhDs+4vYw@mail.gmail.com
---
 contrib/amcheck/verify_heapam.c             |  4 ++--
 contrib/pageinspect/heapfuncs.c             |  4 ++--
 contrib/postgres_fdw/postgres_fdw.c         |  6 +++---
 src/backend/access/brin/brin_inclusion.c    |  8 ++++----
 src/backend/access/brin/brin_tuple.c        |  2 +-
 src/backend/access/common/attmap.c          |  8 +++++---
 src/backend/access/gin/ginbulk.c            |  4 ++--
 src/backend/access/gin/ginget.c             |  4 ++--
 src/backend/access/gist/gistbuild.c         |  6 ++++--
 src/backend/access/heap/heapam.c            |  8 ++++----
 src/backend/access/heap/heapam_handler.c    |  2 +-
 src/backend/access/heap/heaptoast.c         |  6 +++---
 src/backend/access/nbtree/nbtutils.c        |  4 ++--
 src/backend/access/spgist/spgdoinsert.c     |  2 +-
 src/backend/access/table/toast_helper.c     |  2 +-
 src/backend/commands/copy.c                 |  6 +++---
 src/backend/executor/execExpr.c             |  4 ++--
 src/backend/executor/execExprInterp.c       |  6 +++---
 src/backend/executor/execJunk.c             |  2 +-
 src/backend/executor/execTuples.c           |  4 ++--
 src/backend/executor/functions.c            |  2 +-
 src/backend/executor/nodeMemoize.c          |  8 ++++----
 src/backend/executor/nodeModifyTable.c      |  4 ++--
 src/backend/executor/nodeValuesscan.c       |  4 ++--
 src/backend/executor/tstoreReceiver.c       |  4 ++--
 src/backend/jit/llvm/llvmjit_deform.c       |  4 ++--
 src/backend/optimizer/util/plancat.c        |  4 ++--
 src/backend/replication/pgoutput/pgoutput.c |  2 +-
 src/backend/utils/adt/expandedrecord.c      | 10 +++++-----
 src/backend/utils/adt/ri_triggers.c         |  2 +-
 30 files changed, 70 insertions(+), 66 deletions(-)

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index 9c74daacee..f6d91aaa74 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1571,11 +1571,11 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	struct varlena *attr;
 	char	   *tp;				/* pointer to the tuple data */
 	uint16		infomask;
-	Form_pg_attribute thisatt;
+	CompactAttribute *thisatt;
 	struct varatt_external toast_pointer;
 
 	infomask = ctx->tuphdr->t_infomask;
-	thisatt = TupleDescAttr(RelationGetDescr(ctx->rel), ctx->attnum);
+	thisatt = TupleDescCompactAttr(RelationGetDescr(ctx->rel), ctx->attnum);
 
 	tp = (char *) ctx->tuphdr + ctx->tuphdr->t_hoff;
 
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 3dc705e43f..8c1b7d38aa 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -334,11 +334,11 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 
 	for (i = 0; i < nattrs; i++)
 	{
-		Form_pg_attribute attr;
+		CompactAttribute *attr;
 		bool		is_null;
 		bytea	   *attr_data = NULL;
 
-		attr = TupleDescAttr(tupdesc, i);
+		attr = TupleDescCompactAttr(tupdesc, i);
 
 		/*
 		 * Tuple header can specify fewer attributes than tuple descriptor as
diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index c0810fbd7c..cf56434118 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -1818,7 +1818,7 @@ postgresPlanForeignModify(PlannerInfo *root,
 
 		for (attnum = 1; attnum <= tupdesc->natts; attnum++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+			CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
 
 			if (!attr->attisdropped)
 				targetAttrs = lappend_int(targetAttrs, attnum);
@@ -2191,7 +2191,7 @@ postgresBeginForeignInsert(ModifyTableState *mtstate,
 	/* We transmit all columns that are defined in the foreign table. */
 	for (attnum = 1; attnum <= tupdesc->natts; attnum++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
 
 		if (!attr->attisdropped)
 			targetAttrs = lappend_int(targetAttrs, attnum);
@@ -4311,7 +4311,7 @@ convert_prep_stmt_params(PgFdwModifyState *fmstate,
 			foreach(lc, fmstate->target_attrs)
 			{
 				int			attnum = lfirst_int(lc);
-				Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+				CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
 				Datum		value;
 				bool		isnull;
 
diff --git a/src/backend/access/brin/brin_inclusion.c b/src/backend/access/brin/brin_inclusion.c
index 750276998c..faec0a9da8 100644
--- a/src/backend/access/brin/brin_inclusion.c
+++ b/src/backend/access/brin/brin_inclusion.c
@@ -146,12 +146,12 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
 	Datum		result;
 	bool		new = false;
 	AttrNumber	attno;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 
 	Assert(!isnull);
 
 	attno = column->bv_attno;
-	attr = TupleDescAttr(bdesc->bd_tupdesc, attno - 1);
+	attr = TupleDescCompactAttr(bdesc->bd_tupdesc, attno - 1);
 
 	/*
 	 * If the recorded value is null, copy the new value (which we know to be
@@ -479,7 +479,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	BrinValues *col_b = (BrinValues *) PG_GETARG_POINTER(2);
 	Oid			colloid = PG_GET_COLLATION();
 	AttrNumber	attno;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 	FmgrInfo   *finfo;
 	Datum		result;
 
@@ -487,7 +487,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
 	Assert(!col_a->bv_allnulls && !col_b->bv_allnulls);
 
 	attno = col_a->bv_attno;
-	attr = TupleDescAttr(bdesc->bd_tupdesc, attno - 1);
+	attr = TupleDescCompactAttr(bdesc->bd_tupdesc, attno - 1);
 
 	/* If B includes empty elements, mark A similarly, if needed. */
 	if (!DatumGetBool(col_a->bv_values[INCLUSION_CONTAINS_EMPTY]) &&
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index 997eb6d822..aae646be5d 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -699,7 +699,7 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
 			 datumno < brdesc->bd_info[attnum]->oi_nstored;
 			 datumno++)
 		{
-			Form_pg_attribute thisatt = TupleDescAttr(diskdsc, stored);
+			CompactAttribute *thisatt = TupleDescCompactAttr(diskdsc, stored);
 
 			if (thisatt->attlen == -1)
 			{
diff --git a/src/backend/access/common/attmap.c b/src/backend/access/common/attmap.c
index b0fe27ef57..0805c4121e 100644
--- a/src/backend/access/common/attmap.c
+++ b/src/backend/access/common/attmap.c
@@ -135,7 +135,7 @@ build_attrmap_by_position(TupleDesc indesc,
 	/* Check for unused input columns */
 	for (; j < indesc->natts; j++)
 	{
-		if (TupleDescAttr(indesc, j)->attisdropped)
+		if (TupleDescCompactAttr(indesc, j)->attisdropped)
 			continue;
 		nincols++;
 		same = false;			/* we'll complain below */
@@ -299,8 +299,8 @@ check_attrmap_match(TupleDesc indesc,
 
 	for (i = 0; i < attrMap->maplen; i++)
 	{
-		Form_pg_attribute inatt = TupleDescAttr(indesc, i);
-		Form_pg_attribute outatt = TupleDescAttr(outdesc, i);
+		CompactAttribute *inatt = TupleDescCompactAttr(indesc, i);
+		CompactAttribute *outatt;
 
 		/*
 		 * If the input column has a missing attribute, we need a conversion.
@@ -311,6 +311,8 @@ check_attrmap_match(TupleDesc indesc,
 		if (attrMap->attnums[i] == (i + 1))
 			continue;
 
+		outatt = TupleDescCompactAttr(outdesc, i);
+
 		/*
 		 * If it's a dropped column and the corresponding input column is also
 		 * dropped, we don't need a conversion.  However, attlen and attalign
diff --git a/src/backend/access/gin/ginbulk.c b/src/backend/access/gin/ginbulk.c
index f08b66ab79..d86b75bd63 100644
--- a/src/backend/access/gin/ginbulk.c
+++ b/src/backend/access/gin/ginbulk.c
@@ -127,10 +127,10 @@ ginInitBA(BuildAccumulator *accum)
 static Datum
 getDatumCopy(BuildAccumulator *accum, OffsetNumber attnum, Datum value)
 {
-	Form_pg_attribute att;
+	CompactAttribute *att;
 	Datum		res;
 
-	att = TupleDescAttr(accum->ginstate->origTupdesc, attnum - 1);
+	att = TupleDescCompactAttr(accum->ginstate->origTupdesc, attnum - 1);
 	if (att->attbyval)
 		res = value;
 	else
diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c
index 0b4f2ebadb..2e347b6a32 100644
--- a/src/backend/access/gin/ginget.c
+++ b/src/backend/access/gin/ginget.c
@@ -122,7 +122,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 				   GinScanEntry scanEntry, Snapshot snapshot)
 {
 	OffsetNumber attnum;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 
 	/* Initialize empty bitmap result */
 	scanEntry->matchBitmap = tbm_create(work_mem * 1024L, NULL);
@@ -134,7 +134,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 
 	/* Locate tupdesc entry for key column (for attbyval/attlen data) */
 	attnum = scanEntry->attnum;
-	attr = TupleDescAttr(btree->ginstate->origTupdesc, attnum - 1);
+	attr = TupleDescCompactAttr(btree->ginstate->origTupdesc, attnum - 1);
 
 	/*
 	 * Predicate lock entry leaf page, following pages will be locked by
diff --git a/src/backend/access/gist/gistbuild.c b/src/backend/access/gist/gistbuild.c
index 63d1914b37..3a2759b446 100644
--- a/src/backend/access/gist/gistbuild.c
+++ b/src/backend/access/gist/gistbuild.c
@@ -657,10 +657,12 @@ gistInitBuffering(GISTBuildState *buildstate)
 	itupMinSize = (Size) MAXALIGN(sizeof(IndexTupleData));
 	for (i = 0; i < index->rd_att->natts; i++)
 	{
-		if (TupleDescAttr(index->rd_att, i)->attlen < 0)
+		CompactAttribute *attr = TupleDescCompactAttr(index->rd_att, i);
+
+		if (attr->attlen < 0)
 			itupMinSize += VARHDRSZ;
 		else
-			itupMinSize += TupleDescAttr(index->rd_att, i)->attlen;
+			itupMinSize += attr->attlen;
 	}
 
 	/* Calculate average and maximal number of index tuples which fit to page */
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index d00300c5dc..207e313bda 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -4197,8 +4197,6 @@ static bool
 heap_attr_equals(TupleDesc tupdesc, int attrnum, Datum value1, Datum value2,
 				 bool isnull1, bool isnull2)
 {
-	Form_pg_attribute att;
-
 	/*
 	 * If one value is NULL and other is not, then they are certainly not
 	 * equal
@@ -4228,8 +4226,10 @@ heap_attr_equals(TupleDesc tupdesc, int attrnum, Datum value1, Datum value2,
 	}
 	else
 	{
+		CompactAttribute *att;
+
 		Assert(attrnum <= tupdesc->natts);
-		att = TupleDescAttr(tupdesc, attrnum - 1);
+		att = TupleDescCompactAttr(tupdesc, attrnum - 1);
 		return datumIsEqual(value1, value2, att->attbyval, att->attlen);
 	}
 }
@@ -4311,7 +4311,7 @@ HeapDetermineColumnsInfo(Relation relation,
 		 * that system attributes can't be stored externally.
 		 */
 		if (attrnum < 0 || isnull1 ||
-			TupleDescAttr(tupdesc, attrnum - 1)->attlen != -1)
+			TupleDescCompactAttr(tupdesc, attrnum - 1)->attlen != -1)
 			continue;
 
 		/*
diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c
index a8d95e0f1c..ee1392facf 100644
--- a/src/backend/access/heap/heapam_handler.c
+++ b/src/backend/access/heap/heapam_handler.c
@@ -2553,7 +2553,7 @@ reform_and_rewrite_tuple(HeapTuple tuple,
 	/* Be sure to null out any dropped columns */
 	for (i = 0; i < newTupDesc->natts; i++)
 	{
-		if (TupleDescAttr(newTupDesc, i)->attisdropped)
+		if (TupleDescCompactAttr(newTupDesc, i)->attisdropped)
 			isnull[i] = true;
 	}
 
diff --git a/src/backend/access/heap/heaptoast.c b/src/backend/access/heap/heaptoast.c
index a420e16530..c3a85d8d32 100644
--- a/src/backend/access/heap/heaptoast.c
+++ b/src/backend/access/heap/heaptoast.c
@@ -369,7 +369,7 @@ toast_flatten_tuple(HeapTuple tup, TupleDesc tupleDesc)
 		/*
 		 * Look at non-null varlena attributes
 		 */
-		if (!toast_isnull[i] && TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (!toast_isnull[i] && TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
@@ -483,7 +483,7 @@ toast_flatten_tuple_to_datum(HeapTupleHeader tup,
 		 */
 		if (toast_isnull[i])
 			has_nulls = true;
-		else if (TupleDescAttr(tupleDesc, i)->attlen == -1)
+		else if (TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
@@ -584,7 +584,7 @@ toast_build_flattened_tuple(TupleDesc tupleDesc,
 		/*
 		 * Look at non-null varlena attributes
 		 */
-		if (!isnull[i] && TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (!isnull[i] && TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			struct varlena *new_value;
 
diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c
index 50cbf06cb4..e5e4f3bfbb 100644
--- a/src/backend/access/nbtree/nbtutils.c
+++ b/src/backend/access/nbtree/nbtutils.c
@@ -4886,11 +4886,11 @@ _bt_keep_natts_fast(Relation rel, IndexTuple lastleft, IndexTuple firstright)
 					datum2;
 		bool		isNull1,
 					isNull2;
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		datum1 = index_getattr(lastleft, attnum, itupdesc, &isNull1);
 		datum2 = index_getattr(firstright, attnum, itupdesc, &isNull2);
-		att = TupleDescAttr(itupdesc, attnum - 1);
+		att = TupleDescCompactAttr(itupdesc, attnum - 1);
 
 		if (isNull1 != isNull2)
 			break;
diff --git a/src/backend/access/spgist/spgdoinsert.c b/src/backend/access/spgist/spgdoinsert.c
index a4995c168b..2cb7ce43ba 100644
--- a/src/backend/access/spgist/spgdoinsert.c
+++ b/src/backend/access/spgist/spgdoinsert.c
@@ -1974,7 +1974,7 @@ spgdoinsert(Relation index, SpGistState *state,
 	{
 		if (!isnulls[i])
 		{
-			if (TupleDescAttr(leafDescriptor, i)->attlen == -1)
+			if (TupleDescCompactAttr(leafDescriptor, i)->attlen == -1)
 				leafDatums[i] = PointerGetDatum(PG_DETOAST_DATUM(datums[i]));
 			else
 				leafDatums[i] = datums[i];
diff --git a/src/backend/access/table/toast_helper.c b/src/backend/access/table/toast_helper.c
index 53224932f0..b16fd21b8d 100644
--- a/src/backend/access/table/toast_helper.c
+++ b/src/backend/access/table/toast_helper.c
@@ -324,7 +324,7 @@ toast_delete_external(Relation rel, const Datum *values, const bool *isnull,
 
 	for (i = 0; i < numAttrs; i++)
 	{
-		if (TupleDescAttr(tupleDesc, i)->attlen == -1)
+		if (TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
 		{
 			Datum		value = values[i];
 
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 2d98ecf3f4..edcdb7c2d4 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -954,9 +954,9 @@ CopyGetAttnums(TupleDesc tupDesc, Relation rel, List *attnamelist)
 
 		for (i = 0; i < attr_count; i++)
 		{
-			if (TupleDescAttr(tupDesc, i)->attisdropped)
-				continue;
-			if (TupleDescAttr(tupDesc, i)->attgenerated)
+			CompactAttribute *attr = TupleDescCompactAttr(tupDesc, i);
+
+			if (attr->attisdropped || attr->attgenerated)
 				continue;
 			attnums = lappend_int(attnums, i + 1);
 		}
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index e0eb96fd5a..0737207862 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -598,7 +598,7 @@ ExecBuildUpdateProjection(List *targetList,
 	 */
 	for (int attnum = relDesc->natts; attnum > 0; attnum--)
 	{
-		Form_pg_attribute attr = TupleDescAttr(relDesc, attnum - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(relDesc, attnum - 1);
 
 		if (attr->attisdropped)
 			continue;
@@ -694,7 +694,7 @@ ExecBuildUpdateProjection(List *targetList,
 	 */
 	for (int attnum = 1; attnum <= relDesc->natts; attnum++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(relDesc, attnum - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(relDesc, attnum - 1);
 
 		if (attr->attisdropped)
 		{
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index bad7b195bf..a2e5e19e4a 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -2948,7 +2948,7 @@ ExecEvalRowNullInt(ExprState *state, ExprEvalStep *op,
 	for (int att = 1; att <= tupDesc->natts; att++)
 	{
 		/* ignore dropped columns */
-		if (TupleDescAttr(tupDesc, att - 1)->attisdropped)
+		if (TupleDescCompactAttr(tupDesc, att - 1)->attisdropped)
 			continue;
 		if (heap_attisnull(&tmptup, att, tupDesc))
 		{
@@ -5092,8 +5092,8 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
 
 		for (int i = 0; i < var_tupdesc->natts; i++)
 		{
-			Form_pg_attribute vattr = TupleDescAttr(var_tupdesc, i);
-			Form_pg_attribute sattr = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *vattr = TupleDescCompactAttr(var_tupdesc, i);
+			CompactAttribute *sattr = TupleDescCompactAttr(tupleDesc, i);
 
 			if (!vattr->attisdropped)
 				continue;		/* already checked non-dropped cols */
diff --git a/src/backend/executor/execJunk.c b/src/backend/executor/execJunk.c
index b962c31383..7d0afca418 100644
--- a/src/backend/executor/execJunk.c
+++ b/src/backend/executor/execJunk.c
@@ -169,7 +169,7 @@ ExecInitJunkFilterConversion(List *targetList,
 		t = list_head(targetList);
 		for (i = 0; i < cleanLength; i++)
 		{
-			if (TupleDescAttr(cleanTupType, i)->attisdropped)
+			if (TupleDescCompactAttr(cleanTupType, i)->attisdropped)
 				continue;		/* map entry is already zero */
 			for (;;)
 			{
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index a09aa251e6..875515777b 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -187,7 +187,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 	/* compute size of memory required */
 	for (int natt = 0; natt < desc->natts; natt++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, natt);
+		CompactAttribute *att = TupleDescCompactAttr(desc, natt);
 		Datum		val;
 
 		if (att->attbyval || slot->tts_isnull[natt])
@@ -223,7 +223,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 	/* and copy all attributes into the pre-allocated space */
 	for (int natt = 0; natt < desc->natts; natt++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, natt);
+		CompactAttribute *att = TupleDescCompactAttr(desc, natt);
 		Datum		val;
 
 		if (att->attbyval || slot->tts_isnull[natt])
diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c
index 8d1fda2ddc..5d52e0ab81 100644
--- a/src/backend/executor/functions.c
+++ b/src/backend/executor/functions.c
@@ -1886,7 +1886,7 @@ check_sql_fn_retval(List *queryTreeLists,
 		/* remaining columns in rettupdesc had better all be dropped */
 		for (colindex++; colindex <= tupnatts; colindex++)
 		{
-			if (!TupleDescAttr(rettupdesc, colindex - 1)->attisdropped)
+			if (!TupleDescCompactAttr(rettupdesc, colindex - 1)->attisdropped)
 				ereport(ERROR,
 						(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
 						 errmsg("return type mismatch in function declared to return %s",
diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c
index df8e3fff08..aff3d9d921 100644
--- a/src/backend/executor/nodeMemoize.c
+++ b/src/backend/executor/nodeMemoize.c
@@ -175,10 +175,10 @@ MemoizeHash_hash(struct memoize_hash *tb, const MemoizeKey *key)
 
 			if (!pslot->tts_isnull[i])	/* treat nulls as having hash key 0 */
 			{
-				Form_pg_attribute attr;
+				CompactAttribute *attr;
 				uint32		hkey;
 
-				attr = TupleDescAttr(pslot->tts_tupleDescriptor, i);
+				attr = TupleDescCompactAttr(pslot->tts_tupleDescriptor, i);
 
 				hkey = datum_image_hash(pslot->tts_values[i], attr->attbyval, attr->attlen);
 
@@ -242,7 +242,7 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
 
 		for (int i = 0; i < numkeys; i++)
 		{
-			Form_pg_attribute attr;
+			CompactAttribute *attr;
 
 			if (tslot->tts_isnull[i] != pslot->tts_isnull[i])
 			{
@@ -255,7 +255,7 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
 				continue;
 
 			/* perform binary comparison on the two datums */
-			attr = TupleDescAttr(tslot->tts_tupleDescriptor, i);
+			attr = TupleDescCompactAttr(tslot->tts_tupleDescriptor, i);
 			if (!datum_image_eq(tslot->tts_values[i], pslot->tts_values[i],
 								attr->attbyval, attr->attlen))
 			{
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 1161520f76..c445c433df 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -496,14 +496,14 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
 
 	for (int i = 0; i < natts; i++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+		CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 		if (ri_GeneratedExprs[i])
 		{
 			Datum		val;
 			bool		isnull;
 
-			Assert(attr->attgenerated == ATTRIBUTE_GENERATED_STORED);
+			Assert(TupleDescAttr(tupdesc, i)->attgenerated == ATTRIBUTE_GENERATED_STORED);
 
 			econtext->ecxt_scantuple = slot;
 
diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c
index 92948917a0..9838977f08 100644
--- a/src/backend/executor/nodeValuesscan.c
+++ b/src/backend/executor/nodeValuesscan.c
@@ -142,8 +142,8 @@ ValuesNext(ValuesScanState *node)
 		foreach(lc, exprstatelist)
 		{
 			ExprState  *estate = (ExprState *) lfirst(lc);
-			Form_pg_attribute attr = TupleDescAttr(slot->tts_tupleDescriptor,
-												   resind);
+			CompactAttribute *attr = TupleDescCompactAttr(slot->tts_tupleDescriptor,
+														  resind);
 
 			values[resind] = ExecEvalExpr(estate,
 										  econtext,
diff --git a/src/backend/executor/tstoreReceiver.c b/src/backend/executor/tstoreReceiver.c
index de4646b5c2..658d1724c8 100644
--- a/src/backend/executor/tstoreReceiver.c
+++ b/src/backend/executor/tstoreReceiver.c
@@ -65,7 +65,7 @@ tstoreStartupReceiver(DestReceiver *self, int operation, TupleDesc typeinfo)
 	{
 		for (i = 0; i < natts; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(typeinfo, i);
+			CompactAttribute *attr = TupleDescCompactAttr(typeinfo, i);
 
 			if (attr->attisdropped)
 				continue;
@@ -154,7 +154,7 @@ tstoreReceiveSlot_detoast(TupleTableSlot *slot, DestReceiver *self)
 	for (i = 0; i < natts; i++)
 	{
 		Datum		val = slot->tts_values[i];
-		Form_pg_attribute attr = TupleDescAttr(typeinfo, i);
+		CompactAttribute *attr = TupleDescCompactAttr(typeinfo, i);
 
 		if (!attr->attisdropped && attr->attlen == -1 && !slot->tts_isnull[i])
 		{
diff --git a/src/backend/jit/llvm/llvmjit_deform.c b/src/backend/jit/llvm/llvmjit_deform.c
index b07f8e7f75..f49e7bce7d 100644
--- a/src/backend/jit/llvm/llvmjit_deform.c
+++ b/src/backend/jit/llvm/llvmjit_deform.c
@@ -110,7 +110,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 	 */
 	for (attnum = 0; attnum < desc->natts; attnum++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, attnum);
+		CompactAttribute *att = TupleDescCompactAttr(desc, attnum);
 
 		/*
 		 * If the column is declared NOT NULL then it must be present in every
@@ -393,7 +393,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 	 */
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, attnum);
+		CompactAttribute *att = TupleDescCompactAttr(desc, attnum);
 		LLVMValueRef v_incby;
 		int			alignto;
 		LLVMValueRef l_attno = l_int16_const(lc, attnum);
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index 37b0ca2e43..561db6058b 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -175,12 +175,12 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
 	{
 		for (int i = 0; i < relation->rd_att->natts; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i);
+			CompactAttribute *attr = TupleDescCompactAttr(relation->rd_att, i);
 
 			if (attr->attnotnull)
 			{
 				rel->notnullattnums = bms_add_member(rel->notnullattnums,
-													 attr->attnum);
+													 i + 1);
 
 				/*
 				 * Per RemoveAttributeById(), dropped columns will have their
diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c
index 5e23453f07..149f1e5a25 100644
--- a/src/backend/replication/pgoutput/pgoutput.c
+++ b/src/backend/replication/pgoutput/pgoutput.c
@@ -1340,7 +1340,7 @@ pgoutput_row_filter(Relation relation, TupleTableSlot *old_slot,
 	 */
 	for (i = 0; i < desc->natts; i++)
 	{
-		Form_pg_attribute att = TupleDescAttr(desc, i);
+		CompactAttribute *att = TupleDescCompactAttr(desc, i);
 
 		/*
 		 * if the column in the new tuple or old tuple is null, nothing to do
diff --git a/src/backend/utils/adt/expandedrecord.c b/src/backend/utils/adt/expandedrecord.c
index d2842495b5..913c08b06e 100644
--- a/src/backend/utils/adt/expandedrecord.c
+++ b/src/backend/utils/adt/expandedrecord.c
@@ -699,7 +699,7 @@ ER_get_flat_size(ExpandedObjectHeader *eohptr)
 	{
 		for (i = 0; i < erh->nfields; i++)
 		{
-			Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+			CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 			if (!erh->dnulls[i] &&
 				!attr->attbyval && attr->attlen == -1 &&
@@ -1115,7 +1115,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 								   bool check_constraints)
 {
 	TupleDesc	tupdesc;
-	Form_pg_attribute attr;
+	CompactAttribute *attr;
 	Datum	   *dvalues;
 	bool	   *dnulls;
 	char	   *oldValue;
@@ -1146,7 +1146,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
 	 * Copy new field value into record's context, and deal with detoasting,
 	 * if needed.
 	 */
-	attr = TupleDescAttr(tupdesc, fnumber - 1);
+	attr = TupleDescCompactAttr(tupdesc, fnumber - 1);
 	if (!isnull && !attr->attbyval)
 	{
 		MemoryContext oldcxt;
@@ -1279,7 +1279,7 @@ expanded_record_set_fields(ExpandedRecordHeader *erh,
 
 	for (fnumber = 0; fnumber < erh->nfields; fnumber++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupdesc, fnumber);
+		CompactAttribute *attr = TupleDescCompactAttr(tupdesc, fnumber);
 		Datum		newValue;
 		bool		isnull;
 
@@ -1541,7 +1541,7 @@ check_domain_for_new_field(ExpandedRecordHeader *erh, int fnumber,
 	 */
 	if (!isnull)
 	{
-		Form_pg_attribute attr = TupleDescAttr(erh->er_tupdesc, fnumber - 1);
+		CompactAttribute *attr = TupleDescCompactAttr(erh->er_tupdesc, fnumber - 1);
 
 		if (!attr->attbyval && attr->attlen == -1 &&
 			VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 3185f48afa..093a3f1b66 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -2932,7 +2932,7 @@ ri_KeysEqual(Relation rel, TupleTableSlot *oldslot, TupleTableSlot *newslot,
 			 * difference for ON UPDATE CASCADE, but for consistency we treat
 			 * all changes to the PK the same.
 			 */
-			Form_pg_attribute att = TupleDescAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
+			CompactAttribute *att = TupleDescCompactAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
 
 			if (!datum_image_eq(oldvalue, newvalue, att->attbyval, att->attlen))
 				return false;
-- 
2.34.1

v5-0003-Optimize-alignment-calculations-in-tuple-form-def.patchapplication/octet-stream; name=v5-0003-Optimize-alignment-calculations-in-tuple-form-def.patchDownload
From 372b42c829969ea2142f86298d6b08a8ead08a23 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Wed, 29 May 2024 12:19:03 +1200
Subject: [PATCH v5 3/5] Optimize alignment calculations in tuple form/deform

This converts CompactAttribute.attalign from a char which is directly
derived from pg_attribute.attalign into a uint8 which specifies the
number of bytes to align the column by.  Also, rename the field to
attalignby to make the distinction more clear in code.

This removes the complexity of checking each char value and transforming
that into the appropriate alignment call.  This can just be a simple
TYPEALIGN passing in the number of bytes.
---
 contrib/amcheck/verify_heapam.c        |  6 +--
 contrib/pageinspect/heapfuncs.c        |  6 +--
 src/backend/access/brin/brin_tuple.c   | 10 +++--
 src/backend/access/common/attmap.c     |  2 +-
 src/backend/access/common/heaptuple.c  | 52 +++++++++++++-------------
 src/backend/access/common/indextuple.c | 22 +++++------
 src/backend/access/common/tupdesc.c    | 20 +++++++++-
 src/backend/executor/execExprInterp.c  |  2 +-
 src/backend/executor/execTuples.c      | 20 +++++-----
 src/backend/jit/llvm/llvmjit_deform.c  | 17 +--------
 src/include/access/tupdesc.h           |  2 +-
 src/include/access/tupmacs.h           | 23 ++++++++++++
 12 files changed, 104 insertions(+), 78 deletions(-)

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index f6d91aaa74..ffdcbda561 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1596,7 +1596,7 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	/* Skip non-varlena values, but update offset first */
 	if (thisatt->attlen != -1)
 	{
-		ctx->offset = att_align_nominal(ctx->offset, thisatt->attalign);
+		ctx->offset = att_nominal_alignby(ctx->offset, thisatt->attalignby);
 		ctx->offset = att_addlength_pointer(ctx->offset, thisatt->attlen,
 											tp + ctx->offset);
 		if (ctx->tuphdr->t_hoff + ctx->offset > ctx->lp_len)
@@ -1612,8 +1612,8 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	}
 
 	/* Ok, we're looking at a varlena attribute. */
-	ctx->offset = att_align_pointer(ctx->offset, thisatt->attalign, -1,
-									tp + ctx->offset);
+	ctx->offset = att_pointer_alignby(ctx->offset, thisatt->attalignby, -1,
+									  tp + ctx->offset);
 
 	/* Get the (possibly corrupt) varlena datum */
 	attdatum = fetchatt(thisatt, tp + ctx->offset);
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 8c1b7d38aa..41ff597199 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -357,8 +357,8 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 
 			if (attr->attlen == -1)
 			{
-				off = att_align_pointer(off, attr->attalign, -1,
-										tupdata + off);
+				off = att_pointer_alignby(off, attr->attalignby, -1,
+										  tupdata + off);
 
 				/*
 				 * As VARSIZE_ANY throws an exception if it can't properly
@@ -376,7 +376,7 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 			}
 			else
 			{
-				off = att_align_nominal(off, attr->attalign);
+				off = att_nominal_alignby(off, attr->attalignby);
 				len = attr->attlen;
 			}
 
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index aae646be5d..458784a35f 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -703,13 +703,15 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
 
 			if (thisatt->attlen == -1)
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off,
+										  thisatt->attalignby,
+										  -1,
+										  tp + off);
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, thisatt->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, thisatt->attalignby);
 			}
 
 			values[stored++] = fetchatt(thisatt, tp + off);
diff --git a/src/backend/access/common/attmap.c b/src/backend/access/common/attmap.c
index 0805c4121e..29ce51ec3b 100644
--- a/src/backend/access/common/attmap.c
+++ b/src/backend/access/common/attmap.c
@@ -321,7 +321,7 @@ check_attrmap_match(TupleDesc indesc,
 		if (attrMap->attnums[i] == 0 &&
 			inatt->attisdropped &&
 			inatt->attlen == outatt->attlen &&
-			inatt->attalign == outatt->attalign)
+			inatt->attalignby == outatt->attalignby)
 			continue;
 
 		return false;
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 982e7222c4..c297a3bb9e 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -251,13 +251,13 @@ heap_compute_data_size(TupleDesc tupleDesc,
 			 * we want to flatten the expanded value so that the constructed
 			 * tuple doesn't depend on it
 			 */
-			data_length = att_align_nominal(data_length, atti->attalign);
+			data_length = att_nominal_alignby(data_length, atti->attalignby);
 			data_length += EOH_get_flat_size(DatumGetEOHP(val));
 		}
 		else
 		{
-			data_length = att_align_datum(data_length, atti->attalign,
-										  atti->attlen, val);
+			data_length = att_datum_alignby(data_length, atti->attalignby,
+											atti->attlen, val);
 			data_length = att_addlength_datum(data_length, atti->attlen,
 											  val);
 		}
@@ -308,13 +308,13 @@ fill_val(CompactAttribute *att,
 	}
 
 	/*
-	 * XXX we use the att_align macros on the pointer value itself, not on an
-	 * offset.  This is a bit of a hack.
+	 * XXX we use the att_nominal_alignby macro on the pointer value itself,
+	 * not on an offset.  This is a bit of a hack.
 	 */
 	if (att->attbyval)
 	{
 		/* pass-by-value */
-		data = (char *) att_align_nominal(data, att->attalign);
+		data = (char *) att_nominal_alignby(data, att->attalignby);
 		store_att_byval(data, datum, att->attlen);
 		data_length = att->attlen;
 	}
@@ -334,8 +334,7 @@ fill_val(CompactAttribute *att,
 				 */
 				ExpandedObjectHeader *eoh = DatumGetEOHP(datum);
 
-				data = (char *) att_align_nominal(data,
-												  att->attalign);
+				data = (char *) att_nominal_alignby(data, att->attalignby);
 				data_length = EOH_get_flat_size(eoh);
 				EOH_flatten_into(eoh, data, data_length);
 			}
@@ -363,8 +362,7 @@ fill_val(CompactAttribute *att,
 		else
 		{
 			/* full 4-byte header varlena */
-			data = (char *) att_align_nominal(data,
-											  att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = VARSIZE(val);
 			memcpy(data, val, data_length);
 		}
@@ -373,14 +371,14 @@ fill_val(CompactAttribute *att,
 	{
 		/* cstring ... never needs alignment */
 		*infomask |= HEAP_HASVARWIDTH;
-		Assert(att->attalign == TYPALIGN_CHAR);
+		Assert(att->attalignby == sizeof(char));
 		data_length = strlen(DatumGetCString(datum)) + 1;
 		memcpy(data, DatumGetPointer(datum), data_length);
 	}
 	else
 	{
 		/* fixed-length pass-by-reference */
-		data = (char *) att_align_nominal(data, att->attalign);
+		data = (char *) att_nominal_alignby(data, att->attalignby);
 		Assert(att->attlen > 0);
 		data_length = att->attlen;
 		memcpy(data, DatumGetPointer(datum), data_length);
@@ -634,7 +632,7 @@ nocachegetattr(HeapTuple tup,
 			if (att->attlen <= 0)
 				break;
 
-			off = att_align_nominal(off, att->attalign);
+			off = att_nominal_alignby(off, att->attalignby);
 
 			att->attcacheoff = off;
 
@@ -683,19 +681,19 @@ nocachegetattr(HeapTuple tup,
 				 * either an aligned or unaligned value.
 				 */
 				if (usecache &&
-					off == att_align_nominal(off, att->attalign))
+					off == att_nominal_alignby(off, att->attalignby))
 					att->attcacheoff = off;
 				else
 				{
-					off = att_align_pointer(off, att->attalign, -1,
-											tp + off);
+					off = att_pointer_alignby(off, att->attalignby, -1,
+											  tp + off);
 					usecache = false;
 				}
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, att->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, att->attalignby);
 
 				if (usecache)
 					att->attcacheoff = off;
@@ -898,10 +896,10 @@ expand_tuple(HeapTuple *targetHeapTuple,
 			{
 				CompactAttribute *att = TupleDescCompactAttr(tupleDesc, attnum);
 
-				targetDataLen = att_align_datum(targetDataLen,
-												att->attalign,
-												att->attlen,
-												attrmiss[attnum].am_value);
+				targetDataLen = att_datum_alignby(targetDataLen,
+												  att->attalignby,
+												  att->attlen,
+												  attrmiss[attnum].am_value);
 
 				targetDataLen = att_addlength_pointer(targetDataLen,
 													  att->attlen,
@@ -1396,19 +1394,19 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index 37133ed7f8..3947b4a4d8 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -363,7 +363,7 @@ nocache_index_getattr(IndexTuple tup,
 			if (att->attlen <= 0)
 				break;
 
-			off = att_align_nominal(off, att->attalign);
+			off = att_nominal_alignby(off, att->attalignby);
 
 			att->attcacheoff = off;
 
@@ -412,19 +412,19 @@ nocache_index_getattr(IndexTuple tup,
 				 * either an aligned or unaligned value.
 				 */
 				if (usecache &&
-					off == att_align_nominal(off, att->attalign))
+					off == att_nominal_alignby(off, att->attalignby))
 					att->attcacheoff = off;
 				else
 				{
-					off = att_align_pointer(off, att->attalign, -1,
-											tp + off);
+					off = att_pointer_alignby(off, att->attalignby, -1,
+											  tp + off);
 					usecache = false;
 				}
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, att->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, att->attalignby);
 
 				if (usecache)
 					att->attcacheoff = off;
@@ -513,19 +513,19 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index cbc1350b89..f2bbbf53d4 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -80,7 +80,25 @@ populate_compact_attribute(TupleDesc tupdesc, int attnum)
 	dst->attgenerated = (src->attgenerated != '\0');
 	dst->attnotnull = src->attnotnull;
 
-	dst->attalign = src->attalign;
+	switch (src->attalign)
+	{
+		case TYPALIGN_INT:
+			dst->attalignby = ALIGNOF_INT;
+			break;
+		case TYPALIGN_CHAR:
+			dst->attalignby = sizeof(char);
+			break;
+		case TYPALIGN_DOUBLE:
+			dst->attalignby = ALIGNOF_DOUBLE;
+			break;
+		case TYPALIGN_SHORT:
+			dst->attalignby = ALIGNOF_SHORT;
+			break;
+		default:
+			dst->attalignby = 0;
+			elog(ERROR, "invalid attalign value: %c", src->attalign);
+			break;
+	}
 }
 
 /*
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index a2e5e19e4a..f8b7ed19b2 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -5100,7 +5100,7 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
 			if (slot->tts_isnull[i])
 				continue;		/* null is always okay */
 			if (vattr->attlen != sattr->attlen ||
-				vattr->attalign != sattr->attalign)
+				vattr->attalignby != sattr->attalignby)
 				ereport(ERROR,
 						(errcode(ERRCODE_DATATYPE_MISMATCH),
 						 errmsg("table row type and query-specified row type do not match"),
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 875515777b..5d81c81267 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -202,12 +202,12 @@ tts_virtual_materialize(TupleTableSlot *slot)
 			 * We want to flatten the expanded value so that the materialized
 			 * slot doesn't depend on it.
 			 */
-			sz = att_align_nominal(sz, att->attalign);
+			sz = att_nominal_alignby(sz, att->attalignby);
 			sz += EOH_get_flat_size(DatumGetEOHP(val));
 		}
 		else
 		{
-			sz = att_align_nominal(sz, att->attalign);
+			sz = att_nominal_alignby(sz, att->attalignby);
 			sz = att_addlength_datum(sz, att->attlen, val);
 		}
 	}
@@ -242,8 +242,8 @@ tts_virtual_materialize(TupleTableSlot *slot)
 			 */
 			ExpandedObjectHeader *eoh = DatumGetEOHP(val);
 
-			data = (char *) att_align_nominal(data,
-											  att->attalign);
+			data = (char *) att_nominal_alignby(data,
+												att->attalignby);
 			data_length = EOH_get_flat_size(eoh);
 			EOH_flatten_into(eoh, data, data_length);
 
@@ -254,7 +254,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 		{
 			Size		data_length = 0;
 
-			data = (char *) att_align_nominal(data, att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = att_addlength_datum(data_length, att->attlen, val);
 
 			memcpy(data, DatumGetPointer(val), data_length);
@@ -1067,19 +1067,19 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/jit/llvm/llvmjit_deform.c b/src/backend/jit/llvm/llvmjit_deform.c
index f49e7bce7d..88ef2bb06c 100644
--- a/src/backend/jit/llvm/llvmjit_deform.c
+++ b/src/backend/jit/llvm/llvmjit_deform.c
@@ -395,7 +395,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 	{
 		CompactAttribute *att = TupleDescCompactAttr(desc, attnum);
 		LLVMValueRef v_incby;
-		int			alignto;
+		int			alignto = att->attalignby;
 		LLVMValueRef l_attno = l_int16_const(lc, attnum);
 		LLVMValueRef v_attdatap;
 		LLVMValueRef v_resultp;
@@ -494,21 +494,6 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 		}
 		LLVMPositionBuilderAtEnd(b, attcheckalignblocks[attnum]);
 
-		/* determine required alignment */
-		if (att->attalign == TYPALIGN_INT)
-			alignto = ALIGNOF_INT;
-		else if (att->attalign == TYPALIGN_CHAR)
-			alignto = 1;
-		else if (att->attalign == TYPALIGN_DOUBLE)
-			alignto = ALIGNOF_DOUBLE;
-		else if (att->attalign == TYPALIGN_SHORT)
-			alignto = ALIGNOF_SHORT;
-		else
-		{
-			elog(ERROR, "unknown alignment");
-			alignto = 0;
-		}
-
 		/* ------
 		 * Even if alignment is required, we can skip doing it if provably
 		 * unnecessary:
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index bca2ae8afb..d889805eb3 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -75,7 +75,7 @@ typedef struct CompactAttribute
 	bool		attisdropped;	/* as FormData_pg_attribute.attisdropped */
 	bool		attgenerated;	/* FormData_pg_attribute.attgenerated != '\0' */
 	bool		attnotnull;		/* as FormData_pg_attribute.attnotnull */
-	char		attalign;		/* alignment requirement */
+	uint8		attalignby;		/* alignment requirement in bytes */
 } CompactAttribute;
 
 /*
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index 622adfa5f8..029324e147 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -91,6 +91,16 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	att_align_nominal(cur_offset, attalign) \
 )
 
+/*
+ * Similar to att_align_datum, but accepts a number of bytes, typically from
+ * CompactAttribute.attalignby to align the Datum by.
+ */
+#define att_datum_alignby(cur_offset, attalignby, attlen, attdatum) \
+	( \
+	((attlen) == -1 && VARATT_IS_SHORT(DatumGetPointer(attdatum))) ? \
+	(uintptr_t) (cur_offset) : \
+	TYPEALIGN(attalignby, cur_offset))
+
 /*
  * att_align_pointer performs the same calculation as att_align_datum,
  * but is used when walking a tuple.  attptr is the current actual data
@@ -112,6 +122,12 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	att_align_nominal(cur_offset, attalign) \
 )
 
+#define att_pointer_alignby(cur_offset, attalignby, attlen, attptr) \
+( \
+	((attlen) == -1 && VARATT_NOT_PAD_BYTE(attptr)) ? \
+	(uintptr_t) (cur_offset) : \
+	TYPEALIGN(attalignby, cur_offset))
+
 /*
  * att_align_nominal aligns the given offset as needed for a datum of alignment
  * requirement attalign, ignoring any consideration of packed varlena datums.
@@ -138,6 +154,13 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	   ))) \
 )
 
+/*
+ * Similar to att_align_nominal, but accepts a number of bytes, typically from
+ * CompactAttribute.attalignby to align the offset by.
+ */
+#define att_nominal_alignby(cur_offset, attalignby) \
+	TYPEALIGN(attalignby, (uintptr_t) cur_offset)
+
 /*
  * att_addlength_datum increments the given offset by the space needed for
  * the given Datum variable.  attdatum is only accessed if we are dealing
-- 
2.34.1

v5-0004-Remove-pg_attribute.attcacheoff-column.patchapplication/octet-stream; name=v5-0004-Remove-pg_attribute.attcacheoff-column.patchDownload
From 73aefcf2bb8fbfa8d77c12dc64d5ee2fcb8c63a8 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 6 Aug 2024 03:03:12 +1200
Subject: [PATCH v5 4/5] Remove pg_attribute.attcacheoff column

This is no longer needed as the offset is now cached in the
CompactAttribute struct.

catversion bump
---
 doc/src/sgml/catalogs.sgml                | 11 -----------
 src/backend/access/common/tupdesc.c       | 17 ++---------------
 src/backend/bootstrap/bootstrap.c         |  1 -
 src/backend/catalog/heap.c                | 16 ++++------------
 src/backend/catalog/index.c               |  1 -
 src/backend/utils/cache/relcache.c        | 18 ------------------
 src/include/catalog/pg_attribute.h        |  9 ---------
 src/test/regress/expected/type_sanity.out |  3 +--
 src/test/regress/sql/type_sanity.sql      |  3 +--
 9 files changed, 8 insertions(+), 71 deletions(-)

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 59bb833f48..6e80dbf062 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -1186,17 +1186,6 @@
       </para></entry>
      </row>
 
-     <row>
-      <entry role="catalog_table_entry"><para role="column_definition">
-       <structfield>attcacheoff</structfield> <type>int4</type>
-      </para>
-      <para>
-       Always -1 in storage, but when loaded into a row descriptor
-       in memory this might be updated to cache the offset of the attribute
-       within the row
-      </para></entry>
-     </row>
-
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>atttypmod</structfield> <type>int4</type>
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index f2bbbf53d4..f1d10a192e 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -363,17 +363,7 @@ TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
 
 	memcpy(dstAtt, srcAtt, ATTRIBUTE_FIXED_PART_SIZE);
 
-	/*
-	 * Aside from updating the attno, we'd better reset attcacheoff.
-	 *
-	 * XXX Actually, to be entirely safe we'd need to reset the attcacheoff of
-	 * all following columns in dst as well.  Current usage scenarios don't
-	 * require that though, because all following columns will get initialized
-	 * by other uses of this function or TupleDescInitEntry.  So we cheat a
-	 * bit to avoid a useless O(N^2) penalty.
-	 */
 	dstAtt->attnum = dstAttno;
-	dstAtt->attcacheoff = -1;
 
 	/* since we're not copying constraints or defaults, clear these */
 	dstAtt->attnotnull = false;
@@ -503,9 +493,8 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
 		 * them (since atttypid will be zero for all dropped columns) and in
 		 * general it seems safer to check them always.
 		 *
-		 * attcacheoff must NOT be checked since it's possibly not set in both
-		 * copies.  We also intentionally ignore atthasmissing, since that's
-		 * not very relevant in tupdescs, which lack the attmissingval field.
+		 * We intentionally ignore atthasmissing, since that's not very
+		 * relevant in tupdescs, which lack the attmissingval field.
 		 */
 		if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0)
 			return false;
@@ -746,7 +735,6 @@ TupleDescInitEntry(TupleDesc desc,
 	else if (attributeName != NameStr(att->attname))
 		namestrcpy(&(att->attname), attributeName);
 
-	att->attcacheoff = -1;
 	att->atttypmod = typmod;
 
 	att->attnum = attributeNumber;
@@ -810,7 +798,6 @@ TupleDescInitBuiltinEntry(TupleDesc desc,
 	Assert(attributeName != NULL);
 	namestrcpy(&(att->attname), attributeName);
 
-	att->attcacheoff = -1;
 	att->atttypmod = typmod;
 
 	att->attnum = attributeNumber;
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index d31a67599c..72a1ef2fbd 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -557,7 +557,6 @@ DefineAttr(char *name, char *type, int attnum, int nullness)
 	if (OidIsValid(attrtypes[attnum]->attcollation))
 		attrtypes[attnum]->attcollation = C_COLLATION_OID;
 
-	attrtypes[attnum]->attcacheoff = -1;
 	attrtypes[attnum]->atttypmod = -1;
 	attrtypes[attnum]->attislocal = true;
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index d7b88b61dc..7015967e88 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -144,7 +144,6 @@ static const FormData_pg_attribute a1 = {
 	.atttypid = TIDOID,
 	.attlen = sizeof(ItemPointerData),
 	.attnum = SelfItemPointerAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = false,
 	.attalign = TYPALIGN_SHORT,
@@ -158,7 +157,6 @@ static const FormData_pg_attribute a2 = {
 	.atttypid = XIDOID,
 	.attlen = sizeof(TransactionId),
 	.attnum = MinTransactionIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -172,7 +170,6 @@ static const FormData_pg_attribute a3 = {
 	.atttypid = CIDOID,
 	.attlen = sizeof(CommandId),
 	.attnum = MinCommandIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -186,7 +183,6 @@ static const FormData_pg_attribute a4 = {
 	.atttypid = XIDOID,
 	.attlen = sizeof(TransactionId),
 	.attnum = MaxTransactionIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -200,7 +196,6 @@ static const FormData_pg_attribute a5 = {
 	.atttypid = CIDOID,
 	.attlen = sizeof(CommandId),
 	.attnum = MaxCommandIdAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -220,7 +215,6 @@ static const FormData_pg_attribute a6 = {
 	.atttypid = OIDOID,
 	.attlen = sizeof(Oid),
 	.attnum = TableOidAttributeNumber,
-	.attcacheoff = -1,
 	.atttypmod = -1,
 	.attbyval = true,
 	.attalign = TYPALIGN_INT,
@@ -684,11 +678,10 @@ CheckAttributeType(const char *attname,
  *		Construct and insert a set of tuples in pg_attribute.
  *
  * Caller has already opened and locked pg_attribute.  tupdesc contains the
- * attributes to insert.  attcacheoff is always initialized to -1.
- * tupdesc_extra supplies the values for certain variable-length/nullable
- * pg_attribute fields and must contain the same number of elements as tupdesc
- * or be NULL.  The other variable-length fields of pg_attribute are always
- * initialized to null values.
+ * attributes to insert.  tupdesc_extra supplies the values for certain
+ * variable-length/nullable pg_attribute fields and must contain the same
+ * number of elements as tupdesc or be NULL.  The other variable-length fields
+ * of pg_attribute are always initialized to null values.
  *
  * indstate is the index state for CatalogTupleInsertWithInfo.  It can be
  * passed as NULL, in which case we'll fetch the necessary info.  (Don't do
@@ -740,7 +733,6 @@ InsertPgAttributeTuples(Relation pg_attribute_rel,
 		slot[slotCount]->tts_values[Anum_pg_attribute_atttypid - 1] = ObjectIdGetDatum(attrs->atttypid);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attlen - 1] = Int16GetDatum(attrs->attlen);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attnum - 1] = Int16GetDatum(attrs->attnum);
-		slot[slotCount]->tts_values[Anum_pg_attribute_attcacheoff - 1] = Int32GetDatum(-1);
 		slot[slotCount]->tts_values[Anum_pg_attribute_atttypmod - 1] = Int32GetDatum(attrs->atttypmod);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attndims - 1] = Int16GetDatum(attrs->attndims);
 		slot[slotCount]->tts_values[Anum_pg_attribute_attbyval - 1] = BoolGetDatum(attrs->attbyval);
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 2a03a506c0..91fc2c8f05 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -320,7 +320,6 @@ ConstructTupleDescriptor(Relation heapRelation,
 
 		MemSet(to, 0, ATTRIBUTE_FIXED_PART_SIZE);
 		to->attnum = i + 1;
-		to->attcacheoff = -1;
 		to->attislocal = true;
 		to->attcollation = (i < numkeyatts) ? collationIds[i] : InvalidOid;
 
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index e230450d2c..1519bfa7e2 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -661,20 +661,6 @@ RelationBuildTupleDesc(Relation relation)
 		elog(ERROR, "pg_attribute catalog is missing %d attribute(s) for relation OID %u",
 			 need, RelationGetRelid(relation));
 
-	/*
-	 * The attcacheoff values we read from pg_attribute should all be -1
-	 * ("unknown").  Verify this if assert checking is on.  They will be
-	 * computed when and if needed during tuple access.
-	 */
-#ifdef USE_ASSERT_CHECKING
-	{
-		int			i;
-
-		for (i = 0; i < RelationGetNumberOfAttributes(relation); i++)
-			Assert(TupleDescAttr(relation->rd_att, i)->attcacheoff == -1);
-	}
-#endif
-
 	/*
 	 * We can easily set the attcacheoff value for the first attribute: it
 	 * must be zero.  This eliminates the need for special cases for attnum=1
@@ -1965,8 +1951,6 @@ formrdesc(const char *relationName, Oid relationReltype,
 			   &attrs[i],
 			   ATTRIBUTE_FIXED_PART_SIZE);
 		has_not_null |= attrs[i].attnotnull;
-		/* make sure attcacheoff is valid */
-		TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
 
 		populate_compact_attribute(relation->rd_att, i);
 	}
@@ -4402,8 +4386,6 @@ BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs)
 	for (i = 0; i < natts; i++)
 	{
 		memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
-		/* make sure attcacheoff is valid */
-		TupleDescAttr(result, i)->attcacheoff = -1;
 
 		populate_compact_attribute(result, i);
 	}
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index 1c62b8bfcb..30d1e8cfcc 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -73,15 +73,6 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
 	 */
 	int16		attnum;
 
-	/*
-	 * fastgetattr() uses attcacheoff to cache byte offsets of attributes in
-	 * heap tuples.  The value actually stored in pg_attribute (-1) indicates
-	 * no cached value.  But when we copy these tuples into a tuple
-	 * descriptor, we may then update attcacheoff in the copies. This speeds
-	 * up the attribute walking process.
-	 */
-	int32		attcacheoff BKI_DEFAULT(-1);
-
 	/*
 	 * atttypmod records type-specific data supplied at table creation time
 	 * (for example, the max length of a varchar field).  It is passed to
diff --git a/src/test/regress/expected/type_sanity.out b/src/test/regress/expected/type_sanity.out
index 88d8f6c32d..8eff3d10d2 100644
--- a/src/test/regress/expected/type_sanity.out
+++ b/src/test/regress/expected/type_sanity.out
@@ -550,8 +550,7 @@ WHERE pc.relkind IN ('r', 't', 'm') and
 SELECT a1.attrelid, a1.attname
 FROM pg_attribute as a1
 WHERE a1.attrelid = 0 OR a1.atttypid = 0 OR a1.attnum = 0 OR
-    a1.attcacheoff != -1 OR a1.attinhcount < 0 OR
-    (a1.attinhcount = 0 AND NOT a1.attislocal);
+    a1.attinhcount < 0 OR (a1.attinhcount = 0 AND NOT a1.attislocal);
  attrelid | attname 
 ----------+---------
 (0 rows)
diff --git a/src/test/regress/sql/type_sanity.sql b/src/test/regress/sql/type_sanity.sql
index e88d6cbe49..303f90955d 100644
--- a/src/test/regress/sql/type_sanity.sql
+++ b/src/test/regress/sql/type_sanity.sql
@@ -397,8 +397,7 @@ WHERE pc.relkind IN ('r', 't', 'm') and
 SELECT a1.attrelid, a1.attname
 FROM pg_attribute as a1
 WHERE a1.attrelid = 0 OR a1.atttypid = 0 OR a1.attnum = 0 OR
-    a1.attcacheoff != -1 OR a1.attinhcount < 0 OR
-    (a1.attinhcount = 0 AND NOT a1.attislocal);
+    a1.attinhcount < 0 OR (a1.attinhcount = 0 AND NOT a1.attislocal);
 
 -- Cross-check attnum against parent relation
 
-- 
2.34.1

v5-0005-Speedup-tuple-deformation-with-additional-functio.patchapplication/octet-stream; name=v5-0005-Speedup-tuple-deformation-with-additional-functio.patchDownload
From f36581783ff1f917296beac6bd38c981b6f401d8 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Thu, 31 Oct 2024 09:34:30 +1300
Subject: [PATCH v5 5/5] Speedup tuple deformation with additional function
 inlining

---
 src/backend/executor/execTuples.c | 210 ++++++++++++++++++++++--------
 1 file changed, 155 insertions(+), 55 deletions(-)

diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 5d81c81267..2b07926113 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -991,54 +991,40 @@ tts_buffer_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple,
 }
 
 /*
- * slot_deform_heap_tuple
- *		Given a TupleTableSlot, extract data from the slot's physical tuple
- *		into its Datum/isnull arrays.  Data is extracted up through the
- *		natts'th column (caller must ensure this is a legal column number).
+ * slot_deform_heap_tuple_internal
+ *		An always inline helper function for use in slot_deform_heap_tuple to
+ *		allow the compiler to emit specialized versions of this function for
+ *		various combinations of "slow" and "hasnulls".  For example, if a
+ *		given tuple has no nulls, then we needn't check "hasnulls" for every
+ *		attribute that we're deforming.  The caller can just call this
+ *		function with hasnulls set to constant-false and have the compiler
+ *		remove the constant-false branches and emit more optimal code.
  *
- *		This is essentially an incremental version of heap_deform_tuple:
- *		on each call we extract attributes up to the one needed, without
- *		re-computing information about previously extracted attributes.
- *		slot->tts_nvalid is the number of attributes already extracted.
+ * Returns the next attnum to deform, which can be equal to natts when the
+ * function managed to deform all requested attributes.  *offp is an input and
+ * output parameter which is the byte offset within the tuple to start deforming
+ * from which, on return, gets set to the offset where the next attribute
+ * should be deformed from.  *slowp is set to true when subsequent deforming
+ * of this tuple must use a version of this function with "slow" passed as
+ * true.
  *
- * This is marked as always inline, so the different offp for different types
- * of slots gets optimized away.
+ * Callers cannot assume when we return "attnum" (i.e. all requested
+ * attributes have been deformed) that slow mode isn't required for any
+ * additional deforming as the final attribute may have caused a switch to
+ * slow mode.
  */
-static pg_attribute_always_inline void
-slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
-					   int natts)
+static pg_attribute_always_inline int
+slot_deform_heap_tuple_internal(TupleTableSlot *slot, HeapTuple tuple,
+								int attnum, int natts, bool slow,
+								bool hasnulls, uint32 *offp, bool *slowp)
 {
 	TupleDesc	tupleDesc = slot->tts_tupleDescriptor;
 	Datum	   *values = slot->tts_values;
 	bool	   *isnull = slot->tts_isnull;
 	HeapTupleHeader tup = tuple->t_data;
-	bool		hasnulls = HeapTupleHasNulls(tuple);
-	int			attnum;
 	char	   *tp;				/* ptr to tuple data */
-	uint32		off;			/* offset in tuple data */
 	bits8	   *bp = tup->t_bits;	/* ptr to null bitmap in tuple */
-	bool		slow;			/* can we use/set attcacheoff? */
-
-	/* We can only fetch as many attributes as the tuple has. */
-	natts = Min(HeapTupleHeaderGetNatts(tuple->t_data), natts);
-
-	/*
-	 * Check whether the first call for this tuple, and initialize or restore
-	 * loop state.
-	 */
-	attnum = slot->tts_nvalid;
-	if (attnum == 0)
-	{
-		/* Start from the first attribute */
-		off = 0;
-		slow = false;
-	}
-	else
-	{
-		/* Restore state from previous execution */
-		off = *offp;
-		slow = TTS_SLOW(slot);
-	}
+	bool		slownext = false;
 
 	tp = (char *) tup + tup->t_hoff;
 
@@ -1050,14 +1036,20 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 		{
 			values[attnum] = (Datum) 0;
 			isnull[attnum] = true;
-			slow = true;		/* can't use attcacheoff anymore */
-			continue;
+			if (!slow)
+			{
+				*slowp = true;
+				return attnum + 1;
+			}
+			else
+				continue;
 		}
 
 		isnull[attnum] = false;
 
+		/* calculate the offset of this attribute */
 		if (!slow && thisatt->attcacheoff >= 0)
-			off = thisatt->attcacheoff;
+			*offp = thisatt->attcacheoff;
 		else if (thisatt->attlen == -1)
 		{
 			/*
@@ -1066,31 +1058,140 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 			 * pad bytes in any case: then the offset will be valid for either
 			 * an aligned or unaligned value.
 			 */
-			if (!slow &&
-				off == att_nominal_alignby(off, thisatt->attalignby))
-				thisatt->attcacheoff = off;
+			if (!slow && *offp == att_nominal_alignby(*offp, thisatt->attalignby))
+				thisatt->attcacheoff = *offp;
 			else
 			{
-				off = att_pointer_alignby(off, thisatt->attalignby, -1,
-										  tp + off);
-				slow = true;
+				*offp = att_pointer_alignby(*offp,
+											thisatt->attalignby,
+											-1,
+											tp + *offp);
+
+				if (!slow)
+					slownext = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_nominal_alignby */
-			off = att_nominal_alignby(off, thisatt->attalignby);
+			/* not varlena, so safe to use att_align_nominal */
+			*offp = att_nominal_alignby(*offp, thisatt->attalignby);
 
 			if (!slow)
-				thisatt->attcacheoff = off;
+				thisatt->attcacheoff = *offp;
+		}
+
+		values[attnum] = fetchatt(thisatt, tp + *offp);
+
+		*offp = att_addlength_pointer(*offp, thisatt->attlen, tp + *offp);
+
+		/* check if we need to switch to slow mode */
+		if (!slow)
+		{
+			/*
+			 * We're unable to deform any further if the above code set
+			 * 'slownext', or if this isn't a fixed-width attribute.
+			 */
+			if (slownext || thisatt->attlen <= 0)
+			{
+				*slowp = true;
+				return attnum + 1;
+			}
 		}
+	}
 
-		values[attnum] = fetchatt(thisatt, tp + off);
+	return natts;
+}
 
-		off = att_addlength_pointer(off, thisatt->attlen, tp + off);
+/*
+ * slot_deform_heap_tuple
+ *		Given a TupleTableSlot, extract data from the slot's physical tuple
+ *		into its Datum/isnull arrays.  Data is extracted up through the
+ *		natts'th column (caller must ensure this is a legal column number).
+ *
+ *		This is essentially an incremental version of heap_deform_tuple:
+ *		on each call we extract attributes up to the one needed, without
+ *		re-computing information about previously extracted attributes.
+ *		slot->tts_nvalid is the number of attributes already extracted.
+ *
+ * This is marked as always inline, so the different offp for different types
+ * of slots gets optimized away.
+ */
+static pg_attribute_always_inline void
+slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
+					   int natts)
+{
+	bool		hasnulls = HeapTupleHasNulls(tuple);
+	int			attnum;
+	uint32		off;			/* offset in tuple data */
+	bool		slow;			/* can we use/set attcacheoff? */
+
+	/* We can only fetch as many attributes as the tuple has. */
+	natts = Min(HeapTupleHeaderGetNatts(tuple->t_data), natts);
 
-		if (thisatt->attlen <= 0)
-			slow = true;		/* can't use attcacheoff anymore */
+	/*
+	 * Check whether the first call for this tuple, and initialize or restore
+	 * loop state.
+	 */
+	attnum = slot->tts_nvalid;
+	if (attnum == 0)
+	{
+		/* Start from the first attribute */
+		off = 0;
+		slow = false;
+	}
+	else
+	{
+		/* Restore state from previous execution */
+		off = *offp;
+		slow = TTS_SLOW(slot);
+	}
+
+	/*
+	 * If 'slow' isn't set, try deforming using deforming code that does not
+	 * contain any of the extra checks required for non-fixed offset
+	 * deforming.  During deforming, if or when we find a NULL or a variable
+	 * length attribute, we'll switch to a deforming method which includes the
+	 * extra code required for non-fixed offset deforming, a.k.a slow mode.
+	 * Because this is performance critical, we inline
+	 * slot_deform_heap_tuple_internal passing the 'slow' and 'hasnull'
+	 * parameters as constants to allow the compiler to emit specialized code
+	 * with the known-const false comparisons and subsequent branches removed.
+	 */
+	if (!slow)
+	{
+		/* Tuple without any NULLs? We can skip doing any NULL checking */
+		if (!hasnulls)
+			attnum = slot_deform_heap_tuple_internal(slot,
+													 tuple,
+													 attnum,
+													 natts,
+													 false, /* slow */
+													 false, /* hasnulls */
+													 &off,
+													 &slow);
+		else
+			attnum = slot_deform_heap_tuple_internal(slot,
+													 tuple,
+													 attnum,
+													 natts,
+													 false, /* slow */
+													 true,	/* hasnulls */
+													 &off,
+													 &slow);
+	}
+
+	/* If there's still work to do then we must be in slow mode */
+	if (attnum < natts)
+	{
+		/* XXX is it worth adding a separate call when hasnulls is false? */
+		attnum = slot_deform_heap_tuple_internal(slot,
+												 tuple,
+												 attnum,
+												 natts,
+												 true,	/* slow */
+												 hasnulls,
+												 &off,
+												 &slow);
 	}
 
 	/*
@@ -1104,7 +1205,6 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 		slot->tts_flags &= ~TTS_FLAG_SLOW;
 }
 
-
 const TupleTableSlotOps TTSOpsVirtual = {
 	.base_slot_size = sizeof(VirtualTupleTableSlot),
 	.init = tts_virtual_init,
-- 
2.34.1

#17Victor Yegorov
vyegorov@gmail.com
In reply to: David Rowley (#16)
1 attachment(s)
Re: Make tuple deformation faster

пн, 2 дек. 2024 г. в 13:24, David Rowley <dgrowleyml@gmail.com>:

I ended up adjusting the code here so that TupleDescSize() returns the
full size and TupleDescAttrAddress() manually calculates the offset to
start the FormData_pg_attribute array. That allows
TupleDescFullSize() to be deleted. I changed how TupleDescCopy()
works as it used to perform the memcpy in 2 parts. I've changed that
to now perform a single memcpy() and reset the ->attrs field after the
memcpy so that it correctly points to the address for its own
TupleDesc rather than the one from the source.

Nice!

I've attached a v5 set of patches, which I think addresses everything
you mentioned. I've also shuffled the patches around a little to how
I think they should be committed.

I'm glad that the patch from “More tuple deformation speedups” is moved
here, I wanted
to mention that both patches should be committed together.

All is good, and the benefits are clearly visible (same setup used).

--
Victor Yegorov

Attachments:

deform-v5.jpegimage/jpeg; name=deform-v5.jpegDownload
����JFIF��C		
		



! #'2*#%/%+;,/35888!*=A<6A2785��C	



5$$55555555555555555555555555555555555555555555555555��"��������^������^W��ExQ^W��ExQ^W��ExQ^W��ExQ^W��ExQ^W��ExQ^W��ExQ^W��ExQ^W��ExQ^s���:����ExQ^W��ExQ^W��ExQ^W��ExQ^W��ExQ^W��ExQ^W��ExQ^W��ExQ^W��ExQ^W���l�����os��ej��oQ�^�x��l16N�^P4�N����ce�A�����}=Q������rtrtU-2�4QHf;z
���/07�T�
9��6#]B�����rtrt��m�9���t���`��"�����:��������4M�@��������tV�oQ�^�x�{��L��|u�f]���F�9�[������Vh�P�0�Lq�N����6k����A'�Eib���OIa�����eM,d��f����U����s�L���.S��*��q�V"�k�[�v���>)�}���.�����!K���2�\��	n��������J�lrs�D�������l���`�ss�Wy3mu`�_f�n�V�(��p�F�`�t!�9oZ�n��-N�Ay[�������h��]��h�%��	����'���9;����9��b��'0�M�a����(��p�F�`����z����E�N�&%W���`�����L�d���xtn!,����zdq�@XC��=;`oQ�^�x�
�y���x�������X�DA���{U���M.�AC#�����n�%s����r�Cj�NI�+glBgX����uk�%w:>x;�KFo���e
	�<�- ����K�&]!O�4����3���#����z?1��E	�)�S_2��1��'F1�����z����E��z����E�g�'7(��p�F�`;D~V��;����������������������;HF�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�A�B4�4�4�4�4�4�4�4�4�4�4�4�4�4�4�4�4�4�4�4�4������(��p�F�`g�g�G$rG$rG$r(��p�F�`g�g�G$rG$rG$r(��p�F�`g�g�G$rG$rG$r(��p�F�`g�g�9�����,�=��9#�9#�9#�F���7��?C?@,��<����W�N�~Z�=��������
7��/Q�X��:�:��R�;G�[1�>c��m9��������
7��/Q�X)���hhg�=8�^�V����m����n[Cb�v��s���9#�9#�9#�F���7������([��qGG�����7�m���"�����<�\����Zn`����h�R���6��z����;;;;;;;I�����������������������y!�������������������������������������������Hp�p�p�q��z����E�����0�0�N��@e���<��J��9�n������g�gq��yV.�,2�f�����������
7��/Q�X��9�y�f���y���9UK=V�VU=�����R��9�����6L��s�t��@��@��@�n��-��5�ck�3�3�]L_�yp=Z<����p��U�m*u�f>���/�fFu�(�L�4�������H��H�Q�F�z��"�:��!�?�?N�)���7ru����������c����:�����R����d��~�?�^���S*�h�����
�������
7��{w���!������3�K��|����u)���*�s�|��t�ym�N�,D�-MI���~�'*]re�/�U�5Yv�hU������w�}�m��������0�I������uz;PrG ��*-�\rAm�X����.2rZ���7k=���d��R���rG rG ;F�H^�{���~{�@�\~6������5t��������������������Id������U�r��`N!���*"��e�^���$F$F$F$�e8�S�V�jf���#m$��DbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDa$�####�F���7��cl�������C�3���L�h9#����E����$��f�T��A�@+��Ld��Q3���uT������z����E�7�LQ���������'F�[q��w�T�=e�2��E���zz���������L��VP�exk8��rG ��7�o��������N�����E��s�����s�H�y����Y�i������H�Q�F�z��"�m~\�����?C?@9#���+�V�t�$rz��e��r��������"jP�������ME+R����@�n��-�_�~`����������|����5<��m�Es#�9�BI������E�*-�S�FW���:��mP[T�;��Ru�E`��^��#)����Pe�|��M&|f�����������m�u@��n��-���xgi����<=d������M�k7�7�H��H���1�r��i��B������w�QiP[T�z��=�������MZd�h�m(��p�F�`g����=)*rz�MQ���6*W5<�W������}3���y�<����������M��B�������@��@��\��U|�������$�����[U������p�F�`��?��-�######y�����sES��'���Q�����)������X���|�ef{�3ZC:����c�k�����,MvT��S��L��"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0������������������������vH�H�H�H�@�n��,�Z�?C?@���5'-�fWZ|�W5�V�5�P��#�U��tT���h�42����]rZ������S����)s���fx=e�k�=5�#Y�5�>�U�6��Rlz79#�9#�F���7��?C?@9#�q������N���V���ew���N����8.���������o��3@��n2���M����k�5�7Zr
q�����Xd�����~��Eb�c]��5Y�l�G&�nrG ��7�o~�~�rG U���>��2��6K�����K����DI%8�6X�e
2:5YCU�5CU�5Y}7IJI�(:��DqZ�o:=T��k�����Xd���k��-a������k�����t9m>�F%���V��
��n��,����@��@�fA�e.o�3��k3�V�W��/�Q�����Te5FW��)�2��)�2���[��;�����5CU�5YCU��J7��/Q�X��������
7��/Q�X��������
7��/Q�X��������
7��/Q�X�a���RI�4Y�E�4Y�E�4Y�E�4Y�E�4Y�E�4Y�E�4Y�E�4Y�E�4Y�E�4Y�E�.�����,���,���,���,���,���,���,���,���,���,���d���g
p�g
p�g
p�g
p�g
p�g
p�g
p�g
p�g
p�g
p�g�e�h���8h���7D�
7��/Q�X4t]dxm�����g��!�0���5��
�?>mK����oQ�^�x�){pJ��ej���N���h�z����E��z����E���1�y�Y�:���[�*�n�x\��f���?F�n��,�n��,�n(��3;�x�����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����?E���������>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>����#�c�����>v>���-��/40P 2@C#!"$1p`53���I��5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk�T
S�@�=�u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[�c]lk��u���5�����[��'"����o�W�Tx_����^�Q��h7��
��9��Y^�Q�|
�����������C)�&o�L�^R9�����k�����L��tggNL+���>��j,������uY3},��Z������B��9[��V%��Y7U4��X�J�50��9I-�����>�dV�ye�im@2�$4���X�����]��Q��S{�G&o�L���3�	�X�%���/�X�������������/��rfR?H���d������7���G)��I�H��TrM<��k������7������X�����������������n#�EFO�����Q����r����j�h`w�Pe��q�xk�Z�t/��2S���kE#�V*1�e���K[�����*�B7�d"� ��r�w���7�Z���3��!:�Y�	�E!9zIR
����F0�K��\~��kI%��;?�E5�h)p��*��N`�)�	d������[?q�6�K�S�l���5oN�Z1��C��J��f-:���u/�Lai��m_�"��E\��ku����P%�K-&�5��u@�	!����f�i�G�{�N���������B
%������V'�AZN���2D�M%1a��^�Q�|'n�R
��{��-�C�����c}�Nu���a����G%Q����/��Yk�JB�V��]�����q�{p���bX�
�4�3�jA���2�W0�;V����Ya"��"&�2?�nfx�����XB8^3L6}������ia�.5o����
:���h��[ ��^�o{c+��Kb9��W�Im��E��VV���+G�A#)CE�BO�Q�za�e��$��m0�A�	�B&�`^���}�)��b���7�	0�
��#��PG �P\j��2�VYby)=V��}+���fS�RTT�F�LZ�/��I+m1AL\jj����*<.�p8Y�#��l�N[Br�w�Tx_���*</����g'���w����r���l��N�L�1E&�z��
��vx����w�$��0��e>.�?���	d/a�����b��]�4Z��_��������;,i�EU���bdB���\Jfab)?�L.��vH�F}Pg�JDebvwyz���jQw�F�H��6���8����b���x��������p���GGF��+�*</����z�
��0	[�9Q��Q�G������{<@���4sva���Y��c��,$�?6
�Or��$����QO�v��JI ��Q&~�%��)&�����1��f,~&�
���x����Ufy��N,�J9�����(��He�5�q�����(+Vf	2'��X!�S�k�rr�����9�Q�~�Y�I�X/�a��`�����WRj���m$���O19��7�HS�
|/�X&-�(�0�/�lf���^7�Zm��c�5��#b�5��eiKh�5�'FY
�C�1M�f��IK��E�R}=V-w�6��C�u-�Z��z�%X+@{(5&�q�H���Y�u�i��OQ{�m����$~��op���K��Q�f�6�'�$�JLr���<1<B�3Yj@�����u-�1��(`h_�B��cM3���=x� l�t�FR�
#��[�o��lU����R�
(�(����W�S�����{/���f��Vi��4k%,
)�����zp^�%C�P�_��ZQ�(�������3&s���X������!:�'����3zpi��H��`M@4����&�
��={�G��������^�Q�v��`�/P���� ��#{�G���T�!�`�g�������`�X,��`�X,��`�X,��`�X,��`�X,��`�D=��`�X,��`�X,��`�X,��`�X,��`�X,����X,��`�X,��`�X,��`�X,��`�X,��`�X,��`�X,���
������~�?wr�
������~�?wr�
������~�?wr�
������~�?wr�
������~�?wr�
������~�?wr�
������~�?wr�
����bg���?g���{�G�����E�ao���?g���{�G������X�R2j��b=)��m��g��c�w/p�����[��Z��$�3U	�M-Wgbo~3�x�����Tx]�����������ugbo~3�x�����Tx]����'��L2c!��&����~3�x�����Tx]���o���(�	�d�&?�D������~�?wr�
��j9$�.P�IN���������xz'2f6�$�?�~3�x�����Tx]�M6�R���Vg�}�Q�V�t
��f���`+X
�V�p���ES��R4/,`+X
�V���`+X
�V���`+X
�V���
�V���`+X
�V���`+X
�V���`+X
�V���`+X
�V���`+X
�V���`+X
�V���`+X
�V���`+X
�V���`+X
�V���`+X
�V���`+X
`���`+X
�V��������}=E��7F�I	V8g�BK#C0��[����k�:k:b�#��������������}&�OP�MY���i��=�V��B�%��<�zp:��V��Z�"Q��N��������^�Q�wo�>����v�]Gk�-�=�����i&��g����["�b������,~���v�L�"������~.�����\�J�J�'�
�\M��?g���{�G����V��t������i�11|X���\�B��n�LM�?�<X����*</���M�&���_���v��_�	�d���8�Fz,���P�������g��c�w/p�����i��h�p����$��ft�2�PM8��~h�D�J�Kw$ky������?wr�
��|�S7~w���
���qbOE���q��Fi�>%��WoLP]��?_
�<X����*</��M�J14V�w����l�x2%����SN�����8#�=VV�C~>�4n�fO~[�u�����Lm�����������V�z�nQ�[_;�	?����b��,I���QE+���	�����B����	�Q���Gv#_���g���m���\�������9O��)mA���?�P�/������%[e��+��[��{�21���?ws�yT�4~�y&������8���R%���H���;uGR[�dk|���&����x����4h��N(�B)�|��'�<Q��%�PM;/��EZ#O@Yi��n��
�]�}������^�Q�|/��-���������>�����6]&e���M��SJ��*0���/�o]��;��x�����Tx_	g��j
�dzC���n�j<���Vb����f+1Y��Vb����f+1Y��Vb����f+1Y��Vb����f+1Y��Vb����f+1Y��Q��f+1Y��Vb����f+1Y��V`��u����LSY����f+1Y��Vb����f+1Y��Vb�a����X�od�Mj
�Vb�L�f+1Y��Vb����f+1Y��Vb����f+1Y��Vb����f+1Y��Vb����f+1Y��Vb����f+1Lc�b����f+1Y��~7�Tx_Sh�*:M?��y-@5%("�3�������?�x���E�QZ�������[3�nf�Gf)W��c�w/p�����1zvc���<Q�C�:xA����`Z��%���R����h�\����#�w/p����O<�9~w�,�5�ZF+RA[�M �o�#��e���K|���!MnM ���{�G���(�����D���������< �o�c0�In4��/��qgOZOB[e���j[�0@c �h����*</�����Y���x���:��bx���;��X��%���0~����`;VY��@m |��<Y��&xK��;�V	���������������OV*/O�	|��<Y��6x�~���V*�	n,-��zK�{�I������^��?wr�
��%��'�{���������_��z3��2OJ^���B���e���{�I�B�����������X�7p�I��������Z��o
~,���8�)�t��������f]fe�l���j���
��=x�={x��N+��-��J�~,����.�@�����*</���U�v=C����WMm��oN^����B���!Al�&vv��?ggu�nn���I�e3-Se�e�Pug�7t�at� u�����t,���,�2�Xe����!t��$�%������WE4!m����vLAz��x-���g��,Y��:���ZR.�2�3-CZ�pX�������$��$��?�*</�37f����s�	���Y�O�?�?/��V�-�-�kY2�U��p+pXb����^�Q�wo�
A+�2��"��"����P_���	�B$6b$����h��ka���kw4i�F��o [�]4������u�@��4e����������Y3��p������
2�>n"H�BI�>5��W���3�oP7!$�$�E��n����������h��hz�2����-�{�@��N���g�?g����<`�nn�H��{�G���;L����QW�������iZ�lV��7�D��.�@/��U���m�[x����t��
��e�����]n��Ye�&M�1!�	&&/��������^�Q�v��Z �D� ����G5��f�Y��k5��f�Y��k5��f�N�I��������iN+R�-��k��iD�k5��f�Y��i�Iz0�����������������2��z���.�Qu��f�Y��k5��f�Y��k5��f�Y��k5��f�Y��k5��e����k5��f�Y��k5��f�Y��k5��f�Y��k5��f�Y��k5��f�Y��i���Y��k5��g�������0a��-���z����dV��{�K����-�	���e����T��I�@��:���r������Z��n�e���a[��@���0/q�
�I11~'��c�w/p�����	��i���L�"������	��+xl��_��\���Oz��p�Aj)>x����-0X
�U!$��
�H+����.-kkqin�e����$��t��u�����g���{�G�����g�pO^'MVZ1����ub�l�v�C~5��n�[���i�_���<1�zp:O�{tKa�m&e�m�K��.2��e��=����{"��������W�D���P�r�{�+�aAb)?8~���v���u��m�[XV���?����i3-+b��+}�p�����gc�.��2���](
l�[���)����B��������Tx]���u�5�fX��k�e�6^�+�![����o�^�k�:kP�i�u�?��~������{tk`�����ne��b�dkg*����������/�Ygu���[��oMo�����z�]}��0/p�o�[�5��4���|op�����,�;u���X
x�t�at��u���o�{x/o���_������-+l�\e��-Kl�n�[���#M������x��-AY
��L��,��+J4��t��t���n��{�G�����g�?gkt�D�i
�@�0-���^��3-����i�e���b�����Yn�[�[�^�~���r���zl����%��o [�V�KP�e��������x������Z`�B%��l�[P����[[�5��m�[{+J���
������~�?wr�
������~�?wr�
������~�?wr�
������~�?wr�
������~�?wr�
������~�?wr�
����0^����x���������������_l��sn7����������X[�qan,-��������X[�qan,-��������X[�qan,-��������X[�qan,-��������X[�qan,-������a����X[�qan,-��������X[�qan,-��������X[�qan,-��������X[�qan,-��������X[�qan,-��������X[�Z�[�qan,-��������X[�qan,-��������X[�qan,-��������X[�qan,-��������X[�qan,-��������X[�qan,&��>���X[�qan,-�����V���Q�v���
0�9$�d&&����d�8GV=(�	�����9&�gbn��v����E���f�V(�o�R�����-�Z?X�7��l,^�����{�G���U�=j�X|Turx�4w�pW��~&OO�C�*�q�n�
��={�G��������^�Q��m�����!�Q&�,c���m�~��z�j+�K-��F�X���&��F<`��I����������Q�-I�!�5j������fd�9��u��d��R~�
�����M�����0K����z�
��={�G��������^�Q���Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�+W��U���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj���T�-PZ��Aj��m�W��������������2Q21A"0PR`a !@��B#3q�b��?�#J�F��DlQF��DlQF��DlQF��DlQF��DlQF��DlQF��DlQF��DlQF��DlQF���qkp���DlQF��DlQF��DlQF��DlQF��DlQF��DlQF��DlQF��DlQF��DlQF��DlN��m^���Cj�|��W������=������d6�G�k!�z>{Y
��\'qr�8|Nc�����d�+��yG��f_�����m^���Cj�|��W������=������d6�G�k!�w2��%.^���Cj�b��$�i��S��BOk!�w1��`J=W#���s��m]�n?,�����^���Cj�$�M�`���M��r��E�k����/��Ok!�w�����bfc��=��(����h����&W��&�/��Cj�%�Wv���~����3��������������w���a�>����v����1I>^%=�����c".����5��e�?��_4e��]J���8�Eq]L��I����g
UG���95�W�V���P�|\S�R���>e2\�T�f.��__������y������1|���?����k���R�.h����k!�|����)5���+�����k���C���3.�������m_>\|NH������_3�f\�^��|��{Y
���k�]��e+�2�4�?��,��gl�v+v3_���Cj�9.��\��\v��i=����[���s(���2���c;;��dn)'�Ok!�|���|������_�O
��Q��~���~_�����F�`�)W2��+?��/���r�\����R�_������d6��G�B��?��Z�����d����c�v
cr�s-�r�K�pLQK��{Y
��x�)�����.���*v�r]E����c��?��S����kC��C*v2�a��~!T�fJ�l�X�B�I|'��������������4g{����q�5K��H��X�_FQ�|�d����dO�c�q�Z�����m_k�%)�0����;eO�+FdnU��u�R_�_���3�T�dz�p���
����c�}G
���i#%�~L��K�5�����Cj��Q���2��3�v�eb�b��M>_*��&g�<��}R���fp��g�fp��|?/������p������S�|�D���|)��}���W��E�Y�J�l��L���X�V*��������27*W1F"��&g�<���sQ����\��\�����/o����w�Q�"+��e|//���������'�}�87d�V����Cj��QDlQq�B(�(�)w)��%s	\���W0����1��eb�X��O���W������=������d6�G�k!�z>{Y
�����m^���Cj�|��W������=�_�8��cV�j��[��v5n������cV�j��[��v5n������cV�j��[��v5n������cV�j��[��v5n������cV�j��[��v5n���}
C����cV�j��[��v5n������cV�j��[��v5n������cV�j��[��v5n������cV�j��[��v5n������cV�j��[��v5n����3��62Q!1A 0PR`"#@Baq���3b������?����Q�*?%G�������T~J��Q�*?%G�������T~J��Q�*?%G�������T~J��Q�*?%G�������T~J��Q�*?%G�������63�����r�eG�������T~J��Q�*?%G�������T~J��Q�*?%G�������T~J��Q�*?%G�������T~J��Q�*?%G�������T~J��#��%���w���|;��z�>�D�}�"^���z/_G��������K��R$)Z9QW�p��W��EN}������j*5{�;?[�"^���z/_G��������K����B%���w���|;��z�*�g�Xw���b2�����������!��K��Nj�Hh�!�Y�2�A����p�!�����>k?�������P�B%��E_���5�:TU4D��\F^��?�c���T����!��K�����onR�j���V}I���&����(II��a��K��O�2�;��k����\J�K���H����z/^�������y���|�~�#���~�3I��O����K���a������@�>e��	�g4�����?S�$4�I�BhjBs��w�����M������R|��>��(���;y;��D���%&��i����K�������TE��
?�Y"2���Dk�^�I��������K���T�L}�m��W�)99=IFN��H�����g�����K����&�]�"^����!��ER�)(��*�.g���
���$8��?��z/_s���+P�d��Uz\�q��k�/bHH�q&j�hw���A��h"������K�����B%��*��%V�m���I�\�S�����HO��z/^��!��M��M�g����%�
K#n���������8����������%W'6)�oY��{D%��sW�����$IN'k�f�&��w����&����y��i�����)N'G���P�d��H�O�����g_�D��K�	��{R�C���m�~�S�����ML^m%
z��y8�.����q�&������>H����i���6�����Rzry(��
Q���F9]�%��z/^�"=9)Y�Mm��p�i���/%A`�:CKMi$�>"n���k5����:�D�~�S�U�J���j��'���k�CW��N�Q~
n�E���;�,-<��i\�vO������j��hki�<�D�~�[�M}����������/�i��Cz8���Ej��fHhn
i4�I.I.I.I;$��N�'d��i���G�"^���J�D53�N	������~IC�����1��b�y��))E��4;�$I

44��CMhCBM?�J�����I�>#�>!'���"^�3��*?%W�����U�!S��D����53�jg���)��Rp�|����&�y4��hg���0�����D�}�"^���z/_G��������K����B%���w���|;��z�>�D�}�"^���z��{�F�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS"{#Z�>"�#\�.�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS&�2lS"{+X����@!12q�"034P� AQa�#@r�BRp`bCs�$��������?.qc������[��An���t�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An���	�*!�l����Z��Kt�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An���t�-�[��An�ic!����x�tTj�����
����`�����e.��(x�t�u��`���.�2C��#d}�f�>���VSlU�w�j3\ji�V@������#���S�J��f]���d������udw�b}���9�����x��~��������_��)��Jb}�-"`&9����~k���{���K����P��PZG��y�1���?T����������8���-{|����f��|9���Y��>����>�I��A��z�������aZ�3O�T�f]����M|G	�����Y�ufJ$2u@���#�t�p���RZM 
��Y��Y�&
�)�6

(u�h�P�u2%D.�}i%�)��I�kf��@��f�;�v�:��9�D�f�v�����g%��79��<f*B#�9��S�b���o������$��bSw�����DE�E2���wi _2�	�j<7��>e�[;~FI�m�^e��j3fYR|���j�#%@�FH��Bg�5:��~�i�*�@}u&�_+Bi6��:tg9�U����d��-�P�C�S>I���uE��L�Z�Nk���d�����	�d��ir�Z
���Q0P�����G��������Dt8����S�\��J�
���U9k�Br�:$��H����D h�n�n��'����QC��$��(��M�(��[Zdku"yw?�[]2j*-��#/eJ$���QXt���G���!blW�i��$�@�!�a�:�����$��6s��s�V'PO�=IL'~K����gE��G��f���*<9���Y��|�:��kk�N�h������b`���x���E: a{\<�8��Z�������acd�zM4\�7�/E���(�����h�	���}+Ki�H%���9�uA���x-�M�F�Nt�!E�I�&�	�"n�F$
s�eF������s�0�ADi����3i:���8�T$���<�2D8����A�^*Q&&�� �����~i��e0i�%�o�A�lz��~��dm��2��g-2�aPu l�"U�L��\�,\*�����o$��I>���S-����A�y� ����E��j�$��	3o�����M��z:�	h�	���T&�D�w=�M6��-�>����� (�n�D���F�q����E�|76^i�"��JF����C�5��ZZki�A������ 7H�TbA���n��F��h���D�B�n��"����sc�1G�F}
����	�["�J�������4�?���"�������(C�jt3
�l�-O|F������G�(���a9��B����IF��&��o���F������CU���Ev�F/�=���o1�����$I��t��������u�g�
Q/:��L<?��0P����2C|�*����;��6�����Q��Z3C�����<��B�iX�7P��{P3O��9��m�!8f�=�im��E���l�B����2�)�\M�k�)��.�j�:��m)�������F��
l-�9�Xe$�������~��C���b!w��L��eh�wI�c��Z��R���Q$��%���d���6'`�=F�U:$��%�N��*�Q��@�6������X�r�L}D�R�hHT������Y��;���k��<�2��YQ�-��X�]s�R��4�4����#?D?��0P����i�
C�'��L<?��0P����2I���:��
��� ���|�S�����1�����^����B����#1����@���{\=��+\}�s������-3�\� -(9��5��6����
���*Q=��=�?��_I�|���-��86u	�Q��P�Dkgd��A�"5�������L!�����!�Bz����'�|�TL<9S�jWZ�;�Ep�4����@kj�)����l�W�xl{��jG�@�/$�e����D���3�4N�,�F�u��g��$���QQ\��0�Ld9��S/t(tAk�)	��E�Lh)j�S"�#����e��LYC���{��+|�������v�n�hk|�^�Z(2m�!��U9���;tf,:�,#���;;~�g5��E0)�N��M�H"��*%Bp�bRxk��������gJ&<��q0���H�@"�lPf(� �f�I��Z��v�2%��Cej���$�L�����E�A����*���uJ�&;h�a�X&$����N�}J;;N�d]#��Bl�Y2�����?��[N%\�e�[��qa�5�����t��Qc):j���my(gOJQ�&#�Ek^���F*G�Ac]��
��|���������������������$&1����%	��T����^��Z�P{K��2�'i������J��
��!E����]�C�Cu"��d��(�{���+-�*$&F���7���C~�Y��P�=w��.kgg��5�m{�+T-$]'�t����`����krW��I9��	(3'�����,HT���P�D|=�h�W��rti���T8St���Of� ��2����6�t��"����F^��bh�f!���~���`*�rSh��,��
l&������#��������i����"�o��J#&H�N#�V���cE-�A`��nu����?K$B����
�?J�GKE9��Ry��[���cD��
���n��C�]&	*!�<�8Z
s�����95�����59�#��Rs���c��=%
���fc3���C��e�kY#K\�N�4��}':����cDe;��k�=FP��q�+����?L�(�O������|'Q�K|��`Os"�������D|=�h�)��������sT=�
��pQ[M�KY$��B<F��9�Z�9���$�C�^^�AQG>!�k�B+����%���`��������~&
���(xl��Mj�Qc6F�����������Q0P����]J��v�>$����R5V�<������Yy(�i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i��ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5)�=U�5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsV���5i�ZsF�����9�Nj�����9�Nj���&
h��,�����X�(xm�~<�c�:r�mb`��������,��������7��<��,v�&
h��,�����X�(xm�~<�c�:r�mb`��������,��������7��26rq�,��������7������J�h����<��,v�&
h����� ����58&�?�R;��A�,��������7��w�I��SgP����(����LY��<��,v�&
h���?���l�����U�A?�1X�#Y��;k
�o�������)�'	����S�@1��9c��0P��F�|���JP��D��_�	�)�����,���������8�:�w��kt(���`P1-������6�����Q��}w�>*�����V�T��J`�}���t�����C�fg"�3��C�F��
8z0�g�A=��c`�S�H��U`WBt�d������t+�]
�WB�Rf�??eI�prU�]RWB����t+�]
�WB����t+�]
�WB����t+�]
�WBy��]
�WB����t+�]
�WB����t+�]
�WB����t+�]
�WB����t+�]
�WB����t+�]
�Vy+�]
�WB����t+�]
�WB����t+�]
�WB����t+�]
�WB����t+�]
�WB����t+�]
�N�]
�WB����t+��
�o����(
��������������G��W��U����#sU�CY��;k
�o��}�K����R����FZG{*��U*4]��
�m�n��c����+���=Z�H���<��,v�&
h��{��6���1���gK����m��j7�ua}7t*QW�Y�}���}Xt��UN���<��,v�&
h��qQ�v��~*���/������m~�}���r�veM����t�����C�m�����U`�4��-U�&�Bq�}�`E�O���3�ygNX��L<<3���{�(qX��v��`�=�V��_�-`Z�>
v����V�DQ������W�1��9c��0P�����&��.�n���\�*���K���~=���}Z�%���^�*��ASd�}��P������Bt��Uy_NX��L<<0�5�.���0f��_Y���D����T!�[>CXZ��V)e����V�sp+S������@pW�����9c��0P����,H�&���n���h���0�F�T�TW]^IX_M�-f�]J����Y�NG1V�{)D��L=��W���-Xor�����V�g�M�������c�d�-�{[����P���#��1��F�SG�i������T����Z��j��������U4��pN�3���"�e#���}9c��`�",�?��V9��L��*s�Q�9Pu"g������L��W��_�*�O��]��G��V�h��~�z-v=�Ok��;j?��Z�/6�����7
59Bt.��
�%���7�����*���t���oP�?aZ����Q\��b�`���j�?����tS
�sG���������-iN�*t���7��<?J�X���}�Z�I����`_M�b�����-U��B�x;N���X�(xxZ�D�O��\�C��&�-�D���F�Q��yX�aXZ�!U^]W��
��k4vX/���"/��zX���}9c��0P���k��d<A�����/1��\^�6��?*^�vScHh>��(��*3���B�+B�+B�+B�+B�+B�+B�+B�+B�+B�+B�+B�+B�+B�+B�+B�+B�+B�+B�+B�+B�!_��+B�+B�+B�+B�+B�+B�+B�*�K��6j�.U���hV�hV�hV�hV�hV�hV�hV��T��,>�j�k�_RV��O���Z�J��
��
��
��
��
��
��
��
��
��
��
��
��
��
��
��
��
��
��
��
��
��Z�+B�+B�+B�+�����Q�2�PN�+F��bq����3�?0�;�h�h�
������n�l���C��V1�K�U�+C��<�u*����)��G�_Z_��U�~�t�����C����.��v��:�P���!`4��
�o��+��aX�\B�r�i
�������b����A8�^���N���C�����h������"��
��I��o��~��-G���<s
�
�N�f�b���� �Z�t�E�
���;k'ZXl|��j�B�N��K�����!�h��7��<����NW%X!^�t�V�U�`V�W���U}�U�k�_V	h�Si���mb`�������#�[
��8}���"Ll#~<�c���T������t���}���*���~��X�(xxd���:�B��������$,>�8��,��E�|�M�uU(����m3v��L<<?Z_���-��k�F�y`����/���t�	O�X�u_fr��p���8tW�Onh��L<<=�>��a����g�"=�+N�8���7��<�EQ}�Et�z�����\:�N����+����	���<*��E|*���f��L<<1#�����J_�{C�Q:[����}����[�F<�EJT���*�*��TB������U`�j��gXU�nJ���X�j�����*�5�V�gwE�#z+����U9��;kk�B�D{�K�&C��A�l��W�������UMc�h�����uW?j��,�O~jp��~��jm���c��ygM��]���*�xt\2�i
�x+~����W
����W�uF�hr��O����
������*��*�_L<<=�A[�7�?E���s=�l#~;)<L*]��o�*W_�O ���g`WW���UDW�WAU�U���^W���*�
�U�u���C��P�c������`�S����x���,���B��S���U���Wp���W�����L<6������}���Dz�}X��.�����z���� ��M�*�Q��,�����������E]!�_�-�[����?��������b�U9���Z
��U��5y[������7������Z��
���\��S���=k�s�k��W�US�U��m�n����s���G�j��k�������o��x�*�75S��c�:r�xn�b��*�xb`���4\��"F��dTo�oZ�rU0+R;�����]��������xN�ukv����-�r[���m�n��C�����{K�Q�qV1���<
���X9��T@� �ygNX��L<6e�������:��v#	�����J/��9+J�����9+J�����9+J�����9+J�����9+J�����9*�?���_�*�����V;��]���5^UV�9+J�����9+J�����9*�>��_���n����/���t���\1Z���Y�oE{���R���9+J�����9+J�����9+J�����9+J�����9+J�����9+J�����9+J�����9+J�����9+
�������9+J�����9+J�����9+J�����9+J�����9+J�����9+J�����9+J�����9+J�����9+J�����9+J�����9'TrV��%a�XrV��%a�Xr���C�i���������F$�^J7����T��������x��WHtW�J��^�+��}j���li��aUHuZ�b�W��UB��UpZp+[�;���t_�tW�J��^9+NJ��� U~��,v�&
h��#�q�+��\nJ�rU��+�����UDk�Z�A�kvw�f<tV��o����J�o+Z��U<u�������������2U�j��p+���UQ�V��r���f����� U����o����^>���X�(xm�~<�c�[FKv���+��X;�`���W7��f��I��>�o�5o����Dm�U�nKv����uZ����]�UB���
��dU}���z���g���z�E\7���%��_�%��_�%��E�������C�m�����n����n���^c�����{C�QZqWX��a9���������X�V*�W%��1��b�
����+�x�S�z����0P��F�y`��+`_J#��sbu\��gz��Ei����W�J��ZrW�KxQ��xz}�lnKv�v]V��:��L��&k5����D�o�f�����qN\J�?K~2[����V��W��j�����W"�D�\~H�����ZrW�J��o�75S�~(�(xm�~<�c��q�+��]nJ��]*�������Y���_~kx���&jB+�]�������^�U��nj�����U�z���%}o��75}���5h��+�+�%q�-�r[����E���&
h��,���:���-�[�s�����5Qp������Uv����%}��+�[��������\��<*���P^�w���r���W	�,������[����4���&
h��,�����r[���mW��7�W���#�Q����!��+��-����C�m���Y��;k
�o��ygNX��L<6��X1��9c��0P��F�y`��t�����C�m���Y��;k
�o��ygNX��L<6���Ta��D���~<�c�:r�mb`����/��������EK�w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|���G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0�G|����w�.�0������.�0�G|����w�.�0�G|����w�*��0P��D�T��!7NX*Q=J���9Y�A��E��5�Z�S���{�����u*P�=A�A�������`�*m3i
�fk�hk�/u�!��x b9Qe72~m�v�z�x�M
4���.T;Lz��-��+(67h����
+X$�B z��Ft-������(�����%��#87i
��oe�5:��<��>|�3o�.3�Ls�> �p;��2.��,�RT"F��I��m)�s�#�s�S�4HB-��5�{��h��EA�>d�3������~&
���(x��`��������G?+f�E�����R2Q���!d:T��A��b2r;�EsY}�T9��sL���D��"���DL�Yj��RH�����0�8p������>����-x�����T]#_�!��P0�Ct�
B��������;L���f����D��=��[%��SdF?�R]�#�A�fE�;_	��h$�Bv�0��R������:���a0e*���J+����V��v��
�	�5B���q�ok-�Q��mxt�J�Z�a���l{�_��&
���(x��`��������~&DA�o�W���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����Nbs� ����5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW���������5}����_nj�sW��������\����?�����*?���G�>�����-!1Aq�PQa����@���0 �p`���?!`aU9����DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDm��o{/��oz���DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPUJ*���S��Y���`��g� 3�[�)?��O��7�%�*y�J)MU�����T��P�=�H�a�?V��7����E�ba�����?��M��o{���-[�	h��aN)�$� ����Mo��f%��E=�Z��
m/��NF��y&��_G�
�%`��PDm�la*^��a-���#1��$��wL�$�U}��\����g�.����p���S�BC���,,��hD$U�cT+b ��MWb�(���N����2�[�Q��8��jo��C����UL����V9?K6�$j�J\K(Ne5H��,�8�4���Nf�k�S�2�
�b\o�&�UJ��D���NT�	od�i��Q���	�g$+UB��7D��4�3���*�Q���O��|��_���c�x��C
�w��I
�V���8�2�������$b3�A�)�����4�.4���w�e��&�
�m�
e��l���9�1z���A_z0�Lu��5���haH��I���E�����E��-8��!W	*D}��js"�Ss����}���E���\���(x����U�\z3$���k��Ry��
����q9Q��$��Kd��#��~"�%v��bcw?�����rc��v+��Lp��������Wh���
P�����Pq���a�&-�nx�������	a#��$��m��!��_Ni�x�Ih�9���Xt�tt��8D�E{���nc����u��D��A����6��t
q���C]M��He�"�&i�I�Q�E�����RP�ft7��z�b�\�TQV��l�7Z����uL�&��
5����k��A��qSF�����"���(w�0����K���Td�|�%H�:�
��0�O�k��8�54�=
�T��pG�����F���n�q�%���-E"�9<Ti%q�)�)��\$��Y2I����c>J���H�1��8H�G�b����uR���!c��H���fB�VJ������Y���HUG�{]�%#LFV�����.<�9|{7
��l�X�T�+`�'x��Q1���\I����������T�8��*Y�i������Y�B�\D�[
Gu�iO���0"�I[��4�Di��E�3FSQItR�.j�V�R���EF[�JMnF�KZ<�����H�9���=E"�E�����>����}��:���*mi���1X���h�@t�I!8����$S�sD*���x�RmJX�.Jg
)��	�jS%�]�!���[�.�|
�R�2�:Pn�S6B�A�4k������(�������[��.�o�"�I^�E�N���b33��hr����+��-�M-r5�QID4}����N!��������SN7��|��c)s�2%a�~8�����Y]�v-���bO�Iq�[�����l��kS.&!L��R�J������5Y]3�Nd�&k$'!3������?��v�31��EG@\�s�ND	Zd�����%P�L��*�ls�������U�I�[i0Gb�5���4�ij	0���72�R�c �H�+pR�f���� ��Rf��,-�w��j��1y��8���e����B��dR`�hZ��%�����m��A��F��
��r���������^bi"J�U��,������h�>��+���J�M���'AU�_��[exl�	����jS�[�	A
������,��J�SY��$BSX��f^Yd-:JGF&�����_��@Q��6�Eh�+%I1W�nv�D���N��D�SN�j�)�/k8$A�&J~�	"��J�c�F�V�T��&��S7�'�'��$���2�T�O�;[��B��on
Z��:	�v�YH��A�����ox�d�"�����J�
��i���Cc���N�pc�j`���I�J#�If�<�.�q��jP�E�pP����2o���Y�����)�Q����>9�+�$9O%`)�`(�n7��4
��4C]�F�RINJrA�<���oF�*��3��,��������~�	O�M�"Z��k��D�^B�Q�"�9�X��/�"vd�J���S]o�!	���M����`vh�B�o�a&�&��"�k����I��5���W���@�3<(�x��Q(!<W"�
:�}��J0[������[�R�L(LLm��;��n��(4��.�)�q6�5�%tf�{�J���1���T�qU�D��++M��S6��x����rC�i�j�8���W���uuF8�������\����#,!7�E.,�Ki�I%�����t.��J1WgiP���_����9%��S�^	49*B�zN
7���p�a
hL�Y5�*@�����8LrLj-?&K�������6��#��sQ$Q��������La(`�EH�R��(���(��0v�F�z��#BI	B���[`����9J�G���+!7�c����jEi����i��t�\GS����:�0�������,�N�p�>�H�D��"9W"g���������D��cH�������E+L�4�3���cEG�P��xGU�v�����R�"�\����2�sy�7��QJ*��*�K���%H�������A��KDZ?���G���X����BX��?)Bd��p3����4�7	C�a�AH&��H�	o�v���tG�#����D{�=���tG�#����D{�=���tG�#����D{�=���tG�#����D{�=���tG�#����D{�=���tG� (���=���tG�#����D{�=���tG�#����D{�=���tG�#����D{�=���tG�#����D{�=���tG�#����D{�=���t\���=���tG�#����D{�=���tG�#����D{�=���tG�#����D{�=���tG�#����D{�=���tG�#����D{�=���tL�/x�tG�#����D{�=����f|�V�vdl�y6g6�=��=�]�3M����xg�Em�fF���fsk����[e���1�������|�V�vdl�y6g6�=��=�]�3M����xg�Em�fF���fsk����[�1D6��l{26f<�3�_�������5nC\G���R���fF���fsk����[��k����b������ydV����fF���fsk����[�9W�V:���B�}A�&/	u���Ml+26f<�3�_�������0%
=;�B7
\&'M��V^�T���#fc��9��������>/�����e���J��,���#fc��9����������>?���:Gc�����+oV
{�26f<�3�_����T���&����X��r�Hn9��	��D���$�IB����6�[F�x�%9fY�I$�I$�I$�I$�I$�I$�I$�F�A$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$�My	$�I$�I$�I$�I$�I$�I$�I$�I$�I$�I$����I$�I$��L��;[��5US���L?w'cd4�3J4�X���L�X�
0�
0�
0�
0�5Y�x��`����W�4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�E�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L4�L*c��
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�(h�p4�L4�L4�L4�L-������*�`��]Tl�I�\K�����F-�w|��<�X,������d���3M����xg�EoN����(���������V.:�=�;���X�.g�`�C}�B����k�d�MJ���dl�y6g6�=��=��7����1'���%�,!	����wH%Im�Ii_���F����u6,���dl�y6g6�=��=�o$p���0LW�%�Mq�_vz"�����6�dt	�Y�[x?�fF���fsk����X�f�����T}2q����4J�_�,sG�����q���A&����3M����fg��Dp��o�s�X��_g������#�f���0�8�e/��Q��t>�ndeNR�l����l�m~{3;�j�coBdIrj����[��������XD�\��M����&�"K&����P�29�$f�!R�)}c�x�l�m~{377�fcx�b	��`�������
�O1-/�6��'6�+����^9D�p'��3j�����	,����������fx4��2�r���k�����*]��2$��bYv:�
�n�x�3~(K,�^�d��{�.M�ev�p�������6F:n��|���O����9����f��������E���+��t��i+,������O2D�x3&��&A�%'��x��WAk�jr��@��,��`c��I^� M$�+����fsk����"����d�
jo	^)����9����}��PU����0a��S�������`��t����f����NU=�<�3�_��>�����6�@E�T�u�M?�5&�`��Tl�2=S�����,pHY'����%�=�
�����Tq�TY�=�	e	��y6g6�?��W#?����%%��d,�5�����j��Z���V� ����u���i%9^��9�J���0����
+�����Ly6g6�=����]E3#�_�9�2s���>}��2?��S�F�S�a3F#$����YS�M;9�����~#�:����������Y*N����9�������X����F����QS��
\��x����Kl�qSRk��k��k��k��k��k��k��k��k��k��k��k��k��k��k��k��k��k��k��k��k��8��bk��k��k��k��k��k��k�e�]�����:@�Y\5�^5�^5�^5�^5�^5�^5�^>�����^*I��!I/�
x����5�^5�^5�^5�^5�^5�^5�^5�^5�^5�^5�^5�^5�^5�^5�^5�^5�^5�^5�^5�^5�^5�J��
x��x��x��x��#;��h7��0�T��Cs`o�B��/�"�8�M����$���� � � � � � � � � � �2 � � � � ������l��CX�/ET � � ��MT��6~���p~rW� � � � � � � � � � � �m~AA39��D����W��n��sR��-�fG��3s��,4�h���n�A����n+8���R&�S��y�����bYD���Y�9�������&���'>� ����x����^��7i�S(����+k�[�J��#�_�������Q��" EZ��	��[%Y����[e���\�0�����&��Z,��&����y?��f��
y��O�`3��D$�3���������`����<�C����9�������'t\A��Y?e�<��Bi�1��=����������d�����
���1���?��Em�fF�cL�AKz��zC
��H[�L3�f+��k����J�*�D��j���9������/)�"��y=����c�-������+20�kmf�zA%�?g���ff��fn!������O%�=�]�)�4.)�_��;��z�v�l�����8A�s=/���Y��P&�6�=��I)T%)�(D��fsN��=�Z$�K�R9q2�PL�?��fF�yM	��G��o���
L&a���b?��3Be��6��}��y��p�#�Q��Lq��_�~�7����p]PNlsk�������V�,#UI�B�����3
�O�a/x�+�=��Q�I����[1)��k`���1��N��n���d�R0���:DE�B~�hV�`��>o���1F �a�a�`�����?y��\�F-�+��W��+�5�8�w�o���Eo����c+x��|m�Y��1��n�����M����3$���2��bC4'���$vi�^m~�q�m�+��r�)K�w�y����$��VM��?+
�.M�n3o{fF����4wI�������"��H�Q�fh��"�����&w>�u������xg�I6r���
F'��F��C�`������d^�$��3}$�~D�7����7s	����j��|�R��[26f<��;�l����n��C�&���a3���43B�>Ed����R��q����1IvFT?�RH�G��\B���������U��~#�#y�fL7��`or�Q7��qBz��?����sb�2�����&�����h��.�@��� ����df�R�'f���=��D�O?T��~6�=��?�[�J��HD�O��&h/O62���@�������Vxt��sAT�������&�����3zE��Eu�R���Cw�N���VU!���wD;����tC�!���wD;����tC�!���wD;��z�z(Z��t��d�%U���$n�hY3N
HwD;����tC�!���wE��z*��2su���M�q���������P�p�f�����H�tC�!���wD;����tC�!���wD;����tC�!���wD;����tC�!���wD;����tC�#6$;����tC�!���wD;����tC�!���wD;����tC�!���wD;����tC�!���wD;����tC�!���wD;���Z�_��tC�!���wD;�����&n���[�bcO���Eoy{�p��8�H����#�@���3����������1�2�7�":���r#��u���)>� �1���a$�d~�����Ly6g6�=��=��f� iH@UT,��~m����sqv��(}6!��
V����*�x���9T�N�f�h�Czj[�����`r$? �G�'�$7�fAt7d�/���f�����\�����9���������������V���Y/\jo��?8#�Z�G�8�&X	���U�����w?����Y0�4�S�oZ�8���b&3���'��v<���b�� ��p�\Ou|F.���m~{�>z+l�2?��I�H�p6�l����P�,�R?�-^g�?r����,������p�G	�p�G	�%��]��u�#�u��9���2�������6�=��=�]���P�b�z���Y���o�c<���m�C����'�q�cR��o�������q��-J�R����Pb\�G����K�}0�
��6����������"��"_#��>� d:,E?�j��������,q�_��O����.�$,��3�����#�;�|�������\>%�d��d��4��)dt�����4`�a�0?�F9�w��!�{��zXg1�Vi� h�<�Z;4�����4CJ�su��t7B0c!��=�]�3O�	�;��.�Ho��l�1���H?��QGQ�?�F��q~;�����!�r�7�&E�Y���C��Xf����"��c�	����������3�3��xg�Em�fF���c4wI�����Hl��7a�cf%�tC��~I+?�;6=��Aif#����|�V�vdl�y6g6�=��=�]�3M����xg�Em�fF���fsk����[e���1�������|�V�vdl�y6g6�=��=�]�3M����tf�������79��������l�m~{�>fe5�AA2��Dn���}O�x_S���������</��}O�x_S���������</��}O�x_S���������</��}O�x_S���������</��}O�x_S���������</��}O�x_Qj�i�����������</��}O�x_S���������</��}O�x_S���������</��}O�x_S���������</��}O�x_S���������</��}O�x_S�������TG�</��}O�x_S���������</��}O�x_S���������</��}O�x_S���������</��}O�x_S���������</��}O�x_S���������</��}O�4<���������</��}O�x_Q�\���{5�Bx�k�(wJ�.�XB
�2S�{����8���T�
'�l��3��eZ�(���C���eJ������H&��uL�NG����4&D�I��H��%��U
9��{�� ����|��)��T�.��/+�ZE��q��`/�)��3`n������}������J�Z�p�6Tp�
�������!��i���V�J����[;�9�sq������������Ui�� ��_�T�5NeI���o{�����U�q�M��aC���nl���q�2�,I@�Z	V�;�}N��
�Vju�/�L�F�&X���I,�x�x	@�ICA��q�J"����.�z�qPQ��Q�(��8xA���R����J:�6�nq���Ukq�7[Q��P=YJ�+��B������ffff�f���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���'F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�Mh�F�4���4i�F�S6�<��7��?�8���	�������<��<��<��<��<��<��<��<��<�����<��<��<��<��<��<��<��<��<��_�<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�0�<�<��8��<��8��0��8�O4�<�
<�
0��4��<��<��<��<��<��<��+_� `L80(sN �F,����C�8
4��,b�$R�(@���<��<��<��<��<��+_�<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�,�Lc�D@�<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��<��<��<��<��4�O8��<�
<�M<��8��4��<��<�N<��<��<��<��<��+_�<��<��<��<��<�.��0��t����<��0�2��"$��<��<��<��<��<��+_�<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<����<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��(��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��(��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��(��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��(��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��(�����<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��(�[(��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��,��0�\0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�O+_�<��8lc1�����0�2�0�0�0�0�0�,0�0�0�0�0�2�0�+_�<��(��<��-��48�~��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��(3�<��<s��o7�<��<��<��<��<��<��<��<��<��<��<��<��<��+_�8��(�<��<��<�������<��<��<��<��<��<��<��<��<��<��<��<��+_���9��<��<��<��<�����}��x��<��<��<��<��<��<��<��<��<��<��+��4��/{�<��<��<��<��-�l������8�O<��<��<��<��<��<��<��<��<��8����(��<��<��<��<��<��}�<��<��Q�<��<��<��<��<��<��<��<��8_�4��,��<��<��<��<��<��<��}����<��8�<��<��<��<��<��<��<��+_���,0�0�0�0�0�0�0�0�<�S�0�3�@�0�0�0�0�0�1�+_���(��<��<��<��<��<��<��<��<��
8�1��<�� �M|��<��<��<��<��+_�8��(��<��<��<��<��<��<��<��<��<��,�_<��<��y��<��<��<��<��+_�<��(��<��<��<��<��<��<��<��<��<��<��|��<��,r�0��=��<��<��+_���/��4��<��<��<��<��<��<��<��<��<��L3�)W_y��<��
���0�_+_�<��(��<5.���<��<��<��<��<��<��<��<��<��<��<��O=����;��<��+_�<��(���?�L��<�-���<��<��<��<��<��<��<��<��<��<��<��n��-WO+_�<��(��<��?���wlr�8SM4�?<��<��<��<��4��<��<��<��<��<�O<��+_�<��(��<��<��<��-�0��|4�:�0���0����<��<��<��<��<��<��<��+_�<��(��<��<��<��<��<�����k�u���<��0�3�0�E1�/<��<��<��<��+_�<��(��<��<��<��<��<��<��<��<����<����?��N���3�3�,aQ��+_�<��(��<��<��<��<��<��<��<��<��<��<��<��<|��v��~�����?��+_�<��(��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��(��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��(��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��,�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0��0��+_�<��4��<��<��<��<��<��<��<��<��<��<��0��<��<��<��<��<�O<��+_�<����<��<��<��<��<��<��<��<��<��<��,��<��<��<��<��<��<��+_�<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��<��<��<��<��<��<��<��<���� �O<��<��<��<��<��<��<��<��+_�<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+_�<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��<��+�0�0�0�0�0�0�0�0�0�5�0�0�0�0�0�0�0�0�0�6��+1��!Qa�Aq��0P`��� @���?[�4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T4T0��<�3ECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECEA�[/G�2�z>�����L�^��e��}�-����l�d�e��6�V�7�c��Op������5/M/�L�^��e��}�-����l�d�e��&[/G�2�x.t�1zd�e����{����	Is_9z�������C(D&5�f-�>���
����X��"��|l4bS������}d�e�h"W!?FH�)<��-4��6?��py>��$�
A*F>wd�e�,������e�R	��.��a��2C��r������+�,Z>qd�e�O�~�|�r�Fz�I�����X1�V5��Q�X`z���������"_/�����Z�X���KA�����#�c ���&h���-��
F�7o�M�Q�>�%�s�z��#P�%5���E�v8��?d�9�����2~��&B\!?}
O�i�i���\��P���G��'&)%����>� N���5�����.��%��Fp!a������}�dmrR��T�v�3�G�v�v�"��9��&�+��8�2�~��Q��a�F�O�#MnE���U������5���ck�!�b��������v����L�_��rG��0D��ob-���8g�"���-c���9�3�ua,Z?�d�e�sTr��#15r<��
<�$�~�b�$9�q �S��B�>O��7��!�.i���������$4�=�x-�����d��K&[/1M�4��Y�����e=�id������!��@�����$Mx�L�_�Fj���n��G��s"����*��`���>O��i�
^-"d$�#R��4�b$�"��MO�4����i�CHj���	C-C�f5{�eZ_D�u M_����mC;i�Y*&��L�^"h1i�"y��|><�;�C��jBT����1M(D���pu� �Z��D�����>�i�f���+C�d�e���v����3]Hr�I�������G���nX;v#�]Wc��8&\�ff.���6~���3WFH�yzmHJ�W��M'���"��D�.�d���d�e���(���'� �S�A�T��r�xGV��j�f�3"���#s];@�#�k��B94��2O4�"b�N�Ms*�w&MH�3^]d�e��&FR�,���+fT�!�S����r����]�i*)8z�G���'�F�����E|����r?�]������?�d�k�LSa�.��i�����>����8�������L�BE%�e���r9�s��7��sD��0&����*������#Mt|;��h*�Y��6��m��m��m��^e��f\�{N�����/��e���A�%3|��HfT�!�S��T�9���_�y���h�{w9�3��5,��$5�3&��$�T�K���ci.��]�^��C��@@�C�#��su�N��V��������8� Q�5���e���&6�#ACM�Yq� �S�S)���H�F�F���H��O���r*����F�6Z5��>e��-����l�d�e��&[/G�2�z>�����L�^��e��}�-����l�d�cQ����l�e�,�f�6Y���l�e�,�f�6Y���l�e�,�f�6Y���l�e�,�f�6Y���l�e�,�c{�"����l�e�,�f�6Y���l�e�,�f�6Y���l�e�,�f�6Y���l�e�,�f�6Y���l�e�,�b9(\��+���!1AQa�`q��� 0P�@���?:���\��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[����3��[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��+[��(kAr��z�5���U:k����t���ET������^�S��:*�Mx>tUN��(@
�BA���` O��DX���-9������5���U:k����t���ET������^�S��:*�M~�f�s�gET��� �f��u�n93�	���S���H�F�-sD����q���:*�M~%���6q�I��x#�X�l#�N�S��3a����Xp���@A���#�Y�^��T ,���S��u;���dTvf��jB��H+�nX�b�����7 ����t��7y�j>;Lm��:���:�cq�4`'���h��6��f6}����5�,������H1N�O�WIr/I���N��3�U�� ��S��t�����Nl���`p��d����K
�D�7d
[ "k�f0�S��\Q>��W:*�C��y�(��D,�`p�K��4������Y�2O^���x@������1xL� l~��;5�FK�_y�@�[��8&Z&��fY�gjW��wr���
��X�n)�������UN����?���������"�J����(Mn�����"wMq^��qVuV/���tUN����~���|��!`�65�ky��4X��
��8�|�06���LVn2n���U:k�c��M���02q%�:| +�*�#��	�O���O�&c����t�����'�q����~Z@?�tUN���w+�L�C���5gN8,���+Q7�tUN���T�q'pO�G�n;�LD`�,����s.��D��`�uz���4d�����c��v��t���^���U\���&�,�����S������tUN������y�@�w�\WI��G"Guf������������D�Gb���������9��U\	� �� �p��S���7$G ��2��4�?t`ve�9.�D9��X#���Kh���2�Sg]3L^U�� lV�Z�7�7��@�D�+(��rV*����%c��	��f������5��)��	���;�o!����s
7�*���-�"��M�Z)��Ba���-e��
��@�������t��H92�'��s�)��>]j�<-TG��@�XC�����(��|
�`�/���!7b����l�6q���)��Z�7#��Z�� ����5��H�0�D��A�,dm^g��X�<�r���������9F�H��^=H�n�;[�-��p-�����C�1x~I��� ����5���	��oR�~���wG�����Q��!�yZ�~����$)��~��,���&<�h���L�S�G"L��ZKEmr��)���r�)-���C�6q���|�\oI�U:k��r�������Y�z	��x~�����1+x�-�V�'�����8�-�&<`V��x��ZY�@k��:*�Mx>tUN��|���5���U:k����t���ET������^�S��:*�Mx>tUN��|��9N�l���[!l���[!l���[!l���[!l���[!l���[!l���[!l���[!l���[!l���a���\�[!l���[!l���[!l���[!l���[!l���[!l���[!l���[!l���[!l���[!��B���,!1Q�Aa�0Pq����� ��@p`��?��4�0��w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���DV&8cJ�k��&���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�m���~f���w�a��8bM�7�'��p�5��m��no�:�x+d���]�6�������`Y�2�y���m��m���P�f�5z�W��s&�����F1r����8rD3��Z��x������4!�Y�<�e^-���������B�����.5��KH�C�1�2H����X���#��j��@�p��^s�xVK����8��6JnX������+

Z�H��@X�G(K���d��@
�8�*/�����5�d��Pifa��HbZ4�o9����J��+�G���H�Z7���A$,����$1�D��1x�m�	����F�O�E���c��9|[
> ���]c1�I��a�R�%�
��t���8��6S�SD�Bt����1�-
�f�/��p�m���|a�Cd������D(rX"X�	�P�v�h�t]@^����:SH-]Pf��08`\Rpix���4�2��`5��$]W�U��@3���s����l���)�JCL����0�pDZ��
B�`�ZA"9$,���3
���s�K|%xZ��G$��\9b�k�|L�����d97=t�)�gAI��3�,
�GS"�,��� �T��������s&�����?�����hu�P��4(H9^>$r���Z�UT*��Gf>>��u%�f�hTmx�3`�t�V�xUF*UV a��b�jX����T��R�������^����������@�b5��e>�N�.
H��p~c��	GR��-����n(��c\r�ZR�J������xp����V�+�����e�g&�[h
z��'XZ�W����8�*-�����P�������-�U{�I�L	�n
�U��[��:����pd��	���go��u]��/��\�7�D�W- ��@�����1�!L���P�����{���>Ut��M�i�y�"mpr��n����$%�?$,R��X�:N�w�`���{���63���,Y�@<<�������Y�@.,�����(��4pU?2��	� |�&,���`���[n|�����0a��!�8J���<
��/;i�YYE-����;�-��W��X�i���u��5��0~=c��9����@9T���Zzy�,%���U?2��W�&�\h� 0�7l�y�C���`���U��k<qd��_�0+L.1^��w����f2�HJ��
�q?h�����a�����M�H�M%��o`���`7Z����8��j��3�@�%�X�Kt�(,
����Q��������S����2m����|�dLSu���@MuQ_���s
�	qcAE$,�����#D��t��,�J�b�;��~qS��K*`���[���Z
����e���;�OI������(�L�� �s������)��R�T8L\#�R0�k1���E���n�W��5�	�B��d�"J�+[Z���G�c��+�o�*�,�ha�a��y���!%b�1���Q��<�2�~"Tz�a���R5�K����1��������0�J��U��KRy��|2��b�h�����g8X��^����	yEUq��i��6n�f�Jb8!&+��X��"���&�?��sx�(|&.dm�AX���%�������H��%���8��yZ�����E�F!���;KA~S+���,���<q�@����q���������������3*��au�~Q,A�X�����*�1�gK�<�F2x[�4�@�
��
1���9� -[F�@l��	\D��1a�.���_�d���?�����E\:�
��c�[��a��8�(Y�����j�6�'�����g�Y��U�(�Xl�%*���� �i�'G/�o���PP�������>����LY�G�:�}"]V]�Z��
|���j
�1*�����j��A��1�1�D���3������C��zw�����A
i��$�.8���a�"m���1�f�Z���@*�.�Wq%����m��nob>��5�������4?�l&��l����rqhV�����nd�s���2m����b���p��$�5�����@��P��>��S��o������_9�U�Tb����M�A|����Tpg��3<d<�������rDb�����E3f���h�D���.�����4G��Ux�$�E1�B���xFU�v�b��g	�I)�q�H
Opy�3���g������Uyslr���s�b[��"uF������-_h<P��4q��g�y��M�7�Y
Jpl���@�Xq+�-�����.N��in,2�WY0|.,�k+�2y��(&��c1�pu*N*Z4�9`@�Kv�9�,������ZK��X�1InH%�f�bDS���T����l��[�Atj�s��MG�&���(���1�x��R��B
/���K��h�v���l�+��X��z�L>3�q�S�������= �H�<�Q�B#���m��m���?����]����'��M�7��s&�������m������?�(�����%
�e��&�����0�5��84����$�X3kLN��B�J�[����L0�Uc�z.u�	� f����<T�^�Kph5X�%���3�C�����8��&�#@qY���
F]Q*��U���D^�q���.�������������@�A��v9Q|�p9���^0�
��R�s�
�&�3x����Vhk�Y^?8��`<W�(\�/X4��B��
�9Y�[nd�s{���n3�>P���%a@�8���@�h�[��~U���3V�Y1Z�@,�tc��P�;M0�l�D� `�o6a]<.��!�F��cU9b!.�N�r�H
`V����
���"�1�����6��.>3�U�\�6�\�U/	�)~u�����8��	����(�G�H-����x&�5��kc�D��20���;'5���8@�9�~�����i��f��4A'��Z��x����U"K���J�6`gs���!�J+nf*�����m�wEUs����H�.��� Y��se�;�$��k����8rk8��(����9�5�Q�Mp�E���,�u�	{Q���%�.,Y��:��]U��X�1��5@`2���9x�4x��"|�S��4�xU��N**����(�����S����������>P1�QXu!�f�Z^a�x�����iV�����b���6 ���SR*�eG�f;�4W4��	T���L5���G
5�p0�N%���U�LPU���� �[���m9���QD�5��0H<2�q�������Z�F,U,��� l�q.2$WS�2�����M�7��"�}&��1w�H=%-2���1���)��8�X�8)(q00��f�i|�X�������F�Q0���/�}������,����j�0t+J������A��lS2��*��]X8�����e��(`�|t��?��)B�)(83��+d�X��@f�H%�e�Q����� ������_�
9��e�����h-L-mJ�Z�w���l#�P`�	T�P�	-�m��)����i�@�-�Vf8�.��U�T�4�(`��
.�?+e�L�<�-�;��Pt�"�����
�-��0��*�JG	JN$r�+�M�"4`�"%�o(Z���XLc��9b�^�84�H���,�X�#.�Mo�����j�����s�,��^q�zr)U�T8[!��a�H�=��++����]����77I��L�"�h2��c*xLQ8$���p-\o&RH,�����M��Ue5����UaeA_u8�1ec�T�AQX�9<@�r��(,xDU��8��<Y�5�Q*����0�#�n�U.-�
��V�Rb���k89��f%�[�)���=���M�7��s&�������m���������v67��p
YSk�[��6��o�]*���Lq��������f�&�s#M6��"n�:S"�2�����b�s+z���A�m��[���f��6�Y�����mn�ku�[���f��6�Y�����mn�ku�[���f��6�Y�����mn�ku�[���f��6�Y�����mn�ku�[���f��6�Y�����mn�ku�[���a�K6�Y�����mn�ku�[���f��6�Y�����mn�ku�[���f��6�Y�����mn�ku�[���f��6�Y�����mn�ku�[���f��6�Y�����mn�ku�[���f��6�Y������A�[6�Y�����mn�ku�[���f��6�Y�����mn�ku�[���f��6�Y�����mn�ku�[���f��6�Y�����mn�ku�[���f��6�Y�����mn�ku�[���f��6�Y������xC6�Y�����mn�ku�[���f���5�6�����������^�7����h�v�����������^�7����h�v�����������^�7����h�v�����������^�7����h�v�����������^�7����h�v�����������^�7����h�v�����������^�7����h�v���������*��mZ=������W�6����6�����v����r��[�����]�^�7����h�v�����������P<� LS�(,W'�WpZ�6���d�xk�����o�{�j�����m�������
 [}ae _Th�q�3Q{����=e�G4M��0����[���o�{�j�����m������Np9u�(�.���f��p� ��k17��
��X�������W�6����6�����k^8�CA���k>g����$������v6��7�{��j�f����s&����#���O��Lf2|'���(f$��W�v��b������W�6����6���3����d���/�*�5�wD�!+Fc�ALL���������/Q�=�SS�SS�SS�SS�SS�rH��?2�w<�Ng�K���[�
���Jjy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�jy�q�������������������������������������������������������������������������������������������������������������������������������������?�������������������������������������������������������������������������������������������������������������������������������������SS�SS�SS�SS�SS�SS�SS�SS���s&�����a�C�SH�*�������2�
��Dbd�C�O�C�_�cP��&��>�>�>�>�>�>�>�>��J\1[j����>^�����N5��j ,��}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}BT����P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�AE�V��O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�B%@�����������������P`���6����y�z�?�d�Gx���x	�n��C�����)G��f��7��[��/��T��(����&��N�5n�Y����o��a�����Gk��M�7��G��qK�.�k����_x�!p��N_���	z	�-�_��9�|�7���P������c�N��_W�|�l��������n����LDl{m�^�7����h�v����������B������h�W�)k��z��1/�������,V/��R����Q�F��2F�A�	^c����~��7��?�<
������v�^���v�nd�s{xdxLF��������-�v��2X4����qm]�0����y8���
���9`�����yc�����<n�w�{��j�f����s&����#�U�W�#���u��p@�3�[U�8��+��R��1O�I0$�|�������2�q�#�/�$���{��j�f����s&������_9����a��0����p�������w��p����V�����nR��0i������2��IKxo���
��vmZ;]�2m����s	,
�U�
���6�VxGZ��.+��@��.�:�@���yM�p�,�N�L"�����]��7�VE�b������b<��~�g����V1���u'�����vmZ;]�2m������V���Aka=
pp�a�&�f�x����4�y' P6N&��;:%z��x��	��4��E:
�^x����N��7'��d�3�{u�<�e��d��7����h�v������|�0��;�.���c�^l;1�lP<0��r\����X5��)�
����o���6�Pc,�n�[�<��+�3�tt�>'��0�D�"4���i�Q��Y���
��;��!�	?�7����h�v���
,<������	d����1�r��Q��0{LG���]H=;�J��y��n;��ea�`���d����Gg�1$�w��@�.A

?�x&7�b�������u��'��9C"L�c�Q�����Gj�
,<�X��b��q�H��F�����a�Fsp��M����P�q~9k���8`�b��^�	B9#���N#��H��pu��U���^�3�,P�v>`l����������^���v���A�������I�/�%0@�\E����������,�
���_��������O�!���>_�'J�K�7�/��=*J
p��qr� ����5L�O�
��vmZ;\A�����m����wK5��J ���X�u��)�����T����N1k����0$�?�@ �e���<������$x4�0�#4��l�*���=���.��j�f����s&�����mI
s,��W�*�ds��ZQ��#M5��
F/����u����� �c�q������tHu�<�� ZFh���`9=���M���s���m�'�������q�)@��)m�'�o�{�j�����m��jq��
������M�������*��[�)L.P�
@�K��������0����JR��)JR��)JR��)JR��)JR��)K��5�}�)JR��)JP�3.[���[U�W�4kZ�������Z}��)JR��)JR��r�c��o�8]���~cv�����1W!���Q��(fK�ovR��)JR��)JR��)JR��)JR��)JR�bDx�v4�)JRG��s&�������BP��j�2��c\p��(*��-^9aA�G�%�
5�i'��,q`am���b����SBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSB,�yM	M	M	M	M	M	M	M	M	M	M	M	M	M	M	M	M	M�HO	gUx���m�.��%3@N8��9��dX�������������������������BxiR��1p���K��<S�2�� �0'�2�������������������������������������������G�%4%4%4%4%4%4%4%4?]�2m���K��*]�%>q�!�aoa�e���������k�W3��U��]�|7?Z�f����Z*�����A�-���2,9�<����+�xCL���v����6���"���!
�x6T��h,�������e(��s���`C�%C���������K;#}��	�pz����oQ�=���?��_�Dh�������K�i�%����h�v���������������L��4�8�mH��o��G�u����g2�`�p�;S�6C zf��W�NC..�=��^�S}��D��	�k�=j�:����H��gGwI���-�YC�]fIvO������6����i,�b`��Cq���;-��c�����P(�=��.[P0��p����O����N�P,H������Z�o+���j�����m��_�M.��uI�b�)���$��:�'���G�u���E�Np�?�������������	|sX�m��d�d��j�����m��h%+�L���6���v0�����^����9���_&
�C}���j�/kqO�{�8��g���m���gZ�l���3.xV���X��{V��m��no���sbs��zD��`��a���G�u���U������|�����7�as?}S��7X\W��J,�'��Fq�4i}����X�X�~�.:���x�Bo�X�����v�nd�sT�@�br���X!l�`v0�����J���?�f�������]�^����btP�ef��%�g�c��vxj+<��E�=g�����_��	����tg��OT����1�wA��� ^�+�u�[�*��X���8�_���j}�C(�7�B@7��\�'�qe�0�5&����s&������R���ff0 ��0L	Z}��N3.����V\���5����J������|�^��c���3j|e��R����	�Z,N�����}������9�xEf���N�np��]'\���*�C�g�s&x���!��s.zxL�u��X�I�/o�IZ.37��=G�t}�Z���'����Nn#���K�����Y��I�v������M���0��������c��;��K�;}�k��1�`[���po��a����/9��&p~D�������$r����������yw��"L���t{]�G������+�.�]����m��no����9���2<?D�/�>��G����X�����g�GhMO�w�{��j���`\���3����)�%��<
�/����h��������z�q/�L���33�a�o��h�v�������8d�\o�3l�~k��y�H�1�'�P��D���9d��i�q����T�(���CW��&`������Kamx���n��lzT2��){{�����6���3��I�������OA��R�x��������W��sz�	��:M?���S\�i��l�����=����e���_�	w����M�7�b��p��E7,����?t��x��-Z<1�Xp���/`w��83Bu�rR�Ok�}���t����g�W�=��f��N�'���4������'���t�[?�s���l��>���B�O�~"���'��z�g�����W�6������dT����DYk@�i�~�nd�s{B��4<��3���G�mT#�\����T�N�8,2E=��s�3���4��H�ul���q�;��W�����������dYm������k�0Zh����_c=K~��������z�n?�8��u����y�AOh����z1��o�S�>���^�7����h�v�����x'0�<,���F���q���*��J5�!��pP����@�6��7�I��M��o��t�����&��7�I��M��o��t�����&��7�I��M��z�O�2^"Bz��yr=����D(�q}��!��=jei��������M��o��t�����&��7�I��A�-�%�s��J���9d������AEq^	�/���s��Fi��0��`?�)���q}��Qt��^�����[����&��7�I��M��o��t�����&��7�I��M��o��t�����&��7�I��M��o��t�����&��7�I��M��o��t���2���y�&��7�I��M��o��t�����&��7�I��M��o��t�����&��7�I��M��o��t�����&��7�I��M��o��t�����&��7�I��M��o��t�����&��7�I��G+(�a�o��t�����&��7�I��M��
8��m��m��+�xJ�p�"��-������,�g��G��-���<����k�_�)��<O��JU��5�O����������t�������*��\��R��W�1E�56��NH�x���8����=�h�.SsG���.�9D8�O�����
1\WR���}u7�C}���V��m��noo����3yt����]&��*Gx�/kj�Kw�g�N�>���y/��>^���=q��2��	�/���J�#�����	��y��)���P�I����y,��m� y� Y�'�"$H�D���zZ����r�]����pp�}"_	q^O�!�/�I��&W[K��%���g��'�d�����������vmZ;]�2m���2<;�����3�4g�p{Ovv���������.�\�E
���*8���&�jOO��:L��Vt7�"l�z'�nE��C�g�����f/c�.����%����T���8�WBp]�,z��!t)o��?����`������N:�~g�~g�~g�~g�~aP�<�]~��������Gk��M�7��G�u�����{�f�����|�4o���~|n>�~�����8.�7�2�f:_Rg���D"��Y+%Y������T������R��)/U\E�a.X�[I��������e��]'����^��A����v�nd�s{xdxw^�����1%�)���p�.t��
����G�����`U3�=c��.�9D�l�!���B6$��<��5{�E�zTX�$�_������%�����B��e;[5����^�g8�
��d���7�8O��3��**�x������B���0���!����'N,p��������I����9�p���'�\<T���>2K9��L�|A�Ose�=E�Y�/��s&����#�����A).z�.�n��v��f��S�S�K����pN��J�����<�~&��������������a"��S��<:�h$m�p3���{h��������<"�=����,���d���d���4o��9�cr�"��H�o��s_���S��=�h^��B��Y���v�����������^�7�����=<�f;�t���Y�+���"�|>H����|$���O��j�I��d�iZ���G-����������o�zG���!�"T�m�rf���'�W�ccG�=�[��eM;�|��edL��C���fr����F]4A��6�����������^�7������=	���X�?/g����Y�xo�`� �Q�>���&u���$�_��a�����8"%����m��noo������}���V��m��noo������}���V��m��noo������}���V��m��noo������}���V��m��noo������}���V��m��noo������}���V��m��noh����V\�u+kS��������}���V��m��noh>���Q_��r������t��f0`��0`��0`��0`��0`�����m�`0`��0`��0`��0`��0`��0`����=}��0`��0`��0`��0`��0`��0k/Xt��0`����[�*������s&���<c`pFAN[�O�MHl��0u����2U�y�d�@ �Q������y�LQuP7�{���*�!�y����j&}���6���3������2*��p����
@^6rS�vi_������S<�8�U�����]V!���je��V�,;����N�����%!��R��mj�|``�4�+�m��m���w)P@���Lld���0.���ME(+�������VA{��b�\���/��\�!�k���a�E[���I����V�)1@�+�"�X/�r����nd�s���2m������6���m��no�T0�\*���X��V�8b� nr l)Kkph5W:((#���c�H��\X��Ib�0��K�e,����5�,4n��,W8s�C�8ak��
Q�xKD1��xgwB������v<2���+�J�F�3�a7!*�N9-���nd�s����k#8{��SKA�\����
�F�0a�VPU�_x�
S_H48#nxcCQR���taybG�G�q
���x�0V|`�	�t-9�R�8d�)Ams��fq��ZJ�x0�q+i��^���kUE�X9]J��t%$�����m��m�����������nd�s���2m���������C������f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���-����H(�j�q
f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�����f��7�Y�:���oN�zu�q�Z+����=|x���
#18David Rowley
dgrowleyml@gmail.com
In reply to: David Rowley (#16)
Re: Make tuple deformation faster

On Mon, 2 Dec 2024 at 23:24, David Rowley <dgrowleyml@gmail.com> wrote:

I spent all day today reviewing and fixing up a few missing comments
for the v5 patch series. I'm quite happy with these now. If nobody
else wants to look or test, I plan on pushing these tomorrow (Tuesday
UTC+13). If anyone wants me to delay so they can look, they better let
me know soon.

After making some last-minute cosmetic adjustments, I've just pushed
the 0001 patch.

I planning on pushing up to 0004 over the next 8 hours, pending
feedback from the buildfarm.

David

#19David Rowley
dgrowleyml@gmail.com
In reply to: David Rowley (#18)
2 attachment(s)
Re: Make tuple deformation faster

On Tue, 3 Dec 2024 at 16:54, David Rowley <dgrowleyml@gmail.com> wrote:

After making some last-minute cosmetic adjustments, I've just pushed
the 0001 patch.

So that commit broke all of the debug_parallel_query = regress
buildfarm animals. This was due to how I'd changed the
TupleDescData.attrs array to a pointer which I was trying to keep set
to point to the FormData_pg_attribute array which came after the
variable length CompactAttribute array in the TupleDesc. That turned
out to be hard to maintain as in typcache.c, we can get TupleDescs
from shared memory. When that happened, I was adjusting the ->attrs
pointer to the local process's address after the call to
dsa_get_address(), but I didn't consider the fact that that was
changing the shared TupleDesc :-(. Other processes (of course) didn't
like that, that's why the regression tests failed with
debug_parallel_query = regress. The bad attrs address caused issues
during lookups of the RecordCacheHash hash table.

The following was enough to break it:

set debug_parallel_query = regress;
SELECT pg_input_is_valid('34', 'int2');
SELECT pg_input_is_valid('asdf', 'int2');
SELECT pg_input_is_valid('50000', 'int2');
SELECT * FROM pg_input_error_info('50000', 'int2');

-- While we're here, check int2vector as well
SELECT pg_input_is_valid(' 1 3 5 ', 'int2vector');
SELECT * FROM pg_input_error_info('1 asdf', 'int2vector');

In the attached v7-0001 patch, I've now got rid of the
TupleDescData->attrs field. Figuring out the base address of the
FormData_pg_attribute array is now done by the TupleDescAttr() inline
function (this used to be a macro). Because that function is called
often in a tight loop, I wanted to ensure compilers wouldn't calculate
the base address of the array on each iteration of the loop. Looking
at [1]https://godbolt.org/z/dvnGfnqxz, it seems gcc and clang are smart about this and calculate the
base address before the loop and add sizeof(FormData_pg_attribute) to
the register that's being used for the element pointer.

Changing this then caused some other issues... The GIST code was doing
the following to get a TupleDesc without the INCLUDE columns of the
index:

giststate->nonLeafTupdesc = CreateTupleDescCopyConstr(index->rd_att);
giststate->nonLeafTupdesc->natts =
IndexRelationGetNumberOfKeyAttributes(index);

Since I'm calculating the base address of the FormData_pg_attribute
array in TupleDesc by looking at natts, when this code changes natts
on the fly, that means calls to TupleDescAttr end up looking in the
wrong place for the required FormData_pg_attribute element. To fix
this I invented CreateTupleDescTruncatedCopy() and used it in all the
places that were fiddling with the natts field. I also didn't see any
reason to copy the constraints for the truncated TupleDesc. Indexes
can't have constraints.

The attached v7-0001 patch is the previous patch adjusted as per
above. v7-0002 is not for commit. That's me cheekily exploiting the
CFBot's CI testing machines to run in debug_parallel_query = regress
mode.

David

[1]: https://godbolt.org/z/dvnGfnqxz

Attachments:

v7-0001-Introduce-CompactAttribute-array-in-TupleDesc.patchapplication/octet-stream; name=v7-0001-Introduce-CompactAttribute-array-in-TupleDesc.patchDownload
From 543fa66050ef98f5c092500f93a24b0409c03bb1 Mon Sep 17 00:00:00 2001
From: David Rowley <drowley@postgresql.org>
Date: Tue, 3 Dec 2024 16:50:59 +1300
Subject: [PATCH v7 1/2] Introduce CompactAttribute array in TupleDesc

The new compact_attrs array stores a few select fields from
FormData_pg_attribute in a more compact way, using only 16 bytes per
column instead of the 104 bytes that FormData_pg_attribute uses.  Using
CompactAttribute allows performance-critical operations such as tuple
deformation to be performed without looking at the FormData_pg_attribute
element in TupleDesc which means fewer cacheline accesses.  With this
change, NAMEDATALEN could be increased with a much smaller negative impact
on performance.

For some workloads, tuple deformation can be the most CPU intensive part
of processing the query.  Some testing with 16 columns on a table
where the first column is variable length showed around a 10% increase in
transactions per second for an OLAP type query performing aggregation on
the 16th column.  However, in certain cases, the increases were much
higher, up to ~25% on one AMD Zen4 machine.

This also makes pg_attribute.attcacheoff redundant.  A follow-on commit
will remove it, thus shrinking the FormData_pg_attribute struct by 4
bytes.

Author: David Rowley
Discussion: https://postgr.es/m/CAApHDvrBztXP3yx=NKNmo3xwFAFhEdyPnvrDg3=M0RhDs+4vYw@mail.gmail.com
Reviewed-by: Andres Freund, Victor Yegorov
---
 contrib/pageinspect/gistfuncs.c        |   4 +-
 src/backend/access/common/heaptuple.c  |  53 +++++------
 src/backend/access/common/indextuple.c |  30 +++----
 src/backend/access/common/tupdesc.c    | 109 +++++++++++++++++++---
 src/backend/access/gist/gist.c         |   5 +-
 src/backend/access/spgist/spgutils.c   |   4 +-
 src/backend/catalog/index.c            |   2 +
 src/backend/commands/tablecmds.c       |   4 +
 src/backend/executor/execTuples.c      |   4 +-
 src/backend/utils/cache/relcache.c     |  21 +++--
 src/include/access/htup_details.h      |   4 +-
 src/include/access/itup.h              |  10 ++-
 src/include/access/tupdesc.h           | 120 +++++++++++++++++++++++--
 src/include/access/tupmacs.h           |   4 +-
 src/tools/pgindent/typedefs.list       |   1 +
 15 files changed, 297 insertions(+), 78 deletions(-)

diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c
index 029072567a..68d59cb3ec 100644
--- a/contrib/pageinspect/gistfuncs.c
+++ b/contrib/pageinspect/gistfuncs.c
@@ -242,8 +242,8 @@ gist_page_items(PG_FUNCTION_ARGS)
 	}
 	else
 	{
-		tupdesc = CreateTupleDescCopy(RelationGetDescr(indexRel));
-		tupdesc->natts = IndexRelationGetNumberOfKeyAttributes(indexRel);
+		tupdesc = CreateTupleDescTruncatedCopy(RelationGetDescr(indexRel),
+											   IndexRelationGetNumberOfKeyAttributes(indexRel));
 		printflags |= RULE_INDEXDEF_KEYS_ONLY;
 	}
 
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 9e3407bf98..982e7222c4 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -83,6 +83,10 @@
 #define VARLENA_ATT_IS_PACKABLE(att) \
 	((att)->attstorage != TYPSTORAGE_PLAIN)
 
+/* FormData_pg_attribute.attstorage != TYPSTORAGE_PLAIN and an attlen of -1 */
+#define COMPACT_ATTR_IS_PACKABLE(att) \
+	((att)->attlen == -1 && (att)->attispackable)
+
 /*
  * Setup for caching pass-by-ref missing attributes in a way that survives
  * tupleDesc destruction.
@@ -147,12 +151,12 @@ Datum
 getmissingattr(TupleDesc tupleDesc,
 			   int attnum, bool *isnull)
 {
-	Form_pg_attribute att;
+	CompactAttribute *att;
 
 	Assert(attnum <= tupleDesc->natts);
 	Assert(attnum > 0);
 
-	att = TupleDescAttr(tupleDesc, attnum - 1);
+	att = TupleDescCompactAttr(tupleDesc, attnum - 1);
 
 	if (att->atthasmissing)
 	{
@@ -223,15 +227,15 @@ heap_compute_data_size(TupleDesc tupleDesc,
 	for (i = 0; i < numberOfAttributes; i++)
 	{
 		Datum		val;
-		Form_pg_attribute atti;
+		CompactAttribute *atti;
 
 		if (isnull[i])
 			continue;
 
 		val = values[i];
-		atti = TupleDescAttr(tupleDesc, i);
+		atti = TupleDescCompactAttr(tupleDesc, i);
 
-		if (ATT_IS_PACKABLE(atti) &&
+		if (COMPACT_ATTR_IS_PACKABLE(atti) &&
 			VARATT_CAN_MAKE_SHORT(DatumGetPointer(val)))
 		{
 			/*
@@ -268,7 +272,7 @@ heap_compute_data_size(TupleDesc tupleDesc,
  * Fill in either a data value or a bit in the null bitmask
  */
 static inline void
-fill_val(Form_pg_attribute att,
+fill_val(CompactAttribute *att,
 		 bits8 **bit,
 		 int *bitmask,
 		 char **dataP,
@@ -349,8 +353,7 @@ fill_val(Form_pg_attribute att,
 			data_length = VARSIZE_SHORT(val);
 			memcpy(data, val, data_length);
 		}
-		else if (VARLENA_ATT_IS_PACKABLE(att) &&
-				 VARATT_CAN_MAKE_SHORT(val))
+		else if (att->attispackable && VARATT_CAN_MAKE_SHORT(val))
 		{
 			/* convert to short varlena -- no alignment */
 			data_length = VARATT_CONVERTED_SHORT_SIZE(val);
@@ -427,7 +430,7 @@ heap_fill_tuple(TupleDesc tupleDesc,
 
 	for (i = 0; i < numberOfAttributes; i++)
 	{
-		Form_pg_attribute attr = TupleDescAttr(tupleDesc, i);
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, i);
 
 		fill_val(attr,
 				 bitP ? &bitP : NULL,
@@ -461,7 +464,8 @@ heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
 	Assert(!tupleDesc || attnum <= tupleDesc->natts);
 	if (attnum > (int) HeapTupleHeaderGetNatts(tup->t_data))
 	{
-		if (tupleDesc && TupleDescAttr(tupleDesc, attnum - 1)->atthasmissing)
+		if (tupleDesc &&
+			TupleDescCompactAttr(tupleDesc, attnum - 1)->atthasmissing)
 			return false;
 		else
 			return true;
@@ -570,13 +574,13 @@ nocachegetattr(HeapTuple tup,
 
 	if (!slow)
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		/*
 		 * If we get here, there are no nulls up to and including the target
 		 * attribute.  If we have a cached offset, we can use it.
 		 */
-		att = TupleDescAttr(tupleDesc, attnum);
+		att = TupleDescCompactAttr(tupleDesc, attnum);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, tp + att->attcacheoff);
 
@@ -591,7 +595,7 @@ nocachegetattr(HeapTuple tup,
 
 			for (j = 0; j <= attnum; j++)
 			{
-				if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
+				if (TupleDescCompactAttr(tupleDesc, j)->attlen <= 0)
 				{
 					slow = true;
 					break;
@@ -614,18 +618,18 @@ nocachegetattr(HeapTuple tup,
 		 * fixed-width columns, in hope of avoiding future visits to this
 		 * routine.
 		 */
-		TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(tupleDesc, 0)->attcacheoff = 0;
 
 		/* we might have set some offsets in the slow path previously */
-		while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
+		while (j < natts && TupleDescCompactAttr(tupleDesc, j)->attcacheoff > 0)
 			j++;
 
-		off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
-			TupleDescAttr(tupleDesc, j - 1)->attlen;
+		off = TupleDescCompactAttr(tupleDesc, j - 1)->attcacheoff +
+			TupleDescCompactAttr(tupleDesc, j - 1)->attlen;
 
 		for (; j < natts; j++)
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, j);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, j);
 
 			if (att->attlen <= 0)
 				break;
@@ -639,7 +643,7 @@ nocachegetattr(HeapTuple tup,
 
 		Assert(j > attnum);
 
-		off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
+		off = TupleDescCompactAttr(tupleDesc, attnum)->attcacheoff;
 	}
 	else
 	{
@@ -659,7 +663,7 @@ nocachegetattr(HeapTuple tup,
 		off = 0;
 		for (i = 0;; i++)		/* loop exit is at "break" */
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, i);
 
 			if (HeapTupleHasNulls(tup) && att_isnull(i, bp))
 			{
@@ -707,7 +711,7 @@ nocachegetattr(HeapTuple tup,
 		}
 	}
 
-	return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
+	return fetchatt(TupleDescCompactAttr(tupleDesc, attnum), tp + off);
 }
 
 /* ----------------
@@ -892,7 +896,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 		{
 			if (attrmiss[attnum].am_present)
 			{
-				Form_pg_attribute att = TupleDescAttr(tupleDesc, attnum);
+				CompactAttribute *att = TupleDescCompactAttr(tupleDesc, attnum);
 
 				targetDataLen = att_align_datum(targetDataLen,
 												att->attalign,
@@ -1020,8 +1024,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 	/* Now fill in the missing values */
 	for (attnum = sourceNatts; attnum < natts; attnum++)
 	{
-
-		Form_pg_attribute attr = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (attrmiss && attrmiss[attnum].am_present)
 		{
@@ -1370,7 +1373,7 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index bb2c6a2bcc..38aeb23087 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -303,13 +303,13 @@ nocache_index_getattr(IndexTuple tup,
 
 	if (!slow)
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
 		/*
 		 * If we get here, there are no nulls up to and including the target
 		 * attribute.  If we have a cached offset, we can use it.
 		 */
-		att = TupleDescAttr(tupleDesc, attnum);
+		att = TupleDescCompactAttr(tupleDesc, attnum);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, tp + att->attcacheoff);
 
@@ -324,7 +324,7 @@ nocache_index_getattr(IndexTuple tup,
 
 			for (j = 0; j <= attnum; j++)
 			{
-				if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
+				if (TupleDescCompactAttr(tupleDesc, j)->attlen <= 0)
 				{
 					slow = true;
 					break;
@@ -347,18 +347,18 @@ nocache_index_getattr(IndexTuple tup,
 		 * fixed-width columns, in hope of avoiding future visits to this
 		 * routine.
 		 */
-		TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(tupleDesc, 0)->attcacheoff = 0;
 
 		/* we might have set some offsets in the slow path previously */
-		while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
+		while (j < natts && TupleDescCompactAttr(tupleDesc, j)->attcacheoff > 0)
 			j++;
 
-		off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
-			TupleDescAttr(tupleDesc, j - 1)->attlen;
+		off = TupleDescCompactAttr(tupleDesc, j - 1)->attcacheoff +
+			TupleDescCompactAttr(tupleDesc, j - 1)->attlen;
 
 		for (; j < natts; j++)
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, j);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, j);
 
 			if (att->attlen <= 0)
 				break;
@@ -372,7 +372,7 @@ nocache_index_getattr(IndexTuple tup,
 
 		Assert(j > attnum);
 
-		off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
+		off = TupleDescCompactAttr(tupleDesc, attnum)->attcacheoff;
 	}
 	else
 	{
@@ -392,7 +392,7 @@ nocache_index_getattr(IndexTuple tup,
 		off = 0;
 		for (i = 0;; i++)		/* loop exit is at "break" */
 		{
-			Form_pg_attribute att = TupleDescAttr(tupleDesc, i);
+			CompactAttribute *att = TupleDescCompactAttr(tupleDesc, i);
 
 			if (IndexTupleHasNulls(tup) && att_isnull(i, bp))
 			{
@@ -440,7 +440,7 @@ nocache_index_getattr(IndexTuple tup,
 		}
 	}
 
-	return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
+	return fetchatt(TupleDescCompactAttr(tupleDesc, attnum), tp + off);
 }
 
 /*
@@ -490,7 +490,7 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 
 	for (attnum = 0; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDescriptor, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDescriptor, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
@@ -587,10 +587,8 @@ index_truncate_tuple(TupleDesc sourceDescriptor, IndexTuple source,
 	if (leavenatts == sourceDescriptor->natts)
 		return CopyIndexTuple(source);
 
-	/* Create temporary descriptor to scribble on */
-	truncdesc = palloc(TupleDescSize(sourceDescriptor));
-	TupleDescCopy(truncdesc, sourceDescriptor);
-	truncdesc->natts = leavenatts;
+	/* Create temporary truncated tuple descriptor */
+	truncdesc = CreateTupleDescTruncatedCopy(sourceDescriptor, leavenatts);
 
 	/* Deform, form copy of tuple with fewer attributes */
 	index_deform_tuple(source, truncdesc, values, isnull);
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 47379fef22..a9fd227af1 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -56,6 +56,33 @@ ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
 	ResourceOwnerForget(owner, PointerGetDatum(tupdesc), &tupdesc_resowner_desc);
 }
 
+/*
+ * populate_compact_attribute
+ *		Fills in the corresponding CompactAttribute element from the
+ *		Form_pg_attribute for the given attribute number.  This must be called
+ *		whenever a change is made to a Form_pg_attribute in the TupleDesc.
+ */
+void
+populate_compact_attribute(TupleDesc tupdesc, int attnum)
+{
+	Form_pg_attribute src = TupleDescAttr(tupdesc, attnum);
+	CompactAttribute *dst = &tupdesc->compact_attrs[attnum];
+
+	memset(dst, 0, sizeof(CompactAttribute));
+
+	dst->attcacheoff = -1;
+	dst->attlen = src->attlen;
+
+	dst->attbyval = src->attbyval;
+	dst->attispackable = (src->attstorage != TYPSTORAGE_PLAIN);
+	dst->atthasmissing = src->atthasmissing;
+	dst->attisdropped = src->attisdropped;
+	dst->attgenerated = (src->attgenerated != '\0');
+	dst->attnotnull = src->attnotnull;
+
+	dst->attalign = src->attalign;
+}
+
 /*
  * CreateTemplateTupleDesc
  *		This function allocates an empty tuple descriptor structure.
@@ -74,18 +101,19 @@ CreateTemplateTupleDesc(int natts)
 	Assert(natts >= 0);
 
 	/*
-	 * Allocate enough memory for the tuple descriptor, including the
-	 * attribute rows.
+	 * Allocate enough memory for the tuple descriptor, the CompactAttribute
+	 * array and also an array of the full FormData_pg_attribute data.
 	 *
-	 * Note: the attribute array stride is sizeof(FormData_pg_attribute),
-	 * since we declare the array elements as FormData_pg_attribute for
-	 * notational convenience.  However, we only guarantee that the first
+	 * Note: the 'attrs' array stride is sizeof(FormData_pg_attribute), since
+	 * we declare the array elements as FormData_pg_attribute for notational
+	 * convenience.  However, we only guarantee that the first
 	 * ATTRIBUTE_FIXED_PART_SIZE bytes of each entry are valid; most code that
 	 * copies tupdesc entries around copies just that much.  In principle that
 	 * could be less due to trailing padding, although with the current
 	 * definition of pg_attribute there probably isn't any padding.
 	 */
-	desc = (TupleDesc) palloc(offsetof(struct TupleDescData, attrs) +
+	desc = (TupleDesc) palloc(offsetof(struct TupleDescData, compact_attrs) +
+							  natts * sizeof(CompactAttribute) +
 							  natts * sizeof(FormData_pg_attribute));
 
 	/*
@@ -117,8 +145,10 @@ CreateTupleDesc(int natts, Form_pg_attribute *attrs)
 	desc = CreateTemplateTupleDesc(natts);
 
 	for (i = 0; i < natts; ++i)
+	{
 		memcpy(TupleDescAttr(desc, i), attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
-
+		populate_compact_attribute(desc, i);
+	}
 	return desc;
 }
 
@@ -155,6 +185,54 @@ CreateTupleDescCopy(TupleDesc tupdesc)
 		att->atthasmissing = false;
 		att->attidentity = '\0';
 		att->attgenerated = '\0';
+
+		populate_compact_attribute(desc, i);
+	}
+
+	/* We can copy the tuple type identification, too */
+	desc->tdtypeid = tupdesc->tdtypeid;
+	desc->tdtypmod = tupdesc->tdtypmod;
+
+	return desc;
+}
+
+/*
+ * CreateTupleDescTruncatedCopy
+ *		This function creates a new TupleDesc with only the first 'natts'
+ *		attributes from an existing TupleDesc
+ *
+ * !!! Constraints and defaults are not copied !!!
+ */
+TupleDesc
+CreateTupleDescTruncatedCopy(TupleDesc tupdesc, int natts)
+{
+	TupleDesc	desc;
+	int			i;
+
+	Assert(natts <= tupdesc->natts);
+
+	desc = CreateTemplateTupleDesc(natts);
+
+	/* Flat-copy the attribute array */
+	memcpy(TupleDescAttr(desc, 0),
+		   TupleDescAttr(tupdesc, 0),
+		   desc->natts * sizeof(FormData_pg_attribute));
+
+	/*
+	 * Since we're not copying constraints and defaults, clear fields
+	 * associated with them.
+	 */
+	for (i = 0; i < desc->natts; i++)
+	{
+		Form_pg_attribute att = TupleDescAttr(desc, i);
+
+		att->attnotnull = false;
+		att->atthasdef = false;
+		att->atthasmissing = false;
+		att->attidentity = '\0';
+		att->attgenerated = '\0';
+
+		populate_compact_attribute(desc, i);
 	}
 
 	/* We can copy the tuple type identification, too */
@@ -183,6 +261,9 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
 		   TupleDescAttr(tupdesc, 0),
 		   desc->natts * sizeof(FormData_pg_attribute));
 
+	for (i = 0; i < desc->natts; i++)
+		populate_compact_attribute(desc, i);
+
 	/* Copy the TupleConstr data structure, if any */
 	if (constr)
 	{
@@ -207,7 +288,7 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
 			{
 				if (constr->missing[i].am_present)
 				{
-					Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+					CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
 
 					cpy->missing[i].am_value = datumCopy(constr->missing[i].am_value,
 														 attr->attbyval,
@@ -252,7 +333,7 @@ TupleDescCopy(TupleDesc dst, TupleDesc src)
 {
 	int			i;
 
-	/* Flat-copy the header and attribute array */
+	/* Flat-copy the header and attribute arrays */
 	memcpy(dst, src, TupleDescSize(src));
 
 	/*
@@ -268,6 +349,8 @@ TupleDescCopy(TupleDesc dst, TupleDesc src)
 		att->atthasmissing = false;
 		att->attidentity = '\0';
 		att->attgenerated = '\0';
+
+		populate_compact_attribute(dst, i);
 	}
 	dst->constr = NULL;
 
@@ -322,6 +405,8 @@ TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
 	dstAtt->atthasmissing = false;
 	dstAtt->attidentity = '\0';
 	dstAtt->attgenerated = '\0';
+
+	populate_compact_attribute(dst, dstAttno - 1);
 }
 
 /*
@@ -521,7 +606,7 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
 					return false;
 				if (missval1->am_present)
 				{
-					Form_pg_attribute missatt1 = TupleDescAttr(tupdesc1, i);
+					CompactAttribute *missatt1 = TupleDescCompactAttr(tupdesc1, i);
 
 					if (!datumIsEqual(missval1->am_value, missval2->am_value,
 									  missatt1->attbyval, missatt1->attlen))
@@ -714,6 +799,8 @@ TupleDescInitEntry(TupleDesc desc,
 	att->attcompression = InvalidCompressionMethod;
 	att->attcollation = typeForm->typcollation;
 
+	populate_compact_attribute(desc, attributeNumber - 1);
+
 	ReleaseSysCache(tuple);
 }
 
@@ -821,6 +908,8 @@ TupleDescInitBuiltinEntry(TupleDesc desc,
 		default:
 			elog(ERROR, "unsupported type %u", oidtypeid);
 	}
+
+	populate_compact_attribute(desc, attributeNumber - 1);
 }
 
 /*
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c
index ebc65449c1..272390ff67 100644
--- a/src/backend/access/gist/gist.c
+++ b/src/backend/access/gist/gist.c
@@ -1557,9 +1557,8 @@ initGISTstate(Relation index)
 	 * tuples during page split.  Also, B-tree is not adjusting tuples on
 	 * internal pages the way GiST does.
 	 */
-	giststate->nonLeafTupdesc = CreateTupleDescCopyConstr(index->rd_att);
-	giststate->nonLeafTupdesc->natts =
-		IndexRelationGetNumberOfKeyAttributes(index);
+	giststate->nonLeafTupdesc = CreateTupleDescTruncatedCopy(index->rd_att,
+															 IndexRelationGetNumberOfKeyAttributes(index));
 
 	for (i = 0; i < IndexRelationGetNumberOfKeyAttributes(index); i++)
 	{
diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c
index e93d9869b2..da85818217 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -331,7 +331,9 @@ getSpGistTupleDesc(Relation index, SpGistTypeDesc *keyType)
 		att->attcollation = InvalidOid;
 		/* In case we changed typlen, we'd better reset following offsets */
 		for (int i = spgFirstIncludeColumn; i < outTupDesc->natts; i++)
-			TupleDescAttr(outTupDesc, i)->attcacheoff = -1;
+			TupleDescCompactAttr(outTupDesc, i)->attcacheoff = -1;
+
+		populate_compact_attribute(outTupDesc, spgKeyColumn);
 	}
 	return outTupDesc;
 }
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 1c3a9e06d3..2a03a506c0 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -477,6 +477,8 @@ ConstructTupleDescriptor(Relation heapRelation,
 
 			ReleaseSysCache(tuple);
 		}
+
+		populate_compact_attribute(indexTupDesc, i);
 	}
 
 	pfree(amroutine);
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 6ccae4cb4a..4937478262 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -980,6 +980,8 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
 			cookedDefaults = lappend(cookedDefaults, cooked);
 			attr->atthasdef = true;
 		}
+
+		populate_compact_attribute(descriptor, attnum - 1);
 	}
 
 	/*
@@ -1396,6 +1398,8 @@ BuildDescForRelation(const List *columns)
 			att->attstorage = entry->storage;
 		else if (entry->storage_name)
 			att->attstorage = GetAttributeStorage(att->atttypid, entry->storage_name);
+
+		populate_compact_attribute(desc, attnum - 1);
 	}
 
 	return desc;
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 00dc339615..a09aa251e6 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -1044,7 +1044,7 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 
 	for (; attnum < natts; attnum++)
 	{
-		Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
+		CompactAttribute *thisatt = TupleDescCompactAttr(tupleDesc, attnum);
 
 		if (hasnulls && att_isnull(attnum, bp))
 		{
@@ -2237,7 +2237,7 @@ BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
 	 */
 	for (i = 0; i < natts; i++)
 	{
-		if (!TupleDescAttr(tupdesc, i)->attisdropped)
+		if (!TupleDescCompactAttr(tupdesc, i)->attisdropped)
 		{
 			/* Non-dropped attributes */
 			dvalues[i] = InputFunctionCall(&attinmeta->attinfuncs[i],
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 422509f18d..f6686a69e8 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -585,6 +585,8 @@ RelationBuildTupleDesc(Relation relation)
 			   attp,
 			   ATTRIBUTE_FIXED_PART_SIZE);
 
+		populate_compact_attribute(relation->rd_att, attnum - 1);
+
 		/* Update constraint/default info */
 		if (attp->attnotnull)
 			constr->has_not_null = true;
@@ -674,12 +676,12 @@ RelationBuildTupleDesc(Relation relation)
 #endif
 
 	/*
-	 * However, we can easily set the attcacheoff value for the first
-	 * attribute: it must be zero.  This eliminates the need for special cases
-	 * for attnum=1 that used to exist in fastgetattr() and index_getattr().
+	 * We can easily set the attcacheoff value for the first attribute: it
+	 * must be zero.  This eliminates the need for special cases for attnum=1
+	 * that used to exist in fastgetattr() and index_getattr().
 	 */
 	if (RelationGetNumberOfAttributes(relation) > 0)
-		TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
+		TupleDescCompactAttr(relation->rd_att, 0)->attcacheoff = 0;
 
 	/*
 	 * Set up constraint/default info
@@ -1965,10 +1967,12 @@ formrdesc(const char *relationName, Oid relationReltype,
 		has_not_null |= attrs[i].attnotnull;
 		/* make sure attcacheoff is valid */
 		TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
+
+		populate_compact_attribute(relation->rd_att, i);
 	}
 
 	/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
-	TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
+	TupleDescCompactAttr(relation->rd_att, 0)->attcacheoff = 0;
 
 	/* mark not-null status */
 	if (has_not_null)
@@ -3579,6 +3583,7 @@ RelationBuildLocalRelation(const char *relname,
 		datt->attgenerated = satt->attgenerated;
 		datt->attnotnull = satt->attnotnull;
 		has_not_null |= satt->attnotnull;
+		populate_compact_attribute(rel->rd_att, i);
 	}
 
 	if (has_not_null)
@@ -4399,10 +4404,12 @@ BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs)
 		memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
 		/* make sure attcacheoff is valid */
 		TupleDescAttr(result, i)->attcacheoff = -1;
+
+		populate_compact_attribute(result, i);
 	}
 
 	/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
-	TupleDescAttr(result, 0)->attcacheoff = 0;
+	TupleDescCompactAttr(result, 0)->attcacheoff = 0;
 
 	/* Note: we don't bother to set up a TupleConstr entry */
 
@@ -6199,6 +6206,8 @@ load_relcache_init_file(bool shared)
 				goto read_failed;
 
 			has_not_null |= attr->attnotnull;
+
+			populate_compact_attribute(rel->rd_att, i);
 		}
 
 		/* next read the access method specific field */
diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h
index 5e38ef8696..0d1adff540 100644
--- a/src/include/access/htup_details.h
+++ b/src/include/access/htup_details.h
@@ -758,9 +758,9 @@ fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 	*isnull = false;
 	if (HeapTupleNoNulls(tup))
 	{
-		Form_pg_attribute att;
+		CompactAttribute *att;
 
-		att = TupleDescAttr(tupleDesc, attnum - 1);
+		att = TupleDescCompactAttr(tupleDesc, attnum - 1);
 		if (att->attcacheoff >= 0)
 			return fetchatt(att, (char *) tup->t_data + tup->t_data->t_hoff +
 							att->attcacheoff);
diff --git a/src/include/access/itup.h b/src/include/access/itup.h
index 94885751e5..4393b19a7f 100644
--- a/src/include/access/itup.h
+++ b/src/include/access/itup.h
@@ -124,11 +124,13 @@ index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 
 	if (!IndexTupleHasNulls(tup))
 	{
-		if (TupleDescAttr(tupleDesc, attnum - 1)->attcacheoff >= 0)
+		CompactAttribute *attr = TupleDescCompactAttr(tupleDesc, attnum - 1);
+
+		if (attr->attcacheoff >= 0)
 		{
-			return fetchatt(TupleDescAttr(tupleDesc, attnum - 1),
-							(char *) tup + IndexInfoFindDataOffset(tup->t_info)
-							+ TupleDescAttr(tupleDesc, attnum - 1)->attcacheoff);
+			return fetchatt(attr,
+							(char *) tup + IndexInfoFindDataOffset(tup->t_info) +
+							attr->attcacheoff);
 		}
 		else
 			return nocache_index_getattr(tup, attnum, tupleDesc);
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 8930a28d66..21d5ba94ad 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -45,6 +45,39 @@ typedef struct TupleConstr
 	bool		has_generated_stored;
 } TupleConstr;
 
+/*
+ * CompactAttribute
+ *		Cut-down version of FormData_pg_attribute for faster access for tasks
+ *		such as tuple deformation.  These values are populated using the
+ *		populate_compact_attribute function, which must be called directly
+ *		after the FormData_pg_attribute struct is populated or altered in any
+ *		way.
+ *
+ * Currently, this struct is 16 bytes.  Any code changes which enlarge this
+ * struct should be considered very carefully.
+ *
+ * Code which must access a TupleDesc's attribute data should always make use
+ * of the CompactAttribute when the required fields are available there.  It's
+ * more efficient to access the memory in CompactAttribute due to it being a
+ * more compact representation of FormData_pg_attribute and also because
+ * accessing the FormData_pg_attribute requires an additional calculations to
+ * obtain the base address of the array within the TupleDesc.
+ */
+typedef struct CompactAttribute
+{
+	int32		attcacheoff;	/* fixed offset into tuple, if known, or -1 */
+	int16		attlen;			/* attr len in bytes or -1 = varlen, -2 =
+								 * cstring */
+	bool		attbyval;		/* as FormData_pg_attribute.attbyval */
+	bool		attispackable;	/* FormData_pg_attribute.attstorage !=
+								 * TYPSTORAGE_PLAIN */
+	bool		atthasmissing;	/* as FormData_pg_attribute.atthasmissing */
+	bool		attisdropped;	/* as FormData_pg_attribute.attisdropped */
+	bool		attgenerated;	/* FormData_pg_attribute.attgenerated != '\0' */
+	bool		attnotnull;		/* as FormData_pg_attribute.attnotnull */
+	char		attalign;		/* alignment requirement */
+} CompactAttribute;
+
 /*
  * This struct is passed around within the backend to describe the structure
  * of tuples.  For tuples coming from on-disk relations, the information is
@@ -75,6 +108,21 @@ typedef struct TupleConstr
  * context and go away when the context is freed.  We set the tdrefcount
  * field of such a descriptor to -1, while reference-counted descriptors
  * always have tdrefcount >= 0.
+ *
+ * Beyond the compact_attrs variable length array, the TupleDesc stores an
+ * array of FormData_pg_attribute.  The TupleDescAttr() function, as defined
+ * below, takes care of calculating the address of the elements of the
+ * FormData_pg_attribute array.
+ *
+ * The array of CompactAttribute is effectively an abbreviated version of the
+ * array of FormData_pg_attribute.  Because CompactAttribute is significantly
+ * smaller than FormData_pg_attribute, code, especially performance-critical
+ * code, should prioritize using the fields from the CompactAttribute over the
+ * equivalent fields in FormData_pg_attribute whenever possible.
+ *
+ * Any code making changes manually to and fields in the FormData_pg_attribute
+ * array must subsequently call populate_compact_attribute() to flush the
+ * changes out to the corresponding 'compact_attrs' element.
  */
 typedef struct TupleDescData
 {
@@ -83,13 +131,72 @@ typedef struct TupleDescData
 	int32		tdtypmod;		/* typmod for tuple type */
 	int			tdrefcount;		/* reference count, or -1 if not counting */
 	TupleConstr *constr;		/* constraints, or NULL if none */
-	/* attrs[N] is the description of Attribute Number N+1 */
-	FormData_pg_attribute attrs[FLEXIBLE_ARRAY_MEMBER];
+	/* compact_attrs[N] is the compact metadata of Attribute Number N+1 */
+	CompactAttribute compact_attrs[FLEXIBLE_ARRAY_MEMBER];
 }			TupleDescData;
 typedef struct TupleDescData *TupleDesc;
 
-/* Accessor for the i'th attribute of tupdesc. */
-#define TupleDescAttr(tupdesc, i) (&(tupdesc)->attrs[(i)])
+extern void populate_compact_attribute(TupleDesc tupdesc, int attnum);
+
+#define TupleDescAttrAddress(desc) \
+	(Form_pg_attribute) ((char *) (desc) + \
+	 (offsetof(struct TupleDescData, compact_attrs) + \
+	 (desc)->natts * sizeof(CompactAttribute)))
+
+/* Accessor for the i'th FormData_pg_attribute of tupdesc. */
+static inline FormData_pg_attribute *
+TupleDescAttr(TupleDesc tupdesc, int i)
+{
+	/*
+	 * Manually calculate the base address of the FormData_pg_attribute array
+	 * then return a pointer to the i'th element.  We have lots of code which
+	 * loops over each FormData_pg_attribute and most compilers seem to be
+	 * able to optimize the code to have it so the base address is calculated
+	 * only once.
+	 */
+	FormData_pg_attribute *attrs = TupleDescAttrAddress(tupdesc);
+
+	return &attrs[i];
+}
+
+#undef TupleDescAttrAddress
+
+/*
+ * Accessor for the i'th CompactAttribute of tupdesc.
+ */
+static inline CompactAttribute *
+TupleDescCompactAttr(TupleDesc tupdesc, int i)
+{
+	CompactAttribute *cattr = &tupdesc->compact_attrs[i];
+#ifdef USE_ASSERT_CHECKING
+	CompactAttribute snapshot;
+
+	/*
+	 * In Assert enabled builds we verify that the CompactAttribute is
+	 * populated correctly.  This helps find bugs in places such as ALTER
+	 * TABLE where code makes changes to the FormData_pg_attribute but forgets
+	 * to call populate_compact_attribute.
+	 */
+
+	/*
+	 * Take a snapshot of how the CompactAttribute is now before calling
+	 * populate_compact_attribute to make it up-to-date with the
+	 * FormData_pg_attribute.
+	 */
+	memcpy(&snapshot, cattr, sizeof(CompactAttribute));
+
+	populate_compact_attribute(tupdesc, i);
+
+	/* reset attcacheoff back to what it was */
+	cattr->attcacheoff = snapshot.attcacheoff;
+
+	/* Ensure the snapshot matches the freshly populated CompactAttribute */
+	Assert(memcmp(&snapshot, cattr, sizeof(CompactAttribute)) == 0);
+#endif
+
+	return cattr;
+}
+
 
 extern TupleDesc CreateTemplateTupleDesc(int natts);
 
@@ -97,10 +204,13 @@ extern TupleDesc CreateTupleDesc(int natts, Form_pg_attribute *attrs);
 
 extern TupleDesc CreateTupleDescCopy(TupleDesc tupdesc);
 
+extern TupleDesc CreateTupleDescTruncatedCopy(TupleDesc tupdesc, int natts);
+
 extern TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc);
 
 #define TupleDescSize(src) \
-	(offsetof(struct TupleDescData, attrs) + \
+	(offsetof(struct TupleDescData, compact_attrs) + \
+	 (src)->natts * sizeof(CompactAttribute) + \
 	 (src)->natts * sizeof(FormData_pg_attribute))
 
 extern void TupleDescCopy(TupleDesc dst, TupleDesc src);
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index 58b3a58cfd..51616e5724 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -30,8 +30,8 @@ att_isnull(int ATT, const bits8 *BITS)
 
 #ifndef FRONTEND
 /*
- * Given a Form_pg_attribute and a pointer into a tuple's data area,
- * return the correct value or pointer.
+ * Given a Form_pg_attribute or CompactAttribute and a pointer into a tuple's
+ * data area, return the correct value or pointer.
  *
  * We return a Datum value in all cases.  If the attribute has "byval" false,
  * we return the same pointer into the tuple data area that we're passed.
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index 2d4c870423..dd5c8867d2 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -454,6 +454,7 @@ CommitTimestampEntry
 CommitTimestampShared
 CommonEntry
 CommonTableExpr
+CompactAttribute
 CompareScalarsContext
 CompiledExprState
 CompositeIOData
-- 
2.34.1

v7-0002-Only-for-testing.patchapplication/octet-stream; name=v7-0002-Only-for-testing.patchDownload
From 59f5a362773735e167694cb36c3ebd91108c683d Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Thu, 5 Dec 2024 00:24:56 +1300
Subject: [PATCH v7 2/2] Only for testing

Default debug_parallel_query to regress
---
 src/backend/optimizer/plan/planner.c | 2 +-
 src/backend/utils/misc/guc_tables.c  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index b665a7762e..c0504061d2 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -65,7 +65,7 @@
 
 /* GUC parameters */
 double		cursor_tuple_fraction = DEFAULT_CURSOR_TUPLE_FRACTION;
-int			debug_parallel_query = DEBUG_PARALLEL_OFF;
+int			debug_parallel_query = DEBUG_PARALLEL_REGRESS;
 bool		parallel_leader_participation = true;
 bool		enable_distinct_reordering = true;
 
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index 8cf1afbad2..05c4b6cf01 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -5153,7 +5153,7 @@ struct config_enum ConfigureNamesEnum[] =
 			GUC_NOT_IN_SAMPLE | GUC_EXPLAIN
 		},
 		&debug_parallel_query,
-		DEBUG_PARALLEL_OFF, debug_parallel_query_options,
+		DEBUG_PARALLEL_REGRESS, debug_parallel_query_options,
 		NULL, NULL, NULL
 	},
 
-- 
2.34.1

#20Andres Freund
andres@anarazel.de
In reply to: David Rowley (#19)
Re: Make tuple deformation faster

Hi,

On 2024-12-05 01:42:36 +1300, David Rowley wrote:

On Tue, 3 Dec 2024 at 16:54, David Rowley <dgrowleyml@gmail.com> wrote:

After making some last-minute cosmetic adjustments, I've just pushed
the 0001 patch.

So that commit broke all of the debug_parallel_query = regress
buildfarm animals.

Seems we need a query in the regression tests that trigger the issue even
without debug_parallel_query = regress.

In the attached v7-0001 patch, I've now got rid of the
TupleDescData->attrs field. Figuring out the base address of the
FormData_pg_attribute array is now done by the TupleDescAttr() inline
function (this used to be a macro).

Possibly stupid idea: Could we instead store the attributes *before* the main
TupleDescData, with increasing "distance" for increased attnos? That way we
wouldn't need to calculate any variable offsets. Of course the price would be
to have some slightly more complicated invocation of pfree(), but that's
comparatively rare.

Because that function is called often in a tight loop, I wanted to ensure
compilers wouldn't calculate the base address of the array on each iteration
of the loop. Looking at [1], it seems gcc and clang are smart about this
and calculate the base address before the loop and add
sizeof(FormData_pg_attribute) to the register that's being used for the
element pointer.

Changing this then caused some other issues... The GIST code was doing
the following to get a TupleDesc without the INCLUDE columns of the
index:

giststate->nonLeafTupdesc = CreateTupleDescCopyConstr(index->rd_att);
giststate->nonLeafTupdesc->natts =
IndexRelationGetNumberOfKeyAttributes(index);

That is somewhat ugly...

Since I'm calculating the base address of the FormData_pg_attribute
array in TupleDesc by looking at natts, when this code changes natts
on the fly, that means calls to TupleDescAttr end up looking in the
wrong place for the required FormData_pg_attribute element.

It's possible out-of-core code is doing that too, could we detect this in
assert enabled builds?

To fix this I invented CreateTupleDescTruncatedCopy() and used it in all the
places that were fiddling with the natts field.

Makes sense.

v7-0002 is not for commit. That's me cheekily exploiting the CFBot's CI
testing machines to run in debug_parallel_query = regress mode.

I think it might actually make sense to enable debug_parallel_query = regress
in one of the CI tasks... Perhaps FreeBSD? That's reasonably fast right now
(and a *LOT* cheaper to run than macos).

Greetings,

Andres Freund

#21David Rowley
dgrowleyml@gmail.com
In reply to: Andres Freund (#20)
Re: Make tuple deformation faster

On Thu, 5 Dec 2024 at 03:51, Andres Freund <andres@anarazel.de> wrote:

Possibly stupid idea: Could we instead store the attributes *before* the main
TupleDescData, with increasing "distance" for increased attnos? That way we
wouldn't need to calculate any variable offsets. Of course the price would be
to have some slightly more complicated invocation of pfree(), but that's
comparatively rare.

Are you thinking this to make the address calculation cheaper? or so
that the hacky code that truncates the TupleDesc would work without
crashing still?

If it's for the latter then the pfree() would be tricky to make work
still as natts would need to be consulted to find the address to
pfree.

On 2024-12-05 01:42:36 +1300, David Rowley wrote:

Since I'm calculating the base address of the FormData_pg_attribute
array in TupleDesc by looking at natts, when this code changes natts
on the fly, that means calls to TupleDescAttr end up looking in the
wrong place for the required FormData_pg_attribute element.

It's possible out-of-core code is doing that too, could we detect this in
assert enabled builds?

The assert in TupleDescCompactAttr() which verifies the
CompactAttribute matches the FormData_pg_attribute did highlight these
issues. It's just it wasn't that obvious what the cause of the issue
was from that failing assert. I expect there would be some breaking of
extensions by removing the attrs array anyway. 65b71dec2d fixed up
some cases where TupleDescAttr() wasn't being used, so anything out
there that's doing something similar to what that commit fixed would
fail to compile.

One way to ensure we purposefully break any code manually adjusting
natts would be to rename that field. That would mean having to adjust
all the loops over each attribute in core. There are quite a few:

$ git grep -E "^\s+for.*->natts;" | wc -l
147

David

#22Matthias van de Meent
boekewurm+postgres@gmail.com
In reply to: David Rowley (#21)
Re: Make tuple deformation faster

On Wed, 4 Dec 2024 at 23:52, David Rowley <dgrowleyml@gmail.com> wrote:

On Thu, 5 Dec 2024 at 03:51, Andres Freund <andres@anarazel.de> wrote:

Possibly stupid idea: Could we instead store the attributes *before* the main
TupleDescData, with increasing "distance" for increased attnos? That way we
wouldn't need to calculate any variable offsets. Of course the price would be
to have some slightly more complicated invocation of pfree(), but that's
comparatively rare.

Are you thinking this to make the address calculation cheaper? or so
that the hacky code that truncates the TupleDesc would work without
crashing still?

If it's for the latter then the pfree() would be tricky to make work
still as natts would need to be consulted to find the address to
pfree.

It's certainly tricky (I'd say quite a hack, even), but you could put
a MCTX_ALIGNED_REDIRECT_ID -type memory chunk ahead of the main
TupleDescData, and put any other data you want ahead of that redirect
chunk (so you'd have the normal palloc() MemoryChunk header (at
allocptr - sizeof(MemoryChunk), followed by variable data, followed by
the redirect MemoryChunk, followed by the to-be-returned TupleDesc's
data). This ALIGNED_REDIRECT MemoryChunk will safely forward calls to
pfree on the TupleDesc pointer to the base pointer of the palloc()-ed
area, which then is forwarded to the actual memory context.

That said, I don't think it'd be safe to use with repalloc, as that
would likely truncate the artificial hole in the memory chunk,
probably requiring restoration work by the callee on the prefixed
arrays. That may be a limitation we can live with, but I haven't
checked to see if there are any usages of repalloc() on TupleDesc.

Kind regards,

Matthias van de Meent
Neon (https://neon.tech)

#23Andres Freund
andres@anarazel.de
In reply to: David Rowley (#21)
Re: Make tuple deformation faster

Hi,

On 2024-12-05 11:52:01 +1300, David Rowley wrote:

On Thu, 5 Dec 2024 at 03:51, Andres Freund <andres@anarazel.de> wrote:

Possibly stupid idea: Could we instead store the attributes *before* the main
TupleDescData, with increasing "distance" for increased attnos? That way we
wouldn't need to calculate any variable offsets. Of course the price would be
to have some slightly more complicated invocation of pfree(), but that's
comparatively rare.

Are you thinking this to make the address calculation cheaper? or so
that the hacky code that truncates the TupleDesc would work without
crashing still?

Primarily to make the address calculation cheaper.

If it's for the latter then the pfree() would be tricky to make work
still as natts would need to be consulted to find the address to
pfree.

But is that really a problem? Freeing a tupledesc needs to go through
FreeTupleDesc() (unless a shared one, but that's just one additional place),
and the TupleDesc could just store a pointer/offset to its start.

On 2024-12-05 01:42:36 +1300, David Rowley wrote:

Since I'm calculating the base address of the FormData_pg_attribute
array in TupleDesc by looking at natts, when this code changes natts
on the fly, that means calls to TupleDescAttr end up looking in the
wrong place for the required FormData_pg_attribute element.

It's possible out-of-core code is doing that too, could we detect this in
assert enabled builds?

The assert in TupleDescCompactAttr() which verifies the
CompactAttribute matches the FormData_pg_attribute did highlight these
issues.

Cool.

One way to ensure we purposefully break any code manually adjusting
natts would be to rename that field. That would mean having to adjust
all the loops over each attribute in core. There are quite a few:

$ git grep -E "^\s+for.*->natts;" | wc -l
147

That doesn't seem worth it...

Greetings,

Andres Freund

#24David Rowley
dgrowleyml@gmail.com
In reply to: Andres Freund (#23)
Re: Make tuple deformation faster

On Thu, 5 Dec 2024 at 13:09, Andres Freund <andres@anarazel.de> wrote:

On 2024-12-05 11:52:01 +1300, David Rowley wrote:

On Thu, 5 Dec 2024 at 03:51, Andres Freund <andres@anarazel.de> wrote:

Possibly stupid idea: Could we instead store the attributes *before* the main
TupleDescData, with increasing "distance" for increased attnos? That way we
wouldn't need to calculate any variable offsets. Of course the price would be
to have some slightly more complicated invocation of pfree(), but that's
comparatively rare.

Are you thinking this to make the address calculation cheaper? or so
that the hacky code that truncates the TupleDesc would work without
crashing still?

Primarily to make the address calculation cheaper.

I mostly got that working, but there were quite several adjustments
needed to fix various things. For example, there are a few places that
are pfreeing a TupleDesc without going through FreeTupleDesc(); namely
index_truncate_tuple() and InsertOneTuple(). There was also a bit more
complexity around the TupleDescs stored in DSA memory as the base
address of those is the start of the FormData_pg_attribute array, so
some offsetting is needed to get the TupleDesc address. None of those
changes are complex themselves, but it was quite painful to find all
those places and I started to worry that there might end up being a
bit more fallout from that method and I basically chickened out. I
agree the address calculation is cheaper, but accessing
FormData_pg_attribute isn't as performance-critical anymore as
CompactAttribute is doing the performance-critical work now.

I've now pushed the 0001 patch and the 0002 patch as one commit. I'm
going to give the buildfarm a bit of time then push the commit to
remove pg_attribute.attcacheoff. I'm planning on letting that settle
overnight then if all is well push the attalignby changes.

David

#25David Rowley
dgrowleyml@gmail.com
In reply to: David Rowley (#24)
2 attachment(s)
Re: Make tuple deformation faster

On Fri, 20 Dec 2024 at 23:04, David Rowley <dgrowleyml@gmail.com> wrote:

I've now pushed the 0001 patch and the 0002 patch as one commit. I'm
going to give the buildfarm a bit of time then push the commit to
remove pg_attribute.attcacheoff. I'm planning on letting that settle
overnight then if all is well push the attalignby changes.

The attcacheoff removal is now pushed. I've attached the two remaining patches.

David

Attachments:

v8-0001-Optimize-alignment-calculations-in-tuple-form-def.patchapplication/octet-stream; name=v8-0001-Optimize-alignment-calculations-in-tuple-form-def.patchDownload
From d71981479f464a8c5e8dc75ce358bde2e4544484 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Wed, 29 May 2024 12:19:03 +1200
Subject: [PATCH v8 1/2] Optimize alignment calculations in tuple form/deform

Here we convert CompactAttribute.attalign from a char, which is directly
derived from pg_attribute.attalign into a uint8, which stores the number
of bytes to align the column's value by in the tuple.

This allows tuple deformation and tuple size calculations to move away
from using the inefficient att_align_nominal() macro, which manually
checks each TYPALIGN_* char to translate that into the alignment bytes
for the given type.  Effectively, this commit changes those to TYPEALIGN
calls, which only perform some simple arithmetic with some bit twiddling.

The removed branches were often mispredicted by CPUs, especially so in
real-world tables which often contain a mash of different types with
different alignment requirements.

Author: David Rowley
Reviewed-by: Andres Freund, Victor Yegorov
Discussion: https://postgr.es/m/CAApHDvrBztXP3yx=NKNmo3xwFAFhEdyPnvrDg3=M0RhDs+4vYw@mail.gmail.com
---
 contrib/amcheck/verify_heapam.c        |  6 +--
 contrib/pageinspect/heapfuncs.c        |  6 +--
 src/backend/access/brin/brin_tuple.c   | 10 +++--
 src/backend/access/common/attmap.c     |  2 +-
 src/backend/access/common/heaptuple.c  | 52 +++++++++++++-------------
 src/backend/access/common/indextuple.c | 22 +++++------
 src/backend/access/common/tupdesc.c    | 20 +++++++++-
 src/backend/executor/execExprInterp.c  |  2 +-
 src/backend/executor/execTuples.c      | 20 +++++-----
 src/backend/jit/llvm/llvmjit_deform.c  | 17 +--------
 src/include/access/tupdesc.h           |  2 +-
 src/include/access/tupmacs.h           | 23 ++++++++++++
 12 files changed, 104 insertions(+), 78 deletions(-)

diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index c1847d1b8a..d393e6ca33 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1596,7 +1596,7 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	/* Skip non-varlena values, but update offset first */
 	if (thisatt->attlen != -1)
 	{
-		ctx->offset = att_align_nominal(ctx->offset, thisatt->attalign);
+		ctx->offset = att_nominal_alignby(ctx->offset, thisatt->attalignby);
 		ctx->offset = att_addlength_pointer(ctx->offset, thisatt->attlen,
 											tp + ctx->offset);
 		if (ctx->tuphdr->t_hoff + ctx->offset > ctx->lp_len)
@@ -1612,8 +1612,8 @@ check_tuple_attribute(HeapCheckContext *ctx)
 	}
 
 	/* Ok, we're looking at a varlena attribute. */
-	ctx->offset = att_align_pointer(ctx->offset, thisatt->attalign, -1,
-									tp + ctx->offset);
+	ctx->offset = att_pointer_alignby(ctx->offset, thisatt->attalignby, -1,
+									  tp + ctx->offset);
 
 	/* Get the (possibly corrupt) varlena datum */
 	attdatum = fetchatt(thisatt, tp + ctx->offset);
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 8c1b7d38aa..41ff597199 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -357,8 +357,8 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 
 			if (attr->attlen == -1)
 			{
-				off = att_align_pointer(off, attr->attalign, -1,
-										tupdata + off);
+				off = att_pointer_alignby(off, attr->attalignby, -1,
+										  tupdata + off);
 
 				/*
 				 * As VARSIZE_ANY throws an exception if it can't properly
@@ -376,7 +376,7 @@ tuple_data_split_internal(Oid relid, char *tupdata,
 			}
 			else
 			{
-				off = att_align_nominal(off, attr->attalign);
+				off = att_nominal_alignby(off, attr->attalignby);
 				len = attr->attlen;
 			}
 
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index aae646be5d..458784a35f 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -703,13 +703,15 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
 
 			if (thisatt->attlen == -1)
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off,
+										  thisatt->attalignby,
+										  -1,
+										  tp + off);
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, thisatt->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, thisatt->attalignby);
 			}
 
 			values[stored++] = fetchatt(thisatt, tp + off);
diff --git a/src/backend/access/common/attmap.c b/src/backend/access/common/attmap.c
index 0805c4121e..29ce51ec3b 100644
--- a/src/backend/access/common/attmap.c
+++ b/src/backend/access/common/attmap.c
@@ -321,7 +321,7 @@ check_attrmap_match(TupleDesc indesc,
 		if (attrMap->attnums[i] == 0 &&
 			inatt->attisdropped &&
 			inatt->attlen == outatt->attlen &&
-			inatt->attalign == outatt->attalign)
+			inatt->attalignby == outatt->attalignby)
 			continue;
 
 		return false;
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 982e7222c4..c297a3bb9e 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -251,13 +251,13 @@ heap_compute_data_size(TupleDesc tupleDesc,
 			 * we want to flatten the expanded value so that the constructed
 			 * tuple doesn't depend on it
 			 */
-			data_length = att_align_nominal(data_length, atti->attalign);
+			data_length = att_nominal_alignby(data_length, atti->attalignby);
 			data_length += EOH_get_flat_size(DatumGetEOHP(val));
 		}
 		else
 		{
-			data_length = att_align_datum(data_length, atti->attalign,
-										  atti->attlen, val);
+			data_length = att_datum_alignby(data_length, atti->attalignby,
+											atti->attlen, val);
 			data_length = att_addlength_datum(data_length, atti->attlen,
 											  val);
 		}
@@ -308,13 +308,13 @@ fill_val(CompactAttribute *att,
 	}
 
 	/*
-	 * XXX we use the att_align macros on the pointer value itself, not on an
-	 * offset.  This is a bit of a hack.
+	 * XXX we use the att_nominal_alignby macro on the pointer value itself,
+	 * not on an offset.  This is a bit of a hack.
 	 */
 	if (att->attbyval)
 	{
 		/* pass-by-value */
-		data = (char *) att_align_nominal(data, att->attalign);
+		data = (char *) att_nominal_alignby(data, att->attalignby);
 		store_att_byval(data, datum, att->attlen);
 		data_length = att->attlen;
 	}
@@ -334,8 +334,7 @@ fill_val(CompactAttribute *att,
 				 */
 				ExpandedObjectHeader *eoh = DatumGetEOHP(datum);
 
-				data = (char *) att_align_nominal(data,
-												  att->attalign);
+				data = (char *) att_nominal_alignby(data, att->attalignby);
 				data_length = EOH_get_flat_size(eoh);
 				EOH_flatten_into(eoh, data, data_length);
 			}
@@ -363,8 +362,7 @@ fill_val(CompactAttribute *att,
 		else
 		{
 			/* full 4-byte header varlena */
-			data = (char *) att_align_nominal(data,
-											  att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = VARSIZE(val);
 			memcpy(data, val, data_length);
 		}
@@ -373,14 +371,14 @@ fill_val(CompactAttribute *att,
 	{
 		/* cstring ... never needs alignment */
 		*infomask |= HEAP_HASVARWIDTH;
-		Assert(att->attalign == TYPALIGN_CHAR);
+		Assert(att->attalignby == sizeof(char));
 		data_length = strlen(DatumGetCString(datum)) + 1;
 		memcpy(data, DatumGetPointer(datum), data_length);
 	}
 	else
 	{
 		/* fixed-length pass-by-reference */
-		data = (char *) att_align_nominal(data, att->attalign);
+		data = (char *) att_nominal_alignby(data, att->attalignby);
 		Assert(att->attlen > 0);
 		data_length = att->attlen;
 		memcpy(data, DatumGetPointer(datum), data_length);
@@ -634,7 +632,7 @@ nocachegetattr(HeapTuple tup,
 			if (att->attlen <= 0)
 				break;
 
-			off = att_align_nominal(off, att->attalign);
+			off = att_nominal_alignby(off, att->attalignby);
 
 			att->attcacheoff = off;
 
@@ -683,19 +681,19 @@ nocachegetattr(HeapTuple tup,
 				 * either an aligned or unaligned value.
 				 */
 				if (usecache &&
-					off == att_align_nominal(off, att->attalign))
+					off == att_nominal_alignby(off, att->attalignby))
 					att->attcacheoff = off;
 				else
 				{
-					off = att_align_pointer(off, att->attalign, -1,
-											tp + off);
+					off = att_pointer_alignby(off, att->attalignby, -1,
+											  tp + off);
 					usecache = false;
 				}
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, att->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, att->attalignby);
 
 				if (usecache)
 					att->attcacheoff = off;
@@ -898,10 +896,10 @@ expand_tuple(HeapTuple *targetHeapTuple,
 			{
 				CompactAttribute *att = TupleDescCompactAttr(tupleDesc, attnum);
 
-				targetDataLen = att_align_datum(targetDataLen,
-												att->attalign,
-												att->attlen,
-												attrmiss[attnum].am_value);
+				targetDataLen = att_datum_alignby(targetDataLen,
+												  att->attalignby,
+												  att->attlen,
+												  attrmiss[attnum].am_value);
 
 				targetDataLen = att_addlength_pointer(targetDataLen,
 													  att->attlen,
@@ -1396,19 +1394,19 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index 38aeb23087..a846b3d4a9 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -363,7 +363,7 @@ nocache_index_getattr(IndexTuple tup,
 			if (att->attlen <= 0)
 				break;
 
-			off = att_align_nominal(off, att->attalign);
+			off = att_nominal_alignby(off, att->attalignby);
 
 			att->attcacheoff = off;
 
@@ -412,19 +412,19 @@ nocache_index_getattr(IndexTuple tup,
 				 * either an aligned or unaligned value.
 				 */
 				if (usecache &&
-					off == att_align_nominal(off, att->attalign))
+					off == att_nominal_alignby(off, att->attalignby))
 					att->attcacheoff = off;
 				else
 				{
-					off = att_align_pointer(off, att->attalign, -1,
-											tp + off);
+					off = att_pointer_alignby(off, att->attalignby, -1,
+											  tp + off);
 					usecache = false;
 				}
 			}
 			else
 			{
-				/* not varlena, so safe to use att_align_nominal */
-				off = att_align_nominal(off, att->attalign);
+				/* not varlena, so safe to use att_nominal_alignby */
+				off = att_nominal_alignby(off, att->attalignby);
 
 				if (usecache)
 					att->attcacheoff = off;
@@ -513,19 +513,19 @@ index_deform_tuple_internal(TupleDesc tupleDescriptor,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 1a8d6481a2..9fec6e3386 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -80,7 +80,25 @@ populate_compact_attribute(TupleDesc tupdesc, int attnum)
 	dst->attgenerated = (src->attgenerated != '\0');
 	dst->attnotnull = src->attnotnull;
 
-	dst->attalign = src->attalign;
+	switch (src->attalign)
+	{
+		case TYPALIGN_INT:
+			dst->attalignby = ALIGNOF_INT;
+			break;
+		case TYPALIGN_CHAR:
+			dst->attalignby = sizeof(char);
+			break;
+		case TYPALIGN_DOUBLE:
+			dst->attalignby = ALIGNOF_DOUBLE;
+			break;
+		case TYPALIGN_SHORT:
+			dst->attalignby = ALIGNOF_SHORT;
+			break;
+		default:
+			dst->attalignby = 0;
+			elog(ERROR, "invalid attalign value: %c", src->attalign);
+			break;
+	}
 }
 
 /*
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 56e13d20a8..d2987663e6 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -5304,7 +5304,7 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
 			if (slot->tts_isnull[i])
 				continue;		/* null is always okay */
 			if (vattr->attlen != sattr->attlen ||
-				vattr->attalign != sattr->attalign)
+				vattr->attalignby != sattr->attalignby)
 				ereport(ERROR,
 						(errcode(ERRCODE_DATATYPE_MISMATCH),
 						 errmsg("table row type and query-specified row type do not match"),
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 875515777b..5d81c81267 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -202,12 +202,12 @@ tts_virtual_materialize(TupleTableSlot *slot)
 			 * We want to flatten the expanded value so that the materialized
 			 * slot doesn't depend on it.
 			 */
-			sz = att_align_nominal(sz, att->attalign);
+			sz = att_nominal_alignby(sz, att->attalignby);
 			sz += EOH_get_flat_size(DatumGetEOHP(val));
 		}
 		else
 		{
-			sz = att_align_nominal(sz, att->attalign);
+			sz = att_nominal_alignby(sz, att->attalignby);
 			sz = att_addlength_datum(sz, att->attlen, val);
 		}
 	}
@@ -242,8 +242,8 @@ tts_virtual_materialize(TupleTableSlot *slot)
 			 */
 			ExpandedObjectHeader *eoh = DatumGetEOHP(val);
 
-			data = (char *) att_align_nominal(data,
-											  att->attalign);
+			data = (char *) att_nominal_alignby(data,
+												att->attalignby);
 			data_length = EOH_get_flat_size(eoh);
 			EOH_flatten_into(eoh, data, data_length);
 
@@ -254,7 +254,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
 		{
 			Size		data_length = 0;
 
-			data = (char *) att_align_nominal(data, att->attalign);
+			data = (char *) att_nominal_alignby(data, att->attalignby);
 			data_length = att_addlength_datum(data_length, att->attlen, val);
 
 			memcpy(data, DatumGetPointer(val), data_length);
@@ -1067,19 +1067,19 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 			 * an aligned or unaligned value.
 			 */
 			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
+				off == att_nominal_alignby(off, thisatt->attalignby))
 				thisatt->attcacheoff = off;
 			else
 			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
+				off = att_pointer_alignby(off, thisatt->attalignby, -1,
+										  tp + off);
 				slow = true;
 			}
 		}
 		else
 		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
+			/* not varlena, so safe to use att_nominal_alignby */
+			off = att_nominal_alignby(off, thisatt->attalignby);
 
 			if (!slow)
 				thisatt->attcacheoff = off;
diff --git a/src/backend/jit/llvm/llvmjit_deform.c b/src/backend/jit/llvm/llvmjit_deform.c
index f49e7bce7d..88ef2bb06c 100644
--- a/src/backend/jit/llvm/llvmjit_deform.c
+++ b/src/backend/jit/llvm/llvmjit_deform.c
@@ -395,7 +395,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 	{
 		CompactAttribute *att = TupleDescCompactAttr(desc, attnum);
 		LLVMValueRef v_incby;
-		int			alignto;
+		int			alignto = att->attalignby;
 		LLVMValueRef l_attno = l_int16_const(lc, attnum);
 		LLVMValueRef v_attdatap;
 		LLVMValueRef v_resultp;
@@ -494,21 +494,6 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
 		}
 		LLVMPositionBuilderAtEnd(b, attcheckalignblocks[attnum]);
 
-		/* determine required alignment */
-		if (att->attalign == TYPALIGN_INT)
-			alignto = ALIGNOF_INT;
-		else if (att->attalign == TYPALIGN_CHAR)
-			alignto = 1;
-		else if (att->attalign == TYPALIGN_DOUBLE)
-			alignto = ALIGNOF_DOUBLE;
-		else if (att->attalign == TYPALIGN_SHORT)
-			alignto = ALIGNOF_SHORT;
-		else
-		{
-			elog(ERROR, "unknown alignment");
-			alignto = 0;
-		}
-
 		/* ------
 		 * Even if alignment is required, we can skip doing it if provably
 		 * unnecessary:
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 4406617fea..e61a4affa4 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -75,7 +75,7 @@ typedef struct CompactAttribute
 	bool		attisdropped;	/* as FormData_pg_attribute.attisdropped */
 	bool		attgenerated;	/* FormData_pg_attribute.attgenerated != '\0' */
 	bool		attnotnull;		/* as FormData_pg_attribute.attnotnull */
-	char		attalign;		/* alignment requirement */
+	uint8		attalignby;		/* alignment requirement in bytes */
 } CompactAttribute;
 
 /*
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index fcf09ed95f..3a4ab71907 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -91,6 +91,16 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	att_align_nominal(cur_offset, attalign) \
 )
 
+/*
+ * Similar to att_align_datum, but accepts a number of bytes, typically from
+ * CompactAttribute.attalignby to align the Datum by.
+ */
+#define att_datum_alignby(cur_offset, attalignby, attlen, attdatum) \
+	( \
+	((attlen) == -1 && VARATT_IS_SHORT(DatumGetPointer(attdatum))) ? \
+	(uintptr_t) (cur_offset) : \
+	TYPEALIGN(attalignby, cur_offset))
+
 /*
  * att_align_pointer performs the same calculation as att_align_datum,
  * but is used when walking a tuple.  attptr is the current actual data
@@ -112,6 +122,12 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	att_align_nominal(cur_offset, attalign) \
 )
 
+#define att_pointer_alignby(cur_offset, attalignby, attlen, attptr) \
+( \
+	((attlen) == -1 && VARATT_NOT_PAD_BYTE(attptr)) ? \
+	(uintptr_t) (cur_offset) : \
+	TYPEALIGN(attalignby, cur_offset))
+
 /*
  * att_align_nominal aligns the given offset as needed for a datum of alignment
  * requirement attalign, ignoring any consideration of packed varlena datums.
@@ -138,6 +154,13 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	   ))) \
 )
 
+/*
+ * Similar to att_align_nominal, but accepts a number of bytes, typically from
+ * CompactAttribute.attalignby to align the offset by.
+ */
+#define att_nominal_alignby(cur_offset, attalignby) \
+	TYPEALIGN(attalignby, (uintptr_t) cur_offset)
+
 /*
  * att_addlength_datum increments the given offset by the space needed for
  * the given Datum variable.  attdatum is only accessed if we are dealing
-- 
2.34.1

v8-0002-Speedup-tuple-deformation-with-additional-functio.patchapplication/octet-stream; name=v8-0002-Speedup-tuple-deformation-with-additional-functio.patchDownload
From 42f33ae09302b48b9b30d3cd95d159cfbc6771db Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Thu, 31 Oct 2024 09:34:30 +1300
Subject: [PATCH v8 2/2] Speedup tuple deformation with additional function
 inlining

This adjusts slot_deform_heap_tuple() to add special-case loops to
eliminate much of the branching that was done within the body of the
main deform loop.

Previously, while looping over each attribute to deform,
slot_deform_heap_tuple() would always recheck if the given attribute was
NULL by looking at HeapTupleHasNulls() and if so, went on to check the
tuple's NULL bitmap.  Since many tuples won't contain any NULLs, we can
just check HeapTupleHasNulls() once and when there are no NULLs, use a
more compact version of the deforming loop which contains no NULL checking
code at all.

The same is possible for the "slow" mode checking part of the loop.  That
variable was checked several times for each attribute, once to determine
if the offset to the attribute value could be taken from the attcacheoff,
and again to check if the offset could be cached for next time.

These "slow" checks can mostly be eliminated by instead having multiple
loops.  Initially, we can start in the non-slow loop and break out of
that loop if and only if we must stop caching the offset.  This
eliminates branching for both slow and non-slow deforming methods.  The
amount of code required for the no nulls / non-slow version is very
small.  It's possible to do have separate looks like this due to the fact
that once we move into slow mode, we never need to switch back into
non-slow mode for a given tuple.

We have the compiler take care of writing out the multiple required
loops by having a pg_attribute_always_inline function which gets called
various times passing in constant values for the "slow" and "hasnulls"
parameters.  This allows the compiler to eliminate const-false branches
and remove comparisons for const-true ones.

This commit has shown query performance increases of around 10-15% in
deform-heavy OLAP-type workloads.

Author: David Rowley
Reviewed-by: Victor Yegorov
Discussion: https://postgr.es/m/CAApHDvrBztXP3yx=NKNmo3xwFAFhEdyPnvrDg3=M0RhDs+4vYw@mail.gmail.com
---
 src/backend/executor/execTuples.c | 208 ++++++++++++++++++++++--------
 1 file changed, 154 insertions(+), 54 deletions(-)

diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 5d81c81267..a57d82b049 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -991,54 +991,40 @@ tts_buffer_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple,
 }
 
 /*
- * slot_deform_heap_tuple
- *		Given a TupleTableSlot, extract data from the slot's physical tuple
- *		into its Datum/isnull arrays.  Data is extracted up through the
- *		natts'th column (caller must ensure this is a legal column number).
+ * slot_deform_heap_tuple_internal
+ *		An always inline helper function for use in slot_deform_heap_tuple to
+ *		allow the compiler to emit specialized versions of this function for
+ *		various combinations of "slow" and "hasnulls".  For example, if a
+ *		given tuple has no nulls, then we needn't check "hasnulls" for every
+ *		attribute that we're deforming.  The caller can just call this
+ *		function with hasnulls set to constant-false and have the compiler
+ *		remove the constant-false branches and emit more optimal code.
  *
- *		This is essentially an incremental version of heap_deform_tuple:
- *		on each call we extract attributes up to the one needed, without
- *		re-computing information about previously extracted attributes.
- *		slot->tts_nvalid is the number of attributes already extracted.
+ * Returns the next attnum to deform, which can be equal to natts when the
+ * function manages to deform all requested attributes.  *offp is an input and
+ * output parameter which is the byte offset within the tuple to start deforming
+ * from which, on return, gets set to the offset where the next attribute
+ * should be deformed from.  *slowp is set to true when subsequent deforming
+ * of this tuple must use a version of this function with "slow" passed as
+ * true.
  *
- * This is marked as always inline, so the different offp for different types
- * of slots gets optimized away.
+ * Callers cannot assume when we return "attnum" (i.e. all requested
+ * attributes have been deformed) that slow mode isn't required for any
+ * additional deforming as the final attribute may have caused a switch to
+ * slow mode.
  */
-static pg_attribute_always_inline void
-slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
-					   int natts)
+static pg_attribute_always_inline int
+slot_deform_heap_tuple_internal(TupleTableSlot *slot, HeapTuple tuple,
+								int attnum, int natts, bool slow,
+								bool hasnulls, uint32 *offp, bool *slowp)
 {
 	TupleDesc	tupleDesc = slot->tts_tupleDescriptor;
 	Datum	   *values = slot->tts_values;
 	bool	   *isnull = slot->tts_isnull;
 	HeapTupleHeader tup = tuple->t_data;
-	bool		hasnulls = HeapTupleHasNulls(tuple);
-	int			attnum;
 	char	   *tp;				/* ptr to tuple data */
-	uint32		off;			/* offset in tuple data */
 	bits8	   *bp = tup->t_bits;	/* ptr to null bitmap in tuple */
-	bool		slow;			/* can we use/set attcacheoff? */
-
-	/* We can only fetch as many attributes as the tuple has. */
-	natts = Min(HeapTupleHeaderGetNatts(tuple->t_data), natts);
-
-	/*
-	 * Check whether the first call for this tuple, and initialize or restore
-	 * loop state.
-	 */
-	attnum = slot->tts_nvalid;
-	if (attnum == 0)
-	{
-		/* Start from the first attribute */
-		off = 0;
-		slow = false;
-	}
-	else
-	{
-		/* Restore state from previous execution */
-		off = *offp;
-		slow = TTS_SLOW(slot);
-	}
+	bool		slownext = false;
 
 	tp = (char *) tup + tup->t_hoff;
 
@@ -1050,14 +1036,20 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 		{
 			values[attnum] = (Datum) 0;
 			isnull[attnum] = true;
-			slow = true;		/* can't use attcacheoff anymore */
-			continue;
+			if (!slow)
+			{
+				*slowp = true;
+				return attnum + 1;
+			}
+			else
+				continue;
 		}
 
 		isnull[attnum] = false;
 
+		/* calculate the offset of this attribute */
 		if (!slow && thisatt->attcacheoff >= 0)
-			off = thisatt->attcacheoff;
+			*offp = thisatt->attcacheoff;
 		else if (thisatt->attlen == -1)
 		{
 			/*
@@ -1066,31 +1058,140 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 			 * pad bytes in any case: then the offset will be valid for either
 			 * an aligned or unaligned value.
 			 */
-			if (!slow &&
-				off == att_nominal_alignby(off, thisatt->attalignby))
-				thisatt->attcacheoff = off;
+			if (!slow && *offp == att_nominal_alignby(*offp, thisatt->attalignby))
+				thisatt->attcacheoff = *offp;
 			else
 			{
-				off = att_pointer_alignby(off, thisatt->attalignby, -1,
-										  tp + off);
-				slow = true;
+				*offp = att_pointer_alignby(*offp,
+											thisatt->attalignby,
+											-1,
+											tp + *offp);
+
+				if (!slow)
+					slownext = true;
 			}
 		}
 		else
 		{
 			/* not varlena, so safe to use att_nominal_alignby */
-			off = att_nominal_alignby(off, thisatt->attalignby);
+			*offp = att_nominal_alignby(*offp, thisatt->attalignby);
 
 			if (!slow)
-				thisatt->attcacheoff = off;
+				thisatt->attcacheoff = *offp;
+		}
+
+		values[attnum] = fetchatt(thisatt, tp + *offp);
+
+		*offp = att_addlength_pointer(*offp, thisatt->attlen, tp + *offp);
+
+		/* check if we need to switch to slow mode */
+		if (!slow)
+		{
+			/*
+			 * We're unable to deform any further if the above code set
+			 * 'slownext', or if this isn't a fixed-width attribute.
+			 */
+			if (slownext || thisatt->attlen <= 0)
+			{
+				*slowp = true;
+				return attnum + 1;
+			}
 		}
+	}
 
-		values[attnum] = fetchatt(thisatt, tp + off);
+	return natts;
+}
 
-		off = att_addlength_pointer(off, thisatt->attlen, tp + off);
+/*
+ * slot_deform_heap_tuple
+ *		Given a TupleTableSlot, extract data from the slot's physical tuple
+ *		into its Datum/isnull arrays.  Data is extracted up through the
+ *		natts'th column (caller must ensure this is a legal column number).
+ *
+ *		This is essentially an incremental version of heap_deform_tuple:
+ *		on each call we extract attributes up to the one needed, without
+ *		re-computing information about previously extracted attributes.
+ *		slot->tts_nvalid is the number of attributes already extracted.
+ *
+ * This is marked as always inline, so the different offp for different types
+ * of slots gets optimized away.
+ */
+static pg_attribute_always_inline void
+slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
+					   int natts)
+{
+	bool		hasnulls = HeapTupleHasNulls(tuple);
+	int			attnum;
+	uint32		off;			/* offset in tuple data */
+	bool		slow;			/* can we use/set attcacheoff? */
+
+	/* We can only fetch as many attributes as the tuple has. */
+	natts = Min(HeapTupleHeaderGetNatts(tuple->t_data), natts);
 
-		if (thisatt->attlen <= 0)
-			slow = true;		/* can't use attcacheoff anymore */
+	/*
+	 * Check whether the first call for this tuple, and initialize or restore
+	 * loop state.
+	 */
+	attnum = slot->tts_nvalid;
+	if (attnum == 0)
+	{
+		/* Start from the first attribute */
+		off = 0;
+		slow = false;
+	}
+	else
+	{
+		/* Restore state from previous execution */
+		off = *offp;
+		slow = TTS_SLOW(slot);
+	}
+
+	/*
+	 * If 'slow' isn't set, try deforming using deforming code that does not
+	 * contain any of the extra checks required for non-fixed offset
+	 * deforming.  During deforming, if or when we find a NULL or a variable
+	 * length attribute, we'll switch to a deforming method which includes the
+	 * extra code required for non-fixed offset deforming, a.k.a slow mode.
+	 * Because this is performance critical, we inline
+	 * slot_deform_heap_tuple_internal passing the 'slow' and 'hasnull'
+	 * parameters as constants to allow the compiler to emit specialized code
+	 * with the known-const false comparisons and subsequent branches removed.
+	 */
+	if (!slow)
+	{
+		/* Tuple without any NULLs? We can skip doing any NULL checking */
+		if (!hasnulls)
+			attnum = slot_deform_heap_tuple_internal(slot,
+													 tuple,
+													 attnum,
+													 natts,
+													 false, /* slow */
+													 false, /* hasnulls */
+													 &off,
+													 &slow);
+		else
+			attnum = slot_deform_heap_tuple_internal(slot,
+													 tuple,
+													 attnum,
+													 natts,
+													 false, /* slow */
+													 true,	/* hasnulls */
+													 &off,
+													 &slow);
+	}
+
+	/* If there's still work to do then we must be in slow mode */
+	if (attnum < natts)
+	{
+		/* XXX is it worth adding a separate call when hasnulls is false? */
+		attnum = slot_deform_heap_tuple_internal(slot,
+												 tuple,
+												 attnum,
+												 natts,
+												 true,	/* slow */
+												 hasnulls,
+												 &off,
+												 &slow);
 	}
 
 	/*
@@ -1104,7 +1205,6 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 		slot->tts_flags &= ~TTS_FLAG_SLOW;
 }
 
-
 const TupleTableSlotOps TTSOpsVirtual = {
 	.base_slot_size = sizeof(VirtualTupleTableSlot),
 	.init = tts_virtual_init,
-- 
2.34.1

#26Alexander Lakhin
exclusion@gmail.com
In reply to: David Rowley (#25)
Re: Make tuple deformation faster

Hello David,

20.12.2024 12:31, David Rowley wrote:

The attcacheoff removal is now pushed. I've attached the two remaining patches.

Please look at the following query, which triggers (sometimes not on a
first run) an assert added with 5983a4cff:
regression=# SELECT COUNT(*) FROM
(SELECT (aclexplode(proacl)).* FROM pg_proc) a,
(SELECT oid FROM pg_proc UNION ALL SELECT oid FROM pg_proc) b;
 count
--------
 520366
(1 row)

regression=# SELECT COUNT(*) FROM
(SELECT (aclexplode(proacl)).* FROM pg_proc) a,
(SELECT oid FROM pg_proc UNION ALL SELECT oid FROM pg_proc) b;
WARNING:  terminating connection because of crash of another server process
...
TRAP: failed Assert("memcmp(&snapshot, cattr, sizeof(CompactAttribute)) == 0"), File:
"../../../../src/include/access/tupdesc.h", Line: 191, PID: 1302048
ExceptionalCondition at assert.c:52:13
TupleDescCompactAttr at tupdesc.h:195:1
nocachegetattr at heaptuple.c:668:8
fastgetattr at htup_details.h:768:11
heap_getattr at htup_details.h:804:11
ExecEvalFieldSelect at execExprInterp.c:3623:17
ExecInterpExpr at execExprInterp.c:1542:4
MemoryContextSwitchTo at palloc.h:128:23
 (inlined by) ExecEvalExprSwitchContext at executor.h:370:2
ExecProject at executor.h:409:18
ExecResult at nodeResult.c:139:1
ExecProcNode at executor.h:273:1
SubqueryNext at nodeSubqueryscan.c:61:1
ExecScanFetch at execScan.c:131:10
ExecScan at execScan.c:197:10
ExecSubqueryScan at nodeSubqueryscan.c:90:1
ExecProcNode at executor.h:273:1
ExecMaterial at nodeMaterial.c:134:15
ExecProcNode at executor.h:273:1
ExecNestLoop at nodeNestloop.c:160:29
ExecProcNode at executor.h:273:1
fetch_input_tuple at nodeAgg.c:561:10
agg_retrieve_direct at nodeAgg.c:2459:18
...
LaunchMissingBackgroundProcesses at postmaster.c:3220:1

(I've discovered this with SQLsmith.)

Best regards,
Alexander

#27David Rowley
dgrowleyml@gmail.com
In reply to: Alexander Lakhin (#26)
Re: Make tuple deformation faster

On Tue, 24 Dec 2024 at 02:00, Alexander Lakhin <exclusion@gmail.com> wrote:

regression=# SELECT COUNT(*) FROM
(SELECT (aclexplode(proacl)).* FROM pg_proc) a,
(SELECT oid FROM pg_proc UNION ALL SELECT oid FROM pg_proc) b;
WARNING: terminating connection because of crash of another server process
...
TRAP: failed Assert("memcmp(&snapshot, cattr, sizeof(CompactAttribute)) == 0"), File: "../../../../src/include/access/tupdesc.h", Line: 191, PID: 1302048

Thanks. Looking now.

David

#28David Rowley
dgrowleyml@gmail.com
In reply to: Alexander Lakhin (#26)
1 attachment(s)
Re: Make tuple deformation faster

On Tue, 24 Dec 2024 at 02:00, Alexander Lakhin <exclusion@gmail.com> wrote:

Please look at the following query, which triggers (sometimes not on a
first run) an assert added with 5983a4cff:

regression=# SELECT COUNT(*) FROM
(SELECT (aclexplode(proacl)).* FROM pg_proc) a,
(SELECT oid FROM pg_proc UNION ALL SELECT oid FROM pg_proc) b;
WARNING: terminating connection because of crash of another server process
...
TRAP: failed Assert("memcmp(&snapshot, cattr, sizeof(CompactAttribute)) == 0"), File: "../../../../src/include/access/tupdesc.h", Line: 191, PID: 1302048

This seems to be caused by the Assert code itself rather than an
actual bug. The reason it's not happening every time is because the
query is expensive enough to be parallelised and the Assert failure is
in the parallel worker. The TupleDesc in question is coming from the
type cache, which is in shared memory, and because
TupleDescCompactAttr() calls populate_compact_attribute() and
overwrites the TupleDesc's CompactAttribute, there seems to be some
sort of race condition between the leader and worker regarding the
timing of populate_compact_attribute's memset to zero and the
repopulation of the CompactAttribute.

I added some debug code to compare the two CompactAttributes when the
memcmp returns non-zero and I sometimes see all fields match, even
with adding a 3-byte array at the end so there's no hole at the end of
the struct.

The attached adjusts that Assert code so that a fresh CompactAttribute
is populated instead of modifying the TupleDesc's one. I'm not sure
if populate_compact_attribute_internal() is exactly the nicest way to
do this. I'll think a bit harder about that. Assume the attached is
POC grade.

(This makes me wonder if there's any race condition hazard in prior
versions regarding the setting of FormData_pg_attribute.attcacheoff)

David

Attachments:

fix_populate_compact_attribute.patchapplication/octet-stream; name=fix_populate_compact_attribute.patchDownload
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 9fec6e3386..4d22c03cab 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -56,18 +56,10 @@ ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
 	ResourceOwnerForget(owner, PointerGetDatum(tupdesc), &tupdesc_resowner_desc);
 }
 
-/*
- * populate_compact_attribute
- *		Fill in the corresponding CompactAttribute element from the
- *		Form_pg_attribute for the given attribute number.  This must be called
- *		whenever a change is made to a Form_pg_attribute in the TupleDesc.
- */
 void
-populate_compact_attribute(TupleDesc tupdesc, int attnum)
+populate_compact_attribute_internal(Form_pg_attribute src,
+									CompactAttribute *dst)
 {
-	Form_pg_attribute src = TupleDescAttr(tupdesc, attnum);
-	CompactAttribute *dst = &tupdesc->compact_attrs[attnum];
-
 	memset(dst, 0, sizeof(CompactAttribute));
 
 	dst->attcacheoff = -1;
@@ -101,6 +93,22 @@ populate_compact_attribute(TupleDesc tupdesc, int attnum)
 	}
 }
 
+/*
+ * populate_compact_attribute
+ *		Fill in the corresponding CompactAttribute element from the
+ *		Form_pg_attribute for the given attribute number.  This must be called
+ *		whenever a change is made to a Form_pg_attribute in the TupleDesc.
+ */
+void
+populate_compact_attribute(TupleDesc tupdesc, int attnum)
+{
+	Form_pg_attribute src = TupleDescAttr(tupdesc, attnum);
+	CompactAttribute *dst = &tupdesc->compact_attrs[attnum];
+
+	populate_compact_attribute_internal(src, dst);
+}
+
+
 /*
  * CreateTemplateTupleDesc
  *		This function allocates an empty tuple descriptor structure.
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index e61a4affa4..50b977a135 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -158,6 +158,9 @@ TupleDescAttr(TupleDesc tupdesc, int i)
 
 #undef TupleDescAttrAddress
 
+extern void populate_compact_attribute_internal(Form_pg_attribute src,
+												CompactAttribute *dst);
+
 /*
  * Accessor for the i'th CompactAttribute element of tupdesc.
  */
@@ -166,7 +169,8 @@ TupleDescCompactAttr(TupleDesc tupdesc, int i)
 {
 	CompactAttribute *cattr = &tupdesc->compact_attrs[i];
 #ifdef USE_ASSERT_CHECKING
-	CompactAttribute snapshot;
+	CompactAttribute tmp;
+	Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
 
 	/*
 	 * In Assert enabled builds we verify that the CompactAttribute is
@@ -174,21 +178,13 @@ TupleDescCompactAttr(TupleDesc tupdesc, int i)
 	 * TABLE where code makes changes to the FormData_pg_attribute but forgets
 	 * to call populate_compact_attribute.
 	 */
+	populate_compact_attribute_internal(attr, &tmp);
 
-	/*
-	 * Take a snapshot of how the CompactAttribute is now before calling
-	 * populate_compact_attribute to make it up-to-date with the
-	 * FormData_pg_attribute.
-	 */
-	memcpy(&snapshot, cattr, sizeof(CompactAttribute));
-
-	populate_compact_attribute(tupdesc, i);
-
-	/* reset attcacheoff back to what it was */
-	cattr->attcacheoff = snapshot.attcacheoff;
+	/* make the attcacheoff match since it's been reset to -1 again */
+	tmp.attcacheoff = cattr->attcacheoff;
 
-	/* Ensure the snapshot matches the freshly populated CompactAttribute */
-	Assert(memcmp(&snapshot, cattr, sizeof(CompactAttribute)) == 0);
+	/* Check the freshly populated CompactAttribute matches the TupleDesc's */
+	Assert(memcmp(&tmp, cattr, sizeof(CompactAttribute)) == 0);
 #endif
 
 	return cattr;
#29David Rowley
dgrowleyml@gmail.com
In reply to: David Rowley (#28)
Re: Make tuple deformation faster

On Tue, 24 Dec 2024 at 11:19, David Rowley <dgrowleyml@gmail.com> wrote:

The attached adjusts that Assert code so that a fresh CompactAttribute
is populated instead of modifying the TupleDesc's one. I'm not sure
if populate_compact_attribute_internal() is exactly the nicest way to
do this. I'll think a bit harder about that. Assume the attached is
POC grade.

I've now pushed a fix for this using the same method but with the code
factored around a little differently. I didn't want to expose the
populate_compact_attribute_internal() function externally, so I
invented verify_compact_attribute() to call from
TupleDescCompactAttr().

Thanks for the report.

David

#30David Rowley
dgrowleyml@gmail.com
In reply to: David Rowley (#25)
5 attachment(s)
Re: Make tuple deformation faster

On Fri, 20 Dec 2024 at 23:31, David Rowley <dgrowleyml@gmail.com> wrote:

The attcacheoff removal is now pushed. I've attached the two remaining patches.

So there's still one remaining patch in this series. I delayed a bit
to test this further as I wondered if it was worth adding another
inlined version of slot_deform_heap_tuple_internal() for tuples
without HeapTupleHasVarWidth. After some benchmarking, it seems it's
not always better. Also, after looking at how my compiler implemented
the switch in fetch_att() for the different byval sizes, I
experimented with a patch to mask out the upper portion of the datum
for byval types smaller than 8 bytes with a static lookup table. I
don't think Valgrind will like that, plus I think that method might
only work on little-endian machines.

Using the attached deform_test2.sh, I ran the tests on 3 different
machines. With both AMD machines, I used both gcc and clang. The 6
graphs in the attached screenshot show the results of the 3 different
tests. The left column of graphs is the TPS result and the right
column is the percentage increase with patched vs master. The first
row of graphs is a 16 column table without NULLs and all fixed-width
columns. The 2nd row has 16 all fixed width columns but the first
column is NULL. The 3rd has a varlena first column and then 15
fixed-width columns and no NULLs.

I propose to commit the 0001 patch only. The performance increase
seems nice at around 5-20% with my tests. The 0002 patch adds the
extra speciality function for tuples with only fixed-width attributes.
There are some performance regressions with this patch, so not
planning on using that as it is. I'm planning on trying another
approach as I think there's quite a lot of performance left with tuple
deforming / forming. I'm planning on experimenting with having the
TupleDesc always populate the attcacheoff for the leading fixed-width
columns and the first varlena column and storing the attnum of the
first variable-length attribute in the TupleDesc (i.e the final column
to have a valid attcacheoff). This means it'll be possible to use the
fixed-width deforming up to the first variable length attr according
to the TupleDesc and always use attcacheoff for that. This also has
the advantage of being quite good for functions such as
heap_compute_data_size() as we already know the position of the first
NULL (if any) when that's called from somewhere like
heap_form_minimal_tuple(). This means we only have to calculate the
size from the first variable length attribute or the first NULL
(whichever comes first), and we can start the size calc at the
attcacheoff for that attribute and only add the size needed for the
remaining columns. For tuples with no NULLs and only fixed-width
types, that basically means heap_compute_data_size() returns
attcacheoff + attlen of the final column. No looping. nocachegetattr()
can also be improved similarly.

Happy to hear any thoughts on any of the above. I am planning on
pushing 0001 soon.

David

Attachments:

deform_test2.sh.txttext/plain; charset=US-ASCII; name=deform_test2.sh.txtDownload
v9-0001-Speedup-tuple-deformation-with-additional-functio.patchapplication/octet-stream; name=v9-0001-Speedup-tuple-deformation-with-additional-functio.patchDownload
From ceaf92bc5073c45be02317f06abad1cb9dd16283 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Thu, 31 Oct 2024 09:34:30 +1300
Subject: [PATCH v9 1/3] Speedup tuple deformation with additional function
 inlining

This adjusts slot_deform_heap_tuple() to add special-case loops to
eliminate much of the branching that was done within the body of the
main deform loop.

Previously, while looping over each attribute to deform,
slot_deform_heap_tuple() would always recheck if the given attribute was
NULL by looking at HeapTupleHasNulls() and if so, went on to check the
tuple's NULL bitmap.  Since many tuples won't contain any NULLs, we can
just check HeapTupleHasNulls() once and when there are no NULLs, use a
more compact version of the deforming loop which contains no NULL checking
code at all.

The same is possible for the "slow" mode checking part of the loop.  That
variable was checked several times for each attribute, once to determine
if the offset to the attribute value could be taken from the attcacheoff,
and again to check if the offset could be cached for next time.

These "slow" checks can mostly be eliminated by instead having multiple
loops.  Initially, we can start in the non-slow loop and break out of
that loop if and only if we must stop caching the offset.  This
eliminates branching for both slow and non-slow deforming methods.  The
amount of code required for the no nulls / non-slow version is very
small.  It's possible to do have separate loops like this due to the fact
that once we move into slow mode, we never need to switch back into
non-slow mode for a given tuple.

We have the compiler take care of writing out the multiple required
loops by having a pg_attribute_always_inline function which gets called
various times passing in constant values for the "slow" and "hasnulls"
parameters.  This allows the compiler to eliminate const-false branches
and remove comparisons for const-true ones.

This commit has shown query performance increases of around 10-15% in
deform-heavy OLAP-type workloads.

Author: David Rowley
Reviewed-by: Victor Yegorov
Discussion: https://postgr.es/m/CAApHDvrBztXP3yx=NKNmo3xwFAFhEdyPnvrDg3=M0RhDs+4vYw@mail.gmail.com
---
 src/backend/executor/execTuples.c | 208 ++++++++++++++++++++++--------
 1 file changed, 154 insertions(+), 54 deletions(-)

diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 5d81c81267..a57d82b049 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -991,54 +991,40 @@ tts_buffer_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple,
 }
 
 /*
- * slot_deform_heap_tuple
- *		Given a TupleTableSlot, extract data from the slot's physical tuple
- *		into its Datum/isnull arrays.  Data is extracted up through the
- *		natts'th column (caller must ensure this is a legal column number).
+ * slot_deform_heap_tuple_internal
+ *		An always inline helper function for use in slot_deform_heap_tuple to
+ *		allow the compiler to emit specialized versions of this function for
+ *		various combinations of "slow" and "hasnulls".  For example, if a
+ *		given tuple has no nulls, then we needn't check "hasnulls" for every
+ *		attribute that we're deforming.  The caller can just call this
+ *		function with hasnulls set to constant-false and have the compiler
+ *		remove the constant-false branches and emit more optimal code.
  *
- *		This is essentially an incremental version of heap_deform_tuple:
- *		on each call we extract attributes up to the one needed, without
- *		re-computing information about previously extracted attributes.
- *		slot->tts_nvalid is the number of attributes already extracted.
+ * Returns the next attnum to deform, which can be equal to natts when the
+ * function manages to deform all requested attributes.  *offp is an input and
+ * output parameter which is the byte offset within the tuple to start deforming
+ * from which, on return, gets set to the offset where the next attribute
+ * should be deformed from.  *slowp is set to true when subsequent deforming
+ * of this tuple must use a version of this function with "slow" passed as
+ * true.
  *
- * This is marked as always inline, so the different offp for different types
- * of slots gets optimized away.
+ * Callers cannot assume when we return "attnum" (i.e. all requested
+ * attributes have been deformed) that slow mode isn't required for any
+ * additional deforming as the final attribute may have caused a switch to
+ * slow mode.
  */
-static pg_attribute_always_inline void
-slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
-					   int natts)
+static pg_attribute_always_inline int
+slot_deform_heap_tuple_internal(TupleTableSlot *slot, HeapTuple tuple,
+								int attnum, int natts, bool slow,
+								bool hasnulls, uint32 *offp, bool *slowp)
 {
 	TupleDesc	tupleDesc = slot->tts_tupleDescriptor;
 	Datum	   *values = slot->tts_values;
 	bool	   *isnull = slot->tts_isnull;
 	HeapTupleHeader tup = tuple->t_data;
-	bool		hasnulls = HeapTupleHasNulls(tuple);
-	int			attnum;
 	char	   *tp;				/* ptr to tuple data */
-	uint32		off;			/* offset in tuple data */
 	bits8	   *bp = tup->t_bits;	/* ptr to null bitmap in tuple */
-	bool		slow;			/* can we use/set attcacheoff? */
-
-	/* We can only fetch as many attributes as the tuple has. */
-	natts = Min(HeapTupleHeaderGetNatts(tuple->t_data), natts);
-
-	/*
-	 * Check whether the first call for this tuple, and initialize or restore
-	 * loop state.
-	 */
-	attnum = slot->tts_nvalid;
-	if (attnum == 0)
-	{
-		/* Start from the first attribute */
-		off = 0;
-		slow = false;
-	}
-	else
-	{
-		/* Restore state from previous execution */
-		off = *offp;
-		slow = TTS_SLOW(slot);
-	}
+	bool		slownext = false;
 
 	tp = (char *) tup + tup->t_hoff;
 
@@ -1050,14 +1036,20 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 		{
 			values[attnum] = (Datum) 0;
 			isnull[attnum] = true;
-			slow = true;		/* can't use attcacheoff anymore */
-			continue;
+			if (!slow)
+			{
+				*slowp = true;
+				return attnum + 1;
+			}
+			else
+				continue;
 		}
 
 		isnull[attnum] = false;
 
+		/* calculate the offset of this attribute */
 		if (!slow && thisatt->attcacheoff >= 0)
-			off = thisatt->attcacheoff;
+			*offp = thisatt->attcacheoff;
 		else if (thisatt->attlen == -1)
 		{
 			/*
@@ -1066,31 +1058,140 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 			 * pad bytes in any case: then the offset will be valid for either
 			 * an aligned or unaligned value.
 			 */
-			if (!slow &&
-				off == att_nominal_alignby(off, thisatt->attalignby))
-				thisatt->attcacheoff = off;
+			if (!slow && *offp == att_nominal_alignby(*offp, thisatt->attalignby))
+				thisatt->attcacheoff = *offp;
 			else
 			{
-				off = att_pointer_alignby(off, thisatt->attalignby, -1,
-										  tp + off);
-				slow = true;
+				*offp = att_pointer_alignby(*offp,
+											thisatt->attalignby,
+											-1,
+											tp + *offp);
+
+				if (!slow)
+					slownext = true;
 			}
 		}
 		else
 		{
 			/* not varlena, so safe to use att_nominal_alignby */
-			off = att_nominal_alignby(off, thisatt->attalignby);
+			*offp = att_nominal_alignby(*offp, thisatt->attalignby);
 
 			if (!slow)
-				thisatt->attcacheoff = off;
+				thisatt->attcacheoff = *offp;
+		}
+
+		values[attnum] = fetchatt(thisatt, tp + *offp);
+
+		*offp = att_addlength_pointer(*offp, thisatt->attlen, tp + *offp);
+
+		/* check if we need to switch to slow mode */
+		if (!slow)
+		{
+			/*
+			 * We're unable to deform any further if the above code set
+			 * 'slownext', or if this isn't a fixed-width attribute.
+			 */
+			if (slownext || thisatt->attlen <= 0)
+			{
+				*slowp = true;
+				return attnum + 1;
+			}
 		}
+	}
 
-		values[attnum] = fetchatt(thisatt, tp + off);
+	return natts;
+}
 
-		off = att_addlength_pointer(off, thisatt->attlen, tp + off);
+/*
+ * slot_deform_heap_tuple
+ *		Given a TupleTableSlot, extract data from the slot's physical tuple
+ *		into its Datum/isnull arrays.  Data is extracted up through the
+ *		natts'th column (caller must ensure this is a legal column number).
+ *
+ *		This is essentially an incremental version of heap_deform_tuple:
+ *		on each call we extract attributes up to the one needed, without
+ *		re-computing information about previously extracted attributes.
+ *		slot->tts_nvalid is the number of attributes already extracted.
+ *
+ * This is marked as always inline, so the different offp for different types
+ * of slots gets optimized away.
+ */
+static pg_attribute_always_inline void
+slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
+					   int natts)
+{
+	bool		hasnulls = HeapTupleHasNulls(tuple);
+	int			attnum;
+	uint32		off;			/* offset in tuple data */
+	bool		slow;			/* can we use/set attcacheoff? */
+
+	/* We can only fetch as many attributes as the tuple has. */
+	natts = Min(HeapTupleHeaderGetNatts(tuple->t_data), natts);
 
-		if (thisatt->attlen <= 0)
-			slow = true;		/* can't use attcacheoff anymore */
+	/*
+	 * Check whether the first call for this tuple, and initialize or restore
+	 * loop state.
+	 */
+	attnum = slot->tts_nvalid;
+	if (attnum == 0)
+	{
+		/* Start from the first attribute */
+		off = 0;
+		slow = false;
+	}
+	else
+	{
+		/* Restore state from previous execution */
+		off = *offp;
+		slow = TTS_SLOW(slot);
+	}
+
+	/*
+	 * If 'slow' isn't set, try deforming using deforming code that does not
+	 * contain any of the extra checks required for non-fixed offset
+	 * deforming.  During deforming, if or when we find a NULL or a variable
+	 * length attribute, we'll switch to a deforming method which includes the
+	 * extra code required for non-fixed offset deforming, a.k.a slow mode.
+	 * Because this is performance critical, we inline
+	 * slot_deform_heap_tuple_internal passing the 'slow' and 'hasnull'
+	 * parameters as constants to allow the compiler to emit specialized code
+	 * with the known-const false comparisons and subsequent branches removed.
+	 */
+	if (!slow)
+	{
+		/* Tuple without any NULLs? We can skip doing any NULL checking */
+		if (!hasnulls)
+			attnum = slot_deform_heap_tuple_internal(slot,
+													 tuple,
+													 attnum,
+													 natts,
+													 false, /* slow */
+													 false, /* hasnulls */
+													 &off,
+													 &slow);
+		else
+			attnum = slot_deform_heap_tuple_internal(slot,
+													 tuple,
+													 attnum,
+													 natts,
+													 false, /* slow */
+													 true,	/* hasnulls */
+													 &off,
+													 &slow);
+	}
+
+	/* If there's still work to do then we must be in slow mode */
+	if (attnum < natts)
+	{
+		/* XXX is it worth adding a separate call when hasnulls is false? */
+		attnum = slot_deform_heap_tuple_internal(slot,
+												 tuple,
+												 attnum,
+												 natts,
+												 true,	/* slow */
+												 hasnulls,
+												 &off,
+												 &slow);
 	}
 
 	/*
@@ -1104,7 +1205,6 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 		slot->tts_flags &= ~TTS_FLAG_SLOW;
 }
 
-
 const TupleTableSlotOps TTSOpsVirtual = {
 	.base_slot_size = sizeof(VirtualTupleTableSlot),
 	.init = tts_virtual_init,
-- 
2.34.1

v9-0002-Add-special-case-tuple-deform-code-for-no-varwidt.patchapplication/octet-stream; name=v9-0002-Add-special-case-tuple-deform-code-for-no-varwidt.patchDownload
From 4496610ce2f06849be75a7582cf767635c8346f2 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Thu, 26 Dec 2024 18:47:32 +1300
Subject: [PATCH v9 2/3] Add special case tuple deform code for no-varwidth
 tuples

If the tuple flags state that a tuple has no variable width columns then
there's no point in adding a check for attlen == -1.  We can omit that
and save a branch when deforming tuples from such tables.
---
 src/backend/executor/execTuples.c | 96 ++++++++++++++++++++++---------
 src/include/access/tupmacs.h      | 11 ++++
 2 files changed, 81 insertions(+), 26 deletions(-)

diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index a57d82b049..2bb7b6fc15 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -994,11 +994,12 @@ tts_buffer_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple,
  * slot_deform_heap_tuple_internal
  *		An always inline helper function for use in slot_deform_heap_tuple to
  *		allow the compiler to emit specialized versions of this function for
- *		various combinations of "slow" and "hasnulls".  For example, if a
- *		given tuple has no nulls, then we needn't check "hasnulls" for every
- *		attribute that we're deforming.  The caller can just call this
- *		function with hasnulls set to constant-false and have the compiler
- *		remove the constant-false branches and emit more optimal code.
+ *		various combinations of "slow", "hasnulls" and "hasvarwidth".  For
+ *		example, if a given tuple has no nulls, then we needn't check
+ *		"hasnulls" for every attribute that we're deforming.  The caller can
+ *		just call this function with hasnulls set to constant-false and have
+ *		the compiler remove the constant-false branches and emit more optimal
+ *		code.
  *
  * Returns the next attnum to deform, which can be equal to natts when the
  * function manages to deform all requested attributes.  *offp is an input and
@@ -1008,6 +1009,11 @@ tts_buffer_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple,
  * of this tuple must use a version of this function with "slow" passed as
  * true.
  *
+ * Callers can pass "hasvarwidth" as true even if the tuple has no variable
+ * width columns, however, callers *must not* pass it as false if there are
+ * variable width columns.  The compiler can omit the attlen == -1 checks when
+ * it's known there are no variable-width columns.
+ *
  * Callers cannot assume when we return "attnum" (i.e. all requested
  * attributes have been deformed) that slow mode isn't required for any
  * additional deforming as the final attribute may have caused a switch to
@@ -1016,7 +1022,8 @@ tts_buffer_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple,
 static pg_attribute_always_inline int
 slot_deform_heap_tuple_internal(TupleTableSlot *slot, HeapTuple tuple,
 								int attnum, int natts, bool slow,
-								bool hasnulls, uint32 *offp, bool *slowp)
+								bool hasnulls, bool hasvarwidth, uint32 *offp,
+								bool *slowp)
 {
 	TupleDesc	tupleDesc = slot->tts_tupleDescriptor;
 	Datum	   *values = slot->tts_values;
@@ -1050,7 +1057,7 @@ slot_deform_heap_tuple_internal(TupleTableSlot *slot, HeapTuple tuple,
 		/* calculate the offset of this attribute */
 		if (!slow && thisatt->attcacheoff >= 0)
 			*offp = thisatt->attcacheoff;
-		else if (thisatt->attlen == -1)
+		else if (hasvarwidth && thisatt->attlen == -1)
 		{
 			/*
 			 * We can only cache the offset for a varlena attribute if the
@@ -1082,10 +1089,13 @@ slot_deform_heap_tuple_internal(TupleTableSlot *slot, HeapTuple tuple,
 
 		values[attnum] = fetchatt(thisatt, tp + *offp);
 
-		*offp = att_addlength_pointer(*offp, thisatt->attlen, tp + *offp);
+		if (hasvarwidth)
+			*offp = att_addlength_pointer(*offp, thisatt->attlen, tp + *offp);
+		else
+			*offp = att_addlength_pointer_byval(*offp, thisatt->attlen);
 
 		/* check if we need to switch to slow mode */
-		if (!slow)
+		if (!slow && hasvarwidth)
 		{
 			/*
 			 * We're unable to deform any further if the above code set
@@ -1121,6 +1131,7 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 					   int natts)
 {
 	bool		hasnulls = HeapTupleHasNulls(tuple);
+	bool		hasvarwidth = HeapTupleHasVarWidth(tuple);
 	int			attnum;
 	uint32		off;			/* offset in tuple data */
 	bool		slow;			/* can we use/set attcacheoff? */
@@ -1161,35 +1172,68 @@ slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp,
 	{
 		/* Tuple without any NULLs? We can skip doing any NULL checking */
 		if (!hasnulls)
-			attnum = slot_deform_heap_tuple_internal(slot,
-													 tuple,
-													 attnum,
-													 natts,
-													 false, /* slow */
-													 false, /* hasnulls */
-													 &off,
-													 &slow);
+		{
+			if (!hasvarwidth)
+				attnum = slot_deform_heap_tuple_internal(slot,
+														 tuple,
+														 attnum,
+														 natts,
+														 false, /* slow */
+														 false, /* hasnulls */
+														 false, /* hasvarwidth */
+														 &off,
+														 &slow);
+
+			else
+				attnum = slot_deform_heap_tuple_internal(slot,
+														 tuple,
+														 attnum,
+														 natts,
+														 false, /* slow */
+														 false, /* hasnulls */
+														 true, /* hasvarwidth */
+														 &off,
+														 &slow);
+		}
 		else
-			attnum = slot_deform_heap_tuple_internal(slot,
-													 tuple,
-													 attnum,
-													 natts,
-													 false, /* slow */
-													 true,	/* hasnulls */
-													 &off,
-													 &slow);
+		{
+			if (!hasvarwidth)
+				attnum = slot_deform_heap_tuple_internal(slot,
+														 tuple,
+														 attnum,
+														 natts,
+														 false, /* slow */
+														 true,	/* hasnulls */
+														 false,	/* hasvarwidth */
+														 &off,
+														 &slow);
+			else
+				attnum = slot_deform_heap_tuple_internal(slot,
+														 tuple,
+														 attnum,
+														 natts,
+														 false, /* slow */
+														 true,	/* hasnulls */
+														 true, /* hasvarwidth */
+														 &off,
+														 &slow);
+		}
 	}
 
 	/* If there's still work to do then we must be in slow mode */
 	if (attnum < natts)
 	{
-		/* XXX is it worth adding a separate call when hasnulls is false? */
+		/*
+		 * Pass hasvarwidth as true so we don't have to inline another version
+		 * of the function.
+		 */
 		attnum = slot_deform_heap_tuple_internal(slot,
 												 tuple,
 												 attnum,
 												 natts,
 												 true,	/* slow */
 												 hasnulls,
+												 true, /* hasvarwidth */
 												 &off,
 												 &slow);
 	}
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index 0de67e3602..c4ab2cd3ee 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -199,6 +199,17 @@ fetch_att(const void *T, bool attbyval, int attlen)
 	)) \
 )
 
+/*
+ * att_addlength_pointer_byval, as att_addlength_pointer but for byval
+ * attribute types *only*.  It's not valid to use this macro for
+ * variable-width types.
+ */
+#define att_addlength_pointer_byval(cur_offset, attlen) \
+( \
+	AssertMacro((attlen) > 0), \
+	(cur_offset) + (attlen) \
+)
+
 #ifndef FRONTEND
 /*
  * store_att_byval is a partial inverse of fetch_att: store a given Datum
-- 
2.34.1

v9-0003-Make-fetch_att-faster-on-little-endian-hardware.patchapplication/octet-stream; name=v9-0003-Make-fetch_att-faster-on-little-endian-hardware.patchDownload
From 0b23daeed4b74cbe442dd9cb512815df2c3e65b8 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Fri, 27 Dec 2024 01:17:04 +1300
Subject: [PATCH v9 3/3] Make fetch_att() faster on little-endian hardware

Is it always safe to defererence 64-bytes when the attlen is smaller
than 8?
---
 src/include/access/tupmacs.h | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index c4ab2cd3ee..0ec409df98 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -46,6 +46,29 @@ att_isnull(int ATT, const bits8 *BITS)
  */
 #define fetchatt(A,T) fetch_att(T, (A)->attbyval, (A)->attlen)
 
+#ifndef WORDS_BIGENDIAN
+
+static const Datum fetch_mask[] = {
+#if SIZEOF_DATUM == 8
+		UINT64CONST(0x0),
+		UINT64CONST(0xFF),	/* attlen == 1 */
+		UINT64CONST(0xFFFF),	/* attlen == 2 */
+		UINT64CONST(0x0),	/* 3 is an invalid attlen */
+		UINT64CONST(0xFFFFFFFF), /* attlen == 4 */
+		UINT64CONST(0x0),		/* 5 is an invalid attlen */
+		UINT64CONST(0x0),		/* 6 is an invalid attlen */
+		UINT64CONST(0x0),		/* 7 is an invalid attlen */
+		UINT64CONST(0xFFFFFFFFFFFFFFFF) /* attlen == 8 */
+#else
+		0x0,
+		0xFF,		 /* attlen == 1 */
+		0xFFFF,	 /* attlen == 2 */
+		0x0,		 /* 3 is an invalid attlen */
+		0xFFFFFFFF, /* attlen == 4 */
+#endif
+};
+#endif
+
 /*
  * Same, but work from byval/len parameters rather than Form_pg_attribute.
  */
@@ -54,6 +77,14 @@ fetch_att(const void *T, bool attbyval, int attlen)
 {
 	if (attbyval)
 	{
+#ifndef WORDS_BIGENDIAN
+		/*
+		 * On little-endian machines, we cheat and just mask out the unneeded
+		 * bytes.  XXX this assumes it's always safe to access 8 bytes of T.
+		 * Is it?
+		 */
+		return *((const Datum *) T) & fetch_mask[attlen];
+#else
 		switch (attlen)
 		{
 			case sizeof(char):
@@ -70,6 +101,7 @@ fetch_att(const void *T, bool attbyval, int attlen)
 				elog(ERROR, "unsupported byval length: %d", attlen);
 				return 0;
 		}
+#endif
 	}
 	else
 		return PointerGetDatum(T);
-- 
2.34.1

v9_results.pngimage/png; name=v9_results.pngDownload
�PNG


IHDRz
��\sRGB���gAMA���a	pHYs���o�d��IDATx^���E����J6��.H H �!��q���a�!�}�����@��!$����6��*S�3������d����twuuWuu�{��^�"QL!�B!j0�=���u�Y�=!�B!��>�c�B!�B!�B!D5C�!�B!�B!�B�j�=B!�B!�B!��z�B!�B!�B!�)2�!�B!�B!�BTSd�B!�B!�B!�����#�B!�B!�BQM��G!�B!�B!���"C�B!�B!�B!D5E�!�B!�B!�B�j�=B!�B!�B!��z�B!�B!�B!�)2�!�B!�B!�BTSd�B!�B!�B!�����#�B!�B!�BQM��G!�B!�B!���"C�B!�B!�B!D5%��-D�`��u���O��9sbGRc��������������og�u�5l������3�^}�U�;������������+WZ�6m���N�������������/�t��>�h�z���� K�,��>����gk��A��*#�f��m?���p��JsI��W�^v��'�����3��g�����2�S�I��������n������{��n�*ce����F�i����]w�5v45l���w���c�9�233�~I�M�m�t�8��'��dee����j;v��BT���rB��rq�������S^zG:(/�3�4'�U�\��V^�o�,�XU.?�E2���������{P��,�|����s����	^����t�8J�6���?����&�=�FBG,�Ei����X,�q!�Tw�iAAA���l�[��g#�K��i$�A����O��p����Td���_�}�Q�9sf�h��[���B~�G<U����������������0�T�o�,,\��z�!:t��Z�*v4u(7>��k?��s�L���������������D��BQ���T�xy|s�q�K�HAy���gIiLF�+��H�VI:Zy�����bU�������T~*�T�{P��`��{����kcg�'xm��W���(��`;�~TZ�+!j"2��M8�.]��[l����U���bs!b��qN-�`_� ��� �l.�����)Sl����'��2�7T^e�<D�_�hQ��B!�E����>Em��u������bs#�]i�j:�(��T~*�t���%3��' �(	zD��@{����p�	IoA�<�j����>������e�]�YM7�j���1yM�����*)rRf�|��A6�F�����x���x�b�B����B�����t��6\��R�S��$����?��L+��jQR9��:Q��w�1b�M�>=vD!#C���`����Nz�\�BN��]���M��H�-yL^���kQ��S���"=�,���/)�pB!D� �$�}���� �H��OQP9�x��Yc���~�.��5z�BQ����7Qq� nB!�B��F�v��I�&�����.nB�b	E+��F����{�f���:����Y���cgS����~�i���~��v��g�i�K�.�g�y���]w���0H4�e�����;�����5�SN9��5k;�>S��~��g6w�\w_�S��[ch��v��-[�c�A����+=z�[�x�����`�����������{�ix��],@�u�W���q��0���
s�	t���N:�����yF�5��q���|�r{����s�i��N;�47�(��O��e�q���m���>��C�P>�vb�m��$n��w�G)�7x�Q�Fm�G�����7��E'Y8�Q�������;�����8f��a�?��{6�?���%?x� ,��sP�X#����^�z����;�lu��u��,[��-n�b�
�s��SOu��|�;!M��C���{X��m�i��i���O�g!����/�3�B���_�����#��(�={�t��4n(*��3�^{�5w����I�/e��x7c�/~t��'�l;vLK��?�}��.�)���W�-����]��D��>c"���|^��~ANfI���Gu�&�.K�z���y(����+����1���O�����������=��6Qh+���N����^Pw�a���������:�����?��rq*�"������B��|������iOi�h���p�/y}��!� W"og����E��r
r!.����lL'+��J�x^x��fcq��723�#� ; ��C��z�)[�d��=�gO��S�4&+���
�\��UPc�gD.�k����� ��hAH�7�|�t_F��'�����X��c�MxY�u��.��'[�z����t��v���!�[�T~��:a���r��J����x����9��wC:x�x���{�_���Owku��7���7��u��G����Vf��~�s�����A/#���G����A��8���t�F/��^��O��C�q���B�.JO^����t�8J�6���P��>(?����{ )[�#y�l_��������p � ��Rt��r��o�M�O!���>rB#a�Do��i��8��s�9!��8�`:~�a{����]��k���'�"�!<����l�`=���b���3�P e�C����}���.m�n���.�ot�[���^x
��w�}g��w��K��{ �����N�%�x�q{E����Q�^~�e�6�Mx�z�
o�����C����e%ee�{q�`��0�����n;vl���p?�"��|��ee���VW�5���&����E|���yqTD9��������`��cl�\)k�!���z��'��/�H�/� �G}���0%=�����<�X�L��>N��� |���R��p���.������S.|]�F�b$��o���3�!��<(JF�q�� �#�~��'�mh�1!��*�Rt�y�p��w:Y�������7d���7:��������p�����e,'D�!�D���CD"=�����c�����K>$�?��%����������M�0/�c(A-*�EA�������ec���,#l�D'F�A�Xq [#OQ��Mx�[������R���B��x�x9�Md������0�$��EY�y�~"��8O~3��*��U~8��O��z��E9�:&���<���{F(*��Y�1�`~�
��V[m�6 _��-9�>)W��_��|s�J=��;�.	Q]��G�4@c�,��� "xh���C�&<3jThh�l�������0[n��
4�>�`7"h���1#Q���W_}�	h1���e�]����~����&�>�����o�~��DB"J���<A�����w`UQ�n�AYy��w�}�0�1
��b��I����x�8�;���6�vbd�~��������B���s���b�
�C�Cx@�H���Cq��#dx.���a����2B^�nQ�I8���xv�!�~��N�)
�
��N���a6i�L���b�E��g�u��N|'<��7b�!3��H��Yy'���b�6�e��R~�����������x�'�/�g|��(cOY`�i$���cl�����U�3�"eX.�J�2����J�����y�tfV��N&��!�"]�� ��:��`=����BD����������C�4r���	�^��z�7�:� ��C�H�93n���yY�4��y����D����E�� �%
�H8y��$�����v�G�3y{����8xv�z�o�������F��Y�ec����<I���W#�c@(
�����s:2q�3:;��{A�baR�g@�e	�����}��'y9���������<7���@�����x�����x���VQTF��[��0y�1)��w�A�p%�IOy���^���[.�������w���'�[�����?�Lt�D:��z�H4��L�a�	�K�.�!�1e�k<�S!���3_|�s!�7������#�Qn��	���0��"��35���L?��#���.rS����T@�D������DF3�%��gX�"q��z����"_����?�M+�@~��0H�l����J�J��)��y��C�����{�~HaPhS�[U�����sq����(�Px�{�-��%��P�%!Q�{t({��Az���3��c�=�	��������#�Q�����]z���><��7\���o!6Y*��NH����c�7�i<e)?�txp��q������z��|'������R��| 8�����B����	��t�?���q�r�wt��g�:�<�}��P�xo|��F�
!��y�5�r~#�`d���t�"� o�y����t?�����8i��}/������l���x��_t
#���Nz��.��B�f���)
�v~��,��Ah��eh:"�;���^f�z|�EY�X�����<
��O��������xR���w~���/^���lt�s
z2�c"H�0\;�+{���{�F$���2�3�%�M����x�o�I����Q(�{`��0���o�������Q~�?P6�)T]~�G����x����}�yN����d���@�BG�%������T�����Pv0�R|?	��_��Wg'?����hc�����#j44�������K��!/����$�=��.��Y;�c�T"F� ^t���#��6B>/!6~���Y	(��s������!dq/:y&��/��K�$i���A�$����&�+�/�L\%�����Y�t�#�|>�������y"�A��C������T ��C�R"�3�{{�������\����f��x�4@X�`Qp�A(%>.<�fTaH~n�/1�Fx��~�&���p�`.���w��=���!��t
B�[�\yJ[~P�u�"Kx:�)���_��Soxc��	��~�o�+*��B��hN���p+�~��������-6�7�=u$��4��I!��l�@������;�
�E�it��!����w$3����Ay�����\�
��AN
���o�Ut�1��kx�`g���G�C=t�v�����T���y��n�:�m?���,�)���!��o��<�XZ��|g
�������d�Tg�$��?|F�Cd���2�����"�8�L'a�@VG�&-��_dt�J/c3��(�g���@���<S"9�{���)���=���^�,\��A�,y��|r?_^P�Ar�i�o3]~0����QQ:&qRg�5��{���� ^�FO�X0?J��v�$�+��[�P�)3������_�9��_)��Y&��,d�5z��6�!@��q���������
2�hhL8h\����B E��C���k*�^o�AHJ4��8�d����?��F58*
%�Nw �~�6��[J�G\~4\q���Fqm��F;���E�D--���O�^0��%���2*O�;����o,��|(:��(P\pMR=������T.	��c��=��#h%��'*�0��=���ai(m�A���P�y����%o�#��]�Tx_�.�xobS�_�p���q�S�_y���������$�Bl��z����8Y�(�W10 ��S�����m�#s�f�� �L�P!�x�HN:���/:BP�A~�:��������G�����Y��g��r<t�#krdn����7����&���{qTT�!�y/�����������,Y�q���B�"��x/7���������=��E�`?�)�"���(���7����K�+�����-�I�6pm��,�G���p��=�r��g��'�-?|7���=r��rE�����x�Q� �����K*�5_`�a�j"#}$x����+����S��N��#j4T�L���mI�MiFb���C
0�Oh���?j�Ca8����&�e%����@@�BKPi���R�>�Q:E�`��$���\^����
����.���@\�(�����5��@�D�)/
VT���{�
�0ry��d
2�|�w���LF����K��t2�&/8&�� P��GI�D�Q���3Q9���/�j������ai(m�����'
����L�����V��H%�S��q%O.��u �C��y��g�������J �E�-]�[!D���D:P���B{S0������B��-r	�f��I���Q�|Dgw"��o��^��Z?�
���@�*���9
�K��a�N�N�a�8r������./�����&���� �� ���=�_/��Cv�\�����.s�X�i��p����On"������9�
��dg*����h��L�D��o�)�R�
E���.Ay�P�����r�;����7�g1;(]��J[~��A�(���l.���cE@^���z�w����,�������q��w�5{0��d�:�����N��GW���&\���KI����[�1�
��
2�"h�9
��h&,n�X|��m���.<���T�^^����31��QP^�,
^����4�tFYA����h=���P����B��'�� �1R�$�X��;��4#�����{�u.5n��f����������n��K��+��rZ���3RxW������g��"�{��rXJ[~�7
�%Cq��{!�\���
.,x/�s���M��d�(�yDyg�&#����~���[��^����B����H���>��b;e������:m�wv�q���,���ed9�L$?���y�=����M��$?!"o�dedj�c���A�9�Ng�,^N+y}�5�,�� ��t�=%��Kg-�3D:��~��p�
v�m��SO=�f�3�9cSI��P�e�`9-�L�h��$*����d��&{���b��������`V�=~ ������� ��Z�����/>o�����RNRLX� x����a@$3iw���`�t"�M0��	�9 C��� � ���E��1F�N%������	66[u�m4^�x���H-�1PX�R�����<�&��WX��5��Ny���6��Lye1fU5LX?
�����w�F�!�!��lb�H���T6����3��`�M��p2�R��0���d�W�� ��uEu��<\��2�9�] �#���o��N}@���_|�u~��tv!���A>N��ot�'#q0"(����Y8��@�4/+����k�2h0�����,F�g�iD&g66�c��8����ag�3:��`<�P�i�jP60��s�=�U:�<2"����0�Q�({��d"�K�w���+�e�8�:��=���s������=�?x/�3�r":"���
4L�e�g�|�����|������wQ�
#���p�F����aq�m2��
�o����z�~t!�=���Z'M��J�%4!D��x2Z�M�t�R�z����F���N����.���K�\Yz�I�V�5%����M�9aq�[�!|��,b�8Jd:���A(O�=��sE���pK�!��z��v�����W_m]t�[h��`�!p����xP�.��������K�P�aY(if^q��t���(o�u������K�z1�2��S�!�P�X$��g�y���1j��R�Q_��3���KU)B!J������mG����3���Em��Jv6L��`{i@VAf�c�"����~���������S�!�y���)�4V%>��s'� ��.t��E:����N�:'�x�F�eC��A���14aM�D���
�.����}�+��_/��>�����_�!�k�����S���e��g1UWxwAn����pC���� �z�����������/�:���
r��M�C�)�|���~!�32�Q�:C4�L�f�7�-�N��Po�@�Ov��4`4��pWR�&�*�UZq���K����0@':���_6?*�T��kxf��&�i�A:��ds��D�Ca��1�
�	�&�7Z�l��T��(I��<zC�,����s��n���6?R.Y����aET�x�� m^�'/�1[�����P��+L��*��p�#� �|�P�0�(�����w���;�uv]u�Uv�1��N%��6\��B!Di�c��>p�	rn�e����xdM/�"������Em����\Pf�k6rO2�H��Nd?�����=0q#���N�3��X��'1p)(��DE�������s�r��l�\r��X�wtnS������$���wz��'3�*h0��=Q�-j�p��n����08�������#���q����
����k���w��Eq0����*�UE'"
[l�����<H��[p6yF��,�������
���H]�+7�K��0�0��r@}��7�>
Q���G�4CSBQRXh���c�Q|'��Wht�J#P��!��xI#�������H�����UB���e~��.�F�p�B�~����[�?u���^����\fqQf���>����=o(�E���O�GYJfv	���C�Lf�QY��rX����N������ �Q$�N����A�/N)���qT6�k����7���)��,���(�<$��������$S�+<��#v�wl4~��)�(8<���nk��~�s�����B!����0v�����/�O�z���wJb�(��/���lT��Cgp*�����"".d/�#��4����>:�1��4���e�d��4V�	���+2dD����`��$�n���\9������)	w�����D�}��~$4����;�3\�/(?�N��d�V��
y�&�X������~�=A�Eq:�aaU�2�8�����1Y���?A�K�������UU��5�p���{�I��#���<?��2��rN�C=]��0!*���!D� �������f�m��e��?��	^d���b��`0��s�E��L�;cn���p�5�	l��8���U� l�
[<;��/�����~��g'P�
o� ��tx�NMQ��0bx�	���!�Ap�b<t��?>�W<t��P{"xW?���F��SJ��c��G��	��������C�����aEB���w���s�k�{�|���7E)G\����$������n
����������s����u+�R������V��S�Q�'2��P��LH�2��B!DY������t�!��II��9O� �mt�r��_]l���r����]w�eC����qx�T�x����O���
�0:���dr�0�^�op�9#��?���'Ke��*�;F�:����]�>��#G�,r ������>�����=�J���`&��������>�M��
�����(g�K�+y��3�9�<�<�U%��T�d������A���;@�(��a����������^N���a�)No�������������%R��*��1}h"H4�|�����.�V���=B�
6P�$\j�x���p�s>\�x"B�+������FW4�t�!����a����{����42e����.���,4�������4  ��E@8��%#'��
����[o�s��5l��?	7��aTGq� ��0Tx6���jOZ1�$lp^~��M�����x�%�(��`�GZ������I�+���L���jB%�c�E�S��t
3�R�0��f����5Wx>��7�|�O�"@^R��`K:��P�u^�E����p���d�����5���}&���������,�K�������7�s��ETU��?�;��2���7<|�^Q#]��B!DyCg9�
:
�(2$2��yX����'\�s9�:�O�i���;Q��<����1����v�w�C|�����~A���'Q��*��^���� F���8���0����tB��>�+�%�%��<�D�@�I$����Op�:pq�3�������^�el/7cH�F���=�����#t�V?(+�T���/]y�^�]���F� ���}"�g���g��z9�o���.-�,?���M��/���
��2}� ��pd��2D�(C���k��k:��1c��p#�%��o~V:���>����:�����[t���n����4�9���u�M�t�vI��L��Qb����P��I�?�|�~�6
��A��w"#�������o�z�
��P<A<(#�H�8p
>31�(1!��X1���6������$��������xh���m�
���w�q�L�cQ�#���ae��I�������~���2/P p���YAxv�K��,��7��� �(H����ZM:������`��|��L<B #}�O��xx6�A��&��G�F���3���:C�E�F!/�����3r��O'GID�A��S>	�Fy@(���2D� ��G���E��������[�<���(*�s��=(����s'�B��=a�!M�?���K�}���������w�'_0(QN���'��{q��/���q�<���K��?����=�o�q�����>�I��sp
uS�������#�H7y���dH����8�s��X��o��7������@����)��K\j2b�7e���b�(5������'F���%m�=���������w�;Mt]�Fx�9����#u���������;&-���k�����7H�&DM�����(��E�8�Qt�"#"'`�9��C7v�"����,��l����&d3�-��7�}���Kx/�"K��qO:=XG�E���hgqy�u+fH#;a��-�$�{��{#Kp������V0>�Y�g"`��OP^��?�3�%�v�=G<���@�����Q)<3z��N)��0�9�����7� �������C���z���y�n���CP�����w�� �!�����%���5�-����������E�����"� ��<��{�u'OI�����a�����^H�Pg�>y����}����q��xx��/C��%���(��9�K��&]E��\�,�~3�/��>OQ�����N���E�@/�� �������[�D��yO���)�A����o���������w�;���F� ���/���RN	�!�$L��	zD�#(T$��XE	(:t�kh��tDH�~�:�id�hp��7/��9����!��y��F#����K��p������@<��y���i�Q�8�5�OCWe��F�F��
a������?�>��f<�Pj���B�x��`�;B������`����_�B)�4�5��P���T:�A����;�����N�!��3!�wV#�al����Gy�K�H�]���-���A��e��=�&.�Aif$fP8��R������Ch#~��"�q���y�q�����C2�������B`&-������W�!���QF���7�l������c�=v���A�&��k�����5����/�A"��0(���x|9�,%;�R�fH���=�=�sbp��R��)�\KY����)��%���4	z(o���F:�[ ����'�5�6�M������]��E�I��7F�=���O��5�A�7!j
�S�"�CQ2m4�h{���:�(''�,d6�|:�h����:?�����p�i���~P�����W/7�-~&��m�o��K����<;m>�(��4x�Cm;�l�)AH��gdut�D�Ay!QGsy��$�����j�u<%�h�+�>�WdY��\F�����3����s�|2�7���{A��C�".�y�%����`y.No/�"k��xy
��{�l��@�1����~E�oI ���=���5���tW���d�aE��9���{��y}��y��w��7,�w��G�����>��R�P=7��\����bEQ�o�Y[���N�������/���N}�u�!�x�����n
�yO��;`?����^t?����;F)�'��)�����!���/�f�H�t	Q�H}8��D�h<h4h�ht����*
0a��k=4�������Ot!�4�
8���^�:"R�!�3�8��J��h������D,�M�X
BOPp�u�r�+`���d��xH7������F�������'o�:�,�����{�A����p=��OEC^�n��EE��y�"K�x�'�|��o�
���{=��3]��`�;�p�;�x(�(@��||�S���?�=�S���P<��{ ���I���C'Ai�TF9�{�}x!��C����7(_ x��I/�#/�7yI'�9����2Q�@8��\���Z_�(C�s�1*6�����N:��| ����Yy���;	*Y���_t�E�h��DZI7u#qQW��>����Dp������EQ�x�6isx�(v�wJ�H��q�1��l�	!��B'F�hd\����� ����>����=�Wt�7�hP�A^�<�:
v�I�@@���3m%����K#�&y�2B��.������������G+S�KDq:�G>�}��N����O3�>���_�f��� ��K3@+�<F�����#yw�G��dltt���9H���tW/�y��gf���'�[Y����,��Dn��%�F/��D��d���C���m1�Q���'O}^r����P���	C��qPN��(_�;������t�V�:"i>��S\�I��^���8����,R��[�)��x�������3R���}�;f���LYi�e!���G��kb3�"��:*r`�����o����Mq������B��^���x�8Jj��a�x������{�,�+�9�%��O�?�A8����Y��D�rMQ��I��pt����Q)P����g^��-���/)��K������,���<�O?� y�f�����y8���i"�>N�aQe��������(��0����\�6(�r���'�����t���p�����K�#�`9#�������|$�H�/c��S1$���	�=(�z��!������7��������*����O��$K��������m�\p_�V��,DM���sB��rRIrII$�qhh�|;T�=�#h��6�62����$��o���}KF~�}$��v7���6�(�'YxF/gq%�-H��|,��Ay��^GIDY���%����!,�p_�U�#���2��OT68�s#rMq���	7}���<,J�����ay�t�k�4�,<�O�,�]OI������l_��L����]\_F��y� > �/O��l�A=L�����qM��{xv�:[I�G�H���,�x<�w��GX��-Q��G!�BQ���G!�BQ])�+�B!�B!�B!�,2�!�B!�B!�BTSd�B!�B!�B!�����#�B!�B!�BQM��G!�B!�B!���"C�B!�B!�B!D5E�!�B!�B!�B�j�=B!�B!�B!��z�B!�B!�B!�)2�!�B!�B!�BTSd�B!�B!�B!�����#�B!�B!�BQM��G!�B!�B!���"C�B!�B!�B!D5E�!�B!�B!�B�j�=B!�B!�B!��z�B!�B!�B!�)2�!�B!�B!�BTSd�B!�B!�B!�����#�B!�B!�BQM��G!�B!�B!����D���D~�U`W���ti���dc�
��my���JG�A#���ClO����Cb�JO����_B$f��Q�:oMl�tl���5��8�'����{��:����HD��Y�7���^��h�������	Q5��-���a���
��P�Cb{B�t�W�o���.�W:2��W��b{BQ���G$�g�����[~A�@)��4��Q��G���Q��e�/?�"��������s��V��#bDi)�7�,� �WzBM��>O�����g�����H�0v�t�d��g���f��B���=�S0s�-��B���cGJIF��=�l�9���!*��u�����B�:v���,��w�>�/�H�u��Y4>�WJBf����.�wz��BTod�Is��������^�8k�l;n������}�����c{e�=
o0��TA���=���6g�����#�<�����Y��uc�6���oo���=����l�2�W���z��.|�Z�b�6�x�b{����������B����]r�%����Z(���j�*����e;����t�I��C$w���U0�6���Q�2v�b��f���l����������G������5+]z<3g��{�����n����}��e�]f�:ur��t��8G�e<��M�4�k����}�����{�{T��}��]�0�W6�x�
l�]l/5R)�xwA���g�����.�]v�%v�t�R��#]��O�;���������qc;���k*�#]e)[l�������V[�}!�z�g�;���{n�����X�����E*�K:�� �*�/��
F��+#��,s����D�I�<��c�+]�~������_�^|�E[�t���a�z�����G��wy3}�;��XnA^�H����c���e�5��I�Q�o���2�����m��f�k���I�����:�!*;]��<����/�K����@��Qb��(�����%e���]�m���7����_���~�*��D��c,�����n��r:,��44�4�{����k���)Sl�������������K�������mk�
rB3���Yc;���4���^{�����g�����9����G��B(
�u�]g����{�;��c�L���"3�����H��;\b��z���J����y���?�����5���k�K�_|�����v�GX�^�l�����{�9��y�����I��/����n�:�����G�|&������I���2�m�����ui�>��<��]:�]#(��x�u��5v&uR�~�������	�s���}���v�yg���C�:e�|���taS!�J����y����/��8��f���o��W_���{[�\8!�
�z��Jg��	��ey?~�+���,g�A�������nO=�������u.$����}�T��z�E���)#�Z����N�f��E��3��A#M�4���C�O�;��w�NG���f��]�����|�;������e��.l�Y�v�
��~l�l�����8�2B��:S���t���f1 <���v���;#����P�L������Q�������v����w�Q��N�:�v�}w����d�I3|\�z�v�<=K�,q���~������	�������E�=���W_m999v�=����l�5rJ�.]\'L�6�5Pt��|��NH�m��\�0x�`�@P��[o��f����q���_?��|�����O?�w�qF%aP��������w,a+\�,Xi���odk����2�$�w�zw@�	#gx����[�����O,�����Gq����#�o���",X�F����t�
7�`u��q#�<�^��k��
�����	���Q�henY]�l`��Je�I6����`����^������,//�	�e1�$���#]�ew�q���5����>;���\�R�0����+._��k{��IG��-�w�u��1����������3���;n�����(?P&e�)�������'�e����Cg�G}����J�hRi7��@����N-?COF��~yl�z��
Fkr�!��_�C����1���T�Y:����G������,�����N'K�-���|�+;�����~���! �o�g@'��0d����o���Jk�����������5n�8g@'.��8`�W���r�c��.��H�����D��B���P���H��{w���{.F����������`�:�%��Ex9���P���)�r����o�a$K�
����&N���
�5�\���p�O�I��w�xw��t���Q��t�d������\�!NF�� � �4l������,�t���I��p�h_�M�2"����g��3f��5�d�.]�0����.(C��Nf�L�0!v�R�~�������L����N�6m�����Q�J��\����av����S7���?���B���v����d��t� 9�jC�|Ahu"�|*���ls���D�#]�|�t�3�f���w���y�NU:���g[�b�+*�����C�H����9�����Et�n�bg���~����J�QuQ*�Bge���A6���B�G?����#�X|�xq��d�=���5L�\�p��@���Jw�sTL�@�����+��B8��N;�U@�����>�^{�e����}���Y�8�"##�=���?����@%�q�Cx����X���	a��}�-��8]Z�h�V��xA��A�)����T�4��q �x744 ����zI���y�>��Q�H%��������!�y��N�N�|b���(B��f�0"�c\��t��"����qr
S�yf��R��t�;�>�2�>F�d�F%1J3�T��t�a���J4��	^������J@`����q��M��|Bl� ;#/#S�o��}d���'�:���:B��IGa��D`Dz�=F&�>����=��R�1�(�G���M�5�7)�L���Y�-�F!�:���>��:�a��n�9�����r��������l����
$���/����<Qx��h�<�	F��9��� ������G6tY�;�{(?�c������*e��K9f�2�����)��� ==�&	�;��pOF��t�!M��a���W���S��4e�����$�HW*�,e������93�.��R��Y�m�F�G����ce~���!R�f�-��hGo��&k��i�L��lE�CTv]T�~����RI�;�v�u�M��
�������@���UF�Q�`�a��q���c�.��6�,�T2�=��=����������L�c0��1
����B*�:�����K�!��8r��N5J:��QK?��g<���]����<T@����P�F�Q>�Ge�x��

9VzF�� _n���BCC�>�?y�a
�A�kh`���c�
� � �0Z$>��F*y��wT�@9��c�h���']AA��d���t����p�PW�9�����B*y��w����K���}���D�(-�|?�Hy�����r����!$�J��N��~'��!7[t�2�OQ3@v�^����?v.7q������c��q:�
tJ�j���b�*�8��tf1C9�Lxp��N��,��N�s�=��?�Wt6��S3:�h��W�������y���h������"@��S+Q������P�2I��O�}IW������:X�h��
e�����o�>������n�2�g}~��Jy��2���f
):����/��wL�r�A��{�,�����,e�2�l��]�qKzX,��nf�����=�^)�tf�%-��J�5b:����c�#]�|��?�w\����Qj�LV]�Y��������{�(��d�T�7�"�o��)��&�Z�n��kJCe�E������E\��{e���@���������
Q�P�c�e���'��J(�74l4��<?��HFZ�����
%A�i�(L��b�|mz���<�0�`$b� �
(���	C�"�_T}F c��yp�Q	WA(b���r(���_��IY`�|��xw~:yD����7����!�	��Dx�xP����� ���<GM'��K�����]yA�0�z��An���x8��C�z�����B��sy�;�=Boy������t�C�q
����TIG�J���,�4�6�3#�Q��q!6�<bfu2:���7��do�}�}f�Q����b�MF�3���[ou��W_}��Q��	F[Ag-�!�7u.�����m��>@����F&�?t�q=:�b��� "�~C`�����M���
<7��s���dI�}IW����p�hI��#�N3�����o72����s�76��]��U:��6|�et:�����:�)��G��;#Q�9GY�pH����k��Z�yvF�3�tQN��c�Nj�\���M�5���d��d�v�2i����l�+]�|��`$��s�SN9����Q��Y�D`���,����F����N'
~s���&[����~�U^T��(�(k?DUJ}(����3*���5zD����
	�����464&�{�8F?��Qro���������r�!�B��*,�C��(C�Dx�/�>�RQ1
�NB������W-�������'�t�k����X��L��Q0?b���D|O���?�O������&��K��K�82�o�H����l�0A�J�+2]2�=��)�P���]�H%�����������e����C����
�E=k��'����P�P:��*������(�hKI�=,��9 �#�#;#���D��z�#0�������iG�Ft�w�'.���uur��tZp/m1��N0�0:*����c� �>e�
���=	q�`�f�0�����PO�A������~��4�z����Z�
4�]�
��aHV�)k; ��
y���;:�X_��ZtE6�6y��>�����N.:+)s\�N�#�2C�E'EN`$5��#�"/�S~��;C���H�ls�h:�HG��A .:��|�3h���<�KF*��l�*�&����z/{�����^�1��{��N��J�����@X�Rn�z�������,�a��#n��������7���B��0Q���fS��Ht�����~��^�.�V���2 '��5zD��F�W��Q�����P��Q�a47��T\��~`F
�����C���M��D#M�Y��@�!.�P�����{���1XI!UQ�T��;�=
9�JX��`t
#:5(�xR��t��x��p�7:W*�����)�� ]t�TT��g���yF3��&��T���~w�������mt��q�1�����T���HJ�K/��8<�>�����*���t$1������:J��f���#� �#��|g�I&����l{���*����A�g�C����F:������YXS��l���.c`�u:�x�����g�}��if���+�p��7KK��f����z&e���H�yY��o��G;����$����I�W� �g��g�}�l�uq=��$:y�j�K[���J���XI��_�]#�tN���SR��a�����cx��k���)�t���o_
���O�����kU�������n�9J���fqu�q�>��<U��-"��|���Q�uQI�U�.**]�A^c�2}��m�2]�(>7������T4BL���{��g�u�]���(k���J�)�C�q���p�p�QGk!�E�D��-Dp�J���1���S��hs�YLT�T�APV��Qxi$@h�����(��9
�0�q
L<T�����3��]:�]*�����~c��<�?F ]����w�3WD���Q�u��,�L2�����]:�]*�������l�EQ9�����t���W���7#
�m\e��4�����K�Lg'��H���fQT�<~������pni��d�3�h�S���=��\���A6m8�y�L��J�"u��A]�=�!D�3�<��%u�a���w%��AF_�	�
��/�j�Db�*�%Ayd�mf�2����i"���d��{���bM(�#e�f���Q���^�L����PG�3=�N�T�%����L��w�
�-x���w�^���18���T�Y�}y��<3E�wM�*����(\�f����������C�H�7�J?D���T��L?DU��J��(�~����W��,���=��@%��=FJ��E%G��J���QL9����;�y�1d�
2S"���TY`$���k@,�GC�)�pP�A!����/{��������T��f�
�3��f4�&Mr
Z�������3��]:�]*���~C�������|����G���nqa�@����+]\�B���o�"f
�Q]��T�.�.h%�����x&!�c�|?�J0��i���k/7u��P����NW*e����j#]���B�������!�(d��_|�u�14�c
Y��FR3X��\C������:,���N������G�P��������)X�/��Nu�X��K��7Q����:��5��y7��c�k71*��t0���Z~�������uDQ�������Kf�1�c3vY����l�NEI��I�^�B�A��[���|�A:�E��|���d&3I(g��&�H���f)K|��cd��o�k,��Oe|����������o��CT���{%�Q�uQ*�z���gf�A����G�����#jTL)��cF��
�	�Y1��G(L�f��/�>LM��*F?����W$��a�m�r�Q�1�?����5i�?���
�Y�J��������G�����%Oi$6��w�!~tH}���AR��t��t�P�/f��`�GRF"�HG�8G����gF��"Don$�w�zw� ��'�"�P������_7�QY��t�+�2@;��E\���k�tE�`��B��;�`�����NB>���|��U:��;7F�����S:.�����1F��v��]���f��`��##�P�a������I:O���l#SP��*W$�����F?��|�����C%���3FY���p]����u:��,����,S�i�+�l��S�x�g�y�����U���,��������t���R��0�~�0��(�tT�7�;f�'���S�N��,���D;���P^�l:t����M%]���~��Ni�^)���!�Ye�u�m5���G}}���2|\��\���(+};f�6�-U~������e��q�8Ly�����_F#|�p0r���o���v�]w���C]gq��e�T>�h�]��8��_�^�\LSE���et1��7n��*�#R��$.�����w|z*��	�,���Y�,�y4��K*sFV"���p5DE�h�0���T��3�<f4����-�����  ���"e6#�X���$-��^pTK�P��"���);���Z(��5��!��K��KD�����LU/�0��g@�/1��w|�m�9��i�|�\��t���On�R��Fx���o6��]A|�K������c{ec���K��;l���t��x�������rE�AR�~��.F41��z�4�����r�}0��S�J��(2:���Z�z��G��{����s�9�	!��tb����6��~�����d�lm9���%���q�������:�Zt�`@�.�3�=O=���X��uPR�P�Q�P���S��0b���>�{�>|���G�2��N��L:7�/�8��L:��I�UD�	�'���ff������
u.3�x�.�d��t��T��v�E���)#��r�����A����Gq�{���e$>��7���{���:}�y����uk���9@���:�U�O0��Q�����8������d�6����)	�t��YGgz����ex6��N��H�<��wO�e��$�M4K&�J���'�x��w�F�3t����:M+�}�ea�������b{e�o[m��GU�o���x����c�Fh���BE�����b�N6/����������Q��.���qO����\d�>i���5zD�TwC~�@���FC�5���=[FT��Qas-ai	O�W����t>����4�t�am���7�1'qT:4f�v.���`���F$�q?A�����;�|BI��3��WV�S���`��!�Q�ay�5
	��	@�@C]T�`�BxZ��H6�����	~��z@&��a�Y|���
#�
���^��eHG���@�EP���!�wEP=���t��x������y�D�R��w�8�H:y�i��/g~�_<���d��������������0�<���w+D*��S<�����������.�>C~�0B���)S����+�2��Q�r
3p��f�:1(;{0�'��EY����'�������.s�ugQ�%�L�=�cmF�{Hy�l����T��t��T��z�w:�i+)�t���E�G���������~����lr�@��&���y�e����;F2e;��� �|��@��7��U@N�s�����t���n��y��UHW���fy'����%����L�?�t�����SQ�,��r���}�Ki���g��_��2�YH����o6��(����"��4��,Ut]�l�ho��"��4@b-!���d��@(��$D1\��z1i�T��r��l����?<J������8�"�c���1F��ID�����jT((iTPL��n*.*
�d��L�X���
#���2(���#��|e����������`�������������[Z���������+?��wB>b�{���^�o�O���?����L���+.�Q�PyG�Y�D�������gy����.�t�T�.�.H�7\������I�
��_<��._oGE���{��^5?�W6n��������H�L���)��8���<��y��K[��#]���T�iI@x'=( ��!B���!����������������Gc{��������z<^G�����%K���#��q�-�R��:�����8�u��{������{������7���{�I\����3�(Yx6�f!�������������j�<�*�/��
~>(�WF��X�n��Y�,���c�����2�(��x��?�I�y��r=i�{�|����wO\���a�^�r��6�)�����`z�����,����9iH�{I�l�"���x��l�#]%}��Oy9,������a��v���������dY����:}���3���^��
�l:t��|�e��DTV]��~���c��������a+�����#��*zD�Q�="�PU!C����*�!��j��S<U��#D:�
�!D�TC�BTE�f�5�F�8�a���	7��n�<7�0�D��PF�i��".���fE�ZF��
k�n��B��G�A9���+v����U~e;�-�H�tS/��Y�e�Av]�o:A!�+��#�f��B{��\���lE�W����w�5���=Q�DV���O>d��G����������Xf�
�4�R)��YZd��������P�3,����o}c���0o�=��K������_���9k�c�vf�nX��:�=�Y��V=�����s�H��h����}�et�c]!*���V8���{9*J��,�,��J5?4v@����	o�;��[�k��
g�q=�A���B���="i()WF,7�lE�vv���StU�p�g�)YY���yT��T�2���"��?����,���,��fm�����<[�v�DJoP,�^��V}k\���������d
�,����p8�1*���p�R�����E�epz��P���(��B�t�2w�-]�:��[b}��9����	!6d�B!�B�xd�B!�BTW�F�B!�B!�B!D5E�!�B!�B!�B�j�=B!�B!�B!��z�B!�B!�B!�)2�!�B!�B!�BTSd�B!�B!�B!�����#�B!�B!�BQM��G!�B!�B!���"C�B!�B!�B!D5E�!�B!�B!�B�j�=B!�B!�B!��z�B!�B!�B!�)2�!�B!�B!�BTSd�B!�B!�B!�����#�B!�B!�BQM��G!�B!�B!���"C�B!�B!�B!D5E��8��]k=��������;��A���W_����X�?���������v�9���i�bg� ���������v�hw�}��^�:���;��]�}���^x�[�~},�B!�BT]��o{���F=)��p�
�P(������/��o�����x�����?:}-�o��f���_��������#��Y�f��!�BQy��#���_������Ad������w�i��f������?�^y��q�������)��b������J����kS�N�8���icw�u��w��U�PB/�������t�	asrr����v�OdlB!�B����)S��/����lk���&[���c�����r=z�5�\c>��������k/���v�iN_�,]�����J�^q�����^j�������7>��#��sgk��Y��B!��G(*o:|�����q�g'�p�]v�e��aC[�h�S��c��������)��r��q�nf��������������s�{���j��eK�,q��.\�f
u���V�\i�����������A�z�u���n��6��h`:t�������
!�B!���{��:���^��ad����������[��v�����U�:���_oC�q�O�z��Y�-����?�\���/;�y�� 4y�d7x�U�VN?#���;��������}������+;������^��w�����{�9�����m���B!��2����}��S<N?�t�H1:��^�3g�t�����<�m������uk��0������]����)(��!NF~�&�kP>rss]�a��9e�������E1b%�B!�B�y�@2\@�t�M����3�<�&��u��2���Uu���L�.[o��u��e��y���O��3��zX��s`BO������X���D�r�-���=zXff�3������Qq�-�p��B!��ld�	������z�-�j��bG�B���QX�
s��q��p���AwPv�eg��]0�k1�ddd�c��];�����9rc�?���E��0/���q��()B!�B�������u?�<�H{�������A7�����k���N:�%�x��k����3b������)������[�G�v������B�����~{��{��Q���5|`��un`F$����l���k!!�B!�2���������M�zf��rm�v�h�;w������B�5r��'M���Y�pm��u����,7{_��uC�@a@�@Y	�Q�N����B!�BTO�^x����0��a����>����F�du8��3�<���,�>�p-qT��<1�`�a�3_���`8�� 8OY��T�_�`���h��� �����g��i���U��>���n]!�D����`�����/�B!DU@��"@��c�=���/v��o����n��w6��x�7o�E^!AA�`�O<�2���(1��w�����|p7k���RJ�B!��t,[���c����������5c�4i��
8��a�]wuk�r
�~�����RU�F�������I<��o�m��z�}��g.\Y��T�G�/F�x����<��a8�������?�A��u\�g�7�|����6�	!�BQUE��.�=J3s���o_�&�%��u�yC��+��v�����:���+����B����7�p��	�Z@�r�;��;����T\<E��(�B!��3��	�O�uRQ`�`���9�Cn��LPU��wk�N�y�����a`z�\��>/���W��L���GA-�v�i'7��S�z�j�0a����]
Wnx��s���:c:��p�\(��	!�BOY�z�A~���N����O��K.q�����>���(CF��:�n��v��?�Q����������_~������`~������7�8e)X��J!�B��Jk\���6�����:1�/���D0Sc���Q�x�[9��	�3���.����c�n����g���~��YEz��ktF�'�|2vtSP�|�A����CGdVk�/����zk7�/�'�����_b��B!DMy�( Yd�I����a���2rk������{�w�a^xa,��x�
�G���_�c�=��������1���d�)���F��|�i��)��&lp4���+���v.>���Z p+���B!�BTg����\Z*�����"�������D`����;���������F���7���������������L�������u0�q�����Bm��~p���������>vtS�yu�1��J�{�����[n��C��{�����=z��]U2�-��B!�5�.dY��'#�P<f��i��s�&��
#��!3b�7B������=��n�N?��`�����sKp��'������W>�Wp�@c������~�XHs�������_q��Z!�B���x�AyS�tf���?���{��nf	���a0Z`�(���t���+=�����;vt�@��.�����O�����O���{aX����)�D����n��:_<<7i����-���+����4h�����0Y��	!�BO��="����\~���z��E��I��>���H���#|pd��5��B9��"�:u������P����s#�������n����M�4)��C���'�Y�j�;~�a$�Dn���HTis��
J$�tD����H^^�;�#�?�x�V�Z��^z�B!�B�/�>�h�W����ODZ�ji��y$
E5j�����-[F�������"�����?�p$��F�����:
�7.��G��N;�Y�h�;VV�'�������;�k��a���{�����;G�N�;�)����l��V���o��n���H��}#�/v������G����B!��h2�/j~z
�YT8w���r�+|/���kn�F[���������OxTqp3|�g��M7��\�p�
nA����f�0���x�����b�����Y3���-��X4�~l��!nd���:Au��ua�B!��34��n��^����:6�<�54k{2���K/u���7\?�U �n��B�V���3�<�TB������k3f��E�Y/�=��O	�cMH�z��P����[(77���F�{������/�}���O3��E�����v�S��;����SOY����I�&v�]w�5��>��*�v�B!������,������5u���;'�s7�������M����(��m��9N)@�b?k���t��
c��C
qb(����7��7�tF!��D���
�B!��|��5z�pA����[���~0@C�#�<���o���v
:F���������C=�N=�T{��g�1H�z��!��F��t=t�����v�i�%t�G��N:�������|�>�����N�����C��.��
!���DV���i7[��Yj���{�"����5����[��a'Rh�3�������,�`'w��E�}e���mL�F����f���F#[���j���8�Bl�=q0jk���6{�l7"�E�S�N��Z=���O6���{��nO<,�9u�Tw
qv��y#pOG3f�p����h1)
B!�B���6��`�@���r?���Y�f��3�?R�t��?A������5rz��;�����L�6����������kWg�I�&�7���r�?-���L�0����{���MBQ#)\g�.����-��-ju��?�,���mh[C9��r:�����X��+,���f���~��:��"�^2�����ma�wY��Uf+����fyK-���B�����in{��K!�d�B!�B�x*���c�	���R�p����M���!��K��7-2����nw�C���Zd����P��r���[m�`�,���y����\+s��Ze�y/[F�G��t���'9�P�n+���Y�����qF��h�Y�m7�%���)"B!�BQ�`�y�����I�&��&�"����]�	!��N�"��l����e���t������Vw��"��Zd���3Q�[[��>�@V���f��Y��.�e[���f�+�������2z�g=��H���u����2�BOZg�5��Y���/�pS�=('m��qit�Anz�!�B!DeP�3zpv��[VV��t�M��Y���M�|���Z!��
g�a�v����jc��p���=m���P�
'_m�������
Aa^��[-�z��;_e����p���p���jl�u�-�'�������l��h<��gX��������B�&C>�G�e��w��[<w�\�'���]�cF���Qi�W���.����v[�E#�B!��P*��3o�<0`�]|��N/� 8!�U��EV0wj�,T��EV��P���r�E�o�����:��=�����p]$b��o�����x�����Yd���hY��[�'��N5= �?�"��X��V8�gH���2�<f��|C�BQ�)wC
��7�h_��5n��<�@������[��:���!h��U���b�
�����O?u�w�e���k�U���N!�B!�H3UaF����o�z�]}����B!D�p�[kg�����IWX���n{��}�
�a��:�yn�N��������
F�\�����^���c���8�`e4���x�6�l��=\�RE�zj��������sf9��BQ�)WC���K�����Z�j�a�f��ww.�0�5K'??��,Y���M�<��|�M[�~�=����:!�B!�H7�m�)((�x�^y�{��g�k���3B!D� ��=���r�[d����������"���>OV#�"y�+�d6�P����2�!�n;#���v3yB��Dj�B@�zV�\i���3�t������cg�#77��M�f3g�tnX�T!�B!�Mez�xp������?n-[���m�&��8�����5j;"�B!�������l�ccF�w�}g=z��&M��c��,���_j!�B!DEP��������A�l���n}���,����C7�N���B!��r_�'~�O=�T;����s��B!�B��Eezp_���y�#''���~�����B!�"����.��b\p�]|����B!�BQ��lC�B!�B��p�oZh���t�A��[o����k7!�B!��Ag���/��/t�N:�$�={����6f��X(!�B!������Y�l��v�i6l�0�r�-�~��	��i����w�})��#�B!��EU���z�j���������Y�f��K5jdo����q�V�N{��G�g���+�B!�"�3zrssm��EV�n]�:u��=�~���?m&L�����UB!�BQ�x�����'��}���^|�E������
�?���S=��SVPP��!�B!�uF��;k���IL����o�����;"�B!�Ge��Y�j�s�1N'z���m����;���N���[����/��#G�|�f�!�B!�uFJ�;�`������_�~���[������ad�B!�B�Tp�6y�d��i�v�����m�Q,�u����
!�B!D�
=�5k��#�<b|�v�av��g�E����o:����B!��������9��S�~�[l�=����B!�B�
0�0���s��[o���L�b��-s�V�Xa��w~��B!�B��
��l�����s���~h����3`]S��aVa�B��Ld�X�,��l���,�vJ,F!����5z�������o�����J�i���O�;������?~�]|����{�}��'�mB!�B�J������?��N:�$k���u����.]j�F��O<�����"<���NB!�*�S�m�%���)%�1�h`�V�[��y��B!��=��:t����~�����v�yg����;�Qg���r>�G�a+W�t��B!��&���;��O>i��u�>������v��!C���{������-�BT="�[���,����W�m��Y������_yB��H��g���n�����j�5��|Kw�������bG�B!���Q�vm�{�����������n{��wl����+���!�U������-����fZd����B�D������cM�4�_~�����cG��n��5k��
!�B!DM&77�y;�s�=��t�f������B!�&���b�������_B!�VCO�z�l��w��^{�y���x0�|�����K/9�n�B!�B��������3��{�����[���Z��z�!;�������w���B�*K�����%���B���z233���N�6m�8WGu���?����5{.��7��o��+�B!�5���{��'���>r��������k�;l��y�����9!��J��� �r%��!�"i5�@�������O>�f��i3f���u���)S��������r�Xh!�B!��y0sg��a�������o����x�Z�l����K/��hC�q���B��H�v��/!�I(R��������qg����XVV�u���Z�nm�Ph�&�B!����5���^��]l
���	=Y������?�+�>��2;���K�~���Y���~���>��f������K��s�������j�k7q��{�1;���b{��y�l��v�W��g�;�)�����l����U��Q!���P�C���)�W~���a�^���B���=K�,��O?�~�������.n4����kg#G�t���.]�J!�B�N��
"�vX��-'3�^��F�Z0���oGw��m]�w�1�=m���x�������6f���U_nP�=��GT=����f�J���cs��ua+�B!��r7���e����Y<��f&����E����^�O?�t�L!�B!�#���V8�r+s��=�"^�p|���c�Z����V���Y3�
;{��_O���/7��^Y�n�G�����Vv|��m�6;X�&]me�j7~��E6q�t{c�������x��{���NSg���kl������������uK��j�s�j��A��/�`�������������;���_ta+�B!��rw�������7�|�)'��������5k��z��	��[����nu�ht�B!���8����k��e_�����[��"�^����,���
k�������X���V=��P�[�p�9��5��-:�W�g�L��b�=��+v`��l�6��w�F�����^����l���X�F�m���mP�������[\jY�,�j�H���msV/��f}gWlw�ui�a����v��F��3�<�V�^��\7n��g 3}���������n��!�U
�nB��!��(���#

�r��Q#=z������V[Y�6m6���mk;���s��"�5z�B!D��0�B
w�P��,�����ny�E`���������Yj��YV5��k����Y=���t�P�o(�eT�[F8�f��g��6�vn��
h�����Z�nj��s��5�m��6i�������~���>�wv3}��ke]���}:�;����;&6���m�]l�r`p��[om������?����j3f�p��Ad_|�3�ddd��B!��9O����+?B
�Ee�Cb{B!�)�=�L����o��O>�����8l<�����I)+B!��zS�.�����i�)����k���Xd����j��&V8�Q��a�n��J��Y��N��B-��p�#�p���(�E���,~��������v-�����hu�j�uw���������Q���G�0z����Vu�[f(�&/�a{������
������H[�~�������m����R�3z0����+n��������+���u�Z�N��e���u�U!��LhF�BTi����U+k����Y�����o�[�N���3����*��@!�B�jK8�"y-2��:�-�����,5��f���
r�x��c�:Y��E~��BM�p��,�;�"k&�YA{�B6l�>�;{k��v�����#����gZ�:M���/�U���-\�����]��YvJ���L������m��6u[���+���g��|��6�`�u����J�b�
{��Gl�������g�}����;;�IF!�B!D"��)�h(k��Z�*vdS�L4|�p����u��B!��z�]`��7����p����x��N��������68���,2��F��2���j�5��jw�J��.������_h'�d�u��u����mith��:�����������yo��M?����vP����g�V�X��M��^������zl��>�f�wq��������W!�B!�H�rw����;����D�x��_8?�����[�?��&x����A��3B!�BT/
�>g��n��]�r��c����-����������c������l���P����6����m�E�
�;�BuzFc��Ee�n��������;��c�\s�������u<���c�f�!����u�BT�n�),,t3t�q[�z�3�l�����["0���/�<P��!�B�j�������^�����<��?��3������f�nV,P�P�����H�����^�@���lC���K����|������
�Kd�A����{�:�B!DUC�!�����,:u�T[�h�]|��v���;���`=���;[���cG�B!��b�lC�������`�����`����{�i���#B!D�A�!���b���_�����{����5o�<vT!�B!��m������'�������f��W!��j��#��CZ
=A���k����5������Kl��1��6�h4�B!��R�lCO"p����_���Ad�UW]e;��C��X���?�!C���+�n��v�QG�A��?�D*�/[��^x����O�z�����3�8����Xk����yg��mm��u3��u�;��o����������_o�[��B!C�BTi���}�Y�����v�k���\�y��v������c��B!����f�{�����c����?�.��"�3g��p�
��8Eub���N|��7l��y�� -��z��W��)S�c��6�|���k��
]�8R��|���[����rF�6m��g�}���c��,_�����Y���p����u��9��k�
!�BQ���������7�������v�9����k��<�������{6x��j��!�B!Dy������v�-�������c�f�`����c��>�����C��#bG6���~����i���K����o_�������H��a���8Gy���s�e��M7���F��C��q����>�O<�N>�d��_��f$M�0�����?�����f	!�BQ�����H�����5k�n���w��������N;�v�m7g��-�B!�B�D��8f��~������:}	���gW\q��Z���y�����*�����������;�)��w-�)p��p����K��L������/����}���-���:u��f��p�	����H���A��o����S��g��_�r�=����������n��	!�BQ�������O?������Z�j�������eK8p�M�6�M�B!�B�������sOg��o��]�9���(���W_��U�I�&�w�����C��[�}��3����N��A��O��
�ji�����9r�[��s���PfYYY��.��0�%��~����)��X'	c0����~s�}�R!�B!DU ���o�"n"xa4Zp�K!�B!��i��Wdx<�Y<{z��a��-s���F�x��f
�����A0�0��]�vJ/�0���NQ�R��x����W/��A���o����e`\k���
:�]������xD����+��B!��*���������+�l����������0�B!�B$��y?����j��~.����/�����"� 5j��&��� ��s�:�F�SBU��|��w����.���w�;�)�����Lf��P��E���(7u�\�Q��x�4i�tQ�F.����J����/���~�������s7k�,;�����;B!�5�PT��~�;D�/�s�=��n�M��4����_����;��=��#�B!6"yK������!d��N�8����;���K����k�X^$?v�d2Bak\���q����Q��"���eZe�����.s3H���Z�v�g�}f\p�}��7n�
k��6�}���f�TE�[��������5KX������A��pa�K7C�5�#���Z���cG� ������fJ]w�u�h�����c��0s�p�����g(Bg�{����K/u��X�g��n��/�0�L���%��������<����v�?�'��eH�VC $���v��w;!nK�,q�����g���d$�B!���H�Ef�o�K��������B-��P�bG�����>��~_97v$u��4�����un�>vD�S��`}����o����`���n�����������>������+������Q
�	�` UCk�y��6~�x1b��j�*v�R�~���Ezp������ue�z����MAo����g�<�������E��m��������A��\s��\��	!��F���X��_c{���z���&���	!��E�f��;N��z�?����{��@cd��;�(#�B!��l(���E��b�u�bGR �e�z},�������b�����wY�i�Kl�����D<U����1F0�0@�s��;c�xWeU<6t�A�y���ieF
�v�e���n����;hc>��sk����H/��>�������J��E���\����t4��?��������x�������I'�t�}��v�y�9cF#�W�V���z�>������d�1cF��Bl>��u�e��%�W~�ix�-m~SlO!6/X2(���
1�x���i��TF;	!�BQ(��E�|�+�w[����oK���o:�4\���vD�}c{"��`��3f��Vk�zS�=�q$##������/n�K<�'Ov�+f�`�XBZ���j{����/��m��&�\�q��q�hE��K�z?��c���n�������:�(<x�s�1�����8������q��;=��!�����]��D����]Y2r�&����6!�(U�u��0���xM-[�t����,��B!��\(��T+��bl�t������q�e���������S��r={�t������������~���5n����q\�]u�U��F,�S\�.~�a��NQ${=���_��'�x��x�
�f
��Yc���}��'n����;�w�zIg�q�K��������kp����?�
NBQ)���EV��+?����p�nB����
���~�;��z��g��5��;�-`�p�B�����B!��!�����[;�[��0+\��2�v������g����?������z�J��}�E[��+����n��2���Ed�7�[�����gKefZd�X�,�"v��d��p���Ek��S���ea`���w���=��v�m���~��K/��7�lC��a��9�#��w.�p
�1Ut:���o�������������iS7C	�n�Y1������s�����a&��6�Q����0�`�!�o���n���a�X!���}<���n�:�7������s�!��ma1.g	!DM$2�	���_W0�P�,��L�<�B�esk$��3i5�0����>���g|�9��i���>���TuF[1�k�m���
�B!���(�?�����eo��2�����?��mkk�}���t��.�-o�w�����O�dy������ky?�h��v�PV�.[jk_z���M��=��Pv�EV|o�%���T:�
��P�#�oz*��`�����f�����{�����m�����;7cd���r���'Nt�f�0;����c��us��w�y��X�#
����{o�y?��a��#�8�K�z��%��)��{���_~i����{&4��a���n�����i��6�]v��!n
 �F�]v����w��DBQS)OCO�n/u���[o���pB!��H���+V�a��F9�w�}��]���
F ��#4�vS��h-!�B!�	��qc���"�����Y��N���\����,3�V�r��|����]oY����I�m��OZ��o�PNm[��V8{������X�zV8�+�|u�N�#���z��������]��F�/En��67����^�z����Ov��W�5`X�#Gu�1Vp���*Haa�M�2�~��W7S��G��&����s�����������3�y�@E�d�a���c!6�����1��3g�}���.N�����;B�tQ�����/�p��e�����f|i�s�s�vv\�-
���j�����������h��Y��/X��Ox��]j����Q�����:���+��9?���u'�d��l<���l��j�%�A���k�	!D"�:���h�����4����v��|4O�>}�B�B!�B��p������fY����O�l��N]-{�m��o�����9��Zf�n��{K��Zi�?��j����j����3,�D���Y�.�B���n����H�U�V��&�r������M[�����,�6�������q���������4�>�5w��r�?i|A#${=`��m8�������<��	.�y�M�6�������#��Mf��<�MTVkj�����&h�����Z������'8��O�������mw��[liY�?��:e���]e�����
���)�������wm��)�x��%����El��=����m��%�����8z\!�i5���W����<y��Y�%�p�#�B!D�[(#������n9��P�
�od�����������f�D���5��h-�X�N-�c�}��eo��2Z��^��m����
,X��)�����aCwN.��Bl����eG���VF-;���vx�}l�v;��������+��r�q�X�f��������o�4�j�v?�����m���3�dgd�-����������h�������}6�{[���jg��/��>����i��k[�l���[�'|I?����x��XH����;?�,���-Z)�B!*�H��6�
�O�Z{�o�]�Y$*��y�1�j=�o��3�"k���W[�I3����n��
f�r�{�����z�.�����y�Y��,��Y��gQ�;��c��1���K�������^�<P.��Bl����`S�
�Z��Z�0�����r2��O�n��v�K�#l��;Y�����������-���:���s����;����m�b�����������=�};�b;����z���VG�!D5�\��a�+���-��0�� &S��B�
:�2f�K��9�����i�!�B�n"������"�VXF���Xf������S�������q�Zd�[���,�Sg5�`����y+(���l�G�Y��j�v���p�L��E�<�����S�T�5z���q����[;��f����k����������={��2�������?B!���FOf��z�����6\p�6g�B�z�H;����[��m}A��df�����������x��^5��?�z5�j�v`��������c��|�np�5��0�{��������M��6a�47C���[�zE��B��B�z��s�����cG��e��N�i��i��B!��Wl�#�5[�>v�,���e�jmy�9#N�i3����.^d����Bm ���.,3z��l�����g�`�������z*��6�,X��
�3f��~��#��P�d���A�m;v�O?��Z���SK!��,���S��e���B��%�V�K���C;�m�r����g]��m���qK��	=���lw����6�2k[o�[�yk�3��a=u����l����&o�)�����,'3���^d����5�vl����a��UBQu)WCOnn��7��lK�Z�jY�>}�?j!�B!�3c�����c{�C�����
=k���?��V�^;�xL������B�*A���i�����([S�kO����Z=���Y���N�s�3��?�y�b�c]�wk��2��e/�v������l�����'�:=���:�������t�����>���}����)��z�]Z��=�BT]���#�B!DM'��6f�c{�C�����
=B!��@�zBYn��;��,���Z5��/�f���8�����������k[F�w����IN#����I77����sc�e���M�>��vc[������y/g
�p��7#�a�6�m�j�=���#C�B!��H�'�v�z*��6���������?��gZf��m����s�1��a��Q!���(7C�t��.��P�����
!�HD8�W!�B!D���a3g�tk��s�=�waaa�l�f��Iv�m�����k�'Ovq	!���fX����p�,�j���Bl�=B!�BQ���S�N9��y���������;�N?�tg�6l��;��,Y�6~s�s�������w��]v��N:�$�B�9Y=�
�>o�E���!�H�\�	!�BQ��u[���������#l��Q��;�8wl�Z�����ot�F��+W���c��v����[om��6!�U�ru� (	!��3�f�Y�f���a����B!���#CO���=��K���;��M�e����3,//�����r���[�n�l�-���G!D�D�!���n�!��~��~��7�Hhff�=��s���Z(�=���N=�T�U�V�
!�B!�/2�TO*���AZ�v�s�VPP���O�&M�v��N�B!�*2�!D���5z���������������/�����j_~���7�n��v���b��B!����!�5w��k�f����c2�!�B!�VC���L�q�n���Cm���v��W��w���!C���u�bW	!�B!�B!�B�dH��g��n����nGu�3�|�����sg;��#l����C9�~��g[�jU�*!�B!*��9�l�{Cm�����qM����X�B!�B��!�����\��h�.],;;����c����m����5k���6F���B!���U�ik^z�����5��K�!�B!��JZ
=�jk���[�'??�������{�aYYY���?�0�B!��"Y��0���k7�'�byJ��~���C��`���VPP�B!�B��E��~�;wn��&{��g�qg��Q������o:t��������~;���]������BQ3�i�86s��+���[�1�����96a�4�j�H����/�E��������?�
#��E�n6��^6m�,:uX�����~;��~V7�N,v!��,��<�����^���f{k����2�'Y�_�'���z���m�;��+���p��g�]����x{�1;���b{���������m���N<���Q!��zQ�C���)�W~e#��Usm����&����:��{�N��^��!��~�uF��8��3b�k��������N�:9#�����.v�)���#���,_��^���5��g}�t����������&������~�i+f��3W����f��h���m��ol���Z���������������B!S8n�W�)�8�����[o����cG�BQ��w���=1�U{z��e�����?!�3i5�@�n����.�����n��f;�����<999v�%����^k�{���B��Kf8�vj���};�����V}[�����4������u���<P/��
sd�}m�v;�����h�R�t��q���}�G�N���I.�B��.Y�Uz�#!���c=z���~��}�B��=5�u�j�O6i���rN�6� .�L��#!�H+�j�),,t������5jd����������Y�|��Y��v�ak����Z���B��L����O���a��y�,
�6�{;n;����F�{�D���rk{n�[������&9
-� �]���u��&]�
!����/{=YqA���cG6l��s�9����.���?m��z����B����5�l�������8�[!�#�j�A����k��
>�>��s��|x!������jed��sG���A�����Z�����p����e��=�,
���F"	!��f��3�f��e�?��=��#����i{�����9!����l�
�/�����I�BQ)WCOAA��)��o�?{��b7^!j:������l�v;Y�V[[8�����b�=?�-����v`��liT]�~�e�3m��i�� �&,�n
k��]!�"��e_t�<��^�zv���;c�O<a��w��{������:k��A�*!�B!�0E���dnn��=���������������`��ggg��!D�R�|��{�5+X0�B��[�C���6�,o�[?��Z��}-�Go[�������4����r���}��E�.����p�6������uv�w�oK���-�tF����)����9v����k�vt��m���������B�$������N�/��t��u���5���-�u���B$f�y�Z���������?�ll�,������n{��{=�~�.����wY�z��������D<�=���u�Y�=!�B����[d�O���#�Q"���6���klO!��G��.3��m[����w������B�t����V8�eu�e��Z�����{���O[�IS�h��r���2:u�P������e4o�AM�[(ZG�������e�n
S�"�?���,�`�EV�5���B�+�y�E�>c�%��wY�N7V���b�9OXd�h5��=Wd��f�gZ(��EBf���E�n��N3kY��[g�S�h��~v=����V��U�ZD��d��Vu��.��9a�m�V� ��5���vj���6����B��u��a�����=����>����Y��c�JO�A?5;��^�v��1�6�ll��:.�a�����v���*���z^�u1b�[����_�������}B!DU�������������i!��n���6!���d�mo9�����Y���V�d���k9j9�nV��EV��������y�e4in���_F[f�>Vk�=,���E��k�����x"������-��3����Nw��ua"y������yC�j��P�>��"k�Yd�f���Yv8��j�������}�C�f=�s�v�7�i��u�����m�b��3��8�]���5�BQ=���k��f^x��p�
�U���>k��������[�xq,�B!�Bl@�!D� k�,�Kwg����g��uO+\�*Z�-\����kYF�f	������h���B�p�;�]Z����k��Z��Yf��������/�7k=v��[�f�nf��,+���E�L���QY92z�9Y��F�c*���Er�m�_!�5�/���n��F7���O�c�=�V�Z�\\o����K/9CP9z�B!�Bl��#������p�[���n���m����yv�DV����#-��.f�Y�e[���������7�jb�V'��t�����W�-�d�����kl�Q�B��Gg��-1[;�B���P��,��K��{i��������e�w��/��B!��Q�����?o����w���;���o?w�N�:v��g�;�`o����Y��B!�B��GQ#pF�7_��6���n{[�N5lh�u��`���Yc�sfZ�n]>���-T��et���3:wu��B
�����Z����o�EoY��7,���9�j�[an��3�E��i��}-����5��[�A���oX�g�f�!�5��+W�w�}gGq�
8p��x���}{�k��l��)�z���!�B!�H��'//��x�	���/cG��r��~����-����z�~[���Y������5/<e���,#�2;ws�yr���j�<�B�j����[�������Md�;V��5�<�B���4�ig�n�ErXd��f�k��[D�n����E���Z(�^4�v����H�������9.n!�C�~��/!*���B����ZQ�#���" �B!�BI���Qi�=���7.vD!*������)g:�mY�zYf��n��r:��w����lm�?�2��4���Z��c������@F���n�:u������np���=+�p�N��B
DC��p��V��}j���jw�P���p���p���h�V'X���nVa#s��P����[m��B�
!�k��/!*�z��Y�N�l���n�N<�/�O>���!�B!�Bx2��t��w��O>i]�tq�p9 �H��uK��	o���m��f-�4�������������d��-��
;������o������W��.
�YvF����I�'���Vu�Y�����E�Y������[O���Fr�fOf�^����Q,��e�:��A�#���c�e��P��j��n�,�����������������C9kf�����v�P�}6���&vkG���?B!�������y���|��8b���-��������_�������C��N�~�Q=�g�N.����:�[8&���V`��X��a��Y������WN��p�fV��#b{f��n��*=��,���{������a�wY�f{���klO�3r�H�n��b{OFF��uz&N�hs���1c���Q��[�n6x�`g�����Z=���BTE"s�0[?7�W~�C6J�]�����z�BT3�j���������?���|����?�������d�k���Sn���`���b��j������8=��������4�����Y����i�m]����v��8������Ox�V����
�[��V/�N,vQ���7�����E�-�c�:�6����B�b3t2�n0�p�n�h�ZQI5#��Y��I!�H���{��<���V
����k\7l3�Wl�����%��2l�}�!l��a�jB�u�kZ/dKVEl��<7�����i��BV0}��~�y�N�C�����6��uxrrr��w������~��77�g��I�K�i��f��r�f�!�����#��CZ]��[���FCi�������������O�������	�."kV������C�:+P0{��f��������"�n[�������m���Y���.�'�������6�Q����������m?�����Y����YdsV��
��1�p��_O�_�L�;�����5�hcM�I�f�s~tF��K�����b1!����p��v������A�eY��![�&b#�X��a�/���"�&���Sh��G��m3��h�����-,�H�������eV+S3!D��Y�fv�����w�i���?���n��N>�d������-4�W!�B�)i5�@��m�b���{;n;v����]�b�,`�Y����?n��~��Y~�;�����|�Ukg�)�>�
~�n�#>����Bf�>z�"��.\���.���~��(ovm���l��x~Y2��j����]e�P��j`�3kY��F�*z,� ���nlY�Lk[����_k3V����|��U_������|�\���M��I!�����6�k�L7+��i���V��n�N�!���u�����a
G�7�rF�&���./�f���Sh������$���,��f�����ox��p�QG9���^�6>'�p���p�w��+bW	!�B!D�
=�`D�W\Q�F��"[F�N����8?w�"kVY��)�s�aV���-T����Y���r<����h�~7+,���r���B99n]�tP+���_���Lz��7�`Zo�@���_w}��!��O�
������N;���n��5�l��y���~���n��I�m��Io�}����S,!��<����i����jb���e��k���;�6�������X~a�����f�k��E����g�������������i����Z�jY�:u��;7>�������P�2�������������.��C�ZnlU�Da?��c��Kn`U*�c c
$g�����l��	X3c���3���~<?���]{���p���!�B!*��z233�C���kW�!?�c����-[Zvv�;�FX!�BV�e���ev�-�~o�"Q�/�~����
�p�"�h��BQez��w��;Y�no��l+�3����j�v��M�//�]bC&�gm���;�f
��Y���n-f���[�f�p��<�Mw�\�5��e����u�l�
+�Xf(�jed�b��%��������&�i�M��^Ma{i����/Cd�Blv��Q`_N���3��g�i� d��Zn~��D�b�a]���}\��Z�y�"�v}���^���{��<����^�>���aG�Q��]��X���x�	gP���+����x��'��|�I�_��3�TU
�r�K/��� �}��s���w��7����@��2l���a1`}�������^|�E�?����k����z��
�2e�[K��W^q"�6?��������[���!_�ti,��4`���N+�B!De�vi���s���;!�Q��$@��7B�I�^=��������~���=��M�[����|f�N����E�-����l�g�,k������;�>����7��x�=���v���mm�:����=��P���g,
Y����b�oM������^=�vl��m���s������__u�����~��`�}9�G��$#�SaM���[2�^��^��BT0��=j������������y�}���$b|�k����;gX��a��]���M�=�I�����c��?������C���V
��H�z+\�<v'!*figee9C��������S��������3����l���
�I��cF����/g��/������N���s7	����]w�5o��n��v7��8R�����r���w���������K����������^{��=�X�������N���z��=������/�����/��a��Q!�B!*��zPZ��{�=k�������&M��Fz1u�����>� Z���Y:9���~;�<V���=���������Z����Y�g��-���l�3�Y��I����]�Py��a;c�cl����s�v��A[g�9���k�~��qW;�� �P���iw���.��Q';�����I7kQ���������������J��9�^�.��#���^4>�K!�?dv��a����.-B��Y��4��2����k����;���S7����2m�n��u���1�z�	�!�fE�g�Q�����������L��	�,o��;	Q��N����f�`�`M��O?��K�]��v�GTio���B:>�`����
8�N;�47�#���/��#Fl��G�g�}���Y�f��'&{=3p�eD~���N;���R�=:��c�!g���.,��L�]v����0`����F��{������nB!��*�VC#�����xFX1�g��A�\�������������!C��~!*�p�V0��]m����2;vv��"Q�n�����!/XF�Nn��j~�������[�'����B���`�����#��k��4sF�#�������o��eD��2z|P�=��h����h9�\[5�aGv����:Q=a�����!��\� �g�Lg����sB�k��������tl�����A��l���h��E���8!o�(��U���q���������������{$�0PT��M{��iw�u�r�!��������>�'iX�CP0���w�QT]���Mo��{G��HQPlX����g�.����*�
��& ���[ $�@Bz�m�9gg!@�'$	y��ef���l���s����������Q�-���/-Z�6m����'e�.�����_�M=n�[��k��/��p�B�X�B�y��,���N�Q��Yj&�,5����,**:t���}�j�Off�'
[t��][��wAA�	n�a�.�-2
AM[�}�#�~#�x�v������#���~�����a�]�[��!
�;���N�f@R� ����jT�^			\R�M� H�1�.�Z�l�;��S��4�uZ��'T�TI����t�����k�j��z�O�7�,��)Ha�����y�,�x�O�I����\�z��|�JII���&��+�[Y'I�nL""""��9�{?��V���V����=�e������a��vx2�����m�����g�~����L�����Cui�	;gk�������������s�%
����,Z)Y;-R)��$^n��3��E2qB��z(@#�a}.C��}`�X�w��=
�r>���V�;AM��q���A�a@B�-sa�������������j�����p �i��E.]�a�'v�}��]|=��m��^������s�7k��������+�h����7�l��S�&)���g�!;;[�����~���{O������'��_��{L����G���$R�A������cE	�HPH2qdLY���/?K���X��������#22�2�5j��������3f�<��z|��Y���u{$0GDDDD�3i�lO��u���a����^��kj��EK����F~�R�a����Q	9�\��6
I��1f�4]��bXy����]��g)���X{`6�n���
�������-���	%3�f������&��J�����%����7��������'����&��}����_k?i�~�)����G��R
@i�k��(�\��x�Z���R�n���:�)+�\�n�`�Bf��������4��������7�����.���f9���1K]z.�.�)^L\�Fl�+�|�Y�{�
7r���|�
SW��%��%�<��R��
	
L1���0������	�.$����)��-����_<���d
�ysf�u����������|�����lZA�R�Z�_K�k;�Z3�l��N2`�r�|�2�o�������|�G�	�r��\�Ka�/��y$h�������#�c��������@��!Cp���jv�<�1��
/��d�����5�;Tm�=Y{qA�s0���V+����5�gl�:�1���������b��L����o~�%,�xDP8���!��}����Cb�>�K\�H����f���]p	ZH}�w�y�_=���*�%3�d��t�R����:h���fN'�9��&L�z�
4��DeANY���g�9T@Wo��&N��7�����&�u�������'AY�h��]h���~��e��r������BJ�����:;M�+������BO���T�F\���x0��P��h� ��Mn]t9v���9��m>��D�p�G�����B0q�"|�$ �0�������I�������}����	1�y��8'1�k�����yh^��=�^
���3K�����.�x^0~[������x��<��n���Z���?��T}��
�����^������	@�s���� �,��^c��}{����ZTK����""��I}�6�7-C"�isT�j���g=��^�����R������vQ�t���G����p�}�Y{��D���dL"%�$� �0��OG������Oc����:u�f��t2fJNN����9st�'�*� 'AY�G��_~T���k50$k�H9�����D���g�w��W^yE������������?�h=���$�&����Y?���?�%�d�6o�<�Z$cI�L'j���������+����+>9�o���o�����xf���]�>h�E����������������H�����=���L���0yL��Jf��q9�?���	6"���7IY��a,�Wi�K�����������4��<�7x�P8=.<��^tf`���qi���m:w�B�������\=�����e|gh���g���9��$�D�Q��|J
)'��~�d4�#$�!�$�E�5�/��LK]c`Do���u��#��o��V
HI:���\��q�4�G�%�s�=�WjL���:�k���,A	lIPF��M�jd0w�\
�����3|�p�/������R�A��s����7�@����ep!?�3������\�����h��������]U����[=��{0��j�#�"U��O.:5t�I�F}���qy�l���Zq�J����zg�az���z��~y���c�o������}��O�:1��`�:���W�iF�����R�w����Z�-����M�g}��+7�#�����<[���o���*��;r�����D4��������:�@���@���@�L.����V����C.��"
r�?^@��#����(����,Y�A�Tw�u���6�!���d<$!��&c&�MJ����l���|~	���l�2
��M&(D��;��=z���R���g���a�t"��~��7]�'������M���DDg��� ����+>Q�a_�Wu{G����+�.n��>���=�3�k���T�::�#K����r����R��������c��}��������'�jx%\��'bB|��;fa��-x���Z��������q�=y�xa����<o��������yg�whR��m�G���������m����A����v�~�r�}�����<U�T��NN�=b���:�L>����_�s�O}?�$����/�o���������o��}��M�61b�F�������\�fM�'��u'����[�V-���2h|���-��j�*�5&ed�!�(F��������{��$#JbO>��;������yx��/���_yhX��o�K.)�uSW�g�����!&��O�8Q��
}�#4������\�����\�U
��+k�����T���
����7����yh��^#i�9���+Gl�2�������b�6�JVG����*�'�-��?����6����-��.��s�����{3�_��i��[n�.�sA�7��k�1����RxQO
D��W�������c�S�([Dc�;/�-�73��"�S���;������k A�	:�z0�%"e�
��k	��xD%�+���,i�����X]��Z�j�Q	`����Z�Z$4���L�����Vd2���`���dN�|�I�L�����
�

2�O��t�M���d���?h���_t+Ayd�'k���#A'���<Q2�$":������U�^��T����`����x`���]����*���o���$#G�;t��H4�4y�[l���B�{���H_jv�{����H���V�I���5�2G��k������C�:�J��$��`����V��������G8�-�W4���8�~J�/H��[�=����;������w��cj����qI��f���)[1/a�f�L��u�k ���g:��1YNE*��$�U�5 OI�G�On�����/���S���@���$In�e��_jj*z���u��,������f�H�~�(�7�|���i��i�o��V�6�B��'?�k��F&�Yj2������K6���$�f�����`����@���nL^������"o�_n0~����B5����<4�j��
Y�e�z7�i���b��+a$�#{���\�V?^'�[��a���"[k)/[��d���f���0��7���o�V�w<s-��>3�;�3�
#�G�H���L��?�+s7��o�8�x����k�����D/��3[�/^��m��2�����S�kG�z����������]w�n��������g�����a���Nw�G���v�f��xB*"H&�_��.�@�'(��	8������O>�JRM�U���R�@�������Cu����O�SK K�L2T�e�1#4}��>''z��8���L��j
g�}��/�$�J�?2&+�z��W�L ����#�� \�?	�HI=��G	��0�"�3�g�90�WX{�'�F~�{hQ���GTvx~��4���ad�6�����/�w���E�[D3��]g�a�����`dm1o�6��v4ZF�&x�\[�+�����a+g���0z�T|��t���Ccds������EI��l�{�<l��%�$�����P=�2��Y�^w������Z��BX�f�S��D������n�/���#P.$
�B��D���/��T�i��m�H�?Y�F��|�k�]�_��t�'^f}�� �GH��L�.�Y$8#_w����IE���|�[����&9W���u}o�����d�p��M��I�\� ?�q&}�n�z(#��9��}�i@'-hR��*�6��
]�%+�@�A��6������8�<�K����#��]��|��4����N�
�����^�j�
{�G�c�!U��K4�����Oi���/D��B�
2
8����f�=��4�)������:�s 4�	�a_�/�}���S�������E
��SL�&=���E2>�2�2���7��*\����9#�)3!���2AM�>�}���g�b�

�Hu�H)l�x��s���q���L��5\eb�T8h��-.��p`r��u���N�|�\(A&	��:�Z�h����

R��~�cgo�U�@�Q&����s��:&�L"yNd2�����`""""*-l�`�u�u�]4��a�d��8F�&9;��F^�u����-�lz��!y�0�f�Ds{b��Y������-��e���YU�r����.� �����^�ahP�6nlv��������k��i�������74���|������q�z�Y
}�������v���d��@E����Ce�TAM2%5m]�wd&�t��^	R�Oj���'3�$[I�7B�I�*h1%)�&�.�V�QU�t�|$�$���V���*��6�:
��iP��Z�j�-j9�|�w��~.u+�1~�[����y��L'F�����9q-�	l��7��|�����[w����=$%��$H���������u#
Y����;N����@����P��X���2�_rV����q���A�c>����u��B�m�^��N
�e1��Fn.\k���������g��"e�_}�U+�8@&�Iv�o�qD���H*H�j+I�E�_d�'��>��s����P ���X��M��W_i_9G*)HY����H9m��������C�����^�|=����#k�H�O�rn~�9e�T	�IYn?YwU��}���Z�m���:�=z�Qia��K3p�[�s�"����[dS��Z�80��?�3L�(��^[Ls�p��Z������H�g�H��+���jk�����v]���YE3w��������hS��8�F{�`���qo
��x]������Z�M����������:z�
h�6�����_� E���x�/��'��)�,��Dfg� @J#��1)�&�92#M����_��N~��/��<_y�tHy7YTf�I�O~����t�����2#����]�x$�T��VX�r���[�h_���0_�w�F7R���UmhYK���Z��c��AK������Mn
�I0�G� ��X+j�L�2�R�������G�a�����w������a�~=l�n��6}L�������w�C0�����k�8�[�{���K�G\V"��.�'=�5�*�nD�Z��h�s��h����e�_�C�1ir,���H?��������;���c��q�{]����F���u�(����'��n��gL��W��bZ���-"�3��A8�e7_����?��Pu��v�����G`l�eb�,[�&p����D�(������"��G��%=/zS�������������������.���d��3�W����gp"�?��L�[�r��W*����:��������z�j,^�X'����ed�T�����]��j}�������B�#,X�@����P�h�.RA�<b��=Z���+�<&[G�)�&�S���=tte"������J/��c�`�+vY_�	��+5��V�&x7�F�V8�M����5������H-��e�f�z=F�"xw�����c�Lf��B|K]��`���#�������K/�T(2{Jn�����d#��G���N;w��|�i�2�����B���7��+���?�����w��x������!C4���I��zdp$����Y���:�?R�4e�`U[23/@��f~~���+��� r
	��zG2+
	H�l=�}��1rw���
��<{�[�Y����y#bd�1_�������b^���2�<��W�-k--���������")���
��Q9�<�Vh���RR�t�z�����)��9����!��|�`]�I����<���?'o4H����n��r����,���@�y=u�\�hTK{C��"��o�����)a<fX��E1�M��."��fQ|y����\[�=a��G�qa�TT�8|T����k��wr�u�#��Y{@�������q-�����;����m��vQ�Y�
�����+]����R���$z�^F*
��1��9�T
�J�V�L@#""*i�!*�w
��O5#���B�5�UW�V�/�u��g�3��%��6_V���@��2F�F�k���ly����V����bO��`����d�[Lg�jt��IJJ����>��JJ�q��0	���3w�u���~-��'����{ky�1��,�*���
�e	d�O�=�|�����#�K��U&��J0g���5k�e�d0'%��jY$�Dg3���hI��D����pe~�W�@���Y��E��]o�~����W���6����~��f�|�#2z\)�n~�|aL�-��yc����/jw���}q�7���X�^S^���`��i*��`�H���O|�a��9�C�bP�G��ei��HXH�RfkJ�G���<��c��wF�]�q���� �(�+�O�a��
����k�������vh���J(�
fZ��p����/6��)	�t�(&����"":3lJ���Y�H���}8��g����o�/?	l�j������4��*��mm����7#��{��5c�X��.�G����5���J���r\�T=���������M�	�rd�G���QDDD%
=D��7y,��-�l������������F�o����_��l�98����uY�'��M���=�W�|Wx����f|�����[��^�N^@=��	|H3y���[�j��k�`�c�=�;��C�L���i�u���"���
���/h@F�\�h��$���K.�zA�J���d=M�:U�$��~�E=[�nm��.�)����k����z��
��}�������M;h=1�r���"�A
�XG�������&/|��ef[b�:����*��yH5��/tua����T�FxSf������B����]3_���qV���q����f���H�����m����z�������=C�?��vQ8:/�j�o/�c�M���Xz�����a�<'��[�I,Ucl�p�y_�������(��6G���[{����E�W��;���R�Nw�G&��$�_�U� 2�K���`2qL�	o��6����C��DDD%	=D����i�o��H@F�p�O�	�Rb�V����O�A]�G��>��1Y�GJ���a��6/Y�\�w��L�$�k!(�e���O�8	��p�M7a��IZ3��Yi%��I����l~���q������#5�e�%��I�md��
�1�-����U�'�$)���N�lK���?+��I����x�� ����=����r��+��O�
�A!/Z���^�q�j�	�H�=�����|,_�GD6�������E�<�@nv�����8�S��������?���N^r�!��J����R9@����;w��%�e���n���f1�_���������=N�6��i9��������^g�u�
[�^��<B@���y�w�^
�,oQ�!}��h����������A�bR��)%���ojf�4	���+V��+��r���M��sO'	���������d}�)S���?�8��d������nOBB
��	���������<��kM�6����c�b������n��������k�Mt�y��k��Z�Mf.[��������M���s�^im������re��=�{a�DDDg��������PI$=��������)�)��v�Z�0&��t�������DDDDDD~����D����I6�d�,]�C�=�1�sN�`EMR�Z���ur$�"��M���LH�E��`�k���m���ZfA���o���C=�6	$����x���t!��j96?��-��5j�/��RK�}���z
��W�~}�'�O�^k���5���(�Le""�3UX0C4t����d���2?��g�
I�hY�g��-�v'�_���#���Z4������+��B���J1b�~<�:u�����>T>M\�������t������;����������ERnA���u~$s(?Yd^�	�rm��������g�}(xD''�_7 /��;I���2q��S�X�?��FQ�6x�b��F��90���=t��^�G�vn��f-����_�F�Z5��+���Q�t�NY�T�[���+p�ADDt�q�"���X=D%Yr������2c��U��FN`1�CDT�1�S4�?�o�;�#���sn��6-}�����.�L�>R�YJ@�z�2A�tN�#"":z��N�b-�v4)�&����������86l��r��^�����DDDDD���/y�GIf�d�<���Z���/���n�b��������hF��C���k�2)I&������k�H93Y����.�]w�uLI3��
���������"���=E����V2zDff&v����M�j�fY�g�����}���Rhh������daF�������Vd������@���8�zT��������N����u�V��v�����o�&�R�@,�V�u�]���>�3f���@e�������9����/�HgyNz����wF~w����J��i�����9###u=�'�x�^z)�<DDDDt�� �wk���c1|����
��u����	�����zBBB�v���C����Zo����&����*�t�������'��>�j��/��rL��=�6�1d�?����]'�~����]8��7�K;y��������xM~g�wG~�����J�������x���u�TP{��w���n�ADDDDTzIPf����r=�1�����1��cgz�u��h�G*c��A�^���kW.c!������Ovv6�:�,���j�*-Y@e���^�<��ik�X���e�O������.�\�7�K;y��������xM~g�wG~��w�������R�#G���o��e��������i�-�����"""""*�b�7X[�'���M�;���#�������$�G��M�����G��r��!77W��K����t�o����{�=�;
F��oy	��:��G�Cy.O����QI'��
�
*�����o���_����SO!::�:�����(�C��,���B4xs��82y
��.���������Z����c5KGf��I�g��
�0aZ�h�}%�g��%�V����CeWqda����L�c�o�n{����x�f�o�H[h]�
R�!3z����4������Z���D�~���o�cZ�=�N��o)�_�����Y���%�'YW�@h�'""��v������H{��w���+���;v��[n�����!C0}�t]dT����=6��<���}o�8��-�_�H^�6�����a��YW���sX�KDDDD�&c�:u�hu��������N��8}�R����1~���w����#m��	��4�#.��b������#�Y<T���~����>}� //+V�� ��7���� �
T��������M�^!y�`����:�:@�PZ~���
�����{�b�������1��o��5��������z0m�||�f�_��U��e$�������_��1�ED%�Lt���;�x�b���_����yzt�oQ �{�f��/������_�=*n�H��;��d�H���?����s�����<���]w��_|M�4��&*�2VZE���� "":L;v�������/�<������)����",�W�ik�nL2�������q����R�aAb,"�#��:��?�<�vi��]����7�|/������n|��|������H���F:'J�zdf��0��2��K��f�����o�#�<���[o�c����@O����\Q�a��t+��,FFDDe����bh9���v����cx4���`���8���t�cRv2r=N���r�W�=v�����6��������A�=�*4��Q��v�1q�D]�G�.����st;x� 3z����(���_��`mPq+�@��,�����K���F����OT&�8������A��]��R�C�	�lJ����5547a����a��
��������h[�����|=t��a�P,J����yz"*yd<4b��j�
o���V?(�=��cZ5�����(`�~����JA��X=.���/�&����g��'"""����Y��W�sqg����B#�KX�g�ySg�`O��rpz\Z��c����E�a�=�F{������42JII�5K��;�y����F�q=S""""*��+XT��5����zJ�l��_���l��DDDDt|�����t��������upz]����S�V���tgf�^�M���5�zX���D��P��-�����c%"""""��k�',,\p�6�������j��DDDDt|R��{�N�����mi�qa�.�]K9?�����D�������{Fn��o������pN���+QI#��k��K�.�W_}�U��[wL��y3�!��5�S�m�����S�b��q�i��!7���\h4.op�yD�:��g�����������S���'*8�"�����Q.$}�vC�j����f_)�FD%Sff&��Y���������k���W_}��6x�`�KDDDDD��@�Td�RP�6���Ot�Q"""":�l.��]�����1��q������C>�.��w��noq�~���s]�����F��\"*��\�L~�j={�Ddd���SP#"""""�/������C�b���h��=���_`���/���������������h<���f��o�G��4�#Y:R��W�^x�����{�1]|�������,�L����E�����z�����(��z��@vv6�;�<T�^�:JDDDDDDDDDDDD�!�����Yg�7o�z�DDDD%��r��a-r'�#������LC����e��+�q;�=��C��Iofr&�A����3�7x����@DDDDTv�b:A�="":U�5��r��e��_�^��;��K��3�|�
V�Xq���M��s����N���p.Y����z�y�L��������< e�l�K����y�����|��������^������,�����7���#DDt*k�'33�|�	^{�5m���:-Z���8���{��,�s�\""���p�w�_����}�2����x���k���qo�����}#/����|�<6H�a�j_
��`5j
��[��-'��T���a6;�����n}D�x"n�aW^���]{���~�q�]n�����U�����J#'�K�;c�Nj�cyy��:Y?A�������{�vd�����$(���� o�,=&�I�������p�Za�m�j[�{`��d "�S!���DXX.��t��
����Q""�3�;F�P����� �88���t�����;�&�~x�����	�f���	F
3CN��s�#�}'��C�#0��z^w��c�=������M9`=j>]��`�.G��=�'la�:�umX��v�Q����sf��b1�fN1of}���%p.[$k�G������O�������.���w�vxv�D�����Nx��;�o���� ��vP�I��s�bn�y�\����U���T(�@�����O���_M��s���J��J���bn����o����c�`/w�uw:l�`�kl����*���^��������A��-<�W
@�Mw"��;u��IN����,8�/F�9]a9�/���^���KLL��30a�����3��)�[X���0���9,Y���:k�zH�s��1�-�������Y�6�
���pmX[D����z��m��c�sl��0������{ �wy@���y�LDD�S���04��E�h���	�&M� 88��5�����RJ���J���k���������'[T[�*]l�Qs���Ox�~�a����@husP�
�����>[��AS3�����|7�*t�y���������Z5^'\kV����@�$�+d�c�9��l�<s`�[#":Y,8n�k<x0�^��K&#�����[��c����\����d��u��O�^��Xd�6���
��v=�>y���5�cX�+"�}g�$��n}x�&!��9�%{�o�}�^����X=���2d��={�XGO�xv���������^����4�U���/���e�+\���l!U`���u| W
��
�@���9�U�����U�T�{g�2d���lm���QUsY�[0�g�g~}k�x3��3�/��Op��Ep�60��z[u���dlL�^�&�Q� Y:2����v��i��~���.��B��&"����#�K���1?���5��O2t$[�d��uH��O�H�'��+~����p����;m"r'���4���[��Vo""
�b}G"�|��\�2&O��7�xCg�Ii�}���]�,W9&�I�?�Pg�M�4	����k�>����Q�n�C =��
@�X��i1���:�/���9�{�[���G�(��e�c/�"}�c%���2���=��/�F��4�:���i?��"5nf�=p����^��� ���75n.�����-\�s�\"*�222�h�"\v�e:.:^{���m�EDDT8!g���g����g_�f��K��������[��1�k�Z��T�')Fn.���a��r�����fmx�kIv�s�x�&���]����N�b
�DDD������w����1c�hy�A�i{��7����j�m�q��7N�������r-""�R�0���������m��u&�ax���_��|�l��T�#�+_���]��}`�
x2��Q �,��
��@6�]'-�q�]n�N��"#���~��GE#���y�}��F8�V�)~�����u�����o��B59G��kQ�f����u���Q�R%�'""*nrk�){x8�4Fh������8��������d����ts�m����a��i�{�_��yrm�c{�J9�|�}���3?j������N�b=H�GJ
HF��6���+�����x$sG�l���[�n��������,E@DD�JHu�j�8�}Y��B�/lU�2�E��������{�Ga�h
�?��7�}����2K.����"?�]������-I^��a��y0c�/sxO��?�0b��6y�1�K����_�c�/ra��c�Q���1�2����s�6�AD%�d����.���{����Tn�����?>4�o���:.<������K�������*B�0���F���?4���o����GKHH��_�}���m����������b!"*�$ ���f����k�5||Y��
���i���rl�(s\c�r�f��<rAA�W�������t����W��	n{�f�����KDD��xMRn <<-Z�@���q�Yg�u��h��-:u��s�9\p���J0���G��-�"�h��x3��n�v�F&w�Xx���N��Re���o���=;Y['���������T��>C���[�NhQ���Wz
�+�M�������<��{PT!�vC�� �������]�Z��7�5t{n�r][���k=���@�E��e�}$[�V�\����3>A1�A�i� [��� �,RZ�_?3���!�m���g���aC3���_B�a�V8�����yF/qaO�9P��@�����e`�"'�BmH8h�}
���@����h�����f��,�i���.�xP4g��A�,_�;v��N=������k)�5k�`��M�X�x�MM�4)����N'F��/��K�,����
���zd�(���������~[?�:��=�y��i�������~���������'�|���p8c�l��U�U�RE�eee��������t���������	��=�u�w���/g5
"*�$�=�ac_��E�%{]2����|51�*f{���XH��f�&Z��f�#�N==&�I���+VF�Y���y���0��/�'?a)�@����Q%����������=��&�}�{`~����@(�c�����������?�g�yF�l�1���=�n��S��U��G$;�3uB�m�I�1�6�����p{�`�����`�.�Cl��{0�w
��}�[Z(r�������$�@HZZ���K���[��!�oC��`DI�m�6���`�Tx�2����*.��R�������_e��z����{�n<�����g��s������'��|	�I�z����W^��w�q��+�=���~~��'��(=21Q�������M�����K��Q>��a�������Zk$"�@c�g"""*��T��o� D�9�{c��)^�������kH�	s��y $��}��g�e��P���G���]z=Bc������������l�o��V�R�Z�>��1���nCd�5�J�e��i���z�
7hu��={��_D�f����"#����4���;���7��}����(�KL�/'z�~F��?c	]|������C���Q�Fa���7>>^�.��"�/_�z���������������#"���	C�������<�(=DDDT�d�����N
�����P��c��0j�	�^�����%�<�0Rf����L�Zrw�������F��0��v3���k�o`��O�a����9�-��\H��ED%��8������d����K��!�o��{o��4h�@�:�_vMJ���YS��rss���E�
L��uB��R��k������A��9����������_XX���������O���k���rm����l��%�����H�#{��GDD�
=DDD%�����7K���������>y��o|��-��NE|���w/L�����d��%�<��������O1�p��wF��6$�p{4�a�@�d�d�?����<��e�������F���Ky�j�.x�|��ad�{N3����x~<����������R��z����F������:�D%_pp��`�-��H<D�Z��#>��#�IF�����-[t_�&�OY�+W�����[��0��z<{������^V���R�k�����_����gk�9s����#�k
:T��d�""""����""�$!k&��������e�Q��y�m�ur=�2���{���cWF��Y{1r�$L4�u&
z�p�a���^�p���m�
��\�
��iu;��u �e`�'�-w�^e�f�7���l�]�&����| 8_��p���W�a����L^"�����y��������v-�Ja�u���\�������#A��@&R�n��]���k�{�g�T�PA�r��@�OMM�2j)���-%%�$�s4�Z$�$�FB����x�G��u~~��7�t�Mz\J�Ii:Y�'*���DDDDTr���MTb����X��w�f<\�"��������}���6G���;&��`k���k�{��u{C�6�6�9�.����G�F[{��Eo}������K|�y�������|�����w�x7>��E���������o1v�t�.����imQi�;3	��������r�����Z�v��,�}9)���gQ.$[�va����+3����j�������z�5�����n�[W(�l����������8�S��^������m�?�	�m�@��v�g��������nO�F4���.y{�Ys��>�-��/Sg��@hM)3a�ql�o4���7�k�������M���v��G�E��g��@p8Z��]�xc��X���������{�o��^�?(�3�� P���;�w�}���'������<x��k��-��c_�$�G�%� Y0?��^�u������.�������.�L�L�0������o���E��F����
s�du�����
�{��K��������#4l��C�dM	�HpH��L�|U�V��o��A+YH��z��i�N�F�!�FDDg������>�2AQ9+���:�����xl�;�]�>�����o��r_(�[��|����������v�����>r��5��\#�Z��"9&�J_��9��n'OD[d6=�c��[[����7�������O�5e�QQk�G.%3�
;�L~���9�2�]|#�h�9��*���:��v
��g&��u���1v��s�Ss�����Q9�'����zk�g����m�Un���������5���i��d���lrsU�zGz�}��o,����w�}��������b���?6G$���`o���Z��y3e^;��y�_@%s���C�L��W��)[�ORx���T�����o�����7��n���>}�1��J"���Rg�����3h��Ck��W�F�u�U�Va���~��9_��/�#���v��~��i@�x����^{
?���~=/���>g���q#n��
.I��a�k����Qw�
u����Oz���[����m�o�F�����@��#���.r_!����&����d,�v��9.�@�������}w9.M��yGz�\9&� yo_����#|�W��p������*�����V�lm�;k]�*��R�Rv�����(�@OFF���<x�:rb��/�x��3����7r��������*���u������y5:��?h�g]�V��_�Z��w�}����Tj�o�����!����@��y���+v)�����u��'�G�&�|.����U���h���`��`��F�O�����r]a��[�������/au4����d[�%���o�u�^^��1k0=G���tz$p��/���c);IP��g�HpE~���@���?�6m�zcA���2n���Z��b���-e\)A)�v�c~�9_2�5�u�]����^>R��G�x����y�O2{���^�l�R�='N���>���$H2��L��I�&�6������LSn�%����x�j���[����r�vq���shS��#:�$�#�	�H6��>J�3e~��="���&��c�#��IG�q�'��7�g g��h�IFOZ����o�C�V�z��M�[�|k���5&�E�zRRR��_�X�
���s�D��T������%K4�(7�_}�U�7�T6����a��0z��������>F��-b��=Kp}�K��9�t��
�v���*7����];�������V�����[znpN����Y���YO��Zu�����l1���7�7a������[t_�'s�3���0����{���&��7�x`k0�����k>�\�5���z��`��H�?����@��rss����K)}&AY�������O>���[���0��������1o�<�h��z��w/.��"
�H�K��8Za��5�.��B����w��,�N��e����{��)��#��������3p�@���&��Y�fi��rk���uQ��Yz���^�	��QA�_�ZTld��R�m�V��v �k�"������Y��M��7�+!���@����p�!o�9�����z~O�"��kl�s�\�#B��
Ob<��T�B:�g^�D2���w��0����� �}�{`~�G]km��8�)�������O��7�8�$E^�;R�Xf?����O<����7o^�����n��G���C�+��lW�f�4)_��,�
7r�������9���xQg2�����>���<��7	9c���a19�`�~�y�\
����S�7~�����7>��U����0�Wx���z��yP�<B2���2yN������g#M�����N�h���k
��|��x���	��M*Y6��3g�o��e�����{7�?���<�0���F��w��Y�e��dR��3��v��YG�������UW]u����&G��-hV-Qq�[��E��;��C�O#+����d0���1�>�\�V���_x�"o�������K��]�;�l����u�"w�d��ku�y�,�����JJZ��T�����
l�����Kk���.~y��g�
����?&7�RY�-X`��ZieDDD����F�Px�>(T�s���5���T?K��E��mn��g�������Z^���]�[�]������Z���:
��=��F=~U�^z:�{����x�&�{`��g
*�AM��a��w�}���/�u�<GJ���?k�L��{�%u��EDg:�D<x0^z�%�"���TA��O}��G��$��	�H�K��m�z�j-kC��IDAT�o����@L�N�tm�Q�F��D�������aC���G���[�j�K�����������tqa��JpG�.9o��1�6��]�&�#���5t��7�xW�����};p��f�H]uiDD%�7=y�f#��_�=jx�Z���p�]e]������^ ,�:`�{�@MN�1��Re�t<[K��I`(��N���a�t:��s43H�����`+WA�Z ��o��-2ZR��\k����6db�#����=Ni�iGR�m��uZ��B�
���"""4�]��/EDDT�do�w�[�n{�����\�F~��������a�Cc4p����\Z�����}9N�T��`XoXJ���HDe������_��.�`�TBx���u�o�����4XRRI��?������\��_~�W_}��&%�d
Q�Z5��A�A��������$x�L�
6�����:R��eL*��H�G~��W�>)/��������#����
4����{�����;�����k����[=��J��Ic�5�d
�Y�������u�Zh���lVY6���]�q��-�3�/�9���8��4�i��
������jh���i����o�����-���
��:j�7	HF������R��@��x��n�)�����&i�����R����y�VDDD��w��0��1o���#'N��s�DDTv�xI�$����o��[o��;w����#��1Yc���UI��G<����������&96)��_?
��Z>�����_�e�e_�������^j)����@���#�%$�G~��i�����HR�M*P��;�K���U/����{��!%��Z��"�����9��g�v��[QIy'��%��s�u��N%{�*���ND��"���
�����6��\���������������w<��{FP��p�[��� ��;��C5;�������[dK�*������
h�G���tyY�Rf�I�����������G�	��DDD���:��:y�q
""*����m�p�e��:�G�c��L���%�L�����9^{��t2��Jd��W^yE��M�^��	��l�R����N�|!cN)��_������?z�?���l���k[G|��T��������Y"*�������b�g�2k��N%O�.]kG���A�
��	."���n���}�
j������ns�M����~�D��\kV�f��po�d^{�;���
�-��7
>�Z�,
����s�9�|������h�d�����W�G��J����"(�kQ�%�I���c��x�	""���ff�@�":u�L[�?S���/���O��k�P���r��1�W�	{��j��]{�0-��3�7=��m�[X��B�_$o������j���6_�J��z����t��zH�srr�����?�)��X#""*-g��u���DDTzIi��m�b��qX�f���d[��c����d�����&e����-"Rw�7C�������N���#=
���}�w�!��E�6�-$a}/�=*F�=�;����G�x��+ �M;�#����PD0�:1�p�kR��@��6k��9^|�EMk������3�<������J5G1��V�(�gX����;N����`O��7L��J���p�r�-�����r��V@�&�rL�>�������
����(_�X���k�D��("n�A
�h&N��7�Q������X�Y4�#5j!��{����W����G7����+Y�`�
���TR<�#�������t{��-�^��;��"�DDD��-���u���g�-I^�X����.��p���N��Y�Eg��I�Z?�����w�N�{���������Q@9�`������p)�@ORR>��s���;��y�n_|�E�]P����N?�����q�����`��okv{0u�C�u�`3{�����p������kP�����&�r����GX���.��������2�;���W�u�J��z$Kg��Qx��74kG%Rf���E�����R���R���u�^l������J���l|��7X�p!z�����?��Cm�-�BBB��DDDDD�c�/1�Rk�J��z$Kg��8���4�#���������":�W_�����	���@;�a��.z6Nr:3z��d�����q��z�j���	h�'77���C�����K�/_111����(���d� ""�����(^�3�������	����a����v�XW93�������;F�lI#�6��[�x {�u"*k��A��-�m�6]��8�WDDDDDtFhtE����YSg�y�,�BDD�����M��5
Fv�2�2�;s
rF�D��q�������oG4��U�_�wl�k���}[Ds�X���������5���U��x[�+�];
c�������F���	#�x���������wad��.FDe���@��U��_i%����~��_�4�#��n��&��33g����uPrt�z���FDD��\��s���023|���7�x�&"o�B�������/����3a<����!��)#g�y
g��9"�cq�m&����i��7��	���d�&o�O�`c�6�jt�+������`��2[������&���[�jDT�H���k���tb��!x��������$�����FDDDt&�����aE�z����.��u*~�<3w/D��7��j��������qZG}R��1�W'd����������1����)�����&��B�}��1������
Q �9p����yy�{9�x�]{��i��4G��Oj���5o������s�2_�(,\�}l���3+~��ur��20?q��G��q`2W��wr����-":��\.,Z�;w�����\��x������O��w�}Z������L�����;����5�#�\9:	r��������[����vf�^���������y��B�a������Y{5��!u��>�,,����0���@�d�L�6
U�TAzz�..���&N����Rh��rNW��C�#��z#�mx���M�GH�����z��x��7��j5x���k�R�v�	[H�������v����Tk���M���T1�����g�%Z[Dt&����?��V�J����=����[�����{��""":�8=.���^L-x�=�1<�Y��������������0��$P��|}},���,���B�u�e^?���a��ub^�rlI����r#tfh�G �>�(^z���l���"":l�aZ�-����	9����MM�{�*��{�y�E��9p��G�FV[Tk��w��Jy��N-�Q�"���mK�.��u�4�������+VX���X������Du�k��&��fdU��[�_��wb����9��\m�Q ���]��U[��L)���b#T	������o[���G���C����8<���z��]����D���Ej������T������p\~��Z��O�>�W�*W��M���<&}�/��&e��fM��������=�����������U��}��>I�z�����=��7Kj��h�BkZg���T[�F����������4���_i���������DDDT���MEBv�f�H���g�����}����Uj="8�4��4�B3���W���������S��Z��C�A�������Ek_���kR��i�^�Wg������_�+���M�e@3w�\�CDDt:�V��Y,��������=�o�8W,A�y=`s8�?hB�������D 7�����yN��������EGG��D���5�#e�%�#��Q�F��?�e�����L�tec��y��v<~�m�Y�o����pz�������{����_����e�d�Zx%$��`]�VL��wD9�����A��o�Z�Z��(*y�C�%��kS��@���5����?�B�
h��=��k�����^{�5l����MDD`���r>l��}�!g��=��xx��7:N��	n��P�6G�Z���1D=�4�x�7���ko��z���0.�~DDD'B�k������.^~�e<����0`@�����e������p{�X����'a������k+�o���eV�#y`�I�z�Y
�3����������<]�'"(}����]-��!�~Oi!N�[7[{�G�)���+������#G"66O>�$>��|������Ot[�I Hf�I_""�@��L��W���!�v�o�&�	���VGx���k���\��y-a��#c�n�(���f����k���7���{��~;n�����+���e��������\]]sG�����z�cx����T?�Uo��y��������F�#��P���?���.m������
bj�z<��v�2n�>O�;-*6D����J>��(��6^@=Rz`��i���Kq����V�Zp8�m9&�M�2�u��������6���NNLL�VBh���u���
C���2LR�)��{�R����L��]��=m��OJ<M�����L�&�rL���6
l��EI����5{��-S�����LD���J][��m�fx��[�t��p}�K5H#A	�U-�M.� ���j�K�<G�`�����-�Ft����h�';;���8���
�u&��1�#}���J##/��"""""��A0��e��H�K�c;��u��Q[&c��
z,�4g&~�4S�#.#A���t����3�o=6������=}�yl&6�n��[�"-/���u�""�� �����PT�TI��9�N��arL�>������������2\��S�A��_�r� &$U�+�k���R����q�ntM4*W=ju�~kl���������`^�d&i�Z��u�����bE�z]/����$h�G����N�������K3w��������%""""""""*�+\�jwA�=�:����7��C~�)��UZ�Z�$�:j\���Y��;g��
���uA$S�Y��X��
�T;B}�~�n
��Z<��r�����+��������~�M���<&}�/��P+�l{#�n'�hq��lFJ�AD�a_�-��
��qo<����D�rXylM����q��ODDt�4�#��i���^t�E��i~��Wm�-��1�CDDDDDD�����={�t�R,Z������?�n�""*Nq{�z�Fx/�ap���/���]���]����
��,�=�����}��\������XL�=�S�ZW#"":}���l���>��c����x���0p�@�8x�`}L��u[�n�w�}�?����>�����?����W���DDt��\��7�rRt�)����)�m:jFVA��
�l�9{�`����x��V�a�mx��~��X����u�5~���N��zd����1s�L�k�7�p����;vhf������DDDDDDe����������-[�h&��e�����c*�,�x�b�7-��n5;!*8�:���J4,WG�%#gWF"r��hW��������qc@�K��B\��bd�r���5;�U�������vT
����� �����u���N��zV�X�k������f��\.��?o���y�l��M��ER�m��Q�4i���
��w�}�Xdd$���~��v6L�SDDt���0���*�������{>:Ti���Ccpo��]S�5�4���:��'�����4����G����w���^������\]<��<��f���j%"":}�����C�}�v\q������x��t�2k�,���/��)����X�V�xso�#+��Q������l}������?�j�
�XPP.��b\y��X�|9222�8��..#���"y}����8��\���\
��DJ\s�5������%���S'���������o��
����=b(�~��l_�x�yr���7y�u%""��!�����p�Yg����I6O���q��A��CDDDe�����i�h|���"�������l#��(����@�a��p8���$���iS��� //�:JDD8��=���3�N����Y����s����rgN��FDDT<dlT�bE�����#c�M�6i�:"""�3�d�|��gL�9����2yC�������_�|�:�3�Y���h2�L�z�������F���>�Z#""*n��[���a���@����#Qq�����l�'O���~��$���z���w/&L�������.��DDDDg�9�K�#=��+��19�_k����@Ott4.��r]��������3u�����|��>&}�/���
lI�b�&7��|A�X����+�����]���f_9�x�G����n1���1s����k8*V��|�>Y�=��-""��!��o��6�i��
�o����Gk�����N�k���[o�����DD�������Ii��d��g��p.������#;[���mF�����<��+�:��]:1*o��C���
kOV`J��g�����,
�H��n�	=z��g�}�k������d{��������DDD~Kwx��:7F,p!5�������]X����nL�uk@gg��V��w{���#6%x0n������1g�o�E{�j�X�O�d��l�Q�h���y�
�x<m��i\\:w����zm���z��$�L���p.������E�]�� w��6����s�bx�"W�Y��l��3�xR�k ��b)r&��{�N�$���h]������`�'��I]�_��H}�Q�j�����e��x���1�CDD�_J��l
��bwxd��z�O�?7��=8h��L��I^�2�W+gC����Ed�
��
E�z����������,R""*yl6�vdB��~�w�}W�|�/����{��!"*n��=0�2�����J�����rY��y����!�A���_&QE=�"�y���f��AP��GE��g7�����n]����������[�Rm�A��_��_~Y#"":�e����E������n�Z9;��m�S��0�cf����^������_K�X�A�*v��L^����f5��x<0��|�DDD%�L���L�4i��;j��m��i�kY���(U�������]��FM���3���\��c`��a�\F�-�q�Mp�Z����0��+VF����{`?��k�#��7�����)	��\.,Z����+F�����#''S�L��
�^DDD���?s[�?fs��^�
�����qu��iv�alN�h�':�f���o��Q	����#F���~C^^RSSu���O?�g�y�|�	��9r�"�b�p���������\y���py�����\<9����m���A0�>������
������"��g���yC���N��e�r���4���`$�7?G�����\o����?����{��c��zL���p�3?�1���88�:�X)��>e+V��X�&�8`^�����
�;]�x�T${G�z�{�=����HJJ�mY�GjN�*F���[�8�a�i�%�'*��K�H�'*�Gz�Y���m������0���s:SQf!�42��g���+4�g���������At����
��1c������N��'O��U��#G��e���:)p��!�����z�j���
�_
s�L6�;w.~���;z�h$$$X�����?��S��G�?���;ucz:�Q����j9g�h"����`d����Au���v<q;�h�FN\+�!�����S��{�V�/k����EP��Z��0_�`��M#q8pp�;����L�+�A���R�5���I"�����2H[#c�6���a$�3�����H�m�(�X���������Q�j��"5���M��DDD%Q�=�g��K/����0<������k�xPP�v��i��a��Q:�!""�/�j;��m`�
��d��x*������6�1i�;���������,SV��f�������z�a��������#AY�488X+!��i��A��s��j�G��|�&L��$	bD@2���w��/���e�eb�dN$�u��K���������w$A��_]��v��a��}�,����1c��8t�PdeeY=|+��\C�7�3�-���q��Ip.�[�JIE����L��_ku�[���^C���Fv6r�����#w�4�#�|�@&Y�'�}'��T��|�$���H�[�K`o���If�X�/w&�����+�7����2_#o����`���?�j����������l���H����$�3l�_X�����Ejr�����M�8� "�)�������������#Y=]t�>���=z����7�DDDB�������P�:=-j���uv�jY��;�c���k�lJ��i
;�6u��FU�����}e_��122��g&)�,��y�f\w�u�����/Y�-Z�@�����$�D��)�d�|/�9#������Ru�Y�t)���^����x��G5�"A���x�g�
s��5k�XHH��K%8t���kpH2w��39���>�����K���_C�N��|o�����Q�jU�(Q���l������&�C������-0��]q������=�<��F-�]�W3|�[7#����}LA��!�e�OM�#"a�d+[lQm5��M������L�[hu���`�9F�:�[����0��9@�V�?���^�|�#�J1��H[[�k�O�����o�������k�1����J��zdp"7�rs��qc��a�9��s��tvv�u����'<����	F�H_�'�����]��4��A�:�?c�l��G����#"�����������ns�JDDT��l6
�����k��c��:n2�N������+5�"���]��a=r���c��q���;��#��K�.<� 	�HF�9��%G��K	�W_}W_}5�u��A�~��if����������T��|$�����$�J&3J��������#��}���}l�1���^
�����C��O#�s
�H�~�?����R�A��O���lA�q#�8������=��i��RYA���`+o~
����������K��=
#m	�������7�=��<�ad���}s��0�k_��u����qbo�~k������A Rj@�#/�^n����?��G���(�\��`g�Q�"�&M�`��IX�h~��w+IE	IF��?k����`PI5k�,����*�w�}�*���� ���^z($�k���5���?�h��xN�|����v���}���O�8��+����{58%$0%cS��,�2���h���R~\2�*V��������H�������k�Xy_`&#=F��E�9�u�!0�6R��p�9��=���r��7�����z��?3����|-�U�w�b��IDDD%L@=2�Ln�����@�O�0�,5�e��u�C�������f�P""*y"""���9#�������>[3J$�D����%Y��m��/h�3�$�r4	�H	�Z�ji�/::��U��M��[��0�8p@��I���d5j����$�#��|����)�'��f��Z��i��ZF��
����Bk�H_o�/�Ax=-�&A)�&e�����r��	C9Y�������6�W�N�[��axs5����d���������h�',,@BB^y�|����9s��l����������DDDDDDe����Z<��C����s�=������72iN�������II��wo�z��(_��({A��IMME���j��l�������P&��
s���1�u�&���ILL�}YIn#G��7�|�7)�&��+Vh�d�����pl�5a��0l�  m!l�`�z��:F�r�����-����R u.����U��*�������0�%���k�[pe��\������V�����kDDTv��s�>}��Oh�o��]���[o���k�j-��.���MDDDDDT6�+W�<��N�����t
	�H �����A�t��3�d����W�O)����H*����h���L������i�u�����j���?��N�:i��|$4t�P-�w����"�����&���3[���7������;�����>�7z���[����������GHu��>
{��\������D����7���?��r��b�z���%�}}�%����S����-�PT�����Ji}~���_�[�B~G�|������S��y���yJz;������^\T�@��4y�d<xP���)	u����5���<��	�EA�9�pi���n�{�Fk��5m�
_
���L�
\4�Z����6�l�m�������~�ot��Wz]�v�_�/k�'/�����/�E����_��{����A�.
G����t����}�����vQ,��Ok����r&���N^�K�-����+���#����uu��u��u@^���x���������.�=��������A����.U�E���6�YlH�n���bx�������Es���Vd=��M����;x�OJ�����J�PJ����k�6�� J~���'�M�0��R����
7��c��jV��
s��={
���}t�y��:??���u�X�.����?�=i���������9�L������ZA'B�[����Tr����-Z�z�H�;r�������A]�7.oF����'��_S�'���������)������F��#KF�!��A��������/�Pk�uu�-#�:$WxM�wd��K�����VZ��3����?����K���x��#�^��k'��}��+^��	w���]%�5Dg����)/�%�T;|��cZ[���:W���g[{%_�
P�Jk��<�G��)Y�GjM��Gx��7�,���*hCDDDDDT�H�0�����u�tt���TF�Rd�]PP���+��g����RvM���7�R����ey�?�0?)�&�����H�������ke����?�0���k�j�J����,���lle�	��,�7+A��&���PAM���s���er���lddd�����r�����y����=��V�@ta��<eO���s�s(���=���]*��T��������PZq,k����;w�\�(�������?^�	�Y�u|�������-f���:3zJ'f�0�G���h����NwF��A���_��g�E�P�jUG��Y
6����5sD��y���K�1����a���>�Q�Fa���h���������/�
4�o��V���0�K`�G��G���q���!+�T���s�=��#���_x��Wu����:K���'b��:��k\���/� ":���ogA�_�ZTld���u�[��$�F)�������9Zi�{[	���h�x�� eq����������a�tf���K��]�v!--
���:�N�j�&"""""*{�6�L�k���r$���}{t��
_|���{*��k����y���X����f�Hy5)���f������s�=�����/?���>[���Rm~�����jf���r�������K��E=&��d
�g�������5�J
�����9�^��$)S������`�����[�������Qi$%�d-�v Uj����m�b��-������%�F��U��}J`K)��O� ��y���7�hFS��}��@||�f�H�����/�����N'~���Zzm�����#A����I���d
��D	�q��2�$�*))	����kJ����c�
"":���)��g*r�O�����z�0O��������o���e�����7o�S}��.D��)po������h�G:��s�M7��E?s����+efZ�F�p����"�%�����7n�*
"_�?�����Y��F� ��$	�'��e��8@����M�������� ��QY��k =��[v`Jr�d�H�H�`����c��1$X!,K�.�,�3���q
r���Kx����,�������i`�/66��~����+��R>N�5S�L��c�}�]];�v���-UP��sdLv��W:�����eK]�G�JR�M�-_�|�9)�7�v����@�ob�H�����py]�te��=�0y���'~���"������7�Xb�$223`����qB/�����	�#���|�6����#>��=��1I�8�m���|�3R��N���s�M���	c5��7e����l4/��s��d
h�G�r�-7�2p��{��tKZ|�r��Ohh�.����
MSdy��tPq4	I�g������jv�d)����,�)3�d��_|Q&����.d�qt�G�	H���^{M���C��\c)"*��3�����+��������t�Yy%��QA���Q�F
]�GJ^� '�������2��uz�����t��7t��1�<&�)�&��JpK�B���p�dd}"	���|	��L@��W�I���#��N�:Y��$?{	��������Z'I&�IF�#�<r��?Tr���	C����{Wi����z�0	���u
�];
��\�K\�?�N�����qF�B$d����1}�|=�����[����7B�
^y�7g�h����H-w�8���Jz�uu"
$O�^�+VFp�.�y1B��j=b2���3
�
���%����`������1��}a�^��y02�`��Ap�6�fe��:��k`x��$QI�@��"����"�
�Y�����qjj*f���}�oI �\I�Ef��,��Hf��A�P�^=�(�I��Yd������tC�����W^���{O!��/����_����<>��C
��u�]�������V��DDe��|)�k��'����N�����3��|Z���YGDDT�EFF�8IJ��3F�9u���q��%d,5q�DT�V�����D���e�]f9�P.��b]�h����!���c�&2YP�v����B&�s�=�~�����Yg����4k��}��~�I�v����<�Od��/1;�b��z;\X�\��u���aK�����u�~�Rs�pU�^x��G��j�L^�����H���TC4Z�o-�F)~#��F�_�#��w���W��m�Z��!����
b"
<{�������99�~�s����	��X���
����;J?z��h��<���FM���\��5����n}�6������J��zd�"�VJ0���?�|Y������T��������wo�[�b�o���V��rA$K�����A�����(������j����R'��D�~�4p$3�dF�����3��D�?($�����;��S�H_���a���:�#"*Kz1f��Y'7pO���],�FDD%�,����J��9$�s�UW�$4)Q&e�������S���W)�<��W���X���o-��������=j��G���i?4.WSv�E\FZUl��1�P/�&�2�����p�yN�*������+�|��u���Gk/�-D���������N��9o����/����r"��e��������ta��������!���u�c��Q����K�prpMTR4�#���n�M�6l� ��O?�Y0��"�+�z���7��}K)�&sJ	��"�5.��^��
ZG�*U�h����K-m�|�r���OhzLt��QW� ����-��d����!���Xe= )sGDTVlJ��Y������Q���uk|��':�K���z�)]�E�HYi��/)c'��H8�w����(���3v/��^f��5"��u���Q����X��)yi�VAax��
x�����fdlL������KOy��\�7�p������b�l����El��H�8�+�]n�����o9	{��Z���� ��c�|��r`�\�W���$��;�������1�����f�������3a���r�DT�4�#d����5�]f�I�D&�
#9��Q#�����[7���5w$S	�H�5I�?z�%��,�*�"!������	�I��������Z2NJ�I���5kZ�|d���������W��ND��x4y�t""�@�I^��7�
7���jIiw���[Z!A>V�\��MD'c}�V$���[6����F�s���������8�{K�VkI��a�Z�G��f'L�9.�[�������p��9�������'�t�*��1���
�����0<�n/Z['����w��;��De��Z&k���=y3���x��b� �s�b�An�y��#w�d��mAH�.>���� w�$������
�D���#�����������g��C���'$��&��!��H}c�x��?�cR��|y����E;%����JKK��sGd�u������������>��P�bE
������d�vt�m�YI�g����	EDDDDDg���8�9R'��4)������L�6M'��.�������������y�L�����s�B}��P�7[�p�����M;h�}����Vc�������mkZ��3�bAb,���hT�vf���}�����5������-1e��t[������z<n�W4�9�\�U������=t|���H�Fn�u��������##=�z$De����K���J�[�H���^���p�_k�S�"�w?��T�s�8���uwB:���6���]Y�GJ��5$�va�������m��Y���J�S�9ST2�B�
����a7_(�M��y������a~����3��]�?���Km�@Zq���?��%���� ���z������s��YZ[q��W���|m�k��������-
�/��������*�����
��ik�R�g���x��y�����uRR��������'��g���G�'Bt�x�"���3�:�cd�#w�
�����}$��Z�
y��k���7�G�7���G��1p�Y�k�x����x���qo-��(i%�F��U
/����X����W�~��<�;����\���4�Q�Xh��5���q]�G�������X��-m7�GT�5{������Vq2`�^���,�@�����������W@p�V���n
��~����n� �4��cQ=	G����n�������EFYG�������1����W\�����_~�u�����y�p�E��7��3�<�B�g���E��T[~��u���/�6m�k��	&h����#��-[���2n'B�E*�F���y;"����E��������];�����[�y���$\��0�#���r�����=xu�7�]w��T�l��^��=����o����my�����2n�y]/����?Q-�
�.�]�G"/��n���o�:�T��bx�A�V�%��zPT��LB�
�7��GE����>�������������_~�n[���u��u@^��RC������_��@^����CQ���� ��@^�jK��������#��)|�����M��J/�Mi�?���D��E�/�/Rf������N=	~���x���uMY3T���{�9c����z�2��l��':e�^��������������������F��7��;�1�D�z���Q���)�5�c�)��$�Y:+�{�J�|��/�V9�"s�;�^��2�p��gIk���c�u�����
)�p���t��
��=��Xr� 8Q���]z���������y{���m��W|ZTh������J���H}��u����W����n{7>��!�]�l1�����:����*^;����.���f�����l)�v4YoGf`�K����hY��f
��=��\�������zG�c�rmR�A��f@'���6��*��Y���5�_�8������.�]��u��V����2��!_������/����|K��Kioe��o ~�Jk+��~��_���oy���%)���wo���+������B�~���,]������N�'!��k����z��W�������'~��jji ?	�H����=tV�q0��i�b�����v���Tf��&""*n����j��Yq��r*/sg������;���^�������!C���c������'���K<��S�2e
.��� $�s�u�a����5k�����#���?��2
M�4�zB������������^��L4x�b�^|���o�H�[��E!Qm�n��g�5�R����Eo�L�e����%�7�k�C��/ �_���
2���d6��j�5ke��E�*8��u@^���;����on��b��lEU���1�E^���L�9��*z�5y=��Q\�1�)���o��,6�n��NNi�������)���
�tg�H��.]�h����>��d<"cu������
��OTT�L\��W�����l������g1*��{�F������-����t�oO�-�+H���
��s������r�Q�.��4����a���aF����R 0��`��91��)f����O?���3I��5��ys,X�@�0~2o��9�i���k���f$x�?Sg���X�~=�9���(�"�edd`����v���dQVy�,y���������	rr�_��D2���u��5A�N���Z��0�������M��u�so����� �i�v��:
�ip�Xb��P�G��q-[����76r��D����E��'"""*������?���s�ZG�2������f����[���7c��Q���T���k���f��c���xdU�1(�����P96�j��%��Y>;v���z�~�-*W��K.�D���E�4�x@�x~��cH�f)� ��g�������[�n���T���f-�V-��w�^�6��g�v���6�A����������=�P ��ll11p48<;���{�zj�6GB:w��q�p{�DDDDTX
�HCM�������	$���k�E�>}4��o��w���S;w��{����,�r��i����Z�����_��I���[�=���]�6{�1<x/��>��C���KX�f�����yd�t��w�A�x��gu�1n�8]�G&���@���v[���$*���g!����E?������n�{w���K]r�""��y��h��k�Z-����Dh����Bs����.�k(�qS�V.Gp�6���Z=��������2c-Z��ue$ "%���&��rr�^w��I�6����G�U��b$�#���e���?��7�z�\x��z\>J�|��x��gt�aY��-�����zK_��{({���p��w�b�DDDDDT2�i�F�W^y�f���9O-[��5�{����;Z��N=G����:��v����r�����y��C-b�-2�E��� �E�%�'����8a���DDDDtr�IOO�A��p{��75(r�]w�$����f�Ur� J�S�L����y#}�
4H��9�pd-�O?�T�����������z&���������?���C��MDDDDt���R�I�&����������>�&������{��:� """""�/�����P���K��~���m@xx�uQ�"$�g���Z��U�V����6����QA������:����CMf�
<_~���c�G��E���y��q�F���	h����ra���=z4F��1c�hY��s�b��mV/"""""��I*�k��7o���[�������cZ^^��y#��q{=����
����6�-1k�uU"�����������Ek[6���h]��J��zd�2a����Kx����s�����GBB^}�U]PT��������*)���E�����b��a���_�i2iN�������an�R�0_���H��U����ce���DD���������m(��|Q�������������ND%Y�=Rc��'�����w�����Z�;�5-����G��5R�`����X�"���|��x����iR[����[��]�=����%{W�-��
l��V����d�3���k���{��:�K��\�#g����Cx�2����h�G�
2�+W��_�3�.��},::o���u���	�E���Z��g�=�=��3�����%��7~�l���Y{�c�������#":=r�N�75��+�m��7w��GD%U@=iii�6����Y3��a��@O||<�����DDDDDDe�on��\v�eh��=���
�HU�����x��n�>�M\z`���ep�;�^��q�V��5��dh��f��n�k�6��k=��l

�>DDDDDDe��]�0x�`�����*�z<�1|�A>���z��N�a��DQ�DD�S�^�l_��J��z�����uk�;���p:��#��c`����5k�.:*}�������"�������
C��Mu���	q�_~�f����{������)�V�3FfF�Z6+z��z���q�u�a��mx���0r�H,Z�Hg�M�:�~������j�KDDDDDTI)�����O�>4h���pR������?���;��\��N��{�:�������M������.NDDDDE�@���=�RRR��Oh)�����g�������"""""��J�7���8���a=�R�J�����w������:�-���`d|�&2���h������k�?Z��[������NV�=2H�l�O>�D������z�����0p��2DDDDDDeEpp0bbb�s�N�\.��arLA�G��jY���k�jk��$�'��_�IJ����
x�GH}�v��if��?�GyO=��v�����Q�$����c����4i���4sG�d�L�6M�>���Ts�.�������������z�^/��_�#F�����s�=�^xAK�������c���������l�	p��~;���tr�G}�_~�E���e��1���rt:N��U��\�9EDDDTT�l��/��2^|�El��6�M�?��-�uz�{�=���[�����������;��?D�.]�z�j�����bcc��m[}L���@�������0�|���:H�����}��w������_��_�����""""""*{dR\��=1j�(2D�9������J�>DDDDDD�4������'���.���
�B�
��7o���_�~=z���&"""""*�<j���:h�[��VE���E^^��z������l�n���:�Rc�]�v8x��X������������=[�2����l&L�~DDDDDD~
�DFF�c��X�b���o=,55+W�D�6m�/QY$Y:s���������{�~�)>���c���Cu2�_@=��������J���o���U�ta�y��i�i��V�~},^�3g���`�f�Q�!Y:����x��'1x�`�?����k�����""""""
p�'==]�;�`��/��[n��<��}�Y�u�]�Q���Yi7�p����c�i97"""""��@�N�6m�����������k���4��PPYl"""""*���OPP��f������#�9��iS=&��s��9��s�I���`�*DDDDDDg6#EDD�f��:�"""""":Q
�T�X?���.Z�&���DDDDDDe��c���������u���@���;wb����8q"�M��������X=�[a����RF|��I�������G���^����U�HJJ��*++�:BDDDDt�4�CDDDDDD'�}���;w���#�$ qt�5k�����-[���������/��G}o��V�\yB��=��vkYq)��O��^�s���{$&&Z������G��}��~���?���k���F���%���YG�����Nz������N3�2d��a��_`�����k�i>� RSS��J���
��?7�|3��������K/���{�Z=V��7o����^3x$ �����G�q��a�qqqx�����o_�9�^z��$K�O2�~��w�{��Zj������tc��������4��L�t�����Z�<�k�_~9�����J��K����~��w����.�O=��d$�f���V������	�����������wo
I@��o�������dI�M���U���n�l�
6���P�r��\""""����"""""���|�����4�������gY��������BPP���l�V�d���1�?��9�����u��v����s��~"22�^{���$���\/44QQQ�/8���	���_x��P�J=FDDDDt�1�CDDDDDt�If��E����_2Q�����v�f�d���][[~�-S�V-}\J��0����hI�-Z
�����Y�j��W�XQ�C���������ku��f����H����^[�������J�S��?Kn��m����g�B�DDDDDD'B��y��G�����rm���i'��d�)�n������o�[
R��%G>u���z&e�$�g��=���eK\t�E����?��?�[�nh��9��[��'�:IgJVQ�s�[DDt*���@�Y�z5���u�K�y%i�����TKm�>}� ::�:�<��	�.k���im����n�{�Fk��5m�
_
���������������_����m�m�s�];����.��J������N�e����%!�-���U��/ �_�����u�(���A��^�-�n���E���?���K^������3Mk��6d~9��vQT����<K������;9�����_�Q�Z['O^���L�9��*������y]�{ �E%�����y](����
�m����zx����BC����Wz���h����@����t!�SE�L�x�	����O���'''���H�0�/�'��^.��2��0a�1�6���?��F����
s~BB�w��W^y�=w�����D]�g��ZO��DY�GJ�I����#���y����_W���4cH����h��m��N��w��U:�o���*^��.<��=��]l����T���<�4���+����_Z;����xk(�������O^���Y�=����'W��gp�g�$���W�������#�,���c{�	�vl�����:���������y�^�iU�tz��+��o���'����4h�X���Ch���]�l����lk�lv`~�����].M�U�fm���z�������vY(s���ZC9""BgAI
���~�+���:��o�=�1�S�1�S4�������E�@�;������5R
��o��%Kt<Y�zu���
s�d�/�#U&�=�\�|8t�P����������_}������Ga����M�p8��/h&�l��?���*n����U������Z{���jk�R����fVE��S������q��e�^��w�����T
�e��5�;c���u;%8����?�������gfJ�JE�"DRQIY"eI�"�l���=B�-?[�H��T�H�B�����y��}�9�3�{g���wf�����i�}�y�s�s��|���=�s�i�����%�q9(������O�e���������*�����xScM�g��N�^&�V[h�����8��U6m�K=(_�9|xl[��j5���^��!5����#3�����k��)���/�
���7�:e�a�%���-[�Xa�E2o��V��kWs�������)��~�L��Y����66� EN���g;2��62�zvD���F�A���'wd�)\�� a�>�����0��r�)v����n����s<�v�F������O���i�L��-M�^��c�=�����u��l+��O>��������CM����������������^���G�SjpoFr���j�������l[nv���x��U��e�7��k�3f�	�~�Z���p����
���ZGgn2g$>[,7m�*c�����^5�O��l�O��~�R5�lk]�~N4��1e�$�g:)V�>�#����^<��U�F�o�FS'=���8����w��f��{L�P[�6�i`2��d���d��W��M�Q��O�G����o��K�$�'�d���e�����j����~N4�]����7m�:S����S28��s��QAH�����'�x��������;����a
0�O��G5O?���4i�
C H�S0d���=��=C����'��|P0d��z
���u�q�I�
�_�����&\��#vX��9~��5vF�!�b�����bbP�����EC���^kg�u�Q��;�4�������Ol�6B�38g��l�XY�x��)5�X��Ps�f[�,]@�5o�]V�l���k�'��[�?nWJ.�����xj���J=2V�l3�o�e�����P�������5��\v���e*��3��|N&*��H��u$�������9f�?����f����-���j�#��a�I���Y��U�d2+e9[���*���tSk���I�B����j�Y�l�i���5�\p�f��y��
A��^�3x��'O�qJ�(�H�S0d���=��=C����'��|P0d��z
�<����6�t�����ey 36<����,�[o����D��3����.2�}��3fL�Q��c	�v��w�	&��M���A0��Df��+W�\u�U��o�5c��5U�T�a��>�lB��#��9�?%[G"��
!��?�}'��nDYZ�$�b���E^�b��8q������x�<�����/l�x�B!�B����
F��_~�N���3g�k��T��i�����������?���;���������Y�|�y��W�O?�d��a6�k��f�P����6m|"?��33{�ls�%�X#0k�s-\��l����c�P������ $>�P�7uC1	!�B�ER
=��,RI,cB����>����=x<1
�U�V��B!��Q�^=�nf�<��#f�������`4�	��z��x�g-���:�������n0C����0�0 �?B����A�}����;�F�`|K(���{��n+h�
aLZ����a�V��G!�%��z222����Gm��3���+��^W����9r�9����"��B!�B��Nff������_~�NrDC`I�Pk_|�����L�:u���3����o��\q��L�����f���M�69.��!����Qf���5��Y�X��ys?UN�!��z���c���aC����0�{���������#
@���)���%q���@���	!�B�<�j�f�3O(;��L�'�����j8 +��B!�B�f	�z1�i����c������o����+S����cG;V$4�����F�)�~�u��{���x�^������7n�M��D��O8�r�y��7�a'��9���k�{�������Ul`���7i;j���e���)�V��I���������B!D�$��`=bW�V�l���l����;f�;����w!�B!�(��
!�/��B�7}�t����5k�:48�����~j!J&�{]a�����h��^]������C^7i���gB!�(�$���q�FO��x����^P�B!�B��a��!��O��O?�:��|���7�3%D�}�{�9�m�6�_��J�.�L������Wl�����B!�(�$���,���'���;�\~����;�0w�y����>j��_�%�B!���0%LX�����!C�QGe
<@x�.]����>�|���v�!�B!�p$���,�$�4�^>���6A�F��*U��G	!�B!D������jZ�je�[��:�
4������?�B!D!����!	$��B�p�j�!�41��1}�
7�N8��h�b��0#-�)�B!���5e����#���y���~�iH+�BQ$��\j�_���B�|�TC^g���7u��5iii�^!�B!�A0�4k������v}Sf��8G8��k��o���|�����c���&�BQ����i2��cL�=B_2�� ��=���B���TCO��U�,��'�e���A�B!�B��0K��K.�c�^�z������=���3b���;����.��!�B)i{�d��^m���5i�Zl��.�\�s
!�OR
=��ys������y>����g���M�2�l���?B!�B!JM�4��&f���1���=���]��9�FJ2d��M!��HI+c��^c2`2��P���w��8�"�$���z�j��SO�P=��9��S��'�����{w�j�*�(!�B!�(}��U�V��7�4/���y��'����0����i���Bb!�B!v ����e�����:��O?=����\�r�QB!�BQ� ��w�}g&O�l>�`��eKs��G���q����
�-J<��o�O�[73�y��3��������6�x���m3f���������.t����"��+��l��?X!��d�TCO�j��1��^�u�������n?iH+�B!�����������3��-[��}����O��W^in��&��o���B�H27o��&��{M���B/���>��6��0�����7�����_L����>0�nw����1���f�O���y}B��
�����'B!�(Y$}��������3����y��if��u~*!�B!�(�`�y�����e���g����J�*���6�\s����/�h����7!J��o�8cv�#�e�0�����g2M�A/��F��?���I��!�q���aY3y6�f���1�U�o�l���Z(�h�LB!�%��z��_o>��s�����x���z3p�@��s��vaQ�!�B!Di�uMg��a.��Bs�y��2e�$NOO7u��1���7��{�;v�Y�f��M�G��&}�GMz��#.��V��I�o�I�P��-��)W��W=����1����P�tc*�c�������MK�)S�d�7���~�&!�B��E�
=������KM���M�>}�7����z����k�5�&M�S!�B!D��={��w_����L�����aC���u�D`����xk��-'��
&m�����_0i�47iU��?yK���
�,B�����mM���M�~�?���m�<�^!��$�TC�_|��������^3w�}�9��S��g�i
d����h�"�B!�(��W�vm���?��{�����o��iH+DI!���M��[L��{���ot��?���CL����z��m����4���c2{?��3����x�*���&����}/����������B!JI5��^����3��m;�����a�1`!�B!�B�F�V�jN;�4���Zg��S��y�����8��iH+DI!}�n&��g&���&��~��0�����1[���_n4f�J�V����|m�U�L������������.����c��m�j�dL�N&��5����y�B!JI5�dff��Bk�����~#
i�B!��4B��=z�-Z��z�t�������n��~����;�o���M�EF%���!���d�f�e���o��|�!�2�9��d���M��B���Ew����B�/���-��UvM��

�����y3�lt�B!D*�TCO��M�����	��e���y�/����>~#
i�B!���BX�����p�
���3�6m�[�F����o��������2�l-�=}��L������?0G~���.��y��c�����1i;�n��&�B��GB�O4�
�] ��!D�f�R����x�'o�,c27�?����]w��������������o����=�[����i���?�"?$U��\���������O�c�=f&O�l�O�n7>���HCZ!�B!�(���_�~f�����/���q�^{�B�	!�������\���������~�c����?k��\p�����m���������d��<��z���K���k�������B�&s�Y���;?t��.D�$���k��v#�t�v�L���g����B!����~�z��o��D�����B!�E��y��6.2��=`2cgMb�q��hk2�o2��"��h����&��Y&s�D������>1���0��k���)W����8t����S����l]��M+I7�������0��s�9���L�
��g��i�B!��4�r�J3r�Hs��7����G����.�v�Z�!�B��%���&}��MZ���l���2�S� ���x�>����k�7��o6�{^��!�G�b�z�I�P��Mc��7��G���:S�ZV!D�$����;[�l��������K��o��>��n|f���B!�BQ��m�#]~��f���f��7�A;	!��P!���iv��e�I+W����������{�����	l��d.{��U?���f�O��l�eo�u}���c��7z�d�N�s
�[��
�f27�'B�BB
=,:i�$���C�<~��\7�^!�B!J#�l{��W�a�f�z�-��W_�uM��w�y���Q�?J!�"�x������e���,�<�?bLZY��p�1�������|e��L����vl]g��L��q&}��3in���x�k�m��e����������6����"&j�Y�f�0`��������3���B!�B�����g�/_n�:�,��~����4�!�B����6����#�4���k2{����������7��_�g��k�?_5i�g������U�M������'��:��o�������m����=�x����:���
�Xc�"vj��X����������_}���n.�B!�B�F��/oj��m�n�j233��B!����k���<�!�d�r����Z��z�����-y�&�6�aLZ�I���~o�c��0�/�c2�_o����z<��o�a����`�e�dP�q�_!DL$��S�re��o_�����	'�`�L�x��7~k���M+�B!����U���N;�L�0���1����_f��U;l�W��!H!�E�N�L�!o�������������6IZ�}M�A/�������8&���&��I��Y������=��	$����z�a ��G��7��{v��O?5��w�i�B!��4����52K�.5���y��G���Cw��n���_�(!�B!�H����<��/���S�����������g����?��l��A1��B!����k��|0;t��o�i����7�xC�!�B!Dn���m�y��'m�f�����w�iN=��6�|��G6t�
�B!��4�xh��A��g��u#��NB!�B� 	7��)S�\y����k�5�\r��e�]L����W_q���[�!�\�r��B!��t�x�Y�f�u��Q7�?=���L��e���B!�"Ik����>����74g�u�������������M7�dn��s�W���/��������B!�BQ:��e�Y�`��6mZ����������[�!�B!�I2�8�W�n�z�)S�J3y�d;p��7��#G�����%K��u}�B!��43w�\��O��ys��];��iS��eK��m[s��G������y��B!�B$��V.��"��Cez6m�d�}�]��Y>����/�B!����[��'�x�L�>�yz��mv�m7��I��gOs����:u���S�5���B!�"��7X����L�.]���a�Pf�\u�Uf������m��oB!�BQ�X�f�5�����o�m���n��MS�n]3x�`�(�8�����B!�B�,�j�q�f�t����)S��OOO7{����F;�����1c�����oB!�BQ� ��U��a�f�Mv����������{�m�<�L���o�����?J!�B!�l�!T�<�����{�����H���	!�B!Di�������k�����K���p�[�h�5�!�B!�#���������_}��Y�v��w;6l�3~HCZ!�B!�(�T�\�������mx���L��{��;�g�6���3s����HNt�Bt3+i������x�g���/3k�,3c�������<,�s<����9s�M���?�|
���5?���M�_������`�Y!�B!���z�!��C��;��W_}�P~��W�!���[�7��V!�B!J#*T0�:u2������l�����_���������^{��1�4n�������Q�+��u�f^z�%oN�����C���x~��w�}f��������	���W_mN9�����6��7�����*k���>���w����mh=F$B��|���^!�B!���z�4���KL��M�w�aN:�$s������Eh#M*y�	!�B!D�9���M�����#3z���*;��~���c*V��Q<��r�J3i�$;��:u��KN��4d������h�z�)s�X��
7���:���x�bs��WZ���n��<���6����
,Y���%��ukktk�������m8���O3l�0[V��B!���I��v�}w;�����3
6�Olx������F!�B!�(�0S��(O>��5��w���(�
2����9������%O<��5�0�&==���ji�����Hw�y����[��~h>��S?edb=����s�Z�W\a�8���/X��#�<b�BB�
�������=z�����L��B!�($������5�|��Vg�<y�����X��!�B!DI�c��Ycg����i��fv�uW��L���o���5�4h���@*W���KN��gg/�s�9�L�2v�-B���c����Yc=�<#����n�7on��5:�-�k��+U�d����m��v������_��j��m�	!�BQ�����+����+|��k��yV@B!�B��
F�o����>y���#n�
���8S�Ns�5��	&��p"���������Q�j���}��~�zoN�9�5xX'�PmU�T�SeQ�^=k������w�?��c���<.��7�S��5}8G�v�lz!�B!�I7��Z���5���C|��
*�$�B!�B�F�I���L���^k�!�X�F��x��S�fM������P��PFF�)_��]'���s<��]�����>~��`�)[�l�<�z�]G��&���v�a���2�������_?S�zu�� P���i��M�6m����4/�q��A�K��%�RLy������@�����[7�����E���?�l>�Y�Y^��T��d�?�w7[���e�;�T{j��������?���:�����\��t��\n:�Rsf���������O������k��d?S������57�
��i?g.����w��\2����U9�~�w����������9#�O���AAy�G���Y�
�d����\jM�����o�o��[����������?��%����4��Xp�&��P��~��hh
J��������3?�����?�V�;i��-u�|P0J�|�,�j�/*0D�|���0q�w���:*;Y�����Mqc����E����n3�_��3���SO��YO��4AX����>3S�L���k<�����0s�1�U�V���_��~��'���n����~���[o�k���,p^f�p���������FB!�B G�����TC��#o���
�L��������Km���/�*o!R�z�#COj#CO���gGd�Im$zr��
=��-3�w����K�u�]��-�v���6s����<����zpdV��_m�x
=���f�Y�x�9��cM��m�K/������s>������~�i;���4k��w�}�8�n��Y�'!�BQ�A��U���-$����������/���{�=;M���C���0��*���(�H�S0d���=��=C����'��|P0d����0��S�N������<6r�<�$���4�&���u�:v�h6l�`���c��88._��L�4)��7��1���v,�}q�� ��E�E�%T��i��������nkl��������m�rf[��f�!�B�L��z�W��O<��y������m<�Gy�N����O�X���)2�lG���F���!C������H>(2��NQz#�]w�eC_�-�a���[a��_���8�e�z�����G�Y7<�a��b<	_��9~��5v\z��G��^{-G�}���v6�����JoN0�����M�f���A��o�a���Q��54�w�yf����q���QB!�BI
��@N������zA����k��[g�@���m3�W��1�_!�B!J����k�`x��t��W���D���(�������cn�{<�&���L�&M����g��cC��.\������_�jU��Q#3g���)��3g����8"��&f����P��`��%v}Y���x�N"�B!�"?$������eK��[o�;�xZ�/_��7�
���u�]m7!�B!�(�0Vb�c�=�������f��y;l��C��-���s��s��
��8b������x�0]�t1�-2#G���f�0%-k���l8�������~�����1���j��q�M�6��`��P���]!�B��&�����v�j=�x��y��>��8�LwG��:u���O,c!�B!�(I0V"�����f������(��������c�z������C���_�\~��6�����>3�r������=������N2��{�8p�
)��<����#��������v������ys���3�<c��pp��~��
!�BQ$��x�3f��+U�dg��s�=6�2��/��2��_?kB!�B����-[�a��^�]RR"0��1a��5�=�ax���Z�@f�`�!�����nn��&kLq-����3x��!����3�^z�
-���o�0y��
3m���S�d���f����h\���y������~k�D<c\��B!�BI7�B=���a��y�;�%���[��.�B!���D8����[��$�Qd��i�W�^���`�!
��I�lh�����V��&�Z���3#'H����������"��~h�?���N���3q���������}"��B!�(,�n�!f���s�T{���N(���:�
�������a��Z!�B!J��9�����o�m��k~��g;�$|��u�V�(!�B!�(C��)S��'�l~�a����X�xX���_vc������T{!�B!�(��]���|�����g�i�3m�������k��B!�BGR
=x�1���m�\s�]��<|^|�E3u�T;X!.�������B!��t���Y<��U�k����n�s���*=�P"p!�B!R��������e�=L�v�l��/���p����7U�V��}~���z�j���
3��7�2��7��]�j�f<	!�BQ�a��W^y�L�<����m�|���U�����^���������������0��n��%Q������?l���g��������rN�����2.\xNtH?���u��Dq�o�����<�#�38��/#RP���>~s���/��c#=/����������:�2�NI-�X��}M������o"��)�Iy�6���������dF|��Q�I_�H��g��m��i�����t�R[h�z�5�@����h
Oic��f��!�M�6�u����O4�
�/��H!�B��	TB\�1��#D���?5jd�8���������~qe�[����*�P�\v�e��x�% cj�s�1����l|n��������0a�Y�n�M/����a����:������+oN�[~s�w�}���}�	'���/4��yE.�0�b=��i������8~�-�X=cP��g!7�t�9���l�SO=����Kuk�%�C�\`Z�li�}�9��O?�tErq@e�EI.�X��}M'N�u����zG�������g����2EF&��z� �1���/u���N2�=��Y�|���t�TCO�
��{�i_(x�aq�����a��Yc_�:u�����2z���M��3�<c�;�<��K/�����TZ"�B!�(
�0ap��'�%�2o����W�����9s��Kd��e_$��%4|����k���_q�v����Ur\�N�l8�T��.n����F����C�G}dgfD�8�7�L�����R��y��G�������K�.v��}z�'�x���]{��V���gO;#����W�^������:t�9��������zI��9s��_l���w�y��l�`@�45*��_��o��
���Y��g�}�L�k~��)S���'���R{���5��W?��C�w�a�����5����zx�1�`U�Ecf�~��g�7on-���������������a�����l�<�������o������m��Y!�BQ�`�B\��@����O�F8�TTJ�t��Q�L>|x�FN�7D����;���"b$��w_s��������n(~P���#������O-���p��z����}��������Fq�o��������W��g�m��(�Q�����a��qf����w����7���2o���5d<���6-�t���M3w�y���)��{�p�=������K� F�����[c���8�3��~���2.�e+����@���kF�q��E�l���_���3v(Ofk��k���s���.a|�����?���.�$���5����L�bv�e;�n�����8X����c��v>��c�b2��Y(�7^��c��M!�B$/��D�C�r��Y�x�n�������*B�"x���a����A�u��
���v��A��/�(&����o��������E��������L�3�<�:`W�;�C~c�Q��
�E��p|`���O��!�YA�~�j�YY���9G��s�q:'=�
���C�xb��{!�Jef��������A�����&�q�/�X��}%���C���c��
C��1���<!�MX�Xt�����58G<�*G��Nb}� ��Y�:�5�9���r���^c���p�bM��BR
=@f3 ��8k�,kY�%�R���ae.�`�&� y�!,H���m�����"6��B��l�����q����_���O"�!��R�2�/S�K��SO=�1�HiP$���x�����/�h
K�FQ��S`
� ���_��e�����)��(�
s������pAa�b]��Gm�5kf>�`;�!�l����0B\}������TP�rO(����k}��>!��&
ff�P�PJs��;�����$�EyM�0���Ga�Q�4����ha]"9��>����B������q�����4�3QO����E[w0�}���Xd���fKaH��)gfnQ^�{�K��s��:LZ`VM<3�x&���o���,�0y����g�{@=���K�=Yp���_���B�
=@��Ba����������v��h�}i��`��bmq

Tq� �"R�!�Ff�}'��D�`m�����s!��
���$��4�"a�Od��	��X������1c��-x-�?`
`�?�/k<0^�s=?�>5l��z;/[���+�����A	�G?J}f*�(��w�}gg�D�8�7�]�(�h�(�����P���e<�`��������@�~��"��8f�}��Sl�|���I�)�o��f[�	_F(�{��G�����4i��T�%��c����}�9n��F�,�l,���1��z��a].�>��5�.T�=�G��\1$�	I��q���0Q�������#�<������F(p�I�G<s^�L���st�A�/%��z�P,*��2b0F�����,�Np�!`��!�������T�6l�����9E���um��b� ������L�-P������|N��u������|��%%��Oo}��{8G����g
�3���y�P�E����I>(���j[����
�'Q��n��*_�@e�3�~#
i�HEp\D�C��6T�V���!�;�G�pB@����P.��@����#���D�P.(4'M�d��.r�$>�?"�g�g.N������s�����]���N	��m[�,F�H&���\'��r��z`�k�I���5m��������Qd�]w��r3;��\���Ra�Bg1"\��HT�%��c%?�+�K~a�a���`�i���A&�
X�h������O7C���!����H`tb}yB�a����u�r+�>.�Z��~��Y�0�����0�n��lyAzf~1��ZW^ye��y*������#��Yw��s�����*2!/Yi����h���4�4*XZi��	4�X�S�r'��*����2����	�v����O���i���`�r������f�Y�����IkL�����2���M���|�������t3!3KP8�������)�������M��f��r�.�?�.i{�lv:�R�[����@c�e	��o6-����&�m$���`�}^B��T���;��K������[2�~n�������k�����Y���\s�/��a��������$�	�
F*��Vg��L�j.J?��J�k��{�V�Zv���qc��[�
B��7(q����k��Y^��c��L�>���������fa��>��z��u��];��c�������6?��c�7w�8��{��{w�0�s�)�D�P.(��PN�l�R@���G��5J��5�y�������,����<���]v�5Pr�;�\f1�.3[8�Y8�`L�.�$���E$?8�kf�w(��)��Q(�QR_w�uv�g����~Xj!���K~�J��+�g0��HK�kf���P'N�r��O�}��50����m����eu�����:M�p�pf�p?�(S�L�c�0Ix:�z��|�A;k��� �K��}��g�~��}m�H���JR
=�X�{d!��Gl�p�;��������k��Uz*+�-�/\n`yNU�f���Q�L�?s���O������9~�O�Oc���������%�sN=�U7W0u�W���.�����5��Xj?�U;W1v��8��S�B���?�<���_�����9�*���V���g��~f�)�rsW�'�s�J�9�P=��z��Y����-�T2��L�B�
B�A�P�PP~	����P]H.�
F����Iq0����d���:��x�2�%t��B�80�tB�F7X�����db�WX����	%\��=���JN���%����s�8�o���_D����x���J�2��@qK��#0��
���%�O<a
	�}��
f�:��&L�}#�^a8J�����| �5�P���&/x>f�0#"Jl��1�_�~���j������/�x�z�hT�%��c!?�+��E�������<��������>���8�����X��!)#�g�w$�
=L��<�o�a�r�HE9aP��L�HK>f�!�r�������,����^�z^�0�="�������=���ULo����iS/T��
6�{�B!��"4��?
��~�i/4 �z��������-[��7������C���B�+V��7n�}���{����3&�v��w{�=pu|��i^���������W��Z�h��q���u��s�9������u�V��e��v�3���[�n�}�,Z���_����ys{~�T����m���z�+W�}Xx~>��}���:d���S~��������5k��{�3n�8/--�������������������>�?�|o�}���-[f��C���_���7���sON�6c�o��w��������_�KOO�>��#O���_�\9�j����'��-_���59��K~�J~�������P��7u�T����}���v�eo�������[�v��*�|������kg�����g���C���k���5h� �6`��6���9��,�o��y�<6l�-^����3Q����d���?��Y����#�X�4��5z�6�2����v����X�:b)�;wn���JlB~'?�B!�%�X�~�mF�+xc��Kl>�����NZ!R
�h8^�x��o�>�F���u�����G]���2�r�6m�����O��F��d��[�li�/����pA4~�x;�������<��3k�,���e~s-fg<��sv����<���#-��Yx�)����iS��O?����
]k��_NW��^{��D�ql�����v���A�v���38�����i�����gN*��_�������Q���3�[�����{�i��AH���s�!'�� ����u����:h� ���?��x�F�cv
y�if�����c�e	���r����� b�Ri
�$���Y1!&��E��Ji����m���E���(_y�����B!�B���r���E���4��BW����	�	��E����C
@(�XDENx8�H0�F��6B���"l:a`m�*���|D��.)R��"�PG(�G�U�VT�]�~}��g�}����X�����"T!�6��=J`������7�c���BAL�S��c���q"�p~��|$4y@��qC�������\�T�_�5�N#K���HT�%��c� �+��W_}����ZO��#���� l�'Q����Cy���:u�S�k?a�c�$��K�@������9?�p�$	��><�a�z@�6��a���K].5�
<i0�m���vz]��]�PE�B���T�M�6�G�^B/����43���������U���p�
�v��B!����C��q��w�iCP��>~�."U ��[Z�j�CX� �F����)c��o��y�D�z�j^uF��=������15c�s�=�n]�t������go���6��?*����#	K�����{w�pG�eT����^���>�`o��A6�V�F��>�e�d�=�|�����:u���:w����Qc}���U�zu��/�iO8�o��v��y��!�����q������]{���m��f�������;��s6�p^\�������^�f���J%�q�/�X�o�J�3�=s�6ml>]~��6���d�{��K�4B�=���6\[x���
W�N����:��z�

�= �{v�����mp�]w����������|U�T���������S�H������ag��2�ZQ�.�a���X�!|c�����SO��nX$���!�B!J�#���q�C��'���o�q�K�H����i�r#y�;��6o�<�
����{�mj�����
C��M�P8:�����nv�}w���
om��3f��=l��M���.��R�i���(*����#O<�D;�"�;�L(�����E]dg�0a������^2�����X��-8�uY�������g����+��}���31H����|��������V��;��c#�0��������4	�u����p^.��p�u��?����3&Gh�D�2.�e+�m_�Uc��D(���{��:�I��h��=��#vTx����#�:��F��K����k�:\��n0�>�l���� u��;0;�a<s0lu��M=���������3gf���V�f��a��?'��=��3�b��/g�*U�=B!�BQx�|`�[��8�����^s�5vm@����[E����n�5B!�BD�{[Sw�i��{w����[����*R��z�B!�"(��f��
���6l�^���J�*�;���t��=���B!����S�Hj�6B��R��T.��m���O-�B!�%B�1"
`���q�����
=����!l|f���#�B!�'�3z�
~��'��w���HB,=bN�=���]��+�B!��Ga��a=��-[����icc�f�����B!�B����~��������k�_d��={Z$d�]w���E�I5�pj]����]����z�����[g
Ag�}�]�Ik��<(cfsQ�4nq� �V�Xa?�@W�����pXx�t	]Q�fM����vfX����X �u���zE�����
\4��� ��N;����z��\�kP�Y�.7oKf�q�����~Gn���y��s8\�V�V��_x���)�xY��cxF��He/��)m� /�}m���>���}���=Qe����	eHY��Wn�K�.��`^p������g ?��H��}�n�s|�P��M���)��s������^�"��)�� Vb�_��M��u���������[������P'xf���zH~P��:C�O��[$�(lCu��d�`���N:�<8��]�V}"�`?
�����W�����������p8��/0k�kG:��k������26m-��q�E��G�A�L�[��Y�q%��c9�< b}vWf��Ea����V����^� ��qTQ�2"FBx�u�^��-�C=��;w��$�6m�x�B��Ly����7e��Q�5��}������G��:�������h��v�%���"���~�M��{w��M�6��X�������U�T��Q��w���zS�N�6m���<��8?�
	����3mZ�s��^�>}�����:>[����N/$0z���6]8��~B�O��p�>�"�����p�����������k�c���;����[�1c�x������sg����X���_m��7��^����~�~����\9D�s���!������tp����Oz��I��B}�����N8��OH���>�h�����B�"?U�����z�-�q��6-u���N���e<u��s����9����7j��>|��^*�z�Ei���s���$���u���������}��h|���^��em�`:���	�f���:C�W�N���n��,YS].�<�����������������:v�h�������;���[�~��U�V�g���>���s��n�_�}j���������o�]�Z�����	Y�~r��
6M$6o��=��c;�w���D����z�O���"�9��AY�~u������g������
���g�+W��7�l���R2P��2�������N?����I� ��(L(W�G��]���W�{E,�w_}��w�!�x�f���>*C!b'�n`���.�t�����:�zA�����[/�=z�c�9�<����2+Jx�����f�=�4?���		O�/������>�����={�����o;4M��}�7�#��o?:�m���o^��u��9�������_�F���-p�!a�����S�N������7W_}uv��pX���o�������Z��s�9g����
�1m�����^�j�����3���{���E�@� VB�C��Xo��� �0���[�
�Nh�i>���l�pxvf�����kq���v=������6������6�SCH[F��}o�9��C���O<������sg3q�D�/B<u���^z������M7�d���{�i�\/�V���X��I���[W�����?��7��;��c:t�`=/���N��U�V��'�4W^y��&�����a����ol�"�|��Q7�Q�B�=��3r��l�_~�9����|��G�:N�D�D_��/��[n���Ou��5]t�y���#���qS�N5��~��gGT�P��'�^�8�?U�8����]w�eg|�|��9��S�C����>�.t�3�$T�%���b��Y�����rg�����.����?�D���`��uVo�|���P
��5i�����k������G}����b��W�\i�����������{����������z���<>����1��G�!����zo��w�5x�8r����q�����8�����_bg���^�n��7uH���8/���'�x�~w��������y�v�t4h��r����x�!A��U��7o�<Odr{n��[����G�������;�	�	��Q=P=�<�C�I�y���u�]�U�Z5;����x�M��uk�/�
Ov���q�{@^��s�x��R�����A9v���z,��1���yK�.�BG�������Yc�-^��������}��v?���S���e�ow����/��R���x��I���C�����aC[���~4i���N���i<m�5��z�������{����zz�����"�=��AC���=�z�����v�^�����KB����F[�h�"����Y���������W�vm����n�Y�m����@��s0.`&+�C���ood�3��Gf���v�m����~�����{��/
��K�����������A^eQ0s�zK��7��/�����^{���(,T�B�MRg��y�G���s�����w_���{���k�L<�E������p�Yg�N8��3�Z����i�1�G��4A�#&L0��zj�L�X����c�]w��]��{��z+���1�0�u�QvH�1c��5�����K\���eK;s�����s}��W��G��V��S��e;�		�v�����{�����O���[�y���#GZ�����������A����l�$������#��������Y�`��w;�'O�����~�e�]�w�ag�����&4���f�r�����a�f�,Yb����c��[�n9�/H���Vd��N�a@YoF������G%3h��2�$|v��_\<�UTb%����r`�)yV����+��1��)i�)E:�%ob�78�u�`v�+�X��R��i9s�L�v��/� <#��w��!�Q���N�"�'�:���]8��Cm���6�F��(DQA���3��o������{���~������SN9����2e��������
B���W�td�H�����o�:DI��m��f��Gy��Z�?`������j7n��.���K�� fz��5����:����I�Fdjw��������o�N�6K�.��F$y�c9�;������|��?��9��o��.�������/Z=J�
��Yl���t�����'�� �i��e���5x\yG��2"o�j��R��i��������_����X���i�?���Q�H����!	�S��v�jj���d(�]�B�A�b���O���J��2(7n�On��<���vZ7J8�l��t0d���1r"��fthLK'Oz������f�3i:8����2Q�$����w��^z�<��c6�"��x����A,�7��z�-����Q�������� �a����x�b�b�J��F�����I�,�W<���w(�\�F9B����� +V����7/�:�@�u<�@�@�S�\�lE1F���A0�&��g�}6�;YX���C<���O?m�c�%�\b6�����<��`���M?�p��"t����s�����=�\[9���_x�;x���M�Z���^8����g	�"}��?�����������x�{���?�pAB�83��*9(�S����g�l�A�D����A[G�>t�P+�
AhW��>
Y�-��_P�0j����}��rY>��J2*����l�X��|A�'pZ��G�9Yg��!�A&�F�6�A��v�W�~��W8u"�
6��O�;�8�GK�)'�u�r�	:���3��a�	�w�5��)����{��,8>��6m�
��7�@��s��������k�t��v�i�i	����/g���7�?M9S��n>�rv�����z�Q���3@F�%��Y��]�j���G���:�2�R��R�%v$H�g6q�i�A�u&?�h����.�����xx��N
73��S����I�:-FNE��P�b
�!�t�p�,�Bo�&M���;��GE4N�yb���=
3:d��N��A��!$Q����Y��(�QB�5���/\y������4�qB)?A�48/�=H�����{��e��3��gFu��g��@��NaE�
��*� /��2��g��!���.+�A����A<���������c���O����]d���1����L�=��Y;��a����X���8�gn�pj���}�����g�hf|�u�Yi8_���^Q\�Q�)/g�"���6���a�Y�?�e'��6�c��6NQ(xQ��G�t�P��Z��i�i�#�C\/����a�vG��3����{�s�T���
�G'�h8Y����`�RN�<x��}���a�=��V��d1�������[��s82�C=dj��m�
bF��Y���&���0
���p�_qhdMGt
":�5b8����`H�d�@�P��i��<�[�v������;�L��|vc ���+z�%px�:�+��y�TC`�e����H�Q���"�����6/��9
7�#����J�)�H�2e�S�9�J�po�X�Cp����y����k���@�s"�N�g�Q���T
r=�<�T0TD���yj��w�>:=��=�Eg�
�]4x��'/
@�5Q���
a��+u7hD�J��+�D0�0�������A����+>�����jnP�_|���y���@�R��A	�d�(��
f�@<u��"?e�o������xG1��B(
��=oQ�z�z+��_h��-��*�F����!+��"��v��1x�Z��f�P$(KB���?�Fz��\��9>('�B�0 b��5�&uy�=����
��6�:��"-���g� DQB�F[�LH<���d���-����i������L�N�wNQ�)�����>%0�SQ�bl�i�4md������A�LXcfOr�����p�*
��K�2(�"F<��up�F��q'�`\����p���N�a,�d1�{d}����\�fT������~��AV#�����8'3|p��:�S2��)c3g�e�I���x����f��V8]AV��`��pH:�Y��q�;��qD |"�Q��M��@� *C!r'�����x��N���4�t��SE� b���X���������)><�������;��#�8�/\�-�"���P�Sg�a��x.`�$�^���	��!��P��P����b���a���0�~:� (
f"m�)�� p3��gdf	�+��|J������� ��z�����6�;<y@�C���zAgN1m��2e�%_BI�Y�s���{��C�e���y���N���y�u�Y(�y���	����
{�P=P=����/�!����I��H�R*8s�v�6��;v�h�ef�Gj	����p
6���lx1"��E+(�Pj�MI��Y������*:���c�;(����x��C9�~Rn��C�������(�&��2���+\qO����C��8���S�s��c�����/W�(��@��9��!�;�2� ���de6d�h����Da�N�~&\/���K<7
x���`xc&�@_�@�@�d���`���������*��aApx
�l0�Q>����t������ru4�P�E�y1d��`�����`����0�p�'�����-����:O�N���#�;�����m1���q-d� *C!r'��<������( ������u�'��h��P$��G!���S6;�^8���~�+% �]<��y�"h0m�uAeSN�-��A~4�z_����2
�k�O|wS�QJ"#�s(Q��o��)�d�t�
��H�������km����{���[v�������s3�	��<WO�
�K�����<����xQ�x��l%|RA��x+k�����-F9f`�H��`(��2�������~{��~c�S��l�������T��S��g��������</G��
�T�0XeVU�,T�+���fPL9��2v��I�lyql�:�sx@1�<��s�IT|�C�����D[�,X>�#�������M���{�0,DQ�l�c��f���{s�s�<�i#Q
����O�J{������l�����K�@����}�Fw�8ZA&�$+�!KG�vG�T�"hWq`�&rKi@e\����'�������M?/�H�����$G��,�H 7A�C�C�����t06��0*D�{���	��!D�3�.3��zt��H4�@�z�s!�S������P��I����<���H�����:��(��ZYnvx �����^�(�Q���A��y�Ta�n(�����!�F���^SwQ� ���G)�r�a<�Y�a�#��l�(�l�����xzG(���	���=��c���,�����PA��z�z+x��������8��������F;��/�}|L�_84xn{���E:�q�Q�;u�{sa���xf pn��(��R��k�R�x��9Ox?J�c_���0J�
��,LTTb%������}0�W�/�����������9u�Ep�����DZc-(�px�\������@�����Yc��C�E��`��&�s���6��ZzB��.m���z�M(���1�����>"�"������G�?�������g��_��	�~��v<
b�n�\�����N�S�f����=�����A�^�Q��P��3���g���7�)�����g�1:�����`�N�.g~�>����J�Hr���m"w����t2p�;	��D�/����-�u���k�3�Ce(D�$���r�&x�2��+��w���t�"�!�����3;�]t�E��O8����+3��&�=�en���@��kE`,a*�6�6�E8���p�9Q��<.Q�Q��
�cc�{�<�����X������	��!
���I���R�y�(��;�m~Q=P=�Y�������z�}��$g@
�a�x$\�K�DH����xR7U`)3����7��`��S��$�fgL��Nq^����ae�������%�;��2<'�Xd�;���eQ�z�z��_�g( �m*�4��z�N���KA�/��.�����`PAI�a�y)��n�4@��h}I$���z'C�����al��E��>b��t�"5����DI�D�BGR�	Q�0��nbp�� ����avF����	�8u�~�>y8|cM5�/~�@���	����|@���Y� pf�``e}du��q�sB�����������q�c�������/(�"s2����pp*b�;F�8��!�9 ���A�8�_)'��n�y8���!d��d{a����!�w'��r��� 8��L��`�r��9�2+���.�=��
�2"w�j��[OT��A0@�1XO���7^�4���c4�(�PzD<�x���K��@�Du ��#�G8S���t@�y��u�5P�� $"Tp�<C�.]�����"��P��x�@8�g��sqN�d�79.���B�{	�jA��=^U��%Q��w�A�@� V�P`�@z4�<q�QT2x
�A 0p|��'�s��y�����B?��<�.~���+�t�h0�`�Y���\����XG�w���������rd�H:�A������b�S� ���|�������P�)�cB�

�Y,���v�����(�-TTb� �e��'����(v�i������wo�����N�:��rB;N_���u�(W��Nq]�0�C<�,,�6aDy��F�������5��I=��Dx=��C]eE{��@��Pf��2������tA[K_M6E1�,Tf���A?�����K������~0|��y'0�#�[�}�OC���\de���Z~q}&�.�8tg��@[�#�Q��%�q�/� ��G��Or � ��6��u�2'���c� Ws�v�#dy���B��<|�dj�7����NfC�GfB����i-!��N�����pREF��v�:2
�� �e�!��K�x�w���r@7�{��M�Q������gx�E��yjp�F������no���n�!�Hm/^�����^�-r-�P��eddx�z��BU����Gz����>?��-Z���k�������{���^����?����u�����y!��	�6������u����c�=��0�p�^�C��������un��3�=;H�5�T�b���'��N<�D�Z�j�sff��rG"=�:5��+��*W���j����o��^�Z�vx������K�.�B�}�PGj���y�}�2e�x��z��i�&���Q=P=��e���^zz����Q����`�[�n�,�|#���~�}����	��^�>3�C>9�+���'����w�q^�������{�]w����������w���s�=�����{������
Pm�<���c��5kz�v�MG��u�]�c�9������T�������k��uvZ����N�l������_�;�������=��3��@��0aB�u5Y���C~���z�3�O��UW]e�+���^q,��%�xO?����}{�����e����
�m�S���[��
�^O�|�M�~��M�:����]�/�/p���;v�Q����{���":�>�������>��l}E��=��Q�Gy�-�O?��O-D�B�x��g�z����{wd����}�{��m?�F����lo��V��N9��>�_�������O�\���#Hx<k�,�\���������g�������[�_J*��_�� ��m��n|�u����I������4������n�YY��n��Q��=�w��P��7e���Kyq2�Y�Y�fv��d�6m���D
�h��{��wZ�<�@ie��!v������{�pc�z��e������}���A�!�0���)�/����A������M����|���q�����z�m���\�2W%!�����6�Hm�y��v��9��@���qc���=���~
���q�UJ0�E0p,[��k�����_?�g;4��!t�����=.8?�T F����J<	\!�����H���#{��'�F��s"����g�{q���`��)"0���W$��=�X{�����{cG�@� �:t��z����������<`���6l�o��������H��g��*y���7����O����@���~��Uwq�F�����'�|b��z�^{m��O�Z�|�w�5��H�u�0@GA���A([�a:7�y�P=P=����/N�3t�Pk����A"�"��������c����������+Z��������?�l
��'��q�:a����{n[��)jC�!�`(7^{�5���0qF�x|�U�$�	C�xq�1��S�FC��G�E����y��Y�v�w�-����4��;����E;�#��g���t4Pz��l���uF(���K~Gb��A�83o�<�v(S�6��^�N�%��0�}��G��1c������p���C6>;�{���}/��\�sb$�q�pp
�t"28!�<�����,(�I�&Y��<G��9c(NtA'3�~����`�����Ax����4�}��w('��y����oR <F���M�
	��{hS�i�B!�B�C�n�������Fh�hC����)S����/R���������!Dc��-[��z��"|#!$]�����l#�0�9(�B$
B�n���}��v�C�����5kl�=B���o_���~������l�S��i�L���m(�.~d��u����=a�����ie�r��������<`�B5&��y��5zhp���l�2� -�����	v��$���B!��X�y�f�@9��#�*�j��e��o����#�B$�OA��������p��A���1L��kVbrkT�G�i�Ld�'�7vp4���o�����>���v�����&����~��:����^v-�d�2"6n���e����k�"l,��t�Rs�����/(�sM�4�Vx!�B!�(��Ta����s,~�`�5g����B!D2��=��8gG�l�1���s�5�<��y���M�>}�c�=f:v�h�?�x?�1,�3d���q��Y3���=��uF�Q��9�������?���9y��g�������/i3�U�B�F��!��	!##�t�A�l������]�v�18���v��
K|�j��3!�B�f��i�O�nC<4h����#(�?��#;������;���"J���
B�,\��*M�W�n��{o;�?~�9����w�}gn��6�����8��BQ2@�^�J3b��v��v�) �5j����z�����axo��FF�b��6F*�������+��R�F�2e�!�b��9���{���;���'�|bgO}����^�z6M�N��"��������CH��={��-Z�{�H�� t`��Um������qA�8��i��u�9��%����d�a�;�����FIiTO���!������%K����:���k�(�~��'�����6{����]��
�|6m�d��X�w}2���������:�T�B!JIY������#
�vY�v������a�(b�3����G)�������z�h��?��#�o����H$�����$�B����
�(������?�%�\b����#�;(��~�is���GC�q����v���-��?���Fe(��4�TC��	�:��{�9��������MM�<�Hs����{���H��Hq�'x�]t�E��~0o����I"GIiTO���!Dq�w����w�}�5��X��n��-��J��Q��y��'�4�^{��T���7�P���KP
!�(M��#Jx����o�5�z��]*C� ?$�lq]�0)n��N�:v�|�*sDb(i���IrP{ �(.�c����v�kB�J!)R�3}aY�!�Q�?����B�d�%�a?����u���a����,P����r�J�n��<#��^�:���k��i���j�*;g�f��pi�f��&�^H�q��f�?���M�V��SO=e�'�zBY��+?����\��P\Z��:X~|f��t��XP��o?����Q�����[=��=`�nP��� ���!D$h/^y��������M�41���7��u3,P[ R��3f�U��/_���E,2t8�
�U�N��2��N��W\#�_�x�z����[����)>S�Ab��b��U�B!J2����3��)S�����c1m�8�vn��Fs�A�}����/��r3o��@��k��f�m =������s�������Y�����1��g=*���W�������pp�o��&��A���#F�0���7;v��u���~��4iR����`D�'��_~�������e��C���a�f���
?e���S�N5]�t���7nl}�Q;�p��}���q�rq�	�G(������@�$�$�=@�����v���:A�f���W_}5G��=BD�������v����x�]��w����/D�@�F�N����:���E�2t8��t�!;!�-Z�([�?�U����}������C1��
��"G<}=�������U�i���
r52��/�h��2t�"cq�Xe{��B�RA�s"�		p�u�]���Y�	t��,�/_��h���y����.��5j�w�
7x��U���o?o���^H8�����u��������^o��v�N?�t��W^�B���G�|������X���u�V�X�	��������W�lY{���j��)^�V�lZ��t��������-[z����i�f���V���+��_r�'�����aC[/\�u�Y^�
9��'N����k/���.�r��y�z���|�c8��������2e�=���G�i�����/%�=P=I�h�m��
6���C9�{��gm���Q��
��Q{ D��{\�����^�v��Z�jy��O��z����m�����}��G�^!�?���w���[�i������e���������2����r~��SO=��G���}:��C�������4|�p�b���������o�a��Q�F���U�L�����lDe(���#C�Hy�O>�d��������o�09d�/##�
�A4h��9r���U���N;�;������������_?���6m�����R�������}�q:t��%K��}/������~�������H�]e'g�y�����[=�����@������z���[����[�������Z�n���W/�����n4k���g�����;��.k��p��<���b��	6=Q0Jr{�z�8�,]��*��7on
w�5k��:C�M�Q{ D�@\�,[���_����k����1��T��u6"U�3g�U��r�-��,����
�5m��8p`�w��}��V�B�w��'�h�b���s����{��u�������96��d�&M�X#������Y�X������lDe(�����m"�a��o��f�{W�P���5�{�����������C;]������l'$��i�o���	
ll��7����A��*'�����o��"	��1�9�9B�s��gg/��_��
R�\9�\�x

h��"?D�'�z;v�](��:�A������e�]�=�O�'�����e���{�|��Wv?�V�G��pe
��g���{� -������{D~)����I�HD{0w�\[o�w���.T�R���Q�F�2S{ ��Fff�
gE��`��k�65j����"���"� ��U��}�Y<x�}_�����U�V�S��������n���w������v��x�� ��c#Z@n������^h��k/�1���������oY�"cQ���*C!�%zD�����a#��5k���?8���+�n���vp����H00�3�`�Q�%3�C�
<�b��V�	��7^�d�}F�����;�:���+���X����
�>s�h�pppOHD�(����I�HD{����<���
�B����$D*�o�U������_v]�#F�;������:0�@B���������Q����� �CS����X���U�B!J:2��JU�A� �������� 4�%�~�f�L��}���C��;�l�7o��������K��s0PAMOO�Aq,�'�zK����
�B7��v��[�n�3E�h����[9G��*���Ib�����@����Y~�v��=BQ���7�����e�p0�<���vf�o���Jk��o���L����%R�����96r���S8��F�/��X�I�W
!�(���#R6<���

s������g�������C9�<���������2�q��f������5����i��E��h�	�$��s�A�7�1<���	���?��	�]{���Y�h�!-!�x�1�b���9���^{�����f��iv����5�O<�D;HeP� ���`���@�$q$�=@Q@{��
��v�9��cm�=B���Ln(3iO��o�#Da����Zx��Xe�p&N�hn��f��sg3o�<;#z�����_��[~��x�� ��c#Zp��g���C�^�E�Z�ti����P!DIG��� ��_�
y~(S;t�`c�����LC|���m�c�9�O�����
�x���S�
���-=z�h���x@��e��ef��a������>2?����2'4���<"�D�'��>��S�7�|c>��[��
�����u�z�����?�����.����s�=g��sO{�����kp<�!
����m����>�*�����E�(����I�HD{p��[%�������c�~����Ci�"I��"/���Ks��������z�b������f��
d%��IA}�2t8�E�j�����	�J�J�9y�d;V��]�����96���&d��_~�:R9�	��7��Se���,�xe{��B�O��"�y���j��y�g���d�f����N���+��{�����C�_�w���	�^h����[�����=��_�6l�U�\�����F�k����k����w��KKK��y�����eK/48����w�W�bEo��i�{h �u����i�����k����I������'Z=	
 �&M������Km��i���U������]7��
F�yn��f����;�0�R�J�K/�d����T�P�;����8/i�7o��X���s�}��^�*U�3f�{DA(����IbID{��{������{�2f�3��8q�M��@����g��?���w�A�v$��c8V���M����v��y6l��f�����c����.������������=�����_���Q�G�:u�T��K_y
�*([���;�?�Fnu`����
�W��-�����k�����{�(w�E��E��2BQ���G��A��_��lg����m��f�U�V�
�-�1P>������������Oz�F�y�������_{�k�����^����C+�y���m��3g�{�������j��i���iS��?��5k��p�	9����i@��;w��W���	��.��(��O>����O����A~��G�K�.�i�<�Ho��q����g�y����m������V�Z�����SO=u����%�=P=I<�hx���������� j�H
���u�Vk����g���8�2������l'/z��1v?���N:���$����>�F��#G���Xd� �S�f��Y<������V(��?�����9��
7�`e1��(SG�2V^��Ce(��4 C�( �����sgo��M�������m��=Y������-|@AZ����?�z���������d:�L�b=��I<x���8|�p�((%�=P=I<j����G��j����7l�0O�#��^�s|D��5�����=Y��3��O���M<*C!����#J!������|��Wf��9�����O>i�<�H3s�L?����0a����?m� !a�������)[���W�h�����2������)���R�L��d��8���n����W�����$�B!D�9��M��]�:������/����?�O�:��9�{�]c��v���;f���a���m�D�2BQZ��=��Y���p��ivq��O>���/;f���/�`�D����_����?3h� ��Q#s�=��*U����6m2w�}�]���+�4v�(8��	����������EC���g~�a�8,����?�b��b��E��[o57�t�i����W$�����$�B� ��O7M�4��	!�CZZ��[���K8���~��}��x�z�����`��/�Xg'�b��2e�0`��;w�5�i��?CbQ
!�(-�1���,D�����_|�4n���[|@��������S�re��^hn��S�re?�1�'O64���B�H,���f����7��{��
j��e�l�{���D�5Q�/]��<��c���JB{�z�|�!C������<���f��Qf���R�J���A�}����^0������W_5���M�,v��E�I1��B�&d�B!�B�zd�B!�B�*Z�G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"E��G!�B!�B!�"EI{��g=��B!�B!�B!�H!���g!�B!�(�:������&�B!���B�	!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(2�!�B!�B!�B�(i^��f���f���f��%���8��L��������T�b���
��.�������L3u�T�i�&��eKo���G��'����w�9����g�;�W�6O<��Y�v��s�=M���M����_��_~���;�~n�������)S�����c#�{^��F2���;��������g�}�_Ea�r�J3a�s��'��U��{��9s�>|��l�K�v ==��y���i�����<6Z����0Q���CQ��~���f��eF������+��������?�x��m[������?��9����D��o��W^y�l���x����y�,��K/�:^O�����I�&����������L�
����]
��=����;�:������ u.Q�����m�w�q��,����LJ�{�x����;w�l=�P�Y��F3z���+V��~��5������^!��~��
�B&��m3���3C�1���7��W���'�|b���/�B��L}��p,���sm����[��8c<��3�����������<��D��_��ia�;���.
�X�#xl�w� �"�c��qA�\��#
c���z�����f��u������LJ�{����s
Q\��G$
����w_k��u��^Y�t�Y�|��M��FJfQ�l�����7��Y�t�%i�"�B8��y��������v�dq�����r������	c���'�_���#D��L���J{{��P���="iR�)���u�y;�������^y��W����[n��H��	A��R���NN&R2Q�hv�B���S��
�v�g���C�w�a�6m��{��(�D��\�r��K/�uq���"7a����-��{;z�(��#�)���B-�]'�"/�t��X��e����4�hc222������(*��{��8��iQ�x���BG	!��C!�z�"�@@XVR2Q4�����C4�N!���i���5�*t�E��C!�i�L�"��y���f��%V��W/��>����G�\�����+r�o{������s�o}��5?�������������Q��
M�L��5mz�7c�3e��g�4��*U2
40'�x��}��mZ���'��v��
�~��-vP��=�|��f��6�+�~��U3�76-Z���!~c��_mV�\�}<yq���N8!j���3��n���l�y�o+V����7���k��4���I��U��0hL�3f��3g���aCv��<Gy��$x>.��B�,O}��1�B�8���r���@���O���s�=M���w�F������w�}g���+��Z.���<��\`�x����7��k��6db$���l��=7�ynG"��D�������o��.{�������k����� ��Y�l�Y�l�]�3��)������H���3g�����������>��3��m/������uk�A^��\�������5��;�q�gC����o��s�9�����������0�L��}R��"���y��Wm����g��M���s<����|N�{���'��!e��w������_l��Z�F
s����>"�r"QP�i��H�������~t��Q�s���s�ocl�"�s~;����|�-#Z���~�)�-Zd����b�������9������Uw
��4m8�#���p���s��S����	���=?��\���x��B�q<}���S����G.CcL�3E��>�������Y�f�����gXG��7�5��M�<�7��`�J�,�������/}#�\�yN���o9G���m� �>�G	���^{Yy�r�����9��$������"�����sPN_|�e��:�1k�.]��������=zD��%���oo?;��"��/y��6!�mKA�V�?��������#Gq������8'�*�����]�=���%�n��`�@������N�0�������wl��S';6	��N���cL��O?���������k�����N�{���t����e��(�
�C�mG,���0:� te����3��r�o��������U�b��i�����k�@��`�����N|�A�%*�F�#���Gy��9�v���A���� �3(s���=����Hp<���;��g	O'�@�����}E
�8d�k|��"�����`������tpN����ry����,����v�p�B�~���gz
B�}��g��{vy,����SAA=��S�@���`������c��({�!�x�����;B���>j�8���]����n0�_
���
~����1�sm/��Y_|�E�F{��<�;��������Y�j��
�A�Np�kP���`q��]���o�m�q[�]{
�
u�:J_�/B���'�2����?����R��7���'�L6�_�E(�H��k���^z����w��3�:��������]������:�%���}�Y{/�K�^�P�"��O����;�������~<��O<�{6g��Fne~�A�</���/���0���^y��|�I���;��"3w\�<@���E������+��oy��"�3�,�Z�y�������g>g�R���%X�y��S��e��!�J�;�g$hSpz�������u��}�������3F�W�����{��	���o���{��������N88�����`�HZ��Qg�G��\���}��6$�f�w����G��1�[o�e���]���(?�=�?�q�GR����w�r�n`�T~�X��G�<hh��%r�YgY/,�x`�Y�����BG���:@Q�7��h�H����'���x[���y]�
�,,����ss.:F������W�v��'�l��g�G9��r�0@h@���gk����W��y�  ����%$��������DA
<e1`!�W��&�C:�D��1""�q�(��+�c(�>�����H�\�0�1b����#u����
���p(/��x�u�:K��=�[���S�oU���A9�� �i��f�f���u�)�����m��Na%�x���{��8?��`���7��w�w�| ?8�kr����r��^hG�����<�����������5���B�����2*-P����1y�7m>��L�����;�B��N?(������9[�vm��V��0�������������������"��������39���;v4�s��+�M��
�vpAIH_�}p�Dd���@���=���M���,��^�}3F�<o������9�{�|���"���C���oD�"O�5F�m����\����/���y�_Qn�%���:V���e0t�E
f�3[����1��z��-�1Pd�#�}��`$b�N��N�Roy����:�F
t�5�pm���;�M���ROiKhS�����6����������x%��w����'�xb�9xO�'���{��6����"/8�s�6����?��\J9�����yf�����Q~�{?���(s�<������f?z5�������":2�����������!P��������k�����P�{L[g*'�G�r.^:|��$�����}lN�t�.N(?����
7�`����&;`�s�!�����i�]��ot�GAJ���n�)�x����D�r9QF��@�� A������
z�+����<����i�Li�\�\v�e���B�t.?�!��O>��.���/��P'Z�`PM�A�EYy��W���r��3�p�(����d.Zx��{��#u=�>��������y3n�6�:K��=�}��r�o��"yQ���
�1�N����Q"��9�Q�"���;���p����s��'\��5�w����������[80f�>��r�~�� �7(���I��r���~�re�{�UW��	���+m���^�=H����B�7�8J�����������(
iO�'Q&�:;��ki��3���	�����~��G��"7Vh���GY�u��c����wd\�w�D����x��������9�w�n���nQ���B���!�p�|�y��19y���E�$eC���l��y��z��B0_]� �&���������I(k@�`L�&�a��Q��o�9��qFb�/�p�,������1�}�~�-���	s�m�E������;@�_�)��m����6��A������w��E
��s�^�:���;���p]E��#
y@^����y={����H�x��Hp�`��\xf���G���;���G�a���S��#���w���_���.T��G%zD���`j)
��6���p�Yb�F���H�pP^�Q���;"���*�u�������!�(�x���gx�9�{:�I�`
��h9x6��:>�	0�rBIQ�@o�b�`�r�'B
�`���N�	x��+���hxc�	�k���������T����i��D�1����Eu�w.�}�;�t�~?�v.�&P7��I�f���sg;p�-cp�@E�~�<����(��w(8��\�{��y�����3 �L�����o���f�D��b��
:S��U�~B{��8
1������0A�y�w��EU����u��l�7p�����Z�M�����g�e'��;�����s�Es���hp�@���G��#c0��=���A�J:�n�3�#����>��S�����W��.�S~������A+x��Bnm��}��<�+W6�$�Cn�	��(<_0�!��d�''�������Q\;�e9�n�T�yy�x�s�u�u��s"�9��OE]�]��g\O=v����^�,���r�-a���1G���i#"�/�mm���q��Q��.���}l<C$�5C�.�	7;�q�<��ks<;y@^�w�sq�����w�kf�D��<��8w|�v�������s����X���6�w�z��-5.y!C�(0�4���G�D'IiI��n��v��D��h_D�
4��#���������y4�����o4��G��E�pD�������A���-�`A��m0�p��(�pB?��+�D�`�T��O����m��f�������EK�:�q��#��\9��0��v`��BE2�����(����+��)�@�4^�K�z����8C.�q�J����H��f��
��k3Q�E+/�(<��E�B�T����l�;�7QF����������}�?�����k":02\e����_�������#�=�x�w8����Q��vhQ���������el�<�8�9���d�h�����u�C����5����w����y6�
Ux�:I/����/�����z���!��hc�U�p�w���W<�o�P�^�6D�J@=�m�����DJ��f���� ��dw���p]�O:�'���3��@�G?	�g�p~�����K�~"8�@�kt���70D
�2���AG�W���6b�F�`c%�G���P�s�=v�H:����s<N e#
8F��/��
Dxd��N(G�z�
�,�\��*��]XD{V:5���M�r�|u��H8�FHt~  �,��%����mH.�����������}Fs���4��zK�@��b&#���(����9���3���g

�x�9S�+�+0U=��Q�
���o8\+F|������:������7=��m;)��1T!J
��(@c��'t~��E��}�������@L?��BJ_��UA�g�@�G[�|�w�DOf��2&B��C�sA�rk�E���9�`�(JC2��	�	�3u%Z��DR:������f������T�u���nA������8u6.�PW���c6��<��/m�3n�6��H$�O�1N�N��i88�3�D�w����1<cFg����y��m�������-a��[�Y��zP�������!C��=�����������d��(9��#��W�u����B�A�5�R����
�:<:�fQ�[n��4�v<�T0!L8�R~����''l��$x&�����3���K�)��<���c(1�9o��x��9�@�s�t�mBppMh�D*��0��{���r�&N��-��E���R#�g/�]�7(t���l.��,�>����D)�cFa9c!D�A1I(�X6g���u(�h�K���J8����*�l��c��d:�>��_xh�pH4 ��Ty����
�A,
�X��Fn��������:�B������n�^
�3��XE�A�c��XpNwl�AC[\'x|<��7���t:�L�yF�uc�"����F�������,/<��m����k��/X=�SO=e�u�Q�Z��#J�u��F's�E�u0�i�hPb�a�`B��
^����W�yO$�,>�tJ�?���{��f������.�R2G�'�s����O{��#�����D���u%�=dp����p�g��_y�;�u���IU8
!Da���d,[Af8pl4%?} �.��v�N����B���^z�:)�9J��9���Qt:�n��z0?
"��).ucA0t���:
��9K��4��f�t�}d�xf������)����|G������-���_'�x�{�7���E��.���u��7�B�������Q2�E�A�Q*�sF���������?��"��wp(��$.X��/�'z�=6D����K������mg�G&�����67�x�C~���uT�1D��0x�E"wx�]����f��B��'�p���u����\Tdv]iz���8~��w�����{�����
�����G��:PB;��������
�v�X�b� L(C�{��b7;�����
O�Fq�c��rHv�(BX�:
�='7#_!��
��3: ��2�$P���;�1U,���,�p����Dff��X7���B�al0n;��c��W_m7�"��:�;��1�����g!rC�Q��!E!��k���Y��-��L�d��DB'�<F�t�����;�A�S���\;��B��n�A���E��_?�&�G�],6IX�d���B&@�J�����,�Eg�����e��=p�t�mBpvV<�tqk?b!��P��eq��u.�?7�.����.���3�47�x���Q
�(-�G_�M
�'���v�q�*!c0�0���N;�4�LB��2l�vF�pc"w��nF���8>�p6��q|��f|�HQ�1@~m��u�lk�(�(7�BF�'dRPvC)��o�;���|Kxj��)�i\��6 �P���32p��.S���hk�'��X�x�&�=�
�	c8�s���K/���,Y"��)B���"7d�%���_�*��x����(�V?��Sl�-��>D<^yA�<��H@��Lc����(�1N9O�y��+"AG��A����M���,Y��R
���P�+�u������~�o����%�$��bfOP��� �b�
X�2V�:����� TT����&�-X��~vu*V
��H$�#W�,YR�0wEn����?�8��u��=d�<��2�v��i���0����O�>v�m����G!

�'�|���NE�G!�����b�]��������Tdf�V�A�����G}�.TM��G~�+�6�����g�'�h���R\Ec4���J���9�)}��'�{p��~��w���e_���������Q���J���������N�����@��m�����c�p�NN/,3:�y8�:�d��02�g��C�#F�>������������? ���7���G�hh$Q��1@(�������h���>8���~�m�������}s/<��hGQ8i��\�s�������k��`:�+��^���JE�P@�@GX�M�Xp�9�"\���r������X^�6�Q<r8`�}�-P8���l�&��nFF$0�`��}f��Ja���A�c�;���4�(�Ld6�|��-Zx�	���h�j7K�{H�� ����Y���Rw�c��!����E�����)��Q�29Y7���r2��y�r��g<r��sc*���7���A!��'��:����/��vJ�p����?��Dq�c�}���g���e^JR�!�;�J�)%������V^3��9���A�wr?2b���`3u��l�����������h[f��i���zD�(L���>�Z��q?��?�B���QJ�ad��?Q�1NEz>����J�*��,#��!C�(� H���A`�'�$�!�R��9o-2&N�/tTN9��������;�u�tP�����x�5j���>j����3�������A�
?Xnm^���d���	|�v����: �#�P�S�@�MK&�J��p�a�0�����7�|s�Ypf0-Z��~G��x;�	���x�D2���9��a�m���J2����=��/��xW���������A�=c�"��nQ����������Si����A ����B����~��~�6��O?����~���)q.�
�i#��y���@���,����sJV�G~r�L��i"��;k� ����`�Z �!���>��p'����j����:�0"�����y����n6�;l�0k��T��8qR�E�puN�yC1�`�A�����!<��_�)�^Q���s��G�6�w�6"�,������	��'�����F�g\��co����x�����A�T�~}�<8x3��b�ruN����q�����C���(04�4Bx�Q�.I~�����uu���1�������E<�_X��������w�����L:���s\�{@��G!K����l��t,������g�]:&�b��y�t���9q?���L�b���w�;��fv�!8��3<�<y�9�����C^��r~����,xcD*���$�2���UG�`�#o���q���/�� H����)7i�${�y���?�4<u�zB�`���Hs�(:tx�x���;�P��{�D+�q~����G��"�%�P~��U@�����;��.�����.Q���(�z�����e��1��<�t\�F���/(�	��0�ys��k���R�<��;�'Jo���."�cX�w �1���������n���^IO�J[KZ�U��G]�-s����f���9����}���Y��Y�<�3�������a���>��[{���0Q�O"��}�g�9����r%x�yF��~���c��	'��mP"�P�y��H��0?�g����Xe\�|�k�<�����3���%|7n��c����Y��~����D@v@V�|�����*9/�3Ne�,B?�_��+��q������N���AB_�����Zn��;���9��8��C������=/}�#�p=�
y�~��d�r
[x��*7�Z����D�_y��l��:������G�|�����?��zH]`��|���N#D6�N���g�q���p�eDY#�q��6��<r���C4���~��5�S�����l�[E�Ob��� �Fp^�u�qr"u�g ,:��������;�;@�d|�y��y�1(q/���)S�����]��������3�cn�J8��<+N~���;���o`v���c������
����7yQ���������#�Q\�����������K���[�E7.�Y�M�6�� D$d�	%���Gp�W���J#��
��9��Q�����as��B�8�.i9���c�;�^�����X��s���9�:�s�9���������0�>�������3��e@.h��!���y�L�$\������4���<��&�k��s���b!7!��N�|s�B��:s>s��s����l ��ABD��9Z�P�x� D8!��N��`���p��{w�q���}p�X6��+�`YsO�����1p
����k �X�x^u��C��;��'��z����y)f��}����;������X�:����q�
��D)\}�>Qp=��{���w��=���M�v����>c!?��w������W�x��$�<�VepC�|�#�)W�=����%�b��g/D~�~�^���a~d� �������/�����~�c�������/�8� {�U�4�E~��v��!��#0���c�E��`C�E_��p�������(^�8Y���5��s?�52g�y��+�}I^����}�\��IDAT����$�x^��~���q�G���M�rC�e�[=���p�3�p�&�&���B�r��rg�N}esD�'�c�df6�������E]eCf���Sng�u�u�,#����r��C���s������"����6��F�u������i7>��P�\��p�%��N��m~G�VnP�([����k��1s������0�B���qdW�r���Wd^f.�����[@���o`Gy�<�'>�����K
�R�{���=�qD:&�F]?��C�q��A����A���D��sS�����"=��n�:������w�y������g�u���\s�5����0�����$�Cw�)��0`�p�tu�-�J�����*�"���u�]�x:3B��Q�|x~����q
�D~���Z!E�KN\�:o�`=A1����K/5_|qR��� O7�u��o���,���r����X�."����P�{ED=ru���������s��{�N"��t��)����!4�p�C�-��=�6)x��N���y�A�!�J�{�������?�r�/D��~BQ0P*!������5�+Pr�`B�F���yss��W���:*�<���O����Ey��1V8F���{[��(~���pn�}����
#�����]vY��y.���v��X�`��L"�����g���g��r��G�����$S�:�,�:*��Q�����\p��Y(w���F=d�|�q�e��X�������>�:Oq��C��{���wWw�o����w��;�J�K.���-r6�7���hS(O��z��LA08�������]��D����yv�/����zl�E��i�g�7J�{��)R�Hi�;F��/���}�8�p����gg���F�BZ���^!�Hxj=��s�i��v� �B:�*��Hxx��	0^����PH��(��(gX�u8*J��:��S+�)�����q(e�����8WP��y�}����v<y����k�����o�y97����o�e������(�{����[8\���^�V�<�����3�S�����)������<�g�X����_�+�<��,���-����(��9Q�q����F���+bV�;b��k�������
y���N�z�����
��<�;8����]W�W;N�p�\;�{��{�����r��H������5y�(W�"d�BQ�`��/�`�t�[S!���G!Diu ��2�� ��B���n�B!J �{�[�PiB!�BQ�`�)�K!���B�62�!�(U��?�|��v�Jb�
!�B!Di�PQ��]H���J!Rz�B�O�`�k������w+�B!����k���m��r�i����W!D*�5z�B!����#�����g!��.�/��x�=B!�B!�B������;�,#�B� d�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQd�B!�B!�B!�HQ���g!�d��m�������q�f��dc,l��7�y��[�H�V��k���&
J������Oz���OBDf��_�u�����G��7�U��B��g����w���7��F������GF������M����=B=��7L����*hyO>H�l��h�*��B$�/�N3�-�`����[�)��9�asH���=B����#bf�w[��1��o����F{e��DQ�u�"�O�s�o���}M�s/�����m���[���-��Uok2�"'�}��ye�{�������������"���'w6O�d�������{�IFS��3L�>W�;�(Z�
?�m3��H�C���v����V���>��!�H+�[m�7�����`�l�_��w7�����G!RM�13e�6�S���k�f���e�4�S����������<z�h��Y3S�NS�^=���f��u~��l���������C�i<�@���O��7�)��b�
����^{��'�x���������v�Zs�9��'�|��Sxx��&����������?��]��.�o���Y�|��'�,\��t���^��S�N�����N2��s��'�tR���6mj�}�]�m[���Xxw��S�����S��S'�QvA�,Yb������=�'��'���g�uV��;������H�s��v�i��o��B[��a��kB2���m��k�,���U%���}����?�x��U+��c��
6�)��r�Js�}���-[����w73f�������f��6�W\a~��W����_��\}�����^��"�Br���dnm���m��x�g�'EI<u{���������i��oo�n6m
�i���D��d=W��,�r��O?��#�������hVo^gVn\m6gn1�����m�Y��w�5�p�c"2���d��������+�����_��[��-�;�{��i��u���L�0�@z��~�H�|��g
\^%���C������?l3��J����z�qhKuhQ������c����[��l�:��V02j�j�w����1c��>}�������|��f��v3/���m���kg��+g���?�����;��
Y����������������.3���3}�����Y�l�������������c���K�Q}���/���u�[����������e����x�.e��:�����T�P�t�����s���@�����_~���x���u��f����~�;�8�����)��\x�#�V�^�*�D~��G��K/��i?��
���,��������������-v���d�]������.���8���A������I�sq]�<����>�=�\��_�W^y�,]���p�	�L�26m<$����s���e���s"�O�2��5jT�2"����M�&M�o"�-sg�-����
F������N���6�/6/���m�YR��?��*�ho�>�l�w��Q�OD�i��l:���z���i��:�����a���r,[������M3g�y���A}��9��#M�Z�����������?����1����������������6��
3�����aS�X�6��o�a
��H�#��o�i�����,��x�G��v2�+�w�����<�)��bj��i>��c�q�VF-0���`���`x���l2
�����l��0��,�����c�^���n�F�an��&�H�99������c�6�R~�E�\�ay������sv����y�E�Y#Q��em�RI(����[Fl�N�g}B������5�	uF�QG�]y�������wGx+Z����+z�g��+Vx-Z��B��f������{��{�������������:o����j���{��
u4v��^����qp~�s�	'x������B��7|�p/$Hx{�����x�	���#s�o��2	�27���9>b��d����/�E]�]�c�k��k���A���3����x�b��c���w�n�$�����cz��m���
��^���Y	��/���5>b��d��]��2d�W�n���6n�8��������"}��]���������~{_�~���7>��\���-[�x�]v��\�t���Y3�����B����g��?�Hl�ZD90?�?�������������U��*E���+�3�8�k���7o�<�/��?��s^��
�Q�F�)=�������w_�����sl�N��U�V�t����r��������[�z�7e���������*o���6-���?���mk��"���Q�������YS��_~�;��#�Y�f�{R�x����c�=������WH��|���{t�7u�T?e��$�n'���yg'O�l��s������<��I��C=����o��;������&��6o���9�I�w6�z��w�{�;w�w�%�x�5��lA�E������j����6OI�p�B;nl����n��s��=���;��u������N��~��6]i%�M�B��e������p<U�T��k����q7���O>1����9������x0mO"r���xL
��88?�!|P����������������L��X�5��'��Qv@�6�q<^�!���%w����s��S�9'S�����9AP����!���l��c�>�7w��B�y����[n��<���6������>�l�p�y��\�����S��8�WB2�'$��{sR�k�����+x����z���{��%�E�o$����l�����z�6l��T�\���x��n���y�f+#����n���7��������S.<���+��53��3�*�Z����o����4i�m�o�����9��#��E^�k�����D�u>��s['����{���Ja\��:�
��@~�6�`Ls����{r������E�Cfc6y����9�U�feOd2�
�M����S������e>�`;6��W�[�NQ�E�
�����R�)i�������)��(������������/\��B��7o�MWZ��G���B�K�K�:u��F��
;��15��
�<� ����Pd;D:I�Y�t��p���gw0(�CC�8r�H��)��)��=�I�����k\��t<���,Z��&�Ex'J�^�~}�����%��F����w��7�5)7:� �!;��dJ)uf���6<Fi%��KF�9B�B\\������4�����
�1��b�&��P�#��*���F<y���s ^w�uf���V�-(��?�x.B�!(?���~�����\������ ����;6L\���F�[�R�lC���C�����O<aex���8mF|�?�E�_����x��H 
J�Q�F��-dv��o.]�^�l�L�1�A����S�N9�"7n��(�u�W��e��?l�0��t��z�U������3���O�~�\'R
���K!�������s���)}��m��������� �'���+�}@;�o��9�[����s�p!�g�>J�.�s�=��O?����@����{�>~��V9�~~'�i�zB�DA6������I��S�]:�M}wcU�2��z��w���X��{?x������pM��p�Ax�����1b���uc��c���#2��{������V��=�D2�+�w�:���PO��v���J����?{w U������]�;�AT@:�V��nl@TTQD��A��   " �)"����]3��;{�e�]�a����c��s����{��������8�����;��s��cv~g3�9��w�s�2=G��}S'�~_��M������j�����c�=v�����L�o��N+;�E�y^�0�;�>&����]H�����mDr�pq��8x~����d�s�y��M���I����C<����'N�y3�a����E��r��`nN�X��_4=��8�1�I�?�llc�H���6f�.����/S�����k�?�����XQ��+�7�p��iy���[�sM���'kF����'l������z�������x������$X���>�?��yS���W�y������'�\�����=�R����_���Wzx1�l����!���k������Vf��(+d������/�Y�c���k���f�?���~�8������\�H���dtx`�)^�3<�����=
890�(�<����<����������,6 q���~���#�,����	h�xl c9��3��U66��������]�HC��:�?D
d�Z��DdC��`6�3c]����50�\�^��������a�
/������7�������x���o��c�L����w������p�El����
=<����=�|��FB66�!�K~��,���uv��g��5�}�]��8p�i��u2��1�{=����[���O~��?����L_k~~�9�{�2,���u�f>���2?�|���z�Y�g>��m_C!�����]���oZ|~_�9fcvjl�eC3;�dt���~�y��v�Mi?|��|�#)?����?>��x^��������O��d�o��L~�[���;`~�xM���7on��>��=���lF?�����S���n^7v�K�����s�������x�f'��I���_��y�X|^|,�g��E~g���������\d���k��a�G�P:t0���a������a����z1P����hcxA�	�y\h������2���r/������G�"��!�H��	��D��O0l\��p���cr�+�����������G9��-/��Az?������'m�M���?,��M�AV���� �d����{�/������8Z�b?/>��0��Y<��7�y���������v������^��c8��|��ye���J+��H�7�1��)"��8���^~�e��iDx��7SK�Q�����-�58����Q�3���o_��t��������F�5�c��1	)����$�0���3`� �?��p�)�X�0�����y���:{������a��7>���xl cCkF����!�s6Px�f������R�����X��=<��������%�������`?l��g��S6�������6�����������u���lT�w���e�%d��f'#b�0�f�`�e]��?�������!?l��g��Sf?�����������s���H�����0eGsdAz�"���g��k^C��=���f���w�������������w6-	�����Y�c�79�;������7mN�pvb�o���kM0*�w.;�����;��X��N����	���x���6b���3+'=/������)*�;��!?;��@$`��wR�	��><!�G�����X���/��*V����O�O(�<r�����+O>��2���v6q��s��e��o���<^V����uL����oa�D��c��o��D���<G28�������3�!���g�#4y����ml�H��$�`e�=�Xqd�=}����y���FP6,�s��?�h*��J�����z��:p��4
x��F_x^���(G��M�2��|`����<��5"�|�kv6�q�>��X�52�$y.�o7*xne0�u^����s
�6��LO�c�����o6���X�^�><'����|�6�����������7���A ��g���5����'��|����.Gg+��i���x-�^�|/�y`=�uU��fC-v������uO���#�����J~��?��]g}������
���N���lfc4<����|��J�����l�>6@����#��A��X�g��o��y<����r��m~����u��vz����u�[\���k�/�m\����b?/n?��b�{����?�g��������m~gyM��
<��w������6�z�hv}g)�����]�����#O�~�=����_�6��I��);�E�Nb'Gl��gJ7�����Eg{^��0`�z,?��L�������\)��x���:O�a���<��{D������R6�r�)��2�}�<�>���d9�=�|sJ�ogO��'��.�������N������<�M�����/H�v�"g�����]Z�j�2A���,/X��mc��������z^l�a����~jF��r���)��>g�{���s$��3����p�o�����d������B�Te�BV��2��:��������*<%����1Lu�4�"���b���.b�T�FngQ_c�cP��r.0�Df�g^���A��;h�q�)o8Z��v�`��A���yl����o��s��m�[�{��2N~��:6��o�/ldzj��f}�x���������(�#��x.>���h�����,��2R6?c�,?#>���k�@���x��?��r����a�N�h6s$�I��g6��6�D����p4Y��Pj���������g��ui�<&L�� �IR_�\��~�y��k����Uf�i����.<7�}e#�o����_��l�Y^�qT��c�I�y8����Y�L�����"v\�}g����y^�����lF;.�w��M��'��|o���m���w��E2��i�Y�m����s����V^��|�k4>O�y��3������cX!b>6�b�=OX��;�O���pUF������y1�S��c��l|I���I�R/|<��c���?���o��|j��u��"��u��� Zj��� a9�Xq?6���J0�+�����v�x�2�C�����;��_���mc���Elz��w�}1�/��fj���ft!{���
Qf^;�w��"�q���?�=LO�����O��]f�?�|^�������S�N�B�������|�?i�S|n�����l�Zi��]������<������vf<u���5��?�l�@�H���bFA�1������,��leO�W_}����GU2UG��A��E�e��������a� ��������
(��<����pa�q6����,|���M,������5��}e%}g�l�~9��������L�����Kjl�������<���f�5���~��#������X��h6���83�KF?��fa��)�R����'�6~�\f���k5^�qa�+��8
����/���Wf����ml������2���r�w�����s�}Sg�0P�}��;���aN���SE��'���������2�S�E�V����0����f,��=�	���y��y��Rk���e�6^�(��H��7��{!���Cf��5k���^��'^�0�0�6��3f�9����S<A�R�������H4<����$5��z���F<�18��N�R��x?_S�������?>����1��y*����v�x���
���`cp��-G�����q�����O>���u�`=�5��������d������`
^L������,�<��|8q-�J0�{Z|�|���]��a{K�5�4tp�#����@7��Sc��8��B`'.���*������s�<?�Q��ZS/L���lD��y1�8�������?����}{�����8B�����g�r�}<osa:<��N�E,���@�`c�����_����)�����kL~��a����uWv�H;w;8V�T�����W�ze:���&MJ�������+dr�G1;�3����g�������2���Z���X|���d;����Gf�����on#<��~g����%�����gF��� ����Y~�x|��L}��;�}�Y�iI}��;���aN�������|�������e('���X�2m-;�������sv��2��������#Y'�c�3�k��J��7�@�6�����$��S��!�' bZ7�P3f�Y'�0X������oHb�	�����}���x��h����������=A�(�J��}b�_���3��9'�e^`$�����&�%�O��a�X�����������iN�����0���/�����B�x^���+�
��	����(�����;�������+�h�x�R�����WF?LS�J${�8>����Y�`�-���N_���l�d���0�9�/��/�1���1���y�e#.8���1�L�����u�r$����
 l��c�6�����/�<y��,6����7�6��>��k������.��>�;��g#xn�6�C��}��
3�k�6��;��0��I���:GN�5��H�b�����[��S6������l8c]��;h�!����7�u6��G��W^i~�y�����6��X�m��y}����a�Lg~W3{����6��=�'���N*|���`��-[��+3������w��/6������	9?�;����/��1���|�Y^cs��x�����lf>���;�������
���>��������������� %����^��y]��������u[����sa����U��Wx��Z�l����u�l�p;��r.�H�p"8[8��c��'-�I�'��aO�1���'%����f��!{O�"�_ok_o:��x��L���zd�����C��"���c/i^$��+����7�C������Q�$�o��Z�8�f�l�G���i~ ��������X������X+W�4't����M�������5���e})�����{d��)=,������������Y+�^�e������k���.���a��;~o9?���x!���e/^~'y�K���h|�����	*y����2������7x�~1��<
Q�Y3�~�
MP�P�l2�����K+��b��yR�������?�+E���+|}lI�9�k�^��x^���1%{�=b��=�z��m~�9��SO=u�s�Hf����������"iyJ��(U���l�e��|�o�k����S��[�F6$1�
�YlL�y���<O�a�i�Y�\���cl4c�Q���c��h6f���4F�m�� ���{�s-�<�\�z�����'�F:�18g(��������x�@9�~6�1�
J��c��;��
_�@�k_6�����]�m��i�4��{>��PL���G>'���o�
5i��<>_��������8"���>2�#S�����V�^��m���k�9B����Y+���|����~����K�=�g$���r������#��^{~�9�?�|��y�����{������=���T:|�u\~'�9��+#�mn������2����:6������-Zd�6��n�MF?��Q�)L�H-���-Z��G5�Ef�ie�����e����������w�l�w^/����o|O|��5kL�"����8���n�]�G/��-s��s�w����l�x|��[����8g,��4��4>�������o�����>����� �~�����e����Q�C��e�����Y.����S��sQf��f>7>&�����2��a�������G~�@�dXn�0��^����e������G��q":�r`E�?����V���&����3�2�PH>���)c���|yo���JR~�+���f��'|^t0G-�}?��4�?��|�xa���L��F��
���aOGV�}r�7�|����N�������k���.����sz�/���������g�hb�r�z��R)��y1��Fw^�1��K����b�rB�'3�	�wie��83���~^lt3f����1S�|;!�����+3��'U�Fxv���?1�8s��r!��9���ac{K��1��l�b�1�f����a�{��A�Av6 pv�b��Y����F.��������Yb�-x�d�6fp^���w����k"~^���?���_��<�9������<���}�6����������p�X��c0�
'?f#���;X���-��Xgb
m��=�h�l���6|�3��-?������X?�{�F5��������$S���
�|�	�uY�����g��
���m�zlF>��i(M����.�3�9���!�
�ld����/��l��x�E�w����p�6,���|��e�������^�*��ye�;��d����\��l;a���_���oy!�s���|���e�*�N�;��c��#<��~������v\��lf^>?��L-��E����9�����r�����';�E}^��2� �'�#yL���=ag@fp���7/�y���7q�d�[c�ps�P��@�@<�L9��S��������vaj�A�/�Zkr><	{�����p4�
[`��*gw��g�7�������M^A�
��5���)L8���/v����:k:������~k�e��
d,���3�r��!l4c�4{��!�U_n��D��
<����e����LO��lL ng`����	6�0P��.>��;���c��{�)�Xl� ��y���G���=����
h���;��}����(L��{�|n���!5��<�/�Q�@�^G�b�&_O���M�{6��q��}������L�V�`�]���p6��u�������c_C��>#��^�����O�4����Q��]����'{��7�{����3u?gl��}72��f~')���>���[xL����!#���~�}�u>'>������}�s��||�������_�Y���������3�c��o����=3^��.��.�`�������������/�y�	����v��;{!�Ez��\��8>�s�����X��yL�_���^�sPN�@�d�=y�=9�=r�(�#"�>z�-'zD�!K=6'����.".'zDDr�KJ�R<�#A�(�����E������
��LI��%l��=��)���X�.\����C��%�f�������%��l���[�^�6����K��2��>:=������""��F�H�%&{���D�<ra��������o���$���HX���v~�������������sx2�;�zo��@8?�*��V23��^��������Cp"!���y�Iq�T�=��������sn��$.]��-�-��^�(�Z���p�u<�0nx"�y�9��y���^�> (e>V��m'vc�����q���rK�)p*���Hn�@�������{
��7Ob"<�����t������x���Hk�<q2w���(���m����������DD$'R�GDDDDD�=zDDDDD$��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""""""""��=""""""rA����;��G�����a��j�
�7>cy����Rg��x��;w�l�i�������)���7n���zS�]�v1b�)���W_�I�&f���e�����3�����3�����HN�@O���x��Q�`A�l6������={�)�����eKS&�R�R%����*�R1?~<�W�n��1�|��������_�d���l�"E��_?S������]�v�`C�.]N�4m��Px���������������e�L}&��[�b��y�T�T�����0�������&��m�6\w�u([��	������^���e���f;�6,��={���&�������/��=��c�5j�uo�E�a������+M�LDDDD$��y/��5��`{|�"��C�u������o�A�r�0c�\z��'�^s�5(]����O�h�����;
.l��a��A����+�,Yb���yss_�B�L9��p��o���������������]@@�)+"""""Y��6�x�	k��p��X�|�	Zp���C�L�����j�Bbb"6m�d�
		1��j����^z	
6������xb'��'�:T�
�x�b�)S�*�����w���1cp�%�X[S�����;vw�u>����������?��O>��A��Hb ��[nA�����G�@RDD>��S���/f����M':���/�Z��SO��y�����>q��)S�Z5�����DDDDDr*zRa%��^0�����Nk+L���m��`{z�7{��h��TZ�|�I���<hF��(QS�L9�=z��9��
+�f������n3MV������o��&~��7���u�=����oc����;z�Yhh(�N'
(`�LO��(��c����	zp����
�\,G�������K��`�VL��6�����u���f���;{�l�t�Mx���M�9��a�o��7�x�y��j1|Y�c���o?9
�u7�r{��g�����Q@|�Y�c�z��mQLW�xq3�����2��:u��2"""""9�R�Y\.�	�T�R���I��+��UW]e������{7���M��\Xc�<�|Aj�����0������SM���G=9r������eEDDDD$w�(���~����v�z���M��F��~��&�@�5L��u�q�b_������<Vv���c�u�f-iG��p��2+VDxx��5�V�^m�E|
|A*_����b�
3��e�a�k�~�S����z�����8���V	�c0#F����[o5������������;�����y����;���%_":)���b���xj�;xb�[�v����so-���z���k�nAdb4�[��)7f�tko��C�+
L���i{������
+L�v.�W+!�����gE�Vb�o:m����8��O��ZDDDDDr8�G�p�ic��\��X_)V�j��m���/���I3���0����d�s:P�a�5���(�F�(�o��]�0�����qL��
�����;M�8��R���:��;L}���0M���3M��;��o�H*fR�1��A��EDD.����b���8;��Y[S0p���?�#r\��8w�������}5o���`����i*�
�����l��e��zb�w_7n�������#���%�t������Y�fa���&+��]��`8�+����-��7n4
��N�����A���H��{���n|��X�;�"��(���A�-�V����_��u��}�4ib���T��4����X�a���?�0��82���.3��x���U2}����$q��od_�\F�g��m��k���n����LI���%�OLI������XDDD.��ae�@��P�HUs����>�n������<�z�@��&��y��h\�
�)P{��S���X�J�D��0$�Q2�(�1��
�����|��th>�4G�`�i��cP�=�*U�d&����0�|�y��WL�/yV�Zez�q�?{���Kz��2��j���_&%sO�A�
���8"""""ra.�=�1�����vI�����?
dF��4g��p�����#��QL���G�<��s&��9R0J���S�����t�#v�c��A��3j�(s������L���T��J���DDD���A�������0�o�5x���{tFo�����c��q����&xC����������w� T/T��_�9{�`���H���T�;��dl������>�n�v�
��c�3;�p^D������!�9��ae�i�8r�y�����ak���'���HV�~��GL�6
:t��@ON"""""y;^����p
���_������g��2~���{d�>p1���r��q�[��Q8���=/��F�aF�4n����t��q�����c��y&����S������h��3�-����;v4#��Y`}m��	����I7v�X|���f��`Zp97v�g�jXX�Ic�:���L���G���Q%�<>Z9��@��Ck���?��f�����K
W6��#�ft���+��>�^��N3�/[�@���0�
�-���@a���6���%�\�Z�Q��,X���[L4w���f(Fp����������b��&N�h*&���l���}L��p���VL�b���	DDDDDr3Vz(����a5��O?��1cL�1���\�r�=�X����
b��q�6/������:	S�����O�>�������x��������[���/L����/����&���m���:������?,�9�|��������w|�R��hc?��*�]�v���[79r�:uB��m��o_k�s�\�"""���V�G����sd�/���������;� �����
�@��P�����|���x���n���%���~�i_�	�l��i;��g�{z���OD��
0y�l\Q�6��7Wn�+K����2m�"��/tnHz���������k&�d�����b4J��)���s��fd+/|�����A�T���w�}&0��P���O[O]9����	/��>g� �����������#u���+M���^���k���f�����c�u���[�n�S�]Lg�pT����O�W�>�������g�>���uc=�u��o���z*x�:�������o��v��A1v�k�����������}�v3���_4$�]���kMyx���:"�?��������d������hl����np�`��8/^�6�����x���&p���er��P�+�������Ip��p������-�����b�Lh	��?o�
8m���)T
/����V��)�
��n�{���B`m=��i�x^�|����S�O���V�<}��5��&M2e�n�}�;f��n�����m���tz���g�}�n��)]�������������HV���o�[Obb����#���7{x������9|�p�KDD���rY{�<��+V����o��%��_m�Wo���'))�����[��s���z�����
_��{��DGG[[=�3fx���M������;��������r���A�y���<�F�2��JNN������:���v����P��g���f=&&���m[�#�<b�EDD�?�����o������||�'����}����.��H\����<������k~����=��m��}h�g������S�>�b��}�{�%���"���c����K����3��WX�����'�dO.�P�a�O>���������My�r��>�J���w��7��}�m��a&�y�#�=����"""""�70=��d��w�y��j)^�x�S��M}�0���
4���:f���o���?�8�=�W^y�L�L\����Yx������2s�>��3&��g�}f����KLY���
�3
:�<G�2,p$��J����G�>��y?��9�h�����e����i���ic��(R����N�����*�8e�D�B��b��Q�x
�+^�������� �*RW�����VGX`S6�!E�>5����2K$'P�6'����;Lj4����K�{NaE����7�c~�ab%��t�����`��/�|2�+5Lq�W�����?��c*7L��
�/G4�
�/0`��15��Y�L��������s���������#u[j�l����1����$��#d4���t��mn�k��1�^8�
�`�������tj�|�����k����N}n<x��;�������k���u����5d�I�&!00���g�����.����w��s�0u��!CN��~�cp���3�Z���K'�������
�X���c*{������ �9|�8�'�<�V�2�3��������@���	Lb���&X��#���eE��J��H�o�����>lz�1O4{���IWEDDDD����p^v�:x��Y'fV�GJ�*em�96l�`20�Kj����:Wbb��+�(QU�V5�������i�s��l���t���U�R�� ����3/�n���9����7"����_o��c_�z���av�_�z��������(�#"""""�^vz�`
i��a��j���1���Y �@�������o
������H�����i��:t�`������DDDDD$��}�y�������!�����(�#"""""���@q2L�M�|��
��ar �>���"��
*����
�/FBB��UDDDDD$c�����ra���x�����T�H�4l��T^V�\�c��!&&��_�fM|���h���	������\,������y���G��]�6:u��
X���z��!((��""""""��@��;p�=�`��E&�t��]��eK3qhzN�8����T����4n�?��3*W�l�����=z�<����c2�/_N�����2e�`��(Q���EDDDD$�p{������s>��m�k�KTb4�����w ������i�+�=�dw2���n<y���1y�,�������d<P�V�����D��p<]�n�	�?��Y�9x���D�M�6x���ME$3������{�f�2=�J�*e�#"""""�?�������!Cp��qkK�
.�G}aaa���c�������8{m+4F���a��X��t���=�	���@���E�3���h�*��~��q�����6��Z���5cpc���`���x������/�(R��F�J��is ���K�3����4�����-[��r~X�a����k��������dg���v�zS��S\3�����VEDDDr6_s�w����E�h�q��<
��VG���aO�$�Q�P��s>&�����v3�wh�����o5z�b��e�b���+J��^K{�����H�N���z,:���sc������
����c�e~������:u*4h���=""""""KvzRKLL�����j�*$%%�K�.8|�0*T���yDDD$_Yl+�����'v����B��&�p[��(Z��*����P�PE�����`��18��[���-U��n�>�{(\n�5x������St��1�-X
,���_�'� ^�w?b���;z?����j���u��4����xY��sM�{�����4��DDDDDDr�+V�j��������_|�����o�a��
h���z�-,[��^{-�=DDDD��C�G�������l��cFr\��7� ���mFy����z$���D��B&�FA��+���X}t#�.u�I�F��1#t8�O|r�����5D��0��2������%C����(�Y��Hp�I�6a���y��^��9^^��1�L=��+Z[DDDDDD$�E��k����};:u�dF�8pN�������1z�h�����H����Jl�����k��s{<�H���}����fk�d�q[f`��?qe���Q�*vD�Elr�u/P�`)3��xB�����;�0v�o�}w^z*���JK�6���(e����c�����y�_=%K���O>�~��a�����sZDDDDD$�a�6r8���/�0)����js_pp0�{�9\u�U�4ibcc�v��lS�v�V��KN������d��E�`����_�c��qh^�!�A�x� ,:�
MJ�GX@t[���;M��G�+	�l��]�~+���?�����d���p*5G���8w��
����2���s��!�v�mX�d��`�l8�g�����GDDDDD�Ev��s���h����y��7�(�)S���I�K��'�|���c��y�C����H^���o���?����F�'q{�v��\l;"�"�l�JJr'c����J����@��2(\��m3�.�m��q,�����
`��-H��XR(� j�j��wc�v�%��QAe��kh���!���r����C��0��r""""""�Mrr2���f�<i�l6��v$%%������H^����*��3A
�;Q�h5\U�.��%C���N�b����6��U/T������J�����|K� ��<F�R��� �=u{�������z������H~U�`A����_���������`�������������=i?~��t�|=""""""@hh(���>3��C=���k��5u�
6�������sMj7�I��z"##���/"00E�A�F��e�t��4���������GL���M_x�,\��z�2sq���_~?��}�Q�aY���^K��s'6l��>����C�v)�\%&&����x����D�""""""�U�����s�a���x���q�=���W_5��o���t�S�kI�_=���_?>|���^�l�	�+2���4h`*.���f������H~T�L�i����a�����6�����e���J�������������3g�y�4i���zJ�b���S'�w����V����b��q���K#<<����w����g+��������������$DGG�v����3.\���p�����e��	����y�f�\.����T�T	����+��b�$���������@O��Q�bEL�4�}�b������aY��&..c��E�r���G��������x���0p�@`����������Hj~
�������n2���]��Tn>�3f�|���&5��������7QQQX�v-n��v3����0��/��i����W-Y��dLI���z�����C�)^�8n�����U�V�]w��������^�J�������/��9zl6�Y�b����$$$�L�&"""""�c�\�=Y���_��_?����l+Z�(^~�et���dj����w���'���.���Xt���rF�aF��v��!�I.((���7A�����o1q�Lk-����I�^���&�i��yX|�D�GZ[.L��p\S�������?\�@�a ����{MDDDDD���3��*����M���u������3��^��g���+��g���;�T�IDDD�<z�y�[3c� ��hm�0A�@�
-�'�t�W���n��?*U��)S�X[���������������~��w�{�n����k��f���y���e���b����/��<�c��<v~�����ajy�orr2"""�z�e��=;v��������H�oF�4�w^y��0C��=�����[�EDDDDr�
��[Y������<��l}��A��eq�W�9y|�A��v�P�~��'4i�%J��� """""�DGG�;&L@�f�p�����;�0o7o��
�J������
Y9�'-;'��@S	�����8q��s�^g�����������c���p:��DDDDDD����3Oll�Yg�(88�,�'��������=���m���.]���'���w����;���k�!!!��""""""�KXX����+V **��*"""""�1~	��$&&b��8r����L��7n��Z[DDDDDD���mR[��3���������;c���N�8a�%""""y�':�LG�O�����6z��eb��5�R�����D����^O�/.W2�&�3�x�p;�q���H�s����v~
��\.���qqq���y���s��y|X��o��m��e��?�O��Q�F���>caz����DDDD$o``'n�(�vlE��W������OE��-p:}��':��N��Fm�n��M����J��nF��ef��b����;��y��!q�"xND�����h�ey�'))�L��z�+���[n����]�v;��}��U���#"""""������w��fSsF��n����?W�IDDD$��8���Y�85_��t�j�����s��@�l����#����.j7���Q=�W7����p9[��DC���`-��?~�-,�T�%����a5Yl������/LZ�q���E��\��u��J�(���~�����������\\�}��x�	kMDDDD�S���b�V��{�����Z;k-gr:��/�#�[/�
����]sT���6�-^<���9�H\<	�����k��@D���hx�����;�����������3b�"[�0�`O����[����q����/��8Bg���0`���*����������(�#"""""���mL���[7������Y�p��Q������H���t"i�R$�X��n��X	����.�H���@b.���U�>z��`D��/�����
$��_��)Y�$�����m�Z[DDDDDD$-�o:l�0<���x��w1h� �?�B�����k��������Hz��^�����:��m�?�[6r�6nf�;�;��g��%,�������w�hO\\�ZG��������l��^�z��k�A�f���=C���={�""""""����3M��c��O=����bRaO�6�������""""�K%�[���_�����0obG
C�{=��pV������A_�yI�����og���.j�>�#���=�;�=����d�\r�%x����d��a�VdZ�n��;wZ�EDDDD�g{��1�E\5����8��l�y:�w��o-���$�������)����q,�8<���>����.����+9O||<������:�=�x�����}���x�����ys����1�EDDD$o�*���0��Rj{=��7�%��Q9
B��Q�����o����	�����w����6���%�x�U���@`����V�v��%�q%��{�g��!����~�i8p�'O6������0��W�4��}��H������]����O����e���YwL��k��c.�m��~���9�!��4�����xp��)**
+W��m������{��A�=��aC�R�LV����#66��GDDDD�2dj_8����[�Q���m/^�}l�A��!��mur�z�1���y�4��|E�_j�R����H)hm��������h3�h�����g��
�S�o�O<���s��q���
���:��M��b(�]��E ��E��dHQ�.ZI�$h�W�����`��e�*U��~u����(9;�q���m�I�a�}DDDDDD��k��=�����[oE@@���VTj��e&e�9�hpa:���z��4�����py\V	�a�{/��(R��Y;1�qhU�j�.9_XX�U���c�b�����S�a��������������@�;��u��-g��o�)�^ HDDDD�_��3d N��
OL�����o���;4E�g}�IJ4'/=����6$�]}zY��o�wT����������o6zU��#���a��<n�/���a
6Fl�����@���s����`���&�u�^�L`'..S�L���������{�)+"""""��_=�F��u�\<.����s�N����������\�D�1�>52��b�}��n����_��e�V,E��Y@B<�O���;@�O���<���CP���P|���N$���:R��||'>^1==�K
W2�J����(,?�����@P��"�i�9�4~������:t�����v���_�	&��������E���k�����W�69�_=No����_7��6m��-[��/�@dd���4o���!x���LY���V� �{�E��]k�Qzl�P���� �^$mX��ml���P]�no9��f�O@��`AH�{py}s��4a��X{l���
���f�����=��������p��)�|.+Z�l��?�.E�qw��w���	I���o��?���[����{��W_}�������?��?��ES���������f�p�O?c���z��-����Y�&�
�F�Y[DDDDD.�����?������F��/#���P�6"?x��5�(]����>�K!��o������z�c�K�Jd?�NMr����O<���������r��6���L	F�����}���[gZkY���O��j��5�.���O��g����:���v��X�t)"""��<\�9b@
�����HN`GH����
��6�����l���D���I��(^����+�� ��
��)p-o���R�{y�@��H��?W4���E��<+�,��m�������x's��H��9yF��g�y>��Y�����~C��3("""""�����a:�2e���X�b�/-""""9JP��(��,��?���=q���]	'S�/�<�HZ�p��������(�'�lK	�|
{��p\�������I<8��h��6Ip4^�;���_��!e����I���p������g����5k�YF���={��L�-"""""��E	��B����r��&���z��f��Z�	�����7!j@x�98�U0�c��w�`F����lA�(��S��0
Ik�1el%;��hl��2���	��x�B/���H�O�v�]��?��<6{���<(eGw"��?��==���M��������q��7�4r���Y8g�6<x�)s2o�����H.��9zv���v��a���(P���	D�;����i����G�B��v�����/<1����Gx�w����*t��X[�V��	G������-�Z����^o<G�{KO�Q\���G���g��s��'N��oD��%�����|���=)v���^xQQQf�Oxx�u����H��9z��9~������lm96���e�(]���=4GO�����������{�b��I�b�J
Vf�+m��9����z�����H�c�[����2���'�l/a+P�q8�����������b2���	��7�:��e�r�g��l��� U�X�[���;�ADDD$JX����F�w_�l�D��������X� ��_=G�5����{�� H='����#�<���~3g�4es��{��Q������{q��w��WZ�6m���_2S*�[�����8j���|��c��c;))	_~������E�1�2U�DDDDr'{�W�lG�A�9
�V�)�����������G~zo��m���q�kE����P��z��mp���{���s*T@HH��UDDDD������$.����k��q��/�"q�b���I��[�$��_=ZDGG�n��&h��5l���a���`��W_����{����#��SO� M�f�L`��)�n��&,\�����g�}f�5m�K�.�J��0a�����n�����|��;��M>
0��eh���)�������]����HDDDD2��7����kK�����Pc�+�8�������u��=;������v��d�J�7���Lq���+V��������Of<`}�s�0C�m��f����}.�8�v�M9���6�G����Z�r����K�5���:GOrr2���~�m����I������	�[�d��a���;����
��7m�����?�/���l{���M�k���&8DL��9�j���1c���v4)J�(�)S������2���_Z�f�	(���|������o��&~��73�������d�����A�W^y�tc}�^�z&���q�������hv*+V���P�xq|��G&����H^�9zN��>	��?���^���P�k7k���=Y'KG�0�s��!����hb0P����b���VI�H�=0y�d���������@K�*UL
�����
\u�U�����������I���A�L��������a���,Y�
6��'�<�������+�4�V�h���ft���>z2(���NL���"""""���.�����j��fn��:UDD����u�������r�#"""����zO��yB���aE��k���]��-��E/^�2e�X[r�#G��E�fT<���7��z�B�n�G;��S�N&���k}���|�������_�������7��t�����~-X����L������DDDDD$�d�����D3�gBB��%c���L6�*"""��hD�)qS'"z���Z���v|���vqiDO���@{�1���c��-��k�w����[[r�Y�������o��w�1#kn���n�������������x��1k�,�aO��x������j���9��o��i�J����}��B�J����� ��B���1}�<�%����@G��������J�e��������~^��`��_���a;v���""""YM��S�9J�v��a�����,�'�y�.]j��U�^?���5E�9��l��

5���p$�������U��rL��G�T�T��Sj�������oE73AJt%���K�����-�0������Nd[�n5��3�������|���4�"""""��Q:gf�����@O^�m�C��7����P�1��{��v~�G���}+�5�n!!!�����e�<��sx��0j�(�����c>���X�s�v����Z�nm�%""""r>l��pV��Z<�'���1�x����G�{R����k��)��g���	�����O{�y�m���t�C������%x��Z{�?ei���d��E&G�L�:M�4��9���7Oj��n���?���(��m�v��M��@������n�c����o����p�[��X#k-w)P�������i�b���z���m�����	�T�Z��pv:�'30=6�r������5k�W\qE�YDDDDr;�n;�����*�P��pT�O�v�7>[��>����_��w��YGr\�[�����(l���{kOx���������}������'r	l����}������J��u4�'
�����-Z <<�VRy�y��s�)�������K��5j���#G�o�>����a��H�"(Y�����+W�T�X�K�e���B�
������/T�����E�j�X�bf�0_�X��un�]�/^�/n����""y�-.�];2�p���`N�F�Lp�s�����&]������`��	f�mnc�������p_yDDDD�B��-44e%f-�	{�g�W,<��R���$�'9�������?O<�k`/ule��@����3�[�ox�N�;�>2:}�z�Z������q�w��+�4�m��?��w�^4m�
64�XI����'�����?�j�2�~n��V����{��Jh���	��19��G}drm��3�^{�U��m�y�.]����?������HV��z�����2'���(��K���?���f�����k1;\�=i���������^�9<9��#��ozs���-��1cL}(����r._��G���C��sh��
:u����s����������/��t���,���;��Nbb���M�6���p�
����O+��K�A��;�1�������F����=�Kk"��Gp�*������&����p������^���$���H�������`+�<<������`���>��n���+���Zx\��D.��x�K��=���S��u4�'��K����3A�`K/�CL��Tj�f����+����;L��#�*W�l�]}���Y�&���{�8q�l#�g���t0�C7�x�=0l���#�X��Uh����7y�yy���"���X����kLG1��6����<����[���M���8��S�y���1s�L���#������cc�{d\F������[o�e�����M���W/����'�g4w�\�������>}�uo�U�V�����
����H^�>z����m�l�W�{K7���iF��K��g���[��RF�x��V	{�w��Nr����[��L�7[@	 �O��?����~�z��a�i�=�S�B��wo�w1E�'�G_��_�~�W/�9	*4�������6L�v��1S���,c�;�X`P�e��2d��l����G�V�p��w�rt�e���G����M�������o��G5���yr���|	�w}	���0���5wh�������h�����]�o�wT��5�Cn���eDD$�K\0��u����'�R$�[0���g�� �%MH�ag7TX��$l�{�=S������E�����y���?6�rX�W�s}��'X�v�)���`:���]��]��L���3������A�yODDD$/r�8��];SV�J�V��I�G0l�f���'r)�;?�'�)�������)��9���}c7��hJ�cx+K�a����-�<�GRFSK��{����8l�����3R����6��8���?l�g��G��^_��]�
:c�:u�I�@L��r��
+�	�4W]u�)��QB�40uo3�:Lm��B|@����	���C=dF17+P��-r��iz\�����4B��G n�X��5����;w q��M�B~��S�x����,$�Z���(>y�����������""����n���������"yV@��9�p�l���/E�HVa9���aZ�K/����t�p���w��[n�U�T1����z
AAA&}�/�Az2�?�g��:f���MY��fYfH�1c�)��L���p�U.��Y��d����|u2��*"""yVr2<Q��
G�x�>>�mle�J���-���P�^�������J�i	[���90�
O�{`+q}���+�V��`x��6�5�d9�zF�arsQ�����o����^���~�_~��U:�0M�a30u����|�+3�t��_�h��?��a����l�b�14�=��=-s�{�9SaYV��j #��E�����F����Q����`JI�H6�����n?8/�e���({��/�w0�|\�/+�P�K���}��u���=�<�m�y+9��-�q�1��o�'v��Q$gb�n��u&����~�KX��R�S�zu��P�����3et_}��5��f���/��*U���Ofh��:�G�0c���x�������""""yZ�Q���R�i{����<p�-�\�[��`/~����`���l��}�
��^�z�����P��c�	[������������[���}����J����#G�Y�f���X�bf��b�Py�Va
4KrR7�l
"��[q��Gp�����v	��k�^���?n�hxbc��\V��p��"?x!��qZ�(�D&Fc����w�����l;O�~W����<���1��l��k����c��[�?C�+	��D����MDD��s���i�����u�|y�94��-�3.\��Ec��������^6l�`�*T����h����9bm=SF�g���tX�x��V��4�cl����������|���7;&6n��<����7n�}��wr>U���s��u�+�
l������@`)�[�[`+X�{�
��M�=����V��mm�}*�� ��p�(ax��1J�[xk�d5�z8������^sa��hK�.E�:uL�*��������MZ3���}��&�A�����lL���t���������i=
�����I�?��X�u.
�qcG��2Y]V��b�D@��T����g�Xpa,�2wT��7O�����e���YwL��kl���?�,4A�
�0�����9{�XG��������2;�'=�[��pn�I�&a���3�����m��b���^w6�c����A������J�����b�#t�<��b`���9������{��P�Z5�����4m��<:t0�V������$�]��C;w���;Lz3^������""��D<��R��\�$�#~��HZ�7
����������
ee9�1�j}����?�`g��(
{��`G�A�35�TA����]�:�FD�3
K�1����5G��GD���8~���'��a�17"���
�C�>1'�N��5�M]���>��u}c�gR�����\���X��0���GD��7���'Gr�/��5�[Y���k�����b�������*--�����>����^9��fJ7��}�l��5��gO3��f`��&���o:+2������2���9s��oM�)��h��E�-���#�?��Hz�������JNJ�q/��o�=fN].��{���+�Lb��[o���E��O?�����|�i���R����{�ae6Mr)����`?y�F�����m��7�����6i���>@����h{�0��
A-�"��U����Ax�Ys[r���_�Q���t0#wbGC����$& ��&(��k�|������z�{�E����[`B�{�w>���T�9��?E���bXY����_��M�������q<!
��������B�a�h� �	-��w/���:�~��������n�����v������cnt�9����_i�&��K�Sm���x<�6���k|<l�1K������p��		hQ���p"y�VD�y�\�/z�f�y+���[��^�1�k~mn�?���fn_�7>������$����O<���vq>|���~������������4��/^�2e�X[����v���C��Ti��uJ���K.�M7�d����������n�3u���&�x����{N�yR����l������a����n0�1[�W_}u����b�89?�vN�����R�X�����5�Z������b�e��fmw_���s�r�^��j��u+gc��H�����=�p����c�mz6l�F��!���1�;wV�G��y��?�p��	p�(>e.J���,!]�Ep�HZ����b��7z#~�/����u����N�W�'��{g�<d�������}1
��)�����O��\������X���#����OD�B����x����j�����p�V	��q#4 ��]�w�~���>����Q�p���H���mAx�m B�<�&y�g�MF���t���*c��	�S�^�+��)���n�df;`������Y�L�k�,K���Q)�	�*�����T��������c���9g�������c����8���$_;�o;��;<�������N�?�����r4��O?m���/�X{�7���E�-Z�h9�%�Q�Y�n����9q���O|��{����[z�������=��s�N���Q�n]�����R��:��7o�/���N/�O�C�e�w�e&��q��mFy������;v8�����5�������q��A����$%�Y����G���D�V�=�-��������s�R���Ws����:w���5�����e]���U��K��W�G����C�B�#���nL��{b�v<mD���.LZ��w:��o��1`z���t������z��NH@T���:���A
�!i�jD������|iDO���#z�y���1e�\q�f���*�T���{����6����c�=f�(�7����r�	�0]�tMOf��h�o������W��U��oZ�je�6��}�u��{�����27v8��k��_|a?��������cdD������d\��b����Z�{��#��rkk-gK�m2���Z�z�nA�s�ZkW�I�Y��c����[9��:$e��="9��=1C���d)������������n>���QA���s���sxNGX�w�#�d������{�m�'������B��q[���e��t�Hr'�m�&x��38{��zB�Z������QEDr��=���`R�I�����"�f���A�X�fR�������.tl�D�K��|F������p����~�M����@O�������������T�R����Q�X1kK�q�@���o��ds���Ob���?;v4A���{��������t��o��6^y�����1c��yv>��s<���f��8J��q�S�1���e�6m��}�����7A>G1]�����W���b����Z��M��qS'"z���Z���v|���vq5������g����t�'�b�b.��[�d��Z|�E.6��M��
�M[����s���5��
�qcG��}����N�����G�sg`�^&�CU��c�����;�bv�M����_��cQ���}MW:�>3n�	7~� ������UUS��E{�`n.7��=���������ta=�D.S�qN�gz��eX67�V��	�L�<����7o�I������D��>_��#�^�u��6ef����������`���f��O>����i�.����;wb���&��O���UI�{�nXb���!""""��di��^@s�|x�l���\|�E.���SP�r��5���{�4���$%!�w�M�`�KX��E��EDDD���.~Y��V��&
]V��k/u���q���X��P���W���D\�7k��qs}�)����;*���.����N�Ta���+�4���4irr��ln�8��9&L@��=��G��~�\v�eVI 66�G�6oSf��$�L����f�5�99���I��1b������|)����?�<�����kW|������p��7��EDDDDr�,M��	29���w�n��:'�<^����&��PiS�q4O�'���[��(�R&*Q����aB�}� ���<>'�z�=���~)�{��="""y��F�{�Z;?J��7dg�6�7��M������`��A��-[�}b��5w�\��������Z[Oa*��K�"22�Sj����
"((�*����J{���OL��a���������q�X�3%�������=L��zn���3*����8�7F����{EDD������n;�)u���9_	����	<�f�~�O����ky3xN,�
x�C���-<	{����QvE{�5����n�?���,	����V��]DD.��/?����??)��7dw����p�
�����1#J���1m�4<���&���)L'&"""��)�sJ�z���g�\[P	�F��=Y'KS����'��O����V���p�m�������x1+���{8.g����Nx��gg ���"a/�����4%M���\��x��H�a��������~2��>��S����>�jy����w�^>IIIf������?x��yG?�7v�{��Y�lx�Cc�GP�GDr�3�w������H4��nu��~1h�����9��_����8��w�)���I�
����LJ@b�]Y�q�d8j��{���$���lEZ�V�	���V������'v�����3q0l%oK���RDDDD�
��;v,������K����N�=���;�}���3g��#""""�/��_���3������,Y���{{x"�Z�"YM��q������I(Z��$W����90����F�r�N�����k�1ee2
����2Q�����m.y"#�
��7���t�xN,�'vle����uK�������&��I6����9�EDD�����};��i�R�JY[Oa����}�ycDDDDD�"�0��Z��'z
�FZk������*�/��O�����"=hz��:���`�-r�l�
|�h��#��=������D1�y
5�-����J��|��N�GA�/����DDD$	@XXv������)L�v��a.\����V����i=�~���?F��������OZ�/��������������Yx;y�V�|�?�|�9\��Z{���Hn�I8�� ��'�o��d5zD$�a����9{�&2���������]��j%O��<�1H�;�Lf��%~�4����pn����D����}'�]���s������qE�Z�#��?���9������8��}DDD$�`��q��f���#G�>>��X�'ND��
MY�����E�o�a��l$�9���^OL4�����v
M���p��e�'._G���^�����f��O��Y�-���+"""��;e
�I�g�����@O||<���n|��w�9����{���_���3��@�+	�������G+�m����'=���t��s�����f���=xhfw4����}n�:�F��NkK��x��jR�-���;�}�0�=|"{�@��3�D}���w+b��l�s.��a�[�����`]��<��w"yn1 �l�^1G�$�+��a�Wx�������H��=��?BBB��o_<��s8p�I���gO�����{��LY�,�J�k�n6n���L�(q|������o�
!7w
���{<����8���H���Re����:x��G�I�G��?a+P�:�����w6g��6����������M/49�i;���-3P8(.���
|�z8���i�|�n
G�;	�6��g���������_{��Db>\�n��s:��&e�[G�[��JF��v�?�h���]x��8��x_���m1	)�����Le�|1��[y=)��I�������7fI�^�U8[��u���n\���&�f{`+u�UZDDD��
� O��M1w�\,Y��uf�������w��������"Y���zW"v�0������Ki�^�^T���`
��X	x�a+���;"��e��]�&����%��Z]���88����J5�H"""��9������	

E�2e�m�6{D���UZa`�^(_������a���fO��������`G�U�[�������kp(�(>]�������`��;8�g�n7��w��<L�V��|�����t!;Z����=%o������I\}q�O�����mXlk��C�������.n�			h��=�u��O>��}��Yx�{������I���>"�oF�8*T��z
�K��>6��	�O������ ��[|�m�.�c	E�u7�^�$lv;\G#z�$�5�\�������5�S�`A���;����q�w`��7n�����g�%">q���N���
��������v���/����=ZN��Z��
�"���>��V�0�[nGd����+��u�&.[���6���r,O��(k�i�������Ad�'!����2���`���Q�����M*�fv��r��'�ca$��$""�[DFF�W�^X�v-�V���;�Tn\�t��5j`��5x��wMY����N���j����b��q��m����.T��\����=&[���H�9��d3�II����$o�
g�:pm�{�2H\���\C�����W~
�:tO>�$>l:��w����]�z�)?�2��HT�?�O��C�����f�p��>�=�}��$��sr�:S{��i,�z�_�����s�Xpa�)v	
��z�J�����A��Oa��Q�@	�8����pe�)����L�}1��vIa*�����r��l@��C�km��?v/B����5��g��d�������e�����+D�[rr2��[����K�.5������i����c����4i��#��l����Zq�B�7������l$.]����a/Zu�#��������Y��I��N�W� v���S��p 0���Q�*<7\�v�f��>""""�~��*\�0����;������oF�I��*;'�4'/\�q/��|������<�2��(`���91yE��������-����?Kv+\.�3v�7#{��V	�zr�����������Xwl�D4)*z��)����[a�:����E�F���_0ee2~�;)���s��7qX�]#%g`:�E��G����q��	6���]�x�
L�8���Gx���K�b
��[� ��pV�!7�G��f;���#�����8/�e�:J���Be��[�>��eX��9�_
{��n{�w��j�85R_DDDD�����s$������t�h�:?/L����p4��@�
/�h�\�5>������Tp���A&mW�)Y������/K�%����a���}�Y�(�X��NS����VB�B���uf������KK8�v�������s��??�G�|��U��W�G`���p�x���p[����"y�D<���v�
���T����������bn����[""yG����B��������5���>\��5Qd�0k��{3+%�����{��_������9/�
�����Yk��w�}�'�x�Z�8�-[�Y�f�tl������5kZ����p�I�&���k�-"""��s�wx��j�Y��^�T�;m[���e���{ ~��.�R��]��-a���]���O�A��>�����3���������ND������6.�u�'r%\��6���~%��Xk@����[�����.�����x����&�4'=r��IC��y$#�DyP��^5s��^�d�A�3��PLz9e���I(V0%��-q�4���q>����f:�C�'���0o����5x�d���)]�o�%w����_D�#�pfw�K��1�������������_��+����8O5@���)��]�h�5�]p����
4�/�������y�t��5�����%�8P�V�R
�c������)�G����T9�>n;:���
�����>��C����92�K�9<�:�����z8`h���(U�Z�j���{#G���}���=7�|�IS �_�74���e�HJN���Nx��loV���~���K����o��G���;�]����P��*�����\T��/<B� �=�O�H�����^c�(Q�>�,���c�S/L���<���"""9�-�J��?m[����J������H�b7�XS�[G(����@
���C������r��i���H��=�3e��s�=�Q��O����l/T�|�A��30�D����v�]�lF�l;�F�`�	�<�C������mp�@0qy��q�����*.��z	\c�e��tY8J�NY���9<����^�X�6�nwoz	�s���w"������.�;��l#�������<'��ZEDD�l��h��E.*����+b���7n�r�L�9�h������"""9�;���MJ&�V�6�����������D3J�V�9�t�M�����m�en��dG�Ju��W����UDD�?����tm�~�-�6m��3g�C�(R���/00/��2~�a��:**wL�.���e��oq;��2_������T!;�o��q�����n�����*6�p��1h�'�
�3�l����pa�����EaK��xO�{G �<�$���;��\��F��h�2��{�W)�g�zw<�r����	9�l����������O��/G�=0h� ���b����������b�������7����4��5�D���dg�vz&{���Wx��<[�:��X��H�Z�$����9
m��hV$�{�p����>�[D$��k�'""k������kF����k�5��]�mm�I����`�/���������0��P4������jL|)�l�o0*�c��!��F���y<OR"<0'�;*�{�in����[������M�3��Eu�Z����^{��R�>�l��m"�y/p�#y~%�����X�����H~������7nD�.]���'�>�����x��5j�?���H��x�90��a+x����|�=����������`���o@@��?eR�yN,��y����8�Z�xo����9<�{��|�/~
�0�4�9�����������S���H���Z�<��]H�k�����M>{���l	�\
����;�H��^�D�^�}8���������;%7���{��pox:��������DDD$�bv��s���[n�<`������T��I��yMy���+�ANDDrO���D.��G��l;8��_���I:d���7��m��x��4�w�m&�[����l\���Pc�A�����2�X�/���Y�5��Q<5k���!C�s�Nk�)'N����SM��F��d��)�M��B$�[m�:GA����~��SF��m��8�-�����P(PNL(��k��p���������3�����[x���:�����G�s��Q3�)S\�����n�W���CDdd������({��S���a{GPY�Fb/�8l%n������bW�fb/u�w�@���>[�'SR��T��Hs ����'�1��
����ED�l��	��/�hR��[���>������d,^���Nc��'�|���'��c�-?	,c���\��D���@�a�[p��a��5�x��d��g�+��'j<{�����{[/�[IDDD�'��J�(�M�6�����M��E�&���n��2�7��H���L�.�=���������)+�5L��^���r�p �le�����&�cK$"[�w��R�)��R����Y�=_Z��mM�iz�������j;v���3�����T"���{����\��?��I����3����W���!H�_p�{/`�����oq����2�L�'[\��I�����T~��X+"""��p�N���1e�3'��_�2e��y������7�|���-[�4eEDDDDDR�{��f���;����1g��;�,3f�@DD��A�2"���rw8.��Z�~������f8�$��hl���{`������p6�g�8��b�4��vu�����sL<LO�����<94����d����u�<������7������Y3L�6�������V�jF����o���+p�}���""""""��=�������sg���Z��{ED�4��D�<r�#s&�H��MY���Z�j��7���~���{�uX����SO����6��E�)y�f�O���q#�d��xL�����x<&������]:�K��"���>����fx�zb��g��t���_[�S���T�����
4���Fdd$����\=��7s����X�E�V��5��5bG����?e��c��<���V�D����@\j��{3�KD=������xbG�h�y�7q4�����[%DDD$��=��s�N\~���bR�l�t�F��`���#���?z�������n^���e���g�����r���Ogv4Z)�DDD$�c�>}���W_Mw���;�@��M��qH\<�}{��8�%��c���3$o����f�V�l��X[S�a/Q
������e\G���v#a�����+�G�u`?�7�����ys���B��y�$%����������dS!Y�v��9=r���s��^8�h�����D����~��G7Zk��'��Z�b�b�-�9�DDD$g���Q�F���X�bN�8�q��������I�0{�l�AN���_�.�ne=[2�{���s&�7m�k�>�92'&���/��[� ���j{=e�"�Iss�k���l��DI�ns:MP�q���	������ """�������.]�g�}?��#�����s��^�� $$��K�t�|4 ����7����E���DDDD$��(�_~��]v�����7�4����Y��~���P�D	��WO����������cK�y��y#U��Y�<�����Y��.i�����Be�~	H�;����hqs?G�]�
�*���X��G ������/"""�_=���Q=��7���^��9������x\�7m�d|���X��d%w�N��TQ��ze����H���{��p\���a��8|�0.��R<��#���+1e�$&*-���'W��'�y�t����!q����x����r�n
 ���f�N`�k��-0A��!�Y+x��0{���?�,�8e�����)R��������������s���#��z�+�#zEz����\����u%�����pkP�V-3�iTTBCC��iS,\������3OX8�G��v�l>3�J�?+`	��z
3�'~�4$m\���CM���i���o�0P�B���I�7�up�u$�o<1��9�$k��DD$���	F�^�0~�x<IIjx���s����>o""""��1�u����e���
* ""4���u������&��0b����� �YK$o���I��IJ2�y�C�5Ma6s�^���4��X1 (��p��&s��\6��{� x���{��a=�����p��������N�,<���<�����,
�����*U2?����������Ox�)O���p�+��7"�w����������k�����������b��������3f`��	&��ME�B5n��k[�^����B@����3���i��Z�������#��}f)��S��>��%g����i�7��Be���`/Y:e_�7<��{g?x���?�f���{l�oY�q8�B��g�Y���	t��9�<	{��\��%�o�N�����t��;�4������&�I�:u��?��w�}�V���w���Z{��d��@A���]�5��0H�(_A�����-4A������=&����rU�t���8H���!@�Qk-y�i�-""�)K=%K���y��k��L-�����:�$���
���p-�:�����������$""""���y���M&���(�g�y]�v�UW]e�c0�A!�%v�u��yl�<��s���u��]�>8�Z�Or$��^N,������H~e����Q#�~��&�5]r�%x��W��G���(S���.""��x��~��c���!~
�?~��w7���ka��i
��Z$��i�:�#S�[""""�_y<�����M����O.�#��?S�L����U_�3�5�������~��A��2n�8���}�_|��o��,'N��� ����� ~�uCDDDD�+��~��7�|<�{�Nw�������"""""���5��yw����B�
��w�1��c�����������Kc��%&(��w�a��90`�u�|�Q��!""r���G����xb�[8�emM1|�d�;�������]4��,�y���!21���5��."9G�<�g�F���q�]w����>c���[b�%"""""�������x�#���={�	E}x�i�:u�d��\.<��cx���1u�TDDDX%EDDD�p>X�-�������{0c�|:�:���.���c,�s~�m(*��E���'��)�}�H��Np��-�-��b�����[��J��I��@�5k�����^��im=�f��a����r�q��8t��	�����W���y�����Mp�O]Gy����q
Z�k�g������G����h:�n|�z�)���Kx��Cv�r"�39�Z�j(Z���������d�_=���������iq�c���������?-Cv���K/��L|�{��l��T��.�*U������)���V�^���_|���V�S������_��w,[�H���O�������h�*D'��U���-@��������s�0|��7�����`�+"9�C:t����O�G������d�_�)��C�v���'�`��Q&=���0���U+S�s�L�85k�4��d'�X���y���t����-[��A<����-���:w��	p�w��y���SO=���c��8q��U*�5��D/������7�|3^�ut����DDD$��I���-�����" �(���2J�Tn���*������"�;��w�}�z��7��|��>�����o�5�DD�L����W�G�e���8�pz�Z����i��(��{���i������Q�lD��6������Hy��Wq��W��{�1���+�%,,���S�J���k���1�����'�4��G����{�W�6l8{OX��c`���������o��(\��)�J��5m�3g�������?�?�������#G�r�v�Z|���x��1n�8S��D�>}0d�����VI���9�����3��������xrv/����l;wk�m1s��Zi�D$�c����w���:t�����W_���#Xll�������$%"i�?H\07k����>�}#�]	���/�$�!4 �����N5y1`3a�L��8���Q�1n������������^|`6Dl����������HN���h����_�e��K�6.��7�8�(S�%''�Y�f&��Q,�����G�^�LP��g��������1���,Y����J=J�}��&�QM����N�jz�=���'S�1Xv��w�Tn������I����y��9�o��J]�o[����^����������MZ�z%jZ{�HN��
;�����o���={�Q�i�'�x
��9?��h����!���Y�����o��n��(Wtb,"���NFbr*��CX�������c���81I��s��.��k�)`Ki���l&p����7� ��[G�^@DD�\.�/��1��Tg���e��f�/�G������77�����F�;�n�jR��
�7�?�\�r����Y����&]j|�����GDD��d���([����%J��}x�R5����/��b`�^(fmI�z��������.�1���x���f�~�cy��x�������o��^z�%<��sg,���="r��,@���HZ��[6f����_������?r���H������CK 2)�6��1��{�u�� ���*�]Q�1q�L�Y}t���5��0b�
��q��8{�U2���HN�����s��!���o�i�������3�������-gbP�i���1c�	�08����t6n�hB�J����`y��i�<|�L]�w�^�����������"b9�;���L����y[D����Ot����L
���,G��y��x���x�VGD&�`O�A���yk�j���j�:�����}�|\[�J)b�j��j��b������#�n�h�8��*!""��di���F����}��r��W>�`��]�v� �gw��
�63�Rz��gO�0H�%���k�����\�M������nk����������h������O��'"y�k�N��$%�},%-���;�f�����x��.��**R�{]If�������;���*��m���f��)�����"v`W�>����������K�}"""9����)Y�����������{w�/�����|��EMy�3�I8'�-�����'�6o�R�]w�+������{�������1m�4�����������L�2���G}���{��aT�F
�t�Mf����z���s�l��_o��}F�*���/<-�����n����s�k��$W�����k����k�:�:�`������{�k�7���x��-hU����{=7��u��][%w]q�����������!$4men���C����bW�QH�mn�w2�]fn_�au{[�DD�]\��|}�te��O�#�������?����u���CXz�X����L7-�������%�P#yN��H����s)2p��^��wG����@�������x��fN�r
�����U��#*1�[�8��i��S�bPg���x�vG\_�9���$O2�6�[3���	�;�r��My9]���������Tgj�?�,���Y��7>������r���=�Ck-���x;
�����D��k����?������k
h4��u�?8�m~��#z�a`�o��Yi:��+�[p�����?���d�������J=�e��u�,S��G������k@�<���y����}v�8p ����3�a��!66��KD�<[7��
K��jmQ80e���������Mp�.-R���G��0\Z�2n��
u�]�Gjw2�c�u�u�0A�^�j�����6-��B��u�k�}"""9Q����k��eD������\ �X���7G������>}���y���A�T�<?��w���oF��.]�����v���p�
7��Pz�}�������cc��z�F<��7m���{%�w�OV�Z��{��_����m�3���"7�J8�6}.|N�������m���\(�r`or����������@Y�k%?�Z��A�&�\�;�e���q������������$��4�'�����s��=��4�G�A#zN�����=Y�
?^�uSqJoa�6�}�-�O����|�����S>���8�n����cz�m�p�E���M����x�����[������[�R)x�-[����C�GDDDD$?a����_x��s.,� �����$o����=�p=����;b(b~�����q��IH@����w�?�C�:���~D����:|��[Dr�z&L�����
�����A��]F�i�#�E��5Q�\9���&��{�}��'����7�h�]}������Z=N��r�J3R�7*��0������(=z��(��"��W.C����9�f��TS�'.q�&�}���`"�����H���}l����7"��YHZ�
��{����{�oo�}H���:���~
�pn���\������v��E�������r�*U���ly�4m�������iS��5o��&.��2S�T�Rx������-[b��!�7�����V�Z����6���<��#<x�	�0�{����f��/"""���	�p��G�>t�lsGE���/�p�kp�c;$���l��\�v���n�<hR��$o�b�������\L�}{���2e�([���{��#pm����� ��Gg\;���w7l!������f�l�ln��F�@�����:���~
�pn������lW\q�IO�W0P3s�L-Z]�v���>����a`'�s}���L�m����7�����1c�����o_8Z�jz�!3O�;����>��_DDD.\�7�����Ts��O��"EQ���{�7���b*A��~F���D��s`s:��a-����5P��@8+WI9@�~�7���:����f�'r)\k yV �������F7��E��0$��������hs_���)��5�'~�9������Hz��C@�K�	sg"i�?�=�M����{���y�=������3����&�[��U�[�����be8�_
OR2l�P#eZ
���a`���
.lm�]�*����R�1(��uk3R�72���-m@���:u2���\bb�	�0H�_���{��jc��������	$"""Y#���(��S�'�O�� ��7�WG��#�o��@A8J�A�/�z+<5R
y�m��:i���]ns���Ix�wy���:�������p�����p������G����f
�
��#���9�����l��Nx��I#EDDDD$���@��!��G��RIkNz��;��l���a�a+V!w�������<��d������:���|~
�+V�����#N��FDDD$'J�w���Q��GH����l?��k8rS���������u�����+&�Q���f����~�w��{wP�"-`�bla�a*�����-������~�9����
������<����Z���#�������H^�IL4i��GY[Ng�:|��8������a/Z����!q�boE(	�����~-���B���&��h<I��E$'��@O\\�O�n��q?~<���cF�������z�>�WDDD$;\~�O���^!f��f�*�^?�u�	�$��j��g[����IN�����I��>4��]GA��+{�
����������O���=$��y����������}��;�b}��L-���Y=�����,n�p���[M*���#���&����&�&�D�����$8*U1#8�h���H�7��^�d�����Y�p����D$g��@������SO�K�.'�����7s�p~������}EDDD�K����{��
��W��}8��1Si�$����m�'oZ��-�����{��p�N���#po�����z#�
�x����  ��;?����p�������}�lr<�(in��	[�n�HNm:����{x��w�]�����r""""��@���2���
�Z�C�e���xRRN��"���p��� w����xmK6��[�c�
jw�I�f/V��nc��k���I������S�D$���@����3c�����}r�<>"""�7�t��=�p�CD�|	���1=�B:��/?�#76���1�p��8�M�����l�L��������|��c�<����	��v8j�����$����d���DY��`��y�����["���n�
��w���0q�DL�<��e����� """'qN��;�G�Gp���I�^��m����Uz�C(p����l���'���f���0eRc���mRR�5j��=�="��ei�'$$�_=:w�����p_���V��I�f/Y�����Q��OQ���(6a��r��l��\�v��r��������������9��������$����tx�0)��g���	��=���MYD������'������?���"9YLL�Is���zo��6z��u����/",,��KDD�MS��������(�-�g� ��A�HD���*� �+�(�DT@���RD�REz�^�K�B�����d&l�!��l��y����������s���"E=H#�y�f�4%N��g��$ """i�p$B:�,K�D�2���{��0i:4P�o��������@�?���cf�����_C��������N�O
�g��b�ZEZ�U�'���a���y��o��y=}��,<z�:y=sC�b�[.��C7��|r�f��(5

�.��/�(��u��-[J����L
6���EHD������U�6����e���NO?�������;W��@D6�ub�0�~�v7����^��qb=5H�gG���e�G��,�����D��
����J��]�V�Z�m�6��&��Y�f�T�ZU��}}-"""��"d�����"V�����H�u*R&��+��d���������eu�������^/��#\re��s=_� �V����i����y�\�!�6�^�nP�P!M�v/�P�c�2D����8����R�;|��������A�d����3b���CF��e���;��e�DDD50����������	����������e��u�"J��_.�&��O���~���I�^�D���97��c`,t�y��_��`�5Hl7�����b��O�W��-�����%����.�4^���#E=�s�����5k�T�H����8p@BBB�Rwa�C��J����N�:z���""""j\�K�{-��y���LAO�&���!�|-�'�Erd2��;u�*WlR������-������H�lZ�3E��\������+�3f�m"J]�d�"�����[����)7o���'�xs�@�4H=������C����;�R	���`l���w����e���2c��8�d�0�C��s���_~)K�,� �i��]�������GuB j��M��Q�9"c��??�4�#Jk���$s��)��K�5ezp�����k���:�s����(�����<�Y�D<��#��=2�G�������|Flw���S-������b�������������3g�1c����'�Q�F2t�Py��G������0a����a��Y�f����/��e3^����(.mrf�HX������P��xV4�[������c�~V�2TZT���DD�������[W��?����i�8�^��m�kQ~��	�������;��E�T��7n�p�}�]0`����W
<X6��W�j�s���xF(��G���^@�����p�9s����kL��5K����`��S�T)�W��X85Q�w�������� �����hJ����z��y�~��m,t�������������}:!�\
E�V��i&����o)�K��"��u"J��g-Q��L�2E[�-Z�H��=���z�	�X�l����G�QR`����B%��E>h�c,��g�Tnu�{KD������a���>R����Qj��aHEv������$���3�9s���P�C�I��yu���O<a������+s����P���r������K��=53o����k�Z�J�z�-y������/�����M��A����k6��%K���SOi�������]+o���d��]�Q�l����� c�(����/b�ZY�8x���S��Y/L��-�mt�G�.�Q�U������Wl���������Dt�\��=|�[������g���y,k��1%""�{����V����E�4����K�FH�B�/[�B�@�|� T����Z3�CD�����/R�ti���_t/��S�n�4��;APA���K��9��I�g��u�V����+��q�F�~�yi���� ���Q��f���a���1��	���
�=��S�R%
������������"�g�v����]�)i�4N�����<��,�E��G���"����\[����ow�G=OD���2�EA�u�"d��pi08P�
�3C�7��sViR�no���F��EJ��C��E��R���\�~]�a�&�@��T�L���'UJ*�Ts�O��B�
�8��o���S�j�����@Y�f����K� ��/_>���m���c�4�S�@�T4>��'���� �A��������	����e1nw��A�w6K��o+�����!b�Y����Ul&�G������]�.~K?�3�4(�|K��@[�	�����S9&Qr1�CDDDn���|���Q�Ery��O2��>����^��c��n��	�8��d�Qj�^:�<���\�Z����A��/��8����l��]S�!��	���3e���G���@OPP���	�^C�8��!�.������Gj7�k���k��&!!!���f��R�Z5�����7K�J�Q��x�h�w�x��#E��x���,�,����o)�zK�'�Hd���AP��x�o�����������������^Yl��N���\&K�8���y&��K���o$��W���s�t��H�j�+
=
�+e�����'���^:��>U;�K���Z�;��*���I��>�?�ge��[|�I��&��Hg�w�g�mb��������qb��;cG������+z�a�����\��2��P������s�����L�8Q�}�AB��m+��W��Dl����C����^�����-
6�Z�jI�v��������%K4��e�N����Y�n�l��U
,h,��������5%e/���.�k�Nq�u0���A�7@�6�|������	&H�
4(u��a�A������O���/s���]sc�5"g,2��A���M,�N�R^��"%K����.�-?�m<Jy��-]��j<"Gy5�\�z�s�%$��c�}��x��K�c����,,�%6�D����+G8�o*���_�N����@55q -�������6���n+��1�rk����R���sb}�C���'9O=�������*���H���.��k,~f�1��e��M79��J�X��z�b�������%	��Gla������%��T�)�L�O��@�]�>p=�{���H:t�L�4I+G�oS��X=���A��<��M�`�)f��=HS�>�W���t�I,���G?~�k~��=����uk���d��-qR�����}�])Q��|����h�"���t�$�#�:c?���@������Mc�5�?���-�w_�������w���Q,f���a��2����usW��
�6 ���X��s�c��s�c�%������	6�:���W��<$AM[���r��k�����9~�������P�;��������X�X0���������������v|���v6������R^h��r�m��vH�]o����S^����o���1��+}e��n����7��(y��T�9�a��.z�(1AsgJ��Q��{� O�����k�f��.^8����=�@�}��\�v�X?��a�w
�*m�JG����_h/���Kc�����t�x:�8z��7d����\�b���W^�s����5k$W�\F��@�@H�����s����#��
��~�IJ�*%-[������w�}����n��NI�T|�$��F��kx�]a�����C��8f<Jy^�� �R1�����s�e��_�G)�����'��0��,�����/w�H��1���Xvn1�,[�Z���������f���JA���G��|�2&�l�@������>�{�*�>�{�"W.����G)���������{�#��4�yW�f�,AeW�D.��s���M2�R7|���J�X��z�b�����<7��h<J�BE$����#C�9��!6�m��Q��"CQ�(��X��4Da��.^8����=�@*40�
*=����%K����@g��=��C)T���4����Ak���k,�	A�?�P{�4jt7�V�� 8�r�J��#�t��]�O�������j}W�\����K���e���c����P�5�O�>��]��~0��M�V�$w�����?k�-�T7�\#����=h)����&���~�=��\���-��R��'1^����K����/�;��G)��%��Y��xt�T�HB���8x�rg�`�Q�C����["w��yW@���L���b��Fz���]2!{��U�t��=MX��/H������%��������]_����/�w�Er��k%r�^L��D�0n0���!����a�<Z�"p�2���]�vi��?��SS��.^�(�7o����T�REs��'Nh���H�v��A
� �Zc>$$D��_�o���S7u���7���K�.��7o�I��X�6��S���$�6�
��+_��RV�z��V������	�`]"""���^��IT�C�K��|�x�<�s�sD�� ��`���0}������_}�����o1��I�&R�L����h��1w�.�����k�'��1w0a��-+M�6������)St�U�V���#5�^=^^^Z���U�j9��hO��c�j0�����r�]�|Y{����:���O�k�[�WE�
��
*��DDDDD�I�z�]~��	����GO������'�s����5�2������KDDD���w�s�g�s��#��d���:^
R�a����;����g���_~��c�M�J��~/S�L�����=!XG�����tif/%���1�0a�d�����������u1!��TmH�f�x:�~��d��=�o
4H_c �AG������
�#��}��w���c���{x�E�R~�B�z|}}��nF0�EZQ�"y����|X�Uz��+���  """��b�� $"�2��9S��=���������f�������6��k����oC�4�Cp�G����)b���S�N:9F[�zu
��o�^J�*�)�0�13f4J�l���>�o/^\6l���8B*6�����O�����
����q��?��7�`�������n���c�����2���+W.y���d���Z������(�A�����k`�Q�F1���<������;:��;A���g�����kO����k���=o!���?�0oB��G�^�zE����^B�!����OF�-��j��A�
Q�]�v�1�x<x}�O�u�q}/DDDDD��K=����y#�21�$"""""J/�K���[R�h�x{�`�Cw��CDDDiP�y����"������Y.
����S�#���k���w�9sF&O��-�P������(�A�������%  �Xz��9�����b�:_������7)4
��1"�'��@D���@�%w��Qv��-*T���s���	�� t�w��LDDD���������sp��������l!FD��4m���l��AF���=zT'�e(��DDDD���XO���5������b=��X��7�
%�K=��Y3Y�d�������C�U�V:a�P�B�`�\�������J�����H�������z�S��ZQl���"[�i{���&�D��.�3����/j#����x�(~�W����a��T��lM�t�\�L�.����DD��`l���[K���e��1��_�7�|�����L�qd���������{��G)�"�K3D�9�;Qr��.�U6i�DN�>-W�\�������C����DDDn)��Xw�_�F�D���B��3K�E���+^����G�/b����^��%�?��.��{���O��(0Td��p�Q�l?)�������R�b��I�~��K�.R�T)����	�X��P�����A12��-���>�h<ID���5C�'_�|��Q#�0�eDDDn+Ca�|b�x<���C�m,�|l�x>2�>sws<��l_�E,��������Xr���c����B�k��7���s��H��!"JI�t�R	

�������~+_��N�����K����������l�����AK�+VD��{Z�l��������E�s���^��%����
g���<|�""JO�������n����r��-+V�	�L�FDDD������#����w��o�����s�==>O��S�Nr��-c
""���tL����b��%��p��`��f�Qz.��]�=%�K=!!!���_JXX�L�8Q��;'/^�3���CS��U���b=�N<�~$��o�2�O~��{����"aW�vs�X2����(���9�6���a�,Y�D�9"���3a�S�y#"""""r��@����8p@>��y����H�"R�`�8�<����ZDDDi���l���-�������:Y/L����zi�D�]T�[��g�ADD�Edd���_�^���+�|��4(�4v�XM�FDDDDD�������������K����K�*�Yuc�8<&�<��9�(��x��1a�%k�z��x��j������'"���f�sQ��n��!�<��6�C�9�r�=���j5�""""""���@�^���`�""""""���`�>}����[���J����w����'��g���5kV]���������@z�2D�������4���K��LW�^�tDDD������k���u_���S��"�.���%5~k%����!��?������T���N�� ?��U��}Mj��F�m-a����Qjp��m
�l��I�����5k$S�LR�r��r�������CDDDDDdri�A���~Z>,&L�2e�H�B��L��U�`��v�M~�;\:N��7����E���"
��#�d����E�U>��n�}�
G"d��p�0����%x�l����b�zY�Yo����Z��r�]	?�O�+�M�^����������V��Z���������v\�/����<sFh�"B��C�����d�K����S��^'���%�w&���D��f��n<BN�_�������#e�����K���a}""J,�6���}��X�B��S����Ke���	N!(DDDDDD����� x��W����KtB�%""2�Z&����e,�[w8Bn�d�'����>�hW������VYs(B�=���<!�wGH6_�X���	�$��y���%"!.�|$�_���M{	�����n4��>	��E,>>b
���%K��g�Z�xyI��UZ.%U�_I&�(��<b,
��[#�J�r���W�|B.^��!�r:�����yz^;Ypb�<f/��s��p��a_���!�}����(5��%�4l�P-Z$�����C���<3f�����'8
>\{9ri�'G���m����N(��DDD�~-2H�>��m�iD���J����T�S�d�H`�
o����R�����D�o\�K�{-��xZ�j�w�������Nb����.��I��VK��S|���Y5�c��E�$c�5�c�����UKF_����D^�d��k�[�c�_����f��UZ~i4T6���|Q�C���b
�)�^Z�EFer��DD�:��[�������J�*i���3J�b�4=[BS����'�#�z?~\���������G��
�sDDDI�����5�����\�G��<N_���;F��xX�9���g����f�x*"^���5bsL�s+��=��������q���`���i����+J^�\B�q[��'�w�_Ya��'"���|��������#�����5j�'�|�����'[�l�+Eqy�'<<\o\~�a8p����O:a��G�=zh""���9�1c�^:�B�l�pW���������;6�6�@�G���{lV{9�U�7�K��
����;//�dpxFz��!{���e�������� ���.
��=��tY�����+�Z�M9t��tX��\��������DD��xxxH��Y�`����kW���@NB�b""""""G.�K�3g��<k������W���$88X��y����g�&""JX����\�\�m�}g#�N�M�����3����`ysB��>)�g�H@����Dz�z/)aV�-8H�vl�=�GJ����F��r����j��1H�=��6G���A<4^��2ye��+���G�J�?��Hk��P�Yi^��d���z��ovL���4���#��?*-�v���#�2���E�4^���R#�rk���)R�XBDDDDD�t.
������Y�������3gJ������[�Oc���/���e����l9/)��C��
���I�'��^/��GfY�'�L��+����2�8>I��i�������$x�t���
���y��j�N9FN��
�H��GH��$h���b=�ED��3
�WIy��~Nz=���H�f������d[��e|��+cM�6�N/]���4iQ��X��}X�u���������f�i���������;��������d���r9���L���PYun�>��t����=�V"mV���.�{|�l��G�&.
���������_����K��2<�2(KDD����^�(ErE�\�x�|�bY�;�,��I�,�89(���A������*�
tX2g����|��G�l�}�(��r����@�+T��&�G���}5o.����w�V
�`]""""J�0N�����D�9Yi����?�?��h�&��������A�=W�����k��v����*9x���~�/�����R����(5�/	���-�������-"@�g���H�{�l���u����(e���%�K�����
U�}���CJ_�X:{1}���ue��$42Ln�����[%G��F=�H��h�b�Ye������A	���1������@O��9�b���`����7���exeP����-�����b=��X/L��)�hw]�ADDDD)�Y�zR������i����(��� XV<[a��/{8�C
����K���d��q�0_��cr#��<����yLj�,9������R�z0O��e��M��aC�������K:a����,�;��!��S��{�u�DD��������2o�<�0a��e��q6l��/��(�2{����;�������Q�:�3Qlc�X,�,r��%�s��4}�i���J�����'~�����'����S�������i������Asy��f������e��]��I)T��N��2<�2DDD������K��x
""r_aaa�d�2d����S>��S����\�pA���;��������Fi"J
�������v[��y^rg�a<%�oN�p���`�p��[���&���k����9��"P���A	������M�v��?�n7^������qy�-b�t��7%h���sg�0�exe����V�ec�	)�DD���m�&�{��c��I����axzzJ�%d��)�h�"�Z��@ ��m����>�����xa�,8�JN\��g��k�7�f�Jr����~�/���FM��/Sn)��!9�VD��o��E�"�����k����)�0�����@�)k��������q�d��1��A����l�������s���ADD�)44T~��g�������Z{������������'���~�M���u9%M�U�V�m9z���uV���������)����}Q</��'��yA>{�=��.��tz�Uy<oy��^����7�T�������7���U��KDDDD��=�����4m�Tu����5][����gZ��+K���\���k�{����;�M�6���Oj��Q�|��Q�Fr����{*"�o��#���=�����R�G���m����$�w&y��f����.�^���kF����V*{1�V���S8s~c)����@z�6L���k,��1���~��G�C�2�|�"""""����"""$K�,����""""""��)�em���L�>]o\���W��m+7n���HMp��}.59s���)SF/^l,������;7c��~�i9t����]��4o�<)]�������O>�D�w������c������S_e�""""��)s�����������#q2`l��k�J�R��,�#�z�9{���������m,��������S�4(��>|X�P5>����y�f>|��=Z���][�o�n���K�[��\�r��3�S�N:VQ��-����(9r�|���R�V--�w={���]�j���(1V�C%"r;�2e�-Z��={d���:^��u�$((HV�X����m�2(KDDDDD���������HBn���eRK��8p�T�\Y[�����p���xu��]�3����`�W_}����+:x*@+W���_]��al"���5k������^�;w���6m�4H&O��7{DD���V�b^�4$�&yj12HF.���Bn����I������W�<��������l����*DD���'?�8�������[>��#�0a���uK���Km8��k�iC1�%"""""r���J����z��2u�T9~����.����lj���/��B�g�.|���4��/jJ:�m{��'��"����t����R-�0������	��>����.$$D�-]�T{A���;�=�p#�AY��-�rDDi��B��#%,��z�����=2ha��$����J��E���$Oa�6k��<�&���K��j���k����_�����DD���~h���H
���������
�g�}&���O5�LDD��xbDDD��K}�S�[�nr��5)_�������3n\��+�����Y�f�9'N���m�A�y��U��}#�s�������4�B��e��)G�:������^B����B�
i�mGy����}�|j����U���3������p�\�3Ht{�P��������98�������;m$�\�=US���k����'^yns�""r�����/'N�	���7�c�1"����)�X8�����""J���Y����5k������g��������3��G��P&�;v�����-��$���/kj6����������9sJ�����	=u$B�A���@MW�X1���zzz��s��Qzq�v��]�y�n�'t�z	Y4�xt�"�����?�\�^{��������d<��e�DDD��j�M�6��?���
6�r"����h1���+���*���b�:_lw�E-sy���b���X/�	>���b��)b�4���~������2]f������������1'n
��N�����Nx����+�{�e�7����e���r;<P�����9-;�An���u���Sk������&"r7��?m�*Ud���r��m�
�	�l��+3��=r��'<<�X"��z9EFF��aC��y��y����o��
�����R7���y/�.!x
��L	�����i���}���\�}1�����t�����+�o��m�����9��L�����5�yJ��_W_�:���9���;Ni�a�a��i�.4�B4�����o�w��z�DD��y($#�	�;6qN���t�#��:���N��f�]�(�K��vs�X����$�K3�vn��BN�2�����DB/��]o�(�a��e�LwYo��O�:�Q~>4O�5�"�����
�������k�������Q�V��$3�,���e���b���^?"�����$"z,6���0�(n2�_:��Gj�1q�7o.�-�f��K^�v����~Zsh���K�k�[�N�n�*4JE�
����uz7������������$����n{S<�PA�z���C�;b���~���?k<J��"���G��G"�o�4���f�r��3�?rI�����x=ocy*��QM=��Ly�5��K���t����n�|Mk<���BH��!:���Y�J�W�����_������	����
����q��R${TEi�_�L�v��3�~;��)s���F�=�$�?�S����8�|����(c�7%�8/@�m%���:��.��p>�y�Y���j��>7E��:�;���w���G����q���2F�wWB�����xt���7�|�)���o��_~�E�w�.�����qF�������#�mpF��k
\�i#����=h~�����]�&$�3
$[����/��+��Kl���^��~�L��o���!��&����b�<C<��,6[�x�"���vv�x<2Z�'�K�g�vc�X
���>�>K������qb�����(��T������xD�"V��w�����Qr��#(c���n�~�:K��w���
�-�6�w��"��?*CwO���9�S���<�2�yt��	��
?!�Y$�������~��r1���y��d������~��#w������N�g�mb���������������;���H'�*���$Y�E��`�b?�
�/�����W�9���&�]��}	�h�c��q��7i+V���]�j��s��qz���	���
>\o����?��C6n����$���<x��6o�'
\B0�����wYu��@���]�w95vR��,-��h��H�}���
��N��cg��N��=��4)�pgm�d�%_�r��nc0~�N���E,��������BO�wF@��$2S%��������F�w����"��88kP�)�7���e�X��^��N�����v��x����`��805]���K>�p>HN^��>2��������w�v8���,�J�9��;����"�ZLFWs��/�������������K�&M����po��+���C�4�5z�c����U�454QJK���s�/�_h��t$C�xX<��@&���\����2e%��	b�t�^.���b�\.N�'rw��j��m;�z�
�H��D�!b�`�9/����mt�����f
���u]G�<8.
��o%�6���-�7����x/F����+�k�0T��.���29p^z������2j�4y�B+)�9��:�T���\rHHd��,� ���z������I\��
y��V�*�G����+K��Q_ ���q��|��Gq'
��Rq������7k��_�tu�_CJ�����O2g�,��S�NiZ;G(�V~E��rI��aw�2ft�2_c"9����)��|���i��5k����SJp���|J�{3_����N��}�����Sz�����r�)�~]q������>���Y���g`L����K�J�������}EJ��#JO�^�+S�!����O���&�����]���d�<}R��1Sj%���>U��'�����b�<[��a�zS�;�x<��x�l��+�|b�,�+sDB/D�o���|cJ}�#,)���h��A���;%�<R2{Q���I>+��7R��|������v	���,�'�z�@�i�,�@�;v������G���/y��'4
�;���&�|������-W�\�^*V��7nG��l-�vG���q���7��! t��	�Tl�������S��{C*�l����x���[�\�"O>����i�Q�i���
z��?]�u���N�i��}�[`��Y���fzg�������=v�{G�O�����b���H���,�lFO�Ul7W�����4o�����1d���1-��F�b�/�^���K.^��v.^�L�ep=�Ov^= 
�>)^��� �l��G��d�k�����K��X�=�����K=���v�Z����&%6�����/k�
�=H��z�j�	3�>}Zf�����x��qj��!e���)S����H]�u���l�����k g����=�,�3g�\�z5N�8"""""r�mU�vmY�l��7L�:U�:�����,���-R�7"Qz���v9��x��Pq���S�#J�p?�^�'rF,�����^�^�$����%sy��+��CD<2������4{�H��D�������">����
� �;{��l��S2ze�r�J��3e���r��i��;*�z����]��,��c���������0)���d��,��F�w""7��@nJ0�L����%q���C{�X�]vS9�|����A*����Z��#�<����yS����)��`���}�Y�<y�|�����oH��u��W_�rP�By���e��I��6m�����Oy��wt}"""""J[2d� ���� �6=v�����2���z��k�iY"J��.n��q?(q�O�%��:o�jo[�
��{Y,����G,����{�b�����H��QS�9��x��P�d*c_�9���X2K�Z��3�
�M>�R��c�~
n���#~'���+�K6�,r����(PI����)�����COKO]0�B�g�u�|B{�ZPr�qz��\�A��b�����fG8�"�4��[J�r��������;]�v��>,�z��������2w�\{�&L���~�M�g�n��
 
2D�F{���:��E�1��������(m�U��������6������#��q��2p�@mXFD�����z
J�G�w���y��d("���`��<�Q��x��I<���/���<�O�1�����(;6j�,��"a���N�� E�e_��s�������*���M��E�{������l
�X���z���K�B}�u�N���@�;ri�-�������@R���������K���Se
�J�E[B)���)�iP��-[�J�*��w!��ug����4���|b��n���
e�����/���!DDDDDDi�p/�l����^��=����/U�V��>��L)CDDDDD1�4��:u�h����G�7o.g����%KJ��m�Q�F��[7�4Q��^�����~�)������^�I��������
�z��l��%����-ZT'�>�4������������(=A�d
�8��F����gk�6���9SSE#�3�6e:g"""""���������e[�n��<�0
eJ2"""""J���m����3gN�g��A�0��|��7:vg�����7��9��$ """""2��@jK5�t��|��W2|�p�'"""""J����#�N��V�Z�x<�<��fC@��:u���S�R�d��������������=�/_�
�8=��9����WO���/�����R�J��?�����������*���R�@�X,:�/_^�?�d��M����Y��TDDDDDD�\�����d������O����,X�@�9"#F��Tn�iA�i��Qz����i�.\��A(^��\�~]n����Q������������K=~~~�a�����2D[�a���zHZ�n���y���}{�
Qz�5kV�]���^�ZV�X!aaa:&�����kC,��<�9ri�'$$D�^�����A�4��T�PAr���e��-������1Qz���-�����������=�g���2`�
�4m�T3"�w����"SP{���si�7,Y�d�Tmp���x��<����1cF]�k�.-��DDDDDD��|��W:�i�${����{w�S������U+y��wy�DDD�������:�{ly�L�X%[/�#w����@D�~\�Aj�J�*����e���2h� �����D�{f���eP������(=����;�����U�&�&M�q���T�T)]ND�v�O�-`�}���n����Szs��E�o�|�c�L80;E�Q{��w�&������BD�~\�����>}�hZ��_~Y6n�(o���T�\Y��A���������%"""""J�l6��;wN����=[.\(�����MDD����N�g���D���N����b�i�JO�Z+�/�1���w.����%("�XBD�^\��G}T�=�A�S�N����A��A����CR�zu�4Q���qk���1z�t�"o���|���r��y�����?��7��DDn"��X�v����vs�}Z��tc�X����������}7�5�R�����J�u��{qy��z��1���b�^�G,����������={����~*�7o��p�>����H��9e������j�""wa������7�,���b���xD�Ep�k{��D�sDD���z������(~aaa:OPP�2D�O�.�;w��0��7�|�����9S���u9�;�7�\$��1CDD��1�CDDDDD�a��-[�h������y�V�@i����<yR���c,%"J�,��^�6���#""J��!"""""z��V�����'Ot���0�)Q|�!"""""z�2e�$%K����k�������yS���o)Q���uG�����K���9s����1�����g�[R�G����c�`�-����#G$22�(��������t�|�2�v�Z���5����zp��d��t����������e��Y�5k����*s���m��IHH�x&L� ����^xA���s�����#�G�2j�(�������OV�Z��`�����a<x����[����W���k����=���m1}��Wr��A��(�O��>}���]��������R�zn��!�z���c�K����������n�Z��k�=H�|�M
R�'
?����h�B��m�`j��
����'��34P��w��=�������6����o��%��
�u��I���|�=r2 ��^A�1c��t��	�2e�>H��A�r�� ��mw""""J_\�A�w\�+V�XBDDDDDD����jo�DAP������-[�O<!����d��!:���A*�I�&I��Me��R�N
�����5
[��i��e�;vho(<�m����'�����������[�n��R�bE�5j��~�z� ��n�s��eDDDDD��K=�����;jK��;w&zODDDDD�����A�)f����I0��=[:u�$9r�0J��=�|�����K1��Z��T�TI��Y\������P�y��ys����ex��N����,z� 
��e��M�mAAAz��@�=,>��sF	""""������k���
��S��Z�j��������z���Q� �~��,]��X�v:tH�f�*�J�2�D�XC�
��iHQ������z(C@�#t
,������#���z�}�v�z��N{����=x��X�o���d���x""""�����@K*\h-Z4�	-��WDDDDDD������VAO��IK�^-K�,qz$��_��95���u������y�J���RQ��k\�~]S�g��A^}�U����q���t��i������>}��/_^�y������(E��3��,��	�1O�j�\&K����ou�������%�h�����2e%����#�����\�y~W<�����7OH���t�}�v��J54����N��T/T��nM|t�����t�-��������z���;���6�d{\���Q�8�R�����\c�}�<�������+e
F�m�3r�/�C���w�vcN$rG
��6%�?�S�9�s����i��KV�<%�x�|8��8p<8��}�p^p�W�����W���~'�G�S.gI��h���}���9i���U&N�(�������B���O?�qd�v��c� ��A�j��@���7����1q���z1
8P6l��c�'��?��#��/�r��A`�Q��A@i�.\��������m[��i�|��G2r�Hy��'e���r��y����?%K���I��Z�$�����kd�����v��s
��G��=yp���p�+�u,�Z�/�^A�����K�G)/����R����3��r��k��D�R"�F��-=�^~<����B����oe�������%��k��X}�������1�!O�2�D:o�R.^5��a5zH����G��~��3�g����?RZX�b�\Y����G�~e����;��#W.��i�G)�������s���G|���yWq�N7_��1���`��~�i����z��
��0�%{�PBX��z�b���1��z�b������9�$�Azn���c������=U�� ������X��%�����e����y��������~�2e�`\����c��N��gbB� yp�����k�
�$�2�5��-+H���6m�1�2/r]96om��<Y��d���1|��,(�Bs����;�ZX���U!K)�����u��u%2O^��4W�#���+����5u���:�R�����-[p�T	w��9!w���]���1��=��s�kY?1�D~����s�gsU�|>Q�wq?������|_�p�":��}�N�o���}r%s?{G�����O���iw9o�+WN�W�n<J���AK����k�x�NF��+Vhk5���sg�zOdbE�s������@�s��������0����A
���{kj��������5�.�t�"s���-[�H�1[|�o�^�%B/Q�����/./���n��+W�H�����?�����k���,_�\z��)�����{L�C����r��I�{_}�����[��k���1G�
h�B��v]��/6�37����(%������"6��$e��� �1�dQ��l�R'g�<�s��i���;vL�V��7%���o����w��?��C>D&V�8�����qo�8�����qo�>p=�{��n������W�!��Y�f�e�h�������O���/y��g���Y0&(k��� V|��>�7~����7O?�K�6��^��IDATJ�pO��s���3��������+E��^<�.]���k�7�|����^7��
���?k%n�6��sw����L���R����$�+��!Qz���Y���kz��d�!!�����;�Q��1�<.
�������_��V�q�x�bm��.��s��I0��]pS����0�s=����0�=����a�'q:��@����������Y3�=Q~��G��]�fM�P�B�)�R����[�6m*�}�����C����h��Tk�<����1��v/�#UZ�N�d���:�������E��>zN����E��_|!S�L�*U�����SG�R ���=xM�P����N�q��&"""J\z���gh]��h�'6��z������#��������(=B���~��7�������2h� ����=zT����+jO��A����O�?��#�&M���ok�� ��2�0��~��u��G��S��������:.�x�,��qc-���7���~��R�J�tY�|��T�R�+�����`�$""""��������Vh���7�����he��&o(Qj�4d4��0���=���_k��}��i��c���!���
}���a��i�j�����^�zF����:v����^�/Z��|����+
c�����.�v��n��Eq�>��^�pA��������E�<�
�Tm&L�e,�6.
�d��E� /\�0�t�����AY"""""��&  @{�`�~�`R�aL�#k����^��-3!4h�@F�%O=��\�xQ�6�~��n2e�d�]��s�����;��c\#���P�������K���e��������pO� ��y������e���B�	��T�\�(ADDDD�z�4��h������K��]5��	-���������e��������hCo���k�"6�[e��n���V�Z:�������������^
i��Tk����VH���m(��/�H�6mt|���<zL}���qAx����G�R��������4�z�����N�<y�y���+�d���:�Q�F��������(=����"E����H;����y��AY""""""G.�d��]�,Y"s���5jhK4L�J?m�4m�2DDDDDD�����K��
�V�/_.;w��	����3!Ql.��������u�V���i���:�%[�Qz�t`�������1c��3��'����o��?����S�Ql�%���������
���=DDDDDD�U��ye�����O�W�����['���W/}e������bsy�'<<\oL�+��� ���A���jj��f�&"""""J��e�&o�����9S.\��o��&;v��������/a;�J���~���""�g���<����D-��Gl�!Q���m�["��1�&"��������'���C�i��������:m��I6l(]�t��"""""�����_:$����w:|��6�#""J��*a���9�H������y����]�G�8*A�����!��e������u	�3]�����%�*gN�DF/FDD��K=�Q�:u����;w�T�\Y{�`z��'e��9��I��s��c-"""""�����L�"�����={�;
4H�5����g	��5�����������'����j<�������G�l����%d�R����G�<����b��%��kO [d�BDD�`�4�$�.]�@�������,Y�H������Sr��mc)Q�!�f���}���k����K�����,��Q�l��b������#^�*����x6��mA�����X<=��hq���.���G�,�c�x+.a{vJ��u��e0^���R�z2f�(�����g���r��
-��DDDDDD�
� �A�j�4#������~��g��+���]H��{���c�~Ml���<bU�Y��>�U���n�(��7H�����d�"���H���B,���Y��D^8�i�lL'JD�j�4��3gN������d��U���6o�,��
�w�yG��7!!!r��ui����,Y��v����I��?%x�<��y]{�Xo��X:�X28�������>'�3K��yq��x�(-4���	��'*@��'��gK������/HDD�K=�n�����k���
J��e5�����kk���k���b���R�X��������W�cADDDDDi_�L��h����:���5QYr����
������5����v��n^���x�*�=q"��+��N|�{��%� ���i�|j����x<���$c��b��/�m ����m�.
��������C������=?������S���9w�\��To��!""""��c��h�B��_���._�g��=�O""��b���m��N��%�Y��xW�*GK���	>��7K�����y��.�x<�M���7��\5	��Q,^��Y��>ODD�K=�3g���f��	�`]"""""��.44T�-E������������g��=����ZDDD	�z��d���d�z�dn��i2�m$���������;���7����"���y��d��;��aw�d�j,%"����""""""J�7����d��U�g�.6l�e������]+aaa�ZDDDDDDQ�!"""""z��e�����3&�	eP�������=DDDDDD��U�g&�{{{K�J��Z�j�N(��DDDDDD��!"""""��BBB���a�|<o��D'�<�#z����������<x�N�7���+��,ODDDDD����d�s��<���b�X�L=��\�t�(��-�J�.������'�|�MZxx��;V����es��)�}��%�������e��Y��}�0o>������d�'"""""rt�=����A���+>|x���;�u��?~\�x�	y���bL�������%E���/�[��\�r��3�S�N2n�8i��������B#G���?�Xj���e�5k&={���]�j�������[�,Y�����	��c\�'6���������<�s��ei���4n�X{��?^���'����ViP���1J��n������'���"9r��rW�\��}�J���e���������1c��_~��k���Y��<xP�1����2w�\-;m�44h�L�<Y��[g�$"""""""""""���C@��'�///Y�`�9rDF�![�n�l����Q��{���s���@��J�2��o��m�y;v�(��g7��4j�H�qY�xq���K�.�`�;��#��������i���P���������������@����l��A:w���\�X�l��a�Tf5j�����������Z����S�pacI�8 �2e��e�K���O�2e�yl'����'�
�<��7�����"""""""r_�nsz����
.��AO��W�j�6y�_��i�*T� �s��2� x�N�� (�4k�,_�\�=�|�w���1>���������K��<z8!��m�1�.\� ����we===���-����)��W�;*�:Qz��@��!h��/��+/^���~Z2f���v���e�Te����g�jg�����W/�4i��W������?��A�Sl������H���0�D�E`��zA���j5���|��xG5�LQ/����X|����������� 0��ohj6����x�A:�'�xB{�4o�\�����_���;@���{N{%��7/z�w��}�6m�������qcy��7e��u:Q������o�����x��G��^��K�,���'��I�Q�j��,��X�Q�Miw7%`��=���I�Q�X�����C�G"��%>FSReo+��}��'�����G��3:�l%
��2���f8������f������8��fG�|���g��-9�~����Vt��g���N�.+�l�yg��5��s_8�|��/��K��QAu�i?����:�����s"y��(�!�G�����������\��<��AZp���|���Xw����������������g]|��1'�s�9x�x�<�2����?�4^8�������&N����n��]�����o��R����G��&J+�'����
��`c��<��'�"�Q�s�d�i,$"""J\��������?�7'��.����Q�Fr��qMV�zu}������R�n]�h��1�h���!7n�qy
����6��ys�4p	9|������Ce�9�+��>��
|?X|�;�
+RL.��x$R���773��s������K2��T�w��y�S����W��1��J��E��e�K:�����Y7Z�&�5���\��h��w��,S%�+���z�/���G��1���c�]�<����>�yZ�d����gJ�mu�g�o�����A|#��o������q��U�p>H��g�1[�o����������������g��c�1'2��9z�x�<e( ���e<r_�>p�;_ erZ�����\�h�����r��I��{�H�����![�l�D��v{�H�s��yeK��"���DDDD���=��zv��)E��dHM�e�����HR{��&x�`��3��R����+��g��A��7�D�b2a��k�NC(P �c�m��X��M5�[|�}�����d���mZ�'�1'��A{�8�\E�W���s�t����|��)=
�+e�*��<!�W��yg���Q^*��������T/T��nM|t�����t�-��������z���;���6�d{\���Q�8�|��m��8qW8�|���o�J��Q�J��,�K��yg�]�����QCl��G������Tm�+�\��<��AZp��U:Oq��/�8/����~����U��o`�=���s=N��,)���q��x}���r}�*:��4�����H��Eul����k��~���}�����e��qR=Q���1zL���SG�/}S�e����[y�-[&���2bD��HH����@���W�9N����[r��Q}>g���]*U��c�8q7]�5��	��� Qz��<?���\�tI�.���|�YT��\�ri��z�:u���F��$"""""2��@z���qCo\��0�Mdd�Q:�+[��.\Xo���9c,����a����=HW5j���S�L��M+V����wK�f��{ar�O�������9st�,�-�O@����K�&M��#�m2#�h�B�;����������<��@���>*y���B�
�;U�VM��D���
=o��
-����y�W�^-}���
*hY����{w]�����������?�7�xC������Z���o�-�&M��R�!w�>}4��'""""��=z��%��-S�L�8�j�K��������4���8x��6f������&L� 9r�0�r�<+W��T
]�v�?�P���5�����
����+s����w���E@���~��?&�3d�
���W:t� �/��WG���ODDDDDi�8�)���9�0��g���BY""""""G.
� ]nHA���m��+��gBz�y�N��W�����Go�0a�b�����_~Y��A���0
� H�9]�t�N(���'_|���m"""""J�on����w5j��q���o8p����9S�.]*�5���DDDDD�K=H+�^=Ho;�ADDDDDDQ
��1��^��N��M��������k��#�3z���������bsi�'g��R�bEm�;�E�����W�^R�fMy���uP,G�0ODDDDD�K=3f��cH3����Jxx��9


�
h
�u����U�d����aC���1J���@�����O�����7'H5{����.]2�""""""J_�\�"?���|��g��������k�N���'�o���Dn/���v���F��o	�f<a���]���%r�Xfr���&�$���X�����?�����c�Q����(}qi��T�@)Z�h�S�b�����(MDDDDD�~DFF��3d��Q�7o^c��f��C{����[S�-_�\�A%rw������z��D�,���bi��|F�����{b�23jY���.������_�����*�c=�_	�!�����Q�R"""������|����������N(��DDDDDD�
z���?_���=Z�e����d�"��w��<�*U�?��C���~����x>�B<����E��������Q=y|�F�����#6�����:�n���%"O���^ T{�X����^�u����������t��-M��	�DDDDDD�=����z��I�����w��O�������L�Fi�G���Q�������H�J���QO�y�o���)`,��*��M,�J��G��YD"������.L���X�/K�g��?l�DDDD�>��@���G�z���3gN)T��N�/W������(EDDDDD��xyyI�L�tl�����LXv��
-��D�)�t|������[�*�+��v��x�h�J�oI�:�b�4]�W��-���g&�(3R<[,Y�w����$��X����(�sy�g��=R�F
��k��l�R&M��)�7o��F�i"""""��({�����O���Ke���r��	������m�6}eP�����&��}�vf�H�9��yb��F<J~!����R	�d�,�|��vm�X�}��M��E�l<$��K"��P"w���Q+�.
��l63f��o��EsK���;�����uL�<Y��7>>>��[oIHH��k�N��Y�h�N���=�C�%rG%��g���Q�W���+�3��%W��;b��*zA{�H�
c�X,�Q��x�(��,Y+�%��:����(���Z7�#��������GDDD�^�4�����o��R���exn���Z������(=�]���5JJ�*��w����/^,
��P�(-����O>�]�)�����D?��\'���������x<������D'��]���x����Q�WT�������]l��-���A�U.
������;w�|��������,Qzd�X�q���r�J�3g��?^�Y�f��+�9�!J<J����N��������s����TT9��o�����
�eW�G���������������d�a,%"""J�\���1����OS����
����,QzW�dI����t���,,,L�1�5���@O��9������h?���DFF���c�C�%"""""J�BCCe����j�*����a�-GDDDDD����������[W�}�]����b����y,�s(CDDDDD����6}�����7������������+	0�""""""���@O���e���2t�P)T���;wN'�c�C"""""���tpo(]�t�q����	�L������@d��Yz��!�O���j�0�ex������(�������[o�%�����
J�z��L�j��2kEI�@���z��N�7_�t)��,ODDDDD��xxx�����.]Z,��������(iR4���M�j�t2>�G���&�<Qz�tlO?���]�V�_���������*E=���������y��{����d�'"""""Jo���Q�F���<[�l���������+����ZDDDDDDQR4��#G2d�N�7O�81��,ODDDDD������������[��7�H��u�����3�j�Jn��a�EDDDDD%E=�!nHV�Ze,��aP�+W�K�������ooo)[����WO{�$4=����!Cc-"""""�(.
�DFF���g%88�XrO�_�^.^�(V��XJDDDDD�~���S~��'Y�xq���,��� gt���5�t�B�4���ys}{�������Z��+��mDDDDD��EDDh�6�r�=]�|YN�<�1z�����(�� ���_~)�;w��^{M|||�a����{��;���G&M�$����+�/�a��2eJ���4H�w�.7o�4� """""����m��3n�89r�T�^]z����
&6Z�HcM"""""��i����I�&2z�h�>}�8P��0������z��a�#����/_>��q���[WN�>�7&"+W��s���c"""""��
c��������}{�1i���,\�P�}�])U��|��W�+W.c-"""""�(.
�rI?��s��o�
��sG>��)V�����c�i"""""J�pt��)y������^��%Kj�����R�hQ0`�zf��!����Z�#((H���+�w��3�A`R`����:{��������-l6�\�vM����e����r����r��.\�������=zT.^�h,!""""J�\��E��!Cd�����Y3��1�.��3�,Z�H��1b��3F��7�o�����L�2r��1
pd��I�}�Y����5(�nl�U����__:N�}��Q*a~~~:�k��-���_���^z��%�����APf��a���/jY�;x�`9q��nc����_{Ma�|��h�������c]""""�������l��I:w�,=z���'����-�0�.�g����DDDDDD�M�$w���{�\<��#z?u��M}�%K����1��������^��?�8���aC�T�������c=����?hv����K�N�bg�A
	'O���Ef	j>��3����:��f����u����~�������y�EA������(�ri�c�\�zU�~��x/�����N�:Ze��������l��I��5�����;vh����
�V�^-Y�fc-�q��
d!@��_�S�-�R�;{��>\4h 'N��M�J��=e�����m��9���`C��:h��E�g��%�
!���Q#�V��Nx6l���@-��Mz��7%��������(�ri�=x��]��t(c��!"""""JO���]�vd�����8=h��(�Q������#Gc-��J���j��^���S�=�
��F�M���e���c�b���i�F�e���/_�\�BH��L3!�8zO���j���?�����v.
��B�n����
���o��Y�C��\��5j��Y�fI������W��|��fG@��� 6�B������)V���NC#��{�j�?��Lb�k's�����K��wS�������
���C��p����!��exca����1�u0.����'e���:�l�\��W!""""J�\�A�)�����W7n,E���U�p^�vm}e���������+�=�������j�0Nz�l��U�����R�
�bE�=h��=d�4i�-|&�d�N�>-��g�<y�K�`{!(��o����z��(S�LF�(�d��Q.]����}��8���b�6��>�	4s�L���{X"""""w`���f���_���k�csL\�#w���\��\&K����ou�����&���q���(y��������D"V;�r�����Qv���yB�������S���T*��m�A�A������P�[�5��e�����YY����_�y��Ib=�Y���Ym�X�=���v�(�X�����f�1��p���Y����2��6�9X��������j�1'����v��������W����y�����%�t����8��8p<8��}�p^p�W�����W���~'�G�S.gI��h���}���9i���U0�����o<��APA����A/3-�;@���y��:]�pA�7-K�c��	~&���q��:�]�~������u{��t9��qL��_��%�L������[��h"��2d���^q�`���LfJ9""""��`Xg���K���^�"�9���@�{c��9���@�{���s�I����:uJ&M�$�����f�e<x�����|��KR��s��		�����T�R�d��]��K��������.^�(��5�����k���'�@��_~)�}��z�v-�@�h����l��E���c��G�	w�M��������i�p����/��H���UKDDDDdBord>sF�� ����G�73�>�"�9���@�{c��9���@�{���s�I����wI�N�4�Y��E5�_�>(F�����AJ��5kj�6��1�3��^/��^�����������K5jd,�	�d�����=�N���e������K�%4��dx�l������w��GW�\��7&x�m�6
,}���:6���;��)�y���e�����U+c��a���Fxg�<�����}�����b,�]"���e�lYE�+r��@�]��7z��@O\��7^8����=�@��k�4��`��	$C��3���]�v1���1c���A�����I�� �_|������A`���?���W��O>i,�
��m�V����y��w��A!�B�5������������WE�6�~��G�G����C�'((HI6M�<�X�����(u���r!xp��VQ?��S�	��.=�(Qz��q0�����<� ����e��}�c9R�!��i�&��&N�9�c�)R�XW�J�t���wk&�JX�������ko�'�xB�8��w�[�O���U�V�7������y�f
�a`\���oK�9�ZYblY��@DDDD�Z�4��n�S�N��%K��={���_�y�����L9|�p
�:4�������(=A��Gp���'�A
w��lh����0�(�/_�qt���Oi���<���Z�t�"
��J�*R�Z5���;�>����o�*�y������
��������R�a�l��M�j��p�:n�8�[��T�^]����_P���>���1{�"""""Jm\�	���w�yG{�1���Y{����?��#m��<�i�f������(������� C�0����8�c�]��__:v���� >_��}�{����#�H��=�5H��&�+�6�������C������Y3-�K�����3��~��?�Xf��%~�at��C����x���HH�� JH-7e�m���+��V%""""Ji.O���6/^\���"���[=�&��VDDDDDD�
�
v`\A��,��U�V:v�;��0`�4H���/�s�Ny��We��R�B]��)SF'3���GP�B�4�����5jT�q��
$���6E���0�N���c��	��V�X!m���G}�X*����%��>���xA�%""""Jm\�A�|�������%�����y��>��9�\�zU���7aaa2p�@��u��)�����D�=���[z��np_���a�
����1H��c��\�R'���AZ6[��|A����y����w�n��E�Bx�Ay���Gp�^��|��{!""""Jm\���;5j����'���P�X1ht��].�W��VX��CDDDDD���!����55R��3F{����u�&Y�f5�""""""���@Z;a|��A�|�@7�:u��o��-�~��wm��A-�����(=BO___�W������������|��*U���C����?��;�������u���M�}�����_�<�K��n��:v��K�4�[DDD�Ql.�@��5O���@�2g�	�i����[������(=��l��IY�j��g[�f�l��9��������ZD�����G���#l,�	����9#������G@���7�X�/^���M'O�����._������z^���~
4���c����s�X*r�����cO'N�??��vZ����~��i���|_P���s	n,��C9|��C#��mng�	������&���c���k�;����{�X�����u��xx/�{�6I����e�yS��+��cx�	��R�y4�vNh�����vC���3$v�q������
�1�x~p�����r���4.�=?(�������1���s��Io�K�'����G�@��i�<��S��qc�'"""""J����W�^Z��|�rM{���/���}�]�� r'�w�����K�����

�1���/�e8`<*�~��7-��������gDz�����O>=�q��M���N4A�A�.�c�>��|��1*����B�
�r�Jci\8V*U��e��]k,�4i�.�V�Z��\�~}>|�%R�25�g?~�n��^zIK���	�/�n��9�a�a������k�������U�V�6�|��5uh4T�}���O���1B4h��s���o���yT�"C��@�f�������x�h$��];�oDY48_�`A����_��������j���m���	��%�N+V�s`|���v��\�~}�v�W���i�F���1��B��]���C��~��i'���b���>�H�y������;w�������
�1�x~p��8�0���G"##�gb���E�Z��	��={���2����~Z:v���_��)=qy���~����������*nb���q'"""""J�2e�$����t��Y+$�:t��e��*�����cO�����?���)�Q�n��x+Qq�x�bM�Ht����������s�����J�+VH�%�r
����}�}_���%V��������i0�@%$Z�'�2�����=��n�={����C�AO���:uJ��M|���S�N���K�.Z��J��-[�����3P�
������ubh���{O-Z$o��V�`����u���J�V��,9S�N����G7|�~F����G�h��	�����~(���K����������~+�}���S�������g����c!�����������@`����<W�\��l18���zL���T�����Oe��
Z������cP���;4���_�dI=&f���`@!����Uw�����=�����|8�!�8�w|�qLt��U{� ��_������|�UE�-;�e�&����v��I��K���?����������^�F�X�bZ�4p��'T|����] �v�u6*bP9���	����.,]�4�^H��������#`����2e�l��%�u���cY���P��q�F��G�E��Y�*��/��zH���P�]�ticI\��u���$�~Fe���{e���5���`mP�� *�k�^�P!���/��H�m�'OciL������������z��2}���F������!.�3F{��5�C�����9s����3z��e��9b��y���;���e�|�����<y��>*����G����_�������gK�"E��0S�l��U���E/����x6��p�vF�&C����"�BgT���
��o����C�2���q���q{/�����\�r8&��g���={�{(v�/wq�������g����
����pL9B�A=�p\������
���A��pi�?�h
�/(�P89��\�r���\t/����7�n�����(-A&�C�ik��#�z}��d6���^�:��=B�Z����Y��F��e�j���V��V�G��@���=����VH�-�QG�J=T8��Jl�#�Y��������"��Ti
*����1���������{�@�*U4�*Fc�S�1?�,Y����l�AJ7�����X=Ap� ����i���F�"@�!*��[	��c+~�"B`	���s*x�^Lx}���y��)����5��0.\X^~�e�d���b=Ipr��\����WJ(�@Bp������Y�1	m��p�������!���Ix�u��_8n3g�,���z�c���
����"a�<2I��f�����3�x/�)�3�������$�w���sL#L8~c&l_����=0!�����|�q�a=l7�M,O*��3��3f��u�|���Q�G|>�c��t��)B��R�>t%�z�/�O<�����9r�2|�qr�����a�!2�'-t=�M_z:(������TPbJ���+T��=7��P���@b-��_�7h4�XqeVDc�
T�+T�b�`T�"�<�T�r���+�rP9���8&�1>�c���r��G�QA�T��E�=�1�PI�����;�c���*IcW��P����tX����@G �^��][��������@*��zB�W�����2��1z*���#��B��H��r8��b�uB9�Tb��!���q��
���j?H��^4�e���������XB)�R�.�?z0>	�9z���$�A�GQ��`���#��3����`?c���D���-��:�O��c)����b���o�����F�4�u���<�1�4`4����������`zc��)����c`=��
�:8�Q�i�������
���h���fX�����I����m��8�3����#��/��R�y��5�F���'�pK(eZ��O�,�8��[.��_RD�Qe�;l���Ht)����� �-�|C+E�AK�#G���q�	����&JMP�����D� *�0��@bg��G�*R9V.����7�SA�Th���n|�(e��E������hQ�Pkp�LD+m�J=���8)��C�or 5��tH�pc��%?'�>������@*���?hP�`^����=~��
����/_|��8����ZTZ#@�L���k9��h��e���D�'�2�29���sa\�f%8�5|~�%^�"�6���7�|�A�7�lW���R��g�����!0P��J{�G��C�<s�����8G`��Nc0��A�m��;p������^�	��e��g�4����"@���7�G��Q�Fi�=���dj���U|.���C���a�4��Tz��$>w���u���u|���lB��C��?�����YP��@�XB�.)��X�T|�#��8�1%>�����A���-]���Q<|A�@�AD�5E���5jD��I���<x�~A��C��i����A�4�(��Q���h������3h�{B�'w�
!����6��1[�c�6��E�@|P��ch���z������VD��
����sZS#
*����$�J�c�;V�!8�sa��������L��_D�oz�*���BkxT�'i�PQ���f�6T'*il��:��vlh���)�+D�����Q���@F��o��E� S��E�w�C�&~SQ�����K��l���P_��k7�*U� �O��a|�mOa�\
�N�Y�����F�*�L�1�P���t�{D�?�O�H���f�T�c�#�������?M�rL��fa?��b��j�ob��e��i��DD������������-�����<&#�������q��z�`=���/h������/��B�`B�&a�&��1FR|����|��_��0�1��8n����D*;��p]���4������>��)	?���h]�(+�8����G���<H�@i�l�]e�]pP�D�"�-��@�
��@���&Td���(�C�*�J�*������o18*�<���30[�"���)�����8JOi\\
��y8a�b?�bi�P���P%*�������d�mC�Qr����V�3	�!0zl����B�.>7�{	��BE)�h�����{��,�/������'�~��h���Y8W�R
���j����,����N�:i����O��&�c>��S���|��W��
���4�������x�.x�H�"���_�����3{�l���~FO|Gp$�k-��GqL�������z�-��#�`��A��	��p����c
�i���QR���`��s<N��:v�����C��IM=A����^5�\��W���)�?����&�������"c���^���(4d��+!xofOO�a���q�_��)-���8T�
^�+���!w"v*r�a�#����XD�p������N�8xq �>9!� Z]�y��DDDD�������I����-w��Z�����&�AY��E�<*gPI��ELH��T0H��z�����$B*CTN�2���v��U���=%�	�	�4H	d�gL��E�!��@����eQa�2h]���H��X�x��b�-��
i*���A�&z58ns��@P�H��Tj��zK�;���IQ���������
������9�z/���yP���m�#��������/�h�4�6�
�FOpL"���#��2I���s@|�0&�]P_i�q�Jc�������H��-����E�s?#���kx��������Z��H	��"�����5H���9 �����a�;�<����8�����X����1������{������t���1�\)����:P��:z�q�p��+��(
�#: ���Gl$"��}�����S�'���7�^R����0�	��a�7������?����{�c�������'V��
�K������?��D�G'P����%+r�����jm���x
"r=���t����yTJ����(5�q�
W���H��8!]Z���:��C�?h�����B�*'S�"io�:�[�S�����=����*�PYg���9P���K����8�%��vBp�4�G/��1T�"����9z��w����G�(��P��
cgzy�wz!}��	�{�w:v<bGK~��Y���x����1��h���g�eC/T��\��P�����XBO�:�w=��C�e����������>�aP��?���������z�����;���_<<��(�!�d��0�~�F�7|�����2�?����~���$���c����A/,���d�7DA�;�f��� 9��_�=����p���VX��z�&�����7n�8
�9N����z#%zz�������������������MfZ����z��B���&\$t����B'>G�������tDD���vs���ADD�����@ZkT��kc�h���:Qj��\����-H��
�	)z0&���+!(����\�p�S���F6�=�{�X�K��
@�C�������3&,GE"Z�;���������7B����m�{B2�_B�%��������h�{�����������@���
ngzy�)�P��`
^?!���q3b��8w���Y��^����F�1J��� �U�����0��d�o&�%��7�8����g�z&���@@�����z;�1B��x����������;��HW{?#��K/����L��uE��������@�Yq�@^����]�>��3{Q%��@�����r���3���?���<Fj������I���L
��]E�F��d�l`{���C�c	lkb�`�#�C���T��	���l��=�/�����a��<v&��>�8A:�W!��4~i����?��<�EQ�����//"��N��a�����?(8���v�<�X�({����s��?c��,��2q�&��� �~��1����*G���K����������Iz�<�J���aO�����x`c�m�,4�����M��e�������2r�BT�aK�����l��6���O�f�[�������}��u1���E�dp�8p���.%�=��i�g�G$K������3L�NE�y�����>�m�9��:'�|����R�X��pN�������Z}��1�r�#7���s��#ey�"!��BKeT~�"
7�D�*��<x��i��m���V�!�~�~����=/*����O��C�`�
X-�QdV��������������"���qA�-Z#
9����G�����*��@���Oh�k�;T�c	���
�y8�O��{T�!-��Lx�H@`	� ����!�;�g4��a���3e0��,�8���E�*T��7f��iZ�-�<��f�,�a|uSh���uT�"mz������#�<��'��DE5Ro��^��%����k��`
*�Q��c�|n�"�>���K���F��������1C�|*�Q/V�\���DY������)�H@Y���
��[��n�����m��V=h�s���:�����w��a�#�&|>T����(���[���>�s[�n��"�/|���q��I2d�_���>;����?�� (��sg>|���H���g�z��v`�x����O>�����[
���1� %�w���lkp�`{c�$������y^�����c������
�0��K�����#�\����G�
��+8Fp���N(��y����y�3�8��������y.B@�2|��@��+���N���x87������4��	�F��/m|'',��+�����=�s�b"B�X7XG�
2���I~WmGee�1'������s6���*����9�,?�\���	��������I�����>���r�����-�)U�Z9�.)����;c���r%(�oO������\K]9e���T����s^b
��K6�U�w�s�8�)��O.Z5%_V�"�����������:l?\�����k���9�~}��=���M4*CP��|��
)n�PY��*�������p J*w�=BE>*���8>��E�$`L���]A	Hh��LH����r�
��^F:��G���8Ow��;z� x��gB�9�W��E�*(Qi��<n���V���\�X��N�:ZqiBJ�M�6i%1z_|����=�
�������IB����D�<�4$��A�6�sh1�Jms&�A�=*��!P�|�;���c�->�E������>D0�T��5P!lP������������[�@
*�Q��K�o**���c�iQq�al#|F�;P���	��up�A`�����p�����4\`�"�h@�����T|P��
��tE��
=H��G�\�=zT{_�o�5p��<����}��b}��u/��	8�-pA���m�����
)�p
�`!����(����C�AI��*:�����$��8f���5���y^�r������	>;�t(�@o|��&�n,��A�����E�(l����1{"�[������D�%Jh9G����q�)MC��U.^�h+V���~Sf,���O���^{M��������Dg��6��XJDDDDD)��4���7n��T�b���O�� 6,�s(��D����gm�j�������[�nK�����}�����%K�/^l��m�V�{�\�b������o[�R��,�1M�0�V�B�����%6����bOe����n���f���A�5j�n�K��{�n�#�<bk����m`?��w�����Y��j�*����}����t���&M�����g6J�-����6�X?�{�	������������5��EL�|'��t�������G��'�lR`�L�8���c��k�;����K��w���i�"�/�6h���d��x����h�B����o���V|N�<i���C������M{������}�������y����-3��,|�~j��a;s���4~������(��6m�_�����-Z�(�k��=z��|��Z�f����S���]��c�����^�z�(�n���k��������gk��a����7N���a|�f�KrW��Q������u$��2d������l]�t���>���w����PW���V�������U+��m��s���y����}����o��<��2�7l������u.����>��!J����
TD�������|�����	`������R�����t(�Um�����A+g��E�����A|=eb��q�=I���}����z����+����H��no����y�8��^�z�_6""""�4�e����.&6,�s(��DDDDDD�\�AED����;���bOb 'cz�|������� � �c"9�W"!�-9s������q�����0�exeP��������K=�)��o��A���)�Y���U������!0��l{���:hW��p��wDDDDD�v�>��>�r�������K�.:a������'S�LR�xq��=��$a(��X���K���u��.n��i,�R `�9�%DDDDDD�����j��������W�f�����������k��UZ<<<�A����_J�"Et����400�x�3�L)�����_n���i�===�	)�R"�;����1�����X%,,L����"s�����r�������`md��q��e���������2%�


�u����������.�1�`_��sG�5��	�e����F=Q@@@����x���D���������e�g������K��t��p�^�vM�M�XH��������1�����
��]8��R�Mqa8	|��y�)cq��w��I=��5�	������(]����9��q���A��344��w�^����>�]�vM'�=(����-K�,q���3#�b��-�m��=Z622�v��q[�N�l9s������V�ti��_~i�|���j�j���|����|�����oo,�k���6___[�L����?���;�L|�aZ�h���!C����/��|�I���-���(""�����r��ak���-  �x&mY�ti�mkN�������e����?o0`��`�����+f���l�N���
�>��#�O�_����m�k������y����]�tI�a���=��3���o���b8�~��g6ooo[���m�����������/^<��No����h������;���f~��oj����;�$��)q��o�����������g,���>p<�����[�nK�(1��)
����b<""""""J��b���>�%��?//�����AKj<����0�e��j��Mt?��__>���8S����GE��%��Z=(0������e��2y�dy��We�����[7���E��w�{��>}Z��[���>���Q�`A�B�)�2��e�w������'�hO����:�^Z��=��-���zK�/��<���Z=yz��!��
�'�xB~��'���������f=���R����������t{��U+��h���S)�p������5k����e����~L88PS���W��c���/����1�q�����������e����a��n�#�����o�i��z�P���������9sb|g�(��K!�8h���6�'����r���*�������A��=z�W�n+_��m����b=
�b���	N3f���V�D��^-�������m�e��:t�����6v�X}lZ�`�-c�����'K�Bo�������#���A���y���9b,�_rz����3d��������)Z�g��5��T����i��i�������}:o�<�����[�n1z�����;wn[��=���s��Q[�
t{b?����e��[�&M2��/9=zL8^q,�*U�v���L8'N��=��v��n{Q�����-[�s/�����?��c[��
�{���w�{|����{��3F{��� %��=z~��Wm5����kK�����k�p���"�'��!�<�B�y�G�Y����S��}����;-G��X�VY�p����o�C�Z�j�=����/y����7��X
�<����z��c�km��IF�-}�����2���7�X+)
��S�N��Q#����������B���;J�&M���z��T�vmy��������K�w
z����	��n���b��8�4��^c�t���X��3gt\��%KKR��~����d��A:��A����?Sz��~�w��������Ta,�s���t��%��$�f��	e���{��c����r���^]�GY��o�������`�^M���������S��_o,������)S��d�R���Q���!)��y���Y��<�=H�����g�,����@��N�:U�����?�������~I�esC��������>.�����o�&t�M����R�v�������p�p��R\,$^7��1'��=.Jz����x�3>s������P�B1>�)������5L��E�`;�+WN���}�.�
��<�Mh��+�Ko���� ��+n����g�}V����[o���@���+����]+U����-����z�o��M��16\�"u@��������?���v/�n��y�}=�E��5k���E0�����q�TI�}q���23�s��2�I�B���l��E�FY��:tH�����v�}�M���������5K����3���6mZ����#9�4=P� G��
*hJ�k�7����m�,Yt�	�$4�D���\�s���B����6���JG�+&����^@EbJAJ6����G�6�c�{�������~��G��H����3#��#l#�g�/�4|�o�!��\�����#���2+~�/��R�z�+MHI�k=4>�����8��)b�L_P�7o�~�V�j,���y\o4k�L���W���&��BBpm:b��~W�RE���]�t��^s��?^��)����~���4���-��=��Rb����g���n����Oe���	i�p�C`u�?q<����O�1��o#O>��#�+W�t���rl�s� �~?�����K=����nb��F�
|����jN8������'�3f��r������^�Z�_�n<�	�#`��Fe�9���9���B!�
mGO?�t��0�6m���~����|h��@e��
�&��v��y����$n�qc\�L�-���?g��7,�n�����7Y��h��	<x$zx"��Jm�����q�C�y|�.^#!����mq3�L����;�g�p,��QC6o���p��B�7&�p�������j��'�~������S(��];���_4�<����������xDI��AR�s����;�5q����p��5a��a|	�����
3n���)����U4n�X��/�AbT�$4����5����`T��|��#ELR�Q*�p�����CCP�w���@E>*������;�71�Fc|�-[��
���7���ud�3��p����kfW�$J���:}�ty�������sls����2�[s��7

r��oQ�:utylf�-�w���&���F��������w��o?�~&�:&3�������~7zo��z�`�������$�b{��c,-ZT�e1�}z�|���������,�>��������Ey�S�?q���:�!(g6����um��m�����E����'�En��Q_��}��,����4���O�1�������1����S�������%Pw���{("J����2�$��h��Kl6���V�dI��0�q��Um�}Li����5�-r*.\�������lZd�s-^����]�r��LL_|��-G����1�nb����.\���-[�v��9����|��,6l0��l����o�Ek��5{�l��f�2������G]7����7��r��e��@K����6��6v��}��r|.|>�q����R
�I��o�p��#�����7���~S�����_�i�����>y��o��}��L�V������~a��e��a���������Lg����.]:F�p����{���m�O��ep��-�SO=e����<��1���������n�7��<�ER_\���M��{��Z�m��/���r��5����_q����������l�=��^c;�/7��8>�-[f,����1zb����|D������*U������j�����7NKq\cl�8�����gdd�������������	�W�����k��=��2�|�
���[?����%�u����-s���N�O��bGx�?e:w�}���`{���C�,Z�z����?��C�c�^��8�~����-Y�D�Zr����V���mu����]���}
��k����Z�j:��u5j�e_{����)�X����o?���>L�w��y/��?�s���z�����3�D�v�����>��.  ���U+��w���4�Kp-�u>����f�^o��I��p<`]�{RX�b�~����k}�����{,���1�c���;�������~�zc	%�������j��m��c���A��8F0����Q��%Qp.�w~��i�"��K{�����fU[���d�*-��#��-���I��~li�q��B����w�MU���
�P�'�(�Qq�-
8q����=q�(DA�" �( {h�~N�)���I��M�}��4777w�{�9�S�N6t�P��4z3��� ���F�]z0�3�s�8999�;�iNm�!UO��5��|/z�-�ma[~�cn��v��
+���N�o�.dj���M�t5���	l���_k(|�������p\��;���E��W/��"��u��r�8����������]��h���s=����`Ir��*b�QFED�T#-��`�=\�R��J�Jb�

�nYA��##\	/����H�%��N%L�;���m>��6�mKo�l�p�p����/��f����$�����z2Z���,)D�3f�����a�y���3E�T\�� �"�Q�"���O?uq�1�3���RF`���TLv�UW�#�<��sW���O�&~"O���0�y*���~��C3�=�<z����nj��sN�����':Sq��0bd	yr������Q�0��`
c�0#}���GO=����ug�,�������fZ�D#����
1��k����\Fu4h�i���X�����r���a�SKq�!@Y/��V�pQ��.�2�j��I.?�j�QQ����4���"\wFJq_Q�G:G�������WO����?����'D>�x&<�qQ��=�wk����e��$F�b��i�7<�2�s�l��~�_��e�w��������S���E2-�
=��d��|���J"k*]�� �'gX S�H�A���g(��g�y2�d��!3@E
s��P�0_���T�h�a�2����4*Rq���H���'��>S�FX&�BG�G��!�<��ic!a���v���N'���6S�Q�bh-��\�����Q�@� Y}���������LM��$�`�y(�+2�a\��dW*$��N��G�6
�L�~�%���p���L������"!�0���l3��T��!��	�LE��~9�WT�J���d���P��9{���\�$����~6����b]����u��)�h�+�#�0�?�m���+�R��,�:<PA�i�8^��0
�����<��:TU|�3zL#��B���~q-��>���x���W���w1���a�CNI�q#u��v��$A!�3����a�����*z��'^��PA��
E��0� ��4�+�������y
��4@�ot#�J�@�y�1���h��4��6ro��vWv�sph`�Z�.1-�'=�������MZ��;�):��f���������94$���T��������w�-���j�@4�U����-�i�oy28��i	O/����x��.L����p>�5�5�g�>�o�{�p�C4�;bu
�5q~��Rg�t�^*�>�0����� ��=M�$"�e�����^���!e^U"z2_#�<��!<|T**'����`�@?*L�8������!��+�Wl��	M�8�>��T2���/���=���G�fg���V�	
�$�dl|�L:fIe!a�X�72 �d����o�{�wiP��r�����;�tQ8P8H�KE3���%3NoM�����A�?�8WZ���w���)	*�^��B��`����"��\��AEt4
���>�0�o���[k�F�mq]��f�
��-z,�sKc#se��������A*RM_XF�`�QT6p}�����
	z?&I�h,",q���R���5�=G��>���1�R2�E�&s��;<p��o��A�<
���/q�&*9i�$-&E��FE�HY#M"?L����X�#i�!����F~h"]�1��4
?�(@���g�0��J`�s�wh�N���l���t���[�>���C����t�F6������:>��� M"�����}��.Gc��9#�H�������}��W�.��QO��v��OCw4�B������ ��G�1����(w��������;��[��4��������N���4:[�/"�V~�V����y KZ�j����|k*�>�0�6�
~+���	���}���������P�B/|�F�V
1LD�Jn�SN9����bA�G�M/j*����\��b&�T$����Z4���d��{+'���f���x�]��8��	c[4X�{��p3���G�#$�dn��pC��s�=�����~��R�o*h^}��`���8s��z1B<|No;����H
n��p�p�,���V
~�>���w:�+F�R9M��	�u�qd$GI��E���xg�Ay�0��iE<���'#��)��i��R
S���s��������-�`a�*�Y�=j�<(($�$��qe����0�R�
Gz����M<�pG#
�P��N
I�P��6�
�L��wa�T�Tp������8�p��z��Y28f*YH�h8�1L*.�}���1c���Des��u58�d
���uH:
"�8��$."=c�S��������_���C������#PYL���<�[zv���� �$�=x�`;��#]:�v����N�e���lF�5#�7�x�`��YC<z��`I!F2��G�3�a�u�E]ie"����L���p1����6J��C8$������6uR�1�<��C.lU5���%�;#�����.��F�)i��7�->'_�9�1�|�cz���O���O$FM�E��<������hh	7��r��
3l�v~�xO�2J8N�DCQ�QE"�ZFz�))(�!d��:K���I)D��J�A!�
y�����H��+�I�+��p/V_���3J�L*����5���2��D"sH��
=F}���%cAoi������}$���c�
�D�0"s�>�M��0����;���r��Ps���(��tQ8P8Ha��@��/���S�h'��a�2�\'�
`�Ox�U�Q0�R���h���6_�OA���.r�R��`ZSzJ����I���TQ�e�*[h0�0�����xyS8P8HEI���y�s�\#��_�/
r4���/i���ic<*5�d{�g5Q��YI\�x�D��+�p����k��h?ylFl�JC�"a3V�w��W���5���O5?��g�P���J;��A�����F����T����J��%��(�b�T�~1Z���^��%�7
J�l��K#}�i#����������J���2^\�5�B���_ve5�	�2
�k<��i��������I���o�!�3��2�gBeq�~�\�������|4�3���*�i��<E	�i������Rf��|���p@�-�P��\^���8�4�Fc�5����H~�_|���\�?N���`��>��b��������,/k��
b�u������d�e>��=�|8��e8::��+�w%n!q��H|m��f����]�:��A���r�"a ���a�5�49�R/���xH@H\��JH�L	���Z`J�X��E�aF@P���1$^4Nt�����v(����Q�oSP��S�p�<3*��0E?+��:z��z�{�'�7���sa~7����Q8P8HvF,P�$S��	���!a(���EF�
T*�����Z
W���L&���
���Q��.���hz�z,9��y��t���d�Tq��G�AtX�������o�����@�@� %I_���N�����@\�Q�[�J "��&�h
�5�T$��\c���Q\����D�D������^�%:W�OE,
;\c�
aQ
_������f����2�
N��JQ����Y�F��x��'���;*�I��������d�NRL�F>�m��M'�i�)�=A�!� �d��;����V2*���}�u8�g��\|�5!�Fg��Yg��:��/qU�H��$L���
.4��a�FF�J��G��G�(��;�m���|$��T%4�l���.���'����(#���u�E�&��/�0��G\�~\7�+�����/*��7���A������q,���)��)�5Y�|,�
�Yy�����O6��H|����N�#�F/~x�G��&��t���2��C�VD�*"h�����)Z��/*�I0�`�C/V*S���2�
�d*6�7���'B2vdp���V�2�.��M���!�d"�=2d�xn�=�|e$
KN�E��#��������t(-*��H��BA�c��/���KK�@� YTd�p�
����q�;S��]�����0z�Q����tN%�����������kI���K�5��n����3���p���0E�W*�9~
��&��|oX�����QT��V)O

�JG���j�
���5�F�����j�E�
S��
������t�\[��Eq��Ix>�dzT���0(���/�1��ld�(li�&�=-RH�x6iS<4���x��LYL;SHR�+���n�
���>�	4^�|K��I�o�RF�P9����t1Qy��L��}�~"�A{�9���c�&�"����1��r"bD)��xH�h����������y7���$���������C�/
G\+�7
J>���B�/LE�0hl`W�]����0��&<���J�-�d�}�q�"��/�Q��V�^\^�M�#*���+���������Oxa����G��}���+N �O�$����tX�a���w��L���h�&<H�h��������O&�p_oP6�o�~H?�(E<���P�c�D�2"R� ���W_}5����F|����)S"3f�X���?�D

��7$��3&R�f�HAd,Y��I�"�x� )������T� ���$*���{�K�.�?�0��������U��)����� ���[w�ea����k�����c�=,M� �d`#W_}u�dmw�qG�e�����~���HA�%��o_w�#F��d�x��:��{��O?���q��:u�D����{��������Eq���s�h��=z]�q���}����_�e%�p�p���q�����,]�� �y�������0��'��Dx+�xFN;�4�M�
�9|����^6q�D���j���Y���k+(E

/�G+(LF4h��%�M�)�����5-(�]�d����e�]"�c��+(@��6j��`I�o]p���Lx�����V������T�$}��G�,]�4RPu�o���E�2�5��p}���N������[������X�^:t���7�}��u�����"�{�v�/���^R������A�$�BXk��I�Q�F.������.���_k������?�i��E����r���f��U.�`��`I!���o���_���k��Yg�u"��y�D�C^����q��o�����_|i��Y���_��H<�C=s�����o_��K���cXG�s�"^�����k���6�jb��X��<�|'��9a��f��=�n2��������!�3f�p��+V��GK�,q���*�����~1-#3���{�c�)����>l��\�s��%=����]��u��������^��r��tI)($���}��x�Q����x��|4�)�;!��J3]���	O���	�$�F���#M��Dq����p�Bw-��q������_SzH�Q��)0!��i����q��aE	?��{�kM/)z`2M	��sd�����A*J���p��q*S@0Z����E<�_��i�e:6F_q�c!�����j�s�^}�U7u=S��0}��+��V��i1�x�	�;���z+K��5$n`JG��BoV�U�W8����}���YWDD$�)�T���i^���5����JY��g���w1=$����3z��0��$�Q���w��7�h��T�}:1�y"�-��{�`���UPP���q��+�p��X�u%���]�vk�8�e��A��)���k������p������+=`��i�F�b�-Z�m����_�(����=�v��Q���YM�i��k����z��:�����Ov�������_)(��u����}n�.������]�X�ea��=����w�;�x������ ,����u�H��������Vl+zT�}
9W\��;l��R�qt����u�YI����r�	�����<�������m�m����o��4�z7�|����m���������;��v�~��e���&�J�����\�E�@� Y%M_�������\V8_�����q�

�n[�r�Z�2V��GDr=��|��D�N<l+:����6����V�x����?���Q��{lQx�Y*�������G�u��������e\_��X���I���{��"""���/��<��L�K�t���.���W��u{����</�`y��`�B�G���m�V�yJ��<��@�q���)��t���_�h{f@��e��G�_�B�I"T�Q	�+�|eE������T�+6bU���n�������/^�"0l���a���3'��O��JA��y������0�qxT��y��n�C�I�l���Z�OF�O]FE�u,�"�m�;6X�<���d��{*�����F#����*����
��t]��9�p�)���E�8�{��g����Ji:�	&��t�vZ�ny�������V
��z��3|���������������/�Q1M&��id��r~��OTq�)

�(i����{J}#v��W\;�X�4��(�
��o��A���w)�����Vt8�S�E7n�x��T��O�
��[y6��0����K�l��E�{"""���3���P�-
�Tt��3
���y���>n
g���^�_����%y4����nnzb${�����v�m���?��s"_�+(�e���������h��h�������z8�������w�aW^y�{(,��g��En����'���cm�
6>���?D�<Pn��L�C�(77�M���)����_�=������kL7("""""��g�0������n��6���G�9������""""""U�_�yZ4�0'��%K��)����Ow��o���q��$RV�\��m������w.\,)�g<��:):L��5��q}�)""R�������c����k���k�9��C���W�j�\�4@��q�`""""""UG�Z��o�����K�.v��7��~hyyy���O?�~��g����[W�����o�s��6a��`I�����q�����������]�����,�TW]v�ev��W����n�?1��'�|�:���T%io��Q���x��v��g��j���2LJb��<��V�N�`""""""U��O?��5m��}�Q{��gm���v�����?�h�������?X[��>o��V�������v�e�m����[nq#�$y4�� �����s�U�^=���m���v��'�u�]g�f�
����T
�����V���	[�|�}���nt���o:t��u���"��
��/��F��f�H����U��k/��YQ|��wv��c�=����,$R<�J�|O�}���~����/��x�g��rf��
2����P����G�
Sl���n�}�(h�n��N=��`I����a�l��)�I����t�p���{���9�3�2�
'���@D��?�����*Ky�Enn���������{��F�px��O>i����m��f��B>\�X9g��b������_��;��'���a�+l�43�>#�����}a}~g���^���v�O�<����$���?v��c�=v�F�T�}���b����������k����p�(��3gKEDD*?um�J�L�v���v�i�`iv�}�����*�����
A�?~����k�RI��(�d��)OT`N�>�n��k���m����r��>p�"��_mc���=z�1U�3f��+�����i����N�)�~�����=4�<����U����|�=����5
�|:������j�:ur��j��.���5*���_u�U��&���X���_v#>x�p�A��`���.Q�G#�s�=����k,M��'f������|a��(7���
sLsI��1c�KDDD*?5�H����o��������Z�'Q6���s��z�-�������)�l��Fv�)��.3���Oe�N2G������'��=�����t�R7n�x��v�]w���E�b����v#�����sQxV�SO=eGq����
{���?�=,?�{��]��
|F�����>��a����������.��:� �.��Kc��(�h���?�=��|�=�t�>�T��`�s����`�$���al�]w��
KS;���{���h���{����7o��I�!ym��uy�a���m\�l��#�c�U�g�}��I����~{����p�'�W�	X�(P/�������I�)>��D��}��g��M�k����<����g��|�RQ-[��=������^������^��>��M�FE<���~���g
�XS��(����;���8���\��w�:y����������/���u���>����4�q�-���#��_	�=��E��������
����?\C
���=���Fj�t�M�A�x�pA8�c$�UbT4��k������)���EDD*35�H��p~z{z��kL�����+�I�&��v��5�w��n��x�PR�������15�o�����y���W��~�/���vC��eF�7�ch�o�a�;wv=:����8����?��S�TJ#Q8���;��f,�y-\z�u��^d�9�f������k�4;v����q���*c|�p�~����`|�z��������H4*����,��/����'n`J**8���8)o�a�N��FS��S'XZ8��%ia�sz)�����nDF4�e��x���\�����6m��&�e[l�E���v���YA�[��a��H[�9����iP
7�V�Z���v,����h����|f/�s�l������g��q'a�N2�#����Y3��S�JDD�
5�H�@O
���A�����;��l
��v3�_�*w���~;���l�u�q=��/��������HL��������/�u������+��i7�`�Y���;����r����e�~��['�6�l�
����^�DJ#^8!��c�w>��s��i����"�� ��x@2��g{�.S<���E����\�����.����|�M���=*v�����_��R�1>P8I�t�T*�.��s����m�0b�
�H,TnRM�2�a4��������HED�Fcy#*�=�9L�E{xy2�&y����^y��_#_�����al���h�~p��=�S��N6�{����W�����"k#M��q�`Ia����O6���G��d1���?��""RU��G��>zf3u@t���:�W�����W�B�=C�N�is��!�#F�p��O<�D�C�J?z1�F��#G�m�.=���w��X�Ml���b���������7sS��+��d�*g�A�������z�������s�L!�T+�K�������a�0�6����F(�����y���Ne�N�'�=}��w�yg�@jr<W���w�y���"�**�y���TT4��g����[�t��n&
�F9���_w#r:v�������_���QR���/������������dm��A��>�0�������������������#Y���T�2\�
x��s[m����
��5��x0d4��3�3�����A��%��v�������x������=���D%��l�/#����: =���
5�:ur����3�<s��i|�F7F`l����RsleNi��g9a��x�h�`��C7����^,)���S`H�T��@�$}����n�
�;�h��=J��a����@DD*�Wc�+���
7��!��=f���n�����;X��xh�a�B:S������5����X���Eg�{������p<t�!�GC�$F��sF�K��'feE~�����@�y��v�����:��"/~����He���z������d*=*S�,��#�'s��$�2�9��+�<2��
<0�O@��Ln�6m\F6�Lk����:�-�(%/�pm�|����9*o��
0��sma
��N��f���j*��(��O:���D����(>�D�G���|%f��D��F�R9O��#�:���s[���gyyy.���/�����6m�4�P���{�<a�t�Nt� }7$$�r��xF#����}��O�9�a����+I�����������r��
3L������42=/�wH*�#�'����2����HU���(��J��?��:��C���nr��f��� ��m.��C�3R*��(�T
��"U��k=��<y������D����;wv�1\���e�4#t�����z�r���`�X�'*���m��ow�W�������71*�S�~��p����}`_z��m�\rI�2�<t��u�]]YL�b�-\�q�������O&�0
�gyMX��s7�Ts�E��0G� �_2%nt�*��J
=���6���������G�0�>���7=��h�
����{@7=�)L����iDO��,2��g89�0�-�"���b�������x��kC���\�0�^�{��;,�/��z��3�&����A���N;�U�x,�2����Ne�N�'�����1cF�d5*�x�:�D$�"z�S~���>�_�>���[�tB�,Q����/��2XR�����i�!_|�e��o��0`@Q���o����Fe0�����s���F�e�3����|]�j:K������,F���/�&Mr��&.�9<4T�?���8��`�$B���Xc��u�����O&��F������n�����?1�!�J�E�'"""��z$�QYG%-=�������:���������th&�Q�K���<W��C��
*�R�����db����7_p�F�5z�Q����$��N�W���r��A��h���kX�~�����9������t��H�5��_k�N�q�]vY��>��4r�t*s|�p�>���>���a����a����:1������d�����Ry��+R�H��w_�/wX
1t������+�,*���*�{�1�4d�����x�I'��:E0j����r�����4&�]x��n]�~Q�O���l�	:��#�
o���o������f�K%��\'��&L��~��3`{;v\#��7a'�����<7s��w����T�J���o�4m�4��O?K
d�"j�"'�|r����w����#��,Y�$2c��H�V�"��r��NA&5��e�HA!:r���F�����#��7�d.�w�
�������Kd���n��>��/�������]���/�j�r�X���l�mI��'��M��k�.R�F�H��}���Z>"��U+
7n\�q����
Fn����O<)(L��:`��NA�&��wo����=���w�q��?���������Ne�N�+��+����q�����^��wG���Q| �=����%"�9rdd�
6�|��W�����{��l��.M]�|�K��.]y���#����{��'X�����#��5������Iy��>8��O����+��T�}:����.?F9MDD�*QC�T
c�����Y�U�E�?����r��6����\�������#����[�W���#O>�d��O?up�_�[/��]�/\p���c�[o�u��7������1���c�������%R��	���s�����t��)��{��J�p���	"x`��bF�����(,�<���-Z�u��g�yfd��9��(�������(LJ�T��@�$��p�S)�M�	S| ���#���#�<��i+V��V�~��k�"�v��wF9���\�l��v�L�>=X3Y�lY���N��t�I�QBRC��FmT�����O�U�V��x����Y"""�]�3�,�t�R;�����;����l��LI���<x�����,�Q�F���T������{�u��9�3��'�t�b���s�H�U��@�$��H4���O����$�)gO8�{�����L�H�.����R��������z�]s�5n�0�g��l�A����Jj�Vb�5������]�*�s�NL!w�q��#�<����J������9�?�����_���]w�������?��=�g���
����om��q��wo5��I�pr�����U���QX�K�,q�-Sx��l��,�Q����S| ""Rz���|�M�l�hH�y���l���v�w�����_>��35������>��CE�g�=����&�=QDD�����4��}�1��;>���.�Y�P�g�}��K.��Z�h�*uy)��A�n��[w���v�Yg��F��W�p2l�0���y�w�y���#F�p���v�j����{x{�Q��Cl������U�����Q| "a�#"""""�J
=R�L�0�U�1�~��w�V�c���?��
_��W�^v�M7�
_��O>��}����C�M�6�RI��pB4H����_�>����k�^z��������T�N�>�U,�1/�*C|�p�y�D�SC������d+5������H����VzF������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�RC������������H�����$�[DDDDDDDDDDDD�HN�@�������H�4`����O�NDDDDD${h�6�,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,���,�)�]e,[��`��O��f����8���V��
����������C^^�������U+�z�������g��	&X��5��3���7�8�D���ol��A��p8�����g=��-X��6�pC������];�T$�9s��{��g��w�F�K�>�8t�K�z�����?t�����;����3)���UI8<�*:^�Ha3??���o��/�.]�K�������'�te<�v��zj��$R����@i��D��V���E��d�D� �1�iDO%��o���w��"onI�U�V���#��{���'Z�+!""R�����v�}��k��fK�,	���H:)��x�|CO�j�l�M7����.�W�-�oW,�&Mr-�""�+V��_~���+""R�����1�>�^�o�������8���/����w""�	�kED*�*��S�zu�����t�II���~���������v��w�5�\�!�R�~KX����DDDD$YL�������5j��m.�����F����"""Ri�6�,���,���O�^�l�
0��O�n5k��3�8�6�x��������aC;����������z�,X��B8��cm��a��w����+����������n?�h�"������o���s�Z~~�{��n���n�����>��M�0!x������'��7�|���}az�Q��{�����x8�?��~���5���:�����n;��s�qG��k��~�m�]��q��Htm���?�[��}���6n�8���3�s���rS`���6b����m����4i��]�g�9	��aZ���w��)S���������}{�s�=����p�
�����$a�8���{�����A;��3�<����?�}�Q�����i��v��g[�F��O��O?��~������:u��l`����{�V�0���t����o����7�^�V-�l����tS7�k���Z�>}��s���a�F�rss�P�^=���K8�z��6g��@��s�����u�m��n���cL�0��_��_~����������",�:�t�u�p��/�8�m���������DX����was����s^8�m��Mx�S���g_}��}���E���{ |�?��!���}��G.\�Z��(.�w�}m�-�p���O�#>%�&���K��R��q�|�}�q�{��m������d�q��W�{�}'�=z�����n���I��!���t����� z;��FE����kB<Q�����%�L�-.�n���[�����k;v���5���������%�=����|P����V[m3�V��k������O���Oc�D�EKtm|��_������}�X��9n����N:t���;'�#��6�S\����d��|������=�P�w<����Kk�1�7�<�o?~|Q���"O��������_�-��)�������3iiZ�.]\�F�%^	#�B�6\G��4o����%���4�&]��c�����������vq�{��_�����7��l\>7>�u&�=q�����)y����������~���C��/�{�c�>3f�a�kNyj�M6qqu��-��X2�'+��t\�X���k�z�Dy�d~���y���@�w�A��|"��v���T%�}�]w-
X("kn\*���!sS����M�~P�N��H����������4|���D�KI��}"1z���\d�o�}�3*�~�����?�]�v.B	����l���k}��vf��F�k��1���"��v��7e�k�>c?h���'��o"�t3f�p��T���7�����O?���pf(����/�l�g�v��6�'���_"�T�1�@�A#��a�8$"\�i���x���s�x���H��;���{y|���k����'~�u%q!���>�pm�$T��r�.\�2�|��
��"��0����]������*���%����!�����]E�C`8l�U�V1������w��}����{��%����$�����4�����z���p�����k��$�����c"��y�c��?�$�T�/����1|�����s���
�����O�>���=Ef�p��
����?
L�a���{����?������mp�i�$��n@�w2�P<����}&�>��c����AC�?�x�xi�qE���}�//�bx��O���S�Z�^)MZ����� z;�>�(�?[qM�'��px��wLE2���x�����m�3�l8���<�|'��
�~,���x|�C�Ft>���t�}!�%��V������|�4&��&�,Z�k��-�6�5�3����K(��.s����w����7�&~��S��;iC"���%
c���8&�������p�s����A�F���������L����z�
��0�g46�M�����y!L$
#`}���D���O_�W�9���t^����tIW�����GIa/�_���~sN�6�����+���>74X��!C���+�s�S��j��8'���q��p9����L:��������=�$9�a�K���8w���L�����8"�1|������� :/�(�S�oT��_��S��EC��u*�XN�-�$���/���C�������ke�sn(&7/7�8�$��|Z"���������m�e�,��������B7�����n�(���+��H�c%����h�q#����>�%P^��(��~p~I�8w~]��O��~$�l�
Nz�q~9�q�$4T,�[����G�`���w����k��7b*�Ddi�X28�������c�?�H����?z������q�X�pKa�^
\k2]Tr�a�0])���7
u�#���e����'J�*l��.�V������sF�.������.���>c�+�7���G��$p�����> ��/��9f�������E��OO�W��?���u�o�f��-��=���_��1���3��c���s�,2�t�����q��d����
a��#��O���!���E��5e��}�qN�����7��=�2~a|��S��m�x���O9&�1�e8S��K��S��q�8/�Zq<����HL�'���q�+�=Ne$�c�_�'�������<�6�K���{�4iu��(��N��*���V\5�d����x����g�q��/Gp�V�}��N?�cH�����o�;�{��G7�'R\�C��
_t�&����#�g�]�o��_S���������g��N	�A���S���|��pnH�����~��*i�P�Dq,�/iK�C��B�Z�o��>3h���	�'��s��O�������
����E�����{�0�o���pO�_�e�w\�Dat`�������<J���"<E�H��O��I�5�>KG=J2��/�����w���\{�*�o���������d����!�������EY�x���sC|�������s�p����-~�}���1�r���_q�Ptu4~[�xf�q>�q���A�`���i9o��#���<~'�q}���l�#�q��������r���z
"Ok�z<T`�s�9.r�%�r3�aqDb���~�y��.��9����o�� �����qY���G�$Vr"o�d�P����.r������M����o�9q|$�����@d��[o�}�w�>�h;��#��O�����Ed����$4����l�������������c%���4����\^DD�L���
������p@a����Ns�����1�7�(�E�N����"QY�0�2~$>����D���`�$�dB|d�����5�~!�p��O������8�\
���?`�'�x���8&\��M'���L?��f;������X����p8�w���}��)|_q�	$Fa��W^q��}��c��>��=����nI��D��C��qq^z���~���Ga�sB&�k�=�}�QN�#q����'9O\o~�m�$&\8�]�#z9��-2����L�O�9���7�!�s�!��L;������	�K�����]a�O	��x�m������"�>8�~_�a��I��"���t|�{q~9/\_��=�t���t��
�p
t\�>�\w�
��_G2��c�e[+�I���GA�v�}V�����p�U%��D|�}VR��[���i@�@*�N9��O�x�
�����>��^d=�c��4D�<�F�������|��v+J�I�(+P OW����#�g�]�o��������ri�M|Me#M9^���S��������mq}����I��(�-MK�K^�s�q&�F}3
�u��o?��{C�u������x���qF9N�t>�C�a�k���~�k��N�����y ����\7���c*�Y�����m:���M��+���z�d�)�����r/s�s�����c�|���-��6|n��N8��1��8��/��ex�H8>��G����~�O�]��s�	�������3w��F'FZ������w�Z�����O�}��9c{�t\��l�#�q���qp��a%����%�y�Dy�D�QQ�yH��#��9�_~y��x�������a^0�&7t4no��c/7n�1�"�h&����>�8��qCp���?�V��;<�+��DJDH����6yy"�`������2�*�3=�c�o"9?g*M,���D������\"�t�t��R�	��M,D�$>`�p�C:���P9L�y4>�:P��D�dcoq������yl�5�a����s�q?��KO�H�I�8��
�h���
����`�������p~@�Fa<����	a����_N�����l&:��/Gu�Kt�k���qO���G��\�+����e���<��C�����I|������o��������78���)�Wt�	K������8�/�=U�L�����y��p2���/
�]�vu�m2���KD��8"�kW^iuiT��/��NA��@��k���h�sI$���5�}L�@EN�u��	�T�g"SIH�H����N�)QqG%�X����+�*-�����+��OS��q�;� �J�T����
�Ua�J$���������}c]���<+�~�@���\/:�xT��C���^��.��2>��>�+��?�\�_�����?�&]����_eU�BX����(���#�����<pIq,Tl��D��G�q�i\
�w}|��%>���qN9�XJZ~�t�g��>����h���]\���!�s��4���'����GD+����*��/+U�����YN���g����(�(��/��b����\kd������f�p�oQY�f	
 TpS�rc��"ZC�!"��
+��(�����O �86��sA�O�sB���<%�����Sxl��@$�Ne�8?�P=�`�qLd�p9��sA���}
��g8W��f4�*=�REO_�Nk������*j�}�D�
�x�N�?��>���kBeq�c�������������G�'
��1����F��E��3��qO,�]\S��.M��}������P��
���R�.D�X|���S\:���x�s~��R��s\��8�����/�~r�o��F�������i=�����WZ]���DKo�����h��X�W�^����{�+����T��
�X
� �������/��W�UZ�gc�[8��<��+w�H�|���-��4m(��c���p��Fc"�p������=B�"��s�?��p���W�(;��)\�x#@:D>���5#�OI�&�M��4�P��(4.���p�+�c�x��@|��z�{�������.{���>y=��(��8��4VJZ~�t�g�'N��]F�;D#L�O��E\��l�#���:���x��J��V@D��Y�bxZ��l4"�D����}�������������N�XY�`A$*�/	���^j����\/2�Tp���dN"1a�8��Ty�W�Id�+M�M�.�X/^�9M�������*�0F��1�����B��pBFBD��k��������2������~�~�a�qJF��yq|f�sF<���
������>!1���E8����Q��y����\��0n������_�-K����s�����1&�A�K�d�}�t2;�@���&�����k�
�_����$��|��|��=���Xa���/|f�O��t(���LE&�qy���o��L�}��'��{�qq>�_^���GD+���4*����A���b���D�x;��@c�-���:LeRi**R������z��1%��t���X��Wi�n����2����nx�DJ�6�CY�1I���~j�0~��c:X�Q)LY�p��0�m�/��y��g��O��|r^SE���V��+��_�Y���u�,�����I�������G!~�e�d:Dr����~��^�3����@����C���)�
w����%^�����0�����	'={�t����-68��O'N��gv&���*J~",��h��V�VE��e��7��X0��I'�T��!���&U$l�"]*x(8��5�3����s�#PPg.�L����W����p���-��3)���dNY�1|nF����aT�2r�}`d@��%���<��C�u��+�p�����M+B����&R��m2+�<�;�a�����P!�)��d$���XQ1L�����k��
s=��!����L|��)����i������l��a�i���,��S�
s�����	��2�%���U�{�*����s����9��U�H1�!�r��v�]w����_����2��,*����A�U�2P���w�4�E��R�EOT�X@Z���	���v�����K_YA�/^G�xUle����+���v"�Dg;g��H#,������Fc�y����~TX�����4HgP��
��^{m��Q�k���E��h���J��)oeY�N������|e)���+r	?���XG�3��_����	���&
�t�g�
����+]����x��7��O?m���+����+J~"�2��,*��OU�o�)+Tz�
�Xhp�9<|9z�g_P��[��z�
0 n�U��-���b�'.�e������1�	?�=�AO�XC�����{�E����6#����)��-t'���
�E2}t���f_�*#���{tWd���IF*��Si
%�RH,Nq�P�*�=�1)����z������}���1��s�=���y�������,�����\�����S��us*���t���J�i���'������b+�0F����\�&���<�zx�y�~�\'�����m�x��>��/���aTv�#X�������G����8���+�t�t�ga���������}�A/\&�8i�`mt~�+���,�eQYT���*5�T D�<��|Z�{���*s������g�y������W-�%y!�)�0�u�������3N��{�3L<V%.=tx��!"���yxy�e�]�z�3���SOM�weI�q8���]�k������@f�����pz�~����o_Wi��a��������uTR��d��%������Wi����1�Y����!��V��qT�s��{�����4p\p�;���p�k@��^y��MY��Me��R�V�<���K\^��f
���H������(U|e����)v�g�C�
�����]�9�5�������'�����v��g�ip��w�����]Y!_+_�E�����UQ�Mi�e=Ji����I�~�K��w�1�vf�O�=�9�����8��aQQOy��H3�e"�v����'����ZK��\�T�����F������!�����>@27)So�(/�d~E��W"$�S�������"������0F���P�D�t0��0Y��������s�<���+�t��d�H��#�L!��Cz@�fN�t ����b���PGe8x4�%���""���<=L�P�pO�T�B8~!�I&n�q����]�6�d�MY��{�g��>��J�c
E<����Ov���>\
���%�)eG�����d������������t
���KQ���0�n��2�\x:�dT��������L�1�l��p�N�ga�=�(2kJ�O>��h
?�O��Qv�w?����L�����L�=Q�*��I�y����G	�/����_~4������}�;Q.gJ��D�x�M�<��|IC�g��*��L��6���K�7SU^��t(�8�<P��l���RCO@��SO������.���:�n�G
��#]�0�C�H�J�����>��;z��
��az�s3��N�+I%�G�*�w����Xx�Z�0�|bM8���0z���������x��
C-3�?����/����
�D8/~������w�2��aQ�����(c�/!�������,����e<�/�?�i���6���z�f
�L��xE:�����w��a���_KW��@#�Yg�U4
�K���ZY��T�y��t��j����_t�x��o��H3�p�A�<���!�Lw��O�����,�C��Q�}=r��2��X�U��n�UEY�1��lC�z���<�E�]G;���3�Y�0"8��/�2>�������vn����,�Q@���
���U���i�����������T$����s��[�3��x�_�E����H���#��s���������.����J
=��l�W����[Q�)ba{T����yB�a�p���gH%�|�p���<<��.c8k�wI"����*������~UT�a�
J?_-=UD��������$���B4��+��y�_�����:�B����5
���/-���+���BF0����B��_�1c���f_�Mf��Q�"n���!�������}+��p�SV6�`���F��D�1xH%#@�����oK3�2������{\2�L��N����|�*���#��<�(���K�C�����O���U?�w�x�$h����?���-�i��>�X�����q���)�����<��k�+��I#����R�S��E�	||��g&�����06z���i���k7�L8p`�<w�*��I���G��w�#O9q�D�w,�[>��fZ��F�,�8�������r�w��:$�|2M�xz�����4.~w��q1�<��L*�8"]���
���x�-��]V���
�F�	��0����#�zM���r����eb)�gF,$�L�5$�D���<��>����m��;n�N�:�
��:��OK�k��V��h��iJs���JDFZD����H\�{>QU�d"��.=����%�%l�Q���O��t��=I���=���8�L����}�����^��Q���
�z!P�F���
F��5��Mt��=�V4h��%�(����9m��qsn��X!����w��E���������8(|��9$����o�2��xL���t��w��������O{���{��C��Z����xE:����7�x���+�9�y�v�v� �����,��t)�<Je��R�P����>�~�R�F����g����J�N3j�����_=f��hV����4�,�/�`��N��}��3��W_��T�d"������z���f�L��~���"���J����N7��qS��y�o����y������|4�Mx��1��f���KY����f�����Xyr���/�R�M4�"Se"l��VE#�������)���X�8���GWf����V���OG
��Q>�Z�%�_�Uq}&�e�.�o}���3
������o�G�U�����h��b\�L "�F�Y�WC���"�f�?4�d�4bh&	��;�7$�NK=�!"���D��a�>��Z����|��]��{�4�R|�������2�����q�^�l����F�������	�d�F
��f���O��{#�_�r�;�0��y�u}�@!�!2����JK$AK0���p��W�=�� \�A�%��cI�/^���9�	�9I���%����R��3�������"�;k�V�QP���7���?�-�d�|�P&���.�\3$�6T�R�����`]�.��}����3�t�����@��������"C��>���Ys~/|_r��x�
W��q��
��������Tl���3${�$:~������G������9A�(���$��qN��M���F���O�p�_\c�a������������a;�+���JF�uS���U��y�S�3�S8>��=���_�c�AI�K�<��d�_q���s\��q���9�s�D���L�6���I<�s�1�`S����qD*�J�{�,�(�>K�����\��$��K��S�p���{�pK�J~���{���W�4�G�%���	
��g���w��O��d���,�p����f�o�����~Z�V������+^�~�����ieA�1�U��{��������.�$��'�oI�&��$��T��X}?a,U\S�*��7��5qM�7s��&\W�0�Sc_	\o�i4��i��F��h��
���;a��a=F_s~9�~�>�����LgP�1��.��O����{���Uj��T�s����GI�6���?��
c�~�}�B�{�u�q}��k5������~��1a�0�O�W������3�������h�����=^(q<��������>������HX�;/�?q}U�#�q�qr<>� �����3��XN�c�+����D��<���B#z*n�N8�NP����F���>B%��t�Ik5��c�'d��Z�C#�0�h$:��ww� �$���DlC�q7�y�"b���8��^{����s��>7��'��01����Cu7"��HT9O���:4@��Y^�#������%Lx�'\��oy��E�A�+�9R�����7��0���Dop��>�l�A�B&'z��~����{�n{���Kd}_RI@��\�����N+J����~E�9f}&������	�$�'IeAt��
�
s����$���;8W�Q*?;���2a�k�-�\�.��+�j���.�6���sgw������,�s�=�o�����p�W�s��{�����o�4����)2��S|�z{EV�qD:�w��]�z����N3��Tf�V����B�s����5����$m~����w}��d��y��El������
4�aeQ������K��`��/��l���8��;��0�**���~�W,�5��}~��>.'-�����z��sN��*����A�`>�G}u�}"��.��QG�V>:*��I�'��(����{�s����;�����/@��a�4\GKW\��q}��q��������~�Y��SNq�YY�=�>��l�w����k�u&�����e����3�,��ta����?��o8�!n�~MwKe���Pn�!�_z���r�d��2"9n"�^�z��3�#p����%2�����^� �g�}���.s��}�>���0�'����_q�1���Q����t���.���2�G�"SQv������])T�0�*2d�R��e�5�p]/��BW�N���5n���j���X�8&��g�0��~�9'�����/���W^���g
��/2���q��G�5����v��3����=�***P�g96��?6�_�!\p���/m�8���/wa������y$�#�/��:T���6z[��(��*��o���}�g>g�Ld���xE9�l7�8ar�}��K.�$���FSX��UdeG�Cy�Q*�������{������;�������-���V�����*�/����O���c���t��/���t���'����={���)}K��WFb�M7u#��!|�����_8���:��S]C�o��g4����o����*��0��������o_;���3�W�s�.����G��>���,����3�M�c�=�}�g���eI�xzQ�$��o������a�2=r
��T���*����L+�8"�7p
(���O��2
zt��gBe�����P�"""U
��q7G3��0�R
0�U���H�1x�`7�����s"DD�GH6Q7>�*�yL��{����)����~�<����g����8B��zDD� ,��W��8BDDD*;���tXL�����D${)��l���*f�������9m7�x�`��H!�"""R��L�a�������b�0�����#"R�0�x��I����Nr��G���HU@�������c�Y�A�""P!�(��@	���`}��	�������d���Rj��Rj��Rj��Rj��Rj��Rj��Rj��Rj��Rj��Rj��Rj��Rj��Rj��Rj��Rj��Rj��R9���"��j�*�{^~��d����M�ScE�j�T�����]�Tk�����9x'�����_%W�e��/������-�[�+���h��m��~�>}��$��S'���
��Ln�u�f�=�w"C$o�Ef��+���z�����;���U+l����w%S�Zu;x���w""�O
=������{G,��N��k�6���<��s��=���]���u��=�������o�[����w%������8"x'���{����t���=iMk5
���d75�$����mn��w�S�����'�D�Y�R[�a��M�Tk����{8x'"�r��+���~���~�n�u�$x'"��4�B�6v������jJ�FI����������lt�W�hk>|�u���Z�li�[������.\����+�������������[���>j��-�X����K.��6�h#��>��c�}����x,X`�{�=�p��"��JK#"���H���]��=w��val�=����'XRr����t�I��yq���o������b���n���~�l����jU���d��^�W�}��O�_�K%Ld���M�>���Q�FKJ.��'����<�����~���������*M8�����/�>���������[����_R�RI_2���k>|���_������_R�R	��T���q%{��]�A���8�;����m���ii�3��_�����2DI�Y>{��G�������KK���"��<���}\��y�����%K�5�.5�������k��{o�DR5b�;����I�&����)��b�<������e�="������Z�y����]�v����������E���������+v�y���w�m��W���;��^,$(�{��O?M_A/�r�2q�<��>�s�9���,-9*���/���e@n��&���C�o��&X�P&��^��s��\��e@8��5�s�=������2.���V�����������8q��x��6y��`I��r�d��F�i����M�6�.��2��V[m�����_33��LW*a����:�h��>�.
��Hy�4i�����Y�fK�G��K��7�R��k4	��~t����[���J����$�S���rx���8�d�Y�^={�t����m^z��6a�;��m���u����{6�p��{��?���<�Cy�E���(���X��5�\��I�
�4�q��n��z']$)���,��-���z���`��m�������G�?��`I�X2������O�k�y=���� ����s������??X�����
7�02p��`I$���?G��k���#yy��'???R��uG���������l��m�c����{�)(�K#��K�F
�b�-"-Z�p��z(����/�Y�^������l95���L];������N;��zp�q���u��WG��m�����������m��"������M���O�
�UV}���.��L�k��c���&�s��k���d��{���j��(��92��d��2q\��	'��������;�~}�����d���
����g���6����H��#����E���"�����/�e�+/����5��>�V�����U�C*�f&��w����3?]���u��f?�������d�L��Q�e�LW*�,�H��m�=o����v���C��w&�6wJ��II_y�V[�n�z��3u��
~��,�gK[�(��(������C��q}������[��M��n���n��j��)7����������
W����K�v�m]O���������a�����Q�-����C9��5kf~�%Z�B�N���}~����M����'�tCC2v��'[����O��T�]&����z|���v�}����.����C���{��g��o��;�0�k���q�����w
#-���;�P�3��UE��.S������zjr�c�6�tS�����%��r�d�����k3g��]w��m���2T�V�Zq{���q%�?����o�5�Y���]v��

�VP���H��M_2�@�p��L��S�P���oP��\K&�+�{��_u���=��1e�{��F���??X*��L�!R�g��;�����o�������[o|�X�z����JZQqQ*����E�m�S�NV�NUej������TF�0L���e��."#����e|v�����+�H��SN��6�����y�T"�a��-��Q����w@������
-dI��E���}�i������9~{���w�q,������~��s���7�d���\p]���[o=w��Ygk���������L\7����M*;���5k�ta���'�p����&�s��k�m����SO��/�������{�����;���adD��)S����8.2+d�m��9�_UG*�.���_����l��1�PQZ��?�8�
6��e���������l�*��Jh���������c���M>#��W��|���;�7 O}�
7�8�����>�x��+�X���{��djK���4D���B�<;��g~=��\��Cl�r�y�p�L����|�}�l����-��������\�R+���Sm�w��.���~i��T&�J6}�T���W�a����a�\x"<p]���y��\���|���.�����3xq�����o�Va^��g6�	�4Tp�.���L������=����oD�����} �qLL�K^�����&���|E(cf��R�g��2�0���W%x���%m#����������y�f���=[�Z5������������W�U�qQ��!���h������G��t\�l���:$��Hf�B���7�%&��)0�#�_}�U���{\�������������3f�����?w��� a�Q��.��B�2����j��%�D"$p�C""�'����i������k�������Eo
u�.g~�����bNs��y����Bd�sss�5&�0A�M��J�0�.l��5k��^��m�5V#�f}�
�����K��e������s���O>K���l��7���+�3}\����{���w�CU��������w�Q�
�%��������F����^s���v�-X��LWi�~�y�����l�1HD�Eh������3"�G��9���2�������J7�J-��7�|������0D����4�xt8!�N���<�t*���'�|�*.��bW�<p��w�}i<e:�Qq�h�zP>�q����O?�U~D#����Et\���
z>'+��%S��_�!���F�9�Tl=��.�B�
i$S��&��|w�m�)
�<4��|�UWu� �����:�K���@�a���w�������u�|�a��y��g���ns���F�=z�pi?��0*w���k�y��}&�����D���q�r����q� FZSy[�T�{���C�
�O���G��3��V�l��0��,��z:T�y:T��(���CT��"��	�4>Q\���G�1z(8�=������$��(�����^Z}}Oj6�w��@c��b�4���8T �	/��{����7n��RIHo�!�$�"�$�����7�������I!����wy��&3@��H�� r���n����w
 �u��
		����K��FF���F�K��e��e��$�q\�F)������&c��C��T�]&�]�����=�>.�z������!��
j���q�r�P8��c]�i*K��"R�P1A�yg��T��q�x���sS�EG/���.����@���>�����?�o����}{�����-�c"�?z�hW�E/l�p�T,PA:���u������	x`0
T��a���a�t��q��=r�E��,����TR�6��/�H$6M�&����5�2�0O��O�>v������T����l����Cf��y�k���HzX������k�a�������I�!a��	\K��!�S
������w�\�gv,4�������k�;F+�?C*R
��R���q���%������	#UQE�g�_�W)�V�}�u��A�2�z�p�)�{��C��%?.>KG=DE9.F��9��`F�g���*[���d��]�%$^$p4�����G4���z5P0j���{���$<o.=%x��O������%�xh$�G^����/�%���salOsR�$�L.����&�L��/c���
��1H��BQt�G*:
�+��)
b\�l����E�H�42d�����������l=.2�4�����Yz��8����T~T ���`:������!JOQ�P����Sv2�{x�'�.Q> OOe��>������,��y�W)���4���r��0��cd2�-T����F(_��L�'����t%���p���P�E��
7�0XZ��:����3]4@2b9�X'���J0zY�w�}nty�*�i�R5���m��i��1�XJ~��;H��~�m7]z����6T�����O��/���"aj1��V����������,X�<4
<�����0���{6��Z��qy'����f�<�p�25�HV
'PT�E���Z�AD�z10%�����#� �B����^�;wv=��E�	0�&��w	��+�}���k�jU��)�_q����$c���z�q��E+�Hb���L\�h�V"s�_�����1�/c��p\��eu\�����]d�o��&���T��t_�h�����i�"���[��T��t=�(�������%������(����C/F����~���],"UqD,�qL���k�����TPiM���1%����B�|��X��Gc�LG�
0��S��s�8�Js�QBu��
���4)L�L9�W�M*���-]�M73��Ue�w_���42�zT�6h����t�pF�Jh*��'P�|��g����C�S��M� 0���0�:���	A�,#��LNW��L�SR��q�}��r��������q��g�����h��R�x����7����q�r/R�D����g������^Q���d����g�UQ�qQq�=.�w\4�R6���2!�x�wu����M�J�D��/S#� n�E��pDD����~��Kl�
MOz[0\��l��2�%Ct�/~�����p�$	Le@�D"l"�0
��G���7%
�,hD���!a=
�|�&��W�Zl���L\�T��e�d�/�a�qa�_�:���h�:.2�(��b�=�L1�����HW8��r�2q�RA��L�S\?��O~�, R�2y\d���������za����>���?�H�i���H�ED�AZ|��g���<?�)��(#�#�����f��
��!
g�#�%�iI��������������G���X��P�F	���FP0B)����I6}�T�&��5cjA�eW���!�TzE�
FPVed��&35���%|�������������`�|��L��S�RA���{Q��<C|����##2u\���_}��|����g�����$9\�L���zSE]T�=�6������D"S�l*�%.J��"�E��^�q�#��D�TU��G���M/*��b��
G�����B�g"��^z��?p�@��;�W�#�b�7z���z12�^�zg������BdD8�$.T����q����0���G�sN��N�uO��4|�yNEe�������2�28��e��I�(d���>KT&�q"�UUxS9w��v�������� t�u��L<��^�d�K#��J`J"z���&���w���$"����io���3�L _����C��h�/<��9����;7�	��
���7�����2���4?J��C��P?~��_���b{�FK6}�T�&���g��g�R��`y����9�����e:~�@C/|?��?a��`�5e:l�hHe�iL�����dz��e"?��}�)�8�T�YFB2=���i0u��LY��\c���Qx��Y^L{Z��g3Q����l���o��������){Y7����j��2QC�TD��!RbX"=�A+2S�!0�������/�� ��g\��{��/����ae� �%�c�,s�2JH
�����F���{��[�nE��^!TX����:8��d�={vQ��D���|��������$&��T�]&�]����9&����w���������q��*�*��uE��*K��e��eB*�O&���G����d������4�d���
�F�&�����w�*D$���2���W�����3f��T&������p�q���YM�> ��,@�S�QN�quezn�m���T�x�
1��f��D��'��%S�����0�Z\��dJ(���5�����T.��k��#a���p���(��
�`�V*�M�j�]&��������J���3
�
\����,e�,�Y�O����;|���c�=�u������q�f�QY��T���d������'L���4DS�J}l��XUM�
4��$���V���V'��}�\����*���%�l1\�c���c]BE"�q��!aNS*��������� e��o���g��H`�z�q1���!�&�QL!���g#��.@" "������p�H�mG�5	!	W�������dy���J'���V��C�w����)a�2�:�!���^�d8.������G�?���1B�Nf��M�/S����1��u��R�2�:�z��n��XX�k�oS�)S�Z����7�W�����[?x��d�]��]��=�H�x�o�K�gr����j��en��I*z�T�w�uWQ�1�Eo�o���?��a���/�
*�����#la^z���Fm�F�W�${�2u��%�S�����d��L=��>h�/��p�9��T��8�d���P~�$�Q����7���i��>�����!"��7*s�Kl+~��V|96xW:��m`��?8x�<_Sq������e�*������G4S]>��cn}z����t#_H�������A�L�COj�=��_���8�� z����+�����g#G�t#���P�`*�xf(�F^&Y�>2d����6���M*��q�(?�J���t Z�����a��/oJ)��Uk}Y�&y>,0u
���i�����E:HEz�7:0>����yv\3�
S�R�����{��cA%P^e[��=]x`=����m�u2a���$��S��c�Tb3�a���;wv�%�_2��G��A�d�6�Ly&��e����g�>���.�ru$�<&/������h2��e���I#�w�w��GYnNj�����etS�q��HKZE=�������<��T����gS9W�z����JZ�>�u\�d�����n�������Uz�p�II�5//��s������8/�jjz��HAD)HD�%�X^P��D��B��~�}����D���;wn� ��$"n;�n�i� ��#�h������?��[�D.��R��$����_� Qt�{�md�m�u�Dl��H��_��|��k���1cF�F�G��)K���w��iy�=�g����#o��V� Ap����5�ZE+��D
23E��]�v�{��'�t��`���~_|��n���S'w���x?�#�SY�_6=����i{�/�;�r��=w��va��pid"'�x��}^=z��dJ�OWK�q�����7���28��s"�>2-�Q�	���T�D&�]X:��T��t�������U��-��J M-(hm���)(F
2��"�WP���X��B�|`I^s/�l55>��������e����'>���wd����/�0��N;E�N����q�M8�a�y��}�t�D�����/X� ��������}����yQ�I��|��T�X�"r��g��7n\�����%���nf"+�|���1��%z�^7�jj|X�L�h��`i�0}��\��?�]�v����;�#FDZ�l:th��\�����h]��-��Y�x�[���=�\��;��2e�[�L��8���I��v�ek��<��%���J~�����:�����F;����c��UfK�os��,�����jE���e�=�5��'�H����a�����}�"e�����9�2u�&s\���(���}��G�����/
��VU9�/h�I��!�m��5��,�S:��S;iN�����!�����w�Sc�m���O��$"���U����An�i�Ss����j�
?��Z���K�����~���np'������-~4=��kl��5���N�|E���U��+�M�z����D$�����	�^�+�1G����3=D���3zDDDDDDDDDDDD��z$i��A��);��6]'�������#��S�q�W���w{R�4��$�����n�%""�]n�4���~&�H���,���rjm�%"���f�����I���#"���n�������#�l���`I���&�������$��<��-����]�����������������f�Sn/�kU�����6WY���?�X���f���<i��/��n���v�����-�D����m�[�L��Y��dr7��\p��4Tg�8"���i�:���md�6��r�,�Lyg�'��/oXnN������igns��_o�`��HvSC������Tyj��l���DDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��zDDDDDDDDDDDD��z�,X��.��B�_�����X��5��������kZ�h����^n��W��������4�D"�������n�>g���m����C������m����u�]�t��`
��e���������o�,Y-��S<����p�E��������O���%[�b���z������L�|��w�a������3'X"""""R���'���:�#�<b'�p�
4��:�,WP����+\x�������v�yg����/�����i��k��1�cM�6����m��8��#l����Z��������?�|�}����|�]~��v��F �������������%kJ���H=z��1c��=��c���s���c?~|�V�d�^4�q�����U�^�N;�4�(�M�6�hW^y����:�R�
("E|��HNNNd�����B�q�f���s�=7�����("��c�=���3s��H�v�"�:u�p�����U�<�����H��~�4n�8RP������e�������9r�[&"""""��������r����i�"��
�2���}����3�g����#7�xc�F������h���b�<D9�n����c�K#���'G6�d�H�="K�,q�R){�s�=�V�Z���Q�FE�5k���o�{~��k��t��%�p�B�LDDDD�������U�����7��
��a��p}>_�x�[F��e��Y��m��x��g�����y����Q�`�Y�n�l��vrS�>�� �gYAa�-c�c�=�M)k�n�27��g��nt�Fmd�r�}�������[�-�g���|���������zW�9��s��kK����3�kL��� �M�6v�q��Q>~��T�^��@��A��=Sf���M#7i�${��������[DDDD�"SCO 77�{�1���`�
����/_n���_��
-[���F�P��u�]�v��B�7vsX����s]A����w��P�����|�J@DDDDD��64�l�����/��h?������n��~��������{���X���zFMY�����ove(�n�'��S,4�������}{7�Z
?���z
���@����'����{��<����xn�V[m�������HE���$����n�i Jo.2�&Lp
0����+�0��)��������B�z��,)��T(PPpa��_�e�Z�Z����EO8?�HDDDDD�e�;�����~{����>��K����C����;�6�l3�f�m����r��������O?��}����p��,Q����k�a������Rv�e�����p.��Y����-{��2��SO=��n��V�q�]�;���6�yq����S��<Q�4	`T����
��w�]q���O�������s�]��B#
�h�c���+WK
�� F�O����z����R�V�g��/������;9r�u��1f�!�{�����e�O��I�e�x|�N�!0��$e/FE=��3��_?W�c9�>�k������:t�`����[WDDDD������JbbO�=\���g<����:��c���j���0���c�>���1�M_p����G}dc��]kJ8�_�������?�-������:zTO���3k���/�����L0`���K����+4l�0;��������b��]|��W����]w�k@J��~�O��?���<�H���m��=��v������O8�7
)�����L&""""�(myG
=q���@A������v�`������>�lW(HT��3����O��z��gL���F��"����%K��DDDDD���8���n�az2�
4.�{�
S=3�@��]��V�5��]v�%�v�g��s�]|��I���ty�h|:���Tt<����q�H�n��}���J�L���!z�$""""e5�����W^q��6��5�l������1�3��{�1�6������[nY���s�I'��
���_����	�@��F���F�,��+��������vS�1b$^C�/�`W_}u������A&��S,Lo��K���������^{������l�+��5j��q����o���z����#��wFNR�|�2�����$���5�D!�1��N;��z|m����'������B��w�y�}v�m�����C=���y�x�� �n������f�����{��i���y��A���������\y4����`�L�b�/v�h�h��M��j<_�)��6mj�G��f���T�zR);��(&�B����
<��W�|b����������y����1��r 3-0b�k��]��8���;�B6�����H�V-�W
0
��(H������v���?��:uj��l���v��w�9�:� ���x���O?�>�xx��_�
A���w�3p�������K/��������C�=�ix�����_���<7�������z����c��~�k�I$��S,-Z�p�X��������8F�Sl���T�^�h����\C����W�mw���E#�����j�T���E#z�S���n��7>Ym��6��}����1={�t�A�\r���?��#6a�W`a�h?o33z�������w���gLS~ )���K/u=���o?���s�=g�{���~�j����������*�DS�%[v��&e����k<{t�}�q�l.��2����`�{��wm�]wu�!��W�������n���`i��p�=���cK�="""""e���D�M�i��%�^q_]�t�,\������y���#�����e|��W^y%��m[�^�5"g�yfd��9�����E|��H������7�6"��`
I�������+WF�������K�%�e��a������-;Q���U�n���_~,-����F�w�^���v�-���_���J��{���"�m�Y��?����P6�S�N�Z�j�^�zE-Z|*""""RqhD������Ty�=�GDDDDD��4�������H�seN>�d���uS��z�n��M�&"""""�iD������Ty�=��b�E]d�����m�������i��v��WZ����%"""""R�e���MO�8��|�I���I�&��U�V�6�d;��#��3�p���������HY+�����g�������^x��Q�F�������Hb��m��U6j�(�j��l�-��;������?��s�1����j-[�tS���.���""""""U��+l��E���FIE�z�L�b�:u�n��Y�6m������K���F����K6t�P���?]Af��y���/��n���w�������HU��A�x�����~
�������$'�
=����k��~��m�����{��V�v�`��5j���>�h7����]���DDDDDD�����[��}m��!��w�KEDDDDD���g�0rg�����E�`I�0��^�z��@DDDDD�Dy?��2�m��f�
�i��Y���cv�k���{�����,��.�#z����F#mHo���{O*7n�F�2�47x�`���Y�f���_L���������HX���6g����+���
�������H�
6���N��:�%z��������xm�����e��U�V�I��6�0o��g�iw�u�}����b@DDDDD$�L<�g��v��5k�g�L�8��=�\=zt��������jm�a^��C������}��V�zu���Y�E�%���������T&����=z�QGe_����_�-_�h����;v�a������2/�
=�����-[�Fm���n�'"""""RU�w�}6r�H{��'l�������������k�i���[g���n������2>u�'�|b��g���������HU4w�\>|��}��v�����n��6�3�8����{�7o^�TDDDDD�F�D�P�����y=""""""�e���rR��������h��M��b��`������H5�,X��.��B�0�&M����������{w{��G,�k������T=�k�v�|���q�G'Nt��������������S��.��b���������v��������9s�o�����o�e""""""UQ���m�=��G}��z���f@?~��$��C�����������z��u�]6k�,������/�p
;h���{���;�l���wS������TEL�v�EY��m�W�^��Q#;��Sm���v�a�����n��7��.�,��n"""""R5e���;~���s�9��c�`�j����y����/�������""""""UO�����/��.����0w�\�/�N;�47���������e�����������*X�6�X�r����KDDDDDD���
�����x�!���=�������k��������������[�V���7�p�>�(����n���,X`o��V����/��o��=�4V�JDDDDD$�
=
4�=z��!C��L��1����_v�w�}��""""""U����f���m���n3$<���v�!������h9��d���;��y��`I��5k���w�n�v)�>}����Y�|����D��[�n����>c$�������v�?�����>�����������u���6�h#��r�-��g���^{M�<"""""R���7����{���������S�F
;������.�Q�F�1S������H�z���kGy��;����O����o��SN�:u����fx`������H����i�j���%k����r��g������HXFz���ok���{ph<|��&����3�%""""""UK���m�u���?�<f'8�}���n�����������5��/sM��;���~M�>��|SDDDDD�jj���t�A�����w�aK�.
>)���O��X�uEDDDDD��H��Lcs���_�`I��;�8{����z�����3`����O��|��?����y���y����Y�f��w�n��3NEDDDDd
io�������O?u��/�����o|�&
){���{V������Hy�
=`�
=?�����On���ong�u�z��V�F
�LDDDDD��HC�7o�<����]��v�!X*"""""R��wCS^�z�������{�,��(��������_��5�XN���-��/l�sOX����Z{u
�^��Cm������~�@��6�����Q'X�];��k.���d�N�iuO�������g������g�}�F����{�����n���O�DDDDDD�j�3g�=���nf��"����4�_,)����l��W�Z��Y��g���3l����j�
�Z6�e�]������vk:�[9i���;���"K���%;e��gUA����?�x�h��F�m3f�����`������H����k�k������HU�(����nu=��F�`�Y�N�X�����
[K�D"�t��V����S�p$VN��VN�l5;��m�����[��������-<�j���r��u�KvJ{CsJs�1���c-Z�p
=�r�{��V�������m�����q�`""""""UK�f����o�{���z�!�:u�����k����_��NDDDD$l���Yd���g�J[�����(�Va��j
Z�~�[�w>���[������o�>�����'��IDAT��z��7��g�m'�p���Y��v�j�{���������'��:u�[��H��~�f��b���f���"+�l��������e�����e���]f������{����c�y}O/�
A�$h�����\CN��}�M�6��\��}��n/�l�-}c�{ON��R��c?������6�KV[����r����6��N6��S���$;�D�?-C(�y��v����~��,)_<�t�C�X��o2�Y�\��9��-{e��>�p����-��z���nVk�n���k����[n���-b���]oV��5���������������)��uj7��;�g�����<�m{���lUd���QG���9V3��@��/�����#{_o�j6�s>������Y�Z
��}��Z5h���j�>}�����y����o���K\�n���]y���ADDD���s�B�,W\�F9c�[��m�����%��b��	=B�Q:<�'o�g��B
���ju�l�>auO8��<���9�D[���Vs�]��{$�d��GDDDD�"b�Nd�27m/��&�}�������aA�������w��U��Z�#��y�e��E��'�nu�?�mgQ�~�[�n��_Y�+o������t�����m�Vv�VG����ecg~k�k�[~��Z������f��>��j��k�n�V�Z������m|z�]��i���&���V�
="""""a�4�,��}[��K��������J(�,z��m��5��>�8$�'�S��������=����u���=���������k��������5�y\���FV}��,�|y�F����?�7���>f�}�?��-�h�����s`���wF^z������GX�j�m�������K�Z��ul�&��u��VM7u�"�������e{�S�p��%+���Kf�����r�=���n=����3yDDDD�&:�5�i�Y��:����V�}����(�$�������f�?�&�<�F�,����+V�W\a�m���t�M6n�8��3g����[l�}�q)S������BQ��V��>�a'�V���+W�[��Uk��5Uo���o�����W4v�F����{�����FMk7vS�};�g��p;m��m��en�6/7�0K������Kl�
;��X�nS�������m��7�G���w�~	>��h��v���g�6i��=��Ns��w�Gy�4!�����d+�1Lk'���^�4�-�[��.��������k���I���^����<�����-��w��KG�x?��������s�T%o�y��'�������>�f��i��
s��]w]WP�5k��\)3y����/�
�Z��g�F���zu[>n�E�.���?���7p�]���L��7�VN�d+��h�����q���{��V������c�eSl�{��j���Y���j��rts���Y���,�S�j�v����C�����c�|gp�s~��w���g���g��
7���k[nN���"���3��w��v���?�mP��k,������4I�D�]v�����g�o��u���-���s����ko���[&""""�mFL��5�4����c0j��o�|y�Sn��W&�[�~���&�o�V����?k�lz�=9a�+�L������	������Q��o����up�e����9���;�9:�R�����E���������r����[/������[�nnlF�0-�����HY�������������f���-��Z�w�Yn��C�����V��~Vc�����;���z���N�Z��o��?���9�?��Uo���fd�=f5�[�.s��f�Z���Y����y�Uks�U���YNu�L���?l�O��hZ��Y��Ef��m�����.X7�&��jw~�DA��l��qk��zu�������??��K�s
AV,r�Ou�9�|������w�&��������FC�T<t|��>��3���/\��5kf����������[�L�u""""�}�xo{d��m����	�.��MK��f�i���A�zn�o��i�y��k���7���\��f�����ux����un�v�la}�����w�-.�����a��l�r�hC���m���v���Z�5��������[n���VaEDDDD�
�V���pk�����X��z;[g���|�Xk�����0��������5{k��=�T��H��,5�9�[=e�[�r��6������<nd��4���F�������V��E���'f�o��|������5���I#]�	�^��#�����������?l��U8���-��O�z��d{����z�Z�}n��6���o���wfA��i��o��m[*F�|���v�9�X��������:v��G�/��b���������d��y���
�T��.k`��������s��K-?�oW������>8�Y7����#������dO�����?[�T�e���������O?�,Y��3�:��DDDDD�F��n�Nd���?�
���wAn��Y��`��j��rA0�g���W���h*^4�t�`G;��~������G�d7�v����k����%G�8
5�x�[���^,(��Xe
:��g�2#�V[m,Y[���m�����_8������H�kP�^�WA�)Y�/=�����������_�Z�����o��4qe�z5��m���`���/����������O���*��6�P�n����x��,]�9��y��������d������s���B�Y����v���/?/�#����-��_G���J����U+{��7\�O4
�?���[�uEDDDD*��
Z���~v�M��[�b����kZ��
��&u�S��:���M������]e�O���XjNW�`�������}o��[����p�"Tvm��^��]~����=�����k/{��m��v�=�X�����]t�[WDDDD$[E�M��O�j���
Nv�rj2�t�E�b���E�{�rjm�>[K�M�V����lk�E�~�"�gJe��A����
2�.��7�����_~�}�Q�w�}��"""""�A��:Z�F���7��[�x��j�����i�����M���s�W�����XnN5;g��H�^[m�}9��y�7��q���=�M;j�������������W���+��H�X�`���N;�=P4�]�v6p�@k��}�DDDDD$;�O���']�+T����Sg[���f+�XN�]���/XN�6��UN��z[��� ���?�f7�'g�,w����?�y�>}�����9�����w�	��Y�����Y���m�����Q���2j�����gK�.uSXi���ZW)k���V���C��]w���g
�M_|�}��V�N�LDDDDD�+������4������d\~�Y��>�E�X�4��L��{�y��:u�[��m[7�t�^��+M2.��������_��5�XN�����ol��WY���V�����9[N����/\`�/?��u��������[��	F��=�T���\������d����3m�41b�}��W�Y�;v�8��Yg�`
�JVN�j��|�V�c���`i)T�f5�����p����C�P�Y���h��e�]��+����g�Fm�^3g����?�>�`7�H�D/�E�i��*XR�l�����l��o����_�>5[6�e������V{���{��K�<""""�n+V�p��V�Z�Yg�e�?��=���v��'�l�:�iB��g�
�[�������������U��J6�hC���������7�������^4�<��������_��d�w^��9�h�`��89u�[�-��j��X��w��Lp�������:�jv���G��m���6��n6��m�����EDDDD���'��;���<�@���o�3zx}��g��kW;������_��� o�g�j���]�E"�|�{��fm��3g�k��@����������\;��������Q�F�u+������~��nk��i��M�>=Xc��~��M��z�:w�l?��S��j4b��������m�����������u�]����I�X�4�2L��N]���k+~��"�)�l�J�Z����Q(�V�`���{aM�i��c5vloK�|"""""Rzt�{��g�G���+����o�F��b���^z��=��h����""""R����o�Wf��kZ��d��6��hA!d���s��X��n�������:�)N8�4h��2�F�N�:���)�(��3��������[��{������k��f�s�5m����y�M~��#�Xc�:����>7������������/w�3���������9�8[p��6���\�Y}�-l��O-�~}7Ge���5lT��jVk��\k����T��]��/)������i�f���MJ�5i��a�K�,������1b=���h�r�M�<��� """"������r"�3m���n>�U�V�/�`5j�>)��4zP��1�v��#(�#ihd����c�
��}��'��~�Y�����t����kO?��}���qS�L�}�����j+7�������k/k���������Q#�.=�hLz����9��?���;�0�0X�����o�k����y�7e��L��3m�C�X�+�w
7N��]���x������lQ�,o����
����>��j����x�-z�A������#"""�o�����W�RS�������2g����_<j���5X��
��o�x�uj�K�Db!���O��]��;w�u����n���`��n��V{���m���n������T~K��n���-x�~u:��_tU�N�UZG���������^�f�r�4��{��6m��a`4�\u�U6l�0�������}��e��7vS�����������/^���~�����	;��s��Y�6m����s�|h���q���_~�3�<����v�i'���l�2�l���nt�g�Q�(��'����u%}h��s|[x��V��y��r#kt�]�����U��S��U7Y���z=����
�Y����}muO-�J)��|��r�����-�hT��l���6�G�Z2��������9Gww�d�����p�{�7�f���/�$�{���<��l#�J�����f��c���K�%R�ps��W�SO=e���v>�2��w���
j����6�����}{k��E���,3g����Z�j�.x������Bc��G����z���l��In���������3�����z����B4���������8T�n]k���{�5n��6�|s�9��������s��m�`�B���>|���K������?����nM�l5�^s�6��u������;w�V��������������~�\����>rq��4���Un�����a�Z���r������L�%�?i�����
��r
�������C��:�����������?DD$��}��H��H�6a���6�x�W,��g~���h��yn
h�{f?�ueD��)�)7�t�M�\�_�@�DDDDDD���N�F��i���"��0C�5?*"�Y;��������n����a~l���9;a�3��s������j�����;�6�p�`�B|���x�q���Y4b�k��A����>cD=��[o��I��'�����F�?|k��������.���w�e��m
���5.{�-[5m��=�T���-�Vm[9e�-y�)kp������d��z��������5}zH�.�x��)��������i���4�����mt|�m����?S{��=�5�;�����H�P��n{|��6��l������Y�n3;d�}����K���������
I���NEm��W��1��g����B��#r��b��`I�h!^�x�
;<��c=F<������[�������"RZ�5�������U3�����[$o�E�/�(��c$�:�����C_��g_��F�y���	C��w/�?�p��[6��|p�����v��g�����+��k�_:j��E��f�^9q�e�|T��%""���7'����m#2{����D�����-�����R��P3u�T7�?��Q#�����d#y��r�y���&��J���S�����n$��y��""�=�k�����{����,�D���--�V�`�����ysy���M��	���{�B�����a�?�uj7���d�lz��4q����������;�lo'mq�}r�E��d?���S��%�����Fo#��7[9v;[�������I�V���V�oo�~�lIDDDDD��b$O�dr�QZ�n�L>��s7�h�n;v>Y==��a������5u�G}s:�XS�����r�x��N�FC��>�j�u�q���S������|`���W�`n��ju��j����q���e7��e?[x�5V��+,w����[���O��"��k��~�r�h�j����$��y�,��Uks�Uk}�Y$��'^b���z[Y�.�Xd�x���d�i~�U��f�����[hW��������j��^���f��vC�����o�/s���:^�������7'`7�v���V8�p��?��w�����l`,���g��""��v����Q#7b�f��V�Za?%�3����2�M��L��,�`d��j'���+��>�e��Y�e��J����lQ�������e������4z�<��^�}�.���W�MQ�I�4P�S��._x��v������%��O?����k��r��w��*��m�F�It��*4�'
�^C��.]�X��
]�J��������S����)�6�l3��[la�g��3
�`��*#�4ib����+��l��&O�l.�*��L���F��D$}xN������o�b��^f��6�z��eK^|�f��E
�Sy�����/���FZd�2��U?�i�e����?s�Y�?V��_Vm�;-��K�gZ���-��k�m��k�q�N��r�`���T���
n�Uny�n�������C�s�yNnwH�I���W���g���T����&��]���5���O5��H�!����<���p�M����j�a�B��5��V�Zn���,�]+[�	�*To���_%Wg���/��;���������?������u(�t�����fk����������T]���W_�c�9�v�i'7�f�
7>Y�����=���v�e<x��T������c�=f�~��m���n������~;���������
g4���T^�q�v�5���~h{��g�����~�����x X*"���l��Y�-p#z"3Y���-w���������n;�V�x�E�M/X������m��Y�z�S���S8�gK�i�~�=|��-�[dW���>�>�5�����V�zm���	��������Z�����~����v����zu�/"R	,\��_��O]i�^�6lZ��.��M�/��\e������]6)|."9�~�.�����]'������������U�]sX-kR/�������dz����y;k���������~�c�r�=� ������Iv��+���q�.g��m��$ZY����<v�g�x����	<#���a����F�i#F�p��v�m7{��'K<HDDDD��F���F�TQ����^�z�F�`���z�2�����o_�u��l��)���@��C��]�v���}�GUta�v7	i���"�H�wP��U�
�bAQ@�HG�(�H����{/�=�����K�@��M��g���s/%a�7g���1AAAjL�C�\+��$�#4h�R���=��� ����?w��}$M%=�L.>0n�
���A��#����1����R-��� �W�C�n}�0x�r,�fA���v��\���l"MQ0���X�[x�_��Y�A�G,���|0�CD���5��`�k���>b�����{���\�t��������W�p���d�2��������0X��<g�9��M�OZ�OJt�I��D�!���s�������9�G��S����/M�2&AY<v��	u
�<DDDDD$^Y�Gr�K*��"""?���-W�^�o��V����F����H��]�$@S�V-2D���to���*���v�+[j�HP�j��j�]�^���];T�V
�Z��)V�>��#L�6M}f�����8P�����(i3_�"�R�%�rc2,U@G�[�����OY���u������@�o(����+�_o�#�������q�$4�S
i��q��IE��Z�r�L�n���N����k#DD��7��B��n�p����W*X��iV���h#��`jsQA��>:L����9cw����.�TY��.������D�j�Wtt���)�$��4���<��2	��5I��+WP�`A�z��g��^�z��-�J�*�M��$�z�,���	�#J�Im/��$�
��yRU2,��'�&Y��-???m�����(�qx�G�@/[�L7����N�n����4R$��?T����q?t���o��S�N}��Z��A�I�&�d��vz���v�l��Q=�%��-Z�j�H_R�I@g��*���<`����*ht��at��Q=(}��w;v�J�@����]3���"1q}�6
��hB�q���S>�3R���z����D���0uN�Y�]x����G�������8��9
0�V�|�7��PXB�B�U���0������'6X#uu&T�����ir`A�1��b!66�����T��3��j����X9��`Z�!�#QrW��n�QwX���A����J+� KZ=
e��VW��4owJ��}��A������^%���2�n��M��&}�sI��S�P�n]�;wN�O�@�Av!�9R=���dR��
��y�_�d�J�-u�$}v��]1a�U)n�{�<y���x��[���.F���d[0`��O��&_��h��-��.���!��Q�����Mtk�{����U��#7��{5�>hr�f%�7����������������?U
�����h��e���j���Z�9s&����~u������*0���y�f�Z�NV��^����]�v�����|� d����`����J0��O?U��d���4h��BD)���&��%��:�h������1�T�-^����D�Ja�J����+��������0��;����+�����M��s�S�	�m�a:�>ti+C�]�|�a	�
�f����K���������@5U��t���	��������������^����m���{&�9oB���.��Z=+>���l��li��2B�1�����]2�F��%q��im4>y���R�T�WK�Y(���yH�*�s��<��w��Q5O%�n�:��N����������Wb��5*C�,���/��� )�.\�����+u�2f��j&�Q[6X��o�G���c,�c���S�^�.2����?D��Y���������UM���8�����[��0�=�����s�v'""""Jl
�H�3y3]�re�UP��@v�H-{�i	�$�4nD�j�����m�Q,G�K�����gv�q5���B��n��1�N5�P3<�t��E��s����u�!Re���m���y������T��K���f�C��,\*��K�h��]�y�fY�c4C�I�?������_������<��������q��^�"�ezN�4���S-4������Z[��?D��z������]������n���R�I����Kk�P5M[�l�v�<.e���\�g�p���K��	�y��7���<�
�4�7o^�eBH�	Y�w��-u,����_}�U��~����E�U���'R��sX(,qR�yu��w���32d�!S@��������v
���`�+���w',�a0�;�T�hw"""����@!�G������r��q��J�hKz4�Z_�xq���[�t�P�.]����9������&�<���^.��>(��	��U��x����t����k&,���]m}P5�~�'�������������u�J�9��h�)������a��j?�pG%���q<���+���D�a
��]�����wU����IdG�E$u��H�F��)SF�G�K7R�T2<��\/�����(\��:�K�6��� ��UH&����2.�|�f��v�H�	�����o��)�!KVDo�KD8bN����������@����3_8���q	���
�o��wE�?��^�!2����c��x�"<�~l{CODDDI�������������7�V�|�G��R��t��S��%=�W~Q���s����l5*c��0_l��qG^X��;U/%�C=�<���J���WN��z��A5��;!r�?0�=�\M��k�yu��,��-}���=RX{�[��3����!�k�
�2���?�7�CDD�+��N�_��k{+���w����^���'����e�0�����9���K/�l��
���a��@���`��JK�&�6����o��j
����^��I�}��\���3's���e���$�#A#Q�N�����W���C���TI�&)��.]�~�����n���%:������2d��;���x�"B'�A��_���VOR��:/o��=�V�,�E���L���%����fO���sDDD�$���>}������<J.U�������s�|�w �>\*]�>�pXn��%���]���fl��b���%����,�a�4�k��|Kr��@����7�R�'**
��-So������K_�,���=%��'��xV�+�h=z�B"�V`�I�&,
�x��qk��y�Tx-��%-c=�#,8|���!��'��K�k�����U��z/^T)��#{P&�l���8��g~��
�V��&�sL&�F�:���R/v�����?������3f��+������)����:�m�k�7�R��Z�kg�~���@�>_��#����"���7,����:mQg���p)Pz�tp}��M��+�9"""Jt��>���?����6������sB�{We��k[�xY���X������m���j�.�[0y��]�7����>��S�R��Yd_���3���So����l���<�F�i���H�����kW�
J�B",Xv���g����Tj�n�9��t/v�`ZO��w���fL\����;E\���CWL�yyB"-(�����K�V��>��a��j�%!����v��L����'��I�Zx���_�a�j3l��V��G�)J�d~]}�w���(�
�0���P1��v�3Z~0��Y����:^u��)�f���*����R_+���"�+����by�kCR��%)Ze�nB�,�tfkGP�
J����'��)�h����'�������xRx�s�����'�M��L�*U0r�Hm�yH����c���h���6��qq�������o���������:`�����{�J���a�0x�`l��5^���Im�>�@��%J���q���7�����[�V������/���S�2��!&�^��i��]7�����G�`	
E�W����@Do���y�����|��U;w����@�������SA#;��#;z��O�����x��
�����f=�a�:����%.���������#,[`>��B�� ��x�sI�j��d�cG�;�c-�s�A��	st�r�t��
�J�Vse�������I���W����[q��Fi��Mv�g��Q;z1������o��"o����K�����7�R�G�������+�(e�aY��534J� =��U�t���5����Ht���,i��8m+�b���+��w
���(��k@����4#� ��q�N�O�����%��6a���0�x'{4�_G;cm���;G�u��(���6
��o^�P��V�F�3������S���rM9�&����=d��=�n�R;H���{t�h}@v2/����g��}�j��=��O��9I��m�6�,YR�O���*�&&M��~M	�L�6
���:�5k��S�=Z��{��z��v�4�O�^=�?\I���4	%���`���kvX��y����K������M5�Gx��,0���[�l�u^0]��j��LOX���@O�5[���x�R�.2�z=r�����3L�[C�S����q�=�/0\-���Hm
��t�I���zI[�\��~���EH���F�w]�x�����(�-������vQ:UuU����D�Y9[���wm�%�bp���#�t�B�
G��=��^���.��\�dO>�\�zv�:��6���������B�U�=�~�����R$�Q�f"�W&�,hK�HqX&C����
���`�}u���
�e+���p��[%""g�@���@����g������E������qO
�������
����%K���3���=��Rg��|d��<��m���ol�N�M|���*��v����
�-^�X�t�]A�u�s��G�9J�����v������G�����9�k�`�3���T�65,c�'A_�oX��rm������T0G���0�����U���G^X�7@��#���b�gli�2�mA$G��b��K��h��f�����o?�7�Ok��D���e�b,(���R��-�����D�����Q���*U��K������W�=�+���n����N���<b��ux+S�xA	������*j#W�O��ZK��R�V�U�O!"""J<��@����_����3����V�re���,���)S&�yx���^�����y����x��*
���������8{��:�.]:m4>I�&i��4i������������!�
������R����(9�9�������(@�
���0_}�������0��]���y�}��0��^�)
|�z����>�����������������(a5�#R�G�������i�>��i$�����^w���`���1����TE�^2�5N�c����t���ga4Q1K�V����q)�:��z[���oe3���{Zm�����!j������\B���Q��@���		Q�� NR[=�$��3-�����
b��
8x��6
D�7o*V��<yb��?�y�/W�
.�3f ((H���k��ke��=h�0��s��1|���*-���������������,1���r1���uYZ��j�A��2��	��G���0x�>.������u��k��
�J��R#��g�KSV��ImC��p�����c$�;T)��U+��o?���O��������U�J�V�5�6�P��TW1�mv����gL�s�>oBfm����=8�(I���Y��-<�/j��7C�n�e���od������?G��F�\���������t����;��1������K�_������c����]����YH:�+W��4cOk2�I���"	����CXj���!C���3������|���gA��T�jUd��:�y��tjR�G�Br�����z����C�j��s����+���HqwI=������g����d�Qra~	?�"�K�@O��i���?�&}���1~Z��'z�3-�0�ZQx��n��0���������U���".�X�M��yW���m����>�wn��39x�$��BP-{9m��9|�4�}��6b#��^�P���3�U����%��37D\���/,&]6
�������9�
���m������,����KDDDD��H�"��e��}#����{��:7nD���W|>��\/uu$0#;��?i�$|��GX�`|||�Y�-[�7o�T�y�z��w��/���M�kW�^]���Qr!�
���,�,�(�7a�~��^������H�m)��P�}��G���#�7��+a>�9,����S�"���*�
�����C3���?m.��3J;""�'����!!~`���E��w���D�?����/B�"��������d��@?)8�<����Y�F�����?�~�z��]9r��fQJ�j)BG��%>�����U(3���s�}-i�����)�����*��`��wx� ����.������Z���L�=��������A���Q�@<X���<~~~j'��(��mDDDDDDq1�C)�E+���t���h�Z;"����L���
�/��d��#"�'1sO:%CRf�����n�������q�	3a���wO�gR"""J���"�7~�������.�}��v��R�u4_��:_��O��hS��5�4C�%���z5�g�O(�����hs�v�����gd��
.y��,fX���ie�Ov�
����4*]���yK�e�������-,w���KC��S����#MS�'�b�I���%&H�<|�=l�%���D���Pc���V��1{�(�


��y���iS�;�3��\���*m����]>��\BDDD���K��=-v4�����a���36��E�����`����f��l|6�*�+.o���+p��`i���	����qp:�����D�|0�C��t���s�����[����kFX,�����K�`���QM��9t����H�-�:����k��|H��f�P�(q�;�}��������1`n$�^5=��������`%Y!!!�t��}�]U��a:�E����w����DDDDI���'���>v��TZ�f@�O�a�&p�� �gzd�6��Eo�f@����F����^���/�EQ�����E�E�|84�# �Z�R�M���9$�A�7]��0���OYu�0�����	}�����.]U��6w�u��Y �`��^_:���`%��;�������6�2�w�Y}��J�$������'Oj#��y�����@QrQ;���v�T�y�n����uO7�+�;��gW�c��Q.K	�v�B�%�0d�D4�_iS����_bw��x���|�<U��%/
�`����!M����UD��=���d�|*���O����r`��YL�1��]q@�m=m���"����gn=fF��u����"���F�Y��8��C��M�%J�P�x��aW�\���3��K�Ha��"�w'to������m$����������SK��'�
�|^�C�v�/���h>�c���e�!o�Xuy"MQ������-��]�;�����w����L�U�����3���U����z<==�5kV\�x��J�6��zOf	�Tl����6`��}*������u,np'n������/����&��m~�v��	K������E����(��k:%_...�����W�T	U�V�������`�9U�T��{���O5��Q�~���Sa<q����bN�@�������0�W!""z��k�HGR���������2�P mn5v�z�����(S4b���,&,<�/>)���aP�O��PC�	����'��K��Di0���&�ph�G�
|��w�1c�7o�?���-z��^��UD��r}t�KB�YP�<��r� �.,w������.����~���[l�]�Y�?a�unZ����7DD��2���$%o�J���;P�Ll�����C``�
��"��k��l���&J1G"z��;����
D�^�=Y��[���3���%~�7	��TCHt�������kq��<Z��e�7E�Em�/MN�-fT_�]6~�
Y�@v��0����(�6��T������D�ty�_�f	;��*0�,��r���[2�|���@����e)��K��L:m��E�f�i]�vU0D�Nv�X��C���6�rn=��0��
}����)������iw	�#?���iW����	O�s�^��ADDD��-Z{��Ui��&�������="r$��+Z�1L�/h=""�'�Tl�������,����
�,�?oe*���?����mM�D���1��w��|!�7�=J��N[�Q)����d6�i<���-��G�Ou��x"3_��I�%6�z$w��I��p���6��<��$�$��E�g�fiG���e���v:�<0����p�|�����>���R5.�#`(�$~�7J4�Z����(	�Er�+W������<Ili����N�S�*T��;wX����N���DDDI��ks@���r�o�G������WM�6}j�92�(���L�3'u~C����Z���m	K��*I>���OF��m���gm������J�M�N$2x�_�ADDD��L&\�z��)�����s�>f3w,Q���8���%��������GFFb���4h��:t��y�����1`n$�^5=�����������ov����a��F�M�)�o��;�k#DDDD������Z��['[�l*���qcu�p���2d�)�lDD����uH�a���������6�S�/@�%��B���F������:5���+,l���g�1"zI��3�Q���g���G���Q�Z5<s��U+��fO�F���H!9���L�o�	����z�F�c���m��|�o������(�ruu����n���u��pssC�Z���'�<�
8��Mc6""Jq*f-����k���ZM��]Y;k����;��uGbB�Aj���[��:�6U�,���.�x��Y�g����!71t�d��0�;���<�i=Jl��X�B=�*T�W���Y�z&>>>���6m����G�1"�	OG!;{��_D��K�{�Z������2��3a��LT�lY���S�Lyl����#G�J""���B�U����;��h#@�9�����[h��Z��n��E���T�'�wfm&P8]^�;��� W���~r1���oWOm��qh�G��M�<�*U��u�P�n]�K�N���j}����~�
6 $$D���P����L�2a��m�Y��6BDDD�#����T>n�����AQ!h��.v4��|>9����}�uO�?j��f��7M��� Je,��%"rN
�����h������0�)SF��

�F���>/�|Q�!���;����w�����+�Es�'""J����V)���z[�%;r��\�z��PWBnjg����8�wV�*-l���������Y""�����K�P	�j#��s2G��T�)X� >��#�����x����}�v�Y�U�TQ����R�e���od������q�Vm����6��L�EN��v�QR�g��m�]��^����P6s	\��� "r.���.���c����r��6+((�V�Rs��������(%�X,5j�
����i��������������+�����>DDD)���9|�4�}��6,�����CXL��h��w���E�U����i�%���E�q��Q������Q�����94������>�.\@�%0d��MLv�����[��]�tQs������R"	������wG��M���7�H�"(_�<|}}�������Cj.QJ��;���>�5�[�kW������8�m�S�VA���?A��u���Z������;���BDD��������_����|�
���7o�I�&*���3����#�DDDDDD�]LL��[Z�tiu|��]�9sFz�����*s��j���lV�DDDD����K���,��.����[p+��vg������N�-Z���;��i�J? MrL�}��jQJ%2e���c��s��m��UK�4��n�v�Rs�
����R�a����/0d�D�?9�m��_�xe7�yf��+%����H��UUi�k�����v��yY�.��hS���{�V��}�H�#""""�];�*U��1c��W/���Ou��d2a���*B�r���!"""J�����E��hG�k��Y��C��K	���3�#}����6IK /D��|�w��������|���k�a:Xc�v7""���������y�7�Qc;oB�EmPf~S�d���d ���L==<OZ���k3�(��,@�
������<�
B����'"o�����/��������w�k=�8t���#J��r�
^�ud����e{l+S��
�9��_����D\���L����(�v~�?fK�Z7���Z�r��b�jRX�����n�T��YKa[�?�{�������:GDIS�,Y�~�z",,��wWAL�4	�B�����DDDD�W�)Z�9���O��94�#�BeU��'��];�n�^�'n��� gd	M��K�cW(�s�qK�qU�B�B
��w�F��~�p}�-h��������j���y\��2�_W�q]��;����^F!���������T��b���1�� ���������tmRD�G��5kZ�l��FO�V�^=�J�(%�Es7��f	C��y���wok�@��_�^�����h��EmY�&�p�Vy
���`�n�D@��j���{�9qT����)�7������T�"�pl.��1����h��.�
n��XK.��[����%]���g�����s�GZ��5Q�ti���������������v�T�R�y���$UV�CDD/K��10����k#��20���|d\�����e�* ���XdX�	:WWDo���YS�^�.2��	���l�v��`M�t0������dk�����'*d}C��z�m���N���"J����O�/_^���:u�#m��M��=;�Q<
��K������[�^�������}����]����FKT$L7�!�[�oP����'�|?.�@������O�������z:
�oz�.�e���{���ujb�Fl��[�����.n@������;0U}�.�G1����AQ�$5yf����^{M��	

�;����"""#G�TA����3�5)��H�������M�M������ �o�x�	b�RY���E��cj9�z���1h� ,^���MCLL�v����(i���E�Q��~�z��m&�6����y�x:u>b�|�������8r�����r�X����1G�Y���D[,�������g���V�Pu��X�Z��u���'����9|�4�}��v"J����q��9|���x��7�&M�(Q�V�{���v�L�8������H	�s`2!������6�q�#�YC�,����� |��9r���^vC������X�H�'"�����[�n!w��*M���+WN�����nnn����\#��2z=���su�K�|py�,*5Z���a<{
�}�T���J��n<[v@�������[���T �^_�@��X��7�m���A�49���=�#rxg��C�G"r����z@�<yp��i�����Uz��O``�6���(�9z����+����(��-?`����;s`b�G�����n
��H����I�M�/��L�`�[Im�K�"1a3&B�9"����
�;�3H�@����+W.������\#��*1���@d�|������@���*����_� ���kD�X��@�����f]�!�n�&�dN�!d��	����F�
������:������w�����R	�|��+����.&J�s������fj������9$���)RO�b}�}�v��	��aa�@��>���p-V�����_�a�r��:@����D�$Q"!&��m���W���5r-���Z�$\K��_����#��^�,�T�����q����W�,�w�>�tT)���!C&�z��z@""zQRwG�!L�>G�Uc� �l6���*
��
����v��DK.��z����+�9C��p�WPe\�R�u�z�y�W�:������.���c��
a���^�
���,n#���?� ""�I��
��#����5�������U�a���M���&�B��{49vy-?�M���#���+����[0�����a	9d�X���#/,���|�g7��k������7�����QJ )��>���i�����������F�v�������V�ZH�>�vQ�r>���s�k!�SZB����;����kp)XX;����<�!z�5�o�u��T�*U��d�k���yx"����SJDI�C=�f`���>��^�za�����\�DDDDN�t�,��O]*mDc
����+��y��F��U
�.]5�35Q�,�{a����� ��T�R8y�$���+�s���S�NE��������������WA!""���/�u��d�������t��:t�}�V�2��LG����x���{����~����?�-��:�.���y[���W��U�G�����.�z����c���9S=�H[�h�j�c{���_��Q#���(�31���Bc�Om��|{�m��W!m$�
��SA�[�z`���[��{Q��5kV�n�Z��Y�d�����Y�f��=DDD)UF�tZ����3w2����}�T5E=�~�4_������i�3t2��
�9����dN��� ��]����:�&D������3r�H�0��w�!44T�"�&��C���={�����)S�i�&�=Z��������s��z�������t����	����1��M�	DDDDDDDD�������H�Z��w�U�������u�������N�:�[�nX�j��DDDD�I���|�Y[m$����1�gn�����t�s}f}wf[�OD)������E���q-w���u�y���94�#��������S�a����[o�92W�+T���w�� ����<��a�2�
���[��smi�nL�.CC��
��:X���t�.L{�Z��a:XS���R���>}�`����3�����'�<�Z�j�j��94��������:u
�q\2&�d��w��QA!�����gr��,X+V��FbI���U�>XY�=��N���/F����y777|��g*���bbb0~�x��N��K�#F�@DD�6���(e1�������{V2j�6��b��Q��/��U��xwT8j
C�9�� �z���"Q��0��5�/��\�K��
��R#F5�o
�L�.K+X�[�[�@����*c.���<C����������D�2���a������.]����Hj����?���i�jW98��>}z��U����������I�C(��V���+�{�.]�����"���[�.��;��������t�����n��%h��9|}}1g�t��&L@�&M�����H}�^�z��M2�Q�F���z����@DDD)���F�8hDZO���c�%_1���d��1�A*,��.�w9k���H"��B������r�;b���D!����A���6�P�_�����Pf��A�%��=�!J�$��,�""""""zV
������?����h���
����K���S��=y���_|���0���s'�t�w�W��^v�<%K�������G��	LI`�i��d���_�J�*a��uh��
���?���6m���s�<q��	���O���-Z���J��C�b�����y�6���(��[�#Z�#[��o[d����1�Q����u��%r���S����}�.d�W*��eQ;}�IXL8��]���'?W�wv�����>Y�V�lYl��]�q#"""""zV
��9r`���*��%K\�vM�2��}���Tg�0S�re��],�J��=1h� �����6�(�3H�|��i#��g�0��U�]J�k�V0��d�G�j�*����?~��N�eR�UR�=.�QJ��P����PV��	�����������\��}t�~���(�]3�@����<w�����/0��L,������C3��r"J�$}�,���z&������&�L�fJ """""rx�GH3yX�Tg��L������=�������P�J�W��@v�����*u��H�F��d����*������JG��y����P'G�E�l�	e��Q����"""J�n����	M��F�If��{bp��	�u�����bL�{��1wW|�u��t��Hs�,���;����k�D������l6c��I�YA�
ne��Q�""""""�D
���2y���2�?n%Z���V�I� I��&Mm�Q��4k�Y�f�
�HpJ>��qk��9sF�2g�����|Y�'A��K��7n��v����,�k0�."�GDD����hR�yZ����#���	_����cp��	_������t^:�n��%�y�h6=
f5 �{l��|�"����UK��Em�K����|�����Gb���Kv�8��C�
��o�a����4	��D�D
�H�BV��W����-ns�Ui������*�3z�h�����MS��d�R�=�{$H#�aE�U��9�e��;�$�cOo'+����R��o�b�@/�~j��J
���T���Q}�
C��a�45��[�����n��(r�*��}!��C�������%�Z6D��m���/"@�����9�,;x��
��\�R��n���#�^�z�"	�E��$���@�WZ0@}�c�___5?��L��8�7������
��T�:uT����?��#����;c��Y���T��:`�����{7�f����
6�V5�
*��
�qy�{xW����$�N��z�g����~�K;zq�������#���e���s�A��kG@��%����j�;>�����t~��'����Z�2����ti.�������o���|��� �BZvDT�j��&l2
V����a���������o��'��?h="�%�k���^m������{��~W.C���6�bL2!`���1>:�����|v�����iG������xyy����4e��^�U��>�y����K��$zd��,hp���������k��N\����Z�P��������m�~5��^<�s\����^�RU����|C�OVuGe�[]�~�Z�Q��2�?[������;�.��0���e�7�z����"���%��	�H`G��������f��,d���C��~��A�����?�X���@�9y���+)��Fv]�rE�{�]DDD���������l$H#�H���|��,����C��M���3�������c$4�#�D�X��U�6l�/;��D��7����[`<{:Q��K�)�&"���;z��'���C[�����v@�*UTZ��3t�P����j�N����Y���m�������.�,Y��;��k'$$���WA����I�F����C	���>v���oV	�R�0�M���
����}�N������/��������*�i$�RB5,��>��T_>��u�P��AV;��i0����	!�dU�H�U+)i���H�UQ�}A�?8Jb�Z,��5��=\;r^|�0�������W��G����G�v����O?�4��2;��T�jU�o#���"J����Q�����y�(q����tS���^.����=/�;z�4$���_?����&i�$���X�z�z�5j�6���{���P�wD����j�����A��g��U���K�R��(Q7o����Y6r������)!�CDDDD��HzhYdv��1>|�:uB�f�i]�vu�g'"""r,Gy�#�MD�����%K��l��1b�N���6w�\q�F���1s�L�R�NR����/j�]�
�X�r���3f��vk��U�Ve��}W�\#����g?H� ��������wQf1k"��&��'M���>��gJ{MDDDDD���@������_�'OU��l6����M�%qS�%uy��U)�d���i7n&L��J�*���_�5�+��f��}��U��ba�������d�V�Z��--�|��G�6m�
�H��:`������\ODDDI��L����S��z���5�/�����R�P�^=��iM�0m���@����t��J���o��d��j��[___���=z�����
�H`'��U�.,Z�H�}H_V�I@g����n�5?���
I���;�:A�}�����ODDDI�%�L����z`�F�Q�5�/f�����������C=��Td��Z@R������L��L����N%��$����-9���T����=$z���I�UI�&s0h� ��#""r������d�9C��7�z��O�Z�j��?��W�����(Y
O�b�����K�@ODDV�^���I[�x1�/�v�������mr�\KDDD�������������@t����5{�>����uK����4q���\#���K�@�����3.|�&�8k"""zy�_7c��h�^����u��q�����������(yI�@��������M�>W�k�Z"""�'Y�/�gG`���<��m���oEb��(�NDDI��b����_?t����m����@DDDDD�$j�'44;w������f��C��{	��}k�v�b�0��m�vDD���5
o��F���S�>���;��M�����(�D
�DEE�w���P�����V�=+	�l��Q=��J5���p����g_�$���!"J�0o�<�+Wg����hT�S�+W� k���UDD/&��e��,a���;�������eU��L�o"�[{��U~�!��Q�C�����[	�L��&""�W%Q=�������Q�|y�r��������������f��19's�a�F�x����a�u/""""aIx�G1�� "�$H������?���`��%.	�D�Y�J���2��
����q�^��:�@���p�Q����"|�,�.����o�w��0^8������`���DDDD/S�z�������/�v��>|8^�uU�GV$�#M�2&�~��4j�H]����"M�4������������S#o������F���bA��H�N
�<���X��w�v��.��.mTP��[���0`���LY`x-������
�� |�l�W����v'"""z�=�c')3f�P�v�/_���(Pz�^5�����������k������Rooo���3g���#G���A�	�V�
�N�H��;7n����|��g��^�z��R�
N�<���%��/^�����ynnn��������y+W�D�L��������X��
C��e��d#��X��&��U�F��h��sW ��;�Z��gM�>u�\�`<����Y5�v�T����;/\���K�"�]����esX��Nv��n���'�����z��j����u����]�MDDDDD�25l�
4�o���r�z�U�\Y�xs&���8�<J�.�O>�$^k������4R�H�nv����#Gb���j�R�J��w�6�f��%h��9|}}1g�t��&L@�&M���
}��������\\\��cG���v�f���0�8%��D��M[C���������>���#U����/_D��1H��+�dSc�x��'��{�oP�;����%""�����""""""z:�a2d��3F�F�19�;���*�3e��x���F��i������#F���X�v-����^�za��-*���? ""B��s����kZ�n��i��������i������5k���}����������p��:/����2f��R�%�sg�g;:��_������_��%LpZ����+�&�vlt:��_E��#����0��e�k%�x"7����]�n�tS�R;�d>�\��b�Lv���__�<���=B��m�6���������HPy^7o�T)�$m�����'Z�l�v��S����Ge����|||���@��o��+V������Q���6�H�.��������_�����J��#J\_VlA��{����p�����
�� ���j������d�����#���3"�]a�����W�,�7zG���z<�]z�4n.��#�skD��/D)����v0���
�2_���0n���H�j�Z���R��T0�,K�^Xn�	�f_�d���"�j""zV��bx��a��5C�4i���A�/H��=�6��$�#����)����%�	�I�5q��qxzz�p����Nv,XP�Pc����t�BBB���K=��Y���<���G��E���o��D��>S��R���Ri�LQ�	���X���v#���*M�W�*8do,��Q\�u"��mH7a��|�QJ),w������J�������\�����Q �<�w�|a�U.��iJ�|�X�C��9�����[�|~�v'""�/��b)^�8��;��$4��h�M��I�G����L�����}[�f+P��6K�5��wv�����9sful'���$�c�oT�N�����W�w��R�J�]G��]�t)���������R<S(�7�>�����yD\^��T����:�]����>C#�9o�����y����a�>p�	�������v#""�/�%!����B���c����(�i'�����j�M5�������h��3\
����M1�a����5������(i�z1}����i�0g����8��$)�$3z�h���_�%�\��=��G�g����:qe��M���{��`P�a�;�d2=�}T�X1��9c��E�����}�� u���+������DD�d�+��K�����50[pL���N{}v����
[��]��D@��]�T�����`	?}�����DD��tYbE���^����p�a��������i����,�tfkG��,}�|^����/<Q�O�_@�u�U?!������9�C����kX�}����|��� ���|	������4�OwS��0��]�7U���Xza��'���k����9�i'!�gx�z��O���]���w���[������:�
��F|�f'�88
�1�����yhB����TG�qKu��2��[�����y]��"t�O���}A�?y=����r��=���~8pQ;z1E������kG���&��?p)���sg�����&|���3���G�\��{�n�b���Kv��O��/~P;G����=k�,���?�[�����i��1�/_�F�i�6@�*U�����R��y�����6����[���y��]���A~�%J`��q���o���[�]Hq����{�������Q��j�&����$�EU�����#"rF�(�z�)i	=f}��)�E��`�5�R�j3��U0_���K�/0�a:�:����V����W�\�y�f�n���|���d	�K�6�2�C��`2[�����~����7G�>W��|�T��R����c��u��{�f�X�M~�����a������v��������O"�����QnEq5�<����{����K�����2��	��;zd����J��ir�\KDD����\S�F����������Kl������<�����\����Na��#���C����b !"��#K�,��3��z�c%��:t���� �:����H��EH��������y���'���p���$�$�������%K�`�W_}���TA�A��ttDDd�X�v���L'���������V��@����v� �(���4e�R���A��
:�Jj���r���*��',o��D�Ri8�z&&""z�D��#A��.[�����J#��������X��C�j��5�t����/w�������~�op������'a��X���5�J�SA�����:��F���_)�,���;z�$w�<������I-!i�����i������8����;���,�k'�%K���7��>Rg��|d��<��m���o�s��u�T�i���*�[�N��3��D����
����;w>R(�H���O"����4%?��s��1��K��\��_`�����r4t���P������B����gi}��7?��v�
���������G$�{���]k���������e��cd\�W��\����'q���/���%� L����#����g`ve�7�z���~6�����i�b��IX�p��6u�T�FZ�����%�xR�J�/��R]KDDD��}�wU=���[c��]����]���=-��/�R��O���iW��|�A��J�&5j�6K��EDD��9O"uxdW�|��u�$P����j������>�O�������g��t��i����C��5i�D�~���p��e�F���q�=��fuLDD�tYZ=H��/2YyT?���R5.�#`(�Dy���mpy��Bc�y�u���u�k"ax}�� =Y��R��z���Y�du�����������������Km�/S�����L������K�Y�Nt�i_y ��m0��g?�iwqXB���d����Wmkf�/���4�L'>b����-o�XT�7��,^�V����=L�\��j����t+���R2	H�-[V$$�!M�E�Q�T��p����=;f���+W�h�@PP~�����A��������aCl��A�O�� ��y�P�bE���G��+WN�z3f�P��[�v��Vv�<���NR�����~��yyy��J}��$9/���:��������C���S���v����sk��d������M�6��DDDN%��JKK�:s&IU �Eu��tT�b��L��*w���%\����M�S���9�5���������Q�����v�t)��Y�K;�>us���MDDI�,��`��T��%��M�o������P����g�7o^�R���*M����0a*U���7�P�����PT�ZUY��@H��G�*@S�V-2D�C�������o�Q��S�������g���j�a�v�P�Z5�j�J�{���r��;>�$�V��k��E�>��O�E�������()qh�G�Y�����9��NDDN)UvJo�>w_@�3���r
��v<����u��
a���������}��]@�u�wf�J�������#|�RcB�A�>��ol2]_o	��V��|��X��T�i�C*|7w�%uRGF�
b��]�.������;���o5&$���eV_
	��@Y���wo���D���s�Fv3m��E������Cv�l��Q�~�K��H`&$$D�%��G}���C��l�2��yS�}������]GR�I~�����@���%""""z����y���*���d��<�����O��LDD��<��Pj5\������0����o�v0_���X'��5DD��H���{������!cr��!H`D�$�I�T��/cq�&��{����>N����Q����j��%�U�T)�l,���?�����=dz��m��S9s��Fl�J�&uL&��?+���������zd{}�.]T>d������J��K�(�@_~��s%%z7������:��*�c�:e	=
D\�.�{����R{6)��$rN��\"���9q!��C@�������D��E������esxI�a�r�J�7y���h���j�����M�q+�����%<K�!��G0��m4��{����lcV��M���/{���c�q��;�W��jr�����f�=�=����s����%����v��$�R�����:&"��G�I���";Qf��"s�H��B�<��;!r�?0�=�(-���������_�������zD��9<�#[�������/���;X�f�j�?y��*�IDD������.�#p��V�F~�u��	_�������x�\�����F�>bT}:iL7��O�lVQ;6����t���LjL;��
��X��+� ������Q���@���en]��0�.������
]�zj7�%x?t�;k3��(%�T�
4��������Tav��19's����"r����"�U���(yp�PY�Y������0nL��J�D^��h�n�|�s�3oqXB�!�c�W�
n0n����1�s�q����L�X������>�]��j�������(�1k�q3�Wm���e~�_obb���������f��
��0:u����aW�<b����\>�G��#�6b�����4�~����W7m4���5�n����S�R����m��eW���/crN���/:
.�#�R-����1�w	��U��(e����U��N�:���r�RM�2&�dQB/]�z�a�q]��<������;�[���t����36&�	��F������m����oG����Z����5���;�*-l��W}�K�/��B�T����!���v
��3`(6.�oX�e]`�?]��TX"�Z���F��]�d}��h}�>k{�oLwY�������%��

�����jW��x)���� �]��A}��������f���
�j���5vQ��y
���r������uK�`Dkw�Y��m�I$�kV�%W����%�������i��]����eL��"��'�E��������`g�y��LW���	���;�������QsL����{�����U��h4�Cn`��C8�wSj���2�1������^�E]C��X������K�YC��eh��%T
��Z����r
��vl"C��q^s�@�
�w����|i���n��ID�"���w/����:u�<���p���+�+�������&^��|�.��/��RUm���(����6
�_|�R_��4����W��T""�������b_tD�c���	w��]��V������;�6���1U"W�lH��=|���%�B�
�`���	�)������vQ�a	G��S���ie�f\RC��}m����>"���)5��fA��7t�y`(Te��y�.M�26�� ���@Odd$���{DGGc��)j5���7i���S������,�}I��Up-����CDD�X������?^!"�����!T^�#NG����w��<�����iU��a�"�w��P-���fs1��\��%ZCg������?0���(M�E���ns-XD;����.UnY?�&�/��F��|�{��\��A��`�q��:g����}�)�M^0�*�R���qh�'  ���g�}�O>�9r�@��Yi�10�
%q��'��A�����%����IM""z~���������1��|U���H����g��?}Ku�F����od(��[���=��\��������K�t�]�OwK�&��{�����+t��U�z&�|��������(X�{K���1GX�U=���i��IJ����|@�HD�����^-ZT!""z�Lq6�����3x���h#6^�z<��92W�Q�3�g���#Qb��o]�t��#��~�!"�g3����o�
��N�s�L��"O"��Q�fB���o~o����[Q��5���T���U{._�����������J�{�{�+a	�90@�u�%����c-`��^������+�`�]RnG��{�1n��~.�A���f}w�C�9*��.�0�K� Mi�J"z^
��O�e��U���F�6JDD�l�x�0��;r���v��MW�����<i���_��i����8�������������^�{��a��e�t���)���t�GZ���q��-�*""y�C��������4�_�������������Y�]��uWw`���(;���o����W���yM��E�tyq��ItX�y��P��Q��^�s�����FO��]����?�����Q0����4��}a(Dn�T�Uz7]�R�P��,���F��V��0�k���n�
���,����rh�GN~��g9r={���s��C������\�FDD��l��;G����h���3�vk�����w�9���������=;r����&������(>�y3��w��|!66�����Dv��XT��T\��/�	������Rg���~����	U�svr�?jW5{>*��6J�0Gjp���?EmZ���(�sh�G�8U�T��S�0i�$,X��e{���5	��������Z��������{H�@DD�"44��=V�^��%u��m�p����6�#s�����������@�V���'�<���KDDD6��l�z/n���Z��������������Er��m����������Y94��6mZ��m��)Om2G��M�1�)
n���zDD����z��z��E�r���p uM���~�1�5%u:W���IDD��������4h:w������=FQ2a	�
��i���G�pq�zDD��H��F�a�����'�x�
��y:txl�k{c�k"J�t����������@OLL��
`����:u�j�/T����5������7��`
�Ow{�&���DD���t:�9���C��=��uk����V�Z�MwmoL{MDIY�JU���R}K�^�v�q�����rg���>�:o����J0nL���0_���F;�����u��C������������������o�A���q��aDGG#""B�eLn/^��&""r>��?����v���Z��,�5k���q���/� K�,*���t�����D�����7�7_����R-��a�6�:��	��A��P���0��
����kz�T
�>�pX���%h������!�K�1�Nt�%��v'"""rh�'22s��E�����_�d��puu�����������?�\"""gd�_��^�%`��#"��(k���V��s#"rV:C����E&@�o�������X�n�Y�Pj5��X/r�Q*��/�+o,��3GZ'yC�]��f9�=�����D���	]�7�;�C=RH����h��
|||��X2&�d��%""rF���Z��Y�nj="""""�d�x0�T_��Gf,�W�rc*�y������Vi��wC��������40_��]�L0��.�#���:���j.�8<u��z�z�9"""G�\�!cF��������;L��jw�#:�b'�=�����^���{a	���c����o�N]���h,}�p�}��`>�������J�{3��a�n���m�[s�|0n�`����F�#""J��I�.�/�e��!((H�%crN��\""��!h@/����K�j�3�����a3D�����F�UH���������fY��ZO��n����]���X\���`>?�:��v�H��t�3L�[�j��=lM����8��Z������H����FDD��94�#�x�t��;v�V�Z���q��-��/crN��\""��]�3c��H��C����7:�WG�h�n���<��wkG/�bA�_�kDDDDDd�����~�d�1U��1��W[:���a�Y��K������b��7�WGA����!@�7����'�e�:�"��A_d*ti+������0�������ED/�����Y��ub���a:������
D�"��M���;@�z��-[6��/cr�G���I-���3&D-���	��`�!#�������>��^\��#�w�E������R8KDl�6C�Yp����:=.�A��}���P���\4\*_�.ssU��Pf�J�����
�<L��
\����I_G�u+����K/�Kp����	�����,w��|�,�	�~ �_��2�h�
��px�G����O?���w���[�n�I_����!""z���&\������SF��
���0z,	���-���R���Hl���
��p��}:t�"���x�(,Q�Z�L�Y��+�a��_1t���!�&���/0��T�W J�����z��|g�����vDD�����*u��h��
&L��q���f��H�&�v����Q�Cg��h"w����b�`�����93�U����c����y�&��m�2!<��)QRs�8�wnkG/���sx�v���_�-7�iGD)X�y�� Qw�=/�zd��_|����#,,L��������Gh������R�+V�u��(T�V�^�Y�l?����:`��M=z�#"J�,��fG��{'��c���������>��!���������/� c��������?�\=�t��K�,���<��m����T���[��u�"]�t��������?�6lP���(�(S��sG����(!����+W�Y�f�={6�������Z�l�m����_�����\Rr��,XP��{��g��^�z����*U����GW������#��j�<�}��g�f���������)S&5W�F��|�DDDDD�X@@�?��]�������L�2�z�j�|v"""""�W���y��w�}����h,	�4n��.]Jr��N�:��P����F�� P��
�s�N�9c��Uc�o����,����ys���b��9�����U��I�x9�% $�z���
*�����_�~����
Q����U0'00Py���92���������O��	�<���_�zX�]6R��d��8}��6�dd���7�v�Z�FA�3[�lQ��~����;w�����~��AV�I:;�M$9������'��O?����-Rs%/���C1}�tl��Y�IDDDDD����)\��z����'Y �j�*5�q;~�����(�rht%}��([�,f������k���F��������
RO��w�F��y��JI'i�J�.��y��Q)�d��������={T��K�.��j���7�|S���|�B�d���`��ok���J���rDDDDD������w�p�J�(�!C�`���0���{7Z�n�;v��
�KDDDDDd��@�����������E��U�Vj��4��R�HuN���� u��jG�<`I����@���wU����������<����j�]\i��U������]BG�E�l��/_>m�M��U}9�|�DDDDD�S��5��_��7�|�����gI�,�f���R;���|i�[g���x��70o�<t��I5y�)T��:'s������Tki���Fu��m���@��H,�N{m�3g� ]�t��9�:���:$� �����T*�\�r��Eq�\���k���yDDDDD���w�K�gI��p�B���Y����o����R
��*U
{��EHH�Z�&M��R���=�����<111�T�F��d���dR��d��o���;��g6������-��IB������=��#�=��Y�����K����x�Ogm�����O�{���_�������^_��������r��R��:���[J"���V���M��&i������DDN�b�%�,��BOh7%""";�Er��D����!Sj�<.���HM���c����R$<i\8pU�T���~�����C���y����5kVm���a�0x�`l��U�nj�����?��y�}����SN�P��dV����"�����z@�_�����������{~�%�k����=\���W"o���3U?!�d���>�D���&~��Q>g�����������k�a�*��o�2���Y����LD���������~BL������u@^�W����c�Ai�%�k�6�O���&j=�`hGxc_o^�|�������������$���1nw�������.�:��������A����.$���������u[;z1�Se��9?����$�3�?�T������L����;kG���$;����R�g��*�#��*U���$J|��"tt���<�G��������:����a<����O�n�l��}�3_��A�1XI8��k�	]��Q���0t�d�(������E;���]��\j�.�n��N\����Z�P�7~I���^M�fJ��~��L���������.���/��������g�w�^��g�����Q��+�g�2��j=���b��K�^J�'88X>&L��v��C���k��wo0���[�LA�"����#G�o��O
����K�b��m�.��=R�G�I���;w>��I������=��Jx p�'q]_�.�j'����?���o`�f�z/.:}[�e���������
zj�z�m�g�r���{q5�����(��|��� �,�>��F=�w����T?!����g	����_X}#�����"�����AB
}/�e����M����� sWi ���0���^�|�������nZ������$��1pY�������.�:��������J^�u!�J��z@�}?�\H�R���2���5�?Hg �GJ
��c���A����</I&��s��}u^�����E�Z��C	r>��/5����������.o_\l���yu�y��y1��b�'ypx��+W��������cQ�d�%�����={�T�g�%Kxxx�����H,{�6{���#f�����$%�����)�Z��={v\�tI���K�J���9s>W�yv�&�*C�{�����{��gb�?��~���R�N����-18��W��A~o�{:���Y����:���������__��R��_G|�;cK��=��Q����d���R�G���yI>V�X�'ON�4�DD�f��8*���a�_��l
�����#��I9�o�>�2dP��J�.�V+��� ux$8#���$u���/�����-^��J�v�t��2��������<����%J�����Y6��w��yu���nDDDDD��$�#uM�w����DDD�����|�������WuNe.�S0�k���j=""�����y��i�zX��g�:=|��
����;	�H*�
6�������/_��y���5O[�r���p���1cF�?��b�k%��}u��i�@������`����q���G��Q� ��%e�,������3*��6mZ5&)�d���lKGJDDDDD$��?�-ZTy�<�8���������
�H*�!C�`��qx��w������Jj7!cR�G�B�_{��������k�j���U�Vj�(V�>��#L�6M}f�����8����������y����!@�����o��
I(�v����$VC"""""J���)�r�����`�J\��"Ge���$��u[�lQ�w$���wo��g���([6~�N�:a��E*���'M��:,����6�@����U�������������w��G���-nGDDDDD��,��T��������Oud�����;w�� �;|�������C=R�UR�IQ	���%-;x$�1q�D��Q#�
"'&I�&��'�L+X� V�^���W��*UJ;K8��N������h��<��`���~�R5����4��!"""""J~��a���P�~��W��G���Cj~�sS��y��_��DDDDDDv
���]��n����$C�h��1�^���^{
-[�D�����Om6Q��%K�_����S�N%�#��d���C��;wnm6���=��l���*u����3�j��Lj�,Y�$^�2"""""��L����m�=R����������q��A�.��{���#Mj��o��)�������4��Z�t�B��������M��sG�MDD���u�p��;�W�B��KL�v&�9$��#r���8��Q��j�{��#����|������2�?j���j%M/%�#$�����n��?���#G�>QJ'i��f���]7k���������5z��������|1|��G�y+a�x1��hgcE.[KX���hD������92,���b�E��#H��L�����S�\�Q;���!"�$���)"Z�fMU�'44��_G����������J�(�#G��CDDDDD�RDFFb���*=��)Sp��q�������;�����@���a2e��]EDD���z//���}�tp)ZB��e�|�+��V��m�`�����z=��
�b%��#����%<�s���Bm%%��1�6mB��Un�e������5j�J��&M�3��n"""""��&((H='}��g���OTM���K���(\�0�O��l����DDDOb����h������4�s�������K�wt:x�������o0[�V�,��4D�U��v�4/]�g���\""Jz�	���[��[7����*������;wn�"�\�r�����w�^��������(%2��0�(Z��6�����S���7����v����h3�����yx��kv�I��D����{�k����uNd�gOE�/#����g����K�������K"���U���el���(�ph�G���{W�j� ����U�6Y��>}z5GV�IJ���uLDDDDD��H�6	�H�k;	����#88X���W�^U�ODDD���Ms@bN�90��G��]��UjG��Z�>oB~��:�2~z7��P����][�R�0�>���f���LW.�sDD�t84�cX�B�L��yU�T�������j��%"""""J���M����\�RwD�,Y����g��T��v�R���R;����1�����#���
��Z~��+���:#j������������������&d�7�W�"b��{�F�~�*����`��b�C@��0�~M�#"����O���#�d�:�Y��:/�{������\"""""��H8}�v�����~[eC(X� 
*�&M���r�����-� ;���z�&2�������O�i�LA�*5�6^�z��F]��k�/Y���v#���0d������� ����f��{��Q""J*�������l|��m��?�%K�T�{:u������G�%"""""J�dA��M�P�n]�@����&MB�l��}�v�[j����������r����_]�� ��K������yp����'��4"""""��L�����Q�F���K����8w����#��s�����������^Jrg��#�����^�c�[�F��Y�1A����y3
����O-�����f�bO"""""�$�b�`�����93�U����c����y�&��m�F�!((H�MDDDDDd�@Q�b�
���P�BX�z5f�����VO�T����G�1"""""";z������^1I�6y�dT�T	���C��u�.]:u���
}����~�
6 $$D�	z������^���?~m��Q;x����2e�����

�F���������+W���[��""""""z�^�W����@m�QrN��\"""""";�>!������?~�6BDDDDDD�]<�����q��m4VPPV�Z��<n��\
��L&�k:W�\�=����}�.\��%J`��!��};�F#v�����[c�������KDDDDDd��@O�L�����#��~�!"""""�G��Y������7>|8n���&M�`��u�1c5j��;��g��^�z��t�U�R'O�����g�^��/^����W����T-88X�acO3.����]�|Y;k��a([���VAD�l,�a�����&J�9rP�3%5
���w��-��K�T�P�'mc�����u|�����(E�g�-Z���;��i.\���5k�����9�FR�5l�;w����#1v�X5V�R%���W��d�s��%K��ys���b��9���+&L���e���N�D�1z�������g��;"44T�\�v
�g����>}zm���9D����
����S�����"h�g��@DDI���xd��9s�|b��n2������(%�m�V��$5[��U��iS�j��
///m�s��3�����X�v-����^�za��-*��? ""B�����^d_��
��6m�`��q���?T�l���j�����=��G��/�'N��yB~�)S� c���������N�v�$���;6{�vDDDI��S�m��
W�^}j�92������(%��`�f�Ruy�I=')�$�Z����Q O�<h��������iv�s��={p��i�>���G�		�����X�b��!+bbb�7o^�N�Z�K����2MH�G��}��W���VcDD��x�L7�kG�/��>�GDDI��w�<,00w��e�""""""�d8�&��j�����;.	������iO�<�?~���(\��:�K�6-
,��K
<����R�����c�z>Y�fU�y����E�����V����Jt��qK�-hNDDI�K	�H�K)�)o�e���I�7�u��U����4QJ�!C��l��Q*� 5hdw�������}[�V+P��6K�-���s���<��g��Q���3gV�vR�H�D���?Q�N�����W�w��R�J�4n��m������<<<�|""""�����y@y���T���%K�V�Zj\��Kz��={�-�DDDDDD)�q������$���e��H�Es�`�3�e��?����4j��Y���Q���*�s$@&��D�b�0s�L���?~5.A�U5f��+W���Ws������:����i�������b��U�X��
�|�����{���#���������e�z1�WGc���o5�00�hm@��0�=������n�l�0nx���y��w���D�?����W���V���Tuf5�&�pd�R��S�M���/_	���Kx4x_��7��|���'��������C�O���T?!��X�������ABM�����6���	���~Bd\�W��}�`	>�������]��M�����y=H��2���'�~V�z �B���!����|�z �	�R#�{`���p*��v�b��{
�k����$Lry�(Rx�s�����')���g���i|}}1`������_����|�r4j�H�9p��T��o����?�k�y����6o���5%[\��
�����u��x�~�k�.|����-Q����o��QQQh����m���Y�d��-�,������N;J|��,������:08���+��s&��y@�kx���_���%9�l����J�j�W}G�	��iGI�|~���(�������aG��c��_R�Y?�_��z�a�}���g��iuZ����h�z��^gQ8{��������8}C�Mk����];�����w�^��g������^���O���8M�4��^�C=����;�����{?������7���[�����[�)��r���X�87z���G1����� a�y�W�yy\3����������9r$�������<�?-�#�$��m�T�����Am��A�4i0i�$�kJpg��ix�����Y3��_�G�V����zN�N�k��T��ed��c[�7�����-�
�w�#wc�z����z��'8��K�*�>���T�<������w���(���?�<��8 U��;J�{��^�����������d
����jG��<���X��2^�z��'(=�E��Wt��7m���\����gS}G��Ey:�k�������&���_��e��v��m�1��=�~@���
&y�,�L�<Y���qJ�����a�'=�����a��Q�87�?Hz�.)z��l��*80}�tx{{#$$
6Tuj��I��8�}�����
zd���9e����8v�s�<W���w���k��m�}���>w�[��1V�^�R�u��I=���Op�b���N��Q���i��{o"""r^��'&�r�������������cj��%"""""J�$�u��-U�S�i*����?����c�����@��d��Il��q�$�����9O�<�/^��������xg��U���K���'�4I�&+)��OXX._��2<H1.��{�V�|2z<�s�yo"""�g��@O��������w������e*o�e����Q�F
5������(%�����3Q�re�Y�F0����0a�
T�����="##�9g �y&��a���*A�y���:�y�<97��\_�\9��b��

Rcb����Z��������G!J�	I������+����r���z�ck!�c�X�Je,��v�&���=��DDDD�����v��u��UY
%9��^���^{M�V�]�6����""""""J����q��9���q��s��������=�h�'A�=z�K�Z�0d��sF�������o������rhh(�V���,�[G<���NMj�HPH�#��z���v���Z�jh�����0�u��;v���H����-Z�={���I�Hv��)��(�T�A�X�&)M����{������^%�z�!e����������3�jE���Y�T^��=��4��'��g�-[���7��l�Sg���([��m�S<��RWG�=����'M���>�He�x�s��e�p��MU�'�w�}������$�����@|"""""JJ^��s����dJ�K��#����jE�}�QJ%�c�������19��:3IY��Uz4��*m��](U��v�F��n��Y�J�.���<��B�0��y��y5OjI���
�q��m�R������9VR�I���4u�T�������(�yi���]����'��P��w��9s���!"""""J�$5Y�.]�c������U*7i�	AR��9���:3DDDDD�29<�����#W�\�^����z=�'9k�������""""""J������3��],��v��3g�9�CDDDDD��=R�r�������k��i�M�i�Vx��LDDDDD��I�1Y'i��������g�����s�CDDDDDsh�GPd�Y��
UA��%K�]<�������Q�^=��'44T�������(�ruu�[o���M��V�lY�k#""""�'rh�G�V��uKz<<<��XRl�q���t�BBB�Q"""""��I�ZK-Sy�z\�{�.L&�6���������Yu�)S&\�zUy�<���P#""""�����+x����!Cd�����L�2*�CDDDDDd��@O�t�0`�����X�~�6k������_T�Q�KDDDDD��F��t��	U�g���j��m�&MB��i����Y�G���(;�������hgl�]X��K:���7~��[���w
�7���g�y2�nm?TX�c�VcDDDD��C=�����w/|}}Q�V-.\Xu:w��V�U�T	<x0r����U�\��������(��L����G��5-[�|P�'n���K�MD��9�@_d�vd3��?�������y�z�}z��1����{Xta
F���������.o��;�0��\dpO�h�m���K(��f������j�M�?�1��<����@ODD�����'O��3g���=S�N�������\���]{�$��NQJa6����*U�@��i�D����:B�g t�%��K�7P.KI����-U+���e�����_��LE����B�<��l��R}0Jd(���������9t\?�Rg����Q/wex�zj3����^>�z�f���L���ir�\KDDDDD�H*����c�������^�x\�k�����1�����=|U��E3F�Z�r��a��i�G����l>������D��E��DDDD��C=DDDDDD�����1h� �Z�
��'bbli���9���A�!h�o_����L�W�7&����������W�L�%)�������;t�$���U��*-l�~�;����DDDD/=DDDDDD���(����q��
�k�nnnj���-w��*�5=A�9����Ww��X���?A�4����UKg���������v0��?8r�4~��n��y���lC���p6�2f����]��� """z��!"""""J"�d���9s>�����A�MD3�Y���@�
m��e���1Q}I,8�����lC���p3�.�]���7����Vj����]A�#�x��E�q+�[����;G��'�6������b����������)�m���W�>���KDOu�3�`:�D����������B�j4���D���1��pd���`������
M��Q���e����l����3�6JDDD�r1�CDDDDDDDDDDD���yA����Z���\�q��y��������?~u^�m��g�f�������W��dn�t�0b�DDDh3�������IM���+�&}���f{Z��'"""""�{i����0����0r�H�-$�����t�����O��V�Z���C�	,Y���7���/�����]�b��	h��	����Y��������W/T�PA�m��������{� 9?��� ������]{j��'"""""�sx������Y�&����v�\�~��W���~����(Q��9��v����W��)S��k?��3��M����s_�5*U��u���M�67n���l��	s��U���'��O?�C�X�h��;k�,:��O������DDDDD���f��+W��&}��,�zZ��'"""""�sx�G��I@�b��pqq��e�p��i�5
�w�F�4i0f����Ld5]dd$�����<��={���K�.����F���k��7���+�}��U�T0���?������m-Z�P��d.��C=��u+�u��v�H�b�������2+W��
j���~~~�U�A�7R?'{�����?~���(\��6b#;~
,�������=�l��=<��1���#�%DDDDDDDDDDDD$���*R(TR�I�����*M[�b��>}z5G �p��3��4k�Y�f�
���O>�?>�����3* �9sfm�F��'	�����0�q��*����������A�"�yDDDDDDDDDDDD���I?&A��"d����7Q�J������9�Te�@SRU�8�G�F���1m�4�^�g�����G�`�i�=�h������h�Fls%�����.(�g6��Q"""""""""""J�t���D�v�Tj6��#�x$�#��J�.�v�4n�X�����?�g ;p����v%-^��A�	�t���f��?����u��C���y��G�p��a��a������P�Bh���_�r�#�z�v�'�`����������^����)S
�������1�y
Q����l��^��Y���D`�U�B�5�;6Z���k�P+s��y}8���/!��B�r�������������wj��g�<�����'���#����O�����R��X\a��s^�: �	5�^�����fM�a�:�O���i= ��w�y\;z1�����v��z/N^�� 9�����W���{Q�z �B���!����|�z �	u����;:
��kG/&�W/����W�������wG�2e�z/OD/�%� L��iG�O��M���������7�z��c���A�vL�n	�����v��8��JV�lYu��m����USu�������[�t)�m����<)�#;���������4pOr��)���kG�e����}-�?�^���Ld��'�]OX�+:G.����v�,��^���p�c��_������T��h��.*�����W�5�k[���9����-����|$�_��+WY�}��!g����g�g"���������tH�bR���Ug%��z�P��_F�H�O��/x����	qu�D��c�������|�u=���Uy�����z�;�����8y=��!_���P�}A�?y=����:�v��~�6W�nkG/&w�,�2���������q���2������"""����@��Z=���G�9T
2IM&cK�,QA�g������_�S����%IM��iS��g�������b�����m������d��8����������=n�Or4zu4VJx��
����=�g��X����n�l�0nHx�A}�N��������_�_�b�[]�~>��gVch�kR5,��>��T_>��u�P�}��G��U�|c����~B�C�<����'c����8��"v�����y=H��z���3���j��2"$�����D�$)M*
�H�RH���[i~)*��K�
�9��<	E*)�Q)����s���=����;p������9w������k=���;`��l�������s~�����'gJ
��!V�p�y���C?@P���&w��k������h��q�����K�����o�q_��_��A��qO��9�$]�|�?��|PX%Cs
���������u�]gN_�oZ�B��(!�z�B!
�B]���1�I�&n����Z��v�����g��I6�����i��-[���]k���!�bQ5~�"��U�����m�j���v�a�����nN�\��'��#�B!�%����k�8���y���6G�)��3�t����(�B!���b�a��|�r��/���X�f�����E<�j����x�	���?���&]�5{HW�5����l��7�x���9�&k>*�s0�<��S������c�B!���W^y���X��22��>�s���_�I!�BQ�(tC��C=���Q���U+���aC3d�{����d#��4m����C�c�=����[���nr|��7^������Np#G�tW]u�k���y�]x��vpN�N���#�����	]��}]����|!�B!D��tm�<���)&O��Z�li��P�|y�S\z��6� ��B!�Bx
���a�w��7�/����7n\�m����j���Y���	X���]�^�\���]�r�l��$����.]����������^:�=��y�y8���f8�={�����y��z��n���v}!�B!D�c���n������.�6G��-[��.\������T!�B!
��C����������m����;/�v�������eN<�D7k�,K���g��F��s�=�����u����#Q,sz��aN���_�~ZtU!�B�bL������Z��`�p�B!�Bx
u��i�&��!�Y��C!�B!D&D���'�����zX����^�c�E�!�B!J.�j�!��!����}�NB!�B������]}����a�����N��������S]�v��G}�.��r;V!�B!<�j�aB�1<��y��~��p�B!�B�('�t�{��g���7������x�b��uk[���wg�y��B!�BO�zXg��k�u?���k���+_���p����sO��/��g	!�B!D���Q�6m���K�;�����g����nkwv����B!�B�([e�]w�����	�:u��2e��G!�B!D�d���n��%�I�&����sg�q�wV�X!�B!��)TCO��5�|�.\���1+�B!�%<��r�eCX�v������v�q�]w��a!�B!r�U"z<�V��ml|B!�B�\������uxX��U��^~�e��kWw�}��!C�X�B!�Bx���g��������IJ�Z�l��A�>����(!�B!�(����G�+���]���\�rVN��}���=��C�S�Nn��1�^�B!�Bx
��3k�,��Q#�������[�#F�a���V�Z����O�c�B!�������_�����&O,e���u{8�c�B!��S��������0a��������+�K/�de0r�H;V!�B!J"D�������>Kr�`�;�G�!�B!��g���n���f�!u[,���<�+�B!�%��v��5k��R�����9��L�b�8�c�B!��S�������?�����W/,�	�8�c�B!��$B�6���y��]��-�������ic[������k�8&^j7!�B!D��P
=�o���Y���h����2�q�
!�B!DIe�=������{�����=��s������{����c�B!�"J�z�U��N?�t�����{�m��1���3e���B!�B��L�5��A����+�1��>���B!�B�X
���\s��������P���S��m|��}#�B!�B!�B!R��
=;���{����=���j���-Zd�)c�!�B!DI���O?������]v�eq�o���Z�*<C!�B!���*U�d�����Y��L��B!����������:��{������o�m���n����B!�BQ�������_m�����_~�u��!�B!DI�ux����k/7k�,�i��,'�����?��v�-<K!�B!
�����a���y��I�����B!�B����5k���o������J�*�B!�B��)PCO�
��^h���]�v�u��!�B!DI�\�rn�vpU�V
K�B!�"9
��������������������B!��$��N;�-Z�^xAk�!�B!R�@
=�������so��fX��}��n���a�B!�B�,X��{�����~s�s�9r�?~|�m��I2	!�B!�Q����7��&�����{���/^l!�B!�(��$w�I'�O?����=�u������9�n���U�V�g	!�B!D!z��_�.��[<�V�Zf�i������.]��y�����R�6!�B!D���������q�r�8Fs'!�B!D�7����m������
��];W�|y�5��k��[��}��#\�
�+!�B!D���������;��\7���I!�B�PR����C�����u�Q�O�>��G���u�]n��w�B!�B�?�����1��B!�BO���S�fM���f���~��m�������o7y�d�h�"�[!�B!J:K�,�J�o�\��;��s��5k�3�B!���
=�d��SNq���wk���2<����jW�Nw�u���>B!�BQR	���������w�}]��m]������/w�YgY�l����C�B!�Bx
���'+����;��3���oo���Us/�����s�}��!C�X�B!�B�DV�Z�>��#w����/����5����_��{�����n���OW�L��,!D"��+�OB!���B5����W\����z�B&&x���O�N���1c�����B!�%�[�����q��6o*[��;��#��_m������.��"7r�H;V����v�����v��OB!���B5������o9�ca���I;F�!�B!DI�R�J�'���sO�p�BK}
���s_}�������o!��R;�JU�'���)U�y�I!���S��<�v�a��g��%9Y�`���}�B!���Q�J�����9s�X
l�e�]�����O?�d������m��M���N�9W�J�W�Qj����>7�	!�B
����N;�f��Y���_=k���2e����B!�B���<g�}�6l����k���k-�5�to����m�{��]������"�N8�������/��G&f����f�?������n�9��	�~��g��/_�]}��f0��q�����Y�f��~���p�f��:�(�|���D$�j���6���9t�+]������+S����B!J�j�A`fm��w���l�������M�6���]�{����c8V!�B!J*�������Y�,rg���rW]u�{���\�-���gO���N�v�7�|������]�f�.��BW�B�����t�g����A��������������2y����\��W���~�i��[7s.l��u��w�:w��z��e�FZ��;f���E����z��x��rL,L�Vq�j��J��R [�j��B!�(9����B ��������l������{w��1B!�BQ��q���1c�������f��aQ=3g�4�E�A���+������f������V��"o���^���?�7�x�����{�=3��q��K�.u7�t��&O��.��"7d�7j�(��;����G�q@������u���"�������������~����1���O�2!�B!�*�n��5j�����+M`f�S���}B!�B!2!]��x��D�\{�����O�LD�����fPI���[�5���<D;�m��}��i�������]~��f4�`�9��#�+��b�������Z�jn��uYi�0�<�������w�EP	!�B���V1�l��7��G!�B!J2d> re���q�I�&eE��_0���;U0������a���^-
�"�H�s��u+Vtu����=Dp���C(W��������5k�o�Y�g��v��)N����sM�4��B!�Be
�����g���]vY����N2}��%�B!�BQ�`}R��r�)��������k���I���"]����c
�5��<������lc
,X�����������.����#��F�3&�����������5h������^x����g��	!�BQ(�!xj(
`��h"J�.�Z�l��y��\s3�������Wg�>�K���V
?9���n������F���j=�����2'���
���}�r������s~�{����}[��/���3��w�hP�]sjy�L��������p�9�y��#��������L�i�T�#���3q/|;�>��O��?�/�����K+�v��m��������`����on^�y�'�\�zf�W���i��c�?�������_6�+��;���h��q�����K�����o�q_��.�+oTm������/��Gq�
�c�m[Aj�3�8�}��w���	'�`&��)S����N�:@��i���>��CW�NKAGj:�<�g��u{�
�e���tk�Z�r/���;��3��L>��Sw����[n���p�
��K.q�����:u�E�D0`�������������(�Y�l�;���,U����j����W�5�}%��
!�B�%�L��j����?�Yg�e!�&Lp����	�,�y��7��z�=��&`|���YBH��_d���=��=�C�������H>�2����6��6L�����W^iF��4D�`�bN���!������O��'��_<
����?���{�����v�2d��]�����];3PE����.\�%�A�T�*U�x����Qb�c�o�p|�������zK8��c�B!������j�������������x�|��.����Y�
:�B��)r��=���'���'���z���C���������|����/t�{�K����{��%��[2����Y3w�W�A%�z��A��3����>��}�����K�����)F�����wb�1b�;��C-u�I���sW="1qh+h<�0���o���l����#Z'���[��R�q-!�B��LZz���^w�X�}��g��S�L����=z�h[p�|�B�9�C����������?d���=�����!CO�lkC`�;v�{����=���l��������#r�;�<����'�|��6m�����#��5����F ������r���^|��fX�g�L�<�u��9+�D�.]lN��"�NT���e�B!�(*$v�)������o�g�h�x��+�o�3���!�B!�(�����s�1n�=�tm��1�S�v��7�|�(��;X$
�����	Q8��B����k]�z������U���|6l��f���z��n�����9�K���W���<������D���QE�[�������W�F�,���"�`����n��C�����$;����?����
oo�6N9���g�M=,�������5�
!�Bl
��S�jU��Q#7r�H����[����	����lb��E.�B!�"�y�����������s������96�!�?]�[���]��{��'��?��:[�e�����������C�B�g��=�f��1f�k�����'�����g[����K�OlT����9s��F
0��o��������e���FL��j���\���������m?�*��6]�\��M�����������i�?�5�kf��s/vn��v�B!Dq�P%TdB���!�4B���4i���ooB��q�\�-lqN!�B!�(��Fi���1c�s�2~�X�(�XQd�����j��J�6�fz�!w��������n�4i@
�N8��,8s�������y��w�i� ����o��"��tj���u���������������;v�����Z���w��M��a,"�H�&�i��T����F���RW��������%�U��7�;�Z:��^n��w���\�\y��B!J�����A7o�<����"w��Dc���:t��n��6��B!��$B�)�1L��,Q�I:����oH���W/3���#
��-�:� [���;\�H���~�u�Q������5k�������N�:Y����x�������I1�Yg�eQG����O<�D[Hs��#X:��
k\�]��Mw����^qn�.��c�6�u���re������R]W�JCWj�V�	B!����s��Y�v��&+����-2�z�j[t3��-�B!�%���+[����������$�f���L�3eQ��_�������W������T�;��sm�X�[�n�{02%���/�5|��c��$�2e�X*7����q�9,m$�)�6�����V9�������#]�:W;W:�as�oq����Z���mxo'�i�$�����e,{��a��N%����,��B!Dqg�z�N#��_<���>r�w�k���}B!�B��F"P{����M�(n�����=~�+�|�+U��~�n��6N?*��T�q�I����,�w��j���,pe��H�R;k��������r��\��3���L(�BQ�)tC���'|��/�pg�}��������ny�	�B!�B����U�l�D���n����S'���)��HwJ�z�+�l�}�5�����+s��n�w�gt�'zg�����O�v�*�w���1���k�2�<�Jm���o�����\���aB!���B5�*�}�����npU�Tq����t�����O��Gy$+�G!�B!Jk��uc��q�-���-[f�c��Z1!�D��9�3��>��L�N��~�s���]�;W���E)��-�l�?]���t�*�
!�B_
���!g�����+�t��w�M^���b��7�<���s��g.����B!�"X����Z�&��1+�B!��B5��_�����Yi�b����6CO��U�l�]v�h�M�6��%���>h�XH�Z�j��{�5#�B!��x���^x�{��G�!�K�.5�[�������N�cv�i'���_�{r�58�R�J��O7��s�%�Xy�V�Lw�a����{N�p���=z�3�/K����S�����of������������%#�g��Yu����~n���%J�����3�����f������N?�to�A�Qw���{	�����s�=��stc}�3�8���7��M�xz�o��������Y�z�e�X��[�vm;�k��=�z��Y�v��G'\|�����eY�T~��f�����x'x7�Q��x�Gu�]��������;��[�m"��9Y�y��F�����	@�6m�����5�T]z�z��~{{I��Et��%K\�-\��eM��8�cK:<�����]u�U6 =�����3�t}��q�z���i	!�B!���+W�)S���@���;������S����K[L��b�
�����e�s�F"P��&p��]��f��������i��]q��W?���{��-s�|`�&s�����_��	k:�fY"�+E�����2}��([S����7�7B)����'���:u��������C�Qw��Q�����c�3g-��������k��Cu&L�L�0u��gO�{�=�]|����%��7:��u����{����X�F?��{�l�2��c�=����[�o���\*T�`����"2�c��A���������NQd������I�wcKl�z�o�?}:Kv���9s�k���ev�P��)��������3��^G��T�D:�s2���O�:&p��1��;��g�Z���/���g�)TCQ;�@<����<d�:X�����|����%�>%�/�����?�1k&��E]��|�Iw��w��#GZ�;!�B!D�%8)����;{D��f����.��R������.�(_���y��Mq��+(������n��"����0�������!C��EA2m�4[[������Q
'�_tC(�����t3(2i+��0D�#�����
�%�b����9Jnl�<�L�����D�T_���s|�)��3GOE�	Js��K�.������O�c�=f��^m���k���<y�{����#�5j��%Q\��?��g�������r�}����]w�e�4�:t����<�J?���{��7\���M_��{��3DQ\���}8��S��1v�X��LDQ�g��:�pC|�e��s~��WMYO?��*u<b�3*D�Q���0y�m�X����{��uL�z�!kg�-F^��#`���$Q���i\����!\����p�����r?���{�����_o��t���;w����+ge<<�h�����	!�B!��E���[���.��;J��m��I%�;Q�/uP��|���|A@;N����j����QP����3P�����>��B17%�H��'�x�R��xm���)�P�����>f���nE�������$�>tN�w����������e��m��������D�B���gH�FY"0H��

64�:���=7�3u�=G�^p�I'���O�H�.~i��;�:C��#�8�����\Dm���x�>����~X�x�H������I���n0v`dA6`�s�� R2E��1�p\�v���z<�@���O�F=��}m�������T�D:�s2���O�:&��?u��I�l�����U+���g���%�B5����U�V�Ky��W��%>|�Y!yIK:������U�����ai&X��5��h�H�
��/��5�BQt�| �
�g��/[��aB�u����VB�d���C��zH��%ots�{I��+(�9�3��
J ��@I:g���T�~���x�8����N�����(�x
k���c�L��������L�>Kq�1�w2������3�H*��j����[�G����5U�7on���k"0�����(�+|�	:2�y�[�4
����(D=sY�����M���=�O�w��06E�i�H5�o�`Bz�h��/Gw�q�
���G�G���j"���P������!r&
������[#]�1
�9�HgRi��3����]�i�|9k����nk��{O����������kh������������z^���V��D��������1a��w7]9��b��%Z��8S��/a�2��F8`��$����V�N����K��B���&�B����+�?������pA��#��q�r�8Fi�E:����2|�?�+kp`h�-�z��_x�S�y���k�*�������R�I�D4�FA����tx��V	o}��G����hC���WP��.���o=��#MA�3�-��h8���F8-�1!/0.��������:J�=z��e1��w�����tc(���q���}/���I�������w��$rc	��8����.�#�A�9�p�.l0���z48Xd����D�z�����?�����j���|c�Xx��3��0�6�l=���~x���O?�d�H-G���*�(�-��{���xJ
<�)���5l��D�ac�&M )�b����>c+�Y'�s��1�I�h�� ���O�/��$�U=T
�KoS���x�g?D=���!!�(Z��{������B��%8�L�s�8�c�(��uh���E
^�x�F�8QP$b(��x���ai���t��yVPB�*U��@�`�J8tx��U�:��B(���"M�{h7x��/��(��Z��;D������ �Ep��G�)���R���6mj�������
<��������>����_�C�
v"4�`��~c�%=m���h{��I1�~��?
}Q���@*@�����f
��������^W��Ki0�R=��Q�~�(��y�����E�(@�F<��	O2�L���CT������y��v_>+UQ��_��=FK�kb�"6��f�P�P������=�H��G~�,I�@��zJDq��@������t��7�)
jL�
a�"���'�a%�R 9�Z���%9��t0T<!Z%������F��8	{O�9�o��:�td���X���7
?eU��y������
&�c����KyW�C�p�<��r|�&�#})�v��RnH���C�n�?�]���V�[/�������W?g*mJ]�9�h~�M�<�P~�3]�����?���m\��}��B)w�v�o��dP�������8P���n�
��;kg
t���\��v@{�/W�	����}BQmP���$��R���ja��7E�^G�e�@�g�����(��
�,����l|�5U�S1�:��C����Y��9/���(BQC����^�(�P^���3�������������7�m����N;������F
i"�(�D�����t�����*��Dyp��������tB��XP�����1^J�t���1�����
P��~�E�y�~��}�����c�=��n����G��{��b,j���������$�FA_Ez���=��#�=��| ��������������?o��#�=y���8��o��C�������~�sBq�����{��&�R�0>�</lP���H��!���'������((���>�w��f,�ODF�����9���s��a~����d���3R�g�>D�`$#�F|����J�T�{��c�`�mP�8��!�r��X��1����o#|m��o�'������?g��E�7���	Q������ �i��;�j�!��������+�PF'o_I!7C��GxX���
,���W�y�)�u����}���%>��9'�){gu�+����_Y�O����W�V����ku�������A����A����\V����V�������]+%����K�tK��T���y��b~h�,o^:E���!n�K����Z�W����9�P;�����[\�����S�-u��\�\7�?�9�_�/_f��e���P�H>��.�C���x@���k�u����z�
Q�@a�"(�����G����l(�P�a@`.��,��{�C�\X?��(E�@��Ao��aaIN�<GA��m�z:����>Q�r��&�����Q�^2��?���|W\q�)��>��=�D�>
\�k��5�g�?
�>}���5��b����,����J2������\(�1����2�/� ���5�\c)�'Q���K�b:^���}�{���n~~�w�{�U�
^����<����!�9Y�{�8q�����4i���H��g�(�������=���q��O4��,��R}�sk�VY��}��������������Y�&���'��v���Q2
��ho�����Q)�c��(3����k�5�gZ����X�xqP�N� cR��DdtNA��a���e���A�&M���+�x��R!�B!DA�1�
?m;F��^�1)f���[�.X�v�}��}�G����B;-U������m��x����G�X���g��|7:����k�}�]��K/{���}����+Vf��aC�r�Ea���{��l���|���@}PG��5�Q�l�8b�wl==���A����)S�X�n��f����_�~��=�}lY,C��c�vqc��UA�F���>8x��gr<�>}����<W�9�x�x���mk�L���������������r�I-Y�$�[�n��:Uz����;����?����'�#c��\����>}zP�B����L�0!n�z������W�^��l
���g��������}���j������k��R��'O��!^���s��z�Xb�D^���7�J�.m��8������
�l{�����?=���}'N��<��-���g��g���oc�;r�rkO��1���/���]|��v�%�B]�����m�<�"1X6������XP���H���xu!�B!DzC6<s�L���F<��l�3e�#�!vb!�~�A G?�����2�}�Z� #saR����\��c�po�0�&��`�W��C����C?�����"	��d�>�h�����h�:u��K�D����z��y�G������Wx��>s"�v�uW+��Mz$�\H��z<{����]J�n�G}�c� ����x����~�}���=���B������^��~���'
D�h���5kZ�O��\�vM��Z!D�6m�4+!����k_5h��Rr�����^j�:�U�(rr[�3���!r$�z�|t2���!��P��H���+�6�j=�����6Hs�3D�����G�B��\��='�m�|IT���I��_s��Q��6��R�e�:&��z��em��w�����B�zH���e�w��X"'�<��#��P��b�����$
KB!�B�7�� Mk\��'N�8�c�(�,X�����0��0C��|(��
H����4��	���r������D��ak�?P�TDQ����C5;��G���#�n6R��uM�(Q��~Gq4����tF��y�V)���C*����Du�<o���^m)%"���9v�}Rt��
]��@�q,���{%�F!/���)���:s]V`��E/��aC+����` a} ���1�����P��G��;F,hOj���g�3I�>���'�)�����u_�V�j�2�����Z��C�nH����m���O�e�^ �6�J=S����H�7R��t�I�������R��{[<Y<�������P������x�ygI������z���B*c�����A|��g��P
��t�AA�n�����[�W��t�� ��
�(����woal��E������u���B-�B!���N���(cr4(,�	�8�c�(���Y�sI3����zh��9Y�cb�7����O��!Ol�'��0�>���m��7���t<�%4�.�7����J��x���M�������/MuO:�h=�u�YA�r�l_��-��7|�,���~���T���bSz�O��q�:�����O5j���_��w����0r
�=)���<��S���{%�T�*U�=M�6-<2�X��k���v������Bm���v>�9x�`��{M�7o^�����w�q�q���|�5p�@+����[��/������b��X|�D�m�(�3���v��F�6�>S�?����rt��s"]h*m"�z_���>��8R�m��$��}4������w����9�������U�u��H���g��3�ru�����] 7�3&��;��k��e�6m�d���Fz��D�z|�r�8&*��dxy�v�yg{6�,��zk��
)�B!Dqc[zX��ux�;���y���1+DQ�v�2
����~�����+�bu~-�XcB"COT��7�M�y����������B.7P����J�xJ=���W���������<��C�'�|���O�"hnx�7��3�r��u=����o��U3��W_}e�&�s�=����k����/Z�(<b3��/.���,c-��c��}�1�4l����x��/��"���������w4n����x�5F�����c (|�mi�D��O�z����[oew����oeQ��&�}�����U+2dH�w9�6��z��1CJ��qw�}��k@��������M7�dkK�����-P��>��=��W����1�w��������*U
�t����%?c�_o)�-�:M��R�������p���s��{7�x���	!�B!����G�u&�%Ww�9�X���o�����(���[,�<k��j����B!����W^1y�<�KA�B�������S�n����H�z�B!�"(
��f��
�Ee7m��fR�ti7x�`��{wW�T��T!�B����S2)��Ma�-���B!�%�?���`��������_m��+���6>S�>y�B!�����	��i��UW]er��I'�d�	�,Y�!�B!��������;��w�}����k��I���?��v�i'w����z�6>S&�B!��(��mO?��k��}�WNHA��eK��3�h�!�B!�6ak�n���_\���]��}���_����>��<���(!�B!��2������'�x����>n��Y���wM�6��k�
r�k�v��s��<�&���`�J������F�W"8��p�%�\�:[��R�JY��n��Ww]�vu?��Sxt�p�x�����yV�^m�.+V�h�i�������G���o�q�j���;<���x�;�5<��0���9t�A�Z�jn���V��'�.Q����A|JZ;�K�.���^���f���'�p��g��_~��	�����JT�e��1����{.G*���?�;��S��s��G��>�(���*��}w�QGe}����n���J�""�s��v=�=��C��o���)Q�6S��A�$3�(���s�\��T�m'�7�|3,������n;;��=��y�L���`�]vq��{�������M�>}�X�_w�u�.:4G��v��7�U�V�W�p����6/cB^�b"����D������>|���X�y��
��k���7n2� �&;�;��3�
}U��5m���	Pn�|o���r�'�|=>/�����h��H�C'L���<���5k�������/
P�\p����S�e��"/��������^��1D����/����u�]aI���38����� X�n]p�����w6m�!���Q�FA��T�P!�2eJ�';/��2#�m����-[����/_�����CX3f�2&�^{�t��5k�����Z�j0m������1"�5���M��l��A��u�E����������[�j�=:���GP�ti;������+8��3r�O�PdI��g���>�?�����������aI���v�
6~����4��K�|pP�F�`���ai�P;P;H������m� C��lf��5A��M���e����p.����s����=[��\�rv'��(3g��vU�J� c�hu�������K�Q��?��c��m���),���o_�f����X�/Q;�����d�w'3�^����M���4�r"����u����F�{�����Z�ha��o����;�<�H�i�1q�D�|�&�Q��A!��f��6N��K�.�{��m�Ke���.�W�^v�;�|����k����r��
7��\����}s�kx���^�e��������D����K���3��>�	s	���n���+�O;H�����e�z���I�&9�slW]uU�����qy����k��Qa�f�_�Q�%U?�`��;O�4),I?���%��mw���a�H�����`����3fLX"����b�;vlX�Rc�}�	�,Y����G�X���������[M0Od��BB�����=�A��"`T`�'�y�>R�G������[�n9��C��}0 ��b�w0��$�E��w�(g�W���7/,�On��O����t�MV���JT/�so9���$�W�3�F��9s��{7�����;���8�w�}g�����s���b�<��/Z�nm�e���ai|�=s��at����6�d��������?�`e�D����3e�����86���5QX��H'��R!���0(,Cc[��5:<P��~/��+TP^�r�)&c{E����Q&�E�ma��
6�{:{���V�Z��O>im,����#�����c|��W��?�}U<�������������� �3�����F����3������b�}&�A<[�k��5��'�y�^n���zF���n������g����,V�@�������:�����K���`���K����1���F���PS�m����Kz"����o�V�XaN��������������e�.�2��/t�{���?����I_�!�%�!\�����+'�U�d�vN�`����+��T�8q��l'�F�&M���t�E��E]d��9����G�2&�
 
)I]Hj��4,����/�p�����y������{%5u�����|��!���������k��������d�^�[��2C��g��
u�1�t��}X���������5,I���A�,���#,�X"�H��1yp�����R���cw�1��}eL>�,c"i���Z���;�h�2�^b��9)�)����w����I
��?�<,M���%/�K:P�|y��m[k'�g�K7C}.X�����aI&�<Z�x��O{��WX����j��d��>�,,E
�1gB&��@�AJ�q,���`�#=c��W_m}M^�b��LL�F�x,Z������oXR���z�����~���&����e_�r���K����
*��}&G��^{��\�2,��z���������[X�R��':������g���s����+���z����S�
8�d��m��^p;v��Mw��-k�����s~�aX*�DQl��
�?�|X"�HD�z�V��5j�F���d`��e��[o��v�a�'4w0�Q���EQ����/(&P��{>V0��
�1H���>��A�&MJ������;���@�^/��`BX��cA�2L��@�������z���f����������[�J���n����;�����G���dy��wM����~������M��D�g��<
u��
eu�*<w���_mJ�D��Q�}��v�L$<���?��ml�J�z����Qx�����J�b���k�=�`�]�������vKz/���}�wok���%��e����^}�U���oe��D�F�������*V������h7~����k���G������w�y',�����n���#����n���O>�l�qGU��Y'^�QT`�x��Gl|�od�<_����A�Q�>��;�0cw<P<2�����W^y�k����/�O��Ysh��a�4J���7��X�;� ��������� �=��S�T��Yn
����9b���Y>�sa����7����B[`}I���2T��u����_�	��?��k��������x�
3�pl��&Y3��%�b/�������t�>�l����$j���O���5���9���}`|��a��c��"1�j��E�k�+������)��i���	����s-Z��&8���	*B!���w��G���	~<8����2E��(^�q����%���7�#���H���3���^k���6��l���_�A@|/(�,����)���������@���D�z���
�r�	��=��y�jj���E@��Q����s��<)����A�8�*��$�x��O^@���R��� A��m�N�l�>PD���(>RiS|�P&/��.]��E�B�6m�+��-���g����]�-Q;P;H�T�����Y�u�m�Y�P�������;��G�$cJ�Rn�K��z�'Ov��w�si�x�!F[J&�8<���:<����7���6B�J���?>,E�����}�(*`�d�n���=��]"������e�]����w2' �������|��l��/�'���ns���%3�2�4�30�P�Q� �Q��?�;_�o����Y2G��n���3
�d�-�������m�fn��3�qo��J*�8�~���l�(
���_lrr:r�<��B�������L�y�V���Q��@N�G4��?l�_dy"���\��3���}F�:�Gd���oBn�'����Ry����Z���{��z�1
CFvt�Qcc��O>���!Db
��t���X�y�I�G%/+���tQ,�-��N����{��"��6^*�>������������7"����}��'�w�����0X���'P3�{����	�:J�D�p�Q�F�{�������g�	&�Gn�(��x�Z�~,~(��^����A���P��X�L(2�D����A�(�i�_D@y� ��F�+L�!Y��O&����L��x�`B!�2�6��3�?O�m
���������������$iQv��
��{o��m����A��e|�#%Qc(rP���[�n�M0�����1s�F�@Q�a���\��a`�c�s�,�5L��d���j�wDxG��f_2����3���1Lmp� �#&�D�	����hw���=��]���)bK�
��(�����Fi�����;N���r����a��F��0al�����K/��J���/�*���9y����
�d��==K������1���Kp���"*;A~��������>3��(��[R!���a��=(�INZ>.���Q�SD@3?�-����1��8��8G#R*s��3���|���N�����|�M;��GC��Y�{aC���'����9n�g��D� �g�l�A��X���2x������}��(�v���B�����I3e:�v��eu(@���^e�.��t�t�X���Y~�\Q�0
��,a2�~��Hu���B�0
��y���A������0R1�>����LBZ�li\n0�2�G��c
��A����A�3g�� �����
�H�F@P����P;P;H�m�	�i���f�o�G;m(7aC�E�'�
`�O4���A��R�	)���z�l~B���{�k���V�T�X�v�<���TaB�W*
�(�I��C��F�@� �2���!b)*s������=�0�p�?c��W6�B��)S�������{�6��(D�a��*�|Tk�������������$+��"!�QF����x�et�=�)D��
�'�x�!�S�$;v����C�:J}�u"P�a��/#���!K�w���'��D���xr1��s�>��C 
�q����z������^�]���yb��q6`r��Q��f����0b�C���Q�S��A�Y��(����JB�w����Yy��Yx��p��	�=��!ku������@TGTVa���e$�IDAT��G�s/��y������s�"wrk�>�d��M�q�i��DA����F<�����U�������I�>+Y`����A�oxU�����h�d&�DM �y�^*��D ��i]+!7�HH8�A>|*" n�P�c�h����u�� �������;
Ob&>Q�%>&L�((�H�o�������<s�(|o�G\^Q;P;H���CL};���
�'8DF�q��";���*�S���"Z$pd8��smB��s�Y=���NH�����z��eJg� �r����L����c8�mk<<Sy��+�tQ@�@� �2�����'
m��?�!���Q��B��zH�������Y���n;�~��ox3R��S�J$&�*y/0����o�A
G;�1m��(����1��m��xQ|B6xo#�#3��W��pr`�&�eT�D�bh�~'c�D�����\�C<�cB<�!�Oz �	8
�������������\|��&��z	��C��C�^���K�'�QE2��w�@1M���z�m0�`��O%��$��0�!� EIT�,�)1� ����"�q��G����M[��R�����6��v�
F"1��;�g�L��Z�e����C����c��!S����d_ZQ<@�����p���P �%��k"�B��be

�d��w"�V���#%^bxS���N&*(U�ce������3	!�Kr{e�)|�-"7<(����@��w0p��%������7�%G�9���$��5<c�	�q�;��|dW,x����	�����9��/�!(�i��B]�EH�EQ��#m���7�E~i#Q�yKm�4(���D��BjB���E�c���Bi]�~[�v�v�,1������A����X��i�H=�0�c�����&���
�&uK{a��RT+ciRP��xca\��HPh��Q��m��g����m��Z���EZU��W8*���1������"���r?v�@��!���  #�0�B(���1V���.$S�fXs��z�;w�;��m�"��y�<N����}]����^���#���'}=���������|���}��g�%2AQ�?�4�	�t#�`��Y����	:I9G�?8SE����)TC<^���lb� �1��Sh��e�_co��n�/A�Gq�HX�^�(��O�*?��<��@���N2��|/��������x��t�����L��UD1���@J"��k����]t�A�7��D���3"Yx�������h�	�?u�����	j~�9����D!�s��0�J"�
��0�Q_L"����~k�LJr��`L ��"�U�d�{�-��X�.
u�E,) �6E{��8��-�B�E!M!�wQ�xJr<&��Zq�v�v�
y_��|x6�3�������8eD�Y��Y(&���3��1�%K��P��t�;r�j��%�zOxO?��cq�U!�}(�CD��#����'b�b�����+����%�E?:�X����s���0�.��#3�`��`A:��@2�����Yl)���>��C��1���g6�o�b��#!� ��6p�`����1
�;�q�=z���
f�&���0"�0�!�4|��Q�r$��;���)/yq>���H���H��� ���<�i�4��I�$Q}����i3��y��������k�z����WQ���8t�r�xYQ��nx��s�x@�6$R���`-��	��x@?��[Tl�B"��L��������0����@Y��E*J<W�P"U���XE�u�c�U����5�d�;���,�\� ���
2�Gw�j�G 3�6`��<?�qjj�@�<����H!�3BI��b��)��	m*?�����	�����a!�I�(��i��3&�DeyOH&�(��G�;_�D���G2m
P�n0F��Sg(zi#<�u�)-��m��P;P;H���/�<�h��R	��s4:#Xt��%�L�u<�qy�O<�D���&L0D�G��o�`�of�-��{d�r��N?�E�8��n�?h;("�+��"�A�m�np�u(�������L?M���e�d������8M����s�~���OK��0,�qPE����9�"A�;��3�<�)���?���iDh�o���(����3r	}�c0�?��������M
7�y����>�|�x���;�x�i%
�1����(�z�)�����Bd^"��87�R�;8k�����X���w��f*p/8/1�p��;�w	�erk�>�d�:��x27��|lf�N�#�/��������7�pC��k�\7��X��d�A� dt�A����d���H�A�d5����_~�����xD|���A��o����K� c���S'���CX3f�*V�d����dv��<���3�L��}��\;k��	Z�hd�A��=���~���b��oKD��W�!�=s-���O��J�*9~�������l������K�2s+��n�������s���v�v�,C����-$�{�-U�Z5�3g�=��M��s��y�+��!����4��[�<+�������V�5kf���t��������R�����#F�N8����^#c�h��_��w�wX�����A���Z�Z�ti��A��c�.���[����n.Z���|;��N�6���jj�������o6��gI[�yE��oW������]�U�V9�2^����9R��+�rN��$�k��S���._�|0e���ts���0w�\��-�i�&�=G��'��"1�<�H�i�A�n����/m�Z�j��f�����>i�����|`}LTV�%��+���9��O>i�2����a���>����f]���������9�{�����5��3^�6����������3a�B=��K�g%�\|7�~���'*������v����}o�����;�����k��������?6>��O�<����K�Yx���w�u��D�_~yP�B��h�{9����'ky9:�^�W����;v��s����~
KE"rk�<�d����pnl?��uk��DI�o!�S��Q����'���
%�W�y� *L2�0��*6�
�^���
���{�y����?�K������.��1�����l��!<">�~����{�	j��i�d0l��m�{�'��}�97�t���������S�N
K�G�@� �P�"�c��
�|�/�{����OF&
<��o�'���^��3n��I����n���|���q��u&�>�l�k��Q�����Y���K���+�6��/��:u�v,����b&��G@�B��|���B�@� �:�P��7|��,#v��mW�F%�e2dH�	g���vp�����9�R�J	�7��N���g�X�����&L�`��E�W��`����=E���N��n���f�������~��&7�*�>���Q��z�-sb�}�)����9�5<���W�G� b�c(�{��wg���F����x������������'�yG�?����O��K=/X� �m���X��<��7�a�������O&�����{A�������9�c��A�������������?o�:rx9����'kq]�{o�E���������-������#�Ln� �g�L�����Zy/9���Wb��:��S��c�(������P ��P���"+,6r��|����5)�B!�((`�eL@��g����4"�	d-��S���v�-�#J
���������>�$�c�F�,�b�R�,�"�I�6�[�C!�[�\�J
!��0w�\��iSK=��m��4=@�����m]���������\`i�I-�L�� ��/H�=
<��oB$�P��!o+��F�����I����-�B!�B�DX�G���?>�:�j�2����zSB!D~a�"��b=�D:�m	kg���G��YCkf����ai��L�����#�K����R}�������g!D����Is&'LD0��j�����J�.m���H_��U�+!�B!D����Y,��DIXT�c8V!�((��]q�n��9��]��������K.���9r�;���|�z���j����g�}f��O�>�B�
a����A��� Y�h�{��g-:�G�;n�)W�������ch���+_��k������k��o��n���x�B!�%��=�X�����{��#D�>}�{���,�����B4Ds�����-J�-[�
8��p�
���_���.]�����z�����>��M�4	KE����T�}A��iu����i�
!rc���#�B!���m�F�����$G�N�J��i��?�t���w3f�p�����<y��s�=�3�B!�����!��0>y����/�pp����O��-C�Q&���xo�����a�(H��N
l�x�\z����_H��@���Q �(J0a�����[�n�[�r��OY��-���<�(�s�G�����d��!N���5��W�@���������Q��|��E#L�6-,B!J�j�bk�r���,��d#�9���m�@~��~KQi'���k�4,�L�Er��@��pQ �(�T�R�=��f�Ay�F7���b�B�
ms�����y��������_���?t/���{H����o��\����_o�!�%	zD���W^����u�fJ�t��u�^}�U������� (J�d�=����w�a����(N���I���@QT����OdiQ[A�D��9�
6��������_y�>���3�<��i�5��d�7z���D!�(��#�k�����'�x��[�nX��~���i��n��!��D�)������w+V��R����G���(@D���c]����.���j���*W��.��ST
QT��>������h����_y�h�~]tQ�p��y������B��=�X0{�l�Y~�Yg�_�z����\�j�L�dQ��]���~�)<"'xU>��s���se���:��3�p�������^��&M2e�?�6�;
���x���b��v�A�^z�%w�����Q��8��s��o���������[;A���s���f��;�]���8������]�����N�L�8�c9'�.�����9�7f�y���?P;)x
�?@��5��ql�;��v�Q �H��x���7k����=������DQ��l^|�E��eK���;���$;���~��v�!k\=��C��	l��	��Q�~�;��i�C��<�'��!w�{�����R�J�����+uX���'�t����-J*�n�2:���y�Jp��n���a�BQ�|�H{���T�^=����LV�Z4o��YA��}�`���A��=�r��u��
-Z,^�8�S�N�1��
���c�!�#F��~��������v�a�o��f��s3���J�*vm�m�����s�`���v��5k��������i��vL���g�+W����������h��hR/�W�mL�6-�Z����w�����u�f��n�� cbbe������9sfx�L
dmh��a����?P;)X
�??~|P�ti����[��_��G��B��<�H�i��v�����N����C�q�5�X�3y���T���Y�6��������w(g?c�]w��7.������X��;��q���������w��P���3>3N�{����������~����&3E���u���!�y�g��%�>��t��1��iSX*�Bod�i��$y����+��L�j���Q���L��c
�g�}6�bw�����=��S�������{���&Q����S�8��SN�}���6���c���-[��W/8��s�	�"urk'����	$J[��
�=zX�����u��v,X`e���S�N��l��&M�������M,h#L�n����$&��dE��������@@���a�,c�����t�I�~��>lmC�WD�k�.[��-�'R6��
�x�1�Q���q�u������j����c{���������w��f�}�]P�vm3"0>{0���Q#����R#����������<����'�BW��M�=�|�:�f�������-}!���BX������^�l&C�t�����8qb��e���7GqD�Pu�#_���+-/0!������<����O���	���~����;���.]�#]�F�vB���k����s����Y:��/��U�Z5,�LQ��'����;��?x��+�F�����k�������54j���{�Xi���~����D���������3�}�����m��v
K�����L�<����!D"6m�dc�������F����K�(: W}���6�U�R%,�$�q���_?�O��(���c��w��c�
����=�P��_e��2e�{�����l��H�����R�v�1�IE�MVFOv���CiS��B!J2���g�����C�C�� `"�!�G�����	L��{����t�I	'&>Gp�s
����~s{��W�����
�Q�������E�I�N�&���A>�((o��W&�O������n��*�s�b��vO(�E�(����I�Q��� L������>D��FnrU��^,�V�r����)�1�v�i&��������� �1�����i�v4�J
�C�=O*�n�2z���(|7N<��B���=B�����W_55&�Z�r��~���z�m
�h��`������E������T�B!J"Dls�1f0h�������,z����m-4�*>T�\9�$�B�d�i��x��5����{c-[�,[9|��w�at�m��%��7o����K���n�x�����o�'O���g����q����P���z���H�N��7�&)�k�h�����F��g�1�RD�=�y�������;�u�������W�vx`X"�Jq��N
���P��x���d3�����A�����B!���U��{@�l��=��_~i���M$����n���<;@����	OvO�����W��E}Q��Td�de�d�aQ���p�(Z^!�(n��#�p@��D�(#�z��6ax�����L��c�Z8>��cA�D�G���>%��+��?V�MX�	������{��A��E�L8�gY�H�N�O?�t����_=,�l'/�������6lhkx0q�0�y��GLA����Z�	��G���7�p��OwGyd�	+��$�tQ"��@���(���u0�P�Q%}��1c��H/��@�%��}�^�n�]w�[�dI�}(�c��BlM���yqN�����g�:����iS�>`�a��D��-A�c��!Cr�������+5hM���������<�C=�fv�m73$	!�%��T�����A����y���%�dL����#Y����~�i���[�ndL���u��	:t�`�|��wA�� �X�b�1������'�y���R�J��/��������k���2��5f��a��E�9�e����-�58�kp-�����\P�n��\�rA��=�n���IAP�t�����M�V�T�R%���;�#F����z}��G��u��]�v�2����.�o��A�1��<�mE������,��?��������g��<y���@����G	?m��A����9�+�����^�1��w�d�=dd/��_�>h����s�9��9��
3��[~����{��8��f0p�@+�Z��������U�;��7���b����O��{�iu%Y7���y�}u��1��iSX*�Bod���)S����7�0�����������f	���]�9sf��qc;�
!q�����~h��~���T�������&:\����IR�&M�^c���v�s��	KD~��������l�J�w�q��o�iJ�h��/��"8�����=����'f�D�����U����/���`������]���u�)�d�I�?�c�vR�D�;��{�ek|��DQ Dz��
=6l0�7�G*�p�����o��d3[��q�u���8��E8Xt��=�?���Q#3�s�5���<���Y������-V6��R���<��`��ai&���[��=���$�;i���D!�(�����R����;��s���5j����������>����O>�n�MU�T���A5�#�J����O?�`o��w�
7�����s-E������_���P����G��"�G}�R�	!�j��={�3fX�S��I'.��������S�Zz/��+o���s\p�����>:,�O"Y� �m�T���c�!��$�5zD����W_}�{����W_}�-���^[�;v�
r���^�zaI&�g�v��Ms]�v�$��H�N:u�d�U���0A ��_�e�VX�?�&�'�|rX"�Kq��N
�B!D�)U�������������-p�`���{,,��5^>��C���{���+�����&�C������[�P�/����t2�!�(I(�G����a~���6�(J��5��x���!v����Z�j��;|�p[8r���n��w�c7l�`'7�7Y���0�{���s=z��;'N�h^�-Z�p�?��-�^�0�i���E�{�`)N���I���@E=B���k���&^x�s�(J����u�����������A���~����U�Vv��_���()c9���d��f��n��	��BQ���#Dqa��������#�rQ�5=�=�������&o19��d����|���a�(Hb�	9�YT����[��5�{�������;o��&[ �EkE�S����G��������8��Q
4&L��-~����K�.&g1�#w����K����rl���m�Hv�[�,X� �W�^0u���D!�(9(�G!�BQ�QD�B!�"]�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�=B!�B!�B!�i�s����\�+��IEND�B`�
#31Jeff Davis
pgsql@j-davis.com
In reply to: David Rowley (#14)
Re: Make tuple deformation faster

On Thu, 2024-10-10 at 02:59 +1300, David Rowley wrote:

A few weeks ago David and I discussed this patch. We were curious
*why* the
flags approach was slower.

...

Could it make sense to use bitfields instead of flag values, to
reduce the
impact?

Yeah. That's a good idea.

I happened to run into the code and was surprised to see a strongly-
worded comment about the size of CompactAttribute, but then also see
independent booleans rather than flags or bitfields.

Did the discussion end here, or was there some kind of conclusion? Is
it worth adding a comment about why we use independent booleans, even
if we don't have a complete answer?

Regards,
Jeff Davis

#32David Rowley
dgrowleyml@gmail.com
In reply to: Jeff Davis (#31)
4 attachment(s)
Re: Make tuple deformation faster

On Wed, 5 Mar 2025 at 08:48, Jeff Davis <pgsql@j-davis.com> wrote:

I happened to run into the code and was surprised to see a strongly-
worded comment about the size of CompactAttribute, but then also see
independent booleans rather than flags or bitfields.

Did the discussion end here, or was there some kind of conclusion? Is
it worth adding a comment about why we use independent booleans, even
if we don't have a complete answer?

I must have either forgotten to try that, or I tried it and wrote it
off and forgot to document it.

Anyway, I've now benchmarked using bitfields on the same 3 machines
that I used last time. There are certainly some cases where it's
faster with the bitfields, but it's mainly slower.

I've attached the results. The 3990x with clang looks good, but the
rest are mostly slower.

David

Attachments:

deform_test.sh.txttext/plain; charset=US-ASCII; name=deform_test.sh.txtDownload
shrink_CompactAttribute.patchapplication/x-patch; name=shrink_CompactAttribute.patchDownload
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index 396eeb7a0bb..ff825b5b45f 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -70,13 +70,13 @@ typedef struct CompactAttribute
 	int32		attcacheoff;	/* fixed offset into tuple, if known, or -1 */
 	int16		attlen;			/* attr len in bytes or -1 = varlen, -2 =
 								 * cstring */
-	bool		attbyval;		/* as FormData_pg_attribute.attbyval */
-	bool		attispackable;	/* FormData_pg_attribute.attstorage !=
+	bool		attbyval:1;		/* as FormData_pg_attribute.attbyval */
+	bool		attispackable:1;	/* FormData_pg_attribute.attstorage !=
 								 * TYPSTORAGE_PLAIN */
-	bool		atthasmissing;	/* as FormData_pg_attribute.atthasmissing */
-	bool		attisdropped;	/* as FormData_pg_attribute.attisdropped */
-	bool		attgenerated;	/* FormData_pg_attribute.attgenerated != '\0' */
-	bool		attnotnull;		/* as FormData_pg_attribute.attnotnull */
+	bool		atthasmissing:1;	/* as FormData_pg_attribute.atthasmissing */
+	bool		attisdropped:1;	/* as FormData_pg_attribute.attisdropped */
+	bool		attgenerated:1;	/* FormData_pg_attribute.attgenerated != '\0' */
+	bool		attnotnull:1;		/* as FormData_pg_attribute.attnotnull */
 	uint8		attalignby;		/* alignment requirement in bytes */
 } CompactAttribute;
 
bitfields_gcc.pngimage/png; name=bitfields_gcc.pngDownload
�PNG


IHDRZH��8sRGB���gAMA���a	pHYs�����e��IDATx^���\U�������"��(vP� b/ `����o���W��DA���"H���IB������'<����$��9?��ff����s�}oz�(�D"�H$�D"�H,�8��C�0�.�H$�D"�H$�e�C�D"�H$�D"�H$�D"�H$�D"�!���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]��1���*3o���oooo7n��7�v������W;4��mOO�C>om��}+�����\��1Zaq���5��m��������������	N��p
����h��}�f����2��h�N��C���v�� ����f�6�s�yXc����7��>�����W}i���;�C�S�w�?�/��t����������@W��-���\:Yk��:B���ka�����H2�-����.�������5�����Y}���V���c�����-/���N6yi�!Q���Z8���w��O�^�����i����7��l��fC�<���W^Yn���J���G�-��r���C���?����V*[m�UY}��������g�]}�
&L(k��V�d�M����>���o��\r�%C��c��W.Ox���9s��k����v�m�.���7�p��l�k����jNm�����a}�������?��Cs1�>���������-��b�Ebq�����������e
��l��m��v���q�]w����e�u�)�o�ye��]���.l�0c�������r��wV�D��i������u������Z�p�����W_]�y�M7�t����q�����*3g����|�]w��K�f���t���'���x�b��W$���^zi%_�l�M�{F���/���o��w|�y��W��N���jC��}X����[*�X{���j�~��~��?��@�+����q�o�5�(���Je����<�1��f��>�[<�&��e�]V��`���C�$�`��v�_~y���$�>���X>ta����b�������I�&U��z��7�bd�����/_^�&�����[*���{����������������a>��c�/��J��V
)P>��#����r�gTN���2�'������7���L$����~������u��_�����g�Y��y��)�<� %'�|r��/~Q���?���:��W�1y����������~���D�@
����:�O<q��=�������?�������������/��K�����;���v�a��e���7�\~���U�d�����|p����������c������=/ah�$:jO'O;��J/}F��5R`�
���:�2��{��Ft.�����^�RbK?�'����~TN9���&����px�b���w��]e;���?Ut>��s*{���M&�B�~��VA�p�6\����T���{+Y�� �-�v����o�6aF
��I$y�']��#�<�����-���jW�f� '��$fqo��S_���*������&����O��2u��*.1D�SO=��_��_��W���������]��
�������'?�I��N���C{s%�����7�X�
6�y~y_&���x<����o}��)6����)���i8�.vs�	'�P���?T6�}"_��I����m�fq��-�����wq��n!y>���+_�0��8�.�I�4�~��G���6�������A6����p������?�Q�+�����v�nSE|�_z�n��T��������kNr�5�\��;���[]WYGZ�����/�7{`��W���=��7m����.���R���xG��n.6��My{/��H�Xx����`vy(h�CMrD�lBv:b_����i�.�i�`3�}�M7U�[0}��6G��b�\M[z�}��/����?)��w�`y��,��K�Q� ���/l�xa bc����5��d���N�FV�[��oh���+Y�W~G.�*���L���_��G��n�:�����"����L�C^���F���[.���>��U��w/J!jq@A�����9\�w��n���0�gM�������A��o�0G�?��tR�dV�d]l�H9����{
��7�
c���lP��xI��a��$o�90?)��������������8�a��3�mi�K������~����E:������#��c�H
��Qs�;c �	:�
Z���[��2�M�/���
�����;Ik�����|�c[9������0�C�g��|l�
��+88���*����_����������C�X�<��0:�*NF	��o
SJ�� ����V!fY��i��������pv�!�P���@�������&����s��f���`���P���h��6�6��bk����`~��TI�����������"���
�9o���&���g�m�v�@'��K*x��+�My(l��~��U�B��ev������9�d�%ab��6+m&�4	��[�X���Mr���9�)n^��_6�=Kl��li�����X�����@��yc'��5��u�Ta+����^{�U����/x��Mo*���K���y�9�p�}����{W���=��O�����CY6F�������@�g�}�v�%;��F��%�q+�E6S����[��������|en�$���k��N}���\��V���;�������WzC��
�=������m�����/	����l��������7�~���}�{_�}����M\&�j��[���n�~F;���Z
�^El9r+�{�g�����Nzo?�����s8�`��(�:O������������}����/]p�|y������l���o��9?l�t��L ���[������>�����!�������$����e��(�$O��09�����E�$�������M�v'���y�s*�������}my�3�Y}��4%�p�_�W���j�������5���dEM^��{�
A�S���m��w
2=�%����g?�!�?�IO��t�kl�st����%����U��6�1�vAP�38]%�'/�2�bU�
~G��+��\!�q:�>��IE'�#���'?��e��v*�~��+�_���k��Ko����%Q c�� ����/y�������g<�j+�,����F;y�C�hcD���*���lw]��}��>���wr��@�����!^�)v���s�[��c��>�L�/:l*���~U�V�H��q+����P6����M����[��x���OAI� �Y�]�}�Cm���`����Z~�A
��������vwPG?��x����/|aU�t�W\����b�z�x9H,�tj_���X�{��<[��;'����9�|�U!U�,������Inl��mm7��u����m���g>�����`��e�F��]o�}�]������~�����y�W������S:����]�*��G����g�=���0�����
4��G�O��W������U�&s��^�[����v*v�A�C�+2�c���tE��]�[v�n�CA���T����'�?v�w��7�������tu����y�E��>��������
��?�����������'�v� s����P��O|��'��>������-&g�3�b��V-7�,+���%��/	_�<��_��N�X^�1��&�N�I���`;������1
�",oZ�U"��h"
�������"���Rr�i�����Y���H�8
���@�#��7',����k�?j�s�G���Z�b���I�T6�O�A�����R��G��_+ ��Z�#�Th����g`�����r�x�]�V�BKx���������[��(E��NWs�.k�b���� �?�	�mR��7m�|n������^N'�/�M����Q[�k-h����Nm�Y�k�oN�b\�d�{ISs�a�3|�os@Os����c4@2+������q�A����F��;��;�
��.��`_]oc����Y'~��k����09�As��
t�����yt�����D_lH���>�bn�t�9��	g@v�5����������1�����	Zv*��NA�7Os��^��f���
��z^��U�tc8���j���:��=>�������W<�J�;�LO�@{6�{���-����1�1�	9�34o�At�x���@&���^�yjo\m#��S�BK�{O����l��9X��a��u���8J2���A����Bst
��g^l�5���!s�?xC�����=c����t�BF��	d4��-����h��A4��#��C$��G?|�b�����������
�3_s12k�a3�K���M�hd���[:����V��=zZc��������x�j���d�z�����^��q�5:������7m�I�b����C�QI��wh��d��D�����j�_}�M�u�������O��3���������)��f�Z�5��s�Y���t��X:��MK�����@:��W��@k��<Z��f�Q�?��yg��:�I���d����5�i=�P`���V@'�1.[��������=�n������l{�:�N����j��}A_Cw�>�k8�m����~����j�
z����3'�#���n��!����_}�<���&�9X�9����/|4w1}��9��V���������vt�#}����u����6��+]��[;�����Y��A�#����A���m>l	�\��:����&=�|N����q]_�
��6��fE��KG���!����j@sD�'>�������>�>]�JN�����6���.����gu������|�L�f�	bS�t����G}�u��;m������[�^���6���`��^��M�������?�2��#�4�6�g���l����~u�{���X�<������������S��C��z�K�7Y'C�>:��{L?�%�Y�@6�-��.�������|�rN]�3q;����F�M��.wh�:�Bkm\�����%s���f}���b^�v��:j}�/�~����F�5����5�C:��x��a���B�������9��!�j���g*���l��;�������N�����N��mb��ss�6����`�!��J~�o��y��<�y���]3�xd�d��o�su����>d���-~�A�,�����rh>�J�>kt$���g���:�L���}C/t�����mC&��<�
��!���|�^� z���P�3��7f�nu�������h�g����9�F{�2&�sk%�u��6&=����x���������Xk�O��7��,����>�����5v3�_d����H���<����C}�����?�i��DE5{V�G]vC/�)�2��;���/k�G����Zs3b}����m�	!����ZZ��v 3��6��������'��5���e�3�Xk��v�s�Y���{�:<����g��}��H0'�jolA�_���>������O{����_���\��O#�	m��#���/��1<j~��F?�����^?��y����������l������!xi~�|GG�c���y������o]��v���#t����{�pM�����	�i�?����#F�������J�%�g#�j~L+�A��M(��J���m��0��"Q�N
�FJ[}������d	��Rq�.�������6�&���k)?%�P�+)7�D@�R�����H"�;�4�b�O��O��g�M�d#G���F�j��a����S1O{c������-X��C�	3�^x��2P�������(*��pFA�m�1E�:��&���������:	���h��h���04�y9��?F����o���\ �6@�gSQ[���,��9�80�����MQ<Ect�k�K�Z9�D�1�:����I���I*����+F��h+��=&�~��������<l��-Z�yC�b�|E �Vch+���X}��/t�M�7l��6��I��������tn:���4�~�y���y�����KN��������9�ok�}m�����<�����>�C�K_1�����iF&���\G������5�|�sFWrh�^^xG��Py�k3�h�������.�M������3�`�cMl��H���3}[�����w��M����irs�;m2�Qv����M�,��!�t |Z��D`�����������+�!�`;��B;t�/���G�p-=�E&l�C�Bg|�Gw��oc�4 ���5�����tU�1t������B��
�4&��F�
�����s2#F`�����G��[�h������ho��7G}��������o1j�.xi��gl��o���0���(`���
�1g��}�!�Z��N�o�.�!Cd/
����h�V��>�F�/�i���2<0y�����;��z�"oQH�O�����������C��g�AW��������)�B������)h�s|G+�k�}{�7{����a��&�?��h��l�������o<v:�F^����[��u�S����3�!b��g�dc�������|�C������{�����
}�EG6�8���o�1���U6-d�gh`��N��^����x@��E�s��������{�?�'��~�N��G�7>������y�.^�[����y�o�Y�'���H��X�
�l
���6�2�B���C���;��/��V��
�!���
	����������&>k��\�+�n�#�����+���%�%�l;���5�ws��24���S��$;���(`-xJ����C�&�c{
B������oc_\����~������G_l��Z�k�v���jc����'�g�b��� �I�A����d���z�}�+}�[[y&Z���E]��@���:����Z]��/6���
�^��x� :�3~��z��(~�a��O}jc��9�zh��Ac����Y���g�<Z������>�I�
M�{2��u�+z���U��lXk��V~E��wb2H��k3<B���dK�>x�:2�&�h�}����_�E,>��������p
y�7:E�ds��(��'�7��-��?��9�;�l�h����O�����������94�K:����:��.�ha-�i��g���<������|��������Z����������'Z�C�#��>��0?:I����F�AcX�|7��������{��GV2���md�-��BhC��zfL����|`N�x����9�d��{l�y��59��sw=:�����(x�����&�j������8d
M�=�������?2���5�?��Wh+_1.�"��&�d����q���c��h���>h��t���������?[�O�!�����mF/��������������X�~�&~�|��>Z/����ho�!��O��v�n�v�5`����v�V~X_����������h�1�x�����L���dO��>Y{}��B��V��K����^�+��B+{�{�����5��ZA?������?�f���M���Y����V����#�l6��/�|��X����xBG���/�G����-��sb/��d�=�B+��z��|��kO���|���1�:�����u�59"��s�0|W3�m���J�����)�
��9a��	�����1yf��b�f=�?}o��G&��/�����'�u�CG������hg��({�=���fl���=�^z�^�$C^�j��v���.S�`m��y��A����K��:��
@oyx�:��zY'L6�M��k�����F��a��F���F�=>�1�20r�� 4��A D�I�Fp(=��I�q�D��M�""�;K��%��@S�����G�	����(�`�����Q��!��?'�����8H�(�53
�����9Q����1%B��0�>c�
������R��`���������`��O������)6����%zJCQ��Z�U��
fqE.|�N�:gl�N8im��ns`y1<����x����>�I�f��ln��/}r��$�F|���M��x������ 8V�xd��B�`T{r���2��W�b����B�9���B�����?cpz���sd�����_���y����!��{�����%g%���������
]Do�(>h�VsDk�8�41��:�E@�32J����Pr`>��7��]ri\t�7�g���o|�@	m���d�<��C�E{���V�����.�"�h�G�[��\�\��5�+}4�3>:�s�8�-�_|�^ �:�fm�6|&t��#)p�3ELt�[�#���J>l��+��m�G.�k����E E6�Q��ft���<��������gt
�������wl��?�.���lVX+Ye���y�}	:=f�|�����yZ���.�m�#�;��q�FF���	/�����D~��
�� �a�����;Y Ki�v
�[�G������F�g��M�t�Z��6��E"���.c�m�F�I��z���G�DS|g����	��!��o����6��j�_�k>���{l0�4G���h�������E��@�z�V�a�X�bu�g���f2A^b��%�^do�$��N�7c��l�u��1��������g�}��+��yX#�%����[+�4����)OyJ�ChM&����/t�ZG|`�x��������#[�X$�t����������{��g�7}���(]���:�|� ]�������x�6��q����k'S6��,�U��"�0':�����a
��
�$iF/���>�7��������5���X��}�
|F?|&/����������!��w�Es�G�h�|�>��g�5} ������c��X;^�����~�z����M��!������EC�]��������a�b}�	��=:�gs �S�$�6��yY�c;�[�?� ol;#t=���W�^��yO��K�*[���;:-W��@#���g���������������+>��G��>X#���OrKv���^��*����.6��8YG�K�kk���Vz����>
3bO���c���1��Co�=�K��������]6BAl1e+�5��3���s|���m�eW�j/6�OeW|�Z�{lsl��I��P��l�m�!��gr������6�FF�������/��/���c��������8���uZ�����|����th�<���'k�}�����|���<b ���>����w��V}��1O>���}�0�#c>'���_5����x�;�@C��O�\{��?��|�7���3��3�"1Ws��� �CO�%���%K���K��'�����b*s�G�,�+��[��������}&/�/�2�i��'Khb<C{����z����s7�����n����!��V1w�Bkr���Z�h�A����|�=ZY=�97k/�>��9��q��X��G��:�X3����=�������f[���K����k�l��^dH�h���u��x���������E�����m�����h�O������]2`��@6���dm�o�t�tK�1[hm�M�vk7^����F��l�YtI{�����	�c	���>�M���x�;s�������� ��|{����}�2�W�M6��M6��l�;9�_t '�6}������w�
Z�6
������V���X����i�%v��������rr�c����]���c���zC%W��I6����o��zk�o��-�'��&��>�><�C��������8�I��:�������xk�3|	>���:���c��W�>:�C�E>�{ry}�G�����}�7>#
���L��������Sk����G<bu�����������5���u��f�>�|�%y �����5�=6�?�0:����36��9��d7�x�of{����
�@��N�[h��.����B��������������u��xo��������3�9YBG>$����w���v������u�{:�.��������L6����m�������,�!ZjK�������A3t"��������a1�1gLA���aB��G�:����S*
SW�nA"��	i��I�/}�K���E%~�3���0>������y[�5�N����|s{L)Xci�Z�T��9X�v1wtf���c4N�g�g�M-0'���sx���7�:��_�i�/C��S4�RN2�;[�����h=�_@C�GG4�yy	������yX��z�$C�7��g���$�u�w�(h���^��k�!��`��=�]�_A���|��K���L2��r�Z:��s�ZK� �%c�@��y��y�qN<����7�Bj�������ul>���Q;�	��u�c���a�x�n�����=��qX�d�#����Bf|��r�t������+�6�:���ql��
�x.X�Bg�Z�J��	���#�M����o���|�x�/���E�A����A?��}�
G+P�F��y�G�^t�����n�t�_��I������;�����������5�uk�|q�~\�G����m���\�}}��k����f��>�kN�]��_2"�?�b��2�	�9EK����N~JRc�~��n�����_��g�AG��1wrn������=����0	�0����V���+#��Rlho�MO���)�]�0�����:���<{�����IJ��>	�[������7������c�0��6�����Gv}�N�G6���9�E�n�?�8Z(������s�����u�m|b��FrM���l>�q��j�k�yhS�x~����bs��!g�g,�5�w��7����;����@�������>��r��Wv���HO:�����Md������|�Zqf�>����gl�9��C^����%{�[��K^�TH��/~��
}���i+�%�����u�s�[���s+����Y����u�p1A����%��&�1'��c����B���v��������y;C?�����H�[H���uY����G��}�+�@��K�������6�n���k�U�'��u�:����v�e~�z���T>������e����6��3��������.�{�DC�Mc�&��>���i|�q/��S����S�����,B3�Mc�J��}4n�#���������AC���4���A��<�V�7�������G����f�g^�|�������m��m��9kg������>���|?�*��d�c�������b��rN��V�����lY�^���
u|&��'s��q���i��h
:`
�7<�[�M]�� ���5K{��/���je/�:�����������;b��6rF��^�!��:���S�P����^��u5��#�]`�����q����K����ul�6l���5x&~B��utS�3�C_�_v�������.���_b+k��:;\�.������G�w��l�9j�~���M��U��_r������S�i���"2�^�s+|���xn����s\���K�`#��M��\�+^�Oz&?B?��N�&�}�n@�������<����9�e��z��t��|���4�z6�������=��/&3���6l�|�����#�RH2G���{��7��Nr!F{�K>��.'�O��"Z�	���'l�8����F~�����"� ��R��D/|f��b_\���M�)B/�a}��|�)���l^:�=�[~�Yd������`�d6���.y��b��_�H�`K�m�W�!�ZX������m�����:��A�^�l0��k���������nbv��qb����P;�{�b�t�!�T�w���@����V�W�~4|�������y��!N���6�������wh�>d�x[�r�������q�	�&_x������w;?�&��?�����������
AV���'��
��<���Z�'^�E���1�T?�L��K������#{c�K�B�#�0����X���)�3�7a���cP 633�gQ��2���21^6��?��Jy�w���"RF�����t�������!x��m�:��-���t��1Z���!"�e�8���y0�� &���3bW{�/�+��/C{��VI>28��o 06;?��W���@������S�������wU�p�s��64a4�E��o��:k�08h�iB�_��F#�ka!h��4O�!��
��
���t�L��0��aR��l�p�����D|g�:�_v���������vS�|9Frz���{|'#t1��������5����7#�7}���������n�m�vnr�t����Mm��\��>��	��(t�#��x��u�9���5{��g�
�
���f��a}	����z+��N}Y�>������`Q�O�$��@��6��X:�m}����E�5�?���}���'��N�~�P������/_G/�=����JR��H>����-:���q���lK��pq@ HN��N�i%YD+~�Z�w|����N#�7����1�g,2k��=�yO�����n���#B�����
t���9Z�����+v��z�
�9�I���o�; Qo����������/����6���7��yq��6�4������uH��W���
�f��K��������,8�C��N��������l�u:�e�G��d��}�-���tP��S�X�>��	���@����A[s��Ev������~�* ���'����T�i���ol:�if
d������{b���v|{2L��|)]i��6��E�GN������q�����z{������yL�\����?���+��_�;�\���|�p�N����M5��NxoC��b+��u���������?�����}�G�
�����\s�B�xGaA,�K�|;Q/L�g�N{������l�
+�z���5�E�x�;2�O������b_�z����{���V��������}����E{��M��1z�k}��H@����g�;����,n�� #�?;���q��s�@����j����~������f�w��"@;���CO@�^|�������A�Aw6�����n�W<�4����1�N��>�L�	�'�Fj�
�f�&�A+}�e��l������_�����N~������u�N����w����#���h�4��sk�_��y��5X���>�1��|gC�,�s��[,�����<�����M��X�����aK���g����rL���B��h
!;u����]g���/����!k^��~�E�1>�����]��;|����h��5�Q����
��Y�P�_���,YF����.����}���\���<���u
v�����Ob-����H�w��\�a��@��~>��n3��N�"���xin^l?y���ra{�l���:
��v���Fc�������v4a=�_c��/f�kG4�o$�W���*�m�K���.��?q+�C��#�������'�5��N�����o�V�k����9�!�2���o.�?x��-��1o�/X���~*{�)����t�<���x��;�a�16�p`	M�_�p,��(�CV4��e�H�4K�	];0n��6��_
a#
��
p�����4��	��>��J	l��(^�"?']���/������_�z���3���1$�J�������*���w�S	�� ��k;4�������"���m80��1�0T��i�v�����E��n3oq�\�Ht�����������d�|��+�7cS������Bm9�:���z��	�1�V� dM�n\���u��	&�Ry������%w���f�����^	V���}�k�8�+�	���t��
2��5�����g=83�N�Q���/�o$ym���SaS����:������d�Y�B���!gx@6�{|,����x�v��w8�3�����G�(�2Gs��E ��0Gt��N@f���_B����@�=lF6���I'�f$����l2�O��k� ��Jv�KN"8E��g����	�F���)w!��U$������:b�����	xo���{��?����o|�J�$
� ��n�-�Gcq�����������y;���m���
yx���u;��|�������~�:�������Z����|�;��Rao�}������9b�
�a���ppM3���|�#ly�?���-��G,d,�k�������t��7�Y�5�!��l��t�������2���9ka_�c-c5����Z�`c���u����R|��:�Lk���,
D6��h����{9��x�G%��G�n�{b�@n1(� 3��=��H��������k��[t����:�0 ��m�}���Mc6�]qB�HF���g>���������W|������k��#�F��5N��cv�S����u����Uu��|�I<a3��0�p�g�������7��6����b���A[k�������m���8�/1;|��G/8�g����I+�<���1��y3=��F\j^u���!�-���K��nK��3f5�a��b��q3��2�C��U����#�c�n�����[�����|�����S[k1^�qo�h">j�y�!�H?dC��s&�����Zg����s6��I�&��O1���������5q���cr�g��`�Cm�.��v�D�B�?���B���H�[������A'"wa�6�lz��"����l�Nc6�A���;d���/tU$m%���g�w���hec�E��-�����y�?���V����97��?mZ�X{yx�3N�=N�+_�J9���<_��H�h6�=A��}E��	/kf�G����1���g�`�������y���l|w��?�E�4��6��Wx����3�o��2Z@k���dw���|��/��?�S���+'3���������6��:H6���c��{����OL<��|�h������`���5�}�#�8���Vl}-
�`���mAo����C��K~@���l�q�W�Im�6���?�P�����z<���$1j�V
$�A,�pbc0^�"�����:���4�P���t��b&EaX���'N)�AitQ�(�����	&w�H$)���)�*����������U�g>	��5����{����������Z��naP����<u����m��c��F��������^'_Kd"��F�~Q@��n�wl�������o`8Yn5wN��W�0�7��H\8�vvhaa���wa�O��D����Y��w�������a��oc����������]=9��{��`��,
��P%Q��m:��2A�I@����w�1����}��.r����Y�l���N�x��1��k��lj��J���_�"��V���Z��Z��
��b����M��c��7L?���0'y��F��[�/*��xP�H�$��}�8�n��<�DQO�^�M2���N3��4����	1��E.�3�/�W�w|Hzpp0��������/�U"*����$�|F*^��|
��G+::�O���t���%Fc~���L��u���k@oq��@.��B�x$�o90����_�S�6}��p��f����������:J���x�+�
������V��'����m�������l��#ly�������oT�|p��]+^r*CvC��B1�"�[�]���t�Tt����b�U������t=�������E7v�y���#>o��l���u�S���~GAF�k���s��G���GB����A�����5K�j��d*>�����_>����!�D>D�(�xc?�n�#�h�uZ{o/��6������sLu�J�U��-�C_x�N�c.���.���6���7|��Gq��6.��l����6�h���Y�w+�9C� .���x�~���K�Q��\�'��(�2��&X���Y�n��il������mt�Z��i��{�u:x�/r8O���c���S_�l��_��+
9�ll�8~j?������Y���>|FG������}������B����"�"F�f�Q<mGO����N�7W���0�WH&s�L�����������htV�j��z)~�Y3���@J=o
�Y�����xl~���'�)�������9��o�	�����,l]��M���R1=k�������'*����s��G�;D#�W�t�Z�E~�����p@��9U+�����g]hn�g#A���U7�y�u=��gj���:;�^�����Q�r	��� {�����R��aH��)��@������q6}���3��IF]a��b7;o����������o���G�IL)�D��3�a�����U[w2p������O{4���������P9�0$�5X���e��w$��2�p�x������I8>��z�������\T�h�{'p
�l��������x� p�]lx���P�Hr���O����0�V|�9�`4@��K0���o|��z��P�A�|��yGOIF3����t�3�����9=��������|'@����Y����mD��w��I��a8�^r����;��e~���������,n������4.�����&��^��*���k�����}K�O�6'\��	��ZA��b'�!N��wI��Z�����C��A�x�r�
�V�/��N���c�ys2c
���6���!�^d�[�F{2o�c���o��"9hE#�}�����V\��m�lF3��8#������O����/ke��C����b� ^q�:�v6��k~�!���I�x��J|lm���t��V����k4��d��j�����KO���@�/��^��f��5��A�_N��<2���P�XJ�F:D:�%�jE?/�U"	dL����[EW�&;clq*�,
������9�	"����<�>&��	|��n�|/�iE3y����%
����������,�]�ls+�{������mP�+MdfQ�&��� [�o@l�����2��@�ml�q��$9m�U�v�k������(�x���"�bS�d����V�'�;`GV7�a\~���6�����6o�2�:����=Ac�i��/�V��b�E��5�_��?���?b	�gf��3��g�a��y�n��\ZZ
�����:��r���lO��0�
����o����&~3��rp�����(�;d�*d�~�Y;�����GL�-���=����pr$��Wz�3�=�]��s���xq��\�sc���:��i���U<r��"y]]���c�<��m����A���=-)��96������]�>ZA_h����^�&�_�qc���X��u�+l%'��Im���h����5�$�����D��W�H+:y��[���fXG+��.k���z��|�N�U>�]p���cE�n1��b�1�m�a��O�������v���^����p}���"�p���Y��$Gz��{zI��Q>Gsu����y�'��k���B�����
�����c��6�E����Df�EO��������4�ZZ���|YC6�/����@N��%��o�|
���g/�o�T�^^0j�V���Jwb�_6i�$�s'��P.�7���1�o�#�]Pr�����Gqh�b���M��o�J)���Rw��P2�^ ��@���KZ�o������!�yX|����?m	4I���M;tf�|�	��s@_��6g���gC[�����u
������{=������A��}s`n��;�NsuR]}�6p����{$�t����}��3���u7#�W��#�����13d��4���"8�k�c��fQ3]���������5r�6��pph����N�y�it2������|i����������3�6���Gq�L��]a+����>�8i�:'lT�#u}Gv�X����������jS��b��7���>����?["Ym%?@f��l�<l��<����)�_�0?�hNf��w�U������>?���:�[�>)����,_��;�r���`hE�������}!o��-[T_�>�����EF�F�v�c3/��1m<���z���M��%X�x��i�~����oxkm�g[�#q���U,�\�c���H�~�[�����b+��$Z!Y@��b�f=�sh��I��Aq�u�^�{�~=�Hq��?Z�07��V�*��_��W�;$����KaPl�'<��K����B�h����'����5��M��d��� BCE��K����E���j��&��k��^�/�q�9�|�x�/@{r���t�,�u�Y����dC��g�"�B�fe��7z5�4�l�>���? N������r������$��b���g6d5��9~�����#�A�G���v�J|����)Tu��[e�r+��������$���>����+�c#�c���������������G��A����`\������y�����(@�����>�:���kK����`����}�N�F�_�|f�=&�LZ��W|��W�jA��Mk^�� l!�5�P���[���y�h��������\�74��x��m�L���YV�����9��G���Z�v�!b.�  �h�
��\����_2H�E����
q�����v����)��b���)�l��������]9k���#��Y�}�����|���q��b��g�{: ���&9qs�p-����5����F0O}���h����D+������[>���'k�����G�G���.�o���jz�E���V�������|�����5w��s�A���K�a1F+:y�_�nF���:�u�{����E��;EE�����Htj�G;l>lW����(>�G�Lv���BeO,��Z��v��M��J�F���O��\����x�=-�5y7�Vv�|��~���mN����Eti����U���M������e$��{�C�����[�\S�%�����=Ulu�Iu�X����Vt���;�e{���h;_k����+eM�S:���[��:�_:�$0*�f]CI^��|N8)���h`�B(�0 ���A��qV6B�����H�9&��^<��l�6����&����H�@���r�����b�G�����G"d<I(����0axA�6h���0'��l��~�~��|��A@�����T7�q�y	���������pZ���l.�E�(�Z��1>h#���v�@\Cf���6�����Z��1
��:�����NkB��3����e@�A�js�<����GW���k���n@��=$c1/|���o>o%��#dC�U����������O8Q�Z�t���,D8��d���l�QIJ]��%����7otu����`�o���lYc��
h�,'��k���U�F��
A2}7n�MB�\|��/b]�����y��i6��6rMv�<�y��Yp	K+�n�������1�����:��K�;�����Fl�
�Q�5Ispw9i}�i��l�u��j��E~:IT���7�����f�]�'�-���6���!N +�m3����.?�K��d9��h@�@Wl��'A6����4�2���
~��2cC��$�Gh�>6����q}�^hI^G�1����I���5�Ek	������a_�v�NXk��ql�;D�g����@;���h��y�`�cdZ��i�K��~�n�Mk���m�"@7"�dS���dh�fk$_��[��X@���
���6l;O��hk}�K���al�7�zl�F.��V~!x%�d��Z:�*��62I���n���A���n����9�S�_����s�����V ��)����9�6�B���[���	L�n0F�;"�m�3t%b8 �l�#_�G�g��+�_�I����ib1���������
}q��ja`��b|S�'%�Mlf�A�f�;��b~���}���H��&�|�������?m���S����:|nn��������~�����gs���M���\6��!�k-u�O������`��~h4�����_�$��8i8���n�����:���a���S���C�X�2�����X[�;x�-_r�s�_L.[���@O����AAO�d��������%�c�P�A�B���^����d�������3��s:��A���@4�c�7�Z��E[sd���.�-�&��i\o-�c�I�������9}��5z�[G��kM�_ ��v��G�:}y�����w�_��:�k�q]O����[p��M�K����><^�o�wb���<� m���S��!��??�����!��������^|�"��F�;��Bla=t��z�����X�T[���ph�����e�>#g����zNa}b�Xg���`��C�E�����XY�7���'/N����8d�N��V���(�=vRl�f����5������1�����;�����~�o��
����v�.;��u�o��:��a�C��E������8d��d
��ZE����,�����v�����l��A�X[���`�z�����sq���^�s��|"&���_��l��V�����&/"c�S�,�o{6�������X@��
b���
�������v�ADXAF�yp�6����������(1�`<��Z
By)�$���PJ,8���(#�w���d���(�0��R@ �U�H���2
�$<���bK��F��u0�Q��O������[(�������������T������6��c]��#�E�P�fX�sx����C���8��|���>?���{�(� hP�-~[;%�{��,\�V���6�%K�.t��0//m [�
����^�6���;�����-���]�%�y����ex����� �������*�1n"yc��!���n�|6'k ��k�>w
c�W����m��u�A��t�_���Gm}&��2G�����:C�����GX�@��Y��������������Mh���JF��En��4!xS�q3�C{��
]`S�5�G���t��������Z�n���-B���X�������Yc���=lT�Z���>�o.��~���7cf�C��/���%��\d�M4?��rF��S�����
�4���>m���H���7��k�����C7}[7���m�/��~������8����k�hK��5�K/�Z�����Z��!/sb_����;Zx������h��`/�$t�{4B?c[���V���7�!��P�b��2b\:eL�I��`�����J���d�,�+�X����#�h^�?������Xr�-�m��=��Q-��.YK�>����nc�?@v�������������/�����7������c��D'k�#���2=5���Y���KqMC���O��'��\������?zq[ ��k�~����N[��K��u�)z'vb��[�y�����������w���a;���m���������'�s|@S��Wsa#��hn��?�������3h�b�1^�����|����7n���C��Z<�x)�{�3O/zM��sx�~�H^�E��1�,>��=4G���xu��k�+Z��y+�c��C���=�������
��>����9A;s�o���|�5:�ZrM|/����V��fa����B����,L������i��O�Y+�/����W��e��.t��F[2�;�D��P@��	!�l|����>���b�hR�!�t�����L���n��u��n����c|O�hg��]�A��]��3��]67�P���'��
4�>sAk���q�����?�7~L�������i��Q��>����I�#s�,Gg��w��s|p���2�X���|Q[�J?�V�/���������X����q;��q�Ss�'_�o����9y��X���b�z^d�M'�B.�����Mn���u>
';�Ew����?����i!�n��`}AC�Jv��	�#3d��)�8M�����Y���N}[��_}�hK�����}Q\�Kr%�$�3?�����������6��,r`
��L����!������nGk�/Y�/z�/q�����|f>��#������?}�G�N!�����xx��������E,`=��=�47�r��S�i.��E_6�\�sv������I������^�3���;=0gm"�0�y���G}��>�������?�����xO���~��NN��_�#:D!I��hB~�����W���������c���\������f�����8b)����d�,�Y�����k�[�hd�d
�|�o��������3�3�GV�]��h����=�U�x�w��q�R�[�z�6������y�O�6Yy�7zk�a#�����������~��6�v������k���S���M+����Tnm����[�q��{rJs�O�
���M�:���&s�K"�C+@k��X�zk
����^�����>C#��p�c��,Z�.�q�����9�se��[q���m3�N[c�]]>����XlR=��&/t�w�
���<�����hh������-�a����-Y�.��_��%y�?:������e5���a�ZA{�kqJ���g���4�W�������3/�m�������~����l�x��A��:��xd�������2����d��<��f�]�����37��;m�^5	�4%m�����)�s��Gyw���v��m�f[������:��D.��9�9��'���{1��Y[��>�#�l�}6��l���yZ�1*�VA!�����Y7$u  %$8��;E�o�P�"���
`�%���q����A�L�|�ZaC��z��;	&kon�`�8��cm!��r�J�F�)a�~����1_k&���
OBIy��-j��LQ�k��p2>�g�&$��R,s��6�8c��q�������5�3oF x����s�#�BkF�c��)�$96����]���B}�����R+�/���Gk�	�h}�b��2���
c��0���]�-�&�c0�>�3���
ccm�1��&��������1`|c���?�n��l��#��g��.7�@7��u�9z�� �:=7�Z��&C���_t�������` 9��'/sXj��x�/��
��#gh��N�Qs�����{����p� �F/�iOg��vho�d�_k�?zA�p0N[��=X����?�0��D���w�A�_�B+:�{e<c��d�����XI4��*�����B�����&/{�>��������u<h����s��E��6�����7����.��� #��l����AP�������l���?]b��<0?��2R�W������L�����,�14���\�
m��z�3��{kE:6��Q����Gt`�����u:hk�<��������1'<���Z�{t���`���o����-!D7sB#�[���dH[c��9����;;��D{�`o�@[/��Y�Q�/�����}���Z�1~�e�$d���|��:���g���������������a���y���W[�����Fp>�����X�ct��n��
����A�������+����;��?��f�5h�>�#���V ��odG����==0O�������v������9[�������Z���n�a�?���E��������<tcKB����Dn�0�9�����t���O�8�����%7��������-"��������9Z�9_5\����\,j�����W�B:L����
y�&Kh�.c��z��~�/~1�U����:��6�)�p,�B+^�i������]:F�qr�6�I:G\K~����.������lWh%��g��EW�\}�(���u�el��pz����������������5��u������l�a��-�@<a��Z�V�u��|s����cM�U=&����_�1�t���t8r<�1lz�u�2'��N1:�����S���"�B\�~��1�r�^6�G.�>���M���������<�3
=��z�s�`�b#s#��:������sFSk�w��6����`h<����������hH����;�m��A�}3���{C6���}G���j��!Kd�_����y4otD��O���&3���2}����2Av}�M���GrJ.���l�6��s��GL�fd���������F����1�O��f��Ko�=<�7��5��|(z���zt
c��u3��Xhc�|���b-�Lg��)h�vO�
������(�Z'��(�Z;���\�]�~�ns�[��7h�{����;k��aK��s��c}����ph���l!�\;��U�#c�MO�K�#G5�@s�����E,���@O�>������d�
VP������<�mA��Zs�^[���06��=9�A��U���CC��:�M���������Z�z)Z�;=E;{]aK�C>����!�l6�;���A�J����#��=�n�0��.��=��^������I���0?4�'�=s�}�?�Q���c����BW�k<s�c��@'��z|'�k,�����u�Q�����!�+~/J���+Z�;4%����E#zOn���_��t�V��|�9�o�<����="�#����d�B.�e.d]�g+X����5��p
��gu��y�o����hl�~�}yh����m�Q��b)�"�b]��
����3<4&����9�KE[��;F&��-<����,���YW��t�l�r�vt����3c����[S�����5���1V=��b����A%k_wb��I�)_�������$c���R�Y3�N����l�&c��B��VH��D"��!<�����a �x"�����8���wKb	b�Jtg�M�6�m��`��� eS46�6�|g�)6���6k�6!|�_5��f��
���h�Yac���*6n�m�l�(f��\l<Y�q��A���
nA�U����&E�6��	����2>�
��C6wmB��3}*$�\�o��]��&��p��7���(2G�g���xG5��\�&�5�!>��b=�:m����D�`8����I��-w���#O���������u�����d�����Zm *f�A�m�C�X#:���cm���f#��xE��������R3��f������c�hD���>�'��n����A��75����N���"��s:��y���Kt�Y�����/��X����L�l>�	���gh�0k@��v+`~dTa���7��d��X�V��X�U4�7E3}�����@�"��=�a����>ig�x�Vx��`-��5Q��F$�t[Q���C]NBW������S�Z�5:�e\s��u���\���c^��S��\����=����}������S�@.�e.���d+(B�	ye[�-������q��X��'�2?}��z�\2��<������Cc�����]s�����v��������z0}"?xH���������!'��]���N�����:�4�0����F[��l[3�?����~��N�����?���u����B���>�?`��Z�q������G�P�K�l��3�������������X��������/!�a�����
;j~u��|��5�5g�����O6��>�I�����m3��k��~Y����Z?���������1�v<����������C�Lf��|�:G�)�v�<��<�26���/��h�jM�s����f:Z�#�H^����_�k����]�YC�/���������n~u���|	x��VqY����DKsCs#o��f�]��t
�����Gn��f����H:�<!���������_�=���2&���0��sLe@��o�����O~���i����
�1�7���+_��a�Db,���Bk"�H,��IlL8M�������%��f�5������;����;��+W~�[�Zm~%���O��j���Pl|���g?��������o"1�a_(
����7��D"���pu
O2r("�X\���@b���Qr$0����;���s���F<�#� �`A7�=�y���1)~���t��,N'�D"�X�p�N<�1[N�:9:����DbE��C�r:��s��{,�|������w/�S�#�N=������[BqZ>�02�H$�D"�$w��V<�	1nqGe"�8�w�&Z��X����@T<���S��C&H�G(�������K�q�`WhK��'��w�&����`;�����Qy�T��aZ�������G��-EO���s��4w����X���p����Y����XV���z�]�������5�H$�
��N>��r��gW�8��~n�J$'���h	b�q�~���n���$�� �{3�Jw�*4�oxv��s�3�L��~������$�Db���X�f�d*�J.���H,��BkbICq�o������>�C�3�E��Pdu����r��>����{��N$�2������������D"�� q������9��H,nd�5�H$�D"�H$�,���H$�D"�H$�e���D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��D"�H$�D"�H$�D"�H$�D"�%���H$�D"�H$�D"�H$�D"�H$]"��� ��x
]�Ch��^�x�0�D��h,��D"�H$�D"�H$�Db���1��'+��+����Mw}�9V�\���+�'}�X���>����������'������Q��Q������>K�m4J���K���C��@OO�Y�9��_k��D��sg����w�>�[�S�F��_���q����'�H�]z����z�H$��sZ����yen����Q������#��>I,�h4��K.(s/�����u�q�����Z�����1��Ye���K�}��]`��J�:{
�I$�C>{��
����M,�o�����U�>I$��YhM�� �������9������S���������;L�>��x����xDYm���>��{���\y��e��Ye��)e��7.k��F�������w�qG���k��9s����Z��GU����@�������^[����+��6��j���/��v[����~�N�Z6�|���J+
�XA0H�?�^����Kc���;��-�*����e�V[}�9��x��'N��3���7��t�M���o�������-���!���;�\����[o��b����da��O	�������B��%�_+��=�\~���\�
&����~y�#Y�{���i�����}g
}�z�}e�}��C��ya�����	f��Y.���r���W2�����[���=��6c���
5y����FU2m���������T6�\�6*�Ow8�?�(?���Uh�p���Gw|k�a��K���`���N��|�u���W��^��|����,�&����f�����s./XyRO��&�5W�.�H,{��@��
�,��8�k���	OzjY�#���&�>n�n����v`��']`���o�o���^4�AbE���n)o��'����
}�9z{z���S��'�c��D"�X>����w"�Ba�@)�_�_��]�&��O�)O���"���I'�T?��j3Y!#`c��C)GuT��?�Y����T��l�IU��	m��[��V9�����g�YN=����a�Za����m�R�{l��?�Q���?W��G?��e��I�&�������}���g?+����6>�z����=����"k���}��O+��K�{��|������������-;����BT'�Q08����w�����_��j��?��*(�(@(N�q�����(����_����ym'\�����~�����N+g�uVU8�p�
�b����~�����~��9}\x��e�u��
��+�����_.���7��1��������u����
�}����]v�e�������C����V|f[�Q�RdR��F�����w�[�����B��;�����?(Gq���@���Q���;w����{�z���3�<i�����n����	����D���<����Uc���~��D"�l�_��Wy��0�.�H���Sf��s��`~���u�>f�BZ�����_�Oz����}��UN�����|�+_�B=�q��b��W��_����;����������W�,�U���|�;�{���*�t�K,>[����������U��r�-W�CTw�^8��A����5���A�N|�n�g!�&����>W�([m�����!���>����}�cU��`���n����������]>���#�<�j#����S��mo+��G����j����<��'?)������X�=��J��2'65����������&n]{������7��4����?�v��[zW���L�y�����rL�&Y��t@~�x��o~���������C��\��+�����+�o���\5�����#7�q����|����1�6�m�]u�bO��!�rd2f���hs��W��C��e�gE�g����r�U��9��1����k������Y��[�p���@��<Y+�`.�������_������|�AT�?��*�O�E����?�MozSe���u�]��Q��\�?��g����~���7��G>��c�9����o��+g�?"W
��Wl��M���/�u@���/Wy;�?�hv,�X�����
��F)W�:P�yU��XB��?�j������o�r��EA�Bq���~��B+���_���U2����������su���F�6{��g��Hp9r�^(�����~������U�h���B��;��Ab*��c�=���>��j��
��@e��.�7�8�Aw����g�V�6�p����G�^ziU�Rt����
����[n�����5��)��v�m��������E���v��*�	�$���O!�%SOy�S���H�#���*`<��(o~���$D�c
�4��=���@����7�q+����;��3�:�O�b���	�����e�]p��9��S���
q��'Wc�����u�{]%C
_��>���bG�$�z����k�Y�M��v,�Ow8��s�������C�t�g?r�����:N�����D����|���X�H?^6h��D"�l"��D{w���\��v�U��&�u�]W;����?�1�)O{��l\�
�7���x�+��R
e|0��i
!rZ��g=�YU| �}���\�&��!~���(WT�/��6�==�}�{_��n���b��{�v�86�S83O��������:e�n����*�S������gV�1�������G*��	�������������/�|��G(��+�#
��������W���c������I���6
|�|�+�\���7�b�	�;O.�i�
��=�K�����J<��]P@�{�A�#���G�
9$��vD�\A��?�q%C���y�k�����rJe[����
���(
�r��>�����[�v6�X�8��P�)�z���nzP�'{�&�2�/�32����:�A>������"[o�q{��u������'�a�	+w]h%����]wp�+
��Y��������J��C����{����w�z�����l�Cx6�
oxCu�C[2$��#��~�S���7{s�	'T>�u��@k|�G��9�f�m������������%���Q����^����|�}�-{��Wu����-G>�H$����Xa�8
�[<��B������'�@P������j�_�B�	�8{�6�N)	@%"/~���bH���z�����j��i-I*�+�8�%|�s�[��������T��$U�&��#@	�������l�R���
�������mwI�\���=�/���4^$5A�@Z�,�����]�f��]_?��������z�3v���*J:��	�UVY�����}|����G�8�6��Smi�54VD@O�RxP��dT�1�3��JZp�1'���/���M�Vm`P�\���c}#��M������?��$@���|�"�#�����h�3��]/�E�'�U��<��!6�D�.v,j��oJW�VEN'�����'������H�>��OT������Q�F�������6x��6I$
�W�"7x`%+���a����?����Y��o�Z����D���s�?��OW|��<���?V2�}3
�"�gc���u�r���������t�-�v�����t�:�79�����z$�lvL�OF�M$Vtd�5�h�%Yh���h��bx��^/��3�G��
!b/���t���b���.����b��6�m^k'g~��X��6�_��Vq�xE�����,���">�w�(X����A���b3�IZ���{�){ ���=1��P���bow��7���HG����B����%_@����p'�1����W�wE.���<w�y��������*�P�%��*�����	K��1y��[QT��&�����=P��E�.O�+�ix��
_>S����aC%�i�/#dO�(p�E]T���DU��=�� ��B���+w� ����9�c[��Vd%���,�?��5�(X��V������g>��*��<�Z��_T�A���s(������y����O��={d������6Or"ol��@r���E���':@��.Y���97�Ev��|������y����������Q���l����1���b|�v�'�H$F���H$�A�a�T���^�E�����D���@���@��`JFc�Ug��w��4����1��^?�Z@cq����k��Id���6�%T�������Srm#�����F����D����Z!�&��t��������$�c6�m��O�@����d%Y�V?!�O6<>D'���^t�7I~��������2/�6'�\O���w|O�o���:�K-qt�m��b�G�(�W����D�u��Sp�P�%�&��Ly�P#�%;�E$�:@���G�(�*,�a�#�/�Y�3 s�=��?�a'l\��3v��
�����l~H�,�K���c���N���Hr����n��m��o�I�,i7���>5��zv�
Y�+�x�Z�C/:`,��2;f�Z�8���s�AW�D"�H,G9h$?���{���d��c�mb���s.n�Mq���3��N��ALb���G�{�����
t�T��
��bA���Dn���;Phs�!(��<^l� U�����LLT)��N��g���������}����������U	�4��[�'��)���w�k'6W��K��g��+<�����!s�K�EV�V�����91�C��_�0?������x��d���������d�|C�{@�N�����'�X���r�����Nq�XA����������7��9�A�����v�B��E������{j��(��%|���w��'���$��d�������W��Z�m\�K��#y��P��|�����(
�i�L���������\���-�{��<������9�"O��w,@n'/UUlm�?�����"���z~�,�lY<|���W�p��
Z+��O�	;���[�&�k�\�y����;�G���b�����]6��x�c�����k��C>����)��3��l��H���Cq8Z.��������C=V����u��3�P�$sxB����9����&cYhM$� 8x���@���	8c�w��MkN^���
(�D���n8�z?�
��s��Dp�mlv��3n�	���.�����
%��$������m��c�p����?�� P�"A�J������,�;5'��Y@3�QX$� Q��,��6���[��6���	�(��^4�>F"�H���]�d-�o�OlY����A�d!/;��D�|��U�������H6�����Bpl3�t��U�BP����Xt�.+@F��$B�����a$o�Vm�
�k���-h������> ���	tk���f��$�~g�6�����i3�
�|z\�����f��'|&	��;�o���
!v�#�d�H3�9��~'�m9�esMbJ��"�K$�DbY��N2���I�}3�:�VL������7�������\/�W��S���<~]L��dm�3������c�Y�b
�w��O�{(����P��X����� ��
h�������~],"Ww�W=]���w��8�y�����!'����l(D���������N��8���9�k� �X����@����1���z|��xo��P���G�3.�iN�.�#Cb6X�iw�EL����E>�xdK_�$GV��Z���
�������Z��t�G6Ba)�?���%W�,
^@&����TaO�|&x�z��X/��yq��yC]�#o��!�(�@�A�G~c>�r���G?���d�������[at��������8���j
���W�3�=�V[vT�����X����|]N[�<P�
������2��G����$'��~:X�r���+��ux���q���\���)s`#�*2C��cY+y4���q���6��7��d����c�z�O����VvHA��u�rFn�����v�����>�"������)�C�2_�H�(�Bk"���q�u'^���6	 ��t9`����|�������m�N�����;�i�8�'(�$9�����Y�	I���`��6��Er�Ys����,)R�qJL�,�([��U��O���z��<M�	�[a$���i'�Ek"yk'�E��c�6���,����$/��F
y�qa����$7>�z�Yp��S�-�"d�	B��IW��������`�
t����D=a_^����L��5���{��G�&�u=}hc�����I���c���N����Xkj�n���;c�/v)6i$��&3d���xD�����;]R�'c67�����UI({E��6�@,���7�
�J$�DbY�k��Ol>�o���o<)$|���y���O~���5��������7��S�sQ�lc�
<~�=����%���G2*�������*���+~����>����6�m4���=��{���m�L��X��
)���C<�`&��h4�x��=��
}�U��B��������C�$N������U��m��J.��z�V0?���V��Nb=���e*��Eq��;�c�9��]�+�T<sg.3C�M��Rm����������s�@��,d)����=z���MV��!�@n��6�c�s����[�eWL�%W4�6�R����A�js�-l�����(F;�����=�����"�b[���5���C"��	N@�O��=e���h�������7��:�.������]�����b����-��{c4���7!S�\�K�������~�m]����u�c�3�w�xv�MdNq�O'���[�w�������CA/��_�+g�6_�}�goN�����
�
�~Z�a�DbE��w���R��������9V/^�fm8f��7w��3
��<��c�N�������[%5�M4�������������=z�#�q����W�3����#U�Aa'�?��V�m"��#�:��>|��������'���G�N���S�U�H��;����t�]�����/�2I����k�j�B g3C1��N	m}�c�����{/����l�6���l��8l�����6�K���by�?��N�����F[ �����@����; i����H��4v���b�l��E��	i'�%�yw�{4��}��e��N���f�$�D"�����$�����������c�6bG>X���b�G�����[q����~�],!���j}�x*�g*��V�c)�s7�CV~���FF��"��t�g��H�Dl��
�l�YZA�.�Wq�C�r@#�_x����q��}&�#+�����$
�
E�a���b���h��q�����w�����h3�����X����)��Em�>8,�v����,]��h��|�>�}��?
��}�k+�R��cWx#c~�#`�oyn��"oF�-�i$v��\�kS����I���n>l
;��-z�^�@��2����)��m~rHX�
����96�^����;6R[r�nOs'����?����DbE@����Db���q��S����qrNv���h9��@A��CT(��V�~�+��K,���� ?�Ml�;G��j���q=E1�*`H(�����B�%�p@�'�m>{d��}����4�?�C������6qZ��� S�E2E^���"���2E��Q(pm���k�|
�o����Z+D��,���s�"�,Hl�k��i&i����8=�;�Md�c�e$��dA� O�c�%6�Z���h�����FR@�����Y��<��N����q��y@��/�h��h��f;F����K��f��~��
9��hoN[��;��;��=���.k����qc�N�D"�H���u��G�}�����o����b>]��w7?6U��G�&��C���;���������Q����71�;������B��B	�.�g����W��U��NEw��cH\P�i�*�G^'�����G�X�zr��dH���f>�1�!/^�]��@>�z��c+�$c�oW��gs����<�
}|/F�U�j�dCN+wu��S���a,����]=���H��zE���a�(���"�h��hE% 7������u>���~��2��c���V_�����>xO.�e��>�A/2c��@��J}�?���B��my������'�?���Y���q=���M�G�1��G�[���
�������(Z�m����m�^?^��2G��"���u����,�<�rIn�����'�vL�A����5�E&��z�A�;E~��?��������g�����l}�9y�:8�N���>�����mW�K$ ���2�^�
`r�N�
�Z��/��ENP�ZN�#!i>G�I��'h,NT1+\��B�;n�@0�?��1��\_P��[�*j�f��N�� ���X$�=��q����
��?dM�E�H$�6| 	�jN?Fp����
~�v��k%^S���ON��K��x�NUsv}	Kc��*��C_d���N�9r��L��7��N�s	��N�*�#'~���):yG7�:$�#�GO��=�^���7{����N��o����������D�!si�o,����&+N��.��6����v��^�;������MXI�5��O�S���P1Ov�o�Y?:���&	�b�m�=����"��D"�H��������w���t��w )�~T��_1�
��(�O��b��^���O���0^s��9F�b����|�"���#�'�^��'_�����[l����bU�x��__�*�\4�����r�o���tq��]���DL��'�#dJ^/��/��Z�1qS�{m����"K��%/���v����!"�s/�7�3gq��1����U�GV�u�]v����#6������#�|9��"�"^���	}�YN����,��6��7���D�l��������z��Y����w��y�6��\���C��d��i=u�iF=� �x\���/6�����]�l�\���t�gT��a;��9���L��~��W=��LEN5��?h W��
@S|�������yA�J�|���5�a��&������\�Cr�OEA��kC��������.��������|9@o"wn�.sa��[ris�&s��g/�U���xb�U�GS����/��<����d>�XQ���Db�`���l�;�hS��?�i��y�>�%p�{'�|r���~���� �^�P;�|�����/�?�������jA���S����9l���N`,'��6�x�~x����k'���,���L�"(����
�����^0;���p��C4��1z$��!�R=;#`wM�A�<2F�#���i�� �S��;y���K=FK�7C�Cq��y��G&�s~���W�5�U����z��P_�En|O/�[�'@�\�+
$M��G������+�H�D�:��H��C2a��]r��c^�L�����l�Gw;�������Om<���$����(���i�_,�����.��+�<��C�q����_�
��;�����SO=��b���|lxh'9w�����6@��;a��(�0W'��;���5��`��D"1v������(R����b�P�fW\�3�'m^��|��V�
�/90����1���8<�x1�yt
�V\(V����QL!>0&�����e�������*\+��^QG~"^W)���e/�
�6����<O��.���8q����l�;$����!nT�k*���yG<U���6��Q����%
�d���;������UbO;����t�<T(5�(��!�`����[Q��������{������7����E/z���[�z�e,�����G>�&X3��&�H������3y�Bv��M {5F�L�xmOM?�����.�S_t�mq07������8T)�T��|�
["�g3:����r�X���@0�&w����#G`'�I����~�UN��5��5��l�\�~`a,C�I�BO����?����<��a#� �K�Ews�3�c�]�����[q���#S����IxA�`0����'d�-�~���|#��������l���xr�	����=�|�����D�����	'�P��d����GQ�Y��k����pe��x?��4YQd.���?�:��
���X��[�?�Z�$��w0 zD_�y��?�?�K��� �#��J�ZP��g?�z�'��qlN,�@�k�=��
X��H"lL�lLH<:D?v���d��`�I������G��	�1A��M<�D���t�+�������@@B$Hx��_]]oL��'^��/���@c�}����N���1��g���������A���'>c�����C�t��b�J����G�B#��i#(�X*}���H�R�$� 
�<��o+hC�������7���U`���17�����}���*PhS� �|%�#0o��������B2am��x)2x%�J41����L��@���@�icE����MA_�	N���\����@�����{��t��� �.:���T����������?���W��U���{F�|�++yDK���
���)n�Qis����s�z�?�U��P���O����s�l��
�n0��O'������3�d~N��Q�i��\{��Q�Ez���u��G�$���9c��U�z�����#S>c���m&�@�Q"��&��*�m5�DbE��y�H$����[�.B��E;�/k��p������������wI�*�w���4��_���t�I^����S�� �/9/�j�[��_�����l�_��|���<	B�C�����������5g����b��1��a�nqB�6�4W��8D�q#_-~�h���Ch�*�8h*nx�K^R����7�O+3O��������:e�n�/=�qN�)
)(��"Dkw�
R��x1�"� vCky��x����,8��/c�CO���Q�3��\�+~}�k_����:��U�aJ�����8l��cr���8?����|�Yk��n�;��7o9�vr&:"�����)��i����S(v���1'}0�����'������u����w�g���;}�9��C9�<�Fg������ w�=Z�7v#�����"^tY?�x��/|��X����[���^�wO����K{
>������
��[n�(��?���
9�#f!�P�c�����_�������.�!7�/sB�����
��kj�nm������.����>��/�Ha��Vs[�<�����N/����z�	+�Wo���w�!�H���M�VzG��>�
*r[:j
T��������3���?��O2J��s�>7&=E�HzL^����W|rW'>������6CHv��y�C8��W��w�y�{��d�X�R��/w��������L.�J���2���3��F����)%��]c����;��
�O_��V����p;{�o�����Db���a7<�X!��s�7���#"���A������w��}"r���?6�6`�
'm����-��zA$g���m8J��6��D�4R��W������j�h��>m�`��	&�eL�H\9���FQF� ��0��0�R�V`�/X����[\h&3���2��3�>�=�<Z�c�+v|��'�/`�A�^�:�����^�-�@��q�>���C���0@��[���9r&@�$�S�.`T���V� W_u�Z�qb�O��!S�n���������A�>�o��
y�3���@T�sG������,&�]�=���/�h �&�1��?h'�$o��d%�D26�$d�|	A3o�O��F��<�K�F���;�����X����;��<w�]JoOw�>��O'�m>��{�Kn�S���=!;u7��c�A��Woc���}|�hm�>�M=��c^�h>��U_c"�����M�D"�p�q�����O���{����#.fv����
~qc@�H`���m�*Ljg�����; �`��7 6���8�G��_��Mm�b6�m��F
}
�r\@,c��wb~��(OO��Y�������V�A������y��Zq�����M�k\\����r�>{
����yl���o��)���G�!4p��M�z�%S`�7d�<D|#�)���o�=��F�  �)�D�=�(�s�1U���7���U��*�{�(G��.S�(��n���^��S�Q$��'����K~�p�3��#��x�i�i?b>s�.�:2����{Z�mQ1������z�%z'���>Uz6z�����)��CEK�n@L��`%V4C�:��
9
Z�t�#��z?�	�C��������C��g
g����#�S��_A�\��a��wH>$'V�S<������v
�p(4�Ga��a����n�o~���\9 7C�fks����TCktb����vy�����.)�<�3e����{�
6Xy���~{�]w@u���,u�"�b����)w�ij���&E���z'�S�����8�O>�mG�"����!�88������Qq�� ��3rq���V�q����( ���+u����R�g���P����2�.�a}��!`6�|Ow���G?��j� �uH��IO�~�<'+���Xa����eK���X������UhM$��YhM$��_�Qf/�S����Xv�4���K����X���D"�XV��tb���G����=8����<i��,L,���V��p���<������c��e�I����u���H����W*�z<��
������&>�4m"�H$�[��p1D`�U2��]y�����w�u��8�w��K���yzKb�J������;��I}�Rb�����X�|t�����H$�+����
���7�)�+W�6Pz��	�[�������S21�w��e�oN*3�?*�c���	O��L���g����Kb�1��M�������:F_���]�g���'����+_��y��'�A���[��7~jYm�CA�H$c	yGk"�w
������2g^�O��i�qe����C���������/s��{�h�n�3��Lz��K�:>�51�1��2p�OJ�}����g�6�g�W���������@9���9�]2�I�Xi����f�U��D"�X����D"�H$�D"�H,��Bk"�H$�D"�H$�U����D"�H$�D"�H$�D"�H$�D�Kd�5�H$�D"�H$�D"�H$�D"�H$�DZ�D"�H$�D"�H$�D"�H$�D�Kd�5�H$�D"�H$�D"�H$�D"�H$�DZ�D"�H$�D"�H$�D"�H$�D�Kd�5�H$�D"�H$�D"�H$�D"�H$�DZ�D"�H$�D"�H$�D"�H$�D�Kd�5�H$�D"�H$�D"�H$�D"�H$�DZ�D"�H$�D"�H$�D"�H$�D�Kd�5�H$�D"�H$�D"�H$�D"�H$�DZ�D"�H$�D"�H$�D"�H$�D�Kd�5�H$�D"�H$�D"�H$�D"�H$�DZ�D"�H$�D"�H$�D"�H$�D�Kd�5�H$�D"�H$�D"�H$�D"�H$�DZ�D"�H$�D"�H$�D"�H$�D�Kd�5�H$�D"�H$�D"�H$�D"�H$�DZ�D"�H$�D"�H$�D"�H$�D�Kd�5�H$�D"�H$�D"����~i���R��:�� ��_���\������R�g��������O����1��2p�Q���K���K�3ta"�H$�D"1��Bk"�H$�D"�H$�Db�b�}�q���q���1o���sK��?����,=����L��4f^[��S�]�Y�����������3~�����2p��e����_�H$�D"�H�2���H$�D"�H$�D"�X�h���*��I������{�������^�/��\����le�+e����o����;��tXi���4�?�������'�D"�H$���� ���H$�D"�H$��2�C=�p�C���n���r����y��
}Z��q���[nYV_}��O
��u�]����+�f�*���j�b�-��I��Z�os��7��n�������[6�x��������n��\s�5�g�l�IYk��JO�����3�y����e�UV�>K�a��(W�_���~i����l���������e��O�2���g�����o*�[|�4��MiL;���)�o�������1����e���g��_�2q���D"�H$��A���s��-�rHy��X�����O���(o����	���-oyK���k��m�9s���;�l������<���/g�qF�\$�_����>%����[9�������N���)S�����U��[n�����/,��r��'�D"�H$�D"�H�������*�x�+�b��������^��|���o��|�����������}����W�������e���w�w��]���y���V~��������{��|�3��_�r���P����TE���g�Y>���Uc%�>w��4��[i���4�_Rw�n�=�J7�����[z'�������K��?(=��Tn:����?MO����2p�!e������H$�D"�H�"���I��w�]%��z!]_�����O>�J,?����������m���g�o��U��^{�c�9�����
oxC9������i�O}�S����n�����?�
�x`9��s�6�\rI��W�Z����WE��N:��x���wN��S�Oy�S�FN$�D"�H$�D�5���:}�S�Z��{9����=n���u�?�<������}������<VH���/w�qG�O�����o�����|��,W\qE�w�~�����|p���?^}.����3���[���'�M7���gib��F���s����/����r�9s�WN�]�?kn�f���9����]����9��������t����`�&�w�����w���2p��Jc���g�����V��<��L���������Uw��MVw�z�p�*���5�;x�����N$�D"�H$FYhm�������d�j��6���P���Lt�A�I_E�����J
�n��]O=���@�D�k_��r�q�U�b��O~R�O�^.����������*�����U�������7U|��Ws�e�]������'>��L1����sNy�K^RVZi����D"�H$�D"�h
M���v�m��f�v�i��pp+�y���g?�Yy���W^��T�}��������}�6mZu����*�|�;��;�\v�a���V��]���rbO}�h����k�Y^V��?{b��{�Y��?4���y���?]�_���`������w�g?f\����r�����+��y|�e�q��9�r�5�e�U{�=������d^�zkK���m�Yo����;K�6G����4�~�����_\z�8��n�����'K��O(}[|y���Wz��~�]�����=S��g��v�����MC�'�D"�H$��,�6�]�M���~����/�t>$|��AEN����>���o�\~�����u8�{��WW�����~AT���Ozuj���J�~��P������^�n���6��sO���/�]������7��:u����D"�H$��hb��{����Qf���2p�C�b0f�w�5e�_�X��{Vi<0��y�����^f���e������-s/<��9�o�1��?��H$�<�WaT��)I�Y���yg3CIO��(�������
�����+�[m�Uu@�����ro�:<lly����[|�o����xic��R��������������x�������X�vo��|��=��k�����-��l�'n�W����������[����y���p7��Z�V����V�~���R����?Nx�#�VW�r���C��o������9�a"�H$�D"1z��\���g�o|��MozS�<��B��T����4
��*��R%���V�YER	��k�]����A(�J%�
�w�uW��S����5������U����o/�]w]�x���������t�:ujum"�H$�D"1j�7�������:g���S~3�������2����_Pf�zJ�{����ie��~V�����~k�WZ�U�������e�E��/�&�%�Ty���_���������<�1�Y�zV9����� ��>���d>*�;d�QX�?mI.�����;��iQ�~x��:8���\��������a�E}E�y^)??{N�����SZ!ug�����/�zv�7P�������{������������c�������k���s��{�?~����W����|�+_��W���d^�=��}>��L�����UAx�������b���	H"?��T��/|�e�u��f~q��?�q���^>��OTw���������/��~������y���k_�ZU<����_��W�K_�R���_��W��+��ry�#Y������T���������*��
X�_�"�����D"�H$�D;8��5'6��SN.�6�����^�q�!e�w
��SW/������u���]��wN��8�����e��?^�=j�2���-�6�����_J�`=�	;UE���>��/6u1�|A��-N��8���w�������;����k���|�s���n~b��~����7������^���/��*����
�]tQ������iOsr�[,W�8h'^����)S���|�#�����#��!�����<�I~����1��\��}�|�Ws�.[�+��9P6X��z4���{����@�l�Vo�����'l�W���q������g4�s�W&O�)��1P���������K�`��y�����S�Q�(sM$�D"�H$7Zz�N'9�H�;Z���%�p��;�O�5�wM'�t��;���*�����~w��W�2��JT�D>����w����6��"m"�H$�D"1��b��1mO)����f����������s~���m��4��&.�������2�
o-����V�'���2i���Ox���O�bfOu�H���L�����q����v��z��C��V�_v�WEC�e��Vn����_Oe��W�Z>���Ww�*�n���U~{�a����;�\{��U��.��	��q������U'��W�<�����m�+���������[f
����?�|�s��Y�����e��F�{����[&����*�z��6�+k
�1����&�7����uyx�c��|4G�����������W����|�+_��W���8<��m���V�#���wg�e's=��}�{_u���?����W'�=
I����|f�(`��b=&���H���LI��.r�!���{u*x�-��u>Y����Ws}�+_Y>���W�Wz�k_[N>����o}�}��e�
7�����x%�D"�H$#���������20����JY���.=��Z�]��2�����]�?�����7�Lz�JO����5��>�/�g��2�Y�)�O�su��S~SzV[������2��������������u��>w�GA����.����\��Nx��p��g������q���u����~������'U���3�X��%Olr��Gu��~��S�����$'�s�=�{����Q��m�y�H�k/*�"�<mV����c�g�)U���i��q����L��g�~�u�I=e|�y��?�gF��-W���?xxe����4�=�w�������>�H$�D"�X\X\������
��������O�~7.������s����QH���_�����O}��x��^V%���N�*����s�����~�FR����
{�����������8?���?�Yf=��@���o/o}�[�G.Ih?����#�8�l��fCW%�D"�H$���������ue���>����2�����R�{�E�w��J�*S��_P&��ee��U�6���=r���ue��;K�`�y�^U&l��2n���~�@ZG
�rR����l�I��-��R���wV�	��7�Y=��������B���S������n9��S��������;��cu�M7�T����U�9�\���o���r�AUm���������>��r�e�U��r��O��qC%u���s�+j��jx��v^��Q:��H$�D"�H,*<���J�D��3�(�H�v�iU��7d$��b�|:	,�T�T$�dJ�O�^�����?���U����\�7`~����;����]���?�z<������:��z��'VI�6�lS�E�	����D�G�%�D"�H$����Z���2��������wo�~�7K��T�����F�w��e��S�?�q�������y�`������P�N���?���a���Q�����[��y�P��Db�!w�a���7�XN:����|U�y��W��w��:$,��4��$��X�����o�:8,����P0�36�<uxx�-��
�~����������}��^44�q�u�Uw�>�y��r���_��o]{�m�U�����k�N,/h��Uf�������������9g�1�p:���o-����r�������9��|��;�����:��2����{���2�����n����D"�H$�DbC��
b���+����TI�$2N����Z��N�?����cz=2��/~qYy���B�����*)��J4A�*�Td�;8G'�%���u��1�S%�^xaux����No7'�����9~��w�&M�c�*����?�~��9�y��=�+�H$�D"���w0����g��O~���W|���w����R'���e�3v�+\=*�)O/�_��2a��K��IC��3u�2�{�I�������������ib�����}�9*�t��_?M�1���$7uw�G�:(�iJ~6G;9����r_���x�UV��%g�/;d��{���������=��#�"��_��j��';�V���w��]U�7���1��2p�Me��Q���{�.�6���	��}q)sf�)o|{�{�Y��c����Ze���*s�}a����1c:A����V��6h��H�D"�H$���@Z�@�w�=�T���F��I��)�:��s���{��C%�N���	am������~{���;�N;�T>��������F1�q�{\��&�����������Vm�&�t��HR]���%��z���\�%�H$�D"�H$�+��:zPH�;�-1����{����������w��j#����Oz����o\��GU����g��q�����nX����^����r�� �o����g>�l��U�^�"�6�9�g�@�Xz����r�s�YW�����V����\s�@9��9���e���e�������*wT�w����f�P��;���w�U�m��2����A>�N^������3e����:����;`'N*=&��;<q�@���s�z�p>�-�H$�D"�t�D��P�f�����]����e��H$�D"�H$�f�o�&�f�.���]����L_�����8���zOy`N��v_�L�S�\��LPS(�7^W��n)}�e�n/(=�&��[n*3~���oug���[�o��z��������UOM���2���V��w����<����W����(�{�,���_��u�O.�H$�D"�X
�B��V����U���X]���'����G�zQ���H$�D"�H$���Th���r�C9���=�e��y��V�Q��c��\u[��%���;�/�N�=zh�i�����C�RV��g����/�7�X&���2o��2aB_u�����Sf���2����>��e�
�V�Y�����o��W�M+w�Y�m�V������o{o)3�.W���������g��H$�D"�H,�j��o�z����������z�����M�����zL����_f��Y��f������<�)O��M$�D"�H$��2Qh�7o^��������J�W_}�����g�.�]vYu����q����W�7�h��oc��2�\~k�e�qe����&�����4��ZV�T��?������K�Zk��^��2p�me���-+�f�2���-s/�����W�q�~��1����������=~�e�?N+�N>�L�i�2y��J��_��+?R����o��o�H$�D"�H,�Z�u����3��L����^^��WT�7���7`�f���aQ�uw��4���]~���W�:����vK"�H$�D"�H$V,,�Bk��?�Q�8�������=�*�:<���)k��^s�5�/�K9��3����o|c�i������=�Q.�~�l�no���F9���U�u�G���������&���G������v��R&O�`4f]_�}��rL)}S����8�M"�H$�D"��1j��o����w����S�N���I��{�)G}t�g�}��l"�H$�D"�H$V\,�B���9��S&�y������:���������g�]�Xc�����g�51&0g^)����r�-�9��W�)O���\q�@y���uw6���+{<~|Yk�;���F�2��)�/4w����(�^���}e�U�o��ymi�|D�Y����_kp����'��;]����/����P�D"�H$�Db�c��5�H$�D"�H$����.�J�
v�j����Z��;_�?�F�n(��g^�w��m���l�������,��k���e{�����S&����R�N����2s���SzJ�	f�+e� m����w�6�����g�/)�Us�o��>
6�{�����3y������'�D"�H$KK�������rKu�W�Z���l�AY{��3M$�D"�H$��,����(��K��gp�>���������:���W���	e�)c������qi�`��q���3���o����%�D"�H$KK��z�]w��N:�{�����4Z=z�=�yOy��^W&N�8�i"�H$�D"�X.1o^�����>�4��4��	J����������D�X�
�%|��'�O|���;�xXQu�5�,���/��[n9�Ib,�;�S~~�����N�������;}v)��vl�������D"�H$����Q/�����?������|�p�
�c��2~���o�Cqu�]v)�m�]��M$�D"�H$�c4f�,s��g���SK����?_&O.����Lz��J�k��,���Z����n*���_Ye�U������o���v��L�:u���X�'O�]N��������8����������vY�|�t�
���H$�D"�X�1�����g��?��z�����hUL��wm�D"�H$����yW]Q��Ke��/��A�N]�������{�t��Dbd,k���/������.���'��������I��?.�W���qe��O(��V����T�\x^�{�ze�s^��PIc�e�����uQ��yDi<pyi�|T)�����S?�`�A9����U�q���b���/e�
e����^Wz��\z�~�������g�:��ed�5�H$�D"��c��o����Je�5�(S�L�$4�H$�D"�����2����{(��_�^r���Db������8�������z������SJ����2����IO��4f�(s�{iqkkc����9����_�u��X�-��T��P��;����W����-�;~U�m���2p�J�{[)�l_n�Vi�sjUdm����Vn�Ai�����D"�H$�D"��1��V��q���y���g�]f��5�M"�H$�D"�kh���9���5a`��Y3��$�'�[o���;�SN9��{������_�<�B�����uO��p������{�6�w�)�g�g��>��g=�L�m��O�>������O��Ii1����������-.=k<�z��Z��RzV{F���M���\���o�_��}Ci��������~yCE�A}��F��k�D"�H$��b��ZXo���r�w�<�l��Fe�M7}�k���/Gyd���D"�H$�D"�H$�U�v�m�!��}�ke�
7,���~�`�
���W\q�P��X��y�r�}�2k���`�M7��?��2���J�:�(�jm��[3��/$�O+�}�\���3e�Rz�?���N,e�U1u����k���J�����'��4�V)���[�/*e��C-hL�Vf���r�{�����W���u��/�_�{����M$�D"�H$�u�z��������2c����[�G=�Qe���z��c�'O���]J$�D"�H$��2�����m�������/���Oy��^V^���.x����e�UVj��������)+
������me��>]�o�M���KJi<xws����g�U��j��sK���������1���������\z�z����Sw�4x���3�1����4��C���N��+e��/����E�f���2���'����_�\Uf��w���-w�9�2�H$�D"�X���P	]��;wn�>}���n��&�D"�H$����g�V������=wyFY��_z�H��C=�p�C��e�:iv9�����'�/{<~\�������+
O��/w������2�I��q�����rS��8����f���q����N(=}�K�F�[w������RV��\��Rz���GT�~��m���}g��U_z7<p����1��������.e��w����^?4����sK������i�O^u����z�e����i_�D����
�{(z&M*�}�e��[���K��{����o��)�.};_<�.�H$�D"�X�Xb�������{���#�������[7�x������'>��e���C-�D"�H$����,�&7��B�4����*�~x������3m��ve�}�����`qblC��o��+O�����Y��������(��W�����:e��;J�������T������[�g�/6����kT���,������J�s��A&�[�����}SU\�����wZ�1�4f^=������^m������yN9��ye���i
}6����6�+�?c|E'������
��Ge�[e�5�H$�D"��c�d��9�������������M��n��{���g?��O��i��Z'�D"�H$�D"�lb``��z����/~q����\������:�|��_,{��G����Vbc��{�5����i��g��K������7,e�����#�"+�x��"+�M)=S�.=+o[��j���v[�/�����u�&UA�!EV�(����n�e��z���g��[���(��l���^wMo��/�W.�~`A���o�&�D"�H$�!F��*	����I'�Tv�u�*����T��{��v+�����%�\��h"�H$�D"�H$�ixZ�a�V��v�r�e��[o���y����K/�>;������I��>�Q�������f�#N�S�������g��n���W��~���K����2g���D"�H$����Z���W����UW]����>e��v*���n�����������U����&�D"�H$�D"�����o/��sOy���\6�l��q�^[n�e��
7�P^+.�e���s��:����ye��� y��k�:��'�D"�H$�����������m���!��{SA�
�(��bG;v�(����(�TAz/�C $@z�e��3� ��{IL���7�����ds���9S�������<���#((�`M�lK���Bvv�jKDDDDDDT^������!,,�H�V�d��!"""""�����N�5k���C��k�.�!-$�Rw��A��QC�%""""""*����`�����P��K�.���"##�Z""""""��J=�*�.]��@��#��O������U��C��-Qy�.�&L���C1s�L|��G<x0�|�I\v�e��%J=�*�W���zHuFg����n�I�������v��Vk""""""��I��2d���~����=�&N���{���G�u�]��a�&"""""���L��a���<y2~��|��������1""""""�� ""BZ��|��W�������?c���j�V�S�Y����������k=����~�Y��[�0�k$""""��D3L����������*m���kOZ��D��M����Y3�&""""����,@��q�^Q~��A���[{Do���>|��W��^/,X�U�V�T����;� 33�jq���P�z���/L���o��`K������Y����}���������uU����0�:�"���\�G��8�9�N.��`h��Vc��Sf�����x���nk����:q]7��@�c�#�o���"�}G�F0�7C_{	��}���iA�a����#""""*{�h��{�Z��U�Vh��f���������#*#���zt%""""����V:���@k^^^x�����������x��9r�jq2Y�u��yh���UC��?
�����1y?���h�����!h��f������`d�3�Z�B�p�[|-�<���a��3�{��qd�����8ha��6��i��O��Z��������U_l5��L[ �}/���j�m>F���%"""�3���BV�R/��"���\~��x��7��>���~����4�m����j����4i�-[�Dbb���T\9p���t���	��UE���p���l��QT5r
g�Y�7
F����
��E���[��L�q��o��A�y�g��a�5}��=���}l��C7������\f>��0}}��������L*�@k@@�J,���k�[�n8��s��.]����M��k���^�:l����������H���RK`U:t�W����;��)^/��{	_�Q�x�1�
��H/aMW��������Z@]��l~�;�j�a���\q�����f@l��S�������!k��������#��T&�MY���T���l��R_t�Eh���7o���~YYYVk""""""�����a��ex����y�f>|w�y'z���A�������/��P�h���U6h�h��_�{�E�1�
���axR�'N��Zhg�(Le���E�{���E�T�����a�J�f>�������2	��\��>�,���Yv��Y�c���b��!�����|�ru������������o��v�����`|��wX�`~�a�m��}����J�����������Pk���F���`dm�V�&h����$�>�k�Vm�Y��n��ls
f?������v���������@DDDt&�z�����Y��f��I�P�n]|���h��=���^�r�-�S��m���m����������IJJ���q�M7�j���={�Z�u����������d�5�������N�q�3�o�o���w=}�]����~�m�^�oUo�n���7�'�-��Z�Um[�g4��?�C`������)�@k��5aaaGbb"��Y�s�=���p�\j=WI/LDDDDDDT���N���WGjj*6n��6m�������J���D�������G���w\{�/a��l�^�-����.��1[�7`�T���Z��1�8�����5��������i�DDDDt&�z���p 66V���t��|��
����[uP%�*)����`��_�����������HP]�x���;v���GNN�.]�K��������*�R�J�T�K ���^���Sq�E��J����|�f��n���V""""""*�d q�n����/������_�v��a��u*���{w�%"""""�����B�`}�������W^��	�R_{��?~<4hM��{�?���j}���^
&~�����5j`��q6l���JDDDDDD�_�Z%}p��
�H_)����x<*����m���Z����������������^�����j��a����������8�Uveh�z����q�w`������P�f������>�,�����DDDDDDD����U��5k��A�C�QK�t��+V�P�W"��y���r&2'=#3��5:�~�G.����;!���
����������#��� m�-86�*�W.S�������U&���+W��g����;��:f���?����?n���]�|9;�DDDDDDT�����'����Gff&���{|������k��8���:Q����������j,���"p�m��1�#G�u|����q-4�
��d85A�����y?���r�z""""�/�z�UF�n��U�VUk���[�|����z�����[oUk�n��
n���Q�����]�va��	������+��k���G}T?r������d_i�+�����l�/qr>����~���WAVG|}h���W�[d4��v���`�R��(��DDDD�_(�@��`�Q��F)<<\�XZ�z5�=�\5�W�f
P����������3�����k�����+�###���<U���!	������<�[��dxg���������dn6�����Q�#��A�&l�{����g��f
������r��n5r>}FNN�cQ�+�@��nGLL���Tz`��*���{��k����={���W2`X��P}�C��o����lHHHP������Dt6������^�������������4�b��L�S����R��"������zz����������cdM9�����0rs�I�
[T��1*
��������|.x6�E�;��I�*x��D��w#m�H���������/����z�������>D�w��q�u/"""*M�hu8jt�R_z�%L�2]tZ�l�}���um����ukZ�������\���C�F�p�W`��jy��]�b���*up�&Mm�&��A�8������E/����7vw��y�a�db�q2�UO���	�T`�^��
�eO{��.A�s�#���|�^3�Vm����������g��-�-6����Zo����
�0���	y�����~���Y��E���t����A����{�J�|��Z�WOO���
-$������g��p/_b=��R����x���x��T�U:�!!!�8���G�
�i'|�$""""""*g$=��?�_|Q�~���*m�,�3b��w�}jy":��+Z�\����_����?�#=������#x�=������)��x^P�����/~D�G������Pkpu����B���p��G��1c&la!0R����;��V�r�<9��#���Kd<:FN�u�<�v��z2�|y?�Vu�L���>Y�_�{�y����z�Mj�Z=3C�+4���l�
�����Fm�(�7�"�<�>h~����u��r�X8�[���,�3��s��z�x�l��mGu����JG�ZeVk���q����W�^�j�_�d�����VY������������qF����������y�P�N�x���V�����X�������������)<>��E�s�@N��8�U�b��#m!���0r���I���=����;'@7�
��q9'��#��������,`dg�w� ���T�j���5���aO�������z
a�^�`M�?���������U������ k��H
V���~X���W���j�+��2	��-[���+�D��5��S'$''c��
�#:{�l���kX�G�>��I�p�m�����Ob���*[������b":{��~�����:R2t����/�{��;���O�x�G���s7x��1Ta��m�����=���d>��A�:�,���K#�w�����a@�+�l�f����~]{B�*�""���2��V/��48�7�g�rd�=�lW�p�m`�����G|=�vmeede"o�|��{>�����N�T��n��y�$����^x�o1���JDDT�$��s�N�R���#:t��N��\����+����k��:""""""��J����OW�e��,�#u5j�@ZZ�:���c�&���5��hU��]C��vT��p^s'n���U���<���Cz�pi;'��r�eM�f��
�:����6N4�^�%;M������_
�y��#B�����y}��=>L�������{�}x��<��(�v�2��"�A��*>|�����1��^��0��T���u�""������b���)��s���M��O=�����^�l�E��Z��������Q3�5�C������+�@���������C>���jV����Xe]�'�xB��*�[=�u/""""""��������;z�h�|��h�����_�>�
�}��!%%E���%.LC����a�m	��9���64�bCt���@
�������6���sr��~�
!�}+"��n9��k=*Ur���^���n��w3�\����u5��8s33�P�y�\"4<n5�S����A#^7��4x�����J58[���Q3�i���*.I4d�J����p��:u��� ��)�xe:���`MpI���\�
���p������u���h%""*%eh��hTT�T����d;""B��������DDDDDDD�Uzz���6l��������h�����j���.r�Of��s��cl'����7�@|�
�abB5YF��a��b�jp�O���G�L*H����B
SE�/�{��H3�`�f��p6l
���^+�u������u�
�������5��G�������TODDDgL�Z�v;BCCU
��G���V�V�z��F��W��I�1��7���Vm� �;v�N�L�L��>��I.J�U�x
A����:���
Q��������u�~|���n}�>>	S�S�=����km�Q�4��[l�UKDDDT�J=�*���m�� �����+V��j��[�>��<�����h�B�%""""""*�bbb��U+���kx��'1o�<5���O>��3��uk�����N���������3�;Y����������j���I�#�2r
�����JDDDT��z�U�'5m���r����7�xC�3f{�19r#G�D���U[""""""��*88w�u:w������"}�^xA��z�m�! �`�<""�>��?<�x��6u��t��~������a�v�~�����#3p����u�5���������]�}KDDDT��z�U�l�=z`��i����0u�T�q������g������Q�'����1y�d$$$`�����k��_���u��� b":���kv�ubl*pzMg'�6p�Gc;^�1�
P�e��A]�x�F<5����T@5�OC�����1���|k%""������v���~�F�fgg�Q�C���������A����Z�_�������������^��*������d,3UF����Ht��r-�
��,��������yV������l�bnK UJ�q�-�;��m������R������T5�U�2�W��p�/U$���*��v��"����r��?�������=f�
��?�5�ux��Q�X""""*_J=��t:��qc$%%a��YX�b��[wR��q�Z���F""""""*�bcc��aC��9���+V�^�5k�/6l@^^��yFD�C�t����z1SAY���������7���`��w2=9	�=;���!"""�����^�W��@����q�E��K.9�\{������9"����������G�����;����o�Y�gx��29���K�����&/�*��uc�/�������X��g���Lk�xF^>]������*DDD�F�Ze�Y���k��}���Q�F��lN,�fk�-T:a""""""��*..O<��~�mL�4Im�X|�ADGG[���l��+s��L��li9�X��
�}�i������`�3����Y�O������5����d���R�:t��c���#�<Rl�c�F��W����N��zb�caaaVk":��?�#;��@jj��ZK$��������y����
|�Y-*��*AvI#-�w�	Y���mI%�+YGR���,��H7�#��
�=b�0wB��h�A������`������~�
������V�Z=~���q�����J,r\R/>|�k�Q�t��1�>��_OW~��G���Y�"����]����V<_�Ad<�2_z9�}�d��2�|����C���g�<x������J�����������J+�=I��;}�:/?o��6�v�0c��-���L[����l�����=����["""*[�hl��y3���K|������*�f��������<���j��]��{�YYY����q�=���'���9s0{�lL�8#F���/��)S����S�NEzz�uO""\N�0��^Pd���Y>Q����n�h��������b�U2{Y�����������Z�7$@���}��.�<7:��4�����Y�Lv[Ap���^8���������Q�(�@���D||<���0f�p����5l�?�|���O���_���/��2g�Q���U�b��A��������c������/0t�P������>&L�����/g�����%������C������}����_����Vi��'��=�n@?�b�T�n@b�����5x�_M�����P/���	:\�M;����j�M���M[����.��w�k��v8f�[�]�9]HDDDe���n�K�,A@@���*R���K/����X�j4h�o��/V����������Y�F�0I��C���+E����:$&&"88�_~9�5k��k��,ODDg;Iy��B�l���J���:�^�Q�q�;���
`�`���
+�wO��e���>,���]����4V�h�5J�U*�����������is��b�$""��V��V�������5Icq�!�.����������V�P���DDDDDDD���osrr�����v��������@LL��cDDg��T)�IA�B�6���f�VA����x�+v�P5\CF���Lk��0o��[9U U��SN�W%]p��u��{z��EF����R�������W���+��e��tJ����ms��!�^���#*}p�Z�d=Q� ����P|�����m�
�J��};���kDFF��e�l��A�v�~1�������S��|k�

����	I>�=;�L���}��a�6����W+<Xe�I`�f���Q�n�7�jC��v�?���(?D�{�=��9�DDDT�J=�*#z%��y����3g�����O?��l��'���Z�j����,��h=Q�������'���NU���u+�����.�/�������cG�/&"���J;�����pSO�C48����N����q�a�E~����c�U-;�����aMsmY��{��������R�J�&""*�J=�*$��a���#��I�&jv�����`������M�b�������T&""""""����t��/��i��:��&X�	_r�%�:u*.��"`���x���P�~}��DDD�������_�<�!�������+����v�����+�@���JW^y%n��v�3�=����:�rLR)�s�9�MXX�u/""""""������[�V3Y?��C|���jF���1����{w4h���Y����0�2���O�x�!�������{�r��V"""�/�Y�u��jDo�����t<�����������J��Y�DDDDDDT�effb���j������sg���x����{�n��%"":���E�>������!""���I�u����0a����k�N���/X��a��yl���jMDDDDDDT>I�`��*Y�$���o_U/3W��������T�DDDDDDT��z�U�`MKK����1d��&X���^�Ye��5�r=""""""*�RRR��O?��k���30b������n��V�^�G��ZQeV��V�����D����F�'�����XDGG���#�Q�v��1�w=���b�N��7V��������OE��������=�\����HOO��O~�y������B��]q�m���������w�A�>}��W/�������������������sWh��}x����~�z���������)�@��fC``�Z�&##���jt]W�������W���* ���l��E��p�6ANN�
�>���*�=%��3�<���%Y�r���+���j���o�����s�NU'��i��a���h���
�J�����>>�ZC��{��W�~���U��Bs��U��N�:V
Q�S��M�d�l�Ru����Kl��U�i�c���3S�NUAXI#,m��������+��$��^z�%5�s�����+A�w�}U�VELL�����`���k���?c��Ix�����#�����E��L�J��U/��:u��7�xCS,X���|��:�7oV���������z�)x�����:�r}`��jp�~�p���n���~�����}���1+��Uv�v���'��[0�C�h����Z�������������1~�x���X�j���z�����DDDDT���l����o���_�����&���g���_4F~��"�>��9��w`��+�g�jd��<kV�b��=��*I<r�H�\.���Y���m����U�]I�`�.�$��q�F�����v��m��Q���,T�� ��{����\���>�d�Z�d�z�+��R=�����
�J`W����G�Hv+��sss������zM�6E�.]�}��*��\�z��2>�����z/��m%""*��$W����Zs��'��<�F���/����ob��'�mCDDDD���/�0|{w�^�����_0����`�
�z��<n��"������<�����k�G�~�<���g�DT�HPR�Jy���T�]L,�\��o_!���@hbb��}n�B-�#��H��L-$k�J@�A�'
��Q��J������[�fMT�R�:
���_���v��j[���6mR��W��
����/6lX�X�/<����-^�:���������ks���on�%�W������?���^���TA�{��c����A��Z-���{�j�r\�B2��y��VW�N�;���@�o��������U�U�}>����-*hY����Q%"�F	����b������;q�]wa��!h��������V��������d}YI�+K��:X�u���%`+������r����d�Ze�Wi'���s�9����!+���{�]v�5kf���jz��}�F�^k��b���k����S��V�/��E�1�j%""*�4��T����q�t�[�lQ3Ye�*�S����~�U8��G��C`��*8f~m������"��A�����~g�������Ff:<��	g�V��b���_��Y{E�u;��?o������������u��282�U����$ :q�D�����Z�X����S�|_}�U =��?��f���5����j����N��*k�~��j��9s�����$����*��Y�2cVg�@	P���S�LQ��dv�����f�J���{���pIF������j;�j=������
#u3j����Q���_�m�����&^����?����������^�B�Z�k��I�	����/�|��(�r��<;v�W�����������*����?�-k�(��Z�7�#;:u�f���t�����|N=1(��[G�������R�f��b���|��jV��O6��^��ot�p���_�5�"gi�W����S��1�/�	{\W��������w���0�#>��0�1��0$��������+��B
�=YtJ=�*?o�<L�:U�`=���N�*�S%�f�I������J�����!������M�j��Z� �*�Z���p�Y	o�Vs;!w�g�6�b2U~���V���,M�5Rk��������=5@Y���TY�g���*8��<�f�V�^]�D>�����2{��o�A�N��Z����3T���O?����1w�\��2�U��V���+5k�DG��O<�f:T�t�U���"�I������Z���w�U�Fi���~��T�&�#��|4M�m�oM�F0�����$4��b�oIb/�in����gZ�E���Co��W6�Q��g#�HF��6x�v�V��x[��A����L��Yi�O��8dU��$��_w{k�l�a8�5���r 1������������)�8��J�����x�wB�7�F6��;��������J_���8�Z�^Q6�P�������P���BB��j;�5N-[m�9��J���#�����]����hh������n���%����vi���vUS�X�Ey���U_mWs,F����.N�^���j{�o������YK�Cm[�����
���8�]r�� �w# '������u���F���h�D:J~��A���Pmo��B��^�h-Mle;�(����c%�~D���p�D&�E@R����������0�S�����$_dx�`�~�F�U[T������+}���@F���8��|�
I��-5W,.y��)�v=d�i����-�>Oo����6r�ZO�j�'�9��SVr|�HH�1�+��d���!�vA���p�g)�m�f��1���������G�/��[X��`������~V��vf��H^��'!�\4
?���,D&l��]B�v����"-*����W��?��b��vp��X�;����Z���Z��,�	������94�E�����J���Gr��E���|�������8���]�$$�'[G�������\Fq������8���W�&�W�h�x<�s%�
6����#Z�t�F��:M��3JDDDTi�_%����Ep6m��up�l{����-�����3Zss���Ff������Is���*XK��t���@kBB�
4�X�B�_O��J�RfwJ��<s��*8*K�L�<Y��*v���Q�F�O�>j���O$������f�^w�ui�MO?�4,X���z_�����t�R��SGOKKS�k����){�lI%���?����c��I�����K�.*;VJJ�
��y.�3��������������y5:[{g��v����fX{E������_���kR6c��G�������Uq��62��@������h1�cG�>�;�:RT��mp_�[P=�l)����0f~�/n��
Z�k`o������[�����O���-��������������_K^�vDo'tr��tY�M�������"f|G|=�;�C���U[��pt��6�\��'�S���]���:��+��t~#��+��1��<��r��G�j�t�^1F�N����ql�u�({�uf��)^^�>fn�e�U�|����c�l������+!@��v����AR.�f-�S����!��j����;�K��vDB�\7w�U[���|�Vv��N7���y�w������K������C�c�[G���q��y����='�&�a�v|��?h�of�� ���aYynV>~�P�`����x�F���������)�u���'���%��_B�8�:R�7v���Ht��j��xOv��j�������<xs~������]��x�!�/(�=���#�&M6?�w����_��������m���s�.�#�J~��$��m=!� ���+�W�We��t�d4j�~�N*����q�."""�����Q����A���*���N]xV-�/��y���G�x��Wg�Q;�l��e�VW��*�������c������r����M7��f�Jpq��	'Yo�0
oy&�������W����w���jUY/���fk���f�JU�	I7�����uU�����cG5�ZR��
I��c��.��Y�$+m��m��
�xp)�A\�3�m,�������,%r������
A� ��|e�_���+�Yce�N���r����<���/%�?!����O�bmU>�U3�|����Q�{�%��~�K:PH���F��"�����-""""*[ZH(�����B�a����EW�Q���-�*������N�_���[�����|r���1����DTIH��[oU�>�+��r"##����t�5f�4i��?�������J�+urL�2��������3U�TRKj��~�	�?�8>��3�|��HLL����@k��z�����g���I���dI���sg���Tk��U)�����f�R�
�����r���	��i�8h��t��Q�pJ1��(�������<\���45�_9��2�����P����;IF�J��P3|��DDDDDDDT�H�c	�v��
w�}�*�[�V3se�"�����+W�@j��C���Y%E�
7���@��d���K_{�5\{��*�����������'����o���={�������/^��\r	z���A�JN�FD�����%���}I+yy
y�*i
G"����w���{�R���gZ��������R2{T�h���Eff&�M��j��YG�:`���7n\.���ui%��s�N(��jg����'NTi��q�y��bS*Kf��?�#G�<)Uq�-�d�����`��k������Jb�a�����9�y��:l�kPQi�P'���]T�����}�*'Z����������B�j�-�h���6Pr��Z�A�7�%�� G@��l�
����B��G��Q{�����v����@+UHZ`C���[�if���]���bX����(�p�N��p"�fC��i�qT�i~e�8���l��IDE���V]�U�!�%"""""""""�W����:C��u� ��u���������V	�n�����.��Y��k!""""""�8d����1~�x:t��%"""""���?����?���
�rV+UD����k-Z���l������������_|ztQ/�+��[�v�����e�dffZ5E��vt���=�������IQ�a<�={��vp��������������V-Uf�hMII�����f�.X��}�222��4MCxx8�4i����l���[^/������#k���K�/s�1"��HR��5K�NLL�[o����'�����?BCC��b""""""��J-�����+V`���*u��?����IMM-R���T{)LDDDD�S��o���T�|�1r���x�~g�:FDTI?599Y�k8�;v��/�T3\�=Z�H���Y�&"��"�������S\K����Z"""��M�Z���P�zuL�8S�L�����/�={�,R.��|��p��������������)�e!B���������[{t�s6n��{@�e���p8�#D��n���D��ys������S}��5k)�[�FBB�uo""*/����Nw����~/��^���F�"��o� """f��"��IDAT��J-�*)�'O��I�&��s�Q��#F`���E��Q���];��JDDDT��R������tk��v��h��A��B���!��	���o%�x$%�E]�~�A
$<x0j���a��a��qE�w����H��DDtFyRa�l3���fV������3�����m���
#o/4o:�y���B���6��-����#���DDD��Sj�V����UW_}5�?�|t��
�^{-�R�\w�uh��)��!"""*���C���K|��M>�H8y��|��"�z?K��0g�7N���/����l<�U>^���)���\G����n���b� X�DT�H�V����T���=�?�x�r�}�!66��'�1��{���m��q��x3��&=�����4��R�ln}�
��<��7��������ql>���0���uL��b=��Sj��B6[�?�k�.�V
�?F?��cY�v�q�������c:F�v�i
��r����������s�:��:9�~����>�4;��(h~~�#Ul�������-�
#o����������������]@�r�.��5 o`��_ZDs���b��0R����m\6B8�������J=�jX3d����;�ODDDDD���7�m�M��P?���O�v�����h����"=��{��4G���cG�p
�u����e3o
������D]NNv�����fQQ�������*���������a��<V���Y�A��Z��f�P��o����;��k��ph�=�c�F�G�v��+x,"""����`�Y�&���0e����x��wO*�16o���DDDDDT����q���N�y$��
`�nM�����&������2r
,��Cr�G�6�;�|�X�FTq��S:t���S�j�*:tH�wKrr2���So����}���.���4SftX��p���Zo~Y�	-�/�d����s�Yw!4�?4{��Vf��@�nxW��o�5��;�4�>�E����h��iZZ��l~��g�8q"&L�pRy��g�l�2vF�������� 
���ah��[MN7����vu
�y`W��<7���cuBv����a��CT;��L�����O1{�l���G����I���[�n��s������'6?�O���a��Q��C�H[M7�x�����0���e1�-�AO�
�����a�=��m���4���Z@} �5����s.�[A�������(�@��_��S'<��sj���`�>}�I��W^A����t:�{����]�AB��.
�j����vi��a�>�JTyu�����6��m����h��*0��J��AT&�U���/��B�E����Y����L�\q��#w��Z�����������`o�l
����;��?#?��[��g����U-�5B<�
�����Ld{r�������+��6�
�k�V#}����F�v��}��U����W����%""""�����������*p���CU�T����]��\.l�@����������"����ihP���:9qW���������]����%U|QQQ����q�M7��.@�Z�T����Re��A�Z���E�{��5z��>Zd�j������Ue
���7�[��f�����o�����wW�a�=��Xrh5f'[BDDD���Yds���0`�����={"%%���W�9s�@�u�%�W�f!"HC�_A�`	�������!>�����c�N�V&����E�P >�O6���A���d]�Q�&��'�xW\q��f���?��{/��]���DDT^H ���'��%/��=�6e~=�^Z���Y�\	��Keh��{7~�a����\s
���T�3  G��K/����DDDDDT��/]�c/B�� ��g�>z�^zz����b���������8�#�<�c��!66����k����Q���uc������r<�b*�X0��x��/E�;�jEDDD���z����a��e�x<j-V��*��j���
��g�App0��[��k����������<�i =��~���N7�'E��,C�g��{DWE�s�����a��	fDt����p/�
y���w�v���k��HNNV}��'����F�5T}��M1j�(<xG�QuDDT������nuf! ""��A�Z%�������hT�ZUX�vdd$"""����@+�?�����a�<7~��5�.��Su���������4��������b������;���b��StJ;9XKDDD�KKKSK�4i�D
".$�[���v����m��C.�1�h��l		Azz�J�t�Z5�9=t��Z�F���v����k �����2���x�Ic�����aT_���d����������C>d�C�	���f�	I>Z������� 5Hx���j`q!���w�^���6DDD�G8��p�U�N�8��hu:�h���
�~��X�z�Z�f��
�9s&&M��F��h�����DDDT��
�����
�S���n �������v
����k���q5;�r_�p��v8J�[Q����[�����/��5k� ???��3�x�
�j�Jet"""��h�{��w
[�y���CDDD��R��*��d���C�"!!Au<>���������0|�p4o�����DDDT:��6.������p,����n���)��J���O?���/��ggA�����f��������x���/�w�6d���*������OD�G��p���*%#7y?���+��~==��>?Yo�Z�<1K�[S���y��A�����4��Y�����Sp/]���\^I6&Y��e��x��'0a�l����
CTT���.�pq����ha�`o�lqWCi}�����������VK"""�_���������:�O��W^yE^e��O>��_��(� c�$pr���G
d���
>j-���:|`7��1����dm]��-}����$H�7w6��t�=��
�I���uD�57 p�Ph.?���g�&��T��j5x6��w�z��vP�����K~������1�)�U`��k����`*t4��/5�'7���>����������;�|i*��N��QS������*P������x��i��U�5k~��G�\�R�o���c�"""��h6h�ak�	�W/����z�>������2�T���C��uU�%	�^y�����6l��DDD��Y����~�G��s
<�U�:���
]����|<�}>�����EM;z5u �|��
?3K���V3]�;����
�A�e�4�b����Zp��8�����	g��p4om�/0������u�n�[H4����2���W�N�E�y��_���`�{|]�y{\U���=&��-�h��}{`�����cx�����
[h8`/a}5�������g��e�V]�OZ��������*�2	�J�SR)
0�j�B�
T�Y�&n��l��
�Q�~�s�[9qi['�4����{��!6L��W���Q���|�C4�����o��;q~G�LV;�����R���vY�JD'���2�f~u����8���y<���p��8���/lkr�����A���a���Q�!o�K�����x���^Pd[���sB�+��C=O
��'>W$�;�{|���Ov�����+"b��p��{t��P�LY���B����oWi�e����r�m����_Fbb���������*�����N�������b��]x��G��7������ ��O>���w[� """"*?4	��z��� Uq3	��t���jV�
��!i�f���f�����Ej�b�������������^��0�,p���E��N��������76<n���S��'��|�����`�QSW
��NR�,i�Cm{��Q)������q���a-�����b�6m�.]�;���~�-���K2D��1c��'�z�DDDDDDg�R�z�^�X�>�O��:v�X\p����K/����4�I��DDDDD�J`��0���#�kV�]f&&T5��ep�o����W�e�M����IJa??�&���lA�pu�	-<��o�
�|��[M�=�������Y����Z��u.�#)����w�n��*P�����zj=_Y�WON������[
G���s������TJjg��r�se�o�>�6�����L�s�=�z���a�T�u���HJJ�ZQeV��VI,#~���T�Y)��lW�^]�����`,Qy"A�����/�������Ff��u(�V%�����m@�
�i��04M�r��l���T�`��J��SQ$�e�����C�����g�I��N]�k��o�^|����ju86Q��U����^��#�����Wk�:[��-$�|���^������X*d�pPP���a?a
]���z���.M��JDDDDDD�_�Z�N'�6m
���5k������
6 33S��*m������G�>
�7��f84.���{/�bbj68�������o��v��;~�QS�<�.��U������2����eW���n���[x���{����������	W���yp�u�}�U�����U�4�V���0+h-ObccQ�fM,[�L�eeee��?�D�5e��o���P;����V
��h�5Z����������~;^{�5L�2w�}7&L���+W��w��w���#G�u\322�G """"""*$Svv6&O���O�8O<����W^y			x���0n�8<��C�?>��!"�r��������1������e�]������DDD�wJ=�*�]�va���HLL�/���7�|��M��9s��52�u��%�={�*�����+��UDDDDDDT����a��-8v����{��1��O���~�K�u���������M���:DDD�Q��&h����������67��fa� ""��)�@�����W_�_�������k�p�B,X��W�V�N�����E��L�DDDDDDD�M�F��h�"���;w�TAW)�}j��q#n��6�/&""*�4����oM_�������]���S������n
������#k=|k/�wqmh����1�8�V7t�ki=
�N�Z5M���?"""T������p�l����+v�AAA�G�AV""*M��O`�07|�WP)�<��>������	�-��
�j�ao;�/���0�10�VAX}��0����ir���DDDtz�fU2�d�8pL��#fI)�=��#�m5""""""�
O�����v����Al#�O���j��{�l?�����B�8�����-�!��5��fp�\hY����QIh%""�dR2����{>�����6#����O���*�^�!U8F�N��&@O�x�X��0r��f��]5g$����@�-�lu����fS? ?���py�S�Vh�P=���V""�J���v�0g����Uk�����T/qcw�	���������B���"�@�������d��a��ZxOY�ad��������\����+�[���E~�u�@�?"�C�G#""���g�V�����ddd����DDD�?�@����x2�DDDDDD�3Zxh!�{�UY@�]�m�-�|��BO-�-��O���������]��t������u�#g����W�n���L�DDD�w�$�����z�jL�6
@NN&N��!C����n��_~���<�5�/<��4�s���=3�U����WU���7a+�|~��|�������+�����Ta�@���T����HJJ�����o��N�:a��q��gQ�rU���lh�Tp����
[�'��y��{a�q��^���<8�M5��`�;���j���6s���#��d$"!m��QI�$��m�6<�������U�t��%*���������a��&""""�(|�� �����������*�S^@�S� ���02���t�s�Y��GF#��I=W�m��cTq������_��1c�w�^,Z���?BCC��o�a����
QE�����o)6����#8���������=u������JR��VI�n�:5�w���h���
���QO?�4�����`�]�V�!""""�(����g�j5+Q?�RPR��;�y?��w/NQ����w�N����z���R'����%p�-[���Q�F����P�Z5����x���� ��G�Z������W�����^��+�a����2C������������2	�>|Xu<%������K��{��*�Z�J���";;�^1��KKKS)��[n�			�M%���L��~g???�i����Wi�eee����Bxx8p�y��|�y���3g�s�^x���������.��y��""""*M��;a��X{'�%���f�����q��U���Q�#}Z����={��������uk���S����I�����"H������������C��/��u�����N�Z�v;BBBp��1<xP��o_8������Vi[�I���nP)��x�	<���X�f����Q���g�N���2����>B���q���������1��}�s�=*���f������?�FFFK*I��`���3�|��:��x���_�q�������/Q�:�:��1.�H�N�f���Q�#g5MS��l��;w�D����r�p��!����_�Q�V��V���-Z��2S��~������>�@�n���\�-^�X�X�����s�]w���d]�r�
x�j���X�p�
�N�0�{����LI���L�A��� �#�<��JPUf���=[�?	�����K�.h��!��m��7����6m����q������DDDDDDt�I����(<������;�~�^��c����[*�SLL���������*�R���-[b��a*E����`�lK�[I�{����U�VjTpy&)����5U~!�p�5k���>8??_����h��Q�;A%`��G���������/�SyL����;i#��ef��������c��;W_�g���DDDDDDt�I�& +��e���I�T�`�~����JDDDDDtv(����M���K���/���_G�>}T �V�Zx���p�5�������V��������VmAG[��F>5�*�Y�pKz�������%Z�jU$���������ka�YRO�Hh	�J���2�u����>����������uS\""""""*�������>��c���������`${�����'�.%���	7n��+��{�Uiw���~�Viqiw�YSV�T� h!�DK�cYgU�'*\?UR(���g��}�^��������dO$�Y9&���n� ���q��w�f��j=��K����������
R�#G�X�BDDDDDDg���d��,+#��H���?�j�*U'}<""""""���$��m�6<���*�*k���5����O?����,�$H*�Q	�����t�>���Ow��6�#3^%@��������G�V���;w�C����o�v�Z\{��j��������T����������������>CW������k2���%R���=�������|NL���b��N�?P�	_?�����CDD�OIk������_?\x��'������jMDDDDDD��f�����������OTGTfa�{��*Xy"	0�62������%Y#������]�T��p�I<f�5���T����\~���T��^�z��2Z�L���*���J������+���Srd�����d��v�A��������MS���W_����j���������/�Y��s�$==}����;������N�^Q����'i���$��c�.�4���kJ�����<�yM�������b�x��\k���#���0��Z5'��nG����K��>.
��58Kx���o���n`x�$\�6�:r2�W����`��hU����s6��Y�'9����|����kv�:'�Z���������{�Oh`7�I���Y����5�I��pa�T�������9�#0}n�a��=hd9�����4`c�UQ6\�/0��������{�\�oyN�������|)����?��1���6����I���?��&������������'��,��b�����~��c�s���.�|��;�g��U��B�}km/c������DX�w�������"��������|	������S������|�S�����""�mE�|vV���vZ{Ey/G��g���m���f`�-���;�j{�����$>�T�jr>����<�y^�Zj����#������_�*�5��\��
�
���/��#�v$�Ni�����������}�0`��h�B
~�%bN$�=����%:S��3��������������y5:[{g��v����fX{E]U�hw��wv���c=���G������O��l�U~;��a����^Q]���}moA��8���p���"%���o����nzTko��>������p��k���G�vb@'|I���$��\j)*b�'p������m���?`9�m8��P��V���w�\��i����^�;[�`����c:�Q���.
x�
?uM(����~g�u���;� ���0rv���N��YG��wZ-����yq�;8�W�s�Nh
|��k��-����_��8��K};�^��p��"�������|�8\6@m���4�x[���4�����e�e�!!m��;�:R��5:bR�qe�8�n��O���h�'%.L�����EM;�����������<��la��������u�([���U�I�^���^��L������~2��GQ+��US6�����7?��f�yn�����N���������~{����M[B?�%����#Eiq�`od������T��=�:R����F��=�����y>���Ff^�}�V��x�����C�_P�{��t"��;p� ���[��/��iAM`k�6����w1YV���%��po��q�pm�*�@�'%��q�F<��#�S��u�b���o��&,X������u�����\p��P�-$m����a�T@T�K*`I��r�J��1C�J����zJ��s.�Ue��\�{�9����EOf�����2e�
�J{��:r�H�oHpV�������g��(	�.[���������q ����g�b��/�9.����-���F���k�+v��.�����-e����ov;���\����*�^�9�����68���jN�<�v!k�:��	��|��J�a��~Sll�p��9/����g8�"�l�����T,��b��YGO���[~�6��)}>�f���H�)��k�|�9Y��;q�0��^�n���Mm����!�!�s����\����n��_j��M�}����aCwwS4��<��4$��7�Kk��k��</�����������/��v;6����
�"�o�yN�@�y[�����se���������>���������y��
_?�����S�����V��������7:,�����T�V��@m������k�vq~K��������9��$#�/������|��*������X����+��_"��Xl��s�k�fm���o����$���Zm'����Y{_?EU����qn��t.8��@�������w�����@T�h-�E1�z2Z��@����b1��Z��@kQ��@��Hf[�lII|����U�V�z����5w.��b<��������T��+3\%�)AR	����AAA*8*3^%+���;U�VU���s��o_5�U��� ����z��@�~�i�zJ.,��.lFF�
�V�V
�F�Brr�Z�V���s��#���{5j�����z��<�C����x�?�5,�����nK3�Ouk�|����vq��Kao����x$��8/t��T?��[�$��:�������������M���������R�3g.�A������'��~`�u�6��[���xt;^Z�6���i���Es������>9'�V�q9�;�����x�lT��c����9��s�0o�������<���l5����E�
��d��fG�g���\v'���	W��k���V������)�%m���"_���s�k>_�#3������#c�:'Fz�l�Sia��sE��:/�yn_��������7��SV�����M��B��>��y�>T�%.�dL�������>�����!�<*�|���������$+���+-���������r>���D�����������_�|�y)��9/�_?EU���gZy���7��+��T���T11�Z<Z�b��d���V��b��/�����h-��ZK}�V�iY�~}5+��?T������x�b5�����*$��t�_�u5�����S�w�?�|D����������
���U	�^u�U���2KUC�%�*XI�;h� ��?_�����a��j����Bf�&$$���.S)�$]��������j���.�U���M"""""��J�X`�9s��+��c��/���j�1U~�h�5Zw���fl�z�C�����O*#F����sU��N����W����� **J��z�m��m����^u��v�
��,�g�ym������5�\��]m�������T�y��gU�_��2�=�������I���Y�]||���@���c��*mp�N�p�M7q] """""�3h��x�������W�^��&}��"}2iCDDDDDD�_�Z%�(�o��?����)iwO,2��}��&(����f��������
pYEhh(�|�I����=z�@��i����Y;U�����S�9u�T�
Xf��JR�LV�%+3h������K�W�	���[G��2p��[����F%""":kI�O2I�`�IF��x��(�����U&���-[��[n)�-,��
C�f�N
������8��d}���o�DDDg
.
���V��8���O)2�V�ne��J���5����J�r��������e�5�Ufa�l��r������/W��V���DD��:�6���ZQ�IV#�5\���v�vZ����"q�p�2��*�?��k��$Y�%!!/���ZV��"������d�&:�����]+9�M��k������JS�\���q#�����Y�h�����~�
���+~�����!22�3Z��N�a.j��+7�������2��;���`Nk!"":����������T�5j�V���L�����/����^�i'O��o���}��O������ �5��',���5�����]^������������4�zd���b��u����W_}�={���+���#p��!L�8���h��A�Y�����"���jjka	7���gi���;3�LDD�T���x��Sx��m��ZU�ju^�������H�%�I2[u���x��g0w�\������7on��fT�Z��V*u�b���^����w���CU���[�=��mo��V�lw""""":��$�z����SGS��m[���N�SuHe���W��DDD�������2Y��g���v�Qr�� ��-& W�;77�Z���/G�jm�d��������15i�D����sg��
��_�5k� 55�jMT:l�
Q�����sq]��U��A��i?��jEDDDDD����r����OSe-��qc<xPuPCBB�L�p�V""�WbC5�k�@��v����ZDA�m��c���J&�d�|q"5�Z-�I\.����]�6������L������cjy""""""��J=�*�V����:��~��JGTf��:�k��U����z�DD�2�;���v�!��
UZ��������r��E��N�������5�p��r��_�"�4�����Q��u���B���Add$���k���oe�����c������Q�[""""""��J����Tj��5Z�h���g#11Q^;u��'�xB�k����f��q�V"���qU�l�Z`�u��N�I�����`�\�������k^����q���\�����m��U���@8"�I��K.����S)�����=z�����I�T�766�jMDDDDDD�Y�\��N�m��������WW��~�a�r�-j
�Gym��QAY"�C���W ��[�w^_��8����R'����D����v.�o��n��KO�c�d������dM��pe'u-(�8q~b�d%":�dm������'��}���K/����O>�${�1HDDT���������xer�]RK��[�nj�jjj*6l��w�y'�;�<[����{�j��
����[P�m��cg	��n�K�F�uC|�X�<0�����Z""�
G������5��n��'����x<$%%��v���.��Tja.�CDDE�����9�n�Qq�lz��m�p����I�&���7�=����5
���t������O�-:����bnK]Eu4���?�c��������:����k^���Sr���n$$�x��|\g��mN>0}���?�1o ��*p�h�����KO�R��
�s`�v�2�}p�|���N��v���d��N�������XG��������7n�8|��7b����6m�������Qyv}�KP;��6�US�o��G����V��%""���I�u��=j���[��T�*��r���~<�����a���������~����!;���#:
��%g����G��s���c:W�������7����� �U���^�������Ca�nv����l�����&2�D����f/��3��9�!�9��y�O!�u���6�j���d���3Z�������c�q��Q���;�������y�|=X~x=��}'�_���[�����._\�?���)[p�y�������=*���I�2{���>��O?��;v��c�����a��9x���������w=�������V7�����2�� �is3�4��(KDDtZ�h����e�Tg���_���U�`I���Q#����
^�n�^�u/"���T��
Di�mC�y�6�%[@�'K=�Q.~���9�j-����B�d���\n`�A��jD�`3t��� l��E�<�YD���x�3DL}!�<�.��F-h~�V:l�s�uL<�a�
�J*)�C�����B��a�&"��4�-�;��&���W�o�~�i�Bkz&t�{3�@�a�:1+	3����mnRC}�������M4�f���ku������;������������P�uZ�y�4H�o[�j�n��V�R������/����%�����cm�V�����6}�{=�w�|���t,:�c=����`n��������<�|2���Z�$":���5�75���4�����U�j%""��+�@��Ys��!�NM�j�T��lGEE!22R�f����fL�����{}�u[�����)C0��K�|M�1�q���a�i�f���.<p�?jF���?�#���/��y+UW%��z��u���5'#�`&��=>�d��@R��5�����CV���b}v4����_��2�>�>8�n�@���3)���K�{aZ��������e��0��8��nl�""�b���U��&3�U�pU5+5d��Za�`8���yT��i{����Of��UoaG�>8�����)�g���_�.�s�au�&��g 6 ��b����;r����z����uZ����y��j��dq":vg�J��;���8�F|��W��
fL/MZ��G�����"9�(f�Y�9f���u{c��Xxp%:Ui���,KZ���JR�'""""��]�Zm6���*k������V��NJJR#�CBB`�M3HDt���X���e;|��������^v��Z��Hq�~	��s�9/*�p\������
lJ���v%���� �������WDX�t�?������]���9�#��Y��f�`�*���������?=X�O��M^s?����d��f�V�\����DDTN8��6\���qPNd�ZI��3�"�!��:
���4�-�c|��1��H��P3Z't�W��������Xc����Y�B�����P|����-$}]	�J@K�T�3KPx��}j���"����V���~����H{\}��ii����K����������LuL�������s,�
��4�����f�F#���0�8mfG��/�:��D����7�C�cl���,��]!�	�D��x|���69��Z��Fpu��
S�Qi(�@���D�������RK�m���������K/!//��5S)���J�����_K�c��������`�>ZT_h�
�wA�u�����s]���-j��Z�/� �
�4�����l���xo����`M�~� ��K<������
���ih\����R��_V8�n�����.toh��$	HK����c:��uWutb����ro��4�3v�~:<>���[R0����if;�DiN��V��D������)�d�f��!��Y�����X���0�;���|����f[�9��r�]���,^�$*5���p�4?���������Lw�~*�o�7�������N!� u+A+�Y�5|���;����y�
�����yi�x4d]��G�:��bccQ�J����5kT���?����3Q�V-DGG[��7	f�������z�����;O�K/�K�,Q���HT�&K��/��\r	>��|-�}�v�y������p�e�a��a'=�<��O>��C��"�$P]h���=z�:�g���d�v`9����9G���YX|p%���:��� �6�%��O{a��m�i6�=![Rwb�����=����=�������
G������n�nv���i'"""":�J���t�[�h������tF�������G��]�T�K�\ ":Y������y�w����.4�������-�A��=[�`k�
l��Ajj,?�ny+�i�%m�X����;P#RCL�'�};Z���s}�5t�Um�
<66�����cS�V���t��v�m�Du�1+����e�<�5u�I����zq6x�x�M�������u>l:��j��|������l��5T ��t�V������ �_"��d�FR�����^�.�R+i�W��"�|m-����C�z��k�k����N�����\`���4�G3��OD�o:���02��qp8�kx.��]���������L�#y��i�"�NX��O�|;���ML��|��xq��q!�?Bj�Tm���q���B��6;������b���j�]w���2���Tk�J�6(� ^�I�Xf�v��	���*�L�����?���%����?�����3f���W_�g�}������*�Wz�!>|X=�k����,�s�=�\I��b����6m�~�i�\�+V�P����|���h��=6lh��g�,w6�e��c;���N���
���R,8��|��6n�X-��'#Y�T
�QAT�	��V��K6�5gU�&�F|A�
�����Z������(k���q-�-""""�3�L��H��~�����_�+�����{P�|���ZQ:�DT��c4\�����;Q����o��l�u��w�Vd<5����{���NOOC�#{�d����r%�|9_����Zdo�j��Ve�,_���32�m�@��6\�}��n�9f}�v��j������5s�um;l'\3��r�s};B���FR$����>����>5�T/p(�@�v\���Gud�j�p��v����,��P���q4�@Z�������[th�k���#l����oG���
�\���z�Y��P���u8��C���;���W�w�e-�z-�A��t����Z
4���3<0��B�6
�uW@?���E�j�pW��:����T3�ZF5B�����Z\����l�J3�,��kx1�6�76�L[�40���m��_U��iT2Y�F��'O>$�>}:&N����;��+*H���*��v��������?W�`h	&����}�b�������
��l�?���J,�Q������Z@��=1f��o����*�z��A4j�����_���),AX	`/]�;w�T�
\�����,5����5��fg������^����F��f�|l���<��	�B;��]'�:���&�������e������|y�>*e���#*(�����2�2�!�mx��{�Y50O
�Q���c,�DDDDt���7k	�6n�Xu�n��6�B��/D���`�""���d��ucmpd�"��)�%���|�j%���p/_
�.�0h��|��Qx6�\.\~
�1q�~A�>/�{v"o�<���#�z4*O����v��K���fI�'EW������kj
���:bBlhg��C�[��r�Z�6,@Cj�����m�������]�ude{�g���J5�h=K�s�$A~�F%&��%���~dPFa�A���3���|	���E�����u�����x�*�t�K����g��o�������#��^�q�'��hYM#�#�?a�T����D��*h�H��(����V-��n��2	8������
�z<�0�{��M�z�T���k�Q���/F�
*��8���j���5k������� �g���[I?�c���������M���N�:*��l�2����K[��*�W	�����@�SO=�k���k�V�=����bp���D���\����~_��m���{"�������:��k\�f�?�a$>��������4���Cf{��n������67��[+� g ������_.W�����O.x#�_�f��iehu��j���x�[���|J��h��5l}��wTg��H���!=\x�Z\���f'��#��D�:u3[�0������=���$
�
z�1��\����D�Cw��v%�� �O|���Y�
�
�I�A�5�g>P������%m��(�-g#�������
�P'��v�v�� ?�����k=�}����0}~>����V�l*0/�
��(?�m[��#�|I����.�����O�?��m~�F��2O�#Z������:�U���U���:���nV9�������r0nf�����>�{7s`O���o��t��!\�
������5�A
2K~s�O�f�Q.����f�Qi1_��[��p�Y����)�Z���"AAY��_��!Cp�
7�r���������#p���u�&)~%����m�����������K?�8�RA�5jX5�c�q)r\��d&����o����]�����>�L�	�%�����9s�,�+���x��l&$��~jp� ��9��S�G�]�2�B�h
v"�/D�?q@���*uA��m�<�������� �/���!���{Z~&r��!}���$����4���<o�Z#:%��Z�Y���?�����BDDD����K't��yx���U�JF�Jj��[e�v��H�;Ah����~�J�;�#'���?��@�D�}�!`�
���W����g�����p��� �'��~���K�5���'�wZ[��a��ZH@+�K��qcw~��C�l�K�:qi;'.n������qA��g����w����j�Z��(�Jp����gwb@;l�G���	Fn�ZW���[��h;h�>���"!'�$��t�d%���t�%�������T�1/��U�ui_F�q���N����:�R���0���c�����bT ���_�W�d�O�����J��`z��^3]���/�Gu��Z�[���u��@���3_>j��hT���-�jPC���V��`���G���������7n�{�=5#T�Z*����r��5C�����o��R��������)���O�+AZ��[x	�����Y���U���S���i�����U�V�5n%0������������w�}��7����Jf����I.A�����Uq���E���� iS�}+b�������OyO-t ��\1�,�j��9�xi�����-<��M���;������������b���T;Y?�@�a����?��-?����y�g���W�n��c�l�f�_��%�sT��{<�6*$��
��U�2������e���o���������Y{�
��ys�t�w�g-�"����+++K���0x�P~^���r���~Zx>��s���y=^dX�YV%��}O�����K�u������5����������\a��*����E��������� �:�}:�'���*yy�'}.���+x?�r��_���'���wy����#�L����g(�"����C3��<R	�D�������_��5�n�g�G��SwK2�jtk(3���>�mIb���i�|����vq��Kao����x$��8/t��T?��[�$��:��f�iu;n��B��6���5����R�'��+t�hhz���[GNa������U��G��_��Sk�GR��n3����"�m��Y�m�y��7�����Up����_�a��\1P�7����?R3]%l��x�P�/]W��0�,��M��w	t�~����s���������@��0rw�V{��/�}_��Y=��d4��67��z}�������K9,�X`�V�|�\�2�-I�ldd����!i�w�k���^�&4��S��������=�$uW��*��:����v��;��f���+�V���n}S�-�����wu8`��6W?�����l����~]������e�zO����q6i�`��8�[=q:��c�ZZP3��>
_DolM���v��.��n=~v����%u'fn����P7�&njr%r���~�||���-8������ �m-��C��fH�����V����0��+���9}�y�-�C�yT���#�����mIV���*����K������e��������oVxU ���N4�bSk��^kv��
\����u�*0+k%o;�����*`-k#������>����R��"�[�-���t�.x��!��$r>��T��S������7�����:|�pk���i�&�9R%]pEXCTf������������;H���z�y��A�b���j��B%�v���L'����a�0k�,�������}��W�,�������2�U��o�Q�v����>�\;�@��m���O��>P3k%�+3o��Y�fV����Ow���l�7�^���y2��������
���*�����p�dk���!
0��%�qEX5�����>22R
��}��3t���9��'�W�N�[����o���eD���x{���Z�����������9�p4/U�_qx���w�%�Ck�G���=>$%%���_�t
���7K�;\�<�d�v4��������R|
�j5�71�����k)�y���'�'��A��lE��E��^��T-�kB)Y<�K5k��U�ps��t7����J�n�u���;�/��}�M
��XG���
��z�3}>:8i�L��������F�������?�Zc����34�����C��!�s�o����������}�v������R����� 1j*�������G�O���.�)F��Ve�(+�r��4�3��wFz1��Q����k�J����u���V��}�P��!�K��%�?�?���+�������`�����]��/~(��EY5e��UQX����5���e�����t��A�����)����b��y����7@p�\TM-��Qf��H{�-o�����5��t	/�u��4����#��)~f��<��#Ym��3~kJ�fc~�d_z
r{�3�O�����{l��N�v�ER���w5���1m����zD��u�.@��t�����U�@��Q��V�L}��'X�d	F���d����c��(yW�5w��u�4���0���}/��9�����/���u��I��������{�Bx���aDp4l�����ZX��~���{�������F�F�j��X�V���lD�o��j��ACo�&��/7��m��;�<WY�"�x� x� �����Q�!u�#���{=��5��Q����j;|	����Vi��_?�|����<�%��tP�U���������@�[T_���l��3iV%o�[����CT�U:�;�����1�s�\V�7f'cW�~�H��{[���$,?�9�<�~�t�6�P=���Z�
��c��(Z�b����hMHH�}�����KZ�\����W�W����Y������I���u^HPs���*����~<PZH�X�����������
M�:U[g���R��WX�h���/�����~X�q�l��^xD���q��W��n�>}��#���y��u�d�I)_� �02����"9��Us����x������ow����k���1-pO���c�T\<��2�����U�� ������]�K��MGw��m�����Z�`~']�_�/U�����S��K_�hn2<Y8�Fg���n��73�����k5����(�M=\�������~�U�����{*�W��V;���p�����u�d�_-��^��_��!f��M�mO%)���������j���4`�%�:��_h�i����}�GoYG�r�z']	-7�������u�����h�I+����q4��A�Q;��;�ik��-�<7GS���#���>@X�������u�(��Qp\x�����Z�6�}*��<�>��;3������#Eu����Y����L
�}H�*N��g�i5��l��N��e�����%��{`K~�:R���������7-|��YGNV% �w�AqVM�x�
��X;������W�5��#�h�����������5����p���:R�/j�u������������#E=�fzW�l�����j���*a�{����W|�v??�%���"�N���������pm�o�����F���
=�-�\�'��a)����� �$Fi��H��<C��P����S�N���P)�d���>�H�JR�3DDB��bC54�bW)��A���*@�l�BU��5u\���V��p����R����l�^��t����U[5����55j���lQU��jb~{�a��_����)����l��U�f���Y2o��P5�7p�p��zN6<kW����x�`���T����\~�l���������r�Q�������^�B�p� +�fg�{����s��Z����=�w@�*�N
��5���B�+s�,P�����qn�����9j��g�*jd���D����\Y���NG��J�&��$)�*���[c���*x*e���

R�K�ez���r�\��qqq������r_���8sTf���p��*�a�����{�ZG��o��{7Z�h����G���)������Z�2�5))	M�6E�*U��I������M��,,,�<��Cy�w��Zd	���k�2���V�"�����r-������������qU����89[��E����CT�M����!�/��u����]jmhD\�D�a���xf���l�J_����*A���;}����Rm���P�BJ`�M�g���K"������<�I����/�r��S��;�<w����l.�_�c��	I�:�F�������D+���{��</�����o��h)|��=Gd}���S�)�eN�p��s��q���s�t3�l�kU��I��=�~Tx�N�q���d��{���������^����?������_�w�����Ox��U�����|��=��/�p���N��9��IF����\Y|��������Q�o~��*�%�y,#\G��R�Xd��tR�._6�=��#��!*��`~?�3�I�Ju,�>���v8�5TE��\|�G����{��j������[�s�Y4��Z�����u���0R����S*��/��f-�h���E�8���WU����=���-4L�P��<H�|='��h��u6�Cc��G��N�	6�-����e����1������i�U������_��FC�3����u{r����p �%60
�juC���l.|��;����gM�r��W�^j��������,,2s��V~����(�����,u����5k0o�<����"}���7���r�D����@���@��2�;w�
�J__f�J��=z�����s�
��:�)))�q�|�kI�|�
y|��u�����M��2X[�e\	����DD���@�Q�n��K�@��Z���w-x
S���f�kM���[zh5^\���]�6���LO�Z���{���W�����������jx
�����GDDT��z����a������gO����1cN*R'k���"���ql.|k/�ou_�;���u��A7����lPAf���� ��1���m����mQ���u���7�qC��P��s���S^�����V��E��Y��/>�������`h�Ad�w�>5�[��*0zI|/t�k�@G�Q��_��	[�v�ml3������������.�m�X�lMw��Qy 3B%���_%�\�~��/�����_%�y��W��Xe�����[m_z��j�Vy�n�:�"��7�T��%H*��%{�w��2�;wVi�q%=~�x5KU��1B�~���������2+V�r�5�$�<�Y��J�a�yd-���[� "��������/������.�`l���5��v����V#�
���5B���,��^�_��������Z{����:�	.���C�cy�:��� g���GDDT��z�U����SIt�����k�U#XO,�1�[�.�DT��+`�-���5�;�q�}���������c�>���>��gf{zo��w�EDAl �QAD�^QQ{��EDDi��I't��Jz�>��{wD}�����o^��]���3w����j|"�&?�������N�5W�o�c�oPb�@����Y%R.�?�$��@
�����||Dja����u�dm��!�-~m��Th���V���J4�F�O���������>\��^��+���
I�>S:���8��������S_l+;c��B�+�M>�s��i�$=y�1c���y!�i~�L���S��>;O����O���|�+����Fj����������������<@�o������k������<���3�<#�g������c�V������1x�`������	!����X�sdk4��7�_.���S/��]����W��`eb��r�4Ab���������o��������BHCV��V>�����x�!���w������+!��XuW��������q<M0O�����4��;�Wpg�9��z�YH�+~F�-��)��45m��>���0
���}Z3;��>%���ZX
�ba/���>�����U��{�p�V7�kM����\t�j��Z_/�R5�����o�Wz>$RT=�~B����P<�q���b���Y���AMzb����c�#�
m; ���|i|n�C�n�s�!�4l<���|����8](xps��x�����`�����N�8Q�j�}w��l����N��#���oDhh�8vmx*a�����"��ow����`������p�
��<��?������o�������(S���#�_��������-�c���0g����.�{�����/b_���!�B���z���
���#�v;���[ddd 33��%;;[���^!�|Sd��	"t&�zR��[uO�k}$�JL,��{��-��]����AY�����>����P""�,E���
�"d�b�?1���V����� ������V����e�m�>�K.��Z��qjuX���B������`�UC^���r�>�bF�cX�Z�t�(L�!����=��B!
����U+�����%��G*s���8P���T9k0��R���~���&w�X�`c&�+��?e��YgBJP�H��2g6��>!�B!�N��)�5\<(���J��u)�������2w�\Q��B�7ER�3�=.��q�1��	�cI
h�Q�C�<$�����9
��.�V���V�������C�~
���mI�����<w�x�_�.�����]R�v�����v�.>��QU`�a7�/����X��Bq��OW;�����K�;�z����a�F'��U[(�Ma�3r@���!�4H�o;g�|��h���\|��={�����p;�.�w4
I���R<%�Y1�����(�vZ�"4���HJ`md�������7�bYZ��z��B!�����D�^�0n�8�R��i�����X�.��P* BH]b
��V��P������?��;��1i�y[��,����{��p�
u�$�{n�z�~x%�o9���Tn�gvt�Pc�Pi�`2H��j.������:\�A��%*��U4	���p#.m���<>���`��t�P�
�����%���l�B"???0�_=��{��k��>0!��u�Z"f��~l����T�H:5��"�Hh��,��#�D���;�@Mb�a�<��v��6��R4���Wn��4"�B!�_8'�����S�b��g\�1���%�����n�����X���G�!�!0V���W�����uH��O	�r���^�,5v �"aHEBn����
�"��(���<I������AP"c��D!�!����/��w�}�����3E]SB���>P���e�X��;��b���p��(V�nmJl�X��;no9
75�y5E�vY�[]��@�6)��+�slA��t�����9�Qv�JZB!�����B�+>Cl{�o����������q<����nr�������_�x�;�X������]l�C,%U�)&��[��%R����i�v��.c�v��������+���`�~&	��6=�t���[���������8��= Q�`B!��s*��njz.O��!q�pYb_$4A���	s�����cH��k�>��?�Y/���9q��"����G���h�&R������=B!�B�Z	!�Ui����*Kh$���]"������l�)���5t��n)��y�5Y�W�x�A���/��D=E�Oi�Z���R���3�#��V>c���z4
�(��(�����;�4�����N��1$t@���]YNHz�������H!�B�%������-�-�N��z>��������1��pL�2S;���/�E1���&��67"��������	x��m�9���EZ	!�B��C�VB�y�Sv������z���0�y:OOME��sx=bC<#�y�$1BF�F
��"d����x����*~�p�t�Fu�	i�b�=��|��)�J�g��ZC�$�5~�����.�{���������M=����{t���oU7[T�:!�B9ot2�F������YaM���`�YE�z��x����|���W�\�B!��[�%��k^P�B��U>���b]���K��E�D��"�5I����>�����FJ��6q
����[.6���sL���!Wt���t�H�g���a�������.����Xp�_L���+L����>��~|6�����9p:��|��B!�B!�Bi��Y���t"776l��~��>��7o���!�!�i��f�q��V���{�T|���+H������"�v -�����y�
�K��j��\j��d0���M�!06t<�������K���;;��l�%EP+�����m�7�~?��/!B!
Zaa!����_|/�����k�����bB!�Bi@�I��f����~���#q�����7���/�����J�[�t)�t�����bm�D3���6b�7
�y
V`w�VM�F�3W��g�\��Y^G�+���!Cf�hWt4�hV�8t���P�WBi�	��� 7�����������}3Jn���G���P��4T<z��yja��!���8��n���'O�]w������M��I����;wR��B!�B�Z����]�Dp5""��O��9s�����w�}{���>����Y�>F@��pc�7�*U����P5 ��<x��T
!���yk%2)�8�vJTp��-��������9�
Hq��>
�����;p�2���}��
j��*g#��a6��YK�S�,�\�=�q�Z�����k�&T9k��$�\�4���p\��V8wm����p9�=J�����/��+�4��I���x��7p��Q|�����mv�����g#;;}�
$&�B!�����.�Kt<E�}����/�IIIb��|�$I��u�hKiX����z�`#�1���$�+������x�T�=_W�����E��?K�R0q�#;��g����R�H��P��aE�&l+����;0w�b8U�wQ�����`g�~T;k���~8��lCF�!,<�
v�����8Z��5��C�����Ba���}�w�TR@G����EH��S9rD�^����<�>}��Y�<�ZTT�mM!�B!�>��@���Fyy9
������|���JJJ(�J�u�G�I�BNx�_+�:D��
��cp�E(�W@�$1�5�*+�n���l1�����Eh
nnzF$��"�p��b&k������Ph-a_����J!���%
�:r�3����v�g	��$�q@2'x[RwTVV��M�4�����			�|�
!�B!u��7�.�%.u�	��j=������b���B���:��G����������hc��g�O�����$����#GA�Ig/�	�	iA	��������;I���"��o�A��V�Sr����:4a�l/������(�=�J���g�������O�5&�rv��;����[�
1��g�w��K�v^�J�3PRfz������C��	�k�@a^"g����v:��>+P��B!�R)����3P��A�L�#��:'���;�h4�����������L��u���i��Z	���zHa� ����8�22O���H$CT��M�;p��{0}��������jB������i`�CR`h���Q(�)���V�pE66��`S �E���g-H��|*[�*l.�xB!g�7�+BLA��Su�l��c��[�����1
05�.��t�U������
���^|�E��1+W���+������W^A�n�D�&B!�B�"]�x�
�n�J�����E���F�Gj=��%''������?n��6�������}O>�$�����	!����)�Z9��	��XZ|��9���G%�Nh5�!kV�o����{���-�v��i���:��3��|V�����%�Y�y5�l�����X��c����`mw�c��s<��6���(���c�B��MX:���4�o7��_)��[^�{<���wt�%�����li�(��yg�Xp����e���>}:.��2���+��r�-0�B!�RW���n�|>�O���;��w��b��MoCB�?Q��V�R���L��]�h<(~_���_��MokB�I2FB��r��'����G&�`.��O����
��R(����5�a������T�3���`c�L�x}����[��9�U��1K��������,�~�]�>�9��<5n�c	!��3a�`\���4�R,c���T�>���~9���9�H.�0�������ok�9_x	���������w/����o������;�����oKB!�B�&�d��u;X�_����b<rx�HL��j���Y���_��DVV�4i����+��%��C�-�}w��s���7�aJ���������7�I���>��kw3��c0��p|>����z��p���_f����Q'�t�j������&�13�B9N2�{�����]!
���9z$��}��3�8�H�H!� E\�mI����%pv��%���}��Axx8$�qL!�B!
�9:�k����f�	!���[&���P�-�V�Z�.���9F!��)�~���VNh(��>9�^��Wx���b:�uh:b}#aR�i� ]��	��~%�e(�/�EN{�-o��+9��V+���E��B�2��D����u�*yC!���V��VY����<��9�=�^|��S�7�x���;�n��Q��3��Y�g%o`�i�?���V��������)P�u\	!��� G���4r�'�Og�|;F���A��x����V����!h������Gd3$�V�BC
�������6 �Sdd$�5k&R��?�W���5k�X6l�����lB���T]�vZ�[�+�Wx�!�B�����<xZRR���B,^����^~��S���zKZy�aB�_�%$�5G>?.������w�-Z�*h%K��=l'��'�RK$=��� �=p�vz�}��>1���������N��&����l�g��f��z�1�{n����@T@����=������"�O��<����H1�pQ���.m�N�H�0H4���C����<��9sp�����K/���C�XF����lokB9��Q�������B!����z���
���f�����������_~y����b�������
&B�?��D��p+�F�Y���
E9(�K���]'*V~6�X����k�?7�	!��G���!05�p��z/����`�V��e�r��� �_X��R�P����V�|]yH�C4�R]Lr�����w�}��>���)��o�)�:B���W���[�[�6x�!��wz���n�d��f"�?R��:��V���:w�,R,����c�����������%��5I��i�p��6�?����l���>7�94����k��)mo�+=��V���q7}�G�9�b�!��[�������i�!��)���7���	r����u��:��z&�cj�S��DIxr��������<���r�s��;�
��zR������#���F���E?���x5�
���K�3c��:9w��_?���-Z�@PP"""��Gt���{������5!��?&��`�_S�}#�k�B�#�wM��!A��vzD����>r��cn�t1$�6�.�{�������]�0p�@����u��"�0O|�e�a��PUJ�I�?!��CB�DDA�d�)��C��#����$�/���5�
��]�g�L�������C`d��zE6An1�-_�T�-�oCn��������!����3J�� ��)�u���m� !=����~f	���H���������{��0�y����}����,����E�3?J���}�	��M��&�:��"sp_H�M�c�7�t��N+�����E��	&`��Q�����r�JL�6
;w���Q��r���&,�����:#�4���"�R��W�D�d��+��A� ��S
�	9�&�)/B��U�~��d1��qN�������>
����'�h4��^|$��(x���E����(��sC�L��>~���K�j��p���5I��_����po�B��t�o%f�h���zK��5�z�Ah����b�7��V�
p!���	�eh�7�X���r��'j���],H�H�QB��-��pN.)���;$���*E\
��$s5�\t�]r�X����X�����<���c�OS����X����?��O�;R��k��n]�v�@�������K�1���S1�7�����%clO����?��~��Q���m8�����S(�����V����U���c���M�C+��=��$S,{�{f��*��a�*���}\;G�`�B��t�%x���s�f����>���~*f��;������EZa���mM!�O���R/�����=��D�K��.��j5��mI!���}���tHa�X9/��L���y�vo��:��3�F���������X��G��m�O���TLN��A�m9�VH!�D{B�9�+�r��a�1c��g����^*���@kbb"�q�Vi��p:��G�pD��B��MD������>~���K�2�I6BN�%fg�%�x0n$C8������A-�9t0�f�zhZu��������A=�,��V��3�Go�����5]!
�d�9{����S����B�I�:��*���x�Z��h��qW��q��%�r�����s���o�c�@����_��K�{cb��X��9�l3��i���C�%{�YK��kCz��'�0�������X�k����d����YpR���!�OH��'@U:m���+�>����C�3k\e�j�A������������zl!�������}�0h�lH��~j
w@7�
�" �g�����?�����3�������[1i�$Q"��o���p�
7���(**��&���Gf�MM��q}��x��$L�:Y,�v���"�Hi�	!��i����&Le��6l]./F��W`������>���l?�C�.0��
����.
���0��~w=}ZS���g/8��}�2��t����?&��EH�vN��#z�n
���������r���3+����c���0q���3����}��Y� G�b�
1;D�i�=����Hh�+�|Z�H���YC+f'O] $��P�gQVm���~9��A�!���F�F�O��		!
V@gH�}��C�w����g����
*\I�|�!'���������G���Caw;��(C����Mb�^a���X,�^��{�����������a�`��v�3H����*D��Z #,����M��d��~?�u���������E��PS���H����v�eB
��3x�l-����M��|H��&������C��%2QH�&�Fjt;��z���8��rGJ�����Q��{�y���#����zZ�\��c�hE��1qM�����#��=�S���3���b q�v�D���x����X��������B�?����,���/>z3����{
�B.8<��>\���3I��
8�m�;7�3�����p��z[K��:�]�B��{��T������c��	U���4����<��%S#1��r�����eeebT���jx`5;;���m	i���N�
��x�����
�z7���
���g�:
�LT~S�gv�dn9�!(io��8�z;���`mK�*��Y�X����."`�o�!�c�-�<��z��Z���M�AI�9�)�	<��#���	O�:<u��~!���Q�B��Y42J������
qXj�@��J�;~]d��m-������Yp2�g�����y�����P���������#�=l.�������r����Sx�����5g��yh�lG��N>[S�� ��Z����Y/�s��kv ���hl�]��pm�%�������}N��W�5������j@H�7��r�3����;�]��C�$��v
��6$>��]�T����}��,r�@�x��K��9�]���S.,Z�2�_�����n�SM�3x�����<�-f��j���=�������,g���"0Mj�������k��S�2��mff�����B!�r.EJ�g}&���]p�������h��7gCIL�k�N~�*�kV���j[�J�T�N��~��p��������]B$�	�������?���j�!�������}{Q�f���bt��-[��SO=%n��j�J�%���X ����%����<E�V���,yM(��5X5gk�O�2��%�mH�7��%�xU;g){\�Xx�>�=����7�	!D0'B��E�#������D������H���-f�	�������H��E1QXS�R{�hz��(~�^����-�)�:E����E��3���e��l���"�/��#�p]������'v*�A+]%`�|�g$��0�@{;G���{��}��9D�L�^���r+[����JA�%�����tC������6��5�2W�:��l�-��e�����6���^���������%��n�L��@��R�����n#�O������N���/!��Z������bY�n���������>@zz:BB���B!��Zfg���u\N��f�}�$���,������� y��-0t���7��u#��j86��~�@2�=m5
�=;Dp�u �%����KL���d*�BH�Z���7n������o��w�u�����	��i�?>����#�Y��k ���*��w������-s�11�F-^u�
"]0������B������9��8<7�,���V�g�$I�#�E�����O}"�t"�����
h�����@��M���=� ����B1c��_��w�������&�)�.;v��Ks���T��?���*R�*?*f����w��1��	�c����p�`0�����"v�M�PPm"��I��E@Ms�g�3��F�l�����v�?�M-�^��/�g{��m���]_c��
(������ �����w���%�V�#Z��>qA�k��7���}��L&R`��w@���=�]���dI�>��&___�q�HHH�������o����x����[n�����B!��scw����Q��@�5������/��JT>�8�G�������O�z��rT��j>���4�'�������Sa[�=�i����S�o��������`{�G�@�b���j=�����={��{��������?�< ���������d���"�����}�����Cv+��l��l������m���\���[����NH�H��B��%���?a�����R�
�[~�k��$c,;�����r���������}��#�6�a����u*]r���"��H���M.�S�'���w`XB�M��8���z,c�hwR��a	�ui���Vc�4$�$����|#�9�5��r�5Y7����G.����V���q������Z��P>�	��,�-Y�����9l�H��s���V��%IAjp��y:�
����(����^!f@_h���po���� �v��<)�+7z[1|�s�ZQ:_1�Yc�/O�.�����0$K�X'���f���>�J�y���Y��@a>���_��%K�v�Z,Z�������J��	!�B��Va�]���Z��wv>�B

�����w����at�)0
���;�`��~w�cw?�%�E�<�J����}��Y?V�
�Qc�\w���	�:�<�y�DB�Z��:5���#GD����[c��Q;v,:t� j�|�������O�oCa���B8�l�Z�N\�s��+��w�H!�p�����o���x���d?��.������M^�"n������}'}
����|����	�����c����s�s���x�E��$x[Bj�Yg�Q#-��������W�J
6 �'!�@(����|?�>�I1�@l����;�+��k�Z����{Bi5Oz��<�+��)�Z��/A�d���Un���+(�O����$O�Xg!��9p������x=�F�e�S��$$>s��7��KEjh5o6$c{���[���:�b�HC
>����g�6��4�q�@����?�<��|�!G�jx����o-))�^�GRR��i#���d�FQ��f�@�YB!����WiX���OV;q�@���w`4~�X��I��d0@
���$�Y���
90���G=�Z���}�[/���9P�+{�h%���L�N����wo<��s���5Y��Z��n��;DP���9p9M������*�`��Hy���y9b�k��Y���*;�������}������a�>C����9�]c�����Sm"��kM�:A��������q%\k��-}[ks=��[@�~�}������C} ���7,cn�c1
�L\@B�����s�z�B

������`��jv�PE�`~>���<�S	�������������
��)j�g�No���j���=O�
�����^r����t�������MA2�A���C��>O-��`�O�O)d�0��Z�! �$^�5�9�zZ�9 j��z��v���Kdl�9s�(�sr��������OB!�B�����p����xu��lp"�����w��O��6��#�z�-S��V�Ss�~.!�����f3��}L�:�w���*!g������Pss�����i1��l�� �_��n����.��yk��a�U���3�@�Y��h4����l-�8��M���Ai��Q�U��V���t�������9������<���rB>�14L�����������=X������?��4�:���<V�U������e{�e���sTTX�Z$��I`������SG
����
�b�\Q]��
5�3H� �
��j�KP���q�'KE�HHQ��T������;�?_C��5.�)W_����ft]�AN�u� 'M�z)�Q��@Oc}���A�e�����C8��?Ai�Rp�NR�������
O>����J!uA���Z����{�x���1����`�7X��;��ZbS�N|��[|�
j���� >��~���}!�����B���.|������q�j�V�R�+��Z����!�9�8�?���;i�$�����������$�����v�Bauj�t����'7>^��a_��K�}�J8wm�;�\��@�����kHj.'��Jhv�,U^���j����`Q���`ue��[7�����fm���+��o�S��z��������^$�4�C��j������l��m{k������K��F,����M�C��� ��������x}�6v��
�U,d�o7���r6v��F��k����S�������y:&�f�E��w\
���L��f1��ws<����O��J����^9�<��1���H!��T8T'T���=bp"����<����"+�&�|�������w�^�r�-��u��!���*,�Z�{�(�p���+x�4�*Q�0�������G%�g��#���d?�5�9{�k���w��"�B!���9��t:0��O��x����H�D���z����l�.[���x���y��8X���J������;a
��(����{�e%��^�zI*��(�|�1������k>���[�o�B<�"
�K�~����x�U��pd%�����q���T�����(���VVe.v��=��m���q�T�|t�V�����"�H��P��Z�.b��4cX�C��R���>����/���y�ROI&3������'$��YZ�Icz2G�'�v���U��z�-����6����K�zZ�F�M3�
�A@�}_|����c��xF����1�#���������o���L�~��}�������

F���f�xw�3�ec9�����i`TW=B|%V�0��@�$��2��:�O��p�"�v~����
���[���exs�X���nzR�Z�=z�����+����J,]���4��r.����������u�Wbv+�KU:�E��sTk�GC��J������e%
�f��c��]�ps���O!�B���Z9~q��eK<��S;v,>��#<�������� ��<�X�c��0v��Y�:����s��0�����s����l����?����
	��=��{+|n��qwB��=��`1_2�f-ah���m���a��D�OS����4�d4A��}jS���0v�	94\�k����K�]���x��i���{F��T���7Bfe.6���u�6��
��6u(
����G��A����C�i�K~J3U��^5�#�V��e�1���&O��:��"@�������I�z%����:�t���C��}Z3{����>���-o6������sq���Z�j������h�s����3S���+^��_�N��)�E�IRoi��S=�&�~���@+��5�Up�i��{��������#;1�g��{����dm��
���v
�g��1I���{�Q����������z�;?����k�(c���(��Sp�RC|��������:{�|���+�����u6������g�B�EQ�������]�v��	�������:C!�����%�2��������eh����x�}xs�pd�]|����&�7/{?e�F����4_
z�"["���}#`s���`cB!���:����"##q�m���GEvv66o��BNi+��������w����}��_O��3��3D�
7������i�)���C�f���2��N|�t
X'�t��~g�y�l����5����c�6�||�����w��C��ui���'�O����/m;��������k�~G�4���vbe�F4:i�����a����
t�N��)g9d�%Y,u�.@O��1���9e&��~�O*;���SPK~�z�uhE�f���c�a"���s�*��G�����"������l�bD���s<`1
r��!'L��K4����s4��Db��� |n������phU��YyMcom���gE+��}��&�j�K�gJ��tBR������X�.H���K����k����|��T��������6�%r<��
����*4����+��� �d��<����o,u`�B;lr��(!.���(�e�t��bq��Z��%�=U� ���jh��s��^���.��
����|�*�������!�n2��x��Wq��W������]��G!�v�lU����g6����<��
�1>(�W�6v�Cd��,�/���u�U���Z����}�����E��ng�>q��W}�}����N�xB!�rf�~��`0�'�������`��ax���q���"55U�&�8�l�	%2Z,|��;���)��w�O�#Fx7�>�]X�#��u�������4����2�W9p�{V�����,�+����3�$k����
X��-�U���_�y��Uqs�������rT�������:J�'��f�E��$O�u����H�����o������C���/��Ot��.���7�[��A�+S�O&��|[@
�r�	PR_�6r�I��x���]
9�m��w��Po()/Cn:J�OSc��h`?��������sH����S����H!G^#�3J�����r�c�.����`_D��d1����W"����?�.�V�������q���Z8�����M���(d_`���y��0������CN���K�����Q
��f?
�|#��K���T���*Y�=����B�>C�Cp��F����a��i���f���������F�'�=�~�����Nzd��/�;��W6le��9�<�+m�8����]�Ya����51*-Z�A�D���R��<Ub�,�H3�]��Z	!u8|�UW!8��u���?&O���S�b������!����o���m������Nb���{�cS�N1KuM��+;"��lU�P���8�h���+oF�(�0q��g��K�z����%\���A�B!uH�GdYFTT�4i�I��8���}{<���4h�i�	�[�FPR_��r�����,��Bi�R`oC�mXS���)���f��l�Xnkq
fv�S�������%��1=x�&����p�����f�_�s"�XEI���W8�_�������L����P�*f��{�������v�~f �H�����|�(��[�G�y����_b{q����R���
;�.�9��Q���_w��GZPL�}>z�:#�����|[x>��]����������xZa��������X8��c�)>����F���|�)��N.nlK�j��P��]��;Q4�b��E���r�T�o*�zE�\��G��ZV����\	���=���� ���~�x�������y�V��d�VEB�z�Q!t�-D;��'RrK�W����Q���_+H� �3aEmcW14[��I�^��3�����Z��7v�{m*�}S��j#���{�C��f���9��3]�@���P�y[2����V�~	��y_�;���D
���S��	�2���/��`��&�j,�osf-s���N����K��������
i1�8��{����n$G���qeg=Z����r�s�C�&��_<�:j��Ss���3f���6�r.���#�[t[O��.QmD�5��~��bp�EHJ�U����q7\�2X���5�	�b��6���~�(�z�t�!�B�_�S�x�V��?�B������git$��*L�<��_%����?���E��oo^���z,��?L���=l[��\��(D����xf�
�Z�d����3�#�OF�F2���Q/����%q�3�����g���mo����j���C��}Xp�|}`1�������Q����m�?Y�y���BS7��O2����PPS$��c1�	����0��v7��"u�;?��;�K����M�#t�r���+�����m'���0t���O�C2�����|��!>��eK�:������NJ]^�*��pB2$B�et�Cs���S�3���4�����kWm�{�(�G���w�A������S
����R��0$K��������2�4��~���B��r�U�xj�����v9{�����#���h���������Z��p����?�����'�b&4��s����x�������F�2�iB�P�zp[_f�d���`)[^eb�^��+M�����O^���s��2T��m�nBYZi��F#BCC����{!���e}�,�nQm�@s�gOl"f���!�z���T^:�g���^dy��d�~��y��c�P	B!�����%B���M���:�o����|��o���A���N�n���6#:��k:L��y�����V/���������E]>�wt����.D��3�������';M���W���Wa������W0��M���DZBE]�va�D��U9�����I1y�B��n�+�0�7B;���ZU5/J\��������!a�����~^wZ�D������Pjw`���:��E�a_�����kc���&t]Ai���'E�mH��z@��t�����r������-��o�Y�r�H1S\nt����=��{��kH��������Y�}�J����o)���OK
��[�����W�@NR���&C=2����!���I�����i�b����!�B!�B����'!
�A����Ah�7�$�b��G�����b��#]y�����b�,��\��/���t���o<�j_�
�U���yja>t�� �yF	��������g��]e%p�^��7���a#�;�.(��������U�v��'ZU%lK�G�3�����Q����/[wA$�v���!'M����� }��[ ����k��G�io���q�O��W�4��=1`��?�9r����*������r�#"�0t����'J�� '>���}�>D�jU�)��w'!�B!�B!uW�Z�n7v���+V���*/RIc�m�1#����������-���3�X�+������pl���C"�0�9"=�.>	������+Ec��3[5��=���
��#�����\1+S�o'��>r�������~�U�|��x���j�QB!�p���X�v-����iT�B!���Q�];]��n���"�~9'��-[���'�����1y�d��3���tm�x��N�
n����{�qS/���F!�+���<�jX����a��r`0$����j]����y�PK��KJ�s���O���n�^���_��Q���	t�i�x�W;�C,��)l�������r�Y��o��VB!���������W]u�����������%�B!�!�Pf��k�Jg5\�g!�M�G�t:�����{���CNN�X>|8���
��5G�Y�p�$tM�!)����a{�nT�wl�����h�Yk`_����������A�Y�UW�v.�d�����-)������i���\s=|o���m``��*���|�pH>��9�����eW��g��DH��F�%��4`(,W^��c��J��������_�����{!��%''������a��a��3-Z����^�����j�z[B!�B��j=�*�2�����W/�x��x�����?��'�@DD�O�������?�]�"�]J����h#Cq;D@���/�&?c�."H�S|:���}�R�E� I�����d0��kb�Yd]�C��<�BN���rX���P��C2� ��� *�>���0�����M�(Q�Oe��Y{t	���5c
�������8B�-��@/������n��[���A��#55'N��M�����{������d����}���,B!�|�v��?K�)Yf�z�v&����o�����Go��3�R�����'6^���O>���sq��!��p�c���7K������1��1A���;�(��xO����:���2j,��(q��Y���;\+|�Z5o���>.h���ke�����r�kl�'xB!g�:����k�Z���[����-}�~�}�P�RBH�����YH�w�T���6��w�r��l6dff�Z��W�Faa�H�g��n�&����B!�E�>%����sY��mG�@kB�9j
���.�����	���z�������l���1�w��	�#��SOa���8z�(n���?��~���,F��4���Z|�^��#���`6��7�z��$A	���YKH=�,LM�t�]�}�������N�@i�R���q&�)9�!��*������9�b���<���#�p<^�2Jm��tT����������`�*sq���1n����������R����C����}YC��Z�,������s 9�	�l9=��#�'��������W���~�����!??�=�&M��)S����>�W^���^��~���XokB!�����|�7��w,��C�^0t��Y�������s�DO;BH�����b�0����"�j=��r��{�n�Y�F��?~<f���_|Q�hm��1���x �����?�i[�#*g<�������Z�<�'��������6a�T�m�����g�;��V���&���i�|�C��/sY�2{%:D4��n�bR�1h�-�fV�bDb|>���M�[v���BNU�M���"Ql+G���(�#2J���5(���B!��-BS�b���%o��K����g�����������cx����p�BTWW�t�w�}7���N������'nB!�_Qd �O?�JT���JD$,#G�o����8��L����A���AB�Kf��#��{t;�u'���Y�m�������{	�_j=���������Sq�e���|&�}��'~��5�~�-�9UU��"�QA���V
�K��������;�kW���|86��
��L��
=r�@+^,j"J�h(�oCi��$���������g�a_�z|��;�;�%�rq�WLG�M�/���hw�*G*r���r|��a� q,�2�jD�D �&O!�Bi�x��U�V��/��Zy_�C����^~�e>|�I�G	!�����J�2�7:s-�6q2Z4��-m�rX8��h����r�����Nw��A�`�������70��t�l	�LEH=T��VY���Q#\u�Ub+O���)
:���o�?�����J��J+��>Z��gk8P�B����D�`^3�����jh���T[�d�!h����<%�],��������Qz��]���D��$�����l$�����OS��Y����"����7A4����F��^.���j.���������:w3���i������+�8!�BH}�'$$��+���_~)
��wh��
�M����;###���BH]�g[�
��RF��!6D���q�@�����Nz\�~Nd�����o�'B�"Y��o�A�%��P�D�u>�U�(�J��Z�������+}��bpyy��8P�
�AYR%��((��p���u���N�-��&��r�u0_v%��0�[���8�� c4�F�Bn<��C����	��3 ���V0Z�&�]�bD�)�}��b]�V�,�US���xph}�6T�+qC�pq��S	�T.���6|�1k	2���:ZU ��<�0!
YR`��^%���=N!�!�{|
O|���X�s���;�����W��8�����?��C!�.����B�[���-c}#�} R7��K�V�[{0�����K��`�0B!uK��w:����q�5��Y�=���]���L�2o�����t:��Q�>�Z���u�1Jp���.�����(����Z�_KH�'C��r�3�{~m ��w�q�1����oT�p�7xi�l�z���Z
���g���53��6a�Hl��E{������(�����u�F]�Ex�*sQ������K����G�1���<��p��_���i�B�0_	�����H0��^������>�q����[o��_��� Q����?Y�bbb��	!��&�������",�5�%����:cH|/��-���B!�L�Zy����"X,L�0,��y�p�������:uBll,�F����
��pc/=����������f<<��A������d$�����@��� YRC �z��eh*h7��kR��CDs\�	�"Z��������0���h����Il}��4�S���3����~Q�}+<����t��!�g'�a2�z�L�7/~�z��&��>�	-G�g�BH��#M'�g�.^A�`��PUUU���W_}�8�K�<��������b�Z�BH���D��BOu�Ou�K,S���V����mE�%}��~��;zwB!��Z�������E��k�������c6l�����%
��IBT���`Y,�A�����Ip<�K�Ob|#��T���@����i	�`BL�"o<ofAW?��)�xZ�h�p��4��>�(F���E�������]�B!��i�D����������{��=
�z�I���sc}�g�y7�x���j6�QZZ���oB!u���m���}xs��K�������V9y�V�B��r�/ E^���-!����9b�i6m�����#==c����h_^�f���p�����B�y�g���bg����������z���.�@�d��.�>~��!��^O��8��������b����qY��2v\e���Su��U��57*U�<��[�><@�e�����g�]�n)
|Md��x����'�xBdgJHH@||�H�37z[B!������ZY�-8�^2�V����V�C���)�K��v�KghV	�����;@��J�L��7��:�FA�?�����!�����<�� ����@+�fdd`��i�Z�x����l�2��u����3g����GB!��`�C/�y-`NL�b��OK*��I�����~��j�����M������[��Jx�ga�|?��	!���Z�G��,��?��l/�'����'����/���^GNU������m�����!��o�������y���V&����������
����Q�F��/�����q�5��R9����v��5!�B�ZM
l?|��gG�������up*_x��E��/�u�l+F�S�b�c�~�9lK�g�����g�UUB-*�@HA�����L����
��.��f	�V�!'<	�OV ����@+���y�f1���g��M7���������,��n���f�B�����B�oCIyA,2���#H�zA�(��1>P����:����6u��S7�M~����mw{����c���U��e�'������:,U����������F�'bE�F������24��Fr`j\6Q
�MX���xdr�i&!����c"+��I�������K.��#��/`��	X�z�H%L!����ZY.f���|;L���m����j���+���4(Q�D���k;|�M���B-+�Z|J�8�pl�������W�I�}&B��H�d�1�@�k�����l�B|{p����g�2���e����_v_��s������5�0��b,�Z#���\�j=��r�P\\���P�JIQN������� �^��tz�B!����l�)���{�A^�yH�E��j4nl6c������}�oS�)��`���{���Bj���-CS�U��/�/BF�!�@��������Yg�5�b,�����*�9m�
���X�9)�q�GBjKYYdYF�N�`2��{!j�v��E2�m!����� ���f���/_
CO�)N��5����S��C	����!B��@��iK�u��cW�%E�7o�`���T��#����1��;!'>
������.�9�Wv���yz�LK�.�aK�4k-�.�j��������2+r����3G�s�)6D.\�h�����`������*)����>�	
<%K!�|� �()�*H�� )�v6������q����-�_���1B�3�8c��1Gt&G&�m-�A����E�HK(�.>��
�lC������7���F"5(%�r��i�.��!K2�����_"�2W<!�v�FQ"������|�1��B!��4���Wq�n�e��m.���X����G����P�K��U���pnZ�u"0�KH��������>I>q����!�E@���C�z�hB��a��h�?�����f�rf��wA�R� �a��j�U��	G��������m0�L����tV�Y��t�e	}D�U�>������Y�H�P�����\xj=������m[H���S�b��y���_��x��U�V�-!���K�k9i��Q�����$�������v���%�5�T�`Y�z��N1�� �E�0s0��Nh��v0�}-BRl��Su��Z&:�<My�����"�?�un��3��,S<!�vDEE����_��m�D�`��r8|_\\"""��	!��WN`�a7z��0i��v;Qm��WOpTe�i����
����VY�G3�H#������?�u�7��@��,�;�m�+�0��v����`0���i�0��@��J$�IrF�`��M����[��b&k��$<��,�^�V�i��@NU�g��.�	�5�Yd�X�5)F�l_������L\�<��/�48Y�x���B.<�h����4L�8Q�j�5k�u�&����u�]h���hK������G�������w7�}��QZ�!#W���0�+��r��\���Y�({lv������'�!�N�2�+*p��70�������8���p�<\��n��f�������U���_��'>Kk��G�S��1��1!�������R�Mh�U�q�O���I������\�;��a��_�<4����!F?��k��MzP"���K?\��U9�g���I������'��n�}��AJJ�X ��/O#L!����e �WBa���*��d��Q]*PT�������Tc�D���/?���`�d8\�����2/�+RW�<]Dg
�z�<�
86�AXC�nP�"D;%.���p��I����������?��'<���������U�X�/�|W&�/��DK��������m"�Zn�DveI��2{����@�Uy8R��R[9�[=3�|��N������^��e��a����>}�X�:���u�����g��]����hjJh��a�(���(��<7��)�C�5{�����m�}���;GiC(�JH-�i?�GBN{R�psX�k�f\�z	.M�#F�q�5%�Wz��LF��V���n�8���p}�e���H����>�v9�n�E(�J!���	��&��3�r��E�ut��h��w��=��i��Go�Ig)��|S;�����"�R��W��}�����{*:���>;�/9���k���v�d�����{`�
�U��k��>�b��j���;��q��5���;TH���1��6���+�6m��'�g�}/��2Z�hA��	!�<����G����O���8���������l+0�$ce�B���E�����b���Vn����9�x�K�\���R
�f	n�s����I�Q'���P�����?�|��O�.�t�[��w0��p����^�y�XH����'������s0t��N���Ms���[�G���0$5Z�v�wzIB���V�fWF%��+=B�����j��#����Ps 6��o��l
�3J��M��
�1��/���G�M�Q1��;G��YgFZp��1���V����v	���)�1��hu�\(**BAA�X
��U^��g��b9�vkMM��@�����f�wf����9)���].��K�H�9;[�vj��.��0?`�>���7��EVL�9@H�.�;Cn��fA

U2#�2�r6��������DvU�ha	��]�b�U#��vQ��^n-����^�m+����b1���n��,u�����~!����Jz�]��������A�R��;�������1���x[��K�����ye*������)I��l���N1+�������X3^��$��7�cX;�����VrJ(�z!��?vbb��>��3b����/�B9����������`C�vQZ��w���8*fc��|0[��K�V�k,$�]r��v���
w���@������d���U��U0��N�k��y��J�5,��DI���"
6�����r
v���.T�!�9�}�V
���z��mZ�&���Z�Ol{#��yp�j�Bo+B�i4'��Yp��>?B��-��I�6aM��Q1H8��/���7|���Vc�D���4������v�:��m��&l���+���aP\O�����'Bn���u:^�Y���nr�Z�fggc��!�����.�{���9s�pxF�O�7O��c**�����2� �-�\$U���������cg�'������� f��YS~S���"���dH�D�$��I�3�;�%�2��h����E�)@��tk�!O����O�l�����N`��$���������1��h��~/���:���X]���u���f=�r��������������D;�V1���-�����<���r'�R�l9�bO�����
.q3������r�I��@�$��w
����_���5�k��EV�P�D����n�W����������8p��hB!�����g��Z�Wo���u�n1{uY�z|��[,�\-��|l���7�����4k
r�
��pb|���������k�-ce����C_��8D������vq��M��������M_^d���Z���
�0$q��~~��-q��L������B�~�]���m�{�C�A�S�BNc��V���YP=�|����QGt�n�S ����8���MX���39�v<���3�,����Z��������7����P�R�{NP��r�
��O��r\���}}}��6�o�A������b�\Xx����N�J�b��LT3��1�.���,�l�[�L���FA�&R��Q5�z�g��*��+������BW���oN1j��!�����JsB�\�v�����1����ci���G���5X�gQ��V����nH��������� .��Q��a�X�1�������7�&R���Z�h�������9��{g)����f��l
��/*g	4~q�,�\��l;��fOT�g&i.'�����u3�����d�.�#��X�.������������]	���P+�����}�/p��-�BHC�S�����-G��b��������Q�"���]�S�f����zn
��-+x�2���b>�5}l�	#;�<��j41��gw!u�������C���?��e����?L!���}V����*yJ���a���)B�������;*1,���6E�tT��m��@f�Q����fW`����-�
��7�yi����/J�a�Mf|v��EV;�31\��z|4���YpI���x�j>���;�D�Uf�^<�g�����Lx�--b�r����i����z�_�X7���q�gDs@;6�M���9
��7��}��>}J:������A�;�y���D���D�g��#�j-����z
����)���3E}�W_}U,|d��3��W/�t�o����uV�d�u��h����w��h����j�r�
�h�.���Tq���\���~�tc�F���c��BK���$TB�E�I��`&������:C�������(<�a<��7G����|+�(���:w3
X���?��5��B�))�q(����}?�Z�#Z����h���D��A[��s�VhE����@2���V������f�~��|�����%�
�$?j$`E���9;1;�;1"���?���S���_��Q��Sr��](��W�Z���pl\w�Qv�|�B�}4�u��<�.��6h�8~[�������=���j8���������~�2Q�BH���Tu<�����
���5�x������BN���]�,VE}���*��:O���/cy�>�B�����[��(��;b�^/���?�<^z�������^|�E��������GB9W*�������������Q�|	��U�_�\��V�?�3V��*^cpW�'���}�E�����"�A�e}�Bk���z��X�;��DH�S��+��)!�5���w�d�H����*��P����]b�gi�=@�_��@��������w���zH�f����o��m����YN��&NF�f:�F�bd���k����7�2���
�����*h��K��f�h�uZy��]���h�
��#���f�������g�aDY�0$���$��nH�o���Ps.K�+�&uo�.Q�D�u`��gmF&
@zp"�:����uX��5�D�F�Nm��.�9�!D�R�_\l��<��s��R�%$~�Z���Y��3�(;���2[x]>���V� :�.���E{1��b��u}�N���U��M�;Y�s���S��pe�����b��w��V�;��}Ep����C����Go���A����X����sx�V��J��L����e������:qM�~�_�w���`�{f�������k��W$q-�k���������1A�:��n�DAL��K�k����}���o��6�~�i��5����QQA�	!�|��|oiv%ft��C�D
����he>�z����Y�������h�(+5}���������zE/!�A�)Aq�&�|�w��v��'���[.u��L-��� �3S�w�L�CCwN����"�����"//�}�l6���0o�<q�������>�$�HU����a2�e���bf*�S
�M����.�[������z�3"@B�f:��?�RT������F����;��24U����y��SdKL��Sl��Q'����y����t�:�D���E����~�����B+���WB=��H$���;p����%r��!����*6,�\��
�cU�&���>���'�C#��h!����8X��b�")�u�um+��-��$���s�UV����.=!)�H���	����t������h.7��0�|�)����_S�A���C�Y�Om�~�s6^�B����
��f��6:�����2�"dq��������tL����Z��������3y�j�F�"��������}C}�{�B����W���	�,�o��~�!6o���~Xl�\.o����������p�B8������a������q������>Bee������o��5b ���#������=��v�1w�\�3�F��{������Q��%K��?��o��U�����`�^xA�	!��j�7�_.�����YSn	�Z��iy�Q�C��$~6N�0���UE�E�&��>�]�����r��}���_i$����N988K�>%*���@���%������>�����4\������
6`����2e
n��Vq,99�'OFAA�l�rJ��B�y��������B=��H{��`=�:��"QN�)��
�zH��uX%�?��@2'B�m�������Q	��&:����E�(Q�G��6����=c:���<��q���>C����D���Em�:�2���&��b6J�����!�����:C���f�����{�F:v���@Hz=�YG��<h�:A-�g��ti��>�-f��?tlK�wI�!��o|�*���|0 ��"������m^
�gvi��:c$dK�E�V��?�\xx`��w�All��� #����{w4_�5������?�q���?�=���={��>�qV�U�.S�N�OTT�y�1���+��oA���,�����o�S��������E_Q����������>�Gz���x��g��_?�n�Z�������e�!����|6j3�n�Y�0��Uh"-�"[P�+�#��G��*���w�l%����>/�sk��/����s���H;��cd��>�u�V-�Km*R��������x����%�^,����7C�k��:������XB�Z�:�9�5j:t�������(0�h���8v����F�B9�����z�I���@���G?H�$H>M!��V�%�{n�>\�������J�
/��!�����!� t�j���-`s�E**H�(�V�!f�&���^!j���f���3_�
le�r�
0����~�S��/��������0�"�����9�(�aY$�	�C���<��l�i�y`Vb���2>u�_�A��$Y�e�h�g�4��BHC�gZ��M|�f�f������}���A���)��#���w/F�!���|����&�2����@������������T����3M�������� -���O>�z~�U��+f������6m�H��g��`���k�k��F,��c�x~>�j/��R���x�dB!�����n�H��F�pM��������Lh�H�#��.>�?
�	S`��ZXF����}�~H��||�-C�^��{3��$(���P
����Ci�r���O:�4������ya�~��,�g��k|��lb?y��yR��z��T��^�*�]O�;m|-O���E[B!u�����,"�m�%���a=tc��!�wd��+.�|qO��Xz�b&��^�5����X���D%p������(g~?���Y��+���5���-���
j��,�>�����1��U0��v��Z���;��~�0���=���a�v�����g�t�}�Z�?2��C�$$B��������ptI)�#����0�h#:e����N�Y�d� �B
>#���4�L�='�>�N��}[>#���=t�n��v1��d< �m�6�{t��U�N����}{��������_�����o��������(��Q#1�w��M())����*��<1^�z\|��"8�x�b���~��z����y���7�AV����.�O!�O��k���/�������f@���o����0_6>����ml��N�_��3@�!��5������]���b�/<���
�B��g#g��;r��K�XH�Po��D�����em�?GF�FyS��o(��B��RH?H~mE�<�p�z��P���PZZ*j�;vL�P��/>������YE[B!�.�A������%�Y�_U7����-��*D�)��	��j����z���v�����&Lj=F���<��8��_���Go�I9�&mm1t�����F����TB��`�3��DL���O����M0
��|������%�`<^�U�c��+���0
(���BH����f�Y�����l�xJa���3[����{�^��:y��|����#|V)����'0�Dm-d�������X��Zy5%%���r\\����g���<1��z��������K���i��=�#G��?��+��U���d7n,��;	!�B�W��C�����|:���.�L��kOO��4�����:<z�	w�3��6:�l��Cd�%R�X���Ai>r���$=Ci��Z�����:uB���E�Y�f�O5����m�^����m	!����kt[�u�x��]h������'�b16}�)�|8^������"$��z�:Y���~x��C����&���xm��`���R�x��K.�?� ����<P8~�x :t�)������2dZ�ly��6�U��K�`&���������R���|��������fy����������y�U���]�^���M�v�m"u1/5�S1��}���!�B�+�����"���#�!����p�������"T<�0j>�jY��������F������G8wnE���Xj���c�T>�j���Sa��DH�#!7����D�u��INH^���������Y����[y�"�
��$�r�h�A�w���z&R@'�)/@����CH�`_��O�n���^�r�Xwo��wb�L���@
�T�w��
���l��k�!���o~Wd8��Iq_���[����s�����(y��W^yE�q9�����;��gO1#�.���yP����4i��VWW���|���3��V�g��2e�H��?��d�-�M7����]�v����D����;w.�o�.j��<+����{�x,��T���+�Z�<�0�3yMW>k���FFF���:�s�=�(V^^���B6c��<����s*�������w����5pk����K:\�c�=}���8��G`�����t�	K�6�`M��x��7(uTx����%o�{��U�6g���
�O�'���ps�����5A���P���[�R��(��.c*W���-��GN�9�%hz�sX���J���>�-?�d�P_�{� 5���%���w����N�NI
���s0����<�j�W.���!����`.���j���2��Hvm��/���@s:�@�4
����5���A��
P���q���2r*4%���?����������3��5�������fF������HX-���g@���n<�N��1p��O��9�+�{�T.c*�^���
�
7�����GN�'�nL�����n����_L=g��������6n�X�/��k!�!�@+!gF�VB����||x9�T���:�>��G�#���X�H���?u1����4O��k��>-���Gz��Y�K�.�OVV������%K� !!Alsg
��`1���$����\nn.&N����H�����Z�s�;�}���Lu�;��#�7�xs��h�=t���������|���g��{������������+��B�>������"B!'�w�@T�L����S9�(�����(X��[��!�������a��{.\�(��_��k#�����������]���U{�����*��SEB15~�w���,���-Q�����]M��qU���]P1��J]��[�r*���{6%G��x��,�����K�m�W��0+Pj�c��hV��(r� ����GB����a�����p�ki������jE�C���q=�{w�2r4$�����3���'�/�rD$��J��/�.!	Ze*_~��4�[���M��R�Ul���>�o��<�{���1��{�.�*��Ln����y����9���;5�3g�K
����G�z�'�`��I������r�T���;���wl�����J<��>��6T���y��GN�-����\����@S>��
���*�
�����f�|�y�����S���%�r�P���3�@+!uS���r{�7�xZv�6��7��������V>s��mX�z5~��7d�%s�lV>����IS�xw~���" ����Y��s�����)��p8��[o��S�����r�f*�����-��z2^cu����>}��{���?/���������wZ�n�������<�qzz:^��S�
����+��g����|@6�|�g�v��<�JJJ���zA!��;��P����	����n��������?�yF����)�`B���=0g	��5�j��kYG8����t��&J�m�|����uxa�(��H�z�8�F�;�e�V�[���'���rFk�$�1"������[B����:�d���z!$�f�_v�.��{�t�u��]���x��cCV��_��	^jD���U���J��D���\�������Zc��pn��>�&X��`�����3[ui�`��J���p��
���0�������W���.,�.*rx$��H�Gg���>(	��/�`L��&^��������0�I����t�o,u��v��`��
^���T<��+�&�>���`q
{M���b���H>�������d��#����bh�������V������j����l<�����G��_���DZ�3f�tA�B!��W|tfD����o�X��Y�9��<����<���|��O?�$��`#��t.��w|V���.�\���=�� �_������@y��/�x@�L��y�����f^���������4�~���3X������)���������d����-[&����������������9N�E!���`H�C!7���l�-����&��+������S�&�2��dv����o�4����������}%d���G���	��?�{���p��#���s�6�!����1s�f��)�{vB�82{,�b�sgg5U�-������9����+D�!
G�Zy��w�:�W_}o����[����~[�z��mV�Z�G�B!�B�����1�|1����iw����<�����i]���Z�3Y�����J��@hH�AO��������;D�`�*��6=z�H!�g��������E���"s�8P����k�J��n��9����s�N��>}����|�6���1����)t�����B!\YGP����|�Y����P�*Q����z�e�E���;��w_C�sO��e��CY3�cT�6jI$C���bn���S�^8�������!FL������`1��������w���9�YHWC�{��m||�������7/��(��o2��7y2w�v�v�:����x�m�P����k<��1��~��w�?Z�^����2��8����
�B���H��C��T�����\|.x���>E�/�L�wN6��b���Y�����}^��VT��<��_HCR��V^���
��$���)�x���O�G��z2|�*!��s�	y/�����xB!�"�4���(���,���_{�UW�@,_.<���#� 11���|6,���g�r<e�����{��18z��������L����[�n���u�>����/���HU���N�<���"�.��8�����;"55U���)O�g����m�����k�1B!���qhx�7���[?;�py�WiX����R�hV��A��1t)���b64��g>��p�6�+H���
;�:����������b��d�C������u���<����g��MT��Pd�}��Q������2b�d�����O{�:B��r��PR_���H��_�0�GB�w�����8{]�F=�,� �;��9�}��9�(����xo�@<+��!'=9�&�Y���{��#����@=��_w����[����a��J(Q0��}Z3��������3n",�n�[��hX�������&g�~1|'<���K��V��}=%=H�Q��V���w�xG4//��J���S�c<��B9w$S�Qc��E�bc�ga�|�8��B!�D�5Ny���ly�������h������h�"�w�}��~������>��������G������:t@ff&�L��G�_>�u��	���}�M�6��*�U{�������yyP�t�\���3x��wq�]w��x��k��X�r%>,f�c�BH}�/OE�U����p�R��l���_	�RD�3�DP�a��y+�t�Z\������\83v���Q�����Y	���OoC�N�4�����;�X�ji����k�(FH�D�<u�^�A4
��-U�p	Zi1���	����:�+h�����X���QtY
���'�+�����Q����;�e�(�p#�������x�[9�Rv�R<O]��<��^��5���%��������)�?�@>x�]�ykk���J~��9��K�UlL���$�fB�o��7B+^,��cu8����%2Z���Ty:a���/�=A��O-VI����=���O�e�L�]��@	e�c�V�>g�sg�hG�Z�VWW�������2=zo�����k�_�6l���y��A���(�J!��:r�;PR_����ga�|?F!��������X�n��Y#<��K����{���Gy�����������&�B�wx��Uc�%�H8Zrj�=���m�����e�u������
�m�P0J>~z�C�MzP���3`�����>V9*�?����VQ	]R\�3w��kK�����kt[_#���������j��3^��'���h6�B��Lc�~���_/�e�8���s�:���?���o�+�t�Z���\���d!{m��:@1�����5�1�V3�i�c��2u�	�7��t�{�F�9�JWA����){���Z��������1�rH�d(���>j��b�f="fp����)J�������)�������7,
���7��$�����C=���;��1
Z�vo+���Z����}���E-���z
�v���������b���~���_�G���A�B�=���.����%��u��B!����p����*��K.�W\!j���7�^{-��#���&��F/����B��*5������������O�8q0�
����VQ��
p> jN�\������m����HF#d�p���d�����s����/����ep�����}��yp9� ��v��Os�6�!"@�����f>�P��a*��*�/W�a�n�ay��yze>3X	
�`5����q����c��>R{�
u?}0gd���q
:'���>A�����5�eC+]��wH�w��x13�/{Ey��uMa�)/3�`�sz>�U�^>���U�MWE���c��k��5��f���T�y�7X��ihj-��S�`�3�<#�2��ly��gq��7��o�Z^~�e�"�i��4��B!����v���mxe���8c>Jl��K�/���v~�����Epin�v;^��C���sdV�`W�~v�3���5��7z��{<�������k��Y�|��v���#�6�{��"�._��F�:�B!��S<n���0	a2�����$�� 9��[���X�n�M������U90�aW@�(���y�F���z}j���f-��GB�������Bb���:Ai�l�j<�bE�O%��p�Zt��w���i�.�C�����-�g����J�s:��������&Q����T���H��S��/}zsHzl����}v�i�t1{�zXZKR t����� ��b�*@6A)�����E�ZI����J�B�uZE�*6@�o�	�r�'���f������z�1B��Z���5|��u�]���UW]����?���+O�D!�BiX
���rl7B����*����pk*����`*���[�!�e������HbZ���<���r�nk��`��&������73Yy����a������B!���YB�DE�`5�%Q�u�~z7�#6D�����a��>Z����	���!"
�����Ok�ot]{���y��|n��N�E0�|����~��+b,o��	S�3�N(������}�����U�p��|]|,��c�>0��������3t�q�O����;
��J�?+A��|o�}�V���Yf�o��"Q�U2��o�
�Y	w~�'��gt�{��	P���q��.b�X�qCN}J�{�����r�)����|��"��~9k��f���X��!�X�Zsrr������TK����)����j�N�B!���8U'?�����6Q���Y�yh��"[�����l�U7��v�E1Pd+��m3b�����1B�)����v1S����BEE�?��������;W�u	!�B�	��Q�W��1��N��]�!����0���&O*XI��.��^��=X,f��t�JT��HH��'��EL�uWC�e�p~�����	d�G��~�cu��;]b��6��7
Z����z�e�������pgg�����j���<�	*{3�hU����m8�n���+E'R���.!����������uFy�����j56b�'{=�<�{����x�����<��L���g�{KH=Wkw���0r�H�6�W�^��
�jJ9�;����x��W��eK<����<y2��	�B!���DY�`����^3X���xGH���A�C�S\I\�[���:��'�����
k���Ih�)jQ��2h��5,X ��'X�z58�c���f��j��������_��Y�DMW����T���2�B!u�f���g<\kS��3���P>u�hhsX�����J����i����U�0u�yI����l��i/A�����b{t��29(�?��'g@i�X��jg������������#���ey��:��2�T����'7{+��W�-��l�������m�=q*>+��1�q���K�)Q�#��^�3h�:�����
O�d�\|��x��G��IDDD 66�5Khh�H���;����n������kWq��B!��0���G�������7q�Z��?��u���p�.��Ly]VUc=e���3U�@N>���l������\�9*���J��a"�X"O����M[�j%j�^~������0~�x���,�:u*�z�)Q����0a��[�Q�F��7���K!��:�U���`e�6�{v��!$!���{�REP�
�b�
�������"X�� �I��C(i�gw����b���g Y����cwfv��[��y�y`���
��������s�����bC����hL��yb{���mv�L���`X
���ao����K�����O/����(tB���}�hZ��x�bvQ�mbB����6C�Y6��W�I��s7x�+��o�(�������5�����)�Z&�U�f�T����>���Rk����������2��f����C��b���G���.w������2���_�g���v����l!���9���ls�N�J;c���Z�������6W������g����2�c_n������3m��E'a���X�g�yL�
�(����9��s!"�����,T��d�a/hx*2���"��U�������f�����`bV�r�S����
������b������H�`�l��<�c����� �?�����1
��w���z�V^�,����q��lW��8��z��zI.���7���E��.���p{3��crsr�u��p�3cy���\M����5+��s��<�6��.DX�M��+�Dkqqqq�u+W��oZ-}��71bN>�dT�P���������6<\4Bq�=�������l���LQ�u�������9�8'��9�}�<����Z�<�|�p��/9�2ZUj���������[`��uf�\�B]!fn�vI���bm�\��HYn��kvGTH:$�@�j���
���<����E��q�I'����w�m*Z��u�]������9�
GDDD����+j�h��T ��i����
;k���3��{��,b����n3q ����0���U�����NHE�c\�+W���t������/��-t��F��J���;j�V9���S����(�����W��8|��S�r����q�_��*���z�+��i�����1���/E{"��V<��&k}9j�TE��'���������C�fn��U��!g���]��������w��:':�nD�*-�kE�;.����6os�����Hi�/������yX��(��yH�x3�����u��m����8��l\�z6o�b�g���q������kZ._�~n�0��q��/s���|j>�q��w~����STXQKa/��	dY�B����2������i�B�e�Y��Og��3a��M��)
9NX�$Xu��<v������8'QYK����b�����y�*tp��q8�����JS ��sF�+���-������������ev!lh�`�F�K��E��3|X����P�
���
qa�P�Vm�!��keuf�x�]���=�iq!Vl����a��o(>�Y`Z����F��n����'3
��S�3��L��g(�
��5��?V��������&a��Lb�H��������y�������Z	��l�p�_�eZ	��5-��9v�h	f���m}��M�_�V\/X�Ma�n|yEm���0����6wVLXIg:�g��]{��_�jX�2��.4�Q��S4���0	��D&��M�x���A�8������jE�q.����������`�j/�����s���pO��;�k#6�BB4���T�vk�FEg]y�c��h-g��vu��P��]i>t���K�zM{i�����A�fmW'���nQ���� :��ep��n�jx��<mj����""��W��p�}VX��J��=`�*5w�I������=|��o�K����S��?AI���`E5uN�
aE�����(�*"""""""RVy`�#�w����!�j}����:D�
�I02�X]���|<�MV�8|
�@��H<�!����8��-��U�Og����]8�]j$���o���H�*_��L�6��2�e������i�Cpu�P�h�6��b��kY�(q��NNh�6�������?(���-CLE+#�W�����m���c��=�z���|(,�H"�R��U����j+�^�y]��2�n
���a�����8�t^W��aU:��M��������\���V4"��� ������T����H����s8W�Y�[R0v�I�x��p� ����,7�
�3��C���>��X8�u���J�C���w��a��Tl*y�l�����h��B�*nl��C��!���P$�XhT�m*77��M���g_���=U��"��QI�2�:w�\�����WG�v�����E����O������_�ZO������	��x���&a�w�^���������b��}�q�
�����Ovv�yN����vX"://�l����8�Ld��c)"e�;��"��~�t^W�+��9�Yns�P+U����&�%h]����q��
��=��)�������:�9�Em9N0����P�~}����Xw��q�����n�:�^"""RVXa��j�
��3����R�h��W���}�O)/�$�T��A]<��[�Y���1�`Y�,\.�����:Xm�q[&!J}�{0qi!F���.
������c�����g��wr0nNNo���T#�CF���O���h\��>�B����L/��m^$��zS��(�w��k���SO=���0x�_����+�������KhKL?��#���[L"5���+V`���h��-:w�����s��9,q��k��x�����kWt��'�x�I03a�g���������}{t��	���o���`����F��}M ���O��3�����/��y��kDDDDDD�����o���x�	t���^z�Y�������^;����H�aE���������������������/*�����*�Ws���"��M���m�X=7���p���;,�]�F�~M�]x���wf"��)��F���.w���6�{��he�'�M&Vz�!�|��p���~���q�w�B�
X�|y�h#�d��%KLb��W_=�wbb��o�����>L�fdd���_������,f2��w���?�l��L�2���3�`��	��z��������q��w��7�@��u1b���9�$x�.]�1c���g�5I�?���$b�����_���[�M�6��,""""""�%��'N��!C���.����]�t1uO������Q7������T��V&*d���"!!�������������0u�T�z��&)��aC��?����X�z��|�%���/��a�L����#U�n����N>���q�������-[��w�}g���J�U��]w�I��b��D���M�d-����B�-P�fM4m��$w�3��7l���N;�����^`>V����s
(�`Yn������`V��V�l��~3��x�'�LB��.[s�c�mwk��e�K�w��_[�Ic&L9�,�����A��od��m��c��i�&���I�&q&��v���w���U�V!$$��5;X�[�R%s��g�+�OTp����j���a��������.22��y��m;�������""""""�J=#��!�e0����eu��Y�0r�H�{���x<��-�=�������I'����P��"L�2p�Q�bbb�k�m&N�0>R��/�L������9���VV����	�@2�����H��e����l���+��L��5��}���[������������u�1!����o&�� bv>�41U�V5���������RO�2i��O�U��s���.�9��Lfr�VVc�Z�hc�����#�.�sssMb�xR�IS.L�2�ZG8����*U���������2���8>/�l���lW|��w��s�A�����C3�k����\�7�pZ�j�������������w8��S�T�V
�
��_l�y9���L�7t��-�EDDDDD$xYN X��Q)a��D���x�b�|l��5�T�bZ+*=�
������6}���L�	Q�����>;�4eKd&?�7<���HJJ2��I�/��c���<`������cM���'�4�����M�o����>���fD4�q}��g�c�|��Y��)S������k��W_��U���?���/���s���XMxNqN�����'��g��������\���	���d�|�1'����d��+��|�KD�|alR<�/1&���k�����@��/���`�S�����/����H�0j�X|��;D{"���L���C���+5��Z]����������&����9���bX�M���Yx����77���������/���_��-ag���+�
�W��aE5���M�h���-��U�#��z��	��o�X��
��;�Uy�����'��}�o���r��;���JNaY�&--�k����{��`��n���(�������z����A��7!��A�s6���7�����$+�	\MG���6O������b`������	-?���D+�\8��A��={���lu�9QY%z�>x-Z��]��yS�1�l�T=R���8:�I����d&&7�n�J�pe��@B������w�mZ��g����>��Q�����b��f��^z	-[�4��-��n���>����W���Y�0i��+���m����9��������G���:u��q8��@���"��!��������5�_y��]3�v��O1��dK���en_��1��_y���[""�c���;�/�b��K1����q��9&fk���a��DDD������S7"��
����?��vbw�>,�������d)/�z���������>h��0�S}�����5��_��@6��.�����8����;w���"48��96~]V���.l����%Z��P����:*�VVL����������g�}6�n����(�y������Jm����Y�+���`'��7��~���v�t�D+��s�=��'�a��f$3��Ve�(>���l���C��/4m�����<6l0�������\w����`}����w`�������	\��=z4���s���n2 �=�\L�6
>� �����"""���fLE�Cw��.������s��w�9��|gn���8X�����8���W�]0�KDD�Z�����N����{�L��3�._�qqqx������@l)"""��������x��g{Q�+����������2�����h�9}�&/��,DJ��������(��4No�N�C&Z_U��X���g�!����Bt�����^��u�\��66��aPW������!
�3�D��J�Q��O����������V�LV2���7�`��-&e`�V��{�����	RV������������@�W�^&�����b���fa�^&F97*�aek���,0	P&:9�+�1��J�����V�=z�0	�����6��j���~�z�2x��U���*V���
������o��	'�`�?>>U�V5����||�x�������#==�L�����r���q!�q����~j�����QV���g�]|6���6��E�c���r�����y��������.<(������Q��������%�^��k����p�B��*hW:]<�O�6mW����BQ%�(Ym���B�����^2���q�=1�~����IDAT�aE��x��i!"��'���_��B���h^�]"�*"��*�DkAA��]�j����[n1I�~�;v4mn�8���Y��k�}�:&i����~��a�L��Y�f��L�2����s�����f��L�����g�*���,��UW]�;v���o7�L�2��J�@K����'c��}8��SL�����O>�$�9?��	�����D�#DDDDDD���S�: q�+�[N���\��{QJJ�o9Z��@�z $���
��N���+�!��d��U�J�;.p�����{ }\�������|;P�|�V|;>p���[pY�~I����cc�/������_�?������5s��mm7z6��k#���
����ocG�m�gED�/�JE+�fe2�-s�P�h�>}���<
���5&6�����.+�
�s�\q��}0�3�~��GLR3�^���>���������0��{w3g*[������e`^�vm�������z�<�	�{����	�$��j��a�'''�������=1���\r�����JDDDDD�����`��C�j]�d	:u�d�[d�V�&���p*�Z���5O\���U�����epW(��s��|��
�
�B; �6�����Mw���Ui\�hX���=���i'��\��e���z�d����=g�e�{��~j(��������-��j�^�4����/,������Q�UD�oJ=��`����|�l���;����w�����2���xe��C�6�%&(���o��&I\�3����]w��[IV������_��N:�����c�+�V9�*�l�[�m���b�a���������u�V��;&[���O?]m�EDDDDD�cL�2��4i>��s����.D�r��0��bcc�{���Hi��������7����������]_��|
��Z���L�+��DA*��vpU���������"BJ^+��N�D����;x��o�;{�SV��iq	�<n`������+���+X����pp �����s7��DD�G��h�H���;�i��f��?��Tu6n���#��l��6�������8 ��W^1��0��xv���&���[N�""""���j��P�����y��}`����U�<Xq=��[9��U�=��.���@�>������v>Rcz����>��,R�b�-\�=��E��pJ����b�M�]Es�:�9��S���BR��u��^��/�[� �
T��B�gu�`H�P�/����E�'Z�r��x������U�V���aaa�U�^}�U���K��������HY��en��VL�:���3U��&T�N������IDDDJIH��z@D]�bgA���.�*����|���w����f�N��3P85��7��t2|kn�w����S����^W�+`�+������$���`����$��MB���������X}a!�S�{1i�$,������U&cy�b����.�Z��*��9���UD���J������-��`���6��87+�����m���\�""""�S$&"r<c���VV����b��}���1��l����\��"""r4Y�
�����fE+\�pU�V�u��0����c��AH�]��fw�1p9���mBH��k��<o>����9�?�������������X�y���a�����w��l�����<��9��C�D��0~�x�w�yh��5�4ibZ	s��N�:���>C~~��""""��W�_�R�x`�%���q���b���x��Gp��w��;�8�67�x#�m���[DDD���v����1j�X|��[L�2��6�����u�5�=�9OEXU/�U�4 ,M*Z�`��w���;���������u�)������J=��*����c������D���Muk�J�p�	'�J�*h���I�r��������^�=�%[�������1����_!""�����������i�P�zu��5�P�/^�v���xWDDD���;��%���_�u���������������g������W�g�n�����/����uXIg����S��V�^�f�i�4b��5
D��]�������6-��nNZ}T
lEDDD���rUD�)"/���^��s/2K���!������O9����`�������L<��woT�Z>� ���J3��S����H�T3��i�������aA�rl?����u�[��QV|_X	�-�����k�""�D�Z�|>3�jRR�YBCCM�*��a���\�t�R�%"""rl��UG��"��[=d�Y�.��6��{�����qkTT������H4k���/���1�9���X)��Ti��:A���w�\�`����h��������[���K�Y�'ZY�g������v��f����4X����\s�s���������UL����]���a&Z�XeL�JV�{����"""R�\�>�7������q�g��z��$8Y�.��bS��I��[�J=��yW�6mj�+=��s��i4h���l���+���/�b�
��eRVDDDDDD����7������O�~�z��U�trz���0z�h�����W)gBb�7��	X�_��S#����������=�{R��z���m����W_���L�0��_|�=��U�fZ,���������HY��/��T�r@q�������z�$ZO=�T3m����H���q���+�D������<,Oe��#��9;h~�wXz�A�uck 9�o^sRn�z���@=���0n�84o��$_���N3w���������*W�����:w��'�xm��Ehh(n��FL�<�&M�M7����p��""""�_��z������<��<�e^���=�\�p �+��,�b;�o��l+�����?�$�>�m�Tm�z�5P�Bu�o�]qc��L�U����h%���n�:�X�RPP���3��EDDD�#+,VD���+���o} �*�����v�%""G��*T0s�r�V��Z�~}3��1����H�a�_��o�����7�Y�,�u����w�e;����b �*DRxE��P	�aH�D��:�]�����6?�<Cy��� �
���%'�w��+)&�N����jt��=���S^��_4�>��6t��
W�O)����?��:~�x�.��+��%�\���T�]�7�|3F�eS���U��Z�����p��W��p7|�7��x�?�*""�����;w����G��-��I�y������p�UWa��yf�V�c��_���.{�;@a|�����/|�G�ud�n�w��f�wA�i�g�o���.>��_`X����Q��T�{����	.��*�1�Q�Y���n��Y\��0���Wqb}+��^""%�z��A��e�����U�V���V���j��h��=&N���*�����G��U(X��Pr�.P�lr����S���YGvN��L2�
�-�����K���X��\
�[�>��8��
a%�
W��j8VtS����H0�q�8���~�A�����3�+W�����������2�DDDD�)V����Q��c^'��B�n�����n
�P�LX���r����S������s������I�^�Y?�����e����'V\/���J8Y��"��J=����K�,ADD�v����r�_�]t����|����[��������p�2���-��O��}����w����`�"�\�cf����Q���9����+
W-G�\'�LKE�������L�/u�I�z�mA��-��:AZ�y	�w���9sL�����G���M|��ES��)s�����[DDD�
��+� �`�L�U�v �
���@t��1+��qU�v�.�����;�,����������:<���;����yL����+"��1�!"r<*�D+�T333MkTT����>44�����W�R�r�]�*B���mD��]&�y� �4n�����kv���
wr
��?�'7Np��OF���]�>lv�p��p�*�R��`�
���u�4�WDDV�;61�
��bvmb\��VDDD�����xo�8|��G�
q� #���&��s_Cf~��Y���f��i;�����)����7�)c�s�������0c��1<�����.��y]`g.��
pbTW$|��tv����yN,��fo�8��{�p%�
+���i]�N�U�J3w�]�V|_g����s��p?���U���""��RO�����J�*f����[K�f�+�
o��IIIf_�R�r9eU�k�r�����v~��m��9K�I�*Z=��!o�l��}��(�\u��
����>>�8��O���n��QSX��p����&X��Q�Bx�^�X��DW�������f)�r
s�����h�*d�g���E{V���v7,�����LP���&l����LBvu�F|�i
vd�A����y�-����)c;��������?���"�����;�����6��o����V�U���$�]��L�a{���*t�����L��9�,w����������Fd=�T�y�D s���E�'���\a����U�6X�-��W��>��Dk�=L�������q�����������n2����S'��n��DDDD�{������s����E����v����F��V����n���Y����%����U1��J(����N��J�M�j����A�-[���#0j�(3x���&����M�4AB�������U!�����8�^?����v��
���P�qa1�]�������3{�$61�����]��F��5M�%"$��p����y�H�;������e�e�
s��Pg�f%Js7���Lx�^����[u��~=�����x�T��V\W�Y����_�+�����nW�a�*tFD�d�[�@���v|q��Jd"*E�!)"�a�p���8�X!�b;���M�tZw������������;���J=�J���x����A�3YYY:t(���O<O=������[DDD�t�k�F�cQ��gM���\������V�$*+[m�����KM|E��v~��/o�/�*����v�X:�����e[��� ����x��l�����	;�������e�X���k��{w�9�<��o��'�x
64s�r�);��sw/1����[�_�'&Xs
�L�jrt4�X��g��=��:�	�=�f�����������%�
�A\X,���+�(#�t�PX��J<�$��t���-�����p����n���m����-�n������ ��g!�0�T�Z��v��~�!��v|�Y	�u�w����]�[�\��G��]�4�BU�����U�!XU.FFH������2��{�s�g	?o��Z\��8o�v�}��7l�F��M���S0e�\�v�n����OBJ�>�]��RO���BJJ����7����k���������5kL��Q�F��EDDD��v�����zBOd���I�z��D�o�P�|	�z�E��%H�N�*��U)	��� ���H��fd��vA�OO��-y�g8'�Q�<XIN0�W�F_���Hy�)p,�s���������>����>�~�m3��~��f�����%��a��D�b-���N�2Q����W�0L�2����#?m����[�����2�*u�+�D���t,HY��Z���J�k�cs_�#s^5��N�:+�o�{V��MS�{"C���Jk�X�3z$��)��������Wcx���&������r��lw��`��EzA6~v>�;�����A�7����&m���}��;l�����������3��r##��X��I�Fx��g�2�3d�����x{c�V��������E��$??~�!f���{��GIU	R>�0s�u�)�?���_t�?O�'0�h�7���zpD��r�RDE\��L����Y'""b��k���;���[g���r:w��_+"""�
�Q���68�$E��9��b�j���q��Sk�4�a}��d�w�[����.g���~�����8��f�W.��{�y������1���w���3���k������D��5c[�����3f[�f{a��{����^
+��{'��� ?V�yp��p9��G`�|�91�����k}ub� ���������SW��`E40����Z��k
V��s���(������i;�cc�6m}vg�CxH("C"p������ 4�XY�xb�[X�b�bLtLh�^6�T��s��Z=�����6m3����$n��
*�F�������xmR>2s��lU���������k:�	���	�����������%YQML�<�C������-�X�7nm}�96�E�W���)<<�d������<e"""D��
�3���=�	�^�o����;u*|�>1����7��5��f���Y�m""R����"55n���)�z$w�e��0m��'4����w�����G;
��oD����Suck���4>�T3�:���W�$+1���@Rd^�y?>��L�$Y�s�2���2�KL�������<����N������.�o&�����JW�/�8�W'��g�e[Xw�Epw�Q���l`��EXU�;�����fN_�sO�����y��	S�5�Y������-4�/4��D�ML_-:�D�b�U�e��������4���r���r,HY�E{V����ShW�����7��~�!%{�T�b�r����v�o���8q"����E������S�N5������xP�J�\Ge�X����e$��o��2��v��O�x����}W�����,�9��\��Vmc�N�m��69����];��c�S���?��{7�n�zp��k���L�+"""
|�f������5%���=�u��+��'��|>��i��k��x��81{tS o'��UpU:����������`%�+?�y��;?��>�T�Y{|Y��Q@TS��{�*G&[%x����c��z�5L5+t���Y��7��������i�<o�^���;������p���
�2��8?+�����L���k��-3L��rd����������
^��9v��*�.����3[���������,��m;�)�P�f��f���d�&U��%�������o9\��:�R�����U�~E���b��}&���*��5��eX>��c,_���+"""R��Y+�k�	��V�;��Z�����:�	&{����%K���_�����)��Rb4h�I��������5qV����.>�"��b�R52� >�~���e@����=�����T��1�T����"��7��O����+�l�Z}
w�/`Y���c���aUT�sA
�=�!�(G%��������=�����M�w���b��f~U���/�����}T`k��q����o����d��������U�b���[��My������jW�n�����M�>G+��m�8����3�_�re3����EDDD���sL �W�-��J<�ODD���6GkZZ�O�nZ	�����*T��_#"""R��{��>}+������Y�������ZT��_&y�a������������l�Y]��*j'�k4\������������
��{`��
VLk�;?v�&�<�w�cp%�x�`��u����8��^�NXu��"��N�	��W`��a%�+�D���0�����[�.}�����'V���<H��l*R����<.���*u6elG\x,Z&4D�'�lg%���KM��e����������wT�h���Gbb"6l����4k���	f%����Q�n]����""""""R�U�X�T��l���w�9���^�z�����8>����d���E��z�V�-�Ukg���[��$+�#M%��t�I��P���/M����x�v�o��mx��{�[@x-X����-�v
x7=���a1��VT#�j����!Y�R��������w;��]_���������4�>�f��Z�_�N���Yz���[Vj�V�����]��A
�F��;����rIV��BL�x����Y�UJ�Q�l���>|8���^l���T�8pS�L����q�}���W��,??����>�l�B�v���;���$`��U7'9��MG�jV�
v7z	!=v��y1�g�����>�&�U�1��?��=�8+�7B:������:/����f_������V_�V��/A��{�hx����;��oa������]��I���h��^���9j�~�i�n��T���US�N��/�����~S0*"""��+�	������,�O%'�HV�`�9Z���K�y�������o[�h�Y�f���^x������}�������]��r�z�8�������6����A�
Ov�����7v���.��%�������>%Z�'G%��k�.$''�Q�F	��bcXX�	Lk��i�z����H9��2��X�����Z}W�qps���e	*����v����pc��/��to��w��������9�x~���g�H�<�q�0�Q<��m���<��(|�n�g
^VL[X��kA%Y��4*�7-���Q��V�����dee!==��
����L��� **Js����H����]
G��������Y��X��DVh
�������]$���?�u_��������bn:�o�
�m����`�����w��m�5RD�L`����-������EDDDD�SF~&~�:�r�����������
���=-?��� �
�����W�����`���ig��p����(��R��<Z�li�P�	���o�h�"����Ox�����m���""""���V��fD���l�Y������mBNa>&;A��u0i�L�#�l���)��b��]�a�l���)��b������v,����&��D,�q{��""�T���Q�B���[��q��������G!11IIIf��������Z�����p�j�^�T�	V�W�'9^�z��#}�7o���c������{q�u������2������UDDD�W�5p%�
�#��@����]>�F����qu�"��am�X�Z5*68
��X��g�Fg��U� ���_��.�������\�,UI��Kqqq2d,X������j�J�P�vm��77�p���$"""""A��g\�E�U���7����\�����������{���}���������u��}DDDD���:@h�s��hO�I��x��&����k�����l��y��?���i8P���U����7��Fbx<����k�����;!=/=�;�m��� ""���x���C��O>��={�W�^x���1~�xt��M��EDD����>�
�]���E�����e��b]����u�q�Rvkb|��ue�z�J�h���b(���^�����Si�V���Q+�C��uM�y�I'������DDDD��}���e��8���� e���	&�^��5� �Ok�6#!"�n���{cH��/���,S���	\C����0<��m������Dj�:uL��q��a������{L|�$�����G�2�������c���{�X��e����I�|,�]}p�����V}��?@Na�o���V�7���e:~�<
�,�c�O����X�������$�_]��sT�����3g���
4h���T�R�V-��Y��
fek^���bDDDD�����x��}���7�.��m�XD���9:8><C[_���C��h_{r�l
�]�k�[��M��� ��N7#:$��Yf9�x�q��5x��q�UW�:;v���-"""R>���� �*�V0�;n�0�No���R������t'�-�o�}���fz�0��"����6>g���_��B�]h�����6�U�����X��k���������e���;����������q��%&_���5�WDDD���%�S������m�V��6�Vg��D!1"�����������~�d|��k����#+���'c��xg���[�:jDWA����^�=:$���K>q��\�Z��XDD����<���x����y�fs�����	���j�'"""�_��$4Oh����y&��c���{g��e���A�Z�����i[��9!fz9�<d�@VA��3qR����r���~l-4��o8MO���1U�f9�X6������|��������q����k��fN�`�]r�=��
�W�aU��`���Q����ED�WLh^{���{���+0x�`>��s����H�5e�\<��}��F��5��<���i��>�F�����!a8��)�m��P���"9�
����G:���6M���F#���kcD���&mf�\���[��55:
CZ\���!�6��E��M�9�����	���@��F�5"e����xmR>2s��lU�����������������<D]}"�;g#�zy��[K�����t�
0a�t�?�E���
�������\���)��Z��F��Z����"""���]�m�����g��7�m���^��CDD����3�����$�����k��w����g'?�O���T��X��
�L'�o���mv��
��$-���l���[�<��v�P���fe����S�����E�7�,��L��rno3��J>�vO��5�gN�&q�S�{��a���������f}�����1�����b�`z�uf[�����d:�����4 �s���R�z����i���U���kQPp��b�����7��?�������-#�����""��8��/7�DDDD�+[��7@th�i���zg�����1�^���o���m��\���x��=�������9�����)���Rc�T�B�t��m��E�F&!�.���6T
��y
N�}���N7���7bX����R���NY�-�;s1|�G��j���$R}���M�V��>������������kBv�d��p�}��w���=�v~\����9���y�\�����Ro��i8G���?���w�v����*9:&""��~:�w����_+"""R�Z�w�q�O������NII��?���E����)Q����_=����kDDDDD���}@�z�2���!�M��m��aE��w����O�+�j��o�S|\��t�
�Q�T���>;u
|{���j;m�����y�&���d����y�u���+Z�a�l���,S�L�O?�Tb���_�i�&��IDDDDDD������s���{���W^y/������w������{�����H�b����b;���^���.�(H�+����ZO���gx�
�D�v�,���:��pU���#��<�y���J�2SY�R��z�544��{.~��W,]�K�,��E�J,��M�E]d�)�X���������l\|��m7n������{���\�)~]����8�����i����������C7>S�M�DDDDD���P89
�?��>�2�+�����k��}�u�I�Z�g��~l_�>����9�+,����;�r�����m���m)�J-�� )''��n�aaa�p.����DDDDDDD�5&����������TS�z�����T<�������/ //��&����/�F�HNN6s�ri��&N���IN��#F�@�6m��aCt��?��#rss�{�$�o��F�t�r����������|�����];t����n���f��?�<���EDDDDJ���U91��a�%���
{��V�{�d���D�[L�\3�k�N�������pDm�����w|�V6�W;{
\�������{���o��gHyVj����7�_�~>|8^�ut��M�49��m}�Q��ODDDDDD�Xc���I���SO���;v����>�;��������,8p�&L���o��}��a	`&F�l�b��L�2����'�4���2v�X�=W_}�i���G��O�:��������������z���L��d/�������;>��c�9�t�b;f&b�{�3�Z�2�DDDDD�6��-����b���`�N��V�+ag��l�U�bX!1�S���b/X���U����a�pU��<������J���S`��.�t�r������fTk���Q�N���}��9��mA�r�z'c���8�
�0q��#uj���Xc���7�0U��V�B�*U�[����e���:u��A���>\8�+[��w���?4�<��{���?�F���o�1�9o�<|��wf�����������������L�rpv���I��U�l���s��3�<�����,""""ry��J��	b����xu5	W��aya%�	�R�0u�}�F/��~��j������p�{�l��"V�@�<��{fQU��{����\�2�y�2��~:^{�5����G\��o���x4���������L��x���b3))�$�4d����{����w��-���[q�u���>0��V�\���g>'�`��***�����F�n��f�������Y����dm�
L2v��f�!����4�L�2�a��Z�g��������������U*!�L��2&&n��,*T@ll�n�>���_~w�q�I��w�\��@]�l�I�����s��1��#���L���U����|>�f2��+V���Z��f�+V���������+�\��r��q��l����L�,+l��q�����,�Z>�O�r��k�}9��v���������g�pz}u^]����l�Y�z����43w.�����c�%�y�c����/�����r��zG�������K����;����[���x������[o��6���Z�=�_����]v�i�;t�P��������g�.�Q1��9W���\�'�p�a����'<�����5��o��O<���_~�%�,Yb����V��X��<�	i>�?���l3��Xo��V\|��8���M�5;;�t�b���Z�s��2�������q����OBJ�>l=����	�����+�?�������yh������j��zH���<n"N�����c��a6g����m�-�C���X�w��A�'���GTH�9/��An"��_�����Bd��W�e
�^X�}6�����ds�0"���g��n���$ o��!"�n������C�^�o8�i�z����8����9������D��������""�K����p���S�N5-w�U�4����J�.^��'O6s���[�$2Yez�
7�M�6x�������U����?7I�_|c��9,�����_n~_��Z���X���Ga���x������_��/�0IX��?�8�������*nEDDD�)v���?l*���L������R���b��yX�o�I�����`���~��?��y��R#|��k����O�j�_����������Bhz$w@�
��9���T)m�6�c����?r��FI���OQw�[/"d�,s�0!!�?�b��t*�[Py��p{w�7�T���}��� �%��]��7|��r�^������������E��O�P�;J������(�*"R��h�k�07i�$s|8o*q^�	&��i�����snT��
T������~�y��+R�s����&)�6�o���Y��;�`���&��p\\�����c�|�O>�����������>k��������3?�_�~��q�����C���k���h��S 0��3{�\�3*�U�u�8�G8�h�)���uq~����t���D�u�����{	��2��R#|��������E\x����Y�~h�P�k�0<222T�*G���|<'Y�G���J!�=%��v��\sg���	��w�e��<��-��|\���K*���j#Q�
��,���?�o9\���pU���J���?�U��yyyft����d�>77��P��+"""R)�*"R��z�����Z���E��o���8����}&QY���V��he,�c�
�x��U3������
3������DqL�2��}X�H�29��W�V�������h��������^�z�����c�=v�q�kL�������6�
�9�|���f.W���������k�@)"""��K��z���@
<�T�LDva��D�����q��Dbo�~�Il������������k����t�x���o,�w�l�o���������#+�?^��]�{1��e�]��D�h�e���R���#��Z�ta�EE33����jn�b���7"������-��m�o=DdcXMF������s^�o8����1��e�	-����U�vT�@|�:`��j�
��w���{M+!�Pe��Q"""""""e����3��L������grq��M������M��u��f�<�������Y������g��V.l��h�"�x���,����?����[YI�s�N��s��������i���gOS��V+&?'N����7��SO-�d%&a�L�b�l����`~���t3`�?�����-Z�h��E����M��a�[5����
1�,�����
�o���N��j���:�L���������E��_�E\X�Mj�A
N�����{+��UBc3�d�j�pN�~��D��U���W���/-ZJc9�\�p���^����������������WJ=���k��Ux��������n��`����DT�^�_.��
)�8��U���sZ�h��/���gRr���x��W��@b�����7�]w��[o��$�y��l�����y�L�#F���FX��*Z��z�m���i�F�p�%��6��j�2���/���^h*�9�*�^;u���
��:��Lw���<?�L����{x����b�
��DDDD����<��F����[~h��L�`�;�No3��W���)g�[^�hO$N�{"���1��	]��>�\r��8�vO�p�[���2i\)�J=��J���	�T1Xb��&Yo��F������������HY������$?��S�\d|�*O&+9�x��}�����=�����M���U�V��?l���Z���;���>�(�T�b���i����
��n���I6w���T�^q�f�V����q�u���_4IW��z�������V����[W�T���>��7�/�`9G+�������HYS��Vk�_�m����� �����Hdee�}EDDDDDD�*��$��[7�pp1[	3i�y[���ew)�8��Y;M]}��x������/��'��0Q��O�x,���SYq�D-���q&wG�i:\1Y���'�7x�`3�P��L�2���r�C�""""""eA�'Z�qT*�d
����t�����u�i
th�'""""""R�0Y���������L�h���������RO�r�i�.]�g�}&L@FF�L�b������m�j���������il���M�9:k���������w�1���""""""�J=���?u��5���H��-�w��5�\�^x��U�C=�F��h$""""""R��
��7�h��8p �:�,,Y����Cvv6�
��V��D�'Z��r�E�3f6l��_���^�r%~��g3���YEDDDDD����:`��Qx��gp������<�7�|�[�� b���QI�r.�e���6J@��=M�`V����s��|>��"""""""e�ee���?�{�����-��b�����C�'Z��]���?���i�X�*��?��=��	JEDDDDDD�2��/��2�}�]�����		AAAF��?����f��������RO���u��9���4-�4h`�(U�\���~�al��3g�4���������U�w�����M|��sg�&%%�����]w�����{����-""""""����^����HHH@���K����x��qcT�R)))J�������H��A��k6lXb.VV�6o��L����""""""��RO�2�d���V��->+os�����}EDDDDDD����(3�x��5%���
L622��VDDDDDD�Y�'Zd�o��$Q�Z�s����/���_���oc���f0�)^�*""""""R�p��-[���^���?��S�b��)�����jb[���W��V&Q5j�|���<��=�\�s�9���{�:n�>��.��������5��������E�l���Kq�e����[���!C��[DDDDDD�Y�'Z���m���7�|�M�6a��Uf��q�Y�m�f��������7�x������s1o�<�6���^C���5�XDDDDD�8qT����k�c��o�����w�^�2�������{��������M�]srr������0��������HKK3s�������H�;*�V&Q���k\y�����z��]b8p �����|�#DDDDDDD�&Q/^�#F��p�����O<�����""""""�J=����0g��V)$$���z�%��X�?�|4n�X��EDDDDD�Lc����>����			�_�~����Y�*""""""����X�n�	@~�a�>���%�|]�v5�X��j�����y3n��v�s�=6lX���k�E||�o	f��hu�\Gbb"bcc�}���������i��������9l�,����������R�z�J�m��(,,�������"""""""R�T�V
5j����3���n�8�0+""""""����L����{��������U+�o�����W/�=����G��������=>��(~��W��8/��b�����61����������8-��u�q��}�S�'Z�n���,l!��kZZZ����Y��Q�"""R��=�����1��M�P�bE��?�}�]�e��	�����-"""""�B+�����s(�8�������e���&
�c#"""��o������9�)��)&$����J��_!""�+D���Z��c���v��m���B�*U�\�""""""e����xmR>2s��lU������������������x'���q� s�N�
��[`g�0���zp5xV���	�����/m<��uz���W &4����+��Vb�U�K�,��i�0u����)S��`�������H�`%�+��0�k�9�
���D�D����`j�h�U�����d�ZXDDDDD$X�^/
�������pw�!����av��������x&�(�1�����|�����O�c�dgg���?���9���������o�V����7��I�7�h���k�D���h����O�ZE+c��+W���?��U�JT�fdd���o���������h����3�G����W�3�h�0�\�`���K4k�C�5#|[�hanw����-[���_)���~p5x���-�^����J���!�����O��~@xx��w�o����
6��7!!��������H�\p�V��9��z����7nD�J�p��7��[oE�~�L���n�
7�tbccMka��*""""""e�g��e���NSm��t�����:lb���H��""""""���H��@�r���V���V��V����C����Q��^��m����Q�F���0����)��FGG�y��&���I,^�aaa&��|�r�����������H�vBo�b*����i�
�����J=��v�III���Gff�YW�zu�he�YXXh�Y9ok��mDDDDDDD�&WCCC�\���qc�����gv���c_�����-*�<
Q�_��S�4K���=�.�>�
��h������hm��RRRp���c���f�/�Y|�A�^i����\���h�2��k||<>��3���u��5����'���/�S�Z�����H0pWMF��W#��{�3�D<��mQ�!��0W7;7��W6=M���VL2*����*yB����R��Y���Mk��Q�V-3���O?��+��O\|������?BDDDDDDX�`��k��w�y<����W��6m��{���^����q�y���SN�@b)s6��0o���������-K/��	�B���h�����C�8�V7���
�� >,ub�#���?���lN�z����555�k�Fxx��������H���~�^{��^��M{��ATTbbbL\������'�p��>��Gx��������IK���|d�95���#/9B���;��s�J<��F������_��%����wv�l�o�h�q9pU�	v�F���9��<��*�{���+��k�u	(�"=/�$c����'*��J��m�v���%K���X����eK��_n���VDDDDDD�we1�*"""""R�o�Vv�,���
�m���3@t+�{���7V�@X�����E���o���;�$T��z�w~;w��w$��5���7��T��y��@�K�R	��YT�z�~���x��7��5����-�P�n��6�>8,,��VDDD��pN"}�'�rN����	N�����f:'�]`Uh��U�O��N���4F����f���[�'��
a%������<�nX�����J}�|�r��%ZY�:y�d>+W�<l qbb����I���a���59��p����-��8'��������v%��U7��V�
��}�Y���S�[��Kw�=X��W���p%�Ui����`����j�b7X�� ������r4Wk�'Z

��g�a��Q���?5j����D�]� �N�:�m9��S�� G�Y��yL��`g����c�S�91<VD=���m���}��
+�)\���/�7���{3�����[m0�6pN-��sE�U�Q��aj3)"r���h��};.��8p={�DBBB�6��������L�UDDDDD�,94��P&���-d���-�he������y��k�}�(J�F6�w�5��������������t�m�T����
��������s�o���k�n�
�
�M�`;m�����Q����v����a��v�(,,��3���������W��q�K��
�9lDDD��a�'����}Yp��sN�8'���k�|�bZ8'���h�	�7��%WY	�l�������������<v
��u�qN,[;ge1����HI,@�v�������7c��	x��g1d��l-�t�����*"""""R�,�����^S�Z�������q�7
A��.>���M������= �w�@�B*�N�+�
�ItnO�+����v�����`y�MW7���z��c����S���v{�E]�|��9x=�p�(x����VX���_N�z�(�_�W���TMKK;������H��
����1�j�����U�=\����E����P�\�"�a��}�i�]���p�y�s!4	����U�qg�*��ew�NDD����S����oEDDDD��I��pN���?�N	�]<8�U�;17�
����T2����fU��_����U�+|)_�v��N5����V4W�;��}���`1���	�
��f���I�"�rG�J:��YL�����X�^��*���dl�����>RSS�a�,_����f���nT�XQ��EDD��+LwN��w�@A�s��v�"��>��O�}��Z��s�m���"��D++\M�k�NX��`g�wN#�����#���i���d����Ugy�J��NDED���V����t�����R�
������}p���5�������HY����B�����d��or���#"���t-\�Yo���m�5��r�������a��2���q����\��<	�/Vtg]�_g������t��������J:O6���^Ss9��N8�	��9��M�U�s���W�^�{����O7��pFGGc��a����V�z/����������k�n��������s��v�X5n6���|���fg,���-������pUb��p���9����;o��gXb�[��UDDJ(ks����?��w���{�6�]��W4i���FDDDDD�l��a�g�*Xp�����/��:��n�vB/��R���[�x.B�5�<����}0���X�Q�:������g}������,e�p^:\�ccCc��~��z��
��Y��RO�2���O0j�(\x��8p�I�Fy����d�<�"""R�)_���f������Q�3�������������&�jg�uN8��z�7��/��D����E#����������U�1 ��Y/""*k�V��z�������C�:uJ&

E��m�v�2��E��_`��#�s7�����O�BB����W\<|)�Q�n5B[��o�>d�1"/���[a�T@��e�{*����_�\���Q!���P�mva��	��m6vf�A��J���5��bon**�����}�D�W�����<�d���?LUk��%��������_)k���K���L�>�(N8��Z�r��C���(���T����_"������n���s/B��"�kO��n���|?
���
_�.D^v
r������u�`�+��{'����njZC����r��'l���g�hn��:�qk�+�U���'���4l��J�����
W��(>>��U��Lk+����z���T�����,���w�q�% ��IpE���k;B���w�6X* z�P�_����s�Q�a-\1P�j9�;��`�<�������T�|>���'N4��30y�d������S���l�����UDDDDDD�_,@�v��������~������FZZ6m���7�e���HHH0-�EDDDDD��|����I��mOb\����������[���#��/�N����m�5�U��o{�^�M���Wg���y��OA�w���B��?���������?k�����h}�����-�m�_iW]��F����S��:8??_~�%F��]�v��V��U�P��v.��b3O������������/��'�����r).11�.fg'��d_��g��a�����MB���i�@l��L���\��,��n��u�������|g�����up�'Z����������-�U�������t�u��)k�VV�2�n:3�����mkb\��fw��Wx�l��������[-M���PXX����w�}7RSSQ�j�����+#**JIV)�87��9sP�n]������G�J������H�U9��A]<8���`��J;��J=��9Z���a��)�Z�R�����b����5""""""r�*�D+[)5l����:v�XL�23f�(���=;w�4IY��*99-Z���1c�r�J������,;;������H�;*���Z�����z
^x!
Tb������O?�����(��g������O��+��e���M��$���k�{������H0��R����z�t�RS�����_[[
w����n���VDDDDDD�wo��6���Z��c����h�����))22�_~9�kDDDDDD�&l���g���w��uz���W &4����+�Dkq�Q��iBBBP�fMDGG��4����������%Z�c�@g&N��8WDDDDDD�,���:8�������z������M��������o����{��������myyy�0a��go��F�>���GNN�/	vG%��}�v<��#=z4��o���>�(��k�1c�����6��DDDDDDD�2V�~������������R�J�S�o����C���4S�������H�+�D+�Y�fa���x��7������3�4o����X�n���kZ��������U���?�)����'���/��~��W������_��*"""""R���qs���y��f���8������cr��]��[����F�����1yy!�>��98���}���1�p�Y5%�y�������f���f>�&M��������z��f����|���g���������3��.�n���������~ul�cf�:/���!�c���MC0��(�pG��^�Cj���XS�3�{p�ia����96��m\�#�\�[N��T�v��~^R�i�
�?I���:���M�s��Z�m��������eY�-"""""""e�X&VCCC�k�f��[������+=�q�	D��W�����+�F��.��0��I��EY�k!��Ff��
�6����/����'4pc��I��|@�:n�3
�z��U�M�6Eff&���K,[������\��������v)kX����?����^
��o���{T�P�����""""""��	��[�x{rQb�H���a!@��������f��T�~>�y�C#�,���������������qi�P$�X�)����,��5�!G���u��f�������~;���^��6�q���"""""""eUBB�=�\|���&�=��3q�g���?~�i��[DDDDD�t�Wlr�=��Y���l����^4��B��9���q~'�"-���B�=+S|H��M+�m]��kZ:�����F���R�l�%��3�w�^�����K.�SO=�~����*����.�L���������I>��`;`N{�d���?oZ3����?"22/��"�:�,�>XDDDDD�h����QWs����,��5IR��W`��q��uy!R�l�75�S|���C-T����cr���Z{���C���9������XAS�XN�X-��6m���n��T�n���w���A�L����e����2-�47���������o��k���������/����<���8p�f���=zh���������0u�<�>�����]�/niu�<�5e_�U�b����3gV�Xa�c��s����������={����}p��������HY�Xu��-�9s&~��'<����4i�I����?���""""""RR��z�]���
�Qh�l/OIV*��V&Q��c����1U��GyC�1�"""""""t�+Z9Hx����[���z���k�U���P��F��������G�z��kDDDDDD$`��E�a�T�����3��B"��r������W��RK������h�q�����s�=����BBB��A��Y���*""""""B�:�JL��]���m3�~�������L��P���k��f@��������d;�K��@Na��M!�T�A�;��/OJ5�J������OL0z�M7!99��EDDDDDD����Dk��M�6���?�W\��U�����W��DDDDDD$���Q����Y����kDDDDDDD�&P���0m�4�^���?�"""""""��RO�2����6��ddd��mDDDDDDD�#Nw��Y�*�9��z�`V�N�<�>�����n��/1���O9�t����#""""""Be�u0���C�5�[�nm���87���_���D�	VGe��/���=�v����m��*T���n�
_|1����D�""""""R:�Z�u��e8��3�q��#��L�N�4	�7���`U��V>=�fMOO7������������|6""""""rPYK��]pAA���������v��hMNN6os>��U��Z�j�R����J�������HY�*;11����c:7�����+���w�d9>�������1}��E�:u��}{����-������?������EDDDDDD����T|���f
��O>W_}5~��w������a�_V��������B��2�c���(�:KV�_��7O�����-��	��gb��y��e��oq[�����\���a�k���X�o��Qe��a��v�`��r�J<������i���U�V����2#}���g�����z������s��]���/������~����%��y�^�_�����u�V������!!!f��pd3G:/]��<v����1|����[�d	6m�d�-s�������8P�J`����9���ZDDDDD��[�`��k��w�1��������o�^�z�Q��I�r`���~��;w��N0q����0W�^����o�n:J1�8p����w�y��-��j��i������q)��3c����#22��G�>'N4�L�0�[������g��i��S�N5�	��U �e���1c����8�NDDDDD�6�����k0q�t��m6z%wDJ�~|��7��b�������Q�&�:a�t,��
��|�OY�(O$&:��<�Y��������6`���h�P+S�#)2.�lt*�D+�Y��Y���s�I��������+M�`V���;�O-Z�0��c�U�?��xH���{L�2��g@���B�
&:y�d<�����/����b��i&�c0z�`��f��?���_�A��q�L��3�Q>�����SO����3��`�A&V&N�xe����c���&����N>�	��-[���""""""�]YK�r-����[oELL~��76��f�{�I'���X����o�����U2q�����w7�~���x���M|��L�2�e|�W�V����[��HHH0�1�z&��w��c���]w�e~�]>/c�n�����|���_�?O����D�3�J�_�~f���������
E|xE�J���LU���mP��I��G��~lMd�`��98�v�P�������!� 4<)9�����HO8f�Z���l;�5���d��.�(�t/G�����[���%�p�f ���E�}�%V�2��Q�#G��K/��3�<�$[�q��-[�����6��#Lb�R�Jx���M2���8���Y)��R���

d�L�2�JU���}��G���/��O�'�|b�<6����e���^0����'����o��]�tA�&M�?YDDDDDD�K�o�M�O�>f�p�����������=6#���1�g�}fbM���w������8���!CL����o6�Sn;R|�u�G�s 1���f 0���o����;�4�h&rY������>k���IT&P�����3y����wg=j�(�z����UDDDDD���_|x,�E%��**�dR4����'���Y{pB�6f}��6��7�o1	�=9���UF�;��4�T��Z���
���:Tn�*����R�2�d�RO��B�II��Z<Pcp���L�*��Z��6s����P���\�_|14h`�F&�����{�	���5� 3�f�$��b)�8p �>�l3����G�L%������.�����cG\w�u�U��I���W�^m���R���MBx��m(((��Y�L;b��-�jXDDDDDD�;��d�q�FG��a�f�)b��~��{����M��X���X=��%������gvR������1,��Cq�v`�����X��f�������M|�$jZZ��o�����������������f�����9(�������-�/��V<=�md���l�k�7����G�e���r��f[DH8N��
?m��[�=��	�����-���S_������&�9_9��������A����_�V�eA�'Ztu����v��W��e�p���x��gL��U��m�i�`�LprD.�,�1d��?�0s���0�q�k�6�b�f����x�
��e�@��u�pe���8�]\r>'�95jd��R���30��Lb3��U+����L������H0��W&�x�
�w������3LE'cEv=:���d�(+YGcZ����IL���5y;0
�J��;c����>&;;�������2���d"�1��.Wla�A�lQ�����;v�0�[&Y9���Ye���j,""""R>t��_���n-bBK���-7dc��y�����a�6m36flC���0�����
m���Nl
�y����9X����7��e|����y�OANaz&w���A������RO�2����U���2�b���s��b�����{�\��2A�����u����a��s��%0��6Y��D+o0�e�����V�"��s����y���2��n�.p�/�Q�c������T��?H�V��Z&���L.)�������l����t�)^�
<��eMJJ�I3y�JQ&Q��w-���0�1e<{(��\_<9K�e9���\Nm������xqcZ���={���<��>�a��h����f��8�:u�?RDDDDD��(O����U������]��:Wi���;!��g�>'��*�B���8�NtHj�SjuG��C��8��		C�*�P)"���
I	h�����(,'@:<r*%�e����$���z,+Y�
W�f��M<���&���c8j�s�0`ee.�?���HJJ�o)J�r����
�<����%��������n��c��Q���++l���;3�
�������-w�Yg��n8j�������I�&�W�^fN&�EDDDDD�+�D�^{��^��x�mY�����I2��-K[�����|������	N�1b��*\��w�q��8gk�d)���O&������5���>��f�V���q�&��``�f0��Y:f+�	0��n�:3 �q5>os�9��cb�r\�w��"""""R	9��x��������
5����=�g�s����J5��?��U���cns�+�,��j8��]�Og�����Q���V���
3���1�y�
7�Q��G�>�B	����SO=e�����������f�U���'G>�s�r��#GlK�`�����?�`��$m��P9�+���>��<���6��Q�L���hj�~<��UDDDDD��*��S����b����!��� ��yn��&������g������'cD�}���p�W�
��=R��	�[n�����O�������W_5����V�Wf��1+?&Z�c���c�!>>C�5IYO.�z\>����{�5�-��&"""""�s��/K0�`Nv�al���m����:�9p2�������m�bH����������_����	�RK�2�c��������e�!H�������\+�-B��]�$�����.����	T��r�)&�Z����	X����\^�7o6��4ib��E���|�
^{�53*�_�~f�.�������u���9��.�(cV�2���h&^�2�
�����W^1�Y������KL�:y�d43�z�������9�B���0�-
e!���m��f�����M|�����-�U�&����q+�_%vHz��w��7T{�=���g�^|���By��(��+��-[����	'�����VE��t��&V=��s�ka��?�$t9���=k�,T�V�lg"u����]��I�O��>�]�xQ���:������2-��{�=�#�/���e	"L���D+�(��:g�3��+6���g�������)������6m�������IX2�+�4%n����]������i�LR�A+�CG�21�jV�W]u������IY�_��K�.5����}��&P���D5����s�0��(`�	f�� ��0G3���f������r��V���f��!&�<�L,/[��$�>��c4h���g��$++Yg��m�=���K\D`,��(�'q{�>}������$cS���^x`"���w�nbc���{������]��39����3�<�/CV�2�eG��s�qDD��"��1�#ppr�����]��""""""e��	����O1�{���M0w�}��K�.���mp�����=X�����V�r�-[�2�
P��e�!.l��6���3����y6n�hk&>/��BS� �#t���m�,�Z��$?Y2�}9������A���a�/��LL������pe0�}���x����	aV�v���l�c����l���i&]���#"""""R����x�����c@���d"��b�F�L�����c��	�W��������j����+��5\�P��>�U���k������a�{�E�9�s���d������y�)��Y�������v���X-�x���
W��(|��f��k�^z�������'�-�e�&V�2v)KJ-��$#�n���^e2����2������,ek#�l��.��wfK�*U��VGTO�:��������S'�B�#|y�U����7IT�frv������_L��*Z&Q�Xe��$-�1c���N���7�L
�g���|��^�[��g ���+�6l0�C���Mp*"""""R�D+�Ya'!��e�����m�d���������l��w��ew%&9��3N,L3Ng,������9����}��d�mx��(���y�,e�$&X�7n��MYu�������}��X�z�i����jWN���a�1*��*�U����x<fa�����l��tp:�S������I��f0�jQ�x:t�Y��y��gF��}pY�6��������$�F��e�t��&�����+�I�s1����@p�d,�P9B���\e �*���u�Vl����������}�D*�aPR9j���<���I|hc���X�f���3���ql��]�������2���_��G�D&c[��L&s�@�3g�9�\��L�2����2����q;��>���?�H���<����e�������+"""""R�(�*""""""eVYO�2���g��u""""""r|)9�TDDDDDDD�V�l��V�\x;++�,�u\�o�~�:TDDDDDD�[�U����)���]�v���5������1x����wEDDDDDD�JE+�0m������l��x�b�
�m��fq
�'�x5k����`Uj�����c���ft���Z9����u�s��	����L��MWRR�W�~\'�����v�Zddd��8on�2y8��6W/���`�6*U��_[������,""�\�>��'l�Q�9�y��a����E�94�/�W^���V�Zf~�`�V�3���W�Z�k��{���f���t�=��l}�y���_�k����6�|
��������t�Rs;���S^�j��|�<f���f��_�}S�F
3�\?O�����c���l�+�O0��#%%��^8w[hr��s��X�s��_��u����_'<�{������Y�V���c^<��=������+�<�|
>/��Z�j�y�KbccQ�N���`�O�<.|
q�m����x;�8��V�7�1c�Yx��'**
�]v�kDDDDDD$h�"�Haa�=i�$���O�[�ha�o��>�������������u�Y�`���C;99��_����A�a���UW]e�������!//������n��������-���b?���v��-��;�m����n�Y����|�������W�Ze_t�E�%�\�_[$77�~����5j�u��1�.|o}����������#F�]�v�;u�d^��z�y���C����k��f^G���U+��k����]k�������~��8��u���	'�`�k�����;����!���/�������M���������c�	&����}p��'�]�t��7on���Y`�w�}��V:w�l�����Y�f<n�����<������?+�w?��s��E�������?[�.<���'��5���O����	�k���7�|c����|�����s���L�b�����
^�/���ic_y��%>/v��e�����Z�j���\`/Y���W��'��f��i_|���=������>�((?k����z����g:?���������g�A���g����8w��yAy�OM�:�|OFGG\*V�h?����]����i�~�������k��u�V{���vBB��}��WMl����c�''N����W\Q�u��n��A���;��������U�{����6n�hb]�&M��x��Q���k�^��1�\��}����Qh���v������������\�/_n������<�5jT��R~�L�>�����9.��:~���}������y����3fL��7##����;J�F��-Z���Wp���#�<b�ol�������a�t�I_'<����.�������{'++�����a�^S��o���������{y](�9�����5kf^'�<�={�qs^�~������y���hvV�u�]�����N�3g�i���f��������
\p�z�����T��z$�9�gf>��>�O?���xv
8����|���O?�������5�\c*G&M�d�<�`>(��Yi����c�������M�������ZT���7����o�0���m��A||���������������Vq=o�ovN���/�	H�>|�8����{��������;�{������
���~2W�8�m|���9��i��v���}����SE+?3�M���^{��� N`���_��'�h*��L���_~N b����g���s����3��3��^����q�M7a��A����{��j;�W� �T}�}u�u���Z����KT�R��l�����~�
�>��9'�|2���g��_�����l���v�v�
'X��%K�'�E����	�{�	���G�s���|�	.��\~��_+={�4�Y����O�<�y���L%�-�����:�|_���;h���9�;���������s�t9c�w�����{����W�|��X�f
��k^��U�7<&�f����3q�g�W�^�|���<���_�v)�C�Z����?���O?��?�������b�
�o�F�L|��<��X�xL���;���?��/��D�~O>����5�X��.����Odd�����>�����>��C�~�����Q��|�r�����;�<�=��C����k��Y0}O��0F�5 v���B�s�8�����<�d���N����.�:���1o0}�����7�t��g���?nb|^����3|
������v�{����w����&X�|>���/&n�g�c�=f���o�ib�f�������u�k�<�gH���SE�:@0����+c���s}��
�]����?s�����q���;(X�{�����;���G�;c\N��D��|�����S���������8}���%>?�]���_����b<?a���y<���Z�E��`��69���@�T�:����;.Fp���8z�#k8z�x�|��
+��e���e_���#_9�����>�:a�Gj9'Nf�_�aE���/>3����<6�m���vQS��QZ�����0`�yMp$G;����V:sTk`�g#G�4�����3��	�+�L�q�<��vN$m'H7���s�1#�x<�G4?�������x������y����#]���s\��_o��2����6���Z6���w�P�����;v ��k��O�]r��g��~��h}����Z�j��	�VXY���?�(O�X����?���;��.\�_����������OV;�C	�[�i�x��>TY�h��m���>����!C��N�y&;6=��������x������s+V��x���R�vm;<<����O�[�0�c����?�sT.��
�9s���
�=xL�
�z��������'��"���6^3
v|��\���iii�������
�@��o��5���Uz�>l�V<�6l�a+3�-��o�5�����T��b0c����?n:��k�<���n3Ux�������o�'2�'^'���[L7��;w�u���]w�e�?�7o6�X�w�5���_~��kD��g��~hb���GV�Xa^������1�1|v�;�=�.�Yx=6�<l�����B������*���#uXF�Le���G����q	'~������C���RpOJ(A���.\h���\p��U���#j6m�dF�o�7������k3*�U����qu<8�����#F�����Xe�+GtrdQ`~3��d�+�82����	���c&GYqD�����J3���������n0�����^��#99z��f��u��qN�������*���|G`�x�ul���(=�:���������Y������w���
G�r�`���s�9��r�H^��3f����#�� �����=���d�6���	��?��sp�*3�(�G�:A��@����3���������I�������V����J��#��}����+<�!���`G~�����#|}�������P|_q�4�<Y��s��g5g0���?����o��%0�#�9R��d��GD��m����]��u����*V���x��K�M���`�@�7o����S��{��q�0a���k�UD\�:�5~O[\��LV�t���TR*���{�q\��H0c���*V!?����{��1��<�b�U��S�6�s/v�&|��+����<�d,�kf<6������9��:a�.�	�[��'���g-�W<�dw~��\�x|x����<g
&���uv
tY�:�fx],�����#�s�5�`�k���sh<b���
|]>O�}��WV,�52�����>3�~��7�S��?��������1aLa��\����5����h�r�'E|S�e����p�	#O���b�	��&N�h>��z�'�w�}7^y�����������2�q��X���� 	�En&Cxr��`H��6'|-���� �qw��i^7<ib�!&�x�m���4��$�	g&�'�B���+�(�q��5/t3��Kil�l'?�Z|/�����sM[)�|�l�������a�&Y�
fZ�������3��0l��u+W�4x�x�zaPx������/<f`�	O��J�	W&�����P\y����!�{i��e���^|��>���'O6�~�29����;�OqL�2@�k�/x�������=D ������[0��� �~��\$���3�<�'�|�|7������&����K�����c��c���9�����8�/������&Nx�����
c6�w���-�����K�T
�8 �H8��mO�=���P��d<�������9_?�6�s�`����4�O����y(&y>��W���@&��<w�u���7�����<6����1������&$��^���,�������+L�����l�����>2�d�����v�����q��FN��{<���^g-�����>������,a���/�<���A���T^_�����55��X��dd0�k���9�m_��?K�������0��W~��{'���c���&��V�G��kf����bf;]����}0��@���qa;v~~��+���X�6�����k��8p�H�h�r�'����a�E�p��`:��x1�'�C�1�UV�����2�)�D���_�����3_�n�k�_��������g�$��o�_&�9�
��`����y�8�3��z�-s���~���I&�S���1|����C�}��>��yOq�"�0��I�,e��yZ9/'U�\k�A��l�*a���2G�������Z!�d���.�a3t�P3��pc����<N�/�����+3�������~�mS����_��	�u^�8����c0�@���9������x^�[�0�9����gL�5l�����2���	?[��:���H���^�.���X���>�s�#�g$�|���3���1���0���w�_���%x�H1_�U�l+��q���5��'�w�R�����X��
-�;��L����Y����U����^x]t����
�/��(��+�o��X<3���-�\��y���+���s!s?����L��X�}�������������~������|L8(���|��<�����L���f���L0�Z��9(�p����G����^��,��63�y+M�����1%'0��RA��I��J-
�PAB,qB�$+sD��y�r�H������������z�o��������{�9�{����a=�y������
o�����k���>3����%����R������>{���
�3{��F����{��G?���'{�k_;&y�U�r'������I;�2��uf���Z��kKvP�P'�w5pp�zm)�t$V
r����$���&*����U���p����Z{�\:7EI4KOYf���vP�h���>��Ev"��.	 a��dp���m�x9V�o6_k�|/���������l.xo��=�y��=/�I6�%��2�D%�����>�~U*��:�������R�+��fA������_�������y%�W����U>z�����K"05��1�gI2�s�)��8�����%^WQN������V�b���LW�����LV�NxU�����2������>��bm��k��7�29�7B2qk����B�	��N;m,W���}5[���q��~}1}��;l�xV�Z�Aa��Da�Y�����������9,�.61���M�����f�e�p�t�����/q�������S����l��n��6�q����n����>{�;�g��E?g�w���l����K���O�G��}���Z������RP.�5KuKc:�4�����J�KVq��x1{|I��5���x�c���$�-[���&E��iTR�g��Yv���]�s�0�J���|��t�6��96t?3��XR��S��.�(-
���U���n�ky��q`��s&_��W���q��V�������Y�D�B���~m�r6C�R�3����6�H4��M�&�wv����y����`u-q��nR�j_m�-}O���f���\3%�W���f�E �f�3��{����q_Z�2�6*;��bl�<Zr^;��^����8^,)��{���k����N��yHf���P!n�-/�}�}��>����3���:?�w%��k��������&A�d����Z��:c�5��Ati}�m����f������V��s�=w|m#��p�t]�w�_����l������� ��z8�,��1^���V?I<+�(n��3X��v�
U����m�\S%��<���[�k~��cC�QR�9�?]_|�#b�J�n�IC��[�J������4���+�1���X%Z���>���:����b��G�y|����������oE��	�6�]�Yb���z����3���������3s-PT�]���J�;5�����f�'��*�y�s��y���-[���-���Pu������9�sGA�c��Wh�y�u�J�f�����fp{�
� ��	0H9���5�U���r�C����g��w�u����� $<�/Q4f�$��������R7�SN9et"%N�@]BQ��2��4�%>$A`��7|�p��<������
.�8���`�� ��8:O�GYe6����F��R����KaPBGR���3G��P�k�!��{��xt���<��]���y����N�x�+6X9~$�-S���d����$�d���6Y
X���n�nN<���2@�����sJ��c��8����8V����\o*K1W��m2�T{V�g���`U����9��r<9��a�@n	�|���5���z��2�g�=>���!HM��9���^��1p;�
n�W�}F�F &qO0�;�6��z���Ff�C?��R��L�U����Fk'}}+}�r>4��XZ���a���E�����	E��$	V�|�X��P8�4�SD?\|*��Q's��nye3�V��q��XZR�5A�lu�um��)�j\�����s�P��e}�}jI1��W��d�������wMu�@;��S�-��
���M/�zb��03�k�p��W�����������'��,��_��jC�W{H@��Vyn�s�K��G�r\9N���	�����f�A�'�3���5���d�J�f�r���fn�L�rASi������U�!=�������p�n�E�.��J�����c6�e1$�T%9���j���y3Wo���/����7�A\K��-���JWA�k�s����L��J=/�Ko���[����$� E����DH�������o=���6q�H�H�
�%�u4�8���$�c�l��+:�7��MF�����!��N��'��
l8n,q��Tk������0ha���` ��#�f�-E��P���{����qcY��A�%�/q�����2����L1��!����z������2��Y8K
���d�j�x	�\G�[
y,��o�=,��c)"�i+����������a����Kf�8��k������M��=�����<pi@S?����Xb`�W�3"��S�+�XzA��I4���r�tXR�b[�_}	���@R���*��c�=U���[��G=���8��	1I2E~o~��7.(4���Y�*M������j�8?���yf�k�����lK"ad�������E�C�+(�)��XaF$��q�������7��y��T1��G��� ���f1�|N���.�/n�����/�j���h�u�X�^{�5&+�m����s��R�������0^q���2��:l�}g�X2��X�v[���EL:O2�OS��:bl�1��kq.�6���qV��t����om�{����1x�s�c�#�m���z#<I������.��Q�Yz�C2p�T��-t%�u�
h"�r��� �NEq-ah`s���C�f��x�{�k|��J�)��S�����~�x��#����DX�B j`B5���>�/�f�'���b\2�����#���X�A	e�����6�����g"�����S�Q��N�`~It���w�8w��,���>��#���#q����9/�*�d����g��u�r���}�k�"�(I�
,K.��	�����c&�k��	���=F��vq,����6\o~,ipk3�S���Du<�pov�UDgP�����������s������<� �Q-)�����H���@�\����k��<��%�]+6���%������W@�m��V�������8�+�Q(Q��z�1�Lt������pL�3XiGa���$��wj)V��g�}��8��&b0�d[���)N���O#^����m��~���b�%q�X�J���~��ln��9��(V,�cF��*q���t�8/����a�q�TX���C}N/_�����+1���8Y�5w3v]��������h�K�9���c����Z�����%��i����1!+/����#&1��8c7�DS��(��Z,����~8wV��qc���������}8�\��i�g�"�_��#3��B+jZ����O�����1A��z�����Ys����:�hP�q�3
]�R'H�C`I7���[���2�m!�0P�����AKUUk/�v�?x�v�	�NKK�����.�k+5���,��|_`&����s��:��21k� ��h����u��X	����t{��k��d-���4����v���.K�L[=0`���Z�c`T�dt-qO2Ce��\������,��/�������6��_��ue#T1�~8����L�8V�0kQ�q�xZ������1P>�w��)���U[8��k�h����p��}3s��q���xo��*'K������s�V��P�������\��\�w�X
�<�|I��J���QG51WI8�4�k��5�������G���$����K*dZ��d9`�z�KG��l�F"
}	�B1�����c�4-���\1������c�X��r�5�/���T ��m����������I��������P�}HbZ���hm��v��������hl�����Z��A�H�K&j�������v[�q�J�[����;��f��f�+u�x����K�7g�L�������c�t�����:���Fq����*>p�Q�j�s�=7���&���
M>��S0���%Z�$I�$;��I�$I���,�L�$I�$I�$I����I�$I�$I�$I�N%Z�$I�$I�$I�d�J�&I�$I�$I�$�:�hM�$I�$I�$I�u*��$I�$I�$I�$�T�5I�$I�$I�$I��Dk�$I�$I�$I��S��$I�$I�$I�$Y��I�$I�$I�$I�N%Z�$I�$I�$I�d�J�&I�$I�$I�$�:�hM�$I�$I�$I�u*��$I�$I�$I�$�T�5I�$I�$I�$I��Dk�$I�$I�$I��S��$I�$I�$I�$Y��I�$I�$I�$I�N%Z�$I�$I�$I�d�J�&I�$I�$I�$�:�hM�$I�$I�$I�u*��$I�$I�$I�$�T�5I�$I�$I�$I��Dk�$I�$I�$I��S��$I�$I�$I�$Y��I�$I�$I�$I�N%Z�$�	�w�y�9����_;��~��������_��_6}%I�$I�$I��Dk�$;��}�k�	'�0�������X����O���}�w��]���$I�$���?��?�_��_���o���$I��Dk�$;����^���M_���6}%I�$I����?������>��Ol��������3�BS������L����$I�|����<�����~���t�+Mw��]�[�����.t��/��/�7�������?]��������Oo��������n}�[����0]�jW�nw��M|�����o�?�C?4f����n���}���_����*�����5]��W���k��&7����?�������>�����wl��������7�i���ox���<�9�{�1�����g����7]�����#�����?z��>>������?����W������e��W�2>���{O�|�;��N;m|��z]�R��lf�/��/Mo~����}�c�g�����o��o�?��?���_�u����~���7��t��\d��$���������$I����������7�a��u����;����~��y���/>��%/�.v��m�N�$������6�=I��&i����lz�S�2�!�e�]����������l$!w�u�������g>��#I�s?�s#y��GO����8������=����o}�t�+^q���n4��7���O�d�������_��t�K^r����=~�C����3��~��x����?�S?5����$Q���p�>?����d���u��=����c�9f��d�$��{�+\al�����D����5�9������������.{��������wz�c;�����eF2���~����~t��E/:}����^���O���g�����c�>��N��~��7/�v���N�����J���_�����nu��=��Gq���o~s������}Y��I��Yg�5������$I���s�1��Ma�X����(�U����x�������}���F�'�T|;�i
d�^����x��W��t�K_z������#fV,.���[#&�}��z���B^��X�#?C�j��������������/���f	��\�*����O<q:���Flj_^��W��5�y���b^1�W���Q ,��j'�%�~��^4�������oq���������~�}��?���o��o�������w��$��W��$I�#I�������|�;O�y�cF"�g�gG�����m�
����1�T�y��p$9�������1SU�T�����;l�Q�����Az���?��#�I�z���%�3c�����O?�����LIT���O~����{�m������y�3����6���t�QG��0�����������s�����*�4�vN�~�S���>��3�U3R��C����	e�P���w��0V[���D�d����w����'<a�����k��]�z�J�����f�������X3_�j]��I�_��$I��aGy�HJ�JRJJ�)hU�*!z����N����N��;���J2�}%��>#ay�!��{��"Z�����j����-O9���b�-�s~��oJj*\V����}m�>������^�r��4���~��#Fo�&Z�%&�J��8�v�����m�v�I%J��>+�+��JD��%����o~���������$���m7���7?K�/�+�+���b+=�u�$;�F�$��$#�T|�])�w��g�`�����p�J���������(��_���	�,a$�T�k	�9��	��t��A��p����u����-=-�r�@IRU�O�Q�+��>g&�$�������n��>������Q���LZ�P	S	e�n������h	\_���]T{���������j_�N�$I�l�����J�x����e�����?������}G<���=o$U���'�"]E�����������t���l$,�n�}���5��f�JL*������Ule���u-�TIR����|���>��O�-7���x�����X�v{�bfE�f�^f�*�&V�:���F;)RV���XR������g�����)�����V������q�{��������6�j�dk�d�T�5I���2B�gw�$�V|Y���L�A��`K���Y�i��}��y�����]]
��U�J~
P��G����Z��k��O����`o�Y�����T�+�)���/�+H�}K������V����J��k+��m����]<��	Z3e%c�[��$I�$['�'�4���S1�N�Q\f5&�^����x�����`33{��O���!��W�V���F��;�3�'6�*���R��x��T�� ��Qh�w[����f��~�1)b���3k������Q�k���8�JR�bl�����X|�G���b�M�V��������bm+4I�Z��x�H$[>8I�c*��$�v$�pYR��U$]���Z�P�Gi�%���	��[Y+��J�>���3N�x�;���-��������}�������j2U�;�{����y*�����P{I��p���zFn�$I�d���)	h!3B�<�o**�BbB�{������y���XU�)�����#�����n�;���S2V�vm�.�P�#,�:w[�X��z���O���9>��?�{f;W������d���������%r�if�M'I���I�l'�����5G@�uNN��������6J�,�����d�_������v�Dph�&�D��J`K�����P��}*��Z���?�91��/}i�����T`���}l���`��g�n)��������~��7����
�����-�4?;�3m�I�$I�m#4[��K3-�����������R=���N��~/���b��?|$Y��Z�g~�g6��;��L	���Y�/x�H{��WBvf{=w����g��3����,�E���,o�=l���r�d�T�5I��D��y2�Ez��'���H�z��g�<���I�O���Y1�:��C��Du'�|�H��9�N��?8�fi�%��u��������"�U}�5�6���I'�4f���jY����K9Y�I��Y�����N�|�+�rG�9^�:��%YU�u�Y����~����I�k?=����%w=���Nj�$I�d��)z��\g$[����>v��~�S��������X��3W%2���g�'�T���VHl�&+AI*>���3Z=��������B�%z%d}v�]�b�e�Ow�}���y�-����}[e�%������G��T���g�9f�J��Nw��������3Z�d�U�5I��h�]v����G}���G<bz���<��6W���G��@O���W��Xni�����1�U����,U����kI"J����G9�IcV�g�X�IP8�H]5o���<��O�'����{N���=F2��T0��7�V����o�@Vp�������j�-��J�>���y���>�)O���w�}�>&I�$I��D���w���P�?�T3-��g�q��%@��f����~#���4���tU���Xl(i����R�Vcz�3�9��E/���J�Y�H�u-I�{���#1�HX��QG5Vh����<�p3Dm��P,��z�����Gb�UV�������9VI�~����M,��B����8�
���G�x�=�$��\���VJ�$I������U]+HRu+��,QKIF
����f�
��O�jI\?�LS�������+p����>0@�G�x�+�%�T�
X�����H��Y�����x� ?��������+h�X=������>{���;�<�]�/��U�2���m���Y���wxf-��vj+����Uc��������m�3�\�0�P�v��-Y���g�m���I��� �$I���+bUl�n��6���S�JxJ����B����Bcq�"\��x�x��?%m��c��;�r�>��#F�)�4�V��k�#�q������-oy�������>��D��+��h�7��
c�(3r%0�J�z��X��x����~������Z����	���Fc_��1�3�I_�?��e#.>���F�B`1��������9�?��S�*P��b���}�;�1���7��(��'IvL%Z�$I�$;��I�$I�UK'I�$I�$I�$�:�hM�$I�$I�$I�u*��$I�$I�$I�$�T�5I�$I�$I�$I��Dk�$I�$I�$I��S��$I�$I�$I�$Y��I�$I�$I�$I�.��_����"�IEND�B`�
bitfields_clang.pngimage/png; name=bitfields_clang.pngDownload
�PNG


IHDR*@�s
sRGB���gAMA���a	pHYs�����e��IDATx^���-IY7���AAD	"*$��ADWEQ@?@EPP�K�%.9KAQE0��$9m���w�Km�}���3���y��s���S]���������P(
�B�P(
�����?~8���6~+
�B�P(
�Baw���B�P(
�B�P(�W���P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(��:�\(
�B�P(
�B�P(
�B�P(
�B�P(
�B�P(�������B�P(
�B�P8"q����w��o�J�O}�S�'?���,g9�p��\d8��c6��:������������s�������o|��8��S�����>���
.x��:���SN9e������+_��F�3��������i��o���lg;������/~q���>6���{�8?A{���|���h1��\{|������w���.t�������ZZ���/�m�K?�8R���}m�~�]�����??�[�~$�k����{�'�c������}�w|���\�/_��W�����8|��_���}�7�F���*�_���G�6��e�~�|�y�s����?���C����|�3��������y�{���\���/}�{���>��7��9�#{�|����^��nm��t�[��[7�9<`'����_�����Oz���.�����K�z��n�\�}��f��>.K�~���|�y����yH��*�\��<������J�E���x/!u@rkq�P�d��?���vk]���'��o���X1~��Kl������MG��6��R��Wjs}j#?_g�,����~����l�}�F�=���.p��~�
H�����uS����6�v'.��|�;#��5���`���1�k������n���e��������4��h��,d����9�q�-�?���/����Nb�:��:q$������9��~~�_e�|�Vkg2�+[�@�~�_��G?:�m��3V�����\����-����	��e����>�
��=���!
;��t�?$��}�E��v���v�W`HPm�������]O��=�%����su��\�����@Sh����	��n�It��ei^U�m�Vg]����[]�.�_��[���e�������p���[:����+�|Z$+m���7������������,C����|����:�tYZ���?�|�j����c��O6������+8���w����ShO���s���-��	���*vb���H�a��������������f������~���������{rs�����w
/|��9�����������s[_��Wox�������B��p�l�~��������{���o��������x����.�Y<���������7���.w��������������-oy�x�1����}�]�s����?�����|��0��������^�����\D�����^�������e��M��t���~�?�����|�������(y���<���u�����R�]d���x�/���<��bQ���1sM��_��5�����|�?��k_��q��
�OV�]O�����u������w�s����}����/~�C�c���������o{������{����2�|����>�!��1���m��y��O�4�l�u��|����*��g���l�9������N7$l�D_�i����u�_���0�:����o�f������/�����x-��K��l�����^��1����?��p��^�+V�����k=�y�������n�������
��
��p��!%q���~�vzSoN����#mdof�d,/M�J��:�//���X����l�����3r�ub*�j��5��8L�����g6���94��[�����O}�S�+�������/�b�S����k<l2>��o|����6���R��=������?��f�JW��9����������y���l���G:�u���������y�Tn;�9��W1H���S��_���
���������~�K\b�>AW���
/���|�A�u�r*{��S�<>��������zS�%����^���~��t��_9�����h����C�#��\y����Y5����E��_����s����W�*k���?%9�|�,����VkgzE��$_k��@'��|�f4��U�A�t���9Y��U�n�p�K>h��������1��e�.wz}�p�����{�f'k������0��"�������	Ox�8�`�B�����<����_'x���<�1c�,��>�qF��O|��x�Er��u�#���������������@���3�9>�!������;�n��-TE��^����}����s�}�"�mp�W���?'��?T�D<�IO�����D���7���G>r����D�p��'�y�sF�.A���h�� �?��O����X*-�������=��d�B6;Q�m�`��^f���y��6<���]�/� �{�����G�J}Q��/}�K���������im
_}��>x�`��~��<&�S�\w��Moz�X���l$��@?�}�c��0r�S���x�������Pa�u���S���
���(��\�x�C{<G?=��,�1�\��,��-}���/}�f�h������o\�>��j|�V�q���l0����C�O������g�a�|��w��hA��hO�*^�1$}�:�[��+�Y���%��Q{��E<�[���u���g~�"Vao@��K9���tXF���>s�������s�+^q��-oy���7���8�
*�rmm��:7����tO>7��M�E�:Lf���f���8�q�;�q��Mn2n`���:����~<02�#�{�����m�����
t]����C��Cz(N�?5��j��m�%>��]����5���w~��|Old�m6�m�[����n6��+\�
�l~���\������w����k^���5���
k:�
b�|F�9�3��rrv0O,�v49�:K<ik,�x��9Ra�b!~��o��m;����mo{�1��o;�m����J=|$��P7Z��V�L=�<�??�������gZ����
s1�P8����v��=�q�|����S��(�v����sx�p��#����\��J�2�s��}{��; |�[�z��mn3�m����:1��n���V�Fp��"#[sSg�����R�������/�2��[G��������y�i�����_~&����������e������;�z�+]i�+k�{�������������*`�}�kw�����\�*�'�q�p�����q�*�������W����J�m
�����^�AO*�I���"���mR"�;��	r�%�t�'e<I������^�����_�����=��2���C���
G�hR�:h���8/�#��������9I���HM��l�[��6�����*�[�b�n�-���R��!��$;�l��vl�B����i��'y��Og�j~�o~���f��\����<��Se�B����=�i���D�p:b��9�>���q����������B�����]�be���|��b?j���`?6/������hW��9���"�Y��P��f�9���xhaM����5?��<P'&�#=1.O�p���+���'�=\t87��DOP�9_y8�0u�r�@�'�mzX�Zt����+��p
���7���O�G���X,��
o8��.w�L~��F�8O�;�����-��#~�G~d�����"�q��F7���6�VV��3s9������H��������.�����������?�?�e��u����^O��K6���v|1����!� �9������c�y�r�������|�<�_9P{+������v��'~�'F��W����
{x��N_��������ZS+��S��x%���w�,�����������v�CRo�Q1�P:�
�d`��}�3������<���x���������5�]b�X&����s��=|�C
���U�:��7}8���<}����Tc'1�5�G�����~���zX-�����u�C��c��v7�.�;�n�y
���Llt������G���������pag@v|���Hz+��5/*����k�S|w���f�5Y��5�����7������1����[<^Y���$�����X��/<�+o���>3�P�~�uI63g+tZ��;��^����S�'�G�[�g�����vc
�Z�8y(�f4��+�W�
u��05�rn�G�G����>�u�s����[Y)�� ��v�~��~m��7�����|O��]�z���x�v�����g}G��x���=�y�����a��=�'������C���H��m���`��=-F���K�lt�K���c�DIv���+!�!�O��A�A3��r�����$���p����OI��h}����m�������?�v���~l�-2��7�|yJHb�p�>�O���+���#q����Z\���8��I�>a_7��8Q��:����x�:/��)v���n�"�_��!���U4� �P�_����	�����{���8��l=�{:��f����d��l����o�?�V}h�e~�&��:�����!�a�t6%A����<�>��H��aNg���CqM����U����<���1���O>�b������|jY�;~��x���	�BPuT���Na�C�,�f�6=�Uzk�"�Y6�������-�/��]��A���_:�^�C�@����o�c<�(����b�7��C?�?pF����&x��!�M�r�<��C��oY����|���C-�~��k��w}��j��ek}�?��Z��Z���u�~����������
���������(��.�M���z>�c����Cv���A;�)�N�������~���U����6��2h�97��/��{��������g���vh���}�����z}�e�-��|��L��������/sn������\��C{�/����lR�������������$����������@x�}���7�E������m���)�m�	}{?�@�B&�!�;�k�������O��"<����������b������Z������\��%�����k���g<4��}������O3�X������~�EO;n?��^�����l��7��%��������v��24�����@Fs��ri�o�rz�g�v��F��*siu\_��q}s���]?���=�d���nJf�"�*��}�������e��;�"���=�`<�z��2~������nl�����'�q-��}�����_t.����,���_}F��[y�cJ������D>�� ��}�c�-z>,�Ya9���u-}#��Hk/S� /�}ro�����0�gh_�Z��/x����OsP�W�ha</�����x�>���v�O�h]�l���e��������������E�����x�w
���~����������O������J���>�����*�c��_��g�������5�z����d�~�7�3��������OS��{K�"h���������2������������[4}�^��m�W�x		>[v0�ZZt_�Z�y�����������ha�����_�&�����s��������W��E�fL?��q{�}��1s2����K/s�e����:�U��=\��@h���S�����������������D�-�Wx1�m|��Zdl���'t����.����i�������4��7�k����_����t�|��gjr�^����,�����B�~.;g���x������U�=�=��]���]�C��|�v}?�
����'���eyt��W���h�}���C����.�����/�s.��W�f��V����y��2��z���yO�����g<j�/v�����yo�~�0�����{��G?S������������w��>���/y�qj3hjVr&�p��"���������e����?Y_r&6����=�R�Kn�
UE�s���F*2��)D�yE{���Us��^��,��=Z#
�����{����	�:��7��p�t����9����F�:o�� mH��*6���
��o,���!�E{�9t�� Z��`��6O]h2��djNy�v��D�a��=�#s�e�>:���Nl4qL�w�[�7;��y	X���@��K2��8p���}��>��8Y�%s�����=r��8?��G6q�_[������z�o|cOhI����E��������O�r��������=rfw�"��<����6o��G��#���'zc�dJW�����>�<��>�����ci#y��o�y�)��l����^�7��io���C���~t�s����^���@�^�4�g.���m.��~�����7V���{}���?1'����V��1�Avd�w���#���x�������=~�{s0ws"s���h�'�����7G�����_���9}��?����n�c|tXt4�>����d�V�'7�����L���q���������4Jw���+���#���"/���o�.��}�'F�	���7d�{��+�����[���7x�=�o���G��&|'+������s�q
����_���~���c�����e�-��o��y��ye`.��/y	��y�.�g��B���l��Gv/Whi!{<B���9�z�^z�~o:}x���]�/x����<�a��%�d�@�S�
��#<��g�3�X��S@��#�����L<���>�5t�yI@o�-��7z�:��������_|������K:���c���
���c
d����u�?�f|s%t�%t��s C:aa��h�!{�'r_��+>[��N����s�w}kK��-�q�����0=��|&�=�G����}���'�3���k��hHs K4���3��jt������Y����h�a���o�
1R:�����<����s�C�4s4g6��lY>���#��9��������?d�m��;v���-�6��1H���S�%7�0�������#����)�6������o�Y6g,������@��D��?�U<�C7�]�� I~�|��_�9�����f��_�/�S�jv����~�]����=(������?~������=�)�2����|�y�g�z����^����+���na\~��t���/c<�Y�i�/y�K���O{����'|�����\��W��k�3%{�[x�/%d���K_���/C�?k)r_���U��_�J���|����}���.�C[Q��r����g����<�!�-�4V��cz��U6�<��M���7�:�OvtR��g[���~���>��{s��c[�|�C�������������&��V���
D����A���W�/��_�	_A1O�����#�N��4*^��h�{�������X�
��b_��s���?��Q����U,���ax�t��>���������;��v�����)��;��xI�m
�J�������O�������������O��m�Ul���a:/���S_�c[?�Ox�s�3�X��g��>������o�?t��B}�d�Np���|'S4�+f��%�Vn����8�����`j(s
�3v�w���C���^��������n���T����O}�S����t�����������in�[�'���~��G��g�:�7��w4F�����=g#@�����/�M>l�o�S�i�����dH�������I{s`�K��FG�#�p�"��|O�6�����3�G?��cLcO�����%�����=�O�9z�&�v2F�����1���{�4��>���.��j�v�S�[:��b
="#��<]w��?����1r������j��rg�|�y�F'����}%��K��� ��-������\�/��!/�37�$C~7�����o�w4d�[=�9��|���{2���3�G>�~��o}{1O4�Q��"�a��y�/�`|,��%}�@+_$��d���<e��E����%7�s������G��C>�%@F�L�������-�y�%�`xk,>����d�oc�]����yD��1��c���5?~�_����s��f�Qb�9���,�a��";��7���V �6!����>�w�_*�=��F�t���_��������I,���b�X�h�3�k��������^~
���/��#�"��s����`�rZ<���9�w���<������C��O2b��t/��r�����k�9��|��{����_�G�X����o�B�q�}��h`��z���!��T�eL�HG������U;��+�����=��c�|�+�
�dI���_�#��_����[S�>������>�)'Uk�/�Z_��>�����!7r���'��|�kO��f������)�M����+��od�f�7:��W�U�i��]'w����c�S9�q���| �����:��V�C�t��b�>�Y���R��rQ����5:"7��2��*���q�O������!�%���[|��a,��;������T���_����5"��k�1{��A.�/��KvF��c�@r��\������D���<!������>c���=:���~s"�"�D/�(�4.�������F7�}K�"�����?�G���16������7<���Ch�{��{6�-��?�]�?�cn����V����'�1���hN�YG>DV��oZT'~���������9�s|�?�G������7G�'�vM����X��������.>6���G��^�sd�h`{�F�v��8�'[�@��i����=4�3M\�3Y�B^���������A��8���&�g.|)z��"��9Y����+2������F~dF�u�|q=�T��
o�������Wv�k��>�3���/}�#����)��u8s0&~.Z���9�����r���YS��-�k�
�B[��.�U��;���'=�Ic�F_o�Qk�wv��)}����t*��d>�?���m[2cOh��LO�+^�1~��24]�Z3���)�Y��`�r���t��r}�������=��O���L}����_��6ryPto3z���T�<86N��-O�	��8�����\PTAYF&��[��M�HY�8G`I1�C����Cq��U����(���QpP���#G����1�$�`�,�_��!�����<�D��o4pV�b��:b�
P�(�!���b���c�s����3�(����@0DE+����8����=Yr,`l�Vx�G���~E}Ot��y�/�g\<7�#��#��?�}8'T����E��M���#��$���@�����d,�����|�������AP�8z��)�Y�i���9f!���9f~>�$q���E�)Ox)���lE�cn�lG�:�da3�'9�t�������^J�3'�Q�n!�<�!��|�_x"qp�\��~���A�\�xe��I���-[��6�_����'s����7H$$I�[���6e1"��N:��L�<%���������������D����_@���\�%}�����O��-�G���X�Z���g���wv�6��.v���B��xfN������-I�b�����	|%dkx{�Td���l�����OD����F���G���h�^v�2E+��s�CK��q��MEnl��ib��-����}hu���G�����?�<f�t�8�����/�����g��?����t���m��7/��7<q]�l����~c���OrT��dl,v�~����Q�������$������0&�B>l������g����b��h�h���=�PD���pt��b*�����������/�r�9�Y`C��n����dO�#_c�f��W���3G�KFh3/:g\2��K�tO�Cnt��0��Y�3w:#���m�%a7?�5G>��C�������s����^�1�?"���/~��w��v��/����
����G��\�����p���<��,��m�Y��V�}��2���+�3���G�����9�!������$�Adc��.���B7�MG2/���y��1�������v����|8E�����E�1���������������BS|4�������Gx����=�������c���x��v
h��>9A;z���N+t�
��1�����~�e~��Z�����+<3����>7���>�H���7�7[E?���a:!>�y]!O:������7y�~���_�@���>�2��v��G��������������{�W �b�����M^�v���"���O���kl�=�&&��|�0/���|�9�q�1�|�Vt�q����`\���a�����;��-�q���\���~��\7���x�kt�YY�&+�����^>���]��������A��/������7��>�_��m�(��|.�'?��[^4�StT4&�)^�f����~����+��W;4����</3G�������%s7��E~�Od��h�j
����nv����D~C�S6�C�"/�����I�c#��V���B�->�?���������_��o>��w�v`nt�x����9���������9���d<��>c����5c&�p�~���'c|`s~os��?t��?z��]��6�mN�%;G���27v�n���jK}���'�i��}� �e����#b�y������6�^9?�>c�;y�/���Gn��/�3w|������>��Xr<z������;������}�?����4/>����|/F'�jK?�[���M��C`����e���+��`���=|1[����8���)��+��c9w��u��{��/]�OxI�;�A�J�77���O42�o�`d���msR{���~�����F>S�g�L\0/t��~��DlM|$s��6�{�.�=]�h�'�/�>���%}��g�s��lJJ��_<3gzFnh�����6��'��{� ;��M������
����5����Dh�;����������������?6������!y��e�����V��)�{r�-|=z� 2��bO��^�;�W�
L�e��+�G
A>���6 7�������6���|���)23/:�9�8{Y����!�#����y�����:{?�������	���8���c2��rM����wl*~M�'����9u _M����S�1���]?�����#�0�+�<��c#�|�?��?�>��-��a�W�Cs���!��W}�1���t�����~�O�;��q��KN�/|s��[�s2A�";��[�Z��:*���t������9�M�y�)z�>��v�
_"�����cm5V��`���>����6�O��.�����v|�O��������2G�a�����'�_|2/�c^�U�����{�5^�	�R�i����������Im�v��X$��ct����"�G>��s��e0��!F�{�7��Y��|����7�N�b��3&������_�8@C]7O>R��}�7����[�����{��>����s�������Ol��4�&��>s�/h����?�J�]��XI�tL>d^r6�������f>��-�W�B~x�^��?�Vna<��'���/4��P��-�&w2`3��S0g�4��������x�=Z����$W�����'��_�������Z{�N�o4�v
�c{d�f�7f���
?��m����i��W_���<��<��o�y��K����t�!}"g:�9�������~�2����S|�}�$?�F`�tmb��x��z���~�Xt�����N����^��<��C�.���c��9���x�����o�o�_����s�-����%c��%�C�^G>�����d����1~��t/��'�5}X?�����xA����w����N����{{��g�c�S�,����U��I�h��9�Gx�6�v��2�����-���C3�W|����|�\�������y�:^�A|����6�'�#wc�������l�����F���~�S�������v�/�o���>.�s����s�=���V��+d�W�E�C���C/K:�h�f
�E?���d@���'k>��7C�c���X������c^���o�8�������Z}�_��1��;�7E_�W?��c�t#���q�_���9^A�9�������F���������+s�|#����GZ��o6e������0O:�~��|G�����4�#�g,~���k|�a}8$�)9�2��d�(�e�<%�����ql�c���8C�A���P)��	$�����o
U`���K;���8����$�qG t?��F�
���������F���i�h��1��AI��^�3�$[4��#\����{��_��5�q��1%��������}�k�I��+��,�):�������������+�-��s����8��vc��	��574K�8}������������[�����p�x�=k�q>,g��ljY�����,z(�����w:F������q��l�������7������@4GI�9�Qs�T�@�|?�6��1�	��lt�\��n�hp����,�����%!q���A?��+�7��8<g_���������8�b��^��c}Z�B�t������h1G��$s���l^0������E���+�-�����nv�Q�}G��b.�s�Kg$^�k���mF�>����{��01A���V���>��
��3�8���AG=�_9c��6�1z��dc�d;�?�V3��K$������|��@��D�5��<�Cx�����]?��<]7�"���h!O����H_�>�?"�;��X�cl�.�Ev/V�Y:�O�zs�;�a���������]�j#}���2�^J�� }&��?��s�Y��1�F��_�+��tG{|4g}I���6c����l�~H2�M�~���+b�}�7���������F7��8���9Y|�������x��)
������}����C���m���
�kt��)�\'otk�/��>�M��77}�/�+zC'�C/�q*~���[��ou�[���\�G.Ao������&O���������������]�y	Y�/;���jo\��M��8�?b;�3g���t���y	�3l]�b��o�Q��1�-�7~�O>�Z�sQ!i~xMf��~�/���"�wh�����;���W��<r}�l���Gc�7��G�e_|9�����tx�N����I��)�Mf�~�gJG�?��>�|��[�����������~�����a�xA��c�����7��(?��t��[�H����?^Yd����{�G���aW�@�����[�]����/�\����L,"K6��Sz��t���,��07g�%�1h�'�����=���G]o�dJ��I��:�ds
x���
;���D��Tl77zn1]��gtO��~��Ut��3{G���|�<�Z]E��?Kv�[� 6�;��7�:������O��e���eA�
�66�&��-�j���6������o�Sz%g���llL��^<S������<�4�����4��;�F�A��G�b'�0�0|������|3>��:~�L\�]g��{�y��d���o|"/�)�27~
�rr�j���>|���}�.��x���(:�3���<R_��O'>���<��7��
�~����5O<��	��g����~��}t�>�Sx�>I;22����t
��2���9���/�1�S��n�!�N�����+6����B�d~���3��]�6[#o������t�,�Gvl�rz�
:����/r<cOh����'��s��c���'u���/������-��{��w��}h�w��>��6�^���������f�1���+�����
��)�l�`~��|�74��6It2k.��O�j�>���d��3�����|q���=��,�$�'�I���~������.c�
4����l���P��w�F���������/�W����F[>�wdF?������2�����{������X��c����	Y�r3^�n�u��A�cg��}�106z���+����4'�0�>��s/>�]t�<]G+Y�b��+�7����c����^���J\A�~�a����H�/����=��dD�f
t5q���{������z�K�#.�;�#7������k�o�o�"Kz�x������?:�={������k�f���__�C�y���&o�6�_t+�C~��.��������S�KN�W�Gxm\4�����_�:�>��=�A�����d����61�������0{�+�j�S�	�Pt�S#�Y� &��o�2���
���O�Eso������
�|N}�G��)_D7�%��^�������O7��~�1�ms�e�.:d��C3_0�����v~m|
�����~!>���;|�������	������v�>�����>���d��H�O�H&��7���	���7���G���/���^\��+��2����n�C����|����Kv;�mm�<�p|,}p�x�����X����������q�X� �����O-{�z���#
����_���s���/_�?�U���_��\�:Fr�����F�z��X��9�^�����K�����[�W��{��b
�O�^6�w���/�5���2���dN~O�.������t��:���g���|
��/&�9<d[d���;���~�`�����-������>��|�����xm<9�6�u~�/4_��_�14���s���|��xN��]s�&i�|�������)N��V>��/�e�W���9���i�-�4���.��+]����Nh��O����C�%7<p]=H�����&��k���Y�cq�|��/��n�#a��_k#�3O��c�#�N_�����'�%K�Y��Ok��m��ax=e_���j8qZ� ��:4~������b[��_�o���s�������)��C�����o}����o�N����K>ol}�q��3�8����=�@G�!�GO�u�q�U<�gh�+|B�xL&�OlM{2 S�����B���X�����m��V/�n�F��/��o���
���=?���_�����
:�:@G��������O.O�"~�J|�si�F>�F����oA���z�>>����1����e�dsd;�aO�z,=���)��_����'���I��y��S�d������-_������}�9^j+�`��@]L�x�w`h���(��n�U����N>'4;c���3�Or��5����dA?���;7�?�s0�L�	����F�p�~�o�?�9��_<��g�����)�"/vA^x����&t��]oj���u����n��V���$���u�A��s2��y��<[YFO��n����/��Y���8��b3���
�����F�
��1<�_����G�@�����n�%�flC���c�-���=�g/d�����]<g�����/���v����v�`��AC�B�+��	}.�������^hh��d���:��X���x�~�#�'c�0o��{�a��/;���zPa}�?!�&pn��P8FEi�"9���(3Eb��P���_���UP@���%(�a�1(��+�7c��8��
4r(-8���/0
�3��9:�����cB>L%����=�o�'�.��49�EI�~l��1�!�%/��)�L� h�W��!�s�4�����7���@P��X���	����q8s6�N��q����8<�l}/���/�E�9J�$�� ��9T����g<AI����x����8w�qg$\@o���>\���B�5�'g���� +�M��	�����z��#�(�t�.���x�Od�?>t���'A��mp���Gv��'��=��� rI\t���]�3����9��5os%':�@����1�dG
M>��k��Ol��F�\2�����-���@/�5?��d����w�Z����j�l�������?�!3���=���z�ax@����
Z����E�BF�BSd�_:������Q�}%s��{��0����t���\�Bnd
�C�4��l��"@��/��6����u�p���|(���.J�\�K��{���|����Yh���@t�'�C��^%�|�A�g����N��a��/��������2���1g��#~��Y,�^A�����St���0j��f ���t��_����kc�$����'��b
�GqD��p����x��]�3x�_hk�x�w��>�D2������w���c��gO���'�o}���0�rG�0q���?��7���o>�A'��\�*��������~_����y���$C�v���
��������:��� <Z,d>�����p,�����Z��%�=����s������B���{ K��;>�W��'�iq���(�Z$��Il&+����>>�=��d�������';@��Ws�'� ��
��HN��G�F���1��=���]��t�<���<�#+<���+�^��
����n�����d�I����/N�fKY�	�:?C���i=��`J'��o�C��-��.�]�b��`��}�{�����|+���E�	���
�iq�����#����x�6�H��1�������>_�&��lj�:^?��������O6��A_���7���M��3����>Y�L���8�~��j��#]�������F�}��yd��C��/��������w�H.�����f>��J��Bz(F�Wvf��t3h��������v�1.�l�Y��?_@��F����`[��l�f9��X�W�C����l��l�/�wvH>��'�_6�B;��o�M[0g��+��+c�����_���z�j.�����|�$]"gc���g-��������G����|���7�|y�{������|���c�~�+��������C�0.:�+��+�)6B�S;��������1'z��|~�������\6�a}����������[�8�V�
�Qc�7cM���$������	��7_�J������_�l���"G�[/2���V��O��Wr1��Lz!.�����_h36�������O���O��(���(�Dw�]��hf|(�S>=:gNl����|�X���������{���������G>�
�����|n����f����jMo�#��<��x�f?S��)��������S9�:���
>����j]��GO��Ok����/[�o�B�[[!:���e��X����rL6%��Ec�
�h�m����V���sc��uS��39}������u�����~�_r��r�{�k�I��
�r���'�;2�q��6z�/bDh�����~���<Y��O���]���#��-��}�%���G��|�Bayl����I�A�_D�_lms5m�������<SL"��%-�+�@G�f�.�� �,���"�S�/r�E��|�q���?9��L�'^����Tx��Y�w�\!c�K����9��{�w/[#����6�P��?�vMWv|z�:>���Eu�z���}�?�wz�w���?!|N>�9�3��
k������=���9�3�O?�)F�M��Uu���������>K~-�����Z�o����u=��_�BV`<}��E�}����_��_��*�:���rr4@�F���BL���a;>sH,L\_��G����y�mt
r�����x�{>R���Zrd���D������/m�^�+�%5&;�=�l�.��>��o�s~�Z�q�/�E��
tJ������Y+�����E6�K��o���y��A�<������c�t*�m�����Y�lj:@G������J��g2�S��9�i��>e��i��:A��^�J�AO�K����m�|��a�	��'>���0��������|�����9|���*�e����?�+:�M&����7>�������2����%|�/�����M-�a/������s<|	�	}>����U+�'a��������6fl��,'���#�`����M-��d���;��\�x����'�0m���W{��������}1:�c�������Y�K���
c�vOv����������
4�GtL�y�{�s�-�o�M��������gz��W�Ex���%/5���y�tlmc0��)
�!H!9�s�s���1Z��$�C�b�#�<�4��{4��z��	8�%A2WO���Pn~m��'}��4oO�=>yS�d�x=-��Y	�=����d�{@{0VE9G+M�����n7<��-�m�����0/d�������K�\3�3r��Gl1"2����u�C�cI�,���q������c���!r�	D����s�(���������X���!��h�*$����dn�=Hin�
>@�-Xn@.>���&�M%/�G�����x���V���<��)6��>�+[��}�3^[5I��D�
)~r7����&������|Z�Ui��h�G�u;�k*I�9�	�$@)��~�^&���)�����[����tO{1���'�hA|��+����IK�1������t�Q�A��t�!���������o���a���$���������V!Y��,`�K�e/~��,����t[�Hv�5�!b���xt3v���$�x@�����8K?$��.��>��k�S@;[fd���/��h�7SH<�g:;�#��mn��/���8FG��F|I?����?���������m�@��t5�,�<@�����7��nw����������#��}|��{��6��@|_���X�������u��O�4��<�k~�4W�[B���_z���,0�������1�G�B���!�J9Q��,�K|&3�[�����\��M[���On����_@���h�{|�B��D��������O,�lI}���-j��`c|����g�����"��� u(��3���C��BN ����;r��Q_�_����{[E������'�S6��l����3�����������=l��I"V��:L���w�GwA��?yV�u�>����BQ��ja����m��+���+G�y��=�7��#��6�M�?��v|�������O<�w� �>�����9����-mx!X6O\h���%�z��F� w���X���}|V�#��\9�~���K`:���E���g�{V����9�m�{m��N�Sy�C�G>�
~�.>�����=�w2��1���?�A�?��?���.s���z��|����U�����v3��x��B���m<e{d��
����A��������U��/4�9�9��Zh+%W"c��������c�r��!���=n��O@r�9�|#�}�{?��?}����������Y�D�!����*��}�I���'|3_<Ey������1|�����-k }N@g��x�v|�3��
���A=����]�c����1����j����toZ^�a�&G�~�WW�"����i^�k��w�w��<�9�f(�'�D��e������u}��������[�#>�][�|�A�]��-�`�h}�S�:�T|m�c�R��C/����,��}��l��c~�*����]����^�����{�7�>k�����>w�7:zZ�iy@7z�N��S��{�W����v�����2����b��z��*�k�b7{��i�:r0�<������Ua��ha�>m���d��<���`|C=���\��q��b����.�I��#����ghegx+�^Ds�������t����b�������c������8��c�b
t�����������9�����Y�z��_�
�is�x���i����������=F���{9�o��o���a����'�p�p�I'�1�������/�?t�\o����o�q���s����sI���_B�Z���XN/[�'9���d]Q��G����Z}������u����}�d�C����� ��x�g���
��i�W�����O-��O����6���#1<�iOc=�$��������?�M/_z���C��Bn���E�����2n�Q[�}��������y�������3�]��i�_����3���Ik]���'zh}�_8<�y�u2}��|�S��Ir7���l��jM?�G�
�bN��l��2�&�3���{��C|Z��-S'o��7���+�u�+���u�h��i�.��H=�.�l��C�hC�v=�7��59�[��P3���\$'��$��o���g��� �����l��oK9��	~�H���h��?���@��
�t�����,������������N/�S�_g�����?���>x�$����}�=<��O�Xre/��d���p���AF����y$����.<t]|g'����c��q�?k$|�~��q�W�rF{~�LW�v�!�'>�������1���~����16i���z�"�������=���������G\��!
�fp������,��)�v<e����}$f��Q���
�q���<g�-�*�rP�B���Y��h���>t,�\��<>��O��-�9���ER�KR��h#�1��:���D����X�t�9����N�����Pt3XE����x��^4����b�8@''�&?�#�@w�F���u�C�hq��|�K�u0O�*�Z��{�l�3e'd�:����h�8� 7���CK������o\)�'�}�Kz�]��45�'��\37	��>�`����@�����v��;U�����&��}��)����b�"@��)�@����s}jN�@>���<����wb
��[4����Q6��]�[Y�s��'��?���������~�a�E��o���u��I�~�e�=�x�"9M��hF��d��g2>�n�K-b#�L/�����S���XB�;Y�XDG��z^y(
h���y��y�q2�[(8�1����������7e��e���@�[��oL�G3��h�.�+>������n
0�K�[2�� ?mi�~��X����8�.���Z�r+2��!G}�8���w���k�������/��������\�G7��|�9<���7;��-��i��S|�?�Q;c�N����b����N��2�c�Hsl!��fp��#$����?~|��Mq:ba qi3���,;���a�H���<�n�/��G�o����1����A=����K_���Az���<�!�?%O?[���g|��+�[��b�vA��}�k#����+"�9B�'x����|
�� �.�p�0:������<6�������o�o�8 n��hw_�����w
����M�1sXb"������x�<���>���9���>��[�s}L�*�c�y�,�z���
��5�����C�����������Ss!�>�8�`cS��\�/�S���&7#[���PZ|�T�G���>�����nN��hS��"+9�������mT/��gsJOB��n�G��O6���E>��������_S�R�w�����;��U1'��
O26?����Fn�
0�=��B.��|�U��C|�����B��6�}'���N������t�5<[U_!6)7������~���
}b����W�v|�����T\0�\G_|�mJ��^���	��N���Q�'������)�a�3��&�n~����{`I^�;5�3���q��F�����Ar1��+-��~d��	�o�z��o`��Kn5>[��s���h����:Cf����dF�����:v���f?E��������G��C�U< c�!_������~.�]������z�5_k�lk��At_�~�	'|]r��S�2�7�y���k��Z���������b����"������G��f��������G�����,:_��'?�x�C���);�{{
��k����j��<~z*��[�h�������)Sm���-��s57�7�Z��:�a������9�'Z��?��,��iY�?emj�9�v}�;�o���?������4y8���O����Y�����m�g�\���}����Y?�
�D'{����<6��V�_z������?����St�w�1���>�_����G�T��M��Z��`]x�\���Q���-�~+���8�,��C�F�<��K����?����I0�����7����%'���� ��k�w�����|w���V����5/�SSE���<��j{(1�|�;�0e[��x��|�S�B����o�|�%c��O|,��[{��o��Z��YN���������U���|��;��x����A�q�z�+^��1��kh���~�?CK������0�*�M�y������G���I����!Zy����NB]�V��A3��t����$����{z���4���l��D7�0L�����x!ouVm��=�_�u9y��C���;��l�Gf���{�����n������x1������=azw����{���"�E��df���7�����_����=����A�oa}��l���P���|<�:g���)0^�($%�`D�e�S��V�E����(p����K��$>���b��S����o}��������B��~���ho.�y[q��d$A��h��j��{���u��\��N��5��g�
+sZ���"��A������|}�;�9����bJ>��E����V�o��������~��Ebsz����}jn��;����B�EI�ErE��|%Xl`��s�������8��w7�����e
������2���`�!���|I�$]ly�����}���'��$���8��I�J*�$w�o~x�����n�'���e���s��g�v2fJj���,�����y�stiJ����r�����8fQ����~���9E�N ����,j����An�
L�.�a�[������r���9����@���`7=�v��]�z���@'�u�/h���Y��'�g��#�@���S��u����j��S|g&4�v�����
��r{��B�N���E�3u�������S������f�'b�C�����`x��Y���E����s�����,���<}��$9����j"vds�-i�V"O�m�:�;c�-l��r�Ep/���]�:>�����8Hw�<c�yoX�a���n��z_�la�}��{{��9��]}�W��/!7��,h&n�o+��
5������( X�s�-�"5A�Z���>��-wp �<�	9�A���
#qgJ��B��O�ms�u80GOxH^;����W����S~�G�:�)�6:��)���^�cFML��o��]&mVk�0���|�?��t�|����|��H�����������q��~0��[���|�����f*�nx����[o�7�N�x��sPk����������������:���0�)?������S�1}��=����{���z���_���y&��6�^���O{m������CO�x��\me����]��z����W�w�����D�"��A�U�����n����[�\'��=oN�����F�����Y�c�~R�����j�)Y�On��N��:t &�O��f��}�������U���4%�\7���U�C.�&�[���s������=]�'����x{�;�a��h'GkJ�����MS���M�n�'�
����k��7;|��r���Q�Y�f�=������>�6;�{{	��k����:u�i;���<�+� g�/����'&l��,����Q[����3w�������[�[�x��g�V������Y���� �8���T�[�����y��uk�k��7z�5����%����g��~�0��Cz4g;�@���i�����:E}r���9'�]3��x��CS>�J\��������e@����������w;��b,�c�=D�~��,g����Ir����E�r;�r=k������@F�?y�E-���h���
��;�����5������ss�	��)}4_t��h�-K����s��\G;}K\��Mz�;������qxC'vJ���}������iz����1�)���9���������*������*9]����4w�-���k'a�E�M��~�)��Gho^xbM.:}u�Y�)y��{����92��i�uT����&:6e��H���Me�A�CdG��7&�To�)g�:8�"|���4�9Wja��������tv��������ze-����9��r�d�i
���kj����~������)~�����c�2�����:��a���0������)P�d��)H'�c���v �����.��Cp��g���6r�~��������K��AB�m4��S��0�sP���_;��Q�E�P��{�m`W\3R�P�j����,)L��������yqr��c�Shr�[������VR�'��[���T�����p��'s�@����H�I�zX@���6��)z�+�e��^��
�4Q(�>r�������u��t�[$f���\�G����l��	'�a��
z[?�
�(~��$S>7�a�����r�/��=�2�	�]sJ���_���P"��0�4>�c���>QN�w�S�-���djl��7��k}��XKj�!y���N���t?}�����H_��P:`�h��!�e@S��I���Fs����t],��G�x����g'����*��#���^���mL�#�X\d���l:���My��V>%f����
���I��C��]�6��k�~�M��������Z���n�����)y�#��I�Oz*����l��-s�|����h���_~)��M��\c7������G�8���
�����������v�Q��h�w��C��*'��u-X�E����r������(5t���b����/b'��`����by�_���i��`{j)�K����!�,���
MA��p*�gyJ���O�or >]?��]�������5{�������/z+�27�������~��Z���O���?~��;�5�q�mS>{�����E~�|���6����_}HN�Cok�`����5�xoc���k[�����_h�{����~z#�1��P�����a/k �z��zX�Eo�'���%�+G
���F7:�/}��]�A����K&S~�����A��K���#%lS��`=���>�!81�a��9�"�t��u�)�Zb;�V��V�[���5g���W��-�4��������jO�m�w���������������������g�{]�g�<��1Kl��A����=rk���������C�i���@�Y�Sh 360e-z��l��mxZ'����,�����>�=���~���u��cvF��[��_@�-}�b't�F�����L!k�S��m��2T�Z����_d#�_�O�rmW��l.��>.�q�^�y�N�F�y�{lg��}�'�>���g�R����S���5��E23f���>����g�wmRw�t�K[�����������
I/�<�����"�C_�y������#�s=l�^u�z��&�e���v�t��Ij2�p^L:�����u� n�3���b�C��g������_�{a1�[��%\�}	����'�v*������L�u��9���f9�[�N�,����H���:���w�E[�gO���%�1��C����c�95������Ih'�B���A+>m�������?������\���=j�����}s�c�9�����u�}��>��WxHVm,['���^���.�����5k�������k��{��u�f�\Zs�,��\[�.6���oJ�]O��N��O���4kfS0��S|&����O�}^�:��]��|d]�?�|e���_���������~jl��-�?|,6�rkL���d�1��u=����4>�YU?���b:@���|���sXw>��d��;��Nf7��9���N�K������X�_/�C�~����~�=?f/e�O>�J�24����sP��=C�C��cx*��#�Y+����X7Yd�w��x�y��dLgV]o
�5��]q>��R�#����`J^>�{;g������?r���MSk���uKm��������6������|�A�����"�{��3�����h�_�a���]'Wq�������g;	gA��x�����
���~�u{�x;{rL|��c�����3-��O�~P�>vt[a�Mc�@��Udr����HJ"1��$x�(��p�!d������_�+9}F)�R\��A%8�~���
N����Ut��Z��d��8:��@�W�$
��{�Y{�-��������6�NA�3���N����%�tYq�'�/�f|oy����\�ZI���/t��diN�z�	^���w�I�
���<��a'��s�7S�f+��<[��k�#(Lo�������Jb��o<�
zO�kj3�>X0l��}|^[�h��/��A�
)�6��~[�d�I�W�e�t���i:'E?���nz�����m(H�lL�^G~����������ox�/�4���'������B$o���V�_�G���6��Y����t���-���;�l&������@_��������U:E����_������)��O<�l�s0�MJn7C�K��jN|1��G?������-�AO��k���?]���-]K�;8�-���r�!'��9M��N���^���T��w�!q�f�8&g�YDY�CK����j��<e����.��� 6�g|�Z�D/�_���O��7��[�;����r�u,�/�d�b��?����6�Ud��
�|ll�Y;��6�0'���y����/��^�/���o���da������S�K9��w1����|,�X��Sd�E�C	<�W'��kv�����r��x`�6��!��J�����������x&o��W�|��N�O�q�5����t31S~�/�kb��r;�oG�9���V���y�#s��)3_u;o���Z,2G��
�>>�����77�����{�[>�������x������7t������:���>�-������OM��c�_�_,��X��N.������c-
|�k}^1���=}�E��I`.t��<X�5q�=�[m��:`��!� ��_1�\W�WvxC'Z�7�r���W�`>[��X���&>}�`e������E=o[��W1��1��c�g��]�uz���a�XD���??�B>���v[9���G��C&Sv�&�:[U��ss��5�����m�������������6���
����x�����d��oj�d������a�:������W�����G�jAS6m����)����*�����U|b�vO`������q� yN�����\C]�S��'�;������ ����e5Z�O����O�[�	�^�r��B^6���M4N��3�)�'_�����)Z;"s>06����.|��!��U�m�}�glr�y�2�����a`^b*��|	�.; n�J���k�yj���g��W�/����16��Hh���!����xN���#�-:h��E|�9�{�S��C��	?��NM��������K��_j�|5O�-sE����?}o���9�O�2u(}�G��7�	��|]����N�K?b�T�|������/���O�t�����k�~9fj��by��6WS���S�����|[�
�+�@W�N~B�vs��s52���G�h��A�)���~�>���;�~��u��G#����8�U�}��������2����
M����9�}��5��,�A�:�<�;X�����O����E�4)~���I�WM/����.-���AW�+6�>z}`lA^���W��X�^�Z:����y4_a,q<m�a����/�+s���0V�K�E���o���
��'F#�7���w�S~a���}������>9�������-�
����|�w�5��4��Kv�9;h#����,�?���MZ_�}���t�?H^���a��~�r���������o���	���*>�c[�����fu2���P���\�I��w�2�AG1����}$q~'���/l���95�3���o�@��o�!z{����ktO?���l�Od�=�������#{tl�����&��I������t���zS�v}��^�����~�A<�Z��*��V������������5/�g�K�e�-;�*�Z|��+_�o����i7�V_��u<���>����p���v�'�����Sh�w���������z��t��h3W/U���9�6�tQ���U���P)�������'E8j�C�[k���$�D�?hP6}pTL%�=0�
�'�`|�I,&QDJjI�`)�'�Px��QPl�� �H��������
�a�q������+8O"�o�F�NC�B�S�Hd9@��@`4/�����6s<-J��\9O<3E���z��"�^����6�Yd�A��.�G�w���r�`�bO�Ec��f�[��#������dE� $�6F�c����E�;���l)����|�;G��xJOz��W���/�Q�Ib"2ec=�V7��L��p�Y��<Z^�N�m���h8�O��-��l��Q`���
��)F���U�~�;s��|/_ 6/�47~�-v���m����?��������$[�,����l�^�n����g���������9��,����?S������[�o1��������
?�0�]�����=�-�G����g
x�v��8�_�����{��q��v1{����A�;��E9��t�����M����.`G���W$��|m��1�AiO������;���Gct-��?����w�Y�p����"���0���l@��#�S}�G6�7�1B/��?�U��	?�a�-����07�Iqt��JL]���)�`����}l��|�#��������6��^Z�!s:��C�h9��i�Q��N�'}�A23^����X>���3qL�����S@�K_������c��{�/�z�c����*�^vz�@��,7�'[�����O���8��'OY��S����"\���������o-l
����hb��k~�G,t�����\�C-c��S����o�O|�G�e�f�6[�v�;�Z��(�
�����|�7��_oP�n|
b�������'��I�^v����V��Cx��$n�����@���/��`�������!��SP��G9K�f����>�o�
2�{>Y��#���%��L�tD��?wxO�����?�;�_;o���"3���|`���r#}��&/��������S�����f�`�@����xb��L���z���G��b�*z��`8��'G�Y��/��z��<�m�Y�����c�C���>�y������W���c���������S��"�'�����C�����N:i��~�N>������}����d,�fZN�O�7������c��/�������#f��B� ����3��jM��������E�I���z�W��$y!������am}���6t�����n�c��f��?��C��O�r�wt�u�h��!&�6f,����.kU��y�y�M��v��_h'|�O�C��A�8����"[�s~������~y 'k��J?��>{	:�
k��F����&}�c1��'�����=t��4�G�����s��{��<�*d$7gq�?�;�T���01B{��u
�������Cg�k����;����������ek������5��o����-XdS����`�x
j>��y���?�e:���1��w��,�5���x���=��&���?~��{���>��cMIo���9�C��=����6�����^����|�/�������>�3[ ;>I����C�]��?z����j�q���_�6�������������C�lY_�����q����N�o,����J�����[�k�7��;��t���l�����^|�6�a�*��s>c��b�mz��%�[���v�=�b�rf�����s0����>���g�����]5<_���;�!&�����=�eaN�>y��C��C��e F�}t���M?���m^%�RW��%��-��h���:���!r��_�����=��������)�)��7�N��-�C/qX��O���1�E�u
x�O�sq��G�H��O�������r,u��;�?�<~E[������1�q�[l�~N�����w�x�K�m,����9����5(zD����$�"_0�^���nP����������'�?�w�Uy`'�^u@�G1���?5[E^�l�ruy�#�x�*����2�|�}�s�u��_�K��~�'�������7��t%:iL��y����\�������i�Z��o��k�l��N����;�-S'�u'���x�E7�@rO����	X�3'��?�^���9�#�2�������s�v��b��> �'S`�b1}�3�,�Ao�����d�x����H{y�]��l�;>�]����>�
]��>�`�l�n�t����{������2�?i~��Wd���C�F�;9'�a_���U��Sk7s�Kk��������"�Q������2y��-|/;������=��,L�]�G����1���j�b�����9��/sU�����r��B���W���x���'s�a�c�_���@��~\�C�
����������7��-����7������Z!hJ�)c���5���	O2!A�h�P�'"�	�$<����QeC��1N	�DN@�G��(�{(�����o�I�E�u� ��<�������Z�g1��m�h��rD���XH�����g{b\�3��9��Gr�<�4��1���}\��?��qrS@#Z%&�B'%�)��;���3W����������,[�q��������<�
����E|0g)�B>�����o���"H���������>���������cLti�b�B�BJ��:a��%�h����M�\����?Y��h��>������O���s�w9�)�
�O�Np�/����?���/��O�p@O�(�0���|�+|��H�N_��o<�p@O$x�.���jgN��Wd]e��>�7:�Y���S�;}����9�����&g������":C�
��@~����|����}���������m�;�!?s�����7����F�`F>����k�G��Y����g�����?�o�
���[A'�26��J�d���
sC�>�i?�C:�{z�=�17z@W������k.6�������h�K���S��O2����f��O�_<����O��=��������@;��>���8�m�e,������$����h����-�H��N���=Z\�"/sT����
Q<��t����#�����e��7��?��8�~����$'s!O|E_l}x��t��1����9�I������"�+j�o@�y��#��-��?EW��\��#���?���p?^����zN�aLm����#"��o
t$v�O�=d�Ox�����N����h�kr���������1'4���~
mb���mt�<�-���l�����F~���~��<�N��w�~�l��L���7h����9�)>�����,����mN��_$O6kn����F�/B�0>������9�m
��/m��q�I\����m�V�����%���y'��7��w�iq����=�D[4�������5>~�!~�9���_��~�����A�~}�-}�����W�x`������cN�t>�E����xi.�2|�3~�����U��N-�o9�M����)�>�����
]f��'��m~F;�
_���
�zK|���{���$6y��S��~�Z1�X=���_�����y��:n�P_�ytQ|�_�{��y��������P�|����CW��7��~�q������'q�1����G�b8���m�5�;����<~�����2����:[��P�b���"�67�J�|Z���"1�m��_�����
s����/�S��|
�I�~���U4�1E+����,��[9�\B��'���h4/z*��{z�o��$g�4D��L��|�4G��~�����j�j
hA��jkS���f���;���!?�N:����D�������n|��>�B����\��{rq�~�?��������Q��F������O���y�[�'[�����t��b����L6l�5����|$D�|Cb������%��ag|�?%���x��7bC��l���a��)����O��|�C&x^��������������o���4������O��e��U�0kq��_vM�l��!�O���Y�eh��h2���q��zQ���5�F;?��|����T�� ������h\>�������u���tQ<����-|������G��<>�i�?�A�#V����k���5}����b����3g9z�[�z�N����~��Nr�k��kto�X{sE?��^_dj�����������F�1}0�}Ym�Jyi�?�����t������m��&����V��7�o~������_�<���0&~YH��#6�;�R��N!��;n,�$W|�OrK�d���eG��fK�5���	?���������9x�::��|+k�d��i���;2B#�1����u6`}�>�x��~�,cs1�~���sdc|+������G��'�����/�f�t8����t�����X��_$���[��m�=��^��n�'x��x�}����M����6�o����Dm�� 6��9L�K�chf��n�����|���������`����%4�;����y�������������$��w��n�k�$������|�����?q9h����d
#9=c��?��X����71T����l�?����V��s�����t�\��y#��{�+<�O��D?oNh�m��G���#�>����}�x��z�����n��������7�:92?���\���d�c��L��=��e��I�dL����#���K��+�s���_j�v��h�S�_�/���2OvBg��sz%��w� ��������yZ�&��/�����I������NWbwtG?����������6?O6tP,���&~��<����Or's���������u9����hO6�FN'��k��xm.�9_����o>��t1���T��b��#��,���]u#�i��k��_�?;�7�&�h7�`Q����f��a�tM�����_�2��!<$#>�<�P�c����@_���K�%��/���D�lJ�$/�L��2�v����������w��q:�rt���9�e����/��O�B�o�����6��i~��������6��3������{����@N~.���+��/��M��;��m|�=���d�n���/�wB�=�G��|l�]���g�1'����J��/~�N��5r 3��O��^�64�s��;b���gz`,�#�9��_!S��7�d��>���y�1���0�9�t��Y'��\��>r�;?���o��4���Q/�����n��x���rC~������W0%K�O���<hA�t�m� W��_�����0�07}���_������y
}K����9}�g���BF>t
�y�%�[4��,������>��E<��E~tO���r����~�d;h#�m�����y�1��������>:��{�]��x@G���^|�K�������c�)����(�px�]B��-������(����H�(GH�c��%��r���rr�6�9��5�R`��8��(��0F�G�������������=�����gX$�����I9S�v�������c�_?����r���}8	�|��������s�2���"�{�
�9g�qZ%��C^��>H<\���"���1�<@/�m��A.�D����rBxM�+�$!���a��9r����N��������y��v=x�9�������m������������X����,$��`n�7���$a
�N�K���#�k����.������n7~�g����9���D���	?]Kr�E�+y�=;��%�������d���d#
IJ��~%��E������&c�-J��>[$���U����G;��.�Hv�9��;���=3'z���0.�1G���l�}��6�u����o��������l�#2'o�M��B2�g/���A�Q��O��w� �&;z��d!!�[B'�����?��m�Or���V�3���0^�c��w���D��>�\�4r0�)������`�t��F������>�H,���<�d� ;I6[�Y�?����{��?��n>@���f�1G}������{�w
o3�����D�I�B;�($���|YXM���q�����o?�9����>h1���#qm���K|�.�/��N��g����ccN�`\�^�!@7=���C_�N����������-�8��7�?�G�d�������C��_4�W�o�~����0�H��Gx�hn�#gt�	�C7�d�x�O�����7����~������7�]6e<����56@N�<t�)��%s��Y���c�������x�;�7o}������������@F����-��_�"G����ZhO�� �d�t�����<�o��y�'��/� O�z�?>��)���m�v�k>�+9��K�#7����������C�,z��_!�6�j+�"Gm����
��)Y���Z2fO���A���S0z'F���^�Q~69y*��B��W��}�n~�������n�3��n�����|�n��
]1���M|M|��-Y�/:�?�Q��{��
�����}�7`�d���$�_��rE1�}LA�t���g�����?�?1����e�]��h7��_17��N��`L��W�6�6��Z���'+s��������'���Y���
���;�$7I�6m���jc��d���k
��z`�~�M����C�>����j���������Z��A�d~��_�N���k�7G�7?n4�	��[�)�r���]�
�]0'_s�s�������W}����"��<�%�9����f ot��������)���%~�<�Nn�+m�^�|��5��G[������Mm4kc,��#q�l���b;�^��l�&G6b�������s�Gdnl�Y�u���q����k���[��=������l����I'[^�G?t@���w
��|���lB�nq�[����{�*6��D@��}l(�}�T���M������x���@����M������7�d�G��t5��>zY��8������]�y�������;�rM�l�|���<~�stV���~��3}k�N��O��XrV6B>��k�@����7�^��}�K�~�Wd��u%�}h�>�l<y�qZY��\�#�!|������#���Xt��G��oC�>�Pt�����L�
��Kxb��O�am�7����9��������hB[�����6���t�w�Fb����`|�G���OG�>����>�����5�g�x�|�/�<}G��������0%Ks�����9��������t]�����Q�s��Oh��y�M}���x�7zG��=h��v�I7�6��������������~���������h�ef~S1�Gr,����/ie��6��������V�b��Cx����n�n�k���[��~$��[�%���i`�����g���/>�}���^=�j��Ct^��:p�8�����B��z��?��E1E?d���/���u��m�L�?>�	��~���O���<�V��-��o���
��xd�~'w��C�h^����D/>�qrl>�u���1��f�������K7����)��yI��l��=t�|��[��vgl�m�[��w�7�)>o�����]���A�c=_b�������6�g��w������l���e���"s��/�e�����[W��Y���1��f9��S��,�I�T.
�olc����On�?���7�mZ�1~
xj,��3_���|�r�y�������Q�������9H�7Z�{`�����;�d��f��c�����.�!��_��z����{�_����9������{��1B����>��s�/��M�������o�.���<�%�����c���[L�DzG�z��o��>�Nc�u��Pld�:�~E���r���Y~���GG���x��^/��������������mu���O�.�����kt�:;
�k�h�����l��]��d
���Y�����JsD����c\��3���6�;������~�A�3�����>�g�����s�MhC{��s}���>��k�?�'m�`J������y�������s�=��Z��hA3�a����������`_P����c������������~�-2M[�%�:�������������N��wx������7�E�9�����
�F�{�5��#4�m��7f,r���g����A��.�Ba����]D<��)����Es��? 	qX�P��p ���p����$��B�P8�p �������6+,����v>���6~+�'l�{�
T��������6(,�������-f[|�@xx��7�f�6����^�� �T��>?�3?3n
�B�����O��r���l���n�k�8����=`�C�o����;��+��+K�(>���r�������{���5��'���n��x���(�s|���7���zV
��/�:����������:X(
����}k��M9��`�r�Ba7���D
���~���=<���6���~��Uh��'&v+<en�{���B��g�����i�U(
�B�P8P,{�7/��<�Z(
���C0��n��gt�Qm����9�����3�#��Sk�u@���y����G
�B�P(*xX��_!�sy��n��
�B��}HYN��/�y�Tm�/~������qn7��:����|��������v(�_t4��a�P(
�Ba��\�z�����6�����)�"�~�Al��P����I;��@�j�������=���W���7����l>���?�N��l��O�N��S=�X���p[������B�P8|���=�c����w�s������
;���'r�#'������������A�7��
��������?���~���[��[
l�8�����m���q�p�O�
{��f��A|��],
��������g<c�K�����q������f��u���	��|�3c�� �������&f�Y�R8���Fu�������thY��Q����)������n��|�����q��e���uj���/��w�
�1]�������P(����~�����[��6�/	�I�P�K����]�
a�4�,�i{���A^o1�1� �n~�D�����D������
s��5�1\���h](�]�A�B�P8r��N8a����W����k!�p(P�������/�q��,g9��va��0|��^w<8����:���/q�K���5����y���7N���~��,���������t�)
������g��W��U�+]�J�����m��vk]�Mo���'G�����\�Z��'���!��-�#��0��.v���To��q��W��p���d��E5:�0��/~��9����ra��_p��	�`���a�B�P����8��/=X���}�K^r��Ba���������
�
��^?��O��Vmq�+�m���MK�9ys���S�x���gO��P�({z��K]�R�~1�P(v3����-�+��6�Ba�q����w��o�B�P(
�B�P(�.T][(
�B�P(
���:�\(
�B�P(
�#��[(
�B�P(
����k�B�P(
�B��_q���B�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;��r�P(
�B�P(
�B�P(
�B�P(
�B�P(
�B�PX;�v�/
�B�P(
�B�����?w�q�
�E����p���/�{�����_
{�}�K�Y]����pt)���i���_\]_�:���l�s����
|���
_;�`@Z����:u�Q�n\(
����k���,V-|�j�o:K��{
��2�����^�808��7~)���q|i���fk�B�������O����9���
���FT.�[|���
�|�W����^~���p�K3\��G��;�w?N;u8�C����
�}�`��
�g����c.{���=���r�G������_:�Up��.x����.�q�P���������k��~��W��5.r����~���
�Ba��6t������6��'�?W��}`��e�����(�p��?8|�O��z�{�~�e����5���e�JaO��/�}���i�{�X�����6�������0�������/}jx���}��/}r�����9.8��E�:��l���R(
{U�
;�����[����������5\����w�N>y����9����,mV�ms�p��^m8�r?�q���q��S?��a���6.��c�3����g����Ba�������wm���r��~�����[�P(�M�A����������9e���p�Q������������~��������|�;����q����w�����y���}8�y�;�����SN����o���8�~�s�c8���}�6�����lg�s�������h�cp���X�9�`��p�'?>|�A�N���7����/���y�����A9l����|e��QG}���2���������/|alC�u�s�IN>X���K_����9�y�������4]���_��x]��3@�6_��W���b����>�������0|�6����.���������Y��lrb����[,#:���|f�G:G����hCo�m����o����z������@��?���_����w=ix��c��j8�Y�5<����\[;�N�d.���|�s���o��-��6^m���kc-�o��gN��mc,z��X���Q���rx���<���_��V�"5�x�����c��W�G>�����N�q�{�q������
�{�����������m���0|�w�����������`���>5~w�[�j��E/zFn �}�[�:����c���7��M�T[k��w�c��?��1����.7��v������������~���7�Fb�quy�-���GO���E7���$'���\r�7��M������F�����������y�6�{�����*W��p���d�9�k^���-oy�p���e����6\���>S�����^���
���0�,���U�z����������|������f�O}����>����7��������[
G_��a8��7�,:q�	'���%�����z:���w�	����8���o}���������O|��s��������-��-��nv��~��T��M���������p�[�b�����3��o��_�ux�K^2�����Xs������?�����)zs��]l��]�:|��~��=��/��/�W��c=�}��}�mo{����O8����}���������'e���8�Y�=���:\�bW���>������7�����_������t�?t��\��\{�Y������E�_��_�~�������?��gZ?Q��Km�����u��_��gZ�Y��
�#U�
;������[>��}�o>���a�9�p�=�\r�����s��]�zg����-���m����j����^��c��'^��W�9\�Z���y����/|�����g6��8���>��??��/����:j8�U~t��{��p����qqyD������Z��YW^�L
������s���m������W�����p���a+���G]���|�6.��|��_?\��W��{����)��?�
�]rQ�^��?C��
~G�I���]�5����.|����25���7���#�Y�Wh
�����������
ox�6�����{��C��������y�������l�|�/,|k�����g�	}�?����3�X�������6������4�@P�/�����:���
�
'����Oak�������w�p��2%`������G�Gc�'x�I���Ox������mL(�"V���=lx�S�2&���\�"c���&p��G�����}���(HL?��}�C��>��c��_���.t�3����S?���K/}�p��z+8�M��z��G�c�D��������?~�����S�y���}�|$�����������B��������vtAq!������qT?������7j<�)@����?}l������%.q�3S8}�+_9<��7m�Hh/s��|�A����>�����{�A!����0u��?<�� �`�t����a�Q���|,�X����hcqBbo�L�k�Lrw������m��k(��67���'�x�#�q<�P�*f�������#��Q/��~����&3?��G?z, l�_�N{_:����>��������+���G�e��_i��9.�qey8��Xs�k\���������������y���7���0�����m��
��Fl�����3F��?��?���|��u���Q6}_��W��B?�A��.u�3��o6�o������(�������H�������3�B���|��~��6~+
sx�GN��J���S�qc�2?�T���>4Xb��?��qa���6DXU�8d���s:��
Z���������66s��6�<��f��.���/�����r�����1���/�?�U�?�k}�5/N��l\X
�}�����w����Ua��>���x8��D{0/��������c����Q9�o��o�m���m������y��Q����:C^����z[]b���C?�M��m�y�cF����g=�Yc���������}��p��7.��g9�p�o}����������>�����e/{���������w����\��g>����y�}�{��0�
U�]|���k��F<���������3?�����|��&Rg���Y�������H�ZC�S����z�{�k�G���u�k^��g������'o�����������"������r������A�di
�7���
�4����?�$u��t�@���>�XG�j�����Y��>���0\q�^]M7A���G=j���������������u�B��B�������y����mm����W������o��)����_�����-�6jy�=75��!��I�c��!-�?����'��2��~�i��/>� ���}���=p�s����:�j����iO{�('��������jX�&m
�������>����m
��%���������	�tB]}!�����)�q�l�� ��T>���6��Z��!k�%5=��������a����������{�����8����?��hn��u|�k_���/���v�A��\�f�Y�^�� ;��#d��>�2��k����_��_�%�!k-�~�V�A��
�uP��o��������p�+��AeI��oE�@jS��L���$p6Y�~���O19�� ����@��)2<��I8O	��:�e!\���w����ExY)6r$�����8>�)	�2�$�{�}����_���T>X����+Tv���b	��'�8�$�$��d�D�@>1��?��XtH�����~���"�~��+]�J������fG,~xK���M�A���J��g~�g�'.3�S��D��8o����nch���D4��~�i�������c���s����.}P�%�
�'=�I�xz����
2�����1�'����0�H��]�2���D�hBq�h4�'e�x�;�Qlf��B����S�����+�4����B�^��F7u�&=�������9�F���V(;��_��WN������-T>��g�s�]��2��A������H���;�xb��O������/��/���
�D�sh�b�B�W�WGy������gtUQ)^Y�����~�gv�iN�'=���k�����x���2W$�\V��������lm�R��0�����q`����t@�P���
�Ba9��?N���N��Ae����.{��*�/��j9�:C���Yu�

��H��?��c|����|�����'~b���R�:����Xl���c���B���B�S>�������1���m�\�`A^�/p��������)�������7��J��_����!�-xnrMk0�?�Q���X�Y�,�Yzbm��n6��m6��o�v<��^�)!4F6_���AlR
��#�U��	5�\�NZ�kz��<�}��3�_��p�'_����g��p�o��Ae��:�-{���������Vo���������7��W��������Ku���������,=P�G6��u_���sjb����\�/������y���j
ml4;��/�O���[:����SN;e<���O�����p�Q�W���W:�����������<��Aekmn�s�D��F����[�3b]H�q`d3_�m���}��~�(��]���
dt���wcc�f����2��P(Y���P�9���[?�|�1���j���f�y�{������hX&���/�[k�?8(*���#���������q�]n!W�s�'V/m�[X+�/8��_���m���Au�g��k,}PYmCF�P5)��rP�������9����/�V�/�������2�/�	���i�����V�������p��7���9��r{b��-�/sPY]I����C&��f]�������T2V���E���}mV���S�������u{�O|��7:������������������<������Ae����|�����}W����n�������g�|gr�|�q�x�X1���,/E����g�����K��{Q��
��BIg�����;}/h;�eCW0��7~c��?$�P@8�%�J*%�6����w�m=e'��Hd�F{A]�~mrO�	�3;���!�$�=,�K$!�Y\�xJpm@���HM������*����(�@�m���O��xH������{��<�I�{8�����%��.��������G}�Nq+�?r�A�o���V��@�?��-�E!���?����'&��E����I�d<����)�#���UQl�Q��:a��|mb�W�:�J/$�t�G?Vm�~:H������S8��>��^��)Rf��,�$�7���������������C�-��
E�
4�V(��!e��T�k�B�"�l����*8m��f�
	~���3-��[6�I��1}�ot�uh��t�<{�-������$gv@��������M'�
(��x?��������~�+O)�%������C�=��|���/���1�!K���X�����E�a���S���f����-:�����@������r����_��-V���s�%�����@���,���>�{iC��E~�th
��GiClft]�;v�%>
M|��E�����Y�f��#���wR���B�P(�D��b�MVuG���X�n���1��p�J��\T���C��Bj+�����9@q���1,n������Ku��.��-@�U��<D?=�.�
r4�W�}��j���Z�P9i�Z?=�e���{�-/������OyQ�����#��mb�L�A��A�=��E�����ar�Y7Q{x0R��
y��z<tf3Cn����OKfs�xtG��M�d(����Mm|��tB�M����krL9�>A��;�5W��>��M]�6�~�^3o9���}���C�t��
���s6����.���"�l0Y�R����7�=o�Q{�5���d�&m�Y����m�^�G����2��B���'�Qk"����u��l����}z���SuetC}�NcD'�Ch������jdv�O���k��������?�:[�+���d��I����=����b��j����8���S+[4�����|�@_�1c;hho�]���P��-�n?�1��;~��D�lD�G{��7����vt��Y;��?�b��B�P(����Nm��>]qu��B���G�oru�<Cn!�����������zH����f�����a���MN��"�q�Gln����krO��%\�/h���Ji������;����-���M��j�����-���B�����D@V�DN�^9���grd5��[9z��n��}�B{���3�2�1�G��h��0B����_-��ZSI������-�9��:W}^D��)�I���E5,����@]D�����"u>��kz�ze^hM����7��1k+�Pk<�C�����>��nQ����s���f���8'"���Cg������ut�O����
�M��j�������f{��jg����R(luP�P8�Mo����}�����S�xb.I�����+a�v	i�A\;�	z�z��D��$W�/���������I�"8O�d8D�iO�x3������==%��%H~>8��@�9IE
z��M[o�����?��?(N%��dd��~����0GI9��!?��H:�d�M���d��9�����#�"7r6��#��6��`m��qhs?��I��
:5����R�����^������~��;}!g4�sE��$k
�<UL��]ph���n:M��s�����;��&�o!Y�_2��l"I?������Q��P��nc�|,
��<Y����6��K������I��!g��X��2��9������7UD�k��@W�>&�G{���(}���;��%t9 �;0O����ov���?��G��?��0{d���?��xF>l������'&�$:�6�����Qx�QY����C����|���<��~2�@�^�����n6n,q��?��~[��~�m�@��\�8��,��O[L�h��	Z1�'�zb>����2`�|�����~{�}�����^b�?��h/
�Ba7@���7Lz�8�B,�{��h��m���rW�H���#��b�U~)���@~!_�����E�����=���F��#� ���'�p���(��<���@�������$��a�3@���0�v0������X���;u�n~�P��'�Lj�r*�J��2����$/��6j!�:���{�7��Em\��K���mf������|T�+�m4�O��~������E�)|�n�,w$�R�J�����Y~K������x��>����������R����x��>��c����v�0�����l�������R��6��:G6U���W���:�]k�VM*�f���Gi�
.~D]�;u��+�'�5�{�9~�|[�w���h�������������R�����[t�j<��
�����\�����.�e��R��)m
���V'�e�5yd�����
���8����3|L�t�xdH~hVS�hc|4/�����54��t����o�6��������
�{����=��kY��r:l���w����zL�P(
�����r����r��B�������F;q^���T�p5���:��rQn�����C�!29�ZX�"���j�����T���L����k{		>��:��B�,�(�P�X���]����2�[�w����+�K����5����zd��{.=����3������i�������KZ�,?�b���6^��e:��Q�����}�+���g/�w{d��=l�����
�A��'���4�X{S��wu�ZUM�6��6rw�_T�j������q����T��������y��z�?Q��	j)kY;S+����;:��=�c���Z����
������9�?�;��T�����x{�~�5�Sq��g�Y���������G�M�$w�v(�_�N�����Y���r�n��t~���
���w�
���@�����g[��&�I���B��	�
m$m�!@K�����������C�J�Y0w_�O��@�0�S�m����l�d�fH�E��,rK�����4�W�#��K>$�I�l�H*-b��t8q*���p�4�� ���t�|�G���� 1$GEJ�)����<��<��X�N�C�����k��b��1��~��oO�I�,R�K1I?$d���1<u.Y�PW�� �����_�Q���05�I
��L��q,(b&{lT�f^��-&aN>Y� ����7+}�0���O��f����^%���O
~Z����n��?��w��wN�SH�0O:�
�|�C��f�N�
o5:�������>��v�G�`�9|��)t������q��m����f)��z��('�|������"���Q �!Yk����/<'O}){��.1C:��wtPq_��v>t�|��6�z����f|�Mn��m�l��wO�71��t����O���a�0��c~�fa�A.��o`���������B�P(v�����|m!&���sq_�)�R;���A ���A����v��+�����m��_m��3����
Y�����o���a�M.���!���ENa].��V#'�@��R���]Q6]�i3Hn!w���g`���X�O��B��<�����:����-��HNi\������q�3�<Sc�5���fn�J>�{jrA}��A���+6V�-Yk�O5�������
�_��9������s�Y��������m��[����
�&G<#C6��I��FM����~�lt��\��w�����^�����$�������L��u��?�+5�x���1u-�c�����n��������j��q���'���S����4>�>�e����U��y/@M�/��I=�cr�}t�L�.�e+q��h�8����1V������.��I����S����9?F���X��6P]w���i��A�{�v�m�O<��>���w�t��'���?�Vz�+_9�/
�Ba/�>�=09`����j9@�F�T/k#��U�nS#���a�A)w��&f�G��O��p5����������j`�0'�����_��?����R\��.������6�v3��_�p�O��c]y�\
����v�_�3:m��y�&�-�1����Z����|�o��K^�o��^��)Z����QU�n�_b�bM�?�1v;�q�����2p�n�������w}MB��W#�E5,�"��o��VY!~����}|�\M�V��_��?�����+��jW�N�o}N[g���:��}�{p��NF����y�8}�Z��x�����&����y8ajm����3�n�������v�q_���P��7/���yzqZ�>���'6����Ba����(
;�URgAz*I��	����pl��H"�����/���G���6��T?��K�iQZ�%�tb���������6c
E���BI�E�+\�
��CfC0w�K"!5�
;��V��&o�� ���M�)���|���'E-��m|��������6��F[�������W��m���3�Z���TO[��D����O�I�$n���Wl�/��@ Z��`���u���ec6�-��������/s�ie������'Cm�����Oi����h�Zt���m!�6�������6�u
���+,��X�p���k����1��5��Q���'�����D�,�(�������l��(��l���r�z��2���?���6>�X����,���G}M�w�2L����~

P:;Th����������e����,zg��
l�;���,��s�������&c��?W(
��^A�!�B6��+�w!m���r�����f3�=�/rJ����/[�����fcC��/����y�<R��{-�S�|���J�����A�����7u��ZwL��������.,j#�'�VWzh#'l��!?�����������������B��4���D��Ak"�?��=za�D�js��Zj�6v�]�l�����������L6�a����u���Gz5WB����>��I]��`���-==��:B������������7���u=�����l�S��p��2f��w����x������Lt�>�Fw=$i�m?����{�m�yJ�-�i�����A/{�����>�t��us����pb�#�����S����>����ZW���3kq|�P���������8�d����7�c���B�P�O�,����6��?rY��m�#�����aH9���G
"�;x+'P�����z�wy[��V��!$q�����n�����?���ro�TS�[������Y:�~O>-��ki������q@�h��O��ZW?�d�����u8������8�J�*��=��d��aK���0z��/xx���A���^>�OZ����O��Y���~��/}c�y�������r���o>>O�����v���P�X[Q3[��������x������u;����m������[��g��|��Sq�������@�Z�6����/h��=���v��z�����b�e�����Z)��YJ�P8,HV���� �(��'I��~�<��Y�8��A2���M6m�	�������6M,N+B$��*^-Z�.W=��?O�J6�{���"������H�6��v��'����kC/�~Q�8�V��A�d�X���A?
R��v6�l�*$z�O�����)0��8q���bF������"��lV�kN��
�Z�&~`n����w2?�F��.AZ�cS��W �t�c�$�^�G�J���wm�)@<��p����vw?��V>s�oY�7�mc��|�[�f��x�~0O�:�����<�?�Y�S�Z4��,��%�;��:��;>�F7��x`�f7��X {�Dz
�B��W ���Z�����x}��m���z��5��M�ZD�F2����:t%�lX��|�r�.��D�_�rM��rxP~�a$m�Y�9,\����\1?��@>����fvr��iAO<��
N��o��
L����B�i�����V�z���9�������5
��a[�m�����Q�+��FO�E�l��<�����q]�_���?)i.:�_��
2�v���o�{��F���3�@��A���3�D/s�_`�3��}|���� ���16�i�M���J��?�<��wo���&ml��|����P��kV��|��������b��-���J��6�u���,�]~������}�|'��{kk�������V�i~�w�'��1�8h�':4���)�����eN;���
���u�B��_�����>��;��^<���������6mn1{)��C�{���&O����6h�_Z#w�d�y�+K�k�j �-��5���>�0���r��s���V���~��gj���-��22�[N�a\�`$�S�s�5
4%w�$�4w��k9�,?�K�Y<�&�����q�e]{�|�M���A��{hC�}�^��a�j�����mR���h�?��m��}���-���5���)�Z����7���~�O�����p��~��|����a��|v"��~�
�e�%��M����v�e��Ez�}�f'�_������H6>?��rp>k��q���
��*
Gw	�bCbH����a�<�x
��8���������P@h#��w q�|*&�]0N2��I$�����R���'#=�&���"6��{���5�
������?������^�F��|�](Q�+����]���>��b����;	����SrK�*�r-@��J?����t�4�`6�7�����
M$���R�1sH���6������OgK=���W�z�~����S�LG��;^�C���6l��6���h�Y�d�I���H�#��(�Md�������H�}���R����}���Ot->��oO��_��xk2cG6���{�S�2�
�����f�C�{l�|�����1Y�?
����/t/}�i�9�d��|����h�/Y)����4Y����L�7=��E�h�F�@?��w�At�������b�o��f|�q~:���BU��o��0��'=i�M
,�����Y(
��n��Zu�|��m6������ks.�59���>b�|4��%��"�uP�y�1��s�����8m�6�D#��{�;������!d��M�<'r���������������p�MN���g�#�Y���TmhC�64��}�+���]��Y����Zc�Q��jC��|t
���xt���N?}������;�.oT�z�M[��?u]y���6��������?����{yc����
���)���>�����Qm��6���{jm��w��O_RS�m�0��V���B���i�&�p6������z��~���+>Q[��=���x8���������1���<��oz�O���^�5y��'<�ft��j�!�6�l�����!�V���9�U�J\l�a}��~/��Z_����?�Shi��A���l�A�L����yt���	�C:��G?z<p���9�o[�
�B��!�X&����/Q����k�U�
m�mk����s���d�=t�5�X�/��,���`�����C����||�^0<���`B��u<��8S�W���n��%rs�|t��/��]i�����;}�hO�o���S�F�ZX=��6��\���F�
P������W����S�0��;�|�S���@�x�&������R���\
���:�_�
]�������Bt(��[�:�/��[��N��m���qtH]��9�+<2��_���k*����?�s?7��~���3�n�/����im����Q���<@���Eb`���]S���v�E��o�/��2��������*:��������a,���C���������B��xI2]m�#P���R	n����8`(1E�2p�P��?+Hj�(@�h��-oy��@���I��@�@[	��]��"�7~�7�?���g,��dz/����G+�V>�3�w����FB-Sh*X%I�f�9�J��
��"o�P����f,��6IN�/�'{c-E��Ic.�q	��%r��M����~�"�D��[OA�'�J���[�mtx;�9����YN��wI�^�#�x��(D��>�]�@�(�R|����%�v���x�p%��0�[����+���?��5t,{P�����X�p�n����d��P`Ch�?��n.�����k�w�����&����^G6�����|��������x%��
���|�X4��V�I���X�
y�����
r#�^�-f���)�#�/m<9�V4�p��Y�[���K_t���f���D��[���O����k_����E���[Q��>�L�^(
��n��)����b��L�*�3m@��@!^;���D��/X���#�y�����/y�zX.��T'-9�>��mn+/�G�C��O������p�\�w�R,y���6Gl�:��>W��r6�D�)���wr|�"����Q��E9�M|�A�����[e���Q�]�3t�z����t�+�m���@��,��f�;�;���4�]�vtY�h��<����N?����~���U��7�<�����=���x/�}y�ydmo=���5/���	x'W����j��!�����X:A_�P�:��l���0V��?���h������2��D�Y
� |����RX;QS�/���|�T��m�C��O�r�ao��Z����2h}Kx�!|�j�!�6�l�����/��h�V�~Fn���j��!4�M�-����e v�����O�.�%F�a�s��5�6_���@t�K�y�+_9��r��G�/��=���B�P���,�[�
��r��(�����������Z14u����������Gmsc,4��������G_�	��rPu���������jt��7X��f���7K��7��~��XW^''S#-�a�o��/r�e �T'��[z�D�I�-?������&�z8�����������'�|�#��t+y�^����L�#<U���:����O�v��_���6�/��V]���B����.���#�E������-�	t�j`z���/-Km�����aQ}�i��7�������}�s�;�(�����6���\w�Yf�E��l��O4�k"���f}�P����M�s�i�Y<�o��7��M�����A�_����/��f8�A���Ba_���9y��N�[�M�p�p�s����*�=U#�*�@R%�KQ���������w��pZ��-��F��N��v��������mc�/�����}�������GE�D�����/���&7���DH�Z�����������C�G�KN�\H����$*AO
y�����D[���N8a8���$Rb#�%P�0iN��i_������������x8�9��]���Q�
|�TI��s����4H��x�`�K���|r(��/}����%��/t�f7���iC��*Ys�S���[�������'z!1}���=���nu�Q�x��E���$�����������%��
� ! b������?�;�����(v�" )]���w��>�*���r��_8�N������|��>�c�G}t���v�XNv������;^���m�q{�X��m��|�����m��Q{�v�����Ot��]@���]����=����k;F�u�m-�r���~�Eb[����r���w�K�y��f��V����]�y������}VV�|��������}m��>/+@������j��y���}O-������/vlZMT;.�s��`�c�.��{m����2�<������;�l�,	��^�+H����S;W�gk��^�{[��c����,��i���`A�m�������{�_|�������9f�?;����y�t;��um9P����/�~�������Xj���T.�7����5���J
�����V����-c���G�z����c���o��������|��cAY��bA�������O����s���f�yv���$�^���q��}���`m�����}��{n�d7;������>K���{`������v.���~��`�~-�#��������#�=��X`m�������f�}�v���l�7���������^;~C�
m�5lY�-�c�~�������������C�Yc-G�k�x�<f����vC��`
;o��	���9'���"��h�c��Z�(�?A�;l��������g���k-����H�M����������O+��k9�a��];��l���W~��L�~�k7���N������f[��o��������{m���:������o���O����n��/v
c���`�kh�Vy��g�6\v�e����+�:�����v}b��v��b(�=�k
���kU�_����g���`�2���]olS�b�����I��RiG'�
���1v������u�����b�����>��;F,y��������[���^y����v�i��v��5�=���{	v�Xi��]��g`����]�����.N�8���kY,e1�}FvO�
l�,��
S�z�^��9c�d����c���[�l�n�7�8�wl����B�Y��m��/;��=X���;g��]K��m���vL�~��?))�O��+����q������5���I�Xw�z�Z�}O��n������o��`�9�;g�v�l�+�<�Lw�m��}����kh;�������k��gh���c���x�^��g�y��l�L���k,��r���>+������9�6�{_vO���Oaq���,�����I�^{�����,��m�c������=v����y��e�;'��������7���<b���y�O�|f1��;Kvy��G�y��E;����|{���������5b�x�Y:���e������Nm�6��l>���w�������c����;>�;e��~��s��O�7d[��l�\gq���3����v,����G���e����W�������������;6�3���n}���qc���Ym{��f�(;��1n��
�;��v�~�s���v���C�v|����o��XKe���X������m�X���v��q-��|9&���[	'}��"�U�<�k��l��;g��];n������o���������(���X���.�Oo���m��VFc��Z��-��k��~w�����������~�����be�V+��k(+'��[���u��,������������m�6��������l}�~���������{��hA��?�P*��r<��J�����n�sC�:�ba+��@��v=����J�a-������
��xzs�����c���m�M�m�����-f��g��v\��g���"{m������I;6��!��m��/��.V�i��,��x��G��z�{:�Ut��X,<��B>�|�:�WmM�����w��D�^��o��geZv��km�����>��=�O-���������m,���������>++�����k����l�sX��>{�;[<�.���c��m{�}�9�^�����{�5���}�;d��n�6���N�>����V���A{���l���^I��_��
���o�����9���Jl�y�������������9�g����U���3v��z���g�g���k���}l]��{�[���}��r��Tv?���Z���F�=�������/@YD�2�����l���~�-��.���x� g?���.�1�[��HZ2�]p�2��m��z�������w m��x�`��-g�V�h	]�vu?���������
s�F���m�����.�"0��E�����%P��Rv�h�o�����t����h�v�`��],�����m�4&*��}>�l��E�+�h7���������n�[pk8Vg�����]��z�ul]�yX�����/[�]m[�w��^x������6�����m�@�j��/�J�~��������7�g�����G���jy���gl��`W\q��8��?{�m���6�r�m]��������]������l����������#v,�2v!l�a�{j������u��vL�������l�w5�/�������-c���w;&-8����?6��������f� �����e�>�-�d�x���,�X?Q�����}�����q+���#�wv���m�m��gl����L��c�����?v������������S�����v���j7&-��P���Cl?�o��gd��%�~������26�����Y�z��c7l����>�^�z�}��1g��e�3����k�����f��oa�e7��Fn��9��v\��mA�?����[������.�;&��l�s����h���'������4�{����;;�������]�}`����}?m?l��P���/
t�M+m���~#���n,��f�?����cK���k+���&�Sz�����u����>�6���]��e[�~;ml=��k������k	�V�a��WR����+���h+@�k
�����{�������bK��k^�g�g7�-�"�~�������$�����=��g��=��Ja��]�Ya������>�����v�\���x��k��Ve��k)�6���e����c��VA�>#���k�x2�]k��v�e�����f��v��2���b�`����kc�������De{_VPb��B;��Z�������������=�{&v�j��m�]�[�m��[���b�{Vb���6[��S�\)KT6v�m�m;N��
{l�Y�?��3���]{���e���
vMn���	������7���4����u��c����������={������y��;������>���.[��z���^g}%��rv��u�1i���v���R���>����v�}�u����,��8��g��+0��g��-k������T�m�������b���o���J�@a�������Y������9�����u����A��A�O�f[�^��v>��0v�>[�~�z6�\������^KT���1n�j���}_��;�������gv~�s��F����um?��["������
��{e�l��F��Z`�)M��fs�-�����������v�iv]l=�������o�]�YY�][�}i�&�^i�os�-���$I�v�{��ZvM`���n���:��m����}�x9�]��9��������=�{Vj��b�V�r�7oqrI�+�EiKT6�������Y;���_���c��������>+w�c�a��O�z�pj����F�c�b�O*����I�~�O��,���N;���[�����l��bO�%����}��u;����'����}O�3���}���3��a����V��a��%(�y��1;��e��+)Q���^�����1l	�vo%^��G�7`���N��������}jq���e�<j������,n��Ek]��m]�RiLT.�w�~C����-�����=�}����c�9l{�<f�?Vu�������m�y����#����o+G�����
����E��E��gje�/�k��5�l�{��q��X����Z������.�Ub�h��A����8���:��l,�� �.2�����]p�M��Mec�X�����]�w�`}|X���cm3��\;���]��_����Q������^Z�P�.J�G��������7��]��������-o���~�V��h�U*�x�7e��k�R�'�)���l��gi���_�>�����|,�� -�.8�"���=����v�gI�������M�����m����K8���^�.��J�����n���`R%��������@t���T,���6��������eI�0�����6�{��R�}gl��=�.�m����������G����>����-�ot��
���%��K����}������>�g�a�����}o��{e���,���vn��!����h��y���]�[�g�-;g�w�
���������k�X�lm{��?�����c��G������6�f{�:k�[���{�u�
 �n�w�����������Zpl���cl;��mc|Y;W����������������([�~H���9Wo����z�����z+o���}b7��b��kV��>�-���������U�<m����?v�2��m���g��d��}��������:�3Z�7�>c[��s���X���}nVl���v|��	��g��/c���!��X|=��BY;���i�&���c�����Ol���?��w����{b��s����\���n��_��5[���m��~�����?�����%l�����_����=�wO�	]���}�2-����w���C�)[.��7l����,��E&_;n�t���|Y�)���X��m[#B�d�r��{_oL����eR�)����:����@iF\l?��^�������IO���#��O�m�s	.�b���w�����)[&���*�x���7\��Gd���X�
ol�����%���	(�����__��[w�1?��2��)k��
��(�vT�2J�����gG&*c�������@�<��V��~)Rx+����O�	{��\����-]��"�.����h���p�k�rZ0U��;]'5;��;�Z`���F�����D���J���HT.�"+WhE��Y����e,Q���w)@�r����"�{{c[�%*_ ���	(����i__���:�
U Q�N�,K�[m�o}�k�j~U�Xr�([|)�
6���$��i�
T]��+v~����������X#�T��������A%	���Y>U���x��W'�|?�n�������k����|>5��",���X\��<��o��2j�Xi{�Vk�)b��.�������O|�5���N�zw�m�����y����b�4i;_,6k�(���&�W���(S|ZI����-�,_F;oXS�v�*[�w�����Z%���vF���r������o�W�s��������,_�����P�7e3�.S� _:���GT�����{�eM��*4��R'�n����r�F,���<o����f[��@E	�-O�'� �I�#Z����nf�O�����B��3/^���q�oY������]WI-Zo]�.��hX��?��I[����u;K�V	�s�X�u�\6�����\5��ZWi�
I�?��!���e9Q��Vq�����n���>;�HD��3�5#�lY�>KTn�R�z[����h��+IE[��r��|��HIY�@��z�&����m>,nZ�������, QP�Q�(��k�}���HT����`�#Q�6G�2�m�De����9�ls$*��HT����`�#Q�6G�2�m�De����9�ls$*��HT���}6�X��4wyD�����ai����7hrH�RNAT_�
��?����K#�bTH�N	+��{"�u������Q}4�XE!i���~��O��_�#�qBH��4hRX���pUT�M	+)�SZ�4|z�-7jf86D4���[�����
)>��%I�������)QE����W��W�d�hTF����gG4uQX��*��Q���i����,�h��p��R��,�:(B����l�v�mz���U\\�M����>��s��:���u���k�������-A$����u�UW��������o���M���C���^�C=Tg�}�
��2��O�W\��?��������Hz����G����������K.QFF�RRR���{����W(���-��8���+�=�i�F����[��m�k�N���������/����&Mr������N;Ms����H�������u��w��&������_����q|H-jT)����&�4}QD���e9Q5��W��A=sN�n:2E�ET��_�\����KV�,������;��j����s�=��_�u�Z+�}���T�vm�q��1c�F�m7'�����>�L���������>�����mmY���>Xiii:���4�|7���;��CW^y�����"Qy#,x|�����/h�����6���.s�:t�?��
r-YyCF��o�Q#G�������K���dp�l=�^{�f��������K�_~�+H6�V��SO=%���k��F�~�����6a����o.�E(@y4k�,]z��.�J�|������*�Z��v�����<Pw�u����>7X�j��
�2��~��j����z�-u���U�����\��b�
�+@7n�RSS]������?e��}���P����#,\�{C���IP��V���.��A5�^� M�+�4dZX��Q��*>7�Z_^����!�^����/

{+l3VFj����M���a1�����W^y������;*,,�\���-F-���Zk���p�<��C��������g�}��y�k����VI�O�>���s�����Q��w�Kd���D������`u����s����5���~�����O���/��;�\���8p�k���'�������[KF�����k������O\����t�M���O��I\�|k��
��5����_'�p�[����]������uk����.�P�Xkn�,Y�bV+����~�a�ll�^���$�.[�L�s�n�������?_���s-.[\[�N�b��'���������[�������s�g����6�^��7�p�U�j��{���/�����4gyT�WG���!����ia-X�[��������*|�� �W.��C��SUf�Oy��m�T��_������!�`l3�ZB���YYY��5-Z��?�X��r��`{��'�e-�����v����X\��O��Z�A��������[���i-�����v���s�.�z,��bj�=��g�Q�=vh����`������4e���F�����u�c��M�6U��m]�����R��k��5r���o����reA�%@[���T�5\�����wO4{�l�+4�.��Ue�_\\���Q�F�`���J�*y�(o,^�V����=�������z��ZliqdI,��BY+�-���h;t�P�������b��.v�x�b��x�U�������W+����w�O��uP���d�R����O�A�IM�nT��z�	�m��:6
��T���NI�U��U�jS?������_����[1`�����}��>��#����*�6+C�8�b_+{5����ZO���}��9q����`�G�cW[���;x�`����xw��7��_~qe������@yF�r	,�����������v�k�dbt��6���e)KR����4�g��]�X�Z� �j�����e��&[�S�
���S�Z�\�l���
���3U�Jd����.	�E���f@�a1���|���,�������
J����bLK(������w-*[A��V�-��B��c������� �
z-f~���]������x�b\k�����.sw��$��iP�vA7��2�]����Q@����A@�
�s��R�����i�%.��ZO6��d���UP�b��X����������5c�?=M�D���b��K����,k-K����������X�N	)�n'U�E�\����se���u�W���Tl
D�]nk�X�N,p���os�Z�%����,7�^'�^��-��V��~��M�>]o���k=�^��>�i���Z`���]�j'\k��������p�V����������SO=��?��u�z���~����O?�C=�j��m�������\�@�Z k���j�Z��������.s���r�}<V8|�����������������;���*s��5]Mbk��Z���Z�^�=lA���k�����x���D�x�z����
��{�v���������7g]/�����6��s���9s���O��_|��Z�R����:=�;�%F[���Za�$�1B'�p�|�A
4�����O\����l��#oN�[nal_��`���^��XW��A����~�����������+��O��Z�����YFr46�B���BnU��jEl^l-k��m�����Ms���]7���;���)���v�Y���?��S���g�uq�Yg���Z���b��_���r[k��Xo��?�����+W�j�u�6l��
��6n��dc+��[Bs���^z�����o\�W�k�W\���;�0������~��t-�9������KB�,���9����r��u��r�JW0�����j�e��5B��K��B�s�9������lA���(Q�
f-Q�
g7�������`���7��|��g����P�jw��Q{���+,���p���hmA����~��+K^�{��.{��)�Y��J��Ri,������kQQ���,���+��&����V�j���G���|��7]��u�k� ���W�^..���:���Z�kq��w�q��X�y�����O��{����z�X��ot��X���xe�%�6F�a� �=++KQTP�?�]�v\�KJ��yPA���� ��S�:e�$�'��?G�����i�eTTF������~Id�����FU��o�/3�%&O�S9�?������I�U��WJj��*��D��\)��KB�V�����:��B\�e,�w��������^�*�ZE��IT��cn�a*���I7=nC���r�!�5��GI���������Ly��qV�����we��n+����-+��xzC=K�������j��U���%,Q���>|��Mj���Dk��V i���"p������{��a��E���;\`��K��[w����vZA��X��O?�����xW����.�y|���=Z��r��IkI�)))n��I�\KS`7h�@}����_���>���������0���o�1���g7l�����Zb��;s�L]w�u�["[�u-d5z7���}$*�VX�����
��Zi*��J�C�u-[|k��Z�f���t��y,��osZJ��,f���*�^�K7U(j�������/_��-���+��iq_��N9�������+`}��w]a��Z�V�%����/�@�*����
��
V`����N�{m�?���������jT��n�Y����9�����1U�������r_yV�vWr�����cG)�d�
�R���u���������
����3�Wh�T���V4/O)��)��(�S���G|��Qj���=���k��UT���\�E�c����vZ�h
FY<z������>ss_~�eW��XS��{����O��������3��TR\ke�V�jq�U�}���\�u�c�=���/'�������U��Z+s���l�x����d��b�3�����+n��x�'*[���Q����Oj��q����x�%����k��y.A�y���j�Z������ke9�����/�tAy��������Z <a��Z�k�@{��Z
�����_�u�c����7wI��m���{wS����+�e��ek������m���e�}�6+���fk9��c�u���Us���<��������o?�P���]�����Wj���T��Y3�ZR���Vq�����Z��6�|�=Y�?r�H�~������;�t���r���rV�j�����X��I'��b�s�=�U������x��}F[�U������>�
�-�����y<���O��z���Z�B�����cCZ�U�6AU��nX������N�3�
)�y��ql������+��3��;�c���f[��}Q���v-.|��|i�*9Li��$_��M��H�j���S���U���v�X��%	["u�m���V�l�>]t�E.��n���-N���V�|�5���dq������il7�Z9�����{�V�������%)[k�V~�6K���s��.����K]�U��l��VFl��}�7��
�%�ZA����?�Z79����8|��W��3�p��w�}��&�j;u���-����D� �Z�����,��u���k��\BV3�M�6����T+����?~��6m��I]�%�>��L6�>��c��������[A��d6V��j���������l7
�����2�-��m*..v��;��3�,����X+$��Z�P���o��7;Z��+����>�H�\r�k��z����*�&������+S��IDAT<��k=�*�Z���������=����g��u_��cG�����
emYc�����Z\�6�}��^�Z���[�k��u3l��]K���Q��[�>Q���/����O5lz�[B
G���������p�J=�h�����6[���B3�)�������2�P�A#%��N����b�����;x�s�we-�������\9>X�o�&M\�MVnk�km��Q��W��l��Z#Y��������f7�Z�k	�V�k�������~s�-i��K�%+����m�%2[�k���+��Dj(owZ�J��tV;�ZH�V�,�������dW8im<33S�k�v�;Ypi-[������C+��������j[�q��=���6-]��u#d-?Y��ud���[2������wk����ZQ�������[�o�3w���uYd�{���4d��Z����kMy����7���+u��g�Dj�vk��
��&�u+4c�]q�n�PV�1�Ul��0�*�Z<hq�%�ZkRZ<k��%�Z�@VY�zu�j�J��z�:t�������Q{~�X����������'Ov�Y�6,Y��U���Z�z��g���Z��+�}������D��[o�
�����Red����e��Zlj���U@�X~mvo�Z����,Q��Z����^+���O�~���l?b��V������$���I��:�}[U���d�j���K@��5�("����/��e7[��g�1b�c�������*1Tyo����_Qh�$E��VR��*��R������+�����Q�V�RR�eq������jm�������U��W��e,����pke�����Q#������$O��$b+��T\k�g�����W_}���Dn���~�U��%R�>��k�o���>����a*++>������<�����k���(����N�-�����y�'2IyC���j�Zam�n�\�k�h������m��Z�B�db{����B]H� ��]w�U��
s	���l��X�q|��l��u�k�����������~�R���I�\�k�=�]�%|�������r�������(�vd�n<��V���P�������,�5VHk��ZA�iKL^{�U����-������������V�z��J�?���+����V�6�bT�*Ut�a��B`k������?�
��g�1w�\������*2�kZ���
��'"�A��Bsf����U4�'~����MQt�J�-P�^)Ux�L%�i��v�~���pF/����~��
����f-����hv�
>����4w�5;���������v���J���`���[�Om?[2�5&ee���b�n�fY�k��������|x��1���?\��%)[Y�����:�ufk�*��l��
��^�v��7�xx��������	b������j�*Wh�6"�P�
K�O��oV	�Z�-M,�-**r-"��
pi��
E�	s�Z��<��R��~���W/�-@\(����������Z������j�����:��s]W<V����V�k�$=��������j�i/����q��w~+���BZUB�r�L�N�+I{6
*��`3���v��Yz����k�]B��%�;�[n���������]��%%%i��wW��]�c�JS���8e]�~���:�����Q�u�mMII�ATbW�(��/���7��_�M(������UH���y�k�UB�C������_|Q�]w��w�N�[�f+M�K�,�~���+��B]t�7;����O��d)��������T9�{�����V^k=�����d[M���4U�RE���$)�,�i��]v�����fu�����`�����n�k�����@ ��-[�Z�j<x�rrr�9�-V�g�������t�R%��"�2���,#�$�/xn��3k��Qz������?��+V��N��Vk��3��%�\�W�������]w���;���,��������V�N��Q��n\���/��JV7���g�)3��e���P^%$��\����k����]��j���
*� 7>���*))�{�SAA�F����b
:T_}�����������N�-��v��4eAD�}_��>-\gx>6���2J7�Z@"%�E���B!�������t��uj������vn���as�Gt��Z�[����
>=qf��UY�^|$������^�MX�W9K��$Zg@9A\(���l�����&M��3f(��Q�Fj���v�}weeeyK���V�k���4m�4�X�����[������Wrr��$��7������o�7������_s����V����h�O����������q���W��Mv^����*a��X���t��W��g�q������|�M]~��z����r�JoiJ�9s���[n�����;��S>���=�\�v�i���oUT��dN�,Z�*�=���������
�Y�C���l������zci�������HH�����>}��{�=5o�\<��{�1=�����)����?�\����[����V�l;t�PW���/����w�r-�}���4o�<oi`�������DY8_���5J-)<k�7 Q,�}��W�k	��D�p8�3f���@g�y��w���u��f����������Q#
>\�����(}V�^�Z��X����R�����U+v�a�����.w����/PnE��n�;[&�H�Z@"%�EeKR��\����u_6==]+VTvv�Kj���
�V���];%%%yS�%Y�j����U�����������!!���@@�j�R~~�&L����bo��$����k��Ij���RRR�9�>V��z	���_����M]����)S�d�W��~%]J�k���C\H���1����j�fdd���o��Z�h�_�l���}]{������e�]��5kz�`�#F�S�N�������
o_}�U-\�Ps������
x�x�
��|�I'���P��X������R�O�����$�7�|��b�gc���[��T\����:��S�@��J=��7���k�U���V�VM�{���'�����Ng�}��?�x�����m����#��U�V���^�^p����ou�W���/�C=������5jxKP�����'D$q-)��=[EEE�_��j���@ �-������/��+


\�S�V�r�njj��o�� �Ye�w�����7V��Y>�=;M����s���0�B�X�z�	���R��QN��*��7�d�{uS�=�zc����P^m�������{�i���8q��*���^�'�|��7�.����K�����k�a��)�x������
o��u�k��nRR��A�Z��T��rss�^������(\��T��z�����W3��H?�����Y��s�x4����?��O{i�����?U8v�����3��^c�N���?�A�������%��L@��]�srr��3��������#��c���{�-qx����?�V�(-�U����N�z���t�R���S:t(q����[����F\J��`�rC�zn�;ug�����!�j~�b
]8f��������e��k=����5/w���s����J��*�?���Z�����C�������V@y���x��9K:>|��&�f���6m�������
j���v�e����E����g�vp;v�����k������XkT]�tq1.]��=��+V���D]7���g�)3�|}�}�����z�	���R��QN��*��7�d�{uS�=�zc�����F9�y�x��/���L����0g�V�����;��L��2�]O���O��Fi���t|���h�������3tJ�����o��)�d|~��`UK��^
P^m�D�M	�B�;w�Kd��������3�������
x���+�E�E�����l=�ZP��i��	�t�"������QK'h�j������u��]������0�w�]6E�6��p4����Q��3c��i-�T���Z��\O�V��T�x�Z�i��m��z�O�2������+��R�����u��g�m��j������:�Z��[�����P�~��~��g�s�SO=����KGy���b`J+�Z07g�>����W���kw��e�5d�h}8�k�;�9��h����
��n������tF�#U�b-�Z2Qg
�5��=o�����[��c�Z�� oIl�u4;{�r�K��P>$,Qy��i����KV�D"������_���.S�����7�|���4{��u�Ygi��a���?t��w����/��>������PY����o5��*#)M�p�K6>�IO]��$�?�9=��vu����?1�u�?�+
����{x��t�g(-���Zo�|D{���3Z�z�t�.�}�������|O��B����_	IT��3f���������.]����������/�����;v�


�gP������O>���^��/���>�����?�X�����V��b`*�J#�k�5e�Z��$�Nhz��>�e�p��:�a7o�T=����Z�J��;]������^��'��a'�o�yE�7��--���j���[������c_����UJ ��
(���lAlnn�RSSU�F
-Y�D�G��>�����,�Aeff*
�J���-\��U������i�Fu��u�IIIZ�j��M�����H	IT����R��KV:t����K�x��.��4i����j����eJ���U�\Y�g���i�4u�T���~JNNvsW�\�
v�W!J�Z@"%,Q�E�j���^x�=��c����:w��]�VXX�ZX���V+V�������[��~����u�Ai������\��&M��X�����H	�.k����/�\7�t�zm�Q��KL�������>���n���jVP{�5�����R��m��_?�7���,�����F���DJX�r p5o�>�h�p�	j������l�2��������RSS��(����t�W��w�U���UPP���<���{�A�S�R���(	�0������k��VC�����u�Yg�V���sO]��Z�j��4���������k��a.�}��gt��G�����_|�
x(��k���D�i�����������P(��~�I��_�K/�T?������E�Q��>�����z��������������a����}��7��_yKP��)!������3�����O����_�������/��Bu��Ec���v.�T�����+�v�i.�<x�*U��z����]e�H$�=��`e^To�Z���(�M��D��"��C���
���/X���w4tZX�Et�[z��"-���>v,�kH\6���
Y8Z?������?4s�<��\/6-!��V+7''G����Y���,Y�1c�h�}�QVV�v333U\\L���R���P����0�*��7N-Z�P�Z�\l[�bEW	��[jq�2=0��^����C�T�EB�`����^�[6�M[Y�Z��zU�}v��.�����������o�_�������z��"-\����u��WF��oE��"[n�����}�����w�C�ebH���Z�O�'���!���	���`s��t�N��Z���^]����~@�}}�^���������,!��~�_U�Tq]
:��<�p�Bp��&��I�\k���WwI��V������8e1��)S��gO�Z�SV9�b`����v�I�u����Y�QK&*����+��\�%������jP����.�~�:�C�]]2����W~��[���d�n=&EGt�>o��N�_7��6����L�+��IM��W��>1�e]����%����ul<5�[H0�kk��A\6��1ohQ�Rol]v����~�e+�)�,a��-[�T��M��/���S�����sg�\��M�Z�{�������gP�T�PAG}�^{�5]s�5n���������/+##����x�"��.i{������uo�4�TW��z��k���P2a�t-�_����>�.��)���W����k��{(-�����Ku���3�o���2��z��T��:����-�h����4�X��`s�[>�{T���������d	�k]]~������u�w����r-PYb���|����C���R���3�<���_|�z�!5i�D�@@�������Z��[�[�������	M{�mN��eS��uN�c��JSUL�����QoO�\y��YH����j[?�ZO���SF�4{YDWF�Hb-�������x��`s�#��l�9����%*[`k�����?\u��q��Z��N8�������-
@�U�re�x�����K��[7W	733��v��Q�`�[����KF^��T���J	$)5���9�����2����,���������65���/����;��Va�tp��R�}�����U5��1����JJ
Pa;q- Q��lf�����f��������K.t�����p�6��a�������T�F
��__c����?���g{K��7�U���QA����Fj0Y������}�k=��v9P��3���.:��~j��HO�~C�W�V������-����$+%����t���nzjl��=���.YgaR|����zl�kY�����U��Z[~��4��H��9`]���DHXq��E������~�QG���E"%'�)�y��G�������f��w����]a��4�����?�\��s����-e�/�Y��Nkq����:��>zj��\k�6\��L���T���6U���C�w�������a�}�����yY/p�*�T��b[Y�
����l�64c����(	IT������k��9���{��W/edd�y��U���?��M����WQQ�]fPX���SO�E����/��s��b��j������.��;W�&MR4��@�A\H��$*��a-Y������Q#�����%-��[W��-Sqq�7��g����2�)����
zS�@ �
y�W���[
t�q- ���l��*TPaa�/^�ZX�����g���J�*�n�(���6))I+V�����Z����VQ����Z�[�k���De�}[�fM���;���_���������u���j��y�c�=\a/�U�����];=���1b��-LYa��_���
��7!J�k��iC\H��D�>��ut�9�(''G�����3t�����n����u�Ei�=�$��j�^s�5JOO����:H�'OV��=��o_�v�ij����4��V�F5}QDs�ETP�M����c��/�helS���X�l8"-�M���<'�=�$q- �w�x���5j�k���o����sg�n�Zg�u�.��Bu��M��J�h~�
��T����h�p%���Hn�r�|@�_|�(�
�o(�?��/>D����aC�SO�P���~�
������V���[_�*����M��:u����x)))�7++Ku��Q�����iS]y��:��c����-���&O{c%����a�%)5��M)l������5���"(�h�0��N����~CR����,�d��*���a��QZ�Ou���F�����������$����5+�����x����_�
)��BZ�U��w+�(��c;���Z�J\6����{�6�����~�����B4���*���3���QQ��4O����Y�\�j�������T<r������a�*VRh�x7-^N_F~���2�����!!��c�O?��K/�T,p�����%�\��>X�������t	���#���j��T��*5\��u�~��
��[f�[6Z��������+e�T8�'��@���i�s�id�\��TU���+4k���Rx�L�|������#�<������o��/�����~��Z3�WF�`ET�H������P8v
Y3�CC�������������Z�2��PT�k�a�����mJH�Ek�`�!��1�����+.�>E�_����*����,v�B��N8������r��������*���(
��W����U<�O�1D���x��k��r!!���hT��/wAo�
\wB�`P����[I�R)�����>Q�:u��KN�����k;�5��b%Ess����\�7�����j�F��y�@�`�|�Y
M�����P$�Z���:u����"''G�~��V�^�MP�Y����{���P~�����B�41�������iU~�:XP��5���~�c��b?������z��"�op	�����u�%25:��;'�����Ku�����Q�/�/�Z�KNV��=�v��Jn�A��U
/^(j���;Y���i�����K��Yi��,_����*�o�V�)���#
M�H�j|���j���|H���@ �&M�(����3f�&O���0u�T-Y��-����K������h����|>�6P��q�y���5j�W1S��?�Jw>$_z�+g)�|�KX�
��s������]�\ V�h��Y��|������*s���n��@/�X��cC����/F�t����bT�%���R��"��.�"��k����	�"��&��J��9a����ve��h�n����0��}�u��*v:�n\X�>��O��������F����~�ne�}H)��hN���P�5N��.E������.YyM�U�����VS�7���/)P���?zGi���L�]O)��&y�FB�-�877WK�.�C=�<P=z��A��p�G���_VA���#��j��R�T��;�����~�E��TEV����\W=���_,`��c�h��?ZFc����`�v�t�c��ld�2��&�W4?O�����}M�E�:���Z������O>�j���V�Z�]���C��-��_P�DQ�X�N�B'}u�N�����
'|�[�}w�����-�D3;��3c�}%4�l�l��SC�/�y[U���Wq(��&�\brZ�_�VE�]U~QT�s�y���X�*���D����&��m]/�����Y�5�)_�3��`�!��Q������w��uw(����KM��b��"E���M��/h��&����c+v7�c�V�����%��i�I�\cW��~�����/>�M'�(w�x��+x���:v��j����n�:tp�7n�Z`����W�O�)4y���*���5k�h�O����\��������C3��Yv���U��R�KV�,��hn��;vq�o�9��RU��+�����.M�����*�o#F�P�N������H�G�V�����m[�w��E�����+������#<y���VJ���������?��Ku�����`�7e]6}���:r���)����?���_�Z������:��S2�
I=��7V������b�c����eGHK��r���
�B�O{5h����c����k���f.�h��A�oP�t���Qr���w*#��U�.�yyNT����w��jg%�}��!�e�����m��
�U����1;�hA�����5>Y4�%)'u���Q#�3[�����['�g��?#�5dU<v���f+��[���oc��P��aJj�J���(���@���8��n�����-�Nz��������)4�O���&_�JJ��]
GT4t�"�@2�ek��VWx�,pF�/U���]w?�;K��J#��)�����u�;��,]�������w��B����_�~����1`��n\���/��JV7���g�)3}��_��.��.o�dI��~;�=ol����0�B�X�z�	���R\���~}U0�oN������{�����9^�W�����\2/�/�ZPu���G����h���1;�hT��T<n�{��['��P��I
M�{\]Imws��VF�KJR��	�X�`��
6k����.!�����.����5�����1
����]��f����l���1C�Vaa�7��RRR\
]����A�`��T�k-O���*((���[0t�P��Y��������<d�(���>ol������h�!Q��J�������E$*���$*�B!}������[5g���\�B��~egg{KY�j~����sg�u�]j���/�T�.^�X��������M)����]w����o*J;�7�D�#Q����E$*��5}.ogV�v��v�>�����?��
:�
��W�^���S'}��z���5k�,=�������P�zu��������^y�-]�T���.�=��u��k��Q�������o���?V��Y,���i�Z@y����:��u��k�o��Z��T�
~H�}}�n��fg����F4|�����;c�^�c��*���#_���e�1�y9������)����{��kuQ�{>���$*[����kM�����~���5j�Z�jj���.��R��][C�Q�=t���k����6/�I~~��q�t�I:���U�re����C������l�27\u�U:��#���?SPjX\��O������tU�sts���0o�F.��z
xh��U--Kr��
9�HXSV��A
��u{��eSb�]��P����
��PS�V�VNq����V��
�5�=l\��W�X�~�������HMMu��y�TXX�Z�j�`�P�X+S���S�_]�fdd��
t�~��6m���P(�-��eq�����k���MV�����z��Un��U����_���B��^��3�5�X[#�����V�����VM���6��,\��k�����a����\IUR+�m���+�
IH��������<x��>�\������0a���������������t��E�J�T�^=����%K��R8���#�h�"��Y�����2nrr��;q-�<��a�����%���Z��X��$����2S2�4�K\���u�&�
��=� �����*��z{���ge�W�*M�{�6
����|����>};�7��@I����uku��Yo������^=��3z��g��������S��U��{w�1B�~��[�������;�k��F�����k/�u�Y����u���m��Q�&Mt�E���>����@i`1��W_M\(�\:E���c�P�
�5y�LEc�[d���/�UE�n<
���sU%���f6p	����)7����)%�����T.����U#����U��mO����k��%$Q�T�VM�z��y�����W����������c���#���7��f�����>�h�,-*J#+�0`���m�Z����_\�AV�O�>�X���|��_?����{�q-���p��-����Wg}s���WWJ IW
�_K������F-���
��������}�W��:��>��^M7����d�W�������#w�_���#�������Vm���@�|��qB�B!���ud��%���k+55U�)�������$�������(4m�"�V�����_���������f�X���^����fgg���@U�TQ0�����n\���/��JV7���g�)3}����`�z�r�7�a�O��{����_�?!o�d=�u�Q)�w!�__���S����)��G�����aMX>]����JJ�:����mbl~^�@��r]pNY1S~�O���W���Us��rC5�T/6}���/m�Kib7W�D5kYD���������_Y|��(/�k@Y���N�m�S����jw���'��3Y���B�)1���Y
6h$_�o"�����l,�}��w]k�7�|�j�����LW3w���.1�����IR����y�~�!e?r�r�}l�����~����O����%������5K�?��n��=����;w��|�M7���(w�>���fg/��3��eS�9k,�[�W'|�Og|������_5c���p�>����������C5y�_�d��LlO���z��"=�e�P���hl��[������Z�E��_��De?z�z�}�y�~���H�����(����z�j=������[4o�<M�2��������~����N�&M��PV�>XE�������%��X�ysT���*�4�[�yL�:U��{��s�
��?����O<���������{K����,Pj0E��8R���$��H4���
W���J�U.�
��Vg���M4?w����W����}��O��V�{6��_&��������he^t������'n��nl?VVK\`kD�
����*7fM����+�+��4|��Bsg{�@y��De��;q�D
4H��~��}�Y��Y���W��^{�5E"}���
��8�R/0��Wyc��,^��S`gb1��?����8�
u+V������;���#\l�����s����HRz0U�H��#M\>CK�Wj�m�����VE5����A������G��V�����^F-����f��'����9a�������������X���#���*k�Z�������Z����KH�r8��������:��q>�Ou��Q���]7B����e�&
�(��N�Z����?t�y�i�]vQ p�����5j����)�����
��{Q�X��B|kng��i��1��VY+
W)�(W��L������~����/��?QA�H�b��������\�w�|����|����'��7���ZKF&��U\���!<	+����\R��EEE*((PJJ���PJ1�m�����m��
�Z`����s�����/]��*����Sc�4�S5i��8w�ff�����&���4j�DUK�Rq�Xi�u�����|p�}��&Q������!!Y��6h�������4�|��r~~��M��w�yG���W�6m�im�����m���^�u�5����*����/Z�r�����
~�w�����&�jZe�`o���\���2��uj��u���������tz�#t�.�rJ%��X['5;D�)��l����R}�l�Uc����nJ��x�����v���"!����h�B�v�~��'���W�f��#�<�k��V�>����{o����.���*))I]t�����SO=U\p��O��N8A�=���w��b`
t�m#�h���t|�����J
�h�j���JSo	�FzU�br������69(6�P��u�%$�;�G�vn^�����@�cq����?�Z@B$$Q�ddd�����u�]����_��u���K��I������+U�V-oiJ���;���:��CUXX�*U����V!��[��(��kX��U�5i��u��P�7�	IT�F�=z������	���+���������-����N:���eB(�o��?���:u�k����~�!����7�����7�|�=&��g���_��I_]�S^�3��~��������OU.���FB�����M��Q�F��e��[�n]5j�������V�r���
��Pv�����l�7e�f���MY�%(:�;�Y:���FB��~�j�����O�����k���f���j�������+W�
����������roq�r-/X�ZV���������[#!��&�r��g�����O��z��8������;O����Kb��*,,�����3��G�������g����>X?���"���J�Z�G�MR6��B��yc`k$$Q�j�.]������Keee)''�u+��@�2���B.�MMM��E�4{��u��J-�ksss�k����
����	IT�����?�P,q�����?�|PZU�VM�������S�����������N��r-	�0\�������G\���n��e�	D�(s,!y����p�7zc��zc�?���j������QHT@������/=8�������{_���3<:�U�����|��`����������A�2��P$�a��i����qI���������\�?��`�7���(S������P4���lA�"�v�R�����% ns�$q�	`�*���V���#��_).��NJ3��;k�,}��G�/re	q-`{�����N�4I�^z��~�mzs(;,�=z������]@YB\��k�����-Sqq�7�d�5�
7��C=T����T����}��Wo����k������a�&*ggg�����	4y�d}��WZ�r�7w
pk�����;N�:uR0����E"���O����5{�l��a-]��_�r-����R�v��_
t�q-`G�����������4r�H�������O�b�
o.e����3G�W����3]�R�v��ViwS=�H������q- !�k�rFF�4h�{��W��z�KT>����k�
x��y���@ia-H��QC3f��w��>}�h���z���\���`1��q��F�5����.X�����5Q9==]�=��:� U�RE����S��6l�����BP�X���}{]}���[��rss]��yyy��������B!
t�q-`G�������o�����+��{w=��z����5����:���\23�Iff�N8��s�=���;��U+]u�Uz����5�}��j������r���k;JB��@ ���$��+WzS(;,�����5k�����g�Z�j��V�����Y;���e�-&�m?���4s�Lo��M�>]g�q����v�����������k�1B����*T���w�]C����1m�4�����u�9���?��#��p���`�[;���e!��}	IT���,A���e�p�%�V�R�T�����.������W\�g�yF3f�p]���
Y�d�n��W`��#���.p	����%�?��S'�t��W����{���u��G����w�d��U�9���������^x������5j�=�P����i������������CB�������+))I|���A�i���C�q�:Y`@ie-���nz��W��[o���?�'�|����_h��y;���Z4����t������������{L��/w1y(��\�w�}���'�D���;Ow�u�n��f���_�&Mr���KR~��g]+����kW=����������]�'�|�7n��:�%>[�%y���j���Kd$VY�k;��$*[k]����_z���t����w����\s�>���u%@ib�O�8Q_~��z�����>{����/����wh���ld1�����KWq���i�]vQ�F�4z���o����U6�$b{�
��ww���}/\�P����9���]�=�R�J:���4v�X��3�M���s��m�66�
��r�����|@������HH��HZ!�u5k]�Z�L���UW]��p���k�}�u���V��k-�����a�5�Z������}�����;��Vd-����j��o����1c�������Yk���l���\���e����h��j���:��V�Z�����Y�T�Z5��Q���e�?���6l�@ ��}���c�U�f��g�,����GB��%+�<���t��g�8�z����������,JK��V���mI��{�������]KD�{�8;55�%["sI-c�t{�-o
�X!v�*UTPP���r+V���Q�fM����V����t�m����w�	����?_C�q��v�,���WF�x#P�����s�E�g��U���;����_v�����+�|��u��'�s���@���!���7�o�_���O������_?]x�����g���*�W_}�Z
���������~�Mt�4h�C�[K&~�����=��Sj����n	�<����������\���g��~���c�=t���*99�M_�|�N;�4��V���u�1�����s�5n���:��C��s���������������<���d�[������������>p��B!o���Wi��s�7�a5���@h�l�����bs#��f��A$�>7}+&�+�)�zXsw/��nX����G������b[o�d��*k^?�E":,{���_��)���
z-��{��=��}S(���,��?���UX�7�����%����l�/��[r��&b�eS�n���[r���f6���}�mN�r��
)���{���7�����=N
�������p������f3l�}c���+�����"�����5;f�H	��O���>�}��~��}c���W��~�m����9f��g6���}c6����/��������o���kcbG{l��lL�&�����s���<�)v��������>��e�3��]����9fb{q3�O��1�������y��7����x� ���{��7�G�q-�����u��g5u�,o��e$��w�3ul����'��o��;O�{�����P�������)�j�e��<����yc(����r�J=��#z��\`�z�j�����d������/���m7^��t!Q�P�
t�
�o��%����i���.q�Z���;����\���v���+.��o��j����n��-������:33�M�+,,��G���������g��SNq	���u��G�g�}v�������-c]|����5,q�*+���/.A�����eke��}��g�V����:t����Hd�f$�5Va�]��
�X����/T��a���E��U����+d�b��Jo��#nujO�0#��u6��]}�����iu�#�GWi��J�F��0Wu���%[L���5�aV�[�G���
������������Va����OUglNR�����Kd�����M��1���)�U�����e��Oo��]���h�����_\��������F�z-v��=����8�������3��S�T�zV���>
c����+yc��nT�2V+y�
%���Z��)YQ�*n��=������������FZX�TCW���nX��j�����>�5r^o�d��K�|UH�3#�)�d�7g�
:��p�Z���J�����a�2�\oL���I�ac*%eh���������T�k��t�]���!u���������?���5Tn���+UV�7��'{sJ��kE�3�c;f���������B%oF���ZY���S�]��"��U�����Q�������;vQA��J
�R�����Vh��������-��H�7�d�]����d�%�Nm�3v��.Y������
��y���V4B��ac��,��vS�jiVh�F/������U�Rj`�T0�x�0��������=��J[\k1�M7�Tj�Z�D�M#Q@IHT��JH����<ZkL'�|��5k�������������k��a���/��u7�l Q�P�
t���\auAA�n��v�X�B]t��#F���-��k��;��)K������dK��b�������f������]a��.����5����Bi��{������Z{���z���ZF�8��_�����t�]w��o��;1:���7%k���c�u�`�
l��i�t�	'��?T�6�7	n{(2H�n��+�?��*?��u�)2�FE���}Hn%��ZO�]����>���!<����Gzc%���D��}�@�7�l���%:�Y����9N��U�(����h�!F��/�ys6l�������9���W>����nh��m�@*\�oH�x)����7�������UK��WG���m+r���/_��7~K������M���LT�#�(4c�7�d�g]�
���������n��z���CWz���a���������mC��u�O��L���9i���Sn������)�p�_�zMU��^%�i���o}�7g���Y_�q���������rC�����������D��E0z��V�j��'��`����Y��D���OT����q�;�lTJm��v���cgc�m�C�w;SIO>�/�,��E��x��V��R���:a�5��%=�Tv���>O)����.�B�1�zS7�W�p��9�t���he��+�w��S�S��1���b�6�Xv�J>�zt�����h��ZuSoo��U�nMe�������xC�w��*��T������n��7g��<�EUO������9^�Y��tv�5�8^�Q���������D�M#Q@IHT�������:h��y��X+t\;���Z�j�y���;w��(����Q�F��SOU�-�i���Z/AU�T��%K\"��b��M�4q�Y�a��m{��,���C�.F/���l1���c�sl���M���]o	���l�+�������S'��W�M���������
�n���d����~�R������jH�M����I���b��Kk�=*[��S]��\�R�Jje5�X�+Yr I�Vm������c����2���%_��K�E���)uk�EI�;~�{#�O�����Y�f�_�M��d������-?6�xI�xA�aq����Ku\�y$$Q��@��������8==����(�,n���U�V��\k�-)�K���v�e���C�?�����*�"�\��u�j���s�999���#�<�%0���aC���[�<��.��2�����d-%[���/��U6>�����O���N��a�t��7+##��'���������l�m�U�����d���z�����f�|���!�����I�')-���i���J�����r��n6q���%U�FP�UH��j���<�Y�K,��xA)QV�Z��!!Y�V�i�)))���/\�������?��/����'�}��nJ���L�"�u������V�,�]�h����K-_��%�����������Ku�}�i���z��g\��C=�w��m���U�z��������o_����o���-������j�J�~������bz+�����sg7mc��q�r���O����������%<��Y�e���Un�=*��J0��NQNX\k���=��]Z�e��Mu�q����Pt������[\A��o���={���x��U����+]���M�
7��y����k������c�=�����%����K#F���q���SO���8���O���+j���={l-%�;�����{�{�k���?��#M�8�d��G��X����.�F���J�����4r�H}���j���7��!5�����$��$�����Uz0U~*]	S��Z@����`+�<��#\�y�����>�M;�����K/�V��U��-
@��������o�Q'�t����ju��]��{��8�U�P�[�E�*(5����-����G��/����	V���7�������
�Hm��!�$DB��X@��S'��c�=������|�nf(�7��-[�V��P���n�u�]��?\�R�����mCI42;�Z@�$4Q9''G/���Z�j���,U�Z�u�j5s�/_�-@��F5z�hw�q�]���o��{o
0@�P�[
��6�[{z�;��ZR��7�m��PSA���"�$J��/^��o��
��7w-)[�\����+���K/���s��(�~��Gs�1�<y�Z�n�z*,,T�����#�����>��
�o���,P����zce��������>����Z@�$$Q9�h��q�V��w��O>�������}�]����Z�p����O
]@�VPP�'�|R��w����A����~����u�
7��o�u1��Nk�o��#�SR�6
���&)9>4h�������n^���V"�$R���/_��+�}��JKK���6��W��-��];��7OEEE�J���Wk��i���:u�xS���dx���Q�����O�.���WP��*��[T���=\w���w����k�O�N\H��$*[2������5k�:���.Y�D��-S��
��������P������*�Z�������8++K>ZDP_r����(�cg%u����}G�k�����k���G\H��$*[[�vm����K/�����?���C���7���7������o���^{�5�����V�Z�����
t���.}��z����������1Cw�}���j���E��a����B(5,����;�k	��D�p8�I�&��o��O?��GyD����t�y��$�/��BS�L�/���m�����.]�����z:��s4z�h����U��\��:v�����N�����{���-[�u������\�T��UO���@�7V�F�z�P^Y\{����"!��V�v�}�u	�'N���#5p�@7>x�`M�:U����o���_��
7h��[�CFF�n��6W	wS�C=��N;M)))��`��[���m�C�S*�����?��5uv�c�)(��k���De����j���v�e��,I9))�[�CZZ�+�=���79���K���?�-��H���V��������Zg�r�stc���A7oi�W���DJH�2�-��\�*I�Lo��UI�T���tz�#uF���Nnv�������AoI���De��e��@���2J��?���)��7��#Q���y
/����y��{Sc�QEV,Sx�E�,v�E/t�nX�@��lE�.Ux�
)��|Y��ot��������,�}��;<Q9+�xc�M���.�-,P�_+�__�<��
|j7�������}�Y����r^zZ��~T�g*����������o(��b��U��i
/^[gT��C���n=(���h����^`[#�l	MT^�t�~��'��=[�PH����z�����{��o�u�(���v��a�0a��e���K]s�5���{5v�X*�[e���|�eEd�J�Zr��g*��+T<~��y�n^��H)���7������-Q��.V�[�S���+�c���/=]���fLS�����3_��\��eORPj^k��zf�O-j�1�����(	KT^�d�����[n��������w��?���
?��F��-
@���������~��GM�4I7�x���?�X�>��,X�-	`s���{�6"�Nl��7R��d_Z��U�J����5�������Rd�R���R�E+��w-.�AI��*�m��8\i������Jj�^�J�������	��d��W�cl�Tr�E�����1�'�K��R����OjT���HV�LZT�W����k	��De�qk������O>Y{������<����z���������Y�V�@)eq�k����]���3�p=Y��>�@/����u�N��h4�=�����\��z�X	*v�������	�S��AZzle?��%*;v>���"���HN��^}N)]�W�Q��Sx�_��^�`�6�5�`��
M/����s�V�w��K����h�W�.���1)���b�v�����_w��{���5��^����N�Am�H2>(�,�}����k	��D�p8�j�V�XQ��w���sI��:uR���Q#�h�B�-r]PZ�Z�J��O�a��@ �#F�e��n�S��*T��
x�&�Bi���<\�O���Mk
7��=�`�������p���W7U��;U���b'	O�����d��|��Z�����~�.%��]�
n<ZX���)�{���$c�fLU�Qj��-���Z�"����RS��+?X[���5?w��B�9k+���(o��"�*
��ssjE�j���0o��/Sx�$jlw>_�8	J�)>UXoHK�����'�Z@"%���%&'%%�$���W�ZX�������rss5�|%''�e(�,�MKK��+4w�\M�2�������+W�����[`+����_�b����pWl�%RZco���_�����W���T<r��O8M���T4|������YY��~T�+������,��@�zJj��[C�|���Rb�4h���EC��U�[y��������/�������:�J8�����������4t�=6�U=1�
=:�
�������E-�]��+g��e���k���De����I�������{�9��l�	������?���c��uk��hV;��rk�y��A:t�kz�Z����M2d����������s,�3f�{���Z�^��${�l�2Ws��>|��.]��2��=z�h7�n��
�m��34o�<j9�v`�Y<������;�t�Lr�!�����^SAA��9�]�����-Z+��kU��[l�J�]�(���J��}l�m�t�}nH?�t6V��'����� &j�|��gUU��z+��3���[wP�BM^��Ni~�.js�F/���O�����.Q9+������b���Ewt�L�HX3V�Q�`���A
Y0Z��LX'�;���Z�W�}��n���x��z��g\Y��e�EEE�������
7������n��?����9�>��f������5���O����>�9s������^z�%�m��V���o���mqq�7�����l����f���|/��5o����}��>�`p�.�yG
�����?t��7���/vA����?�u�]7n�������w�.��"]{�����K��o���
��dTmY{N�^�\�o]+���=�����_�[���v�Maa�����;��C�=��n��V���m�Z ���?���������_�*�Zv�UW�c�����v��g�q��5kF�2��,���������-���O"�%��
U)��j�WQ�P�%6KE�b�<o���j����*�\bs����\-��U������w����Qo�S���s++q�%N[9���Z��5���+���`K ��Q+����_\��5�d��=��+��X��%_z��z���\r�'�|�s�9G��M��XS|����Yk|����e+�5yyyz�����O?��e�-Y9���5N��O�m��R,�R�"�
*��Ot�)����.Y���R��K����V�Z��;���(�|�r�v�m�V��W_��S��_�~.h����q�Z��=�����G��,�F�%��7���/t��G���fkU����vA���K2�@�o��.@�����m���]�|�����X�N��j6[ma{}��{�������7n���/���U����P�z��������Ovq�g��]���S���~)E����tX�t�������g	k��6n���G�v�1_l9�k99���(�
I�jT���d/T��j:��u��'�$����S+�q�]�N�0At��V�|�}��r�xy���Zr�������r]k����|��fKj���m�#�5���Z�Po���[�<��ke�V�kI��Z�0me����;����c	��C�a����:���Z]V�l�a�LNNv
v����`GJh�M�,p4h��,������\���?�\#F������b��_��j
u�Qj���k	��-1��'O��Z1>���u�q�i���r-[���o��D��Y�_KJ�V��<�L�����5�k��i[���O=�Tu����?��C]0=�|7�������,u����l�De�n������K`lV�i-3Yg��������l�#��]�����N:9����h�R�h?}yT?���Ve�d��������J
$)�hQ�R�\=O?��3��^�����|��P�F-��QK'h�����ZY�V�R����]���Z�&�hy���ka�����[����m������k���U+W�j�b���h�]vqI����x����g���Q,[�C�j���+����������O]Y�-_�������}`�����g���z��k�n����nk`��azz��W��`0��U��dg�n�Q�����.�v(���l]�<��S:���\K�7�|�:�����W_�d��L���k�Z l�n��d��k���qxZ�>���r�Jo�?��[@kA�%�����m]�Z�k-6[2���ZE�}��]�A�����]�M����]�DeK��Z���l��U8���v��
C��B�u;k]��6)Rt�G��zD��+�;I��$����-���3uj����`��������Eo�|D���.i{���x�Njz�k������g��jV��:To��k�Q�:5a�t}��P�{Q�����v�YJ;�d%w�GI����YY��������o�-�q���������j���7UZ�z�+��T��[��O�o��
]������u��y�8����������gI�����Z�����l���+WNk
WYb�%;[��Vf;i�$W>l�sYcR���z��w]cW;v��
�WB�-�?~���������u�c-�=|�������]��#U�V��U�Tq���Vk��������j���Q�%'�Y������R��g��%��Y�-W�re�:�V���������y�^K�����_�6��k���KkA�Zl3f��QLk���XER��Q�F��u��`��ZAd�����E��yF�I�*2�����E����c/���b���\u3j��G(+%�{�tR�C��:5tq�Su��W��]P���m�&�
t�����G+3��7���R%����2��T�n�K��Ui��*��$+��fq��O>Y�����BW�le���ww������V���u�%["���l���������k{S��2Y{�5@e	����,wmVNk�)��ZK�Gq�~��g]{����i������l����Z�\�+_4�4�vdI��P���o���ns��e���
�u{��/�V�{�1
8Po���������s�=��C��G�����=����N:I��z����������������O��+��A�a{���|���������g��#F��K.��Q�\���O
0@����e�]�_|�m�uC��K/�D��	�B�%g`k�_A������-r�E��8����*Y�{�I�q.��Bol������������%!�|+2H�n��+��~Z��W�[O���*<�&)����7_����~I�����W<^��Uh-_�����o���O�f�=��������xSJ��W7e���{}����q�7�W���QA4������
���l�Z���~�yc�����>Q��"jU7���NRpM'n�4?��-V~�T��O������[�u��k��B77���]���QE�,R�/������^�X�P�/W��������t2L`��U=XSW�������3�9��LQ��g����xS��!S����'�-3������n�O�}���*ZB�Q\�YKU��v7u��7�<pM�z�L��79�>_7��P�u�D��4��l{�Q��C��ySJ�W���=qM# �n��������z�����r��"�<c�������s��4h�������z�v�2��_W�S����"�X���>+��t�I:������{�����)%w�S��?�p���#�9%����<c��9�t���he��2Y�c�nT�:�����!���Pk�5���uG��q
�;^������
s#�^T�~�B��xI����*v=S������n��7�d�3j����rJ%o�����a/�C\��X��|�;�����^y��.����_w��o���Z�h����������k=�6m��M�6l�=�P���{�L6n���n��g��V�k�o�������>���^�o�����kI����5*e
bY�S}��u��Z����^�A���w�]w����2gk���o����9zf�{������o�:���:��^�����!W{�6����CV+o@y�[�P)��,_������7*�[�������*�nLB�������{��k�[�.]J}�k�lI��z�r-$[�%��v�cB��X�i,h�D��?�\>��:u����YW?w�q��9��q����}FQ������F��{)RE,��W���{���l(6QAA)�{�-!��k�����PP�_c����w������{����o��=�u�V�r�)���k��E/���B>��df��3o�<�<j�(�9Rn���7�	g�y���~��7���{�l�2�����^�{���\������������cx��/�^��#Q5���5b�N��cjK]������e�]v�>5.T������_(�P�=%�H�VLf�D;��z@����E0w�$�5�\��A������zp��v���x��+�%�7��c���s���i����	��I���:�v����~�?��^-B���-"�����l�J�l��Wj�������#Z�������r��Ni��g��JT��'~��g�2�%*O��@�����8*�=������{��}����K/�#�<"�Tc�"������V�Z���
T�����x����=X���D��O��oE��o-Y�DG��d�,�U��c1V���+����Fd{������DD���^��w3'b�77\�{��sS�chB�pM�r��?�VrG���-�]x��-?1/>
��<\spe����%j��4i��������J�� �~E&b��z�������S&2r���&�yY����N9M����G�}'�| �<���O������G����Nk��me}
Q��wc��A������xd���,��~�i9U�C=�K.�DfJw����4���C���j�N����i�&�,~���H�\�NGu��@<8������gQ������E�t���^"����]�O3����}�����m��}��~5lT�����a��j��`�.���r�-��Es�,[c��P�N����E��3_�� ����������%P���j����;�����/
5P9��V��z�`���
���4�����[i2������m4|�  �����d����m(����(;��j�fNC��o�(+e�2�%*O��@�����8*�=����������7�xC&~���Ngx-0}�t9�+���� ��R"������������
���n�Y�h[C��{�UW�����"����
�}3������g����WUU%�R��Xb������b,W0�e�Z�LDD���E[���1�|(�v����z��-�I��<������?�gx��=+%7_��$\sp�z���KT+��3&:ab!q���3W�=*:�5Et�&L������!E�Vt�E'QdM�?HY������,���!2o��YvtE*��A���};JJB'���.X�@�K����iS$%%����� �����n�A�"o��E��{��g�e�i��=����s��������!I��3f���!C��W/9�NM7��,L���w'�EB��x��8_�"�)Wm|�a�}	}��0��Z�W��(�L�J��V�n��vf j�E���.(�01w���[uT��������W.v��]Mk;{JL|6?�]A�Wu��3��:�6E��
�n8���g���DDDD��_+�q�z�V$eA�"����e� e�E���������f!�����G�v�dR����bx��Y�����!�M�6rLW���@d1�m ����b|�w�����a��{��s��)��E������q��
������1��@e�+��iq���9e��,<`����_�~h�������D�U��*�<w�����)SdY�E�RL$���{�=|��7rz ��x��]�������~��x���e��T������'�|�����c���1�#;������?w�\�?^N$�~����"AZZZ��f��Y�>b;���yyy��,~w��U��15tb���c�����/������d���r��7��P�&��
ad�c�h��]�J�:W��.&`������M��f�7�u����m���im-8`d���'�����aD����-5PXa��J�L�Z%�T,���,�Df�	1��f���Z$���'6`M��
��e;�h�����,�P�5��0=����>���!��"�p]����^16+2?�1T�(J��~������"��?c�blU1���3��1]1+�JE��o�)�����d����_.�E������z�-9,������"���Y"��9s����q���������!2-w��I��+�������c��52y�/�56��,��� e1����?~�2z�hyw����[Dp��d�;asss��s����o�[^{�5���[v�o����w���{�]���z����� �%�1�����������;������4BO>�$�w�.;��C,�&� �#�<Rv����c�|�%��nz%�yA���w��d��+�/2*�����,�[�l����������D�������w�}�r����C�T&�-�%�(qC�Dt�R9M���,#�EQ����`1�@����A��6�0K�6������h���{RcU�����{��9MCV���'yQ�7������r�n�
����c}���`H�ex�K/rJM�IV��)������4��
v�j�T�\1��1���C�V���qP1��X��7�|��"�=��z�����W$uz���q�W�1�{��W��� �����@f��J��?�0���[\u�U29����"��4�����D��h#��,�"0�����t�R�{��r�V��={����_~�%.��b&�"""""�F�V�k�����3��o���"�q{�1|���2K��Et:O:�$�{|���20YdW�)" Yd}Z1�SO=�W^yEY���]v��*H���5���5S��)�D��f��_�>����,���n�ZE�6"Z�6m_x�y�@���t���"@Yt�E���]��������%��bFq�kM��c��g��������47���P�����z}�y0�?�,��@_���7L3}�0 P5�������$����N����@uY�#�
��}"��E���Or���]��TRc��aG�f�����N<r������m��TF[���U�4�V�Vp�iN<pV$���*���)�������Gu�_+4�q�������[eVb1�lM��D����"���y�d���S��@��1R���~���SRR��]z��r�z���2�����j$$$��Sb����1m�4l,�����@f����7��?�����+�v�i���LDDDDD��Z��������#efe�[S��B"�733Sf������Z����Ce����>}� ::��G�����m��H��\�i��z������\�%Zt��TAb?b�!C��i�����x.:�b;�f��A��������{���f�@>o�����D����%"""""�����$����S1 *n$7��I1�)v��0j�'`����eYm�(�N�����gC�9��� d��-PS/�A�2TuZ������Y�:�eUk�������:d#]
�����Z�[���NE�s�B�GhY<����zn6��b�/<VQr3���;W/�"""��n���u�_+�FE��������������Q%��Z�.2��'�����z�,���b\U���m���c�5D`�HJu�6�h'���1]�]Y�^������������@eq����V��*2��\�R�1*����a���jt����s��p�U"�����K�.r��3�8#F�����/��\p�����'��"�k��e��������(�	T�9L�/��������Z1�+��DDDDDDTj�w�����,2�t�Ih���v�*��S���r���"�����LDDDDDD�G***����+����w�9�Y'f�5j���v�������&�j9���L(V.������u��Qm��@e1����FL�S�1�m���,:�b���dl��E��KDDDDDDTW��ZQj��b����,���#--M�q@��������*�k�������6�J���(%%~��/��\�U977�W�Faa�����/�i�f���l��Q�c����M��w�FUU��<��%"""""�:��Z""""""�M����MY&L��u���y������z�)<����#��cG8��VDDDDDDDu��������1c���w��7�v���_~9���ny#�����0�9��V9,k��Gm�����~�y���~-��Z�]�;q���*���cbbp�}��m��(**����
��foADDDDDDT7�q�x��'��];�����GE���e��k���;w�""������om����;"��-.BAz��/W���H���)�y�iB7�DDt�3�<��Z""""""���\�U���OG��-�r��}��C��_���^*��%""""""��"""p�����F0D�����'�`��q�����zj�jl\x������1�%"":��x�aC�4IQ
�+��
���p�1v���D�a���DD��~-��Z��������>����c����N���{����"""""""��L����q�m�a�����K�k�.����eK�5ZF8
��t�k$�=��%"2\CDD�q*8��
w����g�0��}���]��'�f0J��q�����p[m���JDt0��Qm��@���R�9��@EE������QYY���'�N���k�������������W��SO�W_}���j,[�����������"///��:�M9��[��K��~"��uo���^���	\'�nMDD�#�J�%����*i�J�T�16�eX�J�
�aF9���nR��Z���
�k����������:qG��u��h�"<��Sx������,�edd��O?�����3��BDDDDDDDu���x�����sg,\�P����m���W^��;��A�/L����������9�<x��`oq�|:��f��nLDDDU.l�}�H�W��P������h�@e"��a��������jS�\�����L8t��M>�P)))���v��
��^CDDDDDDT����`��5��������:�����[#))	�%"""���G*��X>���On�P9���R&":�k�������6��U:��.�~�|����EEE���,:�DDDDDDDu����>nUU����y�,AN�S>�5��Qm���`M���E�Iy���2s���,:�b����6l@��]��LDDDDDDT�DGG�O�>����9s���3M�2���������DDDDDDT'�~m�����%"""""�ZQ+�KEQ��m[��?��������/b��mx��Gp�-���>���C1d��LDDDDDDTW�~��7����J�|��8����n�:�,����z*:t�nMDDD��u[8�5*:\CDDD��DDDDDDT�j�6�����=z4�>�l�p�	0����k����n�	M�4	�&""""""����o/�L�u�]�����4h>��S\}���"�M��
-P�����������|�OB�;�"����e4Y3�-����pD 2��DDDDDDTjuT,**
��[q7��NHt~G�����p+""""""��O�cx���5K���W_�A]��nA�{J�`����|����DtTWx-Q��[s
l�3�5��{M����[j���v���1(��m:vXn���^{l-��u����
��q�����4�'"�DDD��Qm��@e�4�g��|��w������>�{��GfS����0q�D�|��DDDDDDDuSAA�y�9�����c�a��5�L�;�vP�����h��Am�
����#�������E[��rQ�/�kC
+L|g�MX��m:�����
Ll�60qqs7���1������l�c������5������~/���q��p�q���^CD���_KDDDDDD����7l� 3)� �����;r�/"Hy����u=�Q�#���=�z�!L�<K�,��e����+W�����
�YV
��o���}�&���P��8��*�~zn6�W���Q:�.�~�
=k*�x�/<��p�@�5�J(��=5|6h�DE���s;�#Zjh�����J"��a���v�BC��b���r�����|���e�jBbxOD��8��������C�
��3�r��	��DD���DDDDDDT�j%P9�@������{���DNN�e���3��x�[�=�o;e��q��={6���KyCnM;v,U��{�������4�������
�/[={"o�j|<|?���ip�r<�\����/][��P���}��o�,�{�{`�������i@Z���(�o�=�RTD8\4���������4�q������rC:����kM��:�d���,5<"p}�v|����&<��,������W�6��(��x}���
<���Y���P\n�MR�z<����BD�x�~���S��%"""""�ZQk�KM���ys�j�
v�=\KDDDDDDT�8�Nt��������:�DFF�f��[RC�DF�}��p���!��"��j\��$h����z��t�
5�	l�[�7�g���QX�����h@D�0��W�/����	?��d�� F�Q���P��k����:4���B�>.�6SW������x��j�.Uak�Z����^��9�����X���4t���X�]��}�Oa��e��x�'N=���;t�@y���������.6�����*6e�ae�z�a����"������DD
��DDDDDDT[jeL)�o�)))�7o���PQQq@�������BDDDDDDT�������O��Y���@����z�1�.5Fa��~��VL�=��t�h2��9���Go������������B�c/ ���`Z����@`�k����f���)"8���d�{�rW\�g������%"��'7x0�$'"]��W���k��������&�a]l����b=�kH�W�%�@�?�#Z��U5j���T$D�X��Ppd�����K��;Ov"1���<��E��&�*th�
f_�EG�H�Q��:N��9[��[Sd$����
���&$��FD�8�~��#��%"""""�ZQ+����i��HKK�S�|�����(��v&N�(����������*1������d������=�����=�W��a�-��3������ �Z8����7�Gyp7jL,�[6�7{G��[O�N��Ep�j�q�7�'��Y�Xup�Cq��6D{E��>t���Cp���H
/4J�Q�g� 2�Gv��?G�����xU����~E&�F(�E�4
��._t���N��h���O+
��U4o�D��$E����Q\n�0�R�eC�8��
�i�}�PX���*_,`���f?U	e�^�%(3u����6d��b����v����h������nyE~�����kxoDD�����t�I��Q���@e�%y��m����e r||<RSSe�rM�1112����������
������'gr��rZ����"����C�h����9�h��_��i"�u�S�A`�
T}�|�~B�3�Q��[���c�~�U���'@`�2�E�9�hM�a�(�D(���,St %�;��@�tK���J�p�iWX�e����\%�j��$\S�z��I��+���~����i�*�p��-��m�!�:����h��|�QpTG���[�������������6x*���1
z��p��!�z����q���4�y@�����z����w��nMU�IV�I�a�� v8�:���2�E[�7'������^G�����A ����_�m�:�jl|xODD����~��G��Q���@e15��-[��O��������{�����~;�>�h�����HDDDDDD�/+))���3��Ca��qx��G����-w�u:u������<�_�����:�����{�~�D�3�s.D��w�:�y���u�%"RN//����qD^s;���b��-��@�:��_���gZe��2p;���C��8�qI��=���|_g��
���Aq��SC��>�7]��	����Wx�~#o���- ���586BAR��E�5d.����D6m��co�3��w>�Q���2��5�W����q|7����+��cP{Mf��t*8��]>o+��,����i�����k�������6�J�� ��MHH@����ctt�����b��-���w�4����=Y2#L�gcQx�p�����k�-�UUU({�>�z��{Fi1�?LF��g����X����Qx�p�?�L�7�%��l�����@"����<�89�.5`"�������
�n����Z%N��DF�����b�+_6`T@�����0+���|�����k#�?�ng����������E5����u����XE��u��BM
��}�6T��2J���/<����0�zj�n8��~�mh�D��';�G
o_���wF��[=x�z�&E����5�p�14OT���vN�S��Y.�������������q�Z1.��DDDDDDTj��)���������3GN#T^^~@�������ir�Sj�t��KX��y��QV=/qo��g#�v���K6�]	5)	�������0������8�"������{��}G7��o��0����DDDDD�������'��i��a��e���DVV���������pk��Vm�I�7�c�c06�	}�e0�~5A���=)�LDDD��Yn�� F^.+���������DD�����1��Z""""""���l�BZ1������#G���/�[���
|����Q��ip����Ck�.�g��[Q7���FQ!��X��
��b����e/����m��\[��9��Cak���={��x8�z��������SjbO����YE6�������(�4�#�@Y����N���m`gA�m~����J�v��������i�F[1����_��+���7��[n�eo�����|�r�&�-%�������0s>�Y8�Q
��b���AI���PD�\"""�[�>v/����`��P��32�CM�"��B�kw���~-��Z	TY�KJJ��:�9�t��AN$2-�_8���L���SeF-!io���u3��0K����Z�(����������$���b_�/".�Zz3������	�U�Q;7	��f������~��=���;�o��Z�	8A��/b��v�]h��_�d^�M�cs��)+xg��6���*,�?GQ4k�L��x�����#��o���m�QQQ���(v(iWA��.���Y��}������%v����H����v�.���������rV:"��H�W�7o�~-��Z��4
���c���+�|�	.��"�\��VD��YY�������*8����
�/���0v<m�'��A�eK`d�#o�]/���$� �SlVcN�2l*�M�(���m?��M�cU�F������?X���1~�|�}&��(����m?���yk�S��i���]����^Mc��oh����j�����((���u"�x]����t$E�PU~�j������D|�"�*��O��eU���Dfe�o""""�@DDn��V9c���]w��N�:q@�MuA�������)�Ws@�:IDDD�#���a��+�D��������S��Qc��������j���Y
��E�����t!�&)0�["���%��l#9���_���P�2�YDW�0a���v�,�,������aOE
������Pa�)�X����(w5J}X�������]�bM�f��s�|��^�m����r�
0#s�_X�k���6tI��Z��H����>-5��H�R�$Z��������d��s6��=
>��G���TE�6�LR���h����������	b���p���U�
�DD�7���DECm�[��������0����hdD�"����Qz�@�O9���A������p�t����ZjZ%i�8�'��������s���b��������j���5.�c���%"�S��s��p
;��}�����������"���J��@����3]��kv�N��q-���]�cH��������(xu��N\�V�������v#���_9z5���;���e�������WU(�/�Z�N�am��#��%���]:��2X�F hb@[N�n����+M�E(��RC��+3e�r�4M4/����}�,2�{ """"""��H������}���{�D��<��������C}�������CG��.��YTS��HuPY����u���7��v���I�����b"���lC�U��Uh`�[��s(>	��G�s����"5]2T�s�m�U��(V�����w+
'��!!���DDDDDDDD��c�2Q�8]���Aq�������`��jT�u�����\<6u�%�a�%a8�L�����q������v��V1��G`��y8�� D�B?K"{u?�Z�����=�Z�4���Jv ���2�������AnU�����%P9����
:�%�h�T��5��Uk���J��t���[t���iv(�6����fm��� �� ����""""""�:O��Y���	��^ff�t���h9���r��(;��Y�
���d�Y�1�a=�(�w����qD?(~y_�,��z?��F�@����f�g��c�����a�-���)(�� Z3�:&����Z�hGTxGDuCa������������!����l��cW��*����uL^��<C.��6�����bA@^/�j��1�u����=Qcpv_;����'X�x��r��|��Nto�L�DDDDDDDDT;�L����ad%v���Y�C+���B�����q������f��^5�@�}�C��n��g	���=���d;�7�g�=��T���x\4�.�<�	zK�{��D&�
�:�]�S��8��*|�0�G&��6SG�6�xf��Q
��0oS�^��v�!�����6�o����s6�	�""""""�z������������k-�f����JL?(�P�z���'�,]�-�Y2������?|{�;�_�f-���Jx��Z�4 Xs�0sE���Z�T6}Y�{3p6
����c_����r������0�g�,�
3�#y�uFT*��=�
n;�����q����z%���mL�t��@���Al�1�.�@^�!g.�^h}����_3���JD$�������h���_k
���+}ZiH�e&e""""""""�=��l�&���QXX�-[�`���(((@EE��"�?Eu�(9Hi�/�Y<��k��������[
�]t6L����=�y�q$*���T�X]�	����-%��:�u/�Xu�l�	�7l�EE�b}�V$��������Ht�o�����O��z����.�4��N6L���;#0�6��g���;�5CC�8�����7yp��v�j����]��v^����HE&�Y����g91�z:6eF""""���|>�����Ey�~A�DD�5�z��n4g�&L��T���w�o�����%~8{,���@L_�r#��)0K�b���A����#����9�b����:e����a(�'Y-~������0�=c�K�3J��P"�CQPS/��L�����
�pj(���4��B��w:S��q*��W���[M�T�>��+�r ����mA��8�H;���a��:�p�����h�"���6��G�9��������a���������i����:6m��{��={���!C0t�P�o�]t-Z�@ nMDDI��'�Y���z1l��6$�����zZ�G������J�L��������{��s���5{9>��\�Q����cl+���-�bi������7q�����Z���'4��)=�����!������������J����h���,:t@jj*N?�tl���7���dz%��
�ll���EZ��	P�������=��Ka�|!T/�	���;JD'hG.���S�y{(�}�}�Y?b_���@k�[k���k@�(�Z�e���@~K��
��w���z��`�~��5a��j�,*�a9�f�n���,(1�`Z����t�k�c��D�C��D��7�������� ���3B���� =AE����}���!-�Z�>R��yM,��cW�a����tz`o��:��
DD��`��������jK�*ggg��W_����q�9����^�����Q�F���=���_nMD1�����plF9����.��aOa��g��1�Z�����g�mls��n�9�1<=�v4�h��:�)������epr��q-���������DDDDD��������O���������O?���~;v��)�����-���4`�����9���Ie`�`f3��Pl�sf�Z@�@���)@�f�O@���g��:�j�&���B�:�����u����Y�1�����k�X/�%�C�=������
Tw�}.[x�[��lx�^����;������6D����9��5n���&g�!N����KL�����)>��&��y�D�H�S����m�� ��`k���������=(�a�CQkmH������?���Z""""""��rUR�q�a�l��Y&?���8��sq�i������/���!�����������������*9�{�y���p�:�,�x���\������3
����FO��Y�=�������0.�=cad�i��������e;��A�f������W�I���AI8Z���f������t����3�s�[��a-+�G�����P"{���-�:%���eIf6�����`�n��.�Qi��z�6��.������`�~���:O^������+�K��e��amg�����J�$�������^����@�GT��j��u�&�^W�(�J��w�������.*�9��&1
D����b=
�v�!=^E�f\���	����e}�T�~5j�_+n�e��������jC�*������3\�}�.b0�E�rJ�={�������=bz\1h;t�PDE��]D�4��MLLD~~>tI�������f�<\k1���O�j=O��f��@�f@/���_�x���6���r?��	��,ws(�7@��Cq&"K�-J�MP���j�S���A�J�H(qG��q-b���V�P��#���Jd���z�,+E��P��}({�N����������[�+�?�s�jx�Y����VO���Q��(�4�p��vj�_JT(������z��������T��vDuH��Z7Qev�n:4Ua�N�c;�0r�C:h�p*H�Qpv?;��cG�D�"b������Z��u��c�z�g�����N�������H�HD���DDDDDDT�j%PY#�N���\XX��N��kWL$��0QC!��=�&�/`�V]�m�1��><��wo������S�}xo�^�����_zey�{�����~�����8DDDDD�o����F����p�>���r���v�k��S����Ld�u�k��E0������-��,_.��*MN���P����*7�(�
�l,l1�P��EA��:f\��D��*U(�P������Q�U����z~�����G[���+�#?��+�_��Y��_0��8�wK@�������i��Pr�	2�2T��Z�O[�,��~=`=������3�6o���E(��wQP��h�>|'|?���y��l,������-�dk��>��W�C��c���J��M�k��!b��������jS�*���v���@�_|�g��������n��G}�7oF����p8�[�eU&���c]���� dp��zq@;&/��
8�]h`m��^-49���m:N�n�eG90��]N�XTa�,)���s������l����~y�?�
�����W^l��/�]��_o�_�n5n[�/��[t���OL��ci�v�Ym^��Cu����)66���o��~����{��}��Wd�}��P���Y�����2�8�%�����c��X(M����U��,��X�������V�OB��"`U��~���$jHT
��&���D0T}�>*^y�U����/���+>�?���}�o�����>�#�^����2���!1�������z�������QX �'j�Dn�J�)�_��'F\s,,7Q.���n�����,�V���D�HN��GoD\x%"�-9�����k�������6�Z��E������4A'�t����=z������W^���:Jf_&j(�=
�9��#ZhP�C[�V�M9Uc�V�:P�]9�ErO�m��6�1���y�
���P�������J��YG�KA�U��g�w��x[�W��(�.~X���G���p��j�����x~�/]��-58l��]:��jCF�"��E`�eC��T�.��Tk_b�DDDD�������gO������v��~��a��m����d�)��Y2��Q0�|����P��=���T��f���F���	8���E?Y�2;����L�k�;!j��N]��[��!��.���^��l.��1�?������
� �2?����~[������w�obaC�������|��k��2����}x�[�L�!�<��/|���-Ad�*�:Ck�&�'"j����z�k�������V�Z������yW��_~�o�Q.����X�r%���fS�G����
4�,�����TYm��b[sCA�"�Y��[uy���,�_��}�:�
��V��������f�r=e�������cHO},�q��KU�a�����������*PVm�S�&3n�KQ�����2I�*����U���2����l'"""��GYYF���_~��~���>��x���p�q������R4(	'B��9�f�X�?WxE�Y�f�8��(�d�^�Y0J���������P��iu=b���Wn-0��Q�8�".��c����������z8nMDD�+�-�T�m�����4�>���Os���N�n��
A�����;�uC�i���<
6e�fj�My�Z�������a$"�e�����Q���+L"Hy��9���[�s�N�Q��'��K/��/�M�4	�$j�j����YsE�iM�����*Y�������\/�N�T|�SC�����h���Hw}���QPe���3��J��+Xj���}%Ph��@xe�'�+S��[������9�hk3��|��l��j�.�s� ��7y��#��8r�!�C1�#������~����Yg�����O.�lT�:u�`.���9����������lP2n��r!��k�&�cu�P�z@mz)��:�M��qG[m����N(���;&j8���N8�������<�Xu��O����&"���F���bo�����k�Y�D��z3���)�)&D)8���Z��q�Y�4DZ�Jd4�}�CKi�5$��Qm��@e����sq��1r;��v�V���V�*
6��
=�k�O/���+�'[������"N&�2QPa�mJ(;���*R#���Y��i56�E���+��x�����m���NN)\�m���O
`�O����_���9(�L7t"��4��E��b����:�e���&��{���)���,q�(�i���-�s��7��o����BDDDD�/>�k�����.:���((�]C���Pb�Y�*Ws(	���mub�?��2(Y��o-G���aO��Y����3-5@�
5.Z����#"�}�u�Y���hL������0�9GG�d
N�u���_x�{?��P&eq=Z\zI2�u�Q{Q�Ck�ZjZhGD���_KDDDDDD��V�UUEFF���	&`���������3f`����S��YgY�&*ZY������VP^
�r�M��,2d�e��6����v�%�����hqDKkC�l�-U�l���UgX-�S�h
�>�@���������;��������v��d��(t�
�Jv`���l�w��*����s��2O��mb�AqA����\�[�]��+w���p����������m1K�����q0���:I��������P�`1���0�����.���0+VY�_��M��]��*G{Tp<aQ����"�����X�u������$Z��PJ���i�T��L��T�L�i�!�� 9F��L�a�Y��I�~��E��4���~����������R�_o�����b[�n�W����0;k	��u�&"""�cqqq8����[oa��������={����TW����DDDD�8���Gw�a��\9�!gS��\.�%,�E���I���=Zhx�|N�iC�f*\v�V[q-Q\�>�}m�}�,2�����!�CD
��DDDDDDT����?JdP��7m������5jn����]w����'�����"jDpr�4��C�d��+8��W�@�..B���6�i���N������*.8[�Rb�n�#?f0�����8��
�����YR$�Y�H�����h��vU���?�K���E��<�h����#�*e���~���9����+v��O��Y�F������`�~�\����?�z�U��"(y�Xk�o=~#o��F�F������'Z�kaN
@���Y.����c`@[
��1��AN��2I��-�i
t��Y����Z���.��`���P������E�nq�uNWe��kJ�����Kv`q�j,�[��)`k�nL�5Y�����H���Z���"dW����3e��������XW�����g"""��������?��3��m��M�6{K��=1u�T9�Qm�"��M�f���,����N\'l�Er1����v�,fl;����v�K�hnk_
��r�U�}���y��Qm��@e�QYtpG���?����:�x�	<���{�Xw�	'���D�{FQ�'}���F���P1�Ex�NF����r�K�M�FU(��<��#����0g���EE �mX����,���M���S��~�P������)��AS ;�e�V�fA��J�q�/�z����f�R(1GBmv��k�Dt��2j�{�&�x�B�?���(iW�x�n���|�t)���!�
&A���e��]lH�	e�n�
X��\Cj���c�1���6t��A�5D�{�#z����&*���
TC����ZA����R��`(�8�����qn��e� ��C�����`p�#P�-�i�'�s��+
6����*���KDDD����k��F�eE������B��]���������j�6>��
��^-5�h��D�A�mr6�m��n��q���$1��i"#^�
�9p�	D�U��X
=sW�
5(��Qm��H)��MKK�S�z��-'�|2:w�Mc�A���X������
*�}U������F���=�Zd}=�
}�a��"���Dt��E�
�-Y��b-2T�pf{���XUv(�C�D����jgm�j�0���ic���"�#�Z�������X�Ne���%(����W&���*��~+����+��@7u�F$��������a`j/tKl��z^�#�tF�;mc����MNDDD������+~7SPM��������%"""�� �e��
���#�n5�����d���0����k�������6�jJ���R���+����,[�lA~~>n��&��?_E��c�}0J�a���`����b�& �!Q�{Aq�AAu1�����z��:�\��,��]�5��x�s
�Y����~�,<��5�,����7����z+~�^�3�'�w'������]/��*��:��>`���t!�\qh��WV|�/6��(G$lJ(��Kb[zKp�����41�(D�=�������+��������������k+?��Q�����GyDf����7��]+������DDDDDu�QV
��Q��s(��6�>z/������#�Y�[QC�~-��ZT.**��O?���{			0C����b��QX�re�5����H����0+�Z�vv��f���8������LE�&��@����t7�����D
�_9�{=&�x
���+6`��%2��0
���<�)F��;��d���M�N����y ��o[��*�eK�kD�r!��WC��������������G�K|[�I�:P�8g���;z]�n	��/U/-��Jv��xu|��9pZ���L���G�o�DDDT��[�N�4f�TTT������x����4�b����4aVV�,�Fi	��g@�u"`N�3�*�e��j[Rl���0���yqx=�=����
fy��r�^�"j�DP2��DDDDDDTj%PYdJ���V������$������>@\\f���/~�~��b.;���Y���D�E���S4�L�A�p$CI�
F�X����
�3��^�����}|+$�����d�e9j���90n�$������{�4����D��T����1�Va���Q�������k)�Q=a�P"{XX�E�����M�X����=�c�JfB~s��Hp��W�NX���Z������v�E��������cV�1�>�)-�"���I�pR�!H�$`��e�f"""��D���^@zz:�������#::ZN�����b���X�~��{���~O��B���Q���(�Q�W���(�s;��z�/<������{�>�0���'��y*�&|���C�����e�,�������a��������jS�*�����l8t��	v��X"�����e�w��=���M�OD�$F�	����?N<{�K�=�p��
��i��}P������Rh��B��%��aPR/��|.�E���������d-FvU>l��SE��Up]����������aU�FT��65\6'F��	�������Vl(������:�:^��`�M���zG���^R�<n;��$���-���?
#���h���;cT�����Q�����3����jbx��x{���`�S��wh��:�Nl>c�>��;����t`�.���Y`@�oL~w����u����*�&�d�X`�m�7���u���(���f""�����L�t���M�6�Z��LMC�����I���s@���L��#!����<�����Q�?g���"����DEC��
[z3D��(�'�#?�j��������_�P�7��#��"���DDDDDDTj%PYp:�0UU�����DQQ"""d��H���w����6t���`
�ME�YM	]S���-�w�$7��AY/2)�m�;lp�F�{2��pXF�G��@d���$w����~,�_���N�!o�02���X���jc�������_��<;���:%�"(��a��
E�X_TMC+�
����c���(��w�um�wZ��[�W�u�aVo�����`�-�����l�1��� �l��UA��K�LL\���AL^����l�����
�.��"��� �Z�w((�g""�?KUUY����	~#h�=*�����KDD�5o	G����.����}�M����-�)�jtO��F�o���dh���5|������p��ih�������F�i��,��DDDDDDTj%PYtt[�j���I�&a��m��[QQ������W^��-[��gO�u������X����Mk��<fJ�R���
1�B`�R�oAp�*���H6�s�������_�@N+�lJ�_~����0r� �a-���[��������yd�rO�H�,�gd.@���������0q�t4�j
��-��?1��&�:���Y�CC��w��n�5���>�
��I� ��
|�0 3�L�;
|4��wf��a��������A�T��U�����p$qG[5���a���,���{`�~
�\�Y�@�r��	�/�
�D���`�z���_N������g��[�G(@Y�+3��k�91�����t�F(8��������^�3G���Z�W�6�6���a���>��:w�9$��������Gd�����=n���������[j���|�"�����DD����a��7���j2L��sg��!g���������B����O.~����?�?�t>�����{iii���>�/���*}�	'�uC����K�kB�o��SN9��5���_���}+�����/��s����a�|�M]v��������I���243����6(>[CEq8�y9�C���k��8��uDp�y9(��j�fL�}}""""�c�_+f���Z""""""��j�w)����A��{��|��'�i�&�v�m���k0a�9x9h� vx��)�6���^���1��{��S|2�ic�"]�����G�^���$3$��U�)��w8�4����(��7o�zA��b��X����m��%��!������=��AFd
b��8��PL�����q�P�Ht�aD����I�?����3�#����i�����C��*�����gb�NA����:_�sP)TZ�~Y���)2hW7L����ZD���ZGf���J^��yS@@�][�@to�)#�&�f/��A��#J�UV��6�j�%P<�49�z~���������Vi5�k�eP":���6tNSe��{������C����Pm}t����	��*IQ
rKM|4��X���q*��k��4y��)hb����sd�8g�9~��������A�o/ %|���
����������DQ�u� �qC�8���;�o5jJJJ��>7n��'��GyD�o;t�n������������W_���~����n����V���X�z5�7o�s�9\p�,#F�@bb�l#��g�qt]����'_��y����F���Cjj*�M�&gQz����%���KL2�G�Q�q�u���8�D�g�u��P��C}��J���������f13R������`��X�~��������	����~X$���+��z��HDDDD�U_��DDDDDD�0�ZT������D��;�������t�y��AS1PnM�8��n���� 6�2�eM����g�dF����+-%"
j|�����S�5���rL�~��}Fy�&�n�EUak��b=�n������Kw�	�P���U8y�4���Q�D�#�6�<67�"�1$���������B��fr������tA�����sA"�t�\?nW�k��?���3��,j���"�o �HR��B�I��9�{"-�����AT�(���6�*�dh20SD�n���b`M��0e0���e�!�#I+Q���Z�-��S�$�`}�5�����	%����im���w�8(����c=�-k�`|J/;4��<�$h�n�G"h��O���VG�K����S���z�Q��ULt����"��IKxi�O~�P�"2h�����u�4KP���Oh]�u��\���X
JY����aX�X�6eP��]~'���a�Y��������KL�8Q�e�:�(9���}{�����N���M"y�������K/�����#G�����/��S�L�Y�FL����/���>���z,��w���-[�@���������p�UW�����g�yF�����+����7.����;w���Tf�7n�����k��O%���(.�7 WO����B�����5
��+�|���W�l�Z��o \�������_���jl���-�9��$V.��}�f��JDDDDJ]��Q�Q+��"�����[���/��w���7��#�8yyyX�n�Af>��C��������%7�|]c��"�m}����������p�z�D6�>��geN��zjl<�����p.����P0����DE��pnX��[�D��c���Bl�4�O
`�n[rCEd8��?��������%��*��b,N�|5n��(J����0
��\�����S��_m���o��op��Kq�������1f��8�����o�v�h�"r������VMT8��@IT�����b����l�����xp��Zk��
O�����m2�W�[����r(2x[d�.��;�����<r�SfIN�S1{C��2�r��D���W���)]C�dMw�Y�'5,"P=#^������e�
�~�O�hWu�����t�U����G����u\<q��w��c������MD������9sd����<y2���[|����]�)x�f�o���U�qS^��M�,F�{����1���r,��"�����"#���v��?��x�'�t�z�{q�i�a���28Z�v�3�v��]41����(��-��E3�)5N���5�>�<��U^@�U7�5�t8z	5"Rf^�~�i�N��s�q� �,��w�">�B;�>[�F����8���G,�X%"""�3D�V���r���������Z	����&M��G�����2;��WH:x�^L�0c��=dF'��JWNM����m��~���\3iZ��`e���Z��3�Gp�F���E��W���'Q5���/���*N'��4D^?
�/�YO����k��^���R�U``���
wC�v��~|t�3Hp�`~�
Y_�-�������y���5��g	��>T�p�W���^��mOD�+7u�Hf<�����$���(�4�5��UC�t�+w�2�V0tS1w�P�����1��;1�R�o�e����+3�z���>������w�)=mX�M���1������c�u,���My��bx8�t�� n����(	
<NWX�i���-���-���\���W�����p��jU�����e&������K��D\_7��3��M�������q��U�x��Yb����w���#2�_f�;Wm�Y�+���x}��������u>���{���G�W�C��EF�>���c_��n""���q�}�������M���!"�����^��_T���.��b�\#''[�lAFF�A�����l���Y�+��B ��"�Y����{w�sj��f����������D9�-����'�X��F�!3uQ�}�{���N�k������������b����zJ��+���������DI�$$���=����o`��GfU�����u4��=��������'�D��O!��k������d�%1=l��qP��?�~����M��S�������**v�eAdQ�uF��&�\��,����_���p�����'c����4o-��l��(��cy�z�l����CD���_nX����"�8��DJ�*�g���Yl��%��-3e����,/�*
�E�]���P��[���+�����@��>����*��h��~��ZEv�v�*�9���n����"HY�/2T�x�O��B��Z���o�=_��c.w�L��v�N_������5ME����OY�[�/���GtX���Y����wb�g������8j����������KR����X�U��m:�6����:Dv���1w��v�T�=�����k��*YE�@���Y���|#|�^�}��F�"���&vY����M�������� �[n�E����G��/������J�3FH�YN�3��@;v�����1e��n�)))x���q�
7�@�@  __tt�o����r��������{��� �\z��X�x�|�D6e�m�������j_}��Q��X���)1���k|��W�����l������o��rSdT*))��?������D
��3��IK���L�7���G���c^D`������uD�������=��4����R�^���U^\���<5��@��bT��pN��5�c���|_����}l����h��C��"2�����U���6E���������&�V`�����UE�u]/@��fr�n��Z�33����h�\�
�d-���l��f����-���D��	Z��#������A�3��}#zZ��u����qf_�&]�UG��*��l��q^�7`��.6jg���"�p�� fo��5]������fG��o���:l	���vto�o���q�h��s��eV�qs2�[������W�2����������>����a�����	��N���)2+��/t�,���}��a��"��]@���)�9��e����8�~��wJ�?�|�oD���(�^��-�o9���X;�
L����d�����;e&����!^����\
f��&n;�	_�Dr�*���U�9�?���FQ��������������KD�1;��W_^�w�����c������@b���^C�=PPP���G��c��g�!3��D����L�^TC�Y�j�~��/��w�}W������,^����ee�w��x�E&�.]����O������;N�V�X���?^C�y����}D&�[o�UfSE��~����������������`j29s����*�����S��p��u�j�;Z^^��]���{�����=��A����;p�\n���|<���7Q����\���k���^�{N��sS����~����=�gx���Y��-Pq��6����+���
�9��MW�����1>g�t�\>�W2�L?-=i���!����X�:�tp���E�i�Z#��/!��������8n��v|��e��C9:�7�����
��
�7��9^v��w�
g`�K��������P=
%�!�W�G����`ex�����B���[3K��E7����cL�$���(�����Cn���9:���xk�W�5����Cm�F����Ul��������=�u>���[��������:^n�s���mQ��&~���7��cd�"��������;�����_KDDT��/�������������{ps��pz�}�B�>��x|��!��j��5zV&Jn�FiI���b{����K���j�����9���'�xBfp5j���9`JD�[�SV��\��[�K���"������%0+V�,��`
�����|f�4 Pn���`f��^��9�FM���f�:��k������\���-1o�R�J���V��d.B���h�.����GU��.�A,�]�8W4����]s17������m����8q�)NtN�d��2���]mx�4'��kG\��>�BmG������ eAUhg�=�>�� e�-:���������-?���=�y�VT[Z(K��,C�{���(w(���,��C�68��
����� �����A�Z�����s�n���f�;���G�;�K�������#��o?����p�
R��ydM���^�3HYH�Wq�	N<v������L�"�� 2%�G*��x�<�D��b���Am�U�2u�1����c �3XN3D��"����G���7�|H���}�������,wE�pm}j�K���>�@�A���o���?��#<���8��s�,�x���8q�� e�W�^h�����,nF�������������`0��3g��r����K�,����#�...�>8�����H���D��,�������{E�t��;����i}��l�g�������D��"3������;�Q�D�6��#���.`�f��;��fdRUk���Q�6u���D@��aG�h)�����M;��5�9'�&������pY��h����}���!����~�k])�5�5����/U�w5�����#�������]�?���~N����?��/��u<^��?����4��'������KC&�����%"""""���V3*�L�"c����a��sx���8��S����3�25&��|p5�������(H�TdV��mCAv��kj�`�|3��}��,��Z��6��j�UP���~�;�A��������Q0%�]��z�6h�^��8Ygd��
J�qXS��:~@�=��8��`�:�Q�b]�V,�])3)�9cpf�����'�U���^M:���~�Q��8W^]1v7�����mN�2
���l<��y�mE`_��xz$u��}�G��^R���Q��A��0eE@_8p����c���uY��V;lg���m��g��-����`}�����	l��#4�������cZh[�����\R�3����:~^��n}�vJW�5]��=��Mx��n��=#���2�]��:/D��������}����23w�TIQ
~\D~���MT�-���S�C�*=������.��~��`Fe�;���S�����%H��,��}�����L9�[[���������h\Cd,�����{?��c2XYdC>���,���|��`;���dP� ���������p����������>�7�b���2Z!w��I�����O?�������]w�%�s�=���7�}�Y�D�f"���7���+���-?�k�Jw�z�����! �=�����k~O��D��7�=�t���O���J�py��������m�5���9e������~�%*�y
����mm; ���`k�F����^sh�cC��&n�.��������O\#7{w�o��J�����K�:�lD^u�}��03����8^�q#���4��Y"��������kLuI����g����p�9f�j���Y�,�� 4�6OAI�^�6v�����w�����M{���q�����$��H>Y����K���(�]�v|Jt/L�1-|5���2"S���'�����l�}����C�p*��;N'9h,�������^�y=\xt'n��7y7����R�����
�����~-�����3*��0�2�Up{�?Cb�;s���~�������?~���/4VibK�!/$U��C_4=�5�`
��Y0��������|ch]��;��#j��d ��J�I��h����#�sE3azw��s�����]pN��/�;����4�	����EN�u��� ��%/���|0�����F��6Hv'��v#pTZ_J=B���ha�*,���A�B��33bU���A��W�8�>��|X��@�dU/�r���U�]b�u]2T��PF�^-4�}R0��Mjx6d����c����q���Q�4y#LN��b��I�"r��P&�����D���d��,
�:|cM}dS�������y�"�g�O���5�u��*(������$�<I��:n��Wj���@��8s}��6�����m{�F-�'��-99Y��@�3f�L��Id���<���"�srr���/����?�<N>���)"3��9sdF�M�6�k��������y��4h�O��={���%%%�4i��&8##C���u���+����� �E���������(GDDDDD�6�*.hGF���<����-5���&g�������Q�V+���N[1�)�/����k���D\z��r�C������$�3D��`ax� ��@QxX[�����������%o��$��>���p�����h��b(��O8f��PlQP#�+���KB[��O$G�=h��c���@C��c�����"(9=2Y0�M��xWl�YT���[b{��H�H
��f���.���H���Y�VYq
���d����	?;�����3�
�U\:���;p�q�h��S�����?w�����r���h�����v��iGr�*�������Pp�P.?���;��t�T�����W����m���Y�����&�vV1�4^��Nq�)�����v��*���x�\_9�C\d�����(����u>��+3��z/DV)��)�@��*�t�!�:_D�rN���Y�h.�"e�U�=�u�33(�C����$vk���.�����_1m����
Z��$���@��'��{���w�-���������F��v�?�|���C��o��&����G�]���5�\�^�z��["���7���;w�>�[o��+��R#����N�,�
����e�rzz�����.]��3g���u����DDDDDT;����z����.|z���������Ow�gs��������z�N�k�����������
"#S�v�p���#&&&\"8�B_|�n��v�LD��3��zZ?9����	yK���W����r�1��x����.}��VC?���"3�r�L�bb'��P":AIx3a��u�Y���1�r�U*`���Y��=�,�I�i�L.�5����f�R9]�Yf��i06���g�~
����^6����XE]� d���Pd��Q�`K!�����N���z�x.2��NV�)����Mto����K�������7��o��w��Wf�_k�����0����!�:N#�N���iq*&/
�������,4�1[GW�]<\��
��
2B�1`}������@fR��k�u��N��Sd��8����`��YnG�������:Kf����l,����=F�!����,�����X�n>��c|���{��y�dAd3�EvcAH��~ccce@�'�|"gCz��w��I��m�N�*�G�-�7�`����n {��E2(�����;e�x��7�pV�X��_�w�DD����0
�K���p�h3"�����(��M���k�
�X����}E,��������~-5���Y1���������R���D�o[����R���	1L^����k�������E0�CS����U[aV�����Y�yO��f�T����c�
0������9��\�%���9�����<����,�g�=y{���A�z���oQ�$�G������sSdV9����4<q�_����������^��'7xpV?;<NENy*>{��d�g7z0�$'b�����m�&tCA���5�r
�Ml�c��_�{_���.�����x��w��-9����C����*��)�2Z���+�C�����g}������s��5*�|O,"�]������
�2�����r����"��`��W_���D����K�l�Rn+��=z���I���������,����X��6m�����se�����c��=`\�~��z����G��m�k���/�>������������%�Mx���j����1*"""""""��o�%"���`5L�upU��~������H
�����K�r��VM��(eRv���f�706�����	#�M@����l(1�`l���'�����n%����Y�����GS��I�����dB���������|&J*���jso@��D���L���~A��%&vX�C�g���� &.	 �,��c����[f�,����]C�4?��L(v;������I��x6fxz�������!^��O�q��j|6���*K��xl�?�	�`�o�p�X/��bm[a��\���DDD��)����/j�{�������J��>P[>8�lK��iXx���X��0�!FD�C�"DDDDDDDDD/*�3"�lDn����R���D|U<�p��'�sX�
fe%��P����j���$���@����~h}�Cm�<w(iW@�=Z�PR�������]	��_��~4\Iu��|�0�'�����l	���Z":��\�v+2����&��"-^�k��1�Rn<��+�:0��
mS5|�( 3-wJ���b`;
}[����ink����QZ��
���C�'SW���_kM�/5~��c��z��Di�9�����gkM�-_�Q����X�e0�2�OTq���^:8���^��cB��:��Y��}��8����z��q�u��DDZ������{c?��GD����%�p\E������������U+��"�haa!�m����*Q�����SP���{�o�t�9�F
K�t����V�7s:�K��;���fL���o\�fe�3J�aT�#�a-L�Q���YU	��fy��������Z�=��u��d��*���S�8r+L���������E�/oL�c�NC�oDD5b<
�u���c1+o/l�����,��$��t)�l�����9G��������O�6q����z��2�5+`���F�G������w����X�S���^�b��MAD8!�O=��MUh�����wu�����^���,f=�?������������������ujR�Z�
/Y-4;R�(qG�+���Dv���	7���]{Bq>����
����5f�����i�K�R?k�Oj�����X�bx��y��3f�-[��nAD����2Q��K�x�yT����"���*���p��Adf���!5VEp�V�~�fu5��
����QV���u��A�f�S���"���:U�|���l\������c~���i~��c��*�e�[����������G"���X�C�/�8��������:^�n�e����f�8{2�o���D���7{|s�����%�us�E�"2"'F�2`��r�����g����TE�dS����dJ�����#���R�o}�~�<�-9���"//�{,�z�)�[�EEE�+n�%""�[i<�\�)gBKj56����;���[���	-�)�y^�j\���M�d��<�s/����3�|�N�eCR��X�r@��Z���h��@�?����s��F5*���������a���_KDDDDDD��V�h��v�������A��1n��&�w�y2xy�������&"��LS��/�]@��AS�u��5
��z0%F�]�]��D�����+���V�s�p8����_�A�jL,�[6B�O�b=w��[�2���.UN�Z�,����:*|^<-�21wck��<�"���y(b��k�d� 3o���Of���y�@�/X+�����%20����d��8�M��������A��*�4�x���,��E�c���gjA�����V��Cfa�T�����B��A�T?EFF�O�>�>}:�<�L�p�	x���1e��Y�eee�%"��������@�g�!a����'_��������sW�$|1������2�[KI
�$""�4���ot��[=���u�{�Cg��}��D\w+b_~qo~�����g(G���_��wo�k�������V�J���(����\�Gy���}�Q9�;o�<\r�%8����;��+2��	#;+�p���k
\v��\��28�
�A�jR
���p+�]��p:�~�`����U#�j9��;a��jd��z��O��RTO�o����_"����k�����Jt(K�1iIPfT�Y*�`s��O
`]#�����_|��{2���L�$����:Wt4KP����R��J���A<3�+g`O��}����F�4��j�������pSS���x���Oc��Ix���q��g��S"��)w���2#u���j��P���.�^��
|� �/�u���t�q�n]^7�����u���$��y���Y�&/ ������AC���
h�[�vD���DDDDDDT�ju��n�#))	���G�.]��U+DGGc���X�t)�l�"3.�Y�|f�
l���n" ��Z���h���
0�aXEdMDv������`�[�������w�-���3��X����`o��Vmdv���\����q����M�cm������G����,L�����,(bD�jQ��]��@���'I����=<���r��S�����]��'z��pRw;�5�pTG����8�%�
����`�����6�,�bb�
2�U\8�!�3�Z'fD��E�g���?={�D0��0v�Xl����DDDDDT�T��	C3i�Y�f���2�o������E-U$F)�]d��5x
"�
v�X�+��� V����v�^�k�jR��_��%"""""��P+���+���8q���6m�-[��UW]���J���+X�|9�x�	DDD��""��*�v��M�������[��lP�.T~�6��"h-����P��3p�9���~�5J���g���e`�����6I�o�����r���L��v���9O��������dya��u���y*/XR�%M1�r�^���o���2�'�U���E���Yr�h����=��~�����&�,2+G���^��!f6lV�"@�e���O<��O����RnX��S��u�]r���}���{�ABB��D�����isU�i����n�uFaP�^h�*�5xN��z��v����#ZjpY���+@�Z��B?�
���~y�l�F]fV���5���Udb�v`S�!���b�!56��4��cLu����^���Z""""""����Y�g���o�?�����~����i���{���];�x�����A����"�as"��������\t%l�;#��k��5�k�p$L���G��p�|:����������1`Hh��[���}~byZ�����S�����SU����Wf�[��e����%����
A���>������_�
��U�L9���1U�\��r��U��:(���j���O��o��N�:a�����s'���;\|�������F�����Kr���.�������o��w�_rwh
��""jH�A���D h�y�*���\D�&*#C7������s��k=8��M+�������Nw�k�b��7.s�k�y���)��f��8��=Q�H�����r�)��Q���@eq�m��q�e�a����y3��y<���r���S�b������gFN"�? .�����t�*4�Yd ��@�?��P�D��,��{�*k}yx��n�]J��Z��?���t|�4���t�5D��g����DD5"##q������r*\��}��G���_c��y��k����3""�GT��g��^�d.���0+��~�^�n���g��'����}�b�UV�,�g M#�pLz?��}$�$w��4���p�[��p��i��P����>�f�����)>��:�=E&.�u�����$f�*(7�G��*4�k �����T��B"��y��ob�.eU����x��*�)�>^��'�vFu��DDDDDDT�j5P�����	0n�8�]YL4}�t�p�
���+��7�������V�z�x�|}�1�Th�Dp�FV-����nZ������	��Cp�Vx�}����{�#j��l����>�>��7������V�����4r>���V�dY%w��nDD��m�7�.>_s����/�Uj����<y���^~��p8�4in��6�~��X�jo�%"�g�T����F�W0v�b=~	c��0}Y���_2f����`���V����g-�c��0�'���:�]/��o��*V!�����pj�����������P�^%��^ID�{�7�����������;jL\xM��*�-5<z�#z�������/�����6��e}��,�q�/L]D�
=[hX�C���v+H�Rd�sF��v�*R�LD;��LT����g����%"""""��T�i1�@0������v�@fvt��j��/����Z'�,]$��}��[����
��?zn6|�Fp�V�@p�&�\<��Y����������K��X�U��<U�������
c�06�l��Be�U6�}�]@�$����a���@(h�I�Ud`�N]~��"�0U��d�D������[�G�HLLDff&�m��e�������\"�z�^sws�-����6k�����t2�B���,]�r=P�J�3��~j��@Dg(Ig�a�����;a�~&wE&�g$j�
TVI�k>
j�;��}j����_g����[��o �g����oA�Mw�s�%P���g�Z�^���v�HRd���HI�
\v'���O+
�u����6t��pzz��prO��
"�
��k������.�����8�(��QR�IT_�_KDDDDDD��V�Ep��M���c����/�UW]%�Z�x���>���3fN9�y�.5.���,.���G*�Q"
�\�5I��[Oq�D.���5�D��(,�*M9{��d!�s��}�?�����)`����0���0K�+�����ZR�\�SB���������Tvr&j�Dw����o��[76�<���i�/������:�(yS.�q�?��QZ���B�Eg���'a�zqs~�k��]�����f���W��Vf�@�J���&�#�u��;�uA�����"2�}Z��B��CM���GKD�=���c�A�C��������(���PR�p����(��,���,e���3����F��N�FY)J�%w�����2 [����z	��^r?D��U�x�k.S�g��!7<S��L��]���{?����yy�6o����ON���w�1k�i}^x����q	{�>r?��fuQ�5�0��M�~m4th��S�&�URb�VC�������Y�34���DP�tF0 :E2hYd\�������2����Du��DDDDDDT�j-Py������o�t:q��W���>���_�5
��s���d�e�52
�������`��lZ3�����`k��f-'�@QU�?�(��6����C�������5�-�)�cD���w���y��DD�����$���tl�3�� T����)�V�����)((���N�6
C��}���w��w��1����t��%"��A\ot��89B�'1���#f�w�����Am�����2��������&$�,]}�`m�b5��o6��+-r�
��-J�P����aX;��Y�����r��@l�0������{����R#�6�4��0+���:��>���G!�e#�p���w?��������{��p9�j�
<�^��Q�#�i=��7���5��/����+������J��5,3�����7/� 6B�3�����U|x�����
�9����MA�����r��"1nWV�a�a��!�������s���/_��sND��/��A�'�G�c��z�x�����k�������6�J4��i>|8�L�"3'�}��h��bcc�����f�����=`k�fU<x����K^L���8z����28Y����Q|3�����X�B��OD���O���Q�U�6��������&���xEGG�S����3EFFb�����};�^o��v��n	��<t@j�#��
/�{\�O���3`�|P=������]G@�=��=�Cq��Y�F"�@f��3�K9�[;nj�f0K��v����_ ���(Q=w+�7��@UT�
��_]�DD"��{�5ki�f�LT��=��!z��^���"��Z�t7�����Vm�5G��%���`Ko5:P�P"����^���8��
��w�0�q(H��>���H+�2���D�Tv
X�UG�H�U���i��}���f�*�
������?C1��X&�?�*�x�U��k��`�����������Z���lO���	�w�"`A���`�zU���c��P�EEEPE��!tHBH����������_B��;wwf�n�afv�=�|����&�H���Z�t��/��"5j���YAY,���+�k�.�"�N;���P�������,(V��SU��V\$��W����r�K1�O�5,�n=�<w8���*_ODD�HP����G�G���c<x�Y1��8��+^#���U�'�:M\���q9�;�������ns�E�6�����c[�h��s��Q�D*�^w�ux���}�v��DD��H���7������o\c�|`�n�p)%�2_Q�D����_�|���{.�P+*T����hi�2�-�;0������y1&����Aw�U$!��AE���~(
���d��
o�b���j5z��Q*���=J��P"A
�0�J�@yK�U�kD����5���������j9��-�i#�m;@	:$����r�HNVBB��Y�_�{v�H��%�p;F����m(�q���\P��3����FDT���rd QY�j�J�����Q�*�`w��T����G����x�!UC��VX�e&
�c� ;�����[�C��[�>��io�Q����������jR�$*b���z
o���8�<���x���e��h�"�x����c���N'�"��x)z�1�S�������	o���6�l#�m-�@
D������O8�)��8����G_����g�/P��K���D��^V
� ��$:>���k���C���?���y��N���h;2�y��������>z�W������;���
\���/$"�?�KtL��������K�4�����rl��������?���~v��_=���.9\��3d����g�$"��@TL�d0��2ww�dL�Lb���C����m,>�q2Q���r�1{�P��\�=nxV-3b�b�=���P"������5j��P[C	H���6�M���A�<����Y)Y3���k����x
��bE�l���vj�NSaMj5<�����c1}������a�2���Y�����xZ6g����9����B/-�D����%�n]F:`�0�
��w"��L�@I�P�������^$E���
���9C$1oL��0JEh�����b�3���l���-~���$���0%�^�J/�����@�����T?0�%"""""��R#�������V�Z�)S�������7�����Z�b^#�`��+���iCt����W���;��
�\[��r���q]8^�(��K'"�����sP#�eATC	���>�
l���j)D�+��V:�C�������7��k���$�V�^h9?'��������y�=��E������f��>%���A�-�ki�@��^����>ym��n��f$���+v����x��<>��y��O?��.�c���U����~�]�)))�>EDT�XU"�a��9l��C�^k��t���l:��i���B��O#���Q��C(�6Zv&���23`Mne�H�����=�-e�`�g�n#�����h�K�
���]������|��������xm�'xc��H/����:���F7��w?X��P���(��s��{�n����_E������2�f�%.Q����9�^x������P�C�����:��U�o�58#��n���eW����Yd�dQY�u#��4���r��N35��j�.��:A5���%}lxf��z���x}��8�l������X�aE��8����s�}�k�������&�X�rff&�����GL~RU�Z�B��m�{�n��ns
�/��l��>
����?�D���W��w���C�JTI��%@T��0VI�(�Y1l�%���>J`;(A��PZ�V���%`
�=�|5Q��|g���������x����|l��#F�@tt��kE����1oLL���+ca""��8�_���O�C��_!���|��Q1�4l��I7���Qm��,��m`�K0�8�\.(")w�8z�3b�#nD=�O�co�>|�y6n_��X�$>��=��r��J����p �?O!j����d�,x8�F�x��.-�]��b|��]��{�x�3�.���2������-[#��W���P#B��������Q�qv{+��=3o	�G7���L�@L��f
T�t��7����
Btkj��C�hS���T���?:1}rZ�*���.�Ju�Z""""""�I5��,[��)�����������������������������0���A�x�%����O�`x��~2��
qa'^K	l5n���d���D/1����P"�KL���g��nPB{@q&BM��B�e]�F��`�O��@�����o@DTx�Q8KTVf����j���5##��N[������p�X����j	�~�y�@/�j\�eBw��y-�
�t����� ������	-7ZN6�����O����lATw1�%"""""��T#Y�"��Y�f�.�w�}+W��C
��755o���>�c������������aO��s}]���6L>��+��q���n��IDAT�v\����I'�1�w��d
�����e������\[�i���������e����]�_�l���r��Jp'd�����/��_��������l����W��/}����.���P���c����X�=�Z��.s�LDDuOHH�O>�,@NN����i�&���{���2���DDD��^��5��m���wAK����@���X�5[Tp��(z��>
��=��iO����������QM���R�m+��1c�`��
���K��_?���������0�%"�b���U��������}>�{��������V�o�FN}�7O��zY)��'����e�~��9�Pp����}5��6P����t#��h���)�5�b���4���8�����������6{��������?`@��N��������$5��fga|�0��l��E��0��y8��@��5�W� �,�#[`c�v,��
)�;������Qy��k����n��f\r�%����q�UW��~���ceLDDD�����qC��=�+�l�����
~?�[6���Op/\���
���q-���
��13g������:�E����+0{�l�v�m

5[����3R�`���c��{�4c���-����?���'��o����K�l�:\1�^\����-}9��X�qso�����[j���j#�MA�h1!
�m��� ��C�x�p����|��uB�=!��;�8]�r2������}�V\���^R���p/���C	L6#�w�;���|�F�5��.w����8��
k��)��JHw(���e>��QP���7JP{(�]��f2�yx�3qe�Qh���B�+�t����:��E&���������|����Ip��$!�x?��q����V��F""��$99��O��O>)c���pL�0�f��E]$;{�������j+��DDDDDDTSNz��������������$+*���kx��wq�M7�e����]1��?A$�m���7=��Z�����(����BO	������g���W��A;����Q�������:{�1��[;M@����l���[�E��P���j�rk|�����;\��B���b|�(kE#���<�sYA�|�wr��?�^z�	��m�
�P��4hy9p/Z{���5��2(�G����ex�n���*����!NC�����f16�&>���y�b\X��'FC5�xt�
2�u�y��C����[���_��x�08^.���(��b��H���[v#9��]x�����YO�iq�}d2��������j'�9����������7����Kx���q�u��y����l�\#"""""�Z�q-�*'5Q9??_t�e�w�8q"f�����r��DU�3���^��f�
�����^��hS�Hg(�q��%�<a�XT�l*�~��p�/�����d�o�L�Kj��/!0oo�)y;e�r��f7���j�OGj���RQK�8lZ��{n����4984�����#���|�6@��C�u�"j����]��6
���JH(�]�C���������1���V�%F(8���v7����NF�����jyE��A/+���y(z�Ix������]6w6��W@��D��/P���SwW$6�y���g��A���[�
���rA�g��^�.Q���:��������A���c�f����j����=�?�My>���j'W���_}��%�x�h'��S������Fjq�Ake�Fz��5�1���M�k�Z����M�m���k���K�kWd��N#�!"""����tR�E�ZTT�����51I��I�B������m�m��ef�S�~h�����a�����OC����6}����D��8�����ih�u+>9�943�/N_.��st�=�q�h:^����w�����7Qmc�*�W�R�����a��	K\<�-�h$*D��A+.��
0^��^��S���JP���h�n,�mZ�n�{��(~i*���
�b�����*���	Ud���n(�a��a8�	-#��;+���r�o�(�0Npr��V����g����B���VX5 �=����x|�k���5��l�I~�/����r���57z�v�o��{�����0D8E�f�����n
�#9���!�g�o���j#v��-��9��}~M���|/o�DR�X�����Ao�#��ov�7b��X���r�b��%������7�n�qQ]���������N������>�?���q���gc��Ip:�����&��j�����$�6yj���������1��
��]%�=J|n�����;_�������
(�U$��+��qD�T�=>���"�](��
E���}����8H|�2?��
�"���jUlq���}�(�3�������p�v��o���nF����X�.��A��3�]�Jp0�������+`����
�u��3��E�U��:��\G�q�I����������9-<��XV������aIH���?;SV����S�w�P�X�r��8��/�g%���EBr��6�
�2�����J�������p��6�<��@��p�������IH��X��:)��
#U�ia��m�8��
B+nx"���j�]�t��O?-��=�$����uDDT�m8�����xt�n����ry��#G��x &�� ����=�+/Dvy���dl����[�o�B�w�~�7d�j�����2��DDDDDDt*�htYVV�E�a���x��'������b��5�v�2[��}!J�������(��>�3��,�
u��7���"eb]E��exm�'X��q�1�Sjy�z�/���;~1���������
0���kb\�CK�%~fbO����eEf�7NT���:vgk�.��6nk���=n�����]G@T6�	��VPc���p�5jp����������u�*+�:v�� �b]P$�m;Z9t�q����?����E��<kit1j��/�F�d���|2i����Lp=�c��.[����
Q��w���������R���*y�L��Y
������M1�q�ME���c;�*����1�H\�f4.m9\&��Y0q�
�������q���.��2D�;�����x$&&�"##�~�z<��C���;��R�l��������N�{��	}�����q~��r�W������m�M��nU,������j��m��{��O\g���u��
��@t2U�������2��DDDDDDt���7����2!�����|����#77�����zJ!Dt�����Q������x  �/��X��d��1��ls`T�!��g�u���>�t�!���a�0�ao�	o��[C�����C���������V�$ 9�1��w����
�����ED����O�c�z��9`�3�.�s���3��-am�5"J.s����m�k�M��5z<���K�8���s�����u��=�w��so�����	U�B/��w�c;$���=�����U�g���h�f���_���w�vl�_���u����K�Ov&���cU\���^��^�=��cp�����fc�/,@��O���P����b��ee���w�����n�_�
����MDT���������1c������?��7��r�-x��g�M�DDTsD��;?�a�����IA����>\�<o����E��n��������X�(��i2)8�b;�*��]��X���Q��Q����7}�r���iDDDDu_zz:�Z""""""�5��,*�n��_�5����������r]TTn��Fl��	.�������������
�����XX%�P���U4Tl��E�K�A�[��B��$���/$tG��H�D�Yh"��Nt�j%+�j�v��(W8��w�mE���TT��?`Pb/�
o
�j�������9�:�[���s����������^lJ?��=�G������!h{_�?�6c�z�@�:��6���~��f��yesg���|����������Q�x=.�
��=e��%&��c���x��Z�y����^�	�q��W�m������ym�U��4������C�m�����m����>�X������c#Z�Y�fg��q��������e���c-7ZY)\#���0TQ�\����o�1��l���]CzY��W��i��]���DT���u��i������~�������h��n��v����2��0��������xK�����O�����,�����g��S�������-Gz�~Yy������]��1�u
�i����j$J}e�b������sDDDT?����^`\KDDDDDD5�F�E��m�6x<6�Z���f�����'�m��n7+��!4
��\V��� (���{�_)�������+�~(���o���g��Kd�����L�:HTeV��K����;1�?�\GDu�����L��t
������=���[3N�KT��%+(k�����~��e;��Q���n��_�����8����G�}��.�[�E��q��*+J�:t6������m�������% jX�g�g���x�q.����NO"��&P���x�����
Z���
�B/�mO��0��7��7������M�����=�W������ "P1K|'�{���D(�5��(.h�E�mX������PU������%"���'��_|����?CK���'������-����1`�����n���#+S�C����H
��7��g��Zpq�y2a9�,�6����q�U�*G�����k��K�P�scd���	����=��@����=h�X��EDDDT0�%"""""��Tc��^/�V+��U.	�x�H"I���/h99P\K�����j��gC�m��y�&��g,�C	�(�1c��6�� % j�u��Q����DT����(�n����+N��FZ��%�c���|��r�,���M~�N�a��C��YlP����IAU�����Et%��)���e6�a��rG�v�.*����tci���9���O��8��\I/�=o��Y��X5a2��O@�%�f�!=�c��'J�e���P����>�<>{s4�,Vy�vn�^V
k�V��b��D2�;3��4��-�o�9�Z������ ��O**.�,��v�u.Q�!bWq���c+Gc�sU|���m��N�jC�pM�q���h4
�G��!��u���������7��l�6�9&��Im/�#jJ$2Oj;]c���g"""���q-��IT�X,�������W�Fii�nE\XX�e����y����2����rx���/>�w��������e�7[QU��4<���~X������7n|���2��~��A/Z%������������p��\PQ
W�������dB�����Q$�=c��QP"�@�
��G���r��}��V�t�H�9E���|O	4c�h�U�+����b_I���j")��[�����������u3���������D�-�������LdV�#�]�Zvf���2�s�Eo�i��������e�,|5�w�����$��1���3�Vt��Y����=�����������qmbb"�Z""""""�5��,��m��
�u��>��~�)������?�����-��"�C���DG�
P��L>|��y�/>����5�QuDU�=������M>����w�9��<hioC������s����������s��l:
���>�j�x@�����iLAq�B	j�%�sR������P�-7ZUtn�/�������^�{��FzI&6����kg�����:����c������fc���lc�=����[�:��D.�G�7���G�$�O���]�
��Y�\^�xW�	-'��eBr���n��-���"X7����=���4�5�����.C��y��r����{������>� n��6t���[�f�.Qm����U<���������#��DDDDDDT�j$QY������q�����pCBB���o�������Cq�}�!99�lMT5�(�Y����C����{�e���*����:�J�z�����=z�"���T�
%���%�b���C��v��1/�Q�)�-"]����$8-v���BZ�~�;��Tf�h�!1���{M�f9yNr�rh����
�(��r1��o{���,�E����c�q-bm��Qc��{�EN�	A��ll� ��u��C�!a��KL,kER7�}g�q��	�G�r� ���c�\{�����{j�$""��@	j%�������U'��	�Q���_?��DDDDDDT#j,QYC��p_}�U���x������/��g��w���\""�ZH������\�1g*�*L���ur�a�b���wyK��T�)���|�n��g�"�W5| ��iP�=���6&�@���Y*tE�r��H^�EB��������e���EE|`�o"�}�����eu��?9vei�(����"���|�}��^8�s���6i%(�\����������6�l���W���x�`N�����6���o":�,
�O>��}������#o�7�Q-c
6b����_%��n�<��u>��w@mt�������c\KDDDDDD5�F3%�����o���g��o��>��=�������2��esv���+��s����+k?��k>��������e����������09�g�0�"�'G����!	���-�������:������k��pI����(���������B�+�2���jxk����a�6?�����~dU&XU�������^z	�_=&M�$��]�|9�~������j
�
%b0�OCm���KP�L��lh6&""���QM��D���"���������O?!77W.��]w����~���fk�
�w?���a��Jp������=����S1i��r������7�1w�����-k?J?�����['WLw]�����?=�lE�_�
�����`e�l��-'���Q��������ep���L����\��"�h�1�HD�"�1��HH�[��_����44	)�>�����+.�eb�{�<x�G7^��bZ���3Dt��7b���x��Ge��x�bL�>W\q>��s�|>�%�F�a
��jlLMN�$@u�m���N�k�Z������P��7��H7���(�����y�L�o�6���C���"��1(~�E��%(��=��2�?��Wt��������ITw�n���~��x��G}���{��=���N��=[>���!���E��I��Q�<�$���
0��o��Y�7�}�%�VaM�f9���(+����3l/�c�$��B//C���P��;����
k*�5+Q����K3���lM�"19�,��;\����v����K��T�:{�,y�3��K+�2>gn^�(���
���.mgn��a�����n��?�n���x'f����N����V��e�����k�_�a�bt�i���GW.S-����g �����7^':HOh��i���+���@G�1���Q�6WD���3� 44��������t���������/�,;|�������j#��"R�k�*��k�^8p�3����B���}���t���mXkrk�=���~����FK
�sG������s�Y���
�������U#����[��l�Z1b�4i�Gll,.��B���k��Ay��P���j/����V�?���Z$���i9������rhu���WK�h����q�����/J��[�.pA�%��a���3�L7~�������H+�<j�x�����
�[�a.!��B�����2a�&��uw9|����g���4#��f�;�P~����e��y�X�n��{��j��8���������7�����m�DkO6����m�l�[{��/������,�����������bl����������c��%(����.��������[��0G�k7^n�E�����*~N=0(�.m9\��}��������b�UmF�������}`��d���m�T���s���d�8c����:	��!"�R^^��_'O��-Z�K��� L�8111��co�%"""""�ZI��k��e\KU�w���I7B��1�T�6l��W@���U�mm����L��{=�����%8�e@���Eb�����@DDDDD����PU���p:�2�������$f����!��n**��{��g/u����X��/�R~��C���39�2�X�������g�1�L;����#�����.Q��t
_�����@
�,v*�^hhY����|�����bZ���)F�\`6<~��I����:��LD�����!��e�����Szq1J?z9��B�9�+�s� w�x����"i�4�{2���P�?��]@���)z�O�5J�C��stk<����hf��5�_����li������6������[>��??�?����h#�*g���/c~h���]������l����m���o�X��n.!""""""�]D\���N��o:<K�����s����r���u>l]z�����"���FDv�fzj�{�i��&*�J���mCJJ�xE����~��K�����0B�6m��_~)����C&3S�W��aQu���h���(�r� r����(�R�7OG��W� T�j�O�T��r���
��-q/��P���#���
�w>
�h�1sH��/z�th�������g�*�|`�#3�$�������iS����\x���Mb|�8�?��������&��CQ���i�gNa��C)����o����%����0>yv�����xe���p������Ye�fk"":�<���e�)��=Z������\'���O>�7��m�V��DDDDDDD���q��Q���	������h�p�w�,.�eg���bX7��{��v�E���5,��;�(�������������.�7\-�M��g�1�����
�������Xg��6�h{��|�,���x�X���x3V9'"""����F�������{q�u���G��U���;�`��I�2e
|�A�p�
���KJJ�T���X����V{����a5WB$&?8����,����
��u�q
�0jx�����2��
���%���3DDT��i=Dbr����M����H\.�m�+�3>���k��$�XU��yK��)��i&���N����V��U�WfnD�-f����?���?�k�������������K�.���+�N���~�	c��A�6m�P�={��s�=���������DDDuX��D����Z���DDDu�Z�����Q�����[����F�Go#�����m2���C��Yp/^��w_G�{oBq���l�:�Df��M2����^
�����P6�C���G���JQ��L�vm��O�X�j�q��������z�\�x
��+�����Ow��s���`l�_���A/Xm���W��%""""�KNj����@�~�0d��u�Y����������Grr21h� �}�������p��[O�,�3u�W$������h�dAZ��UA�(UJFN�����6b7���a_�E��|����Q�9`i���(@9t_�����s�����w���j���N(6����1�~�c&�x.>�*>��nP�Gb���Xp�P�>��5����`Db����d��H�����_��b���X��Q��\�p��G���q!� ���Pki��nX��������2E���������8:#F�����cq���b��q6l�;�<�9'N�1o||��J"""��:E���}n��o��s������\(�VS""���q-�5*]K��P��r�c�w���'_B�����`�^���K��L�y?���W^+;�E��j������aX�[��\�����e���7��}
�5+�?btJ��e�nX��{�����gB	�%0��Vt3����|-�k������%@�
�%�<(�(���_*�����R�=���$"""����������@�z��x���;���"��f	AT�;�J���_=�f�
#����d�^?d�r�W���V4�V��b�z���"6LE�2�c`B���R>M�	�2��)�'@DD'�b���b��=Y5Y	n/�h��H�F�_n|h��b���9��@$�7��(2�8����18�7��u��&g�eq��F��)���wE��.��]d2�c0�����V�����c��{��>����UL�>��iO��z9��TNDu����c��x��'���/wz�����s�7���~���sQ�1>w�i��������\.�=����x.����4��������R���Bm$�5����qE���v��oDDDTw0�=��ztlL��f�_�v��O��U�l��@���*�/�oLb�[��^P���\�E�����^������8�2c�F��*E^�	�����mX��������P��w� ��6!��@�D�%o�l��h��������MNy�|M��C{=�4��k�dh���J�X���g��p��W�� (�%:��e���~X�=
K��g��n\�d�W]�t��������j�h����6DDDDDu��W�����\�s�=��i�	���o��
����K���Z������
��c@k+F�h�@E�]A�&��f��m�t*����+��qY_;����iS� TAb��~���b��tv ����>h9�F����DDt�Y���^��CP�=
5�B(���DY�P��Cmx��|�l+��l�hW,�E,&��,���j�WVT���~��c���**�D�1��A������W���&�W�	�
sZ;�����A�g��d!|)�����b������t�GG
�GDu��g7o���3g"==�o������;w.���[xDG�	���BO�m�K����� iv?+c=�'�x]�0�;��5�X�#��Y���m�#�K6C���^��
n�wDDDu
����H>�=��/��b�&>���������6���/~�����cO����{����t���u�;�4,���������y�k�9�v?-c�m�B/3+ke�v>=�UcG���Vgo��f��=���-s�Z��X�����'c��~��r�s���M_��������H-���
_����(m6�nE��@�o�0��C��)��{�p��{�^2����b��w�����T1:���l7�Y����
�	x2�������%���z�"���eW�=s����������������/��7��5k����:qC,_�~=n��9���#"&�P���m�-�U���(�	Q`�B&-'�����0LT`�������>/�]:Z'�����q
����w��|���=JHw9A|I����������������|#y��=Y�6]]T�����)�[h)w@��g4����.�������]���/����p:�X�jn��<��3��aC���f������;���+���o�)_k�X�DDDt�)v(Q�Cm>j����2�WXQ���_tQ����x,1.��������X�����3���l+����PX*���!�kOOn��Mi~�����������\).L���VK���.��6	��\P������5|������v�>�~��p��I/�5�<XZ<e\�Y����J���P"����	���G����8D8C�Y����r�=�Q�#���/@J�.�.JC\`4�4?�X��G�B�5z���h�6;3���!F���������}iP��C���-���~���f��g�H���`������:4��A�v��t��3�e|b�?%|��v�q��Z�m��7�0�Z��h��Db8�����(�DDDDT���oTE�z�u���������v����(2'N����1i�$9/���B���{��'+1��D�������urh��G����{�]�LuDDDT���|egC��
��-��%nN���n5�S�{��1>��G�����PM�4��)S0a���s�9h����n�I�6l��k���#;}{���W^yE��V��|7""":�D�9g�����sP\d�9�
�6�j�'��������j��P�e�-�@����u�	��D5a2K�c1(��LX&""�K����~�����O(�G��e��$��W�E��&�p����A
n:�������0���!������w��"�%�xCe�dqM����?p��^���w��i����+����|nX�w����h������%�!�������dLj7��
�9��l[S���]�^8�7O���D��o����G�G���`�������l���X�}��K2�[	�%�(�m��\K�7��z�����^�6���m����PmC��I~j��D�m�FDDDDDu�IMTD��������JVL������p�B��?������p�UW������u���w�R]�w�j�}�<KC/*4WQ�#*9����h��x����Y9���9FN�>��so�W;����!":Dl���Gc����SWt����}�^�u,]�qqqx����b�
�q�HLLdg.Q
�R_�oq"���6>�-���K����c�+e�D�L`;cj5z��@��5Jpg9b�H$�����MV�������o�8�{��q�1�EDDT�0�==Y��e�YyX$)W&%���6"HAz���|�-�b�[e��eVe�U�����L#���\����_��3&A�B1�7���e���E-����#����P�)BZ�~�;B�U��<w!^X�>.��Fl��&���36��e�>�"��A��k���|���5,q��4l�����1P�������T��(���H4�q��.c]Cc]��do��Xw�����f<G���q������������\I$�j�
�?��l�n��u��a��mX�f
^|�Ey�.]"""��oM�f��n��f�K��:v�a��7��`�������m�n���������|9�����~��^���@�5�5�X�����sh;���*����5��@/^�`������3��}$�A�����z���%����8���P���*���K�q4|y��VXT� "���q���iS���
~,��Gz���3K��o`����.�qf+Z�Y�������r�`�<������c�q`�0����Q�Y��Pt��ZaQ�r������9�9o<~/"��X����Z�GTEEny��l5�{`Q,�hx5/�F�@���������������v��D�#����� y�.�^�fo�n~1}$�\�'"""""��X���O�H��=P�	�x�W�
tj�%�K6B�G@I���%���~���P"������AP�G�n	�3�34gcd����]d� """��MTT����P�35�oeET��m�^���X��m+��m�ZX�J��)����Q�
�$E�i�J�P���)P�5���E��k���6��p��.\q����^���E��		
�>'��s�������a��IH��B/�mbP,�.N��Q��!��v�-�{Q�t����������<�����n��	R,PB{Am�9)�=���j���#J��P�=��}P���8�"a��F��2�Y�Ez���fC��
�����e��Q]!�����a�@;z5� 6L�Y��q)"O�*:4��fa�BVM�9���hnG+���!2��:��j�-�ZJi0p6�w����b��������wY��b(n�p	�L��HW����1h������5m��EX#�;BqI�����e��?�����!��l\��"��"��DDDDDT1Q��������������.�=�?�Y��a����~�"<�b����j������������&*��[�e��a��7q����?_��}�P���/DDD�����x<(**Baa!JKK�i���z~�%%%�5���r�H>�O�mD�#���#~^������n7����Z^iy�(��C��:y�]vp��JM{B�'"""""�
��G"(�����}{4o���������d�@u��%=z4�5k�������??,P�����!C��I�&8��3�����f��
9r�\�]w���RYY{�1����2 ���Jt�_���UL_/�a�N?J�=?�%�|h�_B����)�;c���;S������2GN�o��
����DDT��O�`�����c����|}�|$"���n���s�X���N�!""���>���w��g�L��^�z�[�n6l~��g�$\����>����kW���O�����Jx��e����:�,��1C&$��x��E7n�>�l�3+W�<��+~��w��g�}�V�����7�����/��a
|�RN[6����Q0�V�%�Q�MT�����O?���x9��� 33W_}5/^\g�^�{�������dPz��7c��-���;�b�
���~��7�677��~;���0a���\i�������t:�����&M�7�|#���>���h��-,X���W��g�9p����U�6�M.�mR24��Q9��v�����?���r�j<�)f�>��hk/���bh)w��\`,g6��s���m�x|�x~�{rzz�;�u���4�{��%�3R���?����D��}�v���X�f�a7��V�{NM?�g�Hf��
�=^��^���Z���_YP���������v������I���?��?=��?�|���/�\�c�����Ul���7��}���HF�6m�LNrrrd��={����Brr2^����b��T����������������o�x7�5���������D���lL�:��OG�6m"���]q��=��s�$��D��3g�����/���;���[d��s�V��R~~>~��'4j�H�7�tf���+��o�����d��w�}�>}���$�E�����������`��<h� 4n�X������b�x�H�U�E1z���F�
��rc�v?ve�����j?YI9o�9w8-�+��2�Q��{�@zI��?T��R����=�""�+Dg��Ft8&%%a����R���7�����lIDDT{��
3��fU�Hl`�Q}Q_�Z��*�`/��B\t�Er��{��aaa���Hd>��W���0�H���o��:T���>W�����������}��bS"YTU��"!Y������A��[��+
x��eQmY���u��A/>��HZa������(�{P�)1�����Q#������7�@��G�Sdd�\'�
���k�������j�����V�5+���$x��;�ER����[�n�I��o�V��E��m�d �w�^���Y����IOO��D�+�$P��:�^��+����b"�����j���j��E5��rVT&"�:�t�����bo	���9[�-=�z""�}�p����S�Nx��Wd����$:%+G��_]5���N_q�Q��!� s�����A�����"����!���s'JKK��C�U�E�s�V����U��������0Thh�\&�\E����}�����]����b+��;v��e���>YA�������"i�n��I��y��1�X,r}�W;kd�]�"�7N���6GO���.
���*����|2Y�����w5����~��l��@0'�$���h4k�2`��D`���Xs	�r�d��+�C� XL��t+%&&��Y���"�X���F"!9!!AnC�s�:Q�z�����D-����K�.�w���j�����`W>�f��Tq#��Q�d�V���G���Mtf��ar����eQ,���9x���py���|��i|�0����x��{����������0�)�����/��+�~���Y,J�:�	X���n��\RA����jQY�m�Dm�[I���>a�z�^���M�b��92yY�����,����_����;P���9c_��KC��Y(������o>�g�J�8a��o������n=z����o��������nS����������=�~�m�y��2���������W&������������[���%�;������ >>^.w����[2�|���ez�+V�J����%�\"�)�o?���1i�$Y����^�w*�u�Y�����,Y"������Eb����D`,�k�1������_~��rA�<L�9
6�?�:�._Q���|�&k3����]�1
b+�nnx����:{�z]>�x��I��yU
���3h�|�v��X^�I>�����-��/&NMW����}O�_R����2��a������p��n�=�'�!�F���qsDx�EB�4�z���p��Hs��������K�
s��T����C00����f,K
��-1p�����{B��]��a�#��&A��b�9�� o��=.��M}����+�������	K��bf�<�kU�8�7��D
�S��N��B��Wv���%�K)�pc_i^��� ��.jy��G*��[n�8�&���(�g��#)�6�������/����=���%9`��MZ��}����m�xw�9w4q���(������;R�5���'�mR�4�8~�C��],z�C����!��.~%Hn����5G������\�X����v)�V}�t�/�������$�������
�
6���r���>W�YZ��6[�bi�:����R�����^!�16r,5�Y���!��m���������,���l�/	����sGKw��,�x�y��}e6��6�.�-������o�q�]�+��;��-3��q�9���{@|�4X��+D����s�_	��9?c^�����]5C�z�s'����X���N��m2�+�b����o�r�Q@�>�"t������8������D����������?E��������}�su����F����HNm�����xK�>���U�l�'O��W_��+W��n��y�#���UW]�a��
����������Kk>���T�EX#<������k���`�-�,[j�U�9r�&�����m
����5US"����w���������yuF5�[:]� [��/kH�Y�B��{�^���A�8	z�JsM,�4�
%��-�����|w���j������?8���"�������|���C3���!J	j���PB�`��Ex����5UK
���C�@�#�\r�q������������	���V�D���-���WQ��P����O?�Tn�Jk��������������o�������/q��7���~�U������X�����[����e�3��E�)��+�[�hq��suDu�}���@q/>G<4���hnsY%�����au�7��C-)B�s����i��Z��k���V����b���p{��(���P��!�0���E��*��}��}jJ�}���E��+Q����Ez�x,i������#��aWY:���
{�3�%U�`�1�i��^&�}�|V���L@�����ua���@)�:��R�������9G�ULL���Xj$QY��M�6�����P��=eP(��I������Y#��s�=�V��oy��e��O'*�k�N����E"�������u�]��5��/�,E�-~/�� V�1,~�c����'�|R>����kQZ�k�{�������3�����S��B��}��������M���?���3��P�P}�H�r+��jhT,(����j.hu
!����3��U����������*(�mNh���\-���,Li���vD�����~�7�z� �8;D��"tG����g�0nt��DFW������&�����S���
��BW(G��m�26�b�v�����dD�����v>h��QB��r�������|�F��2��ds��l�{��3�JR�����.�p�OU�t�`Vp�����^�qv���������������p�����CYd��EnWvMVsWPl�'%������m�3���)�FsO���iV��1��V���w��*���^����W�g�������a���[��f�t+�Sq�X�N�u��al�O��K1��&J+/��uP~	C��y������=�ar�l���������C���O
��s&���&��V���Y�S��b/�l.����G�8.�����:�]��WG�]�O�8~�(����t��OV���Pl�SJ�~	�������9W=�	!~sq$�m�G�W�G~�]������R\nGv;��iv��g�q�l����0�2�ET�H��\����fm����w�4�Wn�����M�3��f+������������<�0>����Af����Fb6�,;o�;1Z��Y.��Rs��W�:t�H8��s~��7�z��r��w�{�=yS������O��Q����nb�����\
&����0Q�
�_�|U��\��S\[U��H��6m~��W���+G�h]]���V$gO�>]��V��,���v,�}�G}��oV�y�i�F�}��O|��!21�XE�D�����+G">�4Kr�n���[y����
�=��Ax�;��nE����9{������
W���+�6!C�!)"�n�
�-���V��=h��o����K��-����|���5���A�XP�=���3�W_)���K?����X�*��U��t%E3>n�'��i]�CW������E$�W&�g�<���U&�������,��Nl������b��mT4��?��cL���:\����g��e�
����8�>Q����76��]|����M,��k����1�'U+��1c��7+3���)�\M?��4c�)v�Q�!����c�Dl�!bG5	� ]���9q���_j�������hQ�Z����t<n�UN�����c?T�*;�k�_����vc�q�O�����cB������-(7>�x~������9����y�8�>�IX�8O��l�F���c.���S����9�j����8��#���F'����q�y��sU��De��v��M��w��I�"�V,C��$\��+���D�+�C��g�o���b�����w��}�������k���Qt�`STI���J�K1����e2������_0e�<��2��Pb��~�3f����E���ZT���	D���kW�G���o���k������������y�y��\��5���?��V���Y�m��G����H9^���`�q�J���2�'N���4�C9.��o|NVs�(�kH�����ER�GVd�Jv���� Y�����~{xs�`+=�'�C��H(�	����B�H���e����mUu3�a���"�bC�CCb�A���mK����l���C��=�v�����a1�a5���P�.c_I4����{��/N�����3���Us=>�������	�>�:5�,
l����zck�{�y��8:T��m��]h?�,y��mT��Wf?%����}��V��S(��@�5�
���TP�'�Sq�(�����z���B)K3�_��&�U��J��^d[mp�+��`W��O�8~rl(_���'��&j��<~�mXS�� ��Ml��\���'�8~��Y�T���V]]���#�@	4��1��b����������x��s�h���c5�9\��M|[�N���%�5r,,-Z""�8~������'�<~|���I�1��\��)��m�%����h�9V+�����]\>��:��Dl�d3�-7U,���
j�W��OR�`QZ���'��	5[�]��V�
2��+�?�"Y�X��B�q������q={�D^K�o�
����tL]����h���1����\��Fv06N��/g��q4�S��h����Y"���Dpm�+�������&�%����EO��_}�B��jdhvqs�������P�:t��[���FqSjpp��sE%%�z�w��sk�hADDDtlLT>����S9_&*W�����
�O���~��W2�Xl��BR���X�y�fY<K��j��
2AYr�0a����U����VQ�Y���"S���7[�=��, �h���F�����Od�j�m?��c�����h�H�������h�������~s�o+���ISp�1@�L�8��\$b�$e�/_&�4�T�L�yV�n4��1�(�=���_&1g����V�������cw��bA�\��=e��k���������n�V�m*9�>l��BA�������yH/����]����3�'��W,L/���5
2��}$������a�c���d��
h�[���{����*F���������lw>���J|�_���D������������W�KA�h��o��?#�\s4�f�u�����6��}��y��:�7���(�c�������iv.������S�+���c��THn�c\
jn���Qm�]%����$�����c��G����Gy�@�d��dB���K��x����+��������}��Kl����"�_�j.��c�E�w��g���4>,�I��/�"�"��������q���O~�^�������_��g%=�9��e� ��`9	�������������w�����K��:�)&4i��<<?������M����\Z=�E+X�M8���MC���U���ji6'�U�	��S����]��QZuA�J��zcH|/s��9��sQ!�/>i.�����<e�4�x,W��-C��?�)������k,QY��HP^�j��De�^�z�_�~h��1k��������e�.���4''G&��I$*'&~����;���[����T�,�������w����"a�����_T�!����~��L�Cu��E��RAAn��6�y��8��sp���������K�b������P��#q��f���vcq���7����l[S��oo8�m"�mm�&���.'�S��k��[�?G;���������=�{��<4���*���C�
w@	�;� '�����K
��������������$Zk�fr��:��$��&�s_9z�_�/�~X>%�,����\1_n�Q>��=]'�����su��W�:�_����y�%�r�c��{��G� ���9W������vt����_�@>�Rn���U��*j�4��,�u9J���:����6�9W���]q��w��u�sWtF����WtTV��JDDDu��D�j0�T�W���U��"���D�S����"�ZT)}�bd[Q	���H�V+���~��BY����_�o��2��r�_QpKT`��D��+���'O>��&�?��R�@���~+�r%F�����1r�HY�J���Hl��D��SO=uX�f��
Ju��~���w���2��!�l����57��Ul��a.9����-/�����KN��}~<��;2��J`&�i�����t�\������D�f�vlC�3�T[0FPN]s����K�����[Q\�:��_A�:y�L��d���#=o���o�8YR24<������V���v��e�?-��L�VP�(�B�������q�N���F����m��{�9W{���8�����<6���-,r���0��c'�Oy��C�����8����Z�`�����x�����)�1��c'�
��go�&?��<�������n�k�Er�����u�8y�q^~�����`���h����	�N~���9?��pE���ex~>���s�f=�|����U�^q
\�.?��sVY��=�\Z��z~>a'x~}��.{M^���c�cl�9w����9'9���K���9?w����u,/��7z�u6�N����!���"Q��.�w���F'N�(���+I���G$�T�y�i��]2�o���8�%�����#5�b����jERsrr���WlqG���,�*�b�%��-�i���2Yy��rFDD�`Z�N"XC7U�T7��A�o7��oZ��N�7:�m���������[��Ne>_m�*<~�vB��I�W���sB������rB����l���U��q���
$o>��6%�;1:QmV_��f���y��2�X$ ��W�H,&QaY���~S��*�<�����2�X����[Qlk��=��v��������DU���mE1.1���I��}g��-�P�S.�KnKQ�J�\��,-��W�#:���\$��%���0M�V�-6������~a?��P��N1b��D�������s[�*Y������������{���g���DE�c�C�����PY�P�t8ql���@R����8
��W�M��'�������7���::O�V��`I8����[->?��o_3D������:��/Gqq1���ZykRR��F,���DPy�e����>�E]$��w����D`*^q�������uky7rPP�"�����N������A���7&&F&�e)))r�!qG�x��7���������.����+e������w���,Y���_�|��KDDDt
(6��hE�s���������{���_d,+F�q]��=���'{�V""""""���������������J�g�q���,�E����}�b�_�"�4i�D���z��?~�������[��U�I���
����.�t�6m�K.9��(T������K/=P�J$~�~_Q�y�������VMt�D��{�9W5��"�YKu�j�j�p���'"����$60����ITw����S�N�����?��3���K��ax���#�v�0C����X$Y�$a�/^�����_�d����"q�f3.���W���3��6.���o�-���z1�����������y���9b��wQ��V��NgA�?��s1x�`9,�X��/�$f""""�Y�#h0��2���!�q�p5�;�\@Du��[���"V���^{�5�3F�h����FDDD�_��^�g��/�)�}��U��v��I&�d��zHV�D_��_,�dEq)A�����T�:�Hb��-Z�������;�����c����O?���X��Ab�\1n��������l���/�K�Dg�?Lt��\������������G����""""���F�E��m�6��PEP'��7n,+,����������v����D@;z�h�x-��������"X��|���Da(�!�D�/�g����C����Jb(%����;����b��C�T������\�$�*�����5DDDDT��
�6�������+��IP�=
��X�!�5"�1�	GTh�����8��Te�%��[n�%""��{���{�9""��E���`R}�k��+�J�m�{�9YY922�\[�^$	W��[I��+���k������CQ�i�F�e�6��v���>��� 
U����&"��]Q`J$+�����rU�%:��������7�����v��o?�1���q"�Id&"""":�j��rqq1\.������U�V��Q�"9Wm��2;r������P���6�j����y�bj�2���DT�lE���YUT���q#��m���89L��qE|+ba""����=���?_�U�+�x����9x}�yJ��Vfm��K_���M(��1}����������WQ]�����	s�O\g�oy>.o5��tY�8��H:��7QmQ#���nQqnyy96m�$�	����
�w�����������J�DDDDDDD����V��a�9���������oZZ��U��U��CDDt���db�����.����Go��[v��S,��Wem���sQ�s��W���<��tk�+�2k#~K_�_R��_���P���!�g"�m���Z�:���`�>)�DDDDD�Y�%*�j�
M�6�c�=��z-Z�@�����~<���������De""""""��D���^���_|1���p��g"##S�N��������Qm��{�`�8#��V���������6��Z�|���x��]�������\�`�W��h�(LE����(����kWn""��F���G�f\KDDDDDD5��n�C�w�}2��6m�|�My��>h���x��W��kW�DDDDDDT�]~��x���1y�d<��3��\��!�����			fK""�S��[�/����v-����*r�������a������P���4��Jn���co�>��Tf�/�l���|x2������3Q�����	&0�%"""""�Qc�����HV>|��6l(������oD�.]XM��������Qm��+����g�q�V+���q��������Qm�**����f���}+�������?�^��3[�W�b���Ho��e��Y��
�����f��#!(��v��^;��W������na\KT=q^��������������c���x��Wq��W��K/=0]r�%1b�|�I����� """":=�\�r�#�"����D������y���#��?����z�!L�2E��,��ifk""�S'������8�a_\�n���:�m1
���7��m�����fU�8+��������������]�t�j�Q��������C1>yBA�"���(���7=�f��q-Q5,��md���qcB��ODDDD�w�����]�d`��s�a���2�]�hv������6mB||<�*�i������YObZ�)����x ��e=�P�Dt����kr8\q����S��O��r_x��Y�FV�"""�MDE�(W8�$�glG�<�~�����:\��a�d���8���*�RI����7��|�(U��l���$||����G�w}���qy���������O6}v�4�:
}�:���D����������D5�q-Q�\6g���j#���������=�Y������������F�A��SRR�������?����/�(���O��N�:�m���������������_�g���;�����G�d3��/�g}
x2+���W�>�����w#�t=b�~F[�4�u��v�]������n�����3g������o���^�<==<�����-��%""���.�oz��44�\Kt�r�|���E"������UC$(�����t`dW�v����k���h������{��`Vgo���T���QJ}������6�ic�6yJ�)b~m�9J���}Xc�V<'""""�
j$��"::��uCXX��i�={��
���{.���dee1|.Q]�.�����?���
�xm�rO���A��k��Z��B�q�����h���	�Z����$�������tZF4E��V���{Q�QVV���|6���HNN����a�X0r�H���b��m�u��#""""�;������j�Z���+���������a���C���
��4P�8�D������������deA$%��o~N]�/����>GJ�.���}|�k!�/���-�b�����>�<�J2��h4�DDDDt
�H����600PVK�LDn��1���+�`�����}��1Q�������$��)��S[�L\��E��J�p(������5������pc��$���b��%��Xe�E�@���h�ub���� yS����$�Y��"G���`�.�S�|Jq�-��/Q
b\KT{y5��F��V���h�M�;������X�����3�#�Nx�Q�+�]�!!�����[�r�����X�������T��De������O?EZZ�LT�?��#�n�*������j&""""�Kt`	6�@c
4�\���$h{^��;JH7c�
=�k(�&2�Y�Q�'���n�_%�(�m����"���� �Z%44-[��7�|���$$$�N�u���y����q����������9���G
�t���De��������~����:a�X�����1�V	�k�7�yh'���qy��F;/Vgm�����N����>& �h��yDDDDtJ�H�).z[�h����c����a�L\>���p��w���.BVV���+�������j;�|��/����\��OVQV���u������^�J���,:w��V���8���m�gXr���]c�"�h�#�b(����
�������/��8p F�%����r4o����DDDDT/)�#�=^��":����
�!�d,�:AJ5����a����D��#��+���q-Q-�^���g_�I����t�L5�+?S+�,L���A��fp���#�!9�1�6hk���A����v�[�����{���WTQ'""""�i5]������9sd�+��y��^w�u�1c�;������NP�I�����?C��z�Z�|�1����%to{4k(tw��7���	��!������u����_�����$z���pZh������#�Zc������q����x��g�����/�==�Z�je�$""""�gD�Z�VI	F,'��.<��v��-���e���uxS�l:����!�Q����k�j�����&><�i����Y����X��IVU�S��R_���<w�Bt�n�@[��l����%�Vai��-v�u
[�wcb��s�bD�A�h^�������T���`5M;0d�HJ>��sq�M7�i��LR&"""�:��vU,rR"�,.��^���F���^��/(A���w���.�cai���=�������t��3�6}PVY�������
��S��6D����ID���*��I���`���r���������<�LY�������>RB�B��D����>9�����t��<�|��AG<��NL�7������B��pO�I29��j�Z��IUT���*�)Vem����h������S�r���o���md�v�-08�7�g�C\@4��wC�-5?��py��HPnn��U|�MDDDDt
�X������M�d���W/t��;v�@VV���<s�L�������������K�7a���v3d����I(�7Bmt,����c��s�������f�B	�-�%[,����s5���p����Ir�>"�]<>��sL�<�\s
�L��-[���S������������%k���Am�,m�>|j�6��/��9f����]hu`�p����)�S�q-Q����fg��NW`x�3�
=�4��X��3��Q���j��Hl>��F�+qq�0��5R.l�C�z��v��"�1��)Sc�����x��W�����s����r�����P�������?���nYT��DD��w�}';q���0n�8dgg�f�!33/�����c�$""��B7�{s�g�4�{s�A���1m�{�a�b\��C;�69���Q���_�-���4�D��5JH(�C������lDD���9s�Q���DeM��y�f��r�-�8q"BB*��EEE��{�A||<�.]*��%""""""�������[o��/�+���~����p������KV���};o�%""�c��_�_��D�����<~/�-���mH
���g>��C_�c�oC���H/��Y
��sLk���; �8�|5Q�#�����3�%2�{���}�o�i���T��,I����K1��R�����z������0u�y%:����_,��}�����������D���<��v4l���U�DE����������K�������j���By#���p8����b�����X�����������;�m�����������#��r�l�����Hj�	��G�j���3>��a��1[�>"���w/�Z"������aO���XPy�gI�K����('�3�����������pE?.�mCa��!
�io��L
?��a�n��DDDDD$�H��j���e����������PB�����Hy�.Qm%:qE��q�F��nsiE|������b�X����j����1s�\,�\��{��}d2��b��J�e�~�Bt�i�0{���)����T�o�f�
�d�;1��Pc����,,N[���hLDDT�0�%:H��-�T\�������y��b}�0���5d�n�2oc��w~� �PG|�"���E��C���������Nw5��,*(�n�QQQx��7�b�
��@w�����������>}����DDDDDDD����>|8�~�m<���X�r��1w��
2�1p�����5r���n�!����|,L���g[����Wgo�m�fo�I�?��
?�.���?��W���W��+�A
d;Qqy}v
�]H+��e����.�����j�����k��&�O�����xP\~��������������xu������������
��X�;�b3@V����`����W����%{�6,�GDDDTW�Xt��Q#�z��(((��"����?F�����}��2Q�w�Qm&:l'O�����g��<��;w��+�����7��&M���O�`���h�����S�N��������VG��gn��vt���z���3��^r���;v�|O��^��\Sa������K��cG�gff�k o^~��7��+�����\JDDT���6��F�1 ��t�7u�{�MDs�xK����8$/���������;�3
=��k�:����Z�!�G5?IAqX���Ksd"4Q}am��|FD���k'M�T'�Z��%.L��=l��
����q97������A��FQ*��4�{u��u������_C��*r�u4�Q�;G������nl�Ds��he�QmWc���C�i���5k���O<��s���{0{�ll��Ivn��������>�j^9L��J|e���1��Hx�.�C��D.�i>Y�-�X�[^���<w���&���.�l���/�������~*���7�l����."Y������={b������jo7�N����c��	������Z������E�\���T����C������z1L���>
��&���o�.�rU&%�Q�~��g��.�K.#"":U;�b�44	����m��@��.����F��"I��.Wc@Bw4��S}��I���{�;B�%�
���=�n��C��Du��
���K��������[�W�~�7#cYA��"���ySp���@�5���~3u�l��`/.��V\�����_����?/""����D'�HNn�"!\���������R�������>������������^v�oeE����R���X�`dWZ�[�e:f,� �x�~TA��5�UCQ���W<w$@M�h!����T;������hODDDD�^�\k�����������[eE&Q�ItZ:!!�������N������������BzI&�\>�X�,�Y�6���57����x*�\��g���K���%�cm���,��&��URR��/�XV+n���.w��Qr� ��a�:����"�XTP�6m�L4��/�(�fUw��/���U�V��o��6�����?��z��-�F���~���r��7�,�w���\n�}�����������c��]������}����d�e""""����E[�Np�=jH���|����k�tx2�H@������AU*��t�)��������es���Z��{�^�g�����wwQ��uF���X����n��r��|"����m����>�%�I�2�5���W�Pp��vlcE�X\�'�:� 4@���w�����(����l��qN�wmz�`��C\t	��@=b�(
��@8��K��*�J�9�t�K�������d��9,=����!�%�5��,^Q�����jqDDDDD�Q=*�]��;]�{�NF��\VPVfmD��8�4�>8�N���^����t0�j=��@4N@����Y���i�d�e"�Y�z�H�---5��N��	��������5o��I������9��o����������
��-�
�^x!V�X��{��������,^/~�HP�	�]�V����/���DDDDT{�D![�.29�5r\��%��q������i�4���nE��J����9)h�N�Hx4�a��pi62Kse<���Od"������"#�m��"[ �$_��8z��AD����Q��>A����1��5j��i����ZN�A^�Jq���e5z��I�%����������ITVUUvr:�N9t�'�|����s��=0���O��y���$""""����K[G����_�#���vE�k!�U���Q��p��apv����aS�h��>�"������DTS���0b���1�f����.[���$�������t�����!���S������< ��
�Uq����m7n|��G�����g������#+5�x�������d1��H^�~zz:�.]�����,*42m��1_IDDDD���p��w�n�A7���o��[/(vZ�;�-�hd5[���l�%����%�Va��7���.��B&'�5����hXL>���F<|}����	?�.�k;BA(�� ��KZ�����ds��m?���f��W&����"�#��������f�c�9��B^kTN��.���h~�MDDDT��H��b���d��w�}w�}7����y���{���~���%""""�O�p�����o�~]����r�>q��JQ@��������|��w#�X���������$e����-��C���n���������|�DT3D��_�t�u����.���+'Q)x��%��C7??_V7���Y$��37�p������U�E\.*���J�[$+�j[���hf��-+'�de��|���c���8���eb��.��{������n7_IDDDD��[��6l% @&AU���<�P��4�^,��vB��6�qq�0t�j�/����6}�7���6�?����l�Q���E�+/�U��.|�e��}b;cga*����]�.�,k��j����)�Gzq��C���PW�Z"��#�
�r���PG\V�9GD�����c��3#�<���bhX����>X%���aC4k����P"""�����=�_{ZQ���p���C�
w@	>Xa�����������j���p�&��6�u�n.��d��aO�>�U���r���<-����ZAT��^�G&5���'&�k,Udr��|��[o21Q�f�|40EBs�+�b;��Tu���0�_b��:0���)w;&���\z�����YO�s��o�f�]?��;��E+����|���m���yU��iP�n����%��+��:�C�\�\���[o��k�1�N-������V;D�H���E��c�d����P$�j��,*(_��5j�\&�%���M������	��*))��a���G<��c��E����^�^�za����������������Q�Y$%����c�H"Y���o�9�����G�*��m�F������mv,YYY2���DDD�����o\g�U���`�^0�i�*����O�5U+u�EZ�����]aU���:#����s`�]� Q7_a>�^��w���=�4��x�h�9��8�r�/�~w�>E��������sHKs�v���o,����f8z����a#NyJ�h#h�BM�(���j�G�pU�n�k������7GE���\q
�`�(���n�������7����0#�;4	M�S}��q����"��W���-���
����U����������"##��
�����vc_/����~�}�Z��
��V+��Uq[��?���m�$o5������j
�x��5����[�6���1�%��"e��|�����G�
�d���+�?�����o�	
���k.4��X������U�{��0��c�O�s�{3|;����G�w��QN�i��c����Y/y�X�,��9��BL��g�+��H�[0�qs����3s�H��~�q��5���
Z*�o����[B}���o6����^��\S5���Pc/1�j��<7�_���c��'z����"���N�<�a85�����q"�����*�"`i�4���_�4�]����X���cH;�)�P����8��$� ��Qr�����-K�����ll���G�z��v�k���:pK��1�������9?g
�!�%t�K�w�e����m�d�?+�5U���|*����h&.��<����E��n����������y�y~6�;��#�C�b�������������Y�?��5y�U'� ��Q��U�,'�������8����Z�P����&L���?�H>�K����q���S�F**����X���m��E��=e���g�)+-��N�
Brr2���������r��Kt��l�O�~��Kq��i�y�cxw���`���_���{����~����@��&pZ��q�o�c���"D|`D8BqQ�s����[�=�lGD5��t���w������L9r$�7o�:�u���5��+*aM�4I�^���o��>}�`��y2i�2�������������GRUUVE�x<���_F�Dc��b�hWVvx��H��.����"�Zt��������-�7�|��c��Q���}%^+��'N�8q�t����;v��z��x~<�q-Q�^<?�C��6M����m�u���966{�5�h�w���a�Sm���,h��m�
��j���:0j�[�5:�mS��yz�l�C/��g\�C��,�]OB��%��-��b����z��fCp^��x����p����a���b��G��0�������h,{��$e���.�n��xm�j���"y����dLG���rh���\Z
N5O�����h/*s�8���m�wF^QTN��O�T_�}�6��DD�_���^���f��������pk��q{�+j,I�dS�IP�O��.7�+�=��}Cs�!\M���~�����:��DDD����,����~[VIz��Gd%��):N���p�M7��{���1�����GcE��W��*�z�����**����U��y1����,��y�!	b\��3^��D�X��rVT>q�����b�
<��s2d&L� c�K.�����e2��ov����r�����\I$'���c��u�wl���\.�e=��2I���>C\\�\^I�o�v����;���������7���������+;�����������e\��O?�������'�|RVj����1e����}�Y����a�g���v���� ""��U��[�Y�������#*�(6
�mS���f����%*F	�F��������j:�t�A��_��D�n���.����F��%o�q��6K��q3�!!Fc�^`�W�\���,�{����@���X��8#��C/\
5���,T���D<\7���_�V��t(^o�������a�
o�7���D���O���2�������P[�
%���Z��|�\S���X�;�	�9��wt�-�]�|�i�6��DT����������,�����
�l��a{����u�#��N%�L�������8m+*D����il#c����'���eFx����/XQ��XQ��XQ�z��|l����W#�EG������_`����\Q�)::Z
+������d%���&"""":%l�v�MN6�&��-�����xn7���dA,�lh���*b�Xn������j����*JJJ��[7Y�K�t���]�v�����u���oE��e�]��^z��t�g���\V2��0�j�*Y!+D$�A$�������M�6��AL�=D;1��Hzq���,�(��������cGYu�P�g/]�Tn7q����(�Y�{��5�����������P6��L�/>�����{�|��r(���D�%���kK���OE'Y�����Aq$A�^M��PO�Wk{�9S
#�W\���S����DDtb���P[<
K�W��:|�$?[�d��f���I��S���T�?�jm�2�m5��,:SSS���;OVu�$�M��D'�zVKDDDDDDT[��\QQ���/G���e���f���N�4I��{�;t����W/t�����L^�1cn��deea��12��zQ�K$'�
������>92��?��S�������������������'	���Ql���}��(��
;*@P@z��@ ���mf�{�.M��IH��|�eg���lf6sv�=w�HT�7�o������_=�O�.*-���o�������_�����Ob�o�I�����������tt!�B�4
j�A��.B�;��������H�D_����������C
=�U��;x��n��:�B�/>,)�!!"�V�Q�]���@�5>�5b�#a�����V�����@����������)���B�o���!nye&��s����vB!�B!�.���yl�o����<��W�z���g�l���/������?�q��������=z���g�U�y�2���EGG��f�?O<�U�n��6�s�=���:t�����^�;q�Dq����>S�>�_�l���1p�@��p�
��_|1,X ���*<B!��3L��������+�IIF1����sH	�B���h��������������3���<n��q-!�~j��`�fthx�,��]s���������C���8��h��Yb�x�B��"�����1��m�]l��9W������\cR>!��3�V�y���#���R����QVV���J1���_~��[���&���!�B!�R�����T�_�5�o�.b[>;PNN����SRR���{&DDD�de����<����G�m�CTM�;w.6l(�q�1��\QQ!*0O�4��:
V�X��%���={����'J��9STi>����<y2JJJ�|�r�����B!�RI!��t�r�+G���2������
<�m��M��k	!�KD���h!A/*��L
E/[��W���7H���l���PZ~��G��v@�������
��BH�p�
�^�Z���e;{|OB�YN2ah���tr����}���N*]#B�?U+��<�m����9�t�Rq����n��7�(��}��������Of&�B!�B�*��{�u�a��=�J1�V��SO������
�������
]B!��Zy��!�rr<����P\K���o1��6V0��Wt3�u���5_����B��E���z������N�!# 5z��5tg6$[#���@�~�W}9����K"[.���go���>�3��dV��;����H,����y+����C���0RRa�b<�z�H��d��SPl��"B!�H�$*s�J��#������.@rr��F�}��bOX�����&�B!�B���;���^��Q���*
����'�xc��E``��'!�BH��
��!��S��������d�`�g��;$\���[�q�@3��2�f����ZQ!$�����~�+,��lh;o���~h��d+���N���dH�P�_U�!E\)�5��@N{r�dH����/��t����"G��B�h�d�'h��,����_ �8�c���m2�����������`~��3�;d�~c��w$��a�|L�� ��w�Z�2�n��a��	����q�=����"::�F�B!�B����@��j�Y|C�O�g0��C1[���>�'�|R����
Ch�)>�$�B!�����q/N$�����+.DF�H�$��mR�9$��"�zU%�;����)$�q����V\��
�1R�u��C����;����^�Z��Z��%�#hE� '����l��}��0���+��b)�����Z���P���N$�L0����K��N����I1�kL��#�k��F2�$����L��k����������$�}��@N}
r����Ci��F������M!����D���2|��wx��q���b���"�����&M�7�|����M!�B9WYf��O^�B������&�l�s���@I�����6����={6�����Q��_|����kdee�t��B9w�$L�G���x7����jy2�_�!����ZB��eT�kz����!6f�o�^��x5�.
��� 9��%����Yc��"����VZ��
��RPW(�f��u��3!w�:������@;���/�]�uI<�-�do����}����wQ�,���$3g�����?��
����Y���%�u��b<�����1���u�����
��w&I��.�
���C��|I���Q��_?	��L�}������{�36�w���M�WC^�#oA��T1(��#�q��o�����b��������e���l���{Q�IwBn����r��j;{��x�B��ZKT>x� n���3��O�W_}uB�I��7oA1!�B!��i
��)}hr�f���o�C�h[8F6��Y7���:R@����W�f�����=I}�i>��Ct����?�}���:w��]tC�B!g�|z?��A�N�=��B~o��j9KI$�rD��r�o���7��
�n
A(;��o��(N�Q�������|�����-<@�]��q��&QM���!�MG�g?@�>�O��������c��/���jA<kW����Q<q4����b�����h
��7�BzBn�)��!P��
C�j�������c��6dW���d~�yD���s7`r���1�����i��|��X8�C���n1ml��i��Pe.>�5Y9�g8sx���I���/��q�ha��#���,�N�e+���<�l����;O�������������V����������U 1 C�{��v�*�����,��u]o���@]?XT)������������� �mZ�P�\&���c�v�v�yq��[����%�B��ZIT���[�n�O<��{�"77����~Qi��G�B!�B�iv����������m����W�v���n�'�,4���n�lvXG^���_������a�h������������o��.��1�v���'����={��|���!�BN�Wd;��K����$���dIB��t�j���8	��EL�m}
&�%���?�#��v������������c�H�[pU��0���	�o���������rZ8n������G�C�=���;��WC
F��������+�C��������#��?\�F��4���������?�la(sW��[^1yWi��Vm�����[]���8G���b�:A�L�;�C������6��/�;���gU��|��)�2����k��~=�#h;o��5��;�f>
-�s_��+��h�%������v���+nH�A��)l �|��^������(�9�f��Y�/y�(*���w-�[5��=�"��4�$����V�:�aUUbcc��kW��J	!�B!�Ol�S����6�'������{�m��cZ,��e����{����A�+��%b�����q��

:��h<��.!�BHm�;SBK����������]m���VWb|�Q'��[���-����l����K�A����_�*�a�W������K`��r`���c�@������h�qo��41�!��ky�2�����IIH��y+HV+��U��0��C��"Q���3��(v�q�����"��u&^��~<���Q��[}�����o���_��=?�Y@,�5^'���CZp���cT� �O����-E������*�?K���u��=��2�������_[����$���D��>r�������^������<�+7A/�I<�I�A�1��v=K�>�!R���V�=����)��q�B
�����[$�K�t���c� �9{�PH��-�u��1�)H�����|���BH}���{u�����De>��')���WO��	!�B!��������������B!��%��-��N���`�/�3�$�D��
����Oh��u-��`R����Hk(�m����a�yBH]��'�
���qb"����C�TH�P�^ue[�T�93�=O1��'����=.����_uU{���S�k�f�u����'Bj�k5jDq-!����P���b����g��'V�������V��y�5���pM�E5���&0�dW���U��A�"y�WY���!� �~<��',�U����/B��z����]d���������/�%\����!��:Bn���� �$��~�k�H���Z�&G���������-����V���~ ���@��B���8��Cw�HH>��;q�*����$v�Y����L1�y��YP7I�������AAP�c�K�O����9|`!�4��/���yuA�$*�.����w�}S�N��3��'�m��9��_����!�B�
�l�d?6u���vB9��f�w�}��������YYYG��C�D�eB!��3�>f<Lm;BT��S��ET�5���wc� DR���'�����qS��b�q���'��v�����%��rp(�]
�b��1��#9&�	��{�{$�
��.D�� ��'���Aw��-2��s��[�^�������.��W.t��)��c��W���x+ ��Z�"hy3��D�S$�r:��v����B�
~����AzHC����3l��<	#S�Ux:n��l.����<��Mx5/.O*��������GF����6�)��������#��z�F��:@]��]S��RhOQAYWy%E�,(�h�o�!G\(��N��6A
��.R�5^"�v��
�b�)��� �.B�#�C�EU���.Ab%j�u�	�6��mh��O2�m����OP�Tn��a;����o`���u���DZ�g����~�C�B���<�p�� 9ZB
d�f�z�u��nq;w��q��:���e�P�����_��bW4N�p��E��b��P��)H��4��	!����f�"Jq@2�� ������~�������`���;O=������#����9s�v�1�B!u�	c��C��k��l6�Z���B������^{��s���^t��	���?�z��-�_�JE!��3%�����z�X{����=�$��ix:t�j�o�{
/���v��h{��]x���t$��M�]WH&l�]��7>B��SN8n��z��cz3�s�$���
l#G����������-���"x���^����Q2����@6�e��
)�`�;�Hq�_;�`�*7B
����DBj�����AzhCQ=958o�}-���,�>�<�x�(�/h�������$8��Z����o�IH���A
h	��*(]�B����b[�-��ul����&Ei����d����m<E��V@�B�5����Y� ���z�=�Z��5���q`T�A�1`
�f��}cRgYM.�jD�fj�P���������WU��{'���C+-����!u���J�������X�L�UT��%�=T���	C�j(�6Bn����������,���U�������s�{�=������S����]1�������&��~Oa���'*������ ��X����1,�9�'Q:Z|�!�����fJ0E��S�_A�|���ZITVE��~�)V�^�����e��|���5�������'�B!u�Yi�7�;����1��k�/���{au��,D!����<���b���5>8�U�Vbv!B!��3�`��i���<����(�;�Lt�n��q��q����QG���l������W����Q�s%*��xK�~z�������6�@���'���@xm5S4;AN�J� "��Wh��4�'�lG��@q-!��^�_d�����9FI��Rh?�e+!�t��z�<��C���]K(��g�(�A���v`���S��	���b������)Rpw������hQ��=H�������:�=��y�
8-�s��������x�p.����>A��_�9{��2@S 7|J��b@�u��������Xa��s�H�;B�5��p;H��a,���^���H<i���BB��B'�:�:����j��}�u��S����	�2����e������l�|#�jv"��N1-E���fqV�����Ci4r���]\�r� �8I2�*��k$��������g�:�
���Q�S�=���k��b���&�{�?�r������@4i�M�6=iKOOGTTd^^�B!����s������n������{�� /B9w��^x!.������#G"11�n�B!�R�i��j��a��^��f�^�z�^.��?�8+���6�=P|���2d#��{�R@k�����?Fj���rze����z�EB�����������_6AN�r����&B��AN�K����I���}���l][_B2�f*���c�e�3	r��j��.��S"d\���[�qI'#���������Za>t/�Ne��U����F������UW��y=��g�:�y9��nh��"�Y+.�g�&v-{���U�����������z����-�Cq�����^0p@�z	z�rhy3�k��H\�I�(]*�,�&�w����)�2��s��G��{�������� ^i����p
�$����C��+������/���eo��X?��O=JKK1i�$<��bz����W^y�I��q���g���r��&�B!uLf`��������
���+�qu�Uw�x%�.;������8l ;��t�g��X���v��y4h��ZXX���R'k��u�h�\B!�B�7��	�UK��y �\)b��2[+������WA��B�}��M�=�������f��b�`qc��������W��l��!�4���Bj�M�H�:��Qzg(�����6 �J���$(���U���h��u��2O*�J�!GD�2t8<�6��a�oG����dw@�X ����`H�������p��3�6
�������]~����V�ks��}.4�o�b�>����5/>�V����^,{KYP��s?��o�u��Pl�Y��e����;���+N+
�`�b����"��x3��Z�Wrn9��%��b������I��w���;N�v�����|
x	!�B9W�fH���Q�U�W`����"�F��EvU>2���\NU���8��0j�N�VbgI&J]�b���+ly������_���B���z�������{�����:�\�zX����0�3�4�RpW�*j�<�u:��+�[kjjPVVv�VUU%�B!��o����S�w�!���k�Q9�)]:e�M�7s�H@P���:(��@��r�� 9�7��M!7y�9��J&���0j������������Zh�,����0������X��Z����Z�����;{��2����8������%Pu�5��Cq-!��cS������#_�P^sb��
O���=�}����C�T��]8T���O�>�s7zE��s�~kj��W��b�D���*�[�������`	��_Q|�pT<����-(<�'
vF������nX��{n�g��.*�x����f�'�Z����{����am�"Q�n�D��{�:������C�4����acxwm��h0@�E�8~X�����Cb2����B//c��fx7�g��&TM����{�r�~�����8� u���6P�z�2_�(��K������~�����C]�U��	�J��Y<�{=c!'��`��W\��@��)�9RH:����(�Wk�@��R��"�����;�]�_ ���z�;,,�}��z�-�1BTU^�j�I��%Kp�-��j=GOFB!�B�,���	Ns,�^��v|�����} n���/v������S�*o
������9��:����o�-��?7zV� �w�����r��fj���
k�kM���>8g���UWA��@�'�Q������)�;��9.��{������B+�U���~��2r&�������__###E���y��~�z���G!�R/)H��Ai�9�@������3�NMRx�,BN�WW���1��VR�W����������r��aZ�G�1��HZpz]8T��������_���~C�����s�#�=�mz1�Yb	���a��g���@�a�3��P\K���*�0}��:�D5`��X����)��_E^�����6y$���V���r���`��6!�@��l��<����5��0	�bd���eXL<;������������#I�{��y90w���W�C����
���k �G��S�����[�����U����V|M�c�q�yq��s���
�����7?�������X��!���������&�-��U���E3OF�lX��_!C++e
�m:B������;�'�g;�b��c�n�^_`�c�]"{��7{-OF�@/���	�6�eZ���uwB/��I�]w���3��wbBJPQ���s����4H��������,:�0v>H������Y��KB!�BH��	�Cn���C
����X��A��
68U��Z����5����������lQEyr��h�X$2e��Tyj0��R�����E=t��K 9��j��-���Up�]%�,�!�.����?���()
D��h�#�2��-�V������lc_����!�B���;%>����=�F�d��60GcE�&������36��W������?g-�7l���P�z�nu�f�-���kbf�o�����Mp����3���������0�Q���?�o:Z���0���������x*�>���_�����N	���oo��J�WN�����p$��X�MD��Kp�2�+������]���a�q�*5,^��G"�5B!�����DB��\3�zDue��h|�D��bi1
���r' �a�`16�/Y�')[����(!>T�9[dT����}�n�>x�}���5C`��4���/Y�BT��_3Q$*s<�T���g�v����JK`l���H�?g��
�4 �v���NCrCQM�W�U������C�A�C�(���=����%��eCR������!S�n�#�`h�jn6��d�����)���j-�i��^�S�<aTi�	��?�sk(P�
Z����d1��)����9���}{���]���}
��,��b_���hvnvd�n$���y���G��?�]���TA�f*"g�Z!�B!����9�^�1W�M����|��`r����bK�.���S-���v�����r�8�a3XbD0Ol6��<,
�B��U�xG4'��k���^EK�;�Z8��;}�������u�^����'u�r!��P A�!5
��M���A���!���%#$+�j��E!�B�i!� E]����=9�~����|��Vpk��;O\ke>��o��X��IT��>��T���s��u���~:��H�\th��u<�����
������06k%�;>��@�K���q����2���R(i/Cn���^�
���b9���~�5?�����k�����xy�G0+&���*���j��#���
E�����kQ�����n,>�"907��V��X���Rc@bW8X��x7^��1��i�\B!�OI��i�"1�P���X7�7�E�,*"{T����p���;|�xmSl:����n���`�pQ{#�0����5|�����@I���J��o����f��0u��
�����M�f��s7�!�[%��7��q$��}`u9�q����O��7s��sgr���R�1�����l�
s�^�>Ob�_s��
#;�$����q���D,�g����`HJ�����6��1��	��EK��{�pR`H	7��I)�Z�5f+����h9�j�l�6r�e���p3���1Rh_����1
�)|�\�z�����$�;<�������oX3�G6C��/�lrnP��|/�XA��W��s��
9�>H�4����,C�b�W����R"c���Q-D������3B!�B��Wj��1(qW��P��z
k���ih#�H����P�C��h�������8��ux�D��44
N��`����xp���V������I������{�z�4���0�l����N^7��`��
��� h��D��x*�<.�[�al�JT=��61�_�3�����6��.��{>B!�B�k���5�w�5~"���Y�G�`�7_��.�����%�kD�d�����5�
�o~����a
��|PR7��l*��r!� ,9�����T�S$e���o��Z"������yk�����zr*,�3��>�RN�	Rh?��){��sCH�uQa����Q2�
�?vtg�oSu�?~%7^��'�5��`,���y���&�f�b����^Q!�#'�g
������f�����K1 �'-�s�Su+s7�Pe��7��@��I(��.�-�����`G�>�8���H��-E��/B!�5�E����4���]���	�U^�����c�&/����/Wy0�7���-L"a9�!!*P	��vyE�S��W���|.������`�;JL����]N�5U�xe�]�U��kV��5�*O~��g�s.��v��c��Hh������,&�m�
���h�|����YQ>�5/�_���g@yd���r��xq�"�r��/0a��X����!u��jiD���H���{��"�Yl��W\�'O�g�,Ib�������<������W�>�D�%���5=d�HP��G������x�o[������p�#��>8n��Wu�_���6c1��d���^���
��6<��9�H
;�zCi�!����tXs\[
�������w>K)�;wG�]���~q~�2����:�����\��0>c�(�U���O!�B�=�4��Q%yXJ\�>m#���Y�rw%��g#�"��
V�������I1!����"1n^M�,���������$��:2CT`>�d^���`�.�BT���-��J1m��i��v�Q�^\-/GL�'9���#!GD�i��4���l9RTC0�N�w�.������G!�B�����:�V9�e�.�X��B���Px^1��x
��������oS����^�VY��=m��0�j�&;��r;���:�����+P����@������D�=
�� ��#�`�qI���d��N;��h�,��=cx�>�qJ*
��k����=������#�cQ��������c������k�k�oD������������pz]"��W�q�/��=���_�,���������2���D���"�O�����	.���
Czsv�,��bC�&�����CX���#��i��?���T�ON��(��>%0=b;`O���s�i�k��u<(w�8��m��~�=��C���m�[=�u����]^Iyd�@?g`y�z��\����}�BH�fT��p��2�4R"��7��.SE�C�����.�f�b��c-���c�,��^|�����4��a1J���	�Q
�R�h��h�s��Cr(	�"AIc�O��e�Z����!��=;a�3Uo����&@f�]J�/YRT���d|`���K����B+���{�(��cl�|������]� #$U����g�����YO��(>��yXc���Ad� ��W�n��oB'����_���C�����E<����
�`���\*�]��<��`���9�]��W��{�*1S�w���.�VZ���k��p�X*l����y���eq�����U�b���bV�g���W7��S�~�G>rX8�C.��Y�!�,��d`�A"��d�+_��x�|��
3��(�c����pO�k�$��g�s�XnI��h)���������+���Y��d�;X�����������7��OG���J,��9�i	������	�.��v�t�2%*B!���i�����z���>(�^1m�Q,`��UM�&�W-C�5��������_��#P��cb;!'#'M�^�	����I�(t�f��$�*
E�t�i�76�����������;@��H
I�����#�s��t��qa���yZbO���+�[}�����92J|"����U��]��P,W�!<[7BIJA��w���c1]�{�rTM{������~�W���w�.T�)N#�3� ������Rh���������o���Dii){��@B!��>(�q�$��9�+���m�������~�-��j����"D�]
�-w�6l$��<1�N�g�:��w|��~yX$&Wz�����X1�	���J�u������C"��dr���'|p�u��>�o�G����7Ci�r�3�9��r����j�0������Y�DR2O�����n3�Z)���8��S"iue�FQ���a��.�j�������f<Q������Qz�DT�;^�bO^���L$����b�_I�����w���gf��p�Y��@�����,�'�����z��%#?��]&!#,o�}����Eu��!��3���1M.���>��F������������ao��}������w_�������-��D���ER2��/joU�y�������u6�L7@9.#%:X�c�,��z���|���t�g/F��������w��a��r��/��<�.���}S���� 
f�o����7C	�����7l(�����0�5Ob�3�\�~��
�/_��Bt�m���Y0H
�$������j�v��G��vbB������2��/�d�S���<A�l2�s)|���+�7�.�y��W���o��?����Pw�`���\0W���k������7[�L���"��3U,��!�W��l*���E1�����E���D�wC>���� �G�"h����'�5���-Z�����\9����v�Y�%�B]?���u���gC�~=�+�B�y+{�bH�9S����z������xE{^�H����Z�=�����k��L
��q1�z
;��`�W/v�t�wYh{�J�9���������r>�^�����M�@/�u�xWud����;�Z���T��l���uO�]���rrr����">>qqq"������W_��~�	^���0B!�R���\�|���~E�C��n6:�[Y��c+���nQ���t�0	�n����Zn�x��hx3�������'!'��,��F�!�-+�J����O���z=�H[���tHR����O���C^B���0H��f<�_��m�(�����`��>����c}����a{=�>���G�@���+a������4�!�>��Y+��,��G�����{9�l�.>���=�"B?��V�W.P���~��?��\.��=��{/F��K/�T��}����b�
�o	!�Rk��X�Y���t����{<����Cg(�
��U>�����9�����IS���i���F�HX�����u���x�7�x��Xph�Fv�����,,�� ����Z�l�E9y5�g:��B�-�"�����u��R�M��<N�S��H
�7����%v��	!�5���P�����`�����O��u����&v��$4k���<Q��W��g�tR�s��p�^���.z�eQM��e��2/@+.�s�O�
 ���%�\TTV""�qR�����[qCV=���+�V)#��<)��ZB9;�V��������H����`u����(>S�3|@!�k5��l��2F�����L!Q���|�!u�v��.L�d��D�w>��x���^\cj�X�����1] �]���9O�������1�O���Dq&�f3`��b�Y��&����g_C�so�8�I�S���Ai����B
�)��/N�����EUT��A����l�����q{Q�@HO������'���B�57�����gl���W#����kw������36�����P
L��vQ�l�o%g>��m�X�� ������9�v~-a��\�QC
�
>���-g�_�fC�
T��3!�����3qn���Y� ��������f�H�32����ZKT����s�=��3g�m����X<�����<�V�^-�	!�B�����a
�-�
���JQ�H�%o��.�����b����R�'�A+/�g�j��vd��I�O95�r+���������^������c����:��q�����������x��W�����I!����++P��W�|�hy������u�p�����,��M�d2��S<�����*b��@Q-�z��P�c�U��r��p-[�:���B�5���"����M���F��?�:F�D�5��G�=2��Wym�
���i�XL'�>�9���1$��X_�H�X�� ���m�
�l�!�oku%no}���%������F�??O������5��O�����/N,nD:L6l-��W7}"�O�62�}(qc��q-�l.������c�W��1�-Z��~
<[6��}�j"����<�Y-��������)�	!����r���<xRo��O>6�����d_���h,�Y'����J1���W�����mHM���-��8�-E�E�2!g����������%he%�z�uT�����=��KY��*�pv����y&������">:��i6B�������?yZ{���E48r` $�X�^���>�d�a�g+��2�o�^�Rh���{��������|�5�=gH��b)����|!=�������a~)k��A��V�D��a�
��������v0��\��1���]x���g_(Q1x���W�����/_.�	9�Fh9B/Y����K#!Y���{T|^'���{5dG3v��B2�C������1����s�5�����
�#pw���x@��


����0e�DFFb������B!��v|:���p/_"nF������!�H_�O��a�<;�A	
��Dp�op����p�Hj��ybr��/���hM�Zn��&���~�]�������~-��,��z������"uOMM
��}���O<�.��"��fDDD`���������i .!�BN�b��-C��
OUo�
ov��R��,2T/\<������g�HbV�
��CIn(nD����>�4�L�����x.����<4	I���>��ITTk���	p�b��)�Eu`���E^��������l(��{�i(�^!JW+�,.}:�����T��l�)��\���9����Y�
O��V���������d��������D��/��3��H9]��X�s��������B�������H~�����	������	p�:���!��9{[w-��"�_����=��=�g�*��9b:eBH�������S\K!���f�0���n�^�U{}	��-t�>�~��m9���/�����.��A
>[��a?^����`�n�o��e���Z��{��h�H4����m�
�r��{��j�|`��;fa�/@�T�K��b���#�Q������"����{B��AB���X^����!�0�s�^�r2L�:c���{�~�������dA��{2|������2����O�!z��k�@�4
z����^����+����U����10���1<�R���D�<)�+��4�Q�
��Q��D��X��\���I
��%�	m�X������n��g����
�x>���X,��u��A�y{=���m<�>J�8$�`pR�����
�S�#��
T�����rQ	�_,hy_�]�\��7��5��/��l����_� ��f������A
��3�r��
�c��H(�|�Q�Y^]Tk��0�7���T1���eXX���E�eJT&�B�E�&nR{vn��E��1E�d`��V^
��e�l������`}`�������{JX��Y�o�k���*�������>n�<����-�^������Y���.�����={0t�P�����e���b���B!���Q���*f�1�j��IQ5�-���s�,T��<I)p�<��d�������d1}m���E��c���=���)/C�@2DEu���� *��kx^����:}������B�-
���#�=����97#��1�HL\� v��GR`,n]�$Z�
.h��"��D���
K�C���b*������e9�0{�"$8����4b��&�?�*B��6^Q;1�����Q8n�!����_��Ax��y�#N~2���6�������?�����!���q���{)�%����]����8+�����q
��}���U:��WqqG#.�d��5���`o�o���*6RQ�z�p�X���=X��+��������/D���"��j�`l�t�i-��9��t�;D?~-�B���1�9<��ND�#DR2L��W_�~��yTP�U��������������}��������\����Z�;G��-^�UP��&B2Q3�������z �<"b��O�����P4b��	5�?{O>��|�m��0$7�g�8��I���k��E�q>�����{��5J��PZ|���\�-{]b!�a[������5��~���
h��C���������	����DJx���|9�vx`FMP�U�a�4�����T�����x�{��w��c`�����!��
�I��D��A���{��^�2�����z�^����=��pF^.��}�@/]
��,8y2�9�H�r6PyFu%`k��\(�>�dK�^��8O�����y����~>���b ;��]�A���H���El�h��C��nk:����\�b���
��j%Q�8V����*����v�/&��u�FPPE�o!�B!���S����[C=|Zy�X����{v��e#�����K
�x5e�,1
��A#����]��a��C�0���7~�G�]B�2��T@@6l�����<�-..FUU�Y�!
!�B�.�������}!���#.G����
�AOLE�����!�����Z��d1���o5�)"a5��_`�r<tO!���KA�s/��W���CLQ������2(]wC
�m�#P���^�FY�K=��o#?��]nG��T���q����~�����]�K�,�<��<	KY��NA�qSp&8b�z��1g�44	i�_K!�������t`[���`	�6_��X$��i�)�b��U�� )�X�+�a7IX�CEI���j����#g��E�������+?�PP���RY��`�WT����]�AE��Wv����pbo�����[?�����(b���}���p�`>���K:�9%�sM���vq\w�}���JR
�yJr��5?�-t�L(1q���u�Eb����(>����
���)��V����K'g`�v�����CgM��[��m�}�1�n`�]��,��_���#�[u����
)|({#����U��l4�Z�{���Rg��9�0�f�*����WM�!�[8.��'�Wn�����c��6���
}���R�ZDBi���2�o���D6��7C$-�.���lUI1���qu.���at����
�A�b���`9:��>�l\���?�k�bQ��V��/Qm[����YB��m���d�3�u����|�����QHj5�-�Y_��^���f�����`���R�����pz��pW��s�R+��|�m�������?���m��y����K��Ca���h�����L!�B�^�:�RQ�'#�����1�=z����~�D8n�C����_��}Y��"�+�I�9�:s������7�	!���7s���'���6mV�Z���j�^������8��aCB!��i�z�b��_C��*�f�I�z���fj��c����b���������������!8�#��-��rB�������`]>p��m������6R�@(�wC�L�<�p6��=��5"���x\��o_�k	!�_�	���{��&/�]:J�tdiH�QD�2g�%XM��,
;s4��J���rH���<�)�d.�b�-MuH��1o��K��#g�
T$���|�Y���9�G��lWt3��~&���"��'"���|3b�%��Sa6BT�>X���m^�T�l�)���1�r�de�l@���O���g���S�����[*��� 9���%��!��/�%�f���o��^�
��DL^�J�An�0�V,����%YX����u�S�N��CDb�HZ���gB��!*�B��^�{�Z��+��#{�7����/��������M�`����,Il�-o&��"t�n���T(��}-b	�y���p���Z���x��pQ���I�ze%j�������O��k;X����G E}�y%7�����q�Bi����B
�
���t(��@n4�Wi���%Q�sJ�����cs�.l/�+��5�rD�?�)));v�HH�����-[����.�����h�"\s�5���+��B!g���������6�f��C�|��) P���G��i�M�:A��S�P�B�����&L@�����3�����Fvv6���>l��	���Gr���,B!���Z�7Pw�m�
P�_m'{|�����N�l�?�?��2�~�p9����T����	���|�l�VR���"Y�w����U���c#<[6��}��3skQ�)nw�m����4!��7�B�������2k<-�@�&�y2�����*
�4ja��Fl8�!%BB����u���0RF�S���VI$1��jX�������2�Qu���<0(��9^Q�WGa�Xl��l63G������yb���F����O
"d��Nj��`�y�=q_�������1��vO�kq[��n
��qfYM��������U�������?cK�nl+��������bw�~��K�X`��M��|���9����&A�X�N�
1�$�6�h*��Aw��f��$��l?��7Q!W�����o������H[(������w���B�q����L����C����fox��������l�|��h�&A)_.���LV#R�]TsQ��^b?3<_���p�^��}�3����oc����^���v�������/q�"���n���PFv������9>��#L�4	�����O>�+V���n�vB!�B9������'���Y�D�o�������<�c]�-�B!�
�T�z������r���T�j5��=p-�'n�?���z�M ��5p��p��v��_�Z�\����������mP�r��#%"����B�l��E�$^��B�#�k	!���I������
P$`�AI��H6��p���Bn�.L�����~p�q��E��\�5
#:$�j��������HZ^�O����+�D����p�N,����@�v,�D��
�����B�3�t����*����"!�W�n�@A|��m���+�3���@j���+��jr!�I��X����AR@����cboT��q��3�>������Y����K�����TL^�^���l�W�2x�/s�^0u���E�&*�J���h9<I�
��u������z�v"� 'L�?��(v���*�:�`��
�
�.�����z��~��� ��N�����-G/]������k��B�@?���o���a��y�������hr ��W��kj�^�S�B�Cw��u��?��������q����9������4S?uQ���t�������BFF�qL�:%%%�����}!�B!g�Z���.M���-��"(��
�wq����.K���g}S�������5[nu��U|�'���Rw����M[>{�.��UU�C�%�B�$Y��K�F���������)�!��),���w�V�Y2a:�S��q�����+Q]�����?����ka������a�:��(���/�M�z�O�J��(�%����Pzew�4RD5e�Q����6E�%��x�j+���b|o�����>{��3|r��d�(�����'��W\��{������Uh�J��j:*]���')X�I�����m+��Q��%�!RT	T�t���DR|�d(��C���b��6�,����v
d\��(��"�$��;��6<}�������*�U8\�/Z��z=��'�����>������+�����������
���Ai�$G���!r�}�"��}����Nd����V���y36�5%�Wz.����O��m�l�}����o`�h�oB���y��!���q!���T���<=�S�&hy_B
�	E�a
a_k'��t�=nhEP����g��x�m);����SU �����>I�	�S�L��7��m��A�4��<g�\}�����{�����M!�B��tw���PR��9
z�:@���6�`����\H���hz�f�O�7��� yKX0:���E"����-�R,Z�C����/�[�����{�z��| �	!�B�<�)�<��B������9�*���M�>���B��[E%d�\����&@��o��k7^��U�b�D�BRP"� �`�O��������,Y��z�%��v
\K����d�w��k���!!������R\K!��aWu3����~��A�(��9.f��63b�s6x1��m�
�	���w����)�H�����
���&SE�����G�<��Wqo+�g�a2��C(�^��x5��}
zu���{<p.�	�w���������Q=������P4j�?�Uo�����}���U��~���j*��	���J����W{�ag�>�z�����
�������dB�>P �����h9C�4�$>�2�@h����T��I�����{.�	9r8{����^q�1��G��ZIT����M��d�\|��h��EAHH���<��#��a�HZ�#u	!�B!���X!�X0�peC2�����V���h��E
c�oT�Z���{���>��!u#�	���@|:���t���,#  ��M��#��g���4k!�B�>8Pi<r�$�q����:%�]Q
�>�U�'?���_�^]��O�G�W�B=|rp0�+��f��%����|�1�Sd(
R��F��/�����-t�rH(
C��Ms����2x|�*�)�?&���������*���B���a�+W��n���w�gFj��f�2e�s�[D%\�	��$���B3���Uw��'
6��K,H�U|��h�pQ{&3�De#c����$7@��C��d�B������
�U`���7��u�H�����~���`��0al�Zq!\��c�3$����T���/��/���3�����������y����{�/�3z����^�3$k��_�
�V4�����)�?.Y�����_CH�hh����^H�t��Z�W�liP��A��G���@�I�qbR��Z�rAA��kW�a6����i�{���1!�B!�~���C;�
���6,, ���G��|��c���|�z�=+YS�&��i�)|$��P=)�=���`V/]&r�UTT`��}=z45j$�o�7u0f�!+��tC�B!��l��r��!7y����I!���CJ*�=�A
�e�P(	I,��X�a��S7��!��X/cF�{�s�!b_�f��q:���:t��c�6����9Xl���(�1��
	!��qmff&���B!g��H�3��E�2�gRs�Q����� ��b�d�A��s�wp~��-�@2X����~�HnV��`j����MM�
l=��q�nl,��Y����}��x�K�$�����
��y���!�Y�dI�~�=�j���~���cS��`�b�q{��b������cv@�����V�ypk�ZE�����?�n�UUU�X,"&�B!��W<���{K�W��}"���EeA�@/_��*�z��,�\	X���r}�d%3��M,B�a����~�������3���������.�K!�B�0����`<�w��l��C�!a"A���/,��7V%�	���b���-i�}
vM������}'X�
�f�
�,[��M$�g�|��B������ZB!�����"���T.�*�n��fD�S�������
Jx,��d=h���/�=H+-��M{�����:�N��J����v�D���f%.���o��s���
�9�#�2QF�������{��} 7zr�����I�|0��R�H�q�!7~J�K"1Y
9y2�����,O|�9��y��C�W����s[�#��������Gg^�d�����T������c������GII	v���)S�`������L����&�B!��+Rh_@�9�BH�PhY/B���6�^�-�C�j
��%���ot,OnV��Wl�%-�^�`�M G\����i� ��FR7����u��x�����@G�A�s��Ann.6lHq	!�B�3]���6��7��f&��/�����������c�heB�?(�%�BH}�[���/��l^���~O���������8\�a��Nx�
���b
��v����h��Q'6DF��
���BGY���q��G��+P�r� ^%�!tg5P��WUB+��%!j~.�q��u��p�a���VR��JT4�
��[DRs}gb����{����"5������-���lo"�E��g�2�c�HF�7���/I��h^�|6+If���W�	��������nT��&�3�=b���3�V�,>*7%%W]urrr0n�8�����w�����~��_~9�v�J/!�B!gc��{!7�
9�E��# �
�~>��!'�	9l��3�MY��}SK����/0eA�=�&o��7������t������6�����]w�%n�v��
�:u������7�xW\q��:�B!��c�r����^4����:��$���<vQZ}�B�B�?x\{��wR\K!��:���iH�S��5V�+�������KR^����B�����,^�7����k25��8��{�4��������p�dU�`gI&r����8���=���d�h{��P�����\�|�}u�n�����D�w:\���;��� R��B
���x-9����=|�L	�Rx8*_����6Q=�=T>�,��F#��*��B2�����,=�������\5�e()�b[}�&Y���FD�Uh���g'��|�A��n��{�������U�y�j��w��bh�yl_�c�����1�����O�������_���/���_������0���	v�F�4��;�������G��)�qK�1���8�u�s+I����UUE���7#;;[,�}�����`�q�v�!�B�,��sP���*|����7�) ���B���]�A;����D�w�M����b]�6���&`z��`5X�k�.��M��	�Kg�3331k�,���[L��p8p�y����4[!�B!�[A��G����0���_:7�W�@��[�K�1��**��J��2�|2�2�����6��1\����%8��^�'l�_��Q\K!���5<���r���'a1��qA[��C(�e�H��3A�=S������n��������������H]�Q�y��PU�2x�{��������R��p#!L������e�TDI���bdG#��X�H���1�����1M���`+~�\���j*nmy%"ma��*��=?��S�2Wj�N����\	��
��E�����Nnu"���6^]E�-��-Ds�"c��R�����B�{�=�����	����_yr;�@�.a`K#�'K�wl�s�\�n7$Y�}�
�C���f������WT@WU�.��O�C�<y��{'��l(�����y�DD�Q����]���O$���G;����=�K��?}>����c�_����5��pyB�����kN��7P#*����GY�������������D��Ga�;��tv�����ZrPP��{�Ea��Q����HV�z��x<���B!�B~o|��E�mVL0)F��c�������eR;��
4����.�M��r��y����n�B!�B��(�%�BH]�Y����n|���`�1K�l9�TG��������m�m�
�����������6�$��hn@�E�/����7���:	��x4/v�f�sLK��f�����h��c���-���m�	�]bZCe��#nku%"�a����$�-/�^�2W��-1��T��pWu7b�`3:4T`���R��]'�|�8������rX8��nD����z�(�;v�lw@�,g�rD$��d�{n��^]
����R59wI
��+��tj"��Qk��<	y���x��Wp���b��1'��c���O?�����A!�R���<R=���N!�Y��f�d�����u���5��i{���8�&��"��R�������_�:�Y��o�{�����E5*B!�B!�.���B!uQd�$�{��:I�U=��Zr�H����.�%*����qc�V��� �.aP#d�-�HGq���r�Dy��HR�_��!���G$���\�,�Ku��S�2����N��ME;� (��Z��S�}9�����6>W��C-Ah�����2g6����gL����m�������k-�y�� ���?�����B�(<n�UU��Yw�D����92
�q7�2h��x�l�e�P�F]%�!��PS(��&Y����f���#S�n0�e���~���|d��|���JJJ����G!�r�(
A���/�Hr���)�Z4��B���G�I���mhJ/�'� S�rm���<��>�h��Z�n}��h�B�D!�B!��E�B!����%���!�*��/�`�7��i���8�%�.�t��N����&�k�`��b��a�W�@��v)
B.hkDF���
]Ti��d�eW���7������U1���a���PTS�8[���OVE�=5�M�������>� =�!6�D�5^��}��"g�}=\.��F���m���tr
�D������F[�#���5@+�G���(�i,��@8��A���P�����������i��6���1�9L-�����2?���{�^�EW^��%lG�w��x�(u�����C.D�c��6r4��
?�������!���!�������=;�'!��;�=����<b�X�V�VB!�����x!�?��^Z�_��-,�h���,����$������6h_�/���x*����K��i��a��	��3���HL�;~�x�x���yyB!���@���5z���B����]o�(��A;��{ ��e�����/��x	�Q�3��A��
��	����r%`�d��z��}
�u�?:���^��}'�����z�&��_:�����W-�mh{&���S�E��@
l������/���\�#��{��@�����ZB!�����\�����D�	}����j�!��2ZY���=�<L���B�k�A����rrr� G_�_"��Qu9U�X�+s7�������!��T����C��l�^q������`+F��������	�����l{{|�ol��a���F���.g���B����,�<!!��n��ir:F��g��A���w��������!AR����3`j�	������������JX8�}��pL����lHf��h�;vI��W�*�����`e���=��N��_:}v���g��s&{�>3�1��i������4�Q���z
�K������C7���
��9}�Kt��A
���<���QtnD��N��**{�^DEE!##���	!�Rg�{�������~����m�FS�2!��O�f6���A��K!���E�<e@HwH��AJ�0����AN�r��k�@���+J��!'��dto9��.�U'��O��$�	!��/<��X,�B!��n�����Uq����I1bm���P��A�#�"����:�Qp
��_������a3XqY��f
AJ`<���H	��A:{��m�x���x��Cx���������n��St������<�W����+�<[7����	%2
��-E_c�4�w����![m0u�.�,[��rp0��h�EPb������/�fj�����H�
���!��7���
;�6Q����r�(��KNNS���vbB!��U<`0d4?��B���[	!���1`�,^�������B!�������M�������S��]]$�h�5�Y`�a��RPH��������9	!��/<�������B!����+$_��r$�"�����k�D�)@Tu���\���+�\���&���m�9�l�������4	i ���d���[�c�8�x3=��l�����_5JT,��P�{�
����#�Ye�>p�����g�~���s��������-�-'Ru
%��s-���1UA����c�$�j'Q9��n�maVL�5'2���"��
��jm�lpp0"##1e�L�8�<�{������������v��{B!�B!u������9S$,2C�=�.��R,]��v���!�Bj�����P���V0R�`���CI����[
�u�v�i�[Fj%$c�q7�tHPGK �-����r���C�~�j��!��<�UU��ZB!�B�>h��y�Kg��ja��af\�������+�q�P3nhF�_T]��eF��s]���f����Nh���N$�GXC�{���V�y��v�ZL�>k���G}���z
O<�����3�`��Tm�B!�BH�VUU�3f`��}X�r%������gm?��#>]��{B!��A� ��oCi�+��P�_��ghe�o)/���9�j(�WB���9��r�W��V�+���g���!'�������O��{B�(�%�B!��R #���/�
v��
\���q�LG�5=M��������`��sL+\��b��������?��K]�xu����3�������s��E�//��?���%�����W�����oo�/�]g^���B�/.��+_��k�A������o���]���J���`��#���#��y2���<������e���U'�B!��kXh&[[c�
��n	��� 7x�����+�lA�7lO�JKK1j�((����B!�L�7�$vm�r�0hYS�~R����������L��/�V4R����"�C�}��� ���d���<������OL�1��m�3o�/�*O������5����]����2g��>h_����������m�uEh;o�%���mJ�#��M�B!��O�R
�%�������P�����n����]X�O}���-���2����
��j��O��
����wk��f/f,�`��5b}i���X�6(��{���dIF�-��D�*#���,��&'��5�\�l`K���ic��T7~�����|��H���;f�W\L��r�
0 ����KG}���MD��F��x��
(wW��C+���
�|��V���I�<��#py�{|;p����i
!B!�B�9G��Ai�:���;r

QaI��r��~(�)a�X�,�=>r6�*_�|{���-���pz]8T�+Z]�>�l�c���TWWm��?��O��"�B9�$R�PZ�$*,�1c '��}��)PZ����SH�Y_#��	P�-��j6����'��o��f����_[_��K~�^�~����B{���J�&o	��/�4|r���k�C/[�v��h�Ac}��k`f�
�����3z�*��v+������?:5�Z��}r����B�Y�4���9�h����\�Af!���Y��QR�#�w�Ay��r
v�/���+�QX���!f��n��m^��cz��J��y[���K�{��j0c@bW����kNdQ��������3��'$�?��F�A������`���L����V�6�F\�:�����\����0q|�O����y����<N��"�0�`VL"��t�>sV�a��l&�Y��
����.D��F�om��De^5y���x��'0q�D�7�h;v,��������!�B!��3���A
��X���%x~���5{,5l-��77�w���C����X��O����eY���;���
�Y�Z��%���|J ���|���{�n�s�=������&M���k��
]B!���B�@��(VQZ;�&��b���`����`�d�����M!'Nb�}S�J�XH��tQ��'>KA��^���W��}��N�����8�!����B�J�&fK!�l��@�$E$G���\�M������'Ts�}�'(��f`}}��z�H��`R$�NV���n��`�{~r�e#%u�]m��������G������5���8�;����l?vnXM@wv^�������1��	��0����W��t���<L]?_��e���7�sL+�9�on�+sD2<��^��Q�p�;��=�&6���@�4|�k6��o	��[�$*� v����2e
~��7DEE�*�EEEHNNFII�������N.B!�B��C�8R���)LTE��T#���CUL�����>Q7�����'���K@c�#����|
��78���f�g([��x�Dy�I�x�����}�v�����lc��e���C��M!��rB!���''��@�rP�UT���'Br4���:��l�~=~��=^M9�${3��|�j{�������@���>f�#/��q:��������^����N�������/�B9k�kw��_ ���d��I91u�N��L&K��/���4��F��`O���?u��m�w�N^z�/�\���9��i��[���1��*���o�zP�>[��M�`�l�h����I3j��R7���[������pU���1�h�&�"\��b�=����y����h���_3��+1����j>�w5I��}�������}��|�?|Jn�Z|��Ze9��~��<-/W���� N����-a3�8�S�9�Uy�pWbS�.����+��w�n�[[]������!����R����N���"�)���
��
Eq+��*�ay4�x���V�KM��o�>�����/���?�|�n�S�N�����������	!�rZ����[���-��jq������'�Y������m���s�\T������]Nx6o@����f���������3�c�WBw���B�!>��H��L,����#�%��i{���S��~�4�������la�$	�b��b��}b�(8Q�p��E���4��?PVV�U�V�X������Q��^x/����)��9�=!�B����
���J�/����W��b�g��s��@�WM�������B@��m'��A��r��l�R��7���H}#GF�1�V��6��~~��L���?c�����R�P\K!��%K���$��3xB���i
^������VG�7x%��j�p����T(��\��/�@E�h�e�	�l��o�*Wy����p�����S	���sn[������`e.&.|����Q�?�\=2z}�X���%���I���3����o����������W����$�|
_�� �LGi������>^���n&kc�m�R��H�$�����R7�7cw��5�*l��������3+&Q��H��y�"R��H���	����}E$�W}0
��[���\�P�����V��G//���)�#���!�G���O�����@�����>Xui�$�"a�'!�2�	�M�h���v�t�i��}��w�������_1(���]�B�'�{�?�F�D��Vb�Wm�x���������&�&��v��WU�:u�$���+W����!�r��W����e��;�P�s��e��A�9,�qy����������;DB�!>Q��^�P|�=nhe%�l���-���B�^1�������N����`r�����"��CJ`�F���"������ Qey�������p�t��������r!))IT��o333QQQ�f�����4E.!�BH} ������d��F@2��m����3r���KB��)l$���,��!X<�!J������b�^�`k�3 |�I���M>U#��q-�'Kq-!����b�9�U���t���;��~����#��8>���ad�
~�b�`���_��`�z�� �L,����`*����e�U\������-�h�� �=������`>1?�������7��Y��8T��u�[E����+$8��V�G���/0g����u��\�!V�u������hv`|�Q(sWbe�F|��P��;��y\/.�b�����E�=��F�L�\�GEa�������.T8�sH��r�����K?�hv�jh#����I���G�C�1��.���7�]IHB�����I�X>����g�&��~����>��Up��e��
������Qz���|�%x�m��x�������*
XMj}5~�	>�ZE4���#qI�!"�����`����!��8'�f�������_�[�m�.|W��}B��P+��<�
��("a���oVV����z����F�B!��2�e�r�pH��,�����7�����/�t��#��� ��u�s�A0w���LQu��~
������&��O�2%����GF����+��!) �������8����x����n�@�'��pIDATL�����O����$��b1o����SU�2w�+�7�f��q����M[>%.�m������<�-))�v	!�BH=a������+ ��)�#�F�Br���J���-�3G**�
I'Pl�>��<_U�Z�HC!����B�Z��]�_�����7r��c-n���!����LH��.cx;����������S����;q^k���6	��`3K"i�W�������,"���=���	/���O����h`1o���"��f��u��q"q��	�'�*oB�A�wD����"l,��~	]� 0A$;�;������_�*���J����X�OE����+��50���-�K(��`b/�����+t��=����\jAb�;{�w�p�P����I+��<�W�Q������	��~A����\Z�a�jE�=�z�Hxwl��E+My���<��Mb���A�$*�Dd��\YY��_���CJJ��;s�Ll��	k��E@@���eB!���A���5�d2C���ds��_,�P�c�(�����|?-�����{p?t������R���9���"��3�Z�8��4G�������xj�41��������A��������?������qp2^��	
jJ`7��3�{z���3f`��%�����f��W_}%b����S~G!�B!��I�B9�C�C9�%��okM���|$�o�B����h�Y�6��;5^������������-�& �?��CRD�r�������0H��V|����� ���
��j�����V�-��HlV�����<UN7�3!#^��|
n�mW�Qa1��G�tP���*���I��w���[����E��_�{��<����[�{�z^Y��En����������Yk<�t�N�j��7���|�����{?~�������R��}�o�[����Wyj�=���<�l���c���A�{*uU�����{��r���
�j��~�~I����*�?9��;���i��_$����o�zM�/��;��vC�(�����������)����j���b��]bd����1y�d2D$-�����!�B���i=Jo���n�VR�_�T/��%.�S�Ml6�7C��K��i6��(Hv��|�7�?�B��ap-^ �B����{�%	PW��^�3L��������Y��"|��.1�1���0+&4J�n@�-�&��po�	h�.n ��"�TY��P��� >���?{/��6#�]�|���	�\~�������������g��o�����B�B!�BH]������S\K!�B��G4���F���0)]��x.G�-)A�b�Pe.��EwdI�G�by�t�j.f	��G`��V�W>����
�L>��'����/����HAi����v���k�@�%����x*�j���L3����r|���uL��]^����m�*��@V�����h�����U�T�����X���EB������R����(0*��=*Bv�jX����l�����K������.���o-��M�;�1�v�����-�o����W��j���������"YyQ�*��HK;J�����7N��_�#�a�?�v���(B�;���t:<��@

B������![�0$����*^z���!����^\�X�ITn�����V�I:�����n��i��tA��-��m�0`�$'��%B!��~zU%*^{�ko�
x����+S������.T���fx6od���6s�^P�������]D�2����u&��hUU������!��i�n�v�5�X�)�6H�@�a�W����(��>�M�6M$�%<����������P4~���B!�B�F��+P6����E�_%�j�oC�3��z�Z��r�;��`���xp���-'��"���$����5����B�/_�s?�DB��X���>f\��5�Jo�������{����K���VPS,*�����4:�T]x{����
����o��{������m�!�)���pmF+F�����cW�xg�L|�{�H;�6>O$��]���%���	��|$y�����w�}�8������3dh�m�[b�Q��d�0�Wt���(��+�:��=9�����kz��w.,�h������j��*����jd���������`����&�"$n����w�}����)��HH���f�/��U����Cc�}��U��"P�K�����10�*�U�����2�i�_��,���Llb��b0��?��H_q���>G��[���0X�����c�����i�l����@t��	������1!�B�i�`h���?�M����B

x�
k��������f8g��#F�y�����04iC�Vb��U[��C�Z�^��&M}�K!������WC�y+�7@�v-������.�7py�c�����C"����������B!�B�{(�%�B!��k(��z�HR�,�7����T���	�.����J�/t�|4I��*}�	I�OR��7��/|O��'I���I����������1oG�q�����e<�W��E��u�o?��o2@$��Tq�PC���O�EBA����y0��A�����O_j���F|���1�L��F���,^F�e����RW�����\����GXf�d#~<��-�h�D��%&;*��xu��h��H[�����=����������5�5$��D���|����s�V�?(���W�c>k
o�o;���$e���#}��Z��\ZZ�9s�`��Y'MH6��1b������	!�B!�8�������BN���t��k��V�Z�3f��<����n�]w���={���%�B!��M����Gq-!�B�	!���I�.����T����`;r�l
D��4�D�JOV�mA������h����C�^��M$���+��h�mh�X$��������b�n��e�p�+*/����$�$�MY*z�� �w��JsKu�����pRW��p��7����9�>���l�L���U���Fg��`L�S����o����c�����`OY\!**���E���]�����i
����=���{`1�-!�����������j��uh������L9K�&�x��BRpY���H������<���6<)y����2e�����Gddd ==����eK$%%AQ�� �B!�������W�^��� E�������c��m��������y����w/�6m��Y�fG[���E|��G�B!�B�(]�w����
��P"�}U�4
�m���n&<�W@���?��k�h%�P�^�D,�����>g+��!���/����k�W�b����t����LQ���#n���������L\�����U�P\K!�%U:��RQTy�����'���$Vf��p������zr�>�uY��B��X�8{5v�@��t�,���{F�)�
wBg�%��������
���Drrjp"�o�^���,V������
(t�`W�~XYLT�*E�%X�2�tl����
R�}}x���B
�Q�Hd~a��:��t��S�-[q���*~��E�S��L
�v	5n����*��+]AB��9��e����Uhn�t��O^Q�[l[�x��

j�EBv��t�U�����]���,�8�g1�*rD��OY�A�U���$��&�d�����&!
a3X��
�;�6!� ��}���xn/D�����H������i�W$g�uF�#��������������^�E;T�����
Q�����:�H�N����6����^�WTR�>}:���^t���F�B!�B��,��s��m�5�H��!7�)�����.U�*((@�>}p�}�a��Q0�-�B!���H+*D�W������fG����<������U��k;���C��C����5�#/�g�:H�9$rX���y�����B��=�k	!������	c�t���~�m0u���B!u���|Q=��C+1>cjT'*=5Ht����%�t]T6H
>����&�j�X����c��wq}���.,�	U^'~:�Q�p4	NA��h�7�p�py�
�� �/��WX������<�9�.�����c��1��>1�_�Ca�..T�9�u���X��	��s���4�n
�Ku�@�a���d7Z� UY|g��Y
�����ye�H���rve��y�'�����y�X���W�k�l���������5Qq�u��9����N�
�=��p��2=V���*���Q\��s#V�Qaf�B��1�+{������f�r�5��-������/�5^-���	!�B!�G
�����S�9�Z��C������$e{SORW�l6�����t3�B!�����e�����GQ�������(�����W?(Q��5
���`��
�t��l�^U���fB���{��(�#u�kccc)�%�R��������S�!������~�[��Y!��x��Hk(|)�@�-�A��S�����62C$)s�c���������AZH
���Q-1~���)k	2�R1:�|���)\��<$��
��$I��	�������8Z����������w�QUi���4HB
�������
TTD�w����}��P��vQq��U���tD� Mz�IH���;��c@TJr����,������{�s�s�c�CV�b�p;7����4�x�')���B��f�O%)�lr���T?NO.k-+7�����[��u�ft�q?��*7q�[E����Q;3���������*�Z;����l�lgvN�re���%�%��Z��I���~�k�V�V���S�$�'z_�Ja�U)d��f�&Y��>�H
%����R�����[�A�pB&)c�%*�<P�&Ml���6n�8[�t�-[����|�r��a��xI����
n�p����G,��A���B����_���Mv����{��g���i����6s�L[�~}��"""""Ry�9�������E������Z�o��5����{�Yd�j���}���g-���*�n�������z
-�yK���j����.�9��!��p�y�7�^A��!�����Z)���%��+U��3����.�����P�Z��E�L�Pj�y[�����h;�g����9��|�����/�����5��9��l�n_}������DD�**���b�]6�N{p��9�`"�/�El��9����vv�c�nf��=f�������Hp��6c�/6y��x����!;���6f���5��Vf����~�������[�����^A�
�KS��:�U�v��~3;�n|+�UQ&T_���p��1$9�M	Yj���Yy6ea��6�N�?���G�K�nR#��vs�(I�����f�fff���C���
X���o��7�����6o.�X	:f:��D�����\��n��O�P���=��c��#����:��v��'�w�}g�H$�h)i�u�,{���=t��RS-���7� 9'��1�6Zd�
���
����m����\n9�FX(-���8��q��o�6�B����� �����;v��O��R\+""���PF�%7hl�]����\;�[��Ef�f�9��G�����y�E<�~�y���6�� +�e�����Zda�H�y+?q������Y�D�����w�ykG��qj�Iy�g���8*������w���v�������)�������V�L��z��\2���l^a�R3l�������Jrj8��$��7�����s-#��{��W��5�X��j��6���	���{�V�s����/��d��k#������Y��f��(�6P����+7x�����R��<zv�M�5bvM�J!���eB�_Wy��7����<���x��!o7�0&�e6���_ou���O<��W�n������$w_�����"""""""����U{*	6m�d��r�[�g���U||���f�:u�z���f�������L����7^t�����,��S]2rr�V���I���m�jI��Zr�&���W,\���3�Yr���sd�J���o�}E�R�u�����@���m�n�2���U�r��7�h�K���u����2[[��*��>����>���=���Y��/��V>��tP\+""b�b�C������S&��O�4��!���e�-�V�6�������������n���mk��>pA�-w�E�?����p���
���Er-��u���P���u�E~��^;T��<� ay��h3.b����],T�������M�n���X�J�lU�:�l�m�$�V-[�%7�X���Rm���������k{e5��V��9�Z��4�]=��{<��yM*/7�P�Zg5s�'��O}�k��H��k<�x��<[����}�]%e��Wm����yV>=d)I!k� l���Y�t����������]��B�����t�g-j���>����X��nIT����A��o�a��v��o�>v��������+I���/�n����w�m�z��pX��EDDDDJ�H���.6o�zW�r��E�Z�JU�rs-�b�KBN�Y���c#<6Vi6\�����:���e�K�	�H0JT��������DeV�Q�0���B���O[���J�i��o,���fI�nx��*�}P�l�l�,|2����},�u��O=� �9g�KF�:7��Ya���f��,\�,�����#""	%/�l�����v��E��]p}�]9lk7y�
����-Y[PQ�����|�g[r�-=��k��._$@���YVf�*Go�6't�D��5j���+���k�L��������Z,��j@7n�`�����HD���U��V7KJ��z
,���������f--T���+Tt�Ki���&)���[���LR�Kr�n7IY���""R��������y�����-�Q��������t�%�l������[�H�����h;��Yz��y�J�i�j��������J�������~B�����nm��<9KDD�'9��N�h|
�Rb?S�A����j��D���!kT��>*&�/�&����v��~��%)�J��5�������pM��Q��w)����G6l�-]��,X`3f��������Y�l��������XDDDDDD~c��	��C��o{��������s���"D5�e������+�2�e���=ZDDDDD$��j9_}�m�2����KeC�(�����z���8{�|�hL���UH��^��2�i�-���Z�5�<9+�-��-$�uh���
���hi���Y���f��5*w�y��Y��!��d�y�[(�����
�O�a��5Y��y��4o������p�u����������h[���*h��Y8�VA�������������;vKFp~~���3����[����_�~��o���n��:t������%""""""R��R��/��&�^p���K���s��{�����_k5!)����H �T�P�NJJw	��
��x�YR����0o�7��.��}�X��?X���[R��-T�,��������P�S��)k�gF>�B���e��p��cHDDD����y��O�^������f��*���U�:u�����������eNAi����V�1�c����4���.0+S�m�6L���}��7Y(����]�*CD~}�B������"s�}��y��������s������>}��~��������>�M�6���Vjj���W���q�&	��q�m�M�z�/��#�����w���%����-_�P�����o��1O��)^��6��Y����-���Z�_�G���rl��mO�)�b��[����^�����j�%#�D���g��o���	�o��~w�w�}]��$e	/g�y3o�(�6����=�"��%��Hvlk��yfe�Anr_��y�-/V�������M,T�D�r�Xd������=Nv�����[�-��s�����3�����k0WDDDDDDJ$��""""""�;���`�����y�,))���DDDDDD|��Zn��K4.�|����u�
�&�V/���[c����7��E>j��1����"S����2/{����Zd������B��m}mU��]X"���k���m��e�������&��Z�S�F/��[���{$z���mW\��g�$*3+�n��n���1c\���%K~s[�t�m���U_)�"f[��j����H�c���Ef��Y��~f�������Yr���������TK�lkIG���g��!�k�%���B��l�"s|Uf������i��6e�[�l��[��7�������[c�I`I�f���/;�F���""�����e��_�~���+�C�_�$���T��O�5��"�"""A�tgT��]����+W�_|a�=��}������_��~h�v7����Y�V�,9Y��DDDDD�����f�E>n���B���<�,{���z���m�HTN�`��_���2u\�eo���r�/��m�j��m���x`��s������yk�G��i��Q��{�B�{E_�v�y�\�u��	��C��o{���I�l���}�7����k�����m���V�zuw�2�"""""$�����>���m�\����q����h�L�[�PZMU=�������a��������g)ec���kEDD�����Ek<��<b��&��vf�;�s��l�b�$Y��IV'+���EDD$vKEe��5k���>�l����5n��6lXx�_��U�TI��������~�4U=��Z�m�zW��d���gTQ%W4o�$�-s��Nu��-w������%3��P����]f�E�[7�������>����w�P�zf�5�"[�K����.+�����U�f��������[$��	EDDDDDBe���
E�����e�Q\+""{
���k�l'��b����N)vD��W!��3�����P^��r�-g�����Gl��Y����W0�_��6�2�6��rGg����}�Q���KY����8�6����~?<�,��B��r��-���e�*9YDDDDD����Y�BU9&�%�m�����fe�m�`V�Stk���C�"[,T���2���~�Kf�T�P������Q9K�[3���r��fi5��������>}��~���e)�m
��fffZj��_�XDDDDDdO�7���te��m������7���"s�wqnQ���nr���K}�O�}k��y�������V�l��o���Z�������l�
�!K���q�l����7�����y[�����,�v]��mI�jX�JU�r�m�;�Y�rgU��MFZR��Y��R�u����-T���+T4/?��~�ig_`[��li�w6K�
�"""{�nMT��i�[.h����b�
��D��>�N=�TWQYDDDDDD���4��[�x�=��c.�����&M��M7�dx�%'��[DDDDD��O'*�����1o�����P��������`���w/��""RbD"Y��6x��]q}��O?b['M��:u��=�������h�
�-��a^��2�mK�t��k��p�t���k��^iN����hi�mr�X��{E_�^��������������������_oc��qI��j��y��Y�~������U�V�-""""""RrM�4�N<�D{��w�|��V�fM[�p�]p���O����c�Ip��YJ��*���[�v��Rx@��vPj8%�k	�^'NT\+""{��i����c������$R�
��I�kZ�[��*|eiG�pU��P���+$)y����%7jj��4��4�r'��������N���?���--�I��D��k]������~�%Q���3f�����N:�$<x�=�������~h����9��
{�������H����g�<��eee�����������F�e��w�[Ih��9�G��������
��8�bZ9K
��ZL�D\����""�G�-Z`[�{�rF�0oknlk���
��������T��o�#�VX�'Z8���9�(���,����u��q�%.�����3��E�Y��6�����������������[����|�;w��)S��?�x�_��effZFF���<�H���������e����DDDDDDDJ�
6��S�{���������
*�i��f���s�E"�]DDDDDDvL���c?m[����J��&q-+)��=)�YK+�����q'[(�LlkLN��|��m|�q���Ki��r��������?jy3����<c����}�������-�c�
�-T���z���JM��h�L�EDD���:�899���bvtRR�m���U_)��<����&����������"""""""�UV�\�]���KO)kG��le��$3��B\K�(��""R��2�Y��X�LYW-�l���Q�Y�9Y�],�^K�[��<�2����;�R�f�����>WX�O���GX�>�Z(=��4�P�t�e�?���}m�!DDD������,���k����|��-_���LR���m��16s�Lk��������%""""""R�T�T��5kf|���[�.��`5�	&���K�n����DDDDDDd��IJ��:_g7�{������jtX���f���]��n)��F���VDDJ��dK�]�$#wW�n)-�����\E�p���\��j���V�-e�6��b/K�[����(��U�������F_*��%7o���������~!o7�0^�z�=��������`-Z�p3r	t��~���;\��������H��������m�1b�]x��V�J;��#�|��6n�8>|�]r�%v�5��m""""""A���W[sio�6o�m��P���P�RZ�c�n�3�U|%-����o���.R\+""""""�\��Q��w�H$bK�,���4�����
Zff���3����e���]���������./$""""""B���C��o���n������\���A��7w�o�M�f��Ow��i���z+W�{������HpP�0�����cz��V��*U��#zXF�+�l���T%�����H"����_�%k=�,��$��<���������OYZrA~������%�f.���U�V>����|[����ra[}�����=�
����Z$""R�����k���k�����MMMuAn�n���A��-s�fee�@�L�2�g�����������<�$�~��&N�h'�x���;l�0�������b�
7�K�r��i���������f������_"n[�L�%7mn�J,�b������n�J���������#��j[���f�5�[��y��G{��R�Xd���G�-\�l��
�%-��r������VDDv������)y��bv��V�B����>sI����d�6J��eCF���O��F��V�L������L��$:��'�F����<�*e��m���}!kQK�DDDJ�]z����q������6{�l7�K�:u�������5n�XI�""""""Rb1�w�����_�	�6l�|�.\����u�Z�F��������gXJ���v���vhwwK=�@gUuI���-T�������Ar�l�,�oV�����������oXd�-T��mh����"��rE_����o�e��������<���Z�e�g�����.�8z%�
��}<9�&/������l��>q�2[�9z�Z����l�V����%E�v��).���$-�\��=�07�%9���H��K+*o�����5j���a��L���BE����szzzl����������<E��$\��e0���������V�P����������EDDDDDB�����"�?������/�p�������l�eo[�^�Yd�Kf2����f�����2�X��k�/�Y���f--\�w��i�_�)��DC���yvd�d�xfw��c�vK��+#�f�ggtNu	��r��s=[����>���M��g��i��WS�\���G�F��l���������,�\e�Rc�F�e�����{�.��Rk�����U�;�0�����n={��V�Z��,""""""��PM��po��fWa*--������.?�q�*P�����H��]n����e/0/���f���uI�����)��UJ�,}���?D7�,T�(K�g�%���*�h�]f[r������p�c����)��]-/b���yv�K[l������C��������j��9�,?RPU�S���F��Y1��07�������9y��z�%%�_�����F��������wDDD�d���}yyy6x�`����\��i��="""""""lOV�*j��Uv�)��}��g���l������Hb���k�U�Y�\{�u���k�
],����y����r��{�_������Y���*�!���y9�-N5K��?9���S\+""�&��r���=�y��M
E��f�+��j9�C6{i��.�X��c���o��j���K�-X��q��V��M[�����nOM
YN�gm3���H��[��aI ��Z���c[EDDDDDDJb\���k���������$�P��-�����B6o�@��r��R����E/D�o�YFK�V�>���2�Yv$�^���=2�Ew{j�k�x�r������|�{l�������9/�o\n/N������\3�Vg���L{7z���*���8�Z�&+��])+3d'[��!KM�)�X���5���'��|�����a��]'l�if���b5+�����D�C�s����V�Y�zI��v��k�d����28�DDD�.������L$������q������k�����=e�����m���6c��W�\���?��l&L�%K��d����m~6�W��a���w�}����J����`����/m���6k�,��+V,|������6l�Z�j�Ar��y�k���*U��_�����C�������7�s�=gp��j�*�UDDDDD$���Job�rm-����YGZ�l���J����Y��p���R�,}|zJY�W���'���k~�N5�q�f��k#��6U��wK~���g3�����ZZ8��]<���d����ZN$�R�)6j�$k\��%�Kf�RI�k������Z�U�RB�jrJRA�K��!kV3l���-#-d����Bt�kP5l-j%Y����D���C��F�%;�����?��>�y��������H��[�XI��[��K�e0�?���
4�>������!C���~r��{�$�[n��^x�������g���o��%��������>������{����~�-Z��/��y�����|�>��C{��G��n�~�����i�����w����C�]w���c��-���o�[o���y=�/	��?����K6g���m""""""��0����������r1����m�����e��Yvvv��{���[���nBmzz��nG}�6+g���������k��F�{T� {�.]�}��3&vO���g���j����s�=��'������v�"""""��-T���*t2+S�,%�B��B�fi5,T�c��Z��-)�d-*5�6Y��?��]��V1���Z�e�UK��ku��5���U�mu������G��my����d�t�M^9���:�jgV�2Ii�C�����K/-�q�o���v�5������i]�v�#FX~~~�f�6mr�����w1��'�l���k��m����c��O?�-Z��R��us��������g�����r�)�|���=���^���k�������H��-��T&������7��[o��������n��f:t�������gP������w�=��F�i>	��|w�?��#.�����vA1��srrb��?��}��^/��B�^{�������[g7n����~�������c&����_v��Q���_�1����[�nm���������O%�����U���������'Ov��{����@���H�@&q����:��������q7?�z��.��k��,555���"���V�J���_p�nE�
�U�jU{��g�������f���$dbV�`�}<�k'M�����'�b����*[}�i���	����-�f���������m���X��o���9?����-���,w�H��0�����r�|o����9,��.w��[��Vl)x�U�kl�����R#KIJq������P�)�dK��8��)6n�O6z�d[������mo��]��LkR��U-[��lZa������R�$��`���jb�;������0|�UW������#�}�����'�t�d�e<����s+�n�����'�|��u��`�*U��/���y�n)x��qc�8q�{��~R2���{��me��u�DDDDDDQ��d��bTT��3R	�N;�4;������/�w�qn�\LP�S���*d2+����XY��o�:u�%K��������������`CP�,Y>Ar<�S	�F�v�E��
6t�����~�K4&��c��v�YgY��5�cr	��DE����n=z��f����+��o�q3������]^���=�EDDDDDv&�]K���Z��WwU��	���8��O��	��:u��!���'7���q�\���7��b��Pi�A^hIn>�������X�����*DL�}��W��tq(���~�������u�<��M���8�iii�����}x��'ZJJJ�/�����HI���2�me�;���5�p����a��[���f�2o�zK�Y���7t���<��*Z�Re*Y��)���l�����WL��~m[���y��6u���.g��W���I*�PI���M�\����?YZt�!����+������R3���]mE��i���6g���<j�$k����_�(��sH�%�����2v��[���#G�����rI��|K�'V��w�}�vV�%�du �O��^\��+q�������M���g&3L�4���G����=�Xw�3��kQP�����������ADDDDD$���LVX�y�$x,�Fp�
�x�� ��A���#�,|/,D������M�6�}&����3[�������r2A+	�,{^����L0��5j�YpI��^�p�{.���ff��������������)�������"TA:���]�an����#�������%����V���wnq)��k�.6�$�eP����*Lv&e �	���>-���T�� ���3�PE)�R�����fL�����$e���Z���XR���w$��i�M�Yd�z���{�m����M,�ac�_0�%:'����f;����vB�#,;?�&��aM*��r)6s�\4�K��Q���l��|�&��a�Uom��*X��*V+����pKKN����Pm������R���I��l_i�k���V�%i��/��+�� S��1\�XW�Z���{�g_�������E�H\��UoIB�cW^�����n�~/����S|���S���X��+"""""�n���e�����w�����d�S	��4��U�V�(�{bI�!C����djf�R�JR>������]t�"��c^;>%��o��?�%#gff��n^�l�o��\�n]w�G}����3�r��S�Nu3����Gp^�������H�k��+�Y����3f����/���a�������U��7H�������0���U��`0�������8����������~'�g�.��O<�*)7i�$�L)Ir���u7^i�{����:g�����p��We�%��ge{o�'�i�-�2/�u9�BI��Z�6>p�mz�y����R��
�}��p�E��,��jkP�����x���0������rS�LI�����3�c��`D#U�T���j���;�������D��^���e�Jz\��@��*�$&��Yc&�����b&�2������������m���"q,�����w|�^w��En��BV�X]���w�y��"���I��W�^��""""""�k�%*������/��{�]XU��Z��n��
����Z�S=����wA�%�\��sss����������a�oQ<�De�&���kW�\�n��t3��e��9�7��{#���k�uKQ���>pWDDDDDDv*,����~�b8bG*8�d,���e�b�,4e��3�<�-��=��L����O�s��n��x�M2f���o�A���L�e�b��n��F�mm��u��"5j�([�t������DDDDDJ����Y����.3������-�Q��)V4F���#�����m�d�3�Y(5��fN�p����[ki=O����-�rE�IfI�$��Y��&�v�����B=W)�Nt{�*-�i��Rr��4�3���OTH�����E���+l����*��c�q�L��GK�c�����G}$*����+1lQ;���[t% �by���l���=e�W��*���N�0��W�ry
�D�vCf0�K�0���wo7s��_���6m�f�����=�P���+\P��\�A"X�������g�KP	&�u���Z�v��c�z�)7�j��,X�����'�|��w���I�&������:��s�WQ�W�^����U�z������.s����1�%��N;�4�<���@e,�������y�,g�{���������EDDDDdG0���-~pW{����O�>���,4���+ e"�E]d��yav����J�;:��� �cy����-U�0�g�u�{��dee���2`�>|�����7n��
6�}Fbw_l}���\uf�?���������t�I���C5*��=�����������>��c7!��]]�v���"ne�����!""""��H�dB!��1N��`�m�2�R�j���l��Y����V���,9��ed��,���Y��6���m�:�R��b�/�Pl��9?��'��{Y��X~z�[��8�kh��;q���#�����bx�����.?���n������{G}��w]<I������/�3�<��kE��~�i���/��>EW�;v�}����k9��;�>q���\}���������+Sl�g���5��k����o������{'��Y���������FBFFF�����De��A��o��**�A@G�r�f����ir�q���w�&���`6,3^Y������>��[��������|�}�������L�l�#�<���,�`��%�n��F����]s�5����Rt�h��,A?K+���������>�=�G�J���K/��z�!W���_���@`?}^<^: �J�""""""��`K��Qe���$
�O~��.Vd`�Nt���K��|��v��'��'�X8��+�7������	��_~��y���n2,�(`��������u�)����,���c 8>!���>s���~�m���{lk���Kegbf����]�2���o���n��������CDDDD$���J5Z�D�$U�����Y���U�VX�g{xN�DW�
Ri���d�-Z�~��JZ\K�.��%=���5k�KRf\���SO=���1(�������c��{�q�!�:~�)��<��b�Z�F�2�}�-��s�=g���_���t�Q8��x0c�L�%1�����'�t���$7�7IZ�&���q[)-�C��BI�%Q��^x��@KRp|��/����V�Z���Llv���y�f�h�|�r�;�)����4�{�=���>�l�� �����*_r�%n����]0OU��n��w;����Y����N�_����2��[�h��?3���� �����%n��a��t/	�<�A��j3	�gY�	������`�������(������W�tP'^d��9����2tp�>&�2��*I�c@�$�����-�������m��%��?�q����~�����P�uzz�[���oLL�@p�N�\<LUdn�������_*p�_�`��YI�D��������x�p�b�����g���Kz�����HP0q����D�x;Re�Nq���1��}������v����xL�1�&�W�0L!����#G�t��q�=z���1R�N0A�he�E��D���Z�e��b���-������W��)����W*-S��0�'Th�sPQ��W��}�$I��������a4n�[��3f�pU��|��*��%�"��2e�K�e9���n��\��K�����������J I�Kc����Duf�KL�
���xe@���$@3k��]�R�����c���Z�y
pG��k�$`&q����W]u�K�&���?���6a��,�>%�~����Q�F�g�������>%i@�_%����P�4b�!C�����J*=����$&�2!x��1.�����C,��\&�������L0f@��\�3S
���������1p�� ����t�q?�����{W����Z�R�j���.	����^{��%""""",�k��_����R�_�~��]��%�3{�y�Y���m�r�\�3I����o���$3�Z\\K�fV�e"/	��+*=3�w��9v����b�[�1m���|�M7)���o0�L|=~�x?����MT	�����9f�2Kt���.hd9*"�p�l�.��w3Ow'�����w��9##�7�.�	���
��O?m|��nY������;�}*�4��X������%Y���^*\����l������K���_w0�A�KpM�������K"2��WZ�}1�K�gf���,���""""""�UI����~7�2J�$\b8�=��V��%+���)+�,^��
�2�����Z>�f���`L�2�&z�O���X��2�M�O>��:v�{�$$�,M�*����Q	���a�l���.^f�WDDDDD$���9Lz}��W�2c�Ll�Of�\?�d_�K�V��{�17�>�W��s=��c�gc��n+�e�`^�L�3	��6q+�����Z�&M�c|�
V:��3����v���o���L�,�k~.Z�YDDDDD$�v[�2��J�2I��|������Ad������'���
6�[q�M�8�/�%�z��u�gf���W<f��|f�����jV���w��,KT�B�x��uy.	�<���Z^��T�R���o^���~VVV��;J��.�o�8:|�p�1��pH�-)�EW�X��S��*�EW2��������b��>h�&Mr�s�@���_���Pa�Amvy�?��Dds��'���H����T��J@"""""d�k����7��a�-3�JlK���s����<�%.S�[�l�/���ES���M�(�%>� �/Y������m���M�4(05p�@���Dd�my�$'��L\��u���I�%Q�?�g����������*	���TN�����T�vm7ITDDDDDDd{�������H���T�]�ef���.7��K�`:t���*""""""R�����1c���nr�_|��2�2��j#""""""R�)��=e�&*��
�=��Sn)�c�=�������m��q�~��n��E�������#��3���}��ep�����#���������HI��VDDDDDD����?���
�����z���3�<c*T�	&��W^i��]}�����{�����i��HY�p�;�Z�ha�[������#I�?��������j��S�N��y������e�~��u������b[�4���_�y�j������~�Y�
,
�L7n����V�j�7v�8^��o3f�p��222���Q��Z����kK�,q����S�:t�`+V�=���E����K�l����U+k��e`�Y|^��_~���n���V@�T������S�������>�G����Q�F�-���*���f�r�������/_>�����4i���9�=��V��m��'�8_p��2e�����W������T�{���y�l��Q�Y9��&��i���T\{8o4i���K��
��#����4�>�KA���m?�����r�eu��~��M��6m���Ak�q��Z��b[�AX���\��u�����+���sM���:v������Q��=�D.�����k�����@�1����w���k���JB�DDDDDDD���VDDDDDD�.��L2��e�\�	`�����;	��+��u�����sKS���������n�����O]�T""�g��!�Z���?�&p����M�6-���@2�"����Z�d�|�z�!��������;���%`��}���x�������L�ST����[����.<v���y�������q�w�$�w�y�}���+�cH6�{��������������&I7(8�����v�������n�
r��_�~.QCo������O'|���
�?8>���z{����~���_�1�c�}������/������t���I�'�wg��Oy�7����_�?��O{��'��_L�?�
���\{8W���p�=z��W\����f�������A�> I��/����c�}��'�,���?���s�o������9�E���>wl��������w�d���^�z������+����j����L�
�yN�:�&�w�qn��#\O�/_{D��:��H&�0A���OD���=�w��~����W�&=Q QV*�����~�v���_|�Z���	'�d��c��2�0��8���n������U�MN����* ����k�a����9����� 3|O�[�L[�vm�o�9��/��A�F�:���c�	�����cf����B����r�
<�7mo���[���G��3An�0���Q�fMk�����/v�
|�.��2�����1s�A�	�A�~�8�{E����������c���i���(mb�9�x���I����v��|�/�h��_�H��>W�E�r����Eq����Vv5�\�}��+�B�K1�Z�|��3��u���:���2 ���b��P��������9s�����=�\�>}z����h��e"I<�����?W�#��K�qo���9��c?�_���"��C���]��s�?���n�� #�c_P�����Yg���V���~b�R���x�~�p� _��9��~��n_�C���L�������~�K��;A�8y�q]?�������M_��C8������<-_"������E���E�\%�����o��]�������UP��DeNTE;���GF:%��9.���_{�5;���\��u��u�b,���a8���G�17.xt�&.�4�9H��O�>�p���+\�2�������0FK��d'���]>7��3�<������	Z�OS�j���]t�E� I��$�p�K��s���^j?��k|3������*�A������\��?��$������o�c���c���w��?N�TI
���g��c����+I��g�'~�;�!�����^�Z������i8�!�q��O�}�����w��	!��=�X�q�>�{����w�6�y�@=�W�K<�	�[H��z�.��"��kOQ$��=�{�'��,bErk��L����/	FT$�Z��e���v�u��s
��s	�U"t~�f�r~�:�(�$��o0p�����d��?��}�u����I�L�����z��{Db���9��q[��>��Lpa�6��^x�]?�i�>����!C��������v�q����W�>������W�'�l$!�V'a@�s�u�!}<��/������K�OLK?�Li{���$B�O��I���_nL�#a+��c�$q?���'����p�p"!���"��]���X��>7}�|F�9f88����'�pN���3���1��$)"���8��:]<b��o���]�81i�I�\��x�������+����>e&���K.)<^�����P�Q���ma��i����Dt�<������ �*\[i[p��A[�U�\pA�y�v;�,V�+��m�i�q�(z���MO��x7m�!m�������0\[i��{<��"�0��K�CbeP����	sL����s�
��8G[����G��0��x(��A.�g���O����s����3�������!6&�;��a���� ���y��+��$�kh����Ab;I�\�.��b����~�Dq��c_0�G?��~jK��r/*��C����x�)�~vn�H�g�����������%Q����NQ���|�Y�t���Q#/z��m��u��y�{��N<�D/z�m�1[�l�n���G���%K��������O�hC�{������&����=�\/�xL����?���A�-�h���R��7a�����mtz��z�
�����m�X�����u����6m��$��w�u�yM�6��9��K�.^�������y���w�
�\� ��6p��m<�m���~������
D�c��E���M��c��;�~��^4���
H�=��h/�y�z�7n���V��G��g�y�;����6��'�|��t����W�n]o��1�-�
��we�����mz���1K�G����o����+�� >|�w��G{���}'�`�w��q���m\{g�q�w�UWy���{L"�|��W{����k�������c�c���k���/�P�O��Y��s��s����6	��h�]x������c�z�SO=��l��[�xqlKpq,�����q���;��s��3����s��~�z��c��R�n��Y�f�m��k����w�y�;�����'���'���s�;�o�x7�?��k������&���oKT��v��F$��S��v�g
4pm�����@�&M������6g�o�}�q�-�Tm����'7n��n��KMM�>�����f����K�����������%��o���	'����?�]������5�����Y�f�����G�~���zg�}va����g�y������G�����#�p�!Qb���?�x��{�-���F�*�M������w�Ay=�P�c8��<�H����d?�>�_>���69mp��y��)^����7�|3���m�;���O{m��u��'�x�]��i�O$��}�o�<yr����^�!��j���o��
�!|�������?��$�?j�q���(����8"�J$�k%�8����zo�}�-������"v��%�o�����o��6�%qql<����?�>�+~��k�_|�u����_r�b���C��	z�������aC�j��.��G{�}G�S"!�{���]^y~;�2�v��W1���'~\�����:v��
2��~�  6���+]L��5��N�j�\\bB���~O$t�����Oh�rL��_AD��F��*��A�8y�pN5j���������U{���I��5�k613���Dn�U�^��S�X�s8c�~>9������r�J������Ev6f0;��+�p���$7����f�g1m�q�7� =��S���TbFX���;U<�RHu`���G5Cfvq����md�YN~u� ��������Tmd	�x�m�K�Z�bl��-]af2M�
\� fn�|�/�8t��}�LIf ��I	f�r�PU���A��|&fa1����
\�(f��B!w<D��"y�=��`��?���#�t�F��t4HuU����y����;�����UXu����T�
b� *n3��g���;�w�J�\w8v���5T^�B�p��t9��9�Q4@w�e��~��'[��Uc�TXbF:�a_��8u�������DT���w���/w�=�
*pM�F��M�����T{�'\k��T�j���[>�Y��������_a���u���|��"R:�~bl��"V�+*�p�`)�D����%�	?�OT������@���6��*.���8���mR�����"���k(�~�`C)?>�G[�x���(�LC�Uk�c��
Kmr,�����������X����gAC�F��3�691�-��.�%��
�����	:�a�/Dv����~��=���o���~����Bu5���������4��q���t�~KT��j����o�7�m-���u9~��gwm���~�|L���(�8����,7N%i�Xi����V�/�����[�\|���~�Xj��U��xmI4�,?��S�2�����K����n�c�6��m�\K�2Ii<��3\SY��6��O�!N�����J��i���b,���3	���2��g�
�d��]����8���m��g�O��z�q�e\������J�*��9|���$������K���9�}+�M���7�p�1���T��w�'��1�I����%��
V����������=DN�}[��q�!v����.���\�aG�]~��"OR����x���~�:����L�j�^�8\����?x�����D���@.K0HI�K�g�K����y�������q."�e��o,��V4��.�4x��0Hb\�}�i�������w�����AO���������F3���>��5(	8x����"��������	94��>'�i�$#�O�~�d3l�0;��c���_~iGuT 2�`\O�9J���j�k���~#P%@���8��C��~>�����:5X�������	��,MN2&	%d��>��u���EB.��C��Y��'�Ex�"�	�S(H�$�2X�]w�k����Q�u��d,!�9���������A7�h�yY����v��pN!9��-�fqm��)9H����3����o�@������A�w��?�s�(���W���>u�����C[�k�.��$^��	N��m&���f?E!���u����6l���3��S�x�	�F`����b�OL*�1���|����������e�O�w9��������C��c&�I�|' "v����!��M[��g����5�������.�	*��3 OLB�de9�0P�O��O ~�_���Op��3$��3��,m��"�%�q�5����<�v���O&$q��ot���>��c��������c����
Z�b<�&n��������`?00�������{{�����������{����5d�Q\+����u�#%n�b�S�#1�>c�7���w��ik$��Bn��v�,��O������8��q�%Y��[�����f���E�h�O�8�}�8���~
2�/L<e���0����n����K�/��Ab�������|�W�8�	�����\��cG����c\LJ����s�u�0�h�#����f���\D_��	��8���>���� �#��;�1o�1�>|�x����!�c��k�u�����CwJ��q3��!C���J>?y7�_n������;���r�&*�X�z�8Aq��F'�?�����?H��U�(��qf��p�{��&�n��f70GR{���<H�#�Gts����[�*P���.������G}�uJR%4�Hc�6�����:�/���DBB�����s��G}t����n$������/HJ
j@O�	�/���K| �����27�K��[�~����{��j�/�����<Kb���T��g�}o��v�*�ps�e���Gq��?8�(���b�������m�-&{�8C�.IY}����_~���9�0���)(h����9`�������s'��_|��;N����\���s�9b�:�hC�������T�x�ns�O��A�4��br�
��S��"�B�/�>�M�:n�:���1Ec
��%����m�f�&?����$�p���y�I'�c,0���7mS��0�����St�1`K���I����Hd��?H�2���c��z��Cc�?m�D�jC����_|�����+�V��3�L���A?'s��Z��$x�o��8b��>��9f>��37�?���#��������;��L���s6$��r���K�2IE���DS
Bp��]��B;��q��?j��]���X�?>8�������@q��J|��w;�I*���s
���3��^�z�DT�t�z���G+E�K�w� ��c�}�sAE�M�n��~t&�0G��o��n����!��}A�2���z�!����c���~��B?J��}C�ucY�;\����YY�����������c\��9�w�q��s��^���96�=?19�>�/��L���y��dp\�=�3_r�%�o�(�����!>;���`���V{�}�����r�/�	[�� E��������� ����vi�_6TH����W_}�*4�3�D���F9�t�I��������O�"��+�X��]??���%2?��8���/���}��`/��/��}������/Hz'y����s�������%��
]4�f@��Ib��s����~�aW��dC�/|w�HR���<����?*2�D�n���AC��		�\�h�0?�����e�~
�	-��p�����0
���>��#??IX�TRUX�����<y���Ou`"�.�)���������@y>����FiF���T_g	�7:���9v�Xw����,k:.�o&+2��}F���
Yj�_�~�g���ZK5�i����6
��}��F)�����M'��������h�v��}����%���J��$����=����\S����#���v�`,�-9�8���hw0�6Hm���lLd@����VH����(�q�����K����/���"�����*�d2���*�=��6�;������_d[UL9�����A?f�����g�u�#����LZf7�K����mbaC�d��"z1���b�0��E��3A�@=��T_�/�8��\�p��C�	����+���_m�q�p�N�kSI��V��W\/�8b�����`�!m
�90��&����B�6��`?P4�X�Uc)B����r��LP�:t|F�#�����/*���3��(��m���w�t��I�z9����g�mW]u�%6f4�+J�1	����x����n���(��?'��h��d�%�m�0N�g$B{�U������}T�x����O�Z�������;�� ��^I���t�(��R��1��"����q�"��/'UxL"������.!G"�G�m����a���I������t;�|��|��'~R�n��] ���>	���0�m���9��>���.�2���1>3������"���!��4
�,:���E���O	��+E�`H��;\o�������#�A�1Bp�1@���$\�e#8g���%��H>V�;�������qA�	"X2S���s�p>�������w��AA�J���s%	�d�<���Cg!�:1�i��*�)��	����O8N����(z���9���H������K��)��Migr.����OTL�����Z8��D�o�&8�]L��:Q4�������2��k$�~h��P��'*���_{��v�nt�3���L6���L����\�h���u��7���G��=T#���F�[,��9��$�����b<��|g���3�S�wi�������sgW���W���|�w��K&��b�#09f��wF��dv�1$���O|�9�	��q�p�����G��w��)h��|��K�0���9V�[�B;	L��K%6n�����_�7>�?j��R��s,}H>�;�gpO�1� �{��h��u��"���z@"1�Dpm������/�w�ohop�(�����L���_$�Q #~��S��8q��
2>c1���?h���h�����v��A���� �������Id��������J������&q�9����]�v�����9������ �!��~�D�8���L�����8�71��SbBbD���=4n�8#��w���7�|�Z`+������CkAoq\P9������P��~�	&��"�1��}���{|xi�De)U�����r#\��E�B��\��&>?U�I����_�I6l���� U�c��F�X����ICt{3,��c�YM$���~�#.vTc
���<���s�9�Q�#� ��DU�9A�������q���@����w��Tf���F?��e�1�7I�$��M�6�J�
e�K����p^���>�`w��C�������

>��?��������7$��p����k��x&���4$Py8(8o�3���10I���P�|��t�����@"�7�?A� ,��a��*�1k��c�N�sf�R����.�1+�}�����(��`��1��9��L���~r�/��t�'�d*���������7h1��y1QQ5��N��A��\S5��8�7v!�2>�����7w��DD�-�,���=����J���� �O���^T���#�����J�L��x
����H���g�q��E��i_Q!�O���&��	�`5�
&�14r����
��O���/�.������@��11Hq��~/�*���q�|G��c��w�g��E8^�?�� �. �%�c���|F?�����s+�=����?f8����i�@����}E~,��}�1�>�g�Y��v���}���2�X����W��i��'�c�p�a�v����n�%$H����S���s�K"��G�+Q�������x[�r��5��^���|�f"��E;�1�-��\_i�9�s�A(FEu��{�%)���'���l��C���x�nA��a��b2��~�w!Y�$BVa��s����!���;�T��|�!q��L��s�����>0T�������M�?&�\���\��=��&f�B9�/���L��~�Dn��E����}��?���)���)�/�2������N-^)U8y����G��v�z�-�B�:K�'Z GC�?�3@G���3��]���gd$2`8���~bv��T��>��8v��9s���D2�K/��:�\`I� !e�(�!9_�U=��,L2%
%�.���d��T!7�4@�t����w�����`-��nLv����~��_XJ�^F,�A#3H��p� Pe�#*���)��Z��w	D��u�j�n�Z)���������w��I�CY��g��n�5��4�	b	0Hj�1$s3;;HUa�',mDR�c0�c�����k/��$����;nb3�9�8�����O��-[�,�'�3�.Tq��V�_09����9��2�3���� }���Jr:I3�����s�n��Q��c�������{��;"��6�
�9�A#Vn��� J�b��	�����$�Pe��&m*)@;�v'���iKu$&��6M�x��kH������|��v���!��h'0�H%e�E���h���d_��9�r&\1�����'9�P��O�>�K��ssL�1��c�����
���v51����@#���Ng�6:kh����$�s��+�
��|V�C�}�����|�8����L�Q�>���u<h	2g�u��<����M�K�����.�#��<C����/A;�p� ����k�K�����
0�H�F��/��8F�q���x��"A�#�:�
���S�\�HA��b�^�D��!���7��~q��C�q	�L�Kd\cic0F�'�q>d�>��\#����Wp]������C�W�t�/����_�����)(2��7�P$����g&��ql�b�|�~���[&l�m��9/�}��C��8��_����?����?�3�#�c����9��-�h�S���\>��p\����n�UAm]?W �'o����sI�~L����2A�U��=����7������r>�w�}�����Cz{�k7�����?;�)�T��B\L22�3����A��{a�=(J����H)B���-\���K������r��A��N�tr��E2���P��%�-X��F��3�(L�a�p��>�f`��
L,�G�!���D��	4�8v� �����U*���"I�J!A� K�RU�%&��30��`�s~�	�/�'|��d0��� �c���)�e9�G�.�'��iq~!��c���J�������t������K/��-c����'|iL�o8vD�&m�p���R���K@������s��t�@�3�O*��T�%I�@$����4�,D���������A;�Z:4���<��3�]t2	��3��cb�:�H�r��K�[���y���Q����D&M��� 7�W:m8Nx�	�U��>�l������l��9�SJ'&qp�|���]���H����JT�Pv���n����9'2�%(��:�iw2��5�O���I���1b�����Lg�����>�
z��'v����m����J���b������!*�^"�%f����F��|�?����v$7���l�#��� ���`��~&���C��9���1�*$��7D���{��T����r�C����&��P���#��C��l3��'�
�����}EC$U��r�)n�)��;<�v:JL@�q/^������3��������k��v�/L�����I��^������N:�$�/�����$!�?3L���IL$��$;��c�����K?�����,�u��%
��T�'�c��1*��E��z2~����L,�d�>�bT4e�Px��C	T���A2�s�WhK�}��Ai�����c0�=h�qZ�ma���b����>�;EmY�h��7A�2K������p�$���7��b��qO�R8~x<���(��1<��m-�^�����W���K�n�=Fa�V���7���
"�����)!��1,������L���\�W�`��Jq���	�;���>�Dn�?����3�����}
Ao��������8�k�?��3��Ea8bh��_~�������<M�������~y���H)A��&�}8��` �����4��+�0�$�����,_��pp������T"��}��
:>/�@:������>a���%�SAk��8o����Y�������?��}����s;�3~��x|7h4�O�c����q� LP�1�f����0���#���`/���"����5��}B2.��L��1?��O@��c����mB�����|�������"7�	"E�������c�k�������]{���s'������[�z��Dj���L~)m�v���0��L��*a"\���	�$?�Q�����w�o����$�����7�'�0����I?�+����}B��+���Z�n�Z�G:u��'fc�$������8${1�#�7:�I�����sg��VP���X$��(���X��� $�3��6��z����X��$1p���������*��mt�J8�H���E3��A_���u8�p�08�����0	��������b"R����3��1xF�����H��F|������
+����@=������x�������g�g�x�
�&z��c���-�k%�8�q��$G��	h�u�����0��_�?��H����"��J����_��I<���C���S��/&����
���,Y��#f�mJq��AN��
J�I��!I�Dd�#�I�$����
��� �bb�j��Z�9�b!��L�..
*�%$��^�+&���*����b��h�x�X�*����w���r�*���k���_^X`���}�L�O����_�e���5��H���,9���7�������	J��EDDDDD������������f�kEDDDDD$Q%n�Y�e��,""""""""""""""""""""";��EDDDDDDDDDDDDDDDDDDDDd�S������������������������tJT��N��"""""""""""""""""""""��)QYDDDDDDDDDDDDDDDDDDDDDv:%*����������������������N�De����,""""""""""""""""""""";��EDDDDDDDDDDDDDDDDDDDDd�S������������������������tJT��N��"""""""""""""""""""""��)QYDDDDDDDDDDDDDDDDDDDDDv:%*����������������������N�De����,""""""""""""""""""""";��EDDDDDDDDDDDDDDDDDDDDd�S������������������������tJT��N��"""""""""""""""""""""��)QYDDDDDDDDDDDDDDDDDDDDDv:%*����������������������N�De����,""""""""""""""""""""";��EDDJ���<[�h��E"������<[�x�
6�V�X�*"""""""""""""""""R@��"""%���+���^�o������c[K�'O�l��w���93�UDDDDDD���g��[�&��4���v��w[��=m�����""""""";E�6l�`[�l�m)Y�~�i�_����=;�EDDd�Q����H	� �?�`����m)]~��g����m��9�-"""""""�e��Uv�w��_�"""�8��,""�m����~�m;������������f����c����?o���?l���n���[��G��N:����������O�<�uy����?v��7��'�l����m����n�]v������:�(����?W�x{�h���/����Z���O���l��5���/n��x��PQ�G���?��m�;w��%|�5��o�a����{�����GK�,���z��;�8w����]����{����������v�������O�4iR�/�W�S�^��������,""""""{q��#,777�EDDDDDD$�,^���������H�I�3*������D$)?�������Z�f��U�V���������;[��5]�0��$��o��F�e��r�K
>��#l������������Q��q�����ip�5h��%037����je���w�}�%*����������C=������g��7�/����H�
�B��X��M����w�y��t�b��Usw���v�!�X��U�����p8l��us��s}��wn@�S�N�=��C�q	�����-Z����}���Ol�����������X���z��.i����i���[v�����)S���h�����c���f���M6l�}�����];��DD�t�0a�u��!������N�>���n-�NW�Xa{�����������.�W_}��x���+�F�HHK���\dSSS�������Z�~�\|��E�\b�{�����<�����qcw_q��J\��c�+�o�����222�c���{��Gy���Lt%����9�=��Ot+_��Q�F.��=31�������X������������M{������I�&.&e�2�~&�����nI���������g�7o��K��6���`?��H���VDD�t�"2�-�%c�����Rx�BSt"��\�r�6KlI���(7�W1�y�u��x��O��2f��(c����3���O.�VlbT�Q��QD���������s�(E�{�����HL������r��~�������]���g����g�Y�J��gc?PD���^sE�x>��b<�������v��7P���Z�bEw����>��,""��0:�n��f�1IpV�n]��q����>��C�� �����K�%a����#�<�0��S��L���Z������-[�j�T,&�$Pf@�D��P�y��A��3��z��r�J���o\0���W\�������)))�}2��W1�JJ��0��]��
7�`t�;I�>�s�m�����BpK��~�3����.r���VM�;q�D��-""""""�����`2��$\b7�z��-�V�!�%��X�AT?�p7���>�X�����\&�2I�	���L�er.n��_��}O9�'����vS�,�u��W��K��x<�U��-[�bE&����t��(q�%�\�^�")��$j�����L�g*C��W.�gb.�w�=��3����v�j��LL{�����yl'�m��$ ��b16��g���8���]23q.�DDDDDDd�`,�8���$���|Lq(�s)��DX�Obc
0��K�)�l��q��^"&���K�L�\�B��u�Y.�dZ��g�y�=��U�j����y$#�Z.�u�Y�W�cg��y����[�"�x��1.	����?��������d��z������2FK��Y�\���`���C�Ka�����%/3��t�R���������;��b�a�DD�tR�����.B�E�:L H0����i��V_IT&�d��I���������h���������R-y}]f�2�K�%��L�6�%�v���U�bF,�l?���]�d�a����u{����`������
6t��ge?P��|�Z�j���,0A�?x�c\&i����$�g?3+� ��pf�����s���������W*1���U�!Q������$�2�J�2��y	��R��v��n�-1,�$� �]����KLLGL��LLe"*�~4e�A��g3��'����nL�/�-a�;<e�+��H�&vd2����2�Er5	�$S���I��m|�}��y�T�b�q�>}����v�����\���#�_&"��,��������G�.�s�%F��q,1�XI�%�c��X����Q�t�M.)���Ns��L��z1c���K���Z.I�bbE^�h{����=/��ro���JE����#>�9s�}���..�����,XP��������8+�)~L���O����W��u���Dn&3���H��?!�1a>3�1�!�&�����h������:�>g\���j)��#""��l�]��w,����IJ�d�4��]f����WP���;,��`'���1��`���C G�����!��J�*.���8����W�h�x
���m�[4�����p�{�"�2��esO=�T��>��^�q$���I�1X�R�5j�p���2Q���a����B$%�����~���[&�2�s����$-S}����c<�S����1���@L����	'��{}$VS��\K�
H��L�������|&>�������*5�	����KU(�}��Duj��G�7��EDDDDDd���a�����T�a�b�c?V&��s�D���[&�#�����JI� ������%�R�����
@���83q4����K��{�:q|�L�(*+7��q_^��
��������m��n���Up�����~���]��<���$h��L�8�O!-�ED�tR�����.B�&>_�u��O���F�@��]����6}�t�}G�P�,Uf��M�(@����������
V�3d�y��a��O?�S`�`�`���8~66�z����D3��$&3��|>�_b���'�1�s����\q���QAW�\Yo1��2�$���K"������?(I�Hb�}����%Qu�*O��E��x����~�s<b\��'��\f���&*����������s� ~�}Rq�A^*g]p�v����n*-��������GlI"/�1����1�~��v��	�L�e������������={���Yq����r���m!���g�;3��djc���w,��bc~.��{���Y�_`�2�=|�p7�{���������N��Z����N��eK�2��|R���e�>�T�S��3�Y��ei�?��+����0������n�f�no����Tmbp��8L�e�1b�����4����|��������&	 Y>���T^&@'�����L�2����K�/�9L�5�CDDDDDD�&�2�Ix����%�\�nL�%�b�Y�z0�%��n�*�t��2~P�X��`��K�'b�;���z��QXY�8$)s�'33!�L�N��$�1�w�/���ca�%�����T�&A{�������tI�,���'���������?R)9>6������^p����B�S��X�J������r�I���s�����_�*-�7����V����{d<�x���/��{b�.c�����e�����bc����9�7�xgj������4��9��������""Rz(QYDDda�������T���o]�
7�`3g�tA��-��2+�JI�2 I�GP��(��f�*�����I�c��u���z�-��a�Y:��e�d��z�!7��kW������L�&�' ���{]3U���O>��4���O��_|�����m�;	�T�&`%�dj�+�$�o����������������W�
O$scb,1'��l�Q��*���,�J��l������g�C�������;�8;���{��.fe��U���2p�Y�����O�{�]��{/�������;cw���w�*�.�-��������}��t������>f� ��i�R��������������q)�����������T��$?���.6&f>���\���?���1��n/���Mb�N8��8�S��u���x[I�������X���iV�����L�'�z���>�1����I�<��������"�g���l'�t�+�E�D���""R:(QYDDda)�l�_��K���K/��f�^v�e.�$������O�*U��A�c�=�y�W��r��n���?��m+n�W��>�l7�{�����&�����K4&(.nv+���c�8��L%�����}S��`�m,aD�2�!0��},��l��:���$-�����b��5������I�f) ��!����� ��������y��Z
V�q�����a���J�/\�d���w���n�Z��YJ��D���?��w��pq1,+��_��{������?o+Q��f&�^x��������n��f����&����a�Ebf��G���"~����o�i}��u��x�:Q��j�t�+���Y�%\w�u.�n�����p��e|���x��Sb���{�*���X��!C\1%V�U����J�$/3^��E�wTa&	�x�(���m���?����QG�
]� \\�2�b��=]�2�e,�X�U��9�7�K�/����y��D`��Y�'������y�������������������w�!����v�Z;��s��,"RJ�<������t$3�s��5�g��a�'3P�%��`��� <��`��]�n�� E��s���!���-�aI��$30� +�dqA[��#�ev,�~E)�#������{e	 ��x>��}4+�t���7�T&���%�������Np���1�Lb�s	�yM�u��(3H�R�<�b������~�z�|�I���""���$�����E�G���Tf�(�1)��K�G�2�� ���++�0�J�[o�e�}���%�x���n0�$cb6�Ce'&���7���<�8�\(\-�$3���a���SN)��J�H[��'�dB-�;K�2U����*W�����K+�X��@LL�6��su������c���*�@/�AU�����M�e2j��o�����������O�����h�o������n�kEDDJ7b�W_}��q������^�E�(g�T��%����C,L��ov������3����^���}TUf�^�#3VJ���`&�����hTq�����~�K�2�����7�I�f�����������k�@�2��1[
`��M���Y37���Y����d[
J/��;���{��G��>?�	������|fbu&c�r����]N�2I������NJT�O�""""""R�)��D��+"""""""""""""""""""""��(QYDDDDDDDDDDDDDDDDDDDDDv:%*����������������������N�De����,""""""""""""""""""""";��EDDDDDDDDDDDDDDDDDDDDd�S������������������������tJT��N��"""""""""""""""""""""��)QYDDDDDDDDDDDDDDDDDDDDDv:%*����������������������Nf���|O�Z]�IEND�B`�
#33Jeff Davis
pgsql@j-davis.com
In reply to: David Rowley (#32)
Re: Make tuple deformation faster

On Thu, 2025-03-06 at 01:07 +1300, David Rowley wrote:

I've attached the results. The 3990x with clang looks good, but the
rest are mostly slower.

I am still curious why.

If it's due to compiler misoptimization, is that kind of thing often
misoptimized, or is there something we're doing in particular?

Even if we don't have answers, it might be worth adding a brief comment
that we empirically determined that booleans are faster than bitfields
or flags. In the future, maybe compilers mostly get this right, and we
want to change to bitfields.

Regards,
Jeff Davis

#34James Hunter
james.hunter.pg@gmail.com
In reply to: Jeff Davis (#33)
Re: Make tuple deformation faster

On Wed, Mar 5, 2025 at 10:40 AM Jeff Davis <pgsql@j-davis.com> wrote:

On Thu, 2025-03-06 at 01:07 +1300, David Rowley wrote:

I've attached the results. The 3990x with clang looks good, but the
rest are mostly slower.

I am still curious why.

If it's due to compiler misoptimization, is that kind of thing often
misoptimized, or is there something we're doing in particular?

Even if we don't have answers, it might be worth adding a brief comment
that we empirically determined that booleans are faster than bitfields
or flags. In the future, maybe compilers mostly get this right, and we
want to change to bitfields.

I haven't run this sort of experiment in years, and CPUs continue to
improve -- but with a Boolean, the CPU can read from or write to that
Boolean directly, one instruction. A Boolean tends to be a byte, and
memory is byte-addressable.

For a bitfield, however, the CPU has to read from or write to the byte
that contains the bit, but then it also has to mask out the *other*
bits in that bitfield. This is a data dependency, so it stalls the CPU
pipeline.

So Booleans tend to be faster than bitfields, because they avoid a
pipeline stall.

James Hunter

#35Jeff Davis
pgsql@j-davis.com
In reply to: James Hunter (#34)
Re: Make tuple deformation faster

On Wed, 2025-03-05 at 11:33 -0800, James Hunter wrote:

For a bitfield, however, the CPU has to read from or write to the
byte
that contains the bit, but then it also has to mask out the *other*
bits in that bitfield. This is a data dependency, so it stalls the
CPU
pipeline.

Here the bits aren't changing, so we're only talking about mask-and-
test, right? My intuition is that wouldn't cause much of a problem.

Regards,
Jeff Davis

#36James Hunter
james.hunter.pg@gmail.com
In reply to: Jeff Davis (#35)
Re: Make tuple deformation faster

On Wed, Mar 5, 2025 at 12:16 PM Jeff Davis <pgsql@j-davis.com> wrote:

On Wed, 2025-03-05 at 11:33 -0800, James Hunter wrote:

For a bitfield, however, the CPU has to read from or write to the
byte
that contains the bit, but then it also has to mask out the *other*
bits in that bitfield. This is a data dependency, so it stalls the
CPU
pipeline.

Here the bits aren't changing, so we're only talking about mask-and-
test, right? My intuition is that wouldn't cause much of a problem.

Right, so that's just +1 pipeline stall (load, mask, and test; vs.
just load and test). But you can imagine microbenchmarks / situations
where that extra "mask" matters (like some of the benchmarks David
ran). "Mask + test" has to wait for the mask to complete, before it
can perform the test; so it's slower than two independent instructions
would be.

But -- cost vs. benefit, a Boolean is typically 1 byte; a cache line
is typically 64 bytes, with maybe CPU prefetch making it behave like
128 bytes. So replacing 6 bytes of Booleans with 6 bits saves us < 10%
of a cache line -- it's "only" an 8-to-1 compression ratio -- which
might or might not be worth it, as David's benchmarks show...

James Hunter

#37Andres Freund
andres@anarazel.de
In reply to: Jeff Davis (#35)
Re: Make tuple deformation faster

Hi,

On 2025-03-05 12:15:57 -0800, Jeff Davis wrote:

On Wed, 2025-03-05 at 11:33 -0800, James Hunter wrote:

For a bitfield, however, the CPU has to read from or write to the
byte
that contains the bit, but then it also has to mask out the *other*
bits in that bitfield. This is a data dependency, so it stalls the
CPU
pipeline.

Here the bits aren't changing, so we're only talking about mask-and-
test, right? My intuition is that wouldn't cause much of a problem.

FWIW, I am fairly certain that I looked at this at an earlier state of the
patch, and at least for me the issue wasn't that it was inherently slower to
use the bitmask, but that it was hard to convince the compiler not generate
worse code.

IIRC the compiler generated more complicated address gathering instructions
which are slower on some older microarchitectures, but this is a vague memory.

Greetings,

Andres

#38David Rowley
dgrowleyml@gmail.com
In reply to: Andres Freund (#37)
1 attachment(s)
Re: Make tuple deformation faster

On Thu, 6 Mar 2025 at 10:17, Andres Freund <andres@anarazel.de> wrote:

FWIW, I am fairly certain that I looked at this at an earlier state of the
patch, and at least for me the issue wasn't that it was inherently slower to
use the bitmask, but that it was hard to convince the compiler not generate
worse code.

IIRC the compiler generated more complicated address gathering instructions
which are slower on some older microarchitectures, but this is a vague memory.

I've been reading GCC's assembly output with -fverbose-asm. I find it
quite hard to follow as the changes between the 16-byte and 8-byte
CompactAttribute versions are vast (see attached).

A few interesting things jump out. e.g, in master:

# execTuples.c:1080: thisatt->attcacheoff = *offp;
.loc 1 1080 26 is_stmt 0 view .LVU1468
movl %ebp, (%rax) # off, MEM[(int *)_22]

whereas with the 8-byte version, I see:

# execTuples.c:1080: thisatt->attcacheoff = *offp;
.loc 1 1080 26 is_stmt 0 view .LVU1484
movl %ebp, 24(%rax) # off, MEM[(int *)_358 + 24B]

You can see the MOVL in the 8-byte version should amount to an
additional micro op to add 24 to RAX before the dereference.

One interesting thing to note about having CompactAttribute in its
8-byte form is that the compiler is tempted into sharing a register
with the tts_values array before Datum is also 8-bytes. Note the
difference in [1]https://godbolt.org/z/7hWvqdW6E between the two left compiler outputs and the
right-hand one. You can see RCX is dedicated for addressing
CompactAttribute in the right window, but RAX is used for both arrays
in the left two. I don't 100% know for sure that's the reason for the
slowness with the full version but it does seem from the fragment I
posted just above that RAX does need 24 bytes added in the 8 bytes
version but not in the 16 byte version, so RAX is certainly not
dedicated and ready pointing to attcacheoff at that point.

Jeff, I'm not sure if I understand this well enough to write a
meaningful comment to explain why we don't use bitflags. With my
current knowledge level on this, it's a bit hand-wavy at best. Are you
content with this, or do you want to see something written into the
header comment for CompactAttribute in the code?

David

[1]: https://godbolt.org/z/7hWvqdW6E

Attachments:

slot_deform_heap_tuple.zipapplication/x-zip-compressed; name=slot_deform_heap_tuple.zipDownload
#39Alexander Lakhin
exclusion@gmail.com
In reply to: David Rowley (#29)
Re: Make tuple deformation faster

Hello David,

24.12.2024 03:57, David Rowley wrote:

On Tue, 24 Dec 2024 at 11:19, David Rowley<dgrowleyml@gmail.com> wrote:

The attached adjusts that Assert code so that a fresh CompactAttribute
is populated instead of modifying the TupleDesc's one. I'm not sure
if populate_compact_attribute_internal() is exactly the nicest way to
do this. I'll think a bit harder about that. Assume the attached is
POC grade.

I've now pushed a fix for this using the same method but with the code
factored around a little differently. I didn't want to expose the
populate_compact_attribute_internal() function externally, so I
invented verify_compact_attribute() to call from
TupleDescCompactAttr().

I stumbled upon that assertion failure again. It's not reproduced easily,
but maybe you can forgive me the following modification:
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -159,8 +159,11 @@ verify_compact_attribute(TupleDesc tupdesc, int attnum)
      tmp.attcacheoff = cattr->attcacheoff;
      tmp.attnullability = cattr->attnullability;

+for (int i = 0; i < 1000; i++)
+{
     /* Check the freshly populated CompactAttribute matches the TupleDesc's */
     Assert(memcmp(&tmp, cattr, sizeof(CompactAttribute)) == 0);
+}
 #endif
 }

which helps for this script:
for i in {1..50}; do
echo "ITERATION $i"
for c in {1..20}; do
echo "
set parallel_setup_cost = 1;
set min_parallel_table_scan_size = '1kB';
select * from information_schema.role_udt_grants limit 50;
" | psql > psql-$c.log &
done
wait
grep 'was terminated by signal' server.log && break;
done

to fail for me as below:
...
ITERATION 34
WARNING:  terminating connection because of crash of another server process
DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another
server process exited abnormally and possibly corrupted shared memory.
HINT:  In a moment you should be able to reconnect to the database and repeat your command.
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
connection to server was lost
2025-06-07 13:01:39.326 EEST [537106] LOG:  background worker "parallel worker" (PID 539473) was terminated by signal 6:
Aborted

Core was generated by `postgres: parallel worker for PID 539434                                      '.
Program terminated with signal SIGABRT, Aborted.
(gdb) bt
#0  __pthread_kill_implementation (no_tid=0, signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=<optimized out>, signo=signo@entry=6) at ./nptl/pthread_kill.c:89
#3  0x00007de05ec4526e in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#4  0x00007de05ec288ff in __GI_abort () at ./stdlib/abort.c:79
#5  0x00005dd0a1788377 in ExceptionalCondition (conditionName=0x5dd0a1822ee8 "memcmp(&tmp, cattr,
sizeof(CompactAttribute)) == 0",
    fileName=0x5dd0a1822ed9 "tupdesc.c", lineNumber=165) at assert.c:66
#6  0x00005dd0a0f85bfd in verify_compact_attribute (tupdesc=0x7de05ef01000, attnum=1) at tupdesc.c:165
#7  0x00005dd0a0f72a25 in TupleDescCompactAttr (tupdesc=0x7de05ef01000, i=1) at ../../../../src/include/access/tupdesc.h:182
#8  0x00005dd0a0f73da6 in nocachegetattr (tup=0x7ffc737cc550, attnum=1, tupleDesc=0x7de05ef01000) at heaptuple.c:581
#9  0x00005dd0a12719c9 in fastgetattr (tup=0x7ffc737cc550, attnum=2, tupleDesc=0x7de05ef01000, isnull=0x5dd0a7b919d5)
    at ../../../src/include/access/htup_details.h:880
#10 0x00005dd0a1271a74 in heap_getattr (tup=0x7ffc737cc550, attnum=2, tupleDesc=0x7de05ef01000, isnull=0x5dd0a7b919d5)
    at ../../../src/include/access/htup_details.h:916
#11 0x00005dd0a127a50d in ExecEvalFieldSelect (state=0x5dd0a7b919d0, op=0x5dd0a7b93258, econtext=0x5dd0a7b86648) at
execExprInterp.c:3837
#12 0x00005dd0a12759ce in ExecInterpExpr (state=0x5dd0a7b919d0, econtext=0x5dd0a7b86648, isnull=0x0) at
execExprInterp.c:1698
#13 0x00005dd0a127702f in ExecInterpExprStillValid (state=0x5dd0a7b919d0, econtext=0x5dd0a7b86648, isNull=0x0) at
execExprInterp.c:2299
#14 0x00005dd0a12db079 in ExecEvalExprNoReturn (state=0x5dd0a7b919d0, econtext=0x5dd0a7b86648) at
../../../src/include/executor/executor.h:417
#15 0x00005dd0a12db137 in ExecEvalExprNoReturnSwitchContext (state=0x5dd0a7b919d0, econtext=0x5dd0a7b86648) at
../../../src/include/executor/executor.h:458
#16 0x00005dd0a12db198 in ExecProject (projInfo=0x5dd0a7b919c8) at ../../../src/include/executor/executor.h:490
#17 0x00005dd0a12db3bb in ExecResult (pstate=0x5dd0a7b86538) at nodeResult.c:135
#18 0x00005dd0a1290e47 in ExecProcNodeFirst (node=0x5dd0a7b86538) at execProcnode.c:469
#19 0x00005dd0a12e2823 in ExecProcNode (node=0x5dd0a7b86538) at ../../../src/include/executor/executor.h:313
#20 0x00005dd0a12e2848 in SubqueryNext (node=0x5dd0a7b86318) at nodeSubqueryscan.c:53
#21 0x00005dd0a1295a36 in ExecScanFetch (node=0x5dd0a7b86318, epqstate=0x0, accessMtd=0x5dd0a12e2825 <SubqueryNext>,
...
(gdb) f 6
#6  0x00005dd0a0f85bfd in verify_compact_attribute (tupdesc=0x7de05ef01000, attnum=1) at tupdesc.c:165
165             Assert(memcmp(&tmp, cattr, sizeof(CompactAttribute)) == 0);
(gdb) p i
$1 = 484

(I've compiled postgres with -O0.)

Could you look at this once again, please?

Best regards,
Alexander

#40David Rowley
dgrowleyml@gmail.com
In reply to: Alexander Lakhin (#39)
2 attachment(s)
Re: Make tuple deformation faster

On Sat, 7 Jun 2025 at 23:00, Alexander Lakhin <exclusion@gmail.com> wrote:

#5 0x00005dd0a1788377 in ExceptionalCondition (conditionName=0x5dd0a1822ee8 "memcmp(&tmp, cattr, sizeof(CompactAttribute)) == 0",
fileName=0x5dd0a1822ed9 "tupdesc.c", lineNumber=165) at assert.c:66

Thanks for finding that and for the test case. I can recreate this locally.

It seems to be down to a race condition with the shared TupleDesc. If
I expand that memcmp Assert to check equality on each of the
individual fields, I see that it's failing on attcacheoff. This is
because a worker does some tuple deforming while the failing Assert
backend is calling verify_compact_attribute(). That results in the
attcacheoff being changed by the deforming backend and the new
attcacheoff becomes visible sometime after the
verify_compact_attribute() backend does tmp.attcacheoff =
cattr.attcacheoff; and before it does the Assert.

Using your script with the attached more_asserting.patch applied, I get:

ITERATION 13
NOTICE: tmp.attcacheoff = -1, cattr->attcacheoff = 4

(So, it seems my concerns about this in [1]/messages/by-id/CAApHDvr8e8-7tL5SUHoB-CDKF162BEMszDumH0W8-+xZzrpP0w@mail.gmail.com were warranted...) This
whole shared TupleDesc code seems quite dangerous. Unfortunately, this
isn't a new problem to PostgreSQL 18. This race condition existed
prior to CompactAttribute, it's just we never noticed because there
was no code checking for this before. The hazard here is that any code
checking a shared TupleDesc's attcacheoff might not get the same value
on subsequent reads. Maybe that's not too bad as the compiler would
likely only load the value from the struct once and store that in a
register. Also, since the offset is an int, store should be written
atomically and won't leave readers susceptible to torn reads.

If we can live with the race condition for now, then it's possible to
fix the failing Assert by making a copy of the TupleDesc's
CompactAttribute so we're not Asserting against the shared memory one.
I've done that in the attached fix_idea.patch.

I do have a half-done patch which changes where attcacheoff is
populated so it gets populated when the TupleDesc is made rather than
during tuple deformation. That allows the deforming code to be shrunk
down and allows us to use a special-case deformer to deform all
leading non-nullable fixed-width attributes. That should also fix this
issue, but that's v19 material.

I propose I just push the fix_idea.patch and leave it at that for v18.

Does anyone have any other ideas?

David

[1]: /messages/by-id/CAApHDvr8e8-7tL5SUHoB-CDKF162BEMszDumH0W8-+xZzrpP0w@mail.gmail.com

Attachments:

more_asserting.patchapplication/octet-stream; name=more_asserting.patchDownload
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index ffd0c78f905..f1498785423 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -160,7 +160,24 @@ verify_compact_attribute(TupleDesc tupdesc, int attnum)
 	tmp.attnullability = cattr->attnullability;
 
 	/* Check the freshly populated CompactAttribute matches the TupleDesc's */
-	Assert(memcmp(&tmp, cattr, sizeof(CompactAttribute)) == 0);
+	for (int i = 0; i < 1000; i++)
+	{
+		if (tmp.attcacheoff != cattr->attcacheoff)
+			elog(NOTICE,
+				 "tmp.attcacheoff = %d, cattr->attcacheoff = %d\n",
+				 tmp.attcacheoff,
+				 cattr->attcacheoff);
+		Assert(tmp.attcacheoff == cattr->attcacheoff);
+		Assert(tmp.attlen == cattr->attlen);
+		Assert(tmp.attbyval == cattr->attbyval);
+		Assert(tmp.attispackable == cattr->attispackable);
+		Assert(tmp.atthasmissing == cattr->atthasmissing);
+		Assert(tmp.attisdropped == cattr->attisdropped);
+		Assert(tmp.attgenerated == cattr->attgenerated);
+		Assert(tmp.attnullability == cattr->attnullability);
+		Assert(tmp.attalignby == cattr->attalignby);
+		//Assert(memcmp(&tmp, cattr, sizeof(CompactAttribute)) == 0);
+	}
 #endif
 }
 
fix_idea.patchapplication/octet-stream; name=fix_idea.patchDownload
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index ffd0c78f905..020d00cd01c 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -142,10 +142,17 @@ void
 verify_compact_attribute(TupleDesc tupdesc, int attnum)
 {
 #ifdef USE_ASSERT_CHECKING
-	CompactAttribute *cattr = &tupdesc->compact_attrs[attnum];
+	CompactAttribute cattr;
 	Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum);
 	CompactAttribute tmp;
 
+	/*
+	 * Make a temp copy of the TupleDesc's CompactAttribute.  This may be a
+	 * shared TupleDesc and the attcacheoff might get changed by another
+	 * backend.
+	 */
+	memcpy(&cattr, &tupdesc->compact_attrs[attnum], sizeof(CompactAttribute));
+
 	/*
 	 * Populate the temporary CompactAttribute from the corresponding
 	 * Form_pg_attribute
@@ -156,11 +163,11 @@ verify_compact_attribute(TupleDesc tupdesc, int attnum)
 	 * Make the attcacheoff match since it's been reset to -1 by
 	 * populate_compact_attribute_internal.  Same with attnullability.
 	 */
-	tmp.attcacheoff = cattr->attcacheoff;
-	tmp.attnullability = cattr->attnullability;
+	tmp.attcacheoff = cattr.attcacheoff;
+	tmp.attnullability = cattr.attnullability;
 
 	/* Check the freshly populated CompactAttribute matches the TupleDesc's */
-	Assert(memcmp(&tmp, cattr, sizeof(CompactAttribute)) == 0);
+	Assert(memcmp(&tmp, &cattr, sizeof(CompactAttribute)) == 0);
 #endif
 }
 
#41David Rowley
dgrowleyml@gmail.com
In reply to: David Rowley (#40)
Re: Make tuple deformation faster

On Sat, 14 Jun 2025 at 19:04, David Rowley <dgrowleyml@gmail.com> wrote:

I propose I just push the fix_idea.patch and leave it at that for v18.

Does anyone have any other ideas?

I've now pushed that as a fix.

David