docs: def _extractEgaNegFromSent( sentTokens, clausesDict, foundChains ):
      ''' Meetod, mis tuvastab antud lausest 'ega'-predikaadiga seotud eituse(d): ega + sobiv verb.
          *) Juhtudel kui 'ega'-le j2rgneb juba tuvastatud, positiivse polaarsusega verbiahel (nt 
             ahel mille alguses on käskivas kõneviisis verb), liidetakse 'ega' olemasoleva ahela ette
             ning muudetakse ahela polaarsus negatiivseks;
          *) Muudel juhtudel otsitakse 'ega'-le j2rgnevat 'ei'-ga sobivat verbi (enamasti on selleks
             'nud'-verb) ning liidetakse see (teatud heuristikute j2rgi) 'ega'-ga yheks fraasiks;
  
          Tagastab True, kui uute 'ega' fraaside seas leidus m6ni selline, mida potentsiaalselt saaks 
          veel m6ne teise verbi liitmisega laiendada, muudel juhtudel tagastab False;
          
          Miks see meetod opereerib tervel lausel, mitte yksikul osalausel?
          >> Kuna 'ega' on sageli m2rgitud osalause piiriks (p2rast 'ega'-t v6ib l6ppeda osalause), 
             ei saa 'ega'-le j2rgnevaid verbe alati otsida yhe osalause seest, vaid tuleb vaadata 
             korraga mitut k6rvutiolevat osalauset; k2esolevalt lihtsustame ja vaatame tervet 
             lauset.
      '''
      sonaEga     = WordTemplate({ROOT:'^ega$',POSTAG:'[DJ]'})
      verbEiJarel  = WordTemplate({POSTAG:'V',FORM:'(o|nud|tud|nuks|nuvat|vat|ks|ta|taks|tavat)$'})
      verbEiJarel2 = WordTemplate({ROOT:'^mine$', POSTAG:'V',FORM:'neg o$'})
      verbTud     = WordTemplate({POSTAG:'V',FORM:'(tud)$'})
      verb        = WordTemplate({POSTAG:'V'})
      verbOlema   = WordTemplate({POSTAG:'V', ROOT:'^(ole)$'})
      # J22dvustame s6nad, mis kuuluvad juba mingi tuvastatud verbifraasi koosseisu
      annotatedWords = []
      for verbObj in foundChains:
          if (len(verbObj[PATTERN])==1 and re.match('^(ei|ära|ega)$', verbObj[PATTERN][0])):
              # V2lja j22vad yksikuna esinevad ei/ära/ega, kuna need tõenäoliselt ei sega
              continue
          annotatedWords.extend( verbObj[PHRASE] )
      expandableEgaFound = False
      for i in range(len(sentTokens)):
          token = sentTokens[i]
          if sonaEga.matches(token) and token[WORD_ID] not in annotatedWords:
              matchFound = False
              if i+1 < len(sentTokens) and sentTokens[i+1][WORD_ID] in annotatedWords:
                  #
                  #    K6ige lihtsam juht: eelnevalt on verbifraas juba tuvastatud (ja 
                  #   eeldatavasti maksimaalses pikkuses), seega pole teha muud, kui sellele
                  #   ega ette panna ning polaarsuse negatiivseks muuta:
                  #         Te saate kaebusi palju ega_0 jõua_0 nendele reageerida_0 .
                  #         vene keelt ta ei mõista ega_0 või_0 seepärast olla_0 vene spioon
                  #   NB! Lisamist ei teosta siiski juhtudel kui:
                  #    *) J2rgnev fraas on juba negatiivse polaarsusega (selline laiendamine 
                  #       tekitaks lihtsalt mustreid juurde, aga sisulist infot juurde ei 
                  #       annaks);
                  #    *) J2rgnev s6na pole 'ei'-ga yhilduv verb (t6en2oliselt on mingi jama,
                  #       nt morf yhestamisel);
                  #    *) J2rgnev s6na kuulub verbiahelasse, mis algab enne 'ega'-t (see viitab 
                  #       tegelikult sellele, et k6nealune verbiahel on katkiselt eraldatud);
                  #
                  for verbObj in foundChains:
                      if sentTokens[i+1][WORD_ID] in verbObj[PHRASE] and verbObj[POLARITY] != 'NEG' and \
                         (verbEiJarel.matches( sentTokens[i+1] ) or verbEiJarel2.matches( sentTokens[i+1] )) \
                         and i < min( verbObj[PHRASE] ):
                              verbObj[PHRASE].insert(0, token[WORD_ID])
                              verbObj[PATTERN].insert(0, 'ega')
                              verbObj[POLARITY] = 'NEG'
                              verbObj[ANALYSIS_IDS].insert(0, _getMatchingAnalysisIDs( token, sonaEga ) )
                              annotatedWords.append( token[WORD_ID] )
                              matchFound = True
                              break
              elif i+1 < len(sentTokens) and verbEiJarel.matches( sentTokens[i+1] ) and \
               sentTokens[i+1][WORD_ID] not in annotatedWords:
                  #
                  #    Heuristik:
                  #      kui 'ega'-le j2rgneb vahetult 'ei'-ga sobiv verb (peaks olema
                  #     infiniitne nud/tud verb, kuna finiitsed leitakse ja seotakse
                  #     t6en2oliselt eelmises harus), siis eraldame uue fraasina:
                  #
                  #        Hakkasin Ainikiga rääkima ega_0 pööranud_0 Ivole enam tähelepanu .
                  #        Tereese oli tükk aega vait ega_0 teadnud_0 , kas tõtt rääkida või mitte .
                  #
                  # >> clauseID-iks saab j2rgneva verbi ID, kuna 'ega' j2relt l2heb sageli
                  #    osalausepiir ning ega-le eelnevad verbid kindlasti sellega seotud olla 
                  #    ei saa.
                  clauseID = sentTokens[i+1][CLAUSE_IDX]
                  wid1 = sentTokens[i][WORD_ID]
                  wid2 = sentTokens[i+1][WORD_ID]
                  verbObj = { PHRASE: [wid1, wid2], PATTERN: ["ega", "verb"] }
                  verbObj[CLAUSE_IDX] = clauseID
                  if verbOlema.matches(sentTokens[i+1]):
                      verbObj[PATTERN][1] = 'ole'
                  verbObj[POLARITY] = 'NEG'
                  verbObj[ANALYSIS_IDS] = []
                  verbObj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( sentTokens[i], sonaEga ) )
                  verbObj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( sentTokens[i+1], verbEiJarel ) )
                  # Teeme kindlaks, kas j2rgneb veel verbe, mis v6iksid potentsiaalselt liituda
                  verbObj[OTHER_VERBS] = False
                  if i+2 < len(sentTokens):
                      for j in range(i+2, len(sentTokens)):
                          token2 = sentTokens[j]
                          if token2[CLAUSE_IDX] == clauseID and verb.matches(token2):
                              verbObj[OTHER_VERBS] = True
                              break
                  if verbObj[OTHER_VERBS]:
                      expandableEgaFound = True
                  else:
                      #
                      #    Kui osalausest on tuvastatud teisi predikaadieituseid ning need
                      #   eelnevad praegusele 'ega'-eitusele , nt:
                      #        Ei lükka ma ümber ega kinnita.
                      #        Ta ei oota ega looda_0 ( enam ).
                      #    V6ib olla tegu keerukama tervikfraasiga, nt:
                      #        Ta ise pole kuidagi saanud ega tahnud_0 end samastada nendega.
                      #    Sellistel juhtudel m2rgime konteksti mitmeseks, kuna 'ega'-fraas
                      #    v6ib toetuda varasemale verbiahelale;
                      #
                      for j in range(i-1, -1, -1):
                          token2 = sentTokens[j]
                          if token2[CLAUSE_IDX] == clauseID:
                              for verbObj2 in foundChains:
                                  if token2[WORD_ID] in verbObj2[PHRASE] and verbObj2[POLARITY] != 'POS':
                                      verbObj[OTHER_VERBS] = True
                                      break
                  foundChains.append( verbObj )
                  annotatedWords.extend( verbObj[PHRASE] )
                  matchFound = True
              if not matchFound:
                  #
                  #    2.  'ega' + kaugemal järgnev verb
                  # 
                  #    2.1   Kui 'ega'-le ei j2rgne ega eelne yhtegi eitust, kyll aga j2rgneb 
                  #          (osalause piires) 'ei'-le sobiv verb, loeme teatud juhtudel, et 
                  #          tegu on sobiva eitusfraasiga.
                  #          Nt.
                  #              Nii et ega_0 Diana jõulureedel sünnitanudki .
                  #              Ega_0 ta tahtnud algul rääkida .
                  #           Yldiselt paistab see muster olevat sage just ilukirjanduses ja 
                  #          suulise k6ne l2hedases keelekasutuses, harvem ajakirjanduses ning
                  #          veel v2hem kasutusel teaduskirjanduses;
                  #
                  egaClauseID = sentTokens[i][CLAUSE_IDX]
                  precedingNeg = False
                  followingNeg = False
                  followingPos = None
                  for verbObj1 in foundChains:
                      if verbObj1[CLAUSE_IDX] == egaClauseID:
                          if verbObj1[POLARITY] != 'POS':
                              if any([ wid < sentTokens[i][WORD_ID] for wid in verbObj1[PHRASE] ]):
                                  precedingNeg = True
                              if any([ wid > sentTokens[i][WORD_ID] for wid in verbObj1[PHRASE] ]):
                                  followingNeg = True
                          elif verbObj1[POLARITY] == 'POS' and \
                               all([wid > sentTokens[i][WORD_ID] for wid in verbObj1[PHRASE]]):
                              followingPos = verbObj1
                  if not precedingNeg and not followingNeg:
                      if followingPos:
                          #
                          #    K6ige lihtsam juht: kui j2rgneb positiivne verbiahel (ja eeldatavasti 
                          #   maksimaalses pikkuses) ning:
                          #        *) ahelverbi ja 'ega' vahel pole punktuatsiooni;
                          #        *) ahelverb sisaldab 'ei'-ga yhilduvat verbivormi;
                          #   liidame ahelale 'ega' ette ning muudame polaarsuse negatiivseks:
                          #        Ega_0 neil seal kerge ole_0 . "
                          #        Ega_0 70 eluaastat ole_0 naljaasi !
                          #        Ega_0 sa puusärgis paugutama_0 hakka_0 . "
                          #
                          minWID = min(followingPos[PHRASE])
                          phraseTokens = [t for t in sentTokens if t[WORD_ID] in followingPos[PHRASE]]
                          if any( [verbEiJarel.matches( t ) for t in phraseTokens] ) and \
                             not _isSeparatedByPossibleClauseBreakers( sentTokens, token[WORD_ID], minWID, True, True, False):
                              followingPos[PHRASE].insert(0, token[WORD_ID])
                              followingPos[PATTERN].insert(0, 'ega')
                              followingPos[POLARITY] = 'NEG'
                              followingPos[ANALYSIS_IDS].insert(0, _getMatchingAnalysisIDs( token, sonaEga ) )
                              annotatedWords.append( token[WORD_ID] )
                              matchFound = True
                              #
                              #   Veakoht - vahel on 'kui':
                              #      " Ega_0 muud kui pista_0 heinad põlema_0
                              #
                      elif i+1 < len(sentTokens):
                          #
                          #    Heuristik:
                          #      Kui 'ega'-le j2rgneb samas osalauses 'ei'-ga sobiv verb ning:
                          #        *) see verb ei ole 'tud'-verb (seega t6en2oliselt on 'nud');
                          #        *) see verb asub osalause l6pus v6i pole 'ega'-st kaugemal kui 
                          #           2 s6na;
                          #        *) see verb ei kuulu juba m2rgendatud verbiahelate sisse;
                          #      siis eraldame uue 'ega'-fraasina, nt:
                          #
                          #            Ega_0 poiss teda enam vahtinudki_0 .
                          #            Ega_0 keegi sellist tulemust ju soovinud_0 ,
                          #            Ja ega_0 ta soovinudki_0 Semperi kombel ümber õppida .
                          #
                          for j in range(i+1, len(sentTokens)):
                              token2 = sentTokens[j]
                              if token2[CLAUSE_IDX] == egaClauseID and verbEiJarel.matches(token2) and \
                                 not verbTud.matches(token2) and token2[WORD_ID] not in annotatedWords and \
                                 (_isClauseFinal( token2[WORD_ID], clausesDict[token2[CLAUSE_IDX]] ) or \
                                 j-i <= 2):
                                      wid1 = sentTokens[i][WORD_ID]
                                      wid2 = token2[WORD_ID]
                                      verbObj = { PHRASE: [wid1, wid2], PATTERN: ["ega", "verb"] }
                                      verbObj[CLAUSE_IDX] = token2[CLAUSE_IDX]
                                      if verbOlema.matches(token2):
                                          verbObj[PATTERN][1] = 'ole'
                                      verbObj[POLARITY] = 'NEG'
                                      verbObj[ANALYSIS_IDS] = []
                                      verbObj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( sentTokens[i], sonaEga ) )
                                      verbObj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( token2, verbEiJarel ) )
                                      # Teeme kindlaks, kas osalauses on veel verbe, mis v6iksid potentsiaalselt liituda
                                      verbObj[OTHER_VERBS] = False
                                      if i+2 < len(sentTokens):
                                          for j in range(i+2, len(sentTokens)):
                                              token3 = sentTokens[j]
                                              if token3[CLAUSE_IDX] == verbObj[CLAUSE_IDX] and \
                                                 token2 != token3 and verb.matches(token3):
                                                      verbObj[OTHER_VERBS] = True
                                                      break
                                      if verbObj[OTHER_VERBS]:
                                          expandableEgaFound = True
                                      foundChains.append( verbObj )
                                      annotatedWords.extend( verbObj[PHRASE] )
                                      matchFound = True
                                      break
      return expandableEgaFound