summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2020-05-16 21:33:48 +0000
committerKarl Berry <karl@freefriends.org>2020-05-16 21:33:48 +0000
commit2dcf018ec849f2c579a6eb2399a525fca155daf2 (patch)
treee03fd8307a8d03b8a032feca5011aa352b9f6a2e /Master/texmf-dist/doc
parent1996b5ad272493d43c08372eda3609b1d3271c2c (diff)
xepersian restored without permission requirement
git-svn-id: svn://tug.org/texlive/trunk@55165 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc')
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/README30
-rwxr-xr-xMaster/texmf-dist/doc/xelatex/xepersian/dkun-0.3.py468
-rwxr-xr-xMaster/texmf-dist/doc/xelatex/xepersian/dkun-0.4.py465
-rwxr-xr-xMaster/texmf-dist/doc/xelatex/xepersian/ftxe-0.12.py1045
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/img/ireland.jpgbin0 -> 18304 bytes
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/img/weather/clouds.jpgbin0 -> 13088 bytes
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/img/weather/rain.jpgbin0 -> 14616 bytes
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/img/weather/sun.jpgbin0 -> 10896 bytes
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/magazine-sample.tex172
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/test-correction.tex38
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/test-empty-form.tex42
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/test-question-only.tex38
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/test-solution-form.tex42
-rwxr-xr-xMaster/texmf-dist/doc/xelatex/xepersian/undk-0.6.py485
-rwxr-xr-xMaster/texmf-dist/doc/xelatex/xepersian/unldk-0.2.py445
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/xepersian-doc.pdfbin0 -> 234536 bytes
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/xepersian-logo.tex1483
-rw-r--r--Master/texmf-dist/doc/xelatex/xepersian/xepersian.pdfbin0 -> 756107 bytes
18 files changed, 4753 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/README b/Master/texmf-dist/doc/xelatex/xepersian/README
new file mode 100644
index 00000000000..dbb69a2acd5
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/README
@@ -0,0 +1,30 @@
+____________________
+The XePersian package
+v23.0
+
+The xepersian package provides a convenient interface for
+typesetting Persian and English texts in LaTeX, using XeTeX
+engine.
+
+If you want to report any bugs or typos and corrections in the
+documentation, or ask for any new features, or suggest any
+improvements, or ask any questions about the package, then
+please use the issue tracker:
+
+ <https://github.com/persiantex/xepersian/issues>
+
+In doing so, please always explain your issue well enough, and always
+include a minimal working example showing the issue.
+
+Current version release date: 2020/05/16
+___________________________________________
+Copyright (c) Vafa Khalighi 2008--2020
+Copyright (c) bidi-tex GitHub Organization 2018--2020
+
+Distributed under the LaTeX Project Public License
+It may be distributed and/or modified under the LaTeX Project Public License,
+version 1.3c or higher (your choice). The latest version of
+this license is at: http://www.latex-project.org/lppl.txt
+
+This work is “author-maintained” (as per LPPL maintenance status)
+by Vafa Khalighi.
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/dkun-0.3.py b/Master/texmf-dist/doc/xelatex/xepersian/dkun-0.3.py
new file mode 100755
index 00000000000..1789815763a
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/dkun-0.3.py
@@ -0,0 +1,468 @@
+#! /usr/bin/env python
+
+#########################################
+# General Public License #
+# Author: Mostafa Vahedi #
+# Date: 21 Apr. 2008 #
+# Version 0.3 #
+#########################################
+
+import codecs
+
+import sys
+
+
+dk_numerical = [
+chr(0x97), # Arabic Thoushads Seperator
+chr(0xA1) # ARABIC DECIMAL SEPARATOR
+]
+
+
+dk_vowels = [
+chr(0xAB), # ARABIC FATHA
+chr(0xAA), # ARABIC KASRA
+chr(0xA9), # ARABIC DAMMA
+chr(0xAC), # ARABIC FATHATAN
+chr(0xBA), # ARABIC SHADDA
+#chr(0x??), # ARABIC LETTER SUPERSCRIPT ALEF
+#chr(0x??), # ARABIC LETTER SUBSCRIPT ALEF
+chr(0xAD), # ARABIC HAMZA ABOVE
+chr(0xAE) # ARABIC SUKUN
+]
+
+dk_non_joiners = [
+chr(0xBC) # ARABIC LETTER HAMZA
+]
+
+dk_bidi_joiners_initial = [
+chr(0xE1), # ARABIC LETTER AIN, initial form
+chr(0xE5), # ARABIC LETTER GHAIN, initial form
+chr(0xF9) # ARABIC LETTER HEH, initial form
+]
+
+dk_bidi_joiners_medial = [
+chr(0xE3), # ARABIC LETTER AIN, medial form
+chr(0xE7), # ARABIC LETTER GHAIN, medial form
+chr(0xFB) # ARABIC LETTER HEH, medial form
+]
+
+dk_bidi_joiners_final = [
+chr(0xE2), # ARABIC LETTER AIN, final form
+chr(0xE6), # ARABIC LETTER GHAIN, final form
+chr(0xFE) # ARABIC LETTER FARSI YEH, final form
+]
+
+dk_bidi_joiners_isolated = [
+chr(0xE0), # ARABIC LETTER AIN, isolated form
+chr(0xE4), # ARABIC LETTER GHAIN, isolated form
+chr(0xFC) # ARABIC LETTER FARSI YEH, isolated form
+]
+
+dk_bidi_joiners_initial_medial = [
+chr(0x94), # ARABIC TATWEEL
+chr(0xFF), # ARABIC LETTER YEH WITH HAMZA ABOVE, initial-medial form
+chr(0xC0), # ARABIC LETTER BEH, initial-medial form
+chr(0xC2), # ARABIC LETTER PEH, initial-medial form
+chr(0xC4), # ARABIC LETTER TEH, initial-medial form
+chr(0xC6), # ARABIC LETTER THEH, initial-medial form
+chr(0xC8), # ARABIC LETTER JEEM, initial-medial form
+chr(0xCA), # ARABIC LETTER TCHEH, initial-medial form
+chr(0xCC), # ARABIC LETTER HAH, initial-medial form
+chr(0xCE), # ARABIC LETTER KHAH, initial-medial form
+chr(0xD5), # ARABIC LETTER SEEN, initial-medial form
+chr(0xD7), # ARABIC LETTER SHEEN, initial-medial form
+chr(0xD9), # ARABIC LETTER SAD, initial-medial form
+chr(0xDB), # ARABIC LETTER DAD, initial-medial form
+chr(0xDD), # ARABIC LETTER TAH, initial-medial form
+chr(0xDF), # ARABIC LETTER ZAH, initial-medial form
+chr(0xE9), # ARABIC LETTER FEH, initial-medial form
+chr(0xEB), # ARABIC LETTER QAF, initial-medial form
+chr(0xED), # ARABIC LETTER KEHEH, initial-medial form
+chr(0xEF), # ARABIC LETTER GAF, initial-medial form
+chr(0xF2), # ARABIC LETTER LAM, initial-medial form
+chr(0xF4), # ARABIC LETTER MEEM, initial-medial form
+chr(0xF6), # ARABIC LETTER NOON, initial-medial form
+chr(0xFD) # ARABIC LETTER FARSI YEH, initial-medial form
+]
+
+dk_bidi_joiners_final_isolated = [
+chr(0xBF), # ARABIC LETTER BEH, final-isolated form
+chr(0xC1), # ARABIC LETTER PEH, final-isolated form
+chr(0xC3), # ARABIC LETTER TEH, final-isolated form
+chr(0xC5), # ARABIC LETTER THEH, final-isolated form
+chr(0xC7), # ARABIC LETTER JEEM, final-isolated form
+chr(0xC9), # ARABIC LETTER TCHEH, final-isolated form
+chr(0xCB), # ARABIC LETTER HAH, final-isolated form
+chr(0xCD), # ARABIC LETTER KHAH, final-isolated form
+chr(0xD4), # ARABIC LETTER SEEN, final-isolated form
+chr(0xD6), # ARABIC LETTER SHEEN, final-isolated form
+chr(0xD8), # ARABIC LETTER SAD, final-isolated form
+chr(0xDA), # ARABIC LETTER DAD, final-isolated form
+chr(0xDC), # ARABIC LETTER TAH, final-isolated form
+chr(0xDE), # ARABIC LETTER ZAH, final-isolated form
+chr(0xE8), # ARABIC LETTER FEH, final-isolated form
+chr(0xEA), # ARABIC LETTER QAF, final-isolated form
+chr(0xEC), # ARABIC LETTER KEHEH, final-isolated form
+chr(0xEE), # ARABIC LETTER GAF, final-isolated form
+chr(0xF0), # ARABIC LETTER LAM, final-isolated form
+chr(0xF3), # ARABIC LETTER MEEM, final-isolated form
+chr(0xF5), # ARABIC LETTER NOON, final-isolated form
+chr(0xF8) # ARABIC LETTER HEH, final-isolated form
+]
+
+dk_right_joiners_final = [
+chr(0xBE) # ARABIC LETTER ALEF, final form
+]
+
+dk_right_joiners_isolated = [
+chr(0xBD) # ARABIC LETTER ALEF, isolated form
+]
+
+dk_right_joiners_final_isolated = [
+chr(0xBB), # ARABIC LETTER ALEF WITH MADDA ABOVE, isolated form
+chr(0xCF), # ARABIC LETTER DAL
+chr(0xD0), # ARABIC LETTER THAL
+chr(0xD1), # ARABIC LETTER REH
+chr(0xD2), # ARABIC LETTER ZAIN
+chr(0xD3), # ARABIC LETTER JEH
+#chr(0xBF), # ARABIC LETTER TEH MARBUTAH
+chr(0xF1), # ARABIC LIGATURE LAM WITH ALEF
+chr(0xF7) # ARABIC LETTER WAW
+]
+
+
+table_DK_UN = {
+chr(0xB0) : [u'\u06F0'], # EXTENDED ARABIC-INDIC DIGIT ZERO
+chr(0xB1) : [u'\u06F1'], # EXTENDED ARABIC-INDIC DIGIT ONE
+chr(0xB2) : [u'\u06F2'], # EXTENDED ARABIC-INDIC DIGIT TWO
+chr(0xB3) : [u'\u06F3'], # EXTENDED ARABIC-INDIC DIGIT THREE
+chr(0xB4) : [u'\u06F4'], # EXTENDED ARABIC-INDIC DIGIT FOUR
+chr(0xB5) : [u'\u06F5'], # EXTENDED ARABIC-INDIC DIGIT FIVE
+chr(0xB6) : [u'\u06F6'], # EXTENDED ARABIC-INDIC DIGIT SIX
+chr(0xB7) : [u'\u06F7'], # EXTENDED ARABIC-INDIC DIGIT SEVEN
+chr(0xB8) : [u'\u06F8'], # EXTENDED ARABIC-INDIC DIGIT EIGHT
+chr(0xB9) : [u'\u06F9'], # EXTENDED ARABIC-INDIC DIGIT NINE
+chr(0xA7) : [u'\u060C'], # ARABIC COMMA
+chr(0x94) : [u'\u0640'], # ARABIC TATWEEL
+chr(0xA3) : [u'\u061F'], # ARABIC QUESTION MARK
+chr(0xBB) : [u'\u0622'], # ARABIC LETTER ALEF WITH MADDA ABOVE, isolated form
+chr(0xFF) : [u'\u0626'], # ARABIC LETTER YEH WITH HAMZA ABOVE, initial-medial form
+chr(0xBC) : [u'\u0621'], # ARABIC LETTER HAMZA
+chr(0xBD) : [u'\u0627'], # ARABIC LETTER ALEF, isolated form
+chr(0xBE) : [u'\u0627'], # ARABIC LETTER ALEF, final form
+chr(0xBF) : [u'\u0628'], # ARABIC LETTER BEH, final-isolated form
+chr(0xC0) : [u'\u0628'], # ARABIC LETTER BEH, initial-medial form
+chr(0xC1) : [u'\u067E'], # ARABIC LETTER PEH, final-isolated form
+chr(0xC2) : [u'\u067E'], # ARABIC LETTER PEH, initial-medial form
+chr(0xC3) : [u'\u062A'], # ARABIC LETTER TEH, final-isolated form
+chr(0xC4) : [u'\u062A'], # ARABIC LETTER TEH, initial-medial form
+chr(0xC5) : [u'\u062B'], # ARABIC LETTER THEH, final-isolated form
+chr(0xC6) : [u'\u062B'], # ARABIC LETTER THEH, initial-medial form
+chr(0xC7) : [u'\u062C'], # ARABIC LETTER JEEM, final-isolated form
+chr(0xC8) : [u'\u062C'], # ARABIC LETTER JEEM, initial-medial form
+chr(0xC9) : [u'\u0686'], # ARABIC LETTER TCHEH, final-isolated form
+chr(0xCA) : [u'\u0686'], # ARABIC LETTER TCHEH, initial-medial form
+chr(0xCB) : [u'\u062D'], # ARABIC LETTER HAH, final-isolated form
+chr(0xCC) : [u'\u062D'], # ARABIC LETTER HAH, initial-medial form
+chr(0xCD) : [u'\u062E'], # ARABIC LETTER KHAH, final-isolated form
+chr(0xCE) : [u'\u062E'], # ARABIC LETTER KHAH, initial-medial form
+chr(0xCF) : [u'\u062F'], # ARABIC LETTER DAL
+chr(0xD0) : [u'\u0630'], # ARABIC LETTER THAL
+chr(0xD1) : [u'\u0631'], # ARABIC LETTER REH
+chr(0xD2) : [u'\u0632'], # ARABIC LETTER ZAIN
+chr(0xD3) : [u'\u0698'], # ARABIC LETTER JEH
+chr(0xD4) : [u'\u0633'], # ARABIC LETTER SEEN, final-isolated form
+chr(0xD5) : [u'\u0633'], # ARABIC LETTER SEEN, initial-medial form
+chr(0xD6) : [u'\u0634'], # ARABIC LETTER SHEEN, final-isolated form
+chr(0xD7) : [u'\u0634'], # ARABIC LETTER SHEEN, initial-medial form
+chr(0xD8) : [u'\u0635'], # ARABIC LETTER SAD, final-isolated form
+chr(0xD9) : [u'\u0635'], # ARABIC LETTER SAD, initial-medial form
+chr(0xDA) : [u'\u0636'], # ARABIC LETTER DAD, final-isolated form
+chr(0xDB) : [u'\u0636'], # ARABIC LETTER DAD, initial-medial form
+chr(0xDC) : [u'\u0637'], # ARABIC LETTER TAH, initial-medial form
+chr(0xAB) : [u'\u064E'], # ARABIC FATHA
+chr(0xAA) : [u'\u0650'], # ARABIC KASRA
+chr(0xA9) : [u'\u064F'], # ARABIC DAMMA
+chr(0xAC) : [u'\u064B'], # ARABIC FATHATAN
+chr(0xBA) : [u'\u0651'], # ARABIC SHADDA
+chr(0x95) : [u'\u0023'], # * #
+chr(0x83) : [u'\u0024'], # * $
+chr(0x96) : [u'\u066A'], # * %
+chr(0x87) : [u'\u0026'], # * &
+chr(0x9C) : [u'\u00D7'], # * ARABIC cross (times) x
+chr(0x97) : [u'\u066C'], # Arabic Thoushads Seperator
+#chr(0xBA) : [u'\u0670'], # ARABIC LETTER SUPERSCRIPT ALEF
+chr(0xAD) : [u'\u0654'], # ARABIC HAMZA ABOVE
+chr(0xA1) : [u'\u066B'], # ARABIC DECIMAL SEPARATOR
+chr(0x91) : [u'\u0028'], # * RIGHT PARENTHESIS
+chr(0x90) : [u'\u0029'], # * LEFT PARENTHESIS
+#chr(0xBF) : [u'\u0629'], # ARABIC LETTER TEH MARBUTAH
+chr(0x8E) : [u'\u00BB'], # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+chr(0xDD) : [u'\u0637'], # ARABIC LETTER TAH, final-isolated form
+chr(0xDE) : [u'\u0638'], # ARABIC LETTER ZAH, final-isolated form
+chr(0x8F) : [u'\u00AB'], # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+chr(0xAE) : [u'\u0652'], # ARABIC SUKUN
+chr(0x9F) : [u'\u002D'], # * -
+chr(0xA2) : [u'\u002E'], # * FULL STOP
+#chr(0xA1) : [u'\u002F'], # * /
+chr(0x82) : [u'\u002A'], # * *
+chr(0x86) : [u'\u007E'], # * ~
+chr(0xA5) : [u'\u003A'], # * COLON
+chr(0xA6) : [u'\u061B'], # ARABIC SEMICOLON
+chr(0x9A) : [u'\u003E'], # * GREATER-THAN SIGN
+chr(0x9E) : [u'\u002B'], # * +
+chr(0x99) : [u'\u003D'], # * =
+chr(0x98) : [u'\u003C'], # * LESS-THAN SIGN
+chr(0x81) : [u'\u0040'], # * @
+chr(0x92) : [u'\u005D'], # * [
+chr(0x9D) : [u'\u005C'], # * \
+chr(0x93) : [u'\u005B'], # * ]
+#chr(0xAE) : [u'\u005E'], # * ^
+#chr(0xD5) : [u'\u005F'], # * _
+chr(0xA8) : [u'\u0060'], # * `
+chr(0x8B) : [u'\u007D'], # * {
+chr(0xAF) : [u'\u007C'], # * |
+chr(0xA0) : [u'\u0020'], # * SPACE
+chr(0xA4) : [u'\u0021'], # * EXCLAMATION MARK
+chr(0x8C) : [u'\u007B'], # * }
+chr(0xDF) : [u'\u0638'], # ARABIC LETTER ZAH, initial-medial form
+chr(0xE0) : [u'\u0639'], # ARABIC LETTER AIN, isolated form
+chr(0xE1) : [u'\u0639'], # ARABIC LETTER AIN, final form
+chr(0xE2) : [u'\u0639'], # ARABIC LETTER AIN, medial form
+chr(0xE3) : [u'\u0639'], # ARABIC LETTER AIN, initial form
+chr(0xE4) : [u'\u063A'], # ARABIC LETTER GHAIN, isolated form
+chr(0xE5) : [u'\u063A'], # ARABIC LETTER GHAIN, final form
+chr(0xE6) : [u'\u063A'], # ARABIC LETTER GHAIN, medial form
+chr(0xE7) : [u'\u063A'], # ARABIC LETTER GHAIN, initial form
+chr(0xE8) : [u'\u0641'], # ARABIC LETTER FEH, final-isolated form
+chr(0xE9) : [u'\u0641'], # ARABIC LETTER FEH, initial-medial form
+chr(0xEA) : [u'\u0642'], # ARABIC LETTER QAF, final-isolated form
+chr(0xEB) : [u'\u0642'], # ARABIC LETTER QAF, initial-medial form
+chr(0xEC) : [u'\u06A9'], # ARABIC LETTER KEHEH, final-isolated form
+chr(0xED) : [u'\u06A9'], # ARABIC LETTER KEHEH, initial-medial form
+chr(0xEE) : [u'\u06AF'], # ARABIC LETTER GAF, final-isolated form
+chr(0xEF) : [u'\u06AF'], # ARABIC LETTER GAF, initial-medial form
+chr(0xF0) : [u'\u0644'], # ARABIC LETTER LAM, final-isolated form
+chr(0xF1) : [u'\u0644\u0627'], # ARABIC LIGATURE LAM WITH ALEF
+chr(0xF2) : [u'\u0644'], # ARABIC LETTER LAM, initial-medial form
+chr(0xF3) : [u'\u0645'], # ARABIC LETTER MEEM, final-isolated form
+chr(0xF4) : [u'\u0645'], # ARABIC LETTER MEEM, initial-medial form
+chr(0xF5) : [u'\u0646'], # ARABIC LETTER NOON, final-isolated form
+chr(0xF6) : [u'\u0646'], # ARABIC LETTER NOON, initial-medial form
+chr(0xF7) : [u'\u0648'], # ARABIC LETTER WAW
+chr(0xF8) : [u'\u0647'], # ARABIC LETTER HEH, final-isolated form
+chr(0xFB) : [u'\u0647'], # ARABIC LETTER HEH, medial form
+chr(0xF9) : [u'\u0647'], # ARABIC LETTER HEH, initial form
+chr(0xFE) : [u'\u06CC'], # ARABIC LETTER FARSI YEH, final form
+chr(0xFC) : [u'\u06CC'], # ARABIC LETTER FARSI YEH, isolated form
+chr(0xFD) : [u'\u06CC'] # ARABIC LETTER FARSI YEH, initial-medial form
+}
+
+
+def dk_is_numeric(ch):
+ if ((ch in dk_numerical) or
+ ((ch >= chr(0xB0)) and (ch <= chr(0xB9))) ):
+ return 1
+ return 0
+
+def dk_can_join_left(ch):
+ if ((ch in dk_bidi_joiners_initial) or
+ (ch in dk_bidi_joiners_medial) or
+ (ch in dk_bidi_joiners_final) or
+ (ch in dk_bidi_joiners_isolated) or
+ (ch in dk_bidi_joiners_initial_medial) or
+ (ch in dk_bidi_joiners_final_isolated)):
+ return 1
+ return 0
+
+def dk_can_join_right(ch):
+ if (dk_can_join_left(ch) or
+ (ch in dk_right_joiners_final) or
+ (ch in dk_right_joiners_isolated) or
+ (ch in dk_right_joiners_final_isolated)):
+ return 1
+ return 0
+
+def dk_joining_left(ch):
+ if ((ch in dk_bidi_joiners_initial) or
+ (ch in dk_bidi_joiners_medial) or
+ (ch in dk_bidi_joiners_initial_medial)):
+ return 1
+ return 0
+
+
+def dk_joining_right(ch):
+ if ((ch in dk_right_joiners_final) or
+ (ch in dk_bidi_joiners_medial) or
+ (ch in dk_bidi_joiners_final)):
+ return 1
+ return 0
+
+def dk_not_right_joined(ch):
+ if ((ch in dk_bidi_joiners_initial) or
+ (ch in dk_right_joiners_isolated) or
+ (ch in dk_bidi_joiners_isolated)):
+ return 1
+ return 0
+
+def dk_adjust_shaping(text, i):
+ current = text[i]
+ u = u''
+ try:
+ u = table_DK_UN[current][0]
+ except KeyError:
+ print 'ERROR: unmapped character'
+ return u''
+
+ #if you don't want shaping remove the following comment
+ #return u
+
+ if ((current in dk_vowels) or (dk_is_numeric(current))):
+ return u
+
+ #find next non-vowel character on the left
+ text_len = len(text)
+ next_index = i+1
+ while ((next_index < text_len) and (text[next_index] in dk_vowels)):
+ next_index += 1
+
+ if (next_index == text_len):
+ next = ''
+ else:
+ next = text[next_index]
+
+ # if current letter is joining from left but next letter is or can not joining
+ if (dk_joining_left(current)):
+ if (not dk_can_join_right(next)):
+ u += u'\u200D' #ZWJ
+ elif (dk_not_right_joined(next)):
+ u += u'\u200D\u200C' #ZWJ+ZWNJ
+ # if current letter can join but next letter is joining from right
+ elif (dk_can_join_left(current)):
+ if (dk_joining_right(next)):
+ u += u'\u200C\u200D' #ZWNJ+ZWJ
+ elif (dk_can_join_right(next)):
+ u += u'\u200C' #ZWNJ
+ return u
+
+def dk_adjust_number(text):
+ result = u''
+ i = len(text)-1
+ while (i >= 0):
+ result += dk_adjust_shaping(text, i)
+ i -= 1
+ return result
+
+
+def map_dk_unicode(text):
+ mapped_text = u''
+
+ i = 0
+ while (i < len(text)):
+ if (dk_is_numeric(text[i])):
+ next_index = i
+ while ((next_index+1 < len(text)) and
+ (dk_is_numeric(text[next_index+1]))):
+ next_index += 1
+ mapped_text += dk_adjust_number(text[i:next_index+1])
+ i = next_index+1
+ continue
+
+ mapped_text += dk_adjust_shaping(text, i)
+ i += 1
+ return mapped_text
+
+def dk_next_part(line, i):
+ j = i
+ language_flag = (line[j]<chr(0x80))
+ while ((j<line_len) and ((line[j]<chr(0x80)) == language_flag) ):
+ j += 1
+ return j
+
+
+def is_english_letter_number(c):
+ if ((c >= 'a') and (c <= 'z')) or ((c >= 'A') and (c <= 'Z')):
+ return 1
+ if (c >= '0') and (c <= '9'):
+ return 1
+ return 0
+
+def is_inbetween_chars(c):
+ if ((c == '.') or (c == '-') or (c == '_') or (c == '/')):
+ return 1
+ return 0
+
+def needs_english_wrapper(part):
+ part_len = len(part)
+ i = -1
+ while (i+1 < part_len):
+ i += 1
+ if (is_english_letter_number(part[i]) == 1):
+ continue
+ if (i>0) and (is_inbetween_chars(part[i]) == 1) and \
+ (part_len > i+1) and (is_english_letter_number(part[i+1]) == 1):
+ continue
+ return 1
+ return 0
+
+# Main body of the program
+if len(sys.argv) <= 2:
+ print 'usage: python dkun in_filename out_filename'
+ exit(0)
+
+filename = sys.argv[1]
+outfile = sys.argv[2]
+
+try:
+ f = open(filename, 'r')
+except IOError:
+ print "Can not open the input file: " + filename
+ exit(0)
+
+try:
+ of = codecs.open(outfile, encoding='utf-8', mode='w')
+except IOError:
+ print "Can not open the output file: " + outfile
+ exit(0)
+
+line_number = 0
+for line in f:
+ line_number += 1
+ output_line = u''
+ line_len = len(line)
+
+ put_end_of_line = 0
+ if ((line_len > 0) and (line[line_len-1] == '\n')):
+ put_end_of_line = 1
+ line_len = line_len - 1
+ if ((line_len > 0) and (line[line_len-1] == '\r')):
+ line_len = line_len - 1
+
+ i = 0
+
+ while (i<line_len):
+ next_part_index = dk_next_part(line, i)
+ next_part = line[i:next_part_index]
+ next_part_latin = (line[i]<chr(0x80))
+
+ if next_part_latin:
+ if (needs_english_wrapper(next_part[::-1]) == 1):
+ next_part = '\$e_'+next_part[::-1]+'\$f_'
+ else:
+ next_part = next_part[::-1]
+ output_line += next_part.encode( 'utf-8' )
+ else:
+ output_line += map_dk_unicode(next_part)
+ i = next_part_index
+ # end of while
+
+ if (put_end_of_line == 1):
+ output_line += u'\u000a'
+
+ # write the processed line
+ of.write(output_line)
+ # end of line processing
+# end of file processing
+
+of.close()
+f.close()
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/dkun-0.4.py b/Master/texmf-dist/doc/xelatex/xepersian/dkun-0.4.py
new file mode 100755
index 00000000000..15877cb93eb
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/dkun-0.4.py
@@ -0,0 +1,465 @@
+#! /usr/bin/env python
+
+#########################################
+# General Public License #
+# Author: Mostafa Vahedi #
+# Date: 24 Sep. 2012 #
+# Version 0.4 #
+#########################################
+
+import codecs
+
+import sys
+
+
+dk_numerical = [
+chr(0x97), # Arabic Thoushads Seperator
+chr(0xA1) # ARABIC DECIMAL SEPARATOR
+]
+
+
+dk_vowels = [
+chr(0xAB), # ARABIC FATHA
+chr(0xAA), # ARABIC KASRA
+chr(0xA9), # ARABIC DAMMA
+chr(0xAC), # ARABIC FATHATAN
+chr(0xBA), # ARABIC SHADDA
+#chr(0x??), # ARABIC LETTER SUPERSCRIPT ALEF
+#chr(0x??), # ARABIC LETTER SUBSCRIPT ALEF
+chr(0xAD), # ARABIC HAMZA ABOVE
+chr(0xAE) # ARABIC SUKUN
+]
+
+dk_non_joiners = [
+chr(0xBC) # ARABIC LETTER HAMZA
+]
+
+dk_bidi_joiners_initial = [
+chr(0xE1), # ARABIC LETTER AIN, initial form
+chr(0xE5), # ARABIC LETTER GHAIN, initial form
+chr(0xF9) # ARABIC LETTER HEH, initial form
+]
+
+dk_bidi_joiners_medial = [
+chr(0xE3), # ARABIC LETTER AIN, medial form
+chr(0xE7), # ARABIC LETTER GHAIN, medial form
+chr(0xFB) # ARABIC LETTER HEH, medial form
+]
+
+dk_bidi_joiners_final = [
+chr(0xE2), # ARABIC LETTER AIN, final form
+chr(0xE6), # ARABIC LETTER GHAIN, final form
+chr(0xFE) # ARABIC LETTER FARSI YEH, final form
+]
+
+dk_bidi_joiners_isolated = [
+chr(0xE0), # ARABIC LETTER AIN, isolated form
+chr(0xE4), # ARABIC LETTER GHAIN, isolated form
+chr(0xFC) # ARABIC LETTER FARSI YEH, isolated form
+]
+
+dk_bidi_joiners_initial_medial = [
+chr(0x94), # ARABIC TATWEEL
+chr(0xFF), # ARABIC LETTER YEH WITH HAMZA ABOVE, initial-medial form
+chr(0xC0), # ARABIC LETTER BEH, initial-medial form
+chr(0xC2), # ARABIC LETTER PEH, initial-medial form
+chr(0xC4), # ARABIC LETTER TEH, initial-medial form
+chr(0xC6), # ARABIC LETTER THEH, initial-medial form
+chr(0xC8), # ARABIC LETTER JEEM, initial-medial form
+chr(0xCA), # ARABIC LETTER TCHEH, initial-medial form
+chr(0xCC), # ARABIC LETTER HAH, initial-medial form
+chr(0xCE), # ARABIC LETTER KHAH, initial-medial form
+chr(0xD5), # ARABIC LETTER SEEN, initial-medial form
+chr(0xD7), # ARABIC LETTER SHEEN, initial-medial form
+chr(0xD9), # ARABIC LETTER SAD, initial-medial form
+chr(0xDB), # ARABIC LETTER DAD, initial-medial form
+chr(0xDD), # ARABIC LETTER TAH, initial-medial form
+chr(0xDF), # ARABIC LETTER ZAH, initial-medial form
+chr(0xE9), # ARABIC LETTER FEH, initial-medial form
+chr(0xEB), # ARABIC LETTER QAF, initial-medial form
+chr(0xED), # ARABIC LETTER KEHEH, initial-medial form
+chr(0xEF), # ARABIC LETTER GAF, initial-medial form
+chr(0xF2), # ARABIC LETTER LAM, initial-medial form
+chr(0xF4), # ARABIC LETTER MEEM, initial-medial form
+chr(0xF6), # ARABIC LETTER NOON, initial-medial form
+chr(0xFD) # ARABIC LETTER FARSI YEH, initial-medial form
+]
+
+dk_bidi_joiners_final_isolated = [
+chr(0xBF), # ARABIC LETTER BEH, final-isolated form
+chr(0xC1), # ARABIC LETTER PEH, final-isolated form
+chr(0xC3), # ARABIC LETTER TEH, final-isolated form
+chr(0xC5), # ARABIC LETTER THEH, final-isolated form
+chr(0xC7), # ARABIC LETTER JEEM, final-isolated form
+chr(0xC9), # ARABIC LETTER TCHEH, final-isolated form
+chr(0xCB), # ARABIC LETTER HAH, final-isolated form
+chr(0xCD), # ARABIC LETTER KHAH, final-isolated form
+chr(0xD4), # ARABIC LETTER SEEN, final-isolated form
+chr(0xD6), # ARABIC LETTER SHEEN, final-isolated form
+chr(0xD8), # ARABIC LETTER SAD, final-isolated form
+chr(0xDA), # ARABIC LETTER DAD, final-isolated form
+chr(0xDC), # ARABIC LETTER TAH, final-isolated form
+chr(0xDE), # ARABIC LETTER ZAH, final-isolated form
+chr(0xE8), # ARABIC LETTER FEH, final-isolated form
+chr(0xEA), # ARABIC LETTER QAF, final-isolated form
+chr(0xEC), # ARABIC LETTER KEHEH, final-isolated form
+chr(0xEE), # ARABIC LETTER GAF, final-isolated form
+chr(0xF0), # ARABIC LETTER LAM, final-isolated form
+chr(0xF3), # ARABIC LETTER MEEM, final-isolated form
+chr(0xF5), # ARABIC LETTER NOON, final-isolated form
+chr(0xF8) # ARABIC LETTER HEH, final-isolated form
+]
+
+dk_right_joiners_final = [
+chr(0xBE) # ARABIC LETTER ALEF, final form
+]
+
+dk_right_joiners_isolated = [
+chr(0xBD) # ARABIC LETTER ALEF, isolated form
+]
+
+dk_right_joiners_final_isolated = [
+chr(0xBB), # ARABIC LETTER ALEF WITH MADDA ABOVE, isolated form
+chr(0xCF), # ARABIC LETTER DAL
+chr(0xD0), # ARABIC LETTER THAL
+chr(0xD1), # ARABIC LETTER REH
+chr(0xD2), # ARABIC LETTER ZAIN
+chr(0xD3), # ARABIC LETTER JEH
+#chr(0xBF), # ARABIC LETTER TEH MARBUTAH
+chr(0xF1), # ARABIC LIGATURE LAM WITH ALEF
+chr(0xF7) # ARABIC LETTER WAW
+]
+
+
+table_DK_UN = {
+chr(0xB0) : [u'\u06F0'], # EXTENDED ARABIC-INDIC DIGIT ZERO
+chr(0xB1) : [u'\u06F1'], # EXTENDED ARABIC-INDIC DIGIT ONE
+chr(0xB2) : [u'\u06F2'], # EXTENDED ARABIC-INDIC DIGIT TWO
+chr(0xB3) : [u'\u06F3'], # EXTENDED ARABIC-INDIC DIGIT THREE
+chr(0xB4) : [u'\u06F4'], # EXTENDED ARABIC-INDIC DIGIT FOUR
+chr(0xB5) : [u'\u06F5'], # EXTENDED ARABIC-INDIC DIGIT FIVE
+chr(0xB6) : [u'\u06F6'], # EXTENDED ARABIC-INDIC DIGIT SIX
+chr(0xB7) : [u'\u06F7'], # EXTENDED ARABIC-INDIC DIGIT SEVEN
+chr(0xB8) : [u'\u06F8'], # EXTENDED ARABIC-INDIC DIGIT EIGHT
+chr(0xB9) : [u'\u06F9'], # EXTENDED ARABIC-INDIC DIGIT NINE
+chr(0xA7) : [u'\u060C'], # ARABIC COMMA
+chr(0x94) : [u'\u0640'], # ARABIC TATWEEL
+chr(0xA3) : [u'\u061F'], # ARABIC QUESTION MARK
+chr(0xBB) : [u'\u0622'], # ARABIC LETTER ALEF WITH MADDA ABOVE, isolated form
+chr(0xFF) : [u'\u0626'], # ARABIC LETTER YEH WITH HAMZA ABOVE, initial-medial form
+chr(0xBC) : [u'\u0621'], # ARABIC LETTER HAMZA
+chr(0xBD) : [u'\u0627'], # ARABIC LETTER ALEF, isolated form
+chr(0xBE) : [u'\u0627'], # ARABIC LETTER ALEF, final form
+chr(0xBF) : [u'\u0628'], # ARABIC LETTER BEH, final-isolated form
+chr(0xC0) : [u'\u0628'], # ARABIC LETTER BEH, initial-medial form
+chr(0xC1) : [u'\u067E'], # ARABIC LETTER PEH, final-isolated form
+chr(0xC2) : [u'\u067E'], # ARABIC LETTER PEH, initial-medial form
+chr(0xC3) : [u'\u062A'], # ARABIC LETTER TEH, final-isolated form
+chr(0xC4) : [u'\u062A'], # ARABIC LETTER TEH, initial-medial form
+chr(0xC5) : [u'\u062B'], # ARABIC LETTER THEH, final-isolated form
+chr(0xC6) : [u'\u062B'], # ARABIC LETTER THEH, initial-medial form
+chr(0xC7) : [u'\u062C'], # ARABIC LETTER JEEM, final-isolated form
+chr(0xC8) : [u'\u062C'], # ARABIC LETTER JEEM, initial-medial form
+chr(0xC9) : [u'\u0686'], # ARABIC LETTER TCHEH, final-isolated form
+chr(0xCA) : [u'\u0686'], # ARABIC LETTER TCHEH, initial-medial form
+chr(0xCB) : [u'\u062D'], # ARABIC LETTER HAH, final-isolated form
+chr(0xCC) : [u'\u062D'], # ARABIC LETTER HAH, initial-medial form
+chr(0xCD) : [u'\u062E'], # ARABIC LETTER KHAH, final-isolated form
+chr(0xCE) : [u'\u062E'], # ARABIC LETTER KHAH, initial-medial form
+chr(0xCF) : [u'\u062F'], # ARABIC LETTER DAL
+chr(0xD0) : [u'\u0630'], # ARABIC LETTER THAL
+chr(0xD1) : [u'\u0631'], # ARABIC LETTER REH
+chr(0xD2) : [u'\u0632'], # ARABIC LETTER ZAIN
+chr(0xD3) : [u'\u0698'], # ARABIC LETTER JEH
+chr(0xD4) : [u'\u0633'], # ARABIC LETTER SEEN, final-isolated form
+chr(0xD5) : [u'\u0633'], # ARABIC LETTER SEEN, initial-medial form
+chr(0xD6) : [u'\u0634'], # ARABIC LETTER SHEEN, final-isolated form
+chr(0xD7) : [u'\u0634'], # ARABIC LETTER SHEEN, initial-medial form
+chr(0xD8) : [u'\u0635'], # ARABIC LETTER SAD, final-isolated form
+chr(0xD9) : [u'\u0635'], # ARABIC LETTER SAD, initial-medial form
+chr(0xDA) : [u'\u0636'], # ARABIC LETTER DAD, final-isolated form
+chr(0xDB) : [u'\u0636'], # ARABIC LETTER DAD, initial-medial form
+chr(0xDC) : [u'\u0637'], # ARABIC LETTER TAH, initial-medial form
+chr(0xAB) : [u'\u064E'], # ARABIC FATHA
+chr(0xAA) : [u'\u0650'], # ARABIC KASRA
+chr(0xA9) : [u'\u064F'], # ARABIC DAMMA
+chr(0xAC) : [u'\u064B'], # ARABIC FATHATAN
+chr(0xBA) : [u'\u0651'], # ARABIC SHADDA
+chr(0x95) : [u'\u0023'], # * #
+chr(0x83) : [u'\u0024'], # * $
+chr(0x96) : [u'\u066A'], # * %
+chr(0x87) : [u'\u0026'], # * &
+chr(0x9C) : [u'\u00D7'], # * ARABIC cross (times) x
+chr(0x97) : [u'\u066C'], # Arabic Thoushads Seperator
+#chr(0xBA) : [u'\u0670'], # ARABIC LETTER SUPERSCRIPT ALEF
+chr(0xAD) : [u'\u0654'], # ARABIC HAMZA ABOVE
+chr(0xA1) : [u'\u066B'], # ARABIC DECIMAL SEPARATOR
+chr(0x91) : [u'\u0028'], # * RIGHT PARENTHESIS
+chr(0x90) : [u'\u0029'], # * LEFT PARENTHESIS
+#chr(0xBF) : [u'\u0629'], # ARABIC LETTER TEH MARBUTAH
+chr(0x8E) : [u'\u00BB'], # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+chr(0xDD) : [u'\u0637'], # ARABIC LETTER TAH, final-isolated form
+chr(0xDE) : [u'\u0638'], # ARABIC LETTER ZAH, final-isolated form
+chr(0x8F) : [u'\u00AB'], # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+chr(0xAE) : [u'\u0652'], # ARABIC SUKUN
+chr(0x9F) : [u'\u002D'], # * -
+chr(0xA2) : [u'\u002E'], # * FULL STOP
+#chr(0xA1) : [u'\u002F'], # * /
+chr(0x82) : [u'\u002A'], # * *
+chr(0x86) : [u'\u007E'], # * ~
+chr(0xA5) : [u'\u003A'], # * COLON
+chr(0xA6) : [u'\u061B'], # ARABIC SEMICOLON
+chr(0x9A) : [u'\u003E'], # * GREATER-THAN SIGN
+chr(0x9E) : [u'\u002B'], # * +
+chr(0x99) : [u'\u003D'], # * =
+chr(0x98) : [u'\u003C'], # * LESS-THAN SIGN
+chr(0x81) : [u'\u0040'], # * @
+chr(0x92) : [u'\u005D'], # * [
+chr(0x9D) : [u'\u005C'], # * \
+chr(0x93) : [u'\u005B'], # * ]
+#chr(0xAE) : [u'\u005E'], # * ^
+#chr(0xD5) : [u'\u005F'], # * _
+chr(0xA8) : [u'\u0060'], # * `
+chr(0x8B) : [u'\u007D'], # * {
+chr(0xAF) : [u'\u007C'], # * |
+chr(0xA0) : [u'\u0020'], # * SPACE
+chr(0xA4) : [u'\u0021'], # * EXCLAMATION MARK
+chr(0x8C) : [u'\u007B'], # * }
+chr(0xDF) : [u'\u0638'], # ARABIC LETTER ZAH, initial-medial form
+chr(0xE0) : [u'\u0639'], # ARABIC LETTER AIN, isolated form
+chr(0xE1) : [u'\u0639'], # ARABIC LETTER AIN, final form
+chr(0xE2) : [u'\u0639'], # ARABIC LETTER AIN, medial form
+chr(0xE3) : [u'\u0639'], # ARABIC LETTER AIN, initial form
+chr(0xE4) : [u'\u063A'], # ARABIC LETTER GHAIN, isolated form
+chr(0xE5) : [u'\u063A'], # ARABIC LETTER GHAIN, final form
+chr(0xE6) : [u'\u063A'], # ARABIC LETTER GHAIN, medial form
+chr(0xE7) : [u'\u063A'], # ARABIC LETTER GHAIN, initial form
+chr(0xE8) : [u'\u0641'], # ARABIC LETTER FEH, final-isolated form
+chr(0xE9) : [u'\u0641'], # ARABIC LETTER FEH, initial-medial form
+chr(0xEA) : [u'\u0642'], # ARABIC LETTER QAF, final-isolated form
+chr(0xEB) : [u'\u0642'], # ARABIC LETTER QAF, initial-medial form
+chr(0xEC) : [u'\u06A9'], # ARABIC LETTER KEHEH, final-isolated form
+chr(0xED) : [u'\u06A9'], # ARABIC LETTER KEHEH, initial-medial form
+chr(0xEE) : [u'\u06AF'], # ARABIC LETTER GAF, final-isolated form
+chr(0xEF) : [u'\u06AF'], # ARABIC LETTER GAF, initial-medial form
+chr(0xF0) : [u'\u0644'], # ARABIC LETTER LAM, final-isolated form
+chr(0xF1) : [u'\u0644\u0627'], # ARABIC LIGATURE LAM WITH ALEF
+chr(0xF2) : [u'\u0644'], # ARABIC LETTER LAM, initial-medial form
+chr(0xF3) : [u'\u0645'], # ARABIC LETTER MEEM, final-isolated form
+chr(0xF4) : [u'\u0645'], # ARABIC LETTER MEEM, initial-medial form
+chr(0xF5) : [u'\u0646'], # ARABIC LETTER NOON, final-isolated form
+chr(0xF6) : [u'\u0646'], # ARABIC LETTER NOON, initial-medial form
+chr(0xF7) : [u'\u0648'], # ARABIC LETTER WAW
+chr(0xF8) : [u'\u0647'], # ARABIC LETTER HEH, final-isolated form
+chr(0xFB) : [u'\u0647'], # ARABIC LETTER HEH, medial form
+chr(0xF9) : [u'\u0647'], # ARABIC LETTER HEH, initial form
+chr(0xFE) : [u'\u06CC'], # ARABIC LETTER FARSI YEH, final form
+chr(0xFC) : [u'\u06CC'], # ARABIC LETTER FARSI YEH, isolated form
+chr(0xFD) : [u'\u06CC'] # ARABIC LETTER FARSI YEH, initial-medial form
+}
+
+
+def dk_is_numeric(ch):
+ if ((ch in dk_numerical) or
+ ((ch >= chr(0xB0)) and (ch <= chr(0xB9))) ):
+ return 1
+ return 0
+
+def dk_can_join_left(ch):
+ if ((ch in dk_bidi_joiners_initial) or
+ (ch in dk_bidi_joiners_medial) or
+ (ch in dk_bidi_joiners_final) or
+ (ch in dk_bidi_joiners_isolated) or
+ (ch in dk_bidi_joiners_initial_medial) or
+ (ch in dk_bidi_joiners_final_isolated)):
+ return 1
+ return 0
+
+def dk_can_join_right(ch):
+ if (dk_can_join_left(ch) or
+ (ch in dk_right_joiners_final) or
+ (ch in dk_right_joiners_isolated) or
+ (ch in dk_right_joiners_final_isolated)):
+ return 1
+ return 0
+
+def dk_joining_left(ch):
+ if ((ch in dk_bidi_joiners_initial) or
+ (ch in dk_bidi_joiners_medial) or
+ (ch in dk_bidi_joiners_initial_medial)):
+ return 1
+ return 0
+
+
+def dk_joining_right(ch):
+ if ((ch in dk_right_joiners_final) or
+ (ch in dk_bidi_joiners_medial) or
+ (ch in dk_bidi_joiners_final)):
+ return 1
+ return 0
+
+def dk_not_right_joined(ch):
+ if ((ch in dk_bidi_joiners_initial) or
+ (ch in dk_right_joiners_isolated) or
+ (ch in dk_bidi_joiners_isolated)):
+ return 1
+ return 0
+
+def dk_adjust_shaping(text, i):
+ current = text[i]
+ u = u''
+ try:
+ u = table_DK_UN[current][0]
+ except KeyError:
+ print 'ERROR: unmapped character'
+ return u''
+
+ #if you don't want shaping remove the following comment
+ #return u
+
+ if ((current in dk_vowels) or (dk_is_numeric(current))):
+ return u
+
+ #find next non-vowel character on the left
+ text_len = len(text)
+ next_index = i+1
+ while ((next_index < text_len) and (text[next_index] in dk_vowels)):
+ next_index += 1
+
+ if (next_index == text_len):
+ next = ''
+ else:
+ next = text[next_index]
+
+ # if current letter is joining from left but next letter is or can not joining
+ if (dk_joining_left(current)):
+ if (not dk_can_join_right(next)):
+ u += u'\u200D' #ZWJ
+ elif (dk_not_right_joined(next)):
+ u += u'\u200D\u200C' #ZWJ+ZWNJ
+ # if current letter can join but next letter is joining from right
+ elif (dk_can_join_left(current)):
+ if (dk_joining_right(next)):
+ u += u'\u200C\u200D' #ZWNJ+ZWJ
+ elif (dk_can_join_right(next)):
+ u += u'\u200C' #ZWNJ
+ return u
+
+def dk_adjust_number(text):
+ result = u''
+ i = len(text)-1
+ while (i >= 0):
+ result += dk_adjust_shaping(text, i)
+ i -= 1
+ return result
+
+
+def map_dk_unicode(text):
+ mapped_text = u''
+
+ i = 0
+ while (i < len(text)):
+ if (dk_is_numeric(text[i])):
+ next_index = i
+ while ((next_index+1 < len(text)) and
+ (dk_is_numeric(text[next_index+1]))):
+ next_index += 1
+ mapped_text += dk_adjust_number(text[i:next_index+1])
+ i = next_index+1
+ continue
+
+ mapped_text += dk_adjust_shaping(text, i)
+ i += 1
+ return mapped_text
+
+def dk_next_part(line, i):
+ j = i
+ language_flag = (line[j]<chr(0x80))
+ while ((j<line_len) and ((line[j]<chr(0x80)) == language_flag) ):
+ j += 1
+ return j
+
+
+def is_english_letter_number(c):
+ if ((c >= 'a') and (c <= 'z')) or ((c >= 'A') and (c <= 'Z')):
+ return 1
+ if (c >= '0') and (c <= '9'):
+ return 1
+ return 0
+
+def is_inbetween_chars(c):
+ if ((c == '.') or (c == '-') or (c == '_') or (c == '/')):
+ return 1
+ return 0
+
+def needs_english_wrapper(part):
+ part_len = len(part)
+ i = -1
+ while (i+1 < part_len):
+ i += 1
+ if (is_english_letter_number(part[i]) == 1):
+ continue
+ if (i>0) and (is_inbetween_chars(part[i]) == 1) and \
+ (part_len > i+1) and (is_english_letter_number(part[i+1]) == 1):
+ continue
+ return 1
+ return 0
+
+# Main body of the program
+if len(sys.argv) <= 2:
+ print 'usage: python dkun in_filename out_filename'
+ exit(0)
+
+filename = sys.argv[1]
+outfile = sys.argv[2]
+
+try:
+ f = open(filename, 'r')
+except IOError:
+ print "Can not open the input file: " + filename
+ exit(0)
+
+try:
+ of = codecs.open(outfile, encoding='utf-8', mode='w')
+except IOError:
+ print "Can not open the output file: " + outfile
+ exit(0)
+
+line_number = 0
+for line in f:
+ line_number += 1
+ output_line = u''
+ line_len = len(line)
+
+ put_end_of_line = 0
+ if ((line_len > 0) and (line[line_len-1] == '\n')):
+ put_end_of_line = 1
+ line_len = line_len - 1
+ if ((line_len > 0) and (line[line_len-1] == '\r')):
+ line_len = line_len - 1
+
+ i = 0
+
+ while (i<line_len):
+ next_part_index = dk_next_part(line, i)
+ next_part = line[i:next_part_index]
+ next_part_latin = (line[i]<chr(0x80))
+
+ if next_part_latin:
+ next_part = next_part[::-1]
+ output_line += next_part.encode( 'utf-8' )
+ else:
+ output_line += map_dk_unicode(next_part)
+ i = next_part_index
+ # end of while
+
+ if (put_end_of_line == 1):
+ output_line += u'\u000a'
+
+ # write the processed line
+ of.write(output_line)
+ # end of line processing
+# end of file processing
+
+of.close()
+f.close()
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/ftxe-0.12.py b/Master/texmf-dist/doc/xelatex/xepersian/ftxe-0.12.py
new file mode 100755
index 00000000000..36af7b65b87
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/ftxe-0.12.py
@@ -0,0 +1,1045 @@
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses>
+
+##################################################
+# Author: Mostafa Vahedi #
+# Date: 19 August 2011 #
+# Version: 0-12 #
+# Application: FarsiTeX to XePersian converter #
+##################################################
+
+import codecs
+
+import sys
+import os
+
+ft_numerical = [
+chr(0xB9), # Arabic Thoushads Seperator
+chr(0xBC) # ARABIC DECIMAL SEPARATOR
+]
+
+
+ft_vowels = [
+chr(0xB0), # ARABIC FATHA
+chr(0xB1), # ARABIC KASRA
+chr(0xB2), # ARABIC DAMMA
+chr(0xB3), # ARABIC FATHATAN
+chr(0xB4), # ARABIC SHADDA
+chr(0xBA), # ARABIC LETTER SUPERSCRIPT ALEF
+chr(0xBB), # ARABIC HAMZA ABOVE
+chr(0xC4) # ARABIC SUKUN
+]
+
+ft_non_joiners = [
+chr(0x8F) # ARABIC LETTER HAMZA
+]
+
+ft_bidi_joiners_initial = [
+chr(0xE4), # ARABIC LETTER AIN, initial form
+chr(0xE8), # ARABIC LETTER GHAIN, initial form
+chr(0xFB) # ARABIC LETTER HEH, initial form
+]
+
+ft_bidi_joiners_medial = [
+chr(0xE3), # ARABIC LETTER AIN, medial form
+chr(0xE7), # ARABIC LETTER GHAIN, medial form
+chr(0xFA) # ARABIC LETTER HEH, medial form
+]
+
+ft_bidi_joiners_final = [
+chr(0xE2), # ARABIC LETTER AIN, final form
+chr(0xE6), # ARABIC LETTER GHAIN, final form
+chr(0xFC) # ARABIC LETTER FARSI YEH, final form
+]
+
+ft_bidi_joiners_isolated = [
+chr(0xE1), # ARABIC LETTER AIN, isolated form
+chr(0xE5), # ARABIC LETTER GHAIN, isolated form
+chr(0xFD) # ARABIC LETTER FARSI YEH, isolated form
+]
+
+ft_bidi_joiners_initial_medial = [
+chr(0x8B), # ARABIC TATWEEL
+chr(0x8E), # ARABIC LETTER YEH WITH HAMZA ABOVE, initial-medial form
+chr(0x93), # ARABIC LETTER BEH, initial-medial form
+chr(0x95), # ARABIC LETTER PEH, initial-medial form
+chr(0x97), # ARABIC LETTER TEH, initial-medial form
+chr(0x99), # ARABIC LETTER THEH, initial-medial form
+chr(0x9B), # ARABIC LETTER JEEM, initial-medial form
+chr(0x9D), # ARABIC LETTER TCHEH, initial-medial form
+chr(0x9F), # ARABIC LETTER HAH, initial-medial form
+chr(0xA1), # ARABIC LETTER KHAH, initial-medial form
+chr(0xA8), # ARABIC LETTER SEEN, initial-medial form
+chr(0xAA), # ARABIC LETTER SHEEN, initial-medial form
+chr(0xAC), # ARABIC LETTER SAD, initial-medial form
+chr(0xAE), # ARABIC LETTER DAD, initial-medial form
+chr(0xAF), # ARABIC LETTER TAH, initial-medial form
+chr(0xE0), # ARABIC LETTER ZAH, initial-medial form
+chr(0xEA), # ARABIC LETTER FEH, initial-medial form
+chr(0xEC), # ARABIC LETTER QAF, initial-medial form
+chr(0xEE), # ARABIC LETTER KEHEH, initial-medial form
+chr(0xF0), # ARABIC LETTER GAF, initial-medial form
+chr(0xF3), # ARABIC LETTER LAM, initial-medial form
+chr(0xF5), # ARABIC LETTER MEEM, initial-medial form
+chr(0xF7), # ARABIC LETTER NOON, initial-medial form
+chr(0xFE) # ARABIC LETTER FARSI YEH, initial-medial form
+]
+
+ft_bidi_joiners_final_isolated = [
+chr(0x92), # ARABIC LETTER BEH, final-isolated form
+chr(0x94), # ARABIC LETTER PEH, final-isolated form
+chr(0x96), # ARABIC LETTER TEH, final-isolated form
+chr(0x98), # ARABIC LETTER THEH, final-isolated form
+chr(0x9A), # ARABIC LETTER JEEM, final-isolated form
+chr(0x9C), # ARABIC LETTER TCHEH, final-isolated form
+chr(0x9E), # ARABIC LETTER HAH, final-isolated form
+chr(0xA0), # ARABIC LETTER KHAH, final-isolated form
+chr(0xA7), # ARABIC LETTER SEEN, final-isolated form
+chr(0xA9), # ARABIC LETTER SHEEN, final-isolated form
+chr(0xAB), # ARABIC LETTER SAD, final-isolated form
+chr(0xAD), # ARABIC LETTER DAD, final-isolated form
+chr(0xC1), # ARABIC LETTER TAH, final-isolated form
+chr(0xC2), # ARABIC LETTER ZAH, final-isolated form
+chr(0xE9), # ARABIC LETTER FEH, final-isolated form
+chr(0xEB), # ARABIC LETTER QAF, final-isolated form
+chr(0xED), # ARABIC LETTER KEHEH, final-isolated form
+chr(0xEF), # ARABIC LETTER GAF, final-isolated form
+chr(0xF1), # ARABIC LETTER LAM, final-isolated form
+chr(0xF4), # ARABIC LETTER MEEM, final-isolated form
+chr(0xF6), # ARABIC LETTER NOON, final-isolated form
+chr(0xF9) # ARABIC LETTER HEH, final-isolated form
+]
+
+ft_right_joiners_final = [
+chr(0x91) # ARABIC LETTER ALEF, final form
+]
+
+ft_right_joiners_isolated = [
+chr(0x8D), # ARABIC LETTER ALEF WITH MADDA ABOVE, isolated form
+chr(0x90) # ARABIC LETTER ALEF, isolated form
+]
+
+ft_right_joiners_final_isolated = [
+chr(0xA2), # ARABIC LETTER DAL
+chr(0xA3), # ARABIC LETTER THAL
+chr(0xA4), # ARABIC LETTER REH
+chr(0xA5), # ARABIC LETTER ZAIN
+chr(0xA6), # ARABIC LETTER JEH
+chr(0xBF), # ARABIC LETTER TEH MARBUTAH
+chr(0xF2), # ARABIC LIGATURE LAM WITH ALEF
+chr(0xF8) # ARABIC LETTER WAW
+]
+
+
+table_FT_UN = {
+chr(0x80) : [u'\u06F0'], # EXTENDED ARABIC-INDIC DIGIT ZERO
+chr(0x81) : [u'\u06F1'], # EXTENDED ARABIC-INDIC DIGIT ONE
+chr(0x82) : [u'\u06F2'], # EXTENDED ARABIC-INDIC DIGIT TWO
+chr(0x83) : [u'\u06F3'], # EXTENDED ARABIC-INDIC DIGIT THREE
+chr(0x84) : [u'\u06F4'], # EXTENDED ARABIC-INDIC DIGIT FOUR
+chr(0x85) : [u'\u06F5'], # EXTENDED ARABIC-INDIC DIGIT FIVE
+chr(0x86) : [u'\u06F6'], # EXTENDED ARABIC-INDIC DIGIT SIX
+chr(0x87) : [u'\u06F7'], # EXTENDED ARABIC-INDIC DIGIT SEVEN
+chr(0x88) : [u'\u06F8'], # EXTENDED ARABIC-INDIC DIGIT EIGHT
+chr(0x89) : [u'\u06F9'], # EXTENDED ARABIC-INDIC DIGIT NINE
+chr(0x8A) : [u'\u060C'], # ARABIC COMMA
+chr(0x8B) : [u'\u0640'], # ARABIC TATWEEL
+chr(0x8C) : [u'\u061F'], # ARABIC QUESTION MARK
+chr(0x8D) : [u'\u0622'], # ARABIC LETTER ALEF WITH MADDA ABOVE, isolated form
+chr(0x8E) : [u'\u0626'], # ARABIC LETTER YEH WITH HAMZA ABOVE, initial-medial form
+chr(0x8F) : [u'\u0621'], # ARABIC LETTER HAMZA
+chr(0x90) : [u'\u0627'], # ARABIC LETTER ALEF, isolated form
+chr(0x91) : [u'\u0627'], # ARABIC LETTER ALEF, final form
+chr(0x92) : [u'\u0628'], # ARABIC LETTER BEH, final-isolated form
+chr(0x93) : [u'\u0628'], # ARABIC LETTER BEH, initial-medial form
+chr(0x94) : [u'\u067E'], # ARABIC LETTER PEH, final-isolated form
+chr(0x95) : [u'\u067E'], # ARABIC LETTER PEH, initial-medial form
+chr(0x96) : [u'\u062A'], # ARABIC LETTER TEH, final-isolated form
+chr(0x97) : [u'\u062A'], # ARABIC LETTER TEH, initial-medial form
+chr(0x98) : [u'\u062B'], # ARABIC LETTER THEH, final-isolated form
+chr(0x99) : [u'\u062B'], # ARABIC LETTER THEH, initial-medial form
+chr(0x9A) : [u'\u062C'], # ARABIC LETTER JEEM, final-isolated form
+chr(0x9B) : [u'\u062C'], # ARABIC LETTER JEEM, initial-medial form
+chr(0x9C) : [u'\u0686'], # ARABIC LETTER TCHEH, final-isolated form
+chr(0x9D) : [u'\u0686'], # ARABIC LETTER TCHEH, initial-medial form
+chr(0x9E) : [u'\u062D'], # ARABIC LETTER HAH, final-isolated form
+chr(0x9F) : [u'\u062D'], # ARABIC LETTER HAH, initial-medial form
+chr(0xA0) : [u'\u062E'], # ARABIC LETTER KHAH, final-isolated form
+chr(0xA1) : [u'\u062E'], # ARABIC LETTER KHAH, initial-medial form
+chr(0xA2) : [u'\u062F'], # ARABIC LETTER DAL
+chr(0xA3) : [u'\u0630'], # ARABIC LETTER THAL
+chr(0xA4) : [u'\u0631'], # ARABIC LETTER REH
+chr(0xA5) : [u'\u0632'], # ARABIC LETTER ZAIN
+chr(0xA6) : [u'\u0698'], # ARABIC LETTER JEH
+chr(0xA7) : [u'\u0633'], # ARABIC LETTER SEEN, final-isolated form
+chr(0xA8) : [u'\u0633'], # ARABIC LETTER SEEN, initial-medial form
+chr(0xA9) : [u'\u0634'], # ARABIC LETTER SHEEN, final-isolated form
+chr(0xAA) : [u'\u0634'], # ARABIC LETTER SHEEN, initial-medial form
+chr(0xAB) : [u'\u0635'], # ARABIC LETTER SAD, final-isolated form
+chr(0xAC) : [u'\u0635'], # ARABIC LETTER SAD, initial-medial form
+chr(0xAD) : [u'\u0636'], # ARABIC LETTER DAD, final-isolated form
+chr(0xAE) : [u'\u0636'], # ARABIC LETTER DAD, initial-medial form
+chr(0xAF) : [u'\u0637'], # ARABIC LETTER TAH, initial-medial form
+chr(0xB0) : [u'\u064E'], # ARABIC FATHA
+chr(0xB1) : [u'\u0650'], # ARABIC KASRA
+chr(0xB2) : [u'\u064F'], # ARABIC DAMMA
+chr(0xB3) : [u'\u064B'], # ARABIC FATHATAN
+chr(0xB4) : [u'\u0651'], # ARABIC SHADDA
+chr(0xB5) : [u'\u0023'], # * #
+chr(0xB6) : [u'\u0024'], # * $
+chr(0xB7) : [u'\u0025'], # * %
+chr(0xB8) : [u'\u0026'], # * &
+chr(0xB9) : [u'\u066C'], # Arabic Thoushads Seperator
+chr(0xBA) : [u'\u0670'], # ARABIC LETTER SUPERSCRIPT ALEF
+chr(0xBB) : [u'\u0654'], # ARABIC HAMZA ABOVE
+chr(0xBC) : [u'\u066B'], # ARABIC DECIMAL SEPARATOR
+chr(0xBD) : [u'\u0029'], # * RIGHT PARENTHESIS
+chr(0xBE) : [u'\u0028'], # * LEFT PARENTHESIS
+chr(0xBF) : [u'\u0629'], # ARABIC LETTER TEH MARBUTAH
+chr(0xC0) : [u'\u00BB'], # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+chr(0xC1) : [u'\u0637'], # ARABIC LETTER TAH, final-isolated form
+chr(0xC2) : [u'\u0638'], # ARABIC LETTER ZAH, final-isolated form
+chr(0xC3) : [u'\u00AB'], # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+chr(0xC4) : [u'\u0652'], # ARABIC SUKUN
+chr(0xC5) : [u'\u002D'], # * -
+chr(0xC6) : [u'\u002E'], # * FULL STOP
+chr(0xC7) : [u'\u002F'], # * /
+chr(0xC8) : [u'\u002A'], # * *
+chr(0xC9) : [u'\u007E'], # * ~
+chr(0xCA) : [u'\u003A'], # * COLON
+chr(0xCB) : [u'\u061B'], # ARABIC SEMICOLON
+chr(0xCC) : [u'\u003E'], # * GREATER-THAN SIGN
+chr(0xCD) : [u'\u002B'], # * +
+chr(0xCE) : [u'\u003D'], # * =
+chr(0xCF) : [u'\u003C'], # * LESS-THAN SIGN
+# chr(0xD0) : [u'\u0040'], # * @
+chr(0xD0) : [u''], # * @
+chr(0xD1) : [u'\u005D'], # * [
+chr(0xD2) : [u'\u005C'], # * \
+chr(0xD3) : [u'\u005B'], # * ]
+chr(0xD4) : [u'\u005E'], # * ^
+chr(0xD5) : [u'\u005F'], # * _
+chr(0xD6) : [u'\u0060'], # * `
+chr(0xD7) : [u'\u007D'], # * {
+chr(0xD8) : [u'\u007C'], # * |
+chr(0xDA) : [u'\u0020'], # * SPACE
+chr(0xDD) : [u'\u0021'], # * EXCLAMATION MARK
+chr(0xDE) : [u'\u007B'], # * }
+chr(0xE0) : [u'\u0638'], # ARABIC LETTER ZAH, initial-medial form
+chr(0xE1) : [u'\u0639'], # ARABIC LETTER AIN, isolated form
+chr(0xE2) : [u'\u0639'], # ARABIC LETTER AIN, final form
+chr(0xE3) : [u'\u0639'], # ARABIC LETTER AIN, medial form
+chr(0xE4) : [u'\u0639'], # ARABIC LETTER AIN, initial form
+chr(0xE5) : [u'\u063A'], # ARABIC LETTER GHAIN, isolated form
+chr(0xE6) : [u'\u063A'], # ARABIC LETTER GHAIN, final form
+chr(0xE7) : [u'\u063A'], # ARABIC LETTER GHAIN, medial form
+chr(0xE8) : [u'\u063A'], # ARABIC LETTER GHAIN, initial form
+chr(0xE9) : [u'\u0641'], # ARABIC LETTER FEH, final-isolated form
+chr(0xEA) : [u'\u0641'], # ARABIC LETTER FEH, initial-medial form
+chr(0xEB) : [u'\u0642'], # ARABIC LETTER QAF, final-isolated form
+chr(0xEC) : [u'\u0642'], # ARABIC LETTER QAF, initial-medial form
+chr(0xED) : [u'\u06A9'], # ARABIC LETTER KEHEH, final-isolated form
+chr(0xEE) : [u'\u06A9'], # ARABIC LETTER KEHEH, initial-medial form
+chr(0xEF) : [u'\u06AF'], # ARABIC LETTER GAF, final-isolated form
+chr(0xF0) : [u'\u06AF'], # ARABIC LETTER GAF, initial-medial form
+chr(0xF1) : [u'\u0644'], # ARABIC LETTER LAM, final-isolated form
+chr(0xF2) : [u'\u0644\u0627'], # ARABIC LIGATURE LAM WITH ALEF
+chr(0xF3) : [u'\u0644'], # ARABIC LETTER LAM, initial-medial form
+chr(0xF4) : [u'\u0645'], # ARABIC LETTER MEEM, final-isolated form
+chr(0xF5) : [u'\u0645'], # ARABIC LETTER MEEM, initial-medial form
+chr(0xF6) : [u'\u0646'], # ARABIC LETTER NOON, final-isolated form
+chr(0xF7) : [u'\u0646'], # ARABIC LETTER NOON, initial-medial form
+chr(0xF8) : [u'\u0648'], # ARABIC LETTER WAW
+chr(0xF9) : [u'\u0647'], # ARABIC LETTER HEH, final-isolated form
+chr(0xFA) : [u'\u0647'], # ARABIC LETTER HEH, medial form
+chr(0xFB) : [u'\u0647'], # ARABIC LETTER HEH, initial form
+chr(0xFC) : [u'\u06CC'], # ARABIC LETTER FARSI YEH, final form
+chr(0xFD) : [u'\u06CC'], # ARABIC LETTER FARSI YEH, isolated form
+chr(0xFE) : [u'\u06CC'] # ARABIC LETTER FARSI YEH, initial-medial form
+}
+
+F_PERCENT_SIGN = chr(0xB7)
+F_AT_SIGN = chr(0xD0)
+F_SLASH = chr(0xD2)
+F_SPACE = chr(0xDA)
+F_PRNT_OPEN = chr(0xDE)
+F_PRNT_CLOSE = chr(0xD7)
+
+# latex and farsitex commands whose first parameter does not need \lr{...}
+commands = [
+"begin", "end",
+"input", "include", "includeonly",
+"hspace", "vspace", "hspace*", "vspace*",
+"label", "ref", "cite", "bibitem",
+"bibliographystyle",
+"parbox",
+"newenvironment", "newtheorem",
+"persianmathdigitsfamily",
+"fontfamily", "fontseries", "fontshape",
+"rmdefault", "sfdefault", "ttdefault",
+"bfdefault", "itdefault", "sldefault", "scdefault",
+"pagenumbering", "pagestyle", "thispagestyle",
+"setcounter", "stepcounter", "setlength", "addtolength"
+]
+
+def ft_is_all_persian_space(next_part):
+ l = len(next_part)
+ i = 0
+ while (i < l):
+ if (next_part[i] != F_SPACE):
+ return 0
+ i += 1
+ return 1
+
+def ft_is_numeric(ch):
+ if ((ch in ft_numerical) or
+ ((ch >= chr(0x80)) and (ch <= chr(0x89))) ):
+ return 1
+ return 0
+
+def ft_can_join_left(ch):
+ if ((ch in ft_bidi_joiners_initial) or
+ (ch in ft_bidi_joiners_medial) or
+ (ch in ft_bidi_joiners_final) or
+ (ch in ft_bidi_joiners_isolated) or
+ (ch in ft_bidi_joiners_initial_medial) or
+ (ch in ft_bidi_joiners_final_isolated)):
+ return 1
+ return 0
+
+def ft_can_join_right(ch):
+ if (ft_can_join_left(ch) or
+ (ch in ft_right_joiners_final) or
+ (ch in ft_right_joiners_isolated) or
+ (ch in ft_right_joiners_final_isolated)):
+ return 1
+ return 0
+
+def ft_joining_left(ch):
+ if ((ch in ft_bidi_joiners_initial) or
+ (ch in ft_bidi_joiners_medial) or
+ (ch in ft_bidi_joiners_initial_medial)):
+ return 1
+ return 0
+
+
+def ft_joining_right(ch):
+ if ((ch in ft_right_joiners_final) or
+ (ch in ft_bidi_joiners_medial) or
+ (ch in ft_bidi_joiners_final)):
+ return 1
+ return 0
+
+def ft_not_right_joined(ch):
+ if ((ch in ft_bidi_joiners_initial) or
+ (ch in ft_right_joiners_isolated) or
+ (ch in ft_bidi_joiners_isolated)):
+ return 1
+ return 0
+
+def ft_adjust_shaping(text, i):
+ current = text[i]
+ u = u''
+ try:
+ u = table_FT_UN[current][0]
+ except KeyError:
+ return u''
+
+ #if you don't want shaping remove the following comment
+ #return u
+
+ if ((current in ft_vowels) or (ft_is_numeric(current))):
+ return u
+
+ #find next non-vowel character on the left
+ text_len = len(text)
+ next_index = i+1
+ while ((next_index < text_len) and (text[next_index] in ft_vowels)):
+ next_index += 1
+
+ if (next_index == text_len):
+ next = ''
+ else:
+ next = text[next_index]
+
+ # if current letter is joining from left but next letter is or can not joining
+ if (ft_joining_left(current)):
+ if (not ft_can_join_right(next)):
+ u += u'\u200D' #ZWJ
+ elif (ft_not_right_joined(next)):
+ u += u'\u200D\u200C' #ZWJ+ZWNJ
+ # if current letter can join but next letter is joining from right
+ elif (ft_can_join_left(current)):
+ if (ft_joining_right(next)):
+ u += u'\u200C\u200D' #ZWNJ+ZWJ
+ elif (ft_can_join_right(next)):
+ u += u'\u200C' #ZWNJ
+ return u
+
+def ft_adjust_number(text):
+ result = u''
+ i = len(text)-1
+ while (i >= 0):
+ result += ft_adjust_shaping(text, i)
+ i -= 1
+ return result
+
+
+def map_ft_unicode(text):
+ mapped_text = u''
+
+ i = 0
+ while (i < len(text)):
+ if (ft_is_numeric(text[i])):
+ next_index = i
+ while ((next_index+1 < len(text)) and
+ (ft_is_numeric(text[next_index+1]))):
+ next_index += 1
+ mapped_text += ft_adjust_number(text[i:next_index+1])
+ i = next_index+1
+ continue
+
+ mapped_text += ft_adjust_shaping(text, i)
+ i += 1
+ return mapped_text
+
+# Finds next token all of the same language
+def ft_next_part(line, i, line_len):
+ global global_state
+ global recursive
+ global filenames
+
+ j = i
+ language_flag = (line[j]<chr(0x80))
+ while ((j<line_len) and ((line[j]<chr(0x80)) == language_flag) ):
+ if ( (global_state == 0) and ( (line[j] == '%') or (line[j] == F_PERCENT_SIGN) ) and (line[j-1] != '\\') and (line[j-1] != F_SLASH) ):
+ global_state = 1
+ elif ((global_state == 0) and ((line[j:j+16] == '\\begin{verbatim}') or (line[j:j+17] == '\\begin{verbatim*}'))):
+ global_state = 2
+ elif ((global_state == 2) and ((line[j:j+14] == '\\end{verbatim}') or (line[j:j+15] == '\\end{verbatim*}'))):
+ global_state = 0
+ elif ((global_state == 0) and (line[j:j+6] == '\\verb*')):
+ next_index = line.find(line[j+6], j+7)
+ j = next_index
+ elif ((global_state == 0) and (line[j:j+5] == '\\verb')):
+ next_index = line.find(line[j+5], j+6)
+ j = next_index
+ elif (recursive == 1):
+ if ((global_state == 0) and (line[j:j+9] == '\\include{')):
+ next_index = line.find('}', j+9)
+ filename = line[j+10:next_index-1] + '.ftx'
+ if (os.path.exists(filename) and not filename in filenames):
+ filenames.append(filename)
+ elif ((global_state == 0) and (line[j:j+7] == '\\input{')):
+ next_index = line.find('}', j+7)
+ filename = line[j+8:next_index-1] + '.ftx'
+ if (os.path.exists(filename) and not filename in filenames):
+ filenames.append(filename)
+ elif ((global_state == 0) and (line[j:j+9] == F_SLASH + 'include' + F_PRNT_OPEN)):
+ next_index = line.find(F_PRNT_CLOSE, j+9)
+ if (line[j+9]!=F_AT_SIGN):
+ filename = line[j+9:next_index] + '.ftx'
+ else:
+ filename = line[j+10:next_index-1] + '.ftx'
+ if (os.path.exists(filename) and not filename in filenames):
+ filenames.append(filename)
+ elif ((global_state == 0) and (line[j:j+7] == F_SLASH + 'input' + F_PRNT_OPEN)):
+ next_index = line.find(F_PRNT_CLOSE, j+7)
+ if (line[j+7]!=F_AT_SIGN):
+ filename = line[j+7:next_index] + '.ftx'
+ else:
+ filename = line[j+8:next_index-1] + '.ftx'
+ if (os.path.exists(filename) and not filename in filenames):
+ filenames.append(filename)
+ j += 1
+ return j
+
+###############################################
+# from here all functions are used to translate
+# farsitex commands to xepersian commands
+###############################################
+
+def read_size(input,index,last_index):
+ dim_index = -1
+ inch_index = input.find(u'in', index)
+ if (inch_index != -1):
+ dim_index = inch_index
+ mm_index = input.find(u'mm', index)
+ if (mm_index != -1):
+ if (dim_index == -1 or mm_index < index):
+ dim_index = mm_index
+ cm_index = input.find(u'cm', index)
+ if (cm_index != -1):
+ if (dim_index == -1 or cm_index < dim_index):
+ dim_index = cm_index
+ pt_index = input.find(u'pt', index)
+ if (pt_index != -1):
+ if (dim_index == -1 or pt_index < dim_index):
+ dim_index = pt_index
+ next_cmd = input.find(u'\\', index)
+ if (next_cmd == -1 and dim_index == -1):
+ print "Error in parsing \epsfxsize command at " + str(line_number) + "\n"
+ return -1
+ elif (next_cmd == -1 or (dim_index != -1 and next_cmd > dim_index)):
+ epsfxsize = input[index:dim_index+2]
+ return dim_index+2
+ elif (next_cmd != -1):
+ end_cmd = next_cmd+1
+ while (end_cmd < last_index and input[end_cmd].isalpha()):
+ end_cmd += 1
+ return end_cmd
+ else:
+ print "Error in parsing \epsfxsize command at " + str(line_number) + "\n"
+ return -1
+
+
+latex_options=[u'a4paper', u'a5paper', u'b5paper',
+ u'letterpaper', u'legalpaper', u'executivepaper',
+ u'landscape', u'10pt', u'11pt', u'12pt',
+ u'oneside', u'twoside', u'draft',
+ u'final', u'titlepage', u'notitlepage',
+ u'onecolumn', u'twocolumn',
+ u'leqno', u'fleqn']
+
+table_eq_packages = {
+u'poem' : u'persianpoem',
+u'fmakeidx' : u'makeidx',
+u'ffancyhe' : u'fancyhdr',
+u'fmultico' : u'multicol'
+}
+
+farsitex_ignore_options = [u'persian', u'farsi', u'epsf', u'fgraphix', u'lotusfont']
+
+xepersian_packages = u'\n\\usepackage{url}\n%\\usepackage{fancyvrb}\n\\usepackage{setspace}\\doublespacing\n\\usepackage{graphicx} \n\\usepackage{amssymb}\n'
+
+xepersian_preamble = u'\\settextfont[Scale=1.2]{XB Zar}\n\\setlatintextfont[Scale=1.1]{Times New Roman}\n\\setdigitfont{XB Zar}\n\\setpookfont{XB Kayhan Pook}\n\\setsayehfont{XB Kayhan Sayeh}\n\\defpersianfont\\lotoos[Scale=1.2]{XB Roya}\n\\defpersianfont\elmi[Scale=1.2]{XB Roya} \n\\def\\nazok{\\normalfont\\normalsize}\n\\let\\iranic\\it\n\\let\\siah\\bf\n\\let\\khabide\\sl\n\\def\\siahir{\\siah\\iranic} \n\\def\\siahkh{\\siah\\khabide}\n\\let\\tookhali\\pookfamily\n\\let\\sayedar\\sayehfamily\n\\def\\farsi{\\end{latin}}\n\\def\\english{\\begin{latin}}\n\\let\\farmbox\\mbox\n\\newcommand{\\ftxepmatrix}[1]{\\begin{pmatrix}#1\\end{pmatrix}}\n\\newcommand{\\ftxematrix}[1]{\\begin{matrix}#1\\end{matrix}} \n\\def\\FarsiTeX{\\lr{FarsiTeX}}\n\\def\\فارسی‌تک{\\rl{فارسی‌‌تک}}\n\\def\\InE{\\begingroup\\beginL\\latinfont}\n\\def\\EnE{\\endL\\endgroup} \n\\def\\InF{\\begingroup\\beginR\\persianfont}\n\\def\\EnF{\\endR\\endgroup}\n\\newcommand{\\IE}[1]{\\lr{#1}}\n\\newcommand{\\IP}[1]{\\rl{#1}} \n\\newcommand{\\IF}[1]{\\rl{#1}}\n\\def\\persiandash{\\rl{-}} \n\\def\\DeclareRobustBiCommand#1#2#3#4{\\DeclareRobustCommand#1{\\if@rl{}#4\\else{}#3\\fi}\\let#2=#1} \n\\catcode`\\﷼=3\n\\catcode`‌=11\n\\newcommand\\dotsectionseparator{\\SepMark{.}}\n\\newcommand\\dashsectionseparator{\\SepMark{-}}\n'
+
+thesis_preamble = u'\\university{\\lr{UniversityName}}\n\\city{\\lr{CityName}}\n\\latinuniversity{UniversityName}\n\\latincity{CityName} \n\\let\\englishtitle\\latintitle\n\\let\\englishauthor\\latinauthor\n\\let\\englishdegree\\latindegree\n\\let\\englishthesisdate\\latinthesisdate \n\\let\\englishsupervisor\\latinsupervisor\n\\let\\englishdepartment\\latindepartment\n\\let\\makeenglishtitle\\makelatintitle \n\\let\\englishkeywords\\latinkeywords\n\\newenvironment{englishabstract}{\\begin{latinabstract}}{\\end{latinabstract}}\n'
+
+def is_alpha_numeric_space(input):
+ input_len = len(input)
+ i = 0
+ while (i<input_len):
+ if (not (input[i].isalpha() or input[i].isdigit() or input[i]==u'.' or input[i]==u' ') ):
+ return 0
+ i+=1
+ return 1
+
+def is_alpha_numeric(input):
+ input_len = len(input)
+ i = 0
+ while (i<input_len):
+ if (not (input[i].isalpha() or input[i].isdigit() or input[i]=='.') ):
+ return 0
+ i+=1
+ return 1
+
+def find_eq_cmd(keyword):
+ try:
+ eq_cmd = table_eq_packages[keyword]
+ except KeyError:
+ eq_cmd = u''
+ return eq_cmd
+
+def convert_persian_to_english(num):
+ result = u''
+ num_len = len(num)
+ index = 0
+ while (index < num_len):
+ if (ord(num[index]) >= ord(u'۰') and ord(num[index]) <= ord(u'۹')):
+ result += unichr(ord(num[index]) - ord(u'۰') + ord(u'0'))
+ else:
+ result += num[index]
+ index += 1
+ return result
+
+def generate_farsitex_cmds_file(helper_filename,preamble):
+ try:
+ of = codecs.open(helper_filename, encoding='utf-8', mode='w')
+ except IOError:
+ print "Can not open the output file: " + helper_filename
+ exit(0)
+ of.write(preamble)
+ of.close
+
+
+# \verb|| -> \item[\verb||] or \section{\verb||}
+# \kasre{} \alef{} ...
+def translate_cmds(output_line):
+ global last_epsfxsize
+ global last_epsfxsize_line
+ global last_epsfysize
+ global last_epsfysize_line
+ global state
+ global filename
+
+ result = u''
+ line_len = len(output_line)
+ index = 0
+ if (state == 1): #\begin{verbatim}
+ end_verbatim = output_line.find('\\end{verbatim}')
+ if (end_verbatim == -1):
+ return output_line
+ result += output_line[0:end_verbatim+14]
+ index = end_verbatim+14
+ state = 0
+ elif (state == 2): #\begin{verbatim*}
+ end_verbatim = output_line.find('\\end{verbatim*}')
+ if (end_verbatim == -1):
+ return output_line
+ result += output_line[0:end_verbatim+15]
+ index = end_verbatim+15
+ state = 0
+ elif (output_line[0:14] == "\\documentstyle"):
+ result += u'\\documentclass'
+ #process options
+ last_index = output_line.find(u']')
+ index = 15
+ first_option = 1
+ preamble = xepersian_preamble
+ packages = xepersian_packages
+ xe_document_class = u''
+ while (index < last_index):
+ next_comma = output_line.find(u',',index,last_index)
+ if (next_comma == -1):
+ next_comma = last_index
+ first_of_option = index
+ while (output_line[first_of_option] == u' '):
+ first_of_option += 1
+ end_of_option = next_comma
+ while (output_line[end_of_option-1] == u' '):
+ end_of_option -= 1
+ option = output_line[first_of_option:end_of_option]
+ index = next_comma+1
+ eq_cmd = find_eq_cmd(option)
+ if (eq_cmd != u''):
+ packages += u'\\usepackage{' + eq_cmd + u'}\n'
+ continue
+ elif (option in farsitex_ignore_options):
+ continue
+ elif (option == u'sharifth'):
+ xe_document_class = u'xepersian-thesis'
+ preamble += thesis_preamble
+ continue
+ elif (not option in latex_options):
+ packages += u'\\usepackage{' + option + u'}\n'
+ continue
+
+ if (first_option):
+ result += u'['
+ else:
+ result += u','
+ result += option
+ first_option = 0
+ #end while
+ if (not first_option):
+ result += u']'
+ # process document style into document class
+ index = output_line.find(u'}',last_index)
+ document_class = output_line[last_index+2:index]
+ if (xe_document_class != u''):
+ result += u'{' + xe_document_class + u'}'
+ elif (document_class == u'oldarticle'):
+ result += u'{article}'
+ elif (document_class == u'oldbook'):
+ result += u'{book}'
+ elif (document_class == u'oldreport'):
+ result += u'{report}'
+ else:
+ result += u'{' + document_class + u'}'
+ # I assume that nothing important is after
+ # \documentstyle[...]{...}, otherwise it may conflict
+ # with our preamble
+ if (index != -1):
+ result += output_line[index+1:]
+ result += packages + u'\\usepackage{xepersian}\n'
+ helper_filename = filename + '_farsitex_cmds_xepersian.tex'
+ generate_farsitex_cmds_file(helper_filename,preamble)
+ result += '\\input{' + helper_filename + '}\n'
+ return result
+ #end elif "documentstyle"
+
+ while (index < line_len):
+ next_index = output_line.find(u'\\', index)
+ comment_index = output_line.find(u'%', index)
+ if (next_index == -1):
+ result += output_line[index:]
+ break
+ elif (state == 1):
+ if (output_line[next_index:next_index+14] == u'\\end{verbatim}'):
+ result += output_line[index:next_index+14]
+ index = next_index+14
+ state = 0
+ else:
+ result += output_line[index:next_index+1]
+ index = next_index+1
+ elif (state == 2):
+ if (output_line[next_index:next_index+15] == u'\\end{verbatim*}'):
+ result += output_line[index:next_index+15]
+ index = next_index+15
+ state = 0
+ else:
+ result += output_line[index:next_index+1]
+ index = next_index+1
+ elif (comment_index != -1 and comment_index < next_index):
+ result += output_line[index:]
+ break
+ elif (output_line[next_index:next_index+14] == u"\\input{amssym}"):
+ result += u'\\usepackage{amssymb}'
+ index = next_index+14
+ elif (output_line[next_index:next_index+12] == u"\\input{epsf}"):
+ index = next_index+12
+ elif (output_line[next_index:next_index+15] == u"\\includeepspdf{"):
+ result += u'\\includegraphics{'
+ index = next_index+15
+ elif (output_line[next_index:next_index+16] == u"\\begin{verbatim}"):
+ result += output_line[index:next_index+16]
+ index = next_index+16
+ state = 1
+ elif (output_line[next_index:next_index+17] == u"\\begin{verbatim*}"):
+ result += output_line[index:next_index+17]
+ index = next_index+17
+ state = 2
+ elif (output_line[next_index:next_index+26] == u'\\setlength{\\headrulewidth}'):
+ end_cmd = output_line.find('}', next_index+26)
+ result += u'\\renewcommand{\\headrulewidth}' + output_line[next_index+26:end_cmd+1]
+ index = end_cmd+1
+ elif (output_line[next_index:next_index+26] == u'\\setlength{\\footrulewidth}'):
+ end_cmd = output_line.find('}', next_index+26)
+ result += u'\\renewcommand{\\footrulewidth}' + output_line[next_index+26:end_cmd+1]
+ index = end_cmd+1
+ elif (output_line[next_index:next_index+10] == u"\\epsffile{"):
+ result += output_line[index:next_index]
+ result += u'\\includegraphics'
+ size_options = u''
+ if (line_number - last_epsfxsize_line <= 3):
+ size_options = u'width=' + last_epsfxsize
+ if (line_number - last_epsfysize_line <= 3):
+ if (size_options != u''):
+ size_options += u','
+ size_options += u'height=' + last_epsfysize
+ if (size_options != u''):
+ result += u'[' + size_options + u']'
+ end_prn = output_line.find(u'.eps}', next_index+9)
+
+ if (end_prn != -1):
+ result += output_line[next_index+9:end_prn] + u'}'
+ index = end_prn+5
+ else:
+ end_prn = output_line.find(u'.ps}', next_index+9)
+ if (end_prn != -1):
+ result += output_line[next_index+9:end_prn] + u'}'
+ index = end_prn+4
+ else:
+ end_prn = output_line.find(u'}', next_index+9)
+ result += output_line[next_index+9:end_prn+1]
+ index = end_prn+1
+ # I assume all the parameter of \epsfxsize comes in one line
+ elif (output_line[next_index:next_index+11] == u"\\epsfxsize="):
+ end_size = read_size(output_line, next_index+11, line_len)
+ if (end_size != -1):
+ last_epsfxsize = output_line[next_index+11:end_size]
+ index = end_size
+ else:
+ index = next_index+11
+ last_epsfxsize_line = line_number
+ # I assume all the parameter of \epsfysize comes in one line
+ elif (output_line[next_index:next_index+11] == u"\\epsfysize="):
+ end_size = read_size(output_line, next_index+11, line_len)
+ if (end_size != -1):
+ last_epsfysize = output_line[next_index+11:end_size]
+ index = end_size
+ else:
+ index = next_index+11
+ last_epsfysize_line = line_number
+ elif (output_line[next_index:next_index+10] == u"\\LR{\\verb*"):
+ end_verb = output_line.find(output_line[next_index+10], next_index+11)
+ verb_param = output_line[next_index+11:end_verb]
+ if (is_alpha_numeric(verb_param)):
+ result += output_line[index:next_index]
+ result += u'\\lr{\\tt{}' + verb_param
+ else:
+ result += output_line[index:end_verb+1]
+ index = end_verb+1
+ elif (output_line[next_index:next_index+9] == u"\\LR{\\verb"):
+ end_verb = output_line.find(output_line[next_index+9], next_index+10)
+ verb_param = output_line[next_index+10:end_verb]
+ if (is_alpha_numeric_space(verb_param)):
+ result += output_line[index:next_index]
+ result += u'\\lr{\\tt{}' + verb_param
+ else:
+ result += output_line[index:end_verb+1]
+ index = end_verb+1
+ elif (output_line[next_index:next_index+6] == u"\\verb*"):
+ end_verb = output_line.find(output_line[next_index+6], next_index+7)
+ result += output_line[index:end_verb+1]
+ index = end_verb+1
+ elif (output_line[next_index:next_index+5] == u"\\verb"):
+ end_verb = output_line.find(output_line[next_index+5], next_index+6)
+ result += output_line[index:end_verb+1]
+ index = end_verb+1
+ elif (output_line[next_index:next_index+9] == u"\\pmatrix{"):
+ result += u'\\ftxepmatrix{'
+ index = next_index+9
+ elif (output_line[next_index:next_index+8] == u"\\matrix{"):
+ result += u'\\ftxematrix{'
+ index = next_index+8
+ elif (output_line[next_index:next_index+16] == u"\\begin{document}"):
+ result += u'\\begin{document}\n%\\VerbatimFootnotes'
+ index = next_index+16
+ elif (output_line[next_index:next_index+8] == u'\\label {'):
+ begin_param = next_index+8
+ end_param = output_line.find(u'}', begin_param)
+ param = convert_persian_to_english(output_line[begin_param:end_param])
+ result += output_line[index:begin_param-2]
+ result += u'{' + param + u'}'
+ index = end_param+1
+ elif (output_line[next_index:next_index+6] == u'\\ref {'):
+ begin_param = next_index+6
+ end_param = output_line.find(u'}', begin_param)
+ param = convert_persian_to_english(output_line[begin_param:end_param])
+ result += output_line[index:begin_param-2]
+ result += u'{' + param + u'}'
+ index = end_param+1
+ elif (output_line[next_index:next_index+7] == u'\\label{'):
+ begin_param = next_index+7
+ end_param = output_line.find(u'}', begin_param)
+ param = convert_persian_to_english(output_line[begin_param:end_param])
+ result += output_line[index:begin_param]
+ result += param + u'}'
+ index = end_param+1
+ elif (output_line[next_index:next_index+5] == u'\\ref{'):
+ begin_param = next_index+5
+ end_param = output_line.find(u'}', begin_param)
+ param = convert_persian_to_english(output_line[begin_param:end_param])
+ result += output_line[index:begin_param]
+ result += param + u'}'
+ index = end_param+1
+ elif (output_line[next_index:next_index+13] == u'\\multicolumn{'):
+ begin_param = next_index+13
+ end_param = output_line.find(u'}', begin_param)
+ param = convert_persian_to_english(output_line[begin_param:end_param])
+ result += output_line[index:begin_param]
+ result += param + u'}'
+ index = end_param+1
+ elif (output_line[next_index:next_index+12] == u'\\setcounter{'):
+ begin_num = output_line.find(u'{', next_index+12)
+ end_num = output_line.find(u'}', begin_num)
+ num = convert_persian_to_english(output_line[begin_num+1:end_num])
+ result += output_line[index:begin_num+1]
+ result += num + u'}'
+ index = end_num+1
+ elif (output_line[next_index:next_index+14] == u'\\addtocounter{'):
+ begin_num = output_line.find(u'{', next_index+14)
+ end_num = output_line.find(u'}', begin_num)
+ num = convert_persian_to_english(output_line[begin_num+1:end_num])
+ result += output_line[index:begin_num+1]
+ result += num + u'}'
+ index = end_num+1
+ else:
+ result += output_line[index:next_index+2]
+ index = next_index+2
+ #end while
+ return result
+
+###############################################
+# from here all functions are mainly used to
+# convert farsitex format to unicode
+###############################################
+
+def convert_file(f, of, convert_cmds):
+ global state
+ global line_number
+ global last_epsfysize_line
+ global last_epsfxsize_line
+ global last_epsfxsize
+ global last_epsfysize
+ global global_state
+
+ state = 0
+ line_number = 0
+ last_epsfysize_line = 0
+ last_epsfxsize_line = 0
+ last_epsfxsize = u''
+ last_epsfysize = u''
+
+ for line in f:
+ line_number += 1
+ print line_number,
+ output_line = u''
+ line_len = len(line)
+
+ # remove new-line characters from end of line
+ if (line_len>1 and line[line_len-1] == '\n'):
+ line_len-=1
+ if (line_len>1 and line[line_len-1] == '\r'):
+ line_len-=1
+
+ # check line-direction character
+ line_direction_rtl = (line[0] == '<')
+ if (line[0] != '>') and (line[0] != '<'):
+ print "FORMAT ERROR AT LINE: " + str(line_number)
+ exit(0)
+
+ i = 1
+
+ while (i<line_len):
+ next_part_index = ft_next_part(line, i, line_len)
+ next_part = line[i:next_part_index]
+ next_part_latin = (line[i]<chr(0x80))
+
+ # see if we should put \lr{...} for the current english expression
+ if (global_state == 0):
+ if line_direction_rtl and next_part_latin:
+ is_command_rtl = (next_part_latin and (i>1) and (line[i-1]==F_SLASH) )
+ is_parameter_rtl = (next_part_latin and (i>1) and (next_part_index<line_len) and (line[i-1]==F_AT_SIGN) and (line[next_part_index]==F_AT_SIGN) )
+ is_math_rtl = (next_part_latin and (line[i]=="$") and (line[next_part_index-1]=="$") )
+ is_verb_parameter = ( (line[i-6:i] == F_SLASH+"verb") and not isalpha(line[i]))
+ is_verb = (next_part_latin and (line[i:i+5]=='\\verb' or line[i:i+6]==' \\verb'))
+ is_english = (next_part_latin and (line[i:i+8]=='\\english'))
+
+ cmd_index = 0
+ while cmd_index < len(commands):
+ len_cmd = len(commands[cmd_index])+2
+ if ( (i > len_cmd) and (line[i-len_cmd:i] == F_SLASH+commands[cmd_index]+F_PRNT_OPEN) ):
+ break
+ elif ( (i > len_cmd+1) and (line[i-len_cmd-1:i] == F_SLASH+commands[cmd_index]+F_SPACE+F_PRNT_OPEN) ):
+ break
+ cmd_index += 1
+ is_commands_group = cmd_index < len(commands)
+ is_documentstyle_cmd = (line_len > 15) and (line[1:15] == F_SLASH+"documentstyle")
+
+ if next_part_latin:
+ if (global_state == 0):
+ # whether we should put a \lr{ command
+ if ( line_direction_rtl and not (is_command_rtl or is_parameter_rtl or is_math_rtl or is_commands_group or is_documentstyle_cmd or is_verb_parameter or is_verb or is_english) ):
+ output_line += u'\\lr{'
+ if ( line_direction_rtl and is_verb):
+ output_line += u'\\LR{'
+
+ # here is the main place that converting happens
+ output_line += next_part.encode( 'utf-8' )
+
+ if (global_state == 0):
+ # check whether we already used a \lr command: then end it
+ if ( line_direction_rtl and not (is_command_rtl or is_parameter_rtl or is_math_rtl or is_commands_group or is_documentstyle_cmd or is_verb_parameter or is_verb or is_english) ):
+ output_line += u'}'
+ if ( line_direction_rtl and is_verb):
+ output_line += u'}'
+ else:
+ if (global_state == 0):
+ # whether we should put a \rl{} command
+ if ( not line_direction_rtl and not ft_is_all_persian_space(next_part)):
+ output_line += u'\\rl{'
+
+ # here is the main place that converting happens
+ output_line += map_ft_unicode(next_part)
+
+ if (global_state == 0):
+ # check whether we already used a \rl command: then end it
+ if (not line_direction_rtl and not ft_is_all_persian_space(next_part)):
+ output_line += u'}'
+
+ i = next_part_index
+ # end of while
+
+ #if there was a % commenting then we can return to normal situation
+ if (global_state == 1):
+ global_state = 0
+
+ # convert some of the FarsiTeX commands to XePersian commands
+ # only if it is requested
+ if (convert_cmds):
+ result = translate_cmds(output_line)
+ else:
+ result = output_line
+ output_line = result + u'\n'
+ # write the processed line
+ of.write(output_line)
+ # end of line processing
+ # end of file processing
+
+def print_usage():
+ print 'usage: python ftxe-0-11 [-r] [-s] [-x] [-u] in_filename1 in_filename2'
+ print '-r: (DEFAULT) recursively consider files included in the given files'
+ print '-s: do not recursively consider files'
+ print '-x: (DEFAULT) insert xepersian related commands'
+ print '-u: only convert to unicode'
+
+###################################
+# Begin of main body of the program
+###################################
+
+# global variables
+line_number = 0
+last_epsfxsize = u''
+last_epsfxsize_line = 0
+last_epsfysize = u''
+last_epsfysize_line = 0
+state = 0
+global_state = 0
+recursive = 1
+convert_xepersian = 1
+filename = ''
+
+if len(sys.argv) <= 1:
+ print_usage()
+ exit(0)
+
+#find options
+options_index = 1
+while (options_index < len(sys.argv) and sys.argv[options_index][0]=='-'):
+ if (sys.argv[options_index]=='-s'):
+ recursive = 0
+ elif (sys.argv[options_index]=='-u'):
+ convert_xepersian = 0
+ options_index += 1
+
+filenames = []
+while (options_index < len(sys.argv)):
+ filenames.append(sys.argv[options_index])
+ options_index += 1
+
+if (len(filenames) == 0):
+ print 'error: no input filename is specified!'
+ print_usage()
+ exit(0)
+
+index = 0
+while (index < len(filenames)):
+ filename = filenames[index]
+ index += 1
+
+ outfile = ''
+ if (filename[-4:] != '.tex'):
+ outfile = filename[0:-3] + 'tex'
+ else:
+ outfile = filename + '.tex'
+
+ print '\n\nConverting "' + filename + '" into "' + outfile + '"'
+ try:
+ f = open(filename, 'r')
+ except IOError:
+ print "Can not open the input file: " + filename
+ exit(0)
+
+ try:
+ of = codecs.open(outfile, encoding='utf-8', mode='w')
+ except IOError:
+ print "Can not open the output file: " + outfile
+ exit(0)
+
+ convert_file(f, of, convert_xepersian)
+
+ of.close()
+ f.close()
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/img/ireland.jpg b/Master/texmf-dist/doc/xelatex/xepersian/img/ireland.jpg
new file mode 100644
index 00000000000..bacd5b97700
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/img/ireland.jpg
Binary files differ
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/img/weather/clouds.jpg b/Master/texmf-dist/doc/xelatex/xepersian/img/weather/clouds.jpg
new file mode 100644
index 00000000000..b4073a07231
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/img/weather/clouds.jpg
Binary files differ
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/img/weather/rain.jpg b/Master/texmf-dist/doc/xelatex/xepersian/img/weather/rain.jpg
new file mode 100644
index 00000000000..f33b75e7a0c
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/img/weather/rain.jpg
Binary files differ
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/img/weather/sun.jpg b/Master/texmf-dist/doc/xelatex/xepersian/img/weather/sun.jpg
new file mode 100644
index 00000000000..1e823100386
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/img/weather/sun.jpg
Binary files differ
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/magazine-sample.tex b/Master/texmf-dist/doc/xelatex/xepersian/magazine-sample.tex
new file mode 100644
index 00000000000..e23db38de05
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/magazine-sample.tex
@@ -0,0 +1,172 @@
+\documentclass[12pt,twoside]{xepersian-magazine}
+\usepackage{graphicx}
+\usepackage{xltxtra}
+\usepackage{amsmath}
+\usepackage{xepersian}
+\settextfont[Scale=1]{XB Zar}
+\setlatintextfont[Scale=1]{Junicode}
+\setmathdigitfont{XB Zar}
+\pagestyle{fancy}
+\title{مجلهٔ زی‌پرشین}
+\author{وفا خلیقی}
+\edition{جلد اول}
+\customlogo{مجلهٔ زی‌پرشین}
+\customminilogo{مجلهٔ زی‌پرشین}
+\custommagazinename{مجلهٔ زی‌پرشین}
+\customwwwTxt{http://google.com}
+\begin{document}
+\begin{frontpage}
+\firstimage{img/ireland.jpg}{این زیرنویس تصویر اصلی در صفحهٔ اول است.}
+\firstarticle{این تیتر مقالهٔ اول است.}
+{خوب این قسمت کوچکی از مقالهٔ اول است که ما در حال نوشتن آن هستم. باید یک مقدار بنویسیم تا مقداری این قسمت پر شود تا بتوانیم چیز قشنگی داشته باشیم. دقت کنیم که بصورت انتخابی حتی می‌توانیم زمان را هم درج کنیم که در سمت راست قرار می‌گیرد.}%
+{۱۲:۳۴}
+\secondarticle{این هم سر تیتر مقالهٔ دوم است.}%
+{این هم زیر تیتر مقالهٔ دوم است که آن را در اینجا می‌نویسیم.}%
+{خوب این قسمت کوچکی از مقالهٔ اول است که ما در حال نوشتن آن هستم. باید یک مقدار بنویسیم تا مقداری این قسمت پر شود تا بتوانیم چیز قشنگی داشته باشیم. دقت کنیم که بصورت انتخابی حتی می‌توانیم زمان را هم درج کنیم که در سمت راست قرار می‌گیرد.}%
+{قسمت الف}%
+{۱۰:۲۳}
+
+\thirdarticle{این سرتیتر مقالهٔ سوم است.}%
+{این هم زیرتیتر مقالهٔ سوم است که ما آن را در اینجا قرار می‌دهیم.}%
+{خوب این قسمت کوچکی از مقالهٔ اول است که ما در حال نوشتن آن هستم. باید یک مقدار بنویسیم تا مقداری این قسمت پر شود تا بتوانیم چیز قشنگی داشته باشیم. دقت کنیم که بصورت انتخابی حتی می‌توانیم زمان را هم درج کنیم که در سمت راست قرار می‌گیرد. و همانطور که می‌بینید من مطلبی برای گفتن ندارم فقط متن علکی می‌نویسم تا کمی صفحه را پر کرده باشم. اما در قسمتهای بعدی مقداری از سهراب سپهری خواهم نوشت.}%
+
+{قسمت ب}%
+{۱۰:۰۲}
+
+\begin{indexblock}{نمایه (فهرست مطالب) اصلی}
+\indexitem{۱- مقاله اول}{1}
+
+\indexitem{۲- مقاله دوم}{3}
+
+\indexitem{۳- مقاله سوم}{3}
+
+\indexitem{۴- مقاله چهارم}{5}
+\end{indexblock}
+
+\begin{weatherblock}{وضع آب و هوا}
+\weatheritem{img/weather/rain.jpg}{امروز}{13}{9}{}
+\weatheritem{img/weather/sun.jpg}{فردا}{15}{1}{}
+\weatheritem{img/weather/clouds.jpg}{جمعه}{12}{6}{}
+\end{weatherblock}
+
+\begin{authorblock}
+\textbf{ویرایشگران}
+
+وفا خلیقی، مهدی امیدعلی و مصطفی واحدی
+
+\texttt{me@somedomain.com\\[5pt]
+http://google.com}\\
+\end{authorblock}
+\end{frontpage}
+\newsection{قسمت الف}
+\begin{article}{2}
+{این تیتر این مقاله است.}
+{این هم زیرتیتر این مقاله هست.}
+{قسمت الف}
+{1}
+\authorandplace{نام نویسنده}{مکان}
+
+\noindent\timestamp{۸:۲۵}
+ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.
+\footnote{این یک زیرنویس فارسی است.}\LTRfootnote{This is an English footnote.}
+\begin{equation}
+(a+b)^3=a^3+3a^2b+3ab^2+b^3\label{eq-1}
+\end{equation}
+این معادلهٔ \eqref{eq-1} است.
+\columntitle{lines}{این را برای مهم یا نشان دادن حرفی مهم در این مجله انجام می‌دهیم.}
+
+ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.
+
+اما معماری همتابه‌همتا ويژگی‌های ديگری نيز دارد که آن را هم برای فراهم‌کنندگان کاربردها و هم برای استفاده‌کنندگان جذاب‌تر می‌کند. از آن‌جا که شبکه‌های همتابه‌همتا از همان زيرساخت‌های اينترنت استفاده می‌کنند ونيازی به راه‌اندازی سرورها ندارند، ساخت اين شبكه‌ها بسيار ارزان‌تر از ايجاد زير ساخت‌های لازم برای راه‌اندازی شبكه‌های مشتری/خدمت‌گزار است. هم‌چنين با زياد شدن تعداد کاربران چون درعمل تعداد گره‌های ارائه کننده‌ی خدمات هم بالا می‌رود، نه تنها عملكرد شبكه افت پيدا نمی‌كند بلكه انتظار بهبود عملکرد نيز می‌رود. گذشته از اين موارد، مالكيت اين شبكه‌ها به صورت اشتراكی بين تمام کاربران پخش شده و هيچ شخص يا شركتی نمی‌تواند سياست‌های دلخواه خود را در اين نوع شبكه‌ها اعمال کند.
+
+اماهيچ چيزی بی‌ بها به دست نمی‌آید. نبود سرور مرکزی اگر چه ويژگی‌های جذابی به شبکه‌های همتابه‌همتا می‌بخشد اما از طرف ديگر آن‌ها را با دشواری‌هايی نيز روبه‌رو می‌کند. عدم وجود يك هماهنگ كننده مركزی در شبكه، انجام بسياری از امور و ارائه خدمات را دچار مشكل می‌کند. از يک طرف، تغيير و رفت‌وآمد زیاد کاربران از ويژگی‌های ذاتی اين شبکه‌ها است و از طرف ديگر در اين شبكه‌ها، ديگر اين گره‌های معمولی هستند كه عهده‌دار تمامی وظايف هستند. به همين دلیل يکی از مشکلات اصلی فراروی اين شبكه‌ها، مقابله با تغييرات لحظه‌ای و فراهم آوردن ثبات در ارائه خدمات در بستری از بی‌ثباتی است.
+\end{article}
+
+\articlesep
+
+\begin{article}{2}
+{این تیتر این مقاله است.}
+{این هم زیرتیتر این مقاله هست.}
+{قسمت الف}
+{1}
+\authorandplace{نام نویسنده}{مکان}
+
+\noindent\timestamp{08:25}
+ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.
+\LTRfootnote{This is an English footnote.}\footnote{این یک زیرنویس فارسی است.}
+اما معماری همتابه‌همتا ويژگی‌های ديگری نيز دارد که آن را هم برای فراهم‌کنندگان کاربردها و هم برای استفاده‌کنندگان جذاب‌تر می‌کند. از آن‌جا که شبکه‌های همتابه‌همتا از همان زيرساخت‌های اينترنت استفاده می‌کنند ونيازی به راه‌اندازی سرورها ندارند، ساخت اين شبكه‌ها بسيار ارزان‌تر از ايجاد زير ساخت‌های لازم برای راه‌اندازی شبكه‌های مشتری/خدمت‌گزار است. هم‌چنين با زياد شدن تعداد کاربران چون درعمل تعداد گره‌های ارائه کننده‌ی خدمات هم بالا می‌رود، نه تنها عملكرد شبكه افت پيدا نمی‌كند بلكه انتظار بهبود عملکرد نيز می‌رود. گذشته از اين موارد، مالكيت اين شبكه‌ها به صورت اشتراكی بين تمام کاربران پخش شده و هيچ شخص يا شركتی نمی‌تواند سياست‌های دلخواه خود را در اين نوع شبكه‌ها اعمال کند.
+
+اماهيچ چيزی بی‌ بها به دست نمی‌آید. نبود سرور مرکزی اگر چه ويژگی‌های جذابی به شبکه‌های همتابه‌همتا می‌بخشد اما از طرف ديگر آن‌ها را با دشواری‌هايی نيز روبه‌رو می‌کند. عدم وجود يك هماهنگ كننده مركزی در شبكه، انجام بسياری از امور و ارائه خدمات را دچار مشكل می‌کند. از يک طرف، تغيير و رفت‌وآمد زیاد کاربران از ويژگی‌های ذاتی اين شبکه‌ها است و از طرف ديگر در اين شبكه‌ها، ديگر اين گره‌های معمولی هستند كه عهده‌دار تمامی وظايف هستند. به همين دلیل يکی از مشکلات اصلی فراروی اين شبكه‌ها، مقابله با تغييرات لحظه‌ای و فراهم آوردن ثبات در ارائه خدمات در بستری از بی‌ثباتی است.
+
+ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.
+
+اما معماری همتابه‌همتا ويژگی‌های ديگری نيز دارد که آن را هم برای فراهم‌کنندگان کاربردها و هم برای استفاده‌کنندگان جذاب‌تر می‌کند. از آن‌جا که شبکه‌های همتابه‌همتا از همان زيرساخت‌های اينترنت استفاده می‌کنند ونيازی به راه‌اندازی سرورها ندارند، ساخت اين شبكه‌ها بسيار ارزان‌تر از ايجاد زير ساخت‌های لازم برای راه‌اندازی شبكه‌های مشتری/خدمت‌گزار است. هم‌چنين با زياد شدن تعداد کاربران چون درعمل تعداد گره‌های ارائه کننده‌ی خدمات هم بالا می‌رود، نه تنها عملكرد شبكه افت پيدا نمی‌كند بلكه انتظار بهبود عملکرد نيز می‌رود. گذشته از اين موارد، مالكيت اين شبكه‌ها به صورت اشتراكی بين تمام کاربران پخش شده و هيچ شخص يا شركتی نمی‌تواند سياست‌های دلخواه خود را در اين نوع شبكه‌ها اعمال کند.
+
+اماهيچ چيزی بی‌ بها به دست نمی‌آید. نبود سرور مرکزی اگر چه ويژگی‌های جذابی به شبکه‌های همتابه‌همتا می‌بخشد اما از طرف ديگر آن‌ها را با دشواری‌هايی نيز روبه‌رو می‌کند. عدم وجود يك هماهنگ كننده مركزی در شبكه، انجام بسياری از امور و ارائه خدمات را دچار مشكل می‌کند. از يک طرف، تغيير و رفت‌وآمد زیاد کاربران از ويژگی‌های ذاتی اين شبکه‌ها است و از طرف ديگر در اين شبكه‌ها، ديگر اين گره‌های معمولی هستند كه عهده‌دار تمامی وظايف هستند. به همين دلیل يکی از مشکلات اصلی فراروی اين شبكه‌ها، مقابله با تغييرات لحظه‌ای و فراهم آوردن ثبات در ارائه خدمات در بستری از بی‌ثباتی است.
+
+\expandedtitle{doublebox}{این هم مطلی است مهم یا چیزی که از خلاصهٔ این مقاله ما متوجه شده‌ایم و این برای ما و خوانندگان خیلی مهم است.}
+
+ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.
+
+اما معماری همتابه‌همتا ويژگی‌های ديگری نيز دارد که آن را هم برای فراهم‌کنندگان کاربردها و هم برای استفاده‌کنندگان جذاب‌تر می‌کند. از آن‌جا که شبکه‌های همتابه‌همتا از همان زيرساخت‌های اينترنت استفاده می‌کنند ونيازی به راه‌اندازی سرورها ندارند، ساخت اين شبكه‌ها بسيار ارزان‌تر از ايجاد زير ساخت‌های لازم برای راه‌اندازی شبكه‌های مشتری/خدمت‌گزار است. هم‌چنين با زياد شدن تعداد کاربران چون درعمل تعداد گره‌های ارائه کننده‌ی خدمات هم بالا می‌رود، نه تنها عملكرد شبكه افت پيدا نمی‌كند بلكه انتظار بهبود عملکرد نيز می‌رود. گذشته از اين موارد، مالكيت اين شبكه‌ها به صورت اشتراكی بين تمام کاربران پخش شده و هيچ شخص يا شركتی نمی‌تواند سياست‌های دلخواه خود را در اين نوع شبكه‌ها اعمال کند.
+
+اماهيچ چيزی بی‌ بها به دست نمی‌آید. نبود سرور مرکزی اگر چه ويژگی‌های جذابی به شبکه‌های همتابه‌همتا می‌بخشد اما از طرف ديگر آن‌ها را با دشواری‌هايی نيز روبه‌رو می‌کند. عدم وجود يك هماهنگ كننده مركزی در شبكه، انجام بسياری از امور و ارائه خدمات را دچار مشكل می‌کند. از يک طرف، تغيير و رفت‌وآمد زیاد کاربران از ويژگی‌های ذاتی اين شبکه‌ها است و از طرف ديگر در اين شبكه‌ها، ديگر اين گره‌های معمولی هستند كه عهده‌دار تمامی وظايف هستند. به همين دلیل يکی از مشکلات اصلی فراروی اين شبكه‌ها، مقابله با تغييرات لحظه‌ای و فراهم آوردن ثبات در ارائه خدمات در بستری از بی‌ثباتی است.
+\end{article}
+
+\articlesep
+
+\newsection{قسمت ب}
+
+\begin{article}{2}
+{این یک تیتر کوتاه است.وفا خلیقی}
+{این هم مثل همیشه زیرتیتر است که ما آن را در اینجا قرار می‌دهیم.}
+{قسمت ب}
+{3}
+
+\authorandplace{نام نویسنده}{مکان}
+
+\noindent\timestamp{08:25} et ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.
+
+اما معماری همتابه‌همتا ويژگی‌های ديگری نيز دارد که آن را هم برای فراهم‌کنندگان کاربردها و هم برای استفاده‌کنندگان جذاب‌تر می‌کند. از آن‌جا که شبکه‌های همتابه‌همتا از همان زيرساخت‌های اينترنت استفاده می‌کنند ونيازی به راه‌اندازی سرورها ندارند، ساخت اين شبكه‌ها بسيار ارزان‌تر از ايجاد زير ساخت‌های لازم برای راه‌اندازی شبكه‌های مشتری/خدمت‌گزار است. هم‌چنين با زياد شدن تعداد کاربران چون درعمل تعداد گره‌های ارائه کننده‌ی خدمات هم بالا می‌رود، نه تنها عملكرد شبكه افت پيدا نمی‌كند بلكه انتظار بهبود عملکرد نيز می‌رود. گذشته از اين موارد، مالكيت اين شبكه‌ها به صورت اشتراكی بين تمام کاربران پخش شده و هيچ شخص يا شركتی نمی‌تواند سياست‌های دلخواه خود را در اين نوع شبكه‌ها اعمال کند.
+
+اماهيچ چيزی بی‌ بها به دست نمی‌آید. نبود سرور مرکزی اگر چه ويژگی‌های جذابی به شبکه‌های همتابه‌همتا می‌بخشد اما از طرف ديگر آن‌ها را با دشواری‌هايی نيز روبه‌رو می‌کند. عدم وجود يك هماهنگ كننده مركزی در شبكه، انجام بسياری از امور و ارائه خدمات را دچار مشكل می‌کند. از يک طرف، تغيير و رفت‌وآمد زیاد کاربران از ويژگی‌های ذاتی اين شبکه‌ها است و از طرف ديگر در اين شبكه‌ها، ديگر اين گره‌های معمولی هستند كه عهده‌دار تمامی وظايف هستند. به همين دلیل يکی از مشکلات اصلی فراروی اين شبكه‌ها، مقابله با تغييرات لحظه‌ای و فراهم آوردن ثبات در ارائه خدمات در بستری از بی‌ثباتی است.
+
+ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.
+
+اما معماری همتابه‌همتا ويژگی‌های ديگری نيز دارد که آن را هم برای فراهم‌کنندگان کاربردها و هم برای استفاده‌کنندگان جذاب‌تر می‌کند. از آن‌جا که شبکه‌های همتابه‌همتا از همان زيرساخت‌های اينترنت استفاده می‌کنند ونيازی به راه‌اندازی سرورها ندارند، ساخت اين شبكه‌ها بسيار ارزان‌تر از ايجاد زير ساخت‌های لازم برای راه‌اندازی شبكه‌های مشتری/خدمت‌گزار است. هم‌چنين با زياد شدن تعداد کاربران چون درعمل تعداد گره‌های ارائه کننده‌ی خدمات هم بالا می‌رود، نه تنها عملكرد شبكه افت پيدا نمی‌كند بلكه انتظار بهبود عملکرد نيز می‌رود. گذشته از اين موارد، مالكيت اين شبكه‌ها به صورت اشتراكی بين تمام کاربران پخش شده و هيچ شخص يا شركتی نمی‌تواند سياست‌های دلخواه خود را در اين نوع شبكه‌ها اعمال کند.
+
+اماهيچ چيزی بی‌ بها به دست نمی‌آید. نبود سرور مرکزی اگر چه ويژگی‌های جذابی به شبکه‌های همتابه‌همتا می‌بخشد اما از طرف ديگر آن‌ها را با دشواری‌هايی نيز روبه‌رو می‌کند. عدم وجود يك هماهنگ كننده مركزی در شبكه، انجام بسياری از امور و ارائه خدمات را دچار مشكل می‌کند. از يک طرف، تغيير و رفت‌وآمد زیاد کاربران از ويژگی‌های ذاتی اين شبکه‌ها است و از طرف ديگر در اين شبكه‌ها، ديگر اين گره‌های معمولی هستند كه عهده‌دار تمامی وظايف هستند. به همين دلیل يکی از مشکلات اصلی فراروی اين شبكه‌ها، مقابله با تغييرات لحظه‌ای و فراهم آوردن ثبات در ارائه خدمات در بستری از بی‌ثباتی است.
+
+\expandedtitle{lines}{این هم دوباره مطلب مهمی است که ما آن را از لابلای این مقاله برای خواننده درست کرده‌ایم.}
+
+ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.
+
+اما معماری همتابه‌همتا ويژگی‌های ديگری نيز دارد که آن را هم برای فراهم‌کنندگان کاربردها و هم برای استفاده‌کنندگان جذاب‌تر می‌کند. از آن‌جا که شبکه‌های همتابه‌همتا از همان زيرساخت‌های اينترنت استفاده می‌کنند ونيازی به راه‌اندازی سرورها ندارند، ساخت اين شبكه‌ها بسيار ارزان‌تر از ايجاد زير ساخت‌های لازم برای راه‌اندازی شبكه‌های مشتری/خدمت‌گزار است. هم‌چنين با زياد شدن تعداد کاربران چون درعمل تعداد گره‌های ارائه کننده‌ی خدمات هم بالا می‌رود، نه تنها عملكرد شبكه افت پيدا نمی‌كند بلكه انتظار بهبود عملکرد نيز می‌رود. گذشته از اين موارد، مالكيت اين شبكه‌ها به صورت اشتراكی بين تمام کاربران پخش شده و هيچ شخص يا شركتی نمی‌تواند سياست‌های دلخواه خود را در اين نوع شبكه‌ها اعمال کند.
+
+اماهيچ چيزی بی‌ بها به دست نمی‌آید. نبود سرور مرکزی اگر چه ويژگی‌های جذابی به شبکه‌های همتابه‌همتا می‌بخشد اما از طرف ديگر آن‌ها را با دشواری‌هايی نيز روبه‌رو می‌کند. عدم وجود يك هماهنگ كننده مركزی در شبكه، انجام بسياری از امور و ارائه خدمات را دچار مشكل می‌کند. از يک طرف، تغيير و رفت‌وآمد زیاد کاربران از ويژگی‌های ذاتی اين شبکه‌ها است و از طرف ديگر در اين شبكه‌ها، ديگر اين گره‌های معمولی هستند كه عهده‌دار تمامی وظايف هستند. به همين دلیل يکی از مشکلات اصلی فراروی اين شبكه‌ها، مقابله با تغييرات لحظه‌ای و فراهم آوردن ثبات در ارائه خدمات در بستری از بی‌ثباتی است.
+\end{article}
+
+\articlesep
+
+\begin{editorial}{1}{این یک مثال از مقاله‌ای از طرف ویرایشگر است.}{نام و نام خانوادگی}{4}
+يژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.
+
+اما معماری همتابه‌همتا ويژگی‌های ديگری نيز دارد که آن را هم برای فراهم‌کنندگان کاربردها و هم برای استفاده‌کنندگان جذاب‌تر می‌کند. از آن‌جا که شبکه‌های همتابه‌همتا از همان زيرساخت‌های اينترنت استفاده می‌کنند ونيازی به راه‌اندازی سرورها ندارند، ساخت اين شبكه‌ها بسيار ارزان‌تر از ايجاد زير ساخت‌های لازم برای راه‌اندازی شبكه‌های مشتری/خدمت‌گزار است. هم‌چنين با زياد شدن تعداد کاربران چون درعمل تعداد گره‌های ارائه کننده‌ی خدمات هم بالا می‌رود، نه تنها عملكرد شبكه افت پيدا نمی‌كند بلكه انتظار بهبود عملکرد نيز می‌رود. گذشته از اين موارد، مالكيت اين شبكه‌ها به صورت اشتراكی بين تمام کاربران پخش شده و هيچ شخص يا شركتی نمی‌تواند سياست‌های دلخواه خود را در اين نوع شبكه‌ها اعمال کند.
+
+اماهيچ چيزی بی‌ بها به دست نمی‌آید. نبود سرور مرکزی اگر چه ويژگی‌های جذابی به شبکه‌های همتابه‌همتا می‌بخشد اما از طرف ديگر آن‌ها را با دشواری‌هايی نيز روبه‌رو می‌کند. عدم وجود يك هماهنگ كننده مركزی در شبكه، انجام بسياری از امور و ارائه خدمات را دچار مشكل می‌کند. از يک طرف، تغيير و رفت‌وآمد زیاد کاربران از ويژگی‌های ذاتی اين شبکه‌ها است و از طرف ديگر در اين شبكه‌ها، ديگر اين گره‌های معمولی هستند كه عهده‌دار تمامی وظايف هستند. به همين دلیل يکی از مشکلات اصلی فراروی اين شبكه‌ها، مقابله با تغييرات لحظه‌ای و فراهم آوردن ثبات در ارائه خدمات در بستری از بی‌ثباتی است.
+\end{editorial}
+
+\articlesep
+
+\begin{shortarticle}{4}{محیط مقالهٔ کوتاه}{محیط مقالهٔ کوتاه داخل مجلهٔ زی‌پرشین}{5}
+\shortarticleitem{این یک تیتر کوتاه است}{ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.}
+\shortarticleitem{یک تیتر کوتاه دیگر}{ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.}
+\shortarticleitem{یک تیتر کوتاه دیگر}{ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.}
+\shortarticleitem{یک تیتر کوتاه دیگر}{ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.}
+\shortarticleitem{یک تیتر کوتاه دیگر}{ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.}
+\shortarticleitem{یک تیتر کوتاه دیگر}{ويژگی اصلی که اين معماری را متمايز کرده و در دنيای اينترنت آن‌ها در مقابل معماری قبلی شبكه‌ها قرار داده است، امكان ايجاد ارتباط مستقيم بين كامپيوترهای مختلف بدون نياز به دخالت سرورهای قدرتمند در بين راه است. نام‌ اين نوع معماری هم در واقع بر گرفته شده از همین ارتباط مستقیم بين گره‌ها است. در واقع در اين نوع شبكه‌ها اثری از سرورها نيست و تمامی گره‌های معمولی موجود در شبكه، بايد وظايفی را که قبلا بر عهده‌ی سرورها بود، خود انجام دهند. بنابراين در اين نوع معماری گره‌های معمولی در ضمن اين‌که از خدمات شبکه بهره‌مند می‌شود بايد نقش خدمت‌گزار را هم ايفا کنند . در اين نوع شبکه‌ها گره‌های معمولی به كمك روش‌ها و پروتكل‌های توزيع شده، تمامی وظايف مسير يابی در شبكه، جستجوی منابع، امنيت شبكه و شناسايی هويت استفاده كننده‌ها و هم‌چنين مقابله با حملات احتمالی مهاجمان را بر عهده دارند.}
+\end{shortarticle}
+
+\articlesep
+
+\end{document}
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/test-correction.tex b/Master/texmf-dist/doc/xelatex/xepersian/test-correction.tex
new file mode 100644
index 00000000000..cb4ead74d50
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/test-correction.tex
@@ -0,0 +1,38 @@
+\documentclass{article}
+\usepackage[correction]{xepersian-multiplechoice}
+\usepackage{xepersian}
+\settextfont[Scale=1]{XB Zar}
+\setmathdigitfont[Scale=1]{XB Zar}
+\begin{document}
+\begin{question}{اگر ‎$A=\{ 1,2\} $‎ و ‎$B=\{ 2,3\} $‎ آنگاه حاصل $B^2-A\times B$ کدام است.}
+\false $\{(3,2),(3,3)\} $
+\true $\{(2,2),(2,3)\} $
+\false $\{(2,3),(3,3)\} $
+\false $\{(2,2),(3,2)\} $
+\end{question}
+
+\begin{question}{اگر ‎$A=\{ 1,2\} $‎ و ‎$B=\{ 2,3\} $‎ آنگاه حاصل $B^2-A\times B$ کدام است.}
+\true $x$
+\false $y$
+\false $z$
+\false $t$
+\end{question}
+
+\begin{question}{مجموعه‎ $(B-A^{'})^{'}$ ‎برابر است با:}
+\false $B^{'}\bigcap A$
+\false $B'\bigcup A' $
+\true $A$
+\false هیچکدام.
+\end{question}
+
+\begin{question}{صورت متعارفی عدد مختلط ‎$\frac{7+i}{1-i}$‎ کدام است.}
+\false $4+4i$
+\false $4-3i$
+\false $3+4i$
+\true $3-3i$
+\end{question}
+\begin{correction}
+جواب درست یکی از اینها است.
+\end{correction}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/test-empty-form.tex b/Master/texmf-dist/doc/xelatex/xepersian/test-empty-form.tex
new file mode 100644
index 00000000000..e2e6a6bbad6
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/test-empty-form.tex
@@ -0,0 +1,42 @@
+\documentclass{article}
+\usepackage{xepersian-multiplechoice}
+\usepackage{xepersian}
+\settextfont[Scale=1]{XB Zar}
+\setmathdigitfont[Scale=1]{XB Zar}
+\begin{document}
+\begin{question}{اگر ‎$A=\{ 1,2\} $‎ و ‎$B=\{ 2,3\} $‎ آنگاه حاصل $B^2-A\times B$ کدام است.}
+\false $\{(3,2),(3,3)\} $
+\true $\{(2,2),(2,3)\} $
+\false $\{(2,3),(3,3)\} $
+\false $\{(2,2),(3,2)\} $
+\end{question}
+
+\begin{question}{اگر ‎$A=\{ 1,2\} $‎ و ‎$B=\{ 2,3\} $‎ آنگاه حاصل $B^2-A\times B$ کدام است.}
+\true $x$
+\false $y$
+\false $z$
+\false $t$
+\end{question}
+
+\begin{question}{مجموعه‎ $(B-A^{'})^{'}$ ‎برابر است با:}
+\false $B^{'}\bigcap A$
+\false $B'\bigcup A' $
+\true $A$
+\false هیچکدام.
+\end{question}
+
+\begin{question}{صورت متعارفی عدد مختلط ‎$\frac{7+i}{1-i}$‎ کدام است.}
+\false $4+4i$
+\false $4-3i$
+\false $3+4i$
+\true $3-3i$
+\end{question}
+\begin{correction}
+جواب درست یکی از اینها است.
+\end{correction}
+\bigskip
+
+\begin{center}
+\makeform
+\end{center}
+\end{document}
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/test-question-only.tex b/Master/texmf-dist/doc/xelatex/xepersian/test-question-only.tex
new file mode 100644
index 00000000000..fd3c05ccfb8
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/test-question-only.tex
@@ -0,0 +1,38 @@
+\documentclass{article}
+\usepackage{xepersian-multiplechoice}
+\usepackage{xepersian}
+\settextfont[Scale=1]{XB Zar}
+\setmathdigitfont[Scale=1]{XB Zar}
+\begin{document}
+\begin{question}{اگر ‎$A=\{ 1,2\} $‎ و ‎$B=\{ 2,3\} $‎ آنگاه حاصل $B^2-A\times B$ کدام است.}
+\false $\{(3,2),(3,3)\} $
+\true $\{(2,2),(2,3)\} $
+\false $\{(2,3),(3,3)\} $
+\false $\{(2,2),(3,2)\} $
+\end{question}
+
+\begin{question}{اگر ‎$A=\{ 1,2\} $‎ و ‎$B=\{ 2,3\} $‎ آنگاه حاصل $B^2-A\times B$ کدام است.}
+\true $x$
+\false $y$
+\false $z$
+\false $t$
+\end{question}
+
+\begin{question}{مجموعه‎ $(B-A^{'})^{'}$ ‎برابر است با:}
+\false $B^{'}\bigcap A$
+\false $B'\bigcup A' $
+\true $A$
+\false هیچکدام.
+\end{question}
+
+\begin{question}{صورت متعارفی عدد مختلط ‎$\frac{7+i}{1-i}$‎ کدام است.}
+\false $4+4i$
+\false $4-3i$
+\false $3+4i$
+\true $3-3i$
+\end{question}
+\begin{correction}
+جواب درست یکی از اینها است.
+\end{correction}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/test-solution-form.tex b/Master/texmf-dist/doc/xelatex/xepersian/test-solution-form.tex
new file mode 100644
index 00000000000..1f403806eb5
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/test-solution-form.tex
@@ -0,0 +1,42 @@
+\documentclass{article}
+\usepackage{xepersian-multiplechoice}
+\usepackage{xepersian}
+\settextfont[Scale=1]{XB Zar}
+\setmathdigitfont[Scale=1]{XB Zar}
+\begin{document}
+\begin{question}{اگر ‎$A=\{ 1,2\} $‎ و ‎$B=\{ 2,3\} $‎ آنگاه حاصل $B^2-A\times B$ کدام است.}
+\false $\{(3,2),(3,3)\} $
+\true $\{(2,2),(2,3)\} $
+\false $\{(2,3),(3,3)\} $
+\false $\{(2,2),(3,2)\} $
+\end{question}
+
+\begin{question}{اگر ‎$A=\{ 1,2\} $‎ و ‎$B=\{ 2,3\} $‎ آنگاه حاصل $B^2-A\times B$ کدام است.}
+\true $x$
+\false $y$
+\false $z$
+\false $t$
+\end{question}
+
+\begin{question}{مجموعه‎ $(B-A^{'})^{'}$ ‎برابر است با:}
+\false $B^{'}\bigcap A$
+\false $B'\bigcup A' $
+\true $A$
+\false هیچکدام.
+\end{question}
+
+\begin{question}{صورت متعارفی عدد مختلط ‎$\frac{7+i}{1-i}$‎ کدام است.}
+\false $4+4i$
+\false $4-3i$
+\false $3+4i$
+\true $3-3i$
+\end{question}
+\begin{correction}
+جواب درست یکی از اینها است.
+\end{correction}
+
+\bigskip
+\begin{center}
+\makemask
+\end{center}
+\end{document}
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/undk-0.6.py b/Master/texmf-dist/doc/xelatex/xepersian/undk-0.6.py
new file mode 100755
index 00000000000..a824887ef31
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/undk-0.6.py
@@ -0,0 +1,485 @@
+#! /usr/bin/env python
+#########################################
+# General Public License #
+# Author: Mostafa Vahedi #
+# Date: 25 Apr. 2008 #
+# Version 0.6 #
+#########################################
+
+import codecs
+
+import sys
+
+bidi_joiners = [
+u'\u0626', u'\u0628', u'\u062a', u'\u062b', u'\u062c', u'\u062d', u'\u062e',
+u'\u0633', u'\u0634', u'\u0635', u'\u0636', u'\u0637', u'\u0638', u'\u0639', u'\u063a',
+u'\u0640', u'\u0641', u'\u0642', u'\u0643', u'\u0644', u'\u0645', u'\u0646', u'\u0647',
+u'\u0649', u'\u064a', u'\u067e', u'\u0686', u'\u06a9', u'\u06af', u'\u200d',
+u'\u06cc']
+
+right_joiners = [
+u'\u0622', u'\u0623', u'\u0624', u'\u0625', u'\u0627', u'\u0629', u'\u062f', u'\u0630', u'\u0631',
+u'\u0632', u'\u0648', u'\u0671', u'\u0600', u'\u0698']
+
+
+#form_numbers, isolated, final, medial, initial
+table_UN_DK = {
+u'\n' : [1, '\n'],
+#case u'\u0020' - 0xA0 : #space
+u' ' : [1, chr(0xA0)],
+#case u'\u0021' - 0xA4 : #exclamation
+u'!' : [1, chr(0xA4)],
+## case u'\u0022' - 0x?? : #quotation
+#case u'\u0023' - 0x95 : #number sign
+u'#' : [1, chr(0x95)],
+#case u'\u0024' - 0x83 : #?? dollar sign
+u'$' : [1, chr(0x83)],
+#case u'\u0025' - 0x96 : #percent sign
+u'%' : [1, chr(0x96)],
+#case u'\u0026' - 0x87 : #?? ampersand
+u'&' : [1, chr(0x87)],
+#case u'\u0027' - 0xa9 : #apostrophe
+u'\'' : [1, chr(0xa9)],
+#case u'\u0028' - 0x90 : #left parenthesis
+u'(' : [1, chr(0x91)],
+#case u'\u0029' - 0x91 : #right parenthesis
+u')' : [1, chr(0x90)],
+#case u'\u002a' - 0x82 : #asterisk
+u'*' : [1, chr(0x82)],
+#case u'\u002b' - 0x9e : #plus sign
+u'+' : [1, chr(0x9e)],
+#case u'\u002c' - 0x97 : #comma
+u',' : [1, chr(0x2C)],
+#case u'\u002d' - 0x9f : #hyphen-minus
+u'-' : [1, chr(0x9f)],
+#case u'\u002e' - 0xA2 : #full stop
+u'.' : [1, chr(0xA2)],
+#case u'\u002f' - 0xa1 : #solidus
+u'/' : [1, chr(0xa1)],
+# #-- digits 0..9 B0 - B9
+#case u'\u003a' - 0xa5 : #colon
+u':' : [1, chr(0xa5)],
+## case u'\u003b' - 0xa6 : #handled in >128: semicolon
+#case u'\u003c' - 0x98 : #less than sign
+u'<' : [1, chr(0x98)],
+#case u'\u003d' - 0x99 : #equal sign
+u'=' : [1, chr(0x99)],
+#case u'\u003e' - 0x9a : #more than sign
+u'>' : [1, chr(0x9a)],
+## case u'\u003f' - 0xa3 : #handled in >128: question mark
+#case u'\u0040' - 0x81 : #commercialat
+u'@' : [1, chr(0x81)],
+##-- letters A..Z
+#case u'\u005b' - 0x92 : #left square bracket
+u'[' : [1, chr(0x93)],
+#case u'\u005c' - 0x9d : #reverse solidus
+u'\\' : [1, chr(0x9d)],
+#case u'\u005d' - 0x93 : #right square bracket
+u']' : [1, chr(0x92)],
+#case u'\u005e' - 0xAE : #circumflex accent
+u'^' : [1, chr(0xAE)],
+## case u'\u005f' - 0x?? : #?? low line
+#case u'\u0060' - 0xa8 : #grave accent
+u'`' : [1, chr(0xa8)],
+# #-- letters a..z
+#case u'\u007b' - 0x8b : #left curly bracket
+u'{' : [1, chr(0x8c)],
+#case u'\u007c' - 0xaf : #vertical line
+u'|' : [1, chr(0xaf)],
+#case u'\u007d' - 0x8c : #right curly bracket
+u'}' : [1, chr(0x8b)],
+#case u'\u007e' - 0x86 : #tilde
+u'~' : [1, chr(0x86)],
+#case u'\u00BB' - 0x8E : #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+u'\u00BB' : [1, chr(0x8E)],
+#case u'\u00AB' - 0x8F : #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+u'\u00AB' : [1, chr(0x8F)],
+#case u'\u00D7' - 0x9c : #times
+u'\u00D7' : [1, chr(0x9c)],
+#case u'\u200C' #ZWJ
+u'\u200C' : [1, ''],
+#case u'\u200D' #ZWNJ
+u'\u200D' : [1, ''],
+
+#060C - 0xA7 : arabic comma
+u'\u060C' : [1, chr(0xA7)],
+#061B - 0xA6 : arabic semicolon
+u'\u061B' : [1, chr(0xA6)],
+#061F - 0XA3 : arabic question mark
+u'\u061F' : [1, chr(0xA3)],
+#0621 - 0xBC hamza
+u'\u0621' : [1, chr(0xBC)],
+#0622 - 0xBB : alef + madda, the kernel joins it if should joined!!!
+u'\u0622' : [1, chr(0xBB)],
+#0623 - 0xBD+0xAD - 0xBE+0xAD : alef + hamza above
+u'\u0623' : [2, chr(0xBD)+chr(0xAD), chr(0xBE)+chr(0xAD)],
+#0624 - 0xF7+0xAD : waw + hamza above
+u'\u0624' : [1, chr(0xF7)+chr(0xAD)],
+#0625 - 0xBD+\hamzabelow - 0xBE+\hamzabelow : alef + hamza below
+u'\u0625' : [2, chr(0xBD)+'\\hamzabelow', chr(0xBE)+'\\hamzabelow'],
+#0626 - 0xFF - 0xFC+0xAD : yeh + hamza above
+u'\u0626' : [3, chr(0xFC)+chr(0xAD), chr(0xFE)+chr(0xAD), chr(0xFF)],
+#0627 - 0xBD - 0xBE : alef
+u'\u0627' : [2, chr(0xBD), chr(0xBE)],
+#0628 - 0xBF - 0xC0 : beh
+u'\u0628' : [2, chr(0xBF), chr(0xC0)],
+#0629 - \0xF8 : teh marbuta
+u'\u0629' : [1, '\\'+chr(0xF8)],
+#062a - 0xC3 - 0xC4 : teh
+u'\u062a' : [2, chr(0xC3), chr(0xC4)],
+#062b - 0xC5 - 0xC6 : theh
+u'\u062b' : [2, chr(0xC5), chr(0xC6)],
+#062c - 0xC7 - 0xC8 : jeem
+u'\u062c' : [2, chr(0xC7), chr(0xC8)],
+#062d - 0xCB - 0xCC : hah
+u'\u062d' : [2, chr(0xCB), chr(0xCC)],
+#062e - 0xCD - 0xCE : khah
+u'\u062e' : [2, chr(0xCD), chr(0xCE)],
+#062f - 0xCF : dal
+u'\u062f' : [1, chr(0xCF)],
+#0630 - 0xD0 : thal
+u'\u0630' : [1, chr(0xD0)],
+#0631 - 0xD1 : reh
+u'\u0631' : [1, chr(0xD1)],
+#0632 - 0xD2 : zain
+u'\u0632' : [1, chr(0xD2)],
+#0633 - 0xD4 - 0xD5 : seen
+u'\u0633' : [2, chr(0xD4), chr(0xD5)],
+#0634 - 0xD6 - 0xD7 : sheen
+u'\u0634' : [2, chr(0xD6), chr(0xD7)],
+#0635 - 0xD8 - 0xD9 : sad
+u'\u0635' : [2, chr(0xD8), chr(0xD9)],
+#0636 - 0xDA - 0xDB : dad
+u'\u0636' : [2, chr(0xDA), chr(0xDB)],
+#0637 - 0xDC - 0xDD : tah
+u'\u0637' : [2, chr(0xDC), chr(0xDD)],
+#0638 - 0xDE - 0xDF : zah
+u'\u0638' : [2, chr(0xDE), chr(0xDF)],
+#0639 - 0xE0 - 0xE1 - 0xE2 - 0xE3 : ain
+u'\u0639' : [4, chr(0xE0), chr(0xE2), chr(0xE3), chr(0xE1)],
+#063a - 0xE4 - 0xE5 - 0xE6 - 0xE7 : ghain
+u'\u063a' : [4, chr(0xE4), chr(0xE6), chr(0xE7), chr(0xE5)],
+#0640 - 0x94 : tatweel
+u'\u0640' : [1, chr(0x94)],
+#0641 - 0xE8 - 0xE9 : feh
+u'\u0641' : [2, chr(0xE8), chr(0xE9)],
+#0642 - 0xEA - 0xEB : Qaf
+u'\u0642' : [2, chr(0xEA), chr(0xEB)],
+#0643 - \arabkeh - 0xED : arabic ke
+u'\u0643' : [2, '\\arabkeh', chr(0xED)],
+#0644 - 0xF0 - 0xF2 : lam
+u'\u0644' : [2, chr(0xF0), chr(0xF2)],
+#0645 - 0xF3 - 0xF4 : meem
+u'\u0645' : [2, chr(0xF3), chr(0xF4)],
+#0646 - 0xF5 - 0xF6 : noon
+u'\u0646' : [2, chr(0xF5), chr(0xF6)],
+#0647 - 0xF8 - 0xF9 - 0xFB : heh
+u'\u0647' : [3, chr(0xF8), chr(0xFB), chr(0xF9)],
+#0648 - 0xF7 : waw
+u'\u0648' : [1, chr(0xF7)],
+#0649 - \alefmaq - \alefmaqjd : alef maksura
+u'\u0649' : [2, '\\alefmaq', '\\alefmaqjd'],
+#064a - \arabyeh - \arabyehjd - 0xFD : arabic yeh
+u'\u064a' : [3, '\\arabyeh', '\\arabyehjd', chr(0xFD)],
+
+#064b - 0xAC : nasb
+u'\u064b' : [1, chr(0xAC)],
+#064c - \raf : raf
+u'\u064c' : [1, '\\'+chr(0xA9)],
+#064d - \jar : jar
+u'\u064d' : [1, '\\'+chr(0xAA)],
+#064e - 0xAB : fatha
+u'\u064e' : [1, chr(0xAB)],
+#064f - 0xA9 : zamma
+u'\u064f' : [1, chr(0xA9)],
+#0650 - 0xAA : kasra
+u'\u0650' : [1, chr(0xAA)],
+#0651 - 0xBA : shadda
+u'\u0651' : [1, chr(0xBA)],
+#0652 - 0xAE : sokun
+u'\u0652' : [1, chr(0xAE)],
+#0653 - \mad : madda
+u'\u0653' : [1, '\\'+chr(0x86)],
+#0654 - 0xAD : hamza above
+u'\u0654' : [1, chr(0xAD)],
+#0655 - \hamzabelow : hamza below
+u'\u0655' : [1, '\\hamzabelow'],
+#0656 - \alefkootahpayyn : alef subscript
+u'\u0656' : [1, '\\'+chr(0xBD)+chr(0xFC)+chr(0xA0)],
+
+#066a - 0x96 : arabic percent sign
+u'\u066a' : [1, chr(0x96)],
+#066b - 0xA1 : arabic decimal seperator
+u'\u066b' : [1, chr(0xA1)],
+#066c - 0x97 : arabic thousands seperator
+u'\u066c' : [1, chr(0x97)],
+
+#0670 - \alefkootahbala : alef superscript
+u'\u0670' : [1, '\\'+chr(0xBB)],
+
+#067e - 0xC1 - 0xC2 : peh
+u'\u067e' : [2, chr(0xC1), chr(0xC2)],
+#0686 - 0xC9 - 0xCA : cheh
+u'\u0686' : [2, chr(0xC9), chr(0xCA)],
+#0698 - 0xD3 : jeh
+u'\u0698' : [1, chr(0xD3)],
+#06a9 - 0xEC - 0xED : farsi keh
+u'\u06a9' : [2, chr(0xEC), chr(0xED)],
+#06af - 0xEE - 0xEF : gaf
+u'\u06af' : [2, chr(0xEE), chr(0xEF)],
+#06cc - 0xFC - 0xFD - 0xFE : farsi yeh
+u'\u06cc' : [3, chr(0xFC), chr(0xFE), chr(0xFD)],
+
+#arabic-indic digits
+u'\u06F0' : [1, chr(0xB0)],
+u'\u06F1' : [1, chr(0xB1)],
+u'\u06F2' : [1, chr(0xB2)],
+u'\u06F3' : [1, chr(0xB3)],
+u'\u06F4' : [1, chr(0xB4)],
+u'\u06F5' : [1, chr(0xB5)],
+u'\u06F6' : [1, chr(0xB6)],
+u'\u06F7' : [1, chr(0xB7)],
+u'\u06F8' : [1, chr(0xB8)],
+u'\u06F9' : [1, chr(0xB9)],
+
+#arabic digits
+u'\u0660' : [1, chr(0xB0)],
+u'\u0661' : [1, chr(0xB1)],
+u'\u0662' : [1, chr(0xB2)],
+u'\u0663' : [1, chr(0xB3)],
+u'\u0664' : [1, '\\arabfour'],
+u'\u0665' : [1, '\\arabfive'],
+u'\u0666' : [1, '\\arabsix'],
+u'\u0667' : [1, chr(0xB7)],
+u'\u0668' : [1, chr(0xB8)],
+u'\u0669' : [1, chr(0xB9)],
+
+#0644_#0627 - 0xF1 : lam+alef
+u'\u0600' : [1, chr(0xF1)]
+}
+
+def is_right_joinable(c):
+ if (c in bidi_joiners) or (c in right_joiners):
+ return 1
+ return 0
+
+def is_left_joinable(c):
+ if (c in bidi_joiners):
+ return 1
+ return 0
+
+def is_nonend_vowel(vowel):
+ if (vowel >= u'\u064e') and (vowel <= u'\u0656'):
+ return 1
+ if (vowel == u'\u0670'):
+ return 1
+ return 0
+
+def is_vowel(vowel):
+ if (vowel >= u'\u064b') and (vowel <= u'\u0656'):
+ return 1
+ if (vowel == u'\u0670'):
+ return 1
+ return 0
+
+def is_six_vowel(vowel):
+ if (vowel >= u'\u064b') and (vowel <= u'\u0650'):
+ return 1
+ return 0
+
+
+def is_right_joinable_v(line, i):
+ if (i>0) and (is_right_joinable(line[i])):
+ j = i-1
+ if is_vowel(line[j]):
+ while ((j>=0) and (is_vowel(line[j]) == 1)):
+ j -= 1
+ if (j == -1) or not(is_left_joinable(line[j])):
+ return 0
+ return 1
+ return 0
+
+def is_left_joinable_v(line, i):
+ line_len = len (line)
+ if (line_len>0) and (i<line_len-1) and (is_left_joinable(line[i])):
+ j = i+1
+ if is_vowel(line[j]):
+ while ((j<line_len) and (is_vowel(line[j]) == 1)):
+ j += 1
+ if (j == line_len) or not(is_right_joinable(line[j])):
+ return 0
+ return 1
+ return 0
+
+#isolated 0, final 1, medial 2, initial 3
+def find_form(line, i):
+ j_r = is_right_joinable_v(line, i)
+ j_l = is_left_joinable_v(line, i)
+
+ if (j_r == 0) and (j_l == 0):
+ return 0
+ if (j_r == 1) and (j_l == 0):
+ return 1
+ if (j_r == 1) and (j_l == 1):
+ return 2
+ # Therefore (j_r == 0) and (j_l == 1):
+ return 3
+
+def map_char_unicode_DK(c, form):
+ try:
+ n = table_UN_DK[c][0]
+ except KeyError:
+ return c.encode('latin-1')
+ if (n == 1):
+ return table_UN_DK[c][1]
+ elif (n == 2):
+ if (c in right_joiners):
+ return table_UN_DK[c][1 + form]
+ else:
+ return table_UN_DK[c][1 + form/2]
+ elif (n == 4):
+ return table_UN_DK[c][1 + form]
+ # farsi yeh (farsi or arabic or +hamza)
+ if (c == u'\u06cc') or (c == u'\u0626') or (c == u'\u064a'):
+ if (form >= 2):
+ return table_UN_DK[c][3]
+ return table_UN_DK[c][1 + form]
+ elif (c == u'\u0647'): # heh
+ if (form < 2):
+ return table_UN_DK[c][1]
+ return table_UN_DK[c][form]
+ return c
+
+def is_english_letter_number(c):
+ if ((c >= u'a') and (c <= u'z')) or ((c >= u'A') and (c <= u'Z')):
+ return 1
+ if (c >= u'0') and (c <= u'9'):
+ return 1
+ if (c == u',') or (c == u'?'):
+ return 1
+ return 0
+
+def is_inbetween_chars(c):
+ if ((c == u'.') or (c == u'-') or (c == u'_') or (c == u'/')):
+ return 1
+ return 0
+
+def is_farsi_numerical(c):
+ if ((c >= u'\u06F0') and (c <= u'\u06F9')) or (c == u'\u066b') or (c == u'\u066c'):
+ return 1
+ return 0
+
+# Main body of the program
+if len(sys.argv) <= 2:
+ print 'usage: python undk in_filename out_filename'
+ exit(0)
+
+filename = sys.argv[1]
+outfile = sys.argv[2]
+
+try:
+ f = codecs.open(filename, 'r', 'utf-8')
+except IOError:
+ print "Can not open the input file: " + filename
+ exit(0)
+
+try:
+ of = open(outfile, 'w')
+except IOError:
+ print "Can not open the output file: " + outfile
+ exit(0)
+
+# this is an option
+autoEnglish = 1
+
+inAutoEnglish = 0
+inFarsi = 1
+inFarsiNumber = 0
+for line in f:
+ this_line = ''
+ line_len = len (line)
+
+ # to remove the Byte Order Mark = BOM
+ start = 0
+ if line[0] == unicode( codecs.BOM_UTF8, "utf8"):
+ start = 1
+ # end of BOM removal
+
+ i = start
+ english_part = ''
+ auto_english_part = ''
+ number_part = ''
+ while i < line_len:
+ # find the \$f_ or \$e_
+ if line[i] == u'\\':
+ if line[i+1:i+4] == "$f_":
+ inFarsi = 1
+ i += 4
+ this_line += english_part[::-1]
+ english_part = ''
+ elif line[i+1:i+4] == "$e_":
+ inFarsi = 0
+ i += 4
+ # The following situation should not happen !!!!
+ if (autoEnglish == 1) and (inAutoEnglish == 1):
+ this_line += auto_english_part[::-1]
+ auto_english_part = ''
+ inAutoEnglish = 0
+ print 'Warning: mixed Auto-English and Forced-English'
+ if (inFarsiNumber == 1):
+ this_line += number_part[::-1]
+ number_part = ''
+ inFarsiNubmer = 0
+ # end of character processing
+ if inFarsi == 0:
+ english_part += line[i].encode('ascii')
+ # Therefore we are in FarsiMode
+ else:
+ # when we are in AutoEnglish mode and the current character
+ # is '.', '-', '_', or '/' and the next character
+ # is English AlphaNumberic then consider the current character
+ # as an English character
+ if (autoEnglish == 1) and (inAutoEnglish == 1) and \
+ (is_inbetween_chars(line[i]) == 1) and \
+ (line_len > i+1) and (is_english_letter_number(line[i+1]) == 1):
+ auto_english_part += line[i].encode('ascii')
+ elif (is_english_letter_number(line[i]) == 1) and (autoEnglish == 1):
+ if (inFarsiNumber == 1):
+ this_line += number_part[::-1]
+ number_part = ''
+ inFarsiNubmer = 0
+ inAutoEnglish = 1
+ auto_english_part += line[i].encode('ascii')
+ else:
+ if (autoEnglish == 1) and (inAutoEnglish == 1):
+ this_line += auto_english_part[::-1]
+ auto_english_part = ''
+ inAutoEnglish = 0
+ if (is_farsi_numerical(line[i]) == 1):
+ inFarsiNumber = 1
+ number_part += map_char_unicode_DK(line[i], 0)
+ else:
+ if (inFarsiNumber == 1):
+ this_line += number_part[::-1]
+ number_part = ''
+ inFarsiNubmer = 0
+ which_form = find_form(line, i)
+ if (i+1 < line_len) and (line[i] == u'\u0644') and (line[i+1] == u'\u0627'):
+ which_form = 1
+ this_line += map_char_unicode_DK(u'\u0600', which_form)
+ i = i + 1
+ else:
+ this_line += map_char_unicode_DK(line[i], which_form)
+ i += 1
+ # end of while
+ if inFarsi == 0:
+ this_line += english_part[::-1]
+ english_part = ''
+
+ # write the processed line
+ of.write(this_line)
+ # end of line processing
+# end of file processing
+
+of.close()
+f.close()
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/unldk-0.2.py b/Master/texmf-dist/doc/xelatex/xepersian/unldk-0.2.py
new file mode 100755
index 00000000000..b91c183cdd8
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/unldk-0.2.py
@@ -0,0 +1,445 @@
+#! /usr/bin/env python
+#########################################
+# General Public License #
+# Author: Mostafa Vahedi #
+# Date: 22 Apr. 2007 #
+# Version 0.2 #
+#########################################
+
+import codecs
+
+import sys
+
+bidi_joiners = [
+u'\u0626', u'\u0628', u'\u062a', u'\u062b', u'\u062c', u'\u062d', u'\u062e',
+u'\u0633', u'\u0634', u'\u0635', u'\u0636', u'\u0637', u'\u0638', u'\u0639', u'\u063a',
+u'\u0640', u'\u0641', u'\u0642', u'\u0643', u'\u0644', u'\u0645', u'\u0646', u'\u0647',
+u'\u0649', u'\u064a', u'\u067e', u'\u0686', u'\u06a9', u'\u06af', u'\u200d',
+u'\u06cc']
+
+right_joiners = [
+u'\u0622', u'\u0623', u'\u0624', u'\u0625', u'\u0627', u'\u0629', u'\u062f', u'\u0630', u'\u0631',
+u'\u0632', u'\u0648', u'\u0671', u'\u0600', u'\u0698']
+
+
+#form_numbers, isolated, final, medial, initial
+table_UN_DK = {
+u'\n' : [1, '\n'],
+#case u'\u0020' - 0xA0 : #space
+u' ' : [1, chr(0xA0)],
+#case u'\u0021' - 0xA4 : #exclamation
+u'!' : [1, chr(0xA4)],
+## case u'\u0022' - 0x?? : #quotation
+#case u'\u0023' - 0x95 : #number sign
+u'#' : [1, chr(0x95)],
+#case u'\u0024' - 0x83 : #?? dollar sign
+u'$' : [1, chr(0x83)],
+#case u'\u0025' - 0x96 : #percent sign
+u'%' : [1, chr(0x96)],
+#case u'\u0026' - 0x87 : #?? ampersand
+u'&' : [1, chr(0x87)],
+#case u'\u0027' - 0xa9 : #apostrophe
+u'\'' : [1, chr(0xa9)],
+#case u'\u0028' - 0x90 : #left parenthesis
+u'(' : [1, chr(0x91)],
+#case u'\u0029' - 0x91 : #right parenthesis
+u')' : [1, chr(0x90)],
+#case u'\u002a' - 0x82 : #asterisk
+u'*' : [1, chr(0x82)],
+#case u'\u002b' - 0x9e : #plus sign
+u'+' : [1, chr(0x9e)],
+#case u'\u002c' - 0x97 : #comma
+u',' : [1, chr(0x97)],
+#case u'\u002d' - 0x9f : #hyphen-minus
+u'-' : [1, chr(0x9f)],
+#case u'\u002e' - 0xA2 : #full stop
+u'.' : [1, chr(0xA2)],
+#case u'\u002f' - 0xa1 : #solidus
+u'/' : [1, chr(0xa1)],
+# #-- digits 0..9 B0 - B9
+#case u'\u003a' - 0xa5 : #colon
+u':' : [1, chr(0xa5)],
+## case u'\u003b' - 0xa6 : #handled in >128: semicolon
+#case u'\u003c' - 0x98 : #less than sign
+u'<' : [1, chr(0x98)],
+#case u'\u003d' - 0x99 : #equal sign
+u'=' : [1, chr(0x99)],
+#case u'\u003e' - 0x9a : #more than sign
+u'>' : [1, chr(0x9a)],
+## case u'\u003f' - 0xa3 : #handled in >128: question mark
+#case u'\u0040' - 0x81 : #commercialat
+u'@' : [1, chr(0x81)],
+##-- letters A..Z
+#case u'\u005b' - 0x92 : #left square bracket
+u'[' : [1, chr(0x93)],
+#case u'\u005c' - 0x9d : #reverse solidus
+u'\\' : [1, chr(0x9d)],
+#case u'\u005d' - 0x93 : #right square bracket
+u']' : [1, chr(0x92)],
+#case u'\u005e' - 0xAE : #circumflex accent
+u'^' : [1, chr(0xAE)],
+## case u'\u005f' - 0x?? : #?? low line
+#case u'\u0060' - 0xa8 : #grave accent
+u'`' : [1, chr(0xa8)],
+# #-- letters a..z
+#case u'\u007b' - 0x8b : #left curly bracket
+u'{' : [1, chr(0x8c)],
+#case u'\u007c' - 0xaf : #vertical line
+u'|' : [1, chr(0xaf)],
+#case u'\u007d' - 0x8c : #right curly bracket
+u'}' : [1, chr(0x8b)],
+#case u'\u007e' - 0x86 : #tilde
+u'~' : [1, chr(0x86)],
+#case u'\u00BB' - 0x8E : #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+u'\u00BB' : [1, chr(0x8E)],
+#case u'\u00AB' - 0x8F : #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+u'\u00AB' : [1, chr(0x8F)],
+#case u'\u00D7' - 0x9c : #times
+u'\u00D7' : [1, chr(0x9c)],
+#case u'\u200C' #ZWJ
+u'\u200C' : [1, ''],
+#case u'\u200D' #ZWNJ
+u'\u200D' : [1, ''],
+
+#060C - 0xA7 : arabic comma
+u'\u060C' : [1, chr(0xA7)],
+#061B - 0xA6 : arabic semicolon
+u'\u061B' : [1, chr(0xA6)],
+#061F - 0XA3 : arabic question mark
+u'\u061F' : [1, chr(0xA3)],
+#0621 - 0xBC hamza
+u'\u0621' : [1, chr(0xBC)],
+#0622 - 0xBB : alef + madda, the kernel joins it if should joined!!!
+u'\u0622' : [1, chr(0xBB)],
+#0623 - 0xBD+0xAD - 0xBE+0xAD : alef + hamza above
+u'\u0623' : [2, chr(0xBD)+chr(0xAD), chr(0xBE)+chr(0xAD)],
+#0624 - 0xF7+0xAD : waw + hamza above
+u'\u0624' : [1, chr(0xF7)+chr(0xAD)],
+#0625 - 0xBD+\hamzabelow - 0xBE+\hamzabelow : alef + hamza below
+u'\u0625' : [2, chr(0xBD)+'\\hamzabelow', chr(0xBE)+'\\hamzabelow'],
+#0626 - 0xFF - 0xFC+0xAD : yeh + hamza above
+u'\u0626' : [3, chr(0xFC)+chr(0xAD), chr(0xFE)+chr(0xAD), chr(0xFF)],
+#0627 - 0xBD - 0xBE : alef
+u'\u0627' : [2, chr(0xBD), chr(0xBE)],
+#0628 - 0xBF - 0xC0 : beh
+u'\u0628' : [2, chr(0xBF), chr(0xC0)],
+#0629 - \0xF8 : teh marbuta
+u'\u0629' : [1, '\\'+chr(0xF8)],
+#062a - 0xC3 - 0xC4 : teh
+u'\u062a' : [2, chr(0xC3), chr(0xC4)],
+#062b - 0xC5 - 0xC6 : theh
+u'\u062b' : [2, chr(0xC5), chr(0xC6)],
+#062c - 0xC7 - 0xC8 : jeem
+u'\u062c' : [2, chr(0xC7), chr(0xC8)],
+#062d - 0xCB - 0xCC : hah
+u'\u062d' : [2, chr(0xCB), chr(0xCC)],
+#062e - 0xCD - 0xCE : khah
+u'\u062e' : [2, chr(0xCD), chr(0xCE)],
+#062f - 0xCF : dal
+u'\u062f' : [1, chr(0xCF)],
+#0630 - 0xD0 : thal
+u'\u0630' : [1, chr(0xD0)],
+#0631 - 0xD1 : reh
+u'\u0631' : [1, chr(0xD1)],
+#0632 - 0xD2 : zain
+u'\u0632' : [1, chr(0xD2)],
+#0633 - 0xD4 - 0xD5 : seen
+u'\u0633' : [2, chr(0xD4), chr(0xD5)],
+#0634 - 0xD6 - 0xD7 : sheen
+u'\u0634' : [2, chr(0xD6), chr(0xD7)],
+#0635 - 0xD8 - 0xD9 : sad
+u'\u0635' : [2, chr(0xD8), chr(0xD9)],
+#0636 - 0xDA - 0xDB : dad
+u'\u0636' : [2, chr(0xDA), chr(0xDB)],
+#0637 - 0xDC - 0xDD : tah
+u'\u0637' : [2, chr(0xDC), chr(0xDD)],
+#0638 - 0xDE - 0xDF : zah
+u'\u0638' : [2, chr(0xDE), chr(0xDF)],
+#0639 - 0xE0 - 0xE1 - 0xE2 - 0xE3 : ain
+u'\u0639' : [4, chr(0xE0), chr(0xE2), chr(0xE3), chr(0xE1)],
+#063a - 0xE4 - 0xE5 - 0xE6 - 0xE7 : ghain
+u'\u063a' : [4, chr(0xE4), chr(0xE6), chr(0xE7), chr(0xE5)],
+#0640 - 0x94 : tatweel
+u'\u0640' : [1, chr(0x94)],
+#0641 - 0xE8 - 0xE9 : feh
+u'\u0641' : [2, chr(0xE8), chr(0xE9)],
+#0642 - 0xEA - 0xEB : Qaf
+u'\u0642' : [2, chr(0xEA), chr(0xEB)],
+#0643 - \arabkeh - 0xED : arabic ke
+u'\u0643' : [2, '\\arabkeh', chr(0xED)],
+#0644 - 0xF0 - 0xF2 : lam
+u'\u0644' : [2, chr(0xF0), chr(0xF2)],
+#0645 - 0xF3 - 0xF4 : meem
+u'\u0645' : [2, chr(0xF3), chr(0xF4)],
+#0646 - 0xF5 - 0xF6 : noon
+u'\u0646' : [2, chr(0xF5), chr(0xF6)],
+#0647 - 0xF8 - 0xF9 - 0xFB : heh
+u'\u0647' : [3, chr(0xF8), chr(0xFB), chr(0xF9)],
+#0648 - 0xF7 : waw
+u'\u0648' : [1, chr(0xF7)],
+#0649 - \alefmaq - \alefmaqjd : alef maksura
+u'\u0649' : [2, '\\alefmaq', '\\alefmaqjd'],
+#064a - \arabyeh - \arabyehjd - 0xFD : arabic yeh
+u'\u064a' : [3, '\\arabyeh', '\\arabyehjd', chr(0xFD)],
+
+#064b - 0xAC : nasb
+u'\u064b' : [1, chr(0xAC)],
+#064c - \raf : raf
+u'\u064c' : [1, '\\'+chr(0xA9)],
+#064d - \jar : jar
+u'\u064d' : [1, '\\'+chr(0xAA)],
+#064e - 0xAB : fatha
+u'\u064e' : [1, chr(0xAB)],
+#064f - 0xA9 : zamma
+u'\u064f' : [1, chr(0xA9)],
+#0650 - 0xAA : kasra
+u'\u0650' : [1, chr(0xAA)],
+#0651 - 0xBA : shadda
+u'\u0651' : [1, chr(0xBA)],
+#0652 - 0xAE : sokun
+u'\u0652' : [1, chr(0xAE)],
+#0653 - \mad : madda
+u'\u0653' : [1, '\\'+chr(0x86)],
+#0654 - 0xAD : hamza above
+u'\u0654' : [1, chr(0xAD)],
+#0655 - \hamzabelow : hamza below
+u'\u0655' : [1, '\\hamzabelow'],
+#0656 - \alefkootahpayyn : alef subscript
+u'\u0656' : [1, '\\'+chr(0xBD)+chr(0xFC)+chr(0xA0)],
+
+#066a - 0x96 : arabic percent sign
+u'\u066a' : [1, chr(0x96)],
+#066b - 0xA1 : arabic decimal seperator
+u'\u066b' : [1, chr(0xA1)],
+#066c - 0x97 : arabic thousands seperator
+u'\u066c' : [1, chr(0x97)],
+
+#0670 - \alefkootahbala : alef superscript
+u'\u0670' : [1, '\\'+chr(0xBB)],
+
+#067e - 0xC1 - 0xC2 : peh
+u'\u067e' : [2, chr(0xC1), chr(0xC2)],
+#0686 - 0xC9 - 0xCA : cheh
+u'\u0686' : [2, chr(0xC9), chr(0xCA)],
+#0698 - 0xD3 : jeh
+u'\u0698' : [1, chr(0xD3)],
+#06a9 - 0xEC - 0xED : farsi keh
+u'\u06a9' : [2, chr(0xEC), chr(0xED)],
+#06af - 0xEE - 0xEF : gaf
+u'\u06af' : [2, chr(0xEE), chr(0xEF)],
+#06cc - 0xFC - 0xFD - 0xFE : farsi yeh
+u'\u06cc' : [3, chr(0xFC), chr(0xFE), chr(0xFD)],
+
+#arabic-indic digits
+u'\u06F0' : [1, chr(0xB0)],
+u'\u06F1' : [1, chr(0xB1)],
+u'\u06F2' : [1, chr(0xB2)],
+u'\u06F3' : [1, chr(0xB3)],
+u'\u06F4' : [1, chr(0xB4)],
+u'\u06F5' : [1, chr(0xB5)],
+u'\u06F6' : [1, chr(0xB6)],
+u'\u06F7' : [1, chr(0xB7)],
+u'\u06F8' : [1, chr(0xB8)],
+u'\u06F9' : [1, chr(0xB9)],
+
+#arabic digits
+u'\u0660' : [1, chr(0xB0)],
+u'\u0661' : [1, chr(0xB1)],
+u'\u0662' : [1, chr(0xB2)],
+u'\u0663' : [1, chr(0xB3)],
+u'\u0664' : [1, '\\arabfour'],
+u'\u0665' : [1, '\\arabfive'],
+u'\u0666' : [1, '\\arabsix'],
+u'\u0667' : [1, chr(0xB7)],
+u'\u0668' : [1, chr(0xB8)],
+u'\u0669' : [1, chr(0xB9)],
+
+#0644_#0627 - 0xF1 : lam+alef
+u'\u0600' : [1, chr(0xF1)]
+}
+
+def is_right_joinable(c):
+ if (c in bidi_joiners) or (c in right_joiners):
+ return 1
+ return 0
+
+def is_left_joinable(c):
+ if (c in bidi_joiners):
+ return 1
+ return 0
+
+def is_nonend_vowel(vowel):
+ if (vowel >= u'\u064e') and (vowel <= u'\u0656'):
+ return 1
+ if (vowel == u'\u0670'):
+ return 1
+ return 0
+
+def is_vowel(vowel):
+ if (vowel >= u'\u064b') and (vowel <= u'\u0656'):
+ return 1
+ if (vowel == u'\u0670'):
+ return 1
+ return 0
+
+def is_six_vowel(vowel):
+ if (vowel >= u'\u064b') and (vowel <= u'\u0650'):
+ return 1
+ return 0
+
+
+def is_right_joinable_v(line, i):
+ if (i>0) and (is_right_joinable(line[i])):
+ j = i-1
+ if is_vowel(line[j]):
+ while ((j>=0) and (is_vowel(line[j]) == 1)):
+ j -= 1
+ if (j == -1) or not(is_left_joinable(line[j])):
+ return 0
+ return 1
+ return 0
+
+def is_left_joinable_v(line, i):
+ line_len = len (line)
+ if (line_len>0) and (i<line_len-1) and (is_left_joinable(line[i])):
+ j = i+1
+ if is_vowel(line[j]):
+ while ((j<line_len) and (is_vowel(line[j]) == 1)):
+ j += 1
+ if (j == line_len) or not(is_right_joinable(line[j])):
+ return 0
+ return 1
+ return 0
+
+#isolated 0, final 1, medial 2, initial 3
+def find_form(line, i):
+ j_r = is_right_joinable_v(line, i)
+ j_l = is_left_joinable_v(line, i)
+
+ if (j_r == 0) and (j_l == 0):
+ return 0
+ if (j_r == 1) and (j_l == 0):
+ return 1
+ if (j_r == 1) and (j_l == 1):
+ return 2
+ # Therefore (j_r == 0) and (j_l == 1):
+ return 3
+
+def map_char_unicode_DK(c, form):
+ try:
+ n = table_UN_DK[c][0]
+ except KeyError:
+ return c.encode('latin-1')
+ if (n == 1):
+ return table_UN_DK[c][1]
+ elif (n == 2):
+ if (c in right_joiners):
+ return table_UN_DK[c][1 + form]
+ else:
+ return table_UN_DK[c][1 + form/2]
+ elif (n == 4):
+ return table_UN_DK[c][1 + form]
+ # farsi yeh (farsi or arabic or +hamza)
+ if (c == u'\u06cc') or (c == u'\u0626') or (c == u'\u064a'):
+ if (form >= 2):
+ return table_UN_DK[c][3]
+ return table_UN_DK[c][1 + form]
+ elif (c == u'\u0647'): # heh
+ if (form < 2):
+ return table_UN_DK[c][1]
+ return table_UN_DK[c][form]
+ return c
+
+def is_english_letter_number(c):
+ if ((c >= u'a') and (c <= u'z')) or ((c >= u'A') and (c <= u'Z')):
+ return 1
+ if (c >= u'0') and (c <= u'9'):
+ return 1
+ return 0
+
+def is_farsi_numerical(c):
+ if ((c >= u'\u06F0') and (c <= u'\u06F9')) or (c == u'\u066b') or (c == u'\u066c'):
+ return 1
+ return 0
+
+# Main body of the program
+if len(sys.argv) <= 2:
+ print 'usage: python unldk in_filename out_filename'
+ exit(0)
+
+filename = sys.argv[1]
+outfile = sys.argv[2]
+
+try:
+ f = codecs.open(filename, 'r', 'utf-8')
+except IOError:
+ print "Can not open the input file: " + filename
+ exit(0)
+
+try:
+ of = open(outfile, 'w')
+except IOError:
+ print "Can not open the output file: " + outfile
+ exit(0)
+
+inFarsi = 0
+inFarsiNumber = 0
+for line in f:
+ this_line = ''
+ line_len = len (line)
+
+ # to remove the Byte Order Mark = BOM
+ start = 0
+ if line[0] == unicode( codecs.BOM_UTF8, "utf8"):
+ start = 1
+ # end of BOM removal
+
+ i = start
+ farsi_part = ''
+ while i < line_len:
+ # find the \$f_ or \$e_
+ if line[i] == u'\\':
+ if line[i+1:i+4] == "$f_":
+ inFarsi = 1
+ i += 4
+ elif line[i+1:i+4] == "$e_":
+ if (inFarsiNumber == 1):
+ farsi_part += number_part[::-1]
+ number_part = ''
+ inFarsiNubmer = 0
+ this_line += farsi_part[::-1]
+ fasi_part = ''
+ inFarsi = 0
+ i += 4
+ # end of character processing
+ if inFarsi == 0:
+ this_line += line[i].encode('ascii')
+ else:
+ if (is_farsi_numerical(line[i]) == 1):
+ inFarsiNumber = 1
+ number_part += map_char_unicode_DK(line[i], 0)
+ else:
+ if (inFarsiNumber == 1):
+ farsi_part += number_part[::-1]
+ number_part = ''
+ inFarsiNubmer = 0
+ which_form = find_form(line, i)
+ if (i+1 < line_len) and (line[i] == u'\u0644') and (line[i+1] == u'\u0627'):
+ which_form = 1
+ farsi_part += map_char_unicode_DK(u'\u0600', which_form)
+ i = i + 1
+ else:
+ farsi_part += map_char_unicode_DK(line[i], which_form)
+ i += 1
+ # end of while
+ if inFarsi == 1:
+ this_line += farsi_part[::-1]
+ farsi_part = ''
+
+ # write the processed line
+ of.write(this_line)
+ # end of line processing
+# end of file processing
+
+of.close()
+f.close()
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/xepersian-doc.pdf b/Master/texmf-dist/doc/xelatex/xepersian/xepersian-doc.pdf
new file mode 100644
index 00000000000..d73ebc00463
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/xepersian-doc.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/xepersian-logo.tex b/Master/texmf-dist/doc/xelatex/xepersian/xepersian-logo.tex
new file mode 100644
index 00000000000..77f9ff81e34
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/xepersian-logo.tex
@@ -0,0 +1,1483 @@
+\documentclass{minimal}
+\usepackage{pstricks}
+\begin{document}
+\psset{xunit=.5pt,yunit=.5pt,runit=.5pt}
+\begin{pspicture}(644,645)
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(336.4,15.6)
+\curveto(336.4,7.6)(329.9,1.201)(322,1.201)
+\curveto(314,1.201)(307.6,7.701)(307.6,15.6)
+\curveto(307.6,23.5)(314.1,30)(322,30)
+\curveto(329.9,30)(336.4,23.6)(336.4,15.6)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(368.4,18.8)
+\curveto(369.2,10.901)(363.5,3.8)(355.599,2.901)
+\curveto(347.7,2.1)(340.599,7.8)(339.7,15.701)
+\curveto(338.9,23.6)(344.599,30.701)(352.5,31.6)
+\curveto(360.5,32.5)(367.6,26.7)(368.4,18.8)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(400,25.3)
+\curveto(401.7,17.5)(396.7,9.8)(388.9,8.2)
+\curveto(381.099,6.5)(373.4,11.5)(371.799,19.3)
+\curveto(370.099,27.1)(375.099,34.8)(382.9,36.401)
+\curveto(390.6,38.1)(398.3,33.1)(400,25.3)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(430.7,35.1)
+\curveto(433.2,27.5)(429,19.401)(421.4,16.901)
+\curveto(413.799,14.401)(405.7,18.6)(403.2,26.201)
+\curveto(400.7,33.801)(404.9,41.901)(412.5,44.401)
+\curveto(420.1,46.901)(428.2,42.7)(430.7,35.1)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(460.2,48.1)
+\curveto(463.4,40.8)(460.2,32.3)(452.9,29)
+\curveto(445.599,25.8)(437.099,29)(433.799,36.3)
+\curveto(430.599,43.6)(433.799,52.1)(441.099,55.3)
+\curveto(448.4,58.6)(456.9,55.3)(460.2,48.1)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(488.2,64)
+\curveto(492.2,57.1)(489.8,48.3)(482.9,44.3)
+\curveto(476,40.3)(467.2,42.7)(463.2,49.6)
+\curveto(459.2,56.5)(461.599,65.3)(468.5,69.3)
+\curveto(475.401,73.3)(484.2,70.9)(488.2,64)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(514.3,82.8)
+\curveto(519,76.401)(517.6,67.3)(511.1,62.6)
+\curveto(504.6,57.901)(495.6,59.3)(490.901,65.8)
+\curveto(486.201,72.3)(487.701,81.3)(494.1,86)
+\curveto(500.6,90.7)(509.6,89.3)(514.3,82.8)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(538.4,104.2)
+\curveto(543.7,98.3)(543.299,89.099)(537.299,83.8)
+\curveto(531.4,78.5)(522.199,79)(516.9,84.901)
+\curveto(511.6,90.8)(512.1,100)(518,105.3)
+\curveto(523.9,110.7)(533.1,110.2)(538.4,104.2)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(560.1,128.1)
+\curveto(566,122.8)(566.5,113.6)(561.201,107.701)
+\curveto(555.901,101.801)(546.701,101.301)(540.801,106.6)
+\curveto(534.902,111.901)(534.402,121.1)(539.701,127)
+\curveto(545,132.9)(554.2,133.4)(560.1,128.1)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(579.2,154)
+\curveto(585.7,149.3)(587.099,140.3)(582.4,133.8)
+\curveto(577.7,127.3)(568.7,125.901)(562.2,130.6)
+\curveto(555.7,135.3)(554.3,144.3)(559,150.8)
+\curveto(563.7,157.3)(572.7,158.7)(579.2,154)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(595.4,181.8)
+\curveto(602.299,177.8)(604.7,169)(600.7,162.1)
+\curveto(596.7,155.201)(587.9,152.8)(581,156.8)
+\curveto(574.1,160.8)(571.7,169.6)(575.7,176.5)
+\curveto(579.7,183.5)(588.5,185.8)(595.4,181.8)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(608.7,211.2)
+\curveto(616,208)(619.3,199.4)(616,192.099)
+\curveto(612.8,184.799)(604.2,181.599)(596.9,184.799)
+\curveto(589.6,188)(586.3,196.6)(589.6,203.9)
+\curveto(592.9,211.2)(601.4,214.5)(608.7,211.2)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(618.8,241.8)
+\curveto(626.401,239.3)(630.5,231.2)(628.1,223.6)
+\curveto(625.6,216)(617.5,211.901)(609.901,214.3)
+\curveto(602.3,216.8)(598.201,224.901)(600.6,232.5)
+\curveto(603.1,240.1)(611.2,244.3)(618.8,241.8)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(625.7,273.3)
+\curveto(633.5,271.7)(638.5,264)(636.8,256.2)
+\curveto(635.2,248.4)(627.5,243.4)(619.7,245.099)
+\curveto(611.9,246.799)(606.9,254.4)(608.599,262.2)
+\curveto(610.2,270)(617.9,274.9)(625.7,273.3)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(629.2,305.3)
+\curveto(637.099,304.5)(642.9,297.401)(642,289.401)
+\curveto(641.2,281.501)(634.1,275.701)(626.1,276.6)
+\curveto(618.201,277.401)(612.401,284.5)(613.3,292.5)
+\curveto(614.2,300.4)(621.3,306.1)(629.2,305.3)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(629.4,337.5)
+\curveto(637.4,337.5)(643.9,331)(643.799,323.1)
+\curveto(643.799,315.1)(637.299,308.7)(629.4,308.7)
+\curveto(621.4,308.7)(615,315.2)(615,323.1)
+\curveto(615,331.1)(621.4,337.5)(629.4,337.5)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(626.2,369.6)
+\curveto(634.099,370.4)(641.2,364.7)(642.099,356.8)
+\curveto(642.9,348.9)(637.2,341.8)(629.299,340.9)
+\curveto(621.4,340.1)(614.299,345.8)(613.499,353.8)
+\curveto(612.5,361.7)(618.3,368.8)(626.2,369.6)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(619.7,401.1)
+\curveto(627.5,402.8)(635.2,397.8)(636.8,390)
+\curveto(638.5,382.2)(633.5,374.5)(625.7,372.9)
+\curveto(617.9,371.2)(610.2,376.2)(608.599,384)
+\curveto(606.9,391.8)(611.9,399.5)(619.7,401.1)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(609.9,431.8)
+\curveto(617.5,434.3)(625.599,430.1)(628.099,422.5)
+\curveto(630.599,414.9)(626.4,406.8)(618.799,404.3)
+\curveto(611.199,401.8)(603.099,406)(600.599,413.6)
+\curveto(598.099,421.2)(602.3,429.4)(609.9,431.8)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(596.9,461.4)
+\curveto(604.2,464.7)(612.7,461.4)(615.9,454.1)
+\curveto(619.2,446.8)(615.9,438.3)(608.599,435)
+\curveto(601.299,431.8)(592.799,435)(589.499,442.3)
+\curveto(586.4,449.6)(589.6,458.1)(596.9,461.4)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(581,489.3)
+\curveto(587.9,493.3)(596.7,490.9)(600.7,484)
+\curveto(604.7,477.1)(602.3,468.3)(595.4,464.3)
+\curveto(588.5,460.3)(579.7,462.7)(575.7,469.6)
+\curveto(571.7,476.5)(574.1,485.3)(581,489.3)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(562.2,515.5)
+\curveto(568.599,520.2)(577.7,518.8)(582.4,512.3)
+\curveto(587.099,505.9)(585.7,496.8)(579.2,492.1)
+\curveto(572.7,487.4)(563.7,488.9)(559,495.3)
+\curveto(554.3,501.8)(555.7,510.8)(562.2,515.5)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(540.8,539.6)
+\curveto(546.7,544.9)(555.901,544.5)(561.2,538.5)
+\curveto(566.5,532.6)(566.099,523.5)(560.099,518.1)
+\curveto(554.2,512.8)(544.999,513.3)(539.7,519.2)
+\curveto(534.3,525.1)(534.8,534.2)(540.8,539.6)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(516.9,561.3)
+\curveto(522.2,567.2)(531.4,567.7)(537.299,562.4)
+\curveto(543.199,557.1)(543.699,547.9)(538.4,542)
+\curveto(533.099,536.1)(523.9,535.6)(518,540.9)
+\curveto(512.1,546.2)(511.6,555.3)(516.9,561.3)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(491,580.3)
+\curveto(495.7,586.8)(504.7,588.2)(511.2,583.5)
+\curveto(517.7,578.8)(519.099,569.8)(514.4,563.3)
+\curveto(509.7,556.9)(500.7,555.4)(494.2,560.1)
+\curveto(487.7,564.9)(486.3,573.9)(491,580.3)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(463.1,596.6)
+\curveto(467.1,603.5)(475.901,605.9)(482.8,601.9)
+\curveto(489.7,597.9)(492.1,589.1)(488.1,582.2)
+\curveto(484.1,575.3)(475.3,572.9)(468.401,576.9)
+\curveto(461.5,580.9)(459.2,589.7)(463.1,596.6)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(433.8,609.9)
+\curveto(437,617.2)(445.6,620.5)(452.901,617.2)
+\curveto(460.201,614)(463.501,605.4)(460.201,598.1)
+\curveto(457.001,590.8)(448.401,587.6)(441.1,590.8)
+\curveto(433.8,594)(430.5,602.6)(433.8,609.9)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(403.2,620)
+\curveto(405.7,627.6)(413.8,631.7)(421.4,629.3)
+\curveto(429,626.8)(433.099,618.7)(430.7,611.1)
+\curveto(428.2,603.5)(420.099,599.4)(412.5,601.8)
+\curveto(404.9,604.3)(400.7,612.4)(403.2,620)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(371.7,626.9)
+\curveto(373.3,634.7)(381,639.7)(388.8,638)
+\curveto(396.6,636.3)(401.6,628.7)(399.901,620.9)
+\curveto(398.201,613.1)(390.6,608.1)(382.8,609.8)
+\curveto(375,611.4)(370.1,619)(371.7,626.9)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(339.7,630.4)
+\curveto(340.5,638.3)(347.6,644.1)(355.6,643.2)
+\curveto(363.5,642.4)(369.3,635.3)(368.5,627.3)
+\curveto(367.7,619.4)(360.5,613.6)(352.6,614.5)
+\curveto(344.6,615.4)(338.8,622.5)(339.7,630.4)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(307.5,630.6)
+\curveto(307.5,638.6)(314,645)(321.9,645)
+\curveto(329.9,645)(336.299,638.5)(336.299,630.6)
+\curveto(336.299,622.6)(329.799,616.2)(321.9,616.2)
+\curveto(313.9,616.1)(307.5,622.6)(307.5,630.6)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(275.4,627.4)
+\curveto(274.5,635.3)(280.3,642.4)(288.2,643.3)
+\curveto(296.1,644.1)(303.2,638.4)(304.1,630.5)
+\curveto(304.9,622.6)(299.2,615.5)(291.2,614.7)
+\curveto(283.3,613.7)(276.2,619.4)(275.4,627.4)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(243.9,620.8)
+\curveto(242.2,628.7)(247.2,636.3)(255,638)
+\curveto(262.8,639.7)(270.5,634.7)(272.1,626.9)
+\curveto(273.8,619.1)(268.8,611.4)(261,609.8)
+\curveto(253.2,608.1)(245.5,613)(243.9,620.8)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(213.2,611.1)
+\curveto(210.7,618.7)(214.9,626.8)(222.5,629.3)
+\curveto(230.1,631.8)(238.2,627.6)(240.7,620)
+\curveto(243.2,612.4)(239,604.3)(231.4,601.8)
+\curveto(223.8,599.3)(215.6,603.5)(213.2,611.1)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(183.6,598.1)
+\curveto(180.3,605.4)(183.6,613.9)(190.9,617.2)
+\curveto(198.2,620.4)(206.7,617.2)(210,609.9)
+\curveto(213.2,602.6)(209.9,594.1)(202.7,590.9)
+\curveto(195.4,587.5)(186.9,590.8)(183.6,598.1)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(155.7,582.2)
+\curveto(151.7,589.1)(154.1,597.9)(161,601.9)
+\curveto(167.9,605.9)(176.7,603.5)(180.7,596.6)
+\curveto(184.7,589.7)(182.3,580.9)(175.4,576.9)
+\curveto(168.5,572.9)(159.7,575.2)(155.7,582.2)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(129.5,563.4)
+\curveto(124.8,569.8)(126.3,578.9)(132.7,583.6)
+\curveto(139.2,588.3)(148.2,586.9)(152.9,580.4)
+\curveto(157.6,574)(156.1,564.9)(149.7,560.2)
+\curveto(143.2,555.5)(134.2,556.9)(129.5,563.4)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(105.4,541.9)
+\curveto(100,547.8)(100.6,557)(106.5,562.3)
+\curveto(112.4,567.6)(121.5,567.2)(126.9,561.2)
+\curveto(132.2,555.3)(131.7,546.1)(125.8,540.8)
+\curveto(119.9,535.5)(110.8,536)(105.4,541.9)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(83.7,518.1)
+\curveto(77.7,523.4)(77.3,532.6)(82.6,538.5)
+\curveto(87.9,544.4)(97,544.9)(103,539.6)
+\curveto(108.9,534.3)(109.4,525.1)(104,519.2)
+\curveto(98.8,513.2)(89.7,512.8)(83.7,518.1)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(64.7,492.1)
+\curveto(58.2,496.8)(56.8,505.8)(61.5,512.3)
+\curveto(66.2,518.8)(75.2,520.2)(81.7,515.5)
+\curveto(88.1,510.8)(89.6,501.8)(84.9,495.3)
+\curveto(80.1,488.9)(71.1,487.4)(64.7,492.1)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(48.4,464.3)
+\curveto(41.5,468.3)(39.1,477.1)(43.1,484)
+\curveto(47.1,490.9)(55.9,493.3)(62.8,489.3)
+\curveto(69.7,485.3)(72.1,476.5)(68,469.6)
+\curveto(64.1,462.7)(55.3,460.3)(48.4,464.3)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(35.1,435)
+\curveto(27.8,438.2)(24.5,446.8)(27.8,454.1)
+\curveto(31,461.4)(39.6,464.7)(46.9,461.4)
+\curveto(54.2,458.2)(57.4,449.6)(54.2,442.3)
+\curveto(51,435)(42.4,431.7)(35.1,435)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(25,404.4)
+\curveto(17.4,406.8)(13.3,415)(15.8,422.6)
+\curveto(18.3,430.2)(26.4,434.3)(34,431.9)
+\curveto(41.6,429.4)(45.7,421.3)(43.2,413.7)
+\curveto(40.8,406.1)(32.6,401.9)(25,404.4)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(18.1,372.9)
+\curveto(10.3,374.5)(5.4,382.2)(7,390)
+\curveto(8.6,397.8)(16.3,402.8)(24.1,401.1)
+\curveto(31.9,399.4)(36.9,391.8)(35.2,384)
+\curveto(33.6,376.2)(26,371.2)(18.1,372.9)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(14.6,340.9)
+\curveto(6.7,341.7)(0.9,348.8)(1.8,356.8)
+\curveto(2.6,364.7)(9.7,370.5)(17.7,369.7)
+\curveto(25.6,368.9)(31.4,361.7)(30.5,353.8)
+\curveto(29.6,345.8)(22.5,340)(14.6,340.9)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(14.4,308.6)
+\curveto(6.4,308.6)(0,315.1)(0,323)
+\curveto(0,331)(6.5,337.4)(14.5,337.4)
+\curveto(22.4,337.4)(28.9,330.9)(28.9,322.9)
+\curveto(28.9,315.1)(22.4,308.6)(14.4,308.6)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(17.6,276.6)
+\curveto(9.7,275.701)(2.6,281.5)(1.7,289.401)
+\curveto(0.9,297.3)(6.6,304.401)(14.6,305.3)
+\curveto(22.5,306.1)(29.6,300.401)(30.4,292.401)
+\curveto(31.3,284.5)(25.6,277.4)(17.6,276.6)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(24.1,245)
+\curveto(16.3,243.3)(8.6,248.3)(7,256.1)
+\curveto(5.3,263.901)(10.3,271.5)(18.1,273.201)
+\curveto(25.9,274.801)(33.6,269.901)(35.2,262.1)
+\curveto(36.9,254.4)(32,246.7)(24.1,245)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(33.9,214.3)
+\curveto(26.3,211.8)(18.2,216)(15.7,223.6)
+\curveto(13.2,231.201)(17.4,239.3)(25,241.8)
+\curveto(32.6,244.3)(40.7,240.1)(43.2,232.5)
+\curveto(45.7,224.9)(41.5,216.8)(33.9,214.3)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(46.9,184.8)
+\curveto(39.6,181.5)(31.1,184.8)(27.8,192.1)
+\curveto(24.5,199.401)(27.8,207.901)(35.1,211.201)
+\curveto(42.4,214.401)(50.9,211.1)(54.1,203.801)
+\curveto(57.5,196.6)(54.2,188.1)(46.9,184.8)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(62.8,156.8)
+\curveto(55.9,152.8)(47.1,155.2)(43.1,162.1)
+\curveto(39.1,169)(41.5,177.8)(48.4,181.8)
+\curveto(55.3,185.8)(64.1,183.401)(68.1,176.5)
+\curveto(72.1,169.7)(69.8,160.8)(62.8,156.8)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(81.6,130.7)
+\curveto(75.2,126)(66.1,127.4)(61.5,133.9)
+\curveto(56.8,140.299)(58.2,149.4)(64.7,154.099)
+\curveto(71.1,158.799)(80.2,157.299)(84.8,150.9)
+\curveto(89.5,144.4)(88.1,135.4)(81.6,130.7)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(103.1,106.6)
+\curveto(97.2,101.2)(88,101.7)(82.7,107.7)
+\curveto(77.4,113.599)(77.8,122.7)(83.8,128.099)
+\curveto(89.7,133.4)(98.9,132.9)(104.2,126.999)
+\curveto(109.5,121.1)(109,111.9)(103.1,106.6)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(126.9,84.9)
+\curveto(121.6,79)(112.4,78.5)(106.5,83.799)
+\curveto(100.6,89.098)(100.1,98.199)(105.4,104.199)
+\curveto(110.7,110.098)(119.9,110.598)(125.8,105.199)
+\curveto(131.8,100)(132.2,90.8)(126.9,84.9)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(152.9,65.8)
+\curveto(148.2,59.3)(139.2,57.901)(132.7,62.6)
+\curveto(126.2,67.3)(124.8,76.3)(129.5,82.8)
+\curveto(134.2,89.2)(143.2,90.7)(149.7,86)
+\curveto(156.1,81.3)(157.6,72.3)(152.9,65.8)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(180.7,49.6)
+\curveto(176.7,42.701)(167.9,40.3)(161,44.3)
+\curveto(154.1,48.3)(151.7,57.1)(155.7,64)
+\curveto(159.7,70.9)(168.5,73.2)(175.4,69.2)
+\curveto(182.3,65.3)(184.7,56.5)(180.7,49.6)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(210,36.3)
+\curveto(206.8,29)(198.2,25.7)(190.9,29)
+\curveto(183.6,32.2)(180.3,40.8)(183.6,48.1)
+\curveto(186.8,55.401)(195.4,58.6)(202.7,55.401)
+\curveto(210,52.1)(213.3,43.6)(210,36.3)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(240.6,26.2)
+\curveto(238.2,18.599)(230,14.5)(222.4,16.9)
+\curveto(214.8,19.4)(210.7,27.5)(213.1,35.099)
+\curveto(215.6,42.7)(223.7,46.799)(231.3,44.299)
+\curveto(238.9,41.9)(243.1,33.8)(240.6,26.2)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(272.1,19.3)
+\curveto(270.5,11.5)(262.8,6.5)(255,8.2)
+\curveto(247.2,9.8)(242.2,17.5)(243.9,25.3)
+\curveto(245.6,33.1)(253.2,38.1)(261,36.401)
+\curveto(268.8,34.8)(273.8,27.1)(272.1,19.3)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.7764706 0.78431374 0.79215688}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(304.1,15.8)
+\curveto(303.3,7.901)(296.2,2.1)(288.2,3)
+\curveto(280.3,3.8)(274.5,10.9)(275.3,18.9)
+\curveto(276.1,26.799)(283.3,32.599)(291.2,31.7)
+\curveto(299.2,30.8)(305,23.7)(304.1,15.8)
+\closepath
+}
+}
+{
+\newrgbcolor{curcolor}{0.60784316 0.50588238 0.34117648}
+\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]
+{
+\newpath
+\moveto(291.4,500.2)
+\curveto(301.1,484.1)(307,462.5)(307,439.8)
+\curveto(307,435.5)(306.8,431.2)(306.3,426.9)
+\curveto(314.6,418.4)(321.3,409.1)(326,401.8)
+\curveto(327.6,410.1)(328.4,418.8)(328.4,427.4)
+\curveto(328.4,463.9)(314.9,501.1)(293.6,519.1)
+\curveto(284,522)(276.8,520.1)(274.4,519.3)
+\curveto(280.9,514.7)(286.6,508.1)(291.4,500.2)
+\closepath
+\moveto(302.4,527.6)
+\curveto(319.6,526.4)(337.6,516.9)(351.3,499.5)
+\curveto(365,482.1)(374.5,457.9)(374.5,430.5)
+\curveto(374.5,400.5)(363.1,368.7)(333.6,336.2)
+\curveto(340,335.8)(346.1,333.4)(350.5,329.8)
+\curveto(351.6,330)(352.7,330.1)(353.8,330.1)
+\lineto(354.5,330.1)
+\curveto(383.3,356.7)(394.6,389.2)(394.6,420.6)
+\curveto(394.6,450)(384.6,478.3)(369.5,499.2)
+\curveto(354.5,520.1)(334.6,533.4)(315.1,533.3)
+\curveto(308.3,533.3)(295.201,530)(288.6,526.5)
+\curveto(289.1,526.4)(294.5,528.1)(302.4,527.6)
+\closepath
+\moveto(372.7,501.3)
+\curveto(388.2,479.8)(398.4,450.8)(398.5,420.6)
+\curveto(398.5,389.2)(387.4,356.4)(359.4,329.5)
+\curveto(365.4,328.2)(370.7,325)(373.9,320.8)
+\curveto(374.299,320.2)(374.7,319.6)(375,319)
+\curveto(407,346.7)(419.5,380.5)(419.5,413.6)
+\curveto(419.5,446.6)(406.9,478.8)(388.4,502.7)
+\curveto(370,526.6)(345.8,542)(323,541.9)
+\curveto(312.4,541.9)(301.9,538.6)(292.3,531.1)
+\curveto(299.7,535.1)(307.401,537)(315.1,537)
+\curveto(336.4,536.9)(357.2,522.7)(372.7,501.3)
+\closepath
+\moveto(282.7,533.4)
+\curveto(277,534)(271.1,533.9)(265.2,533)
+\curveto(270.2,533)(275,532.1)(279.6,530.4)
+\curveto(280.5,531.4)(281.5,532.5)(282.7,533.4)
+\closepath
+\moveto(258.7,497.6)
+\curveto(264.6,487.7)(268.1,475)(268.1,463)
+\curveto(268.1,459.9)(267.9,456.8)(267.4,453.9)
+\curveto(272.3,451.7)(277.8,448.9)(283.8,445.1)
+\curveto(284,447.5)(284.1,449.9)(284.1,452.4)
+\curveto(284.1,468)(279.8,484.7)(272.5,497.4)
+\curveto(265.2,510.2)(255.1,518.7)(243.7,518.7)
+\curveto(238.8,518.7)(233.6,517.1)(228.1,513.6)
+\curveto(230.3,514.3)(232.5,514.6)(234.6,514.6)
+\curveto(244.5,514.6)(252.9,507.5)(258.7,497.6)
+\closepath
+\moveto(274.7,498.6)
+\curveto(282.2,485.4)(286.6,468.4)(286.6,452.4)
+\curveto(286.6,449.4)(286.4,446.5)(286.1,443.6)
+\curveto(289.6,441.3)(293.3,438.6)(297.1,435.6)
+\curveto(299.6,433.6)(301.9,431.5)(304.1,429.3)
+\curveto(304.4,432.8)(304.6,436.4)(304.6,439.9)
+\curveto(304.6,462.1)(298.8,483.4)(289.3,499)
+\curveto(279.8,514.6)(266.9,524.5)(252.7,524.5)
+\curveto(247.3,524.5)(241.6,523.1)(235.8,519.9)
+\curveto(238.5,520.7)(241.2,521.1)(243.8,521.1)
+\curveto(256.5,521.1)(267.2,511.7)(274.7,498.6)
+\closepath
+\moveto(247.5,460.9)
+\curveto(251.3,459.7)(257.4,458.1)(265,454.9)
+\curveto(265.4,457.5)(265.6,460.2)(265.6,463)
+\curveto(265.6,474.5)(262.2,486.9)(256.6,496.4)
+\curveto(251,505.9)(243.2,512.2)(234.6,512.1)
+\curveto(229.7,512.1)(224.3,510.1)(218.6,505.1)
+\curveto(235.7,512.7)(255.7,492)(247.5,460.9)
+\closepath
+\moveto(273.9,519.8)
+\curveto(274.4,521.3)(275.6,524.8)(278,528.3)
+\curveto(273.9,529.7)(269.6,530.5)(265.1,530.5)
+\curveto(259.2,530.5)(253,529.2)(246.5,526.3)
+\curveto(248.6,526.7)(250.7,526.9)(252.7,526.9)
+\curveto(260.3,526.9)(267.4,524.3)(273.9,519.8)
+\closepath
+\moveto(428.7,500)
+\curveto(430.9,497.5)(432.599,495.4)(434.599,492.7)
+\curveto(435.499,495.7)(437.499,498.8)(437.499,501.7)
+\curveto(441.499,499.1)(448.099,497.9)(451.699,493.7)
+\lineto(451.899,493.7)
+\curveto(458.999,503.7)(476.699,494.6)(472.899,484.5)
+\lineto(471.699,482.3)
+\curveto(469.699,479.4)(467.199,478.3)(464.899,478.2)
+\curveto(461.798,478.3)(459.298,480.2)(459.298,483.7)
+\curveto(459.298,485.2)(459.798,486.5)(460.399,487.5)
+\curveto(461.098,488.4)(461.899,488.9)(462.598,488.9)
+\curveto(463.199,488.9)(463.798,488.7)(464.498,487.9)
+\curveto(465.298,487.1)(465.498,486.5)(465.498,486.1)
+\curveto(465.498,485.7)(465.298,485.2)(464.898,484.9)
+\curveto(464.498,484.6)(463.998,484.4)(463.797,484.4)
+\lineto(463.697,484.4)
+\curveto(463.096,484.2)(462.297,484.5)(461.997,483.9)
+\curveto(461.697,483.3)(461.897,482.5)(462.497,482.2)
+\lineto(462.497,482.2)
+\curveto(462.897,482)(463.297,481.9)(463.697,481.9)
+\curveto(465.596,482)(467.797,483.5)(467.897,486.1)
+\curveto(467.897,487.3)(467.296,488.5)(466.197,489.6)
+\curveto(465.096,490.7)(463.797,491.3)(462.497,491.3)
+\curveto(458.997,491.2)(456.697,487.6)(456.697,483.7)
+\curveto(456.697,481.3)(457.596,479.2)(459.197,477.8)
+\curveto(460.697,476.4)(462.697,475.7)(464.897,475.7)
+\lineto(464.897,475.7)
+\curveto(467.596,475.7)(470.497,477)(472.796,479.6)
+\curveto(484.496,464.8)(484.096,446.4)(479.897,438.1)
+\curveto(527.7,488.7)(462.8,525.4)(428.7,500)
+\closepath
+\moveto(422.2,266.6)
+\curveto(441,286.901)(460.2,314.6)(465.5,356.201)
+\curveto(466.4,363.401)(466.8,370.401)(466.8,377.401)
+\curveto(466.8,386.501)(466.1,395.401)(464.7,404.101)
+\lineto(464.7,401.101)
+\curveto(464.7,354.901)(443.599,311.801)(407.599,284.101)
+\lineto(407.599,282.902)
+\curveto(407.599,282.202)(407.599,281.502)(407.499,280.902)
+\curveto(412.299,276.601)(415.799,269.801)(415.799,261.702)
+\curveto(415.799,261.101)(415.799,260.502)(415.699,259.902)
+\curveto(417.9,262)(420,264.2)(422.2,266.6)
+\closepath
+\moveto(442.8,496)
+\curveto(441.7,496.6)(440.5,497)(439.3,497.6)
+\curveto(439,496.1)(438.6,495.6)(438.1,494.1)
+\curveto(437.6,492.8)(437.201,491.3)(436.901,490.1)
+\curveto(439.8,486.5)(441.701,483.8)(443.3,481.3)
+\curveto(444,480)(446.7,474.8)(449.8,468.9)
+\curveto(453.3,462.1)(457.3,454.3)(458.901,450.6)
+\curveto(459.1,450.1)(459.6,449.9)(460.001,449.9)
+\curveto(460.201,449.9)(460.301,449.9)(460.501,450)
+\curveto(461.101,450.3)(461.401,451)(461.101,451.6)
+\curveto(458.501,457.6)(450.402,473.1)(446.902,479.7)
+\curveto(447.002,484.2)(448.002,488.2)(449.601,491.4)
+\curveto(447.7,493.3)(445.3,494.8)(442.8,496)
+\closepath
+\moveto(412.1,505.1)
+\curveto(432.1,480.1)(446.5,447.4)(446.5,412)
+\curveto(446.5,376.4)(431.8,338.2)(393.9,302.9)
+\curveto(394.099,302.4)(394.2,302)(394.4,301.5)
+\curveto(399,299.8)(402.299,296.9)(404.4,293.8)
+\curveto(405.7,291.901)(406.5,289.901)(407,288.1)
+\curveto(443,314.8)(461.1,355.3)(461.1,401.201)
+\curveto(461.1,411.501)(460,421.901)(457.8,432.301)
+\curveto(449.3,457.501)(435.5,479.901)(419,498.101)
+\curveto(416.7,500.5)(414.4,502.8)(412.1,505.1)
+\closepath
+\moveto(468.7,321.6)
+\curveto(467.9,321.6)(467.099,321.6)(466.3,321.701)
+\curveto(463.8,314.401)(460.8,307.501)(457.5,301.201)
+\curveto(473.7,307.1)(489.7,314.001)(500.3,327.301)
+\curveto(520.2,352.201)(520.8,405.201)(472.901,407.401)
+\curveto(473.6,403.401)(474.1,399.401)(474.501,395.301)
+\lineto(474.501,395.301)
+\curveto(474.501,395.301)(475.101,390.601)(475.201,387.201)
+\curveto(476.701,384.301)(477.301,381.701)(477.301,379.301)
+\curveto(477.301,376.301)(476.301,373.501)(474.701,370.901)
+\lineto(474.701,366.701)
+\curveto(477.6,370.301)(479.801,374.401)(479.801,379.301)
+\curveto(479.801,382.401)(478.501,386.201)(476.402,389.801)
+\curveto(476.402,389.801)(476.301,390.101)(476.502,390.401)
+\curveto(481.202,396.101)(486.302,398.301)(494.002,398.001)
+\curveto(495.902,394.801)(496.002,387.401)(495.902,382.801)
+\curveto(486.301,379.201)(483.702,371.901)(483.801,364.601)
+\curveto(483.801,357.801)(485.701,350.701)(485.701,344.901)
+\curveto(485.701,341.301)(485.001,338.401)(483.001,336.401)
+\curveto(482.501,335.901)(482.501,335.101)(483.001,334.701)
+\curveto(483.201,334.501)(483.601,334.301)(483.901,334.301)
+\curveto(484.201,334.301)(484.501,334.401)(484.8,334.701)
+\curveto(487.5,337.401)(488.3,341.101)(488.3,344.901)
+\curveto(488.3,351.101)(486.401,358.201)(486.401,364.601)
+\curveto(486.501,371.801)(487.501,377.901)(497.1,381.201)
+\curveto(497.3,381.301)(498.701,381.301)(499.1,381.301)
+\curveto(505.6,381.101)(510.901,374.201)(510.901,374.201)
+\curveto(492.2,375.9)(515.8,321.6)(468.7,321.6)
+\closepath
+\moveto(200.6,450.7)
+\lineto(200.6,448.7)
+\lineto(200.6,448.5)
+\lineto(200.6,448.3)
+\curveto(200.6,448.2)(200.5,447.7)(200.3,446.9)
+\curveto(205.2,447.9)(210.7,448.4)(216.8,448.4)
+\curveto(249.8,448.4)(297.4,431.9)(320.5,377.2)
+\curveto(323.1,380.4)(325.6,383.6)(327.9,387)
+\curveto(327.799,387.1)(327.7,387.2)(327.599,387.3)
+\curveto(323.7,394.3)(310.9,416.4)(293.299,430.6)
+\curveto(283.399,438.6)(274.399,443.8)(266.799,447.3)
+\curveto(244.899,456.8)(221.599,459.5)(200.099,458.5)
+\curveto(200.6,456)(200.6,453.5)(200.6,450.7)
+\closepath
+\moveto(391.4,504.8)
+\curveto(410.299,480.3)(423.2,447.4)(423.2,413.5)
+\curveto(423.2,380)(410.5,345.4)(378.7,317.2)
+\curveto(382.3,316)(385.5,313.8)(388,311.4)
+\curveto(389.6,309.799)(391,308.099)(392.1,306.299)
+\curveto(428.8,340.799)(442.701,377.599)(442.701,411.899)
+\curveto(442.701,449.199)(426.201,483.599)(404.001,508.799)
+\curveto(397.901,515.699)(391.401,521.899)(384.701,527.199)
+\curveto(365.401,539.699)(345.301,546.699)(327.901,546.699)
+\curveto(320.501,546.699)(313.701,545.499)(307.401,542.999)
+\curveto(312.501,544.599)(317.8,545.399)(323.1,545.399)
+\curveto(347.6,545.5)(372.5,529.3)(391.4,504.8)
+\closepath
+\moveto(287.4,329.7)
+\curveto(289.7,330.4)(291.9,330.8)(294.1,330.8)
+\curveto(295,330.8)(295.9,330.7)(296.7,330.6)
+\curveto(298.3,332.3)(300.4,333.5)(302.5,334.4)
+\curveto(305.8,335.7)(309.5,336.4)(313.2,336.4)
+\curveto(316.7,336.3)(320.099,335.9)(323.099,334.3)
+\curveto(325.599,335.5)(328.299,336.1)(330.999,336.3)
+\curveto(359.999,368.6)(370.899,401.5)(370.899,430.6)
+\curveto(370.899,457.2)(361.699,480.6)(348.499,497.3)
+\curveto(337.699,511)(318.899,524)(301.599,524.2)
+\curveto(309.899,521.3)(319.799,519.9)(333.699,500.8)
+\curveto(345.598,484.3)(354.699,460.9)(354.699,438.2)
+\curveto(354.699,428.8)(353.098,419.2)(349.598,409.8)
+\curveto(339.699,383.7)(322.899,365.9)(305.898,348.7)
+\curveto(299.6,342.4)(293.4,336.2)(287.4,329.7)
+\closepath
+\moveto(343.5,419.6)
+\curveto(352.3,470.2)(320.7,503.9)(303.8,514.5)
+\curveto(302.5,515.3)(301.2,516)(299.9,516.7)
+\curveto(319.2,496.8)(330.8,461.9)(330.9,427.5)
+\curveto(330.9,417.8)(330,408.1)(328,398.8)
+\curveto(329.4,396.5)(330.6,394.5)(331.5,392.9)
+\curveto(335.3,399)(338.6,405.6)(341.3,412.8)
+\curveto(342.2,415)(342.9,417.3)(343.5,419.6)
+\closepath
+\moveto(259.7,291.3)
+\lineto(259.7,291.3)
+\lineto(259.7,291.3)
+\lineto(259.7,291.3)
+\closepath
+\moveto(396,240.9)
+\curveto(398.4,243.2)(399.1,244.5)(401.9,247.599)
+\lineto(403.799,250.4)
+\lineto(404.299,251.4)
+\curveto(406.4,255.099)(407.099,258.5)(407.099,261.7)
+\curveto(407.2,268.099)(403.599,273.4)(400.299,275.5)
+\lineto(397.199,277.5)
+\lineto(398.699,280.9)
+\lineto(398.699,281)
+\curveto(398.699,281.1)(398.799,281.2)(398.799,281.4)
+\curveto(398.9,281.799)(398.9,282.299)(398.9,282.9)
+\curveto(398.9,284.7)(398.4,287)(397.099,289)
+\curveto(395.7,291)(393.599,292.9)(389.4,294)
+\lineto(386.2,294.8)
+\lineto(386.2,298.1)
+\curveto(386.3,299.1)(384.9,302.6)(382.099,305.1)
+\curveto(379.299,307.8)(375.7,309.6)(372.099,309.6)
+\lineto(367.799,309.6)
+\lineto(367.799,314)
+\curveto(367.799,314)(367.699,314.6)(367.099,315.4)
+\curveto(366.499,316.2)(365.4,317.299)(363.999,318.2)
+\curveto(361.199,320)(357.299,321.4)(353.999,321.4)
+\curveto(352.799,321.4)(351.699,321.2)(350.699,320.9)
+\lineto(348.199,320.099)
+\lineto(346.399,321.9)
+\curveto(343.598,324.799)(337.598,327.5)(332.399,327.5)
+\curveto(329.699,327.5)(327.298,326.9)(325.399,325.5)
+\lineto(322.399,323.4)
+\lineto(319.8,326)
+\curveto(319.3,326.7)(316.5,327.7)(313.2,327.7)
+\curveto(310.599,327.7)(307.8,327.2)(305.8,326.4)
+\curveto(303.7,325.6)(302.7,324.4)(302.7,324.2)
+\lineto(301.1,320.099)
+\lineto(297,321.7)
+\curveto(296.3,322)(295.3,322.2)(294.1,322.2)
+\curveto(290.2,322.2)(285.1,320.2)(282.4,315.2)
+\lineto(281.2,313)
+\lineto(273.4,313)
+\curveto(268.4,306.4)(263.8,299.2)(259.8,291.3)
+\lineto(259.8,291.3)
+\lineto(259.8,291.3)
+\curveto(259.8,291.3)(258,288.8)(255.8,283.901)
+\curveto(266.3,301.001)(284,315.201)(311.6,315.3)
+\curveto(320.401,315.3)(330.1,313.901)(340.901,310.6)
+\curveto(374.8,300.5)(383.501,280.8)(383.501,262)
+\curveto(383.501,244.3)(376.001,227.3)(375.201,219.6)
+\curveto(375.1,218.6)(375.001,217.701)(375.001,216.8)
+\curveto(375.001,206.401)(381.601,201.6)(387.701,201.6)
+\curveto(391.701,201.6)(395.401,203.6)(397.301,207.5)
+\curveto(397.101,207.3)(396.902,207.2)(396.701,207)
+\curveto(395.1,205.9)(393.201,205.4)(391.201,205.4)
+\curveto(389.001,205.4)(386.501,206.099)(384.6,207.9)
+\curveto(382.6,209.7)(379.401,213.799)(380.701,220.599)
+\curveto(382,227.3)(388.6,233.7)(396,240.9)
+\closepath
+\moveto(214.3,227)
+\curveto(219.4,223.4)(225.2,220.3)(230.1,219.2)
+\curveto(223.6,228.599)(218.3,240.2)(215.7,254.3)
+\curveto(213.2,255)(210.9,255.5)(208.9,255.901)
+\curveto(208.8,256.001)(208.6,256.201)(208.5,256.3)
+\curveto(208.6,255.7)(208.6,255.1)(208.6,254.5)
+\curveto(208.6,250.2)(207,243.5)(201.1,239.5)
+\curveto(202.8,236.7)(208.1,231.4)(214.3,227)
+\closepath
+\moveto(261.2,156.2)
+\curveto(269.1,159.8)(269.7,169.599)(269.7,174)
+\curveto(269.7,175.7)(268.6,178.1)(266.6,180)
+\curveto(265.3,181.3)(263.6,182.4)(261.8,183)
+\curveto(260,183.2)(258.2,183.5)(256.5,183.9)
+\curveto(254.4,184.4)(252.5,184.599)(250.7,184.599)
+\curveto(242.7,184.599)(238.1,179.7)(233.1,174.999)
+\curveto(232.6,173.399)(232.2,171.399)(232.2,169.199)
+\curveto(232.2,165.098)(233.3,160.499)(236,156.999)
+\curveto(238.1,154.399)(241,152.299)(245.2,151.399)
+\curveto(248.8,150.999)(255.6,152.699)(261.2,155.899)
+\lineto(261.2,156.2)
+\closepath
+\moveto(234.1,155.6)
+\curveto(230.9,159.701)(229.7,164.8)(229.7,169.3)
+\curveto(229.7,170.3)(229.8,171.3)(229.9,172.2)
+\curveto(226.3,169.099)(222.2,166.5)(216.3,166)
+\curveto(213.3,165.8)(210.2,165.7)(207.1,165.7)
+\curveto(204.5,165.7)(201.9,165.7)(199.3,165.8)
+\curveto(196.7,165.8)(194.2,165.901)(191.7,165.901)
+\curveto(178.1,165.901)(166.8,164.401)(166.7,153.501)
+\curveto(166.8,148.501)(169.1,141.601)(174.5,132.101)
+\curveto(174.5,132.101)(175.3,130.801)(176.8,128.902)
+\curveto(175.4,132.301)(174.6,135.801)(174.6,139.402)
+\curveto(174.6,142.902)(175.4,146.402)(177.2,149.502)
+\curveto(178.7,152.102)(181.1,153.702)(183.8,154.502)
+\curveto(186.5,155.302)(189.4,155.502)(192.5,155.502)
+\curveto(196.5,155.502)(200.7,155.202)(204.7,155.202)
+\curveto(210.8,155.202)(216.2,156.002)(219.5,159.402)
+\lineto(219.5,159.402)
+\curveto(220.2,160.101)(221.4,160.101)(222.1,159.402)
+\curveto(222.8,158.702)(222.8,157.502)(222.1,156.801)
+\curveto(217.5,152.201)(211,151.501)(204.6,151.501)
+\curveto(200.4,151.501)(196.2,151.901)(192.4,151.801)
+\curveto(189.5,151.801)(186.8,151.601)(184.8,150.902)
+\curveto(182.7,150.202)(181.3,149.301)(180.3,147.601)
+\curveto(178.9,145.202)(178.2,142.402)(178.2,139.402)
+\curveto(178.2,134.402)(180.1,129.002)(183.2,124.702)
+\curveto(186.3,120.402)(190.4,117.502)(194.7,116.902)
+\curveto(195.6,116.801)(196.5,116.702)(197.2,116.702)
+\curveto(201.8,116.802)(204,118.502)(205.7,121.402)
+\curveto(207.4,124.301)(208.1,128.601)(208.7,132.702)
+\curveto(208.8,133.202)(209.1,133.702)(209.6,134.002)
+\curveto(220.6,140.802)(221.6,145.802)(224.9,149.102)
+\curveto(225.6,149.802)(226.8,149.802)(227.5,149.102)
+\curveto(228.2,148.403)(228.2,147.203)(227.5,146.502)
+\curveto(225.4,144.502)(223.2,138.202)(212.3,131.302)
+\curveto(211.7,127.302)(211,123.102)(209,119.502)
+\curveto(207.2,116.202)(204.1,113.602)(199.5,113.002)
+\curveto(203.2,112.102)(207.2,111.902)(211.5,112.602)
+\curveto(228.1,120.302)(238.5,140.002)(242.8,149.403)
+\curveto(239.1,150.8)(236.1,153)(234.1,155.6)
+\closepath
+\moveto(178.4,227)
+\curveto(182.2,223.2)(191.4,221.9)(195.9,226.3)
+\curveto(198,221.1)(212,186.6)(270.9,187.401)
+\curveto(264.4,189.401)(255.1,193.6)(245.2,202.201)
+\curveto(241,205.901)(236.9,210.1)(233.1,215.1)
+\curveto(226.3,215.401)(218.7,219.401)(212.1,224)
+\curveto(206,228.4)(200.9,233.2)(198.4,236.8)
+\curveto(195.7,236.1)(193.2,235.8)(191,235.8)
+\curveto(185.4,235.8)(181,237.8)(178.1,240.901)
+\curveto(175.2,244.001)(173.9,248.001)(173.9,251.8)
+\curveto(173.9,254)(174.3,256.1)(175.2,258)
+\curveto(171.3,255.5)(168.2,252.6)(166.7,250.6)
+\curveto(133.8,254.701)(116.2,252.3)(109.6,246.8)
+\curveto(104.4,236.3)(100,215.901)(133.4,206.2)
+\curveto(132.1,207.5)(132.3,208.8)(133.1,210)
+\curveto(129,211)(125.4,212.6)(122.4,214.7)
+\curveto(116.7,218.7)(113.4,224.599)(113.4,231.599)
+\curveto(113.4,232.099)(113.4,232.599)(113.5,233.099)
+\curveto(113.7,236.9)(115.5,239.7)(118.2,241.2)
+\curveto(120.9,242.7)(124.2,243.099)(127.8,243.099)
+\curveto(134.7,243.099)(143.1,241.599)(150.6,241.599)
+\curveto(158.5,241.599)(165,243.099)(168.6,248.7)
+\lineto(168.6,248.7)
+\curveto(169.2,249.599)(170.3,249.8)(171.2,249.2)
+\curveto(172.1,248.599)(172.3,247.5)(171.7,246.599)
+\curveto(167,239.4)(158.8,237.799)(150.6,237.799)
+\curveto(142.6,237.799)(134.2,239.299)(127.8,239.299)
+\curveto(124.5,239.299)(121.7,238.9)(120,237.9)
+\curveto(118.3,236.9)(117.4,235.7)(117.2,232.799)
+\lineto(117.2,231.499)
+\curveto(117.2,225.699)(119.7,221.099)(124.6,217.599)
+\curveto(129.3,214.299)(136.3,212.299)(145.2,212.2)
+\curveto(148.4,215.599)(149.9,219.099)(149.8,221.5)
+\curveto(149.8,222.1)(149.7,222.6)(149.6,223)
+\curveto(149.4,223.7)(149.6,224.4)(150.1,224.9)
+\curveto(151.3,226.099)(152.8,226.5)(154.2,226.799)
+\curveto(155.7,227.099)(157.3,227.4)(159,227.9)
+\curveto(162.4,228.9)(166.2,230.599)(170.1,235.7)
+\curveto(170.7,236.5)(171.9,236.7)(172.7,236.099)
+\curveto(173.5,235.499)(173.7,234.299)(173.1,233.499)
+\curveto(166.6,224.799)(159,224.099)(155.1,223.199)
+\curveto(154.4,223.098)(153.9,222.899)(153.5,222.699)
+\curveto(153.6,222.299)(153.6,221.899)(153.6,221.499)
+\curveto(153.6,217.499)(151.4,213.099)(147.3,209.099)
+\curveto(147.1,208.9)(146.8,208.7)(146.5,208.599)
+\curveto(146.5,207.9)(146.2,207.2)(145.4,206.4)
+\curveto(153.2,205.7)(163.5,203.299)(168.5,208.299)
+\curveto(173.4,213.3)(174.9,223.5)(178.4,227)
+\closepath
+\moveto(137.5,369.6)
+\curveto(138.8,371.1)(150.4,383.1)(157.7,388.3)
+\curveto(150.7,386.6)(139.4,380.6)(129.8,372.9)
+\curveto(131.7,371.5)(135.2,369.9)(137.5,369.6)
+\closepath
+\moveto(139.8,354.8)
+\curveto(144.9,360)(162.2,379.5)(161.1,383.3)
+\curveto(155.1,377.5)(150.2,373.2)(147.6,370.2)
+\curveto(143.7,365.7)(141,361.9)(139.8,354.8)
+\closepath
+\moveto(112.4,270.4)
+\curveto(112.4,281.4)(130.8,280)(133.9,291.9)
+\curveto(137.4,305.2)(123.1,305.799)(129.8,316.2)
+\curveto(120.1,322.7)(110.1,319.099)(110.1,327.2)
+\curveto(110.1,335.4)(128.6,339.3)(135.6,363.3)
+\curveto(135.6,363.3)(133.7,358.2)(128.3,353.7)
+\curveto(113.3,341.3)(96,340.4)(95.4,324)
+\curveto(94.7,306.2)(114.8,294.5)(107.6,287.3)
+\curveto(100.6,280.3)(108.9,273.9)(112.4,270.4)
+\closepath
+\moveto(191.5,437.6)
+\curveto(197.2,430.6)(211.2,411.6)(211.2,392.9)
+\curveto(211.2,385.5)(208.9,378)(202.9,371.7)
+\curveto(245.8,352.7)(214.3,317.599)(219.2,256.099)
+\curveto(223.3,232.4)(235.3,215.9)(247.7,204.999)
+\curveto(259.6,194.499)(270.3,187.999)(279.2,187.999)
+\curveto(279.4,187.999)(280.4,188.199)(280.6,188.299)
+\curveto(267.1,193.199)(254.7,205.299)(248.9,216.799)
+\curveto(246.1,222.4)(243.7,229.299)(242.6,235.099)
+\curveto(241.6,240.599)(241.5,243.299)(241.5,249.999)
+\curveto(241.5,277.999)(252,295.099)(252,295.099)
+\curveto(264.7,320.299)(282.8,337.599)(299.7,354.7)
+\curveto(306,361)(312.099,367.4)(317.7,374)
+\curveto(295.5,428.5)(248.9,444.7)(216.7,444.7)
+\curveto(210.1,444.7)(204.2,444)(199.2,442.9)
+\lineto(199.2,442.9)
+\curveto(198.9,442.8)(198.6,442.8)(198.3,442.9)
+\curveto(196.9,441.1)(194.8,439.1)(191.5,437.6)
+\closepath
+\moveto(351.3,167.9)
+\curveto(347.7,163.4)(341.1,158.9)(329.7,155.5)
+\curveto(316.8,151.7)(304.7,149.7)(294,149.7)
+\curveto(283.8,149.7)(274.7,151.5)(267,155)
+\curveto(266.1,154.3)(265.1,153.6)(264,153)
+\curveto(261.7,148.3)(258.3,145.3)(253.8,143.4)
+\curveto(294.6,128)(363.6,139.299)(381.7,155.2)
+\lineto(381.7,156.4)
+\curveto(381.7,159.099)(381.8,161.5)(382,163.7)
+\lineto(381,163.7)
+\curveto(368.4,163.7)(358.6,165.7)(351.3,167.9)
+\closepath
+\moveto(396,161.5)
+\curveto(399.4,161.5)(402.8,162.1)(405.9,163.2)
+\curveto(413.9,164.8)(421.4,168.099)(427.099,171)
+\curveto(409.599,165.8)(394.999,163.9)(382.9,163.7)
+\curveto(386.4,162.4)(390.7,161.5)(396,161.5)
+\closepath
+\moveto(414.5,154.1)
+\curveto(410.6,140.5)(433.7,139.6)(443.2,141.701)
+\curveto(441.5,142.701)(440.099,144.301)(439.3,146.801)
+\curveto(438.2,150.201)(439.401,153.402)(441.401,155.601)
+\curveto(435,158.9)(418.3,167.3)(414.5,154.1)
+\closepath
+\moveto(553,374.7)
+\curveto(550.8,446.1)(503.9,525.6)(428.7,533.7)
+\curveto(423.099,527.5)(418.2,521.4)(413.9,515.4)
+\curveto(417.799,511.7)(421.599,507.9)(425.299,503.8)
+\curveto(425.499,503.6)(425.699,503.3)(425.9,503.1)
+\curveto(426.5,503.6)(427.2,504.1)(427.799,504.6)
+\curveto(445.999,517.4)(483.099,519.7)(498.699,487.7)
+\curveto(514.098,456.1)(484.899,432.1)(484.899,432.1)
+\curveto(481.598,429.2)(475.699,426.3)(468.798,424.9)
+\curveto(469.998,420.5)(470.998,416.1)(471.899,411.6)
+\lineto(472.098,411.6)
+\curveto(491.598,413.1)(513.498,401.4)(517.498,373.2)
+\curveto(525.298,318)(470.098,296.3)(452.198,290.099)
+\curveto(449.597,288.9)(448.798,287.099)(448.798,287.099)
+\curveto(453.498,286.4)(457.598,282.7)(460.098,277.7)
+\curveto(461.298,275.2)(461.798,273)(461.798,271)
+\curveto(461.798,266.2)(458.698,262.6)(454.399,260.1)
+\curveto(450.098,257.6)(444.499,256.401)(440.499,256.401)
+\curveto(438.699,256.401)(437.099,256.701)(436.199,257.1)
+\curveto(435.699,257.3)(435.399,257.5)(435.299,257.701)
+\curveto(435.4,258.1)(435.499,258.6)(435.699,259.001)
+\curveto(439.199,266.801)(458.199,258.001)(454.799,275.301)
+\curveto(453.699,280.701)(450.699,283.101)(446.599,283.501)
+\curveto(431.499,261.501)(413.599,246.301)(401.7,234.801)
+\curveto(394.4,227.902)(388.8,223.301)(387.599,219.701)
+\curveto(387.2,218.501)(386.2,214.901)(388.499,212.501)
+\curveto(389.099,211.901)(389.999,211.101)(390.899,211.001)
+\curveto(396.999,210.001)(397.699,216.801)(397.699,216.801)
+\curveto(398.699,215.501)(399.299,214.001)(399.299,212.402)
+\curveto(399.299,212.002)(399.199,211.601)(399.199,211.202)
+\lineto(399.199,210.902)
+\curveto(398.199,204.002)(392.899,200.402)(387.399,200.402)
+\lineto(387.3,200.402)
+\curveto(383.901,200.402)(380.401,201.801)(377.7,204.502)
+\curveto(375,207.302)(373.3,211.402)(373.3,216.902)
+\curveto(373.3,217.801)(373.401,218.801)(373.5,219.801)
+\curveto(374.4,227.902)(381.8,244.701)(381.8,262.101)
+\curveto(381.8,280.501)(373.6,299.402)(340.1,309.501)
+\curveto(329.401,312.701)(319.8,314.101)(311.1,314.101)
+\curveto(279.5,314.101)(261.1,295.101)(251.8,274.702)
+\curveto(249.7,268.002)(247.8,259.402)(247.3,248.902)
+\curveto(247.1,244.502)(247.5,239.202)(248,235.301)
+\curveto(248.6,231.301)(251.1,222.902)(253.8,217.301)
+\curveto(259.6,205.701)(268.2,194.601)(279.7,189.801)
+\lineto(281.5,189.101)
+\curveto(287.4,190.402)(290.8,191.601)(297.2,193.902)
+\lineto(298.7,194.402)
+\curveto(308.9,198.101)(318.5,201.601)(327.8,201.601)
+\curveto(333.8,201.601)(339,200.301)(343.7,197.301)
+\curveto(344.3,197.001)(344.8,196.601)(345.3,196.201)
+\lineto(348.2,193.901)
+\lineto(348.2,193.901)
+\lineto(348.9,193.201)
+\curveto(352.5,189.401)(355.2,183.901)(354.799,178.1)
+\curveto(354.599,175.701)(353.9,172.901)(352.199,170.1)
+\curveto(359.199,168)(368.499,166.201)(380.499,166.201)
+\curveto(394.799,166.201)(413.099,168.801)(435.899,176.701)
+\lineto(435.999,176.701)
+\curveto(436.099,176.701)(436.099,176.801)(436.099,176.801)
+\curveto(474.299,176.801)(459.099,152.101)(454.9,157.001)
+\curveto(450.299,162.201)(439.4,154.801)(442.5,146.301)
+\curveto(447.2,133.101)(468.7,144.801)(471,153.501)
+\curveto(466.6,124.701)(421.8,137.001)(411.5,138.401)
+\curveto(399.4,140.1)(394.5,128.901)(396.2,118.6)
+\curveto(397.599,110.1)(392.3,102.3)(389.9,100)
+\curveto(407,96.7)(415.099,111.2)(421.799,115.8)
+\curveto(428.599,120.5)(453.199,118.2)(467.099,128.901)
+\curveto(481,139.5)(479.2,165.1)(479.2,168.1)
+\curveto(482.4,169.401)(493.2,173.8)(493.2,186.201)
+\curveto(493.2,197.001)(485.2,202.401)(477,201.401)
+\curveto(467.9,200.3)(465.2,189.1)(475.5,188.901)
+\curveto(473.2,191.201)(475.9,194.701)(479,193.001)
+\curveto(483.7,190.401)(478.4,182.601)(468.7,184.201)
+\curveto(465.3,184.801)(457.599,185.901)(450.3,186.901)
+\curveto(505.7,215.9)(556.1,275.2)(553,374.7)
+\closepath
+\moveto(435.5,254.8)
+\curveto(436.9,254.2)(438.7,254)(440.8,254)
+\curveto(445.401,254)(451.2,255.3)(456,258)
+\curveto(460.8,260.7)(464.7,265.1)(464.7,271)
+\curveto(464.7,273.4)(464.099,276)(462.7,278.8)
+\curveto(462,280.2)(461.3,281.3)(460.4,282.3)
+\curveto(465.2,278.6)(467.599,275)(468.599,271.8)
+\curveto(468.799,271)(468.999,270.2)(469.2,269.5)
+\curveto(469.3,268.7)(469.4,268)(469.4,267.3)
+\curveto(469.4,264.8)(468.799,262.6)(468.099,260.901)
+\curveto(464.7,251.5)(455.8,247.1)(445.9,247)
+\curveto(444.299,247)(442.599,247.1)(441,247.4)
+\curveto(438.3,248.9)(435.9,251.7)(435.4,255)
+\curveto(435.4,254.8)(435.4,254.8)(435.5,254.8)
+\closepath
+\moveto(436.1,245.8)
+\curveto(439.3,244.901)(442.6,244.5)(445.8,244.5)
+\lineto(445.901,244.5)
+\curveto(456.401,244.5)(466.401,249.4)(470.3,259.8)
+\curveto(470,250.5)(465.3,246.401)(458.901,243.1)
+\curveto(452.3,239.701)(444.001,237.6)(438.001,232.6)
+\curveto(433.201,228.6)(431.201,223.701)(431.201,218.8)
+\curveto(431.201,211.8)(435.1,204.8)(440.1,199)
+\curveto(405,220.5)(420.6,241.6)(436.1,245.8)
+\closepath
+\moveto(452.6,224.5)
+\curveto(439.8,220.2)(441.8,205.1)(443.201,199.1)
+\curveto(437.801,204.901)(433.701,212.1)(433.701,218.701)
+\curveto(433.701,222.901)(435.301,227.001)(439.6,230.6)
+\curveto(445,235.201)(453.1,237.3)(460,240.8)
+\curveto(466.9,244.3)(472.8,249.7)(472.8,260.401)
+\curveto(472.8,263.201)(472.401,266.3)(471.6,269.8)
+\curveto(470.701,275.8)(466.201,282.8)(453.8,289.401)
+\curveto(463.901,288.701)(482.7,284.201)(486,265.001)
+\curveto(489.7,243.8)(468.7,229.9)(452.6,224.5)
+\closepath
+\moveto(281.2,184.7)
+\curveto(276.6,183.599)(272,182.9)(267.3,182.8)
+\curveto(267.7,182.5)(268,182.2)(268.4,181.901)
+\curveto(270.7,179.6)(272.2,176.901)(272.3,174.1)
+\curveto(272.3,170.8)(272.1,164.1)(268.3,159)
+\curveto(270.5,156.8)(281.7,154.5)(281.7,154.5)
+\curveto(283.1,154.3)(284,154.4)(285,154.4)
+\curveto(288.3,154.4)(290.7,156.2)(292.5,159.099)
+\curveto(294.2,161.999)(295.1,165.999)(295.1,169.799)
+\curveto(295.1,170.799)(295,171.9)(294.9,172.9)
+\curveto(293.8,180.5)(289.1,184.9)(281.9,184.9)
+\curveto(281.6,184.7)(281.4,184.7)(281.2,184.7)
+\closepath
+\moveto(298.9,190.4)
+\curveto(295.1,189)(291.3,187.599)(287.4,186.4)
+\curveto(292.9,184.5)(296.6,179.599)(297.4,173)
+\curveto(297.5,171.9)(297.6,170.8)(297.6,169.6)
+\curveto(297.6,165.401)(296.6,161)(294.6,157.6)
+\curveto(293.7,156.1)(292.6,154.8)(291.3,153.8)
+\curveto(298.5,153.6)(305.7,154.3)(312.5,155.5)
+\lineto(312.5,155.5)
+\curveto(320.6,156.6)(325.2,166.3)(325.2,174.5)
+\curveto(325.2,175.6)(325.099,176.7)(324.9,177.7)
+\curveto(323.7,185.099)(316.599,193.3)(307.4,193.3)
+\curveto(304.7,192.5)(301.8,191.4)(298.9,190.4)
+\closepath
+\moveto(342.3,194)
+\curveto(337.901,196.9)(333.2,198)(328.3,198)
+\curveto(323.401,198)(318.2,196.9)(312.8,195.2)
+\curveto(320.8,192.7)(326.3,185.3)(327.5,178.3)
+\curveto(327.7,177.1)(327.8,175.901)(327.8,174.6)
+\curveto(327.8,168.701)(325.6,161.8)(321.3,157.5)
+\curveto(323.901,158.1)(326.3,158.8)(328.7,159.5)
+\curveto(337.9,162.2)(351.099,169)(351.8,178.4)
+\lineto(351.8,178.299)
+\curveto(351.8,178.699)(351.901,178.999)(351.901,179.4)
+\curveto(351.7,186.1)(346.1,191.3)(342.3,194)
+\closepath
+\moveto(124.6,372.3)
+\curveto(139.1,383.8)(159.7,393.3)(163.6,389.4)
+\curveto(167.5,385.5)(151.7,361.4)(135,344.7)
+\curveto(148.8,344.7)(163.4,347.4)(194.7,374.5)
+\curveto(198.5,380.2)(200,386.1)(200,392)
+\curveto(200.1,410.6)(184.6,429)(178.3,435.6)
+\curveto(170.3,436.8)(167.6,442.5)(167.5,442.8)
+\lineto(167.4,443.1)
+\lineto(167.3,443.4)
+\curveto(167.3,443.6)(166.4,448.1)(166.9,454.1)
+\curveto(145,449.2)(128.2,441.5)(121.7,436.1)
+\curveto(121.7,436.1)(123.6,433.7)(122.8,428.8)
+\curveto(126.4,427.3)(132.4,435.8)(140.9,432.2)
+\curveto(148.2,429)(154.9,422.4)(162.3,423.4)
+\lineto(163,420.3)
+\curveto(155,418)(147.7,426)(140.2,428.8)
+\curveto(132.4,431.8)(126.3,423.4)(122.1,425.9)
+\curveto(121.8,424.9)(121.3,423.7)(120.7,422.5)
+\curveto(121.3,418.1)(124.1,412.6)(128.3,409.3)
+\curveto(128.4,409.2)(128.5,409)(128.5,408.8)
+\curveto(128.5,408.6)(128.4,408.4)(128.3,408.3)
+\curveto(125.1,405.7)(106.6,392.3)(101.8,387.6)
+\curveto(102.1,387.4)(102.4,387.2)(102.8,387)
+\curveto(109.4,382.9)(117.4,378.9)(122.4,378.9)
+\lineto(123.3,378.9)
+\curveto(125.9,381)(147.7,395.5)(160.4,395.6)
+\curveto(164.4,395.6)(167.7,394)(168.7,389.9)
+\curveto(168.8,389.6)(168.6,389.2)(168.3,389.1)
+\curveto(168,389)(167.6,389.2)(167.5,389.5)
+\curveto(166.6,392.9)(164.1,394.2)(160.4,394.2)
+\curveto(148.2,394.3)(124.9,378.7)(124,377.7)
+\curveto(123.9,377.6)(123.8,377.5)(123.6,377.5)
+\curveto(123.2,377.5)(122.8,377.4)(122.4,377.4)
+\curveto(112.4,377.5)(94.5,390.6)(90.8,393.4)
+\curveto(93.6,385.4)(108,374.8)(124.6,372.3)
+\closepath
+\moveto(136,408.7)
+\curveto(126.6,410.2)(125.5,420.7)(125.5,420.7)
+\curveto(127.8,426.2)(141.1,427.3)(148.8,416.8)
+\curveto(148.8,416.8)(143.4,407.5)(136,408.7)
+\closepath
+\moveto(184.9,262.5)
+\curveto(180.7,260.4)(177.7,256.6)(177.7,251.9)
+\curveto(177.8,245.9)(181.7,239.599)(191.1,239.5)
+\curveto(193.1,239.5)(195.4,239.8)(198,240.5)
+\curveto(204.4,243.5)(206.2,250.2)(206.2,254.4)
+\curveto(206.2,255.2)(206.1,255.9)(206,256.4)
+\curveto(205.8,257.299)(205.6,258.2)(205.3,258.9)
+\curveto(198.4,263.9)(191.2,264.2)(184.9,262.5)
+\closepath
+\moveto(100.7,388.4)
+\curveto(105.3,392.9)(122.3,405.4)(126.8,408.8)
+\curveto(122.9,412.1)(120.4,416.5)(119.7,420.8)
+\curveto(119.4,420.2)(119,419.5)(118.5,418.9)
+\curveto(112.3,409.2)(98.6,401.4)(90.8,395)
+\curveto(91.5,394.5)(95.5,391.5)(100.6,388.2)
+\curveto(100.7,388.3)(100.7,388.4)(100.7,388.4)
+\closepath
+\moveto(208.7,392.9)
+\curveto(208.8,410.9)(194.2,430.5)(189,436.7)
+\curveto(188.5,436.6)(188.1,436.4)(187.6,436.3)
+\curveto(185.6,435.8)(183.7,435.6)(181.9,435.5)
+\curveto(189,427.6)(202.4,410.4)(202.5,392.1)
+\curveto(202.5,386)(201,379.9)(197.2,374)
+\curveto(198.3,373.6)(199.4,373.2)(200.4,372.8)
+\lineto(200.4,372.8)
+\curveto(206.5,378.7)(208.7,385.7)(208.7,392.9)
+\closepath
+\moveto(159.6,456.1)
+\curveto(157.3,460.5)(152.9,464.6)(140.5,471)
+\curveto(133.4,463.1)(132.9,454)(134.1,447)
+\curveto(141.3,450.6)(149.9,453.7)(159.6,456.1)
+\closepath
+\moveto(186.9,439.3)
+\curveto(196.7,441.7)(197.5,448.8)(197.5,448.8)
+\curveto(197.5,457.5)(198.9,461.8)(183.6,477.1)
+\curveto(165.7,466.7)(170.3,444.2)(170.3,444.2)
+\curveto(170.3,444.2)(174,436.1)(186.9,439.3)
+\closepath
+}
+}
+\end{pspicture}
+\end{document}
diff --git a/Master/texmf-dist/doc/xelatex/xepersian/xepersian.pdf b/Master/texmf-dist/doc/xelatex/xepersian/xepersian.pdf
new file mode 100644
index 00000000000..7db9c9387c2
--- /dev/null
+++ b/Master/texmf-dist/doc/xelatex/xepersian/xepersian.pdf
Binary files differ