diff options
author | Mohsen BANAN <libre@mohsen.1.banan.byname.net> | 2012-03-09 14:18:25 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2012-03-09 14:18:25 +0200 |
commit | 4f96ea3f4fbe8950c0d281da836897fb8394a812 (patch) | |
tree | e7e586ac09004662fbea0746a0ed6ca8374d9613 /leim/quail | |
parent | 3f018d6d392cacb025c8de92bfabf4d7a92ade52 (diff) | |
download | emacs-4f96ea3f4fbe8950c0d281da836897fb8394a812.tar.gz |
Update the Persian input methods.
leim/quail/persian.el: Update which includes: (1) full compliance to
ISIRI-6219, forbiden characters were eliminated and missing
characters were added; (2) layer 3 of ISIRI-9147 is now
implemented with a '\' prefix; (3) double entry of characters
which were postfixed with 'h' is now supported; (4) lots of
comment and additional pointers have been added.
Diffstat (limited to 'leim/quail')
-rw-r--r-- | leim/quail/persian.el | 380 |
1 files changed, 299 insertions, 81 deletions
diff --git a/leim/quail/persian.el b/leim/quail/persian.el index d006e83aa71..8da42b75f31 100644 --- a/leim/quail/persian.el +++ b/leim/quail/persian.el @@ -2,8 +2,8 @@ ;; Copyright (C) 2011-2012 Free Software Foundation, Inc. -;; Author: Mohsen BANAN <libre@mohsen.banan.1.byname.net> -;; http://mohsen.banan.1.byname.net/contact +;; Author: Mohsen BANAN <libre@mohsen.1.banan.byname.net> +;; http://mohsen.1.banan.byname.net/contact ;; Keywords: multilingual, input method, Farsi, Persian, keyboard @@ -27,12 +27,15 @@ ;;; Commentary: ;; ;; This file contains a collection of input methods for -;; Persian languages - Farsi, Urdu, Pashto (Afghani), ... +;; Persian languages (Farsi, Urdu, Pashto/Afghanic, ...) ;; ;; At this time, the following input methods are specified: ;; -;; - (farsi) Persian Keyboard based on Islamic Republic of Iran's ISIR-9147 -;; - (farsi-translit) Intuitive transliteration keyboard layout for Persian +;; - (farsi-isiri-9149) Persian Keyboard based on Islamic Republic of Iran's ISIR-9147 +;; - (farsi-transliterate-banan) An intuitive transliteration keyboard for Farsi +;; +;; Additional documentaion for these inpput methods can be found at: +;; http://www.persoarabic.org/PLPC/120036 ;; ;;; Code: @@ -42,42 +45,71 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; farsi +;; farsi-isiri-9147 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; The keyboard mapping defined here is based on: ;; -;; Institute of Standards and Industrial Research of Iran -;; Information Technology – Layout of Persian Letters and Symbols on Computer Keyboards -;; ISIRI 9147 -- 1st edition -;; http://www.isiri.org/UserStd/DownloadStd.aspx?id=9147 +;; Institute of Standards and Industrial Research of Iran +;; Information Technology – Layout of Persian Letters and Symbols +;; on Computer Keyboards +;; ISIRI 9147 -- 1st edition +;; http://www.isiri.org/UserStd/DownloadStd.aspx?id=9147 +;; +;; The specification is also republished at +;; http://www.farsiweb.ir/wiki/Image:Isiri-9147.pdf +;; and various other sites. +;; +;; ISIRI-6219 is also relevant. +;; +;; Layers 1, 2 and 3 of ISIRI-9147 are fully implemented with the +;; exception of the Backslash, Alt-Backslash, Shift-Space and +;; Alt-Space keys. +;; +;; The Backslash key is used to replace کلید با دگر ساز راست -- the Alt or +;; Meta key. ;; -;; Only layers 1 and 2 of ISIRI-9147 are applicable to emacs. +;; Layer 3 is then entered with the Backslash key and Layer 3 is +;; implemented as two letter keys as specified in ISIRI-9147. ;; -;; This input method was built using the Farsi table in X Keyboard Configuration Data Base. +;; The character corresponding to Backslash is entered with Backslash-Backslash. +;; Alt-Backslash has been moved to Backslash-r. +;; Alt-Space has been moved to Backslash-t. +;; Shift-Space has been moved to Backslash-y. ;; -;; 0) Selected gnome keyboard "USA" -;; 1) Created a list of all keys -;; 2) Selected gnome keyboard "Iran" -;; 3) For each key just press it and get the mapped persian character +;; With these modifications, farsi-isiri-9147 is a full implementation +;; of ISIRI-9147. Additionally, these modifications allow for this +;; implementation to be ascii input stream based -- in addition to +;; being a keyboard layout. +;; +;; If a key on Layer 1 was reserved to replace دگر ساز راست (the Alt +;; or Meta key), then farsi-isiri-9147 could have claimed full +;; compliance -- without the need for the above description. Perhaps +;; this can be considered a flaw in the base ISIRI-9147 specification +;; to be addressed in the next revision. ;; (quail-define-package - "farsi" "Farsi" " ف" nil "Farsi input method. + "farsi-isiri-9147" "Farsi" " ف" nil "Farsi input method. -Based on ISIRI-9149 Layout of Persian Letters and Symbols on Computer Keyboards. +Based on ISIRI-9147 Layout of Persian Letters and Symbols on Computer Keyboards. " nil t t t t nil nil nil nil nil t) +;; Note: the rows of keys below are enclosed in Left-To-Right Override +;; embedding, to prevent them from being reordered by the Emacs +;; display engine. + + ;; +----------------------------------------------------------------+ -;; | ۱! | ۲٬ | ۳٫ | ۴﷼ | ۵٪ | ۶× | ۷، | ۸* | ۹) | ۰( | -ـ | =+ | `÷ | +;; | ۱! | ۲٬ | ۳٫ | ۴﷼ | ۵٪ | ۶× | ۷، | ۸* | ۹( | ۰) | -ـ | =+ | `÷ | ;; +----------------------------------------------------------------+ -;; | ضْ| صٌ| ثٍ| قً| فُ| غِ| عَ| هّ| خ] | ح[ | ج} | چ{ | +;; | ضْ| صٌ| ثٍ| قً| فُ| غِ| عَ| هّ| خ] | ح[ | ج{ | چ} | ;; +------------------------------------------------------------+ -;; | شؤ | سئ | یي | بإ | لأ | اآ | تة | ن» | م« | ک: | گ؛ | \| | +;; | شؤ | سئ | یي | بإ | لأ | اآ | تة | ن« | م» | ک: | گ؛ | \| | ;; +-----------------------------------------------------------+ -;; | ظك | طٓ| زژ | رٰ| ذB | دٔ| پء | و> | .< | /؟ | +;; | ظك | طٓ| زژ | رٰ| ذB | دٔ| پء | و< | .> | /؟ | ;; +-------------------------------------------+ (quail-define-rules @@ -93,7 +125,7 @@ Based on ISIRI-9149 Layout of Persian Letters and Symbols on Computer Keyboards. ("0" ?۰) ("-" ?-) ("=" ?=) - ;;("`" ?\)) ;; اتصال مجازى + ("`" ?\u200D) ;; ZWJ -- ZERO WIDTH JOINER اتصال مجازى ("q" ?ض) ("w" ?ص) ("e" ?ث) @@ -117,7 +149,7 @@ Based on ISIRI-9149 Layout of Persian Letters and Symbols on Computer Keyboards. ("l" ?م) (";" ?ک) ("'" ?گ) - ("\\" ?\\) ;; خط اريب وارو + ("z" ?ظ) ("x" ?ط) ("c" ?ز) @@ -170,93 +202,204 @@ Based on ISIRI-9149 Layout of Persian Letters and Symbols on Computer Keyboards. ("X" ?ٓ) ("C" ?ژ) ("V" ?ٰ) - ;; ("B" ?) ;; فاصلهً مجازى + ("B" ?\u200C) ;; ZWNJ -- ZERO WIDTH NON-JOINER فاصلهٔ مجازى ("N" ?ٔ) ;; همزه فارسى بالا ("M" ?ء) ;; harf farsi hamzeh ("<" ?>) (">" ?<) ("?" ?؟) + + ;; Level 3 Entered with \ + ;; + ("\\" ?\\) ;; خط اريب وارو + ("\\\\" ?\\) + ("\\~" ?\u007E) + ("\\1" ?\u0060) + ("\\2" ?\u0040) + ("\\3" ?\u0023) + ("\\4" ?\u0024) + ("\\5" ?\u0025) + ("\\6" ?\u005E) + ("\\7" ?\u0026) + ("\\8" ?\u2022) + ("\\9" ?\u200E) + ("\\0" ?\u200F) + ("\\-" ?\u005F) + ("\\+" ?\u2212) + ("\\q" ?\u00B0) + ;;\\w" ?\u0000) + ("\\e" ?\u20AC) + ("\\r" ?\u2010) ;; replacement for Alt-BSL + ("\\t" ?\u00A0) ;; replacement for ALT-SPC + ("\\y" ?\u200C) ;; replacement for SHIFT-SPC + ;;("\\u" ?\u0000) + ("\\i" ?\u202D) + ("\\o" ?\u202E) + ("\\p" ?\u202C) + ("\\[" ?\u202A) + ("\\]" ?\u202B) + ;;("\\a" ?\u0000) + ;;("\\s" ?\u0000) + ("\\d" ?\u0649) + ;;("\\f" ?\u0000) + ;;("\\g" ?\u0000) + ("\\h" ?\u0671) + ;;("\\j" ?\u0000) + ("\\k" ?\uFD3E) + ("\\l" ?\uFD3F) + ("\\;" ?\u003B) + ("\\'" ?\u0022) + ;;("\\z" ?\u0000) + ;;("\\x" ?\u0000) + ;;("\\c" ?\u0000) + ("\\v" ?\u0656) + ("\\b" ?\u200D) + ("\\n" ?\u0655) + ("\\m" ?\u2026) + ("\\," ?\u002C) + ("\\." ?\u0027) + ("\\?" ?\u003F) + ;;("\\\\" ?\u2010) ;; Moved to backslash r to leave room for BSL-BSL ) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; farsi-translit +;; farsi-transliterate-banan +;; +;; Given a Qwerty keyboard, use Persian-to-Latin transliteration knowledge +;; to reverse transliterate in persian ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; -;;; This is a persian/farsi transliteration keyboard designed -;;; for people who: -;;; - Know how to write in farsi -;;; - Are comfortable with the qwerty keyboard -;;; - Are familiar with two letter phonetic mapping to persian characters -;;; (e.g.: gh, kh, ch, sh, zh, hh, lh) +;;; See http://www.persoarabic.org/PLPC/120036 document for more complete +;;; documentation of keyboard bindings and usage instructions. ;;; -;;; This translit keyboard is designed to be intuitive such that -;;; mapping are easy and natural to remember for a persian writer. -;;; For some persian characters there are multiple ways of inputting -;;; the same character. -;;; -;;; The letter 'h' is used for a number of two character mappings, -;;; this means that some character sequence inputs need to be repeated -;;; followed by a backspace followed by the 'h'. -;;; For example: سحر = 's' 's' '<bs>' 'h' 'h' 'r' -;;; In practice such sequences are rare. -;;; - +;; +;; ISIRI-9147 Persian keyboard is generally not well suited for Iranian-Expatriates +;; working/living in the West. +;; +;; The qwetry keyboard is usually second nature to Persian speaking expatriates and they +;; don't want to learn/adapt to ISIRI-9147. They expect software to adapt to them. +;; +;; That is what the ``Banan Multi-Character (Reverse) Transliteration Persian Input Method'' does. +;; +;; The typical profile of the user is assumed to be one who: +;; +;; - can write in farsi (not just speak it). +;; - is fully comfortable with a qwerty latin keyboard. +;; - is not familiar with isir-9147 and does not wish to be trained. +;; - communicatates and writes in a mixed globish/persian -- not pure persian. +;; - is intuitively familiar with transliteration of farsi/persian into latin based on two letter +;; phonetic mapping to persian characters (e.g., gh ق -- kh خ -- sh ش -- ch چ -- zh ژ. +;; +;; This transliteration keyboard is designed to be intuitive such that +;; mapping are easy and natural to remember for a persian writer. +;; It is designed to be equivalent in capability to farsi-isiri-9147 +;; and provide for inputing all characters enumerated in ISIRI-6219. +;; +;; farsi-transliterate-banan is of course phonetic oriented. But it is very different from +;; pinglish. Pinglish is word oriented where you sound out the word with latin letters -- +;; incuding the vowels. farsi-transliterate-banan is letter oriented where you enter the +;; latin letter/letters closest to the persian letter. And usually omit vowels. +;; +;; For some persian characters there are multiple ways of inputing +;; the same character. For example both ``i'' and ``y'' produce ی. +;; For یک ``yk'', ``y'' is more natural and for این ``ain'', ``i'' is more natural. +;; +;; The more frequently used keys are mapped to lower case. The less frequently used letter moves to +;; upper case. For example: ``s'' is س and ``S'' is ص. ``h'' is ح and ``H'' +;; is ه. +;; +;; Multi-character input is based on \, &, and / prefix +;; characters. The letter 'h' is used as a postfix for the following two character mappings: +;; gh ق -- kh خ -- sh ش -- ch چ -- zh ژ -- Th ة -- Yh ى. +;; +;; +;; Prefix letter \ is used for two character inputs when an alternate form of a letter +;; is desired for exampe \% is: ÷ when % is: ٪. +;; +;; Prefix letter & is used for multi-character inputs when special characters are +;; desired based on their abbreviate name. For example you can enter ‎ to enter the +;; ``LEFT-TO-RIGHT MARK'' character. +;; +;; Prefix letter / is used to provide two characters. / is: ``ZERO WIDTH NON-JOINER'' +;; and // is /. +;; +;; The letter 'h' is used in a number of two character postfix mappings, +;; for example ``sh'' ش. So if you need the sequence of ``s'' and ``h'' you +;; need to repeat the ``s''. For example: سحر = 's' 's' 'h' 'r'. +;; (quail-define-package - "farsi-translit" "Farsi" "پ" t + "farsi-transliterate-banan" "Farsi" "ب" t "Intuitive transliteration keyboard layout for persian/farsi. " nil t t t t nil nil nil nil nil t) (quail-define-rules - ("a" ?ا) - ("A" ?آ) ;; alef madde - ("b" ?ب) - ("p" ?پ) +;;;;;;;;;;; isiri-6219 Table 5 -- جدول ۵ - حروِفِ اصلیِ فارسی + ("W" ?ء) ;; hamzeh + ("A" ?آ) ;; U+0622 & ARABIC LETTER ALEF WITH MADDA ABOVE & الف با کلاه + ("a" ?ا) ;; U+0627 & ARABIC LETTER ALEF & الف + ("\\a" ?أ) + ("b" ?ب) ;; U+0628 & ARABIC LETTER BEH & + ("p" ?پ) ;; U+067e & ARABIC LETTER PEH & ("t" ?ت) + ("tt" ?ت) ("c" ?ث) + ("cc" ?ث) ("j" ?ج) ("ch" ?چ) - ("hh" ?ح) + ("h" ?ح) ("kh" ?خ) ("d" ?د) ("Z" ?ذ) ("r" ?ر) ("z" ?ز) + ("zz" ?ز) ("zh" ?ژ) ("s" ?س) + ("ss" ?س) ("sh" ?ش) ("S" ?ص) ("x" ?ض) ("T" ?ط) + ("TT" ?ط) ("X" ?ظ) ("w" ?ع) - ("Q" ?غ) + ("q" ?غ) ("f" ?ف) - ("q" ?ق) + ("Q" ?ق) ("gh" ?ق) ("k" ?ک) - ("K" ?ك) ;; Arabic kaf + ("kk" ?ک) ("g" ?گ) + ("gg" ?گ) ("l" ?ل) - ("lh" ?ﻻ) ("m" ?م) ("n" ?ن) ("v" ?و) - ("V" ?ؤ) ("u" ?و) + ("V" ?ؤ) ("H" ?ه) - ("h" ?ه) - ("th" ?ة) ;; ta marbuteh - ("yh" ?ۀ) ;; he ye - ("y" ?ى) - ("i" ?ي) + ("y" ?ی) + ("i" ?ی) ("I" ?ئ) + +;;;;;;;;;;; isiri-6219 Table 6 -- جدول ۶ - حروِفِ عربی + ("F" ?إ) + ("D" ?\u0671) ;; (ucs-insert #x0671)ٱ named: حرفِ الفِ وصل + ("K" ?ك) ;; Arabic kaf + ("Th" ?ة) ;; ta marbuteh + ("Y" ?ي) + ("YY" ?ي) + ("Yh" ?ى) + +;;;;;;;;;;; isiri-6219 Table 4 -- جدول ۴ - ارقام و علائم ریاضی + ("0" ?۰) ("1" ?۱) ("2" ?۲) ("3" ?۳) @@ -266,31 +409,106 @@ Based on ISIRI-9149 Layout of Persian Letters and Symbols on Computer Keyboards. ("7" ?۷) ("8" ?۸) ("9" ?۹) - ("0" ?۰) - ("F" ?إ) - ("G" ?أ) + ("\\/" ?\u066B) ;; (ucs-insert #x066B)٫ named: ممیزِ فارسی + ("\\," ?\u066C) ;; (ucs-insert #x066C)٬ named: جداکنندهی هزارهای فارسی + ("%" ?\u066A) ;; (ucs-insert #x066A)٪ named: درصدِ فارسی + ("+" ?\u002B) ;; (ucs-insert #x002B)+ named: علامتِ بهاضافه + ("-" ?\u2212) ;; (ucs-insert #x2212)− named: علامتِ منها + ("\\*" ?\u00D7) ;; (ucs-insert #x00D7)× named: علامتِ ضرب + ("\\%" ?\u007F) ;; (ucs-insert #x00F7)÷ named: علامتِ تقسیم + ("<" ?\u003C) ;; (ucs-insert #x003C)< named: علامتِ کوچکتر + ("=" ?\u003D) ;; (ucs-insert #x003D)= named: علامتِ مساوی + (">" ?\u003E) ;; (ucs-insert #x003E)> named: علامتِ بزرگتر - ("~" ?ّ) ;; tashdid ;; تشديد فارسى - ("`" ?ٓ) - ("e" ?ِ) ;; zir زير فارسى -- فتحه - ("E" ?ٍ) ;; eizan ;; دو زير فارسى -- تنوين جر - ("#" ?ً) ;; ً tanvin nasb ;; دو زبر فارسى -- تنوين نصب - ("@" ?ْ) ;; ساکن فارسى - ("^" ?َ) ;; zbar ;; زبر فارسى -- فتحه - ("o" ?ُ) ;; peesh ;; پيش فارسى -- ضمه - ("O" ?ٌ) ;; دو پيش فارسى -- تنوين رفع - ("?" ?؟) ;; alamat soal - ("&" ?ٔ) ;; همزه فارسى بالا - ("$" ?ء) ;; hamzeh - ("%" ?÷) ;; - ("*" ?×) ;; - (";" ?؛) ;; - (",h" ?،) ;; farsi - (",h" ?,) ;; latin + +;;;;;;;;;;; isiri-6219 Table 2 -- جدول ۲ - علائم نقطه گذاریِ مشترک + ;;; Space ("." ?.) ;; + (":" ?\u003A) ;; (ucs-insert #x003A): named: + ("!" ?\u0021) ;; (ucs-insert #x0021)! named: + ("\\." ?\u2026) ;; (ucs-insert #x2026)… named: + ("\\-" ?\u2010) ;; (ucs-insert #x2010)‐ named: + ("-" ?\u002D) ;; (ucs-insert #x002D)- named: + ("|" ?|) + ;;("\\\\" ?\) + ("//" ?/) + ("*" ?\u002A) ;; (ucs-insert #x002A)* named: + ("(" ?\u0028) ;; (ucs-insert #x0028)( named: + (")" ?\u0029) ;; (ucs-insert #x0029)) named: + ("[" ?\u005B) ;; (ucs-insert #x005B)[ named: + ("[" ?\u005D) ;; (ucs-insert #x005D)] named: + ("{" ?\u007B) ;; (ucs-insert #x007B){ named: + ("}" ?\u007D) ;; (ucs-insert #x007D)} named: + ("\\<" ?\u00AB) ;; (ucs-insert #x00AB)« named: + ("\\>" ?\u00BB) ;; (ucs-insert #x00BB)» named: + + +;;;;;;;;;;; isiri-6219 Table 3 -- جدول ۳ - علائم نقطه گذاریِ فارسی + ("," ?،) ;; farsi + (";" ?؛) ;; + ("?" ?؟) ;; alamat soal ("_" ?ـ) ;; -) +;;;;;;;;;;; isiri-6219 Table 1 -- جدول ۱ - نویسههای کنترلی + ;; LF + ;; CR + ("‌" ?\u200C) ;; (ucs-insert #x200C) named: فاصلهی مجازی + ("/" ?\u200C) ;; + ("‍" ?\u200D) ;; (ucs-insert #x200D) named: اتصالِ مجازی + ("J" ?\u200D) ;; + ("‎" ?\u200E) ;; (ucs-insert #x200E) named: نشانهی چپبهراست + ("‏" ?\u200F) ;; (ucs-insert #x200F) named: نشانهی راستبهچپ + ("&ls;" ?\u2028) ;; (ucs-insert #x2028)
named: جداکنندهی سطرها + ("&ps;" ?\u2028) ;; (ucs-insert #x2029)
named: جداکنندهی بندها + ("&lre;" ?\u202A) ;; (ucs-insert #x202A) named: زیرمتنِ چپبهراست + ("&rle;" ?\u202B) ;; (ucs-insert #x202B) named: زیرمتنِ راستبهچپ + ("&pdf;" ?\u202C) ;; (ucs-insert #x202C) named: پایانِ زیرمتن + ("&lro;" ?\u202D) ;; (ucs-insert #x202D) named: زیرمتنِ اکیداً چپبهراست + ("&rlo;" ?\u202D) ;; (ucs-insert #x202E) named: زیرمتنِ اکیداً راستبهچپ + ("&bom;" ?\uFEFF) ;; (ucs-insert #xFEFF) named: نشانهی ترتیبِ بایتها + + +;;;;;;;;;;; isiri-6219 Table 7 -- جدول ۷ - نشانههایِ فارسی + ("^" ?َ) ;; zbar ;; زبر فارسى + ("e" ?ِ) ;; zir زير فارسى + ("o" ?ُ) ;; peesh ;; پيش فارسى -- ضمه + ("E" ?ٍ) ;; eizan ;; دو زير فارسى -- تنوين جر + ("#" ?ً) ;; دو زبر + ("O" ?ٌ) ;; دو پيش فارسى -- تنوين رفع + ("~" ?ّ) ;; tashdid ;; تشديد فارسى + ("@" ?ْ) ;; ساکن فارسى + ("U" ?\u0653) ;; (ucs-insert #x0653)ٓ named: مدِ فارسی + ("`" ?ٔ) ;; همزه فارسى بالا + ("C" ?\u0655) ;; (ucs-insert #x0655)ٕ named: همزه فارسى پایین + ("$" ?\u0670) ;; (ucs-insert #x0670)ٰ named: الفِ مقصورهی فارسی + + +;;;;;;;;;;; isiri-6219 Table 8 - Forbiden Characters -- جدول ۸ - نویسههایِ ممنوع +;; ;; he ye (ucs-insert 1728) kills emacs-24.0.90 +;; arabic digits 0-9 + + +;;;;;;; Latin Extensions + ("\\" ?\\) ;; خط اريب وارو + ("\\\\" ?\\) + ("\\~" ?~) + ("\\@" ?@) + ("\\#" ?#) + ("\\$" ?\uFDFC) ;; (ucs-insert #xFDFC)﷼ named: + ("\\^" ?^) + ("\\1" ?1) + ("\\2" ?2) + ("\\3" ?3) + ("\\4" ?4) + ("\\5" ?5) + ("\\6" ?6) + ("\\7" ?7) + ("\\8" ?8) + ("\\9" ?9) + ("\\0" ?0) + +) + ;;; persian.el ends here |