// Path: src/matcher/type/Matchable.java
// public interface Matchable<T extends Matchable<T>> {
// 	MatchableKind getKind();
// 
// 	String getId();
// 	String getName();
// 	String getName(NameType type);
// 
// 	default String getDisplayName(NameType type, boolean full) {
// 		return getName(type);
// 	}
// 
// 	boolean hasMappedName();
// 	boolean hasLocalTmpName();
// 	boolean hasAuxName(int index);
// 
// 	String getMappedComment();
// 	void setMappedComment(String comment);
// 
// 	Matchable<?> getOwner();
// 	ClassEnv getEnv();
// 
// 	int getUid();
// 
// 	boolean hasPotentialMatch();
// 
// 	boolean isMatchable();
// 	boolean setMatchable(boolean matchable);
// 
// 	default boolean hasMatch() {
// 		return getMatch() != null;
// 	}
// 
// 	T getMatch();
// 	boolean isFullyMatched(boolean recursive);
// 	float getSimilarity();
// 	boolean isNameObfuscated();
// }


import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;
import matcher.type.Matchable;
package matcher.classifier;



public class MatchingCache {
	@SuppressWarnings("unchecked")
// Path: src/matcher/type/Matchable.java
// public interface Matchable<T extends Matchable<T>> {
// 	MatchableKind getKind();
// 
// 	String getId();
// 	String getName();
// 	String getName(NameType type);
// 
// 	default String getDisplayName(NameType type, boolean full) {
// 		return getName(type);
// 	}
// 
// 	boolean hasMappedName();
// 	boolean hasLocalTmpName();
// 	boolean hasAuxName(int index);
// 
// 	String getMappedComment();
// 	void setMappedComment(String comment);
// 
// 	Matchable<?> getOwner();
// 	ClassEnv getEnv();
// 
// 	int getUid();
// 
// 	boolean hasPotentialMatch();
// 
// 	boolean isMatchable();
// 	boolean setMatchable(boolean matchable);
// 
// 	default boolean hasMatch() {
// 		return getMatch() != null;
// 	}
// 
// 	T getMatch();
// 	boolean isFullyMatched(boolean recursive);
// 	float getSimilarity();
// 	boolean isNameObfuscated();
// }


// Path: src/matcher/classifier/MatchingCache.java
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;
import matcher.type.Matchable;

package matcher.classifier;



public class MatchingCache {
	@SuppressWarnings("unchecked")
	public <T, U extends Matchable<U>> T get(CacheToken<T> token, U a, U b) {