
/* WARNING: Type propagation algorithm not settling */

uint * read_encoded_value_with_base(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)

{
  undefined8 *puVar1;
  uint *puVar2;
  byte bVar4;
  byte bVar5;
  uint uVar6;
  byte *pbVar7;
  uint *puVar3;
  
  if (param_1 == 0x50) {
    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);
    *param_4 = *puVar1;
    return (uint *)(puVar1 + 1);
  }
  switch(param_1 & 0xf) {
  case 0:
  case 4:
  case 0xc:
    pbVar7 = *(byte **)param_3;
    puVar2 = param_3 + 2;
    break;
  case 1:
    pbVar7 = (byte *)0x0;
    bVar4 = 0;
    puVar3 = param_3;
    do {
      puVar2 = (uint *)((long)puVar3 + 1);
      uVar6 = *puVar3;
      bVar5 = bVar4 & 0x3f;
      bVar4 = bVar4 + 7;
      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);
      puVar3 = puVar2;
    } while ((char)(byte)uVar6 < '\0');
    break;
  case 2:
    pbVar7 = (byte *)(ulong)(ushort)*param_3;
    puVar2 = (uint *)((long)param_3 + 2);
    break;
  case 3:
    pbVar7 = (byte *)(ulong)*param_3;
    puVar2 = param_3 + 1;
    break;
  default:
                    /* WARNING: Subroutine does not return */
    abort();
  case 9:
    pbVar7 = (byte *)0x0;
    uVar6 = 0;
    puVar3 = param_3;
    do {
      puVar2 = (uint *)((long)puVar3 + 1);
      bVar4 = (byte)*puVar3;
      bVar5 = (byte)uVar6;
      uVar6 = uVar6 + 7;
      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));
      puVar3 = puVar2;
    } while ((char)bVar4 < '\0');
    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;
    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));
    goto LAB_0030504c;
  case 10:
    pbVar7 = (byte *)(long)(short)(ushort)*param_3;
    puVar2 = (uint *)((long)param_3 + 2);
    break;
  case 0xb:
    pbVar7 = (byte *)(long)(int)*param_3;
    puVar2 = param_3 + 1;
  }
  if (pbVar7 != (byte *)0x0) {
LAB_0030504c:
    if ((param_1 & 0x70) == 0x10) {
      param_2 = param_3;
    }
    pbVar7 = pbVar7 + (long)param_2;
    if ((char)param_1 < '\0') {
      *param_4 = *(undefined8 *)pbVar7;
      return puVar2;
    }
  }
  *param_4 = pbVar7;
  return puVar2;
}



/* WARNING: Type propagation algorithm not settling */

uint * FUN_00305010(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)

{
  undefined8 *puVar1;
  uint *puVar2;
  byte bVar4;
  byte bVar5;
  uint uVar6;
  byte *pbVar7;
  uint *puVar3;
  
  if (param_1 == 0x50) {
    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);
    *param_4 = *puVar1;
    return (uint *)(puVar1 + 1);
  }
  switch(param_1 & 0xf) {
  case 0:
  case 4:
  case 0xc:
    pbVar7 = *(byte **)param_3;
    puVar2 = param_3 + 2;
    break;
  case 1:
    pbVar7 = (byte *)0x0;
    bVar4 = 0;
    puVar3 = param_3;
    do {
      puVar2 = (uint *)((long)puVar3 + 1);
      uVar6 = *puVar3;
      bVar5 = bVar4 & 0x3f;
      bVar4 = bVar4 + 7;
      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);
      puVar3 = puVar2;
    } while ((char)(byte)uVar6 < '\0');
    break;
  case 2:
    pbVar7 = (byte *)(ulong)(ushort)*param_3;
    puVar2 = (uint *)((long)param_3 + 2);
    break;
  case 3:
    pbVar7 = (byte *)(ulong)*param_3;
    puVar2 = param_3 + 1;
    break;
  default:
                    /* WARNING: Subroutine does not return */
    abort();
  case 9:
    pbVar7 = (byte *)0x0;
    uVar6 = 0;
    puVar3 = param_3;
    do {
      puVar2 = (uint *)((long)puVar3 + 1);
      bVar4 = (byte)*puVar3;
      bVar5 = (byte)uVar6;
      uVar6 = uVar6 + 7;
      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));
      puVar3 = puVar2;
    } while ((char)bVar4 < '\0');
    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;
    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));
    goto LAB_0030504c;
  case 10:
    pbVar7 = (byte *)(long)(short)(ushort)*param_3;
    puVar2 = (uint *)((long)param_3 + 2);
    break;
  case 0xb:
    pbVar7 = (byte *)(long)(int)*param_3;
    puVar2 = param_3 + 1;
  }
  if (pbVar7 != (byte *)0x0) {
LAB_0030504c:
    if ((param_1 & 0x70) == 0x10) {
      param_2 = param_3;
    }
    pbVar7 = pbVar7 + (long)param_2;
    if ((char)param_1 < '\0') {
      *param_4 = *(undefined8 *)pbVar7;
      return puVar2;
    }
  }
  *param_4 = pbVar7;
  return puVar2;
}


MOV R10,RCX
CMP DIL,0x50
JZ 0x00305070
MOV ECX,EDI
SUB RSP,0x8
AND ECX,0xf
CMP CL,0xc
JA 0x00147544
LEA R8,[0x32e320]
MOVZX ECX,CL
MOVSXD RAX,dword ptr [R8 + RCX*0x4]
ADD RAX,R8
JMP RAX
MOV R8,qword ptr [RDX]
LEA RAX,[RDX + 0x8]
TEST R8,R8
JZ 0x00305060
MOV ECX,EDI
AND ECX,0x70
CMP CL,0x10
CMOVZ RSI,RDX
ADD R8,RSI
TEST DIL,DIL
JS 0x00305088
MOV qword ptr [R10],R8
ADD RSP,0x8
RET
LEA RAX,[RDX + 0x7]
AND RAX,-0x8
MOV R8,qword ptr [RAX]
LEA RAX,[RAX + 0x8]
MOV qword ptr [RCX],R8
RET
MOV R8,qword ptr [R8]
MOV qword ptr [R10],R8
ADD RSP,0x8
RET
MOV RAX,RDX
XOR R8D,R8D
XOR ECX,ECX
ADD RAX,0x1
MOVZX R11D,byte ptr [RAX + -0x1]
MOV R9,R11
AND R9D,0x7f
SHL R9,CL
ADD ECX,0x7
OR R8,R9
TEST R11B,R11B
JS 0x003050a0
JMP 0x00305047
MOVZX R8D,word ptr [RDX]
LEA RAX,[RDX + 0x2]
JMP 0x00305047
MOV R8D,dword ptr [RDX]
LEA RAX,[RDX + 0x4]
JMP 0x00305047
MOVSXD R8,dword ptr [RDX]
LEA RAX,[RDX + 0x4]
JMP 0x00305047
MOV RAX,RDX
XOR R8D,R8D
XOR ECX,ECX
NOP dword ptr [RAX + RAX*0x1]
ADD RAX,0x1
MOVZX R11D,byte ptr [RAX + -0x1]
MOV R9,R11
AND R9D,0x7f
SHL R9,CL
ADD ECX,0x7
OR R8,R9
TEST R11B,R11B
JS 0x00305100
CMP ECX,0x3f
JA 0x00305047
AND R11D,0x40
JZ 0x00305047
MOV R9,-0x1
SHL R9,CL
OR R8,R9
JMP 0x0030504c
MOVSX R8,word ptr [RDX]
LEA RAX,[RDX + 0x2]
JMP 0x00305047
(translation_unit "/* WARNING: Type propagation algorithm not settling */\n\nuint * FUN_00305010(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)\n\n{\n  undefined8 *puVar1;\n  uint *puVar2;\n  byte bVar4;\n  byte bVar5;\n  uint uVar6;\n  byte *pbVar7;\n  uint *puVar3;\n  \n  if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }\n  switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    /* WARNING: Subroutine does not return */\n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }\n  if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }\n  *param_4 = pbVar7;\n  return puVar2;\n}\n\n" comment (function_definition "uint * FUN_00305010(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)\n\n{\n  undefined8 *puVar1;\n  uint *puVar2;\n  byte bVar4;\n  byte bVar5;\n  uint uVar6;\n  byte *pbVar7;\n  uint *puVar3;\n  \n  if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }\n  switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    /* WARNING: Subroutine does not return */\n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }\n  if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }\n  *param_4 = pbVar7;\n  return puVar2;\n}" type_identifier (pointer_declarator "* FUN_00305010(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)" * (function_declarator "FUN_00305010(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)" identifier (parameter_list "(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)" ( (parameter_declaration "byte param_1" type_identifier identifier) , (parameter_declaration "uint *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "uint *param_3" type_identifier (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "undefined8 *param_4" type_identifier (pointer_declarator "*param_4" * identifier)) )))) (compound_statement "{\n  undefined8 *puVar1;\n  uint *puVar2;\n  byte bVar4;\n  byte bVar5;\n  uint uVar6;\n  byte *pbVar7;\n  uint *puVar3;\n  \n  if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }\n  switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    /* WARNING: Subroutine does not return */\n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }\n  if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }\n  *param_4 = pbVar7;\n  return puVar2;\n}" { (declaration "undefined8 *puVar1;" type_identifier (pointer_declarator "*puVar1" * identifier) ;) (declaration "uint *puVar2;" type_identifier (pointer_declarator "*puVar2" * identifier) ;) (declaration "byte bVar4;" type_identifier identifier ;) (declaration "byte bVar5;" type_identifier identifier ;) (declaration "uint uVar6;" type_identifier identifier ;) (declaration "byte *pbVar7;" type_identifier (pointer_declarator "*pbVar7" * identifier) ;) (declaration "uint *puVar3;" type_identifier (pointer_declarator "*puVar3" * identifier) ;) (if_statement "if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }" if (parenthesized_expression "(param_1 == 0x50)" ( (binary_expression "param_1 == 0x50" identifier == number_literal) )) (compound_statement "{\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }" { (expression_statement "puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);" (assignment_expression "puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8)" identifier = (cast_expression "(undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8)" ( (binary_expression "(ulong)((long)param_3 + 7U) & 0xfffffffffffffff8" (call_expression "(ulong)((long)param_3 + 7U)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "((long)param_3 + 7U)" ( (binary_expression "(long)param_3 + 7U" (cast_expression "(long)param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) ))) & number_literal) )))) ;) (expression_statement "*param_4 = *puVar1;" (assignment_expression "*param_4 = *puVar1" (pointer_expression "*param_4" * identifier) = (pointer_expression "*puVar1" * identifier)) ;) (return_statement "return (uint *)(puVar1 + 1);" return (cast_expression "(uint *)(puVar1 + 1)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(puVar1 + 1)" ( (binary_expression "puVar1 + 1" identifier + number_literal) ))) ;) })) (switch_statement "switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    /* WARNING: Subroutine does not return */\n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }" switch (parenthesized_expression "(param_1 & 0xf)" ( (binary_expression "param_1 & 0xf" identifier & number_literal) )) (compound_statement "{\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    /* WARNING: Subroutine does not return */\n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }" { (case_statement "case 0:" case number_literal :) (case_statement "case 4:" case number_literal :) (case_statement "case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;" case number_literal : (expression_statement "pbVar7 = *(byte **)param_3;" (assignment_expression "pbVar7 = *(byte **)param_3" identifier = (pointer_expression "*(byte **)param_3" * (cast_expression "(byte **)param_3" ( (type_descriptor "byte **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) identifier))) ;) (expression_statement "puVar2 = param_3 + 2;" (assignment_expression "puVar2 = param_3 + 2" identifier = (binary_expression "param_3 + 2" identifier + number_literal)) ;) (break_statement "break;" break ;)) (case_statement "case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;" case number_literal : (expression_statement "pbVar7 = (byte *)0x0;" (assignment_expression "pbVar7 = (byte *)0x0" identifier = (cast_expression "(byte *)0x0" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ;) (expression_statement "bVar4 = 0;" (assignment_expression "bVar4 = 0" identifier = number_literal) ;) (expression_statement "puVar3 = param_3;" (assignment_expression "puVar3 = param_3" identifier = identifier) ;) (do_statement "do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');" do (compound_statement "{\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    }" { (expression_statement "puVar2 = (uint *)((long)puVar3 + 1);" (assignment_expression "puVar2 = (uint *)((long)puVar3 + 1)" identifier = (cast_expression "(uint *)((long)puVar3 + 1)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)puVar3 + 1)" ( (binary_expression "(long)puVar3 + 1" (cast_expression "(long)puVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) )))) ;) (expression_statement "uVar6 = *puVar3;" (assignment_expression "uVar6 = *puVar3" identifier = (pointer_expression "*puVar3" * identifier)) ;) (expression_statement "bVar5 = bVar4 & 0x3f;" (assignment_expression "bVar5 = bVar4 & 0x3f" identifier = (binary_expression "bVar4 & 0x3f" identifier & number_literal)) ;) (expression_statement "bVar4 = bVar4 + 7;" (assignment_expression "bVar4 = bVar4 + 7" identifier = (binary_expression "bVar4 + 7" identifier + number_literal)) ;) (expression_statement "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);" (assignment_expression "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5)" identifier = (cast_expression "(byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5)" ( (binary_expression "(ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5" (cast_expression "(ulong)pbVar7" ( (type_descriptor "ulong" type_identifier) ) identifier) | (binary_expression "(ulong)((byte)uVar6 & 0x7f) << bVar5" (call_expression "(ulong)((byte)uVar6 & 0x7f)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "((byte)uVar6 & 0x7f)" ( (binary_expression "(byte)uVar6 & 0x7f" (cast_expression "(byte)uVar6" ( (type_descriptor "byte" type_identifier) ) identifier) & number_literal) ))) << identifier)) )))) ;) (expression_statement "puVar3 = puVar2;" (assignment_expression "puVar3 = puVar2" identifier = identifier) ;) }) while (parenthesized_expression "((char)(byte)uVar6 < '\0')" ( (binary_expression "(char)(byte)uVar6 < '\0'" (cast_expression "(char)(byte)uVar6" ( (type_descriptor "char" primitive_type) ) (cast_expression "(byte)uVar6" ( (type_descriptor "byte" type_identifier) ) identifier)) < (char_literal "'\0'" ' escape_sequence ')) )) ;) (break_statement "break;" break ;)) (case_statement "case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;" case number_literal : (expression_statement "pbVar7 = (byte *)(ulong)(ushort)*param_3;" (assignment_expression "pbVar7 = (byte *)(ulong)(ushort)*param_3" identifier = (binary_expression "(byte *)(ulong)(ushort)*param_3" (cast_expression "(byte *)(ulong)(ushort)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "(ulong)(ushort)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "(ushort)" ( identifier )))) * identifier)) ;) (expression_statement "puVar2 = (uint *)((long)param_3 + 2);" (assignment_expression "puVar2 = (uint *)((long)param_3 + 2)" identifier = (cast_expression "(uint *)((long)param_3 + 2)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)param_3 + 2)" ( (binary_expression "(long)param_3 + 2" (cast_expression "(long)param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) )))) ;) (break_statement "break;" break ;)) (case_statement "case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;" case number_literal : (expression_statement "pbVar7 = (byte *)(ulong)*param_3;" (assignment_expression "pbVar7 = (byte *)(ulong)*param_3" identifier = (binary_expression "(byte *)(ulong)*param_3" (cast_expression "(byte *)(ulong)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(ulong)" ( identifier ))) * identifier)) ;) (expression_statement "puVar2 = param_3 + 1;" (assignment_expression "puVar2 = param_3 + 1" identifier = (binary_expression "param_3 + 1" identifier + number_literal)) ;) (break_statement "break;" break ;)) (case_statement "default:\n                    /* WARNING: Subroutine does not return */\n    abort();" default : comment (expression_statement "abort();" (call_expression "abort()" identifier (argument_list "()" ( ))) ;)) (case_statement "case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;" case number_literal : (expression_statement "pbVar7 = (byte *)0x0;" (assignment_expression "pbVar7 = (byte *)0x0" identifier = (cast_expression "(byte *)0x0" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ;) (expression_statement "uVar6 = 0;" (assignment_expression "uVar6 = 0" identifier = number_literal) ;) (expression_statement "puVar3 = param_3;" (assignment_expression "puVar3 = param_3" identifier = identifier) ;) (do_statement "do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');" do (compound_statement "{\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    }" { (expression_statement "puVar2 = (uint *)((long)puVar3 + 1);" (assignment_expression "puVar2 = (uint *)((long)puVar3 + 1)" identifier = (cast_expression "(uint *)((long)puVar3 + 1)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)puVar3 + 1)" ( (binary_expression "(long)puVar3 + 1" (cast_expression "(long)puVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) )))) ;) (expression_statement "bVar4 = (byte)*puVar3;" (assignment_expression "bVar4 = (byte)*puVar3" identifier = (binary_expression "(byte)*puVar3" (parenthesized_expression "(byte)" ( identifier )) * identifier)) ;) (expression_statement "bVar5 = (byte)uVar6;" (assignment_expression "bVar5 = (byte)uVar6" identifier = (cast_expression "(byte)uVar6" ( (type_descriptor "byte" type_identifier) ) identifier)) ;) (expression_statement "uVar6 = uVar6 + 7;" (assignment_expression "uVar6 = uVar6 + 7" identifier = (binary_expression "uVar6 + 7" identifier + number_literal)) ;) (expression_statement "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));" (assignment_expression "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f))" identifier = (cast_expression "(byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f))" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f))" ( (binary_expression "(ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f)" (cast_expression "(ulong)pbVar7" ( (type_descriptor "ulong" type_identifier) ) identifier) | (binary_expression "(ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f)" (call_expression "(ulong)(bVar4 & 0x7f)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "(bVar4 & 0x7f)" ( (binary_expression "bVar4 & 0x7f" identifier & number_literal) ))) << (parenthesized_expression "(bVar5 & 0x3f)" ( (binary_expression "bVar5 & 0x3f" identifier & number_literal) )))) )))) ;) (expression_statement "puVar3 = puVar2;" (assignment_expression "puVar3 = puVar2" identifier = identifier) ;) }) while (parenthesized_expression "((char)bVar4 < '\0')" ( (binary_expression "(char)bVar4 < '\0'" (cast_expression "(char)bVar4" ( (type_descriptor "char" primitive_type) ) identifier) < (char_literal "'\0'" ' escape_sequence ')) )) ;) (if_statement "if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;" if (parenthesized_expression "((0x3f < uVar6) || ((bVar4 & 0x40) == 0))" ( (binary_expression "(0x3f < uVar6) || ((bVar4 & 0x40) == 0)" (parenthesized_expression "(0x3f < uVar6)" ( (binary_expression "0x3f < uVar6" number_literal < identifier) )) || (parenthesized_expression "((bVar4 & 0x40) == 0)" ( (binary_expression "(bVar4 & 0x40) == 0" (parenthesized_expression "(bVar4 & 0x40)" ( (binary_expression "bVar4 & 0x40" identifier & number_literal) )) == number_literal) ))) )) (break_statement "break;" break ;)) (expression_statement "pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));" (assignment_expression "pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f))" identifier = (cast_expression "(byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f))" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f))" ( (binary_expression "(ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f)" (cast_expression "(ulong)pbVar7" ( (type_descriptor "ulong" type_identifier) ) identifier) | (binary_expression "-1L << ((byte)uVar6 & 0x3f)" number_literal << (parenthesized_expression "((byte)uVar6 & 0x3f)" ( (binary_expression "(byte)uVar6 & 0x3f" (cast_expression "(byte)uVar6" ( (type_descriptor "byte" type_identifier) ) identifier) & number_literal) )))) )))) ;) (goto_statement "goto LAB_0030504c;" goto statement_identifier ;)) (case_statement "case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;" case number_literal : (expression_statement "pbVar7 = (byte *)(long)(short)(ushort)*param_3;" (assignment_expression "pbVar7 = (byte *)(long)(short)(ushort)*param_3" identifier = (binary_expression "(byte *)(long)(short)(ushort)*param_3" (cast_expression "(byte *)(long)(short)(ushort)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (cast_expression "(long)(short)(ushort)" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) (cast_expression "(short)(ushort)" ( (type_descriptor "short" (sized_type_specifier "short" short)) ) (parenthesized_expression "(ushort)" ( identifier ))))) * identifier)) ;) (expression_statement "puVar2 = (uint *)((long)param_3 + 2);" (assignment_expression "puVar2 = (uint *)((long)param_3 + 2)" identifier = (cast_expression "(uint *)((long)param_3 + 2)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)param_3 + 2)" ( (binary_expression "(long)param_3 + 2" (cast_expression "(long)param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) )))) ;) (break_statement "break;" break ;)) (case_statement "case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;" case number_literal : (expression_statement "pbVar7 = (byte *)(long)(int)*param_3;" (assignment_expression "pbVar7 = (byte *)(long)(int)*param_3" identifier = (cast_expression "(byte *)(long)(int)*param_3" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (cast_expression "(long)(int)*param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) (cast_expression "(int)*param_3" ( (type_descriptor "int" primitive_type) ) (pointer_expression "*param_3" * identifier))))) ;) (expression_statement "puVar2 = param_3 + 1;" (assignment_expression "puVar2 = param_3 + 1" identifier = (binary_expression "param_3 + 1" identifier + number_literal)) ;)) })) (if_statement "if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }" if (parenthesized_expression "(pbVar7 != (byte *)0x0)" ( (binary_expression "pbVar7 != (byte *)0x0" identifier != (cast_expression "(byte *)0x0" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }" { (labeled_statement "LAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }" statement_identifier : (if_statement "if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }" if (parenthesized_expression "((param_1 & 0x70) == 0x10)" ( (binary_expression "(param_1 & 0x70) == 0x10" (parenthesized_expression "(param_1 & 0x70)" ( (binary_expression "param_1 & 0x70" identifier & number_literal) )) == number_literal) )) (compound_statement "{\n      param_2 = param_3;\n    }" { (expression_statement "param_2 = param_3;" (assignment_expression "param_2 = param_3" identifier = identifier) ;) }))) (expression_statement "pbVar7 = pbVar7 + (long)param_2;" (assignment_expression "pbVar7 = pbVar7 + (long)param_2" identifier = (binary_expression "pbVar7 + (long)param_2" identifier + (cast_expression "(long)param_2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ;) (if_statement "if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }" if (parenthesized_expression "((char)param_1 < '\0')" ( (binary_expression "(char)param_1 < '\0'" (cast_expression "(char)param_1" ( (type_descriptor "char" primitive_type) ) identifier) < (char_literal "'\0'" ' escape_sequence ')) )) (compound_statement "{\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }" { (expression_statement "*param_4 = *(undefined8 *)pbVar7;" (assignment_expression "*param_4 = *(undefined8 *)pbVar7" (pointer_expression "*param_4" * identifier) = (pointer_expression "*(undefined8 *)pbVar7" * (cast_expression "(undefined8 *)pbVar7" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier))) ;) (return_statement "return puVar2;" return identifier ;) })) })) (expression_statement "*param_4 = pbVar7;" (assignment_expression "*param_4 = pbVar7" (pointer_expression "*param_4" * identifier) = identifier) ;) (return_statement "return puVar2;" return identifier ;) })))
(translation_unit "/* WARNING: Type propagation algorithm not settling */\n\nuint * read_encoded_value_with_base(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)\n\n{\n  undefined8 *puVar1;\n  uint *puVar2;\n  byte bVar4;\n  byte bVar5;\n  uint uVar6;\n  byte *pbVar7;\n  uint *puVar3;\n  \n  if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }\n  switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    /* WARNING: Subroutine does not return */\n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }\n  if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }\n  *param_4 = pbVar7;\n  return puVar2;\n}\n\n" comment (function_definition "uint * read_encoded_value_with_base(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)\n\n{\n  undefined8 *puVar1;\n  uint *puVar2;\n  byte bVar4;\n  byte bVar5;\n  uint uVar6;\n  byte *pbVar7;\n  uint *puVar3;\n  \n  if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }\n  switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    /* WARNING: Subroutine does not return */\n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }\n  if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }\n  *param_4 = pbVar7;\n  return puVar2;\n}" type_identifier (pointer_declarator "* read_encoded_value_with_base(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)" * (function_declarator "read_encoded_value_with_base(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)" identifier (parameter_list "(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)" ( (parameter_declaration "byte param_1" type_identifier identifier) , (parameter_declaration "uint *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "uint *param_3" type_identifier (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "undefined8 *param_4" type_identifier (pointer_declarator "*param_4" * identifier)) )))) (compound_statement "{\n  undefined8 *puVar1;\n  uint *puVar2;\n  byte bVar4;\n  byte bVar5;\n  uint uVar6;\n  byte *pbVar7;\n  uint *puVar3;\n  \n  if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }\n  switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    /* WARNING: Subroutine does not return */\n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }\n  if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }\n  *param_4 = pbVar7;\n  return puVar2;\n}" { (declaration "undefined8 *puVar1;" type_identifier (pointer_declarator "*puVar1" * identifier) ;) (declaration "uint *puVar2;" type_identifier (pointer_declarator "*puVar2" * identifier) ;) (declaration "byte bVar4;" type_identifier identifier ;) (declaration "byte bVar5;" type_identifier identifier ;) (declaration "uint uVar6;" type_identifier identifier ;) (declaration "byte *pbVar7;" type_identifier (pointer_declarator "*pbVar7" * identifier) ;) (declaration "uint *puVar3;" type_identifier (pointer_declarator "*puVar3" * identifier) ;) (if_statement "if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }" if (parenthesized_expression "(param_1 == 0x50)" ( (binary_expression "param_1 == 0x50" identifier == number_literal) )) (compound_statement "{\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }" { (expression_statement "puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);" (assignment_expression "puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8)" identifier = (cast_expression "(undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8)" ( (binary_expression "(ulong)((long)param_3 + 7U) & 0xfffffffffffffff8" (call_expression "(ulong)((long)param_3 + 7U)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "((long)param_3 + 7U)" ( (binary_expression "(long)param_3 + 7U" (cast_expression "(long)param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) ))) & number_literal) )))) ;) (expression_statement "*param_4 = *puVar1;" (assignment_expression "*param_4 = *puVar1" (pointer_expression "*param_4" * identifier) = (pointer_expression "*puVar1" * identifier)) ;) (return_statement "return (uint *)(puVar1 + 1);" return (cast_expression "(uint *)(puVar1 + 1)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(puVar1 + 1)" ( (binary_expression "puVar1 + 1" identifier + number_literal) ))) ;) })) (switch_statement "switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    /* WARNING: Subroutine does not return */\n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }" switch (parenthesized_expression "(param_1 & 0xf)" ( (binary_expression "param_1 & 0xf" identifier & number_literal) )) (compound_statement "{\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    /* WARNING: Subroutine does not return */\n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }" { (case_statement "case 0:" case number_literal :) (case_statement "case 4:" case number_literal :) (case_statement "case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;" case number_literal : (expression_statement "pbVar7 = *(byte **)param_3;" (assignment_expression "pbVar7 = *(byte **)param_3" identifier = (pointer_expression "*(byte **)param_3" * (cast_expression "(byte **)param_3" ( (type_descriptor "byte **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) identifier))) ;) (expression_statement "puVar2 = param_3 + 2;" (assignment_expression "puVar2 = param_3 + 2" identifier = (binary_expression "param_3 + 2" identifier + number_literal)) ;) (break_statement "break;" break ;)) (case_statement "case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;" case number_literal : (expression_statement "pbVar7 = (byte *)0x0;" (assignment_expression "pbVar7 = (byte *)0x0" identifier = (cast_expression "(byte *)0x0" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ;) (expression_statement "bVar4 = 0;" (assignment_expression "bVar4 = 0" identifier = number_literal) ;) (expression_statement "puVar3 = param_3;" (assignment_expression "puVar3 = param_3" identifier = identifier) ;) (do_statement "do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');" do (compound_statement "{\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    }" { (expression_statement "puVar2 = (uint *)((long)puVar3 + 1);" (assignment_expression "puVar2 = (uint *)((long)puVar3 + 1)" identifier = (cast_expression "(uint *)((long)puVar3 + 1)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)puVar3 + 1)" ( (binary_expression "(long)puVar3 + 1" (cast_expression "(long)puVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) )))) ;) (expression_statement "uVar6 = *puVar3;" (assignment_expression "uVar6 = *puVar3" identifier = (pointer_expression "*puVar3" * identifier)) ;) (expression_statement "bVar5 = bVar4 & 0x3f;" (assignment_expression "bVar5 = bVar4 & 0x3f" identifier = (binary_expression "bVar4 & 0x3f" identifier & number_literal)) ;) (expression_statement "bVar4 = bVar4 + 7;" (assignment_expression "bVar4 = bVar4 + 7" identifier = (binary_expression "bVar4 + 7" identifier + number_literal)) ;) (expression_statement "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);" (assignment_expression "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5)" identifier = (cast_expression "(byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5)" ( (binary_expression "(ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5" (cast_expression "(ulong)pbVar7" ( (type_descriptor "ulong" type_identifier) ) identifier) | (binary_expression "(ulong)((byte)uVar6 & 0x7f) << bVar5" (call_expression "(ulong)((byte)uVar6 & 0x7f)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "((byte)uVar6 & 0x7f)" ( (binary_expression "(byte)uVar6 & 0x7f" (cast_expression "(byte)uVar6" ( (type_descriptor "byte" type_identifier) ) identifier) & number_literal) ))) << identifier)) )))) ;) (expression_statement "puVar3 = puVar2;" (assignment_expression "puVar3 = puVar2" identifier = identifier) ;) }) while (parenthesized_expression "((char)(byte)uVar6 < '\0')" ( (binary_expression "(char)(byte)uVar6 < '\0'" (cast_expression "(char)(byte)uVar6" ( (type_descriptor "char" primitive_type) ) (cast_expression "(byte)uVar6" ( (type_descriptor "byte" type_identifier) ) identifier)) < (char_literal "'\0'" ' escape_sequence ')) )) ;) (break_statement "break;" break ;)) (case_statement "case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;" case number_literal : (expression_statement "pbVar7 = (byte *)(ulong)(ushort)*param_3;" (assignment_expression "pbVar7 = (byte *)(ulong)(ushort)*param_3" identifier = (binary_expression "(byte *)(ulong)(ushort)*param_3" (cast_expression "(byte *)(ulong)(ushort)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "(ulong)(ushort)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "(ushort)" ( identifier )))) * identifier)) ;) (expression_statement "puVar2 = (uint *)((long)param_3 + 2);" (assignment_expression "puVar2 = (uint *)((long)param_3 + 2)" identifier = (cast_expression "(uint *)((long)param_3 + 2)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)param_3 + 2)" ( (binary_expression "(long)param_3 + 2" (cast_expression "(long)param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) )))) ;) (break_statement "break;" break ;)) (case_statement "case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;" case number_literal : (expression_statement "pbVar7 = (byte *)(ulong)*param_3;" (assignment_expression "pbVar7 = (byte *)(ulong)*param_3" identifier = (binary_expression "(byte *)(ulong)*param_3" (cast_expression "(byte *)(ulong)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(ulong)" ( identifier ))) * identifier)) ;) (expression_statement "puVar2 = param_3 + 1;" (assignment_expression "puVar2 = param_3 + 1" identifier = (binary_expression "param_3 + 1" identifier + number_literal)) ;) (break_statement "break;" break ;)) (case_statement "default:\n                    /* WARNING: Subroutine does not return */\n    abort();" default : comment (expression_statement "abort();" (call_expression "abort()" identifier (argument_list "()" ( ))) ;)) (case_statement "case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;" case number_literal : (expression_statement "pbVar7 = (byte *)0x0;" (assignment_expression "pbVar7 = (byte *)0x0" identifier = (cast_expression "(byte *)0x0" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ;) (expression_statement "uVar6 = 0;" (assignment_expression "uVar6 = 0" identifier = number_literal) ;) (expression_statement "puVar3 = param_3;" (assignment_expression "puVar3 = param_3" identifier = identifier) ;) (do_statement "do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');" do (compound_statement "{\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    }" { (expression_statement "puVar2 = (uint *)((long)puVar3 + 1);" (assignment_expression "puVar2 = (uint *)((long)puVar3 + 1)" identifier = (cast_expression "(uint *)((long)puVar3 + 1)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)puVar3 + 1)" ( (binary_expression "(long)puVar3 + 1" (cast_expression "(long)puVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) )))) ;) (expression_statement "bVar4 = (byte)*puVar3;" (assignment_expression "bVar4 = (byte)*puVar3" identifier = (binary_expression "(byte)*puVar3" (parenthesized_expression "(byte)" ( identifier )) * identifier)) ;) (expression_statement "bVar5 = (byte)uVar6;" (assignment_expression "bVar5 = (byte)uVar6" identifier = (cast_expression "(byte)uVar6" ( (type_descriptor "byte" type_identifier) ) identifier)) ;) (expression_statement "uVar6 = uVar6 + 7;" (assignment_expression "uVar6 = uVar6 + 7" identifier = (binary_expression "uVar6 + 7" identifier + number_literal)) ;) (expression_statement "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));" (assignment_expression "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f))" identifier = (cast_expression "(byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f))" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f))" ( (binary_expression "(ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f)" (cast_expression "(ulong)pbVar7" ( (type_descriptor "ulong" type_identifier) ) identifier) | (binary_expression "(ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f)" (call_expression "(ulong)(bVar4 & 0x7f)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "(bVar4 & 0x7f)" ( (binary_expression "bVar4 & 0x7f" identifier & number_literal) ))) << (parenthesized_expression "(bVar5 & 0x3f)" ( (binary_expression "bVar5 & 0x3f" identifier & number_literal) )))) )))) ;) (expression_statement "puVar3 = puVar2;" (assignment_expression "puVar3 = puVar2" identifier = identifier) ;) }) while (parenthesized_expression "((char)bVar4 < '\0')" ( (binary_expression "(char)bVar4 < '\0'" (cast_expression "(char)bVar4" ( (type_descriptor "char" primitive_type) ) identifier) < (char_literal "'\0'" ' escape_sequence ')) )) ;) (if_statement "if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;" if (parenthesized_expression "((0x3f < uVar6) || ((bVar4 & 0x40) == 0))" ( (binary_expression "(0x3f < uVar6) || ((bVar4 & 0x40) == 0)" (parenthesized_expression "(0x3f < uVar6)" ( (binary_expression "0x3f < uVar6" number_literal < identifier) )) || (parenthesized_expression "((bVar4 & 0x40) == 0)" ( (binary_expression "(bVar4 & 0x40) == 0" (parenthesized_expression "(bVar4 & 0x40)" ( (binary_expression "bVar4 & 0x40" identifier & number_literal) )) == number_literal) ))) )) (break_statement "break;" break ;)) (expression_statement "pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));" (assignment_expression "pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f))" identifier = (cast_expression "(byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f))" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f))" ( (binary_expression "(ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f)" (cast_expression "(ulong)pbVar7" ( (type_descriptor "ulong" type_identifier) ) identifier) | (binary_expression "-1L << ((byte)uVar6 & 0x3f)" number_literal << (parenthesized_expression "((byte)uVar6 & 0x3f)" ( (binary_expression "(byte)uVar6 & 0x3f" (cast_expression "(byte)uVar6" ( (type_descriptor "byte" type_identifier) ) identifier) & number_literal) )))) )))) ;) (goto_statement "goto LAB_0030504c;" goto statement_identifier ;)) (case_statement "case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;" case number_literal : (expression_statement "pbVar7 = (byte *)(long)(short)(ushort)*param_3;" (assignment_expression "pbVar7 = (byte *)(long)(short)(ushort)*param_3" identifier = (binary_expression "(byte *)(long)(short)(ushort)*param_3" (cast_expression "(byte *)(long)(short)(ushort)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (cast_expression "(long)(short)(ushort)" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) (cast_expression "(short)(ushort)" ( (type_descriptor "short" (sized_type_specifier "short" short)) ) (parenthesized_expression "(ushort)" ( identifier ))))) * identifier)) ;) (expression_statement "puVar2 = (uint *)((long)param_3 + 2);" (assignment_expression "puVar2 = (uint *)((long)param_3 + 2)" identifier = (cast_expression "(uint *)((long)param_3 + 2)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)param_3 + 2)" ( (binary_expression "(long)param_3 + 2" (cast_expression "(long)param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) )))) ;) (break_statement "break;" break ;)) (case_statement "case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;" case number_literal : (expression_statement "pbVar7 = (byte *)(long)(int)*param_3;" (assignment_expression "pbVar7 = (byte *)(long)(int)*param_3" identifier = (cast_expression "(byte *)(long)(int)*param_3" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (cast_expression "(long)(int)*param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) (cast_expression "(int)*param_3" ( (type_descriptor "int" primitive_type) ) (pointer_expression "*param_3" * identifier))))) ;) (expression_statement "puVar2 = param_3 + 1;" (assignment_expression "puVar2 = param_3 + 1" identifier = (binary_expression "param_3 + 1" identifier + number_literal)) ;)) })) (if_statement "if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }" if (parenthesized_expression "(pbVar7 != (byte *)0x0)" ( (binary_expression "pbVar7 != (byte *)0x0" identifier != (cast_expression "(byte *)0x0" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }" { (labeled_statement "LAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }" statement_identifier : (if_statement "if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }" if (parenthesized_expression "((param_1 & 0x70) == 0x10)" ( (binary_expression "(param_1 & 0x70) == 0x10" (parenthesized_expression "(param_1 & 0x70)" ( (binary_expression "param_1 & 0x70" identifier & number_literal) )) == number_literal) )) (compound_statement "{\n      param_2 = param_3;\n    }" { (expression_statement "param_2 = param_3;" (assignment_expression "param_2 = param_3" identifier = identifier) ;) }))) (expression_statement "pbVar7 = pbVar7 + (long)param_2;" (assignment_expression "pbVar7 = pbVar7 + (long)param_2" identifier = (binary_expression "pbVar7 + (long)param_2" identifier + (cast_expression "(long)param_2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ;) (if_statement "if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }" if (parenthesized_expression "((char)param_1 < '\0')" ( (binary_expression "(char)param_1 < '\0'" (cast_expression "(char)param_1" ( (type_descriptor "char" primitive_type) ) identifier) < (char_literal "'\0'" ' escape_sequence ')) )) (compound_statement "{\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }" { (expression_statement "*param_4 = *(undefined8 *)pbVar7;" (assignment_expression "*param_4 = *(undefined8 *)pbVar7" (pointer_expression "*param_4" * identifier) = (pointer_expression "*(undefined8 *)pbVar7" * (cast_expression "(undefined8 *)pbVar7" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier))) ;) (return_statement "return puVar2;" return identifier ;) })) })) (expression_statement "*param_4 = pbVar7;" (assignment_expression "*param_4 = pbVar7" (pointer_expression "*param_4" * identifier) = identifier) ;) (return_statement "return puVar2;" return identifier ;) })))
(translation_unit "uint * FUN_00305010(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)\n\n{\n  undefined8 *puVar1;\n  uint *puVar2;\n  byte bVar4;\n  byte bVar5;\n  uint uVar6;\n  byte *pbVar7;\n  uint *puVar3;\n  \n  if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }\n  switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    \n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }\n  if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }\n  *param_4 = pbVar7;\n  return puVar2;\n}\n\n" (function_definition "uint * FUN_00305010(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)\n\n{\n  undefined8 *puVar1;\n  uint *puVar2;\n  byte bVar4;\n  byte bVar5;\n  uint uVar6;\n  byte *pbVar7;\n  uint *puVar3;\n  \n  if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }\n  switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    \n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }\n  if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }\n  *param_4 = pbVar7;\n  return puVar2;\n}" type_identifier (pointer_declarator "* FUN_00305010(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)" * (function_declarator "FUN_00305010(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)" identifier (parameter_list "(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)" ( (parameter_declaration "byte param_1" type_identifier identifier) , (parameter_declaration "uint *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "uint *param_3" type_identifier (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "undefined8 *param_4" type_identifier (pointer_declarator "*param_4" * identifier)) )))) (compound_statement "{\n  undefined8 *puVar1;\n  uint *puVar2;\n  byte bVar4;\n  byte bVar5;\n  uint uVar6;\n  byte *pbVar7;\n  uint *puVar3;\n  \n  if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }\n  switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    \n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }\n  if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }\n  *param_4 = pbVar7;\n  return puVar2;\n}" { (declaration "undefined8 *puVar1;" type_identifier (pointer_declarator "*puVar1" * identifier) ;) (declaration "uint *puVar2;" type_identifier (pointer_declarator "*puVar2" * identifier) ;) (declaration "byte bVar4;" type_identifier identifier ;) (declaration "byte bVar5;" type_identifier identifier ;) (declaration "uint uVar6;" type_identifier identifier ;) (declaration "byte *pbVar7;" type_identifier (pointer_declarator "*pbVar7" * identifier) ;) (declaration "uint *puVar3;" type_identifier (pointer_declarator "*puVar3" * identifier) ;) (if_statement "if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }" if (parenthesized_expression "(param_1 == 0x50)" ( (binary_expression "param_1 == 0x50" identifier == number_literal) )) (compound_statement "{\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }" { (expression_statement "puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);" (assignment_expression "puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8)" identifier = (cast_expression "(undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8)" ( (binary_expression "(ulong)((long)param_3 + 7U) & 0xfffffffffffffff8" (call_expression "(ulong)((long)param_3 + 7U)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "((long)param_3 + 7U)" ( (binary_expression "(long)param_3 + 7U" (cast_expression "(long)param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) ))) & number_literal) )))) ;) (expression_statement "*param_4 = *puVar1;" (assignment_expression "*param_4 = *puVar1" (pointer_expression "*param_4" * identifier) = (pointer_expression "*puVar1" * identifier)) ;) (return_statement "return (uint *)(puVar1 + 1);" return (cast_expression "(uint *)(puVar1 + 1)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(puVar1 + 1)" ( (binary_expression "puVar1 + 1" identifier + number_literal) ))) ;) })) (switch_statement "switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    \n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }" switch (parenthesized_expression "(param_1 & 0xf)" ( (binary_expression "param_1 & 0xf" identifier & number_literal) )) (compound_statement "{\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    \n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }" { (case_statement "case 0:" case number_literal :) (case_statement "case 4:" case number_literal :) (case_statement "case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;" case number_literal : (expression_statement "pbVar7 = *(byte **)param_3;" (assignment_expression "pbVar7 = *(byte **)param_3" identifier = (pointer_expression "*(byte **)param_3" * (cast_expression "(byte **)param_3" ( (type_descriptor "byte **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) identifier))) ;) (expression_statement "puVar2 = param_3 + 2;" (assignment_expression "puVar2 = param_3 + 2" identifier = (binary_expression "param_3 + 2" identifier + number_literal)) ;) (break_statement "break;" break ;)) (case_statement "case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;" case number_literal : (expression_statement "pbVar7 = (byte *)0x0;" (assignment_expression "pbVar7 = (byte *)0x0" identifier = (cast_expression "(byte *)0x0" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ;) (expression_statement "bVar4 = 0;" (assignment_expression "bVar4 = 0" identifier = number_literal) ;) (expression_statement "puVar3 = param_3;" (assignment_expression "puVar3 = param_3" identifier = identifier) ;) (do_statement "do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');" do (compound_statement "{\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    }" { (expression_statement "puVar2 = (uint *)((long)puVar3 + 1);" (assignment_expression "puVar2 = (uint *)((long)puVar3 + 1)" identifier = (cast_expression "(uint *)((long)puVar3 + 1)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)puVar3 + 1)" ( (binary_expression "(long)puVar3 + 1" (cast_expression "(long)puVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) )))) ;) (expression_statement "uVar6 = *puVar3;" (assignment_expression "uVar6 = *puVar3" identifier = (pointer_expression "*puVar3" * identifier)) ;) (expression_statement "bVar5 = bVar4 & 0x3f;" (assignment_expression "bVar5 = bVar4 & 0x3f" identifier = (binary_expression "bVar4 & 0x3f" identifier & number_literal)) ;) (expression_statement "bVar4 = bVar4 + 7;" (assignment_expression "bVar4 = bVar4 + 7" identifier = (binary_expression "bVar4 + 7" identifier + number_literal)) ;) (expression_statement "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);" (assignment_expression "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5)" identifier = (cast_expression "(byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5)" ( (binary_expression "(ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5" (cast_expression "(ulong)pbVar7" ( (type_descriptor "ulong" type_identifier) ) identifier) | (binary_expression "(ulong)((byte)uVar6 & 0x7f) << bVar5" (call_expression "(ulong)((byte)uVar6 & 0x7f)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "((byte)uVar6 & 0x7f)" ( (binary_expression "(byte)uVar6 & 0x7f" (cast_expression "(byte)uVar6" ( (type_descriptor "byte" type_identifier) ) identifier) & number_literal) ))) << identifier)) )))) ;) (expression_statement "puVar3 = puVar2;" (assignment_expression "puVar3 = puVar2" identifier = identifier) ;) }) while (parenthesized_expression "((char)(byte)uVar6 < '\0')" ( (binary_expression "(char)(byte)uVar6 < '\0'" (cast_expression "(char)(byte)uVar6" ( (type_descriptor "char" primitive_type) ) (cast_expression "(byte)uVar6" ( (type_descriptor "byte" type_identifier) ) identifier)) < (char_literal "'\0'" ' escape_sequence ')) )) ;) (break_statement "break;" break ;)) (case_statement "case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;" case number_literal : (expression_statement "pbVar7 = (byte *)(ulong)(ushort)*param_3;" (assignment_expression "pbVar7 = (byte *)(ulong)(ushort)*param_3" identifier = (binary_expression "(byte *)(ulong)(ushort)*param_3" (cast_expression "(byte *)(ulong)(ushort)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "(ulong)(ushort)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "(ushort)" ( identifier )))) * identifier)) ;) (expression_statement "puVar2 = (uint *)((long)param_3 + 2);" (assignment_expression "puVar2 = (uint *)((long)param_3 + 2)" identifier = (cast_expression "(uint *)((long)param_3 + 2)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)param_3 + 2)" ( (binary_expression "(long)param_3 + 2" (cast_expression "(long)param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) )))) ;) (break_statement "break;" break ;)) (case_statement "case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;" case number_literal : (expression_statement "pbVar7 = (byte *)(ulong)*param_3;" (assignment_expression "pbVar7 = (byte *)(ulong)*param_3" identifier = (binary_expression "(byte *)(ulong)*param_3" (cast_expression "(byte *)(ulong)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(ulong)" ( identifier ))) * identifier)) ;) (expression_statement "puVar2 = param_3 + 1;" (assignment_expression "puVar2 = param_3 + 1" identifier = (binary_expression "param_3 + 1" identifier + number_literal)) ;) (break_statement "break;" break ;)) (case_statement "default:\n                    \n    abort();" default : (expression_statement "abort();" (call_expression "abort()" identifier (argument_list "()" ( ))) ;)) (case_statement "case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;" case number_literal : (expression_statement "pbVar7 = (byte *)0x0;" (assignment_expression "pbVar7 = (byte *)0x0" identifier = (cast_expression "(byte *)0x0" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ;) (expression_statement "uVar6 = 0;" (assignment_expression "uVar6 = 0" identifier = number_literal) ;) (expression_statement "puVar3 = param_3;" (assignment_expression "puVar3 = param_3" identifier = identifier) ;) (do_statement "do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');" do (compound_statement "{\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    }" { (expression_statement "puVar2 = (uint *)((long)puVar3 + 1);" (assignment_expression "puVar2 = (uint *)((long)puVar3 + 1)" identifier = (cast_expression "(uint *)((long)puVar3 + 1)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)puVar3 + 1)" ( (binary_expression "(long)puVar3 + 1" (cast_expression "(long)puVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) )))) ;) (expression_statement "bVar4 = (byte)*puVar3;" (assignment_expression "bVar4 = (byte)*puVar3" identifier = (binary_expression "(byte)*puVar3" (parenthesized_expression "(byte)" ( identifier )) * identifier)) ;) (expression_statement "bVar5 = (byte)uVar6;" (assignment_expression "bVar5 = (byte)uVar6" identifier = (cast_expression "(byte)uVar6" ( (type_descriptor "byte" type_identifier) ) identifier)) ;) (expression_statement "uVar6 = uVar6 + 7;" (assignment_expression "uVar6 = uVar6 + 7" identifier = (binary_expression "uVar6 + 7" identifier + number_literal)) ;) (expression_statement "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));" (assignment_expression "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f))" identifier = (cast_expression "(byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f))" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f))" ( (binary_expression "(ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f)" (cast_expression "(ulong)pbVar7" ( (type_descriptor "ulong" type_identifier) ) identifier) | (binary_expression "(ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f)" (call_expression "(ulong)(bVar4 & 0x7f)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "(bVar4 & 0x7f)" ( (binary_expression "bVar4 & 0x7f" identifier & number_literal) ))) << (parenthesized_expression "(bVar5 & 0x3f)" ( (binary_expression "bVar5 & 0x3f" identifier & number_literal) )))) )))) ;) (expression_statement "puVar3 = puVar2;" (assignment_expression "puVar3 = puVar2" identifier = identifier) ;) }) while (parenthesized_expression "((char)bVar4 < '\0')" ( (binary_expression "(char)bVar4 < '\0'" (cast_expression "(char)bVar4" ( (type_descriptor "char" primitive_type) ) identifier) < (char_literal "'\0'" ' escape_sequence ')) )) ;) (if_statement "if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;" if (parenthesized_expression "((0x3f < uVar6) || ((bVar4 & 0x40) == 0))" ( (binary_expression "(0x3f < uVar6) || ((bVar4 & 0x40) == 0)" (parenthesized_expression "(0x3f < uVar6)" ( (binary_expression "0x3f < uVar6" number_literal < identifier) )) || (parenthesized_expression "((bVar4 & 0x40) == 0)" ( (binary_expression "(bVar4 & 0x40) == 0" (parenthesized_expression "(bVar4 & 0x40)" ( (binary_expression "bVar4 & 0x40" identifier & number_literal) )) == number_literal) ))) )) (break_statement "break;" break ;)) (expression_statement "pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));" (assignment_expression "pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f))" identifier = (cast_expression "(byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f))" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f))" ( (binary_expression "(ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f)" (cast_expression "(ulong)pbVar7" ( (type_descriptor "ulong" type_identifier) ) identifier) | (binary_expression "-1L << ((byte)uVar6 & 0x3f)" number_literal << (parenthesized_expression "((byte)uVar6 & 0x3f)" ( (binary_expression "(byte)uVar6 & 0x3f" (cast_expression "(byte)uVar6" ( (type_descriptor "byte" type_identifier) ) identifier) & number_literal) )))) )))) ;) (goto_statement "goto LAB_0030504c;" goto statement_identifier ;)) (case_statement "case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;" case number_literal : (expression_statement "pbVar7 = (byte *)(long)(short)(ushort)*param_3;" (assignment_expression "pbVar7 = (byte *)(long)(short)(ushort)*param_3" identifier = (binary_expression "(byte *)(long)(short)(ushort)*param_3" (cast_expression "(byte *)(long)(short)(ushort)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (cast_expression "(long)(short)(ushort)" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) (cast_expression "(short)(ushort)" ( (type_descriptor "short" (sized_type_specifier "short" short)) ) (parenthesized_expression "(ushort)" ( identifier ))))) * identifier)) ;) (expression_statement "puVar2 = (uint *)((long)param_3 + 2);" (assignment_expression "puVar2 = (uint *)((long)param_3 + 2)" identifier = (cast_expression "(uint *)((long)param_3 + 2)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)param_3 + 2)" ( (binary_expression "(long)param_3 + 2" (cast_expression "(long)param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + number_literal) )))) ;) (break_statement "break;" break ;)) (case_statement "case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;" case number_literal : (expression_statement "pbVar7 = (byte *)(long)(int)*param_3;" (assignment_expression "pbVar7 = (byte *)(long)(int)*param_3" identifier = (cast_expression "(byte *)(long)(int)*param_3" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (cast_expression "(long)(int)*param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) (cast_expression "(int)*param_3" ( (type_descriptor "int" primitive_type) ) (pointer_expression "*param_3" * identifier))))) ;) (expression_statement "puVar2 = param_3 + 1;" (assignment_expression "puVar2 = param_3 + 1" identifier = (binary_expression "param_3 + 1" identifier + number_literal)) ;)) })) (if_statement "if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }" if (parenthesized_expression "(pbVar7 != (byte *)0x0)" ( (binary_expression "pbVar7 != (byte *)0x0" identifier != (cast_expression "(byte *)0x0" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }" { (labeled_statement "LAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }" statement_identifier : (if_statement "if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }" if (parenthesized_expression "((param_1 & 0x70) == 0x10)" ( (binary_expression "(param_1 & 0x70) == 0x10" (parenthesized_expression "(param_1 & 0x70)" ( (binary_expression "param_1 & 0x70" identifier & number_literal) )) == number_literal) )) (compound_statement "{\n      param_2 = param_3;\n    }" { (expression_statement "param_2 = param_3;" (assignment_expression "param_2 = param_3" identifier = identifier) ;) }))) (expression_statement "pbVar7 = pbVar7 + (long)param_2;" (assignment_expression "pbVar7 = pbVar7 + (long)param_2" identifier = (binary_expression "pbVar7 + (long)param_2" identifier + (cast_expression "(long)param_2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ;) (if_statement "if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }" if (parenthesized_expression "((char)param_1 < '\0')" ( (binary_expression "(char)param_1 < '\0'" (cast_expression "(char)param_1" ( (type_descriptor "char" primitive_type) ) identifier) < (char_literal "'\0'" ' escape_sequence ')) )) (compound_statement "{\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }" { (expression_statement "*param_4 = *(undefined8 *)pbVar7;" (assignment_expression "*param_4 = *(undefined8 *)pbVar7" (pointer_expression "*param_4" * identifier) = (pointer_expression "*(undefined8 *)pbVar7" * (cast_expression "(undefined8 *)pbVar7" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier))) ;) (return_statement "return puVar2;" return identifier ;) })) })) (expression_statement "*param_4 = pbVar7;" (assignment_expression "*param_4 = pbVar7" (pointer_expression "*param_4" * identifier) = identifier) ;) (return_statement "return puVar2;" return identifier ;) })))
(translation_unit (function_definition TYPE (pointer_declarator * (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE (pointer_declarator * IDENT)) )))) (compound_statement { (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (call_expression (parenthesized_expression ( IDENT )) (argument_list ( (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) + LIT) ))) & LIT) )))) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (pointer_expression * IDENT)) ;) (return_statement return (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))) ;) })) (switch_statement switch (parenthesized_expression ( (binary_expression IDENT & LIT) )) (compound_statement { (case_statement case LIT :) (case_statement case LIT :) (case_statement case LIT : (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) IDENT))) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (break_statement break ;)) (case_statement case LIT : (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (do_statement do (compound_statement { (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) + LIT) )))) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT & LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) | (binary_expression (call_expression (parenthesized_expression ( IDENT )) (argument_list ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) & LIT) ))) << IDENT)) )))) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) }) while (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) (cast_expression ( (type_descriptor TYPE) ) IDENT)) < (char_literal ' escape_sequence ')) )) ;) (break_statement break ;)) (case_statement case LIT : (expression_statement (assignment_expression IDENT = (binary_expression (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (call_expression (parenthesized_expression ( IDENT )) (argument_list ( IDENT )))) * IDENT)) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) + LIT) )))) ;) (break_statement break ;)) (case_statement case LIT : (expression_statement (assignment_expression IDENT = (binary_expression (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( IDENT ))) * IDENT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (break_statement break ;)) (case_statement default : (expression_statement (call_expression IDENT (argument_list ( ))) ;)) (case_statement case LIT : (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (do_statement do (compound_statement { (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) + LIT) )))) ;) (expression_statement (assignment_expression IDENT = (binary_expression (parenthesized_expression ( IDENT )) * IDENT)) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE) ) IDENT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) | (binary_expression (call_expression (parenthesized_expression ( IDENT )) (argument_list ( (binary_expression IDENT & LIT) ))) << (parenthesized_expression ( (binary_expression IDENT & LIT) )))) )))) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) }) while (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) < (char_literal ' escape_sequence ')) )) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression LIT < IDENT) )) || (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT & LIT) )) == LIT) ))) )) (break_statement break ;)) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) | (binary_expression LIT << (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) & LIT) )))) )))) ;) (goto_statement goto statement_identifier ;)) (case_statement case LIT : (expression_statement (assignment_expression IDENT = (binary_expression (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (cast_expression ( (type_descriptor (sized_type_specifier long)) ) (cast_expression ( (type_descriptor (sized_type_specifier short)) ) (parenthesized_expression ( IDENT ))))) * IDENT)) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) + LIT) )))) ;) (break_statement break ;)) (case_statement case LIT : (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (cast_expression ( (type_descriptor (sized_type_specifier long)) ) (cast_expression ( (type_descriptor TYPE) ) (pointer_expression * IDENT))))) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;)) })) (if_statement if (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) )) (compound_statement { (labeled_statement statement_identifier : (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT & LIT) )) == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = IDENT) ;) }))) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT))) ;) (if_statement if (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) < (char_literal ' escape_sequence ')) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * IDENT) = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) IDENT))) ;) (return_statement return IDENT ;) })) })) (expression_statement (assignment_expression (pointer_expression * IDENT) = IDENT) ;) (return_statement return IDENT ;) })))
(function_definition "uint * FUN_00305010(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)\n\n{\n  undefined8 *puVar1;\n  uint *puVar2;\n  byte bVar4;\n  byte bVar5;\n  uint uVar6;\n  byte *pbVar7;\n  uint *puVar3;\n  \n  if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }\n  switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    \n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }\n  if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }\n  *param_4 = pbVar7;\n  return puVar2;\n}" (type_identifier "uint") (pointer_declarator "* FUN_00305010(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)" (* "*") (function_declarator "FUN_00305010(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)" (identifier "FUN_00305010") (parameter_list "(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)" (( "(") (parameter_declaration "byte param_1" (type_identifier "byte") (identifier "param_1")) (, ",") (parameter_declaration "uint *param_2" (type_identifier "uint") (pointer_declarator "*param_2" (* "*") (identifier "param_2"))) (, ",") (parameter_declaration "uint *param_3" (type_identifier "uint") (pointer_declarator "*param_3" (* "*") (identifier "param_3"))) (, ",") (parameter_declaration "undefined8 *param_4" (type_identifier "undefined8") (pointer_declarator "*param_4" (* "*") (identifier "param_4"))) () ")")))) (compound_statement "{\n  undefined8 *puVar1;\n  uint *puVar2;\n  byte bVar4;\n  byte bVar5;\n  uint uVar6;\n  byte *pbVar7;\n  uint *puVar3;\n  \n  if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }\n  switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    \n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }\n  if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }\n  *param_4 = pbVar7;\n  return puVar2;\n}" ({ "{") (declaration "undefined8 *puVar1;" (type_identifier "undefined8") (pointer_declarator "*puVar1" (* "*") (identifier "puVar1")) (; ";")) (declaration "uint *puVar2;" (type_identifier "uint") (pointer_declarator "*puVar2" (* "*") (identifier "puVar2")) (; ";")) (declaration "byte bVar4;" (type_identifier "byte") (identifier "bVar4") (; ";")) (declaration "byte bVar5;" (type_identifier "byte") (identifier "bVar5") (; ";")) (declaration "uint uVar6;" (type_identifier "uint") (identifier "uVar6") (; ";")) (declaration "byte *pbVar7;" (type_identifier "byte") (pointer_declarator "*pbVar7" (* "*") (identifier "pbVar7")) (; ";")) (declaration "uint *puVar3;" (type_identifier "uint") (pointer_declarator "*puVar3" (* "*") (identifier "puVar3")) (; ";")) (if_statement "if (param_1 == 0x50) {\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }" (if "if") (parenthesized_expression "(param_1 == 0x50)" (( "(") (binary_expression "param_1 == 0x50" (identifier "param_1") (== "==") (number_literal "0x50")) () ")")) (compound_statement "{\n    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);\n    *param_4 = *puVar1;\n    return (uint *)(puVar1 + 1);\n  }" ({ "{") (expression_statement "puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);" (assignment_expression "puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8)" (identifier "puVar1") (= "=") (cast_expression "(undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8)" (( "(") (type_descriptor "undefined8 *" (type_identifier "undefined8") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8)" (( "(") (binary_expression "(ulong)((long)param_3 + 7U) & 0xfffffffffffffff8" (call_expression "(ulong)((long)param_3 + 7U)" (parenthesized_expression "(ulong)" (( "(") (identifier "ulong") () ")")) (argument_list "((long)param_3 + 7U)" (( "(") (binary_expression "(long)param_3 + 7U" (cast_expression "(long)param_3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "param_3")) (+ "+") (number_literal "7U")) () ")"))) (& "&") (number_literal "0xfffffffffffffff8")) () ")")))) (; ";")) (expression_statement "*param_4 = *puVar1;" (assignment_expression "*param_4 = *puVar1" (pointer_expression "*param_4" (* "*") (identifier "param_4")) (= "=") (pointer_expression "*puVar1" (* "*") (identifier "puVar1"))) (; ";")) (return_statement "return (uint *)(puVar1 + 1);" (return "return") (cast_expression "(uint *)(puVar1 + 1)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(puVar1 + 1)" (( "(") (binary_expression "puVar1 + 1" (identifier "puVar1") (+ "+") (number_literal "1")) () ")"))) (; ";")) (} "}"))) (switch_statement "switch(param_1 & 0xf) {\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    \n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }" (switch "switch") (parenthesized_expression "(param_1 & 0xf)" (( "(") (binary_expression "param_1 & 0xf" (identifier "param_1") (& "&") (number_literal "0xf")) () ")")) (compound_statement "{\n  case 0:\n  case 4:\n  case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;\n  case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;\n  case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;\n  default:\n                    \n    abort();\n  case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;\n  case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;\n  case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;\n  }" ({ "{") (case_statement "case 0:" (case "case") (number_literal "0") (: ":")) (case_statement "case 4:" (case "case") (number_literal "4") (: ":")) (case_statement "case 0xc:\n    pbVar7 = *(byte **)param_3;\n    puVar2 = param_3 + 2;\n    break;" (case "case") (number_literal "0xc") (: ":") (expression_statement "pbVar7 = *(byte **)param_3;" (assignment_expression "pbVar7 = *(byte **)param_3" (identifier "pbVar7") (= "=") (pointer_expression "*(byte **)param_3" (* "*") (cast_expression "(byte **)param_3" (( "(") (type_descriptor "byte **" (type_identifier "byte") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (identifier "param_3")))) (; ";")) (expression_statement "puVar2 = param_3 + 2;" (assignment_expression "puVar2 = param_3 + 2" (identifier "puVar2") (= "=") (binary_expression "param_3 + 2" (identifier "param_3") (+ "+") (number_literal "2"))) (; ";")) (break_statement "break;" (break "break") (; ";"))) (case_statement "case 1:\n    pbVar7 = (byte *)0x0;\n    bVar4 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');\n    break;" (case "case") (number_literal "1") (: ":") (expression_statement "pbVar7 = (byte *)0x0;" (assignment_expression "pbVar7 = (byte *)0x0" (identifier "pbVar7") (= "=") (cast_expression "(byte *)0x0" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) (; ";")) (expression_statement "bVar4 = 0;" (assignment_expression "bVar4 = 0" (identifier "bVar4") (= "=") (number_literal "0")) (; ";")) (expression_statement "puVar3 = param_3;" (assignment_expression "puVar3 = param_3" (identifier "puVar3") (= "=") (identifier "param_3")) (; ";")) (do_statement "do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    } while ((char)(byte)uVar6 < '\0');" (do "do") (compound_statement "{\n      puVar2 = (uint *)((long)puVar3 + 1);\n      uVar6 = *puVar3;\n      bVar5 = bVar4 & 0x3f;\n      bVar4 = bVar4 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);\n      puVar3 = puVar2;\n    }" ({ "{") (expression_statement "puVar2 = (uint *)((long)puVar3 + 1);" (assignment_expression "puVar2 = (uint *)((long)puVar3 + 1)" (identifier "puVar2") (= "=") (cast_expression "(uint *)((long)puVar3 + 1)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "((long)puVar3 + 1)" (( "(") (binary_expression "(long)puVar3 + 1" (cast_expression "(long)puVar3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "puVar3")) (+ "+") (number_literal "1")) () ")")))) (; ";")) (expression_statement "uVar6 = *puVar3;" (assignment_expression "uVar6 = *puVar3" (identifier "uVar6") (= "=") (pointer_expression "*puVar3" (* "*") (identifier "puVar3"))) (; ";")) (expression_statement "bVar5 = bVar4 & 0x3f;" (assignment_expression "bVar5 = bVar4 & 0x3f" (identifier "bVar5") (= "=") (binary_expression "bVar4 & 0x3f" (identifier "bVar4") (& "&") (number_literal "0x3f"))) (; ";")) (expression_statement "bVar4 = bVar4 + 7;" (assignment_expression "bVar4 = bVar4 + 7" (identifier "bVar4") (= "=") (binary_expression "bVar4 + 7" (identifier "bVar4") (+ "+") (number_literal "7"))) (; ";")) (expression_statement "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);" (assignment_expression "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5)" (identifier "pbVar7") (= "=") (cast_expression "(byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5)" (( "(") (binary_expression "(ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5" (cast_expression "(ulong)pbVar7" (( "(") (type_descriptor "ulong" (type_identifier "ulong")) () ")") (identifier "pbVar7")) (| "|") (binary_expression "(ulong)((byte)uVar6 & 0x7f) << bVar5" (call_expression "(ulong)((byte)uVar6 & 0x7f)" (parenthesized_expression "(ulong)" (( "(") (identifier "ulong") () ")")) (argument_list "((byte)uVar6 & 0x7f)" (( "(") (binary_expression "(byte)uVar6 & 0x7f" (cast_expression "(byte)uVar6" (( "(") (type_descriptor "byte" (type_identifier "byte")) () ")") (identifier "uVar6")) (& "&") (number_literal "0x7f")) () ")"))) (<< "<<") (identifier "bVar5"))) () ")")))) (; ";")) (expression_statement "puVar3 = puVar2;" (assignment_expression "puVar3 = puVar2" (identifier "puVar3") (= "=") (identifier "puVar2")) (; ";")) (} "}")) (while "while") (parenthesized_expression "((char)(byte)uVar6 < '\0')" (( "(") (binary_expression "(char)(byte)uVar6 < '\0'" (cast_expression "(char)(byte)uVar6" (( "(") (type_descriptor "char" (primitive_type "char")) () ")") (cast_expression "(byte)uVar6" (( "(") (type_descriptor "byte" (type_identifier "byte")) () ")") (identifier "uVar6"))) (< "<") (char_literal "'\0'" (' "'") (escape_sequence "\0") (' "'"))) () ")")) (; ";")) (break_statement "break;" (break "break") (; ";"))) (case_statement "case 2:\n    pbVar7 = (byte *)(ulong)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;" (case "case") (number_literal "2") (: ":") (expression_statement "pbVar7 = (byte *)(ulong)(ushort)*param_3;" (assignment_expression "pbVar7 = (byte *)(ulong)(ushort)*param_3" (identifier "pbVar7") (= "=") (binary_expression "(byte *)(ulong)(ushort)*param_3" (cast_expression "(byte *)(ulong)(ushort)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (call_expression "(ulong)(ushort)" (parenthesized_expression "(ulong)" (( "(") (identifier "ulong") () ")")) (argument_list "(ushort)" (( "(") (identifier "ushort") () ")")))) (* "*") (identifier "param_3"))) (; ";")) (expression_statement "puVar2 = (uint *)((long)param_3 + 2);" (assignment_expression "puVar2 = (uint *)((long)param_3 + 2)" (identifier "puVar2") (= "=") (cast_expression "(uint *)((long)param_3 + 2)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "((long)param_3 + 2)" (( "(") (binary_expression "(long)param_3 + 2" (cast_expression "(long)param_3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "param_3")) (+ "+") (number_literal "2")) () ")")))) (; ";")) (break_statement "break;" (break "break") (; ";"))) (case_statement "case 3:\n    pbVar7 = (byte *)(ulong)*param_3;\n    puVar2 = param_3 + 1;\n    break;" (case "case") (number_literal "3") (: ":") (expression_statement "pbVar7 = (byte *)(ulong)*param_3;" (assignment_expression "pbVar7 = (byte *)(ulong)*param_3" (identifier "pbVar7") (= "=") (binary_expression "(byte *)(ulong)*param_3" (cast_expression "(byte *)(ulong)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(ulong)" (( "(") (identifier "ulong") () ")"))) (* "*") (identifier "param_3"))) (; ";")) (expression_statement "puVar2 = param_3 + 1;" (assignment_expression "puVar2 = param_3 + 1" (identifier "puVar2") (= "=") (binary_expression "param_3 + 1" (identifier "param_3") (+ "+") (number_literal "1"))) (; ";")) (break_statement "break;" (break "break") (; ";"))) (case_statement "default:\n                    \n    abort();" (default "default") (: ":") (expression_statement "abort();" (call_expression "abort()" (identifier "abort") (argument_list "()" (( "(") () ")"))) (; ";"))) (case_statement "case 9:\n    pbVar7 = (byte *)0x0;\n    uVar6 = 0;\n    puVar3 = param_3;\n    do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');\n    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;\n    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));\n    goto LAB_0030504c;" (case "case") (number_literal "9") (: ":") (expression_statement "pbVar7 = (byte *)0x0;" (assignment_expression "pbVar7 = (byte *)0x0" (identifier "pbVar7") (= "=") (cast_expression "(byte *)0x0" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) (; ";")) (expression_statement "uVar6 = 0;" (assignment_expression "uVar6 = 0" (identifier "uVar6") (= "=") (number_literal "0")) (; ";")) (expression_statement "puVar3 = param_3;" (assignment_expression "puVar3 = param_3" (identifier "puVar3") (= "=") (identifier "param_3")) (; ";")) (do_statement "do {\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    } while ((char)bVar4 < '\0');" (do "do") (compound_statement "{\n      puVar2 = (uint *)((long)puVar3 + 1);\n      bVar4 = (byte)*puVar3;\n      bVar5 = (byte)uVar6;\n      uVar6 = uVar6 + 7;\n      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));\n      puVar3 = puVar2;\n    }" ({ "{") (expression_statement "puVar2 = (uint *)((long)puVar3 + 1);" (assignment_expression "puVar2 = (uint *)((long)puVar3 + 1)" (identifier "puVar2") (= "=") (cast_expression "(uint *)((long)puVar3 + 1)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "((long)puVar3 + 1)" (( "(") (binary_expression "(long)puVar3 + 1" (cast_expression "(long)puVar3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "puVar3")) (+ "+") (number_literal "1")) () ")")))) (; ";")) (expression_statement "bVar4 = (byte)*puVar3;" (assignment_expression "bVar4 = (byte)*puVar3" (identifier "bVar4") (= "=") (binary_expression "(byte)*puVar3" (parenthesized_expression "(byte)" (( "(") (identifier "byte") () ")")) (* "*") (identifier "puVar3"))) (; ";")) (expression_statement "bVar5 = (byte)uVar6;" (assignment_expression "bVar5 = (byte)uVar6" (identifier "bVar5") (= "=") (cast_expression "(byte)uVar6" (( "(") (type_descriptor "byte" (type_identifier "byte")) () ")") (identifier "uVar6"))) (; ";")) (expression_statement "uVar6 = uVar6 + 7;" (assignment_expression "uVar6 = uVar6 + 7" (identifier "uVar6") (= "=") (binary_expression "uVar6 + 7" (identifier "uVar6") (+ "+") (number_literal "7"))) (; ";")) (expression_statement "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));" (assignment_expression "pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f))" (identifier "pbVar7") (= "=") (cast_expression "(byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f))" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f))" (( "(") (binary_expression "(ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f)" (cast_expression "(ulong)pbVar7" (( "(") (type_descriptor "ulong" (type_identifier "ulong")) () ")") (identifier "pbVar7")) (| "|") (binary_expression "(ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f)" (call_expression "(ulong)(bVar4 & 0x7f)" (parenthesized_expression "(ulong)" (( "(") (identifier "ulong") () ")")) (argument_list "(bVar4 & 0x7f)" (( "(") (binary_expression "bVar4 & 0x7f" (identifier "bVar4") (& "&") (number_literal "0x7f")) () ")"))) (<< "<<") (parenthesized_expression "(bVar5 & 0x3f)" (( "(") (binary_expression "bVar5 & 0x3f" (identifier "bVar5") (& "&") (number_literal "0x3f")) () ")")))) () ")")))) (; ";")) (expression_statement "puVar3 = puVar2;" (assignment_expression "puVar3 = puVar2" (identifier "puVar3") (= "=") (identifier "puVar2")) (; ";")) (} "}")) (while "while") (parenthesized_expression "((char)bVar4 < '\0')" (( "(") (binary_expression "(char)bVar4 < '\0'" (cast_expression "(char)bVar4" (( "(") (type_descriptor "char" (primitive_type "char")) () ")") (identifier "bVar4")) (< "<") (char_literal "'\0'" (' "'") (escape_sequence "\0") (' "'"))) () ")")) (; ";")) (if_statement "if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;" (if "if") (parenthesized_expression "((0x3f < uVar6) || ((bVar4 & 0x40) == 0))" (( "(") (binary_expression "(0x3f < uVar6) || ((bVar4 & 0x40) == 0)" (parenthesized_expression "(0x3f < uVar6)" (( "(") (binary_expression "0x3f < uVar6" (number_literal "0x3f") (< "<") (identifier "uVar6")) () ")")) (|| "||") (parenthesized_expression "((bVar4 & 0x40) == 0)" (( "(") (binary_expression "(bVar4 & 0x40) == 0" (parenthesized_expression "(bVar4 & 0x40)" (( "(") (binary_expression "bVar4 & 0x40" (identifier "bVar4") (& "&") (number_literal "0x40")) () ")")) (== "==") (number_literal "0")) () ")"))) () ")")) (break_statement "break;" (break "break") (; ";"))) (expression_statement "pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));" (assignment_expression "pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f))" (identifier "pbVar7") (= "=") (cast_expression "(byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f))" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f))" (( "(") (binary_expression "(ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f)" (cast_expression "(ulong)pbVar7" (( "(") (type_descriptor "ulong" (type_identifier "ulong")) () ")") (identifier "pbVar7")) (| "|") (binary_expression "-1L << ((byte)uVar6 & 0x3f)" (number_literal "-1L") (<< "<<") (parenthesized_expression "((byte)uVar6 & 0x3f)" (( "(") (binary_expression "(byte)uVar6 & 0x3f" (cast_expression "(byte)uVar6" (( "(") (type_descriptor "byte" (type_identifier "byte")) () ")") (identifier "uVar6")) (& "&") (number_literal "0x3f")) () ")")))) () ")")))) (; ";")) (goto_statement "goto LAB_0030504c;" (goto "goto") (statement_identifier "LAB_0030504c") (; ";"))) (case_statement "case 10:\n    pbVar7 = (byte *)(long)(short)(ushort)*param_3;\n    puVar2 = (uint *)((long)param_3 + 2);\n    break;" (case "case") (number_literal "10") (: ":") (expression_statement "pbVar7 = (byte *)(long)(short)(ushort)*param_3;" (assignment_expression "pbVar7 = (byte *)(long)(short)(ushort)*param_3" (identifier "pbVar7") (= "=") (binary_expression "(byte *)(long)(short)(ushort)*param_3" (cast_expression "(byte *)(long)(short)(ushort)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (cast_expression "(long)(short)(ushort)" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (cast_expression "(short)(ushort)" (( "(") (type_descriptor "short" (sized_type_specifier "short" (short "short"))) () ")") (parenthesized_expression "(ushort)" (( "(") (identifier "ushort") () ")"))))) (* "*") (identifier "param_3"))) (; ";")) (expression_statement "puVar2 = (uint *)((long)param_3 + 2);" (assignment_expression "puVar2 = (uint *)((long)param_3 + 2)" (identifier "puVar2") (= "=") (cast_expression "(uint *)((long)param_3 + 2)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "((long)param_3 + 2)" (( "(") (binary_expression "(long)param_3 + 2" (cast_expression "(long)param_3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "param_3")) (+ "+") (number_literal "2")) () ")")))) (; ";")) (break_statement "break;" (break "break") (; ";"))) (case_statement "case 0xb:\n    pbVar7 = (byte *)(long)(int)*param_3;\n    puVar2 = param_3 + 1;" (case "case") (number_literal "0xb") (: ":") (expression_statement "pbVar7 = (byte *)(long)(int)*param_3;" (assignment_expression "pbVar7 = (byte *)(long)(int)*param_3" (identifier "pbVar7") (= "=") (cast_expression "(byte *)(long)(int)*param_3" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (cast_expression "(long)(int)*param_3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (cast_expression "(int)*param_3" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (pointer_expression "*param_3" (* "*") (identifier "param_3")))))) (; ";")) (expression_statement "puVar2 = param_3 + 1;" (assignment_expression "puVar2 = param_3 + 1" (identifier "puVar2") (= "=") (binary_expression "param_3 + 1" (identifier "param_3") (+ "+") (number_literal "1"))) (; ";"))) (} "}"))) (if_statement "if (pbVar7 != (byte *)0x0) {\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }" (if "if") (parenthesized_expression "(pbVar7 != (byte *)0x0)" (( "(") (binary_expression "pbVar7 != (byte *)0x0" (identifier "pbVar7") (!= "!=") (cast_expression "(byte *)0x0" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (compound_statement "{\nLAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }\n    pbVar7 = pbVar7 + (long)param_2;\n    if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }\n  }" ({ "{") (labeled_statement "LAB_0030504c:\n    if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }" (statement_identifier "LAB_0030504c") (: ":") (if_statement "if ((param_1 & 0x70) == 0x10) {\n      param_2 = param_3;\n    }" (if "if") (parenthesized_expression "((param_1 & 0x70) == 0x10)" (( "(") (binary_expression "(param_1 & 0x70) == 0x10" (parenthesized_expression "(param_1 & 0x70)" (( "(") (binary_expression "param_1 & 0x70" (identifier "param_1") (& "&") (number_literal "0x70")) () ")")) (== "==") (number_literal "0x10")) () ")")) (compound_statement "{\n      param_2 = param_3;\n    }" ({ "{") (expression_statement "param_2 = param_3;" (assignment_expression "param_2 = param_3" (identifier "param_2") (= "=") (identifier "param_3")) (; ";")) (} "}")))) (expression_statement "pbVar7 = pbVar7 + (long)param_2;" (assignment_expression "pbVar7 = pbVar7 + (long)param_2" (identifier "pbVar7") (= "=") (binary_expression "pbVar7 + (long)param_2" (identifier "pbVar7") (+ "+") (cast_expression "(long)param_2" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "param_2")))) (; ";")) (if_statement "if ((char)param_1 < '\0') {\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }" (if "if") (parenthesized_expression "((char)param_1 < '\0')" (( "(") (binary_expression "(char)param_1 < '\0'" (cast_expression "(char)param_1" (( "(") (type_descriptor "char" (primitive_type "char")) () ")") (identifier "param_1")) (< "<") (char_literal "'\0'" (' "'") (escape_sequence "\0") (' "'"))) () ")")) (compound_statement "{\n      *param_4 = *(undefined8 *)pbVar7;\n      return puVar2;\n    }" ({ "{") (expression_statement "*param_4 = *(undefined8 *)pbVar7;" (assignment_expression "*param_4 = *(undefined8 *)pbVar7" (pointer_expression "*param_4" (* "*") (identifier "param_4")) (= "=") (pointer_expression "*(undefined8 *)pbVar7" (* "*") (cast_expression "(undefined8 *)pbVar7" (( "(") (type_descriptor "undefined8 *" (type_identifier "undefined8") (abstract_pointer_declarator "*" (* "*"))) () ")") (identifier "pbVar7")))) (; ";")) (return_statement "return puVar2;" (return "return") (identifier "puVar2") (; ";")) (} "}"))) (} "}"))) (expression_statement "*param_4 = pbVar7;" (assignment_expression "*param_4 = pbVar7" (pointer_expression "*param_4" (* "*") (identifier "param_4")) (= "=") (identifier "pbVar7")) (; ";")) (return_statement "return puVar2;" (return "return") (identifier "puVar2") (; ";")) (} "}")))

/* WARNING: Type propagation algorithm not settling */

type_1 * function_1(type_2 var_1,type_1 *param_2,type_1 *var_3,type_3 *param_4)

{
  type_3 *var_2;
  type_1 *puVar2;
  type_2 var_4;
  type_2 var_5;
  type_1 var_8;
  type_2 *var_9;
  type_1 *var_7;
  
  if (var_1 == 0x50) {
    var_2 = (type_3 *)((type_4)((long)var_3 + 7U) & 0xfffffffffffffff8);
    *param_4 = *var_2;
    return (type_1 *)(var_2 + 1);
  }
  switch(var_1 & 0xf) {
  case 0:
  case 4:
  case 0xc:
    var_9 = *(type_2 **)var_3;
    puVar2 = var_3 + 2;
    break;
  case 1:
    var_9 = (type_2 *)0x0;
    var_4 = 0;
    var_7 = var_3;
    do {
      puVar2 = (type_1 *)((long)var_7 + 1);
      var_8 = *var_7;
      var_5 = var_4 & 0x3f;
      var_4 = var_4 + 7;
      var_9 = (type_2 *)((type_4)var_9 | (type_4)((type_2)var_8 & 0x7f) << var_5);
      var_7 = puVar2;
    } while ((char)(type_2)var_8 < '\0');
    break;
  case 2:
    var_9 = (type_2 *)(type_4)(ushort)*var_3;
    puVar2 = (type_1 *)((long)var_3 + 2);
    break;
  case 3:
    var_9 = (type_2 *)(type_4)*var_3;
    puVar2 = var_3 + 1;
    break;
  default:
                    /* WARNING: Subroutine does not return */
    var_6();
  case 9:
    var_9 = (type_2 *)0x0;
    var_8 = 0;
    var_7 = var_3;
    do {
      puVar2 = (type_1 *)((long)var_7 + 1);
      var_4 = (type_2)*var_7;
      var_5 = (type_2)var_8;
      var_8 = var_8 + 7;
      var_9 = (type_2 *)((type_4)var_9 | (type_4)(var_4 & 0x7f) << (var_5 & 0x3f));
      var_7 = puVar2;
    } while ((char)var_4 < '\0');
    if ((0x3f < var_8) || ((var_4 & 0x40) == 0)) break;
    var_9 = (type_2 *)((type_4)var_9 | -1L << ((type_2)var_8 & 0x3f));
    goto LAB_0030504c;
  case 10:
    var_9 = (type_2 *)(long)(short)(ushort)*var_3;
    puVar2 = (type_1 *)((long)var_3 + 2);
    break;
  case 0xb:
    var_9 = (type_2 *)(long)(int)*var_3;
    puVar2 = var_3 + 1;
  }
  if (var_9 != (type_2 *)0x0) {
LAB_0030504c:
    if ((var_1 & 0x70) == 0x10) {
      param_2 = var_3;
    }
    var_9 = var_9 + (long)param_2;
    if ((char)var_1 < '\0') {
      *param_4 = *(type_3 *)var_9;
      return puVar2;
    }
  }
  *param_4 = var_9;
  return puVar2;
}


(translation_unit (function_definition type: (type_identifier) declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (type_identifier) declarator: (identifier)) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier)))))) body: (compound_statement (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (call_expression function: (parenthesized_expression (identifier)) arguments: (argument_list (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)) right: (number_literal)))) right: (number_literal)))))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (pointer_expression argument: (identifier)))) (return_statement (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) (switch_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) body: (compound_statement (case_statement value: (number_literal)) (case_statement value: (number_literal)) (case_statement value: (number_literal) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (identifier))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (break_statement)) (case_statement value: (number_literal) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (do_statement body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)) right: (number_literal)))))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (binary_expression left: (call_expression function: (parenthesized_expression (identifier)) arguments: (argument_list (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (number_literal)))) right: (identifier))))))) (expression_statement (assignment_expression left: (identifier) right: (identifier)))) condition: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (primitive_type)) value: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier))) right: (char_literal (escape_sequence))))) (break_statement)) (case_statement value: (number_literal) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (call_expression function: (parenthesized_expression (identifier)) arguments: (argument_list (identifier)))) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)) right: (number_literal)))))) (break_statement)) (case_statement value: (number_literal) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (identifier))) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (break_statement)) (case_statement (expression_statement (call_expression function: (identifier) arguments: (argument_list)))) (case_statement value: (number_literal) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (do_statement body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)) right: (number_literal)))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (parenthesized_expression (identifier)) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (binary_expression left: (call_expression function: (parenthesized_expression (identifier)) arguments: (argument_list (binary_expression left: (identifier) right: (number_literal)))) right: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))))) (expression_statement (assignment_expression left: (identifier) right: (identifier)))) condition: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (primitive_type)) value: (identifier)) right: (char_literal (escape_sequence))))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) right: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (number_literal))))) consequence: (break_statement)) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (binary_expression left: (number_literal) right: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (number_literal))))))))) (goto_statement label: (statement_identifier))) (case_statement value: (number_literal) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (parenthesized_expression (identifier))))) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)) right: (number_literal)))))) (break_statement)) (case_statement value: (number_literal) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (cast_expression type: (type_descriptor type: (primitive_type)) value: (pointer_expression argument: (identifier))))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (number_literal)))) consequence: (compound_statement (labeled_statement label: (statement_identifier) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (identifier)))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier))))) (if_statement condition: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (primitive_type)) value: (identifier)) right: (char_literal (escape_sequence)))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (identifier))))) (return_statement (identifier)))))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (identifier))) (return_statement (identifier)))))

/* WARNING: Type propagation algorithm not settling */

uint * MASKED(byte param_1,uint *param_2,uint *param_3,undefined8 *param_4)

{
  undefined8 *puVar1;
  uint *puVar2;
  byte bVar4;
  byte bVar5;
  uint uVar6;
  byte *pbVar7;
  uint *puVar3;
  
  if (param_1 == 0x50) {
    puVar1 = (undefined8 *)((ulong)((long)param_3 + 7U) & 0xfffffffffffffff8);
    *param_4 = *puVar1;
    return (uint *)(puVar1 + 1);
  }
  switch(param_1 & 0xf) {
  case 0:
  case 4:
  case 0xc:
    pbVar7 = *(byte **)param_3;
    puVar2 = param_3 + 2;
    break;
  case 1:
    pbVar7 = (byte *)0x0;
    bVar4 = 0;
    puVar3 = param_3;
    do {
      puVar2 = (uint *)((long)puVar3 + 1);
      uVar6 = *puVar3;
      bVar5 = bVar4 & 0x3f;
      bVar4 = bVar4 + 7;
      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)((byte)uVar6 & 0x7f) << bVar5);
      puVar3 = puVar2;
    } while ((char)(byte)uVar6 < '\0');
    break;
  case 2:
    pbVar7 = (byte *)(ulong)(ushort)*param_3;
    puVar2 = (uint *)((long)param_3 + 2);
    break;
  case 3:
    pbVar7 = (byte *)(ulong)*param_3;
    puVar2 = param_3 + 1;
    break;
  default:
                    /* WARNING: Subroutine does not return */
    abort();
  case 9:
    pbVar7 = (byte *)0x0;
    uVar6 = 0;
    puVar3 = param_3;
    do {
      puVar2 = (uint *)((long)puVar3 + 1);
      bVar4 = (byte)*puVar3;
      bVar5 = (byte)uVar6;
      uVar6 = uVar6 + 7;
      pbVar7 = (byte *)((ulong)pbVar7 | (ulong)(bVar4 & 0x7f) << (bVar5 & 0x3f));
      puVar3 = puVar2;
    } while ((char)bVar4 < '\0');
    if ((0x3f < uVar6) || ((bVar4 & 0x40) == 0)) break;
    pbVar7 = (byte *)((ulong)pbVar7 | -1L << ((byte)uVar6 & 0x3f));
    goto LAB_0030504c;
  case 10:
    pbVar7 = (byte *)(long)(short)(ushort)*param_3;
    puVar2 = (uint *)((long)param_3 + 2);
    break;
  case 0xb:
    pbVar7 = (byte *)(long)(int)*param_3;
    puVar2 = param_3 + 1;
  }
  if (pbVar7 != (byte *)0x0) {
LAB_0030504c:
    if ((param_1 & 0x70) == 0x10) {
      param_2 = param_3;
    }
    pbVar7 = pbVar7 + (long)param_2;
    if ((char)param_1 < '\0') {
      *param_4 = *(undefined8 *)pbVar7;
      return puVar2;
    }
  }
  *param_4 = pbVar7;
  return puVar2;
}

