����JFIFXX�����    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222����"��4�� ���,�PG"Z_�4�˷����kjز�Z�,F+��_z�,�© �����zh6�٨�ic�fu���#ډb���_�N�?��wQ���5-�~�I���8����TK<5o�Iv-�����k�_U_�����~b�M��d����Ӝ�U�Hh��?]��E�w��Q���k�{��_}qFW7HTՑ��Y��F�?_�'ϔ��_�Ջt��=||I ��6�έ"�����D���/[�k�9���Y�8ds|\���Ҿp6�Ҵ���]��.����6�z<�v��@]�i%��$j��~�g��J>��no����pM[me�i$[����s�o�ᘨ�˸ nɜG-�ĨU�ycP�3.DB�li�;��hj���x7Z^�N�h������N3u{�:j�x�힞��#M&��jL P@_���� P��&��o8������9�����@Sz6�t7#O�ߋ �s}Yf�T���lmr����Z)'N��k�۞p����w\�Tȯ?�8`�O��i{wﭹW�[�r�� ��Q4F�׊���3m&L�=��h3����z~��#�\�l :�F,j@�� ʱ�wQT����8�"kJO���6�֚l����}���R�>ډK���]��y����&����p�}b��;N�1�m�r$�|��7�>e�@B�TM*-iH��g�D�)� E�m�|�ؘbҗ�a��Ҿ����t4���o���G��*oCN�rP���Q��@z,|?W[0�����:�n,jWiE��W��$~/�hp\��?��{(�0���+�Y8rΟ�+����>S-S����VN;�}�s?.����� w�9��˟<���Mq4�Wv'��{)0�1mB��V����W[�����8�/<� �%���wT^�5���b��)iM� pg�N�&ݝ��VO~�q���u���9� ����!��J27����$O-���! �:�%H��� ـ����y�ΠM=t{!S�� oK8������t<����è:a������[�����ա�H���~��w��Qz`�po�^ ����Q��n� �,uu�C�$ ^���,������8�#��:�6��e�|~���!�3�3.�\0��q��o�4`.|� ����y�Q�`~;�d�ׯ,��O�Zw�������`73�v�܋�<���Ȏ�� ـ4k��5�K�a�u�=9Yd��$>x�A�&�� j0� ���vF��� Y�|�y��� ~�6�@c��1vOp�Ig����4��l�OD���L����� R���c���j�_�uX6��3?nk��Wy�f;^*B� ��@�~a�`��Eu������+���6�L��.ü>��}y���}_�O�6�͐�:�YrG�X��kG�����l^w���~㒶sy��Iu�!� W ��X��N�7BV��O��!X�2����wvG�R�f�T#�����t�/?���%8�^�W�aT��G�cL�M���I��(J����1~�8�?aT ���]����AS�E��(��*E}� 2��#I/�׍qz��^t�̔���b�Yz4x���t�){ OH��+(E��A&�N�������XT��o��"�XC��'���)}�J�z�p� ��~5�}�^����+�6����w��c��Q�|Lp�d�H��}�(�.|����k��c4^�"�����Z?ȕ ��a<�L�!039C� �Eu�C�F�Ew�ç ;�n?�*o���B�8�bʝ���'#Rqf���M}7����]����s2tcS{�\icTx;�\��7K���P���ʇ Z O-��~��c>"��?�������P��E��O�8��@�8��G��Q�g�a�Վ���󁶠�䧘��_%#r�>�1�z�a��eb��qcPѵ��n���#L��� =��׀t� L�7�`��V���A{�C:�g���e@�w1 Xp3�c3�ġ����p��M"'-�@n4���fG��B3�DJ�8[Jo�ߐ���gK)ƛ��$���� ���8�3�����+���� �����6�ʻ���� ���S�kI�*KZlT _`���?��K����QK�d����B`�s}�>���`��*�>��,*@J�d�oF*����弝��O}�k��s��]��y�ߘ��c1G�V���<=�7��7����6�q�PT��tXԀ�!9*4�4Tހ3XΛex�46���Y��D ����� �BdemDa����\�_l,��G�/���֌7���Y�](�xTt^%�GE�����4�}bT���ڹ�����;Y)���B�Q��u��>J/J �⮶.�XԄ��j�ݳ�+E��d ��r�5�_D�1 ��o�� �B�x�΢�#���<��W�����8���R6�@g�M�.��� dr�D��>(otU��@x=��~v���2� ӣ�d�oBd��3�eO�6�㣷�����ݜ6��6Y��Qz`��S��{���\P�~z m5{J/L��1������<�e�ͅPu�b�]�ϔ���'������f�b� Zpw��c`"��i���BD@:)ִ�:�]��hv�E�w���T�l��P���"Ju�}��وV J��G6��. J/�Qgl߭�e�����@�z�Zev2u�)]կ�����7x���s�M�-<ɯ�c��r�v�����@��$�ޮ}lk���a���'����>x��O\�ZFu>�����ck#��&:��`�$�ai�>2Δ����l���oF[h��lE�ܺ�Πk:)���`�� $[6�����9�����kOw�\|���8}������ބ:��񶐕��I�A1/�=�2[�,�!��.}gN#�u����b��� ~��݊��}34q����d�E��Lc��$��"�[q�U�硬g^��%B �z���r�pJ�ru%v\h1Y�ne`ǥ:g���pQM~�^�Xi� ��`S�:V29.�P���V�?B�k�� AEvw%�_�9C�Q����wKekPؠ�\�;Io d�{ ߞo�c1eP����\� `����E=���@K<�Y���eڼ�J���w����{av�F�'�M�@/J��+9p���|]�����Iw &`��8���&M�hg��[�{��Xj��%��Ӓ�$��(����ʹN���<>�I���RY���K2�NPlL�ɀ)��&e����B+ь����( � �JTx���_?EZ� }@ 6�U���뙢ط�z��dWI�n` D����噥�[��uV��"�G&Ú����2g�}&m��?ċ�"����Om#��������� ��{�ON��"S�X��Ne��ysQ���@Fn��Vg���dX�~nj�]J�<�K]:��FW��b�������62�=��5f����JKw��bf�X�55��~J �%^����:�-�QIE��P��v�nZum� z � ~ə ���� ���ة����;�f��\v���g�8�1��f24;�V���ǔ�)����9���1\��c��v�/'Ƞ�w�������$�4�R-��t���� e�6�/�ġ �̕Ecy�J���u�B���<�W�ַ~�w[B1L۲�-JS΂�{���΃������A��20�c#��@ 0!1@AP"#2Q`$3V�%45a6�FRUq��� ����^7ׅ,$n�������+��F�`��2X'��0vM��p�L=������5��8������u�p~���.�`r�����\���O��,ư�0oS ��_�M�����l���4�kv\JSd���x���SW�<��Ae�IX����������$I���w�:S���y���›R��9�Q[���,�5�;�@]�%���u�@ *ro�lbI �� ��+���%m:�͇ZV�����u�̉����θau<�fc�.����{�4Ա� �Q����*�Sm��8\ujqs]{kN���)qO�y�_*dJ�b�7���yQqI&9�ԌK!�M}�R�;������S�T���1���i[U�ɵz�]��U)V�S6���3$K{�ߊ<�(� E]Զ[ǼENg�����'�\?#)Dkf��J���o��v���'�%ƞ�&K�u�!��b�35LX�Ϸ��63$K�a�;�9>,R��W��3�3� d�JeTYE.Mϧ��-�o�j3+y��y^�c�������VO�9NV\nd�1 ��!͕_)a�v;����թ�M�lWR1��)El��P;��yوÏ�u 3�k�5Pr6<�⒲l�!˞*��u־�n�!�l:����UNW ��%��Chx8vL'��X�@��*��)���̮��ˍ��� ���D-M�+J�U�kvK����+�x8��cY������?�Ԡ��~3mo��|�u@[XeY�C�\Kp�x8�oC�C�&����N�~3-H���� ��MX�s�u<`���~"WL��$8ξ��3���a�)|:@�m�\���^�`�@ҷ)�5p+��6���p�%i)P M���ngc�����#0Aruz���RL+xSS?���ʮ}()#�t��mˇ!��0}}y����<�e� �-ή�Ԩ��X������ MF���ԙ~l L.3���}�V뽺�v�����멬��Nl�)�2����^�Iq��a��M��qG��T�����c3#������3U�Ǎ���}��לS�|qa��ڃ�+���-��2�f����/��bz��ڐ�� �ݼ[2�ç����k�X�2�* �Z�d���J�G����M*9W���s{��w���T��x��y,�in�O�v��]���n����P�$�JB@=4�OTI�n��e�22a\����q�d���%�$��(���:���: /*�K[PR�fr\nڙdN���F�n�$�4�[�� U�zƶ����� �mʋ���,�ao�u 3�z� �x��Kn����\[��VFmbE;�_U��&V�Gg�]L�۪&#n%�$ɯ�dG���D�TI=�%+AB�Ru#��b4�1�»x�cs�YzڙJG��f��Il��d�eF'T� iA��T���uC�$����Y��H?����[!G`}���ͪ� �纤Hv\������j�Ex�K���!���OiƸ�Yj�+u-<���'q����uN�*�r\��+�]���<�wOZ.fp�ێ��,-*)V?j-kÊ#�`�r��dV����(�ݽBk�����G�ƛk�QmUڗe��Z���f}|����8�8��a���i��3'J�����~G_�^���d�8w������ R�`(�~�.��u���l�s+g�bv���W���lGc}��u���afE~1�Ue������Z�0�8�=e�� f@/�jqEKQQ�J��oN��J���W5~M>$6�Lt�;$ʳ{���^��6�{����v6���ķܰg�V�cnn �~z�x�«�,2�u�?cE+Ș�H؎�%�Za�)���X>uW�Tz�Nyo����s���FQƤ��$��*�&�LLXL)�1�" L��eO��ɟ�9=���:t��Z���c��Ž���Y?�ӭV�wv�~,Y��r�ۗ�|�y��GaF�����C�����.�+� ���v1���fήJ�����]�S��T��B��n5sW}y�$��~z�'�c ��8 ��� ,! �p��VN�S��N�N�q��y8z˱�A��4��*��'������2n<�s���^ǧ˭P�Jޮɏ�U�G�L�J�*#��<�V��t7�8����TĜ>��i}K%,���)[��z�21z ?�N�i�n1?T�I�R#��m-�����������������1����lA�`��fT5+��ܐ�c�q՝��ʐ��,���3�f2U�եmab��#ŠdQ�y>\��)�SLY����w#��.���ʑ�f��� ,"+�w�~�N�'�c�O�3F�������N<���)j��&��,-� �љ���֊�_�zS���TǦ����w�>��?�������n��U仆�V���e�����0���$�C�d���rP �m�׈e�Xm�Vu� �L��.�bֹ��� �[Դaզ���*��\y�8�Է:�Ez\�0�Kq�C b��̘��cө���Q��=0Y��s�N��S.���3.���O�o:���#���v7�[#߫ ��5�܎�L���Er4���9n��COWlG�^��0k�%<���ZB���aB_���������'=��{i�v�l�$�uC���mƎҝ{�c㱼�y]���W�i ��ߧc��m�H� m�"�"�����;Y�ߝ�Z�Ǔ�����:S#��|}�y�,/k�Ld� TA�(�AI$+I3��;Y*���Z��}|��ӧO��d�v��..#:n��f>�>���ȶI�TX��� 8��y����"d�R�|�)0���=���n4��6ⲑ�+��r<�O�܂~zh�z����7ܓ�HH�Ga롏���nCo�>������a ���~]���R���̲c?�6(�q�;5%� |�uj�~z8R=X��I�V=�|{v�Gj\gc��q����z�؋%M�ߍ����1y��#��@f^���^�>N�����#x#۹��6�Y~�?�dfPO��{��P�4��V��u1E1J �*|���%���JN��`eWu�zk M6���q t[�� ��g�G���v��WIG��u_ft����5�j�"�Y�:T��ɐ���*�;� e5���4����q$C��2d�}���� _S�L#m�Yp��O�.�C�;��c����Hi#֩%+) �Ӎ��ƲV���SYź��g |���tj��3�8���r|���V��1#;.SQ�A[���S������#���`n�+���$��$I �P\[�@�s��(�ED�z���P��])8�G#��0B��[ى��X�II�q<��9�~[Z멜�Z�⊔IWU&A>�P~�#��dp<�?����7���c��'~���5 ��+$���lx@�M�dm��n<=e�dyX��?{�|Aef ,|n3�<~z�ƃ�uۧ�����P��Y,�ӥQ�*g�#먙R�\���;T��i,��[9Qi歉����c>]9�� ��"�c��P�� �Md?٥��If�ت�u��k��/����F��9�c*9��Ǎ:�ØF���z�n*�@|I�ށ9����N3{'��[�'ͬ�Ҳ4��#}��!�V� Fu��,�,mTIk���v C�7v���B�6k�T9��1�*l� '~��ƞF��lU��'�M ����][ΩũJ_�{�i�I�n��$���L�� j��O�dx�����kza۪��#�E��Cl����x˘�o�����V���ɞ�ljr��)�/,�߬h�L��#��^��L�ф�,íMƁe�̩�NB�L�����iL����q�}��(��q��6IçJ$�W�E$��:������=#����(�K�B����zђ <��K(�N�۫K�w��^O{!����)�H���>x�������lx�?>Պ�+�>�W���,Ly!_�D���Ō�l���Q�!�[ �S����J��1��Ɛ�Y}��b,+�Lo�x�ɓ)����=�y�oh�@�꥟/��I��ѭ=��P�y9��� �ۍYӘ�e+�p�Jnϱ?V\SO%�(�t� ���=?MR�[Ș�����d�/ ��n�l��B�7j� ��!�;ӥ�/�[-���A�>�dN�sLj ��,ɪv��=1c�.SQ�O3�U���ƀ�ܽ�E����������̻��9G�ϷD�7(�}��Ävӌ\�y�_0[w ���<΍>����a_��[0+�L��F.�޺��f�>oN�T����q;���y\��bՃ��y�jH�<|q-eɏ�_?_9+P���Hp$�����[ux�K w�Mw��N�ی'$Y2�=��q���KB��P��~������Yul:�[<����F1�2�O���5=d����]Y�sw:���Ϯ���E��j,_Q��X��z`H1,#II ��d�wr��P˂@�ZJV����y$�\y�{}��^~���[:N����ߌ�U�������O��d�����ؾe��${p>G��3c���Ė�lʌ�� ת��[��`ϱ�-W����dg�I��ig2��� ��}s ��ؤ(%#sS@���~���3�X�nRG�~\jc3�v��ӍL��M[JB�T��s3}��j�Nʖ��W����;7��ç?=X�F=-�=����q�ߚ���#���='�c��7���ڑW�I(O+=:uxq�������������e2�zi+�kuG�R��������0�&e�n���iT^J����~\jy���p'dtG��s����O��3����9* �b#Ɋ�� p������[Bws�T�>d4�ۧs���nv�n���U���_�~,�v����ƜJ1��s�� �QIz��)�(lv8M���U=�;����56��G���s#�K���MP�=��LvyGd��}�VwWBF�'�à �?MH�U�g2�� ����!�p�7Q��j��ڴ����=��j�u��� Jn�A s���uM������e��Ɔ�Ҕ�!)'��8Ϣ�ٔ��ޝ(��Vp���צ֖d=�IC�J�Ǡ{q������kԭ�߸���i��@K����u�|�p=..�*+����x�����z[Aqġ#s2a�Ɗ���RR�)*HRsi�~�a &f��M��P����-K�L@��Z��Xy�'x�{}��Zm+���:�)�) IJ�-i�u���� ���ܒH��'�L(7�y�GӜq���� j��� 6ߌg1�g�o���,kر���tY�?W,���p���e���f�OQS��!K�۟cҒA�|ս�j�>��=⬒��˧L[�� �߿2JaB~R��u�:��Q�] �0H~���]�7��Ƽ�I���(}��cq '�ήET���q�?f�ab���ӥvr� �)o��-Q��_'����ᴎo��K������;��V���o��%���~OK ����*��b�f:���-ťIR��`B�5!RB@���ï�� �u �̯e\�_U�_������� g�ES��3�������QT��a����x����U<~�c?�*�#]�MW,[8O�a�x��]�1bC|踤�P��lw5V%�)�{t�<��d��5���0i�XSU��m:��Z�┵�i�"��1�^B�-��P�hJ��&)O��*�D��c�W��vM��)����}���P��ܗ-q����\mmζZ-l@�}��a��E�6��F�@��&Sg@���ݚ�M����� ȹ 4����#p�\H����dYDo�H���"��\��..R�B�H�z_�/5˘����6��KhJR��P�mƶi�m���3�,#c�co��q�a)*Pt����R�m�k�7x�D�E�\Y�閣_X�<���~�)���c[[�BP����6�Yq���S��0����%_����;��Àv�~�| VS؇ ��'O0��F0��\���U�-�d@�����7�SJ*z��3n��y��P����O���������m�~�P�3|Y��ʉr#�C�<�G~�.,! ���bqx���h~0=��!ǫ�jy����l�O,�[B��~��|9��ٱ����Xly�#�i�B��g%�S��������tˋ���e���ې��\[d�t)��.+u�|1 ������#�~Oj����hS�%��i.�~X���I�H�m��0n���c�1uE�q��cF�RF�o���7� �O�ꮧ� ���ۛ{��ʛi5�rw?׌#Qn�TW��~?y$��m\�\o����%W� ?=>S�N@�� �Ʈ���R����N�)�r"C�:��:����� �����#��qb��Y�. �6[��2K����2u�Ǧ�HYR��Q�MV��� �G�$��Q+.>�����nNH��q�^��� ����q��mM��V��D�+�-�#*�U�̒ ���p욳��u:�������IB���m���PV@O���r[b= �� ��1U�E��_Nm�yKbN�O���U�}�the�`�|6֮P>�\2�P�V���I�D�i�P�O;�9�r�mAHG�W�S]��J*�_�G��+kP�2����Ka�Z���H�'K�x�W�MZ%�O�YD�Rc+o��?�q��Ghm��d�S�oh�\�D�|:W������UA�Qc yT�q������~^�H��/��#p�CZ���T�I�1�ӏT����4��"�ČZ�����}��`w�#�*,ʹ�� ��0�i��課�Om�*�da��^gJ݅{���l�e9uF#T�ֲ��̲�ٞC"�q���ߍ ոޑ�o#�XZTp����@ o�8��(jd��xw�]�,f���`~�|,s��^����f�1���t��|��m�򸄭/ctr��5s��7�9Q�4�H1꠲BB@l9@���C�����+�wp�xu�£Yc�9��?`@#�o�mH�s2��)�=��2�.�l����jg�9$�Y�S�%*L������R�Y������7Z���,*=�䷘$�������arm�o�ϰ���UW.|�r�uf����IGw�t����Zwo��~5 ��YյhO+=8fF�)�W�7�L9lM�̘·Y���֘YLf�큹�pRF���99.A �"wz��=E\Z���'a� 2��Ǚ�#;�'}�G���*��l��^"q��+2FQ� hj��kŦ��${���ޮ-�T�٭cf�|�3#~�RJ����t��$b�(R��(����r���dx� >U b�&9,>���%E\� Ά�e�$��'�q't��*�א���ެ�b��-|d���SB�O�O��$�R+�H�)�܎�K��1m`;�J�2�Y~9��O�g8=vqD`K[�F)k�[���1m޼c��n���]s�k�z$@��)!I �x՝"v��9=�ZA=`Ɠi �:�E��)`7��vI��}d�YI�_ �o�:ob���o ���3Q��&D&�2=�� �Ά��;>�h����y.*ⅥS������Ӭ�+q&����j|UƧ����}���J0��WW< ۋS�)jQR�j���Ư��rN)�Gű�4Ѷ(�S)Ǣ�8��i��W52���No˓� ۍ%�5brOn�L�;�n��\G����=�^U�dI���8$�&���h��'���+�(������cȁ߫k�l��S^���cƗjԌE�ꭔ��gF���Ȓ��@���}O���*;e�v�WV���YJ\�]X'5��ղ�k�F��b 6R�o՜m��i N�i����>J����?��lPm�U��}>_Z&�KK��q�r��I�D�Չ~�q�3fL�:S�e>���E���-G���{L�6p�e,8��������QI��h��a�Xa��U�A'���ʂ���s�+טIjP�-��y�8ۈZ?J$��W�P� ��R�s�]��|�l(�ԓ��sƊi��o(��S0��Y� 8�T97.�����WiL��c�~�dxc�E|�2!�X�K�Ƙਫ਼�$((�6�~|d9u+�qd�^3�89��Y�6L�.I�����?���iI�q���9�)O/뚅����O���X��X�V��ZF[�یgQ�L��K1���RҖr@v�#��X�l��F���Нy�S�8�7�kF!A��sM���^rkp�jP�DyS$N���q��nxҍ!U�f�!eh�i�2�m���`�Y�I�9r�6� �TF���C}/�y�^���Η���5d�'��9A-��J��>{�_l+�`��A���[�'��յ�ϛ#w:݅�%��X�}�&�PSt�Q�"�-��\縵�/����$Ɨh�Xb�*�y��BS����;W�ջ_mc�����vt?2}1�;qS�d�d~u:2k5�2�R�~�z+|HE!)�Ǟl��7`��0�<�,�2*���Hl-��x�^����'_TV�gZA�'j� ^�2Ϊ��N7t�����?w�� �x1��f��Iz�C-Ȗ��K�^q�;���-W�DvT�7��8�Z�������� hK�(P:��Q- �8�n�Z���܃e貾�<�1�YT<�,�����"�6{/ �?�͟��|1�:�#g��W�>$����d��J��d�B��=��jf[��%rE^��il:��B���x���Sּ�1հ��,�=��*�7 fcG��#q� �eh?��2�7�����,�!7x��6�n�LC�4x��},Geǝ�tC.��vS �F�43��zz\��;QYC,6����~;RYS/6���|2���5���v��T��i����������mlv��������&� �nRh^ejR�LG�f���? �ۉҬܦƩ��|��Ȱ����>3����!v��i�ʯ�>�v��オ�X3e���_1z�Kȗ\<������!�8���V��]��?b�k41�Re��T�q��mz��TiOʦ�Z��Xq���L������q"+���2ۨ��8}�&N7XU7Ap�d�X��~�׿��&4e�o�F��� �H����O���č�c�� 懴�6���͉��+)��v;j��ݷ�� �UV�� i��� j���Y9GdÒJ1��詞�����V?h��l����l�cGs�ځ�������y�Ac�����\V3�? �� ܙg�>qH�S,�E�W�[�㺨�uch�⍸�O�}���a��>�q�6�n6����N6�q������N ! 1AQaq�0@����"2BRb�#Pr���3C`��Scst���$4D���%Td�� ?���N����a��3��m���C���w��������xA�m�q�m���m������$����4n淿t'��C"w��zU=D�\R+w�p+Y�T�&�պ@��ƃ��3ޯ?�Aﶂ��aŘ���@-�����Q�=���9D��ռ�ѻ@��M�V��P��܅�G5�f�Y<�u=,EC)�<�Fy'�"�&�չ�X~f��l�KԆV��?�� �W�N����=(� �;���{�r����ٌ�Y���h{�١������jW����P���Tc�����X�K�r��}���w�R��%��?���E��m�� �Y�q|����\lEE4���r���}�lsI�Y������f�$�=�d�yO����p�����yBj8jU�o�/�S��?�U��*������ˍ�0������u�q�m [�?f����a�� )Q�>����6#������� ?����0UQ����,IX���(6ڵ[�DI�MNލ�c&���υ�j\��X�R|,4��� j������T�hA�e��^���d���b<����n�� �즇�=!���3�^�`j�h�ȓr��jẕ�c�,ٞX����-����a�ﶔ���#�$��]w�O��Ӫ�1y%��L�Y<�wg#�ǝ�̗`�x�xa�t�w��»1���o7o5��>�m뭛C���Uƃߜ}�C���y1Xνm�F8�jI���]����H���ۺиE@I�i;r�8ӭ����V�F�Շ| ��&?�3|x�B�MuS�Ge�=Ӕ�#BE5G�����Y!z��_e��q�р/W>|-�Ci߇�t�1ޯќd�R3�u��g�=0 5��[?�#͏��q�cf���H��{ ?u�=?�?ǯ���}Z��z���hmΔ�BFTW�����<�q�(v� ��!��z���iW]*�J�V�z��gX֧A�q�&��/w���u�gYӘa���; �i=����g:��?2�dž6�ى�k�4�>�Pxs����}������G�9��3 ���)gG�R<>r h�$��'nc�h�P��Bj��J�ҧH� -��N1���N��?��~��}-q!=��_2hc�M��l�vY%UE�@|�v����M2�.Y[|y�"Eï��K�ZF,�ɯ?,q�?v�M 80jx�"�;�9vk�����+ ֧�� �ȺU��?�%�vcV��mA�6��Qg^M����A}�3�nl� QRN�l8�kkn�'�����(��M�7m9و�q���%ޟ���*h$Zk"��$�9��: �?U8�Sl��,,|ɒ��xH(ѷ����Gn�/Q�4�P��G�%��Ա8�N��!� �&�7�;���eKM7�4��9R/%����l�c>�x;������>��C�:�����t��h?aKX�bhe�ᜋ^�$�Iհ �hr7%F$�E��Fd���t��5���+�(M6�t����Ü�UU|zW�=a�Ts�Tg������dqP�Q����b'�m���1{|Y����X�N��b �P~��F^F:����k6�"�j!�� �I�r�`��1&�-$�Bevk:y���#yw��I0��x��=D�4��tU���P�ZH��ڠ底taP��6����b>�xa����Q�#� WeF��ŮNj�p�J* mQ�N����*I�-*�ȩ�F�g�3 �5��V�ʊ�ɮ�a��5F���O@{���NX��?����H�]3��1�Ri_u��������ѕ�� ����0��� F��~��:60�p�͈�S��qX#a�5>���`�o&+�<2�D����: �������ڝ�$�nP���*)�N�|y�Ej�F�5ټ�e���ihy�Z �>���k�bH�a�v��h�-#���!�Po=@k̆IEN��@��}Ll?j�O������߭�ʞ���Q|A07x���wt!xf���I2?Z��<ץ�T���cU�j��]��陎Ltl �}5�ϓ��$�,��O�mˊ�;�@O��jE��j(�ا,��LX���LO���Ц�90�O �.����a��nA���7������j4 ��W��_ٓ���zW�jcB������y՗+EM�)d���N�g6�y1_x��p�$Lv:��9�"z��p���ʙ$��^��JԼ*�ϭ����o���=x�Lj�6�J��u82�A�H�3$�ٕ@�=Vv�]�'�qEz�;I˼��)��=��ɯ���x �/�W(V���p�����$ �m�������u�����񶤑Oqˎ�T����r��㠚x�sr�GC��byp�G��1ߠ�w e�8�$⿄����/�M{*}��W�]˷.�CK\�ުx���/$�WPw���r� |i���&�}�{�X� �>��$-��l���?-z���g����lΆ���(F���h�vS*���b���߲ڡn,|)mrH[���a�3�ר�[1��3o_�U�3�TC�$��(�=�)0�kgP���� ��u�^=��4 �WYCҸ:��vQ�ר�X�à��tk�m,�t*��^�,�}D*� �"(�I��9R����>`�`��[~Q]�#af��i6l��8���6�:,s�s�N6�j"�A4���IuQ��6E,�GnH��zS�HO�uk�5$�I�4��ؤ�Q9�@��C����wp�BGv[]�u�Ov���0I4���\��y�����Q�Ѹ��~>Z��8�T��a��q�ޣ;z��a���/��S��I:�ܫ_�|������>=Z����8:�S��U�I�J��"IY���8%b8���H��:�QO�6�;7�I�S��J��ҌAά3��>c���E+&jf$eC+�z�;��V����� �r���ʺ������my�e���aQ�f&��6�ND��.:��NT�vm�<- u���ǝ\MvZY�N�NT��-A�>jr!S��n�O 1�3�Ns�%�3D@���`������ܟ 1�^c<���� �a�ɽ�̲�Xë#�w�|y�cW�=�9I*H8�p�^(4���՗�k��arOcW�tO�\�ƍR��8����'�K���I�Q�����?5�>[�}��yU�ײ -h��=��% q�ThG�2�)���"ו3]�!kB��*p�FDl�A���,�eEi�H�f�Ps�����5�H:�Փ~�H�0Dت�D�I����h�F3�������c��2���E��9�H��5�zԑ�ʚ�i�X�=:m�xg�hd(�v����׊�9iS��O��d@0ڽ���:�p�5�h-��t�&���X�q�ӕ,��ie�|���7A�2���O%P��E��htj��Y1��w�Ѓ!����  ���� ࢽ��My�7�\�a�@�ţ�J �4�Ȼ�F�@o�̒?4�wx��)��]�P��~�����u�����5�����7X ��9��^ܩ�U;Iꭆ 5 �������eK2�7(�{|��Y׎ �V��\"���Z�1� Z�����}��(�Ǝ"�1S���_�vE30>���p;� ΝD��%x�W�?W?v����o�^V�i�d��r[��/&>�~`�9Wh��y�;���R��� ;;ɮT��?����r$�g1�K����A��C��c��K��l:�'��3 c�ﳯ*"t8�~l��)���m��+U,z��`(�>yJ�?����h>��]��v��ЍG*�{`��;y]��I�T� ;c��NU�fo¾h���/$���|NS���1�S�"�H��V���T���4��uhǜ�]�v;���5�͠x��'C\�SBpl���h}�N����� A�Bx���%��ޭ�l��/����T��w�ʽ]D�=����K���ž�r㻠l4�S�O?=�k �M:� ��c�C�a�#ha���)�ѐxc�s���gP�iG��{+���x���Q���I= �� z��ԫ+ �8"�k�ñ�j=|����c ��y��CF��/��*9ж�h{ �?4�o� ��k�m�Q�N�x��;�Y��4膚�a�w?�6�>e]�����Q�r�:����g�,i"�����ԩA�*M�<�G��b�if��l^M��5� �Ҩ�{����6J��ZJ�����P�*�����Y���ݛu�_4�9�I8�7���������,^ToR���m4�H��?�N�S�ѕw��/S��甍�@�9H�S�T��t�ƻ���ʒU��*{Xs�@����f�����֒Li�K{H�w^���������Ϥm�tq���s� ���ք��f:��o~s��g�r��ט� �S�ѱC�e]�x���a��) ���(b-$(�j>�7q�B?ӕ�F��hV25r[7 Y� }L�R��}����*sg+��x�r�2�U=�*'WS��ZDW]�WǞ�<��叓���{�$�9Ou4��y�90-�1�'*D`�c�^o?(�9��u���ݐ��'PI&� f�Jݮ�������:wS����jfP1F:X �H�9dԯ���˝[�_54 �}*;@�ܨ�� ð�yn�T���?�ןd�#���4rG�ͨ��H�1�|-#���Mr�S3��G�3�����)�.᧏3v�z֑��r����$G"�`j �1t��x0<Ɔ�Wh6�y�6��,œ�Ga��gA����y��b��)��h�D��ß�_�m��ü �gG;��e�v��ݝ�nQ� ��C����-�*��o���y�a��M��I�>�<���]obD��"�:���G�A��-\%LT�8���c�)��+y76���o�Q�#*{�(F�⽕�y����=���rW�\p���۩�c���A���^e6��K������ʐ�cVf5$�'->���ՉN"���F�"�UQ@�f��Gb~��#�&�M=��8�ט�JNu9��D��[̤�s�o�~������ G��9T�tW^g5y$b��Y'��س�Ǵ�=��U-2 #�MC�t(�i� �lj�@Q 5�̣i�*�O����s�x�K�f��}\��M{E�V�{�υ��Ƈ�����);�H����I��fe�Lȣr�2��>��W�I�Ȃ6������i��k�� �5�YOxȺ����>��Y�f5'��|��H+��98pj�n�.O�y�������jY��~��i�w'������l�;�s�2��Y��:'lg�ꥴ)o#'Sa�a�K��Z� �m��}�`169�n���"���x��I ��*+� }F<��cГ���F�P�������ֹ*�PqX�x۩��,� ��N�� �4<-����%����:��7����W���u�`����� $�?�I��&����o��o��`v�>��P��"��l���4��5'�Z�gE���8���?��[�X�7(��.Q�-��*���ތL@̲����v��.5���[��=�t\+�CNܛ��,g�SQnH����}*F�G16���&:�t��4ُ"A��̣��$�b �|����#rs��a�����T�� ]�<�j��BS�('$�ɻ� �wP;�/�n��?�ݜ��x�F��yUn�~mL*-�������Xf�wd^�a�}��f�,=t�׵i�.2/wpN�Ep8�OР���•��R�FJ� 55TZ��T �ɭ�<��]��/�0�r�@�f��V��V����Nz�G��^���7hZi����k��3�,kN�e|�vg�1{9]_i��X5y7� 8e]�U����'�-2,���e"����]ot�I��Y_��n�(JҼ��1�O ]bXc���Nu�No��pS���Q_���_�?i�~�x h5d'�(qw52] ��'ޤ�q��o1�R!���`ywy�A4u���h<קy���\[~�4�\ X�Wt/� 6�����n�F�a8��f���z �3$�t(���q��q�x��^�XWeN'p<-v�!�{�(>ӽDP7��ո0�y)�e$ٕv�Ih'Q�EA�m*�H��RI��=:��� ���4牢) �%_iN�ݧ�l]� �Nt���G��H�L��� ɱ�g<���1V�,�J~�ٹ�"K��Q�� 9�HS�9�?@��k����r�;we݁�]I�!{ �@�G�[�"��`���J:�n]�{�cA�E����V��ʆ���#��U9�6����j�#Y�m\��q�e4h�B�7��C�������d<�?J����1g:ٳ���=Y���D�p�ц� ׈ǔ��1�]26؜oS�'��9�V�FVu�P�h�9�xc�oq�X��p�o�5��Ա5$�9W�V(�[Ak�aY錎qf;�'�[�|���b�6�Ck��)��#a#a˙��8���=äh�4��2��C��4tm^ �n'c���]GQ$[Wҿ��i���vN�{Fu ��1�gx��1┷���N�m��{j-,��x�� Ūm�ЧS�[�s���Gna���䑴�� x�p 8<������97�Q���ϴ�v�aϚG��Rt�Һ׈�f^\r��WH�JU�7Z���y)�vg=����n��4�_)y��D'y�6�]�c�5̪�\� �PF�k����&�c;��cq�$~T�7j ���nç]�<�g ":�to�t}�159�<�/�8������m�b�K#g'I'.W�����6��I/��>v��\�MN��g���m�A�yQL�4u�Lj�j9��#44�t��l^�}L����n��R��!��t��±]��r��h6ٍ>�yҏ�N��fU�� ���� Fm@�8}�/u��jb9������he:A�y�ծw��GpΧh�5����l}�3p468��)U��d��c����;Us/�֔�YX�1�O2��uq�s��`hwg�r~�{ R��mhN��؎*q 42�*th��>�#���E����#��Hv�O����q�}�����6�e��\�,Wk�#���X��b>��p}�դ��3���T5��†��6��[��@�P�y*n��|'f�֧>�lư΂�̺����SU�'*�q�p�_S�����M�� '��c�6�����m�� ySʨ;M��r���Ƌ�m�Kxo,���Gm�P��A�G�:��i��w�9�}M(�^�V��$ǒ�ѽ�9���|���� �a����J�SQ�a���r�B;����}���ٻ֢�2�%U���c�#�g���N�a�ݕ�'�v�[�OY'��3L�3�;,p�]@�S��{ls��X�'���c�jw�k'a�.��}�}&�� �dP�*�bK=ɍ!����;3n�gΊU�ߴmt�'*{,=SzfD� A��ko~�G�aoq�_mi}#�m�������P�Xhύ����mxǍ�΂���巿zf��Q���c���|kc�����?���W��Y�$���_Lv����l߶��c���`?����l�j�ݲˏ!V��6����U�Ђ(A���4y)H���p�Z_�x��>���e��R��$�/�`^'3qˏ�-&Q�=?��CFVR �D�fV�9��{�8g�������n�h�(P"��6�[�D���< E�����~0<@�`�G�6����Hг�cc�� �c�K.5��D��d�B���`?�XQ��2��ٿyqo&+�1^� DW�0�ꊩ���G�#��Q�nL3��c���������/��x ��1�1[y�x�პCW��C�c�UĨ80�m�e�4.{�m��u���I=��f�����0QRls9���f���������9���~f�����Ǩ��a�"@�8���ȁ�Q����#c�ic������G��$���G���r/$W�(��W���V�"��m�7�[m�A�m����bo��D� j����۳� l���^�k�h׽����� ��#� iXn�v��eT�k�a�^Y�4�BN��ĕ��0 !01@Q"2AaPq3BR������?���@4�Q�����T3,���㺠�W�[=JK�Ϟ���2�r^7��vc�:�9 �E�ߴ�w�S#d���Ix��u��:��Hp��9E!�� V 2;73|F��9Y���*ʬ�F��D����u&���y؟��^EA��A��(ɩ���^��GV:ݜDy�`��Jr29ܾ�㝉��[���E;Fzx��YG��U�e�Y�C���� ����v-tx����I�sם�Ę�q��Eb�+P\ :>�i�C'�;�����k|z�رn�y]�#ǿb��Q��������w�����(�r|ӹs��[�D��2v-%��@;�8<a���[\o[ϧw��I!��*0�krs)�[�J9^��ʜ��p1)� "��/_>��o��<1����A�E�y^�C��`�x1'ܣn�p��s`l���fQ��):�l����b>�Me�jH^?�kl3(�z:���1ŠK&?Q�~�{�ٺ�h�y���/�[��V�|6��}�KbX����mn[-��7�5q�94�������dm���c^���h� X��5��<�eޘ>G���-�}�دB�ޟ� ��|�rt�M��V+�]�c?�-#ڛ��^ǂ}���Lkr���O��u�>�-D�ry� D?:ޞ�U��ǜ�7�V��?瓮�"�#���r��չģVR;�n���/_� ؉v�ݶe5d�b9��/O��009�G���5n�W����JpA�*�r9�>�1��.[t���s�F���nQ� V 77R�]�ɫ8����_0<՜�IF�u(v��4��F�k�3��E)��N:��yڮe��P�`�1}�$WS��J�SQ�N�j�ٺ��޵�#l���ј(�5=��5�lǏmoW�v-�1����v,W�mn��߀$x�<����v�j(����c]��@#��1������Ǔ���o'��u+����;G�#�޸��v-lη��/(`i⣍Pm^���ԯ̾9Z��F��������n��1��� ��]�[��)�'������:�֪�W��FC����� �B9،!?���]��V��A�Վ�M��b�w��G F>_DȬ0¤�#�QR�[V��kz���m�w�"��9ZG�7'[��=�Q����j8R?�zf�\a�=��O�U����*oB�A�|G���2�54 �p��.w7� �� ��&������ξxGHp� B%��$g�����t�Џ򤵍z���HN�u�Я�-�'4��0��;_��3 !01"@AQa2Pq#3BR������?��ʩca��en��^��8���<�u#��m*08r��y�N"�<�Ѳ0��@\�p��� �����Kv�D��J8�Fҽ� �f�Y��-m�ybX�NP����}�!*8t(�OqѢ��Q�wW�K��ZD��Δ^e��!� ��B�K��p~�����e*l}z#9ң�k���q#�Ft�o��S�R����-�w�!�S���Ӥß|M�l޶V��!eˈ�8Y���c�ЮM2��tk���� ������J�fS����Ö*i/2�����n]�k�\���|4yX�8��U�P.���Ы[���l��@"�t�<������5�lF���vU�����W��W��;�b�cД^6[#7@vU�xgZv��F�6��Q,K�v��� �+Ъ��n��Ǣ��Ft���8��0��c�@�!�Zq s�v�t�;#](B��-�nῃ~���3g������5�J�%���O������n�kB�ĺ�.r��+���#�N$?�q�/�s�6��p��a����a��J/��M�8��6�ܰ"�*������ɗud"\w���aT(����[��F��U՛����RT�b���n�*��6���O��SJ�.�ij<�v�MT��R\c��5l�sZB>F��<7�;EA��{��E���Ö��1U/�#��d1�a�n.1ě����0�ʾR�h��|�R��Ao�3�m3 ��%�� ���28Q� ��y��φ���H�To�7�lW>����#i`�q���c����a��� �m,B�-j����݋�'mR1Ήt�>��V��p���s�0IbI�C.���1R�ea�����]H�6����������4B>��o��](��$B���m�����a�!=��?�B� K�Ǿ+�Ծ"�n���K��*��+��[T#�{E�J�S����Q�����s�5�:�U�\wĐ�f�3����܆&�)����I���Ԇw��E T�lrTf6Q|R�h:��[K�� �z��c֧�G�C��%\��_�a�84��HcO�bi��ؖV��7H �)*ģK~Xhչ0��4?�0��� �E<���}3���#���u�?�� ��|g�S�6ꊤ�|�I#Hڛ� �ա��w�X��9��7���Ŀ%�SL��y6č��|�F�a 8���b��$�sק�h���b9RAu7�˨p�Č�_\*w��묦��F ����4D~�f����|(�"m���NK��i�S�>�$d7SlA��/�²����SL��|6N�}���S�˯���g��]6��; �#�.��<���q'Q�1|KQ$�����񛩶"�$r�b:���N8�w@��8$�� �AjfG|~�9F ���Y��ʺ��Bwؒ������M:I岎�G��`s�YV5����6��A �b:�W���G�q%l�����F��H���7�������Fsv7��k�� 403WebShell
403Webshell
Server IP : 104.21.45.146  /  Your IP : 172.69.130.93
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux ip-172-31-19-221 6.8.0-1029-aws #31~22.04.1-Ubuntu SMP Thu Apr 24 21:16:18 UTC 2025 x86_64
User : www-data ( 33)
PHP Version : 8.1.28
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /lib/python3/dist-packages/docutils/utils/math/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /lib/python3/dist-packages/docutils/utils/math/__pycache__/math2html.cpython-310.pyc
o

n��_{��@s�
ddlZddlZddlZddlZddlZddlZddlZejdkr(ddl	m
Z
nddlm
Z
ejdkr:eZ
eZejZGdd�de�ZGdd�de�ZGdd	�d	e�ZGd
d�de�ZGdd
�d
e�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGd d!�d!e�Z Gd"d#�d#e�Z!Gd$d%�d%e�Z"Gd&d'�d'e�Z#Gd(d)�d)e�Z$Gd*d+�d+e�Z%Gd,d-�d-e�Z&Gd.d/�d/e�Z'Gd0d1�d1e'�Z(Gd2d3�d3e'�Z)Gd4d5�d5e'�Z*Gd6d7�d7e*�Z+Gd8d9�d9e'�Z,Gd:d;�d;e'�Z-Gd<d=�d=e+�Z.Gd>d?�d?e�Z/Gd@dA�dAe/�Z0GdBdC�dCe/�Z1GdDdE�dEe/�Z2GdFdG�dGe2�Z3GdHdI�dIe2�Z4GdJdK�dKe/�Z5GdLdM�dMe�Z6GdNdO�dOe�Z7GdPdQ�dQe�Z8GdRdS�dSe�Z9GdTdU�dUe�Z:GdVdW�dWe8�Z;GdXdY�dYe;�Z<GdZd[�d[e;�Z=Gd\d]�d]e�Z>Gd^d_�d_e>�Z?Gd`da�dae?�Z@Gdbdc�dce>�ZAGddde�deeA�ZBGdfdg�dge>�ZCGdhdi�die�ZDGdjdk�dke'�ZEGdldm�dmeE�ZFGdndo�doe>�ZGGdpdq�dqeG�ZHGdrds�dseB�ZIGdtdu�dueG�ZJGdvdw�dweG�ZKGdxdy�dyeG�ZLGdzd{�d{eG�ZMGd|d}�d}eG�ZNGd~d�deG�ZOGd�d��d�eO�ZPGd�d��d�e�ZQGd�d��d�e�ZRGd�d��d�e>�ZSGd�d��d�eG�ZTGd�d��d�e�ZUGd�d��d�e�ZVeV�eV_WGd�d��d�e�ZXGd�d��d�eX�ZYGd�d��d�e�ZZGd�d��d�eZ�Z[e[�eZ_\eZ�eZ_]Gd�d��d�e�Z^Gd�d��d�e>�Z_Gd�d��d�e>�Z`Gd�d��d�eC�ZaGd�d��d�eC�ZbGd�d��d�eC�ZcGd�d��d�eC�ZdGd�d��d�eC�ZeGd�d��d�eC�ZfGd�d��d�eC�ZgGd�d��d�eC�ZhGd�d��d�eC�ZiGd�d��d�eC�ZjGd�d��d�e?�ZkGd�d��d�e>�ZlGd�d��d�e>�ZmGd�d��d�e>�ZnGd�d��d�e>�ZoGd�d��d�eo�ZpGd�d��d�e>�ZqGd�d��d�eC�ZrGd�d��d�e?�ZsGd�dÄd�e>�ZtGd�dńd�et�ZuGd�dDŽd�eu�ZvGd�dɄd�e/�ZwGd�d˄d�e�ZxGd�d̈́d�e�ZyGd�dτd�et�ZzGd�dфd�et�Z{Gd�dӄd�eG�Z|Gd�dՄd�e|�Z}Gd�dׄd�e}�Z~Gd�dلd�e}�ZGd�dۄd�e~�Z�Gd�d݄d�e}�Z�Gd�d߄d�e}�Z�Gd�d�d�e}�Z�Gd�d�d�e}�Z�Gd�d�d�e��Z�eUj�e|e�g7_�e�e~e�e�e�e�ege|_�Gd�d�d�e�Z�Gd�d�d�e��Z�Gd�d�d�e}�Z�Gd�d�d�e|�Z�Gd�d�d�e|�Z�Gd�d�d�e}�Z�Gd�d�d�e��Z�Gd�d��d�e��Z�Gd�d��d�e��Z�Gd�d��d�e��Z�Gd�d��d�e}�Z�e|j�e�g7_�Gd�d��d�e��Z�Gd�d��d�e��Z�G�d�d��de~�Z�G�d�d��de��Z�G�d�d��deQ�Z�G�d�d��de��Z�G�d�d	��d	eQ�Z�G�d
�d��de~�Z�e|j�e�e�e�e�g7_�eRj�e��e��g7_�G�d�d
��d
e�Z�G�d�d��de}�Z�G�d�d��de��Z�G�d�d��de�Z�e|j�e�g7_�G�d�d��de'�Z�G�d�d��de'�Z�G�d�d��de�Z�G�d�d��de}�Z�G�d�d��deG�Z�G�d�d��de}�Z�G�d �d!��d!eS�Z�eUj�e�g7_�e|j�e�g7_��d"�d#�Z��d$�d%�Z�e��d&k�rQe��dSdS('�N��r)�
quote_plusc@speZdZdZdZdZdZdZdd�Zdd�Z	dd	�Z
d
d�Zdd
�Ze
e�Ze
e	�Z	e
e
�Z
e
e�Ze
e�ZdS)�TracezA tracing classFNcCs"tjrtjrdSt�|tj�dS)zShow a debug messageN)r�	debugmode�	quietmode�show�sys�stdout��cls�message�r�?/usr/lib/python3/dist-packages/docutils/utils/math/math2html.py�debug4szTrace.debugcCs2tjrdStjrtjrtj|}t�|tj�dS)zShow a trace messageN)rr�prefix�
showlinesmoderr	r
rrrrr
:s

z
Trace.messagecCs0d|}tjrtjrtj|}t�|tj�dS)zShow an error messagez* N)rrrrr	�stderrrrrr�errorBs
zTrace.errorcCst�d|�td�dS)z#Show an error message and terminatezFATAL: ���N)rr�exitrrrr�fatalIszTrace.fatalcCs&tjdkr
|�d�}|�|d�dS)zShow a message out of a channelr�utf-8�
N)r	�version_info�encode�write)rr
�channelrrrrNs

z
Trace.show)�__name__�
__module__�__qualname__�__doc__rrrrrr
rrr�classmethodrrrrr+s rc@s�eZdZdZdddd�Zdddd�Zd	d
dd
d�Zid
d�dd�dd�dd�dd�dd�dd�dd�dd�dd�dd�dd�dd �d!d"�d#d$�d%d�Zd&d'd'd(�Zd)d*d$d+d�Z	d,d-d.d/d$d0d1�Z
d2d3d$d4d�Zd5S)6�BibStylesConfig�+Configuration class from elyxer.config filezy$authors. $title. <i>$journal</i>,{ {$volume:}$pages,} $month $year.{ doi: $doi.}{ URL <a href="$url">$url</a>.}{ $note.}z$surname($year)zS$authors. <i>$title</i>. $publisher, $year.{ URL <a href="$url">$url</a>.}{ $note.})�@article�cite�defaultz�$authors. $title.{ <i>$journal</i>{, {$volume}{($number)}}{: $pages}{, $year}.}{ <a href="$url">$url</a>.}{ <a href="$filename">$filename</a>.}{ $note.}z$Sur$YYzt$authors. $title.{ <i>$journal</i>,} $year.{ <a href="$url">$url</a>.}{ <a href="$filename">$filename</a>.}{ $note.}zr$authors. $year. $title. <i>$journal</i>, <b>$volume</b>($number), $pages.{ URL <a href="$url">$url</a>.}{ $note.}zS$authors. $year. <i>$title</i>. $publisher.{ URL <a href="$url">$url</a>.}{ $note.}z$surname, $year)r%�@bookr&r'r%ue$authors: “$title”, <i>$journal</i>,{ pp. $pages,} $year.{ URL <a href="$url">$url</a>.}{ $note.}r(zj{$authors: }<i>$title</i>{ ($editor, ed.)}.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}z@bookletzW$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}z@conferencez@inbook�
@incollectionz$authors: <i>$title</i>{ in <i>$booktitle</i>{ ($editor, ed.)}}.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}�@inproceedingsug$authors: “$title”, <i>$booktitle</i>,{ pp. $pages,} $year.{ URL <a href="$url">$url</a>.}{ $note.}z@manualz@mastersthesisz@misczh$authors: <i>$title</i>.{{ $publisher,}{ $howpublished,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}z
@phdthesisz@proceedingsz@techreportzG$authors: <i>$title</i>, $year.{ URL <a href="$url">$url</a>.}{ $note.}z@unpublisheduW$authors: “$title”, <i>$journal</i>, $year.{ URL <a href="$url">$url</a>.}{ $note.}r&z$indexr'z??�)�YY�authors�surnameu~$authors, “$title”, <i>$journal</i>, vol. $volume, no. $number, pp. $pages, $year.{ URL <a href="$url">$url</a>.}{ $note.}zS$authors, <i>$title</i>. $publisher, $year.{ URL <a href="$url">$url</a>.}{ $note.}uF$authors, “$title”. $year.{ URL <a href="$url">$url</a>.}{ $note.}zv$authors. $title.{ <i>$journal</i>{, {$volume}{($number)}}{:$pages}{, $year}.}{ URL <a href="$url">$url</a>.}{ $note.}z\$authors. <i>$title</i>. $publisher,{ $month} $year.{ URL <a href="$url">$url</a>.}{ $note.}z~$authors. $title.{ In <i>$booktitle</i> {($editor, ed.)}.} $publisher,{ $month} $year.{ URL <a href="$url">$url</a>.}{ $note.}zy$authors. $title. { <i>$booktitle</i>{, {$volume}{($number)}}{:$pages}{, $year}.}{ URL <a href="$url">$url</a>.}{ $note.}zR{$authors. }$title.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.})r%r(r)r*r&r'zy$authors. $title. <i>$journal</i>, $year{;{<b>$volume</b>}{($number)}{:$pages}}.{ URL: <a href="$url">$url</a>.}{ $note.}zO$authors. $title. {$publisher, }$year.{ URL: <a href="$url">$url</a>.}{ $note.}z`$authors. $title; {$publisher, }$year.{ $howpublished.}{ URL: <a href="$url">$url</a>.}{ $note.}N)rrr r!�abbrvnat�alpha�authordate2r'�defaulttags�ieeetr�plain�	vancouverrrrrr#[s������������	�
���
�������

�r#c@seZdZdZddd�ZdS)�BibTeXConfigr$�—�.)�--z..N)rrr r!�replacedrrrrr6�s
�r6c
@s�eZdZdZidd�dd�dd�dd	�d
d�dd�d
d�dd�dd�dd�dd�dd�dd�dd�dd�dd�d d!�d"d#d$��Zgd%�d&ggd'�d(�Zd)ddd*�Zid&d+�d,d-�d.d-�d/d�d0d1�d2d�d3d�dd�d4d-�d5d-�d6d-�d7d8�d9d-�d:d�d;d<�d=d>�d?d@�idAdB�dCdD�dEdF�dGdH�dIdJ�dKdL�dMdN�dOdP�dQdR�dSdT�dUdV�dWdX�dYdZ�d[d\�d]d^�d_d`�dadb��idcdb�ddde�dfdg�dhdi�djdk�dldm�dndo�dpdq�drds�dtdu�dvdD�dwdF�dxdH�dydH�dzdH�d{dH�d|dJ��id}ds�d~dP�ddV�d�dX�d�dN�d�dT�d�dX�d�dZ�d�dJ�d�dX�d�db�d�d��d�d��d�d��d�d<�d�d��d�d���id�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d�d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d���id�d��d�d��d�d��d�d��d�d
�d�d�dd-�dd
�d�d-�d�d-�d�d-�d�d-�d�d�d�d�d�d�d"dēd�d-��id�d-�dd�d�d-�d�dɓd�d˓d�d͓d�dϓd�dѓd�dӓd�d-�d�d-�d�d-�d�dؓd�d-�d�d�d�d-�d�d-��dd-d-dd-d�d-d dޜ�Zd�d�iZd�d�d�giZ	d�S)��ContainerConfigr$�Alignz\end_layout�
BarredText�\bar�BoldTextz\series�Cellz</cell�
ChangeDeletedz\change_unchanged�ChangeInserted�	ColorText�\color�EmphaticTextz\emph�Hfill�\hfill�Insetz
\end_inset�Layout�	LyXFooterz
\end_document�	LyXHeaderz\end_header�Rowz</row�
ShapedText�\shape�SizeText�\size�	StrikeOutz
\strikeoutz\familyz\noun)�
TextFamily�VersalitasText)�StringContainer�Constant�FormulaConstantr+)�PlainLayout�
TaggedTextr<�CaptionrRrErSr=rOrC�LangLine�Formula�Bracket�RawText�BibTag�
FormulaNumber�AlphaCommand�EmptyCommand�OneParamFunction�SymbolFunction�TextFunction�FontFunction�CombiningFunction�DecoratingFunction�
FormulaSymbol�BracketCommand�TeXCode��allowed�cloned�	extractedz\end_deeper)�
\begin_deeperz\begin_inset�
\begin_layoutrTz#LyX�BlackBoxz</lyxtabularz<cellz<column�Columnz<rowz\alignz\bar defaultz\bar noz\begin_bodyro�
DeeperListz\begin_documentz
\begin_headerz\begin_inset Argument�
ShortTitlez\begin_inset Box�BoxInsetz\begin_inset Branch�Branchz\begin_inset CaptionrYz!\begin_inset CommandInset bibitem�BiblioEntryz \begin_inset CommandInset bibtex�BibTeXz"\begin_inset CommandInset citation�BiblioCitationz\begin_inset CommandInset href�URLz!\begin_inset CommandInset include�IncludeInsetz%\begin_inset CommandInset index_print�
PrintIndexz\begin_inset CommandInset label�Labelz\begin_inset CommandInset line�	LineInsetz'\begin_inset CommandInset nomencl_print�PrintNomenclaturez&\begin_inset CommandInset nomenclature�NomenclatureEntryz\begin_inset CommandInset ref�	Referencez\begin_inset CommandInset toc�TableOfContentsz\begin_inset ERT�ERTz\begin_inset Flex�	FlexInsetz\begin_inset Flex Chunkref�NewfangledChunkRefz\begin_inset Flex Marginnote�SideNotez\begin_inset Flex Sidenotez\begin_inset Flex URL�FlexURLz\begin_inset Float�Floatz\begin_inset FloatList�ListOfz\begin_inset Foot�Footnotez\begin_inset Formular[z\begin_inset FormulaMacro�FormulaMacroz\begin_inset Graphics�Imagez\begin_inset Index�IndexReferencez\begin_inset Info�	InfoInsetz!\begin_inset LatexCommand bibitemz \begin_inset LatexCommand bibtexz\begin_inset LatexCommand citez!\begin_inset LatexCommand citealtz\begin_inset LatexCommand citepz\begin_inset LatexCommand citetz!\begin_inset LatexCommand htmlurlz\begin_inset LatexCommand indexz\begin_inset LatexCommand labelz&\begin_inset LatexCommand nomenclaturez#\begin_inset LatexCommand prettyrefz$\begin_inset LatexCommand printindexz+\begin_inset LatexCommand printnomenclaturez\begin_inset LatexCommand refz)\begin_inset LatexCommand tableofcontentsz\begin_inset LatexCommand urlz\begin_inset LatexCommand vrefz\begin_inset Marginalz\begin_inset Newline�NewlineInsetz\begin_inset Newpage�NewPageInsetz\begin_inset Note�Notez\begin_inset OptArgz\begin_inset Phantom�PhantomTextz\begin_inset Quotes�QuoteContainerz\begin_inset Tabular�Tablez\begin_inset Text�	InsetTextz\begin_inset VSpace�
VerticalSpacez\begin_inset Wrap�Wrapz\begin_inset listings�Listingz\begin_inset script�ScriptInsetz\begin_inset space�Spacerpz\begin_layout Abstract�Abstractz\begin_layout Author�Authorz\begin_layout Bibliography�Bibliographyz\begin_layout Chunk�NewfangledChunkz\begin_layout Description�Descriptionz\begin_layout Enumerate�ListItemz\begin_layout Itemizez\begin_layout List�Listz\begin_layout LyX-Code�LyXCodez\begin_layout PlainrWz\begin_layout Standard�StandardLayoutz\begin_layout Title�Title�\begin_preamble�LyXPreamblez\change_deletedz\change_insertedz\color inheritz\color nonez
\emph defaultz	\emph offz\emph onz\emph togglez	\end_bodyrRz\family defaultz
\family romanz\labelwidthstring�\langrZz\length�InsetLengthz
\lyxformat�	LyXFormatz\lyxline�LyXLine�\newline�Newlinez\newpage�NewPage�	\noindentz
\noun defaultz	\noun offz\noun onrSz\paragraph_spacingz\series boldz\series defaultz\series medium�
StartAppendix)rNz\shape defaultz	\shape uprPz\size normalz\start_of_appendixz\strikeout defaultz
\strikeout on�startcommand�\�headersz<lyxtabularz	<featuresN)
rrr r!�endings�extracttext�startendings�starts�string�tablerrrrr;�sL�����������������	�
�������������������	�
���
���������������������� �!�"�#�$�%�&�'�(�)�*�+�,�-�.�/�0�1�2�3�4�4�5�6�7�8�8�9�9�:�;�;�<�<�=�>�?�@�A�B�B�C�D�E�F�F�G�H�I�I�J�J�K�K�L�L�M�M�N�N�O�O�P�P�Q�Q�R�R�S�S�T�T�U�U�V�V�W�^��r;c@sdeZdZdZdddddd�Zddddd	d
ddd
ddd�Zdddd�ZddiZdddd�ZddiZ	dS)�EscapeConfigr$r+u — �’�‘)rz -- z --- �'�`� � r8�…u ▷ �-�/r�)z\InsetSpace \space{}z\InsetSpace \thinspace{}z
\InsetSpace ~z\SpecialChar \-z\SpecialChar \@.z\SpecialChar \ldots{}z\SpecialChar \menuseparatorz\SpecialChar \nobreakdash-z\SpecialChar \slash{}z \SpecialChar \textcompwordmark{}�
\backslashz&amp;z&lt;�&gt;)�&�<�>�/>r�z&nbsp;z&emsp;z&#8197;)r�� � r�� N)
rrr r!�chars�commands�entities�html�	iso885915�
nonunicoderrrrr�%s&
��
����r�c@s�&eZdZdZidd�dd�dd�dd	�d
d�dd
�dd�dd�dd�dd�dd�dd�dd�dd�dd�d d!�d"d#�id$d%�d&d'�d(d)�d*d+�d,d-�d.d'�d/d0�d1d2�d3d2�d4d5�d6d7�d8d7�d9d:�d;d<�d=d>�d?d@�dAdB��idCdD�dEdF�dGdH�dIdJ�dKdL�dMdN�dOdP�dQdR�dSdT�dUdV�dWdX�dYdZ�d[d\�d]d^�d_d`�dadb�dcdd��idedf�dgdh�didj�dkdl�dmdn�dodp�dqdr�dsdt�dudv�dwdx�dydz�d{d|�d}d~�dd��d�d��d�dL�d�d���d�d�d�d�d�d���Zd�d�d�d�d��Zgd��gd��gd��gd��gd��d�ggd��d�gd��Zd�d�gd�d�gd��Zd�d�d�d�d�d��Zid�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d�d�d�d�d�d�d�dŜ�Z	id�dǓd�dɓd�d˓d�d͓d�dϓd�d��d�dғd�dԓd�d֓d�dؓd�dړd�dܓd�dޓd�d�d�d�d�d�d�d�id�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d��d�d��d�d��d�d��d�d��d��d��d�d��d�d��d�d��d�d��i�d	�d
��d�d��d
�d��d�d��d�d��d�d��d�d��ddj��d�d��d�d��d�d��d�d��d �d!��d"dl��d#�d$��d%�d&��d'�d(��i�d)�d*��d+�d,��d-�d.��d/�d0��d1�d2��d3�d4��d5�d6��d7dn��d8�d9��d:dp��d;dr��d<�d=��d>dt��d?�d@��dA�dB��dC�dD��dE�dF��i�dG�dH��dI�dJ��dK�dL��dM�dN��dO�dP��dQ�dR��dSdv��dT�dU��dV�dW��dX�dY��dZ�d[��d\dx��d]�d^��d_�d`��dadz��db�dc��ddd���i�de�df��dg�dh��did|��dj�dk�d��dl��dm�dn��do�dp��dq�dr��ds�dt��du�dv��dw�dx��dy�dz��d{�d|��d}�d~��d�d���d��d���d��d���i�d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d�d���d��d���d��d���d��d���d��d���i�d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���ddB��dÐdē�dŐdƓ�i�dǐdȓ�dɐdʓ�dːd̓�d͐dΓ�dϐdГ�dѐdғ�dӐdԓ�dՐd֓�dאdؓ�dِdړ�dېdܓ�dݐdޓ�dߐd��d�d��d�d��d�d���d�d��i�d�d��d�d��d�d��d�d��d�d��d�d��d�d���d��d���d��d���d��d���d��d���d��d���d�d��d�d��d�d��d�d��d�d	��i�d
�d��d�d
��d�d��d�d��d�d��d�d��d�dr��d�d��d�d��d�d��d�d��d�d ��d!�d"��d#�d���d$�d%��d&�d'��d(�d)��i�d*�d+��d,�d-��d.�d-��d/�d0��d1�d2��d3�d4��d5�d6��d7�d6��d8�d9��d:�d;��d<�d=��d>�d?��d@�dA��dB�dC��dD�d��dE�dF��dG�dH��i�dI�dJ��dK�dL��dM�dN��dO�dP��dQ�dR��dS�dT��dU�dV��dW�dX��dY�dZ��d[�d\��d]�d^��d_�d`��da�db��dc�dd��de�df��dg�dh��di�dj��i�dk�dl��dm�dn��do�dp��dq�d��dr�ds��dt�du��dv�dw��dx�dy��dz�d{��d|�d}��d~�d��d��d���d��d���d��d���d��d���d��d���d��d���i�d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���i�d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d��d3d2��d��d���d��d���d��d���ddÓ�dĐdœ�dƐdǓd8d7��dȐdɓ�i�dʐd˓�d̐d���d͐dΓ�dϐdГ�dѐdғ�dӐdԓ�dՐd֓�dאd֓�dؐdٓ�dڐdۓ�dܐdV��dݐdޓ�dߐd���d�d��d�d��d�d��d�d��i�d�d��d�d��d�d��d�d��d�d��d�d��d�d���d��d���d��d���d��d���d��d���d��d���d��d��d�d��d�d��d�d��d�d��i�d	�d
��d�d��d
�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d ��d!�d"��d#�d$��d%�d&��d'�d(��d)�d*��i�d+�d,��d-�d.��d/�d0��d1�d2��d3�d4��d5�d6��d7�d���d8�d9��d:�d;��d<�d=��d>dɓ�d?�d@��dA�dB��dC�dD��dE�dF��dG�dH��dI�dJ��i�dK�dL��dM�dN��dO�dP��dQ�dR��dS�dT��dU�dV��dW�dX��dY�dZ��d[�d\��d]�d^��d_�d`��da�db��dc�dd��de�df��dg�dh��di�dj��dk�dl��i�dm�dn��do�dp��dq�d&��dr�d&��ds�dt��du�dv��dw�dl��dx�dy��dz�d{��d|�d}��d~�d��d��d���d��d���d��d���d��d���d��d���d��d���i�d��d���d��d���d�dɓ�d�dɓ�d��d&��d��d���d��d���d��d}��d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���i�d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���dd���dÐd��dĐdœ�dƐdǓ�i�dȐdɓ�dʐd˓�d̐d͓�dΐdϓ�dАd���dѐdғ�dӐd���dԐd���d�d���d֐dד�dؐdٓ�dڐdƓ�dېdܓ�dݐdޓ�dߐd��d�d��d�d��i�d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d���d��d���d�dғ�d��d���d��d���d��d���d��d��d�d��d�d��i�d�d��d�d��d�d	��d
�d��d�d
��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d�d��d �d!��d"�d#��i�d$�d%��d&�d'��d(�d)��d*�d+��d,�d-��d.�d/��d0�d1��d2�d3��d4�d5��d6�d7��d8�d9��d:�d;��d<�d=��d>�d?��d@�dA��dB�dC��dD�dE��i�dF�dG��dH�dI��dJ�dK��dL�dM��dN�dO��dP�dQ��dR�dC��dS�dT��dU�dV��dW�dX��dY�dZ��d[�d\��d]�d^��d_�d`��da�db��dcdɓ�dd�de��i�df�dg��dh�di��dj�dk��dl�d���dm�dn��do�dp��dq�dr��ds�dt��dud��dv�dw��dx�dy��dz�d{��d|�d}��d~�d��d��d���d��d���d��d���i�d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��dH��d��di��d��d���d��d���i�d��d���d��dV��d��d���d��d���d��d��d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d��d��dR��d��d���d��d���i�d�dғ�d��d“�dÐdē�dŐdƓ�dǐd���dȐd��dɐdʓ�dːd̓�d͐dΓ�dϐdГ�dѐdғ�dӐdԓ�dՐd֓�dאdؓ�dِdړ�dېdʓ�dܐdГ�i�dݐdГ�dސdߓ�d�d��d�d��d�d��d�d���d�d��d�d��d�d��d�dZ��d�d��d�dF��d�d���d�dj��d�d��d��d���d��d���i�d��d���d��d���d��d���d��dV��d��d���d�d��d�d��d�d���d�d���d�d��d�d	��d
�d��d�d
��d�d֓�dd���d�d��Z
iZ�d,�d2�dH�d�Z�d�d�d�d�d�d�Z
�d�dgg�d��d�dg�d�Zi�d�d��d�d��d�d��d�d ��d!�d"��d#�d$��d%�d&��d'�d(��d)�d*��d+�d,��d-�d.��d/�d0��d1�d2��d3�d4��d5�d6��d7�d8��d9�d:�i�d;�d<��d=�d>��d?�d@��dA�dB��dC�dD��dE�d��dF�dG��dH�dI��dJ�dK��dL�dM��dN�dO��dP�dQ��dR�dS��dT�dU��dV�dW��dX�dY��dZ�d[��i�d\�d]��d^�d_��d`�d��da�dJ��db�dc��dd�de��dfd��dg�dh��did��dj�dk��dl�dm��dn�do��dp�dq��dr�dG��ds�dI��dt�dK��du�dM���dO�dQ�dS�dU�dW�dv�dw�dx��Zi�dyg�dz���d{g�d|���d}g�d~���dg�d����d�g�d����d�g�d����d�g�d����d�g�d����d�g�d����d�g�d����d�g�d����d�g�d����d�g�d����d�g�d����d�g�d����d�g�d����d�g�d���i�d�g�d����d�g�d����d�g�d~���d�g�d����d�g�d����d�g�d����d�g�d~���d�g�d|���d�g�d����d�g�d����d�g�d����d�g�d����d��d�d�g��d�g�d����d�g�d����d�g�d����d�g�d����g�d��g�d��g�d��g�d��g�d��g�d��g�d��g�d��g�d��g�d���d��
�Z�d��d��d��d��d��d��d��Z�dd�iZi�dĐdœ�dƐdǓ�dȐdɓ�dʐd˓�d̐d͓�dΐd͓�dϐdГ�dѐdғ�dӐd͓�dԐdՓ�d֐dד�dؐdٓ�dڐdۓ�dܐdݓ�dސdߓ�d�d��d�d�Z�d�d�d�d�d�d�d�d�Zd�d�dɐd�d��d�d�d�d�d�d�d�d�d�dɐd�Zi�d�d���d��d��d��d���d��d���d�d���d��d���d��d���d��d���d�d��d�d��d�d��d�d��d�d	��d
�d��d�d��d
�d��d�d��d�di�Zi�d�d��d�dR��d�d��d�d��d�d��d�d��d�d��d�d ��d!�d��d"�d#��d$�d%��d&�d'��d(�d)��d*�d+��d,�d-��d.�d/��d0�d1�i�d2�d3��d4�d5��d6�d7��d8�d9��d:�d;��d<�d=��d>�d?��d@�d��dA�dB��dC�dD��dE�dF��dG�dH��dI�d��dJ�dK��dL�dM��dN�dO��dP�dQ��i�dR�dS��dT�dU��dV�dW��dX�dY��dZ�d[��d\�d]��d^�d_��d`�da��db�dc��dd�de��df�dg��dh�di��dj�dk��dl�dm��dn�do��dp�dq��dr�ds��i�dt�d��dud���dv�dw��dx�dy��dz�d{��d|�d}��d~�d��d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���i�d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���i�d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d���d��d“�dÐdē�dŐdƓ�dǐdȓ�dɐdʓ�dːd̓�d͐d���dΐd���dϐd{��i�dАd���dѐd���dҐd���dӐdԓ�dՐd֓�dאdؓ�dِdړ�dېdܓ�dݐd���dސdߓ�d�d��d�d��d�d��d�d��d�d��d�d��d�d��i�d�d��d�d��d�d��d�d��d�d���d��dޓ�d��d���d��di��d��d���d��d���d��d���d�d��d�d��d�d��d�d��d�d	��d
�d���d�d
�d�d�d�d�d�d�d�d�	�Z�d�d�d֐d�dϐdd͐dِd�d�	Z�d��d�d�Z�d�d�d�d�de�d�d�d�d�de�dw�d �d!�Z�d"g�d#�iZ�d$�d%iZ�d&S('�
FormulaConfigr$z\AA�Åz\AE�Æz\AmSz#<span class="versalitas">AmS</span>z
\AngstroemuÅz\DH�Ðz\KoppauϞz\LuŁz\Micro�µz\O�Øz\OEuŒz\SampiuϠz\StigmauϚz\TH�Þz\aa�åz\ae�æz\alphauαz\betauβz\deltauδz\dh�ðz\digammauϝz\epsilonuϵz\etauηz\ethz\gammauγz\iuız\imathz\iotauιz\juȷz\jmathz\kappauκz\koppauϟz\lułz\lambdauλz\muuμz\nuuνz\o�øz\oeuœz\omegauωz\phiuφz\piuπz\psiuψz\rhouρz\sampiuϡz\sigmauσz\ss�ßz\stigmauϛz\tauuτz\tcohmuΩz\textcrhuħz\th�þz\thetauθz\upsilonuυz	\varDeltau∆z	\varGammauΓz
\varLambdauΛz	\varOmegauΩz\varPhiuΦz\varPiuΠz\varPsiuΨz	\varSigmauΣz	\varThetauΘz\varUpsilonuΥz\varXiuΞz\varbetauϐz\varepsilonuεz	\varkappauϰz\varphiz\varpiuϖuϱuςuϑuξuζ)z\varrhoz	\varsigmaz	\varthetaz\xiz\zetaz\beginr�z\endz\\)�begin�
cellseparator�end�rowseparator)u⎛u⎜u⎝)u⎞u⎟u⎠)u⎡u⎢u⎣)u⎤u⎥u⎦)u⎧�⎪u⎨u⎩�|)u⎫r�u⎬u⎭�∥)�(�)�[�]�{r��}r�u⎲u⎳u⌠u⌡)�∑�∫�span class="symbol"z<span class="leftdot"></span>z<span class="rightdot"></span>)�\leftz\left.z\middle�\rightz\right.z\"üz\'úz\^ûz\`ùz\acuter>ūz\breveŭz\cu̧z\checkǔz\dddotu⃛z\ddotz\dotu̇z\gravez\hatz	\mathringů�\overleftarrowu⃖�\overrightarrowu⃗u̩u⃝u̥ũ)z\rz\sz\textcircledz\textsubringz\tildez\vz\vecz\~z\ r�z\!r+z\#�#z\$�$z\%�%z\&z\,� z\:r�z\;u z\ACu∿z\APLcommentu⍝z\APLdownarrowboxu⍗z	\APLinputu⍞z\APLinvu⌹z\APLleftarrowboxu⍇z\APLlogu⍟z\APLrightarrowboxu⍈z\APLuparrowboxu⍐z\Boxu□z\Bumpequ≎z\CIRCLEu●z\Capu⋒z\CapitalDifferentialDuⅅz\CheckedBoxu☑z\Circleu○z	\Coloneqqu⩴z	\ComplexIuⅈz	\ComplexJuⅉz\Correspondsu≙z\Cupu⋓z\DeltauΔz\Diamondu◇z
\Diamondblacku◆z\Diamonddotu⟐z\DifferentialDuⅆz
\Downarrowu⇓z\EUR�€z\Euleruℇz\ExponetialEuⅇz\FinvuℲz\Gameu⅁z\Gammaz\Imuℑz\Joinu⨝z\LEFTCIRCLEu◖z\LEFTcircleu◐z\LHDu◀z\Lambdaz\Lbagu⟅z
\Leftarrowu⇐z\Lleftarrowu⇚z\Longleftarrowu⟸z\Longleftrightarrowu⟺z\Longrightarrowu⟹z\Lparenu⦅z\Lshu↰z	\Mapsfromu⇐|z\Mapstou|⇒z\Omegaz\P�¶z\Phiz\Piz\Pr�Prz\Psiz\QoppauϘz\RHDu▶z\RIGHTCIRCLEu◗z\RIGHTcircleu◑z\Rbagu⟆z\Reuℜz\Rparenu⦆z\Rrightarrowu⇛z\Rshu↱z\S�§z\Sigmaz\Squareu☐z\Subsetu⋐z\Sunu☉z\Supsetu⋑z\Thetaz\Uparrowu⇑z\Updownarrowu⇕z\Upsilonz\Vdashu⊩z\Vertz\Vvdashu⊪z\XBoxu☒z\Xiz\Yupu⅄z<br/>z\_�_z\alephuℵz\amalgu∐z\anchoru⚓z\angleu∠z	\aquariusu♒z\arccos�arccosz\arcsin�arcsinz\arctan�arctanz\arg�argz\ariesu♈z\arrowbulletu➢z\astu∗z\asympu≍z\backepsilonu∍z
\backprimeu‵z
\backsimequ⋍r�r�z\ballotxu✗z	\barwedgeu⊼z\becauseu∵z\bethuℶz\betweenu≬z\bigcapu∩z\bigcircz\bigcupu∪z\bigodotu⊙z	\bigoplusu⊕z
\bigotimesu⊗z	\bigsqcupu⊔z\bigstaru★z\bigtriangledownu▽z\bigtriangleupu△z	\biguplusu⊎z\bigveeu∨z	\bigwedgeu∧z
\biohazardu☣z
\blacklozengeu⧫z\blacksmileyu☻z\blacksquareu■z\blacktriangleu▲z\blacktriangledownu▼z\blacktriangleleftu◂z\blacktrianglerightz\blacktriangleupu▴z\botu⊥z\bowtieu⋈z\boxu▫z\boxastu⧆z\boxbaru◫z\boxboxu⧈z
\boxbslashu⧅z
\boxcircleu⧇z\boxdotu⊡z	\boxminusu⊟z\boxplusu⊞z	\boxslashu⧄z	\boxtimesu⊠z\bulletu•z\bumpequ≏z\canceru♋z\capz\capricornusu♑z\catu⁀z\cdotu⋅z\cdotsu⋯z\cent�¢z
\centerdotu∙z
\checkmarku✓z\chiuχz\circu∘z\circequ≗z\circlearrowleftu↺z\circlearrowrightu↻z	\circledR�®z\circledastu⊛z\circledbslashu⦸z\circledcircu⊚z\circleddashu⊝z\circledgtru⧁z\circledlessu⧀z	\clubsuitu♣z\colon�: z	\coloneqqu≔z\complementu∁z\congu≅z\coprodz
\copyright�©z\cos�cosz\cosh�coshz\cot�cotz\coth�cothz\csc�cscz\cupz	\curlyveeu⋎z\curlywedgeu⋏z\curvearrowleftu↶z\curvearrowrightu↷z\dag�†z\daggerz\dalethuℸz\dashleftarrowu⇠z\dashvu⊣z\ddag�‡z\ddaggerz\ddotsu⋱z\deg�degz\det�detz	\diagdownu╲z\diagupu╱z	\diameteru⌀z\diamondz\diamondsuitu♦z\dim�dimz\div�÷z\divideontimesu⋇z\dotdivu∸z\dotequ≐z	\doteqdotu≑z\dotplusu∔z\dotsr�z\doublebarwedgeu⌆z
\downarrow�↓z\downdownarrowsu⇊z\downharpoonleftu⇃z\downharpoonrightu⇂z\dsubu⩤z\earthu♁z\eighthnoteu♪z\elluℓz	\emptysetu∅z\eqcircu≖z\eqcolonu≕z\eqsimu≂z\euroz\existsu∃z\exp�expz\fallingdotsequ≒z\fcmpu⨾z\femaleu♀z\flatu♭z\forallu∀z\fourthu⁗z\frownu⌢z\frownieu☹z\gcd�gcdz\geminiu♊z\geq)u≥z\geqqu≧z	\geqslantz\getsu←z\ggu≫z\gggu⋙z\gimeluℷz\gneqqu≩z\gnsimu⋧z\gtrdotu⋗z
\gtreqlessu⋚z\gtreqqlessu⪌z\gtrlessu≷z\gtrsimu≳z\guillemotleft�«z\guillemotright�»z\hbaruℏz
\heartsuitu♥rG�<span class="hfill"> </span>z\hom�homz\hookleftarrowu↩z\hookrightarrowu↪z\hslashz	\idotsintu(<span class="bigsymbol">∫⋯∫</span>z\iiintu"<span class="bigsymbol">∭</span>z\iintu"<span class="bigsymbol">∬</span>z\inf�infz\inftyu∞z	\intercalu⊺z\interleaveu⫴z\invampu⅋z\invnegu⌐z\jupiteru♃z\ker�kerz\landz
\landupintu"<span class="bigsymbol">∱</span>r�u⟪z\langleu⟨z\lblotu⦉z\lbracer�z\lbrace)z\lbrackr�z\lceilu⌈z\ldotsz\leadstou⇝z\leftarrow)z\leftarrowtailu↢z\leftarrowtobaru⇤z\leftharpoondownu↽z\leftharpoonupu↼z\leftleftarrowsu⇇z\leftleftharpoonsu⥢z	\leftmoonu☾z\leftrightarrowu↔z\leftrightarrowsu⇆z\leftrightharpoonsu⇋z\leftthreetimesu⋋z\leou♌z\leq)u≤z\leqqu≦z	\leqslantz\lessdotu⋖z
\lesseqgtru⋛z\lesseqqgtru⪋z\lessgtru≶z\lesssimu≲z\lflooru⌊z\lg�lgz\lgroupu⟮z\lhdu⊲z\librau♎z
\lightningu↯z\limgu⦇z\liminf�liminfz\limsup�limsupz\llu≪z
\llbracketu⟦z	\llcorneru⌞z\lllu⋘z\ln�lnz\lneqqu≨z\lnot�¬z\lnsimu⋦z\log�logz\longleftarrowu⟵z\longleftrightarrowu⟷z\longmapstou⟼z\longrightarrowu⟶z\looparrowleftu↫z\looparrowrightu↬z\lorz\lozengeu◊z	\lrcorneru⌟z\ltimesu⋉z\lyxlockz\maleu♂z\malteseu✠z	\mapsfromu↤z\mapstou↦z\mathcircumflex�^z\max�maxz\measuredangleu∡z
\medbulletu⚫z\medcircu⚪z\mercuryu☿z\mhou℧z\midu∣z\min�minz\modelsu⊨z\mpu∓z	\multimapu⊸z\nLeftarrowu⇍z\nLeftrightarrowu⇎z\nRightarrowu⇏z\nVDashu⊯z\nablau∇z\napproxu≉z\naturalu♮z\ncongu≇z\nearrowu↗z\negz\neg)z\neptuneu♆z\nequivu≢r�z\nexistsu∄z
\ngeqslantu≱z\ngtru≯z	\ngtrlessu≹z\niu∋z\ni)z\nleftarrowu↚z\nleftrightarrowu↮z
\nleqslantu≰z\nlessu≮z	\nlessgtru≸z\nmidu∤z	\nolimitsz	\nonumberz\notz\not<z\not=u≠z\not>z
\notbackslashu⍀z\notinu∉z\notniu∌z	\notslashu⌿z
\nparallelu∦z\nprecu⊀z\nrightarrowu↛z\nsimu≁z\nsimequ≄z
\nsqsubsetu⊏̸z
\nsubsetequ⊈z\nsuccu⊁z
\nsucccurlyequ⋡z\nsupsetu⊅z
\nsupsetequ⊉z\ntriangleleftu⋪z\ntriangleleftequ⋬z\ntrianglerightu⋫z\ntrianglerightequ⋭z\nvDashu⊭z\nvdashu⊬z\nwarrowu↖z\odotz
\officialeuroz\oiiintu"<span class="bigsymbol">∰</span>z\oiintu"<span class="bigsymbol">∯</span>z\ointu"<span class="bigsymbol">∮</span>z\ointclockwiseu"<span class="bigsymbol">∲</span>z\ointctrclockwiseu"<span class="bigsymbol">∳</span>z\ominusu⊖z\oplusz\oslashu⊘z\otimesz\ownsz	\parallelz\partialu∂z\pencilu✎z\perpz\piscesu♓z
\pitchforku⋔z\plutou♇z\pm�±z\pointeru➪z\pointrightu☞z\pounds�£z\precu≺z\preccurlyequ≼z\preceqz\precsimu≾z\primeu′z\promptou∝z\qoppauϙz\qquad�  z\quadz\quarternoteu♩z
\radiationu☢z\rangu⟫z\rangleu⟩z\rblotu⦊z\rbracer�z\rbrace)z\rbrackr�z\rceilu⌉z\recycleu♻z\rflooru⌋z\rgroupu⟯z\rhdu⊳z\rightangleu∟z\rightarrow)u→z\rightarrowtailu↣z\rightarrowtobaru⇥z\rightharpoondownu⇁z\rightharpoonupu⇀z\rightharpooondownz\rightharpooonupz\rightleftarrowsu⇄z\rightleftharpoonsu⇌z
\rightmoonu☽z\rightrightarrowsu⇉z\rightrightharpoonsu⥤z\rightthreetimesu⋌z\rimgu⦈z
\risingdotsequ≓z
\rrbracketu⟧z\rsubu⩥z\rtimesu⋊z\sagittariusu♐z\saturnu♄z\scorpiou♏z\searrowu↘z\sec�secz\secondu″z	\setminusu∖z\sharpu♯z\simequ≃z\sin�sinz\sinh�sinhz\sixteenthnoteu♬z\skullu☠z\slashu∕z\smallsetminusz\smalltriangledownu▿z\smalltriangleleftu◃z\smalltrianglerightu▹z\smalltriangleupu▵z\smileu⌣z\smileyu☺z
\spadesuitu♠z\spddot�¨z\sphatz\sphericalangleu∢z\spotu⦁z\sptilde�~z\sqcapu⊓z\sqcupz	\sqsubsetu⊏z\sqsubsetequ⊑z	\sqsupsetu⊐z\sqsupsetequ⊒z\squarez\sslashu⫽z\staru⋆z	\steamingu☕z
\subseteqqu⫅z\subsetneqqu⫋z\succu≻z\succcurlyequ≽z\succeqz	\succnsimu⋩z\succsimu≿z\sunu☼z\sup�supz
\supseteqqu⫆z\supsetneqqu⫌z\surdu√z\swarrowu↙z\swordsu⚔z\talloblongu⫾z\tan�tanz\tanh�tanhz\taurusu♉z\textasciicircumz\textasciitildez\textbackslashz\textcopyrightu©'z\textdegree�°z
\textellipsisz\textemdashr7z\textendashz	\texteuroz\textgreaterr�z	\textlessr�z\textordfeminine�ªz\textordmasculine�ºz\textquotedblleft�“z\textquotedblright�”z\textquoterightr�z\textregisteredz\textrightarrowz\textsectionz\texttrademarku™z\texttwosuperior�²z\textvisiblespacez
\thereforeu∴z\thirdu‴z\topu⊤z	\trianglez
\triangleleftz\triangleleftequ⊴z
\trianglequ≜z\trianglerightu▷z\trianglerightequ⊵z\twoheadleftarrowu↞z\twoheadrightarrowu↠z	\twonotesu♫z\udotu⊍z	\ulcorneru⌜z\unlhdz\unrhdz\unrhlz\uparrow�↑z\updownarrow�↕z\upharpoonleftu↿z\upharpoonrightu↾z\uplusz\upuparrowsu⇈z\uranusu♅z	\urcorneru⌝z\vDashz\varclubsuitu♧z\vardiamondsuitz
\varheartsuitz\varnothingz
\varspadesuitu♤z\vdashu⊢z\vdotsu⋮z\veez\vee)z\veebaru⊻z\vertz\virgou♍z\warningu⚠z\wasylozengeu⌑z\wedgez\wedge)z\wpu℘z\wru≀z\yen�¥z\yinyangu☯z\{z\|z\})r�r�z\widehat�\]z\end{)�bracket�complex�endafter�	endbefore�
squarebracket�r�l)r;�cr<)�align�eqnarray�gatheredz\boldsymbol�bz\mathbbzspan class="blackboard"z
\mathbb{A}u𝔸z
\mathbb{B}u𝔹z
\mathbb{C}uℂz
\mathbb{D}u𝔻z
\mathbb{E}u𝔼z
\mathbb{F}u𝔽z
\mathbb{G}u𝔾z
\mathbb{H}uℍz
\mathbb{J}u𝕁z
\mathbb{K}u𝕂z
\mathbb{L}u𝕃z
\mathbb{N}uℕz
\mathbb{O}u𝕆z
\mathbb{P}uℙz
\mathbb{Q}uℚz
\mathbb{R}uℝz
\mathbb{S}u𝕊z
\mathbb{T}u𝕋z
\mathbb{W}u𝕎z
\mathbb{Z}uℤz\mathbfz\mathcalzspan class="scriptfont"z\mathcal{B}uℬz\mathcal{E}uℰz\mathcal{F}uℱz\mathcal{H}uℋz\mathcal{I}uℐz\mathcal{L}uℒz\mathcal{M}uℳz\mathcal{R}uℛz	\mathfrakzspan class="fraktur"z\mathfrak{C}uℭz\mathfrak{F}u𝔉z\mathfrak{H}uℌz\mathfrak{I}z\mathfrak{R}z\mathfrak{Z}uℨz\mathit�iz\mathring{A}z\mathring{U}uŮz\mathring{a}z\mathring{u}uůz\mathring{w}uẘz\mathring{y}uẙz\mathrmzspan class="mathrm"z\mathscrz\mathscr{B}z\mathscr{E}z\mathscr{F}zspan class="mathsf"�tt)z\mathscr{H}z\mathscr{I}z\mathscr{L}z\mathscr{M}z\mathscr{R}z\mathsfz\mathttz\addcontentsline)z{$p!}{$q!}{$r!}�f0{}�ignoredz\addtocontents)z
{$p!}{$q!}rDrEz\backmatter)r+rDrE�\binom)�{$1}{$2}zf2{(}f0{f1{$1}f1{$2}}f2{)}zspan class="binom"zspan class="binomstack"�span class="bigsymbol"z\boxed)�{$1}�f0{$1}zspan class="boxed"�\cfrac)z
[$p!]{$1}{$2}�!f0{f3{(}f1{$1}f3{)/(}f2{$2}f3{)}}�span class="fullfraction"zspan class="numerator align-$p"�span class="denominator"�span class="ignored"rD)�	{$p!}{$1}rJzspan style="color: $p;"z	\colorbox)rPrJz-span class="colorbox" style="background: $p;"�\dbinom)rGu%(f0{f1{f2{$1}}f1{f2{ }}f1{f2{$2}}})zspan class="binomial"zspan class="binomrow"zspan class="binomcell"�\dfrac)rGrLrM�span class="numerator"rNrOz
\displaystyle)rIrJzspan class="displaystyle"z
\fancyfoot)z
[$p!]{$q!}rDrEz
\fancyheadz\fbox)rIrJzspan class="fbox"z	\fboxrule)�{$p!}rDrEz\fboxsepz
\fcolorbox)z{$p!}{$q!}{$1}rJz<span class="boxed" style="border-color: $p; background: $q;"�\frac)rGrL�span class="fraction"rSrNrOz	\framebox)z[$p!][$q!]{$1}rJz1span class="framebox align-$q" style="width: $p;"z\frontmatterz\href)z[$o]{$u!}{$t!}zf0{$t}�a href="$u"z\hspace)rT�f0{ }z&span class="hspace" style="width: $p;"z	\leftroot)rTrXz*span class="leftroot" style="width: $p;px"z\mainmatterz	\markbothz
\markrightz	\nicefrac)rGuf0{f1{$1}⁄f2{$2}}rVzsup class="numerator"zsub class="denominator"rOz\parbox)z[$p!]{$w!}{$1}zf0{1}z$div class="Boxed" style="width: $w;"z	\raisebox)rPzf0{$1.font}z1span class="raisebox" style="vertical-align: $p;"z\renewenvironmentz{$1!}{$2!}{$3!}z\rule)z[$v!]{$w!}{$h!}zf0/z.hr class="line" style="width: $w; height: $h;"z\scriptscriptstyle)rIrJzspan class="scriptscriptstyle"z\scriptstyle)rIrJzspan class="scriptstyle"z\sqrt)�[$0]{$1}u!f0{f1{$0}f2{√}f4{(}f3{$1}f4{)}}zspan class="sqrt"zsup class="root"zspan class="radical"zspan class="root"rO)rGzf0{f1{$1}f2{$2}}zspan class="stackrel"zspan class="upstackrel"zspan class="downstackrel")rIrJzspan class="textstyle")rYz
$0f0{$1.font}zspan class="unit")z[$0]{$1}{$2}u$0f0{f1{$1.font}⁄f2{$2.font}}rVzsup class="unit"zsub class="unit")rTrXz(span class="uproot" style="width: $p;px")z{$u!}zf0{$u}rW)rTrXz'span class="vspace" style="height: $p;")
z	\stackrel�\tbinomz
\textcolorz
\textstylez\thispagestylez\unitz	\unitfracz\uprootz\urlz\vspacez$1+$2z$1+$2+1)rFrKrQrRrUrZz\labelz
a name="#"z\biginterleaveu⫼z	\bigsqcapu⨅z\fintu⨏z\iiiintu⨌z\intr�z\intopz\lim�limz\produ∏z	\smallintz\sqintu⨖z\sumr�z\varointclockwiseu∲z\varprodu⨉z\zcmpu⨟z\zhideu⧹z\zpipeu⨠z	\zprojectu⨡�LimitPreviousCommand�MacroDefinition�SetCounterFunction�
FormulaTag�TodayCommand)z\limitsz\newcommandz
\renewcommandz\setcounterz\tagz\tag*z\today�	u + u, u	 − u	 ⁄ z : u
 &lt; u = u
 &gt; )rr�r�r�r��+�,r�r��:r��=r��@r(z\BigrHz\Biggzspan class="hugesymbol"zspan class="bar"z
\begin{array}zspan class="arraydef"z\bigz\biggzspan class="largesymbol"z\biglz\bigrz
\centeringzspan class="align-center"z\ensuremathzspan class="ensuremath"z	\hphantomzspan class="phantom"r�zspan class="noindent"z
\overbracezspan class="overbrace"z	\overlinezspan class="overline"z\phantomz\underbracezspan class="underbrace"z
\underline�uz	\vphantomz\Botu⫫z\Doteqz
\DownArrowBaru⤓z\DownLeftTeeVectoru⥞z\DownLeftVectorBaru⥖z\DownRightTeeVectoru⥟z\DownRightVectorBaru⥗z\Equalu⩵z
\LeftArrowBarz\LeftDownTeeVectoru⥡z\LeftDownVectorBaru⥙z\LeftTeeVectoru⥚z\LeftTriangleBaru⧏z\LeftUpTeeVectoru⥠z\LeftUpVectorBaru⥘z\LeftVectorBaru⥒z\Leftrightarrowu⇔z
\Longmapsfromu⟽z\Longmapstou⟾z	\MapsDownu↧z\MapsUpu↥z\Nearrowu⇗z\NestedGreaterGreateru⪢z\NestedLessLessu⪡z\NotGreaterLessz\NotGreaterTildeu≵z
\NotLessTildeu≴z\Nwarrowu⇖z\Proportionu∷z\RightArrowBarz\RightDownTeeVectoru⥝z\RightDownVectorBaru⥕z\RightTeeVectoru⥛z\RightTriangleBaru⧐z\RightUpTeeVectoru⥜z\RightUpVectorBaru⥔z\RightVectorBaru⥓z\Rightarrowu⇒z\Sameu⩶z\Searrowu⇘z\Swarrowu⇙z\Topu⫪z\UpArrowBaru⤒z\VDashu⊫z\approxu≈z	\approxequ≊z\backsimu∽z\barinu⋶z\barleftharpoonu⥫z\barrightharpoonu⥭z\biju⤖z\coloneqz\correspondsz\curlyeqprecu⋞z\curlyeqsuccu⋟z\dashrightarrowu⇢z\dlshu↲z\downdownharpoonsu⥥z
\downuparrowsu⇵z\downupharpoonsu⥯z\drshu↳z\eqslantgtru⪖z\eqslantlessu⪕z\equivu≡z\ffunu⇻z\finju⤕z\gez\geqz\ggcurlyu⪼z	\gnapproxu⪊z\gnequ⪈z
\gtrapproxu⪆z\hashu⋕z\iddotsu⋰z\impliesu	 ⇒ z\inu∈z\lez
\leftarrowz\leftarrowtriangleu⇽z\leftbarharpoonu⥪z\leftrightarrowtriangleu⇿z\leftrightharpoonu⥊z\leftrightharpoondownu⥐z\leftrightharpoonupu⥎z\leftrightsquigarrowu↭z
\leftsliceu⪦z\leftsquigarrowu⇜z\leftupdownharpoonu⥑z\leqz\lessapproxu⪅z\llcurlyu⪻z	\lnapproxu⪉z\lnequ⪇z
\longmapsfromu⟻z
\multimapbothu⧟z\multimapdotbothAu⊶z\multimapdotbothBu⊷z\multimapinvu⟜z\nVdashu⊮z\nez\neqz\ngeqz\nleqz\nniz\not\inz	\notasympu≭z\nprecequ⋠z\nsqsubsetequ⋢z\nsqsupsetequ⋣z\nsubsetu⊄z\nsucceqz\pfunu⇸z\pinju⤔z\precapproxu⪷z\preceqqu⪳z\precnapproxu⪹z	\precnsimu⋨z\proptoz\psuru⤀z\rightarrowz\rightarrowtriangleu⇾z\rightbarharpoonu⥬z\rightleftharpoonu⥋z\rightsliceu⪧z\rightsquigarrowz\rightupdownharpoonu⥏z\simz	\strictfiu⥼z	\strictifu⥽z\subsetu⊂z	\subsetequ⊆z
\subsetnequ⊊z\succapproxu⪸z\succeqqu⪴z\succnapproxu⪺z\supsetu⊃u⊇u⊋�×u⇅u⥮u⥣)	z	\supseteqz
\supsetneqz\timesz\toz
\updownarrowsz\updownharpoonsz
\upupharpoonsz\vartriangleleftz\vartrianglerightz\begin{�\[�*)	�
beginafter�beginbeforer6�command�commentr7�simpler:�
unnumbered�sub)rr�zspan class="mbox"zspan class="text"zspan class="textipa"zspan class="textnormal"zspan class="textrm"�span class="versalitas"zspan class="textsf"zspan class="normal")z\mboxz\textz\textbfz\textipaz\textitz\textnormalz\textrmz\textscz\textsfz\textslz\textttz\textup�
characters)
r8rjr�r�r�r�r��·�!�;r�r��"�googlechartsz-http://chart.googleapis.com/chart?cht=tx&chl=N)rrr r!�
alphacommands�array�bigbrackets�
bigsymbols�bracketcommands�combiningfunctionsr��decoratedcommand�decoratingfunctionsr��environments�
fontfunctions�hybridfunctions�hybridsizes�labelfunctions�
limitcommands�misccommands�modified�onefunctions�spacedcommandsr��symbolfunctions�
textfunctions�
unmodified�urlsrrrrr�Es8�����������������������������	�	�	�	�
�
�
�
�
���������
�
�
�
���������������������
���������������������
����������������������������	�	�	�	�
�
�
��������
�
�
�
����������������������������������������������������������������� � � � �!�!�!�"�"�"�#�#�#�$�$�$�%�%�%�&�&�'�'�(�(�(�)�)�)�)�*�*�*�+�+�+�,�,�,�-�-�-�-�.�.�.�.�/�/�/�/�0�0�0�1�1�1�2�2�2�3�3�3�3�4�4�4�5�5�5�5�6�6�6�6�7�7�8�8�8�9�9�9�:�:�:�:�;�;�;�<�<�<�=�=�=�>�>�>�>�?�?�?�@�@�A�A�A�B�B�B�C�C�C�C�D�D�D�E�E�E�E�F�F�F�F�G�G�G�G�H�H�H�H�I�I�I�I�J�J�J�K�K�K�L�L�M�M�M�N�N�O�P�P�Q�Q�Q�R�R�R�S�S�S�S�T�T�U�U�U�U�V�V�V�V�W�W�W�X�X�Y�Y�Y�Z�Z�[�[�[�\�\�\�\�]�]�]�^�^�^�^�_�_�_�_�`�`�`�a�a�a�a�b�b�b�b�c�c�d�d�d�e�e�e�f�f�f�f�g�g�g�h�h�h�i�i�i�i�j�j�j�j�k�k�k�l�l�l�m�m�m�m�n�n�n�n�o�o�o�p�p�p�p�q�q�q�r�r�r�r�s�s�s�s�t�t�t�t�u�u�u�v�v�v�w�w�w�x�x�x�y�y�z�z�z�{�{�{�|�|�}�~��������������������������������������������������������	��	��	��	��
��
��
��
����������������
��
�������������������������������������������������������������������������������������������������������� �� �� ��!��!��!��"��"��"��"��#��#��#��$��$��$��%��%��%��&��&��'��'��'��(��(��(��)��)��)��*��*��+��+��,��,��-��-��.��.��/��/��/��/��0��0��0��1��1��2��2��3��3��3��3��4��4��4��5��5��5��6��6��6��7��7��7��8��8��8��9��9��9��9��:��:��:��:��;��;��;��<��<��<��<��=��=��=��=��@��
������������������������	�	�
�
�
������
�
�
����������������
���������	�
���
������������������� �!�"�#
�0�������������������	��������������	�
����
��������������������	�	�	�
�
������
�
������������������������������������������������������ � �!�!�!�"�"�"�#�#�#�$�$�%�%�%�%�&�&�&�&�'�'�'�(�(�(�)�)�)�)�*�*�*�+�+�+�,�,�-�-�.�.�.�/�/�/�0�0�0�1�1�1
�8����
�r�c@seZdZdZdddd�ZdS)�
GeneralConfigr$z
2015-02-26�413z1.2.5)�date�	lyxformat�numberN)rrr r!�versionrrrrr�s
�r�c
@s@eZdZdZdddddddd	d
ddd
d�Zgd�gd�d�ZdS)�HeaderConfigr$r�z\branchz
\textclassz\end_branchz
\end_preamblez	\languagez\lstsetz\output_changesz\paragraph_separationz
\pdf_titlez\secnumdepthz	\tocdepth)�
beginpreamble�branch�
documentclass�	endbranch�endpreamble�language�lstset�
outputchanges�paragraphseparation�pdftitle�secnumdepth�tocdepth)0�article�aastex�aapaper�acmsiggraph�sigplanconf�achemso�amsart�apazarab-articlezarmenian-articlezarticle-beamer�chess�dtk�
elsarticlezheb-article�IEEEtran�iopart�kluwerzscrarticle-beamer�scrartcl�
extarticle�paper�mwart�revtex4�spie�	svglobal3�ltugboatzagu-dtd�jgrga�agums�entcs�egs�ijmpc�ijmpdz
singlecol-newz
doublecol-new�isprs�tarticle�	jsarticle�jarticle�jsszliterate-article�siamltex�cl2emult�llncs�svglobal�svjog�svprobth)�book�amsbook�scrbook�extbookz
tufte-book�report�	extreport�scrreprt�memoir�tbook�jsbook�jbook�mwbk�svmono�svmult�treport�jreport�mwrep)r�r�N)rrr r!�
parameters�stylesrrrrr�s�
�r�c@s6eZdZdZdddd�Zdddd�Zd	d
dgd�Zd
S)�ImageConfigr$zOconvert[ -density $scale][ -define $format:use-cropbox=true] "$input" "$output"z(inkscape "$input" --export-png="$output"zlyx -C "$input" "$output")�imagemagick�inkscape�lyx�ps�pdf)�.epsz.pdfz.psz.pngz.svgr�)r'�vectorN)rrr r!�
converters�cropboxformats�formatsrrrrr�1s��
�r�c@seZdZdZdgd�iZdS)�LayoutConfigr$rl�rTrUrXr<rRrErSr=rOrCrZr[N)rrr r!�	groupablerrrrr�Bs�r�c@s eZdZdZdddddd�ZdS)	�NewfangleConfigr$z	chunkref{r�r�r�z=&lt;)�chunkref�
endcommand�endmarkr��	startmarkN)rrr r!�	constantsrrrrr�Is

�r�c@s.eZdZdZgd�ddgd�Zdgd�iZdS)	�NumberingConfigr$)�Chapter�Section�
Subsection�
Subsubsection�	Paragraph�Part�Book)�ordered�roman�symbols)
rjz**r	r
r�u§§r�u¶¶r�z##N)rrr r!�layouts�sequencerrrrr�Qs��r�c@s�eZdZdZdddddddddddd	�Zid
d�dd
�dd�dd�dd�dd�dd�dd�dd�dd�dd�dd
�dd�d d!�d"d#�d$d%�d&d�d!d'd(d'd'd)��Zd*d+d,d-d.d/d0d1�Zd2gd3�iZd4d5d6d7d8d9�Zd:S);�StyleConfigr$u rr�r+u  r�r�)z	\enskip{}z\hfill{}z\hspace*{\fill}z
\hspace*{}z	\hspace{}z\negthinspace{}z\qquad{}z\quad{}z\space{}z\thinspace{}r(�aldr�alsu›�ardr�arsu‹�eldz&ldquo;�elsz&lsquo;�erdz&rdquo;�ersz&rsquo;�fld�fls�frd�frs�gldu„�glsu‚�grdr/�grsr��pldr0r�)�pls�prd�prs�sld�srdu(@↕)u¶↕u$↕u#↕u@↕uon-page#↕u@on-page#↕)�eqref�	formatted�nameref�pageref�ref�vpageref�vref�ignoredtexts)�col�text�line�page�theight�pheightz<div class="bigskip"> </div>z<div class="defskip"> </div>z<div class="medskip"> </div>z<div class="smallskip"> </div>z<div class="vfill"> </div>)�bigskip�defskip�medskip�	smallskip�vfillN)	rrr r!�hspaces�quotes�referenceformats�size�vspacesrrrrr�]sp�������������������	��
�r�c@s<eZdZdZgd�dgdgd�Zgd�gd�gd�d�ZdS)	�	TOCConfigr$r�r+rk)rTrUr�)rRrErSr=rOrCrZr[)rWrXr<rYr�r�N)rrr r!�extractplain�extracttitlerrrrr,�s�
�r,c@s�eZdZdZddiZddd�Zddddd	d
d�Zdd
dgiZddddddddddd�
Zddd�Z	dddd�Z
ddd�Zdddd �Zd!S)"�	TagConfigr$�underrgzspan class="sans"rC)�sans�
typewriterzspan class="code"zspan class="menuitem"zspan class="noun"zspan class="strong")zCharStyle:CodezCharStyle:MenuItem�Code�MenuItem�Noun�Strongr��	Quotation�Quote�divzh?�h2�h1�
blockquote)
�Centerr��Dater�r�r7r8r�r�r��ol�ul)�	Enumerate�Itemizer+zspan class="greyedout")�Comment�	Greyedoutr�rqr))�	subscript�superscriptrBrr)�italic�slanted�	smallcapsN)
rrr r!�barred�family�flex�groupr��	listitems�notes�script�shapedrrrrr/�s2��������
�r/c
@seZdZdZidd�dd�dd�dd�dd�dd�dd�d	d	�d
d�dd
�dd�dd�dd�dd�dd�dd�dd�idd�dd�dd �d!d"�d#d$�d%d&�d'd(�d)d*�d+d,�d-d.�d/d0�d1d2�d3d4�d5d6�d7d8�d9d:�d;d<��d=d>d?��Zd@d@dAdBd@dCdAdDdEdF�	ZdGS)H�TranslationConfigr$�Appendixr�r�r�r�r�r�r��abstractr��bibliographyr��figurezfloat-algorithmz
Algorithm zfloat-figurezFigure z
float-listingzListing zfloat-tablezTable z
float-tableauzTableau �	footnotes�	Footnoteszgenerated-byzDocument generated by zgenerated-onz on �index�Indexz
jsmath-enablez)Please enable JavaScript on your browser.zjsmath-requireszH requires JavaScript to correctly process the mathematics on this page. zjsmath-warningz	Warning: zlist-algorithmzList of Algorithmszlist-figurezList of Figuresz
list-tablezList of Tableszlist-tableauzList of Tableauxz	main-pagez	Main page�next�Next�nomenclature�Nomenclature�on-pagez	 on page �prev�Prev�
references�
References�toczTable of Contentsz
Contents for �Up)ztoc-for�up�en�de�nl�fr�ru�es)	�american�british�deutsch�dutch�english�french�ngerman�russian�spanishN)rrr r!r��	languagesrrrrrR�s�������������������	�	�
����
�
����������
�rRc@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�CommandLineParserzA parser for runtime optionscCs
||_dS�N��options)�selfrzrrr�__init__��
zCommandLineParser.__init__cCs�t|�dkrdSt|�dkr@|d�d�r@|�|�\}}|s$d|dS|s,d|dSt|j||�t|�dkr@|d�d�sdS)�Parse command line optionsrNr9zOption z not recognizedz needs a value)�len�
startswith�
readoption�setattrrz)r{�args�key�valuerrr�parseoptions�s�zCommandLineParser.parseoptionscCs�|ddd�}|d=d|vr|�||�}n|�dd�}t|j|�s&d|fSt|j|�}t|t�r5|dfSt|�dkr?|dfS|d�d�rU|d}|d=||�	||�fS|d�
d	�}|d=t|t�rm|�|�||fS||fS)
z$Read the key and value for an optionr�Nrer�r+Trwr)
�
readequalskey�replace�hasattrrz�getattr�
isinstance�boolrr��
readquoted�decode�list�append)r{r�r�r��current�initialr�rrrr��s,


zCommandLineParser.readoptioncCs�t�d�|dd�}t|�dkrG|d�d�sG|d�d�sGt�d|d�|d|d7}|d=t|�dkrG|d�d�sG|d�d�rt|�dksT|d�d�rVdS|d|dd	�7}|S)
zRead a value between quotes�Oops�Nrrwr9z
Appending r�r)rrr�endswithr�)r{r�r�r�rrrr�s
((�zCommandLineParser.readquotedcCs,|�dd�}|d}|d}|�d|�|S)zRead a key using equalsrer�r)�split�insert)r{r�r�r�r�r�rrrr�s
zCommandLineParser.readequalskeyN)	rrr r!r|r�r�r�r�rrrrrw�s

rwc@s*eZdZdZdZdZdZdZdZdZ	dZ
dZdZdZ
dZdZdZdZgZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5gZ6e7�Z8dd�Z9d	d
�Z:dd�Z;d
d�Z<dd�Z=dd�Z>dd�Z?dd�Z@dd�ZAdS)�OptionszA set of runtime optionsNFTr+r�cCsD|dt_|d=tt�}|�|�}|rt�|�|��|��dS)r~rN)r��locationrwr�rr�usage�processoptions)r{r��parser�resultrrrr�Vs


zOptions.parseoptionsc	Cs|tjr|��tjr|��tjr|��tjr|��tj	r#|�
�tjrMzttj�t_tjdkr;t
�d�|��Wnt
�dtj�|��YtjsVtjsVtjrYdt_|��tjrgtjsgtjt_tjdkrodt_tjgkrxdgt_tjdkr~	tjr�dt_tjr�tjs�t
�d	�tjt_tjr�t
�d
�tjr�t
�d�tt
�D]}|�d�r�t t
|t!||d
d���q�d
S)zProcess all options parsed.rz.--splitpart requires a number bigger than zeroz*--splitpart needs a numeric argument, not F�copyTz http://elyxer.nongnu.org/lyx.cssr+z7Option --toc is deprecated; use --tocfor "page" insteadz5Option --nocopy is deprecated; it is no longer neededz4Option --jsmath is deprecated; use --mathjax instead�modeN���)"r��helpr�r��showversion�hardversion�showhardversion�versiondate�showversiondater��
showlyxformat�	splitpart�intrr�lowmemrd�tocfor�memory�parsefootnotes�forceformat�imageformat�
copyimages�css�faviconr��
simplemath�	toctarget�nocopy�jsmath�dirr�r�r�)r{�paramrrrr�asZ

�







��zOptions.processoptionscCsFt�dtj�tj�d�t�d�t�d�t�d�|��dS)zShow correct usagezUsage: z [options] [filein] [fileout]z7Convert LyX input file "filein" to HTML file "fileout".zCIf filein (or fileout) is not given use standard input (or output).z?Main program of the eLyXer package (http://elyxer.nongnu.org/).N)rr�os�path�basenamer�r��showoptions�r{rrrr��s



z
Options.usagecCs�tjsdSdt_dt_dt_tj�d�}|D]}|d}tt|�r(tt|d�qt�	d|�qtj
s<tjs<tjs<dt_tjsGtjsIdt_dSdSdS)zParse footnotes options.NFrc�footTzUnknown footnotes option: )
r�rW�
marginfoot�
letterfoot�	hoverfootr�r�r�rr�endfoot�
numberfoot�
symbolfoot)r{rz�option�
footoptionrrrr��s 

�zOptions.parsefootnotescCst�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d	�t�d
�t�d�t�d�t�d
�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d�t�d �t�d!�t�d"�t�d#�t�d$�t�d%�t�d&�t�d'�t�d(�t�d)�t�d*�t�d+�t�d,�t�d-�t�d.�t�d/�t�d0�t�d1�t�d2�t�d3�t�d4�t��d5S)6zShow all possible optionsz  Common options:z1    --help:                 show this online helpz9    --quiet:                disables all runtime messagesr+z  Advanced options:zF    --debug:                enable debugging messages (for developers)z@    --version:              show version number and release datezD    --lyxformat:            return the highest LyX version supportedz  Options for HTML output:z8    --title "title":        set the generated page titlez1    --css "file.css":       use a custom CSS filezH    --embedcss "file.css":  embed styles from a CSS file into the outputzG    --favicon "icon.ico":   insert the specified favicon in the header.zH    --html:                 output HTML 4.0 instead of the default XHTMLz/    --unicode:              full Unicode outputzG    --iso885915:            output a document with ISO-8859-15 encodingzC    --nofooter:             remove the footer "generated by eLyXer"zD    --simplemath:           do not generate fancy math constructionsz  Options for image output:zF    --directory "img_dir":  look for images in the specified directoryzD    --destdirectory "dest": put converted images into this directoryzI    --imageformat ".ext":   image output format, or "copy" to copy imageszL    --noconvert:            do not convert images, use in original locationszH    --converter "inkscape": use an alternative program to convert imagesz  Options for footnote display:zJ    --numberfoot:           mark footnotes with numbers instead of letterszB    --symbolfoot:           mark footnotes with symbols (*, **...)zE    --hoverfoot:            show footnotes as hovering text (default)z=    --marginfoot:           show footnotes on the page marginzA    --endfoot:              show footnotes at the end of the pagezJ    --supfoot:              use superscript for footnote markers (default)zA    --alignfoot:            use aligned text for footnote markerszM    --footnotes "options":  specify several comma-separated footnotes optionszJ      Available options are: "number", "symbol", "hover", "margin", "end",z        "sup", "align"z  Advanced output options:zJ    --splitpart "depth":    split the resulting webpage at the given depthzH    --tocfor "page":        generate a TOC that points to the given pagezC    --target "frame":       make all links point to the given framezL    --notoclabels:          omit the part labels in the TOC, such as ChapterzJ    --lowmem:               do the conversion on the fly (conserve memory)zC    --raw:                  generate HTML without header or footer.zE    --mathjax remote:       use MathJax remotely to display equationszO    --mathjax "URL":        use MathJax from the given URL to display equationszH    --googlecharts:         use Google Charts to generate formula imageszM    --template "file":      use a template, put everything in <!--$content-->z@    --copyright:            add a copyright notice at the bottomz  Deprecated options:zC    --toc:                  (deprecated) create a table of contentszJ    --toctarget "page":     (deprecated) generate a TOC for the given pagezO    --nocopy:               (deprecated) maintained for backwards compatibilityzN    --jsmath "URL":         use jsMath from the given URL to display equationsN)rrr	rr�rrrr��sj



















































zOptions.showoptionscCs:dtjd}|dtjdd7}t�|�t��dS)z(Return the current eLyXer version stringzeLyXer version r�� (r�r�N)r�r�rrr	r�r{r�rrrr��s
zOptions.showversioncC�t�tjd�t��dS)zReturn just the version stringr�N�rr
r�r�r	rr�rrrr���zOptions.showhardversioncCr�)zReturn just the version dter�Nr�r�rrrr��r�zOptions.showversiondatecCr�)z#Return just the lyxformat parameterr�Nr�r�rrrr��r�zOptions.showlyxformat)Brrr r!�instancer�r��	copyrightr�quietr�r�r�r�r��	showlines�unicoder�r�r��title�	directory�
destdirectoryrdr�r�r�r��targetr�r�r��nobib�	converter�rawr��mathjax�nofooterr��template�	noconvert�notoclabelsr�r�r�r�r�r��supfoot�	alignfootrWr�r�rx�embedcss�dict�branchesr�r�r�r�r�r�r�r�r�rrrrr�s~.8r�c@�BeZdZdZdd�Zdd�Zdd�Zdd	�Zej	d
kreZ
dSdS)�
BranchOptionszA set of options for a branchcCs||_ddi|_dS)N�colorz#ffffff)�namerz�r{r�rrrr|�szBranchOptions.__init__cCsB|�tjd�st�d|�dS|�tjdd�}||j|<dS)zSet a branch optionr�zInvalid branch option Nr+)r�r;r�rrr�rz�r{r�r�rrr�set�s
zBranchOptions.setcCsd|jvrdS|jddkS)z Return if the branch is selected�selectedF�1ryr�rrr�
isselecteds
zBranchOptions.isselectedcCsd|jdt|j�S)zString representationzoptions for r)r�r�rzr�rrr�__unicode__
�zBranchOptions.__unicode__rN)rrr r!r|r�r�r�r	r�__str__rrrrr��s
�r�c@s0eZdZdZdd�Zdd�Zee�Zee�ZdS)�Clonerz&An object used to clone other objects.cCs	|�|j�S)z"Return an exact copy of an object.)�create�	__class__)r�originalrrr�cloneszCloner.clonecCs|�|�}|��|S)z"Create an object of a given class.)�__new__r|)r�typer�rrrr�s
z
Cloner.createN)rrr r!r�r�r"rrrrr�sr�c@�0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�ContainerExtractorz&A class to extract certain containers.cCs,					|d|_|d|_|d|_dS)zTThe config parameter is a map containing three lists: allowed, copied and extracted.rlrmrnNrk)r{�configrrrr|)s

zContainerExtractor.__init__cs<g��fdd�}�fdd�}��fdd�}|�|||��S)z?Extract a group of selected containers from elyxer.a container.cs|jj�j�jvSrx)r�rrlrm�r=r�rr�<lambda>7�z,ContainerExtractor.extract.<locals>.<lambda>cs|jj�jvSrx)r�rrnr�r�rrr�8scs��|��Srx)�processr��r�r{rrr�9�)�recursivesearch)r{�	container�locate�	recursiver�rr�r�extract4szContainerExtractor.extractcCsP|jj}||jvr|�|�dS||jvr|�|�|��dSt�d|�dS)zBAdd allowed containers, clone cloned containers and add the clone.zUnknown container class N)r�rrlr�rm�	safeclonerr)r{rr�r�rrrr�=s

zContainerExtractor.processcCs"t�|�}|j|_|�|�|_|S)zFReturn a new container with contents only in a safe list, recursively.)r�r��outputr�contents)r{rr�rrrrGs
zContainerExtractor.safecloneN)rrr r!r|rr�rrrrrr�&s	
r�c@sZeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
ejdkr+e
Z
dSdS)�ParserzA generic parsercCsd|_t�|_dS)Nr)r�r�r�r�rrrr|VszParser.__init__cCs |����}|��|j|_|S)zParse the header)�currentliner��nextline�
linenumberr�)r{�reader�headerrrr�parseheaderZszParser.parseheadercCs�|�����d�r|�|�\}}||j|<dS|�����dd�}|��t|�dkr-dS|d}t|�dkr>d|j|<dSd|dvrO|d��|j|<dS|d�d�}|d|j|<dS)zParse a parameterr�Nr�r�rTrw)r	�stripr��parsexmlr�r�r
r)r{rr�r�r��doublesplitrrr�parseparameteras"

zParser.parseparameterc
Cs�|����}|��|�d�st�d|d�|dd���}t|�dkr-t�d�dS|d}|d=t|�dkr?|t�fSt�}|D]+}d	|vrYt�d
|d|�|d7}|�d	�}|d}|d�d
�d}	|	||<qD||fS)z5Parse a parameter in xml form: <param attr1=value...>r�zXML parameter z should be <...>r�rrzEmpty XML parameter <>�NNrezErroneous attribute for rz="0"rw)	r	rr
r�rrr�rr�)
r{rrr�r��attrs�attr�parts�attrkeyr�rrrrus,




zParser.parsexmlcCsJ|jst�dt|��dS|���|j�s#|�|���|j�rdSdS)z'Parse until the current ending is foundzNo ending for N)�endingrrr�r	r�)r{rr�rrr�parseending�s�zParser.parseendingcCs*|j�|�}|r|j|_|�|�dSdSrx)�factory�createcontainer�parentr�)r{rrrrrr�parsecontainer�s
�zParser.parsecontainercCs|jjdt|j�dS)zReturn a descriptionr�r�)r�rr�r�r�rrrr���zParser.__unicode__rN)rrr r!r|rrrrrr�r	rr�rrrrrSs
�rc@�eZdZdZdd�ZdS)�LoneCommandz"A parser for just one command linecC�gS)zRead nothingr�r{rrrr�parse��zLoneCommand.parseN�rrr r!r#rrrrr ��r c@s,eZdZdZgZdd�Zdd�Zdd�ZdS)	�
TextParserz(A parser for a command and a bit of textcCs8t�|�d|_|jjtjvrtj|jj|_g|_dSrx)rr|rr�rr;r��r{rrrrr|�s


zTextParser.__init__cCsVtj�|j�tjtjdtjd|jg|_g}|�|�s)|�||�|�|�r|S)z$Parse lines as long as they are textrIrH)r'�stackr�rr;r��isendingr�r{rrrrrr#�s�

�zTextParser.parsecCsZ|����}t|�dkrdS|d|jvr+|dtjvr&tj�|d�dSgt_dSdS)zCheck if text is endingrFT)r	r�rr�r'r)�remove)r{rr�rrrr*�s�zTextParser.isendingN)rrr r!r)r|r#r*rrrrr'�s
r'c@r)�ExcludingParserz%A parser that excludes the final linecs g�������fdd���S)z5Parse everything up to (and excluding) the final linec������Srx)rr�rrr{rrr��r�z'ExcludingParser.parse.<locals>.<lambda>)rr"rr/rr#�szExcludingParser.parseNr%rrrrr-�r&r-c@r)�
BoundedParserzA parser bound by a final linecCst�||�}|��|S)z*Parse everything, including the final line)r-r#r
r+rrrr#�szBoundedParser.parseNr%rrrrr0�r&r0c@r)�BoundedDummyz&A bound parser that ignores everythingcs |���fdd�����gS)z#Parse the contents of the containercs���Srx)r
r�rrrr��sz$BoundedDummy.parse.<locals>.<lambda>�rr
r"rr2rr#�szBoundedDummy.parseNr%rrrrr1�r&r1c@� eZdZdZdd�Zdd�ZdS)�StringParserzParses just a stringcCs|jd|_gS)zDo nothing, just take noter��rr�r"rrrr�szStringParser.parseheadercCs|��}|��|S)zParse a single line)r	r
r+rrrr#�szStringParser.parseN�rrr r!rr#rrrrr5��r5c@r)�InsetParserzParses a LyX insetcCsTtjd}|��dkr$|���|�s$|�|�|��dkr$|���|�rt�||�S)z(Parse inset parameters into a dictionaryr�r+)r;r�r	r�rr0r#)r{rr�rrrr#�s


�zInsetParser.parseNr%rrrrr9�r&r9c@r4)�ContainerOutputz(The generic HTML output for a container.cC�t�dt|��dS)zShow an error.zgethtml() not implemented for N�rrr�r(rrr�gethtml�zContainerOutput.gethtmlcC�dS)z5Decide if the output is empty: by default, not empty.Frr�rrr�isemptyr$zContainerOutput.isemptyN)rrr r!r=r@rrrrr:�r:c@seZdZdd�Zdd�ZdS)�EmptyOutputcCr!)zReturn empty HTML code.rr(rrrr=r$zEmptyOutput.gethtmlcCr?)z"This output is particularly empty.Trr�rrrr@r$zEmptyOutput.isemptyN)rrr r=r@rrrrrBsrBc@r)�FixedOutputzFixed outputcCs|jS)zReturn constant HTML code�r�r(rrrr= �zFixedOutput.gethtmlN�rrr r!r=rrrrrCr&rCc@r)�ContentsOutputz&Outputs the contents converted to HTMLcCs^g}|jdkr	|S|jD] }t|d�s&t�d|jjdt|��|S||��7}q|S)�Return the HTML codeNr=zNo html in r)rr�rrr�rr�r=)r{rr��elementrrrr='s


zContentsOutput.gethtmlNrFrrrrrG$r&rGc@sVeZdZdZdZdZdZddd�Zdd�Zdd	�Z	d
d�Z
dd
�Zdd�Zdd�Z
dS)�TaggedOutputz-Outputs an HTML tag surrounding the contents.NFcCs||_|r||_|r
||_|S)z/Set the value for the tag and other attributes.)�tag�
breaklines�empty)r{rKrLrMrrr�settag:szTaggedOutput.settagcC�
||_|S)zSet the value for breaklines.)rL)r{rLrrr�
setbreaklinesC�zTaggedOutput.setbreaklinescCsB|jr	|�|�gS|�|�g}|t�||�7}|�|�|��|S)zReturn the HTML code.)rM�selfclosing�openrGr=r��close)r{rr�rrrr=HszTaggedOutput.gethtmlcC�.|�|�sdSd|jd}|jr|dS|S)zGet opening line.r+r�r�r��checktagrKrL)r{rrSrrrrSQ�
zTaggedOutput.opencCs:|�|�sdSd|j��dd}|jrd|dS|S)zGet closing line.r+z</rr�r)rWrKr�rL)r{rrTrrrrTZs
zTaggedOutput.closecCrU)zGet self-closing line.r+r�r�rrV)r{rrRrrrrRcrXzTaggedOutput.selfclosingcCs.|jst�dt|��dS|jdkrdSdS)zCheck that the tag is valid.z
No tag in Fr+T)rKrrr�r(rrrrWls
zTaggedOutput.checktag)FF)rrr r!rKrLrMrNrPr=rSrTrRrWrrrrrJ3s
					rJc@s2eZdZdZ	dd�Zdd�Zdd�Zdd	�Zd
S)�FilteredOutputz1Returns the output in the contents, but filtered:cCs
g|_dS)zInitialize the filters.N)�filtersr�rrrr|y�
zFilteredOutput.__init__cCs|j�||f�dS)z:Add a new filter: replace the original by the replacement.N)rZr�)r{r��replacementrrr�	addfilter}�zFilteredOutput.addfiltercCs.g}t�||�}|D]
}|�|�|��q
|S)rH)rGr=r��filter)r{rr�r�rrrrr=�s
zFilteredOutput.gethtmlcCs(|jD]\}}||vr|�||�}q|S)z0Filter a single line with all available filters.)rZr�)r{rr�r\rrrr_�s
�zFilteredOutput.filterN)rrr r!r|r]r=r_rrrrrYusrYc@r)�StringOutputzReturns a bare string as outputcCs|jgS)zReturn a bare string�r�r(rrrr=��zStringOutput.gethtmlNrFrrrrr`�r&r`c@�PeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�ZdS)�
LineReaderzReads a file line by linecCs�t|t�r	||_nt�|dd�|_d|_d|_d|_d|_d|_z|�	�WdSt
y@ddl}|�|d�|_|�	�YdSw)N�rUrr�TFr�rb)r��file�codecsrSr�lastliner��mustread�depleted�readline�UnicodeDecodeError�gzip)r{�filenamernrrrr|�s
�zLineReader.__init__cCs"t|�D]}|j��q||_dS)zSet the first line to read.N)�rangergrlr)r{�	firstlinerBrrr�setstart�s
zLineReader.setstartcC�
||_dS)zSet the last line to read.N)ri)r{rirrr�setend�r[zLineReader.setendcCs|jr|��|jS)zGet the current line)rjrlr�r�rrrr	�szLineReader.currentlinecCs|jrt�d�d|_dS)zGo to next linezRead beyond file endTN)rkrrrjr�rrrr
�s

zLineReader.nextlinecCs�|j��|_t|jtj�s|j�d�|_t|j�dkrd|_|j�	d�|_|j
d7_
d|_dt|j
�dt
_|j
d	dkrGt
�d
�dSdS)zRead a line from elyxer.filerrTz

r�F�Line r���ParsingN)rgrlr�r�rh�StreamReaderWriterr�rrk�rstriprrjr�rrr
r�rrrrl�s�zLineReader.readlinecCs*|jr|j|jkrdS|jr|��|jS)z Find out if the file is finishedT)rirrjrlrkr�rrr�finished�s
zLineReader.finishedcC�|j��dSrx�rgrTr�rrrrT��zLineReader.closeN)rrr r!r|rrrtr	r
rlrzrTrrrrrd�srdc@s<eZdZdZdZdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
S)�
LineWriterz"Writes a file as a series of listsFcCs$t|t�r
||_d|_dS||_dSrx)r�rgro�r{rorrrr|�s


zLineWriter.__init__cCsF|D]}t|t�st�dt|�dt|��dS|�|�qdS)zWrite a list of stringszNot a string: � in N)r��
basestringrrr��writestring)r{�stringsr�rrrr�s
�zLineWriter.writecCsH|jst�|jdd�|_|jtjkrtjdkr|�d�}|j�|�dS)zWrite a string�wrrN)	rgrhrSror	r
rrrr�rrrr��s

zLineWriter.writestringcCs|�|d�dS)zWrite a line to filerN)r��r{rrrr�	writeline��zLineWriter.writelinecCr{rxr|r�rrrrT�r}zLineWriter.closeN)
rrr r!rgr|rr�r�rTrrrrr~�sr~c@s�eZdZdZdZdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
d�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd,d%d&�Zd-d(d)�Zd*d+�Zd'S).�Globablez�A bit of text which can be globbed (lumped together in bits).
  Methods current(), skipcurrent(), checkfor() and isout() have to be
  implemented by subclasses.FcC�t�|_dSrx)�
EndingList�
endinglistr�rrrr|�zGlobable.__init__cCs,|��rdSt|���dkr|��dSdS)z*Check for a Unicode byte mark and skip it.Ni��)rz�ordr��skipcurrentr�rrr�
checkbytemarks
�zGlobable.checkbytemarkcC�t�d�dS)z+Find out if we are out of the position yet.zUnimplemented isout()T�rrr�rrr�isout�
zGlobable.isoutcCr�)zReturn the current character.zUnimplemented current()r+r�r�rrrr�r�zGlobable.currentcCr�)z3Check for the given string in the current position.zUnimplemented checkfor()Fr�r�rrr�checkforr�zGlobable.checkforcCs(|��r|js|j��dS|j�|�S)z*Find out if the current text has finished.T)r��leavependingr��checkpending�checkinr�rrrrz$s

zGlobable.finishedcCr�)�)Return the current character and skip it.zUnimplemented skipcurrent()r+r�r�rrrr�,r�zGlobable.skipcurrentcCs0d}|��s|�r||��7}|��s|�s	|S)z>Glob a bit of text that satisfies a check on the current char.r+)rzr�)r{�currentcheck�globrrrr�1s
�z
Globable.globc����fdd��S)zGlob a bit of alpha textc������Srx�r��isalpharr�rrr�:r�z$Globable.globalpha.<locals>.<lambda>�r�r�rr�r�	globalpha8r�zGlobable.globalphacr�)zGlob a row of digits.cr�rx�r��isdigitrr�rrr�>r�z%Globable.globnumber.<locals>.<lambda>r�r�rr�r�
globnumber<r�zGlobable.globnumbercCs |����s|��dkrdSdS)z5Return if the current character is alphanumeric or _.r�TF)r��isalnumr�rrr�isidentifier@szGlobable.isidentifiercC�|�|j�S)z Glob alphanumeric and _ symbols.)r�r�r�rrr�globidentifierF�zGlobable.globidentifiercCs&	|����r	dS|��dvrdSdS)z5Return if the current character is a value character:Fz{}()T�r��isspacer�rrr�isvalueJszGlobable.isvaluecCr�)z'Glob a value: any symbols but brackets.)r�r�r�rrr�	globvalueSr�zGlobable.globvaluecr�)z(Skip all whitespace at current position.cr�rxr�rr�rrr�Yr�z$Globable.skipspace.<locals>.<lambda>r�r�rr�r�	skipspaceWr�zGlobable.skipspacecs&����fdd���}����|S)z4Glob a bit of text up to (including) the magic char.cs����kSrx�r�r��	magiccharr{rrr�]r�z(Globable.globincluding.<locals>.<lambda>)r��skip)r{r�r�rr�r�
globincluding[s
zGlobable.globincludingcs����fdd��S)z?Glob a bit of text up until (excluding) any excluded character.cs����vSrxr�r��excludedr{rrr�cr�z(Globable.globexcluding.<locals>.<lambda>r�)r{r�rr�r�
globexcludingar^zGlobable.globexcludingcCs|j�||�dS)zPush a new ending to the bottomN)r��add�r{r�optionalrrr�
pushendinger�zGlobable.pushendingNcCsN|��r	|jr	|S|j�|�}|r ||kr t�d|d|�|�|�|S)z,Pop the ending found at the current positionzExpected ending z, got )r�r�r��poprrr�)r{�expectedrrrr�	popendingis
zGlobable.popendingcCs|j�|�}|s
dS|jS)z$Return the next ending in the queue.N)r��
findendingr)r{�
nextendingrrrr�sszGlobable.nextending�Frx)rrr r!r�r|r�r�r�r�rzr�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr�s.	


r�c@sdeZdZdZdd�Zddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zej
dkr0eZdSdS)r�zA list of position endingscCs
g|_dSrx)r�r�rrrr|}r}zEndingList.__init__FcCs|j�t||��dS)zAdd a new ending to the listN)r�r��PositionEndingr�rrrr��r>zEndingList.addcCs|j|jj7_dS)z/Pick any pending endings from a parse position.N)r�r��r{�posrrr�pickpending�r>zEndingList.pickpendingcCs|�|�rdSdS)zSearch for an endingTF)r�r�rrrr��s
zEndingList.checkincCs�|��rt�d�dS|�|�}|st�d|���dSt|j�D]}|j�|�||kr3|jS|j	s=t�d|�q"t�d�dS)z)Remove the ending at the current positionzNo ending out of boundsr+z
No ending at zRemoved non-optional ending zNo endings left)
r�rrr�r��reversedr�r,rr�)r{r�r�eachrrrr��s 


�
zEndingList.popcCsLt|j�dkr	dStt|j��D]\}}|�|�r|S|js#dSqdS)z'Find the ending at the current positionrN)rr��	enumerater�r�r�)r{r�rYrrrrr��s
�zEndingList.findendingcCs,t|j�dkrt�dt|�d�dSdS)z&Check if there are any pending endingsrzPending z
 left openN)rr�rrr�r�rrrr��s�zEndingList.checkpendingcCsBd}|jD]
}|t|�d7}qt|j�dkr|dd�}|dS)�Printable representationz	endings [rcrNrr�)r�r�r)r{r�rrrrr��s
zEndingList.__unicode__rNr�)rrr r!r|r�r�r�r�r�r�r�r	rr�rrrrr�zs

	�r�c@�:eZdZdZdd�Zdd�Zdd�ZejdkreZ	d	Sd	S)
r�z An ending for a parsing positioncCs||_||_dSrx�rr�r�rrrr|��
zPositionEnding.__init__cC�|�|j�S)zCheck for the ending)r�rr�rrrr��r�zPositionEnding.checkincCsd|j}|jr|d7}|S)r�zEnding z (optional)r�r�rrrr��s
zPositionEnding.__unicode__rN)
rrr r!r|r�r�r	rr�rrrrr��s
�r�c@sneZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zej
dkr-eZdd�Zdd�ZdS)�Positionz�A position in a text to parse.
  Including those in Globable, functions to implement by subclasses are:
  skip(), identifier(), extract(), isout() and current().cCst�|�dSrx)r�r|r�rrrr|�r}zPosition.__init__cCr�)z
Skip a stringzUnimplemented skip()Nr�r�rrrr���z
Position.skipcCr�)z.Return an identifier for the current position.zUnimplemented identifier()�Errorr�r�rrr�
identifier�r�zPosition.identifiercCs	t�d�dS)zHExtract the next string of the given length, or None if not enough text,zUnimplemented extract()Nr��r{�lengthrrrr�s
zPosition.extractcCs||�t|��kS)z)Check for a string at the given position.)rrr�rrrr��r�zPosition.checkforcCs0|�t|��}|sdS|��|�t|����kS)z!Check for a string in lower case.F)rr�lower)r{r�rnrrr�
checkforlower�szPosition.checkforlowercCs|��}|�|�|S)r�)r�r��r{r�rrrr��s
zPosition.skipcurrentcCs|��|��S)z3Advance the position and return the next character.)r�r�r�rrr�__next__�szPosition.__next__rcCs|�|�sdS|�|�dS)z;Check for a string at the given position; if there, skip itFT)r�r�r�rrr�	checkskips

zPosition.checkskipcCst�|d|���dS)z2Show an error message and the position identifier.rN)rrr�)r{r
rrrr
rzPosition.errorN)rrr r!r|r�r�rr�r�r�r�r	rr[r�rrrrrr��s
r�c@�@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)�TextPositionz%A parse position based on a raw text.cCs"t�|�d|_||_|��dS)z*Create the position from elyxer.some text.rN)r�r|r�rr��r{rrrrr|s
zTextPosition.__init__cCs|jt|�7_dS)�Skip a string of characters.N)r�rr�rrrr�r>zTextPosition.skipcCsFd}|j|t|j�krt|j�|j}d|j|j|j|�dS)z&Return a sample of the remaining text.�rj�r�rrr�rrrr�szTextPosition.identifiercCs|jt|j�kS)�'Find out if we are out of the text yet.r�r�rrrr�#�zTextPosition.isoutcCs|j|jS)�6Return the current character, assuming we are not out.)rr�r�rrrr�'r�zTextPosition.currentcCs.|j|t|j�krdS|j|j|j|�S�zHExtract the next string of the given length, or None if not enough text.Nr�r�rrrr+szTextPosition.extractN)
rrr r!r|r�r�r�r�rrrrrr�sr�c@�XeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�ZdS)�FilePositionz-A parse position based on an underlying file.cCs&t�|�t|�|_d|_|��dS)z Create the position from a file.rN)r�r|rdrr�r�rrrrr|4s

zFilePosition.__init__cCsnt|�}|j|t|j���kr.|t|j���|jd8}|��|j|t|j���ks|j|7_dS)r�r�N)rr�rr	r
)r{r�r�rrrr�;s�zFilePosition.skipcC�
|j��S)z,Get the current line of the underlying file.)rr	r�rrrr	Cr[zFilePosition.currentlinecCs|j��d|_dS)zGo to the next line.rN)rr
r�r�rrrr
G�

zFilePosition.nextlinecCs|jjdS)z#Return the line number of the file.r�)rrr�rrrrLr�zFilePosition.linenumbercCsL|j��d|jd�}|j��|jd�}dt|���d|d|S)z4Return the current line and line number in the file.Nr�zline rrj)rr	r�r��
getlinenumber)r{�before�afterrrrr�Ps zFilePosition.identifiercCs`|jt|j���kr+|jt|j���dkr't�d|j��dt|j��|��|j��S)r�r��Out of the line r)	r�rrr	rrr�r
rzr�rrrr�Vs
"
zFilePosition.isoutcCsb|jt|j���krdS|jt|j���kr)t�d|j��dt|j��dS|j��|jS)r�rr�rrj)r�rrr	rrr�r�rrrr�^s"zFilePosition.currentcCs6|j|t|j���krdS|j��|j|j|�Sr�)r�rrr	r�rrrrgszFilePosition.extractN)
rrr r!r|r�r	r
rr�r�r�rrrrrr�1s	r�c@s�eZdZdZdZdZdZdd�Zdd�Zdd�Z	d	d
�Z
ejfdd�Z
d
d�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd+d d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zejd*kreeZdSdS),�	Containerz.A container for text and objects in a lyx fileNcCr�rx)r�rr�rrrr|vr�zContainer.__init__cCr?)�Process contentsNrr�rrrr�yr$zContainer.processcCs4|j�|�}t|t�rt�d|�|g}|�|�S)zGet the resulting HTMLzRaw string )rr=r�r�rr�	escapeall)r{r�rrrr=}s


zContainer.gethtmlcCsdg}|D]+}tjr|�|tj�}tjr |�|tj�}|�|�}n
tjs*|�|tj�}|�|�q|S)z=Escape all lines in an array according to the output options.)	r�r��escaper�r��escapeentitiesr�r�r�)r{�linesr�rrrrr��szContainer.escapeallcCs2t|���}|D]}||vr|�|||�}q|S)z1Escape a line with replacements from elyxer.a map)�sorted�keysr�)r{r�replacements�pieces�piecerrrr��s�zContainer.escapecCs�d}t|�}|��sCt|���dkr5tt|����}|dkr(ttt|��d�}|d|dd�d7}n||��7}|��|��r
|S)	z/Escape all Unicode characters to HTML entities.r+��0xd835i�z&#r�Nrv)r�rzr�r��hexr[r�)r{rr�r��	codepointrrrr��s�	zContainer.escapeentitiescsg�|�|�fdd���S)z2Search for all embedded containers of a given typecs
��|�Srx)r��r�r�rrr���
z%Container.searchall.<locals>.<lambda>)�
searchprocess�r{r�rr�r�	searchall�szContainer.searchallcCs&|�|�}|D]	}|jj�|�q|S)z3Search for all containers of a type and remove them)r�rrr,)r{r�r�rrrr�searchremove�s
zContainer.searchremovecs|��fdd�|�dS)z4Search for elements of a given type and process themcs
t|��Srx)r�r��r�rrr��r�z)Container.searchprocess.<locals>.<lambda>N)�
locateprocess)r{r�r�rr�rr��r�zContainer.searchprocesscCs,|jD]}|�||�||�r||�qdS)z3Search for all embedded containers and process themN)rr)r{rr�rrrrr�s
��zContainer.locateprocesscCs6|jD]}||�r|�|||�||�r||�qdS)z,Perform a recursive search in the container.N)rr)r{rrr�rrrrr�s
��zContainer.recursivesearchcCs,d}ttj��|�}|D]}||j7}q|S)z0Extract all text from elyxer.allowed containers.r+)r�r;r�rr�)r{r�r��constantrrrr��s
zContainer.extracttextcCs�|t|j�kr	dSt|j|d�rdS|t|j�krD||j|�rDd|j|_|j�|j|�|j�|�|t|j�krD||j|�s!|j�||�dS)z*Group some adjoining elements into a groupN�groupedT)rrr�rr�r�r�)r{rYrM�	isingrouprrrrM�s�zContainer.groupcCsN|j|}|j�|�t|j�dkr%|j�||j���t|j�dksdSdS)z)Remove a container but leave its contentsrN)rr�rr�)r{rYrrrrr,�s

�zContainer.removercCs4t�d|t|��|jD]	}|�|d�qdS)zShow in a treer#r�N)rrr�r�tree)r{�levelrrrrr�s
�zContainer.treecC�||jvrdS|j|S)z)Get the value of a parameter, if present.N)r�r�rrr�getparameter��

zContainer.getparametercCs|�|�}|s	gS|�d�S)z7Get the value of a comma-separated parameter as a list.rc)rr�)r{r��	paramtextrrr�getparameterlist�s

zContainer.getparameterlistcCs&|j}|r|j��rdS|j}|sdS)z&Check if the parent's output is empty.TF)rrr@r�rrr�hasemptyoutput�s
�zContainer.hasemptyoutputcCs$|js|jjS|jjdt|j�S)zGet a descriptionrf)r�r�rr�r�rrrr�	szContainer.__unicode__r)r)rrr r!�partkeyrr�r|r�r=r�r�r�r�r�r�r�r�rrr�rMr,rrr
rr�r	rr�rrrrr�os6	
	
�r�c@r)rqz)A container that does not output anythingcCst�|_t�|_g|_dSrx)r r�rBrrr�rrrr|	�
zBlackBox.__init__N�rrr r!r|rrrrrq	r&rqc@r)r�zRead the lyxformat commandcCsTt|jd�}|dkrt�dt|��|ttjd�kr(t�dt|��dSdS)zShow warning if version < 276r�iz(Warning: unsupported old format version r�z(Warning: unsupported new format version N)r�r
rr�strr�r�)r{r�rrrr�	s�zLyXFormat.processN�rrr r!r�rrrrr�	r&r�c@sVeZdZdZdZdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
d�Z
ejdkr)e
Z
dSdS)rTzA container for a single stringNcCst�|_t�|_d|_dS)Nr+)r5r�r`rr�r�rrrr|$	r
zStringContainer.__init__cCs"|jr|�|j�|_d|_dSdS)z/Replace special chars from elyxer.the contents.N)�parsed�replacespecialr�r�rrrr�)	s
�zStringContainer.processcCsf|�|tj�}|�|�}tjd|vr1t|�dkr1|jr&dt|j�d}nd}t	�
||���|S)z,Replace all special chars from elyxer.a liner�r�zUnknown command at rzUnknown command: )r�r�r��
changeliner;r�rr�r�rrr)r{rr:r
rrrr/	s
zStringContainer.replacespecialcCs2|�|tj�}tjd|vr|S|�|tj�}|S)Nr�)r�r�r�r;r�r�r�rrrr<	s
zStringContainer.changelinecC�|jS)zReturn all text.rar�rrrr�C	rEzStringContainer.extracttextcCsXd}|jr|dt|j�7}d}t|j���dkrd}|d|j��dd�|dS)	�"Return a printable representation.rTrfz...�r+r�Nr�)r�r�rr�r)r{r��ellipsisrrrr�G	s"zStringContainer.__unicode__r)rrr r!rr|r�rrr�r�r	rr�rrrrrT	s


�rTc@�2eZdZdZdd�Zdd�ZejdkreZdSdS)rUzA constant stringcCsg|_||_t�|_dSrx)rr�r`rr�rrrr|X	szConstant.__init__cC�
d|jS)Nz
Constant: rar�rrrr�]	r}zConstant.__unicode__rN�	rrr r!r|r�r	rr�rrrrrUU	s
�rUc@sJeZdZdZdZdd�Zd
dd�Zd
dd	�Zd
d�Ze	j
dkr#eZdSdS)rXzText inside a tagNcCst|�|_t�|_dSrx)r'r�rJrr�rrrr|i	s
zTaggedText.__init__FcCs||_||j_||j_|S)z&Complete the tagged text and return it)rrrKrL�r{rrKrLrrr�completem	szTaggedText.completecCst|�}|�|g||�S)z(Complete the tagged text with a constant)rUr)r{rrKrLrrrrrt	�zTaggedText.constantcCs,t|jd�sdS|jjsdSd|jjdS)rrKzEmtpy tagged textzTagged <unknown tag>zTagged <r�)r�rrKr�rrrr�y	s
zTaggedText.__unicode__rr�)rrr r!rr|rrr�r	rr�rrrrrXd	s


�rXc@s4eZdZdZdZdZdZdZdZdZ	dZ
dZdZdS)�DocumentParametersz#Global parameters for the document.NF�
r)
rrr r!r��indentstandardr��
startinglevel�maxdepthr�rUr��displaymoderrrrr�	src@r�)�
FormulaParserzParses a formulacCsR|jd|_|�|�}|s&|��|�|�}|s&t�d|�����dgS|gS)�See if the formula is inlinedr�zUnknown formula type in �unknown)rr��	parsetyper
rrr	r)r{rr�rrrr�	s

zFormulaParser.parseheadercCst|���tjd�dkrdS|���tjd�dkrdS|���tjd�dkr*dS|���tjd�dkr8dSd	S)
z)Get the formula type from the first line.ror�inliner7�blockrprl�numberedN)r	�findr�r�r"rrrr'�	szFormulaParser.parsetypecCsd|�|�}|���|j�s,|����}t|�dkr t�d|�|��|���|j�r
|��|S)�Parse the formula until the endrzUnparsed formula line )	�parseformular	r�rrrrrr
)r{r�formula�strippedrrrr#�	s
�zFormulaParser.parsecCs�tjd}||��vr'|���|d�d}||vr |�|||�S|�|||�Stjd|��vr=|�|tjdtjd�Stjd}tjd}||��vr�|�����|�r�|����}|�|�d�|�}||d|}tjd}	tjd}
|	|d|
}||�|||�|St	�
d	|d
|���dStjd}tjd
}
||��vr�|
|��vr�tjd
}|�||
|�St	�
d|��d�dS)zParse the formula contentsror�r7rlrkrr9r8zMissing r�r+rmr6zFormula beginning z is unknown)r�r�r	r��parsesingleliner�parsemultilinerr�rr�rr)r{rro�restrlrkr��endsplit�
startpiecer9r8�endpiece�begincommand�beginbracket�
endbracketrrrr-�	s<
�






zFormulaParser.parseformulacCs�|����}||vrt�d|d|�dS|�|�s)t�d|d|�dS|�|�}||t|�t|��}|��|S)zParse a formula in one lineru�  does not contain formula start r+zFormula z does not end with )r	rrrr�rYrr
)r{r�startrrrYr2rrrr0�	s

zFormulaParser.parsesinglelinercCs�d}|��}||vrt�d|��d|�dS|�|�}||t|�d���}|�|�sB||d7}|��|��}|�|�r/||dt|��7}|��|S)z!Parse a formula in multiple linesr+rur9Nr)r	rrrrYrr�r
)r{rr:rr.rrYrrrr1�	s


�zFormulaParser.parsemultilinerN)
rrr r!rr'r#r-r0r1rrrrr$�	s#r$c@r4)�MacroParserzA parser for a formula macro.cCs|jd|_dgS)r%r�r(r6r"rrrr
szMacroParser.parseheadercCs |�||jj|j�}|��|S)r,)r1rr:rr
)r{rr.rrrr#
szMacroParser.parseNr7rrrrr;�	r8r;c@sfeZdZdZdZdZdZdd�Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
ejdkr1e
ZdSdS)�
FormulaBitzA bit of a formulaNr�r+cCsg|_t�|_dS)z6The formula bit type can be 'alpha', 'number', 'font'.N)rrGrr�rrrr|
�zFormulaBit.__init__cCrO)z!Set the internal formula factory.)r)r{rrrr�
setfactory
rQzFormulaBit.setfactorycCs&|j�|�|j|j7_||_dS)z-Add any kind of formula bit already processedN)rr�r�r�r{�bitrrrr�
s
zFormulaBit.addcCs:|j|7_|�|�st�d|d|���dSdS)z0Skip a string and add it to the original formulazString z not at N)r�r�rrr�)r{r�r�rrr�skiporiginal%
s
�zFormulaBit.skiporiginalcCs.t|j�dkr	dStdd�|jD��|_|jS)zDCompute the size of the bit as the max of the sizes of all contents.rr�cS�g|]}|j�qSr�r*��.0rIrrr�
<listcomp>/
�z*FormulaBit.computesize.<locals>.<listcomp>)rrrr*r�rrr�computesize+
szFormulaBit.computesizecCs|j�|j�S�zReturn a copy of itself.)rr-r�r�rrrr�2
r�zFormulaBit.clonecCs|jjd|jS)zGet a string representationz	 read in )r�rr�r�rrrr�6
r�zFormulaBit.__unicode__r)rrr r!r�r*r�r|r>r�rArHr�r�r	rr�rrrrr<
s
�r<c@s*eZdZdZdd�Zd
dd�Zdd�Zd	S)�	TaggedBitzA tagged string in a formulacCs t��|�|_|�t|��|S�zSet the constant and the tag)rJrNrr�rV)r{rrKrrrrA
szTaggedBit.constantFcCs||_t��||�|_|SrK)rrJrNrrrrrrG
szTaggedBit.completecCst�j|dd�|_|S)z4Set the self-closing tag, no contents (as in <hr/>).T)rM)rJrNr�r{rKrrr�selfcompleteM
szTaggedBit.selfcompleteNr�)rrr r!rrrMrrrrrJ>
s

rJc@r�)rVzA constant string in a formulacCs"t�||�||_d|_d|_dS)zSet the constant stringr�N)rUr|r�r*r�r�rrrr|U
s
zFormulaConstant.__init__cCr)z+Compute the size of the constant: always 1.rCr�rrrrH\
rEzFormulaConstant.computesizecC�
t|j�SrI)rVr�r�rrrr�`
r[zFormulaConstant.clonecCr)rzFormula constant: rar�rrrr�d
r[zFormulaConstant.__unicode__rN)rrr r!r|rHr�r�r	rr�rrrrrVR
s
�rVc@r4)r]zA bit of text inside a formulacC�|����S)zDetect a bit of raw textr�r�rrr�detecto
r�zRawText.detectcCs |��}|�t|��d|_dS)zParse alphabetic textr0N)r�r�rVr�)r{r�r0rrr�parsebits
s
zRawText.parsebitN�rrr r!rPrQrrrrr]l
rAr]c@s8eZdZdZejZejdZdd�Zdd�Zdd�Z	d	S)
rhzA symbol inside a formularscCs(|��tjvr	dS|��tjvrdSdS)zDetect a symbolTF)r�rhr�r�r�rrrrP
s
zFormulaSymbol.detectcCsd|��tjvr|�|��|�dS|��tjvr%|�tj|��|�dSt�d|��d�dS)�Parse the symbolNzSymbol �
 not found)r�rhr��	addsymbolr�rrr�rrrrQ�
szFormulaSymbol.parsebitcCs$|�|��|�|j�t|��dS)zAdd a symbolN)rAr�rr�rV)r{�symbolr�rrrrU�
szFormulaSymbol.addsymbolN)
rrr r!r�r�r�rPrQrUrrrrrhy
s

rhc@r4)r_zA string of digits in a formulacCrO)zDetect a digitr�r�rrrrP�
r�zFormulaNumber.detectcs*���fdd��}|�t|��d|_dS)zParse a bunch of digitscr�rxr�r�r�rrr��
r�z(FormulaNumber.parsebit.<locals>.<lambda>r�N)r�r�rVr�)r{r��digitsrrWrrQ�
s
zFormulaNumber.parsebitNrRrrrrr_�
rAr_c@s*eZdZdZejdZdd�Zdd�ZdS)rCz*A LaTeX comment: % to the end of the line.rncCs|��|jkS)z
Detect the %.)r�r:r�rrrrP�
r�zComment.detectcCs|j|�d�7_dS)zParse to the end of the line.rN)r�r�r�rrrrQ�
r�zComment.parsebitN)	rrr r!r�r�r:rPrQrrrrrC�
s

rCc@r�)
�
WhiteSpacez"Some white space inside a formula.cCrO)zDetect the white space.r�r�rrrrP�
r�zWhiteSpace.detectcCs|j|��7_dS)zParse all whitespace.N)r�r�r�rrrrQ�
r>zWhiteSpace.parsebitcCsd|jdS)rz
Whitespace: *rj)r�r�rrrr��
r�zWhiteSpace.__unicode__rN)
rrr r!rPrQr�r	rr�rrrrrY�
s
�rYc@sleZdZdZejdZejdZdd�Z	dd�Z
dd�Zd	d
�Zdd�Z
d
d�Zdd�Zdd�Zdd�ZdS)r\zA {} bracket inside a formular6cCst�|�d|_dS)z'Create a (possibly literal) new bracketN)r<r|�innerr�rrrr|�
r�zBracket.__init__cCr�)zDetect the start of a bracket)r�r:r�rrrrP�
r�zBracket.detectcC�|�||j�|S)zParse the bracket)�
parsecomplete�innerformular�rrrrQ�
�zBracket.parsebitcCr[)zParse a text bracket)r\�	innertextr�rrr�	parsetext�
r^zBracket.parsetextcCr[)zParse a literal bracket)r\�innerliteralr�rrr�parseliteral�
r^zBracket.parseliteralcCsp|�|j�st�d|jd|���dS|�|j|�|�|j�||�|j|�	|j�7_|�
�dS)zParse the start and end markszBracket should start with z at N)r�r:rrr�rAr�rr�r�rH)r{r��innerparserrrrr\�
szBracket.parsecompletecC�*|��s|�|j�|��|��rdSdS)z(Parse a whole formula inside the bracketN�rzr�r�parseanyr�rrrr]�
��zBracket.innerformulacCs�ttj���}|�tjd�|�tjd�|�tj�|��sL|�	�|vr=|�
|j�|��|�
d�r<|jd7_n	|�
t|����|��r!dSdS)z<Parse some text inside the bracket, following textual rules.rmr6r�N)r�r�r�r�r�r�rCr:rzr�r�rrfr�r�rVr�)r{r��specialcharsrrrr_�
s
��zBracket.innertextcCsrd|_|��s/|��|jks/|��|jkr|�|�n	|j|��7_|��s/|��|jkr|j|j7_dS)zAParse a literal inside the bracket, which does not generate HTML.r+N)�literalrzr�rr:rbr�r�r�rrrra�
s�zBracket.innerliteralN)rrr r!r�r�r:r�rr|rPrQr`rbr\r]r_rarrrrr\�
s

r\c@s,eZdZdZejdZejdZdd�Z	dS)�
SquareBracketzA [] bracket inside a formular:cCst�}|j|_|S)z3Return a new square bracket with the same contents.)rjr)r{r6rrrr�szSquareBracket.cloneN)
rrr r!r�r�r:r�rr�rrrrrj	s


rjc@r)�MathsProcessorzAA processor for a maths construction inside the FormulaProcessor.cCr;)z$Process an element inside a formula.zUnimplemented process() in Nr<�r{rrYrrrr�r>zMathsProcessor.processcCsd|jjS)zReturn a printable description.zMaths processor )r�rr�rrrr�r�zMathsProcessor.__unicode__rN)	rrr r!r�r�r	rr�rrrrrk�
�rkc@sDeZdZdZgZdd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dS)�FormulaProcessorz&A processor specifically for formulas.cCs"|�|�|�|�|�|�dS)z7Process the contents of every formula bit, recursively.N)�processcontents�processinsides�
traversewholer?rrrr�*s

zFormulaProcessor.processcCs0t|t�sdS|��|jD]}|�|�qdS)z&Process the contents of a formula bit.N)r�r<r�rro)r{r@rIrrrro0s

�z FormulaProcessor.processcontentscCsJt|t�sdSt|j�D]\}}|jD]	}|�|j|�q|�|�qdS)z8Process the insides (limits, brackets) in a formula bit.N)r�r<r�r�
processorsr�rp)r{r@rYrI�	processorrrrrp8s

�zFormulaProcessor.processinsidescCsbd}|�|�D]'\}}|jdkr|�||�n|jdkr,|r,|jdkr,|j�dtd��|}qdS)z>Traverse over the contents to alter variables and space units.Nr0�fontr�rr�)�traverser��	italicizerr�rV)r{r.�lastr@rrrrrqBs
�zFormulaProcessor.traversewholeccsP�|jD]!}t|d�r|jr||jfVqt|t�r%|�|�D]}|VqqdS)zHTraverse a formula and yield a flattened structure of (bit, list) pairs.r�N)rr�r�r�r<ru)r{r@rI�pairrrrruLs�

��zFormulaProcessor.traversecCs"|�|�}t��|gd�||<dS)z Italicize the given bit of text.rBN)rYrJr)r{r@rrYrrrrvUs
zFormulaProcessor.italicizeN)rrr r!rrr�rorprqrurvrrrrrn%s

	rnc@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�ZejdkrGeZdSdS) r[zA LaTeX formulacC�t�|_t��d�|_dS)Nzspan class="formula")r$r�rJrNrr�rrrr|`�zFormula.__init__cCsl|jddkrdt_n
dt_|j�dd�tjr|��dStjr'|��dStjr0|��dS|�	�dS)zConvert the formula to tagsrr(FTzdiv class="formula"N)
r
rr#rrNr�r�r�rx�classicr�rrrr�dszFormula.processcCs>|jddkrt��d�|_nt��d�|_t|j�g|_dS)zMake the contents for jsMath.rr(zdiv class="math"zspan class="math"N)r
rJrNrrUrrr�rrrr�tszFormula.jsmathcCs@d|j_d}|jddkr|d7}t��|j|dd�g|_dS)	zMake the contents for MathJax.zspan class="MathJax_Preview"zscript type="math/texrr(z
;mode=displayrwTN)rrKr
rXrrrrLrrrr�|s
zFormula.mathjaxcCs:tjdt|j�}d|d|jd}t|�g|_dS)zIMake the contents using Google Charts http://code.google.com/apis/chart/.rxz<img class="chart" src="z" alt="z"/>N)r�r�rrrUr)r{�url�imgrrrrx�szFormula.googlechartscCs,t��|j�}t��|�||_|g|_dS)zEMake the contents using classic output generation with XHTML and CSS.N)�FormulaFactoryr-rrnr�rr)r{�wholerrrr{�szFormula.classiccCsr|�d�r|�|�n(|�d�r|�|�n|�d�r"|�|d�n|�d�r.|�|d�n|�d�|��|S)z4Parse using a parse position instead of self.parser.z$$r�z\(z\)rir5zUnparseable formula)r��parsedollarblock�parsedollarinline�
parseinlineto�parseblocktorr�r�rrrr#�s




z
Formula.parsecCsdg|_|�|�dS)zParse a $...$ formula.r(N)r
�parsedollarr�rrrr��szFormula.parsedollarinlinecCs.dg|_|�|�|�d�s|�d�dSdS)zParse a $$...$$ formula.r)r�z1Formula should be $$...$$, but last $ is missing.N)r
r�r�rr�rrrr��s


�zFormula.parsedollarblockcCs$|�d�|�d�|_|�d�dS)zParse to the next $.r�N)r�r�rr�r�rrrr��s
zFormula.parsedollarcC�dg|_|�||�dS)zParse a \(...\) formula.r(N�r
�	parseupto�r{r��limitrrrr��rzFormula.parseinlinetocCr�)zParse a \[...\] formula.r)Nr�r�rrrr��rzFormula.parseblocktocCs(|�|�|�dd��|_|�|�dS)z1Parse a formula that ends with the given command.cSr?�NTrrrrrr��sz#Formula.parseupto.<locals>.<lambda>N)r�r�rr�r�rrrr��s
zFormula.parseuptocCs"|jr|jjrd|jjdSdS)rz	Formula (r�zUnnumbered formula)rr�r�rrrr��szFormula.__unicode__rN)rrr r!r|r�r�r�rxr{r#r�r�r�r�r�r�r�r	rr�rrrrr[]s&
�r[c@r4)�WholeFormulazParse a whole formulacCs
|��S)z"Not outside the formula is enough.)rzr�rrrrP�r[zWholeFormula.detectcCrd)zParse with any formula bitNrer�rrrrQ�rgzWholeFormula.parsebitNrRrrrrr��rAr�c@steZdZdZeeeeee	gZ
ee	gZdZdd�Z
dd�Zdd�Zd	d
�Zdd�Zd
d�Zdd�Zdd�Zdd�ZdS)r~zConstruct bits of formulaFcCst�|_dS)z Initialize the map of instances.N)r��	instancesr�rrrr|�r�zFormulaFactory.__init__cCs|��rdS|�|��|�S)zDetect a bit of a given type.F)rzr�rP)r{r�r�rrr�
detecttype�szFormulaFactory.detecttypecCs.||jvs
|j|s|�|�|j|<|j|S)z"Get an instance of the given type.)r�r�r�rrrr��s
zFormulaFactory.instancecCst�|��|�S)z+Create a new formula bit of the given type.)r�r�r>r�rrrr��r�zFormulaFactory.createcCs"|��s|�|�sdS|��rdS)zClear any skipped types.N)rz�skipanyr�rrr�clearskipped�s

�zFormulaFactory.clearskippedcCs0|jD]}|�|��|�r|�||�SqdS)zSkip any skipped types.N)�skippedtypesr�rPr'�r{r�r�rrrr��s

�zFormulaFactory.skipanycCsL|j|jD]}|�||�r|�||�Sqt�d|���t|���S)z.Parse any formula bit at the current location.zUnrecognized formula at )	�typesr�r�r'rrr�rVr�r�rrrrfs�zFormulaFactory.parseanycCs0|�|�}d|j|<|�|�}|r|�|�S|S)z#Parse the given type and return it.N)r�r�rQr>)r{r�r�r@�returnedbitrrrr'
s



zFormulaFactory.parsetypecCs\t|�}|�t�}|�|�r|�|�|S|��s,t�d|���|�	t
��|d��|S)z5Parse a string of text that contains a whole formula.zUnknown formula at: �span class="unknown")r�r�r�rPrQrzrrr�r�rJr)r{r.r�rrrrr-s


zFormulaFactory.parseformulaN)rrr r!rhr]r_r\rCrYr�r��definingr|r�r�r�r�r�rfr'r-rrrrr~�s	r~c@sFeZdZdZ	dZdd�Zee�Zdd�Zdd�Zd	d
�Z	dd�Z
dS)
�
Translatorz=Reads the configuration file and tries to find a translation.NcCs|j�|�S)z%Get the translated message for a key.)r��
getmessage)rr�rrr�	translate'r�zTranslator.translatecCsd|_d|_dSr�)�translation�firstr�rrrr|-r�zTranslator.__init__cCs�d|_tjs
t�d�dStjtjvrt�dtj�dStjtjdkr'dStjtjg}zt�dd|�|_WdSt	yLt�dt
|��YdSw)z/Find the translation for the document language.NzNo language in documentzUnknown language rg�elyxerzNo translation for )�	langcodesrr�rrrRrv�gettextr��IOErrorr�)r{r�rrr�findtranslation1s
�zTranslator.findtranslationcCsP|jr
|��d|_|�|�}|js|Sz	|j�|�}W|Sty'Y|Sw)z-Get the translated message for the given key.F)r�r��getuntranslatedr��ugettextr�)r{r�r
rrrr�Bs
��zTranslator.getmessagecCs&|tjvrt�d|�|Stj|S)zGet the untranslated message.zCannot translate )rRr�rr�r{r�rrrr�Ps

zTranslator.getuntranslated)rrr r!r�r�r"r|r�r�r�rrrrr�!sr�c@s�eZdZdZ	dZdZdZdZdZe	j
dZgd�Zdd�Z
dd	�Zd
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZejdkrSeZdSdS)�
NumberCounterz#A counter for numbers (by default).N�ABCDEFGHIJKLMNOPQRSTUVWXYZr�)
)�Mrv)�CMi�)�Di�)�CDi�)�C�d)�XC�Z)�L�2)�XL�()�Xr)�IX�	)�V�)�IV�)�Ir�cCrs)zGive a name to the counter.N)r�r�rrrr|lr[zNumberCounter.__init__cCrO)z0Set the counter mode. Can be changed at runtime.)r�)r{r�rrr�setmodeprQzNumberCounter.setmodecCrs)zSet an initial value.N�r��r{r�rrr�initur[zNumberCounter.initcCrN)z$Get the next value as a text string.)r�r�r�rrrr�yr[zNumberCounter.gettextcCr�)zGet the next value as a letter.)�getsequence�lettersr�rrr�	getletter}r�zNumberCounter.getlettercCr�)zGet the next value as a symbol.)r�r�r�rrr�	getsymbol�r�zNumberCounter.getsymbolcCs||jdt|�S)z*Get the next value from elyxer.a sequence.r�)r�r)r{r�rrrr��r>zNumberCounter.getsequencecCs>d}|j}|jD]\}}||kr||||7}||}q|S)z%Get the next value as a roman number.r+)r��
romannumerals)r{r�r��numeralr�rrr�getroman�s�zNumberCounter.getromancCs||jr|jdvr|��S|jdkr|��S|jdkr |����S|jdkr)|��S|jdkr2|��St�d|j�|��S)z8Get the current value as configured in the current mode.)rr��A�ar�rjzUnknown counter mode )r�r�r�r�r�r�rrr�rrr�getvalue�s



zNumberCounter.getvaluecCs"|jsd|_|jd7_|��S)z@Increase the current value and get the next value as configured.rr�)r�r�r�rrr�getnext�szNumberCounter.getnextcC�
d|_dS)zReset the counter.rNr�r�rrr�reset�r[zNumberCounter.resetcCs"d|j}|jr|d|j7}|S)rzCounter z	 in mode )r�r��r{r�rrrr��s
zNumberCounter.__unicode__r)rrr r!r�r�r��masterr�r�r�r�r�r|r�r�r�r�r�r�r�r�r�r�r�r	rr�rrrrr�[s2


�r�c@�(eZdZdZdd�Zdd�Zdd�ZdS)	�DependentCounterz4A counter which depends on another one (the master).cCs||_|j��|_|S)zSet the master counter.)r�r�rw)r{r�rrr�	setmaster�szDependentCounter.setmastercCs2|j|j��kr|��t�|�}|j��|_|S)z8Increase or, if the master counter has changed, restart.)rwr�r�r�r�r�r�rrrr��s

zDependentCounter.getnextcCs|j��dt�|�S)z8Get the value of the combined counter: master.dependent.r8)r�r�r�r�rrrr��r�zDependentCounter.getvalueN)rrr r!r�r�r�rrrrr��s
r�c@s�eZdZdZ				dZdZdd�ejdD�Zdd�ejdD�Z	e
�ZdZdd	�Z
d
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�ZdS)$�NumberGeneratorzMA number generator for unique sequences and hierarchical structures. Used in:NcC�g|]}|���qSr�r��rE�xrrrrF�r�zNumberGenerator.<listcomp>r�cCr�rr�r�rrrrF�r�r�cCs|�dd�S)z.Remove the possible asterisk in a layout type.rjr+)r�r�rrr�
deasterisk�r�zNumberGenerator.deasteriskcCs
|�|�S)z9Find out if the layout type corresponds to a unique part.)�isromanr�rrr�isunique�r[zNumberGenerator.isuniquecC�|�|���|jvS)z9Find out if the layout type should have roman numeration.)r�r��romanlayoutsr�rrrr��r^zNumberGenerator.isromancCr�)z?Find out if the layout type corresponds to an (un)ordered part.)r�r��orderedlayoutsr�rrr�isinordered�r^zNumberGenerator.isinorderedcCs@d|vrdS|�|�r
dS|�|�sdS|�|�tjkrdSdS)zCFind out if the type for a layout corresponds to a numbered layout.rjFT)r�r��getlevelrr"r�rrr�
isnumbered�s

zNumberGenerator.isnumberedcCsd|vS)z5Find out if the type contains an asterisk, basically.rjrr�rrr�isunordered�rbzNumberGenerator.isunorderedcCsR|�|�rdS|�|�st�d|�dS|�|���}|j�|�d}|tj	S)z0Get the level that corresponds to a layout type.rzUnknown layout type r�)
r�r�rrr�r�r�rYrr!)r{r�rrrrr��s


zNumberGenerator.getlevelcCs$	tjr
|�|�dkr
dS|�|�S)z4Obtain the type for the part: without the asterisk, r�rS)r��appendixr�r�r�rrr�getparttype
s
zNumberGenerator.getparttypecCs				|�|���S)z$Generate a number for a layout type.)�
getcounterr�r�rrr�generate
s
zNumberGenerator.generatecCs,|��}||jvr|�|�|j|<|j|S)z#Get the counter for the given type.)r��countersr�r�rrrr�
s

zNumberGenerator.getcountercCsh|�|�r$|�|�dkr$|j�|�}|j|d}|�|�}|�||�St|�}|�|�r2|�d�|S)z$Create a counter for the given type.r�r�)	r�r�r�rYr��createdependentr�r�r�)r{r�rY�abover��counterrrrr�
s


zNumberGenerator.createcCs2||jvs|j|js|�||�|j|<|j|S)zDGet (or create) a counter of the given type that depends on another.)r�r�r��r{r�r�rrr�getdependentcounter*
s
z#NumberGenerator.getdependentcountercCst|��|�S)z,Create a dependent counter given the master.)r�r�r�rrrr�0
r�zNumberGenerator.createdependentcCs.|jtj}|�|�}|�d���dt_dS)zStart appendices here.r�TN)r�rr!r�r�r�r�r�)r{�	firsttyper�rrr�
startappendix4
s

zNumberGenerator.startappendix)rrr r!�	chaptered�	generatorr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr��s4r�c@�eZdZdZ	dd�ZdS)�ChapteredGeneratorz1Generate chaptered numbers, as in Chapter.Number.cCs2	tjdkrtj�|�S|�d�}|�||���S)zBGenerate a number which goes with first-level numbers (chapters). rr�)rr!r�r�r�r�r�r�)r{r��chapterrrrr�?
s


zChapteredGenerator.generateN)rrr r!r�rrrrr�;
�r�c@s�eZdZdZdZdZdZdZdZddd�Z	ddd�Z
dd�Zd	d
�Zdd�Z
d
d�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS)�
ContainerSizezThe size of a container.NcC�|�d|�|�d|�|S)z*Set the proper size with width and height.�width�height��setvalue�r{r�r�rrrr�Y
�zContainerSize.setcCr�)zSet max width and/or height.�maxwidth�	maxheightr�)r{r�r�rrr�setmax_
r�zContainerSize.setmaxcCs2|�|d�|�|d�|�|d�|�|�|S)z*Read some size parameters off a container.r�r��scale)�setparameter�checkvalidheightr(rrr�readparameterse
s

zContainerSize.readparameterscCs|�|�}|�||�dS)z=Read a size parameter off a container, and set it if present.N)rr�)r{rr�r�rrrr�m
s
zContainerSize.setparametercCs"|�|�}|rt|||�dSdS)z6Set the value of a parameter name, only if it's valid.N)�processparameterr��r{r�r�rrrr�r
s
�zContainerSize.setvaluecCs>|�d�}|jr|�|j�dkr|dkrd|_dSdSdSdS)z;Check if the height parameter is valid; otherwise erase it.�height_specialr��totalheightN)rr��
extractnumber)r{r�
heightspecialrrrr�x
s

�zContainerSize.checkvalidheightcCsB|sdS|�|�dkr
dStjdD]}||vr|�|d�}q|S)z&Do the full processing on a parameter.N�0rr+)rr�r*r�)r{r�rErrrr�~
s�zContainerSize.processparametercCsHd}d}|D]}|��r||7}q|dkr|s||7}d}q|S|S)z+Extract the first number in the given text.r+Fr8T)r�)r{rr��decimal�charrrrr�
s
zContainerSize.extractnumbercCs�|rt|�d|_|jr|js|�|�|_|r*t|�d|_|jr*|js*|�|�|_|jr3|js3d|_|jr>|js@d|_dSdSdS)z-Check image dimensions, set them if possible.�px�autoN)r�r�r�r��
scalevaluer�r�r�rrr�
checkimage�
s
�zContainerSize.checkimagecCs"|t|j�d}tt|��dS)zFScale the value according to the image scale and return it as unicode.r�r)r�r�r�)r{r��scaledrrrr
�
szContainerSize.scalevaluecCs8|jsdSd|jvrdS|j}d|_|jdkrd|_|S)z?Remove percent width if present, to set it at the figure level.Nr�r	)r�r�)r{r�rrr�removepercentwidth�
s

z ContainerSize.removepercentwidthcCs�t|jt�st�dt|��|js|js|js|j	sdSd}||�
d�7}||�
d�7}||�
d�7}||�
d�7}|dd	krG|dd�}|d
7}|jj|7_dS)z1Add the proper style attribute to the output tag.zNo tag to add style, in Nz style="r�r�r�r�rr�rw)r�rrJrrr�r�r�r�r��styleparameterrK)r{rrKrrr�addstyle�
szContainerSize.addstylecCs*t||�}|r|�dd�d|dSdS)z%Get the style for a single parameter.rzmax-rz; r+)r�r�rrrrr�
s
zContainerSize.styleparameterr)rrr r!r�r�r�r�r�r�r�r�r�r�r�r�rrr
r
rrrrrrr�P
s(

r�c@r4)r�zA container for a pretty quotecC�t�|_t�|_dSrx)r0r�rCrr�rrrr|�
�zQuoteContainer.__init__cCsL|jd|_|jtjvrt�d|jd�dg|_dStj|jg|_dS)r�r�zQuote type rTrwN)r
r�r�r(rrr�r�rrrr��
szQuoteContainer.processN�rrr r!r|r�rrrrr��
rAr�c@r4)r�z
A Lyx linecCrrx�r r�rCrr�rrrr|�
rzLyXLine.__init__cCsdg|_dS)Nz<hr class="line" />rDr�rrrr��
r�zLyXLine.processNrrrrrr��
rAr�c@r)rEzText with emphatic modecC�d|j_dS)NrB�rrKr�rrrr��
r�zEmphaticText.processNrrrrrrE�
r&rEc@r)rMzText shaped (italic, slanted)cCsL|jd|_|jtjvrt�d|jd�d|j_dStj|j|j_dS)Nr�zUnrecognized shape �span)r
r�r/rQrrrrKr�rrrr��
szShapedText.processNrrrrrrM�
r&rMc@r)rSzText in versalitascCr)Nrrrr�rrrr��
r�zVersalitasText.processNrrrrrrS�
r&rSc@r)rCzColored textcC�"|jd|_d|jd|j_dS�Nr�zspan class="rw)r
r�rrKr�rrrr��zColorText.processNrrrrrrCr&rCc@r)rOz
Sized textcCrr)r
r*rrKr�rrrr�rzSizeText.processNrrrrrrO	r&rOc@r)r?z	Bold textcCr)NrArr�rrrr�r�zBoldText.processNrrrrrr?r&r?c@r)rRz,A bit of text from elyxer.a different familycCsF|jd|_|jtjvrt�dt�d|j_dStj|j|j_dS)zParse the type of familyr�zUnrecognized family rN)r
r�r/rKrrrrKr�rrrr�szTextFamily.processNrrrrrrRr&rRc@r)rFzHorizontall fillcCr)Nzspan class="hfill"rr�rrrr�%r�z
Hfill.processNrrrrrrF"r&rFc@r)r=zText with a bar somewherecCsH|jd|_|jtjvrt�d|j�d|j_dStj|j|j_dS)zParse the type of barr�zUnknown bar type rN)r
r�r/rJrrrrKr�rrrr�+szBarredText.processNrrrrrr=(r&r=c@r)rZz A line with language informationcCsF|jd}|tjvrt�|_dStj|}t��d|dd�|_dS)zDOnly generate a span with lang info when the language is recognized.r�Nzspan lang="rwF)r
rRrvrGrrJrN)r{�lang�isolangrrrr�7s


zLangLine.processNrrrrrrZ4r&rZc@r)r�z!A length measure inside an inset.cCs|jd|_dS)Nr�)r
r�r�rrrr�CszInsetLength.processNrrrrrr�@r&r�c@r�)	r�zA space of several typescCrrx�r9r�rCrr�rrrr|IrzSpace.__init__cCsz|jd|_|jtjvrt�d|j�dg|_dStj|jg|_|��}|s*dSt��	dd�|_
t��|��
|�dS)Nr�zUnknown space type r�zspan class="hspace"F)r
r�r�r'rrr��	getlengthrJrNrr�r�rr�rrrr�Msz
Space.processcCs.t|j�dkst|jdt�sdS|jdjS)z<Get the space length from elyxer.the contents or parameters.rN)rrr�r�r�r�rrrrZszSpace.getlengthN)rrr r!r|r�rrrrrr�Fs

r�c@r4)r�z(An inset that contains a vertical space.cCrrxrr�rrrr|crzVerticalSpace.__init__cCsJ|jd|_|jtjvrt��d|jdd�|_dStj|jg|_dS)zSet the correct tagr�z"div class="vspace" style="height: z;"TN)r
r�r�r+rJrNrr�r�rrrr�gs
zVerticalSpace.processNrrrrrr�`rAr�c@r4)r<zBit of aligned textcCryr�)r-r�rJrPrr�rrrr|rrzzAlign.__init__cCsd|jdd|j_dS)Nzdiv class="r�rw)r
rrKr�rrrr�vsz
Align.processNrrrrrr<orAr<c@r4)r�z	A newlinecCrrxrr�rrrr||rzNewline.__init__cC�dg|_dS)r�z<br/>
NrDr�rrrr��r�zNewline.processNrrrrrr�yrAr�c@r)r�z
A new pagecCr)r�z<p><br/>
</p>
NrDr�rrrr��r�zNewPage.processNrrrrrr��r&r�c@r)�	Separatorz;A separator string which is not extracted by extracttext().cCst�|_g|_|g|_dSrx)rCrrr�)r{rrrrr|�szSeparator.__init__Nrrrrrr�r&rc@r)rQzStriken out text.cCsd|j_dS)zSet the output tag to strike.�strikeNrr�rrrr��r�zStrikeOut.processNrrrrrrQ�r&rQc@r�)r�zMark to start an appendix here.cCstj��dS)zDActivate the special numbering scheme for appendices, using letters.N)r�r�r�r�rrrr��r�zStartAppendix.processNrrrrrr��r�r�c@sheZdZdZdZdZdZdZdZdZ	dZ
dd�Zddd�Zdd�Z
d	d
�Zdd�Zejd
kr2eZdSdS)�Linkz&A link to another part of the documentNcCs,g|_t�|_t�|_tjrtj|_dSdS)z.Initialize the link, add target if configured.N)rr9r��
LinkOutputrr�r�r�rrrr|�s�z
Link.__init__cCs8t|�g|_|r||_|r||_|r||_|r||_|S)zComplete the link.)rUr�anchorr|r�r�)r{rr#r|r�r�rrrr�sz
Link.completecCsF|jsdSd|_|jjrd|jj|_|jjr!|jj|j|_dSdS)z8Use the destination link to fill in the destination URL.Nr+r�)�destinationr|r#rr�rrr�computedestination�s�zLink.computedestinationcCs||_||_dS)zESet another link as destination, and set its destination to this one.N)r$)r{r$rrr�setmutualdestination�s
zLink.setmutualdestinationcCs0d}|jr|d|j7}|jr|d|j7}|S)rr!z #z to )r#r|r�rrrr��szLink.__unicode__r)NNNN)rrr r!r#r|r�rr�r$r�r|rr%r&r�r	rr�rrrrr!�s"



	�r!c@r)rzzA clickable URLcCsV|�|�d��}||_|�d�}|r|�|�||_|�d�}|s#|}t|�g|_dS)zRead URL from elyxer.parametersr�r�r�N)r�rr|rUr)r{r�r�r�rrrr��s

zURL.processNrrrrrrz�r&rzc@r)r�zA flexible URLcCs|��|_dS)zRead URL from elyxer.contentsN)r�r|r�rrrr��r�zFlexURL.processNrrrrrr��r&r�c@r�)r"z#A link pointing to some destinationcCs�|jj}|jr
|j}d|d}|jr|d|jd7}|jr#|��|jr/|d|jd7}|jr;|d|jd7}|jrG|d|jd7}t	��
|��|�S)zGet the HTML code for the linkz	a class="rwz name="z href="z	 target="z title=")r�rr�r#r$r%r|r�r�rJrNr=)r{�linkr�rKrrrr=�szLinkOutput.gethtmlNrFrrrrr"�r�r"c@s4eZdZdZgZdd�Zdd�Zdd�Zdd	�Zd
S)�
Postprocessorz,Postprocess a container keeping some contextcCsttj|�|_d|_d|_dSrx)�	StageDictr(�stagesr�rwr�rrrr|s
zPostprocessor.__init__cCs(|�|j�|�|�}|j|_||_|S)z)Postprocess a container and its contents.)�
postrecursiver��postcurrentrw)r{r[r�rrr�postprocesss

zPostprocessor.postprocesscCs�t|d�sdSt|j�dkrdSt|d�r|jsdSt�}g}|jD]}|�|�}|r0|�|�q"td�D]}|�d�}|rC|�|�q5||_dS)z.Postprocess the container contents recursivelyrNrr-r�)r�rrr-r(r�rp)r{r�
postprocessorrrI�postrBrrrr+%s(




�

�
zPostprocessor.postrecursivecCs*|j�|j�}|s|jS|�|j|j|�S)zBPostprocess the current element taking into account next and last.)r*�getstager�r-rw)r{r[�stagerrrr,;szPostprocessor.postcurrentN)	rrr r!r*r|r-r+r,rrrrr(sr(c@r�)	r)z/A dictionary of stages corresponding to classescCs$|�||�}tdd�|D��|_dS)zGInstantiate an element from elyxer.each class and store as a dictionarycSsg|]}|j|f�qSr)�processedclassr�rrrrFH�z&StageDict.__init__.<locals>.<listcomp>N)�instantiater��	stagedict)r{�classesr.r�rrrr|EszStageDict.__init__cCs*dd�|D�}|D]	}|��||_q	|S)z-Instantiate an element from elyxer.each classcSsg|]}|�|��qSr)r�r�rrrrFLr3z)StageDict.instantiate.<locals>.<listcomp>)r|r.)r{r6r.r*rIrrrr4Js
zStageDict.instantiatecCs|j|jvrdS|j|jS)z=Get the stage for a given element, if the type is in the dictN)r�r5�r{rIrrrr0RszStageDict.getstageN)rrr r!r|r4r0rrrrr)Bs
r)c@s^eZdZdZe�ZdZdd�Zdd�Zddd�Z	d	d
�Z
dd�Zd
d�Ze
jdkr-eZdSdS)r}zA label to be referencedNcCst�|�d|_dSrx)r!r|�lastnumberedr�rrrr|`s

zLabel.__init__cCs"|�d�}|�d|�tj|_dS)zProcess a label container.r�r�N)rr�r}�
lastlayoutr8r�rrrr�ds
z
Label.processcCsD||_|j|||d�|tj|<|tjvr tj|D]}||_q|S)z!Create the label for a given key.)r#r�)r�rr}�namesr�rbr$)r{rr�r��	referencerrrr�js

zLabel.createcCs|�|�}|r
|jr
|jSdS)z8Get the part key for the latest numbered container seen.r+)r*r)r{r*rrr�findpartkeyts

zLabel.findpartkeycCs,|jr|S|js|jr|jSdS|�|j�S)z)Get the numbered container for the label.N)rrr8r*r(rrrr*{szLabel.numberedcCst|d�sdSd|jS)rr�z
Unnamed labelzLabel )r�r�r�rrrr��rzLabel.__unicode__r)r})rrr r!r�r:r9r|r�r�r<r*r�r	rr�rrrrr}Zs



�r}c@sLeZdZdZe�ZdZdd�Zdd�Zdd�Z	d	d
�Z
ejdkr$e
Z
dSdS)
r�zA reference to a label.�nonecCs�|�d�|_|jtjvrd|_tj|j}nd|_t��d|jd�}||_|��|jtj	vr5gtj	|j<tj	|j�
|�dS)z%Read the reference and set the arrow.r;r2rr��prerefN)rr�r}r:�	directionrr$�formatcontentsr�rbr�)r{�labelrrrr��szReference.processcCs|�d�}|s	d}d|_|tjvrtj||_nt�d|�|�d|j�|�dd�|�dt�	d��|j
��}|�d|oA|j�|�d	|oJ|j
�d
|jvsV|rV|js_t|j�g|_dS|j�d
�}t|d�g|_|d
d�D]}|j|j7_|j�t|��qsdS)zFormat the reference contents.�LatexCommandrr3zUnknown reference format r�r�r_rfr�r�Nrr�)rrr�r)rrr�r?r�r�r$r<r��tocentry�
titlecontentsrUrr�r�)r{�	formatkeyrr�r�rrrr@�s,


�zReference.formatcontentscCs*||jvrdS|sd}|j�||�|_dS)z2Replace a key in the format template with a value.Nr+)rr�r�rrrr��s

zReference.replacecCr)rz
Reference )r�r�rrrr��r[zReference.__unicode__rN)rrr r!r�rbr�r�r@r�r�r	rr�rrrrr��s
�r�c@sZeZdZdZgZejdZdZdd�Z	dd�Z
dd	�Zd
d�Zdd
�Z
dd�Zdd�ZdS)�FormulaCommandz A LaTeX command inside a formularmNcCs|�tj�S)zFind the current command.)r�rFr:r�rrrrP�r�zFormulaCommand.detectcCs||�|�}|�||�}|r|S|�d�s|�d�r#|�||�}|r#|S|jjs.t�d|�t��	d�|_
|�t|��dS)zParse the command.�\up�\UpzUnknown command r�N)
�extractcommand�parsewithcommandr��parseupgreekrr�rrrJrNrr�rV)r{r�rmr@�upgreekrrrrQ�s
zFormulaCommand.parsebitcCs,tjD]}||jvr|�|||�SqdS)z0Parse the command type once we have the command.N)rFr��
commandmap�parsecommandtype)r{rmr�r�rrrrJ�s


�zFormulaCommand.parsewithcommandcCs,|j�|�}|�|�|�|�}|r|S|S)zParse a given command type.)rr��
setcommandrQ)r{rmr�r�r@�returnedrrrrN�s

zFormulaCommand.parsecommandtypecCsh|�tj�s|�dtj�dS|��r|�|�S|����r-tj|��}|�d�|Stj|�	�S)z5Extract the command from elyxer.the current position.zMissing command start Nrj)
r�rFr:rrz�emptycommandr�r�r�r�)r{r�rmrrrrI�s

zFormulaCommand.extractcommandcCs0d}|��s|��}|r|�|�r|}tj|S)zqCheck for an empty command: look for command disguised as ending.
    Special case against '{ \{ \} }' situation.r+)r�r�r�rFr:)r{r�rmrrrrrQ
s
zFormulaCommand.emptycommandcCs�t|�dkrdS|�d�rd|dd�}n|�d�r,d|dd���|dd�}n	t�d|�dS|�||�}|r@d|_|S)	zParse the Greek \up command..r�NrGr�rrHzImpossible upgreek command: rt)rr�r��upperrrrJr�)r{rmr��	upcommandrLrrrrKs

"zFormulaCommand.parseupgreek)rrr r!r�r�r�r:rMrPrQrJrNrIrQrKrrrrrF�s
	
rFc@r�)�
CommandBitz%A formula bit that includes a commandcCs0||_|jr|j|7_|j|j|_dSdS)zSet the command in the bitN)rmrMr��
translated)r{rmrrrrO's
�zCommandBit.setcommandcCs2|j�|�|��rdS|j�|�}|�|�|S)z)Parse a parameter at the current positionN)rr�rzrfr�)r{r��	parameterrrrr.s
zCommandBit.parseparametercCs:|j�|�|j�t|�sdS|j�t|�}|�|�|S)zParse a square bracketN)rr�r�rjr'r��r{r�r6rrr�parsesquare7s
zCommandBit.parsesquarecCsd|j�|�|j�t|�s |��st�d|���dS|��St��	|j�}|�
|�|��|jS)zParse a literal bracket.zNo literal parameter found at: N)
rr�r�r\r�rrr�r�r>r�rbrirWrrrrb@szCommandBit.parseliteralcCsB|j�|�|j�t|�sdSt��|j�}|�|�|��|jS)z!Parse a square bracket literally.N)rr�r�rjr>r�rbrirWrrr�parsesquareliteralLszCommandBit.parsesquareliteralcCsP|j�|�|j�t|�st�d|j�dSt��|j��|�}|�	|�|S)zParse a text parameter.zNo text parameter for N)
rr�r�r\rrrmr>r`r�rWrrrr`Us
zCommandBit.parsetextN)
rrr r!rOrrXrbrYr`rrrrrT$s			rTc@�eZdZdZejZdd�ZdS)raz%An empty command (without parameters)cCst|j�g|_dS)�"Parse a command without parametersN�rVrUrr�rrrrQdr�zEmptyCommand.parsebitN)rrr r!r�r�rMrQrrrrra_�rac@rZ)�
SpacedCommandz<An empty command which should have math spacing in formulas.cCstd|jd�g|_dS)z4Place as contents the command translated and spaced.r�Nr\r�rrrrQmrzSpacedCommand.parsebitN)rrr r!r�r�rMrQrrrrr^hr]r^c@rZ)r`z8A command without paramters whose result is alphabeticalcCst�||�d|_dS)z'Parse the command and set type to alphar0N)rarQr�r�rrrrQvs
zAlphaCommand.parsebitN)rrr r!r�ryrMrQrrrrr`qr]r`c@s*eZdZdZejZdZdd�Zdd�Z	dS)rbzA function of one parameterFcCs&t��|j�|_|�|�|��dS)z#Parse a function with one parameterN)rJrNrUrr�simplifyifpossibler�rrrrQ�s
zOneParamFunction.parsebitcCs2|j|jvrt�|_|j|jg|_d|_dSdS)z&Try to simplify to a single character.TN)r�rMrCrr��
simplifiedr�rrrr_�s

�z#OneParamFunction.simplifyifpossibleN)
rrr r!r�r�rMr`rQr_rrrrrb{srbc@�&eZdZdZejZdd�Zdd�ZdS)rcz>Find a function which is represented by a symbol (like _ or ^)cCs|��tjvS)zFind the symbol)r�rcrMr�rrrrP�r�zSymbolFunction.detectcCs8|�|���|�|j�t��|j�|_|�|�dS)rSN)	rOr�r�rmrJrNrUrrr�rrrrQ�szSymbolFunction.parsebitN)	rrr r!r�r�rMrPrQrrrrrc��
rcc@ra)rdz-A function where parameters are read as text.cCst��|j�|_|�|�dS)zParse a text parameterN)rJrNrUrr`r�rrrrQ�szTextFunction.parsebitcCr�)zSet the type to fontrtNr�r�rrrr��r[zTextFunction.processN)	rrr r!r�r�rMrQr�rrrrrd�s
rdc@ra)�
LabelFunctionzA function that acts as a labelcCs|�|�|_dS)zParse a literal parameterN)rbr�r�rrrrQ�r�zLabelFunction.parsebitcCs8d|_t�jd|jdd�|_|jg|_|jtj|j<dS)z&Add an anchor with the label contents.rtr��eqnumberr�N)r�r}r�r�rArr:r�rrrr��s
zLabelFunction.processN)	rrr r!r�r�rMrQr�rrrrrc�rbrcc@rZ)rez1A function of one parameter that changes the fontcCsd|_|��dS)z.Simplify if possible using a single character.rtN)r�r_r�rrrr��r=zFontFunction.processN)rrr r!r�r�rMr�rrrrre�r]rec@s.eZdZdZejZdd�Zdd�Zdd�Z	dS)	�	BigSymbolzA big symbol generator.cCrs)zCreate the big symbol.N)rV)r{rVrrrr|�r[zBigSymbol.__init__cCs0|j|jvr
|jgS|��r|jgS|j|jS)zGet an array with all pieces.)rVr��
smalllimitr�rrr�	getpieces�s
zBigSymbol.getpiecescCs(tjsdSt|j|j�dkrdStjS)z7Decide if the limit should be a small, one-line symbol.Tr�)rr#rr�rVr�r�r�rrrrf�s
zBigSymbol.smalllimitN)
rrr r!r�r|r�r|rgrfrrrrre�srec@sReZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�ZdS)�
BigBracketzA big bracket generator.r<cCs6||_||_||_d|_|tjvrtj||_dSdS)z(Set the size and symbol for the bracket.N)r*r��	alignmentr�r�r{)r{r*r6rirrrr|�s
�zBigBracket.__init__cCs t|dtt|j���}||�S)z%Return the nth piece for the bracket.�getpiece)r�r�rr�)r{rY�functionrrrrj�szBigBracket.getpiececCs
|jdS)z1Return the only piece for a single-piece bracket.r)r��r{rYrrr�	getpiece1r[zBigBracket.getpiece1cCs4|dkr	|jdS||jdkr|jdS|jdS)zGGet the nth piece for a 3-piece bracket: parenthesis or square bracket.rr�r�r�r*rlrrr�	getpiece3s



zBigBracket.getpiece3cCsP|dkr	|jdS||jdkr|jdS||jddkr#|jdS|jdS)z7Get the nth piece for a 4-piece bracket: curly bracket.rr�rr�rnrlrrr�	getpiece4s



zBigBracket.getpiece4cCs&|�|�}d|jd}t��||�S)z'Get the bracket piece as an array cell.zspan class="bracket align-rw)rjrirJr)r{rYr�rrrr�getcells
zBigBracket.getcellcCs\|jdks|js|��Sg}t|j�D]}|�|�}|�t��|gd��qt��|d�gS)z3Get the bracket as an array or as a single bracket.r��span class="arrayrow"�span class="array")r*r��getsinglebracketrprqr�rJr)r{�rowsrY�cellrrr�getcontentss
zBigBracket.getcontentscCs,|jdkr
t��dd�gSt��|jd�gS)z$Return the bracket as a single sign.r8r+zspan class="emptydot"r�)r�rJrr�rrrrt(s
zBigBracket.getsinglebracketN)r<)rrr r!r|rjrmrorprqrwrtrrrrrh�s
	

rhc@�eZdZdZdZdd�ZdS)�FormulaEquationzA simple numbered equation.�equationcCs t�|_|�|j�t|��dS)�Parse the arrayN)rGrr�rr'r�r�rrrrQ8�zFormulaEquation.parsebitN�rrr r!r�rQrrrrry3�ryc@r4)�FormulaCellzAn array cell inside a rowcCs"||_t��d|dd�|_|S)Nzspan class="arraycell align-rwT)rirJrNr)r{rirrr�setalignment@szFormulaCell.setalignmentcCs0|j�|�|��rdS|�|j�t|��dSrx)rr�rzr�r'r�r�rrrrQEszFormulaCell.parsebitN)rrr r!r�rQrrrrr=r8rc@s2eZdZdZejdZdd�Zdd�Zdd�Z	d	S)
�
FormulaRowzAn array row inside an arrayr�cCs||_t��dd�|_|S)NrrT)�
alignmentsrJrNr)r{r�rrr�
setalignmentsPszFormulaRow.setalignmentscCstd}|j|jdd�|��s+|�|�}|�|�|�|�|d7}|�|j�|��rt|j�dkr8t	�|_
dSdS)zParse a whole rowrT)r�r�N)r�r�rz�
createcellrQr�r�rrrBr)r{r�rYrvrrrrQUs


��zFormulaRow.parsebitcCs&|j|t|j�}|j�t��|�S)z4Create the cell that corresponds to the given index.)r�rrr�rr�)r{rYrirrrr�bszFormulaRow.createcellN)
rrr r!r�rzr�r�rQr�rrrrr�Ks

r�c@r�)�MultiRowFormulazA formula with multiple rows.cCsPg|_d}|�|�D]}|rd}n|��|�|�|�|�q
t|j�|_dS)z,Parse all rows, finish when no more row endsTFN)ru�iteraterows�addemptyrQ�addrowrr*)r{r�r��rowrrr�	parserowsjs
zMultiRowFormula.parserowsccsZ�tjd}	|�|d�|j�t�}|�|j�V|�|�r*|j	|�
|�7_	ndSq)z0Iterate over all rows, end when no more row endsr�TN)r�rzr�rr�r�r�r�r�r�r�)r{r�r�r�rrrr�xs�

�zMultiRowFormula.iteraterowscCs^|j�t��|j�}t|jdj�D]\}}|�|�}|�	t
d��|�	|�q|�|�dS)zAdd an empty row.rr�N)rr�r�r�r�r�rurr�r�rVr�)r{r�rY�originalcellrvrrrr��s
zMultiRowFormula.addemptycCs|j�|�|�|�dS)z2Add a row to the contents and to the list of rows.N)rur�r�)r{r�rrrr��szMultiRowFormula.addrowN)rrr r!r�r�r�r�rrrrr�gs	r�c@s$eZdZdZdZdd�Zdd�ZdS)�FormulaArrayzAn array within a formularzcCs(t��dd�|_|�|�|�|�dS)r{rsFN)rJrNr�parsealignmentsr�r�rrrrQ�s
zFormulaArray.parsebitcCsDd|_|�|�}|r
||_|�|�}g|_|D]}|j�|�qdS)zParse the different alignmentsr=N)�valignrYrbr�r�)r{r�rir<rrrr��s

�zFormulaArray.parsealignmentsN)rrr r!r�rQr�rrrrr���
r�c@rx)�
FormulaMatrixz'A matrix (array with center alignment).�matrixcCs,t��dd�|_d|_dg|_|�|�dS)z(Parse the matrix, set alignments to 'c'.rsFr=N)rJrNrr�r�r�r�rrrrQ�szFormulaMatrix.parsebitNr}rrrrr��r~r�c@rx)�FormulaCaseszA cases statement�casescCs�t�|_ddg|_|�|�|jD]}|jD]}|j�dd�|j�td��qqt��	|jdd�}t
t|j�dd�}|��|g|_dS)zParse the casesr<zspan class="case align-l"Tr�zspan class="bracketcases"r�N)
rGrr�r�rrNr�rVrJrrhrrw)r{r�r�rvrz�bracerrrrQ�s



�zFormulaCases.parsebitNr}rrrrr��r~r�c@r)�EquationEnvironmentz;A \begin{}...\end equation environment with rows and cells.cCs\t��dd�|_|j�dd�}|tjvrtj||_nt�	d|j�dg|_|�
|�dS)zParse the whole environment.zspan class="environment"Frjr+zUnknown equation environment r<N)rJrNrr�r�r�r�r�rrr�)r{r��environmentrrrrQ�s
zEquationEnvironment.parsebitN)rrr r!rQrrrrr��r&r�c@s:eZdZdZejddiZeee	e
gZdd�Zdd�Z
dS)	�BeginCommandzEA \begin{}...\end command and what it entails (array, cases, aligned)r�r+cCsh|�|�}|�|�}tjdd|d}|�|�|�|�|�|�|j|�|�7_|j	|_	dS)zParse the begin commandr�r�r�N)
rb�findbitr�rzr�rQr�r�r�r*)r{r�rmr@rrrrrQ�s




zBeginCommand.parsebitcCsDtjD]}|�dd�|jkr|j�|�Sq|j�t�}||_|S)z7Find the command bit corresponding to the \begin{piece}rjr+)r�r�r�r�rr�r�)r{r�r�r@rrrr��s
�zBeginCommand.findbitN)rrr r!r�rzrMryr�r�r�r�rQr�rrrrr��sr�c@s"eZdZejZdd�Zdd�ZdS)rfcCspd|_|j}|�|�}|st�d|j�nt|���dkr.t�d|jd|��d�|j�	t
|��dS)zParse a combining function.r0z'Empty parameter for combining function r�zApplying combining function z to invalid string "rwN)r�rU�parsesingleparameterrrrmrr�rr�rU)r{r��	combiningrVrrrrQ�s
 zCombiningFunction.parsebitcCsj|j�|�|��rt�d|���dS|j�t|�s#|j�t|�r(|�	|�St
|���}|�|�|S)z&Parse a parameter, or a single letter.z(Error while parsing single parameter at N)
rr�rzrrr�r�r\rFrrVr�r�)r{r��letterrrrr�s�

z&CombiningFunction.parsesingleparameterN)rrr r�r~rMrQr�rrrrrf�srfc@rZ)rgz*A function that decorates some bit of textcCsbd|_|j}t��|d�|_|�|�|_t��d�|_	|j
�d|j�t��d�|j_	|��dS)zParse a decorating functionr0zspan class="symbolover"zspan class="withsymbol"rzspan class="undersymbol"N)
r�rUrJrrVrrVrJrNrrr�r_)r{r�rVrrrrQszDecoratingFunction.parsebitN)rrr r!r�r�rMrQrrrrrgr]rgc@rZ)�LimitCommandz@A command which accepts limits above and below, in display mode.cCs@t|j���}t��d�|_|D]
}|j�t��	|d��qdS)zParse a limit command.�span class="limits"zspan class="limit"N)
rerUrgrJrNrrr�rJr)r{r�r�r�rrrrQ&s
�zLimitCommand.parsebitN)rrr r!r�r�rMrQrrrrr�!r]r�c@s6eZdZdZdZdd�Zdd�ZejdkreZ	dSdS)r\z(A command to limit the previous command.NcCst��d�|_|j�|�dS)zDo nothing.r�N)rJrNrrr�r�rrrrQ2szLimitPreviousCommand.parsebitcCr?)rzLimit previous commandrr�rrrr�7r$z LimitPreviousCommand.__unicode__r)
rrr r!rMrQr�r	rr�rrrrr\-s
�r\c@r�)�LimitsProcessorz)A processor for limits inside an element.cCsVtjrdS|�||�r|�||�|�||�r'|�||d�r)|�||�dSdSdS)z"Process the limits for an element.Nr�)r�r��checklimits�modifylimits�checkscript�
modifyscriptsrlrrrr�Bs�zLimitsProcessor.processcCsNtjsdS|�||dt�r|�||�dSt||t�sdS|�||d�S)z3Check if the current position has a limits command.Fr�)rr#�checkcommandr\�limitsaheadr�r�r�rlrrrr�KszLimitsProcessor.checklimitscCs*||d�||���t�||_dS)z,Limit the current element based on the next.r�N)r�r�rBrrlrrrr�VszLimitsProcessor.limitsaheadcCsf||}|�||d�}|j�|�|�||d�r#|�||d�}nt��dd�}|j�d|�dS)zCModify a limits commands so that the limits appear above and below.r�r�zsup class="limit"rN)�getlimitrr�r�rJrr�)r{rrY�limitedrErFrrrr�[szLimitsProcessor.modifylimitscCs$|�||�}|jj�dd�|j_|S)z#Get the limit for a limits command.rPr�)�	getscriptrrKr�)r{rrYr�rrrr�fszLimitsProcessor.getlimitcCs:|�||�}|�||�}t��||gd�}|�||�dS)z=Modify the super- and subscript to appear vertically aligned.zspan class="scripts"N)r�rJrr�)r{rrYrErF�scriptsrrrr�lszLimitsProcessor.modifyscriptscCs|�||t�S)z6Check if the current element is a sub- or superscript.)r�rcrlrrrr�tr�zLimitsProcessor.checkscriptcCst|�|krdSt|||�S)z0Check for the given type as the current element.F)rr�)r{rrYr�rrrr�xszLimitsProcessor.checkcommandcCs"||}|jjd7_||=|S)zGet the sub- or superscript.z class="script"r)r{rrYr@rrrr�~szLimitsProcessor.getscriptN)
rrr r!r�r�r�r�r�r�r�r�r�rrrrr�?s	r�c@ra)riz"A command which defines a bracket.cCst�||�dS)zParse the bracket.N)rbrQr�rrrrQ�r�zBracketCommand.parsebitcCs ||_d||_t|�g|_|S)z+Create the bracket for the given character.r�)r�rmrVr�r{r?�	characterrrrr��s
zBracketCommand.createN)	rrr r!r�r}rMrQr�rrrrri�rbric@rc)�BracketProcessorz!A processor for bracket commands.cCs&tjrdS|�||�r|�||�SdS)z6Convert the bracket using Unicode pieces, if possible.N)r�r��	checkleft�processleftrlrrrr��s
�zBracketProcessor.processcCsJ|�||d�}|sdS|�|||�}|�|||�|�|||�dS)zProcess a left bracket.r�N)�	findright�findmax�resize)r{rrY�
rightindexr*rrrr��szBracketProcessor.processleftcC�|�||d�S)z0Check if the command at the given index is left.r���checkdirectionrlrrrr��r�zBracketProcessor.checkleftcCr�)z1Check if the command at the given index is right.r�r�rlrrr�
checkright�r�zBracketProcessor.checkrightcCst|t�sdS|j|kS)z6Check if the given bit is the desired bracket command.F)r�rirm)r{r@rmrrrr��rzBracketProcessor.checkdirectioncCs\d}|t|�kr,|�||�r|d7}|�||�r|d8}|dkr"|S|d7}|t|�ksdS)z9Find the right bracket starting at the given index, or 0.r�rN)rr�r�)r{rrY�depthrrrr��s�zBracketProcessor.findrightcCs|||�}tdd�|D��S)z@Find the max size of the contents between the two given indices.cSrBrrCrDrrrrF�rGz,BracketProcessor.findmax.<locals>.<listcomp>)r)r{r�	leftindexr��slicedrrrr��szBracketProcessor.findmaxcCs8|��}|j�dd�}t|||�}t�|_|��|_dS)z+Resize a bracket command to the given size.r�r+N)r�rmr�rhrGrrwr)r{rmr*r�rir6rrrr��s
zBracketProcessor.resizeN)rrr r!r�r�r�r�r�r�r�r�rrrrr��s	
r�c@seZdZdZdZdd�ZdS)r`zShows today's date.NcCs t�|_tj���d�g|_dS)r[z	%b %d, %YN)rCr�datetimer��today�strftimer�r�rrrrQ�r|zTodayCommand.parsebit)rrr r!rMrQrrrrr`�r~r`c@sReZdZdZ				ddgZdd�Zdd�Zdd	�Zd
d�Ze	j
dkr'eZd
Sd
S)�ParameterDefinitionz3The definition of a parameter in a hybrid function.)r�r�)r�r�cCs"d|_d|_d|_d|_d|_dS)NF)r�rir�r��literalvaluer�rrrr|�s

zParameterDefinition.__init__cCs�tjD]E\}}|�|�rH|dkrd|_|�d�s&t�d|��d�dS|��|_|�d�r3d|_	|�|�sDt�d|���dS|Sqt�d	|���dS)
z2Parse a parameter definition: [$0], {$x}, {$1!}...r�Tr�z$Wrong parameter name, did you mean $�?NruzWrong parameter closing z'Wrong character in parameter template: )
r��
parambracketsr�r�rrr�r�r�ri)r{r��opening�closingrrrr#�s"




�
zParameterDefinition.parsecCsf|jr |jr
|�|�|_n|�|�|_|jrt|j�|_dSdS|jr+|�|�|_dS|�|�|_dS)z/Read the parameter itself using the definition.N)	rir�rYr�rbrVr�rXr)r{r�rkrrr�reads�zParameterDefinition.readcCs2d|j}|jr|dt|j�7}|S|d7}|S)rzparam rz (empty))r�r�r�r�rrrr�s
�zParameterDefinition.__unicode__rN)rrr r!r�r|r#r�r�r	rr�rrrrr��s
	�r�c@s:eZdZdZ	dd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�ParameterFunctionzFA function with a variable number of parameters defined in a template.cCs8t�|_|�|�D]}|�||�||jd|j<q	dS)z*Read the params according to the template.r�N)r��params�	paramdefsr�r��r{�readtemplater��paramdefrrr�
readparams's
�zParameterFunction.readparamsccs8�t|�}|��st��|�}|r|V|��r	dSdS)z*Read each param definition in the templateN)r�rzr�r#r�rrrr�.s��zParameterFunction.paramdefscCr)zGet a parameter as parsed.N)r�r�rrr�getparam6rzParameterFunction.getparamcCs|�|�jS)zGet the value of a parameter.)r�r�r�rrrr�<r�zParameterFunction.getvaluecCs|�|�}|r
|jsdS|jS)z%Get the literal value of a parameter.N)r�r�)r{r�r�rrr�getliteralvalue@s

z!ParameterFunction.getliteralvalueN)	rrr r!r�r�r�r�r�rrrrr�#sr�c@�VeZdZdZejZdd�Zdd�Zdd�Z	dd	�Z
d
d�Zdd
�Zdd�Z
dd�ZdS)�HybridFunctiona
  A parameter function where the output is also defined using a template.
  The template can use a number of functions; each function has an associated
  tag.
  Example: [f0{$1},span class="fbox"] defines a function f0 which corresponds
  to a span of class fbox, yielding <span class="fbox">$1</span>.
  Literal parameters can be used in tags definitions:
    [f0{$1},span style="color: $p;"]
  yields <span style="color: $p;">$1</span>, where $p is a literal parameter.
  Sizes can be specified in hybridsizes, e.g. adding parameter sizes. By
  default the resulting size is the max of all arguments. Sizes are used
  to generate the right parameters.
  A function followed by a single / is output as a self-closing XHTML tag:
    [f0/,hr]
  will generate <hr/>.
  cCs8|jd}|jd}|�||�|�|�|_|��dS)z*Parse a function with [] and {} parametersrr�N)rUr��writeparamsr�computehybridsize)r{r�r��
writetemplaterrrrQ[s


zHybridFunction.parsebitcCs|�t|��S)z*Write all params according to the template)�writeposr�)r{r�rrrr�cr�zHybridFunction.writeparamscCs�g}|��sX|�d�r|�|�}|r|�|�n<|�d�r-|�|�}|r,d|_|�|�n'|�d�r<|�|�dd��n|�d�rK|�|�dd��n	|�t|����|��r|S)z/Write all params as read in the parse position.r��fNr��leftr��right)	rzr��
writeparamr��
writefunctionr��writebracketrVr�)r{r�r�r�rkrrrr�gs(


�


�

�zHybridFunction.writeposcCs^d|��}||jvrt�d|�dS|j|sdS|�d�r)|��|j|j_|j|jS)z*Write a single param of the form $0, $x...r�zUnknown parameter Nr8)r�r�rrr�r�r�r�)r{r�r�rrrr�|s


zHybridFunction.writeparamcCsz|�|�}|s	dS|�d�rt��|�S|�d�s t�d�dS|�d�|�|�}|��t	|�dkr6dSt��
||�S)z"Write a single function f0,...,fn.Nr�r�z Function should be defined in {}r�r)�readtagr�rJrMrrr�r�r�rr)r{r�rKrrrrr��s





zHybridFunction.writefunctioncCs�|����st�d|���dSt|���}d|t|j�kr-t�dt|�d�dS|jd|}d|vr:|S|j	D]+}||vrh|j	|}|j
sYt�d|d|d	�q=|jr`|j}nd
}|�||�}q=|S)zJGet the tag corresponding to the given index. Does parameter substitution.zFunction should be f0,...,f9: fNr�z
Function fz is not definedr�zParameters in tag z should be literal: {z!}r+)
r�r�rrr�r�rrUr�r�rir�r�)r{r�rYrK�variabler�r�rrrr��s,

�zHybridFunction.readtagcCs|j�t��||�S)z4Return a new bracket looking at the given direction.)rr�rir�rrrr��r^zHybridFunction.writebracketcCs>|jtjvr|��dSt��|�|_|jD]}|j|_qdS)z(Compute the size of the hybrid function.N)rm�
HybridSize�configsizesrH�getsizer*rr7rrrr��s

�z HybridFunction.computehybridsizeN)rrr r!r�r�rMrQr�r�r�r�r�r�r�rrrrr�Gsr�c@rZ)r�z+The size associated with a hybrid function.cCsb|j|j}|jD]}||vr|j|j��}|�|t|��}q	d|vr-t�d|�dSt	|�S)z*Read the size for a function and parse it.r�z%Unconverted variable in hybrid size: r�)
r�rmr�r�rHr�r�rr�eval)r{rk�
sizestringr�r*rrrr��s
�zHybridSize.getsizeN)rrr r!r�r�r�r�rrrrr��r]r�c@r�)�HeaderParserzParses the LyX headercs(g�������fdd������S)z?Parse header parameters into a dictionary, return the preamble.cr.rx)�	parselinerr/rrr��r�z$HeaderParser.parse.<locals>.<lambda>r3r"rr/rr#�szHeaderParser.parsecCsz|��}|�tjd�r|�|�dS|�tjd�r#t��|�dS|�tjd�r6|�|j�	|��dS|�
|�dS)z0Parse a single line as a parameter or as a startr�Nr�r�)r	r�r�r��parsebranch�	LstParser�parselstsetr�rrr)r{rrrrrrr��s
zHeaderParser.parselinecCsh|����d}|��t��tjd�}|�|�t|�}|jD]}|�	||j|�q!|t
j|<dS)zParse all branch definitions.r�r�N)r	r�r
r�rr�r�r#r�r�r�r�)r{rr��	subparserrzr�rrrr��s

zHeaderParser.parsebranchcCrO)z*Complete the parser with the given ending.)r)r{rrrrrrQzHeaderParser.completeN)rrr r!r#r�r�rrrrrr��sr�c@s$eZdZdZgZdd�Zdd�ZdS)�PreambleParserzA parser for the LyX preamble.cs&tjd�_�����fdd��gS)z,Parse the full preamble with all statements.r�cs
����Srx)�parsepreambleliner�rr{rrr�r�z&PreambleParser.parse.<locals>.<lambda>)r�r�rrr"rr�rr#szPreambleParser.parsecCstj�|���|��dS)zParse a single preamble line.N)r��preambler�r	r
r"rrrr�r�z PreambleParser.parsepreamblelineN)rrr r!r�r#r�rrrrr�r�r�c@�6eZdZdZe�Zdd�Zdd�Zdd�Zdd	�Z	d
S)r�z!Parse global and local lstparams.cCsN|�|�}d|vrt�d|�dS|�d�d}|dd�}|�|�t_dS)z+Parse a declaration of lstparams in lstset.r�z#Missing opening bracket in lstset: Nr�r)�
extractlstsetrrr��parselstparamsr��globalparams)r{rr	�lefttext�croppedtextrrrr�s
zLstParser.parselstsetcCsDd}|��s||��7}|��|�d�r|S|��rt�d�dS)z%Extract the global lstset parameters.r+r�z0Could not find end of \lstset settings; abortingN)rzr	r
r�rr)r{rr	rrrr�&s
�zLstParser.extractlstsetcCs,tj��|_|�d�}|j�|�|��dS)z-Parse some lstparams from elyxer.a container.�	lstparamsN)r�r�r�r�r
�updater�)r{r�	paramlistrrrr0s
zLstParser.parsecontainercCsTt�}|D]"}d|vrt|���dkrt�d|�q|�dd�\}}|||<q|S)z1Process a number of lstparams from elyxer.a list.rerzInvalid listing parameter r�)r�rrrrr�)r{r��	paramdictr�r�r�rrrr�6s�
zLstParser.parselstparamsN)
rrr r!r�r�r�r�rr�rrrrr�s

r�c@r�)r]z0A function that defines a new command (a macro).cCs`t�|_d|_g|_d|j_|�|�d|j_t�d|j	dt
|j�d�||j|j	<dS)z*Parse the function that defines the macro.rTFzNew command r�z parameters)N)rBr�parameternumber�defaultsrr��parseparametersrr�
newcommandr��macrosr�rrrrQJs
��zMacroDefinition.parsebitcCs^	|�|�|_|�|�}|rt|�|_|�|�}|r'|j�|�|�|�}|s|�|�|_	dS)zDParse all optional parameters (number of parameters, default values)N)
�parsenewcommandr�rYr�r�rXr�r�r�
definition)r{r�rir6rrrr�Vs



�zMacroDefinition.parseparameterscCsZ|j�|�|j�t|�r|�|�S|j�t|�r"|j�t��|�St�	d|�
��dS)z"Parse the name of the new command.z,Unknown formula bit in defining function at r&)rr�r�r\rbrFr�rIrrr�r�rrrr�fs
zMacroDefinition.parsenewcommandcCr�)z Return an instance of the macro.)r�r�r�rrrr4pr[zMacroDefinition.instantiateN)
rrr r!r�r�rQr�r�r4rrrrr]Es
r]c@r4)�MacroParameterz A parameter from elyxer.a macro.cCs
|�d�S)zFind a macro parameter: #n.r�)r�r�rrrrPwr[zMacroParameter.detectcCsV|�d�st�d�dSt|���|_dt|j�|_t��	dt|j�d�g|_
dS)zParse the parameter: #n.r�zMissing parameter start #.Nr�)r�rrr�r�r�r�r�rJrrr�rrrrQ{s

 zMacroParameter.parsebitNrRrrrrr�trAr�c@r�)�
MacroFunctionz*A function that was defined using a macro.cCs.t�|_g|_|j}|�||�|�|�dS)z#Parse a number of input parameters.N)rYr�valuesrUr��
completemacro�r{r��macrorrrrQ�s
zMacroFunction.parsebitcCsT|�|t|j��|�||jt|j��t|j�|jkr(t�dt	|��dSdS)z'Parse as many parameters as are needed.zMissing parameters in macro N)
�
parseoptionalr�r��parsemandatoryr�rr�rrr�r�rrrr��s
�zMacroFunction.parseparameterscCs�g}|j�t|�r!|�|�|��t|�t|�krn|j�t|�s	|D]}|��}t|j�dkr7|j�|�q#|j�|�q#|j|7_dS)zParse optional parameters.rN)	rr�rjr�rXrr�rr�)r{r�r�r�r�r'rrrr�s�zMacroFunction.parseoptionalcCs8t|�D]}|�|||�}|sdS|j�|�qdS)z'Parse a number of mandatory parameters.N)rp�parsemacroparameterr�r�)r{r�r�rYrVrrrr�s�zMacroFunction.parsemandatorycCs@		|j�|�|��rdS|j�t|�r|�||�S|�|�S)z?Parse a macro parameter. Could be a bracket or a single letter.N)rr�rzr�r_�parsenumbersr)r{r��	remainingrrrr�s
z!MacroFunction.parsemacroparametercCs^	|j�t|�}t|j�|ks|S|jD]}|j�t�}|�t|��||_|j	�
|�qdS)z3Parse the remaining parameters as a running number.N)rr'r_rr�r�r�rVr�r�r�)r{r�rr��digitr�rrrr�s
zMacroFunction.parsenumberscCs�|��g|_dgt|j�}|�t�D]'}|jd}|t|j�kr-t�dt	|��dSd||<|j|�
�g|_qtt|j��D]}||sQ|�||j|�qBdS)z,Complete the macro with the parameters read.Fr�z%Macro parameter index out of bounds: NT)
r4rrr�r�r�r�rrr�r�rpr])r{r�r:rVrYrrrr��s
��zMacroFunction.completemacrocCs6dt|d�}d�|jd���}|j�||�dS)z@Add a filter for the given parameter number and parameter value.r�r�r+rN)r��joinr�r=rr])r{rYr�r�rrrr]�szMacroFunction.addfilterN)rrr r!r]r�rMrQr�rrrrr�r]rrrrr��s
r�c@r)r�z!A math macro defined in an inset.cCrrx)r;r�rBrr�rrrr|�rzFormulaMacro.__init__cCr?)rz
Math macrorr�rrrr��r$zFormulaMacro.__unicode__rNrrrrrr��rmr�cCs2t�}|�|�}t��|�|��d�|���S)zConvert some TeX math to HTML.r+)r~r-rnr�rr=)r.rrrrr�	math2html�s

rcCsHtj}t��|�t|�dkrt�d�t�t|d�}t�	|�dS)z=Main function, called if invoked from elyxer.the command liner�z"Usage: math2html.py escaped_stringrN)
r	�argvr�r�rrrrrr
)r�r�rrr�main�s
r	�__main__)�rhr�r��io�os.pathr�r	�unicodedatar�urllib.parser�urllibrr�r��IOBaserg�objectrr#r6r;r�r�r�r�r�r�r�r�r�r,r/rRrwr�r�r�r�rr r'r-r0r1r5r9r:rBrCrGrJrYr`rdr~r�r�r�r�r�r�r�rqr�rTrUrXrr$r;r<rJrVr]rhr_rCrYr\rjrkrnr[r�r~r�r�r�r�r�r�r�r�r�r�r�rErMrSrCrOr?rRrFr=rZr�r�r�r<r�r�rrQr�r!rzr�r"r(r)r}r�rFrTrar^r`rbrcrdrcrer�rerhryrr�r�r�r�r�r�r�rfrgr�r\r�rir�r`rrr�r�r�r�r�r�r�r]r�r�r�rr	rrrrr�<module>sv

0D V#,D]-Q#	


BD(vC;#>6!h0


F
8oI6]n



</5@U;		


�B
+F;��>$z
*./X�

�

Youez - 2016 - github.com/yon3zu
LinuXploit