#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"

el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t he_str_ends(el_val_t s, el_val_t suf);
el_val_t he_str_len(el_val_t s);
el_val_t he_str_drop_last(el_val_t s, el_val_t n);
el_val_t he_str_last_char(el_val_t s);
el_val_t he_slot(el_val_t person, el_val_t gender, el_val_t number);
el_val_t he_present_form_code(el_val_t slot);
el_val_t he_copula_past(el_val_t slot);
el_val_t he_copula_future(el_val_t slot);
el_val_t he_is_copula(el_val_t verb);
el_val_t he_conjugate_copula(el_val_t tense, el_val_t slot);
el_val_t he_present_lir_ot(el_val_t form);
el_val_t he_present_le_exol(el_val_t form);
el_val_t he_present_ledaber(el_val_t form);
el_val_t he_present_lalechet(el_val_t form);
el_val_t he_past_lir_ot(el_val_t slot);
el_val_t he_past_le_exol(el_val_t slot);
el_val_t he_past_ledaber(el_val_t slot);
el_val_t he_past_lalechet(el_val_t slot);
el_val_t he_future_lir_ot(el_val_t slot);
el_val_t he_future_le_exol(el_val_t slot);
el_val_t he_future_ledaber(el_val_t slot);
el_val_t he_future_lalechet(el_val_t slot);
el_val_t he_known_verb(el_val_t verb, el_val_t tense, el_val_t slot);
el_val_t he_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number);
el_val_t he_pluralize(el_val_t noun, el_val_t gender);
el_val_t he_is_hebrew_script(el_val_t noun);
el_val_t he_definite_prefix(el_val_t noun);
el_val_t he_noun_phrase(el_val_t noun, el_val_t number, el_val_t gender, el_val_t definite);
el_val_t he_map_canonical(el_val_t verb);

el_val_t he_str_ends(el_val_t s, el_val_t suf) {
  return str_ends_with(s, suf);
  return 0;
}

el_val_t he_str_len(el_val_t s) {
  return str_len(s);
  return 0;
}

el_val_t he_str_drop_last(el_val_t s, el_val_t n) {
  el_val_t len = str_len(s);
  if (n >= len) {
    return EL_STR("");
  }
  return str_slice(s, 0, (len - n));
  return 0;
}

el_val_t he_str_last_char(el_val_t s) {
  el_val_t n = str_len(s);
  if (n == 0) {
    return EL_STR("");
  }
  return str_slice(s, (n - 1), n);
  return 0;
}

el_val_t he_slot(el_val_t person, el_val_t gender, el_val_t number) {
  if (str_eq(person, EL_STR("third"))) {
    if (str_eq(number, EL_STR("singular"))) {
      if (str_eq(gender, EL_STR("f"))) {
        return 1;
      }
      return 0;
    }
    if (str_eq(gender, EL_STR("f"))) {
      return 6;
    }
    return 5;
  }
  if (str_eq(person, EL_STR("second"))) {
    if (str_eq(number, EL_STR("singular"))) {
      if (str_eq(gender, EL_STR("f"))) {
        return 3;
      }
      return 2;
    }
    if (str_eq(gender, EL_STR("f"))) {
      return 8;
    }
    return 7;
  }
  if (str_eq(number, EL_STR("plural"))) {
    return 9;
  }
  return 4;
  return 0;
}

el_val_t he_present_form_code(el_val_t slot) {
  if (slot == 0) {
    return 0;
  }
  if (slot == 1) {
    return 1;
  }
  if (slot == 2) {
    return 0;
  }
  if (slot == 3) {
    return 1;
  }
  if (slot == 4) {
    return 0;
  }
  if (slot == 5) {
    return 2;
  }
  if (slot == 6) {
    return 3;
  }
  if (slot == 7) {
    return 2;
  }
  if (slot == 8) {
    return 3;
  }
  return 2;
  return 0;
}

el_val_t he_copula_past(el_val_t slot) {
  if (slot == 0) {
    return EL_STR("\xd7\x94\xd7\x99\xd7\x94");
  }
  if (slot == 1) {
    return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xaa\xd7\x94");
  }
  if (slot == 2) {
    return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xaa");
  }
  if (slot == 3) {
    return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xaa\xd7\x94");
  }
  if (slot == 4) {
    return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xaa\xd7\x99");
  }
  if (slot == 5) {
    return EL_STR("\xd7\x94\xd7\x99\xd7\x95");
  }
  if (slot == 6) {
    return EL_STR("\xd7\x94\xd7\x99\xd7\x95");
  }
  if (slot == 7) {
    return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xaa\xd7\x9d");
  }
  if (slot == 8) {
    return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xaa\xd7\x9f");
  }
  return EL_STR("\xd7\x94\xd7\x99\xd7\x99\xd7\xa0\xd7\x95");
  return 0;
}

el_val_t he_copula_future(el_val_t slot) {
  if (slot == 0) {
    return EL_STR("\xd7\x99\xd7\x94\xd7\x99\xd7\x94");
  }
  if (slot == 1) {
    return EL_STR("\xd7\xaa\xd7\x94\xd7\x99\xd7\x94");
  }
  if (slot == 2) {
    return EL_STR("\xd7\xaa\xd7\x94\xd7\x99\xd7\x94");
  }
  if (slot == 3) {
    return EL_STR("\xd7\xaa\xd7\x94\xd7\x99\xd7\x99");
  }
  if (slot == 4) {
    return EL_STR("\xd7\x90\xd7\x94\xd7\x99\xd7\x94");
  }
  if (slot == 5) {
    return EL_STR("\xd7\x99\xd7\x94\xd7\x99\xd7\x95");
  }
  if (slot == 6) {
    return EL_STR("\xd7\x99\xd7\x94\xd7\x99\xd7\x95");
  }
  if (slot == 7) {
    return EL_STR("\xd7\xaa\xd7\x94\xd7\x99\xd7\x95");
  }
  if (slot == 8) {
    return EL_STR("\xd7\xaa\xd7\x94\xd7\x99\xd7\x95");
  }
  return EL_STR("\xd7\xa0\xd7\x94\xd7\x99\xd7\x94");
  return 0;
}

el_val_t he_is_copula(el_val_t verb) {
  if (str_eq(verb, EL_STR("lihyot"))) {
    return 1;
  }
  if (str_eq(verb, EL_STR("haya"))) {
    return 1;
  }
  if (str_eq(verb, EL_STR("be"))) {
    return 1;
  }
  if (str_eq(verb, EL_STR("\xd7\x94\xd7\x99\xd7\x94"))) {
    return 1;
  }
  if (str_eq(verb, EL_STR("\xd7\x9c\xd6\xb4\xd7\x94\xd6\xb0\xd7\x99\xd7\x95\xd6\xb9\xd7\xaa"))) {
    return 1;
  }
  return 0;
  return 0;
}

el_val_t he_conjugate_copula(el_val_t tense, el_val_t slot) {
  if (str_eq(tense, EL_STR("present"))) {
    return EL_STR("");
  }
  if (str_eq(tense, EL_STR("past"))) {
    return he_copula_past(slot);
  }
  if (str_eq(tense, EL_STR("future"))) {
    return he_copula_future(slot);
  }
  return EL_STR("");
  return 0;
}

el_val_t he_present_lir_ot(el_val_t form) {
  if (form == 0) {
    return EL_STR("\xd7\xa8\xd7\x95\xd6\xb9\xd7\x90\xd6\xb6\xd7\x94");
  }
  if (form == 1) {
    return EL_STR("\xd7\xa8\xd7\x95\xd6\xb9\xd7\x90\xd6\xb8\xd7\x94");
  }
  if (form == 2) {
    return EL_STR("\xd7\xa8\xd7\x95\xd6\xb9\xd7\x90\xd6\xb4\xd7\x99\xd7\x9d");
  }
  return EL_STR("\xd7\xa8\xd7\x95\xd6\xb9\xd7\x90\xd7\x95\xd6\xb9\xd7\xaa");
  return 0;
}

el_val_t he_present_le_exol(el_val_t form) {
  if (form == 0) {
    return EL_STR("\xd7\x90\xd7\x95\xd6\xb9\xd7\x9b\xd6\xb5\xd7\x9c");
  }
  if (form == 1) {
    return EL_STR("\xd7\x90\xd7\x95\xd6\xb9\xd7\x9b\xd6\xb6\xd7\x9c\xd6\xb6\xd7\xaa");
  }
  if (form == 2) {
    return EL_STR("\xd7\x90\xd7\x95\xd6\xb9\xd7\x9b\xd6\xb0\xd7\x9c\xd6\xb4\xd7\x99\xd7\x9d");
  }
  return EL_STR("\xd7\x90\xd7\x95\xd6\xb9\xd7\x9b\xd6\xb0\xd7\x9c\xd7\x95\xd6\xb9\xd7\xaa");
  return 0;
}

el_val_t he_present_ledaber(el_val_t form) {
  if (form == 0) {
    return EL_STR("\xd7\x9e\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
  }
  if (form == 1) {
    return EL_STR("\xd7\x9e\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb6\xd6\xbc\xd7\xa8\xd6\xb6\xd7\xaa");
  }
  if (form == 2) {
    return EL_STR("\xd7\x9e\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd6\xb4\xd7\x99\xd7\x9d");
  }
  return EL_STR("\xd7\x9e\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd7\x95\xd6\xb9\xd7\xaa");
  return 0;
}

el_val_t he_present_lalechet(el_val_t form) {
  if (form == 0) {
    return EL_STR("\xd7\x94\xd7\x95\xd6\xb9\xd7\x9c\xd6\xb5\xd7\x9a\xd6\xb0");
  }
  if (form == 1) {
    return EL_STR("\xd7\x94\xd7\x95\xd6\xb9\xd7\x9c\xd6\xb6\xd7\x9b\xd6\xb6\xd7\xaa");
  }
  if (form == 2) {
    return EL_STR("\xd7\x94\xd7\x95\xd6\xb9\xd7\x9c\xd6\xb0\xd7\x9b\xd6\xb4\xd7\x99\xd7\x9d");
  }
  return EL_STR("\xd7\x94\xd7\x95\xd6\xb9\xd7\x9c\xd6\xb0\xd7\x9b\xd7\x95\xd6\xb9\xd7\xaa");
  return 0;
}

el_val_t he_past_lir_ot(el_val_t slot) {
  if (slot == 0) {
    return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd6\xb8\xd7\x94");
  }
  if (slot == 1) {
    return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd6\xb2\xd7\xaa\xd6\xb8\xd7\x94");
  }
  if (slot == 2) {
    return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd6\xb4\xd7\x99\xd7\xaa\xd6\xb8");
  }
  if (slot == 3) {
    return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd6\xb4\xd7\x99\xd7\xaa");
  }
  if (slot == 4) {
    return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd6\xb4\xd7\x99\xd7\xaa\xd6\xb4\xd7\x99");
  }
  if (slot == 5) {
    return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd7\x95\xd6\xbc");
  }
  if (slot == 6) {
    return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd7\x95\xd6\xbc");
  }
  if (slot == 7) {
    return EL_STR("\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb4\xd7\x99\xd7\xaa\xd6\xb6\xd7\x9d");
  }
  if (slot == 8) {
    return EL_STR("\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb4\xd7\x99\xd7\xaa\xd6\xb6\xd7\x9f");
  }
  return EL_STR("\xd7\xa8\xd6\xb8\xd7\x90\xd6\xb4\xd7\x99\xd7\xa0\xd7\x95\xd6\xbc");
  return 0;
}

el_val_t he_past_le_exol(el_val_t slot) {
  if (slot == 0) {
    return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb7\xd7\x9c");
  }
  if (slot == 1) {
    return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb0\xd7\x9c\xd6\xb8\xd7\x94");
  }
  if (slot == 2) {
    return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xaa\xd6\xb8\xd6\xbc");
  }
  if (slot == 3) {
    return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xaa\xd6\xb0\xd6\xbc");
  }
  if (slot == 4) {
    return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xaa\xd6\xb4\xd6\xbc\xd7\x99");
  }
  if (slot == 5) {
    return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb0\xd7\x9c\xd7\x95\xd6\xbc");
  }
  if (slot == 6) {
    return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb0\xd7\x9c\xd7\x95\xd6\xbc");
  }
  if (slot == 7) {
    return EL_STR("\xd7\x90\xd6\xb2\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xaa\xd6\xb6\xd6\xbc\xd7\x9d");
  }
  if (slot == 8) {
    return EL_STR("\xd7\x90\xd6\xb2\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xaa\xd6\xb6\xd6\xbc\xd7\x9f");
  }
  return EL_STR("\xd7\x90\xd6\xb8\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xa0\xd7\x95\xd6\xbc");
  return 0;
}

el_val_t he_past_ledaber(el_val_t slot) {
  if (slot == 0) {
    return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
  }
  if (slot == 1) {
    return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd6\xb8\xd7\x94");
  }
  if (slot == 2) {
    return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb7\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xaa\xd6\xb8\xd6\xbc");
  }
  if (slot == 3) {
    return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb7\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xaa\xd6\xb0\xd6\xbc");
  }
  if (slot == 4) {
    return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb7\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xaa\xd6\xb4\xd6\xbc\xd7\x99");
  }
  if (slot == 5) {
    return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd7\x95\xd6\xbc");
  }
  if (slot == 6) {
    return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd7\x95\xd6\xbc");
  }
  if (slot == 7) {
    return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb7\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xaa\xd6\xb6\xd6\xbc\xd7\x9d");
  }
  if (slot == 8) {
    return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb7\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xaa\xd6\xb6\xd6\xbc\xd7\x9f");
  }
  return EL_STR("\xd7\x93\xd6\xb4\xd6\xbc\xd7\x91\xd6\xb7\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xa0\xd7\x95\xd6\xbc");
  return 0;
}

el_val_t he_past_lalechet(el_val_t slot) {
  if (slot == 0) {
    return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb7\xd7\x9a\xd6\xb0");
  }
  if (slot == 1) {
    return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb0\xd7\x9b\xd6\xb8\xd7\x94");
  }
  if (slot == 2) {
    return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xaa\xd6\xb8\xd6\xbc");
  }
  if (slot == 3) {
    return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xaa\xd6\xb0\xd6\xbc");
  }
  if (slot == 4) {
    return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xaa\xd6\xb4\xd6\xbc\xd7\x99");
  }
  if (slot == 5) {
    return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb0\xd7\x9b\xd7\x95\xd6\xbc");
  }
  if (slot == 6) {
    return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb0\xd7\x9b\xd7\x95\xd6\xbc");
  }
  if (slot == 7) {
    return EL_STR("\xd7\x94\xd6\xb2\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xaa\xd6\xb6\xd6\xbc\xd7\x9d");
  }
  if (slot == 8) {
    return EL_STR("\xd7\x94\xd6\xb2\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xaa\xd6\xb6\xd6\xbc\xd7\x9f");
  }
  return EL_STR("\xd7\x94\xd6\xb8\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xa0\xd7\x95\xd6\xbc");
  return 0;
}

el_val_t he_future_lir_ot(el_val_t slot) {
  if (slot == 0) {
    return EL_STR("\xd7\x99\xd6\xb4\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x94");
  }
  if (slot == 1) {
    return EL_STR("\xd7\xaa\xd6\xb4\xd6\xbc\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x94");
  }
  if (slot == 2) {
    return EL_STR("\xd7\xaa\xd6\xb4\xd6\xbc\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x94");
  }
  if (slot == 3) {
    return EL_STR("\xd7\xaa\xd6\xb4\xd6\xbc\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb4\xd7\x99");
  }
  if (slot == 4) {
    return EL_STR("\xd7\x90\xd6\xb6\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x94");
  }
  if (slot == 5) {
    return EL_STR("\xd7\x99\xd6\xb4\xd7\xa8\xd6\xb0\xd7\x90\xd7\x95\xd6\xbc");
  }
  if (slot == 6) {
    return EL_STR("\xd7\xaa\xd6\xb4\xd6\xbc\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x99\xd7\xa0\xd6\xb8\xd7\x94");
  }
  if (slot == 7) {
    return EL_STR("\xd7\xaa\xd6\xb4\xd6\xbc\xd7\xa8\xd6\xb0\xd7\x90\xd7\x95\xd6\xbc");
  }
  if (slot == 8) {
    return EL_STR("\xd7\xaa\xd6\xb4\xd6\xbc\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x99\xd7\xa0\xd6\xb8\xd7\x94");
  }
  return EL_STR("\xd7\xa0\xd6\xb4\xd7\xa8\xd6\xb0\xd7\x90\xd6\xb6\xd7\x94");
  return 0;
}

el_val_t he_future_le_exol(el_val_t slot) {
  if (slot == 0) {
    return EL_STR("\xd7\x99\xd6\xb9\xd7\x90\xd7\x9b\xd6\xb7\xd7\x9c");
  }
  if (slot == 1) {
    return EL_STR("\xd7\xaa\xd6\xb9\xd6\xbc\xd7\x90\xd7\x9b\xd6\xb7\xd7\x9c");
  }
  if (slot == 2) {
    return EL_STR("\xd7\xaa\xd6\xb9\xd6\xbc\xd7\x90\xd7\x9b\xd6\xb7\xd7\x9c");
  }
  if (slot == 3) {
    return EL_STR("\xd7\xaa\xd6\xb9\xd6\xbc\xd7\x90\xd7\x9b\xd6\xb0\xd7\x9c\xd6\xb4\xd7\x99");
  }
  if (slot == 4) {
    return EL_STR("\xd7\x90\xd6\xb9\xd7\x9b\xd6\xb7\xd7\x9c");
  }
  if (slot == 5) {
    return EL_STR("\xd7\x99\xd6\xb9\xd7\x90\xd7\x9b\xd6\xb0\xd7\x9c\xd7\x95\xd6\xbc");
  }
  if (slot == 6) {
    return EL_STR("\xd7\xaa\xd6\xb9\xd6\xbc\xd7\x90\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xa0\xd6\xb8\xd7\x94");
  }
  if (slot == 7) {
    return EL_STR("\xd7\xaa\xd6\xb9\xd6\xbc\xd7\x90\xd7\x9b\xd6\xb0\xd7\x9c\xd7\x95\xd6\xbc");
  }
  if (slot == 8) {
    return EL_STR("\xd7\xaa\xd6\xb9\xd6\xbc\xd7\x90\xd7\x9b\xd6\xb7\xd7\x9c\xd6\xb0\xd7\xa0\xd6\xb8\xd7\x94");
  }
  return EL_STR("\xd7\xa0\xd6\xb9\xd7\x90\xd7\x9b\xd6\xb7\xd7\x9c");
  return 0;
}

el_val_t he_future_ledaber(el_val_t slot) {
  if (slot == 0) {
    return EL_STR("\xd7\x99\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
  }
  if (slot == 1) {
    return EL_STR("\xd7\xaa\xd6\xb0\xd6\xbc\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
  }
  if (slot == 2) {
    return EL_STR("\xd7\xaa\xd6\xb0\xd6\xbc\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
  }
  if (slot == 3) {
    return EL_STR("\xd7\xaa\xd6\xb0\xd6\xbc\xd7\x93\xd6\xb7\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd6\xb4\xd7\x99");
  }
  if (slot == 4) {
    return EL_STR("\xd7\x90\xd6\xb2\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
  }
  if (slot == 5) {
    return EL_STR("\xd7\x99\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd7\x95\xd6\xbc");
  }
  if (slot == 6) {
    return EL_STR("\xd7\xaa\xd6\xb0\xd6\xbc\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xa0\xd6\xb8\xd7\x94");
  }
  if (slot == 7) {
    return EL_STR("\xd7\xaa\xd6\xb0\xd6\xbc\xd7\x93\xd6\xb7\xd7\x91\xd6\xb0\xd6\xbc\xd7\xa8\xd7\x95\xd6\xbc");
  }
  if (slot == 8) {
    return EL_STR("\xd7\xaa\xd6\xb0\xd6\xbc\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8\xd6\xb0\xd7\xa0\xd6\xb8\xd7\x94");
  }
  return EL_STR("\xd7\xa0\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8");
  return 0;
}

el_val_t he_future_lalechet(el_val_t slot) {
  if (slot == 0) {
    return EL_STR("\xd7\x99\xd6\xb5\xd7\x9c\xd6\xb5\xd7\x9a\xd6\xb0");
  }
  if (slot == 1) {
    return EL_STR("\xd7\xaa\xd6\xb5\xd6\xbc\xd7\x9c\xd6\xb5\xd7\x9a\xd6\xb0");
  }
  if (slot == 2) {
    return EL_STR("\xd7\xaa\xd6\xb5\xd6\xbc\xd7\x9c\xd6\xb5\xd7\x9a\xd6\xb0");
  }
  if (slot == 3) {
    return EL_STR("\xd7\xaa\xd6\xb5\xd6\xbc\xd7\x9c\xd6\xb0\xd7\x9b\xd6\xb4\xd7\x99");
  }
  if (slot == 4) {
    return EL_STR("\xd7\x90\xd6\xb5\xd7\x9c\xd6\xb5\xd7\x9a\xd6\xb0");
  }
  if (slot == 5) {
    return EL_STR("\xd7\x99\xd6\xb5\xd7\x9c\xd6\xb0\xd7\x9b\xd7\x95\xd6\xbc");
  }
  if (slot == 6) {
    return EL_STR("\xd7\xaa\xd6\xb5\xd6\xbc\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xa0\xd6\xb8\xd7\x94");
  }
  if (slot == 7) {
    return EL_STR("\xd7\xaa\xd6\xb5\xd6\xbc\xd7\x9c\xd6\xb0\xd7\x9b\xd7\x95\xd6\xbc");
  }
  if (slot == 8) {
    return EL_STR("\xd7\xaa\xd6\xb5\xd6\xbc\xd7\x9c\xd6\xb7\xd7\x9b\xd6\xb0\xd7\xa0\xd6\xb8\xd7\x94");
  }
  return EL_STR("\xd7\xa0\xd6\xb5\xd7\x9c\xd6\xb5\xd7\x9a\xd6\xb0");
  return 0;
}

el_val_t he_known_verb(el_val_t verb, el_val_t tense, el_val_t slot) {
  if (str_eq(verb, EL_STR("lir'ot"))) {
    if (str_eq(tense, EL_STR("present"))) {
      return he_present_lir_ot(he_present_form_code(slot));
    }
    if (str_eq(tense, EL_STR("past"))) {
      return he_past_lir_ot(slot);
    }
    if (str_eq(tense, EL_STR("future"))) {
      return he_future_lir_ot(slot);
    }
    return he_present_lir_ot(he_present_form_code(slot));
  }
  if (str_eq(verb, EL_STR("\xd7\x9c\xd6\xb4\xd7\xa8\xd6\xb0\xd7\x90\xd7\x95\xd6\xb9\xd7\xaa"))) {
    if (str_eq(tense, EL_STR("present"))) {
      return he_present_lir_ot(he_present_form_code(slot));
    }
    if (str_eq(tense, EL_STR("past"))) {
      return he_past_lir_ot(slot);
    }
    if (str_eq(tense, EL_STR("future"))) {
      return he_future_lir_ot(slot);
    }
    return he_present_lir_ot(he_present_form_code(slot));
  }
  if (str_eq(verb, EL_STR("le'exol"))) {
    if (str_eq(tense, EL_STR("present"))) {
      return he_present_le_exol(he_present_form_code(slot));
    }
    if (str_eq(tense, EL_STR("past"))) {
      return he_past_le_exol(slot);
    }
    if (str_eq(tense, EL_STR("future"))) {
      return he_future_le_exol(slot);
    }
    return he_present_le_exol(he_present_form_code(slot));
  }
  if (str_eq(verb, EL_STR("\xd7\x9c\xd6\xb6\xd7\x90\xd6\xb1\xd7\x9b\xd7\x95\xd6\xb9\xd7\x9c"))) {
    if (str_eq(tense, EL_STR("present"))) {
      return he_present_le_exol(he_present_form_code(slot));
    }
    if (str_eq(tense, EL_STR("past"))) {
      return he_past_le_exol(slot);
    }
    if (str_eq(tense, EL_STR("future"))) {
      return he_future_le_exol(slot);
    }
    return he_present_le_exol(he_present_form_code(slot));
  }
  if (str_eq(verb, EL_STR("ledaber"))) {
    if (str_eq(tense, EL_STR("present"))) {
      return he_present_ledaber(he_present_form_code(slot));
    }
    if (str_eq(tense, EL_STR("past"))) {
      return he_past_ledaber(slot);
    }
    if (str_eq(tense, EL_STR("future"))) {
      return he_future_ledaber(slot);
    }
    return he_present_ledaber(he_present_form_code(slot));
  }
  if (str_eq(verb, EL_STR("\xd7\x9c\xd6\xb0\xd7\x93\xd6\xb7\xd7\x91\xd6\xb5\xd6\xbc\xd7\xa8"))) {
    if (str_eq(tense, EL_STR("present"))) {
      return he_present_ledaber(he_present_form_code(slot));
    }
    if (str_eq(tense, EL_STR("past"))) {
      return he_past_ledaber(slot);
    }
    if (str_eq(tense, EL_STR("future"))) {
      return he_future_ledaber(slot);
    }
    return he_present_ledaber(he_present_form_code(slot));
  }
  if (str_eq(verb, EL_STR("lalechet"))) {
    if (str_eq(tense, EL_STR("present"))) {
      return he_present_lalechet(he_present_form_code(slot));
    }
    if (str_eq(tense, EL_STR("past"))) {
      return he_past_lalechet(slot);
    }
    if (str_eq(tense, EL_STR("future"))) {
      return he_future_lalechet(slot);
    }
    return he_present_lalechet(he_present_form_code(slot));
  }
  if (str_eq(verb, EL_STR("\xd7\x9c\xd6\xb8\xd7\x9c\xd6\xb6\xd7\x9b\xd6\xb6\xd7\xaa"))) {
    if (str_eq(tense, EL_STR("present"))) {
      return he_present_lalechet(he_present_form_code(slot));
    }
    if (str_eq(tense, EL_STR("past"))) {
      return he_past_lalechet(slot);
    }
    if (str_eq(tense, EL_STR("future"))) {
      return he_future_lalechet(slot);
    }
    return he_present_lalechet(he_present_form_code(slot));
  }
  return EL_STR("");
  return 0;
}

el_val_t he_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number) {
  el_val_t slot = he_slot(person, gender, number);
  if (he_is_copula(verb)) {
    return he_conjugate_copula(tense, slot);
  }
  el_val_t known = he_known_verb(verb, tense, slot);
  if (!str_eq(known, EL_STR(""))) {
    return known;
  }
  return verb;
  return 0;
}

el_val_t he_pluralize(el_val_t noun, el_val_t gender) {
  if (str_eq(gender, EL_STR("m"))) {
    return el_str_concat(noun, EL_STR("\xd7\x99\xd7\x9d"));
  }
  if (he_str_ends(noun, EL_STR("\xd7\x94"))) {
    el_val_t stem = he_str_drop_last(noun, 1);
    return el_str_concat(stem, EL_STR("\xd7\x95\xd7\xaa"));
  }
  if (he_str_ends(noun, EL_STR("\xd7\xaa"))) {
    el_val_t stem = he_str_drop_last(noun, 1);
    return el_str_concat(stem, EL_STR("\xd7\x95\xd7\xaa"));
  }
  if (he_str_ends(noun, EL_STR("a"))) {
    el_val_t stem = he_str_drop_last(noun, 1);
    return el_str_concat(stem, EL_STR("ot"));
  }
  if (he_str_ends(noun, EL_STR("et"))) {
    el_val_t stem = he_str_drop_last(noun, 2);
    return el_str_concat(stem, EL_STR("ot"));
  }
  return el_str_concat(noun, EL_STR("\xd7\x95\xd7\xaa"));
  return 0;
}

el_val_t he_is_hebrew_script(el_val_t noun) {
  el_val_t n = str_len(noun);
  if (n == 0) {
    return 0;
  }
  el_val_t first = str_slice(noun, 0, 1);
  if (str_eq(first, EL_STR("\xd7\x90"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\x91"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\x92"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\x93"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\x94"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\x95"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\x96"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\x97"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\x98"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\x99"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\x9b"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\x9c"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\x9e"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\xa0"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\xa1"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\xa2"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\xa4"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\xa6"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\xa7"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\xa8"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\xa9"))) {
    return 1;
  }
  if (str_eq(first, EL_STR("\xd7\xaa"))) {
    return 1;
  }
  return 0;
  return 0;
}

el_val_t he_definite_prefix(el_val_t noun) {
  if (he_is_hebrew_script(noun)) {
    return el_str_concat(EL_STR("\xd7\x94"), noun);
  }
  return el_str_concat(EL_STR("ha"), noun);
  return 0;
}

el_val_t he_noun_phrase(el_val_t noun, el_val_t number, el_val_t gender, el_val_t definite) {
  el_val_t stem = noun;
  if (str_eq(number, EL_STR("plural"))) {
    stem = he_pluralize(noun, gender);
  }
  if (str_eq(definite, EL_STR("true"))) {
    return he_definite_prefix(stem);
  }
  return stem;
  return 0;
}

el_val_t he_map_canonical(el_val_t verb) {
  if (str_eq(verb, EL_STR("be"))) {
    return EL_STR("lihyot");
  }
  if (str_eq(verb, EL_STR("see"))) {
    return EL_STR("lir'ot");
  }
  if (str_eq(verb, EL_STR("eat"))) {
    return EL_STR("le'exol");
  }
  if (str_eq(verb, EL_STR("speak"))) {
    return EL_STR("ledaber");
  }
  if (str_eq(verb, EL_STR("say"))) {
    return EL_STR("ledaber");
  }
  if (str_eq(verb, EL_STR("go"))) {
    return EL_STR("lalechet");
  }
  return verb;
  return 0;
}

