Grammalecte  Hex Artifact Content

Artifact ea10b9481e653e533546a117eb6e1727b4122047f15986e7c970cabcacb81944:


0000: 2f 2f 2f 2f 20 47 52 41 4d 4d 41 52 20 43 48 45  //// GRAMMAR CHE
0010: 43 4b 49 4e 47 20 45 4e 47 49 4e 45 20 50 4c 55  CKING ENGINE PLU
0020: 47 49 4e 3a 20 53 75 67 67 65 73 74 69 6f 6e 20  GIN: Suggestion 
0030: 6d 65 63 68 61 6e 69 73 6d 73 0a 0a 63 6f 6e 73  mechanisms..cons
0040: 74 20 63 6f 6e 6a 20 3d 20 72 65 71 75 69 72 65  t conj = require
0050: 28 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61  ("resource://gra
0060: 6d 6d 61 6c 65 63 74 65 2f 66 72 2f 63 6f 6e 6a  mmalecte/fr/conj
0070: 2e 6a 73 22 29 3b 0a 63 6f 6e 73 74 20 6d 66 73  .js");.const mfs
0080: 70 20 3d 20 72 65 71 75 69 72 65 28 22 72 65 73  p = require("res
0090: 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65  ource://grammale
00a0: 63 74 65 2f 66 72 2f 6d 66 73 70 2e 6a 73 22 29  cte/fr/mfsp.js")
00b0: 3b 0a 63 6f 6e 73 74 20 70 68 6f 6e 65 74 20 3d  ;.const phonet =
00c0: 20 72 65 71 75 69 72 65 28 22 72 65 73 6f 75 72   require("resour
00d0: 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65  ce://grammalecte
00e0: 2f 66 72 2f 70 68 6f 6e 65 74 2e 6a 73 22 29 3b  /fr/phonet.js");
00f0: 0a 0a 0a 2f 2f 2f 2f 20 76 65 72 62 73 0a 0a 66  ...//// verbs..f
0100: 75 6e 63 74 69 6f 6e 20 73 75 67 67 56 65 72 62  unction suggVerb
0110: 20 28 73 46 6c 65 78 2c 20 73 57 68 6f 2c 20 66   (sFlex, sWho, f
0120: 75 6e 63 53 75 67 67 32 3d 6e 75 6c 6c 29 20 7b  uncSugg2=null) {
0130: 0a 20 20 20 20 2f 2f 20 77 65 20 64 6f 6e e2 80  .    // we don..
0140: 99 74 20 63 68 65 63 6b 20 69 66 20 77 6f 72 64  .t check if word
0150: 20 65 78 69 73 74 73 20 69 6e 20 5f 64 41 6e 61   exists in _dAna
0160: 6c 79 73 65 73 2c 20 66 6f 72 20 69 74 20 69 73  lyses, for it is
0170: 20 61 73 73 75 6d 65 64 20 69 74 20 68 61 73 20   assumed it has 
0180: 62 65 65 6e 20 64 6f 6e 65 20 62 65 66 6f 72 65  been done before
0190: 0a 20 20 20 20 6c 65 74 20 61 53 75 67 67 20 3d  .    let aSugg =
01a0: 20 6e 65 77 20 53 65 74 28 29 3b 0a 20 20 20 20   new Set();.    
01b0: 66 6f 72 20 28 6c 65 74 20 73 53 74 65 6d 20 6f  for (let sStem o
01c0: 66 20 73 74 65 6d 28 73 46 6c 65 78 29 29 20 7b  f stem(sFlex)) {
01d0: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 74 54 61  .        let tTa
01e0: 67 73 20 3d 20 63 6f 6e 6a 2e 5f 67 65 74 54 61  gs = conj._getTa
01f0: 67 73 28 73 53 74 65 6d 29 3b 0a 20 20 20 20 20  gs(sStem);.     
0200: 20 20 20 69 66 20 28 74 54 61 67 73 29 20 7b 0a     if (tTags) {.
0210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 77              // w
0220: 65 20 67 65 74 20 74 68 65 20 74 65 6e 73 65 0a  e get the tense.
0230: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
0240: 61 54 65 6e 73 65 20 3d 20 6e 65 77 20 53 65 74  aTense = new Set
0250: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
0260: 66 6f 72 20 28 6c 65 74 20 73 4d 6f 72 70 68 20  for (let sMorph 
0270: 6f 66 20 5f 64 41 6e 61 6c 79 73 65 73 2e 5f 67  of _dAnalyses._g
0280: 65 74 28 73 46 6c 65 78 2c 20 5b 5d 29 29 20 7b  et(sFlex, [])) {
0290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
02a0: 20 6c 65 74 20 6d 3b 0a 20 20 20 20 20 20 20 20   let m;.        
02b0: 20 20 20 20 20 20 20 20 6c 65 74 20 7a 56 65 72          let zVer
02c0: 62 20 3d 20 6e 65 77 20 52 65 67 45 78 70 20 28  b = new RegExp (
02d0: 73 53 74 65 6d 2b 22 20 2e 2a 3f 28 3a 28 3f 3a  sStem+" .*?(:(?:
02e0: 59 7c 49 5b 70 71 73 66 5d 7c 53 5b 70 71 5d 7c  Y|I[pqsf]|S[pq]|
02f0: 4b 29 29 22 2c 20 22 67 22 29 3b 0a 20 20 20 20  K))", "g");.    
0300: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
0310: 65 20 28 6d 20 3d 20 7a 56 65 72 62 2e 65 78 65  e (m = zVerb.exe
0320: 63 28 73 4d 6f 72 70 68 29 29 20 7b 0a 20 20 20  c(sMorph)) {.   
0330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0340: 20 2f 2f 20 73 74 65 6d 20 6d 75 73 74 20 62 65   // stem must be
0350: 20 75 73 65 64 20 69 6e 20 72 65 67 65 78 20 74   used in regex t
0360: 6f 20 70 72 65 76 65 6e 74 20 63 6f 6e 66 75 73  o prevent confus
0370: 69 6f 6e 20 62 65 74 77 65 65 6e 20 64 69 66 66  ion between diff
0380: 65 72 65 6e 74 20 76 65 72 62 73 20 28 65 2e 67  erent verbs (e.g
0390: 2e 20 73 61 75 72 61 73 20 68 61 73 20 32 20 73  . sauras has 2 s
03a0: 74 65 6d 73 3a 20 73 61 76 6f 69 72 20 61 6e 64  tems: savoir and
03b0: 20 73 61 75 72 65 72 29 0a 20 20 20 20 20 20 20   saurer).       
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
03d0: 28 6d 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  (m) {.          
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
03f0: 20 28 6d 5b 31 5d 20 3d 3d 3d 20 22 3a 59 22 29   (m[1] === ":Y")
0400: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0420: 54 65 6e 73 65 2e 61 64 64 28 22 3a 49 70 22 29  Tense.add(":Ip")
0430: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 54                aT
0450: 65 6e 73 65 2e 61 64 64 28 22 3a 49 71 22 29 3b  ense.add(":Iq");
0460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 54 65               aTe
0480: 6e 73 65 2e 61 64 64 28 22 3a 49 73 22 29 3b 0a  nse.add(":Is");.
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69          } else i
04b0: 66 20 28 6d 5b 31 5d 20 3d 3d 3d 20 22 3a 50 22  f (m[1] === ":P"
04c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04e0: 61 54 65 6e 73 65 2e 61 64 64 28 22 3a 49 70 22  aTense.add(":Ip"
04f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
0500: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
0510: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
0520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0530: 61 54 65 6e 73 65 2e 61 64 64 28 6d 5b 31 5d 29  aTense.add(m[1])
0540: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0550: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
0560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0570: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
0580: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
0590: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  }.            fo
05a0: 72 20 28 6c 65 74 20 73 54 65 6e 73 65 20 6f 66  r (let sTense of
05b0: 20 61 54 65 6e 73 65 29 20 7b 0a 20 20 20 20 20   aTense) {.     
05c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
05d0: 57 68 6f 20 3d 3d 3d 20 22 3a 31 c5 9b 22 20 26  Who === ":1.." &
05e0: 26 20 21 63 6f 6e 6a 2e 5f 68 61 73 43 6f 6e 6a  & !conj._hasConj
05f0: 57 69 74 68 54 61 67 73 28 74 54 61 67 73 2c 20  WithTags(tTags, 
0600: 73 54 65 6e 73 65 2c 20 22 3a 31 c5 9b 22 29 29  sTense, ":1.."))
0610: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0620: 20 20 20 20 20 20 20 73 57 68 6f 20 3d 20 22 3a         sWho = ":
0630: 31 73 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1s";.           
0640: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
0650: 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 6a 2e         if (conj.
0660: 5f 68 61 73 43 6f 6e 6a 57 69 74 68 54 61 67 73  _hasConjWithTags
0670: 28 74 54 61 67 73 2c 20 73 54 65 6e 73 65 2c 20  (tTags, sTense, 
0680: 73 57 68 6f 29 29 20 7b 0a 20 20 20 20 20 20 20  sWho)) {.       
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75               aSu
06a0: 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67 65 74  gg.add(conj._get
06b0: 43 6f 6e 6a 57 69 74 68 54 61 67 73 28 73 53 74  ConjWithTags(sSt
06c0: 65 6d 2c 20 74 54 61 67 73 2c 20 73 54 65 6e 73  em, tTags, sTens
06d0: 65 2c 20 73 57 68 6f 29 29 3b 0a 20 20 20 20 20  e, sWho));.     
06e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
06f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
0700: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
0710: 66 20 28 66 75 6e 63 53 75 67 67 32 29 20 7b 0a  f (funcSugg2) {.
0720: 20 20 20 20 20 20 20 20 6c 65 74 20 61 53 75 67          let aSug
0730: 67 32 20 3d 20 66 75 6e 63 53 75 67 67 32 28 73  g2 = funcSugg2(s
0740: 46 6c 65 78 29 3b 0a 20 20 20 20 20 20 20 20 69  Flex);.        i
0750: 66 20 28 61 53 75 67 67 32 2e 73 69 7a 65 20 3e  f (aSugg2.size >
0760: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
0770: 20 20 61 53 75 67 67 2e 61 64 64 28 61 53 75 67    aSugg.add(aSug
0780: 67 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  g2);.        }. 
0790: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 53 75     }.    if (aSu
07a0: 67 67 2e 73 69 7a 65 20 3e 20 30 29 20 7b 0a 20  gg.size > 0) {. 
07b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 41 72         return Ar
07c0: 72 61 79 2e 66 72 6f 6d 28 61 53 75 67 67 29 2e  ray.from(aSugg).
07d0: 6a 6f 69 6e 28 22 7c 22 29 3b 0a 20 20 20 20 7d  join("|");.    }
07e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 3b 0a  .    return "";.
07f0: 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 73 75 67 67  }..function sugg
0800: 56 65 72 62 50 70 61 73 20 28 73 46 6c 65 78 2c  VerbPpas (sFlex,
0810: 20 73 57 68 61 74 3d 6e 75 6c 6c 29 20 7b 0a 20   sWhat=null) {. 
0820: 20 20 20 6c 65 74 20 61 53 75 67 67 20 3d 20 6e     let aSugg = n
0830: 65 77 20 53 65 74 28 29 3b 0a 20 20 20 20 66 6f  ew Set();.    fo
0840: 72 20 28 6c 65 74 20 73 53 74 65 6d 20 6f 66 20  r (let sStem of 
0850: 73 74 65 6d 28 73 46 6c 65 78 29 29 20 7b 0a 20  stem(sFlex)) {. 
0860: 20 20 20 20 20 20 20 6c 65 74 20 74 54 61 67 73         let tTags
0870: 20 3d 20 63 6f 6e 6a 2e 5f 67 65 74 54 61 67 73   = conj._getTags
0880: 28 73 53 74 65 6d 29 3b 0a 20 20 20 20 20 20 20  (sStem);.       
0890: 20 69 66 20 28 74 54 61 67 73 29 20 7b 0a 20 20   if (tTags) {.  
08a0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73            if (!s
08b0: 57 68 61 74 29 20 7b 0a 20 20 20 20 20 20 20 20  What) {.        
08c0: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
08d0: 64 28 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57  d(conj._getConjW
08e0: 69 74 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74  ithTags(sStem, t
08f0: 54 61 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51  Tags, ":PQ", ":Q
0900: 31 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  1"));.          
0910: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
0920: 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74  conj._getConjWit
0930: 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74 54 61  hTags(sStem, tTa
0940: 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51 32 22  gs, ":PQ", ":Q2"
0950: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
0960: 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f      aSugg.add(co
0970: 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74 68 54  nj._getConjWithT
0980: 61 67 73 28 73 53 74 65 6d 2c 20 74 54 61 67 73  ags(sStem, tTags
0990: 2c 20 22 3a 50 51 22 2c 20 22 3a 51 33 22 29 29  , ":PQ", ":Q3"))
09a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
09b0: 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f 6e 6a    aSugg.add(conj
09c0: 2e 5f 67 65 74 43 6f 6e 6a 57 69 74 68 54 61 67  ._getConjWithTag
09d0: 73 28 73 53 74 65 6d 2c 20 74 54 61 67 73 2c 20  s(sStem, tTags, 
09e0: 22 3a 50 51 22 2c 20 22 3a 51 34 22 29 29 3b 0a  ":PQ", ":Q4"));.
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 61 53 75 67 67 2e 64 65 6c 65 74 65 28 22 22 29  aSugg.delete("")
0a10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
0a20: 65 6c 73 65 20 69 66 20 28 73 57 68 61 74 20 3d  else if (sWhat =
0a30: 3d 3d 20 22 3a 6d 3a 73 22 29 20 7b 0a 20 20 20  == ":m:s") {.   
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75               aSu
0a50: 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67 65 74  gg.add(conj._get
0a60: 43 6f 6e 6a 57 69 74 68 54 61 67 73 28 73 53 74  ConjWithTags(sSt
0a70: 65 6d 2c 20 74 54 61 67 73 2c 20 22 3a 50 51 22  em, tTags, ":PQ"
0a80: 2c 20 22 3a 51 31 22 29 29 3b 0a 20 20 20 20 20  , ":Q1"));.     
0a90: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66         } else if
0aa0: 20 28 73 57 68 61 74 20 3d 3d 3d 20 22 3a 6d 3a   (sWhat === ":m:
0ab0: 70 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  p") {.          
0ac0: 20 20 20 20 20 20 69 66 20 28 63 6f 6e 6a 2e 5f        if (conj._
0ad0: 68 61 73 43 6f 6e 6a 57 69 74 68 54 61 67 73 28  hasConjWithTags(
0ae0: 74 54 61 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a  tTags, ":PQ", ":
0af0: 51 32 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  Q2")) {.        
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67              aSug
0b10: 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67 65 74 43  g.add(conj._getC
0b20: 6f 6e 6a 57 69 74 68 54 61 67 73 28 73 53 74 65  onjWithTags(sSte
0b30: 6d 2c 20 74 54 61 67 73 2c 20 22 3a 50 51 22 2c  m, tTags, ":PQ",
0b40: 20 22 3a 51 32 22 29 29 3b 0a 20 20 20 20 20 20   ":Q2"));.      
0b50: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
0b60: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0b70: 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64         aSugg.add
0b80: 28 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69  (conj._getConjWi
0b90: 74 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74 54  thTags(sStem, tT
0ba0: 61 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51 31  ags, ":PQ", ":Q1
0bb0: 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "));.           
0bc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
0bd0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 57     } else if (sW
0be0: 68 61 74 20 3d 3d 3d 20 22 3a 66 3a 73 22 29 20  hat === ":f:s") 
0bf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0c00: 20 20 69 66 20 28 63 6f 6e 6a 2e 5f 68 61 73 43    if (conj._hasC
0c10: 6f 6e 6a 57 69 74 68 54 61 67 73 28 74 54 61 67  onjWithTags(tTag
0c20: 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51 33 22 29  s, ":PQ", ":Q3")
0c30: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0c40: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
0c50: 64 28 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57  d(conj._getConjW
0c60: 69 74 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74  ithTags(sStem, t
0c70: 54 61 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51  Tags, ":PQ", ":Q
0c80: 33 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  3"));.          
0c90: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f 6e     aSugg.add(con
0cc0: 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74 68 54 61  j._getConjWithTa
0cd0: 67 73 28 73 53 74 65 6d 2c 20 74 54 61 67 73 2c  gs(sStem, tTags,
0ce0: 20 22 3a 50 51 22 2c 20 22 3a 51 31 22 29 29 3b   ":PQ", ":Q1"));
0cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0d00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
0d10: 20 65 6c 73 65 20 69 66 20 28 73 57 68 61 74 20   else if (sWhat 
0d20: 3d 3d 3d 20 22 3a 66 3a 70 22 29 20 7b 0a 20 20  === ":f:p") {.  
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
0d40: 20 28 63 6f 6e 6a 2e 5f 68 61 73 43 6f 6e 6a 57   (conj._hasConjW
0d50: 69 74 68 54 61 67 73 28 74 54 61 67 73 2c 20 22  ithTags(tTags, "
0d60: 3a 50 51 22 2c 20 22 3a 51 34 22 29 29 20 7b 0a  :PQ", ":Q4")) {.
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f      aSugg.add(co
0d90: 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74 68 54  nj._getConjWithT
0da0: 61 67 73 28 73 53 74 65 6d 2c 20 74 54 61 67 73  ags(sStem, tTags
0db0: 2c 20 22 3a 50 51 22 2c 20 22 3a 51 34 22 29 29  , ":PQ", ":Q4"))
0dc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0dd0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0df0: 53 75 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67  Sugg.add(conj._g
0e00: 65 74 43 6f 6e 6a 57 69 74 68 54 61 67 73 28 73  etConjWithTags(s
0e10: 53 74 65 6d 2c 20 74 54 61 67 73 2c 20 22 3a 50  Stem, tTags, ":P
0e20: 51 22 2c 20 22 3a 51 31 22 29 29 3b 0a 20 20 20  Q", ":Q1"));.   
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
0e40: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
0e50: 65 20 69 66 20 28 73 57 68 61 74 20 3d 3d 3d 20  e if (sWhat === 
0e60: 22 3a 73 22 29 20 7b 0a 20 20 20 20 20 20 20 20  ":s") {.        
0e70: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
0e80: 64 28 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57  d(conj._getConjW
0e90: 69 74 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74  ithTags(sStem, t
0ea0: 54 61 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51  Tags, ":PQ", ":Q
0eb0: 31 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  1"));.          
0ec0: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
0ed0: 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57 69 74  conj._getConjWit
0ee0: 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74 54 61  hTags(sStem, tTa
0ef0: 67 73 2c 20 22 3a 50 51 22 2c 20 22 3a 51 33 22  gs, ":PQ", ":Q3"
0f00: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
0f10: 20 20 20 20 61 53 75 67 67 2e 64 65 6c 65 74 65      aSugg.delete
0f20: 28 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ("");.          
0f30: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 57 68    } else if (sWh
0f40: 61 74 20 3d 3d 3d 20 22 3a 70 22 29 20 7b 0a 20  at === ":p") {. 
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0f60: 53 75 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67  Sugg.add(conj._g
0f70: 65 74 43 6f 6e 6a 57 69 74 68 54 61 67 73 28 73  etConjWithTags(s
0f80: 53 74 65 6d 2c 20 74 54 61 67 73 2c 20 22 3a 50  Stem, tTags, ":P
0f90: 51 22 2c 20 22 3a 51 32 22 29 29 3b 0a 20 20 20  Q", ":Q2"));.   
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75               aSu
0fb0: 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67 65 74  gg.add(conj._get
0fc0: 43 6f 6e 6a 57 69 74 68 54 61 67 73 28 73 53 74  ConjWithTags(sSt
0fd0: 65 6d 2c 20 74 54 61 67 73 2c 20 22 3a 50 51 22  em, tTags, ":PQ"
0fe0: 2c 20 22 3a 51 34 22 29 29 3b 0a 20 20 20 20 20  , ":Q4"));.     
0ff0: 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67             aSugg
1000: 2e 64 65 6c 65 74 65 28 22 22 29 3b 0a 20 20 20  .delete("");.   
1010: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1020: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1030: 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f 6e 6a    aSugg.add(conj
1040: 2e 5f 67 65 74 43 6f 6e 6a 57 69 74 68 54 61 67  ._getConjWithTag
1050: 73 28 73 53 74 65 6d 2c 20 74 54 61 67 73 2c 20  s(sStem, tTags, 
1060: 22 3a 50 51 22 2c 20 22 3a 51 31 22 29 29 3b 0a  ":PQ", ":Q1"));.
1070: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1090: 20 20 69 66 20 28 61 53 75 67 67 2e 73 69 7a 65    if (aSugg.size
10a0: 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20   > 0) {.        
10b0: 72 65 74 75 72 6e 20 41 72 72 61 79 2e 66 72 6f  return Array.fro
10c0: 6d 28 61 53 75 67 67 29 2e 6a 6f 69 6e 28 22 7c  m(aSugg).join("|
10d0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ");.    }.    re
10e0: 74 75 72 6e 20 22 22 3b 0a 7d 0a 0a 66 75 6e 63  turn "";.}..func
10f0: 74 69 6f 6e 20 73 75 67 67 56 65 72 62 54 65 6e  tion suggVerbTen
1100: 73 65 20 28 73 46 6c 65 78 2c 20 73 54 65 6e 73  se (sFlex, sTens
1110: 65 2c 20 73 57 68 6f 29 20 7b 0a 20 20 20 20 6c  e, sWho) {.    l
1120: 65 74 20 61 53 75 67 67 20 3d 20 6e 65 77 20 53  et aSugg = new S
1130: 65 74 28 29 3b 0a 20 20 20 20 66 6f 72 20 28 6c  et();.    for (l
1140: 65 74 20 73 53 74 65 6d 20 6f 66 20 73 74 65 6d  et sStem of stem
1150: 28 73 46 6c 65 78 29 29 20 7b 0a 20 20 20 20 20  (sFlex)) {.     
1160: 20 20 20 69 66 20 28 63 6f 6e 6a 2e 68 61 73 43     if (conj.hasC
1170: 6f 6e 6a 28 73 53 74 65 6d 2c 20 73 54 65 6e 73  onj(sStem, sTens
1180: 65 2c 20 73 57 68 6f 29 29 20 7b 0a 20 20 20 20  e, sWho)) {.    
1190: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
11a0: 64 28 63 6f 6e 6a 2e 67 65 74 43 6f 6e 6a 28 73  d(conj.getConj(s
11b0: 53 74 65 6d 2c 20 73 54 65 6e 73 65 2c 20 73 57  Stem, sTense, sW
11c0: 68 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ho));.        }.
11d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 53      }.    if (aS
11e0: 75 67 67 2e 73 69 7a 65 20 3e 20 30 29 20 7b 0a  ugg.size > 0) {.
11f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 41          return A
1200: 72 72 61 79 2e 66 72 6f 6d 28 61 53 75 67 67 29  rray.from(aSugg)
1210: 2e 6a 6f 69 6e 28 22 7c 22 29 3b 0a 20 20 20 20  .join("|");.    
1220: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 3b  }.    return "";
1230: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 73 75 67  .}..function sug
1240: 67 56 65 72 62 49 6d 70 65 20 28 73 46 6c 65 78  gVerbImpe (sFlex
1250: 29 20 7b 0a 20 20 20 20 6c 65 74 20 61 53 75 67  ) {.    let aSug
1260: 67 20 3d 20 6e 65 77 20 53 65 74 28 29 3b 0a 20  g = new Set();. 
1270: 20 20 20 66 6f 72 20 28 6c 65 74 20 73 53 74 65     for (let sSte
1280: 6d 20 6f 66 20 73 74 65 6d 28 73 46 6c 65 78 29  m of stem(sFlex)
1290: 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ) {.        let 
12a0: 74 54 61 67 73 20 3d 20 63 6f 6e 6a 2e 5f 67 65  tTags = conj._ge
12b0: 74 54 61 67 73 28 73 53 74 65 6d 29 3b 0a 20 20  tTags(sStem);.  
12c0: 20 20 20 20 20 20 69 66 20 28 74 54 61 67 73 29        if (tTags)
12d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
12e0: 66 20 28 63 6f 6e 6a 2e 5f 68 61 73 43 6f 6e 6a  f (conj._hasConj
12f0: 57 69 74 68 54 61 67 73 28 74 54 61 67 73 2c 20  WithTags(tTags, 
1300: 22 3a 45 22 2c 20 22 3a 32 73 22 29 29 20 7b 0a  ":E", ":2s")) {.
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 61 53 75 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f  aSugg.add(conj._
1330: 67 65 74 43 6f 6e 6a 57 69 74 68 54 61 67 73 28  getConjWithTags(
1340: 73 53 74 65 6d 2c 20 74 54 61 67 73 2c 20 22 3a  sStem, tTags, ":
1350: 45 22 2c 20 22 3a 32 73 22 29 29 3b 0a 20 20 20  E", ":2s"));.   
1360: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1370: 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 6a 2e         if (conj.
1380: 5f 68 61 73 43 6f 6e 6a 57 69 74 68 54 61 67 73  _hasConjWithTags
1390: 28 74 54 61 67 73 2c 20 22 3a 45 22 2c 20 22 3a  (tTags, ":E", ":
13a0: 31 70 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  1p")) {.        
13b0: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
13c0: 64 28 63 6f 6e 6a 2e 5f 67 65 74 43 6f 6e 6a 57  d(conj._getConjW
13d0: 69 74 68 54 61 67 73 28 73 53 74 65 6d 2c 20 74  ithTags(sStem, t
13e0: 54 61 67 73 2c 20 22 3a 45 22 2c 20 22 3a 31 70  Tags, ":E", ":1p
13f0: 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "));.           
1400: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
1410: 66 20 28 63 6f 6e 6a 2e 5f 68 61 73 43 6f 6e 6a  f (conj._hasConj
1420: 57 69 74 68 54 61 67 73 28 74 54 61 67 73 2c 20  WithTags(tTags, 
1430: 22 3a 45 22 2c 20 22 3a 32 70 22 29 29 20 7b 0a  ":E", ":2p")) {.
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 61 53 75 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f  aSugg.add(conj._
1460: 67 65 74 43 6f 6e 6a 57 69 74 68 54 61 67 73 28  getConjWithTags(
1470: 73 53 74 65 6d 2c 20 74 54 61 67 73 2c 20 22 3a  sStem, tTags, ":
1480: 45 22 2c 20 22 3a 32 70 22 29 29 3b 0a 20 20 20  E", ":2p"));.   
1490: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
14b0: 66 20 28 61 53 75 67 67 2e 73 69 7a 65 20 3e 20  f (aSugg.size > 
14c0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0) {.        ret
14d0: 75 72 6e 20 41 72 72 61 79 2e 66 72 6f 6d 28 61  urn Array.from(a
14e0: 53 75 67 67 29 2e 6a 6f 69 6e 28 22 7c 22 29 3b  Sugg).join("|");
14f0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1500: 6e 20 22 22 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  n "";.}..functio
1510: 6e 20 73 75 67 67 56 65 72 62 49 6e 66 69 20 28  n suggVerbInfi (
1520: 73 46 6c 65 78 29 20 7b 0a 20 20 20 20 2f 2f 72  sFlex) {.    //r
1530: 65 74 75 72 6e 20 73 74 65 6d 28 73 46 6c 65 78  eturn stem(sFlex
1540: 29 2e 6a 6f 69 6e 28 22 7c 22 29 3b 0a 20 20 20  ).join("|");.   
1550: 20 72 65 74 75 72 6e 20 5b 20 66 6f 72 20 28 73   return [ for (s
1560: 53 74 65 6d 20 6f 66 20 73 74 65 6d 28 73 46 6c  Stem of stem(sFl
1570: 65 78 29 29 20 69 66 20 28 63 6f 6e 6a 2e 69 73  ex)) if (conj.is
1580: 56 65 72 62 28 73 53 74 65 6d 29 29 20 73 53 74  Verb(sStem)) sSt
1590: 65 6d 20 5d 2e 6a 6f 69 6e 28 22 7c 22 29 3b 0a  em ].join("|");.
15a0: 7d 0a 0a 0a 63 6f 6e 73 74 20 5f 64 51 75 69 45  }...const _dQuiE
15b0: 73 74 20 3d 20 6e 65 77 20 4d 61 70 20 28 5b 0a  st = new Map ([.
15c0: 20 20 20 20 5b 22 6a 65 22 2c 20 22 3a 31 73 22      ["je", ":1s"
15d0: 5d 2c 20 5b 22 6a e2 80 99 22 2c 20 22 3a 31 73  ], ["j...", ":1s
15e0: 22 5d 2c 20 5b 22 6a e2 80 99 65 6e 22 2c 20 22  "], ["j...en", "
15f0: 3a 31 73 22 5d 2c 20 5b 22 6a e2 80 99 79 22 2c  :1s"], ["j...y",
1600: 20 22 3a 31 73 22 5d 2c 0a 20 20 20 20 5b 22 74   ":1s"],.    ["t
1610: 75 22 2c 20 22 3a 32 73 22 5d 2c 20 5b 22 69 6c  u", ":2s"], ["il
1620: 22 2c 20 22 3a 33 73 22 5d 2c 20 5b 22 6f 6e 22  ", ":3s"], ["on"
1630: 2c 20 22 3a 33 73 22 5d 2c 20 5b 22 65 6c 6c 65  , ":3s"], ["elle
1640: 22 2c 20 22 3a 33 73 22 5d 2c 0a 20 20 20 20 5b  ", ":3s"],.    [
1650: 22 6e 6f 75 73 22 2c 20 22 3a 31 70 22 5d 2c 20  "nous", ":1p"], 
1660: 5b 22 76 6f 75 73 22 2c 20 22 3a 32 70 22 5d 2c  ["vous", ":2p"],
1670: 20 5b 22 69 6c 73 22 2c 20 22 3a 33 70 22 5d 2c   ["ils", ":3p"],
1680: 20 5b 22 65 6c 6c 65 73 22 2c 20 22 3a 33 70 22   ["elles", ":3p"
1690: 5d 0a 5d 29 3b 0a 63 6f 6e 73 74 20 5f 6c 49 6e  ].]);.const _lIn
16a0: 64 69 63 61 74 69 66 20 3d 20 5b 22 3a 49 70 22  dicatif = [":Ip"
16b0: 2c 20 22 3a 49 71 22 2c 20 22 3a 49 73 22 2c 20  , ":Iq", ":Is", 
16c0: 22 3a 49 66 22 5d 3b 0a 63 6f 6e 73 74 20 5f 6c  ":If"];.const _l
16d0: 53 75 62 6a 6f 6e 63 74 69 66 20 3d 20 5b 22 3a  Subjonctif = [":
16e0: 53 70 22 2c 20 22 3a 53 71 22 5d 3b 0a 0a 66 75  Sp", ":Sq"];..fu
16f0: 6e 63 74 69 6f 6e 20 73 75 67 67 56 65 72 62 4d  nction suggVerbM
1700: 6f 64 65 20 28 73 46 6c 65 78 2c 20 63 4d 6f 64  ode (sFlex, cMod
1710: 65 2c 20 73 53 75 6a 29 20 7b 0a 20 20 20 20 6c  e, sSuj) {.    l
1720: 65 74 20 6c 4d 6f 64 65 3b 0a 20 20 20 20 69 66  et lMode;.    if
1730: 20 28 63 4d 6f 64 65 20 3d 3d 20 22 3a 49 22 29   (cMode == ":I")
1740: 20 7b 0a 20 20 20 20 20 20 20 20 6c 4d 6f 64 65   {.        lMode
1750: 20 3d 20 5f 6c 49 6e 64 69 63 61 74 69 66 3b 0a   = _lIndicatif;.
1760: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
1770: 4d 6f 64 65 20 3d 3d 20 22 3a 53 22 29 20 7b 0a  Mode == ":S") {.
1780: 20 20 20 20 20 20 20 20 6c 4d 6f 64 65 20 3d 20          lMode = 
1790: 5f 6c 53 75 62 6a 6f 6e 63 74 69 66 3b 0a 20 20  _lSubjonctif;.  
17a0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 4d 6f    } else if (cMo
17b0: 64 65 2e 73 74 61 72 74 73 57 69 74 68 28 22 3a  de.startsWith(":
17c0: 49 22 29 20 7c 7c 20 63 4d 6f 64 65 2e 73 74 61  I") || cMode.sta
17d0: 72 74 73 57 69 74 68 28 22 3a 53 22 29 29 20 7b  rtsWith(":S")) {
17e0: 0a 20 20 20 20 20 20 20 20 6c 4d 6f 64 65 20 3d  .        lMode =
17f0: 20 5b 63 4d 6f 64 65 5d 3b 0a 20 20 20 20 7d 20   [cMode];.    } 
1800: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 72  else {.        r
1810: 65 74 75 72 6e 20 22 22 3b 0a 20 20 20 20 7d 0a  eturn "";.    }.
1820: 20 20 20 20 6c 65 74 20 73 57 68 6f 20 3d 20 5f      let sWho = _
1830: 64 51 75 69 45 73 74 2e 5f 67 65 74 28 73 53 75  dQuiEst._get(sSu
1840: 6a 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 2c  j.toLowerCase(),
1850: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 20 28   null);.    if (
1860: 21 73 57 68 6f 29 20 7b 0a 20 20 20 20 20 20 20  !sWho) {.       
1870: 20 69 66 20 28 73 53 75 6a 5b 30 5d 2e 5f 69 73   if (sSuj[0]._is
1880: 4c 6f 77 65 72 43 61 73 65 28 29 29 20 7b 20 2f  LowerCase()) { /
1890: 2f 20 70 61 73 20 75 6e 20 70 72 6f 6e 6f 6d 2c  / pas un pronom,
18a0: 20 6e 69 20 75 6e 20 6e 6f 6d 20 70 72 6f 70 72   ni un nom propr
18b0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  e.            re
18c0: 74 75 72 6e 20 22 22 3b 0a 20 20 20 20 20 20 20  turn "";.       
18d0: 20 7d 0a 20 20 20 20 20 20 20 20 73 57 68 6f 20   }.        sWho 
18e0: 3d 20 22 3a 33 73 22 3b 0a 20 20 20 20 7d 0a 20  = ":3s";.    }. 
18f0: 20 20 20 6c 65 74 20 61 53 75 67 67 20 3d 20 6e     let aSugg = n
1900: 65 77 20 53 65 74 28 29 3b 0a 20 20 20 20 66 6f  ew Set();.    fo
1910: 72 20 28 6c 65 74 20 73 53 74 65 6d 20 6f 66 20  r (let sStem of 
1920: 73 74 65 6d 28 73 46 6c 65 78 29 29 20 7b 0a 20  stem(sFlex)) {. 
1930: 20 20 20 20 20 20 20 6c 65 74 20 74 54 61 67 73         let tTags
1940: 20 3d 20 63 6f 6e 6a 2e 5f 67 65 74 54 61 67 73   = conj._getTags
1950: 28 73 53 74 65 6d 29 3b 0a 20 20 20 20 20 20 20  (sStem);.       
1960: 20 69 66 20 28 74 54 61 67 73 29 20 7b 0a 20 20   if (tTags) {.  
1970: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c            for (l
1980: 65 74 20 73 54 65 6e 73 65 20 6f 66 20 6c 4d 6f  et sTense of lMo
1990: 64 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  de) {.          
19a0: 20 20 20 20 20 20 69 66 20 28 63 6f 6e 6a 2e 5f        if (conj._
19b0: 68 61 73 43 6f 6e 6a 57 69 74 68 54 61 67 73 28  hasConjWithTags(
19c0: 74 54 61 67 73 2c 20 73 54 65 6e 73 65 2c 20 73  tTags, sTense, s
19d0: 57 68 6f 29 29 20 7b 0a 20 20 20 20 20 20 20 20  Who)) {.        
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67              aSug
19f0: 67 2e 61 64 64 28 63 6f 6e 6a 2e 5f 67 65 74 43  g.add(conj._getC
1a00: 6f 6e 6a 57 69 74 68 54 61 67 73 28 73 53 74 65  onjWithTags(sSte
1a10: 6d 2c 20 74 54 61 67 73 2c 20 73 54 65 6e 73 65  m, tTags, sTense
1a20: 2c 20 73 57 68 6f 29 29 3b 0a 20 20 20 20 20 20  , sWho));.      
1a30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1a60: 20 28 61 53 75 67 67 2e 73 69 7a 65 20 3e 20 30   (aSugg.size > 0
1a70: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
1a80: 72 6e 20 41 72 72 61 79 2e 66 72 6f 6d 28 61 53  rn Array.from(aS
1a90: 75 67 67 29 2e 6a 6f 69 6e 28 22 7c 22 29 3b 0a  ugg).join("|");.
1aa0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1ab0: 20 22 22 3b 0a 7d 0a 0a 2f 2f 2f 2f 20 4e 6f 75   "";.}..//// Nou
1ac0: 6e 73 20 61 6e 64 20 61 64 6a 65 63 74 69 76 65  ns and adjective
1ad0: 73 0a 0a 66 75 6e 63 74 69 6f 6e 20 73 75 67 67  s..function sugg
1ae0: 50 6c 75 72 20 28 73 46 6c 65 78 2c 20 73 57 6f  Plur (sFlex, sWo
1af0: 72 64 54 6f 41 67 72 65 65 3d 6e 75 6c 6c 29 20  rdToAgree=null) 
1b00: 7b 0a 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 73  {.    // returns
1b10: 20 70 6c 75 72 61 6c 20 66 6f 72 6d 73 20 61 73   plural forms as
1b20: 73 75 6d 69 6e 67 20 73 46 6c 65 78 20 69 73 20  suming sFlex is 
1b30: 73 69 6e 67 75 6c 61 72 0a 20 20 20 20 69 66 20  singular.    if 
1b40: 28 73 57 6f 72 64 54 6f 41 67 72 65 65 29 20 7b  (sWordToAgree) {
1b50: 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 5f 64  .        if (!_d
1b60: 41 6e 61 6c 79 73 65 73 2e 68 61 73 28 73 57 6f  Analyses.has(sWo
1b70: 72 64 54 6f 41 67 72 65 65 29 20 26 26 20 21 5f  rdToAgree) && !_
1b80: 73 74 6f 72 65 4d 6f 72 70 68 46 72 6f 6d 46 53  storeMorphFromFS
1b90: 41 28 73 57 6f 72 64 54 6f 41 67 72 65 65 29 29  A(sWordToAgree))
1ba0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   {.            r
1bb0: 65 74 75 72 6e 20 22 22 3b 0a 20 20 20 20 20 20  eturn "";.      
1bc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 74 20    }.        let 
1bd0: 73 47 65 6e 64 65 72 20 3d 20 63 72 2e 67 65 74  sGender = cr.get
1be0: 47 65 6e 64 65 72 28 5f 64 41 6e 61 6c 79 73 65  Gender(_dAnalyse
1bf0: 73 2e 5f 67 65 74 28 73 57 6f 72 64 54 6f 41 67  s._get(sWordToAg
1c00: 72 65 65 2c 20 5b 5d 29 29 3b 0a 20 20 20 20 20  ree, []));.     
1c10: 20 20 20 69 66 20 28 73 47 65 6e 64 65 72 20 3d     if (sGender =
1c20: 3d 20 22 3a 6d 22 29 20 7b 0a 20 20 20 20 20 20  = ":m") {.      
1c30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 75 67        return sug
1c40: 67 4d 61 73 50 6c 75 72 28 73 46 6c 65 78 29 3b  gMasPlur(sFlex);
1c50: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
1c60: 69 66 20 28 73 47 65 6e 64 65 72 20 3d 3d 20 22  if (sGender == "
1c70: 3a 66 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  :f") {.         
1c80: 20 20 20 72 65 74 75 72 6e 20 73 75 67 67 46 65     return suggFe
1c90: 6d 50 6c 75 72 28 73 46 6c 65 78 29 3b 0a 20 20  mPlur(sFlex);.  
1ca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1cb0: 20 20 6c 65 74 20 61 53 75 67 67 20 3d 20 6e 65    let aSugg = ne
1cc0: 77 20 53 65 74 28 29 3b 0a 20 20 20 20 69 66 20  w Set();.    if 
1cd0: 28 21 73 46 6c 65 78 2e 69 6e 63 6c 75 64 65 73  (!sFlex.includes
1ce0: 28 22 2d 22 29 29 20 7b 0a 20 20 20 20 20 20 20  ("-")) {.       
1cf0: 20 69 66 20 28 73 46 6c 65 78 2e 65 6e 64 73 57   if (sFlex.endsW
1d00: 69 74 68 28 22 6c 22 29 29 20 7b 0a 20 20 20 20  ith("l")) {.    
1d10: 20 20 20 20 20 20 20 20 69 66 20 28 73 46 6c 65          if (sFle
1d20: 78 2e 65 6e 64 73 57 69 74 68 28 22 61 6c 22 29  x.endsWith("al")
1d30: 20 26 26 20 73 46 6c 65 78 2e 6c 65 6e 67 74 68   && sFlex.length
1d40: 20 3e 20 32 20 26 26 20 5f 6f 44 69 63 74 2e 69   > 2 && _oDict.i
1d50: 73 56 61 6c 69 64 28 73 46 6c 65 78 2e 73 6c 69  sValid(sFlex.sli
1d60: 63 65 28 30 2c 2d 31 29 2b 22 75 78 22 29 29 20  ce(0,-1)+"ux")) 
1d70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d80: 20 20 61 53 75 67 67 2e 61 64 64 28 73 46 6c 65    aSugg.add(sFle
1d90: 78 2e 73 6c 69 63 65 28 30 2c 2d 31 29 2b 22 75  x.slice(0,-1)+"u
1da0: 78 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  x");.           
1db0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
1dc0: 66 20 28 73 46 6c 65 78 2e 65 6e 64 73 57 69 74  f (sFlex.endsWit
1dd0: 68 28 22 61 69 6c 22 29 20 26 26 20 73 46 6c 65  h("ail") && sFle
1de0: 78 2e 6c 65 6e 67 74 68 20 3e 20 33 20 26 26 20  x.length > 3 && 
1df0: 5f 6f 44 69 63 74 2e 69 73 56 61 6c 69 64 28 73  _oDict.isValid(s
1e00: 46 6c 65 78 2e 73 6c 69 63 65 28 30 2c 2d 32 29  Flex.slice(0,-2)
1e10: 2b 22 75 78 22 29 29 20 7b 0a 20 20 20 20 20 20  +"ux")) {.      
1e20: 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e            aSugg.
1e30: 61 64 64 28 73 46 6c 65 78 2e 73 6c 69 63 65 28  add(sFlex.slice(
1e40: 30 2c 2d 32 29 2b 22 75 78 22 29 3b 0a 20 20 20  0,-2)+"ux");.   
1e50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20     }.        if 
1e70: 28 5f 6f 44 69 63 74 2e 69 73 56 61 6c 69 64 28  (_oDict.isValid(
1e80: 73 46 6c 65 78 2b 22 73 22 29 29 20 7b 0a 20 20  sFlex+"s")) {.  
1e90: 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e            aSugg.
1ea0: 61 64 64 28 73 46 6c 65 78 2b 22 73 22 29 3b 0a  add(sFlex+"s");.
1eb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ec0: 20 20 69 66 20 28 5f 6f 44 69 63 74 2e 69 73 56    if (_oDict.isV
1ed0: 61 6c 69 64 28 73 46 6c 65 78 2b 22 78 22 29 29  alid(sFlex+"x"))
1ee0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61   {.            a
1ef0: 53 75 67 67 2e 61 64 64 28 73 46 6c 65 78 2b 22  Sugg.add(sFlex+"
1f00: 78 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  x");.        }. 
1f10: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6d 66 73     }.    if (mfs
1f20: 70 2e 68 61 73 4d 69 73 63 50 6c 75 72 61 6c 28  p.hasMiscPlural(
1f30: 73 46 6c 65 78 29 29 20 7b 0a 20 20 20 20 20 20  sFlex)) {.      
1f40: 20 20 6d 66 73 70 2e 67 65 74 4d 69 73 63 50 6c    mfsp.getMiscPl
1f50: 75 72 61 6c 28 73 46 6c 65 78 29 2e 66 6f 72 45  ural(sFlex).forE
1f60: 61 63 68 28 66 75 6e 63 74 69 6f 6e 28 78 29 20  ach(function(x) 
1f70: 7b 20 61 53 75 67 67 2e 61 64 64 28 78 29 3b 20  { aSugg.add(x); 
1f80: 7d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  });.    }.    if
1f90: 20 28 61 53 75 67 67 2e 73 69 7a 65 20 3e 20 30   (aSugg.size > 0
1fa0: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
1fb0: 72 6e 20 41 72 72 61 79 2e 66 72 6f 6d 28 61 53  rn Array.from(aS
1fc0: 75 67 67 29 2e 6a 6f 69 6e 28 22 7c 22 29 3b 0a  ugg).join("|");.
1fd0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1fe0: 20 22 22 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e   "";.}..function
1ff0: 20 73 75 67 67 53 69 6e 67 20 28 73 46 6c 65 78   suggSing (sFlex
2000: 29 20 7b 0a 20 20 20 20 2f 2f 20 72 65 74 75 72  ) {.    // retur
2010: 6e 73 20 73 69 6e 67 75 6c 61 72 20 66 6f 72 6d  ns singular form
2020: 73 20 61 73 73 75 6d 69 6e 67 20 73 46 6c 65 78  s assuming sFlex
2030: 20 69 73 20 70 6c 75 72 61 6c 0a 20 20 20 20 69   is plural.    i
2040: 66 20 28 73 46 6c 65 78 2e 69 6e 63 6c 75 64 65  f (sFlex.include
2050: 73 28 22 2d 22 29 29 20 7b 0a 20 20 20 20 20 20  s("-")) {.      
2060: 20 20 72 65 74 75 72 6e 20 22 22 3b 0a 20 20 20    return "";.   
2070: 20 7d 0a 20 20 20 20 6c 65 74 20 61 53 75 67 67   }.    let aSugg
2080: 20 3d 20 6e 65 77 20 53 65 74 28 29 3b 0a 20 20   = new Set();.  
2090: 20 20 69 66 20 28 73 46 6c 65 78 2e 65 6e 64 73    if (sFlex.ends
20a0: 57 69 74 68 28 22 75 78 22 29 29 20 7b 0a 20 20  With("ux")) {.  
20b0: 20 20 20 20 20 20 69 66 20 28 5f 6f 44 69 63 74        if (_oDict
20c0: 2e 69 73 56 61 6c 69 64 28 73 46 6c 65 78 2e 73  .isValid(sFlex.s
20d0: 6c 69 63 65 28 30 2c 2d 32 29 2b 22 6c 22 29 29  lice(0,-2)+"l"))
20e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61   {.            a
20f0: 53 75 67 67 2e 61 64 64 28 73 46 6c 65 78 2e 73  Sugg.add(sFlex.s
2100: 6c 69 63 65 28 30 2c 2d 32 29 2b 22 6c 22 29 3b  lice(0,-2)+"l");
2110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2120: 20 20 20 69 66 20 28 5f 6f 44 69 63 74 2e 69 73     if (_oDict.is
2130: 56 61 6c 69 64 28 73 46 6c 65 78 2e 73 6c 69 63  Valid(sFlex.slic
2140: 65 28 30 2c 2d 32 29 2b 22 69 6c 22 29 29 20 7b  e(0,-2)+"il")) {
2150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75  .            aSu
2160: 67 67 2e 61 64 64 28 73 46 6c 65 78 2e 73 6c 69  gg.add(sFlex.sli
2170: 63 65 28 30 2c 2d 32 29 2b 22 69 6c 22 29 3b 0a  ce(0,-2)+"il");.
2180: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
2190: 20 20 20 20 69 66 20 28 5f 6f 44 69 63 74 2e 69      if (_oDict.i
21a0: 73 56 61 6c 69 64 28 73 46 6c 65 78 2e 73 6c 69  sValid(sFlex.sli
21b0: 63 65 28 30 2c 2d 31 29 29 29 20 7b 0a 20 20 20  ce(0,-1))) {.   
21c0: 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 73       aSugg.add(s
21d0: 46 6c 65 78 2e 73 6c 69 63 65 28 30 2c 2d 31 29  Flex.slice(0,-1)
21e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  );.    }.    if 
21f0: 28 61 53 75 67 67 2e 73 69 7a 65 20 3e 20 30 29  (aSugg.size > 0)
2200: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
2210: 6e 20 41 72 72 61 79 2e 66 72 6f 6d 28 61 53 75  n Array.from(aSu
2220: 67 67 29 2e 6a 6f 69 6e 28 22 7c 22 29 3b 0a 20  gg).join("|");. 
2230: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2240: 22 22 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  "";.}..function 
2250: 73 75 67 67 4d 61 73 53 69 6e 67 20 28 73 46 6c  suggMasSing (sFl
2260: 65 78 2c 20 62 53 75 67 67 53 69 6d 69 6c 3d 66  ex, bSuggSimil=f
2270: 61 6c 73 65 29 20 7b 0a 20 20 20 20 2f 2f 20 72  alse) {.    // r
2280: 65 74 75 72 6e 73 20 6d 61 73 63 75 6c 69 6e 65  eturns masculine
2290: 20 73 69 6e 67 75 6c 61 72 20 66 6f 72 6d 73 0a   singular forms.
22a0: 20 20 20 20 2f 2f 20 77 65 20 64 6f 6e e2 80 99      // we don...
22b0: 74 20 63 68 65 63 6b 20 69 66 20 77 6f 72 64 20  t check if word 
22c0: 65 78 69 73 74 73 20 69 6e 20 5f 64 41 6e 61 6c  exists in _dAnal
22d0: 79 73 65 73 2c 20 66 6f 72 20 69 74 20 69 73 20  yses, for it is 
22e0: 61 73 73 75 6d 65 64 20 69 74 20 68 61 73 20 62  assumed it has b
22f0: 65 65 6e 20 64 6f 6e 65 20 62 65 66 6f 72 65 0a  een done before.
2300: 20 20 20 20 6c 65 74 20 61 53 75 67 67 20 3d 20      let aSugg = 
2310: 6e 65 77 20 53 65 74 28 29 3b 0a 20 20 20 20 66  new Set();.    f
2320: 6f 72 20 28 6c 65 74 20 73 4d 6f 72 70 68 20 6f  or (let sMorph o
2330: 66 20 5f 64 41 6e 61 6c 79 73 65 73 2e 5f 67 65  f _dAnalyses._ge
2340: 74 28 73 46 6c 65 78 2c 20 5b 5d 29 29 20 7b 0a  t(sFlex, [])) {.
2350: 20 20 20 20 20 20 20 20 69 66 20 28 21 73 4d 6f          if (!sMo
2360: 72 70 68 2e 69 6e 63 6c 75 64 65 73 28 22 3a 56  rph.includes(":V
2370: 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ")) {.          
2380: 20 20 2f 2f 20 6e 6f 74 20 61 20 76 65 72 62 0a    // not a verb.
2390: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
23a0: 73 4d 6f 72 70 68 2e 69 6e 63 6c 75 64 65 73 28  sMorph.includes(
23b0: 22 3a 6d 22 29 20 7c 7c 20 73 4d 6f 72 70 68 2e  ":m") || sMorph.
23c0: 69 6e 63 6c 75 64 65 73 28 22 3a 65 22 29 29 20  includes(":e")) 
23d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23e0: 20 20 61 53 75 67 67 2e 61 64 64 28 73 75 67 67    aSugg.add(sugg
23f0: 53 69 6e 67 28 73 46 6c 65 78 29 29 3b 0a 20 20  Sing(sFlex));.  
2400: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2410: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2420: 20 20 20 6c 65 74 20 73 53 74 65 6d 20 3d 20 63     let sStem = c
2430: 72 2e 67 65 74 4c 65 6d 6d 61 4f 66 4d 6f 72 70  r.getLemmaOfMorp
2440: 68 28 73 4d 6f 72 70 68 29 3b 0a 20 20 20 20 20  h(sMorph);.     
2450: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6d             if (m
2460: 66 73 70 2e 69 73 46 65 6d 46 6f 72 6d 28 73 53  fsp.isFemForm(sS
2470: 74 65 6d 29 29 20 7b 0a 20 20 20 20 20 20 20 20  tem)) {.        
2480: 20 20 20 20 20 20 20 20 20 20 20 20 6d 66 73 70              mfsp
2490: 2e 67 65 74 4d 61 73 46 6f 72 6d 28 73 53 74 65  .getMasForm(sSte
24a0: 6d 2c 20 66 61 6c 73 65 29 2e 66 6f 72 45 61 63  m, false).forEac
24b0: 68 28 66 75 6e 63 74 69 6f 6e 28 78 29 20 7b 20  h(function(x) { 
24c0: 61 53 75 67 67 2e 61 64 64 28 78 29 3b 20 7d 29  aSugg.add(x); })
24d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24f0: 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  }.        } else
2500: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   {.            /
2510: 2f 20 61 20 76 65 72 62 0a 20 20 20 20 20 20 20  / a verb.       
2520: 20 20 20 20 20 6c 65 74 20 73 56 65 72 62 20 3d       let sVerb =
2530: 20 63 72 2e 67 65 74 4c 65 6d 6d 61 4f 66 4d 6f   cr.getLemmaOfMo
2540: 72 70 68 28 73 4d 6f 72 70 68 29 3b 0a 20 20 20  rph(sMorph);.   
2550: 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e           if (con
2560: 6a 2e 68 61 73 43 6f 6e 6a 28 73 56 65 72 62 2c  j.hasConj(sVerb,
2570: 20 22 3a 50 51 22 2c 20 22 3a 51 31 22 29 20 26   ":PQ", ":Q1") &
2580: 26 20 63 6f 6e 6a 2e 68 61 73 43 6f 6e 6a 28 73  & conj.hasConj(s
2590: 56 65 72 62 2c 20 22 3a 50 51 22 2c 20 22 3a 51  Verb, ":PQ", ":Q
25a0: 33 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  3")) {.         
25b0: 20 20 20 20 20 20 20 2f 2f 20 57 65 20 61 6c 73         // We als
25c0: 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 76  o check if the v
25d0: 65 72 62 20 68 61 73 20 61 20 66 65 6d 69 6e 69  erb has a femini
25e0: 6e 65 20 66 6f 72 6d 2e 0a 20 20 20 20 20 20 20  ne form..       
25f0: 20 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20 6e           // If n
2600: 6f 74 2c 20 77 65 20 63 6f 6e 73 69 64 65 72 20  ot, we consider 
2610: 69 74 e2 80 99 73 20 62 65 74 74 65 72 20 74 6f  it...s better to
2620: 20 6e 6f 74 20 73 75 67 67 65 73 74 20 74 68 65   not suggest the
2630: 20 6d 61 73 63 75 6c 69 6e 65 20 6f 6e 65 2c 20   masculine one, 
2640: 61 73 20 69 74 20 63 61 6e 20 62 65 20 63 6f 6e  as it can be con
2650: 73 69 64 65 72 65 64 20 69 6e 76 61 72 69 61 62  sidered invariab
2660: 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  le..            
2670: 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f      aSugg.add(co
2680: 6e 6a 2e 67 65 74 43 6f 6e 6a 28 73 56 65 72 62  nj.getConj(sVerb
2690: 2c 20 22 3a 50 51 22 2c 20 22 3a 51 31 22 29 29  , ":PQ", ":Q1"))
26a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
26c0: 20 20 20 20 69 66 20 28 62 53 75 67 67 53 69 6d      if (bSuggSim
26d0: 69 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 66 6f  il) {.        fo
26e0: 72 20 28 6c 65 74 20 65 20 6f 66 20 70 68 6f 6e  r (let e of phon
26f0: 65 74 2e 73 65 6c 65 63 74 53 69 6d 69 6c 28 73  et.selectSimil(s
2700: 46 6c 65 78 2c 20 22 3a 6d 3a 5b 73 69 5d 22 29  Flex, ":m:[si]")
2710: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2720: 61 53 75 67 67 2e 61 64 64 28 65 29 3b 0a 20 20  aSugg.add(e);.  
2730: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2740: 20 20 69 66 20 28 61 53 75 67 67 2e 73 69 7a 65    if (aSugg.size
2750: 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20   > 0) {.        
2760: 72 65 74 75 72 6e 20 41 72 72 61 79 2e 66 72 6f  return Array.fro
2770: 6d 28 61 53 75 67 67 29 2e 6a 6f 69 6e 28 22 7c  m(aSugg).join("|
2780: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ");.    }.    re
2790: 74 75 72 6e 20 22 22 3b 0a 7d 0a 0a 66 75 6e 63  turn "";.}..func
27a0: 74 69 6f 6e 20 73 75 67 67 4d 61 73 50 6c 75 72  tion suggMasPlur
27b0: 20 28 73 46 6c 65 78 2c 20 62 53 75 67 67 53 69   (sFlex, bSuggSi
27c0: 6d 69 6c 3d 66 61 6c 73 65 29 20 7b 0a 20 20 20  mil=false) {.   
27d0: 20 2f 2f 20 72 65 74 75 72 6e 73 20 6d 61 73 63   // returns masc
27e0: 75 6c 69 6e 65 20 70 6c 75 72 61 6c 20 66 6f 72  uline plural for
27f0: 6d 73 0a 20 20 20 20 2f 2f 20 77 65 20 64 6f 6e  ms.    // we don
2800: e2 80 99 74 20 63 68 65 63 6b 20 69 66 20 77 6f  ...t check if wo
2810: 72 64 20 65 78 69 73 74 73 20 69 6e 20 5f 64 41  rd exists in _dA
2820: 6e 61 6c 79 73 65 73 2c 20 66 6f 72 20 69 74 20  nalyses, for it 
2830: 69 73 20 61 73 73 75 6d 65 64 20 69 74 20 68 61  is assumed it ha
2840: 73 20 62 65 65 6e 20 64 6f 6e 65 20 62 65 66 6f  s been done befo
2850: 72 65 0a 20 20 20 20 6c 65 74 20 61 53 75 67 67  re.    let aSugg
2860: 20 3d 20 6e 65 77 20 53 65 74 28 29 3b 0a 20 20   = new Set();.  
2870: 20 20 66 6f 72 20 28 6c 65 74 20 73 4d 6f 72 70    for (let sMorp
2880: 68 20 6f 66 20 5f 64 41 6e 61 6c 79 73 65 73 2e  h of _dAnalyses.
2890: 5f 67 65 74 28 73 46 6c 65 78 2c 20 5b 5d 29 29  _get(sFlex, []))
28a0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21   {.        if (!
28b0: 73 4d 6f 72 70 68 2e 69 6e 63 6c 75 64 65 73 28  sMorph.includes(
28c0: 22 3a 56 22 29 29 20 7b 0a 20 20 20 20 20 20 20  ":V")) {.       
28d0: 20 20 20 20 20 2f 2f 20 6e 6f 74 20 61 20 76 65       // not a ve
28e0: 72 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  rb.            i
28f0: 66 20 28 73 4d 6f 72 70 68 2e 69 6e 63 6c 75 64  f (sMorph.includ
2900: 65 73 28 22 3a 6d 22 29 20 7c 7c 20 73 4d 6f 72  es(":m") || sMor
2910: 70 68 2e 69 6e 63 6c 75 64 65 73 28 22 3a 65 22  ph.includes(":e"
2920: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
2930: 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 73       aSugg.add(s
2940: 75 67 67 50 6c 75 72 28 73 46 6c 65 78 29 29 3b  uggPlur(sFlex));
2950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
2960: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
2970: 20 20 20 20 20 20 6c 65 74 20 73 53 74 65 6d 20        let sStem 
2980: 3d 20 63 72 2e 67 65 74 4c 65 6d 6d 61 4f 66 4d  = cr.getLemmaOfM
2990: 6f 72 70 68 28 73 4d 6f 72 70 68 29 3b 0a 20 20  orph(sMorph);.  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
29b0: 20 28 6d 66 73 70 2e 69 73 46 65 6d 46 6f 72 6d   (mfsp.isFemForm
29c0: 28 73 53 74 65 6d 29 29 20 7b 0a 20 20 20 20 20  (sStem)) {.     
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
29e0: 66 73 70 2e 67 65 74 4d 61 73 46 6f 72 6d 28 73  fsp.getMasForm(s
29f0: 53 74 65 6d 2c 20 74 72 75 65 29 2e 66 6f 72 45  Stem, true).forE
2a00: 61 63 68 28 66 75 6e 63 74 69 6f 6e 28 78 29 20  ach(function(x) 
2a10: 7b 20 61 53 75 67 67 2e 61 64 64 28 78 29 3b 20  { aSugg.add(x); 
2a20: 7d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  });.            
2a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a40: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c    }.        } el
2a50: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
2a60: 20 2f 2f 20 61 20 76 65 72 62 0a 20 20 20 20 20   // a verb.     
2a70: 20 20 20 20 20 20 20 6c 65 74 20 73 56 65 72 62         let sVerb
2a80: 20 3d 20 63 72 2e 67 65 74 4c 65 6d 6d 61 4f 66   = cr.getLemmaOf
2a90: 4d 6f 72 70 68 28 73 4d 6f 72 70 68 29 3b 0a 20  Morph(sMorph);. 
2aa0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
2ab0: 6f 6e 6a 2e 68 61 73 43 6f 6e 6a 28 73 56 65 72  onj.hasConj(sVer
2ac0: 62 2c 20 22 3a 50 51 22 2c 20 22 3a 51 32 22 29  b, ":PQ", ":Q2")
2ad0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2ae0: 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 63 6f      aSugg.add(co
2af0: 6e 6a 2e 67 65 74 43 6f 6e 6a 28 73 56 65 72 62  nj.getConj(sVerb
2b00: 2c 20 22 3a 50 51 22 2c 20 22 3a 51 32 22 29 29  , ":PQ", ":Q2"))
2b10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
2b20: 65 6c 73 65 20 69 66 20 28 63 6f 6e 6a 2e 68 61  else if (conj.ha
2b30: 73 43 6f 6e 6a 28 73 56 65 72 62 2c 20 22 3a 50  sConj(sVerb, ":P
2b40: 51 22 2c 20 22 3a 51 31 22 29 29 20 7b 0a 20 20  Q", ":Q1")) {.  
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
2b60: 74 20 73 53 75 67 67 20 3d 20 63 6f 6e 6a 2e 67  t sSugg = conj.g
2b70: 65 74 43 6f 6e 6a 28 73 56 65 72 62 2c 20 22 3a  etConj(sVerb, ":
2b80: 50 51 22 2c 20 22 3a 51 31 22 29 3b 0a 20 20 20  PQ", ":Q1");.   
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2ba0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
2bb0: 74 6f 20 66 69 6c 74 65 72 20 74 68 65 73 65 20  to filter these 
2bc0: 66 6c 65 78 69 6f 6e 73 2c 20 6c 69 6b 65 20 e2  flexions, like .
2bd0: 80 9c 73 75 63 63 c3 a9 64 c3 a9 e2 80 9d 20 6f  ..succ..d..... o
2be0: 72 20 e2 80 9c 61 67 69 e2 80 9d 20 74 68 61 74  r ...agi... that
2bf0: 20 61 72 65 20 6e 6f 74 20 6d 61 73 63 75 6c 69   are not masculi
2c00: 6e 65 20 70 6c 75 72 61 6c 0a 20 20 20 20 20 20  ne plural.      
2c10: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 53            if (sS
2c20: 75 67 67 2e 65 6e 64 73 57 69 74 68 28 22 73 22  ugg.endsWith("s"
2c30: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
2c40: 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61           aSugg.a
2c50: 64 64 28 73 53 75 67 67 29 3b 0a 20 20 20 20 20  dd(sSugg);.     
2c60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2c90: 66 20 28 62 53 75 67 67 53 69 6d 69 6c 29 20 7b  f (bSuggSimil) {
2ca0: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65  .        for (le
2cb0: 74 20 65 20 6f 66 20 70 68 6f 6e 65 74 2e 73 65  t e of phonet.se
2cc0: 6c 65 63 74 53 69 6d 69 6c 28 73 46 6c 65 78 2c  lectSimil(sFlex,
2cd0: 20 22 3a 6d 3a 5b 70 69 5d 22 29 29 20 7b 0a 20   ":m:[pi]")) {. 
2ce0: 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67             aSugg
2cf0: 2e 61 64 64 28 65 29 3b 0a 20 20 20 20 20 20 20  .add(e);.       
2d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
2d10: 28 61 53 75 67 67 2e 73 69 7a 65 20 3e 20 30 29  (aSugg.size > 0)
2d20: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
2d30: 6e 20 41 72 72 61 79 2e 66 72 6f 6d 28 61 53 75  n Array.from(aSu
2d40: 67 67 29 2e 6a 6f 69 6e 28 22 7c 22 29 3b 0a 20  gg).join("|");. 
2d50: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2d60: 22 22 3b 0a 7d 0a 0a 0a 66 75 6e 63 74 69 6f 6e  "";.}...function
2d70: 20 73 75 67 67 46 65 6d 53 69 6e 67 20 28 73 46   suggFemSing (sF
2d80: 6c 65 78 2c 20 62 53 75 67 67 53 69 6d 69 6c 3d  lex, bSuggSimil=
2d90: 66 61 6c 73 65 29 20 7b 0a 20 20 20 20 2f 2f 20  false) {.    // 
2da0: 72 65 74 75 72 6e 73 20 66 65 6d 69 6e 69 6e 65  returns feminine
2db0: 20 73 69 6e 67 75 6c 61 72 20 66 6f 72 6d 73 0a   singular forms.
2dc0: 20 20 20 20 2f 2f 20 77 65 20 64 6f 6e e2 80 99      // we don...
2dd0: 74 20 63 68 65 63 6b 20 69 66 20 77 6f 72 64 20  t check if word 
2de0: 65 78 69 73 74 73 20 69 6e 20 5f 64 41 6e 61 6c  exists in _dAnal
2df0: 79 73 65 73 2c 20 66 6f 72 20 69 74 20 69 73 20  yses, for it is 
2e00: 61 73 73 75 6d 65 64 20 69 74 20 68 61 73 20 62  assumed it has b
2e10: 65 65 6e 20 64 6f 6e 65 20 62 65 66 6f 72 65 0a  een done before.
2e20: 20 20 20 20 6c 65 74 20 61 53 75 67 67 20 3d 20      let aSugg = 
2e30: 6e 65 77 20 53 65 74 28 29 3b 0a 20 20 20 20 66  new Set();.    f
2e40: 6f 72 20 28 6c 65 74 20 73 4d 6f 72 70 68 20 6f  or (let sMorph o
2e50: 66 20 5f 64 41 6e 61 6c 79 73 65 73 2e 5f 67 65  f _dAnalyses._ge
2e60: 74 28 73 46 6c 65 78 2c 20 5b 5d 29 29 20 7b 0a  t(sFlex, [])) {.
2e70: 20 20 20 20 20 20 20 20 69 66 20 28 21 73 4d 6f          if (!sMo
2e80: 72 70 68 2e 69 6e 63 6c 75 64 65 73 28 22 3a 56  rph.includes(":V
2e90: 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ")) {.          
2ea0: 20 20 2f 2f 20 6e 6f 74 20 61 20 76 65 72 62 0a    // not a verb.
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
2ec0: 73 4d 6f 72 70 68 2e 69 6e 63 6c 75 64 65 73 28  sMorph.includes(
2ed0: 22 3a 66 22 29 20 7c 7c 20 73 4d 6f 72 70 68 2e  ":f") || sMorph.
2ee0: 69 6e 63 6c 75 64 65 73 28 22 3a 65 22 29 29 20  includes(":e")) 
2ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2f00: 20 20 61 53 75 67 67 2e 61 64 64 28 73 75 67 67    aSugg.add(sugg
2f10: 53 69 6e 67 28 73 46 6c 65 78 29 29 3b 0a 20 20  Sing(sFlex));.  
2f20: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2f30: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2f40: 20 20 20 6c 65 74 20 73 53 74 65 6d 20 3d 20 63     let sStem = c
2f50: 72 2e 67 65 74 4c 65 6d 6d 61 4f 66 4d 6f 72 70  r.getLemmaOfMorp
2f60: 68 28 73 4d 6f 72 70 68 29 3b 0a 20 20 20 20 20  h(sMorph);.     
2f70: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6d             if (m
2f80: 66 73 70 2e 69 73 46 65 6d 46 6f 72 6d 28 73 53  fsp.isFemForm(sS
2f90: 74 65 6d 29 29 20 7b 0a 20 20 20 20 20 20 20 20  tem)) {.        
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67              aSug
2fb0: 67 2e 61 64 64 28 73 53 74 65 6d 29 3b 0a 20 20  g.add(sStem);.  
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2fe0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
2ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 61 20             // a 
3000: 76 65 72 62 0a 20 20 20 20 20 20 20 20 20 20 20  verb.           
3010: 20 6c 65 74 20 73 56 65 72 62 20 3d 20 63 72 2e   let sVerb = cr.
3020: 67 65 74 4c 65 6d 6d 61 4f 66 4d 6f 72 70 68 28  getLemmaOfMorph(
3030: 73 4d 6f 72 70 68 29 3b 0a 20 20 20 20 20 20 20  sMorph);.       
3040: 20 20 20 20 20 69 66 20 28 63 6f 6e 6a 2e 68 61       if (conj.ha
3050: 73 43 6f 6e 6a 28 73 56 65 72 62 2c 20 22 3a 50  sConj(sVerb, ":P
3060: 51 22 2c 20 22 3a 51 33 22 29 29 20 7b 0a 20 20  Q", ":Q3")) {.  
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3080: 75 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 67 65 74  ugg.add(conj.get
3090: 43 6f 6e 6a 28 73 56 65 72 62 2c 20 22 3a 50 51  Conj(sVerb, ":PQ
30a0: 22 2c 20 22 3a 51 33 22 29 29 3b 0a 20 20 20 20  ", ":Q3"));.    
30b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
30d0: 20 28 62 53 75 67 67 53 69 6d 69 6c 29 20 7b 0a   (bSuggSimil) {.
30e0: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
30f0: 20 65 20 6f 66 20 70 68 6f 6e 65 74 2e 73 65 6c   e of phonet.sel
3100: 65 63 74 53 69 6d 69 6c 28 73 46 6c 65 78 2c 20  ectSimil(sFlex, 
3110: 22 3a 66 3a 5b 73 69 5d 22 29 29 20 7b 0a 20 20  ":f:[si]")) {.  
3120: 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e            aSugg.
3130: 61 64 64 28 65 29 3b 0a 20 20 20 20 20 20 20 20  add(e);.        
3140: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
3150: 61 53 75 67 67 2e 73 69 7a 65 20 3e 20 30 29 20  aSugg.size > 0) 
3160: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3170: 20 41 72 72 61 79 2e 66 72 6f 6d 28 61 53 75 67   Array.from(aSug
3180: 67 29 2e 6a 6f 69 6e 28 22 7c 22 29 3b 0a 20 20  g).join("|");.  
3190: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 22    }.    return "
31a0: 22 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 73  ";.}..function s
31b0: 75 67 67 46 65 6d 50 6c 75 72 20 28 73 46 6c 65  uggFemPlur (sFle
31c0: 78 2c 20 62 53 75 67 67 53 69 6d 69 6c 3d 66 61  x, bSuggSimil=fa
31d0: 6c 73 65 29 20 7b 0a 20 20 20 20 2f 2f 20 72 65  lse) {.    // re
31e0: 74 75 72 6e 73 20 66 65 6d 69 6e 69 6e 65 20 70  turns feminine p
31f0: 6c 75 72 61 6c 20 66 6f 72 6d 73 0a 20 20 20 20  lural forms.    
3200: 2f 2f 20 77 65 20 64 6f 6e e2 80 99 74 20 63 68  // we don...t ch
3210: 65 63 6b 20 69 66 20 77 6f 72 64 20 65 78 69 73  eck if word exis
3220: 74 73 20 69 6e 20 5f 64 41 6e 61 6c 79 73 65 73  ts in _dAnalyses
3230: 2c 20 66 6f 72 20 69 74 20 69 73 20 61 73 73 75  , for it is assu
3240: 6d 65 64 20 69 74 20 68 61 73 20 62 65 65 6e 20  med it has been 
3250: 64 6f 6e 65 20 62 65 66 6f 72 65 0a 20 20 20 20  done before.    
3260: 6c 65 74 20 61 53 75 67 67 20 3d 20 6e 65 77 20  let aSugg = new 
3270: 53 65 74 28 29 3b 0a 20 20 20 20 66 6f 72 20 28  Set();.    for (
3280: 6c 65 74 20 73 4d 6f 72 70 68 20 6f 66 20 5f 64  let sMorph of _d
3290: 41 6e 61 6c 79 73 65 73 2e 5f 67 65 74 28 73 46  Analyses._get(sF
32a0: 6c 65 78 2c 20 5b 5d 29 29 20 7b 0a 20 20 20 20  lex, [])) {.    
32b0: 20 20 20 20 69 66 20 28 21 73 4d 6f 72 70 68 2e      if (!sMorph.
32c0: 69 6e 63 6c 75 64 65 73 28 22 3a 56 22 29 29 20  includes(":V")) 
32d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  {.            //
32e0: 20 6e 6f 74 20 61 20 76 65 72 62 0a 20 20 20 20   not a verb.    
32f0: 20 20 20 20 20 20 20 20 69 66 20 28 73 4d 6f 72          if (sMor
3300: 70 68 2e 69 6e 63 6c 75 64 65 73 28 22 3a 66 22  ph.includes(":f"
3310: 29 20 7c 7c 20 73 4d 6f 72 70 68 2e 69 6e 63 6c  ) || sMorph.incl
3320: 75 64 65 73 28 22 3a 65 22 29 29 20 7b 0a 20 20  udes(":e")) {.  
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3340: 75 67 67 2e 61 64 64 28 73 75 67 67 50 6c 75 72  ugg.add(suggPlur
3350: 28 73 46 6c 65 78 29 29 3b 0a 20 20 20 20 20 20  (sFlex));.      
3360: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
3380: 65 74 20 73 53 74 65 6d 20 3d 20 63 72 2e 67 65  et sStem = cr.ge
3390: 74 4c 65 6d 6d 61 4f 66 4d 6f 72 70 68 28 73 4d  tLemmaOfMorph(sM
33a0: 6f 72 70 68 29 3b 0a 20 20 20 20 20 20 20 20 20  orph);.         
33b0: 20 20 20 20 20 20 20 69 66 20 28 6d 66 73 70 2e         if (mfsp.
33c0: 69 73 46 65 6d 46 6f 72 6d 28 73 53 74 65 6d 29  isFemForm(sStem)
33d0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
33e0: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
33f0: 64 28 73 53 74 65 6d 2b 22 73 22 29 3b 0a 20 20  d(sStem+"s");.  
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
3410: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3420: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
3430: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 61 20             // a 
3440: 76 65 72 62 0a 20 20 20 20 20 20 20 20 20 20 20  verb.           
3450: 20 6c 65 74 20 73 56 65 72 62 20 3d 20 63 72 2e   let sVerb = cr.
3460: 67 65 74 4c 65 6d 6d 61 4f 66 4d 6f 72 70 68 28  getLemmaOfMorph(
3470: 73 4d 6f 72 70 68 29 3b 0a 20 20 20 20 20 20 20  sMorph);.       
3480: 20 20 20 20 20 69 66 20 28 63 6f 6e 6a 2e 68 61       if (conj.ha
3490: 73 43 6f 6e 6a 28 73 56 65 72 62 2c 20 22 3a 50  sConj(sVerb, ":P
34a0: 51 22 2c 20 22 3a 51 34 22 29 29 20 7b 0a 20 20  Q", ":Q4")) {.  
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
34c0: 75 67 67 2e 61 64 64 28 63 6f 6e 6a 2e 67 65 74  ugg.add(conj.get
34d0: 43 6f 6e 6a 28 73 56 65 72 62 2c 20 22 3a 50 51  Conj(sVerb, ":PQ
34e0: 22 2c 20 22 3a 51 34 22 29 29 3b 0a 20 20 20 20  ", ":Q4"));.    
34f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3500: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
3510: 20 28 62 53 75 67 67 53 69 6d 69 6c 29 20 7b 0a   (bSuggSimil) {.
3520: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
3530: 20 65 20 6f 66 20 70 68 6f 6e 65 74 2e 73 65 6c   e of phonet.sel
3540: 65 63 74 53 69 6d 69 6c 28 73 46 6c 65 78 2c 20  ectSimil(sFlex, 
3550: 22 3a 66 3a 5b 70 69 5d 22 29 29 20 7b 0a 20 20  ":f:[pi]")) {.  
3560: 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e            aSugg.
3570: 61 64 64 28 65 29 3b 0a 20 20 20 20 20 20 20 20  add(e);.        
3580: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
3590: 61 53 75 67 67 2e 73 69 7a 65 20 3e 20 30 29 20  aSugg.size > 0) 
35a0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
35b0: 20 41 72 72 61 79 2e 66 72 6f 6d 28 61 53 75 67   Array.from(aSug
35c0: 67 29 2e 6a 6f 69 6e 28 22 7c 22 29 3b 0a 20 20  g).join("|");.  
35d0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 22    }.    return "
35e0: 22 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 68  ";.}..function h
35f0: 61 73 46 65 6d 46 6f 72 6d 20 28 73 46 6c 65 78  asFemForm (sFlex
3600: 29 20 7b 0a 20 20 20 20 66 6f 72 20 28 6c 65 74  ) {.    for (let
3610: 20 73 53 74 65 6d 20 6f 66 20 73 74 65 6d 28 73   sStem of stem(s
3620: 46 6c 65 78 29 29 20 7b 0a 20 20 20 20 20 20 20  Flex)) {.       
3630: 20 69 66 20 28 6d 66 73 70 2e 69 73 46 65 6d 46   if (mfsp.isFemF
3640: 6f 72 6d 28 73 53 74 65 6d 29 20 7c 7c 20 63 6f  orm(sStem) || co
3650: 6e 6a 2e 68 61 73 43 6f 6e 6a 28 73 53 74 65 6d  nj.hasConj(sStem
3660: 2c 20 22 3a 50 51 22 2c 20 22 3a 51 33 22 29 29  , ":PQ", ":Q3"))
3670: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   {.            r
3680: 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20  eturn true;.    
3690: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
36a0: 69 66 20 28 70 68 6f 6e 65 74 2e 68 61 73 53 69  if (phonet.hasSi
36b0: 6d 69 6c 28 73 46 6c 65 78 2c 20 22 3a 66 22 29  mil(sFlex, ":f")
36c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
36d0: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20  rn true;.    }. 
36e0: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
36f0: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 68 61 73  .}..function has
3700: 4d 61 73 46 6f 72 6d 20 28 73 46 6c 65 78 29 20  MasForm (sFlex) 
3710: 7b 0a 20 20 20 20 66 6f 72 20 28 6c 65 74 20 73  {.    for (let s
3720: 53 74 65 6d 20 6f 66 20 73 74 65 6d 28 73 46 6c  Stem of stem(sFl
3730: 65 78 29 29 20 7b 0a 20 20 20 20 20 20 20 20 69  ex)) {.        i
3740: 66 20 28 6d 66 73 70 2e 69 73 46 65 6d 46 6f 72  f (mfsp.isFemFor
3750: 6d 28 73 53 74 65 6d 29 20 7c 7c 20 63 6f 6e 6a  m(sStem) || conj
3760: 2e 68 61 73 43 6f 6e 6a 28 73 53 74 65 6d 2c 20  .hasConj(sStem, 
3770: 22 3a 50 51 22 2c 20 22 3a 51 31 22 29 29 20 7b  ":PQ", ":Q1")) {
3780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
3790: 77 68 61 74 20 68 61 73 20 61 20 66 65 6d 69 6e  what has a femin
37a0: 69 6e 65 20 66 6f 72 6d 20 61 6c 73 6f 20 68 61  ine form also ha
37b0: 73 20 61 20 6d 61 73 63 75 6c 69 6e 65 20 66 6f  s a masculine fo
37c0: 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  rm.            r
37d0: 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20  eturn true;.    
37e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
37f0: 69 66 20 28 70 68 6f 6e 65 74 2e 68 61 73 53 69  if (phonet.hasSi
3800: 6d 69 6c 28 73 46 6c 65 78 2c 20 22 3a 6d 22 29  mil(sFlex, ":m")
3810: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
3820: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20  rn true;.    }. 
3830: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
3840: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 73 77 69  .}..function swi
3850: 74 63 68 47 65 6e 64 65 72 20 28 73 46 6c 65 78  tchGender (sFlex
3860: 2c 20 62 50 6c 75 72 3d 6e 75 6c 6c 29 20 7b 0a  , bPlur=null) {.
3870: 20 20 20 20 2f 2f 20 77 65 20 64 6f 6e e2 80 99      // we don...
3880: 74 20 63 68 65 63 6b 20 69 66 20 77 6f 72 64 20  t check if word 
3890: 65 78 69 73 74 73 20 69 6e 20 5f 64 41 6e 61 6c  exists in _dAnal
38a0: 79 73 65 73 2c 20 66 6f 72 20 69 74 20 69 73 20  yses, for it is 
38b0: 61 73 73 75 6d 65 64 20 69 74 20 68 61 73 20 62  assumed it has b
38c0: 65 65 6e 20 64 6f 6e 65 20 62 65 66 6f 72 65 0a  een done before.
38d0: 20 20 20 20 6c 65 74 20 61 53 75 67 67 20 3d 20      let aSugg = 
38e0: 6e 65 77 20 53 65 74 28 29 3b 0a 20 20 20 20 69  new Set();.    i
38f0: 66 20 28 62 50 6c 75 72 20 3d 3d 3d 20 6e 75 6c  f (bPlur === nul
3900: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  l) {.        for
3910: 20 28 6c 65 74 20 73 4d 6f 72 70 68 20 6f 66 20   (let sMorph of 
3920: 5f 64 41 6e 61 6c 79 73 65 73 2e 5f 67 65 74 28  _dAnalyses._get(
3930: 73 46 6c 65 78 2c 20 5b 5d 29 29 20 7b 0a 20 20  sFlex, [])) {.  
3940: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 4d            if (sM
3950: 6f 72 70 68 2e 69 6e 63 6c 75 64 65 73 28 22 3a  orph.includes(":
3960: 66 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  f")) {.         
3970: 20 20 20 20 20 20 20 69 66 20 28 73 4d 6f 72 70         if (sMorp
3980: 68 2e 69 6e 63 6c 75 64 65 73 28 22 3a 73 22 29  h.includes(":s")
3990: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
39a0: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
39b0: 64 28 73 75 67 67 4d 61 73 53 69 6e 67 28 73 46  d(suggMasSing(sF
39c0: 6c 65 78 29 29 3b 0a 20 20 20 20 20 20 20 20 20  lex));.         
39d0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66         } else if
39e0: 20 28 73 4d 6f 72 70 68 2e 69 6e 63 6c 75 64 65   (sMorph.include
39f0: 73 28 22 3a 70 22 29 29 20 7b 0a 20 20 20 20 20  s(":p")) {.     
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
3a10: 53 75 67 67 2e 61 64 64 28 73 75 67 67 4d 61 73  Sugg.add(suggMas
3a20: 50 6c 75 72 28 73 46 6c 65 78 29 29 3b 0a 20 20  Plur(sFlex));.  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
3a50: 73 65 20 69 66 20 28 73 4d 6f 72 70 68 2e 69 6e  se if (sMorph.in
3a60: 63 6c 75 64 65 73 28 22 3a 6d 22 29 29 20 7b 0a  cludes(":m")) {.
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a80: 69 66 20 28 73 4d 6f 72 70 68 2e 69 6e 63 6c 75  if (sMorph.inclu
3a90: 64 65 73 28 22 3a 73 22 29 29 20 7b 0a 20 20 20  des(":s")) {.   
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ab0: 20 61 53 75 67 67 2e 61 64 64 28 73 75 67 67 46   aSugg.add(suggF
3ac0: 65 6d 53 69 6e 67 28 73 46 6c 65 78 29 29 3b 0a  emSing(sFlex));.
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 7d 20 65 6c 73 65 20 69 66 20 28 73 4d 6f 72 70  } else if (sMorp
3af0: 68 2e 69 6e 63 6c 75 64 65 73 28 22 3a 70 22 29  h.includes(":p")
3b00: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3b10: 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64          aSugg.ad
3b20: 64 28 73 75 67 67 46 65 6d 50 6c 75 72 28 73 46  d(suggFemPlur(sF
3b30: 6c 65 78 29 29 3b 0a 20 20 20 20 20 20 20 20 20  lex));.         
3b40: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 73 75      aSugg.add(su
3b70: 67 67 46 65 6d 53 69 6e 67 28 73 46 6c 65 78 29  ggFemSing(sFlex)
3b80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3b90: 20 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64         aSugg.add
3ba0: 28 73 75 67 67 46 65 6d 50 6c 75 72 28 73 46 6c  (suggFemPlur(sFl
3bb0: 65 78 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ex));.          
3bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
3be0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62      } else if (b
3bf0: 50 6c 75 72 29 20 7b 0a 20 20 20 20 20 20 20 20  Plur) {.        
3c00: 66 6f 72 20 28 6c 65 74 20 73 4d 6f 72 70 68 20  for (let sMorph 
3c10: 6f 66 20 5f 64 41 6e 61 6c 79 73 65 73 2e 5f 67  of _dAnalyses._g
3c20: 65 74 28 73 46 6c 65 78 2c 20 5b 5d 29 29 20 7b  et(sFlex, [])) {
3c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
3c40: 28 73 4d 6f 72 70 68 2e 69 6e 63 6c 75 64 65 73  (sMorph.includes
3c50: 28 22 3a 66 22 29 29 20 7b 0a 20 20 20 20 20 20  (":f")) {.      
3c60: 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e            aSugg.
3c70: 61 64 64 28 73 75 67 67 4d 61 73 50 6c 75 72 28  add(suggMasPlur(
3c80: 73 46 6c 65 78 29 29 3b 0a 20 20 20 20 20 20 20  sFlex));.       
3c90: 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28       } else if (
3ca0: 73 4d 6f 72 70 68 2e 69 6e 63 6c 75 64 65 73 28  sMorph.includes(
3cb0: 22 3a 6d 22 29 29 20 7b 0a 20 20 20 20 20 20 20  ":m")) {.       
3cc0: 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 61           aSugg.a
3cd0: 64 64 28 73 75 67 67 46 65 6d 50 6c 75 72 28 73  dd(suggFemPlur(s
3ce0: 46 6c 65 78 29 29 3b 0a 20 20 20 20 20 20 20 20  Flex));.        
3cf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
3d00: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
3d10: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 73 4d       for (let sM
3d20: 6f 72 70 68 20 6f 66 20 5f 64 41 6e 61 6c 79 73  orph of _dAnalys
3d30: 65 73 2e 5f 67 65 74 28 73 46 6c 65 78 2c 20 5b  es._get(sFlex, [
3d40: 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ])) {.          
3d50: 20 20 69 66 20 28 73 4d 6f 72 70 68 2e 69 6e 63    if (sMorph.inc
3d60: 6c 75 64 65 73 28 22 3a 66 22 29 29 20 7b 0a 20  ludes(":f")) {. 
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
3d80: 53 75 67 67 2e 61 64 64 28 73 75 67 67 4d 61 73  Sugg.add(suggMas
3d90: 53 69 6e 67 28 73 46 6c 65 78 29 29 3b 0a 20 20  Sing(sFlex));.  
3da0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
3db0: 20 69 66 20 28 73 4d 6f 72 70 68 2e 69 6e 63 6c   if (sMorph.incl
3dc0: 75 64 65 73 28 22 3a 6d 22 29 29 20 7b 0a 20 20  udes(":m")) {.  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3de0: 75 67 67 2e 61 64 64 28 73 75 67 67 46 65 6d 53  ugg.add(suggFemS
3df0: 69 6e 67 28 73 46 6c 65 78 29 29 3b 0a 20 20 20  ing(sFlex));.   
3e00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3e10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
3e20: 66 20 28 61 53 75 67 67 2e 73 69 7a 65 20 3e 20  f (aSugg.size > 
3e30: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0) {.        ret
3e40: 75 72 6e 20 41 72 72 61 79 2e 66 72 6f 6d 28 61  urn Array.from(a
3e50: 53 75 67 67 29 2e 6a 6f 69 6e 28 22 7c 22 29 3b  Sugg).join("|");
3e60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
3e70: 6e 20 22 22 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  n "";.}..functio
3e80: 6e 20 73 77 69 74 63 68 50 6c 75 72 61 6c 20 28  n switchPlural (
3e90: 73 46 6c 65 78 29 20 7b 0a 20 20 20 20 6c 65 74  sFlex) {.    let
3ea0: 20 61 53 75 67 67 20 3d 20 6e 65 77 20 53 65 74   aSugg = new Set
3eb0: 28 29 3b 0a 20 20 20 20 66 6f 72 20 28 6c 65 74  ();.    for (let
3ec0: 20 73 4d 6f 72 70 68 20 6f 66 20 5f 64 41 6e 61   sMorph of _dAna
3ed0: 6c 79 73 65 73 2e 5f 67 65 74 28 73 46 6c 65 78  lyses._get(sFlex
3ee0: 2c 20 5b 5d 29 29 20 7b 20 2f 2f 20 77 65 20 64  , [])) { // we d
3ef0: 6f 6e e2 80 99 74 20 63 68 65 63 6b 20 69 66 20  on...t check if 
3f00: 77 6f 72 64 20 65 78 69 73 74 73 20 69 6e 20 5f  word exists in _
3f10: 64 41 6e 61 6c 79 73 65 73 2c 20 66 6f 72 20 69  dAnalyses, for i
3f20: 74 20 69 73 20 61 73 73 75 6d 65 64 20 69 74 20  t is assumed it 
3f30: 68 61 73 20 62 65 65 6e 20 64 6f 6e 65 20 62 65  has been done be
3f40: 66 6f 72 65 0a 20 20 20 20 20 20 20 20 69 66 20  fore.        if 
3f50: 28 73 4d 6f 72 70 68 2e 69 6e 63 6c 75 64 65 73  (sMorph.includes
3f60: 28 22 3a 73 22 29 29 20 7b 0a 20 20 20 20 20 20  (":s")) {.      
3f70: 20 20 20 20 20 20 61 53 75 67 67 2e 61 64 64 28        aSugg.add(
3f80: 73 75 67 67 50 6c 75 72 28 73 46 6c 65 78 29 29  suggPlur(sFlex))
3f90: 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
3fa0: 20 69 66 20 28 73 4d 6f 72 70 68 2e 69 6e 63 6c   if (sMorph.incl
3fb0: 75 64 65 73 28 22 3a 70 22 29 29 20 7b 0a 20 20  udes(":p")) {.  
3fc0: 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e            aSugg.
3fd0: 61 64 64 28 73 75 67 67 53 69 6e 67 28 73 46 6c  add(suggSing(sFl
3fe0: 65 78 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ex));.        }.
3ff0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 53      }.    if (aS
4000: 75 67 67 2e 73 69 7a 65 20 3e 20 30 29 20 7b 0a  ugg.size > 0) {.
4010: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 41          return A
4020: 72 72 61 79 2e 66 72 6f 6d 28 61 53 75 67 67 29  rray.from(aSugg)
4030: 2e 6a 6f 69 6e 28 22 7c 22 29 3b 0a 20 20 20 20  .join("|");.    
4040: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 3b  }.    return "";
4050: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 68 61 73  .}..function has
4060: 53 69 6d 69 6c 20 28 73 57 6f 72 64 2c 20 73 50  Simil (sWord, sP
4070: 61 74 74 65 72 6e 3d 6e 75 6c 6c 29 20 7b 0a 20  attern=null) {. 
4080: 20 20 20 72 65 74 75 72 6e 20 70 68 6f 6e 65 74     return phonet
4090: 2e 68 61 73 53 69 6d 69 6c 28 73 57 6f 72 64 2c  .hasSimil(sWord,
40a0: 20 73 50 61 74 74 65 72 6e 29 3b 0a 7d 0a 0a 66   sPattern);.}..f
40b0: 75 6e 63 74 69 6f 6e 20 73 75 67 67 53 69 6d 69  unction suggSimi
40c0: 6c 20 28 73 57 6f 72 64 2c 20 73 50 61 74 74 65  l (sWord, sPatte
40d0: 72 6e 29 20 7b 0a 20 20 20 20 2f 2f 20 72 65 74  rn) {.    // ret
40e0: 75 72 6e 20 6c 69 73 74 20 6f 66 20 77 6f 72 64  urn list of word
40f0: 73 20 70 68 6f 6e 65 74 69 63 61 6c 6c 79 20 73  s phonetically s
4100: 69 6d 69 6c 61 72 20 74 6f 20 73 57 6f 72 64 20  imilar to sWord 
4110: 61 6e 64 20 77 68 6f 6d 20 50 4f 53 20 69 73 20  and whom POS is 
4120: 6d 61 74 63 68 69 6e 67 20 73 50 61 74 74 65 72  matching sPatter
4130: 6e 0a 20 20 20 20 6c 65 74 20 61 53 75 67 67 20  n.    let aSugg 
4140: 3d 20 70 68 6f 6e 65 74 2e 73 65 6c 65 63 74 53  = phonet.selectS
4150: 69 6d 69 6c 28 73 57 6f 72 64 2c 20 73 50 61 74  imil(sWord, sPat
4160: 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 20 28  tern);.    for (
4170: 6c 65 74 20 73 4d 6f 72 70 68 20 6f 66 20 5f 64  let sMorph of _d
4180: 41 6e 61 6c 79 73 65 73 2e 5f 67 65 74 28 73 57  Analyses._get(sW
4190: 6f 72 64 2c 20 5b 5d 29 29 20 7b 0a 20 20 20 20  ord, [])) {.    
41a0: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 65 20 6f      for (let e o
41b0: 66 20 63 6f 6e 6a 2e 67 65 74 53 69 6d 69 6c 28  f conj.getSimil(
41c0: 73 57 6f 72 64 2c 20 73 4d 6f 72 70 68 29 29 20  sWord, sMorph)) 
41d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53  {.            aS
41e0: 75 67 67 2e 61 64 64 28 65 29 3b 20 0a 20 20 20  ugg.add(e); .   
41f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4200: 20 69 66 20 28 61 53 75 67 67 2e 73 69 7a 65 20   if (aSugg.size 
4210: 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 72  > 0) {.        r
4220: 65 74 75 72 6e 20 41 72 72 61 79 2e 66 72 6f 6d  eturn Array.from
4230: 28 61 53 75 67 67 29 2e 6a 6f 69 6e 28 22 7c 22  (aSugg).join("|"
4240: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
4250: 75 72 6e 20 22 22 3b 0a 7d 0a 0a 66 75 6e 63 74  urn "";.}..funct
4260: 69 6f 6e 20 73 75 67 67 43 65 4f 72 43 65 74 20  ion suggCeOrCet 
4270: 28 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 69 66  (sWord) {.    if
4280: 20 28 2f 5e 5b 61 65 c3 a9 c3 a8 c3 aa 69 6f 75   (/^[ae......iou
4290: 79 c3 a2 c3 ae c3 af 5d 2f 69 2e 74 65 73 74 28  y......]/i.test(
42a0: 73 57 6f 72 64 29 29 20 7b 0a 20 20 20 20 20 20  sWord)) {.      
42b0: 20 20 72 65 74 75 72 6e 20 22 63 65 74 22 3b 0a    return "cet";.
42c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 57      }.    if (sW
42d0: 6f 72 64 5b 30 5d 20 3d 3d 20 22 68 22 20 7c 7c  ord[0] == "h" ||
42e0: 20 73 57 6f 72 64 5b 30 5d 20 3d 3d 20 22 48 22   sWord[0] == "H"
42f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
4300: 72 6e 20 22 63 65 7c 63 65 74 22 3b 0a 20 20 20  rn "ce|cet";.   
4310: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 22 63   }.    return "c
4320: 65 22 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  e";.}..function 
4330: 73 75 67 67 4c 65 73 4c 61 20 28 73 57 6f 72 64  suggLesLa (sWord
4340: 29 20 7b 0a 20 20 20 20 2f 2f 20 77 65 20 64 6f  ) {.    // we do
4350: 6e e2 80 99 74 20 63 68 65 63 6b 20 69 66 20 77  n...t check if w
4360: 6f 72 64 20 65 78 69 73 74 73 20 69 6e 20 5f 64  ord exists in _d
4370: 41 6e 61 6c 79 73 65 73 2c 20 66 6f 72 20 69 74  Analyses, for it
4380: 20 69 73 20 61 73 73 75 6d 65 64 20 69 74 20 68   is assumed it h
4390: 61 73 20 62 65 65 6e 20 64 6f 6e 65 20 62 65 66  as been done bef
43a0: 6f 72 65 0a 20 20 20 20 69 66 20 28 5f 64 41 6e  ore.    if (_dAn
43b0: 61 6c 79 73 65 73 2e 5f 67 65 74 28 73 57 6f 72  alyses._get(sWor
43c0: 64 2c 20 5b 5d 29 2e 73 6f 6d 65 28 73 20 20 3d  d, []).some(s  =
43d0: 3e 20 20 73 2e 69 6e 63 6c 75 64 65 73 28 22 3a  >  s.includes(":
43e0: 70 22 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20  p"))) {.        
43f0: 72 65 74 75 72 6e 20 22 6c 65 73 7c 6c 61 22 3b  return "les|la";
4400: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4410: 6e 20 22 6c 61 22 3b 0a 7d 0a 0a 66 75 6e 63 74  n "la";.}..funct
4420: 69 6f 6e 20 66 6f 72 6d 61 74 4e 75 6d 62 65 72  ion formatNumber
4430: 20 28 73 29 20 7b 0a 20 20 20 20 6c 65 74 20 6e   (s) {.    let n
4440: 4c 65 6e 20 3d 20 73 2e 6c 65 6e 67 74 68 3b 0a  Len = s.length;.
4450: 20 20 20 20 69 66 20 28 6e 4c 65 6e 20 3c 20 34      if (nLen < 4
4460: 20 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74   ) {.        ret
4470: 75 72 6e 20 73 3b 0a 20 20 20 20 7d 0a 20 20 20  urn s;.    }.   
4480: 20 6c 65 74 20 73 52 65 73 20 3d 20 22 22 3b 0a   let sRes = "";.
4490: 20 20 20 20 2f 2f 20 6e 6f 6d 62 72 65 20 6f 72      // nombre or
44a0: 64 69 6e 61 69 72 65 0a 20 20 20 20 6c 65 74 20  dinaire.    let 
44b0: 6e 45 6e 64 20 3d 20 6e 4c 65 6e 3b 0a 20 20 20  nEnd = nLen;.   
44c0: 20 77 68 69 6c 65 20 28 6e 45 6e 64 20 3e 20 30   while (nEnd > 0
44d0: 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ) {.        let 
44e0: 6e 53 74 61 72 74 20 3d 20 4d 61 74 68 2e 6d 61  nStart = Math.ma
44f0: 78 28 6e 45 6e 64 2d 33 2c 20 30 29 3b 0a 20 20  x(nEnd-3, 0);.  
4500: 20 20 20 20 20 20 73 52 65 73 20 3d 20 73 52 65        sRes = sRe
4510: 73 20 3f 20 73 2e 73 6c 69 63 65 28 6e 53 74 61  s ? s.slice(nSta
4520: 72 74 2c 20 6e 45 6e 64 29 20 2b 20 22 e2 80 af  rt, nEnd) + "...
4530: 22 20 2b 20 73 52 65 73 20 3a 20 73 52 65 73 20  " + sRes : sRes 
4540: 3d 20 73 2e 73 6c 69 63 65 28 6e 53 74 61 72 74  = s.slice(nStart
4550: 2c 20 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  , nEnd);.       
4560: 20 6e 45 6e 64 20 3d 20 6e 45 6e 64 20 2d 20 33   nEnd = nEnd - 3
4570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f 20 62  ;.    }.    // b
4580: 69 6e 61 69 72 65 0a 20 20 20 20 69 66 20 28 2f  inaire.    if (/
4590: 5e 5b 30 31 5d 2b 24 2f 2e 74 65 73 74 28 73 29  ^[01]+$/.test(s)
45a0: 29 20 7b 0a 20 20 20 20 20 20 20 20 6e 45 6e 64  ) {.        nEnd
45b0: 20 3d 20 6e 4c 65 6e 3b 0a 20 20 20 20 20 20 20   = nLen;.       
45c0: 20 6c 65 74 20 73 42 69 6e 20 3d 20 22 22 3b 0a   let sBin = "";.
45d0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 6e          while (n
45e0: 45 6e 64 20 3e 20 30 29 20 7b 0a 20 20 20 20 20  End > 0) {.     
45f0: 20 20 20 20 20 20 20 6c 65 74 20 6e 53 74 61 72         let nStar
4600: 74 20 3d 20 4d 61 74 68 2e 6d 61 78 28 6e 45 6e  t = Math.max(nEn
4610: 64 2d 34 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  d-4, 0);.       
4620: 20 20 20 20 20 73 42 69 6e 20 3d 20 73 42 69 6e       sBin = sBin
4630: 20 3f 20 73 2e 73 6c 69 63 65 28 6e 53 74 61 72   ? s.slice(nStar
4640: 74 2c 20 6e 45 6e 64 29 20 2b 20 22 e2 80 af 22  t, nEnd) + "..."
4650: 20 2b 20 73 42 69 6e 20 3a 20 73 42 69 6e 20 3d   + sBin : sBin =
4660: 20 73 2e 73 6c 69 63 65 28 6e 53 74 61 72 74 2c   s.slice(nStart,
4670: 20 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20   nEnd);.        
4680: 20 20 20 20 6e 45 6e 64 20 3d 20 6e 45 6e 64 20      nEnd = nEnd 
4690: 2d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 4;.        }. 
46a0: 20 20 20 20 20 20 20 73 52 65 73 20 2b 3d 20 22         sRes += "
46b0: 7c 22 20 2b 20 73 42 69 6e 3b 0a 20 20 20 20 7d  |" + sBin;.    }
46c0: 0a 20 20 20 20 2f 2f 20 6e 75 6d c3 a9 72 6f 73  .    // num..ros
46d0: 20 64 65 20 74 c3 a9 6c c3 a9 70 68 6f 6e 65 0a   de t..l..phone.
46e0: 20 20 20 20 69 66 20 28 6e 4c 65 6e 20 3d 3d 20      if (nLen == 
46f0: 31 30 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66  10) {.        if
4700: 20 28 73 2e 73 74 61 72 74 73 57 69 74 68 28 22   (s.startsWith("
4710: 30 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  0")) {.         
4720: 20 20 20 73 52 65 73 20 2b 3d 20 22 7c 22 20 2b     sRes += "|" +
4730: 20 73 2e 73 6c 69 63 65 28 30 2c 32 29 20 2b 20   s.slice(0,2) + 
4740: 22 e2 80 af 22 20 2b 20 73 2e 73 6c 69 63 65 28  "..." + s.slice(
4750: 32 2c 34 29 20 2b 20 22 e2 80 af 22 20 2b 20 73  2,4) + "..." + s
4760: 2e 73 6c 69 63 65 28 34 2c 36 29 20 2b 20 22 e2  .slice(4,6) + ".
4770: 80 af 22 20 2b 20 73 2e 73 6c 69 63 65 28 36 2c  .." + s.slice(6,
4780: 38 29 20 2b 20 22 e2 80 af 22 20 2b 20 73 2e 73  8) + "..." + s.s
4790: 6c 69 63 65 28 38 29 3b 20 20 20 2f 2f 20 74 c3  lice(8);   // t.
47a0: a9 6c c3 a9 70 68 6f 6e 65 20 66 72 61 6e c3 a7  .l..phone fran..
47b0: 61 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ais.            
47c0: 69 66 20 28 73 5b 31 5d 20 3d 3d 20 22 34 22 20  if (s[1] == "4" 
47d0: 26 26 20 28 73 5b 32 5d 3d 3d 22 37 22 20 7c 7c  && (s[2]=="7" ||
47e0: 20 73 5b 32 5d 3d 3d 22 38 22 20 7c 7c 20 73 5b   s[2]=="8" || s[
47f0: 32 5d 3d 3d 22 39 22 29 29 20 7b 0a 20 20 20 20  2]=="9")) {.    
4800: 20 20 20 20 20 20 20 20 20 20 20 20 73 52 65 73              sRes
4810: 20 2b 3d 20 22 7c 22 20 2b 20 73 2e 73 6c 69 63   += "|" + s.slic
4820: 65 28 30 2c 34 29 20 2b 20 22 e2 80 af 22 20 2b  e(0,4) + "..." +
4830: 20 73 2e 73 6c 69 63 65 28 34 2c 36 29 20 2b 20   s.slice(4,6) + 
4840: 22 e2 80 af 22 20 2b 20 73 2e 73 6c 69 63 65 28  "..." + s.slice(
4850: 36 2c 38 29 20 2b 20 22 e2 80 af 22 20 2b 20 73  6,8) + "..." + s
4860: 2e 73 6c 69 63 65 28 38 29 3b 20 20 20 20 2f 2f  .slice(8);    //
4870: 20 6d 6f 62 69 6c 65 20 62 65 6c 67 65 0a 20 20   mobile belge.  
4880: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4890: 20 20 20 20 20 20 20 20 73 52 65 73 20 2b 3d 20          sRes += 
48a0: 22 7c 22 20 2b 20 73 2e 73 6c 69 63 65 28 30 2c  "|" + s.slice(0,
48b0: 33 29 20 2b 20 22 e2 80 af 22 20 2b 20 73 2e 73  3) + "..." + s.s
48c0: 6c 69 63 65 28 33 2c 36 29 20 2b 20 22 e2 80 af  lice(3,6) + "...
48d0: 22 20 2b 20 73 2e 73 6c 69 63 65 28 36 2c 38 29  " + s.slice(6,8)
48e0: 20 2b 20 22 e2 80 af 22 20 2b 20 73 2e 73 6c 69   + "..." + s.sli
48f0: 63 65 28 38 29 3b 20 20 20 20 20 20 20 20 2f 2f  ce(8);        //
4900: 20 74 c3 a9 6c c3 a9 70 68 6f 6e 65 20 73 75 69   t..l..phone sui
4910: 73 73 65 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sse.        }.  
4920: 20 20 20 20 20 20 73 52 65 73 20 2b 3d 20 22 7c        sRes += "|
4930: 22 20 2b 20 73 2e 73 6c 69 63 65 28 30 2c 34 29  " + s.slice(0,4)
4940: 20 2b 20 22 e2 80 af 22 20 2b 20 73 2e 73 6c 69   + "..." + s.sli
4950: 63 65 28 34 2c 37 29 20 2b 20 22 2d 22 20 2b 20  ce(4,7) + "-" + 
4960: 73 2e 73 6c 69 63 65 28 37 29 3b 20 20 20 20 20  s.slice(7);     
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74              // t
4990: c3 a9 6c c3 a9 70 68 6f 6e 65 20 63 61 6e 61 64  ..l..phone canad
49a0: 69 65 6e 20 6f 75 20 61 6d c3 a9 72 69 63 61 69  ien ou am..ricai
49b0: 6e 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  n.    } else if 
49c0: 28 6e 4c 65 6e 20 3d 3d 20 39 20 26 26 20 73 2e  (nLen == 9 && s.
49d0: 73 74 61 72 74 73 57 69 74 68 28 22 30 22 29 29  startsWith("0"))
49e0: 20 7b 0a 20 20 20 20 20 20 20 20 73 52 65 73 20   {.        sRes 
49f0: 2b 3d 20 22 7c 22 20 2b 20 73 2e 73 6c 69 63 65  += "|" + s.slice
4a00: 28 30 2c 33 29 20 2b 20 22 e2 80 af 22 20 2b 20  (0,3) + "..." + 
4a10: 73 2e 73 6c 69 63 65 28 33 2c 35 29 20 2b 20 22  s.slice(3,5) + "
4a20: e2 80 af 22 20 2b 20 73 2e 73 6c 69 63 65 28 35  ..." + s.slice(5
4a30: 2c 37 29 20 2b 20 22 e2 80 af 22 20 2b 20 73 2e  ,7) + "..." + s.
4a40: 73 6c 69 63 65 28 37 2c 39 29 3b 20 20 20 20 20  slice(7,9);     
4a50: 20 20 20 20 20 2f 2f 20 66 69 78 65 20 62 65 6c       // fixe bel
4a60: 67 65 20 31 0a 20 20 20 20 20 20 20 20 73 52 65  ge 1.        sRe
4a70: 73 20 2b 3d 20 22 7c 22 20 2b 20 73 2e 73 6c 69  s += "|" + s.sli
4a80: 63 65 28 30 2c 32 29 20 2b 20 22 e2 80 af 22 20  ce(0,2) + "..." 
4a90: 2b 20 73 2e 73 6c 69 63 65 28 32 2c 35 29 20 2b  + s.slice(2,5) +
4aa0: 20 22 e2 80 af 22 20 2b 20 73 2e 73 6c 69 63 65   "..." + s.slice
4ab0: 28 35 2c 37 29 20 2b 20 22 e2 80 af 22 20 2b 20  (5,7) + "..." + 
4ac0: 73 2e 73 6c 69 63 65 28 37 2c 39 29 3b 20 20 20  s.slice(7,9);   
4ad0: 20 20 20 20 20 20 20 2f 2f 20 66 69 78 65 20 62         // fixe b
4ae0: 65 6c 67 65 20 32 0a 20 20 20 20 7d 0a 20 20 20  elge 2.    }.   
4af0: 20 72 65 74 75 72 6e 20 73 52 65 73 3b 0a 7d 0a   return sRes;.}.
4b00: 0a 66 75 6e 63 74 69 6f 6e 20 66 6f 72 6d 61 74  .function format
4b10: 4e 46 20 28 73 29 20 7b 0a 20 20 20 20 74 72 79  NF (s) {.    try
4b20: 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d   {.        let m
4b30: 20 3d 20 2f 4e 46 5b 20 c2 a0 2d 5d 3f 28 43 7c   = /NF[ ..-]?(C|
4b40: 45 7c 50 7c 51 7c 53 7c 58 7c 5a 7c 45 4e 28 3f  E|P|Q|S|X|Z|EN(?
4b50: 3a 5b 20 c2 a0 2d 5d 49 53 4f 7c 29 29 5b 20 c2  :[ ..-]ISO|))[ .
4b60: a0 2d 5d 3f 28 5b 30 2d 39 5d 2b 28 3f 3a 5b 5c  .-]?([0-9]+(?:[\
4b70: 2f e2 80 91 2d 5d 5b 30 2d 39 5d 2b 7c 29 29 2f  /...-][0-9]+|))/
4b80: 69 2e 65 78 65 63 28 73 29 3b 0a 20 20 20 20 20  i.exec(s);.     
4b90: 20 20 20 69 66 20 28 21 6d 29 20 7b 0a 20 20 20     if (!m) {.   
4ba0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
4bb0: 22 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  "";.        }.  
4bc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 4e 46        return "NF
4bd0: c2 a0 22 20 2b 20 6d 5b 31 5d 2e 74 6f 55 70 70  .." + m[1].toUpp
4be0: 65 72 43 61 73 65 28 29 2e 72 65 70 6c 61 63 65  erCase().replace
4bf0: 28 2f 20 2f 67 2c 20 22 c2 a0 22 29 2e 72 65 70  (/ /g, "..").rep
4c00: 6c 61 63 65 28 2f 2d 2f 67 2c 20 22 c2 a0 22 29  lace(/-/g, "..")
4c10: 20 2b 20 22 c2 a0 22 20 2b 20 6d 5b 32 5d 2e 72   + ".." + m[2].r
4c20: 65 70 6c 61 63 65 28 2f 5c 2f 2f 67 2c 20 22 e2  eplace(/\//g, ".
4c30: 80 91 22 29 2e 72 65 70 6c 61 63 65 28 2f 2d 2f  ..").replace(/-/
4c40: 67 2c 20 22 e2 80 91 22 29 3b 0a 20 20 20 20 7d  g, "...");.    }
4c50: 0a 20 20 20 20 63 61 74 63 68 20 28 65 29 20 7b  .    catch (e) {
4c60: 0a 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 73  .        helpers
4c70: 2e 6c 6f 67 65 72 72 6f 72 28 65 29 3b 0a 20 20  .logerror(e);.  
4c80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 23 20        return "# 
4c90: 65 72 72 65 75 72 20 23 22 3b 0a 20 20 20 20 7d  erreur #";.    }
4ca0: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 75 6e 64  .}..function und
4cb0: 6f 4c 69 67 61 74 75 72 65 20 28 63 29 20 7b 0a  oLigature (c) {.
4cc0: 20 20 20 20 69 66 20 28 63 20 3d 3d 20 22 ef ac      if (c == "..
4cd0: 81 22 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  .") {.        re
4ce0: 74 75 72 6e 20 22 66 69 22 3b 0a 20 20 20 20 7d  turn "fi";.    }
4cf0: 20 65 6c 73 65 20 69 66 20 28 63 20 3d 3d 20 22   else if (c == "
4d00: ef ac 82 22 29 20 7b 0a 20 20 20 20 20 20 20 20  ...") {.        
4d10: 72 65 74 75 72 6e 20 22 66 6c 22 3b 0a 20 20 20  return "fl";.   
4d20: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 20 3d 3d   } else if (c ==
4d30: 20 22 ef ac 80 22 29 20 7b 0a 20 20 20 20 20 20   "...") {.      
4d40: 20 20 72 65 74 75 72 6e 20 22 66 66 22 3b 0a 20    return "ff";. 
4d50: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 20     } else if (c 
4d60: 3d 3d 20 22 ef ac 83 22 29 20 7b 0a 20 20 20 20  == "...") {.    
4d70: 20 20 20 20 72 65 74 75 72 6e 20 22 66 66 69 22      return "ffi"
4d80: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
4d90: 28 63 20 3d 3d 20 22 ef ac 84 22 29 20 7b 0a 20  (c == "...") {. 
4da0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 66         return "f
4db0: 66 6c 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  fl";.    } else 
4dc0: 69 66 20 28 63 20 3d 3d 20 22 ef ac 85 22 29 20  if (c == "...") 
4dd0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4de0: 20 22 66 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73   "ft";.    } els
4df0: 65 20 69 66 20 28 63 20 3d 3d 20 22 ef ac 86 22  e if (c == "..."
4e00: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
4e10: 72 6e 20 22 73 74 22 3b 0a 20 20 20 20 7d 0a 20  rn "st";.    }. 
4e20: 20 20 20 72 65 74 75 72 6e 20 22 5f 22 3b 0a 7d     return "_";.}
4e30: 0a                                               .