Grammalecte  Hex Artifact Content

Artifact f9dd570de62dfd73860df03252a0a7c008cd9c41a1d284c99dfeaf9e3e2b2743:


0000: 2f 2f 2f 2f 20 49 42 44 41 57 47 0a 2f 2a 6a 73  //// IBDAWG./*js
0010: 6c 69 6e 74 20 65 73 76 65 72 73 69 6f 6e 3a 20  lint esversion: 
0020: 36 2a 2f 0a 2f 2a 67 6c 6f 62 61 6c 20 63 6f 6e  6*/./*global con
0030: 73 6f 6c 65 2c 72 65 71 75 69 72 65 2c 65 78 70  sole,require,exp
0040: 6f 72 74 73 2a 2f 0a 0a 22 75 73 65 20 73 74 72  orts*/.."use str
0050: 69 63 74 22 3b 0a 0a 0a 69 66 20 28 74 79 70 65  ict";...if (type
0060: 6f 66 28 72 65 71 75 69 72 65 29 20 21 3d 3d 20  of(require) !== 
0070: 27 75 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a 20  'undefined') {. 
0080: 20 20 20 76 61 72 20 73 74 72 5f 74 72 61 6e 73     var str_trans
0090: 66 6f 72 6d 20 3d 20 72 65 71 75 69 72 65 28 22  form = require("
00a0: 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d  resource://gramm
00b0: 61 6c 65 63 74 65 2f 73 74 72 5f 74 72 61 6e 73  alecte/str_trans
00c0: 66 6f 72 6d 2e 6a 73 22 29 3b 0a 20 20 20 20 76  form.js");.    v
00d0: 61 72 20 68 65 6c 70 65 72 73 20 3d 20 72 65 71  ar helpers = req
00e0: 75 69 72 65 28 22 72 65 73 6f 75 72 63 65 3a 2f  uire("resource:/
00f0: 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f 68 65 6c  /grammalecte/hel
0100: 70 65 72 73 2e 6a 73 22 29 3b 0a 20 20 20 20 76  pers.js");.    v
0110: 61 72 20 63 68 61 72 5f 70 6c 61 79 65 72 20 3d  ar char_player =
0120: 20 72 65 71 75 69 72 65 28 22 72 65 73 6f 75 72   require("resour
0130: 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65  ce://grammalecte
0140: 2f 63 68 61 72 5f 70 6c 61 79 65 72 2e 6a 73 22  /char_player.js"
0150: 29 3b 0a 7d 0a 0a 0a 2f 2f 20 44 6f 6e e2 80 99  );.}...// Don...
0160: 74 20 72 65 6d 6f 76 65 20 3c 73 74 72 69 6e 67  t remove <string
0170: 3e 2e 20 4e 65 63 65 73 73 61 72 79 20 69 6e 20  >. Necessary in 
0180: 54 42 2e 0a 24 7b 73 74 72 69 6e 67 7d 0a 24 7b  TB..${string}.${
0190: 6d 61 70 7d 0a 24 7b 73 65 74 7d 0a 0a 0a 63 6c  map}.${set}...cl
01a0: 61 73 73 20 49 42 44 41 57 47 20 7b 0a 20 20 20  ass IBDAWG {.   
01b0: 20 2f 2f 20 49 4e 44 45 58 41 42 4c 45 20 42 49   // INDEXABLE BI
01c0: 4e 41 52 59 20 44 49 52 45 43 54 20 41 43 59 43  NARY DIRECT ACYC
01d0: 4c 49 43 20 57 4f 52 44 20 47 52 41 50 48 0a 0a  LIC WORD GRAPH..
01e0: 20 20 20 20 63 6f 6e 73 74 72 75 63 74 6f 72 20      constructor 
01f0: 28 73 44 69 63 4e 61 6d 65 2c 20 73 50 61 74 68  (sDicName, sPath
0200: 3d 22 22 29 20 7b 0a 20 20 20 20 20 20 20 20 74  ="") {.        t
0210: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
0220: 20 6c 65 74 20 73 55 52 4c 20 3d 20 28 73 50 61   let sURL = (sPa
0230: 74 68 20 21 3d 3d 20 22 22 29 20 3f 20 73 50 61  th !== "") ? sPa
0240: 74 68 20 2b 20 22 2f 22 20 2b 20 73 44 69 63 4e  th + "/" + sDicN
0250: 61 6d 65 20 3a 20 22 72 65 73 6f 75 72 63 65 3a  ame : "resource:
0260: 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f 5f 64  //grammalecte/_d
0270: 69 63 74 69 6f 6e 61 72 69 65 73 2f 22 2b 73 44  ictionaries/"+sD
0280: 69 63 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  icName;.        
0290: 20 20 20 20 63 6f 6e 73 74 20 64 69 63 74 20 3d      const dict =
02a0: 20 4a 53 4f 4e 2e 70 61 72 73 65 28 68 65 6c 70   JSON.parse(help
02b0: 65 72 73 2e 6c 6f 61 64 46 69 6c 65 28 73 55 52  ers.loadFile(sUR
02c0: 4c 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  L));.           
02d0: 20 4f 62 6a 65 63 74 2e 61 73 73 69 67 6e 28 74   Object.assign(t
02e0: 68 69 73 2c 20 64 69 63 74 29 3b 0a 20 20 20 20  his, dict);.    
02f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
0300: 74 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20  tch (e) {.      
0310: 20 20 20 20 20 20 74 68 72 6f 77 20 45 72 72 6f        throw Erro
0320: 72 28 22 23 20 45 72 72 6f 72 2e 20 46 69 6c 65  r("# Error. File
0330: 20 6e 6f 74 20 66 6f 75 6e 64 20 6f 72 20 6e 6f   not found or no
0340: 74 20 6c 6f 61 64 61 62 6c 65 2e 5c 6e 22 20 2b  t loadable.\n" +
0350: 20 65 2e 6d 65 73 73 61 67 65 20 2b 20 22 5c 6e   e.message + "\n
0360: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
0370: 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
0380: 20 20 20 20 20 50 72 6f 70 65 72 74 69 65 73 3a       Properties:
0390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 4e 61  .            sNa
03a0: 6d 65 2c 20 6e 56 65 72 73 69 6f 6e 2c 20 73 48  me, nVersion, sH
03b0: 65 61 64 65 72 2c 20 6c 41 72 63 56 61 6c 2c 20  eader, lArcVal, 
03c0: 6e 41 72 63 56 61 6c 2c 20 62 79 44 69 63 2c 20  nArcVal, byDic, 
03d0: 73 4c 61 6e 67 2c 20 6e 43 68 61 72 2c 20 6e 42  sLang, nChar, nB
03e0: 79 74 65 73 41 72 63 2c 20 6e 42 79 74 65 73 4e  ytesArc, nBytesN
03f0: 6f 64 65 41 64 64 72 65 73 73 2c 0a 20 20 20 20  odeAddress,.    
0400: 20 20 20 20 20 20 20 20 6e 45 6e 74 72 69 65 73          nEntries
0410: 2c 20 6e 4e 6f 64 65 2c 20 6e 41 72 63 2c 20 6e  , nNode, nArc, n
0420: 41 66 66 2c 20 63 53 74 65 6d 6d 69 6e 67 2c 20  Aff, cStemming, 
0430: 6e 54 61 67 2c 20 64 43 68 61 72 2c 20 5f 61 72  nTag, dChar, _ar
0440: 63 4d 61 73 6b 2c 20 5f 66 69 6e 61 6c 4e 6f 64  cMask, _finalNod
0450: 65 4d 61 73 6b 2c 20 5f 6c 61 73 74 41 72 63 4d  eMask, _lastArcM
0460: 61 73 6b 2c 20 5f 61 64 64 72 42 69 74 4d 61 73  ask, _addrBitMas
0470: 6b 2c 20 6e 42 79 74 65 73 4f 66 66 73 65 74 2c  k, nBytesOffset,
0480: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 0a 20 20 20  .        */..   
0490: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20       /*.        
04a0: 20 20 20 20 42 75 67 20 77 6f 72 6b 61 72 6f 75      Bug workarou
04b0: 6e 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  nd..            
04c0: 4d 6f 7a 69 6c 6c 61 e2 80 99 73 20 4a 53 20 70  Mozilla...s JS p
04d0: 61 72 73 65 72 20 73 75 63 6b 73 2e 20 43 61 6e  arser sucks. Can
04e0: e2 80 99 74 20 72 65 61 64 20 66 69 6c 65 20 62  ...t read file b
04f0: 69 67 67 65 72 20 74 68 61 6e 20 34 20 4d 62 21  igger than 4 Mb!
0500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 6f 20  .            So 
0510: 77 65 20 63 6f 6e 76 65 72 74 20 68 75 67 65 20  we convert huge 
0520: 68 65 78 61 64 65 63 69 6d 61 6c 20 73 74 72 69  hexadecimal stri
0530: 6e 67 20 74 6f 20 6c 69 73 74 20 6f 66 20 6e 75  ng to list of nu
0540: 6d 62 65 72 73 e2 80 a6 0a 20 20 20 20 20 20 20  mbers....       
0550: 20 20 20 20 20 68 74 74 70 73 3a 2f 2f 67 69 74       https://git
0560: 68 75 62 2e 63 6f 6d 2f 6d 6f 7a 69 6c 6c 61 2f  hub.com/mozilla/
0570: 61 64 64 6f 6e 73 2d 6c 69 6e 74 65 72 2f 69 73  addons-linter/is
0580: 73 75 65 73 2f 31 33 36 31 0a 20 20 20 20 20 20  sues/1361.      
0590: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 65 74    */.        let
05a0: 20 6c 54 65 6d 70 20 3d 20 5b 5d 3b 0a 20 20 20   lTemp = [];.   
05b0: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 69 20       for (let i 
05c0: 3d 20 30 3b 20 20 69 20 3c 20 74 68 69 73 2e 62  = 0;  i < this.b
05d0: 79 44 69 63 2e 6c 65 6e 67 74 68 3b 20 20 69 2b  yDic.length;  i+
05e0: 3d 32 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  =2) {.          
05f0: 20 20 6c 54 65 6d 70 2e 70 75 73 68 28 70 61 72    lTemp.push(par
0600: 73 65 49 6e 74 28 74 68 69 73 2e 62 79 44 69 63  seInt(this.byDic
0610: 2e 73 6c 69 63 65 28 69 2c 20 69 2b 32 29 2c 20  .slice(i, i+2), 
0620: 31 36 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  16));.        }.
0630: 20 20 20 20 20 20 20 20 74 68 69 73 2e 62 79 44          this.byD
0640: 69 63 20 3d 20 6c 54 65 6d 70 3b 0a 20 20 20 20  ic = lTemp;.    
0650: 20 20 20 20 2f 2a 20 65 6e 64 20 6f 66 20 62 75      /* end of bu
0660: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 20 2a 2f 0a  g workaround */.
0670: 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 74 68  .        if (!th
0680: 69 73 2e 73 48 65 61 64 65 72 2e 73 74 61 72 74  is.sHeader.start
0690: 73 57 69 74 68 28 22 2f 70 79 66 73 61 2f 22 29  sWith("/pyfsa/")
06a0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
06b0: 74 68 72 6f 77 20 54 79 70 65 45 72 72 6f 72 28  throw TypeError(
06c0: 22 23 20 45 72 72 6f 72 2e 20 4e 6f 74 20 61 20  "# Error. Not a 
06d0: 70 79 66 73 61 20 62 69 6e 61 72 79 20 64 69 63  pyfsa binary dic
06e0: 74 69 6f 6e 61 72 79 2e 20 48 65 61 64 65 72 3a  tionary. Header:
06f0: 20 22 20 2b 20 74 68 69 73 2e 73 48 65 61 64 65   " + this.sHeade
0700: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
0710: 20 20 20 20 20 20 69 66 20 28 21 28 74 68 69 73        if (!(this
0720: 2e 6e 56 65 72 73 69 6f 6e 20 3d 3d 20 22 31 22  .nVersion == "1"
0730: 20 7c 7c 20 74 68 69 73 2e 6e 56 65 72 73 69 6f   || this.nVersio
0740: 6e 20 3d 3d 20 22 32 22 20 7c 7c 20 74 68 69 73  n == "2" || this
0750: 2e 6e 56 65 72 73 69 6f 6e 20 3d 3d 20 22 33 22  .nVersion == "3"
0760: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
0770: 20 74 68 72 6f 77 20 52 61 6e 67 65 45 72 72 6f   throw RangeErro
0780: 72 28 22 23 20 45 72 72 6f 72 2e 20 55 6e 6b 6e  r("# Error. Unkn
0790: 6f 77 6e 20 64 69 63 74 69 6f 6e 61 72 79 20 76  own dictionary v
07a0: 65 72 73 69 6f 6e 3a 20 22 20 2b 20 74 68 69 73  ersion: " + this
07b0: 2e 6e 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20  .nVersion);.    
07c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f      }.        //
07d0: 20 3c 64 43 68 61 72 3e 20 74 6f 20 67 65 74 20   <dChar> to get 
07e0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20  the value of an 
07f0: 61 72 63 2c 20 3c 64 43 68 61 72 56 61 6c 3e 20  arc, <dCharVal> 
0800: 74 6f 20 67 65 74 20 74 68 65 20 63 68 61 72 20  to get the char 
0810: 6f 66 20 61 6e 20 61 72 63 20 77 69 74 68 20 69  of an arc with i
0820: 74 73 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  ts value.       
0830: 20 74 68 69 73 2e 64 43 68 61 72 20 3d 20 68 65   this.dChar = he
0840: 6c 70 65 72 73 2e 6f 62 6a 65 63 74 54 6f 4d 61  lpers.objectToMa
0850: 70 28 74 68 69 73 2e 64 43 68 61 72 29 3b 0a 20  p(this.dChar);. 
0860: 20 20 20 20 20 20 20 74 68 69 73 2e 64 43 68 61         this.dCha
0870: 72 56 61 6c 20 3d 20 74 68 69 73 2e 64 43 68 61  rVal = this.dCha
0880: 72 2e 67 6c 5f 72 65 76 65 72 73 65 28 29 3b 0a  r.gl_reverse();.
0890: 20 20 20 20 20 20 20 20 2f 2f 74 68 69 73 2e 62          //this.b
08a0: 79 44 69 63 20 3d 20 6e 65 77 20 55 69 6e 74 38  yDic = new Uint8
08b0: 41 72 72 61 79 28 74 68 69 73 2e 62 79 44 69 63  Array(this.byDic
08c0: 29 3b 20 20 2f 2f 20 6e 6f 74 20 71 75 69 63 6b  );  // not quick
08d0: 65 72 2c 20 65 76 65 6e 20 73 6c 6f 77 65 72 0a  er, even slower.
08e0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68 69  .        if (thi
08f0: 73 2e 63 53 74 65 6d 6d 69 6e 67 20 3d 3d 20 22  s.cStemming == "
0900: 53 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  S") {.          
0910: 20 20 74 68 69 73 2e 66 75 6e 63 53 74 65 6d 6d    this.funcStemm
0920: 69 6e 67 20 3d 20 73 74 72 5f 74 72 61 6e 73 66  ing = str_transf
0930: 6f 72 6d 2e 67 65 74 53 74 65 6d 46 72 6f 6d 53  orm.getStemFromS
0940: 75 66 66 69 78 43 6f 64 65 3b 0a 20 20 20 20 20  uffixCode;.     
0950: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 74 68     } else if (th
0960: 69 73 2e 63 53 74 65 6d 6d 69 6e 67 20 3d 3d 20  is.cStemming == 
0970: 22 41 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  "A") {.         
0980: 20 20 20 74 68 69 73 2e 66 75 6e 63 53 74 65 6d     this.funcStem
0990: 6d 69 6e 67 20 3d 20 73 74 72 5f 74 72 61 6e 73  ming = str_trans
09a0: 66 6f 72 6d 2e 67 65 74 53 74 65 6d 46 72 6f 6d  form.getStemFrom
09b0: 41 66 66 69 78 43 6f 64 65 3b 0a 20 20 20 20 20  AffixCode;.     
09c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
09d0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 66 75 6e          this.fun
09e0: 63 53 74 65 6d 6d 69 6e 67 20 3d 20 73 74 72 5f  cStemming = str_
09f0: 74 72 61 6e 73 66 6f 72 6d 2e 6e 6f 53 74 65 6d  transform.noStem
0a00: 6d 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ming;.        }.
0a10: 0a 20 20 20 20 20 20 20 20 2f 2f 20 43 6f 6e 66  .        // Conf
0a20: 69 67 75 72 69 6e 67 20 44 41 57 47 20 66 75 6e  iguring DAWG fun
0a30: 63 74 69 6f 6e 73 20 61 63 63 6f 72 64 69 6e 67  ctions according
0a40: 20 74 6f 20 6e 56 65 72 73 69 6f 6e 0a 20 20 20   to nVersion.   
0a50: 20 20 20 20 20 73 77 69 74 63 68 20 28 74 68 69       switch (thi
0a60: 73 2e 6e 56 65 72 73 69 6f 6e 29 20 7b 0a 20 20  s.nVersion) {.  
0a70: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 31            case 1
0a80: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
0a90: 20 20 74 68 69 73 2e 6d 6f 72 70 68 20 3d 20 74    this.morph = t
0aa0: 68 69 73 2e 5f 6d 6f 72 70 68 31 3b 0a 20 20 20  his._morph1;.   
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
0ac0: 73 2e 73 74 65 6d 20 3d 20 74 68 69 73 2e 5f 73  s.stem = this._s
0ad0: 74 65 6d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  tem1;.          
0ae0: 20 20 20 20 20 20 74 68 69 73 2e 5f 6c 6f 6f 6b        this._look
0af0: 75 70 41 72 63 4e 6f 64 65 20 3d 20 74 68 69 73  upArcNode = this
0b00: 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 31  ._lookupArcNode1
0b10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0b20: 20 20 74 68 69 73 2e 5f 67 65 74 41 72 63 73 20    this._getArcs 
0b30: 3d 20 74 68 69 73 2e 5f 67 65 74 41 72 63 73 31  = this._getArcs1
0b40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0b50: 20 20 74 68 69 73 2e 5f 77 72 69 74 65 4e 6f 64    this._writeNod
0b60: 65 73 20 3d 20 74 68 69 73 2e 5f 77 72 69 74 65  es = this._write
0b70: 4e 6f 64 65 73 31 3b 0a 20 20 20 20 20 20 20 20  Nodes1;.        
0b80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0b90: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
0ba0: 32 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2:.             
0bb0: 20 20 20 74 68 69 73 2e 6d 6f 72 70 68 20 3d 20     this.morph = 
0bc0: 74 68 69 73 2e 5f 6d 6f 72 70 68 32 3b 0a 20 20  this._morph2;.  
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
0be0: 69 73 2e 73 74 65 6d 20 3d 20 74 68 69 73 2e 5f  is.stem = this._
0bf0: 73 74 65 6d 32 3b 0a 20 20 20 20 20 20 20 20 20  stem2;.         
0c00: 20 20 20 20 20 20 20 74 68 69 73 2e 5f 6c 6f 6f         this._loo
0c10: 6b 75 70 41 72 63 4e 6f 64 65 20 3d 20 74 68 69  kupArcNode = thi
0c20: 73 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65  s._lookupArcNode
0c30: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
0c40: 20 20 20 74 68 69 73 2e 5f 67 65 74 41 72 63 73     this._getArcs
0c50: 20 3d 20 74 68 69 73 2e 5f 67 65 74 41 72 63 73   = this._getArcs
0c60: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
0c70: 20 20 20 74 68 69 73 2e 5f 77 72 69 74 65 4e 6f     this._writeNo
0c80: 64 65 73 20 3d 20 74 68 69 73 2e 5f 77 72 69 74  des = this._writ
0c90: 65 4e 6f 64 65 73 32 3b 0a 20 20 20 20 20 20 20  eNodes2;.       
0ca0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
0cc0: 20 33 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20   3:.            
0cd0: 20 20 20 20 74 68 69 73 2e 6d 6f 72 70 68 20 3d      this.morph =
0ce0: 20 74 68 69 73 2e 5f 6d 6f 72 70 68 33 3b 0a 20   this._morph3;. 
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
0d00: 68 69 73 2e 73 74 65 6d 20 3d 20 74 68 69 73 2e  his.stem = this.
0d10: 5f 73 74 65 6d 33 3b 0a 20 20 20 20 20 20 20 20  _stem3;.        
0d20: 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 6c 6f          this._lo
0d30: 6f 6b 75 70 41 72 63 4e 6f 64 65 20 3d 20 74 68  okupArcNode = th
0d40: 69 73 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64  is._lookupArcNod
0d50: 65 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e3;.            
0d60: 20 20 20 20 74 68 69 73 2e 5f 67 65 74 41 72 63      this._getArc
0d70: 73 20 3d 20 74 68 69 73 2e 5f 67 65 74 41 72 63  s = this._getArc
0d80: 73 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s3;.            
0d90: 20 20 20 20 74 68 69 73 2e 5f 77 72 69 74 65 4e      this._writeN
0da0: 6f 64 65 73 20 3d 20 74 68 69 73 2e 5f 77 72 69  odes = this._wri
0db0: 74 65 4e 6f 64 65 73 33 3b 0a 20 20 20 20 20 20  teNodes3;.      
0dc0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
0dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66  .            def
0de0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ault:.          
0df0: 20 20 20 20 20 20 74 68 72 6f 77 20 56 61 6c 75        throw Valu
0e00: 65 45 72 72 6f 72 28 22 23 20 45 72 72 6f 72 3a  eError("# Error:
0e10: 20 75 6e 6b 6e 6f 77 6e 20 63 6f 64 65 3a 20 22   unknown code: "
0e20: 20 2b 20 74 68 69 73 2e 6e 56 65 72 73 69 6f 6e   + this.nVersion
0e30: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
0e40: 20 20 20 20 20 2f 2f 63 6f 6e 73 6f 6c 65 2e 6c       //console.l
0e50: 6f 67 28 74 68 69 73 2e 67 65 74 49 6e 66 6f 28  og(this.getInfo(
0e60: 29 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73  ));.        this
0e70: 2e 62 4f 70 74 4e 75 6d 53 69 67 6c 65 20 3d 20  .bOptNumSigle = 
0e80: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 74 68  true;.        th
0e90: 69 73 2e 62 4f 70 74 4e 75 6d 41 74 4c 61 73 74  is.bOptNumAtLast
0ea0: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a   = false;.    }.
0eb0: 0a 20 20 20 20 67 65 74 49 6e 66 6f 20 28 29 20  .    getInfo () 
0ec0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
0ed0: 20 20 60 20 20 4c 61 6e 67 75 61 67 65 3a 20 24    `  Language: $
0ee0: 7b 74 68 69 73 2e 73 4c 61 6e 67 7d 20 20 20 20  {this.sLang}    
0ef0: 20 20 56 65 72 73 69 6f 6e 3a 20 24 7b 74 68 69    Version: ${thi
0f00: 73 2e 6e 56 65 72 73 69 6f 6e 7d 20 20 20 20 20  s.nVersion}     
0f10: 20 53 74 65 6d 6d 69 6e 67 3a 20 24 7b 74 68 69   Stemming: ${thi
0f20: 73 2e 63 53 74 65 6d 6d 69 6e 67 7d 46 58 5c 6e  s.cStemming}FX\n
0f30: 60 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ` +.            
0f40: 20 20 20 20 60 20 20 41 72 63 73 20 76 61 6c 75      `  Arcs valu
0f50: 65 73 3a 20 20 24 7b 74 68 69 73 2e 6e 41 72 63  es:  ${this.nArc
0f60: 56 61 6c 7d 20 3d 20 24 7b 74 68 69 73 2e 6e 43  Val} = ${this.nC
0f70: 68 61 72 7d 20 63 68 61 72 61 63 74 65 72 73 2c  har} characters,
0f80: 20 20 24 7b 74 68 69 73 2e 6e 41 66 66 7d 20 61    ${this.nAff} a
0f90: 66 66 69 78 65 73 2c 20 20 24 7b 74 68 69 73 2e  ffixes,  ${this.
0fa0: 6e 54 61 67 7d 20 74 61 67 73 5c 6e 60 20 2b 0a  nTag} tags\n` +.
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 60 20 20 44 69 63 74 69 6f 6e 61 72 79 3a 20 24  `  Dictionary: $
0fd0: 7b 74 68 69 73 2e 6e 45 6e 74 72 69 65 73 7d 20  {this.nEntries} 
0fe0: 65 6e 74 72 69 65 73 2c 20 20 20 20 24 7b 74 68  entries,    ${th
0ff0: 69 73 2e 6e 4e 6f 64 65 7d 20 6e 6f 64 65 73 2c  is.nNode} nodes,
1000: 20 20 20 24 7b 74 68 69 73 2e 6e 41 72 63 7d 20     ${this.nArc} 
1010: 61 72 63 73 5c 6e 60 20 2b 0a 20 20 20 20 20 20  arcs\n` +.      
1020: 20 20 20 20 20 20 20 20 20 20 60 20 20 41 64 64            `  Add
1030: 72 65 73 73 20 73 69 7a 65 3a 20 24 7b 74 68 69  ress size: ${thi
1040: 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41 64 64 72  s.nBytesNodeAddr
1050: 65 73 73 7d 20 62 79 74 65 73 2c 20 20 41 72 63  ess} bytes,  Arc
1060: 20 73 69 7a 65 3a 20 24 7b 74 68 69 73 2e 6e 42   size: ${this.nB
1070: 79 74 65 73 41 72 63 7d 20 62 79 74 65 73 5c 6e  ytesArc} bytes\n
1080: 60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73  `;.    }..    is
1090: 56 61 6c 69 64 54 6f 6b 65 6e 20 28 73 54 6f 6b  ValidToken (sTok
10a0: 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  en) {.        //
10b0: 20 63 68 65 63 6b 73 20 69 66 20 73 54 6f 6b 65   checks if sToke
10c0: 6e 20 69 73 20 76 61 6c 69 64 20 28 69 66 20 74  n is valid (if t
10d0: 68 65 72 65 20 69 73 20 68 79 70 68 65 6e 73 20  here is hyphens 
10e0: 69 6e 20 73 54 6f 6b 65 6e 2c 20 73 54 6f 6b 65  in sToken, sToke
10f0: 6e 20 69 73 20 73 70 6c 69 74 2c 20 65 61 63 68  n is split, each
1100: 20 70 61 72 74 20 69 73 20 63 68 65 63 6b 65 64   part is checked
1110: 29 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68  ).        if (th
1120: 69 73 2e 69 73 56 61 6c 69 64 28 73 54 6f 6b 65  is.isValid(sToke
1130: 6e 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n)) {.          
1140: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20    return true;. 
1150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1160: 20 69 66 20 28 73 54 6f 6b 65 6e 2e 69 6e 63 6c   if (sToken.incl
1170: 75 64 65 73 28 22 2d 22 29 29 20 7b 0a 20 20 20  udes("-")) {.   
1180: 20 20 20 20 20 20 20 20 20 69 66 20 28 73 54 6f           if (sTo
1190: 6b 65 6e 2e 67 6c 5f 63 6f 75 6e 74 28 22 2d 22  ken.gl_count("-"
11a0: 29 20 3e 20 34 29 20 7b 0a 20 20 20 20 20 20 20  ) > 4) {.       
11b0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11c0: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  true;.          
11d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
11e0: 72 65 74 75 72 6e 20 73 54 6f 6b 65 6e 2e 73 70  return sToken.sp
11f0: 6c 69 74 28 22 2d 22 29 2e 65 76 65 72 79 28 73  lit("-").every(s
1200: 57 6f 72 64 20 20 3d 3e 20 20 74 68 69 73 2e 69  Word  =>  this.i
1210: 73 56 61 6c 69 64 28 73 57 6f 72 64 29 29 3b 20  sValid(sWord)); 
1220: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1230: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
1240: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 56 61  .    }..    isVa
1250: 6c 69 64 20 28 73 57 6f 72 64 29 20 7b 0a 20 20  lid (sWord) {.  
1260: 20 20 20 20 20 20 2f 2f 20 63 68 65 63 6b 73 20        // checks 
1270: 69 66 20 73 57 6f 72 64 20 69 73 20 76 61 6c 69  if sWord is vali
1280: 64 20 28 64 69 66 66 65 72 65 6e 74 20 63 61 73  d (different cas
1290: 69 6e 67 20 74 65 73 74 65 64 20 69 66 20 74 68  ing tested if th
12a0: 65 20 66 69 72 73 74 20 6c 65 74 74 65 72 20 69  e first letter i
12b0: 73 20 61 20 63 61 70 69 74 61 6c 29 0a 20 20 20  s a capital).   
12c0: 20 20 20 20 20 69 66 20 28 21 73 57 6f 72 64 29       if (!sWord)
12d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   {.            r
12e0: 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20  eturn null;.    
12f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1300: 20 28 73 57 6f 72 64 2e 69 6e 63 6c 75 64 65 73   (sWord.includes
1310: 28 22 e2 80 99 22 29 29 20 7b 20 2f 2f 20 75 67  ("...")) { // ug
1320: 6c 79 20 68 61 63 6b 0a 20 20 20 20 20 20 20 20  ly hack.        
1330: 20 20 20 20 73 57 6f 72 64 20 3d 20 73 57 6f 72      sWord = sWor
1340: 64 2e 72 65 70 6c 61 63 65 28 22 e2 80 99 22 2c  d.replace("...",
1350: 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 7d   "'");.        }
1360: 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68 69  .        if (thi
1370: 73 2e 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 29 29  s.lookup(sWord))
1380: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   {.            r
1390: 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20  eturn true;.    
13a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
13b0: 20 28 73 57 6f 72 64 2e 63 68 61 72 41 74 28 30   (sWord.charAt(0
13c0: 29 2e 67 6c 5f 69 73 55 70 70 65 72 43 61 73 65  ).gl_isUpperCase
13d0: 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ()) {.          
13e0: 20 20 69 66 20 28 73 57 6f 72 64 2e 6c 65 6e 67    if (sWord.leng
13f0: 74 68 20 3e 20 31 29 20 7b 0a 20 20 20 20 20 20  th > 1) {.      
1400: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 57            if (sW
1410: 6f 72 64 2e 67 6c 5f 69 73 54 69 74 6c 65 28 29  ord.gl_isTitle()
1420: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1430: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 21          return !
1440: 21 74 68 69 73 2e 6c 6f 6f 6b 75 70 28 73 57 6f  !this.lookup(sWo
1450: 72 64 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29  rd.toLowerCase()
1460: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1470: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1480: 20 20 20 20 20 69 66 20 28 73 57 6f 72 64 2e 67       if (sWord.g
1490: 6c 5f 69 73 55 70 70 65 72 43 61 73 65 28 29 29  l_isUpperCase())
14a0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
14b0: 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e         if (this.
14c0: 62 4f 70 74 4e 75 6d 53 69 67 6c 65 29 20 7b 0a  bOptNumSigle) {.
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
14f0: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rue;.           
1500: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1520: 65 74 75 72 6e 20 21 21 28 74 68 69 73 2e 6c 6f  eturn !!(this.lo
1530: 6f 6b 75 70 28 73 57 6f 72 64 2e 74 6f 4c 6f 77  okup(sWord.toLow
1540: 65 72 43 61 73 65 28 29 29 20 7c 7c 20 74 68 69  erCase()) || thi
1550: 73 2e 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 2e 67  s.lookup(sWord.g
1560: 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65 28 29  l_toCapitalize()
1570: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
1580: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1590: 20 20 20 20 20 20 72 65 74 75 72 6e 20 21 21 74        return !!t
15a0: 68 69 73 2e 6c 6f 6f 6b 75 70 28 73 57 6f 72 64  his.lookup(sWord
15b0: 2e 73 6c 69 63 65 28 30 2c 20 31 29 2e 74 6f 4c  .slice(0, 1).toL
15c0: 6f 77 65 72 43 61 73 65 28 29 20 2b 20 73 57 6f  owerCase() + sWo
15d0: 72 64 2e 73 6c 69 63 65 28 31 29 29 3b 0a 20 20  rd.slice(1));.  
15e0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
15f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1600: 20 20 20 72 65 74 75 72 6e 20 21 21 74 68 69 73     return !!this
1610: 2e 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 2e 74 6f  .lookup(sWord.to
1620: 4c 6f 77 65 72 43 61 73 65 28 29 29 3b 0a 20 20  LowerCase());.  
1630: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1640: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1650: 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20  turn false;.    
1660: 7d 0a 0a 20 20 20 20 5f 63 6f 6e 76 42 79 74 65  }..    _convByte
1670: 73 54 6f 49 6e 74 65 67 65 72 20 28 61 42 79 74  sToInteger (aByt
1680: 65 73 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  es) {.        //
1690: 20 42 79 74 65 20 6f 72 64 65 72 20 3d 20 42 69   Byte order = Bi
16a0: 67 20 45 6e 64 69 61 6e 20 28 62 69 67 67 65 72  g Endian (bigger
16b0: 20 66 69 72 73 74 29 0a 20 20 20 20 20 20 20 20   first).        
16c0: 6c 65 74 20 6e 56 61 6c 20 3d 20 30 3b 0a 20 20  let nVal = 0;.  
16d0: 20 20 20 20 20 20 6c 65 74 20 6e 57 65 69 67 68        let nWeigh
16e0: 74 20 3d 20 28 61 42 79 74 65 73 2e 6c 65 6e 67  t = (aBytes.leng
16f0: 74 68 20 2d 20 31 29 20 2a 20 38 3b 0a 20 20 20  th - 1) * 8;.   
1700: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 6e 20       for (let n 
1710: 6f 66 20 61 42 79 74 65 73 29 20 7b 0a 20 20 20  of aBytes) {.   
1720: 20 20 20 20 20 20 20 20 20 6e 56 61 6c 20 2b 3d           nVal +=
1730: 20 6e 20 3c 3c 20 6e 57 65 69 67 68 74 3b 0a 20   n << nWeight;. 
1740: 20 20 20 20 20 20 20 20 20 20 20 6e 57 65 69 67             nWeig
1750: 68 74 20 3d 20 6e 57 65 69 67 68 74 20 2d 20 38  ht = nWeight - 8
1760: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1770: 20 20 20 20 72 65 74 75 72 6e 20 6e 56 61 6c 3b      return nVal;
1780: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 6f 6f 6b  .    }..    look
1790: 75 70 20 28 73 57 6f 72 64 29 20 7b 0a 20 20 20  up (sWord) {.   
17a0: 20 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20       // returns 
17b0: 74 72 75 65 20 69 66 20 73 57 6f 72 64 20 69 6e  true if sWord in
17c0: 20 64 69 63 74 69 6f 6e 61 72 79 20 28 73 74 72   dictionary (str
17d0: 69 63 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ict verification
17e0: 29 0a 20 20 20 20 20 20 20 20 6c 65 74 20 69 41  ).        let iA
17f0: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ddr = 0;.       
1800: 20 66 6f 72 20 28 6c 65 74 20 63 20 6f 66 20 73   for (let c of s
1810: 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20  Word) {.        
1820: 20 20 20 20 69 66 20 28 21 74 68 69 73 2e 64 43      if (!this.dC
1830: 68 61 72 2e 68 61 73 28 63 29 29 20 7b 0a 20 20  har.has(c)) {.  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1850: 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20  turn false;.    
1860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1870: 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 74 68        iAddr = th
1880: 69 73 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64  is._lookupArcNod
1890: 65 28 74 68 69 73 2e 64 43 68 61 72 2e 67 65 74  e(this.dChar.get
18a0: 28 63 29 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  (c), iAddr);.   
18b0: 20 20 20 20 20 20 20 20 20 69 66 20 28 69 41 64           if (iAd
18c0: 64 72 20 3d 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20  dr === null) {. 
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
18e0: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20  eturn false;.   
18f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1900: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
1910: 75 72 6e 20 42 6f 6f 6c 65 61 6e 28 74 68 69 73  urn Boolean(this
1920: 2e 5f 63 6f 6e 76 42 79 74 65 73 54 6f 49 6e 74  ._convBytesToInt
1930: 65 67 65 72 28 74 68 69 73 2e 62 79 44 69 63 2e  eger(this.byDic.
1940: 73 6c 69 63 65 28 69 41 64 64 72 2c 20 69 41 64  slice(iAddr, iAd
1950: 64 72 2b 74 68 69 73 2e 6e 42 79 74 65 73 41 72  dr+this.nBytesAr
1960: 63 29 29 20 26 20 74 68 69 73 2e 5f 66 69 6e 61  c)) & this._fina
1970: 6c 4e 6f 64 65 4d 61 73 6b 29 3b 0a 20 20 20 20  lNodeMask);.    
1980: 7d 0a 0a 20 20 20 20 67 65 74 4d 6f 72 70 68 20  }..    getMorph 
1990: 28 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20  (sWord) {.      
19a0: 20 20 2f 2f 20 72 65 74 72 69 65 76 65 73 20 6d    // retrieves m
19b0: 6f 72 70 68 6f 6c 6f 67 69 65 73 20 6c 69 73 74  orphologies list
19c0: 2c 20 64 69 66 66 65 72 65 6e 74 20 63 61 73 69  , different casi
19d0: 6e 67 20 61 6c 6c 6f 77 65 64 0a 20 20 20 20 20  ng allowed.     
19e0: 20 20 20 6c 65 74 20 6c 20 3d 20 74 68 69 73 2e     let l = this.
19f0: 6d 6f 72 70 68 28 73 57 6f 72 64 29 3b 0a 20 20  morph(sWord);.  
1a00: 20 20 20 20 20 20 69 66 20 28 73 57 6f 72 64 5b        if (sWord[
1a10: 30 5d 2e 67 6c 5f 69 73 55 70 70 65 72 43 61 73  0].gl_isUpperCas
1a20: 65 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  e()) {.         
1a30: 20 20 20 6c 20 3d 20 6c 2e 63 6f 6e 63 61 74 28     l = l.concat(
1a40: 74 68 69 73 2e 6d 6f 72 70 68 28 73 57 6f 72 64  this.morph(sWord
1a50: 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 29 29  .toLowerCase()))
1a60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1a70: 20 28 73 57 6f 72 64 2e 67 6c 5f 69 73 55 70 70   (sWord.gl_isUpp
1a80: 65 72 43 61 73 65 28 29 20 26 26 20 73 57 6f 72  erCase() && sWor
1a90: 64 2e 6c 65 6e 67 74 68 20 3e 20 31 29 20 7b 0a  d.length > 1) {.
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 6c 20 3d 20 6c 2e 63 6f 6e 63 61 74 28 74 68 69  l = l.concat(thi
1ac0: 73 2e 6d 6f 72 70 68 28 73 57 6f 72 64 2e 67 6c  s.morph(sWord.gl
1ad0: 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65 28 29 29  _toCapitalize())
1ae0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
1af0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b00: 20 20 20 72 65 74 75 72 6e 20 6c 3b 0a 20 20 20     return l;.   
1b10: 20 7d 0a 0a 20 20 20 20 73 75 67 67 65 73 74 20   }..    suggest 
1b20: 28 73 57 6f 72 64 2c 20 6e 4d 61 78 53 75 67 67  (sWord, nMaxSugg
1b30: 3d 31 30 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  =10) {.        /
1b40: 2f 20 72 65 74 75 72 6e 73 20 61 20 61 72 72 61  / returns a arra
1b50: 79 20 6f 66 20 73 75 67 67 65 73 74 69 6f 6e 73  y of suggestions
1b60: 20 66 6f 72 20 3c 73 57 6f 72 64 3e 0a 20 20 20   for <sWord>.   
1b70: 20 20 20 20 20 6c 65 74 20 73 41 64 64 20 3d 20       let sAdd = 
1b80: 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  "";.        if (
1b90: 73 57 6f 72 64 2e 69 6e 63 6c 75 64 65 73 28 22  sWord.includes("
1ba0: 2d 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  -")) {.         
1bb0: 20 20 20 6c 65 74 20 6e 4c 61 73 74 48 79 70 68     let nLastHyph
1bc0: 65 6e 50 6f 73 20 3d 20 73 57 6f 72 64 2e 6c 61  enPos = sWord.la
1bd0: 73 74 49 6e 64 65 78 4f 66 28 22 2d 22 29 3b 0a  stIndexOf("-");.
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1bf0: 63 68 61 72 5f 70 6c 61 79 65 72 2e 61 45 78 63  char_player.aExc
1c00: 6c 75 64 65 64 53 66 78 2e 68 61 73 28 73 57 6f  ludedSfx.has(sWo
1c10: 72 64 2e 73 6c 69 63 65 28 6e 4c 61 73 74 48 79  rd.slice(nLastHy
1c20: 70 68 65 6e 50 6f 73 2b 31 29 29 29 20 7b 0a 20  phenPos+1))) {. 
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1c40: 41 64 64 20 3d 20 73 57 6f 72 64 2e 73 6c 69 63  Add = sWord.slic
1c50: 65 28 6e 4c 61 73 74 48 79 70 68 65 6e 50 6f 73  e(nLastHyphenPos
1c60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1c70: 20 20 20 73 57 6f 72 64 20 3d 20 73 57 6f 72 64     sWord = sWord
1c80: 2e 73 6c 69 63 65 28 30 2c 20 6e 4c 61 73 74 48  .slice(0, nLastH
1c90: 79 70 68 65 6e 50 6f 73 29 3b 0a 20 20 20 20 20  yphenPos);.     
1ca0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cb0: 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e   }.        let n
1cc0: 4d 61 78 44 65 6c 20 3d 20 4d 61 74 68 2e 66 6c  MaxDel = Math.fl
1cd0: 6f 6f 72 28 73 57 6f 72 64 2e 6c 65 6e 67 74 68  oor(sWord.length
1ce0: 20 2f 20 35 29 3b 0a 20 20 20 20 20 20 20 20 6c   / 5);.        l
1cf0: 65 74 20 6e 4d 61 78 48 61 72 64 52 65 70 6c 20  et nMaxHardRepl 
1d00: 3d 20 4d 61 74 68 2e 6d 61 78 28 4d 61 74 68 2e  = Math.max(Math.
1d10: 66 6c 6f 6f 72 28 28 73 57 6f 72 64 2e 6c 65 6e  floor((sWord.len
1d20: 67 74 68 20 2d 20 35 29 20 2f 20 34 29 2c 20 31  gth - 5) / 4), 1
1d30: 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61  );.        let a
1d40: 53 75 67 67 20 3d 20 74 68 69 73 2e 5f 73 75 67  Sugg = this._sug
1d50: 67 65 73 74 28 73 57 6f 72 64 2c 20 6e 4d 61 78  gest(sWord, nMax
1d60: 44 65 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65 70  Del, nMaxHardRep
1d70: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  l);.        if (
1d80: 73 57 6f 72 64 2e 67 6c 5f 69 73 54 69 74 6c 65  sWord.gl_isTitle
1d90: 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ()) {.          
1da0: 20 20 61 53 75 67 67 2e 67 6c 5f 75 70 64 61 74    aSugg.gl_updat
1db0: 65 28 74 68 69 73 2e 5f 73 75 67 67 65 73 74 28  e(this._suggest(
1dc0: 73 57 6f 72 64 2e 74 6f 4c 6f 77 65 72 43 61 73  sWord.toLowerCas
1dd0: 65 28 29 2c 20 6e 4d 61 78 44 65 6c 2c 20 6e 4d  e(), nMaxDel, nM
1de0: 61 78 48 61 72 64 52 65 70 6c 29 29 3b 0a 20 20  axHardRepl));.  
1df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e00: 65 6c 73 65 20 69 66 20 28 73 57 6f 72 64 2e 67  else if (sWord.g
1e10: 6c 5f 69 73 4c 6f 77 65 72 43 61 73 65 28 29 29  l_isLowerCase())
1e20: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61   {.            a
1e30: 53 75 67 67 2e 67 6c 5f 75 70 64 61 74 65 28 74  Sugg.gl_update(t
1e40: 68 69 73 2e 5f 73 75 67 67 65 73 74 28 73 57 6f  his._suggest(sWo
1e50: 72 64 2e 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69  rd.gl_toCapitali
1e60: 7a 65 28 29 2c 20 6e 4d 61 78 44 65 6c 2c 20 6e  ze(), nMaxDel, n
1e70: 4d 61 78 48 61 72 64 52 65 70 6c 29 29 3b 0a 20  MaxHardRepl));. 
1e80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e90: 20 69 66 20 28 61 53 75 67 67 2e 73 69 7a 65 20   if (aSugg.size 
1ea0: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  == 0) {.        
1eb0: 20 20 20 20 61 53 75 67 67 2e 67 6c 5f 75 70 64      aSugg.gl_upd
1ec0: 61 74 65 28 74 68 69 73 2e 5f 73 75 67 67 65 73  ate(this._sugges
1ed0: 74 57 69 74 68 43 72 75 73 68 65 64 55 73 65 6c  tWithCrushedUsel
1ee0: 65 73 73 43 68 61 72 73 28 63 68 61 72 5f 70 6c  essChars(char_pl
1ef0: 61 79 65 72 2e 63 6c 65 61 72 57 6f 72 64 28 73  ayer.clearWord(s
1f00: 57 6f 72 64 29 29 29 3b 0a 20 20 20 20 20 20 20  Word)));.       
1f10: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 20 53 65   }.        // Se
1f20: 74 20 74 6f 20 41 72 72 61 79 0a 20 20 20 20 20  t to Array.     
1f30: 20 20 20 61 53 75 67 67 20 3d 20 41 72 72 61 79     aSugg = Array
1f40: 2e 66 72 6f 6d 28 61 53 75 67 67 29 3b 0a 20 20  .from(aSugg);.  
1f50: 20 20 20 20 20 20 61 53 75 67 67 20 3d 20 61 53        aSugg = aS
1f60: 75 67 67 2e 66 69 6c 74 65 72 28 28 73 53 75 67  ugg.filter((sSug
1f70: 67 29 20 3d 3e 20 7b 20 72 65 74 75 72 6e 20 21  g) => { return !
1f80: 73 53 75 67 67 2e 65 6e 64 73 57 69 74 68 28 22  sSugg.endsWith("
1f90: c3 a8 22 29 20 26 26 20 21 73 53 75 67 67 2e 65  ..") && !sSugg.e
1fa0: 6e 64 73 57 69 74 68 28 22 c3 88 22 29 3b 20 7d  ndsWith(".."); }
1fb0: 29 3b 20 2f 2f 20 66 72 20 6c 61 6e 67 75 61 67  ); // fr languag
1fc0: 65 20 0a 20 20 20 20 20 20 20 20 69 66 20 28 73  e .        if (s
1fd0: 57 6f 72 64 2e 67 6c 5f 69 73 54 69 74 6c 65 28  Word.gl_isTitle(
1fe0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
1ff0: 20 61 53 75 67 67 20 3d 20 61 53 75 67 67 2e 6d   aSugg = aSugg.m
2000: 61 70 28 28 73 53 75 67 67 29 20 3d 3e 20 7b 20  ap((sSugg) => { 
2010: 72 65 74 75 72 6e 20 73 53 75 67 67 2e 67 6c 5f  return sSugg.gl_
2020: 74 6f 43 61 70 69 74 61 6c 69 7a 65 28 29 3b 20  toCapitalize(); 
2030: 7d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  });.        }.  
2040: 20 20 20 20 20 20 6c 65 74 20 64 44 69 73 74 54        let dDistT
2050: 65 6d 70 20 3d 20 6e 65 77 20 4d 61 70 28 29 3b  emp = new Map();
2060: 0a 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 66  .        aSugg.f
2070: 6f 72 45 61 63 68 28 28 73 53 75 67 67 29 20 3d  orEach((sSugg) =
2080: 3e 20 7b 20 64 44 69 73 74 54 65 6d 70 2e 73 65  > { dDistTemp.se
2090: 74 28 73 53 75 67 67 2c 20 63 68 61 72 5f 70 6c  t(sSugg, char_pl
20a0: 61 79 65 72 2e 64 69 73 74 61 6e 63 65 44 61 6d  ayer.distanceDam
20b0: 65 72 61 75 4c 65 76 65 6e 73 68 74 65 69 6e 28  erauLevenshtein(
20c0: 73 57 6f 72 64 2c 20 73 53 75 67 67 29 29 3b 20  sWord, sSugg)); 
20d0: 7d 29 3b 0a 20 20 20 20 20 20 20 20 61 53 75 67  });.        aSug
20e0: 67 20 3d 20 61 53 75 67 67 2e 73 6f 72 74 28 28  g = aSugg.sort((
20f0: 73 41 2c 20 73 42 29 20 3d 3e 20 7b 20 72 65 74  sA, sB) => { ret
2100: 75 72 6e 20 64 44 69 73 74 54 65 6d 70 2e 67 65  urn dDistTemp.ge
2110: 74 28 73 41 29 20 2d 20 64 44 69 73 74 54 65 6d  t(sA) - dDistTem
2120: 70 2e 67 65 74 28 73 42 29 3b 20 7d 29 2e 73 6c  p.get(sB); }).sl
2130: 69 63 65 28 30 2c 20 6e 4d 61 78 53 75 67 67 29  ice(0, nMaxSugg)
2140: 3b 0a 20 20 20 20 20 20 20 20 64 44 69 73 74 54  ;.        dDistT
2150: 65 6d 70 2e 63 6c 65 61 72 28 29 3b 0a 20 20 20  emp.clear();.   
2160: 20 20 20 20 20 69 66 20 28 73 41 64 64 29 20 7b       if (sAdd) {
2170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
2180: 77 65 20 61 64 64 20 77 68 61 74 20 77 65 20 72  we add what we r
2190: 65 6d 6f 76 65 64 0a 20 20 20 20 20 20 20 20 20  emoved.         
21a0: 20 20 20 72 65 74 75 72 6e 20 61 53 75 67 67 2e     return aSugg.
21b0: 6d 61 70 28 20 28 73 53 75 67 67 29 20 3d 3e 20  map( (sSugg) => 
21c0: 7b 20 72 65 74 75 72 6e 20 73 53 75 67 67 20 2b  { return sSugg +
21d0: 20 73 41 64 64 20 7d 20 29 3b 0a 20 20 20 20 20   sAdd } );.     
21e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
21f0: 75 72 6e 20 61 53 75 67 67 3b 0a 20 20 20 20 7d  urn aSugg;.    }
2200: 0a 0a 20 20 20 20 5f 73 75 67 67 65 73 74 20 28  ..    _suggest (
2210: 73 52 65 6d 61 69 6e 2c 20 6e 4d 61 78 44 65 6c  sRemain, nMaxDel
2220: 3d 30 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c  =0, nMaxHardRepl
2230: 3d 30 2c 20 6e 44 65 65 70 3d 30 2c 20 69 41 64  =0, nDeep=0, iAd
2240: 64 72 3d 30 2c 20 73 4e 65 77 57 6f 72 64 3d 22  dr=0, sNewWord="
2250: 22 2c 20 62 41 76 6f 69 64 4c 6f 6f 70 3d 66 61  ", bAvoidLoop=fa
2260: 6c 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  lse) {.        /
2270: 2f 20 72 65 74 75 72 6e 73 20 61 20 73 65 74 20  / returns a set 
2280: 6f 66 20 73 75 67 67 65 73 74 69 6f 6e 73 0a 20  of suggestions. 
2290: 20 20 20 20 20 20 20 2f 2f 20 72 65 63 75 72 73         // recurs
22a0: 69 76 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  ive function.   
22b0: 20 20 20 20 20 6c 65 74 20 61 53 75 67 67 20 3d       let aSugg =
22c0: 20 6e 65 77 20 53 65 74 28 29 3b 0a 20 20 20 20   new Set();.    
22d0: 20 20 20 20 69 66 20 28 73 52 65 6d 61 69 6e 20      if (sRemain 
22e0: 3d 3d 20 22 22 29 20 7b 0a 20 20 20 20 20 20 20  == "") {.       
22f0: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 5f 63       if (this._c
2300: 6f 6e 76 42 79 74 65 73 54 6f 49 6e 74 65 67 65  onvBytesToIntege
2310: 72 28 74 68 69 73 2e 62 79 44 69 63 2e 73 6c 69  r(this.byDic.sli
2320: 63 65 28 69 41 64 64 72 2c 20 69 41 64 64 72 2b  ce(iAddr, iAddr+
2330: 74 68 69 73 2e 6e 42 79 74 65 73 41 72 63 29 29  this.nBytesArc))
2340: 20 26 20 74 68 69 73 2e 5f 66 69 6e 61 6c 4e 6f   & this._finalNo
2350: 64 65 4d 61 73 6b 29 20 7b 0a 20 20 20 20 20 20  deMask) {.      
2360: 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e            aSugg.
2370: 61 64 64 28 73 4e 65 77 57 6f 72 64 29 3b 0a 20  add(sNewWord);. 
2380: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2390: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
23a0: 74 20 73 54 61 69 6c 20 6f 66 20 74 68 69 73 2e  t sTail of this.
23b0: 5f 67 65 74 54 61 69 6c 73 28 69 41 64 64 72 29  _getTails(iAddr)
23c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
23d0: 20 20 20 20 61 53 75 67 67 2e 61 64 64 28 73 4e      aSugg.add(sN
23e0: 65 77 57 6f 72 64 2b 73 54 61 69 6c 29 3b 0a 20  ewWord+sTail);. 
23f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2400: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2410: 61 53 75 67 67 3b 0a 20 20 20 20 20 20 20 20 7d  aSugg;.        }
2420: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 63 43 75  .        let cCu
2430: 72 72 65 6e 74 20 3d 20 73 52 65 6d 61 69 6e 2e  rrent = sRemain.
2440: 73 6c 69 63 65 28 30 2c 20 31 29 3b 0a 20 20 20  slice(0, 1);.   
2450: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 63       for (let [c
2460: 43 68 61 72 2c 20 6a 41 64 64 72 5d 20 6f 66 20  Char, jAddr] of 
2470: 74 68 69 73 2e 5f 67 65 74 53 69 6d 69 6c 61 72  this._getSimilar
2480: 41 72 63 73 28 63 43 75 72 72 65 6e 74 2c 20 69  Arcs(cCurrent, i
2490: 41 64 64 72 29 29 20 7b 0a 20 20 20 20 20 20 20  Addr)) {.       
24a0: 20 20 20 20 20 61 53 75 67 67 2e 67 6c 5f 75 70       aSugg.gl_up
24b0: 64 61 74 65 28 74 68 69 73 2e 5f 73 75 67 67 65  date(this._sugge
24c0: 73 74 28 73 52 65 6d 61 69 6e 2e 73 6c 69 63 65  st(sRemain.slice
24d0: 28 31 29 2c 20 6e 4d 61 78 44 65 6c 2c 20 6e 4d  (1), nMaxDel, nM
24e0: 61 78 48 61 72 64 52 65 70 6c 2c 20 6e 44 65 65  axHardRepl, nDee
24f0: 70 2b 31 2c 20 6a 41 64 64 72 2c 20 73 4e 65 77  p+1, jAddr, sNew
2500: 57 6f 72 64 2b 63 43 68 61 72 29 29 3b 0a 20 20  Word+cChar));.  
2510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2520: 69 66 20 28 21 62 41 76 6f 69 64 4c 6f 6f 70 29  if (!bAvoidLoop)
2530: 20 7b 20 2f 2f 20 61 76 6f 69 64 20 69 6e 66 69   { // avoid infi
2540: 6e 69 74 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20  nite loop.      
2550: 20 20 20 20 20 20 69 66 20 28 63 43 75 72 72 65        if (cCurre
2560: 6e 74 20 3d 3d 20 73 52 65 6d 61 69 6e 2e 73 6c  nt == sRemain.sl
2570: 69 63 65 28 31 2c 20 32 29 29 20 7b 0a 20 20 20  ice(1, 2)) {.   
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2590: 73 61 6d 65 20 63 68 61 72 2c 20 77 65 20 72 65  same char, we re
25a0: 6d 6f 76 65 20 31 20 63 68 61 72 20 77 69 74 68  move 1 char with
25b0: 6f 75 74 20 61 64 64 69 6e 67 20 31 20 74 6f 20  out adding 1 to 
25c0: 3c 73 4e 65 77 57 6f 72 64 3e 0a 20 20 20 20 20  <sNewWord>.     
25d0: 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67             aSugg
25e0: 2e 67 6c 5f 75 70 64 61 74 65 28 74 68 69 73 2e  .gl_update(this.
25f0: 5f 73 75 67 67 65 73 74 28 73 52 65 6d 61 69 6e  _suggest(sRemain
2600: 2e 73 6c 69 63 65 28 31 29 2c 20 6e 4d 61 78 44  .slice(1), nMaxD
2610: 65 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c  el, nMaxHardRepl
2620: 2c 20 6e 44 65 65 70 2b 31 2c 20 69 41 64 64 72  , nDeep+1, iAddr
2630: 2c 20 73 4e 65 77 57 6f 72 64 29 29 3b 0a 20 20  , sNewWord));.  
2640: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2650: 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b 0a 20          else {. 
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2670: 2f 20 73 77 69 74 63 68 69 6e 67 20 63 68 61 72  / switching char
2680: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
2690: 20 20 61 53 75 67 67 2e 67 6c 5f 75 70 64 61 74    aSugg.gl_updat
26a0: 65 28 74 68 69 73 2e 5f 73 75 67 67 65 73 74 28  e(this._suggest(
26b0: 73 52 65 6d 61 69 6e 2e 73 6c 69 63 65 28 31 2c  sRemain.slice(1,
26c0: 20 32 29 2b 73 52 65 6d 61 69 6e 2e 73 6c 69 63   2)+sRemain.slic
26d0: 65 28 30 2c 20 31 29 2b 73 52 65 6d 61 69 6e 2e  e(0, 1)+sRemain.
26e0: 73 6c 69 63 65 28 32 29 2c 20 6e 4d 61 78 44 65  slice(2), nMaxDe
26f0: 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c 2c  l, nMaxHardRepl,
2700: 20 6e 44 65 65 70 2b 31 2c 20 69 41 64 64 72 2c   nDeep+1, iAddr,
2710: 20 73 4e 65 77 57 6f 72 64 2c 20 74 72 75 65 29   sNewWord, true)
2720: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2730: 20 20 20 2f 2f 20 64 65 6c 65 74 65 20 63 68 61     // delete cha
2740: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r.              
2750: 20 20 69 66 20 28 6e 4d 61 78 44 65 6c 20 3e 20    if (nMaxDel > 
2760: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0) {.           
2770: 20 20 20 20 20 20 20 20 20 61 53 75 67 67 2e 67           aSugg.g
2780: 6c 5f 75 70 64 61 74 65 28 74 68 69 73 2e 5f 73  l_update(this._s
2790: 75 67 67 65 73 74 28 73 52 65 6d 61 69 6e 2e 73  uggest(sRemain.s
27a0: 6c 69 63 65 28 31 29 2c 20 6e 4d 61 78 44 65 6c  lice(1), nMaxDel
27b0: 2d 31 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c  -1, nMaxHardRepl
27c0: 2c 20 6e 44 65 65 70 2b 31 2c 20 69 41 64 64 72  , nDeep+1, iAddr
27d0: 2c 20 73 4e 65 77 57 6f 72 64 2c 20 74 72 75 65  , sNewWord, true
27e0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2800: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2810: 2f 2f 20 50 68 6f 6e 65 74 69 63 20 72 65 70 6c  // Phonetic repl
2820: 61 63 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 20  acements.       
2830: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 73 52       for (let sR
2840: 65 70 6c 20 6f 66 20 63 68 61 72 5f 70 6c 61 79  epl of char_play
2850: 65 72 2e 64 31 74 6f 58 2e 67 6c 5f 67 65 74 28  er.d1toX.gl_get(
2860: 63 43 75 72 72 65 6e 74 2c 20 5b 5d 29 29 20 7b  cCurrent, [])) {
2870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2880: 20 61 53 75 67 67 2e 67 6c 5f 75 70 64 61 74 65   aSugg.gl_update
2890: 28 74 68 69 73 2e 5f 73 75 67 67 65 73 74 28 73  (this._suggest(s
28a0: 52 65 70 6c 20 2b 20 73 52 65 6d 61 69 6e 2e 73  Repl + sRemain.s
28b0: 6c 69 63 65 28 31 29 2c 20 6e 4d 61 78 44 65 6c  lice(1), nMaxDel
28c0: 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c 2c 20  , nMaxHardRepl, 
28d0: 6e 44 65 65 70 2b 31 2c 20 69 41 64 64 72 2c 20  nDeep+1, iAddr, 
28e0: 73 4e 65 77 57 6f 72 64 2c 20 74 72 75 65 29 29  sNewWord, true))
28f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2900: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
2910: 28 6c 65 74 20 73 52 65 70 6c 20 6f 66 20 63 68  (let sRepl of ch
2920: 61 72 5f 70 6c 61 79 65 72 2e 64 32 74 6f 58 2e  ar_player.d2toX.
2930: 67 6c 5f 67 65 74 28 73 52 65 6d 61 69 6e 2e 73  gl_get(sRemain.s
2940: 6c 69 63 65 28 30 2c 20 32 29 2c 20 5b 5d 29 29  lice(0, 2), []))
2950: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2960: 20 20 20 61 53 75 67 67 2e 67 6c 5f 75 70 64 61     aSugg.gl_upda
2970: 74 65 28 74 68 69 73 2e 5f 73 75 67 67 65 73 74  te(this._suggest
2980: 28 73 52 65 70 6c 20 2b 20 73 52 65 6d 61 69 6e  (sRepl + sRemain
2990: 2e 73 6c 69 63 65 28 32 29 2c 20 6e 4d 61 78 44  .slice(2), nMaxD
29a0: 65 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c  el, nMaxHardRepl
29b0: 2c 20 6e 44 65 65 70 2b 31 2c 20 69 41 64 64 72  , nDeep+1, iAddr
29c0: 2c 20 73 4e 65 77 57 6f 72 64 2c 20 74 72 75 65  , sNewWord, true
29d0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
29e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  }.            //
29f0: 20 48 61 72 64 20 72 65 70 6c 61 63 65 6d 65 6e   Hard replacemen
2a00: 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ts.            i
2a10: 66 20 28 6e 44 65 65 70 20 3e 20 33 20 26 26 20  f (nDeep > 3 && 
2a20: 6e 4d 61 78 48 61 72 64 52 65 70 6c 20 26 26 20  nMaxHardRepl && 
2a30: 73 52 65 6d 61 69 6e 2e 6c 65 6e 67 74 68 20 3e  sRemain.length >
2a40: 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 20 20 20  = 2) {.         
2a50: 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20         for (let 
2a60: 5b 6e 56 61 6c 2c 20 6b 41 64 64 72 5d 20 6f 66  [nVal, kAddr] of
2a70: 20 74 68 69 73 2e 5f 67 65 74 41 72 63 73 31 28   this._getArcs1(
2a80: 69 41 64 64 72 29 29 20 7b 0a 20 20 20 20 20 20  iAddr)) {.      
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2aa0: 20 28 74 68 69 73 2e 64 43 68 61 72 56 61 6c 2e   (this.dCharVal.
2ab0: 68 61 73 28 6e 56 61 6c 29 29 20 7b 0a 20 20 20  has(nVal)) {.   
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 20 20 6c 65 74 20 63 43 68 61 72 20 3d       let cChar =
2ae0: 20 74 68 69 73 2e 64 43 68 61 72 56 61 6c 2e 67   this.dCharVal.g
2af0: 65 74 28 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20  et(nVal);.      
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 20 69 66 20 28 21 63 68 61 72 5f 70 6c 61 79    if (!char_play
2b20: 65 72 2e 64 31 74 6f 31 2e 67 6c 5f 67 65 74 28  er.d1to1.gl_get(
2b30: 63 43 75 72 72 65 6e 74 2c 20 22 22 29 2e 69 6e  cCurrent, "").in
2b40: 63 6c 75 64 65 73 28 63 43 68 61 72 29 29 20 7b  cludes(cChar)) {
2b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 75               aSu
2b70: 67 67 2e 67 6c 5f 75 70 64 61 74 65 28 74 68 69  gg.gl_update(thi
2b80: 73 2e 5f 73 75 67 67 65 73 74 28 73 52 65 6d 61  s._suggest(sRema
2b90: 69 6e 2e 73 6c 69 63 65 28 31 29 2c 20 6e 4d 61  in.slice(1), nMa
2ba0: 78 44 65 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65  xDel, nMaxHardRe
2bb0: 70 6c 2d 31 2c 20 6e 44 65 65 70 2b 31 2c 20 6b  pl-1, nDeep+1, k
2bc0: 41 64 64 72 2c 20 73 4e 65 77 57 6f 72 64 2b 63  Addr, sNewWord+c
2bd0: 43 68 61 72 2c 20 74 72 75 65 29 29 3b 0a 20 20  Char, true));.  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c30: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 65 6e 64            // end
2c40: 20 6f 66 20 77 6f 72 64 0a 20 20 20 20 20 20 20   of word.       
2c50: 20 20 20 20 20 69 66 20 28 73 52 65 6d 61 69 6e       if (sRemain
2c60: 2e 6c 65 6e 67 74 68 20 3d 3d 20 32 29 20 7b 0a  .length == 2) {.
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 66 6f 72 20 28 6c 65 74 20 73 52 65 70 6c 20 6f  for (let sRepl o
2c90: 66 20 63 68 61 72 5f 70 6c 61 79 65 72 2e 64 46  f char_player.dF
2ca0: 69 6e 61 6c 32 2e 67 6c 5f 67 65 74 28 73 52 65  inal2.gl_get(sRe
2cb0: 6d 61 69 6e 2c 20 5b 5d 29 29 20 7b 0a 20 20 20  main, [])) {.   
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 61 53 75 67 67 2e 67 6c 5f 75 70 64 61 74 65   aSugg.gl_update
2ce0: 28 74 68 69 73 2e 5f 73 75 67 67 65 73 74 28 73  (this._suggest(s
2cf0: 52 65 70 6c 2c 20 6e 4d 61 78 44 65 6c 2c 20 6e  Repl, nMaxDel, n
2d00: 4d 61 78 48 61 72 64 52 65 70 6c 2c 20 6e 44 65  MaxHardRepl, nDe
2d10: 65 70 2b 31 2c 20 69 41 64 64 72 2c 20 73 4e 65  ep+1, iAddr, sNe
2d20: 77 57 6f 72 64 2c 20 74 72 75 65 29 29 3b 0a 20  wWord, true));. 
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2d50: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
2d60: 69 66 20 28 73 52 65 6d 61 69 6e 2e 6c 65 6e 67  if (sRemain.leng
2d70: 74 68 20 3d 3d 20 31 29 20 7b 0a 20 20 20 20 20  th == 1) {.     
2d80: 20 20 20 20 20 20 20 20 20 20 20 61 53 75 67 67             aSugg
2d90: 2e 67 6c 5f 75 70 64 61 74 65 28 74 68 69 73 2e  .gl_update(this.
2da0: 5f 73 75 67 67 65 73 74 28 22 22 2c 20 6e 4d 61  _suggest("", nMa
2db0: 78 44 65 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65  xDel, nMaxHardRe
2dc0: 70 6c 2c 20 6e 44 65 65 70 2b 31 2c 20 69 41 64  pl, nDeep+1, iAd
2dd0: 64 72 2c 20 73 4e 65 77 57 6f 72 64 2c 20 74 72  dr, sNewWord, tr
2de0: 75 65 29 29 3b 20 2f 2f 20 72 65 6d 6f 76 65 20  ue)); // remove 
2df0: 6c 61 73 74 20 63 68 61 72 20 61 6e 64 20 67 6f  last char and go
2e00: 20 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   on.            
2e10: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 73 52 65      for (let sRe
2e20: 70 6c 20 6f 66 20 63 68 61 72 5f 70 6c 61 79 65  pl of char_playe
2e30: 72 2e 64 46 69 6e 61 6c 31 2e 67 6c 5f 67 65 74  r.dFinal1.gl_get
2e40: 28 73 52 65 6d 61 69 6e 2c 20 5b 5d 29 29 20 7b  (sRemain, [])) {
2e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e60: 20 20 20 20 20 61 53 75 67 67 2e 67 6c 5f 75 70       aSugg.gl_up
2e70: 64 61 74 65 28 74 68 69 73 2e 5f 73 75 67 67 65  date(this._sugge
2e80: 73 74 28 73 52 65 70 6c 2c 20 6e 4d 61 78 44 65  st(sRepl, nMaxDe
2e90: 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c 2c  l, nMaxHardRepl,
2ea0: 20 6e 44 65 65 70 2b 31 2c 20 69 41 64 64 72 2c   nDeep+1, iAddr,
2eb0: 20 73 4e 65 77 57 6f 72 64 2c 20 74 72 75 65 29   sNewWord, true)
2ec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2ed0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2ee0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2ef0: 20 20 20 20 20 72 65 74 75 72 6e 20 61 53 75 67       return aSug
2f00: 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 20  g;.    }..    * 
2f10: 5f 67 65 74 53 69 6d 69 6c 61 72 41 72 63 73 20  _getSimilarArcs 
2f20: 28 63 43 68 61 72 2c 20 69 41 64 64 72 29 20 7b  (cChar, iAddr) {
2f30: 0a 20 20 20 20 20 20 20 20 2f 2f 20 67 65 6e 65  .        // gene
2f40: 72 61 74 6f 72 3a 20 79 69 65 6c 64 20 73 69 6d  rator: yield sim
2f50: 69 6c 61 72 20 63 68 61 72 20 6f 66 20 3c 63 43  ilar char of <cC
2f60: 68 61 72 3e 20 61 6e 64 20 61 64 64 72 65 73 73  har> and address
2f70: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2f80: 67 20 6e 6f 64 65 0a 20 20 20 20 20 20 20 20 66  g node.        f
2f90: 6f 72 20 28 6c 65 74 20 63 20 6f 66 20 63 68 61  or (let c of cha
2fa0: 72 5f 70 6c 61 79 65 72 2e 64 31 74 6f 31 2e 67  r_player.d1to1.g
2fb0: 6c 5f 67 65 74 28 63 43 68 61 72 2c 20 5b 63 43  l_get(cChar, [cC
2fc0: 68 61 72 5d 29 29 20 7b 0a 20 20 20 20 20 20 20  har])) {.       
2fd0: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 64 43       if (this.dC
2fe0: 68 61 72 2e 68 61 73 28 63 29 29 20 7b 0a 20 20  har.has(c)) {.  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
3000: 74 20 6a 41 64 64 72 20 3d 20 74 68 69 73 2e 5f  t jAddr = this._
3010: 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 28 74 68  lookupArcNode(th
3020: 69 73 2e 64 43 68 61 72 2e 67 65 74 28 63 29 2c  is.dChar.get(c),
3030: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20   iAddr);.       
3040: 20 20 20 20 20 20 20 20 20 69 66 20 28 6a 41 64           if (jAd
3050: 64 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  dr) {.          
3060: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
3070: 5b 63 2c 20 6a 41 64 64 72 5d 3b 0a 20 20 20 20  [c, jAddr];.    
3080: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3090: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
30b0: 20 5f 67 65 74 54 61 69 6c 73 20 28 69 41 64 64   _getTails (iAdd
30c0: 72 2c 20 73 54 61 69 6c 3d 22 22 2c 20 6e 3d 32  r, sTail="", n=2
30d0: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 72  ) {.        // r
30e0: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
30f0: 73 75 66 66 69 78 65 73 20 65 6e 64 69 6e 67 20  suffixes ending 
3100: 61 74 20 61 20 64 69 73 74 61 6e 63 65 20 6f 66  at a distance of
3110: 20 3c 6e 3e 20 66 72 6f 6d 20 3c 69 41 64 64 72   <n> from <iAddr
3120: 3e 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61 54  >.        let aT
3130: 61 69 6c 73 20 3d 20 6e 65 77 20 53 65 74 28 29  ails = new Set()
3140: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c  ;.        for (l
3150: 65 74 20 5b 6e 56 61 6c 2c 20 6a 41 64 64 72 5d  et [nVal, jAddr]
3160: 20 6f 66 20 74 68 69 73 2e 5f 67 65 74 41 72 63   of this._getArc
3170: 73 28 69 41 64 64 72 29 29 20 7b 0a 20 20 20 20  s(iAddr)) {.    
3180: 20 20 20 20 20 20 20 20 69 66 20 28 6e 56 61 6c          if (nVal
3190: 20 3c 20 74 68 69 73 2e 6e 43 68 61 72 29 20 7b   < this.nChar) {
31a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31b0: 20 69 66 20 28 74 68 69 73 2e 5f 63 6f 6e 76 42   if (this._convB
31c0: 79 74 65 73 54 6f 49 6e 74 65 67 65 72 28 74 68  ytesToInteger(th
31d0: 69 73 2e 62 79 44 69 63 2e 73 6c 69 63 65 28 6a  is.byDic.slice(j
31e0: 41 64 64 72 2c 20 6a 41 64 64 72 2b 74 68 69 73  Addr, jAddr+this
31f0: 2e 6e 42 79 74 65 73 41 72 63 29 29 20 26 20 74  .nBytesArc)) & t
3200: 68 69 73 2e 5f 66 69 6e 61 6c 4e 6f 64 65 4d 61  his._finalNodeMa
3210: 73 6b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  sk) {.          
3220: 20 20 20 20 20 20 20 20 20 20 61 54 61 69 6c 73            aTails
3230: 2e 61 64 64 28 73 54 61 69 6c 20 2b 20 74 68 69  .add(sTail + thi
3240: 73 2e 64 43 68 61 72 56 61 6c 2e 67 65 74 28 6e  s.dCharVal.get(n
3250: 56 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Val));.         
3260: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3270: 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 26           if (n &
3280: 26 20 61 54 61 69 6c 73 2e 73 69 7a 65 20 3d 3d  & aTails.size ==
3290: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
32a0: 20 20 20 20 20 20 20 20 20 20 61 54 61 69 6c 73            aTails
32b0: 2e 67 6c 5f 75 70 64 61 74 65 28 74 68 69 73 2e  .gl_update(this.
32c0: 5f 67 65 74 54 61 69 6c 73 28 6a 41 64 64 72 2c  _getTails(jAddr,
32d0: 20 73 54 61 69 6c 2b 74 68 69 73 2e 64 43 68 61   sTail+this.dCha
32e0: 72 56 61 6c 2e 67 65 74 28 6e 56 61 6c 29 2c 20  rVal.get(nVal), 
32f0: 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
3300: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
3320: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3330: 61 54 61 69 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  aTails;.    }.. 
3340: 20 20 20 5f 73 75 67 67 65 73 74 57 69 74 68 43     _suggestWithC
3350: 72 75 73 68 65 64 55 73 65 6c 65 73 73 43 68 61  rushedUselessCha
3360: 72 73 20 28 73 57 6f 72 64 2c 20 6e 44 65 65 70  rs (sWord, nDeep
3370: 3d 30 2c 20 69 41 64 64 72 3d 30 2c 20 73 4e 65  =0, iAddr=0, sNe
3380: 77 57 6f 72 64 3d 22 22 2c 20 62 41 76 6f 69 64  wWord="", bAvoid
3390: 4c 6f 6f 70 3d 66 61 6c 73 65 29 20 7b 0a 20 20  Loop=false) {.  
33a0: 20 20 20 20 20 20 6c 65 74 20 61 53 75 67 67 20        let aSugg 
33b0: 3d 20 6e 65 77 20 53 65 74 28 29 3b 0a 20 20 20  = new Set();.   
33c0: 20 20 20 20 20 69 66 20 28 73 57 6f 72 64 2e 6c       if (sWord.l
33d0: 65 6e 67 74 68 20 3d 3d 20 30 29 20 7b 0a 20 20  ength == 0) {.  
33e0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74 68            if (th
33f0: 69 73 2e 5f 63 6f 6e 76 42 79 74 65 73 54 6f 49  is._convBytesToI
3400: 6e 74 65 67 65 72 28 74 68 69 73 2e 62 79 44 69  nteger(this.byDi
3410: 63 2e 73 6c 69 63 65 28 69 41 64 64 72 2c 20 69  c.slice(iAddr, i
3420: 41 64 64 72 2b 74 68 69 73 2e 6e 42 79 74 65 73  Addr+this.nBytes
3430: 41 72 63 29 29 20 26 20 74 68 69 73 2e 5f 66 69  Arc)) & this._fi
3440: 6e 61 6c 4e 6f 64 65 4d 61 73 6b 29 20 7b 0a 20  nalNodeMask) {. 
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
3460: 53 75 67 67 2e 61 64 64 28 73 4e 65 77 57 6f 72  Sugg.add(sNewWor
3470: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
3480: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  }.            re
3490: 74 75 72 6e 20 61 53 75 67 67 3b 0a 20 20 20 20  turn aSugg;.    
34a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65      }.        le
34b0: 74 20 63 43 75 72 72 65 6e 74 20 3d 20 73 57 6f  t cCurrent = sWo
34c0: 72 64 2e 73 6c 69 63 65 28 30 2c 20 31 29 3b 0a  rd.slice(0, 1);.
34d0: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
34e0: 20 5b 63 43 68 61 72 2c 20 6a 41 64 64 72 5d 20   [cChar, jAddr] 
34f0: 6f 66 20 74 68 69 73 2e 5f 67 65 74 53 69 6d 69  of this._getSimi
3500: 6c 61 72 41 72 63 73 41 6e 64 43 72 75 73 68 65  larArcsAndCrushe
3510: 64 43 68 61 72 73 28 63 43 75 72 72 65 6e 74 2c  dChars(cCurrent,
3520: 20 69 41 64 64 72 29 29 20 7b 0a 20 20 20 20 20   iAddr)) {.     
3530: 20 20 20 20 20 20 20 61 53 75 67 67 2e 67 6c 5f         aSugg.gl_
3540: 75 70 64 61 74 65 28 74 68 69 73 2e 5f 73 75 67  update(this._sug
3550: 67 65 73 74 57 69 74 68 43 72 75 73 68 65 64 55  gestWithCrushedU
3560: 73 65 6c 65 73 73 43 68 61 72 73 28 73 57 6f 72  selessChars(sWor
3570: 64 2e 73 6c 69 63 65 28 31 29 2c 20 6e 44 65 65  d.slice(1), nDee
3580: 70 2b 31 2c 20 6a 41 64 64 72 2c 20 73 4e 65 77  p+1, jAddr, sNew
3590: 57 6f 72 64 2b 63 43 68 61 72 29 29 3b 0a 20 20  Word+cChar));.  
35a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35b0: 72 65 74 75 72 6e 20 61 53 75 67 67 3b 0a 20 20  return aSugg;.  
35c0: 20 20 7d 0a 0a 20 20 20 20 2a 20 5f 67 65 74 53    }..    * _getS
35d0: 69 6d 69 6c 61 72 41 72 63 73 41 6e 64 43 72 75  imilarArcsAndCru
35e0: 73 68 65 64 43 68 61 72 73 20 28 63 43 68 61 72  shedChars (cChar
35f0: 2c 20 69 41 64 64 72 29 20 7b 0a 20 20 20 20 20  , iAddr) {.     
3600: 20 20 20 2f 2f 20 67 65 6e 65 72 61 74 6f 72 3a     // generator:
3610: 20 79 69 65 6c 64 20 73 69 6d 69 6c 61 72 20 63   yield similar c
3620: 68 61 72 20 6f 66 20 3c 63 43 68 61 72 3e 20 61  har of <cChar> a
3630: 6e 64 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  nd address of th
3640: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 6f 64 65  e following node
3650: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65  .        for (le
3660: 74 20 5b 6e 56 61 6c 2c 20 6a 41 64 64 72 5d 20  t [nVal, jAddr] 
3670: 6f 66 20 74 68 69 73 2e 5f 67 65 74 41 72 63 73  of this._getArcs
3680: 28 69 41 64 64 72 29 29 20 7b 0a 20 20 20 20 20  (iAddr)) {.     
3690: 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e         if (this.
36a0: 64 43 68 61 72 56 61 6c 2e 67 65 74 28 6e 56 61  dCharVal.get(nVa
36b0: 6c 2c 20 6e 75 6c 6c 29 20 69 6e 20 63 68 61 72  l, null) in char
36c0: 5f 70 6c 61 79 65 72 2e 61 56 6f 76 65 6c 73 29  _player.aVovels)
36d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
36e0: 20 20 20 79 69 65 6c 64 20 5b 74 68 69 73 2e 64     yield [this.d
36f0: 43 68 61 72 56 61 6c 5b 6e 56 61 6c 5d 2c 20 6a  CharVal[nVal], j
3700: 41 64 64 72 5d 3b 0a 20 20 20 20 20 20 20 20 20  Addr];.         
3710: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
3720: 20 20 20 20 20 20 20 79 69 65 6c 64 2a 20 74 68         yield* th
3730: 69 73 2e 5f 67 65 74 53 69 6d 69 6c 61 72 41 72  is._getSimilarAr
3740: 63 73 28 63 43 68 61 72 2c 20 69 41 64 64 72 29  cs(cChar, iAddr)
3750: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20  ;.    }..    // 
3760: 6d 6f 72 70 68 20 28 73 57 6f 72 64 29 20 7b 0a  morph (sWord) {.
3770: 20 20 20 20 2f 2f 20 20 20 20 20 69 73 20 64 65      //     is de
3780: 66 69 6e 65 64 20 69 6e 20 63 6f 6e 73 74 72 75  fined in constru
3790: 63 74 6f 72 0a 20 20 20 20 2f 2f 20 7d 0a 20 20  ctor.    // }.  
37a0: 20 20 0a 20 20 20 20 2f 2f 20 56 45 52 53 49 4f    .    // VERSIO
37b0: 4e 20 31 0a 20 20 20 20 5f 6d 6f 72 70 68 31 20  N 1.    _morph1 
37c0: 28 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20  (sWord) {.      
37d0: 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 6d 6f 72    // returns mor
37e0: 70 68 6f 6c 6f 67 69 65 73 20 6f 66 20 73 57 6f  phologies of sWo
37f0: 72 64 0a 20 20 20 20 20 20 20 20 6c 65 74 20 69  rd.        let i
3800: 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
3810: 20 20 66 6f 72 20 28 6c 65 74 20 63 20 6f 66 20    for (let c of 
3820: 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20  sWord) {.       
3830: 20 20 20 20 20 69 66 20 28 21 74 68 69 73 2e 64       if (!this.d
3840: 43 68 61 72 2e 68 61 73 28 63 29 29 20 7b 0a 20  Char.has(c)) {. 
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
3860: 65 74 75 72 6e 20 5b 5d 3b 0a 20 20 20 20 20 20  eturn [];.      
3870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3880: 20 20 20 20 69 41 64 64 72 20 3d 20 74 68 69 73      iAddr = this
3890: 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 28  ._lookupArcNode(
38a0: 74 68 69 73 2e 64 43 68 61 72 2e 67 65 74 28 63  this.dChar.get(c
38b0: 29 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  ), iAddr);.     
38c0: 20 20 20 20 20 20 20 69 66 20 28 69 41 64 64 72         if (iAddr
38d0: 20 3d 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20   === null) {.   
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
38f0: 75 72 6e 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20  urn [];.        
3900: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
3910: 20 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73          if (this
3920: 2e 5f 63 6f 6e 76 42 79 74 65 73 54 6f 49 6e 74  ._convBytesToInt
3930: 65 67 65 72 28 74 68 69 73 2e 62 79 44 69 63 2e  eger(this.byDic.
3940: 73 6c 69 63 65 28 69 41 64 64 72 2c 20 69 41 64  slice(iAddr, iAd
3950: 64 72 2b 74 68 69 73 2e 6e 42 79 74 65 73 41 72  dr+this.nBytesAr
3960: 63 29 29 20 26 20 74 68 69 73 2e 5f 66 69 6e 61  c)) & this._fina
3970: 6c 4e 6f 64 65 4d 61 73 6b 29 20 7b 0a 20 20 20  lNodeMask) {.   
3980: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6c 20 3d           let l =
3990: 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20   [];.           
39a0: 20 6c 65 74 20 6e 52 61 77 41 72 63 20 3d 20 30   let nRawArc = 0
39b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  ;.            wh
39c0: 69 6c 65 20 28 21 28 6e 52 61 77 41 72 63 20 26  ile (!(nRawArc &
39d0: 20 74 68 69 73 2e 5f 6c 61 73 74 41 72 63 4d 61   this._lastArcMa
39e0: 73 6b 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  sk)) {.         
39f0: 20 20 20 20 20 20 20 6c 65 74 20 69 45 6e 64 41         let iEndA
3a00: 72 63 41 64 64 72 20 3d 20 69 41 64 64 72 20 2b  rcAddr = iAddr +
3a10: 20 74 68 69 73 2e 6e 42 79 74 65 73 41 72 63 3b   this.nBytesArc;
3a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3a30: 20 6e 52 61 77 41 72 63 20 3d 20 74 68 69 73 2e   nRawArc = this.
3a40: 5f 63 6f 6e 76 42 79 74 65 73 54 6f 49 6e 74 65  _convBytesToInte
3a50: 67 65 72 28 74 68 69 73 2e 62 79 44 69 63 2e 73  ger(this.byDic.s
3a60: 6c 69 63 65 28 69 41 64 64 72 2c 20 69 45 6e 64  lice(iAddr, iEnd
3a70: 41 72 63 41 64 64 72 29 29 3b 0a 20 20 20 20 20  ArcAddr));.     
3a80: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e             let n
3a90: 41 72 63 20 3d 20 6e 52 61 77 41 72 63 20 26 20  Arc = nRawArc & 
3aa0: 74 68 69 73 2e 5f 61 72 63 4d 61 73 6b 3b 0a 20  this._arcMask;. 
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3ac0: 66 20 28 6e 41 72 63 20 3e 3d 20 74 68 69 73 2e  f (nArc >= this.
3ad0: 6e 43 68 61 72 29 20 7b 0a 20 20 20 20 20 20 20  nChar) {.       
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
3af0: 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 6e 6f  This value is no
3b00: 74 20 61 20 63 68 61 72 2c 20 74 68 69 73 20 69  t a char, this i
3b10: 73 20 61 20 73 74 65 6d 6d 69 6e 67 20 63 6f 64  s a stemming cod
3b20: 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
3b30: 20 20 20 20 20 20 20 6c 65 74 20 73 53 74 65 6d         let sStem
3b40: 20 3d 20 22 3e 22 20 2b 20 74 68 69 73 2e 66 75   = ">" + this.fu
3b50: 6e 63 53 74 65 6d 6d 69 6e 67 28 73 57 6f 72 64  ncStemming(sWord
3b60: 2c 20 74 68 69 73 2e 6c 41 72 63 56 61 6c 5b 6e  , this.lArcVal[n
3b70: 41 72 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  Arc]);.         
3b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 6f             // No
3b90: 77 20 2c 20 77 65 20 67 6f 20 74 6f 20 74 68 65  w , we go to the
3ba0: 20 6e 65 78 74 20 6e 6f 64 65 20 61 6e 64 20 72   next node and r
3bb0: 65 74 72 69 65 76 65 20 61 6c 6c 20 66 6f 6c 6c  etrieve all foll
3bc0: 6f 77 69 6e 67 20 61 72 63 73 20 76 61 6c 75 65  owing arcs value
3bd0: 73 2c 20 61 6c 6c 20 6f 66 20 74 68 65 6d 20 61  s, all of them a
3be0: 72 65 20 74 61 67 73 0a 20 20 20 20 20 20 20 20  re tags.        
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
3c00: 69 41 64 64 72 32 20 3d 20 74 68 69 73 2e 5f 63  iAddr2 = this._c
3c10: 6f 6e 76 42 79 74 65 73 54 6f 49 6e 74 65 67 65  onvBytesToIntege
3c20: 72 28 74 68 69 73 2e 62 79 44 69 63 2e 73 6c 69  r(this.byDic.sli
3c30: 63 65 28 69 45 6e 64 41 72 63 41 64 64 72 2c 20  ce(iEndArcAddr, 
3c40: 69 45 6e 64 41 72 63 41 64 64 72 2b 74 68 69 73  iEndArcAddr+this
3c50: 2e 6e 42 79 74 65 73 4e 6f 64 65 41 64 64 72 65  .nBytesNodeAddre
3c60: 73 73 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ss));.          
3c70: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e 52            let nR
3c80: 61 77 41 72 63 32 20 3d 20 30 3b 0a 20 20 20 20  awArc2 = 0;.    
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 77 68 69 6c 65 20 28 21 28 6e 52 61 77 41 72 63  while (!(nRawArc
3cb0: 32 20 26 20 74 68 69 73 2e 5f 6c 61 73 74 41 72  2 & this._lastAr
3cc0: 63 4d 61 73 6b 29 29 20 7b 0a 20 20 20 20 20 20  cMask)) {.      
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ce0: 20 20 6c 65 74 20 69 45 6e 64 41 72 63 41 64 64    let iEndArcAdd
3cf0: 72 32 20 3d 20 69 41 64 64 72 32 20 2b 20 74 68  r2 = iAddr2 + th
3d00: 69 73 2e 6e 42 79 74 65 73 41 72 63 3b 0a 20 20  is.nBytesArc;.  
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d20: 20 20 20 20 20 20 6e 52 61 77 41 72 63 32 20 3d        nRawArc2 =
3d30: 20 74 68 69 73 2e 5f 63 6f 6e 76 42 79 74 65 73   this._convBytes
3d40: 54 6f 49 6e 74 65 67 65 72 28 74 68 69 73 2e 62  ToInteger(this.b
3d50: 79 44 69 63 2e 73 6c 69 63 65 28 69 41 64 64 72  yDic.slice(iAddr
3d60: 32 2c 20 69 45 6e 64 41 72 63 41 64 64 72 32 29  2, iEndArcAddr2)
3d70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3d80: 20 20 20 20 20 20 20 20 20 20 20 6c 2e 70 75 73             l.pus
3d90: 68 28 73 53 74 65 6d 20 2b 20 22 20 22 20 2b 20  h(sStem + " " + 
3da0: 74 68 69 73 2e 6c 41 72 63 56 61 6c 5b 6e 52 61  this.lArcVal[nRa
3db0: 77 41 72 63 32 20 26 20 74 68 69 73 2e 5f 61 72  wArc2 & this._ar
3dc0: 63 4d 61 73 6b 5d 29 3b 0a 20 20 20 20 20 20 20  cMask]);.       
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 69 41 64 64 72 32 20 3d 20 69 45 6e 64 41 72   iAddr2 = iEndAr
3df0: 63 41 64 64 72 32 2b 74 68 69 73 2e 6e 42 79 74  cAddr2+this.nByt
3e00: 65 73 4e 6f 64 65 41 64 64 72 65 73 73 3b 0a 20  esNodeAddress;. 
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
3e30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3e40: 20 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 69         iAddr = i
3e50: 45 6e 64 41 72 63 41 64 64 72 20 2b 20 74 68 69  EndArcAddr + thi
3e60: 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41 64 64 72  s.nBytesNodeAddr
3e70: 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ess;.           
3e80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   }.            r
3e90: 65 74 75 72 6e 20 6c 3b 0a 20 20 20 20 20 20 20  eturn l;.       
3ea0: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
3eb0: 6e 20 5b 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n [];.    }..   
3ec0: 20 5f 73 74 65 6d 31 20 28 73 57 6f 72 64 29 20   _stem1 (sWord) 
3ed0: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 72 65 74  {.        // ret
3ee0: 75 72 6e 73 20 73 74 65 6d 73 20 6c 69 73 74 20  urns stems list 
3ef0: 6f 66 20 73 57 6f 72 64 0a 20 20 20 20 20 20 20  of sWord.       
3f00: 20 6c 65 74 20 69 41 64 64 72 20 3d 20 30 3b 0a   let iAddr = 0;.
3f10: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
3f20: 20 63 20 6f 66 20 73 57 6f 72 64 29 20 7b 0a 20   c of sWord) {. 
3f30: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
3f40: 74 68 69 73 2e 64 43 68 61 72 2e 68 61 73 28 63  this.dChar.has(c
3f50: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
3f60: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 5d 3b 0a       return [];.
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3f80: 20 20 20 20 20 20 20 20 20 20 69 41 64 64 72 20            iAddr 
3f90: 3d 20 74 68 69 73 2e 5f 6c 6f 6f 6b 75 70 41 72  = this._lookupAr
3fa0: 63 4e 6f 64 65 28 74 68 69 73 2e 64 43 68 61 72  cNode(this.dChar
3fb0: 2e 67 65 74 28 63 29 2c 20 69 41 64 64 72 29 3b  .get(c), iAddr);
3fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
3fd0: 28 69 41 64 64 72 20 3d 3d 3d 20 6e 75 6c 6c 29  (iAddr === null)
3fe0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3ff0: 20 20 20 72 65 74 75 72 6e 20 5b 5d 3b 0a 20 20     return [];.  
4000: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4010: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
4020: 20 28 74 68 69 73 2e 5f 63 6f 6e 76 42 79 74 65   (this._convByte
4030: 73 54 6f 49 6e 74 65 67 65 72 28 74 68 69 73 2e  sToInteger(this.
4040: 62 79 44 69 63 2e 73 6c 69 63 65 28 69 41 64 64  byDic.slice(iAdd
4050: 72 2c 20 69 41 64 64 72 2b 74 68 69 73 2e 6e 42  r, iAddr+this.nB
4060: 79 74 65 73 41 72 63 29 29 20 26 20 74 68 69 73  ytesArc)) & this
4070: 2e 5f 66 69 6e 61 6c 4e 6f 64 65 4d 61 73 6b 29  ._finalNodeMask)
4080: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c   {.            l
4090: 65 74 20 6c 20 3d 20 5b 5d 3b 0a 20 20 20 20 20  et l = [];.     
40a0: 20 20 20 20 20 20 20 6c 65 74 20 6e 52 61 77 41         let nRawA
40b0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rc = 0;.        
40c0: 20 20 20 20 77 68 69 6c 65 20 28 21 28 6e 52 61      while (!(nRa
40d0: 77 41 72 63 20 26 20 74 68 69 73 2e 5f 6c 61 73  wArc & this._las
40e0: 74 41 72 63 4d 61 73 6b 29 29 20 7b 0a 20 20 20  tArcMask)) {.   
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
4100: 20 69 45 6e 64 41 72 63 41 64 64 72 20 3d 20 69   iEndArcAddr = i
4110: 41 64 64 72 20 2b 20 74 68 69 73 2e 6e 42 79 74  Addr + this.nByt
4120: 65 73 41 72 63 3b 0a 20 20 20 20 20 20 20 20 20  esArc;.         
4130: 20 20 20 20 20 20 20 6e 52 61 77 41 72 63 20 3d         nRawArc =
4140: 20 74 68 69 73 2e 5f 63 6f 6e 76 42 79 74 65 73   this._convBytes
4150: 54 6f 49 6e 74 65 67 65 72 28 74 68 69 73 2e 62  ToInteger(this.b
4160: 79 44 69 63 2e 73 6c 69 63 65 28 69 41 64 64 72  yDic.slice(iAddr
4170: 2c 20 69 45 6e 64 41 72 63 41 64 64 72 29 29 3b  , iEndArcAddr));
4180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4190: 20 6c 65 74 20 6e 41 72 63 20 3d 20 6e 52 61 77   let nArc = nRaw
41a0: 41 72 63 20 26 20 74 68 69 73 2e 5f 61 72 63 4d  Arc & this._arcM
41b0: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ask;.           
41c0: 20 20 20 20 20 69 66 20 28 6e 41 72 63 20 3e 3d       if (nArc >=
41d0: 20 74 68 69 73 2e 6e 43 68 61 72 29 20 7b 0a 20   this.nChar) {. 
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 20 2f 2f 20 54 68 69 73 20 76 61 6c 75 65     // This value
4200: 20 69 73 20 6e 6f 74 20 61 20 63 68 61 72 2c 20   is not a char, 
4210: 74 68 69 73 20 69 73 20 61 20 73 74 65 6d 6d 69  this is a stemmi
4220: 6e 67 20 63 6f 64 65 20 0a 20 20 20 20 20 20 20  ng code .       
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 2e 70               l.p
4240: 75 73 68 28 74 68 69 73 2e 66 75 6e 63 53 74 65  ush(this.funcSte
4250: 6d 6d 69 6e 67 28 73 57 6f 72 64 2c 20 74 68 69  mming(sWord, thi
4260: 73 2e 6c 41 72 63 56 61 6c 5b 6e 41 72 63 5d 29  s.lArcVal[nArc])
4270: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
4280: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4290: 20 20 20 20 20 69 41 64 64 72 20 3d 20 69 45 6e       iAddr = iEn
42a0: 64 41 72 63 41 64 64 72 20 2b 20 74 68 69 73 2e  dArcAddr + this.
42b0: 6e 42 79 74 65 73 4e 6f 64 65 41 64 64 72 65 73  nBytesNodeAddres
42c0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  s;.            }
42d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
42e0: 75 72 6e 20 6c 3b 0a 20 20 20 20 20 20 20 20 7d  urn l;.        }
42f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4300: 5b 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5f  [];.    }..    _
4310: 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 31 20 28  lookupArcNode1 (
4320: 6e 56 61 6c 2c 20 69 41 64 64 72 29 20 7b 0a 20  nVal, iAddr) {. 
4330: 20 20 20 20 20 20 20 2f 2f 20 6c 6f 6f 6b 73 20         // looks 
4340: 69 66 20 6e 56 61 6c 20 69 73 20 61 6e 20 61 72  if nVal is an ar
4350: 63 20 61 74 20 74 68 65 20 6e 6f 64 65 20 61 74  c at the node at
4360: 20 69 41 64 64 72 2c 20 69 66 20 79 65 73 2c 20   iAddr, if yes, 
4370: 72 65 74 75 72 6e 73 20 61 64 64 72 65 73 73 20  returns address 
4380: 6f 66 20 6e 65 78 74 20 6e 6f 64 65 20 65 6c 73  of next node els
4390: 65 20 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20 77  e None.        w
43a0: 68 69 6c 65 20 28 74 72 75 65 29 20 7b 0a 20 20  hile (true) {.  
43b0: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 69 45            let iE
43c0: 6e 64 41 72 63 41 64 64 72 20 3d 20 69 41 64 64  ndArcAddr = iAdd
43d0: 72 2b 74 68 69 73 2e 6e 42 79 74 65 73 41 72 63  r+this.nBytesArc
43e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  ;.            le
43f0: 74 20 6e 52 61 77 41 72 63 20 3d 20 74 68 69 73  t nRawArc = this
4400: 2e 5f 63 6f 6e 76 42 79 74 65 73 54 6f 49 6e 74  ._convBytesToInt
4410: 65 67 65 72 28 74 68 69 73 2e 62 79 44 69 63 2e  eger(this.byDic.
4420: 73 6c 69 63 65 28 69 41 64 64 72 2c 20 69 45 6e  slice(iAddr, iEn
4430: 64 41 72 63 41 64 64 72 29 29 3b 0a 20 20 20 20  dArcAddr));.    
4440: 20 20 20 20 20 20 20 20 69 66 20 28 6e 56 61 6c          if (nVal
4450: 20 3d 3d 20 28 6e 52 61 77 41 72 63 20 26 20 74   == (nRawArc & t
4460: 68 69 73 2e 5f 61 72 63 4d 61 73 6b 29 29 20 7b  his._arcMask)) {
4470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4480: 20 2f 2f 20 74 68 65 20 76 61 6c 75 65 20 77 65   // the value we
4490: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
44a0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
44b0: 20 20 2f 2f 20 77 65 20 72 65 74 75 72 6e 20 74    // we return t
44c0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
44d0: 65 20 6e 65 78 74 20 6e 6f 64 65 0a 20 20 20 20  e next node.    
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
44f0: 72 6e 20 74 68 69 73 2e 5f 63 6f 6e 76 42 79 74  rn this._convByt
4500: 65 73 54 6f 49 6e 74 65 67 65 72 28 74 68 69 73  esToInteger(this
4510: 2e 62 79 44 69 63 2e 73 6c 69 63 65 28 69 45 6e  .byDic.slice(iEn
4520: 64 41 72 63 41 64 64 72 2c 20 69 45 6e 64 41 72  dArcAddr, iEndAr
4530: 63 41 64 64 72 2b 74 68 69 73 2e 6e 42 79 74 65  cAddr+this.nByte
4540: 73 4e 6f 64 65 41 64 64 72 65 73 73 29 29 3b 0a  sNodeAddress));.
4550: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4560: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b            else {
4570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4580: 20 2f 2f 20 76 61 6c 75 65 20 6e 6f 74 20 66 6f   // value not fo
4590: 75 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  und.            
45a0: 20 20 20 20 69 66 20 28 6e 52 61 77 41 72 63 20      if (nRawArc 
45b0: 26 20 74 68 69 73 2e 5f 6c 61 73 74 41 72 63 4d  & this._lastArcM
45c0: 61 73 6b 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ask) {.         
45d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
45e0: 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  n null;.        
45f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4600: 20 20 20 20 20 20 20 20 20 20 69 41 64 64 72 20            iAddr 
4610: 3d 20 69 45 6e 64 41 72 63 41 64 64 72 20 2b 20  = iEndArcAddr + 
4620: 74 68 69 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41  this.nBytesNodeA
4630: 64 64 72 65 73 73 3b 0a 20 20 20 20 20 20 20 20  ddress;.        
4640: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
4650: 20 20 20 20 7d 0a 0a 20 20 20 20 2a 20 5f 67 65      }..    * _ge
4660: 74 41 72 63 73 31 20 28 69 41 64 64 72 29 20 7b  tArcs1 (iAddr) {
4670: 0a 20 20 20 20 20 20 20 20 22 67 65 6e 65 72 61  .        "genera
4680: 74 6f 72 3a 20 72 65 74 75 72 6e 20 61 6c 6c 20  tor: return all 
4690: 61 72 63 73 20 61 74 20 3c 69 41 64 64 72 3e 20  arcs at <iAddr> 
46a0: 61 73 20 74 75 70 6c 65 73 20 6f 66 20 28 6e 56  as tuples of (nV
46b0: 61 6c 2c 20 69 41 64 64 72 29 22 0a 20 20 20 20  al, iAddr)".    
46c0: 20 20 20 20 77 68 69 6c 65 20 28 74 72 75 65 29      while (true)
46d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c   {.            l
46e0: 65 74 20 69 45 6e 64 41 72 63 41 64 64 72 20 3d  et iEndArcAddr =
46f0: 20 69 41 64 64 72 2b 74 68 69 73 2e 6e 42 79 74   iAddr+this.nByt
4700: 65 73 41 72 63 3b 0a 20 20 20 20 20 20 20 20 20  esArc;.         
4710: 20 20 20 6c 65 74 20 6e 52 61 77 41 72 63 20 3d     let nRawArc =
4720: 20 74 68 69 73 2e 5f 63 6f 6e 76 42 79 74 65 73   this._convBytes
4730: 54 6f 49 6e 74 65 67 65 72 28 74 68 69 73 2e 62  ToInteger(this.b
4740: 79 44 69 63 2e 73 6c 69 63 65 28 69 41 64 64 72  yDic.slice(iAddr
4750: 2c 20 69 45 6e 64 41 72 63 41 64 64 72 29 29 3b  , iEndArcAddr));
4760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65  .            yie
4770: 6c 64 20 5b 6e 52 61 77 41 72 63 20 26 20 74 68  ld [nRawArc & th
4780: 69 73 2e 5f 61 72 63 4d 61 73 6b 2c 20 74 68 69  is._arcMask, thi
4790: 73 2e 5f 63 6f 6e 76 42 79 74 65 73 54 6f 49 6e  s._convBytesToIn
47a0: 74 65 67 65 72 28 74 68 69 73 2e 62 79 44 69 63  teger(this.byDic
47b0: 2e 73 6c 69 63 65 28 69 45 6e 64 41 72 63 41 64  .slice(iEndArcAd
47c0: 64 72 2c 20 69 45 6e 64 41 72 63 41 64 64 72 2b  dr, iEndArcAddr+
47d0: 74 68 69 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41  this.nBytesNodeA
47e0: 64 64 72 65 73 73 29 29 5d 3b 0a 20 20 20 20 20  ddress))];.     
47f0: 20 20 20 20 20 20 20 69 66 20 28 6e 52 61 77 41         if (nRawA
4800: 72 63 20 26 20 74 68 69 73 2e 5f 6c 61 73 74 41  rc & this._lastA
4810: 72 63 4d 61 73 6b 29 20 7b 0a 20 20 20 20 20 20  rcMask) {.      
4820: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
4840: 20 20 20 20 20 20 20 20 20 20 20 69 41 64 64 72             iAddr
4850: 20 3d 20 69 45 6e 64 41 72 63 41 64 64 72 2b 74   = iEndArcAddr+t
4860: 68 69 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41 64  his.nBytesNodeAd
4870: 64 72 65 73 73 3b 0a 20 20 20 20 20 20 20 20 7d  dress;.        }
4880: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 56  .    }..    // V
4890: 45 52 53 49 4f 4e 20 32 0a 20 20 20 20 5f 6d 6f  ERSION 2.    _mo
48a0: 72 70 68 32 20 28 73 57 6f 72 64 29 20 7b 0a 20  rph2 (sWord) {. 
48b0: 20 20 20 20 20 20 20 2f 2f 20 74 6f 20 64 6f 0a         // to do.
48c0: 20 20 20 20 7d 0a 0a 20 20 20 20 5f 73 74 65 6d      }..    _stem
48d0: 32 20 28 73 57 6f 72 64 29 20 7b 0a 20 20 20 20  2 (sWord) {.    
48e0: 20 20 20 20 2f 2f 20 74 6f 20 64 6f 0a 20 20 20      // to do.   
48f0: 20 7d 0a 0a 20 20 20 20 5f 6c 6f 6f 6b 75 70 41   }..    _lookupA
4900: 72 63 4e 6f 64 65 32 20 28 6e 56 61 6c 2c 20 69  rcNode2 (nVal, i
4910: 41 64 64 72 29 20 7b 0a 20 20 20 20 20 20 20 20  Addr) {.        
4920: 2f 2f 20 74 6f 20 64 6f 0a 20 20 20 20 7d 0a 0a  // to do.    }..
4930: 0a 20 20 20 20 2f 2f 20 56 45 52 53 49 4f 4e 20  .    // VERSION 
4940: 33 0a 20 20 20 20 5f 6d 6f 72 70 68 33 20 28 73  3.    _morph3 (s
4950: 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20  Word) {.        
4960: 2f 2f 20 74 6f 20 64 6f 0a 20 20 20 20 7d 0a 0a  // to do.    }..
4970: 20 20 20 20 5f 73 74 65 6d 33 20 28 73 57 6f 72      _stem3 (sWor
4980: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20  d) {.        // 
4990: 74 6f 20 64 6f 0a 20 20 20 20 7d 0a 0a 20 20 20  to do.    }..   
49a0: 20 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 33   _lookupArcNode3
49b0: 20 28 6e 56 61 6c 2c 20 69 41 64 64 72 29 20 7b   (nVal, iAddr) {
49c0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 74 6f 20 64  .        // to d
49d0: 6f 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 69 66 20 28  o.    }.}...if (
49e0: 74 79 70 65 6f 66 28 65 78 70 6f 72 74 73 29 20  typeof(exports) 
49f0: 21 3d 3d 20 27 75 6e 64 65 66 69 6e 65 64 27 29  !== 'undefined')
4a00: 20 7b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 49   {.    exports.I
4a10: 42 44 41 57 47 20 3d 20 49 42 44 41 57 47 3b 0a  BDAWG = IBDAWG;.
4a20: 7d 0a                                            }.