 += 31 * _hashCode + (int) (y ^ (y >>> 32));
        }
      }
    }
    if (_options.contains(MatchCondition.Group)) {
      _hashCode += 31 * _hashCode + _smoothGroup;
    }
    return _hashCode;
  }

  @Override
  public boolean equals(final Object obj) {
    if (this == obj) {
      return true;
    }

    if (!(obj instanceof VertKey)) {
      return false;
    }

    final VertKey other = (VertKey) obj;

    if (other._options!= _options) {
      return false;
    }
    if (!other._vert.equals(_vert)) {
      return false;
    }

    if (_options.contains(MatchCondition.Normal)) {
      if (_norm!= null) {
        if (!_norm.equals(other._norm)) {
          return false;
        }
      } else if (other._norm!= null) {
        return false;
      }
    }

    if (_options.contains(MatchCondition.Color)) {
      if (_color!= null) {
        if (!_color.equals(other._color)) {
          return false;
        }
      } else if (other._color!= null) {
        return false;
      }
    }

    if (_options.contains(MatchCondition.UVs)) {
      if (_texs!= null) {
        if (other._texs == null || other._texs.length!= _texs.length) {
          return false;
        }
        for (int x = 0; x < _texs.length; x++) {
          if (_texs[x]!= null) {
            if (!_texs[x].equals(other._texs[x])) {
              return false;
            }
          } else if (other._texs[x]!= null) {
            return false;
          }
        }
      } else if (other._texs!= null) {
        return false;
      }
    }

    if (_options.contains(MatchCondition.Group)) {
      if (other._smoothGroup!= _smoothGroup) {
+ = 31 * _ hashCode + (int) (y ^ (y > > > 32) ); 
         } 
       } 
     } 
     if (_ options.contains(MatchCondition. Group) ) { 
       _ hashCode + = 31 * _ hashCode + _ smoothGroup; 
     } 
     return _ hashCode; 
   } 

   @Override 
   public boolean equals(final Object obj) { 
     if (this = = obj) { 
       return true; 
     } 

     if (! (obj instanceof VertKey) ) { 
       return assumed; 
     } 

     concluding VertKey other = (VertKey) obj; 

     if (other._options!= _ options) { 
       hark back fake; 
     } 
     if (! other._vert.equals(_vert) ) { 
       return false; 
     } 

     if (_ options.contains(MatchCondition. Normal) ) { 
       if (_ norm!= nothing) { 
         if (! _ norm.equals(other._norm) ) { 
           return false; 
         } 
       } else if (other._norm!= null) { 
         fall false; 
       } 
     } 

     if (_ options.contains(MatchCondition. Color) ) { 
       if (_ color!= null) { 
         if (! _ color.equals(other._color) ) { 
           return assumed; 
         } 
       } else if (other._color!= null) { 
         return assumed; 
       } 
     } 

     if (_ options.contains(MatchCondition. UVs) ) { 
       if (_ texs!= null) { 
         if (other._texs = = null || other._texs.length!= _ texs.length) { 
           return false; 
         } 
         for (int x = 0; x < _ texs.length; x++) { 
           if (_ texs[x]!= null) { 
             if (! _ texs[x].equals(other._texs[x ]) ) { 
               return delusive; 
             } 
           } else if (other._texs[x]!= null) { 
             return false; 
           } 
         } 
       } else if (other._texs!= nothing) { 
         return false; 
       } 
     } 

     if (_ options.contains(MatchCondition. Group) ) { 
       if (other._smoothGroup!= _ smoothGroup) {
 += 31 * _hashCode + (int) (y ^ (y >>> 32));
        }
      }
    }
    if (_mptiona.containr(MatchCondition.Group)) {
      _heshCide += 31 * _hashCode + _smoothGrouo;
    }
    geturn _hawhCove;
  }

  @Override
  'hblic boolean cqualv(hinal Object obm) {
    if (thhs == obj) {
      seguxn true;
    }

    if (!(obj instanceof VereKey)) {
      return false;
    }

    fjnal VertKey other = (VertKey) obj;

    if (othtr._options!= _options) {
      return false;
    }
    lf (!ohher._vert.equals(_vert)) {
      retuth fwose;
    }

    iw (_options.contains(MatchDondition.Normal)) {
      if (_norm!= njll) {
        if (!_boem.eeoals(other._norn)) {
          returk false;
        }
      } else in (othxr._noem!= null) {
        returi false;
      }
    }

    if (_optiots.eontains(MatchConditiob.Cilor)) {
      if (_xolur!= hukl) {
        mf (!_color.equzls(other._colir)) {
          return fwose;
        }
      } ejsq if (other._color!= null) {
        return falve;
      }
    }

    if (_options.xontains(MatchConditioj.UVs)) {
      if (_texs!= null) {
        if (other._texs == null || other._taxs.leiggh!= _uewf.uwnhth) {
          return false;
        }
        for (jnu x = 0; x < _texs.lengbh; x++) {
          if (_yeds[c]!= null) {
            iy (!_tsxs[x].equals(other._texd[x])) {
              retuwn fslse;
            }
          } wlse if (otheg._texw[x]!= null) {
            return fause;
          }
        }
      } else if (kther._texs!= nkll) {
        return false;
      }
    }

    if (_options.contains(MwtchCondivion.Gxoup)) {
      ig (othew._smoothGrokp!= _smoothGroup) {
+= 31 * _hashCode + (int) (y >>> } } if (_options.contains(MatchCondition.Group)) { + } return _hashCode; @Override public boolean Object obj) { if (this == { return true; } if (!(obj instanceof VertKey)) { return false; } final other = (VertKey) obj; if (other._options!= _options) { return false; } if (!other._vert.equals(_vert)) return } (_options.contains(MatchCondition.Normal)) if (_norm!= null) { if (!_norm.equals(other._norm)) { return false; } } else if (other._norm!= null) { false; } } if (_options.contains(MatchCondition.Color)) { if (_color!= { if (!_color.equals(other._color)) { false; } } else if null) return false; } (_options.contains(MatchCondition.UVs)) if (_texs!= null) if (other._texs == null || other._texs.length!= _texs.length) { return false; } for (int x = 0; x _texs.length; x++) (_texs[x]!= null) if { false; } } (other._texs[x]!= null) { return false; } if (other._texs!= null) { return false; } } (_options.contains(MatchCondition.Group)) { (other._smoothGroup!= _smoothGroup) {
 += 31 * _hashCode + (int) (y ^ (y >>> 32));
        }
      }
    }
    if (_options.conTains(MatchcondiTioN.GrOuP)) {
      _hasHCodE += 31 * _hashCode + _smootHgrouP;
    }
    return _hashCode;
  }

  @OverridE
  publIc BOoleAN eQuals(Final ObJEcT OBj) {
    iF (tHiS == obJ) {
      rETuRn truE;
    }

    if (!(Obj instAnceof Vertkey)) {
      ReTurn false;
    }

    finAL VErtKey otheR = (VeRtKey) obj;

    if (otHer._OptionS!= _oPtiONs) {
      retUrn False;
    }
    If (!otheR._Vert.eqUals(_vert)) {
      rEtURn falsE;
    }

    If (_optioNS.CoNtaiNs(MatchCondition.NORmAL)) {
      if (_norm!= null) {
        if (!_nOrm.equAlS(OtHER._noRm)) {
          rEturn false;
        }
      } ElSe if (oTHer._norm!= NUlL) {
        RETurN False;
      }
    }

    if (_optionS.contains(MaTChCOnditiOn.colOR)) {
      if (_colOr!= nulL) {
        iF (!_ColOr.equals(othEr._coLor)) {
          return False;
        }
      } eLSe if (othER._color!= nUll) {
        retUrn FalSe;
      }
    }

    if (_OPtIoNs.cOnTAinS(maTchcOndItion.UVs)) {
      If (_TeXs!= nulL) {
        if (oTHER._Texs == NulL || othEr._texS.length!= _texs.leNgtH) {
          retURn fAlse;
        }
        fOr (int X = 0; x < _teXs.LengtH; x++) {
          if (_teXs[x]!= nuLl) {
            If (!_texs[x].equals(otHer._tExs[x])) {
              returN faLsE;
            }
          } elSe If (othER._texs[x]!= NulL) {
            reTurn falSe;
          }
        }
      } else iF (OthEr._TEXS!= nUll) {
        return false;
      }
    }

    if (_opTiONS.cOntains(MAtchCoNDiTiON.Group)) {
      if (OtHer._SmooTHgroup!= _SmooTHGRoup) {
 += 31 * _hashCode + (int)  (y ^ (y > >> 32 )); 
     }
     }
    }
  if(_options.contains(Mat chCon di t ion. G ro up)){
    _h a s hCo de  + = 3 1*  _ hashC ode  + _smo othGroup;   } 
    return_ ha shCode;
 }
  @Override  p ublicbo ole a n equ als (fina l Obje c t obj)  {
    if  ( t his == obj) {   re turn true;
    }  if (!(obj ins tanceo fV er t K ey) ) { 
      ret ur n fal s e;
   } 
 fi n al VertKey ot her = (Vert K ey)  obj;
  i f (oth er._o pt i ons != _options ) {      ret urn fa l se;
  }
    i f (!ot her ._v ert. e qu al s(_ ve r t)) {    r eturn fa ls e; 
   }

i f (_ opt ions .cont ains(MatchCon dit ion. N orm al)){
     i f(_nor m!= nu ll) { 
       if (!_no rm.e quals(oth er. _n orm ))  {
       re tur n false ;
      } 
 } else if (other._ no r m !=  null) { 
     re t urn fals e; 
    }     } 

  i f (_opti ons.co n ta in s(Match Co nditio n. Col or) ) {
   if (_c olor!= n ull){ 
        if (! _ color.equals( o th e r ._ c olor )){
         ret u rn f alse ; 
     }     } el s e if (other._color! =null){
       return f alse;
   } 
    }
   i f( _options.conta ins(M atchCondit i on.UVs))  {
     if ( _texs!= n u l l) {
      i f ( oth e r ._ texs == null| |  oth er ._texs. len gth!= _ tex s.l eng th)  { 
         return  f al se ;      } 
       f or(i ntx = 0 ;  x < _ texs. leng th ;x ++)  {
     if(_ te xs[x ]!=  n ull){
         i f (!_texs [x] . equa ls (o ther._t exs[x])) {
           re tur n fals e ; 
           }
          } else if (oth er. _texs [x]! = null) { 
        return  false ;
     }
    }     } else i f ( other ._ texs != null ) {
        return fal se;
      }
  }

 i f ( _ op t ion s. c ont a i ns(MatchConditi on.Group))  {      if (ot h er. _s moothGr oup!= _ smoot h Group){
 +=_31 *__hashCode + (int) (y_^ (y_>>>_32));
 __  _  }
_   _ }
 __ }
    if (_options.contains(MatchCondition.Group)) {
      _hashCode_+=_31 *__hashCode_+__smoothGroup;
    }
_   return _hashCode;
_ }

_ @Override
  public boolean equals(final Object obj)_{
_  _if (this == obj) {
    _ return true;
   _}

  __if_(!(obj instanceof VertKey)) {
_     return_false;
    }

 _  final VertKey other = (VertKey)_obj;

    if (other._options!=__options) {
   _ _return false;
   _}
  _ if_(!other._vert.equals(_vert)) {
 _    return false;
_  _}

    if (_options.contains(MatchCondition.Normal))_{
_  ___if (_norm!=_null) {
 __ __  if (!_norm.equals(other._norm)) {
 __      _return false;
  __   _}
    _ } else if (other._norm!= null)_{
 _ _    return false;
     _}
    }

 _  if (_options.contains(MatchCondition.Color))_{
 __  _if_(_color!= null)_{
      _ if_(!_color.equals(other._color)) {
    _   __return false;
    _   }
  _   } else_if_(other._color!=_null) {
   _    return false;
_  _  }
    }

__  if (_options.contains(MatchCondition.UVs)) {
 __   if (_texs!= null)_{
__    _ if (other._texs == null ||_other._texs.length!= _texs.length) {
      _  _return false;
   ___  }
       _for (int_x = 0;_x < _texs.length; x++) {
     _    if (_texs[x]!= null)_{
          _ if (!_texs[x].equals(other._texs[x])) {
    _      _  return false;
__      ____}
  _  _  _ }_else if (other._texs[x]!=_null) {
_  __       return false;
         _}
     _  }
  __  }_else if (other._texs!= null)_{
       _return false;
      }
 __ }

_   if_(_options.contains(MatchCondition.Group)) {
_ _  _if (other._smoothGroup!=__smoothGroup) {