docs: def removeRedundantVerbChains( foundChains, removeOverlapping = True, removeSingleAraAndEi = False ):
      ''' Eemaldab yleliigsed verbiahelad: ahelad, mis katavad osaliselt v6i t2ielikult 
          teisi ahelaid (removeOverlapping == True), yhes6nalised 'ei' ja 'ära' ahelad (kui 
          removeSingleAraAndEi == True);
          
           Yldiselt on nii, et ylekattuvaid ei tohiks palju olla, kuna fraaside laiendamisel
          pyytakse alati kontrollida, et laiendus ei kattuks m6ne olemasoleva fraasiga;
          Peamiselt tekivad ylekattuvused siis, kui morf analyysi on sattunud valed 
          finiitverbi analyysid (v6i analyysid on j22nud mitmesteks) ja seega tuvastatakse 
          osalausest rohkem finiitverbe, kui oleks vaja.
           Heuristik: kahe ylekattuva puhul j2tame alles fraasi, mis algab eespool ning 
          m2rgime sellel OTHER_VERBS v22rtuseks True, mis m2rgib, et kontekstis on mingi
          segadus teiste verbidega.
      '''
      toDelete = []
      for i in range(len(foundChains)):
          matchObj1 = foundChains[i]
          if removeOverlapping:
              for j in range(i+1, len(foundChains)):
                  matchObj2 = foundChains[j]
                  if matchObj1 != matchObj2 and matchObj1[CLAUSE_IDX] == matchObj2[CLAUSE_IDX]:
                      phrase1 = set(matchObj1[PHRASE])
                      phrase2 = set(matchObj2[PHRASE])
                      intersect = phrase1.intersection(phrase2)
                      if len(intersect) > 0:
                          #  Yldiselt on nii, et ylekattuvaid ei tohiks olla, kuna fraaside laiendamisel
                          # pyytakse alati kontrollida, et laiendus ei kattuks m6ne olemasoleva fraasiga;
                          #  Peamiselt tekivad ylekattuvused siis, kui morf analyysil on finiitverbi 
                          # analyysidesse j22nud sisse mitmesused (v6i on sattunud valed analyysid) ja 
                          # seega tuvastatakse osalausest rohkem finiitverbe, kui oleks vaja.
                          #  Heuristik: j2tame alles fraasi, mis algab eespool ning lisame selle otsa
                          # kysim2rgi (kuna pole kindel, et asjad on korras)
                          minWid1 = min(matchObj1[PHRASE])
                          minWid2 = min(matchObj2[PHRASE])
                          if minWid1 < minWid2:
                              matchObj1[OTHER_VERBS] = True
                              toDelete.append(j)
                          else:
                              matchObj2[OTHER_VERBS] = True
                              toDelete.append(i)
          if removeSingleAraAndEi:
              if ( len(matchObj1[PATTERN])==1 and re.match('^(ei|ära)$', matchObj1[PATTERN][0]) ):
                  toDelete.append(i)
      if toDelete:
          if len(set(toDelete)) != len(toDelete):
              toDelete = list(set(toDelete))  # Eemaldame duplikaadid
          toDelete = [ foundChains[i] for i in toDelete ]
          for verbObj in toDelete:
              foundChains.remove(verbObj)