// Path: src/main/java/com/btk5h/skriptmirror/JavaType.java
// public final class JavaType {
//   private final Class<?> javaClass;
// 
//   public JavaType(Class<?> javaClass) {
//     this.javaClass = javaClass;
//   }
// 
//   public Class<?> getJavaClass() {
//     return javaClass;
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
//     JavaType javaType1 = (JavaType) o;
//     return Objects.equals(javaClass, javaType1.javaClass);
//   }
// 
//   @Override
//   public int hashCode() {
//     return Objects.hash(javaClass);
//   }
// }
// 
// Path: src/main/java/com/btk5h/skriptmirror/Null.java
// public class Null {
//   private static Null instance = new Null();
// 
//   private Null() {}
// 
//   public static Null getInstance() {
//     return instance;
//   }
// 
// 
// }
// 
// Path: src/main/java/com/btk5h/skriptmirror/ObjectWrapper.java
// public class ObjectWrapper {
//   protected Object object;
// 
//   private ObjectWrapper(Object object) {
//     this.object = object;
//   }
// 
//   public static ObjectWrapper create(Object object) {
//     if (object instanceof ObjectWrapper) {
//       return (ObjectWrapper) object;
//     }
// 
//     if (object.getClass().isArray()) {
//       return new OfArray((Object[]) object);
//     }
// 
//     return new ObjectWrapper(object);
//   }
// 
//   public static Object wrapIfNecessary(Object returnedValue, boolean forceWrap) {
//     Class<?> returnedClass = returnedValue.getClass();
//     if (returnedClass.isArray()) {
//       returnedValue = create(JavaUtil.boxPrimitiveArray(returnedValue));
//     } else if (forceWrap || Classes.getSuperClassInfo(returnedClass).getC() == Object.class) {
//       returnedValue = create(returnedValue);
//     }
//     return returnedValue;
//   }
// 
//   public static Object unwrapIfNecessary(Object o) {
//     if (o instanceof ObjectWrapper) {
//       return ((ObjectWrapper) o).get();
//     }
// 
//     return o;
//   }
// 
//   public Object get() {
//     return object;
//   }
// 
//   @Override
//   public String toString() {
//     return object.toString();
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
//     ObjectWrapper that = (ObjectWrapper) o;
//     return Objects.equals(object, that.object);
//   }
// 
//   @Override
//   public int hashCode() {
//     return Objects.hash(object);
//   }
// 
//   public static class OfArray extends ObjectWrapper {
//     private OfArray(Object[] object) {
//       super(object);
//     }
// 
//     @Override
//     public Object[] get() {
//       return (Object[]) object;
//     }
// 
//     @Override
//     public String toString() {
//       return Arrays.deepToString(get());
//     }
//   }
// }


import ch.njol.skript.Skript;
import com.btk5h.skriptmirror.JavaType;
import com.btk5h.skriptmirror.Null;
import com.btk5h.skriptmirror.ObjectWrapper;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

  public static String processTypes(String part) {
    if (part.length() > 0) {
      // copy all prefixes
      String prefixes = "";
      Matcher prefixMatcher = TYPE_PREFIXES.matcher(part);
      if (prefixMatcher.find()) {
        prefixes = prefixMatcher.group();
      }
      part = part.substring(prefixes.length());

      // copy all suffixes
      String suffixes = "";
      int timeIndex = part.indexOf("@");
      if (timeIndex != -1) {
        suffixes = part.substring(timeIndex);
        part = part.substring(0, timeIndex);
      }

      // replace user input patterns
      String types = Arrays.stream(part.split("/"))
          .map(SkriptUtil::replaceUserInputPatterns)
          .collect(Collectors.joining("/"));

      return prefixes + types + suffixes;
    }
    return part;
  }

  public static Object reifyIfNull(Object o) {
// Path: src/main/java/com/btk5h/skriptmirror/JavaType.java
// public final class JavaType {
//   private final Class<?> javaClass;
// 
//   public JavaType(Class<?> javaClass) {
//     this.javaClass = javaClass;
//   }
// 
//   public Class<?> getJavaClass() {
//     return javaClass;
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
//     JavaType javaType1 = (JavaType) o;
//     return Objects.equals(javaClass, javaType1.javaClass);
//   }
// 
//   @Override
//   public int hashCode() {
//     return Objects.hash(javaClass);
//   }
// }
// 
// Path: src/main/java/com/btk5h/skriptmirror/Null.java
// public class Null {
//   private static Null instance = new Null();
// 
//   private Null() {}
// 
//   public static Null getInstance() {
//     return instance;
//   }
// 
// 
// }
// 
// Path: src/main/java/com/btk5h/skriptmirror/ObjectWrapper.java
// public class ObjectWrapper {
//   protected Object object;
// 
//   private ObjectWrapper(Object object) {
//     this.object = object;
//   }
// 
//   public static ObjectWrapper create(Object object) {
//     if (object instanceof ObjectWrapper) {
//       return (ObjectWrapper) object;
//     }
// 
//     if (object.getClass().isArray()) {
//       return new OfArray((Object[]) object);
//     }
// 
//     return new ObjectWrapper(object);
//   }
// 
//   public static Object wrapIfNecessary(Object returnedValue, boolean forceWrap) {
//     Class<?> returnedClass = returnedValue.getClass();
//     if (returnedClass.isArray()) {
//       returnedValue = create(JavaUtil.boxPrimitiveArray(returnedValue));
//     } else if (forceWrap || Classes.getSuperClassInfo(returnedClass).getC() == Object.class) {
//       returnedValue = create(returnedValue);
//     }
//     return returnedValue;
//   }
// 
//   public static Object unwrapIfNecessary(Object o) {
//     if (o instanceof ObjectWrapper) {
//       return ((ObjectWrapper) o).get();
//     }
// 
//     return o;
//   }
// 
//   public Object get() {
//     return object;
//   }
// 
//   @Override
//   public String toString() {
//     return object.toString();
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
//     ObjectWrapper that = (ObjectWrapper) o;
//     return Objects.equals(object, that.object);
//   }
// 
//   @Override
//   public int hashCode() {
//     return Objects.hash(object);
//   }
// 
//   public static class OfArray extends ObjectWrapper {
//     private OfArray(Object[] object) {
//       super(object);
//     }
// 
//     @Override
//     public Object[] get() {
//       return (Object[]) object;
//     }
// 
//     @Override
//     public String toString() {
//       return Arrays.deepToString(get());
//     }
//   }
// }


// Path: src/main/java/com/btk5h/skriptmirror/util/SkriptMirrorUtil.java
import ch.njol.skript.Skript;
import com.btk5h.skriptmirror.JavaType;
import com.btk5h.skriptmirror.Null;
import com.btk5h.skriptmirror.ObjectWrapper;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;


  public static String processTypes(String part) {
    if (part.length() > 0) {
      // copy all prefixes
      String prefixes = "";
      Matcher prefixMatcher = TYPE_PREFIXES.matcher(part);
      if (prefixMatcher.find()) {
        prefixes = prefixMatcher.group();
      }
      part = part.substring(prefixes.length());

      // copy all suffixes
      String suffixes = "";
      int timeIndex = part.indexOf("@");
      if (timeIndex != -1) {
        suffixes = part.substring(timeIndex);
        part = part.substring(0, timeIndex);
      }

      // replace user input patterns
      String types = Arrays.stream(part.split("/"))
          .map(SkriptUtil::replaceUserInputPatterns)
          .collect(Collectors.joining("/"));

      return prefixes + types + suffixes;
    }
    return part;
  }

  public static Object reifyIfNull(Object o) {
    return o == null ? Null.getInstance() : o;