Another modest proposal for docs formatting: catalog descriptions
As of HEAD, building the PDF docs for A4 paper draws 538 "contents
... exceed the available area" warnings. While this is a nice step
forward from where we were (v12 has more than 1500 such warnings),
we're far from done fixing that issue.
A large chunk of the remaining warnings are about tables that describe
the columns of system catalogs, system views, and information_schema
views. The typical contents of a row in such a table are a field name,
a field data type, possibly a "references" link, and then a description.
Unsurprisingly, this does not work very well for descriptions of more
than a few words. And not infrequently, we *need* more than a few words.
ISTM this is more or less the same problem we have/had with function
descriptions, and so I'm tempted to solve it in more or less the same
way. Let's redefine the table layout to look like, say, this for
pg_attrdef [1]https://www.postgresql.org/docs/devel/catalog-pg-attrdef.html:
oid oid
Row identifier
adrelid oid (references pg_class.oid)
The table this column belongs to
adnum int2 (references pg_attribute.attnum)
The number of the column
adbin pg_node_tree
The column default value, in nodeToString() representation. Use
pg_get_expr(adbin, adrelid) to convert it to an SQL expression.
That is, let's go over to something that's more or less like a table-ized
<variablelist>, with the fixed items for an entry all written on the first
line, and then as much description text as we need. The actual markup
would be closely modeled on what we did for function-table entries.
Thoughts?
regards, tom lane
[1]: https://www.postgresql.org/docs/devel/catalog-pg-attrdef.html
On 5/4/20 9:52 PM, Tom Lane wrote:
As of HEAD, building the PDF docs for A4 paper draws 538 "contents
... exceed the available area" warnings. While this is a nice step
forward from where we were (v12 has more than 1500 such warnings),
we're far from done fixing that issue.A large chunk of the remaining warnings are about tables that describe
the columns of system catalogs, system views, and information_schema
views. The typical contents of a row in such a table are a field name,
a field data type, possibly a "references" link, and then a description.
Unsurprisingly, this does not work very well for descriptions of more
than a few words. And not infrequently, we *need* more than a few words.ISTM this is more or less the same problem we have/had with function
descriptions, and so I'm tempted to solve it in more or less the same
way. Let's redefine the table layout to look like, say, this for
pg_attrdef [1]:oid oid
Row identifieradrelid oid (references pg_class.oid)
The table this column belongs toadnum int2 (references pg_attribute.attnum)
The number of the columnadbin pg_node_tree
The column default value, in nodeToString() representation. Use
pg_get_expr(adbin, adrelid) to convert it to an SQL expression.That is, let's go over to something that's more or less like a table-ized
<variablelist>, with the fixed items for an entry all written on the first
line, and then as much description text as we need. The actual markup
would be closely modeled on what we did for function-table entries.Thoughts?
+1. Looks easy enough to read in a plaintext email, and if there are any
minor style nuances on the HTML front, I'm confident we'll solve them.
Jonathan
Hello Tom,
oid oid
Row identifieradrelid oid (references pg_class.oid)
The table this column belongs toadnum int2 (references pg_attribute.attnum)
The number of the columnadbin pg_node_tree
The column default value, in nodeToString() representation. Use
pg_get_expr(adbin, adrelid) to convert it to an SQL expression.Thoughts?
+1
My 0.02€: I'm wondering whether the description could/should match SQL
syntax, eg:
oid OID
adrelid OID REFERENCES pg_class(oid)
adnum INT2 REFERENCES pg_attribute(attnum)
…
Or maybe just uppercase type names, especially when repeated?
oid OID
adrelid OID (references pg_class.oid)
adnum INT2 (references pg_attribute.attnum)
…
I guess that reference targets would still be navigable.
--
Fabien.
Fabien COELHO <coelho@cri.ensmp.fr> writes:
My 0.02€: I'm wondering whether the description could/should match SQL
syntax, eg:
oid OID
adrelid OID REFERENCES pg_class(oid)
adnum INT2 REFERENCES pg_attribute(attnum)
…
Or maybe just uppercase type names, especially when repeated?
Meh. I'm not a fan of overuse of upper case --- it's well established
that that's harder to read than lower or mixed case. And it's definitely
project policy that type names are generally treated as identifiers not
keywords, even if some of them happen to be keywords under the hood.
The markup I had in mind was <structfield> for the field name
and <type> for the type name, but no decoration beyond that.
As for the references, it seems to me that your notation would lead
people to think that there are actual FK constraints in place, which
of course there are not (especially not on the views). I'm not
hugely against it but I prefer what I suggested.
I guess that reference targets would still be navigable.
Yeah, they'd still have <link> wrappers --- if I recall what those
look like in the documentation sources, they don't need any change
except for addition of the "(references ...)" text.
regards, tom lane
Here's a really quick-n-dirty prototype patch that just converts the
pg_aggregate table to the proposed style, plus a screenshot for those
who don't feel like actually building the docs with the patch.
Looking at the results, it seems like we could really use a bit more
horizontal space between the column names and data types, and perhaps
also between the types and the (references) annotations. Other than
that it looks decent. I don't know what's the cleanest way to add
some space there --- I'd rather not have the SGML text do it explicitly.
There's room for complaint that this takes up more vertical space than
the old way, assuming you have a reasonably wide window. I'm not
terribly bothered by that, but maybe someone else will be? I'm inclined
to think that that's well worth the benefit that we won't feel compelled
to keep column descriptions short.
BTW, this being just a test hack, I repurposed the "func_table_entry" and
"func_signature" style marker roles. If we do this for real then of
course we'd want to use different roles, even if they happen to mark up
the same for now.
regards, tom lane
Attachments:
pg_aggregate-description.patchtext/x-diff; charset=us-ascii; name=pg_aggregate-description.patchDownload
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index ce33df9..efb5e64 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -388,178 +388,251 @@
<table>
<title><structname>pg_aggregate</structname> Columns</title>
-
- <tgroup cols="4">
+ <tgroup cols="1">
<thead>
<row>
- <entry>Name</entry>
- <entry>Type</entry>
- <entry>References</entry>
- <entry>Description</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ Column Type
+ </para>
+ <para>
+ Description
+ </para></entry>
</row>
</thead>
+
<tbody>
<row>
- <entry><structfield>aggfnoid</structfield></entry>
- <entry><type>regproc</type></entry>
- <entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
- <entry><structname>pg_proc</structname> OID of the aggregate function</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggfnoid</structfield>
+ <type>regproc</type>
+ (references <link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.<structfield>oid</structfield>)
+ </para>
+ <para>
+ <structname>pg_proc</structname> OID of the aggregate function
+ </para></entry>
</row>
<row>
- <entry><structfield>aggkind</structfield></entry>
- <entry><type>char</type></entry>
- <entry></entry>
- <entry>Aggregate kind:
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggkind</structfield>
+ <type>char</type>
+ </para>
+ <para>
+ Aggregate kind:
<literal>n</literal> for <quote>normal</quote> aggregates,
<literal>o</literal> for <quote>ordered-set</quote> aggregates, or
<literal>h</literal> for <quote>hypothetical-set</quote> aggregates
- </entry>
+ </para></entry>
</row>
<row>
- <entry><structfield>aggnumdirectargs</structfield></entry>
- <entry><type>int2</type></entry>
- <entry></entry>
- <entry>Number of direct (non-aggregated) arguments of an ordered-set or
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggnumdirectargs</structfield>
+ <type>int2</type>
+ </para>
+ <para>
+ Number of direct (non-aggregated) arguments of an ordered-set or
hypothetical-set aggregate, counting a variadic array as one argument.
If equal to <structfield>pronargs</structfield>, the aggregate must be variadic
and the variadic array describes the aggregated arguments as well as
the final direct arguments.
- Always zero for normal aggregates.</entry>
+ Always zero for normal aggregates.
+ </para></entry>
</row>
<row>
- <entry><structfield>aggtransfn</structfield></entry>
- <entry><type>regproc</type></entry>
- <entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
- <entry>Transition function</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggtransfn</structfield>
+ <type>regproc</type>
+ (references <link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.<structfield>oid</structfield>)
+ </para>
+ <para>
+ Transition function
+ </para></entry>
</row>
<row>
- <entry><structfield>aggfinalfn</structfield></entry>
- <entry><type>regproc</type></entry>
- <entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
- <entry>Final function (zero if none)</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggfinalfn</structfield>
+ <type>regproc</type>
+ (references <link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.<structfield>oid</structfield>)
+ </para>
+ <para>
+ Final function (zero if none)
+ </para></entry>
</row>
<row>
- <entry><structfield>aggcombinefn</structfield></entry>
- <entry><type>regproc</type></entry>
- <entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
- <entry>Combine function (zero if none)</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggcombinefn</structfield>
+ <type>regproc</type>
+ (references <link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.<structfield>oid</structfield>)
+ </para>
+ <para>
+ Combine function (zero if none)
+ </para></entry>
</row>
<row>
- <entry><structfield>aggserialfn</structfield></entry>
- <entry><type>regproc</type></entry>
- <entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
- <entry>Serialization function (zero if none)</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggserialfn</structfield>
+ <type>regproc</type>
+ (references <link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.<structfield>oid</structfield>)
+ </para>
+ <para>
+ Serialization function (zero if none)
+ </para></entry>
</row>
<row>
- <entry><structfield>aggdeserialfn</structfield></entry>
- <entry><type>regproc</type></entry>
- <entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
- <entry>Deserialization function (zero if none)</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggdeserialfn</structfield>
+ <type>regproc</type>
+ (references <link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.<structfield>oid</structfield>)
+ </para>
+ <para>
+ Deserialization function (zero if none)
+ </para></entry>
</row>
<row>
- <entry><structfield>aggmtransfn</structfield></entry>
- <entry><type>regproc</type></entry>
- <entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
- <entry>Forward transition function for moving-aggregate mode (zero if none)</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggmtransfn</structfield>
+ <type>regproc</type>
+ (references <link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.<structfield>oid</structfield>)
+ </para>
+ <para>
+ Forward transition function for moving-aggregate mode (zero if none)
+ </para></entry>
</row>
<row>
- <entry><structfield>aggminvtransfn</structfield></entry>
- <entry><type>regproc</type></entry>
- <entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
- <entry>Inverse transition function for moving-aggregate mode (zero if none)</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggminvtransfn</structfield>
+ <type>regproc</type>
+ (references <link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.<structfield>oid</structfield>)
+ </para>
+ <para>
+ Inverse transition function for moving-aggregate mode (zero if none)
+ </para></entry>
</row>
<row>
- <entry><structfield>aggmfinalfn</structfield></entry>
- <entry><type>regproc</type></entry>
- <entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
- <entry>Final function for moving-aggregate mode (zero if none)</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggmfinalfn</structfield>
+ <type>regproc</type>
+ (references <link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.<structfield>oid</structfield>)
+ </para>
+ <para>
+ Final function for moving-aggregate mode (zero if none)
+ </para></entry>
</row>
<row>
- <entry><structfield>aggfinalextra</structfield></entry>
- <entry><type>bool</type></entry>
- <entry></entry>
- <entry>True to pass extra dummy arguments to <structfield>aggfinalfn</structfield></entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggfinalextra</structfield>
+ <type>bool</type>
+ </para>
+ <para>
+ True to pass extra dummy arguments to <structfield>aggfinalfn</structfield>
+ </para></entry>
</row>
<row>
- <entry><structfield>aggmfinalextra</structfield></entry>
- <entry><type>bool</type></entry>
- <entry></entry>
- <entry>True to pass extra dummy arguments to <structfield>aggmfinalfn</structfield></entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggmfinalextra</structfield>
+ <type>bool</type>
+ </para>
+ <para>
+ True to pass extra dummy arguments to <structfield>aggmfinalfn</structfield>
+ </para></entry>
</row>
<row>
- <entry><structfield>aggfinalmodify</structfield></entry>
- <entry><type>char</type></entry>
- <entry></entry>
- <entry>Whether <structfield>aggfinalfn</structfield> modifies the
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggfinalmodify</structfield>
+ <type>char</type>
+ </para>
+ <para>
+ Whether <structfield>aggfinalfn</structfield> modifies the
transition state value:
<literal>r</literal> if it is read-only,
<literal>s</literal> if the <structfield>aggtransfn</structfield>
cannot be applied after the <structfield>aggfinalfn</structfield>, or
<literal>w</literal> if it writes on the value
- </entry>
+ </para></entry>
</row>
<row>
- <entry><structfield>aggmfinalmodify</structfield></entry>
- <entry><type>char</type></entry>
- <entry></entry>
- <entry>Like <structfield>aggfinalmodify</structfield>, but for
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggmfinalmodify</structfield>
+ <type>char</type>
+ </para>
+ <para>
+ Like <structfield>aggfinalmodify</structfield>, but for
the <structfield>aggmfinalfn</structfield>
- </entry>
+ </para></entry>
</row>
<row>
- <entry><structfield>aggsortop</structfield></entry>
- <entry><type>oid</type></entry>
- <entry><literal><link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.oid</literal></entry>
- <entry>Associated sort operator (zero if none)</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggsortop</structfield>
+ <type>oid</type>
+ (references <link linkend="catalog-pg-operator"><structname>pg_operator</structname></link>.<structfield>oid</structfield>)
+ </para>
+ <para>
+ Associated sort operator (zero if none)
+ </para></entry>
</row>
<row>
- <entry><structfield>aggtranstype</structfield></entry>
- <entry><type>oid</type></entry>
- <entry><literal><link linkend="catalog-pg-type"><structname>pg_type</structname></link>.oid</literal></entry>
- <entry>Data type of the aggregate function's internal transition (state) data</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggtranstype</structfield>
+ <type>oid</type>
+ (references <link linkend="catalog-pg-type"><structname>pg_type</structname></link>.<structfield>oid</structfield>)
+ </para>
+ <para>
+ Data type of the aggregate function's internal transition (state) data
+ </para></entry>
</row>
<row>
- <entry><structfield>aggtransspace</structfield></entry>
- <entry><type>int4</type></entry>
- <entry></entry>
- <entry>Approximate average size (in bytes) of the transition state
- data, or zero to use a default estimate</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggtransspace</structfield>
+ <type>int4</type>
+ </para>
+ <para>
+ Approximate average size (in bytes) of the transition state
+ data, or zero to use a default estimate
+ </para></entry>
</row>
<row>
- <entry><structfield>aggmtranstype</structfield></entry>
- <entry><type>oid</type></entry>
- <entry><literal><link linkend="catalog-pg-type"><structname>pg_type</structname></link>.oid</literal></entry>
- <entry>Data type of the aggregate function's internal transition (state)
- data for moving-aggregate mode (zero if none)</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggmtranstype</structfield>
+ <type>oid</type>
+ (references <link linkend="catalog-pg-type"><structname>pg_type</structname></link>.<structfield>oid</structfield>)
+ </para>
+ <para>
+ Data type of the aggregate function's internal transition (state)
+ data for moving-aggregate mode (zero if none)
+ </para></entry>
</row>
<row>
- <entry><structfield>aggmtransspace</structfield></entry>
- <entry><type>int4</type></entry>
- <entry></entry>
- <entry>Approximate average size (in bytes) of the transition state data
- for moving-aggregate mode, or zero to use a default estimate</entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggmtransspace</structfield>
+ <type>int4</type>
+ </para>
+ <para>
+ Approximate average size (in bytes) of the transition state data
+ for moving-aggregate mode, or zero to use a default estimate
+ </para></entry>
</row>
<row>
- <entry><structfield>agginitval</structfield></entry>
- <entry><type>text</type></entry>
- <entry></entry>
- <entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>agginitval</structfield>
+ <type>text</type>
+ </para>
+ <para>
The initial value of the transition state. This is a text
field containing the initial value in its external string
representation. If this field is null, the transition state
value starts out null.
- </entry>
+ </para></entry>
</row>
<row>
- <entry><structfield>aggminitval</structfield></entry>
- <entry><type>text</type></entry>
- <entry></entry>
- <entry>
+ <entry role="func_table_entry"><para role="func_signature">
+ <structfield>aggminitval</structfield>
+ <type>text</type>
+ </para>
+ <para>
The initial value of the transition state for moving-aggregate mode.
This is a text field containing the initial value in its external
string representation. If this field is null, the transition state
value starts out null.
- </entry>
+ </para></entry>
</row>
</tbody>
</tgroup>
pg_aggregate.pngimage/png; name=pg_aggregate.pngDownload
�PNG
IHDR � � �Zw� biCCPICC Profile H��WXS��[RIh�H ��"5��Z����$�PbL*vtQ���(VtUD���� bwQ�}�����*oB��������?g���d�� t��2Y.�@�4_����"=8� ��=_��qbc��/���S�^�������q����P� ��A�!T� n /��� C��zr�L���a�OW�,5^��j���&!�q= d�/�@��Y�,���bW�P"@� � ��/�8�!yyUx6��^����pf��?c���������"Q�r�S����o��U�����&�G����5��31R�iwJ3�cT����D��; (U��HT����0!v�C"!6�8L���gdJ�x���N���4s����u��q1�8S��h����}~U����D����X���S(NH��
F-�$EC�
��"'>Rm�Y����6re�*~��"ix��K����i�ey��|�b��������u}��~_�F�����~�bLT.BQH�:w�E$M�������i�v�rc5�8Y���[Al�(����G�������d�� �8��l��Xu<x�\X@ [��������R��>��, .M����)|��B�D"���7*P�y@�~�������9�1�y �����Y�oI��H~�.������Q���(�F������$�C��0�#n��~x|����q��h��Z W m��$E��b� �&��o3�� �'��Cv��3q��{@?<z��Z�&nU����@��\cGq���A� ���3���=XT��>�X3����?��:a��%� �����ag�CX`aG�z�<vX�����5��-�/��#��_�SUI�k�k��'��M�Wm0�D�T�$K���������
�a��������_S��}�
�y��n�% �S{{{}�E^`�a��o}������Y N�(�j�z��@�(c���0#7��@#AH )`<���g9���9����`X6�-`�
��:p'�9p\���i�Axz!!t��#�-���!l$ E��8$IG�)�D�#s�Rd9���T!�"�c�����G:�W�GCi�j����P6�A#�t��NB�y�b��Dw���1�zmC�����0&f��`l���`�X&&�fb%XV��`
�����a����3p��p���I�L|�������e�>��!� �g�/�GC�"L&��'�nj'�%�L�=���b6qqq=q���J|H�&�H�$g�?)��'���IkH�HGI�H���d-���FN%K�E�2�N��%�rE�bK���P����%����J;���G���S���9�rj
�����������h-��l�r��Z���k}����h\ZMI[L�Nk�������v� z*=���^E?N�G������j���������B��c����S�S��_��N�.E�N������[�{P��n�Co�^�^��"��zg�������C�����������.C�����8�h7 ���
J
v�t�z&N1�0<l����vL3�����y��q�� � ����j]��h�Q�����h��U���,�P��e�u�wMp'��&�M6��0�l0�o�`p��}�o���N�q��L���7�6377���1;n�i�42�6_i~����a`!�Xiq�����a���Y��.KS�K��f��+{�D�"�=Vw���l�L���M�]66�l��T������m���mO�����K��oWg�����g_h_m����0�����#������������$v�p���:{9K��;�!�"R9�����R�R�r(sh����uC_��:l��S���z���nu�=\���E���rsr�U�]q�����r�w���!���q���9�s�g��g/o/�W�W���w��:��lv,{���'�g��!��^����|��s������t�����#�[���7����6�Z�+Y ��=�8r�9�8/�]�����q}�3��!XHxHIHK�~hb���{aVaYa�a]�����#��"���x^�k���#�#i���k#D9E��F��F�Z1�N�m�4�.��bV��������h������
��w*�?!~g�����% ���MI:IiIUI��C��'��6f��s)&)���TRjR������cW�mO�L+N�6�~��qg����x��������������1�J~w/c]F��+X-x.�v��E�EO2�3�g>���Z��!��;%\�Z��������rbr����&���#�����Ks���'N��*s���&�NZ5�K)��@�����~^���Iy� �����������M�N9?�i���O
�
��OLk�n9}���3836�Dff�l�e=k������w������G�k���7s��6�3�7{�����.�.�_��7�|�dA�B��k~)��-u--+��H�����.��wq���%^K6,%.�.��,p���z��?\1jE�J����oVMXu���l�j�j�������56k����V��jEp��u���{�^�����
5�6�n��I��������v�e[�[
�<�����/�_���l+��y�t{����U�UU;Mw.�F�����v]������f�����`�r��_���/r_�~����l[w�q����Z�U'�k�O�o=8�`S�_�����������������w��h���FYc���c�&4�>>������-'"O�>v��)�����O:�{��Y���s^�j�{�?���Z�Zj/x_���s��uD��K���]�|�
�����W[�%^�q=�z�
���7so��Up����;�;%wu���3�W����{������A����?R<��>�1�q��'UO������l������=�������������|����������6~���������{o����+yo�~���S�?>�����������/�_�������r~�Q �
����v �) 0��:V}��D}O�C�?a���O� ������m`/lv�!7�UG�� ���4�(2���\4x�!���}m ������������� @�$�]S%Dx7������+������M���@����V���\m�f �eXIfMM * > F( �i N � � �� x� �� � ASCII Screenshot��U pHYs % %IR$� �iTXtXML:com.adobe.xmp <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:exif="http://ns.adobe.com/exif/1.0/">
<exif:PixelXDimension>1940</exif:PixelXDimension>
<exif:UserComment>Screenshot</exif:UserComment>
<exif:PixelYDimension>1520</exif:PixelYDimension>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
� k� iDOT � ( � � t:�},� @ IDATx��u�U��[������[TBTBP�FBi��A�P�0_��.�����3�3;��l��~�;}f�3�>{]��s�-��"@ @ @ @ @ @ @ <�({DXD @ @ @ @ @ @ ��� � � � � � � � �
(���@ @ @ @ @ @ @�@�� � � � � � � ��� ��/+@ @ @ @ @ @ @ �� � � � � � � � �
(���@ @ @ @ @ @ @�@�� � � � � � � ��� ��/+@ @ @ @ @ @ @ �� � � � � � � � �
(���@ @ @ @ @ @ @�@�� � � � � � � ��� ��/+@ @ @ @ @ @ @ �s���C�e����=%_�L�R�{�P�,�z��YW�.��@ "%��w��8@ @ @ @ @ ��(8zJ���):���%M"%o�)w��c�:`��=����]z5�!�q�#2�uE��a��y�AYi����sa�&��M%e�� :L�r��,Z�C6��G�eL'w�'�2���x��EY�}�,^�S�>.^�,�3��;
��J�&93��h��� qP@�O�m�-��){����J�D�$��^��5��]�����$q������c7K� � � � � � �D�0�O~^%������|k�?�Y���;0:C�����Z#������+�uh��n�M������g����d����}_}�y�r9g9*3�Mp<��?e���r����U�r�-R��;�y�
�:E2�}X� q[���2��E���V�������IK�{�I�����_d7�������!� � � � � ���?�e����@9K�������z��"Dg]�u�m����[�U]0���-{�0����uFW��j�^���r�����5L�������2����O���}����H������!.��/b�=��T([H���������� � � � � � ��0��W��)D�5]���S����9���������,�L�D�H��)$u������!Bt����������QkQ��~��}���i��I%c��a�����R����r������+P���[�#�._����;
J�z�M��i���{��>����t��lZ]*�/j/2E �8.���1i��{/��K#�?z�T�������|�'2a�)���5���u���D�f�'�p��1rwq��;Fn�J@ @ @ @ @ ��a��]�13^f������u���Q�3D��������0�?��cwI3�EtD���}��R~]��9T�6��f��
�����y��;,�����n9f��m���!s�SK�
wH��8�� �P�l�g�Q��`���=q�A��u�\3>��.����d�4�;k��v�q����apb@ @ @ @ @ bP�����Y����w��������$y�$R(Oy�\)^0G���
�;U�����l�n���Y���w��/e����iR]W��5�b�"����U������z��x�\�tY�d�(��,`�+����%q�����-�y�j���A���?���X�������m�l����:��Vo?^t�U-%����^X��
�!0e�o2����+���~��q����c����smiS��9�_�4�����~���X�Z�S�m�[N�^2�K-����{J����j�������NYg�:!sg��J���[.���?���-�����I���$���������;d��AB���������m�������o�Ce[����[������o�i�&����$6C���4/��V��w���\�a�9�v9p���4�����&:�@1�=^��*�o�m���������"YR��)��7L{���s
��� � � � � ����@Y����!_������R�Z�
d�>�kJV3��xC�{K�E&�+�k�z�������,��� �����7�";�8�~%����G�j&)��9�uhe�h���G�>~Z�|�D���������������b3P��Z��Nw������s�������'sM��11�|t�v5_�m��T��9)��|!w���������6|\����J0��~^)����>���� `�e��c���;����>,�V��Y������|����}���{l���.�{O�\.^�6$������O�L��~/>y�����e�����!�������oF&3�_YgZ����� �C��m����r��w��*� � � � � � H��jjK.�h�d
=���R���.�nS�^t���;���"����Z����B����Nc>�s�o��z���8��/�X���b��M���-�^�=�9tH�:VKkgEf4`~�����������o�����9{U{����RUg�����
�N�=/���r�������E�1x�1�mu���%��&�����F{�g��
-L�]���:nuS��5�]�kkc�V�~���@9&,���:oLr��u��y�8��~���U[�J�1^*Jd>���z���WQ�������|�'[��������@��F��KnZ�jK��Wn��c��;m����Z���\�(�,%�<jW�L���l03Z���nh�h����r�j��E���+�w�.��K�o
����]j=RZ���l/2E @ @ @ @ @ ve�����VK/�S[\�A�!�u�k#�������2�G�-wgYg����-cZ�O�ZV7�����{Lk�OMw�uQ����^/��)��l����(�?���O��9h���ooZ=�8�Z���Z{N��
tY[��6���6���hY�e��6�9L�1���� %�t���M����x�V��������|���6������1Q�>���'����y����tg�]~\�I6�> �Y�k�*���>���X�J~Z�Y~\��tw~H�� 3� .K�%��K&|����b�u.
@�3�]�Gw�����������CN���94DmeZTV��v{��T���^lu��-��3�]�>qIL�7�^�������K�5C��:~Y��+���c�����W�ZL�o�}�.��<n�3��={�RY�n��E����"������{��f�����3��3*�U?Co���a{�k���tWQi��#���P���%>~�p�,�k��
w�k��o��O�$��Y
�����q��+��I��� �}B;��^_z��,���agS����&O=p�c3l�w����������wL�se����[�;C�](op�]g4,oV��������|��6�9u�� ����AM%���]�����dHc}��]e��c>6�i7�� f8�w��~����C�^O��O�� �y-�B��_W[������BA @ @ @ @ @�����IC���l��
���O�����1���d�������L��.1�3w���h�m�%��x���5��nB���G�T�^{���?���viZ�Ay��������3�d�I�����a����LK�N �A7+P�������������}����w�n3��{�h����>G������ �� �4�tmq:������c�6����i�X�h��)c/F�T��m=xN�ui �����u���Y-i��k��]��E�?��^��Q�C�u�������>[���1�_:^��h�5w`������>oau%l���3��00���VW��~�4:�k'���$a
���������gZ���E�E_x�����]����m�:�J����O5�����q���v/�-='�{7���r���]�����@Y_.���� X?�Ow�"���]4�}��*��5��&�m�2��LP�����5�����{���/����fl��o�����*�O�~�&|j������GC����"� � � � � �@�
��u��=�q.Z['>oZ�����:n�0y��,���5`��-?�*`7o]~�r�q�X���dI�#[�h�U�v���+�/b�"sV9�}���fv��pjXv����tY��
��/����������v�>p�I��x��D�wz���g�[-~����j�|�iY��q���VKv{���G��z�^���L�����y��<rg���#'N�������E��O?d��Yt���,��h>�}���J�r��y��B���R���l>W�V��MX�-��P[�������p�������V��ctL�;���n�.Q�C?�2�� ��5�v#�-��5�m��&Ur�`Z��(�����Wm��&8��������u�m�A�:X�>������������'���h��Z�(�KF��\�@7:�k��_�K6J������E��9�� ���Q���U��]�Z>zO1�z�-��
a�l��S�,u4�!?q �j+����J}>�q������%�]�kk����x�~�� d�i�M�z�^�n������@Y_v����E����B����0D���h7��P@��]���-��������~��{�.inZD���2����U���_*F��/N�� � � � � � �;��(k�N��v���r��9f�����"Y� �o�9�.��kK`m�W���_�������W�1#����em�j�����Q_������X����-�vo`�&BS
�����5�tw��-a�%�v��#:�V��{C��C�����k�^�+�_W�h����+�%pl�F�����S�� �V)����A�+�7�k�q�5��h��"y�Z�,7�/�>r�5���v����E�~�1�3+�u���j�����)S$�
�'���<�u��/�g����u���v]�-��1���[\W;E����������Z]���Q�}���}�����_~,`�a�V��^�]���W���E����8��{��}�a�2T_��Kt=W
�uk}��[��Q��T+(�k�{�|�zw�SM�����Vx?�oCoU�%:���D���N�����J�.~����`�/���tk��d�N������E_����S����r��I���\�.�Cs}�f��v!z?�e�������}�����?��T��H�*���m�w�As�v����������s1� � � � � � ��X�����/�4c���������?��<_�k������!�� �.�{�$:��]�uye�G�c�� �'�}lX��R���-��%������U"�m['��b3PV��3�����;�U����n����t6���;P���X�w`�����1}u��fldm����y3�4�����8����V(�c��t��'�J[k��'�Xa������j�l-�"�uv���z���bX-�G��Q4|��
������?��rX��>F�kw�d^:9k��l�����v��z�:������|��b������5������n�u<��f|e�B\�:3<����kw�Y2����
m?�������������������rd��@����k������������[[�<4��������������sv�@�Z�Cg�������`�����U� ��/G������#���~�t��?����]R&O&5*e����aS@ @ @ @ @ �
�j�����e���9-!���n�S$3�/�"�M+e�(�uj��rt��L�����V�����.�@Y�4~�� �fk�-��*����Q4����-�4\�lx[����e������j���-��76[��eo�j_�=��UCSm�<����jm���Y��������?�����@Y[�k�x���;�k�yme��0�E[��:�Z���+k{�{����(GG�s�����:'v��
���{���}s��*��qd�
f�_�!�?�d� ��6r6G�s���l��/�N�u�����d����&k]d�����\����~�"S����2�w��]F�uw��,���Z�������dM�3P���q��u��s>��(g��V�����;�{0�������`e�_�����_��ok����uh��m�����;�>�y@ @ @ @ @ ��-k���+�J�I�9�)M@��vy���N����~���>��~��L0!�?v�����9��n������:�xm�f��X��9�s���]Im���x�!� #�����^#g����c�4c2���4��(�����{f����l������{M ��Z�n���m��k�������j����:er���J��!�y#�h+imE��W�7P�k�k���k��W�^���x����}N;P����� Z�������u�7_�`����[t<�y�E�D���.j�]��O����p��y�#Y[��D�]���5������������;���H�T!�����=Ti5J�;|-:����Zi��]�����9g�[�;>x0o�-��u��@�����OK7�����}����������< � � � � �@���@������%am ��?�e����a��qku�_X��������v{�Wt�_�o�6��e����X��f��=��:"�-��5E��v�?mQ�E�d��4Q��[N�t�����9?����rn������~���uv��w�<����?G�-Zku�h��s�f�;�K�q�&�{�y&@�k]��X����P7�Z(��G��zs3���s���������7Pvw�V��:���9��(GGV��D&P���u�]-e����U�_�������Q0w���3��U��~��X+,�|k��]4_���c�}l�lOz���q����^���.:��~7G�<��m��v=V_���|����5����cM��|���7P���%oq_���(�����H�}w�zW�������%�yy�� � � � � ��
�Z���Ej0�E[�j�-���K�}���:�@Y[����Q��y���;OqZ��s4q���` ;������j�f��g/�s]�����K���}�1(k����7��{K�~-j�z�d�~�Q����f��7L��1p;���ZW�|��
���f�LY��5��������Z���}b*P��X�l��;������+�{e
��i+{3n���3z�l������vE����N+go�u���@Y�j&���(b�)o���2�y�3��s]g�gn}}|�.f\�������/W��6�z� �@Y���{O��~B{oU���e�[��J����9Y��2�w���|�]��S���et3A�����c�?S��h�
������='���iu����e�;����1�R��#g��C6�����2 � � � � �@��@��lg
�4��v��ck`d�`e���+�������Y����!�~��Y��SH�j�8�:L �aJ�!s��ks� {\���!m���tA�$-��|m'���Z��B����8�m}��R~Yv���V�g�S�>cv�����K���_V����IV3h]�2������?���V�U��e
Yc�jH��y��k�>~��T4��&��h������.�k��J�fo��;�>"�F������qy�����Sg����f���g�e
��p�L�E��]��
�V�v��@Y�?�1���������l0]+w��s��@Y�������Z8���[<]�K|��{������SN��@9���O�@Y�}���� Z�jm��'���0�����U����m��>Www���1v[��v�����2z��N�����y�q�����%)�30��0�Gx�G[������u�7���/L�7�wR&O&o���
e�wh�v��n�^*��n���m}iF�^������{d��e w��.�4��o�N�^&��P���w���S�X���gg��(k�z-�
=0��>��_���^< k�rgGf@ @ @ @ @ �@��������I���R����]����zC=@��}��;���w��rU>\�\��k�S��0�m��Oo]~]^k%�Vu���v��V��I�$�]���"`�4�Pk0��y
)S$�s�`g���C'$y�$V��]����J�����?�p�O��P�,2�K�PC�y#�B�;�bo�i�g'vJ��Ek:��sLa
��ur�0Ru
E5t�.���~�i��� g�����:��q���z���sY�
���s��A�������&:^�;h���Nc*Pv��w�k��`))l���������-9����n%)Y(������[�k0�/GS���������k�v������k�ao �cD����2u�umI�/�h��j�t�r�3��q������E����#�X��v��<��e��:L�����gM�|� ���ym���y�B��.��L��V{R��>�����[��.�[^}�I�,�l���{��e�W���[>��<������e�\H83��j�g,o{w
��92��K�����e���:t��u�}���|92��[��S��>��J}I������cOk�~���9t����>�������z����N�!V��@Iy���V�?-�"���������@Y�5����U�K3�rM>3������?��T������%�y�D_^ o�� � � � � � �[ �e
E��)�MW�a������f(�����V��O�f5|��` �T��V�v�H��Vo���Y,�kMp��n��;"w�2����+����jm�L�lw�k�@������x_6���-�+b��q�>�f������_^���i{{XSw�\���������&�|?�7��n-i�����+���������@Y��&�f9c���wOK�e�bv����U�_�i������h���������/P�
��C?{���s��p0����}�>�a������5��V����ZWT����?��x�}I!����4�-_��a�GC����T�z}iAC��J��)d����
qtY�u^�6�4�[���Xl�{�Z���>�����[��&���� I�3�o���:�]^�w`��h|���o��;��!r�O����w,�@ @ @ @ @ ��@�e
�|}�������\xE�����e����O�R^|�n�h�o���[�����W�
��Z�Z9���G�.f=i�bM��rQ�:P��<&|�+��t{_����r��v��i�]W�n1��Q�p�z[�Po���}�����%��\Vm�����z�~
#������R��$�*m�Z�bg�oF������Mw��/C��q�u��i���)#Z*�UTz6�p��M��<�2�K=)V ����;P^8����f���w����}����8��=l�w�J��M�����j��<�3Z-�S��������5+�!^��kvgCY�8����s��_�p#3��� �n��������C���u�v'���3�h��JnZ g_�=f��~�i��G�mQ���L���]��T���Q7��Y=F[�k���{���u���eL�~m�����Y-B+�}�������i������|+�]�i��e�b�����:^�_�{�������.�=�������y�~�jtY��f��[�U����~E��Ns��;���{����:�~�D���-��kR�A��{�6{9"����.#�����;��i�a���w�2����K m�V�:�
w �|]�b� �n�#sz���w5��~���c�����8��i%�Z�t^���HiW��S��hK��������cZ"_��:`��=b4�SA�U?@ @ @ @ @ �@�ew���@z� \��8+�w��Y���
���9(�X�y�g��7*�������;LW����1[�tV��� �����k� 6�����i��--o3F FvLa���N�5����fLg�Zm�`�
om����L��*b����wo������ ������5c�����>iS�?5�K�"��-�~.���[�L&�������D[�F�DG9��j0����0��g3�S���H}���>W�YH
���f�-�n-m���v����3�@U���=�,���3��I_��kR��?� g��.��
}�!���k�����.�yA��Ofz ����l��V��]mk��Q���Su�w��}�d���{��U��.��3�v�4���{S�L� � � � � � 7_���7�����.V�]����vW���R�A�{���X�G�&o��B=
���6��ht��7����s
��� � � � � � -@�4;���3P�.�u<\W[�j���v������V�i=X�`�u#�����K�!m*������{��r�3��CeK�5�����#������\c��� � � � � � �@ PN�=>���Y;��o���;e�j��L������@��+O����K���d��}�m�JI�
u{\����9�e��n�����2�����o��.:���X�_�k,�q:@ @ @ @ @ H`� ������d�|n>��0o���O��e
���{�c>
R�E��n�\E�tW��M������pTJ3~n��9�RE�cWm�+�G|`������V0-����$��u���-E����+�� � � � � � ��� P�y��94,�~�9z��o������&