mono_security_core_clr_set_options (MonoSecurityCoreCLROptions options)
{
  security_core_clr_options = options;
}


mono_security_core_clr_get_options ()
{
  MonoSecurityCoreCLROptions D.17498;

  D.17498 = security_core_clr_options;
  return D.17498;
}


mono_security_core_clr_determine_platform_image (struct MonoImage * image)
{
  gboolean D.17500;
  mono_bool (*<Tb20>) (const char *) platform_callback.0;
  char * D.17502;

  platform_callback.0 = platform_callback;
  D.17502 = image->name;
  D.17500 = platform_callback.0 (D.17502);
  return D.17500;
}


default_platform_check (const char * image_name)
{
  struct MonoImage * D.17504;
  gboolean D.17507;
  int D.17087;
  char * D.17508;
  _Bool D.17509;
  unsigned int D.17510;
  unsigned int D.17511;
  int iftmp.1;
  int D.17099;
  int iftmp.2;
  int D.17095;
  sizetype ilen.3;
  sizetype clen.4;
  sizetype D.17521;
  const char[13] * D.17522;
  unsigned char D.17523;
  int D.17524;
  unsigned char D.17525;
  int D.17526;
  const unsigned char * D.17531;
  unsigned char D.17532;
  int D.17533;
  const unsigned char * D.17534;
  unsigned char D.17535;
  int D.17536;
  const unsigned char * D.17541;
  unsigned char D.17542;
  int D.17543;
  const unsigned char * D.17544;
  unsigned char D.17545;
  int D.17546;
  const unsigned char * D.17551;
  unsigned char D.17552;
  int D.17553;
  const unsigned char * D.17554;
  unsigned char D.17555;
  int D.17556;
  const char * D.17558;

  D.17504 = mono_defaults.corlib;
  if (D.17504 != 0B) goto <D.17505>; else goto <D.17506>;
  <D.17505>:
  {
    size_t __s1_len;
    size_t __s2_len;

    D.17504 = mono_defaults.corlib;
    D.17508 = D.17504->name;
    D.17087 = __builtin_strcmp (D.17508, image_name);
  }
  D.17509 = D.17087 == 0;
  D.17507 = (gboolean) D.17509;
  return D.17507;
  <D.17506>:
  {
    const char * corlib;
    int ilen;
    int clen;

    corlib = "mscorlib.dll";
    D.17510 = strlen (image_name);
    ilen = (int) D.17510;
    D.17511 = strlen (corlib);
    clen = (int) D.17511;
    if (ilen >= clen) goto <D.17515>; else goto <D.17513>;
    <D.17515>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s1_len = 12;
      if (__s1_len <= 3) goto <D.17517>; else goto <D.17518>;
      <D.17517>:
      {
        const unsigned char * __s2;
        int __result;

        ilen.3 = (sizetype) ilen;
        clen.4 = (sizetype) clen;
        D.17521 = ilen.3 - clen.4;
        __s2 = image_name + D.17521;
        D.17522 = "mscorlib.dll";
        D.17523 = MEM[(const unsigned char *)D.17522];
        D.17524 = (int) D.17523;
        D.17525 = *__s2;
        D.17526 = (int) D.17525;
        __result = D.17524 - D.17526;
        {
          if (__s1_len != 0) goto <D.17527>; else goto <D.17528>;
          <D.17527>:
          if (__result == 0) goto <D.17529>; else goto <D.17530>;
          <D.17529>:
          D.17531 = &MEM[(void *)"mscorlib.dll" + 1B];
          D.17532 = *D.17531;
          D.17533 = (int) D.17532;
          D.17534 = __s2 + 1;
          D.17535 = *D.17534;
          D.17536 = (int) D.17535;
          __result = D.17533 - D.17536;
          if (__s1_len > 1) goto <D.17537>; else goto <D.17538>;
          <D.17537>:
          if (__result == 0) goto <D.17539>; else goto <D.17540>;
          <D.17539>:
          D.17541 = &MEM[(void *)"mscorlib.dll" + 2B];
          D.17542 = *D.17541;
          D.17543 = (int) D.17542;
          D.17544 = __s2 + 2;
          D.17545 = *D.17544;
          D.17546 = (int) D.17545;
          __result = D.17543 - D.17546;
          if (__s1_len > 2) goto <D.17547>; else goto <D.17548>;
          <D.17547>:
          if (__result == 0) goto <D.17549>; else goto <D.17550>;
          <D.17549>:
          D.17551 = &MEM[(void *)"mscorlib.dll" + 3B];
          D.17552 = *D.17551;
          D.17553 = (int) D.17552;
          D.17554 = __s2 + 3;
          D.17555 = *D.17554;
          D.17556 = (int) D.17555;
          __result = D.17553 - D.17556;
          <D.17550>:
          <D.17548>:
          <D.17540>:
          <D.17538>:
          <D.17530>:
          <D.17528>:
        }
        D.17095 = __result;
      }
      iftmp.2 = D.17095;
      goto <D.17557>;
      <D.17518>:
      ilen.3 = (sizetype) ilen;
      clen.4 = (sizetype) clen;
      D.17521 = ilen.3 - clen.4;
      D.17558 = image_name + D.17521;
      iftmp.2 = __builtin_strcmp ("mscorlib.dll", D.17558);
      <D.17557>:
      D.17099 = iftmp.2;
    }
    if (D.17099 == 0) goto <D.17559>; else goto <D.17513>;
    <D.17559>:
    iftmp.1 = 1;
    goto <D.17514>;
    <D.17513>:
    iftmp.1 = 0;
    <D.17514>:
    D.17507 = iftmp.1;
    return D.17507;
  }
}


mono_security_set_core_clr_platform_callback (mono_bool (*MonoCoreClrPlatformCB) (const char *) callback)
{
  platform_callback = callback;
}


mono_security_core_clr_is_platform_image (struct MonoImage * image)
{
  gboolean D.17561;
  <unnamed-unsigned:1> D.17562;

  D.17562 = image->core_clr_platform_code;
  D.17561 = (gboolean) D.17562;
  return D.17561;
}


mono_security_core_clr_check_inheritance (struct MonoClass * class)
{
  short unsigned int D.17571;
  int D.17572;
  int D.17573;
  struct MonoMethod * D.17576;
  MonoSecurityCoreCLRLevel class_level;
  MonoSecurityCoreCLRLevel parent_level;
  struct MonoClass * parent;

  parent = class->parent;
  if (parent == 0B) goto <D.17564>; else goto <D.17565>;
  <D.17564>:
  return;
  <D.17565>:
  class_level = mono_security_core_clr_class_level (class);
  parent_level = mono_security_core_clr_class_level (parent);
  if (class_level < parent_level) goto <D.17566>; else goto <D.17567>;
  <D.17566>:
  set_type_load_exception_type ("Inheritance failure for type %s. Parent class %s is more restricted.", class);
  goto <D.17568>;
  <D.17567>:
  {
    struct MonoMethod * parent_ctor;

    parent_ctor = get_default_ctor (parent);
    if (parent_ctor != 0B) goto <D.17569>; else goto <D.17570>;
    <D.17569>:
    D.17571 = parent_ctor->flags;
    D.17572 = (int) D.17571;
    D.17573 = D.17572 & 6;
    if (D.17573 != 0) goto <D.17574>; else goto <D.17575>;
    <D.17574>:
    D.17576 = get_default_ctor (class);
    class_level = mono_security_core_clr_method_level (D.17576, 0);
    parent_level = mono_security_core_clr_method_level (parent_ctor, 0);
    if (class_level < parent_level) goto <D.17577>; else goto <D.17578>;
    <D.17577>:
    set_type_load_exception_type ("Inheritance failure for type %s. Default constructor security mismatch with %s.", class);
    <D.17578>:
    <D.17575>:
    <D.17570>:
  }
  <D.17568>:
}


get_default_ctor (struct MonoClass * klass)
{
  struct MonoMethod * * D.17580;
  struct MonoMethod * D.17583;
  unsigned int i.5;
  unsigned int D.17585;
  struct MonoMethod * * D.17586;
  short unsigned int D.17589;
  int D.17590;
  int D.17591;
  const char * D.17596;
  char D.17597;
  int D.17151;
  int iftmp.6;
  int D.17147;
  const char[6] * D.17602;
  unsigned char D.17603;
  int D.17604;
  unsigned char D.17605;
  int D.17606;
  const unsigned char * D.17611;
  unsigned char D.17612;
  int D.17613;
  const unsigned char * D.17614;
  unsigned char D.17615;
  int D.17616;
  const unsigned char * D.17621;
  unsigned char D.17622;
  int D.17623;
  const unsigned char * D.17624;
  unsigned char D.17625;
  int D.17626;
  const unsigned char * D.17631;
  unsigned char D.17632;
  int D.17633;
  const unsigned char * D.17634;
  unsigned char D.17635;
  int D.17636;
  short unsigned int D.17640;
  unsigned int i.7;
  unsigned int D.17644;
  int i;

  mono_class_setup_methods (klass);
  D.17580 = klass->methods;
  if (D.17580 == 0B) goto <D.17581>; else goto <D.17582>;
  <D.17581>:
  D.17583 = 0B;
  return D.17583;
  <D.17582>:
  i = 0;
  goto <D.17153>;
  <D.17152>:
  {
    struct MonoMethodSignature * sig;
    struct MonoMethod * method;

    D.17580 = klass->methods;
    i.5 = (unsigned int) i;
    D.17585 = i.5 * 4;
    D.17586 = D.17580 + D.17585;
    method = *D.17586;
    if (method == 0B) goto <D.17587>; else goto <D.17588>;
    <D.17587>:
    // predicted unlikely by continue predictor.
    goto <D.17142>;
    <D.17588>:
    D.17589 = method->flags;
    D.17590 = (int) D.17589;
    D.17591 = D.17590 & 2048;
    if (D.17591 == 0) goto <D.17592>; else goto <D.17593>;
    <D.17592>:
    // predicted unlikely by continue predictor.
    goto <D.17142>;
    <D.17593>:
    D.17596 = method->name;
    D.17597 = *D.17596;
    if (D.17597 != 46) goto <D.17594>; else goto <D.17598>;
    <D.17598>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s1_len = 5;
      if (__s1_len <= 3) goto <D.17600>; else goto <D.17601>;
      <D.17600>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = method->name;
        D.17602 = ".ctor";
        D.17603 = MEM[(const unsigned char *)D.17602];
        D.17604 = (int) D.17603;
        D.17605 = *__s2;
        D.17606 = (int) D.17605;
        __result = D.17604 - D.17606;
        {
          if (__s1_len != 0) goto <D.17607>; else goto <D.17608>;
          <D.17607>:
          if (__result == 0) goto <D.17609>; else goto <D.17610>;
          <D.17609>:
          D.17611 = &MEM[(void *)".ctor" + 1B];
          D.17612 = *D.17611;
          D.17613 = (int) D.17612;
          D.17614 = __s2 + 1;
          D.17615 = *D.17614;
          D.17616 = (int) D.17615;
          __result = D.17613 - D.17616;
          if (__s1_len > 1) goto <D.17617>; else goto <D.17618>;
          <D.17617>:
          if (__result == 0) goto <D.17619>; else goto <D.17620>;
          <D.17619>:
          D.17621 = &MEM[(void *)".ctor" + 2B];
          D.17622 = *D.17621;
          D.17623 = (int) D.17622;
          D.17624 = __s2 + 2;
          D.17625 = *D.17624;
          D.17626 = (int) D.17625;
          __result = D.17623 - D.17626;
          if (__s1_len > 2) goto <D.17627>; else goto <D.17628>;
          <D.17627>:
          if (__result == 0) goto <D.17629>; else goto <D.17630>;
          <D.17629>:
          D.17631 = &MEM[(void *)".ctor" + 3B];
          D.17632 = *D.17631;
          D.17633 = (int) D.17632;
          D.17634 = __s2 + 3;
          D.17635 = *D.17634;
          D.17636 = (int) D.17635;
          __result = D.17633 - D.17636;
          <D.17630>:
          <D.17628>:
          <D.17620>:
          <D.17618>:
          <D.17610>:
          <D.17608>:
        }
        D.17147 = __result;
      }
      iftmp.6 = D.17147;
      goto <D.17637>;
      <D.17601>:
      D.17596 = method->name;
      iftmp.6 = __builtin_strcmp (".ctor", D.17596);
      <D.17637>:
      D.17151 = iftmp.6;
    }
    if (D.17151 != 0) goto <D.17594>; else goto <D.17595>;
    <D.17594>:
    // predicted unlikely by continue predictor.
    goto <D.17142>;
    <D.17595>:
    sig = mono_method_signature (method);
    if (sig != 0B) goto <D.17638>; else goto <D.17639>;
    <D.17638>:
    D.17640 = sig->param_count;
    if (D.17640 == 0) goto <D.17641>; else goto <D.17642>;
    <D.17641>:
    D.17583 = method;
    return D.17583;
    <D.17642>:
    <D.17639>:
  }
  <D.17142>:
  i = i + 1;
  <D.17153>:
  i.7 = (unsigned int) i;
  D.17644 = klass->method.count;
  if (i.7 < D.17644) goto <D.17152>; else goto <D.17154>;
  <D.17154>:
  D.17583 = 0B;
  return D.17583;
}


set_type_load_exception_type (const char * format, struct MonoClass * class)
{
  struct MonoClass * D.17646;
  char * type_name;
  char * parent_name;
  char * message;

  type_name = mono_type_get_full_name (class);
  D.17646 = class->parent;
  parent_name = mono_type_get_full_name (D.17646);
  message = monoeg_g_strdup_printf (format, type_name, parent_name);
  monoeg_g_free (parent_name);
  monoeg_g_free (type_name);
  mono_trace (16, 64, message);
  mono_class_set_failure (class, 7, message);
}


mono_security_core_clr_check_override (struct MonoClass * class, struct MonoMethod * override, struct MonoMethod * base)
{
  MonoSecurityCoreCLRLevel base_level;
  MonoSecurityCoreCLRLevel override_level;

  base_level = mono_security_core_clr_method_level (base, 0);
  override_level = mono_security_core_clr_method_level (override, 0);
  if (base_level == 2) goto <D.17647>; else goto <D.17648>;
  <D.17647>:
  if (override_level != 2) goto <D.17649>; else goto <D.17650>;
  <D.17649>:
  set_type_load_exception_methods ("Override failure for %s over %s. Override MUST be [SecurityCritical].", override, base);
  <D.17650>:
  goto <D.17651>;
  <D.17648>:
  if (override_level == 2) goto <D.17652>; else goto <D.17653>;
  <D.17652>:
  set_type_load_exception_methods ("Override failure for %s over %s. Override must NOT be [SecurityCritical].", override, base);
  <D.17653>:
  <D.17651>:
}


set_type_load_exception_methods (const char * format, struct MonoMethod * override, struct MonoMethod * base)
{
  struct MonoClass * D.17654;
  char * method_name;
  char * base_name;
  char * message;

  method_name = get_method_full_name (override);
  base_name = get_method_full_name (base);
  message = monoeg_g_strdup_printf (format, method_name, base_name);
  monoeg_g_free (base_name);
  monoeg_g_free (method_name);
  mono_trace (16, 64, message);
  D.17654 = override->klass;
  mono_class_set_failure (D.17654, 7, message);
}


get_method_full_name (struct MonoMethod * method)
{
  char * D.17655;
  char * iftmp.8;

  if (method != 0B) goto <D.17657>; else goto <D.17658>;
  <D.17657>:
  iftmp.8 = mono_method_full_name (method, 1);
  goto <D.17659>;
  <D.17658>:
  iftmp.8 = monoeg_strdup ("\'no caller found\'");
  <D.17659>:
  D.17655 = iftmp.8;
  return D.17655;
}


monoeg_strdup (const gchar * str)
{
  gchar * D.17663;

  if (str != 0B) goto <D.17661>; else goto <D.17662>;
  <D.17661>:
  D.17663 = __strdup (str);
  return D.17663;
  <D.17662>:
  D.17663 = 0B;
  return D.17663;
}


mono_security_core_clr_require_elevated_permissions ()
{
  struct MonoMethod * D.17667;
  int D.17669;
  gboolean D.17670;
  <unnamed type> D.17671;
  _Bool D.17672;
  struct ElevatedTrustCookie cookie;

  try
    {
      cookie.depth = 0;
      cookie.caller = 0B;
      mono_stack_walk_no_il (get_caller_of_elevated_trust_code, &cookie);
      D.17667 = cookie.caller;
      if (D.17667 == 0B) goto <D.17665>; else goto <D.17668>;
      <D.17668>:
      D.17669 = cookie.depth;
      if (D.17669 <= 2) goto <D.17665>; else goto <D.17666>;
      <D.17665>:
      D.17670 = 1;
      return D.17670;
      <D.17666>:
      D.17667 = cookie.caller;
      D.17671 = mono_security_core_clr_method_level (D.17667, 1);
      D.17672 = D.17671 == 0;
      D.17670 = (gboolean) D.17672;
      return D.17670;
    }
  finally
    {
      cookie = {CLOBBER};
    }
}


get_caller_of_elevated_trust_code (struct MonoMethod * m, gint32 no, gint32 ilo, gboolean managed, void * data)
{
  unsigned int D.17678;
  unsigned int D.17679;
  gboolean D.17680;
  struct MonoClass * D.17681;
  struct MonoImage * D.17682;
  int D.17683;
  int D.17686;
  int D.17294;
  int iftmp.9;
  int D.17293;
  const char[16] * D.17690;
  unsigned char D.17691;
  int D.17692;
  unsigned char D.17693;
  int D.17694;
  const unsigned char * D.17699;
  unsigned char D.17700;
  int D.17701;
  const unsigned char * D.17702;
  unsigned char D.17703;
  int D.17704;
  const unsigned char * D.17709;
  unsigned char D.17710;
  int D.17711;
  const unsigned char * D.17712;
  unsigned char D.17713;
  int D.17714;
  const unsigned char * D.17719;
  unsigned char D.17720;
  int D.17721;
  const unsigned char * D.17722;
  unsigned char D.17723;
  int D.17724;
  const char * D.17726;
  int D.17303;
  int iftmp.10;
  int D.17302;
  const char[16] * D.17732;
  unsigned char D.17733;
  int D.17734;
  unsigned char D.17735;
  int D.17736;
  const unsigned char * D.17741;
  unsigned char D.17742;
  int D.17743;
  const unsigned char * D.17744;
  unsigned char D.17745;
  int D.17746;
  const unsigned char * D.17751;
  unsigned char D.17752;
  int D.17753;
  const unsigned char * D.17754;
  unsigned char D.17755;
  int D.17756;
  const unsigned char * D.17761;
  unsigned char D.17762;
  int D.17763;
  const unsigned char * D.17764;
  unsigned char D.17765;
  int D.17766;
  const char * D.17768;
  int D.17312;
  int iftmp.11;
  int D.17311;
  const char[26] * D.17774;
  unsigned char D.17775;
  int D.17776;
  unsigned char D.17777;
  int D.17778;
  const unsigned char * D.17783;
  unsigned char D.17784;
  int D.17785;
  const unsigned char * D.17786;
  unsigned char D.17787;
  int D.17788;
  const unsigned char * D.17793;
  unsigned char D.17794;
  int D.17795;
  const unsigned char * D.17796;
  unsigned char D.17797;
  int D.17798;
  const unsigned char * D.17803;
  unsigned char D.17804;
  int D.17805;
  const unsigned char * D.17806;
  unsigned char D.17807;
  int D.17808;
  const char * D.17810;
  int D.17321;
  int iftmp.12;
  int D.17320;
  const char[25] * D.17816;
  unsigned char D.17817;
  int D.17818;
  unsigned char D.17819;
  int D.17820;
  const unsigned char * D.17825;
  unsigned char D.17826;
  int D.17827;
  const unsigned char * D.17828;
  unsigned char D.17829;
  int D.17830;
  const unsigned char * D.17835;
  unsigned char D.17836;
  int D.17837;
  const unsigned char * D.17838;
  unsigned char D.17839;
  int D.17840;
  const unsigned char * D.17845;
  unsigned char D.17846;
  int D.17847;
  const unsigned char * D.17848;
  unsigned char D.17849;
  int D.17850;
  int D.17854;
  <unnamed type> D.17855;
  struct ElevatedTrustCookie * cookie;

  cookie = data;
  if (managed == 0) goto <D.17675>; else goto <D.17677>;
  <D.17677>:
  D.17678 = BIT_FIELD_REF <*m, 32, 160>;
  D.17679 = D.17678 & 124;
  if (D.17679 != 0) goto <D.17675>; else goto <D.17676>;
  <D.17675>:
  D.17680 = 0;
  return D.17680;
  <D.17676>:
  D.17681 = m->klass;
  D.17682 = D.17681->image;
  D.17683 = mono_security_core_clr_is_platform_image (D.17682);
  if (D.17683 == 0) goto <D.17684>; else goto <D.17685>;
  <D.17684>:
  cookie->caller = m;
  D.17680 = 1;
  return D.17680;
  <D.17685>:
  D.17686 = cookie->depth;
  switch (D.17686) <default: <D.17324>, case 0: <D.17285>, case 1: <D.17323>>
  <D.17285>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 15;
    if (__s2_len <= 3) goto <D.17688>; else goto <D.17689>;
    <D.17688>:
    {
      const unsigned char * __s2;
      int __result;

      D.17681 = m->klass;
      __s2 = D.17681->name_space;
      D.17690 = "System.Security";
      D.17691 = MEM[(const unsigned char *)D.17690];
      D.17692 = (int) D.17691;
      D.17693 = *__s2;
      D.17694 = (int) D.17693;
      __result = D.17692 - D.17694;
      {
        if (__s2_len != 0) goto <D.17695>; else goto <D.17696>;
        <D.17695>:
        if (__result == 0) goto <D.17697>; else goto <D.17698>;
        <D.17697>:
        D.17699 = &MEM[(void *)"System.Security" + 1B];
        D.17700 = *D.17699;
        D.17701 = (int) D.17700;
        D.17702 = __s2 + 1;
        D.17703 = *D.17702;
        D.17704 = (int) D.17703;
        __result = D.17701 - D.17704;
        if (__s2_len > 1) goto <D.17705>; else goto <D.17706>;
        <D.17705>:
        if (__result == 0) goto <D.17707>; else goto <D.17708>;
        <D.17707>:
        D.17709 = &MEM[(void *)"System.Security" + 2B];
        D.17710 = *D.17709;
        D.17711 = (int) D.17710;
        D.17712 = __s2 + 2;
        D.17713 = *D.17712;
        D.17714 = (int) D.17713;
        __result = D.17711 - D.17714;
        if (__s2_len > 2) goto <D.17715>; else goto <D.17716>;
        <D.17715>:
        if (__result == 0) goto <D.17717>; else goto <D.17718>;
        <D.17717>:
        D.17719 = &MEM[(void *)"System.Security" + 3B];
        D.17720 = *D.17719;
        D.17721 = (int) D.17720;
        D.17722 = __s2 + 3;
        D.17723 = *D.17722;
        D.17724 = (int) D.17723;
        __result = D.17721 - D.17724;
        <D.17718>:
        <D.17716>:
        <D.17708>:
        <D.17706>:
        <D.17698>:
        <D.17696>:
      }
      D.17293 = __result;
    }
    iftmp.9 = -D.17293;
    goto <D.17725>;
    <D.17689>:
    D.17681 = m->klass;
    D.17726 = D.17681->name_space;
    iftmp.9 = __builtin_strcmp (D.17726, "System.Security");
    <D.17725>:
    D.17294 = iftmp.9;
  }
  if (D.17294 != 0) goto <D.17727>; else goto <D.17728>;
  <D.17727>:
  D.17680 = 0;
  return D.17680;
  <D.17728>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 15;
    if (__s2_len <= 3) goto <D.17730>; else goto <D.17731>;
    <D.17730>:
    {
      const unsigned char * __s2;
      int __result;

      D.17681 = m->klass;
      __s2 = D.17681->name;
      D.17732 = "SecurityManager";
      D.17733 = MEM[(const unsigned char *)D.17732];
      D.17734 = (int) D.17733;
      D.17735 = *__s2;
      D.17736 = (int) D.17735;
      __result = D.17734 - D.17736;
      {
        if (__s2_len != 0) goto <D.17737>; else goto <D.17738>;
        <D.17737>:
        if (__result == 0) goto <D.17739>; else goto <D.17740>;
        <D.17739>:
        D.17741 = &MEM[(void *)"SecurityManager" + 1B];
        D.17742 = *D.17741;
        D.17743 = (int) D.17742;
        D.17744 = __s2 + 1;
        D.17745 = *D.17744;
        D.17746 = (int) D.17745;
        __result = D.17743 - D.17746;
        if (__s2_len > 1) goto <D.17747>; else goto <D.17748>;
        <D.17747>:
        if (__result == 0) goto <D.17749>; else goto <D.17750>;
        <D.17749>:
        D.17751 = &MEM[(void *)"SecurityManager" + 2B];
        D.17752 = *D.17751;
        D.17753 = (int) D.17752;
        D.17754 = __s2 + 2;
        D.17755 = *D.17754;
        D.17756 = (int) D.17755;
        __result = D.17753 - D.17756;
        if (__s2_len > 2) goto <D.17757>; else goto <D.17758>;
        <D.17757>:
        if (__result == 0) goto <D.17759>; else goto <D.17760>;
        <D.17759>:
        D.17761 = &MEM[(void *)"SecurityManager" + 3B];
        D.17762 = *D.17761;
        D.17763 = (int) D.17762;
        D.17764 = __s2 + 3;
        D.17765 = *D.17764;
        D.17766 = (int) D.17765;
        __result = D.17763 - D.17766;
        <D.17760>:
        <D.17758>:
        <D.17750>:
        <D.17748>:
        <D.17740>:
        <D.17738>:
      }
      D.17302 = __result;
    }
    iftmp.10 = -D.17302;
    goto <D.17767>;
    <D.17731>:
    D.17681 = m->klass;
    D.17768 = D.17681->name;
    iftmp.10 = __builtin_strcmp (D.17768, "SecurityManager");
    <D.17767>:
    D.17303 = iftmp.10;
  }
  if (D.17303 != 0) goto <D.17769>; else goto <D.17770>;
  <D.17769>:
  D.17680 = 0;
  return D.17680;
  <D.17770>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 25;
    if (__s2_len <= 3) goto <D.17772>; else goto <D.17773>;
    <D.17772>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = m->name;
      D.17774 = "EnsureElevatedPermissions";
      D.17775 = MEM[(const unsigned char *)D.17774];
      D.17776 = (int) D.17775;
      D.17777 = *__s2;
      D.17778 = (int) D.17777;
      __result = D.17776 - D.17778;
      {
        if (__s2_len != 0) goto <D.17779>; else goto <D.17780>;
        <D.17779>:
        if (__result == 0) goto <D.17781>; else goto <D.17782>;
        <D.17781>:
        D.17783 = &MEM[(void *)"EnsureElevatedPermissions" + 1B];
        D.17784 = *D.17783;
        D.17785 = (int) D.17784;
        D.17786 = __s2 + 1;
        D.17787 = *D.17786;
        D.17788 = (int) D.17787;
        __result = D.17785 - D.17788;
        if (__s2_len > 1) goto <D.17789>; else goto <D.17790>;
        <D.17789>:
        if (__result == 0) goto <D.17791>; else goto <D.17792>;
        <D.17791>:
        D.17793 = &MEM[(void *)"EnsureElevatedPermissions" + 2B];
        D.17794 = *D.17793;
        D.17795 = (int) D.17794;
        D.17796 = __s2 + 2;
        D.17797 = *D.17796;
        D.17798 = (int) D.17797;
        __result = D.17795 - D.17798;
        if (__s2_len > 2) goto <D.17799>; else goto <D.17800>;
        <D.17799>:
        if (__result == 0) goto <D.17801>; else goto <D.17802>;
        <D.17801>:
        D.17803 = &MEM[(void *)"EnsureElevatedPermissions" + 3B];
        D.17804 = *D.17803;
        D.17805 = (int) D.17804;
        D.17806 = __s2 + 3;
        D.17807 = *D.17806;
        D.17808 = (int) D.17807;
        __result = D.17805 - D.17808;
        <D.17802>:
        <D.17800>:
        <D.17792>:
        <D.17790>:
        <D.17782>:
        <D.17780>:
      }
      D.17311 = __result;
    }
    iftmp.11 = -D.17311;
    goto <D.17809>;
    <D.17773>:
    D.17810 = m->name;
    iftmp.11 = __builtin_strcmp (D.17810, "EnsureElevatedPermissions");
    <D.17809>:
    D.17312 = iftmp.11;
  }
  if (D.17312 != 0) goto <D.17811>; else goto <D.17812>;
  <D.17811>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 24;
    if (__s2_len <= 3) goto <D.17814>; else goto <D.17815>;
    <D.17814>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = m->name;
      D.17816 = "CheckElevatedPermissions";
      D.17817 = MEM[(const unsigned char *)D.17816];
      D.17818 = (int) D.17817;
      D.17819 = *__s2;
      D.17820 = (int) D.17819;
      __result = D.17818 - D.17820;
      {
        if (__s2_len != 0) goto <D.17821>; else goto <D.17822>;
        <D.17821>:
        if (__result == 0) goto <D.17823>; else goto <D.17824>;
        <D.17823>:
        D.17825 = &MEM[(void *)"CheckElevatedPermissions" + 1B];
        D.17826 = *D.17825;
        D.17827 = (int) D.17826;
        D.17828 = __s2 + 1;
        D.17829 = *D.17828;
        D.17830 = (int) D.17829;
        __result = D.17827 - D.17830;
        if (__s2_len > 1) goto <D.17831>; else goto <D.17832>;
        <D.17831>:
        if (__result == 0) goto <D.17833>; else goto <D.17834>;
        <D.17833>:
        D.17835 = &MEM[(void *)"CheckElevatedPermissions" + 2B];
        D.17836 = *D.17835;
        D.17837 = (int) D.17836;
        D.17838 = __s2 + 2;
        D.17839 = *D.17838;
        D.17840 = (int) D.17839;
        __result = D.17837 - D.17840;
        if (__s2_len > 2) goto <D.17841>; else goto <D.17842>;
        <D.17841>:
        if (__result == 0) goto <D.17843>; else goto <D.17844>;
        <D.17843>:
        D.17845 = &MEM[(void *)"CheckElevatedPermissions" + 3B];
        D.17846 = *D.17845;
        D.17847 = (int) D.17846;
        D.17848 = __s2 + 3;
        D.17849 = *D.17848;
        D.17850 = (int) D.17849;
        __result = D.17847 - D.17850;
        <D.17844>:
        <D.17842>:
        <D.17834>:
        <D.17832>:
        <D.17824>:
        <D.17822>:
      }
      D.17320 = __result;
    }
    iftmp.12 = -D.17320;
    goto <D.17851>;
    <D.17815>:
    D.17810 = m->name;
    iftmp.12 = __builtin_strcmp (D.17810, "CheckElevatedPermissions");
    <D.17851>:
    D.17321 = iftmp.12;
  }
  if (D.17321 != 0) goto <D.17852>; else goto <D.17853>;
  <D.17852>:
  D.17680 = 0;
  return D.17680;
  <D.17853>:
  <D.17812>:
  cookie->depth = 1;
  goto <D.17322>;
  <D.17323>:
  cookie->depth = 2;
  goto <D.17322>;
  <D.17324>:
  D.17686 = cookie->depth;
  D.17854 = D.17686 + 1;
  cookie->depth = D.17854;
  D.17855 = mono_security_core_clr_method_level (m, 1);
  if (D.17855 == 0) goto <D.17322>; else goto <D.17856>;
  <D.17856>:
  cookie->caller = m;
  D.17680 = 1;
  return D.17680;
  <D.17322>:
  D.17680 = 0;
  return D.17680;
}


mono_security_core_clr_ensure_reflection_access_field (struct MonoClassField * field)
{
  <unnamed type> D.17858;
  <unnamed type> D.17861;
  unsigned int D.17862;
  struct MonoClass * D.17865;
  struct MonoImage * D.17866;
  int D.17867;
  struct MonoClass * D.17870;
  <unnamed type> D.17871;
  struct MonoException * D.17874;
  int D.17875;
  struct MonoException * D.17878;
  struct MonoMethod * caller;

  caller = get_reflection_caller ();
  D.17858 = mono_security_core_clr_method_level (caller, 1);
  if (D.17858 != 0) goto <D.17859>; else goto <D.17860>;
  <D.17859>:
  return;
  <D.17860>:
  D.17861 = mono_security_core_clr_get_options ();
  D.17862 = D.17861 & 1;
  if (D.17862 != 0) goto <D.17863>; else goto <D.17864>;
  <D.17863>:
  D.17865 = mono_field_get_parent (field);
  D.17866 = D.17865->image;
  D.17867 = mono_security_core_clr_is_platform_image (D.17866);
  if (D.17867 == 0) goto <D.17868>; else goto <D.17869>;
  <D.17868>:
  return;
  <D.17869>:
  <D.17864>:
  D.17870 = mono_field_get_parent (field);
  D.17871 = mono_security_core_clr_class_level (D.17870);
  if (D.17871 == 2) goto <D.17872>; else goto <D.17873>;
  <D.17872>:
  D.17874 = get_field_access_exception ("Transparent method %s cannot get or set Critical field %s.", caller, field);
  mono_raise_exception (D.17874);
  <D.17873>:
  D.17875 = check_field_access (caller, field);
  if (D.17875 == 0) goto <D.17876>; else goto <D.17877>;
  <D.17876>:
  D.17878 = get_field_access_exception ("Transparent method %s cannot get or set private/internal field %s.", caller, field);
  mono_raise_exception (D.17878);
  <D.17877>:
}


get_reflection_caller ()
{
  struct MonoMethod * m.13;
  _Bool D.17881;
  long int D.17882;
  long int D.17883;
  struct MonoMethod * D.17886;
  struct MonoMethod * m;

  try
    {
      m = 0B;
      mono_stack_walk_no_il (get_caller_no_reflection_related, &m);
      m.13 = m;
      D.17881 = m.13 == 0B;
      D.17882 = (long int) D.17881;
      D.17883 = __builtin_expect (D.17882, 0);
      if (D.17883 != 0) goto <D.17884>; else goto <D.17885>;
      <D.17884>:
      mono_trace (16, 64, "No caller outside reflection was found");
      <D.17885>:
      D.17886 = m;
      return D.17886;
    }
  finally
    {
      m = {CLOBBER};
    }
}


get_caller_no_reflection_related (struct MonoMethod * m, gint32 no, gint32 ilo, gboolean managed, void * data)
{
  gboolean D.17891;
  unsigned int D.17892;
  unsigned int D.17893;
  struct MonoClass * D.17896;
  char D.17900;
  struct MonoImage * D.17901;
  int D.17902;
  int D.17186;
  int iftmp.14;
  int D.17185;
  const char[18] * D.17908;
  unsigned char D.17909;
  int D.17910;
  unsigned char D.17911;
  int D.17912;
  const unsigned char * D.17917;
  unsigned char D.17918;
  int D.17919;
  const unsigned char * D.17920;
  unsigned char D.17921;
  int D.17922;
  const unsigned char * D.17927;
  unsigned char D.17928;
  int D.17929;
  const unsigned char * D.17930;
  unsigned char D.17931;
  int D.17932;
  const unsigned char * D.17937;
  unsigned char D.17938;
  int D.17939;
  const unsigned char * D.17940;
  unsigned char D.17941;
  int D.17942;
  int D.17195;
  int iftmp.15;
  int D.17194;
  const char[23] * D.17949;
  unsigned char D.17950;
  int D.17951;
  unsigned char D.17952;
  int D.17953;
  const unsigned char * D.17958;
  unsigned char D.17959;
  int D.17960;
  const unsigned char * D.17961;
  unsigned char D.17962;
  int D.17963;
  const unsigned char * D.17968;
  unsigned char D.17969;
  int D.17970;
  const unsigned char * D.17971;
  unsigned char D.17972;
  int D.17973;
  const unsigned char * D.17978;
  unsigned char D.17979;
  int D.17980;
  const unsigned char * D.17981;
  unsigned char D.17982;
  int D.17983;
  int D.17204;
  int iftmp.16;
  int D.17203;
  const char[7] * D.17990;
  unsigned char D.17991;
  int D.17992;
  unsigned char D.17993;
  int D.17994;
  const unsigned char * D.17999;
  unsigned char D.18000;
  int D.18001;
  const unsigned char * D.18002;
  unsigned char D.18003;
  int D.18004;
  const unsigned char * D.18009;
  unsigned char D.18010;
  int D.18011;
  const unsigned char * D.18012;
  unsigned char D.18013;
  int D.18014;
  const unsigned char * D.18019;
  unsigned char D.18020;
  int D.18021;
  const unsigned char * D.18022;
  unsigned char D.18023;
  int D.18024;
  char D.18028;
  int D.17214;
  int iftmp.17;
  int D.17213;
  const char[10] * D.18034;
  unsigned char D.18035;
  int D.18036;
  unsigned char D.18037;
  int D.18038;
  const unsigned char * D.18043;
  unsigned char D.18044;
  int D.18045;
  const unsigned char * D.18046;
  unsigned char D.18047;
  int D.18048;
  const unsigned char * D.18053;
  unsigned char D.18054;
  int D.18055;
  const unsigned char * D.18056;
  unsigned char D.18057;
  int D.18058;
  const unsigned char * D.18063;
  unsigned char D.18064;
  int D.18065;
  const unsigned char * D.18066;
  unsigned char D.18067;
  int D.18068;
  int D.17223;
  int iftmp.18;
  int D.17222;
  const char[5] * D.18079;
  unsigned char D.18080;
  int D.18081;
  unsigned char D.18082;
  int D.18083;
  const unsigned char * D.18088;
  unsigned char D.18089;
  int D.18090;
  const unsigned char * D.18091;
  unsigned char D.18092;
  int D.18093;
  const unsigned char * D.18098;
  unsigned char D.18099;
  int D.18100;
  const unsigned char * D.18101;
  unsigned char D.18102;
  int D.18103;
  const unsigned char * D.18108;
  unsigned char D.18109;
  int D.18110;
  const unsigned char * D.18111;
  unsigned char D.18112;
  int D.18113;
  int D.17232;
  int iftmp.19;
  int D.17231;
  const char[9] * D.18119;
  unsigned char D.18120;
  int D.18121;
  unsigned char D.18122;
  int D.18123;
  const unsigned char * D.18128;
  unsigned char D.18129;
  int D.18130;
  const unsigned char * D.18131;
  unsigned char D.18132;
  int D.18133;
  const unsigned char * D.18138;
  unsigned char D.18139;
  int D.18140;
  const unsigned char * D.18141;
  unsigned char D.18142;
  int D.18143;
  const unsigned char * D.18148;
  unsigned char D.18149;
  int D.18150;
  const unsigned char * D.18151;
  unsigned char D.18152;
  int D.18153;
  int D.17241;
  int iftmp.20;
  int D.17240;
  const char[13] * D.18158;
  unsigned char D.18159;
  int D.18160;
  unsigned char D.18161;
  int D.18162;
  const unsigned char * D.18167;
  unsigned char D.18168;
  int D.18169;
  const unsigned char * D.18170;
  unsigned char D.18171;
  int D.18172;
  const unsigned char * D.18177;
  unsigned char D.18178;
  int D.18179;
  const unsigned char * D.18180;
  unsigned char D.18181;
  int D.18182;
  const unsigned char * D.18187;
  unsigned char D.18188;
  int D.18189;
  const unsigned char * D.18190;
  unsigned char D.18191;
  int D.18192;
  const char * D.18194;
  int D.17250;
  int iftmp.21;
  int D.17249;
  const char[9] * D.18204;
  unsigned char D.18205;
  int D.18206;
  unsigned char D.18207;
  int D.18208;
  const unsigned char * D.18213;
  unsigned char D.18214;
  int D.18215;
  const unsigned char * D.18216;
  unsigned char D.18217;
  int D.18218;
  const unsigned char * D.18223;
  unsigned char D.18224;
  int D.18225;
  const unsigned char * D.18226;
  unsigned char D.18227;
  int D.18228;
  const unsigned char * D.18233;
  unsigned char D.18234;
  int D.18235;
  const unsigned char * D.18236;
  unsigned char D.18237;
  int D.18238;
  int D.17259;
  int iftmp.22;
  int D.17258;
  const char[18] * D.18244;
  unsigned char D.18245;
  int D.18246;
  unsigned char D.18247;
  int D.18248;
  const unsigned char * D.18253;
  unsigned char D.18254;
  int D.18255;
  const unsigned char * D.18256;
  unsigned char D.18257;
  int D.18258;
  const unsigned char * D.18263;
  unsigned char D.18264;
  int D.18265;
  const unsigned char * D.18266;
  unsigned char D.18267;
  int D.18268;
  const unsigned char * D.18273;
  unsigned char D.18274;
  int D.18275;
  const unsigned char * D.18276;
  unsigned char D.18277;
  int D.18278;
  int D.17268;
  int iftmp.23;
  int D.17267;
  const char[14] * D.18283;
  unsigned char D.18284;
  int D.18285;
  unsigned char D.18286;
  int D.18287;
  const unsigned char * D.18292;
  unsigned char D.18293;
  int D.18294;
  const unsigned char * D.18295;
  unsigned char D.18296;
  int D.18297;
  const unsigned char * D.18302;
  unsigned char D.18303;
  int D.18304;
  const unsigned char * D.18305;
  unsigned char D.18306;
  int D.18307;
  const unsigned char * D.18312;
  unsigned char D.18313;
  int D.18314;
  const unsigned char * D.18315;
  unsigned char D.18316;
  int D.18317;
  struct MonoMethod * D.18321;
  struct MonoMethod * * dest;
  const char * ns;

  dest = data;
  if (managed == 0) goto <D.17889>; else goto <D.17890>;
  <D.17889>:
  D.17891 = 0;
  return D.17891;
  <D.17890>:
  D.17892 = BIT_FIELD_REF <*m, 32, 160>;
  D.17893 = D.17892 & 124;
  if (D.17893 != 0) goto <D.17894>; else goto <D.17895>;
  <D.17894>:
  D.17891 = 0;
  return D.17891;
  <D.17895>:
  D.17896 = m->klass;
  ns = D.17896->name_space;
  if (ns == 0B) goto <D.17897>; else goto <D.17899>;
  <D.17899>:
  D.17900 = *ns;
  if (D.17900 != 83) goto <D.17897>; else goto <D.17898>;
  <D.17897>:
  *dest = m;
  D.17891 = 1;
  return D.17891;
  <D.17898>:
  D.17896 = m->klass;
  D.17901 = D.17896->image;
  D.17902 = mono_security_core_clr_is_platform_image (D.17901);
  if (D.17902 == 0) goto <D.17903>; else goto <D.17904>;
  <D.17903>:
  *dest = m;
  D.17891 = 1;
  return D.17891;
  <D.17904>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 17;
    if (__s2_len <= 3) goto <D.17906>; else goto <D.17907>;
    <D.17906>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = ns;
      D.17908 = "System.Reflection";
      D.17909 = MEM[(const unsigned char *)D.17908];
      D.17910 = (int) D.17909;
      D.17911 = *__s2;
      D.17912 = (int) D.17911;
      __result = D.17910 - D.17912;
      {
        if (__s2_len != 0) goto <D.17913>; else goto <D.17914>;
        <D.17913>:
        if (__result == 0) goto <D.17915>; else goto <D.17916>;
        <D.17915>:
        D.17917 = &MEM[(void *)"System.Reflection" + 1B];
        D.17918 = *D.17917;
        D.17919 = (int) D.17918;
        D.17920 = __s2 + 1;
        D.17921 = *D.17920;
        D.17922 = (int) D.17921;
        __result = D.17919 - D.17922;
        if (__s2_len > 1) goto <D.17923>; else goto <D.17924>;
        <D.17923>:
        if (__result == 0) goto <D.17925>; else goto <D.17926>;
        <D.17925>:
        D.17927 = &MEM[(void *)"System.Reflection" + 2B];
        D.17928 = *D.17927;
        D.17929 = (int) D.17928;
        D.17930 = __s2 + 2;
        D.17931 = *D.17930;
        D.17932 = (int) D.17931;
        __result = D.17929 - D.17932;
        if (__s2_len > 2) goto <D.17933>; else goto <D.17934>;
        <D.17933>:
        if (__result == 0) goto <D.17935>; else goto <D.17936>;
        <D.17935>:
        D.17937 = &MEM[(void *)"System.Reflection" + 3B];
        D.17938 = *D.17937;
        D.17939 = (int) D.17938;
        D.17940 = __s2 + 3;
        D.17941 = *D.17940;
        D.17942 = (int) D.17941;
        __result = D.17939 - D.17942;
        <D.17936>:
        <D.17934>:
        <D.17926>:
        <D.17924>:
        <D.17916>:
        <D.17914>:
      }
      D.17185 = __result;
    }
    iftmp.14 = -D.17185;
    goto <D.17943>;
    <D.17907>:
    iftmp.14 = __builtin_strcmp (ns, "System.Reflection");
    <D.17943>:
    D.17186 = iftmp.14;
  }
  if (D.17186 == 0) goto <D.17944>; else goto <D.17945>;
  <D.17944>:
  D.17891 = 0;
  return D.17891;
  <D.17945>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 22;
    if (__s2_len <= 3) goto <D.17947>; else goto <D.17948>;
    <D.17947>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = ns;
      D.17949 = "System.Reflection.Emit";
      D.17950 = MEM[(const unsigned char *)D.17949];
      D.17951 = (int) D.17950;
      D.17952 = *__s2;
      D.17953 = (int) D.17952;
      __result = D.17951 - D.17953;
      {
        if (__s2_len != 0) goto <D.17954>; else goto <D.17955>;
        <D.17954>:
        if (__result == 0) goto <D.17956>; else goto <D.17957>;
        <D.17956>:
        D.17958 = &MEM[(void *)"System.Reflection.Emit" + 1B];
        D.17959 = *D.17958;
        D.17960 = (int) D.17959;
        D.17961 = __s2 + 1;
        D.17962 = *D.17961;
        D.17963 = (int) D.17962;
        __result = D.17960 - D.17963;
        if (__s2_len > 1) goto <D.17964>; else goto <D.17965>;
        <D.17964>:
        if (__result == 0) goto <D.17966>; else goto <D.17967>;
        <D.17966>:
        D.17968 = &MEM[(void *)"System.Reflection.Emit" + 2B];
        D.17969 = *D.17968;
        D.17970 = (int) D.17969;
        D.17971 = __s2 + 2;
        D.17972 = *D.17971;
        D.17973 = (int) D.17972;
        __result = D.17970 - D.17973;
        if (__s2_len > 2) goto <D.17974>; else goto <D.17975>;
        <D.17974>:
        if (__result == 0) goto <D.17976>; else goto <D.17977>;
        <D.17976>:
        D.17978 = &MEM[(void *)"System.Reflection.Emit" + 3B];
        D.17979 = *D.17978;
        D.17980 = (int) D.17979;
        D.17981 = __s2 + 3;
        D.17982 = *D.17981;
        D.17983 = (int) D.17982;
        __result = D.17980 - D.17983;
        <D.17977>:
        <D.17975>:
        <D.17967>:
        <D.17965>:
        <D.17957>:
        <D.17955>:
      }
      D.17194 = __result;
    }
    iftmp.15 = -D.17194;
    goto <D.17984>;
    <D.17948>:
    iftmp.15 = __builtin_strcmp (ns, "System.Reflection.Emit");
    <D.17984>:
    D.17195 = iftmp.15;
  }
  if (D.17195 == 0) goto <D.17985>; else goto <D.17986>;
  <D.17985>:
  D.17891 = 0;
  return D.17891;
  <D.17986>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 6;
    if (__s2_len <= 3) goto <D.17988>; else goto <D.17989>;
    <D.17988>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = ns;
      D.17990 = "System";
      D.17991 = MEM[(const unsigned char *)D.17990];
      D.17992 = (int) D.17991;
      D.17993 = *__s2;
      D.17994 = (int) D.17993;
      __result = D.17992 - D.17994;
      {
        if (__s2_len != 0) goto <D.17995>; else goto <D.17996>;
        <D.17995>:
        if (__result == 0) goto <D.17997>; else goto <D.17998>;
        <D.17997>:
        D.17999 = &MEM[(void *)"System" + 1B];
        D.18000 = *D.17999;
        D.18001 = (int) D.18000;
        D.18002 = __s2 + 1;
        D.18003 = *D.18002;
        D.18004 = (int) D.18003;
        __result = D.18001 - D.18004;
        if (__s2_len > 1) goto <D.18005>; else goto <D.18006>;
        <D.18005>:
        if (__result == 0) goto <D.18007>; else goto <D.18008>;
        <D.18007>:
        D.18009 = &MEM[(void *)"System" + 2B];
        D.18010 = *D.18009;
        D.18011 = (int) D.18010;
        D.18012 = __s2 + 2;
        D.18013 = *D.18012;
        D.18014 = (int) D.18013;
        __result = D.18011 - D.18014;
        if (__s2_len > 2) goto <D.18015>; else goto <D.18016>;
        <D.18015>:
        if (__result == 0) goto <D.18017>; else goto <D.18018>;
        <D.18017>:
        D.18019 = &MEM[(void *)"System" + 3B];
        D.18020 = *D.18019;
        D.18021 = (int) D.18020;
        D.18022 = __s2 + 3;
        D.18023 = *D.18022;
        D.18024 = (int) D.18023;
        __result = D.18021 - D.18024;
        <D.18018>:
        <D.18016>:
        <D.18008>:
        <D.18006>:
        <D.17998>:
        <D.17996>:
      }
      D.17203 = __result;
    }
    iftmp.16 = -D.17203;
    goto <D.18025>;
    <D.17989>:
    iftmp.16 = __builtin_strcmp (ns, "System");
    <D.18025>:
    D.17204 = iftmp.16;
  }
  if (D.17204 == 0) goto <D.18026>; else goto <D.18027>;
  <D.18026>:
  {
    const char * kname;

    D.17896 = m->klass;
    kname = D.17896->name;
    D.18028 = *kname;
    if (D.18028 == 65) goto <D.18029>; else goto <D.18030>;
    <D.18029>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 9;
      if (__s2_len <= 3) goto <D.18032>; else goto <D.18033>;
      <D.18032>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18034 = "Activator";
        D.18035 = MEM[(const unsigned char *)D.18034];
        D.18036 = (int) D.18035;
        D.18037 = *__s2;
        D.18038 = (int) D.18037;
        __result = D.18036 - D.18038;
        {
          if (__s2_len != 0) goto <D.18039>; else goto <D.18040>;
          <D.18039>:
          if (__result == 0) goto <D.18041>; else goto <D.18042>;
          <D.18041>:
          D.18043 = &MEM[(void *)"Activator" + 1B];
          D.18044 = *D.18043;
          D.18045 = (int) D.18044;
          D.18046 = __s2 + 1;
          D.18047 = *D.18046;
          D.18048 = (int) D.18047;
          __result = D.18045 - D.18048;
          if (__s2_len > 1) goto <D.18049>; else goto <D.18050>;
          <D.18049>:
          if (__result == 0) goto <D.18051>; else goto <D.18052>;
          <D.18051>:
          D.18053 = &MEM[(void *)"Activator" + 2B];
          D.18054 = *D.18053;
          D.18055 = (int) D.18054;
          D.18056 = __s2 + 2;
          D.18057 = *D.18056;
          D.18058 = (int) D.18057;
          __result = D.18055 - D.18058;
          if (__s2_len > 2) goto <D.18059>; else goto <D.18060>;
          <D.18059>:
          if (__result == 0) goto <D.18061>; else goto <D.18062>;
          <D.18061>:
          D.18063 = &MEM[(void *)"Activator" + 3B];
          D.18064 = *D.18063;
          D.18065 = (int) D.18064;
          D.18066 = __s2 + 3;
          D.18067 = *D.18066;
          D.18068 = (int) D.18067;
          __result = D.18065 - D.18068;
          <D.18062>:
          <D.18060>:
          <D.18052>:
          <D.18050>:
          <D.18042>:
          <D.18040>:
        }
        D.17213 = __result;
      }
      iftmp.17 = -D.17213;
      goto <D.18069>;
      <D.18033>:
      iftmp.17 = __builtin_strcmp (kname, "Activator");
      <D.18069>:
      D.17214 = iftmp.17;
    }
    if (D.17214 == 0) goto <D.18070>; else goto <D.18071>;
    <D.18070>:
    D.17891 = 0;
    return D.17891;
    <D.18071>:
    <D.18030>:
    D.18028 = *kname;
    if (D.18028 == 84) goto <D.18075>; else goto <D.18072>;
    <D.18075>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 4;
      if (__s2_len <= 3) goto <D.18077>; else goto <D.18078>;
      <D.18077>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18079 = "Type";
        D.18080 = MEM[(const unsigned char *)D.18079];
        D.18081 = (int) D.18080;
        D.18082 = *__s2;
        D.18083 = (int) D.18082;
        __result = D.18081 - D.18083;
        {
          if (__s2_len != 0) goto <D.18084>; else goto <D.18085>;
          <D.18084>:
          if (__result == 0) goto <D.18086>; else goto <D.18087>;
          <D.18086>:
          D.18088 = &MEM[(void *)"Type" + 1B];
          D.18089 = *D.18088;
          D.18090 = (int) D.18089;
          D.18091 = __s2 + 1;
          D.18092 = *D.18091;
          D.18093 = (int) D.18092;
          __result = D.18090 - D.18093;
          if (__s2_len > 1) goto <D.18094>; else goto <D.18095>;
          <D.18094>:
          if (__result == 0) goto <D.18096>; else goto <D.18097>;
          <D.18096>:
          D.18098 = &MEM[(void *)"Type" + 2B];
          D.18099 = *D.18098;
          D.18100 = (int) D.18099;
          D.18101 = __s2 + 2;
          D.18102 = *D.18101;
          D.18103 = (int) D.18102;
          __result = D.18100 - D.18103;
          if (__s2_len > 2) goto <D.18104>; else goto <D.18105>;
          <D.18104>:
          if (__result == 0) goto <D.18106>; else goto <D.18107>;
          <D.18106>:
          D.18108 = &MEM[(void *)"Type" + 3B];
          D.18109 = *D.18108;
          D.18110 = (int) D.18109;
          D.18111 = __s2 + 3;
          D.18112 = *D.18111;
          D.18113 = (int) D.18112;
          __result = D.18110 - D.18113;
          <D.18107>:
          <D.18105>:
          <D.18097>:
          <D.18095>:
          <D.18087>:
          <D.18085>:
        }
        D.17222 = __result;
      }
      iftmp.18 = -D.17222;
      goto <D.18114>;
      <D.18078>:
      iftmp.18 = __builtin_strcmp (kname, "Type");
      <D.18114>:
      D.17223 = iftmp.18;
    }
    if (D.17223 == 0) goto <D.18073>; else goto <D.18072>;
    <D.18072>:
    D.18028 = *kname;
    if (D.18028 == 77) goto <D.18115>; else goto <D.18074>;
    <D.18115>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 8;
      if (__s2_len <= 3) goto <D.18117>; else goto <D.18118>;
      <D.18117>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18119 = "MonoType";
        D.18120 = MEM[(const unsigned char *)D.18119];
        D.18121 = (int) D.18120;
        D.18122 = *__s2;
        D.18123 = (int) D.18122;
        __result = D.18121 - D.18123;
        {
          if (__s2_len != 0) goto <D.18124>; else goto <D.18125>;
          <D.18124>:
          if (__result == 0) goto <D.18126>; else goto <D.18127>;
          <D.18126>:
          D.18128 = &MEM[(void *)"MonoType" + 1B];
          D.18129 = *D.18128;
          D.18130 = (int) D.18129;
          D.18131 = __s2 + 1;
          D.18132 = *D.18131;
          D.18133 = (int) D.18132;
          __result = D.18130 - D.18133;
          if (__s2_len > 1) goto <D.18134>; else goto <D.18135>;
          <D.18134>:
          if (__result == 0) goto <D.18136>; else goto <D.18137>;
          <D.18136>:
          D.18138 = &MEM[(void *)"MonoType" + 2B];
          D.18139 = *D.18138;
          D.18140 = (int) D.18139;
          D.18141 = __s2 + 2;
          D.18142 = *D.18141;
          D.18143 = (int) D.18142;
          __result = D.18140 - D.18143;
          if (__s2_len > 2) goto <D.18144>; else goto <D.18145>;
          <D.18144>:
          if (__result == 0) goto <D.18146>; else goto <D.18147>;
          <D.18146>:
          D.18148 = &MEM[(void *)"MonoType" + 3B];
          D.18149 = *D.18148;
          D.18150 = (int) D.18149;
          D.18151 = __s2 + 3;
          D.18152 = *D.18151;
          D.18153 = (int) D.18152;
          __result = D.18150 - D.18153;
          <D.18147>:
          <D.18145>:
          <D.18137>:
          <D.18135>:
          <D.18127>:
          <D.18125>:
        }
        D.17231 = __result;
      }
      iftmp.19 = -D.17231;
      goto <D.18154>;
      <D.18118>:
      iftmp.19 = __builtin_strcmp (kname, "MonoType");
      <D.18154>:
      D.17232 = iftmp.19;
    }
    if (D.17232 == 0) goto <D.18073>; else goto <D.18074>;
    <D.18073>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 12;
      if (__s2_len <= 3) goto <D.18156>; else goto <D.18157>;
      <D.18156>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = m->name;
        D.18158 = "InvokeMember";
        D.18159 = MEM[(const unsigned char *)D.18158];
        D.18160 = (int) D.18159;
        D.18161 = *__s2;
        D.18162 = (int) D.18161;
        __result = D.18160 - D.18162;
        {
          if (__s2_len != 0) goto <D.18163>; else goto <D.18164>;
          <D.18163>:
          if (__result == 0) goto <D.18165>; else goto <D.18166>;
          <D.18165>:
          D.18167 = &MEM[(void *)"InvokeMember" + 1B];
          D.18168 = *D.18167;
          D.18169 = (int) D.18168;
          D.18170 = __s2 + 1;
          D.18171 = *D.18170;
          D.18172 = (int) D.18171;
          __result = D.18169 - D.18172;
          if (__s2_len > 1) goto <D.18173>; else goto <D.18174>;
          <D.18173>:
          if (__result == 0) goto <D.18175>; else goto <D.18176>;
          <D.18175>:
          D.18177 = &MEM[(void *)"InvokeMember" + 2B];
          D.18178 = *D.18177;
          D.18179 = (int) D.18178;
          D.18180 = __s2 + 2;
          D.18181 = *D.18180;
          D.18182 = (int) D.18181;
          __result = D.18179 - D.18182;
          if (__s2_len > 2) goto <D.18183>; else goto <D.18184>;
          <D.18183>:
          if (__result == 0) goto <D.18185>; else goto <D.18186>;
          <D.18185>:
          D.18187 = &MEM[(void *)"InvokeMember" + 3B];
          D.18188 = *D.18187;
          D.18189 = (int) D.18188;
          D.18190 = __s2 + 3;
          D.18191 = *D.18190;
          D.18192 = (int) D.18191;
          __result = D.18189 - D.18192;
          <D.18186>:
          <D.18184>:
          <D.18176>:
          <D.18174>:
          <D.18166>:
          <D.18164>:
        }
        D.17240 = __result;
      }
      iftmp.20 = -D.17240;
      goto <D.18193>;
      <D.18157>:
      D.18194 = m->name;
      iftmp.20 = __builtin_strcmp (D.18194, "InvokeMember");
      <D.18193>:
      D.17241 = iftmp.20;
    }
    if (D.17241 == 0) goto <D.18195>; else goto <D.18196>;
    <D.18195>:
    D.17891 = 0;
    return D.17891;
    <D.18196>:
    <D.18074>:
    D.18028 = *kname;
    if (D.18028 == 68) goto <D.18200>; else goto <D.18197>;
    <D.18200>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 8;
      if (__s2_len <= 3) goto <D.18202>; else goto <D.18203>;
      <D.18202>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18204 = "Delegate";
        D.18205 = MEM[(const unsigned char *)D.18204];
        D.18206 = (int) D.18205;
        D.18207 = *__s2;
        D.18208 = (int) D.18207;
        __result = D.18206 - D.18208;
        {
          if (__s2_len != 0) goto <D.18209>; else goto <D.18210>;
          <D.18209>:
          if (__result == 0) goto <D.18211>; else goto <D.18212>;
          <D.18211>:
          D.18213 = &MEM[(void *)"Delegate" + 1B];
          D.18214 = *D.18213;
          D.18215 = (int) D.18214;
          D.18216 = __s2 + 1;
          D.18217 = *D.18216;
          D.18218 = (int) D.18217;
          __result = D.18215 - D.18218;
          if (__s2_len > 1) goto <D.18219>; else goto <D.18220>;
          <D.18219>:
          if (__result == 0) goto <D.18221>; else goto <D.18222>;
          <D.18221>:
          D.18223 = &MEM[(void *)"Delegate" + 2B];
          D.18224 = *D.18223;
          D.18225 = (int) D.18224;
          D.18226 = __s2 + 2;
          D.18227 = *D.18226;
          D.18228 = (int) D.18227;
          __result = D.18225 - D.18228;
          if (__s2_len > 2) goto <D.18229>; else goto <D.18230>;
          <D.18229>:
          if (__result == 0) goto <D.18231>; else goto <D.18232>;
          <D.18231>:
          D.18233 = &MEM[(void *)"Delegate" + 3B];
          D.18234 = *D.18233;
          D.18235 = (int) D.18234;
          D.18236 = __s2 + 3;
          D.18237 = *D.18236;
          D.18238 = (int) D.18237;
          __result = D.18235 - D.18238;
          <D.18232>:
          <D.18230>:
          <D.18222>:
          <D.18220>:
          <D.18212>:
          <D.18210>:
        }
        D.17249 = __result;
      }
      iftmp.21 = -D.17249;
      goto <D.18239>;
      <D.18203>:
      iftmp.21 = __builtin_strcmp (kname, "Delegate");
      <D.18239>:
      D.17250 = iftmp.21;
    }
    if (D.17250 == 0) goto <D.18198>; else goto <D.18197>;
    <D.18197>:
    D.18028 = *kname;
    if (D.18028 == 77) goto <D.18240>; else goto <D.18199>;
    <D.18240>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 17;
      if (__s2_len <= 3) goto <D.18242>; else goto <D.18243>;
      <D.18242>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18244 = "MulticastDelegate";
        D.18245 = MEM[(const unsigned char *)D.18244];
        D.18246 = (int) D.18245;
        D.18247 = *__s2;
        D.18248 = (int) D.18247;
        __result = D.18246 - D.18248;
        {
          if (__s2_len != 0) goto <D.18249>; else goto <D.18250>;
          <D.18249>:
          if (__result == 0) goto <D.18251>; else goto <D.18252>;
          <D.18251>:
          D.18253 = &MEM[(void *)"MulticastDelegate" + 1B];
          D.18254 = *D.18253;
          D.18255 = (int) D.18254;
          D.18256 = __s2 + 1;
          D.18257 = *D.18256;
          D.18258 = (int) D.18257;
          __result = D.18255 - D.18258;
          if (__s2_len > 1) goto <D.18259>; else goto <D.18260>;
          <D.18259>:
          if (__result == 0) goto <D.18261>; else goto <D.18262>;
          <D.18261>:
          D.18263 = &MEM[(void *)"MulticastDelegate" + 2B];
          D.18264 = *D.18263;
          D.18265 = (int) D.18264;
          D.18266 = __s2 + 2;
          D.18267 = *D.18266;
          D.18268 = (int) D.18267;
          __result = D.18265 - D.18268;
          if (__s2_len > 2) goto <D.18269>; else goto <D.18270>;
          <D.18269>:
          if (__result == 0) goto <D.18271>; else goto <D.18272>;
          <D.18271>:
          D.18273 = &MEM[(void *)"MulticastDelegate" + 3B];
          D.18274 = *D.18273;
          D.18275 = (int) D.18274;
          D.18276 = __s2 + 3;
          D.18277 = *D.18276;
          D.18278 = (int) D.18277;
          __result = D.18275 - D.18278;
          <D.18272>:
          <D.18270>:
          <D.18262>:
          <D.18260>:
          <D.18252>:
          <D.18250>:
        }
        D.17258 = __result;
      }
      iftmp.22 = -D.17258;
      goto <D.18279>;
      <D.18243>:
      iftmp.22 = __builtin_strcmp (kname, "MulticastDelegate");
      <D.18279>:
      D.17259 = iftmp.22;
    }
    if (D.17259 == 0) goto <D.18198>; else goto <D.18199>;
    <D.18198>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 13;
      if (__s2_len <= 3) goto <D.18281>; else goto <D.18282>;
      <D.18281>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = m->name;
        D.18283 = "DynamicInvoke";
        D.18284 = MEM[(const unsigned char *)D.18283];
        D.18285 = (int) D.18284;
        D.18286 = *__s2;
        D.18287 = (int) D.18286;
        __result = D.18285 - D.18287;
        {
          if (__s2_len != 0) goto <D.18288>; else goto <D.18289>;
          <D.18288>:
          if (__result == 0) goto <D.18290>; else goto <D.18291>;
          <D.18290>:
          D.18292 = &MEM[(void *)"DynamicInvoke" + 1B];
          D.18293 = *D.18292;
          D.18294 = (int) D.18293;
          D.18295 = __s2 + 1;
          D.18296 = *D.18295;
          D.18297 = (int) D.18296;
          __result = D.18294 - D.18297;
          if (__s2_len > 1) goto <D.18298>; else goto <D.18299>;
          <D.18298>:
          if (__result == 0) goto <D.18300>; else goto <D.18301>;
          <D.18300>:
          D.18302 = &MEM[(void *)"DynamicInvoke" + 2B];
          D.18303 = *D.18302;
          D.18304 = (int) D.18303;
          D.18305 = __s2 + 2;
          D.18306 = *D.18305;
          D.18307 = (int) D.18306;
          __result = D.18304 - D.18307;
          if (__s2_len > 2) goto <D.18308>; else goto <D.18309>;
          <D.18308>:
          if (__result == 0) goto <D.18310>; else goto <D.18311>;
          <D.18310>:
          D.18312 = &MEM[(void *)"DynamicInvoke" + 3B];
          D.18313 = *D.18312;
          D.18314 = (int) D.18313;
          D.18315 = __s2 + 3;
          D.18316 = *D.18315;
          D.18317 = (int) D.18316;
          __result = D.18314 - D.18317;
          <D.18311>:
          <D.18309>:
          <D.18301>:
          <D.18299>:
          <D.18291>:
          <D.18289>:
        }
        D.17267 = __result;
      }
      iftmp.23 = -D.17267;
      goto <D.18318>;
      <D.18282>:
      D.18194 = m->name;
      iftmp.23 = __builtin_strcmp (D.18194, "DynamicInvoke");
      <D.18318>:
      D.17268 = iftmp.23;
    }
    if (D.17268 != 0) goto <D.18319>; else goto <D.18320>;
    <D.18319>:
    D.17891 = 0;
    return D.17891;
    <D.18320>:
    <D.18199>:
  }
  <D.18027>:
  D.18321 = *dest;
  if (D.18321 == m) goto <D.18322>; else goto <D.18323>;
  <D.18322>:
  *dest = 0B;
  D.17891 = 0;
  return D.17891;
  <D.18323>:
  *dest = m;
  D.17891 = 1;
  return D.17891;
}


check_field_access (struct MonoMethod * caller, struct MonoClassField * field)
{
  int D.18327;
  gboolean D.18330;
  struct MonoClass * iftmp.24;
  unsigned int D.18332;
  unsigned int D.18333;

  if (caller != 0B) goto <D.18325>; else goto <D.18326>;
  <D.18325>:
  {
    struct MonoError error;
    struct MonoClass * klass;

    try
      {
        mono_field_get_type_checked (field, &error);
        D.18327 = mono_error_ok (&error);
        if (D.18327 == 0) goto <D.18328>; else goto <D.18329>;
        <D.18328>:
        mono_error_cleanup (&error);
        D.18330 = 0;
        return D.18330;
        <D.18329>:
        D.18332 = mono_field_get_flags (field);
        D.18333 = D.18332 & 16;
        if (D.18333 == 0) goto <D.18334>; else goto <D.18335>;
        <D.18334>:
        iftmp.24 = mono_field_get_parent (field);
        goto <D.18336>;
        <D.18335>:
        iftmp.24 = 0B;
        <D.18336>:
        klass = iftmp.24;
        D.18330 = mono_method_can_access_field_full (caller, field, klass);
        return D.18330;
      }
    finally
      {
        error = {CLOBBER};
      }
  }
  <D.18326>:
  D.18330 = 0;
  return D.18330;
}


get_field_access_exception (const char * format, struct MonoMethod * caller, struct MonoClassField * field)
{
  struct MonoException * D.18339;
  struct MonoException * ex;
  char * caller_name;
  char * field_name;
  char * message;

  caller_name = get_method_full_name (caller);
  field_name = mono_field_full_name (field);
  message = monoeg_g_strdup_printf (format, caller_name, field_name);
  monoeg_g_free (field_name);
  monoeg_g_free (caller_name);
  mono_trace (16, 64, message);
  ex = mono_get_exception_field_access_msg (message);
  monoeg_g_free (message);
  D.18339 = ex;
  return D.18339;
}


mono_security_core_clr_ensure_reflection_access_method (struct MonoMethod * method)
{
  <unnamed type> D.18341;
  <unnamed type> D.18344;
  unsigned int D.18345;
  struct MonoClass * D.18348;
  struct MonoImage * D.18349;
  int D.18350;
  <unnamed type> D.18353;
  struct MonoException * D.18356;
  int D.18357;
  struct MonoException * D.18360;
  struct MonoMethod * caller;

  caller = get_reflection_caller ();
  D.18341 = mono_security_core_clr_method_level (caller, 1);
  if (D.18341 != 0) goto <D.18342>; else goto <D.18343>;
  <D.18342>:
  return;
  <D.18343>:
  D.18344 = mono_security_core_clr_get_options ();
  D.18345 = D.18344 & 1;
  if (D.18345 != 0) goto <D.18346>; else goto <D.18347>;
  <D.18346>:
  D.18348 = method->klass;
  D.18349 = D.18348->image;
  D.18350 = mono_security_core_clr_is_platform_image (D.18349);
  if (D.18350 == 0) goto <D.18351>; else goto <D.18352>;
  <D.18351>:
  return;
  <D.18352>:
  <D.18347>:
  D.18353 = mono_security_core_clr_method_level (method, 1);
  if (D.18353 == 2) goto <D.18354>; else goto <D.18355>;
  <D.18354>:
  D.18356 = get_method_access_exception ("Transparent method %s cannot invoke Critical method %s.", caller, method);
  mono_raise_exception (D.18356);
  <D.18355>:
  D.18357 = check_method_access (caller, method);
  if (D.18357 == 0) goto <D.18358>; else goto <D.18359>;
  <D.18358>:
  D.18360 = get_method_access_exception ("Transparent method %s cannot invoke private/internal method %s.", caller, method);
  mono_raise_exception (D.18360);
  <D.18359>:
}


check_method_access (struct MonoMethod * caller, struct MonoMethod * callee)
{
  struct MonoClass * iftmp.25;
  short unsigned int D.18365;
  int D.18366;
  int D.18367;
  gboolean D.18371;

  if (caller != 0B) goto <D.18362>; else goto <D.18363>;
  <D.18362>:
  {
    struct MonoClass * klass;

    D.18365 = callee->flags;
    D.18366 = (int) D.18365;
    D.18367 = D.18366 & 16;
    if (D.18367 == 0) goto <D.18368>; else goto <D.18369>;
    <D.18368>:
    iftmp.25 = callee->klass;
    goto <D.18370>;
    <D.18369>:
    iftmp.25 = 0B;
    <D.18370>:
    klass = iftmp.25;
    D.18371 = mono_method_can_access_method_full (caller, callee, klass);
    return D.18371;
  }
  <D.18363>:
  D.18371 = 0;
  return D.18371;
}


get_method_access_exception (const char * format, struct MonoMethod * caller, struct MonoMethod * callee)
{
  struct MonoException * D.18373;
  struct MonoException * ex;
  char * caller_name;
  char * callee_name;
  char * message;

  caller_name = get_method_full_name (caller);
  callee_name = get_method_full_name (callee);
  message = monoeg_g_strdup_printf (format, caller_name, callee_name);
  monoeg_g_free (callee_name);
  monoeg_g_free (caller_name);
  mono_trace (16, 64, message);
  ex = mono_get_exception_method_access_msg (message);
  monoeg_g_free (message);
  D.18373 = ex;
  return D.18373;
}


mono_security_core_clr_ensure_delegate_creation (struct MonoMethod * method, gboolean throwOnBindFailure)
{
  int D.18375;
  gboolean D.18378;
  <unnamed type> D.18379;
  <unnamed type> D.18382;
  struct MonoException * D.18387;
  <unnamed type> D.18388;
  unsigned int D.18389;
  struct MonoClass * D.18392;
  struct MonoImage * D.18393;
  int D.18394;
  int D.18397;
  struct MonoException * D.18400;
  struct MonoMethod * caller;

  D.18375 = can_avoid_corlib_reflection_delegate_optimization (method);
  if (D.18375 != 0) goto <D.18376>; else goto <D.18377>;
  <D.18376>:
  D.18378 = 1;
  return D.18378;
  <D.18377>:
  caller = get_reflection_caller ();
  D.18379 = mono_security_core_clr_method_level (caller, 1);
  if (D.18379 != 0) goto <D.18380>; else goto <D.18381>;
  <D.18380>:
  D.18378 = 1;
  return D.18378;
  <D.18381>:
  D.18382 = mono_security_core_clr_method_level (method, 1);
  if (D.18382 == 2) goto <D.18383>; else goto <D.18384>;
  <D.18383>:
  if (throwOnBindFailure == 0) goto <D.18385>; else goto <D.18386>;
  <D.18385>:
  D.18378 = 0;
  return D.18378;
  <D.18386>:
  D.18387 = get_argument_exception ("Transparent method %s cannot create a delegate on Critical method %s.", caller, method);
  mono_raise_exception (D.18387);
  <D.18384>:
  D.18388 = mono_security_core_clr_get_options ();
  D.18389 = D.18388 & 2;
  if (D.18389 != 0) goto <D.18390>; else goto <D.18391>;
  <D.18390>:
  D.18392 = method->klass;
  D.18393 = D.18392->image;
  D.18394 = mono_security_core_clr_is_platform_image (D.18393);
  if (D.18394 == 0) goto <D.18395>; else goto <D.18396>;
  <D.18395>:
  D.18378 = 1;
  return D.18378;
  <D.18396>:
  <D.18391>:
  D.18397 = check_method_access (caller, method);
  if (D.18397 == 0) goto <D.18398>; else goto <D.18399>;
  <D.18398>:
  D.18400 = get_method_access_exception ("Transparent method %s cannot create a delegate on private/internal method %s.", caller, method);
  mono_raise_exception (D.18400);
  <D.18399>:
  D.18378 = 1;
  return D.18378;
}


can_avoid_corlib_reflection_delegate_optimization (struct MonoMethod * method)
{
  struct MonoClass * D.18402;
  struct MonoImage * D.18403;
  int D.18404;
  gboolean D.18407;
  int D.17386;
  int iftmp.26;
  int D.17385;
  const char[18] * D.18411;
  unsigned char D.18412;
  int D.18413;
  unsigned char D.18414;
  int D.18415;
  const unsigned char * D.18420;
  unsigned char D.18421;
  int D.18422;
  const unsigned char * D.18423;
  unsigned char D.18424;
  int D.18425;
  const unsigned char * D.18430;
  unsigned char D.18431;
  int D.18432;
  const unsigned char * D.18433;
  unsigned char D.18434;
  int D.18435;
  const unsigned char * D.18440;
  unsigned char D.18441;
  int D.18442;
  const unsigned char * D.18443;
  unsigned char D.18444;
  int D.18445;
  const char * D.18447;
  int D.17395;
  int iftmp.27;
  int D.17394;
  const char[13] * D.18453;
  unsigned char D.18454;
  int D.18455;
  unsigned char D.18456;
  int D.18457;
  const unsigned char * D.18462;
  unsigned char D.18463;
  int D.18464;
  const unsigned char * D.18465;
  unsigned char D.18466;
  int D.18467;
  const unsigned char * D.18472;
  unsigned char D.18473;
  int D.18474;
  const unsigned char * D.18475;
  unsigned char D.18476;
  int D.18477;
  const unsigned char * D.18482;
  unsigned char D.18483;
  int D.18484;
  const unsigned char * D.18485;
  unsigned char D.18486;
  int D.18487;
  const char * D.18489;
  int D.17404;
  int iftmp.28;
  int D.17403;
  const char[19] * D.18497;
  unsigned char D.18498;
  int D.18499;
  unsigned char D.18500;
  int D.18501;
  const unsigned char * D.18506;
  unsigned char D.18507;
  int D.18508;
  const unsigned char * D.18509;
  unsigned char D.18510;
  int D.18511;
  const unsigned char * D.18516;
  unsigned char D.18517;
  int D.18518;
  const unsigned char * D.18519;
  unsigned char D.18520;
  int D.18521;
  const unsigned char * D.18526;
  unsigned char D.18527;
  int D.18528;
  const unsigned char * D.18529;
  unsigned char D.18530;
  int D.18531;
  const char * D.18533;
  int D.17413;
  int iftmp.29;
  int D.17412;
  const char[25] * D.18538;
  unsigned char D.18539;
  int D.18540;
  unsigned char D.18541;
  int D.18542;
  const unsigned char * D.18547;
  unsigned char D.18548;
  int D.18549;
  const unsigned char * D.18550;
  unsigned char D.18551;
  int D.18552;
  const unsigned char * D.18557;
  unsigned char D.18558;
  int D.18559;
  const unsigned char * D.18560;
  unsigned char D.18561;
  int D.18562;
  const unsigned char * D.18567;
  unsigned char D.18568;
  int D.18569;
  const unsigned char * D.18570;
  unsigned char D.18571;
  int D.18572;
  int D.17422;
  int iftmp.30;
  int D.17421;
  const char[10] * D.18578;
  unsigned char D.18579;
  int D.18580;
  unsigned char D.18581;
  int D.18582;
  const unsigned char * D.18587;
  unsigned char D.18588;
  int D.18589;
  const unsigned char * D.18590;
  unsigned char D.18591;
  int D.18592;
  const unsigned char * D.18597;
  unsigned char D.18598;
  int D.18599;
  const unsigned char * D.18600;
  unsigned char D.18601;
  int D.18602;
  const unsigned char * D.18607;
  unsigned char D.18608;
  int D.18609;
  const unsigned char * D.18610;
  unsigned char D.18611;
  int D.18612;
  int D.17431;
  int iftmp.31;
  int D.17430;
  const char[14] * D.18621;
  unsigned char D.18622;
  int D.18623;
  unsigned char D.18624;
  int D.18625;
  const unsigned char * D.18630;
  unsigned char D.18631;
  int D.18632;
  const unsigned char * D.18633;
  unsigned char D.18634;
  int D.18635;
  const unsigned char * D.18640;
  unsigned char D.18641;
  int D.18642;
  const unsigned char * D.18643;
  unsigned char D.18644;
  int D.18645;
  const unsigned char * D.18650;
  unsigned char D.18651;
  int D.18652;
  const unsigned char * D.18653;
  unsigned char D.18654;
  int D.18655;
  int D.17440;
  int iftmp.32;
  int D.17439;
  const char[27] * D.18661;
  unsigned char D.18662;
  int D.18663;
  unsigned char D.18664;
  int D.18665;
  const unsigned char * D.18670;
  unsigned char D.18671;
  int D.18672;
  const unsigned char * D.18673;
  unsigned char D.18674;
  int D.18675;
  const unsigned char * D.18680;
  unsigned char D.18681;
  int D.18682;
  const unsigned char * D.18683;
  unsigned char D.18684;
  int D.18685;
  const unsigned char * D.18690;
  unsigned char D.18691;
  int D.18692;
  const unsigned char * D.18693;
  unsigned char D.18694;
  int D.18695;

  D.18402 = method->klass;
  D.18403 = D.18402->image;
  D.18404 = mono_security_core_clr_is_platform_image (D.18403);
  if (D.18404 == 0) goto <D.18405>; else goto <D.18406>;
  <D.18405>:
  D.18407 = 0;
  return D.18407;
  <D.18406>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 17;
    if (__s2_len <= 3) goto <D.18409>; else goto <D.18410>;
    <D.18409>:
    {
      const unsigned char * __s2;
      int __result;

      D.18402 = method->klass;
      __s2 = D.18402->name_space;
      D.18411 = "System.Reflection";
      D.18412 = MEM[(const unsigned char *)D.18411];
      D.18413 = (int) D.18412;
      D.18414 = *__s2;
      D.18415 = (int) D.18414;
      __result = D.18413 - D.18415;
      {
        if (__s2_len != 0) goto <D.18416>; else goto <D.18417>;
        <D.18416>:
        if (__result == 0) goto <D.18418>; else goto <D.18419>;
        <D.18418>:
        D.18420 = &MEM[(void *)"System.Reflection" + 1B];
        D.18421 = *D.18420;
        D.18422 = (int) D.18421;
        D.18423 = __s2 + 1;
        D.18424 = *D.18423;
        D.18425 = (int) D.18424;
        __result = D.18422 - D.18425;
        if (__s2_len > 1) goto <D.18426>; else goto <D.18427>;
        <D.18426>:
        if (__result == 0) goto <D.18428>; else goto <D.18429>;
        <D.18428>:
        D.18430 = &MEM[(void *)"System.Reflection" + 2B];
        D.18431 = *D.18430;
        D.18432 = (int) D.18431;
        D.18433 = __s2 + 2;
        D.18434 = *D.18433;
        D.18435 = (int) D.18434;
        __result = D.18432 - D.18435;
        if (__s2_len > 2) goto <D.18436>; else goto <D.18437>;
        <D.18436>:
        if (__result == 0) goto <D.18438>; else goto <D.18439>;
        <D.18438>:
        D.18440 = &MEM[(void *)"System.Reflection" + 3B];
        D.18441 = *D.18440;
        D.18442 = (int) D.18441;
        D.18443 = __s2 + 3;
        D.18444 = *D.18443;
        D.18445 = (int) D.18444;
        __result = D.18442 - D.18445;
        <D.18439>:
        <D.18437>:
        <D.18429>:
        <D.18427>:
        <D.18419>:
        <D.18417>:
      }
      D.17385 = __result;
    }
    iftmp.26 = -D.17385;
    goto <D.18446>;
    <D.18410>:
    D.18402 = method->klass;
    D.18447 = D.18402->name_space;
    iftmp.26 = __builtin_strcmp (D.18447, "System.Reflection");
    <D.18446>:
    D.17386 = iftmp.26;
  }
  if (D.17386 != 0) goto <D.18448>; else goto <D.18449>;
  <D.18448>:
  D.18407 = 0;
  return D.18407;
  <D.18449>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 12;
    if (__s2_len <= 3) goto <D.18451>; else goto <D.18452>;
    <D.18451>:
    {
      const unsigned char * __s2;
      int __result;

      D.18402 = method->klass;
      __s2 = D.18402->name;
      D.18453 = "MonoProperty";
      D.18454 = MEM[(const unsigned char *)D.18453];
      D.18455 = (int) D.18454;
      D.18456 = *__s2;
      D.18457 = (int) D.18456;
      __result = D.18455 - D.18457;
      {
        if (__s2_len != 0) goto <D.18458>; else goto <D.18459>;
        <D.18458>:
        if (__result == 0) goto <D.18460>; else goto <D.18461>;
        <D.18460>:
        D.18462 = &MEM[(void *)"MonoProperty" + 1B];
        D.18463 = *D.18462;
        D.18464 = (int) D.18463;
        D.18465 = __s2 + 1;
        D.18466 = *D.18465;
        D.18467 = (int) D.18466;
        __result = D.18464 - D.18467;
        if (__s2_len > 1) goto <D.18468>; else goto <D.18469>;
        <D.18468>:
        if (__result == 0) goto <D.18470>; else goto <D.18471>;
        <D.18470>:
        D.18472 = &MEM[(void *)"MonoProperty" + 2B];
        D.18473 = *D.18472;
        D.18474 = (int) D.18473;
        D.18475 = __s2 + 2;
        D.18476 = *D.18475;
        D.18477 = (int) D.18476;
        __result = D.18474 - D.18477;
        if (__s2_len > 2) goto <D.18478>; else goto <D.18479>;
        <D.18478>:
        if (__result == 0) goto <D.18480>; else goto <D.18481>;
        <D.18480>:
        D.18482 = &MEM[(void *)"MonoProperty" + 3B];
        D.18483 = *D.18482;
        D.18484 = (int) D.18483;
        D.18485 = __s2 + 3;
        D.18486 = *D.18485;
        D.18487 = (int) D.18486;
        __result = D.18484 - D.18487;
        <D.18481>:
        <D.18479>:
        <D.18471>:
        <D.18469>:
        <D.18461>:
        <D.18459>:
      }
      D.17394 = __result;
    }
    iftmp.27 = -D.17394;
    goto <D.18488>;
    <D.18452>:
    D.18402 = method->klass;
    D.18489 = D.18402->name;
    iftmp.27 = __builtin_strcmp (D.18489, "MonoProperty");
    <D.18488>:
    D.17395 = iftmp.27;
  }
  if (D.17395 == 0) goto <D.18490>; else goto <D.18491>;
  <D.18490>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 18;
    if (__s2_len <= 3) goto <D.18495>; else goto <D.18496>;
    <D.18495>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = method->name;
      D.18497 = "GetterAdapterFrame";
      D.18498 = MEM[(const unsigned char *)D.18497];
      D.18499 = (int) D.18498;
      D.18500 = *__s2;
      D.18501 = (int) D.18500;
      __result = D.18499 - D.18501;
      {
        if (__s2_len != 0) goto <D.18502>; else goto <D.18503>;
        <D.18502>:
        if (__result == 0) goto <D.18504>; else goto <D.18505>;
        <D.18504>:
        D.18506 = &MEM[(void *)"GetterAdapterFrame" + 1B];
        D.18507 = *D.18506;
        D.18508 = (int) D.18507;
        D.18509 = __s2 + 1;
        D.18510 = *D.18509;
        D.18511 = (int) D.18510;
        __result = D.18508 - D.18511;
        if (__s2_len > 1) goto <D.18512>; else goto <D.18513>;
        <D.18512>:
        if (__result == 0) goto <D.18514>; else goto <D.18515>;
        <D.18514>:
        D.18516 = &MEM[(void *)"GetterAdapterFrame" + 2B];
        D.18517 = *D.18516;
        D.18518 = (int) D.18517;
        D.18519 = __s2 + 2;
        D.18520 = *D.18519;
        D.18521 = (int) D.18520;
        __result = D.18518 - D.18521;
        if (__s2_len > 2) goto <D.18522>; else goto <D.18523>;
        <D.18522>:
        if (__result == 0) goto <D.18524>; else goto <D.18525>;
        <D.18524>:
        D.18526 = &MEM[(void *)"GetterAdapterFrame" + 3B];
        D.18527 = *D.18526;
        D.18528 = (int) D.18527;
        D.18529 = __s2 + 3;
        D.18530 = *D.18529;
        D.18531 = (int) D.18530;
        __result = D.18528 - D.18531;
        <D.18525>:
        <D.18523>:
        <D.18515>:
        <D.18513>:
        <D.18505>:
        <D.18503>:
      }
      D.17403 = __result;
    }
    iftmp.28 = -D.17403;
    goto <D.18532>;
    <D.18496>:
    D.18533 = method->name;
    iftmp.28 = __builtin_strcmp (D.18533, "GetterAdapterFrame");
    <D.18532>:
    D.17404 = iftmp.28;
  }
  if (D.17404 == 0) goto <D.18492>; else goto <D.18534>;
  <D.18534>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 24;
    if (__s2_len <= 3) goto <D.18536>; else goto <D.18537>;
    <D.18536>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = method->name;
      D.18538 = "StaticGetterAdapterFrame";
      D.18539 = MEM[(const unsigned char *)D.18538];
      D.18540 = (int) D.18539;
      D.18541 = *__s2;
      D.18542 = (int) D.18541;
      __result = D.18540 - D.18542;
      {
        if (__s2_len != 0) goto <D.18543>; else goto <D.18544>;
        <D.18543>:
        if (__result == 0) goto <D.18545>; else goto <D.18546>;
        <D.18545>:
        D.18547 = &MEM[(void *)"StaticGetterAdapterFrame" + 1B];
        D.18548 = *D.18547;
        D.18549 = (int) D.18548;
        D.18550 = __s2 + 1;
        D.18551 = *D.18550;
        D.18552 = (int) D.18551;
        __result = D.18549 - D.18552;
        if (__s2_len > 1) goto <D.18553>; else goto <D.18554>;
        <D.18553>:
        if (__result == 0) goto <D.18555>; else goto <D.18556>;
        <D.18555>:
        D.18557 = &MEM[(void *)"StaticGetterAdapterFrame" + 2B];
        D.18558 = *D.18557;
        D.18559 = (int) D.18558;
        D.18560 = __s2 + 2;
        D.18561 = *D.18560;
        D.18562 = (int) D.18561;
        __result = D.18559 - D.18562;
        if (__s2_len > 2) goto <D.18563>; else goto <D.18564>;
        <D.18563>:
        if (__result == 0) goto <D.18565>; else goto <D.18566>;
        <D.18565>:
        D.18567 = &MEM[(void *)"StaticGetterAdapterFrame" + 3B];
        D.18568 = *D.18567;
        D.18569 = (int) D.18568;
        D.18570 = __s2 + 3;
        D.18571 = *D.18570;
        D.18572 = (int) D.18571;
        __result = D.18569 - D.18572;
        <D.18566>:
        <D.18564>:
        <D.18556>:
        <D.18554>:
        <D.18546>:
        <D.18544>:
      }
      D.17412 = __result;
    }
    iftmp.29 = -D.17412;
    goto <D.18573>;
    <D.18537>:
    D.18533 = method->name;
    iftmp.29 = __builtin_strcmp (D.18533, "StaticGetterAdapterFrame");
    <D.18573>:
    D.17413 = iftmp.29;
  }
  if (D.17413 == 0) goto <D.18492>; else goto <D.18493>;
  <D.18492>:
  D.18407 = 1;
  return D.18407;
  <D.18493>:
  goto <D.18574>;
  <D.18491>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 9;
    if (__s2_len <= 3) goto <D.18576>; else goto <D.18577>;
    <D.18576>:
    {
      const unsigned char * __s2;
      int __result;

      D.18402 = method->klass;
      __s2 = D.18402->name;
      D.18578 = "EventInfo";
      D.18579 = MEM[(const unsigned char *)D.18578];
      D.18580 = (int) D.18579;
      D.18581 = *__s2;
      D.18582 = (int) D.18581;
      __result = D.18580 - D.18582;
      {
        if (__s2_len != 0) goto <D.18583>; else goto <D.18584>;
        <D.18583>:
        if (__result == 0) goto <D.18585>; else goto <D.18586>;
        <D.18585>:
        D.18587 = &MEM[(void *)"EventInfo" + 1B];
        D.18588 = *D.18587;
        D.18589 = (int) D.18588;
        D.18590 = __s2 + 1;
        D.18591 = *D.18590;
        D.18592 = (int) D.18591;
        __result = D.18589 - D.18592;
        if (__s2_len > 1) goto <D.18593>; else goto <D.18594>;
        <D.18593>:
        if (__result == 0) goto <D.18595>; else goto <D.18596>;
        <D.18595>:
        D.18597 = &MEM[(void *)"EventInfo" + 2B];
        D.18598 = *D.18597;
        D.18599 = (int) D.18598;
        D.18600 = __s2 + 2;
        D.18601 = *D.18600;
        D.18602 = (int) D.18601;
        __result = D.18599 - D.18602;
        if (__s2_len > 2) goto <D.18603>; else goto <D.18604>;
        <D.18603>:
        if (__result == 0) goto <D.18605>; else goto <D.18606>;
        <D.18605>:
        D.18607 = &MEM[(void *)"EventInfo" + 3B];
        D.18608 = *D.18607;
        D.18609 = (int) D.18608;
        D.18610 = __s2 + 3;
        D.18611 = *D.18610;
        D.18612 = (int) D.18611;
        __result = D.18609 - D.18612;
        <D.18606>:
        <D.18604>:
        <D.18596>:
        <D.18594>:
        <D.18586>:
        <D.18584>:
      }
      D.17421 = __result;
    }
    iftmp.30 = -D.17421;
    goto <D.18613>;
    <D.18577>:
    D.18402 = method->klass;
    D.18489 = D.18402->name;
    iftmp.30 = __builtin_strcmp (D.18489, "EventInfo");
    <D.18613>:
    D.17422 = iftmp.30;
  }
  if (D.17422 == 0) goto <D.18614>; else goto <D.18615>;
  <D.18614>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 13;
    if (__s2_len <= 3) goto <D.18619>; else goto <D.18620>;
    <D.18619>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = method->name;
      D.18621 = "AddEventFrame";
      D.18622 = MEM[(const unsigned char *)D.18621];
      D.18623 = (int) D.18622;
      D.18624 = *__s2;
      D.18625 = (int) D.18624;
      __result = D.18623 - D.18625;
      {
        if (__s2_len != 0) goto <D.18626>; else goto <D.18627>;
        <D.18626>:
        if (__result == 0) goto <D.18628>; else goto <D.18629>;
        <D.18628>:
        D.18630 = &MEM[(void *)"AddEventFrame" + 1B];
        D.18631 = *D.18630;
        D.18632 = (int) D.18631;
        D.18633 = __s2 + 1;
        D.18634 = *D.18633;
        D.18635 = (int) D.18634;
        __result = D.18632 - D.18635;
        if (__s2_len > 1) goto <D.18636>; else goto <D.18637>;
        <D.18636>:
        if (__result == 0) goto <D.18638>; else goto <D.18639>;
        <D.18638>:
        D.18640 = &MEM[(void *)"AddEventFrame" + 2B];
        D.18641 = *D.18640;
        D.18642 = (int) D.18641;
        D.18643 = __s2 + 2;
        D.18644 = *D.18643;
        D.18645 = (int) D.18644;
        __result = D.18642 - D.18645;
        if (__s2_len > 2) goto <D.18646>; else goto <D.18647>;
        <D.18646>:
        if (__result == 0) goto <D.18648>; else goto <D.18649>;
        <D.18648>:
        D.18650 = &MEM[(void *)"AddEventFrame" + 3B];
        D.18651 = *D.18650;
        D.18652 = (int) D.18651;
        D.18653 = __s2 + 3;
        D.18654 = *D.18653;
        D.18655 = (int) D.18654;
        __result = D.18652 - D.18655;
        <D.18649>:
        <D.18647>:
        <D.18639>:
        <D.18637>:
        <D.18629>:
        <D.18627>:
      }
      D.17430 = __result;
    }
    iftmp.31 = -D.17430;
    goto <D.18656>;
    <D.18620>:
    D.18533 = method->name;
    iftmp.31 = __builtin_strcmp (D.18533, "AddEventFrame");
    <D.18656>:
    D.17431 = iftmp.31;
  }
  if (D.17431 == 0) goto <D.18616>; else goto <D.18657>;
  <D.18657>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 26;
    if (__s2_len <= 3) goto <D.18659>; else goto <D.18660>;
    <D.18659>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = method->name;
      D.18661 = "StaticAddEventAdapterFrame";
      D.18662 = MEM[(const unsigned char *)D.18661];
      D.18663 = (int) D.18662;
      D.18664 = *__s2;
      D.18665 = (int) D.18664;
      __result = D.18663 - D.18665;
      {
        if (__s2_len != 0) goto <D.18666>; else goto <D.18667>;
        <D.18666>:
        if (__result == 0) goto <D.18668>; else goto <D.18669>;
        <D.18668>:
        D.18670 = &MEM[(void *)"StaticAddEventAdapterFrame" + 1B];
        D.18671 = *D.18670;
        D.18672 = (int) D.18671;
        D.18673 = __s2 + 1;
        D.18674 = *D.18673;
        D.18675 = (int) D.18674;
        __result = D.18672 - D.18675;
        if (__s2_len > 1) goto <D.18676>; else goto <D.18677>;
        <D.18676>:
        if (__result == 0) goto <D.18678>; else goto <D.18679>;
        <D.18678>:
        D.18680 = &MEM[(void *)"StaticAddEventAdapterFrame" + 2B];
        D.18681 = *D.18680;
        D.18682 = (int) D.18681;
        D.18683 = __s2 + 2;
        D.18684 = *D.18683;
        D.18685 = (int) D.18684;
        __result = D.18682 - D.18685;
        if (__s2_len > 2) goto <D.18686>; else goto <D.18687>;
        <D.18686>:
        if (__result == 0) goto <D.18688>; else goto <D.18689>;
        <D.18688>:
        D.18690 = &MEM[(void *)"StaticAddEventAdapterFrame" + 3B];
        D.18691 = *D.18690;
        D.18692 = (int) D.18691;
        D.18693 = __s2 + 3;
        D.18694 = *D.18693;
        D.18695 = (int) D.18694;
        __result = D.18692 - D.18695;
        <D.18689>:
        <D.18687>:
        <D.18679>:
        <D.18677>:
        <D.18669>:
        <D.18667>:
      }
      D.17439 = __result;
    }
    iftmp.32 = -D.17439;
    goto <D.18696>;
    <D.18660>:
    D.18533 = method->name;
    iftmp.32 = __builtin_strcmp (D.18533, "StaticAddEventAdapterFrame");
    <D.18696>:
    D.17440 = iftmp.32;
  }
  if (D.17440 == 0) goto <D.18616>; else goto <D.18617>;
  <D.18616>:
  D.18407 = 1;
  return D.18407;
  <D.18617>:
  <D.18615>:
  <D.18574>:
  D.18407 = 0;
  return D.18407;
}


get_argument_exception (const char * format, struct MonoMethod * caller, struct MonoMethod * callee)
{
  struct MonoException * D.18698;
  struct MonoException * ex;
  char * caller_name;
  char * callee_name;
  char * message;

  caller_name = get_method_full_name (caller);
  callee_name = get_method_full_name (callee);
  message = monoeg_g_strdup_printf (format, caller_name, callee_name);
  monoeg_g_free (callee_name);
  monoeg_g_free (caller_name);
  mono_trace (16, 64, message);
  ex = mono_get_exception_argument ("method", message);
  monoeg_g_free (message);
  D.18698 = ex;
  return D.18698;
}


mono_security_core_clr_ensure_dynamic_method_resolved_object (void * ref, struct MonoClass * handle_class)
{
  struct MonoClass * D.18700;
  struct MonoImage * D.18703;
  int D.18704;
  int D.18707;
  struct MonoException * D.18710;
  struct MonoClass * D.18712;
  struct MonoClass * D.18715;
  struct MonoImage * D.18716;
  int D.18717;
  int D.18720;

  D.18700 = mono_defaults.fieldhandle_class;
  if (D.18700 == handle_class) goto <D.18701>; else goto <D.18702>;
  <D.18701>:
  {
    struct MonoClassField * field;
    struct MonoClass * klass;

    field = ref;
    klass = mono_field_get_parent (field);
    D.18703 = klass->image;
    D.18704 = mono_security_core_clr_is_platform_image (D.18703);
    if (D.18704 != 0) goto <D.18705>; else goto <D.18706>;
    <D.18705>:
    {
      struct MonoMethod * caller;

      caller = get_reflection_caller ();
      D.18707 = check_field_access (caller, field);
      if (D.18707 == 0) goto <D.18708>; else goto <D.18709>;
      <D.18708>:
      D.18710 = get_field_access_exception ("Dynamic method %s cannot create access private/internal field %s.", caller, field);
      return D.18710;
      <D.18709>:
    }
    <D.18706>:
  }
  goto <D.18711>;
  <D.18702>:
  D.18712 = mono_defaults.methodhandle_class;
  if (D.18712 == handle_class) goto <D.18713>; else goto <D.18714>;
  <D.18713>:
  {
    struct MonoMethod * method;

    method = ref;
    D.18715 = method->klass;
    D.18716 = D.18715->image;
    D.18717 = mono_security_core_clr_is_platform_image (D.18716);
    if (D.18717 != 0) goto <D.18718>; else goto <D.18719>;
    <D.18718>:
    {
      struct MonoMethod * caller;

      caller = get_reflection_caller ();
      D.18720 = check_method_access (caller, method);
      if (D.18720 == 0) goto <D.18721>; else goto <D.18722>;
      <D.18721>:
      D.18710 = get_method_access_exception ("Dynamic method %s cannot create access private/internal method %s.", caller, method);
      return D.18710;
      <D.18722>:
    }
    <D.18719>:
  }
  <D.18714>:
  <D.18711>:
  D.18710 = 0B;
  return D.18710;
}


mono_security_core_clr_can_access_internals (struct MonoImage * accessing, struct MonoImage * accessed)
{
  int D.18724;
  gboolean D.18727;
  int D.18728;
  struct MonoAssembly * D.18733;
  char * D.18734;
  struct MonoAssembly * D.18736;
  char * D.18737;
  int D.17467;
  _Bool D.18738;

  D.18724 = mono_security_core_clr_is_platform_image (accessed);
  if (D.18724 == 0) goto <D.18725>; else goto <D.18726>;
  <D.18725>:
  D.18727 = 1;
  return D.18727;
  <D.18726>:
  D.18728 = mono_security_core_clr_is_platform_image (accessing);
  if (D.18728 != 0) goto <D.18729>; else goto <D.18730>;
  <D.18729>:
  D.18727 = 1;
  return D.18727;
  <D.18730>:
  D.18733 = accessed->assembly;
  D.18734 = D.18733->basedir;
  if (D.18734 == 0B) goto <D.18731>; else goto <D.18735>;
  <D.18735>:
  D.18736 = accessing->assembly;
  D.18737 = D.18736->basedir;
  if (D.18737 == 0B) goto <D.18731>; else goto <D.18732>;
  <D.18731>:
  D.18727 = 0;
  return D.18727;
  <D.18732>:
  {
    size_t __s1_len;
    size_t __s2_len;

    D.18733 = accessed->assembly;
    D.18734 = D.18733->basedir;
    D.18736 = accessing->assembly;
    D.18737 = D.18736->basedir;
    D.17467 = __builtin_strcmp (D.18734, D.18737);
  }
  D.18738 = D.17467 == 0;
  D.18727 = (gboolean) D.18738;
  return D.18727;
}


mono_security_core_clr_is_field_access_allowed (struct MonoMethod * caller, struct MonoClassField * field)
{
  struct MonoClass * D.18740;
  <unnamed type> D.18741;
  struct MonoException * D.18744;
  <unnamed type> D.18748;

  D.18740 = mono_field_get_parent (field);
  D.18741 = mono_security_core_clr_class_level (D.18740);
  if (D.18741 != 2) goto <D.18742>; else goto <D.18743>;
  <D.18742>:
  D.18744 = 0B;
  return D.18744;
  <D.18743>:
  if (caller == 0B) goto <D.18745>; else goto <D.18747>;
  <D.18747>:
  D.18748 = mono_security_core_clr_method_level (caller, 1);
  if (D.18748 != 0) goto <D.18745>; else goto <D.18746>;
  <D.18745>:
  D.18744 = 0B;
  return D.18744;
  <D.18746>:
  D.18744 = get_field_access_exception ("Transparent method %s cannot call use Critical field %s.", caller, field);
  return D.18744;
}


mono_security_core_clr_is_call_allowed (struct MonoMethod * caller, struct MonoMethod * callee)
{
  <unnamed type> D.18750;
  struct MonoException * D.18753;
  <unnamed type> D.18757;

  D.18750 = mono_security_core_clr_method_level (callee, 1);
  if (D.18750 != 2) goto <D.18751>; else goto <D.18752>;
  <D.18751>:
  D.18753 = 0B;
  return D.18753;
  <D.18752>:
  if (caller == 0B) goto <D.18754>; else goto <D.18756>;
  <D.18756>:
  D.18757 = mono_security_core_clr_method_level (caller, 1);
  if (D.18757 != 0) goto <D.18754>; else goto <D.18755>;
  <D.18754>:
  D.18753 = 0B;
  return D.18753;
  <D.18755>:
  D.18753 = get_method_access_exception ("Transparent method %s cannot call Critical method %s.", caller, callee);
  return D.18753;
}


mono_security_core_clr_class_level (struct MonoClass * class)
{
  int mono_security_core_clr_test.33;
  struct MonoImage * D.18762;
  int D.18763;
  MonoSecurityCoreCLRLevel D.18766;

  mono_security_core_clr_test.33 = mono_security_core_clr_test;
  if (mono_security_core_clr_test.33 == 0) goto <D.18760>; else goto <D.18761>;
  <D.18760>:
  D.18762 = class->image;
  D.18763 = mono_security_core_clr_is_platform_image (D.18762);
  if (D.18763 == 0) goto <D.18764>; else goto <D.18765>;
  <D.18764>:
  D.18766 = 0;
  return D.18766;
  <D.18765>:
  <D.18761>:
  D.18766 = mono_security_core_clr_class_level_no_platform_check (class);
  return D.18766;
}


mono_security_core_clr_class_level_no_platform_check (struct MonoClass * class)
{
  struct MonoImage * D.18770;
  struct MonoClass * D.18773;
  MonoSecurityCoreCLRLevel D.18776;
  MonoSecurityCoreCLRLevel level;
  struct MonoCustomAttrInfo * cinfo;

  level = 0;
  cinfo = mono_custom_attrs_from_class (class);
  if (cinfo != 0B) goto <D.18768>; else goto <D.18769>;
  <D.18768>:
  D.18770 = class->image;
  level = mono_security_core_clr_level_from_cinfo (cinfo, D.18770);
  mono_custom_attrs_free (cinfo);
  <D.18769>:
  if (level == 0) goto <D.18771>; else goto <D.18772>;
  <D.18771>:
  D.18773 = class->nested_in;
  if (D.18773 != 0B) goto <D.18774>; else goto <D.18775>;
  <D.18774>:
  D.18773 = class->nested_in;
  level = mono_security_core_clr_class_level_no_platform_check (D.18773);
  <D.18775>:
  <D.18772>:
  D.18776 = level;
  return D.18776;
}


mono_security_core_clr_level_from_cinfo (struct MonoCustomAttrInfo * cinfo, struct MonoImage * image)
{
  struct MonoClass * D.18780;
  int D.18781;
  struct MonoClass * D.18786;
  int D.18787;
  MonoSecurityCoreCLRLevel D.18790;
  int level;

  level = 0;
  if (cinfo != 0B) goto <D.18778>; else goto <D.18779>;
  <D.18778>:
  D.18780 = security_safe_critical_attribute ();
  D.18781 = mono_custom_attrs_has_attr (cinfo, D.18780);
  if (D.18781 != 0) goto <D.18782>; else goto <D.18783>;
  <D.18782>:
  level = 1;
  <D.18783>:
  <D.18779>:
  if (cinfo != 0B) goto <D.18784>; else goto <D.18785>;
  <D.18784>:
  D.18786 = security_critical_attribute ();
  D.18787 = mono_custom_attrs_has_attr (cinfo, D.18786);
  if (D.18787 != 0) goto <D.18788>; else goto <D.18789>;
  <D.18788>:
  level = 2;
  <D.18789>:
  <D.18785>:
  D.18790 = (MonoSecurityCoreCLRLevel) level;
  return D.18790;
}


security_safe_critical_attribute ()
{
  struct MonoClass * class.34;
  struct MonoImage * D.18795;
  struct MonoClass * class.35;
  _Bool D.18797;
  long int D.18798;
  long int D.18799;
  struct MonoClass * D.18802;
  static struct MonoClass * class = 0B;

  class.34 = class;
  if (class.34 == 0B) goto <D.18793>; else goto <D.18794>;
  <D.18793>:
  D.18795 = mono_defaults.corlib;
  class.35 = mono_class_from_name (D.18795, "System.Security", "SecuritySafeCriticalAttribute");
  class = class.35;
  <D.18794>:
  class.34 = class;
  D.18797 = class.34 == 0B;
  D.18798 = (long int) D.18797;
  D.18799 = __builtin_expect (D.18798, 0);
  if (D.18799 != 0) goto <D.18800>; else goto <D.18801>;
  <D.18800>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "security-core-clr.c", 147, "class");
  <D.18801>:
  D.18802 = class;
  return D.18802;
}


security_critical_attribute ()
{
  struct MonoClass * class.36;
  struct MonoImage * D.18807;
  struct MonoClass * class.37;
  _Bool D.18809;
  long int D.18810;
  long int D.18811;
  struct MonoClass * D.18814;
  static struct MonoClass * class = 0B;

  class.36 = class;
  if (class.36 == 0B) goto <D.18805>; else goto <D.18806>;
  <D.18805>:
  D.18807 = mono_defaults.corlib;
  class.37 = mono_class_from_name (D.18807, "System.Security", "SecurityCriticalAttribute");
  class = class.37;
  <D.18806>:
  class.36 = class;
  D.18809 = class.36 == 0B;
  D.18810 = (long int) D.18809;
  D.18811 = __builtin_expect (D.18810, 0);
  if (D.18811 != 0) goto <D.18812>; else goto <D.18813>;
  <D.18812>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "security-core-clr.c", 134, "class");
  <D.18813>:
  D.18814 = class;
  return D.18814;
}


mono_security_core_clr_method_level (struct MonoMethod * method, gboolean with_class_level)
{
  MonoSecurityCoreCLRLevel D.18818;
  int mono_security_core_clr_test.38;
  struct MonoClass * D.18822;
  struct MonoImage * D.18823;
  int D.18824;
  struct MonoCustomAttrInfo * cinfo;
  MonoSecurityCoreCLRLevel level;

  level = 0;
  if (method == 0B) goto <D.18816>; else goto <D.18817>;
  <D.18816>:
  D.18818 = level;
  return D.18818;
  <D.18817>:
  mono_security_core_clr_test.38 = mono_security_core_clr_test;
  if (mono_security_core_clr_test.38 == 0) goto <D.18820>; else goto <D.18821>;
  <D.18820>:
  D.18822 = method->klass;
  D.18823 = D.18822->image;
  D.18824 = mono_security_core_clr_is_platform_image (D.18823);
  if (D.18824 == 0) goto <D.18825>; else goto <D.18826>;
  <D.18825>:
  D.18818 = level;
  return D.18818;
  <D.18826>:
  <D.18821>:
  cinfo = mono_custom_attrs_from_method (method);
  if (cinfo != 0B) goto <D.18827>; else goto <D.18828>;
  <D.18827>:
  D.18822 = method->klass;
  D.18823 = D.18822->image;
  level = mono_security_core_clr_level_from_cinfo (cinfo, D.18823);
  mono_custom_attrs_free (cinfo);
  <D.18828>:
  if (with_class_level != 0) goto <D.18829>; else goto <D.18830>;
  <D.18829>:
  if (level == 0) goto <D.18831>; else goto <D.18832>;
  <D.18831>:
  D.18822 = method->klass;
  level = mono_security_core_clr_class_level (D.18822);
  <D.18832>:
  <D.18830>:
  D.18818 = level;
  return D.18818;
}


mono_security_enable_core_clr ()
{
  mono_verifier_set_mode (2);
  mono_security_set_mode (1);
}


