### FUNC _FINI_0 @ 00026594

void _FINI_0(void)

{
  __cxa_finalize(&DAT_0006b000);
  return;
}



### FUNC _INIT_0 @ 000265a4

void _INIT_0(void)

{
  CFunctions::CFunctions((CFunctions *)theFunc);
  __cxa_atexit(CFunctions::~CFunctions,theFunc,&DAT_0006b000);
  return;
}



### FUNC _INIT_1 @ 000265d4

void _INIT_1(void)

{
  int iVar1;
  
  iVar1 = pthread_key_create(&DAT_00070a18,(__destr_function *)0x30b41);
  if (iVar1 == 0) {
    DAT_00070a1c = 0xc;
    DAT_00070a20 = 0x155;
    DAT_00070a24 = 0xffc;
    pthread_mutex_init((pthread_mutex_t *)&DAT_00070a28,(pthread_mutexattr_t *)0x0);
    DAT_00070a2c = 0;
    DAT_00070a30 = 0;
    __cxa_atexit(0x30611,&DAT_00070a14,&DAT_0006b000);
    return;
  }
                    /* WARNING: Subroutine does not return */
  FUN_00030e78("Can\'t allocate C++ runtime pthread_key_t");
}



### FUNC _INIT_2 @ 0002666c

void _INIT_2(void)

{
  std::ios_base::Init::Init((Init *)&DAT_00070d78);
  __cxa_atexit(std::ios_base::Init::~Init,&DAT_00070d78,&DAT_0006b000);
  return;
}



### FUNC _INIT_3 @ 00026698

void _INIT_3(void)

{
  pthread_mutex_init((pthread_mutex_t *)&DAT_00070de0,(pthread_mutexattr_t *)0x0);
  __cxa_atexit(0x4cde5,&DAT_00070de0,&DAT_0006b000);
  return;
}



### FUNC CAccumulator @ 000266f0

/* CAccumulator::CAccumulator() */

CAccumulator * __thiscall CAccumulator::CAccumulator(CAccumulator *this)

{
  *(undefined ***)this = &PTR__CAccumulator_00068c28;
  __aeabi_memclr4(this + 4,0x1c);
  return this;
}



### FUNC ~CAccumulator @ 00026710

/* CAccumulator::~CAccumulator() */

CAccumulator * __thiscall CAccumulator::~CAccumulator(CAccumulator *this)

{
  *(undefined ***)this = &PTR__CAccumulator_00068c28;
  if (*(void **)(this + 4) != (void *)0x0) {
    operator_delete__(*(void **)(this + 4));
    *(undefined4 *)(this + 4) = 0;
  }
  *(undefined4 *)(this + 8) = 0;
  if (*(void **)(this + 0xc) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0xc));
    *(undefined4 *)(this + 0xc) = 0;
  }
  return this;
}



### FUNC ~CAccumulator @ 00026748

/* CAccumulator::~CAccumulator() */

void __thiscall CAccumulator::~CAccumulator(CAccumulator *this)

{
  void *pvVar1;
  
  pvVar1 = (void *)~CAccumulator(this);
  operator_delete(pvVar1);
  return;
}



### FUNC Reset @ 00026756

/* CAccumulator::Reset(unsigned int, unsigned int, unsigned int) */

undefined4 __thiscall CAccumulator::Reset(CAccumulator *this,uint param_1,uint param_2,uint param_3)

{
  void *pvVar1;
  uint uVar2;
  undefined4 uVar3;
  undefined8 uVar4;
  
  uVar3 = 0;
  *(undefined4 *)(this + 0x1c) = 0;
  if (*(void **)(this + 4) != (void *)0x0) {
    operator_delete__(*(void **)(this + 4));
    *(undefined4 *)(this + 4) = 0;
  }
  *(undefined4 *)(this + 8) = 0;
  if (*(void **)(this + 0xc) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0xc));
    *(undefined4 *)(this + 0xc) = 0;
  }
  if (((param_1 != 0) && (param_2 < 0x41)) && ((param_2 - 1 & param_2) == 0)) {
    *(undefined4 *)(this + 0x10) = 0;
    *(uint *)(this + 0x14) = param_1;
    *(uint *)(this + 0x18) = param_2;
    uVar4 = __muldi3((param_3 + 3 >> 2) + (param_1 >> 1 & 0x3fffffff),0,4,0);
    uVar2 = 0xffffffff;
    if ((int)((ulonglong)uVar4 >> 0x20) == 0) {
      uVar2 = (uint)uVar4;
    }
    pvVar1 = operator_new__(uVar2);
    *(void **)(this + 4) = pvVar1;
    *(uint *)(this + 8) = (int)pvVar1 + (param_3 & 0xfffffffe);
    if (2 < param_2) {
      uVar4 = __muldi3(param_1,0,4,(int)param_1 >> 0x1f);
      uVar2 = 0xffffffff;
      if ((int)((ulonglong)uVar4 >> 0x20) == 0) {
        uVar2 = (uint)uVar4;
      }
      pvVar1 = operator_new__(uVar2);
      *(void **)(this + 0xc) = pvVar1;
    }
    uVar3 = 1;
    *(undefined4 *)(this + 0x1c) = 1;
  }
  return uVar3;
}



### FUNC PushFrame @ 0002680e

/* CAccumulator::PushFrame(unsigned short const*) */

bool __thiscall CAccumulator::PushFrame(CAccumulator *this,ushort *param_1)

{
  ushort uVar1;
  uint *puVar2;
  undefined2 *puVar3;
  ushort *puVar4;
  int iVar5;
  uint uVar6;
  int iVar7;
  
  if (*(int *)(this + 0x1c) == 0) {
    return false;
  }
  iVar7 = *(int *)(this + 0x10);
  *(int *)(this + 0x10) = iVar7 + 1;
  iVar5 = *(int *)(this + 0x18);
  if (iVar5 == 2) {
    if (iVar7 != 0) {
      if (*(uint *)(this + 0x14) >> 2 != 0) {
        iVar5 = -(*(uint *)(this + 0x14) >> 2);
        puVar4 = *(ushort **)(this + 8);
        do {
          *puVar4 = (ushort)((uint)*param_1 + (uint)*puVar4 >> 1);
          puVar4[1] = (ushort)((uint)param_1[1] + (uint)puVar4[1] >> 1);
          puVar4[2] = (ushort)((uint)param_1[2] + (uint)puVar4[2] >> 1);
          puVar4[3] = (ushort)((uint)param_1[3] + (uint)puVar4[3] >> 1);
          param_1 = param_1 + 4;
          puVar4 = puVar4 + 4;
          iVar5 = iVar5 + 1;
        } while (iVar5 != 0);
      }
      goto LAB_000268a0;
    }
  }
  else if (iVar5 != 1) {
    puVar2 = *(uint **)(this + 0xc);
    if (iVar7 == 0) {
      if (*(uint *)(this + 0x14) >> 2 != 0) {
        iVar5 = -(*(uint *)(this + 0x14) >> 2);
        do {
          *puVar2 = (uint)*param_1;
          puVar2[1] = (uint)param_1[1];
          puVar2[2] = (uint)param_1[2];
          puVar2[3] = (uint)param_1[3];
          puVar2 = puVar2 + 4;
          param_1 = param_1 + 4;
          iVar5 = iVar5 + 1;
        } while (iVar5 != 0);
      }
      goto LAB_000268a0;
    }
    if (iVar7 + 1 != iVar5) {
      if (*(uint *)(this + 0x14) >> 2 != 0) {
        iVar5 = -(*(uint *)(this + 0x14) >> 2);
        do {
          *puVar2 = *puVar2 + (uint)*param_1;
          puVar2[1] = puVar2[1] + (uint)param_1[1];
          puVar2[2] = puVar2[2] + (uint)param_1[2];
          puVar2[3] = puVar2[3] + (uint)param_1[3];
          puVar2 = puVar2 + 4;
          param_1 = param_1 + 4;
          iVar5 = iVar5 + 1;
        } while (iVar5 != 0);
      }
      goto LAB_000268a0;
    }
    puVar3 = *(undefined2 **)(this + 8);
    iVar5 = 2;
    if (iVar7 < 0xf) {
      if (iVar7 != 3) {
        if (iVar7 == 7) {
          iVar5 = 3;
        }
        else {
LAB_0002691e:
          iVar5 = 0;
        }
      }
    }
    else if (iVar7 == 0xf) {
      iVar5 = 4;
    }
    else if (iVar7 == 0x1f) {
      iVar5 = 5;
    }
    else {
      if (iVar7 != 0x3f) goto LAB_0002691e;
      iVar5 = 6;
    }
    for (iVar7 = *(int *)(this + 0x14); iVar7 != 0; iVar7 = iVar7 + -1) {
      uVar1 = *param_1;
      uVar6 = *puVar2;
      *puVar3 = (short)(uVar6 + uVar1 >> iVar5);
      *puVar2 = uVar6 + uVar1;
      puVar2 = puVar2 + 1;
      puVar3 = puVar3 + 1;
      param_1 = param_1 + 1;
    }
    goto LAB_000268a0;
  }
  __aeabi_memcpy(*(undefined4 *)(this + 8),param_1,*(int *)(this + 0x14) << 1);
LAB_000268a0:
  iVar5 = *(int *)(this + 0x10);
  if (iVar5 == *(int *)(this + 0x18)) {
    *(undefined4 *)(this + 0x10) = 0;
  }
  return iVar5 == *(int *)(this + 0x18);
}



### FUNC Restart @ 0002693e

/* CAccumulator::Restart() */

void __thiscall CAccumulator::Restart(CAccumulator *this)

{
  if (*(int *)(this + 0x1c) != 0) {
    *(undefined4 *)(this + 0x10) = 0;
  }
  return;
}



### FUNC GetTickCount @ 0002694c

/* WARNING: Unknown calling convention -- yet parameter storage is locked */
/* GetTickCount() */

void GetTickCount(void)

{
  int iVar1;
  timespec local_1c;
  int local_14;
  
  local_14 = __stack_chk_guard;
  clock_gettime(1,&local_1c);
  iVar1 = __divsi3(local_1c.tv_nsec,1000000);
  if (__stack_chk_guard == local_14) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail(iVar1 + local_1c.tv_sec * 1000);
}



### FUNC Sleep @ 00026998

/* Sleep(int) */

void Sleep(int param_1)

{
  usleep(param_1 * 1000);
  return;
}



### FUNC GetLocalTime @ 000269a8

/* GetLocalTime(_SYSTEMTIME*) */

void GetLocalTime(_SYSTEMTIME *param_1)

{
  tm *ptVar1;
  int iVar2;
  time_t tStack_18;
  int local_14;
  
  local_14 = __stack_chk_guard;
  time(&tStack_18);
  ptVar1 = localtime(&tStack_18);
  *(short *)param_1 = (short)ptVar1->tm_year + 0x76c;
  *(short *)(param_1 + 2) = (short)ptVar1->tm_mon + 1;
  *(short *)(param_1 + 4) = (short)ptVar1->tm_wday;
  *(short *)(param_1 + 6) = (short)ptVar1->tm_mday;
  *(short *)(param_1 + 8) = (short)ptVar1->tm_hour;
  *(short *)(param_1 + 10) = (short)ptVar1->tm_min;
  iVar2 = ptVar1->tm_sec;
  *(undefined2 *)(param_1 + 0xe) = 400;
  *(short *)(param_1 + 0xc) = (short)iVar2;
  if (__stack_chk_guard == local_14) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC CFunctions @ 00026a14

/* CFunctions::CFunctions() */

CFunctions * __thiscall CFunctions::CFunctions(CFunctions *this)

{
  *(undefined ***)this = &PTR__CFunctions_00068c40;
  MutexLock::MutexLock((MutexLock *)(this + 0xb0));
  CAccumulator::CAccumulator((CAccumulator *)(this + 0x3784));
  CAccumulator::CAccumulator((CAccumulator *)(this + 0x37a4));
  CSmoother::CSmoother((CSmoother *)(this + 0x37c4));
  __aeabi_memclr4(this + 4,0xac);
  __aeabi_memclr4(this + 0xb4,0x18);
  __aeabi_memclr4(this + 0x2d1c,0xa68);
  __aeabi_memclr4(this + 0x37ec,0x1910);
  *(undefined4 *)(this + 0x5100) = 0xffff3cb0;
  *(undefined4 *)(this + 0x50fc) = 8;
  *(undefined4 *)(this + 0x5104) = 3;
  SetColorPalette(this,0);
  gLogFile = fopen("/sdcard/magnity/Cx/log/sdklog.txt","a+");
  if (gLogFile != (FILE *)0x0) {
    mag::Logging::Setfp((__sFILE *)gLogFile);
  }
  return this;
}



### FUNC MutexLock @ 00026b38

/* MutexLock::MutexLock() */

MutexLock * __thiscall MutexLock::MutexLock(MutexLock *this)

{
  int iVar1;
  undefined4 *puVar2;
  pthread_mutexattr_t pStack_18;
  int local_14;
  
  local_14 = __stack_chk_guard;
  iVar1 = pthread_mutexattr_init(&pStack_18);
  if (iVar1 == 0) {
    iVar1 = pthread_mutexattr_settype(&pStack_18,1);
    if (iVar1 == 0) {
      iVar1 = pthread_mutex_init((pthread_mutex_t *)this,&pStack_18);
      if (iVar1 == 0) {
        iVar1 = pthread_mutexattr_destroy(&pStack_18);
        if (iVar1 == 0) {
          if (__stack_chk_guard == local_14) {
            return this;
          }
                    /* WARNING: Subroutine does not return */
          __stack_chk_fail();
        }
        puVar2 = (undefined4 *)FUN_00030824(4);
        *puVar2 = "pthread_mutexattr_destroy failed\n";
      }
      else {
        puVar2 = (undefined4 *)FUN_00030824(4);
        *puVar2 = "pthread_mutex_init failed\n";
      }
    }
    else {
      puVar2 = (undefined4 *)FUN_00030824(4);
      *puVar2 = "pthread_mutexattr_settype failed\n";
    }
  }
  else {
    puVar2 = (undefined4 *)FUN_00030824(4);
    *puVar2 = "pthread_mutexattr_init failed\n";
  }
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(puVar2,&Error::typeinfo,0);
}



### FUNC SetColorPalette @ 00026c70

/* CFunctions::SetColorPalette(ColorPalette) */

void __thiscall CFunctions::SetColorPalette(CFunctions *this,undefined4 param_2)

{
  CFunctions CVar1;
  char cVar2;
  undefined4 *puVar3;
  uint uVar4;
  int iVar5;
  CFunctions CVar6;
  CFunctions *pCVar7;
  CFunctions *pCVar8;
  pthread_mutex_t *__mutex;
  int iVar9;
  uint uVar10;
  int iVar11;
  int iVar12;
  uint uVar13;
  bool bVar14;
  int local_40;
  int local_3c;
  
  *(undefined4 *)(this + 0x5108) = param_2;
  __mutex = (pthread_mutex_t *)(this + 0xb0);
  pthread_mutex_lock(__mutex);
  pCVar7 = this + 0x20cc;
  iVar11 = 0xff;
  local_3c = -0xe0;
  pCVar8 = (CFunctions *)0xffffff20;
  switch(param_2) {
  case 0:
    pCVar8 = this + 0x20cc;
    iVar11 = 0;
    pCVar7 = (CFunctions *)0x100;
    do {
      CVar1 = SUB41(iVar11,0);
      pCVar8[1] = CVar1;
      pCVar8[2] = CVar1;
      *pCVar8 = CVar1;
      pCVar8[3] = (CFunctions)0x0;
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + 1;
    } while (iVar11 != 0x100);
    switchD_00026cd2::caseD_b();
  default:
    pthread_mutex_unlock(__mutex);
    puVar3 = (undefined4 *)__errno();
    *puVar3 = 0xe4ae0001;
    FUN_00027744();
    pCVar8 = pCVar7;
  case 1:
    pCVar7 = this + 0x20cc;
    iVar11 = 0x100;
    do {
      pCVar7[3] = (CFunctions)0x0;
      iVar11 = iVar11 + -1;
      CVar1 = SUB41(iVar11,0);
      pCVar7[1] = CVar1;
      pCVar7[2] = CVar1;
      *pCVar7 = CVar1;
      pCVar7 = pCVar7 + 4;
    } while (iVar11 != 0);
    switchD_00026cd2::caseD_b();
  case 2:
    pCVar8 = pCVar8 + 0x88;
    iVar11 = 0;
    do {
      pCVar7 = this + 0x20cc + (int)pCVar8;
      pCVar7[0x59] = (CFunctions)0x0;
      pCVar7[0x5a] = (CFunctions)0x0;
      CVar1 = (CFunctions)__udivsi3(iVar11,0x16);
      pCVar7[0x58] = CVar1;
      pCVar7[0x5b] = (CFunctions)0x0;
      iVar11 = iVar11 + 0x75;
      pCVar8 = pCVar8 + 4;
    } while (pCVar8 != (CFunctions *)0x0);
    pCVar8 = this + 0x2124;
    iVar11 = 0x47;
    iVar9 = 0;
    iVar5 = 0;
    do {
      pCVar8[1] = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      CVar1 = (CFunctions)__udivsi3(iVar5,0x47);
      pCVar8[2] = CVar1;
      local_40 = 0x47;
      cVar2 = __udivsi3(iVar9,0x47);
      *pCVar8 = (CFunctions)(cVar2 + 'u');
      pCVar8 = pCVar8 + 4;
      iVar5 = iVar5 + 0xbc;
      iVar9 = iVar9 + 0x25;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    iVar11 = -0x74;
    iVar12 = 0;
    iVar5 = 0;
    iVar9 = 0;
    do {
      CVar1 = (CFunctions)__udivsi3(iVar5,0x94);
      this[iVar11 + 0x22b5] = CVar1;
      this[iVar11 + 0x22b7] = (CFunctions)0x0;
      cVar2 = __udivsi3(iVar9);
      this[iVar11 + 0x22b6] = (CFunctions)(cVar2 + -0x44);
      cVar2 = __divsi3(iVar12,0x1d);
      this[iVar11 + 0x22b4] = (CFunctions)(cVar2 + -0x66);
      iVar5 = iVar5 + 0xff;
      iVar9 = iVar9 + 0x27;
      iVar12 = iVar12 + -0x3b;
      iVar11 = iVar11 + 4;
    } while (iVar11 != 0);
    iVar11 = -0x48;
    iVar12 = 0;
    iVar5 = 0x1ce3;
    iVar9 = 0;
    do {
      CVar1 = (CFunctions)__udivsi3(iVar5,0x94);
      this[iVar11 + 0x22fd] = CVar1;
      this[iVar11 + 0x22ff] = (CFunctions)0x0;
      cVar2 = __udivsi3(iVar9,0x1e);
      this[iVar11 + 0x22fe] = (CFunctions)(cVar2 + -0x1d);
      cVar2 = __divsi3(iVar12,0x12);
      this[iVar11 + 0x22fc] = (CFunctions)(cVar2 + '_');
      iVar5 = iVar5 + 0xff;
      iVar9 = iVar9 + 0x1c;
      iVar12 = iVar12 + -0x50;
      iVar11 = iVar11 + 4;
    } while (iVar11 != 0);
    iVar11 = -0x30;
    iVar5 = 0x1f8;
    iVar9 = 0x2ed1;
    do {
      CVar1 = (CFunctions)__udivsi3(iVar9,0x94);
      this[iVar11 + 0x232d] = CVar1;
      this[iVar11 + 0x232c] = (CFunctions)0xf;
      this[iVar11 + 0x232f] = (CFunctions)0x0;
      cVar2 = __udivsi3(iVar5,0x1e);
      this[iVar11 + 0x232e] = (CFunctions)(cVar2 + -0x1d);
      iVar9 = iVar9 + 0xff;
      iVar5 = iVar5 + 0x1c;
      iVar11 = iVar11 + 4;
    } while (iVar11 != 0);
    pCVar8 = this + 0x232c;
    iVar11 = 0x3ac5;
    do {
      pCVar8[2] = (CFunctions)0xff;
      *pCVar8 = (CFunctions)0xf;
      pCVar8[3] = (CFunctions)0x0;
      CVar1 = (CFunctions)__udivsi3(iVar11,0x94);
      pCVar8[1] = CVar1;
      iVar11 = iVar11 + 0xff;
      pCVar8 = pCVar8 + 4;
      local_40 = local_40 + -1;
    } while (local_40 != 0);
    uVar4 = 0;
    iVar5 = -0x48;
    iVar11 = 0x817e;
    do {
      CVar1 = (CFunctions)__udivsi3(iVar11,0x94);
      this[iVar5 + 0x2491] = CVar1;
      this[iVar5 + 0x2492] = (CFunctions)0xff;
      this[iVar5 + 0x2493] = (CFunctions)0x0;
      this[iVar5 + 0x2490] = (CFunctions)((char)(uVar4 >> 5) + '\x0f');
      uVar4 = uVar4 + 0xf0;
      iVar11 = iVar11 + 0xff;
      iVar5 = iVar5 + 4;
    } while (iVar5 != 0);
    iVar11 = -0x3c;
    uVar4 = 0xf0e0;
    do {
      this[iVar11 + 0x24cd] = (CFunctions)0xff;
      this[iVar11 + 0x24ce] = (CFunctions)0xff;
      this[iVar11 + 0x24cf] = (CFunctions)0x0;
      this[iVar11 + 0x24cc] = (CFunctions)((char)(uVar4 >> 5) + '\x0f');
      uVar4 = uVar4 + 0xf0;
      iVar11 = iVar11 + 4;
    } while (iVar11 != 0);
    switchD_00026cd2::caseD_b();
    return;
  case 3:
    pCVar8 = this + 0x20cc;
    iVar11 = 0x40;
    uVar4 = 0;
    uVar10 = 0;
    do {
      pCVar8[2] = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[1] = SUB41(uVar10 >> 7,0);
      *pCVar8 = (CFunctions)((char)(uVar4 >> 6) + '2');
      uVar4 = uVar4 + 0xcd;
      uVar10 = uVar10 + 0xff;
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    pCVar8 = this + 0x21cc;
    iVar11 = 0x40;
    uVar4 = 0;
    iVar5 = 0;
    do {
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[2] = SUB41(uVar4 >> 6,0);
      pCVar8[1] = SUB41(uVar4 + 0x3fc0 >> 7,0);
      *pCVar8 = (CFunctions)((char)(iVar5 + ((uint)(iVar5 >> 0x1f) >> 0x1a) >> 6) + -1);
      pCVar8 = pCVar8 + 4;
      uVar4 = uVar4 + 0xff;
      iVar5 = iVar5 + -0xff;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    pCVar8 = this + 0x22cc;
    iVar11 = 0x40;
    iVar5 = 0;
    uVar4 = 0;
    do {
      pCVar8[2] = (CFunctions)0xff;
      pCVar8[3] = (CFunctions)0x0;
      *pCVar8 = SUB41(uVar4 >> 7,0);
      pCVar8[1] = (CFunctions)((char)(iVar5 + ((uint)(iVar5 >> 0x1f) >> 0x1a) >> 6) + -1);
      iVar5 = iVar5 + -0xff;
      uVar4 = uVar4 + 0xff;
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    this = this + 0x23cc;
    iVar11 = 0x40;
    uVar4 = 0xbfc0;
    do {
      this[2] = (CFunctions)0xff;
      this[3] = (CFunctions)0x0;
      *this = SUB41(uVar4 >> 7,0);
      this[1] = SUB41(uVar4 + 0x40 >> 6,0);
      uVar4 = uVar4 + 0xff;
      this = this + 4;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    switchD_00026cd2::caseD_b();
    return;
  case 4:
    pCVar8 = this + 0x20cc;
    iVar11 = -0x32;
    do {
      pCVar8[2] = (CFunctions)0x32;
      *pCVar8 = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[1] = (CFunctions)((char)iVar11 + '2');
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + 1;
    } while (iVar11 != 0);
    pCVar8 = this + 0x2194;
    iVar5 = -0x96;
    iVar11 = 0;
    do {
      *pCVar8 = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[1] = (CFunctions)((char)iVar5 + -0x38);
      cVar2 = __udivsi3(iVar11,0x96);
      pCVar8[2] = (CFunctions)(cVar2 + '2');
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + 0xcd;
      iVar5 = iVar5 + 1;
    } while (iVar5 != 0);
    CVar1 = (CFunctions)0xc8;
    do {
      this[local_3c + 0x24cd] = CVar1;
      this[local_3c + 0x24ce] = (CFunctions)0xff;
      this[local_3c + 0x24cc] = (CFunctions)0x0;
      this[local_3c + 0x24cf] = (CFunctions)0x0;
      local_3c = local_3c + 4;
      CVar1 = (CFunctions)((char)CVar1 + '\x01');
    } while (local_3c != 0);
    switchD_00026cd2::caseD_b();
    return;
  case 5:
    pCVar8 = this + 0x20cc;
    iVar11 = 0x40;
    uVar4 = 0;
    uVar10 = 0;
    uVar13 = 0;
    do {
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[1] = SUB41(uVar10 >> 6,0);
      pCVar8[2] = SUB41(uVar13 >> 6,0);
      *pCVar8 = SUB41(uVar4 >> 6,0);
      uVar4 = uVar4 + 0x24;
      uVar10 = uVar10 + 0x16;
      pCVar8 = pCVar8 + 4;
      uVar13 = uVar13 + 0xcb;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    pCVar8 = this + 0x21cc;
    iVar11 = 0x40;
    uVar4 = 0;
    uVar10 = 0;
    iVar5 = 0;
    do {
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[1] = (CFunctions)((char)(uVar10 >> 6) + '\x16');
      pCVar8[2] = (CFunctions)((char)(uVar4 >> 6) + -0x35);
      *pCVar8 = (CFunctions)((char)(iVar5 + ((uint)(iVar5 >> 0x1f) >> 0x1a) >> 6) + '$');
      pCVar8 = pCVar8 + 4;
      uVar4 = uVar4 + 0x34;
      uVar10 = uVar10 + 0x44;
      iVar5 = iVar5 + -0x24;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    pCVar8 = this + 0x22cc;
    uVar4 = 0;
    iVar11 = 0x40;
    do {
      pCVar8[2] = (CFunctions)0xff;
      *pCVar8 = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[1] = (CFunctions)((char)(uVar4 >> 6) + 'Z');
      uVar4 = uVar4 + 0x7c;
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    this = this + 0x23cc;
    iVar11 = 0x40;
    uVar4 = 0;
    uVar10 = 0;
    do {
      this[2] = (CFunctions)0xff;
      this[3] = (CFunctions)0x0;
      *this = SUB41(uVar10 >> 6,0);
      this[1] = (CFunctions)((char)(uVar4 >> 6) + -0x2a);
      uVar4 = uVar4 + 0x29;
      uVar10 = uVar10 + 0xff;
      this = this + 4;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    switchD_00026cd2::caseD_b();
    return;
  case 6:
    pCVar8 = this + 0x20cc;
    iVar5 = 0;
    do {
      pCVar8[1] = SUB41(iVar11,0);
      *pCVar8 = SUB41(iVar11,0);
      pCVar8[3] = (CFunctions)0x0;
      cVar2 = __divsi3(iVar5,100);
      pCVar8[2] = (CFunctions)(cVar2 + -1);
      pCVar8 = pCVar8 + 4;
      iVar5 = iVar5 + -0xff;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0x9b);
    pCVar8 = this + 0x225c;
    iVar5 = 0x9b;
    iVar11 = 0;
    do {
      pCVar8[1] = SUB41(iVar5,0);
      *pCVar8 = SUB41(iVar5,0);
      pCVar8[3] = (CFunctions)0x0;
      CVar1 = (CFunctions)__udivsi3(iVar11,0x69);
      pCVar8[2] = CVar1;
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + 0xff;
      iVar5 = iVar5 + -1;
    } while (iVar5 != 0x32);
    this = this + 0x2400;
    iVar11 = 0x33;
    do {
      this[2] = (CFunctions)0xff;
      this[3] = (CFunctions)0x0;
      iVar11 = iVar11 + -1;
      this[1] = SUB41(iVar11,0);
      *this = SUB41(iVar11,0);
      this = this + 4;
    } while (iVar11 != 0);
    switchD_00026cd2::caseD_b();
    return;
  case 7:
    pCVar8 = this + 0x20cc;
    iVar11 = 0x80;
    CVar1 = (CFunctions)0x0;
    do {
      pCVar8[1] = (CFunctions)0x0;
      pCVar8[2] = CVar1;
      *pCVar8 = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      pCVar8 = pCVar8 + 4;
      CVar1 = (CFunctions)((char)CVar1 + '\x02');
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    this = this + 0x22cc;
    iVar5 = 0x80;
    iVar11 = 0;
    do {
      this[2] = (CFunctions)0xff;
      this[3] = (CFunctions)0x0;
      CVar1 = (CFunctions)__udivsi3(iVar11,0x7f);
      this[1] = CVar1;
      *this = CVar1;
      iVar11 = iVar11 + 0xff;
      this = this + 4;
      iVar5 = iVar5 + -1;
    } while (iVar5 != 0);
    switchD_00026cd2::caseD_b();
    return;
  case 8:
    iVar11 = -0x80;
    do {
      this[iVar11 + 0x214d] = (CFunctions)0x0;
      this[iVar11 + 0x214e] = (CFunctions)0x0;
      this[iVar11 + 0x214c] = (CFunctions)((char)iVar11 + -1);
      this[iVar11 + 0x214f] = (CFunctions)0x0;
      iVar11 = iVar11 + 4;
    } while (iVar11 != 0);
    pCVar8 = this + 0x214c;
    uVar4 = 0;
    iVar11 = 0x40;
    do {
      pCVar8[2] = (CFunctions)0x0;
      *pCVar8 = (CFunctions)0xff;
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[1] = SUB41(uVar4 >> 6,0);
      uVar4 = uVar4 + 0xff;
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    pCVar8 = this + 0x224c;
    iVar5 = 0x40;
    uVar4 = 0;
    iVar11 = 0;
    do {
      pCVar8[1] = (CFunctions)0xff;
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[2] = SUB41(uVar4 >> 6,0);
      *pCVar8 = (CFunctions)((char)(iVar11 + ((uint)(iVar11 >> 0x1f) >> 0x1a) >> 6) + -1);
      pCVar8 = pCVar8 + 4;
      uVar4 = uVar4 + 0xff;
      iVar11 = iVar11 + -0xff;
      iVar5 = iVar5 + -1;
    } while (iVar5 != 0);
    pCVar8 = this + 0x234c;
    iVar11 = 0x40;
    iVar5 = 0;
    do {
      pCVar8[2] = (CFunctions)0xff;
      *pCVar8 = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[1] = (CFunctions)((char)(iVar5 + ((uint)(iVar5 >> 0x1f) >> 0x1a) >> 6) + -1);
      iVar5 = iVar5 + -0xff;
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    iVar5 = -0x80;
    iVar11 = 0;
    do {
      this[iVar5 + 0x24cd] = (CFunctions)0x0;
      this[iVar5 + 0x24cc] = (CFunctions)0x0;
      this[iVar5 + 0x24cf] = (CFunctions)0x0;
      this[iVar5 + 0x24ce] =
           (CFunctions)((char)(iVar11 + ((uint)(iVar11 >> 0x1f) >> 0x1b) >> 5) + -1);
      iVar11 = iVar11 + -0x80;
      iVar5 = iVar5 + 4;
    } while (iVar5 != 0);
    switchD_00026cd2::caseD_b();
    return;
  case 9:
    pCVar8 = this + 0x20cc;
    iVar5 = 0x99;
    iVar11 = 0;
    do {
      pCVar8[3] = (CFunctions)0x0;
      CVar1 = (CFunctions)__udivsi3(iVar11,200);
      pCVar8[1] = CVar1;
      pCVar8[2] = CVar1;
      *pCVar8 = CVar1;
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + 0xff;
      iVar5 = iVar5 + -1;
    } while (iVar5 != 0);
    iVar5 = -0xbc;
    iVar11 = 0x9867;
    do {
      this[iVar5 + 0x23ed] = (CFunctions)0xc3;
      CVar1 = (CFunctions)__udivsi3(iVar11,200);
      this[iVar5 + 0x23ee] = CVar1;
      this[iVar5 + 0x23ec] = (CFunctions)0xc3;
      this[iVar5 + 0x23ef] = (CFunctions)0x0;
      iVar11 = iVar11 + 0xff;
      iVar5 = iVar5 + 4;
    } while (iVar5 != 0);
    iVar11 = 0;
    do {
      this[local_3c + 0x24ce] = (CFunctions)0xff;
      this[local_3c + 0x24cf] = (CFunctions)0x0;
      cVar2 = __divsi3(iVar11,0x37);
      this[local_3c + 0x24cd] = (CFunctions)(cVar2 + -0x3d);
      this[local_3c + 0x24cc] = (CFunctions)(cVar2 + -0x3d);
      iVar11 = iVar11 + -0xc3;
      local_3c = local_3c + 4;
    } while (local_3c != 0);
    switchD_00026cd2::caseD_b();
    return;
  case 10:
    pCVar8 = this + 0x20cc;
    iVar11 = 0;
    do {
      pCVar8[1] = (CFunctions)0x0;
      pCVar8[2] = SUB41(iVar11,0);
      *pCVar8 = SUB41(iVar11,0);
      pCVar8[3] = (CFunctions)0x0;
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + 7;
    } while (iVar11 != 0xfc);
    CVar1 = (CFunctions)0xfc;
    iVar11 = -0x94;
    uVar4 = 0;
    do {
      this[iVar11 + 0x21f1] = (CFunctions)0x0;
      this[iVar11 + 0x21f2] = CVar1;
      this[iVar11 + 0x21f3] = (CFunctions)0x0;
      this[iVar11 + 0x21f0] = (CFunctions)(-4 - (char)(uVar4 >> 2));
      uVar4 = uVar4 + 7;
      CVar1 = (CFunctions)((char)CVar1 + -7);
      iVar11 = iVar11 + 4;
    } while (iVar11 != 0);
    pCVar8 = this + 0x21f0;
    CVar1 = (CFunctions)0x0;
    CVar6 = (CFunctions)0x0;
    uVar4 = 0xf5;
    do {
      CVar1 = (CFunctions)((char)CVar1 + '\a');
      pCVar8[1] = CVar1;
      pCVar8[2] = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      *pCVar8 = (CFunctions)(-4 - (char)(uVar4 >> 2));
      pCVar8 = pCVar8 + 4;
      bVar14 = uVar4 != 0;
      uVar4 = uVar4 - 7;
    } while (bVar14);
    pCVar8 = this + 0x2280;
    uVar4 = 0;
    iVar11 = 0xfc;
    do {
      pCVar8[2] = (CFunctions)0x0;
      *pCVar8 = SUB41(iVar11,0);
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[1] = (CFunctions)(-4 - (char)(uVar4 >> 1));
      uVar4 = uVar4 + 7;
      pCVar8 = pCVar8 + 4;
      bVar14 = iVar11 != 0;
      iVar11 = iVar11 + -7;
    } while (bVar14);
    pCVar8 = this + 0x2314;
    CVar1 = (CFunctions)0x7;
    uVar4 = 0xf5;
    do {
      pCVar8[2] = CVar1;
      *pCVar8 = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[1] = (CFunctions)(-4 - (char)(uVar4 >> 1));
      pCVar8 = pCVar8 + 4;
      CVar1 = (CFunctions)((char)CVar1 + '\a');
      bVar14 = uVar4 != 0;
      uVar4 = uVar4 - 7;
    } while (bVar14);
    uVar4 = 0;
    iVar11 = -0x94;
    CVar1 = (CFunctions)0xfc;
    do {
      this[iVar11 + 0x2439] = CVar1;
      this[iVar11 + 0x2438] = (CFunctions)0x0;
      this[iVar11 + 0x243b] = (CFunctions)0x0;
      this[iVar11 + 0x243a] = (CFunctions)(-4 - (char)(uVar4 >> 2));
      uVar4 = uVar4 + 7;
      CVar1 = (CFunctions)((char)CVar1 + -7);
      iVar11 = iVar11 + 4;
    } while (iVar11 != 0);
    this = this + 0x2438;
    uVar4 = 0xfc;
    do {
      this[1] = CVar6;
      *this = CVar6;
      this[3] = (CFunctions)0x0;
      this[2] = (CFunctions)(-4 - (char)(uVar4 >> 2));
      this = this + 4;
      CVar6 = (CFunctions)((char)CVar6 + '\a');
      bVar14 = uVar4 != 0;
      uVar4 = uVar4 - 7;
    } while (bVar14);
    switchD_00026cd2::caseD_b();
    return;
  case 0xc:
    pCVar8 = this + 0x20cc;
    iVar11 = 0;
    do {
      pCVar8[1] = (CFunctions)0x0;
      pCVar8[2] = (CFunctions)0x0;
      *pCVar8 = SUB41(iVar11,0);
      pCVar8[3] = (CFunctions)0x0;
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + 7;
    } while (iVar11 != 0xfc);
    iVar11 = -0x94;
    CVar1 = (CFunctions)0x0;
    do {
      this[iVar11 + 0x21f1] = CVar1;
      this[iVar11 + 0x21f2] = (CFunctions)0x0;
      this[iVar11 + 0x21f0] = (CFunctions)0xff;
      this[iVar11 + 0x21f3] = (CFunctions)0x0;
      CVar1 = (CFunctions)((char)CVar1 + '\a');
      iVar11 = iVar11 + 4;
    } while (iVar11 != 0);
    pCVar8 = this + 0x21f0;
    iVar11 = 0;
    do {
      pCVar8[1] = (CFunctions)0xff;
      pCVar8[2] = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      *pCVar8 = (CFunctions)((char)iVar11 + -0xb);
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + -7;
    } while (iVar11 != -0xfc);
    iVar11 = -0x94;
    CVar1 = (CFunctions)0x0;
    do {
      this[iVar11 + 0x2315] = (CFunctions)0xff;
      this[iVar11 + 0x2316] = CVar1;
      this[iVar11 + 0x2314] = (CFunctions)0x0;
      this[iVar11 + 0x2317] = (CFunctions)0x0;
      CVar1 = (CFunctions)((char)CVar1 + '\a');
      iVar11 = iVar11 + 4;
    } while (iVar11 != 0);
    pCVar8 = this + 0x2314;
    iVar11 = 0;
    do {
      pCVar8[2] = (CFunctions)0xff;
      *pCVar8 = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      pCVar8[1] = (CFunctions)((char)iVar11 + -0xb);
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + -7;
    } while (iVar11 != -0xfc);
    CVar1 = (CFunctions)0x0;
    iVar11 = -0x94;
    do {
      this[iVar11 + 0x2439] = (CFunctions)0x0;
      this[iVar11 + 0x243a] = (CFunctions)0xff;
      this[iVar11 + 0x2438] = CVar1;
      this[iVar11 + 0x243b] = (CFunctions)0x0;
      CVar1 = (CFunctions)((char)CVar1 + '\a');
      iVar11 = iVar11 + 4;
    } while (iVar11 != 0);
    CVar1 = (CFunctions)0x0;
    iVar11 = -0x94;
    do {
      this[iVar11 + 0x24cd] = CVar1;
      this[iVar11 + 0x24ce] = (CFunctions)0xff;
      this[iVar11 + 0x24cc] = (CFunctions)0xff;
      this[iVar11 + 0x24cf] = (CFunctions)0x0;
      CVar1 = (CFunctions)((char)CVar1 + '\a');
      iVar11 = iVar11 + 4;
    } while (iVar11 != 0);
    switchD_00026cd2::caseD_b();
    return;
  case 0xd:
    iVar11 = 0x40;
    iVar5 = 0;
    do {
      this[iVar5 + 0x20cc] = (CFunctions)0xff;
      this[iVar5 + 0x20cd] = SUB41(iVar5,0);
      this[iVar5 + 0x20ce] = (CFunctions)0x0;
      this[iVar5 + 0x20cf] = (CFunctions)0x0;
      iVar5 = iVar5 + 4;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    pCVar8 = this + 0x21cc;
    CVar1 = (CFunctions)0xfc;
    iVar11 = 0x40;
    do {
      pCVar8[1] = (CFunctions)0xff;
      pCVar8[2] = (CFunctions)0x0;
      *pCVar8 = CVar1;
      pCVar8[3] = (CFunctions)0x0;
      CVar1 = (CFunctions)((char)CVar1 + -4);
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    CVar1 = (CFunctions)0x0;
    pCVar8 = this + 0x22cc;
    iVar11 = 0x40;
    CVar6 = (CFunctions)0xfc;
    do {
      pCVar8[1] = (CFunctions)0xff;
      pCVar8[2] = CVar1;
      *pCVar8 = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      pCVar8 = pCVar8 + 4;
      CVar1 = (CFunctions)((char)CVar1 + '\x04');
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    pCVar8 = this + 0x23cc;
    iVar11 = 0x40;
    do {
      pCVar8[1] = CVar6;
      pCVar8[2] = (CFunctions)0xff;
      *pCVar8 = (CFunctions)0x0;
      pCVar8[3] = (CFunctions)0x0;
      CVar6 = (CFunctions)((char)CVar6 + -4);
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
  case 0xb:
    pCVar8 = this + 0x20cc;
    iVar11 = 0x100;
    do {
      CVar1 = *pCVar8;
      *pCVar8 = pCVar8[2];
      pCVar8[2] = CVar1;
      pCVar8 = pCVar8 + 4;
      iVar11 = iVar11 + -1;
    } while (iVar11 != 0);
    __aeabi_memcpy(this + 0x24f4,pCVar7,0x400);
    __aeabi_memcpy(this + 0x291c,pCVar7,0x400);
    pthread_mutex_unlock(__mutex);
    return;
  }
}



### FUNC caseD_b @ 0002770e

void switchD_00026cd2::caseD_b(void)

{
  undefined1 uVar1;
  undefined1 *puVar2;
  undefined4 in_stack_0000000c;
  pthread_mutex_t *in_stack_00000010;
  undefined4 in_stack_00000014;
  undefined4 in_stack_00000018;
  int in_stack_0000001c;
  int in_stack_00000040;
  int in_stack_00000044;
  
  puVar2 = (undefined1 *)(in_stack_00000044 + 0x20cc);
  do {
    uVar1 = *puVar2;
    *puVar2 = puVar2[2];
    puVar2[2] = uVar1;
    puVar2 = puVar2 + 4;
    in_stack_00000040 = in_stack_00000040 + -1;
  } while (in_stack_00000040 != 0);
  __aeabi_memcpy(in_stack_00000014,in_stack_0000000c,in_stack_0000001c << 10);
  __aeabi_memcpy(in_stack_00000018,in_stack_0000000c,in_stack_0000001c << 10);
  pthread_mutex_unlock(in_stack_00000010);
  return;
}



### FUNC FUN_00027744 @ 00027744

void FUN_00027744(void)

{
  return;
}



### FUNC FUN_0002776c @ 0002776c

void FUN_0002776c(void)

{
  FUN_000308d8();
                    /* WARNING: Subroutine does not return */
  FUN_0003178c();
}



### FUNC ~CFunctions @ 00027778

/* CFunctions::~CFunctions() */

CFunctions * __thiscall CFunctions::~CFunctions(CFunctions *this)

{
  *(undefined ***)this = &PTR__CFunctions_00068c40;
  ReleaseMemory(this);
  if (gLogFile != (FILE *)0x0) {
    fclose(gLogFile);
  }
  CSmoother::~CSmoother((CSmoother *)(this + 0x37c4));
  CAccumulator::~CAccumulator((CAccumulator *)(this + 0x37a4));
  CAccumulator::~CAccumulator((CAccumulator *)(this + 0x3784));
  pthread_mutex_destroy((pthread_mutex_t *)(this + 0xb0));
  return this;
}



### FUNC ReleaseMemory @ 00027810

/* CFunctions::ReleaseMemory() */

void __thiscall CFunctions::ReleaseMemory(CFunctions *this)

{
  pthread_mutex_lock((pthread_mutex_t *)(this + 0xb0));
  *(undefined4 *)(this + 0x3814) = 0;
  *(undefined4 *)(this + 0xa4) = 0;
  *(undefined4 *)(this + 0xa8) = 0;
  *(undefined4 *)(this + 0xac) = 0;
  *(undefined4 *)(this + 0x2d1c) = 0;
  *(undefined4 *)(this + 0x3128) = 0;
  if (*(void **)(this + 0xb4) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0xb4));
    *(undefined4 *)(this + 0xb4) = 0;
  }
  if (*(void **)(this + 0xc0) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0xc0));
    *(undefined4 *)(this + 0xc0) = 0;
  }
  if (*(void **)(this + 0xc4) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0xc4));
    *(undefined4 *)(this + 0xc4) = 0;
  }
  if (*(void **)(this + 200) != (void *)0x0) {
    operator_delete__(*(void **)(this + 200));
    *(undefined4 *)(this + 200) = 0;
  }
  if (*(void **)(this + 0xb8) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0xb8));
    *(undefined4 *)(this + 0xb8) = 0;
  }
  if (*(void **)(this + 0xbc) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0xbc));
    *(undefined4 *)(this + 0xbc) = 0;
  }
  if (*(void **)(this + 0x2f74) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0x2f74));
    *(undefined4 *)(this + 0x2f74) = 0;
  }
  if (*(void **)(this + 0x2f78) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0x2f78));
    *(undefined4 *)(this + 0x2f78) = 0;
  }
  if (*(void **)(this + 0x2f7c) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0x2f7c));
    *(undefined4 *)(this + 0x2f7c) = 0;
  }
  __aeabi_memclr4(this + 0x2d1c,0x40c);
  CAccumulator::Reset((CAccumulator *)(this + 0x3784),0,0,0);
  CAccumulator::Reset((CAccumulator *)(this + 0x37a4),0,0,0);
  CSmoother::Reset((CSmoother *)(this + 0x37c4),0,0,0,0);
  __aeabi_memclr4(this + 0x3820,0x18d0);
  pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
  return;
}



### FUNC ~CFunctions @ 00027954

/* CFunctions::~CFunctions() */

void __thiscall CFunctions::~CFunctions(CFunctions *this)

{
  ~CFunctions(this);
  operator_delete(this);
  return;
}



### FUNC Reset @ 00027974

/* CFunctions::Reset(struct_IntrinsicPara const*) */

undefined4 __thiscall CFunctions::Reset(CFunctions *this,struct_IntrinsicPara *param_1)

{
  pthread_mutex_t *__mutex;
  uint uVar1;
  uint uVar2;
  void *pvVar3;
  int iVar4;
  MStream *pMVar5;
  undefined4 *puVar6;
  Logging *this_00;
  CFunctions *pCVar7;
  uint uVar8;
  undefined4 uVar9;
  undefined4 uVar10;
  undefined4 uVar11;
  uint uVar12;
  undefined8 uVar13;
  Logging aLStack_3c [12];
  Logging aLStack_30 [12];
  Logging aLStack_24 [12];
  int local_18;
  
  local_18 = __stack_chk_guard;
  ReleaseMemory(this);
  __mutex = (pthread_mutex_t *)(this + 0xb0);
  pthread_mutex_lock(__mutex);
  *(undefined4 *)(this + 0x50fc) = 8;
  *(undefined4 *)(this + 0x5100) = 0xffff3cb0;
  *(undefined4 *)(this + 0x5104) = 3;
  pCVar7 = this + 0x37ec;
  uVar9 = *(undefined4 *)(param_1 + 4);
  uVar10 = *(undefined4 *)(param_1 + 8);
  *(undefined4 *)pCVar7 = *(undefined4 *)param_1;
  *(undefined4 *)(this + 0x37f0) = uVar9;
  *(undefined4 *)(this + 0x37f4) = uVar10;
  uVar9 = *(undefined4 *)(param_1 + 0x10);
  uVar10 = *(undefined4 *)(param_1 + 0x14);
  *(undefined4 *)(this + 0x37f8) = *(undefined4 *)(param_1 + 0xc);
  *(undefined4 *)(this + 0x37fc) = uVar9;
  *(undefined4 *)(this + 0x3800) = uVar10;
  uVar9 = *(undefined4 *)(param_1 + 0x1c);
  uVar10 = *(undefined4 *)(param_1 + 0x20);
  uVar11 = *(undefined4 *)(param_1 + 0x24);
  *(undefined4 *)(this + 0x3804) = *(undefined4 *)(param_1 + 0x18);
  *(undefined4 *)(this + 0x3808) = uVar9;
  *(undefined4 *)(this + 0x380c) = uVar10;
  *(undefined4 *)(this + 0x3810) = uVar11;
  uVar12 = *(uint *)(this + 0x3804);
  if ((((uVar12 - 4 < 0x3d) && ((uVar12 - 1 & uVar12) == 0)) &&
      ((*(uint *)(this + 0x3808) - 1 & (*(uint *)(this + 0x3808) | 0xffffffc0)) == 0)) &&
     ((*(int *)(this + 0x380c) - 1U < 2 && (*(int *)(this + 0x3810) != 0)))) {
    uVar1 = *(uint *)pCVar7;
    if ((3 < uVar1) && ((uVar1 & 3) == 0)) {
      if (*(int *)(this + 0x37f0) != 0) {
        if (3 < *(uint *)(this + 0x37fc)) {
          if (*(int *)(this + 0x3800) != 0) {
            uVar1 = *(int *)(this + 0x37f0) * uVar1;
            *(uint *)(this + 0x50f0) = uVar1;
            uVar8 = *(int *)(this + 0x3800) * *(uint *)(this + 0x37fc);
            *(uint *)(this + 0x50f8) = uVar8;
            *(int *)(this + 0x50f4) = *(int *)(this + 0x37f4) * *(int *)(this + 0x37f8);
            uVar2 = uVar1 * 2;
            if (uVar1 * 2 < uVar1) {
              uVar2 = 0xffffffff;
            }
            pvVar3 = operator_new__(uVar2);
            *(void **)(this + 0xb4) = pvVar3;
            pvVar3 = operator_new__(uVar2);
            *(void **)(this + 0xbc) = pvVar3;
            pvVar3 = operator_new__(uVar1);
            *(void **)(this + 0xc0) = pvVar3;
            uVar13 = __muldi3(uVar1,0,4,(int)uVar1 >> 0x1f);
            uVar2 = 0xffffffff;
            if ((int)((ulonglong)uVar13 >> 0x20) == 0) {
              uVar2 = (uint)uVar13;
            }
            pvVar3 = operator_new__(uVar2);
            *(void **)(this + 0xc4) = pvVar3;
            pvVar3 = operator_new__(uVar1);
            *(void **)(this + 0xb8) = pvVar3;
            pvVar3 = operator_new__(uVar8);
            *(void **)(this + 200) = pvVar3;
            uVar9 = 0;
            iVar4 = CAccumulator::Reset((CAccumulator *)(this + 0x3784),uVar1,uVar12,0);
            if (iVar4 == 0) {
              pMVar5 = (MStream *)mag::Logging::Logging(aLStack_30,4);
              MStream::operator<<(pMVar5,"Failed to create baseline accmulator");
              this_00 = aLStack_30;
            }
            else {
              if ((*(uint *)(this + 0x380c) < 2) ||
                 (iVar4 = CSmoother::Reset((CSmoother *)(this + 0x37c4),*(uint *)(this + 0x50f0),
                                           *(uint *)(this + 0x380c) - 1,0,0), iVar4 != 0)) {
                __aeabi_memclr4(this + 0x24e0);
                *(undefined4 *)(this + 0x24cc) = 0x28;
                *(undefined4 *)(this + 0x24d0) = *(undefined4 *)pCVar7;
                *(undefined4 *)(this + 0x24d4) = *(undefined4 *)(this + 0x37f0);
                *(undefined4 *)(this + 0x24d8) = 0x80001;
                *(undefined4 *)(this + 0x24dc) = 0;
                __aeabi_memclr4(this + 0x2908,0x14);
                *(undefined4 *)(this + 0x28f4) = 0x28;
                *(undefined4 *)(this + 0x28f8) = *(undefined4 *)(this + 0x37fc);
                *(undefined4 *)(this + 0x28fc) = *(undefined4 *)(this + 0x3800);
                *(undefined4 *)(this + 0x2900) = 0x80001;
                *(undefined4 *)(this + 0x2904) = 0;
                CalTaoAtm((CFunctions *)0x2904,(struct_FixPara *)(this + 0x78));
                *(undefined4 *)(this + 0xa4) = 1;
                pthread_mutex_unlock(__mutex);
                uVar9 = *(undefined4 *)(this + 0xa4);
                goto LAB_00027ba6;
              }
              pMVar5 = (MStream *)mag::Logging::Logging(aLStack_3c,4);
              MStream::operator<<(pMVar5,"Failed to create temperature smoother");
              this_00 = aLStack_3c;
            }
            mag::Logging::~Logging(this_00);
            pthread_mutex_unlock(__mutex);
            puVar6 = (undefined4 *)__errno();
            *puVar6 = 0xe4ae0003;
            goto LAB_00027ba6;
          }
        }
      }
    }
  }
  pMVar5 = (MStream *)mag::Logging::Logging(aLStack_24,4);
  MStream::operator<<(pMVar5,"Failed to configurate CFunctions due to parameter error");
  mag::Logging::~Logging(aLStack_24);
  pthread_mutex_unlock(__mutex);
  puVar6 = (undefined4 *)__errno();
  *puVar6 = 0xe4ae0001;
  uVar9 = 0;
LAB_00027ba6:
  if (__stack_chk_guard == local_18) {
    return uVar9;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC CalTaoAtm @ 00027d20

/* CFunctions::CalTaoAtm(struct_FixPara*) */

undefined4 __thiscall CFunctions::CalTaoAtm(CFunctions *this,struct_FixPara *param_1)

{
  int iVar1;
  undefined4 uVar2;
  undefined4 uVar3;
  undefined4 *puVar4;
  undefined4 uVar5;
  undefined4 uVar6;
  float __x;
  float __x_00;
  float __x_01;
  float __x_02;
  float __y;
  float __y_00;
  
  if (param_1 == (struct_FixPara *)0x0) {
    puVar4 = (undefined4 *)__errno();
    *puVar4 = 0xe4ae0001;
    uVar6 = 0;
  }
  else {
    iVar1 = __aeabi_fcmple(*(undefined4 *)param_1,0);
    if (iVar1 == 0) {
      iVar1 = __aeabi_fcmple(*(undefined4 *)(param_1 + 0x10),0);
      if (iVar1 == 0) {
        uVar6 = *(undefined4 *)(param_1 + 0xc);
        iVar1 = __aeabi_fcmplt(uVar6);
        if ((iVar1 == 0) && (iVar1 = __aeabi_fcmpgt(uVar6,0x3f800000), iVar1 == 0)) {
          iVar1 = __fixsfsi(*(undefined4 *)(param_1 + 8));
          if (0x22 < iVar1) {
            iVar1 = 0x23;
          }
          if (iVar1 < -0x18) {
            iVar1 = -0x19;
          }
          __x = (float)__mulsf3(uVar6,*(undefined4 *)(&UNK_00064928 + iVar1 * 4));
          sqrtf(__x);
          uVar6 = __mulsf3();
          uVar6 = __addsf3(uVar6,0x3d3851ec);
          uVar2 = __divsf3(0x3db851ec,*(undefined4 *)(param_1 + 0x10));
          uVar5 = 0;
          iVar1 = __aeabi_fcmpgt(*(undefined4 *)(param_1 + 0x14),0);
          uVar3 = 0;
          if (iVar1 != 0) {
            powf(__x_00,__y);
            uVar3 = __mulsf3();
          }
          iVar1 = __aeabi_fcmpgt(*(undefined4 *)(param_1 + 0x18),0);
          if (iVar1 != 0) {
            powf(__x_01,__y_00);
            uVar5 = __mulsf3();
          }
          uVar3 = __addsf3(uVar3,uVar5);
          uVar6 = __addsf3(uVar6,uVar2);
          uVar6 = __addsf3(uVar6,uVar3);
          uVar6 = __mulsf3(*(undefined4 *)param_1,uVar6);
          uVar6 = __mulsf3(uVar6,0xba83126f);
          expf(__x_02);
          *(undefined4 *)(param_1 + 0x24) = uVar6;
          return uVar6;
        }
      }
    }
    uVar6 = 0x3f800000;
    *(undefined4 *)(param_1 + 0x24) = 0x3f800000;
    puVar4 = (undefined4 *)__errno();
    *puVar4 = 0xe4ae0001;
  }
  return uVar6;
}



### FUNC PushBaselineRaw @ 00027e68

/* CFunctions::PushBaselineRaw(unsigned short const*, int) */

int __thiscall CFunctions::PushBaselineRaw(CFunctions *this,ushort *param_1,int param_2)

{
  int iVar1;
  pthread_mutex_t *__mutex;
  
  __mutex = (pthread_mutex_t *)(this + 0xb0);
  pthread_mutex_lock(__mutex);
  if (*(int *)(this + 0xa4) == 0) {
    pthread_mutex_unlock(__mutex);
    iVar1 = 0;
  }
  else {
    if (param_2 != 0) {
      *(undefined4 *)(this + 0xa8) = 0;
      CAccumulator::Restart((CAccumulator *)(this + 0x3784));
      CAccumulator::Restart((CAccumulator *)(this + 0x37a4));
    }
    iVar1 = CAccumulator::PushFrame((CAccumulator *)(this + 0x3784),param_1);
    if (iVar1 != 0) {
      *(undefined4 *)(this + 0xa8) = 1;
    }
    pthread_mutex_unlock(__mutex);
  }
  return iVar1;
}



### FUNC SelectCaliCurve @ 00027edc

/* CFunctions::SelectCaliCurve() */

void __thiscall CFunctions::SelectCaliCurve(CFunctions *this)

{
  CFunctions *pCVar1;
  FILE *__stream;
  size_t sVar2;
  size_t sVar3;
  int iVar4;
  int iVar5;
  uint uVar6;
  size_t __n;
  int iVar7;
  CFunctions *pCVar8;
  uint uVar9;
  CFunctions *local_58;
  int local_24;
  uint local_20;
  uint local_1c;
  
  *(undefined4 *)(this + 0x2d24) = 0;
  pCVar1 = this;
  uVar6 = 0;
  do {
    uVar9 = uVar6;
    pCVar8 = pCVar1;
    uVar6 = uVar9 + 1;
    if (*(int *)(this + 0x2e2c) - 2U <= uVar9) break;
    pCVar1 = pCVar8 + 4;
  } while (*(int *)(this + uVar6 * 4 + 0x2e38) < *(int *)(this + 0x38));
  *(uint *)(this + 0x3108) = uVar9;
  local_1c = *(uint *)(this + 0x2e30);
  local_24 = *(int *)(this + 0x50f0);
  iVar5 = *(int *)(this + 0x2e28);
  __n = *(int *)(this + 0x2e34) + local_1c + local_24 * (iVar5 * 3 + -1) * 2;
  if (uVar9 <= uVar6) {
    iVar5 = 0;
    local_20 = uVar9;
    do {
      if (*(int *)(pCVar8 + 0x2f80) == 0) {
        iVar4 = access((char *)(this + 0x2d28),0);
        if (iVar4 != 0) {
          *(undefined4 *)(this + 0x2d1c) = 0;
          return;
        }
        __stream = fopen((char *)(this + 0x2d28),"rb");
        fseek(__stream,*(long *)(pCVar8 + 0x2fd0),0);
        sVar2 = fread((void *)(*(int *)(this + 0x2f74) + *(int *)(pCVar8 + 0x3020)),1,__n,__stream);
        if ((*(int *)(pCVar8 + 0x2f28) != 0) && (uVar9 + iVar5 <= *(int *)(this + 0x2e2c) - 2U)) {
          fseek(__stream,*(long *)(pCVar8 + 0x3070),0);
          sVar3 = fread((void *)(*(int *)(this + 0x2f7c) + *(int *)(pCVar8 + 0x30bc)),4,
                        *(int *)(pCVar8 + 0x2f28) * 10,__stream);
          if (sVar3 * 4 + *(int *)(pCVar8 + 0x2f28) * -0x28 != 0) {
            fclose(__stream);
            goto LAB_000280ec;
          }
        }
        fclose(__stream);
        if (sVar2 != __n) {
LAB_000280ec:
          *(undefined4 *)(this + 0x2d1c) = 0;
          return;
        }
        *(undefined4 *)(pCVar8 + 0x2f80) = 1;
        local_20 = *(uint *)(this + 0x3108);
      }
      iVar5 = iVar5 + 1;
      pCVar8 = pCVar8 + 4;
    } while (uVar9 + iVar5 <= local_20 + 1);
    local_1c = *(uint *)(this + 0x2e30);
    iVar5 = *(int *)(this + 0x2e28);
    local_24 = *(int *)(this + 0x50f0);
    uVar9 = local_20;
  }
  local_58 = this + 0x2f7c;
  iVar4 = *(int *)(this + 0x2f74) + *(int *)(this + uVar9 * 4 + 0x3020);
  *(int *)(this + 0x310c) = iVar4;
  iVar7 = local_24 * (iVar5 + -1) * 2;
  *(uint *)(this + 0x3118) = iVar4 + iVar7 + (local_1c & 0xfffffffe);
  iVar5 = *(int *)(this + 0x2f74) + *(int *)(this + uVar9 * 4 + 0x3024);
  *(int *)(this + 0x3110) = iVar5;
  *(uint *)(this + 0x311c) = iVar5 + iVar7 + (local_1c & 0xfffffffe);
  *(int *)(this + 0x3124) = *(int *)local_58 + *(int *)(this + uVar9 * 4 + 0x30bc);
  return;
}



### FUNC DoSomething @ 0002814c

/* CFunctions::DoSomething(int, unsigned int) */

void __thiscall CFunctions::DoSomething(CFunctions *this,int param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  int iVar3;
  uint uVar4;
  
  pthread_mutex_lock((pthread_mutex_t *)(this + 0xb0));
  if ((*(int *)(this + 0xa4) != 0) && (*(int *)(this + 0x2d1c) != 0)) {
    if (param_1 == 0) {
      SelectCaliCurve(this);
      if ((*(int *)(this + 0x2d1c) != 0) && (*(int *)(this + 0x2d20) != 0)) {
        GenerateVolatileLens(this);
      }
    }
    else {
      if ((param_1 == 1) && (1 < param_2)) {
        DAT_0006b8f4 = 0;
        DAT_0006b8f8 = 0;
        DAT_0006b900 = *(int *)(this + 0x2e28) * *(int *)(this + 0x50f0) * 2;
        iVar3 = *(int *)(this + 0x50f0) * (*(int *)(this + 0x2e28) + -1);
        DAT_0006b8fc = iVar3;
        iVar1 = __udivsi3(param_2 + DAT_0006b900 + iVar3 + -2,param_2 - 1);
        DAT_0006b904 = iVar1 + 7U & 0xfffffff8;
        iVar1 = 0;
      }
      else {
        iVar1 = DAT_0006b8f4;
        iVar3 = DAT_0006b8fc;
        if (param_1 < 1) goto LAB_000282a8;
      }
      uVar2 = 0;
      if (iVar1 < iVar3) {
        uVar2 = iVar3 - iVar1;
        if ((int)DAT_0006b904 <= iVar3 - iVar1) {
          uVar2 = DAT_0006b904;
        }
        iVar1 = iVar1 * 2;
        InterpolateShort(this,(short *)(*(int *)(this + 0x310c) + iVar1),
                         (short *)(*(int *)(this + 0x3110) + iVar1),
                         (short *)(*(int *)(this + 0x3114) + iVar1),uVar2);
        DAT_0006b8f4 = DAT_0006b8f4 + uVar2;
      }
      if (((int)uVar2 < (int)DAT_0006b904) && (DAT_0006b8f8 < DAT_0006b900)) {
        uVar4 = DAT_0006b900 - DAT_0006b8f8;
        if ((int)(DAT_0006b904 - uVar2) <= DAT_0006b900 - DAT_0006b8f8) {
          uVar4 = DAT_0006b904 - uVar2;
        }
        iVar1 = DAT_0006b8f8 * 2;
        InterpolateUShort(this,(ushort *)(*(int *)(this + 0x3118) + iVar1),
                          (ushort *)(*(int *)(this + 0x311c) + iVar1),
                          (ushort *)(*(int *)(this + 0x3120) + iVar1),uVar4);
        DAT_0006b8f8 = DAT_0006b8f8 + uVar4;
        if (DAT_0006b8f8 == DAT_0006b900) {
          *(undefined4 *)(this + 0x2d24) = 1;
        }
      }
    }
  }
LAB_000282a8:
  pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
  return;
}



### FUNC GenerateVolatileLens @ 00028314

/* CFunctions::GenerateVolatileLens() */

void __thiscall CFunctions::GenerateVolatileLens(CFunctions *this)

{
  int iVar1;
  int iVar2;
  undefined4 uVar3;
  uint uVar4;
  int iVar5;
  int iVar6;
  int iVar7;
  CFunctions *pCVar8;
  undefined4 uVar9;
  int iVar10;
  int local_88;
  undefined4 local_78;
  int local_74;
  int local_70 [11];
  int local_44 [11];
  int local_18;
  
  local_18 = __stack_chk_guard;
  if ((*(int *)(this + 0x2d1c) != 0) && (*(int *)(this + 0x2d20) != 0)) {
    iVar1 = (*(int *)(this + 0x2e38) + *(int *)(this + 0x2e3c)) / 2;
    uVar9 = *(undefined4 *)(this + 0x6c);
    iVar2 = __aeabi_fcmpeq(uVar9,0);
    if (iVar2 == 0) {
      local_88 = 0;
      iVar7 = *(int *)(this + 0x38);
      *(undefined4 *)(this + 0x316c) = 10;
      uVar3 = __floatsisf(iVar7 - iVar1);
      uVar9 = __mulsf3(uVar9,uVar3);
      uVar9 = __divsf3(uVar9,0x447a0000);
      uVar9 = __addsf3(uVar9,0x3f800000);
      local_78 = 0x3e4ccccd;
      iVar2 = __aeabi_fcmplt();
      if (iVar2 == 0) {
        local_78 = uVar9;
      }
      uVar4 = *(uint *)(this + 0x5104);
      iVar5 = *(int *)(this + 0x5100);
      local_74 = 0xffff;
      iVar10 = 0;
      iVar2 = iVar10;
      do {
        local_44[iVar2] = iVar10;
        uVar9 = __floatsisf(iVar10 - iVar7);
        __mulsf3(local_78,uVar9);
        iVar6 = __fixsfsi();
        iVar6 = (iVar1 - iVar5) + iVar6 >> (uVar4 & 0xff);
        if (iVar6 < 1) {
          iVar6 = local_88;
        }
        if (0xfffe < iVar6) {
          iVar6 = local_74;
        }
        local_70[iVar2] = iVar6;
        iVar10 = iVar10 + 10000;
        iVar2 = iVar2 + 1;
      } while (iVar2 != 0xb);
      pCVar8 = this + 0x3204;
      iVar7 = -0x28;
      iVar1 = local_44[0];
      iVar2 = local_70[0];
      do {
        iVar6 = *(int *)((int)local_44 + iVar7);
        *(int *)(this + iVar7 + 0x3198) = iVar6;
        iVar5 = *(int *)((int)&local_18 + iVar7);
        iVar10 = __udivsi3((iVar5 - iVar1) + ((uint)(iVar6 - iVar2) >> 1));
        *(int *)pCVar8 = iVar10;
        *(int *)(pCVar8 + 4) = iVar1 - iVar10 * iVar2;
        pCVar8 = pCVar8 + 8;
        iVar7 = iVar7 + 4;
        iVar1 = iVar5;
        iVar2 = iVar6;
      } while (iVar7 != 0);
    }
    else {
      *(undefined4 *)(this + 0x316c) = 1;
      *(undefined4 *)(this + 0x3204) = *(undefined4 *)(this + 0x50fc);
      *(int *)(this + 0x3208) = (*(int *)(this + 0x5100) - iVar1) + *(int *)(this + 0x38);
    }
  }
  if (__stack_chk_guard != local_18) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return;
}



### FUNC InterpolateShort @ 000284c0

/* CFunctions::InterpolateShort(short const*, short const*, short*, unsigned int) */

void __thiscall
CFunctions::InterpolateShort
          (CFunctions *this,short *param_1,short *param_2,short *param_3,uint param_4)

{
  bool bVar1;
  int iVar2;
  int iVar3;
  
  iVar2 = *(int *)(this + 0x38);
  if ((iVar2 < *(int *)(this + 0x2e38)) ||
     (bVar1 = true, *(int *)(this + *(int *)(this + 0x2e2c) * 4 + 0x2e34) < iVar2)) {
    bVar1 = false;
  }
  iVar2 = __divsi3((iVar2 - *(int *)(this + *(int *)(this + 0x3108) * 4 + 0x2e38)) * 0x1000,
                   *(int *)(this + *(int *)(this + 0x3108) * 4 + 0x2e3c) -
                   *(int *)(this + *(int *)(this + 0x3108) * 4 + 0x2e38));
  if (iVar2 < -0x3ffe) {
    iVar2 = -0x3fff;
  }
  if (0x3ffe < iVar2) {
    iVar2 = 0x3fff;
  }
  if (bVar1) {
    if (param_4 != 0) {
      do {
        *param_3 = (short)((uint)(iVar2 * ((int)*param_2 - (int)*param_1)) >> 0xc) + *param_1;
        param_4 = param_4 - 1;
        param_3 = param_3 + 1;
        param_2 = param_2 + 1;
        param_1 = param_1 + 1;
      } while (param_4 != 0);
    }
  }
  else if (param_4 != 0) {
    do {
      iVar3 = (iVar2 * ((int)*param_2 - (int)*param_1) >> 0xc) + (int)*param_1;
      if (iVar3 < -0x7fff) {
        iVar3 = -0x8000;
      }
      if (0x7ffe < iVar3) {
        iVar3 = 0x7fff;
      }
      *param_3 = (short)iVar3;
      param_4 = param_4 - 1;
      param_3 = param_3 + 1;
      param_2 = param_2 + 1;
      param_1 = param_1 + 1;
    } while (param_4 != 0);
  }
  return;
}



### FUNC InterpolateUShort @ 000285c4

/* CFunctions::InterpolateUShort(unsigned short const*, unsigned short const*, unsigned short*,
   unsigned int) */

void __thiscall
CFunctions::InterpolateUShort
          (CFunctions *this,ushort *param_1,ushort *param_2,ushort *param_3,uint param_4)

{
  bool bVar1;
  int iVar2;
  int iVar3;
  
  iVar2 = *(int *)(this + 0x38);
  if ((iVar2 < *(int *)(this + 0x2e38)) ||
     (bVar1 = true, *(int *)(this + *(int *)(this + 0x2e2c) * 4 + 0x2e34) < iVar2)) {
    bVar1 = false;
  }
  iVar2 = __divsi3((iVar2 - *(int *)(this + *(int *)(this + 0x3108) * 4 + 0x2e38)) * 0x1000,
                   *(int *)(this + *(int *)(this + 0x3108) * 4 + 0x2e3c) -
                   *(int *)(this + *(int *)(this + 0x3108) * 4 + 0x2e38));
  if (iVar2 < -0x3ffe) {
    iVar2 = -0x3fff;
  }
  if (0x3ffe < iVar2) {
    iVar2 = 0x3fff;
  }
  if (bVar1) {
    for (; param_4 != 0; param_4 = param_4 - 1) {
      *param_3 = (short)(iVar2 * ((uint)*param_2 - (uint)*param_1) >> 0xc) + *param_1;
      param_3 = param_3 + 1;
      param_2 = param_2 + 1;
      param_1 = param_1 + 1;
    }
  }
  else if (param_4 != 0) {
    do {
      iVar3 = ((int)(iVar2 * ((uint)*param_2 - (uint)*param_1)) >> 0xc) + (uint)*param_1;
      if (iVar3 < 1) {
        iVar3 = 0;
      }
      if (0xfffe < iVar3) {
        iVar3 = 0xffff;
      }
      *param_3 = (ushort)iVar3;
      param_4 = param_4 - 1;
      param_3 = param_3 + 1;
      param_2 = param_2 + 1;
      param_1 = param_1 + 1;
    } while (param_4 != 0);
  }
  return;
}



### FUNC Raw2Temperature @ 000286a4

/* CFunctions::Raw2Temperature(unsigned short const*) */

undefined4 __thiscall CFunctions::Raw2Temperature(CFunctions *this,ushort *param_1)

{
  int iVar1;
  
  if (*(int *)(this + 0x3808) != 1) {
    iVar1 = CAccumulator::PushFrame((CAccumulator *)(this + 0x37a4),param_1);
    if (iVar1 == 0) {
      return 0;
    }
    param_1 = (ushort *)0x0;
    if (*(int *)(this + 0x37c0) != 0) {
      param_1 = *(ushort **)(this + 0x37ac);
    }
  }
  Calibration(this,param_1);
  return 1;
}



### FUNC Calibration @ 000286e8

/* CFunctions::Calibration(unsigned short const*) */

void __thiscall CFunctions::Calibration(CFunctions *this,ushort *param_1)

{
  if ((*(int *)(this + 0x2d1c) != 0) && (*(int *)(this + 0x2d24) != 0)) {
    CalibrationMain_RTV(this,param_1);
    BlindCompensation(this,*(ushort **)(this + 0xb4));
    return;
  }
  ConvertResponse2Temperature(this,param_1);
  return;
}



### FUNC PushFrame @ 00028720

/* CFunctions::PushFrame(unsigned short const*, SrcDataType, int, int, int) */

undefined4 __thiscall
CFunctions::PushFrame
          (CFunctions *this,ushort *param_1,int param_3,undefined4 param_4,int param_5,int param_6)

{
  int iVar1;
  undefined4 uVar2;
  int iVar3;
  uint uVar4;
  pthread_mutex_t *__mutex;
  CFunctions *local_20;
  
  __mutex = (pthread_mutex_t *)(this + 0xb0);
  pthread_mutex_lock(__mutex);
  iVar1 = GetTickCount();
  if ((param_1 == (ushort *)0x0) || (*(int *)(this + 0xa4) == 0)) {
LAB_0002880c:
    pthread_mutex_unlock(__mutex);
    return 0;
  }
  if (param_3 == 0) {
    if (*(int *)(this + 0xa8) == 0) goto LAB_0002880c;
    *(undefined4 *)(this + 0x3868) = 0;
    *(undefined4 *)(this + 0x3864) = 0;
    *(undefined4 *)(this + 0x386c) = 0;
    iVar3 = Raw2Temperature(this,param_1);
    if (iVar3 == 0) goto LAB_00028816;
  }
  else {
    *(undefined4 *)(this + 0x3868) = 0;
    *(undefined4 *)(this + 0x3864) = 0;
    *(undefined4 *)(this + 0x386c) = 0;
    if (param_3 != 1) {
LAB_00028816:
      pthread_mutex_unlock(__mutex);
      return 0;
    }
    __aeabi_memcpy(*(undefined4 *)(this + 0xb4),param_1,*(int *)(this + 0x50f0) << 1);
  }
  local_20 = this + 0x3864;
  if (*(uint *)(this + 0x70) != 0) {
    Mirror(this,*(uint *)(this + 0x70));
  }
  uVar2 = 0;
  if ((param_5 == 0) && (1 < *(uint *)(this + 0x380c))) {
    uVar4 = *(uint *)(this + 0x34) >> (*(uint *)(this + 0x5104) & 0xff);
    if (0xfffe < uVar4) {
      uVar4 = 0xffff;
    }
    CSmoother::PushFrameAve((CSmoother *)(this + 0x37c4),*(ushort **)(this + 0xb4),uVar4);
    uVar2 = 1;
  }
  *(undefined4 *)(this + 0x3860) = uVar2;
  if (param_6 == 0) goto switchD_000287fe_default;
  switch(*(undefined4 *)(this + 0x3814)) {
  case 1:
    FilterE2X(this);
    goto switchD_000287fe_default;
  case 2:
    break;
  case 3:
    FilterE2X(this);
    break;
  case 4:
    FilterE4X(this);
    break;
  default:
    goto switchD_000287fe_default;
  }
  FilterE4X(this);
switchD_000287fe_default:
  TempRangeStat(this,*(ushort **)(this + 0xb4));
  GrayEnlarge(this);
  if (((*(int *)local_20 != 0) && (*(int *)(this + 0x28) != 0)) &&
     ((*(int *)(this + 0x24) == 0 || (*(int *)(this + 0xc) != 0)))) {
    uVar4 = *(int *)(this + 0x28) << 3;
    if (*(int *)(this + 0x58) == 0) {
      FilterDetailEnhancement(this,uVar4);
    }
    else {
      FilterDetailEnhancement_Simple(this,uVar4);
    }
  }
  iVar3 = GetTickCount();
  *(int *)(this + 0x3870) = iVar3 - iVar1;
  CopyState(this);
  *(undefined4 *)(this + 0xac) = 1;
  pthread_mutex_unlock(__mutex);
  return 3;
}



### FUNC Mirror @ 000288c4

/* WARNING: Restarted to delay deadcode elimination for space: stack */
/* CFunctions::Mirror(unsigned int) */

void __thiscall CFunctions::Mirror(CFunctions *this,uint param_1)

{
  bool bVar1;
  int iVar2;
  int iVar3;
  int iVar4;
  int iVar5;
  uint uVar6;
  int iVar7;
  uint uVar8;
  int iVar9;
  int iVar10;
  int iVar11;
  int iVar12;
  uint uVar13;
  undefined1 auStack_818 [2052];
  
  iVar2 = __stack_chk_guard;
  iVar9 = *(int *)(this + 0x37f0);
  iVar11 = *(int *)(this + 0x37ec);
  if ((*(int *)(this + 0x74) == 0xb4) || (*(int *)(this + 0x74) == 0)) {
    uVar8 = param_1 & 1;
    uVar6 = 2;
  }
  else {
    uVar6 = 1;
    uVar8 = param_1 >> 1 & 1;
  }
  if (((param_1 & uVar6) != 0) && (iVar7 = iVar9 / 2, 1 < iVar9)) {
    iVar10 = iVar11 * (iVar9 + -1) * 2;
    iVar3 = iVar11 * 2;
    iVar12 = 0;
    do {
      iVar4 = *(int *)(this + 0xb4);
      iVar5 = iVar4 + iVar12;
      __aeabi_memcpy(auStack_818,iVar5,iVar3);
      iVar4 = iVar4 + iVar10;
      __aeabi_memcpy(iVar5,iVar4,iVar3);
      __aeabi_memcpy(iVar4,auStack_818,iVar3);
      iVar12 = iVar12 + iVar3;
      iVar10 = iVar10 + iVar11 * -2;
      iVar7 = iVar7 + -1;
    } while (iVar7 != 0);
  }
  if ((uVar8 != 0) && (0 < iVar9)) {
    iVar3 = iVar11 * (iVar9 + -1);
    iVar7 = *(int *)(this + 0xb4) + iVar3 * 2;
    uVar6 = iVar11 + ((uint)(iVar11 >> 0x1f) >> 0x1e);
    iVar3 = *(int *)(this + 0xb4) + (iVar3 + (uVar6 & 0x7ffffffc)) * 2 + -4;
    do {
      if (6 < iVar11 + 3U) {
        iVar10 = 0;
        do {
          uVar13 = *(uint *)(iVar3 + iVar10 * -4);
          uVar8 = *(uint *)(iVar7 + iVar10 * 4);
          *(uint *)(iVar3 + iVar10 * -4) = uVar8 >> 0x10 | uVar8 << 0x10;
          *(uint *)(iVar7 + iVar10 * 4) = uVar13 >> 0x10 | uVar13 << 0x10;
          iVar10 = iVar10 + 1;
        } while ((int)uVar6 >> 2 != iVar10);
      }
      iVar7 = iVar7 + iVar11 * -2;
      iVar3 = iVar3 + iVar11 * -2;
      bVar1 = 1 < iVar9;
      iVar9 = iVar9 + -1;
    } while (bVar1);
  }
  if (__stack_chk_guard != iVar2) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return;
}



### FUNC ConvertDeltamC2InnerTemp @ 00028a20

/* CFunctions::ConvertDeltamC2InnerTemp(unsigned int) const */

uint __thiscall CFunctions::ConvertDeltamC2InnerTemp(CFunctions *this,uint param_1)

{
  uint uVar1;
  
  uVar1 = param_1 >> (*(uint *)(this + 0x5104) & 0xff);
  if (0xfffe < uVar1) {
    uVar1 = 0xffff;
  }
  return uVar1 & 0xffff;
}



### FUNC FilterE2X @ 00028a3c

/* CFunctions::FilterE2X() */

void __thiscall CFunctions::FilterE2X(CFunctions *this)

{
  ushort uVar1;
  ushort *puVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  CFunctions *pCVar6;
  int iVar7;
  ushort *puVar8;
  uint uVar9;
  int iVar10;
  int iVar11;
  uint uVar12;
  uint *puVar13;
  uint *local_18;
  
  uVar5 = *(uint *)(this + 0x37ec);
  iVar10 = *(int *)(this + 0xb4) + uVar5 * *(int *)(this + 0x381c) * 2 + *(int *)(this + 0x3818) * 2
  ;
  iVar11 = *(int *)(this + 0xbc);
  pCVar6 = this + 0x37ec;
  iVar7 = -1 - (*(uint *)(this + 0x37f0) >> 1);
  do {
    __aeabi_memcpy(iVar11,iVar10,uVar5 + 4 & 0xfffffffe);
    uVar5 = *(uint *)pCVar6;
    iVar10 = iVar10 + uVar5 * 2;
    iVar11 = iVar11 + (uVar5 & 0xfffffffe) + 4;
    iVar7 = iVar7 + 1;
  } while (iVar7 != 0);
  uVar3 = *(uint *)(this + 0x37f0) >> 1;
  if (uVar3 != 0) {
    puVar8 = *(ushort **)(this + 0xbc);
    local_18 = *(uint **)(this + 0xb4);
    while( true ) {
      uVar12 = uVar5 >> 1;
      if (uVar12 != 0) {
        iVar11 = -uVar12;
        puVar2 = puVar8 + uVar12;
        uVar5 = (uint)*puVar8;
        puVar13 = local_18;
        do {
          puVar8 = puVar8 + 1;
          uVar1 = *puVar8;
          *puVar13 = (uVar1 + uVar5) * 0x8000 & 0xffff0000 | uVar5;
          puVar13 = puVar13 + 1;
          iVar11 = iVar11 + 1;
          uVar5 = (uint)uVar1;
        } while (iVar11 != 0);
        local_18 = local_18 + uVar12;
        uVar5 = *(uint *)pCVar6;
        puVar8 = puVar2;
      }
      uVar5 = uVar5 >> 1;
      puVar2 = puVar8 + -uVar5;
      iVar11 = -uVar5;
      if (uVar5 != 0) {
        uVar12 = (uint)puVar8[2];
        uVar9 = (uint)*puVar2;
        iVar7 = 0;
        do {
          uVar4 = uVar12 + uVar9;
          uVar9 = (uint)*(ushort *)((int)puVar8 + -iVar7 + uVar5 * -2 + 2);
          uVar12 = (uint)*(ushort *)((int)puVar8 + -iVar7 + 6);
          *(uint *)((int)local_18 + iVar7 * -2) =
               uVar4 >> 1 | (uVar4 + uVar9 + uVar12) * 0x4000 & 0xffff0000;
          iVar11 = iVar11 + 1;
          iVar7 = iVar7 + -2;
        } while (iVar11 != 0);
        local_18 = local_18 + uVar5;
        puVar2 = puVar8;
      }
      uVar3 = uVar3 - 1;
      if (uVar3 == 0) break;
      uVar5 = *(uint *)pCVar6;
      puVar8 = puVar2 + 2;
    }
  }
  return;
}



### FUNC FilterE4X @ 00028ba0

/* CFunctions::FilterE4X() */

void __thiscall CFunctions::FilterE4X(CFunctions *this)

{
  uint uVar1;
  uint uVar2;
  CFunctions *pCVar3;
  uint uVar4;
  int iVar5;
  uint uVar6;
  uint uVar7;
  uint uVar8;
  int iVar9;
  uint *puVar10;
  ushort *puVar11;
  uint uVar12;
  ushort *puVar13;
  ushort *puVar14;
  int local_58;
  int local_20;
  uint *local_18;
  
  uVar6 = *(uint *)(this + 0x37ec);
  iVar9 = *(int *)(this + 0xb4) + uVar6 * *(int *)(this + 0x381c) * 2 + *(int *)(this + 0x3818) * 2;
  iVar5 = *(int *)(this + 0xbc);
  pCVar3 = this + 0x37ec;
  uVar7 = ~(*(uint *)(this + 0x37f0) >> 2);
  local_58 = 0;
  do {
    __aeabi_memcpy(iVar5,iVar9,(uVar6 >> 1 & 0x7ffffffe) + 4);
    uVar6 = *(uint *)pCVar3;
    iVar9 = iVar9 + uVar6 * 2;
    iVar5 = iVar5 + (uVar6 >> 1 & 0x7ffffffe) + 4;
    uVar7 = uVar7 + 1;
  } while (uVar7 != 0);
  uVar7 = *(uint *)(this + 0x37f0) >> 2;
  if (uVar7 != 0) {
    puVar11 = *(ushort **)(this + 0xbc);
    local_18 = *(uint **)(this + 0xb4);
    while( true ) {
      uVar4 = uVar6 >> 2;
      if (uVar4 != 0) {
        iVar5 = -uVar4;
        uVar6 = (uint)*puVar11;
        puVar10 = local_18;
        puVar13 = puVar11;
        do {
          puVar13 = puVar13 + 1;
          uVar8 = (uint)*puVar13;
          *puVar10 = (uVar6 * 3 + uVar8) * 0x4000 & 0xffff0000 | uVar6;
          puVar10[1] = uVar8 + uVar6 >> 1 | (uVar8 * 3 + uVar6) * 0x4000 & 0xffff0000;
          puVar10 = puVar10 + 2;
          iVar5 = iVar5 + 1;
          uVar6 = uVar8;
        } while (iVar5 != 0);
        local_18 = local_18 + uVar4 * 2;
        puVar11 = puVar11 + uVar4;
        uVar6 = *(uint *)pCVar3;
      }
      uVar4 = uVar6 >> 2;
      puVar13 = puVar11 + -uVar4;
      local_20 = -uVar4;
      if (uVar4 != 0) {
        iVar5 = local_58;
        uVar6 = (uint)*puVar13;
        uVar8 = (uint)puVar11[2];
        do {
          uVar12 = (uint)*(ushort *)((int)puVar11 + -iVar5 + 6);
          uVar1 = (uint)*(ushort *)((int)puVar11 + -iVar5 + uVar4 * -2 + 2);
          local_18[-iVar5] =
               uVar6 * 3 + uVar8 >> 2 |
               (uVar6 * 9 + uVar12 + (uVar1 + uVar8) * 3) * 0x1000 & 0xffff0000;
          local_18[1 - iVar5] =
               (uVar1 + uVar6) * 3 + uVar8 + uVar12 >> 3 |
               (uVar1 * 9 + uVar8 + (uVar12 + uVar6) * 3) * 0x1000 & 0xffff0000;
          local_20 = local_20 + 1;
          iVar5 = iVar5 + -2;
          uVar6 = uVar1;
          uVar8 = uVar12;
        } while (local_20 != 0);
        local_18 = local_18 + uVar4 * 2;
        uVar6 = *(uint *)pCVar3;
        puVar13 = puVar11;
      }
      uVar4 = uVar6 >> 2;
      puVar14 = puVar13 + -uVar4;
      iVar5 = -uVar4;
      if (uVar4 != 0) {
        iVar9 = 0;
        uVar6 = (uint)puVar13[2];
        uVar8 = (uint)*puVar14;
        do {
          uVar1 = uVar6 + uVar8;
          uVar12 = (uint)*(ushort *)((int)puVar13 + -iVar9 + uVar4 * -2 + 2);
          uVar2 = (uint)*(ushort *)((int)puVar13 + -iVar9 + 6);
          local_18[-iVar9] = uVar1 >> 1 | (uVar1 * 3 + uVar12 + uVar2) * 0x2000 & 0xffff0000;
          local_18[1 - iVar9] =
               uVar12 + uVar8 + uVar6 + uVar2 >> 2 |
               (uVar1 + (uVar2 + uVar12) * 3) * 0x2000 & 0xffff0000;
          iVar5 = iVar5 + 1;
          iVar9 = iVar9 + -2;
          uVar6 = uVar2;
          uVar8 = uVar12;
        } while (iVar5 != 0);
        local_18 = local_18 + uVar4 * 2;
        uVar6 = *(uint *)pCVar3;
        puVar14 = puVar13;
      }
      uVar6 = uVar6 >> 2;
      puVar11 = puVar14 + -uVar6;
      local_20 = -uVar6;
      if (uVar6 != 0) {
        iVar5 = 0;
        uVar4 = (uint)*puVar11;
        uVar8 = (uint)puVar14[2];
        do {
          uVar1 = (uint)*(ushort *)((int)puVar14 + -iVar5 + uVar6 * -2 + 2);
          uVar12 = (uint)*(ushort *)((int)puVar14 + -iVar5 + 6);
          local_18[-iVar5] =
               uVar8 * 3 + uVar4 >> 2 |
               (uVar8 * 9 + uVar1 + (uVar12 + uVar4) * 3) * 0x1000 & 0xffff0000;
          local_18[1 - iVar5] =
               ((uVar8 + uVar1) * 3 + uVar4 + uVar12 * 9) * 0x1000 & 0xffff0000 |
               uVar1 + uVar4 + (uVar12 + uVar8) * 3 >> 3;
          local_20 = local_20 + 1;
          iVar5 = iVar5 + -2;
          uVar4 = uVar1;
          uVar8 = uVar12;
        } while (local_20 != 0);
        local_18 = local_18 + uVar6 * 2;
        puVar11 = puVar14;
      }
      uVar7 = uVar7 - 1;
      if (uVar7 == 0) break;
      uVar6 = *(uint *)pCVar3;
      puVar11 = puVar11 + 2;
    }
  }
  return;
}



### FUNC TempRangeStat @ 00028eec

/* CFunctions::TempRangeStat(unsigned short const*) */

void __thiscall CFunctions::TempRangeStat(CFunctions *this,ushort *param_1)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  undefined4 uVar5;
  int iVar6;
  uint uVar7;
  uint uVar8;
  ushort *puVar9;
  bool bVar10;
  int local_34;
  uint local_28;
  uint local_24;
  int local_20;
  uint local_1c;
  int local_18;
  
  uVar4 = *(uint *)(this + 0x50f0);
  local_24 = (uint)*param_1;
  local_34 = 0;
  local_28 = local_24;
  if (uVar4 == 0) {
    iVar6 = 0;
    local_1c = 0;
    local_18 = 0;
  }
  else {
    uVar7 = 1;
    local_1c = 0;
    local_18 = 0;
    local_20 = 0;
    local_34 = 0;
    uVar8 = local_24;
    puVar9 = param_1 + 1;
    while( true ) {
      bVar10 = CARRY4(local_1c,uVar8);
      local_1c = local_1c + uVar8;
      local_18 = local_18 + (uint)bVar10;
      iVar6 = local_20;
      iVar1 = uVar7 - 1;
      uVar2 = local_28;
      uVar3 = uVar8;
      if ((uVar8 <= local_24) &&
         (iVar6 = uVar7 - 1, iVar1 = local_34, uVar2 = uVar8, uVar3 = local_24, local_28 <= uVar8))
      {
        iVar6 = local_20;
        uVar2 = local_28;
      }
      local_24 = uVar3;
      local_28 = uVar2;
      local_34 = iVar1;
      if (uVar4 <= uVar7) break;
      uVar7 = uVar7 + 1;
      uVar8 = (uint)*puVar9;
      puVar9 = puVar9 + 1;
      local_20 = iVar6;
    }
  }
  *(int *)(this + 0x3848) = local_34;
  *(int *)(this + 0x384c) = iVar6;
  *(uint *)(this + 0x383c) = local_28;
  *(uint *)(this + 0x3838) = local_24;
  uVar5 = __aeabi_ldivmod(local_1c,local_18,uVar4,0);
  *(undefined4 *)(this + 0x3840) = uVar5;
  return;
}



### FUNC GrayEnlarge @ 00028fbc

/* CFunctions::GrayEnlarge() */

void __thiscall CFunctions::GrayEnlarge(CFunctions *this)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  
  uVar4 = *(uint *)(this + 0x3838);
  uVar5 = *(uint *)(this + 0x383c);
  if (uVar5 == uVar4) {
    *(uint *)(this + 0x3854) = uVar5;
    *(uint *)(this + 0x3858) = uVar5;
    __aeabi_memset4(this + 0x4074,0x400,0x80);
    __aeabi_memset(*(undefined4 *)(this + 0xc0),*(undefined4 *)(this + 0x50f0),0x80);
    __aeabi_memclr4(this + 0x3874,0x400);
    *(undefined4 *)(this + 0x3a74) = *(undefined4 *)(this + 0x50f0);
    __aeabi_memset(*(undefined4 *)(this + 200),*(undefined4 *)(this + 0x50f8),0x80);
    *(undefined4 *)(this + 0x3864) = 1;
    return;
  }
  if (*(int *)(this + 0xc) == 0) {
    iVar1 = 0x3840;
    if (*(int *)(this + 0x5c) != 0) {
      SearchSeparateLine(this);
      iVar1 = 0x447c;
      uVar4 = *(uint *)(this + 0x3838);
      uVar5 = *(uint *)(this + 0x383c);
    }
    iVar1 = *(int *)(this + iVar1);
    uVar2 = CalContrastOffsetedAutoEnlargeRange(this);
    uVar3 = iVar1 - (uVar2 >> 1);
    if (uVar5 <= uVar3) {
      uVar3 = uVar5;
    }
    *(uint *)(this + 0x3858) = uVar3;
    uVar5 = (uVar2 >> 1) + iVar1;
    if (uVar5 <= uVar4) {
      uVar5 = uVar4;
    }
    *(uint *)(this + 0x3854) = uVar5;
    if ((int)uVar3 < 0) {
      *(undefined4 *)(this + 0x3858) = 0;
    }
    if (0xffff < (int)uVar5) {
      *(undefined4 *)(this + 0x3854) = 0xffff;
    }
    HistDeRedundance(this);
    if (*(int *)(this + 0x24) != 0) {
      IsothermalPalette(this);
      *(undefined4 *)(this + 0x4474) = 1;
      goto LAB_000290e4;
    }
    if (*(int *)(this + 0x5108) == 0xb) {
      DynamicRedPalette(this);
      goto LAB_000290e4;
    }
  }
  else {
    SubSectionEnlarge(this);
  }
  if (*(int *)(this + 0x4474) != 0) {
    __aeabi_memcpy(this + 0x24f4,this + 0x20cc,0x400);
    __aeabi_memcpy(this + 0x291c,this + 0x20cc,0x400);
    *(undefined4 *)(this + 0x4474) = 0;
  }
LAB_000290e4:
  MapTemperature((int)this);
  return;
}



### FUNC FilterDetailEnhancement_Simple @ 00029134

/* CFunctions::FilterDetailEnhancement_Simple(unsigned int) */

void __thiscall CFunctions::FilterDetailEnhancement_Simple(CFunctions *this,uint param_1)

{
  uint uVar1;
  CFunctions *pCVar2;
  CFunctions *pCVar3;
  int iVar4;
  uint uVar5;
  byte *pbVar6;
  CFunctions *pCVar7;
  ushort *puVar8;
  int *piVar9;
  int iVar10;
  uint local_20;
  
  if (param_1 != 0) {
    uVar1 = (uint)(*(int *)(this + 0x20) * 1000) >> (*(uint *)(this + 0x5104) & 0xff);
    if (0xfffe < uVar1) {
      uVar1 = 0xffff;
    }
    uVar1 = param_1 * uVar1 * 2 >> 8;
    pCVar2 = this + 0x37ec;
    pCVar3 = this + 0x37f0;
    pCVar7 = this + 0xc4;
    local_20 = 0;
    do {
      iVar4 = *(int *)pCVar2;
      if (iVar4 != 6) {
        iVar10 = 6 - iVar4;
        puVar8 = (ushort *)(*(int *)(this + 0xb4) + iVar4 * local_20 * 2);
        piVar9 = (int *)(*(int *)pCVar7 + iVar4 * (local_20 + 3) * 4 + 0xc);
        do {
          LocalMap7x7_Simple(this,piVar9,puVar8,uVar1);
          iVar10 = iVar10 + 1;
          puVar8 = puVar8 + 1;
          piVar9 = piVar9 + 1;
        } while (iVar10 != 0);
      }
      local_20 = local_20 + 2;
      iVar4 = *(int *)pCVar3;
    } while (local_20 <= iVar4 - 7U);
    iVar10 = 7;
    if (iVar4 != 7) {
      uVar5 = 1;
      do {
        iVar10 = *(int *)pCVar2;
        if (iVar10 != 6) {
          iVar4 = 6 - iVar10;
          puVar8 = (ushort *)(*(int *)(this + 0xb4) + iVar10 * uVar5 * 2);
          piVar9 = (int *)(*(int *)pCVar7 + iVar10 * (uVar5 + 3) * 4 + 0xc);
          do {
            LocalMap7x7_Simple(this,piVar9,puVar8,uVar1);
            iVar4 = iVar4 + 1;
            puVar8 = puVar8 + 1;
            piVar9 = piVar9 + 1;
          } while (iVar4 != 0);
          iVar4 = *(int *)pCVar3;
        }
        uVar5 = uVar5 + 2;
      } while (uVar5 <= iVar4 - 7U);
      iVar10 = iVar4;
      if (iVar4 - 3U < 4) {
        return;
      }
    }
    uVar1 = 3;
    do {
      iVar4 = *(int *)pCVar2;
      if (iVar4 != 6) {
        iVar10 = 6 - iVar4;
        piVar9 = (int *)(*(int *)pCVar7 + iVar4 * uVar1 * 4 + 0xc);
        pbVar6 = (byte *)(*(int *)(this + 0xc0) + iVar4 * uVar1 + 3);
        do {
          iVar4 = *piVar9;
          piVar9 = piVar9 + 1;
          iVar4 = ((int)(param_1 * iVar4 + ((uint)((int)(param_1 * iVar4) >> 0x1f) >> 0x11)) >> 0xf)
                  + (uint)*pbVar6;
          if (iVar4 < 1) {
            iVar4 = 0;
          }
          if (0xfe < iVar4) {
            iVar4 = 0xff;
          }
          *pbVar6 = (byte)iVar4;
          iVar10 = iVar10 + 1;
          pbVar6 = pbVar6 + 1;
        } while (iVar10 != 0);
        iVar10 = *(int *)pCVar3;
      }
      uVar1 = uVar1 + 1;
    } while (uVar1 < iVar10 - 3U);
  }
  return;
}



### FUNC FilterDetailEnhancement @ 000292a0

/* CFunctions::FilterDetailEnhancement(unsigned int) */

void __thiscall CFunctions::FilterDetailEnhancement(CFunctions *this,uint param_1)

{
  uint uVar1;
  uint uVar2;
  CFunctions *pCVar3;
  uint uVar4;
  int iVar5;
  int *piVar6;
  int iVar7;
  uint uVar8;
  int iVar9;
  int iVar10;
  uint local_34;
  int local_30;
  uint local_24;
  int local_20;
  
  if (param_1 != 0) {
    __aeabi_memclr4(*(undefined4 *)(this + 0xc4),*(int *)(this + 0x50f0) << 2);
    uVar1 = (uint)(*(int *)(this + 0x20) * 1000) >> (*(uint *)(this + 0x5104) & 0xff);
    if (0xfffe < uVar1) {
      uVar1 = 0xffff;
    }
    pCVar3 = this + 0x37ec;
    uVar4 = *(uint *)(this + 0x37f0);
    uVar8 = 6;
    if (uVar4 != 6) {
      iVar9 = 0;
      local_30 = 0;
      local_34 = 0;
      do {
        iVar5 = *(int *)pCVar3;
        if (iVar5 != 6) {
          iVar7 = iVar5 * iVar9;
          iVar10 = iVar5 * local_30;
          iVar5 = 6 - iVar5;
          do {
            LocalMap7x7(this,(int *)(*(int *)(this + 0xc4) + iVar10),
                        (ushort *)(*(int *)(this + 0xb4) + iVar7),param_1 * uVar1 * 2 >> 8);
            iVar7 = iVar7 + 2;
            iVar10 = iVar10 + 4;
            iVar5 = iVar5 + 1;
          } while (iVar5 != 0);
          uVar4 = *(uint *)(this + 0x37f0);
        }
        iVar9 = iVar9 + 2;
        local_30 = local_30 + 4;
        local_34 = local_34 + 1;
      } while (local_34 < uVar4 - 6);
      uVar8 = uVar4;
      if (uVar4 == 0) {
        return;
      }
    }
    local_20 = *(int *)(this + 0xc0);
    piVar6 = *(int **)(this + 0xc4);
    uVar1 = 0;
    do {
      if (uVar1 < 6) {
        local_24 = (uVar1 >> 1) + 1;
      }
      else {
        local_24 = 4;
        if (uVar8 < uVar1 + 7) {
          local_24 = (1 - uVar1) + uVar8 >> 1;
        }
      }
      uVar4 = *(uint *)pCVar3;
      if (uVar4 != 0) {
        uVar8 = 0;
        iVar9 = 1;
        do {
          if (uVar8 < 6) {
            uVar2 = (uVar8 >> 1) + 1;
          }
          else {
            uVar2 = 4;
            if (uVar4 < uVar8 + 7) {
              uVar2 = uVar4 + iVar9 >> 1;
            }
          }
          iVar5 = 0x80000;
          if (local_24 * uVar2 != 0x10) {
            iVar5 = local_24 * uVar2 * 0x8000;
          }
          iVar7 = *piVar6;
          piVar6 = piVar6 + 1;
          iVar5 = __divsi3(param_1 * iVar7,iVar5);
          iVar5 = iVar5 + (uint)*(byte *)(local_20 + uVar8);
          if (iVar5 < 1) {
            iVar5 = 0;
          }
          if (0xfe < iVar5) {
            iVar5 = 0xff;
          }
          *(byte *)(local_20 + uVar8) = (byte)iVar5;
          iVar9 = iVar9 + -1;
          uVar8 = uVar8 + 1;
          uVar4 = *(uint *)pCVar3;
        } while (uVar8 < uVar4);
        local_20 = local_20 + uVar8;
        uVar8 = *(uint *)(this + 0x37f0);
      }
      uVar1 = uVar1 + 1;
    } while (uVar1 < uVar8);
  }
  return;
}



### FUNC CopyState @ 00029418

/* CFunctions::CopyState() */

void __thiscall CFunctions::CopyState(CFunctions *this)

{
  undefined4 uVar1;
  float extraout_s0;
  float extraout_s0_00;
  float extraout_s0_01;
  
  __aeabi_memcpy4(this + 0x4488,this + 0x3820,0xc68);
  *(uint *)(this + 0x44c4) = (uint)*(ushort *)(this + 0x385c) << (*(uint *)(this + 0x5104) & 0xff);
  *(uint *)(this + 0x44ac) = (uint)*(ushort *)(this + 0x3844) << (*(uint *)(this + 0x5104) & 0xff);
  uVar1 = ReviseTemperature(this,*(ushort *)(this + 0x3840),
                            (*(uint *)(this + 0x37ec) >> 1) + (*(uint *)(this + 0x50f0) >> 1));
  *(undefined4 *)(this + 0x44a8) = uVar1;
  uVar1 = ReviseTemperature(this,*(ushort *)(this + 0x3854),
                            (*(uint *)(this + 0x37ec) >> 1) + (*(uint *)(this + 0x50f0) >> 1));
  *(undefined4 *)(this + 0x44bc) = uVar1;
  uVar1 = ReviseTemperature(this,*(ushort *)(this + 0x3838),*(uint *)(this + 0x44b0));
  *(undefined4 *)(this + 0x44a0) = uVar1;
  uVar1 = ReviseTemperature(this,*(ushort *)(this + 0x3858),
                            (*(uint *)(this + 0x37ec) >> 1) + (*(uint *)(this + 0x50f0) >> 1));
  *(undefined4 *)(this + 0x44c0) = uVar1;
  uVar1 = ReviseTemperature(this,*(ushort *)(this + 0x383c),*(uint *)(this + 0x44b4));
  *(undefined4 *)(this + 0x44a4) = uVar1;
  if (*(int *)(this + 0x50) != 0) {
    uVar1 = CorrectTemperature((int)this,extraout_s0,*(uint *)(this + 0x44a8));
    *(undefined4 *)(this + 0x44a8) = uVar1;
    uVar1 = CorrectTemperature((int)this,extraout_s0_00,*(uint *)(this + 0x44a4));
    *(undefined4 *)(this + 0x44a4) = uVar1;
    uVar1 = CorrectTemperature((int)this,extraout_s0_01,*(uint *)(this + 0x44a0));
    *(undefined4 *)(this + 0x44a0) = uVar1;
  }
  return;
}



### FUNC ConvertDeltaInnerTemp2mC @ 0002954c

/* CFunctions::ConvertDeltaInnerTemp2mC(unsigned short) const */

int __thiscall CFunctions::ConvertDeltaInnerTemp2mC(CFunctions *this,ushort param_1)

{
  return (uint)param_1 << (*(uint *)(this + 0x5104) & 0xff);
}



### FUNC ReviseTemperature @ 0002955c

/* CFunctions::ReviseTemperature(unsigned short, unsigned int) */

int __thiscall CFunctions::ReviseTemperature(CFunctions *this,ushort param_1,uint param_2)

{
  uint uVar1;
  int iVar2;
  int iVar3;
  uint uVar4;
  undefined4 uVar5;
  undefined4 uVar6;
  CFunctions *this_00;
  int iVar7;
  int iVar8;
  int iVar9;
  CFunctions *pCVar10;
  int iVar11;
  uint uVar12;
  int iVar13;
  int iVar14;
  uint uVar15;
  undefined4 uVar16;
  float __x;
  undefined8 uVar17;
  int local_28;
  
  uVar15 = (uint)param_1;
  if (*(int *)(this + 0x3128) == 0) {
    iVar7 = (uVar15 << (*(uint *)(this + 0x5104) & 0xff)) + *(int *)(this + 0x5100);
  }
  else {
    uVar1 = 0;
    if (*(uint *)(this + 0x68) < *(uint *)(this + 0x312c)) {
      uVar1 = *(uint *)(this + 0x68);
    }
    uVar16 = *(undefined4 *)(this + uVar1 * 0x21c + 0x3334);
    iVar2 = __aeabi_fcmpgt(uVar16,0x3c23d70a);
    iVar3 = __aeabi_fcmplt(uVar16,0x3f7d70a4);
    local_28 = 0x111;
    if (iVar2 != 0 && iVar3 != 0) {
      iVar8 = *(int *)(this + 0x5100);
      uVar4 = *(uint *)(this + 0x5104);
      iVar13 = (uVar15 << (uVar4 & 0xff)) + iVar8;
      iVar9 = iVar13 + 50000;
      iVar7 = 0;
      if (-0xe350 < iVar13) {
        iVar7 = 0x111;
        if (iVar13 < 0x217cb0) {
          iVar7 = (int)(iVar9 + ((uint)(iVar9 >> 0x1f) >> 0x13)) >> 0xd;
        }
      }
      iVar14 = *(int *)(T2E + iVar7 * 4);
      iVar9 = (*(int *)(T2E + iVar7 * 4 + 4) - iVar14) * (iVar9 + iVar7 * -0x2000);
      iVar11 = *(int *)(this + 0x40);
      iVar13 = iVar11 + 50000;
      iVar7 = 0;
      if (-0xe350 < iVar11) {
        iVar7 = 0x111;
        if (iVar11 < 0x217cb0) {
          iVar7 = (int)(iVar13 + ((uint)(iVar13 >> 0x1f) >> 0x13)) >> 0xd;
        }
      }
      iVar13 = (*(int *)(T2E + iVar7 * 4 + 4) - *(int *)(T2E + iVar7 * 4)) *
               (iVar13 + iVar7 * -0x2000);
      uVar5 = __floatsisf(((int)(iVar13 + ((uint)(iVar13 >> 0x1f) >> 0x13)) >> 0xd) +
                          *(int *)(T2E + iVar7 * 4));
      uVar6 = __subsf3(0x3f800000,uVar16);
      uVar5 = __mulsf3(uVar6,uVar5);
      uVar6 = __floatsisf(((int)(iVar9 + ((uint)(iVar9 >> 0x1f) >> 0x13)) >> 0xd) + iVar14);
      uVar5 = __subsf3(uVar6,uVar5);
      __divsf3(uVar5,uVar16);
      this_00 = (CFunctions *)__fixsfsi();
      pCVar10 = (CFunctions *)T2E._0_4_;
      if ((int)T2E._0_4_ <= (int)this_00) {
        pCVar10 = this_00;
      }
      iVar7 = Energe2Temp(this_00,(int)pCVar10);
      uVar15 = iVar7 - iVar8 >> (uVar4 & 0xff);
    }
    uVar4 = 0;
    if (*(int *)(this + uVar1 * 0x21c + 0x316c) != 1) {
      uVar4 = 0;
      do {
        if ((int)uVar15 <= *(int *)(this + uVar4 * 4 + uVar1 * 0x21c + 0x3170)) break;
        uVar4 = uVar4 + 1;
      } while (uVar4 < *(int *)(this + uVar1 * 0x21c + 0x316c) - 1U);
    }
    iVar7 = uVar1 * 0x21c + 0x3204;
    uVar17 = __muldi3(*(int *)(this + uVar4 * 8 + iVar7),*(int *)(this + uVar4 * 8 + iVar7) >> 0x1f,
                      uVar15,(int)uVar15 >> 0x1f);
    iVar8 = (int)((ulonglong)uVar17 >> 0x20);
    uVar12 = *(uint *)(this + uVar1 * 0x21c + 0x3160);
    uVar15 = iVar8 >> (uVar12 - 0x20 & 0xff);
    if ((int)(uVar12 - 0x20) < 0) {
      uVar15 = (uint)uVar17 >> (uVar12 & 0xff) | iVar8 << (0x20 - uVar12 & 0xff);
    }
    iVar7 = *(int *)(this + (uVar4 * 8 | 4) + iVar7) + uVar15;
    iVar8 = 0;
    if (iVar2 == 0 || iVar3 == 0) {
      iVar3 = *(int *)(this + 0x3c);
      iVar2 = 0;
      if (-0xe350 < iVar3) {
        iVar2 = 0x111;
        if (iVar3 < 0x217cb0) {
          iVar2 = (int)(iVar3 + 50000 + ((uint)(iVar3 + 50000 >> 0x1f) >> 0x13)) >> 0xd;
        }
      }
      iVar2 = (*(int *)(T2E + iVar2 * 4 + 4) - *(int *)(T2E + iVar2 * 4)) *
              (((*(int *)(this + uVar1 * 0x21c + 0x3168) - *(int *)(this + uVar1 * 0x21c + 0x3164))
               + *(int *)(this + 0x38)) - iVar3);
      iVar8 = (int)(iVar2 + ((uint)(iVar2 >> 0x1f) >> 0x13)) >> 0xd;
    }
    iVar2 = __aeabi_fcmpeq(*(undefined4 *)(this + uVar1 * 0x21c + 0x3344));
    if (iVar2 == 0) {
      uVar15 = *(uint *)(this + 0x37ec);
      iVar2 = __udivsi3(param_2,uVar15);
      iVar3 = iVar2 - (*(uint *)(this + 0x37f0) >> 1);
      iVar2 = (param_2 - uVar15 * iVar2) - (uVar15 >> 1);
      __x = (float)__floatsisf(iVar2 * iVar2 + iVar3 * iVar3);
      sqrtf(__x);
      uVar16 = __mulsf3();
      iVar3 = iVar7 + 50000;
      iVar2 = 0;
      if (-0xe350 < iVar7) {
        iVar2 = 0x111;
        if (iVar7 < 0x217cb0) {
          iVar2 = (int)(iVar3 + ((uint)(iVar3 >> 0x1f) >> 0x13)) >> 0xd;
        }
      }
      iVar9 = (*(int *)(T2E + iVar2 * 4 + 4) - *(int *)(T2E + iVar2 * 4)) *
              (iVar3 + iVar2 * -0x2000);
      iVar11 = *(int *)(this + 0x40);
      iVar13 = iVar11 + 50000;
      iVar3 = 0;
      if (-0xe350 < iVar11) {
        iVar3 = 0x111;
        if (iVar11 < 0x217cb0) {
          iVar3 = (int)(iVar13 + ((uint)(iVar13 >> 0x1f) >> 0x13)) >> 0xd;
        }
      }
      iVar13 = (*(int *)(T2E + iVar3 * 4 + 4) - *(int *)(T2E + iVar3 * 4)) *
               (iVar13 + iVar3 * -0x2000);
      uVar5 = __floatsisf(((((int)(iVar9 + ((uint)(iVar9 >> 0x1f) >> 0x13)) >> 0xd) +
                           *(int *)(T2E + iVar2 * 4)) - *(int *)(T2E + iVar3 * 4)) -
                          ((int)(iVar13 + ((uint)(iVar13 >> 0x1f) >> 0x13)) >> 0xd));
      __mulsf3(uVar16,uVar5);
      iVar2 = __fixsfsi();
      iVar8 = iVar8 + iVar2;
    }
    iVar2 = 0;
    if ((-0xe350 < iVar7) && (iVar2 = local_28, iVar7 < 0x217cb0)) {
      iVar2 = (int)(iVar7 + 50000 + ((uint)(iVar7 + 50000 >> 0x1f) >> 0x13)) >> 0xd;
    }
    iVar7 = (*(int *)(E2TAccQ10 + iVar2 * 4) * -iVar8 >> 10) + iVar7;
  }
  return iVar7;
}



### FUNC CorrectTemperature @ 000298f0

/* CFunctions::CorrectTemperature(int, float, unsigned int) const */

uint CFunctions::CorrectTemperature(int param_1,float param_2,uint param_3)

{
  int iVar1;
  int iVar2;
  undefined4 uVar3;
  undefined4 uVar4;
  CFunctions *this;
  uint uVar5;
  undefined4 *puVar6;
  int iVar7;
  undefined4 in_r2;
  int iVar8;
  undefined4 uVar9;
  int local_20;
  
  uVar9 = *(undefined4 *)(param_1 + 0x9c);
  iVar1 = __aeabi_fcmple(uVar9,0);
  if ((iVar1 == 0) && (iVar1 = __aeabi_fcmpgt(), iVar1 == 0)) {
    local_20 = 0;
    iVar1 = __aeabi_fcmple();
    if ((iVar1 == 0) && (iVar1 = __aeabi_fcmpgt(uVar9,0x3f800000), iVar1 == 0)) {
      iVar2 = param_3 + 50000;
      iVar1 = 0;
      if (-0xe350 < (int)param_3) {
        iVar1 = 0x111;
        if ((int)param_3 < 0x217cb0) {
          iVar1 = (int)(iVar2 + ((uint)(iVar2 >> 0x1f) >> 0x13)) >> 0xd;
        }
      }
      iVar8 = *(int *)(T2E + iVar1 * 4);
      iVar1 = (*(int *)(T2E + iVar1 * 4 + 4) - iVar8) * (iVar2 + iVar1 * -0x2000);
      __mulsf3(*(undefined4 *)(param_1 + 0x80),0x447a0000);
      iVar2 = __fixsfsi();
      iVar7 = iVar2 + 50000;
      if (-0xe350 < iVar2) {
        local_20 = 0x111;
        if (iVar2 < 0x217cb0) {
          local_20 = (int)(iVar7 + ((uint)(iVar7 >> 0x1f) >> 0x13)) >> 0xd;
        }
      }
      iVar2 = (*(int *)(T2E + local_20 * 4 + 4) - *(int *)(T2E + local_20 * 4)) *
              (iVar7 + local_20 * -0x2000);
      uVar3 = __floatsisf(((int)(iVar2 + ((uint)(iVar2 >> 0x1f) >> 0x13)) >> 0xd) +
                          *(int *)(T2E + local_20 * 4));
      uVar9 = __mulsf3(uVar9,*(undefined4 *)(param_1 + 0xa0));
      uVar9 = __mulsf3(uVar9,in_r2);
      uVar4 = __subsf3(0x3f800000,uVar9);
      uVar3 = __mulsf3(uVar4,uVar3);
      uVar4 = __floatsisf(((int)(iVar1 + ((uint)(iVar1 >> 0x1f) >> 0x13)) >> 0xd) + iVar8);
      uVar3 = __subsf3(uVar4,uVar3);
      __divsf3(uVar3,uVar9);
      this = (CFunctions *)__fixsfsi();
      uVar5 = Energe2Temp(this,(int)this);
      if (-0x42afe < (int)uVar5) {
        return uVar5;
      }
      return 0xfffbd502;
    }
  }
  puVar6 = (undefined4 *)__errno();
  *puVar6 = 0xe4ae0001;
  return param_3;
}



### FUNC length @ 00029a64

/* length(__sFILE*) */

long length(__sFILE *param_1)

{
  long __off;
  long lVar1;
  
  __off = ftell((FILE *)param_1);
  fseek((FILE *)param_1,0,2);
  lVar1 = ftell((FILE *)param_1);
  fseek((FILE *)param_1,__off,0);
  return lVar1;
}



### FUNC LoadCalibrationTable @ 00029a98

/* CFunctions::LoadCalibrationTable(char const*) */

void __thiscall CFunctions::LoadCalibrationTable(CFunctions *this,char *param_1)

{
  pthread_mutex_t *__mutex;
  int iVar1;
  MStream *pMVar2;
  Logging *pLVar3;
  FILE *__stream;
  CFunctions *pCVar4;
  CFunctions *pCVar5;
  CFunctions *__ptr;
  CFunctions *__ptr_00;
  int iVar6;
  int iVar7;
  void *pvVar8;
  void *pvVar9;
  int iVar10;
  long lVar11;
  CFunctions *pCVar12;
  CFunctions *pCVar13;
  int iVar14;
  uint uVar15;
  size_t __n;
  uint uVar16;
  uint uVar17;
  undefined4 uVar18;
  CFunctions *pCVar19;
  int iVar20;
  CFunctions *pCVar21;
  undefined4 local_98;
  int local_94;
  CFunctions *local_88;
  int local_84;
  Logging aLStack_80 [12];
  Logging aLStack_74 [12];
  Logging aLStack_68 [12];
  Logging aLStack_5c [12];
  int local_50;
  Logging aLStack_4c [12];
  Logging aLStack_40 [12];
  Logging aLStack_34 [12];
  undefined4 local_28;
  uint local_24;
  int local_20;
  int local_1c;
  int local_18;
  
  local_18 = __stack_chk_guard;
  __mutex = (pthread_mutex_t *)(this + 0xb0);
  pthread_mutex_lock(__mutex);
  pCVar12 = this + 0x2d1c;
  if (*(void **)(this + 0x2f74) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0x2f74));
    *(undefined4 *)(this + 0x2f74) = 0;
  }
  if (*(void **)(this + 0x2f78) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0x2f78));
    *(undefined4 *)(this + 0x2f78) = 0;
  }
  if (*(void **)(this + 0x2f7c) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0x2f7c));
    *(undefined4 *)(this + 0x2f7c) = 0;
  }
  __aeabi_memclr4(pCVar12,0xa68);
  pCVar13 = this + 0x3128;
  if ((*(int *)(this + 0xa4) != 0) && (*param_1 != '\0')) {
    iVar1 = access(param_1,0);
    if (iVar1 == 0) {
      __stream = fopen(param_1,"rb");
      if (__stream == (FILE *)0x0) {
        pthread_mutex_unlock(__mutex);
        pMVar2 = (MStream *)mag::Logging::Logging(aLStack_4c,4);
        MStream::operator<<(pMVar2,"x3");
        pLVar3 = aLStack_4c;
      }
      else {
        strncpy((char *)(this + 0x2d28),param_1,0x100);
        this[0x2e27] = (CFunctions)0x0;
        local_50 = 0;
        fread(&local_50,4,1,__stream);
        fread(&local_1c,4,1,__stream);
        fread(&local_20,4,1,__stream);
        pCVar4 = this + 0x2e2c;
        fread(pCVar4,4,1,__stream);
        pCVar5 = this + 0x2e28;
        fread(pCVar5,4,1,__stream);
        fread(&local_24,4,1,__stream);
        fread(&local_28,4,1,__stream);
        __ptr = this + 0x2e30;
        fread(__ptr,4,1,__stream);
        fread(this + 0x2e34,4,1,__stream);
        if ((((local_50 == 0x5aa50003) && (*(size_t *)pCVar4 - 2 < 0x12)) && (*(int *)pCVar5 != 0))
           && ((local_24 != 0 && ((local_24 - 1 & local_24) == 0)))) {
          if ((local_1c == *(int *)(this + 0x37ec)) && (local_20 == *(int *)(this + 0x37f0))) {
            __ptr_00 = this + 0x2e38;
            fread(__ptr_00,4,*(size_t *)pCVar4,__stream);
            fread(this + 0x2e88,4,*(size_t *)pCVar4,__stream);
            fread(this + 0x2ed8,4,*(size_t *)pCVar4,__stream);
            fread(this + 0x2f28,4,*(int *)pCVar4 - 1,__stream);
            std::ostream::_M_put_nowiden((ostream *)std::cout,"LoadCalibrationTable");
            std::ostream::_M_put_nowiden((ostream *)std::cout,":");
            std::ostream::_M_put_nowiden((ostream *)std::cout,"read stage 2\n");
            pCVar19 = this + 0x50f0;
            iVar1 = *(int *)pCVar4;
            uVar15 = 0;
            pCVar21 = __ptr_00;
LAB_00029d24:
            if (uVar15 < iVar1 - 1U) {
              if (*(uint *)(pCVar21 + 0xf0) < *(uint *)pCVar19) goto code_r0x00029d32;
              goto LAB_00029d3c;
            }
            iVar7 = *(int *)(this + 0x2e34) + *(int *)__ptr +
                    (*(int *)pCVar5 * 3 + -1) * *(int *)pCVar19 * 2;
            uVar15 = 0;
            iVar6 = 1;
            if (iVar1 != 1) {
              uVar16 = 0;
              uVar15 = 0;
              do {
                uVar15 = *(int *)(this + uVar16 * 4 + 0x2f28) * 0x28 + uVar15;
                uVar16 = uVar16 + 1;
                iVar6 = iVar1;
              } while (uVar16 < iVar1 - 1U);
            }
            iVar6 = uVar15 + iVar6 * (iVar7 + 0x10) + 0x20;
            iVar1 = length((__sFILE *)__stream);
            if (iVar1 < iVar6) {
              std::ostream::_M_put_nowiden
                        ((ostream *)std::cout,"The calibration table length is not correct.\n");
              fclose(__stream);
              pthread_mutex_unlock(__mutex);
              pMVar2 = (MStream *)mag::Logging::Logging(aLStack_80,4);
              MStream::operator<<(pMVar2,"x7");
              pLVar3 = aLStack_80;
              goto LAB_00029b50;
            }
            iVar1 = length((__sFILE *)__stream);
            pvVar8 = operator_new__(iVar7 * *(int *)pCVar4 + 3U & 0xfffffffc);
            *(void **)(this + 0x2f74) = pvVar8;
            pvVar8 = operator_new__(iVar7 + 3U & 0xfffffffc);
            *(void **)(this + 0x2f78) = pvVar8;
            if (uVar15 != 0) {
              pvVar9 = operator_new__((uVar15 | 4) - 1 & 0xfffffff8);
              *(void **)(this + 0x2f7c) = pvVar9;
            }
            *(void **)(this + 0x3114) = pvVar8;
            *(uint *)(this + 0x3120) =
                 (int)pvVar8 +
                 (*(uint *)__ptr & 0xfffffffe) + *(int *)pCVar19 * (*(int *)pCVar5 + -1) * 2;
            iVar10 = ftell(__stream);
            *(int *)(this + 0x2fd0) = iVar10;
            *(undefined4 *)(this + 0x3020) = 0;
            uVar16 = *(uint *)pCVar4;
            if (1 < uVar16) {
              pCVar5 = this + 0x2fd4;
              uVar17 = 1;
              iVar20 = iVar7;
              do {
                *(int *)(pCVar5 + 0x50) = iVar20;
                *(int *)pCVar5 = iVar10 + iVar20;
                iVar20 = iVar20 + iVar7;
                pCVar5 = pCVar5 + 4;
                uVar17 = uVar17 + 1;
                uVar16 = *(uint *)pCVar4;
              } while (uVar17 < uVar16);
              iVar10 = *(int *)(this + 0x2fd0);
            }
            *(undefined4 *)(this + 0x30bc) = 0;
            iVar10 = iVar10 + uVar16 * iVar7;
            *(int *)(this + 0x3070) = iVar10;
            if (1 < uVar16 - 1) {
              local_88 = this + 0x2f28;
              pCVar5 = this + 0x30c0;
              iVar20 = 0;
              uVar17 = 1;
              do {
                iVar14 = *(int *)local_88;
                local_88 = local_88 + 4;
                iVar10 = iVar14 * 0x28 + iVar10;
                *(int *)(pCVar5 + -0x4c) = iVar10;
                iVar20 = iVar14 * 0x28 + iVar20;
                *(int *)pCVar5 = iVar20;
                pCVar5 = pCVar5 + 4;
                uVar17 = uVar17 + 1;
                uVar16 = *(uint *)pCVar4;
              } while (uVar17 < uVar16 - 1);
            }
            if (iVar6 < iVar1) {
              fseek(__stream,uVar16 * iVar7 + uVar15,1);
              iVar1 = length((__sFILE *)__stream);
              lVar11 = ftell(__stream);
              *(undefined4 *)(this + 0x312c) = 0;
              pCVar4 = this + 0x312c;
              local_88 = (CFunctions *)(iVar1 - lVar11);
              if (0x43 < (int)local_88) {
                while( true ) {
                  local_84 = 0;
                  fread(&local_84,4,1,__stream);
                  if (local_84 != 0x6bb60001) break;
                  iVar1 = *(int *)pCVar4;
                  fread(this + iVar1 * 0x21c + 0x3130,1,0x20,__stream);
                  this[iVar1 * 0x21c + 0x314e] = (CFunctions)0x0;
                  this[iVar1 * 0x21c + 0x314f] = (CFunctions)0x0;
                  fread(this + iVar1 * 0x21c + 0x3150,4,1,__stream);
                  fread(this + iVar1 * 0x21c + 0x3154,4,1,__stream);
                  fread(this + iVar1 * 0x21c + 0x3158,4,1,__stream);
                  fread(this + iVar1 * 0x21c + 0x315c,4,1,__stream);
                  fread(this + iVar1 * 0x21c + 0x3160,4,1,__stream);
                  fread(this + iVar1 * 0x21c + 0x3168,4,1,__stream);
                  fread(this + iVar1 * 0x21c + 0x3164,4,1,__stream);
                  pCVar5 = this + iVar1 * 0x21c + 0x316c;
                  fread(pCVar5,4,1,__stream);
                  if (0xf < *(uint *)(this + iVar1 * 0x21c + 0x3160)) break;
                  __n = *(uint *)pCVar5 - 1;
                  if (0x18 < __n) break;
                  if ((int)local_88 < 0x21c) {
                    iVar6 = 1;
                    if (1 < *(uint *)pCVar5) {
                      fread(this + iVar1 * 0x21c + 0x3170,4,__n,__stream);
                      iVar6 = *(int *)pCVar5;
                    }
                    fread(this + iVar1 * 0x21c + 0x3204,4,iVar6 << 1,__stream);
                    uVar18 = 0x3f800000;
                    *(undefined4 *)(this + iVar1 * 0x21c + 0x3334) = 0x3f800000;
                    local_88 = (CFunctions *)((int)local_88 + *(int *)pCVar5 * -0xc + -0x40);
                  }
                  else {
                    fread(this + iVar1 * 0x21c + 0x3170,4,0x19,__stream);
                    fread(this + iVar1 * 0x21c + 0x31d4,4,2,__stream);
                    fread(this + iVar1 * 0x21c + 0x31dc,4,10,__stream);
                    fread(this + iVar1 * 0x21c + 0x3204,4,0x32,__stream);
                    fread(this + iVar1 * 0x21c + 0x32cc,4,0x1a,__stream);
                    fread(this + iVar1 * 0x21c + 0x3334,4,1,__stream);
                    fread(this + iVar1 * 0x21c + 0x3338,4,2,__stream);
                    fread(this + iVar1 * 0x21c + 0x3340,4,1,__stream);
                    fread(this + iVar1 * 0x21c + 0x3344,4,1,__stream);
                    fread(this + iVar1 * 0x21c + 0x3348,4,1,__stream);
                    local_88 = (CFunctions *)((int)local_88 + -0x220);
                    uVar18 = *(undefined4 *)(this + iVar1 * 0x21c + 0x3334);
                  }
                  iVar6 = __aeabi_fcmple(uVar18);
                  if ((iVar6 != 0) || (iVar6 = __aeabi_fcmpgt(uVar18,0x3f800000), iVar6 != 0)) {
                    *(undefined4 *)(this + iVar1 * 0x21c + 0x3334) = 0x3f800000;
                  }
                  uVar18 = *(undefined4 *)(this + iVar1 * 0x21c + 0x3344);
                  iVar6 = __aeabi_fcmplt(uVar18,0xbba3d70a);
                  if ((iVar6 != 0) || (iVar6 = __aeabi_fcmpgt(uVar18,0x3ba3d70a), iVar6 != 0)) {
                    *(undefined4 *)(this + iVar1 * 0x21c + 0x3344) = 0;
                  }
                  *(int *)pCVar4 = *(int *)pCVar4 + 1;
                  *(undefined4 *)pCVar13 = 1;
                  std::ostream::_M_put_nowiden((ostream *)std::cout,"Found Lens: ");
                  std::ostream::_M_put_nowiden
                            ((ostream *)std::cout,(char *)(this + iVar1 * 0x21c + 0x3130));
                  std::ostream::put((ostream *)std::cout,'\n');
                  std::ostream::flush((ostream *)std::cout);
                  if (((int)local_88 < 0x44) || (2 < *(uint *)pCVar4)) break;
                }
              }
            }
            else if (uVar16 == 2) {
              local_88 = *(CFunctions **)(this + 0x2e3c);
              local_94 = *(int *)__ptr_00;
              if ((int)local_88 - local_94 == 50000) goto LAB_0002a320;
            }
            else if (uVar16 == 1) {
              local_88 = *(CFunctions **)(this + 0x2e3c);
              local_94 = *(int *)__ptr_00;
LAB_0002a320:
              *(undefined4 *)(this + 0x2d20) = 1;
              __aeabi_memclr4(pCVar13,0x65c);
              *(undefined4 *)pCVar13 = 1;
              *(undefined4 *)(this + 0x312c) = 1;
              __aeabi_memcpy(this + 0x3130,"Default Lens",0xd);
              *(undefined4 *)(this + 0x3150) = 0x3e99999a;
              *(undefined4 *)(this + 0x3154) = 0x3f800000;
              *(undefined4 *)(this + 0x3158) = 0x40000000;
              *(undefined4 *)(this + 0x315c) = 0x3fc00000;
              iVar1 = (local_94 + (int)local_88) / 2;
              *(int *)(this + 0x3164) = iVar1;
              *(int *)(this + 0x3168) = iVar1 + -500;
              *(undefined4 *)(this + 0x316c) = 1;
              *(undefined4 *)(this + 0x3334) = 0x3f800000;
              *(undefined4 *)(this + 0x3204) = *(undefined4 *)(this + 0x50fc);
              *(undefined4 *)(this + 0x3208) = *(undefined4 *)(this + 0x5100);
              *(char **)(this + 0x333c) = "NKSt6localeeqERKS_";
              *(undefined4 *)(this + 0x3338) = 0;
            }
            *(uint *)(this + 0x50fc) = local_24;
            *(undefined4 *)(this + 0x5100) = local_28;
            uVar15 = 0;
            do {
              if (1 << (uVar15 & 0xff) == local_24) {
                *(uint *)(this + 0x5104) = uVar15;
                break;
              }
              uVar15 = uVar15 + 1;
            } while (uVar15 < 0x20);
            *(undefined4 *)pCVar12 = 1;
            fclose(__stream);
            pthread_mutex_unlock(__mutex);
            local_98 = *(undefined4 *)pCVar12;
            goto LAB_00029c82;
          }
          std::ostream::_M_put_nowiden
                    ((ostream *)std::cout,"The calibration table size mismatch FPA.\n");
          fclose(__stream);
          pthread_mutex_unlock(__mutex);
          pMVar2 = (MStream *)mag::Logging::Logging(aLStack_68,4);
          MStream::operator<<(pMVar2,"x5");
          pLVar3 = aLStack_68;
        }
        else {
          std::ostream::_M_put_nowiden
                    ((ostream *)std::cout,"The calibration table data is not correct.\n");
          fclose(__stream);
          pthread_mutex_unlock(__mutex);
          pMVar2 = (MStream *)mag::Logging::Logging(aLStack_5c,4);
          MStream::operator<<(pMVar2,"x4");
          pLVar3 = aLStack_5c;
        }
      }
    }
    else {
      pthread_mutex_unlock(__mutex);
      pMVar2 = (MStream *)mag::Logging::Logging(aLStack_40,4);
      MStream::operator<<(pMVar2,"x2");
      pLVar3 = aLStack_40;
    }
    local_98 = 0;
    mag::Logging::~Logging(pLVar3);
    goto LAB_00029c82;
  }
  pthread_mutex_unlock(__mutex);
  pMVar2 = (MStream *)mag::Logging::Logging(aLStack_34,4);
  MStream::operator<<(pMVar2,"x1");
  pLVar3 = aLStack_34;
LAB_00029b50:
  mag::Logging::~Logging(pLVar3);
  local_98 = 0;
LAB_00029c82:
  if (__stack_chk_guard == local_18) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail(local_98);
code_r0x00029d32:
  uVar15 = uVar15 + 1;
  iVar6 = *(int *)pCVar21;
  pCVar21 = pCVar21 + 4;
  if (*(int *)pCVar21 <= iVar6) goto LAB_00029d3c;
  goto LAB_00029d24;
LAB_00029d3c:
  std::ostream::_M_put_nowiden((ostream *)std::cout,"The calibration table data is not correct.\n");
  fclose(__stream);
  pthread_mutex_unlock(__mutex);
  pMVar2 = (MStream *)mag::Logging::Logging(aLStack_74,4);
  MStream::operator<<(pMVar2,"x6");
  pLVar3 = aLStack_74;
  goto LAB_00029b50;
}



### FUNC ConvertmC2InnerTemp @ 0002a4e8

/* CFunctions::ConvertmC2InnerTemp(int) const */

uint __thiscall CFunctions::ConvertmC2InnerTemp(CFunctions *this,int param_1)

{
  uint uVar1;
  
  uVar1 = param_1 - *(int *)(this + 0x5100) >> (*(uint *)(this + 0x5104) & 0xff);
  if ((int)uVar1 < 1) {
    uVar1 = 0;
  }
  if (0xfffe < (int)uVar1) {
    uVar1 = 0xffff;
  }
  return uVar1 & 0xffff;
}



### FUNC FindMaxTemperature @ 0002a514

/* CFunctions::FindMaxTemperature() */

void __thiscall CFunctions::FindMaxTemperature(CFunctions *this)

{
  ushort uVar1;
  ushort uVar2;
  int iVar3;
  ushort *puVar4;
  
  iVar3 = *(int *)(this + 0x50f0);
  puVar4 = *(ushort **)(this + 0xb4);
  uVar2 = *puVar4;
  if ((iVar3 != 0) && (iVar3 != 1)) {
    iVar3 = 1 - iVar3;
    do {
      puVar4 = puVar4 + 1;
      uVar1 = *puVar4;
      if (*puVar4 <= uVar2) {
        uVar1 = uVar2;
      }
      uVar2 = uVar1;
      iVar3 = iVar3 + 1;
    } while (iVar3 != 0);
  }
  *(uint *)(this + 0x3838) = (uint)uVar2;
  return;
}



### FUNC CalContrastOffsetedAutoEnlargeRange @ 0002a560

/* CFunctions::CalContrastOffsetedAutoEnlargeRange() */

int __thiscall CFunctions::CalContrastOffsetedAutoEnlargeRange(CFunctions *this)

{
  int iVar1;
  undefined4 uVar2;
  int iVar3;
  int iVar4;
  uint uVar5;
  undefined4 uVar6;
  
  iVar3 = *(int *)(this + 0x30);
  iVar1 = iVar3;
  if (99 < iVar3) {
    iVar1 = 100;
  }
  iVar4 = iVar3;
  if (iVar3 < -99) {
    iVar4 = -100;
  }
  if (iVar3 < 0) {
    iVar1 = iVar4;
  }
  uVar5 = (uint)(*(int *)(this + 0x20) * 1000) >> (*(uint *)(this + 0x5104) & 0xff);
  if (0xfffe < uVar5) {
    uVar5 = 0xffff;
  }
  iVar1 = __divsi3(uVar5 * iVar1,(iVar3 >> 0x1f & 0xffffff9cU) + 0x96);
  iVar1 = uVar5 - iVar1;
  if (*(int *)(this + 0x2d1c) != 0) {
    uVar6 = *(undefined4 *)(this + 0x6c);
    iVar3 = __aeabi_fcmpgt(uVar6,0);
    if (iVar3 != 0) {
      if (*(int *)(this + 0x2e2c) == 2) {
        iVar3 = *(int *)(this + 0x2e38);
        iVar4 = *(int *)(this + 0x2e3c);
        if (iVar4 - iVar3 != 50000) goto LAB_0002a610;
      }
      else {
        if (*(int *)(this + 0x2e2c) != 1) goto LAB_0002a610;
        iVar3 = *(int *)(this + 0x2e38);
        iVar4 = *(int *)(this + 0x2e3c);
      }
      uVar2 = __floatsisf(iVar1 * (*(int *)(this + 0x38) - (iVar3 + iVar4) / 2));
      uVar6 = __mulsf3(uVar6,uVar2);
      __divsf3(uVar6,0x447a0000);
      iVar3 = __fixsfsi();
      iVar1 = iVar1 + iVar3;
    }
  }
LAB_0002a610:
  if (iVar1 < 0x81) {
    iVar1 = 0x80;
  }
  return iVar1;
}



### FUNC SubSectionEnlarge @ 0002a640

/* CFunctions::SubSectionEnlarge() */

void __thiscall CFunctions::SubSectionEnlarge(CFunctions *this)

{
  int iVar1;
  int iVar2;
  int iVar3;
  uint uVar4;
  uint uVar5;
  uint uVar6;
  int iVar7;
  CFunctions CVar8;
  int iVar9;
  uint uVar10;
  bool bVar11;
  int local_30;
  int local_28;
  int local_1c;
  
  if ((*(uint *)(this + 0x18) < *(uint *)(this + 0x1c)) &&
     (*(int *)(this + 0x10) < *(int *)(this + 0x14))) {
    iVar2 = SearchInnerTemp(this,*(int *)(this + 0x10));
    iVar3 = SearchInnerTemp(this,*(int *)(this + 0x14));
    iVar7 = iVar3;
    if (iVar3 <= *(int *)(this + 0x3838)) {
      iVar7 = *(int *)(this + 0x3838);
    }
    *(int *)(this + 0x3854) = iVar7;
    iVar9 = iVar2;
    if (*(int *)(this + 0x383c) <= iVar2) {
      iVar9 = *(int *)(this + 0x383c);
    }
    *(int *)(this + 0x3858) = iVar9;
    uVar10 = iVar7 - iVar9;
    uVar4 = (iVar2 - iVar9) * 0x3ff;
    uVar5 = __udivsi3(uVar4,uVar10);
    uVar6 = __udivsi3((iVar3 - iVar9) * 0x3ff,uVar10);
    iVar7 = *(int *)(this + 0x18);
    iVar2 = *(int *)(this + 0x1c);
    iVar3 = iVar2 * 4;
    iVar9 = 0;
    local_1c = 0;
    if (uVar10 <= uVar4) {
      local_1c = __udivsi3(iVar7 << 0x18,uVar5);
    }
    local_28 = 0;
    if (uVar5 < uVar6) {
      local_28 = __udivsi3((iVar3 + iVar7 * -4) * 0x400000,uVar6 - uVar5);
    }
    local_30 = 0;
    if (uVar6 < 0x3ff) {
      local_30 = __udivsi3((iVar2 * -4 + 0x3ff) * 0x400000,0x3ff - uVar6);
    }
    uVar4 = 0;
    do {
      if (uVar5 < uVar4) {
        uVar10 = uVar5;
        iVar2 = local_28;
        iVar1 = iVar7 * 4;
        if (uVar6 <= uVar4) {
          uVar10 = uVar6;
          iVar2 = local_30;
          iVar1 = iVar3;
        }
        CVar8 = SUB41(((uVar4 - uVar10) * iVar2 >> 0x16) + iVar1 >> 2,0);
      }
      else {
        CVar8 = SUB41((uint)iVar9 >> 0x18,0);
      }
      this[uVar4 + 0x4074] = CVar8;
      iVar9 = iVar9 + local_1c;
      bVar11 = uVar4 != 0x3ff;
      uVar4 = uVar4 + 1;
    } while (bVar11);
  }
  return;
}



### FUNC SearchSeparateLine @ 0002a768

/* WARNING: Restarted to delay deadcode elimination for space: stack */
/* CFunctions::SearchSeparateLine() */

void __thiscall CFunctions::SearchSeparateLine(CFunctions *this)

{
  int iVar1;
  int iVar2;
  undefined4 uVar3;
  undefined4 uVar4;
  undefined4 uVar5;
  undefined4 uVar6;
  int iVar7;
  undefined4 uVar8;
  int iVar9;
  ushort *puVar10;
  uint uVar11;
  int *piVar12;
  uint uVar13;
  uint uVar14;
  uint uVar15;
  ushort *puVar16;
  uint uVar17;
  bool bVar18;
  int local_2030;
  uint local_202c;
  int *local_2028;
  int aiStack_2018 [1024];
  int local_1018 [1025];
  
  iVar1 = __stack_chk_guard;
  uVar15 = *(uint *)(this + 0x37f0);
  uVar17 = 0;
  uVar13 = 0;
  uVar14 = uVar13;
  if (uVar15 != 0) {
    puVar16 = *(ushort **)(this + 0xb4);
    uVar13 = *(uint *)(this + 0x37ec);
    uVar14 = 0;
    local_2030 = 0;
    do {
      iVar2 = local_2030;
      if (uVar13 >> 2 != 0) {
        iVar2 = 0;
        iVar9 = -(uVar13 >> 2);
        puVar10 = puVar16;
        do {
          iVar2 = iVar2 + (uint)*puVar10 + (uint)puVar10[1] + (uint)puVar10[2] + (uint)puVar10[3];
          puVar10 = puVar10 + 4;
          iVar9 = iVar9 + 1;
        } while (iVar9 != 0);
        puVar16 = puVar16 + (uVar13 & 0xfffffffc);
      }
      iVar2 = __udivsi3(iVar2,uVar13);
      local_1018[uVar14] = iVar2;
      uVar14 = uVar14 + 1;
    } while (uVar14 < uVar15);
    uVar17 = uVar15 * 7 >> 3;
    uVar13 = 0;
    for (uVar11 = uVar15 >> 2; uVar14 = uVar13, uVar11 != 0; uVar11 = uVar11 - 1) {
      uVar13 = uVar15 >> 2;
    }
  }
  for (; uVar13 < uVar15; uVar13 = uVar13 + 1) {
  }
  if (uVar17 < uVar14) {
LAB_0002aa1c:
    *(uint *)(this + 0x4478) = uVar15 - 1;
  }
  else {
    local_2028 = aiStack_2018 + uVar14;
    uVar13 = uVar15 - 1;
    local_202c = uVar13 - uVar14;
    uVar8 = __floatunsisf(uVar15);
    iVar2 = 0;
    do {
      uVar3 = __floatunsisf(uVar14 + iVar2 + 1);
      uVar4 = __divsf3(uVar3,uVar8);
      uVar5 = __floatunsisf();
      uVar3 = __divsf3(uVar5,uVar3);
      uVar5 = __floatunsisf();
      uVar6 = __floatunsisf(local_202c);
      uVar5 = __divsf3(uVar5,uVar6);
      uVar6 = __subsf3(0x3f800000,uVar4);
      uVar4 = __mulsf3(uVar4,uVar6);
      uVar3 = __subsf3(uVar3,uVar5);
      uVar4 = __mulsf3(uVar4,uVar3);
      iVar9 = __mulsf3(uVar3,uVar4);
      *local_2028 = iVar9;
      local_2028 = local_2028 + 1;
      iVar2 = iVar2 + 1;
      local_202c = local_202c + -1;
    } while (uVar14 + ~uVar17 + iVar2 != 0);
    if (uVar17 < uVar14) goto LAB_0002aa1c;
    local_202c = uVar14;
    if (uVar14 != uVar17) {
      iVar2 = aiStack_2018[uVar14];
      iVar9 = __unordsf2(iVar2,iVar2);
      bVar18 = iVar9 != 0;
      piVar12 = local_1018 + (uVar14 - 0x3ff);
      uVar11 = uVar14;
      local_2028 = (int *)iVar2;
      do {
        if (!bVar18) {
          local_2028 = (int *)iVar2;
        }
        iVar2 = *piVar12;
        piVar12 = piVar12 + 1;
        iVar9 = __aeabi_fcmple(local_2028,iVar2);
        iVar7 = __aeabi_fcmple(local_2028,iVar2);
        uVar11 = uVar11 + 1;
        if (iVar7 != 0) {
          local_202c = uVar11;
        }
        bVar18 = iVar9 == 0;
      } while (uVar17 != uVar11);
    }
    if ((local_202c == uVar14) || (local_202c == uVar17)) goto LAB_0002aa1c;
    uVar17 = 0;
    iVar2 = 0;
    do {
      iVar2 = local_1018[uVar17] + iVar2;
      uVar17 = uVar17 + 1;
    } while (uVar17 <= local_202c);
    uVar17 = local_202c + 1;
    iVar9 = 0;
    if (uVar17 < uVar15) {
      iVar9 = 0;
      do {
        iVar9 = local_1018[uVar17] + iVar9;
        uVar17 = uVar17 + 1;
      } while (uVar17 < uVar15);
    }
    iVar2 = __udivsi3(iVar2);
    iVar9 = __udivsi3(iVar9,uVar15 + (local_202c ^ 0xffffffff));
    uVar17 = iVar2 - iVar9 >> 0x1f;
    if ((iVar9 <= iVar2) && (iVar9 + iVar2 <= (int)(((iVar2 - iVar9) + uVar17 ^ uVar17) * 0x80))) {
      *(int *)(this + 0x4480) = local_1018[local_202c];
      uVar17 = *(uint *)(this + 0x4478);
      if ((uVar14 < uVar17) && (uVar17 <= uVar13)) {
        uVar15 = uVar15 >> 7;
        if (uVar15 < 2) {
          uVar15 = 1;
        }
        uVar13 = uVar15 + uVar17;
        if (local_202c <= uVar15 + uVar17) {
          uVar13 = local_202c;
        }
        local_202c = uVar17 - uVar15;
        if (uVar17 - uVar15 <= uVar13) {
          local_202c = uVar13;
        }
      }
      uVar13 = 0;
      iVar2 = 0;
      do {
        iVar2 = local_1018[uVar13] + iVar2;
        uVar13 = uVar13 + 1;
      } while (uVar13 <= local_202c);
      *(uint *)(this + 0x4478) = local_202c;
      uVar8 = __udivsi3(iVar2,local_202c + 1);
      goto LAB_0002aa34;
    }
    *(uint *)(this + 0x4478) = uVar13;
  }
  *(undefined4 *)(this + 0x4480) = 0;
  uVar8 = *(undefined4 *)(this + 0x3840);
LAB_0002aa34:
  *(undefined4 *)(this + 0x447c) = uVar8;
  if (__stack_chk_guard == iVar1) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC HistDeRedundance @ 0002aaa0

/* WARNING: Restarted to delay deadcode elimination for space: stack */
/* CFunctions::HistDeRedundance() */

void __thiscall CFunctions::HistDeRedundance(CFunctions *this)

{
  int iVar1;
  CFunctions *pCVar2;
  int iVar3;
  int iVar4;
  CFunctions *pCVar5;
  int iVar6;
  ushort *puVar7;
  uint *puVar8;
  uint uVar9;
  int iVar10;
  uint uVar11;
  int iVar12;
  int iVar13;
  uint uVar14;
  uint uVar15;
  uint uVar16;
  uint uVar17;
  bool bVar18;
  uint local_1034;
  uint local_1024;
  uint local_1018 [1025];
  
  iVar1 = __stack_chk_guard;
  uVar15 = *(uint *)(this + 0x50f0);
  pCVar2 = this + 0xcc;
  iVar6 = *(int *)(this + 0x5c);
  if ((iVar6 != 0) && (*(int *)(this + 0xc) == 0)) {
    uVar15 = *(int *)(this + 0x37ec) * (*(int *)(this + 0x4478) + 1);
  }
  iVar3 = *(int *)(this + 0x3854);
  iVar13 = *(int *)(this + 0x3858);
  __aeabi_memclr4(pCVar2,0x1000);
  iVar4 = __udivsi3(0xffc00000);
  local_1024 = uVar15 >> 0xc;
  if (local_1024 < 2) {
    local_1024 = 1;
  }
  if (uVar15 != 0) {
    puVar7 = *(ushort **)(this + 0xb4);
    do {
      uVar11 = iVar4 * ((uint)*puVar7 - iVar13) >> 0x14 & 0xffc;
      *(int *)(this + uVar11 + 0xcc) = *(int *)(this + uVar11 + 0xcc) + 1;
      uVar15 = uVar15 - 1;
      puVar7 = puVar7 + 1;
    } while (uVar15 != 0);
  }
  if (((iVar6 != 0) && (*(int *)(this + 0xc) == 0)) &&
     (*(uint *)(this + 0x4478) < *(int *)(this + 0x37f0) - 1U)) {
    iVar12 = *(int *)(this + 0x447c) * 0x1f;
    iVar10 = *(int *)(this + 0x4480);
    iVar4 = iVar12 + iVar10 * -0x20;
    if (iVar4 == 0 || iVar4 < 0 != SBORROW4(iVar12,iVar10 * 0x20)) {
      iVar3 = *(int *)(this + 0x447c) * 0x21;
      if (iVar3 + iVar10 * -0x20 < 0 == SBORROW4(iVar3,iVar10 * 0x20)) goto LAB_0002abbe;
      iVar3 = 0x1000;
    }
    else {
      uVar15 = (iVar10 - iVar13) * 0x3ff;
      uVar11 = __udivsi3(uVar15,iVar3 - iVar13);
      if (uVar15 < (uint)(iVar3 - iVar13)) goto LAB_0002abbe;
      if (uVar11 < 2) {
        uVar11 = 1;
      }
      iVar3 = uVar11 << 2;
    }
    __aeabi_memclr4(pCVar2,iVar3);
  }
LAB_0002abbe:
  pCVar5 = this + 0x447c;
  if (iVar6 == 0) {
    pCVar5 = this + 0x3840;
  }
  iVar6 = *(int *)(this + 0x3858);
  uVar14 = (*(int *)pCVar5 - iVar6) * 0x3ff;
  uVar16 = *(int *)(this + 0x3854) - iVar6;
  uVar11 = __udivsi3(uVar14,uVar16);
  uVar15 = uVar11;
  if (*(int *)(this + 0x60) != 0) {
    iVar6 = 0;
    iVar3 = 0;
    if (uVar16 <= uVar14) {
      uVar14 = 0;
      iVar3 = 0;
      iVar6 = 0;
      do {
        iVar3 = *(int *)(pCVar2 + uVar14 * 4) + iVar3;
        iVar6 = uVar14 * *(int *)(pCVar2 + uVar14 * 4) + iVar6;
        uVar14 = uVar14 + 1;
      } while (uVar14 < uVar11);
    }
    if ((int)(uVar11 + 1) < 0x400) {
      iVar10 = 0;
      iVar13 = 0;
      iVar4 = uVar11 + 1;
      do {
        iVar10 = *(int *)(this + iVar4 * 4 + 0xcc) + iVar10;
        iVar13 = iVar4 * *(int *)(this + iVar4 * 4 + 0xcc) + iVar13;
        bVar18 = iVar4 != 0x3ff;
        iVar4 = iVar4 + 1;
      } while (bVar18);
      if ((iVar3 != 0) && (iVar10 != 0)) {
        iVar6 = __udivsi3(iVar6);
        iVar3 = __udivsi3(iVar13,iVar10);
        uVar15 = (uint)(iVar3 + iVar6) >> 1;
        if (uVar15 <= uVar11) {
          uVar15 = uVar11;
        }
      }
    }
  }
  iVar6 = *(int *)(this + 0x2c);
  if (99 < iVar6) {
    iVar6 = 100;
  }
  if (iVar6 < -99) {
    iVar6 = -100;
  }
  iVar4 = 0;
  iVar3 = *(int *)pCVar2;
  do {
    iVar13 = iVar4 * -4;
    *(uint *)(this + iVar4 * -4 + 0xcc) = (uint)(*(int *)(this + iVar13 + 0xd0) + iVar3) >> 1;
    iVar4 = iVar4 + -1;
    iVar3 = *(int *)(this + iVar13 + 0xd0);
  } while (iVar4 != -0x3ff);
  *(undefined4 *)(this + 0x10c8) = *(undefined4 *)(this + 0x10c4);
  iVar6 = __divsi3(iVar6 * 0x1bf);
  local_1034 = 1;
  iVar3 = __udivsi3(0x10000,local_1024);
  if (-1 < (int)uVar15) {
    iVar4 = 0;
    uVar14 = 0;
    uVar11 = uVar15;
    do {
      uVar16 = *(int *)(this + uVar11 * 4 + 0xcc) + uVar14;
      uVar14 = uVar16;
      if (local_1024 <= uVar16) {
        uVar14 = 0;
      }
      iVar4 = iVar4 + (uVar16 < local_1024 ^ 1);
      *(uint *)(this + uVar11 * 4 + 0x10cc) = iVar4 * 0x100 + (uVar14 * iVar3 >> 8);
      bVar18 = 0 < (int)uVar11;
      uVar11 = uVar11 - 1;
    } while (bVar18);
  }
  iVar4 = 0x400;
  if ((int)(uVar15 + 1) < 0x400) {
    uVar14 = 0;
    iVar13 = 0;
    uVar11 = uVar15;
    do {
      uVar14 = *(int *)(this + uVar11 * 4 + 0xd0) + uVar14;
      if (uVar14 < local_1024 << 3) {
        iVar13 = iVar13 + (uVar14 < local_1024 ^ 1);
        if (local_1024 <= uVar14) {
          uVar14 = 0;
        }
      }
      else {
        iVar13 = iVar13 + 2;
        uVar14 = 0;
      }
      *(uint *)(this + uVar11 * 4 + 0x10d0) = (uVar14 * iVar3 >> 8) + iVar13 * 0x100;
      uVar11 = uVar11 + 1;
    } while ((int)uVar11 < 0x3ff);
  }
  uVar14 = CalContrastOffsetedAutoEnlargeRange(this);
  uVar16 = (*(int *)(this + 0x3854) - *(int *)(this + 0x3858)) * 0x10;
  uVar11 = __udivsi3(uVar16,uVar14);
  if (0x1ff < uVar11) {
    uVar11 = 0x200;
  }
  if (uVar14 <= uVar16) {
    local_1034 = uVar11;
  }
  puVar8 = local_1018;
  uVar11 = local_1034 * 0x1800;
  do {
    uVar14 = uVar11 >> 0xd;
    if (uVar14 == 0) {
      uVar14 = 1;
    }
    *puVar8 = uVar14;
    puVar8 = puVar8 + 1;
    iVar4 = iVar4 + -1;
    uVar11 = uVar11 + local_1034 * 4;
  } while (iVar4 != 0);
  if (*(int *)(this + 0x10cc) != 0) {
    iVar3 = __udivsi3((iVar6 + 0x1c0) * 0x40000);
    uVar16 = (iVar6 + 0x1c0) * 0x10;
    uVar11 = uVar15;
    uVar14 = uVar16;
    if (-1 < (int)uVar15) {
      do {
        uVar9 = uVar16 - ((uint)(iVar3 * *(int *)(this + uVar11 * 4 + 0x10cc)) >> 0xe);
        uVar17 = uVar14 - local_1018[uVar11];
        if (uVar14 - uVar9 <= local_1018[uVar11]) {
          uVar17 = uVar9;
        }
        this[uVar11 + 0x4074] = SUB41(uVar17 >> 6,0);
        bVar18 = 0 < (int)uVar11;
        uVar11 = uVar11 - 1;
        uVar14 = uVar17;
      } while (bVar18);
    }
  }
  if (*(int *)(this + 0x20c8) != 0) {
    iVar3 = __udivsi3((0x240 - iVar6) * 0x40000);
    uVar14 = iVar6 * 0x10 + 0x1bf0;
    uVar11 = uVar14;
    if ((int)(uVar15 + 1) < 0x400) {
      do {
        uVar17 = ((uint)(iVar3 * *(int *)(this + uVar15 * 4 + 0x10d0)) >> 0xe) + uVar14;
        uVar16 = local_1018[uVar15 + 1] + uVar11;
        if (uVar17 - uVar11 <= local_1018[uVar15 + 1]) {
          uVar16 = uVar17;
        }
        this[uVar15 + 0x4075] = SUB41(uVar16 >> 6,0);
        uVar15 = uVar15 + 1;
        uVar11 = uVar16;
      } while ((int)uVar15 < 0x3ff);
    }
  }
  if (__stack_chk_guard != iVar1) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return;
}



### FUNC IsothermalPalette @ 0002af54

/* CFunctions::IsothermalPalette() */

void __thiscall CFunctions::IsothermalPalette(CFunctions *this)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  CFunctions *pCVar5;
  uint uVar6;
  uint uVar7;
  
  uVar1 = *(uint *)(this + 0x3858);
  uVar6 = *(uint *)(this + 0x3854);
  uVar2 = SearchInnerTemp(this,*(int *)(this + 0x14));
  uVar3 = SearchInnerTemp(this,*(int *)(this + 0x10));
  uVar7 = 0x100;
  if ((uVar2 <= uVar6) && (uVar7 = 0xffffffff, uVar1 <= uVar2)) {
    iVar4 = __udivsi3((uVar2 - uVar1) * 0x3ff,uVar6 - uVar1);
    uVar7 = (uint)(byte)this[iVar4 + 0x4074];
  }
  uVar2 = 0x100;
  if ((uVar3 <= uVar6) && (uVar2 = 0xffffffff, uVar1 <= uVar3)) {
    iVar4 = __udivsi3((uVar3 - uVar1) * 0x3ff,uVar6 - uVar1);
    uVar2 = (uint)(byte)this[iVar4 + 0x4074];
  }
  __aeabi_memcpy(this + 0x24f4,this + 0x20cc);
  if (0xfe < (int)uVar7) {
    uVar7 = 0xff;
  }
  if ((int)uVar2 < 1) {
    uVar2 = 0;
  }
  if ((int)uVar2 <= (int)uVar7) {
    pCVar5 = this + uVar2 * 4 + 0x24f7;
    iVar4 = uVar2 - 1;
    do {
      pCVar5[-3] = (CFunctions)0x0;
      pCVar5[-2] = (CFunctions)0xff;
      pCVar5[-1] = (CFunctions)0x0;
      *pCVar5 = (CFunctions)0x0;
      pCVar5 = pCVar5 + 4;
      iVar4 = iVar4 + 1;
    } while (iVar4 < (int)uVar7);
  }
  __aeabi_memcpy(this + 0x291c,this + 0x24f4,0x400);
  return;
}



### FUNC DynamicRedPalette @ 0002b060

/* CFunctions::DynamicRedPalette() */

void __thiscall CFunctions::DynamicRedPalette(CFunctions *this)

{
  bool bVar1;
  CFunctions CVar2;
  char cVar3;
  undefined4 uVar4;
  uint uVar5;
  int iVar6;
  uint uVar7;
  uint uVar8;
  int iVar9;
  uint uVar10;
  CFunctions *pCVar11;
  int iVar12;
  uint local_38;
  
  uVar10 = *(uint *)(this + 0x50f0);
  uVar4 = __floatunsisf(uVar10);
  __mulsf3(uVar4,0x3cf5c28f);
  uVar5 = __fixsfsi();
  uVar8 = 0;
  iVar6 = 0x432;
  do {
    uVar8 = *(int *)(this + iVar6 * 4) + uVar8;
    iVar9 = iVar6;
    if (uVar10 >> 4 <= uVar8) break;
    iVar9 = iVar6 + -1;
    iVar12 = iVar6 + -0x33;
    iVar6 = iVar9;
  } while (1 < iVar12);
  iVar6 = __udivsi3((1000U >> (*(uint *)(this + 0x5104) & 0xff) & 0xffff) * 0x3ff,
                    *(int *)(this + 0x3854) - *(int *)(this + 0x3858));
  iVar6 = iVar6 + iVar9 + -0x33;
  uVar8 = 0;
  iVar9 = 0x432;
  do {
    uVar8 = *(int *)(this + iVar9 * 4) + uVar8;
    uVar10 = 0x100;
    if (uVar5 <= uVar8) {
      if (iVar6 <= iVar9 + -0x33) {
        iVar6 = iVar9 + -0x33;
      }
      break;
    }
    iVar12 = iVar9 + -0x33;
    iVar9 = iVar9 + -1;
  } while (1 < iVar12);
  if (iVar6 < 0x400) {
    uVar10 = (uint)(byte)this[iVar6 + 0x4074];
    uVar7 = 0x100 - uVar10;
    local_38 = uVar7 >> 1;
    uVar8 = local_38 + uVar10;
    uVar5 = 0;
    if (uVar10 == 0) goto LAB_0002b148;
  }
  else {
    uVar7 = 0;
    local_38 = 0;
    uVar8 = uVar10;
  }
  iVar6 = 0;
  do {
    iVar9 = iVar6 * 4;
    CVar2 = SUB41(iVar6,0);
    this[iVar9 + 0x24f4] = CVar2;
    this[iVar9 + 0x24f5] = CVar2;
    this[iVar9 + 0x24f6] = CVar2;
    this[iVar9 + 0x24f7] = (CFunctions)0x0;
    iVar6 = iVar6 + 1;
    uVar5 = uVar10;
  } while (iVar6 < (int)uVar10);
LAB_0002b148:
  pCVar11 = this + 0x24f4;
  CVar2 = SUB41(uVar5,0);
  if (1 < (int)uVar7) {
    iVar6 = 0;
    uVar10 = uVar5;
    do {
      cVar3 = __divsi3(iVar6,local_38);
      iVar9 = uVar10 * 4;
      pCVar11[iVar9] = (CFunctions)(cVar3 + (char)CVar2);
      pCVar11[iVar9 + 1] = CVar2;
      pCVar11[iVar9 + 2] = CVar2;
      pCVar11[iVar9 + 3] = (CFunctions)0x0;
      iVar6 = iVar6 + (0xff - uVar5);
      uVar10 = uVar10 + 1;
    } while ((int)uVar10 < (int)uVar8);
  }
  if ((int)uVar8 < 0x100) {
    iVar6 = 0;
    uVar10 = uVar8;
    do {
      iVar9 = uVar10 * 4;
      pCVar11[iVar9] = (CFunctions)0xff;
      cVar3 = __divsi3(iVar6,0x100 - uVar8);
      pCVar11[iVar9 + 1] = (CFunctions)(cVar3 + (char)CVar2);
      pCVar11[iVar9 + 2] = (CFunctions)(cVar3 + (char)CVar2);
      pCVar11[iVar9 + 3] = (CFunctions)0x0;
      iVar6 = iVar6 - uVar5;
      bVar1 = (int)uVar10 < 0xff;
      uVar10 = uVar10 + 1;
    } while (bVar1);
  }
  __aeabi_memcpy(this + 0x291c,pCVar11,0x400);
  return;
}



### FUNC MapTemperature @ 0002b204

/* CFunctions::MapTemperature(int) */

void CFunctions::MapTemperature(int param_1)

{
  int iVar1;
  int iVar2;
  int iVar3;
  int iVar4;
  uint uVar5;
  uint uVar6;
  int iVar7;
  undefined1 *puVar8;
  ushort *puVar9;
  int local_24;
  
  puVar9 = *(ushort **)(param_1 + 0xb4);
  puVar8 = *(undefined1 **)(param_1 + 0xc0);
  iVar1 = *(int *)(param_1 + 0x3858);
  iVar2 = *(int *)(param_1 + 0x3854);
  __aeabi_memclr4(param_1 + 0x3874,0x400);
  iVar3 = __udivsi3(0xffc00000,iVar2 - iVar1);
  for (iVar2 = *(int *)(param_1 + 0x50f0); iVar2 != 0; iVar2 = iVar2 + -1) {
    uVar6 = iVar3 * ((uint)*puVar9 - iVar1) >> 0x16;
    *puVar8 = *(undefined1 *)(param_1 + 0x3820 + uVar6 + 0x854);
    iVar4 = param_1 + 0x3820 + (uVar6 & 0x3fc);
    *(int *)(iVar4 + 0x54) = *(int *)(iVar4 + 0x54) + 1;
    puVar8 = puVar8 + 1;
    puVar9 = puVar9 + 1;
  }
  *(undefined4 *)(param_1 + 0x3864) = 1;
  iVar1 = *(int *)(param_1 + 200);
  iVar2 = *(int *)(param_1 + 0x37fc);
  if (*(int *)(param_1 + 100) == 0) {
    iVar4 = *(uint *)(param_1 + 0x3800) - 1;
    iVar3 = 0;
    if (1 < *(uint *)(param_1 + 0x3800)) {
      iVar3 = __udivsi3(0xff0000,iVar4);
    }
    if (-1 < iVar4) {
      uVar6 = iVar3 * iVar4;
      iVar1 = iVar1 + iVar2 * iVar4;
      do {
        __aeabi_memset(iVar1,iVar2,uVar6 >> 0x10 & 0xff);
        iVar1 = iVar1 - iVar2;
        uVar6 = uVar6 - iVar3;
        iVar4 = iVar4 + -1;
      } while (-1 < iVar4);
    }
  }
  else {
    iVar3 = *(int *)(param_1 + 0x3858);
    local_24 = 0;
    if ((*(int *)(param_1 + 0x383c) != iVar3) &&
       (iVar4 = *(int *)(param_1 + 0x3854), iVar4 != iVar3)) {
      local_24 = __divsi3((*(int *)(param_1 + 0x383c) - iVar3) * 0x3ff,iVar4 - iVar3);
    }
    iVar4 = 0x3ff;
    if (*(int *)(param_1 + 0x3838) != iVar3) {
      iVar7 = *(int *)(param_1 + 0x3854);
      iVar4 = 0x3ff;
      if (iVar7 != iVar3) {
        iVar4 = __divsi3((*(int *)(param_1 + 0x3838) - iVar3) * 0x3ff,iVar7 - iVar3);
      }
    }
    uVar6 = *(uint *)(param_1 + 0x3800);
    if (uVar6 < 2) {
      iVar3 = 0;
    }
    else {
      iVar3 = __udivsi3((iVar4 - local_24) * 0x10000,uVar6 - 1);
    }
    iVar4 = uVar6 - 1;
    if (-1 < iVar4) {
      uVar6 = iVar4 * iVar3;
      iVar1 = iVar1 + iVar4 * iVar2;
      do {
        uVar5 = (uVar6 >> 0x10) + local_24;
        if (0x3fe < uVar5) {
          uVar5 = 0x3ff;
        }
        __aeabi_memset(iVar1,iVar2,*(undefined1 *)(param_1 + uVar5 + 0x4074));
        iVar1 = iVar1 - iVar2;
        uVar6 = uVar6 - iVar3;
        iVar4 = iVar4 + -1;
      } while (-1 < iVar4);
    }
  }
  return;
}



### FUNC SearchInnerTemp @ 0002b3e0

/* CFunctions::SearchInnerTemp(int) */

uint __thiscall CFunctions::SearchInnerTemp(CFunctions *this,int param_1)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  uint uVar6;
  float extraout_s0;
  uint local_18;
  
  uVar3 = *(uint *)(this + 0x50f0);
  uVar4 = *(uint *)(this + 0x37ec);
  uVar5 = 0xffff;
  local_18 = 0;
  uVar6 = 0x7fff;
  do {
    uVar2 = ReviseTemperature(this,(ushort)uVar6,(uVar4 >> 1) + (uVar3 >> 1));
    if ((*(int *)(this + 0x4c) != 0) || (*(int *)(this + 0x50) != 0)) {
      uVar2 = CorrectTemperature((int)this,extraout_s0,uVar2);
    }
    uVar1 = uVar6;
    if ((int)uVar2 <= param_1) {
      uVar1 = uVar5;
      local_18 = uVar6;
    }
    uVar5 = uVar1;
    uVar6 = local_18 + uVar5 >> 1;
  } while (local_18 + 1 < uVar5);
  return uVar6;
}



### FUNC GetOriginalBMPDataPointer @ 0002b46c

/* CFunctions::GetOriginalBMPDataPointer() */

undefined4 __thiscall CFunctions::GetOriginalBMPDataPointer(CFunctions *this)

{
  undefined4 uVar1;
  
  uVar1 = 0;
  if ((*(int *)(this + 0xa4) != 0) && (*(int *)(this + 0xac) != 0)) {
    if (*(int *)(this + 0x3864) == 0) {
      MapTemperature((int)this);
    }
    uVar1 = *(undefined4 *)(this + 0xc0);
  }
  return uVar1;
}



### FUNC SaveBMP @ 0002b49c

/* CFunctions::SaveBMP(CacheData, char const*) */

undefined4 __thiscall CFunctions::SaveBMP(CFunctions *this,int param_2,char *param_3)

{
  undefined4 *puVar1;
  uint uVar2;
  int iVar3;
  void *pvVar4;
  char *pcVar5;
  pthread_mutex_t *__mutex;
  undefined4 uVar6;
  ushort local_44;
  ushort local_42;
  ushort local_3e;
  ushort local_3c;
  ushort local_3a;
  ushort local_38;
  undefined2 local_34;
  undefined2 local_32;
  undefined2 local_2e;
  undefined2 local_2c;
  undefined2 local_2a;
  undefined2 local_28;
  MStream aMStack_24 [12];
  int local_18;
  
  local_18 = __stack_chk_guard;
  MStream::MStream(aMStack_24,0x100);
  __mutex = (pthread_mutex_t *)(this + 0xb0);
  pthread_mutex_lock(__mutex);
  if ((*(int *)(this + 0xa4) == 0) || (*(int *)(this + 0xac) == 0)) {
    pthread_mutex_unlock(__mutex);
    uVar6 = 0xe4ae0006;
LAB_0002b4f8:
    puVar1 = (undefined4 *)__errno();
    *puVar1 = uVar6;
  }
  else {
    if (param_2 == 0) {
      uVar2 = *(uint *)(this + 0x50f0);
      iVar3 = GetOriginalBMPDataPointer(this);
      if (iVar3 != 0) {
        pvVar4 = operator_new__(uVar2);
        __aeabi_memcpy(pvVar4,iVar3,uVar2);
        pthread_mutex_unlock(__mutex);
        if (param_3 == (char *)0x0) {
          GetLocalTime((_SYSTEMTIME *)&local_44);
          MStream::Fmt((char *)aMStack_24,"%d-%d-%d %d-%d-%d.bmp",(uint)local_44,(uint)local_42,
                       (uint)local_3e,(uint)local_3c,(uint)local_3a,(uint)local_38);
        }
        else {
          MStream::operator<<(aMStack_24,param_3);
        }
        local_28 = 0;
        local_34 = 0x4d42;
        local_2e = 0;
        local_2c = 0;
        local_2a = 0x436;
        local_32 = (undefined2)(uVar2 + 0x436);
        *(short *)(((uint)&local_34 | 2) + 2) = (short)(uVar2 + 0x436 >> 0x10);
        pcVar5 = (char *)MStream::Get(aMStack_24);
        OFStream::OFStream((OFStream *)&local_44,pcVar5,false);
        OFStream::Write((OFStream *)&local_44,&local_34,0xe,1);
        OFStream::Write((OFStream *)&local_44,this + 0x24cc,0x428,1);
        uVar6 = 1;
        OFStream::Write((OFStream *)&local_44,pvVar4,uVar2,1);
        IFStream::~IFStream((IFStream *)&local_44);
        operator_delete__(pvVar4);
        goto LAB_0002b500;
      }
      pthread_mutex_unlock(__mutex);
      uVar6 = 0xe4ae0003;
      goto LAB_0002b4f8;
    }
    pthread_mutex_unlock(__mutex);
    puVar1 = (undefined4 *)__errno();
    *puVar1 = 0xe4ae0001;
  }
  uVar6 = 0;
LAB_0002b500:
  MStream::~MStream(aMStack_24);
  if (__stack_chk_guard == local_18) {
    return uVar6;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC SaveRaw @ 0002b668

/* CFunctions::SaveRaw(CacheData, char const*) */

undefined4 __thiscall CFunctions::SaveRaw(CFunctions *this,int param_2,char *param_3)

{
  uint uVar1;
  void *pvVar2;
  undefined4 *puVar3;
  char *pcVar4;
  int iVar5;
  undefined4 uVar6;
  pthread_mutex_t *__mutex;
  undefined4 local_4c;
  ushort local_48;
  ushort local_46;
  ushort local_42;
  ushort local_40;
  ushort local_3e;
  ushort local_3c;
  undefined4 local_38;
  undefined4 local_34;
  undefined4 local_2c;
  undefined4 local_28;
  MStream aMStack_24 [12];
  int local_18;
  
  local_18 = __stack_chk_guard;
  MStream::MStream(aMStack_24,0x100);
  local_34 = 0;
  local_4c = 0;
  local_38 = 0;
  __mutex = (pthread_mutex_t *)(this + 0xb0);
  pthread_mutex_lock(__mutex);
  if ((*(int *)(this + 0xa4) == 0) || (*(int *)(this + 0xac) == 0)) {
    pthread_mutex_unlock(__mutex);
    uVar6 = 0xe4ae0006;
  }
  else {
    if (param_2 != 4) {
      pthread_mutex_unlock(__mutex);
      puVar3 = (undefined4 *)__errno();
      *puVar3 = 0xe4ae0001;
      goto LAB_0002b7b2;
    }
    local_28 = *(undefined4 *)(this + 0x37ec);
    local_2c = *(undefined4 *)(this + 0x37f0);
    local_34 = *(undefined4 *)(this + 0x40);
    local_38 = *(undefined4 *)(this + 0x44);
    iVar5 = *(int *)(this + 0xb4);
    uVar1 = *(int *)(this + 0x50f0) << 1;
    if (iVar5 != 0) {
      pvVar2 = operator_new__(uVar1);
      __aeabi_memcpy(pvVar2,iVar5,uVar1);
      pthread_mutex_unlock(__mutex);
      if (param_3 == (char *)0x0) {
        GetLocalTime((_SYSTEMTIME *)&local_48);
        MStream::Fmt((char *)aMStack_24,"%d-%02d-%02d %02d-%02d-%02d.raw",(uint)local_48,
                     (uint)local_46,(uint)local_42,(uint)local_40,(uint)local_3e,(uint)local_3c);
      }
      else {
        MStream::operator<<(aMStack_24,param_3);
      }
      pcVar4 = (char *)MStream::Get(aMStack_24);
      OFStream::OFStream((OFStream *)&local_48,pcVar4,false);
      OFStream::Write((OFStream *)&local_48,&local_28,4,1);
      OFStream::Write((OFStream *)&local_48,&local_2c,4,1);
      OFStream::Write((OFStream *)&local_48,&local_38,4,1);
      OFStream::Write((OFStream *)&local_48,(void *)((uint)&local_38 | 4),4,1);
      OFStream::Write((OFStream *)&local_48,pvVar2,uVar1,1);
      IFStream::~IFStream((IFStream *)&local_48);
      operator_delete__(pvVar2);
      local_4c = 1;
      goto LAB_0002b7b2;
    }
    pthread_mutex_unlock(__mutex);
    uVar6 = 0xe4ae0003;
  }
  puVar3 = (undefined4 *)__errno();
  *puVar3 = uVar6;
LAB_0002b7b2:
  MStream::~MStream(aMStack_24);
  if (__stack_chk_guard == local_18) {
    return local_4c;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC GetRectTemperatureInfo @ 0002b848

/* CFunctions::GetRectTemperatureInfo(unsigned int, unsigned int, unsigned int, unsigned int, int*,
   int) */

undefined4 __thiscall
CFunctions::GetRectTemperatureInfo
          (CFunctions *this,uint param_1,uint param_2,uint param_3,uint param_4,int *param_5,
          int param_6)

{
  uint uVar1;
  ushort uVar2;
  undefined4 *puVar3;
  ushort *puVar4;
  int iVar5;
  uint uVar6;
  uint uVar7;
  uint uVar8;
  uint uVar9;
  undefined4 uVar10;
  uint uVar11;
  uint uVar12;
  bool bVar13;
  float extraout_s0;
  float extraout_s0_00;
  float extraout_s0_01;
  undefined8 uVar14;
  int local_30;
  uint local_2c;
  uint local_28;
  int local_24;
  uint local_20;
  uint local_1c;
  uint local_18;
  
  if (param_6 != 0) {
    pthread_mutex_lock((pthread_mutex_t *)(this + 0xb0));
  }
  if (((((param_3 < param_1) || (*(int *)(this + 0xac) == 0)) || (param_4 < param_2)) ||
      ((uVar7 = *(uint *)(this + 0x37ec), uVar7 <= param_3 || (param_5 == (int *)0x0)))) ||
     (*(uint *)(this + 0x37f0) <= param_4)) {
    uVar10 = 0xe4ae0005;
    if (*(int *)(this + 0xac) != 0) {
      uVar10 = 0xe4ae0001;
    }
    puVar3 = (undefined4 *)__errno();
    *puVar3 = uVar10;
    local_2c = 0;
    if (param_6 != 0) {
      pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
    }
  }
  else {
    if (((param_2 == 0 && param_1 == 0) && (uVar7 - 1 == param_3)) &&
       (*(uint *)(this + 0x37f0) - 1 == param_4)) {
      uVar14 = __muldi3(*(undefined4 *)(this + 0x50f0),0,*(int *)(this + 0x3840),
                        *(int *)(this + 0x3840) >> 0x1f);
      local_18 = *(uint *)(this + 0x3848);
      local_1c = *(uint *)(this + 0x384c);
      uVar2 = (ushort)*(undefined4 *)(this + 0x3838);
      uVar8 = *(uint *)(this + 0x383c);
    }
    else {
      local_30 = uVar7 * param_2;
      uVar9 = 0;
      uVar8 = 0xffffffff;
      local_24 = 0;
      local_28 = 0;
      local_2c = 0;
      local_20 = 0;
      uVar6 = param_2;
      do {
        puVar4 = (ushort *)(*(int *)(this + 0xb4) + uVar7 * uVar6 * 2 + param_1 * 2);
        uVar11 = param_1;
        do {
          local_18 = local_30 + uVar11;
          uVar12 = (uint)*puVar4;
          local_1c = local_18;
          if (uVar8 <= uVar12) {
            local_1c = local_2c;
          }
          if (uVar12 <= uVar9) {
            local_18 = local_28;
          }
          bVar13 = CARRY4(local_20,uVar12);
          local_20 = local_20 + uVar12;
          local_24 = local_24 + (uint)bVar13;
          uVar14 = CONCAT44(local_24,local_20);
          uVar1 = uVar12;
          if (uVar8 <= uVar12) {
            uVar1 = uVar8;
          }
          uVar8 = uVar1;
          if (uVar12 <= uVar9) {
            uVar12 = uVar9;
          }
          uVar9 = uVar12;
          uVar2 = (ushort)uVar9;
          uVar11 = uVar11 + 1;
          puVar4 = puVar4 + 1;
          local_28 = local_18;
          local_2c = local_1c;
        } while (uVar11 <= param_3);
        local_30 = local_30 + uVar7;
        uVar6 = uVar6 + 1;
      } while (uVar6 <= param_4);
    }
    local_24 = (int)((ulonglong)uVar14 >> 0x20);
    local_20 = (uint)uVar14;
    iVar5 = ReviseTemperature(this,(ushort)uVar8,local_1c);
    *param_5 = iVar5;
    iVar5 = ReviseTemperature(this,uVar2,local_18);
    param_5[1] = iVar5;
    local_2c = 1;
    uVar2 = __aeabi_ldivmod(local_20,local_24,((1 - param_1) + param_3) * ((1 - param_2) + param_4),
                            0);
    iVar5 = ReviseTemperature(this,uVar2,
                              (uVar7 * (param_4 + param_2) >> 1) + (param_3 + param_1 >> 1));
    param_5[2] = iVar5;
    param_5[3] = local_1c;
    param_5[4] = local_18;
    if (*(int *)(this + 0x50) != 0) {
      iVar5 = CorrectTemperature((int)this,extraout_s0,*param_5);
      *param_5 = iVar5;
      iVar5 = CorrectTemperature((int)this,extraout_s0_00,param_5[1]);
      param_5[1] = iVar5;
      iVar5 = CorrectTemperature((int)this,extraout_s0_01,param_5[2]);
      param_5[2] = iVar5;
    }
    if (param_6 != 0) {
      pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
    }
  }
  return local_2c;
}



### FUNC GetEllipseTemperatureInfo @ 0002ba84

/* CFunctions::GetEllipseTemperatureInfo(unsigned int, unsigned int, unsigned int, unsigned int,
   int*, int) */

undefined4 __thiscall
CFunctions::GetEllipseTemperatureInfo
          (CFunctions *this,uint param_1,uint param_2,uint param_3,uint param_4,int *param_5,
          int param_6)

{
  ushort uVar1;
  undefined4 uVar2;
  undefined4 uVar3;
  int iVar4;
  int iVar5;
  undefined4 *puVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  uint uVar10;
  uint uVar11;
  int iVar12;
  CFunctions *pCVar13;
  int iVar14;
  uint uVar15;
  uint uVar16;
  uint uVar17;
  uint uVar18;
  uint uVar19;
  uint uVar20;
  bool bVar21;
  float __x;
  float __x_00;
  float __x_01;
  float __x_02;
  float __x_03;
  float __x_04;
  float __x_05;
  float __x_06;
  float extraout_s0;
  float extraout_s0_00;
  float extraout_s0_01;
  int local_78;
  uint local_60;
  uint local_5c;
  uint local_58;
  uint local_4c;
  uint local_44;
  int local_40;
  ushort *local_3c;
  uint local_34;
  ushort *local_2c;
  uint local_28;
  int local_24;
  uint local_20;
  uint local_1c;
  uint local_18;
  
  if (param_6 != 0) {
    pthread_mutex_lock((pthread_mutex_t *)(this + 0xb0));
  }
  if ((((param_3 <= param_1) || (*(int *)(this + 0xac) == 0)) ||
      (pCVar13 = this + 0x37ec, param_4 <= param_2)) ||
     (((*(uint *)(this + 0x37ec) <= param_3 || (param_5 == (int *)0x0)) ||
      (*(uint *)(this + 0x37f0) <= param_4)))) {
    uVar2 = 0xe4ae0005;
    if (*(int *)(this + 0xac) != 0) {
      uVar2 = 0xe4ae0001;
    }
    puVar6 = (undefined4 *)__errno();
    *puVar6 = uVar2;
    uVar2 = 0;
    goto joined_r0x0002bf22;
  }
  uVar18 = param_4 - param_2;
  uVar16 = param_3 - param_1;
  local_1c = 0xffffffff;
  if (uVar16 < uVar18) {
    uVar2 = __floatunsisf();
    uVar3 = __floatsisf(uVar18 * uVar18 - uVar16 * uVar16);
    sqrtf(__x);
    __subsf3(uVar2,uVar3);
    iVar4 = __fixsfsi();
    sqrtf(__x_00);
    __addsf3();
    iVar5 = __fixsfsi();
    if (param_2 <= param_4) {
      local_18 = 0;
      local_5c = 0;
      local_58 = 0;
      local_20 = 0;
      local_34 = 0;
      local_24 = 0;
      local_1c = 0xffffffff;
      local_4c = param_2;
      do {
        if (param_1 <= param_3) {
          local_2c = (ushort *)
                     (*(int *)(this + 0xb4) + local_4c * *(int *)pCVar13 * 2 + param_1 * 2);
          iVar7 = local_4c - iVar5 / 2;
          iVar8 = local_4c - iVar4 / 2;
          local_3c = (ushort *)0x0;
          iVar12 = param_3 - param_1;
          iVar14 = param_1 - param_3;
          uVar16 = param_1;
          local_28 = param_1 << 1;
          do {
            local_40 = iVar12;
            if (-1 < iVar14) {
              local_40 = iVar14;
            }
            if ((int)local_3c < local_40) {
              uVar2 = __floatunsisf(iVar14 * iVar14 + iVar8 * iVar8 * 4);
              sqrtf(__x_03);
              uVar3 = __floatunsisf(iVar14 * iVar14 + iVar7 * iVar7 * 4);
              sqrtf(__x_04);
              __addsf3(uVar2,uVar3);
              iVar9 = __fixsfsi();
              if (iVar9 <= (int)(uVar18 * 2)) goto LAB_0002bcb6;
              if (param_3 + param_1 <= local_28) break;
            }
            else {
              local_40 = (int)local_3c;
LAB_0002bcb6:
              uVar10 = (uint)*local_2c;
              bVar21 = CARRY4(local_20,uVar10);
              local_20 = local_20 + uVar10;
              local_24 = local_24 + (uint)bVar21;
              local_18 = local_18 + 1;
              if (local_34 < uVar10) {
                local_58 = uVar16 + local_4c * *(int *)pCVar13;
                local_34 = uVar10;
              }
              if (uVar10 < local_1c) {
                local_5c = uVar16 + local_4c * *(int *)pCVar13;
                local_1c = uVar10;
              }
              local_3c = (ushort *)local_40;
            }
            local_2c = local_2c + 1;
            local_28 = local_28 + 2;
            iVar12 = iVar12 + -2;
            iVar14 = iVar14 + 2;
            uVar16 = uVar16 + 1;
          } while (uVar16 <= param_3);
        }
        local_4c = local_4c + 1;
      } while (local_4c <= param_4);
      goto LAB_0002be94;
    }
LAB_0002bbd0:
    local_24 = 0;
    local_58 = 0;
    local_5c = 0;
    local_18 = 0;
    local_20 = 0;
    local_34._0_2_ = 0;
    uVar1 = 0xffff;
  }
  else {
    local_34 = 0;
    uVar2 = __floatunsisf();
    uVar3 = __floatsisf(uVar16 * uVar16 - uVar18 * uVar18);
    sqrtf(__x_01);
    __subsf3(uVar2,uVar3);
    iVar4 = __fixsfsi();
    sqrtf(__x_02);
    __addsf3();
    iVar5 = __fixsfsi();
    if (param_4 < param_2) goto LAB_0002bbd0;
    local_18 = 0;
    local_5c = 0;
    local_20 = 0;
    local_24 = 0;
    uVar18 = param_2;
    local_58 = local_18;
    do {
      iVar12 = uVar18 * 2 - (param_4 + param_2);
      iVar12 = iVar12 * iVar12;
      if (param_1 <= param_3) {
        local_3c = (ushort *)(*(int *)(this + 0xb4) + uVar18 * *(int *)pCVar13 * 2 + param_1 * 2);
        local_44 = 0;
        uVar10 = uVar16;
        uVar15 = param_1;
        uVar17 = param_1 << 1;
        uVar20 = param_1 - param_3;
        local_2c = (ushort *)(param_1 * 4 + (iVar4 / 2) * -4);
        local_28 = param_1 * 4 + (iVar5 / 2) * -4;
        do {
          uVar11 = uVar10;
          if (-1 < (int)uVar20) {
            uVar11 = uVar20;
          }
          uVar19 = local_44;
          if ((int)local_44 < (int)uVar11) {
            uVar2 = __floatunsisf((int)local_2c * (uVar15 - iVar4 / 2) + iVar12);
            sqrtf(__x_05);
            uVar3 = __floatunsisf(local_28 * (uVar15 - iVar5 / 2) + iVar12);
            sqrtf(__x_06);
            __addsf3(uVar2,uVar3);
            iVar14 = __fixsfsi();
            uVar19 = uVar11;
            if (iVar14 <= (int)(uVar16 * 2)) goto LAB_0002be10;
            if (param_3 + param_1 <= uVar17) break;
          }
          else {
LAB_0002be10:
            uVar11 = (uint)*local_3c;
            bVar21 = CARRY4(local_20,uVar11);
            local_20 = local_20 + uVar11;
            local_24 = local_24 + (uint)bVar21;
            local_18 = local_18 + 1;
            if (local_34 < uVar11) {
              local_58 = uVar15 + uVar18 * *(int *)pCVar13;
              local_34 = uVar11;
            }
            local_44 = uVar19;
            if (uVar11 < local_1c) {
              local_5c = uVar15 + uVar18 * *(int *)pCVar13;
              local_1c = uVar11;
            }
          }
          local_3c = local_3c + 1;
          uVar17 = uVar17 + 2;
          uVar10 = uVar10 - 2;
          uVar20 = uVar20 + 2;
          local_28 = local_28 + 4;
          local_2c = (ushort *)((int)local_2c + 4);
          uVar15 = uVar15 + 1;
        } while (uVar15 <= param_3);
      }
      uVar18 = uVar18 + 1;
    } while (uVar18 <= param_4);
LAB_0002be94:
    uVar1 = (ushort)local_1c;
  }
  local_60 = param_3 + param_1;
  local_78 = param_4 + param_2;
  iVar4 = *(int *)pCVar13;
  iVar5 = ReviseTemperature(this,uVar1,local_5c);
  *param_5 = iVar5;
  iVar5 = ReviseTemperature(this,(ushort)local_34,local_58);
  param_5[1] = iVar5;
  uVar1 = __aeabi_ldivmod(local_20,local_24,local_18,0);
  iVar4 = ReviseTemperature(this,uVar1,((uint)(local_78 * iVar4) >> 1) + (local_60 >> 1));
  param_5[2] = iVar4;
  param_5[3] = local_5c;
  param_5[4] = local_58;
  if (*(int *)(this + 0x50) != 0) {
    iVar4 = CorrectTemperature((int)this,extraout_s0,*param_5);
    *param_5 = iVar4;
    iVar4 = CorrectTemperature((int)this,extraout_s0_00,param_5[1]);
    param_5[1] = iVar4;
    iVar4 = CorrectTemperature((int)this,extraout_s0_01,param_5[2]);
    param_5[2] = iVar4;
  }
  uVar2 = 1;
joined_r0x0002bf22:
  if (param_6 != 0) {
    pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
  }
  return uVar2;
}



### FUNC GetLineTemperatureInfo @ 0002bf34

/* CFunctions::GetLineTemperatureInfo(unsigned short*, unsigned int, int*, unsigned int, unsigned
   int, int, int) */

uint __thiscall
CFunctions::GetLineTemperatureInfo
          (CFunctions *this,ushort *param_1,uint param_2,int *param_3,uint param_4,uint param_5,
          int param_6,int param_7)

{
  ushort uVar1;
  uint uVar2;
  undefined4 *puVar3;
  int iVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  ushort *puVar8;
  uint uVar9;
  ushort *puVar10;
  uint uVar11;
  undefined4 uVar12;
  uint uVar13;
  float extraout_s0;
  float extraout_s0_00;
  float extraout_s0_01;
  CFunctions *local_38;
  int local_20;
  uint local_1c;
  int local_18;
  
  if (param_7 != 0) {
    pthread_mutex_lock((pthread_mutex_t *)(this + 0xb0));
  }
  if (*(int *)(this + 0xac) != 0) {
    local_1c = 0xffffffff;
    if (param_6 == 0) {
      uVar6 = *(uint *)(this + 0x37ec);
      if (((param_4 < uVar6) && (param_5 < *(uint *)(this + 0x37f0))) &&
         ((1 < param_2 && ((param_1 != (ushort *)0x0 && (param_3 != (int *)0x0)))))) {
        uVar13 = *(int *)(this + 0x37f0) - param_5;
        if (param_2 >> 1 <= *(int *)(this + 0x37f0) - param_5) {
          uVar13 = param_2 >> 1;
        }
        uVar5 = uVar13 + param_5;
        if (param_5 < uVar5) {
          puVar8 = (ushort *)(*(int *)(this + 0xb4) + (param_4 + uVar6 * param_5) * 2);
          puVar10 = param_1;
          do {
            *puVar10 = *puVar8;
            puVar8 = puVar8 + uVar6;
            puVar10 = puVar10 + 1;
            param_5 = param_5 + 1;
          } while (param_5 < uVar5);
        }
LAB_0002c048:
        local_38 = this + 0x37ec;
        uVar6 = 0;
        if (uVar13 == 0) {
          uVar5 = 0xffffffff;
          local_20 = 0;
          uVar7 = uVar6;
        }
        else {
          local_20 = 0;
          uVar6 = 0;
          uVar2 = uVar13;
          uVar9 = 0;
          do {
            uVar11 = (uint)*param_1;
            uVar7 = uVar2;
            if (uVar11 <= uVar6) {
              uVar7 = uVar9;
            }
            uVar5 = uVar11;
            if (local_1c <= uVar11) {
              uVar5 = local_1c;
            }
            uVar9 = uVar11;
            if (uVar11 <= uVar6) {
              uVar9 = uVar6;
            }
            uVar6 = uVar9;
            local_20 = local_20 + uVar11;
            uVar2 = uVar2 - 1;
            param_1 = param_1 + 1;
            uVar9 = uVar7;
            local_1c = uVar5;
          } while (uVar2 != 0);
        }
        if (param_6 == 0) {
          local_18 = *(uint *)local_38 * (uVar13 - uVar7) + (*(uint *)local_38 >> 1);
          uVar7 = *(uint *)(this + 0x50f0) >> 1;
        }
        else {
          local_18 = (uVar13 - uVar7) + (*(uint *)(this + 0x50f0) >> 1);
          uVar7 = *(uint *)local_38 * param_4;
          param_4 = *(uint *)local_38 >> 1;
        }
        uVar7 = uVar7 + param_4;
        iVar4 = ReviseTemperature(this,(ushort)uVar5,uVar7);
        *param_3 = iVar4;
        iVar4 = ReviseTemperature(this,(ushort)uVar6,uVar7);
        param_3[1] = iVar4;
        uVar1 = __udivsi3(local_20,uVar13);
        iVar4 = ReviseTemperature(this,uVar1,uVar7);
        param_3[2] = iVar4;
        param_3[3] = uVar5;
        param_3[4] = uVar6;
        param_3[5] = local_18;
        if (*(int *)(this + 0x50) != 0) {
          iVar4 = CorrectTemperature((int)this,extraout_s0,*param_3);
          *param_3 = iVar4;
          iVar4 = CorrectTemperature((int)this,extraout_s0_00,param_3[1]);
          param_3[1] = iVar4;
          iVar4 = CorrectTemperature((int)this,extraout_s0_01,param_3[2]);
          param_3[2] = iVar4;
        }
        goto joined_r0x0002c184;
      }
    }
    else if ((((param_4 < *(uint *)(this + 0x37f0)) && (1 < param_2)) && (param_1 != (ushort *)0x0))
            && ((param_3 != (int *)0x0 && (param_5 < *(uint *)(this + 0x37ec))))) {
      uVar13 = *(int *)(this + 0x37ec) - param_5;
      if (param_2 >> 1 <= *(int *)(this + 0x37ec) - param_5) {
        uVar13 = param_2 >> 1;
      }
      __aeabi_memcpy(param_1,*(int *)(this + 0xb4) + param_4 * *(uint *)(this + 0x37ec) * 2 +
                             param_5 * 2,uVar13 << 1);
      goto LAB_0002c048;
    }
  }
  uVar12 = 0xe4ae0005;
  if (*(int *)(this + 0xac) != 0) {
    uVar12 = 0xe4ae0001;
  }
  puVar3 = (undefined4 *)__errno();
  *puVar3 = uVar12;
  uVar13 = 0;
joined_r0x0002c184:
  if (param_7 != 0) {
    pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
  }
  return uVar13;
}



### FUNC GetLineTemperatureInfo2 @ 0002c1a0

/* CFunctions::GetLineTemperatureInfo2(unsigned short*, unsigned int, int*, unsigned int, unsigned
   int, unsigned int, unsigned int, int) */

uint __thiscall
CFunctions::GetLineTemperatureInfo2
          (CFunctions *this,ushort *param_1,uint param_2,int *param_3,uint param_4,uint param_5,
          uint param_6,uint param_7,int param_8)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  ushort uVar4;
  int iVar5;
  int iVar6;
  undefined4 *puVar7;
  int iVar8;
  int iVar9;
  uint uVar10;
  uint uVar11;
  uint uVar12;
  uint uVar13;
  uint uVar14;
  uint uVar15;
  undefined4 uVar16;
  ushort *puVar17;
  int iVar18;
  uint uVar19;
  float extraout_s0;
  float extraout_s0_00;
  float extraout_s0_01;
  uint local_18;
  
  if (param_8 != 0) {
    pthread_mutex_lock((pthread_mutex_t *)(this + 0xb0));
  }
  if ((((*(int *)(this + 0xac) == 0) || (uVar13 = *(uint *)(this + 0x37ec), uVar13 <= param_4)) ||
      (uVar13 <= param_6)) ||
     ((*(uint *)(this + 0x37f0) <= param_5 || (*(uint *)(this + 0x37f0) <= param_7)))) {
LAB_0002c316:
    uVar16 = 0xe4ae0005;
    if (*(int *)(this + 0xac) != 0) {
      uVar16 = 0xe4ae0001;
    }
    puVar7 = (undefined4 *)__errno();
    *puVar7 = uVar16;
    uVar19 = 0;
  }
  else {
    if (param_4 == param_6) {
      if (((param_2 < 2) || (param_1 == (ushort *)0x0)) ||
         ((param_3 == (int *)0x0 || (param_5 == param_7)))) goto LAB_0002c316;
    }
    else if (((param_2 < 2) || (param_1 == (ushort *)0x0)) || (param_3 == (int *)0x0))
    goto LAB_0002c316;
    iVar5 = param_5 - param_7;
    uVar14 = iVar5 + (iVar5 >> 0x1f) ^ iVar5 >> 0x1f;
    iVar9 = param_4 - param_6;
    uVar15 = iVar9 + (iVar9 >> 0x1f) ^ iVar9 >> 0x1f;
    if ((int)uVar15 < (int)uVar14) {
      iVar9 = iVar5;
    }
    uVar10 = iVar9 + (iVar9 >> 0x1f) ^ iVar9 >> 0x1f;
    uVar19 = uVar10 + 1;
    uVar11 = param_2 >> 1;
    if ((int)uVar11 <= (int)uVar19) {
      uVar19 = uVar11;
    }
    uVar12 = param_4;
    uVar1 = param_5;
    uVar2 = param_6;
    uVar3 = param_7;
    if (param_4 <= param_6) {
      uVar12 = param_6;
      uVar1 = param_7;
      uVar2 = param_4;
      uVar3 = param_5;
    }
    if ((int)uVar15 < (int)uVar14) {
      if ((int)uVar3 < (int)uVar1) {
        uVar14 = (uVar3 + uVar19) - 1;
        if ((int)uVar1 <= (int)uVar14) {
          uVar14 = uVar1;
        }
        if ((int)uVar3 <= (int)uVar14) {
          local_18 = -param_6 - 1;
          if (-param_6 - 1 <= -param_4 - 1) {
            local_18 = -param_4 - 1;
          }
          local_18 = (uVar3 * uVar13 + -1) - local_18;
          iVar9 = *(int *)(this + 0xb4);
          iVar5 = uVar3 - 1;
          iVar18 = 0;
          puVar17 = param_1;
          do {
            iVar6 = __divsi3(iVar18,uVar1 - uVar3);
            *puVar17 = *(ushort *)(iVar9 + (local_18 + iVar6) * 2);
            local_18 = local_18 + uVar13;
            iVar18 = iVar18 + (uVar12 - uVar2);
            puVar17 = puVar17 + 1;
            iVar5 = iVar5 + 1;
          } while (iVar5 < (int)uVar14);
        }
      }
      else {
        uVar14 = (uVar3 - uVar19) + 1;
        if ((int)uVar14 <= (int)uVar1) {
          uVar14 = uVar1;
        }
        if ((int)uVar14 <= (int)uVar3) {
          uVar15 = -param_6 - 1;
          if (-param_6 - 1 <= -param_4 - 1) {
            uVar15 = -param_4 - 1;
          }
          iVar18 = (uVar3 * uVar13 + -1) - uVar15;
          iVar9 = *(int *)(this + 0xb4);
          iVar6 = uVar3 + 1;
          iVar5 = 0;
          puVar17 = param_1;
          do {
            iVar8 = __divsi3(iVar5,uVar1 - uVar3);
            *puVar17 = *(ushort *)(iVar9 + (iVar18 + iVar8) * 2);
            iVar18 = iVar18 - uVar13;
            iVar5 = iVar5 + ((-1 - uVar12) - uVar15);
            puVar17 = puVar17 + 1;
            iVar6 = iVar6 + -1;
          } while ((int)uVar14 < iVar6);
        }
      }
    }
    else {
      uVar14 = (uVar2 + uVar19) - 1;
      if ((int)uVar12 <= (int)uVar14) {
        uVar14 = uVar12;
      }
      if ((int)uVar2 <= (int)uVar14) {
        uVar15 = -param_6 - 1;
        if (-param_6 - 1 <= -param_4 - 1) {
          uVar15 = -param_4 - 1;
        }
        iVar5 = -2 - uVar15;
        iVar9 = *(int *)(this + 0xb4);
        iVar18 = 0;
        puVar17 = param_1;
        do {
          iVar6 = __divsi3(iVar18,uVar12 - uVar2);
          *puVar17 = *(ushort *)(iVar9 + (iVar5 + uVar13 * (iVar6 + uVar3)) * 2 + 2);
          iVar18 = iVar18 + (uVar1 - uVar3);
          puVar17 = puVar17 + 1;
          iVar5 = iVar5 + 1;
        } while (iVar5 < (int)uVar14);
      }
    }
    uVar4 = 0;
    if (uVar19 == 0) {
      local_18 = 0xffff;
      iVar9 = 0;
    }
    else {
      iVar9 = -2 - uVar10;
      iVar5 = -1 - uVar11;
      if ((int)(-1 - uVar11) <= iVar9) {
        iVar5 = iVar9;
      }
      iVar5 = iVar5 + 1;
      iVar9 = 0;
      uVar14 = 0;
      local_18 = 0xffffffff;
      do {
        uVar10 = (uint)*param_1;
        uVar15 = uVar10;
        if (local_18 <= uVar10) {
          uVar15 = local_18;
        }
        local_18 = uVar15;
        uVar15 = uVar10;
        if (uVar10 <= uVar14) {
          uVar15 = uVar14;
        }
        uVar14 = uVar15;
        uVar4 = (ushort)uVar14;
        iVar9 = iVar9 + uVar10;
        iVar5 = iVar5 + 1;
        param_1 = param_1 + 1;
      } while (iVar5 != 0);
    }
    uVar13 = (uVar13 * (param_7 + param_5) >> 1) + (param_6 + param_4 >> 1);
    iVar5 = ReviseTemperature(this,(ushort)local_18,uVar13);
    *param_3 = iVar5;
    iVar5 = ReviseTemperature(this,uVar4,uVar13);
    param_3[1] = iVar5;
    uVar4 = __udivsi3(iVar9,uVar19);
    iVar9 = ReviseTemperature(this,uVar4,uVar13);
    param_3[2] = iVar9;
    if (*(int *)(this + 0x50) != 0) {
      iVar9 = CorrectTemperature((int)this,extraout_s0,*param_3);
      *param_3 = iVar9;
      iVar9 = CorrectTemperature((int)this,extraout_s0_00,param_3[1]);
      param_3[1] = iVar9;
      iVar9 = CorrectTemperature((int)this,extraout_s0_01,param_3[2]);
      param_3[2] = iVar9;
    }
  }
  if (param_8 != 0) {
    pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
  }
  return uVar19;
}



### FUNC GetLineTemperatureInfo3 @ 0002c510

/* CFunctions::GetLineTemperatureInfo3(int*, unsigned int, int*, unsigned int, unsigned int,
   unsigned int, unsigned int, int) */

uint __thiscall
CFunctions::GetLineTemperatureInfo3
          (CFunctions *this,int *param_1,uint param_2,int *param_3,uint param_4,uint param_5,
          uint param_6,uint param_7,int param_8)

{
  uint uVar1;
  ushort uVar2;
  uint uVar3;
  int iVar4;
  undefined4 *puVar5;
  int iVar6;
  uint uVar7;
  int iVar8;
  CFunctions *pCVar9;
  int iVar10;
  uint uVar11;
  uint *puVar12;
  uint uVar13;
  uint uVar14;
  int iVar15;
  uint uVar16;
  uint uVar17;
  undefined4 uVar18;
  uint uVar19;
  uint uVar20;
  float extraout_s0;
  float extraout_s0_00;
  float extraout_s0_01;
  float extraout_s0_02;
  
  if (param_8 != 0) {
    pthread_mutex_lock((pthread_mutex_t *)(this + 0xb0));
  }
  if (*(int *)(this + 0xac) != 0) {
    uVar3 = *(uint *)(this + 0x37ec);
    pCVar9 = this + 0x37ec;
    if ((((param_4 < uVar3) && (param_6 < uVar3)) && (param_5 < *(uint *)(this + 0x37f0))) &&
       (param_7 < *(uint *)(this + 0x37f0))) {
      if (param_4 == param_6) {
        if (((3 < param_2) && (param_1 != (int *)0x0)) &&
           ((param_3 != (int *)0x0 && (param_5 != param_7)))) {
LAB_0002c59e:
          iVar10 = param_5 - param_7;
          uVar14 = iVar10 + (iVar10 >> 0x1f) ^ iVar10 >> 0x1f;
          iVar15 = param_4 - param_6;
          uVar7 = iVar15 + (iVar15 >> 0x1f) ^ iVar15 >> 0x1f;
          if ((int)uVar7 < (int)uVar14) {
            iVar15 = iVar10;
          }
          uVar16 = iVar15 + (iVar15 >> 0x1f) ^ iVar15 >> 0x1f;
          uVar11 = param_2 >> 2;
          uVar17 = uVar16 + 1;
          if ((int)uVar11 <= (int)(uVar16 + 1)) {
            uVar17 = uVar11;
          }
          uVar20 = param_4;
          uVar13 = param_6;
          uVar19 = param_7;
          uVar1 = param_5;
          if (param_4 <= param_6) {
            uVar20 = param_6;
            uVar13 = param_4;
            uVar19 = param_5;
            uVar1 = param_7;
          }
          if ((int)uVar7 < (int)uVar14) {
            if ((int)uVar19 < (int)uVar1) {
              uVar7 = (uVar19 + uVar17) - 1;
              if ((int)uVar1 <= (int)uVar7) {
                uVar7 = uVar1;
              }
              if ((int)uVar19 <= (int)uVar7) {
                iVar10 = *(int *)(this + 0xb4);
                *param_1 = (uint)*(ushort *)(iVar10 + (uVar13 + uVar19 * uVar3) * 2);
                iVar8 = uVar1 - uVar19;
                iVar15 = uVar20 - uVar13;
                puVar12 = (uint *)param_1;
                while ((int)uVar19 < (int)uVar7) {
                  puVar12 = puVar12 + 1;
                  iVar4 = __divsi3(iVar15,iVar8);
                  uVar19 = uVar19 + 1;
                  *puVar12 = (uint)*(ushort *)
                                    (iVar10 + (iVar4 + uVar13 + uVar19 * *(int *)pCVar9) * 2);
                  iVar15 = iVar15 + (uVar20 - uVar13);
                }
              }
            }
            else {
              uVar7 = (uVar19 - uVar17) + 1;
              if ((int)uVar7 <= (int)uVar1) {
                uVar7 = uVar1;
              }
              if ((int)uVar7 <= (int)uVar19) {
                iVar10 = *(int *)(this + 0xb4);
                *param_1 = (uint)*(ushort *)(iVar10 + (uVar13 + uVar19 * uVar3) * 2);
                iVar15 = uVar1 - uVar19;
                if ((int)uVar7 < (int)uVar19) {
                  uVar3 = -param_6 - 1;
                  if (-param_6 - 1 <= -param_4 - 1) {
                    uVar3 = -param_4 - 1;
                  }
                  iVar4 = (-1 - uVar20) - uVar3;
                  iVar8 = iVar4;
                  puVar12 = (uint *)param_1;
                  do {
                    puVar12 = puVar12 + 1;
                    iVar6 = __divsi3(iVar8,iVar15);
                    uVar19 = uVar19 - 1;
                    *puVar12 = (uint)*(ushort *)
                                      (iVar10 + (iVar6 + uVar13 + uVar19 * *(int *)pCVar9) * 2);
                    iVar8 = iVar8 + iVar4;
                  } while ((int)uVar7 < (int)uVar19);
                }
              }
            }
          }
          else {
            uVar7 = (uVar13 + uVar17) - 1;
            if ((int)uVar20 <= (int)uVar7) {
              uVar7 = uVar20;
            }
            if ((int)uVar13 <= (int)uVar7) {
              iVar10 = *(int *)(this + 0xb4);
              *param_1 = (uint)*(ushort *)(iVar10 + (uVar19 * uVar3 + uVar13) * 2);
              iVar8 = uVar20 - uVar13;
              iVar15 = uVar1 - uVar19;
              puVar12 = (uint *)param_1;
              while ((int)uVar13 < (int)uVar7) {
                uVar13 = uVar13 + 1;
                puVar12 = puVar12 + 1;
                iVar4 = __divsi3(iVar15,iVar8);
                iVar15 = iVar15 + (uVar1 - uVar19);
                *puVar12 = (uint)*(ushort *)
                                  (iVar10 + (uVar13 + (iVar4 + uVar19) * *(int *)pCVar9) * 2);
              }
            }
          }
          uVar3 = 0xffff;
          if (uVar17 == 0) {
            uVar14 = 0;
            uVar7 = uVar14;
          }
          else {
            iVar15 = -1 - uVar11;
            if ((int)(-1 - uVar11) <= (int)(-2 - uVar16)) {
              iVar15 = -2 - uVar16;
            }
            iVar15 = iVar15 + 1;
            uVar7 = 0;
            uVar14 = 0;
            puVar12 = (uint *)param_1;
            uVar13 = 0xffffffff;
            do {
              uVar19 = *puVar12;
              puVar12 = puVar12 + 1;
              uVar3 = uVar19;
              if (uVar13 <= uVar19) {
                uVar3 = uVar13;
              }
              uVar13 = uVar19;
              if (uVar19 <= uVar14) {
                uVar13 = uVar14;
              }
              uVar14 = uVar13;
              uVar7 = uVar19 + uVar7;
              iVar15 = iVar15 + 1;
              uVar13 = uVar3;
            } while (iVar15 != 0);
          }
          uVar13 = ((param_7 + param_5) * *(int *)pCVar9 >> 1) + (param_6 + param_4 >> 1);
          iVar15 = ReviseTemperature(this,(ushort)uVar3,uVar13);
          *param_3 = iVar15;
          iVar15 = ReviseTemperature(this,(ushort)uVar14,uVar13);
          param_3[1] = iVar15;
          uVar2 = __udivsi3(uVar7,uVar17);
          iVar15 = ReviseTemperature(this,uVar2,uVar13);
          param_3[2] = iVar15;
          if (*(int *)(this + 0x50) != 0) {
            iVar15 = CorrectTemperature((int)this,extraout_s0,*param_3);
            *param_3 = iVar15;
            iVar15 = CorrectTemperature((int)this,extraout_s0_00,param_3[1]);
            param_3[1] = iVar15;
            iVar15 = CorrectTemperature((int)this,extraout_s0_01,param_3[2]);
            param_3[2] = iVar15;
          }
          if (uVar17 != 0) {
            iVar15 = -1 - uVar11;
            if ((int)(-1 - uVar11) <= (int)(-2 - uVar16)) {
              iVar15 = -2 - uVar16;
            }
            iVar15 = iVar15 + 1;
            do {
              uVar3 = ReviseTemperature(this,(ushort)*param_1,uVar13);
              *param_1 = uVar3;
              if (*(int *)(this + 0x50) != 0) {
                uVar3 = CorrectTemperature((int)this,extraout_s0_02,uVar3);
                *param_1 = uVar3;
              }
              iVar15 = iVar15 + 1;
              param_1 = (int *)((uint *)param_1 + 1);
            } while (iVar15 != 0);
          }
          if (param_8 == 0) {
            return uVar17;
          }
          pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
          return uVar17;
        }
      }
      else if (((3 < param_2) && (param_1 != (int *)0x0)) && (param_3 != (int *)0x0))
      goto LAB_0002c59e;
    }
  }
  uVar18 = 0xe4ae0005;
  if (*(int *)(this + 0xac) != 0) {
    uVar18 = 0xe4ae0001;
  }
  puVar5 = (undefined4 *)__errno();
  *puVar5 = uVar18;
  if (param_8 != 0) {
    pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
  }
  return 0;
}



### FUNC GetRgnTemperatureInfo @ 0002c8e4

/* CFunctions::GetRgnTemperatureInfo(unsigned int const*, unsigned int, int*, int) */

undefined4 __thiscall
CFunctions::GetRgnTemperatureInfo
          (CFunctions *this,uint *param_1,uint param_2,int *param_3,int param_4)

{
  ushort uVar1;
  uint uVar2;
  int iVar3;
  undefined4 *puVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  undefined4 uVar8;
  uint uVar9;
  bool bVar10;
  float extraout_s0;
  float extraout_s0_00;
  float extraout_s0_01;
  uint local_2c;
  uint local_28;
  uint *local_24;
  int local_20;
  uint local_1c;
  uint local_18;
  
  if (param_4 != 0) {
    pthread_mutex_lock((pthread_mutex_t *)(this + 0xb0));
  }
  if ((((param_2 == 0) || (param_1 == (uint *)0x0)) || (param_3 == (int *)0x0)) ||
     (*(int *)(this + 0xac) == 0)) {
    uVar8 = 0xe4ae0005;
    if (*(int *)(this + 0xac) != 0) {
      uVar8 = 0xe4ae0001;
    }
    puVar4 = (undefined4 *)__errno();
    *puVar4 = uVar8;
    uVar8 = 0;
  }
  else {
    local_20 = 0;
    local_2c = 0;
    local_18 = 0;
    local_1c = 0;
    uVar5 = 0;
    uVar6 = 0xffffffff;
    local_28 = param_2;
    local_24 = param_1;
    do {
      uVar9 = *local_24;
      local_24 = local_24 + 1;
      uVar7 = (uint)*(ushort *)(*(int *)(this + 0xb4) + uVar9 * 2);
      uVar2 = uVar9;
      if (uVar6 <= uVar7) {
        uVar2 = local_18;
      }
      local_18 = uVar2;
      if (uVar7 <= uVar5) {
        uVar9 = local_2c;
      }
      bVar10 = CARRY4(local_1c,uVar7);
      local_1c = local_1c + uVar7;
      local_20 = local_20 + (uint)bVar10;
      uVar2 = uVar7;
      if (uVar6 <= uVar7) {
        uVar2 = uVar6;
      }
      if (uVar7 <= uVar5) {
        uVar7 = uVar5;
      }
      uVar5 = uVar7;
      local_28 = local_28 - 1;
      uVar6 = uVar2;
      local_2c = uVar9;
    } while (local_28 != 0);
    iVar3 = ReviseTemperature(this,(ushort)uVar2,local_18);
    *param_3 = iVar3;
    iVar3 = ReviseTemperature(this,(ushort)uVar5,uVar9);
    param_3[1] = iVar3;
    uVar1 = __aeabi_ldivmod(local_1c,local_20,param_2,0);
    iVar3 = ReviseTemperature(this,uVar1,
                              (*(uint *)(this + 0x37ec) >> 1) + (*(uint *)(this + 0x50f0) >> 1));
    param_3[2] = iVar3;
    param_3[3] = local_18;
    param_3[4] = uVar9;
    if (*(int *)(this + 0x50) != 0) {
      iVar3 = CorrectTemperature((int)this,extraout_s0,*param_3);
      *param_3 = iVar3;
      iVar3 = CorrectTemperature((int)this,extraout_s0_00,param_3[1]);
      param_3[1] = iVar3;
      iVar3 = CorrectTemperature((int)this,extraout_s0_01,param_3[2]);
      param_3[2] = iVar3;
    }
    uVar8 = 1;
  }
  if (param_4 != 0) {
    pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
  }
  return uVar8;
}



### FUNC GetTemperature @ 0002ca50

/* CFunctions::GetTemperature(unsigned int, unsigned int, int) */

uint __thiscall CFunctions::GetTemperature(CFunctions *this,uint param_1,uint param_2,int param_3)

{
  bool bVar1;
  ushort uVar2;
  int iVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  undefined4 *puVar7;
  int iVar8;
  int iVar9;
  int iVar10;
  int iVar11;
  undefined4 uVar12;
  int iVar13;
  uint uVar14;
  float extraout_s0;
  
  if (param_3 != 0) {
    pthread_mutex_lock((pthread_mutex_t *)(this + 0xb0));
  }
  if ((*(int *)(this + 0xac) == 0) || (*(uint *)(this + 0x50f0) <= param_1)) {
    uVar12 = 0xe4ae0005;
    if (*(int *)(this + 0xac) != 0) {
      uVar12 = 0xe4ae0001;
    }
    puVar7 = (undefined4 *)__errno();
    *puVar7 = uVar12;
    uVar14 = 0x80000001;
  }
  else {
    iVar10 = 3;
    if (param_2 - 1 < 5) {
      iVar10 = *(int *)(&DAT_0002cb84 + (param_2 - 1) * 4);
    }
    uVar14 = *(uint *)(this + 0x37ec);
    iVar3 = __udivsi3(param_1,uVar14);
    iVar4 = param_1 - iVar3 * uVar14;
    iVar9 = iVar4 + iVar10;
    iVar4 = iVar4 - iVar10;
    iVar8 = 0;
    iVar5 = 0;
    if (iVar4 <= iVar9) {
      iVar6 = iVar10 * ~uVar14 * 2 + param_1 * 2;
      iVar5 = 0;
      iVar8 = 0;
      do {
        if (((-1 < iVar4) && (iVar4 < (int)uVar14)) &&
           (iVar11 = iVar3 - iVar10, iVar13 = iVar6, iVar3 - iVar10 <= iVar3 + iVar10)) {
          do {
            if ((-1 < iVar11) && (iVar11 < *(int *)(this + 0x37f0))) {
              iVar5 = iVar5 + (uint)*(ushort *)(*(int *)(this + 0xb4) + iVar13);
              iVar8 = iVar8 + 1;
            }
            bVar1 = iVar11 < iVar3 + iVar10;
            iVar11 = iVar11 + 1;
            iVar13 = iVar13 + uVar14 * 2;
          } while (bVar1);
        }
        iVar6 = iVar6 + 2;
        bVar1 = iVar4 < iVar9;
        iVar4 = iVar4 + 1;
      } while (bVar1);
    }
    uVar2 = __udivsi3(iVar5,iVar8);
    uVar14 = ReviseTemperature(this,uVar2,param_1);
    if (*(int *)(this + 0x50) != 0) {
      uVar14 = CorrectTemperature((int)this,extraout_s0,uVar14);
    }
  }
  if (param_3 != 0) {
    pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
  }
  return uVar14;
}



### FUNC Temp2Energe @ 0002cbac

/* CFunctions::Temp2Energe(int) const */

int __thiscall CFunctions::Temp2Energe(CFunctions *this,int param_1)

{
  int iVar1;
  int iVar2;
  
  iVar1 = param_1 + 50000;
  iVar2 = 0;
  if (-0xe350 < param_1) {
    iVar2 = 0x111;
    if (param_1 < 0x217cb0) {
      iVar2 = (int)(iVar1 + ((uint)(iVar1 >> 0x1f) >> 0x13)) >> 0xd;
    }
  }
  iVar1 = (*(int *)(T2E + iVar2 * 4 + 4) - *(int *)(T2E + iVar2 * 4)) * (iVar1 + iVar2 * -0x2000);
  return ((int)(iVar1 + ((uint)(iVar1 >> 0x1f) >> 0x13)) >> 0xd) + *(int *)(T2E + iVar2 * 4);
}



### FUNC dTemp2dEnerge @ 0002cc04

/* CFunctions::dTemp2dEnerge(int, int) const */

int __thiscall CFunctions::dTemp2dEnerge(CFunctions *this,int param_1,int param_2)

{
  int iVar1;
  
  iVar1 = 0;
  if (-0xe350 < param_1) {
    iVar1 = 0x111;
    if (param_1 < 0x217cb0) {
      iVar1 = (int)(param_1 + 50000 + ((uint)(param_1 + 50000 >> 0x1f) >> 0x13)) >> 0xd;
    }
  }
  iVar1 = (*(int *)(T2E + iVar1 * 4 + 4) - *(int *)(T2E + iVar1 * 4)) * param_2;
  return (int)(iVar1 + ((uint)(iVar1 >> 0x1f) >> 0x13)) >> 0xd;
}



### FUNC dEnerge2dTemp @ 0002cc54

/* CFunctions::dEnerge2dTemp(int, int) const */

int __thiscall CFunctions::dEnerge2dTemp(CFunctions *this,int param_1,int param_2)

{
  int iVar1;
  
  iVar1 = 0;
  if (-0xe350 < param_1) {
    iVar1 = 0x111;
    if (param_1 < 0x217cb0) {
      iVar1 = (int)(param_1 + 50000 + ((uint)(param_1 + 50000 >> 0x1f) >> 0x13)) >> 0xd;
    }
  }
  return *(int *)(E2TAccQ10 + iVar1 * 4) * param_2 >> 10;
}



### FUNC Energe2Temp @ 0002cc98

/* CFunctions::Energe2Temp(int) const */

int __thiscall CFunctions::Energe2Temp(CFunctions *this,int param_1)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  
  uVar2 = 0x112;
  uVar1 = 0;
  do {
    uVar3 = uVar1 + uVar2 >> 1;
    if (*(int *)(T2E + uVar3 * 4) <= param_1) {
      uVar1 = uVar3;
      uVar3 = uVar2;
    }
    uVar2 = uVar3;
  } while (uVar1 + 1 < uVar2);
  return uVar1 * 0x2000 +
         (*(int *)(E2TAccQ10 + uVar1 * 4) * (param_1 - *(int *)(T2E + uVar1 * 4)) >> 10) + -50000;
}



### FUNC ConvertInnerTemp2mC @ 0002ccfc

/* CFunctions::ConvertInnerTemp2mC(unsigned short) const */

int __thiscall CFunctions::ConvertInnerTemp2mC(CFunctions *this,ushort param_1)

{
  return ((uint)param_1 << (*(uint *)(this + 0x5104) & 0xff)) + *(int *)(this + 0x5100);
}



### FUNC CalibrationMain_RTV @ 0002cd10

/* CFunctions::CalibrationMain_RTV(unsigned short const*) */

void __thiscall CFunctions::CalibrationMain_RTV(CFunctions *this,ushort *param_1)

{
  int iVar1;
  int iVar2;
  undefined2 *puVar3;
  uint uVar4;
  int iVar5;
  short *psVar6;
  int iVar7;
  int iVar8;
  ushort *puVar9;
  int iVar10;
  short *local_18;
  
  local_18 = *(short **)(this + 0x3114);
  puVar9 = (ushort *)0x0;
  if (*(int *)(this + 0x37a0) != 0) {
    puVar9 = *(ushort **)(this + 0x378c);
  }
  iVar7 = *(int *)(this + 0x50f0);
  iVar1 = iVar7 * 2;
  iVar2 = *(int *)(this + 0x2e28);
  if (iVar7 != 0) {
    iVar10 = *(int *)(this + 0x3120);
    puVar3 = *(undefined2 **)(this + 0xb4);
    do {
      iVar8 = (int)((uint)*param_1 - (uint)*puVar9) >> 1;
      puVar9 = puVar9 + 1;
      param_1 = param_1 + 1;
      uVar4 = 0;
      if (iVar2 != 1) {
        uVar4 = 0;
        psVar6 = local_18;
        do {
          if (iVar8 <= *psVar6) break;
          psVar6 = psVar6 + 1;
          uVar4 = uVar4 + 1;
        } while (uVar4 < iVar2 - 1U);
      }
      iVar5 = iVar1 * uVar4 * 2;
      iVar8 = ((int)(iVar8 * (uint)*(ushort *)(iVar10 + iVar5)) >> 0xc) +
              (uint)*(ushort *)(iVar10 + iVar5 + 2);
      if (iVar8 < 1) {
        iVar8 = 0;
      }
      if (0xfffe < iVar8) {
        iVar8 = 0xffff;
      }
      *puVar3 = (short)iVar8;
      local_18 = local_18 + iVar2 + -1;
      iVar7 = iVar7 + -1;
      puVar3 = puVar3 + 1;
      iVar10 = iVar10 + 4;
    } while (iVar7 != 0);
  }
  return;
}



### FUNC BlindCompensation @ 0002cde8

/* CFunctions::BlindCompensation(unsigned short*) */

void __thiscall CFunctions::BlindCompensation(CFunctions *this,ushort *param_1)

{
  ushort uVar1;
  int iVar2;
  uint uVar3;
  undefined4 uVar4;
  uint uVar5;
  int *piVar6;
  
  uVar3 = *(uint *)(this + *(int *)(this + 0x3108) * 4 + 0x2f28);
  if (uVar3 != 0) {
    piVar6 = (int *)(*(int *)(this + 0x3124) + 0x14);
    uVar5 = 0;
    do {
      switch(piVar6[-4]) {
      case 3:
        iVar2 = (uint)param_1[piVar6[-2]] + (uint)param_1[piVar6[-3]] + (uint)param_1[piVar6[-1]];
        uVar4 = 3;
        goto LAB_0002cebc;
      case 4:
        uVar1 = (ushort)((uint)param_1[piVar6[-2]] + (uint)param_1[piVar6[-3]] +
                         (uint)param_1[piVar6[-1]] + (uint)param_1[*piVar6] >> 2);
        break;
      case 5:
        iVar2 = (uint)param_1[piVar6[-2]] + (uint)param_1[piVar6[-3]] + (uint)param_1[piVar6[-1]] +
                (uint)param_1[*piVar6] + (uint)param_1[piVar6[1]];
        uVar4 = 5;
        goto LAB_0002cebc;
      case 6:
        iVar2 = (uint)param_1[piVar6[-2]] + (uint)param_1[piVar6[-3]] + (uint)param_1[piVar6[-1]] +
                (uint)param_1[*piVar6] + (uint)param_1[piVar6[1]] + (uint)param_1[piVar6[2]];
        uVar4 = 6;
LAB_0002cebc:
        uVar1 = __udivsi3(iVar2,uVar4);
        break;
      case 7:
        uVar1 = __divsi3((uint)param_1[piVar6[-2]] + (uint)param_1[piVar6[-3]] +
                         (uint)param_1[piVar6[-1]] + (uint)param_1[*piVar6] +
                         (uint)param_1[piVar6[1]] + (uint)param_1[piVar6[2]] +
                         (uint)param_1[piVar6[3]],7);
        break;
      case 8:
        uVar1 = (ushort)((int)((uint)param_1[piVar6[-2]] + (uint)param_1[piVar6[-3]] +
                               (uint)param_1[piVar6[-1]] + (uint)param_1[*piVar6] +
                               (uint)param_1[piVar6[1]] + (uint)param_1[piVar6[2]] +
                               (uint)param_1[piVar6[3]] + (uint)param_1[piVar6[4]]) >> 3);
        break;
      default:
        goto switchD_0002ce1a_default;
      }
      param_1[piVar6[-5]] = uVar1;
      piVar6 = piVar6 + 10;
      uVar5 = uVar5 + 1;
    } while (uVar5 < uVar3);
  }
switchD_0002ce1a_default:
  return;
}



### FUNC ConvertResponse2Temperature @ 0002cf80

/* CFunctions::ConvertResponse2Temperature(unsigned short const*) */

void __thiscall CFunctions::ConvertResponse2Temperature(CFunctions *this,ushort *param_1)

{
  undefined2 *puVar1;
  ushort *puVar2;
  int iVar3;
  int iVar4;
  int iVar5;
  
  puVar2 = (ushort *)0x0;
  if (*(int *)(this + 0x37a0) != 0) {
    puVar2 = *(ushort **)(this + 0x378c);
  }
  iVar3 = 50000 - *(int *)(this + 0x5100) >> (*(uint *)(this + 0x5104) & 0xff);
  if (iVar3 < 1) {
    iVar3 = 0;
  }
  if (0xfffe < iVar3) {
    iVar3 = 0xffff;
  }
  iVar4 = *(int *)(this + 0x50f0);
  if (iVar4 != 0) {
    puVar1 = *(undefined2 **)(this + 0xb4);
    do {
      iVar5 = ((uint)*param_1 - (uint)*puVar2) * 3 + iVar3;
      if (iVar5 < 1) {
        iVar5 = 0;
      }
      if (0xfffe < iVar5) {
        iVar5 = 0xffff;
      }
      *puVar1 = (short)iVar5;
      iVar4 = iVar4 + -1;
      puVar1 = puVar1 + 1;
      puVar2 = puVar2 + 1;
      param_1 = param_1 + 1;
    } while (iVar4 != 0);
  }
  return;
}



### FUNC GetTemperaturemC @ 0002d00c

/* CFunctions::GetTemperaturemC(int*, unsigned int, int, int) */

undefined4 __thiscall
CFunctions::GetTemperaturemC(CFunctions *this,int *param_1,uint param_2,int param_3,int param_4)

{
  uint uVar1;
  undefined4 *puVar2;
  uint uVar3;
  uint uVar4;
  undefined4 uVar5;
  ushort *puVar6;
  float extraout_s0;
  
  if (param_4 != 0) {
    pthread_mutex_lock((pthread_mutex_t *)(this + 0xb0));
  }
  if ((param_1 == (int *)0x0) || (*(int *)(this + 0xac) == 0)) {
    uVar5 = 0xe4ae0005;
    if (*(int *)(this + 0xac) != 0) {
      uVar5 = 0xe4ae0001;
    }
    puVar2 = (undefined4 *)__errno();
    *puVar2 = uVar5;
    uVar5 = 0;
  }
  else {
    uVar3 = *(uint *)(this + 0x50f0);
    if (param_2 >> 2 <= *(uint *)(this + 0x50f0)) {
      uVar3 = param_2 >> 2;
    }
    if (uVar3 != 0) {
      puVar6 = *(ushort **)(this + 0xb4);
      uVar4 = 0;
      do {
        uVar1 = ReviseTemperature(this,*puVar6,uVar4);
        puVar6 = puVar6 + 1;
        if (param_3 != 0) {
          uVar1 = CorrectTemperature((int)this,extraout_s0,uVar1);
        }
        param_1[uVar4] = uVar1;
        uVar4 = uVar4 + 1;
      } while (uVar4 < uVar3);
    }
    uVar5 = 1;
  }
  if (param_4 != 0) {
    pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
  }
  return uVar5;
}



### FUNC GetCenterTemperatureSharpness @ 0002d0c0

/* CFunctions::GetCenterTemperatureSharpness(unsigned int, unsigned int) */

uint __thiscall
CFunctions::GetCenterTemperatureSharpness(CFunctions *this,uint param_1,uint param_2)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  uint uVar6;
  int iVar7;
  int iVar8;
  uint uVar9;
  int iVar10;
  uint uVar11;
  int iVar12;
  uint uVar13;
  int iVar14;
  pthread_mutex_t *__mutex;
  uint uVar15;
  int iVar16;
  uint uVar17;
  int iVar18;
  int local_1c;
  
  uVar6 = 0x10;
  if ((0xf < param_1) &&
     (uVar6 = *(uint *)(this + 0x37ec) >> 1, param_1 <= *(uint *)(this + 0x37ec) >> 1)) {
    uVar6 = param_1;
  }
  uVar1 = *(uint *)(this + 0x37f0);
  uVar15 = 9;
  if ((8 < param_2) && (uVar15 = uVar1 >> 1, param_2 <= uVar1 >> 1)) {
    uVar15 = param_2;
  }
  iVar8 = *(int *)(this + 0x37ec);
  __mutex = (pthread_mutex_t *)(this + 0xb0);
  pthread_mutex_lock(__mutex);
  uVar9 = uVar1 + uVar15 >> 1;
  uVar5 = iVar8 + uVar6 >> 1;
  uVar6 = iVar8 - uVar6 >> 1;
  if ((*(int *)(this + 0xac) == 0) || (uVar15 = uVar1 - uVar15 >> 1, uVar9 <= uVar15)) {
    pthread_mutex_unlock(__mutex);
    uVar1 = 0;
  }
  else {
    iVar10 = *(int *)(this + 0xb4);
    iVar12 = *(int *)(this + 0x37ec);
    iVar8 = uVar6 * 2 + iVar12 * (uVar15 * 2 + 2);
    iVar7 = uVar6 * 2 + iVar12 * (uVar15 - 1) * 2;
    uVar1 = 0;
    local_1c = 0;
    do {
      iVar4 = uVar6 - uVar5;
      iVar14 = iVar10;
      if (uVar5 != uVar6) {
        do {
          uVar13 = (uint)*(ushort *)(iVar14 + -2 + iVar7);
          uVar2 = (uint)*(ushort *)(iVar14 + iVar7 + 2);
          iVar16 = uVar13 - uVar2;
          uVar17 = iVar16 >> 0x1f;
          uVar11 = (uint)*(ushort *)(iVar14 + -2 + iVar8);
          iVar18 = uVar13 - uVar11;
          uVar3 = iVar18 >> 0x1f;
          local_1c = ((iVar18 + uVar3 ^ uVar3) + (iVar16 + uVar17 ^ uVar17) >> 1) + local_1c;
          uVar1 = (uVar2 + uVar13 + uVar11 + (uint)*(ushort *)(iVar14 + iVar8 + 2) >> 2) + uVar1;
          iVar4 = iVar4 + 1;
          iVar14 = iVar14 + 2;
        } while (iVar4 != 0);
      }
      iVar10 = iVar10 + iVar12 * 2;
      uVar15 = uVar15 + 1;
    } while (uVar15 != uVar9);
    pthread_mutex_unlock(__mutex);
    if (uVar1 >> 0x10 != 0) {
      uVar1 = __udivsi3(local_1c);
    }
  }
  return uVar1;
}



### FUNC CalcSD @ 0002d210

/* CFunctions::CalcSD(int, int) */

undefined4 __thiscall CFunctions::CalcSD(CFunctions *this,int param_1,int param_2)

{
  longlong lVar1;
  pthread_mutex_t *__mutex;
  int iVar2;
  ushort *puVar3;
  undefined4 uVar4;
  int iVar5;
  int iVar6;
  uint uVar7;
  uint uVar8;
  uint uVar9;
  int iVar10;
  uint uVar11;
  uint uVar12;
  uint uVar13;
  bool bVar14;
  longlong lVar15;
  undefined8 uVar16;
  undefined8 uVar17;
  undefined4 in_stack_ffffffb0;
  uint local_2c;
  
  uVar11 = 0x10;
  if ((0xf < param_1) &&
     (uVar11 = *(uint *)(this + 0x37ec), (uint)param_1 <= *(uint *)(this + 0x37ec))) {
    uVar11 = param_1;
  }
  iVar5 = *(int *)(this + 0x37ec);
  uVar9 = *(uint *)(this + 0x37f0);
  __mutex = (pthread_mutex_t *)(this + 0xb0);
  pthread_mutex_lock(__mutex);
  uVar7 = uVar9;
  if ((uint)param_2 <= uVar9) {
    uVar7 = param_2;
  }
  uVar12 = 9;
  if (8 < param_2) {
    uVar12 = uVar7;
  }
  uVar8 = uVar9 + uVar12 >> 1;
  uVar9 = uVar9 - uVar12 >> 1;
  uVar7 = iVar5 + uVar11 >> 1;
  uVar11 = iVar5 - uVar11 >> 1;
  if (*(int *)(this + 0xac) == 0) {
    pthread_mutex_unlock(__mutex);
    uVar4 = 0;
  }
  else {
    uVar12 = 0;
    iVar5 = 0;
    lVar1 = 0;
    if (uVar9 < uVar8) {
      iVar6 = *(int *)(this + 0xb4);
      iVar2 = *(int *)(this + 0x37ec);
      lVar1 = 0;
      uVar12 = 0;
      iVar5 = 0;
      local_2c = uVar9;
      do {
        if (uVar11 < uVar7) {
          puVar3 = (ushort *)(iVar6 + iVar2 * local_2c * 2 + uVar11 * 2);
          iVar10 = uVar7 - uVar11;
          do {
            uVar13 = (uint)*puVar3;
            lVar15 = __muldi3(uVar13,0,uVar13,0);
            lVar1 = lVar15 + lVar1;
            bVar14 = CARRY4(uVar12,uVar13);
            uVar12 = uVar12 + uVar13;
            iVar5 = iVar5 + (uint)bVar14;
            iVar10 = iVar10 + -1;
            puVar3 = puVar3 + 1;
          } while (iVar10 != 0);
        }
        local_2c = local_2c + 1;
      } while (local_2c != uVar8);
    }
    pthread_mutex_unlock(__mutex);
    iVar2 = (uVar8 - uVar9) * (uVar7 - uVar11);
    uVar16 = __floatdidf(uVar12,iVar5);
    uVar4 = (undefined4)((ulonglong)uVar16 >> 0x20);
    uVar16 = __muldf3((int)uVar16,uVar4,(int)uVar16,uVar4);
    uVar17 = __floatunsidf(iVar2);
    uVar16 = __divdf3((int)uVar16,(int)((ulonglong)uVar16 >> 0x20),(int)uVar17,
                      (int)((ulonglong)uVar17 >> 0x20));
    uVar17 = __floatdidf((int)lVar1,(int)((ulonglong)lVar1 >> 0x20));
    uVar16 = __subdf3((int)uVar17,(int)((ulonglong)uVar17 >> 0x20),(int)uVar16,
                      (int)((ulonglong)uVar16 >> 0x20));
    uVar17 = __floatunsidf(iVar2 + -1);
    __divdf3((int)uVar16,(int)((ulonglong)uVar16 >> 0x20),(int)uVar17,
             (int)((ulonglong)uVar17 >> 0x20));
    sqrt((double)CONCAT44(__mutex,in_stack_ffffffb0));
    uVar4 = __fixdfsi();
  }
  return uVar4;
}



### FUNC LocalMap7x7 @ 0002d390

/* CFunctions::LocalMap7x7(int*, unsigned short const*, unsigned int) */

void __thiscall CFunctions::LocalMap7x7(CFunctions *this,int *param_1,ushort *param_2,uint param_3)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  uint uVar8;
  uint uVar9;
  uint uVar10;
  int iVar11;
  int local_20;
  uint local_1c;
  ushort *local_18;
  
  uVar5 = (uint)param_2[1];
  uVar8 = (uint)*param_2;
  local_1c = 0;
  local_20 = -3;
  uVar2 = uVar8;
  uVar4 = uVar8;
  local_18 = param_2;
  while( true ) {
    uVar7 = uVar2;
    if (uVar4 <= uVar2) {
      uVar7 = uVar4;
    }
    if (uVar2 <= uVar5) {
      uVar4 = uVar7;
    }
    uVar10 = (uint)local_18[2];
    uVar7 = uVar10;
    if (uVar4 <= uVar10) {
      uVar7 = uVar4;
    }
    uVar3 = uVar2;
    if (uVar2 <= uVar5) {
      uVar3 = uVar5;
    }
    if (uVar10 <= uVar3) {
      uVar4 = uVar7;
    }
    uVar7 = (uint)local_18[4];
    uVar5 = uVar7;
    if (uVar4 <= uVar7) {
      uVar5 = uVar4;
    }
    uVar6 = uVar10;
    if (uVar10 <= uVar3) {
      uVar6 = uVar3;
    }
    if (uVar7 <= uVar6) {
      uVar4 = uVar5;
    }
    uVar3 = (uint)local_18[6];
    uVar5 = uVar3;
    if (uVar4 <= uVar3) {
      uVar5 = uVar4;
    }
    uVar9 = uVar7;
    if (uVar7 <= uVar6) {
      uVar9 = uVar6;
    }
    if (uVar3 <= uVar9) {
      uVar4 = uVar5;
    }
    local_18 = local_18 + *(int *)(this + 0x37ec) * 2;
    uVar5 = uVar3;
    if (uVar3 <= uVar9) {
      uVar5 = uVar9;
    }
    local_1c = local_1c + uVar2 + uVar10 + uVar7 + uVar3;
    if (local_20 == 0) break;
    local_20 = local_20 + 1;
    uVar2 = (uint)*local_18;
  }
  iVar11 = -3;
  if (param_3 <= (uVar5 - uVar4) * 0x20) {
    local_1c = local_1c >> 4;
    uVar2 = uVar5 - local_1c;
    if (uVar5 - local_1c <= param_3) {
      uVar2 = param_3;
    }
    uVar5 = local_1c - uVar4;
    if (local_1c - uVar4 <= uVar2) {
      uVar5 = uVar2;
    }
    iVar1 = __udivsi3(0x8000,uVar5);
    while( true ) {
      *param_1 = iVar1 * (uVar8 - local_1c) + *param_1;
      param_1[2] = iVar1 * (param_2[2] - local_1c) + param_1[2];
      param_1[4] = iVar1 * (param_2[4] - local_1c) + param_1[4];
      param_1[6] = iVar1 * (param_2[6] - local_1c) + param_1[6];
      param_2 = param_2 + *(int *)(this + 0x37ec) * 2;
      if (iVar11 == 0) break;
      param_1 = param_1 + *(int *)(this + 0x37ec) * 2;
      iVar11 = iVar11 + 1;
      uVar8 = (uint)*param_2;
    }
  }
  return;
}



### FUNC LocalMap7x7_Simple @ 0002d4e8

/* CFunctions::LocalMap7x7_Simple(int*, unsigned short const*, unsigned int) */

void __thiscall
CFunctions::LocalMap7x7_Simple(CFunctions *this,int *param_1,ushort *param_2,uint param_3)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  ushort *puVar4;
  uint uVar5;
  int iVar6;
  uint uVar7;
  uint uVar8;
  uint uVar9;
  uint uVar10;
  uint uVar11;
  uint uVar12;
  int local_20;
  
  iVar1 = *(int *)(this + 0x37ec);
  local_20 = -3;
  uVar11 = (uint)param_2[1];
  uVar2 = (uint)*param_2;
  uVar8 = 0;
  puVar4 = param_2;
  uVar10 = uVar2;
  while( true ) {
    uVar12 = uVar2;
    if (uVar10 <= uVar2) {
      uVar12 = uVar10;
    }
    if (uVar2 <= uVar11) {
      uVar10 = uVar12;
    }
    uVar9 = (uint)puVar4[2];
    uVar12 = uVar9;
    if (uVar10 <= uVar9) {
      uVar12 = uVar10;
    }
    uVar3 = uVar2;
    if (uVar2 <= uVar11) {
      uVar3 = uVar11;
    }
    if (uVar9 <= uVar3) {
      uVar10 = uVar12;
    }
    uVar12 = (uint)puVar4[4];
    uVar11 = uVar12;
    if (uVar10 <= uVar12) {
      uVar11 = uVar10;
    }
    uVar7 = uVar9;
    if (uVar9 <= uVar3) {
      uVar7 = uVar3;
    }
    if (uVar12 <= uVar7) {
      uVar10 = uVar11;
    }
    uVar3 = (uint)puVar4[6];
    uVar11 = uVar3;
    if (uVar10 <= uVar3) {
      uVar11 = uVar10;
    }
    uVar5 = uVar12;
    if (uVar12 <= uVar7) {
      uVar5 = uVar7;
    }
    if (uVar3 <= uVar5) {
      uVar10 = uVar11;
    }
    puVar4 = puVar4 + iVar1 * 2;
    uVar11 = uVar3;
    if (uVar3 <= uVar5) {
      uVar11 = uVar5;
    }
    uVar8 = uVar8 + uVar2 + uVar9 + uVar12 + uVar3;
    if (local_20 == 0) break;
    local_20 = local_20 + 1;
    uVar2 = (uint)*puVar4;
  }
  iVar6 = 0;
  if (param_3 <= (uVar11 - uVar10) * 0x20) {
    uVar8 = uVar8 >> 4;
    uVar2 = uVar11 - uVar8;
    if (uVar11 - uVar8 <= param_3) {
      uVar2 = param_3;
    }
    uVar11 = uVar8 - uVar10;
    if (uVar8 - uVar10 <= uVar2) {
      uVar11 = uVar2;
    }
    iVar6 = __udivsi3(0x8000,uVar11);
    iVar6 = iVar6 * (param_2[iVar1 * 3 + 3] - uVar8);
  }
  *param_1 = iVar6;
  return;
}



### FUNC SetEX @ 0002d5fc

/* CFunctions::SetEX(EX, int, int) */

void __thiscall CFunctions::SetEX(CFunctions *this,uint param_2,int param_3,int param_4)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  
  pthread_mutex_lock((pthread_mutex_t *)(this + 0xb0));
  if (param_2 - 1 < 4) {
    *(uint *)(this + 0x3814) = param_2;
    uVar2 = *(uint *)(this + 0x37f0);
    uVar1 = (uVar2 - (uVar2 >> (param_2 & 0xff))) - 1;
    uVar2 = param_4 - (uVar2 >> (param_2 + 1 & 0xff));
    if ((int)uVar2 < 1) {
      uVar2 = 0;
    }
    if (uVar2 <= uVar1) {
      uVar1 = uVar2;
    }
    uVar3 = *(uint *)(this + 0x37ec);
    uVar2 = (uVar3 - (uVar3 >> (param_2 & 0xff))) - 2;
    uVar3 = param_3 - (uVar3 >> (param_2 + 1 & 0xff));
    if ((int)uVar3 < 1) {
      uVar3 = 0;
    }
    if (uVar3 <= uVar2) {
      uVar2 = uVar3;
    }
    uVar2 = uVar2 & 0xfffffffe;
  }
  else {
    uVar2 = 0;
    *(undefined4 *)(this + 0x3814) = 0;
    uVar1 = 0;
  }
  *(uint *)(this + 0x381c) = uVar1;
  *(uint *)(this + 0x3818) = uVar2;
  pthread_mutex_unlock((pthread_mutex_t *)(this + 0xb0));
  return;
}



### FUNC GetEX @ 0002d698

/* CFunctions::GetEX() */

undefined4 __thiscall CFunctions::GetEX(CFunctions *this)

{
  return *(undefined4 *)(this + 0x3814);
}



### FUNC _M_put_nowiden @ 0002d6a4

/* std::ostream::_M_put_nowiden(char const*) */

void __thiscall std::ostream::_M_put_nowiden(ostream *this,char *param_1)

{
  size_t sVar1;
  int iVar2;
  int iVar3;
  int *piVar4;
  size_t sVar5;
  uint uVar6;
  ostream *local_20;
  undefined1 local_1c;
  int local_18;
  
  local_18 = __stack_chk_guard;
  local_20 = this;
  local_1c = priv::__init_bostr<char,std::char_traits<char>>(this);
  if (!(bool)local_1c) goto LAB_0002d7b4;
  sVar1 = strlen(param_1);
  iVar2 = *(int *)(*(int *)this + -0xc);
  if (((int)sVar1 < *(int *)(this + iVar2 + 0x1c)) &&
     (iVar3 = *(int *)(this + iVar2 + 0x1c) - sVar1, iVar3 != 0)) {
    piVar4 = *(int **)(this + iVar2 + 0x48);
    if ((*(uint *)(this + iVar2 + 4) & 7) == 1) {
      sVar5 = (**(code **)(*piVar4 + 0x2c))(piVar4,param_1,sVar1);
      if (sVar5 == sVar1) {
        iVar2 = (**(code **)(**(int **)(this + *(int *)(*(int *)this + -0xc) + 0x48) + 0x30))
                          (*(int **)(this + *(int *)(*(int *)this + -0xc) + 0x48),
                           this[*(int *)(*(int *)this + -0xc) + 0x44],iVar3);
        *(undefined4 *)(this + *(int *)(*(int *)this + -0xc) + 0x1c) = 0;
        if (iVar2 == iVar3) goto LAB_0002d7b4;
        goto LAB_0002d792;
      }
    }
    else {
      iVar2 = (**(code **)(*piVar4 + 0x30))
                        (piVar4,this[iVar2 + 0x44],iVar3,*(code **)(*piVar4 + 0x30),iVar3,1,1);
      if (iVar2 == iVar3) {
        sVar5 = (**(code **)(**(int **)(this + *(int *)(*(int *)this + -0xc) + 0x48) + 0x2c))
                          (*(int **)(this + *(int *)(*(int *)this + -0xc) + 0x48),param_1,sVar1);
        goto LAB_0002d746;
      }
    }
    *(undefined4 *)(this + *(int *)(*(int *)this + -0xc) + 0x1c) = 0;
  }
  else {
    sVar5 = (**(code **)(**(int **)(this + iVar2 + 0x48) + 0x2c))
                      (*(int **)(this + iVar2 + 0x48),param_1,sVar1);
LAB_0002d746:
    *(undefined4 *)(this + *(int *)(*(int *)this + -0xc) + 0x1c) = 0;
    if (sVar5 == sVar1) goto LAB_0002d7b4;
  }
LAB_0002d792:
  iVar2 = *(int *)(*(int *)this + -0xc);
  uVar6 = *(uint *)(this + iVar2 + 8) | (uint)(*(int *)(this + iVar2 + 0x48) == 0) | 4;
  *(uint *)(this + iVar2 + 8) = uVar6;
  if ((uVar6 & *(uint *)(this + iVar2 + 0x14)) != 0) {
                    /* WARNING: Subroutine does not return */
    ios_base::_M_throw_failure();
  }
LAB_0002d7b4:
  sentry::~sentry((sentry *)&local_20);
  if (__stack_chk_guard == local_18) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC ~sentry @ 0002d824

/* std::ostream::sentry::~sentry() */

sentry * __thiscall std::ostream::sentry::~sentry(sentry *this)

{
  int iVar1;
  
  if (((int)((uint)*(byte *)((int)*(int **)this + *(int *)(**(int **)this + -0xc) + 5) << 0x1a) < 0)
     && (iVar1 = FUN_00030e64(), iVar1 == 0)) {
    flush(*(ostream **)this);
  }
  return this;
}



### FUNC __init_bostr<char,std::char_traits<char>> @ 0002d84e

/* bool std::priv::__init_bostr<char, std::char_traits<char> >(std::ostream&) */

bool std::priv::__init_bostr<char,std::char_traits<char>>(ostream *param_1)

{
  bool bVar1;
  int iVar2;
  
  iVar2 = *(int *)(*(int *)param_1 + -0xc);
  bVar1 = false;
  if (*(int *)(param_1 + iVar2 + 8) == 0) {
    if (*(int *)(param_1 + iVar2 + 0x48) == 0) {
      *(undefined4 *)(param_1 + iVar2 + 8) = 1;
      if (((byte)param_1[iVar2 + 0x14] & 1) != 0) {
                    /* WARNING: Subroutine does not return */
        ios_base::_M_throw_failure();
      }
      iVar2 = *(int *)(*(int *)param_1 + -0xc);
    }
    if (*(ostream **)(param_1 + iVar2 + 0x4c) != (ostream *)0x0) {
      ostream::flush(*(ostream **)(param_1 + iVar2 + 0x4c));
      iVar2 = *(int *)(*(int *)param_1 + -0xc);
    }
    bVar1 = true;
    if (*(int *)(param_1 + iVar2 + 8) != 0) {
      bVar1 = false;
    }
  }
  return bVar1;
}



### FUNC flush @ 0002d8a0

/* std::ostream::flush() */

ostream * __thiscall std::ostream::flush(ostream *this)

{
  int iVar1;
  uint uVar2;
  
  if ((*(int **)(this + *(int *)(*(int *)this + -0xc) + 0x48) != (int *)0x0) &&
     (iVar1 = (**(code **)(**(int **)(this + *(int *)(*(int *)this + -0xc) + 0x48) + 0x14))(),
     iVar1 == -1)) {
    iVar1 = *(int *)(*(int *)this + -0xc);
    uVar2 = *(uint *)(this + iVar1 + 8);
    *(uint *)(this + iVar1 + 8) = uVar2 | 1;
    if ((*(uint *)(this + iVar1 + 0x14) & (uVar2 | 1)) != 0) {
                    /* WARNING: Subroutine does not return */
      ios_base::_M_throw_failure();
    }
  }
  return this;
}



### FUNC put @ 0002d8dc

/* std::ostream::put(char) */

ostream * __thiscall std::ostream::put(ostream *this,char param_1)

{
  int *piVar1;
  int iVar2;
  char *pcVar3;
  uint uVar4;
  ostream *local_20;
  undefined1 local_1c;
  int local_18;
  
  local_18 = __stack_chk_guard;
  local_20 = this;
  local_1c = priv::__init_bostr<char,std::char_traits<char>>(this);
  if ((bool)local_1c) {
    piVar1 = *(int **)(this + *(int *)(*(int *)this + -0xc) + 0x48);
    pcVar3 = (char *)piVar1[5];
    if (pcVar3 < (char *)piVar1[6]) {
      piVar1[5] = (int)(pcVar3 + 1);
      *pcVar3 = param_1;
      goto LAB_0002d93e;
    }
    iVar2 = (**(code **)(*piVar1 + 0x34))(piVar1,(int)param_1);
    if (iVar2 != -1) goto LAB_0002d93e;
  }
  iVar2 = *(int *)(*(int *)this + -0xc);
  uVar4 = *(uint *)(this + iVar2 + 8);
  *(uint *)(this + iVar2 + 8) = uVar4 | 1;
  if ((*(uint *)(this + iVar2 + 0x14) & (uVar4 | 1)) != 0) {
                    /* WARNING: Subroutine does not return */
    ios_base::_M_throw_failure();
  }
LAB_0002d93e:
  sentry::~sentry((sentry *)&local_20);
  if (__stack_chk_guard == local_18) {
    return this;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC wait @ 0002d9a4

/* Condition::wait() */

void __thiscall Condition::wait(Condition *this)

{
  pthread_mutex_lock((pthread_mutex_t *)this);
  while (this[8] == (Condition)0x0) {
    pthread_cond_wait((pthread_cond_t *)(this + 4),(pthread_mutex_t *)this);
  }
  this[8] = (Condition)0x0;
  pthread_mutex_unlock((pthread_mutex_t *)this);
  return;
}



### FUNC waitForMsecs @ 0002d9e0

/* Condition::waitForMsecs(int) */

undefined4 __thiscall Condition::waitForMsecs(Condition *this,int param_1)

{
  int extraout_r1;
  int iVar1;
  undefined4 uVar2;
  undefined8 uVar3;
  undefined4 local_2c;
  timespec local_28;
  timeval local_20;
  int local_18;
  
  local_18 = __stack_chk_guard;
  local_2c = 0;
  gettimeofday(&local_20,(__timezone_ptr_t)0x0);
  uVar3 = __aeabi_idivmod(param_1,1000);
  iVar1 = local_20.tv_sec + (int)uVar3;
  local_28.tv_nsec = local_20.tv_usec * 1000 + (int)((ulonglong)uVar3 >> 0x20) * 1000000;
  local_28.tv_sec = iVar1;
  if (1000000000 < local_28.tv_nsec) {
    __aeabi_uidivmod(local_28.tv_nsec,1000000000);
    local_28.tv_sec = iVar1 + 1;
    local_28.tv_nsec = extraout_r1;
  }
  pthread_mutex_lock((pthread_mutex_t *)this);
  do {
    if (this[8] != (Condition)0x0) {
      this[8] = (Condition)0x0;
      uVar2 = local_2c;
      break;
    }
    iVar1 = pthread_cond_timedwait((pthread_cond_t *)(this + 4),(pthread_mutex_t *)this,&local_28);
    uVar2 = 1;
  } while (iVar1 != 0x6e);
  pthread_mutex_unlock((pthread_mutex_t *)this);
  if (__stack_chk_guard != local_18) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return uVar2;
}



### FUNC MStream @ 0002da98

/* MStream::MStream(unsigned int) */

MStream * __thiscall MStream::MStream(MStream *this,uint param_1)

{
  void *pvVar1;
  undefined4 *puVar2;
  
  *(uint *)this = param_1;
  *(undefined4 *)(this + 4) = 0;
  *(undefined4 *)(this + 8) = 0;
  if (param_1 != 0) {
    pvVar1 = operator_new__(param_1);
    *(void **)(this + 4) = pvVar1;
    *(void **)(this + 8) = pvVar1;
    return this;
  }
  puVar2 = (undefined4 *)FUN_00030824(4);
  *puVar2 = "ParamError: Invalid array size.[MStream::MStream]";
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(puVar2,&Error::typeinfo,0);
}



### FUNC MStream @ 0002db08

/* MStream::MStream(char const*, unsigned int) */

MStream * __thiscall MStream::MStream(MStream *this,char *param_1,uint param_2)

{
  size_t sVar1;
  uint uVar2;
  void *pvVar3;
  
  if (param_2 == 0) {
    sVar1 = strlen(param_1);
    param_2 = sVar1 + 1;
  }
  uVar2 = param_2 + 1;
  *(uint *)this = uVar2;
  pvVar3 = operator_new__(uVar2);
  *(void **)(this + 4) = pvVar3;
  __aeabi_memcpy(pvVar3,param_1,param_2);
  *(undefined1 *)((int)pvVar3 + param_2) = 0;
  *(uint *)(this + 8) = (int)pvVar3 + uVar2;
  return this;
}



### FUNC MStream @ 0002db48

/* MStream::MStream(std::string const&) */

MStream * __thiscall MStream::MStream(MStream *this,string *param_1)

{
  uint uVar1;
  void *pvVar2;
  int iVar3;
  int iVar4;
  
  iVar3 = *(int *)(param_1 + 0x14);
  iVar4 = *(int *)(param_1 + 0x10) - iVar3;
  uVar1 = iVar4 + 1;
  *(uint *)this = uVar1;
  pvVar2 = operator_new__(uVar1);
  *(void **)(this + 4) = pvVar2;
  __aeabi_memcpy(pvVar2,iVar3,iVar4);
  *(undefined1 *)((int)pvVar2 + iVar4) = 0;
  *(uint *)(this + 8) = (int)pvVar2 + uVar1;
  return this;
}



### FUNC MStream @ 0002db7e

/* MStream::MStream(MStream const&) */

void __thiscall MStream::MStream(MStream *this,MStream *param_1)

{
  *(undefined4 *)this = *(undefined4 *)param_1;
  *(undefined4 *)(this + 4) = *(undefined4 *)(param_1 + 4);
  *(undefined4 *)(this + 8) = *(undefined4 *)(param_1 + 8);
  return;
}



### FUNC operator= @ 0002db8c

/* MStream::TEMPNAMEPLACEHOLDERVALUE(MStream const&) */

void __thiscall MStream::operator=(MStream *this,MStream *param_1)

{
  void *pvVar1;
  
  *(undefined4 *)this = *(undefined4 *)param_1;
  pvVar1 = (void *)0x0;
  if (*(void **)(this + 4) != (void *)0x0) {
    operator_delete__(*(void **)(this + 4));
    pvVar1 = operator_new__(*(uint *)this);
    *(void **)(this + 4) = pvVar1;
  }
  *(void **)(this + 8) = pvVar1;
  return;
}



### FUNC ~MStream @ 0002dbb0

/* MStream::~MStream() */

MStream * __thiscall MStream::~MStream(MStream *this)

{
  if (*(void **)(this + 4) != (void *)0x0) {
    operator_delete__(*(void **)(this + 4));
  }
  return this;
}



### FUNC Split @ 0002dbc4

/* MStream::Split(char) */

void MStream::Split(char param_1)

{
  vector<MStream,std::allocator<MStream>> *this;
  byte *pbVar1;
  int in_r1;
  uint in_r2;
  byte *pbVar2;
  byte *pbVar3;
  MStream aMStack_30 [4];
  void *local_2c;
  MStream aMStack_24 [4];
  void *local_20;
  int local_18;
  
  this = (vector<MStream,std::allocator<MStream>> *)(int)param_1;
  local_18 = __stack_chk_guard;
  *(undefined4 *)this = 0;
  *(undefined4 *)(this + 4) = 0;
  *(undefined4 *)(this + 8) = 0;
  pbVar2 = *(byte **)(in_r1 + 4);
  pbVar1 = *(byte **)(in_r1 + 8);
  pbVar3 = pbVar2;
  while (pbVar2 < pbVar1) {
    if (*pbVar2 == in_r2) {
      MStream(aMStack_24,(char *)pbVar3,(int)pbVar2 - (int)pbVar3);
      std::vector<MStream,std::allocator<MStream>>::push_back(this,aMStack_24);
      if (local_20 != (void *)0x0) {
        operator_delete__(local_20);
      }
      pbVar1 = *(byte **)(in_r1 + 8);
      pbVar2 = pbVar2 + 1;
      pbVar3 = pbVar2;
    }
    else {
      pbVar2 = pbVar2 + 1;
    }
  }
  if (1 < (int)pbVar2 - (int)pbVar3) {
    MStream(aMStack_30,(char *)pbVar3,(int)pbVar2 - (int)pbVar3);
    std::vector<MStream,std::allocator<MStream>>::push_back(this,aMStack_30);
    if (local_2c != (void *)0x0) {
      operator_delete__(local_2c);
    }
  }
  if (__stack_chk_guard != local_18) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return;
}



### FUNC push_back @ 0002dc7c

/* std::vector<MStream, std::allocator<MStream> >::push_back(MStream const&) */

void __thiscall
std::vector<MStream,std::allocator<MStream>>::push_back
          (vector<MStream,std::allocator<MStream>> *this,MStream *param_1)

{
  MStream *pMVar1;
  __false_type a_Stack_18 [4];
  int local_14;
  
  local_14 = __stack_chk_guard;
  pMVar1 = *(MStream **)(this + 4);
  if (pMVar1 == *(MStream **)(this + 8)) {
    _M_insert_overflow_aux(this,pMVar1,param_1,a_Stack_18,1,true);
  }
  else {
    *(undefined4 *)pMVar1 = *(undefined4 *)param_1;
    *(undefined4 *)(pMVar1 + 4) = *(undefined4 *)(param_1 + 4);
    *(undefined4 *)(pMVar1 + 8) = *(undefined4 *)(param_1 + 8);
    *(MStream **)(this + 4) = pMVar1 + 0xc;
  }
  if (__stack_chk_guard == local_14) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC ~vector @ 0002dcd8

/* std::vector<MStream, std::allocator<MStream> >::~vector() */

void __thiscall
std::vector<MStream,std::allocator<MStream>>::~vector(vector<MStream,std::allocator<MStream>> *this)

{
  int iVar1;
  int iVar2;
  
  iVar1 = *(int *)this;
  for (iVar2 = *(int *)(this + 4); iVar1 != iVar2; iVar2 = iVar2 + -0xc) {
    if (*(void **)(iVar2 + -8) != (void *)0x0) {
      operator_delete__(*(void **)(iVar2 + -8));
    }
  }
  priv::_Vector_base<MStream,std::allocator<MStream>>::~_Vector_base
            ((_Vector_base<MStream,std::allocator<MStream>> *)this);
  return;
}



### FUNC Split @ 0002dd10

/* MStream::Split(char const*) */

void MStream::Split(char *param_1)

{
  size_t sVar1;
  int in_r1;
  char *pcVar2;
  char *in_r2;
  uint uVar3;
  char *pcVar4;
  char *pcVar5;
  MStream aMStack_30 [4];
  void *local_2c;
  MStream aMStack_24 [4];
  void *local_20;
  int local_18;
  
  local_18 = __stack_chk_guard;
  sVar1 = strlen(in_r2);
  if (sVar1 == 2) {
    param_1[0] = '\0';
    param_1[1] = '\0';
    param_1[2] = '\0';
    param_1[3] = '\0';
    param_1[4] = '\0';
    param_1[5] = '\0';
    param_1[6] = '\0';
    param_1[7] = '\0';
    param_1[8] = '\0';
    param_1[9] = '\0';
    param_1[10] = '\0';
    param_1[0xb] = '\0';
    pcVar4 = *(char **)(in_r1 + 4);
    pcVar5 = (char *)(*(int *)(in_r1 + 8) + -1);
    while (pcVar4 < pcVar5) {
      pcVar2 = pcVar4;
      while ((*in_r2 != *pcVar2 || (in_r2[1] != pcVar2[1]))) {
        pcVar2 = pcVar2 + 1;
        if (pcVar5 <= pcVar2) goto LAB_0002ddb4;
      }
      MStream(aMStack_24,pcVar4,(int)pcVar2 - (int)pcVar4);
      std::vector<MStream,std::allocator<MStream>>::push_back
                ((vector<MStream,std::allocator<MStream>> *)param_1,aMStack_24);
      pcVar4 = pcVar2 + 2;
      if (local_20 != (void *)0x0) {
        operator_delete__(local_20);
      }
    }
LAB_0002ddb4:
    uVar3 = *(int *)(in_r1 + 8) - (int)pcVar4;
    if (1 < (int)uVar3) {
      MStream(aMStack_30,pcVar4,uVar3);
      std::vector<MStream,std::allocator<MStream>>::push_back
                ((vector<MStream,std::allocator<MStream>> *)param_1,aMStack_30);
      if (local_2c != (void *)0x0) {
        operator_delete__(local_2c);
      }
    }
  }
  else if (sVar1 == 1) {
    Split((char)param_1);
  }
  else {
    param_1[0] = '\0';
    param_1[1] = '\0';
    param_1[2] = '\0';
    param_1[3] = '\0';
    param_1[4] = '\0';
    param_1[5] = '\0';
    param_1[6] = '\0';
    param_1[7] = '\0';
    param_1[8] = '\0';
    param_1[9] = '\0';
    param_1[10] = '\0';
    param_1[0xb] = '\0';
  }
  if (__stack_chk_guard != local_18) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return;
}



### FUNC hex2str @ 0002de2c

/* hex2str(unsigned long, char*) */

int hex2str(ulong param_1,char *param_2)

{
  char cVar1;
  char *pcVar2;
  uint uVar3;
  uint uVar4;
  int iVar5;
  char *pcVar6;
  char *pcVar7;
  bool bVar8;
  
  uVar3 = 0;
  do {
    param_2[uVar3] = "FEDCBA9876543210123456789ABCDEF"[(param_1 & 0xf) + 0xf];
    uVar3 = uVar3 + 1;
    param_1 = param_1 >> 4;
  } while (param_1 != 0);
  pcVar2 = param_2 + uVar3;
  pcVar7 = pcVar2 + 1;
  if (uVar3 < 8) {
    iVar5 = 0;
    do {
      param_2[uVar3 - iVar5] = '0';
      uVar4 = iVar5 + 7;
      iVar5 = iVar5 + -1;
    } while (uVar4 != uVar3);
    pcVar7 = pcVar2 + -uVar3 + 9;
    pcVar2 = pcVar2 + -uVar3 + 8;
  }
  *pcVar2 = 'x';
  *pcVar7 = '0';
  if (param_2 < pcVar2 + 2) {
    pcVar7 = pcVar2 + 1;
    pcVar6 = param_2;
    do {
      cVar1 = *pcVar6;
      *pcVar6 = *pcVar7;
      *pcVar7 = cVar1;
      pcVar6 = pcVar6 + 1;
      bVar8 = pcVar6 < pcVar7;
      pcVar7 = pcVar7 + -1;
    } while (bVar8);
  }
  return (int)(pcVar2 + 2) - (int)param_2;
}



### FUNC Available @ 0002ded0

/* MStream::Available() const */

int __thiscall MStream::Available(MStream *this)

{
  return (*(int *)this - *(int *)(this + 8)) + *(int *)(this + 4);
}



### FUNC Fmt @ 0002dedc

/* MStream::Fmt(char const*, ...) */

void MStream::Fmt(char *param_1,...)

{
  int iVar1;
  int iVar2;
  char *in_r1;
  undefined4 in_r2;
  undefined4 in_r3;
  int *piVar3;
  undefined4 local_8;
  undefined4 local_4;
  
  iVar1 = __stack_chk_guard;
  piVar3 = (int *)(param_1 + 8);
  local_8 = in_r2;
  local_4 = in_r3;
  iVar2 = vsnprintf((char *)*piVar3,(*(int *)param_1 - *piVar3) + *(int *)(param_1 + 4),in_r1,
                    &local_8);
  *piVar3 = *piVar3 + iVar2;
  if (__stack_chk_guard == iVar1) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC Get @ 0002df38

/* MStream::Get() */

undefined4 __thiscall MStream::Get(MStream *this)

{
  return *(undefined4 *)(this + 4);
}



### FUNC Get @ 0002df3c

/* MStream::Get() const */

undefined4 __thiscall MStream::Get(MStream *this)

{
  return *(undefined4 *)(this + 4);
}



### FUNC Write @ 0002df40

/* MStream::Write(OFStream const&) const */

void __thiscall MStream::Write(MStream *this,OFStream *param_1)

{
  OFStream::Write(param_1,*(char **)(this + 4));
  return;
}



### FUNC Write @ 0002df50

/* MStream::Write(__sFILE*) const */

bool __thiscall MStream::Write(MStream *this,__sFILE *param_1)

{
  int iVar1;
  
  iVar1 = fputs(*(char **)(this + 4),(FILE *)param_1);
  return iVar1 == 0;
}



### FUNC Puts @ 0002df68

/* MStream::Puts(char const*, unsigned int) */

void __thiscall MStream::Puts(MStream *this,char *param_1,uint param_2)

{
  int iVar1;
  MStream *pMVar2;
  
  pMVar2 = this + 8;
  if (param_2 + 1 < (uint)((*(int *)this - *(int *)pMVar2) + *(int *)(this + 4))) {
    __aeabi_memcpy(*(int *)pMVar2,param_1,param_2);
    iVar1 = *(int *)pMVar2;
    *(uint *)pMVar2 = iVar1 + param_2;
    *(undefined1 *)(iVar1 + param_2) = 0;
  }
  return;
}



### FUNC Puts @ 0002df92

/* MStream::Puts(char const*) */

void __thiscall MStream::Puts(MStream *this,char *param_1)

{
  size_t sVar1;
  int iVar2;
  MStream *pMVar3;
  
  sVar1 = strlen(param_1);
  pMVar3 = this + 8;
  if (sVar1 + 1 < (uint)((*(int *)this - *(int *)pMVar3) + *(int *)(this + 4))) {
    __aeabi_memcpy(*(int *)pMVar3,param_1,sVar1);
    iVar2 = *(int *)pMVar3;
    *(size_t *)pMVar3 = iVar2 + sVar1;
    *(undefined1 *)(iVar2 + sVar1) = 0;
  }
  return;
}



### FUNC Reset @ 0002dfca

/* MStream::Reset() */

void __thiscall MStream::Reset(MStream *this)

{
  *(undefined4 *)(this + 8) = *(undefined4 *)(this + 4);
  return;
}



### FUNC Empty @ 0002dfd0

/* MStream::Empty() const */

bool __thiscall MStream::Empty(MStream *this)

{
  return *(int *)(this + 8) == *(int *)(this + 4);
}



### FUNC operator<< @ 0002dfe0

/* MStream::TEMPNAMEPLACEHOLDERVALUE(char const*) */

MStream * __thiscall MStream::operator<<(MStream *this,char *param_1)

{
  Puts(this,param_1);
  return this;
}



### FUNC operator<< @ 0002dfee

/* MStream::TEMPNAMEPLACEHOLDERVALUE(char) */

void __thiscall MStream::operator<<(MStream *this,char param_1)

{
  int iVar1;
  MStream *pMVar2;
  
  pMVar2 = this + 8;
  if (2 < (uint)((*(int *)this - (int)*(char **)pMVar2) + *(int *)(this + 4))) {
    **(char **)pMVar2 = param_1;
    iVar1 = *(int *)pMVar2;
    *(int *)pMVar2 = iVar1 + 1;
    *(undefined1 *)(iVar1 + 1) = 0;
  }
  return;
}



### FUNC ~_Vector_base @ 0002e00e

/* std::priv::_Vector_base<MStream, std::allocator<MStream> >::~_Vector_base() */

_Vector_base<MStream,std::allocator<MStream>> * __thiscall
std::priv::_Vector_base<MStream,std::allocator<MStream>>::~_Vector_base
          (_Vector_base<MStream,std::allocator<MStream>> *this)

{
  void *pvVar1;
  
  pvVar1 = *(void **)this;
  if (pvVar1 != (void *)0x0) {
    if ((uint)(*(int *)(this + 8) - (int)pvVar1) < 0x81) {
      __node_alloc::_M_deallocate(pvVar1,*(int *)(this + 8) - (int)pvVar1);
    }
    else {
      operator_delete(pvVar1);
    }
  }
  return this;
}



### FUNC _M_insert_overflow_aux @ 0002e030

/* std::vector<MStream, std::allocator<MStream> >::_M_insert_overflow_aux(MStream*, MStream const&,
   std::__false_type const&, unsigned int, bool) */

void __thiscall
std::vector<MStream,std::allocator<MStream>>::_M_insert_overflow_aux
          (vector<MStream,std::allocator<MStream>> *this,MStream *param_1,MStream *param_2,
          __false_type *param_3,uint param_4,bool param_5)

{
  undefined4 *puVar1;
  int iVar2;
  undefined4 *puVar3;
  undefined4 *puVar4;
  undefined3 in_stack_00000005;
  uint local_1c;
  int local_18;
  
  local_18 = __stack_chk_guard;
  local_1c = _M_compute_next_size(this,param_4);
  puVar1 = (undefined4 *)
           allocator<MStream>::_M_allocate((allocator<MStream> *)(this + 8),local_1c,&local_1c);
  puVar4 = *(undefined4 **)this;
  puVar3 = puVar1;
  if (0 < (int)param_1 - (int)puVar4) {
    iVar2 = __udivsi3((int)param_1 - (int)puVar4,0xc);
    iVar2 = iVar2 + 1;
    do {
      *puVar3 = *puVar4;
      puVar3[1] = puVar4[1];
      puVar3[2] = puVar4[2];
      puVar3 = puVar3 + 3;
      puVar4 = puVar4 + 3;
      iVar2 = iVar2 + -1;
    } while (1 < iVar2);
  }
  if (param_4 == 1) {
    *puVar3 = *(undefined4 *)param_2;
    puVar3[1] = *(undefined4 *)(param_2 + 4);
    puVar3[2] = *(undefined4 *)(param_2 + 8);
    puVar4 = puVar3 + 3;
  }
  else {
    puVar4 = puVar3 + param_4 * 3;
    if (0 < (int)(param_4 * 0xc)) {
      iVar2 = param_4 + 1;
      do {
        *puVar3 = *(undefined4 *)param_2;
        puVar3[1] = *(undefined4 *)(param_2 + 4);
        puVar3[2] = *(undefined4 *)(param_2 + 8);
        puVar3 = puVar3 + 3;
        iVar2 = iVar2 + -1;
      } while (1 < iVar2);
    }
  }
  if ((_param_5 == 0) && (0 < *(int *)(this + 4) - (int)param_1)) {
    iVar2 = __udivsi3(*(int *)(this + 4) - (int)param_1,0xc);
    iVar2 = iVar2 + 1;
    do {
      *puVar4 = *(undefined4 *)param_1;
      puVar4[1] = *(undefined4 *)(param_1 + 4);
      puVar4[2] = *(undefined4 *)(param_1 + 8);
      puVar4 = puVar4 + 3;
      param_1 = param_1 + 0xc;
      iVar2 = iVar2 + -1;
    } while (1 < iVar2);
  }
  _M_clear_after_move(this);
  *(undefined4 **)this = puVar1;
  *(undefined4 **)(this + 4) = puVar4;
  *(undefined4 **)(this + 8) = puVar1 + local_1c * 3;
  if (__stack_chk_guard != local_18) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return;
}



### FUNC _M_compute_next_size @ 0002e138

/* std::vector<MStream, std::allocator<MStream> >::_M_compute_next_size(unsigned int) */

uint __thiscall
std::vector<MStream,std::allocator<MStream>>::_M_compute_next_size
          (vector<MStream,std::allocator<MStream>> *this,uint param_1)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  
  iVar1 = *(int *)(this + 4) - *(int *)this >> 2;
  uVar4 = iVar1 * -0x55555555;
  if (param_1 <= iVar1 * 0x55555555 + 0x15555555U) {
    uVar2 = uVar4;
    if (uVar4 < param_1 || uVar4 - param_1 == 0) {
      uVar2 = param_1;
    }
    uVar4 = uVar2 + uVar4;
    uVar3 = uVar4;
    if (uVar4 < uVar2) {
      uVar3 = 0x15555555;
    }
    uVar2 = 0x15555555;
    if (uVar4 < 0x15555556) {
      uVar2 = uVar3;
    }
    return uVar2;
  }
                    /* WARNING: Subroutine does not return */
  __stl_throw_length_error("vector");
}



### FUNC _M_clear_after_move @ 0002e184

/* std::vector<MStream, std::allocator<MStream> >::_M_clear_after_move() */

void __thiscall
std::vector<MStream,std::allocator<MStream>>::_M_clear_after_move
          (vector<MStream,std::allocator<MStream>> *this)

{
  void *pvVar1;
  void *pvVar2;
  
  pvVar1 = *(void **)this;
  pvVar2 = *(void **)(this + 4);
  if (pvVar1 != pvVar2) {
    do {
      if (*(void **)((int)pvVar2 + -8) != (void *)0x0) {
        operator_delete__(*(void **)((int)pvVar2 + -8));
      }
      pvVar2 = (void *)((int)pvVar2 + -0xc);
    } while (pvVar2 != pvVar1);
    pvVar1 = *(void **)this;
  }
  if (pvVar1 != (void *)0x0) {
    if ((uint)(*(int *)(this + 8) - (int)pvVar1) < 0x81) {
      __node_alloc::_M_deallocate(pvVar1,*(int *)(this + 8) - (int)pvVar1);
    }
    else {
      operator_delete(pvVar1);
    }
  }
  return;
}



### FUNC _M_allocate @ 0002e1d4

/* std::allocator<MStream>::_M_allocate(unsigned int, unsigned int&) */

undefined4 __thiscall
std::allocator<MStream>::_M_allocate(allocator<MStream> *this,uint param_1,uint *param_2)

{
  uint uVar1;
  undefined4 uVar2;
  uint local_1c;
  int local_18;
  
  local_18 = __stack_chk_guard;
  if (0x15555555 < param_1) {
    FUN_00030824(4);
    uVar2 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
    FUN_000309e0(uVar2,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
  }
  uVar2 = 0;
  if (param_1 != 0) {
    local_1c = param_1 * 0xc;
    uVar2 = __node_alloc::allocate(&local_1c);
    uVar1 = __udivsi3(local_1c,0xc);
    *param_2 = uVar1;
  }
  if (__stack_chk_guard == local_18) {
    return uVar2;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC allocate @ 0002e250

/* std::__node_alloc::allocate(unsigned int&) */

void std::__node_alloc::allocate(uint *param_1)

{
  if (0x80 < *param_1) {
    operator_new(*param_1);
    return;
  }
  _M_allocate(param_1);
  return;
}



### FUNC Logging @ 0002e268

/* mag::Logging::Logging(int) */

Logging * __thiscall mag::Logging::Logging(Logging *this,int param_1)

{
  tm *ptVar1;
  time_t tStack_1c;
  int local_18;
  
  local_18 = __stack_chk_guard;
  MStream::MStream((MStream *)this,0x400);
  time(&tStack_1c);
  ptVar1 = localtime(&tStack_1c);
  MStream::Fmt((char *)this,"%d.%02d.%02d %02d:%02d:%02d  %s",ptVar1->tm_year + 0x76c,
               ptVar1->tm_mon + 1,ptVar1->tm_mday,ptVar1->tm_hour,ptVar1->tm_min,ptVar1->tm_sec,
               (&PTR_s_TRACE___00068c58)[param_1]);
  if (__stack_chk_guard == local_18) {
    return this;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC ~Logging @ 0002e31c

/* mag::Logging::~Logging() */

void __thiscall mag::Logging::~Logging(Logging *this)

{
  MStream::operator<<((MStream *)this,"\n");
  MStream::Write((MStream *)this,(__sFILE *)PTR___sF_0006b898);
  fflush((FILE *)PTR___sF_0006b898);
  MStream::~MStream((MStream *)this);
  return;
}



### FUNC Setfp @ 0002e364

/* mag::Logging::Setfp(__sFILE*) */

void mag::Logging::Setfp(__sFILE *param_1)

{
  PTR___sF_0006b898 = param_1;
  return;
}



### FUNC Setfp @ 0002e370

/* mag::Logging::Setfp(OFStream&) */

void mag::Logging::Setfp(OFStream *param_1)

{
  PTR___sF_0006b898 = (pointer_____offset_0x54___)FStream::GetRaw((FStream *)param_1);
  return;
}



### FUNC CSmoother @ 0002e384

/* CSmoother::CSmoother() */

CSmoother * __thiscall CSmoother::CSmoother(CSmoother *this)

{
  *(undefined ***)this = &PTR__CSmoother_00068c78;
  __aeabi_memclr4(this + 4,0x24);
  return this;
}



### FUNC ~CSmoother @ 0002e3a4

/* CSmoother::~CSmoother() */

CSmoother * __thiscall CSmoother::~CSmoother(CSmoother *this)

{
  *(undefined ***)this = &PTR__CSmoother_00068c78;
  if (*(void **)(this + 4) != (void *)0x0) {
    operator_delete__(*(void **)(this + 4));
    *(undefined4 *)(this + 4) = 0;
  }
  *(undefined4 *)(this + 8) = 0;
  if (*(void **)(this + 0xc) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0xc));
    *(undefined4 *)(this + 0xc) = 0;
  }
  if (*(void **)(this + 0x10) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0x10));
    *(undefined4 *)(this + 0x10) = 0;
  }
  return this;
}



### FUNC ~CSmoother @ 0002e3e8

/* CSmoother::~CSmoother() */

void __thiscall CSmoother::~CSmoother(CSmoother *this)

{
  void *pvVar1;
  
  pvVar1 = (void *)~CSmoother(this);
  operator_delete(pvVar1);
  return;
}



### FUNC Reset @ 0002e3f6

/* CSmoother::Reset(unsigned int, unsigned int, int, unsigned int) */

undefined4 __thiscall
CSmoother::Reset(CSmoother *this,uint param_1,uint param_2,int param_3,uint param_4)

{
  void *pvVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  undefined4 uVar5;
  undefined8 uVar6;
  
  uVar5 = 0;
  *(undefined4 *)(this + 0x24) = 0;
  if (*(void **)(this + 4) != (void *)0x0) {
    operator_delete__(*(void **)(this + 4));
    *(undefined4 *)(this + 4) = 0;
  }
  *(undefined4 *)(this + 8) = 0;
  if (*(void **)(this + 0xc) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0xc));
    *(undefined4 *)(this + 0xc) = 0;
  }
  if (*(void **)(this + 0x10) != (void *)0x0) {
    operator_delete__(*(void **)(this + 0x10));
    *(undefined4 *)(this + 0x10) = 0;
  }
  if ((param_1 != 0) && (param_2 != 0)) {
    *(undefined4 *)(this + 0x18) = 0;
    *(uint *)(this + 0x1c) = param_1;
    *(uint *)(this + 0x20) = param_2;
    uVar3 = (param_4 + 1 >> 1) + param_1 * param_2;
    uVar2 = uVar3 * 2;
    if (uVar2 < uVar3) {
      uVar2 = 0xffffffff;
    }
    pvVar1 = operator_new__(uVar2);
    iVar4 = (int)pvVar1 + (param_4 & 0xfffffffe);
    *(void **)(this + 4) = pvVar1;
    *(int *)(this + 8) = iVar4;
    *(int *)(this + 0x14) = iVar4;
    uVar6 = __muldi3(param_1,0,4,(int)param_1 >> 0x1f);
    uVar2 = 0xffffffff;
    if ((int)((ulonglong)uVar6 >> 0x20) == 0) {
      uVar2 = (uint)uVar6;
    }
    pvVar1 = operator_new__(uVar2);
    *(void **)(this + 0xc) = pvVar1;
    __aeabi_memclr4(pvVar1,param_1 << 2);
    if (param_3 != 0) {
      uVar2 = param_1 * 2;
      if (param_1 * 2 < param_1) {
        uVar2 = 0xffffffff;
      }
      pvVar1 = operator_new__(uVar2);
      *(void **)(this + 0x10) = pvVar1;
    }
    uVar5 = 1;
    *(undefined4 *)(this + 0x24) = 1;
  }
  return uVar5;
}



### FUNC PushFrameSum @ 0002e4b6

/* CSmoother::PushFrameSum(unsigned short const*) */

undefined4 __thiscall CSmoother::PushFrameSum(CSmoother *this,ushort *param_1)

{
  undefined4 uVar1;
  int iVar2;
  uint uVar3;
  int extraout_r1;
  int *piVar4;
  ushort *puVar5;
  ushort *puVar6;
  uint uVar7;
  
  uVar1 = 0;
  if ((*(int *)(this + 0x24) != 0) && (piVar4 = *(int **)(this + 0xc), piVar4 != (int *)0x0)) {
    iVar2 = *(int *)(this + 0x18);
    *(uint *)(this + 0x18) = iVar2 + 1U;
    uVar3 = *(uint *)(this + 0x1c) >> 2;
    if (*(uint *)(this + 0x20) < iVar2 + 1U) {
      if (uVar3 != 0) {
        iVar2 = -uVar3;
        puVar5 = *(ushort **)(this + 0x14);
        puVar6 = param_1;
        do {
          *piVar4 = ((uint)*puVar6 - (uint)*puVar5) + *piVar4;
          piVar4[1] = ((uint)puVar6[1] - (uint)puVar5[1]) + piVar4[1];
          piVar4[2] = ((uint)puVar6[2] - (uint)puVar5[2]) + piVar4[2];
          piVar4[3] = ((uint)puVar6[3] - (uint)puVar5[3]) + piVar4[3];
          piVar4 = piVar4 + 4;
          puVar5 = puVar5 + 4;
          puVar6 = puVar6 + 4;
          iVar2 = iVar2 + 1;
        } while (iVar2 != 0);
      }
    }
    else if (uVar3 != 0) {
      iVar2 = -uVar3;
      puVar6 = param_1;
      do {
        *piVar4 = *piVar4 + (uint)*puVar6;
        piVar4[1] = piVar4[1] + (uint)puVar6[1];
        piVar4[2] = piVar4[2] + (uint)puVar6[2];
        piVar4[3] = piVar4[3] + (uint)puVar6[3];
        piVar4 = piVar4 + 4;
        puVar6 = puVar6 + 4;
        iVar2 = iVar2 + 1;
      } while (iVar2 != 0);
    }
    __aeabi_memcpy(*(undefined4 *)(this + 0x14),param_1,*(int *)(this + 0x1c) << 1);
    uVar3 = *(uint *)(this + 0x18);
    uVar7 = *(uint *)(this + 0x20);
    __aeabi_uidivmod(uVar3,uVar7);
    if (extraout_r1 == 0) {
      iVar2 = *(int *)(this + 8);
    }
    else {
      iVar2 = *(int *)(this + 0x14) + *(int *)(this + 0x1c) * 2;
    }
    *(int *)(this + 0x14) = iVar2;
    uVar1 = 1;
    if (uVar3 < uVar7) {
      uVar1 = 0;
    }
  }
  return uVar1;
}



### FUNC PushFrameAve @ 0002e58e

/* CSmoother::PushFrameAve(unsigned short*, unsigned int) */

undefined4 __thiscall CSmoother::PushFrameAve(CSmoother *this,ushort *param_1,uint param_2)

{
  ushort uVar1;
  ushort uVar2;
  undefined4 uVar3;
  int iVar4;
  int extraout_r1;
  ushort *puVar5;
  uint uVar6;
  uint uVar7;
  
  uVar3 = 0;
  if (*(int *)(this + 0x24) != 0) {
    uVar6 = *(int *)(this + 0x18) + 1;
    *(uint *)(this + 0x18) = uVar6;
    if (*(uint *)(this + 0x20) < uVar6) {
      if (*(uint *)(this + 0x20) != 1) {
        return 0;
      }
      iVar4 = *(int *)(this + 0x1c);
      uVar7 = 1;
      if (iVar4 != 0) {
        puVar5 = *(ushort **)(this + 8);
        do {
          uVar1 = *puVar5;
          uVar2 = *param_1;
          *puVar5 = uVar2;
          uVar7 = (uint)uVar2 - (uint)uVar1;
          puVar5 = puVar5 + 1;
          if ((((int)uVar7 <= (int)param_2) && (-param_2 == uVar7 || (int)-uVar7 < (int)param_2)) &&
             (uVar7 != 0)) {
            *param_1 = uVar2 - (short)(uVar7 >> 1);
          }
          iVar4 = iVar4 + -1;
          param_1 = param_1 + 1;
        } while (iVar4 != 0);
        uVar7 = 1;
      }
    }
    else {
      __aeabi_memcpy(*(undefined4 *)(this + 0x14),param_1,*(int *)(this + 0x1c) << 1);
      uVar7 = *(uint *)(this + 0x20);
      uVar6 = *(uint *)(this + 0x18);
    }
    __aeabi_uidivmod(uVar6,uVar7);
    if (extraout_r1 == 0) {
      iVar4 = *(int *)(this + 8);
    }
    else {
      iVar4 = *(int *)(this + 0x14) + *(int *)(this + 0x1c) * 2;
    }
    *(int *)(this + 0x14) = iVar4;
    uVar3 = 1;
    if (uVar6 < uVar7) {
      uVar3 = 0;
    }
  }
  return uVar3;
}



### FUNC Restart @ 0002e622

/* CSmoother::Restart() */

void __thiscall CSmoother::Restart(CSmoother *this)

{
  if (*(int *)(this + 0x24) != 0) {
    *(undefined4 *)(this + 0x14) = *(undefined4 *)(this + 8);
    *(undefined4 *)(this + 0x18) = 0;
    __aeabi_memclr4(*(undefined4 *)(this + 0xc),*(int *)(this + 0x1c) << 2);
  }
  return;
}



### FUNC GetSTDFrame @ 0002e644

/* CSmoother::GetSTDFrame() */

int __thiscall CSmoother::GetSTDFrame(CSmoother *this)

{
  undefined2 uVar1;
  int iVar2;
  uint uVar3;
  undefined4 uVar4;
  uint uVar5;
  ushort *puVar6;
  int iVar7;
  uint uVar8;
  uint uVar9;
  undefined8 uVar10;
  undefined8 uVar11;
  undefined8 uVar12;
  undefined4 in_stack_ffffffc0;
  uint uVar13;
  uint uVar14;
  
  iVar2 = 0;
  if ((((*(int *)(this + 0x24) != 0) && (*(int *)(this + 0xc) != 0)) &&
      (iVar7 = *(int *)(this + 0x10), iVar7 != 0)) &&
     (uVar8 = *(uint *)(this + 0x20), uVar8 <= *(uint *)(this + 0x18))) {
    if (uVar8 < 2) {
      __aeabi_memclr(iVar7,*(int *)(this + 0x1c) << 1);
      iVar2 = *(int *)(this + 0x10);
    }
    else {
      uVar10 = __floatunsidf((uVar8 - 1) * uVar8 * uVar8);
      uVar13 = 0;
      uVar10 = __divdf3(0,0x3ff00000,(int)uVar10,(int)((ulonglong)uVar10 >> 0x20));
      uVar3 = *(uint *)(this + 0x1c);
      iVar2 = iVar7;
      uVar5 = uVar13;
      if (uVar3 != 0) {
        while( true ) {
          uVar14 = uVar5;
          if (uVar8 != 0) {
            puVar6 = (ushort *)(*(int *)(this + 8) + uVar13 * 2);
            iVar2 = *(int *)(*(int *)(this + 0xc) + uVar13 * 4);
            uVar12 = 0;
            uVar9 = 0;
            do {
              uVar11 = __floatsidf(uVar8 * *puVar6 - iVar2);
              uVar4 = (undefined4)((ulonglong)uVar11 >> 0x20);
              uVar11 = __muldf3((int)uVar11,uVar4,(int)uVar11,uVar4);
              uVar12 = __adddf3((int)uVar12,(int)((ulonglong)uVar12 >> 0x20),(int)uVar11,
                                (int)((ulonglong)uVar11 >> 0x20));
              uVar5 = (uint)uVar12;
              puVar6 = puVar6 + uVar3;
              uVar9 = uVar9 + 1;
            } while (uVar9 < uVar8);
          }
          __muldf3((int)uVar10,(int)((ulonglong)uVar10 >> 0x20),uVar5);
          sqrt((double)CONCAT44(uVar14,in_stack_ffffffc0));
          uVar1 = __fixunsdfsi();
          iVar2 = *(int *)(this + 0x10);
          *(undefined2 *)(iVar2 + uVar13 * 2) = uVar1;
          uVar13 = uVar13 + 1;
          uVar3 = *(uint *)(this + 0x1c);
          if (uVar3 <= uVar13) break;
          uVar8 = *(uint *)(this + 0x20);
          uVar5 = uVar14;
        }
      }
    }
  }
  return iVar2;
}



### FUNC FStream @ 0002e730

/* FStream::FStream() */

void __thiscall FStream::FStream(FStream *this)

{
  *(undefined ***)this = &PTR__IFStream_00068c90;
  return;
}



### FUNC ~IFStream @ 0002e740

/* IFStream::~IFStream() */

IFStream * __thiscall IFStream::~IFStream(IFStream *this)

{
  *(undefined ***)this = &PTR__IFStream_00068c90;
  if (*(FILE **)(this + 4) != (FILE *)0x0) {
    fclose(*(FILE **)(this + 4));
  }
  return this;
}



### FUNC ~FStream @ 0002e764

/* FStream::~FStream() */

void __thiscall FStream::~FStream(FStream *this)

{
  code *pcVar1;
  
                    /* WARNING: Does not return */
  pcVar1 = (code *)software_udf(0xfe,0x2e764);
  (*pcVar1)();
}



### FUNC GetRaw @ 0002e766

/* FStream::GetRaw() const */

undefined4 __thiscall FStream::GetRaw(FStream *this)

{
  return *(undefined4 *)(this + 4);
}



### FUNC IsEof @ 0002e76a

/* FStream::IsEof() const */

bool __thiscall FStream::IsEof(FStream *this)

{
  int iVar1;
  
  iVar1 = feof(*(FILE **)(this + 4));
  return iVar1 != 0;
}



### FUNC ReadLine @ 0002e780

/* FStream::ReadLine(char*, int) const */

undefined4 __thiscall FStream::ReadLine(FStream *this,char *param_1,int param_2)

{
  int iVar1;
  undefined4 uVar2;
  char *pcVar3;
  
  iVar1 = feof(*(FILE **)(this + 4));
  uVar2 = 0;
  if (iVar1 == 0) {
    pcVar3 = fgets(param_1,param_2,*(FILE **)(this + 4));
    uVar2 = 1;
    if (pcVar3 == (char *)0x0) {
      uVar2 = 0;
    }
  }
  return uVar2;
}



### FUNC Read @ 0002e7b2

/* FStream::Read(void*, unsigned int, unsigned int) const */

int __thiscall FStream::Read(FStream *this,void *param_1,uint param_2,uint param_3)

{
  size_t sVar1;
  
  sVar1 = fread(param_1,param_2,param_3,*(FILE **)(this + 4));
  return param_2 * sVar1;
}



### FUNC GetCurrentPos @ 0002e7ca

/* FStream::GetCurrentPos() const */

void __thiscall FStream::GetCurrentPos(FStream *this)

{
  ftell(*(FILE **)(this + 4));
  return;
}



### FUNC Seek @ 0002e7d6

/* FStream::Seek(long, io::seek) const */

bool __thiscall FStream::Seek(FStream *this,long param_1,int param_3)

{
  int iVar1;
  
  iVar1 = fseek(*(FILE **)(this + 4),param_1,param_3);
  return iVar1 == 0;
}



### FUNC OFStream @ 0002e7f0

/* OFStream::OFStream(char const*, bool) */

OFStream * __thiscall OFStream::OFStream(OFStream *this,char *param_1,bool param_2)

{
  FILE *pFVar1;
  undefined4 *puVar2;
  
  *(undefined ***)this = &PTR__IFStream_00068ca4;
  if (param_2) {
    pFVar1 = fopen(param_1,"rb+");
    *(FILE **)(this + 4) = pFVar1;
    if (pFVar1 == (FILE *)0x0) {
      puVar2 = (undefined4 *)FUN_00030824(4);
      *puVar2 = "IOError: open file failed1.[IFStream::IFStream]";
                    /* WARNING: Subroutine does not return */
      FUN_000309e0(puVar2,&Error::typeinfo,0);
    }
  }
  else {
    pFVar1 = fopen(param_1,"wb");
    *(FILE **)(this + 4) = pFVar1;
    if (pFVar1 == (FILE *)0x0) {
      puVar2 = (undefined4 *)FUN_00030824(4);
      *puVar2 = "IOError: open file failed2.[IFStream::IFStream]";
                    /* WARNING: Subroutine does not return */
      FUN_000309e0(puVar2,&Error::typeinfo,0);
    }
  }
  return this;
}



### FUNC ~OFStream @ 0002e8ec

/* OFStream::~OFStream() */

void __thiscall OFStream::~OFStream(OFStream *this)

{
  *(undefined ***)this = &PTR__IFStream_00068c90;
  if (*(FILE **)(this + 4) != (FILE *)0x0) {
    fclose(*(FILE **)(this + 4));
  }
  operator_delete(this);
  return;
}



### FUNC Flush @ 0002e914

/* OFStream::Flush() const */

bool __thiscall OFStream::Flush(OFStream *this)

{
  int iVar1;
  
  iVar1 = fflush(*(FILE **)(this + 4));
  return iVar1 == 0;
}



### FUNC Write @ 0002e92c

/* OFStream::Write(char const*) const */

bool __thiscall OFStream::Write(OFStream *this,char *param_1)

{
  int iVar1;
  
  iVar1 = fputs(param_1,*(FILE **)(this + 4));
  return -1 < iVar1;
}



### FUNC Write @ 0002e948

/* OFStream::Write(void const*, unsigned int, unsigned int) */

bool __thiscall OFStream::Write(OFStream *this,void *param_1,uint param_2,uint param_3)

{
  size_t sVar1;
  
  sVar1 = fwrite(param_1,param_2,param_3,*(FILE **)(this + 4));
  return sVar1 != 0;
}



### FUNC WriteLine @ 0002e968

/* OFStream::WriteLine(char const*) const */

undefined4 __thiscall OFStream::WriteLine(OFStream *this,char *param_1)

{
  int iVar1;
  
  iVar1 = fputs(param_1,*(FILE **)(this + 4));
  if (-1 < iVar1) {
    iVar1 = fputs("\n",*(FILE **)(this + 4));
    if (-1 < iVar1) {
      return 1;
    }
  }
  return 0;
}



### FUNC GetLength @ 0002e998

/* OFStream::GetLength() const */

long __thiscall OFStream::GetLength(OFStream *this)

{
  int iVar1;
  long __off;
  long lVar2;
  
  fflush(*(FILE **)(this + 4));
  iVar1 = feof(*(FILE **)(this + 4));
  __off = ftell(*(FILE **)(this + 4));
  if (iVar1 == 0) {
    fseek(*(FILE **)(this + 4),0,2);
    lVar2 = ftell(*(FILE **)(this + 4));
    fseek(*(FILE **)(this + 4),__off,0);
    __off = lVar2;
  }
  return __off;
}



### FUNC IFStream @ 0002e9e4

/* IFStream::IFStream(char const*) */

IFStream * __thiscall IFStream::IFStream(IFStream *this,char *param_1)

{
  FILE *__stream;
  long lVar1;
  undefined4 *puVar2;
  
  *(undefined4 *)(this + 8) = 0;
  *(undefined ***)this = &PTR__IFStream_00068cb8;
  __stream = fopen(param_1,"rb");
  *(FILE **)(this + 4) = __stream;
  if (__stream != (FILE *)0x0) {
    fseek(__stream,0,2);
    lVar1 = ftell(*(FILE **)(this + 4));
    *(long *)(this + 8) = lVar1;
    fseek(*(FILE **)(this + 4),0,0);
    return this;
  }
  puVar2 = (undefined4 *)FUN_00030824(4);
  *puVar2 = "IOError: open file failed.[IFStream::IFStream]";
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(puVar2,&Error::typeinfo,0);
}



### FUNC ~IFStream @ 0002ea9c

/* IFStream::~IFStream() */

void __thiscall IFStream::~IFStream(IFStream *this)

{
  *(undefined ***)this = &PTR__IFStream_00068c90;
  if (*(FILE **)(this + 4) != (FILE *)0x0) {
    fclose(*(FILE **)(this + 4));
  }
  operator_delete(this);
  return;
}



### FUNC GetLength @ 0002eac4

/* IFStream::GetLength() const */

undefined4 __thiscall IFStream::GetLength(IFStream *this)

{
  return *(undefined4 *)(this + 8);
}



### FUNC Controller @ 0002eac8

/* Controller::Controller() */

Controller * __thiscall Controller::Controller(Controller *this)

{
  int iVar1;
  int iVar2;
  
  iVar1 = __stack_chk_guard;
  iVar2 = 0;
  do {
    *(undefined4 *)(this + iVar2 + 0x84) = 0;
    *(undefined4 *)(this + iVar2 + 0x80) = 0;
    *(undefined4 *)(this + iVar2 + 0x78) = 0;
    *(undefined4 *)(this + iVar2 + 0x7c) = 0;
    iVar2 = iVar2 + 0x6c;
  } while (iVar2 != 0x438);
  MutexLock::MutexLock((MutexLock *)(this + 0x4a0));
  *(undefined4 *)(this + 0x494) = 0;
  *(undefined4 *)(this + 0x490) = 0;
  *(undefined4 *)(this + 0x4a4) = 0;
  *(undefined4 *)(this + 0x48c) = 0;
  *(undefined4 *)this = 4;
  *(undefined4 *)(this + 4) = 3;
  *(undefined4 *)(this + 8) = 0x1194;
  *(undefined4 *)(this + 0xc) = 300;
  *(undefined4 *)(this + 0x14) = 5000;
  *(undefined4 *)(this + 0x18) = 2;
  *(undefined4 *)(this + 0x10) = 0;
  *(undefined4 *)(this + 0x1c) = 1;
  *(undefined4 *)(this + 0x20) = 0;
  *(undefined4 *)(this + 0x24) = 0;
  *(undefined4 *)(this + 0x28) = 0x180;
  *(undefined4 *)(this + 0x2c) = 0x120;
  *(undefined4 *)(this + 0x30) = 0x180;
  *(undefined4 *)(this + 0x34) = 0x120;
  *(undefined4 *)(this + 0x38) = 0x10;
  *(undefined4 *)(this + 0x3c) = 0x50;
  *(undefined4 *)(this + 0x40) = 8;
  *(undefined4 *)(this + 0x44) = 1;
  *(undefined4 *)(this + 0x48) = 1;
  *(undefined4 *)(this + 0x4c) = 5;
  __aeabi_memclr4(0x6b92c,0x54);
  theFunc._128_4_ = 0x41a00000;
  theFunc._132_4_ = 0x3ecccccd;
  theFunc._136_4_ = 0x41a00000;
  theFunc._140_4_ = 0;
  theFunc._144_4_ = 0;
  theFunc._156_4_ = 0x3f7f4b1f;
  theFunc._160_4_ = 0x3f800000;
  theFunc._148_4_ = 0x3dcccccd;
  theFunc._152_4_ = 0x399d4952;
  theFunc._4_4_ = 0;
  theFunc._52_4_ = 500;
  theFunc._12_4_ = 0;
  theFunc._16_4_ = 20000;
  theFunc._20_4_ = (int)"_ZNKSt6localeeqERKS_" + 2;
  theFunc._24_4_ = 0;
  theFunc._28_4_ = 0xff;
  theFunc._32_4_ = 5;
  theFunc._88_4_ = 1;
  theFunc._96_4_ = 1;
  theFunc._44_4_ = 0;
  theFunc._48_4_ = 0;
  theFunc._8_4_ = 0;
  theFunc._120_4_ = 0x41a00000;
  theFunc._124_4_ = 0x3f800000;
  theFunc._80_4_ = 1;
  *(undefined4 *)(this + 0x488) = 0;
  AddProbe(this,0,1,1,0x3f800000,0,2,3000000,3500000);
  AddProbe(this,0,1,1,theFunc._124_4_,0x1000000,0,3000000,3500000);
  AddProbe(this,0,1,0x19,theFunc._124_4_,0x2000000,1,3000000,3500000);
  if (__stack_chk_guard == iVar1) {
    return this;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC AddProbe @ 0002ed04

/* Controller::AddProbe(unsigned int, unsigned int, unsigned int, float, unsigned int, int, int,
   int, int, int, ProbeType, tagPOINT const*, unsigned int, tagRECT) */

undefined4
Controller::AddProbe
          (Controller *param_1,undefined4 param_2,undefined4 param_3,int param_5,undefined4 param_6,
          undefined4 param_7,undefined4 param_8,undefined4 param_9,undefined4 param_10,
          undefined4 param_10_00,int param_11,undefined4 param_12,int param_13,uint param_14,
          undefined4 param_15,undefined4 param_16,undefined4 param_17,undefined4 param_18)

{
  pthread_mutex_t *__mutex;
  uint uVar1;
  int iVar2;
  Controller *pCVar3;
  uint extraout_r1;
  uint uVar4;
  undefined4 uVar5;
  
  __mutex = (pthread_mutex_t *)(param_1 + 0x4a0);
  uVar5 = *(undefined4 *)(param_1 + 0x28);
  pthread_mutex_lock(__mutex);
  uVar1 = __udivsi3(param_2,uVar5);
  pCVar3 = param_1 + 0x488;
  uVar4 = *(uint *)(param_1 + 0x488);
  if ((((uVar4 < 10) && (__aeabi_uidivmod(param_2,uVar5), extraout_r1 < *(uint *)(param_1 + 0x28)))
      && (param_5 != 0)) && (uVar1 < *(uint *)(param_1 + 0x2c))) {
    __aeabi_memclr4(param_1 + uVar4 * 0x6c + 0x50);
    *(undefined4 *)(param_1 + *(int *)pCVar3 * 0x6c + 0x50) = param_12;
    *(undefined4 *)(param_1 + *(int *)pCVar3 * 0x6c + 0x54) = param_2;
    *(undefined4 *)(param_1 + *(int *)pCVar3 * 0x6c + 0x58) = param_3;
    if (2 < param_14) {
      param_14 = 3;
    }
    *(uint *)(param_1 + *(int *)pCVar3 * 0x6c + 0x74) = param_14;
    iVar2 = *(int *)pCVar3;
    if ((param_13 != 0) && (*(int *)(param_1 + iVar2 * 0x6c + 0x74) != 0)) {
      __aeabi_memcpy4(param_1 + iVar2 * 0x6c + 0x5c,param_13,
                      *(int *)(param_1 + iVar2 * 0x6c + 0x74) << 3);
      iVar2 = *(int *)pCVar3;
    }
    iVar2 = iVar2 * 0x6c;
    *(undefined4 *)(param_1 + iVar2 + 0x78) = param_15;
    *(undefined4 *)(param_1 + iVar2 + 0x7c) = param_16;
    *(undefined4 *)(param_1 + iVar2 + 0x80) = param_17;
    *(undefined4 *)(param_1 + iVar2 + 0x84) = param_18;
    *(int *)(param_1 + *(int *)pCVar3 * 0x6c + 0x90) = param_5;
    *(undefined4 *)(param_1 + *(int *)pCVar3 * 0x6c + 0x8c) = param_6;
    *(undefined4 *)(param_1 + *(int *)pCVar3 * 0x6c + 0x88) = param_7;
    *(undefined4 *)(param_1 + *(int *)pCVar3 * 0x6c + 0x94) = param_8;
    *(undefined4 *)(param_1 + *(int *)pCVar3 * 0x6c + 0xa8) = param_9;
    *(undefined4 *)(param_1 + *(int *)pCVar3 * 0x6c + 0xac) = param_10;
    *(int *)(param_1 + *(int *)pCVar3 * 0x6c + 0xb0) = param_5 + -1;
    *(undefined4 *)(param_1 + *(int *)pCVar3 * 0x6c + 0xb4) = 0;
    *(int *)pCVar3 = *(int *)pCVar3 + 1;
    pthread_mutex_unlock(__mutex);
    uVar5 = 1;
    if (param_11 != 0) {
      SampleProbe(param_1,*(int *)pCVar3 + -1);
    }
  }
  else {
    pthread_mutex_unlock(__mutex);
    uVar5 = 0;
  }
  return uVar5;
}



### FUNC ~Controller @ 0002ee94

/* Controller::~Controller() */

Controller * __thiscall Controller::~Controller(Controller *this)

{
  *(undefined4 *)(this + 0x494) = 0;
  *(undefined4 *)(this + 0x4a4) = 0;
  CFunctions::ReleaseMemory((CFunctions *)theFunc);
  pthread_mutex_destroy((pthread_mutex_t *)(this + 0x4a0));
  return this;
}



### FUNC StopProcess @ 0002eee0

/* Controller::StopProcess() */

void __thiscall Controller::StopProcess(Controller *this)

{
  *(undefined4 *)(this + 0x494) = 0;
  *(undefined4 *)(this + 0x4a4) = 0;
  CFunctions::ReleaseMemory((CFunctions *)theFunc);
  return;
}



### FUNC StartProcess @ 0002ef08

/* Controller::StartProcess(void (*)(int), unsigned int, unsigned int, unsigned int, unsigned int,
   unsigned int, unsigned int, unsigned int, unsigned int, int, unsigned int, char const*) */

void __thiscall
Controller::StartProcess
          (Controller *this,_func_void_int *param_1,uint param_2,uint param_3,uint param_4,
          uint param_5,uint param_6,uint param_7,uint param_8,uint param_9,int param_10,
          uint param_11,char *param_12)

{
  undefined4 uVar1;
  int iVar2;
  MStream *pMVar3;
  Logging *this_00;
  Logging aLStack_30 [12];
  Logging aLStack_24 [12];
  int local_18;
  
  local_18 = __stack_chk_guard;
  uVar1 = 0;
  if (param_1 != (_func_void_int *)0x0) {
    *(_func_void_int **)(this + 0x4a4) = param_1;
    *(uint *)(this + 0x49c) = param_5;
    *(uint *)(this + 0x498) = param_4;
    *(uint *)(this + 0x28) = param_2;
    *(uint *)(this + 0x2c) = param_3;
    *(uint *)this = param_6;
    *(uint *)(this + 4) = param_7;
    *(uint *)(this + 8) = param_8;
    *(uint *)(this + 0xc) = param_9;
    *(int *)(this + 0x18) = param_10;
    *(uint *)(this + 0x40) = param_11;
    iVar2 = CFunctions::Reset((CFunctions *)theFunc,(struct_IntrinsicPara *)(this + 0x28));
    if (iVar2 == 0) {
      pMVar3 = (MStream *)mag::Logging::Logging(aLStack_24,4);
      MStream::operator<<(pMVar3,"Failed to allocate memory");
      this_00 = aLStack_24;
    }
    else {
      iVar2 = CFunctions::LoadCalibrationTable((CFunctions *)theFunc,param_12);
      if (iVar2 != 0) {
        CFunctions::SetColorPalette((CFunctions *)theFunc,*(undefined4 *)(this + 0x18));
        uVar1 = 1;
        *(undefined4 *)(this + 0x494) = 1;
        *(undefined4 *)(this + 0x48c) = 0xffffffff;
        goto LAB_0002efd0;
      }
      pMVar3 = (MStream *)mag::Logging::Logging(aLStack_30,4);
      MStream::operator<<(pMVar3,"Failed to load calibration table");
      this_00 = aLStack_30;
    }
    mag::Logging::~Logging(this_00);
    uVar1 = 0;
  }
LAB_0002efd0:
  if (__stack_chk_guard == local_18) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail(uVar1);
}



### FUNC setPreviewOrientation @ 0002f068

/* Controller::setPreviewOrientation(int) */

Controller * __thiscall Controller::setPreviewOrientation(Controller *this,int param_1)

{
  if (param_1 < 0xb4) {
    if ((param_1 == 0) || (param_1 == 0x5a)) {
      theFunc._116_4_ = param_1;
      return (Controller *)theFunc;
    }
  }
  else {
    this = (Controller *)0x10e;
    if (param_1 == 0x10e) {
      theFunc._116_4_ = param_1;
      return (Controller *)theFunc;
    }
    if (param_1 == 0xb4) {
      theFunc._116_4_ = param_1;
      return (Controller *)theFunc;
    }
  }
  return this;
}



### FUNC getPreviewOrientation @ 0002f090

/* Controller::getPreviewOrientation() */

undefined4 Controller::getPreviewOrientation(void)

{
  return theFunc._116_4_;
}



### FUNC FFC @ 0002f0a0

/* Controller::FFC() */

void __thiscall Controller::FFC(Controller *this)

{
  if (*(code **)(this + 0x4a4) != (code *)0x0) {
    (**(code **)(this + 0x4a4))(0);
  }
  theFunc._56_4_ = theFunc._64_4_;
  theFunc._60_4_ = theFunc._68_4_;
  *(undefined4 *)(this + 0x48c) = 0;
  return;
}



### FUNC PushFrame @ 0002f0d4

/* Controller::PushFrame(unsigned short const*, int, int) */

undefined4 __thiscall
Controller::PushFrame(Controller *this,ushort *param_1,int param_2,int param_3)

{
  uint uVar1;
  undefined4 uVar2;
  uint uVar3;
  Controller *pCVar4;
  uint uVar5;
  int iVar6;
  
  if (*(int *)(this + 0x494) == 0) {
    return 0;
  }
  pCVar4 = this + 0x48c;
  iVar6 = *(int *)(this + 0x48c);
  theFunc._64_4_ = param_2;
  theFunc._68_4_ = param_3;
  if (iVar6 < 0) {
    if (*(code **)(this + 0x4a4) != (code *)0x0) {
      (**(code **)(this + 0x4a4))(0);
    }
    theFunc._56_4_ = theFunc._64_4_;
    theFunc._60_4_ = theFunc._68_4_;
    *(undefined4 *)pCVar4 = 0;
    return 0;
  }
  uVar3 = iVar6 + 1;
  *(uint *)pCVar4 = uVar3;
  uVar5 = *(uint *)this;
  uVar1 = *(int *)(this + 0x40) + uVar5;
  if (uVar3 <= uVar5) {
    uVar1 = *(int *)(this + 4) + uVar1;
LAB_0002f1ce:
    CFunctions::DoSomething((CFunctions *)theFunc,iVar6,uVar1);
    return 0;
  }
  if (uVar3 <= uVar1) {
    if ((uVar3 == uVar1) && (*(code **)(this + 0x4a4) != (code *)0x0)) {
      (**(code **)(this + 0x4a4))(1);
      uVar5 = *(uint *)this;
      uVar3 = *(uint *)pCVar4;
    }
    CFunctions::PushBaselineRaw((CFunctions *)theFunc,param_1,(uint)(uVar3 == uVar5 + 1));
    CFunctions::DoSomething
              ((CFunctions *)theFunc,*(int *)pCVar4 + -1,
               *(int *)(this + 0x40) + *(int *)this + *(int *)(this + 4));
    return 0;
  }
  uVar1 = *(int *)(this + 4) + uVar1;
  if (uVar3 <= uVar1) goto LAB_0002f1ce;
  if (uVar3 < *(int *)(this + 8) + uVar1) {
    iVar6 = 100;
    if (0x98be26 < *(uint *)(this + 0x498)) {
      iVar6 = 0x1e;
    }
    if ((uVar3 < iVar6 + uVar1) ||
       (uVar1 = theFunc._56_4_ - param_2 >> 0x1f,
       ((theFunc._56_4_ - param_2) + uVar1 ^ uVar1) <= *(uint *)(this + 0xc))) goto LAB_0002f184;
  }
  if (*(code **)(this + 0x4a4) != (code *)0x0) {
    (**(code **)(this + 0x4a4))(0);
    param_3 = theFunc._68_4_;
    param_2 = theFunc._64_4_;
  }
  theFunc._56_4_ = param_2;
  theFunc._60_4_ = param_3;
  *(undefined4 *)pCVar4 = 0;
LAB_0002f184:
  uVar2 = CFunctions::PushFrame((CFunctions *)theFunc,param_1,0,1,0,1);
  return uVar2;
}



### FUNC GetRectTemperatureInfo @ 0002f260

/* Controller::GetRectTemperatureInfo(unsigned int, unsigned int, unsigned int, unsigned int, int*,
   int) */

int __thiscall
Controller::GetRectTemperatureInfo
          (Controller *this,uint param_1,uint param_2,uint param_3,uint param_4,int *param_5,
          int param_6)

{
  uint uVar1;
  int iVar2;
  int iVar3;
  uint uVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  
  uVar1 = param_4;
  uVar5 = param_3;
  uVar7 = param_1;
  if (theFunc._116_4_ != 0x5a) {
    if (theFunc._116_4_ == 0x10e) {
      uVar5 = *(int *)(this + 0x2c) + (param_3 ^ 0xffffffff);
      uVar1 = *(int *)(this + 0x28) + (param_4 ^ 0xffffffff);
      uVar7 = *(int *)(this + 0x2c) + (param_1 ^ 0xffffffff);
      param_2 = *(int *)(this + 0x28) + (param_2 ^ 0xffffffff);
    }
    else if (theFunc._116_4_ == 0xb4) {
      uVar1 = *(int *)(this + 0x28) + (param_3 ^ 0xffffffff);
      uVar5 = param_4;
      uVar7 = param_2;
      param_2 = *(int *)(this + 0x28) + (param_1 ^ 0xffffffff);
    }
    else {
      uVar5 = *(int *)(this + 0x2c) + (param_4 ^ 0xffffffff);
      uVar7 = *(int *)(this + 0x2c) + (param_2 ^ 0xffffffff);
      uVar1 = param_3;
      param_2 = param_1;
    }
  }
  uVar6 = uVar7;
  if ((int)uVar7 <= (int)uVar5) {
    uVar6 = uVar5;
  }
  uVar4 = uVar1;
  if ((int)param_2 <= (int)uVar1) {
    uVar4 = param_2;
  }
  if ((int)uVar7 <= (int)uVar5) {
    uVar5 = uVar7;
  }
  if ((int)param_2 <= (int)uVar1) {
    param_2 = uVar1;
  }
  iVar2 = CFunctions::GetRectTemperatureInfo
                    ((CFunctions *)theFunc,uVar4,uVar5,param_2,uVar6,param_5,param_6);
  if (iVar2 != 0) {
    iVar3 = Buffer2Client(this,param_5[3]);
    param_5[3] = iVar3;
    iVar3 = Buffer2Client(this,param_5[4]);
    param_5[4] = iVar3;
  }
  return iVar2;
}



### FUNC Client2Buffer @ 0002f340

/* Controller::Client2Buffer(int, int, int&, int&) */

void __thiscall
Controller::Client2Buffer(Controller *this,int param_1,int param_2,int *param_3,int *param_4)

{
  if (theFunc._116_4_ == 0x5a) {
    *param_3 = param_2;
    param_2 = param_1;
  }
  else if (theFunc._116_4_ == 0xb4) {
    *param_3 = *(int *)(this + 0x28) + (param_1 ^ 0xffffffffU);
  }
  else if (theFunc._116_4_ == 0x10e) {
    *param_3 = *(int *)(this + 0x28) + (param_2 ^ 0xffffffffU);
    param_2 = *(int *)(this + 0x2c) + (param_1 ^ 0xffffffffU);
  }
  else {
    *param_3 = param_1;
    param_2 = *(int *)(this + 0x2c) + (param_2 ^ 0xffffffffU);
  }
  *param_4 = param_2;
  return;
}



### FUNC Buffer2Client @ 0002f39c

/* Controller::Buffer2Client(int) */

int __thiscall Controller::Buffer2Client(Controller *this,int param_1)

{
  int iVar1;
  int iVar2;
  int iVar3;
  int iVar4;
  
  iVar4 = *(int *)(this + 0x28);
  iVar1 = __divsi3(param_1,iVar4);
  iVar2 = param_1 - iVar1 * iVar4;
  iVar3 = *(int *)(this + 0x2c);
  if (theFunc._116_4_ == 0x5a) {
    iVar2 = iVar2 * iVar3 + iVar1;
  }
  else if (theFunc._116_4_ == 0xb4) {
    iVar2 = (iVar4 + iVar1 * iVar4 + -1) - iVar2;
  }
  else if (theFunc._116_4_ == 0x10e) {
    iVar2 = ((iVar3 + -1) - iVar1) + iVar3 * ((iVar4 + -1) - iVar2);
  }
  else {
    iVar2 = ((iVar3 + -1) - iVar1) * iVar4 + iVar2;
  }
  return iVar2;
}



### FUNC SetEX @ 0002f3fc

/* Controller::SetEX(int, int, int) */

void Controller::SetEX(int param_1,int param_2,int param_3)

{
  CFunctions::SetEX((CFunctions *)theFunc);
  return;
}



### FUNC getEX @ 0002f410

/* Controller::getEX() */

void Controller::getEX(void)

{
  CFunctions::GetEX((CFunctions *)theFunc);
  return;
}



### FUNC setAutoEnlargeValue @ 0002f424

/* Controller::setAutoEnlargeValue(int) */

void __thiscall Controller::setAutoEnlargeValue(Controller *this,int param_1)

{
  theFunc._12_4_ = 0;
  if (99 < param_1) {
    param_1 = 100;
  }
  if (param_1 < 3) {
    param_1 = 2;
  }
  theFunc._32_4_ = param_1;
  return;
}



### FUNC setEmissivity @ 0002f448

/* Controller::setEmissivity(int, int) */

Controller * __thiscall Controller::setEmissivity(Controller *this,int param_1,int param_2)

{
  undefined4 uVar1;
  
  if ((uint)param_1 < 0x65) {
    uVar1 = __floatsisf(param_2);
    theFunc._128_4_ = __mulsf3(uVar1,0x3a83126f);
    uVar1 = __floatsisf(param_1);
    this = (Controller *)__mulsf3(uVar1,0x3c23d70a);
    theFunc._124_4_ = this;
  }
  return this;
}



### FUNC SetColorPalette @ 0002f484

/* Controller::SetColorPalette(ColorPalette) */

void Controller::SetColorPalette(void)

{
  CFunctions::SetColorPalette((CFunctions *)theFunc);
  return;
}



### FUNC setColorbarSize @ 0002f498

/* Controller::setColorbarSize(int, int) */

void __thiscall Controller::setColorbarSize(Controller *this,int param_1,int param_2)

{
  *(int *)(this + 0x38) = param_1;
  *(int *)(this + 0x3c) = param_2;
  return;
}



### FUNC SetExtParameter @ 0002f4a0

/* Controller::SetExtParameter(struct_ExtrinsicPara) */

undefined4
Controller::SetExtParameter
          (undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)

{
  undefined4 in_lr;
  undefined4 local_c;
  undefined4 uStack_8;
  undefined4 uStack_4;
  
  local_c = param_2;
  uStack_8 = param_3;
  uStack_4 = param_4;
  __aeabi_memcpy4(0x6b90c,&local_c,0x74);
  return in_lr;
}



### FUNC getExtParameter @ 0002f4cc

/* Controller::getExtParameter(struct_ExtrinsicPara&) */

void __thiscall Controller::getExtParameter(Controller *this,struct_ExtrinsicPara *param_1)

{
  __aeabi_memcpy4(param_1,0x6b90c,0x74);
  return;
}



### FUNC IsOutputDataReady @ 0002f4e8

/* Controller::IsOutputDataReady() */

undefined4 Controller::IsOutputDataReady(void)

{
  return theFunc._172_4_;
}



### FUNC SaveDDT @ 0002f4f8

/* Controller::SaveDDT(char const*) */

void __thiscall Controller::SaveDDT(Controller *this,char *param_1)

{
  int iVar1;
  undefined4 *puVar2;
  char *__format;
  undefined4 uVar3;
  OFStream aOStack_394 [8];
  undefined4 local_38c;
  undefined4 local_388;
  int local_384;
  int local_380;
  undefined4 local_37c;
  undefined4 local_378;
  undefined4 local_374;
  undefined4 local_370;
  undefined1 auStack_36c [8];
  undefined4 local_364;
  undefined4 local_360;
  char local_35c [64];
  time_t local_31c;
  int local_318;
  undefined4 local_314;
  undefined1 auStack_2fc [556];
  undefined4 local_d0;
  undefined4 local_cc;
  undefined4 local_c8;
  undefined4 local_c4;
  undefined4 local_c0;
  undefined4 local_bc;
  undefined4 local_b8;
  undefined4 local_b4;
  undefined4 local_b0;
  undefined4 local_ac;
  undefined4 local_a8;
  undefined4 local_a4;
  undefined4 local_a0;
  undefined4 local_9c;
  undefined4 local_98;
  int local_18;
  
  local_18 = __stack_chk_guard;
  if (theFunc._172_4_ == 0) {
    puVar2 = (undefined4 *)__errno();
    *puVar2 = 0xe4ae0006;
    uVar3 = 0;
    goto LAB_0002f67a;
  }
  __aeabi_memclr4(auStack_36c,0x354);
  local_388 = 0x10002;
  local_38c = 0x374;
  local_384 = *(int *)(this + 0x28);
  local_380 = *(int *)(this + 0x2c);
  local_31c = time((time_t *)0x0);
  local_318 = local_31c >> 0x1f;
  uVar3 = *(undefined4 *)(this + 0x498);
  local_378 = theFunc._20736_4_;
  local_37c = theFunc._20732_4_;
  local_370 = theFunc._64_4_;
  local_374 = theFunc._68_4_;
  local_360 = 0;
  local_364 = 0;
  iVar1 = *(int *)(this + 0x49c);
  local_314 = uVar3;
  if (iVar1 == 2) {
    builtin_strncpy(local_35c + 4,"C3P",4);
    builtin_strncpy(local_35c,"MAG-",4);
    __format = "MAG-C3P-%d";
LAB_0002f5c4:
    sprintf(local_35c,__format,uVar3);
  }
  else {
    if (iVar1 == 1) {
      __aeabi_memcpy(local_35c,"MAG-C3",7);
      __format = "MAG-C3-%d";
      goto LAB_0002f5c4;
    }
    if (iVar1 == 0) {
      __aeabi_memcpy(local_35c,"MAG-C1",7);
      __format = "MAG-C1-%d";
      goto LAB_0002f5c4;
    }
  }
  if ((uint)theFunc._104_4_ < (uint)theFunc._12588_4_) {
    __aeabi_memcpy4(auStack_2fc,theFunc._104_4_ * 0x21c + 0x6ea38);
  }
  local_d0 = *(undefined4 *)(this + 0x18);
  local_cc = 0;
  local_b4 = theFunc._12_4_;
  local_b0 = theFunc._16_4_;
  local_ac = theFunc._20_4_;
  local_a8 = theFunc._24_4_;
  local_a4 = theFunc._28_4_;
  local_a0 = theFunc._32_4_;
  local_b8 = theFunc._120_4_;
  local_c8 = theFunc._124_4_;
  local_bc = theFunc._160_4_;
  local_c4 = theFunc._128_4_;
  local_c0 = theFunc._156_4_;
  local_9c = theFunc._44_4_;
  local_98 = theFunc._48_4_;
  OFStream::OFStream(aOStack_394,param_1,false);
  OFStream::Write(aOStack_394,&local_38c,0x374,1);
  OFStream::Write(aOStack_394,(void *)theFunc._180_4_,local_380 * local_384 * 2,1);
  IFStream::~IFStream((IFStream *)aOStack_394);
  uVar3 = 1;
LAB_0002f67a:
  if (__stack_chk_guard != local_18) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail(uVar3);
  }
  return;
}



### FUNC GetTemperature @ 0002f734

/* Controller::GetTemperature(unsigned int, unsigned int, int) */

void __thiscall Controller::GetTemperature(Controller *this,uint param_1,uint param_2,int param_3)

{
  uint uVar1;
  
  uVar1 = Client2Buffer(this,param_1);
  CFunctions::GetTemperature((CFunctions *)theFunc,uVar1,param_2,param_3);
  return;
}



### FUNC Client2Buffer @ 0002f758

/* Controller::Client2Buffer(int) */

int __thiscall Controller::Client2Buffer(Controller *this,int param_1)

{
  int iVar1;
  int extraout_r1;
  int iVar2;
  int iVar3;
  
  iVar2 = *(int *)(this + 0x28);
  iVar3 = *(int *)(this + 0x2c);
  if (theFunc._116_4_ == 0x5a) {
    iVar1 = __divsi3(param_1,iVar3);
    iVar1 = (param_1 - iVar1 * iVar3) * iVar2 + iVar1;
  }
  else if (theFunc._116_4_ == 0xb4) {
    __aeabi_idivmod(param_1,iVar2);
    iVar1 = param_1 + iVar2 + extraout_r1 * -2 + -1;
  }
  else if (theFunc._116_4_ == 0x10e) {
    iVar1 = __divsi3(param_1,iVar3);
    iVar1 = ((iVar2 + -1) - iVar1) + iVar2 * (iVar3 + (param_1 ^ 0xffffffffU) + iVar1 * iVar3);
  }
  else {
    iVar1 = __divsi3(param_1,iVar2);
    iVar1 = iVar2 * (iVar3 + -1 + iVar1 * -2) + param_1;
  }
  return iVar1;
}



### FUNC GetOutputBMPData @ 0002f7e0

/* Controller::GetOutputBMPData(unsigned int*, int) */

undefined4 __thiscall Controller::GetOutputBMPData(Controller *this,uint *param_1,int param_2)

{
  bool bVar1;
  undefined4 uVar2;
  byte *pbVar3;
  uint *puVar4;
  int iVar5;
  byte *pbVar6;
  uint *puVar7;
  int iVar8;
  int iVar9;
  
  iVar8 = *(int *)(this + 0x28);
  iVar9 = *(int *)(this + 0x2c);
  iVar5 = iVar8 * iVar9 * 4;
  uVar2 = 0;
  if (iVar5 - param_2 == 0 || iVar5 < param_2) {
    pbVar3 = (byte *)CFunctions::GetOriginalBMPDataPointer((CFunctions *)theFunc);
    uVar2 = 1;
    if (0 < iVar9) {
      puVar4 = param_1 + (iVar9 + -1) * iVar8;
      iVar5 = iVar9 + -1;
      do {
        pbVar6 = pbVar3;
        if (iVar8 != 0) {
          pbVar6 = pbVar3 + iVar8;
          puVar7 = puVar4;
          iVar9 = iVar8;
          do {
            *puVar7 = *(uint *)(theFunc + (uint)*pbVar3 * 4 + 0x24f4) | 0xff000000;
            puVar7 = puVar7 + 1;
            iVar9 = iVar9 + -1;
            pbVar3 = pbVar3 + 1;
          } while (iVar9 != 0);
          puVar4 = puVar4 + iVar8;
        }
        puVar4 = puVar4 + iVar8 * -2;
        bVar1 = 0 < iVar5;
        pbVar3 = pbVar6;
        iVar5 = iVar5 + -1;
      } while (bVar1);
      uVar2 = 1;
    }
  }
  return uVar2;
}



### FUNC GetOutputColorBarData @ 0002f878

/* Controller::GetOutputColorBarData(unsigned int*, int) */

undefined4 __thiscall Controller::GetOutputColorBarData(Controller *this,uint *param_1,int param_2)

{
  bool bVar1;
  uint *puVar2;
  int iVar3;
  uint uVar4;
  int iVar5;
  uint uVar6;
  undefined4 uVar7;
  
  uVar6 = *(uint *)(this + 0x38);
  uVar4 = uVar6 * *(int *)(this + 0x3c) * 4;
  uVar7 = 0;
  if (uVar4 < (uint)param_2 || uVar4 - param_2 == 0) {
    iVar3 = *(int *)(this + 0x3c) + -1;
    uVar7 = 1;
    if (-1 < iVar3) {
      puVar2 = param_1 + iVar3 * uVar6;
      iVar5 = theFunc._200_4_;
      do {
        if (uVar6 == 0) {
          uVar6 = 0;
        }
        else {
          uVar4 = 0;
          do {
            *puVar2 = *(uint *)(theFunc + (uint)*(byte *)(iVar5 + uVar4) * 4 + 0x291c) | 0xff000000;
            puVar2 = puVar2 + 1;
            uVar4 = uVar4 + 1;
            uVar6 = *(uint *)(this + 0x38);
          } while (uVar4 < uVar6);
          iVar5 = iVar5 + uVar4;
        }
        puVar2 = puVar2 + uVar6 * -2;
        bVar1 = 0 < iVar3;
        iVar3 = iVar3 + -1;
      } while (bVar1);
      uVar7 = 1;
    }
  }
  return uVar7;
}



### FUNC GetStatePointer @ 0002f900

/* Controller::GetStatePointer(struct_State*) */

undefined4 __thiscall Controller::GetStatePointer(Controller *this,struct_State *param_1)

{
  undefined4 uVar1;
  
  __aeabi_memcpy4(param_1,0x6fd90,0xc68);
  uVar1 = Buffer2Client(this,*(int *)(param_1 + 0x28));
  *(undefined4 *)(param_1 + 0x28) = uVar1;
  uVar1 = Buffer2Client(this,*(int *)(param_1 + 0x2c));
  *(undefined4 *)(param_1 + 0x2c) = uVar1;
  uVar1 = Buffer2Client(this,*(int *)(param_1 + 0x30));
  *(undefined4 *)(param_1 + 0x30) = uVar1;
  return 1;
}



### FUNC Lock @ 0002f948

/* Controller::Lock() */

void Controller::Lock(void)

{
  pthread_mutex_lock((pthread_mutex_t *)(theFunc + 0xb0));
  return;
}



### FUNC Unlock @ 0002f960

/* Controller::Unlock() */

void Controller::Unlock(void)

{
  pthread_mutex_unlock((pthread_mutex_t *)(theFunc + 0xb0));
  return;
}



### FUNC SampleTemperatures @ 0002f978

/* Controller::SampleTemperatures() */

void __thiscall Controller::SampleTemperatures(Controller *this)

{
  undefined4 uVar1;
  Controller *pCVar2;
  int iVar3;
  uint uVar4;
  uint uVar5;
  int iVar6;
  float extraout_s0;
  float extraout_s0_00;
  float extraout_s0_01;
  float extraout_s0_02;
  float fVar7;
  
  pthread_mutex_lock((pthread_mutex_t *)(this + 0x4a0));
  pthread_mutex_lock((pthread_mutex_t *)(theFunc + 0xb0));
  if (*(int *)(this + 0x488) != 0) {
    iVar6 = 0;
    uVar5 = 0;
    fVar7 = extraout_s0;
    do {
      iVar3 = *(int *)(this + iVar6 + 0xb0);
      *(uint *)(this + iVar6 + 0xb0) = iVar3 + 1U;
      *(int *)(this + iVar6 + 0xb8) = *(int *)(this + iVar6 + 0xb8) + 1;
      if (*(uint *)(this + iVar6 + 0x90) <= iVar3 + 1U) {
        *(undefined4 *)(this + iVar6 + 0xb0) = 0;
        if (uVar5 == 2) {
          *(undefined4 *)(this + 300) = theFunc._17584_4_;
          pCVar2 = this + 0x170;
          uVar1 = theFunc._17568_4_;
          if (*(int *)(this + 0x10) != 0) {
            uVar1 = CFunctions::CorrectTemperature((int)theFunc,fVar7,theFunc._17568_4_);
            fVar7 = extraout_s0_01;
          }
LAB_0002fab4:
          *(undefined4 *)pCVar2 = uVar1;
LAB_0002fad6:
          iVar3 = *(int *)(this + iVar6 + 0x98);
          *(int *)(this + iVar6 + 0x9c) = iVar3;
          *(int *)(this + iVar6 + 0xa0) = iVar3;
          *(int *)(this + iVar6 + 0xa4) = iVar3;
        }
        else {
          if (uVar5 == 1) {
            *(undefined4 *)(this + 0xc0) = theFunc._17588_4_;
            pCVar2 = this + 0x104;
            uVar1 = theFunc._17572_4_;
            if (*(int *)(this + 0x10) != 0) {
              uVar1 = CFunctions::CorrectTemperature((int)theFunc,fVar7,theFunc._17572_4_);
              fVar7 = extraout_s0_02;
            }
            goto LAB_0002fab4;
          }
          if (uVar5 == 0) {
            *(undefined4 *)(this + 0x54) = theFunc._17592_4_;
            uVar1 = theFunc._17576_4_;
            if (*(int *)(this + 0x10) != 0) {
              uVar1 = CFunctions::CorrectTemperature((int)theFunc,fVar7,theFunc._17576_4_);
              fVar7 = extraout_s0_00;
            }
            *(undefined4 *)(this + 0x98) = uVar1;
            goto LAB_0002fad6;
          }
          fVar7 = (float)SampleProbe(this,uVar5);
          if ((*(uint *)(this + iVar6 + 0x50) < 8) &&
             ((1 << (*(uint *)(this + iVar6 + 0x50) & 0xff) & 0xc1U) != 0)) goto LAB_0002fad6;
          iVar3 = *(int *)(this + iVar6 + 0x98);
        }
        uVar4 = 0;
        if (*(int *)(this + iVar6 + 0xa8) <= iVar3) {
          uVar4 = (uint)(iVar3 <= *(int *)(this + iVar6 + 0xac));
        }
        *(uint *)(this + iVar6 + 0xb4) = uVar4;
      }
      iVar6 = iVar6 + 0x6c;
      uVar5 = uVar5 + 1;
    } while (uVar5 < *(uint *)(this + 0x488));
  }
  pthread_mutex_unlock((pthread_mutex_t *)(theFunc + 0xb0));
  pthread_mutex_unlock((pthread_mutex_t *)(this + 0x4a0));
  return;
}



### FUNC SampleProbe @ 0002fb60

/* WARNING: Restarted to delay deadcode elimination for space: stack */
/* Controller::SampleProbe(int) */

void __thiscall Controller::SampleProbe(Controller *this,int param_1)

{
  int iVar1;
  int iVar2;
  uint uVar3;
  uint *puVar4;
  uint uVar5;
  int iVar6;
  uint uVar7;
  uint uVar8;
  uint uVar9;
  uint uVar10;
  int iVar11;
  float extraout_s0;
  float extraout_s0_00;
  float extraout_s0_01;
  float fVar12;
  float extraout_s0_02;
  float extraout_s0_03;
  float extraout_s0_04;
  float extraout_s0_05;
  float extraout_s0_06;
  float extraout_s0_07;
  uint *local_a30;
  uint local_a2c;
  uint local_a28;
  uint *local_a24;
  uint local_a20;
  uint local_a1c;
  uint *local_a18;
  uint local_a14;
  uint local_a10;
  int local_a0c [638];
  
  iVar1 = __stack_chk_guard;
  iVar2 = 0;
  if ((9 < param_1) || (*(int *)(this + 0x488) < param_1)) goto switchD_0002fbaa_default;
  iVar6 = param_1 * 0x6c;
  iVar11 = *(int *)(this + iVar6 + 0x50);
  switch(iVar11) {
  case 0:
    uVar10 = CFunctions::GetTemperature
                       ((CFunctions *)theFunc,*(uint *)(this + iVar6 + 0x54),
                        *(uint *)(this + iVar6 + 0x58),0);
    if (*(int *)(this + 0x10) != 0) {
      uVar10 = CFunctions::CorrectTemperature((int)theFunc,extraout_s0_04,uVar10);
    }
    *(uint *)(this + iVar6 + 0x98) = uVar10;
    iVar2 = 0;
    break;
  case 1:
    uVar10 = *(uint *)(this + 0x2c);
    if (*(uint *)(this + 0x2c) <= *(uint *)(this + 0x28)) {
      uVar10 = *(uint *)(this + 0x28);
    }
    iVar2 = CFunctions::GetLineTemperatureInfo2
                      ((CFunctions *)theFunc,(ushort *)&local_a18,uVar10 << 1,(int *)&local_a24,
                       *(uint *)(this + iVar6 + 0x5c),*(uint *)(this + iVar6 + 0x60),
                       *(uint *)(this + iVar6 + 100),*(uint *)(this + iVar6 + 0x68),0);
    if (0 < iVar2) {
      if (*(int *)(this + 0x10) == 0) {
        local_a30 = local_a24;
        local_a2c = local_a20;
        local_a28 = local_a1c;
        puVar4 = local_a24;
        uVar10 = local_a20;
      }
      else {
        puVar4 = (uint *)CFunctions::CorrectTemperature((int)theFunc,extraout_s0_05,(uint)local_a24)
        ;
        local_a30 = puVar4;
        uVar10 = CFunctions::CorrectTemperature((int)theFunc,extraout_s0_06,local_a20);
        local_a2c = uVar10;
        local_a28 = CFunctions::CorrectTemperature((int)theFunc,extraout_s0_07,local_a1c);
      }
      *(uint *)(this + iVar6 + 0xa0) = uVar10;
      *(uint **)(this + iVar6 + 0x9c) = puVar4;
      *(uint *)(this + iVar6 + 0xa4) = local_a28;
      if (*(int *)(this + iVar6 + 0x94) < 3) {
        puVar4 = (&local_a30)[*(int *)(this + iVar6 + 0x94)];
      }
      else {
        puVar4 = (uint *)(uVar10 - (int)puVar4);
      }
      *(uint **)(this + iVar6 + 0x98) = puVar4;
      *(undefined4 *)(this + iVar6 + 0x54) = 0;
    }
    iVar2 = 1;
    break;
  case 2:
  case 3:
  case 4:
  case 5:
    iVar2 = 0;
    if (iVar11 == 5) break;
    if (iVar11 == 2) {
      uVar8 = *(uint *)(this + iVar6 + 0x80);
      uVar3 = *(uint *)(this + iVar6 + 0x78);
      uVar9 = *(uint *)(this + iVar6 + 0x7c);
      uVar10 = *(uint *)(this + iVar6 + 0x84);
      uVar7 = uVar10;
      if ((int)uVar10 <= (int)uVar9) {
        uVar7 = uVar9;
      }
      uVar5 = uVar8;
      if ((int)uVar3 <= (int)uVar8) {
        uVar5 = uVar3;
      }
      if ((int)uVar9 <= (int)uVar10) {
        uVar10 = uVar9;
      }
      if ((int)uVar8 <= (int)uVar3) {
        uVar8 = uVar3;
      }
      iVar11 = CFunctions::GetRectTemperatureInfo
                         ((CFunctions *)theFunc,uVar5,uVar10,uVar8,uVar7,(int *)&local_a18,0);
      fVar12 = extraout_s0;
    }
    else {
      uVar8 = *(uint *)(this + iVar6 + 0x80);
      uVar3 = *(uint *)(this + iVar6 + 0x78);
      uVar9 = *(uint *)(this + iVar6 + 0x7c);
      uVar10 = *(uint *)(this + iVar6 + 0x84);
      uVar7 = uVar10;
      if ((int)uVar10 <= (int)uVar9) {
        uVar7 = uVar9;
      }
      uVar5 = uVar8;
      if ((int)uVar3 <= (int)uVar8) {
        uVar5 = uVar3;
      }
      if ((int)uVar9 <= (int)uVar10) {
        uVar10 = uVar9;
      }
      if ((int)uVar8 <= (int)uVar3) {
        uVar8 = uVar3;
      }
      iVar11 = CFunctions::GetEllipseTemperatureInfo
                         ((CFunctions *)theFunc,uVar5,uVar10,uVar8,uVar7,(int *)&local_a18,0);
      fVar12 = extraout_s0_01;
    }
    iVar2 = 0;
    if (iVar11 == 0) break;
    if (*(int *)(this + 0x10) == 0) {
      local_a24 = local_a18;
      local_a20 = local_a14;
      puVar4 = local_a18;
      uVar10 = local_a14;
    }
    else {
      puVar4 = (uint *)CFunctions::CorrectTemperature((int)theFunc,fVar12,(uint)local_a18);
      local_a24 = puVar4;
      uVar10 = CFunctions::CorrectTemperature((int)theFunc,extraout_s0_02,local_a14);
      local_a20 = uVar10;
      local_a10 = CFunctions::CorrectTemperature((int)theFunc,extraout_s0_03,local_a10);
    }
    local_a1c = local_a10;
    *(uint *)(this + iVar6 + 0xa0) = uVar10;
    *(uint **)(this + iVar6 + 0x9c) = puVar4;
    *(uint *)(this + iVar6 + 0xa4) = local_a10;
    iVar2 = *(int *)(this + iVar6 + 0x94);
    if (iVar2 < 3) {
      *(uint **)(this + iVar6 + 0x98) = (&local_a24)[iVar2];
      if (iVar2 == 2) goto LAB_0002fef8;
      iVar2 = local_a0c[iVar2];
    }
    else {
      *(uint *)(this + iVar6 + 0x98) = uVar10 - (int)puVar4;
LAB_0002fef8:
      iVar2 = ((*(int *)(this + iVar6 + 0x7c) + *(int *)(this + iVar6 + 0x84)) / 2) *
              *(int *)(this + 0x28) +
              (*(int *)(this + iVar6 + 0x78) + *(int *)(this + iVar6 + 0x80)) / 2;
    }
    *(int *)(this + iVar6 + 0x54) = iVar2;
    iVar2 = iVar11;
    break;
  case 6:
  case 7:
    if (*(int *)(this + iVar6 + 0x74) == 0) {
      local_a14 = 0;
      local_a18 = &switchD_0002fbaa::switchdataD_0002fbac;
    }
    else {
      uVar10 = 0;
      do {
        iVar2 = uVar10 * 8 + iVar6;
        puVar4 = (uint *)CFunctions::GetTemperature
                                   ((CFunctions *)theFunc,
                                    *(int *)(this + iVar2 + 0x60) * *(int *)(this + 0x28) +
                                    *(int *)(this + iVar2 + 0x5c),*(uint *)(this + iVar6 + 0x58),0);
        if (*(int *)(this + 0x10) != 0) {
          puVar4 = (uint *)CFunctions::CorrectTemperature((int)theFunc,extraout_s0_00,(uint)puVar4);
        }
        (&local_a18)[uVar10] = puVar4;
        uVar10 = uVar10 + 1;
      } while (uVar10 < *(uint *)(this + iVar6 + 0x74));
      iVar11 = *(int *)(this + iVar6 + 0x50);
    }
    uVar10 = (int)((int)local_a18 - local_a14) >> 0x1f;
    uVar10 = ((int)local_a18 - local_a14) + uVar10 ^ uVar10;
    if (iVar11 == 7) {
      uVar7 = (int)((int)local_a18 - local_a10) >> 0x1f;
      uVar7 = ((int)local_a18 - local_a10) + uVar7 ^ uVar7;
      uVar8 = (int)(local_a14 - local_a10) >> 0x1f;
      uVar8 = (local_a14 - local_a10) + uVar8 ^ uVar8;
      if ((int)uVar8 <= (int)uVar10) {
        uVar8 = uVar10;
      }
      uVar10 = uVar7;
      if ((int)uVar7 <= (int)uVar8) {
        uVar10 = uVar8;
      }
    }
    *(uint *)(this + iVar6 + 0x98) = uVar10;
    iVar2 = 0;
  }
switchD_0002fbaa_default:
  if (__stack_chk_guard != iVar1) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail(iVar2);
  }
  return;
}



### FUNC DeleteProbe @ 0002ff98

/* Controller::DeleteProbe(unsigned int) */

undefined4 __thiscall Controller::DeleteProbe(Controller *this,uint param_1)

{
  pthread_mutex_t *__mutex;
  uint uVar1;
  Controller *pCVar2;
  uint uVar3;
  
  __mutex = (pthread_mutex_t *)(this + 0x4a0);
  pthread_mutex_lock(__mutex);
  if (2 < param_1) {
    uVar1 = *(uint *)(this + 0x488);
    uVar3 = param_1 + 1;
    if (uVar3 <= uVar1) {
      if (uVar3 < uVar1) {
        pCVar2 = this + param_1 * 0x6c + 0xbc;
        do {
          __aeabi_memcpy4(pCVar2 + -0x6c,pCVar2,0x6c);
          pCVar2 = pCVar2 + 0x6c;
          uVar3 = uVar3 + 1;
          uVar1 = *(uint *)(this + 0x488);
        } while (uVar3 < uVar1);
      }
      *(uint *)(this + 0x488) = uVar1 - 1;
      pthread_mutex_unlock(__mutex);
      return 1;
    }
  }
  pthread_mutex_unlock(__mutex);
  return 0;
}



### FUNC EditProbe @ 0002fffc

/* Controller::EditProbe(unsigned int, unsigned int, unsigned int, unsigned int, float, unsigned
   int, int, int, int, int) */

undefined4
Controller::EditProbe
          (uint param_1,uint param_2,uint param_3,uint param_4,float param_5,uint param_6,
          int param_7,int param_8,int param_9,int param_10)

{
  pthread_mutex_t *__mutex;
  uint uVar1;
  uint extraout_r1;
  int iVar2;
  undefined4 uVar3;
  undefined4 in_stack_00000014;
  
  __mutex = (pthread_mutex_t *)(param_1 + 0x4a0);
  uVar3 = *(undefined4 *)(param_1 + 0x28);
  pthread_mutex_lock(__mutex);
  uVar1 = __udivsi3(param_3,uVar3);
  if ((((param_2 < *(uint *)(param_1 + 0x488)) &&
       (__aeabi_uidivmod(param_3,uVar3), extraout_r1 < *(uint *)(param_1 + 0x28))) && (param_6 != 0)
      ) && (uVar1 < *(uint *)(param_1 + 0x2c))) {
    iVar2 = param_1 + param_2 * 0x6c;
    *(uint *)(iVar2 + 0x90) = param_6;
    *(int *)(iVar2 + 0x8c) = param_7;
    *(int *)(iVar2 + 0x88) = param_8;
    *(int *)(iVar2 + 0x94) = param_9;
    *(int *)(iVar2 + 0xa8) = param_10;
    *(undefined4 *)(iVar2 + 0xac) = in_stack_00000014;
    *(uint *)(iVar2 + 0x54) = param_3;
    *(uint *)(iVar2 + 0x58) = param_4;
    pthread_mutex_unlock(__mutex);
    SampleProbe((Controller *)param_1,param_2);
    uVar3 = 1;
  }
  else {
    pthread_mutex_unlock(__mutex);
    uVar3 = 0;
  }
  return uVar3;
}



### FUNC SaveDDT @ 000300aa

/* Controller::SaveDDT() */

void Controller::SaveDDT(void)

{
  return;
}



### FUNC Buffer2Client @ 000300ac

/* Controller::Buffer2Client(int, int&, int&) */

void __thiscall Controller::Buffer2Client(Controller *this,int param_1,int *param_2,int *param_3)

{
  uint uVar1;
  uint uVar2;
  int iVar3;
  
  iVar3 = *(int *)(this + 0x28);
  uVar1 = __udivsi3(param_1,iVar3);
  uVar2 = param_1 - uVar1 * iVar3;
  if (theFunc._116_4_ == 0x5a) {
LAB_00030102:
    *param_2 = uVar1;
    *param_3 = uVar2;
    iVar3 = *(int *)(this + 0x28);
  }
  else if (theFunc._116_4_ != 0xb4) {
    if (theFunc._116_4_ == 0x10e) goto LAB_0003011c;
    *param_2 = uVar2;
    *param_3 = *(int *)(this + 0x2c) + (uVar1 ^ 0xffffffff);
    goto LAB_00030102;
  }
  *param_2 = iVar3 + (uVar2 ^ 0xffffffff);
  *param_3 = uVar1;
LAB_0003011c:
  *param_2 = *(int *)(this + 0x2c) + (uVar1 ^ 0xffffffff);
  *param_3 = *(int *)(this + 0x28) + (uVar2 ^ 0xffffffff);
  return;
}



### FUNC Buffer2Client @ 00030138

/* Controller::Buffer2Client(int, int, int&, int&) */

void __thiscall
Controller::Buffer2Client(Controller *this,int param_1,int param_2,int *param_3,int *param_4)

{
  if (theFunc._116_4_ == 0x5a) {
    *param_3 = param_2;
    param_2 = param_1;
  }
  else if (theFunc._116_4_ == 0xb4) {
    *param_3 = *(int *)(this + 0x28) + (param_1 ^ 0xffffffffU);
  }
  else if (theFunc._116_4_ == 0x10e) {
    *param_3 = *(int *)(this + 0x2c) + (param_2 ^ 0xffffffffU);
    param_2 = *(int *)(this + 0x28) + (param_1 ^ 0xffffffffU);
  }
  else {
    *param_3 = param_1;
    param_2 = *(int *)(this + 0x2c) + (param_2 ^ 0xffffffffU);
  }
  *param_4 = param_2;
  return;
}



### FUNC clientPos2ClientXY @ 00030194

/* Controller::clientPos2ClientXY(int, int&, int&) */

void __thiscall
Controller::clientPos2ClientXY(Controller *this,int param_1,int *param_2,int *param_3)

{
  int iVar1;
  Controller *pCVar2;
  
  if ((int)theFunc._116_4_ < 0xb4) {
    if (theFunc._116_4_ == 0) {
LAB_000301c0:
      pCVar2 = this + 0x28;
      goto LAB_000301ce;
    }
    if (theFunc._116_4_ != 0x5a) {
      return;
    }
  }
  else if (theFunc._116_4_ != 0x10e) {
    if (theFunc._116_4_ != 0xb4) {
      return;
    }
    goto LAB_000301c0;
  }
  pCVar2 = this + 0x2c;
LAB_000301ce:
  iVar1 = __udivsi3(param_1,*(undefined4 *)pCVar2);
  *param_3 = iVar1;
  *param_2 = param_1 - iVar1 * *(int *)pCVar2;
  return;
}



### FUNC clientPos2ScreenXY @ 000301ec

/* Controller::clientPos2ScreenXY(int, int, int, int&, int&) */

void __thiscall
Controller::clientPos2ScreenXY
          (Controller *this,int param_1,int param_2,int param_3,int *param_4,int *param_5)

{
  undefined4 uVar1;
  undefined1 *puVar2;
  int iVar3;
  int iVar4;
  Controller *pCVar5;
  
  uVar1 = theFunc._116_4_;
  puVar2 = theFunc;
  iVar4 = param_3;
  if ((int)theFunc._116_4_ < 0xb4) {
    if (theFunc._116_4_ == 0) {
LAB_00030218:
      pCVar5 = this + 0x28;
      goto LAB_00030226;
    }
    if (theFunc._116_4_ == 0x5a) goto LAB_00030220;
  }
  else {
    puVar2 = (undefined1 *)0x10e;
    if (theFunc._116_4_ != 0x10e) {
      if (theFunc._116_4_ != 0xb4) goto LAB_0003023c;
      goto LAB_00030218;
    }
LAB_00030220:
    pCVar5 = this + 0x2c;
LAB_00030226:
    iVar3 = *(int *)pCVar5;
    iVar4 = __udivsi3(param_1,iVar3);
    puVar2 = (undefined1 *)(param_1 - iVar4 * iVar3);
  }
LAB_0003023c:
  if ((int)uVar1 < 0xb4) {
    if (uVar1 == 0) {
LAB_00030258:
      iVar3 = __udivsi3((int)puVar2 * param_2,*(undefined4 *)(this + 0x28));
      *param_4 = iVar3;
      pCVar5 = this + 0x2c;
      goto LAB_0003027e;
    }
    if (uVar1 != 0x5a) {
      return;
    }
  }
  else if (uVar1 != 0x10e) {
    if (uVar1 != 0xb4) {
      return;
    }
    goto LAB_00030258;
  }
  iVar3 = __udivsi3((int)puVar2 * param_2,*(undefined4 *)(this + 0x2c));
  *param_4 = iVar3;
  pCVar5 = this + 0x28;
LAB_0003027e:
  iVar4 = __udivsi3(iVar4 * param_3,*(undefined4 *)pCVar5);
  *param_5 = iVar4;
  return;
}



### FUNC clientXY2ScreenXY @ 00030294

/* Controller::clientXY2ScreenXY(int, int, int, int, int&, int&) */

void __thiscall
Controller::clientXY2ScreenXY
          (Controller *this,int param_1,int param_2,int param_3,int param_4,int *param_5,
          int *param_6)

{
  int iVar1;
  Controller *pCVar2;
  
  if ((int)theFunc._116_4_ < 0xb4) {
    if (theFunc._116_4_ == 0) {
LAB_000302c2:
      iVar1 = __udivsi3(param_3 * param_1,*(undefined4 *)(this + 0x28));
      *param_5 = iVar1;
      pCVar2 = this + 0x2c;
      goto LAB_000302e4;
    }
    if (theFunc._116_4_ != 0x5a) {
      return;
    }
  }
  else if (theFunc._116_4_ != 0x10e) {
    if (theFunc._116_4_ != 0xb4) {
      return;
    }
    goto LAB_000302c2;
  }
  iVar1 = __udivsi3(param_3 * param_1,*(undefined4 *)(this + 0x2c));
  *param_5 = iVar1;
  pCVar2 = this + 0x28;
LAB_000302e4:
  iVar1 = __udivsi3(param_4 * param_2,*(undefined4 *)pCVar2);
  *param_6 = iVar1;
  return;
}



### FUNC screenXY2ClientXY @ 000302fc

/* Controller::screenXY2ClientXY(int, int, int, int, int&, int&) */

void __thiscall
Controller::screenXY2ClientXY
          (Controller *this,int param_1,int param_2,int param_3,int param_4,int *param_5,
          int *param_6)

{
  int iVar1;
  int iVar2;
  int iVar3;
  int iVar4;
  
  iVar3 = *(int *)(this + 0x28);
  iVar4 = *(int *)(this + 0x2c);
  if ((int)theFunc._116_4_ < 0xb4) {
    if (theFunc._116_4_ == 0) {
LAB_00030338:
      iVar1 = __divsi3(iVar3 * param_1,param_3);
      *param_5 = iVar1;
      iVar1 = __divsi3(iVar4 * param_2,param_4);
      *param_6 = iVar1;
      iVar2 = 0;
      if (*param_5 < 0) {
LAB_0003036a:
        *param_5 = iVar2;
        iVar1 = *param_6;
      }
      else if (iVar3 <= *param_5) {
        iVar2 = iVar3 + -1;
        goto LAB_0003036a;
      }
      if (iVar1 < 0) goto LAB_000303be;
      iVar3 = iVar4;
      if (iVar1 < iVar4) {
        return;
      }
      goto LAB_000303b8;
    }
    if (theFunc._116_4_ != 0x5a) {
      return;
    }
  }
  else if (theFunc._116_4_ != 0x10e) {
    if (theFunc._116_4_ != 0xb4) {
      return;
    }
    goto LAB_00030338;
  }
  iVar1 = __divsi3(iVar4 * param_1,param_3);
  *param_5 = iVar1;
  iVar1 = __divsi3(iVar3 * param_2,param_4);
  *param_6 = iVar1;
  iVar2 = 0;
  if (*param_5 < 0) {
LAB_000303a6:
    *param_5 = iVar2;
    iVar1 = *param_6;
  }
  else if (iVar4 <= *param_5) {
    iVar2 = iVar4 + -1;
    goto LAB_000303a6;
  }
  if (iVar1 < 0) {
LAB_000303be:
    *param_6 = 0;
    return;
  }
  if (iVar1 < iVar3) {
    return;
  }
LAB_000303b8:
  *param_6 = iVar3 + -1;
  return;
}



### FUNC sensorXY2ScreenXY @ 000303cc

/* Controller::sensorXY2ScreenXY(int, int, int, int, int&, int&) */

void __thiscall
Controller::sensorXY2ScreenXY
          (Controller *this,int param_1,int param_2,int param_3,int param_4,int *param_5,
          int *param_6)

{
  int iVar1;
  Controller *pCVar2;
  
  if (theFunc._116_4_ != 0x5a) {
    if (theFunc._116_4_ != 0x10e) {
      if (theFunc._116_4_ == 0xb4) {
        param_1 = *(int *)(this + 0x28) + (param_1 ^ 0xffffffffU);
      }
      else {
        param_2 = *(int *)(this + 0x2c) + (param_2 ^ 0xffffffffU);
        if (theFunc._116_4_ != 0) {
          return;
        }
      }
      iVar1 = __udivsi3(param_1 * param_3,*(undefined4 *)(this + 0x28));
      *param_5 = iVar1;
      pCVar2 = this + 0x2c;
      param_1 = param_2;
      goto LAB_0003043e;
    }
    param_1 = *(int *)(this + 0x28) + (param_1 ^ 0xffffffffU);
    param_2 = *(int *)(this + 0x2c) + (param_2 ^ 0xffffffffU);
  }
  iVar1 = __udivsi3(param_2 * param_3,*(undefined4 *)(this + 0x2c));
  *param_5 = iVar1;
  pCVar2 = this + 0x28;
LAB_0003043e:
  iVar1 = __udivsi3(param_1 * param_4,*(undefined4 *)pCVar2);
  *param_6 = iVar1;
  return;
}



### FUNC screenXY2SensorXY @ 00030454

/* Controller::screenXY2SensorXY(int, int, int, int, int&, int&) */

void __thiscall
Controller::screenXY2SensorXY
          (Controller *this,int param_1,int param_2,int param_3,int param_4,int *param_5,
          int *param_6)

{
  int local_1c;
  int local_18;
  int local_14;
  
  local_14 = __stack_chk_guard;
  screenXY2ClientXY(this,param_1,param_2,param_3,param_4,&local_18,&local_1c);
  Client2Buffer(this,local_18,local_1c,param_5,param_6);
  if (__stack_chk_guard == local_14) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}



### FUNC FUN_000304ac @ 000304ac

void FUN_000304ac(void)

{
  FUN_00030670();
  return;
}



### FUNC FUN_000304b6 @ 000304b6

void FUN_000304b6(void *param_1)

{
  FUN_00030670();
  operator_delete(param_1);
  return;
}



### FUNC FUN_0003057c @ 0003057c

bool FUN_0003057c(undefined4 param_1,undefined4 param_2,undefined4 *param_3,undefined4 *param_4)

{
  int iVar1;
  undefined4 uVar2;
  
  iVar1 = FUN_0003186c();
  if (iVar1 == 1) {
    param_4[1] = param_2;
    *param_4 = 1;
    uVar2 = *param_3;
    *(undefined1 *)(param_4 + 4) = 1;
    param_4[2] = uVar2;
  }
  return iVar1 == 1;
}



### FUNC FUN_000305a4 @ 000305a4

bool FUN_000305a4(undefined4 param_1,undefined4 param_2,undefined4 *param_3,undefined4 *param_4)

{
  int iVar1;
  undefined4 uVar2;
  
  iVar1 = FUN_0003186c();
  if (iVar1 == 1) {
    param_4[1] = param_2;
    *param_4 = 1;
    uVar2 = *param_3;
    *(undefined1 *)(param_4 + 4) = 1;
    param_4[2] = uVar2;
  }
  return iVar1 == 1;
}



### FUNC FUN_000305cc @ 000305cc

undefined4 * FUN_000305cc(undefined4 *param_1,int param_2)

{
  int iVar1;
  
  *param_1 = 0;
  param_1[1] = 0;
  param_1[2] = 0;
  param_1[3] = 0;
  *(undefined1 *)(param_1 + 4) = 1;
  if ((param_2 != 0) &&
     (iVar1 = FUN_00030ba0(param_2,&PTR_PTR_FUN_00031728_1_00068ce4,&PTR_PTR_FUN_00031728_1_00068e6c
                           ,0), iVar1 != 0)) {
    param_1[3] = *(undefined4 *)(iVar1 + 8);
  }
  return param_1;
}



### FUNC FUN_00030610 @ 00030610

undefined4 FUN_00030610(undefined4 param_1)

{
  void *__addr;
  
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070a28);
  __addr = DAT_00070a2c;
  while (__addr != (void *)0x0) {
    DAT_00070a2c = *(void **)((int)__addr + DAT_00070a24);
    munmap(__addr,0x1000);
    __addr = DAT_00070a2c;
  }
  DAT_00070a2c = __addr;
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070a28);
  pthread_mutex_destroy((pthread_mutex_t *)&DAT_00070a28);
  pthread_key_delete(DAT_00070a18);
  return param_1;
}



### FUNC FUN_00030670 @ 00030670

void FUN_00030670(void)

{
  FUN_00031860();
  return;
}



### FUNC FUN_0003067c @ 0003067c

void FUN_0003067c(void)

{
                    /* WARNING: Subroutine does not return */
  FUN_00030e78("Pure virtual function called!");
}



### FUNC FUN_000306a8 @ 000306a8

void FUN_000306a8(void)

{
                    /* WARNING: Subroutine does not return */
  FUN_00030e78("Deleted virtual function called!");
}



### FUNC FUN_000306d8 @ 000306d8

int * FUN_000306d8(void)

{
  int iVar1;
  int *piVar2;
  undefined4 *puVar3;
  undefined4 *puVar4;
  undefined4 *puVar5;
  int iVar6;
  undefined4 *puVar7;
  
  piVar2 = (int *)pthread_getspecific(DAT_00070a18);
  if (piVar2 != (int *)0x0) {
    return piVar2;
  }
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070a28);
  piVar2 = DAT_00070a30;
  if (DAT_00070a30 == (int *)0x0) {
    piVar2 = (int *)0x0;
    puVar3 = (undefined4 *)mmap((void *)0x0,0x1000,3,0x22,-1,0);
    if (puVar3 == (undefined4 *)0xffffffff) goto LAB_0003076a;
    *(undefined4 **)((int)puVar3 + DAT_00070a24) = DAT_00070a2c;
    iVar1 = DAT_00070a1c;
    puVar5 = &DAT_00070a30;
    DAT_00070a2c = puVar3;
    if (DAT_00070a20 != 0) {
      puVar5 = (undefined4 *)((int)puVar3 + DAT_00070a1c * (DAT_00070a20 + -1));
      iVar6 = DAT_00070a20;
      puVar7 = &DAT_00070a30;
      do {
        puVar4 = puVar3;
        *puVar7 = puVar4;
        iVar6 = iVar6 + -1;
        puVar3 = (undefined4 *)((int)puVar4 + iVar1);
        puVar7 = puVar4;
      } while (iVar6 != 0);
    }
    *puVar5 = 0;
    piVar2 = DAT_00070a30;
  }
  DAT_00070a30 = (int *)*piVar2;
  __aeabi_memclr4(piVar2,DAT_00070a1c);
LAB_0003076a:
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070a28);
  if (piVar2 != (int *)0x0) {
    pthread_setspecific(DAT_00070a18,piVar2);
    return piVar2;
  }
                    /* WARNING: Subroutine does not return */
  FUN_00030e78("Can\'t allocate thread-specific C++ runtime info block.");
}



### FUNC FUN_0003080c @ 0003080c

void FUN_0003080c(void)

{
  pthread_getspecific(DAT_00070a18);
  return;
}



### FUNC FUN_00030824 @ 00030824

int FUN_00030824(int param_1)

{
  int iVar1;
  
  iVar1 = memalign(8,param_1 + 0x90);
  if (iVar1 != 0) {
    __aeabi_memclr8(iVar1,0x90);
    return iVar1 + 0x90;
  }
                    /* WARNING: Subroutine does not return */
  FUN_00030e78("Not enough memory to allocate exception!");
}



### FUNC FUN_00030880 @ 00030880

void FUN_00030880(int param_1)

{
  if (*(code **)(param_1 + -0x88) != (code *)0x0) {
    (**(code **)(param_1 + -0x88))();
  }
  free((void *)(param_1 + -0x90));
  return;
}



### FUNC FUN_000308d8 @ 000308d8

undefined4 FUN_000308d8(undefined4 *param_1)

{
  undefined4 *puVar1;
  int iVar2;
  undefined4 *puVar3;
  uint uVar4;
  bool bVar5;
  
  puVar1 = (undefined4 *)FUN_000306d8();
  iVar2 = FUN_00030ac0(*param_1,param_1[1]);
  puVar3 = (undefined4 *)*puVar1;
  if ((iVar2 == 0) && (bVar5 = puVar3 != (undefined4 *)0x0, puVar3 = (undefined4 *)0x0, bVar5)) {
                    /* WARNING: Subroutine does not return */
    FUN_00030e78("Can\'t handle non-C++ exception!");
  }
  uVar4 = (int)param_1[-8] >> 0x1f;
  param_1[-8] = (param_1[-8] + uVar4 ^ uVar4) + 1;
  if (puVar3 != param_1 + -0xe) {
    param_1[-9] = puVar3;
    *puVar1 = param_1 + -0xe;
  }
  puVar1[1] = puVar1[1] + -1;
  return param_1[-1];
}



### FUNC FUN_0003094c @ 0003094c

void FUN_0003094c(void)

{
  int *piVar1;
  int iVar2;
  int iVar3;
  int iVar4;
  
  piVar1 = (int *)FUN_0003080c();
  iVar4 = *piVar1;
  if (iVar4 != 0) {
    iVar2 = FUN_00030ac0(*(undefined4 *)(iVar4 + 0x38),*(undefined4 *)(iVar4 + 0x3c));
    if (iVar2 != 0) {
      iVar2 = *(int *)(iVar4 + 0x18);
      if (iVar2 < 0) {
        iVar3 = iVar2 + 1;
        if (iVar3 == 0) {
          *piVar1 = *(int *)(iVar4 + 0x14);
          *(undefined4 *)(iVar4 + 0x18) = 0;
          return;
        }
      }
      else {
        iVar3 = iVar2 + -1;
        if (iVar3 == 0) {
          *piVar1 = *(int *)(iVar4 + 0x14);
          FUN_00030880(iVar4 + 0x90);
          return;
        }
        if (iVar2 < 1) {
                    /* WARNING: Subroutine does not return */
          FUN_00030e78("Internal error during exception handling!");
        }
      }
      *(int *)(iVar4 + 0x18) = iVar3;
      return;
    }
    *piVar1 = 0;
    _Unwind_DeleteException(iVar4 + 0x38);
  }
  return;
}



### FUNC FUN_000309e0 @ 000309e0

void FUN_000309e0(int param_1,undefined4 param_2,undefined4 param_3,undefined1 param_4)

{
  int iVar1;
  int unaff_r5;
  code *UNRECOVERED_JUMPTABLE;
  
  *(undefined4 *)(param_1 + -0x8c) = param_2;
  *(undefined4 *)(param_1 + -0x88) = param_3;
  *(undefined4 *)(param_1 + -0x54) = 0x474e5543;
  *(undefined4 *)(param_1 + -0x58) = 0x432b2b00;
  *(undefined4 *)(param_1 + -0x50) = 0x30a09;
  iVar1 = FUN_00030a16();
  *(undefined1 *)(iVar1 + unaff_r5) = param_4;
                    /* WARNING: Could not recover jumptable at 0x000309fe. Too many branches */
                    /* WARNING: Treating indirect jump as call */
  (*UNRECOVERED_JUMPTABLE)();
  return;
}



### FUNC FUN_00030a08 @ 00030a08

void FUN_00030a08(undefined4 param_1,int param_2)

{
  FUN_00030880(param_2 + 0x58);
  return;
}



### FUNC FUN_00030a16 @ 00030a16

void FUN_00030a16(int param_1)

{
  int iVar1;
  undefined4 uVar2;
  
  iVar1 = FUN_000306d8();
  uVar2 = FUN_00031810();
  *(undefined4 *)(param_1 + 0xc) = uVar2;
  uVar2 = FUN_000317dc();
  *(undefined4 *)(param_1 + 0x10) = uVar2;
  *(int *)(iVar1 + 4) = *(int *)(iVar1 + 4) + 1;
  ___Unwind_RaiseException(param_1 + 0x38);
                    /* WARNING: Subroutine does not return */
  FUN_00030efc(param_1 + 0x38);
}



### FUNC FUN_00030a44 @ 00030a44

void FUN_00030a44(void)

{
  int *piVar1;
  int iVar2;
  int *extraout_r1;
  undefined1 uVar3;
  uint uVar4;
  int unaff_r5;
  code *UNRECOVERED_JUMPTABLE;
  
  piVar1 = (int *)FUN_000306d8();
  iVar2 = *piVar1;
  if (iVar2 == 0) {
                    /* WARNING: Subroutine does not return */
    FUN_00030e78("Attempting to rethrow an exception that doesn\'t exist!");
  }
  uVar4 = *(uint *)(iVar2 + 0x38) ^ 0x432b2b00 | *(uint *)(iVar2 + 0x3c) ^ 0x474e5543;
  if (uVar4 == 0) {
    *(int *)(iVar2 + 0x18) = -*(int *)(iVar2 + 0x18);
    FUN_00030a16();
    piVar1 = extraout_r1;
  }
  uVar3 = (undefined1)uVar4;
  *piVar1 = 0;
  iVar2 = FUN_00030a16();
  *(undefined1 *)(iVar2 + unaff_r5) = uVar3;
                    /* WARNING: Could not recover jumptable at 0x00030a82. Too many branches */
                    /* WARNING: Treating indirect jump as call */
  (*UNRECOVERED_JUMPTABLE)();
  return;
}



### FUNC FUN_00030ac0 @ 00030ac0

bool FUN_00030ac0(int param_1,int param_2)

{
  return param_1 == 0x432b2b00 && param_2 == 0x474e5543;
}



### FUNC FUN_00030ae8 @ 00030ae8

undefined4 FUN_00030ae8(void)

{
  int iVar1;
  undefined4 uVar2;
  
  iVar1 = FUN_000306d8();
  uVar2 = 0;
  if ((iVar1 != 0) && (uVar2 = 1, *(int *)(iVar1 + 4) != 0)) {
    uVar2 = 0;
  }
  return uVar2;
}



### FUNC FUN_00030b06 @ 00030b06

void FUN_00030b06(int param_1)

{
  int iVar1;
  
  if ((param_1 != 0) && (iVar1 = FUN_00056e98(param_1 + -0x90,1), iVar1 == 1)) {
    FUN_00030880(param_1);
  }
  return;
}



### FUNC FUN_00030b26 @ 00030b26

void FUN_00030b26(int param_1)

{
  if (param_1 != 0) {
    FUN_00056e60(param_1 + -0x90,1);
  }
  return;
}



### FUNC FUN_00030b40 @ 00030b40

void FUN_00030b40(undefined4 *param_1)

{
  if (param_1 != (undefined4 *)0x0) {
    pthread_mutex_lock((pthread_mutex_t *)&DAT_00070a28);
    *param_1 = DAT_00070a30;
    DAT_00070a30 = param_1;
    pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070a28);
  }
  return;
}



### FUNC operator.delete @ 00030b70

/* operator delete(void*) */

void operator_delete(void *param_1)

{
  if (param_1 != (void *)0x0) {
    free(param_1);
  }
  return;
}



### FUNC operator.delete[] @ 00030b7e

/* operator delete[](void*) */

void operator_delete__(void *param_1)

{
  operator_delete(param_1);
  return;
}



### FUNC FUN_00030b88 @ 00030b88

void FUN_00030b88(void *param_1)

{
  if (param_1 != (void *)0x0) {
    free(param_1);
  }
  return;
}



### FUNC FUN_00030b96 @ 00030b96

void FUN_00030b96(void)

{
  FUN_00030b88();
  return;
}



### FUNC FUN_00030ba0 @ 00030ba0

int FUN_00030ba0(int *param_1,undefined4 param_2,undefined4 param_3,int param_4)

{
  int iVar1;
  int iVar2;
  int *piVar3;
  undefined4 uVar4;
  undefined4 uVar5;
  int iVar6;
  int *local_2c;
  undefined4 local_28;
  undefined4 local_24;
  int local_20;
  undefined4 local_1c;
  int local_18;
  
  iVar1 = (int)param_1 + *(int *)(*param_1 + -8);
  uVar4 = *(undefined4 *)(*(int *)((int)param_1 + *(int *)(*param_1 + -8)) + -4);
  iVar2 = FUN_00030c3c(iVar1,uVar4,0);
  if (iVar2 == 0) {
    return 0;
  }
  if (param_4 != -2) {
    if ((-1 < param_4) && (iVar2 != -1)) {
      return (int)param_1 - param_4;
    }
    local_1c = 0;
    local_18 = 0;
    iVar6 = iVar1;
    uVar5 = uVar4;
    if (iVar2 != -1) {
      iVar6 = iVar2;
      uVar5 = param_3;
    }
    local_2c = param_1;
    local_28 = param_2;
    local_24 = param_3;
    local_20 = param_4;
    FUN_00030d20(iVar6,uVar5,&local_2c);
    if (1 < local_18 + 1U) {
      return local_18;
    }
  }
  iVar6 = 0;
  if ((iVar2 != -1) &&
     (piVar3 = (int *)FUN_00030c3c(iVar1,uVar4,param_1,param_2), iVar6 = iVar2, piVar3 != param_1))
  {
    iVar6 = 0;
  }
  return iVar6;
}



### FUNC FUN_00030c3c @ 00030c3c

int * FUN_00030c3c(int *param_1,int *param_2,int *param_3,undefined4 param_4)

{
  int iVar1;
  int iVar2;
  int *piVar3;
  int *piVar4;
  uint uVar5;
  int *piVar6;
  uint uVar7;
  
  while( true ) {
    iVar1 = FUN_0003186c(param_2,param_4);
    if (iVar1 != 0) {
      piVar4 = param_1;
      if (param_1 != param_3) {
        piVar4 = (int *)0x0;
      }
      if (param_3 == (int *)0x0) {
        return param_1;
      }
      return piVar4;
    }
    iVar1 = (**(code **)(*param_2 + 0xc))(param_2);
    if (iVar1 != 1) break;
    param_2 = (int *)param_2[2];
  }
  if (iVar1 != 0) {
    if (iVar1 == 2) {
      if (param_2[3] == 0) {
        return (int *)0x0;
      }
      iVar1 = *param_1;
      uVar7 = 0;
      piVar4 = (int *)0x0;
      do {
        uVar5 = param_2[uVar7 * 2 + 5];
        piVar6 = piVar4;
        if ((uVar5 & 2) != 0) {
          iVar2 = (int)uVar5 >> 8;
          if ((uVar5 & 1) != 0) {
            iVar2 = *(int *)(iVar1 + iVar2);
          }
          piVar3 = (int *)FUN_00030c3c((int)param_1 + iVar2,param_2[uVar7 * 2 + 4],param_3,param_4);
          if (piVar3 != (int *)0x0) {
            if (piVar3 == (int *)0xffffffff) {
              return (int *)0xffffffff;
            }
            piVar6 = piVar3;
            if ((piVar4 != (int *)0x0) && (piVar6 = piVar4, piVar4 != piVar3)) {
              return (int *)0xffffffff;
            }
          }
        }
        uVar7 = uVar7 + 1;
        piVar4 = piVar6;
        if ((uint)param_2[3] <= uVar7) {
          return piVar6;
        }
      } while( true );
    }
    __assert2("/usr/local/google/buildbot/src/android/ndk-release-r16/out/stlport/ndk/sources/cxx-stl/gabi++/src/dynamic_cast.cc"
              ,0xad,
              "const void *(anonymous namespace)::walk_object(const void *, const abi::__class_type_info *, const void *, const abi::__class_type_info *)"
              ,&DAT_00030d1c);
  }
  return (int *)0x0;
}



### FUNC FUN_00030d20 @ 00030d20

void FUN_00030d20(int *param_1,int *param_2,int *param_3)

{
  int iVar1;
  int iVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  uint uVar6;
  
  iVar1 = param_3[4];
  iVar2 = FUN_0003186c(param_2,param_3[2]);
  if (iVar2 == 1) {
    param_3[4] = (int)param_1;
  }
  if ((((int *)*param_3 == param_1) && (param_3[4] != 0)) &&
     (iVar2 = FUN_0003186c(param_2,param_3[1]), iVar2 == 1)) {
    if (param_3[5] == 0) {
      param_3[5] = param_3[4];
    }
    else if (param_3[5] != param_3[4]) {
      param_3[5] = -1;
    }
  }
  else {
    iVar2 = (**(code **)(*param_2 + 0xc))(param_2);
    if (iVar2 != 0) {
      if (iVar2 == 2) {
        uVar3 = param_2[3];
        if (uVar3 != 0) {
          iVar2 = *param_1;
          uVar6 = 0;
          do {
            uVar5 = param_2[uVar6 * 2 + 5];
            if ((uVar5 & 2) != 0) {
              iVar4 = (int)uVar5 >> 8;
              if ((uVar5 & 1) != 0) {
                iVar4 = *(int *)(iVar2 + iVar4);
              }
              FUN_00030d20((int)param_1 + iVar4,param_2[uVar6 * 2 + 4],param_3);
              if (param_3[5] == -1) break;
              uVar3 = param_2[3];
            }
            uVar6 = uVar6 + 1;
          } while (uVar6 < uVar3);
        }
      }
      else if (iVar2 == 1) {
        FUN_00030d20(param_1,param_2[2],param_3);
      }
      else {
        __assert2("/usr/local/google/buildbot/src/android/ndk-release-r16/out/stlport/ndk/sources/cxx-stl/gabi++/src/dynamic_cast.cc"
                  ,0x105,
                  "void (anonymous namespace)::base_to_derived_cast(const void *, const abi::__class_type_info *, (anonymous namespace)::cast_context *)"
                  ,&DAT_00030dfc);
      }
    }
  }
  param_3[4] = iVar1;
  return;
}



### FUNC FUN_00030e00 @ 00030e00

void FUN_00030e00(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_00030e10_1_00068d34;
  return;
}



### FUNC FUN_00030e10 @ 00030e10

void FUN_00030e10(void)

{
  return;
}



### FUNC FUN_00030e12 @ 00030e12

void FUN_00030e12(void *param_1)

{
  operator_delete(param_1);
  return;
}



### FUNC FUN_00030e64 @ 00030e64

bool FUN_00030e64(void)

{
  int iVar1;
  
  iVar1 = FUN_000306d8();
  return *(int *)(iVar1 + 4) != 0;
}



### FUNC FUN_00030e78 @ 00030e78

void FUN_00030e78(undefined4 param_1)

{
  int iVar1;
  code *pcVar2;
  
  fprintf((FILE *)isupper,"PANIC:GAbi++:%s\n",param_1);
  iVar1 = dlopen("liblog.so",0);
  if (iVar1 != 0) {
    pcVar2 = (code *)dlsym(iVar1,"__android_log_print");
    if (pcVar2 != (code *)0x0) {
      (*pcVar2)(7,"GAbi++",param_1);
    }
    dlclose(iVar1);
  }
                    /* WARNING: Subroutine does not return */
  FUN_0003178c();
}



### FUNC FUN_00030efc @ 00030efc

void FUN_00030efc(void)

{
  FUN_000308d8();
                    /* WARNING: Subroutine does not return */
  FUN_0003178c();
}



### FUNC FUN_00030f08 @ 00030f08

void FUN_00030f08(uint *param_1,uint param_2,int param_3,int param_4,undefined4 param_5)

{
  char cVar1;
  uint uVar2;
  int iVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  int iVar7;
  int *piVar8;
  char *pcVar9;
  char *pcVar10;
  uint uVar11;
  int *piVar12;
  char *local_3c;
  char *local_24;
  char *local_20;
  char *local_1c;
  char *local_18;
  
  uVar2 = 3;
  *param_1 = 0;
  param_1[1] = 0;
  param_1[2] = 0;
  param_1[3] = 0;
  param_1[4] = 0;
  param_1[5] = 0;
  param_1[6] = 3;
  uVar11 = param_2 & 1;
  if (uVar11 == 0) {
    if ((int)(param_2 << 0x1e) < 0) {
      if ((param_2 & 0xc) != 0xc) goto LAB_00030f52;
      uVar2 = 2;
    }
    param_1[6] = uVar2;
    return;
  }
  if ((param_2 << 0x1c) >> 0x1d != 0) {
    param_1[6] = 3;
    return;
  }
LAB_00030f52:
  local_1c = (char *)_Unwind_GetLanguageSpecificData(param_5);
  if (local_1c == (char *)0x0) {
    param_1[6] = 8;
    return;
  }
  param_1[3] = (uint)local_1c;
  local_3c = (char *)0x0;
  _Unwind_VRS_Get(param_5,0,0xf,0,&local_18);
  pcVar10 = local_18;
  iVar3 = _Unwind_GetRegionStart(param_5);
  cVar1 = *local_1c;
  local_1c = local_1c + 1;
  iVar4 = FUN_0004e23c(&local_1c,cVar1);
  pcVar9 = local_1c + 1;
  uVar2 = (((uint)pcVar10 & 0xfffffffe) - 1) - iVar3;
  if (iVar4 != 0) {
    iVar3 = iVar4;
  }
  cVar1 = *local_1c;
  local_1c = pcVar9;
  if (cVar1 != -1) {
    iVar4 = FUN_0004e1d4(&local_1c);
    local_3c = local_1c + iVar4;
  }
  cVar1 = *local_1c;
  local_1c = local_1c + 1;
  iVar4 = FUN_0004e1d4(&local_1c);
  local_20 = local_1c;
  pcVar10 = local_1c + iVar4;
  if (0 < iVar4) {
    do {
      uVar5 = FUN_0004e23c(&local_20,cVar1);
      iVar4 = FUN_0004e23c(&local_20,cVar1);
      iVar6 = FUN_0004e23c(&local_20,cVar1);
      iVar7 = FUN_0004e1d4(&local_20);
      if ((uVar5 <= uVar2) && (uVar2 < iVar4 + uVar5)) {
        if (iVar6 == 0) {
          param_1[6] = 8;
          return;
        }
        uVar2 = iVar6 + iVar3;
        if (iVar7 == 0) {
          uVar11 = 6;
          if ((param_2 & 6) == 2) {
            *param_1 = 0;
            param_1[1] = 0;
            param_1[4] = uVar2;
          }
          else {
            uVar11 = 8;
          }
          param_1[6] = uVar11;
          return;
        }
        local_24 = pcVar10 + iVar7 + -1;
        pcVar10 = (char *)(param_4 + 0x58);
        goto LAB_000310bc;
      }
    } while ((uVar5 <= uVar2) && (local_20 < pcVar10));
  }
LAB_000311de:
                    /* WARNING: Subroutine does not return */
  FUN_00030efc(param_4);
LAB_000310bc:
  pcVar9 = local_24;
  uVar5 = FUN_0004e1f8(&local_24);
  if ((int)uVar5 < 1) {
    if ((int)uVar5 < 0) {
      if (param_3 != 1) goto joined_r0x00031094;
      iVar3 = *(int *)(param_4 + -0x34);
      if ((iVar3 == 0) || (local_3c == (char *)0x0)) goto LAB_000311de;
      piVar12 = (int *)(local_3c + (uVar5 ^ 0xffffffff) * 4);
      do {
        if (*piVar12 == 0) {
          if (uVar11 != 0) goto LAB_0003119e;
          goto joined_r0x0003112a;
        }
        piVar8 = *(int **)(*piVar12 + (int)piVar12);
        local_18 = pcVar10;
        iVar4 = (**(code **)(*piVar8 + 8))(piVar8,iVar3,&local_18);
        piVar12 = piVar12 + 1;
      } while (iVar4 == 0);
    }
    else if ((param_2 & 6) == 2) goto LAB_0003119e;
  }
  else {
    if (local_3c == (char *)0x0) goto LAB_000311de;
    iVar3 = *(int *)(local_3c + uVar5 * -4);
    if ((iVar3 == 0) ||
       (piVar12 = *(int **)(iVar3 + (int)(local_3c + uVar5 * -4)), piVar12 == (int *)0x0)) {
joined_r0x00031094:
      if ((param_2 & 4) != 0 || uVar11 != 0) {
LAB_0003119e:
        param_1[4] = uVar2;
        param_1[5] = (uint)pcVar10;
        param_1[6] = 6;
        *param_1 = uVar5;
        param_1[1] = (int)uVar5 >> 0x1f;
        param_1[2] = (uint)pcVar9;
        return;
      }
joined_r0x0003112a:
      if ((param_2 & 8) == 0) goto LAB_000311de;
    }
    else if (param_3 == 1) {
      iVar3 = *(int *)(param_4 + -0x34);
      local_18 = pcVar10;
      if (iVar3 == 0) goto LAB_000311de;
      iVar4 = FUN_00030ba0(iVar3,&PTR_PTR_FUN_00031728_1_00068d20,&PTR_PTR_FUN_00031728_1_00068dc4,0
                          );
      if (iVar4 != 0) {
        local_18 = *(char **)pcVar10;
      }
      iVar3 = (**(code **)(*piVar12 + 8))(piVar12,iVar3,&local_18);
      if (iVar3 == 1) {
        if (uVar11 != 0) {
          *param_1 = uVar5;
          param_1[1] = (int)uVar5 >> 0x1f;
          param_1[2] = (uint)pcVar9;
          param_1[4] = uVar2;
          param_1[5] = (uint)local_18;
          param_1[6] = 6;
          return;
        }
        goto joined_r0x0003112a;
      }
    }
  }
  local_18 = local_24;
  iVar3 = FUN_0004e1f8(&local_18);
  if (iVar3 == 0) {
    param_1[6] = 8;
    return;
  }
  local_24 = local_24 + iVar3;
  goto LAB_000310bc;
}



### FUNC FUN_000311ec @ 000311ec

undefined4
FUN_000311ec(int param_1,undefined4 param_2,int param_3,undefined4 param_4,undefined4 param_5)

{
  undefined4 uVar1;
  int *piVar2;
  int iVar3;
  
  if (param_3 != 0) {
    piVar2 = (int *)(param_3 + param_1 * -4);
    iVar3 = *piVar2;
    uVar1 = 0;
    if (iVar3 != 0) {
      uVar1 = *(undefined4 *)(iVar3 + (int)piVar2);
    }
    return uVar1;
  }
                    /* WARNING: Subroutine does not return */
  FUN_00030efc(param_5);
}



### FUNC FUN_0003120a @ 0003120a

undefined4
FUN_0003120a(uint param_1,undefined4 param_2,int param_3,undefined4 param_4,undefined4 param_5,
            undefined4 param_6,undefined4 param_7)

{
  int *piVar1;
  int iVar2;
  int *piVar3;
  undefined4 local_18;
  
  if (param_3 == 0) {
                    /* WARNING: Subroutine does not return */
    FUN_00030efc(param_7);
  }
  piVar3 = (int *)(param_3 + ~param_1 * 4);
  do {
    if (*piVar3 == 0) {
      return 1;
    }
    piVar1 = *(int **)(*piVar3 + (int)piVar3);
    local_18 = param_6;
    iVar2 = (**(code **)(*piVar1 + 8))(piVar1,param_5,&local_18);
    piVar3 = piVar3 + 1;
  } while (iVar2 != 1);
  return 0;
}



### FUNC FUN_00031256 @ 00031256

void FUN_00031256(uint param_1,undefined4 param_2,uint *param_3)

{
  uint uVar1;
  uint local_18;
  
  local_18 = param_1;
  _Unwind_VRS_Set(param_2,0,0,0,&local_18);
  local_18 = *param_3;
  _Unwind_VRS_Set(param_2,0,1,0,&local_18);
  uVar1 = param_3[4];
  _Unwind_VRS_Get(param_2,0,0xf,0,&local_18);
  local_18 = local_18 & 1 | uVar1;
  _Unwind_VRS_Set(param_2,0,0xf,0,&local_18);
  return;
}



### FUNC FUN_000312cc @ 000312cc

undefined4 FUN_000312cc(void)

{
  int iVar1;
  undefined4 uVar2;
  
  iVar1 = __gnu_unwind_frame();
  uVar2 = 8;
  if (iVar1 != 0) {
    uVar2 = 9;
  }
  return uVar2;
}



### FUNC FUN_000312e2 @ 000312e2

void FUN_000312e2(int param_1,undefined4 param_2,undefined4 *param_3)

{
  undefined4 local_14;
  
  _Unwind_VRS_Get(param_2,0,0xd,0,&local_14);
  *(undefined4 *)(param_1 + 0x20) = local_14;
  *(undefined4 *)(param_1 + 0x24) = param_3[5];
  *(undefined4 *)(param_1 + 0x28) = *param_3;
  *(undefined4 *)(param_1 + 0x30) = param_3[4];
  return;
}



### FUNC FUN_00031312 @ 00031312

void FUN_00031312(int param_1,undefined4 *param_2)

{
  param_2[5] = *(undefined4 *)(param_1 + 0x24);
  *param_2 = *(undefined4 *)(param_1 + 0x28);
  param_2[1] = 0;
  param_2[4] = *(undefined4 *)(param_1 + 0x30);
  return;
}



### FUNC FUN_00031322 @ 00031322

void FUN_00031322(void)

{
  __cxa_begin_cleanup();
  return;
}



### FUNC FUN_0003132c @ 0003132c

void FUN_0003132c(int param_1,undefined4 param_2,int *param_3)

{
  undefined1 *puVar1;
  char *pcVar2;
  int iVar3;
  int iVar4;
  int iVar5;
  char *local_18;
  
  __cxa_begin_cleanup();
  puVar1 = (undefined1 *)_Unwind_GetLanguageSpecificData(param_2);
  local_18 = puVar1 + 1;
  FUN_0004e23c(&local_18,*puVar1);
  _Unwind_GetRegionStart(param_2);
  pcVar2 = (char *)0x0;
  iVar5 = -1;
  if (*local_18 != -1) {
    local_18 = local_18 + 1;
    iVar3 = FUN_0004e1d4(&local_18);
    pcVar2 = local_18 + iVar3;
  }
  iVar3 = *param_3;
  do {
    iVar4 = iVar5 * 4;
    iVar5 = iVar5 + 1;
  } while (*(int *)(pcVar2 + iVar4 + iVar3 * -4) != 0);
  *(int *)(param_1 + 0x28) = iVar5;
  *(undefined4 *)(param_1 + 0x30) = 4;
  *(char **)(param_1 + 0x34) = pcVar2 + iVar3 * -4 + -4;
  return;
}



### FUNC FUN_00031390 @ 00031390

void FUN_00031390(void)

{
  undefined4 *puVar1;
  
  puVar1 = (undefined4 *)FUN_00030e00();
  *puVar1 = &PTR_FUN_000313a8_1_00068d70;
  return;
}



### FUNC FUN_000313a8 @ 000313a8

void FUN_000313a8(void)

{
  FUN_00030e10();
  return;
}



### FUNC FUN_000313b2 @ 000313b2

void FUN_000313b2(void)

{
  void *pvVar1;
  
  pvVar1 = (void *)FUN_00030e10();
  operator_delete(pvVar1);
  return;
}



### FUNC operator.new @ 00031440

/* operator new(unsigned int) */

void * operator_new(uint param_1)

{
  void *pvVar1;
  code *pcVar2;
  undefined4 *puVar3;
  
  while( true ) {
    pvVar1 = malloc(param_1);
    if (pvVar1 != (void *)0x0) {
      return pvVar1;
    }
    pcVar2 = (code *)FUN_00056e60(&DAT_00070a34,0);
    if (pcVar2 == (code *)0x0) break;
    (*pcVar2)();
  }
  FUN_00030824(4);
  puVar3 = (undefined4 *)FUN_00030e00();
  *puVar3 = &PTR_FUN_000313a8_1_00068d70;
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(puVar3,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
}



### FUNC FUN_000314a8 @ 000314a8

void * FUN_000314a8(uint param_1)

{
  void *pvVar1;
  
  pvVar1 = operator_new(param_1);
  return pvVar1;
}



### FUNC operator.new[] @ 000314ca

/* operator new[](unsigned int) */

void * operator_new__(uint param_1)

{
  void *pvVar1;
  
  pvVar1 = operator_new(param_1);
  return pvVar1;
}



### FUNC __gxx_personality_v0 @ 000314e4

undefined4 __gxx_personality_v0(int param_1,int *param_2,int param_3)

{
  undefined4 uVar1;
  int iVar2;
  int iVar3;
  uint uVar4;
  int *piVar5;
  int *local_38;
  int local_34;
  int local_30;
  int local_2c;
  int local_28;
  int local_24;
  int local_20;
  
  iVar2 = *param_2;
  iVar3 = param_2[1];
  uVar4 = 1;
  if (param_1 != 0) {
    if (param_1 == 2) goto LAB_00031616;
    if (param_1 != 1) {
      return 9;
    }
    piVar5 = (int *)param_2[8];
    _Unwind_VRS_Get(param_3,0,0xd,0,&local_38);
    uVar4 = 6;
    if (piVar5 != local_38) {
      uVar4 = 2;
    }
  }
  local_38 = param_2;
  _Unwind_VRS_Set(param_3,0,0xc,0,&local_38);
  if (param_3 == 0) {
    return 3;
  }
  if ((uVar4 & 1) == 0) {
    if (-1 < (int)(uVar4 << 0x1e)) {
      return 3;
    }
    if ((int)(uVar4 << 0x1d) < 0) {
      if (iVar3 == 0x474e5543 && iVar2 == 0x432b2b00) {
        local_38 = (int *)param_2[-5];
        local_30 = param_2[-4];
        local_2c = param_2[-3];
        local_28 = param_2[-2];
        local_24 = param_2[-1];
        local_34 = (int)local_38 >> 0x1f;
        FUN_00031312(param_2,&local_38);
      }
      else {
        FUN_00030f08(&local_38,uVar4,0,param_2,param_3);
        if (local_20 != 6) {
                    /* WARNING: Subroutine does not return */
          FUN_00030efc(param_2);
        }
      }
      FUN_00031256(param_2,param_3,&local_38);
      FUN_0003132c(param_2,param_3,&local_38);
      return 7;
    }
    FUN_00030f08(&local_38,uVar4,iVar3 == 0x474e5543 && iVar2 == 0x432b2b00,param_2,param_3);
    if (local_20 == 6) {
      FUN_00031256(param_2,param_3,&local_38);
      FUN_00031322(param_2);
      return 7;
    }
  }
  else {
    FUN_00030f08(&local_38,uVar4,iVar3 == 0x474e5543 && iVar2 == 0x432b2b00,param_2,param_3);
    if (local_20 == 6) {
      if (iVar3 != 0x474e5543 || iVar2 != 0x432b2b00) {
        return 6;
      }
      param_2[-5] = (int)local_38;
      param_2[-4] = local_30;
      param_2[-3] = local_2c;
      param_2[-2] = local_28;
      param_2[-1] = local_24;
      FUN_000312e2(param_2,param_3,&local_38);
      return 6;
    }
  }
LAB_00031616:
  uVar1 = FUN_000312cc(param_2,param_3);
  return uVar1;
}



### FUNC FUN_000316a0 @ 000316a0

void FUN_000316a0(void)

{
  FUN_0004e480();
  return;
}



### FUNC FUN_000316aa @ 000316aa

void FUN_000316aa(void *param_1)

{
  FUN_0004e480();
  operator_delete(param_1);
  return;
}



### FUNC FUN_00031728 @ 00031728

void FUN_00031728(void)

{
  FUN_000304ac();
  return;
}



### FUNC FUN_00031732 @ 00031732

void FUN_00031732(void *param_1)

{
  FUN_000304ac();
  operator_delete(param_1);
  return;
}



### FUNC FUN_00031784 @ 00031784

void FUN_00031784(void)

{
                    /* WARNING: Subroutine does not return */
  FUN_0003178c();
}



### FUNC FUN_0003178c @ 0003178c

void FUN_0003178c(void)

{
  FUN_00056e60(&DAT_0006b89c,0);
  FUN_000317b8();
  DAT_deadcab1 = 0;
                    /* WARNING: Subroutine does not return */
  abort();
}



### FUNC FUN_000317a4 @ 000317a4

void FUN_000317a4(void)

{
  DAT_deadcab1 = 0;
                    /* WARNING: Subroutine does not return */
  abort();
}



### FUNC FUN_000317b8 @ 000317b8

/* WARNING: Control flow encountered bad instruction data */

void FUN_000317b8(code *param_1)

{
  if (param_1 == (code *)0x0) {
    param_1 = FUN_000317a4;
  }
  (*param_1)();
  FUN_000317a4();
  FUN_000308d8();
  FUN_0003094c();
  FUN_000317a4();
                    /* WARNING: Bad instruction - Truncating control flow here */
  halt_baddata();
}



### FUNC FUN_000317dc @ 000317dc

void FUN_000317dc(void)

{
  FUN_00056e60(&DAT_0006b89c,0);
  return;
}



### FUNC FUN_000317f0 @ 000317f0

void FUN_000317f0(int param_1)

{
  if (param_1 == 0) {
    param_1 = 0x317a5;
  }
  FUN_00057c50(&DAT_0006b89c,param_1);
  return;
}



### FUNC FUN_00031810 @ 00031810

void FUN_00031810(void)

{
  FUN_00056e60(&DAT_0006b8a0,0);
  return;
}



### FUNC FUN_00031824 @ 00031824

void FUN_00031824(int param_1)

{
  if (param_1 == 0) {
    param_1 = 0x317a5;
  }
  FUN_00057c50(&DAT_0006b8a0,param_1);
  return;
}



### FUNC FUN_00031844 @ 00031844

void FUN_00031844(void)

{
  code *pcVar1;
  
  pcVar1 = (code *)FUN_00056e60(&DAT_0006b8a0,0);
  if (pcVar1 != (code *)0x0) {
    (*pcVar1)();
  }
                    /* WARNING: Subroutine does not return */
  FUN_0003178c();
}



### FUNC FUN_00031860 @ 00031860

void FUN_00031860(void)

{
  return;
}



### FUNC FUN_00031862 @ 00031862

void FUN_00031862(void *param_1)

{
  operator_delete(param_1);
  return;
}



### FUNC FUN_0003186c @ 0003186c

bool FUN_0003186c(int param_1,int param_2)

{
  int iVar1;
  
  iVar1 = strcmp(*(char **)(param_1 + 4),*(char **)(param_2 + 4));
  return iVar1 == 0;
}



### FUNC FUN_00031886 @ 00031886

bool FUN_00031886(int param_1,int param_2)

{
  int iVar1;
  
  iVar1 = strcmp(*(char **)(param_1 + 4),*(char **)(param_2 + 4));
  return iVar1 != 0;
}



### FUNC FUN_0003189e @ 0003189e

uint FUN_0003189e(int param_1,int param_2)

{
  uint uVar1;
  
  uVar1 = strcmp(*(char **)(param_1 + 4),*(char **)(param_2 + 4));
  return uVar1 >> 0x1f;
}



### FUNC FUN_000318b0 @ 000318b0

void FUN_000318b0(void)

{
  undefined4 *puVar1;
  
  puVar1 = (undefined4 *)FUN_00030e00();
  *puVar1 = &PTR_FUN_000318c8_1_00068e00;
  return;
}



### FUNC FUN_000318c8 @ 000318c8

void FUN_000318c8(void)

{
  FUN_00030e10();
  return;
}



### FUNC FUN_000318d2 @ 000318d2

void FUN_000318d2(void)

{
  void *pvVar1;
  
  pvVar1 = (void *)FUN_00030e10();
  operator_delete(pvVar1);
  return;
}



### FUNC FUN_000318f4 @ 000318f4

void FUN_000318f4(void)

{
  undefined4 *puVar1;
  
  puVar1 = (undefined4 *)FUN_00030e00();
  *puVar1 = &PTR_FUN_0003190c_1_00068e14;
  return;
}



### FUNC FUN_0003190c @ 0003190c

void FUN_0003190c(void)

{
  FUN_00030e10();
  return;
}



### FUNC FUN_00031916 @ 00031916

void FUN_00031916(void)

{
  void *pvVar1;
  
  pvVar1 = (void *)FUN_00030e10();
  operator_delete(pvVar1);
  return;
}



### FUNC FUN_00031938 @ 00031938

void FUN_00031938(void)

{
  FUN_000304ac();
  return;
}



### FUNC FUN_00031942 @ 00031942

void FUN_00031942(void *param_1)

{
  FUN_000304ac();
  operator_delete(param_1);
  return;
}



### FUNC __stl_throw_runtime_error @ 00031b54

/* WARNING: Unknown calling convention -- yet parameter storage is locked */
/* std::__stl_throw_runtime_error(char const*) */

void std::__stl_throw_runtime_error(char *param_1)

{
  undefined4 *puVar1;
  size_t sVar2;
  size_t *__dest;
  size_t *psVar3;
  int *local_38;
  undefined1 auStack_30 [4];
  undefined1 auStack_2c [20];
  char *local_18;
  
  puVar1 = (undefined4 *)FUN_00030824(0x108);
  FUN_00031c38(auStack_2c,param_1,auStack_30);
  FUN_00030e00(puVar1);
  *puVar1 = &PTR____Named_exception_00068e80;
  sVar2 = strlen(local_18);
  sVar2 = sVar2 + 1;
  if (sVar2 < 0x101) {
    __dest = puVar1 + 1;
    puVar1[0x41] = __dest;
  }
  else {
    __dest = (size_t *)malloc(sVar2);
    puVar1[0x41] = __dest;
    psVar3 = puVar1 + 1;
    if (__dest == (size_t *)0x0) {
      puVar1[0x41] = psVar3;
      __dest = psVar3;
      sVar2 = 0x100;
    }
    else {
      *psVar3 = sVar2;
    }
  }
  local_38 = puVar1 + 0x41;
  strncpy((char *)__dest,local_18,sVar2 - 1);
  *(undefined1 *)(*local_38 + (sVar2 - 1)) = 0;
  *puVar1 = &PTR____Named_exception_00068ec0;
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(puVar1,&runtime_error::typeinfo,__Named_exception::~__Named_exception);
}



### FUNC FUN_00031c38 @ 00031c38

undefined4 * FUN_00031c38(undefined4 *param_1,char *param_2)

{
  size_t sVar1;
  undefined4 *puVar2;
  uint uVar3;
  uint local_18;
  
  param_1[4] = param_1;
  param_1[5] = param_1;
  sVar1 = strlen(param_2);
  uVar3 = sVar1 + 1;
  if (uVar3 == 0) {
                    /* WARNING: Subroutine does not return */
    std::__stl_throw_length_error("basic_string");
  }
  if (uVar3 < 0x11) {
    puVar2 = param_1;
    if (sVar1 == 0) goto LAB_00031c9c;
  }
  else {
    local_18 = uVar3;
    if (uVar3 < 0x81) {
      puVar2 = (undefined4 *)std::__node_alloc::_M_allocate(&local_18);
      uVar3 = local_18;
    }
    else {
      puVar2 = (undefined4 *)operator_new(uVar3);
    }
    param_1[4] = puVar2;
    param_1[5] = puVar2;
    *param_1 = (undefined1 *)((int)puVar2 + uVar3);
  }
  __aeabi_memcpy(puVar2,param_2);
  puVar2 = (undefined4 *)((int)puVar2 + sVar1);
LAB_00031c9c:
  param_1[4] = puVar2;
  *(undefined1 *)puVar2 = 0;
  return param_1;
}



### FUNC __stl_throw_range_error @ 00031cec

/* WARNING: Unknown calling convention -- yet parameter storage is locked */
/* std::__stl_throw_range_error(char const*) */

void std::__stl_throw_range_error(char *param_1)

{
  undefined4 *puVar1;
  size_t sVar2;
  size_t *__dest;
  size_t *psVar3;
  int *local_38;
  undefined1 auStack_30 [4];
  undefined1 auStack_2c [20];
  char *local_18;
  
  puVar1 = (undefined4 *)FUN_00030824(0x108);
  FUN_00031c38(auStack_2c,param_1,auStack_30);
  FUN_00030e00(puVar1);
  *puVar1 = &PTR____Named_exception_00068e80;
  sVar2 = strlen(local_18);
  sVar2 = sVar2 + 1;
  if (sVar2 < 0x101) {
    __dest = puVar1 + 1;
    puVar1[0x41] = __dest;
  }
  else {
    __dest = (size_t *)malloc(sVar2);
    puVar1[0x41] = __dest;
    psVar3 = puVar1 + 1;
    if (__dest == (size_t *)0x0) {
      puVar1[0x41] = psVar3;
      __dest = psVar3;
      sVar2 = 0x100;
    }
    else {
      *psVar3 = sVar2;
    }
  }
  local_38 = puVar1 + 0x41;
  strncpy((char *)__dest,local_18,sVar2 - 1);
  *(undefined1 *)(*local_38 + (sVar2 - 1)) = 0;
  *puVar1 = &PTR____Named_exception_00068f60;
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(puVar1,&range_error::typeinfo,__Named_exception::~__Named_exception);
}



### FUNC __stl_throw_out_of_range @ 00031dd0

/* WARNING: Unknown calling convention -- yet parameter storage is locked */
/* std::__stl_throw_out_of_range(char const*) */

void std::__stl_throw_out_of_range(char *param_1)

{
  undefined4 *puVar1;
  size_t sVar2;
  size_t *__dest;
  size_t *psVar3;
  int *local_38;
  undefined1 auStack_30 [4];
  undefined1 auStack_2c [20];
  char *local_18;
  
  puVar1 = (undefined4 *)FUN_00030824(0x108);
  FUN_00031c38(auStack_2c,param_1,auStack_30);
  FUN_00030e00(puVar1);
  *puVar1 = &PTR____Named_exception_00068e80;
  sVar2 = strlen(local_18);
  sVar2 = sVar2 + 1;
  if (sVar2 < 0x101) {
    __dest = puVar1 + 1;
    puVar1[0x41] = __dest;
  }
  else {
    __dest = (size_t *)malloc(sVar2);
    puVar1[0x41] = __dest;
    psVar3 = puVar1 + 1;
    if (__dest == (size_t *)0x0) {
      puVar1[0x41] = psVar3;
      __dest = psVar3;
      sVar2 = 0x100;
    }
    else {
      *psVar3 = sVar2;
    }
  }
  local_38 = puVar1 + 0x41;
  strncpy((char *)__dest,local_18,sVar2 - 1);
  *(undefined1 *)(*local_38 + (sVar2 - 1)) = 0;
  *puVar1 = &PTR____Named_exception_00068f40;
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(puVar1,&out_of_range::typeinfo,__Named_exception::~__Named_exception);
}



### FUNC __stl_throw_length_error @ 00031eb4

/* WARNING: Unknown calling convention -- yet parameter storage is locked */
/* std::__stl_throw_length_error(char const*) */

void std::__stl_throw_length_error(char *param_1)

{
  undefined4 *puVar1;
  size_t sVar2;
  size_t *__dest;
  size_t *psVar3;
  int *local_38;
  undefined1 auStack_30 [4];
  undefined1 auStack_2c [20];
  char *local_18;
  
  puVar1 = (undefined4 *)FUN_00030824(0x108);
  FUN_00031c38(auStack_2c,param_1,auStack_30);
  FUN_00030e00(puVar1);
  *puVar1 = &PTR____Named_exception_00068e80;
  sVar2 = strlen(local_18);
  sVar2 = sVar2 + 1;
  if (sVar2 < 0x101) {
    __dest = puVar1 + 1;
    puVar1[0x41] = __dest;
  }
  else {
    __dest = (size_t *)malloc(sVar2);
    puVar1[0x41] = __dest;
    psVar3 = puVar1 + 1;
    if (__dest == (size_t *)0x0) {
      puVar1[0x41] = psVar3;
      __dest = psVar3;
      sVar2 = 0x100;
    }
    else {
      *psVar3 = sVar2;
    }
  }
  local_38 = puVar1 + 0x41;
  strncpy((char *)__dest,local_18,sVar2 - 1);
  *(undefined1 *)(*local_38 + (sVar2 - 1)) = 0;
  *puVar1 = &PTR____Named_exception_00068f20;
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(puVar1,&length_error::typeinfo,__Named_exception::~__Named_exception);
}



### FUNC __stl_throw_invalid_argument @ 00031f98

/* WARNING: Unknown calling convention -- yet parameter storage is locked */
/* std::__stl_throw_invalid_argument(char const*) */

void std::__stl_throw_invalid_argument(char *param_1)

{
  undefined4 *puVar1;
  size_t sVar2;
  size_t *__dest;
  size_t *psVar3;
  int *local_38;
  undefined1 auStack_30 [4];
  undefined1 auStack_2c [20];
  char *local_18;
  
  puVar1 = (undefined4 *)FUN_00030824(0x108);
  FUN_00031c38(auStack_2c,param_1,auStack_30);
  FUN_00030e00(puVar1);
  *puVar1 = &PTR____Named_exception_00068e80;
  sVar2 = strlen(local_18);
  sVar2 = sVar2 + 1;
  if (sVar2 < 0x101) {
    __dest = puVar1 + 1;
    puVar1[0x41] = __dest;
  }
  else {
    __dest = (size_t *)malloc(sVar2);
    puVar1[0x41] = __dest;
    psVar3 = puVar1 + 1;
    if (__dest == (size_t *)0x0) {
      puVar1[0x41] = psVar3;
      __dest = psVar3;
      sVar2 = 0x100;
    }
    else {
      *psVar3 = sVar2;
    }
  }
  local_38 = puVar1 + 0x41;
  strncpy((char *)__dest,local_18,sVar2 - 1);
  *(undefined1 *)(*local_38 + (sVar2 - 1)) = 0;
  *puVar1 = &PTR____Named_exception_00068f00;
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(puVar1,&invalid_argument::typeinfo,__Named_exception::~__Named_exception);
}



### FUNC __stl_throw_overflow_error @ 0003207c

/* WARNING: Unknown calling convention -- yet parameter storage is locked */
/* std::__stl_throw_overflow_error(char const*) */

void std::__stl_throw_overflow_error(char *param_1)

{
  undefined4 *puVar1;
  size_t sVar2;
  size_t *__dest;
  size_t *psVar3;
  int *local_38;
  undefined1 auStack_30 [4];
  undefined1 auStack_2c [20];
  char *local_18;
  
  puVar1 = (undefined4 *)FUN_00030824(0x108);
  FUN_00031c38(auStack_2c,param_1,auStack_30);
  FUN_00030e00(puVar1);
  *puVar1 = &PTR____Named_exception_00068e80;
  sVar2 = strlen(local_18);
  sVar2 = sVar2 + 1;
  if (sVar2 < 0x101) {
    __dest = puVar1 + 1;
    puVar1[0x41] = __dest;
  }
  else {
    __dest = (size_t *)malloc(sVar2);
    puVar1[0x41] = __dest;
    psVar3 = puVar1 + 1;
    if (__dest == (size_t *)0x0) {
      puVar1[0x41] = psVar3;
      __dest = psVar3;
      sVar2 = 0x100;
    }
    else {
      *psVar3 = sVar2;
    }
  }
  local_38 = puVar1 + 0x41;
  strncpy((char *)__dest,local_18,sVar2 - 1);
  *(undefined1 *)(*local_38 + (sVar2 - 1)) = 0;
  *puVar1 = &PTR____Named_exception_00068f80;
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(puVar1,&overflow_error::typeinfo,__Named_exception::~__Named_exception);
}



### FUNC __Named_exception @ 00032160

/* std::__Named_exception::__Named_exception(std::string const&) */

__Named_exception * __thiscall
std::__Named_exception::__Named_exception(__Named_exception *this,string *param_1)

{
  char *__s;
  size_t sVar1;
  __Named_exception *p_Var2;
  __Named_exception *__dest;
  size_t sVar3;
  
  FUN_00030e00();
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  __s = *(char **)(param_1 + 0x14);
  sVar1 = strlen(__s);
  sVar3 = 0x100;
  sVar1 = sVar1 + 1;
  if (sVar1 < 0x101) {
    *(__Named_exception **)(this + 0x104) = this + 4;
    __dest = this + 4;
    sVar3 = sVar1;
  }
  else {
    p_Var2 = (__Named_exception *)malloc(sVar1);
    *(__Named_exception **)(this + 0x104) = p_Var2;
    __dest = this + 4;
    if (p_Var2 == (__Named_exception *)0x0) {
      *(__Named_exception **)(this + 0x104) = __dest;
    }
    else {
      *(size_t *)__dest = sVar1;
      __dest = p_Var2;
      sVar3 = sVar1;
    }
  }
  strncpy((char *)__dest,__s,sVar3 - 1);
  *(undefined1 *)(*(int *)(this + 0x104) + (sVar3 - 1)) = 0;
  return this;
}



### FUNC __Named_exception @ 000321d8

/* std::__Named_exception::__Named_exception(std::__Named_exception const&) */

__Named_exception * __thiscall
std::__Named_exception::__Named_exception(__Named_exception *this,__Named_exception *param_1)

{
  size_t sVar1;
  __Named_exception *p_Var2;
  __Named_exception *__dest;
  
  FUN_00030e00();
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  sVar1 = strlen(*(char **)(param_1 + 0x104));
  sVar1 = sVar1 + 1;
  if (sVar1 < 0x101) {
    __dest = this + 4;
    *(__Named_exception **)(this + 0x104) = __dest;
  }
  else {
    p_Var2 = (__Named_exception *)malloc(sVar1);
    *(__Named_exception **)(this + 0x104) = p_Var2;
    __dest = this + 4;
    if (p_Var2 == (__Named_exception *)0x0) {
      *(__Named_exception **)(this + 0x104) = __dest;
      sVar1 = 0x100;
    }
    else {
      *(size_t *)__dest = sVar1;
      __dest = p_Var2;
    }
  }
  strncpy((char *)__dest,*(char **)(param_1 + 0x104),sVar1 - 1);
  *(undefined1 *)(*(int *)(this + 0x104) + (sVar1 - 1)) = 0;
  return this;
}



### FUNC operator= @ 0003224c

/* std::__Named_exception::TEMPNAMEPLACEHOLDERVALUE(std::__Named_exception const&) */

__Named_exception * __thiscall
std::__Named_exception::operator=(__Named_exception *this,__Named_exception *param_1)

{
  __Named_exception *p_Var1;
  size_t sVar2;
  __Named_exception *__dest;
  uint uVar3;
  __Named_exception *p_Var4;
  
  p_Var1 = this + 0x104;
  sVar2 = strlen(*(char **)(param_1 + 0x104));
  __dest = *(__Named_exception **)(this + 0x104);
  sVar2 = sVar2 + 1;
  p_Var4 = this + 4;
  uVar3 = 0x100;
  if (__dest != p_Var4) {
    uVar3 = *(uint *)p_Var4;
  }
  if (uVar3 < sVar2) {
    if (__dest != p_Var4) {
      free(__dest);
    }
    __dest = (__Named_exception *)malloc(sVar2);
    *(__Named_exception **)p_Var1 = __dest;
    if (__dest == (__Named_exception *)0x0) {
      *(__Named_exception **)p_Var1 = p_Var4;
      sVar2 = 0x100;
      __dest = p_Var4;
    }
    else {
      *(size_t *)p_Var4 = sVar2;
    }
  }
  strncpy((char *)__dest,*(char **)(param_1 + 0x104),sVar2 - 1);
  *(undefined1 *)(*(int *)p_Var1 + (sVar2 - 1)) = 0;
  return this;
}



### FUNC ~__Named_exception @ 000322c0

/* std::__Named_exception::~__Named_exception() */

void __thiscall std::__Named_exception::~__Named_exception(__Named_exception *this)

{
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  if (*(__Named_exception **)(this + 0x104) != this + 4) {
    free(*(__Named_exception **)(this + 0x104));
  }
  FUN_00030e10(this);
  return;
}



### FUNC ~__Named_exception @ 000322ec

/* std::__Named_exception::~__Named_exception() */

void __thiscall std::__Named_exception::~__Named_exception(__Named_exception *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  if (*(__Named_exception **)(this + 0x104) != this + 4) {
    free(*(__Named_exception **)(this + 0x104));
  }
  pvVar1 = (void *)FUN_00030e10(this);
  operator_delete(pvVar1);
  return;
}



### FUNC what @ 0003231c

/* std::__Named_exception::what() const */

undefined4 __thiscall std::__Named_exception::what(__Named_exception *this)

{
  return *(undefined4 *)(this + 0x104);
}



### FUNC ~logic_error @ 00032324

/* std::logic_error::~logic_error() */

void __thiscall std::logic_error::~logic_error(logic_error *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  if (*(logic_error **)(this + 0x104) != this + 4) {
    free(*(logic_error **)(this + 0x104));
  }
  pvVar1 = (void *)FUN_00030e10(this);
  operator_delete(pvVar1);
  return;
}



### FUNC ~runtime_error @ 00032354

/* std::runtime_error::~runtime_error() */

void __thiscall std::runtime_error::~runtime_error(runtime_error *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  if (*(runtime_error **)(this + 0x104) != this + 4) {
    free(*(runtime_error **)(this + 0x104));
  }
  pvVar1 = (void *)FUN_00030e10(this);
  operator_delete(pvVar1);
  return;
}



### FUNC ~domain_error @ 00032384

/* std::domain_error::~domain_error() */

void __thiscall std::domain_error::~domain_error(domain_error *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  if (*(domain_error **)(this + 0x104) != this + 4) {
    free(*(domain_error **)(this + 0x104));
  }
  pvVar1 = (void *)FUN_00030e10(this);
  operator_delete(pvVar1);
  return;
}



### FUNC ~invalid_argument @ 000323b4

/* std::invalid_argument::~invalid_argument() */

void __thiscall std::invalid_argument::~invalid_argument(invalid_argument *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  if (*(invalid_argument **)(this + 0x104) != this + 4) {
    free(*(invalid_argument **)(this + 0x104));
  }
  pvVar1 = (void *)FUN_00030e10(this);
  operator_delete(pvVar1);
  return;
}



### FUNC ~length_error @ 000323e4

/* std::length_error::~length_error() */

void __thiscall std::length_error::~length_error(length_error *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  if (*(length_error **)(this + 0x104) != this + 4) {
    free(*(length_error **)(this + 0x104));
  }
  pvVar1 = (void *)FUN_00030e10(this);
  operator_delete(pvVar1);
  return;
}



### FUNC ~out_of_range @ 00032414

/* std::out_of_range::~out_of_range() */

void __thiscall std::out_of_range::~out_of_range(out_of_range *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  if (*(out_of_range **)(this + 0x104) != this + 4) {
    free(*(out_of_range **)(this + 0x104));
  }
  pvVar1 = (void *)FUN_00030e10(this);
  operator_delete(pvVar1);
  return;
}



### FUNC ~range_error @ 00032444

/* std::range_error::~range_error() */

void __thiscall std::range_error::~range_error(range_error *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  if (*(range_error **)(this + 0x104) != this + 4) {
    free(*(range_error **)(this + 0x104));
  }
  pvVar1 = (void *)FUN_00030e10(this);
  operator_delete(pvVar1);
  return;
}



### FUNC ~overflow_error @ 00032474

/* std::overflow_error::~overflow_error() */

void __thiscall std::overflow_error::~overflow_error(overflow_error *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  if (*(overflow_error **)(this + 0x104) != this + 4) {
    free(*(overflow_error **)(this + 0x104));
  }
  pvVar1 = (void *)FUN_00030e10(this);
  operator_delete(pvVar1);
  return;
}



### FUNC ~underflow_error @ 000324a4

/* std::underflow_error::~underflow_error() */

void __thiscall std::underflow_error::~underflow_error(underflow_error *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR____Named_exception_00068e80;
  if (*(underflow_error **)(this + 0x104) != this + 4) {
    free(*(underflow_error **)(this + 0x104));
  }
  pvVar1 = (void *)FUN_00030e10(this);
  operator_delete(pvVar1);
  return;
}



### FUNC failure @ 000324d4

/* std::ios_base::failure::failure(std::string const&) */

void __thiscall std::ios_base::failure::failure(failure *this,string *param_1)

{
  undefined4 *puVar1;
  
  puVar1 = (undefined4 *)__Named_exception::__Named_exception((__Named_exception *)this,param_1);
  *puVar1 = &PTR__failure_00068fc0;
  return;
}



### FUNC ~failure @ 000324ec

/* std::ios_base::failure::~failure() */

void __thiscall std::ios_base::failure::~failure(failure *this)

{
  __Named_exception::~__Named_exception((__Named_exception *)this);
  return;
}



### FUNC ~failure @ 000324f6

/* std::ios_base::failure::~failure() */

void __thiscall std::ios_base::failure::~failure(failure *this)

{
  void *pvVar1;
  
  pvVar1 = (void *)__Named_exception::~__Named_exception((__Named_exception *)this);
  operator_delete(pvVar1);
  return;
}



### FUNC imbue @ 00032504

/* std::ios_base::imbue(std::locale const&) */

void std::ios_base::imbue(locale *param_1)

{
  int iVar1;
  int in_r1;
  locale *in_r2;
  locale *this;
  int iVar2;
  
  this = (locale *)(in_r1 + 0x20);
  iVar1 = locale::operator!=(in_r2,this);
  if (iVar1 == 1) {
    locale::locale(param_1,this);
    locale::operator=(this,in_r2);
    iVar1 = *(int *)(in_r1 + 0x2c);
    if (iVar1 != 0) {
      iVar2 = 1 - iVar1;
      iVar1 = iVar1 * -8 + 4;
      do {
        (**(code **)(*(int *)(in_r1 + 0x24) + iVar2 * -8))
                  (1,in_r1,*(undefined4 *)(*(int *)(in_r1 + 0x24) - iVar1));
        iVar1 = iVar1 + 8;
        iVar2 = iVar2 + 1;
      } while (iVar2 != 1);
    }
    return;
  }
  iVar1 = *(int *)(in_r1 + 0x2c);
  if (iVar1 != 0) {
    iVar2 = 1 - iVar1;
    iVar1 = iVar1 * -8 + 4;
    do {
      (**(code **)(*(int *)(in_r1 + 0x24) + iVar2 * -8))
                (1,in_r1,*(undefined4 *)(*(int *)(in_r1 + 0x24) - iVar1));
      iVar1 = iVar1 + 8;
      iVar2 = iVar2 + 1;
    } while (iVar2 != 1);
  }
  locale::locale(param_1,this);
  return;
}



### FUNC _M_invoke_callbacks @ 000325c6

/* std::ios_base::_M_invoke_callbacks(std::ios_base::event) */

void __thiscall std::ios_base::_M_invoke_callbacks(ios_base *this,undefined4 param_2)

{
  int iVar1;
  int iVar2;
  
  iVar1 = *(int *)(this + 0x2c);
  if (iVar1 != 0) {
    iVar2 = 1 - iVar1;
    iVar1 = iVar1 * -8 + 4;
    do {
      (**(code **)(*(int *)(this + 0x24) + iVar2 * -8))
                (param_2,this,*(undefined4 *)(*(int *)(this + 0x24) - iVar1));
      iVar1 = iVar1 + 8;
      iVar2 = iVar2 + 1;
    } while (iVar2 != 1);
  }
  return;
}



### FUNC xalloc @ 00032608

/* std::ios_base::xalloc() */

int std::ios_base::xalloc(void)

{
  int iVar1;
  
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070a3c);
  iVar1 = DAT_00070a38;
  DAT_00070a38 = DAT_00070a38 + 1;
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070a3c);
  return iVar1;
}



### FUNC iword @ 00032634

/* std::ios_base::iword(int) */

undefined * __thiscall std::ios_base::iword(ios_base *this,int param_1)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  void *__ptr;
  
  __ptr = *(void **)(this + 0x30);
  uVar4 = *(uint *)(this + 0x34);
  uVar2 = uVar4;
  if ((int)uVar4 <= param_1) {
    uVar2 = param_1 + 1U;
    if (param_1 + 1U <= uVar4 << 1) {
      uVar2 = uVar4 << 1;
    }
    __ptr = realloc(__ptr,uVar2 << 2);
    if (__ptr == (void *)0x0) goto LAB_000326ac;
    uVar3 = uVar2 - uVar4;
    if (0 < (int)(uVar3 * 4)) {
      iVar1 = 0x3fffffff;
      if ((uVar3 | 0xc0000000) != 0xc0000000) {
        iVar1 = 0x3ffffffe;
      }
      __aeabi_memclr4((void *)((int)__ptr + uVar4 * 4),(iVar1 + uVar3) * 4 + 8);
    }
  }
  if (__ptr != (void *)0x0) {
    *(void **)(this + 0x30) = __ptr;
    *(uint *)(this + 0x34) = uVar2;
    return (undefined *)((int)__ptr + param_1 * 4);
  }
LAB_000326ac:
  uVar2 = *(uint *)(this + 8);
  *(uint *)(this + 8) = uVar2 | 1;
  if ((*(uint *)(this + 0x14) & (uVar2 | 1)) != 0) {
                    /* WARNING: Subroutine does not return */
    _M_throw_failure();
  }
  return &DAT_00070a40;
}



### FUNC pword @ 000326d0

/* std::ios_base::pword(int) */

undefined * __thiscall std::ios_base::pword(ios_base *this,int param_1)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  void *__ptr;
  
  __ptr = *(void **)(this + 0x38);
  uVar4 = *(uint *)(this + 0x3c);
  uVar2 = uVar4;
  if ((int)uVar4 <= param_1) {
    uVar2 = param_1 + 1U;
    if (param_1 + 1U <= uVar4 << 1) {
      uVar2 = uVar4 << 1;
    }
    __ptr = realloc(__ptr,uVar2 << 2);
    if (__ptr == (void *)0x0) goto LAB_00032748;
    uVar3 = uVar2 - uVar4;
    if (0 < (int)(uVar3 * 4)) {
      iVar1 = 0x3fffffff;
      if ((uVar3 | 0xc0000000) != 0xc0000000) {
        iVar1 = 0x3ffffffe;
      }
      __aeabi_memclr4((void *)((int)__ptr + uVar4 * 4),(iVar1 + uVar3) * 4 + 8);
    }
  }
  if (__ptr != (void *)0x0) {
    *(void **)(this + 0x38) = __ptr;
    *(uint *)(this + 0x3c) = uVar2;
    return (undefined *)((int)__ptr + param_1 * 4);
  }
LAB_00032748:
  uVar2 = *(uint *)(this + 8);
  *(uint *)(this + 8) = uVar2 | 1;
  if ((*(uint *)(this + 0x14) & (uVar2 | 1)) != 0) {
                    /* WARNING: Subroutine does not return */
    _M_throw_failure();
  }
  return &DAT_00070a44;
}



### FUNC register_callback @ 0003276c

/* std::ios_base::register_callback(void (*)(std::ios_base::event, std::ios_base&, int), int) */

void __thiscall
std::ios_base::register_callback
          (ios_base *this,_func_void_event_ios_base_ptr_int *param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  void *__ptr;
  uint uVar4;
  
  __ptr = *(void **)(this + 0x24);
  uVar4 = *(uint *)(this + 0x28);
  uVar2 = uVar4;
  if ((int)uVar4 <= *(int *)(this + 0x2c)) {
    uVar2 = *(int *)(this + 0x2c) + 1;
    if (uVar2 <= uVar4 << 1) {
      uVar2 = uVar4 << 1;
    }
    __ptr = realloc(__ptr,uVar2 << 3);
    if (__ptr == (void *)0x0) goto LAB_000327f6;
    uVar3 = uVar2 - uVar4;
    if (0 < (int)(uVar3 * 8)) {
      iVar1 = 0x1fffffff;
      if ((uVar3 | 0xe0000000) != 0xe0000000) {
        iVar1 = 0x1ffffffe;
      }
      __aeabi_memclr4((void *)((int)__ptr + uVar4 * 8),(iVar1 + uVar3) * 8 + 0x10);
    }
  }
  if (__ptr != (void *)0x0) {
    *(uint *)(this + 0x28) = uVar2;
    *(void **)(this + 0x24) = __ptr;
    iVar1 = *(int *)(this + 0x2c);
    *(int *)(this + 0x2c) = iVar1 + 1;
    iVar1 = iVar1 * 8;
    *(_func_void_event_ios_base_ptr_int **)((int)__ptr + iVar1) = param_1;
    *(int *)((int)__ptr + iVar1 + 4) = param_2;
    return;
  }
LAB_000327f6:
  uVar2 = *(uint *)(this + 8);
  *(uint *)(this + 8) = uVar2 | 1;
  if ((*(uint *)(this + 0x14) & (uVar2 | 1)) != 0) {
                    /* WARNING: Subroutine does not return */
    _M_throw_failure();
  }
  return;
}



### FUNC _M_throw_failure @ 00032810

/* std::ios_base::_M_throw_failure() */

void std::ios_base::_M_throw_failure(void)

{
  __Named_exception *this;
  undefined1 auStack_30 [4];
  string asStack_2c [24];
  
  this = (__Named_exception *)FUN_00030824(0x108);
  FUN_00031c38(asStack_2c,&LAB_00032890,auStack_30);
  __Named_exception::__Named_exception(this,asStack_2c);
  *(undefined ***)this = &PTR__failure_00068fc0;
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(this,&failure::typeinfo,failure::~failure);
}



### FUNC _M_copy_state @ 000328a8

/* std::ios_base::_M_copy_state(std::ios_base const&) */

void __thiscall std::ios_base::_M_copy_state(ios_base *this,ios_base *param_1)

{
  int iVar1;
  size_t sVar2;
  void *pvVar3;
  undefined4 uVar4;
  uint uVar5;
  int iVar6;
  
  *(undefined4 *)(this + 4) = *(undefined4 *)(param_1 + 4);
  *(undefined4 *)(this + 0xc) = *(undefined4 *)(param_1 + 0xc);
  *(undefined4 *)(this + 0x10) = *(undefined4 *)(param_1 + 0x10);
  *(undefined4 *)(this + 0x18) = *(undefined4 *)(param_1 + 0x18);
  *(undefined4 *)(this + 0x1c) = *(undefined4 *)(param_1 + 0x1c);
  locale::operator=((locale *)(this + 0x20),(locale *)(param_1 + 0x20));
  iVar1 = *(int *)(param_1 + 0x24);
  if (iVar1 != 0) {
    iVar6 = *(int *)(param_1 + 0x2c);
    sVar2 = iVar6 << 3;
    pvVar3 = malloc(sVar2);
    if ((iVar6 != 0) && (pvVar3 != (void *)0x0)) {
      __aeabi_memcpy(pvVar3,iVar1,sVar2);
    }
    if (pvVar3 == (void *)0x0) {
      uVar5 = *(uint *)(this + 8);
      *(uint *)(this + 8) = uVar5 | 1;
      if ((*(uint *)(this + 0x14) & (uVar5 | 1)) != 0) goto LAB_000329b4;
    }
    else {
      free(*(void **)(this + 0x24));
      *(void **)(this + 0x24) = pvVar3;
      uVar4 = *(undefined4 *)(param_1 + 0x2c);
      *(undefined4 *)(this + 0x28) = uVar4;
      *(undefined4 *)(this + 0x2c) = uVar4;
    }
  }
  iVar1 = *(int *)(param_1 + 0x30);
  if (iVar1 != 0) {
    iVar6 = *(int *)(param_1 + 0x34);
    sVar2 = iVar6 << 2;
    pvVar3 = malloc(sVar2);
    if ((iVar6 != 0) && (pvVar3 != (void *)0x0)) {
      __aeabi_memcpy(pvVar3,iVar1,sVar2);
    }
    if (pvVar3 == (void *)0x0) {
      uVar5 = *(uint *)(this + 8);
      *(uint *)(this + 8) = uVar5 | 1;
      if ((*(uint *)(this + 0x14) & (uVar5 | 1)) != 0) goto LAB_000329b4;
    }
    else {
      free(*(void **)(this + 0x30));
      *(void **)(this + 0x30) = pvVar3;
      *(undefined4 *)(this + 0x34) = *(undefined4 *)(param_1 + 0x34);
    }
  }
  iVar1 = *(int *)(param_1 + 0x38);
  if (iVar1 != 0) {
    iVar6 = *(int *)(param_1 + 0x3c);
    sVar2 = iVar6 << 2;
    pvVar3 = malloc(sVar2);
    if ((iVar6 != 0) && (pvVar3 != (void *)0x0)) {
      __aeabi_memcpy(pvVar3,iVar1,sVar2);
    }
    if (pvVar3 != (void *)0x0) {
      free(*(void **)(this + 0x38));
      *(void **)(this + 0x38) = pvVar3;
      *(undefined4 *)(this + 0x3c) = *(undefined4 *)(param_1 + 0x3c);
      return;
    }
    uVar5 = *(uint *)(this + 8);
    *(uint *)(this + 8) = uVar5 | 1;
    if ((*(uint *)(this + 0x14) & (uVar5 | 1)) != 0) {
LAB_000329b4:
                    /* WARNING: Subroutine does not return */
      _M_throw_failure();
    }
  }
  return;
}



### FUNC ios_base @ 000329b8

/* std::ios_base::ios_base() */

ios_base * __thiscall std::ios_base::ios_base(ios_base *this)

{
  *(undefined4 *)(this + 0x1c) = 0;
  *(undefined4 *)(this + 0x18) = 0;
  *(undefined4 *)(this + 0x14) = 0;
  *(undefined4 *)(this + 0x10) = 0;
  *(undefined4 *)(this + 0xc) = 0;
  *(undefined4 *)(this + 8) = 0;
  *(undefined4 *)(this + 4) = 0;
  *(undefined ***)this = &PTR__ios_base_00068fe0;
  locale::locale((locale *)(this + 0x20));
  *(undefined4 *)(this + 0x24) = 0;
  *(undefined4 *)(this + 0x28) = 0;
  *(undefined4 *)(this + 0x2c) = 0;
  *(undefined4 *)(this + 0x30) = 0;
  *(undefined4 *)(this + 0x34) = 0;
  *(undefined4 *)(this + 0x38) = 0;
  *(undefined4 *)(this + 0x3c) = 0;
  return this;
}



### FUNC ~ios_base @ 000329f8

/* std::ios_base::~ios_base() */

ios_base * __thiscall std::ios_base::~ios_base(ios_base *this)

{
  int iVar1;
  int iVar2;
  
  *(undefined ***)this = &PTR__ios_base_00068fe0;
  iVar1 = *(int *)(this + 0x2c);
  if (iVar1 != 0) {
    iVar2 = 1 - iVar1;
    iVar1 = iVar1 * -8 + 4;
    do {
      (**(code **)(*(int *)(this + 0x24) + iVar2 * -8))
                (0,this,*(undefined4 *)(*(int *)(this + 0x24) - iVar1));
      iVar1 = iVar1 + 8;
      iVar2 = iVar2 + 1;
    } while (iVar2 != 1);
  }
  free(*(void **)(this + 0x24));
  free(*(void **)(this + 0x30));
  free(*(void **)(this + 0x38));
  locale::~locale((locale *)(this + 0x20));
  return this;
}



### FUNC ~ios_base @ 00032a78

/* std::ios_base::~ios_base() */

void __thiscall std::ios_base::~ios_base(ios_base *this)

{
  ~ios_base(this);
  operator_delete(this);
  return;
}



### FUNC Init @ 00032a98

/* std::ios_base::Init::Init() */

Init * __thiscall std::ios_base::Init::Init(Init *this)

{
  int iVar1;
  
  iVar1 = _S_count;
  _S_count = _S_count + 1;
  if (iVar1 != 0) {
    return this;
  }
  FUN_0004d7dc();
  _S_initialize();
  _Filebuf_base::_S_initialize();
  return this;
}



### FUNC _S_initialize @ 00032ac8

/* std::ios_base::_S_initialize() */

void std::ios_base::_S_initialize(void)

{
  undefined4 *puVar1;
  undefined4 uVar2;
  undefined4 uVar3;
  undefined4 uVar4;
  undefined4 uVar5;
  undefined4 *local_20;
  undefined4 *local_1c;
  undefined4 *local_18;
  
  if (_S_is_synced == '\0') {
    puVar1 = (undefined4 *)FUN_000333c0(&__sF,8);
  }
  else {
    puVar1 = (undefined4 *)operator_new(0x24);
    FUN_0004ec64(puVar1,&__sF);
    *puVar1 = &DAT_00069e3c;
  }
  if (_S_is_synced == '\0') {
    local_20 = (undefined4 *)FUN_000333c0(pthread_key_create,0x10);
    local_1c = (undefined4 *)FUN_000333c0(isupper,0x10);
    local_18 = (undefined4 *)FUN_000333c0(isupper,0x10);
  }
  else {
    local_20 = (undefined4 *)operator_new(0x24);
    FUN_0004ec64(local_20,pthread_key_create);
    *local_20 = &DAT_00069e98;
    local_1c = (undefined4 *)operator_new(0x24);
    FUN_0004ec64(local_1c,isupper);
    *local_1c = &DAT_00069e98;
    local_18 = (undefined4 *)operator_new(0x24);
    FUN_0004ec64(local_18,isupper);
    *local_18 = &DAT_00069e98;
  }
  ios_base((ios_base *)(cin + 8));
  cin[0x4c] = 0;
  cin._80_4_ = 0;
  cin._84_4_ = 0;
  cin._0_4_ = &DAT_00069134;
  cin._4_4_ = 0;
  cin._8_4_ = &PTR_LAB_0003549a_1_00069148;
  FUN_000353f8(0x70a50,puVar1);
  ios_base((ios_base *)(cout + 4));
  cout[0x48] = 0;
  cout._76_4_ = 0;
  cout._80_4_ = 0;
  cout._0_4_ = &DAT_00069184;
  cout._4_4_ = &PTR_LAB_000355ba_1_00069198;
  FUN_000353f8(0x70aa4,local_20);
  ios_base((ios_base *)(cerr + 4));
  cerr[0x48] = 0;
  cerr._76_4_ = 0;
  cerr._80_4_ = 0;
  cerr._0_4_ = &DAT_00069184;
  cerr._4_4_ = &PTR_LAB_000355ba_1_00069198;
  FUN_000353f8(0x70afc,local_1c);
  ios_base((ios_base *)(clog + 4));
  clog[0x48] = 0;
  clog._76_4_ = 0;
  clog._80_4_ = 0;
  clog._0_4_ = &DAT_00069184;
  clog._4_4_ = &PTR_LAB_000355ba_1_00069198;
  FUN_000353f8(0x70b54,local_18);
  *(undefined1 **)(cin + *(int *)(cin._0_4_ + -0xc) + 0x4c) = cout;
  *(uint *)(cerr + *(int *)(cerr._0_4_ + -0xc) + 4) =
       *(uint *)(cerr + *(int *)(cerr._0_4_ + -0xc) + 4) | 0x2000;
  uVar2 = FUN_00033432(&__sF,8);
  uVar3 = FUN_00033432(pthread_key_create,0x10);
  uVar4 = FUN_00033432(isupper,0x10);
  uVar5 = FUN_00033432(isupper,0x10);
  ios_base((ios_base *)(wcin + 8));
  wcin._76_4_ = 0;
  wcin._80_4_ = 0;
  wcin._84_4_ = 0;
  wcin._0_4_ = &DAT_000691c4;
  wcin._4_4_ = 0;
  wcin._8_4_ = &PTR_LAB_000356a2_1_000691d8;
  FUN_000355fc(0x70bb0,uVar2);
  ios_base((ios_base *)(wcout + 4));
  wcout._72_4_ = 0;
  wcout._76_4_ = 0;
  wcout._80_4_ = 0;
  wcout._0_4_ = &DAT_00069214;
  wcout._4_4_ = &PTR_LAB_000357c2_1_00069228;
  FUN_000355fc(0x70c04,uVar3);
  ios_base((ios_base *)(wcerr + 4));
  wcerr._72_4_ = 0;
  wcerr._76_4_ = 0;
  wcerr._80_4_ = 0;
  wcerr._0_4_ = &DAT_00069214;
  wcerr._4_4_ = &PTR_LAB_000357c2_1_00069228;
  FUN_000355fc(0x70c5c,uVar4);
  ios_base((ios_base *)(wclog + 4));
  wclog._72_4_ = 0;
  wclog._76_4_ = 0;
  wclog._80_4_ = 0;
  wclog._0_4_ = &DAT_00069214;
  wclog._4_4_ = &PTR_LAB_000357c2_1_00069228;
  FUN_000355fc(0x70cb4,uVar5);
  *(undefined1 **)(wcin + *(int *)(wcin._0_4_ + -0xc) + 0x4c) = wcout;
  *(uint *)(wcerr + *(int *)(wcerr._0_4_ + -0xc) + 4) =
       *(uint *)(wcerr + *(int *)(wcerr._0_4_ + -0xc) + 4) | 0x2000;
  return;
}



### FUNC ~Init @ 000330b4

/* std::ios_base::Init::~Init() */

Init * __thiscall std::ios_base::Init::~Init(Init *this)

{
  _S_count = _S_count + -1;
  if (_S_count != 0) {
    return this;
  }
  _S_uninitialize();
  FUN_0004d8ac();
  return this;
}



### FUNC _S_uninitialize @ 000330dc

/* std::ios_base::_S_uninitialize() */

void std::ios_base::_S_uninitialize(void)

{
  int *piVar1;
  int iVar2;
  
  iVar2 = *(int *)(cin._0_4_ + -0xc);
  *(undefined4 *)(cin + iVar2 + 0x14) = 0;
  *(uint *)(cin + iVar2 + 8) =
       *(uint *)(cin + iVar2 + 8) | (uint)(*(int *)(cin + iVar2 + 0x48) == 0);
  iVar2 = *(int *)(cout._0_4_ + -0xc);
  *(undefined4 *)(cout + iVar2 + 0x14) = 0;
  *(uint *)(cout + iVar2 + 8) =
       *(uint *)(cout + iVar2 + 8) | (uint)(*(int *)(cout + iVar2 + 0x48) == 0);
  iVar2 = *(int *)(cerr._0_4_ + -0xc);
  *(undefined4 *)(cerr + iVar2 + 0x14) = 0;
  *(uint *)(cerr + iVar2 + 8) =
       *(uint *)(cerr + iVar2 + 8) | (uint)(*(int *)(cerr + iVar2 + 0x48) == 0);
  iVar2 = *(int *)(clog._0_4_ + -0xc);
  *(undefined4 *)(clog + iVar2 + 0x14) = 0;
  *(uint *)(clog + iVar2 + 8) =
       *(uint *)(clog + iVar2 + 8) | (uint)(*(int *)(clog + iVar2 + 0x48) == 0);
  iVar2 = *(int *)(cin._0_4_ + -0xc);
  *(undefined4 *)(cin + iVar2 + 8) = 1;
  piVar1 = *(int **)(cin + iVar2 + 0x48);
  *(undefined4 *)(cin + iVar2 + 0x48) = 0;
  if ((cin[iVar2 + 0x14] & 1) == 0) {
    if (piVar1 != (int *)0x0) {
      (**(code **)(*piVar1 + 4))();
    }
    iVar2 = *(int *)(cout._0_4_ + -0xc);
    *(undefined4 *)(cout + iVar2 + 8) = 1;
    piVar1 = *(int **)(cout + iVar2 + 0x48);
    *(undefined4 *)(cout + iVar2 + 0x48) = 0;
    if ((cout[iVar2 + 0x14] & 1) == 0) {
      if (piVar1 != (int *)0x0) {
        (**(code **)(*piVar1 + 4))();
      }
      iVar2 = *(int *)(cerr._0_4_ + -0xc);
      *(undefined4 *)(cerr + iVar2 + 8) = 1;
      piVar1 = *(int **)(cerr + iVar2 + 0x48);
      *(undefined4 *)(cerr + iVar2 + 0x48) = 0;
      if ((cerr[iVar2 + 0x14] & 1) == 0) {
        if (piVar1 != (int *)0x0) {
          (**(code **)(*piVar1 + 4))();
        }
        iVar2 = *(int *)(clog._0_4_ + -0xc);
        *(undefined4 *)(clog + iVar2 + 8) = 1;
        piVar1 = *(int **)(clog + iVar2 + 0x48);
        *(undefined4 *)(clog + iVar2 + 0x48) = 0;
        if ((clog[iVar2 + 0x14] & 1) == 0) {
          if (piVar1 != (int *)0x0) {
            (**(code **)(*piVar1 + 4))();
          }
          (**(code **)cin._0_4_)();
          (**(code **)cout._0_4_)();
          (**(code **)cerr._0_4_)();
          (**(code **)clog._0_4_)();
          iVar2 = *(int *)(wcin._0_4_ + -0xc);
          *(undefined4 *)(wcin + iVar2 + 0x14) = 0;
          *(uint *)(wcin + iVar2 + 8) =
               *(uint *)(wcin + iVar2 + 8) | (uint)(*(int *)(wcin + iVar2 + 0x48) == 0);
          iVar2 = *(int *)(wcout._0_4_ + -0xc);
          *(undefined4 *)(wcout + iVar2 + 0x14) = 0;
          *(uint *)(wcout + iVar2 + 8) =
               *(uint *)(wcout + iVar2 + 8) | (uint)(*(int *)(wcout + iVar2 + 0x48) == 0);
          iVar2 = *(int *)(wcerr._0_4_ + -0xc);
          *(undefined4 *)(wcerr + iVar2 + 0x14) = 0;
          *(uint *)(wcerr + iVar2 + 8) =
               *(uint *)(wcerr + iVar2 + 8) | (uint)(*(int *)(wcerr + iVar2 + 0x48) == 0);
          iVar2 = *(int *)(wclog._0_4_ + -0xc);
          *(undefined4 *)(wclog + iVar2 + 0x14) = 0;
          *(uint *)(wclog + iVar2 + 8) =
               *(uint *)(wclog + iVar2 + 8) | (uint)(*(int *)(wclog + iVar2 + 0x48) == 0);
          iVar2 = *(int *)(wcin._0_4_ + -0xc);
          *(undefined4 *)(wcin + iVar2 + 8) = 1;
          piVar1 = *(int **)(wcin + iVar2 + 0x48);
          *(undefined4 *)(wcin + iVar2 + 0x48) = 0;
          if ((wcin[iVar2 + 0x14] & 1) == 0) {
            if (piVar1 != (int *)0x0) {
              (**(code **)(*piVar1 + 4))();
            }
            iVar2 = *(int *)(wcout._0_4_ + -0xc);
            *(undefined4 *)(wcout + iVar2 + 8) = 1;
            piVar1 = *(int **)(wcout + iVar2 + 0x48);
            *(undefined4 *)(wcout + iVar2 + 0x48) = 0;
            if ((wcout[iVar2 + 0x14] & 1) == 0) {
              if (piVar1 != (int *)0x0) {
                (**(code **)(*piVar1 + 4))();
              }
              iVar2 = *(int *)(wcerr._0_4_ + -0xc);
              *(undefined4 *)(wcerr + iVar2 + 8) = 1;
              piVar1 = *(int **)(wcerr + iVar2 + 0x48);
              *(undefined4 *)(wcerr + iVar2 + 0x48) = 0;
              if ((wcerr[iVar2 + 0x14] & 1) == 0) {
                if (piVar1 != (int *)0x0) {
                  (**(code **)(*piVar1 + 4))();
                }
                iVar2 = *(int *)(wclog._0_4_ + -0xc);
                *(undefined4 *)(wclog + iVar2 + 8) = 1;
                piVar1 = *(int **)(wclog + iVar2 + 0x48);
                *(undefined4 *)(wclog + iVar2 + 0x48) = 0;
                if ((wclog[iVar2 + 0x14] & 1) == 0) {
                  if (piVar1 != (int *)0x0) {
                    (**(code **)(*piVar1 + 4))();
                  }
                  (**(code **)wcin._0_4_)();
                  (**(code **)wcout._0_4_)();
                  (**(code **)wcerr._0_4_)();
                  (**(code **)wclog._0_4_)();
                  return;
                }
              }
            }
          }
        }
      }
    }
  }
                    /* WARNING: Subroutine does not return */
  _M_throw_failure();
}



### FUNC FUN_000333c0 @ 000333c0

int * FUN_000333c0(int param_1)

{
  int *piVar1;
  int *piVar2;
  int *piVar3;
  int iVar4;
  int *piVar5;
  
  piVar3 = (int *)operator_new(0x7c);
  iVar4 = FUN_0003469c();
  std::_Filebuf_base::_M_open(iVar4 + 0x20,(int)*(short *)(param_1 + 0xe));
  piVar5 = (int *)(uint)*(byte *)(piVar3 + 10);
  piVar1 = piVar5;
  piVar2 = piVar3;
  if ((piVar5 != (int *)0x0) && (piVar2 = (int *)0x0, piVar5 != (int *)0x0)) {
    piVar1 = piVar3;
    piVar2 = (int *)0x0;
  }
  if (piVar5 == (int *)0x0) {
    (**(code **)(*piVar2 + 4))(piVar2);
  }
  return piVar1;
}



### FUNC FUN_00033432 @ 00033432

int * FUN_00033432(int param_1)

{
  int *piVar1;
  int *piVar2;
  int *piVar3;
  int iVar4;
  int *piVar5;
  
  piVar3 = (int *)operator_new(0x94);
  iVar4 = FUN_000337bc();
  std::_Filebuf_base::_M_open(iVar4 + 0x20,(int)*(short *)(param_1 + 0xe));
  piVar5 = (int *)(uint)*(byte *)(piVar3 + 10);
  piVar1 = piVar5;
  piVar2 = piVar3;
  if ((piVar5 != (int *)0x0) && (piVar2 = (int *)0x0, piVar5 != (int *)0x0)) {
    piVar1 = piVar3;
    piVar2 = (int *)0x0;
  }
  if (piVar5 == (int *)0x0) {
    (**(code **)(*piVar2 + 4))(piVar2);
  }
  return piVar1;
}



### FUNC sync_with_stdio @ 000334a4

/* std::ios_base::sync_with_stdio(bool) */

undefined1 std::ios_base::sync_with_stdio(bool param_1)

{
  char cVar1;
  int *piVar2;
  int *piVar3;
  int *piVar4;
  int *piVar5;
  int *piVar6;
  int iVar7;
  
  cVar1 = _S_is_synced;
  if ((param_1 != (bool)_S_is_synced) && (cVar1 = param_1, Init::_S_count != 0)) {
    if (param_1) {
      piVar2 = (int *)operator_new(0x24);
      FUN_0004ec64(piVar2,&__sF);
      *piVar2 = (int)&DAT_00069e3c;
      piVar3 = (int *)operator_new(0x24);
      FUN_0004ec64(piVar3,pthread_key_create);
      *piVar3 = (int)&DAT_00069e98;
      piVar4 = (int *)operator_new(0x24);
      FUN_0004ec64(piVar4,isupper);
      *piVar4 = (int)&DAT_00069e98;
      piVar5 = (int *)operator_new(0x24);
      FUN_0004ec64(piVar5,isupper);
      *piVar5 = (int)&DAT_00069e98;
    }
    else {
      piVar2 = (int *)FUN_000333c0(&__sF,8);
      piVar3 = (int *)FUN_000333c0(pthread_key_create,0x10);
      piVar4 = (int *)FUN_000333c0(isupper,0x10);
      piVar5 = (int *)FUN_000333c0(isupper,0x10);
    }
    if ((((piVar2 == (int *)0x0) || (piVar3 == (int *)0x0)) || (piVar4 == (int *)0x0)) ||
       (piVar5 == (int *)0x0)) {
      param_1 = _S_is_synced != '\0';
      if (piVar5 != (int *)0x0) {
        (**(code **)(*piVar5 + 4))();
      }
      if (piVar4 != (int *)0x0) {
        (**(code **)(*piVar4 + 4))(piVar4);
      }
      if (piVar3 != (int *)0x0) {
        (**(code **)(*piVar3 + 4))(piVar3);
      }
      cVar1 = _S_is_synced;
      if (piVar2 != (int *)0x0) {
        (**(code **)(*piVar2 + 4))();
        cVar1 = _S_is_synced;
      }
    }
    else {
      iVar7 = *(int *)(cin._0_4_ + -0xc);
      *(undefined4 *)(cin + iVar7 + 8) = 0;
      piVar6 = *(int **)(cin + iVar7 + 0x48);
      *(int **)(cin + iVar7 + 0x48) = piVar2;
      if (piVar6 != (int *)0x0) {
        (**(code **)(*piVar6 + 4))();
      }
      iVar7 = *(int *)(cout._0_4_ + -0xc);
      *(undefined4 *)(cout + iVar7 + 8) = 0;
      piVar2 = *(int **)(cout + iVar7 + 0x48);
      *(int **)(cout + iVar7 + 0x48) = piVar3;
      if (piVar2 != (int *)0x0) {
        (**(code **)(*piVar2 + 4))();
      }
      iVar7 = *(int *)(cerr._0_4_ + -0xc);
      *(undefined4 *)(cerr + iVar7 + 8) = 0;
      piVar2 = *(int **)(cerr + iVar7 + 0x48);
      *(int **)(cerr + iVar7 + 0x48) = piVar4;
      if (piVar2 != (int *)0x0) {
        (**(code **)(*piVar2 + 4))();
      }
      iVar7 = *(int *)(clog._0_4_ + -0xc);
      *(undefined4 *)(clog + iVar7 + 8) = 0;
      piVar2 = *(int **)(clog + iVar7 + 0x48);
      *(int **)(clog + iVar7 + 0x48) = piVar5;
      cVar1 = param_1;
      if (piVar2 != (int *)0x0) {
        (**(code **)(*piVar2 + 4))();
        cVar1 = param_1;
      }
    }
  }
  _S_is_synced = cVar1;
  return param_1;
}



### FUNC FUN_000337bc @ 000337bc

undefined4 * FUN_000337bc(undefined4 *param_1)

{
  locale alStack_18 [4];
  
  param_1[6] = 0;
  param_1[5] = 0;
  param_1[4] = 0;
  param_1[3] = 0;
  param_1[2] = 0;
  param_1[1] = 0;
  *param_1 = &PTR_FUN_00034204_1_00069050;
  std::locale::locale((locale *)(param_1 + 7));
  *param_1 = &PTR_FUN_000338f0_1_00068ff8;
  std::_Filebuf_base::_Filebuf_base((_Filebuf_base *)(param_1 + 8));
  *(undefined1 *)((int)param_1 + 0x32) = 0;
  *(undefined2 *)(param_1 + 0xc) = 0;
  param_1[0xb] = 0;
  __aeabi_memclr4(param_1 + 0xd,0x38);
  param_1[0x1b] = 1;
  param_1[0x1c] = 1;
  std::locale::locale(alStack_18);
  FUN_00033858(param_1,alStack_18,0);
  std::locale::~locale(alStack_18);
  return param_1;
}



### FUNC FUN_00033858 @ 00033858

void FUN_00033858(int param_1,locale *param_2,int param_3)

{
  undefined1 uVar1;
  int iVar2;
  int *piVar3;
  int iVar4;
  undefined4 uVar5;
  
  iVar2 = std::locale::_M_get_facet(param_2,(id *)&std::codecvt<wchar_t,char,mbstate_t>::id);
  if (iVar2 != 0) {
    piVar3 = (int *)std::locale::_M_use_facet
                              (param_2,(id *)&std::codecvt<wchar_t,char,mbstate_t>::id);
    *(int **)(param_1 + 0x68) = piVar3;
    iVar4 = (**(code **)(*piVar3 + 0x14))();
    iVar2 = iVar4;
    if (iVar4 < 2) {
      iVar2 = 1;
    }
    *(int *)(param_1 + 0x6c) = iVar2;
    uVar5 = (**(code **)(**(int **)(param_1 + 0x68) + 0x20))();
    *(bool *)(param_1 + 0x2c) = 0 < iVar4;
    *(undefined4 *)(param_1 + 0x70) = uVar5;
    uVar1 = (**(code **)(**(int **)(param_1 + 0x68) + 0x18))();
    *(undefined1 *)(param_1 + 0x2d) = uVar1;
    return;
  }
  *(undefined4 *)(param_1 + 0x68) = 0;
  *(undefined4 *)(param_1 + 0x6c) = 1;
  *(undefined4 *)(param_1 + 0x70) = 1;
  *(undefined2 *)(param_1 + 0x2c) = 0;
  if (param_3 != 0) {
    std::locale::_M_use_facet(param_2,(id *)&std::codecvt<wchar_t,char,mbstate_t>::id);
  }
  return;
}



### FUNC FUN_000338f0 @ 000338f0

undefined4 * FUN_000338f0(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_000338f0_1_00068ff8;
  FUN_0003427a(param_1);
  if (*(char *)((int)param_1 + 0x2e) != '\0') {
    free((void *)param_1[0xd]);
  }
  free((void *)param_1[0xf]);
  param_1[0xd] = 0;
  param_1[0xe] = 0;
  param_1[0xf] = 0;
  param_1[0x10] = 0;
  *param_1 = &PTR_FUN_00034204_1_00069050;
  std::locale::~locale((locale *)(param_1 + 7));
  return param_1;
}



### FUNC FUN_00033960 @ 00033960

void FUN_00033960(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_000338f0_1_00068ff8;
  FUN_0003427a(param_1);
  if (*(char *)((int)param_1 + 0x2e) != '\0') {
    free((void *)param_1[0xd]);
  }
  free((void *)param_1[0xf]);
  param_1[0xd] = 0;
  param_1[0xe] = 0;
  param_1[0xf] = 0;
  param_1[0x10] = 0;
  *param_1 = &PTR_FUN_00034204_1_00069050;
  std::locale::~locale((locale *)(param_1 + 7));
  operator_delete(param_1);
  return;
}



### FUNC FUN_000339d8 @ 000339d8

int FUN_000339d8(int param_1,int param_2,int param_3)

{
  if ((((*(char *)(param_1 + 0x2f) == '\0') && (*(char *)(param_1 + 0x30) == '\0')) &&
      (*(char *)(param_1 + 0x31) == '\0')) && (*(int *)(param_1 + 0x34) == 0)) {
    if ((param_2 == 0) && (param_3 == 0)) {
      param_2 = 0;
      param_3 = 1;
    }
    else {
      if (param_2 == 0) {
        return param_1;
      }
      if (param_3 < 1) {
        return param_1;
      }
    }
    FUN_0003437c(param_1,param_2,param_3);
  }
  return param_1;
}



### FUNC FUN_00033a1c @ 00033a1c

int * FUN_00033a1c(int *param_1,int param_2,int param_3,int param_4)

{
  int iVar1;
  int *piVar2;
  int iVar3;
  char *pcVar4;
  _Filebuf_base *p_Var5;
  int *local_18;
  
  if (*(char *)(param_2 + 0x28) == '\0') {
    *param_1 = -1;
    param_1[1] = 0;
    return param_1;
  }
  if ((param_3 != 0) && (*(char *)(param_2 + 0x2c) == '\0')) {
    *param_1 = -1;
    param_1[1] = 0;
    return param_1 + 2;
  }
  iVar1 = FUN_00034400(param_2,param_4 != 2 || param_3 != 0);
  if (iVar1 != 0) {
    if ((param_4 == 4) || (param_4 == 1)) {
      iVar1 = std::_Filebuf_base::_M_seek
                        ((_Filebuf_base *)(param_2 + 0x20),*(int *)(param_2 + 0x6c) * param_3,
                         param_4);
      piVar2 = (int *)(iVar1 + 1);
      if (piVar2 != (int *)0x0) {
        if (*(char *)(param_2 + 0x2f) != '\0') {
          if (*(void **)(param_2 + 0x54) != (void *)0x0) {
            std::_Filebuf_base::_M_unmap
                      ((_Filebuf_base *)(param_2 + 0x20),*(void **)(param_2 + 0x54),
                       *(long *)(param_2 + 0x58));
            *(undefined4 *)(param_2 + 0x54) = 0;
            *(undefined4 *)(param_2 + 0x58) = 0;
          }
          *(undefined1 *)(param_2 + 0x2f) = 0;
        }
        piVar2 = (int *)0x0;
        *(undefined4 *)(param_2 + 4) = 0;
        *(undefined4 *)(param_2 + 8) = 0;
        *(undefined4 *)(param_2 + 0xc) = 0;
        *(undefined4 *)(param_2 + 0x10) = 0;
        *(undefined4 *)(param_2 + 0x14) = 0;
        *(undefined4 *)(param_2 + 0x18) = 0;
        *(undefined1 *)(param_2 + 0x32) = 0;
        *(undefined1 *)(param_2 + 0x31) = 0;
        *(undefined1 *)(param_2 + 0x30) = 0;
        *(undefined1 *)(param_2 + 0x2f) = 0;
      }
LAB_00033ad4:
      *param_1 = iVar1;
      param_1[1] = 0;
      return piVar2;
    }
    pcVar4 = (char *)(param_2 + 0x2f);
    if (*(char *)(param_2 + 0x2f) == '\0') {
      iVar1 = std::_Filebuf_base::_M_seek
                        ((_Filebuf_base *)(param_2 + 0x20),*(int *)(param_2 + 0x6c) * param_3,
                         param_4);
      piVar2 = (int *)(iVar1 + 1);
      if (piVar2 != (int *)0x0) {
        if (*pcVar4 != '\0') {
          if (*(void **)(param_2 + 0x54) != (void *)0x0) {
            std::_Filebuf_base::_M_unmap
                      ((_Filebuf_base *)(param_2 + 0x20),*(void **)(param_2 + 0x54),
                       *(long *)(param_2 + 0x58));
            *(undefined4 *)(param_2 + 0x54) = 0;
            *(undefined4 *)(param_2 + 0x58) = 0;
          }
          *pcVar4 = '\0';
        }
        piVar2 = (int *)0x0;
        *(undefined4 *)(param_2 + 4) = 0;
        *(undefined4 *)(param_2 + 8) = 0;
        *(undefined4 *)(param_2 + 0xc) = 0;
        *(undefined4 *)(param_2 + 0x10) = 0;
        *(undefined4 *)(param_2 + 0x14) = 0;
        *(undefined4 *)(param_2 + 0x18) = 0;
        *(undefined1 *)(param_2 + 0x32) = 0;
        *(undefined1 *)(param_2 + 0x31) = 0;
        *(undefined1 *)(param_2 + 0x30) = 0;
        *pcVar4 = '\0';
      }
      goto LAB_00033ad4;
    }
    if (*(int *)(param_2 + 0x54) != 0) {
      iVar1 = *(int *)(param_2 + 0x58) - (*(int *)(param_2 + 8) - *(int *)(param_2 + 0x54) >> 2);
      p_Var5 = (_Filebuf_base *)(param_2 + 0x20);
      if (param_3 != 0) {
        iVar1 = std::_Filebuf_base::_M_seek(p_Var5,param_3 - iVar1,2);
        piVar2 = (int *)(iVar1 + 1);
        if (piVar2 != (int *)0x0) {
          if (*pcVar4 != '\0') {
            if (*(void **)(param_2 + 0x54) != (void *)0x0) {
              std::_Filebuf_base::_M_unmap
                        (p_Var5,*(void **)(param_2 + 0x54),*(long *)(param_2 + 0x58));
              *(undefined4 *)(param_2 + 0x54) = 0;
              *(undefined4 *)(param_2 + 0x58) = 0;
            }
            *pcVar4 = '\0';
          }
          piVar2 = (int *)0x0;
          *(undefined4 *)(param_2 + 4) = 0;
          *(undefined4 *)(param_2 + 8) = 0;
          *(undefined4 *)(param_2 + 0xc) = 0;
          *(undefined4 *)(param_2 + 0x10) = 0;
          *(undefined4 *)(param_2 + 0x14) = 0;
          *(undefined4 *)(param_2 + 0x18) = 0;
          *(undefined1 *)(param_2 + 0x32) = 0;
          *(undefined1 *)(param_2 + 0x31) = 0;
          *(undefined1 *)(param_2 + 0x30) = 0;
          *pcVar4 = '\0';
        }
        *param_1 = iVar1;
        param_1[1] = 0;
        return piVar2;
      }
      iVar3 = std::_Filebuf_base::_M_seek(p_Var5,0,2);
      piVar2 = (int *)(iVar3 - iVar1);
LAB_00033c42:
      *param_1 = (int)piVar2;
      param_1[1] = 0;
      return piVar2;
    }
    if (*(char *)(param_2 + 0x2c) == '\0') {
      local_18 = *(int **)(param_2 + 0x4c);
      iVar1 = (**(code **)(**(int **)(param_2 + 0x68) + 0x1c))
                        (*(int **)(param_2 + 0x68),&local_18,*(undefined4 *)(param_2 + 0x3c),
                         *(undefined4 *)(param_2 + 0x44),
                         *(int *)(param_2 + 8) - *(int *)(param_2 + 4) >> 2);
      iVar3 = std::_Filebuf_base::_M_seek((_Filebuf_base *)(param_2 + 0x20),0,2);
      piVar2 = local_18;
      if ((iVar3 != -1) &&
         (iVar1 = ((iVar3 + iVar1) - *(int *)(param_2 + 0x48)) + *(int *)(param_2 + 0x3c),
         -1 < iVar1)) {
        if (param_3 != 0) {
          if (*pcVar4 != '\0') {
            if (*(void **)(param_2 + 0x54) != (void *)0x0) {
              std::_Filebuf_base::_M_unmap
                        ((_Filebuf_base *)(param_2 + 0x20),*(void **)(param_2 + 0x54),
                         *(long *)(param_2 + 0x58));
              *(undefined4 *)(param_2 + 0x54) = 0;
              *(undefined4 *)(param_2 + 0x58) = 0;
            }
            *pcVar4 = '\0';
          }
          *(undefined4 *)(param_2 + 4) = 0;
          *(undefined4 *)(param_2 + 8) = 0;
          *(undefined4 *)(param_2 + 0xc) = 0;
          *(undefined4 *)(param_2 + 0x10) = 0;
          *(undefined4 *)(param_2 + 0x14) = 0;
          *(undefined4 *)(param_2 + 0x18) = 0;
          *(undefined1 *)(param_2 + 0x32) = 0;
          *(undefined1 *)(param_2 + 0x31) = 0;
          *(undefined1 *)(param_2 + 0x30) = 0;
          *pcVar4 = '\0';
          *param_1 = iVar1;
          param_1[1] = (int)piVar2;
          return piVar2;
        }
        *param_1 = iVar1;
        goto LAB_00033cf0;
      }
    }
    else {
      iVar1 = (*(int *)(param_2 + 8) - *(int *)(param_2 + 4) >> 2) * *(int *)(param_2 + 0x6c);
      iVar3 = *(int *)(param_2 + 0x48) - *(int *)(param_2 + 0x3c);
      if (iVar1 - iVar3 == 0 || iVar1 < iVar3) {
        iVar1 = *(int *)(param_2 + 0x48) - (*(int *)(param_2 + 0x3c) + iVar1);
        p_Var5 = (_Filebuf_base *)(param_2 + 0x20);
        if (param_3 != 0) {
          piVar2 = (int *)std::_Filebuf_base::_M_seek(p_Var5,param_3 - iVar1,2);
          if (piVar2 != (int *)0xffffffff) {
            if (*pcVar4 != '\0') {
              if (*(void **)(param_2 + 0x54) != (void *)0x0) {
                std::_Filebuf_base::_M_unmap
                          (p_Var5,*(void **)(param_2 + 0x54),*(long *)(param_2 + 0x58));
                *(undefined4 *)(param_2 + 0x54) = 0;
                *(undefined4 *)(param_2 + 0x58) = 0;
              }
              *pcVar4 = '\0';
            }
            *(undefined4 *)(param_2 + 4) = 0;
            *(undefined4 *)(param_2 + 8) = 0;
            *(undefined4 *)(param_2 + 0xc) = 0;
            *(undefined4 *)(param_2 + 0x10) = 0;
            *(undefined4 *)(param_2 + 0x14) = 0;
            *(undefined4 *)(param_2 + 0x18) = 0;
            *(undefined1 *)(param_2 + 0x32) = 0;
            *(undefined1 *)(param_2 + 0x31) = 0;
            *(undefined1 *)(param_2 + 0x30) = 0;
            *pcVar4 = '\0';
          }
          *param_1 = (int)piVar2;
          param_1[1] = 0;
          return piVar2;
        }
        iVar3 = std::_Filebuf_base::_M_seek(p_Var5,0,2);
        piVar2 = (int *)(iVar3 - iVar1);
        goto LAB_00033c42;
      }
    }
  }
  *param_1 = -1;
LAB_00033cf0:
  param_1[1] = 0;
  return param_1;
}



### FUNC FUN_00033d10 @ 00033d10

int * FUN_00033d10(int *param_1,int param_2,int param_3,int param_4)

{
  int iVar1;
  int iVar2;
  int iVar3;
  
  if (((*(char *)(param_2 + 0x28) == '\0') || (iVar1 = FUN_00034400(param_2,1), param_3 == -1)) ||
     (iVar1 != 1)) {
    iVar3 = 0;
    iVar1 = -1;
  }
  else {
    iVar2 = std::_Filebuf_base::_M_seek((_Filebuf_base *)(param_2 + 0x20),param_3,1);
    iVar1 = -1;
    iVar3 = 0;
    if (iVar2 != -1) {
      *(int *)(param_2 + 0x4c) = param_4;
      if (*(char *)(param_2 + 0x2f) != '\0') {
        if (*(void **)(param_2 + 0x54) != (void *)0x0) {
          std::_Filebuf_base::_M_unmap
                    ((_Filebuf_base *)(param_2 + 0x20),*(void **)(param_2 + 0x54),
                     *(long *)(param_2 + 0x58));
          *(undefined4 *)(param_2 + 0x54) = 0;
          *(undefined4 *)(param_2 + 0x58) = 0;
        }
        *(undefined1 *)(param_2 + 0x2f) = 0;
      }
      *(undefined4 *)(param_2 + 4) = 0;
      *(undefined4 *)(param_2 + 8) = 0;
      *(undefined4 *)(param_2 + 0xc) = 0;
      *(undefined4 *)(param_2 + 0x10) = 0;
      *(undefined4 *)(param_2 + 0x14) = 0;
      *(undefined4 *)(param_2 + 0x18) = 0;
      *(undefined1 *)(param_2 + 0x32) = 0;
      *(undefined1 *)(param_2 + 0x31) = 0;
      *(undefined1 *)(param_2 + 0x30) = 0;
      *(undefined1 *)(param_2 + 0x2f) = 0;
      iVar1 = param_3;
      iVar3 = param_4;
    }
  }
  *param_1 = iVar1;
  param_1[1] = iVar3;
  return param_1 + 2;
}



### FUNC FUN_00033db4 @ 00033db4

undefined4 FUN_00033db4(int *param_1)

{
  int iVar1;
  undefined4 uVar2;
  
  uVar2 = 0;
  if ((char)param_1[0xc] != '\0') {
    uVar2 = 0;
    iVar1 = (**(code **)(*param_1 + 0x34))(param_1,0xffffffff);
    if (iVar1 == -1) {
      uVar2 = 0xffffffff;
    }
  }
  return uVar2;
}



### FUNC FUN_00033dd6 @ 00033dd6

int FUN_00033dd6(int param_1)

{
  int iVar1;
  int iVar2;
  undefined4 uStack_1c;
  
  uStack_1c = -1;
  if (((*(char *)(param_1 + 0x28) != '\0') && (*(char *)(param_1 + 0x30) == '\0')) &&
     (*(char *)(param_1 + 0x31) == '\0')) {
    if (*(char *)(param_1 + 0x32) != '\0') {
      return *(int *)(param_1 + 0xc) - *(int *)(param_1 + 8) >> 2;
    }
    uStack_1c = 0;
    if (*(char *)(param_1 + 0x2c) != '\0') {
      iVar1 = std::_Filebuf_base::_M_seek((_Filebuf_base *)(param_1 + 0x20),0,2);
      iVar2 = std::_Filebuf_base::_M_file_size((_Filebuf_base *)(param_1 + 0x20));
      uStack_1c = iVar2 - iVar1;
      if (iVar2 <= iVar1) {
        uStack_1c = 0;
      }
      if (iVar1 < 0) {
        return 0;
      }
    }
  }
  return uStack_1c;
}



### FUNC FUN_00033e48 @ 00033e48

int FUN_00033e48(int *param_1,wchar_t *param_2,int param_3)

{
  uint uVar1;
  wchar_t wVar2;
  wchar_t *__s2;
  int iVar3;
  uint __n;
  
  iVar3 = 0;
  if (0 < param_3) {
    iVar3 = 0;
    do {
      __s2 = (wchar_t *)param_1[2];
      if (__s2 < (wchar_t *)param_1[3]) {
        uVar1 = param_1[3] - (int)__s2 >> 2;
        __n = param_3 - iVar3;
        if (uVar1 <= (uint)(param_3 - iVar3)) {
          __n = uVar1;
        }
        wmemcpy(param_2,__s2,__n);
        param_1[2] = param_1[2] + __n * 4;
        iVar3 = __n + iVar3;
        param_2 = param_2 + __n;
      }
      else {
        wVar2 = (**(code **)(*param_1 + 0x24))(param_1);
        if (wVar2 == L'\xffffffff') {
          return iVar3;
        }
        *param_2 = wVar2;
        param_2 = param_2 + 1;
        iVar3 = iVar3 + 1;
      }
    } while (iVar3 < param_3);
  }
  return iVar3;
}



### FUNC FUN_00033eae @ 00033eae

void FUN_00033eae(void)

{
  FUN_000344d4();
  return;
}



### FUNC FUN_00033eb8 @ 00033eb8

undefined4 FUN_00033eb8(int *param_1)

{
  int iVar1;
  undefined4 uVar2;
  undefined4 *puVar3;
  
  iVar1 = (**(code **)(*param_1 + 0x20))(param_1);
  uVar2 = 0xffffffff;
  if (iVar1 != -1) {
    puVar3 = (undefined4 *)param_1[2];
    param_1[2] = (int)(puVar3 + 1);
    uVar2 = *puVar3;
  }
  return uVar2;
}



### FUNC FUN_00033eda @ 00033eda

int FUN_00033eda(int param_1,int param_2)

{
  int iVar1;
  int *piVar2;
  int iVar3;
  
  if (*(char *)(param_1 + 0x2f) == '\0') {
    return -1;
  }
  iVar1 = *(int *)(param_1 + 4);
  iVar3 = *(int *)(param_1 + 8);
  if (iVar3 == iVar1) {
    if (param_2 == -1) {
      return -1;
    }
  }
  else {
    piVar2 = (int *)(iVar3 + -4);
    if (param_2 == -1) {
      *(int **)(param_1 + 8) = piVar2;
      return *piVar2;
    }
    if (*piVar2 == param_2) {
      *(int **)(param_1 + 8) = piVar2;
      return param_2;
    }
    if (*(int *)(param_1 + 0x54) == 0) {
      *(int **)(param_1 + 8) = piVar2;
      goto LAB_00033f60;
    }
  }
  if (*(char *)(param_1 + 0x32) == '\0') {
    *(int *)(param_1 + 0x5c) = iVar1;
    *(int *)(param_1 + 0x60) = iVar3;
    *(undefined4 *)(param_1 + 100) = *(undefined4 *)(param_1 + 0xc);
    piVar2 = (int *)(param_1 + 0x90);
    *(int **)(param_1 + 4) = piVar2;
    *(int **)(param_1 + 8) = piVar2;
    *(int *)(param_1 + 0xc) = param_1 + 0x94;
    *(undefined1 *)(param_1 + 0x32) = 1;
  }
  else {
    if (iVar1 == param_1 + 0x74) {
      return -1;
    }
    piVar2 = (int *)(*(int *)(param_1 + 0xc) + -4);
    *(int **)(param_1 + 4) = piVar2;
    *(int **)(param_1 + 8) = piVar2;
    *(int *)(param_1 + 0xc) = param_1 + 0x94;
  }
LAB_00033f60:
  *piVar2 = param_2;
  return param_2;
}



### FUNC FUN_00033f68 @ 00033f68

int FUN_00033f68(int *param_1,wchar_t *param_2,int param_3)

{
  wchar_t *__s1;
  int iVar1;
  uint uVar2;
  int iVar3;
  uint __n;
  
  iVar3 = 0;
  if (0 < param_3) {
    iVar3 = 0;
    do {
      while( true ) {
        __s1 = (wchar_t *)param_1[5];
        if ((wchar_t *)param_1[6] <= __s1) break;
        uVar2 = param_1[6] - (int)__s1 >> 2;
        __n = param_3 - iVar3;
        if (uVar2 <= (uint)(param_3 - iVar3)) {
          __n = uVar2;
        }
        wmemcpy(__s1,param_2,__n);
        param_1[5] = param_1[5] + __n * 4;
        iVar3 = __n + iVar3;
        param_2 = param_2 + __n;
        if (param_3 <= iVar3) {
          return iVar3;
        }
      }
      iVar1 = (**(code **)(*param_1 + 0x34))(param_1,*param_2);
      if (iVar1 == -1) {
        return iVar3;
      }
      param_2 = param_2 + 1;
      iVar3 = iVar3 + 1;
    } while (iVar3 < param_3);
  }
  return iVar3;
}



### FUNC FUN_00033fd8 @ 00033fd8

int FUN_00033fd8(int *param_1,wchar_t param_2,int param_3)

{
  wchar_t *__s;
  int iVar1;
  uint uVar2;
  int iVar3;
  uint __n;
  
  iVar3 = 0;
  if (0 < param_3) {
    iVar3 = 0;
    do {
      while( true ) {
        __s = (wchar_t *)param_1[5];
        if (__s < (wchar_t *)param_1[6]) break;
        iVar1 = (**(code **)(*param_1 + 0x34))(param_1,param_2);
        if (iVar1 == -1) {
          return iVar3;
        }
        iVar3 = iVar3 + 1;
        if (param_3 <= iVar3) {
          return iVar3;
        }
      }
      uVar2 = param_1[6] - (int)__s >> 2;
      __n = param_3 - iVar3;
      if (uVar2 <= (uint)(param_3 - iVar3)) {
        __n = uVar2;
      }
      wmemset(__s,param_2,__n);
      param_1[5] = param_1[5] + __n * 4;
      iVar3 = __n + iVar3;
    } while (iVar3 < param_3);
  }
  return iVar3;
}



### FUNC FUN_00034038 @ 00034038

int FUN_00034038(int param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  int extraout_r1;
  char *pcVar3;
  int *piVar4;
  int *piVar5;
  int local_1c;
  int *local_18;
  
  if (*(char *)(param_1 + 0x30) == '\0') {
    if (*(char *)(param_1 + 0x28) == '\0') {
      return -1;
    }
    uVar2 = *(uint *)(param_1 + 0x24);
    if ((uVar2 & 0x10) == 0) {
      return -1;
    }
    if (*(char *)(param_1 + 0x2f) != '\0') {
      return -1;
    }
    if (*(char *)(param_1 + 0x31) != '\0') {
      return -1;
    }
    if (*(int *)(param_1 + 0x34) == 0) {
      iVar1 = std::_Filebuf_base::_M_page_size + 0xfff;
      __aeabi_uidivmod(iVar1);
      iVar1 = FUN_0003437c(param_1,0,iVar1 - extraout_r1);
      if (iVar1 != 1) {
        return -1;
      }
      uVar2 = *(uint *)(param_1 + 0x24);
    }
    if ((uVar2 & 1) != 0) {
      *(undefined4 *)(param_1 + 0x4c) = 0;
    }
    piVar4 = *(int **)(param_1 + 0x34);
    iVar1 = *(int *)(param_1 + 0x38);
    *(int **)(param_1 + 0x10) = piVar4;
    *(int **)(param_1 + 0x14) = piVar4;
    *(int *)(param_1 + 0x18) = iVar1 + -4;
    *(undefined1 *)(param_1 + 0x30) = 1;
    piVar5 = piVar4;
  }
  else {
    piVar4 = *(int **)(param_1 + 0x34);
    iVar1 = *(int *)(param_1 + 0x38);
    piVar5 = *(int **)(param_1 + 0x14);
  }
  *(int **)(param_1 + 0x10) = piVar4;
  *(int **)(param_1 + 0x14) = piVar4;
  *(int *)(param_1 + 0x18) = iVar1 + -4;
  if (param_2 != -1) {
    *piVar5 = param_2;
    piVar5 = piVar5 + 1;
  }
  if (piVar4 != piVar5) {
    do {
      local_1c = *(int *)(param_1 + 0x3c);
      local_18 = piVar4;
      uVar2 = (**(code **)(**(int **)(param_1 + 0x68) + 8))
                        (*(int **)(param_1 + 0x68),param_1 + 0x4c,piVar4,piVar5,&local_18,local_1c,
                         *(undefined4 *)(param_1 + 0x40),&local_1c);
      if ((uVar2 & 0xfffffffe) == 2) {
LAB_000341b4:
        *(undefined1 *)(param_1 + 0x30) = 0;
        *(undefined1 *)(param_1 + 0x31) = 1;
        *(undefined1 *)(param_1 + 0x2f) = 0;
        *(undefined4 *)(param_1 + 0x10) = 0;
        *(undefined4 *)(param_1 + 0x14) = 0;
        *(undefined4 *)(param_1 + 0x18) = 0;
        return -1;
      }
      if ((local_18 != piVar5) ||
         (pcVar3 = *(char **)(param_1 + 0x3c),
         local_1c - (int)pcVar3 != ((int)piVar5 - (int)piVar4 >> 2) * *(int *)(param_1 + 0x6c))) {
        if ((*(char *)(param_1 + 0x2c) != '\0') || (local_18 == piVar4)) goto LAB_000341b4;
        pcVar3 = *(char **)(param_1 + 0x3c);
      }
      iVar1 = std::_Filebuf_base::_M_write
                        ((_Filebuf_base *)(param_1 + 0x20),pcVar3,local_1c - (int)pcVar3);
      if (iVar1 != 1) goto LAB_000341b4;
      piVar4 = local_18;
    } while (local_18 != piVar5);
  }
  iVar1 = 0;
  if (param_2 != -1) {
    iVar1 = param_2;
  }
  return iVar1;
}



### FUNC FUN_000341dc @ 000341dc

void FUN_000341dc(int param_1,undefined4 param_2)

{
  if (((*(char *)(param_1 + 0x2f) == '\0') && (*(char *)(param_1 + 0x30) == '\0')) &&
     (*(char *)(param_1 + 0x31) == '\0')) {
    FUN_00033858(param_1,param_2,1);
    return;
  }
  return;
}



### FUNC FUN_00034204 @ 00034204

undefined4 * FUN_00034204(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_00034204_1_00069050;
  std::locale::~locale((locale *)(param_1 + 7));
  return param_1;
}



### FUNC FUN_00034224 @ 00034224

void FUN_00034224(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_00034204_1_00069050;
  std::locale::~locale((locale *)(param_1 + 7));
  operator_delete(param_1);
  return;
}



### FUNC FUN_0003427a @ 0003427a

int * FUN_0003427a(int *param_1)

{
  char cVar1;
  bool bVar2;
  bool bVar3;
  int iVar4;
  int iVar5;
  char *pcVar6;
  char *local_18;
  
  cVar1 = (char)param_1[10];
  if ((char)param_1[0xc] == '\0') {
    bVar2 = cVar1 != '\0';
    if (*(char *)((int)param_1 + 0x2f) != '\0') {
      if ((void *)param_1[0x15] != (void *)0x0) {
        std::_Filebuf_base::_M_unmap
                  ((_Filebuf_base *)(param_1 + 8),(void *)param_1[0x15],param_1[0x16]);
        param_1[0x15] = 0;
        param_1[0x16] = 0;
      }
      *(undefined1 *)((int)param_1 + 0x2f) = 0;
    }
  }
  else {
    bVar2 = false;
    if (cVar1 != '\0') {
      iVar4 = (**(code **)(*param_1 + 0x34))(param_1,0xffffffff);
      bVar2 = false;
      if (((iVar4 != -1) && (bVar2 = true, (char)param_1[0xc] != '\0')) &&
         ((char)param_1[0xb] == '\0')) {
        bVar3 = true;
        while( true ) {
          local_18 = (char *)param_1[0xf];
          iVar4 = (**(code **)(*(int *)param_1[0x1a] + 0x10))
                            ((int *)param_1[0x1a],param_1 + 0x13,local_18,param_1[0x10],&local_18);
          bVar2 = bVar3;
          if (((iVar4 == 3) || ((pcVar6 = (char *)param_1[0xf], iVar4 == 0 && (local_18 == pcVar6)))
              ) || (bVar2 = false, iVar4 == 2)) break;
          iVar5 = std::_Filebuf_base::_M_write
                            ((_Filebuf_base *)(param_1 + 8),pcVar6,(int)local_18 - (int)pcVar6);
          if ((iVar5 != 1) || (bVar2 = bVar3, iVar4 != 1)) break;
        }
      }
    }
  }
  iVar4 = std::_Filebuf_base::_M_close((_Filebuf_base *)(param_1 + 8));
  *(undefined1 *)((int)param_1 + 0x32) = 0;
  *(undefined1 *)((int)param_1 + 0x31) = 0;
  *(undefined1 *)(param_1 + 0xc) = 0;
  *(undefined1 *)((int)param_1 + 0x2f) = 0;
  param_1[1] = 0;
  param_1[2] = 0;
  param_1[3] = 0;
  param_1[4] = 0;
  param_1[5] = 0;
  param_1[6] = 0;
  __aeabi_memclr4(param_1 + 0x11,0x24);
  if (iVar4 == 0) {
    param_1 = (int *)0x0;
  }
  if (!bVar2) {
    param_1 = (int *)0x0;
  }
  return param_1;
}



### FUNC FUN_0003437c @ 0003437c

undefined4 FUN_0003437c(int param_1,int param_2,int param_3)

{
  size_t __size;
  void *pvVar1;
  undefined4 uVar2;
  int iVar3;
  undefined1 uVar4;
  size_t sVar5;
  
  if (param_2 == 0) {
    pvVar1 = malloc(param_3 << 2);
    *(void **)(param_1 + 0x34) = pvVar1;
    uVar4 = 1;
    if (pvVar1 == (void *)0x0) {
      return 0;
    }
  }
  else {
    *(int *)(param_1 + 0x34) = param_2;
    uVar4 = 0;
  }
  *(undefined1 *)(param_1 + 0x2e) = uVar4;
  sVar5 = param_3 * *(int *)(param_1 + 0x6c);
  __size = (**(code **)(**(int **)(param_1 + 0x68) + 0x20))();
  if ((int)__size <= (int)sVar5) {
    __size = sVar5;
  }
  pvVar1 = malloc(__size);
  *(void **)(param_1 + 0x3c) = pvVar1;
  if (pvVar1 == (void *)0x0) {
    pvVar1 = (void *)0x0;
    if (*(char *)(param_1 + 0x2e) != '\0') {
      free(*(void **)(param_1 + 0x34));
      pvVar1 = *(void **)(param_1 + 0x3c);
    }
    free(pvVar1);
    iVar3 = 0;
    *(undefined4 *)(param_1 + 0x34) = 0;
    *(undefined4 *)(param_1 + 0x38) = 0;
    *(undefined4 *)(param_1 + 0x3c) = 0;
    uVar2 = 0;
  }
  else {
    *(int *)(param_1 + 0x38) = *(int *)(param_1 + 0x34) + param_3 * 4;
    iVar3 = (int)pvVar1 + __size;
    uVar2 = 1;
  }
  *(int *)(param_1 + 0x40) = iVar3;
  return uVar2;
}



### FUNC FUN_00034400 @ 00034400

undefined4 FUN_00034400(int *param_1,int param_2)

{
  int iVar1;
  int iVar2;
  char *pcVar3;
  char *local_18;
  
  *(undefined1 *)((int)param_1 + 0x31) = 0;
  if ((char)param_1[0xc] != '\0') {
    iVar1 = (**(code **)(*param_1 + 0x34))(param_1,0xffffffff);
    if (param_2 == 1) {
      if (iVar1 == -1) {
LAB_000344be:
        *(char *)(param_1 + 0xc) = '\0';
        *(undefined1 *)((int)param_1 + 0x31) = 1;
        param_1[4] = 0;
        param_1[5] = 0;
        param_1[6] = 0;
        return 0;
      }
      if (((char)param_1[0xc] != '\0') && ((char)param_1[0xb] == '\0')) {
        do {
          local_18 = (char *)param_1[0xf];
          iVar1 = (**(code **)(*(int *)param_1[0x1a] + 0x10))
                            ((int *)param_1[0x1a],param_1 + 0x13,local_18,param_1[0x10],&local_18);
          if ((iVar1 == 3) || ((pcVar3 = (char *)param_1[0xf], iVar1 == 0 && (local_18 == pcVar3))))
          break;
          if ((iVar1 == 2) ||
             (iVar2 = std::_Filebuf_base::_M_write
                                ((_Filebuf_base *)(param_1 + 8),pcVar3,(int)local_18 - (int)pcVar3),
             iVar2 != 1)) goto LAB_000344be;
        } while (iVar1 == 1);
      }
    }
    else if (iVar1 == -1) goto LAB_000344be;
  }
  if ((*(char *)((int)param_1 + 0x2f) != '\0') && (*(char *)((int)param_1 + 0x32) != '\0')) {
    param_1[1] = param_1[0x17];
    param_1[2] = param_1[0x18];
    param_1[3] = param_1[0x19];
    *(undefined1 *)((int)param_1 + 0x32) = 0;
  }
  return 1;
}



### FUNC FUN_000344d4 @ 000344d4

undefined4 FUN_000344d4(int param_1)

{
  int iVar1;
  undefined4 uVar2;
  undefined4 *puVar3;
  int extraout_r1;
  
  if (*(char *)(param_1 + 0x2f) == '\0') {
    if (*(char *)(param_1 + 0x28) == '\0') {
      return 0xffffffff;
    }
    if (-1 < (int)((uint)*(byte *)(param_1 + 0x24) << 0x1c)) {
      return 0xffffffff;
    }
    if (*(char *)(param_1 + 0x30) != '\0') {
      return 0xffffffff;
    }
    if (*(char *)(param_1 + 0x31) != '\0') {
      return 0xffffffff;
    }
    if (*(int *)(param_1 + 0x34) == 0) {
      iVar1 = std::_Filebuf_base::_M_page_size + 0xfff;
      __aeabi_uidivmod();
      iVar1 = FUN_0003437c(param_1,0,iVar1 - extraout_r1);
      if (iVar1 != 1) {
        return 0xffffffff;
      }
    }
    *(undefined4 *)(param_1 + 0x44) = *(undefined4 *)(param_1 + 0x3c);
    *(undefined4 *)(param_1 + 0x48) = *(undefined4 *)(param_1 + 0x3c);
    *(undefined4 *)(param_1 + 0x50) = *(undefined4 *)(param_1 + 0x4c);
    *(undefined1 *)(param_1 + 0x2f) = 1;
  }
  else if (*(char *)(param_1 + 0x32) != '\0') {
    puVar3 = *(undefined4 **)(param_1 + 0x60);
    *(undefined4 *)(param_1 + 4) = *(undefined4 *)(param_1 + 0x5c);
    *(undefined4 **)(param_1 + 8) = puVar3;
    *(undefined4 **)(param_1 + 0xc) = *(undefined4 **)(param_1 + 100);
    *(undefined1 *)(param_1 + 0x32) = 0;
    if (puVar3 != *(undefined4 **)(param_1 + 100)) {
      return *puVar3;
    }
  }
  uVar2 = FUN_0003457c(param_1);
  return uVar2;
}



### FUNC FUN_0003457c @ 0003457c

undefined4 FUN_0003457c(int param_1)

{
  _Filebuf_base *this;
  undefined4 *puVar1;
  uint uVar2;
  int iVar3;
  int iVar4;
  char *pcVar5;
  undefined4 *local_1c;
  int local_18;
  
  *(undefined4 *)(param_1 + 0x4c) = *(undefined4 *)(param_1 + 0x50);
  pcVar5 = *(char **)(param_1 + 0x3c);
  uVar2 = *(uint *)(param_1 + 0x44);
  if ((uVar2 < *(uint *)(param_1 + 0x48)) && (iVar4 = *(uint *)(param_1 + 0x48) - uVar2, iVar4 != 0)
     ) {
    __aeabi_memmove(pcVar5,uVar2,iVar4);
    pcVar5 = pcVar5 + iVar4;
  }
  *(char **)(param_1 + 0x48) = pcVar5;
  this = (_Filebuf_base *)(param_1 + 0x20);
  iVar4 = std::_Filebuf_base::_M_read(this,pcVar5,*(int *)(param_1 + 0x40) - (int)pcVar5);
  if (-1 < iVar4) {
    while( true ) {
      iVar3 = *(int *)(param_1 + 0x48) + iVar4;
      *(int *)(param_1 + 0x48) = iVar3;
      if (*(int *)(param_1 + 0x3c) == iVar3) break;
      iVar3 = (**(code **)(**(int **)(param_1 + 0x68) + 0xc))
                        (*(int **)(param_1 + 0x68),param_1 + 0x50,*(int *)(param_1 + 0x3c),iVar3,
                         &local_18,*(undefined4 *)(param_1 + 0x34),*(undefined4 *)(param_1 + 0x38),
                         &local_1c);
      if (iVar3 == 2) {
LAB_0003465e:
        if (*(void **)(param_1 + 0x54) != (void *)0x0) {
          std::_Filebuf_base::_M_unmap(this,*(void **)(param_1 + 0x54),*(long *)(param_1 + 0x58));
          *(undefined4 *)(param_1 + 0x54) = 0;
          *(undefined4 *)(param_1 + 0x58) = 0;
        }
        *(undefined1 *)(param_1 + 0x30) = 0;
        *(undefined1 *)(param_1 + 0x2f) = 0;
        *(undefined1 *)(param_1 + 0x31) = 1;
        *(undefined4 *)(param_1 + 4) = 0;
        *(undefined4 *)(param_1 + 8) = 0;
        *(undefined4 *)(param_1 + 0xc) = 0;
        return 0xffffffff;
      }
      if (iVar3 == 3) {
        return 0xffffffff;
      }
      puVar1 = *(undefined4 **)(param_1 + 0x34);
      if (((local_1c != puVar1) && (local_18 == *(int *)(param_1 + 0x3c))) ||
         ((*(char *)(param_1 + 0x2c) != '\0' &&
          (((int)local_1c - (int)puVar1 >> 2) * *(int *)(param_1 + 0x6c) -
           (local_18 - *(int *)(param_1 + 0x3c)) != 0)))) goto LAB_0003465e;
      if (local_1c != puVar1) {
        *(int *)(param_1 + 0x44) = local_18;
        *(undefined4 **)(param_1 + 4) = puVar1;
        *(undefined4 **)(param_1 + 8) = puVar1;
        *(undefined4 **)(param_1 + 0xc) = local_1c;
        return *puVar1;
      }
      if (*(int *)(param_1 + 0x70) <= local_18 - *(int *)(param_1 + 0x3c)) goto LAB_0003465e;
      if ((iVar4 < 1) ||
         (iVar4 = std::_Filebuf_base::_M_read
                            (this,*(char **)(param_1 + 0x48),
                             *(int *)(param_1 + 0x40) - (int)*(char **)(param_1 + 0x48)), iVar4 < 0)
         ) break;
    }
  }
  *(undefined4 *)(param_1 + 4) = 0;
  *(undefined4 *)(param_1 + 8) = 0;
  *(undefined4 *)(param_1 + 0xc) = 0;
  return 0xffffffff;
}



### FUNC FUN_0003469c @ 0003469c

undefined4 * FUN_0003469c(undefined4 *param_1)

{
  locale alStack_18 [4];
  
  param_1[6] = 0;
  param_1[5] = 0;
  param_1[4] = 0;
  param_1[3] = 0;
  param_1[2] = 0;
  param_1[1] = 0;
  *param_1 = &PTR_FUN_00035128_1_000690ec;
  std::locale::locale((locale *)(param_1 + 7));
  *param_1 = &PTR_FUN_000347d0_1_00069094;
  std::_Filebuf_base::_Filebuf_base((_Filebuf_base *)(param_1 + 8));
  *(undefined1 *)((int)param_1 + 0x32) = 0;
  *(undefined2 *)(param_1 + 0xc) = 0;
  param_1[0xb] = 0;
  __aeabi_memclr4(param_1 + 0xd,0x38);
  param_1[0x1b] = 1;
  param_1[0x1c] = 1;
  std::locale::locale(alStack_18);
  FUN_00034738(param_1,alStack_18,0);
  std::locale::~locale(alStack_18);
  return param_1;
}



### FUNC FUN_00034738 @ 00034738

void FUN_00034738(int param_1,locale *param_2,int param_3)

{
  undefined1 uVar1;
  int iVar2;
  int *piVar3;
  int iVar4;
  undefined4 uVar5;
  
  iVar2 = std::locale::_M_get_facet(param_2,(id *)&std::codecvt<char,char,mbstate_t>::id);
  if (iVar2 != 0) {
    piVar3 = (int *)std::locale::_M_use_facet(param_2,(id *)&std::codecvt<char,char,mbstate_t>::id);
    *(int **)(param_1 + 0x68) = piVar3;
    iVar4 = (**(code **)(*piVar3 + 0x14))();
    iVar2 = iVar4;
    if (iVar4 < 2) {
      iVar2 = 1;
    }
    *(int *)(param_1 + 0x6c) = iVar2;
    uVar5 = (**(code **)(**(int **)(param_1 + 0x68) + 0x20))();
    *(bool *)(param_1 + 0x2c) = 0 < iVar4;
    *(undefined4 *)(param_1 + 0x70) = uVar5;
    uVar1 = (**(code **)(**(int **)(param_1 + 0x68) + 0x18))();
    *(undefined1 *)(param_1 + 0x2d) = uVar1;
    return;
  }
  *(undefined4 *)(param_1 + 0x68) = 0;
  *(undefined4 *)(param_1 + 0x6c) = 1;
  *(undefined4 *)(param_1 + 0x70) = 1;
  *(undefined2 *)(param_1 + 0x2c) = 0;
  if (param_3 != 0) {
    std::locale::_M_use_facet(param_2,(id *)&std::codecvt<char,char,mbstate_t>::id);
  }
  return;
}



### FUNC FUN_000347d0 @ 000347d0

undefined4 * FUN_000347d0(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_000347d0_1_00069094;
  FUN_0003519e(param_1);
  if (*(char *)((int)param_1 + 0x2e) != '\0') {
    free((void *)param_1[0xd]);
  }
  free((void *)param_1[0xf]);
  param_1[0xd] = 0;
  param_1[0xe] = 0;
  param_1[0xf] = 0;
  param_1[0x10] = 0;
  *param_1 = &PTR_FUN_00035128_1_000690ec;
  std::locale::~locale((locale *)(param_1 + 7));
  return param_1;
}



### FUNC FUN_00034840 @ 00034840

void FUN_00034840(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_000347d0_1_00069094;
  FUN_0003519e(param_1);
  if (*(char *)((int)param_1 + 0x2e) != '\0') {
    free((void *)param_1[0xd]);
  }
  free((void *)param_1[0xf]);
  param_1[0xd] = 0;
  param_1[0xe] = 0;
  param_1[0xf] = 0;
  param_1[0x10] = 0;
  *param_1 = &PTR_FUN_00035128_1_000690ec;
  std::locale::~locale((locale *)(param_1 + 7));
  operator_delete(param_1);
  return;
}



### FUNC FUN_000348b8 @ 000348b8

int FUN_000348b8(int param_1,int param_2,int param_3)

{
  if ((((*(char *)(param_1 + 0x2f) == '\0') && (*(char *)(param_1 + 0x30) == '\0')) &&
      (*(char *)(param_1 + 0x31) == '\0')) && (*(int *)(param_1 + 0x34) == 0)) {
    if ((param_2 == 0) && (param_3 == 0)) {
      param_2 = 0;
      param_3 = 1;
    }
    else {
      if (param_2 == 0) {
        return param_1;
      }
      if (param_3 < 1) {
        return param_1;
      }
    }
    FUN_000352a0(param_1,param_2,param_3);
  }
  return param_1;
}



### FUNC FUN_000348fc @ 000348fc

int * FUN_000348fc(int *param_1,int param_2,int param_3,int param_4)

{
  int iVar1;
  int *piVar2;
  int iVar3;
  char *pcVar4;
  _Filebuf_base *p_Var5;
  int *local_18;
  
  if (*(char *)(param_2 + 0x28) == '\0') {
    *param_1 = -1;
    param_1[1] = 0;
    return param_1;
  }
  if ((param_3 != 0) && (*(char *)(param_2 + 0x2c) == '\0')) {
    *param_1 = -1;
    param_1[1] = 0;
    return param_1 + 2;
  }
  iVar1 = FUN_00035322(param_2,param_4 != 2 || param_3 != 0);
  if (iVar1 != 0) {
    if ((param_4 == 4) || (param_4 == 1)) {
      iVar1 = std::_Filebuf_base::_M_seek
                        ((_Filebuf_base *)(param_2 + 0x20),*(int *)(param_2 + 0x6c) * param_3,
                         param_4);
      piVar2 = (int *)(iVar1 + 1);
      if (piVar2 != (int *)0x0) {
        if (*(char *)(param_2 + 0x2f) != '\0') {
          if (*(void **)(param_2 + 0x54) != (void *)0x0) {
            std::_Filebuf_base::_M_unmap
                      ((_Filebuf_base *)(param_2 + 0x20),*(void **)(param_2 + 0x54),
                       *(long *)(param_2 + 0x58));
            *(undefined4 *)(param_2 + 0x54) = 0;
            *(undefined4 *)(param_2 + 0x58) = 0;
          }
          *(undefined1 *)(param_2 + 0x2f) = 0;
        }
        piVar2 = (int *)0x0;
        *(undefined4 *)(param_2 + 4) = 0;
        *(undefined4 *)(param_2 + 8) = 0;
        *(undefined4 *)(param_2 + 0xc) = 0;
        *(undefined4 *)(param_2 + 0x10) = 0;
        *(undefined4 *)(param_2 + 0x14) = 0;
        *(undefined4 *)(param_2 + 0x18) = 0;
        *(undefined1 *)(param_2 + 0x32) = 0;
        *(undefined1 *)(param_2 + 0x31) = 0;
        *(undefined1 *)(param_2 + 0x30) = 0;
        *(undefined1 *)(param_2 + 0x2f) = 0;
      }
LAB_000349b4:
      *param_1 = iVar1;
      param_1[1] = 0;
      return piVar2;
    }
    pcVar4 = (char *)(param_2 + 0x2f);
    if (*(char *)(param_2 + 0x2f) == '\0') {
      iVar1 = std::_Filebuf_base::_M_seek
                        ((_Filebuf_base *)(param_2 + 0x20),*(int *)(param_2 + 0x6c) * param_3,
                         param_4);
      piVar2 = (int *)(iVar1 + 1);
      if (piVar2 != (int *)0x0) {
        if (*pcVar4 != '\0') {
          if (*(void **)(param_2 + 0x54) != (void *)0x0) {
            std::_Filebuf_base::_M_unmap
                      ((_Filebuf_base *)(param_2 + 0x20),*(void **)(param_2 + 0x54),
                       *(long *)(param_2 + 0x58));
            *(undefined4 *)(param_2 + 0x54) = 0;
            *(undefined4 *)(param_2 + 0x58) = 0;
          }
          *pcVar4 = '\0';
        }
        piVar2 = (int *)0x0;
        *(undefined4 *)(param_2 + 4) = 0;
        *(undefined4 *)(param_2 + 8) = 0;
        *(undefined4 *)(param_2 + 0xc) = 0;
        *(undefined4 *)(param_2 + 0x10) = 0;
        *(undefined4 *)(param_2 + 0x14) = 0;
        *(undefined4 *)(param_2 + 0x18) = 0;
        *(undefined1 *)(param_2 + 0x32) = 0;
        *(undefined1 *)(param_2 + 0x31) = 0;
        *(undefined1 *)(param_2 + 0x30) = 0;
        *pcVar4 = '\0';
      }
      goto LAB_000349b4;
    }
    if (*(int *)(param_2 + 0x54) != 0) {
      iVar1 = (*(int *)(param_2 + 0x54) - *(int *)(param_2 + 8)) + *(int *)(param_2 + 0x58);
      p_Var5 = (_Filebuf_base *)(param_2 + 0x20);
      if (param_3 != 0) {
        iVar1 = std::_Filebuf_base::_M_seek(p_Var5,param_3 - iVar1,2);
        piVar2 = (int *)(iVar1 + 1);
        if (piVar2 != (int *)0x0) {
          if (*pcVar4 != '\0') {
            if (*(void **)(param_2 + 0x54) != (void *)0x0) {
              std::_Filebuf_base::_M_unmap
                        (p_Var5,*(void **)(param_2 + 0x54),*(long *)(param_2 + 0x58));
              *(undefined4 *)(param_2 + 0x54) = 0;
              *(undefined4 *)(param_2 + 0x58) = 0;
            }
            *pcVar4 = '\0';
          }
          piVar2 = (int *)0x0;
          *(undefined4 *)(param_2 + 4) = 0;
          *(undefined4 *)(param_2 + 8) = 0;
          *(undefined4 *)(param_2 + 0xc) = 0;
          *(undefined4 *)(param_2 + 0x10) = 0;
          *(undefined4 *)(param_2 + 0x14) = 0;
          *(undefined4 *)(param_2 + 0x18) = 0;
          *(undefined1 *)(param_2 + 0x32) = 0;
          *(undefined1 *)(param_2 + 0x31) = 0;
          *(undefined1 *)(param_2 + 0x30) = 0;
          *pcVar4 = '\0';
        }
        *param_1 = iVar1;
        param_1[1] = 0;
        return piVar2;
      }
      iVar3 = std::_Filebuf_base::_M_seek(p_Var5,0,2);
      piVar2 = (int *)(iVar3 - iVar1);
LAB_00034b1e:
      *param_1 = (int)piVar2;
      param_1[1] = 0;
      return piVar2;
    }
    if (*(char *)(param_2 + 0x2c) == '\0') {
      local_18 = *(int **)(param_2 + 0x4c);
      iVar1 = (**(code **)(**(int **)(param_2 + 0x68) + 0x1c))
                        (*(int **)(param_2 + 0x68),&local_18,*(undefined4 *)(param_2 + 0x3c),
                         *(undefined4 *)(param_2 + 0x44),
                         *(int *)(param_2 + 8) - *(int *)(param_2 + 4));
      iVar3 = std::_Filebuf_base::_M_seek((_Filebuf_base *)(param_2 + 0x20),0,2);
      piVar2 = local_18;
      if ((iVar3 != -1) &&
         (iVar1 = ((iVar3 + iVar1) - *(int *)(param_2 + 0x48)) + *(int *)(param_2 + 0x3c),
         -1 < iVar1)) {
        if (param_3 != 0) {
          if (*pcVar4 != '\0') {
            if (*(void **)(param_2 + 0x54) != (void *)0x0) {
              std::_Filebuf_base::_M_unmap
                        ((_Filebuf_base *)(param_2 + 0x20),*(void **)(param_2 + 0x54),
                         *(long *)(param_2 + 0x58));
              *(undefined4 *)(param_2 + 0x54) = 0;
              *(undefined4 *)(param_2 + 0x58) = 0;
            }
            *pcVar4 = '\0';
          }
          *(undefined4 *)(param_2 + 4) = 0;
          *(undefined4 *)(param_2 + 8) = 0;
          *(undefined4 *)(param_2 + 0xc) = 0;
          *(undefined4 *)(param_2 + 0x10) = 0;
          *(undefined4 *)(param_2 + 0x14) = 0;
          *(undefined4 *)(param_2 + 0x18) = 0;
          *(undefined1 *)(param_2 + 0x32) = 0;
          *(undefined1 *)(param_2 + 0x31) = 0;
          *(undefined1 *)(param_2 + 0x30) = 0;
          *pcVar4 = '\0';
          *param_1 = iVar1;
          param_1[1] = (int)piVar2;
          return piVar2;
        }
        *param_1 = iVar1;
        goto LAB_00034bca;
      }
    }
    else {
      iVar1 = (*(int *)(param_2 + 8) - *(int *)(param_2 + 4)) * *(int *)(param_2 + 0x6c);
      iVar3 = *(int *)(param_2 + 0x48) - *(int *)(param_2 + 0x3c);
      if (iVar1 - iVar3 == 0 || iVar1 < iVar3) {
        iVar1 = *(int *)(param_2 + 0x48) - (*(int *)(param_2 + 0x3c) + iVar1);
        p_Var5 = (_Filebuf_base *)(param_2 + 0x20);
        if (param_3 != 0) {
          piVar2 = (int *)std::_Filebuf_base::_M_seek(p_Var5,param_3 - iVar1,2);
          if (piVar2 != (int *)0xffffffff) {
            if (*pcVar4 != '\0') {
              if (*(void **)(param_2 + 0x54) != (void *)0x0) {
                std::_Filebuf_base::_M_unmap
                          (p_Var5,*(void **)(param_2 + 0x54),*(long *)(param_2 + 0x58));
                *(undefined4 *)(param_2 + 0x54) = 0;
                *(undefined4 *)(param_2 + 0x58) = 0;
              }
              *pcVar4 = '\0';
            }
            *(undefined4 *)(param_2 + 4) = 0;
            *(undefined4 *)(param_2 + 8) = 0;
            *(undefined4 *)(param_2 + 0xc) = 0;
            *(undefined4 *)(param_2 + 0x10) = 0;
            *(undefined4 *)(param_2 + 0x14) = 0;
            *(undefined4 *)(param_2 + 0x18) = 0;
            *(undefined1 *)(param_2 + 0x32) = 0;
            *(undefined1 *)(param_2 + 0x31) = 0;
            *(undefined1 *)(param_2 + 0x30) = 0;
            *pcVar4 = '\0';
          }
          *param_1 = (int)piVar2;
          param_1[1] = 0;
          return piVar2;
        }
        iVar3 = std::_Filebuf_base::_M_seek(p_Var5,0,2);
        piVar2 = (int *)(iVar3 - iVar1);
        goto LAB_00034b1e;
      }
    }
  }
  *param_1 = -1;
LAB_00034bca:
  param_1[1] = 0;
  return param_1;
}



### FUNC FUN_00034bea @ 00034bea

int * FUN_00034bea(int *param_1,int param_2,int param_3,int param_4)

{
  int iVar1;
  int iVar2;
  int iVar3;
  
  if (((*(char *)(param_2 + 0x28) == '\0') || (iVar1 = FUN_00035322(param_2,1), param_3 == -1)) ||
     (iVar1 != 1)) {
    iVar3 = 0;
    iVar1 = -1;
  }
  else {
    iVar2 = std::_Filebuf_base::_M_seek((_Filebuf_base *)(param_2 + 0x20),param_3,1);
    iVar1 = -1;
    iVar3 = 0;
    if (iVar2 != -1) {
      *(int *)(param_2 + 0x4c) = param_4;
      if (*(char *)(param_2 + 0x2f) != '\0') {
        if (*(void **)(param_2 + 0x54) != (void *)0x0) {
          std::_Filebuf_base::_M_unmap
                    ((_Filebuf_base *)(param_2 + 0x20),*(void **)(param_2 + 0x54),
                     *(long *)(param_2 + 0x58));
          *(undefined4 *)(param_2 + 0x54) = 0;
          *(undefined4 *)(param_2 + 0x58) = 0;
        }
        *(undefined1 *)(param_2 + 0x2f) = 0;
      }
      *(undefined4 *)(param_2 + 4) = 0;
      *(undefined4 *)(param_2 + 8) = 0;
      *(undefined4 *)(param_2 + 0xc) = 0;
      *(undefined4 *)(param_2 + 0x10) = 0;
      *(undefined4 *)(param_2 + 0x14) = 0;
      *(undefined4 *)(param_2 + 0x18) = 0;
      *(undefined1 *)(param_2 + 0x32) = 0;
      *(undefined1 *)(param_2 + 0x31) = 0;
      *(undefined1 *)(param_2 + 0x30) = 0;
      *(undefined1 *)(param_2 + 0x2f) = 0;
      iVar1 = param_3;
      iVar3 = param_4;
    }
  }
  *param_1 = iVar1;
  param_1[1] = iVar3;
  return param_1 + 2;
}



### FUNC FUN_00034c8e @ 00034c8e

undefined4 FUN_00034c8e(int *param_1)

{
  int iVar1;
  undefined4 uVar2;
  
  uVar2 = 0;
  if ((char)param_1[0xc] != '\0') {
    uVar2 = 0;
    iVar1 = (**(code **)(*param_1 + 0x34))(param_1,0xffffffff);
    if (iVar1 == -1) {
      uVar2 = 0xffffffff;
    }
  }
  return uVar2;
}



### FUNC FUN_00034cb0 @ 00034cb0

int FUN_00034cb0(int param_1)

{
  int iVar1;
  int iVar2;
  undefined4 uStack_1c;
  
  uStack_1c = -1;
  if (((*(char *)(param_1 + 0x28) != '\0') && (*(char *)(param_1 + 0x30) == '\0')) &&
     (*(char *)(param_1 + 0x31) == '\0')) {
    if (*(char *)(param_1 + 0x32) != '\0') {
      return *(int *)(param_1 + 0xc) - *(int *)(param_1 + 8);
    }
    uStack_1c = 0;
    if (*(char *)(param_1 + 0x2c) != '\0') {
      iVar1 = std::_Filebuf_base::_M_seek((_Filebuf_base *)(param_1 + 0x20),0,2);
      iVar2 = std::_Filebuf_base::_M_file_size((_Filebuf_base *)(param_1 + 0x20));
      uStack_1c = iVar2 - iVar1;
      if (iVar2 <= iVar1) {
        uStack_1c = 0;
      }
      if (iVar1 < 0) {
        return 0;
      }
    }
  }
  return uStack_1c;
}



### FUNC FUN_00034d20 @ 00034d20

int FUN_00034d20(int *param_1,undefined1 *param_2,int param_3)

{
  uint uVar1;
  int iVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar4 = 0;
  if (0 < param_3) {
    iVar4 = 0;
    do {
      uVar3 = param_1[2];
      if (uVar3 < (uint)param_1[3]) {
        uVar1 = param_1[3] - uVar3;
        uVar5 = param_3 - iVar4;
        if (uVar1 <= (uint)(param_3 - iVar4)) {
          uVar5 = uVar1;
        }
        if (uVar5 != 0) {
          __aeabi_memcpy(param_2,uVar3,uVar5);
          uVar3 = param_1[2];
        }
        param_1[2] = uVar3 + uVar5;
        param_2 = param_2 + uVar5;
        iVar4 = uVar5 + iVar4;
      }
      else {
        iVar2 = (**(code **)(*param_1 + 0x24))(param_1);
        if (iVar2 == -1) {
          return iVar4;
        }
        *param_2 = (char)iVar2;
        param_2 = param_2 + 1;
        iVar4 = iVar4 + 1;
      }
    } while (iVar4 < param_3);
  }
  return iVar4;
}



### FUNC FUN_00034d90 @ 00034d90

void FUN_00034d90(filebuf *param_1)

{
  std::_Underflow<char,std::char_traits<char>>::_M_doit(param_1);
  return;
}



### FUNC FUN_00034d9a @ 00034d9a

uint FUN_00034d9a(int *param_1)

{
  int iVar1;
  uint uVar2;
  byte *pbVar3;
  
  iVar1 = (**(code **)(*param_1 + 0x20))(param_1);
  uVar2 = 0xffffffff;
  if (iVar1 != -1) {
    pbVar3 = (byte *)param_1[2];
    param_1[2] = (int)(pbVar3 + 1);
    uVar2 = (uint)*pbVar3;
  }
  return uVar2;
}



### FUNC FUN_00034dbc @ 00034dbc

uint FUN_00034dbc(int param_1,uint param_2)

{
  int iVar1;
  int iVar2;
  byte *pbVar3;
  
  if (*(char *)(param_1 + 0x2f) == '\0') {
    return 0xffffffff;
  }
  iVar2 = *(int *)(param_1 + 4);
  iVar1 = *(int *)(param_1 + 8);
  if (iVar1 == iVar2) {
    if (param_2 == 0xffffffff) {
      return 0xffffffff;
    }
  }
  else {
    if (param_2 == 0xffffffff) {
      *(int *)(param_1 + 8) = iVar1 + -1;
      param_2 = (uint)*(byte *)(iVar1 + -1);
LAB_00034e30:
      return param_2 & 0xff;
    }
    pbVar3 = (byte *)(iVar1 + -1);
    if (((uint)*(byte *)(iVar1 + -1) == (param_2 & 0xff)) || (*(int *)(param_1 + 0x54) == 0)) {
      *(byte **)(param_1 + 8) = pbVar3;
      if ((uint)*pbVar3 == (param_2 & 0xff)) goto LAB_00034e30;
      goto LAB_00034e50;
    }
  }
  if (*(char *)(param_1 + 0x32) == '\0') {
    *(int *)(param_1 + 0x5c) = iVar2;
    *(int *)(param_1 + 0x60) = iVar1;
    *(undefined4 *)(param_1 + 100) = *(undefined4 *)(param_1 + 0xc);
    pbVar3 = (byte *)(param_1 + 0x7b);
    *(byte **)(param_1 + 4) = pbVar3;
    *(byte **)(param_1 + 8) = pbVar3;
    *(int *)(param_1 + 0xc) = param_1 + 0x7c;
    *(undefined1 *)(param_1 + 0x32) = 1;
  }
  else {
    if (iVar2 == param_1 + 0x74) {
      return 0xffffffff;
    }
    pbVar3 = (byte *)(*(int *)(param_1 + 0xc) + -1);
    *(byte **)(param_1 + 4) = pbVar3;
    *(byte **)(param_1 + 8) = pbVar3;
    *(int *)(param_1 + 0xc) = param_1 + 0x7c;
  }
LAB_00034e50:
  *pbVar3 = (byte)param_2;
  return param_2;
}



### FUNC FUN_00034e58 @ 00034e58

int FUN_00034e58(int *param_1,undefined1 *param_2,int param_3)

{
  uint uVar1;
  int iVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar4 = 0;
  if (0 < param_3) {
    iVar4 = 0;
    do {
      while( true ) {
        uVar1 = param_1[5];
        if ((uint)param_1[6] <= uVar1) break;
        uVar3 = param_1[6] - uVar1;
        uVar5 = param_3 - iVar4;
        if (uVar3 <= (uint)(param_3 - iVar4)) {
          uVar5 = uVar3;
        }
        if (uVar5 != 0) {
          __aeabi_memcpy(uVar1,param_2,uVar5);
          uVar1 = param_1[5];
        }
        param_1[5] = uVar1 + uVar5;
        param_2 = param_2 + uVar5;
        iVar4 = uVar5 + iVar4;
        if (param_3 <= iVar4) {
          return iVar4;
        }
      }
      iVar2 = (**(code **)(*param_1 + 0x34))(param_1,*param_2);
      if (iVar2 == -1) {
        return iVar4;
      }
      param_2 = param_2 + 1;
      iVar4 = iVar4 + 1;
    } while (iVar4 < param_3);
  }
  return iVar4;
}



### FUNC FUN_00034ed0 @ 00034ed0

int FUN_00034ed0(int *param_1,undefined4 param_2,int param_3)

{
  uint uVar1;
  int iVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar4 = 0;
  if (0 < param_3) {
    iVar4 = 0;
    do {
      while( true ) {
        uVar1 = param_1[5];
        if (uVar1 < (uint)param_1[6]) break;
        iVar2 = (**(code **)(*param_1 + 0x34))(param_1,param_2);
        if (iVar2 == -1) {
          return iVar4;
        }
        iVar4 = iVar4 + 1;
        if (param_3 <= iVar4) {
          return iVar4;
        }
      }
      uVar3 = param_1[6] - uVar1;
      uVar5 = param_3 - iVar4;
      if (uVar3 <= (uint)(param_3 - iVar4)) {
        uVar5 = uVar3;
      }
      __aeabi_memset(uVar1,uVar5,param_2);
      param_1[5] = param_1[5] + uVar5;
      iVar4 = uVar5 + iVar4;
    } while (iVar4 < param_3);
  }
  return iVar4;
}



### FUNC FUN_00034f2c @ 00034f2c

int FUN_00034f2c(int param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  char *pcVar3;
  int extraout_r1;
  undefined1 *puVar4;
  char *pcVar5;
  char *local_20;
  int local_1c;
  char *local_18;
  
  puVar4 = (undefined1 *)(param_1 + 0x30);
  if (*(char *)(param_1 + 0x30) == '\0') {
    if (*(char *)(param_1 + 0x28) == '\0') {
      return -1;
    }
    uVar2 = *(uint *)(param_1 + 0x24);
    if ((uVar2 & 0x10) == 0) {
      return -1;
    }
    if (*(char *)(param_1 + 0x2f) != '\0') {
      return -1;
    }
    if (*(char *)(param_1 + 0x31) != '\0') {
      return -1;
    }
    if (*(int *)(param_1 + 0x34) == 0) {
      iVar1 = std::_Filebuf_base::_M_page_size + 0xfff;
      __aeabi_uidivmod(iVar1);
      iVar1 = FUN_000352a0(param_1,0,iVar1 - extraout_r1);
      if (iVar1 != 1) {
        return -1;
      }
      uVar2 = *(uint *)(param_1 + 0x24);
    }
    if ((uVar2 & 1) != 0) {
      *(undefined4 *)(param_1 + 0x4c) = 0;
    }
    pcVar5 = *(char **)(param_1 + 0x34);
    iVar1 = *(int *)(param_1 + 0x38);
    *(char **)(param_1 + 0x10) = pcVar5;
    *(char **)(param_1 + 0x14) = pcVar5;
    *(int *)(param_1 + 0x18) = iVar1 + -1;
    *puVar4 = 1;
    local_20 = pcVar5;
  }
  else {
    pcVar5 = *(char **)(param_1 + 0x34);
    iVar1 = *(int *)(param_1 + 0x38);
    local_20 = *(char **)(param_1 + 0x14);
  }
  *(char **)(param_1 + 0x10) = pcVar5;
  *(char **)(param_1 + 0x14) = pcVar5;
  *(int *)(param_1 + 0x18) = iVar1 + -1;
  if (param_2 != -1) {
    *local_20 = (char)param_2;
    local_20 = local_20 + 1;
  }
  if (pcVar5 != local_20) {
    do {
      local_1c = *(int *)(param_1 + 0x3c);
      local_18 = pcVar5;
      iVar1 = (**(code **)(**(int **)(param_1 + 0x68) + 8))
                        (*(int **)(param_1 + 0x68),param_1 + 0x4c,pcVar5,local_20,&local_18,local_1c
                         ,*(undefined4 *)(param_1 + 0x40),&local_1c);
      if (iVar1 == 2) {
LAB_000350a2:
        *puVar4 = 0;
        *(undefined1 *)(param_1 + 0x31) = 1;
        *(undefined1 *)(param_1 + 0x2f) = 0;
        *(undefined4 *)(param_1 + 0x10) = 0;
        *(undefined4 *)(param_1 + 0x14) = 0;
        *(undefined4 *)(param_1 + 0x18) = 0;
        return -1;
      }
      if (iVar1 == 3) {
        iVar1 = std::_Filebuf_base::_M_write
                          ((_Filebuf_base *)(param_1 + 0x20),pcVar5,(int)local_20 - (int)pcVar5);
        if (iVar1 != 1) {
LAB_000350d6:
          *puVar4 = 0;
          *(undefined1 *)(param_1 + 0x31) = 1;
          *(undefined1 *)(param_1 + 0x2f) = 0;
          *(undefined4 *)(param_1 + 0x10) = 0;
          *(undefined4 *)(param_1 + 0x14) = 0;
          *(undefined4 *)(param_1 + 0x18) = 0;
          return -1;
        }
        break;
      }
      if ((local_18 != local_20) ||
         (pcVar3 = *(char **)(param_1 + 0x3c),
         local_1c - (int)pcVar3 != ((int)local_20 - (int)pcVar5) * *(int *)(param_1 + 0x6c))) {
        if ((*(char *)(param_1 + 0x2c) != '\0') || (local_18 == pcVar5)) goto LAB_000350a2;
        pcVar3 = *(char **)(param_1 + 0x3c);
      }
      iVar1 = std::_Filebuf_base::_M_write
                        ((_Filebuf_base *)(param_1 + 0x20),pcVar3,local_1c - (int)pcVar3);
      if (iVar1 != 1) goto LAB_000350d6;
      pcVar5 = local_18;
    } while (local_18 != local_20);
  }
  iVar1 = 0;
  if (param_2 != -1) {
    iVar1 = param_2;
  }
  return iVar1;
}



### FUNC FUN_00035100 @ 00035100

void FUN_00035100(int param_1,undefined4 param_2)

{
  if (((*(char *)(param_1 + 0x2f) == '\0') && (*(char *)(param_1 + 0x30) == '\0')) &&
     (*(char *)(param_1 + 0x31) == '\0')) {
    FUN_00034738(param_1,param_2,1);
    return;
  }
  return;
}



### FUNC FUN_00035128 @ 00035128

undefined4 * FUN_00035128(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_00035128_1_000690ec;
  std::locale::~locale((locale *)(param_1 + 7));
  return param_1;
}



### FUNC FUN_00035148 @ 00035148

void FUN_00035148(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_00035128_1_000690ec;
  std::locale::~locale((locale *)(param_1 + 7));
  operator_delete(param_1);
  return;
}



### FUNC FUN_0003519e @ 0003519e

int * FUN_0003519e(int *param_1)

{
  char cVar1;
  bool bVar2;
  bool bVar3;
  int iVar4;
  int iVar5;
  char *pcVar6;
  char *local_18;
  
  cVar1 = (char)param_1[10];
  if ((char)param_1[0xc] == '\0') {
    bVar2 = cVar1 != '\0';
    if (*(char *)((int)param_1 + 0x2f) != '\0') {
      if ((void *)param_1[0x15] != (void *)0x0) {
        std::_Filebuf_base::_M_unmap
                  ((_Filebuf_base *)(param_1 + 8),(void *)param_1[0x15],param_1[0x16]);
        param_1[0x15] = 0;
        param_1[0x16] = 0;
      }
      *(undefined1 *)((int)param_1 + 0x2f) = 0;
    }
  }
  else {
    bVar2 = false;
    if (cVar1 != '\0') {
      iVar4 = (**(code **)(*param_1 + 0x34))(param_1,0xffffffff);
      bVar2 = false;
      if (((iVar4 != -1) && (bVar2 = true, (char)param_1[0xc] != '\0')) &&
         ((char)param_1[0xb] == '\0')) {
        bVar3 = true;
        while( true ) {
          local_18 = (char *)param_1[0xf];
          iVar4 = (**(code **)(*(int *)param_1[0x1a] + 0x10))
                            ((int *)param_1[0x1a],param_1 + 0x13,local_18,param_1[0x10],&local_18);
          bVar2 = bVar3;
          if (((iVar4 == 3) || ((pcVar6 = (char *)param_1[0xf], iVar4 == 0 && (local_18 == pcVar6)))
              ) || (bVar2 = false, iVar4 == 2)) break;
          iVar5 = std::_Filebuf_base::_M_write
                            ((_Filebuf_base *)(param_1 + 8),pcVar6,(int)local_18 - (int)pcVar6);
          if ((iVar5 != 1) || (bVar2 = bVar3, iVar4 != 1)) break;
        }
      }
    }
  }
  iVar4 = std::_Filebuf_base::_M_close((_Filebuf_base *)(param_1 + 8));
  *(undefined1 *)((int)param_1 + 0x32) = 0;
  *(undefined1 *)((int)param_1 + 0x31) = 0;
  *(undefined1 *)(param_1 + 0xc) = 0;
  *(undefined1 *)((int)param_1 + 0x2f) = 0;
  param_1[1] = 0;
  param_1[2] = 0;
  param_1[3] = 0;
  param_1[4] = 0;
  param_1[5] = 0;
  param_1[6] = 0;
  __aeabi_memclr4(param_1 + 0x11,0x24);
  if (iVar4 == 0) {
    param_1 = (int *)0x0;
  }
  if (!bVar2) {
    param_1 = (int *)0x0;
  }
  return param_1;
}



### FUNC FUN_000352a0 @ 000352a0

undefined4 FUN_000352a0(int param_1,int param_2,size_t param_3)

{
  size_t __size;
  void *pvVar1;
  undefined4 uVar2;
  int iVar3;
  undefined1 uVar4;
  size_t sVar5;
  
  if (param_2 == 0) {
    pvVar1 = malloc(param_3);
    *(void **)(param_1 + 0x34) = pvVar1;
    uVar4 = 1;
    if (pvVar1 == (void *)0x0) {
      return 0;
    }
  }
  else {
    *(int *)(param_1 + 0x34) = param_2;
    uVar4 = 0;
  }
  *(undefined1 *)(param_1 + 0x2e) = uVar4;
  sVar5 = param_3 * *(int *)(param_1 + 0x6c);
  __size = (**(code **)(**(int **)(param_1 + 0x68) + 0x20))();
  if ((int)__size <= (int)sVar5) {
    __size = sVar5;
  }
  pvVar1 = malloc(__size);
  *(void **)(param_1 + 0x3c) = pvVar1;
  if (pvVar1 == (void *)0x0) {
    pvVar1 = (void *)0x0;
    if (*(char *)(param_1 + 0x2e) != '\0') {
      free(*(void **)(param_1 + 0x34));
      pvVar1 = *(void **)(param_1 + 0x3c);
    }
    free(pvVar1);
    iVar3 = 0;
    *(undefined4 *)(param_1 + 0x34) = 0;
    *(undefined4 *)(param_1 + 0x38) = 0;
    *(undefined4 *)(param_1 + 0x3c) = 0;
    uVar2 = 0;
  }
  else {
    *(size_t *)(param_1 + 0x38) = *(int *)(param_1 + 0x34) + param_3;
    iVar3 = (int)pvVar1 + __size;
    uVar2 = 1;
  }
  *(int *)(param_1 + 0x40) = iVar3;
  return uVar2;
}



### FUNC FUN_00035322 @ 00035322

undefined4 FUN_00035322(int *param_1,int param_2)

{
  int iVar1;
  int iVar2;
  char *pcVar3;
  char *local_18;
  
  *(undefined1 *)((int)param_1 + 0x31) = 0;
  if ((char)param_1[0xc] != '\0') {
    iVar1 = (**(code **)(*param_1 + 0x34))(param_1,0xffffffff);
    if (param_2 == 1) {
      if (iVar1 == -1) {
LAB_000353e0:
        *(char *)(param_1 + 0xc) = '\0';
        *(undefined1 *)((int)param_1 + 0x31) = 1;
        param_1[4] = 0;
        param_1[5] = 0;
        param_1[6] = 0;
        return 0;
      }
      if (((char)param_1[0xc] != '\0') && ((char)param_1[0xb] == '\0')) {
        do {
          local_18 = (char *)param_1[0xf];
          iVar1 = (**(code **)(*(int *)param_1[0x1a] + 0x10))
                            ((int *)param_1[0x1a],param_1 + 0x13,local_18,param_1[0x10],&local_18);
          if ((iVar1 == 3) || ((pcVar3 = (char *)param_1[0xf], iVar1 == 0 && (local_18 == pcVar3))))
          break;
          if ((iVar1 == 2) ||
             (iVar2 = std::_Filebuf_base::_M_write
                                ((_Filebuf_base *)(param_1 + 8),pcVar3,(int)local_18 - (int)pcVar3),
             iVar2 != 1)) goto LAB_000353e0;
        } while (iVar1 == 1);
      }
    }
    else if (iVar1 == -1) goto LAB_000353e0;
  }
  if ((*(char *)((int)param_1 + 0x2f) != '\0') && (*(char *)((int)param_1 + 0x32) != '\0')) {
    param_1[1] = param_1[0x17];
    param_1[2] = param_1[0x18];
    param_1[3] = param_1[0x19];
    *(undefined1 *)((int)param_1 + 0x32) = 0;
  }
  return 1;
}



### FUNC FUN_000353f8 @ 000353f8

void FUN_000353f8(int param_1,int param_2)

{
  uint uVar1;
  locale alStack_1c [4];
  locale alStack_18 [4];
  
  *(int *)(param_1 + 0x48) = param_2;
  uVar1 = (uint)(param_2 == 0);
  *(uint *)(param_1 + 8) = uVar1;
  if ((*(uint *)(param_1 + 0x14) & uVar1) == 0) {
    std::locale::locale(alStack_1c);
    FUN_000354dc(alStack_18,param_1,alStack_1c);
    std::locale::~locale(alStack_18);
    std::locale::~locale(alStack_1c);
    *(undefined1 *)(param_1 + 0x44) = 0x20;
    *(undefined4 *)(param_1 + 0x14) = 0;
    *(undefined4 *)(param_1 + 0x4c) = 0;
    *(uint *)(param_1 + 8) = uVar1;
    *(undefined4 *)(param_1 + 4) = 0x1008;
    *(undefined4 *)(param_1 + 0x1c) = 0;
    *(undefined4 *)(param_1 + 0x18) = 6;
    return;
  }
                    /* WARNING: Subroutine does not return */
  std::ios_base::_M_throw_failure();
}



### FUNC FUN_00035468 @ 00035468

int FUN_00035468(int param_1)

{
  std::ios_base::~ios_base((ios_base *)(param_1 + 8));
  return param_1;
}



### FUNC FUN_00035478 @ 00035478

void FUN_00035478(void *param_1)

{
  std::ios_base::~ios_base((ios_base *)((int)param_1 + 8));
  operator_delete(param_1);
  return;
}



### FUNC FUN_000354b0 @ 000354b0

void FUN_000354b0(int *param_1)

{
  void *pvVar1;
  
  pvVar1 = (void *)((int)param_1 + *(int *)(*param_1 + -0xc));
  std::ios_base::~ios_base((ios_base *)((int)pvVar1 + 8));
  operator_delete(pvVar1);
  return;
}



### FUNC FUN_000354dc @ 000354dc

void FUN_000354dc(locale *param_1,int param_2,locale *param_3)

{
  undefined4 uVar1;
  int *piVar2;
  locale alStack_18 [4];
  
  std::ios_base::imbue(param_1);
  piVar2 = *(int **)(param_2 + 0x48);
  if (piVar2 != (int *)0x0) {
    (**(code **)(*piVar2 + 0x38))(piVar2,param_3);
    std::locale::locale(alStack_18,(locale *)(piVar2 + 7));
    std::locale::operator=((locale *)(piVar2 + 7),param_3);
    std::locale::~locale(alStack_18);
  }
  uVar1 = std::locale::_M_use_facet(param_3,(id *)&std::ctype<char>::id);
  *(undefined4 *)(param_2 + 0x40) = uVar1;
  return;
}



### FUNC FUN_00035588 @ 00035588

int FUN_00035588(int param_1)

{
  std::ios_base::~ios_base((ios_base *)(param_1 + 4));
  return param_1;
}



### FUNC FUN_00035598 @ 00035598

void FUN_00035598(void *param_1)

{
  std::ios_base::~ios_base((ios_base *)((int)param_1 + 4));
  operator_delete(param_1);
  return;
}



### FUNC FUN_000355d0 @ 000355d0

void FUN_000355d0(int *param_1)

{
  void *pvVar1;
  
  pvVar1 = (void *)((int)param_1 + *(int *)(*param_1 + -0xc));
  std::ios_base::~ios_base((ios_base *)((int)pvVar1 + 4));
  operator_delete(pvVar1);
  return;
}



### FUNC FUN_000355fc @ 000355fc

void FUN_000355fc(int param_1,int param_2)

{
  undefined4 uVar1;
  uint uVar2;
  locale alStack_1c [4];
  locale alStack_18 [4];
  
  *(int *)(param_1 + 0x48) = param_2;
  uVar2 = (uint)(param_2 == 0);
  *(uint *)(param_1 + 8) = uVar2;
  if ((*(uint *)(param_1 + 0x14) & uVar2) == 0) {
    std::locale::locale(alStack_1c);
    FUN_000356e4(alStack_18,param_1,alStack_1c);
    std::locale::~locale(alStack_18);
    std::locale::~locale(alStack_1c);
    *(undefined4 *)(param_1 + 0x14) = 0;
    *(undefined4 *)(param_1 + 0x4c) = 0;
    *(uint *)(param_1 + 8) = uVar2;
    *(undefined4 *)(param_1 + 4) = 0x1008;
    *(undefined4 *)(param_1 + 0x1c) = 0;
    *(undefined4 *)(param_1 + 0x18) = 6;
    uVar1 = (**(code **)(**(int **)(param_1 + 0x40) + 0x28))(*(int **)(param_1 + 0x40),0x20);
    *(undefined4 *)(param_1 + 0x44) = uVar1;
    return;
  }
                    /* WARNING: Subroutine does not return */
  std::ios_base::_M_throw_failure();
}



### FUNC FUN_00035670 @ 00035670

int FUN_00035670(int param_1)

{
  std::ios_base::~ios_base((ios_base *)(param_1 + 8));
  return param_1;
}



### FUNC FUN_00035680 @ 00035680

void FUN_00035680(void *param_1)

{
  std::ios_base::~ios_base((ios_base *)((int)param_1 + 8));
  operator_delete(param_1);
  return;
}



### FUNC FUN_000356b8 @ 000356b8

void FUN_000356b8(int *param_1)

{
  void *pvVar1;
  
  pvVar1 = (void *)((int)param_1 + *(int *)(*param_1 + -0xc));
  std::ios_base::~ios_base((ios_base *)((int)pvVar1 + 8));
  operator_delete(pvVar1);
  return;
}



### FUNC FUN_000356e4 @ 000356e4

void FUN_000356e4(locale *param_1,int param_2,locale *param_3)

{
  undefined4 uVar1;
  int *piVar2;
  locale alStack_18 [4];
  
  std::ios_base::imbue(param_1);
  piVar2 = *(int **)(param_2 + 0x48);
  if (piVar2 != (int *)0x0) {
    (**(code **)(*piVar2 + 0x38))(piVar2,param_3);
    std::locale::locale(alStack_18,(locale *)(piVar2 + 7));
    std::locale::operator=((locale *)(piVar2 + 7),param_3);
    std::locale::~locale(alStack_18);
  }
  uVar1 = std::locale::_M_use_facet(param_3,(id *)&std::ctype<wchar_t>::id);
  *(undefined4 *)(param_2 + 0x40) = uVar1;
  return;
}



### FUNC FUN_00035790 @ 00035790

int FUN_00035790(int param_1)

{
  std::ios_base::~ios_base((ios_base *)(param_1 + 4));
  return param_1;
}



### FUNC FUN_000357a0 @ 000357a0

void FUN_000357a0(void *param_1)

{
  std::ios_base::~ios_base((ios_base *)((int)param_1 + 4));
  operator_delete(param_1);
  return;
}



### FUNC FUN_000357d8 @ 000357d8

void FUN_000357d8(int *param_1)

{
  void *pvVar1;
  
  pvVar1 = (void *)((int)param_1 + *(int *)(*param_1 + -0xc));
  std::ios_base::~ios_base((ios_base *)((int)pvVar1 + 4));
  operator_delete(pvVar1);
  return;
}



### FUNC ~facet @ 00035804

/* std::locale::facet::~facet() */

facet * __thiscall std::locale::facet::~facet(facet *this)

{
  pthread_mutex_destroy((pthread_mutex_t *)(this + 8));
  return this;
}



### FUNC ~facet @ 00035814

/* std::locale::facet::~facet() */

void __thiscall std::locale::facet::~facet(facet *this)

{
  pthread_mutex_destroy((pthread_mutex_t *)(this + 8));
  operator_delete(this);
  return;
}



### FUNC _M_throw_on_null_name @ 00035838

/* std::locale::_M_throw_on_null_name() */

void std::locale::_M_throw_on_null_name(void)

{
  __Named_exception *this;
  undefined1 auStack_30 [4];
  string asStack_2c [24];
  
  this = (__Named_exception *)FUN_00030824(0x108);
  FUN_00031c38(asStack_2c,&LAB_000358b8,auStack_30);
  __Named_exception::__Named_exception(this,asStack_2c);
  *(undefined ***)this = &PTR____Named_exception_00068ec0;
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(this,&runtime_error::typeinfo,__Named_exception::~__Named_exception);
}



### FUNC _M_throw_on_combine_error @ 000358e0

/* std::locale::_M_throw_on_combine_error(std::string const&) */

void std::locale::_M_throw_on_combine_error(string *param_1)

{
  size_t sVar1;
  __Named_exception *this;
  char *__s;
  undefined1 auStack_48 [4];
  string asStack_44 [24];
  undefined1 auStack_2c [20];
  undefined4 local_18;
  
  FUN_00031c38(auStack_2c,&LAB_000359d4,asStack_44);
  FUN_00037294(auStack_2c,&LAB_000359ec,&LAB_000359f0);
  __s = *(char **)(param_1 + 0x14);
  if (__s == *(char **)(param_1 + 0x10)) {
    __s = "system";
  }
  sVar1 = strlen(__s);
  FUN_00037294(auStack_2c,__s,__s + sVar1);
  FUN_00037294(auStack_2c," locale","");
  this = (__Named_exception *)FUN_00030824(0x108);
  FUN_00031c38(asStack_44,local_18,auStack_48);
  __Named_exception::__Named_exception(this,asStack_44);
  *(undefined ***)this = &PTR____Named_exception_00068ec0;
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(this,&runtime_error::typeinfo,__Named_exception::~__Named_exception);
}



### FUNC _M_throw_on_creation_failure @ 00035a08

/* std::locale::_M_throw_on_creation_failure(int, char const*, char const*) */

void std::locale::_M_throw_on_creation_failure(int param_1,char *param_2,char *param_3)

{
  size_t sVar1;
  undefined4 uVar2;
  __Named_exception *this;
  undefined1 auStack_48 [4];
  string asStack_44 [24];
  undefined1 local_2c [16];
  undefined1 *local_1c;
  undefined1 *local_18;
  
  local_1c = local_2c;
  local_2c[0] = 0;
  local_18 = local_1c;
  if (param_1 != 4) {
    if (param_1 == 3) {
      FUN_00037294(local_2c,&LAB_00035bb8,&LAB_00035bea_1);
      if (*param_2 == '\0') {
        param_2 = "system";
      }
      sVar1 = strlen(param_2);
      FUN_00037294(local_2c,param_2,param_2 + sVar1);
      FUN_00037294(local_2c," locale","");
    }
    else if (param_1 == 1) {
      FUN_00037294(local_2c,&LAB_00035bf4,&LAB_00035c18_1);
      sVar1 = strlen(param_3);
      FUN_00037294(local_2c,param_3,param_3 + sVar1);
      FUN_00037294(local_2c," facet category, unable to create facet for ","");
      if (*param_2 == '\0') {
        param_2 = "system";
      }
      sVar1 = strlen(param_2);
      FUN_00037294(local_2c,param_2,param_2 + sVar1);
      FUN_00037294(local_2c," locale","");
    }
    else {
      FUN_00037294(local_2c,&LAB_00035c28,&LAB_00035c3e_1);
      sVar1 = strlen(param_3);
      FUN_00037294(local_2c,param_3,param_3 + sVar1);
      FUN_00037294(local_2c,&LAB_00035c40,&LAB_00035c4c);
      sVar1 = strlen(param_2);
      FUN_00037294(local_2c,param_2,param_2 + sVar1);
      FUN_00037294(local_2c,&LAB_00035c50,&LAB_00035c50_1);
    }
    this = (__Named_exception *)FUN_00030824(0x108);
    FUN_00031c38(asStack_44,local_18,auStack_48);
    __Named_exception::__Named_exception(this,asStack_44);
    *(undefined ***)this = &PTR____Named_exception_00068ec0;
                    /* WARNING: Subroutine does not return */
    FUN_000309e0(this,&runtime_error::typeinfo,__Named_exception::~__Named_exception);
  }
  FUN_00030824(4);
  uVar2 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(uVar2,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
}



### FUNC locale @ 00035c60

/* std::locale::locale() */

locale * __thiscall std::locale::locale(locale *this)

{
  undefined4 *puVar1;
  undefined4 uVar2;
  
  puVar1 = (undefined4 *)FUN_000395ec();
  uVar2 = _get_Locale_impl((_Locale_impl *)*puVar1);
  *(undefined4 *)this = uVar2;
  return this;
}



### FUNC locale @ 00035c7a

/* std::locale::locale(std::locale const&) */

locale * __thiscall std::locale::locale(locale *this,locale *param_1)

{
  undefined4 uVar1;
  
  uVar1 = _get_Locale_impl(*(_Locale_impl **)param_1);
  *(undefined4 *)this = uVar1;
  return this;
}



### FUNC _M_insert @ 00035c90

/* std::locale::_M_insert(std::locale::facet*, std::locale::id&) */

void __thiscall std::locale::_M_insert(locale *this,facet *param_1,id *param_2)

{
  int iVar1;
  _Locale_impl *this_00;
  
  if (param_1 != (facet *)0x0) {
    this_00 = *(_Locale_impl **)this;
    if (*(int *)param_2 == 0) {
      pthread_mutex_lock((pthread_mutex_t *)&DAT_00070d3c);
      iVar1 = id::_S_max + 1;
      *(int *)param_2 = id::_S_max;
      id::_S_max = iVar1;
      pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070d3c);
    }
    _Locale_impl::insert(this_00,param_1,param_2);
  }
  return;
}



### FUNC locale @ 00035ce0

/* std::locale::locale(std::_Locale_impl*) */

locale * __thiscall std::locale::locale(locale *this,_Locale_impl *param_1)

{
  undefined4 uVar1;
  
  uVar1 = _get_Locale_impl(param_1);
  *(undefined4 *)this = uVar1;
  return this;
}



### FUNC locale @ 00035cf4

/* WARNING: Removing unreachable block (ram,0x00035e6a) */
/* WARNING: Restarted to delay deadcode elimination for space: stack */
/* std::locale::locale(char const*) */

locale * __thiscall std::locale::locale(locale *this,char *param_1)

{
  char *__s1;
  _Locale_impl *this_00;
  _Locale_name_hint *p_Var1;
  int iVar2;
  size_t sVar3;
  undefined4 *puVar4;
  undefined4 uVar5;
  int iVar6;
  char acStack_62c [256];
  char *local_52c;
  char acStack_528 [256];
  char *local_428;
  char acStack_424 [256];
  char *local_324;
  char acStack_320 [256];
  char *local_220;
  char acStack_21c [256];
  char *local_11c;
  char acStack_118 [256];
  char *local_18;
  
  *(undefined4 *)this = 0;
  if (param_1 == (char *)0x0) {
    uVar5 = _M_throw_on_null_name();
    operator_delete(this);
    FUN_000308d8(uVar5);
    uVar5 = FUN_00030a44();
    operator_delete((void *)0x0);
    FUN_0003094c();
                    /* WARNING: Subroutine does not return */
    ___Unwind_Resume(uVar5);
  }
  if ((*param_1 == 'C') && (param_1[1] == '\0')) {
    puVar4 = (undefined4 *)FUN_0003956c();
    uVar5 = _get_Locale_impl((_Locale_impl *)*puVar4);
  }
  else {
    this_00 = (_Locale_impl *)operator_new(0x2c);
    _Locale_impl::_Locale_impl(this_00,id::_S_max,param_1);
    local_52c = param_1;
    local_428 = param_1;
    local_324 = param_1;
    local_11c = param_1;
    local_220 = param_1;
    local_18 = param_1;
    p_Var1 = (_Locale_name_hint *)
             _Locale_impl::insert_ctype_facets
                       (this_00,&local_18,acStack_118,(_Locale_name_hint *)0x0);
    p_Var1 = (_Locale_name_hint *)
             _Locale_impl::insert_numeric_facets(this_00,&local_11c,acStack_21c,p_Var1);
    p_Var1 = (_Locale_name_hint *)
             _Locale_impl::insert_time_facets(this_00,&local_220,acStack_320,p_Var1);
    p_Var1 = (_Locale_name_hint *)
             _Locale_impl::insert_collate_facets(this_00,&local_324,acStack_424,p_Var1);
    p_Var1 = (_Locale_name_hint *)
             _Locale_impl::insert_monetary_facets(this_00,&local_428,acStack_528,p_Var1);
    _Locale_impl::insert_messages_facets(this_00,&local_52c,acStack_62c,p_Var1);
    __s1 = local_18;
    iVar2 = strcmp(local_18,local_11c);
    if (((iVar2 == 0) &&
        (((iVar2 = strcmp(__s1,local_220), iVar2 == 0 &&
          (iVar2 = strcmp(__s1,local_324), iVar2 == 0)) &&
         (iVar2 = strcmp(__s1,local_428), iVar2 == 0)))) &&
       (iVar2 = strcmp(__s1,local_52c), iVar2 == 0)) {
      sVar3 = strlen(__s1);
      iVar6 = *(int *)(this_00 + 0x18);
      iVar2 = *(int *)(this_00 + 0x1c);
      if ((uint)(iVar6 - iVar2) < sVar3) {
        if (iVar6 != iVar2) {
          __aeabi_memmove(iVar2,__s1);
          iVar6 = *(int *)(this_00 + 0x18);
          iVar2 = *(int *)(this_00 + 0x1c);
        }
        FUN_00037294(this_00 + 8,__s1 + (iVar6 - iVar2),__s1 + sVar3);
      }
      else {
        if (sVar3 != 0) {
          __aeabi_memmove(iVar2,__s1,sVar3);
          iVar6 = *(int *)(this_00 + 0x18);
          iVar2 = *(int *)(this_00 + 0x1c);
        }
        iVar2 = iVar2 + sVar3;
        if (iVar2 != iVar6) {
          __aeabi_memmove(iVar2,iVar6);
          *(int *)(this_00 + 0x18) = *(int *)(this_00 + 0x18) + (iVar2 - iVar6);
        }
      }
    }
    uVar5 = _get_Locale_impl(this_00);
  }
  *(undefined4 *)this = uVar5;
  return this;
}



### FUNC classic @ 00035ee4

/* std::locale::classic() */

void std::locale::classic(void)

{
  FUN_0003956c();
  return;
}



### FUNC locale @ 00035ef0

/* WARNING: Removing unreachable block (ram,0x00036698) */
/* WARNING: Removing unreachable block (ram,0x000361de) */
/* WARNING: Removing unreachable block (ram,0x000361ee) */
/* std::locale::locale(std::locale const&, char const*, int) */

locale * __thiscall std::locale::locale(locale *this,locale *param_1,char *param_2,int param_3)

{
  char *__s2;
  int *piVar1;
  int iVar2;
  _Locale_impl *this_00;
  size_t sVar3;
  int iVar4;
  char *__s2_00;
  char *__s2_01;
  char *__s2_02;
  char *__s2_03;
  undefined4 uVar5;
  __Named_exception *this_01;
  _Locale_impl *p_Var6;
  char *__s1;
  _Locale_name_hint *p_Var7;
  int iVar8;
  char *__s1_00;
  uint uVar9;
  char *local_8f8;
  int local_8f0;
  char acStack_8e0 [256];
  char *local_7e0;
  char acStack_7dc [256];
  char *local_6dc;
  char acStack_6d8 [256];
  char *local_5d8;
  char acStack_5d4 [256];
  char *local_4d4;
  char acStack_4d0 [256];
  char *local_3d0;
  char acStack_3cc [256];
  char *local_2cc;
  undefined1 auStack_2c8 [4];
  int local_2c4 [5];
  int *local_2b0;
  int local_2ac [4];
  undefined4 local_29c;
  int *local_298;
  undefined1 auStack_294 [4];
  int local_290 [5];
  int *local_27c;
  int local_278 [5];
  int *local_264;
  int local_260 [4];
  undefined4 local_250;
  int *local_24c;
  undefined1 auStack_248 [4];
  int local_244 [5];
  int *local_230;
  int local_22c [5];
  int *local_218;
  int local_214 [4];
  undefined4 local_204;
  int *local_200;
  undefined1 auStack_1fc [4];
  int local_1f8 [5];
  int *local_1e4;
  int local_1e0 [5];
  int *local_1cc;
  int local_1c8 [4];
  undefined4 local_1b8;
  int *local_1b4;
  undefined1 auStack_1b0 [4];
  int local_1ac [5];
  int *local_198;
  int local_194 [5];
  int *local_180;
  int local_17c [4];
  undefined4 local_16c;
  int *local_168;
  undefined1 auStack_164 [4];
  int local_160 [5];
  int *local_14c;
  int local_148 [5];
  int *local_134;
  int local_130 [4];
  int local_120;
  int *local_11c;
  string asStack_118 [256];
  undefined1 auStack_18 [4];
  
  p_Var7 = (_Locale_name_hint *)0x0;
  *(undefined4 *)this = 0;
  if (param_2 == (char *)0x0) {
    _M_throw_on_null_name();
LAB_000366a4:
    this_01 = (__Named_exception *)FUN_00030824(local_8f0 + 8);
    FUN_00031c38(asStack_118,&LAB_00036a9c,acStack_3cc);
    __Named_exception::__Named_exception(this_01,asStack_118);
    *(undefined ***)this_01 = &PTR____Named_exception_00068ec0;
                    /* WARNING: Subroutine does not return */
    FUN_000309e0(this_01,&runtime_error::typeinfo,__Named_exception::~__Named_exception);
  }
  iVar2 = strcmp("*",param_2);
  local_8f0 = 0x100;
  if (iVar2 == 0) goto LAB_000366a4;
  this_00 = (_Locale_impl *)operator_new(0x2c);
  _Locale_impl::_Locale_impl(this_00,*(_Locale_impl **)param_1);
  local_7e0 = param_2;
  local_6dc = param_2;
  local_5d8 = param_2;
  local_4d4 = param_2;
  local_3d0 = param_2;
  local_2cc = param_2;
  if ((param_3 & 0x20U) != 0) {
    p_Var7 = (_Locale_name_hint *)
             _Locale_impl::insert_ctype_facets
                       (this_00,&local_2cc,acStack_3cc,(_Locale_name_hint *)0x0);
  }
  if ((param_3 & 0x100U) != 0) {
    p_Var7 = (_Locale_name_hint *)
             _Locale_impl::insert_numeric_facets(this_00,&local_3d0,acStack_4d0,p_Var7);
  }
  if ((param_3 & 0x200U) != 0) {
    p_Var7 = (_Locale_name_hint *)
             _Locale_impl::insert_time_facets(this_00,&local_4d4,acStack_5d4,p_Var7);
  }
  if ((param_3 & 0x10U) != 0) {
    p_Var7 = (_Locale_name_hint *)
             _Locale_impl::insert_collate_facets(this_00,&local_5d8,acStack_6d8,p_Var7);
  }
  if ((param_3 & 0x40U) != 0) {
    p_Var7 = (_Locale_name_hint *)
             _Locale_impl::insert_monetary_facets(this_00,&local_6dc,acStack_7dc,p_Var7);
  }
  if ((param_3 & 0x400U) != 0) {
    _Locale_impl::insert_messages_facets(this_00,&local_7e0,acStack_8e0,p_Var7);
  }
  __s1_00 = local_2cc;
  __s2_00 = local_3d0;
  __s2 = local_4d4;
  __s2_01 = local_5d8;
  __s2_02 = local_6dc;
  __s2_03 = local_7e0;
  __s1 = *(char **)(*(int *)param_1 + 0x1c);
  if ((param_3 & 0x770U) == 0) {
LAB_00036154:
    sVar3 = strlen(__s1);
    iVar8 = *(int *)(this_00 + 0x18);
    iVar2 = *(int *)(this_00 + 0x1c);
    if ((uint)(iVar8 - iVar2) < sVar3) {
      if (iVar8 != iVar2) {
        __aeabi_memmove(iVar2,__s1);
        iVar8 = *(int *)(this_00 + 0x18);
        iVar2 = *(int *)(this_00 + 0x1c);
      }
      FUN_00037294(this_00 + 8,__s1 + (iVar8 - iVar2),__s1 + sVar3);
      goto LAB_00036612;
    }
    if (sVar3 != 0) {
      __aeabi_memmove(iVar2,__s1,sVar3);
      iVar8 = *(int *)(this_00 + 0x18);
      iVar2 = *(int *)(this_00 + 0x1c);
    }
    iVar2 = iVar2 + sVar3;
    if (iVar2 == iVar8) goto LAB_00036612;
    __aeabi_memmove(iVar2,iVar8);
    iVar4 = *(int *)(this_00 + 0x18);
    iVar2 = iVar2 - iVar8;
  }
  else {
    local_8f8 = local_4d4;
    iVar2 = strcmp(__s1,local_2cc);
    if (((((iVar2 == 0) && (iVar2 = strcmp(__s1,__s2), iVar2 == 0)) &&
         (iVar2 = strcmp(__s1,__s2_00), iVar2 == 0)) &&
        ((iVar2 = strcmp(__s1,__s2_01), iVar2 == 0 && (iVar2 = strcmp(__s1,__s2_02), iVar2 == 0))))
       && (iVar2 = strcmp(__s1,__s2_03), iVar2 == 0)) goto LAB_00036154;
    if ((((param_3 & 0x770U) != 0x770) || (iVar2 = strcmp(__s1_00,__s2), iVar2 != 0)) ||
       ((iVar2 = strcmp(__s1_00,__s2_00), iVar2 != 0 ||
        (((iVar2 = strcmp(__s1_00,__s2_01), iVar2 != 0 ||
          (iVar2 = strcmp(__s1_00,__s2_02), iVar2 != 0)) ||
         (iVar2 = strcmp(__s1_00,__s2_03), iVar2 != 0)))))) {
      FUN_00031c38(local_160,"LC_CTYPE=",auStack_164);
      if ((param_3 & 0x20U) == 0) {
        __s1_00 = __s1;
      }
      uVar5 = FUN_0004d9d8(__s1_00,asStack_118,0,auStack_18);
      FUN_000371e8(local_148,local_160,uVar5);
      FUN_000371e8(local_130,local_148,&DAT_00036334);
      piVar1 = local_11c;
      uVar9 = local_120 - (int)local_11c;
      iVar8 = *(int *)(this_00 + 0x18);
      iVar2 = *(int *)(this_00 + 0x1c);
      p_Var6 = this_00 + 8;
      if ((uint)(iVar8 - iVar2) < uVar9) {
        if (iVar8 != iVar2) {
          __aeabi_memmove(iVar2,local_11c);
          iVar8 = *(int *)(this_00 + 0x18);
          iVar2 = *(int *)(this_00 + 0x1c);
        }
        FUN_00037294(p_Var6,(int)piVar1 + (iVar8 - iVar2),local_120);
      }
      else {
        if (uVar9 != 0) {
          __aeabi_memmove(iVar2,local_11c,uVar9);
          iVar8 = *(int *)(this_00 + 0x18);
          iVar2 = *(int *)(this_00 + 0x1c);
        }
        iVar2 = iVar2 + uVar9;
        if (iVar2 != iVar8) {
          __aeabi_memmove(iVar2,iVar8);
          *(int *)(this_00 + 0x18) = *(int *)(this_00 + 0x18) + (iVar2 - iVar8);
        }
      }
      if ((local_11c != local_130) && (local_11c != (int *)0x0)) {
        if ((uint)(local_130[0] - (int)local_11c) < 0x81) {
          __node_alloc::_M_deallocate(local_11c,local_130[0] - (int)local_11c);
        }
        else {
          operator_delete(local_11c);
        }
      }
      if ((local_134 != local_148) && (local_134 != (int *)0x0)) {
        if ((uint)(local_148[0] - (int)local_134) < 0x81) {
          __node_alloc::_M_deallocate(local_134,local_148[0] - (int)local_134);
        }
        else {
          operator_delete(local_134);
        }
      }
      if ((local_14c != local_160) && (local_14c != (int *)0x0)) {
        if ((uint)(local_160[0] - (int)local_14c) < 0x81) {
          __node_alloc::_M_deallocate(local_14c,local_160[0] - (int)local_14c);
        }
        else {
          operator_delete(local_14c);
        }
      }
      FUN_00031c38(local_1ac,"LC_TIME=",auStack_1b0);
      if ((param_3 & 0x200U) == 0) {
        local_8f8 = __s1;
      }
      uVar5 = FUN_0004da18(local_8f8,asStack_118,0,auStack_18);
      FUN_000371e8(local_194,local_1ac,uVar5);
      FUN_000371e8(local_17c,local_194,&DAT_00036334);
      FUN_00037294(p_Var6,local_168,local_16c);
      if ((local_168 != local_17c) && (local_168 != (int *)0x0)) {
        if ((uint)(local_17c[0] - (int)local_168) < 0x81) {
          __node_alloc::_M_deallocate(local_168,local_17c[0] - (int)local_168);
        }
        else {
          operator_delete(local_168);
        }
      }
      if ((local_180 != local_194) && (local_180 != (int *)0x0)) {
        if ((uint)(local_194[0] - (int)local_180) < 0x81) {
          __node_alloc::_M_deallocate(local_180,local_194[0] - (int)local_180);
        }
        else {
          operator_delete(local_180);
        }
      }
      if ((local_198 != local_1ac) && (local_198 != (int *)0x0)) {
        if ((uint)(local_1ac[0] - (int)local_198) < 0x81) {
          __node_alloc::_M_deallocate(local_198,local_1ac[0] - (int)local_198);
        }
        else {
          operator_delete(local_198);
        }
      }
      FUN_00031c38(local_1f8,"LC_NUMERIC=",auStack_1fc);
      if ((param_3 & 0x100U) == 0) {
        __s2_00 = __s1;
      }
      uVar5 = FUN_0004d9f8(__s2_00,asStack_118,0,auStack_18);
      FUN_000371e8(local_1e0,local_1f8,uVar5);
      FUN_000371e8(local_1c8,local_1e0,&DAT_00036780);
      FUN_00037294(p_Var6,local_1b4,local_1b8);
      if ((local_1b4 != local_1c8) && (local_1b4 != (int *)0x0)) {
        if ((uint)(local_1c8[0] - (int)local_1b4) < 0x81) {
          __node_alloc::_M_deallocate(local_1b4,local_1c8[0] - (int)local_1b4);
        }
        else {
          operator_delete(local_1b4);
        }
      }
      if ((local_1cc != local_1e0) && (local_1cc != (int *)0x0)) {
        if ((uint)(local_1e0[0] - (int)local_1cc) < 0x81) {
          __node_alloc::_M_deallocate(local_1cc,local_1e0[0] - (int)local_1cc);
        }
        else {
          operator_delete(local_1cc);
        }
      }
      if ((local_1e4 != local_1f8) && (local_1e4 != (int *)0x0)) {
        if ((uint)(local_1f8[0] - (int)local_1e4) < 0x81) {
          __node_alloc::_M_deallocate(local_1e4,local_1f8[0] - (int)local_1e4);
        }
        else {
          operator_delete(local_1e4);
        }
      }
      FUN_00031c38(local_244,"LC_COLLATE=",auStack_248);
      if ((param_3 & 0x10U) == 0) {
        __s2_01 = __s1;
      }
      uVar5 = FUN_0004da38(__s2_01,asStack_118,0,auStack_18);
      FUN_000371e8(local_22c,local_244,uVar5);
      FUN_000371e8(local_214,local_22c,&DAT_00036780);
      FUN_00037294(p_Var6,local_200,local_204);
      if ((local_200 != local_214) && (local_200 != (int *)0x0)) {
        if ((uint)(local_214[0] - (int)local_200) < 0x81) {
          __node_alloc::_M_deallocate(local_200,local_214[0] - (int)local_200);
        }
        else {
          operator_delete(local_200);
        }
      }
      if ((local_218 != local_22c) && (local_218 != (int *)0x0)) {
        if ((uint)(local_22c[0] - (int)local_218) < 0x81) {
          __node_alloc::_M_deallocate(local_218,local_22c[0] - (int)local_218);
        }
        else {
          operator_delete(local_218);
        }
      }
      if ((local_230 != local_244) && (local_230 != (int *)0x0)) {
        if ((uint)(local_244[0] - (int)local_230) < 0x81) {
          __node_alloc::_M_deallocate(local_230,local_244[0] - (int)local_230);
        }
        else {
          operator_delete(local_230);
        }
      }
      FUN_00031c38(local_290,"LC_MONETARY=",auStack_294);
      if ((param_3 & 0x40U) == 0) {
        __s2_02 = __s1;
      }
      uVar5 = FUN_0004da58(__s2_02,asStack_118,0,auStack_18);
      FUN_000371e8(local_278,local_290,uVar5);
      FUN_000371e8(local_260,local_278,&DAT_00036780);
      FUN_00037294(p_Var6,local_24c,local_250);
      if ((local_24c != local_260) && (local_24c != (int *)0x0)) {
        if ((uint)(local_260[0] - (int)local_24c) < 0x81) {
          __node_alloc::_M_deallocate(local_24c,local_260[0] - (int)local_24c);
        }
        else {
          operator_delete(local_24c);
        }
      }
      if ((local_264 != local_278) && (local_264 != (int *)0x0)) {
        if ((uint)(local_278[0] - (int)local_264) < 0x81) {
          __node_alloc::_M_deallocate(local_264,local_278[0] - (int)local_264);
        }
        else {
          operator_delete(local_264);
        }
      }
      if ((local_27c != local_290) && (local_27c != (int *)0x0)) {
        if ((uint)(local_290[0] - (int)local_27c) < 0x81) {
          __node_alloc::_M_deallocate(local_27c,local_290[0] - (int)local_27c);
        }
        else {
          operator_delete(local_27c);
        }
      }
      FUN_00031c38(local_2c4,"LC_MESSAGES=",auStack_2c8);
      if ((param_3 & 0x400U) == 0) {
        __s2_03 = __s1;
      }
      uVar5 = FUN_0004da78(__s2_03,asStack_118,0,auStack_18);
      FUN_000371e8(local_2ac,local_2c4,uVar5);
      FUN_00037294(p_Var6,local_298,local_29c);
      if ((local_298 != local_2ac) && (local_298 != (int *)0x0)) {
        if ((uint)(local_2ac[0] - (int)local_298) < 0x81) {
          __node_alloc::_M_deallocate(local_298,local_2ac[0] - (int)local_298);
        }
        else {
          operator_delete(local_298);
        }
      }
      if ((local_2b0 != local_2c4) && (local_2b0 != (int *)0x0)) {
        if ((uint)(local_2c4[0] - (int)local_2b0) < 0x81) {
          __node_alloc::_M_deallocate(local_2b0,local_2c4[0] - (int)local_2b0);
        }
        else {
          operator_delete(local_2b0);
        }
      }
      goto LAB_00036612;
    }
    sVar3 = strlen(__s1_00);
    iVar8 = *(int *)(this_00 + 0x18);
    iVar2 = *(int *)(this_00 + 0x1c);
    if ((uint)(iVar8 - iVar2) < sVar3) {
      if (iVar8 != iVar2) {
        __aeabi_memmove(iVar2,__s1_00);
        iVar8 = *(int *)(this_00 + 0x18);
        iVar2 = *(int *)(this_00 + 0x1c);
      }
      FUN_00037294(this_00 + 8,__s1_00 + (iVar8 - iVar2),__s1_00 + sVar3);
      goto LAB_00036612;
    }
    if (sVar3 != 0) {
      __aeabi_memmove(iVar2,__s1_00,sVar3);
      iVar8 = *(int *)(this_00 + 0x18);
      iVar2 = *(int *)(this_00 + 0x1c);
    }
    iVar2 = iVar2 + sVar3;
    if (iVar2 == iVar8) goto LAB_00036612;
    __aeabi_memmove(iVar2,iVar8);
    iVar4 = *(int *)(this_00 + 0x18);
    iVar2 = iVar2 - iVar8;
  }
  *(int *)(this_00 + 0x18) = iVar4 + iVar2;
LAB_00036612:
  uVar5 = _get_Locale_impl(this_00);
  *(undefined4 *)this = uVar5;
  return this;
}



### FUNC locale @ 00036b08

/* WARNING: Removing unreachable block (ram,0x00036c52) */
/* WARNING: Type propagation algorithm not settling */
/* std::locale::locale(std::locale const&, std::locale const&, int) */

locale * __thiscall std::locale::locale(locale *this,locale *param_1,locale *param_2,int param_3)

{
  bool bVar1;
  _Locale_impl *this_00;
  _Locale_impl *p_Var2;
  size_t sVar3;
  int iVar4;
  undefined1 *puVar5;
  undefined1 *puVar6;
  undefined4 uVar7;
  int iVar8;
  char *__s;
  int local_44 [4];
  int local_34;
  int *local_30;
  int local_2c [4];
  int local_1c;
  int *local_18;
  
  *(undefined4 *)this = 0;
  this_00 = (_Locale_impl *)operator_new(0x2c);
  _Locale_impl::_Locale_impl(this_00,*(_Locale_impl **)param_1);
  p_Var2 = *(_Locale_impl **)param_2;
  FUN_00036f1c(local_2c,*(int *)param_1 + 8);
  if ((local_1c - (int)local_18 != 1) || (bVar1 = false, (char)*local_18 != '*')) {
    FUN_00036f1c(local_44,*(int *)param_2 + 8);
    bVar1 = true;
    if ((local_34 - (int)local_30 == 1) && (bVar1 = true, (char)*local_30 == '*')) {
      bVar1 = false;
    }
    if ((local_30 != local_44) && (local_30 != (int *)0x0)) {
      if ((uint)(local_44[0] - (int)local_30) < 0x81) {
        __node_alloc::_M_deallocate(local_30,local_44[0] - (int)local_30);
      }
      else {
        operator_delete(local_30);
      }
    }
  }
  if ((local_18 == local_2c) || (local_18 == (int *)0x0)) {
LAB_00036ba4:
    if (bVar1) goto LAB_00036ba8;
LAB_00036c20:
    if (*(undefined1 **)(this_00 + 0x18) == *(undefined1 **)(this_00 + 0x1c)) {
      FUN_00037294(this_00 + 8,&DAT_00064e87,&DAT_00064e88);
      goto LAB_00036c5a;
    }
    **(undefined1 **)(this_00 + 0x1c) = 0x2a;
    puVar5 = *(undefined1 **)(this_00 + 0x18);
    puVar6 = (undefined1 *)(*(int *)(this_00 + 0x1c) + 1);
    if (puVar6 == puVar5) goto LAB_00036c5a;
    *puVar6 = *puVar5;
    puVar6 = puVar6 + (*(int *)(this_00 + 0x18) - (int)puVar5);
  }
  else {
    if (0x80 < (uint)(local_2c[0] - (int)local_18)) {
      operator_delete(local_18);
      goto LAB_00036ba4;
    }
    __node_alloc::_M_deallocate(local_18,local_2c[0] - (int)local_18);
    if (!bVar1) goto LAB_00036c20;
LAB_00036ba8:
    __s = *(char **)(*(int *)param_1 + 0x1c);
    sVar3 = strlen(__s);
    iVar8 = *(int *)(this_00 + 0x18);
    iVar4 = *(int *)(this_00 + 0x1c);
    if ((uint)(iVar8 - iVar4) < sVar3) {
      if (iVar8 != iVar4) {
        __aeabi_memmove(iVar4,__s);
        iVar8 = *(int *)(this_00 + 0x18);
        iVar4 = *(int *)(this_00 + 0x1c);
      }
      FUN_00037294(this_00 + 8,__s + (iVar8 - iVar4),__s + sVar3);
      goto LAB_00036c5a;
    }
    if (sVar3 != 0) {
      __aeabi_memmove(iVar4,__s,sVar3);
      iVar8 = *(int *)(this_00 + 0x18);
      iVar4 = *(int *)(this_00 + 0x1c);
    }
    iVar4 = iVar4 + sVar3;
    if (iVar4 == iVar8) goto LAB_00036c5a;
    __aeabi_memmove(iVar4,iVar8);
    puVar6 = (undefined1 *)(*(int *)(this_00 + 0x18) + (iVar4 - iVar8));
  }
  *(undefined1 **)(this_00 + 0x18) = puVar6;
LAB_00036c5a:
  if (param_3 << 0x1b < 0) {
    _Locale_impl::insert(this_00,p_Var2,(id *)&collate<char>::id);
    _Locale_impl::insert(this_00,p_Var2,(id *)&collate<wchar_t>::id);
  }
  if (param_3 << 0x1a < 0) {
    _Locale_impl::insert(this_00,p_Var2,(id *)&ctype<char>::id);
    _Locale_impl::insert(this_00,p_Var2,(id *)&codecvt<char,char,mbstate_t>::id);
    _Locale_impl::insert(this_00,p_Var2,(id *)&ctype<wchar_t>::id);
    _Locale_impl::insert(this_00,p_Var2,(id *)&codecvt<wchar_t,char,mbstate_t>::id);
  }
  if (param_3 << 0x19 < 0) {
    _Locale_impl::insert(this_00,p_Var2,(id *)&moneypunct<char,true>::id);
    _Locale_impl::insert(this_00,p_Var2,(id *)&moneypunct<char,false>::id);
    _Locale_impl::insert(this_00,p_Var2,(id *)&DAT_00070d0c);
    _Locale_impl::insert(this_00,p_Var2,(id *)&DAT_00070d10);
    _Locale_impl::insert(this_00,p_Var2,(id *)&moneypunct<wchar_t,true>::id);
    _Locale_impl::insert(this_00,p_Var2,(id *)&moneypunct<wchar_t,false>::id);
    _Locale_impl::insert(this_00,p_Var2,(id *)&DAT_00070d14);
    _Locale_impl::insert(this_00,p_Var2,(id *)&DAT_00070d18);
  }
  if (param_3 << 0x17 < 0) {
    _Locale_impl::insert(this_00,p_Var2,(id *)&numpunct<char>::id);
    _Locale_impl::insert(this_00,p_Var2,(id *)&DAT_00070d1c);
    _Locale_impl::insert(this_00,p_Var2,(id *)&DAT_00070d20);
    _Locale_impl::insert(this_00,p_Var2,(id *)&numpunct<wchar_t>::id);
    _Locale_impl::insert(this_00,p_Var2,(id *)&DAT_00070d24);
    _Locale_impl::insert(this_00,p_Var2,(id *)&DAT_00070d28);
  }
  if (param_3 << 0x16 < 0) {
    _Locale_impl::insert(this_00,p_Var2,(id *)&DAT_00070d2c);
    _Locale_impl::insert(this_00,p_Var2,(id *)&DAT_00070d30);
    _Locale_impl::insert(this_00,p_Var2,(id *)&DAT_00070d34);
    _Locale_impl::insert(this_00,p_Var2,(id *)&DAT_00070d38);
  }
  if (param_3 << 0x15 < 0) {
    _Locale_impl::insert(this_00,p_Var2,(id *)&messages<char>::id);
    _Locale_impl::insert(this_00,p_Var2,(id *)&messages<wchar_t>::id);
  }
  uVar7 = _get_Locale_impl(this_00);
  *(undefined4 *)this = uVar7;
  return this;
}



### FUNC name @ 00036e90

/* std::locale::name() const */

void std::locale::name(void)

{
  undefined4 in_r0;
  int *in_r1;
  
  FUN_00036f1c(in_r0,*in_r1 + 8);
  return;
}



### FUNC ~locale @ 00036e9e

/* std::locale::~locale() */

locale * __thiscall std::locale::~locale(locale *this)

{
  if (*(int *)this != 0) {
    FUN_0003968c(this);
  }
  return this;
}



### FUNC operator= @ 00036eb8

/* std::locale::TEMPNAMEPLACEHOLDERVALUE(std::locale const&) */

locale * __thiscall std::locale::operator=(locale *this,locale *param_1)

{
  _Locale_impl *p_Var1;
  undefined4 uVar2;
  
  p_Var1 = *(_Locale_impl **)param_1;
  if (*(_Locale_impl **)this != p_Var1) {
    if (*(_Locale_impl **)this != (_Locale_impl *)0x0) {
      FUN_0003968c(this);
      p_Var1 = *(_Locale_impl **)param_1;
    }
    uVar2 = _get_Locale_impl(p_Var1);
    *(undefined4 *)this = uVar2;
  }
  return this;
}



### FUNC _M_get_facet @ 00036ee2

/* std::locale::_M_get_facet(std::locale::id const&) const */

undefined4 __thiscall std::locale::_M_get_facet(locale *this,id *param_1)

{
  undefined4 uVar1;
  int iVar2;
  
  iVar2 = *(int *)(*(int *)this + 0x20);
  uVar1 = 0;
  if (*(uint *)param_1 < (uint)(*(int *)(*(int *)this + 0x24) - iVar2 >> 2)) {
    uVar1 = *(undefined4 *)(iVar2 + *(uint *)param_1 * 4);
  }
  return uVar1;
}



### FUNC _M_use_facet @ 00036efa

/* std::locale::_M_use_facet(std::locale::id const&) const */

undefined4 * __thiscall std::locale::_M_use_facet(locale *this,id *param_1)

{
  int iVar1;
  undefined4 *puVar2;
  undefined4 *puVar3;
  int iVar4;
  int iVar5;
  uint uVar6;
  undefined8 uVar7;
  uint uStack_20;
  
  iVar1 = *(int *)(*(int *)this + 0x20);
  if ((*(uint *)param_1 < (uint)(*(int *)(*(int *)this + 0x24) - iVar1 >> 2)) &&
     (puVar2 = *(undefined4 **)(iVar1 + *(uint *)param_1 * 4), puVar2 != (undefined4 *)0x0)) {
    return puVar2;
  }
  uVar7 = _Locale_impl::_M_throw_bad_cast();
  iVar1 = (int)((ulonglong)uVar7 >> 0x20);
  puVar2 = (undefined4 *)uVar7;
  puVar2[4] = puVar2;
  puVar2[5] = puVar2;
  iVar5 = *(int *)(iVar1 + 0x10);
  iVar1 = *(int *)(iVar1 + 0x14);
  iVar4 = iVar5 - iVar1;
  uVar6 = iVar4 + 1;
  if (uVar6 != 0) {
    puVar3 = puVar2;
    if (0x10 < uVar6) {
      uStack_20 = uVar6;
      if (uVar6 < 0x81) {
        puVar3 = (undefined4 *)__node_alloc::_M_allocate(&uStack_20);
        uVar6 = uStack_20;
      }
      else {
        puVar3 = (undefined4 *)operator_new(uVar6);
      }
      puVar2[4] = puVar3;
      puVar2[5] = puVar3;
      *puVar2 = (undefined1 *)((int)puVar3 + uVar6);
    }
    if (iVar5 != iVar1) {
      __aeabi_memcpy(puVar3);
      puVar3 = (undefined4 *)((int)puVar3 + iVar4);
    }
    puVar2[4] = puVar3;
    *(undefined1 *)puVar3 = 0;
    return puVar2;
  }
                    /* WARNING: Subroutine does not return */
  __stl_throw_length_error("basic_string");
}



### FUNC FUN_00036f1c @ 00036f1c

undefined4 * FUN_00036f1c(undefined4 *param_1,int param_2)

{
  undefined4 *puVar1;
  int iVar2;
  int iVar3;
  int iVar4;
  uint uVar5;
  uint local_18;
  
  param_1[4] = param_1;
  param_1[5] = param_1;
  iVar4 = *(int *)(param_2 + 0x10);
  iVar2 = *(int *)(param_2 + 0x14);
  iVar3 = iVar4 - iVar2;
  uVar5 = iVar3 + 1;
  if (uVar5 != 0) {
    puVar1 = param_1;
    if (0x10 < uVar5) {
      local_18 = uVar5;
      if (uVar5 < 0x81) {
        puVar1 = (undefined4 *)std::__node_alloc::_M_allocate(&local_18);
        uVar5 = local_18;
      }
      else {
        puVar1 = (undefined4 *)operator_new(uVar5);
      }
      param_1[4] = puVar1;
      param_1[5] = puVar1;
      *param_1 = (undefined1 *)((int)puVar1 + uVar5);
    }
    if (iVar4 != iVar2) {
      __aeabi_memcpy(puVar1);
      puVar1 = (undefined4 *)((int)puVar1 + iVar3);
    }
    param_1[4] = puVar1;
    *(undefined1 *)puVar1 = 0;
    return param_1;
  }
                    /* WARNING: Subroutine does not return */
  std::__stl_throw_length_error("basic_string");
}



### FUNC operator== @ 00036fbc

/* std::locale::TEMPNAMEPLACEHOLDERVALUE(std::locale const&) const */

undefined4 __thiscall std::locale::operator==(locale *this,locale *param_1)

{
  int iVar1;
  undefined4 uVar2;
  int *piVar3;
  int local_5c [4];
  int local_4c;
  int *local_48;
  int local_44 [4];
  int local_34;
  int *local_30;
  int local_2c [4];
  int local_1c;
  int *local_18;
  
  if (*(int *)this == *(int *)param_1) {
    uVar2 = 1;
  }
  else {
    FUN_00036f1c(local_2c,*(int *)this + 8);
    FUN_00036f1c(local_44,*(int *)param_1 + 8);
    piVar3 = local_30;
    uVar2 = 0;
    if ((local_1c - (int)local_18 == local_34 - (int)local_30) &&
       (iVar1 = memcmp(local_18,local_30,local_1c - (int)local_18), iVar1 == 0)) {
      FUN_00036f1c(local_5c,*(int *)this + 8);
      uVar2 = 1;
      if ((local_4c - (int)local_48 == 1) && (uVar2 = 1, (char)*local_48 == '*')) {
        uVar2 = 0;
      }
      piVar3 = local_30;
      if ((local_48 != local_5c) && (local_48 != (int *)0x0)) {
        if ((uint)(local_5c[0] - (int)local_48) < 0x81) {
          __node_alloc::_M_deallocate(local_48,local_5c[0] - (int)local_48);
          piVar3 = local_30;
        }
        else {
          operator_delete(local_48);
          piVar3 = local_30;
        }
      }
    }
    if ((piVar3 != local_44) && (piVar3 != (int *)0x0)) {
      if ((uint)(local_44[0] - (int)piVar3) < 0x81) {
        __node_alloc::_M_deallocate(piVar3,local_44[0] - (int)piVar3);
      }
      else {
        operator_delete(piVar3);
      }
    }
    if ((local_18 != local_2c) && (local_18 != (int *)0x0)) {
      if ((uint)(local_2c[0] - (int)local_18) < 0x81) {
        __node_alloc::_M_deallocate(local_18,local_2c[0] - (int)local_18);
      }
      else {
        operator_delete(local_18);
      }
    }
  }
  return uVar2;
}



### FUNC operator!= @ 000370e6

/* std::locale::TEMPNAMEPLACEHOLDERVALUE(std::locale const&) const */

uint __thiscall std::locale::operator!=(locale *this,locale *param_1)

{
  uint uVar1;
  
  uVar1 = operator==(this,param_1);
  return uVar1 ^ 1;
}



### FUNC global @ 000370f4

/* std::locale::global(std::locale const&) */

void __thiscall std::locale::global(locale *this,locale *param_1)

{
  bool bVar1;
  undefined4 *puVar2;
  undefined4 uVar3;
  int *piVar4;
  int local_44 [5];
  int *local_30;
  int local_2c [4];
  int local_1c;
  int *local_18;
  
  puVar2 = (undefined4 *)FUN_000395ec();
  uVar3 = _get_Locale_impl((_Locale_impl *)*puVar2);
  *(undefined4 *)this = uVar3;
  piVar4 = (int *)FUN_000395ec();
  if (*piVar4 != *(int *)param_1) {
    FUN_000395ec();
    FUN_0003968c();
    uVar3 = _get_Locale_impl(*(_Locale_impl **)param_1);
    puVar2 = (undefined4 *)FUN_000395ec();
    *puVar2 = uVar3;
    FUN_00036f1c(local_2c,*(int *)param_1 + 8);
    bVar1 = true;
    if ((local_1c - (int)local_18 == 1) && (bVar1 = true, (char)*local_18 == '*')) {
      bVar1 = false;
    }
    if ((local_18 != local_2c) && (local_18 != (int *)0x0)) {
      if ((uint)(local_2c[0] - (int)local_18) < 0x81) {
        __node_alloc::_M_deallocate(local_18,local_2c[0] - (int)local_18);
      }
      else {
        operator_delete(local_18);
      }
    }
    if (bVar1) {
      FUN_00036f1c(local_44,*(int *)param_1 + 8);
      setlocale(6,(char *)local_30);
      if ((local_30 != local_44) && (local_30 != (int *)0x0)) {
        if (0x80 < (uint)(local_44[0] - (int)local_30)) {
          operator_delete(local_30);
          return;
        }
        __node_alloc::_M_deallocate(local_30,local_44[0] - (int)local_30);
      }
    }
  }
  return;
}



### FUNC FUN_000371e8 @ 000371e8

void FUN_000371e8(undefined4 *param_1,int param_2,char *param_3)

{
  size_t sVar1;
  undefined4 *puVar2;
  int iVar3;
  int iVar4;
  uint uVar5;
  uint local_1c;
  undefined1 auStack_18 [4];
  
  sVar1 = strlen(param_3);
  iVar4 = *(int *)(param_2 + 0x10);
  iVar3 = *(int *)(param_2 + 0x14);
  param_1[4] = param_1;
  param_1[5] = param_1;
  uVar5 = (sVar1 + iVar4 + 1) - iVar3;
  if (uVar5 != 0) {
    puVar2 = param_1;
    if (0x10 < uVar5) {
      local_1c = uVar5;
      if (uVar5 < 0x81) {
        puVar2 = (undefined4 *)std::__node_alloc::_M_allocate(&local_1c);
        uVar5 = local_1c;
      }
      else {
        puVar2 = (undefined4 *)operator_new(uVar5);
      }
      param_1[4] = puVar2;
      param_1[5] = puVar2;
      *param_1 = (undefined1 *)((int)puVar2 + uVar5);
    }
    *(undefined1 *)puVar2 = 0;
    FUN_00037294(param_1,*(undefined4 *)(param_2 + 0x14),*(undefined4 *)(param_2 + 0x10));
    FUN_000373cc(param_1,param_3,param_3 + sVar1,auStack_18);
    return;
  }
                    /* WARNING: Subroutine does not return */
  std::__stl_throw_length_error("basic_string");
}



### FUNC FUN_00037294 @ 00037294

int * FUN_00037294(int *param_1,undefined1 *param_2,undefined1 *param_3)

{
  undefined1 *puVar1;
  undefined1 *puVar2;
  uint uVar3;
  uint uVar4;
  int *piVar5;
  uint uVar6;
  uint uVar7;
  int *piVar8;
  uint uVar9;
  undefined1 *puVar10;
  uint local_28;
  uint local_18;
  
  if (param_2 != param_3) {
    uVar9 = (int)param_3 - (int)param_2;
    piVar8 = (int *)param_1[5];
    if (piVar8 == param_1) {
      puVar2 = (undefined1 *)param_1[4];
      piVar5 = param_1 + 4;
    }
    else {
      puVar2 = (undefined1 *)param_1[4];
      piVar5 = (int *)*param_1;
    }
    if (uVar9 < (uint)((int)piVar5 - (int)puVar2)) {
      puVar1 = param_2 + 1;
      if (0 < (int)param_3 - (int)puVar1) {
        param_3 = param_3 + (1 - (int)puVar1);
        do {
          puVar2 = puVar2 + 1;
          *puVar2 = *puVar1;
          param_3 = param_3 + -1;
          puVar1 = puVar1 + 1;
        } while (1 < (int)param_3);
        puVar2 = (undefined1 *)param_1[4];
      }
      puVar2[uVar9] = 0;
      *(undefined1 *)param_1[4] = *param_2;
      param_1[4] = param_1[4] + uVar9;
    }
    else {
      uVar3 = (int)puVar2 - (int)piVar8;
      if (-uVar3 - 2 < uVar9) {
                    /* WARNING: Subroutine does not return */
        std::__stl_throw_length_error("basic_string");
      }
      uVar6 = uVar3;
      if (uVar3 <= uVar9) {
        uVar6 = uVar9;
      }
      uVar7 = uVar3 + uVar6 + 1;
      uVar4 = 0xfffffffe;
      if (uVar3 <= uVar7) {
        uVar4 = uVar7;
      }
      local_28 = 0xfffffffe;
      if (uVar3 + uVar6 != -2) {
        local_28 = uVar4;
      }
      if (local_28 == 0) {
        local_28 = 0;
        puVar1 = (undefined1 *)0x0;
      }
      else {
        local_18 = local_28;
        if (local_28 < 0x81) {
          puVar1 = (undefined1 *)std::__node_alloc::_M_allocate(&local_18);
          local_28 = local_18;
        }
        else {
          puVar1 = (undefined1 *)operator_new(local_28);
        }
        puVar2 = (undefined1 *)param_1[4];
        piVar8 = (int *)param_1[5];
      }
      puVar10 = puVar1;
      if (0 < (int)puVar2 - (int)piVar8) {
        puVar2 = puVar2 + (1 - (int)piVar8);
        do {
          *puVar10 = (char)*piVar8;
          puVar2 = puVar2 + -1;
          puVar10 = puVar10 + 1;
          piVar8 = (int *)((int)piVar8 + 1);
        } while (1 < (int)puVar2);
      }
      if (0 < (int)uVar9) {
        param_3 = param_3 + (1 - (int)param_2);
        do {
          *puVar10 = *param_2;
          param_3 = param_3 + -1;
          puVar10 = puVar10 + 1;
          param_2 = param_2 + 1;
        } while (1 < (int)param_3);
      }
      *puVar10 = 0;
      piVar8 = (int *)param_1[5];
      if ((piVar8 != param_1) && (piVar8 != (int *)0x0)) {
        if ((uint)(*param_1 - (int)piVar8) < 0x81) {
          std::__node_alloc::_M_deallocate(piVar8,*param_1 - (int)piVar8);
        }
        else {
          operator_delete(piVar8);
        }
      }
      param_1[4] = (int)puVar10;
      param_1[5] = (int)puVar1;
      *param_1 = (int)(puVar1 + local_28);
    }
  }
  return param_1;
}



### FUNC FUN_000373cc @ 000373cc

int * FUN_000373cc(int *param_1,undefined1 *param_2,undefined1 *param_3)

{
  undefined1 *puVar1;
  int *piVar2;
  void *pvVar3;
  int *piVar4;
  undefined1 *puVar5;
  undefined1 *puVar6;
  undefined1 *puVar7;
  int *piVar8;
  void *pvVar9;
  undefined1 *local_18;
  
  if (param_2 != param_3) {
    puVar1 = param_3 + -(int)param_2;
    piVar4 = (int *)param_1[5];
    if (piVar4 == param_1) {
      piVar2 = (int *)param_1[4];
      puVar6 = (undefined1 *)((int)param_1 + (0x10 - (int)piVar2));
    }
    else {
      piVar2 = (int *)param_1[4];
      puVar6 = (undefined1 *)(*param_1 - (int)piVar2);
    }
    piVar8 = param_1 + 4;
    if (puVar1 < puVar6) {
      *(undefined1 *)piVar2 = *param_2;
      param_2 = param_2 + 1;
      if (param_2 != param_3) {
        __aeabi_memcpy(*piVar8 + 1,param_2,(int)param_3 - (int)param_2);
      }
      puVar1[*piVar8] = 0;
      *piVar8 = (int)(puVar1 + *piVar8);
    }
    else {
      puVar6 = (undefined1 *)((int)piVar2 - (int)piVar4);
      if ((undefined1 *)(-2 - (int)puVar6) < puVar1) {
                    /* WARNING: Subroutine does not return */
        std::__stl_throw_length_error("basic_string");
      }
      puVar7 = puVar6;
      if (puVar6 <= puVar1) {
        puVar7 = puVar1;
      }
      puVar7 = puVar6 + (int)puVar7;
      puVar5 = (undefined1 *)0xfffffffe;
      if (puVar6 <= puVar7 + 1) {
        puVar5 = puVar7 + 1;
      }
      puVar6 = (undefined1 *)0xfffffffe;
      if (puVar7 != (undefined1 *)0xfffffffe) {
        puVar6 = puVar5;
      }
      puVar7 = (undefined1 *)0x0;
      if (puVar6 == (undefined1 *)0x0) {
        pvVar3 = (void *)0x0;
      }
      else {
        local_18 = puVar6;
        if (puVar6 < (undefined1 *)0x81) {
          pvVar3 = (void *)std::__node_alloc::_M_allocate((uint *)&local_18);
          puVar7 = local_18;
        }
        else {
          pvVar3 = operator_new((uint)puVar6);
          puVar7 = puVar6;
        }
        piVar2 = (int *)param_1[4];
        piVar4 = (int *)param_1[5];
      }
      pvVar9 = pvVar3;
      if (piVar2 != piVar4) {
        __aeabi_memcpy(pvVar3,piVar4,(int)piVar2 - (int)piVar4);
        pvVar9 = (void *)((int)pvVar3 + ((int)piVar2 - (int)piVar4));
      }
      __aeabi_memcpy(pvVar9,param_2);
      *(undefined1 *)((int)pvVar9 + (int)puVar1) = 0;
      piVar4 = (int *)param_1[5];
      if ((piVar4 != param_1) && (piVar4 != (int *)0x0)) {
        if ((uint)(*param_1 - (int)piVar4) < 0x81) {
          std::__node_alloc::_M_deallocate(piVar4,*param_1 - (int)piVar4);
        }
        else {
          operator_delete(piVar4);
        }
      }
      param_1[4] = (int)((int)pvVar9 + (int)puVar1);
      param_1[5] = (int)pvVar3;
      *param_1 = (int)((int)pvVar3 + (int)puVar7);
    }
  }
  return param_1;
}



### FUNC FUN_000374ec @ 000374ec

int FUN_000374ec(int param_1)

{
  if (param_1 != 0) {
    pthread_mutex_lock((pthread_mutex_t *)(param_1 + 8));
    *(int *)(param_1 + 4) = *(int *)(param_1 + 4) + 1;
    pthread_mutex_unlock((pthread_mutex_t *)(param_1 + 8));
  }
  return param_1;
}



### FUNC FUN_00037510 @ 00037510

void FUN_00037510(int *param_1)

{
  int iVar1;
  int iVar2;
  
  iVar2 = *param_1;
  if (iVar2 != 0) {
    pthread_mutex_lock((pthread_mutex_t *)(iVar2 + 8));
    iVar1 = *(int *)(iVar2 + 4) + -1;
    *(int *)(iVar2 + 4) = iVar1;
    pthread_mutex_unlock((pthread_mutex_t *)(iVar2 + 8));
    if (iVar1 == 0) {
      if ((int *)*param_1 != (int *)0x0) {
        (**(code **)(*(int *)*param_1 + 4))();
      }
      *param_1 = 0;
      return;
    }
  }
  return;
}



### FUNC Init @ 00037554

/* std::_Locale_impl::Init::Init() */

Init * __thiscall std::_Locale_impl::Init::Init(Init *this)

{
  uint uVar1;
  int iVar2;
  
  uVar1 = FUN_00057b68(&DAT_00070d48,0,0);
  if (((uVar1 & 1) == 0) && (iVar2 = FUN_0004e3a4(&DAT_00070d48), iVar2 != 0)) {
    DAT_00070d40 = 0;
    pthread_mutex_init((pthread_mutex_t *)&DAT_00070d44,(pthread_mutexattr_t *)0x0);
    __cxa_atexit(0x37847,&DAT_00070d40,&DAT_0006b000);
    FUN_0004e40c(&DAT_00070d48);
  }
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070d44);
  iVar2 = DAT_00070d40;
  DAT_00070d40 = DAT_00070d40 + 1;
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070d44);
  if (iVar2 == 0) {
    DAT_00070d10 = 9;
    DAT_00070d0c = 8;
    DAT_00070d1c = 10;
    DAT_00070d20 = 0xb;
    DAT_00070d2c = 0xc;
    DAT_00070d30 = 0xd;
    DAT_00070d14 = 0x15;
    DAT_00070d18 = 0x16;
    DAT_00070d24 = 0x17;
    DAT_00070d28 = 0x18;
    DAT_00070d34 = 0x19;
    DAT_00070d38 = 0x1a;
    make_classic_locale();
  }
  return this;
}



### FUNC _M_count @ 0003768c

/* std::_Locale_impl::Init::_M_count() const */

undefined4 * std::_Locale_impl::Init::_M_count(void)

{
  uint uVar1;
  int iVar2;
  
  uVar1 = FUN_00057b68(&DAT_00070d48,0,0);
  if (((uVar1 & 1) == 0) && (iVar2 = FUN_0004e3a4(&DAT_00070d48), iVar2 != 0)) {
    DAT_00070d40 = 0;
    pthread_mutex_init((pthread_mutex_t *)&DAT_00070d44,(pthread_mutexattr_t *)0x0);
    __cxa_atexit(0x37847,&DAT_00070d40,&DAT_0006b000);
    FUN_0004e40c(&DAT_00070d48);
  }
  return &DAT_00070d40;
}



### FUNC _S_initialize @ 0003770c

/* std::_Locale_impl::_S_initialize() */

void std::_Locale_impl::_S_initialize(void)

{
  DAT_00070d10 = 9;
  DAT_00070d0c = 8;
  DAT_00070d1c = 10;
  DAT_00070d20 = 0xb;
  DAT_00070d2c = 0xc;
  DAT_00070d30 = 0xd;
  DAT_00070d14 = 0x15;
  DAT_00070d18 = 0x16;
  DAT_00070d24 = 0x17;
  DAT_00070d28 = 0x18;
  DAT_00070d34 = 0x19;
  DAT_00070d38 = 0x1a;
  make_classic_locale();
  return;
}



### FUNC ~Init @ 000377a8

/* std::_Locale_impl::Init::~Init() */

Init * __thiscall std::_Locale_impl::Init::~Init(Init *this)

{
  uint uVar1;
  int iVar2;
  
  uVar1 = FUN_00057b68(&DAT_00070d48,0,0);
  if (((uVar1 & 1) == 0) && (iVar2 = FUN_0004e3a4(&DAT_00070d48), iVar2 != 0)) {
    DAT_00070d40 = 0;
    pthread_mutex_init((pthread_mutex_t *)&DAT_00070d44,(pthread_mutexattr_t *)0x0);
    __cxa_atexit(0x37847,&DAT_00070d40,&DAT_0006b000);
    FUN_0004e40c(&DAT_00070d48);
  }
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070d44);
  DAT_00070d40 = DAT_00070d40 + -1;
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070d44);
  return this;
}



### FUNC _S_uninitialize @ 00037844

/* std::_Locale_impl::_S_uninitialize() */

void std::_Locale_impl::_S_uninitialize(void)

{
  return;
}



### FUNC FUN_00037846 @ 00037846

int FUN_00037846(int param_1)

{
  pthread_mutex_destroy((pthread_mutex_t *)(param_1 + 4));
  return param_1;
}



### FUNC _Locale_impl @ 00037858

/* std::_Locale_impl::_Locale_impl(char const*) */

_Locale_impl * __thiscall std::_Locale_impl::_Locale_impl(_Locale_impl *this,char *param_1)

{
  undefined4 in_r3;
  pthread_mutex_t *__mutex;
  undefined1 auStack_18 [4];
  
  *(undefined4 *)this = 0;
  __mutex = (pthread_mutex_t *)(this + 4);
  pthread_mutex_init(__mutex,(pthread_mutexattr_t *)0x0);
  FUN_00031c38(this + 8,param_1,auStack_18,in_r3,this + 8,__mutex);
  *(undefined4 *)(this + 0x20) = 0;
  *(undefined4 *)(this + 0x24) = 0;
  *(undefined4 *)(this + 0x28) = 0;
  FUN_000378f8(this + 0x20,locale::id::_S_max);
  Init::Init((Init *)&DAT_00070d50);
  return this;
}



### FUNC FUN_000378f8 @ 000378f8

void FUN_000378f8(int *param_1,uint param_2)

{
  void *pvVar1;
  void *pvVar2;
  int iVar3;
  int iVar4;
  int iVar5;
  uint local_1c;
  uint local_18;
  
  iVar5 = *param_1;
  if ((uint)(param_1[2] - iVar5 >> 2) < param_2) {
    if (param_2 >> 0x1e != 0) {
                    /* WARNING: Subroutine does not return */
      std::__stl_throw_length_error("vector");
    }
    iVar4 = param_1[1];
    iVar3 = iVar4 - iVar5;
    if (iVar5 == 0) {
      param_2 = param_2 << 2;
      local_1c = param_2;
      if (param_2 < 0x81) {
        pvVar1 = (void *)std::__node_alloc::_M_allocate(&local_1c);
      }
      else {
        pvVar1 = operator_new(param_2);
        local_1c = param_2;
      }
      param_2 = local_1c >> 2;
    }
    else {
      param_2 = param_2 << 2;
      local_18 = param_2;
      if (param_2 < 0x81) {
        pvVar1 = (void *)std::__node_alloc::_M_allocate(&local_18);
        param_2 = local_18;
      }
      else {
        pvVar1 = operator_new(param_2);
      }
      param_2 = param_2 >> 2;
      if (iVar4 != iVar5) {
        __aeabi_memcpy(pvVar1,iVar5,iVar3);
      }
      pvVar2 = (void *)*param_1;
      if (pvVar2 != (void *)0x0) {
        if ((uint)(param_1[2] - (int)pvVar2) < 0x81) {
          std::__node_alloc::_M_deallocate(pvVar2,param_1[2] - (int)pvVar2);
        }
        else {
          operator_delete(pvVar2);
        }
      }
    }
    *param_1 = (int)pvVar1;
    param_1[1] = (int)((int)pvVar1 + (iVar3 >> 2) * 4);
    param_1[2] = (int)((int)pvVar1 + param_2 * 4);
  }
  return;
}



### FUNC _Locale_impl @ 000379b8

/* std::_Locale_impl::_Locale_impl(std::_Locale_impl const&) */

_Locale_impl * __thiscall std::_Locale_impl::_Locale_impl(_Locale_impl *this,_Locale_impl *param_1)

{
  int *piVar1;
  int iVar2;
  int *piVar3;
  
  *(undefined4 *)this = 0;
  pthread_mutex_init((pthread_mutex_t *)(this + 4),(pthread_mutexattr_t *)0x0);
  FUN_00036f1c(this + 8,param_1 + 8);
  *(undefined4 *)(this + 0x20) = 0;
  *(undefined4 *)(this + 0x24) = 0;
  *(undefined4 *)(this + 0x28) = 0;
  piVar1 = *(int **)(param_1 + 0x24);
  for (piVar3 = *(int **)(param_1 + 0x20); piVar3 != piVar1; piVar3 = piVar3 + 1) {
    iVar2 = *piVar3;
    if (iVar2 != 0) {
      pthread_mutex_lock((pthread_mutex_t *)(iVar2 + 8));
      *(int *)(iVar2 + 4) = *(int *)(iVar2 + 4) + 1;
      pthread_mutex_unlock((pthread_mutex_t *)(iVar2 + 8));
    }
  }
  FUN_00037a88(this + 0x20,param_1 + 0x20);
  Init::Init((Init *)&DAT_00070d50);
  return this;
}



### FUNC FUN_00037a88 @ 00037a88

int * FUN_00037a88(int *param_1,int *param_2)

{
  int iVar1;
  int iVar2;
  void *pvVar3;
  uint uVar4;
  void *pvVar5;
  undefined4 uVar6;
  int iVar7;
  uint uVar8;
  int iVar9;
  int iVar10;
  uint uVar11;
  uint local_18;
  
  if (param_2 != param_1) {
    iVar9 = *param_2;
    iVar1 = param_2[1];
    uVar11 = iVar1 - iVar9;
    uVar8 = (int)uVar11 >> 2;
    iVar2 = *param_1;
    if ((uint)(param_1[2] - iVar2 >> 2) < uVar8) {
      if (uVar8 >> 0x1e != 0) {
        FUN_00030824(4);
        uVar6 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
        FUN_000309e0(uVar6,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
      }
      local_18 = uVar11;
      if (uVar11 < 0x81) {
        pvVar3 = (void *)std::__node_alloc::_M_allocate(&local_18);
        uVar4 = local_18;
      }
      else {
        pvVar3 = operator_new(uVar11);
        uVar4 = uVar11;
      }
      if (iVar1 != iVar9) {
        __aeabi_memcpy(pvVar3,iVar9,uVar11);
      }
      pvVar5 = (void *)*param_1;
      if (pvVar5 != (void *)0x0) {
        if ((uint)(param_1[2] - (int)pvVar5) < 0x81) {
          std::__node_alloc::_M_deallocate(pvVar5,param_1[2] - (int)pvVar5);
        }
        else {
          operator_delete(pvVar5);
        }
      }
      *param_1 = (int)pvVar3;
      param_1[2] = (int)pvVar3 + (uVar4 & 0xfffffffc);
    }
    else {
      iVar7 = param_1[1];
      iVar10 = iVar7 - iVar2;
      if ((uint)(iVar10 >> 2) < uVar8) {
        if (iVar10 != 0) {
          __aeabi_memmove(iVar2,iVar9,iVar10);
          iVar9 = *param_2;
          iVar1 = param_2[1];
          iVar2 = *param_1;
          iVar7 = param_1[1];
        }
        iVar9 = iVar9 + (iVar7 - iVar2);
        if (iVar1 != iVar9) {
          __aeabi_memcpy(iVar7,iVar9,iVar1 - iVar9);
        }
      }
      else if (uVar11 != 0) {
        __aeabi_memmove(iVar2,iVar9,uVar11);
      }
    }
    param_1[1] = *param_1 + uVar8 * 4;
  }
  return param_1;
}



### FUNC _Locale_impl @ 00037b90

/* std::_Locale_impl::_Locale_impl(unsigned int, char const*) */

_Locale_impl * __thiscall
std::_Locale_impl::_Locale_impl(_Locale_impl *this,uint param_1,char *param_2)

{
  _Locale_impl *p_Var1;
  void *pvVar2;
  undefined4 uVar3;
  uint uVar4;
  void *pvVar5;
  uint uVar6;
  pthread_mutex_t *__mutex;
  undefined1 auStack_1c [4];
  uint local_18;
  
  *(undefined4 *)this = 0;
  __mutex = (pthread_mutex_t *)(this + 4);
  pthread_mutex_init(__mutex,(pthread_mutexattr_t *)0x0);
  p_Var1 = this + 8;
  FUN_00031c38(p_Var1,param_2,auStack_1c);
  *(undefined4 *)(this + 0x20) = 0;
  *(undefined4 *)(this + 0x24) = 0;
  *(undefined4 *)(this + 0x28) = 0;
  if (param_1 >> 0x1e == 0) {
    if (param_1 == 0) {
      *(undefined4 *)(this + 0x20) = 0;
      *(undefined4 *)(this + 0x24) = 0;
      *(undefined4 *)(this + 0x28) = 0;
      pvVar5 = (void *)0x0;
    }
    else {
      uVar6 = param_1 * 4;
      local_18 = uVar6;
      if (uVar6 < 0x81) {
        pvVar2 = (void *)__node_alloc::_M_allocate(&local_18);
        uVar4 = local_18;
      }
      else {
        pvVar2 = operator_new(uVar6);
        uVar4 = uVar6;
      }
      *(void **)(this + 0x20) = pvVar2;
      *(void **)(this + 0x24) = pvVar2;
      *(uint *)(this + 0x28) = (int)pvVar2 + (uVar4 & 0xfffffffc);
      pvVar5 = (void *)((int)pvVar2 + uVar6);
      if (0 < (int)uVar6) {
        uVar6 = param_1 ^ 0xffffffff;
        if ((int)(param_1 ^ 0xffffffff) < -1) {
          uVar6 = 0xfffffffe;
        }
        __aeabi_memclr4(pvVar2,(uVar6 + param_1) * 4 + 8,0xfffffffe,param_1,p_Var1,__mutex);
      }
    }
    *(void **)(this + 0x24) = pvVar5;
    Init::Init((Init *)&DAT_00070d50);
    return this;
  }
  FUN_00030824(4);
  uVar3 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(uVar3,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
}



### FUNC ~_Locale_impl @ 00037ca0

/* std::_Locale_impl::~_Locale_impl() */

_Locale_impl * __thiscall std::_Locale_impl::~_Locale_impl(_Locale_impl *this)

{
  int *piVar1;
  _Locale_impl *p_Var2;
  uint uVar3;
  int *piVar4;
  int iVar5;
  int iVar6;
  
  Init::~Init((Init *)&DAT_00070d50);
  piVar1 = *(int **)(this + 0x20);
  piVar4 = *(int **)(this + 0x24);
  if (piVar1 != piVar4) {
    do {
      iVar5 = *piVar1;
      if (iVar5 != 0) {
        pthread_mutex_lock((pthread_mutex_t *)(iVar5 + 8));
        iVar6 = *(int *)(iVar5 + 4) + -1;
        *(int *)(iVar5 + 4) = iVar6;
        pthread_mutex_unlock((pthread_mutex_t *)(iVar5 + 8));
        if (iVar6 == 0) {
          if ((int *)*piVar1 != (int *)0x0) {
            (**(code **)(*(int *)*piVar1 + 4))();
          }
          *piVar1 = 0;
        }
      }
      piVar1 = piVar1 + 1;
    } while (piVar4 != piVar1);
    piVar1 = *(int **)(this + 0x20);
  }
  if (piVar1 != (int *)0x0) {
    if ((uint)(*(int *)(this + 0x28) - (int)piVar1) < 0x81) {
      __node_alloc::_M_deallocate(piVar1,*(int *)(this + 0x28) - (int)piVar1);
    }
    else {
      operator_delete(piVar1);
    }
  }
  p_Var2 = *(_Locale_impl **)(this + 0x1c);
  if ((p_Var2 != this + 8) && (p_Var2 != (_Locale_impl *)0x0)) {
    uVar3 = *(int *)(this + 8) - (int)p_Var2;
    if (uVar3 < 0x81) {
      __node_alloc::_M_deallocate(p_Var2,uVar3);
    }
    else {
      operator_delete(p_Var2);
    }
  }
  pthread_mutex_destroy((pthread_mutex_t *)(this + 4));
  return this;
}



### FUNC make_classic_locale @ 00037dac

/* std::_Locale_impl::make_classic_locale() */

void std::_Locale_impl::make_classic_locale(void)

{
  undefined4 *puVar1;
  ctype<char> *this;
  moneypunct<char,true> *this_00;
  moneypunct<char,false> *this_01;
  messages<char> *this_02;
  moneypunct<wchar_t,true> *this_03;
  moneypunct<wchar_t,false> *this_04;
  messages<wchar_t> *this_05;
  uint uVar2;
  int iVar3;
  undefined4 local_88;
  undefined4 *local_84;
  ctype<char> *local_80;
  undefined4 *local_7c;
  moneypunct<char,true> *local_78;
  moneypunct<char,false> *local_74;
  undefined4 *local_70;
  messages<char> *local_6c;
  undefined4 *local_68;
  undefined4 *local_64;
  undefined4 *local_60;
  undefined4 *local_5c;
  undefined4 *local_58;
  undefined4 *local_54;
  undefined4 *local_50;
  undefined4 *local_4c;
  undefined4 *local_48;
  moneypunct<wchar_t,true> *local_44;
  moneypunct<wchar_t,false> *local_40;
  undefined4 *local_3c;
  messages<wchar_t> *local_38;
  undefined4 *local_34;
  undefined4 *local_30;
  undefined4 *local_2c;
  undefined4 *local_28;
  undefined4 *local_24;
  undefined4 *local_20;
  undefined4 local_1c;
  undefined1 auStack_18 [4];
  
  _Locale_impl((_Locale_impl *)&DAT_00070d80,"C");
  local_88 = 0;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__collate_00069f98;
  local_84 = puVar1;
  this = (ctype<char> *)operator_new(0x14);
  ctype<char>::ctype(this,(mask *)0x0,false,1);
  local_80 = this;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__codecvt_00069ee8;
  local_7c = puVar1;
  this_00 = (moneypunct<char,true> *)operator_new(0x14);
  moneypunct<char,true>::moneypunct(this_00,1);
  local_78 = this_00;
  this_01 = (moneypunct<char,false> *)operator_new(0x14);
  moneypunct<char,false>::moneypunct(this_01,1);
  local_74 = this_01;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__numpunct_0006a208;
  local_70 = puVar1;
  this_02 = (messages<char> *)operator_new(0xc);
  messages<char>::messages(this_02,1);
  local_6c = this_02;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__facet_00069460;
  local_68 = puVar1;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__facet_00069484;
  local_64 = puVar1;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__facet_000694a8;
  local_60 = puVar1;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__facet_000694f0;
  local_5c = puVar1;
  puVar1 = (undefined4 *)operator_new(0x448);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__facet_00069250;
  priv::time_init<char>::time_init();
  *puVar1 = &PTR_FUN_00039a00_1_000692ec;
  local_58 = puVar1;
  puVar1 = (undefined4 *)operator_new(0x448);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__facet_00069250;
  priv::time_init<char>::time_init();
  *puVar1 = &PTR_FUN_0003aac0_1_0006935c;
  local_54 = puVar1;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__collate_00069fc0;
  local_50 = puVar1;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__ctype_0006a018;
  local_4c = puVar1;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__codecvt_00069f48;
  local_48 = puVar1;
  this_03 = (moneypunct<wchar_t,true> *)operator_new(0x14);
  moneypunct<wchar_t,true>::moneypunct(this_03,1);
  local_44 = this_03;
  this_04 = (moneypunct<wchar_t,false> *)operator_new(0x14);
  moneypunct<wchar_t,false>::moneypunct(this_04,1);
  local_40 = this_04;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__numpunct_0006a238;
  local_3c = puVar1;
  this_05 = (messages<wchar_t> *)operator_new(0xc);
  messages<wchar_t>::messages(this_05,1);
  local_38 = this_05;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__facet_0006952c;
  local_34 = puVar1;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__facet_00069550;
  local_30 = puVar1;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__facet_00069574;
  local_2c = puVar1;
  puVar1 = (undefined4 *)operator_new(0xc);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__facet_000695bc;
  local_28 = puVar1;
  puVar1 = (undefined4 *)operator_new(0xbc8);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__facet_00069250;
  priv::time_init<wchar_t>::time_init();
  *puVar1 = &PTR_LAB_0003ac9a_1_000693dc;
  local_24 = puVar1;
  puVar1 = (undefined4 *)operator_new(0xbc8);
  puVar1[1] = 1;
  pthread_mutex_init((pthread_mutex_t *)(puVar1 + 2),(pthread_mutexattr_t *)0x0);
  *puVar1 = &PTR__facet_00069250;
  priv::time_init<wchar_t>::time_init();
  *puVar1 = &PTR_FUN_0003bc38_1_0006944c;
  local_1c = 0;
  local_20 = puVar1;
  FUN_000378f8(&DAT_00070da0,0x1c);
  FUN_0004a040(&DAT_00070da0,&local_88,auStack_18,auStack_18);
  uVar2 = FUN_00057b68(&DAT_00070db4,0,0);
  if (((uVar2 & 1) == 0) && (iVar3 = FUN_0004e3a4(&DAT_00070db4), iVar3 != 0)) {
    locale::locale((locale *)&DAT_00070db0,(_Locale_impl *)&DAT_00070d80);
    __cxa_atexit(locale::~locale,&DAT_00070db0,&DAT_0006b000);
    FUN_0004e40c(&DAT_00070db4);
  }
  DAT_00070d68 = &DAT_00070db0;
  uVar2 = FUN_00057b68(&DAT_00070dbc,0,0);
  if (((uVar2 & 1) == 0) && (iVar3 = FUN_0004e3a4(&DAT_00070dbc), iVar3 != 0)) {
    locale::locale((locale *)&DAT_00070db8,(_Locale_impl *)&DAT_00070d80);
    __cxa_atexit(locale::~locale,&DAT_00070db8,&DAT_0006b000);
    FUN_0004e40c(&DAT_00070dbc);
  }
  DAT_00070d74 = &DAT_00070db8;
  return;
}



### FUNC _M_throw_bad_cast @ 000382c4

/* std::_Locale_impl::_M_throw_bad_cast() */

void std::_Locale_impl::_M_throw_bad_cast(void)

{
  undefined4 uVar1;
  
  FUN_00030824(4);
  uVar1 = FUN_000318b0();
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(uVar1,&PTR_PTR_FUN_00031728_1_00068e38,0x318c9);
}



### FUNC insert @ 000382ec

/* std::_Locale_impl::insert(std::_Locale_impl*, std::locale::id const&) */

void __thiscall std::_Locale_impl::insert(_Locale_impl *this,_Locale_impl *param_1,id *param_2)

{
  uint uVar1;
  
  uVar1 = *(uint *)param_2;
  if ((uVar1 != 0) && (uVar1 < (uint)(*(int *)(param_1 + 0x24) - *(int *)(param_1 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(param_1 + 0x20) + uVar1 * 4),param_2);
  }
  return;
}



### FUNC insert @ 0003830c

/* std::_Locale_impl::insert(std::locale::facet*, std::locale::id const&) */

facet * __thiscall std::_Locale_impl::insert(_Locale_impl *this,facet *param_1,id *param_2)

{
  int iVar1;
  facet *pfVar2;
  uint uVar3;
  int iVar4;
  _Locale_impl *p_Var5;
  int iVar6;
  uint uVar7;
  facet *pfVar8;
  undefined4 local_20;
  undefined1 auStack_1c [4];
  undefined1 auStack_18 [4];
  
  pfVar2 = (facet *)0x0;
  if ((param_1 != (facet *)0x0) && (uVar3 = *(uint *)param_2, uVar3 != 0)) {
    iVar4 = *(int *)(this + 0x20);
    iVar6 = *(int *)(this + 0x24);
    uVar7 = iVar6 - iVar4 >> 2;
    p_Var5 = this + 0x20;
    if (uVar7 <= uVar3) {
      local_20 = 0;
      uVar3 = uVar3 + 1;
      if (uVar3 < uVar7) {
        iVar4 = iVar4 + uVar3 * 4;
        if (iVar4 != iVar6) {
          *(int *)(this + 0x24) = iVar4;
        }
      }
      else {
        uVar3 = uVar3 - uVar7;
        if (uVar3 != 0) {
          if ((uint)(*(int *)(this + 0x28) - iVar6 >> 2) < uVar3) {
            FUN_000398e0(p_Var5,iVar6,&local_20,auStack_1c,uVar3,0);
          }
          else {
            FUN_000397e8(p_Var5,iVar6,uVar3,&local_20,auStack_18);
          }
        }
      }
      iVar4 = *(int *)p_Var5;
      uVar3 = *(uint *)param_2;
    }
    iVar6 = uVar3 * 4;
    pfVar8 = *(facet **)(iVar4 + iVar6);
    pfVar2 = param_1;
    if (pfVar8 != param_1) {
      if (pfVar8 != (facet *)0x0) {
        pthread_mutex_lock((pthread_mutex_t *)(pfVar8 + 8));
        iVar1 = *(int *)(pfVar8 + 4);
        *(int *)(pfVar8 + 4) = iVar1 + -1;
        pthread_mutex_unlock((pthread_mutex_t *)(pfVar8 + 8));
        if (iVar1 + -1 == 0) {
          if (*(int **)(iVar4 + iVar6) != (int *)0x0) {
            (**(code **)(**(int **)(iVar4 + iVar6) + 4))();
          }
          *(undefined4 *)(iVar4 + iVar6) = 0;
        }
      }
      pthread_mutex_lock((pthread_mutex_t *)(param_1 + 8));
      *(int *)(param_1 + 4) = *(int *)(param_1 + 4) + 1;
      pthread_mutex_unlock((pthread_mutex_t *)(param_1 + 8));
      *(facet **)(*(int *)p_Var5 + *(int *)param_2 * 4) = param_1;
    }
  }
  return pfVar2;
}



### FUNC insert_ctype_facets @ 000383f8

/* std::_Locale_impl::insert_ctype_facets(char const*&, char*, _Locale_name_hint*) */

_Locale_name_hint * __thiscall
std::_Locale_impl::insert_ctype_facets
          (_Locale_impl *this,char **param_1,char *param_2,_Locale_name_hint *param_3)

{
  char *pcVar1;
  ctype<char> *this_00;
  codecvt_byname<char,char,mbstate_t> *this_01;
  facet *pfVar2;
  int *piVar3;
  undefined4 uVar4;
  facet *pfVar5;
  int iVar6;
  _Locale_name_hint *local_20;
  int local_18;
  
  pcVar1 = *param_1;
  if (*pcVar1 == '\0') {
    pcVar1 = (char *)FUN_0004d960(param_2);
    *param_1 = pcVar1;
  }
  if (((pcVar1 == (char *)0x0) || (*pcVar1 == '\0')) || ((*pcVar1 == 'C' && (pcVar1[1] == '\0')))) {
    piVar3 = (int *)locale::classic();
    iVar6 = *piVar3;
    if ((ctype<char>::id != 0) &&
       (ctype<char>::id < (uint)(*(int *)(iVar6 + 0x24) - *(int *)(iVar6 + 0x20) >> 2))) {
      insert(this,*(facet **)(*(int *)(iVar6 + 0x20) + ctype<char>::id * 4),(id *)&ctype<char>::id);
    }
    if ((codecvt<char,char,mbstate_t>::id != 0) &&
       (codecvt<char,char,mbstate_t>::id <
        (uint)(*(int *)(iVar6 + 0x24) - *(int *)(iVar6 + 0x20) >> 2))) {
      insert(this,*(facet **)(*(int *)(iVar6 + 0x20) + codecvt<char,char,mbstate_t>::id * 4),
             (id *)&codecvt<char,char,mbstate_t>::id);
    }
    if ((ctype<wchar_t>::id != 0) &&
       (ctype<wchar_t>::id < (uint)(*(int *)(iVar6 + 0x24) - *(int *)(iVar6 + 0x20) >> 2))) {
      insert(this,*(facet **)(*(int *)(iVar6 + 0x20) + ctype<wchar_t>::id * 4),
             (id *)&ctype<wchar_t>::id);
    }
    if ((codecvt<wchar_t,char,mbstate_t>::id != 0) &&
       (codecvt<wchar_t,char,mbstate_t>::id <
        (uint)(*(int *)(iVar6 + 0x24) - *(int *)(iVar6 + 0x20) >> 2))) {
      insert(this,*(facet **)(*(int *)(iVar6 + 0x20) + codecvt<wchar_t,char,mbstate_t>::id * 4),
             (id *)&codecvt<wchar_t,char,mbstate_t>::id);
    }
    return param_3;
  }
  iVar6 = FUN_0004a144(param_1,param_2,param_3,&local_18);
  if (iVar6 == 0) {
    locale::_M_throw_on_creation_failure(local_18,*param_1,"ctype");
    pfVar5 = (facet *)param_2;
  }
  else {
    local_20 = param_3;
    if (param_3 == (_Locale_name_hint *)0x0) {
      local_20 = (_Locale_name_hint *)FUN_0004da98(iVar6);
    }
    this_00 = (ctype<char> *)operator_new(0x418);
    ctype<char>::ctype(this_00,(mask *)0x0,false,0);
    *(undefined ***)this_00 = &PTR__ctype_byname_000695f8;
    *(int *)(this_00 + 0x414) = iVar6;
    ctype_byname<char>::_M_init((ctype_byname<char> *)this_00);
    this_01 = (codecvt_byname<char,char,mbstate_t> *)operator_new(0xc);
    pfVar5 = (facet *)0x0;
    codecvt_byname<char,char,mbstate_t>::codecvt_byname(this_01,*param_1,0);
    iVar6 = FUN_0004a144(param_1,param_2,local_20,&local_18);
    param_3 = local_20;
    if (iVar6 != 0) {
      pfVar2 = (facet *)operator_new(0x10);
      *(undefined4 *)(pfVar2 + 4) = 0;
      pthread_mutex_init((pthread_mutex_t *)(pfVar2 + 8),(pthread_mutexattr_t *)0x0);
      *(int *)(pfVar2 + 0xc) = iVar6;
      *(undefined ***)pfVar2 = &PTR__ctype_byname_00069628;
      iVar6 = FUN_0004a334(param_1,param_2,local_20,&local_18);
      if (iVar6 != 0) {
        pfVar5 = (facet *)operator_new(0x10);
        *(undefined4 *)(pfVar5 + 4) = 0;
        pthread_mutex_init((pthread_mutex_t *)(pfVar5 + 8),(pthread_mutexattr_t *)0x0);
        *(int *)(pfVar5 + 0xc) = iVar6;
        *(undefined ***)pfVar5 = &PTR__codecvt_byname_000696cc;
      }
      insert(this,(facet *)this_00,(id *)&ctype<char>::id);
      insert(this,(facet *)this_01,(id *)&codecvt<char,char,mbstate_t>::id);
      insert(this,pfVar2,(id *)&ctype<wchar_t>::id);
      if (pfVar5 == (facet *)0x0) {
        return local_20;
      }
      insert(this,pfVar5,(id *)&codecvt<wchar_t,char,mbstate_t>::id);
      return local_20;
    }
  }
  uVar4 = locale::_M_throw_on_creation_failure(local_18,*param_1,"ctype");
  operator_delete(pfVar5);
  FUN_000308d8(uVar4);
  FUN_0004a590(param_1);
  (**(code **)(*(int *)param_3 + 4))(param_3);
  uVar4 = FUN_00030a44();
  FUN_0003094c();
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar4);
}



### FUNC insert_numeric_facets @ 00038730

/* std::_Locale_impl::insert_numeric_facets(char const*&, char*, _Locale_name_hint*) */

_Locale_name_hint * __thiscall
std::_Locale_impl::insert_numeric_facets
          (_Locale_impl *this,char **param_1,char *param_2,_Locale_name_hint *param_3)

{
  char *pcVar1;
  int *piVar2;
  facet *pfVar3;
  facet *pfVar4;
  undefined4 uVar5;
  int iVar6;
  char *local_20;
  int local_18;
  
  if (**param_1 == '\0') {
    pcVar1 = (char *)FUN_0004d968(param_2);
    *param_1 = pcVar1;
  }
  piVar2 = (int *)locale::classic();
  iVar6 = *piVar2;
  if ((DAT_00070d20 != 0) &&
     (DAT_00070d20 < (uint)(*(int *)(iVar6 + 0x24) - *(int *)(iVar6 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(iVar6 + 0x20) + DAT_00070d20 * 4),(id *)&DAT_00070d20);
  }
  if ((DAT_00070d1c != 0) &&
     (DAT_00070d1c < (uint)(*(int *)(iVar6 + 0x24) - *(int *)(iVar6 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(iVar6 + 0x20) + DAT_00070d1c * 4),(id *)&DAT_00070d1c);
  }
  if ((DAT_00070d24 != 0) &&
     (DAT_00070d24 < (uint)(*(int *)(iVar6 + 0x24) - *(int *)(iVar6 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(iVar6 + 0x20) + DAT_00070d24 * 4),(id *)&DAT_00070d24);
  }
  if ((DAT_00070d28 != 0) &&
     (DAT_00070d28 < (uint)(*(int *)(iVar6 + 0x24) - *(int *)(iVar6 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(iVar6 + 0x20) + DAT_00070d28 * 4),(id *)&DAT_00070d28);
  }
  pcVar1 = *param_1;
  if (((pcVar1 != (char *)0x0) && (*pcVar1 != '\0')) && ((*pcVar1 != 'C' || (pcVar1[1] != '\0')))) {
    pfVar3 = (facet *)FUN_0004a37c(param_1,param_2,param_3,&local_18);
    pfVar4 = pfVar3;
    local_20 = param_2;
    if (pfVar3 != (facet *)0x0) {
      if (param_3 == (_Locale_name_hint *)0x0) {
        param_3 = (_Locale_name_hint *)FUN_0004da9c(pfVar3);
      }
      pfVar4 = (facet *)operator_new(0x10);
      *(undefined4 *)(pfVar4 + 4) = 0;
      pthread_mutex_init((pthread_mutex_t *)(pfVar4 + 8),(pthread_mutexattr_t *)0x0);
      *(facet **)(pfVar4 + 0xc) = pfVar3;
      *(undefined ***)pfVar4 = &PTR__numpunct_byname_000696f8;
      iVar6 = FUN_0004a37c(param_1,param_2,param_3,&local_18);
      if (iVar6 != 0) {
        pfVar3 = (facet *)operator_new(0x10);
        *(undefined4 *)(pfVar3 + 4) = 0;
        pthread_mutex_init((pthread_mutex_t *)(pfVar3 + 8),(pthread_mutexattr_t *)0x0);
        *(int *)(pfVar3 + 0xc) = iVar6;
        *(undefined ***)pfVar3 = &PTR__numpunct_byname_0006971c;
        insert(this,pfVar4,(id *)&numpunct<char>::id);
        insert(this,pfVar3,(id *)&numpunct<wchar_t>::id);
        return param_3;
      }
      (**(code **)(*(int *)pfVar4 + 4))(pfVar4);
      local_20 = (char *)0x0;
    }
    uVar5 = locale::_M_throw_on_creation_failure(local_18,*param_1,"numpunct");
    operator_delete(param_1);
    FUN_000308d8(uVar5);
    FUN_0004a614(local_20);
    (**(code **)(*(int *)pfVar4 + 4))(pfVar4);
    uVar5 = FUN_00030a44();
    FUN_0003094c();
                    /* WARNING: Subroutine does not return */
    ___Unwind_Resume(uVar5);
  }
  if ((numpunct<char>::id != 0) &&
     (numpunct<char>::id < (uint)(*(int *)(iVar6 + 0x24) - *(int *)(iVar6 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(iVar6 + 0x20) + numpunct<char>::id * 4),
           (id *)&numpunct<char>::id);
  }
  if ((numpunct<wchar_t>::id != 0) &&
     (numpunct<wchar_t>::id < (uint)(*(int *)(iVar6 + 0x24) - *(int *)(iVar6 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(iVar6 + 0x20) + numpunct<wchar_t>::id * 4),
           (id *)&numpunct<wchar_t>::id);
  }
  return param_3;
}



### FUNC insert_time_facets @ 000389a8

/* std::_Locale_impl::insert_time_facets(char const*&, char*, _Locale_name_hint*) */

_Locale_name_hint * __thiscall
std::_Locale_impl::insert_time_facets
          (_Locale_impl *this,char **param_1,char *param_2,_Locale_name_hint *param_3)

{
  char *pcVar1;
  _Locale_time *p_Var2;
  facet *pfVar3;
  facet *pfVar4;
  facet *pfVar5;
  facet *pfVar6;
  int *piVar7;
  undefined4 uVar8;
  int iVar9;
  int local_18;
  
  pcVar1 = *param_1;
  if (*pcVar1 == '\0') {
    pcVar1 = (char *)FUN_0004d970(param_2);
    *param_1 = pcVar1;
  }
  if (((pcVar1 == (char *)0x0) || (*pcVar1 == '\0')) || ((*pcVar1 == 'C' && (pcVar1[1] == '\0')))) {
    piVar7 = (int *)locale::classic();
    iVar9 = *piVar7;
    if ((DAT_00070d2c != 0) &&
       (DAT_00070d2c < (uint)(*(int *)(iVar9 + 0x24) - *(int *)(iVar9 + 0x20) >> 2))) {
      insert(this,*(facet **)(*(int *)(iVar9 + 0x20) + DAT_00070d2c * 4),(id *)&DAT_00070d2c);
    }
    if ((DAT_00070d30 != 0) &&
       (DAT_00070d30 < (uint)(*(int *)(iVar9 + 0x24) - *(int *)(iVar9 + 0x20) >> 2))) {
      insert(this,*(facet **)(*(int *)(iVar9 + 0x20) + DAT_00070d30 * 4),(id *)&DAT_00070d30);
    }
    if ((DAT_00070d34 != 0) &&
       (DAT_00070d34 < (uint)(*(int *)(iVar9 + 0x24) - *(int *)(iVar9 + 0x20) >> 2))) {
      insert(this,*(facet **)(*(int *)(iVar9 + 0x20) + DAT_00070d34 * 4),(id *)&DAT_00070d34);
    }
    if ((DAT_00070d38 != 0) &&
       (DAT_00070d38 < (uint)(*(int *)(iVar9 + 0x24) - *(int *)(iVar9 + 0x20) >> 2))) {
      insert(this,*(facet **)(*(int *)(iVar9 + 0x20) + DAT_00070d38 * 4),(id *)&DAT_00070d38);
    }
  }
  else {
    p_Var2 = (_Locale_time *)FUN_0004a3cc(param_1,param_2,param_3,&local_18);
    if (p_Var2 == (_Locale_time *)0x0) {
      if (local_18 == 4) {
        FUN_00030824(4);
        uVar8 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
        FUN_000309e0(uVar8,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
      }
    }
    else {
      if (param_3 == (_Locale_name_hint *)0x0) {
        param_3 = (_Locale_name_hint *)FUN_0004daa0(p_Var2);
      }
      pfVar3 = (facet *)operator_new(0x448);
      *(undefined4 *)(pfVar3 + 4) = 0;
      pthread_mutex_init((pthread_mutex_t *)(pfVar3 + 8),(pthread_mutexattr_t *)0x0);
      *(undefined ***)pfVar3 = &PTR__facet_00069250;
      priv::time_init<char>::time_init((time_init<char> *)(pfVar3 + 0xc),p_Var2);
      *(undefined ***)pfVar3 = &PTR_FUN_00039a00_1_00069280;
      pfVar4 = (facet *)operator_new(0x448);
      *(undefined4 *)(pfVar4 + 4) = 0;
      pthread_mutex_init((pthread_mutex_t *)(pfVar4 + 8),(pthread_mutexattr_t *)0x0);
      *(undefined ***)pfVar4 = &PTR__facet_00069250;
      priv::time_init<char>::time_init((time_init<char> *)(pfVar4 + 0xc),p_Var2);
      *(undefined ***)pfVar4 = &PTR_FUN_0003aac0_1_00069314;
      pfVar5 = (facet *)operator_new(0xbc8);
      *(undefined4 *)(pfVar5 + 4) = 0;
      pthread_mutex_init((pthread_mutex_t *)(pfVar5 + 8),(pthread_mutexattr_t *)0x0);
      *(undefined ***)pfVar5 = &PTR__facet_00069250;
      priv::time_init<wchar_t>::time_init((time_init<wchar_t> *)(pfVar5 + 0xc),p_Var2);
      *(undefined ***)pfVar5 = &PTR_LAB_0003ac9a_1_00069370;
      pfVar6 = (facet *)operator_new(0xbc8);
      *(undefined4 *)(pfVar6 + 4) = 0;
      pthread_mutex_init((pthread_mutex_t *)(pfVar6 + 8),(pthread_mutexattr_t *)0x0);
      *(undefined ***)pfVar6 = &PTR__facet_00069250;
      priv::time_init<wchar_t>::time_init((time_init<wchar_t> *)(pfVar6 + 0xc),p_Var2);
      *(undefined ***)pfVar6 = &PTR_FUN_0003bc38_1_00069404;
      FUN_0004a698(p_Var2);
      insert(this,pfVar3,(id *)&DAT_00070d2c);
      insert(this,pfVar4,(id *)&DAT_00070d30);
      insert(this,pfVar5,(id *)&DAT_00070d34);
      insert(this,pfVar6,(id *)&DAT_00070d38);
    }
  }
  return param_3;
}



### FUNC insert_collate_facets @ 00038d24

/* std::_Locale_impl::insert_collate_facets(char const*&, char*, _Locale_name_hint*) */

_Locale_name_hint * __thiscall
std::_Locale_impl::insert_collate_facets
          (_Locale_impl *this,char **param_1,char *param_2,_Locale_name_hint *param_3)

{
  char *pcVar1;
  facet *pfVar2;
  facet *pfVar3;
  int *piVar4;
  undefined4 uVar5;
  id *piVar6;
  int iVar7;
  int local_18;
  
  pcVar1 = *param_1;
  if (*pcVar1 == '\0') {
    pcVar1 = (char *)FUN_0004d978(param_2);
    *param_1 = pcVar1;
  }
  if (((pcVar1 == (char *)0x0) || (*pcVar1 == '\0')) || ((*pcVar1 == 'C' && (pcVar1[1] == '\0')))) {
    piVar4 = (int *)locale::classic();
    iVar7 = *piVar4;
    if ((collate<char>::id != 0) &&
       (collate<char>::id < (uint)(*(int *)(iVar7 + 0x24) - *(int *)(iVar7 + 0x20) >> 2))) {
      insert(this,*(facet **)(*(int *)(iVar7 + 0x20) + collate<char>::id * 4),
             (id *)&collate<char>::id);
    }
    if ((collate<wchar_t>::id != 0) &&
       (collate<wchar_t>::id < (uint)(*(int *)(iVar7 + 0x24) - *(int *)(iVar7 + 0x20) >> 2))) {
      insert(this,*(facet **)(*(int *)(iVar7 + 0x20) + collate<wchar_t>::id * 4),
             (id *)&collate<wchar_t>::id);
    }
  }
  else {
    iVar7 = FUN_0004a41c(param_1,param_2,param_3,&local_18);
    if (iVar7 == 0) {
      if (local_18 == 4) {
        FUN_00030824(4);
        uVar5 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
        FUN_000309e0(uVar5,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
      }
    }
    else {
      if (param_3 == (_Locale_name_hint *)0x0) {
        param_3 = (_Locale_name_hint *)FUN_0004daa4(iVar7);
      }
      pfVar2 = (facet *)operator_new(0x10);
      *(undefined4 *)(pfVar2 + 4) = 0;
      pthread_mutex_init((pthread_mutex_t *)(pfVar2 + 8),(pthread_mutexattr_t *)0x0);
      *(int *)(pfVar2 + 0xc) = iVar7;
      *(undefined ***)pfVar2 = &PTR__collate_byname_00069668;
      iVar7 = FUN_0004a41c(param_1,param_2,param_3,&local_18);
      if ((iVar7 == 0) && (local_18 == 4)) {
        (**(code **)(*(int *)pfVar2 + 4))();
        FUN_00030824(4);
        uVar5 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
        FUN_000309e0(uVar5,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
      }
      if (iVar7 == 0) {
        piVar6 = (id *)&collate<char>::id;
      }
      else {
        pfVar3 = (facet *)operator_new(0x10);
        *(undefined4 *)(pfVar3 + 4) = 0;
        pthread_mutex_init((pthread_mutex_t *)(pfVar3 + 8),(pthread_mutexattr_t *)0x0);
        *(int *)(pfVar3 + 0xc) = iVar7;
        *(undefined ***)pfVar3 = &PTR__collate_byname_00069684;
        insert(this,pfVar2,(id *)&collate<char>::id);
        piVar6 = (id *)&collate<wchar_t>::id;
        pfVar2 = pfVar3;
      }
      insert(this,pfVar2,piVar6);
    }
  }
  return param_3;
}



### FUNC insert_monetary_facets @ 00038f3c

/* std::_Locale_impl::insert_monetary_facets(char const*&, char*, _Locale_name_hint*) */

_Locale_name_hint * __thiscall
std::_Locale_impl::insert_monetary_facets
          (_Locale_impl *this,char **param_1,char *param_2,_Locale_name_hint *param_3)

{
  char *pcVar1;
  int *piVar2;
  _Locale_monetary *p_Var3;
  moneypunct_byname<char,false> *this_00;
  moneypunct_byname<char,true> *this_01;
  undefined4 uVar4;
  moneypunct_byname<wchar_t,false> *this_02;
  int iVar5;
  facet *local_20;
  _Locale_name_hint *local_1c;
  int local_18;
  
  if (**param_1 == '\0') {
    pcVar1 = (char *)FUN_0004d980(param_2);
    *param_1 = pcVar1;
  }
  piVar2 = (int *)locale::classic();
  iVar5 = *piVar2;
  if ((DAT_00070d0c != 0) &&
     (DAT_00070d0c < (uint)(*(int *)(iVar5 + 0x24) - *(int *)(iVar5 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(iVar5 + 0x20) + DAT_00070d0c * 4),(id *)&DAT_00070d0c);
  }
  if ((DAT_00070d10 != 0) &&
     (DAT_00070d10 < (uint)(*(int *)(iVar5 + 0x24) - *(int *)(iVar5 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(iVar5 + 0x20) + DAT_00070d10 * 4),(id *)&DAT_00070d10);
  }
  if ((DAT_00070d14 != 0) &&
     (DAT_00070d14 < (uint)(*(int *)(iVar5 + 0x24) - *(int *)(iVar5 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(iVar5 + 0x20) + DAT_00070d14 * 4),(id *)&DAT_00070d14);
  }
  if ((DAT_00070d18 != 0) &&
     (DAT_00070d18 < (uint)(*(int *)(iVar5 + 0x24) - *(int *)(iVar5 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(iVar5 + 0x20) + DAT_00070d18 * 4),(id *)&DAT_00070d18);
  }
  pcVar1 = *param_1;
  if (((pcVar1 != (char *)0x0) && (*pcVar1 != '\0')) && ((*pcVar1 != 'C' || (pcVar1[1] != '\0')))) {
    p_Var3 = (_Locale_monetary *)FUN_0004a46c(param_1,param_2,param_3,&local_18);
    if (p_Var3 == (_Locale_monetary *)0x0) {
      if (local_18 == 4) {
        FUN_00030824(4);
        uVar4 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
        FUN_000309e0(uVar4,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
      }
    }
    else {
      local_1c = param_3;
      if (param_3 == (_Locale_name_hint *)0x0) {
        local_1c = (_Locale_name_hint *)FUN_0004daa8(p_Var3);
      }
      this_00 = (moneypunct_byname<char,false> *)operator_new(0x18);
      moneypunct_byname<char,false>::moneypunct_byname(this_00,p_Var3);
      p_Var3 = (_Locale_monetary *)FUN_0004a46c(param_1,param_2,local_1c,&local_18);
      param_3 = local_1c;
      if (p_Var3 == (_Locale_monetary *)0x0) {
        (**(code **)(*(int *)this_00 + 4))(this_00);
        if (local_18 == 4) {
          FUN_00030824(4);
          uVar4 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
          FUN_000309e0(uVar4,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
        }
      }
      else {
        this_01 = (moneypunct_byname<char,true> *)operator_new(0x18);
        moneypunct_byname<char,true>::moneypunct_byname(this_01,p_Var3);
        p_Var3 = (_Locale_monetary *)FUN_0004a46c(param_1,param_2,local_1c,&local_18);
        if ((p_Var3 == (_Locale_monetary *)0x0) && (local_18 == 4)) {
          FUN_00030824(4);
          uVar4 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
          FUN_000309e0(uVar4,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
        }
        if (p_Var3 == (_Locale_monetary *)0x0) {
          local_20 = (facet *)0x0;
          this_02 = (moneypunct_byname<wchar_t,false> *)0x0;
        }
        else {
          this_02 = (moneypunct_byname<wchar_t,false> *)operator_new(0x18);
          moneypunct_byname<wchar_t,false>::moneypunct_byname(this_02,p_Var3);
          p_Var3 = (_Locale_monetary *)FUN_0004a46c(param_1,param_2,local_1c,&local_18);
          if (p_Var3 == (_Locale_monetary *)0x0) {
            (**(code **)(*(int *)this_02 + 4))();
            this_02 = (moneypunct_byname<wchar_t,false> *)0x0;
            local_20 = (facet *)0x0;
            if (local_18 == 4) {
              FUN_00030824(4);
              uVar4 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
              FUN_000309e0(uVar4,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
            }
          }
          else {
            local_20 = (facet *)operator_new(0x18);
            moneypunct_byname<wchar_t,true>::moneypunct_byname
                      ((moneypunct_byname<wchar_t,true> *)local_20,p_Var3);
          }
        }
        insert(this,(facet *)this_00,(id *)&moneypunct<char,false>::id);
        insert(this,(facet *)this_01,(id *)&moneypunct<char,true>::id);
        if (this_02 != (moneypunct_byname<wchar_t,false> *)0x0) {
          insert(this,(facet *)this_02,(id *)&moneypunct<wchar_t,false>::id);
        }
        if (local_20 != (facet *)0x0) {
          insert(this,local_20,(id *)&moneypunct<wchar_t,true>::id);
        }
      }
    }
    return param_3;
  }
  if ((moneypunct<char,false>::id != 0) &&
     (moneypunct<char,false>::id < (uint)(*(int *)(iVar5 + 0x24) - *(int *)(iVar5 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(iVar5 + 0x20) + moneypunct<char,false>::id * 4),
           (id *)&moneypunct<char,false>::id);
  }
  if ((moneypunct<char,true>::id != 0) &&
     (moneypunct<char,true>::id < (uint)(*(int *)(iVar5 + 0x24) - *(int *)(iVar5 + 0x20) >> 2))) {
    insert(this,*(facet **)(*(int *)(iVar5 + 0x20) + moneypunct<char,true>::id * 4),
           (id *)&moneypunct<char,true>::id);
  }
  if ((moneypunct<wchar_t,false>::id != 0) &&
     (moneypunct<wchar_t,false>::id < (uint)(*(int *)(iVar5 + 0x24) - *(int *)(iVar5 + 0x20) >> 2)))
  {
    insert(this,*(facet **)(*(int *)(iVar5 + 0x20) + moneypunct<wchar_t,false>::id * 4),
           (id *)&moneypunct<wchar_t,false>::id);
  }
  if ((moneypunct<wchar_t,true>::id != 0) &&
     (moneypunct<wchar_t,true>::id < (uint)(*(int *)(iVar5 + 0x24) - *(int *)(iVar5 + 0x20) >> 2)))
  {
    insert(this,*(facet **)(*(int *)(iVar5 + 0x20) + moneypunct<wchar_t,true>::id * 4),
           (id *)&moneypunct<wchar_t,true>::id);
  }
  return param_3;
}



### FUNC insert_messages_facets @ 0003938c

/* std::_Locale_impl::insert_messages_facets(char const*&, char*, _Locale_name_hint*) */

_Locale_name_hint * __thiscall
std::_Locale_impl::insert_messages_facets
          (_Locale_impl *this,char **param_1,char *param_2,_Locale_name_hint *param_3)

{
  char *pcVar1;
  _Locale_messages *p_Var2;
  messages_byname<wchar_t> *this_00;
  messages_byname<wchar_t> *this_01;
  int *piVar3;
  undefined4 uVar4;
  id *piVar5;
  int iVar6;
  int local_18;
  
  pcVar1 = *param_1;
  if (*pcVar1 == '\0') {
    pcVar1 = (char *)FUN_0004d988(param_2);
    *param_1 = pcVar1;
  }
  if (((pcVar1 == (char *)0x0) || (*pcVar1 == '\0')) || ((*pcVar1 == 'C' && (pcVar1[1] == '\0')))) {
    piVar3 = (int *)locale::classic();
    iVar6 = *piVar3;
    if ((messages<char>::id != 0) &&
       (messages<char>::id < (uint)(*(int *)(iVar6 + 0x24) - *(int *)(iVar6 + 0x20) >> 2))) {
      insert(this,*(facet **)(*(int *)(iVar6 + 0x20) + messages<char>::id * 4),
             (id *)&messages<char>::id);
    }
    if (messages<wchar_t>::id == 0) {
      return param_3;
    }
    if ((uint)(*(int *)(iVar6 + 0x24) - *(int *)(iVar6 + 0x20) >> 2) <= messages<wchar_t>::id) {
      return param_3;
    }
    this_00 = *(messages_byname<wchar_t> **)(*(int *)(iVar6 + 0x20) + messages<wchar_t>::id * 4);
    piVar5 = (id *)&messages<wchar_t>::id;
  }
  else {
    p_Var2 = (_Locale_messages *)FUN_0004a4bc(param_1,param_2,param_3,&local_18);
    if (p_Var2 == (_Locale_messages *)0x0) {
      if (local_18 != 4) {
        return param_3;
      }
      FUN_00030824(4);
      uVar4 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
      FUN_000309e0(uVar4,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
    }
    this_00 = (messages_byname<wchar_t> *)operator_new(0x10);
    messages_byname<char>::messages_byname((messages_byname<char> *)this_00,p_Var2);
    p_Var2 = (_Locale_messages *)FUN_0004a4bc(param_1,param_2,param_3,&local_18);
    if ((p_Var2 == (_Locale_messages *)0x0) && (local_18 == 4)) {
      FUN_00030824(4);
      uVar4 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
      FUN_000309e0(uVar4,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
    }
    if (p_Var2 == (_Locale_messages *)0x0) {
      piVar5 = (id *)&messages<char>::id;
    }
    else {
      this_01 = (messages_byname<wchar_t> *)operator_new(0x10);
      messages_byname<wchar_t>::messages_byname(this_01,p_Var2);
      insert(this,(facet *)this_00,(id *)&messages<char>::id);
      piVar5 = (id *)&messages<wchar_t>::id;
      this_00 = this_01;
    }
  }
  insert(this,(facet *)this_00,piVar5);
  return param_3;
}



### FUNC FUN_0003956c @ 0003956c

undefined4 FUN_0003956c(void)

{
  uint uVar1;
  int iVar2;
  
  uVar1 = FUN_00057b68(&DAT_00070d64,0,0);
  if (((uVar1 & 1) == 0) && (iVar2 = FUN_0004e3a4(&DAT_00070d64), iVar2 != 0)) {
    std::_Locale_impl::Init::Init((Init *)&DAT_00070d60);
    __cxa_atexit(std::_Locale_impl::Init::~Init,&DAT_00070d60,&DAT_0006b000);
    FUN_0004e40c(&DAT_00070d64);
  }
  return DAT_00070d68;
}



### FUNC FUN_000395ec @ 000395ec

undefined4 FUN_000395ec(void)

{
  uint uVar1;
  int iVar2;
  
  uVar1 = FUN_00057b68(&DAT_00070d70,0,0);
  if (((uVar1 & 1) == 0) && (iVar2 = FUN_0004e3a4(&DAT_00070d70), iVar2 != 0)) {
    std::_Locale_impl::Init::Init((Init *)&DAT_00070d6c);
    __cxa_atexit(std::_Locale_impl::Init::~Init,&DAT_00070d6c,&DAT_0006b000);
    FUN_0004e40c(&DAT_00070d70);
  }
  return DAT_00070d74;
}



### FUNC _get_Locale_impl @ 0003966c

/* WARNING: Unknown calling convention -- yet parameter storage is locked */
/* std::_get_Locale_impl(std::_Locale_impl*) */

_Locale_impl * std::_get_Locale_impl(_Locale_impl *param_1)

{
  pthread_mutex_lock((pthread_mutex_t *)(param_1 + 4));
  *(int *)param_1 = *(int *)param_1 + 1;
  pthread_mutex_unlock((pthread_mutex_t *)(param_1 + 4));
  return param_1;
}



### FUNC FUN_0003968c @ 0003968c

void FUN_0003968c(undefined4 *param_1)

{
  int iVar1;
  _Locale_impl *this;
  int *piVar2;
  
  piVar2 = (int *)*param_1;
  pthread_mutex_lock((pthread_mutex_t *)(piVar2 + 1));
  iVar1 = *piVar2;
  *piVar2 = iVar1 + -1;
  pthread_mutex_unlock((pthread_mutex_t *)(piVar2 + 1));
  if (iVar1 + -1 != 0) {
    return;
  }
  this = (_Locale_impl *)*param_1;
  if ((_Locale_impl *)*DAT_00070d68 == this) {
    std::_Locale_impl::~_Locale_impl(this);
  }
  else if (this != (_Locale_impl *)0x0) {
    std::_Locale_impl::~_Locale_impl(this);
    operator_delete(this);
  }
  *param_1 = 0;
  return;
}



### FUNC _copy_Nameless_Locale_impl @ 000396f8

/* WARNING: Unknown calling convention -- yet parameter storage is locked */
/* std::_copy_Nameless_Locale_impl(std::_Locale_impl*) */

_Locale_impl * std::_copy_Nameless_Locale_impl(_Locale_impl *param_1)

{
  _Locale_impl *this;
  undefined1 *puVar1;
  undefined1 *puVar2;
  
  this = (_Locale_impl *)operator_new(0x2c);
  _Locale_impl::_Locale_impl(this,param_1);
  if (*(undefined1 **)(this + 0x18) == *(undefined1 **)(this + 0x1c)) {
    FUN_00037294(this + 8,&DAT_00064ee3,&DAT_00064ee4);
  }
  else {
    **(undefined1 **)(this + 0x1c) = 0x2a;
    puVar1 = *(undefined1 **)(this + 0x18);
    puVar2 = (undefined1 *)(*(int *)(this + 0x1c) + 1);
    if (puVar2 != puVar1) {
      *puVar2 = *puVar1;
      *(undefined1 **)(this + 0x18) = puVar2 + (*(int *)(this + 0x18) - (int)puVar1);
      return this;
    }
  }
  return this;
}



### FUNC _GetFacetId @ 00039758

/* std::priv::_GetFacetId(std::money_get<char, std::istreambuf_iterator<char, std::char_traits<char>
   > > const*) */

undefined4 * std::priv::_GetFacetId(money_get *param_1)

{
  return &DAT_00070d0c;
}



### FUNC _GetFacetId @ 00039764

/* std::priv::_GetFacetId(std::money_put<char, std::ostreambuf_iterator<char, std::char_traits<char>
   > > const*) */

undefined4 * std::priv::_GetFacetId(money_put *param_1)

{
  return &DAT_00070d10;
}



### FUNC _GetFacetId @ 00039770

/* std::priv::_GetFacetId(std::money_get<wchar_t, std::istreambuf_iterator<wchar_t,
   std::char_traits<wchar_t> > > const*) */

undefined4 * std::priv::_GetFacetId(money_get *param_1)

{
  return &DAT_00070d14;
}



### FUNC _GetFacetId @ 0003977c

/* std::priv::_GetFacetId(std::money_put<wchar_t, std::ostreambuf_iterator<wchar_t,
   std::char_traits<wchar_t> > > const*) */

undefined4 * std::priv::_GetFacetId(money_put *param_1)

{
  return &DAT_00070d18;
}



### FUNC _GetFacetId @ 00039788

/* std::priv::_GetFacetId(std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char> >
   > const*) */

undefined4 * std::priv::_GetFacetId(num_get *param_1)

{
  return &DAT_00070d1c;
}



### FUNC _GetFacetId @ 00039794

/* std::priv::_GetFacetId(std::num_get<wchar_t, std::istreambuf_iterator<wchar_t,
   std::char_traits<wchar_t> > > const*) */

undefined4 * std::priv::_GetFacetId(num_get *param_1)

{
  return &DAT_00070d24;
}



### FUNC _GetFacetId @ 000397a0

/* std::priv::_GetFacetId(std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> >
   > const*) */

undefined4 * std::priv::_GetFacetId(num_put *param_1)

{
  return &DAT_00070d20;
}



### FUNC _GetFacetId @ 000397ac

/* std::priv::_GetFacetId(std::num_put<wchar_t, std::ostreambuf_iterator<wchar_t,
   std::char_traits<wchar_t> > > const*) */

undefined4 * std::priv::_GetFacetId(num_put *param_1)

{
  return &DAT_00070d28;
}



### FUNC _GetFacetId @ 000397b8

/* std::priv::_GetFacetId(std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char>
   > > const*) */

undefined4 * std::priv::_GetFacetId(time_get *param_1)

{
  return &DAT_00070d2c;
}



### FUNC _GetFacetId @ 000397c4

/* std::priv::_GetFacetId(std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char>
   > > const*) */

undefined4 * std::priv::_GetFacetId(time_put *param_1)

{
  return &DAT_00070d30;
}



### FUNC _GetFacetId @ 000397d0

/* std::priv::_GetFacetId(std::time_get<wchar_t, std::istreambuf_iterator<wchar_t,
   std::char_traits<wchar_t> > > const*) */

undefined4 * std::priv::_GetFacetId(time_get *param_1)

{
  return &DAT_00070d34;
}



### FUNC _GetFacetId @ 000397dc

/* std::priv::_GetFacetId(std::time_put<wchar_t, std::ostreambuf_iterator<wchar_t,
   std::char_traits<wchar_t> > > const*) */

undefined4 * std::priv::_GetFacetId(time_put *param_1)

{
  return &DAT_00070d38;
}



### FUNC FUN_000397e8 @ 000397e8

void FUN_000397e8(uint *param_1,undefined4 *param_2,uint param_3,undefined4 *param_4)

{
  uint uVar1;
  uint uVar2;
  undefined4 *puVar3;
  undefined4 *puVar4;
  int iVar5;
  undefined4 *puVar6;
  undefined1 auStack_1c [4];
  undefined4 local_18;
  
  puVar4 = (undefined4 *)param_1[1];
  if (((undefined4 *)*param_1 <= param_4) && (param_4 < puVar4)) {
    local_18 = *param_4;
    FUN_000397e8(param_1,param_2,param_3,&local_18,auStack_1c);
    return;
  }
  uVar1 = (int)puVar4 - (int)param_2;
  uVar2 = (int)uVar1 >> 2;
  if (param_3 < uVar2) {
    puVar3 = puVar4;
    if (param_3 != 0) {
      __aeabi_memcpy(puVar4,puVar4 + -param_3,param_3 * 4);
      puVar3 = (undefined4 *)param_1[1];
    }
    param_1[1] = (uint)(puVar3 + param_3);
    iVar5 = (int)(puVar4 + -param_3) - (int)param_2;
    if (0 < iVar5) {
      __aeabi_memmove((int)puVar4 - iVar5,param_2);
    }
    if (0 < (int)(param_3 * 4)) {
      iVar5 = param_3 + 1;
      do {
        *param_2 = *param_4;
        param_2 = param_2 + 1;
        iVar5 = iVar5 + -1;
      } while (1 < iVar5);
    }
  }
  else {
    puVar3 = puVar4 + (param_3 - uVar2);
    if (0 < (int)((param_3 - uVar2) * 4)) {
      iVar5 = (param_3 + 1) - uVar2;
      puVar6 = puVar4;
      do {
        *puVar6 = *param_4;
        puVar6 = puVar6 + 1;
        iVar5 = iVar5 + -1;
      } while (1 < iVar5);
    }
    param_1[1] = (uint)puVar3;
    if (puVar4 != param_2) {
      __aeabi_memcpy(puVar3,param_2,uVar1);
      puVar3 = (undefined4 *)param_1[1];
    }
    param_1[1] = (uint)(puVar3 + uVar2);
    if (0 < (int)uVar1) {
      iVar5 = (uVar1 >> 2) + 1;
      do {
        *param_2 = *param_4;
        param_2 = param_2 + 1;
        iVar5 = iVar5 + -1;
      } while (1 < iVar5);
    }
  }
  return;
}



### FUNC FUN_000398e0 @ 000398e0

void FUN_000398e0(int *param_1,int param_2,undefined4 *param_3,undefined4 param_4,uint param_5,
                 int param_6)

{
  undefined4 *puVar1;
  void *pvVar2;
  undefined4 uVar3;
  int iVar4;
  undefined4 *puVar5;
  uint uVar6;
  uint uVar7;
  uint uVar8;
  int iVar9;
  undefined4 *puVar10;
  uint local_2c;
  uint local_18;
  
  iVar4 = *param_1;
  uVar6 = param_1[1] - iVar4 >> 2;
  if (0x3fffffff - uVar6 < param_5) {
                    /* WARNING: Subroutine does not return */
    std::__stl_throw_length_error("vector");
  }
  uVar7 = uVar6;
  if (uVar6 <= param_5) {
    uVar7 = param_5;
  }
  uVar6 = uVar7 + uVar6;
  uVar8 = uVar6;
  if (uVar6 < uVar7) {
    uVar8 = 0x3fffffff;
  }
  local_2c = 0x3fffffff;
  if (uVar6 < 0x40000000) {
    local_2c = uVar8;
  }
  if (0x3fffffff < local_2c) {
    FUN_00030824(4);
    uVar3 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
    FUN_000309e0(uVar3,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
  }
  if (local_2c == 0) {
    puVar1 = (undefined4 *)0x0;
    local_2c = 0;
  }
  else {
    local_2c = local_2c << 2;
    local_18 = local_2c;
    if (local_2c < 0x81) {
      puVar1 = (undefined4 *)std::__node_alloc::_M_allocate(&local_18);
      local_2c = local_18;
    }
    else {
      puVar1 = (undefined4 *)operator_new(local_2c);
    }
    iVar4 = *param_1;
    local_2c = local_2c >> 2;
  }
  iVar9 = param_2 - iVar4;
  puVar10 = puVar1;
  if (iVar9 != 0) {
    __aeabi_memmove(puVar1,iVar4,iVar9);
    puVar10 = (undefined4 *)((int)puVar1 + iVar9);
  }
  puVar5 = puVar10;
  uVar6 = param_5;
  if (param_5 != 0) {
    do {
      *puVar5 = *param_3;
      uVar6 = uVar6 - 1;
      puVar5 = puVar5 + 1;
    } while (uVar6 != 0);
    puVar10 = puVar10 + param_5;
  }
  if ((param_6 == 0) && (iVar4 = param_1[1] - param_2, iVar4 != 0)) {
    __aeabi_memmove(puVar10,param_2,iVar4);
    puVar10 = (undefined4 *)((int)puVar10 + iVar4);
  }
  pvVar2 = (void *)*param_1;
  if (pvVar2 != (void *)0x0) {
    if ((uint)(param_1[2] - (int)pvVar2) < 0x81) {
      std::__node_alloc::_M_deallocate(pvVar2,param_1[2] - (int)pvVar2);
    }
    else {
      operator_delete(pvVar2);
    }
  }
  *param_1 = (int)puVar1;
  param_1[1] = (int)puVar10;
  param_1[2] = (int)(puVar1 + local_2c);
  return;
}



### FUNC FUN_00039a00 @ 00039a00

void FUN_00039a00(facet *param_1)

{
  FUN_00039fc0(param_1 + 0xc);
  std::locale::facet::~facet(param_1);
  return;
}



### FUNC FUN_00039a68 @ 00039a68

void FUN_00039a68(undefined4 *param_1,int param_2,int *param_3,uint param_4,int *param_5,
                 uint param_6,undefined4 param_7,uint *param_8,undefined4 param_9)

{
  int iVar1;
  int iVar2;
  uint uVar3;
  
  iVar1 = *(int *)(param_2 + 0x1c);
  uVar3 = 0;
  iVar2 = FUN_0003a344(param_3,param_4,param_5,param_6,*(undefined4 *)(param_2 + 0x20),iVar1,0,
                       param_2 + 0xc,param_7,param_8,param_9);
  if (iVar2 != iVar1) {
    uVar3 = 4;
  }
  *param_8 = uVar3;
  if ((param_3 != (int *)0x0) && ((param_4 & 0xff0000) == 0)) {
    if ((byte *)param_3[2] < (byte *)param_3[3]) {
      uVar3 = (uint)*(byte *)param_3[2];
    }
    else {
      uVar3 = (**(code **)(*param_3 + 0x20))(param_3);
    }
    param_4 = param_4 & 0xff000000 | uVar3 & 0xff | (uint)(uVar3 == 0xffffffff) << 8 | 0x10000;
  }
  if ((param_5 != (int *)0x0) && ((param_6 & 0xff0000) == 0)) {
    if ((byte *)param_5[2] < (byte *)param_5[3]) {
      uVar3 = (uint)*(byte *)param_5[2];
    }
    else {
      uVar3 = (**(code **)(*param_5 + 0x20))();
    }
    param_6 = (uint)(uVar3 == 0xffffffff) << 8;
  }
  if ((param_4 >> 8 & 0xff) == (param_6 >> 8 & 0xff)) {
    *param_8 = *param_8 | 2;
  }
  *param_1 = param_3;
  param_1[1] = param_4;
  return;
}



### FUNC FUN_00039b82 @ 00039b82

undefined4 *
FUN_00039b82(undefined4 *param_1,int param_2,int *param_3,uint param_4,int *param_5,uint param_6,
            undefined4 param_7,uint *param_8,undefined4 param_9)

{
  int iVar1;
  int iVar2;
  uint uVar3;
  
  iVar1 = *(int *)(param_2 + 0x34);
  uVar3 = 0;
  iVar2 = FUN_0003a344(param_3,param_4,param_5,param_6,*(undefined4 *)(param_2 + 0x38),iVar1,0,
                       param_2 + 0xc,param_7,param_8,param_9);
  if (iVar2 != iVar1) {
    *param_8 = 4;
    if ((param_3 != (int *)0x0) && ((param_4 & 0xff0000) == 0)) {
      if ((byte *)param_3[2] < (byte *)param_3[3]) {
        uVar3 = (uint)*(byte *)param_3[2];
      }
      else {
        uVar3 = (**(code **)(*param_3 + 0x20))(param_3);
      }
      param_4 = param_4 & 0xff000000 | uVar3 & 0xff | (uint)(uVar3 == 0xffffffff) << 8 | 0x10000;
    }
    if ((param_5 != (int *)0x0) && ((param_6 & 0xff0000) == 0)) {
      if ((byte *)param_5[2] < (byte *)param_5[3]) {
        uVar3 = (uint)*(byte *)param_5[2];
      }
      else {
        uVar3 = (**(code **)(*param_5 + 0x20))();
      }
      param_6 = (uint)(uVar3 == 0xffffffff) << 8;
    }
    if ((param_4 >> 8 & 0xff) != (param_6 >> 8 & 0xff)) goto LAB_00039ca2;
    uVar3 = *param_8 | 2;
  }
  *param_8 = uVar3;
LAB_00039ca2:
  *param_1 = param_3;
  param_1[1] = param_4;
  return param_1 + 2;
}



### FUNC FUN_00039caa @ 00039caa

void FUN_00039caa(undefined4 *param_1,int param_2,int *param_3,undefined4 param_4,int *param_5,
                 int param_6,undefined4 param_7,uint *param_8,int param_9)

{
  int iVar1;
  uint uVar2;
  undefined4 extraout_r1;
  int *local_28;
  undefined4 local_24;
  int *local_20;
  undefined4 local_1c;
  
  local_24 = param_6;
  local_28 = param_5;
  local_20 = param_3;
  local_1c = param_4;
  iVar1 = FUN_0003a678(&local_20,&local_28,param_2 + 0x84,param_2 + 0x1d4);
  if (iVar1 == 0xe) {
    *param_8 = 4;
    if ((local_20 != (int *)0x0) && (local_1c._2_1_ == '\0')) {
      if ((byte *)local_20[2] < (byte *)local_20[3]) {
        uVar2 = (uint)*(byte *)local_20[2];
      }
      else {
        uVar2 = (**(code **)(*local_20 + 0x20))();
      }
      local_1c = CONCAT13(local_1c._3_1_,0x10000);
      local_1c._0_2_ = CONCAT11(uVar2 == 0xffffffff,(char)uVar2);
    }
    if ((local_28 != (int *)0x0) && (local_24._2_1_ == '\0')) {
      if ((byte *)local_28[2] < (byte *)local_28[3]) {
        uVar2 = (uint)*(byte *)local_28[2];
      }
      else {
        uVar2 = (**(code **)(*local_28 + 0x20))();
      }
      local_24 = (uint)(uVar2 == 0xffffffff) << 8;
    }
    if (local_1c._1_1_ != local_24._1_1_) goto LAB_00039d62;
    uVar2 = *param_8 | 2;
  }
  else {
    __aeabi_uidivmod(iVar1,7);
    *(undefined4 *)(param_9 + 0x18) = extraout_r1;
    uVar2 = 0;
  }
  *param_8 = uVar2;
LAB_00039d62:
  *param_1 = local_20;
  param_1[1] = local_1c;
  return;
}



### FUNC FUN_00039d6c @ 00039d6c

void FUN_00039d6c(undefined4 *param_1,int param_2,int *param_3,undefined4 param_4,int *param_5,
                 int param_6,undefined4 param_7,uint *param_8,int param_9)

{
  int iVar1;
  uint uVar2;
  undefined4 extraout_r1;
  int *local_28;
  undefined4 local_24;
  int *local_20;
  undefined4 local_1c;
  
  local_24 = param_6;
  local_28 = param_5;
  local_20 = param_3;
  local_1c = param_4;
  iVar1 = FUN_0003a678(&local_20,&local_28,param_2 + 0x1d4,param_2 + 0x414);
  if (iVar1 == 0x18) {
    *param_8 = 4;
    if ((local_20 != (int *)0x0) && (local_1c._2_1_ == '\0')) {
      if ((byte *)local_20[2] < (byte *)local_20[3]) {
        uVar2 = (uint)*(byte *)local_20[2];
      }
      else {
        uVar2 = (**(code **)(*local_20 + 0x20))();
      }
      local_1c = CONCAT13(local_1c._3_1_,0x10000);
      local_1c._0_2_ = CONCAT11(uVar2 == 0xffffffff,(char)uVar2);
    }
    if ((local_28 != (int *)0x0) && (local_24._2_1_ == '\0')) {
      if ((byte *)local_28[2] < (byte *)local_28[3]) {
        uVar2 = (uint)*(byte *)local_28[2];
      }
      else {
        uVar2 = (**(code **)(*local_28 + 0x20))();
      }
      local_24 = (uint)(uVar2 == 0xffffffff) << 8;
    }
    if (local_1c._1_1_ != local_24._1_1_) goto LAB_00039e22;
    uVar2 = *param_8 | 2;
  }
  else {
    __aeabi_uidivmod(iVar1,0xc);
    *(undefined4 *)(param_9 + 0x10) = extraout_r1;
    uVar2 = 0;
  }
  *param_8 = uVar2;
LAB_00039e22:
  *param_1 = local_20;
  param_1[1] = local_1c;
  return;
}



### FUNC FUN_00039e30 @ 00039e30

void FUN_00039e30(undefined4 *param_1,undefined4 param_2,int *param_3,uint param_4,int *param_5,
                 uint param_6,undefined4 param_7,uint *param_8,int param_9)

{
  uint uVar1;
  int iVar2;
  uint uVar3;
  uint uVar4;
  int *local_28;
  undefined4 local_24;
  int *local_20;
  undefined4 local_1c;
  
  local_24 = param_6;
  local_28 = param_5;
  uVar4 = param_6 >> 8;
  uVar3 = param_4 >> 8;
  local_20 = param_3;
  local_1c = param_4;
  if ((param_3 != (int *)0x0) && ((param_4 & 0xff0000) == 0)) {
    if ((byte *)param_3[2] < (byte *)param_3[3]) {
      uVar1 = (uint)*(byte *)param_3[2];
    }
    else {
      uVar1 = (**(code **)(*param_3 + 0x20))(param_3);
    }
    local_1c = CONCAT13(local_1c._3_1_,0x10000);
    uVar3 = (uint)(uVar1 == 0xffffffff);
    local_1c._0_2_ = CONCAT11(uVar1 == 0xffffffff,(char)uVar1);
  }
  if ((param_5 != (int *)0x0) && ((param_6 & 0xff0000) == 0)) {
    if ((byte *)param_5[2] < (byte *)param_5[3]) {
      uVar1 = (uint)*(byte *)param_5[2];
    }
    else {
      uVar1 = (**(code **)(*param_5 + 0x20))();
    }
    local_24 = CONCAT13(local_24._3_1_,0x10000);
    uVar4 = (uint)(uVar1 == 0xffffffff);
    local_24._0_2_ = CONCAT11(uVar1 == 0xffffffff,(char)uVar1);
  }
  if ((uVar3 & 0xff) == (uVar4 & 0xff)) {
    *param_8 = 6;
  }
  else {
    uVar3 = 0;
    iVar2 = FUN_0003a840(&local_20,&local_28,param_9 + 0x14,0);
    *(int *)(param_9 + 0x14) = *(int *)(param_9 + 0x14) + -0x76c;
    if (iVar2 == 0) {
      uVar3 = 4;
    }
    *param_8 = uVar3;
    if ((local_20 != (int *)0x0) && (local_1c._2_1_ == '\0')) {
      if ((byte *)local_20[2] < (byte *)local_20[3]) {
        uVar3 = (uint)*(byte *)local_20[2];
      }
      else {
        uVar3 = (**(code **)(*local_20 + 0x20))();
      }
      local_1c = CONCAT13(local_1c._3_1_,0x10000);
      local_1c._0_2_ = CONCAT11(uVar3 == 0xffffffff,(char)uVar3);
    }
    if ((local_28 != (int *)0x0) && (local_24._2_1_ == '\0')) {
      if ((byte *)local_28[2] < (byte *)local_28[3]) {
        uVar3 = (uint)*(byte *)local_28[2];
      }
      else {
        uVar3 = (**(code **)(*local_28 + 0x20))();
      }
      local_24 = (uint)(uVar3 == 0xffffffff) << 8;
    }
    if (local_1c._1_1_ == local_24._1_1_) {
      *param_8 = *param_8 | 2;
    }
  }
  *param_1 = local_20;
  param_1[1] = local_1c;
  return;
}



### FUNC FUN_00039f7c @ 00039f7c

void FUN_00039f7c(facet *param_1)

{
  FUN_00039fc0(param_1 + 0xc);
  std::locale::facet::~facet(param_1);
  operator_delete(param_1);
  return;
}



### FUNC FUN_00039fc0 @ 00039fc0

void FUN_00039fc0(int param_1)

{
  int *piVar1;
  void *pvVar2;
  uint uVar3;
  int iVar4;
  int iVar5;
  
  piVar1 = *(int **)(param_1 + 0x434);
  if ((piVar1 != (int *)0x0) && (piVar1 != (int *)(param_1 + 0x420))) {
    uVar3 = *(int *)(param_1 + 0x420) - (int)piVar1;
    if (uVar3 < 0x81) {
      std::__node_alloc::_M_deallocate(piVar1,uVar3);
    }
    else {
      operator_delete(piVar1);
    }
  }
  piVar1 = *(int **)(param_1 + 0x41c);
  if ((piVar1 != (int *)0x0) && (piVar1 != (int *)(param_1 + 0x408))) {
    uVar3 = *(int *)(param_1 + 0x408) - (int)piVar1;
    if (uVar3 < 0x81) {
      std::__node_alloc::_M_deallocate(piVar1,uVar3);
    }
    else {
      operator_delete(piVar1);
    }
  }
  iVar5 = 0;
  do {
    pvVar2 = *(void **)(param_1 + 0x404 + iVar5);
    if ((pvVar2 != (void *)0x0) && ((void *)(param_1 + 0x3f0 + iVar5) != pvVar2)) {
      uVar3 = *(int *)(param_1 + 0x3f0 + iVar5) - (int)pvVar2;
      if (uVar3 < 0x81) {
        std::__node_alloc::_M_deallocate(pvVar2,uVar3);
      }
      else {
        operator_delete(pvVar2);
      }
    }
    iVar5 = iVar5 + -0x18;
  } while (iVar5 != -0x240);
  iVar5 = 0;
  do {
    iVar4 = param_1 + 0x138 + iVar5;
    pvVar2 = *(void **)(iVar4 + 0x8c);
    if ((pvVar2 != (void *)0x0) && ((void *)(iVar4 + 0x78) != pvVar2)) {
      uVar3 = *(int *)(iVar4 + 0x78) - (int)pvVar2;
      if (uVar3 < 0x81) {
        std::__node_alloc::_M_deallocate(pvVar2,uVar3);
      }
      else {
        operator_delete(pvVar2);
      }
    }
    iVar5 = iVar5 + -0x18;
  } while (iVar5 != -0x150);
  FUN_0003a204(param_1);
  return;
}



### FUNC FUN_0003a204 @ 0003a204

int * FUN_0003a204(int *param_1)

{
  int *piVar1;
  uint uVar2;
  
  piVar1 = (int *)param_1[0x1d];
  if ((piVar1 != param_1 + 0x18) && (piVar1 != (int *)0x0)) {
    uVar2 = param_1[0x18] - (int)piVar1;
    if (uVar2 < 0x81) {
      std::__node_alloc::_M_deallocate(piVar1,uVar2);
    }
    else {
      operator_delete(piVar1);
    }
  }
  piVar1 = (int *)param_1[0x17];
  if ((piVar1 != param_1 + 0x12) && (piVar1 != (int *)0x0)) {
    uVar2 = param_1[0x12] - (int)piVar1;
    if (uVar2 < 0x81) {
      std::__node_alloc::_M_deallocate(piVar1,uVar2);
    }
    else {
      operator_delete(piVar1);
    }
  }
  piVar1 = (int *)param_1[0x11];
  if ((piVar1 != param_1 + 0xc) && (piVar1 != (int *)0x0)) {
    uVar2 = param_1[0xc] - (int)piVar1;
    if (uVar2 < 0x81) {
      std::__node_alloc::_M_deallocate(piVar1,uVar2);
    }
    else {
      operator_delete(piVar1);
    }
  }
  piVar1 = (int *)param_1[0xb];
  if ((piVar1 != param_1 + 6) && (piVar1 != (int *)0x0)) {
    uVar2 = param_1[6] - (int)piVar1;
    if (uVar2 < 0x81) {
      std::__node_alloc::_M_deallocate(piVar1,uVar2);
    }
    else {
      operator_delete(piVar1);
    }
  }
  piVar1 = (int *)param_1[5];
  if ((piVar1 != param_1) && (piVar1 != (int *)0x0)) {
    if (0x80 < (uint)(*param_1 - (int)piVar1)) {
      operator_delete(piVar1);
      return param_1;
    }
    std::__node_alloc::_M_deallocate(piVar1,*param_1 - (int)piVar1);
  }
  return param_1;
}



### FUNC FUN_0003a344 @ 0003a344

char * FUN_0003a344(int *param_1,uint param_2,int *param_3,undefined4 param_4,char *param_5,
                   char *param_6,undefined4 param_7,int param_8,int param_9,uint *param_10,
                   int *param_11)

{
  char *pcVar1;
  locale *this;
  int *piVar2;
  int *piVar3;
  int *piVar4;
  uint uVar5;
  int iVar6;
  uint uVar7;
  char cVar8;
  int *piVar9;
  uint *puVar10;
  bool bVar11;
  locale alStack_2c [4];
  int *local_28;
  undefined4 local_24;
  int *local_20;
  undefined4 local_1c;
  
  local_28 = param_3;
  local_24 = param_4;
  local_20 = param_1;
  local_1c = param_2;
  this = (locale *)std::locale::locale(alStack_2c,(locale *)(param_9 + 0x20));
  piVar2 = (int *)std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  std::locale::~locale(alStack_2c);
  piVar3 = param_11 + 5;
  piVar4 = param_11 + 2;
  puVar10 = (uint *)(param_11 + 4);
LAB_0003a3b2:
  if ((local_20 != (int *)0x0) && (local_1c._2_1_ == '\0')) {
    if ((byte *)local_20[2] < (byte *)local_20[3]) {
      uVar5 = (uint)*(byte *)local_20[2];
    }
    else {
      uVar5 = (**(code **)(*local_20 + 0x20))();
    }
    local_1c = CONCAT13(local_1c._3_1_,0x10000);
    local_1c._0_2_ = CONCAT11(uVar5 == 0xffffffff,(char)uVar5);
  }
  if ((local_28 == (int *)0x0) || (local_24._2_1_ != '\0')) {
    cVar8 = local_24._1_1_;
  }
  else {
    if ((byte *)local_28[2] < (byte *)local_28[3]) {
      uVar5 = (uint)*(byte *)local_28[2];
    }
    else {
      uVar5 = (**(code **)(*local_28 + 0x20))();
    }
    local_24 = CONCAT13(local_24._3_1_,0x10000);
    local_24._0_2_ = CONCAT11(uVar5 == 0xffffffff,(char)uVar5);
    cVar8 = uVar5 == 0xffffffff;
  }
  if (param_5 == param_6) {
    return param_5;
  }
  if (local_1c._1_1_ == cVar8) {
    return param_5;
  }
  if (*param_5 != '%') {
    if (local_1c._2_1_ == '\0') {
      if ((byte *)local_20[2] < (byte *)local_20[3]) {
        uVar5 = (uint)*(byte *)local_20[2];
      }
      else {
        uVar5 = (**(code **)(*local_20 + 0x20))();
      }
      local_1c = CONCAT13(local_1c._3_1_,0x10000);
      local_1c._0_2_ = CONCAT11(uVar5 == 0xffffffff,(char)uVar5);
    }
    else {
      uVar5 = local_1c & 0xff;
    }
    if ((uint)local_20[2] < (uint)local_20[3]) {
      local_20[2] = local_20[2] + 1;
    }
    else {
      (**(code **)(*local_20 + 0x24))();
    }
    local_1c._0_3_ = (uint3)(ushort)local_1c;
    uVar7 = (**(code **)(*piVar2 + 0x18))(piVar2,*param_5);
    if ((uVar5 & 0xff) != uVar7) {
      return param_5;
    }
    goto switchD_0003a452_caseD_43;
  }
  cVar8 = param_5[1];
  pcVar1 = param_5 + 1;
  if (cVar8 == '#') {
    cVar8 = param_5[2];
    pcVar1 = param_5 + 2;
  }
  param_5 = pcVar1;
  iVar6 = 0;
  switch(cVar8) {
  case 'A':
    iVar6 = 7;
  case 'a':
    iVar6 = param_8 + iVar6 * 0x18;
    iVar6 = FUN_0003a678(&local_20,&local_28,iVar6 + 0x78,iVar6 + 0x120);
    if (iVar6 == 7) {
      return param_5;
    }
    param_11[6] = iVar6;
    param_5 = param_5 + 1;
    goto LAB_0003a3b2;
  case 'B':
    iVar6 = 0xc;
  case 'b':
    iVar6 = param_8 + iVar6 * 0x18;
    uVar5 = FUN_0003a678(&local_20,&local_28,iVar6 + 0x1c8,iVar6 + 0x2e8);
    if (uVar5 == 0xc) {
      return param_5;
    }
    *puVar10 = uVar5;
    param_5 = param_5 + 1;
    goto LAB_0003a3b2;
  default:
    goto switchD_0003a452_caseD_43;
  case 'H':
  case 'I':
    piVar9 = piVar4;
    break;
  case 'M':
    piVar9 = param_11 + 1;
    break;
  case 'S':
    piVar9 = param_11;
    break;
  case 'Y':
    iVar6 = FUN_0003a840(&local_20,&local_28,piVar3,0);
    *piVar3 = *piVar3 + -0x76c;
    goto LAB_0003a622;
  case 'd':
    iVar6 = FUN_0003a840(&local_20,&local_28,param_11 + 3,0);
    if ((iVar6 != 1) || (0x1e < param_11[3] - 1U)) {
LAB_0003a650:
      *param_10 = *param_10 | 4;
      return param_5;
    }
    goto switchD_0003a452_caseD_43;
  case 'j':
    piVar9 = param_11 + 7;
    break;
  case 'm':
    iVar6 = FUN_0003a840(&local_20,&local_28,puVar10,0);
    uVar5 = *puVar10;
    *puVar10 = uVar5 - 1;
    if ((0xb < uVar5 - 1) || (iVar6 == 0)) goto LAB_0003a650;
    goto switchD_0003a452_caseD_43;
  case 'p':
    iVar6 = FUN_0003a678(&local_20,&local_28,param_8 + 0x408,param_8 + 0x438);
    if (iVar6 == 0) {
      if (*piVar4 != 0xc) goto switchD_0003a452_caseD_43;
      *piVar4 = 0;
      param_5 = param_5 + 1;
    }
    else {
      if (iVar6 != 1) {
        bVar11 = iVar6 == 2;
        goto LAB_0003a624;
      }
      if (*piVar4 == 0xc) goto switchD_0003a452_caseD_43;
      *piVar4 = *piVar4 + 0xc;
      param_5 = param_5 + 1;
    }
    goto LAB_0003a3b2;
  case 'y':
    piVar9 = piVar3;
  }
  iVar6 = FUN_0003a840(&local_20,&local_28,piVar9,0);
LAB_0003a622:
  bVar11 = iVar6 == 0;
LAB_0003a624:
  if (bVar11) {
    return param_5;
  }
switchD_0003a452_caseD_43:
  param_5 = param_5 + 1;
  goto LAB_0003a3b2;
}



### FUNC FUN_0003a678 @ 0003a678

int FUN_0003a678(int *param_1,int *param_2,int param_3,int param_4)

{
  int *piVar1;
  uint uVar2;
  int *piVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  int iVar7;
  int iVar8;
  int local_48;
  int local_44;
  int local_3c;
  char local_2c [24];
  
  local_2c[0x14] = '\0';
  local_2c[0x15] = '\0';
  local_2c[0x16] = '\0';
  local_2c[0x17] = '\0';
  local_2c[0x10] = '\0';
  local_2c[0x11] = '\0';
  local_2c[0x12] = '\0';
  local_2c[0x13] = '\0';
  local_2c[0xc] = '\0';
  local_2c[0xd] = '\0';
  local_2c[0xe] = '\0';
  local_2c[0xf] = '\0';
  local_2c[8] = '\0';
  local_2c[9] = '\0';
  local_2c[10] = '\0';
  local_2c[0xb] = '\0';
  local_2c[4] = '\0';
  local_2c[5] = '\0';
  local_2c[6] = '\0';
  local_2c[7] = '\0';
  local_2c[0] = '\0';
  local_2c[1] = '\0';
  local_2c[2] = '\0';
  local_2c[3] = '\0';
  local_48 = (param_4 - param_3 >> 3) * -0x55555555;
  iVar8 = 0;
  iVar5 = 0;
  iVar7 = local_48;
  local_3c = local_48;
  while( true ) {
    piVar1 = (int *)*param_1;
    if ((piVar1 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
      if ((byte *)piVar1[2] < (byte *)piVar1[3]) {
        uVar2 = (uint)*(byte *)piVar1[2];
      }
      else {
        uVar2 = (**(code **)(*piVar1 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar2;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar2 == 0xffffffff;
    }
    piVar1 = (int *)*param_2;
    if ((piVar1 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
      if ((byte *)piVar1[2] < (byte *)piVar1[3]) {
        uVar2 = (uint)*(byte *)piVar1[2];
      }
      else {
        uVar2 = (**(code **)(*piVar1 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar2;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar2 == 0xffffffff;
    }
    if (*(char *)((int)param_1 + 5) == *(char *)((int)param_2 + 5)) break;
    local_44 = iVar7;
    if (iVar8 < iVar7) {
      piVar1 = (int *)(param_3 + 0x14 + iVar8 * 0x18);
      iVar4 = iVar8;
      iVar6 = iVar8;
      do {
        if (local_2c[iVar6] == '\0') {
          if (*(char *)((int)param_1 + 6) == '\0') {
            piVar3 = (int *)*param_1;
            if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
              uVar2 = (uint)*(byte *)piVar3[2];
            }
            else {
              uVar2 = (**(code **)(*piVar3 + 0x20))();
            }
            *(char *)(param_1 + 1) = (char)uVar2;
            *(undefined1 *)((int)param_1 + 6) = 1;
            *(bool *)((int)param_1 + 5) = uVar2 == 0xffffffff;
          }
          else {
            uVar2 = (uint)*(byte *)(param_1 + 1);
          }
          if ((uVar2 & 0xff) == (uint)*(byte *)(*piVar1 + iVar5)) {
            if (iVar5 == (piVar1[-1] + -1) - *piVar1) {
              local_2c[iVar6] = '\x01';
              iVar8 = iVar4 + 1;
              if (iVar6 != iVar4) {
                iVar8 = iVar4;
              }
              local_3c = local_3c + -1;
              iVar4 = iVar8;
              local_48 = iVar6;
              if (local_3c == 0) {
                piVar1 = (int *)*param_1;
                if ((uint)piVar1[2] < (uint)piVar1[3]) {
                  piVar1[2] = piVar1[2] + 1;
                }
                else {
                  (**(code **)(*piVar1 + 0x24))();
                }
                *(undefined1 *)((int)param_1 + 6) = 0;
                return iVar6;
              }
            }
            local_44 = iVar6 + 1;
            iVar8 = iVar4;
          }
          else {
            local_2c[iVar6] = '\x01';
            iVar8 = iVar4 + 1;
            if (iVar6 != iVar4) {
              iVar8 = iVar4;
            }
            local_3c = local_3c + -1;
            if (local_3c == 0) {
              return local_48;
            }
          }
        }
        else {
          iVar8 = iVar4 + 1;
          if (iVar6 != iVar4) {
            iVar8 = iVar4;
          }
        }
        piVar1 = piVar1 + 6;
        iVar6 = iVar6 + 1;
        iVar4 = iVar8;
      } while (iVar6 < iVar7);
    }
    piVar1 = (int *)*param_1;
    if ((uint)piVar1[2] < (uint)piVar1[3]) {
      piVar1[2] = piVar1[2] + 1;
    }
    else {
      (**(code **)(*piVar1 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 6) = 0;
    iVar5 = iVar5 + 1;
    iVar7 = local_44;
  }
  return local_48;
}



### FUNC FUN_0003a840 @ 0003a840

undefined4 FUN_0003a840(undefined4 param_1,undefined4 param_2,undefined4 param_3)

{
  undefined4 uVar1;
  undefined1 auStack_30 [4];
  uint local_2c [4];
  uint *local_1c;
  uint *local_18;
  
  local_1c = local_2c;
  local_2c[0] = local_2c[0] & 0xffffff00;
  local_18 = local_1c;
  uVar1 = FUN_0003a8bc(param_1,param_2,10,param_3,0,0,0,local_1c,auStack_30);
  if ((local_18 != local_2c) && (local_18 != (uint *)0x0)) {
    if (local_2c[0] - (int)local_18 < 0x81) {
      std::__node_alloc::_M_deallocate(local_18,local_2c[0] - (int)local_18);
    }
    else {
      operator_delete(local_18);
    }
  }
  return uVar1;
}



### FUNC FUN_0003a8bc @ 0003a8bc

undefined4
FUN_0003a8bc(int *param_1,int *param_2,int param_3,int *param_4,int param_5,int param_6,uint param_7
            ,int param_8)

{
  char cVar1;
  int iVar2;
  int *piVar3;
  uint uVar4;
  undefined4 uVar5;
  bool bVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  int iVar10;
  int iVar11;
  undefined4 local_84;
  int local_6c;
  char *local_64;
  int local_58;
  char acStack_54 [64];
  
  iVar7 = *(int *)(param_8 + 0x10);
  iVar9 = *(int *)(param_8 + 0x14);
  local_84 = 1;
  iVar2 = __divsi3(0x7fffffff,param_3);
  local_6c = param_5;
  cVar1 = '\0';
  bVar6 = false;
  local_58 = 0;
  iVar11 = 0;
  while( true ) {
    local_64 = acStack_54 + local_58;
    piVar3 = (int *)*param_1;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    piVar3 = (int *)*param_2;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
    }
    if (*(char *)((int)param_1 + 5) == *(char *)((int)param_2 + 5)) break;
    if (*(char *)((int)param_1 + 6) == '\0') {
      piVar3 = (int *)*param_1;
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    else {
      uVar4 = (uint)*(byte *)(param_1 + 1);
    }
    iVar8 = 0xff;
    iVar10 = iVar11;
    if ((uVar4 & 0xff) == param_7 && iVar9 != iVar7) {
      *local_64 = cVar1;
      local_58 = local_58 + 1;
      cVar1 = '\0';
    }
    else {
      if (-1 < (char)uVar4) {
        iVar8 = std::priv::__digit_val_table(uVar4 & 0xff);
      }
      if (param_3 <= iVar8) break;
      cVar1 = cVar1 + '\x01';
      local_6c = local_6c + 1;
      if (iVar2 < iVar11) {
        bVar6 = true;
      }
      else {
        iVar10 = iVar8 + iVar11 * param_3;
        bVar6 = (bool)(bVar6 | (iVar11 != 0 && iVar10 <= iVar11));
      }
    }
    piVar3 = (int *)*param_1;
    if ((uint)piVar3[2] < (uint)piVar3[3]) {
      piVar3[2] = piVar3[2] + 1;
    }
    else {
      (**(code **)(*piVar3 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 6) = 0;
    iVar11 = iVar10;
  }
  if ((iVar9 != iVar7) && (local_58 != 0)) {
    *local_64 = cVar1;
    local_64 = acStack_54 + local_58 + 1;
  }
  uVar5 = 0;
  if (0 < local_6c) {
    if (bVar6) {
      *param_4 = 0x7fffffff;
      return 0;
    }
    iVar2 = -iVar11;
    if (param_6 == 0) {
      iVar2 = iVar11;
    }
    *param_4 = iVar2;
    uVar5 = local_84;
    if (iVar9 != iVar7) {
      uVar5 = std::priv::__valid_grouping
                        (acStack_54,local_64,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10));
    }
  }
  return uVar5;
}



### FUNC FUN_0003aac0 @ 0003aac0

void FUN_0003aac0(facet *param_1)

{
  FUN_00039fc0(param_1 + 0xc);
  std::locale::facet::~facet(param_1);
  return;
}



### FUNC FUN_0003ac64 @ 0003ac64

void FUN_0003ac64(facet *param_1)

{
  FUN_00039fc0(param_1 + 0xc);
  std::locale::facet::~facet(param_1);
  operator_delete(param_1);
  return;
}



### FUNC FUN_0003ad04 @ 0003ad04

void FUN_0003ad04(undefined4 *param_1,int param_2,int *param_3,int param_4,uint param_5,int *param_6
                 ,undefined4 param_7,uint param_8,undefined4 param_9,uint *param_10,
                 undefined4 param_11)

{
  int iVar1;
  int iVar2;
  uint uVar3;
  uint local_38;
  
  iVar1 = *(int *)(param_2 + 0x1c);
  uVar3 = 0;
  iVar2 = FUN_0003b4cc(param_3,param_4,param_5,param_6,param_7,param_8,
                       *(undefined4 *)(param_2 + 0x20),iVar1,0,param_2 + 0xc,param_9,param_10,
                       param_11);
  if (iVar2 != iVar1) {
    uVar3 = 4;
  }
  *param_10 = uVar3;
  if ((param_3 != (int *)0x0) && ((param_5 & 0xff00) == 0)) {
    if ((int *)param_3[2] < (int *)param_3[3]) {
      param_4 = *(int *)param_3[2];
    }
    else {
      param_4 = (**(code **)(*param_3 + 0x20))();
    }
    param_5 = param_5 & 0xffff0000 | (uint)(param_4 == -1) | 0x100;
  }
  local_38 = param_8;
  if ((param_6 != (int *)0x0) && ((param_8 & 0xff00) == 0)) {
    if ((int *)param_6[2] < (int *)param_6[3]) {
      iVar1 = *(int *)param_6[2];
    }
    else {
      iVar1 = (**(code **)(*param_6 + 0x20))(param_6);
    }
    local_38 = (uint)(iVar1 == -1);
  }
  if ((param_5 & 0xff) == (local_38 & 0xff)) {
    *param_10 = *param_10 | 2;
  }
  *param_1 = param_3;
  param_1[1] = param_4;
  param_1[2] = param_5;
  return;
}



### FUNC FUN_0003ae38 @ 0003ae38

undefined4 *
FUN_0003ae38(undefined4 *param_1,int param_2,int *param_3,int param_4,uint param_5,int *param_6,
            undefined4 param_7,uint param_8,undefined4 param_9,uint *param_10,undefined4 param_11)

{
  int iVar1;
  uint uVar2;
  int iVar3;
  
  iVar3 = *(int *)(param_2 + 0x34);
  uVar2 = 0;
  iVar1 = FUN_0003b4cc(param_3,param_4,param_5,param_6,param_7,param_8,
                       *(undefined4 *)(param_2 + 0x38),iVar3,0,param_2 + 0xc,param_9,param_10,
                       param_11);
  if (iVar1 != iVar3) {
    *param_10 = 4;
    if ((param_3 != (int *)0x0) && ((param_5 & 0xff00) == 0)) {
      if ((int *)param_3[2] < (int *)param_3[3]) {
        param_4 = *(int *)param_3[2];
      }
      else {
        param_4 = (**(code **)(*param_3 + 0x20))();
      }
      param_5 = param_5 & 0xffff0000 | (uint)(param_4 == -1) | 0x100;
    }
    if ((param_6 != (int *)0x0) && ((param_8 & 0xff00) == 0)) {
      if ((int *)param_6[2] < (int *)param_6[3]) {
        iVar1 = *(int *)param_6[2];
      }
      else {
        iVar1 = (**(code **)(*param_6 + 0x20))();
      }
      param_8 = (uint)(iVar1 == -1);
    }
    if ((param_5 & 0xff) != (param_8 & 0xff)) goto LAB_0003af3c;
    uVar2 = *param_10 | 2;
  }
  *param_10 = uVar2;
LAB_0003af3c:
  *param_1 = param_3;
  param_1[1] = param_4;
  param_1[2] = param_5;
  return param_1 + 3;
}



### FUNC FUN_0003af48 @ 0003af48

void FUN_0003af48(undefined4 *param_1,int param_2,int *param_3,int param_4,uint param_5,int *param_6
                 ,undefined4 param_7,uint param_8,undefined4 param_9,uint *param_10,int param_11)

{
  int iVar1;
  uint uVar2;
  undefined4 extraout_r1;
  int *local_2c;
  undefined4 local_28;
  undefined4 local_24;
  int *local_20;
  int local_1c;
  undefined4 local_18;
  
  local_18 = param_5;
  local_28 = param_7;
  local_24 = param_8;
  local_2c = param_6;
  local_20 = param_3;
  local_1c = param_4;
  iVar1 = FUN_0003b804(&local_20,&local_2c,param_2 + 0x84,param_2 + 0x474);
  if (iVar1 == 0xe) {
    *param_10 = 4;
    if ((local_20 != (int *)0x0) && (local_18._1_1_ == '\0')) {
      if ((int *)local_20[2] < (int *)local_20[3]) {
        local_1c = *(int *)local_20[2];
      }
      else {
        local_1c = (**(code **)(*local_20 + 0x20))();
      }
      local_18 = CONCAT22(local_18._2_2_,0x100);
      local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
    }
    if ((local_2c != (int *)0x0) && (local_24._1_1_ == '\0')) {
      if ((int *)local_2c[2] < (int *)local_2c[3]) {
        iVar1 = *(int *)local_2c[2];
      }
      else {
        iVar1 = (**(code **)(*local_2c + 0x20))();
      }
      local_24 = (uint)(iVar1 == -1);
    }
    if ((local_18 & 0xff) != (local_24 & 0xff)) goto LAB_0003b00a;
    uVar2 = *param_10 | 2;
  }
  else {
    __aeabi_uidivmod(iVar1,7);
    *(undefined4 *)(param_11 + 0x18) = extraout_r1;
    uVar2 = 0;
  }
  *param_10 = uVar2;
LAB_0003b00a:
  *param_1 = local_20;
  param_1[1] = local_1c;
  param_1[2] = local_18;
  return;
}



### FUNC FUN_0003b020 @ 0003b020

void FUN_0003b020(undefined4 *param_1,int param_2,int *param_3,int param_4,uint param_5,int *param_6
                 ,undefined4 param_7,uint param_8,undefined4 param_9,uint *param_10,int param_11)

{
  int iVar1;
  uint uVar2;
  undefined4 extraout_r1;
  int *local_2c;
  undefined4 local_28;
  undefined4 local_24;
  int *local_20;
  int local_1c;
  undefined4 local_18;
  
  local_18 = param_5;
  local_28 = param_7;
  local_24 = param_8;
  local_2c = param_6;
  local_20 = param_3;
  local_1c = param_4;
  iVar1 = FUN_0003b804(&local_20,&local_2c,param_2 + 0x474,param_2 + 0xb34);
  if (iVar1 == 0x18) {
    *param_10 = 4;
    if ((local_20 != (int *)0x0) && (local_18._1_1_ == '\0')) {
      if ((int *)local_20[2] < (int *)local_20[3]) {
        local_1c = *(int *)local_20[2];
      }
      else {
        local_1c = (**(code **)(*local_20 + 0x20))();
      }
      local_18 = CONCAT22(local_18._2_2_,0x100);
      local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
    }
    if ((local_2c != (int *)0x0) && (local_24._1_1_ == '\0')) {
      if ((int *)local_2c[2] < (int *)local_2c[3]) {
        iVar1 = *(int *)local_2c[2];
      }
      else {
        iVar1 = (**(code **)(*local_2c + 0x20))();
      }
      local_24 = (uint)(iVar1 == -1);
    }
    if ((local_18 & 0xff) != (local_24 & 0xff)) goto LAB_0003b0de;
    uVar2 = *param_10 | 2;
  }
  else {
    __aeabi_uidivmod(iVar1,0xc);
    *(undefined4 *)(param_11 + 0x10) = extraout_r1;
    uVar2 = 0;
  }
  *param_10 = uVar2;
LAB_0003b0de:
  *param_1 = local_20;
  param_1[1] = local_1c;
  param_1[2] = local_18;
  return;
}



### FUNC FUN_0003b0f8 @ 0003b0f8

void FUN_0003b0f8(undefined4 *param_1,undefined4 param_2,int *param_3,int param_4,uint param_5,
                 int *param_6,int param_7,uint param_8,undefined4 param_9,uint *param_10,
                 int param_11)

{
  int iVar1;
  uint uVar2;
  int *local_2c;
  int local_28;
  undefined4 local_24;
  int *local_20;
  int local_1c;
  undefined4 local_18;
  
  local_18 = param_5;
  local_28 = param_7;
  local_24 = param_8;
  local_2c = param_6;
  local_20 = param_3;
  local_1c = param_4;
  if ((param_3 != (int *)0x0) && ((param_5 & 0xff00) == 0)) {
    if ((int *)param_3[2] < (int *)param_3[3]) {
      local_1c = *(int *)param_3[2];
    }
    else {
      local_1c = (**(code **)(*param_3 + 0x20))(param_3);
    }
    local_18 = CONCAT22(local_18._2_2_,0x100);
    param_5 = (uint)(local_1c == -1);
    local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
  }
  if ((param_6 != (int *)0x0) && ((param_8 & 0xff00) == 0)) {
    if ((int *)param_6[2] < (int *)param_6[3]) {
      local_28 = *(int *)param_6[2];
    }
    else {
      local_28 = (**(code **)(*param_6 + 0x20))(param_6);
    }
    local_24 = CONCAT22(local_24._2_2_,0x100);
    param_8 = (uint)(local_28 == -1);
    local_24 = CONCAT31(local_24._1_3_,local_28 == -1);
  }
  if ((param_5 & 0xff) == (param_8 & 0xff)) {
    *param_10 = 6;
  }
  else {
    uVar2 = 0;
    iVar1 = FUN_0003b9cc(&local_20,&local_2c,param_11 + 0x14,0);
    *(int *)(param_11 + 0x14) = *(int *)(param_11 + 0x14) + -0x76c;
    if (iVar1 == 0) {
      uVar2 = 4;
    }
    *param_10 = uVar2;
    if ((local_20 != (int *)0x0) && (local_18._1_1_ == '\0')) {
      if ((int *)local_20[2] < (int *)local_20[3]) {
        local_1c = *(int *)local_20[2];
      }
      else {
        local_1c = (**(code **)(*local_20 + 0x20))();
      }
      local_18 = CONCAT22(local_18._2_2_,0x100);
      local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
    }
    if ((local_2c != (int *)0x0) && (local_24._1_1_ == '\0')) {
      if ((int *)local_2c[2] < (int *)local_2c[3]) {
        iVar1 = *(int *)local_2c[2];
      }
      else {
        iVar1 = (**(code **)(*local_2c + 0x20))();
      }
      local_24 = (uint)(iVar1 == -1);
    }
    if ((local_18 & 0xff) == (local_24 & 0xff)) {
      *param_10 = *param_10 | 2;
    }
  }
  *param_1 = local_20;
  param_1[1] = local_1c;
  param_1[2] = local_18;
  return;
}



### FUNC FUN_0003b248 @ 0003b248

void FUN_0003b248(facet *param_1)

{
  FUN_0003b28c(param_1 + 0xc);
  std::locale::facet::~facet(param_1);
  operator_delete(param_1);
  return;
}



### FUNC FUN_0003b28c @ 0003b28c

void FUN_0003b28c(int param_1)

{
  int *piVar1;
  uint uVar2;
  int *piVar3;
  int iVar4;
  int iVar5;
  
  piVar1 = *(int **)(param_1 + 0xbb4);
  if ((piVar1 != (int *)0x0) && (piVar1 != (int *)(param_1 + 0xb70))) {
    uVar2 = *(int *)(param_1 + 0xb70) - (int)piVar1;
    if (uVar2 < 0x81) {
      std::__node_alloc::_M_deallocate(piVar1,uVar2);
    }
    else {
      operator_delete(piVar1);
    }
  }
  piVar1 = *(int **)(param_1 + 0xb6c);
  if ((piVar1 != (int *)0x0) && (piVar1 != (int *)(param_1 + 0xb28))) {
    uVar2 = *(int *)(param_1 + 0xb28) - (int)piVar1;
    if (uVar2 < 0x81) {
      std::__node_alloc::_M_deallocate(piVar1,uVar2);
    }
    else {
      operator_delete(piVar1);
    }
  }
  iVar5 = 0;
  do {
    piVar3 = (int *)(param_1 + 0xae0 + iVar5);
    piVar1 = *(int **)(param_1 + 0xb24 + iVar5);
    if ((piVar1 != (int *)0x0) && (piVar3 != piVar1)) {
      uVar2 = *piVar3 - (int)piVar1;
      if (uVar2 < 0x81) {
        std::__node_alloc::_M_deallocate(piVar1,uVar2);
      }
      else {
        operator_delete(piVar1);
      }
    }
    iVar5 = iVar5 + -0x48;
  } while (iVar5 != -0x6c0);
  iVar5 = 0;
  do {
    iVar4 = param_1 + 0x3a8 + iVar5;
    piVar1 = *(int **)(iVar4 + 0xbc);
    piVar3 = (int *)(iVar4 + 0x78);
    if ((piVar1 != (int *)0x0) && (piVar3 != piVar1)) {
      uVar2 = *piVar3 - (int)piVar1;
      if (uVar2 < 0x81) {
        std::__node_alloc::_M_deallocate(piVar1,uVar2);
      }
      else {
        operator_delete(piVar1);
      }
    }
    iVar5 = iVar5 + -0x48;
  } while (iVar5 != -0x3f0);
  FUN_0003a204(param_1);
  return;
}



### FUNC FUN_0003b4cc @ 0003b4cc

char * FUN_0003b4cc(int *param_1,int param_2,undefined4 param_3,int *param_4,int param_5,
                   undefined4 param_6,char *param_7,char *param_8,undefined4 param_9,int param_10,
                   int param_11,uint *param_12,int *param_13)

{
  char *pcVar1;
  locale *this;
  int *piVar2;
  int *piVar3;
  int *piVar4;
  int iVar5;
  int iVar6;
  uint uVar7;
  char cVar8;
  int *piVar9;
  uint *puVar10;
  bool bVar11;
  locale alStack_30 [4];
  int *local_2c;
  int local_28;
  undefined4 local_24;
  int *local_20;
  int local_1c;
  undefined4 local_18;
  
  local_28 = param_5;
  local_24 = param_6;
  local_2c = param_4;
  local_20 = param_1;
  local_1c = param_2;
  local_18 = param_3;
  this = (locale *)std::locale::locale(alStack_30,(locale *)(param_11 + 0x20));
  piVar2 = (int *)std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  std::locale::~locale(alStack_30);
  piVar3 = param_13 + 5;
  piVar4 = param_13 + 2;
  puVar10 = (uint *)(param_13 + 4);
LAB_0003b53c:
  if ((local_20 != (int *)0x0) && (local_18._1_1_ == '\0')) {
    if ((int *)local_20[2] < (int *)local_20[3]) {
      local_1c = *(int *)local_20[2];
    }
    else {
      local_1c = (**(code **)(*local_20 + 0x20))();
    }
    local_18 = CONCAT22(local_18._2_2_,0x100);
    local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
  }
  if ((local_2c == (int *)0x0) || (local_24._1_1_ != '\0')) {
    cVar8 = (char)local_24;
  }
  else {
    if ((int *)local_2c[2] < (int *)local_2c[3]) {
      local_28 = *(int *)local_2c[2];
    }
    else {
      local_28 = (**(code **)(*local_2c + 0x20))();
    }
    local_24 = CONCAT22(local_24._2_2_,0x100);
    local_24 = CONCAT31(local_24._1_3_,local_28 == -1);
    cVar8 = local_28 == -1;
  }
  if (param_7 == param_8) {
    return param_7;
  }
  if ((byte)local_18 == cVar8) {
    return param_7;
  }
  if (*param_7 != '%') {
    if (local_18._1_1_ == '\0') {
      if ((int *)local_20[2] < (int *)local_20[3]) {
        local_1c = *(int *)local_20[2];
      }
      else {
        local_1c = (**(code **)(*local_20 + 0x20))();
      }
      local_18 = CONCAT22(local_18._2_2_,0x100);
      local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
    }
    iVar5 = local_1c;
    if ((uint)local_20[2] < (uint)local_20[3]) {
      local_20[2] = local_20[2] + 4;
    }
    else {
      (**(code **)(*local_20 + 0x24))();
    }
    local_18._0_2_ = (ushort)(byte)local_18;
    iVar6 = (**(code **)(*piVar2 + 0x28))(piVar2,*param_7);
    if (iVar5 != iVar6) {
      return param_7;
    }
    goto switchD_0003b5da_caseD_43;
  }
  cVar8 = param_7[1];
  pcVar1 = param_7 + 1;
  if (cVar8 == '#') {
    cVar8 = param_7[2];
    pcVar1 = param_7 + 2;
  }
  param_7 = pcVar1;
  iVar5 = 0;
  switch(cVar8) {
  case 'A':
    iVar5 = 7;
  case 'a':
    iVar5 = param_10 + iVar5 * 0x48;
    iVar5 = FUN_0003b804(&local_20,&local_2c,iVar5 + 0x78,iVar5 + 0x270);
    if (iVar5 == 7) {
      return param_7;
    }
    param_13[6] = iVar5;
    param_7 = param_7 + 1;
    goto LAB_0003b53c;
  case 'B':
    iVar5 = 0xc;
  case 'b':
    iVar5 = param_10 + iVar5 * 0x48;
    uVar7 = FUN_0003b804(&local_20,&local_2c,iVar5 + 0x468,iVar5 + 0x7c8);
    if (uVar7 == 0xc) {
      return param_7;
    }
    *puVar10 = uVar7;
    param_7 = param_7 + 1;
    goto LAB_0003b53c;
  default:
    goto switchD_0003b5da_caseD_43;
  case 'H':
  case 'I':
    piVar9 = piVar4;
    break;
  case 'M':
    piVar9 = param_13 + 1;
    break;
  case 'S':
    piVar9 = param_13;
    break;
  case 'Y':
    iVar5 = FUN_0003b9cc(&local_20,&local_2c,piVar3,0);
    *piVar3 = *piVar3 + -0x76c;
    goto LAB_0003b7a4;
  case 'd':
    iVar5 = FUN_0003b9cc(&local_20,&local_2c,param_13 + 3,0);
    if ((iVar5 != 1) || (0x1e < param_13[3] - 1U)) {
LAB_0003b7d2:
      *param_12 = *param_12 | 4;
      return param_7;
    }
    goto switchD_0003b5da_caseD_43;
  case 'j':
    piVar9 = param_13 + 7;
    break;
  case 'm':
    iVar5 = FUN_0003b9cc(&local_20,&local_2c,puVar10,0);
    uVar7 = *puVar10;
    *puVar10 = uVar7 - 1;
    if ((0xb < uVar7 - 1) || (iVar5 == 0)) goto LAB_0003b7d2;
    goto switchD_0003b5da_caseD_43;
  case 'p':
    iVar5 = FUN_0003b804(&local_20,&local_2c,param_10 + 0xb28,param_10 + 3000);
    if (iVar5 == 0) {
      if (*piVar4 != 0xc) goto switchD_0003b5da_caseD_43;
      *piVar4 = 0;
      param_7 = param_7 + 1;
    }
    else {
      if (iVar5 != 1) {
        bVar11 = iVar5 == 2;
        goto LAB_0003b7a6;
      }
      if (*piVar4 == 0xc) goto switchD_0003b5da_caseD_43;
      *piVar4 = *piVar4 + 0xc;
      param_7 = param_7 + 1;
    }
    goto LAB_0003b53c;
  case 'y':
    piVar9 = piVar3;
  }
  iVar5 = FUN_0003b9cc(&local_20,&local_2c,piVar9,0);
LAB_0003b7a4:
  bVar11 = iVar5 == 0;
LAB_0003b7a6:
  if (bVar11) {
    return param_7;
  }
switchD_0003b5da_caseD_43:
  param_7 = param_7 + 1;
  goto LAB_0003b53c;
}



### FUNC FUN_0003b804 @ 0003b804

int FUN_0003b804(int *param_1,int *param_2,int param_3,int param_4)

{
  int *piVar1;
  int iVar2;
  int *piVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  int iVar7;
  bool bVar8;
  char cVar9;
  int local_48;
  int local_44;
  int local_38;
  char local_2c [24];
  
  iVar6 = 0;
  local_2c[0x14] = '\0';
  local_2c[0x15] = '\0';
  local_2c[0x16] = '\0';
  local_2c[0x17] = '\0';
  local_2c[0x10] = '\0';
  local_2c[0x11] = '\0';
  local_2c[0x12] = '\0';
  local_2c[0x13] = '\0';
  local_2c[0xc] = '\0';
  local_2c[0xd] = '\0';
  local_2c[0xe] = '\0';
  local_2c[0xf] = '\0';
  local_2c[8] = '\0';
  local_2c[9] = '\0';
  local_2c[10] = '\0';
  local_2c[0xb] = '\0';
  local_2c[4] = '\0';
  local_2c[5] = '\0';
  local_2c[6] = '\0';
  local_2c[7] = '\0';
  local_2c[0] = '\0';
  local_2c[1] = '\0';
  local_2c[2] = '\0';
  local_2c[3] = '\0';
  bVar8 = *(char *)((int)param_1 + 9) == '\0';
  local_48 = (param_4 - param_3 >> 3) * 0x38e38e39;
  iVar7 = 0;
  iVar4 = local_48;
  local_38 = local_48;
  while( true ) {
    piVar1 = (int *)*param_1;
    if ((piVar1 != (int *)0x0) && (bVar8)) {
      if ((int *)piVar1[2] < (int *)piVar1[3]) {
        iVar2 = *(int *)piVar1[2];
      }
      else {
        iVar2 = (**(code **)(*piVar1 + 0x20))();
      }
      param_1[1] = iVar2;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar2 == -1;
    }
    piVar1 = (int *)*param_2;
    if ((piVar1 == (int *)0x0) || (*(char *)((int)param_2 + 9) != '\0')) {
      cVar9 = (char)param_2[2];
    }
    else {
      if ((int *)piVar1[2] < (int *)piVar1[3]) {
        iVar2 = *(int *)piVar1[2];
      }
      else {
        iVar2 = (**(code **)(*piVar1 + 0x20))();
      }
      param_2[1] = iVar2;
      *(undefined1 *)((int)param_2 + 9) = 1;
      cVar9 = iVar2 == -1;
      *(char *)(param_2 + 2) = cVar9;
    }
    if ((char)param_1[2] == cVar9) break;
    local_44 = iVar4;
    if (iVar7 < iVar4) {
      piVar1 = (int *)(param_3 + 0x44 + iVar7 * 0x48);
      iVar2 = iVar7;
      iVar5 = iVar7;
      do {
        if (local_2c[iVar5] == '\0') {
          if (*(char *)((int)param_1 + 9) == '\0') {
            piVar3 = (int *)*param_1;
            if ((int *)piVar3[2] < (int *)piVar3[3]) {
              iVar7 = *(int *)piVar3[2];
            }
            else {
              iVar7 = (**(code **)(*piVar3 + 0x20))();
            }
            param_1[1] = iVar7;
            *(undefined1 *)((int)param_1 + 9) = 1;
            *(bool *)(param_1 + 2) = iVar7 == -1;
          }
          else {
            iVar7 = param_1[1];
          }
          if (iVar7 == *(int *)(*piVar1 + iVar6 * 4)) {
            if (iVar6 == (piVar1[-1] - *piVar1 >> 2) + -1) {
              local_2c[iVar5] = '\x01';
              iVar7 = iVar2 + 1;
              if (iVar5 != iVar2) {
                iVar7 = iVar2;
              }
              local_38 = local_38 + -1;
              iVar2 = iVar7;
              local_48 = iVar5;
              if (local_38 == 0) {
                piVar1 = (int *)*param_1;
                if ((uint)piVar1[2] < (uint)piVar1[3]) {
                  piVar1[2] = piVar1[2] + 4;
                }
                else {
                  (**(code **)(*piVar1 + 0x24))();
                }
                *(undefined1 *)((int)param_1 + 9) = 0;
                return iVar5;
              }
            }
            local_44 = iVar5 + 1;
            iVar7 = iVar2;
          }
          else {
            local_2c[iVar5] = '\x01';
            iVar7 = iVar2 + 1;
            if (iVar5 != iVar2) {
              iVar7 = iVar2;
            }
            local_38 = local_38 + -1;
            if (local_38 == 0) {
              return local_48;
            }
          }
        }
        else {
          iVar7 = iVar2 + 1;
          if (iVar5 != iVar2) {
            iVar7 = iVar2;
          }
        }
        piVar1 = piVar1 + 0x12;
        iVar5 = iVar5 + 1;
        iVar2 = iVar7;
      } while (iVar5 < iVar4);
    }
    piVar1 = (int *)*param_1;
    if ((uint)piVar1[2] < (uint)piVar1[3]) {
      piVar1[2] = piVar1[2] + 4;
    }
    else {
      (**(code **)(*piVar1 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 9) = 0;
    iVar6 = iVar6 + 1;
    bVar8 = true;
    iVar4 = local_44;
  }
  return local_48;
}



### FUNC FUN_0003b9cc @ 0003b9cc

undefined4 FUN_0003b9cc(undefined4 param_1,undefined4 param_2,undefined4 param_3)

{
  undefined4 uVar1;
  undefined1 auStack_30 [4];
  uint local_2c [4];
  uint *local_1c;
  uint *local_18;
  
  local_1c = local_2c;
  local_2c[0] = local_2c[0] & 0xffffff00;
  local_18 = local_1c;
  uVar1 = FUN_0003ba48(param_1,param_2,10,param_3,0,0,0,local_1c,auStack_30);
  if ((local_18 != local_2c) && (local_18 != (uint *)0x0)) {
    if (local_2c[0] - (int)local_18 < 0x81) {
      std::__node_alloc::_M_deallocate(local_18,local_2c[0] - (int)local_18);
    }
    else {
      operator_delete(local_18);
    }
  }
  return uVar1;
}



### FUNC FUN_0003ba48 @ 0003ba48

uint FUN_0003ba48(int *param_1,int *param_2,int param_3,int *param_4,int param_5,int param_6,
                 uint param_7,int param_8)

{
  char cVar1;
  int iVar2;
  int iVar3;
  int *piVar4;
  int iVar5;
  uint uVar6;
  bool bVar7;
  int iVar8;
  int iVar9;
  char *pcVar10;
  char cVar11;
  int local_70;
  uint local_68;
  int local_5c;
  int local_58;
  char acStack_54 [64];
  
  iVar9 = *(int *)(param_8 + 0x10);
  iVar2 = *(int *)(param_8 + 0x14);
  local_5c = 0;
  cVar11 = *(char *)((int)param_1 + 9);
  local_68 = 1;
  iVar3 = __divsi3(0x7fffffff,param_3);
  local_70 = param_5;
  cVar1 = '\0';
  local_58 = 0;
  bVar7 = false;
  uVar6 = (uint)(cVar11 == '\0');
  while( true ) {
    pcVar10 = acStack_54 + local_5c;
    piVar4 = (int *)*param_1;
    if ((piVar4 != (int *)0x0) && (uVar6 != 0)) {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar5 = *(int *)piVar4[2];
      }
      else {
        iVar5 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = iVar5;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar5 == -1;
    }
    piVar4 = (int *)*param_2;
    if ((piVar4 == (int *)0x0) || (*(char *)((int)param_2 + 9) != '\0')) {
      cVar11 = (char)param_2[2];
    }
    else {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar5 = *(int *)piVar4[2];
      }
      else {
        iVar5 = (**(code **)(*piVar4 + 0x20))();
      }
      param_2[1] = iVar5;
      *(undefined1 *)((int)param_2 + 9) = 1;
      cVar11 = iVar5 == -1;
      *(char *)(param_2 + 2) = cVar11;
    }
    if ((char)param_1[2] == cVar11) break;
    if (*(char *)((int)param_1 + 9) == '\0') {
      piVar4 = (int *)*param_1;
      if ((uint *)piVar4[2] < (uint *)piVar4[3]) {
        uVar6 = *(uint *)piVar4[2];
      }
      else {
        uVar6 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = uVar6;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = uVar6 == 0xffffffff;
    }
    else {
      uVar6 = param_1[1];
    }
    iVar5 = local_58;
    if (uVar6 == param_7 && iVar2 != iVar9) {
      *pcVar10 = cVar1;
      local_5c = local_5c + 1;
      cVar1 = '\0';
    }
    else {
      iVar8 = 0xff;
      if (uVar6 < 0x80) {
        iVar8 = std::priv::__digit_val_table(uVar6);
      }
      if (param_3 <= iVar8) break;
      cVar1 = cVar1 + '\x01';
      local_70 = local_70 + 1;
      if (iVar3 < local_58) {
        bVar7 = true;
      }
      else {
        iVar5 = iVar8 + local_58 * param_3;
        bVar7 = (bool)(bVar7 | (local_58 != 0 && iVar5 <= local_58));
      }
    }
    piVar4 = (int *)*param_1;
    if ((uint)piVar4[2] < (uint)piVar4[3]) {
      piVar4[2] = piVar4[2] + 4;
    }
    else {
      (**(code **)(*piVar4 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 9) = 0;
    uVar6 = local_68;
    local_58 = iVar5;
  }
  if ((iVar2 != iVar9) && (local_5c != 0)) {
    *pcVar10 = cVar1;
    pcVar10 = acStack_54 + local_5c + 1;
  }
  uVar6 = 0;
  if (0 < local_70) {
    if (bVar7) {
      *param_4 = 0x7fffffff;
    }
    else {
      iVar3 = -local_58;
      if (param_6 == 0) {
        iVar3 = local_58;
      }
      *param_4 = iVar3;
      uVar6 = local_68;
      if (iVar2 != iVar9) {
        uVar6 = std::priv::__valid_grouping
                          (acStack_54,pcVar10,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10))
        ;
      }
    }
  }
  return uVar6;
}



### FUNC FUN_0003bc38 @ 0003bc38

void FUN_0003bc38(facet *param_1)

{
  FUN_0003b28c(param_1 + 0xc);
  std::locale::facet::~facet(param_1);
  return;
}



### FUNC FUN_0003bdfc @ 0003bdfc

void FUN_0003bdfc(facet *param_1)

{
  FUN_0003b28c(param_1 + 0xc);
  std::locale::facet::~facet(param_1);
  operator_delete(param_1);
  return;
}



### FUNC FUN_0003bf80 @ 0003bf80

/* WARNING: Removing unreachable block (ram,0x0003c6ba) */

void FUN_0003bf80(undefined4 *param_1,int *param_2,uint param_3,int *param_4,uint param_5,
                 int param_6,int param_7,uint *param_8,uint *param_9,char *param_10)

{
  uint *puVar1;
  uint *puVar2;
  uint uVar3;
  uint uVar4;
  locale *this;
  int *piVar5;
  int *piVar6;
  int *piVar7;
  undefined4 uVar8;
  undefined4 uVar9;
  int iVar10;
  undefined4 uVar11;
  char cVar12;
  int iVar13;
  int iVar14;
  uint uVar15;
  undefined4 local_104;
  int local_fc;
  uint local_c8;
  int *local_c4 [2];
  char local_bc;
  int *local_b8 [2];
  char local_b0;
  int local_ac [4];
  int *local_9c;
  int *local_98;
  int *local_94 [2];
  char local_8c;
  int local_88 [4];
  undefined4 local_78;
  int *local_74;
  uint local_70 [4];
  uint *local_60;
  uint *local_5c;
  int local_58 [4];
  byte *local_48;
  byte *local_44;
  int local_40 [4];
  byte *local_30;
  byte *local_2c;
  undefined4 local_28;
  locale alStack_24 [4];
  int *local_20;
  undefined4 local_1c;
  
  uVar3 = param_3 >> 8;
  local_20 = param_2;
  local_1c = param_3;
  if ((param_2 != (int *)0x0) && ((param_3 & 0xff0000) == 0)) {
    if ((byte *)param_2[2] < (byte *)param_2[3]) {
      uVar4 = (uint)*(byte *)param_2[2];
    }
    else {
      uVar4 = (**(code **)(*param_2 + 0x20))(param_2);
    }
    local_1c = CONCAT13(local_1c._3_1_,0x10000);
    uVar3 = (uint)(uVar4 == 0xffffffff);
    local_1c._0_2_ = CONCAT11(uVar4 == 0xffffffff,(char)uVar4);
  }
  if (((param_5 & 0xff0000) == 0) && (param_4 != (int *)0x0)) {
    if ((byte *)param_4[2] < (byte *)param_4[3]) {
      uVar4 = (uint)*(byte *)param_4[2];
    }
    else {
      uVar4 = (**(code **)(*param_4 + 0x20))(param_4);
    }
    param_5 = param_5 & 0xff000000 | uVar4 & 0xff | (uint)(uVar4 == 0xffffffff) << 8 | 0x10000;
  }
  if ((uVar3 & 0xff) == (param_5 >> 8 & 0xff)) {
    *param_8 = *param_8 | 2;
    *param_1 = local_20;
    param_1[1] = local_1c;
    return;
  }
  this = (locale *)std::locale::locale(alStack_24,(locale *)(param_7 + 0x20));
  piVar5 = (int *)std::locale::_M_use_facet(this,(id *)&std::moneypunct<char,false>::id);
  piVar6 = (int *)std::locale::_M_use_facet(alStack_24,(id *)&std::moneypunct<char,true>::id);
  piVar7 = (int *)std::locale::_M_use_facet(alStack_24,(id *)&std::ctype<char>::id);
  if (param_6 == 1) {
    local_28 = (**(code **)(*piVar6 + 0x28))();
    (**(code **)(*piVar6 + 0x1c))(local_40);
    (**(code **)(*piVar6 + 0x18))(local_58);
  }
  else {
    local_28 = (**(code **)(*piVar5 + 0x28))();
    (**(code **)(*piVar5 + 0x1c))(local_40);
    (**(code **)(*piVar5 + 0x18))(local_58);
  }
  uVar3 = *(uint *)(param_7 + 4);
  local_70[0] = local_70[0] & 0xffffff00;
  local_fc = 1;
  local_104 = 0;
  iVar14 = -1;
  local_c8 = param_5;
  local_60 = local_70;
  local_5c = local_70;
  do {
    switch(alStack_24[iVar14 + -3]) {
    case (locale)0x0:
      cVar12 = local_1c._2_1_;
      while( true ) {
        if ((local_20 != (int *)0x0) && (cVar12 == '\0')) {
          if ((byte *)local_20[2] < (byte *)local_20[3]) {
            uVar4 = (uint)*(byte *)local_20[2];
          }
          else {
            uVar4 = (**(code **)(*local_20 + 0x20))();
          }
          local_1c = CONCAT13(local_1c._3_1_,0x10000);
          local_1c._0_2_ = CONCAT11(uVar4 == 0xffffffff,(char)uVar4);
        }
        if (((local_c8 & 0xff0000) == 0) && (param_4 != (int *)0x0)) {
          if ((byte *)param_4[2] < (byte *)param_4[3]) {
            uVar4 = (uint)*(byte *)param_4[2];
          }
          else {
            uVar4 = (**(code **)(*param_4 + 0x20))(param_4);
          }
          local_c8 = local_c8 & 0xff000000 | uVar4 & 0xff | (uint)(uVar4 == 0xffffffff) << 8 |
                     0x10000;
        }
        if ((local_1c >> 8 & 0xff) == (local_c8 >> 8 & 0xff)) break;
        if (local_1c._2_1_ == '\0') {
          if ((byte *)local_20[2] < (byte *)local_20[3]) {
            uVar4 = (uint)*(byte *)local_20[2];
          }
          else {
            uVar4 = (**(code **)(*local_20 + 0x20))();
          }
          local_1c = CONCAT13(local_1c._3_1_,0x10000);
          local_1c._0_2_ = CONCAT11(uVar4 == 0xffffffff,(char)uVar4);
        }
        else {
          uVar4 = local_1c & 0xff;
        }
        if ((*(byte *)(piVar7[3] + (uVar4 & 0xff) * 4) & 1) == 0) break;
        uVar4 = local_20[2];
        if (uVar4 < (uint)local_20[3]) {
LAB_0003c498:
          local_20[2] = uVar4 + 1;
        }
        else {
          (**(code **)(*local_20 + 0x24))();
        }
LAB_0003c49c:
        local_1c._0_3_ = (uint3)(ushort)local_1c;
        cVar12 = '\0';
      }
      break;
    case (locale)0x1:
      if (local_1c._2_1_ == '\0') {
        if ((byte *)local_20[2] < (byte *)local_20[3]) {
          uVar4 = (uint)*(byte *)local_20[2];
        }
        else {
          uVar4 = (**(code **)(*local_20 + 0x20))();
        }
        local_1c = CONCAT13(local_1c._3_1_,0x10000);
        local_1c._0_2_ = CONCAT11(uVar4 == 0xffffffff,(char)uVar4);
      }
      else {
        uVar4 = local_1c & 0xff;
      }
      uVar15 = 4;
      if ((*(byte *)(piVar7[3] + (uVar4 & 0xff) * 4) & 1) != 0) {
        uVar4 = local_20[2];
        if (uVar4 < (uint)local_20[3]) goto LAB_0003c498;
        (**(code **)(*local_20 + 0x24))();
        goto LAB_0003c49c;
      }
      goto LAB_0003c750;
    case (locale)0x2:
      if (param_6 == 1) {
        (**(code **)(*piVar6 + 0x14))(local_88);
      }
      else {
        (**(code **)(*piVar5 + 0x14))(local_88);
      }
      FUN_0003c914(local_94,local_20,local_1c,param_4,local_c8,local_74,local_78);
      if (((uVar3 & 0x200) != 0) && (local_8c == '\0')) {
        *param_8 = 4;
      }
      local_1c._0_3_ = (uint3)local_94[1];
      local_20 = local_94[0];
      if ((local_74 != local_88) && (local_74 != (int *)0x0)) {
        if ((uint)(local_88[0] - (int)local_74) < 0x81) {
          std::__node_alloc::_M_deallocate(local_74,local_88[0] - (int)local_74);
        }
        else {
          operator_delete(local_74);
        }
      }
      break;
    case (locale)0x3:
      if ((local_20 != (int *)0x0) && (local_1c._2_1_ == '\0')) {
        if ((byte *)local_20[2] < (byte *)local_20[3]) {
          uVar4 = (uint)*(byte *)local_20[2];
        }
        else {
          uVar4 = (**(code **)(*local_20 + 0x20))();
        }
        local_1c = CONCAT13(local_1c._3_1_,0x10000);
        local_1c._0_2_ = CONCAT11(uVar4 == 0xffffffff,(char)uVar4);
      }
      if (((local_c8 & 0xff0000) == 0) && (param_4 != (int *)0x0)) {
        if ((byte *)param_4[2] < (byte *)param_4[3]) {
          uVar4 = (uint)*(byte *)param_4[2];
        }
        else {
          uVar4 = (**(code **)(*param_4 + 0x20))(param_4);
        }
        local_c8 = local_c8 & 0xff000000 | uVar4 & 0xff | (uint)(uVar4 == 0xffffffff) << 8 | 0x10000
        ;
      }
      if ((local_1c >> 8 & 0xff) == (local_c8 >> 8 & 0xff)) {
        if (local_44 != local_48) {
          uVar15 = 4;
          if (local_2c != local_30) goto LAB_0003c750;
          *param_10 = '\0';
        }
      }
      else if (local_44 == local_48) {
        if (local_2c != local_30) {
          if (local_1c._2_1_ == '\0') {
            if ((byte *)local_20[2] < (byte *)local_20[3]) {
              uVar4 = (uint)*(byte *)local_20[2];
            }
            else {
              uVar4 = (**(code **)(*local_20 + 0x20))();
            }
            local_1c = CONCAT13(local_1c._3_1_,0x10000);
            local_1c._0_2_ = CONCAT11(uVar4 == 0xffffffff,(char)uVar4);
          }
          else {
            uVar4 = local_1c & 0xff;
          }
          if ((uVar4 & 0xff) == (uint)*local_2c) {
            uVar4 = local_20[2];
            if (uVar4 < (uint)local_20[3]) goto LAB_0003c480;
            (**(code **)(*local_20 + 0x24))();
            goto LAB_0003c48c;
          }
        }
      }
      else {
        if (local_1c._2_1_ == '\0') {
          if ((byte *)local_20[2] < (byte *)local_20[3]) {
            uVar4 = (uint)*(byte *)local_20[2];
          }
          else {
            uVar4 = (**(code **)(*local_20 + 0x20))();
          }
          local_1c = CONCAT13(local_1c._3_1_,0x10000);
          local_1c._0_2_ = CONCAT11(uVar4 == 0xffffffff,(char)uVar4);
        }
        else {
          uVar4 = local_1c & 0xff;
        }
        if ((uVar4 & 0xff) == (uint)*local_44) {
          if ((uint)local_20[2] < (uint)local_20[3]) {
            local_20[2] = local_20[2] + 1;
          }
          else {
            (**(code **)(*local_20 + 0x24))();
          }
          local_1c._0_3_ = (uint3)(ushort)local_1c;
        }
        else if (local_2c != local_30) {
          uVar15 = 4;
          if ((uVar4 & 0xff) != (uint)*local_2c) goto LAB_0003c750;
          uVar4 = local_20[2];
          if (uVar4 < (uint)local_20[3]) {
LAB_0003c480:
            local_20[2] = uVar4 + 1;
          }
          else {
            (**(code **)(*local_20 + 0x24))();
          }
LAB_0003c48c:
          local_1c._0_3_ = (uint3)(ushort)local_1c;
          *param_10 = '\0';
        }
      }
      break;
    case (locale)0x4:
      if (param_6 == 1) {
        uVar11 = (**(code **)(*piVar6 + 8))();
        uVar8 = (**(code **)(*piVar6 + 0x20))();
        (**(code **)(*piVar6 + 0x10))(local_ac);
      }
      else {
        uVar11 = (**(code **)(*piVar5 + 8))();
        uVar8 = (**(code **)(*piVar5 + 0x20))();
        (**(code **)(*piVar5 + 0x10))(local_ac);
      }
      local_88[0] = CONCAT31(local_88[0]._1_3_,1);
      uVar9 = local_104;
      if (local_98 != local_9c) {
        if (param_6 == 1) {
          uVar9 = (**(code **)(*piVar6 + 0xc))();
        }
        else {
          uVar9 = (**(code **)(*piVar5 + 0xc))();
        }
      }
      iVar10 = FUN_0003ca78(&local_20,param_4,local_c8,local_70,piVar7,uVar11,uVar8,uVar9,local_ac,
                            local_88);
      if ((char)local_88[0] == '\0') {
        *param_8 = *param_8 | 4;
      }
      iVar13 = 5;
      if (iVar10 == 0) {
        *param_8 = 4;
        *param_1 = local_20;
        param_1[1] = local_1c;
        iVar13 = local_fc;
      }
      if ((local_98 != local_ac) && (local_98 != (int *)0x0)) {
        if ((uint)(local_ac[0] - (int)local_98) < 0x81) {
          std::__node_alloc::_M_deallocate(local_98,local_ac[0] - (int)local_98);
        }
        else {
          operator_delete(local_98);
        }
      }
      if (iVar13 != 5) goto LAB_0003c75c;
    }
    iVar14 = iVar14 + 1;
  } while (iVar14 < 3);
  if (*param_10 == '\0') {
    if (1 < (uint)((int)local_30 - (int)local_2c)) {
      FUN_0003c914(local_c4,local_20,local_1c,param_4,local_c8,local_2c + 1,local_30);
      local_1c._0_3_ = (uint3)local_c4[1];
      local_20 = local_c4[0];
      if (local_bc == '\0') {
        *param_8 = *param_8 | 4;
      }
    }
    if (-1 < (int)((uint)(byte)*param_8 << 0x1d)) {
      uVar11 = (**(code **)(*piVar7 + 0x18))(piVar7,0x2d);
      FUN_0003d0a8(param_9,1,uVar11);
      FUN_00037294(param_9,local_5c,local_60);
    }
  }
  else {
    if (1 < (uint)((int)local_48 - (int)local_44)) {
      FUN_0003c914(local_b8,local_20,local_1c,param_4,local_c8,local_44 + 1,local_48);
      local_1c._0_3_ = (uint3)local_b8[1];
      local_20 = local_b8[0];
      if (local_b0 == '\0') {
        *param_8 = *param_8 | 4;
      }
    }
    puVar2 = local_5c;
    puVar1 = local_60;
    if ((local_70 != param_9) && ((*param_8 & 4) == 0)) {
      uVar15 = (int)local_60 - (int)local_5c;
      uVar4 = param_9[4];
      uVar3 = param_9[5];
      if (uVar4 - uVar3 < uVar15) {
        if (uVar4 != uVar3) {
          __aeabi_memmove();
          uVar4 = param_9[4];
          uVar3 = param_9[5];
        }
        FUN_00037294(param_9,(int)puVar2 + (uVar4 - uVar3),puVar1);
      }
      else {
        if (uVar15 != 0) {
          __aeabi_memmove(uVar3,local_5c,uVar15);
          uVar4 = param_9[4];
          uVar3 = param_9[5];
        }
        uVar3 = uVar3 + uVar15;
        if (uVar3 != uVar4) {
          __aeabi_memmove(uVar3,uVar4);
          param_9[4] = param_9[4] + (uVar3 - uVar4);
        }
      }
    }
  }
  if ((local_20 != (int *)0x0) && (local_1c._2_1_ == '\0')) {
    if ((byte *)local_20[2] < (byte *)local_20[3]) {
      uVar3 = (uint)*(byte *)local_20[2];
    }
    else {
      uVar3 = (**(code **)(*local_20 + 0x20))();
    }
    local_1c = CONCAT13(local_1c._3_1_,0x10000);
    local_1c._0_2_ = CONCAT11(uVar3 == 0xffffffff,(char)uVar3);
  }
  if (((local_c8 & 0xff0000) == 0) && (param_4 != (int *)0x0)) {
    if ((byte *)param_4[2] < (byte *)param_4[3]) {
      uVar3 = (uint)*(byte *)param_4[2];
    }
    else {
      uVar3 = (**(code **)(*param_4 + 0x20))();
    }
    local_c8 = (uint)(uVar3 == 0xffffffff) << 8;
  }
  if ((local_1c >> 8 & 0xff) == (local_c8 >> 8 & 0xff)) {
    uVar15 = *param_8 | 2;
LAB_0003c750:
    *param_8 = uVar15;
  }
  *param_1 = local_20;
  param_1[1] = local_1c;
LAB_0003c75c:
  if ((local_5c != local_70) && (local_5c != (uint *)0x0)) {
    if (local_70[0] - (int)local_5c < 0x81) {
      std::__node_alloc::_M_deallocate(local_5c,local_70[0] - (int)local_5c);
    }
    else {
      operator_delete(local_5c);
    }
  }
  if ((local_44 != (byte *)local_58) && (local_44 != (byte *)0x0)) {
    if ((uint)(local_58[0] - (int)local_44) < 0x81) {
      std::__node_alloc::_M_deallocate(local_44,local_58[0] - (int)local_44);
    }
    else {
      operator_delete(local_44);
    }
  }
  if ((local_2c != (byte *)local_40) && (local_2c != (byte *)0x0)) {
    if ((uint)(local_40[0] - (int)local_2c) < 0x81) {
      std::__node_alloc::_M_deallocate(local_2c,local_40[0] - (int)local_2c);
    }
    else {
      operator_delete(local_2c);
    }
  }
  std::locale::~locale(alStack_24);
  return;
}



### FUNC FUN_0003c898 @ 0003c898

undefined4 FUN_0003c898(undefined4 param_1,undefined4 param_2,undefined4 param_3)

{
  undefined4 uVar1;
  undefined1 auStack_30 [4];
  uint local_2c [4];
  uint *local_1c;
  uint *local_18;
  
  local_1c = local_2c;
  local_2c[0] = local_2c[0] & 0xffffff00;
  local_18 = local_1c;
  uVar1 = FUN_0003d350(param_1,param_2,10,param_3,0,0,0,local_1c,auStack_30);
  if ((local_18 != local_2c) && (local_18 != (uint *)0x0)) {
    if (local_2c[0] - (int)local_18 < 0x81) {
      std::__node_alloc::_M_deallocate(local_18,local_2c[0] - (int)local_18);
    }
    else {
      operator_delete(local_18);
    }
  }
  return uVar1;
}



### FUNC FUN_0003c914 @ 0003c914

void FUN_0003c914(undefined4 *param_1,int *param_2,uint param_3,int *param_4,uint param_5,
                 byte *param_6,byte *param_7)

{
  uint uVar1;
  uint uVar2;
  bool bVar3;
  byte *local_18;
  
  local_18 = param_6;
  while( true ) {
    if ((param_2 != (int *)0x0) && ((param_3 & 0xff0000) == 0)) {
      if ((byte *)param_2[2] < (byte *)param_2[3]) {
        uVar1 = (uint)*(byte *)param_2[2];
      }
      else {
        uVar1 = (**(code **)(*param_2 + 0x20))(param_2);
      }
      param_3 = param_3 & 0xff000000 | uVar1 & 0xff | (uint)(uVar1 == 0xffffffff) << 8 | 0x10000;
    }
    if ((param_4 != (int *)0x0) && ((param_5 & 0xff0000) == 0)) {
      if ((byte *)param_4[2] < (byte *)param_4[3]) {
        uVar1 = (uint)*(byte *)param_4[2];
      }
      else {
        uVar1 = (**(code **)(*param_4 + 0x20))(param_4);
      }
      param_5 = (uint)(uVar1 == 0xffffffff) << 8 | 0x10000;
    }
    bVar3 = param_7 == local_18;
    if ((param_7 == local_18) || ((param_3 >> 8 & 0xff) == (param_5 >> 8 & 0xff))) break;
    uVar1 = param_3;
    if ((param_3 & 0xff0000) == 0) {
      if ((byte *)param_2[2] < (byte *)param_2[3]) {
        uVar1 = (uint)*(byte *)param_2[2];
      }
      else {
        uVar1 = (**(code **)(*param_2 + 0x20))(param_2);
      }
      uVar2 = param_3 & 0xff000000;
      param_3 = uVar1;
      uVar1 = uVar2 | uVar1 & 0xff | (uint)(uVar1 == 0xffffffff) << 8 | 0x10000;
    }
    uVar2 = param_3 & 0xff;
    bVar3 = false;
    param_3 = uVar1;
    if (*local_18 != uVar2) break;
    if ((uint)param_2[2] < (uint)param_2[3]) {
      param_2[2] = param_2[2] + 1;
    }
    else {
      (**(code **)(*param_2 + 0x24))(param_2);
    }
    param_3 = uVar1 & 0xff00ffff;
    local_18 = local_18 + 1;
  }
  *param_1 = param_2;
  param_1[1] = param_3;
  *(bool *)(param_1 + 2) = bVar3;
  return;
}



### FUNC FUN_0003ca78 @ 0003ca78

undefined4
FUN_0003ca78(int *param_1,int *param_2,uint param_3,undefined4 *param_4,int param_5,uint param_6,
            int param_7,uint param_8,int param_9,char *param_10)

{
  char cVar1;
  int *piVar2;
  uint uVar3;
  undefined4 *puVar4;
  int iVar5;
  uint uVar6;
  char *pcVar7;
  uint uVar8;
  uint uVar9;
  char *pcVar10;
  uint uVar11;
  char *pcVar12;
  undefined4 *puVar13;
  char *pcVar14;
  char *local_d0;
  int local_c4;
  uint local_a0;
  char local_94 [128];
  
  piVar2 = (int *)*param_1;
  if ((piVar2 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
    if ((byte *)piVar2[2] < (byte *)piVar2[3]) {
      uVar3 = (uint)*(byte *)piVar2[2];
    }
    else {
      uVar3 = (**(code **)(*piVar2 + 0x20))();
    }
    *(char *)(param_1 + 1) = (char)uVar3;
    *(undefined1 *)((int)param_1 + 6) = 1;
    *(bool *)((int)param_1 + 5) = uVar3 == 0xffffffff;
  }
  if (((param_3 << 8) >> 0x18 == 0) && (param_2 != (int *)0x0)) {
    if ((byte *)param_2[2] < (byte *)param_2[3]) {
      uVar3 = (uint)*(byte *)param_2[2];
    }
    else {
      uVar3 = (**(code **)(*param_2 + 0x20))(param_2);
    }
    param_3 = (uint)(uVar3 == 0xffffffff) << 8 | 0x10000;
  }
  if ((uint)*(byte *)((int)param_1 + 5) == (param_3 >> 8 & 0xff)) {
    return 0;
  }
  if (*(char *)((int)param_1 + 6) == '\0') {
    piVar2 = (int *)*param_1;
    if ((byte *)piVar2[2] < (byte *)piVar2[3]) {
      uVar3 = (uint)*(byte *)piVar2[2];
    }
    else {
      uVar3 = (**(code **)(*piVar2 + 0x20))();
    }
    *(char *)(param_1 + 1) = (char)uVar3;
    *(undefined1 *)((int)param_1 + 6) = 1;
    *(bool *)((int)param_1 + 5) = uVar3 == 0xffffffff;
  }
  else {
    uVar3 = (uint)*(byte *)(param_1 + 1);
  }
  if (-1 < (int)((uint)*(byte *)(*(int *)(param_5 + 0xc) + (uVar3 & 0xff) * 4) << 0x19)) {
    return 0;
  }
  local_d0 = (char *)0x0;
  if (*(int *)(param_9 + 0x14) != *(int *)(param_9 + 0x10)) {
    local_d0 = local_94;
  }
  local_c4 = param_7;
  puVar4 = param_4 + 4;
  while( true ) {
    cVar1 = '\0';
    while( true ) {
      piVar2 = (int *)*param_1;
      if ((piVar2 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
        if ((byte *)piVar2[2] < (byte *)piVar2[3]) {
          uVar3 = (uint)*(byte *)piVar2[2];
        }
        else {
          uVar3 = (**(code **)(*piVar2 + 0x20))();
        }
        *(char *)(param_1 + 1) = (char)uVar3;
        *(undefined1 *)((int)param_1 + 6) = 1;
        *(bool *)((int)param_1 + 5) = uVar3 == 0xffffffff;
      }
      local_a0 = 0xfffffffe;
      if (((param_3 & 0xff0000) == 0) && (param_2 != (int *)0x0)) {
        if ((byte *)param_2[2] < (byte *)param_2[3]) {
          uVar3 = (uint)*(byte *)param_2[2];
        }
        else {
          uVar3 = (**(code **)(*param_2 + 0x20))(param_2);
        }
        param_3 = (uint)(uVar3 == 0xffffffff) << 8 | 0x10000;
      }
      pcVar7 = local_d0;
      if ((uint)*(byte *)((int)param_1 + 5) == (param_3 >> 8 & 0xff)) goto LAB_0003cd28;
      if (*(char *)((int)param_1 + 6) == '\0') {
        piVar2 = (int *)*param_1;
        if ((byte *)piVar2[2] < (byte *)piVar2[3]) {
          uVar3 = (uint)*(byte *)piVar2[2];
        }
        else {
          uVar3 = (**(code **)(*piVar2 + 0x20))();
        }
        *(char *)(param_1 + 1) = (char)uVar3;
        *(undefined1 *)((int)param_1 + 6) = 1;
        *(bool *)((int)param_1 + 5) = uVar3 == 0xffffffff;
      }
      else {
        uVar3 = (uint)*(byte *)(param_1 + 1);
      }
      if (-1 < (int)((uint)*(byte *)(*(int *)(param_5 + 0xc) + (uVar3 & 0xff) * 4) << 0x19)) break;
      cVar1 = cVar1 + '\x01';
      piVar2 = (int *)*param_1;
      if ((uint)piVar2[2] < (uint)piVar2[3]) {
        piVar2[2] = piVar2[2] + 1;
      }
      else {
        (**(code **)(*piVar2 + 0x24))();
      }
      *(undefined1 *)((int)param_1 + 6) = 0;
      if ((undefined4 *)param_4[5] == param_4) {
        iVar5 = param_4[4];
        puVar13 = puVar4;
      }
      else {
        iVar5 = param_4[4];
        puVar13 = (undefined4 *)*param_4;
      }
      if ((int)puVar13 - iVar5 == 1) {
        uVar6 = iVar5 - (int)param_4[5];
        if (uVar6 == 0xfffffffe) {
                    /* WARNING: Subroutine does not return */
          std::__stl_throw_length_error("basic_string");
        }
        uVar8 = uVar6;
        if (uVar6 < 2) {
          uVar8 = 1;
        }
        uVar9 = uVar6 + uVar8 + 1;
        uVar11 = 0xfffffffe;
        if (uVar6 <= uVar9) {
          uVar11 = uVar9;
        }
        if (uVar6 + uVar8 != -2) {
          local_a0 = uVar11;
        }
        FUN_0003d024(param_4,local_a0);
        iVar5 = param_4[4];
      }
      *(undefined1 *)(iVar5 + 1) = 0;
      *(char *)param_4[4] = (char)uVar3;
      param_4[4] = param_4[4] + 1;
    }
    pcVar7 = (char *)0x0;
    if ((local_d0 == (char *)0x0) || (pcVar7 = local_d0, (uVar3 & 0xff) != param_8)) break;
    *local_d0 = cVar1;
    local_d0 = local_d0 + 1;
    piVar2 = (int *)*param_1;
    if ((uint)piVar2[2] < (uint)piVar2[3]) {
      piVar2[2] = piVar2[2] + 1;
    }
    else {
      (**(code **)(*piVar2 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 6) = 0;
  }
LAB_0003cd28:
  pcVar14 = *(char **)(param_9 + 0x10);
  pcVar12 = *(char **)(param_9 + 0x14);
  if (pcVar12 == pcVar14) {
    *param_10 = '\x01';
LAB_0003ce0e:
    piVar2 = (int *)*param_1;
    if ((uint)piVar2[2] < (uint)piVar2[3]) {
      piVar2[2] = piVar2[2] + 1;
    }
    else {
      (**(code **)(*piVar2 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 6) = 0;
    while( true ) {
      piVar2 = (int *)*param_1;
      if ((piVar2 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
        if ((byte *)piVar2[2] < (byte *)piVar2[3]) {
          uVar3 = (uint)*(byte *)piVar2[2];
        }
        else {
          uVar3 = (**(code **)(*piVar2 + 0x20))();
        }
        *(char *)(param_1 + 1) = (char)uVar3;
        *(undefined1 *)((int)param_1 + 6) = 1;
        *(bool *)((int)param_1 + 5) = uVar3 == 0xffffffff;
      }
      if (((param_3 & 0xff0000) == 0) && (param_2 != (int *)0x0)) {
        if ((byte *)param_2[2] < (byte *)param_2[3]) {
          uVar3 = (uint)*(byte *)param_2[2];
        }
        else {
          uVar3 = (**(code **)(*param_2 + 0x20))(param_2);
        }
        param_3 = (uint)(uVar3 == 0xffffffff) << 8 | 0x10000;
      }
      if ((uint)*(byte *)((int)param_1 + 5) == (param_3 >> 8 & 0xff)) break;
      if (*(char *)((int)param_1 + 6) == '\0') {
        piVar2 = (int *)*param_1;
        if ((byte *)piVar2[2] < (byte *)piVar2[3]) {
          uVar3 = (uint)*(byte *)piVar2[2];
        }
        else {
          uVar3 = (**(code **)(*piVar2 + 0x20))();
        }
        *(char *)(param_1 + 1) = (char)uVar3;
        *(undefined1 *)((int)param_1 + 6) = 1;
        *(bool *)((int)param_1 + 5) = uVar3 == 0xffffffff;
      }
      else {
        uVar3 = (uint)*(byte *)(param_1 + 1);
      }
      if (-1 < (int)((uint)*(byte *)(*(int *)(param_5 + 0xc) + (uVar3 & 0xff) * 4) << 0x19)) break;
      piVar2 = (int *)*param_1;
      if ((uint)piVar2[2] < (uint)piVar2[3]) {
        piVar2[2] = piVar2[2] + 1;
      }
      else {
        (**(code **)(*piVar2 + 0x24))();
      }
      *(undefined1 *)((int)param_1 + 6) = 0;
      if ((undefined4 *)param_4[5] == param_4) {
        iVar5 = param_4[4];
        puVar13 = puVar4;
      }
      else {
        iVar5 = param_4[4];
        puVar13 = (undefined4 *)*param_4;
      }
      if ((int)puVar13 - iVar5 == 1) {
        uVar6 = iVar5 - (int)param_4[5];
        if (uVar6 == 0xfffffffe) {
                    /* WARNING: Subroutine does not return */
          std::__stl_throw_length_error("basic_string");
        }
        uVar8 = uVar6;
        if (uVar6 < 2) {
          uVar8 = 1;
        }
        uVar9 = uVar6 + uVar8 + 1;
        uVar11 = local_a0;
        if (uVar6 <= uVar9) {
          uVar11 = uVar9;
        }
        uVar9 = local_a0;
        if (uVar6 + uVar8 != -2) {
          uVar9 = uVar11;
        }
        FUN_0003d024(param_4,uVar9);
        iVar5 = param_4[4];
      }
      *(undefined1 *)(iVar5 + 1) = 0;
      *(char *)param_4[4] = (char)uVar3;
      param_4[4] = param_4[4] + 1;
      local_c4 = local_c4 + -1;
    }
    *param_10 = local_c4 == 0 && *param_10 != '\0';
  }
  else {
    pcVar10 = local_94;
    if (pcVar7 != pcVar10) {
      *pcVar7 = cVar1;
      pcVar10 = pcVar7 + 1;
      pcVar14 = *(char **)(param_9 + 0x10);
      pcVar12 = *(char **)(param_9 + 0x14);
    }
    cVar1 = std::priv::__valid_grouping(local_94,pcVar10,pcVar12,pcVar14);
    *param_10 = cVar1;
    piVar2 = (int *)*param_1;
    if ((piVar2 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
      if ((byte *)piVar2[2] < (byte *)piVar2[3]) {
        uVar3 = (uint)*(byte *)piVar2[2];
      }
      else {
        uVar3 = (**(code **)(*piVar2 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar3;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar3 == 0xffffffff;
    }
    if (((param_3 & 0xff0000) == 0) && (param_2 != (int *)0x0)) {
      if ((byte *)param_2[2] < (byte *)param_2[3]) {
        uVar3 = (uint)*(byte *)param_2[2];
      }
      else {
        uVar3 = (**(code **)(*param_2 + 0x20))(param_2);
      }
      param_3 = (uint)(uVar3 == 0xffffffff) << 8 | 0x10000;
    }
    if ((uint)*(byte *)((int)param_1 + 5) != (param_3 >> 8 & 0xff)) {
      if (*(char *)((int)param_1 + 6) == '\0') {
        piVar2 = (int *)*param_1;
        if ((byte *)piVar2[2] < (byte *)piVar2[3]) {
          uVar3 = (uint)*(byte *)piVar2[2];
        }
        else {
          uVar3 = (**(code **)(*piVar2 + 0x20))();
        }
        *(char *)(param_1 + 1) = (char)uVar3;
        *(undefined1 *)((int)param_1 + 6) = 1;
        *(bool *)((int)param_1 + 5) = uVar3 == 0xffffffff;
      }
      else {
        uVar3 = (uint)*(byte *)(param_1 + 1);
      }
      if ((uVar3 & 0xff) == param_6) goto LAB_0003ce0e;
    }
    if (param_7 != 0) {
      do {
        if ((undefined4 *)param_4[5] == param_4) {
          iVar5 = param_4[4];
          puVar13 = puVar4;
        }
        else {
          iVar5 = param_4[4];
          puVar13 = (undefined4 *)*param_4;
        }
        if ((int)puVar13 - iVar5 == 1) {
          uVar3 = iVar5 - (int)param_4[5];
          if (uVar3 == 0xfffffffe) {
                    /* WARNING: Subroutine does not return */
            std::__stl_throw_length_error("basic_string");
          }
          uVar6 = uVar3;
          if (uVar3 < 2) {
            uVar6 = 1;
          }
          uVar11 = uVar3 + uVar6 + 1;
          uVar8 = local_a0;
          if (uVar3 <= uVar11) {
            uVar8 = uVar11;
          }
          uVar11 = local_a0;
          if (uVar3 + uVar6 != -2) {
            uVar11 = uVar8;
          }
          FUN_0003d024(param_4,uVar11);
          iVar5 = param_4[4];
        }
        *(undefined1 *)(iVar5 + 1) = 0;
        *(undefined1 *)param_4[4] = 0x30;
        param_4[4] = param_4[4] + 1;
        param_7 = param_7 + -1;
      } while (param_7 != 0);
    }
  }
  return 1;
}



### FUNC FUN_0003d024 @ 0003d024

void FUN_0003d024(int *param_1,uint param_2)

{
  undefined1 *puVar1;
  undefined1 *puVar2;
  int *piVar3;
  int iVar4;
  uint uVar5;
  undefined1 *puVar6;
  uint local_18;
  
  uVar5 = 0;
  if (param_2 == 0) {
    puVar1 = (undefined1 *)0x0;
  }
  else {
    local_18 = param_2;
    if (param_2 < 0x81) {
      puVar1 = (undefined1 *)std::__node_alloc::_M_allocate(&local_18);
      uVar5 = local_18;
    }
    else {
      puVar1 = (undefined1 *)operator_new(param_2);
      uVar5 = param_2;
    }
  }
  puVar2 = (undefined1 *)param_1[5];
  puVar6 = puVar1;
  if (0 < param_1[4] - (int)puVar2) {
    iVar4 = (param_1[4] + 1) - (int)puVar2;
    do {
      *puVar6 = *puVar2;
      iVar4 = iVar4 + -1;
      puVar6 = puVar6 + 1;
      puVar2 = puVar2 + 1;
    } while (1 < iVar4);
  }
  *puVar6 = 0;
  piVar3 = (int *)param_1[5];
  if ((piVar3 != param_1) && (piVar3 != (int *)0x0)) {
    if ((uint)(*param_1 - (int)piVar3) < 0x81) {
      std::__node_alloc::_M_deallocate(piVar3,*param_1 - (int)piVar3);
    }
    else {
      operator_delete(piVar3);
    }
  }
  param_1[4] = (int)puVar6;
  param_1[5] = (int)puVar1;
  *param_1 = (int)(puVar1 + uVar5);
  return;
}



### FUNC FUN_0003d0a8 @ 0003d0a8

int * FUN_0003d0a8(int *param_1,uint param_2,undefined4 param_3)

{
  int *piVar1;
  undefined1 *puVar2;
  uint uVar3;
  undefined1 *puVar4;
  int local_30 [4];
  int *local_20;
  int *local_1c;
  uint local_18;
  
  piVar1 = (int *)param_1[5];
  if (param_2 <= (uint)(param_1[4] - (int)piVar1)) {
    __aeabi_memset(piVar1,param_2,param_3);
    puVar4 = (undefined1 *)param_1[4];
    puVar2 = (undefined1 *)(param_1[5] + param_2);
    if (puVar2 == puVar4) {
      return param_1;
    }
    *puVar2 = *puVar4;
    param_1[4] = (int)(puVar2 + (param_1[4] - (int)puVar4));
    return param_1;
  }
  uVar3 = 0xf;
  if (piVar1 != param_1) {
    uVar3 = *param_1 + ((uint)piVar1 ^ 0xffffffff);
  }
  if (param_2 < uVar3) {
    __aeabi_memset(piVar1,param_1[4] - (int)piVar1,param_3);
    FUN_0003d1e0(param_1,(param_2 - param_1[4]) + param_1[5],param_3);
    return param_1;
  }
  local_20 = local_30;
  uVar3 = param_2 + 1;
  local_1c = local_20;
  if (uVar3 == 0) {
                    /* WARNING: Subroutine does not return */
    std::__stl_throw_length_error("basic_string");
  }
  if (uVar3 < 0x11) {
    puVar4 = (undefined1 *)((int)local_30 + param_2);
  }
  else {
    local_18 = uVar3;
    if (uVar3 < 0x81) {
      local_1c = (int *)std::__node_alloc::_M_allocate(&local_18);
      uVar3 = local_18;
    }
    else {
      local_1c = (int *)operator_new(uVar3);
    }
    local_30[0] = (int)local_1c + uVar3;
    puVar4 = (undefined1 *)((int)local_1c + param_2);
    if ((int)param_2 < 1) goto LAB_0003d170;
  }
  uVar3 = param_2 ^ 0xffffffff;
  if ((int)(param_2 ^ 0xffffffff) < -1) {
    uVar3 = 0xfffffffe;
  }
  local_20 = local_1c;
  __aeabi_memset(local_1c,param_2 + uVar3 + 2,param_3);
LAB_0003d170:
  local_20 = (int *)puVar4;
  *puVar4 = 0;
  FUN_0003d298(param_1,local_30);
  if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
    if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
      std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
    }
    else {
      operator_delete(local_1c);
    }
  }
  return param_1;
}



### FUNC FUN_0003d1e0 @ 0003d1e0

undefined4 * FUN_0003d1e0(undefined4 *param_1,uint param_2,undefined4 param_3)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  undefined4 *puVar4;
  uint uVar5;
  uint uVar6;
  int iVar7;
  undefined4 *puVar8;
  
  if (param_2 != 0) {
    iVar1 = param_1[4];
    puVar4 = (undefined4 *)param_1[5];
    if ((uint)((-2 - iVar1) + (int)puVar4) < param_2) {
                    /* WARNING: Subroutine does not return */
      std::__stl_throw_length_error("basic_string");
    }
    if (puVar4 == param_1) {
      puVar8 = param_1 + 4;
    }
    else {
      puVar8 = (undefined4 *)*param_1;
    }
    if ((uint)((int)puVar8 - iVar1) <= param_2) {
      uVar2 = iVar1 - (int)puVar4;
      if (-uVar2 - 2 < param_2) {
                    /* WARNING: Subroutine does not return */
        std::__stl_throw_length_error("basic_string");
      }
      uVar5 = uVar2;
      if (uVar2 <= param_2) {
        uVar5 = param_2;
      }
      uVar6 = uVar2 + uVar5 + 1;
      uVar3 = 0xfffffffe;
      if (uVar2 <= uVar6) {
        uVar3 = uVar6;
      }
      uVar6 = 0xfffffffe;
      if (uVar2 + uVar5 != -2) {
        uVar6 = uVar3;
      }
      FUN_0003d024(param_1,uVar6);
      iVar1 = param_1[4];
    }
    if (0 < (int)(param_2 - 1)) {
      iVar7 = -param_2;
      if (param_2 == 2 || iVar7 < -2) {
        iVar7 = -2;
      }
      __aeabi_memset(iVar1 + 1,iVar7 + param_2 + 1,param_3);
      iVar1 = param_1[4];
    }
    *(undefined1 *)(iVar1 + param_2) = 0;
    *(char *)param_1[4] = (char)param_3;
    param_1[4] = param_1[4] + param_2;
  }
  return param_1;
}



### FUNC FUN_0003d298 @ 0003d298

void FUN_0003d298(undefined4 *param_1,undefined4 *param_2)

{
  undefined4 *puVar1;
  undefined4 uVar2;
  undefined4 *puVar3;
  int iVar4;
  undefined4 uVar5;
  undefined4 uVar6;
  undefined4 uVar7;
  
  puVar1 = (undefined4 *)param_2[5];
  puVar3 = (undefined4 *)param_1[5];
  if (puVar3 == param_1) {
    if (puVar1 != param_2) {
      FUN_0003d298(param_2,param_1);
      return;
    }
    uVar2 = *puVar3;
    uVar6 = puVar3[1];
    uVar7 = puVar3[2];
    uVar5 = puVar3[3];
    puVar3[3] = puVar1[3];
    puVar3[2] = puVar1[2];
    puVar3[1] = puVar1[1];
    *puVar3 = *puVar1;
    *puVar1 = uVar2;
    puVar1[1] = uVar6;
    puVar1[2] = uVar7;
    puVar1[3] = uVar5;
    iVar4 = param_1[4];
    param_1[4] = param_1[5] + (param_2[4] - param_2[5]);
    param_2[4] = (int)puVar1 + (iVar4 - param_1[5]);
    param_1[5] = param_1;
    param_2[5] = param_2;
    return;
  }
  if (puVar1 != param_2) {
    uVar2 = *param_1;
    *param_1 = *param_2;
    *param_2 = uVar2;
    uVar2 = param_1[5];
    param_1[5] = param_2[5];
    param_2[5] = uVar2;
    uVar2 = param_1[4];
    param_1[4] = param_2[4];
    param_2[4] = uVar2;
    return;
  }
  param_1[3] = puVar1[3];
  param_1[2] = puVar1[2];
  param_1[1] = puVar1[1];
  uVar2 = *param_1;
  *param_1 = *puVar1;
  param_1[5] = param_1;
  uVar5 = param_1[4];
  param_1[4] = (int)param_1 + (param_2[4] - (int)param_2);
  *param_2 = uVar2;
  param_2[4] = uVar5;
  param_2[5] = puVar3;
  return;
}



### FUNC FUN_0003d350 @ 0003d350

undefined4
FUN_0003d350(int *param_1,undefined4 *param_2,int param_3,undefined4 *param_4,int param_5,
            int param_6,uint param_7,int param_8)

{
  byte bVar1;
  byte *pbVar2;
  int iVar3;
  undefined4 uVar4;
  char cVar5;
  char *pcVar6;
  int iVar7;
  uint uVar8;
  int iVar9;
  uint uVar10;
  int iVar11;
  uint uVar12;
  undefined4 uVar13;
  undefined8 uVar14;
  undefined8 uVar15;
  undefined8 uVar16;
  undefined8 uVar17;
  uint local_9c;
  undefined4 local_7c;
  undefined4 local_70;
  int local_60;
  char local_54 [64];
  
  uVar14 = __floatsidf(param_3);
  uVar15 = __divdf3(0xffffffff,0x7fefffff);
  iVar7 = *(int *)(param_8 + 0x10);
  iVar9 = *(int *)(param_8 + 0x14);
  pbVar2 = (byte *)*param_1;
  local_9c = 1;
  local_60 = param_5;
  if (pbVar2 == (byte *)*param_2) {
    uVar12 = 0;
    pcVar6 = local_54;
    uVar16 = 0;
  }
  else {
    pcVar6 = local_54;
    uVar8 = 0;
    uVar16 = 0;
    cVar5 = '\0';
    uVar10 = uVar8;
    do {
      local_70 = (undefined4)((ulonglong)uVar16 >> 0x20);
      uVar4 = (undefined4)uVar16;
      bVar1 = *pbVar2;
      uVar12 = uVar10;
      if (bVar1 == param_7 && iVar9 != iVar7) {
        *pcVar6 = cVar5;
        uVar8 = uVar8 + 1;
        cVar5 = '\0';
      }
      else {
        iVar11 = 0xff;
        if (-1 < (char)bVar1) {
          iVar11 = std::priv::__digit_val_table((uint)bVar1);
        }
        if (param_3 <= iVar11) break;
        iVar3 = __aeabi_dcmpgt(uVar4,local_70,(int)uVar15,(int)((ulonglong)uVar15 >> 0x20));
        cVar5 = cVar5 + '\x01';
        local_60 = local_60 + 1;
        uVar12 = local_9c;
        if (iVar3 == 0) {
          uVar16 = __muldf3(uVar4,local_70,(int)uVar14,(int)((ulonglong)uVar14 >> 0x20));
          uVar17 = __floatsidf(iVar11);
          uVar16 = __adddf3((int)uVar16,(int)((ulonglong)uVar16 >> 0x20),(int)uVar17,
                            (int)((ulonglong)uVar17 >> 0x20));
          iVar11 = __aeabi_dcmple((int)uVar16,(int)((ulonglong)uVar16 >> 0x20),uVar4,local_70);
          iVar3 = __aeabi_dcmpeq(uVar4,local_70,0,0);
          uVar12 = uVar10 | (iVar3 == 0 && iVar11 != 0);
        }
      }
      pbVar2 = (byte *)(*param_1 + 1);
      *param_1 = (int)pbVar2;
      pcVar6 = local_54 + uVar8;
      uVar10 = uVar12;
    } while (pbVar2 != (byte *)*param_2);
    pcVar6 = local_54 + uVar8;
    if ((iVar9 != iVar7) && (uVar8 != 0)) {
      *pcVar6 = cVar5;
      pcVar6 = local_54 + uVar8 + 1;
    }
  }
  uVar13 = (undefined4)((ulonglong)uVar16 >> 0x20);
  local_7c = (undefined4)uVar16;
  uVar4 = 0;
  if (0 < local_60) {
    if (uVar12 != 0) {
      *param_4 = 0xffffffff;
      param_4[1] = 0x7fefffff;
      return 0;
    }
    uVar14 = __subdf3(0,0x80000000,local_7c,uVar13);
    uVar4 = (int)((ulonglong)uVar14 >> 0x20);
    if (param_6 == 0) {
      uVar4 = uVar13;
    }
    param_4[1] = uVar4;
    uVar4 = (int)uVar14;
    if (param_6 == 0) {
      uVar4 = local_7c;
    }
    *param_4 = uVar4;
    uVar4 = 1;
    if (iVar9 != iVar7) {
      uVar4 = std::priv::__valid_grouping
                        (local_54,pcVar6,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10));
    }
  }
  return uVar4;
}



### FUNC FUN_0003d520 @ 0003d520

void FUN_0003d520(facet *param_1)

{
  std::locale::facet::~facet(param_1);
  operator_delete(param_1);
  return;
}



### FUNC FUN_0003d624 @ 0003d624

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_0003d624(undefined4 *param_1,int *param_2,uint param_3,int param_4,int param_5,int param_6,
                 int param_7,int param_8)

{
  undefined1 uVar1;
  locale *this;
  int *piVar2;
  int *piVar3;
  int *piVar4;
  uint uVar5;
  undefined4 uVar6;
  int iVar7;
  int iVar8;
  undefined1 **ppuVar9;
  undefined1 *puVar10;
  int iVar11;
  int iVar12;
  byte *pbVar13;
  int iVar14;
  uint uVar15;
  uint uVar16;
  undefined1 **ppuVar17;
  int iVar18;
  uint uVar19;
  byte *pbVar20;
  byte *pbVar21;
  byte *pbVar22;
  undefined1 **ppuVar23;
  byte bVar24;
  byte *pbVar25;
  bool bVar26;
  int local_1d4;
  undefined4 local_1d0;
  int local_19c;
  undefined1 **local_198;
  uint local_184;
  undefined1 *local_180 [4];
  undefined1 **local_170;
  undefined1 local_16c;
  undefined1 auStack_16b [256];
  undefined1 auStack_6b [3];
  undefined1 **local_68;
  int local_64 [4];
  byte *local_54;
  byte *local_50;
  int local_4c [4];
  int local_3c;
  byte *local_38;
  int local_34 [4];
  int *local_24;
  int *local_20;
  locale alStack_1c [4];
  undefined1 auStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_1c,(locale *)(param_5 + 0x20));
  piVar2 = (int *)std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  piVar3 = (int *)std::locale::_M_use_facet(alStack_1c,(id *)&std::moneypunct<char,false>::id);
  piVar4 = (int *)std::locale::_M_use_facet(alStack_1c,(id *)&std::moneypunct<char,true>::id);
  uVar5 = (**(code **)(*piVar2 + 0x18))(piVar2,0x2d);
  uVar6 = (**(code **)(*piVar2 + 0x18))(piVar2,0x2b);
  iVar7 = (**(code **)(*piVar2 + 0x18))(piVar2,0x20);
  iVar8 = (**(code **)(*piVar2 + 0x18))(piVar2,0x30);
  if (param_4 == 1) {
    local_1d4 = (**(code **)(*piVar4 + 8))();
    local_1d0 = (**(code **)(*piVar4 + 0xc))();
    (**(code **)(*piVar4 + 0x10))(local_34);
    local_19c = (**(code **)(*piVar4 + 0x20))(piVar4,*(code **)(*piVar4 + 0x20),local_34);
    (**(code **)(*piVar4 + 0x14))(local_4c,piVar4,*(code **)(*piVar4 + 0x14),local_34);
  }
  else {
    local_1d4 = (**(code **)(*piVar3 + 8))();
    local_1d0 = (**(code **)(*piVar3 + 0xc))();
    (**(code **)(*piVar3 + 0x10))(local_34);
    local_19c = (**(code **)(*piVar3 + 0x20))(piVar3,*(code **)(*piVar3 + 0x20),local_34);
    (**(code **)(*piVar3 + 0x14))(local_4c,piVar3,*(code **)(*piVar3 + 0x14),local_34);
  }
  ppuVar9 = *(undefined1 ***)(param_7 + 0x118);
  ppuVar23 = *(undefined1 ***)(param_7 + 0x10);
  if (ppuVar9 == ppuVar23) {
    *param_1 = param_2;
    param_1[1] = param_3;
    goto LAB_0003d75e;
  }
  uVar19 = (uint)*(byte *)ppuVar9;
  ppuVar17 = (undefined1 **)((int)ppuVar9 + 1);
  if (uVar19 != uVar5) {
    ppuVar17 = ppuVar9;
  }
  if (param_4 == 1) {
    if (uVar19 == uVar5) {
      (**(code **)(*piVar4 + 0x1c))(local_64);
    }
    else {
      (**(code **)(*piVar4 + 0x18))(local_64);
    }
  }
  else if (uVar19 == uVar5) {
    (**(code **)(*piVar3 + 0x1c))(local_64);
  }
  else {
    (**(code **)(*piVar3 + 0x18))(local_64);
  }
  local_198 = ppuVar23;
  if (param_8 == 1) {
    if (ppuVar17 != ppuVar23) {
      ppuVar9 = ppuVar17;
      do {
        local_198 = ppuVar9;
        if (-1 < (int)((uint)*(byte *)(piVar2[3] + (uint)*(byte *)ppuVar9 * 4) << 0x19)) break;
        ppuVar9 = (undefined1 **)((int)ppuVar9 + 1);
        local_198 = ppuVar23;
      } while (ppuVar23 != ppuVar9);
    }
    if (local_198 != ppuVar17) goto LAB_0003d7f8;
    *param_1 = param_2;
    param_1[1] = param_3;
  }
  else {
LAB_0003d7f8:
    __aeabi_memclr(auStack_16b,0x100);
    local_16c = 0;
    local_180[0] = auStack_6b;
    local_170 = (undefined1 **)&local_16c;
    local_68 = (undefined1 **)&local_16c;
    if (local_20 != local_24) {
      if (ppuVar17 != local_198) {
        FUN_0003dfb8(local_180,ppuVar17,local_198,auStack_18);
      }
      FUN_000500f4(local_180,(byte *)((int)local_170 + (-(int)local_68 - local_19c)),local_34,
                   local_1d0,uVar6,uVar5,0);
      local_198 = local_170;
      ppuVar17 = local_68;
    }
    pbVar25 = local_54 + 1;
    if (local_19c == 0) {
      pbVar25 = local_54;
    }
    iVar14 = (int)local_198 - (int)ppuVar17;
    pbVar25 = pbVar25 + (iVar14 - (int)local_50);
    uVar15 = *(uint *)(param_5 + 4) & 0x200;
    pbVar20 = *(byte **)(param_5 + 0x1c);
    if (uVar15 != 0) {
      pbVar25 = pbVar25 + (local_3c - (int)local_38);
    }
    if (param_4 == 1) {
      if (uVar19 == uVar5) {
        local_184 = (**(code **)(*piVar4 + 0x28))();
      }
      else {
        local_184 = (**(code **)(*piVar4 + 0x24))();
      }
    }
    else if (uVar19 == uVar5) {
      local_184 = (**(code **)(*piVar3 + 0x28))(piVar3);
    }
    else {
      local_184 = (**(code **)(*piVar3 + 0x24))(piVar3);
    }
    pbVar25 = pbVar25 + ((local_184 & 0xff00) == 0x100 || (local_184 & 0xff0000) == 0x10000);
    iVar18 = (int)pbVar20 - (int)pbVar25;
    if (pbVar20 <= pbVar25) {
      iVar18 = 0;
    }
    uVar5 = *(uint *)(param_5 + 4);
    uVar1 = (undefined1)param_6;
    if ((iVar18 != 0) && ((uVar5 & 5) == 0)) {
      uVar19 = param_3;
      if (0 < iVar18) {
        pbVar21 = pbVar20 + (1 - (int)pbVar25);
        uVar16 = param_3;
        do {
          uVar19 = 0;
          if ((uVar16 & 0xff) != 0) {
            puVar10 = (undefined1 *)param_2[5];
            if (puVar10 < (undefined1 *)param_2[6]) {
              param_2[5] = (int)(puVar10 + 1);
              *puVar10 = uVar1;
              iVar11 = param_6;
            }
            else {
              iVar11 = (**(code **)(*param_2 + 0x34))(param_2,param_6);
            }
            uVar19 = 1;
            if (iVar11 == -1) {
              uVar19 = 0;
            }
          }
          pbVar21 = pbVar21 + -1;
          uVar16 = uVar19;
        } while (1 < (int)pbVar21);
      }
      param_3 = uVar19 & 0xff | param_3 & 0xffffff00;
    }
    pbVar21 = (byte *)((int)local_198 + (1 - (int)ppuVar17));
    iVar11 = 0;
    do {
      uVar19 = param_3;
      switch(*(undefined1 *)((int)local_180 + iVar11 + -4)) {
      case 1:
        uVar19 = 0;
        if ((param_3 & 0xff) != 0) {
          puVar10 = (undefined1 *)param_2[5];
          if (puVar10 < (undefined1 *)param_2[6]) {
            param_2[5] = (int)(puVar10 + 1);
            *puVar10 = (char)iVar7;
            iVar12 = iVar7;
          }
          else {
            iVar12 = (**(code **)(*param_2 + 0x34))(param_2,iVar7);
          }
          uVar19 = 1;
          if (iVar12 == -1) {
            uVar19 = 0;
          }
        }
        param_3 = param_3 & 0xffffff00 | uVar19;
      case 0:
        if (iVar18 != 0 && (uVar5 & 7) == 4) {
          pbVar22 = pbVar20 + (1 - (int)pbVar25);
          uVar19 = param_3;
          uVar16 = param_3;
          if (0 < iVar18) {
            do {
              uVar19 = 0;
              if ((uVar16 & 0xff) != 0) {
                puVar10 = (undefined1 *)param_2[5];
                if (puVar10 < (undefined1 *)param_2[6]) {
                  param_2[5] = (int)(puVar10 + 1);
                  *puVar10 = uVar1;
                  iVar12 = param_6;
                }
                else {
                  iVar12 = (**(code **)(*param_2 + 0x34))(param_2,param_6);
                }
                uVar19 = 1;
                if (iVar12 == -1) {
                  uVar19 = 0;
                }
              }
              pbVar22 = pbVar22 + -1;
              uVar16 = uVar19;
            } while (1 < (int)pbVar22);
          }
          param_3 = param_3 & 0xffffff00 | uVar19 & 0xff;
        }
        break;
      case 2:
        if (uVar15 != 0) {
          if (0 < local_3c - (int)local_38) {
            iVar12 = (local_3c + 1) - (int)local_38;
            uVar16 = param_3;
            pbVar22 = local_38;
            do {
              uVar19 = 0;
              if ((uVar16 & 0xff) != 0) {
                bVar24 = *pbVar22;
                uVar16 = (uint)bVar24;
                pbVar13 = (byte *)param_2[5];
                if (pbVar13 < (byte *)param_2[6]) {
                  param_2[5] = (int)(pbVar13 + 1);
                  *pbVar13 = bVar24;
                }
                else {
                  uVar16 = (**(code **)(*param_2 + 0x34))(param_2);
                }
                uVar19 = 1;
                if (uVar16 == 0xffffffff) {
                  uVar19 = 0;
                }
              }
              iVar12 = iVar12 + -1;
              pbVar22 = pbVar22 + 1;
              uVar16 = uVar19;
            } while (1 < iVar12);
          }
LAB_0003dbac:
          param_3 = param_3 & 0xffffff00 | uVar19 & 0xff;
        }
        break;
      case 3:
        if (local_50 != local_54) {
          uVar19 = 0;
          if ((param_3 & 0xff) != 0) {
            bVar24 = *local_50;
            uVar16 = (uint)bVar24;
            pbVar22 = (byte *)param_2[5];
            if (pbVar22 < (byte *)param_2[6]) {
              param_2[5] = (int)(pbVar22 + 1);
              *pbVar22 = bVar24;
            }
            else {
              uVar16 = (**(code **)(*param_2 + 0x34))(param_2);
            }
            uVar19 = 1;
            if (uVar16 == 0xffffffff) {
              uVar19 = 0;
            }
          }
          param_3 = param_3 & 0xffffff00 | uVar19;
        }
        break;
      case 4:
        if (local_19c == 0) {
          pbVar22 = pbVar21;
          uVar16 = param_3;
          ppuVar9 = ppuVar17;
          if (0 < iVar14) {
            do {
              uVar19 = 0;
              if ((uVar16 & 0xff) != 0) {
                bVar24 = *(byte *)ppuVar9;
                uVar16 = (uint)bVar24;
                pbVar13 = (byte *)param_2[5];
                if (pbVar13 < (byte *)param_2[6]) {
                  param_2[5] = (int)(pbVar13 + 1);
                  *pbVar13 = bVar24;
                }
                else {
                  uVar16 = (**(code **)(*param_2 + 0x34))(param_2);
                }
                uVar19 = 1;
                if (uVar16 == 0xffffffff) {
                  uVar19 = 0;
                }
              }
              pbVar22 = pbVar22 + -1;
              uVar16 = uVar19;
              ppuVar9 = (undefined1 **)((int)ppuVar9 + 1);
            } while (1 < (int)pbVar22);
          }
          goto LAB_0003dbac;
        }
        if (local_19c < iVar14) {
          pbVar22 = (byte *)((int)local_198 + ((1 - local_19c) - (int)ppuVar17));
          uVar16 = param_3;
          ppuVar9 = ppuVar17;
          if (0 < (int)((int)local_198 + (-(int)ppuVar17 - local_19c))) {
            do {
              uVar19 = 0;
              if ((uVar16 & 0xff) != 0) {
                bVar24 = *(byte *)ppuVar9;
                uVar16 = (uint)bVar24;
                pbVar13 = (byte *)param_2[5];
                if (pbVar13 < (byte *)param_2[6]) {
                  param_2[5] = (int)(pbVar13 + 1);
                  *pbVar13 = bVar24;
                }
                else {
                  uVar16 = (**(code **)(*param_2 + 0x34))(param_2);
                }
                uVar19 = 1;
                if (uVar16 == 0xffffffff) {
                  uVar19 = 0;
                }
              }
              pbVar22 = pbVar22 + -1;
              uVar16 = uVar19;
              ppuVar9 = (undefined1 **)((int)ppuVar9 + 1);
            } while (1 < (int)pbVar22);
          }
          bVar24 = 0;
          if ((uVar19 & 0xff) != 0) {
            puVar10 = (undefined1 *)param_2[5];
            if (puVar10 < (undefined1 *)param_2[6]) {
              param_2[5] = (int)(puVar10 + 1);
              *puVar10 = (char)local_1d4;
              iVar12 = local_1d4;
            }
            else {
              iVar12 = (**(code **)(*param_2 + 0x34))(param_2,local_1d4);
            }
            bVar24 = 1;
            if (iVar12 == -1) {
              bVar24 = 0;
            }
          }
          iVar12 = local_19c;
          if (0 < local_19c) {
            do {
              bVar26 = bVar24 != 0;
              bVar24 = 0;
              if (bVar26) {
                bVar24 = *(byte *)((int)local_198 - iVar12);
                uVar19 = (uint)bVar24;
                pbVar22 = (byte *)param_2[5];
                if (pbVar22 < (byte *)param_2[6]) {
                  param_2[5] = (int)(pbVar22 + 1);
                  *pbVar22 = bVar24;
                }
                else {
                  uVar19 = (**(code **)(*param_2 + 0x34))(param_2);
                }
                bVar24 = 1;
                if (uVar19 == 0xffffffff) {
                  bVar24 = 0;
                }
              }
              bVar26 = 1 < iVar12;
              iVar12 = iVar12 + -1;
            } while (bVar26);
          }
          param_3 = param_3 & 0xffffff00 | (uint)bVar24;
        }
        else {
          bVar24 = 0;
          if ((param_3 & 0xff) != 0) {
            puVar10 = (undefined1 *)param_2[5];
            if (puVar10 < (undefined1 *)param_2[6]) {
              param_2[5] = (int)(puVar10 + 1);
              *puVar10 = (char)iVar8;
            }
            else {
              iVar12 = (**(code **)(*param_2 + 0x34))(param_2,iVar8);
              if (iVar12 == -1) goto LAB_0003dd1a;
            }
            puVar10 = (undefined1 *)param_2[5];
            if (puVar10 < (undefined1 *)param_2[6]) {
              param_2[5] = (int)(puVar10 + 1);
              *puVar10 = (char)local_1d4;
              iVar12 = local_1d4;
            }
            else {
              iVar12 = (**(code **)(*param_2 + 0x34))(param_2,local_1d4);
            }
            bVar24 = 1;
            if (iVar12 == -1) {
              bVar24 = 0;
            }
          }
LAB_0003dd1a:
          pbVar22 = (byte *)((int)local_198 + (-(int)ppuVar17 - local_19c));
          if (local_19c != iVar14) {
            do {
              bVar26 = bVar24 != 0;
              bVar24 = 0;
              if (bVar26) {
                puVar10 = (undefined1 *)param_2[5];
                if (puVar10 < (undefined1 *)param_2[6]) {
                  param_2[5] = (int)(puVar10 + 1);
                  *puVar10 = (char)iVar8;
                  iVar12 = iVar8;
                }
                else {
                  iVar12 = (**(code **)(*param_2 + 0x34))(param_2,iVar8);
                }
                bVar24 = 1;
                if (iVar12 == -1) {
                  bVar24 = 0;
                }
              }
              pbVar22 = pbVar22 + 1;
            } while (pbVar22 != (byte *)0x0);
          }
          pbVar22 = pbVar21;
          ppuVar9 = ppuVar17;
          if (0 < iVar14) {
            do {
              bVar26 = bVar24 != 0;
              bVar24 = 0;
              if (bVar26) {
                bVar24 = *(byte *)ppuVar9;
                uVar19 = (uint)bVar24;
                pbVar13 = (byte *)param_2[5];
                if (pbVar13 < (byte *)param_2[6]) {
                  param_2[5] = (int)(pbVar13 + 1);
                  *pbVar13 = bVar24;
                }
                else {
                  uVar19 = (**(code **)(*param_2 + 0x34))(param_2);
                }
                bVar24 = 1;
                if (uVar19 == 0xffffffff) {
                  bVar24 = 0;
                }
              }
              pbVar22 = pbVar22 + -1;
              ppuVar9 = (undefined1 **)((int)ppuVar9 + 1);
            } while (1 < (int)pbVar22);
          }
          param_3 = param_3 & 0xffffff00 | (uint)bVar24;
        }
      }
      bVar26 = iVar11 < 3;
      iVar11 = iVar11 + 1;
    } while (bVar26);
    if (1 < (uint)((int)local_54 - (int)local_50)) {
      pbVar21 = local_50 + 1;
      uVar19 = param_3;
      if (0 < (int)local_54 - (int)pbVar21) {
        pbVar22 = local_54 + (1 - (int)pbVar21);
        uVar15 = param_3;
        do {
          uVar19 = 0;
          if ((uVar15 & 0xff) != 0) {
            bVar24 = *pbVar21;
            uVar15 = (uint)bVar24;
            pbVar13 = (byte *)param_2[5];
            if (pbVar13 < (byte *)param_2[6]) {
              param_2[5] = (int)(pbVar13 + 1);
              *pbVar13 = bVar24;
            }
            else {
              uVar15 = (**(code **)(*param_2 + 0x34))(param_2);
            }
            uVar19 = 1;
            if (uVar15 == 0xffffffff) {
              uVar19 = 0;
            }
          }
          pbVar22 = pbVar22 + -1;
          pbVar21 = pbVar21 + 1;
          uVar15 = uVar19;
        } while (1 < (int)pbVar22);
      }
      param_3 = uVar19 & 0xff | param_3 & 0xffffff00;
    }
    if ((iVar18 != 0) && ((uVar5 & 6) == 0)) {
      uVar5 = param_3;
      if (0 < iVar18) {
        pbVar20 = pbVar20 + (1 - (int)pbVar25);
        uVar19 = param_3;
        do {
          uVar5 = 0;
          if ((uVar19 & 0xff) != 0) {
            puVar10 = (undefined1 *)param_2[5];
            if (puVar10 < (undefined1 *)param_2[6]) {
              param_2[5] = (int)(puVar10 + 1);
              *puVar10 = uVar1;
              iVar7 = param_6;
            }
            else {
              iVar7 = (**(code **)(*param_2 + 0x34))(param_2,param_6);
            }
            uVar5 = 1;
            if (iVar7 == -1) {
              uVar5 = 0;
            }
          }
          pbVar20 = pbVar20 + -1;
          uVar19 = uVar5;
        } while (1 < (int)pbVar20);
      }
      param_3 = uVar5 & 0xff | param_3 & 0xffffff00;
    }
    *param_1 = param_2;
    param_1[1] = param_3;
    if (((local_68 != local_180) && (local_68 != (undefined1 **)0x0)) &&
       ((undefined1 **)&local_16c != local_68)) {
      if ((uint)((int)local_180[0] - (int)local_68) < 0x81) {
        std::__node_alloc::_M_deallocate(local_68,(int)local_180[0] - (int)local_68);
      }
      else {
        operator_delete(local_68);
      }
    }
  }
  if ((local_50 != (byte *)local_64) && (local_50 != (byte *)0x0)) {
    if ((uint)(local_64[0] - (int)local_50) < 0x81) {
      std::__node_alloc::_M_deallocate(local_50,local_64[0] - (int)local_50);
    }
    else {
      operator_delete(local_50);
    }
  }
LAB_0003d75e:
  if ((local_38 != (byte *)local_4c) && (local_38 != (byte *)0x0)) {
    if ((uint)(local_4c[0] - (int)local_38) < 0x81) {
      std::__node_alloc::_M_deallocate(local_38,local_4c[0] - (int)local_38);
    }
    else {
      operator_delete(local_38);
    }
  }
  if ((local_20 != local_34) && (local_20 != (int *)0x0)) {
    if ((uint)(local_34[0] - (int)local_20) < 0x81) {
      std::__node_alloc::_M_deallocate(local_20,local_34[0] - (int)local_20);
    }
    else {
      operator_delete(local_20);
    }
  }
  std::locale::~locale(alStack_1c);
  return;
}



### FUNC FUN_0003dfb8 @ 0003dfb8

int * FUN_0003dfb8(int *param_1,undefined1 *param_2,undefined1 *param_3)

{
  undefined1 *puVar1;
  int *piVar2;
  int *piVar3;
  int *piVar4;
  undefined1 *puVar5;
  undefined1 *puVar6;
  undefined1 *puVar7;
  int *piVar8;
  int *local_1c;
  
  if (param_2 != param_3) {
    puVar1 = param_3 + -(int)param_2;
    piVar4 = (int *)param_1[0x46];
    piVar2 = param_1 + 0x46;
    if (piVar4 == param_1) {
      local_1c = (int *)param_1[4];
      puVar6 = (undefined1 *)((int)param_1 + (0x10 - (int)local_1c));
    }
    else {
      local_1c = (int *)param_1[4];
      puVar6 = (undefined1 *)(*param_1 - (int)local_1c);
    }
    piVar8 = param_1 + 4;
    if (puVar1 < puVar6) {
      *(undefined1 *)local_1c = *param_2;
      param_2 = param_2 + 1;
      if (param_2 != param_3) {
        __aeabi_memcpy(*piVar8 + 1,param_2,(int)param_3 - (int)param_2);
      }
      puVar1[*piVar8] = 0;
      *piVar8 = (int)(puVar1 + *piVar8);
    }
    else {
      puVar6 = (undefined1 *)((int)local_1c - (int)piVar4);
      if ((undefined1 *)(-2 - (int)puVar6) < puVar1) {
                    /* WARNING: Subroutine does not return */
        std::__stl_throw_length_error("basic_string");
      }
      puVar7 = puVar6;
      if (puVar6 <= puVar1) {
        puVar7 = puVar1;
      }
      puVar7 = puVar6 + (int)puVar7;
      puVar5 = (undefined1 *)0xfffffffe;
      if (puVar6 <= puVar7 + 1) {
        puVar5 = puVar7 + 1;
      }
      puVar6 = (undefined1 *)0xfffffffe;
      if (puVar7 != (undefined1 *)0xfffffffe) {
        puVar6 = puVar5;
      }
      if ((uint)puVar6 >> 1 < 0x81) {
        piVar3 = param_1 + 5;
      }
      else {
        piVar3 = (int *)operator_new((uint)puVar6);
        local_1c = (int *)*piVar8;
        piVar4 = (int *)*piVar2;
      }
      piVar8 = piVar3;
      if (local_1c != piVar4) {
        __aeabi_memcpy(piVar3,piVar4,(int)local_1c - (int)piVar4);
        piVar8 = (int *)((int)piVar3 + ((int)local_1c - (int)piVar4));
      }
      __aeabi_memcpy(piVar8,param_2);
      *(undefined1 *)((int)piVar8 + (int)puVar1) = 0;
      piVar4 = (int *)*piVar2;
      if (((piVar4 != param_1) && (piVar4 != (int *)0x0)) && (param_1 + 5 != piVar4)) {
        if ((uint)(*param_1 - (int)piVar4) < 0x81) {
          std::__node_alloc::_M_deallocate(piVar4,*param_1 - (int)piVar4);
        }
        else {
          operator_delete(piVar4);
        }
      }
      param_1[4] = (int)((int)piVar8 + (int)puVar1);
      *param_1 = (int)((int)piVar3 + (int)puVar6);
      *piVar2 = (int)piVar3;
    }
  }
  return param_1;
}



### FUNC FUN_0003e0e0 @ 0003e0e0

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_0003e0e0(undefined4 *param_1,int *param_2,uint param_3,int param_4,int param_5,int param_6,
                 int param_7,int param_8)

{
  undefined1 uVar1;
  locale *this;
  int *piVar2;
  int *piVar3;
  int *piVar4;
  uint uVar5;
  undefined4 uVar6;
  int iVar7;
  int iVar8;
  undefined1 **ppuVar9;
  byte *pbVar10;
  int iVar11;
  undefined1 *puVar12;
  int iVar13;
  int iVar14;
  byte *pbVar15;
  int iVar16;
  uint uVar17;
  uint uVar18;
  undefined1 **ppuVar19;
  uint uVar20;
  undefined1 **ppuVar21;
  byte *pbVar22;
  byte *pbVar23;
  byte *pbVar24;
  byte bVar25;
  bool bVar26;
  int local_1c8;
  undefined4 local_1b4;
  int local_1a0;
  uint local_198;
  undefined1 **local_194;
  uint local_184;
  undefined1 *local_180 [4];
  undefined1 **local_170;
  undefined1 local_16c;
  undefined1 auStack_16b [256];
  undefined1 auStack_6b [3];
  undefined1 **local_68;
  int local_64 [4];
  byte *local_54;
  byte *local_50;
  int local_4c [4];
  int local_3c;
  byte *local_38;
  int local_34 [4];
  int *local_24;
  int *local_20;
  locale alStack_1c [4];
  undefined1 auStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_1c,(locale *)(param_5 + 0x20));
  piVar2 = (int *)std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  piVar3 = (int *)std::locale::_M_use_facet(alStack_1c,(id *)&std::moneypunct<char,false>::id);
  piVar4 = (int *)std::locale::_M_use_facet(alStack_1c,(id *)&std::moneypunct<char,true>::id);
  uVar5 = (**(code **)(*piVar2 + 0x18))(piVar2,0x2d);
  uVar6 = (**(code **)(*piVar2 + 0x18))(piVar2,0x2b);
  iVar7 = (**(code **)(*piVar2 + 0x18))(piVar2,0x20);
  iVar8 = (**(code **)(*piVar2 + 0x18))(piVar2,0x30);
  if (param_4 == 1) {
    local_1c8 = (**(code **)(*piVar4 + 8))(piVar4);
    local_1b4 = (**(code **)(*piVar4 + 0xc))(piVar4);
    (**(code **)(*piVar4 + 0x10))(local_34,piVar4);
    local_1a0 = (**(code **)(*piVar4 + 0x20))(piVar4);
    (**(code **)(*piVar4 + 0x14))(local_4c,piVar4);
  }
  else {
    local_1c8 = (**(code **)(*piVar3 + 8))();
    local_1b4 = (**(code **)(*piVar3 + 0xc))();
    (**(code **)(*piVar3 + 0x10))(local_34);
    local_1a0 = (**(code **)(*piVar3 + 0x20))(piVar3,*(code **)(*piVar3 + 0x20),local_34);
    (**(code **)(*piVar3 + 0x14))(local_4c,piVar3,*(code **)(*piVar3 + 0x14),local_34);
  }
  ppuVar19 = *(undefined1 ***)(param_7 + 0x10);
  ppuVar9 = *(undefined1 ***)(param_7 + 0x14);
  if (ppuVar9 == ppuVar19) {
    *param_1 = param_2;
    param_1[1] = param_3;
    goto LAB_0003e20c;
  }
  uVar20 = (uint)*(byte *)ppuVar9;
  ppuVar21 = (undefined1 **)((int)ppuVar9 + 1);
  if (uVar20 != uVar5) {
    ppuVar21 = ppuVar9;
  }
  if (param_4 == 1) {
    if (uVar20 == uVar5) {
      (**(code **)(*piVar4 + 0x1c))(local_64,piVar4);
    }
    else {
      (**(code **)(*piVar4 + 0x18))(local_64,piVar4);
    }
  }
  else if (uVar20 == uVar5) {
    (**(code **)(*piVar3 + 0x1c))(local_64);
  }
  else {
    (**(code **)(*piVar3 + 0x18))(local_64);
  }
  local_194 = ppuVar19;
  if (param_8 == 1) {
    if (ppuVar21 != ppuVar19) {
      ppuVar9 = ppuVar21;
      do {
        local_194 = ppuVar9;
        if (-1 < (int)((uint)*(byte *)(piVar2[3] + (uint)*(byte *)ppuVar9 * 4) << 0x19)) break;
        ppuVar9 = (undefined1 **)((int)ppuVar9 + 1);
        local_194 = ppuVar19;
      } while (ppuVar19 != ppuVar9);
    }
    if (local_194 != ppuVar21) goto LAB_0003e2b2;
    *param_1 = param_2;
    param_1[1] = param_3;
  }
  else {
LAB_0003e2b2:
    __aeabi_memclr(auStack_16b,0x100);
    local_16c = 0;
    local_180[0] = auStack_6b;
    local_170 = (undefined1 **)&local_16c;
    local_68 = (undefined1 **)&local_16c;
    if (local_20 != local_24) {
      if (ppuVar21 != local_194) {
        FUN_0003dfb8(local_180,ppuVar21,local_194,auStack_18);
      }
      FUN_000500f4(local_180,(byte *)((int)local_170 + (-(int)local_68 - local_1a0)),local_34,
                   local_1b4,uVar6,uVar5,0);
      local_194 = local_170;
      ppuVar21 = local_68;
    }
    pbVar22 = local_54 + 1;
    if (local_1a0 == 0) {
      pbVar22 = local_54;
    }
    iVar16 = (int)local_194 - (int)ppuVar21;
    pbVar22 = pbVar22 + (iVar16 - (int)local_50);
    uVar17 = *(uint *)(param_5 + 4) & 0x200;
    pbVar10 = *(byte **)(param_5 + 0x1c);
    if (uVar17 != 0) {
      pbVar22 = pbVar22 + (local_3c - (int)local_38);
    }
    if (param_4 == 1) {
      if (uVar20 == uVar5) {
        local_184 = (**(code **)(*piVar4 + 0x28))(piVar4);
      }
      else {
        local_184 = (**(code **)(*piVar4 + 0x24))(piVar4);
      }
    }
    else if (uVar20 == uVar5) {
      local_184 = (**(code **)(*piVar3 + 0x28))();
    }
    else {
      local_184 = (**(code **)(*piVar3 + 0x24))();
    }
    pbVar22 = pbVar22 + ((local_184 & 0xff00) == 0x100 || (local_184 & 0xff0000) == 0x10000);
    iVar11 = (int)pbVar10 - (int)pbVar22;
    if (pbVar10 <= pbVar22) {
      iVar11 = 0;
    }
    uVar5 = *(uint *)(param_5 + 4);
    uVar1 = (undefined1)param_6;
    local_198 = param_3;
    if ((iVar11 != 0) && ((uVar5 & 5) == 0)) {
      uVar20 = param_3;
      if (0 < iVar11) {
        pbVar23 = pbVar10 + (1 - (int)pbVar22);
        uVar18 = param_3;
        do {
          uVar20 = 0;
          if ((uVar18 & 0xff) != 0) {
            puVar12 = (undefined1 *)param_2[5];
            if (puVar12 < (undefined1 *)param_2[6]) {
              param_2[5] = (int)(puVar12 + 1);
              *puVar12 = uVar1;
              iVar13 = param_6;
            }
            else {
              iVar13 = (**(code **)(*param_2 + 0x34))(param_2,param_6);
            }
            uVar20 = 1;
            if (iVar13 == -1) {
              uVar20 = 0;
            }
          }
          pbVar23 = pbVar23 + -1;
          uVar18 = uVar20;
        } while (1 < (int)pbVar23);
      }
      local_198 = uVar20 & 0xff | param_3 & 0xffffff00;
    }
    pbVar23 = (byte *)((int)local_194 + (1 - (int)ppuVar21));
    iVar13 = 0;
    do {
      uVar20 = local_198;
      switch(*(undefined1 *)((int)local_180 + iVar13 + -4)) {
      case 1:
        uVar20 = 0;
        if ((local_198 & 0xff) != 0) {
          puVar12 = (undefined1 *)param_2[5];
          if (puVar12 < (undefined1 *)param_2[6]) {
            param_2[5] = (int)(puVar12 + 1);
            *puVar12 = (char)iVar7;
            iVar14 = iVar7;
          }
          else {
            iVar14 = (**(code **)(*param_2 + 0x34))(param_2,iVar7);
          }
          uVar20 = 1;
          if (iVar14 == -1) {
            uVar20 = 0;
          }
        }
        local_198 = local_198 & 0xffffff00 | uVar20;
      case 0:
        if (iVar11 != 0 && (uVar5 & 7) == 4) {
          pbVar24 = pbVar10 + (1 - (int)pbVar22);
          uVar20 = local_198;
          uVar18 = local_198;
          if (0 < iVar11) {
            do {
              uVar20 = 0;
              if ((uVar18 & 0xff) != 0) {
                puVar12 = (undefined1 *)param_2[5];
                if (puVar12 < (undefined1 *)param_2[6]) {
                  param_2[5] = (int)(puVar12 + 1);
                  *puVar12 = uVar1;
                  iVar14 = param_6;
                }
                else {
                  iVar14 = (**(code **)(*param_2 + 0x34))(param_2,param_6);
                }
                uVar20 = 1;
                if (iVar14 == -1) {
                  uVar20 = 0;
                }
              }
              pbVar24 = pbVar24 + -1;
              uVar18 = uVar20;
            } while (1 < (int)pbVar24);
          }
          local_198 = local_198 & 0xffffff00 | uVar20 & 0xff;
        }
        break;
      case 2:
        if (uVar17 != 0) {
          if (0 < local_3c - (int)local_38) {
            iVar14 = (local_3c + 1) - (int)local_38;
            uVar18 = local_198;
            pbVar24 = local_38;
            do {
              uVar20 = 0;
              if ((uVar18 & 0xff) != 0) {
                bVar25 = *pbVar24;
                uVar18 = (uint)bVar25;
                pbVar15 = (byte *)param_2[5];
                if (pbVar15 < (byte *)param_2[6]) {
                  param_2[5] = (int)(pbVar15 + 1);
                  *pbVar15 = bVar25;
                }
                else {
                  uVar18 = (**(code **)(*param_2 + 0x34))(param_2);
                }
                uVar20 = 1;
                if (uVar18 == 0xffffffff) {
                  uVar20 = 0;
                }
              }
              iVar14 = iVar14 + -1;
              pbVar24 = pbVar24 + 1;
              uVar18 = uVar20;
            } while (1 < iVar14);
          }
LAB_0003e66e:
          local_198 = local_198 & 0xffffff00 | uVar20 & 0xff;
        }
        break;
      case 3:
        if (local_50 != local_54) {
          uVar20 = 0;
          if ((local_198 & 0xff) != 0) {
            bVar25 = *local_50;
            uVar18 = (uint)bVar25;
            pbVar24 = (byte *)param_2[5];
            if (pbVar24 < (byte *)param_2[6]) {
              param_2[5] = (int)(pbVar24 + 1);
              *pbVar24 = bVar25;
            }
            else {
              uVar18 = (**(code **)(*param_2 + 0x34))(param_2);
            }
            uVar20 = 1;
            if (uVar18 == 0xffffffff) {
              uVar20 = 0;
            }
          }
          local_198 = local_198 & 0xffffff00 | uVar20;
        }
        break;
      case 4:
        if (local_1a0 == 0) {
          pbVar24 = pbVar23;
          uVar18 = local_198;
          ppuVar9 = ppuVar21;
          if (0 < iVar16) {
            do {
              uVar20 = 0;
              if ((uVar18 & 0xff) != 0) {
                bVar25 = *(byte *)ppuVar9;
                uVar18 = (uint)bVar25;
                pbVar15 = (byte *)param_2[5];
                if (pbVar15 < (byte *)param_2[6]) {
                  param_2[5] = (int)(pbVar15 + 1);
                  *pbVar15 = bVar25;
                }
                else {
                  uVar18 = (**(code **)(*param_2 + 0x34))(param_2);
                }
                uVar20 = 1;
                if (uVar18 == 0xffffffff) {
                  uVar20 = 0;
                }
              }
              pbVar24 = pbVar24 + -1;
              uVar18 = uVar20;
              ppuVar9 = (undefined1 **)((int)ppuVar9 + 1);
            } while (1 < (int)pbVar24);
          }
          goto LAB_0003e66e;
        }
        if (local_1a0 < iVar16) {
          pbVar24 = (byte *)((int)local_194 + ((1 - local_1a0) - (int)ppuVar21));
          uVar18 = local_198;
          ppuVar9 = ppuVar21;
          if (0 < (int)((int)local_194 + (-(int)ppuVar21 - local_1a0))) {
            do {
              uVar20 = 0;
              if ((uVar18 & 0xff) != 0) {
                bVar25 = *(byte *)ppuVar9;
                uVar18 = (uint)bVar25;
                pbVar15 = (byte *)param_2[5];
                if (pbVar15 < (byte *)param_2[6]) {
                  param_2[5] = (int)(pbVar15 + 1);
                  *pbVar15 = bVar25;
                }
                else {
                  uVar18 = (**(code **)(*param_2 + 0x34))(param_2);
                }
                uVar20 = 1;
                if (uVar18 == 0xffffffff) {
                  uVar20 = 0;
                }
              }
              pbVar24 = pbVar24 + -1;
              uVar18 = uVar20;
              ppuVar9 = (undefined1 **)((int)ppuVar9 + 1);
            } while (1 < (int)pbVar24);
          }
          bVar25 = 0;
          if ((uVar20 & 0xff) != 0) {
            puVar12 = (undefined1 *)param_2[5];
            if (puVar12 < (undefined1 *)param_2[6]) {
              param_2[5] = (int)(puVar12 + 1);
              *puVar12 = (char)local_1c8;
              iVar14 = local_1c8;
            }
            else {
              iVar14 = (**(code **)(*param_2 + 0x34))(param_2,local_1c8);
            }
            bVar25 = 1;
            if (iVar14 == -1) {
              bVar25 = 0;
            }
          }
          iVar14 = local_1a0;
          if (0 < local_1a0) {
            do {
              bVar26 = bVar25 != 0;
              bVar25 = 0;
              if (bVar26) {
                bVar25 = *(byte *)((int)local_194 - iVar14);
                uVar20 = (uint)bVar25;
                pbVar24 = (byte *)param_2[5];
                if (pbVar24 < (byte *)param_2[6]) {
                  param_2[5] = (int)(pbVar24 + 1);
                  *pbVar24 = bVar25;
                }
                else {
                  uVar20 = (**(code **)(*param_2 + 0x34))(param_2);
                }
                bVar25 = 1;
                if (uVar20 == 0xffffffff) {
                  bVar25 = 0;
                }
              }
              bVar26 = 1 < iVar14;
              iVar14 = iVar14 + -1;
            } while (bVar26);
          }
          local_198 = local_198 & 0xffffff00 | (uint)bVar25;
        }
        else {
          bVar25 = 0;
          if ((local_198 & 0xff) != 0) {
            puVar12 = (undefined1 *)param_2[5];
            if (puVar12 < (undefined1 *)param_2[6]) {
              param_2[5] = (int)(puVar12 + 1);
              *puVar12 = (char)iVar8;
            }
            else {
              iVar14 = (**(code **)(*param_2 + 0x34))(param_2,iVar8);
              if (iVar14 == -1) goto LAB_0003e7dc;
            }
            puVar12 = (undefined1 *)param_2[5];
            if (puVar12 < (undefined1 *)param_2[6]) {
              param_2[5] = (int)(puVar12 + 1);
              *puVar12 = (char)local_1c8;
              iVar14 = local_1c8;
            }
            else {
              iVar14 = (**(code **)(*param_2 + 0x34))(param_2,local_1c8);
            }
            bVar25 = 1;
            if (iVar14 == -1) {
              bVar25 = 0;
            }
          }
LAB_0003e7dc:
          pbVar24 = (byte *)((int)local_194 + (-(int)ppuVar21 - local_1a0));
          if (local_1a0 != iVar16) {
            do {
              bVar26 = bVar25 != 0;
              bVar25 = 0;
              if (bVar26) {
                puVar12 = (undefined1 *)param_2[5];
                if (puVar12 < (undefined1 *)param_2[6]) {
                  param_2[5] = (int)(puVar12 + 1);
                  *puVar12 = (char)iVar8;
                  iVar14 = iVar8;
                }
                else {
                  iVar14 = (**(code **)(*param_2 + 0x34))(param_2,iVar8);
                }
                bVar25 = 1;
                if (iVar14 == -1) {
                  bVar25 = 0;
                }
              }
              pbVar24 = pbVar24 + 1;
            } while (pbVar24 != (byte *)0x0);
          }
          pbVar24 = pbVar23;
          ppuVar9 = ppuVar21;
          if (0 < iVar16) {
            do {
              bVar26 = bVar25 != 0;
              bVar25 = 0;
              if (bVar26) {
                bVar25 = *(byte *)ppuVar9;
                uVar20 = (uint)bVar25;
                pbVar15 = (byte *)param_2[5];
                if (pbVar15 < (byte *)param_2[6]) {
                  param_2[5] = (int)(pbVar15 + 1);
                  *pbVar15 = bVar25;
                }
                else {
                  uVar20 = (**(code **)(*param_2 + 0x34))(param_2);
                }
                bVar25 = 1;
                if (uVar20 == 0xffffffff) {
                  bVar25 = 0;
                }
              }
              pbVar24 = pbVar24 + -1;
              ppuVar9 = (undefined1 **)((int)ppuVar9 + 1);
            } while (1 < (int)pbVar24);
          }
          local_198 = local_198 & 0xffffff00 | (uint)bVar25;
        }
      }
      bVar26 = iVar13 < 3;
      iVar13 = iVar13 + 1;
    } while (bVar26);
    if (1 < (uint)((int)local_54 - (int)local_50)) {
      pbVar23 = local_50 + 1;
      uVar20 = local_198;
      if (0 < (int)local_54 - (int)pbVar23) {
        pbVar24 = local_54 + (1 - (int)pbVar23);
        uVar17 = local_198;
        do {
          uVar20 = 0;
          if ((uVar17 & 0xff) != 0) {
            bVar25 = *pbVar23;
            uVar17 = (uint)bVar25;
            pbVar15 = (byte *)param_2[5];
            if (pbVar15 < (byte *)param_2[6]) {
              param_2[5] = (int)(pbVar15 + 1);
              *pbVar15 = bVar25;
            }
            else {
              uVar17 = (**(code **)(*param_2 + 0x34))(param_2);
            }
            uVar20 = 1;
            if (uVar17 == 0xffffffff) {
              uVar20 = 0;
            }
          }
          pbVar24 = pbVar24 + -1;
          pbVar23 = pbVar23 + 1;
          uVar17 = uVar20;
        } while (1 < (int)pbVar24);
      }
      local_198 = uVar20 & 0xff | local_198 & 0xffffff00;
    }
    if ((iVar11 != 0) && ((uVar5 & 6) == 0)) {
      uVar5 = local_198;
      if (0 < iVar11) {
        pbVar10 = pbVar10 + (1 - (int)pbVar22);
        uVar20 = local_198;
        do {
          uVar5 = 0;
          if ((uVar20 & 0xff) != 0) {
            puVar12 = (undefined1 *)param_2[5];
            if (puVar12 < (undefined1 *)param_2[6]) {
              param_2[5] = (int)(puVar12 + 1);
              *puVar12 = uVar1;
              iVar7 = param_6;
            }
            else {
              iVar7 = (**(code **)(*param_2 + 0x34))(param_2,param_6);
            }
            uVar5 = 1;
            if (iVar7 == -1) {
              uVar5 = 0;
            }
          }
          pbVar10 = pbVar10 + -1;
          uVar20 = uVar5;
        } while (1 < (int)pbVar10);
      }
      local_198 = uVar5 & 0xff | local_198 & 0xffffff00;
    }
    *param_1 = param_2;
    param_1[1] = local_198;
    if (((local_68 != local_180) && (local_68 != (undefined1 **)0x0)) &&
       ((undefined1 **)&local_16c != local_68)) {
      if ((uint)((int)local_180[0] - (int)local_68) < 0x81) {
        std::__node_alloc::_M_deallocate(local_68,(int)local_180[0] - (int)local_68);
      }
      else {
        operator_delete(local_68);
      }
    }
  }
  if ((local_50 != (byte *)local_64) && (local_50 != (byte *)0x0)) {
    if ((uint)(local_64[0] - (int)local_50) < 0x81) {
      std::__node_alloc::_M_deallocate(local_50,local_64[0] - (int)local_50);
    }
    else {
      operator_delete(local_50);
    }
  }
LAB_0003e20c:
  if ((local_38 != (byte *)local_4c) && (local_38 != (byte *)0x0)) {
    if ((uint)(local_4c[0] - (int)local_38) < 0x81) {
      std::__node_alloc::_M_deallocate(local_38,local_4c[0] - (int)local_38);
    }
    else {
      operator_delete(local_38);
    }
  }
  if ((local_20 != local_34) && (local_20 != (int *)0x0)) {
    if ((uint)(local_34[0] - (int)local_20) < 0x81) {
      std::__node_alloc::_M_deallocate(local_20,local_34[0] - (int)local_20);
    }
    else {
      operator_delete(local_20);
    }
  }
  std::locale::~locale(alStack_1c);
  return;
}



### FUNC FUN_0003eb0c @ 0003eb0c

void FUN_0003eb0c(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9)

{
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_14 = param_6;
  local_18 = param_5;
  local_10 = param_3;
  local_c = param_4;
  FUN_0003f01c(param_1,&local_10,&local_18,param_7,param_8,param_9,0);
  return;
}



### FUNC FUN_0003eb3a @ 0003eb3a

void FUN_0003eb3a(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9)

{
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_14 = param_6;
  local_18 = param_5;
  local_10 = param_3;
  local_c = param_4;
  FUN_0003f894(param_1,&local_10,&local_18,param_7,param_8,param_9,0);
  return;
}



### FUNC FUN_0003eb68 @ 0003eb68

void FUN_0003eb68(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9)

{
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_14 = param_6;
  local_18 = param_5;
  local_10 = param_3;
  local_c = param_4;
  FUN_0003fc94(param_1,&local_10,&local_18,param_7,param_8,param_9,0);
  return;
}



### FUNC FUN_0003eb96 @ 0003eb96

void FUN_0003eb96(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9)

{
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_14 = param_6;
  local_18 = param_5;
  local_10 = param_3;
  local_c = param_4;
  FUN_00040090(param_1,&local_10,&local_18,param_7,param_8,param_9,0);
  return;
}



### FUNC FUN_0003ebc4 @ 0003ebc4

void FUN_0003ebc4(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9)

{
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_14 = param_6;
  local_18 = param_5;
  local_10 = param_3;
  local_c = param_4;
  FUN_0004048c(param_1,&local_10,&local_18,param_7,param_8,param_9,0);
  return;
}



### FUNC FUN_0003ebf2 @ 0003ebf2

void FUN_0003ebf2(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9)

{
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_14 = param_6;
  local_18 = param_5;
  local_10 = param_3;
  local_c = param_4;
  FUN_00040dac(param_1,&local_10,&local_18,param_7,param_8,param_9,0);
  return;
}



### FUNC FUN_0003ec20 @ 0003ec20

void FUN_0003ec20(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,byte *param_8,
                 undefined4 *param_9)

{
  undefined4 local_28 [2];
  undefined4 local_20;
  undefined4 local_1c;
  undefined4 local_18;
  undefined4 local_14;
  
  local_1c = param_6;
  local_20 = param_5;
  local_18 = param_3;
  local_14 = param_4;
  FUN_00040f24(param_1,&local_18,&local_20,param_7,param_8,local_28,0);
  if (-1 < (int)((uint)*param_8 << 0x1d)) {
    *param_9 = local_28[0];
  }
  return;
}



### FUNC FUN_0003ec5a @ 0003ec5a

void FUN_0003ec5a(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9)

{
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_14 = param_6;
  local_18 = param_5;
  local_10 = param_3;
  local_c = param_4;
  FUN_0004139c(param_1,&local_10,&local_18,param_7,param_8,param_9,0);
  return;
}



### FUNC FUN_0003ec88 @ 0003ec88

void FUN_0003ec88(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9)

{
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_14 = param_6;
  local_18 = param_5;
  local_10 = param_3;
  local_c = param_4;
  FUN_00041514(param_1,&local_10,&local_18,param_7,param_8,param_9,0);
  return;
}



### FUNC FUN_0003ecb6 @ 0003ecb6

void FUN_0003ecb6(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9)

{
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_14 = param_6;
  local_18 = param_5;
  local_10 = param_3;
  local_c = param_4;
  FUN_00040f24(param_1,&local_10,&local_18,param_7,param_8,param_9,0);
  return;
}



### FUNC FUN_0003ece4 @ 0003ece4

void FUN_0003ece4(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined4 param_6)

{
  bool bVar1;
  bool bVar2;
  locale *this;
  int *piVar3;
  uint uVar4;
  int iVar5;
  bool bVar6;
  uint uVar7;
  bool bVar8;
  int local_44 [4];
  int local_34;
  int *local_30;
  int local_2c [4];
  int local_1c;
  int *local_18;
  
  this = (locale *)std::locale::locale((locale *)local_2c,(locale *)(param_4 + 0x20));
  piVar3 = (int *)std::locale::_M_use_facet(this,(id *)&std::numpunct<char>::id);
  std::locale::~locale((locale *)local_2c);
  (**(code **)(*piVar3 + 0x14))(local_2c,piVar3);
  (**(code **)(*piVar3 + 0x18))(local_44,piVar3);
  bVar1 = true;
  uVar7 = 0;
  bVar8 = true;
  while( true ) {
    piVar3 = (int *)*param_2;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
    }
    piVar3 = (int *)*param_3;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_3 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_3 + 6) = 1;
      *(bool *)((int)param_3 + 5) = uVar4 == 0xffffffff;
    }
    if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) goto code_r0x0003ee7a;
    if (*(char *)((int)param_2 + 6) == '\0') {
      piVar3 = (int *)*param_2;
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
    }
    else {
      uVar4 = (uint)*(byte *)(param_2 + 1);
    }
    bVar6 = false;
    if (bVar1) {
      bVar6 = (uVar4 & 0xff) == (uint)*(byte *)((int)local_18 + uVar7);
    }
    bVar1 = bVar6;
    bVar6 = false;
    if ((bVar8) && (bVar6 = true, (uVar4 & 0xff) != (uint)*(byte *)((int)local_30 + uVar7))) {
      bVar6 = false;
    }
    uVar4 = uVar7 + 1;
    bVar2 = false;
    bVar8 = false;
    if (!(bool)(bVar1 | bVar6)) goto LAB_0003ee90;
    if ((bVar1) && ((uint)(local_1c - (int)local_18) <= uVar4)) break;
    if ((bVar6) && (bVar2 = bVar1, bVar8 = true, (uint)(local_34 - (int)local_30) <= uVar4))
    goto LAB_0003ee90;
    piVar3 = (int *)*param_2;
    if ((uint)piVar3[2] < (uint)piVar3[3]) {
      piVar3[2] = piVar3[2] + 1;
    }
    else {
      (**(code **)(*piVar3 + 0x24))();
    }
    *(undefined1 *)((int)param_2 + 6) = 0;
    uVar7 = uVar4;
    bVar8 = bVar6;
  }
  bVar2 = true;
  bVar8 = bVar6;
LAB_0003ee90:
  uVar7 = uVar7 + 1;
  piVar3 = (int *)*param_2;
  if ((uint)piVar3[2] < (uint)piVar3[3]) {
    piVar3[2] = piVar3[2] + 1;
  }
  else {
    (**(code **)(*piVar3 + 0x24))();
  }
  *(undefined1 *)((int)param_2 + 6) = 0;
  bVar1 = bVar2;
code_r0x0003ee7a:
  bVar1 = bVar1 && (uint)(local_1c - (int)local_18) <= uVar7;
  bVar6 = false;
  if ((bVar8) && (bVar6 = true, uVar7 < (uint)(local_34 - (int)local_30))) {
    bVar6 = false;
  }
  if ((bVar1) || (bVar6)) {
    *param_5 = 0;
    *(bool *)param_6 = bVar1;
  }
  else {
    *param_5 = 4;
  }
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar7 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar7 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar7;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar7 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar7 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar7 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar7;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar7 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    *param_5 = *param_5 | 2;
  }
  iVar5 = param_2[1];
  *param_1 = *param_2;
  param_1[1] = iVar5;
  if ((local_30 != local_44) && (local_30 != (int *)0x0)) {
    if ((uint)(local_44[0] - (int)local_30) < 0x81) {
      std::__node_alloc::_M_deallocate(local_30,local_44[0] - (int)local_30);
    }
    else {
      operator_delete(local_30);
    }
  }
  if ((local_18 != local_2c) && (local_18 != (int *)0x0)) {
    if (0x80 < (uint)(local_2c[0] - (int)local_18)) {
      operator_delete(local_18);
      return;
    }
    std::__node_alloc::_M_deallocate(local_18,local_2c[0] - (int)local_18);
  }
  return;
}



### FUNC FUN_0003f01c @ 0003f01c

void FUN_0003f01c(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined4 *param_6)

{
  locale *this;
  undefined4 uVar1;
  uint uVar2;
  int *piVar3;
  uint uVar4;
  int iVar5;
  undefined1 auStack_34 [4];
  int local_30 [5];
  int *local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  uVar2 = FUN_0003f220(param_2,param_3,*(undefined4 *)(param_4 + 4),uVar1);
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar4 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar4 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar4 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    uVar4 = 4;
    if ((uVar2 & 1) != 0) {
      uVar4 = 0;
      *param_6 = 0;
    }
  }
  else {
    piVar3 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<char>::id);
    uVar1 = (**(code **)(*piVar3 + 0xc))(piVar3);
    (**(code **)(*piVar3 + 0x10))(local_30,piVar3);
    iVar5 = FUN_0003f68a(param_2,param_3,(int)uVar2 >> 2,param_6,uVar2 & 1,(uVar2 & 2) != 0,uVar1,
                         local_30,auStack_34);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
        std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      }
      else {
        operator_delete(local_1c);
      }
    }
    uVar4 = 0;
    if (iVar5 == 0) {
      uVar4 = 4;
    }
  }
  *param_5 = uVar4;
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar2 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar2 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar2;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar2 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar2 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar2 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar2;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar2 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    *param_5 = *param_5 | 2;
  }
  iVar5 = param_2[1];
  *param_1 = *param_2;
  param_1[1] = iVar5;
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_0003f220 @ 0003f220

uint FUN_0003f220(int *param_1,int *param_2,uint param_3,int *param_4)

{
  bool bVar1;
  undefined4 uVar2;
  int iVar3;
  uint uVar4;
  int *piVar5;
  uint uVar6;
  uint uVar7;
  uint local_24;
  byte local_1c;
  byte local_1b;
  byte local_1a;
  byte local_19;
  byte local_18;
  
  uVar2 = std::priv::__narrow_atoms();
  iVar3 = std::priv::__narrow_atoms();
  (**(code **)(*param_4 + 0x1c))(param_4,uVar2,iVar3 + 5,&local_1c);
  if (*(char *)((int)param_1 + 6) == '\0') {
    piVar5 = (int *)*param_1;
    if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
      uVar4 = (uint)*(byte *)piVar5[2];
    }
    else {
      uVar4 = (**(code **)(*piVar5 + 0x20))();
    }
    *(char *)(param_1 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_1 + 6) = 1;
    *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
  }
  else {
    uVar4 = (uint)*(byte *)(param_1 + 1);
  }
  if ((uVar4 & 0xff) == (uint)local_1b) {
    piVar5 = (int *)*param_1;
    if ((uint)piVar5[2] < (uint)piVar5[3]) {
      piVar5[2] = piVar5[2] + 1;
      uVar7 = 2;
    }
    else {
      (**(code **)(*piVar5 + 0x24))();
      uVar7 = 2;
    }
LAB_0003f2c8:
    bVar1 = false;
    *(undefined1 *)((int)param_1 + 6) = 0;
  }
  else {
    uVar7 = 0;
    bVar1 = true;
    if ((uVar4 & 0xff) == (uint)local_1c) {
      piVar5 = (int *)*param_1;
      if ((uint)piVar5[2] < (uint)piVar5[3]) {
        piVar5[2] = piVar5[2] + 1;
      }
      else {
        (**(code **)(*piVar5 + 0x24))();
      }
      uVar7 = 0;
      goto LAB_0003f2c8;
    }
  }
  param_3 = param_3 & 0x38;
  local_24 = 0;
  if (param_3 == 0x20) {
    uVar4 = 0x20;
    goto LAB_0003f67e;
  }
  if (param_3 != 0x10) {
    if (param_3 == 8) {
      uVar4 = 0x28;
      goto LAB_0003f67e;
    }
    piVar5 = (int *)*param_1;
    if ((piVar5 != (int *)0x0) && (!bVar1)) {
      if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
        uVar4 = (uint)*(byte *)piVar5[2];
      }
      else {
        uVar4 = (**(code **)(*piVar5 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    piVar5 = (int *)*param_2;
    if ((piVar5 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
      if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
        uVar4 = (uint)*(byte *)piVar5[2];
      }
      else {
        uVar4 = (**(code **)(*piVar5 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
    }
    uVar4 = 0x28;
    if (*(char *)((int)param_1 + 5) == *(char *)((int)param_2 + 5)) goto LAB_0003f67e;
    if (*(char *)((int)param_1 + 6) == '\0') {
      piVar5 = (int *)*param_1;
      if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
        uVar6 = (uint)*(byte *)piVar5[2];
      }
      else {
        uVar6 = (**(code **)(*piVar5 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar6;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar6 == 0xffffffff;
    }
    else {
      uVar6 = (uint)*(byte *)(param_1 + 1);
    }
    if ((uVar6 & 0xff) != (uint)local_1a) goto LAB_0003f67e;
    piVar5 = (int *)*param_1;
    if ((uint)piVar5[2] < (uint)piVar5[3]) {
      piVar5[2] = piVar5[2] + 1;
      *(undefined1 *)((int)param_1 + 6) = 0;
LAB_0003f50a:
      if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
        uVar4 = (uint)*(byte *)piVar5[2];
      }
      else {
        uVar4 = (**(code **)(*piVar5 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    else {
      (**(code **)(*piVar5 + 0x24))();
      *(undefined1 *)((int)param_1 + 6) = 0;
      piVar5 = (int *)*param_1;
      if (piVar5 != (int *)0x0) goto LAB_0003f50a;
    }
    piVar5 = (int *)*param_2;
    if ((piVar5 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
      if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
        uVar4 = (uint)*(byte *)piVar5[2];
      }
      else {
        uVar4 = (**(code **)(*piVar5 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
    }
    local_24 = 1;
    if (*(char *)((int)param_1 + 5) == *(char *)((int)param_2 + 5)) {
      uVar4 = 0x20;
    }
    else {
      if (*(char *)((int)param_1 + 6) == '\0') {
        piVar5 = (int *)*param_1;
        if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
          uVar6 = (uint)*(byte *)piVar5[2];
        }
        else {
          uVar6 = (**(code **)(*piVar5 + 0x20))();
        }
        *(char *)(param_1 + 1) = (char)uVar6;
        *(undefined1 *)((int)param_1 + 6) = 1;
        *(bool *)((int)param_1 + 5) = uVar6 == 0xffffffff;
      }
      else {
        uVar6 = (uint)*(byte *)(param_1 + 1);
      }
      if (((uVar6 & 0xff) == (uint)local_19) || (uVar4 = 0x20, (uVar6 & 0xff) == (uint)local_18)) {
        piVar5 = (int *)*param_1;
        if ((uint)piVar5[2] < (uint)piVar5[3]) {
          piVar5[2] = piVar5[2] + 1;
        }
        else {
          (**(code **)(*piVar5 + 0x24))();
        }
        local_24 = 0;
        *(undefined1 *)((int)param_1 + 6) = 0;
        uVar4 = 0x40;
      }
    }
    goto LAB_0003f67e;
  }
  piVar5 = (int *)*param_1;
  if ((piVar5 != (int *)0x0) && (!bVar1)) {
    if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
      uVar4 = (uint)*(byte *)piVar5[2];
    }
    else {
      uVar4 = (**(code **)(*piVar5 + 0x20))();
    }
    *(char *)(param_1 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_1 + 6) = 1;
    *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
  }
  piVar5 = (int *)*param_2;
  if ((piVar5 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
      uVar4 = (uint)*(byte *)piVar5[2];
    }
    else {
      uVar4 = (**(code **)(*piVar5 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
  }
  uVar4 = 0x40;
  if (*(char *)((int)param_1 + 5) == *(char *)((int)param_2 + 5)) goto LAB_0003f67e;
  if (*(char *)((int)param_1 + 6) == '\0') {
    piVar5 = (int *)*param_1;
    if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
      uVar6 = (uint)*(byte *)piVar5[2];
    }
    else {
      uVar6 = (**(code **)(*piVar5 + 0x20))();
    }
    *(char *)(param_1 + 1) = (char)uVar6;
    *(undefined1 *)((int)param_1 + 6) = 1;
    *(bool *)((int)param_1 + 5) = uVar6 == 0xffffffff;
  }
  else {
    uVar6 = (uint)*(byte *)(param_1 + 1);
  }
  if ((uVar6 & 0xff) != (uint)local_1a) goto LAB_0003f67e;
  piVar5 = (int *)*param_1;
  if ((uint)piVar5[2] < (uint)piVar5[3]) {
    piVar5[2] = piVar5[2] + 1;
    *(undefined1 *)((int)param_1 + 6) = 0;
LAB_0003f472:
    if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
      uVar6 = (uint)*(byte *)piVar5[2];
    }
    else {
      uVar6 = (**(code **)(*piVar5 + 0x20))();
    }
    *(char *)(param_1 + 1) = (char)uVar6;
    *(undefined1 *)((int)param_1 + 6) = 1;
    *(bool *)((int)param_1 + 5) = uVar6 == 0xffffffff;
  }
  else {
    (**(code **)(*piVar5 + 0x24))();
    *(undefined1 *)((int)param_1 + 6) = 0;
    piVar5 = (int *)*param_1;
    if (piVar5 != (int *)0x0) goto LAB_0003f472;
  }
  piVar5 = (int *)*param_2;
  if ((piVar5 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
      uVar6 = (uint)*(byte *)piVar5[2];
    }
    else {
      uVar6 = (**(code **)(*piVar5 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar6;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar6 == 0xffffffff;
  }
  local_24 = 1;
  if (*(char *)((int)param_1 + 5) != *(char *)((int)param_2 + 5)) {
    if (*(char *)((int)param_1 + 6) == '\0') {
      piVar5 = (int *)*param_1;
      if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
        uVar6 = (uint)*(byte *)piVar5[2];
      }
      else {
        uVar6 = (**(code **)(*piVar5 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar6;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar6 == 0xffffffff;
    }
    else {
      uVar6 = (uint)*(byte *)(param_1 + 1);
    }
    if (((uVar6 & 0xff) == (uint)local_19) || ((uVar6 & 0xff) == (uint)local_18)) {
      piVar5 = (int *)*param_1;
      if ((uint)piVar5[2] < (uint)piVar5[3]) {
        piVar5[2] = piVar5[2] + 1;
      }
      else {
        (**(code **)(*piVar5 + 0x24))();
      }
      local_24 = 0;
      *(undefined1 *)((int)param_1 + 6) = 0;
    }
  }
LAB_0003f67e:
  return uVar4 | uVar7 | local_24;
}



### FUNC FUN_0003f68a @ 0003f68a

undefined4
FUN_0003f68a(int *param_1,int *param_2,int param_3,int *param_4,int param_5,int param_6,uint param_7
            ,int param_8)

{
  char cVar1;
  int iVar2;
  int *piVar3;
  uint uVar4;
  undefined4 uVar5;
  bool bVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  int iVar10;
  int iVar11;
  int local_98;
  undefined4 local_84;
  int local_6c;
  char *local_64;
  int local_58;
  char acStack_54 [64];
  
  iVar7 = *(int *)(param_8 + 0x10);
  iVar9 = *(int *)(param_8 + 0x14);
  local_84 = 1;
  local_98 = -0x80000000;
  iVar2 = __divsi3(0x80000000,param_3);
  local_6c = param_5;
  cVar1 = '\0';
  bVar6 = false;
  local_58 = 0;
  iVar11 = 0;
  while( true ) {
    local_64 = acStack_54 + local_58;
    piVar3 = (int *)*param_1;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    piVar3 = (int *)*param_2;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
    }
    if (*(char *)((int)param_1 + 5) == *(char *)((int)param_2 + 5)) break;
    if (*(char *)((int)param_1 + 6) == '\0') {
      piVar3 = (int *)*param_1;
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    else {
      uVar4 = (uint)*(byte *)(param_1 + 1);
    }
    iVar8 = 0xff;
    iVar10 = iVar11;
    if ((uVar4 & 0xff) == param_7 && iVar9 != iVar7) {
      *local_64 = cVar1;
      local_58 = local_58 + 1;
      cVar1 = '\0';
    }
    else {
      if (-1 < (char)uVar4) {
        iVar8 = std::priv::__digit_val_table(uVar4 & 0xff);
      }
      if (param_3 <= iVar8) break;
      cVar1 = cVar1 + '\x01';
      local_6c = local_6c + 1;
      if (iVar11 < iVar2) {
        bVar6 = true;
      }
      else {
        iVar10 = iVar11 * param_3 - iVar8;
        bVar6 = (bool)(bVar6 | (iVar11 != 0 && iVar11 <= iVar10));
      }
    }
    piVar3 = (int *)*param_1;
    if ((uint)piVar3[2] < (uint)piVar3[3]) {
      piVar3[2] = piVar3[2] + 1;
    }
    else {
      (**(code **)(*piVar3 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 6) = 0;
    iVar11 = iVar10;
  }
  if ((iVar9 != iVar7) && (local_58 != 0)) {
    *local_64 = cVar1;
    local_64 = acStack_54 + local_58 + 1;
  }
  uVar5 = 0;
  if (0 < local_6c) {
    if (bVar6) {
      if (param_6 == 0) {
        local_98 = 0x7fffffff;
      }
      *param_4 = local_98;
      return 0;
    }
    if (param_6 == 0) {
      iVar11 = -iVar11;
    }
    *param_4 = iVar11;
    uVar5 = local_84;
    if (iVar9 != iVar7) {
      uVar5 = std::priv::__valid_grouping
                        (acStack_54,local_64,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10));
    }
  }
  return uVar5;
}



### FUNC FUN_0003f894 @ 0003f894

void FUN_0003f894(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined2 *param_6)

{
  locale *this;
  undefined4 uVar1;
  uint uVar2;
  int *piVar3;
  uint uVar4;
  int iVar5;
  undefined1 auStack_34 [4];
  int local_30 [5];
  int *local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  uVar2 = FUN_0003f220(param_2,param_3,*(undefined4 *)(param_4 + 4),uVar1);
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar4 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar4 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar4 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    uVar4 = 4;
    if ((uVar2 & 1) != 0) {
      uVar4 = 0;
      *param_6 = 0;
    }
  }
  else {
    piVar3 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<char>::id);
    uVar1 = (**(code **)(*piVar3 + 0xc))(piVar3);
    (**(code **)(*piVar3 + 0x10))(local_30,piVar3);
    iVar5 = FUN_0003fa98(param_2,param_3,(int)uVar2 >> 2,param_6,uVar2 & 1,(uVar2 & 2) != 0,uVar1,
                         local_30,auStack_34);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
        std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      }
      else {
        operator_delete(local_1c);
      }
    }
    uVar4 = 0;
    if (iVar5 == 0) {
      uVar4 = 4;
    }
  }
  *param_5 = uVar4;
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar2 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar2 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar2;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar2 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar2 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar2 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar2;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar2 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    *param_5 = *param_5 | 2;
  }
  iVar5 = param_2[1];
  *param_1 = *param_2;
  param_1[1] = iVar5;
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_0003fa98 @ 0003fa98

uint FUN_0003fa98(int *param_1,int *param_2,uint param_3,short *param_4,int param_5,int param_6,
                 uint param_7,int param_8)

{
  uint uVar1;
  short sVar2;
  uint uVar3;
  uint uVar4;
  int *piVar5;
  uint uVar6;
  uint uVar7;
  int iVar8;
  int iVar9;
  char cVar10;
  int iVar11;
  char *pcVar12;
  uint uVar13;
  uint local_84;
  uint local_78;
  int local_6c;
  int local_58;
  char local_54 [64];
  
  iVar8 = *(int *)(param_8 + 0x10);
  iVar11 = *(int *)(param_8 + 0x14);
  local_58 = 0;
  local_84 = 1;
  uVar3 = __udivsi3(0xffff,param_3 & 0xffff);
  local_6c = param_5;
  cVar10 = '\0';
  uVar4 = 0;
  local_78 = 0;
  while( true ) {
    sVar2 = (short)uVar4;
    pcVar12 = local_54 + local_58;
    piVar5 = (int *)*param_1;
    if ((piVar5 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
      if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
        uVar6 = (uint)*(byte *)piVar5[2];
      }
      else {
        uVar6 = (**(code **)(*piVar5 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar6;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar6 == 0xffffffff;
    }
    piVar5 = (int *)*param_2;
    if ((piVar5 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
      if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
        uVar6 = (uint)*(byte *)piVar5[2];
      }
      else {
        uVar6 = (**(code **)(*piVar5 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar6;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar6 == 0xffffffff;
    }
    if (*(char *)((int)param_1 + 5) == *(char *)((int)param_2 + 5)) break;
    if (*(char *)((int)param_1 + 6) == '\0') {
      piVar5 = (int *)*param_1;
      if ((byte *)piVar5[2] < (byte *)piVar5[3]) {
        uVar6 = (uint)*(byte *)piVar5[2];
      }
      else {
        uVar6 = (**(code **)(*piVar5 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar6;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar6 == 0xffffffff;
    }
    else {
      uVar6 = (uint)*(byte *)(param_1 + 1);
    }
    iVar9 = 0xff;
    if ((uVar6 & 0xff) == param_7 && iVar11 != iVar8) {
      *pcVar12 = cVar10;
      local_58 = local_58 + 1;
      cVar10 = '\0';
      uVar6 = local_78;
    }
    else {
      if (-1 < (char)uVar6) {
        iVar9 = std::priv::__digit_val_table(uVar6 & 0xff);
      }
      if ((int)param_3 <= iVar9) break;
      uVar7 = uVar4 & 0xffff;
      cVar10 = cVar10 + '\x01';
      local_6c = local_6c + 1;
      uVar6 = local_84;
      if ((uVar7 <= uVar3) &&
         (uVar13 = iVar9 + uVar7 * param_3, uVar1 = uVar4 & 0xffff, uVar4 = uVar13, uVar6 = local_78
         , uVar1 != 0)) {
        uVar6 = local_78 | (uVar13 & 0xffff) <= uVar7;
      }
    }
    local_78 = uVar6;
    piVar5 = (int *)*param_1;
    if ((uint)piVar5[2] < (uint)piVar5[3]) {
      piVar5[2] = piVar5[2] + 1;
    }
    else {
      (**(code **)(*piVar5 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 6) = 0;
  }
  if ((iVar11 != iVar8) && (local_58 != 0)) {
    *pcVar12 = cVar10;
    pcVar12 = local_54 + local_58 + 1;
  }
  uVar4 = 0;
  if (0 < local_6c) {
    if (local_78 != 0) {
      *param_4 = -1;
      return 0;
    }
    if (param_6 == 1) {
      sVar2 = -sVar2;
    }
    *param_4 = sVar2;
    uVar4 = local_84;
    if (iVar11 != iVar8) {
      uVar4 = std::priv::__valid_grouping
                        (local_54,pcVar12,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10));
    }
  }
  return uVar4;
}



### FUNC FUN_0003fc94 @ 0003fc94

void FUN_0003fc94(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined4 *param_6)

{
  locale *this;
  undefined4 uVar1;
  uint uVar2;
  int *piVar3;
  uint uVar4;
  int iVar5;
  undefined1 auStack_34 [4];
  int local_30 [5];
  int *local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  uVar2 = FUN_0003f220(param_2,param_3,*(undefined4 *)(param_4 + 4),uVar1);
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar4 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar4 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar4 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    uVar4 = 4;
    if ((uVar2 & 1) != 0) {
      uVar4 = 0;
      *param_6 = 0;
    }
  }
  else {
    piVar3 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<char>::id);
    uVar1 = (**(code **)(*piVar3 + 0xc))(piVar3);
    (**(code **)(*piVar3 + 0x10))(local_30,piVar3);
    iVar5 = FUN_0003fe98(param_2,param_3,(int)uVar2 >> 2,param_6,uVar2 & 1,(uVar2 & 2) != 0,uVar1,
                         local_30,auStack_34);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
        std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      }
      else {
        operator_delete(local_1c);
      }
    }
    uVar4 = 0;
    if (iVar5 == 0) {
      uVar4 = 4;
    }
  }
  *param_5 = uVar4;
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar2 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar2 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar2;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar2 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar2 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar2 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar2;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar2 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    *param_5 = *param_5 | 2;
  }
  iVar5 = param_2[1];
  *param_1 = *param_2;
  param_1[1] = iVar5;
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_0003fe98 @ 0003fe98

undefined4
FUN_0003fe98(int *param_1,int *param_2,int param_3,uint *param_4,int param_5,int param_6,
            uint param_7,int param_8)

{
  char cVar1;
  uint uVar2;
  int *piVar3;
  uint uVar4;
  undefined4 uVar5;
  bool bVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  uint uVar10;
  undefined4 local_84;
  int local_6c;
  char *local_64;
  int local_5c;
  char acStack_54 [64];
  
  iVar7 = *(int *)(param_8 + 0x10);
  iVar9 = *(int *)(param_8 + 0x14);
  local_84 = 1;
  uVar2 = __udivsi3(0xffffffff,param_3);
  local_6c = param_5;
  cVar1 = '\0';
  uVar10 = 0;
  local_5c = 0;
  bVar6 = false;
  while( true ) {
    local_64 = acStack_54 + local_5c;
    piVar3 = (int *)*param_1;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    piVar3 = (int *)*param_2;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
    }
    if (*(char *)((int)param_1 + 5) == *(char *)((int)param_2 + 5)) break;
    if (*(char *)((int)param_1 + 6) == '\0') {
      piVar3 = (int *)*param_1;
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    else {
      uVar4 = (uint)*(byte *)(param_1 + 1);
    }
    iVar8 = 0xff;
    if ((uVar4 & 0xff) == param_7 && iVar9 != iVar7) {
      *local_64 = cVar1;
      local_5c = local_5c + 1;
      cVar1 = '\0';
    }
    else {
      if (-1 < (char)uVar4) {
        iVar8 = std::priv::__digit_val_table(uVar4 & 0xff);
      }
      if (param_3 <= iVar8) break;
      cVar1 = cVar1 + '\x01';
      local_6c = local_6c + 1;
      if (uVar2 < uVar10) {
        bVar6 = true;
      }
      else {
        uVar4 = iVar8 + uVar10 * param_3;
        bVar6 = (bool)(bVar6 | (uVar10 != 0 && uVar4 <= uVar10));
        uVar10 = uVar4;
      }
    }
    piVar3 = (int *)*param_1;
    if ((uint)piVar3[2] < (uint)piVar3[3]) {
      piVar3[2] = piVar3[2] + 1;
    }
    else {
      (**(code **)(*piVar3 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 6) = 0;
  }
  if ((iVar9 != iVar7) && (local_5c != 0)) {
    *local_64 = cVar1;
    local_64 = acStack_54 + local_5c + 1;
  }
  uVar5 = 0;
  if (0 < local_6c) {
    if (bVar6) {
      *param_4 = 0xffffffff;
      return 0;
    }
    uVar2 = -uVar10;
    if (param_6 == 0) {
      uVar2 = uVar10;
    }
    *param_4 = uVar2;
    uVar5 = local_84;
    if (iVar9 != iVar7) {
      uVar5 = std::priv::__valid_grouping
                        (acStack_54,local_64,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10));
    }
  }
  return uVar5;
}



### FUNC FUN_00040090 @ 00040090

void FUN_00040090(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined4 *param_6)

{
  locale *this;
  undefined4 uVar1;
  uint uVar2;
  int *piVar3;
  uint uVar4;
  int iVar5;
  undefined1 auStack_34 [4];
  int local_30 [5];
  int *local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  uVar2 = FUN_0003f220(param_2,param_3,*(undefined4 *)(param_4 + 4),uVar1);
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar4 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar4 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar4 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    uVar4 = 4;
    if ((uVar2 & 1) != 0) {
      uVar4 = 0;
      *param_6 = 0;
    }
  }
  else {
    piVar3 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<char>::id);
    uVar1 = (**(code **)(*piVar3 + 0xc))(piVar3);
    (**(code **)(*piVar3 + 0x10))(local_30,piVar3);
    iVar5 = FUN_00040294(param_2,param_3,(int)uVar2 >> 2,param_6,uVar2 & 1,(uVar2 & 2) != 0,uVar1,
                         local_30,auStack_34);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
        std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      }
      else {
        operator_delete(local_1c);
      }
    }
    uVar4 = 0;
    if (iVar5 == 0) {
      uVar4 = 4;
    }
  }
  *param_5 = uVar4;
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar2 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar2 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar2;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar2 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar2 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar2 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar2;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar2 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    *param_5 = *param_5 | 2;
  }
  iVar5 = param_2[1];
  *param_1 = *param_2;
  param_1[1] = iVar5;
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00040294 @ 00040294

undefined4
FUN_00040294(int *param_1,int *param_2,int param_3,uint *param_4,int param_5,int param_6,
            uint param_7,int param_8)

{
  char cVar1;
  uint uVar2;
  int *piVar3;
  uint uVar4;
  undefined4 uVar5;
  bool bVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  uint uVar10;
  undefined4 local_84;
  int local_6c;
  char *local_64;
  int local_5c;
  char acStack_54 [64];
  
  iVar7 = *(int *)(param_8 + 0x10);
  iVar9 = *(int *)(param_8 + 0x14);
  local_84 = 1;
  uVar2 = __udivsi3(0xffffffff,param_3);
  local_6c = param_5;
  cVar1 = '\0';
  uVar10 = 0;
  local_5c = 0;
  bVar6 = false;
  while( true ) {
    local_64 = acStack_54 + local_5c;
    piVar3 = (int *)*param_1;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    piVar3 = (int *)*param_2;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
    }
    if (*(char *)((int)param_1 + 5) == *(char *)((int)param_2 + 5)) break;
    if (*(char *)((int)param_1 + 6) == '\0') {
      piVar3 = (int *)*param_1;
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    else {
      uVar4 = (uint)*(byte *)(param_1 + 1);
    }
    iVar8 = 0xff;
    if ((uVar4 & 0xff) == param_7 && iVar9 != iVar7) {
      *local_64 = cVar1;
      local_5c = local_5c + 1;
      cVar1 = '\0';
    }
    else {
      if (-1 < (char)uVar4) {
        iVar8 = std::priv::__digit_val_table(uVar4 & 0xff);
      }
      if (param_3 <= iVar8) break;
      cVar1 = cVar1 + '\x01';
      local_6c = local_6c + 1;
      if (uVar2 < uVar10) {
        bVar6 = true;
      }
      else {
        uVar4 = iVar8 + uVar10 * param_3;
        bVar6 = (bool)(bVar6 | (uVar10 != 0 && uVar4 <= uVar10));
        uVar10 = uVar4;
      }
    }
    piVar3 = (int *)*param_1;
    if ((uint)piVar3[2] < (uint)piVar3[3]) {
      piVar3[2] = piVar3[2] + 1;
    }
    else {
      (**(code **)(*piVar3 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 6) = 0;
  }
  if ((iVar9 != iVar7) && (local_5c != 0)) {
    *local_64 = cVar1;
    local_64 = acStack_54 + local_5c + 1;
  }
  uVar5 = 0;
  if (0 < local_6c) {
    if (bVar6) {
      *param_4 = 0xffffffff;
      return 0;
    }
    uVar2 = -uVar10;
    if (param_6 == 0) {
      uVar2 = uVar10;
    }
    *param_4 = uVar2;
    uVar5 = local_84;
    if (iVar9 != iVar7) {
      uVar5 = std::priv::__valid_grouping
                        (acStack_54,local_64,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10));
    }
  }
  return uVar5;
}



### FUNC FUN_0004048c @ 0004048c

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_0004048c(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,float *param_6)

{
  locale *this;
  undefined4 uVar1;
  undefined4 uVar2;
  int iVar3;
  int *piVar4;
  uint uVar5;
  undefined1 *local_134 [4];
  undefined1 **local_124;
  undefined1 local_120;
  undefined1 auStack_11f [256];
  undefined1 auStack_1f [3];
  undefined1 **local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  uVar2 = std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<char>::id);
  __aeabi_memclr(auStack_11f,0x100);
  local_120 = 0;
  local_134[0] = auStack_1f;
  local_124 = (undefined1 **)&local_120;
  local_1c = (undefined1 **)&local_120;
  iVar3 = FUN_00040604(local_134,param_2,param_3,uVar1,uVar2);
  uVar5 = 4;
  if (iVar3 == 1) {
    uVar5 = 0;
    std::priv::__string_to_float((__basic_iostring *)local_134,param_6);
  }
  *param_5 = uVar5;
  piVar4 = (int *)*param_2;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar4[2] < (byte *)piVar4[3]) {
      uVar5 = (uint)*(byte *)piVar4[2];
    }
    else {
      uVar5 = (**(code **)(*piVar4 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar5;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar5 == 0xffffffff;
  }
  piVar4 = (int *)*param_3;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar4[2] < (byte *)piVar4[3]) {
      uVar5 = (uint)*(byte *)piVar4[2];
    }
    else {
      uVar5 = (**(code **)(*piVar4 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar5;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar5 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    *param_5 = *param_5 | 2;
  }
  iVar3 = param_2[1];
  *param_1 = *param_2;
  param_1[1] = iVar3;
  if (((local_1c != local_134) && (local_1c != (undefined1 **)0x0)) &&
     ((undefined1 **)&local_120 != local_1c)) {
    if ((uint)((int)local_134[0] - (int)local_1c) < 0x81) {
      std::__node_alloc::_M_deallocate(local_1c,(int)local_134[0] - (int)local_1c);
    }
    else {
      operator_delete(local_1c);
    }
  }
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00040604 @ 00040604

undefined4
FUN_00040604(undefined4 param_1,int *param_2,int *param_3,undefined4 param_4,int *param_5)

{
  uint uVar1;
  undefined4 uVar2;
  uint uVar3;
  int *piVar4;
  uint uVar5;
  uint uVar6;
  int local_44;
  undefined1 uStack_3e;
  undefined4 local_40;
  undefined1 auStack_3c [12];
  undefined1 local_30 [4];
  int local_2c [4];
  int *local_1c;
  int *local_18;
  
  (**(code **)(*param_5 + 0x10))(local_2c,param_5);
  local_30[0] = 1;
  uVar1 = (**(code **)(*param_5 + 8))(param_5);
  uVar2 = (**(code **)(*param_5 + 0xc))(param_5);
  FUN_000408f4(&local_44,*param_2,param_2[1],*param_3,param_3[1],param_1,0x2b,0x2d);
  *(short *)(param_2 + 1) = (short)local_40;
  *param_2 = local_44;
  *(undefined1 *)((int)param_2 + 6) = uStack_3e;
  if (local_18 == local_1c) {
    uVar3 = FUN_00040bac(param_2,*param_3,param_3[1],param_1,auStack_3c);
  }
  else {
    uVar3 = FUN_00040a50(param_2,*param_3,param_3[1],param_1,auStack_3c,uVar2,local_2c,local_30);
  }
  piVar4 = (int *)*param_2;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar4[2] < (byte *)piVar4[3]) {
      uVar5 = (uint)*(byte *)piVar4[2];
    }
    else {
      uVar5 = (**(code **)(*piVar4 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar5;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar5 == 0xffffffff;
  }
  piVar4 = (int *)*param_3;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar4[2] < (byte *)piVar4[3]) {
      uVar5 = (uint)*(byte *)piVar4[2];
    }
    else {
      uVar5 = (**(code **)(*piVar4 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar5;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar5 == 0xffffffff;
  }
  uVar2 = 0;
  uVar5 = 0;
  if (*(char *)((int)param_2 + 5) != *(char *)((int)param_3 + 5)) {
    if (*(char *)((int)param_2 + 6) == '\0') {
      piVar4 = (int *)*param_2;
      if ((byte *)piVar4[2] < (byte *)piVar4[3]) {
        uVar6 = (uint)*(byte *)piVar4[2];
      }
      else {
        uVar6 = (**(code **)(*piVar4 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar6;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar6 == 0xffffffff;
    }
    else {
      uVar6 = (uint)*(byte *)(param_2 + 1);
    }
    uVar5 = 0;
    if ((uVar6 & 0xff) == uVar1) {
      FUN_00040cb0(param_1,0x2e);
      piVar4 = (int *)*param_2;
      if ((uint)piVar4[2] < (uint)piVar4[3]) {
        piVar4[2] = piVar4[2] + 1;
      }
      else {
        (**(code **)(*piVar4 + 0x24))();
      }
      *(undefined1 *)((int)param_2 + 6) = 0;
      uVar5 = FUN_00040bac(param_2,*param_3,param_3[1],param_1,auStack_3c);
    }
  }
  if ((uVar3 | uVar5) == 1) {
    piVar4 = (int *)*param_2;
    if ((piVar4 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
      if ((byte *)piVar4[2] < (byte *)piVar4[3]) {
        uVar1 = (uint)*(byte *)piVar4[2];
      }
      else {
        uVar1 = (**(code **)(*piVar4 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar1;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar1 == 0xffffffff;
    }
    piVar4 = (int *)*param_3;
    if ((piVar4 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
      if ((byte *)piVar4[2] < (byte *)piVar4[3]) {
        uVar1 = (uint)*(byte *)piVar4[2];
      }
      else {
        uVar1 = (**(code **)(*piVar4 + 0x20))();
      }
      *(char *)(param_3 + 1) = (char)uVar1;
      *(undefined1 *)((int)param_3 + 6) = 1;
      *(bool *)((int)param_3 + 5) = uVar1 == 0xffffffff;
    }
    uVar2 = 1;
    if (*(char *)((int)param_2 + 5) != *(char *)((int)param_3 + 5)) {
      if (*(char *)((int)param_2 + 6) == '\0') {
        piVar4 = (int *)*param_2;
        if ((byte *)piVar4[2] < (byte *)piVar4[3]) {
          uVar1 = (uint)*(byte *)piVar4[2];
        }
        else {
          uVar1 = (**(code **)(*piVar4 + 0x20))();
        }
        *(char *)(param_2 + 1) = (char)uVar1;
        *(undefined1 *)((int)param_2 + 6) = 1;
        *(bool *)((int)param_2 + 5) = uVar1 == 0xffffffff;
      }
      else {
        uVar1 = (uint)*(byte *)(param_2 + 1);
      }
      if ((uVar1 & 0xff | 0x20) == 0x65) {
        FUN_00040cb0(param_1,0x65);
        piVar4 = (int *)*param_2;
        if ((uint)piVar4[2] < (uint)piVar4[3]) {
          piVar4[2] = piVar4[2] + 1;
        }
        else {
          (**(code **)(*piVar4 + 0x24))();
        }
        *(undefined1 *)((int)param_2 + 6) = 0;
        FUN_000408f4(&local_44,*param_2,param_2[1],*param_3,param_3[1],param_1,0x2b,0x2d);
        *(short *)(param_2 + 1) = (short)local_40;
        *param_2 = local_44;
        *(undefined1 *)((int)param_2 + 6) = uStack_3e;
        uVar2 = FUN_00040bac(param_2,*param_3,param_3[1],param_1,auStack_3c);
      }
    }
  }
  if ((local_18 != local_2c) && (local_18 != (int *)0x0)) {
    if ((uint)(local_2c[0] - (int)local_18) < 0x81) {
      std::__node_alloc::_M_deallocate(local_18,local_2c[0] - (int)local_18);
    }
    else {
      operator_delete(local_18);
    }
  }
  return uVar2;
}



### FUNC FUN_000408f4 @ 000408f4

undefined4 *
FUN_000408f4(undefined4 *param_1,int *param_2,uint param_3,int *param_4,uint param_5,
            undefined4 param_6,uint param_7,uint param_8)

{
  uint uVar1;
  uint uVar2;
  
  if ((param_2 != (int *)0x0) && ((param_3 & 0xff0000) == 0)) {
    if ((byte *)param_2[2] < (byte *)param_2[3]) {
      uVar1 = (uint)*(byte *)param_2[2];
    }
    else {
      uVar1 = (**(code **)(*param_2 + 0x20))(param_2);
    }
    param_3 = param_3 & 0xff000000 | uVar1 & 0xff | (uint)(uVar1 == 0xffffffff) << 8 | 0x10000;
  }
  if ((param_4 != (int *)0x0) && ((param_5 & 0xff0000) == 0)) {
    if ((byte *)param_4[2] < (byte *)param_4[3]) {
      uVar1 = (uint)*(byte *)param_4[2];
    }
    else {
      uVar1 = (**(code **)(*param_4 + 0x20))(param_4);
    }
    param_5 = (uint)(uVar1 == 0xffffffff) << 8;
  }
  uVar1 = param_3;
  if ((param_3 >> 8 & 0xff) == (param_5 >> 8 & 0xff)) goto LAB_00040a44;
  if ((param_3 & 0xff0000) == 0) {
    if ((byte *)param_2[2] < (byte *)param_2[3]) {
      uVar1 = (uint)*(byte *)param_2[2];
    }
    else {
      uVar1 = (**(code **)(*param_2 + 0x20))(param_2);
    }
    uVar2 = param_3 & 0xff000000;
    param_3 = uVar1;
    uVar1 = uVar2 | uVar1 & 0xff | (uint)(uVar1 == 0xffffffff) << 8 | 0x10000;
  }
  if ((param_3 & 0xff) == param_7) {
    uVar2 = param_2[2];
    if ((uint)param_2[3] <= uVar2) {
      (**(code **)(*param_2 + 0x24))(param_2);
      uVar1 = uVar1 & 0xff00ffff;
      goto LAB_00040a44;
    }
LAB_00040a32:
    param_2[2] = uVar2 + 1;
  }
  else {
    if ((param_3 & 0xff) != param_8) goto LAB_00040a44;
    FUN_00040cb0(param_6,0x2d);
    uVar2 = param_2[2];
    if (uVar2 < (uint)param_2[3]) goto LAB_00040a32;
    (**(code **)(*param_2 + 0x24))(param_2);
  }
  uVar1 = uVar1 & 0xff00ffff;
LAB_00040a44:
  *param_1 = param_2;
  param_1[1] = uVar1;
  return param_1 + 2;
}



### FUNC FUN_00040a50 @ 00040a50

undefined4
FUN_00040a50(int *param_1,int *param_2,uint param_3,undefined4 param_4,undefined4 param_5,
            uint param_6,int param_7,undefined1 *param_8)

{
  char cVar1;
  undefined1 uVar2;
  int *piVar3;
  uint uVar4;
  char *pcVar5;
  int iVar6;
  undefined4 local_6c;
  char local_54 [64];
  
  iVar6 = 0;
  cVar1 = '\0';
  local_6c = 0;
  while( true ) {
    pcVar5 = local_54 + iVar6;
    piVar3 = (int *)*param_1;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    if ((param_2 != (int *)0x0) && ((param_3 & 0xff0000) == 0)) {
      if ((byte *)param_2[2] < (byte *)param_2[3]) {
        uVar4 = (uint)*(byte *)param_2[2];
      }
      else {
        uVar4 = (**(code **)(*param_2 + 0x20))(param_2);
      }
      param_3 = (uint)(uVar4 == 0xffffffff) << 8 | 0x10000;
    }
    if ((uint)*(byte *)((int)param_1 + 5) == (param_3 >> 8 & 0xff)) break;
    if (*(char *)((int)param_1 + 6) == '\0') {
      piVar3 = (int *)*param_1;
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    else {
      uVar4 = (uint)*(byte *)(param_1 + 1);
    }
    if ((uVar4 & 0xff) == param_6) {
      *pcVar5 = cVar1;
      iVar6 = iVar6 + 1;
      cVar1 = '\0';
    }
    else {
      if (9 < (uVar4 - 0x30 & 0xff)) break;
      FUN_00040cb0(param_4);
      cVar1 = cVar1 + '\x01';
      local_6c = 1;
    }
    piVar3 = (int *)*param_1;
    if ((uint)piVar3[2] < (uint)piVar3[3]) {
      piVar3[2] = piVar3[2] + 1;
    }
    else {
      (**(code **)(*piVar3 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 6) = 0;
  }
  if (iVar6 != 0) {
    *pcVar5 = cVar1;
    pcVar5 = local_54 + iVar6 + 1;
  }
  uVar2 = std::priv::__valid_grouping
                    (local_54,pcVar5,*(char **)(param_7 + 0x14),*(char **)(param_7 + 0x10));
  *param_8 = uVar2;
  return local_6c;
}



### FUNC FUN_00040bac @ 00040bac

undefined4 FUN_00040bac(int *param_1,int *param_2,uint param_3,undefined4 param_4)

{
  int *piVar1;
  uint uVar2;
  undefined4 local_1c;
  
  local_1c = 0;
  while( true ) {
    piVar1 = (int *)*param_1;
    if ((piVar1 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
      if ((byte *)piVar1[2] < (byte *)piVar1[3]) {
        uVar2 = (uint)*(byte *)piVar1[2];
      }
      else {
        uVar2 = (**(code **)(*piVar1 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar2;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar2 == 0xffffffff;
    }
    if ((param_2 != (int *)0x0) && ((param_3 & 0xff0000) == 0)) {
      if ((byte *)param_2[2] < (byte *)param_2[3]) {
        uVar2 = (uint)*(byte *)param_2[2];
      }
      else {
        uVar2 = (**(code **)(*param_2 + 0x20))(param_2);
      }
      param_3 = (uint)(uVar2 == 0xffffffff) << 8 | 0x10000;
    }
    if ((uint)*(byte *)((int)param_1 + 5) == (param_3 >> 8 & 0xff)) {
      return local_1c;
    }
    if (*(char *)((int)param_1 + 6) == '\0') {
      piVar1 = (int *)*param_1;
      if ((byte *)piVar1[2] < (byte *)piVar1[3]) {
        uVar2 = (uint)*(byte *)piVar1[2];
      }
      else {
        uVar2 = (**(code **)(*piVar1 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar2;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar2 == 0xffffffff;
    }
    else {
      uVar2 = (uint)*(byte *)(param_1 + 1);
    }
    if (9 < (uVar2 - 0x30 & 0xff)) break;
    FUN_00040cb0(param_4,uVar2 & 0xff);
    piVar1 = (int *)*param_1;
    if ((uint)piVar1[2] < (uint)piVar1[3]) {
      piVar1[2] = piVar1[2] + 1;
    }
    else {
      (**(code **)(*piVar1 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 6) = 0;
    local_1c = 1;
  }
  return local_1c;
}



### FUNC FUN_00040cb0 @ 00040cb0

void FUN_00040cb0(int *param_1,undefined1 param_2)

{
  uint uVar1;
  uint uVar2;
  undefined1 *puVar3;
  int *piVar4;
  int *piVar5;
  uint uVar6;
  uint uVar7;
  int *piVar8;
  int *piVar9;
  int *piVar10;
  
  piVar10 = (int *)param_1[0x46];
  piVar5 = param_1 + 0x46;
  if (piVar10 == param_1) {
    piVar8 = (int *)param_1[4];
    piVar4 = param_1 + 4;
  }
  else {
    piVar8 = (int *)param_1[4];
    piVar4 = (int *)*param_1;
  }
  if ((int)piVar4 - (int)piVar8 == 1) {
    uVar2 = (int)piVar8 - (int)piVar10;
    if (uVar2 == 0xfffffffe) {
                    /* WARNING: Subroutine does not return */
      std::__stl_throw_length_error("basic_string");
    }
    uVar6 = uVar2;
    if (uVar2 < 2) {
      uVar6 = 1;
    }
    uVar7 = uVar2 + uVar6 + 1;
    uVar1 = 0xfffffffe;
    if (uVar2 <= uVar7) {
      uVar1 = uVar7;
    }
    uVar7 = 0xfffffffe;
    if (uVar2 + uVar6 != -2) {
      uVar7 = uVar1;
    }
    if (uVar7 >> 1 < 0x81) {
      piVar4 = param_1 + 5;
    }
    else {
      piVar4 = (int *)operator_new(uVar7);
      piVar8 = (int *)param_1[4];
      piVar10 = (int *)*piVar5;
    }
    piVar9 = piVar4;
    if (0 < (int)piVar8 - (int)piVar10) {
      puVar3 = (undefined1 *)((int)piVar8 + (1 - (int)piVar10));
      do {
        *(char *)piVar9 = (char)*piVar10;
        puVar3 = puVar3 + -1;
        piVar9 = (int *)((int)piVar9 + 1);
        piVar10 = (int *)((int)piVar10 + 1);
      } while (1 < (int)puVar3);
    }
    *(undefined1 *)piVar9 = 0;
    piVar10 = (int *)*piVar5;
    if (((piVar10 != param_1) && (piVar10 != (int *)0x0)) && (param_1 + 5 != piVar10)) {
      if ((uint)(*param_1 - (int)piVar10) < 0x81) {
        std::__node_alloc::_M_deallocate(piVar10,*param_1 - (int)piVar10);
      }
      else {
        operator_delete(piVar10);
      }
    }
    param_1[4] = (int)piVar9;
    *param_1 = (int)((int)piVar4 + uVar7);
    *piVar5 = (int)piVar4;
    piVar8 = piVar9;
  }
  param_1 = param_1 + 4;
  *(undefined1 *)((int)piVar8 + 1) = 0;
  *(undefined1 *)*param_1 = param_2;
  *param_1 = *param_1 + 1;
  return;
}



### FUNC FUN_00040dac @ 00040dac

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_00040dac(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,double *param_6)

{
  locale *this;
  undefined4 uVar1;
  undefined4 uVar2;
  int iVar3;
  int *piVar4;
  uint uVar5;
  undefined1 *local_134 [4];
  undefined1 **local_124;
  undefined1 local_120;
  undefined1 auStack_11f [256];
  undefined1 auStack_1f [3];
  undefined1 **local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  uVar2 = std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<char>::id);
  __aeabi_memclr(auStack_11f,0x100);
  local_120 = 0;
  local_134[0] = auStack_1f;
  local_124 = (undefined1 **)&local_120;
  local_1c = (undefined1 **)&local_120;
  iVar3 = FUN_00040604(local_134,param_2,param_3,uVar1,uVar2);
  uVar5 = 4;
  if (iVar3 == 1) {
    uVar5 = 0;
    std::priv::__string_to_float((__basic_iostring *)local_134,param_6);
  }
  *param_5 = uVar5;
  piVar4 = (int *)*param_2;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar4[2] < (byte *)piVar4[3]) {
      uVar5 = (uint)*(byte *)piVar4[2];
    }
    else {
      uVar5 = (**(code **)(*piVar4 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar5;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar5 == 0xffffffff;
  }
  piVar4 = (int *)*param_3;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar4[2] < (byte *)piVar4[3]) {
      uVar5 = (uint)*(byte *)piVar4[2];
    }
    else {
      uVar5 = (**(code **)(*piVar4 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar5;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar5 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    *param_5 = *param_5 | 2;
  }
  iVar3 = param_2[1];
  *param_1 = *param_2;
  param_1[1] = iVar3;
  if (((local_1c != local_134) && (local_1c != (undefined1 **)0x0)) &&
     ((undefined1 **)&local_120 != local_1c)) {
    if ((uint)((int)local_134[0] - (int)local_1c) < 0x81) {
      std::__node_alloc::_M_deallocate(local_1c,(int)local_134[0] - (int)local_1c);
    }
    else {
      operator_delete(local_1c);
    }
  }
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00040f24 @ 00040f24

void FUN_00040f24(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined4 *param_6)

{
  locale *this;
  undefined4 uVar1;
  uint uVar2;
  int *piVar3;
  uint uVar4;
  int iVar5;
  undefined1 auStack_34 [4];
  int local_30 [5];
  int *local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  uVar2 = FUN_0003f220(param_2,param_3,*(undefined4 *)(param_4 + 4),uVar1);
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar4 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar4 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar4 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    uVar4 = 4;
    if ((uVar2 & 1) != 0) {
      uVar4 = 0;
      *param_6 = 0;
      param_6[1] = 0;
    }
  }
  else {
    piVar3 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<char>::id);
    uVar1 = (**(code **)(*piVar3 + 0xc))(piVar3);
    (**(code **)(*piVar3 + 0x10))(local_30,piVar3);
    iVar5 = FUN_00041128(param_2,param_3,(int)uVar2 >> 2,param_6,uVar2 & 1,(uVar2 & 2) != 0,uVar1,
                         local_30,auStack_34);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
        std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      }
      else {
        operator_delete(local_1c);
      }
    }
    uVar4 = 0;
    if (iVar5 == 0) {
      uVar4 = 4;
    }
  }
  *param_5 = uVar4;
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar2 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar2 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar2;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar2 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar2 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar2 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar2;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar2 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    *param_5 = *param_5 | 2;
  }
  iVar5 = param_2[1];
  *param_1 = *param_2;
  param_1[1] = iVar5;
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00041128 @ 00041128

undefined4
FUN_00041128(int *param_1,int *param_2,int param_3,uint *param_4,int param_5,int param_6,
            uint param_7,int param_8)

{
  bool bVar1;
  longlong lVar2;
  int *piVar3;
  uint uVar4;
  uint uVar5;
  undefined4 uVar6;
  char cVar7;
  bool bVar8;
  int iVar9;
  int iVar10;
  undefined8 uVar11;
  longlong lVar12;
  undefined4 local_94;
  int local_78;
  char *local_70;
  uint local_64;
  uint local_60;
  uint local_5c;
  int local_58;
  char acStack_54 [64];
  
  iVar9 = *(int *)(param_8 + 0x10);
  iVar10 = *(int *)(param_8 + 0x14);
  local_94 = 1;
  uVar11 = __aeabi_uldivmod(0xffffffff,0xffffffff,param_3);
  uVar5 = (uint)((ulonglong)uVar11 >> 0x20);
  local_58 = 0;
  local_78 = param_5;
  cVar7 = '\0';
  bVar8 = false;
  lVar2 = 0;
  while( true ) {
    local_5c = (uint)((ulonglong)lVar2 >> 0x20);
    local_60 = (uint)lVar2;
    local_70 = acStack_54 + local_58;
    piVar3 = (int *)*param_1;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    piVar3 = (int *)*param_2;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
    }
    if (*(char *)((int)param_1 + 5) == *(char *)((int)param_2 + 5)) break;
    if (*(char *)((int)param_1 + 6) == '\0') {
      piVar3 = (int *)*param_1;
      if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
        uVar4 = (uint)*(byte *)piVar3[2];
      }
      else {
        uVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar4;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar4 == 0xffffffff;
    }
    else {
      uVar4 = (uint)*(byte *)(param_1 + 1);
    }
    local_64 = 0xff;
    lVar12 = lVar2;
    if ((uVar4 & 0xff) == param_7 && iVar10 != iVar9) {
      *local_70 = cVar7;
      local_58 = local_58 + 1;
      cVar7 = '\0';
    }
    else {
      if (-1 < (char)uVar4) {
        local_64 = std::priv::__digit_val_table(uVar4 & 0xff);
      }
      if (param_3 <= (int)local_64) break;
      bVar1 = (uint)uVar11 < local_60;
      if (local_5c != uVar5) {
        bVar1 = uVar5 < local_5c;
      }
      cVar7 = cVar7 + '\x01';
      local_78 = local_78 + 1;
      if (bVar1) {
        bVar8 = true;
      }
      else {
        lVar12 = __muldi3(local_60,local_5c,param_3,param_3 >> 0x1f);
        lVar12 = lVar12 + (ulonglong)local_64;
        uVar4 = (uint)((ulonglong)lVar12 >> 0x20);
        bVar1 = local_60 < (uint)lVar12;
        if (uVar4 != local_5c) {
          bVar1 = local_5c < uVar4;
        }
        bVar8 = (bool)(bVar8 | (lVar2 != 0 && !bVar1));
      }
    }
    piVar3 = (int *)*param_1;
    if ((uint)piVar3[2] < (uint)piVar3[3]) {
      piVar3[2] = piVar3[2] + 1;
    }
    else {
      (**(code **)(*piVar3 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 6) = 0;
    lVar2 = lVar12;
  }
  if ((iVar10 != iVar9) && (local_58 != 0)) {
    *local_70 = cVar7;
    local_70 = acStack_54 + local_58 + 1;
  }
  uVar6 = 0;
  if (0 < local_78) {
    if (bVar8) {
      *param_4 = 0xffffffff;
      param_4[1] = 0xffffffff;
      return 0;
    }
    uVar5 = -local_60;
    if (param_6 == 0) {
      uVar5 = local_60;
    }
    *param_4 = uVar5;
    uVar5 = -(uint)(local_60 != 0) - local_5c;
    if (param_6 == 0) {
      uVar5 = local_5c;
    }
    param_4[1] = uVar5;
    uVar6 = local_94;
    if (iVar10 != iVar9) {
      uVar6 = std::priv::__valid_grouping
                        (acStack_54,local_70,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10));
    }
  }
  return uVar6;
}



### FUNC FUN_0004139c @ 0004139c

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_0004139c(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 longdouble *param_6)

{
  locale *this;
  undefined4 uVar1;
  undefined4 uVar2;
  int iVar3;
  int *piVar4;
  uint uVar5;
  undefined1 *local_134 [4];
  undefined1 **local_124;
  undefined1 local_120;
  undefined1 auStack_11f [256];
  undefined1 auStack_1f [3];
  undefined1 **local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  uVar2 = std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<char>::id);
  __aeabi_memclr(auStack_11f,0x100);
  local_120 = 0;
  local_134[0] = auStack_1f;
  local_124 = (undefined1 **)&local_120;
  local_1c = (undefined1 **)&local_120;
  iVar3 = FUN_00040604(local_134,param_2,param_3,uVar1,uVar2);
  uVar5 = 4;
  if (iVar3 == 1) {
    uVar5 = 0;
    std::priv::__string_to_float((__basic_iostring *)local_134,param_6);
  }
  *param_5 = uVar5;
  piVar4 = (int *)*param_2;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar4[2] < (byte *)piVar4[3]) {
      uVar5 = (uint)*(byte *)piVar4[2];
    }
    else {
      uVar5 = (**(code **)(*piVar4 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar5;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar5 == 0xffffffff;
  }
  piVar4 = (int *)*param_3;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar4[2] < (byte *)piVar4[3]) {
      uVar5 = (uint)*(byte *)piVar4[2];
    }
    else {
      uVar5 = (**(code **)(*piVar4 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar5;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar5 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    *param_5 = *param_5 | 2;
  }
  iVar3 = param_2[1];
  *param_1 = *param_2;
  param_1[1] = iVar3;
  if (((local_1c != local_134) && (local_1c != (undefined1 **)0x0)) &&
     ((undefined1 **)&local_120 != local_1c)) {
    if ((uint)((int)local_134[0] - (int)local_1c) < 0x81) {
      std::__node_alloc::_M_deallocate(local_1c,(int)local_134[0] - (int)local_1c);
    }
    else {
      operator_delete(local_1c);
    }
  }
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00041514 @ 00041514

void FUN_00041514(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined4 *param_6)

{
  locale *this;
  undefined4 uVar1;
  uint uVar2;
  int *piVar3;
  uint uVar4;
  int iVar5;
  undefined1 auStack_34 [4];
  int local_30 [5];
  int *local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  uVar2 = FUN_0003f220(param_2,param_3,*(undefined4 *)(param_4 + 4),uVar1);
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar4 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar4 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar4 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar4;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar4 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    uVar4 = 4;
    if ((uVar2 & 1) != 0) {
      uVar4 = 0;
      *param_6 = 0;
      param_6[1] = 0;
    }
  }
  else {
    piVar3 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<char>::id);
    uVar1 = (**(code **)(*piVar3 + 0xc))(piVar3);
    (**(code **)(*piVar3 + 0x10))(local_30,piVar3);
    iVar5 = FUN_00041718(param_2,param_3,(int)uVar2 >> 2,param_6,uVar2 & 1,(uVar2 & 2) != 0,uVar1,
                         local_30,auStack_34);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
        std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      }
      else {
        operator_delete(local_1c);
      }
    }
    uVar4 = 0;
    if (iVar5 == 0) {
      uVar4 = 4;
    }
  }
  *param_5 = uVar4;
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar2 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar2 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_2 + 1) = (char)uVar2;
    *(undefined1 *)((int)param_2 + 6) = 1;
    *(bool *)((int)param_2 + 5) = uVar2 == 0xffffffff;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 6) == '\0')) {
    if ((byte *)piVar3[2] < (byte *)piVar3[3]) {
      uVar2 = (uint)*(byte *)piVar3[2];
    }
    else {
      uVar2 = (**(code **)(*piVar3 + 0x20))();
    }
    *(char *)(param_3 + 1) = (char)uVar2;
    *(undefined1 *)((int)param_3 + 6) = 1;
    *(bool *)((int)param_3 + 5) = uVar2 == 0xffffffff;
  }
  if (*(char *)((int)param_2 + 5) == *(char *)((int)param_3 + 5)) {
    *param_5 = *param_5 | 2;
  }
  iVar5 = param_2[1];
  *param_1 = *param_2;
  param_1[1] = iVar5;
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00041718 @ 00041718

undefined4
FUN_00041718(int *param_1,int *param_2,int param_3,uint *param_4,int param_5,int param_6,
            uint param_7,int param_8)

{
  bool bVar1;
  int *piVar2;
  uint uVar3;
  undefined4 uVar4;
  char cVar5;
  bool bVar6;
  int iVar7;
  int iVar8;
  uint uVar9;
  uint uVar10;
  uint uVar11;
  uint uVar12;
  undefined8 uVar13;
  undefined8 uVar14;
  uint local_a4;
  undefined4 local_90;
  int local_70;
  char *local_68;
  uint local_60;
  uint local_5c;
  int local_58;
  char acStack_54 [64];
  
  iVar7 = *(int *)(param_8 + 0x10);
  iVar8 = *(int *)(param_8 + 0x14);
  local_90 = 1;
  local_a4 = 0x80000000;
  uVar13 = __aeabi_ldivmod(0);
  uVar9 = (uint)((ulonglong)uVar13 >> 0x20);
  local_70 = param_5;
  cVar5 = '\0';
  local_5c = 0;
  bVar6 = false;
  local_58 = 0;
  local_60 = 0;
  while( true ) {
    local_68 = acStack_54 + local_58;
    piVar2 = (int *)*param_1;
    if ((piVar2 != (int *)0x0) && (*(char *)((int)param_1 + 6) == '\0')) {
      if ((byte *)piVar2[2] < (byte *)piVar2[3]) {
        uVar3 = (uint)*(byte *)piVar2[2];
      }
      else {
        uVar3 = (**(code **)(*piVar2 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar3;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar3 == 0xffffffff;
    }
    piVar2 = (int *)*param_2;
    if ((piVar2 != (int *)0x0) && (*(char *)((int)param_2 + 6) == '\0')) {
      if ((byte *)piVar2[2] < (byte *)piVar2[3]) {
        uVar3 = (uint)*(byte *)piVar2[2];
      }
      else {
        uVar3 = (**(code **)(*piVar2 + 0x20))();
      }
      *(char *)(param_2 + 1) = (char)uVar3;
      *(undefined1 *)((int)param_2 + 6) = 1;
      *(bool *)((int)param_2 + 5) = uVar3 == 0xffffffff;
    }
    if (*(char *)((int)param_1 + 5) == *(char *)((int)param_2 + 5)) break;
    if (*(char *)((int)param_1 + 6) == '\0') {
      piVar2 = (int *)*param_1;
      if ((byte *)piVar2[2] < (byte *)piVar2[3]) {
        uVar3 = (uint)*(byte *)piVar2[2];
      }
      else {
        uVar3 = (**(code **)(*piVar2 + 0x20))();
      }
      *(char *)(param_1 + 1) = (char)uVar3;
      *(undefined1 *)((int)param_1 + 6) = 1;
      *(bool *)((int)param_1 + 5) = uVar3 == 0xffffffff;
    }
    else {
      uVar3 = (uint)*(byte *)(param_1 + 1);
    }
    uVar11 = 0xff;
    uVar10 = local_60;
    uVar12 = local_5c;
    if ((uVar3 & 0xff) == param_7 && iVar8 != iVar7) {
      *local_68 = cVar5;
      local_58 = local_58 + 1;
      cVar5 = '\0';
    }
    else {
      if (-1 < (char)uVar3) {
        uVar11 = std::priv::__digit_val_table(uVar3 & 0xff);
      }
      if (param_3 <= (int)uVar11) break;
      bVar1 = local_5c < (uint)uVar13;
      if (local_60 != uVar9) {
        bVar1 = (int)local_60 < (int)uVar9;
      }
      cVar5 = cVar5 + '\x01';
      local_70 = local_70 + 1;
      if (bVar1) {
        bVar6 = true;
      }
      else {
        uVar14 = __muldi3(local_5c,local_60,param_3,param_3 >> 0x1f);
        uVar12 = (uint)uVar14 - uVar11;
        uVar10 = (int)((ulonglong)uVar14 >> 0x20) - (uint)((uint)uVar14 < uVar11);
        bVar1 = uVar12 < local_5c;
        if (uVar10 != local_60) {
          bVar1 = (int)uVar10 < (int)local_60;
        }
        bVar6 = (bool)(bVar6 | ((local_5c != 0 || local_60 != 0) && !bVar1));
      }
    }
    piVar2 = (int *)*param_1;
    if ((uint)piVar2[2] < (uint)piVar2[3]) {
      piVar2[2] = piVar2[2] + 1;
    }
    else {
      (**(code **)(*piVar2 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 6) = 0;
    local_60 = uVar10;
    local_5c = uVar12;
  }
  if ((iVar8 != iVar7) && (local_58 != 0)) {
    *local_68 = cVar5;
    local_68 = acStack_54 + local_58 + 1;
  }
  uVar4 = 0;
  if (0 < local_70) {
    if (bVar6) {
      uVar9 = 0;
      if (param_6 == 0) {
        uVar9 = 0xffffffff;
      }
      *param_4 = uVar9;
      if (param_6 == 0) {
        local_a4 = 0x7fffffff;
      }
      param_4[1] = local_a4;
      return 0;
    }
    uVar9 = local_5c;
    if (param_6 == 0) {
      uVar9 = -local_5c;
    }
    *param_4 = uVar9;
    if (param_6 == 0) {
      local_60 = -(uint)(local_5c != 0) - local_60;
    }
    param_4[1] = local_60;
    uVar4 = local_90;
    if (iVar8 != iVar7) {
      uVar4 = std::priv::__valid_grouping
                        (acStack_54,local_68,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10));
    }
  }
  return uVar4;
}



### FUNC FUN_00041986 @ 00041986

void FUN_00041986(facet *param_1)

{
  std::locale::facet::~facet(param_1);
  operator_delete(param_1);
  return;
}



### FUNC FUN_000419e8 @ 000419e8

void FUN_000419e8(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 int param_5,undefined4 param_6,undefined4 param_7)

{
  undefined4 uVar1;
  undefined4 uVar2;
  undefined1 auStack_16 [2];
  
  uVar2 = *(undefined4 *)(param_5 + 4);
  uVar1 = FUN_00041ecc(auStack_16,uVar2,param_7);
  FUN_00042010(param_1,uVar1,auStack_16,param_3,param_4,param_5,uVar2,param_6);
  return;
}



### FUNC FUN_00041a22 @ 00041a22

void FUN_00041a22(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 int param_5,undefined4 param_6,undefined4 param_7)

{
  undefined4 uVar1;
  undefined4 uVar2;
  undefined1 auStack_16 [2];
  
  uVar2 = *(undefined4 *)(param_5 + 4);
  uVar1 = FUN_000424fc(auStack_16,uVar2,param_7);
  FUN_00042010(param_1,uVar1,auStack_16,param_3,param_4,param_5,uVar2,param_6);
  return;
}



### FUNC FUN_00041a5c @ 00041a5c

void FUN_00041a5c(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6)

{
  FUN_000425e8(param_1,param_3,param_4,param_5,param_6);
  return;
}



### FUNC FUN_00041a80 @ 00041a80

void FUN_00041a80(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6)

{
  FUN_00042a64(param_1,param_3,param_4,param_5,param_6);
  return;
}



### FUNC FUN_00041aa4 @ 00041aa4

void FUN_00041aa4(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 int param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8)

{
  undefined4 uVar1;
  undefined4 uVar2;
  undefined1 auStack_16 [2];
  
  uVar2 = *(undefined4 *)(param_5 + 4);
  uVar1 = FUN_00042c10(auStack_16,uVar2,param_7,param_8);
  FUN_00042010(param_1,uVar1,auStack_16,param_3,param_4,param_5,uVar2,param_6);
  return;
}



### FUNC FUN_00041ae0 @ 00041ae0

void FUN_00041ae0(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 int param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8)

{
  undefined4 uVar1;
  undefined4 uVar2;
  undefined1 auStack_16 [2];
  
  uVar2 = *(undefined4 *)(param_5 + 4);
  uVar1 = FUN_00042d68(auStack_16,uVar2,param_7,param_8);
  FUN_00042010(param_1,uVar1,auStack_16,param_3,param_4,param_5,uVar2,param_6);
  return;
}



### FUNC FUN_00041b1c @ 00041b1c

void FUN_00041b1c(undefined4 param_1,undefined4 param_2,int *param_3,uint param_4,int param_5,
                 undefined4 param_6,int param_7)

{
  bool bVar1;
  locale *this;
  int *piVar2;
  undefined4 uVar3;
  int iVar4;
  int iVar5;
  undefined1 *puVar6;
  undefined4 uVar7;
  uint uVar8;
  undefined4 uVar9;
  uint local_28;
  locale alStack_24 [14];
  undefined1 auStack_16 [2];
  
  this = (locale *)std::locale::locale(alStack_24,(locale *)(param_5 + 0x20));
  piVar2 = (int *)std::locale::_M_use_facet(this,(id *)&std::ctype<char>::id);
  std::locale::~locale(alStack_24);
  uVar3 = 10;
  *(undefined4 *)(param_5 + 0x1c) = 10;
  uVar8 = *(uint *)(param_5 + 4);
  *(uint *)(param_5 + 4) = uVar8 & 0xfffffdc0 | 0x214;
  local_28 = param_4;
  if (param_7 == 0) {
    if ((int)(uVar8 << 0x11) < 0) {
      iVar4 = std::priv::__hex_char_table_hi();
    }
    else {
      iVar4 = std::priv::__hex_char_table_lo();
    }
    iVar5 = (**(code **)(*piVar2 + 0x18))(piVar2,0x30);
    bVar1 = true;
    if ((param_4 & 0xff) != 0) {
      puVar6 = (undefined1 *)param_3[5];
      if (puVar6 < (undefined1 *)param_3[6]) {
        param_3[5] = (int)(puVar6 + 1);
        *puVar6 = (char)iVar5;
      }
      else {
        iVar5 = (**(code **)(*param_3 + 0x34))(param_3);
      }
      bVar1 = true;
      if (iVar5 != -1) {
        bVar1 = false;
      }
    }
    iVar4 = (**(code **)(*piVar2 + 0x18))(piVar2,*(undefined1 *)(iVar4 + 0x10));
    local_28 = 0;
    if (!bVar1) {
      puVar6 = (undefined1 *)param_3[5];
      if (puVar6 < (undefined1 *)param_3[6]) {
        param_3[5] = (int)(puVar6 + 1);
        *puVar6 = (char)iVar4;
      }
      else {
        iVar4 = (**(code **)(*param_3 + 0x34))(param_3);
      }
      local_28 = 1;
      if (iVar4 == -1) {
        local_28 = 0;
      }
    }
    local_28 = param_4 & 0xffffff00 | local_28;
    uVar3 = 8;
  }
  *(undefined4 *)(param_5 + 0x1c) = uVar3;
  uVar3 = (**(code **)(*piVar2 + 0x18))(piVar2,0x30);
  uVar9 = *(undefined4 *)(param_5 + 4);
  uVar7 = FUN_000424fc(auStack_16,uVar9,param_7);
  FUN_00042010(param_1,uVar7,auStack_16,param_3,local_28,param_5,uVar9,uVar3);
  *(uint *)(param_5 + 4) = uVar8;
  return;
}



### FUNC FUN_00041c48 @ 00041c48

void FUN_00041c48(undefined4 *param_1,int *param_2,uint param_3,int param_4,int param_5,int param_6)

{
  byte bVar1;
  locale *this;
  int *piVar2;
  uint uVar3;
  uint uVar4;
  byte *pbVar5;
  undefined1 *puVar6;
  code *pcVar7;
  int iVar8;
  byte *pbVar9;
  uint uVar10;
  uint uVar11;
  byte *local_30;
  int local_2c [4];
  int local_1c;
  byte *local_18;
  
  this = (locale *)std::locale::locale((locale *)local_2c,(locale *)(param_4 + 0x20));
  piVar2 = (int *)std::locale::_M_use_facet(this,(id *)&std::numpunct<char>::id);
  std::locale::~locale((locale *)local_2c);
  if (param_6 == 1) {
    pcVar7 = *(code **)(*piVar2 + 0x14);
  }
  else {
    pcVar7 = *(code **)(*piVar2 + 0x18);
  }
  (*pcVar7)(local_2c,piVar2);
  pbVar9 = local_18;
  uVar10 = *(uint *)(param_4 + 0x1c);
  local_30 = (byte *)0x0;
  *(undefined4 *)(param_4 + 0x1c) = 0;
  uVar3 = local_1c - (int)local_18;
  if (uVar3 < uVar10) {
    if ((*(uint *)(param_4 + 4) & 7) == 1) {
      uVar4 = param_3;
      if (0 < (int)uVar3) {
        iVar8 = (local_1c + 1) - (int)local_18;
        local_30 = local_18;
        uVar11 = param_3;
        do {
          uVar4 = 0;
          if ((uVar11 & 0xff) != 0) {
            bVar1 = *local_30;
            uVar4 = (uint)bVar1;
            pbVar5 = (byte *)param_2[5];
            if (pbVar5 < (byte *)param_2[6]) {
              param_2[5] = (int)(pbVar5 + 1);
              *pbVar5 = bVar1;
            }
            else {
              uVar4 = (**(code **)(*param_2 + 0x34))(param_2);
            }
            uVar4 = (uint)(uVar4 != 0xffffffff);
          }
          iVar8 = iVar8 + -1;
          local_30 = local_30 + 1;
          uVar11 = uVar4;
        } while (1 < iVar8);
      }
      param_3 = uVar4 & 0xff | param_3 & 0xffffff00;
      if (0 < (int)(uVar10 - uVar3)) {
        pbVar9 = pbVar9 + ((uVar10 + 1) - local_1c);
        do {
          uVar3 = 0;
          if ((param_3 & 0xff) != 0) {
            puVar6 = (undefined1 *)param_2[5];
            if (puVar6 < (undefined1 *)param_2[6]) {
              param_2[5] = (int)(puVar6 + 1);
              *puVar6 = (char)param_5;
              iVar8 = param_5;
            }
            else {
              iVar8 = (**(code **)(*param_2 + 0x34))(param_2,param_5);
            }
            uVar3 = 1;
            if (iVar8 == -1) {
              uVar3 = 0;
            }
          }
          param_3 = param_3 & 0xffffff00 | uVar3;
          pbVar9 = pbVar9 + -1;
        } while (1 < (int)pbVar9);
      }
    }
    else {
      uVar4 = param_3;
      if (0 < (int)(uVar10 - uVar3)) {
        pbVar9 = local_18 + ((uVar10 + 1) - local_1c);
        uVar3 = param_3;
        do {
          uVar4 = 0;
          if ((uVar3 & 0xff) != 0) {
            puVar6 = (undefined1 *)param_2[5];
            if (puVar6 < (undefined1 *)param_2[6]) {
              param_2[5] = (int)(puVar6 + 1);
              *puVar6 = (char)param_5;
              iVar8 = param_5;
            }
            else {
              iVar8 = (**(code **)(*param_2 + 0x34))(param_2,param_5);
            }
            uVar4 = 1;
            if (iVar8 == -1) {
              uVar4 = 0;
            }
          }
          pbVar9 = pbVar9 + -1;
          uVar3 = uVar4;
        } while (1 < (int)pbVar9);
      }
      param_3 = uVar4 & 0xff | param_3 & 0xffffff00;
      if (0 < local_1c - (int)local_18) {
        iVar8 = (local_1c + 1) - (int)local_18;
        pbVar9 = local_18;
        do {
          uVar3 = 0;
          if ((param_3 & 0xff) != 0) {
            bVar1 = *pbVar9;
            uVar3 = (uint)bVar1;
            pbVar5 = (byte *)param_2[5];
            if (pbVar5 < (byte *)param_2[6]) {
              param_2[5] = (int)(pbVar5 + 1);
              *pbVar5 = bVar1;
            }
            else {
              uVar3 = (**(code **)(*param_2 + 0x34))(param_2);
            }
            uVar3 = (uint)(uVar3 != 0xffffffff);
          }
          param_3 = param_3 & 0xffffff00 | uVar3;
          iVar8 = iVar8 + -1;
          pbVar9 = pbVar9 + 1;
        } while (1 < iVar8);
      }
    }
  }
  else if (0 < (int)uVar3) {
    iVar8 = (local_1c + 1) - (int)local_18;
    do {
      pbVar5 = local_30;
      if ((param_3 & 0xff) != 0) {
        bVar1 = *pbVar9;
        uVar3 = (uint)bVar1;
        pbVar5 = (byte *)param_2[5];
        if (pbVar5 < (byte *)param_2[6]) {
          param_2[5] = (int)(pbVar5 + 1);
          *pbVar5 = bVar1;
        }
        else {
          uVar3 = (**(code **)(*param_2 + 0x34))(param_2);
        }
        pbVar5 = (byte *)(uint)(uVar3 != 0xffffffff);
      }
      param_3 = param_3 & 0xffffff00 | (uint)pbVar5;
      iVar8 = iVar8 + -1;
      pbVar9 = pbVar9 + 1;
    } while (1 < iVar8);
  }
  *param_1 = param_2;
  param_1[1] = param_3;
  if ((local_18 != (byte *)local_2c) && (local_18 != (byte *)0x0)) {
    if (0x80 < (uint)(local_2c[0] - (int)local_18)) {
      operator_delete(local_18);
      return;
    }
    std::__node_alloc::_M_deallocate(local_18,local_2c[0] - (int)local_18);
  }
  return;
}



### FUNC FUN_00041ecc @ 00041ecc

byte * FUN_00041ecc(byte *param_1,uint param_2,uint param_3)

{
  ulonglong uVar1;
  byte bVar2;
  byte *pbVar3;
  byte *pbVar4;
  int iVar5;
  uint uVar6;
  undefined8 uVar7;
  
  if (param_3 == 0) {
    param_1[-1] = 0x30;
    if ((param_2 & 0x830) != 0x800) {
      return param_1 + -1;
    }
    param_1[-2] = 0x2b;
    return param_1 + -2;
  }
  if ((param_2 & 0x38) == 0x10) {
    if ((int)(param_2 << 0x11) < 0) {
      iVar5 = std::priv::__hex_char_table_hi();
    }
    else {
      iVar5 = std::priv::__hex_char_table_lo();
    }
    pbVar4 = param_1 + -2;
    do {
      pbVar3 = pbVar4;
      pbVar3[1] = *(byte *)(iVar5 + (param_3 & 0xf));
      pbVar4 = pbVar3 + -1;
      param_3 = param_3 >> 4;
    } while (param_3 != 0);
    if ((param_2 & 0x200) == 0) {
      return pbVar3 + 1;
    }
    bVar2 = *(byte *)(iVar5 + 0x10);
    *pbVar4 = 0x30;
    *pbVar3 = bVar2;
    return pbVar4;
  }
  if ((param_2 & 0x38) != 0x20) {
    uVar6 = -param_3;
    iVar5 = -(uint)(param_3 != 0) - ((int)param_3 >> 0x1f);
    if (-1 < (int)param_3) {
      uVar6 = param_3;
      iVar5 = (int)param_3 >> 0x1f;
    }
    uVar7 = CONCAT44(iVar5,uVar6);
    if (uVar6 != 0 || iVar5 != 0) {
      do {
        uVar1 = (ulonglong)uVar7 >> 0x20;
        uVar6 = (uint)uVar7;
        bVar2 = 10;
        uVar7 = __aeabi_uldivmod();
        param_1[-1] = bVar2 | 0x30;
        param_1 = param_1 + -1;
      } while ((int)uVar1 != 0 || 9 < uVar6);
    }
    if ((int)param_3 < 0) {
      bVar2 = 0x2d;
    }
    else {
      if ((param_2 & 0x800) == 0) {
        return param_1;
      }
      bVar2 = 0x2b;
    }
    param_1[-1] = bVar2;
    return param_1 + -1;
  }
  pbVar4 = param_1 + -1;
  do {
    pbVar3 = pbVar4;
    *pbVar3 = (byte)param_3 & 7 | 0x30;
    pbVar4 = pbVar3 + -1;
    param_3 = param_3 >> 3;
  } while (param_3 != 0);
  if ((param_2 & 0x200) == 0) {
    return pbVar3;
  }
  *pbVar4 = 0x30;
  return pbVar4;
}



### FUNC FUN_00042010 @ 00042010

void FUN_00042010(undefined4 param_1,undefined1 *param_2,int param_3,undefined4 param_4,
                 undefined4 param_5,int param_6,uint param_7,undefined4 param_8)

{
  locale *this;
  int *piVar1;
  undefined4 uVar2;
  undefined1 uVar3;
  undefined1 *local_70;
  int local_6c [4];
  int *local_5c;
  int *local_58;
  undefined1 auStack_54 [64];
  
  this = (locale *)std::locale::locale((locale *)local_6c,(locale *)(param_6 + 0x20));
  param_3 = param_3 - (int)param_2;
  piVar1 = (int *)std::locale::_M_use_facet(this,(id *)&std::numpunct<char>::id);
  std::locale::~locale((locale *)local_6c);
  (**(code **)(*piVar1 + 0x10))(local_6c,piVar1);
  local_70 = param_2;
  if (local_58 != local_5c) {
    uVar3 = 0;
    if ((int)(param_7 << 0x16) < 0) {
      uVar3 = 2;
      if ((param_7 & 0x38) != 0x10) {
        uVar3 = (param_7 & 0x38) == 0x20;
      }
    }
    if (param_3 != 0) {
      __aeabi_memcpy(auStack_54,param_2,param_3);
    }
    uVar2 = (**(code **)(*piVar1 + 0xc))(piVar1);
    local_70 = auStack_54;
    param_3 = FUN_00050058(local_70,local_70 + param_3,local_6c,uVar2,0x2b,0x2d,uVar3);
  }
  uVar2 = *(undefined4 *)(param_6 + 0x1c);
  *(undefined4 *)(param_6 + 0x1c) = 0;
  FUN_00042144(param_1,local_70,param_3,param_4,param_5,param_7,uVar2,param_8,0x2b,0x2d);
  if ((local_58 != local_6c) && (local_58 != (int *)0x0)) {
    if (0x80 < (uint)(local_6c[0] - (int)local_58)) {
      operator_delete(local_58);
      return;
    }
    std::__node_alloc::_M_deallocate(local_58,local_6c[0] - (int)local_58);
  }
  return;
}



### FUNC FUN_00042144 @ 00042144

undefined4 *
FUN_00042144(undefined4 *param_1,byte *param_2,int param_3,int *param_4,uint param_5,uint param_6,
            int param_7,int param_8,uint param_9,uint param_10)

{
  byte bVar1;
  undefined1 uVar2;
  uint uVar3;
  byte *pbVar4;
  undefined1 *puVar5;
  uint uVar6;
  int iVar7;
  int iVar8;
  int local_28;
  byte *local_18;
  
  if (param_7 <= param_3) {
    if (0 < param_3) {
      param_3 = param_3 + 1;
      do {
        uVar3 = 0;
        if ((param_5 & 0xff) != 0) {
          bVar1 = *param_2;
          uVar6 = (uint)bVar1;
          pbVar4 = (byte *)param_4[5];
          if (pbVar4 < (byte *)param_4[6]) {
            param_4[5] = (int)(pbVar4 + 1);
            *pbVar4 = bVar1;
          }
          else {
            uVar6 = (**(code **)(*param_4 + 0x34))(param_4);
          }
          uVar3 = 1;
          if (uVar6 == 0xffffffff) {
            uVar3 = 0;
          }
        }
        param_5 = param_5 & 0xffffff00 | uVar3;
        param_3 = param_3 + -1;
        param_2 = param_2 + 1;
      } while (1 < param_3);
    }
    goto LAB_00042256;
  }
  iVar7 = param_7 - param_3;
  uVar2 = (undefined1)param_8;
  if ((param_6 & 7) == 1) {
    uVar3 = param_5;
    if (0 < param_3) {
      iVar8 = param_3 + 1;
      uVar6 = param_5;
      local_18 = param_2;
      do {
        uVar3 = 0;
        if ((uVar6 & 0xff) != 0) {
          bVar1 = *local_18;
          uVar6 = (uint)bVar1;
          pbVar4 = (byte *)param_4[5];
          if (pbVar4 < (byte *)param_4[6]) {
            param_4[5] = (int)(pbVar4 + 1);
            *pbVar4 = bVar1;
          }
          else {
            uVar6 = (**(code **)(*param_4 + 0x34))(param_4);
          }
          uVar3 = 1;
          if (uVar6 == 0xffffffff) {
            uVar3 = 0;
          }
        }
        iVar8 = iVar8 + -1;
        local_18 = local_18 + 1;
        uVar6 = uVar3;
      } while (1 < iVar8);
    }
    param_5 = param_5 & 0xffffff00 | uVar3 & 0xff;
    if (0 < iVar7) {
      param_3 = (param_7 + 1) - param_3;
      do {
        uVar3 = 0;
        if ((param_5 & 0xff) != 0) {
          puVar5 = (undefined1 *)param_4[5];
          if (puVar5 < (undefined1 *)param_4[6]) {
            param_4[5] = (int)(puVar5 + 1);
            *puVar5 = uVar2;
            iVar7 = param_8;
          }
          else {
            iVar7 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
          }
          uVar3 = 1;
          if (iVar7 == -1) {
            uVar3 = 0;
          }
        }
        param_5 = param_5 & 0xffffff00 | uVar3;
        param_3 = param_3 + -1;
      } while (1 < param_3);
    }
    goto LAB_00042256;
  }
  if ((param_3 != 0) && ((param_6 & 7) == 4)) {
    bVar1 = *param_2;
    uVar3 = (uint)bVar1;
    if ((uVar3 == param_9) || (uVar3 == param_10)) {
      uVar6 = 0;
      if ((param_5 & 0xff) != 0) {
        pbVar4 = (byte *)param_4[5];
        if (pbVar4 < (byte *)param_4[6]) {
          param_4[5] = (int)(pbVar4 + 1);
          *pbVar4 = bVar1;
        }
        else {
          uVar3 = (**(code **)(*param_4 + 0x34))(param_4);
        }
        uVar6 = 1;
        if (uVar3 == 0xffffffff) {
          uVar6 = 0;
        }
      }
      if (0 < iVar7) {
        iVar7 = (param_7 + 1) - param_3;
        uVar3 = uVar6;
        do {
          uVar6 = 0;
          if (uVar3 != 0) {
            puVar5 = (undefined1 *)param_4[5];
            if (puVar5 < (undefined1 *)param_4[6]) {
              param_4[5] = (int)(puVar5 + 1);
              *puVar5 = uVar2;
              iVar8 = param_8;
            }
            else {
              iVar8 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
            }
            uVar6 = 1;
            if (iVar8 == -1) {
              uVar6 = 0;
            }
          }
          iVar7 = iVar7 + -1;
          uVar3 = uVar6;
        } while (1 < iVar7);
      }
      param_5 = param_5 & 0xffffff00 | uVar6;
      local_28 = param_3;
      if (0 < param_3 + -1) {
        do {
          param_2 = param_2 + 1;
          uVar3 = 0;
          if ((param_5 & 0xff) != 0) {
            bVar1 = *param_2;
            uVar6 = (uint)bVar1;
            pbVar4 = (byte *)param_4[5];
            if (pbVar4 < (byte *)param_4[6]) {
              param_4[5] = (int)(pbVar4 + 1);
              *pbVar4 = bVar1;
            }
            else {
              uVar6 = (**(code **)(*param_4 + 0x34))(param_4);
            }
            uVar3 = 1;
            if (uVar6 == 0xffffffff) {
              uVar3 = 0;
            }
          }
          param_5 = param_5 & 0xffffff00 | uVar3;
          local_28 = local_28 + -1;
        } while (1 < local_28);
      }
      goto LAB_00042256;
    }
  }
  if ((param_3 < 2) || ((param_6 & 0x23f) != 0x214)) {
    uVar3 = param_5;
    if (0 < iVar7) {
      iVar7 = (param_7 + 1) - param_3;
      uVar6 = param_5;
      do {
        uVar3 = 0;
        if ((uVar6 & 0xff) != 0) {
          puVar5 = (undefined1 *)param_4[5];
          if (puVar5 < (undefined1 *)param_4[6]) {
            param_4[5] = (int)(puVar5 + 1);
            *puVar5 = uVar2;
            iVar8 = param_8;
          }
          else {
            iVar8 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
          }
          uVar3 = 1;
          if (iVar8 == -1) {
            uVar3 = 0;
          }
        }
        iVar7 = iVar7 + -1;
        uVar6 = uVar3;
      } while (1 < iVar7);
    }
    param_5 = param_5 & 0xffffff00 | uVar3 & 0xff;
    if (0 < param_3) {
      param_3 = param_3 + 1;
      do {
        uVar3 = 0;
        if ((param_5 & 0xff) != 0) {
          bVar1 = *param_2;
          uVar6 = (uint)bVar1;
          pbVar4 = (byte *)param_4[5];
          if (pbVar4 < (byte *)param_4[6]) {
            param_4[5] = (int)(pbVar4 + 1);
            *pbVar4 = bVar1;
          }
          else {
            uVar6 = (**(code **)(*param_4 + 0x34))(param_4);
          }
          uVar3 = 1;
          if (uVar6 == 0xffffffff) {
            uVar3 = 0;
          }
        }
        param_5 = param_5 & 0xffffff00 | uVar3;
        param_3 = param_3 + -1;
        param_2 = param_2 + 1;
      } while (1 < param_3);
    }
    goto LAB_00042256;
  }
  uVar3 = 0;
  if ((param_5 & 0xff) != 0) {
    bVar1 = *param_2;
    pbVar4 = (byte *)param_4[5];
    if (pbVar4 < (byte *)param_4[6]) {
      param_4[5] = (int)(pbVar4 + 1);
      *pbVar4 = bVar1;
    }
    else {
      iVar8 = (**(code **)(*param_4 + 0x34))(param_4);
      if (iVar8 == -1) goto LAB_00042398;
    }
    pbVar4 = (byte *)param_4[5];
    bVar1 = param_2[1];
    uVar6 = (uint)bVar1;
    if (pbVar4 < (byte *)param_4[6]) {
      param_4[5] = (int)(pbVar4 + 1);
      *pbVar4 = bVar1;
    }
    else {
      uVar6 = (**(code **)(*param_4 + 0x34))(param_4);
    }
    uVar3 = 1;
    if (uVar6 == 0xffffffff) {
      uVar3 = 0;
    }
  }
LAB_00042398:
  if (0 < iVar7) {
    iVar7 = (param_7 + 1) - param_3;
    uVar6 = uVar3;
    do {
      uVar3 = 0;
      if (uVar6 != 0) {
        puVar5 = (undefined1 *)param_4[5];
        if (puVar5 < (undefined1 *)param_4[6]) {
          param_4[5] = (int)(puVar5 + 1);
          *puVar5 = uVar2;
          iVar8 = param_8;
        }
        else {
          iVar8 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
        }
        uVar3 = 1;
        if (iVar8 == -1) {
          uVar3 = 0;
        }
      }
      iVar7 = iVar7 + -1;
      uVar6 = uVar3;
    } while (1 < iVar7);
  }
  param_5 = param_5 & 0xffffff00 | uVar3;
  if (0 < param_3 + -2) {
    param_3 = param_3 + -1;
    param_2 = param_2 + 2;
    do {
      uVar3 = 0;
      if ((param_5 & 0xff) != 0) {
        bVar1 = *param_2;
        uVar6 = (uint)bVar1;
        pbVar4 = (byte *)param_4[5];
        if (pbVar4 < (byte *)param_4[6]) {
          param_4[5] = (int)(pbVar4 + 1);
          *pbVar4 = bVar1;
        }
        else {
          uVar6 = (**(code **)(*param_4 + 0x34))(param_4);
        }
        uVar3 = 1;
        if (uVar6 == 0xffffffff) {
          uVar3 = 0;
        }
      }
      param_5 = param_5 & 0xffffff00 | uVar3;
      param_3 = param_3 + -1;
      param_2 = param_2 + 1;
    } while (1 < param_3);
  }
LAB_00042256:
  *param_1 = param_4;
  param_1[1] = param_5;
  return param_1 + 2;
}



### FUNC FUN_000424fc @ 000424fc

byte * FUN_000424fc(int param_1,uint param_2,uint param_3)

{
  bool bVar1;
  byte bVar2;
  int iVar3;
  uint uVar4;
  byte extraout_r1;
  byte *pbVar5;
  byte *pbVar6;
  byte *pbVar7;
  
  if (param_3 == 0) {
    *(undefined1 *)(param_1 + -1) = 0x30;
    pbVar7 = (byte *)(param_1 + -1);
    if ((param_2 & 0x830) == 0x800) {
      *(undefined1 *)(param_1 + -2) = 0x2b;
      pbVar7 = (byte *)(param_1 + -2);
    }
  }
  else if ((param_2 & 0x38) == 0x10) {
    if ((int)(param_2 << 0x11) < 0) {
      iVar3 = std::priv::__hex_char_table_hi();
    }
    else {
      iVar3 = std::priv::__hex_char_table_lo();
    }
    pbVar5 = (byte *)(param_1 + -2);
    do {
      pbVar6 = pbVar5;
      pbVar6[1] = *(byte *)(iVar3 + (param_3 & 0xf));
      pbVar5 = pbVar6 + -1;
      param_3 = param_3 >> 4;
    } while (param_3 != 0);
    pbVar7 = pbVar6 + 1;
    if ((param_2 & 0x200) != 0) {
      bVar2 = *(byte *)(iVar3 + 0x10);
      *pbVar5 = 0x30;
      *pbVar6 = bVar2;
      pbVar7 = pbVar5;
    }
  }
  else if ((param_2 & 0x38) == 0x20) {
    pbVar5 = (byte *)(param_1 + -1);
    do {
      pbVar7 = pbVar5;
      *pbVar7 = (byte)param_3 & 7 | 0x30;
      pbVar5 = pbVar7 + -1;
      param_3 = param_3 >> 3;
    } while (param_3 != 0);
    if ((param_2 & 0x200) != 0) {
      *pbVar5 = 0x30;
      pbVar7 = pbVar5;
    }
  }
  else {
    pbVar5 = (byte *)(param_1 + -1);
    do {
      pbVar7 = pbVar5;
      uVar4 = __aeabi_uidivmod(param_3,10);
      *pbVar7 = extraout_r1 | 0x30;
      pbVar5 = pbVar7 + -1;
      bVar1 = 9 < param_3;
      param_3 = uVar4;
    } while (bVar1);
    if ((param_2 & 0x800) != 0) {
      *pbVar5 = 0x2b;
      pbVar7 = pbVar5;
    }
  }
  return pbVar7;
}



### FUNC FUN_000425e8 @ 000425e8

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_000425e8(undefined4 param_1,undefined4 param_2,undefined4 param_3,int param_4)

{
  undefined1 uVar1;
  uint uVar2;
  locale *this;
  int *piVar3;
  undefined4 uVar4;
  int local_148 [4];
  int *local_138;
  int *local_134;
  undefined1 *local_130 [4];
  undefined1 **local_120;
  undefined1 local_11c;
  undefined1 auStack_11b [256];
  undefined1 auStack_1b [3];
  undefined1 **local_18;
  
  __aeabi_memclr(auStack_11b,0x100);
  local_11c = 0;
  local_130[0] = auStack_1b;
  local_120 = (undefined1 **)&local_11c;
  local_18 = (undefined1 **)&local_11c;
  uVar2 = FUN_00051490(local_130,*(undefined4 *)(param_4 + 4),*(undefined4 *)(param_4 + 0x18));
  this = (locale *)std::locale::locale((locale *)local_148,(locale *)(param_4 + 0x20));
  piVar3 = (int *)std::locale::_M_use_facet(this,(id *)&std::numpunct<char>::id);
  std::locale::~locale((locale *)local_148);
  uVar1 = (**(code **)(*piVar3 + 8))(piVar3);
  uVar4 = (**(code **)(*piVar3 + 0xc))(piVar3);
  (**(code **)(*piVar3 + 0x10))(local_148,piVar3);
  if ((uVar2 < (uint)((int)local_120 - (int)local_18)) && (*(char *)((int)local_18 + uVar2) == '.'))
  {
    *(undefined1 *)((int)local_18 + uVar2) = uVar1;
  }
  if (local_134 != local_138) {
    FUN_000500f4(local_130,uVar2,local_148,uVar4);
  }
  *(undefined4 *)(param_4 + 0x1c) = 0;
  FUN_00042794(param_1,local_18,local_120,param_2);
  if ((local_134 != local_148) && (local_134 != (int *)0x0)) {
    if ((uint)(local_148[0] - (int)local_134) < 0x81) {
      std::__node_alloc::_M_deallocate(local_134,local_148[0] - (int)local_134);
    }
    else {
      operator_delete(local_134);
    }
  }
  if (((local_18 != local_130) && (local_18 != (undefined1 **)0x0)) &&
     ((undefined1 **)&local_11c != local_18)) {
    if (0x80 < (uint)((int)local_130[0] - (int)local_18)) {
      operator_delete(local_18);
      return;
    }
    std::__node_alloc::_M_deallocate(local_18,(int)local_130[0] - (int)local_18);
  }
  return;
}



### FUNC FUN_00042794 @ 00042794

undefined4 *
FUN_00042794(undefined4 *param_1,byte *param_2,byte *param_3,int *param_4,uint param_5,uint param_6,
            int param_7,int param_8,uint param_9,uint param_10)

{
  byte bVar1;
  undefined1 uVar2;
  undefined1 *puVar3;
  byte *pbVar4;
  int iVar5;
  uint uVar6;
  byte *pbVar7;
  uint uVar8;
  int iVar9;
  byte *local_1c;
  
  iVar9 = (int)param_3 - (int)param_2;
  if (iVar9 < param_7) {
    iVar5 = param_7 - iVar9;
    uVar2 = (undefined1)param_8;
    if ((param_6 & 7) == 4) {
      if (param_2 != param_3) {
        bVar1 = *param_2;
        uVar6 = (uint)bVar1;
        if ((uVar6 == param_9) || (uVar6 == param_10)) {
          pbVar7 = param_2 + 1;
          uVar8 = 0;
          if ((param_5 & 0xff) != 0) {
            pbVar4 = (byte *)param_4[5];
            if (pbVar4 < (byte *)param_4[6]) {
              param_4[5] = (int)(pbVar4 + 1);
              *pbVar4 = bVar1;
            }
            else {
              uVar6 = (**(code **)(*param_4 + 0x34))(param_4);
            }
            uVar8 = 1;
            if (uVar6 == 0xffffffff) {
              uVar8 = 0;
            }
          }
          if (0 < iVar5) {
            param_2 = param_2 + ((param_7 + 1) - (int)param_3);
            uVar6 = uVar8;
            do {
              uVar8 = 0;
              if (uVar6 != 0) {
                puVar3 = (undefined1 *)param_4[5];
                if (puVar3 < (undefined1 *)param_4[6]) {
                  param_4[5] = (int)(puVar3 + 1);
                  *puVar3 = uVar2;
                  iVar9 = param_8;
                }
                else {
                  iVar9 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
                }
                uVar8 = 1;
                if (iVar9 == -1) {
                  uVar8 = 0;
                }
              }
              param_2 = param_2 + -1;
              uVar6 = uVar8;
            } while (1 < (int)param_2);
          }
          param_5 = param_5 & 0xffffff00 | uVar8;
          if (0 < (int)param_3 - (int)pbVar7) {
            param_3 = param_3 + (1 - (int)pbVar7);
            do {
              uVar6 = 0;
              if ((param_5 & 0xff) != 0) {
                bVar1 = *pbVar7;
                uVar8 = (uint)bVar1;
                pbVar4 = (byte *)param_4[5];
                if (pbVar4 < (byte *)param_4[6]) {
                  param_4[5] = (int)(pbVar4 + 1);
                  *pbVar4 = bVar1;
                }
                else {
                  uVar8 = (**(code **)(*param_4 + 0x34))(param_4);
                }
                uVar6 = 1;
                if (uVar8 == 0xffffffff) {
                  uVar6 = 0;
                }
              }
              param_5 = param_5 & 0xffffff00 | uVar6;
              param_3 = param_3 + -1;
              pbVar7 = pbVar7 + 1;
            } while (1 < (int)param_3);
          }
          goto LAB_00042984;
        }
      }
    }
    else if ((param_6 & 7) == 1) {
      uVar6 = param_5;
      if (0 < iVar9) {
        pbVar7 = param_3 + (1 - (int)param_2);
        uVar8 = param_5;
        local_1c = param_2;
        do {
          uVar6 = 0;
          if ((uVar8 & 0xff) != 0) {
            bVar1 = *local_1c;
            uVar6 = (uint)bVar1;
            pbVar4 = (byte *)param_4[5];
            if (pbVar4 < (byte *)param_4[6]) {
              param_4[5] = (int)(pbVar4 + 1);
              *pbVar4 = bVar1;
            }
            else {
              uVar6 = (**(code **)(*param_4 + 0x34))(param_4);
            }
            uVar6 = (uint)(uVar6 != 0xffffffff);
          }
          pbVar7 = pbVar7 + -1;
          local_1c = local_1c + 1;
          uVar8 = uVar6;
        } while (1 < (int)pbVar7);
      }
      param_5 = param_5 & 0xffffff00 | uVar6 & 0xff;
      if (0 < iVar5) {
        param_2 = param_2 + ((param_7 + 1) - (int)param_3);
        do {
          uVar6 = 0;
          if ((param_5 & 0xff) != 0) {
            puVar3 = (undefined1 *)param_4[5];
            if (puVar3 < (undefined1 *)param_4[6]) {
              param_4[5] = (int)(puVar3 + 1);
              *puVar3 = uVar2;
              iVar9 = param_8;
            }
            else {
              iVar9 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
            }
            uVar6 = 1;
            if (iVar9 == -1) {
              uVar6 = 0;
            }
          }
          param_5 = param_5 & 0xffffff00 | uVar6;
          param_2 = param_2 + -1;
        } while (1 < (int)param_2);
      }
      goto LAB_00042984;
    }
    uVar6 = param_5;
    if (0 < iVar5) {
      pbVar7 = param_2 + ((param_7 + 1) - (int)param_3);
      uVar8 = param_5;
      do {
        uVar6 = 0;
        if ((uVar8 & 0xff) != 0) {
          puVar3 = (undefined1 *)param_4[5];
          if (puVar3 < (undefined1 *)param_4[6]) {
            param_4[5] = (int)(puVar3 + 1);
            *puVar3 = uVar2;
            iVar5 = param_8;
          }
          else {
            iVar5 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
          }
          uVar6 = (uint)(iVar5 != -1);
        }
        pbVar7 = pbVar7 + -1;
        uVar8 = uVar6;
      } while (1 < (int)pbVar7);
    }
    param_5 = param_5 & 0xffffff00 | uVar6 & 0xff;
    if (0 < iVar9) {
      param_3 = param_3 + (1 - (int)param_2);
      do {
        uVar6 = 0;
        if ((param_5 & 0xff) != 0) {
          bVar1 = *param_2;
          uVar6 = (uint)bVar1;
          pbVar7 = (byte *)param_4[5];
          if (pbVar7 < (byte *)param_4[6]) {
            param_4[5] = (int)(pbVar7 + 1);
            *pbVar7 = bVar1;
          }
          else {
            uVar6 = (**(code **)(*param_4 + 0x34))(param_4);
          }
          uVar6 = (uint)(uVar6 != 0xffffffff);
        }
        param_5 = param_5 & 0xffffff00 | uVar6;
        param_3 = param_3 + -1;
        param_2 = param_2 + 1;
      } while (1 < (int)param_3);
    }
  }
  else if (0 < iVar9) {
    param_3 = param_3 + (1 - (int)param_2);
    do {
      uVar6 = 0;
      if ((param_5 & 0xff) != 0) {
        bVar1 = *param_2;
        uVar6 = (uint)bVar1;
        pbVar7 = (byte *)param_4[5];
        if (pbVar7 < (byte *)param_4[6]) {
          param_4[5] = (int)(pbVar7 + 1);
          *pbVar7 = bVar1;
        }
        else {
          uVar6 = (**(code **)(*param_4 + 0x34))(param_4);
        }
        uVar6 = (uint)(uVar6 != 0xffffffff);
      }
      param_5 = param_5 & 0xffffff00 | uVar6;
      param_3 = param_3 + -1;
      param_2 = param_2 + 1;
    } while (1 < (int)param_3);
  }
LAB_00042984:
  *param_1 = param_4;
  param_1[1] = param_5;
  return param_1 + 2;
}



### FUNC FUN_00042a64 @ 00042a64

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_00042a64(undefined4 param_1,undefined4 param_2,undefined4 param_3,int param_4)

{
  undefined1 uVar1;
  uint uVar2;
  locale *this;
  int *piVar3;
  undefined4 uVar4;
  int local_148 [4];
  int *local_138;
  int *local_134;
  undefined1 *local_130 [4];
  undefined1 **local_120;
  undefined1 local_11c;
  undefined1 auStack_11b [256];
  undefined1 auStack_1b [3];
  undefined1 **local_18;
  
  __aeabi_memclr(auStack_11b,0x100);
  local_11c = 0;
  local_130[0] = auStack_1b;
  local_120 = (undefined1 **)&local_11c;
  local_18 = (undefined1 **)&local_11c;
  uVar2 = FUN_00051642(local_130,*(undefined4 *)(param_4 + 4),*(undefined4 *)(param_4 + 0x18));
  this = (locale *)std::locale::locale((locale *)local_148,(locale *)(param_4 + 0x20));
  piVar3 = (int *)std::locale::_M_use_facet(this,(id *)&std::numpunct<char>::id);
  std::locale::~locale((locale *)local_148);
  uVar1 = (**(code **)(*piVar3 + 8))(piVar3);
  uVar4 = (**(code **)(*piVar3 + 0xc))(piVar3);
  (**(code **)(*piVar3 + 0x10))(local_148,piVar3);
  if ((uVar2 < (uint)((int)local_120 - (int)local_18)) && (*(char *)((int)local_18 + uVar2) == '.'))
  {
    *(undefined1 *)((int)local_18 + uVar2) = uVar1;
  }
  if (local_134 != local_138) {
    FUN_000500f4(local_130,uVar2,local_148,uVar4);
  }
  *(undefined4 *)(param_4 + 0x1c) = 0;
  FUN_00042794(param_1,local_18,local_120,param_2);
  if ((local_134 != local_148) && (local_134 != (int *)0x0)) {
    if ((uint)(local_148[0] - (int)local_134) < 0x81) {
      std::__node_alloc::_M_deallocate(local_134,local_148[0] - (int)local_134);
    }
    else {
      operator_delete(local_134);
    }
  }
  if (((local_18 != local_130) && (local_18 != (undefined1 **)0x0)) &&
     ((undefined1 **)&local_11c != local_18)) {
    if (0x80 < (uint)((int)local_130[0] - (int)local_18)) {
      operator_delete(local_18);
      return;
    }
    std::__node_alloc::_M_deallocate(local_18,(int)local_130[0] - (int)local_18);
  }
  return;
}



### FUNC FUN_00042c10 @ 00042c10

byte * FUN_00042c10(byte *param_1,uint param_2,uint param_3,uint param_4)

{
  byte bVar1;
  byte *pbVar2;
  int iVar3;
  uint uVar4;
  uint uVar5;
  byte *pbVar6;
  byte *pbVar7;
  uint uVar8;
  undefined8 uVar9;
  uint local_28;
  
  if (param_3 == 0 && param_4 == 0) {
    param_1[-1] = 0x30;
    pbVar7 = param_1 + -1;
    if ((param_2 & 0x830) == 0x800) {
      param_1[-2] = 0x2b;
      pbVar7 = param_1 + -2;
    }
  }
  else {
    local_28 = 1;
    if ((param_2 & 0x38) == 0x10) {
      if ((int)(param_2 << 0x11) < 0) {
        iVar3 = std::priv::__hex_char_table_hi();
      }
      else {
        iVar3 = std::priv::__hex_char_table_lo();
      }
      pbVar2 = param_1 + -2;
      do {
        pbVar6 = pbVar2;
        pbVar6[1] = *(byte *)(iVar3 + (param_3 & 0xf));
        pbVar2 = pbVar6 + -1;
        param_3 = param_4 << 0x1c | param_3 >> 4;
        param_4 = param_4 >> 4;
      } while (param_3 != 0 || param_4 != 0);
      pbVar7 = pbVar6 + 1;
      if ((param_2 & 0x200) != 0) {
        bVar1 = *(byte *)(iVar3 + 0x10);
        *pbVar2 = 0x30;
        *pbVar6 = bVar1;
        pbVar7 = pbVar2;
      }
    }
    else if ((param_2 & 0x38) == 0x20) {
      pbVar2 = param_1 + -1;
      do {
        pbVar7 = pbVar2;
        *pbVar7 = (byte)param_3 & 7 | 0x30;
        pbVar2 = pbVar7 + -1;
        param_3 = param_4 << 0x1d | param_3 >> 3;
        param_4 = param_4 >> 3;
      } while (param_3 != 0 || param_4 != 0);
      if ((param_2 & 0x200) != 0) {
        *pbVar2 = 0x30;
        pbVar7 = pbVar2;
      }
    }
    else {
      uVar4 = (int)param_4 >> 0x1f;
      uVar5 = param_3 + uVar4 ^ uVar4;
      uVar4 = param_4 + uVar4 + (uint)CARRY4(param_3,uVar4) ^ uVar4;
      uVar9 = CONCAT44(uVar4,uVar5);
      if (uVar5 != 0 || uVar4 != 0) {
        do {
          uVar8 = (uint)((ulonglong)uVar9 >> 0x20);
          uVar5 = (uint)uVar9;
          bVar1 = 10;
          uVar9 = __aeabi_uldivmod(uVar5,uVar8,10,0);
          param_1[-1] = bVar1 | 0x30;
          uVar4 = uVar8;
          if (uVar8 != 0) {
            uVar4 = local_28;
          }
          uVar5 = (uint)(9 < uVar5);
          if (uVar8 != 0) {
            uVar5 = uVar4;
          }
          param_1 = param_1 + -1;
        } while (uVar5 != 0);
      }
      if ((int)param_4 < 0) {
        bVar1 = 0x2d;
      }
      else {
        if ((param_2 & 0x800) == 0) {
          return param_1;
        }
        bVar1 = 0x2b;
      }
      param_1[-1] = bVar1;
      pbVar7 = param_1 + -1;
    }
  }
  return pbVar7;
}



### FUNC FUN_00042d68 @ 00042d68

byte * FUN_00042d68(int param_1,uint param_2,uint param_3,uint param_4)

{
  uint uVar1;
  byte *pbVar2;
  int iVar3;
  byte *pbVar4;
  byte bVar5;
  uint uVar6;
  byte *pbVar7;
  uint uVar8;
  undefined8 uVar9;
  uint local_1c;
  
  uVar9 = CONCAT44(param_4,param_3);
  if (param_3 == 0 && param_4 == 0) {
    *(undefined1 *)(param_1 + -1) = 0x30;
    pbVar4 = (byte *)(param_1 + -1);
    if ((param_2 & 0x830) == 0x800) {
      *(undefined1 *)(param_1 + -2) = 0x2b;
      pbVar4 = (byte *)(param_1 + -2);
    }
  }
  else {
    local_1c = 1;
    if ((param_2 & 0x38) == 0x10) {
      if ((int)(param_2 << 0x11) < 0) {
        iVar3 = std::priv::__hex_char_table_hi();
      }
      else {
        iVar3 = std::priv::__hex_char_table_lo();
      }
      pbVar2 = (byte *)(param_1 + -2);
      do {
        pbVar7 = pbVar2;
        pbVar7[1] = *(byte *)(iVar3 + (param_3 & 0xf));
        pbVar2 = pbVar7 + -1;
        param_3 = param_4 << 0x1c | param_3 >> 4;
        param_4 = param_4 >> 4;
      } while (param_3 != 0 || param_4 != 0);
      pbVar4 = pbVar7 + 1;
      if ((param_2 & 0x200) != 0) {
        bVar5 = *(byte *)(iVar3 + 0x10);
        *pbVar2 = 0x30;
        *pbVar7 = bVar5;
        pbVar4 = pbVar2;
      }
    }
    else if ((param_2 & 0x38) == 0x20) {
      pbVar2 = (byte *)(param_1 + -1);
      do {
        pbVar4 = pbVar2;
        *pbVar4 = (byte)param_3 & 7 | 0x30;
        pbVar2 = pbVar4 + -1;
        param_3 = param_4 << 0x1d | param_3 >> 3;
        param_4 = param_4 >> 3;
      } while (param_3 != 0 || param_4 != 0);
      if ((param_2 & 0x200) != 0) {
        *pbVar2 = 0x30;
        pbVar4 = pbVar2;
      }
    }
    else {
      pbVar2 = (byte *)(param_1 + -1);
      do {
        pbVar4 = pbVar2;
        uVar8 = (uint)((ulonglong)uVar9 >> 0x20);
        uVar6 = (uint)uVar9;
        bVar5 = 10;
        uVar9 = __aeabi_uldivmod(uVar6,uVar8,10,0);
        *pbVar4 = bVar5 | 0x30;
        uVar1 = uVar8;
        if (uVar8 != 0) {
          uVar1 = local_1c;
        }
        uVar6 = (uint)(9 < uVar6);
        if (uVar8 != 0) {
          uVar6 = uVar1;
        }
        pbVar2 = pbVar4 + -1;
      } while (uVar6 != 0);
      if ((param_2 & 0x800) != 0) {
        *pbVar2 = 0x2b;
        pbVar4 = pbVar2;
      }
    }
  }
  return pbVar4;
}



### FUNC FUN_00042e96 @ 00042e96

void FUN_00042e96(facet *param_1)

{
  std::locale::facet::~facet(param_1);
  operator_delete(param_1);
  return;
}



### FUNC FUN_00042fc0 @ 00042fc0

void FUN_00042fc0(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9,undefined4 param_10,undefined4 param_11,undefined4 param_12)

{
  undefined1 local_14 [4];
  
  local_14[0] = 1;
  FUN_00043000(param_1,param_3,param_4,param_5,param_6,param_7,param_8,param_9,param_10,param_11,
               param_12,local_14,0);
  return;
}



### FUNC FUN_00043000 @ 00043000

void FUN_00043000(undefined4 *param_1,int *param_2,int param_3,uint param_4,int *param_5,int param_6
                 ,uint param_7,int param_8,int param_9,uint *param_10,int *param_11,char *param_12)

{
  locale *this;
  int *piVar1;
  int *piVar2;
  int *piVar3;
  uint uVar4;
  undefined4 uVar5;
  undefined4 uVar6;
  int iVar7;
  undefined4 uVar8;
  char cVar9;
  int iVar10;
  uint uVar11;
  int iVar12;
  undefined4 local_1d4;
  int local_1c4;
  int local_19c;
  int *local_190;
  int local_18c;
  undefined2 local_188;
  char local_184;
  int *local_180;
  int local_17c;
  undefined2 local_178;
  char local_174;
  int local_170 [4];
  int *local_160;
  int *local_15c;
  int *local_158;
  int local_154;
  undefined4 local_150;
  char local_14c;
  int local_148 [16];
  undefined4 local_108;
  int *local_104;
  int local_100 [16];
  int *local_c0;
  int *local_bc;
  int local_b8 [16];
  int *local_78;
  int *local_74;
  int local_70 [16];
  int *local_30;
  int *local_2c;
  undefined4 local_28;
  locale alStack_24 [4];
  int *local_20;
  int local_1c;
  undefined4 local_18;
  
  local_20 = param_2;
  local_1c = param_3;
  local_18 = param_4;
  if ((param_2 != (int *)0x0) && ((param_4 & 0xff00) == 0)) {
    if ((int *)param_2[2] < (int *)param_2[3]) {
      local_1c = *(int *)param_2[2];
    }
    else {
      local_1c = (**(code **)(*param_2 + 0x20))(param_2);
    }
    local_18 = CONCAT22(local_18._2_2_,0x100);
    param_4 = (uint)(local_1c == -1);
    local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
  }
  local_19c = param_6;
  if (((param_7 & 0xff00) == 0) && (param_5 != (int *)0x0)) {
    if ((int *)param_5[2] < (int *)param_5[3]) {
      local_19c = *(int *)param_5[2];
    }
    else {
      local_19c = (**(code **)(*param_5 + 0x20))();
    }
    param_7 = param_7 & 0xffff0000 | (uint)(local_19c == -1) | 0x100;
  }
  if ((param_4 & 0xff) == (param_7 & 0xff)) {
    *param_10 = *param_10 | 2;
    *param_1 = local_20;
    param_1[1] = local_1c;
    param_1[2] = local_18;
    return;
  }
  this = (locale *)std::locale::locale(alStack_24,(locale *)(param_9 + 0x20));
  piVar1 = (int *)std::locale::_M_use_facet(this,(id *)&std::moneypunct<wchar_t,false>::id);
  piVar2 = (int *)std::locale::_M_use_facet(alStack_24,(id *)&std::moneypunct<wchar_t,true>::id);
  piVar3 = (int *)std::locale::_M_use_facet(alStack_24,(id *)&std::ctype<wchar_t>::id);
  if (param_8 == 1) {
    local_28 = (**(code **)(*piVar2 + 0x28))();
    (**(code **)(*piVar2 + 0x1c))(local_70);
    (**(code **)(*piVar2 + 0x18))(local_b8);
  }
  else {
    local_28 = (**(code **)(*piVar1 + 0x28))();
    (**(code **)(*piVar1 + 0x1c))(local_70);
    (**(code **)(*piVar1 + 0x18))(local_b8);
  }
  uVar4 = *(uint *)(param_9 + 4);
  local_1c4 = 1;
  local_100[0] = 0;
  local_1d4 = 0;
  iVar10 = -1;
  local_c0 = local_100;
  local_bc = local_100;
  do {
    switch(alStack_24[iVar10 + -3]) {
    case (locale)0x0:
      cVar9 = local_18._1_1_;
      while( true ) {
        if ((local_20 != (int *)0x0) && (cVar9 == '\0')) {
          if ((int *)local_20[2] < (int *)local_20[3]) {
            local_1c = *(int *)local_20[2];
          }
          else {
            local_1c = (**(code **)(*local_20 + 0x20))();
          }
          local_18 = CONCAT22(local_18._2_2_,0x100);
          local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
        }
        if (((param_7 & 0xff00) == 0) && (param_5 != (int *)0x0)) {
          if ((int *)param_5[2] < (int *)param_5[3]) {
            local_19c = *(int *)param_5[2];
          }
          else {
            local_19c = (**(code **)(*param_5 + 0x20))(param_5);
          }
          param_7 = param_7 & 0xffff0000 | (uint)(local_19c == -1) | 0x100;
        }
        if ((local_18 & 0xff) == (param_7 & 0xff)) break;
        if (local_18._1_1_ == '\0') {
          if ((int *)local_20[2] < (int *)local_20[3]) {
            local_1c = *(int *)local_20[2];
          }
          else {
            local_1c = (**(code **)(*local_20 + 0x20))();
          }
          local_18 = CONCAT22(local_18._2_2_,0x100);
          local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
        }
        iVar7 = (**(code **)(*piVar3 + 8))(piVar3,1,local_1c);
        if (iVar7 != 1) break;
        uVar11 = local_20[2];
        if (uVar11 < (uint)local_20[3]) {
LAB_0004350e:
          local_20[2] = uVar11 + 4;
        }
        else {
          (**(code **)(*local_20 + 0x24))();
        }
LAB_00043512:
        local_18._0_2_ = (ushort)(byte)local_18;
        cVar9 = '\0';
      }
      break;
    case (locale)0x1:
      if (local_18._1_1_ == '\0') {
        if ((int *)local_20[2] < (int *)local_20[3]) {
          local_1c = *(int *)local_20[2];
        }
        else {
          local_1c = (**(code **)(*local_20 + 0x20))();
        }
        local_18 = CONCAT22(local_18._2_2_,0x100);
        local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
      }
      iVar7 = (**(code **)(*piVar3 + 8))(piVar3,1,local_1c);
      if (iVar7 != 0) {
        uVar11 = local_20[2];
        if (uVar11 < (uint)local_20[3]) goto LAB_0004350e;
        (**(code **)(*local_20 + 0x24))();
        goto LAB_00043512;
      }
LAB_000437c4:
      *param_10 = 4;
      *param_1 = local_20;
      param_1[1] = local_1c;
      param_1[2] = local_18;
      goto LAB_00043760;
    case (locale)0x2:
      if (param_8 == 1) {
        (**(code **)(*piVar2 + 0x14))(local_148);
      }
      else {
        (**(code **)(*piVar1 + 0x14))(local_148);
      }
      FUN_00043930(&local_158,local_20,local_1c,local_18,param_5,local_19c,param_7,local_104,
                   local_108);
      if (((uVar4 & 0x200) != 0) && (local_14c == '\0')) {
        *param_10 = 4;
      }
      local_18 = CONCAT22(local_18._2_2_,(short)local_150);
      local_1c = local_154;
      local_20 = local_158;
      if ((local_104 != local_148) && (local_104 != (int *)0x0)) {
        if ((uint)(local_148[0] - (int)local_104) < 0x81) {
          std::__node_alloc::_M_deallocate(local_104,local_148[0] - (int)local_104);
        }
        else {
          operator_delete(local_104);
        }
      }
      break;
    case (locale)0x3:
      if ((local_20 != (int *)0x0) && (local_18._1_1_ == '\0')) {
        if ((int *)local_20[2] < (int *)local_20[3]) {
          local_1c = *(int *)local_20[2];
        }
        else {
          local_1c = (**(code **)(*local_20 + 0x20))();
        }
        local_18 = CONCAT22(local_18._2_2_,0x100);
        local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
      }
      if (((param_7 & 0xff00) == 0) && (param_5 != (int *)0x0)) {
        if ((int *)param_5[2] < (int *)param_5[3]) {
          local_19c = *(int *)param_5[2];
        }
        else {
          local_19c = (**(code **)(*param_5 + 0x20))(param_5);
        }
        param_7 = param_7 & 0xffff0000 | (uint)(local_19c == -1) | 0x100;
      }
      if ((local_18 & 0xff) == (param_7 & 0xff)) {
        if (local_74 != local_78) {
          if (local_2c != local_30) goto LAB_000437c4;
          *param_12 = '\0';
        }
      }
      else if (local_74 == local_78) {
        if (local_2c != local_30) {
          if (local_18._1_1_ == '\0') {
            if ((int *)local_20[2] < (int *)local_20[3]) {
              local_1c = *(int *)local_20[2];
            }
            else {
              local_1c = (**(code **)(*local_20 + 0x20))();
            }
            local_18 = CONCAT22(local_18._2_2_,0x100);
            local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
          }
          if (local_1c == *local_2c) {
            uVar11 = local_20[2];
            if (uVar11 < (uint)local_20[3]) {
LAB_000434ea:
              local_20[2] = uVar11 + 4;
            }
            else {
              (**(code **)(*local_20 + 0x24))();
            }
LAB_000434f6:
            local_18._0_2_ = (ushort)(byte)local_18;
            *param_12 = '\0';
          }
        }
      }
      else {
        if (local_18._1_1_ == '\0') {
          if ((int *)local_20[2] < (int *)local_20[3]) {
            local_1c = *(int *)local_20[2];
          }
          else {
            local_1c = (**(code **)(*local_20 + 0x20))();
          }
          local_18 = CONCAT22(local_18._2_2_,0x100);
          local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
        }
        if (local_1c == *local_74) {
          if ((uint)local_20[2] < (uint)local_20[3]) {
            local_20[2] = local_20[2] + 4;
          }
          else {
            (**(code **)(*local_20 + 0x24))();
          }
          local_18._0_2_ = (ushort)(byte)local_18;
        }
        else if (local_2c != local_30) {
          if (local_1c == *local_2c) {
            uVar11 = local_20[2];
            if (uVar11 < (uint)local_20[3]) goto LAB_000434ea;
            (**(code **)(*local_20 + 0x24))();
            goto LAB_000434f6;
          }
          goto LAB_000437c4;
        }
      }
      break;
    case (locale)0x4:
      if (param_8 == 1) {
        uVar8 = (**(code **)(*piVar2 + 8))();
        uVar5 = (**(code **)(*piVar2 + 0x20))();
        (**(code **)(*piVar2 + 0x10))(local_170);
      }
      else {
        uVar8 = (**(code **)(*piVar1 + 8))();
        uVar5 = (**(code **)(*piVar1 + 0x20))();
        (**(code **)(*piVar1 + 0x10))(local_170);
      }
      local_148[0] = CONCAT31(local_148[0]._1_3_,1);
      uVar6 = local_1d4;
      if (local_15c != local_160) {
        if (param_8 == 1) {
          uVar6 = (**(code **)(*piVar2 + 0xc))();
        }
        else {
          uVar6 = (**(code **)(*piVar1 + 0xc))();
        }
      }
      iVar7 = FUN_00043a78(&local_20,param_5,local_19c,param_7,local_100,piVar3,uVar8,uVar5,uVar6,
                           local_170,local_148);
      if ((char)local_148[0] == '\0') {
        *param_10 = *param_10 | 4;
      }
      iVar12 = 5;
      if (iVar7 == 0) {
        *param_10 = 4;
        *param_1 = local_20;
        param_1[1] = local_1c;
        param_1[2] = local_18;
        iVar12 = local_1c4;
      }
      if ((local_15c != local_170) && (local_15c != (int *)0x0)) {
        if ((uint)(local_170[0] - (int)local_15c) < 0x81) {
          std::__node_alloc::_M_deallocate(local_15c,local_170[0] - (int)local_15c);
        }
        else {
          operator_delete(local_15c);
        }
      }
      if (iVar12 != 5) goto LAB_00043760;
    }
    iVar10 = iVar10 + 1;
  } while (iVar10 < 3);
  if (*param_12 == '\0') {
    if (1 < (uint)((int)local_30 - (int)local_2c >> 2)) {
      FUN_00043930(&local_190,local_20,local_1c,local_18,param_5,local_19c,param_7,local_2c + 1,
                   local_30);
      local_18 = CONCAT22(local_18._2_2_,local_188);
      local_1c = local_18c;
      local_20 = local_190;
      if (local_184 == '\0') {
        *param_10 = *param_10 | 4;
      }
    }
    if (-1 < (int)((uint)(byte)*param_10 << 0x1d)) {
      uVar8 = (**(code **)(*piVar3 + 0x28))(piVar3,0x2d);
      FUN_00044304(param_11,1,uVar8);
      FUN_000441a0(param_11,local_bc,local_c0);
    }
  }
  else {
    if (1 < (uint)((int)local_78 - (int)local_74 >> 2)) {
      FUN_00043930(&local_180,local_20,local_1c,local_18,param_5,local_19c,param_7,local_74 + 1,
                   local_78);
      local_18 = CONCAT22(local_18._2_2_,local_178);
      local_1c = local_17c;
      local_20 = local_180;
      if (local_174 == '\0') {
        *param_10 = *param_10 | 4;
      }
    }
    if ((local_100 != param_11) && ((*param_10 & 4) == 0)) {
      FUN_0004413c(param_11,local_bc,local_c0);
    }
  }
  if ((local_20 != (int *)0x0) && (local_18._1_1_ == '\0')) {
    if ((int *)local_20[2] < (int *)local_20[3]) {
      local_1c = *(int *)local_20[2];
    }
    else {
      local_1c = (**(code **)(*local_20 + 0x20))();
    }
    local_18 = CONCAT22(local_18._2_2_,0x100);
    local_18 = CONCAT31(local_18._1_3_,local_1c == -1);
  }
  if (((param_7 & 0xff00) == 0) && (param_5 != (int *)0x0)) {
    if ((int *)param_5[2] < (int *)param_5[3]) {
      iVar10 = *(int *)param_5[2];
    }
    else {
      iVar10 = (**(code **)(*param_5 + 0x20))();
    }
    param_7 = (uint)(iVar10 == -1);
  }
  if ((local_18 & 0xff) == (param_7 & 0xff)) {
    *param_10 = *param_10 | 2;
  }
  *param_1 = local_20;
  param_1[1] = local_1c;
  param_1[2] = local_18;
LAB_00043760:
  if ((local_bc != local_100) && (local_bc != (int *)0x0)) {
    if ((uint)(local_100[0] - (int)local_bc) < 0x81) {
      std::__node_alloc::_M_deallocate(local_bc,local_100[0] - (int)local_bc);
    }
    else {
      operator_delete(local_bc);
    }
  }
  if ((local_74 != local_b8) && (local_74 != (int *)0x0)) {
    if ((uint)(local_b8[0] - (int)local_74) < 0x81) {
      std::__node_alloc::_M_deallocate(local_74,local_b8[0] - (int)local_74);
    }
    else {
      operator_delete(local_74);
    }
  }
  if ((local_2c != local_70) && (local_2c != (int *)0x0)) {
    if ((uint)(local_70[0] - (int)local_2c) < 0x81) {
      std::__node_alloc::_M_deallocate(local_2c,local_70[0] - (int)local_2c);
    }
    else {
      operator_delete(local_2c);
    }
  }
  std::locale::~locale(alStack_24);
  return;
}



### FUNC FUN_000438b2 @ 000438b2

undefined4 FUN_000438b2(undefined4 param_1,undefined4 param_2,undefined4 param_3)

{
  undefined4 uVar1;
  undefined1 auStack_30 [4];
  uint local_2c [4];
  uint *local_1c;
  uint *local_18;
  
  local_1c = local_2c;
  local_2c[0] = local_2c[0] & 0xffffff00;
  local_18 = local_1c;
  uVar1 = FUN_0004461c(param_1,param_2,10,param_3,0,0,0,local_1c,auStack_30);
  if ((local_18 != local_2c) && (local_18 != (uint *)0x0)) {
    if (local_2c[0] - (int)local_18 < 0x81) {
      std::__node_alloc::_M_deallocate(local_18,local_2c[0] - (int)local_18);
    }
    else {
      operator_delete(local_18);
    }
  }
  return uVar1;
}



### FUNC FUN_00043930 @ 00043930

void FUN_00043930(undefined4 *param_1,int *param_2,int param_3,uint param_4,int *param_5,
                 undefined4 param_6,uint param_7,int *param_8,int *param_9)

{
  int iVar1;
  bool bVar2;
  
  while( true ) {
    if ((param_2 != (int *)0x0) && ((param_4 & 0xff00) == 0)) {
      if ((int *)param_2[2] < (int *)param_2[3]) {
        param_3 = *(int *)param_2[2];
      }
      else {
        param_3 = (**(code **)(*param_2 + 0x20))();
      }
      param_4 = param_4 & 0xffff0000 | (uint)(param_3 == -1) | 0x100;
    }
    if ((param_5 != (int *)0x0) && ((param_7 & 0xff00) == 0)) {
      if ((int *)param_5[2] < (int *)param_5[3]) {
        iVar1 = *(int *)param_5[2];
      }
      else {
        iVar1 = (**(code **)(*param_5 + 0x20))(param_5);
      }
      param_7 = iVar1 == -1 | 0x100;
    }
    bVar2 = param_9 == param_8;
    if ((param_9 == param_8) || ((param_4 & 0xff) == (param_7 & 0xff))) break;
    if ((param_4 & 0xff00) == 0) {
      if ((int *)param_2[2] < (int *)param_2[3]) {
        param_3 = *(int *)param_2[2];
      }
      else {
        param_3 = (**(code **)(*param_2 + 0x20))(param_2);
      }
      param_4 = param_4 & 0xffff0000 | (uint)(param_3 == -1) | 0x100;
    }
    bVar2 = false;
    if (param_3 != *param_8) break;
    if ((uint)param_2[2] < (uint)param_2[3]) {
      param_2[2] = param_2[2] + 4;
    }
    else {
      (**(code **)(*param_2 + 0x24))(param_2);
    }
    param_4 = param_4 & 0xffff00ff;
    param_8 = param_8 + 1;
  }
  *param_1 = param_2;
  param_1[1] = param_3;
  param_1[2] = param_4;
  *(bool *)(param_1 + 3) = bVar2;
  return;
}



### FUNC FUN_00043a78 @ 00043a78

undefined4
FUN_00043a78(int *param_1,int *param_2,undefined4 param_3,uint param_4,int *param_5,int *param_6,
            int param_7,int param_8,int param_9,int param_10,char *param_11)

{
  char cVar1;
  int *piVar2;
  int iVar3;
  char *pcVar4;
  undefined4 *puVar5;
  uint uVar6;
  char *pcVar7;
  uint uVar8;
  char *pcVar9;
  uint uVar10;
  char *pcVar11;
  char *local_c8;
  int local_c4;
  uint local_a8;
  char local_94 [128];
  
  piVar2 = (int *)*param_1;
  if ((piVar2 != (int *)0x0) && (*(char *)((int)param_1 + 9) == '\0')) {
    if ((int *)piVar2[2] < (int *)piVar2[3]) {
      iVar3 = *(int *)piVar2[2];
    }
    else {
      iVar3 = (**(code **)(*piVar2 + 0x20))();
    }
    param_1[1] = iVar3;
    *(undefined1 *)((int)param_1 + 9) = 1;
    *(bool *)(param_1 + 2) = iVar3 == -1;
  }
  if (((param_4 << 0x10) >> 0x18 == 0) && (param_2 != (int *)0x0)) {
    if ((int *)param_2[2] < (int *)param_2[3]) {
      iVar3 = *(int *)param_2[2];
    }
    else {
      iVar3 = (**(code **)(*param_2 + 0x20))(param_2);
    }
    param_4 = iVar3 == -1 | 0x100;
  }
  if ((uint)*(byte *)(param_1 + 2) == (param_4 & 0xff)) {
    return 0;
  }
  if (*(char *)((int)param_1 + 9) == '\0') {
    piVar2 = (int *)*param_1;
    if ((int *)piVar2[2] < (int *)piVar2[3]) {
      iVar3 = *(int *)piVar2[2];
    }
    else {
      iVar3 = (**(code **)(*piVar2 + 0x20))();
    }
    param_1[1] = iVar3;
    *(undefined1 *)((int)param_1 + 9) = 1;
    *(bool *)(param_1 + 2) = iVar3 == -1;
  }
  else {
    iVar3 = param_1[1];
  }
  iVar3 = (**(code **)(*param_6 + 8))(param_6,0x40,iVar3);
  if (iVar3 != 1) {
    return 0;
  }
  local_c8 = (char *)0x0;
  if (*(int *)(param_10 + 0x14) != *(int *)(param_10 + 0x10)) {
    local_c8 = local_94;
  }
  local_c4 = param_8;
  do {
    cVar1 = '\0';
    while( true ) {
      piVar2 = (int *)*param_1;
      if ((piVar2 != (int *)0x0) && (*(char *)((int)param_1 + 9) == '\0')) {
        if ((int *)piVar2[2] < (int *)piVar2[3]) {
          iVar3 = *(int *)piVar2[2];
        }
        else {
          iVar3 = (**(code **)(*piVar2 + 0x20))();
        }
        param_1[1] = iVar3;
        *(undefined1 *)((int)param_1 + 9) = 1;
        *(bool *)(param_1 + 2) = iVar3 == -1;
      }
      local_a8 = 0x3ffffffe;
      if (((param_4 & 0xff00) == 0) && (param_2 != (int *)0x0)) {
        if ((int *)param_2[2] < (int *)param_2[3]) {
          iVar3 = *(int *)param_2[2];
        }
        else {
          iVar3 = (**(code **)(*param_2 + 0x20))(param_2);
        }
        param_4 = iVar3 == -1 | 0x100;
      }
      pcVar4 = local_c8;
      if ((uint)*(byte *)(param_1 + 2) == (param_4 & 0xff)) goto LAB_00043d7e;
      if (*(char *)((int)param_1 + 9) == '\0') {
        piVar2 = (int *)*param_1;
        if ((int *)piVar2[2] < (int *)piVar2[3]) {
          iVar3 = *(int *)piVar2[2];
        }
        else {
          iVar3 = (**(code **)(*piVar2 + 0x20))();
        }
        param_1[1] = iVar3;
        *(undefined1 *)((int)param_1 + 9) = 1;
        *(bool *)(param_1 + 2) = iVar3 == -1;
      }
      else {
        iVar3 = param_1[1];
      }
      iVar3 = (**(code **)(*param_6 + 8))(param_6,0x40,iVar3);
      if (iVar3 != 1) break;
      cVar1 = cVar1 + '\x01';
      if (*(char *)((int)param_1 + 9) == '\0') {
        piVar2 = (int *)*param_1;
        if ((int *)piVar2[2] < (int *)piVar2[3]) {
          iVar3 = *(int *)piVar2[2];
        }
        else {
          iVar3 = (**(code **)(*piVar2 + 0x20))();
        }
        param_1[1] = iVar3;
        *(undefined1 *)((int)param_1 + 9) = 1;
        *(bool *)(param_1 + 2) = iVar3 == -1;
      }
      else {
        iVar3 = param_1[1];
      }
      piVar2 = (int *)*param_1;
      if ((uint)piVar2[2] < (uint)piVar2[3]) {
        piVar2[2] = piVar2[2] + 4;
      }
      else {
        (**(code **)(*piVar2 + 0x24))();
      }
      *(undefined1 *)((int)param_1 + 9) = 0;
      if ((int *)param_5[0x11] == param_5) {
        piVar2 = (int *)param_5[0x10];
        if ((int)piVar2 - (int)param_5 >> 2 == 0xf) goto LAB_00043cde;
      }
      else {
        piVar2 = (int *)param_5[0x10];
        if (*param_5 - (int)piVar2 >> 2 == 1) {
LAB_00043cde:
          uVar6 = (int)piVar2 - param_5[0x11] >> 2;
          uVar10 = uVar6;
          if (uVar6 < 2) {
            uVar10 = 1;
          }
          uVar8 = uVar6 + uVar10 + 1;
          uVar10 = 0x3ffffffe;
          if (uVar6 <= uVar8) {
            uVar10 = uVar8;
          }
          uVar6 = 0x3ffffffe;
          if (uVar8 < 0x3fffffff) {
            uVar6 = uVar10;
          }
          FUN_00044094(param_5,uVar6);
          piVar2 = (int *)param_5[0x10];
        }
      }
      *piVar2 = iVar3;
      piVar2[1] = 0;
      param_5[0x10] = (int)(piVar2 + 1);
    }
    pcVar4 = (char *)0x0;
    if (local_c8 == (char *)0x0) break;
    if (*(char *)((int)param_1 + 9) == '\0') {
      piVar2 = (int *)*param_1;
      if ((int *)piVar2[2] < (int *)piVar2[3]) {
        iVar3 = *(int *)piVar2[2];
      }
      else {
        iVar3 = (**(code **)(*piVar2 + 0x20))();
      }
      param_1[1] = iVar3;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar3 == -1;
    }
    else {
      iVar3 = param_1[1];
    }
    pcVar4 = local_c8;
    if (iVar3 != param_9) break;
    *local_c8 = cVar1;
    local_c8 = local_c8 + 1;
    piVar2 = (int *)*param_1;
    if ((uint)piVar2[2] < (uint)piVar2[3]) {
      piVar2[2] = piVar2[2] + 4;
    }
    else {
      (**(code **)(*piVar2 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 9) = 0;
  } while( true );
LAB_00043d7e:
  pcVar11 = *(char **)(param_10 + 0x10);
  pcVar9 = *(char **)(param_10 + 0x14);
  if (pcVar9 == pcVar11) {
    *param_11 = '\x01';
LAB_00043e5c:
    piVar2 = (int *)*param_1;
    if ((uint)piVar2[2] < (uint)piVar2[3]) {
      piVar2[2] = piVar2[2] + 4;
    }
    else {
      (**(code **)(*piVar2 + 0x24))();
    }
    cVar1 = '\0';
    *(undefined1 *)((int)param_1 + 9) = 0;
    while( true ) {
      piVar2 = (int *)*param_1;
      if ((piVar2 != (int *)0x0) && (cVar1 == '\0')) {
        if ((int *)piVar2[2] < (int *)piVar2[3]) {
          iVar3 = *(int *)piVar2[2];
        }
        else {
          iVar3 = (**(code **)(*piVar2 + 0x20))();
        }
        param_1[1] = iVar3;
        *(undefined1 *)((int)param_1 + 9) = 1;
        *(bool *)(param_1 + 2) = iVar3 == -1;
      }
      if (((param_4 & 0xff00) == 0) && (param_2 != (int *)0x0)) {
        if ((int *)param_2[2] < (int *)param_2[3]) {
          iVar3 = *(int *)param_2[2];
        }
        else {
          iVar3 = (**(code **)(*param_2 + 0x20))(param_2);
        }
        param_4 = iVar3 == -1 | 0x100;
      }
      if ((uint)*(byte *)(param_1 + 2) == (param_4 & 0xff)) break;
      if (*(char *)((int)param_1 + 9) == '\0') {
        piVar2 = (int *)*param_1;
        if ((int *)piVar2[2] < (int *)piVar2[3]) {
          iVar3 = *(int *)piVar2[2];
        }
        else {
          iVar3 = (**(code **)(*piVar2 + 0x20))();
        }
        param_1[1] = iVar3;
        *(undefined1 *)((int)param_1 + 9) = 1;
        *(bool *)(param_1 + 2) = iVar3 == -1;
      }
      else {
        iVar3 = param_1[1];
      }
      iVar3 = (**(code **)(*param_6 + 8))(param_6,0x40,iVar3);
      if (iVar3 != 1) break;
      if (*(char *)((int)param_1 + 9) == '\0') {
        piVar2 = (int *)*param_1;
        if ((int *)piVar2[2] < (int *)piVar2[3]) {
          iVar3 = *(int *)piVar2[2];
        }
        else {
          iVar3 = (**(code **)(*piVar2 + 0x20))();
        }
        param_1[1] = iVar3;
        *(undefined1 *)((int)param_1 + 9) = 1;
        *(bool *)(param_1 + 2) = iVar3 == -1;
      }
      else {
        iVar3 = param_1[1];
      }
      piVar2 = (int *)*param_1;
      if ((uint)piVar2[2] < (uint)piVar2[3]) {
        piVar2[2] = piVar2[2] + 4;
      }
      else {
        (**(code **)(*piVar2 + 0x24))();
      }
      *(undefined1 *)((int)param_1 + 9) = 0;
      if ((int *)param_5[0x11] == param_5) {
        piVar2 = (int *)param_5[0x10];
        if ((int)piVar2 - (int)param_5 >> 2 == 0xf) goto LAB_00044030;
      }
      else {
        piVar2 = (int *)param_5[0x10];
        if (*param_5 - (int)piVar2 >> 2 == 1) {
LAB_00044030:
          uVar6 = (int)piVar2 - param_5[0x11] >> 2;
          uVar10 = uVar6;
          if (uVar6 < 2) {
            uVar10 = 1;
          }
          uVar8 = uVar6 + uVar10 + 1;
          uVar10 = local_a8;
          if (uVar6 <= uVar8) {
            uVar10 = uVar8;
          }
          uVar6 = local_a8;
          if (uVar8 < 0x3fffffff) {
            uVar6 = uVar10;
          }
          FUN_00044094(param_5,uVar6);
          piVar2 = (int *)param_5[0x10];
        }
      }
      *piVar2 = iVar3;
      piVar2[1] = 0;
      param_5[0x10] = (int)(piVar2 + 1);
      local_c4 = local_c4 + -1;
      cVar1 = *(char *)((int)param_1 + 9);
    }
    *param_11 = local_c4 == 0 && *param_11 != '\0';
  }
  else {
    pcVar7 = local_94;
    if (pcVar4 != pcVar7) {
      *pcVar4 = cVar1;
      pcVar7 = pcVar4 + 1;
      pcVar11 = *(char **)(param_10 + 0x10);
      pcVar9 = *(char **)(param_10 + 0x14);
    }
    cVar1 = std::priv::__valid_grouping(local_94,pcVar7,pcVar9,pcVar11);
    *param_11 = cVar1;
    piVar2 = (int *)*param_1;
    if ((piVar2 != (int *)0x0) && (*(char *)((int)param_1 + 9) == '\0')) {
      if ((int *)piVar2[2] < (int *)piVar2[3]) {
        iVar3 = *(int *)piVar2[2];
      }
      else {
        iVar3 = (**(code **)(*piVar2 + 0x20))();
      }
      param_1[1] = iVar3;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar3 == -1;
    }
    if (((param_4 & 0xff00) == 0) && (param_2 != (int *)0x0)) {
      if ((int *)param_2[2] < (int *)param_2[3]) {
        iVar3 = *(int *)param_2[2];
      }
      else {
        iVar3 = (**(code **)(*param_2 + 0x20))(param_2);
      }
      param_4 = iVar3 == -1 | 0x100;
    }
    if ((uint)*(byte *)(param_1 + 2) != (param_4 & 0xff)) {
      if (*(char *)((int)param_1 + 9) == '\0') {
        piVar2 = (int *)*param_1;
        if ((int *)piVar2[2] < (int *)piVar2[3]) {
          iVar3 = *(int *)piVar2[2];
        }
        else {
          iVar3 = (**(code **)(*piVar2 + 0x20))();
        }
        param_1[1] = iVar3;
        *(undefined1 *)((int)param_1 + 9) = 1;
        *(bool *)(param_1 + 2) = iVar3 == -1;
      }
      else {
        iVar3 = param_1[1];
      }
      if (iVar3 == param_7) goto LAB_00043e5c;
    }
    if (param_8 != 0) {
      do {
        if ((int *)param_5[0x11] == param_5) {
          puVar5 = (undefined4 *)param_5[0x10];
          if ((int)puVar5 - (int)param_5 >> 2 == 0xf) goto LAB_00043ea2;
        }
        else {
          puVar5 = (undefined4 *)param_5[0x10];
          if (*param_5 - (int)puVar5 >> 2 == 1) {
LAB_00043ea2:
            uVar6 = (int)puVar5 - param_5[0x11] >> 2;
            uVar10 = uVar6;
            if (uVar6 < 2) {
              uVar10 = 1;
            }
            uVar8 = uVar6 + uVar10 + 1;
            uVar10 = local_a8;
            if (uVar6 <= uVar8) {
              uVar10 = uVar8;
            }
            uVar6 = local_a8;
            if (uVar8 < 0x3fffffff) {
              uVar6 = uVar10;
            }
            FUN_00044094(param_5,uVar6);
            puVar5 = (undefined4 *)param_5[0x10];
          }
        }
        *puVar5 = 0x30;
        puVar5[1] = 0;
        param_5[0x10] = (int)(puVar5 + 1);
        param_8 = param_8 + -1;
      } while (param_8 != 0);
    }
  }
  return 1;
}



### FUNC FUN_00044094 @ 00044094

void FUN_00044094(int *param_1,uint param_2)

{
  int *piVar1;
  undefined4 uVar2;
  int iVar3;
  int *piVar4;
  int iVar5;
  int *piVar6;
  int *piVar7;
  uint local_1c;
  uint local_18;
  
  if (param_2 >> 0x1e == 0) {
    piVar6 = (int *)0x0;
    if (param_2 == 0) {
      local_1c = 0;
    }
    else {
      param_2 = param_2 << 2;
      local_18 = param_2;
      if (param_2 < 0x81) {
        piVar6 = (int *)std::__node_alloc::_M_allocate(&local_18);
        param_2 = local_18;
      }
      else {
        piVar6 = (int *)operator_new(param_2);
      }
      local_1c = param_2 >> 2;
    }
    piVar1 = (int *)param_1[0x11];
    piVar7 = piVar6;
    if (0 < param_1[0x10] - (int)piVar1) {
      iVar3 = ((uint)(param_1[0x10] - (int)piVar1) >> 2) + 1;
      piVar4 = piVar1;
      do {
        iVar5 = *piVar4;
        piVar4 = piVar4 + 1;
        *piVar7 = iVar5;
        piVar7 = piVar7 + 1;
        iVar3 = iVar3 + -1;
      } while (1 < iVar3);
    }
    *piVar7 = 0;
    if ((piVar1 != param_1) && (piVar1 != (int *)0x0)) {
      if ((uint)(*param_1 - (int)piVar1) < 0x81) {
        std::__node_alloc::_M_deallocate(piVar1,*param_1 - (int)piVar1);
      }
      else {
        operator_delete(piVar1);
      }
    }
    param_1[0x10] = (int)piVar7;
    param_1[0x11] = (int)piVar6;
    *param_1 = (int)(piVar6 + local_1c);
    return;
  }
  FUN_00030824(4);
  uVar2 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(uVar2,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
}



### FUNC FUN_0004413c @ 0004413c

int FUN_0004413c(int param_1,wchar_t *param_2,int param_3)

{
  wchar_t *pwVar1;
  size_t __n;
  uint __n_00;
  wchar_t *__s1;
  
  __n_00 = param_3 - (int)param_2 >> 2;
  pwVar1 = *(wchar_t **)(param_1 + 0x44);
  __n = *(int *)(param_1 + 0x40) - (int)pwVar1 >> 2;
  if (__n < __n_00) {
    wmemmove(pwVar1,param_2,__n);
    FUN_000441a0(param_1,(int)param_2 + (*(int *)(param_1 + 0x40) - *(int *)(param_1 + 0x44)),
                 param_3);
  }
  else {
    wmemmove(pwVar1,param_2,__n_00);
    pwVar1 = *(wchar_t **)(param_1 + 0x40);
    __s1 = (wchar_t *)(*(int *)(param_1 + 0x44) + __n_00 * 4);
    if (__s1 != pwVar1) {
      wmemmove(__s1,pwVar1,1);
      *(int *)(param_1 + 0x40) = *(int *)(param_1 + 0x40) - ((int)pwVar1 - (int)__s1);
    }
  }
  return param_1;
}



### FUNC FUN_000441a0 @ 000441a0

int * FUN_000441a0(int *param_1,int *param_2,int *param_3)

{
  uint uVar1;
  int *piVar2;
  undefined4 uVar3;
  int iVar4;
  int *piVar5;
  uint uVar6;
  uint uVar7;
  int *piVar8;
  uint uVar9;
  int iVar10;
  int *piVar11;
  uint local_24;
  uint local_18;
  
  if (param_2 != param_3) {
    uVar1 = (int)param_3 - (int)param_2;
    uVar6 = (int)uVar1 >> 2;
    piVar2 = (int *)param_1[0x11];
    if (piVar2 == param_1) {
      piVar8 = (int *)param_1[0x10];
      uVar9 = 0x10 - ((int)piVar8 - (int)param_1 >> 2);
    }
    else {
      piVar8 = (int *)param_1[0x10];
      uVar9 = *param_1 - (int)piVar8 >> 2;
    }
    if (uVar6 < uVar9) {
      piVar2 = param_2 + 1;
      if (0 < (int)param_3 - (int)piVar2) {
        iVar10 = ((uint)((int)param_3 - (int)piVar2) >> 2) + 1;
        piVar5 = piVar8;
        do {
          piVar5 = piVar5 + 1;
          iVar4 = *piVar2;
          piVar2 = piVar2 + 1;
          *piVar5 = iVar4;
          iVar10 = iVar10 + -1;
        } while (1 < iVar10);
      }
      piVar8[uVar6] = 0;
      *piVar8 = *param_2;
      param_1[0x10] = (int)(piVar8 + uVar6);
    }
    else {
      uVar9 = (int)piVar8 - (int)piVar2 >> 2;
      if (0x3ffffffe - uVar9 < uVar6) {
                    /* WARNING: Subroutine does not return */
        std::__stl_throw_length_error("basic_string");
      }
      uVar7 = uVar9;
      if (uVar9 <= uVar6) {
        uVar7 = uVar6;
      }
      uVar7 = uVar9 + uVar7 + 1;
      uVar6 = 0x3ffffffe;
      if (uVar9 <= uVar7) {
        uVar6 = uVar7;
      }
      local_24 = 0x3ffffffe;
      if (uVar7 < 0x3fffffff) {
        local_24 = uVar6;
      }
      if (0x3fffffff < local_24) {
        FUN_00030824(4);
        uVar3 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
        FUN_000309e0(uVar3,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
      }
      piVar5 = (int *)0x0;
      if (local_24 == 0) {
        local_24 = 0;
      }
      else {
        local_24 = local_24 << 2;
        local_18 = local_24;
        if (local_24 < 0x81) {
          piVar5 = (int *)std::__node_alloc::_M_allocate(&local_18);
          local_24 = local_18;
        }
        else {
          piVar5 = (int *)operator_new(local_24);
        }
        piVar8 = (int *)param_1[0x10];
        piVar2 = (int *)param_1[0x11];
        local_24 = local_24 >> 2;
      }
      piVar11 = piVar5;
      if (0 < (int)piVar8 - (int)piVar2) {
        iVar10 = ((uint)((int)piVar8 - (int)piVar2) >> 2) + 1;
        piVar8 = piVar2;
        do {
          iVar4 = *piVar8;
          piVar8 = piVar8 + 1;
          *piVar11 = iVar4;
          piVar11 = piVar11 + 1;
          iVar10 = iVar10 + -1;
        } while (1 < iVar10);
      }
      if (0 < (int)uVar1) {
        iVar10 = (uVar1 >> 2) + 1;
        do {
          iVar4 = *param_2;
          param_2 = param_2 + 1;
          *piVar11 = iVar4;
          piVar11 = piVar11 + 1;
          iVar10 = iVar10 + -1;
        } while (1 < iVar10);
      }
      *piVar11 = 0;
      if ((piVar2 != param_1) && (piVar2 != (int *)0x0)) {
        if ((uint)(*param_1 - (int)piVar2) < 0x81) {
          std::__node_alloc::_M_deallocate(piVar2,*param_1 - (int)piVar2);
        }
        else {
          operator_delete(piVar2);
        }
      }
      param_1[0x10] = (int)piVar11;
      param_1[0x11] = (int)piVar5;
      *param_1 = (int)(piVar5 + local_24);
    }
  }
  return param_1;
}



### FUNC FUN_00044304 @ 00044304

wchar_t * FUN_00044304(wchar_t *param_1,uint param_2,wchar_t param_3)

{
  wchar_t *pwVar1;
  uint uVar2;
  uint __n;
  wchar_t *__s1;
  undefined1 auStack_60 [4];
  int local_5c [17];
  int *local_18;
  
  pwVar1 = (wchar_t *)param_1[0x11];
  __n = param_1[0x10] - (int)pwVar1 >> 2;
  if (__n < param_2) {
    uVar2 = 0xf;
    if (param_1 != pwVar1) {
      uVar2 = (*param_1 - (int)pwVar1 >> 2) - 1;
    }
    if (param_2 < uVar2) {
      wmemset(pwVar1,param_3,__n);
      FUN_000443dc(param_1,param_2 - (param_1[0x10] - param_1[0x11] >> 2),param_3);
    }
    else {
      FUN_00044474(local_5c,param_2,param_3,auStack_60);
      FUN_00044510(param_1,local_5c);
      if ((local_18 != local_5c) && (local_18 != (int *)0x0)) {
        if ((uint)(local_5c[0] - (int)local_18) < 0x81) {
          std::__node_alloc::_M_deallocate(local_18,local_5c[0] - (int)local_18);
        }
        else {
          operator_delete(local_18);
        }
      }
    }
  }
  else {
    wmemset(pwVar1,param_3,param_2);
    pwVar1 = (wchar_t *)param_1[0x10];
    __s1 = (wchar_t *)(param_1[0x11] + param_2 * 4);
    if (__s1 != pwVar1) {
      wmemmove(__s1,pwVar1,1);
      param_1[0x10] = param_1[0x10] - ((int)pwVar1 - (int)__s1);
    }
  }
  return param_1;
}



### FUNC FUN_000443dc @ 000443dc

int * FUN_000443dc(int *param_1,uint param_2,undefined4 param_3)

{
  undefined4 *puVar1;
  undefined4 *puVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  
  if (param_2 != 0) {
    puVar2 = (undefined4 *)param_1[0x10];
    uVar3 = (int)puVar2 - param_1[0x11] >> 2;
    if (0x3ffffffe - uVar3 < param_2) {
                    /* WARNING: Subroutine does not return */
      std::__stl_throw_length_error("basic_string");
    }
    if (param_1 == (int *)param_1[0x11]) {
      uVar4 = 0x10 - ((int)puVar2 - (int)param_1 >> 2);
    }
    else {
      uVar4 = *param_1 - (int)puVar2 >> 2;
    }
    if (uVar4 <= param_2) {
      uVar4 = uVar3;
      if (uVar3 <= param_2) {
        uVar4 = param_2;
      }
      uVar5 = uVar3 + uVar4 + 1;
      uVar4 = 0x3ffffffe;
      if (uVar3 <= uVar5) {
        uVar4 = uVar5;
      }
      uVar3 = 0x3ffffffe;
      if (uVar5 < 0x3fffffff) {
        uVar3 = uVar4;
      }
      FUN_00044094(param_1,uVar3);
      puVar2 = (undefined4 *)param_1[0x10];
    }
    uVar3 = param_2;
    puVar1 = puVar2;
    if (0 < (int)(param_2 * 4 + -4)) {
      do {
        puVar1[1] = param_3;
        uVar3 = uVar3 - 1;
        puVar1 = puVar1 + 1;
      } while (1 < (int)uVar3);
    }
    puVar2[param_2] = 0;
    *puVar2 = param_3;
    param_1[0x10] = (int)(puVar2 + param_2);
  }
  return param_1;
}



### FUNC FUN_00044474 @ 00044474

int * FUN_00044474(int *param_1,uint param_2,int param_3)

{
  uint uVar1;
  int *piVar2;
  undefined4 uVar3;
  int *piVar4;
  uint uVar5;
  uint local_18;
  
  param_1[0x10] = (int)param_1;
  param_1[0x11] = (int)param_1;
  uVar5 = param_2 + 1;
  if (0x3ffffffe < param_2) {
                    /* WARNING: Subroutine does not return */
    std::__stl_throw_length_error("basic_string");
  }
  piVar2 = param_1;
  if (0x10 < uVar5) {
    if (0x3fffffff < uVar5) {
      FUN_00030824(4);
      uVar3 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
      FUN_000309e0(uVar3,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
    }
    uVar1 = uVar5 * 4;
    local_18 = uVar1;
    if (uVar1 < 0x81) {
      piVar2 = (int *)std::__node_alloc::_M_allocate(&local_18);
    }
    else {
      piVar2 = (int *)operator_new(uVar1);
      local_18 = uVar1;
    }
    param_1[0x10] = (int)piVar2;
    param_1[0x11] = (int)piVar2;
    *param_1 = (int)piVar2 + (local_18 & 0xfffffffc);
  }
  piVar4 = piVar2 + param_2;
  if (0 < (int)(param_2 * 4)) {
    do {
      *piVar2 = param_3;
      piVar2 = piVar2 + 1;
      uVar5 = uVar5 - 1;
    } while (1 < (int)uVar5);
  }
  param_1[0x10] = (int)piVar4;
  *piVar4 = 0;
  return param_1;
}



### FUNC FUN_00044510 @ 00044510

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_00044510(undefined4 *param_1,undefined4 *param_2)

{
  undefined4 uVar1;
  undefined4 *puVar2;
  undefined4 uVar3;
  undefined4 uVar4;
  undefined4 uVar5;
  int iVar6;
  undefined4 uVar7;
  undefined4 uVar8;
  undefined4 uVar9;
  undefined4 uVar10;
  undefined4 uVar11;
  undefined4 uVar12;
  undefined4 uVar13;
  undefined4 *puVar14;
  undefined4 uVar15;
  undefined4 uVar16;
  undefined4 uVar17;
  undefined4 uVar18;
  undefined4 uVar19;
  undefined4 uVar20;
  undefined4 uVar21;
  undefined4 uVar22;
  
  puVar2 = (undefined4 *)param_2[0x11];
  puVar14 = (undefined4 *)param_1[0x11];
  if (puVar14 == param_1) {
    if (puVar2 != param_2) {
      FUN_00044510();
      return;
    }
    uVar1 = *param_1;
    uVar21 = param_1[1];
    uVar9 = param_1[2];
    uVar16 = param_1[3];
    uVar7 = param_1[4];
    uVar3 = param_1[5];
    uVar10 = param_1[6];
    uVar17 = param_1[7];
    uVar8 = param_1[8];
    uVar4 = param_1[9];
    uVar11 = param_1[10];
    uVar18 = param_1[0xb];
    uVar15 = param_1[0xc];
    uVar5 = param_1[0xd];
    uVar12 = param_1[0xe];
    uVar19 = param_1[0xf];
    uVar13 = param_2[1];
    uVar20 = param_2[2];
    uVar22 = param_2[3];
    *param_1 = *param_2;
    param_1[1] = uVar13;
    param_1[2] = uVar20;
    param_1[3] = uVar22;
    uVar13 = param_2[5];
    uVar20 = param_2[6];
    uVar22 = param_2[7];
    param_1[4] = param_2[4];
    param_1[5] = uVar13;
    param_1[6] = uVar20;
    param_1[7] = uVar22;
    uVar13 = param_2[9];
    uVar20 = param_2[10];
    uVar22 = param_2[0xb];
    param_1[8] = param_2[8];
    param_1[9] = uVar13;
    param_1[10] = uVar20;
    param_1[0xb] = uVar22;
    uVar13 = param_2[0xd];
    uVar20 = param_2[0xe];
    uVar22 = param_2[0xf];
    param_1[0xc] = param_2[0xc];
    param_1[0xd] = uVar13;
    param_1[0xe] = uVar20;
    param_1[0xf] = uVar22;
    *param_2 = uVar1;
    param_2[1] = uVar21;
    param_2[2] = uVar9;
    param_2[3] = uVar16;
    param_2[4] = uVar7;
    param_2[5] = uVar3;
    param_2[6] = uVar10;
    param_2[7] = uVar17;
    param_2[8] = uVar8;
    param_2[9] = uVar4;
    param_2[10] = uVar11;
    param_2[0xb] = uVar18;
    param_2[0xc] = uVar15;
    param_2[0xd] = uVar5;
    param_2[0xe] = uVar12;
    param_2[0xf] = uVar19;
    iVar6 = param_1[0x10];
    param_1[0x10] = param_1[0x11] + (param_2[0x10] - param_2[0x11]);
    param_2[0x10] = (int)param_2 + (iVar6 - param_1[0x11]);
    param_1[0x11] = puVar14;
    param_2[0x11] = puVar2;
    return;
  }
  if (puVar2 != param_2) {
    uVar1 = *param_1;
    *param_1 = *param_2;
    *param_2 = uVar1;
    uVar1 = param_1[0x11];
    param_1[0x11] = param_2[0x11];
    param_2[0x11] = uVar1;
    uVar1 = param_1[0x10];
    param_1[0x10] = param_2[0x10];
    param_2[0x10] = uVar1;
    return;
  }
  uVar1 = param_1[0x10];
  uVar7 = *param_1;
  uVar8 = param_2[1];
  uVar15 = param_2[2];
  uVar21 = param_2[3];
  *param_1 = *param_2;
  param_1[1] = uVar8;
  param_1[2] = uVar15;
  param_1[3] = uVar21;
  uVar8 = param_2[5];
  uVar15 = param_2[6];
  uVar21 = param_2[7];
  param_1[4] = param_2[4];
  param_1[5] = uVar8;
  param_1[6] = uVar15;
  param_1[7] = uVar21;
  uVar8 = param_2[9];
  uVar15 = param_2[10];
  uVar21 = param_2[0xb];
  param_1[8] = param_2[8];
  param_1[9] = uVar8;
  param_1[10] = uVar15;
  param_1[0xb] = uVar21;
  uVar8 = param_2[0xd];
  uVar15 = param_2[0xe];
  uVar21 = param_2[0xf];
  param_1[0xc] = param_2[0xc];
  param_1[0xd] = uVar8;
  param_1[0xe] = uVar15;
  param_1[0xf] = uVar21;
  param_1[0x11] = param_1;
  param_1[0x10] = (int)param_1 + (param_2[0x10] - (int)param_2);
  *puVar2 = uVar7;
  param_2[0x10] = uVar1;
  param_2[0x11] = puVar14;
  return;
}



### FUNC FUN_0004461c @ 0004461c

undefined4
FUN_0004461c(int *param_1,undefined4 *param_2,int param_3,undefined4 *param_4,int param_5,
            int param_6,uint param_7,int param_8)

{
  uint *puVar1;
  uint uVar2;
  int iVar3;
  undefined4 uVar4;
  char cVar5;
  char *pcVar6;
  int iVar7;
  uint uVar8;
  int iVar9;
  uint uVar10;
  uint uVar11;
  int iVar12;
  undefined4 uVar13;
  undefined8 uVar14;
  undefined8 uVar15;
  undefined8 uVar16;
  undefined8 uVar17;
  uint local_9c;
  undefined4 local_70;
  int local_64;
  undefined4 local_60;
  char local_54 [64];
  
  uVar14 = __floatsidf(param_3);
  uVar15 = __divdf3(0xffffffff,0x7fefffff);
  iVar7 = *(int *)(param_8 + 0x10);
  iVar9 = *(int *)(param_8 + 0x14);
  puVar1 = (uint *)*param_1;
  local_9c = 1;
  local_64 = param_5;
  if (puVar1 == (uint *)*param_2) {
    uVar11 = 0;
    pcVar6 = local_54;
    uVar16 = 0;
  }
  else {
    pcVar6 = local_54;
    uVar8 = 0;
    uVar16 = 0;
    cVar5 = '\0';
    uVar10 = uVar8;
    do {
      local_70 = (undefined4)((ulonglong)uVar16 >> 0x20);
      local_60 = (undefined4)uVar16;
      uVar2 = *puVar1;
      uVar11 = uVar10;
      if (uVar2 == param_7 && iVar9 != iVar7) {
        *pcVar6 = cVar5;
        uVar8 = uVar8 + 1;
        cVar5 = '\0';
      }
      else {
        iVar12 = 0xff;
        if (uVar2 < 0x80) {
          iVar12 = std::priv::__digit_val_table(uVar2);
        }
        if (param_3 <= iVar12) break;
        iVar3 = __aeabi_dcmpgt(local_60,local_70,(int)uVar15,(int)((ulonglong)uVar15 >> 0x20));
        cVar5 = cVar5 + '\x01';
        local_64 = local_64 + 1;
        uVar11 = local_9c;
        if (iVar3 == 0) {
          uVar16 = __muldf3(local_60,local_70,(int)uVar14,(int)((ulonglong)uVar14 >> 0x20));
          uVar17 = __floatsidf(iVar12);
          uVar16 = __adddf3((int)uVar16,(int)((ulonglong)uVar16 >> 0x20),(int)uVar17,
                            (int)((ulonglong)uVar17 >> 0x20));
          iVar12 = __aeabi_dcmple((int)uVar16,(int)((ulonglong)uVar16 >> 0x20),local_60,local_70);
          iVar3 = __aeabi_dcmpeq(local_60,local_70,0,0);
          uVar11 = uVar10 | (iVar3 == 0 && iVar12 != 0);
        }
      }
      puVar1 = (uint *)(*param_1 + 4);
      *param_1 = (int)puVar1;
      pcVar6 = local_54 + uVar8;
      uVar10 = uVar11;
    } while (puVar1 != (uint *)*param_2);
    pcVar6 = local_54 + uVar8;
    if ((iVar9 != iVar7) && (uVar8 != 0)) {
      *pcVar6 = cVar5;
      pcVar6 = local_54 + uVar8 + 1;
    }
  }
  uVar13 = (undefined4)((ulonglong)uVar16 >> 0x20);
  local_60 = (undefined4)uVar16;
  uVar4 = 0;
  if (0 < local_64) {
    if (uVar11 != 0) {
      *param_4 = 0xffffffff;
      param_4[1] = 0x7fefffff;
      return 0;
    }
    uVar14 = __subdf3(0,0x80000000,local_60,uVar13);
    uVar4 = (int)((ulonglong)uVar14 >> 0x20);
    if (param_6 == 0) {
      uVar4 = uVar13;
    }
    param_4[1] = uVar4;
    uVar4 = (int)uVar14;
    if (param_6 == 0) {
      uVar4 = local_60;
    }
    *param_4 = uVar4;
    uVar4 = 1;
    if (iVar9 != iVar7) {
      uVar4 = std::priv::__valid_grouping
                        (local_54,pcVar6,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10));
    }
  }
  return uVar4;
}



### FUNC FUN_000447ec @ 000447ec

void FUN_000447ec(facet *param_1)

{
  std::locale::facet::~facet(param_1);
  operator_delete(param_1);
  return;
}



### FUNC FUN_000448f4 @ 000448f4

void FUN_000448f4(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8)

{
  FUN_000455e4(param_1,param_3,param_4,param_5,param_6,param_7,param_8,1,0);
  return;
}



### FUNC FUN_00044920 @ 00044920

/* WARNING: Type propagation algorithm not settling */
/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_00044920(undefined4 *param_1,int *param_2,uint param_3,int param_4,int param_5,int param_6,
                 int param_7,int param_8)

{
  locale *this;
  int *piVar1;
  int *piVar2;
  int *piVar3;
  int ******ppppppiVar4;
  undefined4 uVar5;
  int iVar6;
  int iVar7;
  uint uVar8;
  int *******pppppppiVar9;
  int iVar10;
  int *******pppppppiVar11;
  uint uVar12;
  uint uVar13;
  uint uVar14;
  uint uVar15;
  uint uVar16;
  int iVar17;
  int *******pppppppiVar18;
  uint uVar19;
  uint uVar20;
  uint uVar21;
  int iVar22;
  int ******ppppppiVar23;
  int iVar24;
  int iVar25;
  uint uVar26;
  byte bVar27;
  bool bVar28;
  undefined8 uVar29;
  int local_578;
  undefined4 local_564;
  int *******local_524;
  uint local_520;
  uint local_514;
  undefined4 *******local_510 [16];
  int *******local_4d0;
  int ******local_4cc;
  undefined1 auStack_4c8 [1024];
  int *******local_c8;
  int local_c4 [16];
  int *local_84;
  int *local_80;
  int local_7c [16];
  int local_3c;
  int *local_38;
  int local_34 [4];
  int *local_24;
  int *local_20;
  locale alStack_1c [4];
  undefined1 auStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_1c,(locale *)(param_5 + 0x20));
  piVar1 = (int *)std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  piVar2 = (int *)std::locale::_M_use_facet(alStack_1c,(id *)&std::moneypunct<wchar_t,false>::id);
  piVar3 = (int *)std::locale::_M_use_facet(alStack_1c,(id *)&std::moneypunct<wchar_t,true>::id);
  ppppppiVar4 = (int ******)(**(code **)(*piVar1 + 0x28))(piVar1,0x2d);
  uVar5 = (**(code **)(*piVar1 + 0x28))(piVar1,0x2b);
  iVar6 = (**(code **)(*piVar1 + 0x28))(piVar1,0x20);
  iVar7 = (**(code **)(*piVar1 + 0x28))(piVar1,0x30);
  if (param_4 == 1) {
    local_578 = (**(code **)(*piVar3 + 8))();
    local_564 = (**(code **)(*piVar3 + 0xc))();
    (**(code **)(*piVar3 + 0x10))(local_34);
    uVar8 = (**(code **)(*piVar3 + 0x20))(piVar3,*(code **)(*piVar3 + 0x20),local_34);
    (**(code **)(*piVar3 + 0x14))(local_7c,piVar3,*(code **)(*piVar3 + 0x14),local_34);
  }
  else {
    local_578 = (**(code **)(*piVar2 + 8))();
    local_564 = (**(code **)(*piVar2 + 0xc))();
    (**(code **)(*piVar2 + 0x10))(local_34);
    uVar8 = (**(code **)(*piVar2 + 0x20))(piVar2,*(code **)(*piVar2 + 0x20),local_34);
    (**(code **)(*piVar2 + 0x14))(local_7c,piVar2,*(code **)(*piVar2 + 0x14),local_34);
  }
  pppppppiVar9 = *(int ********)(param_7 + 0x448);
  pppppppiVar18 = *(int ********)(param_7 + 0x40);
  if (pppppppiVar9 == pppppppiVar18) {
    *param_1 = param_2;
    param_1[1] = param_3;
    if ((local_38 != local_7c) && (local_38 != (int *)0x0)) {
      if ((uint)(local_7c[0] - (int)local_38) < 0x81) {
        std::__node_alloc::_M_deallocate(local_38,local_7c[0] - (int)local_38);
      }
      else {
        operator_delete(local_38);
      }
    }
    if ((local_20 != local_34) && (local_20 != (int *)0x0)) {
      if ((uint)(local_34[0] - (int)local_20) < 0x81) {
        std::__node_alloc::_M_deallocate(local_20,local_34[0] - (int)local_20);
      }
      else {
        operator_delete(local_20);
      }
    }
    std::locale::~locale(alStack_1c);
    return;
  }
  ppppppiVar23 = *pppppppiVar9;
  pppppppiVar11 = pppppppiVar9 + 1;
  if (ppppppiVar23 != ppppppiVar4) {
    pppppppiVar11 = pppppppiVar9;
  }
  if (param_4 == 1) {
    if (ppppppiVar23 == ppppppiVar4) {
      (**(code **)(*piVar3 + 0x1c))(local_c4,piVar3);
    }
    else {
      (**(code **)(*piVar3 + 0x18))(local_c4,piVar3);
    }
  }
  else if (ppppppiVar23 == ppppppiVar4) {
    (**(code **)(*piVar2 + 0x1c))(local_c4);
  }
  else {
    (**(code **)(*piVar2 + 0x18))(local_c4);
  }
  local_524 = pppppppiVar18;
  pppppppiVar9 = pppppppiVar11;
  if (param_8 == 1) {
    while ((local_524 = pppppppiVar18, pppppppiVar9 != pppppppiVar18 &&
           (iVar10 = (**(code **)(*piVar1 + 8))(piVar1,0x40,*pppppppiVar9), local_524 = pppppppiVar9
           , iVar10 == 1))) {
      pppppppiVar9 = pppppppiVar9 + 1;
    }
    if (local_524 == pppppppiVar11) {
      *param_1 = param_2;
      param_1[1] = param_3;
      goto LAB_00045268;
    }
  }
  __aeabi_memclr4(auStack_4c8,0x400);
  local_4d0 = &local_4cc;
  local_4cc = (int ******)0x0;
  local_510[0] = &local_c8;
  local_c8 = &local_4cc;
  if (local_20 != local_24) {
    if (pppppppiVar11 != local_524) {
      FUN_00045484(local_510,pppppppiVar11,local_524,auStack_18);
    }
    FUN_0005031c(local_510,((int)local_4d0 - (int)local_c8 >> 2) - uVar8,local_34,local_564,uVar5,
                 ppppppiVar4,0);
    pppppppiVar11 = local_c8;
    local_524 = local_4d0;
  }
  uVar12 = (int)local_524 - (int)pppppppiVar11;
  uVar13 = (int)uVar12 >> 2;
  uVar14 = uVar13 + 1;
  if (uVar8 == 0) {
    uVar14 = uVar13;
  }
  iVar10 = uVar14 + ((int)local_84 - (int)local_80 >> 2);
  uVar19 = *(uint *)(param_5 + 4) & 0x200;
  uVar14 = *(uint *)(param_5 + 0x1c);
  if (uVar19 != 0) {
    iVar10 = (local_3c - (int)local_38 >> 2) + iVar10;
  }
  if (param_4 == 1) {
    if (ppppppiVar23 == ppppppiVar4) {
      local_514 = (**(code **)(*piVar3 + 0x28))();
    }
    else {
      local_514 = (**(code **)(*piVar3 + 0x24))();
    }
  }
  else if (ppppppiVar23 == ppppppiVar4) {
    local_514 = (**(code **)(*piVar2 + 0x28))(piVar2);
  }
  else {
    local_514 = (**(code **)(*piVar2 + 0x24))(piVar2);
  }
  uVar15 = iVar10 + (uint)((local_514 & 0xff00) == 0x100 || (local_514 & 0xff0000) == 0x10000);
  iVar10 = uVar14 - uVar15;
  if (uVar14 <= uVar15) {
    iVar10 = 0;
  }
  uVar20 = *(uint *)(param_5 + 4);
  local_520 = param_3;
  if ((iVar10 != 0) && ((uVar20 & 5) == 0)) {
    uVar21 = param_3;
    if (0 < iVar10) {
      iVar24 = (uVar14 + 1) - uVar15;
      do {
        uVar16 = uVar21 & 0xff;
        uVar21 = 0;
        if (uVar16 != 0) {
          piVar1 = (int *)param_2[5];
          if (piVar1 < (int *)param_2[6]) {
            param_2[5] = (int)(piVar1 + 1);
            *piVar1 = param_6;
            iVar22 = param_6;
          }
          else {
            iVar22 = (**(code **)(*param_2 + 0x34))(param_2,param_6);
          }
          uVar21 = 1;
          if (iVar22 == -1) {
            uVar21 = 0;
          }
        }
        iVar24 = iVar24 + -1;
      } while (1 < iVar24);
    }
    local_520 = uVar21 & 0xff | param_3 & 0xffffff00;
  }
  uVar21 = (int)(local_524 + -uVar8) - (int)pppppppiVar11;
  iVar22 = (uVar12 >> 2) + 1;
  iVar24 = 0;
  do {
    uVar16 = local_520;
    switch(*(undefined1 *)((int)local_510 + iVar24 + -4)) {
    case 1:
      uVar16 = 0;
      if ((local_520 & 0xff) != 0) {
        piVar1 = (int *)param_2[5];
        if (piVar1 < (int *)param_2[6]) {
          param_2[5] = (int)(piVar1 + 1);
          *piVar1 = iVar6;
          iVar25 = iVar6;
        }
        else {
          iVar25 = (**(code **)(*param_2 + 0x34))(param_2,iVar6);
        }
        uVar16 = 1;
        if (iVar25 == -1) {
          uVar16 = 0;
        }
      }
      local_520 = local_520 & 0xffffff00 | uVar16;
    case 0:
      if (iVar10 != 0 && (uVar20 & 7) == 4) {
        iVar25 = (uVar14 + 1) - uVar15;
        uVar16 = local_520;
        uVar26 = local_520;
        if (0 < iVar10) {
          do {
            uVar16 = 0;
            if ((uVar26 & 0xff) != 0) {
              piVar1 = (int *)param_2[5];
              if (piVar1 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar1 + 1);
                *piVar1 = param_6;
                iVar17 = param_6;
              }
              else {
                iVar17 = (**(code **)(*param_2 + 0x34))(param_2,param_6);
              }
              uVar16 = 1;
              if (iVar17 == -1) {
                uVar16 = 0;
              }
            }
            iVar25 = iVar25 + -1;
            uVar26 = uVar16;
          } while (1 < iVar25);
        }
        local_520 = local_520 & 0xffffff00 | uVar16 & 0xff;
      }
      break;
    case 2:
      if (uVar19 != 0) {
        if (0 < local_3c - (int)local_38) {
          iVar25 = ((uint)(local_3c - (int)local_38) >> 2) + 1;
          uVar26 = local_520;
          piVar1 = local_38;
          do {
            uVar16 = 0;
            if ((uVar26 & 0xff) != 0) {
              iVar17 = *piVar1;
              piVar2 = (int *)param_2[5];
              if (piVar2 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar2 + 1);
                *piVar2 = iVar17;
              }
              else {
                iVar17 = (**(code **)(*param_2 + 0x34))(param_2);
              }
              uVar16 = 1;
              if (iVar17 == -1) {
                uVar16 = 0;
              }
            }
            iVar25 = iVar25 + -1;
            piVar1 = piVar1 + 1;
            uVar26 = uVar16;
          } while (1 < iVar25);
        }
LAB_00044f52:
        local_520 = local_520 & 0xffffff00 | uVar16 & 0xff;
      }
      break;
    case 3:
      if (local_80 != local_84) {
        uVar16 = 0;
        if ((local_520 & 0xff) != 0) {
          iVar25 = *local_80;
          piVar1 = (int *)param_2[5];
          if (piVar1 < (int *)param_2[6]) {
            param_2[5] = (int)(piVar1 + 1);
            *piVar1 = iVar25;
          }
          else {
            iVar25 = (**(code **)(*param_2 + 0x34))(param_2);
          }
          uVar16 = 1;
          if (iVar25 == -1) {
            uVar16 = 0;
          }
        }
        local_520 = local_520 & 0xffffff00 | uVar16;
      }
      break;
    case 4:
      if (uVar8 == 0) {
        iVar25 = iVar22;
        uVar26 = local_520;
        pppppppiVar9 = pppppppiVar11;
        if (0 < (int)uVar12) {
          do {
            uVar16 = 0;
            if ((uVar26 & 0xff) != 0) {
              ppppppiVar4 = *pppppppiVar9;
              piVar1 = (int *)param_2[5];
              if (piVar1 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar1 + 1);
                *piVar1 = (int)ppppppiVar4;
              }
              else {
                ppppppiVar4 = (int ******)(**(code **)(*param_2 + 0x34))(param_2);
              }
              uVar16 = 1;
              if (ppppppiVar4 == (int ******)0xffffffff) {
                uVar16 = 0;
              }
            }
            iVar25 = iVar25 + -1;
            uVar26 = uVar16;
            pppppppiVar9 = pppppppiVar9 + 1;
          } while (1 < iVar25);
        }
        goto LAB_00044f52;
      }
      if ((int)uVar8 < (int)uVar13) {
        iVar25 = (uVar21 >> 2) + 1;
        uVar26 = local_520;
        pppppppiVar9 = pppppppiVar11;
        if (0 < (int)uVar21) {
          do {
            uVar16 = 0;
            if ((uVar26 & 0xff) != 0) {
              ppppppiVar4 = *pppppppiVar9;
              piVar1 = (int *)param_2[5];
              if (piVar1 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar1 + 1);
                *piVar1 = (int)ppppppiVar4;
              }
              else {
                ppppppiVar4 = (int ******)(**(code **)(*param_2 + 0x34))(param_2);
              }
              uVar16 = 1;
              if (ppppppiVar4 == (int ******)0xffffffff) {
                uVar16 = 0;
              }
            }
            iVar25 = iVar25 + -1;
            uVar26 = uVar16;
            pppppppiVar9 = pppppppiVar9 + 1;
          } while (1 < iVar25);
        }
        bVar27 = 0;
        if ((uVar16 & 0xff) != 0) {
          piVar1 = (int *)param_2[5];
          if (piVar1 < (int *)param_2[6]) {
            param_2[5] = (int)(piVar1 + 1);
            *piVar1 = local_578;
            iVar25 = local_578;
          }
          else {
            iVar25 = (**(code **)(*param_2 + 0x34))(param_2,local_578);
          }
          bVar27 = 1;
          if (iVar25 == -1) {
            bVar27 = 0;
          }
        }
        iVar25 = (uVar8 & 0x3fffffff) + 1;
        pppppppiVar9 = local_524 + -uVar8;
        if (0 < (int)(uVar8 * 4)) {
          do {
            bVar28 = bVar27 != 0;
            bVar27 = 0;
            if (bVar28) {
              ppppppiVar4 = *pppppppiVar9;
              piVar1 = (int *)param_2[5];
              if (piVar1 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar1 + 1);
                *piVar1 = (int)ppppppiVar4;
              }
              else {
                ppppppiVar4 = (int ******)(**(code **)(*param_2 + 0x34))(param_2);
              }
              bVar27 = 1;
              if (ppppppiVar4 == (int ******)0xffffffff) {
                bVar27 = 0;
              }
            }
            iVar25 = iVar25 + -1;
            pppppppiVar9 = pppppppiVar9 + 1;
          } while (1 < iVar25);
        }
      }
      else {
        bVar27 = 0;
        if ((local_520 & 0xff) != 0) {
          piVar1 = (int *)param_2[5];
          if (piVar1 < (int *)param_2[6]) {
            param_2[5] = (int)(piVar1 + 1);
            *piVar1 = iVar7;
            iVar25 = iVar7;
          }
          else {
            iVar25 = (**(code **)(*param_2 + 0x34))(param_2,iVar7);
          }
          if (iVar25 != -1) {
            piVar1 = (int *)param_2[5];
            if (piVar1 < (int *)param_2[6]) {
              param_2[5] = (int)(piVar1 + 1);
              *piVar1 = local_578;
              iVar25 = local_578;
            }
            else {
              iVar25 = (**(code **)(*param_2 + 0x34))(param_2,local_578);
            }
            bVar27 = 1;
            if (iVar25 == -1) {
              bVar27 = 0;
            }
          }
        }
        iVar25 = uVar13 - uVar8;
        if (uVar8 != uVar13) {
          do {
            bVar28 = bVar27 != 0;
            bVar27 = 0;
            if (bVar28) {
              piVar1 = (int *)param_2[5];
              if (piVar1 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar1 + 1);
                *piVar1 = iVar7;
                iVar17 = iVar7;
              }
              else {
                iVar17 = (**(code **)(*param_2 + 0x34))(param_2,iVar7);
              }
              bVar27 = 1;
              if (iVar17 == -1) {
                bVar27 = 0;
              }
            }
            iVar25 = iVar25 + 1;
          } while (iVar25 != 0);
        }
        iVar25 = iVar22;
        pppppppiVar9 = pppppppiVar11;
        if (0 < (int)uVar12) {
          do {
            bVar28 = bVar27 != 0;
            bVar27 = 0;
            if (bVar28) {
              ppppppiVar4 = *pppppppiVar9;
              piVar1 = (int *)param_2[5];
              if (piVar1 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar1 + 1);
                *piVar1 = (int)ppppppiVar4;
              }
              else {
                ppppppiVar4 = (int ******)(**(code **)(*param_2 + 0x34))(param_2);
              }
              bVar27 = 1;
              if (ppppppiVar4 == (int ******)0xffffffff) {
                bVar27 = 0;
              }
            }
            iVar25 = iVar25 + -1;
            pppppppiVar9 = pppppppiVar9 + 1;
          } while (1 < iVar25);
        }
      }
      local_520 = local_520 & 0xffffff00;
      local_520 = local_520 | bVar27;
    }
    bVar28 = iVar24 < 3;
    iVar24 = iVar24 + 1;
  } while (bVar28);
  if (1 < (uint)((int)local_84 - (int)local_80 >> 2)) {
    piVar1 = local_80 + 1;
    uVar8 = local_520;
    if (0 < (int)local_84 - (int)piVar1) {
      iVar6 = ((uint)((int)local_84 - (int)piVar1) >> 2) + 1;
      uVar12 = local_520;
      do {
        uVar8 = 0;
        if ((uVar12 & 0xff) != 0) {
          iVar7 = *piVar1;
          piVar2 = (int *)param_2[5];
          if (piVar2 < (int *)param_2[6]) {
            param_2[5] = (int)(piVar2 + 1);
            *piVar2 = iVar7;
          }
          else {
            iVar7 = (**(code **)(*param_2 + 0x34))(param_2);
          }
          uVar8 = 1;
          if (iVar7 == -1) {
            uVar8 = 0;
          }
        }
        iVar6 = iVar6 + -1;
        piVar1 = piVar1 + 1;
        uVar12 = uVar8;
      } while (1 < iVar6);
    }
    local_520 = uVar8 & 0xff | local_520 & 0xffffff00;
  }
  if ((iVar10 != 0) && ((uVar20 & 6) == 0)) {
    uVar8 = local_520;
    if (0 < iVar10) {
      iVar6 = (uVar14 + 1) - uVar15;
      uVar14 = local_520;
      do {
        uVar8 = 0;
        if ((uVar14 & 0xff) != 0) {
          piVar1 = (int *)param_2[5];
          if (piVar1 < (int *)param_2[6]) {
            param_2[5] = (int)(piVar1 + 1);
            *piVar1 = param_6;
            iVar7 = param_6;
          }
          else {
            iVar7 = (**(code **)(*param_2 + 0x34))(param_2,param_6);
          }
          uVar8 = 1;
          if (iVar7 == -1) {
            uVar8 = 0;
          }
        }
        iVar6 = iVar6 + -1;
        uVar14 = uVar8;
      } while (1 < iVar6);
    }
    local_520 = uVar8 & 0xff | local_520 & 0xffffff00;
  }
  *param_1 = param_2;
  param_1[1] = local_520;
  if ((((undefined4 ********)local_c8 != local_510) && (local_c8 != (int *******)0x0)) &&
     (&local_4cc != local_c8)) {
    if ((uint)((int)local_510[0] - (int)local_c8) < 0x81) {
      std::__node_alloc::_M_deallocate(local_c8,(int)local_510[0] - (int)local_c8);
    }
    else {
      operator_delete(local_c8);
    }
  }
LAB_00045268:
  if (local_80 == local_c4) {
    FUN_00044a98();
    return;
  }
  if (local_80 != (int *)0x0) {
    uVar29 = CONCAT44(local_c4[0] - (int)local_80,local_80);
    if (0x80 < (uint)(local_c4[0] - (int)local_80)) {
      operator_delete(local_80);
      uVar29 = FUN_00044a98();
    }
    std::__node_alloc::_M_deallocate((void *)uVar29,(uint)((ulonglong)uVar29 >> 0x20));
    uVar5 = FUN_00044a98();
    if ((local_80 != local_c4) && (local_80 != (int *)0x0)) {
      if ((uint)(local_c4[0] - (int)local_80) < 0x81) {
        std::__node_alloc::_M_deallocate(local_80,local_c4[0] - (int)local_80);
      }
      else {
        operator_delete(local_80);
      }
    }
    if ((local_38 != local_7c) && (local_38 != (int *)0x0)) {
      if ((uint)(local_7c[0] - (int)local_38) < 0x81) {
        std::__node_alloc::_M_deallocate(local_38,local_7c[0] - (int)local_38);
      }
      else {
        operator_delete(local_38);
      }
    }
    if ((local_20 != local_34) && (local_20 != (int *)0x0)) {
      if ((uint)(local_34[0] - (int)local_20) < 0x81) {
        std::__node_alloc::_M_deallocate(local_20,local_34[0] - (int)local_20);
      }
      else {
        operator_delete(local_20);
      }
    }
    std::locale::~locale(alStack_1c);
                    /* WARNING: Subroutine does not return */
    ___Unwind_Resume(uVar5);
  }
  FUN_00044a98();
  return;
}



### FUNC FUN_00044a98 @ 00044a98

void FUN_00044a98(void)

{
  undefined1 *puVar1;
  int in_stack_00000060;
  int *in_stack_0000007c;
  
  puVar1 = *(undefined1 **)(in_stack_00000060 + 4);
  if ((puVar1 != &stack0x0000052c) && (puVar1 != (undefined1 *)0x0)) {
    if ((uint)(*in_stack_0000007c - (int)puVar1) < 0x81) {
      std::__node_alloc::_M_deallocate(puVar1,*in_stack_0000007c - (int)puVar1);
    }
    else {
      operator_delete(puVar1);
    }
  }
  puVar1 = (undefined1 *)in_stack_0000007c[0x17];
  if ((puVar1 != &stack0x00000574) && (puVar1 != (undefined1 *)0x0)) {
    if ((uint)(in_stack_0000007c[0x12] - (int)puVar1) < 0x81) {
      std::__node_alloc::_M_deallocate(puVar1,in_stack_0000007c[0x12] - (int)puVar1);
    }
    else {
      operator_delete(puVar1);
    }
  }
  std::locale::~locale((locale *)&stack0x0000058c);
  return;
}



### FUNC FUN_000453a0 @ 000453a0

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_000453a0(undefined4 param_1,int param_2,undefined4 param_3,undefined4 param_4)

{
  locale *this;
  undefined4 uVar1;
  undefined4 extraout_r1;
  locale alStack_134 [4];
  undefined1 *local_130 [4];
  undefined1 **local_120;
  undefined1 local_11c;
  undefined1 auStack_11b [256];
  undefined1 auStack_1b [3];
  undefined1 **local_18;
  
  __aeabi_memclr(auStack_11b,0x100);
  local_11c = 0;
  local_130[0] = auStack_1b;
  local_120 = (undefined1 **)&local_11c;
  local_18 = (undefined1 **)&local_11c;
  FUN_000517f8(local_130,extraout_r1,param_3,param_4);
  this = (locale *)std::locale::locale(alStack_134,(locale *)(param_2 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  std::locale::~locale(alStack_134);
  FUN_00051848(local_130,param_1,uVar1,0,0);
  if (((local_18 != local_130) && (local_18 != (undefined1 **)0x0)) &&
     ((undefined1 **)&local_11c != local_18)) {
    if (0x80 < (uint)((int)local_130[0] - (int)local_18)) {
      operator_delete(local_18);
      return;
    }
    std::__node_alloc::_M_deallocate(local_18,(int)local_130[0] - (int)local_18);
  }
  return;
}



### FUNC FUN_00045484 @ 00045484

int * FUN_00045484(int *param_1,int *param_2,int *param_3)

{
  int *piVar1;
  int iVar2;
  int *piVar3;
  int *piVar4;
  undefined4 uVar5;
  int *piVar6;
  uint uVar7;
  int *piVar8;
  uint uVar9;
  uint uVar10;
  int *piVar11;
  uint local_18;
  
  if (param_2 != param_3) {
    piVar6 = (int *)param_1[0x112];
    piVar1 = param_1 + 0x112;
    iVar2 = (int)param_3 - (int)param_2;
    uVar9 = iVar2 >> 2;
    if (piVar6 == param_1) {
      piVar3 = (int *)param_1[0x10];
      uVar7 = 0x10 - ((int)piVar3 - (int)param_1 >> 2);
    }
    else {
      piVar3 = (int *)param_1[0x10];
      uVar7 = *param_1 - (int)piVar3 >> 2;
    }
    piVar8 = param_1 + 0x10;
    if (uVar9 < uVar7) {
      piVar1 = param_2 + 1;
      *piVar3 = *param_2;
      if (piVar1 != param_3) {
        __aeabi_memcpy(piVar3 + 1,piVar1,(int)param_3 - (int)piVar1);
        piVar3 = (int *)*piVar8;
      }
      piVar3[uVar9] = 0;
      *piVar8 = (int)(piVar3 + uVar9);
    }
    else {
      uVar7 = (int)piVar3 - (int)piVar6 >> 2;
      if (0x3ffffffe - uVar7 < uVar9) {
                    /* WARNING: Subroutine does not return */
        std::__stl_throw_length_error("basic_string");
      }
      uVar10 = uVar7;
      if (uVar7 <= uVar9) {
        uVar10 = uVar9;
      }
      uVar10 = uVar7 + uVar10 + 1;
      uVar9 = 0x3ffffffe;
      if (uVar7 <= uVar10) {
        uVar9 = uVar10;
      }
      uVar7 = 0x3ffffffe;
      if (uVar10 < 0x3fffffff) {
        uVar7 = uVar9;
      }
      if (uVar7 >> 1 < 0x81) {
        piVar4 = param_1 + 0x11;
      }
      else {
        if (0x3fffffff < uVar7) {
          FUN_00030824(4);
          uVar5 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
          FUN_000309e0(uVar5,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
        }
        local_18 = uVar7 << 2;
        if (local_18 < 0x81) {
          piVar4 = (int *)std::__node_alloc::_M_allocate(&local_18);
        }
        else {
          piVar4 = (int *)operator_new(local_18);
        }
        piVar3 = (int *)*piVar8;
        piVar6 = (int *)*piVar1;
      }
      piVar11 = piVar4;
      if (piVar3 != piVar6) {
        __aeabi_memcpy(piVar4,piVar6,(int)piVar3 - (int)piVar6);
        piVar11 = (int *)((int)piVar4 + ((int)piVar3 - (int)piVar6));
      }
      __aeabi_memcpy(piVar11,param_2,iVar2);
      *(undefined4 *)((int)piVar11 + iVar2) = 0;
      piVar6 = (int *)*piVar1;
      if (((piVar6 != param_1) && (piVar6 != (int *)0x0)) && (param_1 + 0x11 != piVar6)) {
        if ((uint)(*param_1 - (int)piVar6) < 0x81) {
          std::__node_alloc::_M_deallocate(piVar6,*param_1 - (int)piVar6);
        }
        else {
          operator_delete(piVar6);
        }
      }
      *param_1 = (int)(piVar4 + uVar7);
      *piVar8 = (int)piVar11 + iVar2;
      *piVar1 = (int)piVar4;
    }
  }
  return param_1;
}



### FUNC FUN_000455e4 @ 000455e4

/* WARNING: Type propagation algorithm not settling */
/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_000455e4(undefined4 *param_1,int *param_2,uint param_3,int param_4,int param_5,int param_6,
                 int param_7,int param_8)

{
  locale *this;
  int *piVar1;
  int *piVar2;
  int *piVar3;
  int ******ppppppiVar4;
  undefined4 uVar5;
  int iVar6;
  int iVar7;
  uint uVar8;
  int *******pppppppiVar9;
  int iVar10;
  int *******pppppppiVar11;
  uint uVar12;
  uint uVar13;
  uint uVar14;
  uint uVar15;
  uint uVar16;
  int iVar17;
  int *******pppppppiVar18;
  uint uVar19;
  uint uVar20;
  uint uVar21;
  int iVar22;
  int ******ppppppiVar23;
  int iVar24;
  int iVar25;
  uint uVar26;
  byte bVar27;
  bool bVar28;
  int local_578;
  undefined4 local_564;
  int *******local_524;
  uint local_520;
  uint local_514;
  undefined4 *******local_510 [16];
  int *******local_4d0;
  int ******local_4cc;
  undefined1 auStack_4c8 [1024];
  int *******local_c8;
  int local_c4 [16];
  int *local_84;
  int *local_80;
  int local_7c [16];
  int local_3c;
  int *local_38;
  int local_34 [4];
  int *local_24;
  int *local_20;
  locale alStack_1c [4];
  undefined1 auStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_1c,(locale *)(param_5 + 0x20));
  piVar1 = (int *)std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  piVar2 = (int *)std::locale::_M_use_facet(alStack_1c,(id *)&std::moneypunct<wchar_t,false>::id);
  piVar3 = (int *)std::locale::_M_use_facet(alStack_1c,(id *)&std::moneypunct<wchar_t,true>::id);
  ppppppiVar4 = (int ******)(**(code **)(*piVar1 + 0x28))(piVar1,0x2d);
  uVar5 = (**(code **)(*piVar1 + 0x28))(piVar1,0x2b);
  iVar6 = (**(code **)(*piVar1 + 0x28))(piVar1,0x20);
  iVar7 = (**(code **)(*piVar1 + 0x28))(piVar1,0x30);
  if (param_4 == 1) {
    local_578 = (**(code **)(*piVar3 + 8))();
    local_564 = (**(code **)(*piVar3 + 0xc))();
    (**(code **)(*piVar3 + 0x10))(local_34);
    uVar8 = (**(code **)(*piVar3 + 0x20))(piVar3,*(code **)(*piVar3 + 0x20),local_34);
    (**(code **)(*piVar3 + 0x14))(local_7c,piVar3,*(code **)(*piVar3 + 0x14),local_34);
  }
  else {
    local_578 = (**(code **)(*piVar2 + 8))();
    local_564 = (**(code **)(*piVar2 + 0xc))();
    (**(code **)(*piVar2 + 0x10))(local_34);
    uVar8 = (**(code **)(*piVar2 + 0x20))(piVar2,*(code **)(*piVar2 + 0x20),local_34);
    (**(code **)(*piVar2 + 0x14))(local_7c,piVar2,*(code **)(*piVar2 + 0x14),local_34);
  }
  pppppppiVar18 = *(int ********)(param_7 + 0x40);
  pppppppiVar9 = *(int ********)(param_7 + 0x44);
  if (pppppppiVar9 == pppppppiVar18) {
    *param_1 = param_2;
    param_1[1] = param_3;
    if ((local_38 != local_7c) && (local_38 != (int *)0x0)) {
      if ((uint)(local_7c[0] - (int)local_38) < 0x81) {
        std::__node_alloc::_M_deallocate(local_38,local_7c[0] - (int)local_38);
      }
      else {
        operator_delete(local_38);
      }
    }
    if ((local_20 != local_34) && (local_20 != (int *)0x0)) {
      if ((uint)(local_34[0] - (int)local_20) < 0x81) {
        std::__node_alloc::_M_deallocate(local_20,local_34[0] - (int)local_20);
      }
      else {
        operator_delete(local_20);
      }
    }
    std::locale::~locale(alStack_1c);
    return;
  }
  ppppppiVar23 = *pppppppiVar9;
  pppppppiVar11 = pppppppiVar9 + 1;
  if (ppppppiVar23 != ppppppiVar4) {
    pppppppiVar11 = pppppppiVar9;
  }
  if (param_4 == 1) {
    if (ppppppiVar23 == ppppppiVar4) {
      (**(code **)(*piVar3 + 0x1c))(local_c4,piVar3);
    }
    else {
      (**(code **)(*piVar3 + 0x18))(local_c4,piVar3);
    }
  }
  else if (ppppppiVar23 == ppppppiVar4) {
    (**(code **)(*piVar2 + 0x1c))(local_c4);
  }
  else {
    (**(code **)(*piVar2 + 0x18))(local_c4);
  }
  local_524 = pppppppiVar18;
  pppppppiVar9 = pppppppiVar11;
  if (param_8 == 1) {
    while ((local_524 = pppppppiVar18, pppppppiVar9 != pppppppiVar18 &&
           (iVar10 = (**(code **)(*piVar1 + 8))(piVar1,0x40,*pppppppiVar9), local_524 = pppppppiVar9
           , iVar10 == 1))) {
      pppppppiVar9 = pppppppiVar9 + 1;
    }
    if (local_524 == pppppppiVar11) {
      *param_1 = param_2;
      param_1[1] = param_3;
      goto LAB_00045f22;
    }
  }
  __aeabi_memclr4(auStack_4c8,0x400);
  local_4cc = (int ******)0x0;
  local_510[0] = &local_c8;
  local_4d0 = &local_4cc;
  local_c8 = &local_4cc;
  if (local_20 != local_24) {
    if (pppppppiVar11 != local_524) {
      FUN_00045484(local_510,pppppppiVar11,local_524,auStack_18);
    }
    FUN_0005031c(local_510,((int)local_4d0 - (int)local_c8 >> 2) - uVar8,local_34,local_564,uVar5,
                 ppppppiVar4,0);
    pppppppiVar11 = local_c8;
    local_524 = local_4d0;
  }
  uVar12 = (int)local_524 - (int)pppppppiVar11;
  uVar13 = (int)uVar12 >> 2;
  uVar14 = uVar13 + 1;
  if (uVar8 == 0) {
    uVar14 = uVar13;
  }
  iVar10 = uVar14 + ((int)local_84 - (int)local_80 >> 2);
  uVar19 = *(uint *)(param_5 + 4) & 0x200;
  uVar14 = *(uint *)(param_5 + 0x1c);
  if (uVar19 != 0) {
    iVar10 = (local_3c - (int)local_38 >> 2) + iVar10;
  }
  if (param_4 == 1) {
    if (ppppppiVar23 == ppppppiVar4) {
      local_514 = (**(code **)(*piVar3 + 0x28))();
    }
    else {
      local_514 = (**(code **)(*piVar3 + 0x24))();
    }
  }
  else if (ppppppiVar23 == ppppppiVar4) {
    local_514 = (**(code **)(*piVar2 + 0x28))(piVar2);
  }
  else {
    local_514 = (**(code **)(*piVar2 + 0x24))(piVar2);
  }
  uVar15 = iVar10 + (uint)((local_514 & 0xff00) == 0x100 || (local_514 & 0xff0000) == 0x10000);
  iVar10 = uVar14 - uVar15;
  if (uVar14 <= uVar15) {
    iVar10 = 0;
  }
  uVar20 = *(uint *)(param_5 + 4);
  local_520 = param_3;
  if ((iVar10 != 0) && ((uVar20 & 5) == 0)) {
    uVar21 = param_3;
    if (0 < iVar10) {
      iVar24 = (uVar14 + 1) - uVar15;
      do {
        uVar16 = uVar21 & 0xff;
        uVar21 = 0;
        if (uVar16 != 0) {
          piVar1 = (int *)param_2[5];
          if (piVar1 < (int *)param_2[6]) {
            param_2[5] = (int)(piVar1 + 1);
            *piVar1 = param_6;
            iVar22 = param_6;
          }
          else {
            iVar22 = (**(code **)(*param_2 + 0x34))(param_2,param_6);
          }
          uVar21 = 1;
          if (iVar22 == -1) {
            uVar21 = 0;
          }
        }
        iVar24 = iVar24 + -1;
      } while (1 < iVar24);
    }
    local_520 = uVar21 & 0xff | param_3 & 0xffffff00;
  }
  uVar21 = (int)(local_524 + -uVar8) - (int)pppppppiVar11;
  iVar22 = (uVar12 >> 2) + 1;
  iVar24 = 0;
  do {
    uVar16 = local_520;
    switch(*(undefined1 *)((int)local_510 + iVar24 + -4)) {
    case 1:
      uVar16 = 0;
      if ((local_520 & 0xff) != 0) {
        piVar1 = (int *)param_2[5];
        if (piVar1 < (int *)param_2[6]) {
          param_2[5] = (int)(piVar1 + 1);
          *piVar1 = iVar6;
          iVar25 = iVar6;
        }
        else {
          iVar25 = (**(code **)(*param_2 + 0x34))(param_2,iVar6);
        }
        uVar16 = 1;
        if (iVar25 == -1) {
          uVar16 = 0;
        }
      }
      local_520 = local_520 & 0xffffff00 | uVar16;
    case 0:
      if (iVar10 != 0 && (uVar20 & 7) == 4) {
        iVar25 = (uVar14 + 1) - uVar15;
        uVar16 = local_520;
        uVar26 = local_520;
        if (0 < iVar10) {
          do {
            uVar16 = 0;
            if ((uVar26 & 0xff) != 0) {
              piVar1 = (int *)param_2[5];
              if (piVar1 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar1 + 1);
                *piVar1 = param_6;
                iVar17 = param_6;
              }
              else {
                iVar17 = (**(code **)(*param_2 + 0x34))(param_2,param_6);
              }
              uVar16 = 1;
              if (iVar17 == -1) {
                uVar16 = 0;
              }
            }
            iVar25 = iVar25 + -1;
            uVar26 = uVar16;
          } while (1 < iVar25);
        }
        local_520 = local_520 & 0xffffff00 | uVar16 & 0xff;
      }
      break;
    case 2:
      if (uVar19 != 0) {
        if (0 < local_3c - (int)local_38) {
          iVar25 = ((uint)(local_3c - (int)local_38) >> 2) + 1;
          uVar26 = local_520;
          piVar1 = local_38;
          do {
            uVar16 = 0;
            if ((uVar26 & 0xff) != 0) {
              iVar17 = *piVar1;
              piVar2 = (int *)param_2[5];
              if (piVar2 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar2 + 1);
                *piVar2 = iVar17;
              }
              else {
                iVar17 = (**(code **)(*param_2 + 0x34))(param_2);
              }
              uVar16 = 1;
              if (iVar17 == -1) {
                uVar16 = 0;
              }
            }
            iVar25 = iVar25 + -1;
            piVar1 = piVar1 + 1;
            uVar26 = uVar16;
          } while (1 < iVar25);
        }
LAB_00045c0a:
        local_520 = local_520 & 0xffffff00 | uVar16 & 0xff;
      }
      break;
    case 3:
      if (local_80 != local_84) {
        uVar16 = 0;
        if ((local_520 & 0xff) != 0) {
          iVar25 = *local_80;
          piVar1 = (int *)param_2[5];
          if (piVar1 < (int *)param_2[6]) {
            param_2[5] = (int)(piVar1 + 1);
            *piVar1 = iVar25;
          }
          else {
            iVar25 = (**(code **)(*param_2 + 0x34))(param_2);
          }
          uVar16 = 1;
          if (iVar25 == -1) {
            uVar16 = 0;
          }
        }
        local_520 = local_520 & 0xffffff00 | uVar16;
      }
      break;
    case 4:
      if (uVar8 == 0) {
        iVar25 = iVar22;
        uVar26 = local_520;
        pppppppiVar9 = pppppppiVar11;
        if (0 < (int)uVar12) {
          do {
            uVar16 = 0;
            if ((uVar26 & 0xff) != 0) {
              ppppppiVar4 = *pppppppiVar9;
              piVar1 = (int *)param_2[5];
              if (piVar1 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar1 + 1);
                *piVar1 = (int)ppppppiVar4;
              }
              else {
                ppppppiVar4 = (int ******)(**(code **)(*param_2 + 0x34))(param_2);
              }
              uVar16 = 1;
              if (ppppppiVar4 == (int ******)0xffffffff) {
                uVar16 = 0;
              }
            }
            iVar25 = iVar25 + -1;
            uVar26 = uVar16;
            pppppppiVar9 = pppppppiVar9 + 1;
          } while (1 < iVar25);
        }
        goto LAB_00045c0a;
      }
      if ((int)uVar8 < (int)uVar13) {
        iVar25 = (uVar21 >> 2) + 1;
        uVar26 = local_520;
        pppppppiVar9 = pppppppiVar11;
        if (0 < (int)uVar21) {
          do {
            uVar16 = 0;
            if ((uVar26 & 0xff) != 0) {
              ppppppiVar4 = *pppppppiVar9;
              piVar1 = (int *)param_2[5];
              if (piVar1 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar1 + 1);
                *piVar1 = (int)ppppppiVar4;
              }
              else {
                ppppppiVar4 = (int ******)(**(code **)(*param_2 + 0x34))(param_2);
              }
              uVar16 = 1;
              if (ppppppiVar4 == (int ******)0xffffffff) {
                uVar16 = 0;
              }
            }
            iVar25 = iVar25 + -1;
            uVar26 = uVar16;
            pppppppiVar9 = pppppppiVar9 + 1;
          } while (1 < iVar25);
        }
        bVar27 = 0;
        if ((uVar16 & 0xff) != 0) {
          piVar1 = (int *)param_2[5];
          if (piVar1 < (int *)param_2[6]) {
            param_2[5] = (int)(piVar1 + 1);
            *piVar1 = local_578;
            iVar25 = local_578;
          }
          else {
            iVar25 = (**(code **)(*param_2 + 0x34))(param_2,local_578);
          }
          bVar27 = 1;
          if (iVar25 == -1) {
            bVar27 = 0;
          }
        }
        iVar25 = (uVar8 & 0x3fffffff) + 1;
        pppppppiVar9 = local_524 + -uVar8;
        if (0 < (int)(uVar8 * 4)) {
          do {
            bVar28 = bVar27 != 0;
            bVar27 = 0;
            if (bVar28) {
              ppppppiVar4 = *pppppppiVar9;
              piVar1 = (int *)param_2[5];
              if (piVar1 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar1 + 1);
                *piVar1 = (int)ppppppiVar4;
              }
              else {
                ppppppiVar4 = (int ******)(**(code **)(*param_2 + 0x34))(param_2);
              }
              bVar27 = 1;
              if (ppppppiVar4 == (int ******)0xffffffff) {
                bVar27 = 0;
              }
            }
            iVar25 = iVar25 + -1;
            pppppppiVar9 = pppppppiVar9 + 1;
          } while (1 < iVar25);
        }
      }
      else {
        bVar27 = 0;
        if ((local_520 & 0xff) != 0) {
          piVar1 = (int *)param_2[5];
          if (piVar1 < (int *)param_2[6]) {
            param_2[5] = (int)(piVar1 + 1);
            *piVar1 = iVar7;
            iVar25 = iVar7;
          }
          else {
            iVar25 = (**(code **)(*param_2 + 0x34))(param_2,iVar7);
          }
          if (iVar25 != -1) {
            piVar1 = (int *)param_2[5];
            if (piVar1 < (int *)param_2[6]) {
              param_2[5] = (int)(piVar1 + 1);
              *piVar1 = local_578;
              iVar25 = local_578;
            }
            else {
              iVar25 = (**(code **)(*param_2 + 0x34))(param_2,local_578);
            }
            bVar27 = 1;
            if (iVar25 == -1) {
              bVar27 = 0;
            }
          }
        }
        iVar25 = uVar13 - uVar8;
        if (uVar8 != uVar13) {
          do {
            bVar28 = bVar27 != 0;
            bVar27 = 0;
            if (bVar28) {
              piVar1 = (int *)param_2[5];
              if (piVar1 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar1 + 1);
                *piVar1 = iVar7;
                iVar17 = iVar7;
              }
              else {
                iVar17 = (**(code **)(*param_2 + 0x34))(param_2,iVar7);
              }
              bVar27 = 1;
              if (iVar17 == -1) {
                bVar27 = 0;
              }
            }
            iVar25 = iVar25 + 1;
          } while (iVar25 != 0);
        }
        iVar25 = iVar22;
        pppppppiVar9 = pppppppiVar11;
        if (0 < (int)uVar12) {
          do {
            bVar28 = bVar27 != 0;
            bVar27 = 0;
            if (bVar28) {
              ppppppiVar4 = *pppppppiVar9;
              piVar1 = (int *)param_2[5];
              if (piVar1 < (int *)param_2[6]) {
                param_2[5] = (int)(piVar1 + 1);
                *piVar1 = (int)ppppppiVar4;
              }
              else {
                ppppppiVar4 = (int ******)(**(code **)(*param_2 + 0x34))(param_2);
              }
              bVar27 = 1;
              if (ppppppiVar4 == (int ******)0xffffffff) {
                bVar27 = 0;
              }
            }
            iVar25 = iVar25 + -1;
            pppppppiVar9 = pppppppiVar9 + 1;
          } while (1 < iVar25);
        }
      }
      local_520 = local_520 & 0xffffff00;
      local_520 = local_520 | bVar27;
    }
    bVar28 = iVar24 < 3;
    iVar24 = iVar24 + 1;
  } while (bVar28);
  if (1 < (uint)((int)local_84 - (int)local_80 >> 2)) {
    piVar1 = local_80 + 1;
    uVar8 = local_520;
    if (0 < (int)local_84 - (int)piVar1) {
      iVar6 = ((uint)((int)local_84 - (int)piVar1) >> 2) + 1;
      uVar12 = local_520;
      do {
        uVar8 = 0;
        if ((uVar12 & 0xff) != 0) {
          iVar7 = *piVar1;
          piVar2 = (int *)param_2[5];
          if (piVar2 < (int *)param_2[6]) {
            param_2[5] = (int)(piVar2 + 1);
            *piVar2 = iVar7;
          }
          else {
            iVar7 = (**(code **)(*param_2 + 0x34))(param_2);
          }
          uVar8 = 1;
          if (iVar7 == -1) {
            uVar8 = 0;
          }
        }
        iVar6 = iVar6 + -1;
        piVar1 = piVar1 + 1;
        uVar12 = uVar8;
      } while (1 < iVar6);
    }
    local_520 = uVar8 & 0xff | local_520 & 0xffffff00;
  }
  if ((iVar10 != 0) && ((uVar20 & 6) == 0)) {
    uVar8 = local_520;
    if (0 < iVar10) {
      iVar6 = (uVar14 + 1) - uVar15;
      uVar14 = local_520;
      do {
        uVar8 = 0;
        if ((uVar14 & 0xff) != 0) {
          piVar1 = (int *)param_2[5];
          if (piVar1 < (int *)param_2[6]) {
            param_2[5] = (int)(piVar1 + 1);
            *piVar1 = param_6;
            iVar7 = param_6;
          }
          else {
            iVar7 = (**(code **)(*param_2 + 0x34))(param_2,param_6);
          }
          uVar8 = 1;
          if (iVar7 == -1) {
            uVar8 = 0;
          }
        }
        iVar6 = iVar6 + -1;
        uVar14 = uVar8;
      } while (1 < iVar6);
    }
    local_520 = uVar8 & 0xff | local_520 & 0xffffff00;
  }
  *param_1 = param_2;
  param_1[1] = local_520;
  if ((((undefined4 ********)local_c8 != local_510) && (local_c8 != (int *******)0x0)) &&
     (&local_4cc != local_c8)) {
    if ((uint)((int)local_510[0] - (int)local_c8) < 0x81) {
      std::__node_alloc::_M_deallocate(local_c8,(int)local_510[0] - (int)local_c8);
    }
    else {
      operator_delete(local_c8);
    }
  }
LAB_00045f22:
  if (local_80 == local_c4) {
    FUN_00045758();
    return;
  }
  if (local_80 != (int *)0x0) {
    if ((uint)(local_c4[0] - (int)local_80) < 0x81) {
      std::__node_alloc::_M_deallocate(local_80,local_c4[0] - (int)local_80);
      uVar5 = FUN_00045758();
      if ((local_80 != local_c4) && (local_80 != (int *)0x0)) {
        if ((uint)(local_c4[0] - (int)local_80) < 0x81) {
          std::__node_alloc::_M_deallocate(local_80,local_c4[0] - (int)local_80);
        }
        else {
          operator_delete(local_80);
        }
      }
      if ((local_38 != local_7c) && (local_38 != (int *)0x0)) {
        if ((uint)(local_7c[0] - (int)local_38) < 0x81) {
          std::__node_alloc::_M_deallocate(local_38,local_7c[0] - (int)local_38);
        }
        else {
          operator_delete(local_38);
        }
      }
      if ((local_20 != local_34) && (local_20 != (int *)0x0)) {
        if ((uint)(local_34[0] - (int)local_20) < 0x81) {
          std::__node_alloc::_M_deallocate(local_20,local_34[0] - (int)local_20);
        }
        else {
          operator_delete(local_20);
        }
      }
      std::locale::~locale(alStack_1c);
                    /* WARNING: Subroutine does not return */
      ___Unwind_Resume(uVar5);
    }
    operator_delete(local_80);
    FUN_00045758();
    return;
  }
  FUN_00045758();
  return;
}



### FUNC FUN_00045758 @ 00045758

void FUN_00045758(void)

{
  undefined1 *puVar1;
  int *unaff_r4;
  
  puVar1 = (undefined1 *)unaff_r4[0x11];
  if ((puVar1 != &stack0x0000052c) && (puVar1 != (undefined1 *)0x0)) {
    if ((uint)(*unaff_r4 - (int)puVar1) < 0x81) {
      std::__node_alloc::_M_deallocate(puVar1,*unaff_r4 - (int)puVar1);
    }
    else {
      operator_delete(puVar1);
    }
  }
  puVar1 = (undefined1 *)unaff_r4[0x17];
  if ((puVar1 != &stack0x00000574) && (puVar1 != (undefined1 *)0x0)) {
    if ((uint)(unaff_r4[0x12] - (int)puVar1) < 0x81) {
      std::__node_alloc::_M_deallocate(puVar1,unaff_r4[0x12] - (int)puVar1);
    }
    else {
      operator_delete(puVar1);
    }
  }
  std::locale::~locale((locale *)&stack0x0000058c);
  return;
}



### FUNC FUN_0004605c @ 0004605c

void FUN_0004605c(facet *param_1)

{
  std::locale::facet::~facet(param_1);
  operator_delete(param_1);
  return;
}



### FUNC FUN_000460f4 @ 000460f4

void FUN_000460f4(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9,undefined4 param_10,undefined4 param_11)

{
  undefined4 local_20;
  undefined4 local_1c;
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_c = param_5;
  local_1c = param_7;
  local_18 = param_8;
  local_20 = param_6;
  local_14 = param_3;
  local_10 = param_4;
  FUN_00046654(param_1,&local_14,&local_20,param_9,param_10,param_11,0);
  return;
}



### FUNC FUN_0004612a @ 0004612a

void FUN_0004612a(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9,undefined4 param_10,undefined4 param_11)

{
  undefined4 local_20;
  undefined4 local_1c;
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_c = param_5;
  local_1c = param_7;
  local_18 = param_8;
  local_20 = param_6;
  local_14 = param_3;
  local_10 = param_4;
  FUN_00046e7c(param_1,&local_14,&local_20,param_9,param_10,param_11,0);
  return;
}



### FUNC FUN_00046160 @ 00046160

void FUN_00046160(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9,undefined4 param_10,undefined4 param_11)

{
  undefined4 local_20;
  undefined4 local_1c;
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_c = param_5;
  local_1c = param_7;
  local_18 = param_8;
  local_20 = param_6;
  local_14 = param_3;
  local_10 = param_4;
  FUN_00047274(param_1,&local_14,&local_20,param_9,param_10,param_11,0);
  return;
}



### FUNC FUN_00046196 @ 00046196

void FUN_00046196(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9,undefined4 param_10,undefined4 param_11)

{
  undefined4 local_20;
  undefined4 local_1c;
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_c = param_5;
  local_1c = param_7;
  local_18 = param_8;
  local_20 = param_6;
  local_14 = param_3;
  local_10 = param_4;
  FUN_00047664(param_1,&local_14,&local_20,param_9,param_10,param_11,0);
  return;
}



### FUNC FUN_000461cc @ 000461cc

void FUN_000461cc(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9,undefined4 param_10,undefined4 param_11)

{
  undefined4 local_20;
  undefined4 local_1c;
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_c = param_5;
  local_1c = param_7;
  local_18 = param_8;
  local_20 = param_6;
  local_14 = param_3;
  local_10 = param_4;
  FUN_00047a54(param_1,&local_14,&local_20,param_9,param_10,param_11,0);
  return;
}



### FUNC FUN_00046202 @ 00046202

void FUN_00046202(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9,undefined4 param_10,undefined4 param_11)

{
  undefined4 local_20;
  undefined4 local_1c;
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_c = param_5;
  local_1c = param_7;
  local_18 = param_8;
  local_20 = param_6;
  local_14 = param_3;
  local_10 = param_4;
  FUN_000482e4(param_1,&local_14,&local_20,param_9,param_10,param_11,0);
  return;
}



### FUNC FUN_00046238 @ 00046238

void FUN_00046238(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9,byte *param_10,undefined4 *param_11)

{
  undefined4 local_30 [2];
  undefined4 local_28;
  undefined4 local_24;
  undefined4 local_20;
  undefined4 local_1c;
  undefined4 local_18;
  undefined4 local_14;
  
  local_14 = param_5;
  local_24 = param_7;
  local_20 = param_8;
  local_28 = param_6;
  local_1c = param_3;
  local_18 = param_4;
  FUN_0004845c(param_1,&local_1c,&local_28,param_9,param_10,local_30,0);
  if (-1 < (int)((uint)*param_10 << 0x1d)) {
    *param_11 = local_30[0];
  }
  return;
}



### FUNC FUN_0004627a @ 0004627a

void FUN_0004627a(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9,undefined4 param_10,undefined4 param_11)

{
  undefined4 local_20;
  undefined4 local_1c;
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_c = param_5;
  local_1c = param_7;
  local_18 = param_8;
  local_20 = param_6;
  local_14 = param_3;
  local_10 = param_4;
  FUN_000488bc(param_1,&local_14,&local_20,param_9,param_10,param_11,0);
  return;
}



### FUNC FUN_000462b0 @ 000462b0

void FUN_000462b0(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9,undefined4 param_10,undefined4 param_11)

{
  undefined4 local_20;
  undefined4 local_1c;
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_c = param_5;
  local_1c = param_7;
  local_18 = param_8;
  local_20 = param_6;
  local_14 = param_3;
  local_10 = param_4;
  FUN_00048a34(param_1,&local_14,&local_20,param_9,param_10,param_11,0);
  return;
}



### FUNC FUN_000462e6 @ 000462e6

void FUN_000462e6(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9,undefined4 param_10,undefined4 param_11)

{
  undefined4 local_20;
  undefined4 local_1c;
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;
  
  local_c = param_5;
  local_1c = param_7;
  local_18 = param_8;
  local_20 = param_6;
  local_14 = param_3;
  local_10 = param_4;
  FUN_0004845c(param_1,&local_14,&local_20,param_9,param_10,param_11,0);
  return;
}



### FUNC FUN_0004631c @ 0004631c

void FUN_0004631c(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined4 param_6)

{
  bool bVar1;
  bool bVar2;
  locale *this;
  int *piVar3;
  int iVar4;
  int iVar5;
  bool bVar6;
  bool bVar7;
  uint uVar8;
  uint uVar9;
  char cVar10;
  int local_a4 [16];
  int local_64;
  int *local_60;
  int local_5c [16];
  int local_1c;
  int *local_18;
  
  this = (locale *)std::locale::locale((locale *)local_5c,(locale *)(param_4 + 0x20));
  piVar3 = (int *)std::locale::_M_use_facet(this,(id *)&std::numpunct<wchar_t>::id);
  std::locale::~locale((locale *)local_5c);
  (**(code **)(*piVar3 + 0x14))(local_5c,piVar3);
  (**(code **)(*piVar3 + 0x18))(local_a4,piVar3);
  cVar10 = *(char *)((int)param_2 + 9);
  bVar1 = true;
  uVar9 = 0;
  bVar7 = true;
  while( true ) {
    piVar3 = (int *)*param_2;
    if ((piVar3 != (int *)0x0) && (cVar10 == '\0')) {
      if ((int *)piVar3[2] < (int *)piVar3[3]) {
        iVar4 = *(int *)piVar3[2];
      }
      else {
        iVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      param_2[1] = iVar4;
      *(undefined1 *)((int)param_2 + 9) = 1;
      *(bool *)(param_2 + 2) = iVar4 == -1;
    }
    piVar3 = (int *)*param_3;
    if ((piVar3 == (int *)0x0) || (*(char *)((int)param_3 + 9) != '\0')) {
      cVar10 = (char)param_3[2];
    }
    else {
      if ((int *)piVar3[2] < (int *)piVar3[3]) {
        iVar4 = *(int *)piVar3[2];
      }
      else {
        iVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      param_3[1] = iVar4;
      *(undefined1 *)((int)param_3 + 9) = 1;
      cVar10 = iVar4 == -1;
      *(char *)(param_3 + 2) = cVar10;
    }
    if ((char)param_2[2] == cVar10) goto code_r0x000464b6;
    if (*(char *)((int)param_2 + 9) == '\0') {
      piVar3 = (int *)*param_2;
      if ((int *)piVar3[2] < (int *)piVar3[3]) {
        iVar4 = *(int *)piVar3[2];
      }
      else {
        iVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      param_2[1] = iVar4;
      *(undefined1 *)((int)param_2 + 9) = 1;
      *(bool *)(param_2 + 2) = iVar4 == -1;
    }
    else {
      iVar4 = param_2[1];
    }
    bVar6 = false;
    if ((bVar1) && (bVar6 = true, iVar4 != local_18[uVar9])) {
      bVar6 = false;
    }
    bVar1 = bVar6;
    bVar6 = false;
    if ((bVar7) && (bVar6 = true, iVar4 != local_60[uVar9])) {
      bVar6 = false;
    }
    uVar8 = uVar9 + 1;
    bVar2 = false;
    bVar7 = false;
    if (!(bool)(bVar1 | bVar6)) goto LAB_000464ca;
    if ((bVar1) && ((uint)(local_1c - (int)local_18 >> 2) <= uVar8)) break;
    if ((bVar6) && (bVar2 = bVar1, bVar7 = true, (uint)(local_64 - (int)local_60 >> 2) <= uVar8))
    goto LAB_000464ca;
    piVar3 = (int *)*param_2;
    if ((uint)piVar3[2] < (uint)piVar3[3]) {
      piVar3[2] = piVar3[2] + 4;
    }
    else {
      (**(code **)(*piVar3 + 0x24))();
    }
    cVar10 = '\0';
    *(undefined1 *)((int)param_2 + 9) = 0;
    uVar9 = uVar8;
    bVar7 = bVar6;
  }
  bVar2 = true;
  bVar7 = bVar6;
LAB_000464ca:
  uVar9 = uVar9 + 1;
  piVar3 = (int *)*param_2;
  if ((uint)piVar3[2] < (uint)piVar3[3]) {
    piVar3[2] = piVar3[2] + 4;
  }
  else {
    (**(code **)(*piVar3 + 0x24))();
  }
  *(undefined1 *)((int)param_2 + 9) = 0;
  bVar1 = bVar2;
code_r0x000464b6:
  bVar1 = bVar1 && (uint)(local_1c - (int)local_18 >> 2) <= uVar9;
  bVar6 = false;
  if ((bVar7) && (bVar6 = true, uVar9 < (uint)(local_64 - (int)local_60 >> 2))) {
    bVar6 = false;
  }
  if ((bVar1) || (bVar6)) {
    *param_5 = 0;
    *(bool *)param_6 = bVar1;
  }
  else {
    *param_5 = 4;
  }
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    *param_5 = *param_5 | 2;
  }
  iVar4 = param_2[1];
  iVar5 = param_2[2];
  *param_1 = *param_2;
  param_1[1] = iVar4;
  param_1[2] = iVar5;
  if ((local_60 != local_a4) && (local_60 != (int *)0x0)) {
    if ((uint)(local_a4[0] - (int)local_60) < 0x81) {
      std::__node_alloc::_M_deallocate(local_60,local_a4[0] - (int)local_60);
    }
    else {
      operator_delete(local_60);
    }
  }
  if ((local_18 != local_5c) && (local_18 != (int *)0x0)) {
    if (0x80 < (uint)(local_5c[0] - (int)local_18)) {
      operator_delete(local_18);
      return;
    }
    std::__node_alloc::_M_deallocate(local_18,local_5c[0] - (int)local_18);
  }
  return;
}



### FUNC FUN_00046654 @ 00046654

void FUN_00046654(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined4 *param_6)

{
  locale *this;
  undefined4 uVar1;
  uint uVar2;
  int *piVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  undefined1 auStack_34 [4];
  int local_30 [5];
  int *local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  uVar2 = FUN_00046858(param_2,param_3,*(undefined4 *)(param_4 + 4),uVar1);
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    uVar5 = 4;
    if ((uVar2 & 1) != 0) {
      uVar5 = 0;
      *param_6 = 0;
    }
  }
  else {
    piVar3 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<wchar_t>::id);
    uVar1 = (**(code **)(*piVar3 + 0xc))(piVar3);
    (**(code **)(*piVar3 + 0x10))(local_30,piVar3);
    iVar4 = FUN_00046c84(param_2,param_3,(int)uVar2 >> 2,param_6,uVar2 & 1,(uVar2 & 2) != 0,uVar1,
                         local_30,auStack_34);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
        std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      }
      else {
        operator_delete(local_1c);
      }
    }
    uVar5 = 0;
    if (iVar4 == 0) {
      uVar5 = 4;
    }
  }
  *param_5 = uVar5;
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    *param_5 = *param_5 | 2;
  }
  iVar4 = param_2[1];
  iVar6 = param_2[2];
  *param_1 = *param_2;
  param_1[1] = iVar4;
  param_1[2] = iVar6;
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00046858 @ 00046858

uint FUN_00046858(int *param_1,int *param_2,uint param_3,int *param_4)

{
  bool bVar1;
  undefined4 uVar2;
  int iVar3;
  int *piVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  int local_28;
  int local_24;
  int local_20;
  int local_1c;
  int local_18;
  
  uVar2 = std::priv::__narrow_atoms();
  iVar3 = std::priv::__narrow_atoms();
  (**(code **)(*param_4 + 0x2c))(param_4,uVar2,iVar3 + 5,&local_28);
  if (*(char *)((int)param_1 + 9) == '\0') {
    piVar4 = (int *)*param_1;
    if ((int *)piVar4[2] < (int *)piVar4[3]) {
      iVar3 = *(int *)piVar4[2];
    }
    else {
      iVar3 = (**(code **)(*piVar4 + 0x20))();
    }
    param_1[1] = iVar3;
    *(undefined1 *)((int)param_1 + 9) = 1;
    *(bool *)(param_1 + 2) = iVar3 == -1;
  }
  else {
    iVar3 = param_1[1];
  }
  if (iVar3 == local_24) {
    piVar4 = (int *)*param_1;
    if ((uint)piVar4[2] < (uint)piVar4[3]) {
      piVar4[2] = piVar4[2] + 4;
      uVar5 = 2;
    }
    else {
      (**(code **)(*piVar4 + 0x24))();
      uVar5 = 2;
    }
LAB_000468f8:
    bVar1 = false;
    *(undefined1 *)((int)param_1 + 9) = 0;
  }
  else {
    uVar5 = 0;
    bVar1 = true;
    if (iVar3 == local_28) {
      piVar4 = (int *)*param_1;
      if ((uint)piVar4[2] < (uint)piVar4[3]) {
        piVar4[2] = piVar4[2] + 4;
      }
      else {
        (**(code **)(*piVar4 + 0x24))();
      }
      uVar5 = 0;
      goto LAB_000468f8;
    }
  }
  param_3 = param_3 & 0x38;
  uVar6 = 0;
  if (param_3 == 0x20) {
    uVar7 = 0x20;
    goto LAB_00046c7a;
  }
  if (param_3 != 0x10) {
    if (param_3 == 8) {
      uVar7 = 0x28;
      goto LAB_00046c7a;
    }
    piVar4 = (int *)*param_1;
    if ((piVar4 != (int *)0x0) && (!bVar1)) {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar3 = *(int *)piVar4[2];
      }
      else {
        iVar3 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = iVar3;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar3 == -1;
    }
    piVar4 = (int *)*param_2;
    if ((piVar4 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar3 = *(int *)piVar4[2];
      }
      else {
        iVar3 = (**(code **)(*piVar4 + 0x20))();
      }
      param_2[1] = iVar3;
      *(undefined1 *)((int)param_2 + 9) = 1;
      *(bool *)(param_2 + 2) = iVar3 == -1;
    }
    uVar7 = 0x28;
    if ((char)param_1[2] == (char)param_2[2]) goto LAB_00046c7a;
    if (*(char *)((int)param_1 + 9) == '\0') {
      piVar4 = (int *)*param_1;
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar3 = *(int *)piVar4[2];
      }
      else {
        iVar3 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = iVar3;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar3 == -1;
    }
    else {
      iVar3 = param_1[1];
    }
    if (iVar3 != local_20) goto LAB_00046c7a;
    piVar4 = (int *)*param_1;
    if ((uint)piVar4[2] < (uint)piVar4[3]) {
      piVar4[2] = piVar4[2] + 4;
      *(undefined1 *)((int)param_1 + 9) = 0;
LAB_00046b1e:
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar3 = *(int *)piVar4[2];
      }
      else {
        iVar3 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = iVar3;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar3 == -1;
    }
    else {
      (**(code **)(*piVar4 + 0x24))();
      *(undefined1 *)((int)param_1 + 9) = 0;
      piVar4 = (int *)*param_1;
      if (piVar4 != (int *)0x0) goto LAB_00046b1e;
    }
    piVar4 = (int *)*param_2;
    if ((piVar4 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar3 = *(int *)piVar4[2];
      }
      else {
        iVar3 = (**(code **)(*piVar4 + 0x20))();
      }
      param_2[1] = iVar3;
      *(undefined1 *)((int)param_2 + 9) = 1;
      *(bool *)(param_2 + 2) = iVar3 == -1;
    }
    uVar6 = 1;
    if ((char)param_1[2] == (char)param_2[2]) {
      uVar7 = 0x20;
    }
    else {
      if (*(char *)((int)param_1 + 9) == '\0') {
        piVar4 = (int *)*param_1;
        if ((int *)piVar4[2] < (int *)piVar4[3]) {
          iVar3 = *(int *)piVar4[2];
        }
        else {
          iVar3 = (**(code **)(*piVar4 + 0x20))();
        }
        param_1[1] = iVar3;
        *(undefined1 *)((int)param_1 + 9) = 1;
        *(bool *)(param_1 + 2) = iVar3 == -1;
      }
      else {
        iVar3 = param_1[1];
      }
      if ((iVar3 == local_1c) || (uVar7 = 0x20, iVar3 == local_18)) {
        piVar4 = (int *)*param_1;
        if ((uint)piVar4[2] < (uint)piVar4[3]) {
          piVar4[2] = piVar4[2] + 4;
        }
        else {
          (**(code **)(*piVar4 + 0x24))();
        }
        uVar6 = 0;
        *(undefined1 *)((int)param_1 + 9) = 0;
        uVar7 = 0x40;
      }
    }
    goto LAB_00046c7a;
  }
  piVar4 = (int *)*param_1;
  if ((piVar4 != (int *)0x0) && (!bVar1)) {
    if ((int *)piVar4[2] < (int *)piVar4[3]) {
      iVar3 = *(int *)piVar4[2];
    }
    else {
      iVar3 = (**(code **)(*piVar4 + 0x20))();
    }
    param_1[1] = iVar3;
    *(undefined1 *)((int)param_1 + 9) = 1;
    *(bool *)(param_1 + 2) = iVar3 == -1;
  }
  piVar4 = (int *)*param_2;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar4[2] < (int *)piVar4[3]) {
      iVar3 = *(int *)piVar4[2];
    }
    else {
      iVar3 = (**(code **)(*piVar4 + 0x20))();
    }
    param_2[1] = iVar3;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar3 == -1;
  }
  uVar7 = 0x40;
  if ((char)param_1[2] == (char)param_2[2]) goto LAB_00046c7a;
  if (*(char *)((int)param_1 + 9) == '\0') {
    piVar4 = (int *)*param_1;
    if ((int *)piVar4[2] < (int *)piVar4[3]) {
      iVar3 = *(int *)piVar4[2];
    }
    else {
      iVar3 = (**(code **)(*piVar4 + 0x20))();
    }
    param_1[1] = iVar3;
    *(undefined1 *)((int)param_1 + 9) = 1;
    *(bool *)(param_1 + 2) = iVar3 == -1;
  }
  else {
    iVar3 = param_1[1];
  }
  if (iVar3 != local_20) goto LAB_00046c7a;
  piVar4 = (int *)*param_1;
  if ((uint)piVar4[2] < (uint)piVar4[3]) {
    piVar4[2] = piVar4[2] + 4;
    *(undefined1 *)((int)param_1 + 9) = 0;
LAB_00046a8a:
    if ((int *)piVar4[2] < (int *)piVar4[3]) {
      iVar3 = *(int *)piVar4[2];
    }
    else {
      iVar3 = (**(code **)(*piVar4 + 0x20))();
    }
    param_1[1] = iVar3;
    *(undefined1 *)((int)param_1 + 9) = 1;
    *(bool *)(param_1 + 2) = iVar3 == -1;
  }
  else {
    (**(code **)(*piVar4 + 0x24))();
    *(undefined1 *)((int)param_1 + 9) = 0;
    piVar4 = (int *)*param_1;
    if (piVar4 != (int *)0x0) goto LAB_00046a8a;
  }
  piVar4 = (int *)*param_2;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar4[2] < (int *)piVar4[3]) {
      iVar3 = *(int *)piVar4[2];
    }
    else {
      iVar3 = (**(code **)(*piVar4 + 0x20))();
    }
    param_2[1] = iVar3;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar3 == -1;
  }
  uVar6 = 1;
  if ((char)param_1[2] != (char)param_2[2]) {
    if (*(char *)((int)param_1 + 9) == '\0') {
      piVar4 = (int *)*param_1;
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar3 = *(int *)piVar4[2];
      }
      else {
        iVar3 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = iVar3;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar3 == -1;
    }
    else {
      iVar3 = param_1[1];
    }
    if ((iVar3 == local_1c) || (iVar3 == local_18)) {
      piVar4 = (int *)*param_1;
      if ((uint)piVar4[2] < (uint)piVar4[3]) {
        piVar4[2] = piVar4[2] + 4;
      }
      else {
        (**(code **)(*piVar4 + 0x24))();
      }
      uVar6 = 0;
      *(undefined1 *)((int)param_1 + 9) = 0;
    }
  }
LAB_00046c7a:
  return uVar7 | uVar5 | uVar6;
}



### FUNC FUN_00046c84 @ 00046c84

uint FUN_00046c84(int *param_1,int *param_2,int param_3,int *param_4,int param_5,int param_6,
                 uint param_7,int param_8)

{
  char cVar1;
  int iVar2;
  int iVar3;
  int *piVar4;
  int iVar5;
  uint uVar6;
  bool bVar7;
  int iVar8;
  int iVar9;
  char *pcVar10;
  char cVar11;
  int local_98;
  int local_70;
  uint local_68;
  int local_5c;
  int local_58;
  char acStack_54 [64];
  
  iVar9 = *(int *)(param_8 + 0x10);
  iVar2 = *(int *)(param_8 + 0x14);
  local_5c = 0;
  cVar11 = *(char *)((int)param_1 + 9);
  local_68 = 1;
  local_98 = -0x80000000;
  iVar3 = __divsi3(0x80000000,param_3);
  local_70 = param_5;
  cVar1 = '\0';
  local_58 = 0;
  bVar7 = false;
  uVar6 = (uint)(cVar11 == '\0');
  while( true ) {
    pcVar10 = acStack_54 + local_5c;
    piVar4 = (int *)*param_1;
    if ((piVar4 != (int *)0x0) && (uVar6 != 0)) {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar5 = *(int *)piVar4[2];
      }
      else {
        iVar5 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = iVar5;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar5 == -1;
    }
    piVar4 = (int *)*param_2;
    if ((piVar4 == (int *)0x0) || (*(char *)((int)param_2 + 9) != '\0')) {
      cVar11 = (char)param_2[2];
    }
    else {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar5 = *(int *)piVar4[2];
      }
      else {
        iVar5 = (**(code **)(*piVar4 + 0x20))();
      }
      param_2[1] = iVar5;
      *(undefined1 *)((int)param_2 + 9) = 1;
      cVar11 = iVar5 == -1;
      *(char *)(param_2 + 2) = cVar11;
    }
    if ((char)param_1[2] == cVar11) break;
    if (*(char *)((int)param_1 + 9) == '\0') {
      piVar4 = (int *)*param_1;
      if ((uint *)piVar4[2] < (uint *)piVar4[3]) {
        uVar6 = *(uint *)piVar4[2];
      }
      else {
        uVar6 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = uVar6;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = uVar6 == 0xffffffff;
    }
    else {
      uVar6 = param_1[1];
    }
    iVar5 = local_58;
    if (uVar6 == param_7 && iVar2 != iVar9) {
      *pcVar10 = cVar1;
      local_5c = local_5c + 1;
      cVar1 = '\0';
    }
    else {
      iVar8 = 0xff;
      if (uVar6 < 0x80) {
        iVar8 = std::priv::__digit_val_table(uVar6);
      }
      if (param_3 <= iVar8) break;
      cVar1 = cVar1 + '\x01';
      local_70 = local_70 + 1;
      if (local_58 < iVar3) {
        bVar7 = true;
      }
      else {
        iVar5 = local_58 * param_3 - iVar8;
        bVar7 = (bool)(bVar7 | (local_58 != 0 && local_58 <= iVar5));
      }
    }
    piVar4 = (int *)*param_1;
    if ((uint)piVar4[2] < (uint)piVar4[3]) {
      piVar4[2] = piVar4[2] + 4;
    }
    else {
      (**(code **)(*piVar4 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 9) = 0;
    uVar6 = local_68;
    local_58 = iVar5;
  }
  if ((iVar2 != iVar9) && (local_5c != 0)) {
    *pcVar10 = cVar1;
    pcVar10 = acStack_54 + local_5c + 1;
  }
  uVar6 = 0;
  if (0 < local_70) {
    if (bVar7) {
      if (param_6 == 0) {
        local_98 = 0x7fffffff;
      }
      *param_4 = local_98;
    }
    else {
      if (param_6 == 0) {
        local_58 = -local_58;
      }
      *param_4 = local_58;
      uVar6 = local_68;
      if (iVar2 != iVar9) {
        uVar6 = std::priv::__valid_grouping
                          (acStack_54,pcVar10,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10))
        ;
      }
    }
  }
  return uVar6;
}



### FUNC FUN_00046e7c @ 00046e7c

void FUN_00046e7c(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined2 *param_6)

{
  locale *this;
  undefined4 uVar1;
  uint uVar2;
  int *piVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  undefined1 auStack_34 [4];
  int local_30 [5];
  int *local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  uVar2 = FUN_00046858(param_2,param_3,*(undefined4 *)(param_4 + 4),uVar1);
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    uVar5 = 4;
    if ((uVar2 & 1) != 0) {
      uVar5 = 0;
      *param_6 = 0;
    }
  }
  else {
    piVar3 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<wchar_t>::id);
    uVar1 = (**(code **)(*piVar3 + 0xc))(piVar3);
    (**(code **)(*piVar3 + 0x10))(local_30,piVar3);
    iVar4 = FUN_00047080(param_2,param_3,(int)uVar2 >> 2,param_6,uVar2 & 1,(uVar2 & 2) != 0,uVar1,
                         local_30,auStack_34);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
        std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      }
      else {
        operator_delete(local_1c);
      }
    }
    uVar5 = 0;
    if (iVar4 == 0) {
      uVar5 = 4;
    }
  }
  *param_5 = uVar5;
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    *param_5 = *param_5 | 2;
  }
  iVar4 = param_2[1];
  iVar6 = param_2[2];
  *param_1 = *param_2;
  param_1[1] = iVar4;
  param_1[2] = iVar6;
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00047080 @ 00047080

uint FUN_00047080(int *param_1,int *param_2,uint param_3,short *param_4,int param_5,int param_6,
                 uint param_7,int param_8)

{
  bool bVar1;
  int iVar2;
  uint uVar3;
  int *piVar4;
  int iVar5;
  uint uVar6;
  char cVar7;
  int iVar8;
  uint uVar9;
  char *pcVar10;
  char cVar11;
  int local_70;
  uint local_68;
  uint local_5c;
  int local_58;
  char acStack_54 [64];
  
  iVar8 = *(int *)(param_8 + 0x10);
  iVar2 = *(int *)(param_8 + 0x14);
  local_58 = 0;
  cVar11 = *(char *)((int)param_1 + 9);
  local_68 = 1;
  uVar3 = __udivsi3(0xffff,param_3 & 0xffff);
  local_70 = param_5;
  cVar7 = '\0';
  local_5c = 0;
  bVar1 = false;
  uVar6 = (uint)(cVar11 == '\0');
  while( true ) {
    pcVar10 = acStack_54 + local_58;
    piVar4 = (int *)*param_1;
    if ((piVar4 != (int *)0x0) && (uVar6 != 0)) {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar5 = *(int *)piVar4[2];
      }
      else {
        iVar5 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = iVar5;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar5 == -1;
    }
    piVar4 = (int *)*param_2;
    if ((piVar4 == (int *)0x0) || (*(char *)((int)param_2 + 9) != '\0')) {
      cVar11 = (char)param_2[2];
    }
    else {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar5 = *(int *)piVar4[2];
      }
      else {
        iVar5 = (**(code **)(*piVar4 + 0x20))();
      }
      param_2[1] = iVar5;
      *(undefined1 *)((int)param_2 + 9) = 1;
      cVar11 = iVar5 == -1;
      *(char *)(param_2 + 2) = cVar11;
    }
    if ((char)param_1[2] == cVar11) break;
    if (*(char *)((int)param_1 + 9) == '\0') {
      piVar4 = (int *)*param_1;
      if ((uint *)piVar4[2] < (uint *)piVar4[3]) {
        uVar6 = *(uint *)piVar4[2];
      }
      else {
        uVar6 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = uVar6;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = uVar6 == 0xffffffff;
    }
    else {
      uVar6 = param_1[1];
    }
    uVar9 = local_5c;
    if (uVar6 == param_7 && iVar2 != iVar8) {
      *pcVar10 = cVar7;
      local_58 = local_58 + 1;
      cVar7 = '\0';
    }
    else {
      iVar5 = 0xff;
      if (uVar6 < 0x80) {
        iVar5 = std::priv::__digit_val_table(uVar6);
      }
      if ((int)param_3 <= iVar5) break;
      uVar6 = local_5c & 0xffff;
      cVar7 = cVar7 + '\x01';
      local_70 = local_70 + 1;
      if (uVar3 < uVar6) {
        bVar1 = true;
      }
      else {
        uVar9 = iVar5 + uVar6 * param_3;
        if ((local_5c & 0xffff) != 0) {
          bVar1 = (bool)(bVar1 | (uVar9 & 0xffff) <= uVar6);
        }
      }
    }
    piVar4 = (int *)*param_1;
    if ((uint)piVar4[2] < (uint)piVar4[3]) {
      piVar4[2] = piVar4[2] + 4;
    }
    else {
      (**(code **)(*piVar4 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 9) = 0;
    uVar6 = local_68;
    local_5c = uVar9;
  }
  if ((iVar2 != iVar8) && (local_58 != 0)) {
    *pcVar10 = cVar7;
    pcVar10 = acStack_54 + local_58 + 1;
  }
  uVar6 = 0;
  if (0 < local_70) {
    if (bVar1) {
      *param_4 = -1;
    }
    else {
      if (param_6 == 1) {
        local_5c._0_2_ = -(short)local_5c;
      }
      *param_4 = (short)local_5c;
      uVar6 = local_68;
      if (iVar2 != iVar8) {
        uVar6 = std::priv::__valid_grouping
                          (acStack_54,pcVar10,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10))
        ;
      }
    }
  }
  return uVar6;
}



### FUNC FUN_00047274 @ 00047274

void FUN_00047274(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined4 *param_6)

{
  locale *this;
  undefined4 uVar1;
  uint uVar2;
  int *piVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  undefined1 auStack_34 [4];
  int local_30 [5];
  int *local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  uVar2 = FUN_00046858(param_2,param_3,*(undefined4 *)(param_4 + 4),uVar1);
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    uVar5 = 4;
    if ((uVar2 & 1) != 0) {
      uVar5 = 0;
      *param_6 = 0;
    }
  }
  else {
    piVar3 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<wchar_t>::id);
    uVar1 = (**(code **)(*piVar3 + 0xc))(piVar3);
    (**(code **)(*piVar3 + 0x10))(local_30,piVar3);
    iVar4 = FUN_00047478(param_2,param_3,(int)uVar2 >> 2,param_6,uVar2 & 1,(uVar2 & 2) != 0,uVar1,
                         local_30,auStack_34);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
        std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      }
      else {
        operator_delete(local_1c);
      }
    }
    uVar5 = 0;
    if (iVar4 == 0) {
      uVar5 = 4;
    }
  }
  *param_5 = uVar5;
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    *param_5 = *param_5 | 2;
  }
  iVar4 = param_2[1];
  iVar6 = param_2[2];
  *param_1 = *param_2;
  param_1[1] = iVar4;
  param_1[2] = iVar6;
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00047478 @ 00047478

uint FUN_00047478(int *param_1,int *param_2,int param_3,uint *param_4,int param_5,int param_6,
                 uint param_7,int param_8)

{
  char cVar1;
  int iVar2;
  uint uVar3;
  int *piVar4;
  int iVar5;
  uint uVar6;
  bool bVar7;
  int iVar8;
  uint uVar9;
  char *pcVar10;
  char cVar11;
  int local_70;
  uint local_68;
  int local_5c;
  uint local_58;
  char acStack_54 [64];
  
  iVar8 = *(int *)(param_8 + 0x10);
  iVar2 = *(int *)(param_8 + 0x14);
  local_5c = 0;
  cVar11 = *(char *)((int)param_1 + 9);
  local_68 = 1;
  uVar3 = __udivsi3(0xffffffff,param_3);
  local_70 = param_5;
  cVar1 = '\0';
  local_58 = 0;
  bVar7 = false;
  uVar6 = (uint)(cVar11 == '\0');
  while( true ) {
    pcVar10 = acStack_54 + local_5c;
    piVar4 = (int *)*param_1;
    if ((piVar4 != (int *)0x0) && (uVar6 != 0)) {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar5 = *(int *)piVar4[2];
      }
      else {
        iVar5 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = iVar5;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar5 == -1;
    }
    piVar4 = (int *)*param_2;
    if ((piVar4 == (int *)0x0) || (*(char *)((int)param_2 + 9) != '\0')) {
      cVar11 = (char)param_2[2];
    }
    else {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar5 = *(int *)piVar4[2];
      }
      else {
        iVar5 = (**(code **)(*piVar4 + 0x20))();
      }
      param_2[1] = iVar5;
      *(undefined1 *)((int)param_2 + 9) = 1;
      cVar11 = iVar5 == -1;
      *(char *)(param_2 + 2) = cVar11;
    }
    if ((char)param_1[2] == cVar11) break;
    if (*(char *)((int)param_1 + 9) == '\0') {
      piVar4 = (int *)*param_1;
      if ((uint *)piVar4[2] < (uint *)piVar4[3]) {
        uVar6 = *(uint *)piVar4[2];
      }
      else {
        uVar6 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = uVar6;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = uVar6 == 0xffffffff;
    }
    else {
      uVar6 = param_1[1];
    }
    uVar9 = local_58;
    if (uVar6 == param_7 && iVar2 != iVar8) {
      *pcVar10 = cVar1;
      local_5c = local_5c + 1;
      cVar1 = '\0';
    }
    else {
      iVar5 = 0xff;
      if (uVar6 < 0x80) {
        iVar5 = std::priv::__digit_val_table(uVar6);
      }
      if (param_3 <= iVar5) break;
      cVar1 = cVar1 + '\x01';
      local_70 = local_70 + 1;
      if (uVar3 < local_58) {
        bVar7 = true;
      }
      else {
        uVar9 = iVar5 + local_58 * param_3;
        bVar7 = (bool)(bVar7 | (local_58 != 0 && uVar9 <= local_58));
      }
    }
    piVar4 = (int *)*param_1;
    if ((uint)piVar4[2] < (uint)piVar4[3]) {
      piVar4[2] = piVar4[2] + 4;
    }
    else {
      (**(code **)(*piVar4 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 9) = 0;
    uVar6 = local_68;
    local_58 = uVar9;
  }
  if ((iVar2 != iVar8) && (local_5c != 0)) {
    *pcVar10 = cVar1;
    pcVar10 = acStack_54 + local_5c + 1;
  }
  uVar6 = 0;
  if (0 < local_70) {
    if (bVar7) {
      *param_4 = 0xffffffff;
    }
    else {
      uVar6 = -local_58;
      if (param_6 == 0) {
        uVar6 = local_58;
      }
      *param_4 = uVar6;
      uVar6 = local_68;
      if (iVar2 != iVar8) {
        uVar6 = std::priv::__valid_grouping
                          (acStack_54,pcVar10,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10))
        ;
      }
    }
  }
  return uVar6;
}



### FUNC FUN_00047664 @ 00047664

void FUN_00047664(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined4 *param_6)

{
  locale *this;
  undefined4 uVar1;
  uint uVar2;
  int *piVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  undefined1 auStack_34 [4];
  int local_30 [5];
  int *local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  uVar2 = FUN_00046858(param_2,param_3,*(undefined4 *)(param_4 + 4),uVar1);
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    uVar5 = 4;
    if ((uVar2 & 1) != 0) {
      uVar5 = 0;
      *param_6 = 0;
    }
  }
  else {
    piVar3 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<wchar_t>::id);
    uVar1 = (**(code **)(*piVar3 + 0xc))(piVar3);
    (**(code **)(*piVar3 + 0x10))(local_30,piVar3);
    iVar4 = FUN_00047868(param_2,param_3,(int)uVar2 >> 2,param_6,uVar2 & 1,(uVar2 & 2) != 0,uVar1,
                         local_30,auStack_34);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
        std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      }
      else {
        operator_delete(local_1c);
      }
    }
    uVar5 = 0;
    if (iVar4 == 0) {
      uVar5 = 4;
    }
  }
  *param_5 = uVar5;
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    *param_5 = *param_5 | 2;
  }
  iVar4 = param_2[1];
  iVar6 = param_2[2];
  *param_1 = *param_2;
  param_1[1] = iVar4;
  param_1[2] = iVar6;
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00047868 @ 00047868

uint FUN_00047868(int *param_1,int *param_2,int param_3,uint *param_4,int param_5,int param_6,
                 uint param_7,int param_8)

{
  char cVar1;
  int iVar2;
  uint uVar3;
  int *piVar4;
  int iVar5;
  uint uVar6;
  bool bVar7;
  int iVar8;
  uint uVar9;
  char *pcVar10;
  char cVar11;
  int local_70;
  uint local_68;
  int local_5c;
  uint local_58;
  char acStack_54 [64];
  
  iVar8 = *(int *)(param_8 + 0x10);
  iVar2 = *(int *)(param_8 + 0x14);
  local_5c = 0;
  cVar11 = *(char *)((int)param_1 + 9);
  local_68 = 1;
  uVar3 = __udivsi3(0xffffffff,param_3);
  local_70 = param_5;
  cVar1 = '\0';
  local_58 = 0;
  bVar7 = false;
  uVar6 = (uint)(cVar11 == '\0');
  while( true ) {
    pcVar10 = acStack_54 + local_5c;
    piVar4 = (int *)*param_1;
    if ((piVar4 != (int *)0x0) && (uVar6 != 0)) {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar5 = *(int *)piVar4[2];
      }
      else {
        iVar5 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = iVar5;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar5 == -1;
    }
    piVar4 = (int *)*param_2;
    if ((piVar4 == (int *)0x0) || (*(char *)((int)param_2 + 9) != '\0')) {
      cVar11 = (char)param_2[2];
    }
    else {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar5 = *(int *)piVar4[2];
      }
      else {
        iVar5 = (**(code **)(*piVar4 + 0x20))();
      }
      param_2[1] = iVar5;
      *(undefined1 *)((int)param_2 + 9) = 1;
      cVar11 = iVar5 == -1;
      *(char *)(param_2 + 2) = cVar11;
    }
    if ((char)param_1[2] == cVar11) break;
    if (*(char *)((int)param_1 + 9) == '\0') {
      piVar4 = (int *)*param_1;
      if ((uint *)piVar4[2] < (uint *)piVar4[3]) {
        uVar6 = *(uint *)piVar4[2];
      }
      else {
        uVar6 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = uVar6;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = uVar6 == 0xffffffff;
    }
    else {
      uVar6 = param_1[1];
    }
    uVar9 = local_58;
    if (uVar6 == param_7 && iVar2 != iVar8) {
      *pcVar10 = cVar1;
      local_5c = local_5c + 1;
      cVar1 = '\0';
    }
    else {
      iVar5 = 0xff;
      if (uVar6 < 0x80) {
        iVar5 = std::priv::__digit_val_table(uVar6);
      }
      if (param_3 <= iVar5) break;
      cVar1 = cVar1 + '\x01';
      local_70 = local_70 + 1;
      if (uVar3 < local_58) {
        bVar7 = true;
      }
      else {
        uVar9 = iVar5 + local_58 * param_3;
        bVar7 = (bool)(bVar7 | (local_58 != 0 && uVar9 <= local_58));
      }
    }
    piVar4 = (int *)*param_1;
    if ((uint)piVar4[2] < (uint)piVar4[3]) {
      piVar4[2] = piVar4[2] + 4;
    }
    else {
      (**(code **)(*piVar4 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 9) = 0;
    uVar6 = local_68;
    local_58 = uVar9;
  }
  if ((iVar2 != iVar8) && (local_5c != 0)) {
    *pcVar10 = cVar1;
    pcVar10 = acStack_54 + local_5c + 1;
  }
  uVar6 = 0;
  if (0 < local_70) {
    if (bVar7) {
      *param_4 = 0xffffffff;
    }
    else {
      uVar6 = -local_58;
      if (param_6 == 0) {
        uVar6 = local_58;
      }
      *param_4 = uVar6;
      uVar6 = local_68;
      if (iVar2 != iVar8) {
        uVar6 = std::priv::__valid_grouping
                          (acStack_54,pcVar10,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10))
        ;
      }
    }
  }
  return uVar6;
}



### FUNC FUN_00047a54 @ 00047a54

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_00047a54(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,float *param_6)

{
  locale *this;
  undefined4 uVar1;
  undefined4 uVar2;
  int iVar3;
  int *piVar4;
  int iVar5;
  uint uVar6;
  undefined1 *local_134 [4];
  undefined1 **local_124;
  undefined1 local_120;
  undefined1 auStack_11f [256];
  undefined1 auStack_1f [3];
  undefined1 **local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  uVar2 = std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<wchar_t>::id);
  __aeabi_memclr(auStack_11f,0x100);
  local_120 = 0;
  local_134[0] = auStack_1f;
  local_124 = (undefined1 **)&local_120;
  local_1c = (undefined1 **)&local_120;
  iVar3 = FUN_00047bcc(local_134,param_2,param_3,uVar1,uVar2);
  uVar6 = 4;
  if (iVar3 == 1) {
    uVar6 = 0;
    std::priv::__string_to_float((__basic_iostring *)local_134,param_6);
  }
  *param_5 = uVar6;
  piVar4 = (int *)*param_2;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar4[2] < (int *)piVar4[3]) {
      iVar3 = *(int *)piVar4[2];
    }
    else {
      iVar3 = (**(code **)(*piVar4 + 0x20))();
    }
    param_2[1] = iVar3;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar3 == -1;
  }
  piVar4 = (int *)*param_3;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar4[2] < (int *)piVar4[3]) {
      iVar3 = *(int *)piVar4[2];
    }
    else {
      iVar3 = (**(code **)(*piVar4 + 0x20))();
    }
    param_3[1] = iVar3;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar3 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    *param_5 = *param_5 | 2;
  }
  iVar3 = param_2[1];
  iVar5 = param_2[2];
  *param_1 = *param_2;
  param_1[1] = iVar3;
  param_1[2] = iVar5;
  if (((local_1c != local_134) && (local_1c != (undefined1 **)0x0)) &&
     ((undefined1 **)&local_120 != local_1c)) {
    if ((uint)((int)local_134[0] - (int)local_1c) < 0x81) {
      std::__node_alloc::_M_deallocate(local_1c,(int)local_134[0] - (int)local_1c);
    }
    else {
      operator_delete(local_1c);
    }
  }
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00047bcc @ 00047bcc

undefined4 FUN_00047bcc(undefined4 param_1,int *param_2,int *param_3,ctype *param_4,int *param_5)

{
  int iVar1;
  uint uVar2;
  int *piVar3;
  int iVar4;
  uint uVar5;
  wchar_t wVar6;
  undefined4 uVar7;
  int local_74;
  int local_70;
  undefined2 local_6c;
  wchar_t local_68;
  wchar_t local_64;
  wchar_t local_60;
  wchar_t local_5c;
  wchar_t awStack_58 [10];
  undefined1 local_30;
  int local_2c [4];
  int *local_1c;
  int *local_18;
  
  (**(code **)(*param_5 + 0x10))(local_2c,param_5);
  local_30 = 1;
  iVar1 = (**(code **)(*param_5 + 8))(param_5);
  (**(code **)(*param_5 + 0xc))(param_5);
  std::priv::_Initialize_get_float(param_4,&local_5c,&local_60,&local_64,&local_68,awStack_58);
  FUN_00047f10(&local_74,*param_2,param_2[1],param_2[2],*param_3,param_3[1],param_3[2],param_1,
               local_5c,local_60);
  *(undefined2 *)(param_2 + 2) = local_6c;
  *param_2 = local_74;
  param_2[1] = local_70;
  if (local_18 == local_1c) {
    uVar2 = FUN_000481d4(param_2,*param_3,param_3[1],param_3[2],param_1,awStack_58);
  }
  else {
    uVar2 = FUN_00048060(param_2);
  }
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  uVar5 = 0;
  if ((char)param_2[2] != (char)param_3[2]) {
    if (*(char *)((int)param_2 + 9) == '\0') {
      piVar3 = (int *)*param_2;
      if ((int *)piVar3[2] < (int *)piVar3[3]) {
        iVar4 = *(int *)piVar3[2];
      }
      else {
        iVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      param_2[1] = iVar4;
      *(undefined1 *)((int)param_2 + 9) = 1;
      *(bool *)(param_2 + 2) = iVar4 == -1;
    }
    else {
      iVar4 = param_2[1];
    }
    uVar5 = 0;
    if (iVar4 == iVar1) {
      FUN_00040cb0(param_1,0x2e);
      piVar3 = (int *)*param_2;
      if ((uint)piVar3[2] < (uint)piVar3[3]) {
        piVar3[2] = piVar3[2] + 4;
      }
      else {
        (**(code **)(*piVar3 + 0x24))();
      }
      *(undefined1 *)((int)param_2 + 9) = 0;
      uVar5 = FUN_000481d4(param_2,*param_3,param_3[1],param_3[2],param_1,awStack_58);
    }
  }
  uVar7 = 0;
  if ((uVar2 | uVar5) == 1) {
    piVar3 = (int *)*param_2;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
      if ((int *)piVar3[2] < (int *)piVar3[3]) {
        iVar1 = *(int *)piVar3[2];
      }
      else {
        iVar1 = (**(code **)(*piVar3 + 0x20))();
      }
      param_2[1] = iVar1;
      *(undefined1 *)((int)param_2 + 9) = 1;
      *(bool *)(param_2 + 2) = iVar1 == -1;
    }
    piVar3 = (int *)*param_3;
    if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
      if ((int *)piVar3[2] < (int *)piVar3[3]) {
        iVar1 = *(int *)piVar3[2];
      }
      else {
        iVar1 = (**(code **)(*piVar3 + 0x20))();
      }
      param_3[1] = iVar1;
      *(undefined1 *)((int)param_3 + 9) = 1;
      *(bool *)(param_3 + 2) = iVar1 == -1;
    }
    uVar7 = 1;
    if ((char)param_2[2] != (char)param_3[2]) {
      if (*(char *)((int)param_2 + 9) == '\0') {
        piVar3 = (int *)*param_2;
        if ((wchar_t *)piVar3[2] < (wchar_t *)piVar3[3]) {
          wVar6 = *(wchar_t *)piVar3[2];
        }
        else {
          wVar6 = (**(code **)(*piVar3 + 0x20))();
        }
        param_2[1] = wVar6;
        *(undefined1 *)((int)param_2 + 9) = 1;
        *(bool *)(param_2 + 2) = wVar6 == L'\xffffffff';
      }
      else {
        wVar6 = param_2[1];
      }
      uVar7 = 1;
      if ((wVar6 == local_64) || (wVar6 == local_68)) {
        FUN_00040cb0(param_1,0x65);
        piVar3 = (int *)*param_2;
        if ((uint)piVar3[2] < (uint)piVar3[3]) {
          piVar3[2] = piVar3[2] + 4;
        }
        else {
          (**(code **)(*piVar3 + 0x24))();
        }
        *(undefined1 *)((int)param_2 + 9) = 0;
        FUN_00047f10(&local_74,*param_2,param_2[1],param_2[2],*param_3,param_3[1],param_3[2],param_1
                     ,local_5c,local_60);
        *(undefined2 *)(param_2 + 2) = local_6c;
        *param_2 = local_74;
        param_2[1] = local_70;
        uVar7 = FUN_000481d4(param_2,*param_3,param_3[1],param_3[2],param_1,awStack_58);
      }
    }
  }
  if ((local_18 != local_2c) && (local_18 != (int *)0x0)) {
    if ((uint)(local_2c[0] - (int)local_18) < 0x81) {
      std::__node_alloc::_M_deallocate(local_18,local_2c[0] - (int)local_18);
    }
    else {
      operator_delete(local_18);
    }
  }
  return uVar7;
}



### FUNC FUN_00047f10 @ 00047f10

void FUN_00047f10(undefined4 *param_1,int *param_2,int param_3,uint param_4,int *param_5,
                 undefined4 param_6,uint param_7,undefined4 param_8,int param_9,int param_10)

{
  int iVar1;
  code *pcVar2;
  int local_20;
  
  local_20 = param_3;
  if ((param_2 != (int *)0x0) && ((param_4 & 0xff00) == 0)) {
    if ((int *)param_2[2] < (int *)param_2[3]) {
      local_20 = *(int *)param_2[2];
    }
    else {
      local_20 = (**(code **)(*param_2 + 0x20))(param_2);
    }
    param_4 = param_4 & 0xffff0000 | (uint)(local_20 == -1) | 0x100;
  }
  if ((param_5 != (int *)0x0) && ((param_7 & 0xff00) == 0)) {
    if ((int *)param_5[2] < (int *)param_5[3]) {
      iVar1 = *(int *)param_5[2];
    }
    else {
      iVar1 = (**(code **)(*param_5 + 0x20))();
    }
    param_7 = (uint)(iVar1 == -1);
  }
  if ((param_4 & 0xff) == (param_7 & 0xff)) goto LAB_00048052;
  if ((param_4 & 0xff00) == 0) {
    if ((int *)param_2[2] < (int *)param_2[3]) {
      local_20 = *(int *)param_2[2];
    }
    else {
      local_20 = (**(code **)(*param_2 + 0x20))(param_2);
    }
    param_4 = param_4 & 0xffff0000 | (uint)(local_20 == -1) | 0x100;
    if (local_20 != param_9) goto LAB_0004801c;
LAB_00047fce:
    if ((uint)param_2[2] < (uint)param_2[3]) {
      param_2[2] = param_2[2] + 4;
      local_20 = param_9;
    }
    else {
      pcVar2 = *(code **)(*param_2 + 0x24);
LAB_00048046:
      (*pcVar2)(param_2);
      local_20 = param_9;
    }
  }
  else {
    if (local_20 == param_9) goto LAB_00047fce;
LAB_0004801c:
    if (local_20 != param_10) goto LAB_00048052;
    FUN_00040cb0(param_8,0x2d);
    if ((uint)param_2[3] <= (uint)param_2[2]) {
      pcVar2 = *(code **)(*param_2 + 0x24);
      param_9 = param_10;
      goto LAB_00048046;
    }
    param_2[2] = param_2[2] + 4;
    local_20 = param_10;
  }
  param_4 = param_4 & 0xffff00ff;
LAB_00048052:
  *param_1 = param_2;
  param_1[1] = local_20;
  param_1[2] = param_4;
  return;
}



### FUNC FUN_00048060 @ 00048060

undefined4
FUN_00048060(int *param_1,int *param_2,undefined4 param_3,uint param_4,undefined4 param_5,
            wchar_t *param_6,wchar_t param_7,int param_8,undefined1 *param_9)

{
  char cVar1;
  undefined1 uVar2;
  int *piVar3;
  int iVar4;
  char *pcVar5;
  bool bVar6;
  undefined4 local_74;
  int local_5c;
  wchar_t local_58;
  char local_54 [64];
  
  local_5c = 0;
  bVar6 = *(char *)((int)param_1 + 9) == '\0';
  cVar1 = '\0';
  local_74 = 0;
  while( true ) {
    pcVar5 = local_54 + local_5c;
    piVar3 = (int *)*param_1;
    if ((piVar3 != (int *)0x0) && (bVar6)) {
      if ((int *)piVar3[2] < (int *)piVar3[3]) {
        iVar4 = *(int *)piVar3[2];
      }
      else {
        iVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      param_1[1] = iVar4;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar4 == -1;
    }
    if ((param_2 != (int *)0x0) && ((param_4 & 0xff00) == 0)) {
      if ((int *)param_2[2] < (int *)param_2[3]) {
        iVar4 = *(int *)param_2[2];
      }
      else {
        iVar4 = (**(code **)(*param_2 + 0x20))(param_2);
      }
      param_4 = iVar4 == -1 | 0x100;
    }
    if ((uint)*(byte *)(param_1 + 2) == (param_4 & 0xff)) break;
    if (*(char *)((int)param_1 + 9) == '\0') {
      piVar3 = (int *)*param_1;
      if ((wchar_t *)piVar3[2] < (wchar_t *)piVar3[3]) {
        local_58 = *(wchar_t *)piVar3[2];
      }
      else {
        local_58 = (**(code **)(*piVar3 + 0x20))();
      }
      param_1[1] = local_58;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = local_58 == L'\xffffffff';
    }
    else {
      local_58 = param_1[1];
    }
    iVar4 = std::priv::__get_fdigit_or_sep(&local_58,param_7,param_6);
    if (iVar4 != 1) break;
    if (local_58 == L',') {
      *pcVar5 = cVar1;
      local_5c = local_5c + 1;
      cVar1 = '\0';
    }
    else {
      FUN_00040cb0(param_5,local_58 & 0xff);
      cVar1 = cVar1 + '\x01';
      local_74 = 1;
    }
    piVar3 = (int *)*param_1;
    if ((uint)piVar3[2] < (uint)piVar3[3]) {
      piVar3[2] = piVar3[2] + 4;
    }
    else {
      (**(code **)(*piVar3 + 0x24))();
    }
    bVar6 = true;
    *(undefined1 *)((int)param_1 + 9) = 0;
  }
  if (local_5c != 0) {
    *pcVar5 = cVar1;
    pcVar5 = local_54 + local_5c + 1;
  }
  uVar2 = std::priv::__valid_grouping
                    (local_54,pcVar5,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10));
  *param_9 = uVar2;
  return local_74;
}



### FUNC FUN_000481d4 @ 000481d4

undefined4
FUN_000481d4(int *param_1,int *param_2,undefined4 param_3,uint param_4,undefined4 param_5,
            wchar_t *param_6)

{
  int *piVar1;
  int iVar2;
  bool bVar3;
  undefined4 local_20;
  wchar_t local_18;
  
  local_20 = 0;
  bVar3 = *(char *)((int)param_1 + 9) == '\0';
  while( true ) {
    piVar1 = (int *)*param_1;
    if ((piVar1 != (int *)0x0) && (bVar3)) {
      if ((int *)piVar1[2] < (int *)piVar1[3]) {
        iVar2 = *(int *)piVar1[2];
      }
      else {
        iVar2 = (**(code **)(*piVar1 + 0x20))();
      }
      param_1[1] = iVar2;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar2 == -1;
    }
    if ((param_2 != (int *)0x0) && ((param_4 & 0xff00) == 0)) {
      if ((int *)param_2[2] < (int *)param_2[3]) {
        iVar2 = *(int *)param_2[2];
      }
      else {
        iVar2 = (**(code **)(*param_2 + 0x20))(param_2);
      }
      param_4 = iVar2 == -1 | 0x100;
    }
    if ((uint)*(byte *)(param_1 + 2) == (param_4 & 0xff)) {
      return local_20;
    }
    if (*(char *)((int)param_1 + 9) == '\0') {
      piVar1 = (int *)*param_1;
      if ((wchar_t *)piVar1[2] < (wchar_t *)piVar1[3]) {
        local_18 = *(wchar_t *)piVar1[2];
      }
      else {
        local_18 = (**(code **)(*piVar1 + 0x20))();
      }
      param_1[1] = local_18;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = local_18 == L'\xffffffff';
    }
    else {
      local_18 = param_1[1];
    }
    iVar2 = std::priv::__get_fdigit(&local_18,param_6);
    if (iVar2 == 0) break;
    FUN_00040cb0(param_5,local_18 & 0xff);
    piVar1 = (int *)*param_1;
    if ((uint)piVar1[2] < (uint)piVar1[3]) {
      piVar1[2] = piVar1[2] + 4;
    }
    else {
      (**(code **)(*piVar1 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 9) = 0;
    bVar3 = true;
    local_20 = 1;
  }
  return local_20;
}



### FUNC FUN_000482e4 @ 000482e4

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_000482e4(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,double *param_6)

{
  locale *this;
  undefined4 uVar1;
  undefined4 uVar2;
  int iVar3;
  int *piVar4;
  int iVar5;
  uint uVar6;
  undefined1 *local_134 [4];
  undefined1 **local_124;
  undefined1 local_120;
  undefined1 auStack_11f [256];
  undefined1 auStack_1f [3];
  undefined1 **local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  uVar2 = std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<wchar_t>::id);
  __aeabi_memclr(auStack_11f,0x100);
  local_120 = 0;
  local_134[0] = auStack_1f;
  local_124 = (undefined1 **)&local_120;
  local_1c = (undefined1 **)&local_120;
  iVar3 = FUN_00047bcc(local_134,param_2,param_3,uVar1,uVar2);
  uVar6 = 4;
  if (iVar3 == 1) {
    uVar6 = 0;
    std::priv::__string_to_float((__basic_iostring *)local_134,param_6);
  }
  *param_5 = uVar6;
  piVar4 = (int *)*param_2;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar4[2] < (int *)piVar4[3]) {
      iVar3 = *(int *)piVar4[2];
    }
    else {
      iVar3 = (**(code **)(*piVar4 + 0x20))();
    }
    param_2[1] = iVar3;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar3 == -1;
  }
  piVar4 = (int *)*param_3;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar4[2] < (int *)piVar4[3]) {
      iVar3 = *(int *)piVar4[2];
    }
    else {
      iVar3 = (**(code **)(*piVar4 + 0x20))();
    }
    param_3[1] = iVar3;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar3 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    *param_5 = *param_5 | 2;
  }
  iVar3 = param_2[1];
  iVar5 = param_2[2];
  *param_1 = *param_2;
  param_1[1] = iVar3;
  param_1[2] = iVar5;
  if (((local_1c != local_134) && (local_1c != (undefined1 **)0x0)) &&
     ((undefined1 **)&local_120 != local_1c)) {
    if ((uint)((int)local_134[0] - (int)local_1c) < 0x81) {
      std::__node_alloc::_M_deallocate(local_1c,(int)local_134[0] - (int)local_1c);
    }
    else {
      operator_delete(local_1c);
    }
  }
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_0004845c @ 0004845c

void FUN_0004845c(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined4 *param_6)

{
  locale *this;
  undefined4 uVar1;
  uint uVar2;
  int *piVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  undefined1 auStack_34 [4];
  int local_30 [5];
  int *local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  uVar2 = FUN_00046858(param_2,param_3,*(undefined4 *)(param_4 + 4),uVar1);
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    uVar5 = 4;
    if ((uVar2 & 1) != 0) {
      uVar5 = 0;
      *param_6 = 0;
      param_6[1] = 0;
    }
  }
  else {
    piVar3 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<wchar_t>::id);
    uVar1 = (**(code **)(*piVar3 + 0xc))(piVar3);
    (**(code **)(*piVar3 + 0x10))(local_30,piVar3);
    iVar4 = FUN_00048660(param_2,param_3,(int)uVar2 >> 2,param_6,uVar2 & 1,(uVar2 & 2) != 0,uVar1,
                         local_30,auStack_34);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
        std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      }
      else {
        operator_delete(local_1c);
      }
    }
    uVar5 = 0;
    if (iVar4 == 0) {
      uVar5 = 4;
    }
  }
  *param_5 = uVar5;
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    *param_5 = *param_5 | 2;
  }
  iVar4 = param_2[1];
  iVar6 = param_2[2];
  *param_1 = *param_2;
  param_1[1] = iVar4;
  param_1[2] = iVar6;
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00048660 @ 00048660

uint FUN_00048660(int *param_1,int *param_2,int param_3,uint *param_4,int param_5,int param_6,
                 uint param_7,int param_8)

{
  bool bVar1;
  longlong lVar2;
  int iVar3;
  int *piVar4;
  int iVar5;
  uint uVar6;
  char cVar7;
  bool bVar8;
  int iVar9;
  uint uVar10;
  uint uVar11;
  char cVar12;
  undefined8 uVar13;
  longlong lVar14;
  int local_7c;
  uint local_70;
  char *local_68;
  int local_60;
  uint local_5c;
  uint local_58;
  char acStack_54 [64];
  
  iVar9 = *(int *)(param_8 + 0x10);
  iVar3 = *(int *)(param_8 + 0x14);
  local_70 = 1;
  uVar13 = __aeabi_uldivmod(0xffffffff,0xffffffff,param_3);
  uVar10 = (uint)((ulonglong)uVar13 >> 0x20);
  local_7c = param_5;
  cVar7 = '\0';
  local_60 = 0;
  bVar8 = false;
  uVar6 = (uint)(*(char *)((int)param_1 + 9) == '\0');
  lVar2 = 0;
  while( true ) {
    local_5c = (uint)((ulonglong)lVar2 >> 0x20);
    local_58 = (uint)lVar2;
    local_68 = acStack_54 + local_60;
    piVar4 = (int *)*param_1;
    if ((piVar4 != (int *)0x0) && (uVar6 != 0)) {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar5 = *(int *)piVar4[2];
      }
      else {
        iVar5 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = iVar5;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar5 == -1;
    }
    piVar4 = (int *)*param_2;
    if ((piVar4 == (int *)0x0) || (*(char *)((int)param_2 + 9) != '\0')) {
      cVar12 = (char)param_2[2];
    }
    else {
      if ((int *)piVar4[2] < (int *)piVar4[3]) {
        iVar5 = *(int *)piVar4[2];
      }
      else {
        iVar5 = (**(code **)(*piVar4 + 0x20))();
      }
      param_2[1] = iVar5;
      *(undefined1 *)((int)param_2 + 9) = 1;
      cVar12 = iVar5 == -1;
      *(char *)(param_2 + 2) = cVar12;
    }
    if ((char)param_1[2] == cVar12) break;
    if (*(char *)((int)param_1 + 9) == '\0') {
      piVar4 = (int *)*param_1;
      if ((uint *)piVar4[2] < (uint *)piVar4[3]) {
        uVar6 = *(uint *)piVar4[2];
      }
      else {
        uVar6 = (**(code **)(*piVar4 + 0x20))();
      }
      param_1[1] = uVar6;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = uVar6 == 0xffffffff;
    }
    else {
      uVar6 = param_1[1];
    }
    lVar14 = lVar2;
    if (uVar6 == param_7 && iVar3 != iVar9) {
      *local_68 = cVar7;
      local_60 = local_60 + 1;
      cVar7 = '\0';
    }
    else {
      uVar11 = 0xff;
      if (uVar6 < 0x80) {
        uVar11 = std::priv::__digit_val_table(uVar6);
      }
      if (param_3 <= (int)uVar11) break;
      bVar1 = (uint)uVar13 < local_58;
      if (local_5c != uVar10) {
        bVar1 = uVar10 < local_5c;
      }
      cVar7 = cVar7 + '\x01';
      local_7c = local_7c + 1;
      if (bVar1) {
        bVar8 = true;
      }
      else {
        lVar14 = __muldi3(local_58,local_5c,param_3,param_3 >> 0x1f);
        lVar14 = lVar14 + (ulonglong)uVar11;
        uVar6 = (uint)((ulonglong)lVar14 >> 0x20);
        bVar1 = local_58 < (uint)lVar14;
        if (uVar6 != local_5c) {
          bVar1 = local_5c < uVar6;
        }
        bVar8 = (bool)(bVar8 | (lVar2 != 0 && !bVar1));
      }
    }
    piVar4 = (int *)*param_1;
    if ((uint)piVar4[2] < (uint)piVar4[3]) {
      piVar4[2] = piVar4[2] + 4;
    }
    else {
      (**(code **)(*piVar4 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 9) = 0;
    uVar6 = local_70;
    lVar2 = lVar14;
  }
  if ((iVar3 != iVar9) && (local_60 != 0)) {
    *local_68 = cVar7;
    local_68 = acStack_54 + local_60 + 1;
  }
  if (0 < local_7c) {
    if (bVar8) {
      *param_4 = 0xffffffff;
      param_4[1] = 0xffffffff;
      return 0;
    }
    uVar6 = -local_58;
    if (param_6 == 0) {
      uVar6 = local_58;
    }
    *param_4 = uVar6;
    uVar6 = -(uint)(local_58 != 0) - local_5c;
    if (param_6 == 0) {
      uVar6 = local_5c;
    }
    param_4[1] = uVar6;
    if (iVar3 != iVar9) {
      local_70 = std::priv::__valid_grouping
                           (acStack_54,local_68,*(char **)(param_8 + 0x14),
                            *(char **)(param_8 + 0x10));
    }
    return local_70;
  }
  return 0;
}



### FUNC FUN_000488bc @ 000488bc

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_000488bc(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 longdouble *param_6)

{
  locale *this;
  undefined4 uVar1;
  undefined4 uVar2;
  int iVar3;
  int *piVar4;
  int iVar5;
  uint uVar6;
  undefined1 *local_134 [4];
  undefined1 **local_124;
  undefined1 local_120;
  undefined1 auStack_11f [256];
  undefined1 auStack_1f [3];
  undefined1 **local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  uVar2 = std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<wchar_t>::id);
  __aeabi_memclr(auStack_11f,0x100);
  local_120 = 0;
  local_134[0] = auStack_1f;
  local_124 = (undefined1 **)&local_120;
  local_1c = (undefined1 **)&local_120;
  iVar3 = FUN_00047bcc(local_134,param_2,param_3,uVar1,uVar2);
  uVar6 = 4;
  if (iVar3 == 1) {
    uVar6 = 0;
    std::priv::__string_to_float((__basic_iostring *)local_134,param_6);
  }
  *param_5 = uVar6;
  piVar4 = (int *)*param_2;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar4[2] < (int *)piVar4[3]) {
      iVar3 = *(int *)piVar4[2];
    }
    else {
      iVar3 = (**(code **)(*piVar4 + 0x20))();
    }
    param_2[1] = iVar3;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar3 == -1;
  }
  piVar4 = (int *)*param_3;
  if ((piVar4 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar4[2] < (int *)piVar4[3]) {
      iVar3 = *(int *)piVar4[2];
    }
    else {
      iVar3 = (**(code **)(*piVar4 + 0x20))();
    }
    param_3[1] = iVar3;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar3 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    *param_5 = *param_5 | 2;
  }
  iVar3 = param_2[1];
  iVar5 = param_2[2];
  *param_1 = *param_2;
  param_1[1] = iVar3;
  param_1[2] = iVar5;
  if (((local_1c != local_134) && (local_1c != (undefined1 **)0x0)) &&
     ((undefined1 **)&local_120 != local_1c)) {
    if ((uint)((int)local_134[0] - (int)local_1c) < 0x81) {
      std::__node_alloc::_M_deallocate(local_1c,(int)local_134[0] - (int)local_1c);
    }
    else {
      operator_delete(local_1c);
    }
  }
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00048a34 @ 00048a34

void FUN_00048a34(int *param_1,int *param_2,int *param_3,int param_4,uint *param_5,
                 undefined4 *param_6)

{
  locale *this;
  undefined4 uVar1;
  uint uVar2;
  int *piVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  undefined1 auStack_34 [4];
  int local_30 [5];
  int *local_1c;
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_4 + 0x20));
  uVar1 = std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  uVar2 = FUN_00046858(param_2,param_3,*(undefined4 *)(param_4 + 4),uVar1);
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    uVar5 = 4;
    if ((uVar2 & 1) != 0) {
      uVar5 = 0;
      *param_6 = 0;
      param_6[1] = 0;
    }
  }
  else {
    piVar3 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<wchar_t>::id);
    uVar1 = (**(code **)(*piVar3 + 0xc))(piVar3);
    (**(code **)(*piVar3 + 0x10))(local_30,piVar3);
    iVar4 = FUN_00048c38(param_2,param_3,(int)uVar2 >> 2,param_6,uVar2 & 1,(uVar2 & 2) != 0,uVar1,
                         local_30,auStack_34);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if ((uint)(local_30[0] - (int)local_1c) < 0x81) {
        std::__node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      }
      else {
        operator_delete(local_1c);
      }
    }
    uVar5 = 0;
    if (iVar4 == 0) {
      uVar5 = 4;
    }
  }
  *param_5 = uVar5;
  piVar3 = (int *)*param_2;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_2 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_2[1] = iVar4;
    *(undefined1 *)((int)param_2 + 9) = 1;
    *(bool *)(param_2 + 2) = iVar4 == -1;
  }
  piVar3 = (int *)*param_3;
  if ((piVar3 != (int *)0x0) && (*(char *)((int)param_3 + 9) == '\0')) {
    if ((int *)piVar3[2] < (int *)piVar3[3]) {
      iVar4 = *(int *)piVar3[2];
    }
    else {
      iVar4 = (**(code **)(*piVar3 + 0x20))();
    }
    param_3[1] = iVar4;
    *(undefined1 *)((int)param_3 + 9) = 1;
    *(bool *)(param_3 + 2) = iVar4 == -1;
  }
  if ((char)param_2[2] == (char)param_3[2]) {
    *param_5 = *param_5 | 2;
  }
  iVar4 = param_2[1];
  iVar6 = param_2[2];
  *param_1 = *param_2;
  param_1[1] = iVar4;
  param_1[2] = iVar6;
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_00048c38 @ 00048c38

uint FUN_00048c38(int *param_1,int *param_2,int param_3,uint *param_4,int param_5,int param_6,
                 uint param_7,int param_8)

{
  bool bVar1;
  int iVar2;
  int *piVar3;
  int iVar4;
  uint uVar5;
  char cVar6;
  bool bVar7;
  int iVar8;
  uint uVar9;
  uint uVar10;
  char *pcVar11;
  uint uVar12;
  uint uVar13;
  char cVar14;
  undefined8 uVar15;
  undefined8 uVar16;
  uint local_a0;
  int local_70;
  uint local_68;
  int local_60;
  uint local_5c;
  uint local_58;
  char acStack_54 [64];
  
  iVar8 = *(int *)(param_8 + 0x10);
  iVar2 = *(int *)(param_8 + 0x14);
  local_68 = 1;
  local_a0 = 0x80000000;
  uVar15 = __aeabi_ldivmod();
  uVar9 = (uint)((ulonglong)uVar15 >> 0x20);
  local_70 = param_5;
  cVar6 = '\0';
  local_58 = 0;
  local_5c = 0;
  local_60 = 0;
  bVar7 = false;
  uVar5 = (uint)(*(char *)((int)param_1 + 9) == '\0');
  while( true ) {
    pcVar11 = acStack_54 + local_60;
    piVar3 = (int *)*param_1;
    if ((piVar3 != (int *)0x0) && (uVar5 != 0)) {
      if ((int *)piVar3[2] < (int *)piVar3[3]) {
        iVar4 = *(int *)piVar3[2];
      }
      else {
        iVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      param_1[1] = iVar4;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = iVar4 == -1;
    }
    piVar3 = (int *)*param_2;
    if ((piVar3 == (int *)0x0) || (*(char *)((int)param_2 + 9) != '\0')) {
      cVar14 = (char)param_2[2];
    }
    else {
      if ((int *)piVar3[2] < (int *)piVar3[3]) {
        iVar4 = *(int *)piVar3[2];
      }
      else {
        iVar4 = (**(code **)(*piVar3 + 0x20))();
      }
      param_2[1] = iVar4;
      *(undefined1 *)((int)param_2 + 9) = 1;
      cVar14 = iVar4 == -1;
      *(char *)(param_2 + 2) = cVar14;
    }
    if ((char)param_1[2] == cVar14) break;
    if (*(char *)((int)param_1 + 9) == '\0') {
      piVar3 = (int *)*param_1;
      if ((uint *)piVar3[2] < (uint *)piVar3[3]) {
        uVar5 = *(uint *)piVar3[2];
      }
      else {
        uVar5 = (**(code **)(*piVar3 + 0x20))();
      }
      param_1[1] = uVar5;
      *(undefined1 *)((int)param_1 + 9) = 1;
      *(bool *)(param_1 + 2) = uVar5 == 0xffffffff;
    }
    else {
      uVar5 = param_1[1];
    }
    uVar10 = local_5c;
    uVar13 = local_58;
    if (uVar5 == param_7 && iVar2 != iVar8) {
      *pcVar11 = cVar6;
      local_60 = local_60 + 1;
      cVar6 = '\0';
    }
    else {
      uVar12 = 0xff;
      if (uVar5 < 0x80) {
        uVar12 = std::priv::__digit_val_table(uVar5);
      }
      if (param_3 <= (int)uVar12) break;
      bVar1 = local_58 < (uint)uVar15;
      if (local_5c != uVar9) {
        bVar1 = (int)local_5c < (int)uVar9;
      }
      cVar6 = cVar6 + '\x01';
      local_70 = local_70 + 1;
      if (bVar1) {
        bVar7 = true;
      }
      else {
        uVar16 = __muldi3(local_58,local_5c,param_3,param_3 >> 0x1f);
        uVar13 = (uint)uVar16 - uVar12;
        uVar10 = (int)((ulonglong)uVar16 >> 0x20) - (uint)((uint)uVar16 < uVar12);
        bVar1 = uVar13 < local_58;
        if (uVar10 != local_5c) {
          bVar1 = (int)uVar10 < (int)local_5c;
        }
        bVar7 = (bool)(bVar7 | ((local_58 != 0 || local_5c != 0) && !bVar1));
      }
    }
    piVar3 = (int *)*param_1;
    if ((uint)piVar3[2] < (uint)piVar3[3]) {
      piVar3[2] = piVar3[2] + 4;
    }
    else {
      (**(code **)(*piVar3 + 0x24))();
    }
    *(undefined1 *)((int)param_1 + 9) = 0;
    uVar5 = local_68;
    local_5c = uVar10;
    local_58 = uVar13;
  }
  if ((iVar2 != iVar8) && (local_60 != 0)) {
    *pcVar11 = cVar6;
    pcVar11 = acStack_54 + local_60 + 1;
  }
  uVar5 = 0;
  if (0 < local_70) {
    if (bVar7) {
      uVar5 = 0;
      if (param_6 == 0) {
        uVar5 = 0xffffffff;
      }
      *param_4 = uVar5;
      if (param_6 == 0) {
        local_a0 = 0x7fffffff;
      }
      param_4[1] = local_a0;
      return 0;
    }
    uVar5 = local_58;
    if (param_6 == 0) {
      uVar5 = -local_58;
    }
    *param_4 = uVar5;
    if (param_6 == 0) {
      local_5c = -(uint)(local_58 != 0) - local_5c;
    }
    param_4[1] = local_5c;
    uVar5 = local_68;
    if (iVar2 != iVar8) {
      uVar5 = std::priv::__valid_grouping
                        (acStack_54,pcVar11,*(char **)(param_8 + 0x14),*(char **)(param_8 + 0x10));
    }
  }
  return uVar5;
}



### FUNC FUN_00048ea6 @ 00048ea6

void FUN_00048ea6(facet *param_1)

{
  std::locale::facet::~facet(param_1);
  operator_delete(param_1);
  return;
}



### FUNC FUN_00048f08 @ 00048f08

void FUN_00048f08(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 int param_5,undefined4 param_6,undefined4 param_7)

{
  undefined4 uVar1;
  undefined4 uVar2;
  undefined1 auStack_16 [2];
  
  uVar2 = *(undefined4 *)(param_5 + 4);
  uVar1 = FUN_00041ecc(auStack_16,uVar2,param_7);
  FUN_000493e4(param_1,uVar1,auStack_16,param_3,param_4,param_5,uVar2,param_6);
  return;
}



### FUNC FUN_00048f42 @ 00048f42

void FUN_00048f42(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 int param_5,undefined4 param_6,undefined4 param_7)

{
  undefined4 uVar1;
  undefined4 uVar2;
  undefined1 auStack_16 [2];
  
  uVar2 = *(undefined4 *)(param_5 + 4);
  uVar1 = FUN_000424fc(auStack_16,uVar2,param_7);
  FUN_000493e4(param_1,uVar1,auStack_16,param_3,param_4,param_5,uVar2,param_6);
  return;
}



### FUNC FUN_00048f7c @ 00048f7c

void FUN_00048f7c(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6)

{
  FUN_0004992c(param_1,param_3,param_4,param_5,param_6);
  return;
}



### FUNC FUN_00048fa0 @ 00048fa0

void FUN_00048fa0(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6)

{
  FUN_00049ee0(param_1,param_3,param_4,param_5,param_6);
  return;
}



### FUNC FUN_00048fc4 @ 00048fc4

void FUN_00048fc4(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 int param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8)

{
  undefined4 uVar1;
  undefined4 uVar2;
  undefined1 auStack_16 [2];
  
  uVar2 = *(undefined4 *)(param_5 + 4);
  uVar1 = FUN_00042c10(auStack_16,uVar2,param_7,param_8);
  FUN_000493e4(param_1,uVar1,auStack_16,param_3,param_4,param_5,uVar2,param_6);
  return;
}



### FUNC FUN_00049000 @ 00049000

void FUN_00049000(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 int param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8)

{
  undefined4 uVar1;
  undefined4 uVar2;
  undefined1 auStack_16 [2];
  
  uVar2 = *(undefined4 *)(param_5 + 4);
  uVar1 = FUN_00042d68(auStack_16,uVar2,param_7,param_8);
  FUN_000493e4(param_1,uVar1,auStack_16,param_3,param_4,param_5,uVar2,param_6);
  return;
}



### FUNC FUN_0004903c @ 0004903c

void FUN_0004903c(undefined4 param_1,undefined4 param_2,int *param_3,uint param_4,int param_5,
                 undefined4 param_6,int param_7)

{
  bool bVar1;
  locale *this;
  int *piVar2;
  undefined4 uVar3;
  int iVar4;
  int iVar5;
  int *piVar6;
  undefined4 uVar7;
  uint uVar8;
  undefined4 uVar9;
  uint local_28;
  locale alStack_24 [14];
  undefined1 auStack_16 [2];
  
  this = (locale *)std::locale::locale(alStack_24,(locale *)(param_5 + 0x20));
  piVar2 = (int *)std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  std::locale::~locale(alStack_24);
  uVar3 = 10;
  *(undefined4 *)(param_5 + 0x1c) = 10;
  uVar8 = *(uint *)(param_5 + 4);
  *(uint *)(param_5 + 4) = uVar8 & 0xfffffdc0 | 0x214;
  local_28 = param_4;
  if (param_7 == 0) {
    if ((int)(uVar8 << 0x11) < 0) {
      iVar4 = std::priv::__hex_char_table_hi();
    }
    else {
      iVar4 = std::priv::__hex_char_table_lo();
    }
    iVar5 = (**(code **)(*piVar2 + 0x28))(piVar2,0x30);
    bVar1 = true;
    if ((param_4 & 0xff) != 0) {
      piVar6 = (int *)param_3[5];
      if (piVar6 < (int *)param_3[6]) {
        param_3[5] = (int)(piVar6 + 1);
        *piVar6 = iVar5;
      }
      else {
        iVar5 = (**(code **)(*param_3 + 0x34))(param_3);
      }
      bVar1 = true;
      if (iVar5 != -1) {
        bVar1 = false;
      }
    }
    iVar4 = (**(code **)(*piVar2 + 0x28))(piVar2,*(undefined1 *)(iVar4 + 0x10));
    local_28 = 0;
    if (!bVar1) {
      piVar6 = (int *)param_3[5];
      if (piVar6 < (int *)param_3[6]) {
        param_3[5] = (int)(piVar6 + 1);
        *piVar6 = iVar4;
      }
      else {
        iVar4 = (**(code **)(*param_3 + 0x34))(param_3);
      }
      local_28 = 1;
      if (iVar4 == -1) {
        local_28 = 0;
      }
    }
    local_28 = param_4 & 0xffffff00 | local_28;
    uVar3 = 8;
  }
  *(undefined4 *)(param_5 + 0x1c) = uVar3;
  uVar3 = (**(code **)(*piVar2 + 0x28))(piVar2,0x30);
  uVar9 = *(undefined4 *)(param_5 + 4);
  uVar7 = FUN_000424fc(auStack_16,uVar9,param_7);
  FUN_000493e4(param_1,uVar7,auStack_16,param_3,local_28,param_5,uVar9,uVar3);
  *(uint *)(param_5 + 4) = uVar8;
  return;
}



### FUNC FUN_00049168 @ 00049168

void FUN_00049168(undefined4 *param_1,int *param_2,uint param_3,int param_4,int param_5,int param_6)

{
  locale *this;
  int *piVar1;
  uint uVar2;
  int *piVar3;
  uint uVar4;
  int iVar5;
  code *pcVar6;
  uint uVar7;
  int iVar8;
  uint uVar9;
  uint local_60;
  int local_5c [16];
  int local_1c;
  int *local_18;
  
  this = (locale *)std::locale::locale((locale *)local_5c,(locale *)(param_4 + 0x20));
  piVar1 = (int *)std::locale::_M_use_facet(this,(id *)&std::numpunct<wchar_t>::id);
  std::locale::~locale((locale *)local_5c);
  if (param_6 == 1) {
    pcVar6 = *(code **)(*piVar1 + 0x14);
  }
  else {
    pcVar6 = *(code **)(*piVar1 + 0x18);
  }
  (*pcVar6)(local_5c,piVar1);
  uVar9 = *(uint *)(param_4 + 0x1c);
  local_60 = 0;
  *(undefined4 *)(param_4 + 0x1c) = 0;
  uVar4 = local_1c - (int)local_18;
  uVar7 = (int)uVar4 >> 2;
  if (uVar7 < uVar9) {
    if ((*(uint *)(param_4 + 4) & 7) == 1) {
      uVar2 = param_3;
      if (0 < (int)uVar4) {
        iVar8 = (uVar4 >> 2) + 1;
        piVar1 = local_18;
        uVar4 = param_3;
        do {
          uVar2 = 0;
          if ((uVar4 & 0xff) != 0) {
            iVar5 = *piVar1;
            piVar3 = (int *)param_2[5];
            if (piVar3 < (int *)param_2[6]) {
              param_2[5] = (int)(piVar3 + 1);
              *piVar3 = iVar5;
            }
            else {
              iVar5 = (**(code **)(*param_2 + 0x34))(param_2);
            }
            uVar2 = (uint)(iVar5 != -1);
          }
          iVar8 = iVar8 + -1;
          piVar1 = piVar1 + 1;
          uVar4 = uVar2;
        } while (1 < iVar8);
      }
      param_3 = uVar2 & 0xff | param_3 & 0xffffff00;
      if (0 < (int)(uVar9 - uVar7)) {
        iVar8 = (uVar9 + 1) - uVar7;
        do {
          uVar4 = 0;
          if ((param_3 & 0xff) != 0) {
            piVar1 = (int *)param_2[5];
            if (piVar1 < (int *)param_2[6]) {
              param_2[5] = (int)(piVar1 + 1);
              *piVar1 = param_5;
              iVar5 = param_5;
            }
            else {
              iVar5 = (**(code **)(*param_2 + 0x34))(param_2,param_5);
            }
            uVar4 = 1;
            if (iVar5 == -1) {
              uVar4 = 0;
            }
          }
          param_3 = param_3 & 0xffffff00 | uVar4;
          iVar8 = iVar8 + -1;
        } while (1 < iVar8);
      }
    }
    else {
      uVar4 = param_3;
      if (0 < (int)(uVar9 - uVar7)) {
        iVar8 = (uVar9 + 1) - uVar7;
        uVar7 = param_3;
        do {
          uVar4 = 0;
          if ((uVar7 & 0xff) != 0) {
            piVar1 = (int *)param_2[5];
            if (piVar1 < (int *)param_2[6]) {
              param_2[5] = (int)(piVar1 + 1);
              *piVar1 = param_5;
              iVar5 = param_5;
            }
            else {
              iVar5 = (**(code **)(*param_2 + 0x34))(param_2,param_5);
            }
            uVar4 = 1;
            if (iVar5 == -1) {
              uVar4 = 0;
            }
          }
          iVar8 = iVar8 + -1;
          uVar7 = uVar4;
        } while (1 < iVar8);
      }
      param_3 = uVar4 & 0xff | param_3 & 0xffffff00;
      if (0 < local_1c - (int)local_18) {
        iVar8 = ((uint)(local_1c - (int)local_18) >> 2) + 1;
        piVar1 = local_18;
        do {
          uVar4 = 0;
          if ((param_3 & 0xff) != 0) {
            iVar5 = *piVar1;
            piVar3 = (int *)param_2[5];
            if (piVar3 < (int *)param_2[6]) {
              param_2[5] = (int)(piVar3 + 1);
              *piVar3 = iVar5;
            }
            else {
              iVar5 = (**(code **)(*param_2 + 0x34))(param_2);
            }
            uVar4 = 1;
            if (iVar5 == -1) {
              uVar4 = 0;
            }
          }
          param_3 = param_3 & 0xffffff00 | uVar4;
          iVar8 = iVar8 + -1;
          piVar1 = piVar1 + 1;
        } while (1 < iVar8);
      }
    }
  }
  else if (0 < (int)uVar4) {
    iVar8 = (uVar4 >> 2) + 1;
    piVar1 = local_18;
    do {
      uVar4 = local_60;
      if ((param_3 & 0xff) != 0) {
        iVar5 = *piVar1;
        piVar3 = (int *)param_2[5];
        if (piVar3 < (int *)param_2[6]) {
          param_2[5] = (int)(piVar3 + 1);
          *piVar3 = iVar5;
        }
        else {
          iVar5 = (**(code **)(*param_2 + 0x34))(param_2);
        }
        uVar4 = 1;
        if (iVar5 == -1) {
          uVar4 = 0;
        }
      }
      param_3 = param_3 & 0xffffff00 | uVar4;
      iVar8 = iVar8 + -1;
      piVar1 = piVar1 + 1;
    } while (1 < iVar8);
  }
  *param_1 = param_2;
  param_1[1] = param_3;
  if ((local_18 != local_5c) && (local_18 != (int *)0x0)) {
    if (0x80 < (uint)(local_5c[0] - (int)local_18)) {
      operator_delete(local_18);
      return;
    }
    std::__node_alloc::_M_deallocate(local_18,local_5c[0] - (int)local_18);
  }
  return;
}



### FUNC FUN_000493e4 @ 000493e4

void FUN_000493e4(undefined4 param_1,int param_2,int param_3,undefined4 param_4,undefined4 param_5,
                 int param_6,uint param_7,undefined4 param_8)

{
  locale *this;
  int *piVar1;
  undefined4 uVar2;
  undefined4 uVar3;
  undefined4 uVar4;
  undefined1 uVar5;
  int local_130 [4];
  int *local_120;
  int *local_11c;
  undefined1 auStack_118 [256];
  locale alStack_18 [4];
  
  this = (locale *)std::locale::locale(alStack_18,(locale *)(param_6 + 0x20));
  piVar1 = (int *)std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  uVar2 = (**(code **)(*piVar1 + 0x28))(piVar1,0x2b);
  uVar3 = (**(code **)(*piVar1 + 0x28))(piVar1,0x2d);
  (**(code **)(*piVar1 + 0x2c))(piVar1,param_2,param_3,auStack_118);
  param_3 = param_3 - param_2;
  piVar1 = (int *)std::locale::_M_use_facet(alStack_18,(id *)&std::numpunct<wchar_t>::id);
  (**(code **)(*piVar1 + 0x10))(local_130,piVar1);
  if (local_11c != local_120) {
    uVar5 = 0;
    if ((int)(param_7 << 0x16) < 0) {
      uVar5 = 2;
      if ((param_7 & 0x38) != 0x10) {
        uVar5 = (param_7 & 0x38) == 0x20;
      }
    }
    uVar4 = (**(code **)(*piVar1 + 0xc))(piVar1);
    param_3 = FUN_00050274(auStack_118,auStack_118 + param_3 * 4,local_130,uVar4,uVar2,uVar3,uVar5);
  }
  uVar4 = *(undefined4 *)(param_6 + 0x1c);
  *(undefined4 *)(param_6 + 0x1c) = 0;
  FUN_0004953c(param_1,auStack_118,param_3,param_4,param_5,param_7,uVar4,param_8,uVar2,uVar3);
  if ((local_11c != local_130) && (local_11c != (int *)0x0)) {
    if ((uint)(local_130[0] - (int)local_11c) < 0x81) {
      std::__node_alloc::_M_deallocate(local_11c,local_130[0] - (int)local_11c);
    }
    else {
      operator_delete(local_11c);
    }
  }
  std::locale::~locale(alStack_18);
  return;
}



### FUNC FUN_0004953c @ 0004953c

void FUN_0004953c(undefined4 *param_1,int *param_2,int param_3,int *param_4,uint param_5,
                 uint param_6,int param_7,int param_8,int param_9,int param_10)

{
  uint uVar1;
  int *piVar2;
  int iVar3;
  bool bVar4;
  int iVar5;
  uint uVar6;
  int iVar7;
  bool bVar8;
  
  if (param_3 < param_7) {
    iVar5 = param_7 - param_3;
    if ((param_6 & 7) == 1) {
      uVar1 = param_5;
      if (0 < param_3 * 4) {
        iVar7 = param_3 + 1;
        uVar6 = param_5;
        do {
          uVar1 = 0;
          if ((uVar6 & 0xff) != 0) {
            iVar3 = *param_2;
            piVar2 = (int *)param_4[5];
            if (piVar2 < (int *)param_4[6]) {
              param_4[5] = (int)(piVar2 + 1);
              *piVar2 = iVar3;
            }
            else {
              iVar3 = (**(code **)(*param_4 + 0x34))(param_4);
            }
            uVar1 = (uint)(iVar3 != -1);
          }
          iVar7 = iVar7 + -1;
          param_2 = param_2 + 1;
          uVar6 = uVar1;
        } while (1 < iVar7);
      }
      param_5 = param_5 & 0xffffff00 | uVar1 & 0xff;
      if (0 < iVar5) {
        param_3 = (param_7 + 1) - param_3;
        do {
          uVar1 = 0;
          if ((param_5 & 0xff) != 0) {
            piVar2 = (int *)param_4[5];
            if (piVar2 < (int *)param_4[6]) {
              param_4[5] = (int)(piVar2 + 1);
              *piVar2 = param_8;
              iVar5 = param_8;
            }
            else {
              iVar5 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
            }
            uVar1 = (uint)(iVar5 != -1);
          }
          param_5 = param_5 & 0xffffff00 | uVar1;
          param_3 = param_3 + -1;
        } while (1 < param_3);
      }
    }
    else if (((param_3 == 0) || ((param_6 & 7) != 4)) ||
            ((iVar7 = *param_2, iVar7 != param_9 && (iVar7 != param_10)))) {
      if ((param_3 < 2) || ((param_6 & 0x23f) != 0x214)) {
        uVar1 = param_5;
        if (0 < iVar5) {
          iVar5 = (param_7 + 1) - param_3;
          uVar6 = param_5;
          do {
            uVar1 = 0;
            if ((uVar6 & 0xff) != 0) {
              piVar2 = (int *)param_4[5];
              if (piVar2 < (int *)param_4[6]) {
                param_4[5] = (int)(piVar2 + 1);
                *piVar2 = param_8;
                iVar7 = param_8;
              }
              else {
                iVar7 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
              }
              uVar1 = (uint)(iVar7 != -1);
            }
            iVar5 = iVar5 + -1;
            uVar6 = uVar1;
          } while (1 < iVar5);
        }
        param_5 = param_5 & 0xffffff00 | uVar1 & 0xff;
        if (0 < param_3 * 4) {
          param_3 = param_3 + 1;
          do {
            uVar1 = 0;
            if ((param_5 & 0xff) != 0) {
              iVar5 = *param_2;
              piVar2 = (int *)param_4[5];
              if (piVar2 < (int *)param_4[6]) {
                param_4[5] = (int)(piVar2 + 1);
                *piVar2 = iVar5;
              }
              else {
                iVar5 = (**(code **)(*param_4 + 0x34))(param_4);
              }
              uVar1 = (uint)(iVar5 != -1);
            }
            param_5 = param_5 & 0xffffff00 | uVar1;
            param_3 = param_3 + -1;
            param_2 = param_2 + 1;
          } while (1 < param_3);
        }
      }
      else {
        bVar8 = false;
        if ((param_5 & 0xff) != 0) {
          iVar7 = *param_2;
          piVar2 = (int *)param_4[5];
          if (piVar2 < (int *)param_4[6]) {
            param_4[5] = (int)(piVar2 + 1);
            *piVar2 = iVar7;
          }
          else {
            iVar7 = (**(code **)(*param_4 + 0x34))(param_4);
          }
          if (iVar7 != -1) {
            iVar7 = param_2[1];
            piVar2 = (int *)param_4[5];
            if (piVar2 < (int *)param_4[6]) {
              param_4[5] = (int)(piVar2 + 1);
              *piVar2 = iVar7;
            }
            else {
              iVar7 = (**(code **)(*param_4 + 0x34))(param_4);
            }
            bVar8 = iVar7 != -1;
          }
        }
        if (0 < iVar5) {
          iVar5 = (param_7 + 1) - param_3;
          bVar4 = bVar8;
          do {
            bVar8 = false;
            if (bVar4 != false) {
              piVar2 = (int *)param_4[5];
              if (piVar2 < (int *)param_4[6]) {
                param_4[5] = (int)(piVar2 + 1);
                *piVar2 = param_8;
                iVar7 = param_8;
              }
              else {
                iVar7 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
              }
              bVar8 = iVar7 != -1;
            }
            iVar5 = iVar5 + -1;
            bVar4 = bVar8;
          } while (1 < iVar5);
        }
        param_5 = param_5 & 0xffffff00 | (uint)bVar8;
        uVar1 = param_3 * 4 - 8;
        if (0 < (int)uVar1) {
          param_2 = param_2 + 2;
          iVar5 = (uVar1 >> 2) + 1;
          do {
            uVar1 = 0;
            if ((param_5 & 0xff) != 0) {
              iVar7 = *param_2;
              piVar2 = (int *)param_4[5];
              if (piVar2 < (int *)param_4[6]) {
                param_4[5] = (int)(piVar2 + 1);
                *piVar2 = iVar7;
              }
              else {
                iVar7 = (**(code **)(*param_4 + 0x34))(param_4);
              }
              uVar1 = (uint)(iVar7 != -1);
            }
            param_5 = param_5 & 0xffffff00 | uVar1;
            iVar5 = iVar5 + -1;
            param_2 = param_2 + 1;
          } while (1 < iVar5);
        }
      }
    }
    else {
      bVar8 = false;
      if ((param_5 & 0xff) != 0) {
        piVar2 = (int *)param_4[5];
        if (piVar2 < (int *)param_4[6]) {
          param_4[5] = (int)(piVar2 + 1);
          *piVar2 = iVar7;
        }
        else {
          iVar7 = (**(code **)(*param_4 + 0x34))(param_4);
        }
        bVar8 = true;
        if (iVar7 == -1) {
          bVar8 = false;
        }
      }
      if (0 < iVar5) {
        iVar5 = (param_7 + 1) - param_3;
        bVar4 = bVar8;
        do {
          bVar8 = false;
          if (bVar4 != false) {
            piVar2 = (int *)param_4[5];
            if (piVar2 < (int *)param_4[6]) {
              param_4[5] = (int)(piVar2 + 1);
              *piVar2 = param_8;
              iVar7 = param_8;
            }
            else {
              iVar7 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
            }
            bVar8 = iVar7 != -1;
          }
          iVar5 = iVar5 + -1;
          bVar4 = bVar8;
        } while (1 < iVar5);
      }
      param_5 = param_5 & 0xffffff00 | (uint)bVar8;
      uVar1 = param_3 * 4 - 4;
      if (0 < (int)uVar1) {
        iVar5 = (uVar1 >> 2) + 1;
        do {
          param_2 = param_2 + 1;
          uVar1 = 0;
          if ((param_5 & 0xff) != 0) {
            iVar7 = *param_2;
            piVar2 = (int *)param_4[5];
            if (piVar2 < (int *)param_4[6]) {
              param_4[5] = (int)(piVar2 + 1);
              *piVar2 = iVar7;
            }
            else {
              iVar7 = (**(code **)(*param_4 + 0x34))(param_4);
            }
            uVar1 = (uint)(iVar7 != -1);
          }
          param_5 = param_5 & 0xffffff00 | uVar1;
          iVar5 = iVar5 + -1;
        } while (1 < iVar5);
      }
    }
  }
  else if (0 < param_3 * 4) {
    param_3 = param_3 + 1;
    do {
      uVar1 = 0;
      if ((param_5 & 0xff) != 0) {
        iVar5 = *param_2;
        piVar2 = (int *)param_4[5];
        if (piVar2 < (int *)param_4[6]) {
          param_4[5] = (int)(piVar2 + 1);
          *piVar2 = iVar5;
        }
        else {
          iVar5 = (**(code **)(*param_4 + 0x34))(param_4);
        }
        uVar1 = (uint)(iVar5 != -1);
      }
      param_5 = param_5 & 0xffffff00 | uVar1;
      param_3 = param_3 + -1;
      param_2 = param_2 + 1;
    } while (1 < param_3);
  }
  *param_1 = param_4;
  param_1[1] = param_5;
  return;
}



### FUNC FUN_0004992c @ 0004992c

void FUN_0004992c(undefined4 param_1,undefined4 param_2,undefined4 param_3,int param_4)

{
  locale *this;
  int *piVar1;
  undefined1 **ppuVar2;
  undefined4 **local_14c;
  int local_148 [5];
  int *local_134;
  undefined1 *local_130 [4];
  undefined1 **local_120;
  undefined1 local_11c;
  undefined1 auStack_11b [256];
  undefined1 auStack_1b [3];
  undefined1 **local_18;
  
  __aeabi_memclr(auStack_11b,0x100,param_3,&local_14c);
  local_11c = 0;
  local_130[0] = auStack_1b;
  local_14c = &local_18;
  local_120 = (undefined1 **)&local_11c;
  local_18 = (undefined1 **)&local_11c;
  FUN_00051490(local_130,*(undefined4 *)(param_4 + 4),*(undefined4 *)(param_4 + 0x18));
  this = (locale *)std::locale::locale((locale *)local_148,(locale *)(param_4 + 0x20));
  piVar1 = (int *)std::locale::_M_use_facet(this,(id *)&std::numpunct<wchar_t>::id);
  std::locale::~locale((locale *)local_148);
  (**(code **)(*piVar1 + 8))(piVar1);
  (**(code **)(*piVar1 + 0xc))(piVar1);
  (**(code **)(*piVar1 + 0x10))(local_148,piVar1);
  FUN_00049a8c(param_1,local_130,param_2,param_3);
  if ((local_134 != local_148) && (local_134 != (int *)0x0)) {
    if ((uint)(local_148[0] - (int)local_134) < 0x81) {
      std::__node_alloc::_M_deallocate(local_134,local_148[0] - (int)local_134);
    }
    else {
      operator_delete(local_134);
    }
  }
  ppuVar2 = (undefined1 **)*local_14c;
  if (((ppuVar2 != local_130) && (ppuVar2 != (undefined1 **)0x0)) &&
     ((undefined1 **)&local_11c != ppuVar2)) {
    if (0x80 < (uint)((int)local_130[0] - (int)ppuVar2)) {
      operator_delete(ppuVar2);
      return;
    }
    std::__node_alloc::_M_deallocate(ppuVar2,(int)local_130[0] - (int)ppuVar2);
  }
  return;
}



### FUNC FUN_00049a8c @ 00049a8c

/* WARNING: Restarted to delay deadcode elimination for space: stack */

void FUN_00049a8c(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
                 int param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,
                 undefined4 param_9,int param_10)

{
  undefined4 **ppuVar1;
  undefined4 **ppuVar2;
  locale *this;
  int *piVar3;
  undefined4 uVar4;
  undefined4 uVar5;
  undefined4 uVar6;
  undefined4 uVar7;
  undefined4 **local_460 [16];
  undefined4 **local_420;
  undefined4 *local_41c;
  undefined1 auStack_418 [1024];
  undefined4 **local_18;
  
  this = (locale *)std::locale::locale((locale *)local_460,(locale *)(param_5 + 0x20));
  piVar3 = (int *)std::locale::_M_use_facet(this,(id *)&std::ctype<wchar_t>::id);
  std::locale::~locale((locale *)local_460);
  __aeabi_memclr4(auStack_418,0x400);
  local_41c = (undefined4 **)0x0;
  local_460[0] = &local_18;
  local_420 = &local_41c;
  local_18 = &local_41c;
  FUN_00051848(param_2,local_460,piVar3,param_7,1);
  if (*(int *)(param_10 + 0x14) != *(int *)(param_10 + 0x10)) {
    uVar4 = (**(code **)(*piVar3 + 0x28))(piVar3,0x2b);
    uVar5 = (**(code **)(*piVar3 + 0x28))(piVar3,0x2d);
    FUN_0005031c(local_460,param_9,param_10,param_8,uVar4,uVar5,0);
  }
  ppuVar2 = local_18;
  ppuVar1 = local_420;
  uVar4 = *(undefined4 *)(param_5 + 0x1c);
  *(undefined4 *)(param_5 + 0x1c) = 0;
  uVar7 = *(undefined4 *)(param_5 + 4);
  uVar5 = (**(code **)(*piVar3 + 0x28))(piVar3,0x2b);
  uVar6 = (**(code **)(*piVar3 + 0x28))(piVar3,0x2d);
  FUN_00049c20(param_1,ppuVar2,ppuVar1,param_3,param_4,uVar7,uVar4,param_6,uVar5,uVar6);
  if ((((undefined4 ***)local_18 != local_460) && ((undefined4 ***)local_18 != (undefined4 ***)0x0))
     && (&local_41c != local_18)) {
    if ((uint)((int)local_460[0] - (int)local_18) < 0x81) {
      std::__node_alloc::_M_deallocate(local_18,(int)local_460[0] - (int)local_18);
    }
    else {
      operator_delete(local_18);
    }
  }
  return;
}



### FUNC FUN_00049c20 @ 00049c20

undefined4 *
FUN_00049c20(undefined4 *param_1,int *param_2,int *param_3,int *param_4,uint param_5,uint param_6,
            int param_7,int param_8,int param_9,int param_10)

{
  uint uVar1;
  int *piVar2;
  int iVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  int iVar7;
  uint uVar8;
  int *local_18;
  
  uVar1 = (int)param_3 - (int)param_2;
  iVar6 = (int)uVar1 >> 2;
  if (iVar6 < param_7) {
    iVar3 = param_7 - iVar6;
    if ((param_6 & 7) == 4) {
      if ((param_2 != param_3) && ((iVar7 = *param_2, iVar7 == param_9 || (iVar7 == param_10)))) {
        param_2 = param_2 + 1;
        uVar1 = 0;
        if ((param_5 & 0xff) != 0) {
          piVar2 = (int *)param_4[5];
          if (piVar2 < (int *)param_4[6]) {
            param_4[5] = (int)(piVar2 + 1);
            *piVar2 = iVar7;
          }
          else {
            iVar7 = (**(code **)(*param_4 + 0x34))(param_4);
          }
          uVar1 = 1;
          if (iVar7 == -1) {
            uVar1 = 0;
          }
        }
        if (0 < iVar3) {
          iVar6 = (param_7 + 1) - iVar6;
          uVar5 = uVar1;
          do {
            uVar1 = 0;
            if (uVar5 != 0) {
              piVar2 = (int *)param_4[5];
              if (piVar2 < (int *)param_4[6]) {
                param_4[5] = (int)(piVar2 + 1);
                *piVar2 = param_8;
                iVar3 = param_8;
              }
              else {
                iVar3 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
              }
              uVar1 = 1;
              if (iVar3 == -1) {
                uVar1 = 0;
              }
            }
            iVar6 = iVar6 + -1;
            uVar5 = uVar1;
          } while (1 < iVar6);
        }
        param_5 = param_5 & 0xffffff00 | uVar1;
        if (0 < (int)param_3 - (int)param_2) {
          iVar6 = ((uint)((int)param_3 - (int)param_2) >> 2) + 1;
          do {
            uVar1 = 0;
            if ((param_5 & 0xff) != 0) {
              iVar3 = *param_2;
              piVar2 = (int *)param_4[5];
              if (piVar2 < (int *)param_4[6]) {
                param_4[5] = (int)(piVar2 + 1);
                *piVar2 = iVar3;
              }
              else {
                iVar3 = (**(code **)(*param_4 + 0x34))(param_4);
              }
              uVar1 = 1;
              if (iVar3 == -1) {
                uVar1 = 0;
              }
            }
            param_5 = param_5 & 0xffffff00 | uVar1;
            iVar6 = iVar6 + -1;
            param_2 = param_2 + 1;
          } while (1 < iVar6);
        }
        goto LAB_00049e02;
      }
    }
    else if ((param_6 & 7) == 1) {
      uVar5 = param_5;
      if (0 < (int)uVar1) {
        iVar7 = (uVar1 >> 2) + 1;
        uVar1 = param_5;
        local_18 = param_2;
        do {
          uVar5 = 0;
          if ((uVar1 & 0xff) != 0) {
            iVar4 = *local_18;
            piVar2 = (int *)param_4[5];
            if (piVar2 < (int *)param_4[6]) {
              param_4[5] = (int)(piVar2 + 1);
              *piVar2 = iVar4;
            }
            else {
              iVar4 = (**(code **)(*param_4 + 0x34))(param_4);
            }
            uVar5 = 1;
            if (iVar4 == -1) {
              uVar5 = 0;
            }
          }
          iVar7 = iVar7 + -1;
          local_18 = local_18 + 1;
          uVar1 = uVar5;
        } while (1 < iVar7);
      }
      param_5 = param_5 & 0xffffff00 | uVar5 & 0xff;
      if (0 < iVar3) {
        iVar6 = (param_7 + 1) - iVar6;
        do {
          uVar1 = 0;
          if ((param_5 & 0xff) != 0) {
            piVar2 = (int *)param_4[5];
            if (piVar2 < (int *)param_4[6]) {
              param_4[5] = (int)(piVar2 + 1);
              *piVar2 = param_8;
              iVar3 = param_8;
            }
            else {
              iVar3 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
            }
            uVar1 = 1;
            if (iVar3 == -1) {
              uVar1 = 0;
            }
          }
          param_5 = param_5 & 0xffffff00 | uVar1;
          iVar6 = iVar6 + -1;
        } while (1 < iVar6);
      }
      goto LAB_00049e02;
    }
    uVar5 = param_5;
    if (0 < iVar3) {
      iVar6 = (param_7 + 1) - iVar6;
      uVar8 = param_5;
      do {
        uVar5 = 0;
        if ((uVar8 & 0xff) != 0) {
          piVar2 = (int *)param_4[5];
          if (piVar2 < (int *)param_4[6]) {
            param_4[5] = (int)(piVar2 + 1);
            *piVar2 = param_8;
            iVar3 = param_8;
          }
          else {
            iVar3 = (**(code **)(*param_4 + 0x34))(param_4,param_8);
          }
          uVar5 = 1;
          if (iVar3 == -1) {
            uVar5 = 0;
          }
        }
        iVar6 = iVar6 + -1;
        uVar8 = uVar5;
      } while (1 < iVar6);
    }
    param_5 = param_5 & 0xffffff00 | uVar5 & 0xff;
    if (0 < (int)uVar1) {
      iVar6 = (uVar1 >> 2) + 1;
      do {
        uVar1 = 0;
        if ((param_5 & 0xff) != 0) {
          iVar3 = *param_2;
          piVar2 = (int *)param_4[5];
          if (piVar2 < (int *)param_4[6]) {
            param_4[5] = (int)(piVar2 + 1);
            *piVar2 = iVar3;
          }
          else {
            iVar3 = (**(code **)(*param_4 + 0x34))(param_4);
          }
          uVar1 = 1;
          if (iVar3 == -1) {
            uVar1 = 0;
          }
        }
        param_5 = param_5 & 0xffffff00 | uVar1;
        iVar6 = iVar6 + -1;
        param_2 = param_2 + 1;
      } while (1 < iVar6);
    }
  }
  else if (0 < (int)uVar1) {
    iVar6 = (uVar1 >> 2) + 1;
    do {
      uVar1 = 0;
      if ((param_5 & 0xff) != 0) {
        iVar3 = *param_2;
        piVar2 = (int *)param_4[5];
        if (piVar2 < (int *)param_4[6]) {
          param_4[5] = (int)(piVar2 + 1);
          *piVar2 = iVar3;
        }
        else {
          iVar3 = (**(code **)(*param_4 + 0x34))(param_4);
        }
        uVar1 = 1;
        if (iVar3 == -1) {
          uVar1 = 0;
        }
      }
      param_5 = param_5 & 0xffffff00 | uVar1;
      iVar6 = iVar6 + -1;
      param_2 = param_2 + 1;
    } while (1 < iVar6);
  }
LAB_00049e02:
  *param_1 = param_4;
  param_1[1] = param_5;
  return param_1 + 2;
}



### FUNC FUN_00049ee0 @ 00049ee0

void FUN_00049ee0(undefined4 param_1,undefined4 param_2,undefined4 param_3,int param_4)

{
  locale *this;
  int *piVar1;
  undefined1 **ppuVar2;
  undefined4 **local_14c;
  int local_148 [5];
  int *local_134;
  undefined1 *local_130 [4];
  undefined1 **local_120;
  undefined1 local_11c;
  undefined1 auStack_11b [256];
  undefined1 auStack_1b [3];
  undefined1 **local_18;
  
  __aeabi_memclr(auStack_11b,0x100,param_3,&local_14c);
  local_11c = 0;
  local_130[0] = auStack_1b;
  local_14c = &local_18;
  local_120 = (undefined1 **)&local_11c;
  local_18 = (undefined1 **)&local_11c;
  FUN_00051642(local_130,*(undefined4 *)(param_4 + 4),*(undefined4 *)(param_4 + 0x18));
  this = (locale *)std::locale::locale((locale *)local_148,(locale *)(param_4 + 0x20));
  piVar1 = (int *)std::locale::_M_use_facet(this,(id *)&std::numpunct<wchar_t>::id);
  std::locale::~locale((locale *)local_148);
  (**(code **)(*piVar1 + 8))(piVar1);
  (**(code **)(*piVar1 + 0xc))(piVar1);
  (**(code **)(*piVar1 + 0x10))(local_148,piVar1);
  FUN_00049a8c(param_1,local_130,param_2,param_3);
  if ((local_134 != local_148) && (local_134 != (int *)0x0)) {
    if ((uint)(local_148[0] - (int)local_134) < 0x81) {
      std::__node_alloc::_M_deallocate(local_134,local_148[0] - (int)local_134);
    }
    else {
      operator_delete(local_134);
    }
  }
  ppuVar2 = (undefined1 **)*local_14c;
  if (((ppuVar2 != local_130) && (ppuVar2 != (undefined1 **)0x0)) &&
     ((undefined1 **)&local_11c != ppuVar2)) {
    if (0x80 < (uint)((int)local_130[0] - (int)ppuVar2)) {
      operator_delete(ppuVar2);
      return;
    }
    std::__node_alloc::_M_deallocate(ppuVar2,(int)local_130[0] - (int)ppuVar2);
  }
  return;
}



### FUNC FUN_0004a040 @ 0004a040

void FUN_0004a040(int *param_1,int param_2,int param_3)

{
  void *pvVar1;
  int iVar2;
  uint uVar3;
  void *pvVar4;
  undefined4 uVar5;
  uint uVar6;
  uint uVar7;
  int iVar8;
  uint local_18;
  
  uVar7 = param_3 - param_2;
  uVar6 = (int)uVar7 >> 2;
  iVar8 = *param_1;
  if ((uint)(param_1[2] - iVar8 >> 2) < uVar6) {
    if (uVar6 >> 0x1e != 0) {
      FUN_00030824(4);
      uVar5 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
      FUN_000309e0(uVar5,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
    }
    local_18 = uVar7;
    if (uVar7 < 0x81) {
      pvVar1 = (void *)std::__node_alloc::_M_allocate(&local_18);
      uVar3 = local_18;
    }
    else {
      pvVar1 = operator_new(uVar7);
      uVar3 = uVar7;
    }
    if (param_3 != param_2) {
      __aeabi_memcpy(pvVar1,param_2,uVar7);
    }
    pvVar4 = (void *)*param_1;
    if (pvVar4 != (void *)0x0) {
      if ((uint)(param_1[2] - (int)pvVar4) < 0x81) {
        std::__node_alloc::_M_deallocate(pvVar4,param_1[2] - (int)pvVar4);
      }
      else {
        operator_delete(pvVar4);
      }
    }
    *param_1 = (int)pvVar1;
    param_1[1] = (int)((int)pvVar1 + uVar6 * 4);
    param_1[2] = (int)pvVar1 + (uVar3 & 0xfffffffc);
    return;
  }
  iVar2 = param_1[1];
  uVar3 = iVar2 - iVar8 >> 2;
  param_1 = param_1 + 1;
  if (uVar6 <= uVar3) {
    if (uVar7 != 0) {
      __aeabi_memmove(iVar8,param_2,uVar7);
      iVar8 = iVar8 + uVar7;
    }
    *param_1 = iVar8;
    return;
  }
  param_2 = param_2 + uVar3 * 4;
  if (iVar2 - iVar8 != 0) {
    __aeabi_memmove(iVar8);
    iVar2 = *param_1;
  }
  if (param_2 != param_3) {
    __aeabi_memcpy(iVar2,param_2,param_3 - param_2);
    iVar2 = iVar2 + (param_3 - param_2);
  }
  *param_1 = iVar2;
  return;
}



### FUNC FUN_0004a144 @ 0004a144

void FUN_0004a144(void)

{
  FUN_0004a180();
  return;
}



### FUNC FUN_0004a180 @ 0004a180

undefined4
FUN_0004a180(undefined4 *param_1,undefined4 param_2,undefined4 param_3,code *param_4,code *param_5,
            code *param_6,undefined4 *param_7,undefined4 *param_8)

{
  char *pcVar1;
  char *pcVar2;
  int iVar3;
  void *pvVar4;
  undefined4 uVar5;
  int local_54;
  char local_50;
  int *local_40;
  int local_3c [5];
  int *local_28;
  undefined4 local_24;
  undefined4 local_20;
  undefined1 auStack_1c [4];
  int local_18;
  
  *param_8 = 0;
  if (*(char *)*param_1 == '\0') {
    pcVar2 = (char *)(*param_6)(param_2);
    *param_1 = pcVar2;
    pcVar1 = "C";
    if ((pcVar2 == (char *)0x0) || (*pcVar2 == '\0')) goto LAB_0004a1c0;
  }
  else {
    pcVar1 = (char *)(*param_4)((char *)*param_1,param_2,param_3);
    if (pcVar1 == (char *)0x0) {
      return 0;
    }
LAB_0004a1c0:
    *param_1 = pcVar1;
    pcVar2 = pcVar1;
  }
  FUN_00031c38(&local_54,pcVar2,auStack_1c);
  FUN_00036f1c(local_3c,&local_54);
  local_20 = 0;
  local_24 = 0;
  if ((local_40 != &local_54) && (local_40 != (int *)0x0)) {
    if ((uint)(local_54 - (int)local_40) < 0x81) {
      std::__node_alloc::_M_deallocate(local_40,local_54 - (int)local_40);
    }
    else {
      operator_delete(local_40);
    }
  }
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070dc0);
  pvVar4 = (void *)*param_7;
  if (pvVar4 == (void *)0x0) {
    pvVar4 = operator_new(0x1c);
    FUN_0004a8a8(pvVar4,0,&local_54,&local_18,auStack_1c);
    *param_7 = pvVar4;
  }
  FUN_0004aba0(&local_54,pvVar4,local_3c);
  if (local_50 != '\0') {
    iVar3 = (*param_5)(*param_1,param_3,param_8);
    *(int *)(local_54 + 0x1c) = iVar3;
    if (iVar3 == 0) {
      local_18 = local_54;
      FUN_0004ad36(*param_7,&local_18);
      uVar5 = 0;
      goto LAB_0004a26e;
    }
  }
  *(int *)(local_54 + 0x20) = *(int *)(local_54 + 0x20) + 1;
  uVar5 = *(undefined4 *)(local_54 + 0x1c);
LAB_0004a26e:
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070dc0);
  if ((local_28 != local_3c) && (local_28 != (int *)0x0)) {
    if ((uint)(local_3c[0] - (int)local_28) < 0x81) {
      std::__node_alloc::_M_deallocate(local_28,local_3c[0] - (int)local_28);
    }
    else {
      operator_delete(local_28);
    }
  }
  return uVar5;
}



### FUNC FUN_0004a320 @ 0004a320

void FUN_0004a320(void)

{
  FUN_0004d8c4();
  return;
}



### FUNC FUN_0004a32a @ 0004a32a

void FUN_0004a32a(void)

{
  FUN_0004d960();
  return;
}



### FUNC FUN_0004a334 @ 0004a334

void FUN_0004a334(void)

{
  FUN_0004a180();
  return;
}



### FUNC FUN_0004a370 @ 0004a370

void FUN_0004a370(void)

{
  FUN_0004d8da();
  return;
}



### FUNC FUN_0004a37c @ 0004a37c

void FUN_0004a37c(void)

{
  FUN_0004a180();
  return;
}



### FUNC FUN_0004a3b8 @ 0004a3b8

void FUN_0004a3b8(void)

{
  FUN_0004d8f0();
  return;
}



### FUNC FUN_0004a3c2 @ 0004a3c2

void FUN_0004a3c2(void)

{
  FUN_0004d968();
  return;
}



### FUNC FUN_0004a3cc @ 0004a3cc

void FUN_0004a3cc(void)

{
  FUN_0004a180();
  return;
}



### FUNC FUN_0004a408 @ 0004a408

void FUN_0004a408(void)

{
  FUN_0004d906();
  return;
}



### FUNC FUN_0004a412 @ 0004a412

void FUN_0004a412(void)

{
  FUN_0004d970();
  return;
}



### FUNC FUN_0004a41c @ 0004a41c

void FUN_0004a41c(void)

{
  FUN_0004a180();
  return;
}



### FUNC FUN_0004a458 @ 0004a458

void FUN_0004a458(void)

{
  FUN_0004d91c();
  return;
}



### FUNC FUN_0004a462 @ 0004a462

void FUN_0004a462(void)

{
  FUN_0004d978();
  return;
}



### FUNC FUN_0004a46c @ 0004a46c

void FUN_0004a46c(void)

{
  FUN_0004a180();
  return;
}



### FUNC FUN_0004a4a8 @ 0004a4a8

void FUN_0004a4a8(void)

{
  FUN_0004d932();
  return;
}



### FUNC FUN_0004a4b2 @ 0004a4b2

void FUN_0004a4b2(void)

{
  FUN_0004d980();
  return;
}



### FUNC FUN_0004a4bc @ 0004a4bc

void FUN_0004a4bc(void)

{
  FUN_0004a180();
  return;
}



### FUNC FUN_0004a4f8 @ 0004a4f8

void FUN_0004a4f8(void)

{
  FUN_0004d948();
  return;
}



### FUNC FUN_0004a502 @ 0004a502

void FUN_0004a502(void)

{
  FUN_0004d988();
  return;
}



### FUNC FUN_0004a50c @ 0004a50c

void FUN_0004a50c(int param_1)

{
  int iVar1;
  int iVar2;
  int local_120;
  undefined1 auStack_11c [260];
  int local_18;
  int local_14;
  
  iVar1 = DAT_00070dc4;
  if ((param_1 != 0) && (DAT_00070dc4 != 0)) {
    local_120 = FUN_0004d990(param_1,auStack_11c);
    if (local_120 != 0) {
      pthread_mutex_lock((pthread_mutex_t *)&DAT_00070dc0);
      FUN_0004b1b0(&local_18,iVar1,&local_120);
      if ((local_18 != 0) &&
         (iVar2 = *(int *)(local_18 + 0x20) + -1, *(int *)(local_18 + 0x20) = iVar2, iVar2 == 0)) {
        FUN_0004d9c8(*(undefined4 *)(local_18 + 0x1c));
        local_14 = local_18;
        FUN_0004ad36(iVar1,&local_14);
      }
      pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070dc0);
    }
  }
  return;
}



### FUNC FUN_0004a590 @ 0004a590

void FUN_0004a590(int param_1)

{
  int iVar1;
  int iVar2;
  int local_120;
  undefined1 auStack_11c [260];
  int local_18;
  int local_14;
  
  iVar1 = DAT_00070dc8;
  if ((param_1 != 0) && (DAT_00070dc8 != 0)) {
    local_120 = FUN_0004d998(param_1,auStack_11c);
    if (local_120 != 0) {
      pthread_mutex_lock((pthread_mutex_t *)&DAT_00070dc0);
      FUN_0004b1b0(&local_18,iVar1,&local_120);
      if ((local_18 != 0) &&
         (iVar2 = *(int *)(local_18 + 0x20) + -1, *(int *)(local_18 + 0x20) = iVar2, iVar2 == 0)) {
        FUN_0004d9ca(*(undefined4 *)(local_18 + 0x1c));
        local_14 = local_18;
        FUN_0004ad36(iVar1,&local_14);
      }
      pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070dc0);
    }
  }
  return;
}



### FUNC FUN_0004a614 @ 0004a614

void FUN_0004a614(int param_1)

{
  int iVar1;
  int iVar2;
  int local_120;
  undefined1 auStack_11c [260];
  int local_18;
  int local_14;
  
  iVar1 = DAT_00070dcc;
  if ((param_1 != 0) && (DAT_00070dcc != 0)) {
    local_120 = FUN_0004d9a0(param_1,auStack_11c);
    if (local_120 != 0) {
      pthread_mutex_lock((pthread_mutex_t *)&DAT_00070dc0);
      FUN_0004b1b0(&local_18,iVar1,&local_120);
      if ((local_18 != 0) &&
         (iVar2 = *(int *)(local_18 + 0x20) + -1, *(int *)(local_18 + 0x20) = iVar2, iVar2 == 0)) {
        FUN_0004d9cc(*(undefined4 *)(local_18 + 0x1c));
        local_14 = local_18;
        FUN_0004ad36(iVar1,&local_14);
      }
      pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070dc0);
    }
  }
  return;
}



### FUNC FUN_0004a698 @ 0004a698

void FUN_0004a698(int param_1)

{
  int iVar1;
  int iVar2;
  int local_120;
  undefined1 auStack_11c [260];
  int local_18;
  int local_14;
  
  iVar1 = DAT_00070dd0;
  if ((param_1 != 0) && (DAT_00070dd0 != 0)) {
    local_120 = FUN_0004d9a8(param_1,auStack_11c);
    if (local_120 != 0) {
      pthread_mutex_lock((pthread_mutex_t *)&DAT_00070dc0);
      FUN_0004b1b0(&local_18,iVar1,&local_120);
      if ((local_18 != 0) &&
         (iVar2 = *(int *)(local_18 + 0x20) + -1, *(int *)(local_18 + 0x20) = iVar2, iVar2 == 0)) {
        FUN_0004d9ce(*(undefined4 *)(local_18 + 0x1c));
        local_14 = local_18;
        FUN_0004ad36(iVar1,&local_14);
      }
      pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070dc0);
    }
  }
  return;
}



### FUNC FUN_0004a71c @ 0004a71c

void FUN_0004a71c(int param_1)

{
  int iVar1;
  int iVar2;
  int local_120;
  undefined1 auStack_11c [260];
  int local_18;
  int local_14;
  
  iVar1 = DAT_00070dd4;
  if ((param_1 != 0) && (DAT_00070dd4 != 0)) {
    local_120 = FUN_0004d9b0(param_1,auStack_11c);
    if (local_120 != 0) {
      pthread_mutex_lock((pthread_mutex_t *)&DAT_00070dc0);
      FUN_0004b1b0(&local_18,iVar1,&local_120);
      if ((local_18 != 0) &&
         (iVar2 = *(int *)(local_18 + 0x20) + -1, *(int *)(local_18 + 0x20) = iVar2, iVar2 == 0)) {
        FUN_0004d9d0(*(undefined4 *)(local_18 + 0x1c));
        local_14 = local_18;
        FUN_0004ad36(iVar1,&local_14);
      }
      pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070dc0);
    }
  }
  return;
}



### FUNC FUN_0004a7a0 @ 0004a7a0

void FUN_0004a7a0(int param_1)

{
  int iVar1;
  int iVar2;
  int local_120;
  undefined1 auStack_11c [260];
  int local_18;
  int local_14;
  
  iVar1 = DAT_00070dd8;
  if ((param_1 != 0) && (DAT_00070dd8 != 0)) {
    local_120 = FUN_0004d9b8(param_1,auStack_11c);
    if (local_120 != 0) {
      pthread_mutex_lock((pthread_mutex_t *)&DAT_00070dc0);
      FUN_0004b1b0(&local_18,iVar1,&local_120);
      if ((local_18 != 0) &&
         (iVar2 = *(int *)(local_18 + 0x20) + -1, *(int *)(local_18 + 0x20) = iVar2, iVar2 == 0)) {
        FUN_0004d9d2(*(undefined4 *)(local_18 + 0x1c));
        local_14 = local_18;
        FUN_0004ad36(iVar1,&local_14);
      }
      pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070dc0);
    }
  }
  return;
}



### FUNC FUN_0004a824 @ 0004a824

void FUN_0004a824(int param_1)

{
  int iVar1;
  int iVar2;
  int local_120;
  undefined1 auStack_11c [260];
  int local_18;
  int local_14;
  
  iVar1 = DAT_00070ddc;
  if ((param_1 != 0) && (DAT_00070ddc != 0)) {
    local_120 = FUN_0004d9c0(param_1,auStack_11c);
    if (local_120 != 0) {
      pthread_mutex_lock((pthread_mutex_t *)&DAT_00070dc0);
      FUN_0004b1b0(&local_18,iVar1,&local_120);
      if ((local_18 != 0) &&
         (iVar2 = *(int *)(local_18 + 0x20) + -1, *(int *)(local_18 + 0x20) = iVar2, iVar2 == 0)) {
        FUN_0004d9d4(*(undefined4 *)(local_18 + 0x1c));
        local_14 = local_18;
        FUN_0004ad36(iVar1,&local_14);
      }
      pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070dc0);
    }
  }
  return;
}



### FUNC FUN_0004a8a8 @ 0004a8a8

int FUN_0004a8a8(int param_1,uint param_2)

{
  int *piVar1;
  int iVar2;
  int *piVar3;
  uint uVar4;
  uint uVar5;
  undefined4 local_18;
  
  *(undefined4 *)(param_1 + 4) = 0;
  *(undefined4 *)(param_1 + 8) = 0;
  *(undefined4 *)(param_1 + 0xc) = 0;
  *(undefined4 *)(param_1 + 0x10) = 0;
  *(undefined4 *)(param_1 + 0x14) = 0;
  *(undefined4 *)(param_1 + 0x18) = 0x3f800000;
  piVar1 = &DAT_0006537c;
  uVar5 = 0x1e;
  while (uVar4 = uVar5, 0 < (int)uVar4) {
    uVar5 = uVar4 >> 1;
    if ((uint)piVar1[uVar5] < param_2) {
      piVar1 = piVar1 + uVar5 + 1;
      uVar5 = (uVar4 - 1) - uVar5;
    }
  }
  piVar3 = &DAT_000653f0;
  if (piVar1 != (int *)&DAT_000653f4) {
    piVar3 = piVar1;
  }
  iVar2 = *piVar3;
  FUN_0004a990(param_1 + 8,iVar2 + 1);
  local_18 = 0;
  FUN_0004aa50(param_1 + 8,iVar2 + 1,&local_18);
  return param_1;
}



### FUNC FUN_0004a990 @ 0004a990

void FUN_0004a990(int *param_1,uint param_2)

{
  void *pvVar1;
  void *pvVar2;
  int iVar3;
  int iVar4;
  int iVar5;
  uint local_1c;
  uint local_18;
  
  iVar5 = *param_1;
  if ((uint)(param_1[2] - iVar5 >> 2) < param_2) {
    if (param_2 >> 0x1e != 0) {
                    /* WARNING: Subroutine does not return */
      std::__stl_throw_length_error("vector");
    }
    iVar4 = param_1[1];
    iVar3 = iVar4 - iVar5;
    if (iVar5 == 0) {
      param_2 = param_2 << 2;
      local_1c = param_2;
      if (param_2 < 0x81) {
        pvVar1 = (void *)std::__node_alloc::_M_allocate(&local_1c);
      }
      else {
        pvVar1 = operator_new(param_2);
        local_1c = param_2;
      }
      param_2 = local_1c >> 2;
    }
    else {
      param_2 = param_2 << 2;
      local_18 = param_2;
      if (param_2 < 0x81) {
        pvVar1 = (void *)std::__node_alloc::_M_allocate(&local_18);
        param_2 = local_18;
      }
      else {
        pvVar1 = operator_new(param_2);
      }
      param_2 = param_2 >> 2;
      if (iVar4 != iVar5) {
        __aeabi_memcpy(pvVar1,iVar5,iVar3);
      }
      pvVar2 = (void *)*param_1;
      if (pvVar2 != (void *)0x0) {
        if ((uint)(param_1[2] - (int)pvVar2) < 0x81) {
          std::__node_alloc::_M_deallocate(pvVar2,param_1[2] - (int)pvVar2);
        }
        else {
          operator_delete(pvVar2);
        }
      }
    }
    *param_1 = (int)pvVar1;
    param_1[1] = (int)((int)pvVar1 + (iVar3 >> 2) * 4);
    param_1[2] = (int)((int)pvVar1 + param_2 * 4);
  }
  return;
}



### FUNC FUN_0004aa50 @ 0004aa50

/* WARNING: Removing unreachable block (ram,0x0004aaf6) */

void FUN_0004aa50(undefined4 *param_1,uint param_2,undefined4 *param_3)

{
  void *pvVar1;
  uint uVar2;
  undefined4 *puVar3;
  undefined4 uVar4;
  int iVar5;
  undefined4 *puVar6;
  undefined4 *puVar7;
  int iVar8;
  undefined1 auStack_24 [4];
  void *local_20;
  undefined4 local_1c;
  int local_18;
  
  puVar7 = (undefined4 *)*param_1;
  if ((uint)(param_1[2] - (int)puVar7 >> 2) < param_2) {
    FUN_0004ab14(&local_20,param_2,param_3,auStack_24);
    pvVar1 = (void *)*param_1;
    *param_1 = local_20;
    uVar4 = param_1[1];
    param_1[1] = local_1c;
    iVar5 = param_1[2];
    param_1[2] = local_18;
    if (pvVar1 != (void *)0x0) {
      local_20 = pvVar1;
      local_1c = uVar4;
      local_18 = iVar5;
      if (0x80 < (uint)(iVar5 - (int)pvVar1)) {
        operator_delete(pvVar1);
        return;
      }
      std::__node_alloc::_M_deallocate(pvVar1,iVar5 - (int)pvVar1);
      return;
    }
  }
  else {
    puVar6 = (undefined4 *)param_1[1];
    uVar2 = (int)puVar6 - (int)puVar7;
    if ((uint)((int)uVar2 >> 2) < param_2) {
      if (0 < (int)uVar2) {
        iVar5 = (uVar2 >> 2) + 1;
        do {
          *puVar7 = *param_3;
          puVar7 = puVar7 + 1;
          iVar5 = iVar5 + -1;
        } while (1 < iVar5);
        puVar7 = (undefined4 *)*param_1;
        puVar6 = (undefined4 *)param_1[1];
      }
      iVar8 = (int)puVar6 - (int)puVar7 >> 2;
      iVar5 = param_2 - iVar8;
      puVar7 = puVar6 + iVar5;
      if (0 < iVar5 * 4) {
        iVar8 = (param_2 + 1) - iVar8;
        do {
          *puVar6 = *param_3;
          puVar6 = puVar6 + 1;
          iVar8 = iVar8 + -1;
        } while (1 < iVar8);
      }
      param_1[1] = puVar7;
      return;
    }
    puVar3 = puVar7;
    uVar2 = param_2;
    if (param_2 != 0) {
      do {
        *puVar3 = *param_3;
        uVar2 = uVar2 - 1;
        puVar3 = puVar3 + 1;
      } while (uVar2 != 0);
      puVar7 = puVar7 + param_2;
      puVar6 = (undefined4 *)param_1[1];
    }
    if (puVar7 != puVar6) {
      param_1[1] = puVar7;
    }
  }
  return;
}



### FUNC FUN_0004ab14 @ 0004ab14

undefined4 * FUN_0004ab14(undefined4 *param_1,uint param_2,undefined4 *param_3)

{
  undefined4 *puVar1;
  undefined4 uVar2;
  undefined4 *puVar3;
  int iVar4;
  uint uVar5;
  uint local_18;
  
  *param_1 = 0;
  param_1[1] = 0;
  param_1[2] = 0;
  if (param_2 >> 0x1e == 0) {
    if (param_2 == 0) {
      *param_1 = 0;
      param_1[1] = 0;
      param_1[2] = 0;
      puVar3 = (undefined4 *)0x0;
    }
    else {
      uVar5 = param_2 * 4;
      local_18 = uVar5;
      if (uVar5 < 0x81) {
        puVar1 = (undefined4 *)std::__node_alloc::_M_allocate(&local_18);
      }
      else {
        puVar1 = (undefined4 *)operator_new(uVar5);
        local_18 = uVar5;
      }
      *param_1 = puVar1;
      param_1[1] = puVar1;
      param_1[2] = (int)puVar1 + (local_18 & 0xfffffffc);
      puVar3 = puVar1 + param_2;
      if (0 < (int)uVar5) {
        iVar4 = param_2 + 1;
        do {
          *puVar1 = *param_3;
          puVar1 = puVar1 + 1;
          iVar4 = iVar4 + -1;
        } while (1 < iVar4);
      }
    }
    param_1[1] = puVar3;
    return param_1;
  }
  FUN_00030824(4);
  uVar2 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(uVar2,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
}



### FUNC FUN_0004aba0 @ 0004aba0

void FUN_0004aba0(undefined4 *param_1,int param_2,int param_3)

{
  int iVar1;
  undefined1 uVar2;
  int extraout_r1;
  int iVar3;
  undefined4 *puVar4;
  byte *__s2;
  byte *pbVar5;
  uint uVar6;
  size_t sVar7;
  int iVar8;
  int *piVar9;
  int iVar10;
  int *piVar11;
  int *piVar12;
  size_t __n;
  int *piVar13;
  int local_18;
  
  __s2 = *(byte **)(param_3 + 0x14);
  __n = *(int *)(param_3 + 0x10) - (int)__s2;
  iVar10 = *(int *)(param_2 + 8);
  iVar1 = 0;
  if (__n != 0) {
    iVar1 = 0;
    pbVar5 = __s2;
    sVar7 = __n;
    do {
      iVar1 = iVar1 * 5 + (uint)*pbVar5;
      pbVar5 = pbVar5 + 1;
      sVar7 = sVar7 - 1;
    } while (sVar7 != 0);
  }
  __aeabi_uidivmod(iVar1,(*(int *)(param_2 + 0xc) - iVar10 >> 2) + -1);
  iVar1 = extraout_r1 * 4;
  piVar11 = *(int **)(iVar10 + iVar1);
  iVar8 = iVar10 + iVar1;
  piVar9 = *(int **)(iVar8 + 4);
  piVar12 = piVar11;
  if (piVar11 == piVar9) {
    iVar3 = iVar8;
    if (piVar11 == *(int **)(param_2 + 4)) {
      local_18 = 0;
      piVar12 = (int *)(param_2 + 4);
    }
    else {
      do {
        piVar12 = *(int **)(iVar3 + -4);
        iVar3 = iVar3 + -4;
      } while (piVar11 == piVar12);
      local_18 = (iVar3 - iVar10 >> 2) + 1;
      piVar9 = (int *)*piVar12;
      if ((((piVar11 != piVar9) && (piVar13 = (int *)*piVar9, piVar12 = piVar9, piVar11 != piVar13))
          && (piVar9 = (int *)*piVar13, piVar12 = piVar13, piVar11 != piVar9)) &&
         (piVar13 = (int *)*piVar9, piVar12 = piVar9, piVar11 != piVar13)) {
        for (piVar9 = (int *)*piVar13; piVar12 = piVar13, piVar11 != piVar9; piVar9 = (int *)*piVar9
            ) {
          piVar13 = (int *)*piVar13;
        }
      }
    }
    piVar9 = (int *)FUN_0004ace4((int *)(param_2 + 4),param_3);
    *piVar9 = *piVar12;
    *piVar12 = (int)piVar9;
    puVar4 = (undefined4 *)(iVar10 + local_18 * 4);
    uVar6 = (iVar8 + 4) - (int)puVar4;
    if (0 < (int)uVar6) {
      iVar10 = (uVar6 >> 2) + 1;
      do {
        *puVar4 = piVar9;
        puVar4 = puVar4 + 1;
        iVar10 = iVar10 + -1;
      } while (1 < iVar10);
    }
    *(int *)(param_2 + 0x14) = *(int *)(param_2 + 0x14) + 1;
    piVar12 = *(int **)(*(int *)(param_2 + 8) + iVar1);
    uVar2 = 1;
  }
  else {
    do {
      if (piVar12[5] - piVar12[6] == __n) {
        iVar1 = memcmp((void *)piVar12[6],__s2,__n);
        uVar2 = 0;
        if (iVar1 == 0) goto LAB_0004acdc;
      }
      piVar12 = (int *)*piVar12;
    } while (piVar9 != piVar12);
    piVar12 = (int *)FUN_0004ace4(param_2 + 4,param_3);
    *piVar12 = *piVar11;
    *piVar11 = (int)piVar12;
    *(int *)(param_2 + 0x14) = *(int *)(param_2 + 0x14) + 1;
    uVar2 = 1;
  }
LAB_0004acdc:
  *(undefined1 *)(param_1 + 1) = uVar2;
  *param_1 = piVar12;
  return;
}



### FUNC FUN_0004ace4 @ 0004ace4

undefined4 * FUN_0004ace4(undefined4 param_1,int param_2)

{
  undefined4 *puVar1;
  undefined4 uVar2;
  uint local_14;
  
  local_14 = 0x24;
  puVar1 = (undefined4 *)std::__node_alloc::_M_allocate(&local_14);
  FUN_00036f1c(puVar1 + 1,param_2);
  puVar1[7] = *(undefined4 *)(param_2 + 0x18);
  uVar2 = *(undefined4 *)(param_2 + 0x1c);
  *puVar1 = 0;
  puVar1[8] = uVar2;
  return puVar1;
}



### FUNC FUN_0004ad36 @ 0004ad36

void FUN_0004ad36(int param_1,undefined4 *param_2)

{
  int iVar1;
  int extraout_r1;
  int *piVar2;
  uint uVar3;
  byte *pbVar4;
  int *piVar5;
  int iVar6;
  int *piVar7;
  int iVar8;
  int *piVar9;
  int iVar10;
  
  piVar9 = (int *)*param_2;
  pbVar4 = (byte *)piVar9[6];
  iVar6 = piVar9[5] - (int)pbVar4;
  iVar10 = *(int *)(param_1 + 8);
  iVar1 = 0;
  if (iVar6 != 0) {
    iVar1 = 0;
    do {
      iVar1 = iVar1 * 5 + (uint)*pbVar4;
      pbVar4 = pbVar4 + 1;
      iVar6 = iVar6 + -1;
    } while (iVar6 != 0);
  }
  __aeabi_uidivmod(iVar1,(*(int *)(param_1 + 0xc) - iVar10 >> 2) + -1);
  iVar1 = extraout_r1 * 4;
  piVar2 = *(int **)(iVar10 + iVar1);
  if (piVar2 != piVar9) {
    iVar6 = 0;
    for (piVar7 = (int *)*piVar2; *(int **)(iVar10 + iVar1 + 4) != piVar7; piVar7 = (int *)*piVar7)
    {
      if (piVar9 == piVar7) {
        piVar7 = (int *)*piVar2;
        *piVar2 = *piVar7;
        piVar9 = (int *)piVar7[6];
        if ((piVar9 == piVar7 + 1) || (piVar9 == (int *)0x0)) {
          iVar6 = 1;
          if (piVar7 == (int *)0x0) break;
        }
        else {
          uVar3 = piVar7[1] - (int)piVar9;
          if (uVar3 < 0x81) {
            std::__node_alloc::_M_deallocate(piVar9,uVar3);
          }
          else {
            operator_delete(piVar9);
          }
        }
        std::__node_alloc::_M_deallocate(piVar7,0x24);
        iVar6 = 1;
        break;
      }
      piVar2 = (int *)*piVar2;
    }
    goto LAB_0004ae5e;
  }
  iVar6 = iVar10 + iVar1;
  if (piVar9 == *(int **)(param_1 + 4)) {
    iVar6 = 0;
    piVar2 = (int *)(param_1 + 4);
  }
  else {
    do {
      piVar2 = *(int **)(iVar6 + -4);
      iVar6 = iVar6 + -4;
    } while (piVar9 == piVar2);
    iVar6 = (iVar6 - iVar10 >> 2) + 1;
    piVar7 = (int *)*piVar2;
    if (((piVar9 != piVar7) && (piVar5 = (int *)*piVar7, piVar2 = piVar7, piVar9 != piVar5)) &&
       (piVar7 = (int *)*piVar5, piVar2 = piVar5, piVar9 != piVar7)) {
      piVar2 = piVar7;
      for (piVar5 = (int *)*piVar7; piVar9 != piVar5; piVar5 = (int *)*piVar5) {
        piVar2 = (int *)*piVar2;
      }
    }
  }
  piVar7 = (int *)*piVar2;
  iVar8 = *piVar7;
  *piVar2 = iVar8;
  piVar2 = (int *)(iVar10 + iVar6 * 4);
  piVar9 = (int *)piVar7[6];
  if ((piVar9 == piVar7 + 1) || (piVar9 == (int *)0x0)) {
    if (piVar7 != (int *)0x0) goto LAB_0004ae2e;
  }
  else {
    uVar3 = piVar7[1] - (int)piVar9;
    if (uVar3 < 0x81) {
      std::__node_alloc::_M_deallocate(piVar9,uVar3);
    }
    else {
      operator_delete(piVar9);
    }
LAB_0004ae2e:
    std::__node_alloc::_M_deallocate(piVar7,0x24);
  }
  uVar3 = (iVar10 + iVar1 + 4) - (int)piVar2;
  if (0 < (int)uVar3) {
    iVar1 = (uVar3 >> 2) + 1;
    do {
      *piVar2 = iVar8;
      piVar2 = piVar2 + 1;
      iVar1 = iVar1 + -1;
    } while (1 < iVar1);
  }
  iVar6 = 1;
LAB_0004ae5e:
  *(int *)(param_1 + 0x14) = *(int *)(param_1 + 0x14) - iVar6;
  FUN_0004ae70();
  return;
}



### FUNC FUN_0004ae70 @ 0004ae70

void FUN_0004ae70(int param_1)

{
  undefined4 uVar1;
  undefined4 uVar2;
  undefined4 uVar3;
  undefined4 uVar4;
  int iVar5;
  uint uVar6;
  uint uVar7;
  char *pcVar8;
  uint uVar9;
  char *pcVar10;
  
  uVar9 = (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 8) >> 2) - 1;
  uVar1 = __floatunsisf(*(undefined4 *)(param_1 + 0x14));
  uVar2 = __floatunsisf(uVar9);
  uVar2 = __divsf3(uVar1,uVar2);
  uVar3 = *(undefined4 *)(param_1 + 0x18);
  uVar4 = __mulsf3(uVar3,0x3e800000);
  iVar5 = __aeabi_fcmpgt(uVar2,uVar4);
  if (iVar5 == 0) {
    iVar5 = 0;
    uVar7 = 0x1e;
    while (uVar6 = uVar7, 0 < (int)uVar6) {
      uVar7 = uVar6 >> 1;
      if ((uint)(&DAT_0006537c)[uVar7 + iVar5] < uVar9) {
        iVar5 = uVar7 + iVar5 + 1;
        uVar7 = (uVar6 - 1) - uVar7;
      }
    }
    pcVar8 = (char *)(&DAT_0006537c + iVar5);
    if ((iVar5 * 4 == 0x78) || ((iVar5 != 0 && ((&DAT_0006537c)[iVar5] == uVar9)))) {
      pcVar8 = "St7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE" + iVar5 * 4 + 0x38;
    }
    if (pcVar8 == "\a") {
      if (uVar9 < 8) {
        return;
      }
      pcVar8 = "\a";
    }
    else {
      uVar2 = __floatunsisf(*(undefined4 *)(pcVar8 + -4));
      uVar2 = __divsf3(uVar1,uVar2);
      iVar5 = __aeabi_fcmpgt(uVar2,uVar3);
      if (iVar5 != 0) {
        return;
      }
      if (pcVar8 != "\x17") {
        do {
          pcVar10 = pcVar8 + -4;
          uVar2 = __floatunsisf(*(undefined4 *)(pcVar8 + -8));
          uVar2 = __divsf3(uVar1,uVar2);
          iVar5 = __aeabi_fcmpgt(uVar2,uVar3);
          if (iVar5 != 0) break;
          pcVar8 = pcVar10;
        } while (pcVar10 != "\x17");
      }
    }
    FUN_0004af88(param_1,*(undefined4 *)pcVar8);
  }
  return;
}



### FUNC FUN_0004af88 @ 0004af88

/* WARNING: Type propagation algorithm not settling */

void FUN_0004af88(int param_1,int param_2)

{
  uint uVar1;
  uint uVar2;
  int iVar3;
  void *pvVar4;
  undefined4 uVar5;
  int ******ppppppiVar6;
  int ******ppppppiVar7;
  int extraout_r1;
  int *******pppppppiVar8;
  int *******pppppppiVar9;
  undefined4 *puVar10;
  size_t sVar11;
  void *pvVar12;
  int *******pppppppiVar13;
  int *******pppppppiVar14;
  int *******pppppppiVar15;
  size_t __n;
  int *******pppppppiVar16;
  int *******pppppppiVar17;
  void *local_44;
  int local_40;
  void *local_28;
  int *******local_1c;
  uint local_18;
  
  local_28 = (void *)0x0;
  local_1c = (int *******)0x0;
  pppppppiVar15 = (int *******)(param_1 + 4);
  uVar1 = param_2 + 1;
  if (uVar1 >> 0x1e == 0) {
    if (uVar1 == 0) {
      local_40 = 0;
      local_44 = (void *)0x0;
    }
    else {
      uVar1 = uVar1 * 4;
      local_18 = uVar1;
      if (uVar1 < 0x81) {
        local_28 = (void *)std::__node_alloc::_M_allocate(&local_18);
        uVar2 = local_18;
      }
      else {
        local_28 = operator_new(uVar1);
        uVar2 = uVar1;
      }
      local_44 = (void *)((int)local_28 + uVar1);
      local_40 = (int)local_28 + (uVar2 & 0xfffffffc);
      if (0 < (int)uVar1) {
        iVar3 = -2 - param_2;
        if (-2 - param_2 < -1) {
          iVar3 = -2;
        }
        __aeabi_memclr4(local_28,(iVar3 + param_2) * 4 + 0xc);
      }
    }
    pppppppiVar16 = (int *******)*pppppppiVar15;
    while (pppppppiVar16 != (int *******)0x0) {
      ppppppiVar6 = pppppppiVar16[6];
      __n = (int)pppppppiVar16[5] - (int)ppppppiVar6;
      iVar3 = 0;
      if (__n != 0) {
        iVar3 = 0;
        ppppppiVar7 = ppppppiVar6;
        sVar11 = __n;
        do {
          iVar3 = iVar3 * 5 + (uint)*(byte *)ppppppiVar7;
          ppppppiVar7 = (int ******)((int)ppppppiVar7 + 1);
          sVar11 = sVar11 - 1;
        } while (sVar11 != 0);
      }
      __aeabi_uidivmod(iVar3,param_2);
      ppppppiVar7 = *pppppppiVar16;
      pppppppiVar17 = pppppppiVar16;
      while (((ppppppiVar7 != (int ******)0x0 && (__n == (int)ppppppiVar7[5] - (int)ppppppiVar7[6]))
             && (iVar3 = memcmp(ppppppiVar6,ppppppiVar7[6],__n), iVar3 == 0))) {
        ppppppiVar7 = (int ******)*ppppppiVar7;
        pppppppiVar17 = (int *******)*pppppppiVar17;
      }
      pppppppiVar13 = *(int ********)((int)local_28 + extraout_r1 * 4);
      pvVar4 = (void *)((int)local_28 + extraout_r1 * 4);
      iVar3 = 0;
      pvVar12 = pvVar4;
      pppppppiVar8 = (int *******)&local_1c;
      if (pppppppiVar13 != local_1c) {
        do {
          pppppppiVar8 = *(int ********)((int)pvVar12 + -4);
          pvVar12 = (void *)((int)pvVar12 + -4);
        } while (pppppppiVar13 == pppppppiVar8);
        iVar3 = ((int)pvVar12 - (int)local_28 >> 2) + 1;
        pppppppiVar14 = (int *******)*pppppppiVar8;
        if ((pppppppiVar13 != pppppppiVar14) &&
           (pppppppiVar9 = (int *******)*pppppppiVar14, pppppppiVar8 = pppppppiVar14,
           pppppppiVar13 != pppppppiVar9)) {
          for (pppppppiVar14 = (int *******)*pppppppiVar9; pppppppiVar8 = pppppppiVar9,
              pppppppiVar13 != pppppppiVar14; pppppppiVar14 = (int *******)*pppppppiVar14) {
            pppppppiVar9 = (int *******)*pppppppiVar9;
          }
        }
      }
      if (((pppppppiVar15 != pppppppiVar17) && (pppppppiVar15 != pppppppiVar8)) &&
         (pppppppiVar8 != pppppppiVar17)) {
        ppppppiVar6 = *pppppppiVar8;
        *pppppppiVar15 = *pppppppiVar17;
        *pppppppiVar8 = (int ******)pppppppiVar16;
        *pppppppiVar17 = ppppppiVar6;
      }
      puVar10 = (undefined4 *)((int)local_28 + iVar3 * 4);
      uVar1 = (int)pvVar4 + (4 - (int)puVar10);
      if (0 < (int)uVar1) {
        iVar3 = (uVar1 >> 2) + 1;
        do {
          *puVar10 = pppppppiVar16;
          puVar10 = puVar10 + 1;
          iVar3 = iVar3 + -1;
        } while (1 < iVar3);
      }
      pppppppiVar16 = (int *******)*pppppppiVar15;
    }
    *(int ********)(param_1 + 4) = local_1c;
    *(void **)(param_1 + 0xc) = local_44;
    pvVar12 = *(void **)(param_1 + 8);
    *(void **)(param_1 + 8) = local_28;
    iVar3 = *(int *)(param_1 + 0x10);
    *(int *)(param_1 + 0x10) = local_40;
    local_1c = pppppppiVar16;
    if (pvVar12 != (void *)0x0) {
      uVar1 = iVar3 - (int)pvVar12;
      if (uVar1 < 0x81) {
        std::__node_alloc::_M_deallocate(pvVar12,uVar1);
        pppppppiVar16 = local_1c;
      }
      else {
        operator_delete(pvVar12);
        pppppppiVar16 = local_1c;
      }
    }
    while (pppppppiVar16 != (int *******)0x0) {
      pppppppiVar15 = (int *******)pppppppiVar16[6];
      pppppppiVar17 = (int *******)*pppppppiVar16;
      if ((pppppppiVar15 != pppppppiVar16 + 1) && (pppppppiVar15 != (int *******)0x0)) {
        uVar1 = (int)pppppppiVar16[1] - (int)pppppppiVar15;
        if (uVar1 < 0x81) {
          std::__node_alloc::_M_deallocate(pppppppiVar15,uVar1);
        }
        else {
          operator_delete(pppppppiVar15);
        }
      }
      std::__node_alloc::_M_deallocate(pppppppiVar16,0x24);
      pppppppiVar16 = pppppppiVar17;
    }
    return;
  }
  FUN_00030824(4);
  uVar5 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(uVar5,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
}



### FUNC FUN_0004b1b0 @ 0004b1b0

void FUN_0004b1b0(int *param_1,int param_2,undefined4 *param_3)

{
  bool bVar1;
  int *piVar2;
  int iVar3;
  int iVar4;
  size_t __n;
  int *piVar5;
  undefined1 auStack_30 [4];
  int local_2c [4];
  int local_1c;
  int *local_18;
  
  iVar3 = FUN_0004b24a(param_2,param_3);
  piVar5 = *(int **)(*(int *)(param_2 + 8) + iVar3 * 4);
  iVar3 = *(int *)(*(int *)(param_2 + 8) + iVar3 * 4 + 4);
  while( true ) {
    if ((int *)iVar3 == piVar5) {
      *param_1 = 0;
      return;
    }
    FUN_00031c38(local_2c,*param_3,auStack_30);
    piVar2 = local_18;
    __n = piVar5[5] - piVar5[6];
    bVar1 = false;
    if (__n == local_1c - (int)local_18) {
      iVar4 = memcmp((void *)piVar5[6],local_18,__n);
      bVar1 = true;
      if (iVar4 != 0) {
        bVar1 = false;
      }
    }
    if ((piVar2 != local_2c) && (piVar2 != (int *)0x0)) {
      if ((uint)(local_2c[0] - (int)piVar2) < 0x81) {
        std::__node_alloc::_M_deallocate(piVar2,local_2c[0] - (int)piVar2);
      }
      else {
        operator_delete(piVar2);
      }
    }
    if (bVar1) break;
    piVar5 = (int *)*piVar5;
  }
  *param_1 = (int)piVar5;
  return;
}



### FUNC FUN_0004b24a @ 0004b24a

undefined4 FUN_0004b24a(int param_1,undefined4 *param_2)

{
  int iVar1;
  undefined4 extraout_r1;
  int iVar2;
  byte *pbVar3;
  int iVar4;
  undefined1 auStack_2c [4];
  int local_28 [4];
  int local_18;
  byte *local_14;
  
  iVar2 = *(int *)(param_1 + 8);
  iVar1 = *(int *)(param_1 + 0xc);
  FUN_00031c38(local_28,*param_2,auStack_2c);
  local_18 = local_18 - (int)local_14;
  iVar4 = 0;
  if (local_18 != 0) {
    iVar4 = 0;
    pbVar3 = local_14;
    do {
      iVar4 = iVar4 * 5 + (uint)*pbVar3;
      pbVar3 = pbVar3 + 1;
      local_18 = local_18 + -1;
    } while (local_18 != 0);
  }
  if ((local_14 != (byte *)0x0) && (local_14 != (byte *)local_28)) {
    if ((uint)(local_28[0] - (int)local_14) < 0x81) {
      std::__node_alloc::_M_deallocate(local_14,local_28[0] - (int)local_14);
    }
    else {
      operator_delete(local_14);
    }
  }
  __aeabi_uidivmod(iVar4,(iVar1 - iVar2 >> 2) + -1);
  return extraout_r1;
}



### FUNC ctype_byname @ 0004b2b0

/* std::ctype_byname<char>::ctype_byname(char const*, unsigned int) */

ctype_byname<char> * __thiscall
std::ctype_byname<char>::ctype_byname(ctype_byname<char> *this,char *param_1,uint param_2)

{
  int iVar1;
  undefined4 uVar2;
  int iVar3;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  local_14 = param_1;
  ctype<char>::ctype((ctype<char> *)this,(mask *)0x0,false,param_2);
  *(undefined ***)this = &PTR__ctype_byname_000695f8;
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar3 = 0;
    iVar1 = FUN_0004a144(&local_14,auStack_118,0,&local_18);
    *(int *)(this + 0x414) = iVar1;
    if (iVar1 != 0) {
      *(ctype_byname<char> **)(this + 0xc) = this + 0x14;
      iVar1 = FUN_0004dab0();
      do {
        *(uint *)(this + iVar3 * -2 + 0x14) = (uint)*(ushort *)(iVar1 - iVar3);
        iVar3 = iVar3 + -2;
      } while (iVar3 != -0x200);
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"ctype");
  ctype<char>::~ctype((ctype<char> *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC _M_init @ 0004b348

/* std::ctype_byname<char>::_M_init() */

void __thiscall std::ctype_byname<char>::_M_init(ctype_byname<char> *this)

{
  ushort *puVar1;
  int iVar2;
  ctype_byname<char> *pcVar3;
  
  pcVar3 = this + 0x14;
  *(ctype_byname<char> **)(this + 0xc) = pcVar3;
  puVar1 = (ushort *)FUN_0004dab0(*(undefined4 *)(this + 0x414));
  iVar2 = 0x100;
  do {
    *(uint *)pcVar3 = (uint)*puVar1;
    pcVar3 = pcVar3 + 4;
    iVar2 = iVar2 + -1;
    puVar1 = puVar1 + 1;
  } while (iVar2 != 0);
  return;
}



### FUNC ~ctype_byname @ 0004b370

/* std::ctype_byname<char>::~ctype_byname() */

void __thiscall std::ctype_byname<char>::~ctype_byname(ctype_byname<char> *this)

{
  *(undefined ***)this = &PTR__ctype_byname_000695f8;
  FUN_0004a50c(*(undefined4 *)(this + 0x414));
  ctype<char>::~ctype((ctype<char> *)this);
  return;
}



### FUNC ~ctype_byname @ 0004b3ac

/* std::ctype_byname<char>::~ctype_byname() */

void __thiscall std::ctype_byname<char>::~ctype_byname(ctype_byname<char> *this)

{
  *(undefined ***)this = &PTR__ctype_byname_000695f8;
  FUN_0004a50c(*(undefined4 *)(this + 0x414));
  ctype<char>::~ctype((ctype<char> *)this);
  operator_delete(this);
  return;
}



### FUNC do_toupper @ 0004b3f8

/* std::ctype_byname<char>::do_toupper(char) const */

undefined1 std::ctype_byname<char>::do_toupper(char param_1)

{
  undefined1 uVar1;
  
  uVar1 = FUN_0004dabc(*(undefined4 *)(param_1 + 0x414));
  return uVar1;
}



### FUNC do_tolower @ 0004b410

/* std::ctype_byname<char>::do_tolower(char) const */

undefined1 std::ctype_byname<char>::do_tolower(char param_1)

{
  undefined1 uVar1;
  
  uVar1 = FUN_0004dac8(*(undefined4 *)(param_1 + 0x414));
  return uVar1;
}



### FUNC do_toupper @ 0004b428

/* std::ctype_byname<char>::do_toupper(char*, char const*) const */

char * __thiscall
std::ctype_byname<char>::do_toupper(ctype_byname<char> *this,char *param_1,char *param_2)

{
  char cVar1;
  
  if (param_1 != param_2) {
    do {
      cVar1 = FUN_0004dabc(*(undefined4 *)(this + 0x414),*param_1);
      *param_1 = cVar1;
      param_1 = param_1 + 1;
    } while (param_2 != param_1);
  }
  return param_2;
}



### FUNC do_tolower @ 0004b454

/* std::ctype_byname<char>::do_tolower(char*, char const*) const */

char * __thiscall
std::ctype_byname<char>::do_tolower(ctype_byname<char> *this,char *param_1,char *param_2)

{
  char cVar1;
  
  if (param_1 != param_2) {
    do {
      cVar1 = FUN_0004dac8(*(undefined4 *)(this + 0x414),*param_1);
      *param_1 = cVar1;
      param_1 = param_1 + 1;
    } while (param_2 != param_1);
  }
  return param_2;
}



### FUNC ctype_byname @ 0004b480

/* std::ctype_byname<wchar_t>::ctype_byname(char const*, unsigned int) */

ctype_byname<wchar_t> * __thiscall
std::ctype_byname<wchar_t>::ctype_byname(ctype_byname<wchar_t> *this,char *param_1,uint param_2)

{
  int iVar1;
  undefined4 uVar2;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  *(uint *)(this + 4) = (uint)(param_2 != 0);
  local_14 = param_1;
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__ctype_byname_00069628;
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a144(&local_14,auStack_118,0,&local_18);
    *(int *)(this + 0xc) = iVar1;
    if (iVar1 != 0) {
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"ctype");
  ctype<wchar_t>::~ctype((ctype<wchar_t> *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC ~ctype_byname @ 0004b4f4

/* std::ctype_byname<wchar_t>::~ctype_byname() */

void __thiscall std::ctype_byname<wchar_t>::~ctype_byname(ctype_byname<wchar_t> *this)

{
  *(undefined ***)this = &PTR__ctype_byname_00069628;
  FUN_0004a50c(*(undefined4 *)(this + 0xc));
  ctype<wchar_t>::~ctype((ctype<wchar_t> *)this);
  return;
}



### FUNC ~ctype_byname @ 0004b528

/* std::ctype_byname<wchar_t>::~ctype_byname() */

void __thiscall std::ctype_byname<wchar_t>::~ctype_byname(ctype_byname<wchar_t> *this)

{
  *(undefined ***)this = &PTR__ctype_byname_00069628;
  FUN_0004a50c(*(undefined4 *)(this + 0xc));
  ctype<wchar_t>::~ctype((ctype<wchar_t> *)this);
  operator_delete(this);
  return;
}



### FUNC do_is @ 0004b56c

/* std::ctype_byname<wchar_t>::do_is(std::ctype_base::mask, wchar_t) const */

bool __thiscall
std::ctype_byname<wchar_t>::do_is(ctype_byname<wchar_t> *this,undefined2 param_2,undefined4 param_3)

{
  int iVar1;
  
  iVar1 = FUN_0004dad4(*(undefined4 *)(this + 0xc),param_3,param_2);
  return iVar1 != 0;
}



### FUNC do_is @ 0004b590

/* std::ctype_byname<wchar_t>::do_is(wchar_t const*, wchar_t const*, std::ctype_base::mask*) const
    */

wchar_t * __thiscall
std::ctype_byname<wchar_t>::do_is
          (ctype_byname<wchar_t> *this,wchar_t *param_1,wchar_t *param_2,mask *param_3)

{
  undefined4 uVar1;
  wchar_t wVar2;
  
  if (param_1 < param_2) {
    do {
      wVar2 = *param_1;
      param_1 = param_1 + 1;
      uVar1 = FUN_0004dad4(*(undefined4 *)(this + 0xc),wVar2,0x1ff);
      *(undefined4 *)param_3 = uVar1;
      param_3 = (mask *)((int)param_3 + 4);
    } while (param_1 < param_2);
  }
  return param_2;
}



### FUNC do_scan_is @ 0004b5c0

/* std::ctype_byname<wchar_t>::do_scan_is(std::ctype_base::mask, wchar_t const*, wchar_t const*)
   const */

void __thiscall
std::ctype_byname<wchar_t>::do_scan_is
          (ctype_byname<wchar_t> *this,uint param_2,undefined4 param_3,undefined4 param_4)

{
  undefined1 auStack_1c [4];
  uint local_18;
  undefined4 local_14;
  
  local_14 = *(undefined4 *)(this + 0xc);
  local_18 = param_2 & 0xffff;
  FUN_0004cc5c(param_3,param_4,&local_18,auStack_1c);
  return;
}



### FUNC do_scan_not @ 0004b5ec

/* std::ctype_byname<wchar_t>::do_scan_not(std::ctype_base::mask, wchar_t const*, wchar_t const*)
   const */

void __thiscall
std::ctype_byname<wchar_t>::do_scan_not
          (ctype_byname<wchar_t> *this,uint param_2,undefined4 param_3,undefined4 param_4)

{
  undefined1 auStack_20 [4];
  undefined1 auStack_1c [4];
  uint local_18;
  undefined4 local_14;
  
  local_14 = *(undefined4 *)(this + 0xc);
  local_18 = param_2 & 0xffff;
  FUN_0004cd16(param_3,param_4,auStack_1c,auStack_20);
  return;
}



### FUNC do_toupper @ 0004b618

/* std::ctype_byname<wchar_t>::do_toupper(wchar_t) const */

void std::ctype_byname<wchar_t>::do_toupper(wchar_t param_1)

{
  FUN_0004dbb8(*(undefined4 *)(param_1 + L'\f'));
  return;
}



### FUNC do_toupper @ 0004b624

/* std::ctype_byname<wchar_t>::do_toupper(wchar_t*, wchar_t const*) const */

wchar_t * __thiscall
std::ctype_byname<wchar_t>::do_toupper
          (ctype_byname<wchar_t> *this,wchar_t *param_1,wchar_t *param_2)

{
  wchar_t wVar1;
  
  if (param_1 < param_2) {
    do {
      wVar1 = FUN_0004dbb8(*(undefined4 *)(this + 0xc),*param_1);
      *param_1 = wVar1;
      param_1 = param_1 + 1;
    } while (param_1 < param_2);
  }
  return param_2;
}



### FUNC do_tolower @ 0004b64e

/* std::ctype_byname<wchar_t>::do_tolower(wchar_t) const */

void std::ctype_byname<wchar_t>::do_tolower(wchar_t param_1)

{
  FUN_0004dbac(*(undefined4 *)(param_1 + L'\f'));
  return;
}



### FUNC do_tolower @ 0004b65a

/* std::ctype_byname<wchar_t>::do_tolower(wchar_t*, wchar_t const*) const */

wchar_t * __thiscall
std::ctype_byname<wchar_t>::do_tolower
          (ctype_byname<wchar_t> *this,wchar_t *param_1,wchar_t *param_2)

{
  wchar_t wVar1;
  
  if (param_1 < param_2) {
    do {
      wVar1 = FUN_0004dbac(*(undefined4 *)(this + 0xc),*param_1);
      *param_1 = wVar1;
      param_1 = param_1 + 1;
    } while (param_1 < param_2);
  }
  return param_2;
}



### FUNC collate_byname @ 0004b684

/* std::collate_byname<char>::collate_byname(char const*, unsigned int) */

collate_byname<char> * __thiscall
std::collate_byname<char>::collate_byname(collate_byname<char> *this,char *param_1,uint param_2)

{
  int iVar1;
  undefined4 uVar2;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  *(uint *)(this + 4) = (uint)(param_2 != 0);
  local_14 = param_1;
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__collate_byname_00069668;
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a41c(&local_14,auStack_118,0,&local_18);
    *(int *)(this + 0xc) = iVar1;
    if (iVar1 != 0) {
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"collate");
  collate<char>::~collate((collate<char> *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC ~collate_byname @ 0004b6f8

/* std::collate_byname<char>::~collate_byname() */

void __thiscall std::collate_byname<char>::~collate_byname(collate_byname<char> *this)

{
  *(undefined ***)this = &PTR__collate_byname_00069668;
  FUN_0004a71c(*(undefined4 *)(this + 0xc));
  collate<char>::~collate((collate<char> *)this);
  return;
}



### FUNC ~collate_byname @ 0004b72c

/* std::collate_byname<char>::~collate_byname() */

void __thiscall std::collate_byname<char>::~collate_byname(collate_byname<char> *this)

{
  *(undefined ***)this = &PTR__collate_byname_00069668;
  FUN_0004a71c(*(undefined4 *)(this + 0xc));
  collate<char>::~collate((collate<char> *)this);
  operator_delete(this);
  return;
}



### FUNC do_compare @ 0004b770

/* std::collate_byname<char>::do_compare(char const*, char const*, char const*, char const*) const
    */

void __thiscall
std::collate_byname<char>::do_compare
          (collate_byname<char> *this,char *param_1,char *param_2,char *param_3,char *param_4)

{
  FUN_0004dbe6(*(undefined4 *)(this + 0xc),param_1,(int)param_2 - (int)param_1,param_3,
               (int)param_4 - (int)param_3);
  return;
}



### FUNC do_transform @ 0004b78c

/* std::collate_byname<char>::do_transform(char const*, char const*) const */

void std::collate_byname<char>::do_transform(char *param_1,char *param_2)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  int in_r2;
  int in_r3;
  undefined1 *puVar4;
  int local_30 [4];
  int *local_20;
  int *local_1c;
  uint local_18;
  
  if (in_r2 == in_r3) {
    *param_1 = '\0';
    *(char **)(param_1 + 0x10) = param_1;
    *(char **)(param_1 + 0x14) = param_1;
  }
  else {
    uVar1 = FUN_0004dd0a(*(undefined4 *)(param_2 + 0xc),0,0);
    local_20 = local_30;
    uVar2 = uVar1 + 1;
    local_1c = local_20;
    if (uVar2 == 0) {
                    /* WARNING: Subroutine does not return */
      __stl_throw_length_error("basic_string");
    }
    if (0x10 < uVar2) {
      local_18 = uVar2;
      if (uVar2 < 0x81) {
        local_1c = (int *)__node_alloc::_M_allocate(&local_18);
        uVar3 = local_18;
      }
      else {
        local_1c = (int *)operator_new(uVar2);
        uVar3 = uVar2;
      }
      local_30[0] = (int)local_1c + uVar3;
    }
    puVar4 = (undefined1 *)((int)local_1c + uVar1);
    if (0 < (int)uVar1) {
      uVar3 = uVar1 ^ 0xffffffff;
      if ((int)(uVar1 ^ 0xffffffff) < -1) {
        uVar3 = 0xfffffffe;
      }
      local_20 = local_1c;
      __aeabi_memclr(local_1c,uVar1 + uVar3 + 2);
    }
    local_20 = (int *)puVar4;
    *puVar4 = 0;
    FUN_0004dd0a(*(undefined4 *)(param_2 + 0xc),local_1c,uVar2);
    FUN_00036f1c(param_1,local_30);
    if ((local_1c != local_30) && (local_1c != (int *)0x0)) {
      if (0x80 < (uint)(local_30[0] - (int)local_1c)) {
        operator_delete(local_1c);
        return;
      }
      __node_alloc::_M_deallocate(local_1c,local_30[0] - (int)local_1c);
      return;
    }
  }
  return;
}



### FUNC collate_byname @ 0004b898

/* std::collate_byname<wchar_t>::collate_byname(char const*, unsigned int) */

collate_byname<wchar_t> * __thiscall
std::collate_byname<wchar_t>::collate_byname
          (collate_byname<wchar_t> *this,char *param_1,uint param_2)

{
  int iVar1;
  undefined4 uVar2;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  *(uint *)(this + 4) = (uint)(param_2 != 0);
  local_14 = param_1;
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__collate_byname_00069684;
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a41c(&local_14,auStack_118,0,&local_18);
    *(int *)(this + 0xc) = iVar1;
    if (iVar1 != 0) {
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"collate");
  collate<wchar_t>::~collate((collate<wchar_t> *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC ~collate_byname @ 0004b90c

/* std::collate_byname<wchar_t>::~collate_byname() */

void __thiscall std::collate_byname<wchar_t>::~collate_byname(collate_byname<wchar_t> *this)

{
  *(undefined ***)this = &PTR__collate_byname_00069684;
  FUN_0004a71c(*(undefined4 *)(this + 0xc));
  collate<wchar_t>::~collate((collate<wchar_t> *)this);
  return;
}



### FUNC ~collate_byname @ 0004b940

/* std::collate_byname<wchar_t>::~collate_byname() */

void __thiscall std::collate_byname<wchar_t>::~collate_byname(collate_byname<wchar_t> *this)

{
  *(undefined ***)this = &PTR__collate_byname_00069684;
  FUN_0004a71c(*(undefined4 *)(this + 0xc));
  collate<wchar_t>::~collate((collate<wchar_t> *)this);
  operator_delete(this);
  return;
}



### FUNC do_compare @ 0004b984

/* std::collate_byname<wchar_t>::do_compare(wchar_t const*, wchar_t const*, wchar_t const*, wchar_t
   const*) const */

void __thiscall
std::collate_byname<wchar_t>::do_compare
          (collate_byname<wchar_t> *this,wchar_t *param_1,wchar_t *param_2,wchar_t *param_3,
          wchar_t *param_4)

{
  FUN_0004dc70(*(undefined4 *)(this + 0xc),param_1,(int)param_2 - (int)param_1 >> 2,param_3,
               (int)param_4 - (int)param_3 >> 2);
  return;
}



### FUNC do_transform @ 0004b9a4

/* std::collate_byname<wchar_t>::do_transform(wchar_t const*, wchar_t const*) const */

void std::collate_byname<wchar_t>::do_transform(wchar_t *param_1,wchar_t *param_2)

{
  int *piVar1;
  uint uVar2;
  uint uVar3;
  int in_r2;
  int in_r3;
  uint uVar4;
  int *piVar5;
  int local_60 [16];
  int *local_20;
  int *local_1c;
  uint local_18;
  
  if (in_r2 == in_r3) {
    *param_1 = L'\0';
    param_1[0x10] = (wchar_t)param_1;
    param_1[0x11] = (wchar_t)param_1;
  }
  else {
    uVar2 = FUN_0004dd2e(param_2[3],0,0);
    local_20 = local_60;
    uVar3 = uVar2 + 1;
    local_1c = local_20;
    if (0x3ffffffe < uVar2) {
                    /* WARNING: Subroutine does not return */
      __stl_throw_length_error("basic_string");
    }
    if (0x10 < uVar3) {
      uVar4 = uVar3 * 4;
      local_18 = uVar4;
      if (uVar4 < 0x81) {
        local_1c = (int *)__node_alloc::_M_allocate(&local_18);
        uVar4 = local_18;
      }
      else {
        local_1c = (int *)operator_new(uVar4);
      }
      local_60[0] = (int)local_1c + (uVar4 & 0xfffffffc);
    }
    piVar5 = local_1c + uVar2;
    if (0 < (int)(uVar2 * 4)) {
      uVar4 = uVar2 ^ 0xffffffff;
      if ((int)(uVar2 ^ 0xffffffff) < -1) {
        uVar4 = 0xfffffffe;
      }
      local_20 = local_1c;
      __aeabi_memclr4(local_1c,(uVar2 + uVar4) * 4 + 8);
    }
    piVar1 = local_1c;
    local_20 = piVar5;
    *piVar5 = 0;
    FUN_0004dd2e(param_2[3],piVar1,uVar3);
    FUN_0004bac8(param_1,local_60);
    if ((local_1c != local_60) && (local_1c != (int *)0x0)) {
      if (0x80 < (uint)(local_60[0] - (int)local_1c)) {
        operator_delete(local_1c);
        return;
      }
      __node_alloc::_M_deallocate(local_1c,local_60[0] - (int)local_1c);
      return;
    }
  }
  return;
}



### FUNC FUN_0004bac8 @ 0004bac8

int * FUN_0004bac8(int *param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  int *piVar3;
  int iVar4;
  int iVar5;
  uint local_18;
  
  param_1[0x10] = (int)param_1;
  param_1[0x11] = (int)param_1;
  iVar1 = *(int *)(param_2 + 0x40);
  iVar4 = *(int *)(param_2 + 0x44);
  iVar5 = iVar1 - iVar4;
  uVar2 = (iVar5 >> 2) + 1;
  if ((uint)(iVar5 >> 2) < 0x3fffffff) {
    piVar3 = param_1;
    if (0x10 < uVar2) {
      uVar2 = uVar2 * 4;
      local_18 = uVar2;
      if (uVar2 < 0x81) {
        piVar3 = (int *)std::__node_alloc::_M_allocate(&local_18);
        uVar2 = local_18;
      }
      else {
        piVar3 = (int *)operator_new(uVar2);
      }
      param_1[0x10] = (int)piVar3;
      param_1[0x11] = (int)piVar3;
      *param_1 = (int)piVar3 + (uVar2 & 0xfffffffc);
    }
    if (iVar1 != iVar4) {
      __aeabi_memcpy(piVar3,iVar4,iVar5);
      piVar3 = (int *)((int)piVar3 + iVar5);
    }
    param_1[0x10] = (int)piVar3;
    *piVar3 = 0;
    return param_1;
  }
                    /* WARNING: Subroutine does not return */
  std::__stl_throw_length_error("basic_string");
}



### FUNC codecvt_byname @ 0004bb78

/* std::codecvt_byname<char, char, mbstate_t>::codecvt_byname(char const*, unsigned int) */

codecvt_byname<char,char,mbstate_t> * __thiscall
std::codecvt_byname<char,char,mbstate_t>::codecvt_byname
          (codecvt_byname<char,char,mbstate_t> *this,char *param_1,uint param_2)

{
  undefined4 uVar1;
  
  *(uint *)(this + 4) = (uint)(param_2 != 0);
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__codecvt_byname_000696a0;
  if (param_1 != (char *)0x0) {
    return this;
  }
  uVar1 = locale::_M_throw_on_null_name();
  codecvt<char,char,mbstate_t>::~codecvt((codecvt<char,char,mbstate_t> *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar1);
}



### FUNC ~codecvt_byname @ 0004bbc0

/* std::codecvt_byname<char, char, mbstate_t>::~codecvt_byname() */

void __thiscall
std::codecvt_byname<char,char,mbstate_t>::~codecvt_byname(codecvt_byname<char,char,mbstate_t> *this)

{
  codecvt<char,char,mbstate_t>::~codecvt((codecvt<char,char,mbstate_t> *)this);
  return;
}



### FUNC ~codecvt_byname @ 0004bbca

/* std::codecvt_byname<char, char, mbstate_t>::~codecvt_byname() */

void __thiscall
std::codecvt_byname<char,char,mbstate_t>::~codecvt_byname(codecvt_byname<char,char,mbstate_t> *this)

{
  codecvt<char,char,mbstate_t>::~codecvt((codecvt<char,char,mbstate_t> *)this);
  operator_delete(this);
  return;
}



### FUNC codecvt_byname @ 0004bbec

/* std::codecvt_byname<wchar_t, char, mbstate_t>::codecvt_byname(char const*, unsigned int) */

codecvt_byname<wchar_t,char,mbstate_t> * __thiscall
std::codecvt_byname<wchar_t,char,mbstate_t>::codecvt_byname
          (codecvt_byname<wchar_t,char,mbstate_t> *this,char *param_1,uint param_2)

{
  int iVar1;
  undefined4 uVar2;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  *(uint *)(this + 4) = (uint)(param_2 != 0);
  local_14 = param_1;
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__codecvt_byname_000696cc;
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a334(&local_14,auStack_118,0,&local_18);
    *(int *)(this + 0xc) = iVar1;
    if (iVar1 != 0) {
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"ctype");
  codecvt<wchar_t,char,mbstate_t>::~codecvt((codecvt<wchar_t,char,mbstate_t> *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC ~codecvt_byname @ 0004bc60

/* std::codecvt_byname<wchar_t, char, mbstate_t>::~codecvt_byname() */

void __thiscall
std::codecvt_byname<wchar_t,char,mbstate_t>::~codecvt_byname
          (codecvt_byname<wchar_t,char,mbstate_t> *this)

{
  *(undefined ***)this = &PTR__codecvt_byname_000696cc;
  FUN_0004a590(*(undefined4 *)(this + 0xc));
  codecvt<wchar_t,char,mbstate_t>::~codecvt((codecvt<wchar_t,char,mbstate_t> *)this);
  return;
}



### FUNC ~codecvt_byname @ 0004bc94

/* std::codecvt_byname<wchar_t, char, mbstate_t>::~codecvt_byname() */

void __thiscall
std::codecvt_byname<wchar_t,char,mbstate_t>::~codecvt_byname
          (codecvt_byname<wchar_t,char,mbstate_t> *this)

{
  *(undefined ***)this = &PTR__codecvt_byname_000696cc;
  FUN_0004a590(*(undefined4 *)(this + 0xc));
  codecvt<wchar_t,char,mbstate_t>::~codecvt((codecvt<wchar_t,char,mbstate_t> *)this);
  operator_delete(this);
  return;
}



### FUNC do_out @ 0004bcd8

/* std::codecvt_byname<wchar_t, char, mbstate_t>::do_out(mbstate_t&, wchar_t const*, wchar_t const*,
   wchar_t const*&, char*, char*, char*&) const */

undefined4 __thiscall
std::codecvt_byname<wchar_t,char,mbstate_t>::do_out
          (codecvt_byname<wchar_t,char,mbstate_t> *this,mbstate_t *param_1,wchar_t *param_2,
          wchar_t *param_3,wchar_t **param_4,char *param_5,char *param_6,char **param_7)

{
  int iVar1;
  wchar_t *pwVar2;
  bool bVar3;
  undefined4 local_2c;
  
  local_2c = 0;
  if ((param_5 != param_6) && (param_2 != param_3)) {
    local_2c = 0;
    pwVar2 = param_2;
    while( true ) {
      iVar1 = FUN_0004dbd8(*(undefined4 *)(this + 0xc),param_5,(int)param_6 - (int)param_5,*pwVar2,
                           param_1);
      param_2 = pwVar2;
      if (iVar1 == -2) {
        local_2c = 1;
        goto LAB_0004bd3e;
      }
      if (iVar1 == -1) break;
      param_5 = param_5 + iVar1;
      param_2 = pwVar2 + 1;
      if ((param_5 == param_6) || (bVar3 = param_3 + -1 == pwVar2, pwVar2 = param_2, bVar3))
      goto LAB_0004bd3e;
    }
    local_2c = 2;
  }
LAB_0004bd3e:
  *param_4 = param_2;
  *param_7 = param_5;
  return local_2c;
}



### FUNC do_in @ 0004bd48

/* std::codecvt_byname<wchar_t, char, mbstate_t>::do_in(mbstate_t&, char const*, char const*, char
   const*&, wchar_t*, wchar_t*, wchar_t*&) const */

undefined4 __thiscall
std::codecvt_byname<wchar_t,char,mbstate_t>::do_in
          (codecvt_byname<wchar_t,char,mbstate_t> *this,mbstate_t *param_1,char *param_2,
          char *param_3,char **param_4,wchar_t *param_5,wchar_t *param_6,wchar_t **param_7)

{
  int iVar1;
  wchar_t *pwVar2;
  undefined4 local_2c;
  
  local_2c = 0;
  if ((param_5 != param_6) && (param_2 != param_3)) {
    local_2c = 0;
    pwVar2 = param_5;
    while( true ) {
      iVar1 = FUN_0004dbd0(*(undefined4 *)(this + 0xc),pwVar2,param_2,(int)param_3 - (int)param_2,
                           param_1);
      param_5 = pwVar2;
      if (iVar1 == -2) {
        local_2c = 1;
        goto LAB_0004bdb0;
      }
      if (iVar1 == -1) break;
      param_2 = param_2 + iVar1;
      param_5 = pwVar2 + 1;
      if ((param_6 + -1 == pwVar2) || (pwVar2 = param_5, param_2 == param_3)) goto LAB_0004bdb0;
    }
    local_2c = 2;
  }
LAB_0004bdb0:
  *param_4 = param_2;
  *param_7 = param_5;
  return local_2c;
}



### FUNC do_unshift @ 0004bdbc

/* std::codecvt_byname<wchar_t, char, mbstate_t>::do_unshift(mbstate_t&, char*, char*, char*&) const
    */

undefined4 __thiscall
std::codecvt_byname<wchar_t,char,mbstate_t>::do_unshift
          (codecvt_byname<wchar_t,char,mbstate_t> *this,mbstate_t *param_1,char *param_2,
          char *param_3,char **param_4)

{
  int iVar1;
  undefined4 uVar2;
  
  *param_4 = param_2;
  iVar1 = FUN_0004dbde(*(undefined4 *)(this + 0xc),param_1,param_2,(int)param_3 - (int)param_2,
                       param_4);
  uVar2 = 2;
  if (iVar1 != -1) {
    if (iVar1 == -2) {
      return 1;
    }
    uVar2 = 3;
    if (*param_4 != param_2) {
      uVar2 = 0;
    }
  }
  return uVar2;
}



### FUNC do_encoding @ 0004bdf8

/* std::codecvt_byname<wchar_t, char, mbstate_t>::do_encoding() const */

int __thiscall
std::codecvt_byname<wchar_t,char,mbstate_t>::do_encoding
          (codecvt_byname<wchar_t,char,mbstate_t> *this)

{
  int iVar1;
  int iVar2;
  
  iVar1 = FUN_0004dbcc(*(undefined4 *)(this + 0xc));
  iVar2 = -1;
  if (iVar1 != 0) {
    iVar1 = FUN_0004dbc4(*(undefined4 *)(this + 0xc));
    iVar2 = FUN_0004dbc8(*(undefined4 *)(this + 0xc));
    if (iVar2 != iVar1) {
      iVar2 = 0;
    }
  }
  return iVar2;
}



### FUNC do_always_noconv @ 0004be32

/* std::codecvt_byname<wchar_t, char, mbstate_t>::do_always_noconv() const */

undefined4 std::codecvt_byname<wchar_t,char,mbstate_t>::do_always_noconv(void)

{
  return 0;
}



### FUNC do_length @ 0004be36

/* std::codecvt_byname<wchar_t, char, mbstate_t>::do_length(mbstate_t&, char const*, char const*,
   unsigned int) const */

int __thiscall
std::codecvt_byname<wchar_t,char,mbstate_t>::do_length
          (codecvt_byname<wchar_t,char,mbstate_t> *this,mbstate_t *param_1,char *param_2,
          char *param_3,uint param_4)

{
  uint uVar1;
  int local_1c;
  undefined1 auStack_18 [4];
  
  local_1c = 0;
  while( true ) {
    if (param_4 == 0) {
      return local_1c;
    }
    if (param_2 == param_3) break;
    uVar1 = FUN_0004dbd0(*(undefined4 *)(this + 0xc),auStack_18,param_2,(int)param_3 - (int)param_2,
                         param_1);
    if (uVar1 < 0xfffffffe) {
      local_1c = local_1c + uVar1;
    }
    param_2 = param_2 + uVar1;
    param_4 = param_4 - 1;
    if (0xfffffffd < uVar1) {
      return local_1c;
    }
  }
  return local_1c;
}



### FUNC do_max_length @ 0004be86

/* std::codecvt_byname<wchar_t, char, mbstate_t>::do_max_length() const */

void __thiscall
std::codecvt_byname<wchar_t,char,mbstate_t>::do_max_length
          (codecvt_byname<wchar_t,char,mbstate_t> *this)

{
  FUN_0004dbc4(*(undefined4 *)(this + 0xc));
  return;
}



### FUNC numpunct_byname @ 0004be98

/* std::numpunct_byname<char>::numpunct_byname(char const*, unsigned int) */

numpunct_byname<char> * __thiscall
std::numpunct_byname<char>::numpunct_byname(numpunct_byname<char> *this,char *param_1,uint param_2)

{
  int iVar1;
  undefined4 uVar2;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  *(uint *)(this + 4) = (uint)(param_2 != 0);
  local_14 = param_1;
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__numpunct_byname_000696f8;
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a37c(&local_14,auStack_118,0,&local_18);
    *(int *)(this + 0xc) = iVar1;
    if (iVar1 != 0) {
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"numpunct");
  numpunct<char>::~numpunct((numpunct<char> *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC ~numpunct_byname @ 0004bf0c

/* std::numpunct_byname<char>::~numpunct_byname() */

void __thiscall std::numpunct_byname<char>::~numpunct_byname(numpunct_byname<char> *this)

{
  *(undefined ***)this = &PTR__numpunct_byname_000696f8;
  FUN_0004a614(*(undefined4 *)(this + 0xc));
  numpunct<char>::~numpunct((numpunct<char> *)this);
  return;
}



### FUNC ~numpunct_byname @ 0004bf40

/* std::numpunct_byname<char>::~numpunct_byname() */

void __thiscall std::numpunct_byname<char>::~numpunct_byname(numpunct_byname<char> *this)

{
  *(undefined ***)this = &PTR__numpunct_byname_000696f8;
  FUN_0004a614(*(undefined4 *)(this + 0xc));
  numpunct<char>::~numpunct((numpunct<char> *)this);
  operator_delete(this);
  return;
}



### FUNC do_decimal_point @ 0004bf84

/* std::numpunct_byname<char>::do_decimal_point() const */

void __thiscall std::numpunct_byname<char>::do_decimal_point(numpunct_byname<char> *this)

{
  FUN_0004dd54(*(undefined4 *)(this + 0xc));
  return;
}



### FUNC do_thousands_sep @ 0004bf90

/* std::numpunct_byname<char>::do_thousands_sep() const */

void __thiscall std::numpunct_byname<char>::do_thousands_sep(numpunct_byname<char> *this)

{
  FUN_0004dd58(*(undefined4 *)(this + 0xc));
  return;
}



### FUNC do_grouping @ 0004bf9c

/* std::numpunct_byname<char>::do_grouping() const */

void std::numpunct_byname<char>::do_grouping(void)

{
  int in_r1;
  
  FUN_0004dd5c(*(undefined4 *)(in_r1 + 0xc));
  FUN_00031c38();
  return;
}



### FUNC do_truename @ 0004bfd4

/* std::numpunct_byname<char>::do_truename() const */

void std::numpunct_byname<char>::do_truename(void)

{
  int in_r1;
  
  FUN_0004dd68(*(undefined4 *)(in_r1 + 0xc));
  FUN_00031c38();
  return;
}



### FUNC do_falsename @ 0004bff4

/* std::numpunct_byname<char>::do_falsename() const */

void std::numpunct_byname<char>::do_falsename(void)

{
  int in_r1;
  
  FUN_0004dd74(*(undefined4 *)(in_r1 + 0xc));
  FUN_00031c38();
  return;
}



### FUNC numpunct_byname @ 0004c014

/* std::numpunct_byname<wchar_t>::numpunct_byname(char const*, unsigned int) */

numpunct_byname<wchar_t> * __thiscall
std::numpunct_byname<wchar_t>::numpunct_byname
          (numpunct_byname<wchar_t> *this,char *param_1,uint param_2)

{
  int iVar1;
  undefined4 uVar2;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  *(uint *)(this + 4) = (uint)(param_2 != 0);
  local_14 = param_1;
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__numpunct_byname_0006971c;
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a37c(&local_14,auStack_118,0,&local_18);
    *(int *)(this + 0xc) = iVar1;
    if (iVar1 != 0) {
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"numpunct");
  numpunct<wchar_t>::~numpunct((numpunct<wchar_t> *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC ~numpunct_byname @ 0004c088

/* std::numpunct_byname<wchar_t>::~numpunct_byname() */

void __thiscall std::numpunct_byname<wchar_t>::~numpunct_byname(numpunct_byname<wchar_t> *this)

{
  *(undefined ***)this = &PTR__numpunct_byname_0006971c;
  FUN_0004a614(*(undefined4 *)(this + 0xc));
  numpunct<wchar_t>::~numpunct((numpunct<wchar_t> *)this);
  return;
}



### FUNC ~numpunct_byname @ 0004c0bc

/* std::numpunct_byname<wchar_t>::~numpunct_byname() */

void __thiscall std::numpunct_byname<wchar_t>::~numpunct_byname(numpunct_byname<wchar_t> *this)

{
  *(undefined ***)this = &PTR__numpunct_byname_0006971c;
  FUN_0004a614(*(undefined4 *)(this + 0xc));
  numpunct<wchar_t>::~numpunct((numpunct<wchar_t> *)this);
  operator_delete(this);
  return;
}



### FUNC do_decimal_point @ 0004c100

/* std::numpunct_byname<wchar_t>::do_decimal_point() const */

void __thiscall std::numpunct_byname<wchar_t>::do_decimal_point(numpunct_byname<wchar_t> *this)

{
  FUN_0004dd80(*(undefined4 *)(this + 0xc));
  return;
}



### FUNC do_thousands_sep @ 0004c10c

/* std::numpunct_byname<wchar_t>::do_thousands_sep() const */

void __thiscall std::numpunct_byname<wchar_t>::do_thousands_sep(numpunct_byname<wchar_t> *this)

{
  FUN_0004dd84(*(undefined4 *)(this + 0xc));
  return;
}



### FUNC do_grouping @ 0004c118

/* std::numpunct_byname<wchar_t>::do_grouping() const */

void std::numpunct_byname<wchar_t>::do_grouping(void)

{
  int in_r1;
  
  FUN_0004dd5c(*(undefined4 *)(in_r1 + 0xc));
  FUN_00031c38();
  return;
}



### FUNC do_truename @ 0004c150

/* std::numpunct_byname<wchar_t>::do_truename() const */

void std::numpunct_byname<wchar_t>::do_truename(void)

{
  int in_r1;
  undefined1 auStack_50 [64];
  
  FUN_0004dd88(*(undefined4 *)(in_r1 + 0xc),auStack_50,0x10);
  FUN_0004c174();
  return;
}



### FUNC FUN_0004c174 @ 0004c174

int * FUN_0004c174(int *param_1,wchar_t *param_2)

{
  size_t sVar1;
  undefined4 *puVar2;
  uint uVar3;
  uint uVar4;
  uint local_18;
  
  param_1[0x10] = (int)param_1;
  param_1[0x11] = (int)param_1;
  sVar1 = wcslen(param_2);
  uVar3 = (int)(sVar1 * 4) >> 2;
  uVar4 = uVar3 + 1;
  if (uVar3 < 0x3fffffff) {
    if (uVar4 < 0x11) {
      puVar2 = (undefined4 *)param_1[0x11];
    }
    else {
      uVar4 = uVar4 * 4;
      local_18 = uVar4;
      if (uVar4 < 0x81) {
        puVar2 = (undefined4 *)std::__node_alloc::_M_allocate(&local_18);
        uVar4 = local_18;
      }
      else {
        puVar2 = (undefined4 *)operator_new(uVar4);
      }
      param_1[0x10] = (int)puVar2;
      param_1[0x11] = (int)puVar2;
      *param_1 = (int)puVar2 + (uVar4 & 0xfffffffc);
    }
    if (sVar1 != 0) {
      __aeabi_memcpy(puVar2,param_2,sVar1 * 4);
      puVar2 = puVar2 + sVar1;
    }
    param_1[0x10] = (int)puVar2;
    *puVar2 = 0;
    return param_1;
  }
                    /* WARNING: Subroutine does not return */
  std::__stl_throw_length_error("basic_string");
}



### FUNC do_falsename @ 0004c22c

/* std::numpunct_byname<wchar_t>::do_falsename() const */

void std::numpunct_byname<wchar_t>::do_falsename(void)

{
  int in_r1;
  undefined1 auStack_50 [64];
  
  FUN_0004dda0(*(undefined4 *)(in_r1 + 0xc),auStack_50,0x10);
  FUN_0004c174();
  return;
}



### FUNC moneypunct_byname @ 0004c250

/* std::moneypunct_byname<char, true>::moneypunct_byname(char const*, unsigned int) */

moneypunct_byname<char,true> * __thiscall
std::moneypunct_byname<char,true>::moneypunct_byname
          (moneypunct_byname<char,true> *this,char *param_1,uint param_2)

{
  int iVar1;
  undefined4 uVar2;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  local_14 = param_1;
  moneypunct<char,true>::moneypunct((moneypunct<char,true> *)this,param_2);
  *(undefined ***)this = &PTR__moneypunct_byname_00069740;
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a46c(&local_14,auStack_118,0,&local_18);
    *(int *)(this + 0x14) = iVar1;
    if (iVar1 != 0) {
      FUN_0004c2c4(this + 0xc,this + 0x10);
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"moneypunct");
  moneypunct<char,true>::~moneypunct((moneypunct<char,true> *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC FUN_0004c2c4 @ 0004c2c4

void FUN_0004c2c4(undefined1 *param_1,undefined1 *param_2,undefined4 param_3)

{
  uint uVar1;
  int iVar2;
  undefined1 uVar3;
  undefined1 uVar4;
  
  uVar1 = FUN_0004de10(param_3);
  if (uVar1 < 2) {
    param_1[1] = 3;
    *param_1 = 2;
    uVar4 = 0;
    uVar3 = 4;
  }
  else if (uVar1 - 3 < 2) {
    *param_1 = 2;
    iVar2 = FUN_0004de08(param_3);
    uVar3 = 3;
    uVar4 = 4;
    if (iVar2 != 0) {
      uVar4 = 3;
    }
    param_1[1] = uVar4;
    if (iVar2 != 0) {
      uVar3 = 4;
    }
    uVar4 = 0;
  }
  else if (uVar1 == 2) {
    param_1[1] = 4;
    *param_1 = 2;
    uVar4 = 0;
    uVar3 = 3;
  }
  else {
    param_1[1] = 3;
    *param_1 = 2;
    uVar4 = 4;
    uVar3 = 0;
  }
  param_1[3] = uVar4;
  param_1[2] = uVar3;
  uVar1 = FUN_0004de1c(param_3);
  if (uVar1 < 2) {
    param_2[1] = 3;
    *param_2 = 2;
    uVar4 = 0;
    uVar3 = 4;
  }
  else if (uVar1 - 3 < 2) {
    *param_2 = 2;
    iVar2 = FUN_0004de14(param_3);
    uVar3 = 3;
    uVar4 = 4;
    if (iVar2 != 0) {
      uVar4 = 3;
    }
    param_2[1] = uVar4;
    if (iVar2 != 0) {
      uVar3 = 4;
    }
    uVar4 = 0;
  }
  else if (uVar1 == 2) {
    param_2[1] = 4;
    *param_2 = 2;
    uVar4 = 0;
    uVar3 = 3;
  }
  else {
    param_2[1] = 3;
    *param_2 = 2;
    uVar4 = 4;
    uVar3 = 0;
  }
  param_2[3] = uVar4;
  param_2[2] = uVar3;
  return;
}



### FUNC moneypunct_byname @ 0004c39c

/* std::moneypunct_byname<char, true>::moneypunct_byname(_Locale_monetary*) */

moneypunct_byname<char,true> * __thiscall
std::moneypunct_byname<char,true>::moneypunct_byname
          (moneypunct_byname<char,true> *this,_Locale_monetary *param_1)

{
  moneypunct<char,true>::moneypunct((moneypunct<char,true> *)this,0);
  *(_Locale_monetary **)(this + 0x14) = param_1;
  *(undefined ***)this = &PTR__moneypunct_byname_00069740;
  FUN_0004c2c4(this + 0xc,this + 0x10,param_1);
  return this;
}



### FUNC ~moneypunct_byname @ 0004c3e0

/* std::moneypunct_byname<char, true>::~moneypunct_byname() */

void __thiscall
std::moneypunct_byname<char,true>::~moneypunct_byname(moneypunct_byname<char,true> *this)

{
  *(undefined ***)this = &PTR__moneypunct_byname_00069740;
  FUN_0004a7a0(*(undefined4 *)(this + 0x14));
  moneypunct<char,true>::~moneypunct((moneypunct<char,true> *)this);
  return;
}



### FUNC ~moneypunct_byname @ 0004c414

/* std::moneypunct_byname<char, true>::~moneypunct_byname() */

void __thiscall
std::moneypunct_byname<char,true>::~moneypunct_byname(moneypunct_byname<char,true> *this)

{
  *(undefined ***)this = &PTR__moneypunct_byname_00069740;
  FUN_0004a7a0(*(undefined4 *)(this + 0x14));
  moneypunct<char,true>::~moneypunct((moneypunct<char,true> *)this);
  operator_delete(this);
  return;
}



### FUNC do_decimal_point @ 0004c458

/* std::moneypunct_byname<char, true>::do_decimal_point() const */

void __thiscall
std::moneypunct_byname<char,true>::do_decimal_point(moneypunct_byname<char,true> *this)

{
  FUN_0004ddd4(*(undefined4 *)(this + 0x14));
  return;
}



### FUNC do_thousands_sep @ 0004c464

/* std::moneypunct_byname<char, true>::do_thousands_sep() const */

void __thiscall
std::moneypunct_byname<char,true>::do_thousands_sep(moneypunct_byname<char,true> *this)

{
  FUN_0004ddd8(*(undefined4 *)(this + 0x14));
  return;
}



### FUNC do_grouping @ 0004c470

/* std::moneypunct_byname<char, true>::do_grouping() const */

void std::moneypunct_byname<char,true>::do_grouping(void)

{
  int in_r1;
  
  FUN_0004dddc(*(undefined4 *)(in_r1 + 0x14));
  FUN_00031c38();
  return;
}



### FUNC do_curr_symbol @ 0004c490

/* std::moneypunct_byname<char, true>::do_curr_symbol() const */

void std::moneypunct_byname<char,true>::do_curr_symbol(void)

{
  int in_r1;
  
  FUN_0004ddbc(*(undefined4 *)(in_r1 + 0x14));
  FUN_00031c38();
  return;
}



### FUNC do_positive_sign @ 0004c4b0

/* std::moneypunct_byname<char, true>::do_positive_sign() const */

void std::moneypunct_byname<char,true>::do_positive_sign(void)

{
  int in_r1;
  
  FUN_0004dde8(*(undefined4 *)(in_r1 + 0x14));
  FUN_00031c38();
  return;
}



### FUNC do_negative_sign @ 0004c4d0

/* std::moneypunct_byname<char, true>::do_negative_sign() const */

void std::moneypunct_byname<char,true>::do_negative_sign(void)

{
  int in_r1;
  
  FUN_0004ddf4(*(undefined4 *)(in_r1 + 0x14));
  FUN_00031c38();
  return;
}



### FUNC do_frac_digits @ 0004c4f0

/* std::moneypunct_byname<char, true>::do_frac_digits() const */

void __thiscall
std::moneypunct_byname<char,true>::do_frac_digits(moneypunct_byname<char,true> *this)

{
  FUN_0004de00(*(undefined4 *)(this + 0x14));
  return;
}



### FUNC moneypunct_byname @ 0004c4fc

/* std::moneypunct_byname<char, false>::moneypunct_byname(char const*, unsigned int) */

moneypunct_byname<char,false> * __thiscall
std::moneypunct_byname<char,false>::moneypunct_byname
          (moneypunct_byname<char,false> *this,char *param_1,uint param_2)

{
  int iVar1;
  undefined4 uVar2;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  local_14 = param_1;
  moneypunct<char,false>::moneypunct((moneypunct<char,false> *)this,param_2);
  *(undefined ***)this = &PTR__moneypunct_byname_00069774;
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a46c(&local_14,auStack_118,0,&local_18);
    *(int *)(this + 0x14) = iVar1;
    if (iVar1 != 0) {
      FUN_0004c570(this + 0xc,this + 0x10);
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"moneypunct");
  moneypunct<char,false>::~moneypunct((moneypunct<char,false> *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC FUN_0004c570 @ 0004c570

void FUN_0004c570(undefined1 *param_1,undefined1 *param_2,undefined4 param_3)

{
  undefined1 uVar1;
  undefined4 uVar2;
  int iVar3;
  
  uVar2 = FUN_0004de10(param_3);
  switch(uVar2) {
  case 0:
  case 1:
    *param_1 = 3;
    iVar3 = FUN_0004de08(param_3);
    if (iVar3 != 0) {
      param_1[1] = 2;
LAB_0004c5e6:
      iVar3 = FUN_0004de0c(param_3);
      if (iVar3 != 0) {
        uVar1 = 1;
        goto LAB_0004c5f2;
      }
      goto LAB_0004c60a;
    }
    param_1[1] = 4;
    iVar3 = FUN_0004de0c(param_3);
    if (iVar3 == 0) goto LAB_0004c646;
    param_1[2] = 1;
    uVar1 = 2;
    break;
  case 2:
    iVar3 = FUN_0004de08(param_3);
    if (iVar3 == 0) {
LAB_0004c624:
      *param_1 = 4;
      iVar3 = FUN_0004de0c(param_3);
      if (iVar3 != 0) {
        uVar1 = 2;
        goto LAB_0004c634;
      }
      param_1[2] = 3;
      uVar1 = 2;
    }
    else {
      *param_1 = 2;
      iVar3 = FUN_0004de0c(param_3);
      if (iVar3 != 0) {
        uVar1 = 4;
LAB_0004c634:
        param_1[2] = uVar1;
        param_1[1] = 1;
        uVar1 = 3;
        break;
      }
      param_1[2] = 3;
      uVar1 = 4;
    }
    param_1[1] = uVar1;
    goto LAB_0004c64a;
  case 3:
    iVar3 = FUN_0004de08(param_3);
    if (iVar3 != 0) {
      param_1[1] = 2;
      *param_1 = 3;
      goto LAB_0004c5e6;
    }
    param_1[1] = 3;
    *param_1 = 4;
LAB_0004c646:
    uVar1 = 2;
    goto LAB_0004c648;
  case 4:
    iVar3 = FUN_0004de08(param_3);
    if (iVar3 == 0) goto LAB_0004c624;
    param_1[1] = 3;
    *param_1 = 2;
LAB_0004c60a:
    uVar1 = 4;
LAB_0004c648:
    param_1[2] = uVar1;
LAB_0004c64a:
    uVar1 = 0;
    break;
  default:
    param_1[1] = 3;
    *param_1 = 2;
    uVar1 = 0;
LAB_0004c5f2:
    param_1[2] = uVar1;
    uVar1 = 4;
  }
  param_1[3] = uVar1;
  uVar2 = FUN_0004de1c(param_3);
  switch(uVar2) {
  case 0:
  case 1:
    *param_2 = 3;
    iVar3 = FUN_0004de14(param_3);
    if (iVar3 == 0) {
      param_2[1] = 4;
      iVar3 = FUN_0004de18(param_3);
      if (iVar3 != 0) {
        param_2[2] = 1;
        uVar1 = 2;
        goto LAB_0004c736;
      }
      goto LAB_0004c70c;
    }
    param_2[1] = 2;
LAB_0004c6a8:
    iVar3 = FUN_0004de18(param_3);
    if (iVar3 == 0) {
      uVar1 = 4;
      goto LAB_0004c70e;
    }
    uVar1 = 1;
    goto LAB_0004c6ca;
  case 2:
    iVar3 = FUN_0004de14(param_3);
    if (iVar3 == 0) {
LAB_0004c6e6:
      *param_2 = 4;
      iVar3 = FUN_0004de18(param_3);
      if (iVar3 == 0) {
        param_2[2] = 3;
        uVar1 = 2;
        goto LAB_0004c732;
      }
      uVar1 = 2;
LAB_0004c6f6:
      param_2[2] = uVar1;
      param_2[1] = 1;
      uVar1 = 3;
      goto LAB_0004c736;
    }
    *param_2 = 2;
    iVar3 = FUN_0004de18(param_3);
    if (iVar3 != 0) {
      uVar1 = 4;
      goto LAB_0004c6f6;
    }
    param_2[2] = 3;
    uVar1 = 4;
LAB_0004c732:
    param_2[1] = uVar1;
    break;
  case 3:
    iVar3 = FUN_0004de14(param_3);
    if (iVar3 != 0) {
      param_2[1] = 2;
      *param_2 = 3;
      goto LAB_0004c6a8;
    }
    param_2[1] = 3;
    *param_2 = 4;
LAB_0004c70c:
    uVar1 = 2;
LAB_0004c70e:
    param_2[2] = uVar1;
    break;
  case 4:
    iVar3 = FUN_0004de14(param_3);
    if (iVar3 == 0) goto LAB_0004c6e6;
  default:
    param_2[1] = 3;
    *param_2 = 2;
    uVar1 = 0;
LAB_0004c6ca:
    param_2[2] = uVar1;
    uVar1 = 4;
    goto LAB_0004c736;
  }
  uVar1 = 0;
LAB_0004c736:
  param_2[3] = uVar1;
  return;
}



### FUNC moneypunct_byname @ 0004c73c

/* std::moneypunct_byname<char, false>::moneypunct_byname(_Locale_monetary*) */

moneypunct_byname<char,false> * __thiscall
std::moneypunct_byname<char,false>::moneypunct_byname
          (moneypunct_byname<char,false> *this,_Locale_monetary *param_1)

{
  moneypunct<char,false>::moneypunct((moneypunct<char,false> *)this,0);
  *(_Locale_monetary **)(this + 0x14) = param_1;
  *(undefined ***)this = &PTR__moneypunct_byname_00069774;
  FUN_0004c570(this + 0xc,this + 0x10,param_1);
  return this;
}



### FUNC ~moneypunct_byname @ 0004c780

/* std::moneypunct_byname<char, false>::~moneypunct_byname() */

void __thiscall
std::moneypunct_byname<char,false>::~moneypunct_byname(moneypunct_byname<char,false> *this)

{
  *(undefined ***)this = &PTR__moneypunct_byname_00069774;
  FUN_0004a7a0(*(undefined4 *)(this + 0x14));
  moneypunct<char,false>::~moneypunct((moneypunct<char,false> *)this);
  return;
}



### FUNC ~moneypunct_byname @ 0004c7b4

/* std::moneypunct_byname<char, false>::~moneypunct_byname() */

void __thiscall
std::moneypunct_byname<char,false>::~moneypunct_byname(moneypunct_byname<char,false> *this)

{
  *(undefined ***)this = &PTR__moneypunct_byname_00069774;
  FUN_0004a7a0(*(undefined4 *)(this + 0x14));
  moneypunct<char,false>::~moneypunct((moneypunct<char,false> *)this);
  operator_delete(this);
  return;
}



### FUNC do_decimal_point @ 0004c7f8

/* std::moneypunct_byname<char, false>::do_decimal_point() const */

void __thiscall
std::moneypunct_byname<char,false>::do_decimal_point(moneypunct_byname<char,false> *this)

{
  FUN_0004ddd4(*(undefined4 *)(this + 0x14));
  return;
}



### FUNC do_thousands_sep @ 0004c804

/* std::moneypunct_byname<char, false>::do_thousands_sep() const */

void __thiscall
std::moneypunct_byname<char,false>::do_thousands_sep(moneypunct_byname<char,false> *this)

{
  FUN_0004ddd8(*(undefined4 *)(this + 0x14));
  return;
}



### FUNC do_grouping @ 0004c810

/* std::moneypunct_byname<char, false>::do_grouping() const */

void std::moneypunct_byname<char,false>::do_grouping(void)

{
  int in_r1;
  
  FUN_0004dddc(*(undefined4 *)(in_r1 + 0x14));
  FUN_00031c38();
  return;
}



### FUNC do_curr_symbol @ 0004c830

/* std::moneypunct_byname<char, false>::do_curr_symbol() const */

void std::moneypunct_byname<char,false>::do_curr_symbol(void)

{
  int in_r1;
  
  FUN_0004ddc8(*(undefined4 *)(in_r1 + 0x14));
  FUN_00031c38();
  return;
}



### FUNC do_positive_sign @ 0004c850

/* std::moneypunct_byname<char, false>::do_positive_sign() const */

void std::moneypunct_byname<char,false>::do_positive_sign(void)

{
  int in_r1;
  
  FUN_0004dde8(*(undefined4 *)(in_r1 + 0x14));
  FUN_00031c38();
  return;
}



### FUNC do_negative_sign @ 0004c870

/* std::moneypunct_byname<char, false>::do_negative_sign() const */

void std::moneypunct_byname<char,false>::do_negative_sign(void)

{
  int in_r1;
  
  FUN_0004ddf4(*(undefined4 *)(in_r1 + 0x14));
  FUN_00031c38();
  return;
}



### FUNC do_frac_digits @ 0004c890

/* std::moneypunct_byname<char, false>::do_frac_digits() const */

void __thiscall
std::moneypunct_byname<char,false>::do_frac_digits(moneypunct_byname<char,false> *this)

{
  FUN_0004de04(*(undefined4 *)(this + 0x14));
  return;
}



### FUNC moneypunct_byname @ 0004c89c

/* std::moneypunct_byname<wchar_t, true>::moneypunct_byname(char const*, unsigned int) */

moneypunct_byname<wchar_t,true> * __thiscall
std::moneypunct_byname<wchar_t,true>::moneypunct_byname
          (moneypunct_byname<wchar_t,true> *this,char *param_1,uint param_2)

{
  int iVar1;
  undefined4 uVar2;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  local_14 = param_1;
  moneypunct<wchar_t,true>::moneypunct((moneypunct<wchar_t,true> *)this,param_2);
  *(undefined ***)this = &PTR__moneypunct_byname_000697a8;
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a46c(&local_14,auStack_118,0,&local_18);
    *(int *)(this + 0x14) = iVar1;
    if (iVar1 != 0) {
      FUN_0004c2c4(this + 0xc,this + 0x10);
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"moneypunct");
  moneypunct<wchar_t,true>::~moneypunct((moneypunct<wchar_t,true> *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC moneypunct_byname @ 0004c910

/* std::moneypunct_byname<wchar_t, true>::moneypunct_byname(_Locale_monetary*) */

moneypunct_byname<wchar_t,true> * __thiscall
std::moneypunct_byname<wchar_t,true>::moneypunct_byname
          (moneypunct_byname<wchar_t,true> *this,_Locale_monetary *param_1)

{
  moneypunct<wchar_t,true>::moneypunct((moneypunct<wchar_t,true> *)this,0);
  *(_Locale_monetary **)(this + 0x14) = param_1;
  *(undefined ***)this = &PTR__moneypunct_byname_000697a8;
  FUN_0004c2c4(this + 0xc,this + 0x10,param_1);
  return this;
}



### FUNC ~moneypunct_byname @ 0004c954

/* std::moneypunct_byname<wchar_t, true>::~moneypunct_byname() */

void __thiscall
std::moneypunct_byname<wchar_t,true>::~moneypunct_byname(moneypunct_byname<wchar_t,true> *this)

{
  *(undefined ***)this = &PTR__moneypunct_byname_000697a8;
  FUN_0004a7a0(*(undefined4 *)(this + 0x14));
  moneypunct<wchar_t,true>::~moneypunct((moneypunct<wchar_t,true> *)this);
  return;
}



### FUNC ~moneypunct_byname @ 0004c988

/* std::moneypunct_byname<wchar_t, true>::~moneypunct_byname() */

void __thiscall
std::moneypunct_byname<wchar_t,true>::~moneypunct_byname(moneypunct_byname<wchar_t,true> *this)

{
  *(undefined ***)this = &PTR__moneypunct_byname_000697a8;
  FUN_0004a7a0(*(undefined4 *)(this + 0x14));
  moneypunct<wchar_t,true>::~moneypunct((moneypunct<wchar_t,true> *)this);
  operator_delete(this);
  return;
}



### FUNC do_decimal_point @ 0004c9cc

/* std::moneypunct_byname<wchar_t, true>::do_decimal_point() const */

void __thiscall
std::moneypunct_byname<wchar_t,true>::do_decimal_point(moneypunct_byname<wchar_t,true> *this)

{
  FUN_0004ddd4(*(undefined4 *)(this + 0x14));
  return;
}



### FUNC do_thousands_sep @ 0004c9d8

/* std::moneypunct_byname<wchar_t, true>::do_thousands_sep() const */

void __thiscall
std::moneypunct_byname<wchar_t,true>::do_thousands_sep(moneypunct_byname<wchar_t,true> *this)

{
  FUN_0004ddd8(*(undefined4 *)(this + 0x14));
  return;
}



### FUNC do_grouping @ 0004c9e4

/* std::moneypunct_byname<wchar_t, true>::do_grouping() const */

void std::moneypunct_byname<wchar_t,true>::do_grouping(void)

{
  int in_r1;
  
  FUN_0004dddc(*(undefined4 *)(in_r1 + 0x14));
  FUN_00031c38();
  return;
}



### FUNC do_curr_symbol @ 0004ca04

/* std::moneypunct_byname<wchar_t, true>::do_curr_symbol() const */

void std::moneypunct_byname<wchar_t,true>::do_curr_symbol(void)

{
  int in_r1;
  undefined1 auStack_50 [64];
  
  FUN_0004de20(*(undefined4 *)(in_r1 + 0x14),auStack_50,0x10);
  FUN_0004c174();
  return;
}



### FUNC do_positive_sign @ 0004ca28

/* std::moneypunct_byname<wchar_t, true>::do_positive_sign() const */

void std::moneypunct_byname<wchar_t,true>::do_positive_sign(void)

{
  int in_r1;
  undefined1 auStack_50 [64];
  
  FUN_0004de38(*(undefined4 *)(in_r1 + 0x14),auStack_50,0x10);
  FUN_0004c174();
  return;
}



### FUNC do_negative_sign @ 0004ca4c

/* std::moneypunct_byname<wchar_t, true>::do_negative_sign() const */

void std::moneypunct_byname<wchar_t,true>::do_negative_sign(void)

{
  int in_r1;
  undefined1 auStack_50 [64];
  
  FUN_0004de40(*(undefined4 *)(in_r1 + 0x14),auStack_50,0x10);
  FUN_0004c174();
  return;
}



### FUNC do_frac_digits @ 0004ca70

/* std::moneypunct_byname<wchar_t, true>::do_frac_digits() const */

void __thiscall
std::moneypunct_byname<wchar_t,true>::do_frac_digits(moneypunct_byname<wchar_t,true> *this)

{
  FUN_0004de00(*(undefined4 *)(this + 0x14));
  return;
}



### FUNC moneypunct_byname @ 0004ca7c

/* std::moneypunct_byname<wchar_t, false>::moneypunct_byname(char const*, unsigned int) */

moneypunct_byname<wchar_t,false> * __thiscall
std::moneypunct_byname<wchar_t,false>::moneypunct_byname
          (moneypunct_byname<wchar_t,false> *this,char *param_1,uint param_2)

{
  int iVar1;
  undefined4 uVar2;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  local_14 = param_1;
  moneypunct<wchar_t,false>::moneypunct((moneypunct<wchar_t,false> *)this,param_2);
  *(undefined ***)this = &PTR__moneypunct_byname_000697dc;
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a46c(&local_14,auStack_118,0,&local_18);
    *(int *)(this + 0x14) = iVar1;
    if (iVar1 != 0) {
      FUN_0004c570(this + 0xc,this + 0x10);
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"moneypunct");
  moneypunct<wchar_t,false>::~moneypunct((moneypunct<wchar_t,false> *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC moneypunct_byname @ 0004caf0

/* std::moneypunct_byname<wchar_t, false>::moneypunct_byname(_Locale_monetary*) */

moneypunct_byname<wchar_t,false> * __thiscall
std::moneypunct_byname<wchar_t,false>::moneypunct_byname
          (moneypunct_byname<wchar_t,false> *this,_Locale_monetary *param_1)

{
  moneypunct<wchar_t,false>::moneypunct((moneypunct<wchar_t,false> *)this,0);
  *(_Locale_monetary **)(this + 0x14) = param_1;
  *(undefined ***)this = &PTR__moneypunct_byname_000697dc;
  FUN_0004c570(this + 0xc,this + 0x10,param_1);
  return this;
}



### FUNC ~moneypunct_byname @ 0004cb34

/* std::moneypunct_byname<wchar_t, false>::~moneypunct_byname() */

void __thiscall
std::moneypunct_byname<wchar_t,false>::~moneypunct_byname(moneypunct_byname<wchar_t,false> *this)

{
  *(undefined ***)this = &PTR__moneypunct_byname_000697dc;
  FUN_0004a7a0(*(undefined4 *)(this + 0x14));
  moneypunct<wchar_t,false>::~moneypunct((moneypunct<wchar_t,false> *)this);
  return;
}



### FUNC ~moneypunct_byname @ 0004cb68

/* std::moneypunct_byname<wchar_t, false>::~moneypunct_byname() */

void __thiscall
std::moneypunct_byname<wchar_t,false>::~moneypunct_byname(moneypunct_byname<wchar_t,false> *this)

{
  *(undefined ***)this = &PTR__moneypunct_byname_000697dc;
  FUN_0004a7a0(*(undefined4 *)(this + 0x14));
  moneypunct<wchar_t,false>::~moneypunct((moneypunct<wchar_t,false> *)this);
  operator_delete(this);
  return;
}



### FUNC do_decimal_point @ 0004cbac

/* std::moneypunct_byname<wchar_t, false>::do_decimal_point() const */

void __thiscall
std::moneypunct_byname<wchar_t,false>::do_decimal_point(moneypunct_byname<wchar_t,false> *this)

{
  FUN_0004ddd4(*(undefined4 *)(this + 0x14));
  return;
}



### FUNC do_thousands_sep @ 0004cbb8

/* std::moneypunct_byname<wchar_t, false>::do_thousands_sep() const */

void __thiscall
std::moneypunct_byname<wchar_t,false>::do_thousands_sep(moneypunct_byname<wchar_t,false> *this)

{
  FUN_0004ddd8(*(undefined4 *)(this + 0x14));
  return;
}



### FUNC do_grouping @ 0004cbc4

/* std::moneypunct_byname<wchar_t, false>::do_grouping() const */

void std::moneypunct_byname<wchar_t,false>::do_grouping(void)

{
  int in_r1;
  
  FUN_0004dddc(*(undefined4 *)(in_r1 + 0x14));
  FUN_00031c38();
  return;
}



### FUNC do_curr_symbol @ 0004cbe4

/* std::moneypunct_byname<wchar_t, false>::do_curr_symbol() const */

void std::moneypunct_byname<wchar_t,false>::do_curr_symbol(void)

{
  int in_r1;
  undefined1 auStack_50 [64];
  
  FUN_0004de28(*(undefined4 *)(in_r1 + 0x14),auStack_50,0x10);
  FUN_0004c174();
  return;
}



### FUNC do_positive_sign @ 0004cc08

/* std::moneypunct_byname<wchar_t, false>::do_positive_sign() const */

void std::moneypunct_byname<wchar_t,false>::do_positive_sign(void)

{
  int in_r1;
  undefined1 auStack_50 [64];
  
  FUN_0004de38(*(undefined4 *)(in_r1 + 0x14),auStack_50,0x10);
  FUN_0004c174();
  return;
}



### FUNC do_negative_sign @ 0004cc2c

/* std::moneypunct_byname<wchar_t, false>::do_negative_sign() const */

void std::moneypunct_byname<wchar_t,false>::do_negative_sign(void)

{
  int in_r1;
  undefined1 auStack_50 [64];
  
  FUN_0004de40(*(undefined4 *)(in_r1 + 0x14),auStack_50,0x10);
  FUN_0004c174();
  return;
}



### FUNC do_frac_digits @ 0004cc50

/* std::moneypunct_byname<wchar_t, false>::do_frac_digits() const */

void __thiscall
std::moneypunct_byname<wchar_t,false>::do_frac_digits(moneypunct_byname<wchar_t,false> *this)

{
  FUN_0004de04(*(undefined4 *)(this + 0x14));
  return;
}



### FUNC FUN_0004cc5c @ 0004cc5c

undefined4 * FUN_0004cc5c(undefined4 *param_1,undefined4 *param_2,undefined2 *param_3)

{
  int iVar1;
  int iVar2;
  
  iVar1 = (int)param_2 - (int)param_1 >> 4;
  if (0 < iVar1) {
    iVar1 = iVar1 + 1;
    do {
      iVar2 = FUN_0004dad4(*(undefined4 *)(param_3 + 2),*param_1,*param_3);
      if (iVar2 != 0) {
        return param_1;
      }
      iVar2 = FUN_0004dad4(*(undefined4 *)(param_3 + 2),param_1[1],*param_3);
      if (iVar2 != 0) {
        return param_1 + 1;
      }
      iVar2 = FUN_0004dad4(*(undefined4 *)(param_3 + 2),param_1[2],*param_3);
      if (iVar2 != 0) {
        return param_1 + 2;
      }
      iVar2 = FUN_0004dad4(*(undefined4 *)(param_3 + 2),param_1[3],*param_3);
      if (iVar2 != 0) {
        return param_1 + 3;
      }
      iVar1 = iVar1 + -1;
      param_1 = param_1 + 4;
    } while (1 < iVar1);
  }
  iVar1 = (int)param_2 - (int)param_1 >> 2;
  if (iVar1 != 1) {
    if (iVar1 == 3) {
      iVar1 = FUN_0004dad4(*(undefined4 *)(param_3 + 2),*param_1,*param_3);
      if (iVar1 != 0) {
        return param_1;
      }
      param_1 = param_1 + 1;
    }
    else if (iVar1 != 2) {
      return param_2;
    }
    iVar1 = FUN_0004dad4(*(undefined4 *)(param_3 + 2),*param_1,*param_3);
    if (iVar1 != 0) {
      return param_1;
    }
    param_1 = param_1 + 1;
  }
  iVar1 = FUN_0004dad4(*(undefined4 *)(param_3 + 2),*param_1,*param_3);
  if (iVar1 == 0) {
    return param_2;
  }
  return param_1;
}



### FUNC FUN_0004cd16 @ 0004cd16

undefined4 * FUN_0004cd16(undefined4 *param_1,undefined4 *param_2,int param_3)

{
  int iVar1;
  int iVar2;
  
  iVar1 = (int)param_2 - (int)param_1 >> 4;
  if (0 < iVar1) {
    iVar1 = iVar1 + 1;
    do {
      iVar2 = FUN_0004dad4(*(undefined4 *)(param_3 + 8),*param_1,*(undefined2 *)(param_3 + 4));
      if (iVar2 == 0) {
        return param_1;
      }
      iVar2 = FUN_0004dad4(*(undefined4 *)(param_3 + 8),param_1[1],*(undefined2 *)(param_3 + 4));
      if (iVar2 == 0) {
        return param_1 + 1;
      }
      iVar2 = FUN_0004dad4(*(undefined4 *)(param_3 + 8),param_1[2],*(undefined2 *)(param_3 + 4));
      if (iVar2 == 0) {
        return param_1 + 2;
      }
      iVar2 = FUN_0004dad4(*(undefined4 *)(param_3 + 8),param_1[3],*(undefined2 *)(param_3 + 4));
      if (iVar2 == 0) {
        return param_1 + 3;
      }
      iVar1 = iVar1 + -1;
      param_1 = param_1 + 4;
    } while (1 < iVar1);
  }
  iVar1 = (int)param_2 - (int)param_1 >> 2;
  if (iVar1 != 1) {
    if (iVar1 == 3) {
      iVar1 = FUN_0004dad4(*(undefined4 *)(param_3 + 8),*param_1,*(undefined2 *)(param_3 + 4));
      if (iVar1 == 0) {
        return param_1;
      }
      param_1 = param_1 + 1;
    }
    else if (iVar1 != 2) {
      return param_2;
    }
    iVar1 = FUN_0004dad4(*(undefined4 *)(param_3 + 8),*param_1,*(undefined2 *)(param_3 + 4));
    if (iVar1 == 0) {
      return param_1;
    }
    param_1 = param_1 + 1;
  }
  iVar1 = FUN_0004dad4(*(undefined4 *)(param_3 + 8),*param_1,*(undefined2 *)(param_3 + 4));
  if (iVar1 != 0) {
    return param_2;
  }
  return param_1;
}



### FUNC FUN_0004cde4 @ 0004cde4

pthread_mutex_t * FUN_0004cde4(pthread_mutex_t *param_1)

{
  pthread_mutex_destroy(param_1);
  return param_1;
}



### FUNC allocate @ 0004cdf4

/* std::__malloc_alloc::allocate(unsigned int) */

void std::__malloc_alloc::allocate(uint param_1)

{
  code *pcVar1;
  void *pvVar2;
  undefined4 uVar3;
  
  pvVar2 = malloc(param_1);
  while( true ) {
    if (pvVar2 != (void *)0x0) {
      return;
    }
    pthread_mutex_lock((pthread_mutex_t *)&DAT_00070de0);
    pcVar1 = DAT_00070de4;
    pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070de0);
    if (pcVar1 == (code *)0x0) break;
    (*pcVar1)();
    pvVar2 = malloc(param_1);
  }
  FUN_00030824(4);
  uVar3 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(uVar3,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
}



### FUNC set_malloc_handler @ 0004ce58

/* std::__malloc_alloc::set_malloc_handler(void (*)()) */

undefined4 std::__malloc_alloc::set_malloc_handler(_func_void *param_1)

{
  undefined4 uVar1;
  
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070de0);
  uVar1 = DAT_00070de4;
  DAT_00070de4 = param_1;
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070de0);
  return uVar1;
}



### FUNC FUN_0004ce88 @ 0004ce88

undefined4 * FUN_0004ce88(uint *param_1)

{
  int iVar1;
  undefined4 *puVar2;
  int iVar3;
  uint uVar4;
  undefined4 *puVar5;
  int local_18;
  
  uVar4 = *param_1 + 7 & 0xfffffff8;
  *param_1 = uVar4;
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070e50);
  iVar1 = (uVar4 - 1 >> 3) * 4;
  puVar5 = *(undefined4 **)(&DAT_00070de8 + iVar1);
  if (puVar5 == (undefined4 *)0x0) {
    uVar4 = *param_1;
    local_18 = 0x14;
    puVar5 = (undefined4 *)FUN_0004cfe0(uVar4,&local_18);
    if (local_18 != 1) {
      puVar2 = (undefined4 *)((int)puVar5 + uVar4);
      *(undefined4 **)(&DAT_00070de8 + (uVar4 - 1 >> 1 & 0x7ffffffc)) = puVar2;
      iVar1 = local_18 + -2;
      if (local_18 + -2 != 0) {
        iVar3 = 2 - local_18;
        iVar1 = local_18 + -1;
        puVar2 = puVar5;
        do {
          *(uint *)((int)puVar2 + uVar4) = (int)puVar2 + uVar4 * 2;
          puVar2 = (undefined4 *)((int)puVar2 + uVar4);
          iVar3 = iVar3 + 1;
        } while (iVar3 != 0);
        local_18 = 0;
        puVar2 = (undefined4 *)((int)puVar5 + uVar4 * iVar1);
        iVar1 = local_18;
      }
      local_18 = iVar1;
      *puVar2 = 0;
    }
  }
  else {
    *(undefined4 *)(&DAT_00070de8 + iVar1) = *puVar5;
  }
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070e50);
  return puVar5;
}



### FUNC FUN_0004cf48 @ 0004cf48

void FUN_0004cf48(int param_1)

{
  int iVar1;
  undefined4 *puVar2;
  int iVar3;
  int local_18;
  
  local_18 = 0x14;
  iVar1 = FUN_0004cfe0(param_1,&local_18);
  if (local_18 != 1) {
    puVar2 = (undefined4 *)(iVar1 + param_1);
    *(undefined4 **)(&DAT_00070de8 + (param_1 - 1U >> 1 & 0x7ffffffc)) = puVar2;
    if (local_18 != 2) {
      iVar3 = 2 - local_18;
      puVar2 = (undefined4 *)(iVar1 + param_1 * (local_18 + -1));
      do {
        *(int *)(iVar1 + param_1) = iVar1 + param_1 * 2;
        iVar1 = iVar1 + param_1;
        iVar3 = iVar3 + 1;
      } while (iVar3 != 0);
    }
    *puVar2 = 0;
  }
  return;
}



### FUNC FUN_0004cfa4 @ 0004cfa4

void FUN_0004cfa4(undefined4 *param_1,int param_2)

{
  uint uVar1;
  
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070e50);
  uVar1 = param_2 - 1U >> 1 & 0x7ffffffc;
  *param_1 = *(undefined4 *)(&DAT_00070de8 + uVar1);
  *(undefined4 **)(&DAT_00070de8 + uVar1) = param_1;
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070e50);
  return;
}



### FUNC FUN_0004cfe0 @ 0004cfe0

undefined4 * FUN_0004cfe0(uint param_1,int *param_2)

{
  undefined4 *puVar1;
  uint uVar2;
  int iVar3;
  uint uVar4;
  
  do {
    puVar1 = DAT_00070e2c;
    uVar2 = DAT_00070e28 - (int)DAT_00070e2c;
    uVar4 = param_1 * *param_2;
    if (uVar2 != 0) {
      if (uVar4 <= uVar2) goto LAB_0004d0ca;
      if (param_1 <= uVar2) {
        iVar3 = __udivsi3(uVar2,param_1);
        *param_2 = iVar3;
        uVar4 = iVar3 * param_1;
LAB_0004d0ca:
        DAT_00070e2c = (undefined4 *)((int)puVar1 + uVar4);
        return puVar1;
      }
      uVar2 = uVar2 - 1 >> 1 & 0x7ffffffc;
      *DAT_00070e2c = *(undefined4 *)(&DAT_00070de8 + uVar2);
      *(undefined4 **)(&DAT_00070de8 + uVar2) = DAT_00070e2c;
      DAT_00070e2c = (undefined4 *)0x0;
      DAT_00070e28 = 0;
    }
    uVar4 = (DAT_00070e30 + 7U & 0xfffffff8) + uVar4 * 2;
    DAT_00070e2c = (undefined4 *)operator_new(uVar4);
    DAT_00070e28 = (int)DAT_00070e2c + uVar4;
    DAT_00070e30 = DAT_00070e30 + (uVar4 >> 4);
  } while( true );
}



### FUNC _M_allocate @ 0004d150

/* std::__node_alloc::_M_allocate(unsigned int&) */

void std::__node_alloc::_M_allocate(uint *param_1)

{
  FUN_0004ce88();
  return;
}



### FUNC _M_deallocate @ 0004d15c

/* std::__node_alloc::_M_deallocate(void*, unsigned int) */

void std::__node_alloc::_M_deallocate(void *param_1,uint param_2)

{
  uint uVar1;
  
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070e50);
  uVar1 = param_2 - 1 >> 1 & 0x7ffffffc;
  *(undefined4 *)param_1 = *(undefined4 *)(&DAT_00070de8 + uVar1);
  *(void **)(&DAT_00070de8 + uVar1) = param_1;
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070e50);
  return;
}



### FUNC FUN_0004d198 @ 0004d198

void FUN_0004d198(int param_1,int param_2)

{
  int iVar1;
  undefined4 *puVar2;
  int local_18;
  
  local_18 = 0x80;
  iVar1 = FUN_0004d1f0(param_2,&local_18,param_1);
  if (local_18 != 1) {
    puVar2 = (undefined4 *)(iVar1 + param_2);
    *(undefined4 **)(param_1 + (param_2 + 7U >> 1 & 0x7ffffffc) + -4) = puVar2;
    if (local_18 != 2) {
      puVar2 = (undefined4 *)(iVar1 + param_2 * (local_18 + -1));
      local_18 = local_18 + -2;
      do {
        *(int *)(iVar1 + param_2) = iVar1 + param_2 * 2;
        iVar1 = iVar1 + param_2;
        local_18 = local_18 + -1;
      } while (local_18 != 0);
    }
    *puVar2 = 0;
  }
  return;
}



### FUNC FUN_0004d1f0 @ 0004d1f0

undefined4 * FUN_0004d1f0(uint param_1,int *param_2,int param_3)

{
  undefined4 *puVar1;
  uint uVar2;
  int iVar3;
  uint uVar4;
  
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070e4c);
  uVar2 = DAT_00070e40 - (int)DAT_00070e44;
  iVar3 = *param_2;
  do {
    puVar1 = DAT_00070e44;
    uVar4 = param_1 * iVar3;
    if (uVar4 <= uVar2) {
LAB_0004d2a8:
      DAT_00070e44 = (undefined4 *)((int)puVar1 + uVar4);
      pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070e4c);
      return puVar1;
    }
    if (param_1 <= uVar2) {
      iVar3 = __udivsi3(uVar2,param_1);
      *param_2 = iVar3;
      uVar4 = iVar3 * param_1;
      goto LAB_0004d2a8;
    }
    uVar4 = (DAT_00070e48 + 7U & 0xfffffff8) + uVar4 * 2;
    if (uVar2 != 0) {
      iVar3 = param_3 + (uVar2 + 7 >> 1 & 0x7ffffffc);
      *DAT_00070e44 = *(undefined4 *)(iVar3 + -4);
      *(undefined4 **)(iVar3 + -4) = DAT_00070e44;
    }
    DAT_00070e44 = (undefined4 *)std::__malloc_alloc::allocate(uVar4);
    DAT_00070e40 = (int)DAT_00070e44 + uVar4;
    DAT_00070e48 = DAT_00070e48 + (uVar4 >> 4);
    pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070e4c);
    pthread_mutex_lock((pthread_mutex_t *)&DAT_00070e4c);
    uVar2 = DAT_00070e40 - (int)DAT_00070e44;
    iVar3 = *param_2;
  } while( true );
}



### FUNC FUN_0004d308 @ 0004d308

void FUN_0004d308(int param_1)

{
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070e4c);
  *(int *)(param_1 + 0x40) = DAT_00070e34;
  DAT_00070e34 = param_1;
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070e4c);
  return;
}



### FUNC FUN_0004d334 @ 0004d334

void * FUN_0004d334(void)

{
  void *pvVar1;
  
  pvVar1 = DAT_00070e34;
  if (DAT_00070e34 != (void *)0x0) {
    DAT_00070e34 = (void *)*(undefined4 *)((int)DAT_00070e34 + 0x40);
    return pvVar1;
  }
  pvVar1 = operator_new(0x48);
  *(undefined4 *)((int)pvVar1 + 0x40) = 0;
  pthread_mutex_init((pthread_mutex_t *)((int)pvVar1 + 0x44),(pthread_mutexattr_t *)0x0);
  __aeabi_memclr(pvVar1,0x40);
  return pvVar1;
}



### FUNC FUN_0004d384 @ 0004d384

void * FUN_0004d384(void)

{
  void *pvVar1;
  int iVar2;
  undefined4 uVar3;
  
  if ((DAT_00070e38 != '\0') && (pvVar1 = pthread_getspecific(DAT_00070e3c), pvVar1 != (void *)0x0))
  {
    return pvVar1;
  }
  pthread_mutex_lock((pthread_mutex_t *)&DAT_00070e4c);
  if (DAT_00070e38 == '\0') {
    iVar2 = pthread_key_create(&DAT_00070e3c,(__destr_function *)0x4d309);
    if (iVar2 != 0) {
      FUN_00030824(4);
      uVar3 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
      FUN_000309e0(uVar3,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
    }
    DAT_00070e38 = '\x01';
  }
  if (DAT_00070e34 == (void *)0x0) {
    pvVar1 = operator_new(0x48);
    *(undefined4 *)((int)pvVar1 + 0x40) = 0;
    pthread_mutex_init((pthread_mutex_t *)((int)pvVar1 + 0x44),(pthread_mutexattr_t *)0x0);
    __aeabi_memclr(pvVar1,0x40);
  }
  else {
    pvVar1 = DAT_00070e34;
    DAT_00070e34 = *(void **)((int)DAT_00070e34 + 0x40);
  }
  iVar2 = pthread_setspecific(DAT_00070e3c,pvVar1);
  if (iVar2 == 0) {
    pthread_mutex_unlock((pthread_mutex_t *)&DAT_00070e4c);
    return pvVar1;
  }
  if (iVar2 == 0xc) {
    FUN_00030824(4);
    uVar3 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
    FUN_000309e0(uVar3,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
  }
                    /* WARNING: Subroutine does not return */
  abort();
}



### FUNC FUN_0004d4b8 @ 0004d4b8

void FUN_0004d4b8(uint *param_1)

{
  uint uVar1;
  int iVar2;
  int iVar3;
  undefined4 *puVar4;
  int iVar5;
  int local_18;
  
  uVar1 = *param_1;
  if (0x80 < uVar1) {
    std::__malloc_alloc::allocate(uVar1);
    return;
  }
  *param_1 = uVar1 + 7 & 0xfffffff8;
  iVar2 = FUN_0004d384();
  uVar1 = *param_1;
  iVar5 = ((uVar1 + 7 >> 3) - 1) * 4;
  if (*(undefined4 **)(iVar2 + iVar5) != (undefined4 *)0x0) {
    *(undefined4 *)(iVar2 + iVar5) = **(undefined4 **)(iVar2 + iVar5);
    return;
  }
  local_18 = 0x80;
  iVar3 = FUN_0004d1f0(uVar1,&local_18,iVar2);
  if (local_18 == 1) {
    return;
  }
  puVar4 = (undefined4 *)(iVar3 + uVar1);
  *(undefined4 **)(iVar2 + iVar5) = puVar4;
  if (local_18 != 2) {
    iVar5 = local_18 + -2;
    iVar2 = iVar3;
    do {
      *(uint *)(iVar2 + uVar1) = iVar2 + uVar1 * 2;
      iVar2 = iVar2 + uVar1;
      iVar5 = iVar5 + -1;
    } while (iVar5 != 0);
    puVar4 = (undefined4 *)(iVar3 + uVar1 * (local_18 + -1));
  }
  *puVar4 = 0;
  return;
}



### FUNC FUN_0004d534 @ 0004d534

void FUN_0004d534(undefined4 *param_1,uint param_2)

{
  int iVar1;
  
  if (0x80 < param_2) {
    free(param_1);
    return;
  }
  iVar1 = FUN_0004d384();
  iVar1 = iVar1 + (param_2 + 7 >> 1 & 0x7ffffffc);
  *param_1 = *(undefined4 *)(iVar1 + -4);
  *(undefined4 **)(iVar1 + -4) = param_1;
  return;
}



### FUNC FUN_0004d564 @ 0004d564

undefined4 * FUN_0004d564(uint *param_1,int param_2)

{
  uint uVar1;
  undefined4 *puVar2;
  undefined4 *puVar3;
  int iVar4;
  int local_18;
  
  uVar1 = *param_1;
  if (uVar1 < 0x81) {
    *param_1 = uVar1 + 7 & 0xfffffff8;
    pthread_mutex_lock((pthread_mutex_t *)(param_2 + 0x44));
    uVar1 = *param_1;
    iVar4 = ((uVar1 + 7 >> 3) - 1) * 4;
    puVar2 = *(undefined4 **)(param_2 + iVar4);
    if (puVar2 == (undefined4 *)0x0) {
      local_18 = 0x80;
      puVar2 = (undefined4 *)FUN_0004d1f0(uVar1,&local_18,param_2);
      if (local_18 != 1) {
        puVar3 = (undefined4 *)((int)puVar2 + uVar1);
        *(undefined4 **)(param_2 + iVar4) = puVar3;
        if (local_18 != 2) {
          iVar4 = local_18 + -2;
          puVar3 = puVar2;
          do {
            *(uint *)((int)puVar3 + uVar1) = (int)puVar3 + uVar1 * 2;
            puVar3 = (undefined4 *)((int)puVar3 + uVar1);
            iVar4 = iVar4 + -1;
          } while (iVar4 != 0);
          puVar3 = (undefined4 *)((int)puVar2 + uVar1 * (local_18 + -1));
        }
        *puVar3 = 0;
      }
    }
    else {
      *(undefined4 *)(param_2 + iVar4) = *puVar2;
    }
    pthread_mutex_unlock((pthread_mutex_t *)(param_2 + 0x44));
  }
  else {
    puVar2 = (undefined4 *)std::__malloc_alloc::allocate(uVar1);
  }
  return puVar2;
}



### FUNC allocate @ 0004d6c4

/* std::priv::_Pthread_alloc::allocate(unsigned int&) */

void std::priv::_Pthread_alloc::allocate(uint *param_1)

{
  FUN_0004d4b8();
  return;
}



### FUNC deallocate @ 0004d6d0

/* std::priv::_Pthread_alloc::deallocate(void*, unsigned int) */

void std::priv::_Pthread_alloc::deallocate(void *param_1,uint param_2)

{
  int iVar1;
  
  if (0x80 < param_2) {
    free(param_1);
    return;
  }
  iVar1 = FUN_0004d384();
  iVar1 = iVar1 + (param_2 + 7 >> 1 & 0x7ffffffc);
  *(undefined4 *)param_1 = *(undefined4 *)(iVar1 + -4);
  *(void **)(iVar1 + -4) = param_1;
  return;
}



### FUNC allocate @ 0004d700

/* std::priv::_Pthread_alloc::allocate(unsigned int&, std::priv::_Pthread_alloc_per_thread_state*)
    */

void std::priv::_Pthread_alloc::allocate(uint *param_1,_Pthread_alloc_per_thread_state *param_2)

{
  FUN_0004d564();
  return;
}



### FUNC deallocate @ 0004d70c

/* std::priv::_Pthread_alloc::deallocate(void*, unsigned int,
   std::priv::_Pthread_alloc_per_thread_state*) */

void std::priv::_Pthread_alloc::deallocate
               (void *param_1,uint param_2,_Pthread_alloc_per_thread_state *param_3)

{
  uint uVar1;
  
  if (0x80 < param_2) {
    free(param_1);
    return;
  }
  pthread_mutex_lock((pthread_mutex_t *)(param_3 + 0x44));
  uVar1 = param_2 + 7 >> 1 & 0x7ffffffc;
  *(undefined4 *)param_1 = *(undefined4 *)(param_3 + (uVar1 - 4));
  *(void **)(param_3 + (uVar1 - 4)) = param_1;
  pthread_mutex_unlock((pthread_mutex_t *)(param_3 + 0x44));
  return;
}



### FUNC reallocate @ 0004d754

/* std::priv::_Pthread_alloc::reallocate(void*, unsigned int, unsigned int&) */

void * std::priv::_Pthread_alloc::reallocate(void *param_1,uint param_2,uint *param_3)

{
  void *pvVar1;
  int iVar2;
  uint uVar3;
  
  uVar3 = *param_3;
  if ((param_2 < 0x81) || (uVar3 < 0x81)) {
    if (7 < (uVar3 + 7 ^ param_2 + 7)) {
      pvVar1 = (void *)FUN_0004d4b8(param_3);
      uVar3 = param_2;
      if (*param_3 <= param_2) {
        uVar3 = *param_3;
      }
      __aeabi_memcpy(pvVar1,param_1,uVar3);
      if (param_2 < 0x81) {
        iVar2 = FUN_0004d384();
        iVar2 = iVar2 + (param_2 + 7 >> 1 & 0x7ffffffc);
        *(undefined4 *)param_1 = *(undefined4 *)(iVar2 + -4);
        *(void **)(iVar2 + -4) = param_1;
        param_1 = pvVar1;
      }
      else {
        free(param_1);
        param_1 = pvVar1;
      }
    }
  }
  else {
    param_1 = realloc(param_1,uVar3);
  }
  return param_1;
}



### FUNC _S_get_per_thread_state @ 0004d7d0

/* std::priv::_Pthread_alloc::_S_get_per_thread_state() */

void std::priv::_Pthread_alloc::_S_get_per_thread_state(void)

{
  FUN_0004d384();
  return;
}



### FUNC FUN_0004d7dc @ 0004d7dc

void FUN_0004d7dc(void)

{
  int iVar1;
  int iVar2;
  ushort *puVar3;
  bool bVar4;
  
  puVar3 = &DAT_00070e54;
  iVar2 = 0;
  do {
    iVar1 = isalpha(iVar2);
    if (iVar1 != 0) {
      *puVar3 = *puVar3 | 0x20;
    }
    iVar1 = iscntrl(iVar2);
    if (iVar1 != 0) {
      *puVar3 = *puVar3 | 4;
    }
    if (iVar2 - 0x30U < 10) {
      *puVar3 = *puVar3 | 0x40;
    }
    iVar1 = isprint(iVar2);
    if (iVar1 != 0) {
      *puVar3 = *puVar3 | 2;
    }
    iVar1 = ispunct(iVar2);
    if (iVar1 != 0) {
      *puVar3 = *puVar3 | 0x80;
    }
    iVar1 = isspace(iVar2);
    if (iVar1 != 0) {
      *puVar3 = *puVar3 | 1;
    }
    iVar1 = isxdigit(iVar2);
    if (iVar1 != 0) {
      *puVar3 = *puVar3 | 0x100;
    }
    iVar1 = isupper(iVar2);
    if (iVar1 != 0) {
      *puVar3 = *puVar3 | 8;
    }
    iVar1 = islower(iVar2);
    if (iVar1 != 0) {
      *puVar3 = *puVar3 | 0x10;
    }
    puVar3 = puVar3 + 1;
    bVar4 = iVar2 != 0x7f;
    iVar2 = iVar2 + 1;
  } while (bVar4);
  __aeabi_memclr4(&DAT_00070f54);
  return;
}



### FUNC FUN_0004d8ac @ 0004d8ac

void FUN_0004d8ac(void)

{
  return;
}



### FUNC FUN_0004d8c4 @ 0004d8c4

undefined4 FUN_0004d8c4(char *param_1,undefined4 param_2,undefined4 *param_3)

{
  undefined4 uVar1;
  
  if ((*param_1 != 'C') || (uVar1 = 1, param_1[1] != '\0')) {
    *param_3 = 3;
    uVar1 = 0;
  }
  return uVar1;
}



### FUNC FUN_0004d8da @ 0004d8da

undefined4 FUN_0004d8da(char *param_1,undefined4 param_2,undefined4 *param_3)

{
  undefined4 uVar1;
  
  if ((*param_1 != 'C') || (uVar1 = 1, param_1[1] != '\0')) {
    *param_3 = 3;
    uVar1 = 0;
  }
  return uVar1;
}



### FUNC FUN_0004d8f0 @ 0004d8f0

undefined4 FUN_0004d8f0(char *param_1,undefined4 param_2,undefined4 *param_3)

{
  undefined4 uVar1;
  
  if ((*param_1 != 'C') || (uVar1 = 1, param_1[1] != '\0')) {
    *param_3 = 3;
    uVar1 = 0;
  }
  return uVar1;
}



### FUNC FUN_0004d906 @ 0004d906

undefined4 FUN_0004d906(char *param_1,undefined4 param_2,undefined4 *param_3)

{
  undefined4 uVar1;
  
  if ((*param_1 != 'C') || (uVar1 = 1, param_1[1] != '\0')) {
    *param_3 = 3;
    uVar1 = 0;
  }
  return uVar1;
}



### FUNC FUN_0004d91c @ 0004d91c

undefined4 FUN_0004d91c(char *param_1,undefined4 param_2,undefined4 *param_3)

{
  undefined4 uVar1;
  
  if ((*param_1 != 'C') || (uVar1 = 1, param_1[1] != '\0')) {
    *param_3 = 3;
    uVar1 = 0;
  }
  return uVar1;
}



### FUNC FUN_0004d932 @ 0004d932

undefined4 FUN_0004d932(char *param_1,undefined4 param_2,undefined4 *param_3)

{
  undefined4 uVar1;
  
  if ((*param_1 != 'C') || (uVar1 = 1, param_1[1] != '\0')) {
    *param_3 = 3;
    uVar1 = 0;
  }
  return uVar1;
}



### FUNC FUN_0004d948 @ 0004d948

undefined4 FUN_0004d948(char *param_1,undefined4 param_2,undefined4 *param_3)

{
  undefined4 uVar1;
  
  if ((*param_1 != 'C') || (uVar1 = 1, param_1[1] != '\0')) {
    *param_3 = 3;
    uVar1 = 0;
  }
  return uVar1;
}



### FUNC FUN_0004d960 @ 0004d960

undefined * FUN_0004d960(void)

{
  return &DAT_0004d964;
}



### FUNC FUN_0004d968 @ 0004d968

undefined * FUN_0004d968(void)

{
  return &DAT_0004d96c;
}



### FUNC FUN_0004d970 @ 0004d970

undefined * FUN_0004d970(void)

{
  return &DAT_0004d974;
}



### FUNC FUN_0004d978 @ 0004d978

undefined * FUN_0004d978(void)

{
  return &DAT_0004d97c;
}



### FUNC FUN_0004d980 @ 0004d980

undefined * FUN_0004d980(void)

{
  return &DAT_0004d984;
}



### FUNC FUN_0004d988 @ 0004d988

undefined * FUN_0004d988(void)

{
  return &DAT_0004d98c;
}



### FUNC FUN_0004d990 @ 0004d990

undefined * FUN_0004d990(void)

{
  return &DAT_0004d994;
}



### FUNC FUN_0004d998 @ 0004d998

undefined * FUN_0004d998(void)

{
  return &DAT_0004d99c;
}



### FUNC FUN_0004d9a0 @ 0004d9a0

undefined * FUN_0004d9a0(void)

{
  return &DAT_0004d9a4;
}



### FUNC FUN_0004d9a8 @ 0004d9a8

undefined * FUN_0004d9a8(void)

{
  return &DAT_0004d9ac;
}



### FUNC FUN_0004d9b0 @ 0004d9b0

undefined * FUN_0004d9b0(void)

{
  return &DAT_0004d9b4;
}



### FUNC FUN_0004d9b8 @ 0004d9b8

undefined * FUN_0004d9b8(void)

{
  return &DAT_0004d9bc;
}



### FUNC FUN_0004d9c0 @ 0004d9c0

undefined * FUN_0004d9c0(void)

{
  return &DAT_0004d9c4;
}



### FUNC FUN_0004d9c8 @ 0004d9c8

void FUN_0004d9c8(void)

{
  return;
}



### FUNC FUN_0004d9ca @ 0004d9ca

void FUN_0004d9ca(void)

{
  return;
}



### FUNC FUN_0004d9cc @ 0004d9cc

void FUN_0004d9cc(void)

{
  return;
}



### FUNC FUN_0004d9ce @ 0004d9ce

void FUN_0004d9ce(void)

{
  return;
}



### FUNC FUN_0004d9d0 @ 0004d9d0

void FUN_0004d9d0(void)

{
  return;
}



### FUNC FUN_0004d9d2 @ 0004d9d2

void FUN_0004d9d2(void)

{
  return;
}



### FUNC FUN_0004d9d4 @ 0004d9d4

void FUN_0004d9d4(void)

{
  return;
}



### FUNC FUN_0004d9d8 @ 0004d9d8

undefined * FUN_0004d9d8(char *param_1,undefined4 param_2,undefined4 param_3,undefined4 *param_4)

{
  undefined *puVar1;
  
  puVar1 = &DAT_0004d9f4;
  if ((*param_1 != '\0') && ((*param_1 != 'C' || (param_1[1] != '\0')))) {
    *param_4 = 3;
    puVar1 = (undefined *)0x0;
  }
  return puVar1;
}



### FUNC FUN_0004d9f8 @ 0004d9f8

undefined * FUN_0004d9f8(char *param_1,undefined4 param_2,undefined4 param_3,undefined4 *param_4)

{
  undefined *puVar1;
  
  puVar1 = &DAT_0004da14;
  if ((*param_1 != '\0') && ((*param_1 != 'C' || (param_1[1] != '\0')))) {
    *param_4 = 3;
    puVar1 = (undefined *)0x0;
  }
  return puVar1;
}



### FUNC FUN_0004da18 @ 0004da18

undefined * FUN_0004da18(char *param_1,undefined4 param_2,undefined4 param_3,undefined4 *param_4)

{
  undefined *puVar1;
  
  puVar1 = &DAT_0004da34;
  if ((*param_1 != '\0') && ((*param_1 != 'C' || (param_1[1] != '\0')))) {
    *param_4 = 3;
    puVar1 = (undefined *)0x0;
  }
  return puVar1;
}



### FUNC FUN_0004da38 @ 0004da38

undefined * FUN_0004da38(char *param_1,undefined4 param_2,undefined4 param_3,undefined4 *param_4)

{
  undefined *puVar1;
  
  puVar1 = &DAT_0004da54;
  if ((*param_1 != '\0') && ((*param_1 != 'C' || (param_1[1] != '\0')))) {
    *param_4 = 3;
    puVar1 = (undefined *)0x0;
  }
  return puVar1;
}



### FUNC FUN_0004da58 @ 0004da58

undefined * FUN_0004da58(char *param_1,undefined4 param_2,undefined4 param_3,undefined4 *param_4)

{
  undefined *puVar1;
  
  puVar1 = &DAT_0004da74;
  if ((*param_1 != '\0') && ((*param_1 != 'C' || (param_1[1] != '\0')))) {
    *param_4 = 3;
    puVar1 = (undefined *)0x0;
  }
  return puVar1;
}



### FUNC FUN_0004da78 @ 0004da78

undefined * FUN_0004da78(char *param_1,undefined4 param_2,undefined4 param_3,undefined4 *param_4)

{
  undefined *puVar1;
  
  puVar1 = &DAT_0004da94;
  if ((*param_1 != '\0') && ((*param_1 != 'C' || (param_1[1] != '\0')))) {
    *param_4 = 3;
    puVar1 = (undefined *)0x0;
  }
  return puVar1;
}



### FUNC FUN_0004da98 @ 0004da98

undefined4 FUN_0004da98(void)

{
  return 0;
}



### FUNC FUN_0004da9c @ 0004da9c

undefined4 FUN_0004da9c(void)

{
  return 0;
}



### FUNC FUN_0004daa0 @ 0004daa0

undefined4 FUN_0004daa0(void)

{
  return 0;
}



### FUNC FUN_0004daa4 @ 0004daa4

undefined4 FUN_0004daa4(void)

{
  return 0;
}



### FUNC FUN_0004daa8 @ 0004daa8

undefined4 FUN_0004daa8(void)

{
  return 0;
}



### FUNC FUN_0004dab0 @ 0004dab0

undefined2 * FUN_0004dab0(void)

{
  return &DAT_00070e54;
}



### FUNC FUN_0004dabc @ 0004dabc

void FUN_0004dabc(undefined4 param_1,int param_2)

{
  toupper(param_2);
  return;
}



### FUNC FUN_0004dac8 @ 0004dac8

void FUN_0004dac8(undefined4 param_1,int param_2)

{
  tolower(param_2);
  return;
}



### FUNC FUN_0004dad4 @ 0004dad4

uint FUN_0004dad4(undefined4 param_1,wint_t param_2,uint param_3)

{
  int iVar1;
  uint uVar2;
  
  uVar2 = 0;
  if (((param_3 & 0x20) != 0) && (iVar1 = iswalpha(param_2), uVar2 = 0x20, iVar1 == 0)) {
    uVar2 = 0;
  }
  if ((int)(param_3 << 0x1d) < 0) {
    iVar1 = iswcntrl(param_2);
    if (iVar1 != 0) {
      uVar2 = uVar2 | 4;
    }
  }
  if ((int)(param_3 << 0x19) < 0) {
    iVar1 = iswdigit(param_2);
    if (iVar1 != 0) {
      uVar2 = uVar2 | 0x40;
    }
  }
  if ((int)(param_3 << 0x1e) < 0) {
    iVar1 = iswprint(param_2);
    if (iVar1 != 0) {
      uVar2 = uVar2 | 2;
    }
  }
  if ((int)(param_3 << 0x18) < 0) {
    iVar1 = iswpunct(param_2);
    if (iVar1 != 0) {
      uVar2 = uVar2 | 0x80;
    }
  }
  if ((param_3 & 1) != 0) {
    iVar1 = iswspace(param_2);
    uVar2 = uVar2 | iVar1 != 0;
  }
  if ((int)(param_3 << 0x17) < 0) {
    iVar1 = iswxdigit(param_2);
    if (iVar1 != 0) {
      uVar2 = uVar2 | 0x100;
    }
  }
  if ((int)(param_3 << 0x1c) < 0) {
    iVar1 = iswupper(param_2);
    if (iVar1 != 0) {
      uVar2 = uVar2 | 8;
    }
  }
  if (-1 < (int)(param_3 << 0x1b)) {
    return uVar2;
  }
  iVar1 = iswlower(param_2);
  if (iVar1 != 0) {
    uVar2 = uVar2 | 0x10;
  }
  return uVar2;
}



### FUNC FUN_0004dbac @ 0004dbac

void FUN_0004dbac(undefined4 param_1,wint_t param_2)

{
  towlower(param_2);
  return;
}



### FUNC FUN_0004dbb8 @ 0004dbb8

void FUN_0004dbb8(undefined4 param_1,wint_t param_2)

{
  towupper(param_2);
  return;
}



### FUNC FUN_0004dbc4 @ 0004dbc4

undefined4 FUN_0004dbc4(void)

{
  return 1;
}



### FUNC FUN_0004dbc8 @ 0004dbc8

undefined4 FUN_0004dbc8(void)

{
  return 1;
}



### FUNC FUN_0004dbcc @ 0004dbcc

undefined4 FUN_0004dbcc(void)

{
  return 1;
}



### FUNC FUN_0004dbd0 @ 0004dbd0

undefined4 FUN_0004dbd0(undefined4 param_1,uint *param_2,byte *param_3)

{
  *param_2 = (uint)*param_3;
  return 1;
}



### FUNC FUN_0004dbd8 @ 0004dbd8

undefined4
FUN_0004dbd8(undefined4 param_1,undefined1 *param_2,undefined4 param_3,undefined1 param_4)

{
  *param_2 = param_4;
  return 1;
}



### FUNC FUN_0004dbde @ 0004dbde

undefined4
FUN_0004dbde(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
            undefined4 *param_5)

{
  *param_5 = param_3;
  return 0;
}



### FUNC FUN_0004dbe6 @ 0004dbe6

uint FUN_0004dbe6(undefined4 param_1,char *param_2,uint param_3,char *param_4,uint param_5)

{
  int iVar1;
  uint __n;
  uint __n_00;
  uint local_98;
  char acStack_94 [64];
  char acStack_54 [64];
  
  local_98 = param_5;
  if (param_5 != 0 || param_3 != 0) {
    do {
      __n = param_3;
      if (0x3e < param_3) {
        __n = 0x3f;
      }
      strncpy(acStack_54,param_2,__n);
      acStack_54[__n] = '\0';
      __n_00 = local_98;
      if (0x3e < local_98) {
        __n_00 = 0x3f;
      }
      strncpy(acStack_94,param_4,__n_00);
      acStack_94[__n_00] = '\0';
      iVar1 = strcmp(acStack_54,acStack_94);
      if (iVar1 != 0) {
        return iVar1 >> 0x1f | 1;
      }
      param_3 = param_3 - __n;
      local_98 = local_98 - __n_00;
      param_4 = param_4 + __n_00;
      param_2 = param_2 + __n;
    } while (local_98 != 0 || param_3 != 0);
  }
  return 0;
}



### FUNC FUN_0004dc70 @ 0004dc70

uint FUN_0004dc70(undefined4 param_1,wchar_t *param_2,uint param_3,wchar_t *param_4,uint param_5)

{
  int iVar1;
  uint __n;
  uint __n_00;
  uint local_218;
  wchar_t awStack_214 [64];
  wchar_t awStack_114 [64];
  
  local_218 = param_5;
  if (param_5 != 0 || param_3 != 0) {
    do {
      __n = param_3;
      if (0x3e < param_3) {
        __n = 0x3f;
      }
      wcsncpy(awStack_114,param_2,__n);
      awStack_114[__n] = L'\0';
      __n_00 = local_218;
      if (0x3e < local_218) {
        __n_00 = 0x3f;
      }
      wcsncpy(awStack_214,param_4,__n_00);
      awStack_214[__n_00] = L'\0';
      iVar1 = wcscmp(awStack_114,awStack_214);
      if (iVar1 != 0) {
        return iVar1 >> 0x1f | 1;
      }
      param_3 = param_3 - __n;
      local_218 = local_218 - __n_00;
      param_4 = param_4 + __n_00;
      param_2 = param_2 + __n;
    } while (local_218 != 0 || param_3 != 0);
  }
  return 0;
}



### FUNC FUN_0004dd0a @ 0004dd0a

undefined4
FUN_0004dd0a(undefined4 param_1,char *param_2,int param_3,char *param_4,undefined4 param_5)

{
  if (param_2 != (char *)0x0) {
    strncpy(param_2,param_4,param_3 - 1U);
    param_2[param_3 - 1U] = '\0';
  }
  return param_5;
}



### FUNC FUN_0004dd2e @ 0004dd2e

undefined4
FUN_0004dd2e(undefined4 param_1,wchar_t *param_2,int param_3,wchar_t *param_4,undefined4 param_5)

{
  if (param_2 != (wchar_t *)0x0) {
    wcsncpy(param_2,param_4,param_3 - 1U);
    param_2[param_3 - 1U] = L'\0';
  }
  return param_5;
}



### FUNC FUN_0004dd54 @ 0004dd54

undefined4 FUN_0004dd54(void)

{
  return 0x2e;
}



### FUNC FUN_0004dd58 @ 0004dd58

undefined4 FUN_0004dd58(void)

{
  return 0x2c;
}



### FUNC FUN_0004dd5c @ 0004dd5c

undefined * FUN_0004dd5c(void)

{
  return &DAT_0006478a;
}



### FUNC FUN_0004dd68 @ 0004dd68

undefined * FUN_0004dd68(void)

{
  return &DAT_0004dd6c;
}



### FUNC FUN_0004dd74 @ 0004dd74

char * FUN_0004dd74(void)

{
  return "false";
}



### FUNC FUN_0004dd80 @ 0004dd80

undefined4 FUN_0004dd80(void)

{
  return 0x2e;
}



### FUNC FUN_0004dd84 @ 0004dd84

undefined4 FUN_0004dd84(void)

{
  return 0x2c;
}



### FUNC FUN_0004dd88 @ 0004dd88

undefined * FUN_0004dd88(void)

{
  return &DAT_0004dd8c;
}



### FUNC FUN_0004dda0 @ 0004dda0

wchar_t * FUN_0004dda0(void)

{
  return L"false";
}



### FUNC FUN_0004ddbc @ 0004ddbc

undefined * FUN_0004ddbc(void)

{
  return &DAT_0006478a;
}



### FUNC FUN_0004ddc8 @ 0004ddc8

undefined * FUN_0004ddc8(void)

{
  return &DAT_0006478a;
}



### FUNC FUN_0004ddd4 @ 0004ddd4

undefined4 FUN_0004ddd4(void)

{
  return 0x2e;
}



### FUNC FUN_0004ddd8 @ 0004ddd8

undefined4 FUN_0004ddd8(void)

{
  return 0x2c;
}



### FUNC FUN_0004dddc @ 0004dddc

undefined * FUN_0004dddc(void)

{
  return &DAT_0006478a;
}



### FUNC FUN_0004dde8 @ 0004dde8

undefined * FUN_0004dde8(void)

{
  return &DAT_0006478a;
}



### FUNC FUN_0004ddf4 @ 0004ddf4

undefined * FUN_0004ddf4(void)

{
  return &DAT_0006478a;
}



### FUNC FUN_0004de00 @ 0004de00

undefined4 FUN_0004de00(void)

{
  return 0;
}



### FUNC FUN_0004de04 @ 0004de04

undefined4 FUN_0004de04(void)

{
  return 0;
}



### FUNC FUN_0004de08 @ 0004de08

undefined4 FUN_0004de08(void)

{
  return 0xff;
}



### FUNC FUN_0004de0c @ 0004de0c

undefined4 FUN_0004de0c(void)

{
  return 0xff;
}



### FUNC FUN_0004de10 @ 0004de10

undefined4 FUN_0004de10(void)

{
  return 0xff;
}



### FUNC FUN_0004de14 @ 0004de14

undefined4 FUN_0004de14(void)

{
  return 0xff;
}



### FUNC FUN_0004de18 @ 0004de18

undefined4 FUN_0004de18(void)

{
  return 0xff;
}



### FUNC FUN_0004de1c @ 0004de1c

undefined4 FUN_0004de1c(void)

{
  return 0xff;
}



### FUNC FUN_0004de20 @ 0004de20

undefined * FUN_0004de20(void)

{
  return &DAT_0004de24;
}



### FUNC FUN_0004de28 @ 0004de28

undefined * FUN_0004de28(void)

{
  return &DAT_0004de2c;
}



### FUNC FUN_0004de38 @ 0004de38

undefined * FUN_0004de38(void)

{
  return &DAT_0004de3c;
}



### FUNC FUN_0004de40 @ 0004de40

undefined * FUN_0004de40(void)

{
  return &DAT_0004de44;
}



### FUNC FUN_0004de48 @ 0004de48

undefined * FUN_0004de48(undefined4 param_1,int param_2)

{
  return (&PTR_s_January_00069898)[param_2];
}



### FUNC FUN_0004de58 @ 0004de58

undefined * FUN_0004de58(undefined4 param_1,int param_2)

{
  return (&PTR_DAT_000698c8)[param_2];
}



### FUNC FUN_0004de68 @ 0004de68

undefined * FUN_0004de68(undefined4 param_1,int param_2)

{
  return (&PTR_s_Sunday_000698f8)[param_2];
}



### FUNC FUN_0004de78 @ 0004de78

undefined * FUN_0004de78(undefined4 param_1,int param_2)

{
  return (&PTR_DAT_00069914)[param_2];
}



### FUNC FUN_0004de88 @ 0004de88

char * FUN_0004de88(void)

{
  return "%m/%d/%y";
}



### FUNC FUN_0004de94 @ 0004de94

char * FUN_0004de94(void)

{
  return "%m/%d/%y";
}



### FUNC FUN_0004dea0 @ 0004dea0

char * FUN_0004dea0(void)

{
  return "%H:%M:%S";
}



### FUNC FUN_0004deb0 @ 0004deb0

undefined * FUN_0004deb0(void)

{
  return &DAT_0006478a;
}



### FUNC FUN_0004debc @ 0004debc

undefined * FUN_0004debc(void)

{
  return &DAT_0006478a;
}



### FUNC FUN_0004dec8 @ 0004dec8

undefined * FUN_0004dec8(void)

{
  return &DAT_0004decc;
}



### FUNC FUN_0004ded0 @ 0004ded0

undefined * FUN_0004ded0(void)

{
  return &DAT_0004ded4;
}



### FUNC FUN_0004ded8 @ 0004ded8

undefined * FUN_0004ded8(undefined4 param_1,int param_2)

{
  return (&PTR_u_January_00069930)[param_2];
}



### FUNC FUN_0004dee8 @ 0004dee8

undefined * FUN_0004dee8(undefined4 param_1,int param_2)

{
  return (&PTR_DAT_00069960)[param_2];
}



### FUNC FUN_0004def8 @ 0004def8

undefined * FUN_0004def8(undefined4 param_1,int param_2)

{
  return (&PTR_u_Sunday_00069990)[param_2];
}



### FUNC FUN_0004df08 @ 0004df08

undefined * FUN_0004df08(undefined4 param_1,int param_2)

{
  return (&PTR_DAT_000699ac)[param_2];
}



### FUNC FUN_0004df18 @ 0004df18

undefined * FUN_0004df18(void)

{
  return &DAT_0004df1c;
}



### FUNC FUN_0004df28 @ 0004df28

undefined * FUN_0004df28(void)

{
  return &DAT_0004df2c;
}



### FUNC FUN_0004df38 @ 0004df38

undefined4 FUN_0004df38(void)

{
  return 0xffffffff;
}



### FUNC FUN_0004df3e @ 0004df3e

void FUN_0004df3e(void)

{
  return;
}



### FUNC FUN_0004df40 @ 0004df40

undefined4 FUN_0004df40(void)

{
  undefined4 in_stack_00000000;
  
  return in_stack_00000000;
}



### FUNC __cxa_end_cleanup @ 0004df44

void __cxa_end_cleanup(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)

{
  undefined4 uVar1;
  
  uVar1 = FUN_0004e004();
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar1,param_2,param_3,param_4);
}



### FUNC __cxa_type_match @ 0004df54

undefined4 __cxa_type_match(int param_1,int *param_2,undefined4 param_3,undefined4 *param_4)

{
  int iVar1;
  undefined4 uVar2;
  int iVar3;
  undefined4 uVar4;
  undefined4 *local_18;
  
  iVar3 = *(int *)(param_1 + -0x34);
  uVar4 = 0;
  if (iVar3 != 0) {
    local_18 = (undefined4 *)(param_1 + 0x58);
    iVar1 = FUN_00030ba0(iVar3,&DAT_00068e30,&PTR_PTR_FUN_00031728_1_00068dc4,0);
    uVar2 = 1;
    if (iVar1 != 0) {
      local_18 = *(undefined4 **)(param_1 + 0x58);
      uVar2 = 2;
    }
    uVar4 = 0;
    if (param_2 != (int *)0x0) {
      iVar3 = (**(code **)(*param_2 + 8))(param_2,iVar3,&local_18);
      if (iVar3 == 1) {
        *param_4 = local_18;
        uVar4 = uVar2;
      }
    }
  }
  return uVar4;
}



### FUNC __cxa_begin_cleanup @ 0004dfc4

undefined4 __cxa_begin_cleanup(int *param_1)

{
  int iVar1;
  int iVar2;
  
  iVar1 = FUN_000306d8();
  if (*param_1 == 0x432b2b00 && param_1[1] == 0x474e5543) {
    iVar2 = param_1[-6];
    param_1[-6] = iVar2 + 1;
    if (iVar2 != 0) {
      return 1;
    }
    param_1[-7] = *(int *)(iVar1 + 8);
  }
  *(int **)(iVar1 + 8) = param_1 + -0xe;
  return 1;
}



### FUNC FUN_0004e004 @ 0004e004

int FUN_0004e004(void)

{
  int iVar1;
  undefined4 *puVar2;
  int iVar3;
  
  iVar1 = FUN_000306d8();
  iVar3 = *(int *)(iVar1 + 8);
  puVar2 = (undefined4 *)(iVar1 + 8);
  if (iVar3 == 0) {
                    /* WARNING: Subroutine does not return */
    FUN_0003178c();
  }
  if (*(int *)(iVar3 + 0x38) == 0x432b2b00 && *(int *)(iVar3 + 0x3c) == 0x474e5543) {
    iVar1 = *(int *)(iVar3 + 0x20) + -1;
    *(int *)(iVar3 + 0x20) = iVar1;
    if (iVar1 != 0) {
      return iVar3 + 0x38;
    }
    *puVar2 = *(undefined4 *)(iVar3 + 0x1c);
    puVar2 = (undefined4 *)(iVar3 + 0x1c);
  }
  *puVar2 = 0;
  return iVar3 + 0x38;
}



### FUNC __cxa_call_unexpected @ 0004e054

void __cxa_call_unexpected(int *param_1)

{
  if (*param_1 == 0x432b2b00 && param_1[1] == 0x474e5543) {
    FUN_000308d8(param_1);
    (*(code *)param_1[-0xb])((code *)param_1[-0xb],0);
                    /* WARNING: Subroutine does not return */
    FUN_0003178c();
  }
  FUN_000308d8(param_1);
  FUN_00031844();
  FUN_000308d8();
                    /* WARNING: Subroutine does not return */
  FUN_0003178c();
}



### FUNC FUN_0004e1d4 @ 0004e1d4

uint FUN_0004e1d4(undefined4 *param_1)

{
  byte bVar1;
  uint uVar2;
  byte *pbVar3;
  uint uVar4;
  
  pbVar3 = (byte *)*param_1;
  uVar4 = 0;
  uVar2 = 0;
  do {
    bVar1 = *pbVar3;
    uVar2 = uVar2 | (bVar1 & 0x7f) << (uVar4 & 0xff);
    uVar4 = uVar4 + 7;
    pbVar3 = pbVar3 + 1;
  } while ((bVar1 & 0x80) != 0);
  *param_1 = pbVar3;
  return uVar2;
}



### FUNC FUN_0004e1f8 @ 0004e1f8

uint FUN_0004e1f8(undefined4 *param_1)

{
  byte bVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  byte *pbVar5;
  
  pbVar5 = (byte *)*param_1;
  uVar3 = 0;
  uVar2 = 0;
  do {
    bVar1 = *pbVar5;
    uVar2 = uVar2 | (bVar1 & 0x7f) << (uVar3 & 0xff);
    uVar3 = uVar3 + 7;
    pbVar5 = pbVar5 + 1;
  } while ((bVar1 & 0x80) != 0);
  *param_1 = pbVar5;
  uVar4 = bVar1 & 0x40;
  if ((bVar1 & 0x40) != 0) {
    uVar4 = -1 << (uVar3 & 0xff);
  }
  if (0x1f < uVar3) {
    return uVar2;
  }
  return uVar4 | uVar2;
}



### FUNC FUN_0004e23c @ 0004e23c

/* WARNING: Type propagation algorithm not settling */

byte * FUN_0004e23c(undefined4 *param_1,uint param_2)

{
  byte bVar1;
  ushort uVar2;
  uint uVar3;
  byte *pbVar4;
  uint uVar5;
  byte *pbVar6;
  ushort *puVar7;
  ushort *puVar8;
  uint uVar9;
  
  if (param_2 == 0xff) {
    return (byte *)0x0;
  }
  if (0xc < (param_2 & 0xf)) goto switchD_0004e25e_caseD_5;
  puVar7 = (ushort *)*param_1;
  puVar8 = puVar7;
  switch(param_2 & 0xf) {
  case 0:
  case 3:
  case 0xb:
    pbVar6 = *(byte **)puVar7;
    puVar8 = puVar7 + 2;
    break;
  case 1:
    uVar3 = 0;
    pbVar6 = (byte *)0x0;
    do {
      uVar2 = *puVar8;
      pbVar6 = (byte *)((uint)pbVar6 | ((byte)uVar2 & 0x7f) << (uVar3 & 0xff));
      uVar3 = uVar3 + 7;
      puVar8 = (ushort *)((int)puVar8 + 1);
    } while (((byte)uVar2 & 0x80) != 0);
    break;
  case 2:
    pbVar6 = (byte *)(uint)*puVar7;
    goto LAB_0004e30a;
  case 4:
  case 0xc:
    pbVar6 = *(byte **)puVar7;
    puVar8 = puVar7 + 4;
    break;
  default:
    goto switchD_0004e25e_caseD_5;
  case 9:
    uVar9 = 0;
    uVar3 = 0;
    do {
      bVar1 = (byte)*puVar8;
      uVar3 = uVar3 | (bVar1 & 0x7f) << (uVar9 & 0xff);
      uVar9 = uVar9 + 7;
      puVar8 = (ushort *)((int)puVar8 + 1);
    } while ((bVar1 & 0x80) != 0);
    uVar5 = -1 << (uVar9 & 0xff);
    if ((bVar1 & 0x40) == 0) {
      uVar5 = bVar1 & 0x40;
    }
    if (0x1f < uVar9) {
      uVar5 = 0;
    }
    pbVar6 = (byte *)(uVar5 | uVar3);
    break;
  case 10:
    pbVar6 = (byte *)(int)(short)*puVar7;
LAB_0004e30a:
    puVar8 = puVar7 + 1;
  }
  pbVar4 = pbVar6;
  if ((param_2 & 0x70) != 0) {
    if ((param_2 & 0x70) != 0x10) {
switchD_0004e25e_caseD_5:
                    /* WARNING: Subroutine does not return */
      abort();
    }
    pbVar4 = (byte *)0x0;
    if (pbVar6 == (byte *)0x0) goto LAB_0004e330;
    pbVar4 = pbVar6 + (int)puVar7;
  }
  if (((int)(param_2 << 0x18) < 0) && (pbVar4 != (byte *)0x0)) {
    pbVar4 = *(byte **)pbVar4;
  }
LAB_0004e330:
  *param_1 = puVar8;
  return pbVar4;
}



### FUNC FUN_0004e34a @ 0004e34a

void FUN_0004e34a(void *param_1)

{
  FUN_00030670();
  operator_delete(param_1);
  return;
}



### FUNC FUN_0004e370 @ 0004e370

void FUN_0004e370(void)

{
  FUN_00030670();
  return;
}



### FUNC FUN_0004e37a @ 0004e37a

void FUN_0004e37a(void *param_1)

{
  FUN_00030670();
  operator_delete(param_1);
  return;
}



### FUNC FUN_0004e3a4 @ 0004e3a4

undefined4 FUN_0004e3a4(uint *param_1)

{
  uint uVar1;
  
  pthread_mutex_lock((pthread_mutex_t *)&DAT_0006b8e4);
  uVar1 = *param_1;
  while( true ) {
    if ((uVar1 & 1) != 0) {
      pthread_mutex_unlock((pthread_mutex_t *)&DAT_0006b8e4);
      return 0;
    }
    if ((uVar1 & 0x100) == 0) break;
    *param_1 = uVar1 | 0x200;
    pthread_cond_wait((pthread_cond_t *)&DAT_00071054,(pthread_mutex_t *)&DAT_0006b8e4);
    uVar1 = *param_1;
  }
  *param_1 = 0x100;
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_0006b8e4);
  return 1;
}



### FUNC FUN_0004e40c @ 0004e40c

void FUN_0004e40c(uint *param_1)

{
  uint uVar1;
  
  pthread_mutex_lock((pthread_mutex_t *)&DAT_0006b8e4);
  uVar1 = *param_1;
  *param_1 = 1;
  if ((uVar1 & 0x200) != 0) {
    pthread_cond_broadcast((pthread_cond_t *)&DAT_00071054);
  }
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_0006b8e4);
  return;
}



### FUNC FUN_0004e444 @ 0004e444

void FUN_0004e444(uint *param_1)

{
  uint uVar1;
  
  pthread_mutex_lock((pthread_mutex_t *)&DAT_0006b8e4);
  uVar1 = *param_1;
  *param_1 = 0;
  if ((uVar1 & 0x200) != 0) {
    pthread_cond_broadcast((pthread_cond_t *)&DAT_00071054);
  }
  pthread_mutex_unlock((pthread_mutex_t *)&DAT_0006b8e4);
  return;
}



### FUNC FUN_0004e480 @ 0004e480

void FUN_0004e480(void)

{
  FUN_00030670();
  return;
}



### FUNC FUN_0004e48c @ 0004e48c

undefined4 FUN_0004e48c(int *param_1,undefined4 param_2,undefined4 param_3)

{
  int iVar1;
  undefined4 uVar2;
  
  uVar2 = 1;
  iVar1 = (**(code **)(*param_1 + 0xc))(param_1,param_2,param_3,1);
  if (iVar1 == 0) {
    uVar2 = FUN_0003186c(param_2,&decltype(nullptr)::typeinfo);
  }
  return uVar2;
}



### FUNC FUN_0004e4bc @ 0004e4bc

uint FUN_0004e4bc(int *param_1,int *param_2,undefined4 param_3,uint param_4)

{
  int iVar1;
  int *piVar2;
  uint uVar3;
  uint uVar4;
  int *piVar5;
  byte local_18 [4];
  
  iVar1 = FUN_0003186c();
  uVar3 = 1;
  if (iVar1 == 0) {
    if ((param_1 == (int *)0x0) || (param_2 == (int *)0x0)) {
                    /* WARNING: Subroutine does not return */
      FUN_00055980();
    }
    uVar3 = 0;
    iVar1 = FUN_00031886(*(undefined4 *)(*param_1 + -4),*(undefined4 *)(*param_2 + -4));
    if ((iVar1 == 0) && ((param_2[2] & (param_1[2] ^ 0xffffffffU)) == 0)) {
      uVar4 = param_4 | 2;
      if (param_4 != 1) {
        uVar4 = param_4 & 0xfffffffe;
      }
      if ((uVar4 & 5) != 4) {
        uVar4 = ~(param_1[2] << 2) & 4U | uVar4;
        iVar1 = (**(code **)(*param_1 + 0x10))(param_1,param_2,param_3,uVar4,local_18);
        if (iVar1 == 1) {
          uVar3 = (uint)local_18[0];
          if (uVar3 != 0) {
            uVar3 = 1;
          }
        }
        else {
          piVar5 = (int *)param_1[3];
          if ((piVar5 == (int *)0x0) ||
             (piVar2 = (int *)FUN_00030ba0(piVar5,&PTR_PTR_FUN_00031728_1_00068d20,
                                           &PTR_PTR_FUN_00031728_1_00069dc8,0), piVar2 == (int *)0x0
             )) {
            uVar3 = (**(code **)(*piVar5 + 8))(piVar5,param_2[3],param_3);
          }
          else {
            uVar3 = (**(code **)(*piVar2 + 0xc))(piVar2,param_2[3],param_3,uVar4);
          }
        }
      }
    }
  }
  return uVar3;
}



### FUNC FUN_0004e5a0 @ 0004e5a0

undefined4 FUN_0004e5a0(int *param_1,int param_2,undefined4 param_3,undefined4 param_4)

{
  int iVar1;
  undefined4 uVar2;
  int *piVar3;
  int *piVar4;
  char local_18 [4];
  
  iVar1 = (**(code **)(*param_1 + 0x10))(param_1,param_2,param_3,param_4,local_18);
  if (iVar1 == 1) {
    uVar2 = 1;
    if (local_18[0] == '\0') {
      return 0;
    }
  }
  else {
    piVar4 = (int *)param_1[3];
    if ((piVar4 != (int *)0x0) &&
       (piVar3 = (int *)FUN_00030ba0(piVar4,&PTR_PTR_FUN_00031728_1_00068d20,
                                     &PTR_PTR_FUN_00031728_1_00069dc8,0), piVar3 != (int *)0x0)) {
      uVar2 = (**(code **)(*piVar3 + 0xc))(piVar3,*(undefined4 *)(param_2 + 0xc),param_3,param_4);
      return uVar2;
    }
    uVar2 = (**(code **)(*piVar4 + 8))(piVar4,*(undefined4 *)(param_2 + 0xc),param_3);
  }
  return uVar2;
}



### FUNC _Filebuf_base @ 0004e61c

/* std::_Filebuf_base::_Filebuf_base() */

void __thiscall std::_Filebuf_base::_Filebuf_base(_Filebuf_base *this)

{
  *(undefined2 *)(this + 8) = 0;
  *(undefined4 *)this = 0xffffffff;
  *(undefined4 *)(this + 4) = 0;
  return;
}



### FUNC _S_initialize @ 0004e628

/* std::_Filebuf_base::_S_initialize() */

void std::_Filebuf_base::_S_initialize(void)

{
  _M_page_size = sysconf(0x27);
  return;
}



### FUNC _M_file_size @ 0004e640

/* std::_Filebuf_base::_M_file_size() */

int __thiscall std::_Filebuf_base::_M_file_size(_Filebuf_base *this)

{
  bool bVar1;
  int iVar2;
  int iVar3;
  stat sStack_70;
  
  iVar2 = fstat(*(int *)this,&sStack_70);
  iVar3 = 0;
  if ((iVar2 == 0) && ((sStack_70.st_mode & 0xf000) == 0x8000)) {
    bVar1 = 0 < sStack_70.st_blocks;
    if (sStack_70.st_blocks == 0) {
      bVar1 = sStack_70.st_blksize != 0;
    }
    iVar3 = sStack_70.st_blksize;
    if (!bVar1) {
      iVar3 = 0;
    }
  }
  return iVar3;
}



### FUNC _M_open @ 0004e698

/* std::_Filebuf_base::_M_open(char const*, int, long) */

bool __thiscall
std::_Filebuf_base::_M_open(_Filebuf_base *this,char *param_1,int param_2,long param_3)

{
  __off_t _Var1;
  int iVar2;
  _Filebuf_base _Var3;
  bool bVar4;
  stat sStack_80;
  
  bVar4 = false;
  if (this[8] != (_Filebuf_base)0x0) {
    return false;
  }
  iVar2 = 0x241;
  switch(param_2 & 0xfffffff9) {
  case 1:
  case 0x11:
    iVar2 = 0x441;
    break;
  case 2:
  case 3:
  case 4:
  case 5:
  case 6:
  case 7:
  case 10:
  case 0xb:
  case 0xc:
  case 0xd:
  case 0xe:
  case 0xf:
  case 0x12:
  case 0x13:
  case 0x14:
  case 0x15:
  case 0x16:
  case 0x17:
  case 0x1a:
  case 0x1b:
  case 0x1c:
  case 0x1d:
  case 0x1e:
  case 0x1f:
  case 0x20:
  case 0x21:
  case 0x22:
  case 0x23:
  case 0x24:
  case 0x25:
  case 0x26:
  case 0x27:
  case 0x28:
  case 0x29:
  case 0x2a:
  case 0x2b:
  case 0x2c:
  case 0x2d:
  case 0x2e:
  case 0x2f:
  case 0x31:
  case 0x32:
  case 0x33:
  case 0x34:
  case 0x35:
  case 0x36:
  case 0x37:
    return false;
  case 8:
    param_3 = 0;
    iVar2 = 0;
    break;
  case 9:
  case 0x19:
    iVar2 = 0x442;
    break;
  case 0x10:
  case 0x30:
    break;
  case 0x18:
    iVar2 = 2;
    break;
  case 0x38:
    iVar2 = 0x242;
    break;
  default:
    goto switchD_0004e6ca_default;
  }
  iVar2 = open(param_1,iVar2,param_3);
  if (-1 < iVar2) {
    _Var3 = (_Filebuf_base)0x1;
    this[8] = (_Filebuf_base)0x1;
    if ((param_2 & 3U) != 0) {
      _Var3 = (_Filebuf_base)0x0;
      _Var1 = lseek(iVar2,0,2);
      if (_Var1 == -1) {
        this[8] = (_Filebuf_base)0x0;
      }
      else {
        _Var3 = this[8];
      }
    }
    this[9] = _Var3;
    *(int *)this = iVar2;
    *(int *)(this + 4) = param_2;
    if (_Var3 != (_Filebuf_base)0x0) {
      iVar2 = fstat(iVar2,&sStack_80);
      _Var3 = (_Filebuf_base)0x0;
      if ((iVar2 == 0) && (_Var3 = (_Filebuf_base)0x1, (sStack_80.st_mode & 0xf000) != 0x8000)) {
        _Var3 = (_Filebuf_base)0x0;
      }
      this[10] = _Var3;
      bVar4 = this[8] != (_Filebuf_base)0x0;
    }
  }
switchD_0004e6ca_default:
  return bVar4;
}



### FUNC _M_open @ 0004e794

/* std::_Filebuf_base::_M_open(char const*, int) */

void __thiscall std::_Filebuf_base::_M_open(_Filebuf_base *this,char *param_1,int param_2)

{
  _M_open(this,param_1,param_2,0x1b6);
  return;
}



### FUNC _M_open @ 0004e7a4

/* std::_Filebuf_base::_M_open(int, int) */

undefined4 std::_Filebuf_base::_M_open(int param_1,int param_2)

{
  uint uVar1;
  int iVar2;
  undefined1 uVar3;
  undefined4 uVar4;
  stat sStack_80;
  
  uVar4 = 0;
  if ((-1 < param_2) && (*(char *)(param_1 + 8) == '\0')) {
    uVar1 = fcntl(param_2,3);
    if (uVar1 != 0xffffffff) {
      *(int *)param_1 = param_2;
      *(undefined2 *)(param_1 + 8) = 1;
      *(uint *)(param_1 + 4) = *(uint *)(&DAT_0004e814 + (uVar1 & 3 ^ 2) * 4) | uVar1 >> 10 & 1;
      iVar2 = fstat(param_2,&sStack_80);
      uVar3 = 0;
      if ((iVar2 == 0) && (uVar3 = 1, (sStack_80.st_mode & 0xf000) != 0x8000)) {
        uVar3 = 0;
      }
      *(undefined1 *)(param_1 + 10) = uVar3;
      uVar4 = 1;
    }
  }
  return uVar4;
}



### FUNC _M_close @ 0004e824

/* std::_Filebuf_base::_M_close() */

undefined4 __thiscall std::_Filebuf_base::_M_close(_Filebuf_base *this)

{
  undefined4 uVar1;
  int iVar2;
  
  uVar1 = 0;
  if (this[8] != (_Filebuf_base)0x0) {
    uVar1 = 1;
    if (this[9] != (_Filebuf_base)0x0) {
      iVar2 = close(*(int *)this);
      uVar1 = 1;
      if (iVar2 != 0) {
        uVar1 = 0;
      }
    }
    *(undefined4 *)(this + 4) = 0;
    *(undefined2 *)(this + 8) = 0;
  }
  return uVar1;
}



### FUNC _M_read @ 0004e854

/* std::_Filebuf_base::_M_read(char*, int) */

void __thiscall std::_Filebuf_base::_M_read(_Filebuf_base *this,char *param_1,int param_2)

{
  read(*(int *)this,param_1,param_2);
  return;
}



### FUNC _M_write @ 0004e860

/* std::_Filebuf_base::_M_write(char*, int) */

undefined4 __thiscall std::_Filebuf_base::_M_write(_Filebuf_base *this,char *param_1,int param_2)

{
  size_t sVar1;
  
  sVar1 = write(*(int *)this,param_1,param_2);
  if (sVar1 != param_2) {
    do {
      if ((int)sVar1 < 1) {
        return 0;
      }
      if (param_2 <= (int)sVar1) {
        return 0;
      }
      param_1 = param_1 + sVar1;
      param_2 = param_2 - sVar1;
      sVar1 = write(*(int *)this,param_1,param_2);
    } while (param_2 != sVar1);
  }
  return 1;
}



### FUNC _M_seek @ 0004e89e

/* WARNING: Type propagation algorithm not settling */
/* std::_Filebuf_base::_M_seek(long, int) */

__off_t __thiscall std::_Filebuf_base::_M_seek(_Filebuf_base *this,long param_1,int param_2)

{
  bool bVar1;
  __off_t _Var2;
  int iVar3;
  int iVar4;
  stat sStack_80;
  
  iVar3 = 1;
  if (param_2 == 4) {
    iVar3 = fstat(*(int *)this,&sStack_80);
    iVar4 = 0;
    if ((iVar3 == 0) && ((sStack_80.st_mode & 0xf000) == 0x8000)) {
      bVar1 = 0 < sStack_80.st_blocks;
      if (sStack_80.st_blocks == 0) {
        bVar1 = sStack_80.st_blksize != 0;
      }
      iVar4 = sStack_80.st_blksize;
      if (!bVar1) {
        iVar4 = 0;
      }
    }
    iVar3 = 2;
    if (iVar4 < -param_1) {
      return -1;
    }
  }
  else if (param_2 != 2) {
    if (param_2 != 1) {
      return -1;
    }
    iVar3 = 0;
    if (param_1 < 0) {
      return -1;
    }
  }
  _Var2 = lseek(*(int *)this,param_1,iVar3);
  return _Var2;
}



### FUNC _M_mmap @ 0004e92a

/* std::_Filebuf_base::_M_mmap(long, long) */

void * __thiscall std::_Filebuf_base::_M_mmap(_Filebuf_base *this,long param_1,long param_2)

{
  void *__addr;
  __off_t _Var1;
  void *pvVar2;
  
  __addr = mmap((void *)0x0,param_2,1,2,*(int *)this,param_1);
  pvVar2 = (void *)0x0;
  if (__addr != (void *)0xffffffff) {
    _Var1 = lseek(*(int *)this,param_2 + param_1,0);
    pvVar2 = __addr;
    if (_Var1 < 0) {
      munmap(__addr,param_2);
      pvVar2 = (void *)0x0;
    }
  }
  return pvVar2;
}



### FUNC _M_unmap @ 0004e97a

/* std::_Filebuf_base::_M_unmap(void*, long) */

void __thiscall std::_Filebuf_base::_M_unmap(_Filebuf_base *this,void *param_1,long param_2)

{
  munmap(param_1,param_2);
  return;
}



### FUNC _M_doit @ 0004e988

/* WARNING: Type propagation algorithm not settling */
/* std::_Underflow<char, std::char_traits<char> >::_M_doit(std::filebuf*) */

uint std::_Underflow<char,std::char_traits<char>>::_M_doit(filebuf *param_1)

{
  bool bVar1;
  __off_t _Var2;
  int iVar3;
  void *__addr;
  uint uVar4;
  byte *pbVar5;
  int extraout_r1;
  int extraout_r1_00;
  int iVar6;
  size_t __len;
  stat sStack_80;
  
  if (param_1[0x2f] == (filebuf)0x0) {
    if (param_1[0x28] == (filebuf)0x0) {
      return 0xffffffff;
    }
    if (-1 < (int)((uint)(byte)param_1[0x24] << 0x1c)) {
      return 0xffffffff;
    }
    if (param_1[0x30] != (filebuf)0x0) {
      return 0xffffffff;
    }
    if (param_1[0x31] != (filebuf)0x0) {
      return 0xffffffff;
    }
    if (*(int *)(param_1 + 0x34) == 0) {
      iVar6 = _Filebuf_base::_M_page_size + 0xfff;
      __aeabi_uidivmod();
      iVar6 = FUN_000352a0(param_1,0,iVar6 - extraout_r1);
      if (iVar6 != 1) {
        return 0xffffffff;
      }
    }
    *(undefined4 *)(param_1 + 0x44) = *(undefined4 *)(param_1 + 0x3c);
    *(undefined4 *)(param_1 + 0x48) = *(undefined4 *)(param_1 + 0x3c);
    *(undefined4 *)(param_1 + 0x50) = *(undefined4 *)(param_1 + 0x4c);
    param_1[0x2f] = (filebuf)0x1;
  }
  else if (param_1[0x32] != (filebuf)0x0) {
    pbVar5 = *(byte **)(param_1 + 0x60);
    *(undefined4 *)(param_1 + 4) = *(undefined4 *)(param_1 + 0x5c);
    *(byte **)(param_1 + 8) = pbVar5;
    *(byte **)(param_1 + 0xc) = *(byte **)(param_1 + 100);
    param_1[0x32] = (filebuf)0x0;
    if (pbVar5 != *(byte **)(param_1 + 100)) {
      return (uint)*pbVar5;
    }
  }
  if ((param_1[0x2a] == (filebuf)0x0) || (param_1[0x2d] == (filebuf)0x0)) goto LAB_0004eb1c;
  if (*(void **)(param_1 + 0x54) != (void *)0x0) {
    munmap(*(void **)(param_1 + 0x54),*(size_t *)(param_1 + 0x58));
  }
  iVar6 = 0;
  _Var2 = lseek(*(int *)(param_1 + 0x20),0,1);
  iVar3 = fstat(*(int *)(param_1 + 0x20),&sStack_80);
  if (iVar3 == 0) {
    if ((sStack_80.st_mode & 0xf000) == 0x8000) {
      bVar1 = 0 < sStack_80.st_blocks;
      if (sStack_80.st_blocks == 0) {
        bVar1 = sStack_80.st_blksize != 0;
      }
      iVar6 = sStack_80.st_blksize;
      if (!bVar1) {
        iVar6 = 0;
      }
    }
    if (_Var2 < iVar6) goto LAB_0004ea9e;
LAB_0004eb18:
    *(undefined4 *)(param_1 + 0x54) = 0;
  }
  else {
    if (-1 < _Var2) goto LAB_0004eb18;
LAB_0004ea9e:
    if ((_Var2 < 0) || (iVar6 < 1)) goto LAB_0004eb18;
    __aeabi_uidivmod(_Var2,_Filebuf_base::_M_page_size);
    iVar3 = _Var2 - extraout_r1_00;
    __len = iVar6 - iVar3;
    if (0xfffff < iVar6 - iVar3) {
      __len = 0x100000;
    }
    *(size_t *)(param_1 + 0x58) = __len;
    __addr = mmap((void *)0x0,__len,1,2,*(int *)(param_1 + 0x20),iVar3);
    if (__addr == (void *)0xffffffff) goto LAB_0004eb18;
    _Var2 = lseek(*(int *)(param_1 + 0x20),__len + iVar3,0);
    if (_Var2 < 0) {
      munmap(__addr,__len);
      goto LAB_0004eb18;
    }
    *(void **)(param_1 + 0x54) = __addr;
    if (__addr != (void *)0x0) {
      *(void **)(param_1 + 4) = __addr;
      *(int *)(param_1 + 8) = (int)__addr + extraout_r1_00;
      *(int *)(param_1 + 0xc) = (int)__addr + *(int *)(param_1 + 0x58);
      return (uint)*(byte *)((int)__addr + extraout_r1_00);
    }
  }
  *(undefined4 *)(param_1 + 0x58) = 0;
LAB_0004eb1c:
  uVar4 = FUN_0004eb44(param_1);
  return uVar4;
}



### FUNC FUN_0004eb44 @ 0004eb44

uint FUN_0004eb44(int param_1)

{
  byte *pbVar1;
  uint uVar2;
  int iVar3;
  void *__buf;
  int iVar4;
  byte *local_1c;
  int local_18;
  
  *(undefined4 *)(param_1 + 0x4c) = *(undefined4 *)(param_1 + 0x50);
  __buf = *(void **)(param_1 + 0x3c);
  uVar2 = *(uint *)(param_1 + 0x44);
  if ((uVar2 < *(uint *)(param_1 + 0x48)) && (iVar4 = *(uint *)(param_1 + 0x48) - uVar2, iVar4 != 0)
     ) {
    __aeabi_memmove(__buf,uVar2,iVar4);
    __buf = (void *)((int)__buf + iVar4);
  }
  *(void **)(param_1 + 0x48) = __buf;
  iVar4 = read(*(int *)(param_1 + 0x20),__buf,*(int *)(param_1 + 0x40) - (int)__buf);
  if (-1 < iVar4) {
    while( true ) {
      iVar3 = *(int *)(param_1 + 0x48) + iVar4;
      *(int *)(param_1 + 0x48) = iVar3;
      if (*(int *)(param_1 + 0x3c) == iVar3) break;
      iVar3 = (**(code **)(**(int **)(param_1 + 0x68) + 0xc))
                        (*(int **)(param_1 + 0x68),param_1 + 0x50,*(int *)(param_1 + 0x3c),iVar3,
                         &local_18,*(undefined4 *)(param_1 + 0x34),*(undefined4 *)(param_1 + 0x38),
                         &local_1c);
      if (iVar3 == 2) {
LAB_0004ec20:
        if (*(void **)(param_1 + 0x54) != (void *)0x0) {
          munmap(*(void **)(param_1 + 0x54),*(size_t *)(param_1 + 0x58));
          *(undefined4 *)(param_1 + 0x54) = 0;
          *(undefined4 *)(param_1 + 0x58) = 0;
        }
        *(undefined1 *)(param_1 + 0x30) = 0;
        *(undefined1 *)(param_1 + 0x2f) = 0;
        *(undefined1 *)(param_1 + 0x31) = 1;
        *(undefined4 *)(param_1 + 4) = 0;
        *(undefined4 *)(param_1 + 8) = 0;
        *(undefined4 *)(param_1 + 0xc) = 0;
        return 0xffffffff;
      }
      if (iVar3 == 3) {
        pbVar1 = *(byte **)(param_1 + 0x3c);
        local_1c = *(byte **)(param_1 + 0x48);
        *(byte **)(param_1 + 0x44) = local_1c;
LAB_0004ec56:
        *(byte **)(param_1 + 4) = pbVar1;
        *(byte **)(param_1 + 8) = pbVar1;
        *(byte **)(param_1 + 0xc) = local_1c;
        return (uint)*pbVar1;
      }
      pbVar1 = *(byte **)(param_1 + 0x34);
      if (((local_1c != pbVar1) && (local_18 == *(int *)(param_1 + 0x3c))) ||
         ((*(char *)(param_1 + 0x2c) != '\0' &&
          (((int)local_1c - (int)pbVar1) * *(int *)(param_1 + 0x6c) -
           (local_18 - *(int *)(param_1 + 0x3c)) != 0)))) goto LAB_0004ec20;
      if (local_1c != pbVar1) {
        *(int *)(param_1 + 0x44) = local_18;
        goto LAB_0004ec56;
      }
      if (*(int *)(param_1 + 0x70) <= local_18 - *(int *)(param_1 + 0x3c)) goto LAB_0004ec20;
      if ((iVar4 < 1) ||
         (iVar4 = read(*(int *)(param_1 + 0x20),*(void **)(param_1 + 0x48),
                       *(int *)(param_1 + 0x40) - (int)*(void **)(param_1 + 0x48)), iVar4 < 0))
      break;
    }
  }
  *(undefined4 *)(param_1 + 4) = 0;
  *(undefined4 *)(param_1 + 8) = 0;
  *(undefined4 *)(param_1 + 0xc) = 0;
  return 0xffffffff;
}



### FUNC FUN_0004ec64 @ 0004ec64

undefined4 * FUN_0004ec64(undefined4 *param_1,undefined4 param_2)

{
  param_1[6] = 0;
  param_1[5] = 0;
  param_1[4] = 0;
  param_1[3] = 0;
  param_1[2] = 0;
  param_1[1] = 0;
  *param_1 = &PTR_FUN_00035128_1_000690ec;
  std::locale::locale((locale *)(param_1 + 7));
  param_1[8] = param_2;
  *param_1 = &PTR_FUN_0004eca0_1_00069df8;
  return param_1;
}



### FUNC FUN_0004eca0 @ 0004eca0

undefined4 * FUN_0004eca0(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_0004eca0_1_00069df8;
  fflush((FILE *)param_1[8]);
  *param_1 = &PTR_FUN_00035128_1_000690ec;
  std::locale::~locale((locale *)(param_1 + 7));
  return param_1;
}



### FUNC FUN_0004ecd0 @ 0004ecd0

void FUN_0004ecd0(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_0004eca0_1_00069df8;
  fflush((FILE *)param_1[8]);
  *param_1 = &PTR_FUN_00035128_1_000690ec;
  std::locale::~locale((locale *)(param_1 + 7));
  operator_delete(param_1);
  return;
}



### FUNC FUN_0004ed04 @ 0004ed04

int FUN_0004ed04(int param_1,char *param_2,size_t param_3)

{
  int __modes;
  
  __modes = 2;
  if (param_2 != (char *)0x0 || param_3 != 0) {
    __modes = 0;
  }
  setvbuf(*(FILE **)(param_1 + 0x20),param_2,__modes,param_3);
  return param_1;
}



### FUNC FUN_0004ed24 @ 0004ed24

void FUN_0004ed24(fpos_t *param_1,int param_2,long param_3,int param_4)

{
  int iVar1;
  
  iVar1 = 0;
  if (param_4 == 1) {
LAB_0004ed44:
    iVar1 = fseek(*(FILE **)(param_2 + 0x20),param_3,iVar1);
    if (iVar1 == 0) {
      fgetpos(*(FILE **)(param_2 + 0x20),param_1);
      goto LAB_0004ed62;
    }
  }
  else {
    if (param_4 == 4) {
      iVar1 = 2;
      goto LAB_0004ed44;
    }
    if (param_4 == 2) {
      iVar1 = 1;
      goto LAB_0004ed44;
    }
  }
  param_1->__pos = -1;
LAB_0004ed62:
  (param_1->__state).__count = 0;
  return;
}



### FUNC FUN_0004ed6a @ 0004ed6a

void FUN_0004ed6a(__off_t *param_1,int param_2,__off_t param_3,__off_t param_4)

{
  int iVar1;
  __off_t local_18;
  
  local_18 = param_3;
  iVar1 = fsetpos(*(FILE **)(param_2 + 0x20),(fpos_t *)&local_18);
  if (iVar1 != 0) {
    *param_1 = -1;
    param_1[1] = 0;
    return;
  }
  *param_1 = param_3;
  param_1[1] = param_4;
  return;
}



### FUNC FUN_0004ed98 @ 0004ed98

undefined4 FUN_0004ed98(int param_1)

{
  int iVar1;
  undefined4 uVar2;
  
  iVar1 = fflush(*(FILE **)(param_1 + 0x20));
  uVar2 = 0xffffffff;
  if (iVar1 == 0) {
    uVar2 = 0;
  }
  return uVar2;
}



### FUNC FUN_0004edb0 @ 0004edb0

void FUN_0004edb0(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_0004eca0_1_00069df8;
  fflush((FILE *)param_1[8]);
  *param_1 = &PTR_FUN_00035128_1_000690ec;
  std::locale::~locale((locale *)(param_1 + 7));
  operator_delete(param_1);
  return;
}



### FUNC FUN_0004ede8 @ 0004ede8

int FUN_0004ede8(int param_1)

{
  int __c;
  int iVar1;
  
  __c = getc(*(FILE **)(param_1 + 0x20));
  iVar1 = -1;
  if (__c != -1) {
    ungetc(__c,*(FILE **)(param_1 + 0x20));
    iVar1 = __c;
  }
  return iVar1;
}



### FUNC FUN_0004ee0a @ 0004ee0a

void FUN_0004ee0a(int param_1)

{
  getc(*(FILE **)(param_1 + 0x20));
  return;
}



### FUNC FUN_0004ee16 @ 0004ee16

int FUN_0004ee16(int param_1,int param_2)

{
  int iVar1;
  
  if (param_2 != -1) {
    iVar1 = ungetc(param_2,*(FILE **)(param_1 + 0x20));
    return iVar1;
  }
  if (*(uint *)(param_1 + 4) < *(uint *)(param_1 + 8)) {
    *(uint *)(param_1 + 8) = *(uint *)(param_1 + 8) - 1;
    return 0;
  }
  return -1;
}



### FUNC FUN_0004ee44 @ 0004ee44

void FUN_0004ee44(undefined4 *param_1)

{
  *param_1 = &PTR_FUN_0004eca0_1_00069df8;
  fflush((FILE *)param_1[8]);
  *param_1 = &PTR_FUN_00035128_1_000690ec;
  std::locale::~locale((locale *)(param_1 + 7));
  operator_delete(param_1);
  return;
}



### FUNC FUN_0004ee7e @ 0004ee7e

int FUN_0004ee7e(int param_1,int param_2)

{
  int iVar1;
  int iVar2;
  int iVar3;
  
  if (param_2 == -1) {
    iVar2 = *(int *)(param_1 + 0x10);
    iVar3 = *(int *)(param_1 + 0x14);
    iVar1 = 0;
    if (iVar3 != iVar2) {
      fflush(*(FILE **)(param_1 + 0x20));
      iVar1 = -1;
      if (*(int *)(param_1 + 0x14) - *(int *)(param_1 + 0x10) < iVar3 - iVar2) {
        return 0;
      }
    }
  }
  else {
    iVar1 = putc(param_2,*(FILE **)(param_1 + 0x20));
  }
  return iVar1;
}



### FUNC ~codecvt @ 0004eeb8

/* std::codecvt<char, char, mbstate_t>::~codecvt() */

void __thiscall std::codecvt<char,char,mbstate_t>::~codecvt(codecvt<char,char,mbstate_t> *this)

{
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~codecvt @ 0004eec2

/* std::codecvt<char, char, mbstate_t>::~codecvt() */

void __thiscall std::codecvt<char,char,mbstate_t>::~codecvt(codecvt<char,char,mbstate_t> *this)

{
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC do_length @ 0004eee2

/* std::codecvt<char, char, mbstate_t>::do_length(mbstate_t&, char const*, char const*, unsigned
   int) const */

uint __thiscall
std::codecvt<char,char,mbstate_t>::do_length
          (codecvt<char,char,mbstate_t> *this,mbstate_t *param_1,char *param_2,char *param_3,
          uint param_4)

{
  if ((uint)((int)param_3 - (int)param_2) <= param_4) {
    param_4 = (int)param_3 - (int)param_2;
  }
  return param_4;
}



### FUNC do_max_length @ 0004eeee

/* std::codecvt<char, char, mbstate_t>::do_max_length() const */

undefined4 std::codecvt<char,char,mbstate_t>::do_max_length(void)

{
  return 1;
}



### FUNC do_always_noconv @ 0004eef2

/* std::codecvt<char, char, mbstate_t>::do_always_noconv() const */

undefined4 std::codecvt<char,char,mbstate_t>::do_always_noconv(void)

{
  return 1;
}



### FUNC do_encoding @ 0004eef6

/* std::codecvt<char, char, mbstate_t>::do_encoding() const */

undefined4 std::codecvt<char,char,mbstate_t>::do_encoding(void)

{
  return 1;
}



### FUNC do_unshift @ 0004eefa

/* std::codecvt<char, char, mbstate_t>::do_unshift(mbstate_t&, char*, char*, char*&) const */

undefined4 __thiscall
std::codecvt<char,char,mbstate_t>::do_unshift
          (codecvt<char,char,mbstate_t> *this,mbstate_t *param_1,char *param_2,char *param_3,
          char **param_4)

{
  *param_4 = param_2;
  return 3;
}



### FUNC do_in @ 0004ef02

/* std::codecvt<char, char, mbstate_t>::do_in(mbstate_t&, char const*, char const*, char const*&,
   char*, char*, char*&) const */

undefined4 __thiscall
std::codecvt<char,char,mbstate_t>::do_in
          (codecvt<char,char,mbstate_t> *this,mbstate_t *param_1,char *param_2,char *param_3,
          char **param_4,char *param_5,char *param_6,char **param_7)

{
  *param_4 = param_2;
  *param_7 = param_5;
  return 3;
}



### FUNC do_out @ 0004ef10

/* std::codecvt<char, char, mbstate_t>::do_out(mbstate_t&, char const*, char const*, char const*&,
   char*, char*, char*&) const */

undefined4 __thiscall
std::codecvt<char,char,mbstate_t>::do_out
          (codecvt<char,char,mbstate_t> *this,mbstate_t *param_1,char *param_2,char *param_3,
          char **param_4,char *param_5,char *param_6,char **param_7)

{
  *param_4 = param_2;
  *param_7 = param_5;
  return 3;
}



### FUNC ~codecvt @ 0004ef1e

/* std::codecvt<wchar_t, char, mbstate_t>::~codecvt() */

void __thiscall
std::codecvt<wchar_t,char,mbstate_t>::~codecvt(codecvt<wchar_t,char,mbstate_t> *this)

{
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~codecvt @ 0004ef28

/* std::codecvt<wchar_t, char, mbstate_t>::~codecvt() */

void __thiscall
std::codecvt<wchar_t,char,mbstate_t>::~codecvt(codecvt<wchar_t,char,mbstate_t> *this)

{
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC do_out @ 0004ef48

/* std::codecvt<wchar_t, char, mbstate_t>::do_out(mbstate_t&, wchar_t const*, wchar_t const*,
   wchar_t const*&, char*, char*, char*&) const */

undefined4 __thiscall
std::codecvt<wchar_t,char,mbstate_t>::do_out
          (codecvt<wchar_t,char,mbstate_t> *this,mbstate_t *param_1,wchar_t *param_2,
          wchar_t *param_3,wchar_t **param_4,char *param_5,char *param_6,char **param_7)

{
  int iVar1;
  char *pcVar2;
  int iVar3;
  wchar_t *pwVar4;
  wchar_t wVar5;
  
  iVar1 = (int)param_3 - (int)param_2 >> 2;
  iVar3 = (int)param_6 - (int)param_5;
  if (iVar1 <= (int)param_6 - (int)param_5) {
    iVar3 = iVar1;
  }
  pwVar4 = param_2 + iVar3;
  if (0 < iVar3 * 4) {
    iVar1 = iVar3 + 1;
    pcVar2 = param_5;
    do {
      wVar5 = *param_2;
      param_2 = param_2 + 1;
      *pcVar2 = (char)wVar5;
      iVar1 = iVar1 + -1;
      pcVar2 = pcVar2 + 1;
    } while (1 < iVar1);
  }
  *param_4 = pwVar4;
  *param_7 = param_5 + iVar3;
  return 0;
}



### FUNC do_in @ 0004ef8e

/* std::codecvt<wchar_t, char, mbstate_t>::do_in(mbstate_t&, char const*, char const*, char const*&,
   wchar_t*, wchar_t*, wchar_t*&) const */

undefined4 __thiscall
std::codecvt<wchar_t,char,mbstate_t>::do_in
          (codecvt<wchar_t,char,mbstate_t> *this,mbstate_t *param_1,char *param_2,char *param_3,
          char **param_4,wchar_t *param_5,wchar_t *param_6,wchar_t **param_7)

{
  char *pcVar1;
  wchar_t *pwVar2;
  int iVar3;
  int iVar4;
  
  iVar3 = (int)param_6 - (int)param_5 >> 2;
  if ((int)param_3 - (int)param_2 <= iVar3) {
    iVar3 = (int)param_3 - (int)param_2;
  }
  pcVar1 = param_2 + iVar3;
  if (0 < iVar3) {
    iVar4 = iVar3 + 1;
    pwVar2 = param_5;
    do {
      *pwVar2 = (uint)(byte)*param_2;
      pwVar2 = pwVar2 + 1;
      iVar4 = iVar4 + -1;
      param_2 = (char *)((byte *)param_2 + 1);
    } while (1 < iVar4);
  }
  *param_4 = pcVar1;
  *param_7 = param_5 + iVar3;
  return 0;
}



### FUNC do_unshift @ 0004efd4

/* std::codecvt<wchar_t, char, mbstate_t>::do_unshift(mbstate_t&, char*, char*, char*&) const */

undefined4 __thiscall
std::codecvt<wchar_t,char,mbstate_t>::do_unshift
          (codecvt<wchar_t,char,mbstate_t> *this,mbstate_t *param_1,char *param_2,char *param_3,
          char **param_4)

{
  *param_4 = param_2;
  return 3;
}



### FUNC do_encoding @ 0004efdc

/* std::codecvt<wchar_t, char, mbstate_t>::do_encoding() const */

undefined4 std::codecvt<wchar_t,char,mbstate_t>::do_encoding(void)

{
  return 1;
}



### FUNC do_always_noconv @ 0004efe0

/* std::codecvt<wchar_t, char, mbstate_t>::do_always_noconv() const */

undefined4 std::codecvt<wchar_t,char,mbstate_t>::do_always_noconv(void)

{
  return 1;
}



### FUNC do_length @ 0004efe4

/* std::codecvt<wchar_t, char, mbstate_t>::do_length(mbstate_t&, char const*, char const*, unsigned
   int) const */

uint __thiscall
std::codecvt<wchar_t,char,mbstate_t>::do_length
          (codecvt<wchar_t,char,mbstate_t> *this,mbstate_t *param_1,char *param_2,char *param_3,
          uint param_4)

{
  if ((uint)((int)param_3 - (int)param_2) <= param_4) {
    param_4 = (int)param_3 - (int)param_2;
  }
  return param_4;
}



### FUNC do_max_length @ 0004eff0

/* std::codecvt<wchar_t, char, mbstate_t>::do_max_length() const */

undefined4 std::codecvt<wchar_t,char,mbstate_t>::do_max_length(void)

{
  return 1;
}



### FUNC ~collate @ 0004eff4

/* std::collate<char>::~collate() */

void __thiscall std::collate<char>::~collate(collate<char> *this)

{
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~collate @ 0004effe

/* std::collate<char>::~collate() */

void __thiscall std::collate<char>::~collate(collate<char> *this)

{
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC do_compare @ 0004f01e

/* std::collate<char>::do_compare(char const*, char const*, char const*, char const*) const */

undefined4 __thiscall
std::collate<char>::do_compare
          (collate<char> *this,char *param_1,char *param_2,char *param_3,char *param_4)

{
  int iVar1;
  size_t __n;
  undefined4 uVar2;
  size_t sVar3;
  size_t sVar4;
  
  sVar3 = (int)param_4 - (int)param_3;
  sVar4 = (int)param_2 - (int)param_1;
  __n = sVar3;
  if ((int)sVar4 <= (int)sVar3) {
    __n = sVar4;
  }
  iVar1 = memcmp(param_1,param_3,__n);
  if (iVar1 == 0) {
    uVar2 = 0;
    if ((sVar4 != sVar3) && (uVar2 = 0xffffffff, (int)sVar3 <= (int)sVar4)) {
      uVar2 = 1;
    }
  }
  else {
    uVar2 = 0xffffffff;
    if (0 < iVar1) {
      uVar2 = 1;
    }
  }
  return uVar2;
}



### FUNC do_transform @ 0004f05c

/* std::collate<char>::do_transform(char const*, char const*) const */

void std::collate<char>::do_transform(char *param_1,char *param_2)

{
  FUN_0004f078();
  return;
}



### FUNC FUN_0004f078 @ 0004f078

undefined4 * FUN_0004f078(undefined4 *param_1,int param_2,int param_3)

{
  undefined4 *puVar1;
  int iVar2;
  uint uVar3;
  uint local_18;
  
  param_1[4] = param_1;
  param_1[5] = param_1;
  iVar2 = param_3 - param_2;
  uVar3 = iVar2 + 1;
  if (uVar3 != 0) {
    puVar1 = param_1;
    if (0x10 < uVar3) {
      local_18 = uVar3;
      if (uVar3 < 0x81) {
        puVar1 = (undefined4 *)std::__node_alloc::_M_allocate(&local_18);
        uVar3 = local_18;
      }
      else {
        puVar1 = (undefined4 *)operator_new(uVar3);
      }
      param_1[4] = puVar1;
      param_1[5] = puVar1;
      *param_1 = (undefined1 *)((int)puVar1 + uVar3);
    }
    if (param_3 != param_2) {
      __aeabi_memcpy(puVar1,param_2,iVar2);
      puVar1 = (undefined4 *)((int)puVar1 + iVar2);
    }
    param_1[4] = puVar1;
    *(undefined1 *)puVar1 = 0;
    return param_1;
  }
                    /* WARNING: Subroutine does not return */
  std::__stl_throw_length_error("basic_string");
}



### FUNC do_hash @ 0004f114

/* std::collate<char>::do_hash(char const*, char const*) const */

int __thiscall std::collate<char>::do_hash(collate<char> *this,char *param_1,char *param_2)

{
  int iVar1;
  
  iVar1 = 0;
  if (param_1 < param_2) {
    iVar1 = 0;
    do {
      iVar1 = iVar1 * 5 + (uint)(byte)*param_1;
      param_1 = (char *)((byte *)param_1 + 1);
    } while (param_2 != param_1);
  }
  return iVar1;
}



### FUNC ~collate @ 0004f12c

/* std::collate<wchar_t>::~collate() */

void __thiscall std::collate<wchar_t>::~collate(collate<wchar_t> *this)

{
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~collate @ 0004f136

/* std::collate<wchar_t>::~collate() */

void __thiscall std::collate<wchar_t>::~collate(collate<wchar_t> *this)

{
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC do_compare @ 0004f156

/* std::collate<wchar_t>::do_compare(wchar_t const*, wchar_t const*, wchar_t const*, wchar_t const*)
   const */

undefined4 __thiscall
std::collate<wchar_t>::do_compare
          (collate<wchar_t> *this,wchar_t *param_1,wchar_t *param_2,wchar_t *param_3,
          wchar_t *param_4)

{
  undefined4 uVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  bool bVar7;
  bool bVar8;
  wchar_t *local_1c;
  
  bVar7 = param_3 == param_4;
  local_1c = param_1;
  if ((param_1 != param_2) && (param_3 != param_4)) {
    iVar6 = (int)param_3 + (4 - (int)param_4);
    iVar5 = 0;
    do {
      uVar3 = *(uint *)((int)param_3 + -iVar5);
      uVar2 = *(uint *)((int)param_1 + -iVar5);
      if (uVar2 < uVar3) {
        return 0xffffffff;
      }
      if (uVar3 < uVar2) {
        return 1;
      }
      bVar7 = iVar6 == iVar5;
      iVar4 = iVar5 + -4;
    } while ((iVar6 != iVar5) &&
            (bVar8 = (int)param_1 + (4 - (int)param_2) != iVar5, iVar5 = iVar4, bVar8));
    local_1c = (wchar_t *)((int)param_1 - iVar4);
  }
  uVar1 = 0xffffffff;
  if ((bVar7) && (uVar1 = 1, local_1c == param_2)) {
    uVar1 = 0;
  }
  return uVar1;
}



### FUNC do_transform @ 0004f1d8

/* std::collate<wchar_t>::do_transform(wchar_t const*, wchar_t const*) const */

void std::collate<wchar_t>::do_transform(wchar_t *param_1,wchar_t *param_2)

{
  FUN_0004f1f4();
  return;
}



### FUNC FUN_0004f1f4 @ 0004f1f4

int * FUN_0004f1f4(int *param_1,int param_2,int param_3)

{
  uint uVar1;
  int *piVar2;
  undefined4 uVar3;
  int iVar4;
  uint local_18;
  
  param_1[0x10] = (int)param_1;
  param_1[0x11] = (int)param_1;
  iVar4 = param_3 - param_2;
  uVar1 = (iVar4 >> 2) + 1;
  if (0x3ffffffe < (uint)(iVar4 >> 2)) {
                    /* WARNING: Subroutine does not return */
    std::__stl_throw_length_error("basic_string");
  }
  piVar2 = param_1;
  if (0x10 < uVar1) {
    if (0x3fffffff < uVar1) {
      FUN_00030824(4);
      uVar3 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
      FUN_000309e0(uVar3,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
    }
    uVar1 = uVar1 * 4;
    local_18 = uVar1;
    if (uVar1 < 0x81) {
      piVar2 = (int *)std::__node_alloc::_M_allocate(&local_18);
      uVar1 = local_18;
    }
    else {
      piVar2 = (int *)operator_new(uVar1);
    }
    param_1[0x10] = (int)piVar2;
    param_1[0x11] = (int)piVar2;
    *param_1 = (int)piVar2 + (uVar1 & 0xfffffffc);
  }
  if (param_3 != param_2) {
    __aeabi_memcpy(piVar2,param_2,iVar4);
    piVar2 = (int *)((int)piVar2 + iVar4);
  }
  param_1[0x10] = (int)piVar2;
  *piVar2 = 0;
  return param_1;
}



### FUNC do_hash @ 0004f2c8

/* std::collate<wchar_t>::do_hash(wchar_t const*, wchar_t const*) const */

int __thiscall
std::collate<wchar_t>::do_hash(collate<wchar_t> *this,wchar_t *param_1,wchar_t *param_2)

{
  int iVar1;
  wchar_t wVar2;
  
  iVar1 = 0;
  if (param_1 < param_2) {
    iVar1 = 0;
    do {
      wVar2 = *param_1;
      param_1 = param_1 + 1;
      iVar1 = wVar2 + iVar1 * 5;
    } while (param_1 < param_2);
  }
  return iVar1;
}



### FUNC classic_table @ 0004f2e0

/* std::ctype<char>::classic_table() */

undefined * std::ctype<char>::classic_table(void)

{
  return &DAT_00065b4c;
}



### FUNC ctype @ 0004f2ec

/* std::ctype<char>::ctype(std::ctype_base::mask const*, bool, unsigned int) */

ctype<char> * __thiscall
std::ctype<char>::ctype(ctype<char> *this,mask *param_1,bool param_2,uint param_3)

{
  mask *pmVar1;
  
  *(uint *)(this + 4) = (uint)(param_3 != 0);
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__ctype_00069fe8;
  pmVar1 = param_1;
  if (param_1 == (mask *)0x0) {
    pmVar1 = &DAT_00065b4c;
  }
  *(mask **)(this + 0xc) = pmVar1;
  this[0x10] = (ctype<char>)(param_1 != (mask *)0x0 && param_2);
  return this;
}



### FUNC ~ctype @ 0004f344

/* std::ctype<char>::~ctype() */

void __thiscall std::ctype<char>::~ctype(ctype<char> *this)

{
  *(undefined ***)this = &PTR__ctype_00069fe8;
  if ((this[0x10] != (ctype<char>)0x0) && (*(void **)(this + 0xc) != (void *)0x0)) {
    operator_delete__(*(void **)(this + 0xc));
  }
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~ctype @ 0004f370

/* std::ctype<char>::~ctype() */

void __thiscall std::ctype<char>::~ctype(ctype<char> *this)

{
  *(undefined ***)this = &PTR__ctype_00069fe8;
  if ((this[0x10] != (ctype<char>)0x0) && (*(void **)(this + 0xc) != (void *)0x0)) {
    operator_delete__(*(void **)(this + 0xc));
  }
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC scan_is @ 0004f3b0

/* std::ctype<char>::scan_is(std::ctype_base::mask, char const*, char const*) const */

byte * __thiscall
std::ctype<char>::scan_is(ctype<char> *this,uint param_2,byte *param_3,byte *param_4)

{
  int iVar1;
  int iVar2;
  
  iVar2 = (int)param_4 - (int)param_3 >> 2;
  iVar1 = *(int *)(this + 0xc);
  if (0 < iVar2) {
    iVar2 = iVar2 + 1;
    do {
      if ((*(uint *)(iVar1 + (uint)*param_3 * 4) & param_2) != 0) {
        return param_3;
      }
      if ((*(uint *)(iVar1 + (uint)param_3[1] * 4) & param_2) != 0) {
        return param_3 + 1;
      }
      if ((*(uint *)(iVar1 + (uint)param_3[2] * 4) & param_2) != 0) {
        return param_3 + 2;
      }
      if ((*(uint *)(iVar1 + (uint)param_3[3] * 4) & param_2) != 0) {
        return param_3 + 3;
      }
      iVar2 = iVar2 + -1;
      param_3 = param_3 + 4;
    } while (1 < iVar2);
  }
  iVar2 = (int)param_4 - (int)param_3;
  if (iVar2 != 1) {
    if (iVar2 != 2) {
      if (iVar2 != 3) {
        return param_4;
      }
      if ((*(uint *)(iVar1 + (uint)*param_3 * 4) & param_2) != 0) {
        return param_3;
      }
      param_3 = param_3 + 1;
    }
    if ((*(uint *)(iVar1 + (uint)*param_3 * 4) & param_2) != 0) {
      return param_3;
    }
    param_3 = param_3 + 1;
  }
  if ((*(uint *)(iVar1 + (uint)*param_3 * 4) & param_2) == 0) {
    return param_4;
  }
  return param_3;
}



### FUNC scan_not @ 0004f43c

/* std::ctype<char>::scan_not(std::ctype_base::mask, char const*, char const*) const */

byte * __thiscall
std::ctype<char>::scan_not(ctype<char> *this,uint param_2,byte *param_3,byte *param_4)

{
  int iVar1;
  int iVar2;
  
  iVar2 = (int)param_4 - (int)param_3 >> 2;
  iVar1 = *(int *)(this + 0xc);
  if (0 < iVar2) {
    iVar2 = iVar2 + 1;
    do {
      if ((*(uint *)(iVar1 + (uint)*param_3 * 4) & param_2) == 0) {
        return param_3;
      }
      if ((*(uint *)(iVar1 + (uint)param_3[1] * 4) & param_2) == 0) {
        return param_3 + 1;
      }
      if ((*(uint *)(iVar1 + (uint)param_3[2] * 4) & param_2) == 0) {
        return param_3 + 2;
      }
      if ((*(uint *)(iVar1 + (uint)param_3[3] * 4) & param_2) == 0) {
        return param_3 + 3;
      }
      iVar2 = iVar2 + -1;
      param_3 = param_3 + 4;
    } while (1 < iVar2);
  }
  iVar2 = (int)param_4 - (int)param_3;
  if (iVar2 != 1) {
    if (iVar2 != 2) {
      if (iVar2 != 3) {
        return param_4;
      }
      if ((*(uint *)(iVar1 + (uint)*param_3 * 4) & param_2) == 0) {
        return param_3;
      }
      param_3 = param_3 + 1;
    }
    if ((*(uint *)(iVar1 + (uint)*param_3 * 4) & param_2) == 0) {
      return param_3;
    }
    param_3 = param_3 + 1;
  }
  if ((*(uint *)(iVar1 + (uint)*param_3 * 4) & param_2) != 0) {
    return param_4;
  }
  return param_3;
}



### FUNC do_toupper @ 0004f4c8

/* std::ctype<char>::do_toupper(char) const */

undefined1 __thiscall std::ctype<char>::do_toupper(ctype<char> *this,char param_1)

{
  return (&DAT_00065f4c)[param_1];
}



### FUNC do_tolower @ 0004f4d4

/* std::ctype<char>::do_tolower(char) const */

undefined1 __thiscall std::ctype<char>::do_tolower(ctype<char> *this,char param_1)

{
  return (&DAT_0006604c)[param_1];
}



### FUNC do_toupper @ 0004f4e0

/* std::ctype<char>::do_toupper(char*, char const*) const */

char * __thiscall std::ctype<char>::do_toupper(ctype<char> *this,char *param_1,char *param_2)

{
  if (param_1 < param_2) {
    do {
      *param_1 = (&DAT_00065f4c)[(byte)*param_1];
      param_1 = (char *)((byte *)param_1 + 1);
    } while (param_2 != param_1);
  }
  return param_2;
}



### FUNC do_tolower @ 0004f4fc

/* std::ctype<char>::do_tolower(char*, char const*) const */

char * __thiscall std::ctype<char>::do_tolower(ctype<char> *this,char *param_1,char *param_2)

{
  if (param_1 < param_2) {
    do {
      *param_1 = (&DAT_0006604c)[(byte)*param_1];
      param_1 = (char *)((byte *)param_1 + 1);
    } while (param_2 != param_1);
  }
  return param_2;
}



### FUNC do_widen @ 0004f518

/* std::ctype<char>::do_widen(char) const */

int __thiscall std::ctype<char>::do_widen(ctype<char> *this,char param_1)

{
  return (int)param_1;
}



### FUNC do_widen @ 0004f51c

/* std::ctype<char>::do_widen(char const*, char const*, char*) const */

char * __thiscall
std::ctype<char>::do_widen(ctype<char> *this,char *param_1,char *param_2,char *param_3)

{
  if (param_2 != param_1) {
    __aeabi_memmove(param_3);
  }
  return param_2;
}



### FUNC do_narrow @ 0004f530

/* std::ctype<char>::do_narrow(char, char) const */

int std::ctype<char>::do_narrow(char param_1,char param_2)

{
  return (int)param_2;
}



### FUNC do_narrow @ 0004f534

/* std::ctype<char>::do_narrow(char const*, char const*, char, char*) const */

char * __thiscall
std::ctype<char>::do_narrow
          (ctype<char> *this,char *param_1,char *param_2,char param_3,char *param_4)

{
  if ((int)param_2 - (int)param_1 != 0) {
    __aeabi_memmove(param_4,param_1,(int)param_2 - (int)param_1,(int)param_3);
  }
  return param_2;
}



### FUNC ~ctype @ 0004f548

/* std::ctype<wchar_t>::~ctype() */

void __thiscall std::ctype<wchar_t>::~ctype(ctype<wchar_t> *this)

{
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~ctype @ 0004f552

/* std::ctype<wchar_t>::~ctype() */

void __thiscall std::ctype<wchar_t>::~ctype(ctype<wchar_t> *this)

{
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC do_is @ 0004f574

/* std::ctype<wchar_t>::do_is(std::ctype_base::mask, wchar_t) const */

undefined4 __thiscall std::ctype<wchar_t>::do_is(undefined4 param_1,uint param_2,uint param_3)

{
  undefined4 uVar1;
  
  uVar1 = 0;
  if (param_3 < 0x100) {
    uVar1 = 1;
    if ((*(uint *)(&DAT_00065b4c + param_3 * 4) & param_2) == 0) {
      uVar1 = 0;
    }
  }
  return uVar1;
}



### FUNC do_is @ 0004f594

/* std::ctype<wchar_t>::do_is(wchar_t const*, wchar_t const*, std::ctype_base::mask*) const */

wchar_t * __thiscall
std::ctype<wchar_t>::do_is(ctype<wchar_t> *this,wchar_t *param_1,wchar_t *param_2,mask *param_3)

{
  undefined4 uVar1;
  
  if (param_1 < param_2) {
    do {
      uVar1 = 0;
      if ((uint)*param_1 < 0x100) {
        uVar1 = *(undefined4 *)(&DAT_00065b4c + *param_1 * 4);
      }
      *(undefined4 *)param_3 = uVar1;
      param_3 = (mask *)((int)param_3 + 4);
      param_1 = param_1 + 1;
    } while (param_1 < param_2);
  }
  return param_2;
}



### FUNC do_scan_is @ 0004f5bc

/* std::ctype<wchar_t>::do_scan_is(std::ctype_base::mask, wchar_t const*, wchar_t const*) const */

uint * __thiscall
std::ctype<wchar_t>::do_scan_is(undefined4 param_1,uint param_2,uint *param_3,uint *param_4)

{
  int iVar1;
  
  iVar1 = (int)param_4 - (int)param_3 >> 4;
  if (0 < iVar1) {
    iVar1 = iVar1 + 1;
    do {
      if ((*param_3 < 0x100) && ((*(uint *)(&DAT_00065b4c + *param_3 * 4) & param_2) != 0)) {
        return param_3;
      }
      if ((param_3[1] < 0x100) && ((*(uint *)(&DAT_00065b4c + param_3[1] * 4) & param_2) != 0)) {
        return param_3 + 1;
      }
      if ((param_3[2] < 0x100) && ((*(uint *)(&DAT_00065b4c + param_3[2] * 4) & param_2) != 0)) {
        return param_3 + 2;
      }
      if ((param_3[3] < 0x100) && ((*(uint *)(&DAT_00065b4c + param_3[3] * 4) & param_2) != 0)) {
        return param_3 + 3;
      }
      iVar1 = iVar1 + -1;
      param_3 = param_3 + 4;
    } while (1 < iVar1);
  }
  iVar1 = (int)param_4 - (int)param_3 >> 2;
  if (iVar1 != 1) {
    if (iVar1 != 2) {
      if (iVar1 != 3) {
        return param_4;
      }
      if ((*param_3 < 0x100) && ((*(uint *)(&DAT_00065b4c + *param_3 * 4) & param_2) != 0)) {
        return param_3;
      }
      param_3 = param_3 + 1;
    }
    if ((*param_3 < 0x100) && ((*(uint *)(&DAT_00065b4c + *param_3 * 4) & param_2) != 0)) {
      return param_3;
    }
    param_3 = param_3 + 1;
  }
  if ((*param_3 < 0x100) && ((*(uint *)(&DAT_00065b4c + *param_3 * 4) & param_2) != 0)) {
    return param_3;
  }
  return param_4;
}



### FUNC do_scan_not @ 0004f6b4

/* std::ctype<wchar_t>::do_scan_not(std::ctype_base::mask, wchar_t const*, wchar_t const*) const */

uint * __thiscall
std::ctype<wchar_t>::do_scan_not(undefined4 param_1,uint param_2,uint *param_3,uint *param_4)

{
  int iVar1;
  
  iVar1 = (int)param_4 - (int)param_3 >> 4;
  if (0 < iVar1) {
    iVar1 = iVar1 + 1;
    do {
      if (0xff < *param_3) {
        return param_3;
      }
      if ((*(uint *)(&DAT_00065b4c + *param_3 * 4) & param_2) == 0) {
        return param_3;
      }
      if (0xff < param_3[1]) {
        return param_3 + 1;
      }
      if ((*(uint *)(&DAT_00065b4c + param_3[1] * 4) & param_2) == 0) {
        return param_3 + 1;
      }
      if (0xff < param_3[2]) {
        return param_3 + 2;
      }
      if ((*(uint *)(&DAT_00065b4c + param_3[2] * 4) & param_2) == 0) {
        return param_3 + 2;
      }
      if (0xff < param_3[3]) {
        return param_3 + 3;
      }
      if ((*(uint *)(&DAT_00065b4c + param_3[3] * 4) & param_2) == 0) {
        return param_3 + 3;
      }
      iVar1 = iVar1 + -1;
      param_3 = param_3 + 4;
    } while (1 < iVar1);
  }
  iVar1 = (int)param_4 - (int)param_3 >> 2;
  if (iVar1 != 1) {
    if (iVar1 != 2) {
      if (iVar1 != 3) {
        return param_4;
      }
      if (0xff < *param_3) {
        return param_3;
      }
      if ((*(uint *)(&DAT_00065b4c + *param_3 * 4) & param_2) == 0) {
        return param_3;
      }
      param_3 = param_3 + 1;
    }
    if (0xff < *param_3) {
      return param_3;
    }
    if ((*(uint *)(&DAT_00065b4c + *param_3 * 4) & param_2) == 0) {
      return param_3;
    }
    param_3 = param_3 + 1;
  }
  if (0xff < *param_3) {
    return param_3;
  }
  if ((*(uint *)(&DAT_00065b4c + *param_3 * 4) & param_2) != 0) {
    return param_4;
  }
  return param_3;
}



### FUNC do_toupper @ 0004f7bc

/* std::ctype<wchar_t>::do_toupper(wchar_t) const */

wchar_t __thiscall std::ctype<wchar_t>::do_toupper(ctype<wchar_t> *this,wchar_t param_1)

{
  if ((uint)param_1 < 0x100) {
    param_1 = (wchar_t)(byte)(&DAT_00065f4c)[param_1];
  }
  return param_1;
}



### FUNC do_toupper @ 0004f7d0

/* std::ctype<wchar_t>::do_toupper(wchar_t*, wchar_t const*) const */

wchar_t * __thiscall
std::ctype<wchar_t>::do_toupper(ctype<wchar_t> *this,wchar_t *param_1,wchar_t *param_2)

{
  wchar_t wVar1;
  
  if (param_1 < param_2) {
    do {
      wVar1 = *param_1;
      if ((uint)wVar1 < 0x100) {
        wVar1 = (wchar_t)(byte)(&DAT_00065f4c)[wVar1];
      }
      *param_1 = wVar1;
      param_1 = param_1 + 1;
    } while (param_1 < param_2);
  }
  return param_2;
}



### FUNC do_tolower @ 0004f7f0

/* std::ctype<wchar_t>::do_tolower(wchar_t) const */

wchar_t __thiscall std::ctype<wchar_t>::do_tolower(ctype<wchar_t> *this,wchar_t param_1)

{
  if ((uint)param_1 < 0x100) {
    param_1 = (wchar_t)(byte)(&DAT_0006604c)[param_1];
  }
  return param_1;
}



### FUNC do_tolower @ 0004f804

/* std::ctype<wchar_t>::do_tolower(wchar_t*, wchar_t const*) const */

wchar_t * __thiscall
std::ctype<wchar_t>::do_tolower(ctype<wchar_t> *this,wchar_t *param_1,wchar_t *param_2)

{
  wchar_t wVar1;
  
  if (param_1 < param_2) {
    do {
      wVar1 = *param_1;
      if ((uint)wVar1 < 0x100) {
        wVar1 = (wchar_t)(byte)(&DAT_0006604c)[wVar1];
      }
      *param_1 = wVar1;
      param_1 = param_1 + 1;
    } while (param_1 < param_2);
  }
  return param_2;
}



### FUNC do_widen @ 0004f824

/* std::ctype<wchar_t>::do_widen(char) const */

int __thiscall std::ctype<wchar_t>::do_widen(ctype<wchar_t> *this,char param_1)

{
  return (int)param_1;
}



### FUNC do_widen @ 0004f828

/* std::ctype<wchar_t>::do_widen(char const*, char const*, wchar_t*) const */

char * __thiscall
std::ctype<wchar_t>::do_widen(ctype<wchar_t> *this,char *param_1,char *param_2,wchar_t *param_3)

{
  if (param_1 != param_2) {
    do {
      *param_3 = (uint)(byte)*param_1;
      param_3 = param_3 + 1;
      param_1 = (char *)((byte *)param_1 + 1);
    } while (param_2 != param_1);
  }
  return param_2;
}



### FUNC do_narrow @ 0004f83a

/* std::ctype<wchar_t>::do_narrow(wchar_t, char) const */

wchar_t __thiscall std::ctype<wchar_t>::do_narrow(ctype<wchar_t> *this,wchar_t param_1,char param_2)

{
  wchar_t wVar1;
  
  wVar1 = (int)param_2;
  if ((param_1 & 0xffU) == param_1) {
    wVar1 = param_1 & 0xffU;
  }
  return wVar1;
}



### FUNC do_narrow @ 0004f848

/* std::ctype<wchar_t>::do_narrow(wchar_t const*, wchar_t const*, char, char*) const */

wchar_t * __thiscall
std::ctype<wchar_t>::do_narrow
          (ctype<wchar_t> *this,wchar_t *param_1,wchar_t *param_2,char param_3,char *param_4)

{
  char cVar1;
  wchar_t wVar2;
  
  if (param_1 != param_2) {
    do {
      wVar2 = *param_1;
      param_1 = param_1 + 1;
      cVar1 = param_3;
      if ((wVar2 & 0xffU) == wVar2) {
        cVar1 = (char)wVar2;
      }
      *param_4 = cVar1;
      param_4 = param_4 + 1;
    } while (param_2 != param_1);
  }
  return param_2;
}



### FUNC moneypunct @ 0004f870

/* std::moneypunct<char, true>::moneypunct(unsigned int) */

moneypunct<char,true> * __thiscall
std::moneypunct<char,true>::moneypunct(moneypunct<char,true> *this,uint param_1)

{
  *(uint *)(this + 4) = (uint)(param_1 != 0);
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__moneypunct_0006a0a8;
  this[0xc] = (moneypunct<char,true>)0x2;
  this[0xd] = (moneypunct<char,true>)0x3;
  this[0xf] = (moneypunct<char,true>)0x4;
  this[0xe] = (moneypunct<char,true>)0x0;
  this[0x10] = (moneypunct<char,true>)0x2;
  this[0x12] = (moneypunct<char,true>)0x0;
  this[0x11] = (moneypunct<char,true>)0x3;
  this[0x13] = (moneypunct<char,true>)0x4;
  return this;
}



### FUNC ~moneypunct @ 0004f8b4

/* std::moneypunct<char, true>::~moneypunct() */

void __thiscall std::moneypunct<char,true>::~moneypunct(moneypunct<char,true> *this)

{
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~moneypunct @ 0004f8be

/* std::moneypunct<char, true>::~moneypunct() */

void __thiscall std::moneypunct<char,true>::~moneypunct(moneypunct<char,true> *this)

{
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC do_decimal_point @ 0004f8de

/* std::moneypunct<char, true>::do_decimal_point() const */

undefined4 std::moneypunct<char,true>::do_decimal_point(void)

{
  return 0x20;
}



### FUNC do_thousands_sep @ 0004f8e2

/* std::moneypunct<char, true>::do_thousands_sep() const */

undefined4 std::moneypunct<char,true>::do_thousands_sep(void)

{
  return 0x20;
}



### FUNC do_grouping @ 0004f8e8

/* std::moneypunct<char, true>::do_grouping() const */

void __thiscall std::moneypunct<char,true>::do_grouping(moneypunct<char,true> *this)

{
  undefined1 auStack_c [4];
  
  FUN_00031c38(this,&DAT_00066173,auStack_c);
  return;
}



### FUNC do_curr_symbol @ 0004f904

/* std::moneypunct<char, true>::do_curr_symbol() const */

void __thiscall std::moneypunct<char,true>::do_curr_symbol(moneypunct<char,true> *this)

{
  undefined1 auStack_c [4];
  
  FUN_00031c38(this,&DAT_00066173,auStack_c);
  return;
}



### FUNC do_positive_sign @ 0004f920

/* std::moneypunct<char, true>::do_positive_sign() const */

void __thiscall std::moneypunct<char,true>::do_positive_sign(moneypunct<char,true> *this)

{
  undefined1 auStack_c [4];
  
  FUN_00031c38(this,&DAT_00066173,auStack_c);
  return;
}



### FUNC do_negative_sign @ 0004f93c

/* std::moneypunct<char, true>::do_negative_sign() const */

void __thiscall std::moneypunct<char,true>::do_negative_sign(moneypunct<char,true> *this)

{
  undefined1 auStack_c [4];
  
  FUN_00031c38(this,&DAT_00066173,auStack_c);
  return;
}



### FUNC do_pos_format @ 0004f958

/* std::moneypunct<char, true>::do_pos_format() const */

undefined4 __thiscall std::moneypunct<char,true>::do_pos_format(moneypunct<char,true> *this)

{
  return *(undefined4 *)(this + 0xc);
}



### FUNC do_neg_format @ 0004f96e

/* std::moneypunct<char, true>::do_neg_format() const */

undefined4 __thiscall std::moneypunct<char,true>::do_neg_format(moneypunct<char,true> *this)

{
  return *(undefined4 *)(this + 0x10);
}



### FUNC do_frac_digits @ 0004f984

/* std::moneypunct<char, true>::do_frac_digits() const */

undefined4 std::moneypunct<char,true>::do_frac_digits(void)

{
  return 0;
}



### FUNC moneypunct @ 0004f988

/* std::moneypunct<char, false>::moneypunct(unsigned int) */

moneypunct<char,false> * __thiscall
std::moneypunct<char,false>::moneypunct(moneypunct<char,false> *this,uint param_1)

{
  *(uint *)(this + 4) = (uint)(param_1 != 0);
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__moneypunct_0006a0dc;
  this[0xc] = (moneypunct<char,false>)0x2;
  this[0xd] = (moneypunct<char,false>)0x3;
  this[0xf] = (moneypunct<char,false>)0x4;
  this[0xe] = (moneypunct<char,false>)0x0;
  this[0x10] = (moneypunct<char,false>)0x2;
  this[0x12] = (moneypunct<char,false>)0x0;
  this[0x11] = (moneypunct<char,false>)0x3;
  this[0x13] = (moneypunct<char,false>)0x4;
  return this;
}



### FUNC ~moneypunct @ 0004f9cc

/* std::moneypunct<char, false>::~moneypunct() */

void __thiscall std::moneypunct<char,false>::~moneypunct(moneypunct<char,false> *this)

{
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~moneypunct @ 0004f9d6

/* std::moneypunct<char, false>::~moneypunct() */

void __thiscall std::moneypunct<char,false>::~moneypunct(moneypunct<char,false> *this)

{
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC do_decimal_point @ 0004f9f6

/* std::moneypunct<char, false>::do_decimal_point() const */

undefined4 std::moneypunct<char,false>::do_decimal_point(void)

{
  return 0x20;
}



### FUNC do_thousands_sep @ 0004f9fa

/* std::moneypunct<char, false>::do_thousands_sep() const */

undefined4 std::moneypunct<char,false>::do_thousands_sep(void)

{
  return 0x20;
}



### FUNC do_grouping @ 0004fa00

/* std::moneypunct<char, false>::do_grouping() const */

void __thiscall std::moneypunct<char,false>::do_grouping(moneypunct<char,false> *this)

{
  undefined1 auStack_c [4];
  
  FUN_00031c38(this,&DAT_00066173,auStack_c);
  return;
}



### FUNC do_curr_symbol @ 0004fa1c

/* std::moneypunct<char, false>::do_curr_symbol() const */

void __thiscall std::moneypunct<char,false>::do_curr_symbol(moneypunct<char,false> *this)

{
  undefined1 auStack_c [4];
  
  FUN_00031c38(this,&DAT_00066173,auStack_c);
  return;
}



### FUNC do_positive_sign @ 0004fa38

/* std::moneypunct<char, false>::do_positive_sign() const */

void __thiscall std::moneypunct<char,false>::do_positive_sign(moneypunct<char,false> *this)

{
  undefined1 auStack_c [4];
  
  FUN_00031c38(this,&DAT_00066173,auStack_c);
  return;
}



### FUNC do_negative_sign @ 0004fa54

/* std::moneypunct<char, false>::do_negative_sign() const */

void __thiscall std::moneypunct<char,false>::do_negative_sign(moneypunct<char,false> *this)

{
  undefined1 auStack_c [4];
  
  FUN_00031c38(this,&DAT_00066173,auStack_c);
  return;
}



### FUNC do_pos_format @ 0004fa70

/* std::moneypunct<char, false>::do_pos_format() const */

undefined4 __thiscall std::moneypunct<char,false>::do_pos_format(moneypunct<char,false> *this)

{
  return *(undefined4 *)(this + 0xc);
}



### FUNC do_neg_format @ 0004fa86

/* std::moneypunct<char, false>::do_neg_format() const */

undefined4 __thiscall std::moneypunct<char,false>::do_neg_format(moneypunct<char,false> *this)

{
  return *(undefined4 *)(this + 0x10);
}



### FUNC do_frac_digits @ 0004fa9c

/* std::moneypunct<char, false>::do_frac_digits() const */

undefined4 std::moneypunct<char,false>::do_frac_digits(void)

{
  return 0;
}



### FUNC moneypunct @ 0004faa0

/* std::moneypunct<wchar_t, true>::moneypunct(unsigned int) */

moneypunct<wchar_t,true> * __thiscall
std::moneypunct<wchar_t,true>::moneypunct(moneypunct<wchar_t,true> *this,uint param_1)

{
  *(uint *)(this + 4) = (uint)(param_1 != 0);
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__moneypunct_0006a110;
  this[0xc] = (moneypunct<wchar_t,true>)0x2;
  this[0xd] = (moneypunct<wchar_t,true>)0x3;
  this[0xf] = (moneypunct<wchar_t,true>)0x4;
  this[0xe] = (moneypunct<wchar_t,true>)0x0;
  this[0x10] = (moneypunct<wchar_t,true>)0x2;
  this[0x12] = (moneypunct<wchar_t,true>)0x0;
  this[0x11] = (moneypunct<wchar_t,true>)0x3;
  this[0x13] = (moneypunct<wchar_t,true>)0x4;
  return this;
}



### FUNC ~moneypunct @ 0004fae4

/* std::moneypunct<wchar_t, true>::~moneypunct() */

void __thiscall std::moneypunct<wchar_t,true>::~moneypunct(moneypunct<wchar_t,true> *this)

{
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~moneypunct @ 0004faee

/* std::moneypunct<wchar_t, true>::~moneypunct() */

void __thiscall std::moneypunct<wchar_t,true>::~moneypunct(moneypunct<wchar_t,true> *this)

{
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC do_decimal_point @ 0004fb0e

/* std::moneypunct<wchar_t, true>::do_decimal_point() const */

undefined4 std::moneypunct<wchar_t,true>::do_decimal_point(void)

{
  return 0x20;
}



### FUNC do_thousands_sep @ 0004fb12

/* std::moneypunct<wchar_t, true>::do_thousands_sep() const */

undefined4 std::moneypunct<wchar_t,true>::do_thousands_sep(void)

{
  return 0x20;
}



### FUNC do_grouping @ 0004fb18

/* std::moneypunct<wchar_t, true>::do_grouping() const */

void __thiscall std::moneypunct<wchar_t,true>::do_grouping(moneypunct<wchar_t,true> *this)

{
  undefined1 auStack_c [4];
  
  FUN_00031c38(this,&DAT_00066173,auStack_c);
  return;
}



### FUNC do_curr_symbol @ 0004fb34

/* std::moneypunct<wchar_t, true>::do_curr_symbol() const */

void __thiscall std::moneypunct<wchar_t,true>::do_curr_symbol(moneypunct<wchar_t,true> *this)

{
  size_t sVar1;
  
  *(moneypunct<wchar_t,true> **)(this + 0x40) = this;
  *(moneypunct<wchar_t,true> **)(this + 0x44) = this;
  sVar1 = wcslen(L"");
  FUN_0004fe38(this,&DAT_00066174,&DAT_00066174 + sVar1 * 4);
  return;
}



### FUNC do_positive_sign @ 0004fb8c

/* std::moneypunct<wchar_t, true>::do_positive_sign() const */

void __thiscall std::moneypunct<wchar_t,true>::do_positive_sign(moneypunct<wchar_t,true> *this)

{
  size_t sVar1;
  
  *(moneypunct<wchar_t,true> **)(this + 0x40) = this;
  *(moneypunct<wchar_t,true> **)(this + 0x44) = this;
  sVar1 = wcslen(L"");
  FUN_0004fe38(this,&DAT_00066174,&DAT_00066174 + sVar1 * 4);
  return;
}



### FUNC do_negative_sign @ 0004fbe4

/* std::moneypunct<wchar_t, true>::do_negative_sign() const */

void __thiscall std::moneypunct<wchar_t,true>::do_negative_sign(moneypunct<wchar_t,true> *this)

{
  size_t sVar1;
  
  *(moneypunct<wchar_t,true> **)(this + 0x40) = this;
  *(moneypunct<wchar_t,true> **)(this + 0x44) = this;
  sVar1 = wcslen(L"");
  FUN_0004fe38(this,&DAT_00066174,&DAT_00066174 + sVar1 * 4);
  return;
}



### FUNC do_frac_digits @ 0004fc3c

/* std::moneypunct<wchar_t, true>::do_frac_digits() const */

undefined4 std::moneypunct<wchar_t,true>::do_frac_digits(void)

{
  return 0;
}



### FUNC do_pos_format @ 0004fc40

/* std::moneypunct<wchar_t, true>::do_pos_format() const */

undefined4 __thiscall std::moneypunct<wchar_t,true>::do_pos_format(moneypunct<wchar_t,true> *this)

{
  return *(undefined4 *)(this + 0xc);
}



### FUNC do_neg_format @ 0004fc56

/* std::moneypunct<wchar_t, true>::do_neg_format() const */

undefined4 __thiscall std::moneypunct<wchar_t,true>::do_neg_format(moneypunct<wchar_t,true> *this)

{
  return *(undefined4 *)(this + 0x10);
}



### FUNC moneypunct @ 0004fc6c

/* std::moneypunct<wchar_t, false>::moneypunct(unsigned int) */

moneypunct<wchar_t,false> * __thiscall
std::moneypunct<wchar_t,false>::moneypunct(moneypunct<wchar_t,false> *this,uint param_1)

{
  *(uint *)(this + 4) = (uint)(param_1 != 0);
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__moneypunct_0006a144;
  this[0xc] = (moneypunct<wchar_t,false>)0x2;
  this[0xd] = (moneypunct<wchar_t,false>)0x3;
  this[0xf] = (moneypunct<wchar_t,false>)0x4;
  this[0xe] = (moneypunct<wchar_t,false>)0x0;
  this[0x10] = (moneypunct<wchar_t,false>)0x2;
  this[0x12] = (moneypunct<wchar_t,false>)0x0;
  this[0x11] = (moneypunct<wchar_t,false>)0x3;
  this[0x13] = (moneypunct<wchar_t,false>)0x4;
  return this;
}



### FUNC ~moneypunct @ 0004fcb0

/* std::moneypunct<wchar_t, false>::~moneypunct() */

void __thiscall std::moneypunct<wchar_t,false>::~moneypunct(moneypunct<wchar_t,false> *this)

{
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~moneypunct @ 0004fcba

/* std::moneypunct<wchar_t, false>::~moneypunct() */

void __thiscall std::moneypunct<wchar_t,false>::~moneypunct(moneypunct<wchar_t,false> *this)

{
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC do_decimal_point @ 0004fcda

/* std::moneypunct<wchar_t, false>::do_decimal_point() const */

undefined4 std::moneypunct<wchar_t,false>::do_decimal_point(void)

{
  return 0x20;
}



### FUNC do_thousands_sep @ 0004fcde

/* std::moneypunct<wchar_t, false>::do_thousands_sep() const */

undefined4 std::moneypunct<wchar_t,false>::do_thousands_sep(void)

{
  return 0x20;
}



### FUNC do_grouping @ 0004fce4

/* std::moneypunct<wchar_t, false>::do_grouping() const */

void __thiscall std::moneypunct<wchar_t,false>::do_grouping(moneypunct<wchar_t,false> *this)

{
  undefined1 auStack_c [4];
  
  FUN_00031c38(this,&DAT_00066173,auStack_c);
  return;
}



### FUNC do_curr_symbol @ 0004fd00

/* std::moneypunct<wchar_t, false>::do_curr_symbol() const */

void __thiscall std::moneypunct<wchar_t,false>::do_curr_symbol(moneypunct<wchar_t,false> *this)

{
  size_t sVar1;
  
  *(moneypunct<wchar_t,false> **)(this + 0x40) = this;
  *(moneypunct<wchar_t,false> **)(this + 0x44) = this;
  sVar1 = wcslen(L"");
  FUN_0004fe38(this,&DAT_00066174,&DAT_00066174 + sVar1 * 4);
  return;
}



### FUNC do_positive_sign @ 0004fd58

/* std::moneypunct<wchar_t, false>::do_positive_sign() const */

void __thiscall std::moneypunct<wchar_t,false>::do_positive_sign(moneypunct<wchar_t,false> *this)

{
  size_t sVar1;
  
  *(moneypunct<wchar_t,false> **)(this + 0x40) = this;
  *(moneypunct<wchar_t,false> **)(this + 0x44) = this;
  sVar1 = wcslen(L"");
  FUN_0004fe38(this,&DAT_00066174,&DAT_00066174 + sVar1 * 4);
  return;
}



### FUNC do_negative_sign @ 0004fdb0

/* std::moneypunct<wchar_t, false>::do_negative_sign() const */

void __thiscall std::moneypunct<wchar_t,false>::do_negative_sign(moneypunct<wchar_t,false> *this)

{
  size_t sVar1;
  
  *(moneypunct<wchar_t,false> **)(this + 0x40) = this;
  *(moneypunct<wchar_t,false> **)(this + 0x44) = this;
  sVar1 = wcslen(L"");
  FUN_0004fe38(this,&DAT_00066174,&DAT_00066174 + sVar1 * 4);
  return;
}



### FUNC do_frac_digits @ 0004fe08

/* std::moneypunct<wchar_t, false>::do_frac_digits() const */

undefined4 std::moneypunct<wchar_t,false>::do_frac_digits(void)

{
  return 0;
}



### FUNC do_pos_format @ 0004fe0c

/* std::moneypunct<wchar_t, false>::do_pos_format() const */

undefined4 __thiscall std::moneypunct<wchar_t,false>::do_pos_format(moneypunct<wchar_t,false> *this)

{
  return *(undefined4 *)(this + 0xc);
}



### FUNC do_neg_format @ 0004fe22

/* std::moneypunct<wchar_t, false>::do_neg_format() const */

undefined4 __thiscall std::moneypunct<wchar_t,false>::do_neg_format(moneypunct<wchar_t,false> *this)

{
  return *(undefined4 *)(this + 0x10);
}



### FUNC FUN_0004fe38 @ 0004fe38

void FUN_0004fe38(int *param_1,int param_2,int param_3)

{
  uint uVar1;
  undefined4 *puVar2;
  undefined4 uVar3;
  uint uVar4;
  uint local_18;
  
  uVar4 = param_3 - param_2 >> 2;
  uVar1 = uVar4 + 1;
  if (0x3ffffffe < uVar4) {
                    /* WARNING: Subroutine does not return */
    std::__stl_throw_length_error("basic_string");
  }
  if (uVar1 < 0x11) {
    puVar2 = (undefined4 *)param_1[0x11];
  }
  else {
    if (0x3fffffff < uVar1) {
      FUN_00030824(4);
      uVar3 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
      FUN_000309e0(uVar3,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
    }
    uVar1 = uVar1 * 4;
    local_18 = uVar1;
    if (uVar1 < 0x81) {
      puVar2 = (undefined4 *)std::__node_alloc::_M_allocate(&local_18);
      uVar1 = local_18;
    }
    else {
      puVar2 = (undefined4 *)operator_new(uVar1);
    }
    param_1[0x10] = (int)puVar2;
    param_1[0x11] = (int)puVar2;
    *param_1 = (int)puVar2 + (uVar1 & 0xfffffffc);
  }
  if (param_3 != param_2) {
    __aeabi_memcpy(puVar2,param_2);
    puVar2 = (undefined4 *)((int)puVar2 + (param_3 - param_2));
  }
  param_1[0x10] = (int)puVar2;
  *puVar2 = 0;
  return;
}



### FUNC __valid_grouping @ 0004fee0

/* std::priv::__valid_grouping(char const*, char const*, char const*, char const*) */

undefined4 std::priv::__valid_grouping(char *param_1,char *param_2,char *param_3,char *param_4)

{
  byte bVar1;
  byte bVar2;
  char *pcVar3;
  undefined4 uVar4;
  
  uVar4 = 1;
  if ((param_1 != param_2) && (param_3 != param_4)) {
    bVar2 = param_2[-1];
    bVar1 = *param_3;
    for (pcVar3 = param_2 + -1; pcVar3 != param_1; pcVar3 = pcVar3 + -1) {
      if (bVar2 != bVar1) {
        return 0;
      }
      if (param_3 != param_4 + -1) {
        param_3 = (char *)((byte *)param_3 + 1);
      }
      bVar1 = *param_3;
      bVar2 = pcVar3[-1];
    }
    uVar4 = 1;
    if (bVar1 < bVar2) {
      uVar4 = 0;
    }
  }
  return uVar4;
}



### FUNC __digit_val_table @ 0004ff38

/* std::priv::__digit_val_table(unsigned int) */

undefined1 std::priv::__digit_val_table(uint param_1)

{
  return (&DAT_00066206)[param_1];
}



### FUNC __narrow_atoms @ 0004ff44

/* std::priv::__narrow_atoms() */

char * std::priv::__narrow_atoms(void)

{
  return "+-0xX";
}



### FUNC __get_fdigit @ 0004ff50

/* std::priv::__get_fdigit(wchar_t&, wchar_t const*) */

undefined4 std::priv::__get_fdigit(wchar_t *param_1,wchar_t *param_2)

{
  wchar_t wVar1;
  wchar_t wVar2;
  
  wVar1 = *param_1;
  wVar2 = L'0';
  if ((((((*param_2 != wVar1) && (wVar2 = L'1', param_2[1] != wVar1)) &&
        (wVar2 = L'2', param_2[2] != wVar1)) &&
       ((wVar2 = L'3', param_2[3] != wVar1 && (wVar2 = L'4', param_2[4] != wVar1)))) &&
      ((wVar2 = L'5', param_2[5] != wVar1 &&
       ((wVar2 = L'6', param_2[6] != wVar1 && (wVar2 = L'7', param_2[7] != wVar1)))))) &&
     ((wVar2 = L'8', param_2[8] != wVar1 && (wVar2 = L'9', param_2[9] != wVar1)))) {
    return 0;
  }
  *param_1 = wVar2;
  return 1;
}



### FUNC __get_fdigit_or_sep @ 0004ffb0

/* std::priv::__get_fdigit_or_sep(wchar_t&, wchar_t, wchar_t const*) */

undefined4 std::priv::__get_fdigit_or_sep(wchar_t *param_1,wchar_t param_2,wchar_t *param_3)

{
  wchar_t wVar1;
  wchar_t wVar2;
  
  wVar1 = *param_1;
  wVar2 = L',';
  if ((((((wVar1 != param_2) && (wVar2 = L'0', *param_3 != wVar1)) &&
        (wVar2 = L'1', param_3[1] != wVar1)) &&
       ((wVar2 = L'2', param_3[2] != wVar1 && (wVar2 = L'3', param_3[3] != wVar1)))) &&
      ((wVar2 = L'4', param_3[4] != wVar1 &&
       ((wVar2 = L'5', param_3[5] != wVar1 && (wVar2 = L'6', param_3[6] != wVar1)))))) &&
     ((wVar2 = L'7', param_3[7] != wVar1 &&
      ((wVar2 = L'8', param_3[8] != wVar1 && (wVar2 = L'9', param_3[9] != wVar1)))))) {
    return 0;
  }
  *param_1 = wVar2;
  return 1;
}



### FUNC __hex_char_table_lo @ 00050018

/* std::priv::__hex_char_table_lo() */

char * std::priv::__hex_char_table_lo(void)

{
  return "0123456789abcdefx";
}



### FUNC __hex_char_table_hi @ 00050024

/* std::priv::__hex_char_table_hi() */

char * std::priv::__hex_char_table_hi(void)

{
  return "0123456789ABCDEFX";
}



### FUNC FUN_00050030 @ 00050030

int FUN_00050030(int param_1)

{
  int iVar1;
  int iVar2;
  
  iVar1 = FUN_00041ecc(&stack0xfffffff0);
  iVar2 = (int)&stack0xfffffff0 - iVar1;
  if (iVar2 != 0) {
    __aeabi_memmove(param_1,iVar1,iVar2);
    param_1 = param_1 + iVar2;
  }
  return param_1;
}



### FUNC FUN_00050058 @ 00050058

byte * FUN_00050058(byte *param_1,byte *param_2,int param_3,byte param_4,uint param_5,uint param_6,
                   int param_7)

{
  byte *pbVar1;
  byte *pbVar2;
  int iVar3;
  uint uVar4;
  uint uVar5;
  uint uVar6;
  
  pbVar1 = (byte *)0x0;
  if (param_1 != param_2) {
    uVar5 = 0;
    uVar6 = (uint)(*param_1 == param_5 || *param_1 == param_6);
    pbVar2 = param_1 + 1;
    if (uVar6 == 0) {
      pbVar2 = param_1;
    }
    uVar4 = 0;
    pbVar1 = param_2;
    while( true ) {
      if (uVar4 < (uint)(*(int *)(param_3 + 0x10) - *(int *)(param_3 + 0x14))) {
        uVar5 = (uint)*(byte *)(*(int *)(param_3 + 0x14) + uVar4);
        uVar4 = uVar4 + 1;
      }
      if (((uVar5 == 0) || ((int)param_2 - (int)(pbVar2 + param_7) <= (int)uVar5)) ||
         (uVar5 == 0xff)) break;
      param_2 = param_2 + -uVar5;
      iVar3 = (int)(pbVar1 + 1) - (int)param_2;
      if (0 < iVar3) {
        __aeabi_memmove(pbVar1 + (2 - iVar3),param_2);
      }
      *param_2 = param_4;
      pbVar1 = pbVar1 + 1;
    }
    pbVar1 = pbVar1 + ((uVar6 + param_7) - (int)(pbVar2 + param_7));
  }
  return pbVar1;
}



### FUNC FUN_000500f4 @ 000500f4

void FUN_000500f4(byte *param_1,uint param_2,int param_3,undefined4 param_4,uint param_5,
                 uint param_6,int param_7)

{
  byte bVar1;
  byte *pbVar2;
  byte *pbVar3;
  byte *pbVar4;
  byte *pbVar5;
  uint uVar6;
  uint uVar7;
  uint uVar8;
  uint uVar9;
  uint uVar10;
  uint uVar11;
  byte *pbVar12;
  uint local_30;
  
  pbVar4 = param_1 + 0x118;
  pbVar2 = *(byte **)(param_1 + 0x118);
  if (param_2 <= (uint)(*(int *)(param_1 + 0x10) - (int)pbVar2)) {
    bVar1 = *pbVar2;
    uVar8 = 0;
    pbVar2 = pbVar2 + param_2;
    uVar9 = uVar8;
    while( true ) {
      if (uVar8 < (uint)(*(int *)(param_3 + 0x10) - *(int *)(param_3 + 0x14))) {
        uVar9 = (uint)*(byte *)(*(int *)(param_3 + 0x14) + uVar8);
        uVar8 = uVar8 + 1;
      }
      if (uVar9 == 0) break;
      pbVar3 = *(byte **)pbVar4;
      if (uVar9 == 0xff) {
        return;
      }
      if ((int)(pbVar2 + ((-param_7 - (uint)(bVar1 == param_5 || bVar1 == param_6)) - (int)pbVar3))
          <= (int)uVar9) {
        return;
      }
      pbVar2 = pbVar2 + -uVar9;
      pbVar12 = *(byte **)(param_1 + 0x10);
      if (pbVar12 == pbVar2) {
        pbVar5 = param_1 + 0x10;
        if (pbVar3 != param_1) {
          pbVar5 = *(byte **)param_1;
        }
        if ((int)pbVar5 - (int)pbVar12 == 1) {
          uVar6 = (int)pbVar12 - (int)pbVar3;
          if (uVar6 == 0xfffffffe) {
                    /* WARNING: Subroutine does not return */
            std::__stl_throw_length_error("basic_string");
          }
          uVar10 = uVar6;
          if (uVar6 < 2) {
            uVar10 = 1;
          }
          uVar11 = uVar6 + uVar10 + 1;
          local_30 = 0xfffffffe;
          uVar7 = 0xfffffffe;
          if (uVar6 <= uVar11) {
            uVar7 = uVar11;
          }
          if (uVar6 + uVar10 != -2) {
            local_30 = uVar7;
          }
          pbVar5 = param_1 + 0x14;
          if (0x80 < local_30 >> 1) {
            pbVar5 = (byte *)operator_new(local_30);
            pbVar12 = *(byte **)(param_1 + 0x10);
            pbVar3 = *(byte **)pbVar4;
          }
          pbVar2 = pbVar5;
          if (0 < (int)pbVar12 - (int)pbVar3) {
            pbVar12 = pbVar12 + (1 - (int)pbVar3);
            do {
              *pbVar2 = *pbVar3;
              pbVar12 = pbVar12 + -1;
              pbVar2 = pbVar2 + 1;
              pbVar3 = pbVar3 + 1;
            } while (1 < (int)pbVar12);
          }
          *pbVar2 = 0;
          pbVar3 = *(byte **)pbVar4;
          if (((pbVar3 != param_1) && (pbVar3 != (byte *)0x0)) && (param_1 + 0x14 != pbVar3)) {
            if ((uint)(*(int *)param_1 - (int)pbVar3) < 0x81) {
              std::__node_alloc::_M_deallocate(pbVar3,*(int *)param_1 - (int)pbVar3);
            }
            else {
              operator_delete(pbVar3);
            }
          }
          *(byte **)(param_1 + 0x10) = pbVar2;
          *(byte **)param_1 = pbVar5 + local_30;
          *(byte **)pbVar4 = pbVar5;
        }
        pbVar2[1] = 0;
        **(undefined1 **)(param_1 + 0x10) = (char)param_4;
        pbVar2 = *(byte **)(param_1 + 0x10);
        *(byte **)(param_1 + 0x10) = pbVar2 + 1;
      }
      else {
        pbVar2 = (byte *)FUN_00050418(param_1,pbVar2,param_4);
      }
    }
  }
  return;
}



### FUNC FUN_00050274 @ 00050274

int FUN_00050274(int *param_1,int *param_2,int param_3,int param_4,int param_5,int param_6,
                int param_7)

{
  int *piVar1;
  int iVar2;
  int *piVar3;
  uint uVar4;
  uint uVar5;
  uint uVar6;
  
  iVar2 = 0;
  if (param_1 != param_2) {
    uVar5 = 0;
    uVar6 = (uint)(*param_1 == param_5 || *param_1 == param_6);
    piVar3 = param_1 + 1;
    if (uVar6 == 0) {
      piVar3 = param_1;
    }
    uVar4 = 0;
    piVar1 = param_2;
    while( true ) {
      if (uVar4 < (uint)(*(int *)(param_3 + 0x10) - *(int *)(param_3 + 0x14))) {
        uVar5 = (uint)*(byte *)(*(int *)(param_3 + 0x14) + uVar4);
        uVar4 = uVar4 + 1;
      }
      if (((uVar5 == 0) || ((int)param_2 - (int)(piVar3 + param_7) >> 2 <= (int)uVar5)) ||
         (uVar5 == 0xff)) break;
      param_2 = param_2 + -uVar5;
      iVar2 = (int)(piVar1 + 1) - (int)param_2;
      if (0 < iVar2) {
        __aeabi_memmove((int)piVar1 + (8 - iVar2),param_2);
      }
      *param_2 = param_4;
      piVar1 = piVar1 + 1;
    }
    iVar2 = uVar6 + param_7 + ((int)piVar1 - (int)(piVar3 + param_7) >> 2);
  }
  return iVar2;
}



### FUNC FUN_0005031c @ 0005031c

void FUN_0005031c(int *param_1,uint param_2,int param_3,int param_4,int param_5,int param_6,
                 int param_7)

{
  int *piVar1;
  int *piVar2;
  uint uVar3;
  int *piVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  int iVar8;
  uint uVar9;
  
  piVar1 = (int *)param_1[0x112];
  if (param_2 <= (uint)(param_1[0x10] - (int)piVar1 >> 2)) {
    iVar8 = *piVar1;
    uVar7 = 0;
    piVar1 = piVar1 + param_2;
    uVar9 = 0;
    while( true ) {
      if (uVar9 < (uint)(*(int *)(param_3 + 0x10) - *(int *)(param_3 + 0x14))) {
        uVar7 = (uint)*(byte *)(*(int *)(param_3 + 0x14) + uVar9);
        uVar9 = uVar9 + 1;
      }
      if (uVar7 == 0) break;
      piVar2 = (int *)param_1[0x112];
      if (uVar7 == 0xff) {
        return;
      }
      if ((int)((-param_7 - (uint)(iVar8 == param_5 || iVar8 == param_6)) +
               ((int)piVar1 - (int)piVar2 >> 2)) <= (int)uVar7) {
        return;
      }
      piVar1 = piVar1 + -uVar7;
      piVar4 = (int *)param_1[0x10];
      if (piVar4 == piVar1) {
        if (piVar2 == param_1) {
          if ((int)piVar4 - (int)param_1 >> 2 == 0xf) goto LAB_000503d4;
        }
        else if (*param_1 - (int)piVar4 >> 2 == 1) {
LAB_000503d4:
          uVar3 = (int)piVar4 - (int)piVar2 >> 2;
          uVar5 = uVar3;
          if (uVar3 < 2) {
            uVar5 = 1;
          }
          uVar6 = uVar3 + uVar5 + 1;
          uVar5 = 0x3ffffffe;
          if (uVar3 <= uVar6) {
            uVar5 = uVar6;
          }
          uVar3 = 0x3ffffffe;
          if (uVar6 < 0x3fffffff) {
            uVar3 = uVar5;
          }
          FUN_000506a4(param_1,uVar3);
          piVar1 = (int *)param_1[0x10];
        }
        *piVar1 = param_4;
        piVar1[1] = 0;
        param_1[0x10] = (int)(piVar1 + 1);
      }
      else {
        piVar1 = (int *)FUN_00050548(param_1,piVar1,param_4);
      }
    }
  }
  return;
}



### FUNC FUN_00050418 @ 00050418

int * FUN_00050418(int *param_1,int *param_2,undefined1 param_3)

{
  int *piVar1;
  int *piVar2;
  int iVar3;
  uint uVar4;
  undefined1 *puVar5;
  uint uVar6;
  uint uVar7;
  uint uVar8;
  int *piVar9;
  int *piVar10;
  int *local_1c;
  
  piVar9 = (int *)param_1[0x46];
  piVar1 = param_1 + 0x46;
  if (piVar9 == param_1) {
    iVar3 = param_1[4];
    uVar6 = (int)param_1 + (0x10 - iVar3);
  }
  else {
    iVar3 = param_1[4];
    uVar6 = *param_1 - iVar3;
  }
  if (uVar6 < 2) {
    local_1c = param_1 + 4;
    uVar6 = iVar3 - (int)piVar9;
    if (uVar6 == 0xfffffffe) {
                    /* WARNING: Subroutine does not return */
      std::__stl_throw_length_error("basic_string");
    }
    uVar7 = uVar6;
    if (uVar6 < 2) {
      uVar7 = 1;
    }
    uVar8 = uVar6 + uVar7 + 1;
    uVar4 = 0xfffffffe;
    if (uVar6 <= uVar8) {
      uVar4 = uVar8;
    }
    uVar8 = 0xfffffffe;
    if (uVar6 + uVar7 != -2) {
      uVar8 = uVar4;
    }
    if (uVar8 >> 1 < 0x81) {
      piVar2 = param_1 + 5;
    }
    else {
      piVar2 = (int *)operator_new(uVar8);
      piVar9 = (int *)*piVar1;
    }
    piVar10 = piVar2;
    if (0 < (int)param_2 - (int)piVar9) {
      puVar5 = (undefined1 *)((int)param_2 + (1 - (int)piVar9));
      do {
        *(char *)piVar10 = (char)*piVar9;
        puVar5 = puVar5 + -1;
        piVar10 = (int *)((int)piVar10 + 1);
        piVar9 = (int *)((int)piVar9 + 1);
      } while (1 < (int)puVar5);
    }
    *(undefined1 *)piVar10 = param_3;
    puVar5 = (undefined1 *)((int)piVar10 + 1);
    if (0 < *local_1c - (int)param_2) {
      iVar3 = (*local_1c + 1) - (int)param_2;
      do {
        *puVar5 = (char)*param_2;
        iVar3 = iVar3 + -1;
        puVar5 = puVar5 + 1;
        param_2 = (int *)((int)param_2 + 1);
      } while (1 < iVar3);
    }
    *puVar5 = 0;
    piVar9 = (int *)*piVar1;
    if (((piVar9 != param_1) && (piVar9 != (int *)0x0)) && (param_1 + 5 != piVar9)) {
      if ((uint)(*param_1 - (int)piVar9) < 0x81) {
        std::__node_alloc::_M_deallocate(piVar9,*param_1 - (int)piVar9);
      }
      else {
        operator_delete(piVar9);
      }
    }
    param_1[4] = (int)puVar5;
    *param_1 = (int)((int)piVar2 + uVar8);
    *piVar1 = (int)piVar2;
  }
  else {
    local_1c = param_1 + 4;
    *(undefined1 *)(iVar3 + 1) = 0;
    if ((int *)*local_1c != param_2) {
      __aeabi_memmove((undefined1 *)((int)param_2 + 1),param_2);
    }
    *(undefined1 *)param_2 = param_3;
    *local_1c = *local_1c + 1;
    piVar10 = param_2;
  }
  return piVar10;
}



### FUNC FUN_00050548 @ 00050548

wchar_t * FUN_00050548(wchar_t *param_1,wchar_t *param_2,wchar_t param_3)

{
  wchar_t *pwVar1;
  wchar_t *pwVar2;
  undefined4 uVar3;
  wchar_t wVar4;
  int iVar5;
  uint uVar6;
  uint uVar7;
  wchar_t *pwVar8;
  wchar_t *pwVar9;
  uint uVar10;
  wchar_t *pwVar11;
  uint local_18;
  
  pwVar1 = (wchar_t *)param_1[0x112];
  if (pwVar1 == param_1) {
    wVar4 = param_1[0x10];
    uVar6 = 0x10 - (wVar4 - (int)param_1 >> 2);
  }
  else {
    wVar4 = param_1[0x10];
    uVar6 = *param_1 - wVar4 >> 2;
  }
  pwVar9 = param_1 + 0x10;
  if (uVar6 < 2) {
    uVar7 = wVar4 - (int)pwVar1 >> 2;
    uVar6 = uVar7;
    if (uVar7 < 2) {
      uVar6 = 1;
    }
    uVar10 = uVar7 + uVar6 + 1;
    uVar6 = 0x3ffffffe;
    if (uVar7 <= uVar10) {
      uVar6 = uVar10;
    }
    uVar7 = 0x3ffffffe;
    if (uVar10 < 0x3fffffff) {
      uVar7 = uVar6;
    }
    if (uVar7 >> 1 < 0x81) {
      pwVar2 = param_1 + 0x11;
    }
    else {
      if (0x3fffffff < uVar7) {
        FUN_00030824(4);
        uVar3 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
        FUN_000309e0(uVar3,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
      }
      local_18 = uVar7 << 2;
      if (local_18 < 0x81) {
        pwVar2 = (wchar_t *)std::__node_alloc::_M_allocate(&local_18);
      }
      else {
        pwVar2 = (wchar_t *)operator_new(local_18);
      }
      pwVar1 = (wchar_t *)param_1[0x112];
    }
    pwVar11 = pwVar2;
    if (0 < (int)param_2 - (int)pwVar1) {
      iVar5 = ((uint)((int)param_2 - (int)pwVar1) >> 2) + 1;
      pwVar8 = pwVar1;
      do {
        wVar4 = *pwVar8;
        pwVar8 = pwVar8 + 1;
        *pwVar11 = wVar4;
        pwVar11 = pwVar11 + 1;
        iVar5 = iVar5 + -1;
      } while (1 < iVar5);
    }
    *pwVar11 = param_3;
    pwVar8 = pwVar11 + 1;
    if (0 < *pwVar9 - (int)param_2) {
      iVar5 = ((uint)(*pwVar9 - (int)param_2) >> 2) + 1;
      do {
        wVar4 = *param_2;
        param_2 = param_2 + 1;
        *pwVar8 = wVar4;
        pwVar8 = pwVar8 + 1;
        iVar5 = iVar5 + -1;
      } while (1 < iVar5);
    }
    *pwVar8 = L'\0';
    if (((pwVar1 != param_1) && (pwVar1 != (wchar_t *)0x0)) && (param_1 + 0x11 != pwVar1)) {
      if ((uint)(*param_1 - (int)pwVar1) < 0x81) {
        std::__node_alloc::_M_deallocate(pwVar1,*param_1 - (int)pwVar1);
      }
      else {
        operator_delete(pwVar1);
      }
    }
    param_1[0x10] = (wchar_t)pwVar8;
    *param_1 = (wchar_t)(pwVar2 + uVar7);
    param_1[0x112] = (wchar_t)pwVar2;
  }
  else {
    *(undefined4 *)(wVar4 + L'\x04') = 0;
    wmemmove(param_2 + 1,param_2,wVar4 - (int)param_2 >> 2);
    *param_2 = param_3;
    *pwVar9 = *pwVar9 + L'\x04';
    pwVar11 = param_2;
  }
  return pwVar11;
}



### FUNC FUN_000506a4 @ 000506a4

void FUN_000506a4(int *param_1,uint param_2)

{
  int *piVar1;
  int *piVar2;
  undefined4 uVar3;
  int iVar4;
  int *piVar5;
  int iVar6;
  int *piVar7;
  uint local_18;
  
  if (param_2 >> 1 < 0x81) {
    piVar1 = param_1 + 0x11;
  }
  else {
    if (param_2 >> 0x1e != 0) {
      FUN_00030824(4);
      uVar3 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
      FUN_000309e0(uVar3,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
    }
    local_18 = param_2 << 2;
    if (local_18 < 0x81) {
      piVar1 = (int *)std::__node_alloc::_M_allocate(&local_18);
    }
    else {
      piVar1 = (int *)operator_new(local_18);
    }
  }
  piVar2 = (int *)param_1[0x112];
  piVar7 = piVar1;
  if (0 < param_1[0x10] - (int)piVar2) {
    iVar4 = ((uint)(param_1[0x10] - (int)piVar2) >> 2) + 1;
    piVar5 = piVar2;
    do {
      iVar6 = *piVar5;
      piVar5 = piVar5 + 1;
      *piVar7 = iVar6;
      piVar7 = piVar7 + 1;
      iVar4 = iVar4 + -1;
    } while (1 < iVar4);
  }
  *piVar7 = 0;
  if (((piVar2 != param_1) && (piVar2 != (int *)0x0)) && (param_1 + 0x11 != piVar2)) {
    if ((uint)(*param_1 - (int)piVar2) < 0x81) {
      std::__node_alloc::_M_deallocate(piVar2,*param_1 - (int)piVar2);
    }
    else {
      operator_delete(piVar2);
    }
  }
  param_1[0x10] = (int)piVar7;
  *param_1 = (int)(piVar1 + param_2);
  param_1[0x112] = (int)piVar1;
  return;
}



### FUNC _Initialize_get_float @ 00050758

/* std::priv::_Initialize_get_float(std::ctype<wchar_t> const&, wchar_t&, wchar_t&, wchar_t&,
   wchar_t&, wchar_t*) */

void std::priv::_Initialize_get_float
               (ctype *param_1,wchar_t *param_2,wchar_t *param_3,wchar_t *param_4,wchar_t *param_5,
               wchar_t *param_6)

{
  wchar_t wVar1;
  undefined4 local_20;
  undefined4 local_1c;
  undefined2 local_18;
  undefined1 local_16 [2];
  
  local_16[0] = 0;
  local_18 = 0x3938;
  local_1c = 0x37363534;
  local_20 = 0x33323130;
  wVar1 = (**(code **)(*(int *)param_1 + 0x28))(param_1,0x2b);
  *param_2 = wVar1;
  wVar1 = (**(code **)(*(int *)param_1 + 0x28))(param_1,0x2d);
  *param_3 = wVar1;
  wVar1 = (**(code **)(*(int *)param_1 + 0x28))(param_1,0x65);
  *param_4 = wVar1;
  wVar1 = (**(code **)(*(int *)param_1 + 0x28))(param_1,0x45);
  *param_5 = wVar1;
  (**(code **)(*(int *)param_1 + 0x2c))(param_1,&local_20,local_16,param_6);
  return;
}



### FUNC __string_to_float @ 000507d0

/* std::priv::__string_to_float(std::priv::__basic_iostring<char> const&, float&) */

void std::priv::__string_to_float(__basic_iostring *param_1,float *param_2)

{
  float fVar1;
  
  FUN_000507e8(*(undefined4 *)(param_1 + 0x118));
  fVar1 = (float)__truncdfsf2();
  *param_2 = fVar1;
  return;
}



### FUNC FUN_000507e8 @ 000507e8

undefined8 FUN_000507e8(byte *param_1)

{
  bool bVar1;
  bool bVar2;
  undefined8 uVar3;
  longlong lVar4;
  bool bVar5;
  uint uVar6;
  int iVar7;
  byte *pbVar8;
  byte *pbVar9;
  uint uVar10;
  int iVar11;
  uint uVar12;
  uint uVar13;
  uint uVar14;
  uint uVar15;
  uint uVar16;
  longlong lVar17;
  undefined8 uVar18;
  uint local_4c;
  uint local_44;
  uint local_40;
  int local_3c;
  byte local_38 [20];
  int local_24;
  undefined8 local_20;
  
  lVar17 = CONCAT44(local_20._4_4_,(uint)local_20);
  uVar10 = (uint)*param_1;
  pbVar8 = param_1 + 1;
  bVar5 = false;
  if (uVar10 != 0x2b) {
    bVar2 = false;
    bVar5 = true;
    if (uVar10 != 0x2d) goto LAB_00050808;
  }
  bVar2 = bVar5;
  uVar10 = (uint)param_1[1];
  pbVar8 = param_1 + 2;
LAB_00050808:
  iVar11 = 0;
  local_3c = 0;
  uVar15 = 0;
  do {
    pbVar9 = pbVar8 + 1;
    uVar10 = uVar10 - 0x30;
    if (uVar10 < 10) {
      uVar6 = uVar15;
      if (iVar11 == 0x11) {
        local_3c = local_3c + (uVar15 ^ 1);
        iVar11 = 0x11;
      }
      else {
        iVar7 = 0;
        if (iVar11 != 0 || uVar10 != 0) {
          local_38[iVar11] = (byte)uVar10;
          iVar7 = iVar11 + 1;
        }
        local_3c = local_3c - uVar15;
        iVar11 = iVar7;
      }
    }
    else {
      uVar6 = 1;
      if ((uVar10 != 0xfffffffe) || (uVar15 != 0)) break;
    }
    uVar10 = (uint)*pbVar8;
    uVar15 = uVar6;
    pbVar8 = pbVar9;
  } while( true );
  if (iVar11 == 0) {
    return 0;
  }
  local_40 = 0x20;
  if ((uVar10 | 0x20) == 0x35) {
    uVar10 = (uint)*pbVar8;
    bVar5 = false;
    if ((uVar10 == 0x20) || (uVar10 == 0x2b)) {
LAB_0005088e:
      bVar1 = bVar5;
      uVar10 = (uint)*pbVar9;
      pbVar9 = pbVar8 + 2;
    }
    else {
      bVar1 = false;
      bVar5 = true;
      if (uVar10 == 0x2d) goto LAB_0005088e;
    }
    uVar10 = uVar10 - 0x30;
    if (uVar10 < 10) {
      iVar7 = 0;
      do {
        iVar7 = iVar7 * 10 + uVar10;
        uVar10 = *pbVar9 - 0x30;
        pbVar9 = pbVar9 + 1;
      } while (uVar10 < 10);
      if (bVar1) {
        iVar7 = -iVar7;
      }
      local_3c = iVar7 + local_3c;
    }
  }
  uVar10 = 0;
  uVar15 = 0;
  if (-0x133 < local_3c + iVar11) {
    uVar15 = 0x7ff00000;
    uVar10 = 0;
    lVar17 = CONCAT44(local_20._4_4_,(uint)local_20);
    if (local_3c + iVar11 < 0x136) {
      lVar17 = 0;
      lVar4 = 0;
      if (0 < iVar11) {
        pbVar8 = local_38;
        do {
          local_20._4_4_ = (uint)((ulonglong)lVar4 >> 0x20);
          local_20._0_4_ = (uint)lVar4;
          lVar17 = __muldi3((uint)local_20,local_20._4_4_,10,0);
          local_20 = lVar4;
          local_20 = lVar17;
          lVar4 = lVar17 + (ulonglong)*pbVar8;
          uVar10 = (uint)lVar4;
          uVar15 = (uint)((ulonglong)lVar4 >> 0x20);
          pbVar8 = pbVar8 + 1;
        } while (pbVar8 < local_38 + iVar11);
        lVar17 = lVar4;
        if (lVar4 != 0) {
          if (uVar15 == 0) {
            local_40 = 0;
          }
          uVar13 = local_40 | 0x10;
          uVar16 = uVar13 - 0x20;
          local_4c = 0;
          uVar6 = 0;
          if ((int)uVar16 < 0) {
            uVar6 = uVar15 >> (local_40 | 0x10);
          }
          uVar14 = uVar15 >> (uVar16 & 0xff);
          if ((int)uVar16 < 0) {
            uVar14 = uVar15 << (0x20 - uVar13 & 0xff) | uVar10 >> (local_40 | 0x10);
          }
          if (uVar14 != 0 || uVar6 != 0) {
            local_40 = uVar13;
          }
          uVar13 = local_40 | 8;
          uVar16 = uVar13 - 0x20;
          uVar6 = 0;
          if ((int)uVar16 < 0) {
            uVar6 = uVar15 >> (local_40 | 8);
          }
          uVar14 = uVar15 >> (uVar16 & 0xff);
          if ((int)uVar16 < 0) {
            uVar14 = uVar15 << (0x20 - uVar13 & 0xff) | uVar10 >> (local_40 | 8);
          }
          if (uVar14 != 0 || uVar6 != 0) {
            local_40 = uVar13;
          }
          uVar13 = local_40 | 4;
          uVar16 = uVar13 - 0x20;
          uVar6 = 0;
          if ((int)uVar16 < 0) {
            uVar6 = uVar15 >> (local_40 | 4);
          }
          uVar14 = uVar15 >> (uVar16 & 0xff);
          if ((int)uVar16 < 0) {
            uVar14 = uVar15 << (0x20 - uVar13 & 0xff) | uVar10 >> (local_40 | 4);
          }
          if (uVar14 != 0 || uVar6 != 0) {
            local_40 = uVar13;
          }
          uVar13 = local_40 + 2;
          uVar16 = local_40 - 0x1e;
          uVar6 = 0;
          if ((int)uVar16 < 0) {
            uVar6 = uVar15 >> uVar13;
          }
          uVar14 = uVar15 >> (uVar16 & 0xff);
          if ((int)uVar16 < 0) {
            uVar14 = uVar10 >> uVar13 | uVar15 << (0x1e - local_40 & 0xff);
          }
          if (uVar14 != 0 || uVar6 != 0) {
            local_40 = uVar13;
          }
          uVar13 = local_40 + 1;
          uVar16 = local_40 - 0x1f;
          uVar6 = 0;
          if ((int)uVar16 < 0) {
            uVar6 = uVar15 >> uVar13;
          }
          uVar14 = uVar15 >> (uVar16 & 0xff);
          if ((int)uVar16 < 0) {
            uVar14 = uVar10 >> uVar13 | uVar15 << (0x1f - local_40 & 0xff);
          }
          if (uVar14 != 0 || uVar6 != 0) {
            local_40 = uVar13;
          }
          uVar6 = local_40 - 0x20;
          local_44 = 0;
          if ((int)uVar6 < 0) {
            local_44 = uVar15 >> local_40;
          }
          uVar13 = uVar15 >> (uVar6 & 0xff);
          if ((int)uVar6 < 0) {
            uVar13 = uVar15 << (0x20 - local_40 & 0xff) | uVar10 >> local_40;
          }
          uVar6 = local_40 + 1;
          if (uVar13 == 0 && local_44 == 0) {
            uVar6 = local_40;
          }
          uVar13 = 0x20 - uVar6;
          uVar16 = 0x40 - uVar6;
          if ((int)uVar13 < 0) {
            local_4c = uVar10 << (uVar16 & 0xff);
          }
          local_20._0_4_ = local_4c;
          local_20._4_4_ = uVar10 << (uVar13 & 0xff);
          if ((int)uVar13 < 0) {
            local_20._4_4_ = uVar10 >> (0x20 - uVar16 & 0xff) | uVar15 << (uVar16 & 0xff);
          }
          FUN_00050d84(&local_20,local_3c,&local_24);
          local_24 = local_24 + uVar6;
          if (-0x3fe < local_24) {
            uVar6 = local_20._4_4_ >> 0xb;
            uVar15 = (uint)local_20 >> 0xb | local_20._4_4_ << 0x15;
            uVar10 = uVar15;
            local_20._4_4_ = uVar6;
            if ((((uint)local_20 & 0x400) != 0) &&
               (((uint)local_20 >> 0xb & 1) != 0 || ((uint)local_20 & 0x3ff) != 0)) {
              local_20._4_4_ = uVar6 + (0xfffffffe < uVar15);
              uVar10 = uVar15 + 1;
              if ((local_20._4_4_ & 0x200000) != 0) {
                local_24 = local_24 + 1;
                uVar10 = local_20._4_4_ * -0x80000000 | uVar15 + 1 >> 1;
                local_20._4_4_ = local_20._4_4_ >> 1;
              }
            }
            local_20._0_4_ = uVar10;
            uVar15 = 0x7ff00000;
            uVar10 = 0;
            lVar17 = CONCAT44(local_20._4_4_,(uint)local_20);
            if (local_24 < 0x401) {
              uVar15 = (local_24 + 0x3fe) * 0x100000 & 0x7ff00000U | local_20._4_4_ & 0x800fffff;
              uVar10 = (uint)local_20;
              lVar17 = CONCAT44(uVar15,(uint)local_20);
            }
            goto LAB_00050ae0;
          }
          if (-0x434 < local_24) {
            uVar6 = -local_24 - 0x3f2;
            if ((int)uVar6 < 0x41) {
              if (uVar6 == 0x40) {
                uVar12 = local_20._4_4_ >> 0x1f;
                uVar13 = 0x7fffffff;
                uVar10 = 0;
                uVar15 = 0;
              }
              else {
                uVar16 = -local_24 - 0x412;
                uVar13 = 1 << (uVar16 & 0xff);
                if ((int)uVar16 < 0) {
                  uVar13 = 1 >> (0x20 - uVar6 & 0xff);
                }
                uVar14 = 0;
                if ((int)uVar16 < 0) {
                  uVar14 = 1 << (uVar6 & 0xff);
                }
                uVar13 = uVar13 - (uVar14 < 2);
                uVar10 = local_20._4_4_ >> (uVar16 & 0xff);
                if ((int)uVar16 < 0) {
                  uVar10 = local_20._4_4_ << (0x20 - uVar6 & 0xff) |
                           (uint)local_20 >> (uVar6 & 0xff);
                }
                uVar12 = ~uVar10 & 1;
                uVar15 = 0;
                if ((int)uVar16 < 0) {
                  uVar15 = local_20._4_4_ >> (uVar6 & 0xff);
                }
                local_20._0_4_ = (uint)local_20 & uVar14 - 2;
              }
              lVar17 = CONCAT44(uVar15,uVar10);
              if ((uVar12 != 0) &&
                 (lVar17 = CONCAT44(uVar15,uVar10),
                 ((uint)local_20 != 0 || (uVar10 & 1) != 0) || (local_20._4_4_ & uVar13) != 0)) {
                uVar6 = uVar10 + 1;
                uVar15 = uVar15 + (0xfffffffe < uVar10);
                uVar10 = uVar6;
                lVar17 = CONCAT44(uVar15,uVar6);
              }
              goto LAB_00050ae0;
            }
          }
          lVar17 = 0;
        }
      }
      uVar15 = 0;
      uVar10 = uVar15;
    }
  }
LAB_00050ae0:
  local_20 = lVar17;
  uVar18 = __subdf3(0,0x80000000,uVar10,uVar15);
  uVar3 = CONCAT44(uVar15,uVar10);
  if (bVar2) {
    uVar3 = uVar18;
  }
  return uVar3;
}



### FUNC __string_to_float @ 00050c2c

/* std::priv::__string_to_float(std::priv::__basic_iostring<char> const&, double&) */

void std::priv::__string_to_float(__basic_iostring *param_1,double *param_2)

{
  double dVar1;
  
  dVar1 = (double)FUN_000507e8(*(undefined4 *)(param_1 + 0x118));
  *param_2 = dVar1;
  return;
}



### FUNC __string_to_float @ 00050c40

/* std::priv::__string_to_float(std::priv::__basic_iostring<char> const&, long double&) */

void std::priv::__string_to_float(__basic_iostring *param_1,longdouble *param_2)

{
  longdouble lVar1;
  
  lVar1 = (longdouble)FUN_00050c54(*(undefined4 *)(param_1 + 0x118));
  *param_2 = lVar1;
  return;
}



### FUNC FUN_00050c54 @ 00050c54

undefined8 FUN_00050c54(byte *param_1)

{
  bool bVar1;
  bool bVar2;
  bool bVar3;
  uint uVar4;
  byte *pbVar5;
  int iVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  byte *pbVar10;
  uint uVar11;
  uint uVar12;
  undefined8 uVar13;
  undefined8 uVar14;
  undefined1 local_24 [16];
  
  uVar11 = (uint)*param_1;
  pbVar5 = param_1 + 1;
  bVar3 = false;
  if (uVar11 != 0x2b) {
    bVar1 = false;
    bVar3 = true;
    if (uVar11 != 0x2d) goto LAB_00050c78;
  }
  bVar1 = bVar3;
  uVar11 = (uint)param_1[1];
  pbVar5 = param_1 + 2;
LAB_00050c78:
  iVar6 = 0;
  iVar9 = 0;
  uVar12 = 0;
  do {
    pbVar10 = pbVar5 + 1;
    uVar11 = uVar11 - 0x30;
    if (uVar11 < 10) {
      uVar4 = uVar12;
      if (iVar6 == 0xf) {
        iVar9 = iVar9 + (uVar12 ^ 1);
        iVar6 = 0xf;
      }
      else {
        iVar7 = 0;
        if (iVar6 != 0 || uVar11 != 0) {
          local_24[iVar6] = (char)uVar11;
          iVar7 = iVar6 + 1;
        }
        iVar9 = iVar9 - uVar12;
        iVar6 = iVar7;
      }
    }
    else {
      uVar4 = 1;
      if ((uVar11 != 0xfffffffe) || (uVar12 != 0)) {
        if (iVar6 == 0) {
          uVar14 = 0;
        }
        else {
          if ((uVar11 | 0x20) == 0x35) {
            uVar11 = (uint)*pbVar5;
            bVar3 = false;
            if (((uVar11 == 0x20) || (uVar11 == 0x2b)) ||
               (bVar2 = false, bVar3 = true, uVar11 == 0x2d)) {
              bVar2 = bVar3;
              uVar11 = (uint)*pbVar10;
              pbVar10 = pbVar5 + 2;
            }
            uVar11 = uVar11 - 0x30;
            if (uVar11 < 10) {
              iVar7 = 0;
              do {
                iVar7 = iVar7 * 10 + uVar11;
                uVar11 = *pbVar10 - 0x30;
                pbVar10 = pbVar10 + 1;
              } while (uVar11 < 10);
              iVar8 = -iVar7;
              if (!bVar2) {
                iVar8 = iVar7;
              }
              iVar9 = iVar8 + iVar9;
            }
          }
          uVar14 = 0;
          if (-0x133 < iVar9 + iVar6) {
            uVar13 = 0x7ff0000000000000;
            if (iVar9 + iVar6 < 0x136) {
              uVar13 = FUN_00051158(local_24,iVar6,iVar9);
            }
            uVar14 = __subdf3(0,0x80000000,(int)uVar13,(int)((ulonglong)uVar13 >> 0x20));
            if (!bVar1) {
              uVar14 = uVar13;
            }
          }
        }
        return uVar14;
      }
    }
    uVar11 = (uint)*pbVar5;
    uVar12 = uVar4;
    pbVar5 = pbVar10;
  } while( true );
}



### FUNC FUN_00050d84 @ 00050d84

/* WARNING: Removing unreachable block (ram,0x00051064) */
/* WARNING: Removing unreachable block (ram,0x00050eb6) */
/* WARNING: Removing unreachable block (ram,0x00050ef8) */
/* WARNING: Removing unreachable block (ram,0x0005109c) */

void FUN_00050d84(uint *param_1,int param_2,int *param_3)

{
  int iVar1;
  uint uVar2;
  int iVar3;
  int iVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  undefined4 uVar8;
  uint uVar9;
  int iVar10;
  uint uVar11;
  ulonglong uVar12;
  longlong lVar13;
  undefined8 uVar14;
  int local_64;
  int local_50;
  int local_4c;
  uint local_48;
  uint local_2c;
  uint local_24;
  uint local_20;
  uint local_1c;
  
  *param_3 = 0;
  if (param_2 == 0) {
    return;
  }
  local_48 = 0x80000000;
  if (param_2 < 1) {
    iVar1 = param_2;
    if (param_2 < -0x1b) {
      iVar1 = -0x1c;
    }
    iVar1 = __udivsi3((iVar1 + 0x1b) - param_2,0x1c);
    local_64 = iVar1 * 0x1c + param_2 + 0x1c;
    local_4c = 0x24;
    local_50 = 0xd;
LAB_00050e1c:
    local_1c = *param_1;
    local_24 = param_1[1];
    iVar1 = iVar1 + 1;
    iVar10 = 0;
    do {
      iVar3 = local_50;
      if (iVar1 <= local_50) {
        iVar3 = iVar1;
      }
      iVar4 = (iVar3 + local_4c) * 8;
      uVar8 = *(undefined4 *)(&DAT_000662b0 + iVar4);
      uVar12 = __muldi3(uVar8,0,local_1c,0);
      local_20 = (uint)uVar12;
      lVar13 = __muldi3(uVar8,0,local_24,0);
      uVar12 = lVar13 + (uVar12 >> 0x20);
      uVar9 = (uint)(uVar12 >> 0x20);
      uVar8 = *(undefined4 *)(&DAT_000662b4 + iVar4);
      lVar13 = __muldi3(uVar8,0,local_1c,0);
      lVar13 = lVar13 + (uVar12 & 0xffffffff);
      local_2c = (uint)lVar13;
      uVar2 = (uint)((ulonglong)lVar13 >> 0x20);
      uVar14 = __muldi3(uVar8,0,local_24,0);
      uVar7 = uVar9 + (uint)uVar14;
      uVar6 = uVar7 + uVar2;
      uVar7 = (int)((ulonglong)uVar14 >> 0x20) + (uint)CARRY4(uVar9,(uint)uVar14) +
              (uint)CARRY4(uVar7,uVar2);
      iVar1 = iVar1 - iVar3;
      if (uVar7 < 0x80000000) {
        if ((uVar6 != 0xffffffff || uVar7 != 0x7fffffff) || (local_2c < 0xc0000000)) {
          uVar9 = uVar6 * 2 | local_2c >> 0x1f;
          uVar7 = uVar7 * 2 | uVar6 >> 0x1f;
          *param_1 = uVar9;
          param_1[1] = uVar7;
          local_2c = local_2c * 2 | local_20 >> 0x1f;
          local_20 = local_20 << 1;
          iVar4 = 1;
          uVar6 = uVar9;
          goto LAB_00050f50;
        }
        iVar4 = 0;
        *param_1 = 0;
        param_1[1] = 0x80000000;
        local_1c = 0;
        uVar9 = local_48;
        uVar2 = local_1c;
      }
      else {
        *param_1 = uVar6;
        param_1[1] = uVar7;
        iVar4 = 0;
LAB_00050f50:
        uVar9 = uVar7;
        uVar2 = uVar6;
        if ((int)local_2c < 0) {
          local_1c = 1;
          if ((local_20 != 0 || local_2c != 0x80000000) || ((uVar6 & 1) != 0)) {
            uVar2 = uVar6 + 1;
            *param_1 = uVar2;
            local_24 = 0;
            uVar9 = uVar7 + (0xfffffffe < uVar6);
            param_1[1] = uVar9;
            if (uVar2 == 0 && uVar9 == 0) {
              *param_1 = uVar6 + 2;
              param_1[1] = uVar7 + (0xfffffffd < uVar6);
              uVar9 = local_24;
              uVar2 = local_1c;
            }
          }
        }
      }
      local_1c = uVar2;
      local_24 = uVar9;
      iVar10 = (*(short *)(&DAT_00066530 + (iVar3 + local_4c) * 2) - iVar4) + iVar10;
    } while (iVar1 != 0);
    *param_3 = iVar10;
    if (local_64 == 0) {
      return;
    }
  }
  else {
    iVar10 = 0;
    local_64 = param_2;
    if (0x1b < param_2) {
      iVar1 = -2 - param_2;
      if (-2 - param_2 < -0x37) {
        iVar1 = -0x38;
      }
      iVar1 = __udivsi3(iVar1 + param_2 + 0x1d,0x1c);
      local_64 = param_2 + iVar1 * -0x1c + -0x1b;
      local_4c = 0x19;
      local_50 = 0xb;
      goto LAB_00050e1c;
    }
  }
  uVar6 = *param_1;
  iVar1 = (local_64 + -1) * 8;
  uVar8 = *(undefined4 *)(&DAT_000662b0 + iVar1);
  uVar12 = __muldi3(uVar8,0,uVar6,0);
  uVar9 = (uint)uVar12;
  uVar7 = param_1[1];
  lVar13 = __muldi3(uVar8,0,uVar7,0);
  uVar12 = lVar13 + (uVar12 >> 0x20);
  uVar5 = (uint)(uVar12 >> 0x20);
  uVar8 = *(undefined4 *)(&DAT_000662b4 + iVar1);
  lVar13 = __muldi3(uVar8,0,uVar6,0);
  lVar13 = lVar13 + (uVar12 & 0xffffffff);
  uVar6 = (uint)lVar13;
  uVar11 = (uint)((ulonglong)lVar13 >> 0x20);
  uVar14 = __muldi3(uVar8,0,uVar7,0);
  uVar7 = uVar5 + (uint)uVar14;
  uVar2 = uVar7 + uVar11;
  uVar7 = (int)((ulonglong)uVar14 >> 0x20) + (uint)CARRY4(uVar5,(uint)uVar14) +
          (uint)CARRY4(uVar7,uVar11);
  if (uVar7 < 0x80000000) {
    if ((uVar2 == 0xffffffff && uVar7 == 0x7fffffff) && (0xbfffffff < uVar6)) {
      iVar1 = 0;
      *param_1 = 0;
      param_1[1] = 0x80000000;
      goto LAB_00051122;
    }
    uVar5 = uVar2 * 2 | uVar6 >> 0x1f;
    uVar7 = uVar7 * 2 | uVar2 >> 0x1f;
    *param_1 = uVar5;
    param_1[1] = uVar7;
    uVar6 = uVar6 * 2 | uVar9 >> 0x1f;
    uVar9 = uVar9 << 1;
    iVar1 = 1;
  }
  else {
    *param_1 = uVar2;
    param_1[1] = uVar7;
    iVar1 = 0;
    uVar5 = uVar2;
  }
  if (((int)uVar6 < 0) && ((uVar9 != 0 || uVar6 != 0x80000000 || ((uVar5 & 1) != 0)))) {
    *param_1 = uVar5 + 1;
    uVar6 = uVar7 + (0xfffffffe < uVar5);
    param_1[1] = uVar6;
    if (uVar6 == 0 && uVar5 + 1 == 0) {
      *param_1 = uVar5 + 2;
      param_1[1] = uVar7 + (0xfffffffd < uVar5);
    }
  }
LAB_00051122:
  *param_3 = (*(short *)(&DAT_00066530 + (local_64 + -1) * 2) - iVar1) + iVar10;
  return;
}



### FUNC FUN_00051158 @ 00051158

undefined8 FUN_00051158(byte *param_1,int param_2,undefined4 param_3)

{
  longlong lVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  byte *pbVar6;
  uint uVar7;
  uint uVar8;
  uint uVar9;
  bool bVar10;
  longlong lVar11;
  uint uStack_3c;
  uint local_2c;
  int local_24;
  undefined8 local_20;
  
  lVar1 = 0;
  pbVar6 = param_1 + param_2;
  if (0 < param_2) {
    do {
      local_20._4_4_ = (uint)((ulonglong)lVar1 >> 0x20);
      local_20._0_4_ = (uint)lVar1;
      lVar11 = __muldi3((uint)local_20,local_20._4_4_,10,0);
      local_20 = lVar1;
      lVar1 = lVar11 + (ulonglong)*param_1;
      uVar2 = (uint)lVar1;
      uVar3 = (uint)((ulonglong)lVar1 >> 0x20);
      param_1 = param_1 + 1;
    } while (param_1 < pbVar6);
    if (lVar1 != 0) {
      uVar5 = 0x20;
      if (uVar3 == 0) {
        uVar5 = 0;
      }
      uVar7 = uVar5 | 0x10;
      uVar9 = uVar7 - 0x20;
      local_2c = 0;
      uVar8 = 0;
      if ((int)uVar9 < 0) {
        uVar8 = uVar3 >> (uVar5 | 0x10);
      }
      uVar4 = uVar3 >> (uVar9 & 0xff);
      if ((int)uVar9 < 0) {
        uVar4 = uVar3 << (0x20 - uVar7 & 0xff) | uVar2 >> (uVar5 | 0x10);
      }
      if (uVar4 != 0 || uVar8 != 0) {
        uVar5 = uVar7;
      }
      uVar7 = uVar5 | 8;
      uVar9 = uVar7 - 0x20;
      uVar8 = 0;
      if ((int)uVar9 < 0) {
        uVar8 = uVar3 >> (uVar5 | 8);
      }
      uVar4 = uVar3 >> (uVar9 & 0xff);
      if ((int)uVar9 < 0) {
        uVar4 = uVar3 << (0x20 - uVar7 & 0xff) | uVar2 >> (uVar5 | 8);
      }
      if (uVar4 != 0 || uVar8 != 0) {
        uVar5 = uVar7;
      }
      uVar7 = uVar5 | 4;
      uVar9 = uVar7 - 0x20;
      uVar8 = 0;
      if ((int)uVar9 < 0) {
        uVar8 = uVar3 >> (uVar5 | 4);
      }
      uVar4 = uVar3 >> (uVar9 & 0xff);
      if ((int)uVar9 < 0) {
        uVar4 = uVar3 << (0x20 - uVar7 & 0xff) | uVar2 >> (uVar5 | 4);
      }
      if (uVar4 != 0 || uVar8 != 0) {
        uVar5 = uVar7;
      }
      uVar7 = uVar5 + 2;
      uVar9 = uVar5 - 0x1e;
      uVar8 = 0;
      if ((int)uVar9 < 0) {
        uVar8 = uVar3 >> uVar7;
      }
      uVar4 = uVar3 >> (uVar9 & 0xff);
      if ((int)uVar9 < 0) {
        uVar4 = uVar2 >> uVar7 | uVar3 << (0x1e - uVar5 & 0xff);
      }
      if (uVar4 != 0 || uVar8 != 0) {
        uVar5 = uVar7;
      }
      uVar7 = uVar5 + 1;
      uVar9 = uVar5 - 0x1f;
      uVar8 = 0;
      if ((int)uVar9 < 0) {
        uVar8 = uVar3 >> uVar7;
      }
      uVar4 = uVar3 >> (uVar9 & 0xff);
      if ((int)uVar9 < 0) {
        uVar4 = uVar2 >> uVar7 | uVar3 << (0x1f - uVar5 & 0xff);
      }
      if (uVar4 != 0 || uVar8 != 0) {
        uVar5 = uVar7;
      }
      uVar7 = uVar5 - 0x20;
      uVar8 = 0;
      if ((int)uVar7 < 0) {
        uVar8 = uVar3 >> uVar5;
      }
      uVar9 = uVar3 >> (uVar7 & 0xff);
      if ((int)uVar7 < 0) {
        uVar9 = uVar3 << (0x20 - uVar5 & 0xff) | uVar2 >> uVar5;
      }
      uVar7 = uVar5 + 1;
      if (uVar9 == 0 && uVar8 == 0) {
        uVar7 = uVar5;
      }
      uVar8 = 0x20 - uVar7;
      uVar5 = 0x40 - uVar7;
      if ((int)uVar8 < 0) {
        local_2c = uVar2 << (uVar5 & 0xff);
      }
      local_20._0_4_ = local_2c;
      local_20._4_4_ = uVar2 << (uVar8 & 0xff);
      if ((int)uVar8 < 0) {
        local_20._4_4_ = uVar2 >> (0x20 - uVar5 & 0xff) | uVar3 << (uVar5 & 0xff);
      }
      FUN_00050d84(&local_20,param_3,&local_24);
      local_24 = local_24 + uVar7;
      if (-0x3fe < local_24) {
        uVar2 = local_20._4_4_ >> 0xf;
        uVar3 = (uint)local_20 >> 0xf | local_20._4_4_ << 0x11;
        if ((((uint)local_20 & 0x4000) != 0) &&
           (((uint)local_20 >> 0xf & 1) != 0 || ((uint)local_20 & 0x7ff) != 0)) {
          bVar10 = 0xfffffffe < uVar3;
          uVar3 = uVar3 + 1;
          uVar2 = uVar2 + bVar10;
        }
        uStack_3c = 0x7ff00000;
        uVar5 = 0;
        if (local_24 < 0x401) {
          uStack_3c = uVar2;
          uVar5 = uVar3;
        }
        goto LAB_000513c2;
      }
      if (local_24 < -0x4033) {
LAB_0005139a:
        uVar8 = 0;
        uVar3 = 0;
      }
      else {
        uVar2 = -local_24 - 0x3fee;
        if (0x40 < (int)uVar2) goto LAB_0005139a;
        if (uVar2 == 0x40) {
          uVar4 = local_20._4_4_ >> 0x1f;
          uVar9 = local_20._4_4_ & 0x7fffffff;
          uVar8 = 0;
          uVar3 = 0;
        }
        else {
          uVar5 = -local_24 - 0x400e;
          local_2c = 1 << (uVar5 & 0xff);
          if ((int)uVar5 < 0) {
            local_2c = 1 >> (0x20 - uVar2 & 0xff);
          }
          uVar7 = 0;
          if ((int)uVar5 < 0) {
            uVar7 = 1 << (uVar2 & 0xff);
          }
          uVar9 = local_2c - (uVar7 < 2) & local_20._4_4_;
          uVar8 = local_20._4_4_ >> (uVar5 & 0xff);
          if ((int)uVar5 < 0) {
            uVar8 = local_20._4_4_ << (0x20 - uVar2 & 0xff) | (uint)local_20 >> (uVar2 & 0xff);
          }
          uVar4 = ~uVar8 & 1;
          uVar3 = 0;
          if ((int)uVar5 < 0) {
            uVar3 = local_20._4_4_ >> (uVar2 & 0xff);
          }
          local_20._0_4_ = (uint)local_20 & uVar7 - 2;
        }
        if ((uVar4 != 0) && (((uVar8 & 1) != 0 || (uint)local_20 != 0) || uVar9 != 0)) {
          bVar10 = 0xfffffffe < uVar8;
          uVar8 = uVar8 + 1;
          uVar5 = 0;
          uVar3 = uVar3 + bVar10;
          uStack_3c = 0;
          if (uVar3 == 0x100000 && uVar8 == 0) goto LAB_000513c2;
        }
      }
      uStack_3c = uVar3;
      uVar5 = uVar8;
      goto LAB_000513c2;
    }
  }
  uStack_3c = 0;
  uVar5 = 0;
LAB_000513c2:
  return CONCAT44(uStack_3c,uVar5);
}



### FUNC FUN_00051490 @ 00051490

/* WARNING: Removing unreachable block (ram,0x00051594) */

int FUN_00051490(int param_1,uint param_2,undefined4 param_3,undefined4 param_4,undefined4 param_5,
                undefined4 param_6)

{
  undefined4 *puVar1;
  size_t sVar2;
  char *pcVar3;
  char *pcVar4;
  char cVar5;
  char *pcVar6;
  int iVar7;
  char cVar8;
  char *pcVar9;
  char local_170 [32];
  char acStack_150 [316];
  
  local_170[0] = '%';
  iVar7 = 1;
  if ((int)(param_2 * 0x100000) < 0) {
    local_170[1] = 0x2b;
    iVar7 = 2;
  }
  if ((int)(param_2 << 0x15) < 0) {
    local_170[iVar7] = '#';
    iVar7 = iVar7 + 1;
  }
  local_170[iVar7] = '.';
  local_170[iVar7 + 1] = '*';
  if ((param_2 & 0xc0) == 0x40) {
    cVar8 = 'F';
    cVar5 = 'f';
  }
  else if ((param_2 & 0xc0) == 0x80) {
    cVar8 = 'E';
    cVar5 = 'e';
  }
  else {
    cVar8 = 'G';
    cVar5 = 'g';
  }
  if ((param_2 & 0x4000) == 0) {
    cVar8 = cVar5;
  }
  local_170[iVar7 + 2] = cVar8;
  local_170[iVar7 + 3] = '\0';
  snprintf(acStack_150,0x13a,local_170,param_3,param_5,param_6);
  puVar1 = (undefined4 *)(param_1 + 0x118);
  sVar2 = strlen(acStack_150);
  pcVar3 = *(char **)(param_1 + 0x118);
  pcVar9 = *(char **)(param_1 + 0x10);
  if ((uint)((int)pcVar9 - (int)pcVar3) < sVar2) {
    if (pcVar9 != pcVar3) {
      __aeabi_memmove(pcVar3,acStack_150);
      pcVar3 = (char *)*puVar1;
      pcVar9 = *(char **)(param_1 + 0x10);
    }
    FUN_00051ae8(param_1,pcVar9 + (int)(acStack_150 + -(int)pcVar3),acStack_150 + sVar2);
    pcVar9 = *(char **)(param_1 + 0x10);
  }
  else {
    if (sVar2 != 0) {
      __aeabi_memmove(pcVar3,acStack_150,sVar2);
      pcVar9 = *(char **)(param_1 + 0x10);
      pcVar3 = (char *)*puVar1;
    }
    pcVar3 = pcVar3 + sVar2;
    if (pcVar3 != pcVar9) {
      __aeabi_memmove(pcVar3,pcVar9);
      pcVar9 = pcVar3 + (*(int *)(param_1 + 0x10) - (int)pcVar9);
      *(char **)(param_1 + 0x10) = pcVar9;
    }
  }
  pcVar4 = (char *)*puVar1;
  iVar7 = (int)pcVar9 - (int)pcVar4 >> 2;
  pcVar3 = pcVar4;
  if (0 < iVar7) {
    iVar7 = iVar7 + 1;
    do {
      cVar8 = *pcVar3;
      if (((cVar8 == '.') || (cVar8 == 'E')) || (cVar8 == 'e')) goto LAB_00051636;
      cVar8 = pcVar3[1];
      pcVar6 = pcVar3 + 1;
      if (((cVar8 == '.') || (cVar8 == 'E')) || (cVar8 == 'e')) goto LAB_0005163c;
      cVar8 = pcVar3[2];
      pcVar6 = pcVar3 + 2;
      if (((cVar8 == '.') || (cVar8 == 'E')) || (cVar8 == 'e')) goto LAB_0005163c;
      cVar8 = pcVar3[3];
      pcVar6 = pcVar3 + 3;
      if (((cVar8 == '.') || (cVar8 == 'E')) || (cVar8 == 'e')) goto LAB_0005163c;
      iVar7 = iVar7 + -1;
      pcVar3 = pcVar3 + 4;
    } while (1 < iVar7);
  }
  iVar7 = (int)pcVar9 - (int)pcVar3;
  pcVar6 = pcVar9;
  if (iVar7 == 1) {
LAB_00051624:
    cVar8 = *pcVar3;
    if (((cVar8 != '.') && (cVar8 != 'e')) && (cVar8 != 'E')) goto LAB_0005163c;
  }
  else if (iVar7 == 2) {
LAB_00051614:
    cVar8 = *pcVar3;
    if (((cVar8 != '.') && (cVar8 != 'E')) && (cVar8 != 'e')) {
      pcVar3 = pcVar3 + 1;
      goto LAB_00051624;
    }
  }
  else {
    if (iVar7 != 3) goto LAB_0005163c;
    cVar8 = *pcVar3;
    if (((cVar8 != '.') && (cVar8 != 'E')) && (cVar8 != 'e')) {
      pcVar3 = pcVar3 + 1;
      goto LAB_00051614;
    }
  }
LAB_00051636:
  pcVar6 = pcVar3;
LAB_0005163c:
  return (int)pcVar6 - (int)pcVar4;
}



### FUNC FUN_00051642 @ 00051642

/* WARNING: Removing unreachable block (ram,0x0005174a) */

int FUN_00051642(int param_1,uint param_2,undefined4 param_3,undefined4 param_4,undefined4 param_5,
                undefined4 param_6)

{
  undefined4 *puVar1;
  size_t sVar2;
  char *pcVar3;
  char *pcVar4;
  char cVar5;
  char *pcVar6;
  int iVar7;
  char cVar8;
  char *pcVar9;
  char local_170 [32];
  char acStack_150 [316];
  
  local_170[0] = '%';
  iVar7 = 1;
  if ((int)(param_2 * 0x100000) < 0) {
    local_170[1] = 0x2b;
    iVar7 = 2;
  }
  if ((int)(param_2 << 0x15) < 0) {
    local_170[iVar7] = '#';
    iVar7 = iVar7 + 1;
  }
  local_170[iVar7] = '.';
  local_170[iVar7 + 1] = '*';
  local_170[iVar7 + 2] = 'L';
  if ((param_2 & 0xc0) == 0x40) {
    cVar8 = 'F';
    cVar5 = 'f';
  }
  else if ((param_2 & 0xc0) == 0x80) {
    cVar8 = 'E';
    cVar5 = 'e';
  }
  else {
    cVar8 = 'G';
    cVar5 = 'g';
  }
  if ((param_2 & 0x4000) == 0) {
    cVar8 = cVar5;
  }
  local_170[iVar7 + 3] = cVar8;
  local_170[iVar7 + 4] = '\0';
  snprintf(acStack_150,0x13a,local_170,param_3,param_5,param_6);
  puVar1 = (undefined4 *)(param_1 + 0x118);
  sVar2 = strlen(acStack_150);
  pcVar3 = *(char **)(param_1 + 0x118);
  pcVar9 = *(char **)(param_1 + 0x10);
  if ((uint)((int)pcVar9 - (int)pcVar3) < sVar2) {
    if (pcVar9 != pcVar3) {
      __aeabi_memmove(pcVar3,acStack_150);
      pcVar3 = (char *)*puVar1;
      pcVar9 = *(char **)(param_1 + 0x10);
    }
    FUN_00051ae8(param_1,pcVar9 + (int)(acStack_150 + -(int)pcVar3),acStack_150 + sVar2);
    pcVar9 = *(char **)(param_1 + 0x10);
  }
  else {
    if (sVar2 != 0) {
      __aeabi_memmove(pcVar3,acStack_150,sVar2);
      pcVar9 = *(char **)(param_1 + 0x10);
      pcVar3 = (char *)*puVar1;
    }
    pcVar3 = pcVar3 + sVar2;
    if (pcVar3 != pcVar9) {
      __aeabi_memmove(pcVar3,pcVar9);
      pcVar9 = pcVar3 + (*(int *)(param_1 + 0x10) - (int)pcVar9);
      *(char **)(param_1 + 0x10) = pcVar9;
    }
  }
  pcVar4 = (char *)*puVar1;
  iVar7 = (int)pcVar9 - (int)pcVar4 >> 2;
  pcVar3 = pcVar4;
  if (0 < iVar7) {
    iVar7 = iVar7 + 1;
    do {
      cVar8 = *pcVar3;
      if (((cVar8 == '.') || (cVar8 == 'E')) || (cVar8 == 'e')) goto LAB_000517ec;
      cVar8 = pcVar3[1];
      pcVar6 = pcVar3 + 1;
      if (((cVar8 == '.') || (cVar8 == 'E')) || (cVar8 == 'e')) goto LAB_000517f2;
      cVar8 = pcVar3[2];
      pcVar6 = pcVar3 + 2;
      if (((cVar8 == '.') || (cVar8 == 'E')) || (cVar8 == 'e')) goto LAB_000517f2;
      cVar8 = pcVar3[3];
      pcVar6 = pcVar3 + 3;
      if (((cVar8 == '.') || (cVar8 == 'E')) || (cVar8 == 'e')) goto LAB_000517f2;
      iVar7 = iVar7 + -1;
      pcVar3 = pcVar3 + 4;
    } while (1 < iVar7);
  }
  iVar7 = (int)pcVar9 - (int)pcVar3;
  pcVar6 = pcVar9;
  if (iVar7 == 1) {
LAB_000517da:
    cVar8 = *pcVar3;
    if (((cVar8 != '.') && (cVar8 != 'e')) && (cVar8 != 'E')) goto LAB_000517f2;
  }
  else if (iVar7 == 2) {
LAB_000517ca:
    cVar8 = *pcVar3;
    if (((cVar8 != '.') && (cVar8 != 'E')) && (cVar8 != 'e')) {
      pcVar3 = pcVar3 + 1;
      goto LAB_000517da;
    }
  }
  else {
    if (iVar7 != 3) goto LAB_000517f2;
    cVar8 = *pcVar3;
    if (((cVar8 != '.') && (cVar8 != 'E')) && (cVar8 != 'e')) {
      pcVar3 = pcVar3 + 1;
      goto LAB_000517ca;
    }
  }
LAB_000517ec:
  pcVar6 = pcVar3;
LAB_000517f2:
  return (int)pcVar6 - (int)pcVar4;
}



### FUNC FUN_000517f8 @ 000517f8

void FUN_000517f8(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)

{
  char *pcVar1;
  size_t sVar2;
  char acStack_150 [316];
  undefined1 auStack_14 [4];
  
  snprintf(acStack_150,0x13a,"%Lf",param_4,param_3,param_4);
  pcVar1 = strchr(acStack_150,0x2e);
  if (pcVar1 != (char *)0x0) {
    FUN_00051c30(param_1,acStack_150,pcVar1,auStack_14);
    return;
  }
  sVar2 = strlen(acStack_150);
  FUN_00051ae8(param_1,acStack_150,acStack_150 + sVar2);
  return;
}



### FUNC FUN_00051848 @ 00051848

void FUN_00051848(int param_1,int *param_2,int *param_3,undefined4 param_4,int param_5)

{
  undefined4 uVar1;
  undefined4 *puVar2;
  uint uVar3;
  int *piVar4;
  uint uVar5;
  int iVar6;
  uint uVar7;
  char *pcVar8;
  char *pcVar9;
  uint local_24;
  
  pcVar8 = *(char **)(param_1 + 0x118);
  pcVar9 = *(char **)(param_1 + 0x10);
  local_24 = 0x3ffffffe;
  if (param_5 != 1) {
    if (pcVar8 != pcVar9) {
      uVar1 = (**(code **)(*param_3 + 0x28))(param_3,*pcVar8);
      if ((int *)param_2[0x112] == param_2) {
        puVar2 = (undefined4 *)param_2[0x10];
        iVar6 = 0x10 - ((int)puVar2 - (int)param_2 >> 2);
      }
      else {
        puVar2 = (undefined4 *)param_2[0x10];
        iVar6 = *param_2 - (int)puVar2 >> 2;
      }
      if (iVar6 == 1) {
        uVar3 = (int)puVar2 - param_2[0x112] >> 2;
        uVar7 = uVar3;
        if (uVar3 < 2) {
          uVar7 = 1;
        }
        uVar5 = uVar3 + uVar7 + 1;
        uVar7 = 0x3ffffffe;
        if (uVar3 <= uVar5) {
          uVar7 = uVar5;
        }
        uVar3 = 0x3ffffffe;
        if (uVar5 < 0x3fffffff) {
          uVar3 = uVar7;
        }
        FUN_000506a4(param_2,uVar3);
        puVar2 = (undefined4 *)param_2[0x10];
      }
      *puVar2 = uVar1;
      puVar2[1] = 0;
      param_2[0x10] = (int)(puVar2 + 1);
    }
    goto joined_r0x00051a58;
  }
  if (pcVar8 == pcVar9) goto joined_r0x00051a58;
  while (*pcVar8 != '.') {
    uVar1 = (**(code **)(*param_3 + 0x28))();
    pcVar8 = pcVar8 + 1;
    piVar4 = (int *)param_2[0x112];
    if (piVar4 == param_2) {
      puVar2 = (undefined4 *)param_2[0x10];
      iVar6 = 0x10 - ((int)puVar2 - (int)param_2 >> 2);
    }
    else {
      puVar2 = (undefined4 *)param_2[0x10];
      iVar6 = *param_2 - (int)puVar2 >> 2;
    }
    if (iVar6 == 1) {
      uVar3 = (int)puVar2 - (int)piVar4 >> 2;
      uVar7 = uVar3;
      if (uVar3 < 2) {
        uVar7 = 1;
      }
      uVar5 = uVar3 + uVar7 + 1;
      uVar7 = local_24;
      if (uVar3 <= uVar5) {
        uVar7 = uVar5;
      }
      uVar3 = local_24;
      if (uVar5 < 0x3fffffff) {
        uVar3 = uVar7;
      }
      FUN_000506a4(param_2,uVar3);
      puVar2 = (undefined4 *)param_2[0x10];
    }
    *puVar2 = uVar1;
    puVar2[1] = 0;
    param_2[0x10] = (int)(puVar2 + 1);
    if (pcVar9 == pcVar8) {
      return;
    }
  }
  piVar4 = (int *)param_2[0x112];
  if (piVar4 == param_2) {
    puVar2 = (undefined4 *)param_2[0x10];
    if ((int)puVar2 - (int)param_2 >> 2 == 0xf) goto LAB_00051a1a;
  }
  else {
    puVar2 = (undefined4 *)param_2[0x10];
    if (*param_2 - (int)puVar2 >> 2 == 1) {
LAB_00051a1a:
      uVar3 = (int)puVar2 - (int)piVar4 >> 2;
      uVar7 = uVar3;
      if (uVar3 < 2) {
        uVar7 = 1;
      }
      uVar5 = uVar3 + uVar7 + 1;
      uVar7 = local_24;
      if (uVar3 <= uVar5) {
        uVar7 = uVar5;
      }
      uVar3 = local_24;
      if (uVar5 < 0x3fffffff) {
        uVar3 = uVar7;
      }
      FUN_000506a4(param_2,uVar3);
      puVar2 = (undefined4 *)param_2[0x10];
    }
  }
  *puVar2 = param_4;
  puVar2[1] = 0;
  param_2[0x10] = (int)(puVar2 + 1);
joined_r0x00051a58:
  if ((pcVar8 != pcVar9) && (pcVar8 = pcVar8 + 1, pcVar8 != pcVar9)) {
    do {
      uVar1 = (**(code **)(*param_3 + 0x28))(param_3,*pcVar8);
      if ((int *)param_2[0x112] == param_2) {
        puVar2 = (undefined4 *)param_2[0x10];
        if ((int)puVar2 - (int)param_2 >> 2 == 0xf) goto LAB_000519c4;
      }
      else {
        puVar2 = (undefined4 *)param_2[0x10];
        if (*param_2 - (int)puVar2 >> 2 == 1) {
LAB_000519c4:
          uVar3 = (int)puVar2 - param_2[0x112] >> 2;
          uVar7 = uVar3;
          if (uVar3 < 2) {
            uVar7 = 1;
          }
          uVar5 = uVar3 + uVar7 + 1;
          uVar7 = local_24;
          if (uVar3 <= uVar5) {
            uVar7 = uVar5;
          }
          uVar3 = local_24;
          if (uVar5 < 0x3fffffff) {
            uVar3 = uVar7;
          }
          FUN_000506a4(param_2,uVar3);
          puVar2 = (undefined4 *)param_2[0x10];
        }
      }
      *puVar2 = uVar1;
      puVar2[1] = 0;
      param_2[0x10] = (int)(puVar2 + 1);
      pcVar8 = pcVar8 + 1;
    } while (pcVar9 != pcVar8);
  }
  return;
}



### FUNC FUN_00051a60 @ 00051a60

void FUN_00051a60(int param_1,int param_2)

{
  char *pcVar1;
  char *pcVar2;
  char *pcVar3;
  int iVar4;
  char *pcVar5;
  
  if (param_2 == 0x2e) {
    return;
  }
  pcVar3 = *(char **)(param_1 + 0x118);
  pcVar2 = *(char **)(param_1 + 0x10);
  if ((int)pcVar2 - (int)pcVar3 == 0) {
    return;
  }
  iVar4 = (int)pcVar2 - (int)pcVar3 >> 2;
  pcVar5 = pcVar3;
  if (0 < iVar4) {
    iVar4 = iVar4 + 1;
    do {
      pcVar1 = pcVar5;
      if ((((*pcVar5 == '.') || (pcVar1 = pcVar5 + 1, pcVar5[1] == '.')) ||
          (pcVar1 = pcVar5 + 2, pcVar5[2] == '.')) || (pcVar1 = pcVar5 + 3, pcVar5[3] == '.'))
      goto joined_r0x00051ada;
      iVar4 = iVar4 + -1;
      pcVar5 = pcVar5 + 4;
    } while (1 < iVar4);
  }
  iVar4 = (int)pcVar2 - (int)pcVar5;
  if (iVar4 != 1) {
    if (iVar4 != 2) {
      if (iVar4 != 3) {
        return;
      }
      pcVar1 = pcVar5;
      if (*pcVar5 == '.') goto joined_r0x00051ada;
      pcVar5 = pcVar5 + 1;
    }
    pcVar1 = pcVar5;
    if (*pcVar5 == '.') goto joined_r0x00051ada;
    pcVar5 = pcVar5 + 1;
  }
  pcVar1 = pcVar5;
  if (*pcVar5 != '.') {
    return;
  }
joined_r0x00051ada:
  if ((pcVar1 != pcVar2) && ((int)pcVar1 - (int)pcVar3 != -1)) {
    pcVar3[(int)pcVar1 - (int)pcVar3] = (char)param_2;
  }
  return;
}



### FUNC FUN_00051ae8 @ 00051ae8

int * FUN_00051ae8(int *param_1,undefined1 *param_2,undefined1 *param_3)

{
  int *piVar1;
  undefined1 *puVar2;
  int *piVar3;
  undefined1 *puVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  uint uVar8;
  int *piVar9;
  uint uVar10;
  int *piVar11;
  
  if (param_2 != param_3) {
    uVar10 = (int)param_3 - (int)param_2;
    piVar9 = (int *)param_1[0x46];
    piVar1 = param_1 + 0x46;
    if (piVar9 == param_1) {
      puVar4 = (undefined1 *)param_1[4];
      uVar5 = (int)param_1 + (0x10 - (int)puVar4);
    }
    else {
      puVar4 = (undefined1 *)param_1[4];
      uVar5 = *param_1 - (int)puVar4;
    }
    if (uVar10 < uVar5) {
      puVar2 = param_2 + 1;
      if (0 < (int)param_3 - (int)puVar2) {
        param_3 = param_3 + (1 - (int)puVar2);
        do {
          puVar4 = puVar4 + 1;
          *puVar4 = *puVar2;
          param_3 = param_3 + -1;
          puVar2 = puVar2 + 1;
        } while (1 < (int)param_3);
        puVar4 = (undefined1 *)param_1[4];
      }
      puVar4[uVar10] = 0;
      *(undefined1 *)param_1[4] = *param_2;
      param_1[4] = param_1[4] + uVar10;
    }
    else {
      uVar5 = (int)puVar4 - (int)piVar9;
      if (-uVar5 - 2 < uVar10) {
                    /* WARNING: Subroutine does not return */
        std::__stl_throw_length_error("basic_string");
      }
      uVar7 = uVar5;
      if (uVar5 <= uVar10) {
        uVar7 = uVar10;
      }
      uVar8 = uVar5 + uVar7 + 1;
      uVar6 = 0xfffffffe;
      if (uVar5 <= uVar8) {
        uVar6 = uVar8;
      }
      uVar8 = 0xfffffffe;
      if (uVar5 + uVar7 != -2) {
        uVar8 = uVar6;
      }
      if (uVar8 >> 1 < 0x81) {
        piVar3 = param_1 + 5;
      }
      else {
        piVar3 = (int *)operator_new(uVar8);
        puVar4 = (undefined1 *)param_1[4];
        piVar9 = (int *)*piVar1;
      }
      piVar11 = piVar3;
      if (0 < (int)puVar4 - (int)piVar9) {
        puVar4 = puVar4 + (1 - (int)piVar9);
        do {
          *(char *)piVar11 = (char)*piVar9;
          puVar4 = puVar4 + -1;
          piVar11 = (int *)((int)piVar11 + 1);
          piVar9 = (int *)((int)piVar9 + 1);
        } while (1 < (int)puVar4);
      }
      if (0 < (int)uVar10) {
        param_3 = param_3 + (1 - (int)param_2);
        do {
          *(undefined1 *)piVar11 = *param_2;
          param_3 = param_3 + -1;
          piVar11 = (int *)((int)piVar11 + 1);
          param_2 = param_2 + 1;
        } while (1 < (int)param_3);
      }
      *(undefined1 *)piVar11 = 0;
      piVar9 = (int *)*piVar1;
      if (((piVar9 != param_1) && (piVar9 != (int *)0x0)) && (param_1 + 5 != piVar9)) {
        if ((uint)(*param_1 - (int)piVar9) < 0x81) {
          std::__node_alloc::_M_deallocate(piVar9,*param_1 - (int)piVar9);
        }
        else {
          operator_delete(piVar9);
        }
      }
      param_1[4] = (int)piVar11;
      *param_1 = (int)((int)piVar3 + uVar8);
      *piVar1 = (int)piVar3;
    }
  }
  return param_1;
}



### FUNC FUN_00051c30 @ 00051c30

int * FUN_00051c30(int *param_1,undefined1 *param_2,undefined1 *param_3)

{
  undefined1 *puVar1;
  int *piVar2;
  int *piVar3;
  int *piVar4;
  undefined1 *puVar5;
  undefined1 *puVar6;
  undefined1 *puVar7;
  int *piVar8;
  int *local_1c;
  
  if (param_2 != param_3) {
    puVar1 = param_3 + -(int)param_2;
    piVar4 = (int *)param_1[0x46];
    piVar2 = param_1 + 0x46;
    if (piVar4 == param_1) {
      local_1c = (int *)param_1[4];
      puVar6 = (undefined1 *)((int)param_1 + (0x10 - (int)local_1c));
    }
    else {
      local_1c = (int *)param_1[4];
      puVar6 = (undefined1 *)(*param_1 - (int)local_1c);
    }
    piVar8 = param_1 + 4;
    if (puVar1 < puVar6) {
      *(undefined1 *)local_1c = *param_2;
      param_2 = param_2 + 1;
      if (param_2 != param_3) {
        __aeabi_memcpy(*piVar8 + 1,param_2,(int)param_3 - (int)param_2);
      }
      puVar1[*piVar8] = 0;
      *piVar8 = (int)(puVar1 + *piVar8);
    }
    else {
      puVar6 = (undefined1 *)((int)local_1c - (int)piVar4);
      if ((undefined1 *)(-2 - (int)puVar6) < puVar1) {
                    /* WARNING: Subroutine does not return */
        std::__stl_throw_length_error("basic_string");
      }
      puVar7 = puVar6;
      if (puVar6 <= puVar1) {
        puVar7 = puVar1;
      }
      puVar7 = puVar6 + (int)puVar7;
      puVar5 = (undefined1 *)0xfffffffe;
      if (puVar6 <= puVar7 + 1) {
        puVar5 = puVar7 + 1;
      }
      puVar6 = (undefined1 *)0xfffffffe;
      if (puVar7 != (undefined1 *)0xfffffffe) {
        puVar6 = puVar5;
      }
      if ((uint)puVar6 >> 1 < 0x81) {
        piVar3 = param_1 + 5;
      }
      else {
        piVar3 = (int *)operator_new((uint)puVar6);
        local_1c = (int *)*piVar8;
        piVar4 = (int *)*piVar2;
      }
      piVar8 = piVar3;
      if (local_1c != piVar4) {
        __aeabi_memcpy(piVar3,piVar4,(int)local_1c - (int)piVar4);
        piVar8 = (int *)((int)piVar3 + ((int)local_1c - (int)piVar4));
      }
      __aeabi_memcpy(piVar8,param_2);
      *(undefined1 *)((int)piVar8 + (int)puVar1) = 0;
      piVar4 = (int *)*piVar2;
      if (((piVar4 != param_1) && (piVar4 != (int *)0x0)) && (param_1 + 5 != piVar4)) {
        if ((uint)(*param_1 - (int)piVar4) < 0x81) {
          std::__node_alloc::_M_deallocate(piVar4,*param_1 - (int)piVar4);
        }
        else {
          operator_delete(piVar4);
        }
      }
      param_1[4] = (int)((int)piVar8 + (int)puVar1);
      *param_1 = (int)((int)piVar3 + (int)puVar6);
      *piVar2 = (int)piVar3;
    }
  }
  return param_1;
}



### FUNC do_decimal_point @ 00051d58

/* std::numpunct<char>::do_decimal_point() const */

undefined4 std::numpunct<char>::do_decimal_point(void)

{
  return 0x2e;
}



### FUNC do_thousands_sep @ 00051d5c

/* std::numpunct<char>::do_thousands_sep() const */

undefined4 std::numpunct<char>::do_thousands_sep(void)

{
  return 0x2c;
}



### FUNC do_grouping @ 00051d60

/* std::numpunct<char>::do_grouping() const */

void __thiscall std::numpunct<char>::do_grouping(numpunct<char> *this)

{
  *this = (numpunct<char>)0x0;
  *(numpunct<char> **)(this + 0x10) = this;
  *(numpunct<char> **)(this + 0x14) = this;
  return;
}



### FUNC do_truename @ 00051d6c

/* std::numpunct<char>::do_truename() const */

void __thiscall std::numpunct<char>::do_truename(numpunct<char> *this)

{
  undefined1 auStack_c [4];
  
  FUN_00031c38(this,&DAT_00051d84,auStack_c);
  return;
}



### FUNC do_falsename @ 00051d8c

/* std::numpunct<char>::do_falsename() const */

void __thiscall std::numpunct<char>::do_falsename(numpunct<char> *this)

{
  undefined1 auStack_c [4];
  
  FUN_00031c38(this,"false",auStack_c);
  return;
}



### FUNC ~numpunct @ 00051dac

/* std::numpunct<char>::~numpunct() */

void __thiscall std::numpunct<char>::~numpunct(numpunct<char> *this)

{
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~numpunct @ 00051db6

/* std::numpunct<char>::~numpunct() */

void __thiscall std::numpunct<char>::~numpunct(numpunct<char> *this)

{
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC do_decimal_point @ 00051dd6

/* std::numpunct<wchar_t>::do_decimal_point() const */

undefined4 std::numpunct<wchar_t>::do_decimal_point(void)

{
  return 0x2e;
}



### FUNC do_thousands_sep @ 00051dda

/* std::numpunct<wchar_t>::do_thousands_sep() const */

undefined4 std::numpunct<wchar_t>::do_thousands_sep(void)

{
  return 0x2c;
}



### FUNC do_grouping @ 00051dde

/* std::numpunct<wchar_t>::do_grouping() const */

void __thiscall std::numpunct<wchar_t>::do_grouping(numpunct<wchar_t> *this)

{
  *this = (numpunct<wchar_t>)0x0;
  *(numpunct<wchar_t> **)(this + 0x10) = this;
  *(numpunct<wchar_t> **)(this + 0x14) = this;
  return;
}



### FUNC do_truename @ 00051de8

/* std::numpunct<wchar_t>::do_truename() const */

void __thiscall std::numpunct<wchar_t>::do_truename(numpunct<wchar_t> *this)

{
  size_t sVar1;
  
  *(numpunct<wchar_t> **)(this + 0x40) = this;
  *(numpunct<wchar_t> **)(this + 0x44) = this;
  sVar1 = wcslen(L"true");
  FUN_0004fe38(this,&DAT_00051e34,&DAT_00051e34 + sVar1 * 4);
  return;
}



### FUNC do_falsename @ 00051e48

/* std::numpunct<wchar_t>::do_falsename() const */

void __thiscall std::numpunct<wchar_t>::do_falsename(numpunct<wchar_t> *this)

{
  size_t sVar1;
  
  *(numpunct<wchar_t> **)(this + 0x40) = this;
  *(numpunct<wchar_t> **)(this + 0x44) = this;
  sVar1 = wcslen(L"false");
  FUN_0004fe38(this,L"false",L"false" + sVar1);
  return;
}



### FUNC ~numpunct @ 00051eac

/* std::numpunct<wchar_t>::~numpunct() */

void __thiscall std::numpunct<wchar_t>::~numpunct(numpunct<wchar_t> *this)

{
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~numpunct @ 00051eb6

/* std::numpunct<wchar_t>::~numpunct() */

void __thiscall std::numpunct<wchar_t>::~numpunct(numpunct<wchar_t> *this)

{
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC __write_formatted_time @ 00051ed8

/* std::priv::__write_formatted_time(std::priv::__basic_iostring<char>&, std::ctype<char> const&,
   char, char, std::priv::_Time_Info const&, tm const*) */

void std::priv::__write_formatted_time
               (__basic_iostring *param_1,ctype *param_2,char param_3,char param_4,
               _Time_Info *param_5,tm *param_6)

{
  FUN_00051ef0(param_1,param_2,(int)param_3,(int)param_4,param_5,param_6);
  return;
}



### FUNC FUN_00051ef0 @ 00051ef0

void FUN_00051ef0(undefined4 param_1,int *param_2,int param_3,int param_4,int param_5,tm *param_6)

{
  int *piVar1;
  int iVar2;
  undefined4 uVar3;
  uint uVar4;
  int iVar5;
  int extraout_r1;
  int extraout_r1_00;
  int extraout_r1_01;
  int extraout_r1_02;
  int extraout_r1_03;
  uint extraout_r1_04;
  int extraout_r1_05;
  int *piVar6;
  int extraout_r1_06;
  time_t extraout_r1_07;
  uint uVar7;
  int extraout_r1_08;
  int extraout_r1_09;
  int extraout_r1_10;
  int extraout_r1_11;
  int extraout_r1_12;
  char *pcVar8;
  int iVar9;
  int iVar10;
  time_t tVar11;
  code *pcVar12;
  undefined1 uVar13;
  int iVar14;
  char *pcVar15;
  char *pcVar16;
  undefined1 auStack_a8 [4];
  int local_a4 [4];
  int *local_94;
  int *local_90;
  undefined1 auStack_8c [4];
  int local_88 [4];
  int *local_78;
  int *local_74;
  undefined1 auStack_70 [4];
  int local_6c [4];
  int *local_5c;
  int *local_58;
  char acStack_54 [64];
  
  switch(param_3) {
  case 0x25:
    pcVar12 = *(code **)(*param_2 + 0x18);
    uVar3 = 0x25;
    goto LAB_00052440;
  case 0x41:
    param_5 = param_5 + param_6->tm_wday * 0x18;
    uVar3 = *(undefined4 *)(param_5 + 0x130);
    iVar2 = 0x4d;
    goto LAB_000520c0;
  case 0x42:
    param_5 = param_5 + param_6->tm_mon * 0x18;
    uVar3 = *(undefined4 *)(param_5 + 0x2f8);
    iVar2 = 0xbf;
    goto LAB_000520c0;
  case 0x43:
    iVar2 = param_6->tm_mday;
    goto LAB_00052320;
  case 0x44:
    pcVar15 = *(char **)(param_5 + 0x28);
    pcVar8 = *(char **)(param_5 + 0x2c);
    while (pcVar15 != pcVar8) {
      if (*pcVar8 == '%') {
        pcVar16 = pcVar8 + 2;
        if (pcVar8[1] != '#') {
          pcVar16 = pcVar8 + 1;
        }
        uVar13 = 0;
        if (pcVar8[1] == '#') {
          uVar13 = 0x23;
        }
        FUN_00051ef0(param_1,param_2,*pcVar16,uVar13,param_5,param_6);
        pcVar8 = pcVar16 + 1;
      }
      else {
        FUN_00054550(param_1,1);
        pcVar8 = pcVar8 + 1;
      }
    }
    break;
  case 0x47:
  case 0x67:
    iVar9 = param_6->tm_year;
    iVar5 = param_6->tm_wday;
    iVar14 = param_6->tm_yday;
    uVar4 = iVar9 + 0x76c;
    __aeabi_idivmod((iVar14 + 0x17e) - iVar5,7);
    iVar2 = (iVar14 + 3) - extraout_r1;
    if (iVar2 < 0) {
      uVar7 = iVar9 + 0x76b;
      iVar2 = 0x16d;
      if ((uVar7 & 3) == 0) {
        __aeabi_idivmod(uVar7,100);
        iVar2 = 0x16e;
        if (extraout_r1_08 == 0) {
          __aeabi_idivmod(uVar7,400);
          iVar2 = 0x16e;
          if (extraout_r1_09 != 0) {
            iVar2 = 0x16d;
          }
        }
      }
      __aeabi_idivmod((iVar2 + iVar14 + 0x17e) - iVar5,7);
      iVar2 = (iVar2 + iVar14 + 3) - extraout_r1_10;
    }
    else {
      iVar10 = 0x16d;
      if ((uVar4 & 3) == 0) {
        __aeabi_idivmod(uVar4,100);
        iVar10 = 0x16e;
        if (extraout_r1_00 == 0) {
          __aeabi_idivmod(uVar4,400);
          iVar10 = 0x16e;
          if (extraout_r1_01 != 0) {
            iVar10 = 0x16d;
          }
        }
      }
      __aeabi_idivmod(((iVar14 - iVar10) + 0x17e) - iVar5,7);
      iVar5 = ((iVar14 - iVar10) + 3) - extraout_r1_02;
      uVar7 = iVar9 + 0x76d;
      if (iVar5 < 0) {
        uVar7 = uVar4;
      }
      if (-1 < iVar5) {
        iVar2 = iVar5;
      }
    }
    if (param_3 != 0x47) {
      if (param_3 == 0x67) {
        __aeabi_idivmod(uVar7,100);
        __aeabi_idivmod(extraout_r1_03 + 100,100);
        uVar7 = extraout_r1_04;
      }
      else {
        iVar2 = __divsi3(iVar2,7);
        uVar7 = iVar2 + 1;
      }
    }
    uVar4 = FUN_00050030(acStack_54,0,uVar7);
    goto LAB_000525d2;
  case 0x48:
    if (param_4 == 0x23) {
      pcVar8 = "%ld";
    }
    else {
      pcVar8 = "%.2ld";
    }
    sprintf(acStack_54,pcVar8,param_6->tm_hour);
    iVar2 = param_6->tm_hour;
    goto LAB_000525ba;
  case 0x49:
    if (param_4 == 0x23) {
      pcVar8 = "%ld";
    }
    else {
      pcVar8 = "%.2ld";
    }
    __aeabi_idivmod(param_6->tm_hour,0xc);
    iVar2 = 0xc;
    if (extraout_r1_11 != 0) {
      iVar2 = extraout_r1_11;
    }
    sprintf(acStack_54,pcVar8,iVar2);
    __aeabi_idivmod(param_6->tm_hour,0xc);
    uVar4 = 2;
    if ((extraout_r1_12 != 0) && (uVar4 = 1, 9 < extraout_r1_12)) {
      uVar4 = 2;
    }
    if (param_4 != 0x23) {
      uVar4 = 2;
    }
    uVar4 = uVar4 | (uint)acStack_54;
    goto LAB_000525d2;
  case 0x4d:
    if (param_4 == 0x23) {
      pcVar8 = "%ld";
    }
    else {
      pcVar8 = "%.2ld";
    }
    sprintf(acStack_54,pcVar8,param_6->tm_min);
    iVar2 = param_6->tm_min;
    goto LAB_000525ba;
  case 0x52:
    FUN_00031c38(local_6c,&DAT_000648a8,auStack_70);
    piVar1 = local_58;
    local_90 = local_58;
    while (local_5c != piVar1) {
      local_58 = local_90;
      if ((char)*piVar1 == '%') {
        piVar6 = (int *)((int)piVar1 + 2);
        if (*(char *)((int)piVar1 + 1) != '#') {
          piVar6 = (int *)((int)piVar1 + 1);
        }
        uVar13 = 0;
        if (*(char *)((int)piVar1 + 1) == '#') {
          uVar13 = 0x23;
        }
        FUN_00051ef0(param_1,param_2,(char)*piVar6,uVar13,param_5,param_6);
        piVar1 = (int *)((int)piVar6 + 1);
        local_90 = local_58;
      }
      else {
        FUN_00054550(param_1,1);
        piVar1 = (int *)((int)piVar1 + 1);
        local_90 = local_58;
      }
    }
    if ((local_90 != local_6c) && (local_90 != (int *)0x0)) {
      if (0x80 < (uint)(local_6c[0] - (int)local_90)) {
LAB_00052652:
        operator_delete(local_90);
        return;
      }
      std::__node_alloc::_M_deallocate(local_90,local_6c[0] - (int)local_90);
    }
    break;
  case 0x53:
    if (param_4 == 0x23) {
      pcVar8 = "%ld";
    }
    else {
      pcVar8 = "%.2ld";
    }
    sprintf(acStack_54,pcVar8,param_6->tm_sec);
    iVar2 = param_6->tm_sec;
    goto LAB_000525ba;
  case 0x54:
    FUN_00031c38(local_a4,&DAT_00066294,auStack_a8);
    piVar1 = local_90;
    while (local_94 != piVar1) {
      if ((char)*piVar1 == '%') {
        piVar6 = (int *)((int)piVar1 + 2);
        if (*(char *)((int)piVar1 + 1) != '#') {
          piVar6 = (int *)((int)piVar1 + 1);
        }
        uVar13 = 0;
        if (*(char *)((int)piVar1 + 1) == '#') {
          uVar13 = 0x23;
        }
        FUN_00051ef0(param_1,param_2,(char)*piVar6,uVar13,param_5,param_6);
        piVar1 = (int *)((int)piVar6 + 1);
      }
      else {
        FUN_00054550(param_1,1);
        piVar1 = (int *)((int)piVar1 + 1);
      }
    }
    if ((local_90 != local_a4) && (local_90 != (int *)0x0)) {
      if (0x80 < (uint)(local_a4[0] - (int)local_90)) goto LAB_00052652;
      std::__node_alloc::_M_deallocate(local_90,local_a4[0] - (int)local_90);
    }
    break;
  case 0x55:
    iVar2 = (param_6->tm_yday + 7) - param_6->tm_wday;
    goto LAB_00052218;
  case 0x57:
    iVar2 = 1;
    if (param_6->tm_wday != 0) {
      iVar2 = 8 - param_6->tm_wday;
    }
    iVar2 = param_6->tm_yday + iVar2;
LAB_00052218:
    tVar11 = __divsi3(iVar2,7);
    goto LAB_00052482;
  case 0x58:
    pcVar15 = *(char **)(param_5 + 0x10);
    pcVar8 = *(char **)(param_5 + 0x14);
    while (pcVar15 != pcVar8) {
      if (*pcVar8 == '%') {
        pcVar16 = pcVar8 + 2;
        if (pcVar8[1] != '#') {
          pcVar16 = pcVar8 + 1;
        }
        uVar13 = 0;
        if (pcVar8[1] == '#') {
          uVar13 = 0x23;
        }
        FUN_00051ef0(param_1,param_2,*pcVar16,uVar13,param_5,param_6);
        pcVar8 = pcVar16 + 1;
      }
      else {
        FUN_00054550(param_1,1);
        pcVar8 = pcVar8 + 1;
      }
    }
    break;
  case 0x59:
    tVar11 = param_6->tm_year + 0x76c;
    goto LAB_00052482;
  case 0x61:
    param_5 = param_5 + param_6->tm_wday * 0x18;
    uVar3 = *(undefined4 *)(param_5 + 0x88);
    iVar2 = 0x8c;
    goto LAB_00052346;
  case 0x62:
  case 0x68:
    param_5 = param_5 + param_6->tm_mon * 0x18;
    uVar3 = *(undefined4 *)(param_5 + 0x1d8);
    iVar2 = 0x77;
LAB_000520c0:
    iVar2 = iVar2 << 2;
LAB_00052346:
    FUN_0003dfb8(param_1,*(undefined4 *)(param_5 + iVar2),uVar3,local_6c);
    return;
  case 99:
    iVar2 = param_5 + 0x30;
    if (param_4 == 0x23) {
      iVar2 = param_5 + 0x60;
    }
    pcVar15 = *(char **)(iVar2 + 0x10);
    pcVar8 = *(char **)(iVar2 + 0x14);
    while (pcVar15 != pcVar8) {
      if (*pcVar8 == '%') {
        pcVar16 = pcVar8 + 2;
        if (pcVar8[1] != '#') {
          pcVar16 = pcVar8 + 1;
        }
        uVar13 = 0;
        if (pcVar8[1] == '#') {
          uVar13 = 0x23;
        }
        FUN_00051ef0(param_1,param_2,*pcVar16,uVar13,param_5,param_6);
        pcVar8 = pcVar16 + 1;
      }
      else {
        FUN_00054550(param_1,1);
        pcVar8 = pcVar8 + 1;
      }
    }
    break;
  case 100:
    if (param_4 == 0x23) {
      pcVar8 = "%ld";
    }
    else {
      pcVar8 = "%.2ld";
    }
    sprintf(acStack_54,pcVar8,param_6->tm_mday);
    iVar2 = param_6->tm_mday;
LAB_000525ba:
    uVar4 = 1;
    if (9 < iVar2) {
LAB_000525c2:
      uVar4 = 2;
    }
LAB_000525c4:
    if (param_4 != 0x23) {
      uVar4 = 2;
    }
    uVar4 = uVar4 | (uint)acStack_54;
    goto LAB_000525d2;
  case 0x65:
    iVar2 = param_6->tm_mday;
    goto LAB_00052320;
  case 0x6a:
    tVar11 = param_6->tm_yday + 1;
    goto LAB_00052482;
  case 0x6b:
    iVar2 = param_6->tm_hour;
    goto LAB_00052320;
  case 0x6c:
    __aeabi_idivmod(param_6->tm_hour,0xc);
    iVar2 = extraout_r1_05;
LAB_00052320:
    sprintf(acStack_54,"%2ld",iVar2);
    uVar4 = (uint)acStack_54 | 2;
    goto LAB_000525d2;
  case 0x6d:
    if (param_4 == 0x23) {
      pcVar8 = "%ld";
    }
    else {
      pcVar8 = "%.2ld";
    }
    sprintf(acStack_54,pcVar8,param_6->tm_mon + 1);
    uVar4 = 1;
    if (8 < param_6->tm_mon) goto LAB_000525c2;
    goto LAB_000525c4;
  case 0x6e:
    pcVar12 = *(code **)(*param_2 + 0x18);
    uVar3 = 10;
LAB_00052440:
    uVar3 = (*pcVar12)(param_2,uVar3);
    FUN_00054550(param_1,1,uVar3);
    return;
  case 0x70:
    iVar2 = __divsi3(param_6->tm_hour,0xc);
    param_5 = param_5 + iVar2 * 0x18;
    uVar3 = *(undefined4 *)(param_5 + 0x418);
    iVar2 = 0x41c;
    goto LAB_00052346;
  case 0x72:
    FUN_00031c38(local_88,&DAT_000662a4,auStack_8c);
    piVar1 = local_74;
    local_90 = local_74;
    while (local_78 != piVar1) {
      local_74 = local_90;
      if ((char)*piVar1 == '%') {
        piVar6 = (int *)((int)piVar1 + 2);
        if (*(char *)((int)piVar1 + 1) != '#') {
          piVar6 = (int *)((int)piVar1 + 1);
        }
        uVar13 = 0;
        if (*(char *)((int)piVar1 + 1) == '#') {
          uVar13 = 0x23;
        }
        FUN_00051ef0(param_1,param_2,(char)*piVar6,uVar13,param_5,param_6);
        piVar1 = (int *)((int)piVar6 + 1);
        local_90 = local_74;
      }
      else {
        FUN_00054550(param_1,1);
        piVar1 = (int *)((int)piVar1 + 1);
        local_90 = local_74;
      }
    }
    if ((local_90 != local_88) && (local_90 != (int *)0x0)) {
      if (0x80 < (uint)(local_88[0] - (int)local_90)) goto LAB_00052652;
      std::__node_alloc::_M_deallocate(local_90,local_88[0] - (int)local_90);
    }
    break;
  case 0x73:
    tVar11 = mktime(param_6);
    goto LAB_00052482;
  case 0x74:
    uVar3 = (**(code **)(*param_2 + 0x18))(param_2,9);
    FUN_00054550(param_1,1,uVar3);
    goto LAB_00052452;
  case 0x75:
LAB_00052452:
    __aeabi_idivmod(param_6->tm_wday + 6,7);
    uVar4 = FUN_00050030(acStack_54,0,extraout_r1_06 + 1);
    goto LAB_000525d2;
  case 0x77:
    tVar11 = param_6->tm_wday;
    goto LAB_00052482;
  case 0x78:
    iVar2 = param_5 + 0x18;
    if (param_4 == 0x23) {
      iVar2 = param_5 + 0x48;
    }
    pcVar15 = *(char **)(iVar2 + 0x10);
    pcVar8 = *(char **)(iVar2 + 0x14);
    while (pcVar15 != pcVar8) {
      if (*pcVar8 == '%') {
        pcVar16 = pcVar8 + 2;
        if (pcVar8[1] != '#') {
          pcVar16 = pcVar8 + 1;
        }
        uVar13 = 0;
        if (pcVar8[1] == '#') {
          uVar13 = 0x23;
        }
        FUN_00051ef0(param_1,param_2,*pcVar16,uVar13,param_5,param_6);
        pcVar8 = pcVar16 + 1;
      }
      else {
        FUN_00054550(param_1,1);
        pcVar8 = pcVar8 + 1;
      }
    }
    break;
  case 0x79:
    __aeabi_idivmod(param_6->tm_year + 0x76c,100);
    tVar11 = extraout_r1_07;
LAB_00052482:
    uVar4 = FUN_00050030(acStack_54,0,tVar11);
LAB_000525d2:
    FUN_00051c30(param_1,acStack_54,uVar4,local_6c);
  }
  return;
}



### FUNC __write_formatted_time @ 0005271c

/* std::priv::__write_formatted_time(std::priv::__basic_iostring<wchar_t>&, std::ctype<wchar_t>
   const&, char, char, std::priv::_WTime_Info const&, tm const*) */

void std::priv::__write_formatted_time
               (__basic_iostring *param_1,ctype *param_2,char param_3,char param_4,
               _WTime_Info *param_5,tm *param_6)

{
  FUN_00052734(param_1,param_2,(int)param_3,(int)param_4,param_5,param_6);
  return;
}



### FUNC FUN_00052734 @ 00052734

void FUN_00052734(int *param_1,int *param_2,int param_3,int param_4,int param_5,tm *param_6)

{
  undefined4 uVar1;
  uint uVar2;
  int iVar3;
  int iVar4;
  int iVar5;
  int extraout_r1;
  int extraout_r1_00;
  int extraout_r1_01;
  int extraout_r1_02;
  int extraout_r1_03;
  uint extraout_r1_04;
  int extraout_r1_05;
  undefined4 *puVar6;
  time_t extraout_r1_06;
  int extraout_r1_07;
  int extraout_r1_08;
  int extraout_r1_09;
  int extraout_r1_10;
  int extraout_r1_11;
  char *pcVar7;
  int extraout_r1_12;
  int iVar8;
  int iVar9;
  time_t tVar10;
  code *pcVar11;
  uint uVar12;
  uint uVar13;
  int *piVar14;
  undefined1 auStack_190 [4];
  int local_18c [5];
  int *local_178;
  undefined1 auStack_174 [4];
  int local_170 [5];
  int *local_15c;
  undefined1 auStack_158 [4];
  char acStack_154 [64];
  int local_114 [5];
  int *local_100;
  
  switch(param_3) {
  case 0x25:
    pcVar11 = *(code **)(*param_2 + 0x28);
    uVar1 = 0x25;
    goto LAB_00052b7e;
  default:
    goto switchD_0005275e_caseD_26;
  case 0x41:
    param_5 = param_5 + param_6->tm_wday * 0x48;
    uVar1 = *(undefined4 *)(param_5 + 0x2b0);
    iVar4 = 0x2b4;
    goto LAB_00052b1e;
  case 0x42:
    param_5 = param_5 + param_6->tm_mon * 0x48;
    uVar1 = *(undefined4 *)(param_5 + 0x808);
    iVar4 = 0x80c;
    goto LAB_00052b1e;
  case 0x43:
    iVar4 = param_6->tm_mday;
    goto LAB_00052a90;
  case 0x44:
    iVar4 = param_5 + 0x18;
    goto LAB_00052b6c;
  case 0x47:
  case 0x67:
    iVar3 = param_6->tm_year;
    iVar5 = param_6->tm_wday;
    iVar8 = param_6->tm_yday;
    uVar2 = iVar3 + 0x76c;
    __aeabi_idivmod((iVar8 + 0x17e) - iVar5,7);
    iVar4 = (iVar8 + 3) - extraout_r1;
    if (iVar4 < 0) {
      uVar12 = iVar3 + 0x76b;
      iVar4 = 0x16d;
      if ((uVar12 & 3) == 0) {
        __aeabi_idivmod(uVar12,100);
        iVar4 = 0x16e;
        if (extraout_r1_07 == 0) {
          __aeabi_idivmod(uVar12,400);
          iVar4 = 0x16e;
          if (extraout_r1_08 != 0) {
            iVar4 = 0x16d;
          }
        }
      }
      __aeabi_idivmod((iVar4 + iVar8 + 0x17e) - iVar5,7);
      iVar4 = (iVar4 + iVar8 + 3) - extraout_r1_09;
    }
    else {
      iVar9 = 0x16d;
      if ((uVar2 & 3) == 0) {
        __aeabi_idivmod(uVar2,100);
        iVar9 = 0x16e;
        if (extraout_r1_00 == 0) {
          __aeabi_idivmod(uVar2,400);
          iVar9 = 0x16e;
          if (extraout_r1_01 != 0) {
            iVar9 = 0x16d;
          }
        }
      }
      __aeabi_idivmod(((iVar8 - iVar9) + 0x17e) - iVar5,7);
      iVar5 = ((iVar8 - iVar9) + 3) - extraout_r1_02;
      uVar12 = iVar3 + 0x76d;
      if (iVar5 < 0) {
        uVar12 = uVar2;
      }
      if (-1 < iVar5) {
        iVar4 = iVar5;
      }
    }
    if (param_3 != 0x47) {
      if (param_3 == 0x67) {
        __aeabi_idivmod(uVar12,100);
        __aeabi_idivmod(extraout_r1_03 + 100,100);
        uVar12 = extraout_r1_04;
      }
      else {
        iVar4 = __divsi3(iVar4,7);
        uVar12 = iVar4 + 1;
      }
    }
    iVar4 = FUN_00050030(acStack_154,0,uVar12);
    (**(code **)(*param_2 + 0x2c))(param_2,acStack_154,iVar4,local_114);
    iVar4 = iVar4 - (int)acStack_154;
    goto LAB_00052e3e;
  case 0x48:
    if (param_4 == 0x23) {
      pcVar7 = "%ld";
    }
    else {
      pcVar7 = "%.2ld";
    }
    sprintf(acStack_154,pcVar7,param_6->tm_hour);
    iVar4 = param_6->tm_hour;
    goto LAB_00052d1e;
  case 0x49:
    if (param_4 == 0x23) {
      pcVar7 = "%ld";
    }
    else {
      pcVar7 = "%.2ld";
    }
    __aeabi_idivmod(param_6->tm_hour,0xc);
    iVar4 = 0xc;
    if (extraout_r1_10 != 0) {
      iVar4 = extraout_r1_10;
    }
    sprintf(acStack_154,pcVar7,iVar4);
    __aeabi_idivmod(param_6->tm_hour,0xc);
    uVar2 = 1;
    if (extraout_r1_11 == 0) {
      uVar2 = 2;
    }
    if (9 < extraout_r1_11) {
      uVar2 = 2;
    }
    if (param_4 != 0x23) {
      uVar2 = 2;
    }
    uVar12 = (uint)acStack_154 | uVar2;
    pcVar11 = *(code **)(*param_2 + 0x2c);
    goto LAB_00052d44;
  case 0x4d:
    if (param_4 == 0x23) {
      pcVar7 = "%ld";
    }
    else {
      pcVar7 = "%.2ld";
    }
    sprintf(acStack_154,pcVar7,param_6->tm_min);
    iVar4 = param_6->tm_min;
    goto LAB_00052d1e;
  case 0x52:
    FUN_00031c38(local_114,&DAT_000648a8,auStack_158);
    FUN_0005467c(param_1,param_2,local_114,param_5,param_6);
    if (local_100 == local_114) {
      return;
    }
    if (local_100 == (int *)0x0) {
      return;
    }
    if ((uint)(local_114[0] - (int)local_100) < 0x81) {
      std::__node_alloc::_M_deallocate(local_100,local_114[0] - (int)local_100);
      return;
    }
    operator_delete(local_100);
    return;
  case 0x53:
    if (param_4 == 0x23) {
      pcVar7 = "%ld";
    }
    else {
      pcVar7 = "%.2ld";
    }
    sprintf(acStack_154,pcVar7,param_6->tm_sec);
    iVar4 = param_6->tm_sec;
    goto LAB_00052d1e;
  case 0x54:
    FUN_00031c38(local_18c,&DAT_00066294,auStack_190);
    FUN_0005467c(param_1,param_2,local_18c,param_5,param_6);
    if (local_178 == local_18c) {
      return;
    }
    if (local_178 == (int *)0x0) {
      return;
    }
    if ((uint)(local_18c[0] - (int)local_178) < 0x81) {
      std::__node_alloc::_M_deallocate(local_178,local_18c[0] - (int)local_178);
      return;
    }
    operator_delete(local_178);
    return;
  case 0x55:
    iVar4 = (param_6->tm_yday + 7) - param_6->tm_wday;
    goto LAB_00052ac8;
  case 0x57:
    iVar4 = 1;
    if (param_6->tm_wday != 0) {
      iVar4 = 8 - param_6->tm_wday;
    }
    iVar4 = param_6->tm_yday + iVar4;
LAB_00052ac8:
    tVar10 = __divsi3(iVar4,7);
    break;
  case 0x58:
    iVar4 = param_5;
    goto LAB_00052b6c;
  case 0x59:
    iVar4 = FUN_00050030(acStack_154,0,param_6->tm_year + 0x76c);
    goto LAB_00052e2a;
  case 0x61:
    param_5 = param_5 + param_6->tm_wday * 0x48;
    uVar1 = *(undefined4 *)(param_5 + 0xb8);
    iVar4 = 0xbc;
    goto LAB_00052b1e;
  case 0x62:
  case 0x68:
    param_5 = param_5 + param_6->tm_mon * 0x48;
    uVar1 = *(undefined4 *)(param_5 + 0x4a8);
    iVar4 = 0x4ac;
    goto LAB_00052b1e;
  case 99:
    iVar4 = param_5 + 0x30;
    iVar3 = param_5 + 0x60;
    goto LAB_00052b62;
  case 100:
    if (param_4 == 0x23) {
      pcVar7 = "%ld";
    }
    else {
      pcVar7 = "%.2ld";
    }
    sprintf(acStack_154,pcVar7,param_6->tm_mday);
    iVar4 = param_6->tm_mday;
LAB_00052d1e:
    uVar2 = 1;
    if (9 < iVar4) {
LAB_00052d26:
      uVar2 = 2;
    }
LAB_00052d28:
    if (param_4 != 0x23) {
      uVar2 = 2;
    }
    uVar12 = (uint)acStack_154 | uVar2;
    pcVar11 = *(code **)(*param_2 + 0x2c);
LAB_00052d44:
    (*pcVar11)(param_2,acStack_154,uVar12,local_114);
    piVar14 = local_114 + uVar2;
    goto LAB_00052e48;
  case 0x65:
    iVar4 = param_6->tm_mday;
    goto LAB_00052a90;
  case 0x6a:
    tVar10 = param_6->tm_yday + 1;
    break;
  case 0x6b:
    iVar4 = param_6->tm_hour;
    goto LAB_00052a90;
  case 0x6c:
    __aeabi_idivmod(param_6->tm_hour,0xc);
    iVar4 = extraout_r1_05;
LAB_00052a90:
    sprintf(acStack_154,"%2ld",iVar4);
    (**(code **)(*param_2 + 0x2c))(param_2,acStack_154,(uint)acStack_154 | 2,local_114);
    piVar14 = local_114 + 2;
    goto LAB_00052e48;
  case 0x6d:
    if (param_4 == 0x23) {
      pcVar7 = "%ld";
    }
    else {
      pcVar7 = "%.2ld";
    }
    sprintf(acStack_154,pcVar7,param_6->tm_mon + 1);
    uVar2 = 1;
    if (8 < param_6->tm_mon) goto LAB_00052d26;
    goto LAB_00052d28;
  case 0x6e:
    pcVar11 = *(code **)(*param_2 + 0x28);
    uVar1 = 10;
LAB_00052b7e:
    uVar1 = (*pcVar11)(param_2,uVar1);
    puVar6 = (undefined4 *)param_1[0x10];
    uVar2 = (int)puVar6 - param_1[0x112] >> 2;
    if (param_1 == (int *)param_1[0x112]) {
      uVar12 = 0x10 - ((int)puVar6 - (int)param_1 >> 2);
    }
    else {
      uVar12 = *param_1 - (int)puVar6 >> 2;
    }
    if (uVar12 < 2) {
      uVar12 = uVar2;
      if (uVar2 < 2) {
        uVar12 = 1;
      }
      uVar13 = uVar2 + uVar12 + 1;
      uVar12 = 0x3ffffffe;
      if (uVar2 <= uVar13) {
        uVar12 = uVar13;
      }
      uVar2 = 0x3ffffffe;
      if (uVar13 < 0x3fffffff) {
        uVar2 = uVar12;
      }
      FUN_000506a4(param_1,uVar2);
      puVar6 = (undefined4 *)param_1[0x10];
    }
    *puVar6 = uVar1;
    puVar6[1] = 0;
    param_1[0x10] = (int)(puVar6 + 1);
    return;
  case 0x70:
    iVar4 = __divsi3(param_6->tm_hour,0xc);
    param_5 = param_5 + iVar4 * 0x48;
    uVar1 = *(undefined4 *)(param_5 + 0xb68);
    iVar4 = 0xb6c;
LAB_00052b1e:
    FUN_00045484(param_1,*(undefined4 *)(param_5 + iVar4),uVar1,local_114);
    return;
  case 0x72:
    FUN_00031c38(local_170,&DAT_000662a4,auStack_174);
    FUN_0005467c(param_1,param_2,local_170,param_5,param_6);
    if (local_15c == local_170) {
      return;
    }
    if (local_15c == (int *)0x0) {
      return;
    }
    if ((uint)(local_170[0] - (int)local_15c) < 0x81) {
      std::__node_alloc::_M_deallocate(local_15c,local_170[0] - (int)local_15c);
      return;
    }
    operator_delete(local_15c);
    return;
  case 0x73:
    tVar10 = mktime(param_6);
    break;
  case 0x74:
    uVar1 = (**(code **)(*param_2 + 0x28))(param_2,9);
    puVar6 = (undefined4 *)param_1[0x10];
    uVar2 = (int)puVar6 - param_1[0x112] >> 2;
    if (param_1 == (int *)param_1[0x112]) {
      uVar12 = 0x10 - ((int)puVar6 - (int)param_1 >> 2);
    }
    else {
      uVar12 = *param_1 - (int)puVar6 >> 2;
    }
    if (uVar12 < 2) {
      uVar12 = uVar2;
      if (uVar2 < 2) {
        uVar12 = 1;
      }
      uVar13 = uVar2 + uVar12 + 1;
      uVar12 = 0x3ffffffe;
      if (uVar2 <= uVar13) {
        uVar12 = uVar13;
      }
      uVar2 = 0x3ffffffe;
      if (uVar13 < 0x3fffffff) {
        uVar2 = uVar12;
      }
      FUN_000506a4(param_1,uVar2);
      puVar6 = (undefined4 *)param_1[0x10];
    }
    *puVar6 = uVar1;
    puVar6[1] = 0;
    param_1[0x10] = (int)(puVar6 + 1);
    goto LAB_00052e0e;
  case 0x75:
LAB_00052e0e:
    __aeabi_idivmod(param_6->tm_wday + 6,7);
    tVar10 = extraout_r1_12 + 1;
    break;
  case 0x77:
    tVar10 = param_6->tm_wday;
    break;
  case 0x78:
    iVar4 = param_5 + 0x18;
    iVar3 = param_5 + 0x48;
LAB_00052b62:
    if (param_4 == 0x23) {
      iVar4 = iVar3;
    }
LAB_00052b6c:
    FUN_0005467c(param_1,param_2,iVar4,param_5,param_6);
    return;
  case 0x79:
    __aeabi_idivmod(param_6->tm_year + 0x76c,100);
    tVar10 = extraout_r1_06;
  }
  iVar4 = FUN_00050030(acStack_154,0,tVar10);
LAB_00052e2a:
  (**(code **)(*param_2 + 0x2c))(param_2,acStack_154,iVar4,local_114);
  iVar4 = iVar4 - (int)acStack_154;
LAB_00052e3e:
  piVar14 = local_114 + iVar4;
LAB_00052e48:
  FUN_0005473c(param_1,local_114,piVar14,local_170);
switchD_0005275e_caseD_26:
  return;
}



### FUNC time_init @ 00052f04

/* WARNING: Removing unreachable block (ram,0x00052fb4) */
/* WARNING: Removing unreachable block (ram,0x00053050) */
/* std::priv::time_init<char>::time_init() */

int std::priv::time_init<char>::time_init(void)

{
  int iVar1;
  char *pcVar2;
  size_t sVar3;
  int iVar4;
  undefined1 *puVar5;
  int iVar6;
  undefined1 *puVar7;
  int *piVar8;
  int iVar9;
  
  iVar1 = FUN_00053160();
  iVar9 = 0;
  *(undefined4 *)(iVar1 + 0x438) = 0;
  piVar8 = (int *)(iVar1 + 0x8c);
  do {
    pcVar2 = &DAT_000665ee + iVar9;
    sVar3 = strlen(pcVar2);
    iVar6 = piVar8[-1];
    iVar4 = *piVar8;
    if ((uint)(iVar6 - iVar4) < sVar3) {
      if (iVar6 != iVar4) {
        __aeabi_memmove(iVar4,pcVar2);
        iVar6 = piVar8[-1];
        iVar4 = *piVar8;
      }
      FUN_00037294(piVar8 + -5,&DAT_000665ee + iVar9 + (iVar6 - iVar4),&DAT_000665ee + sVar3 + iVar9
                  );
    }
    else {
      if (sVar3 != 0) {
        __aeabi_memmove(iVar4,pcVar2,sVar3);
        iVar6 = piVar8[-1];
        iVar4 = *piVar8;
      }
      iVar4 = iVar4 + sVar3;
      if (iVar4 != iVar6) {
        __aeabi_memmove(iVar4,iVar6);
        piVar8[-1] = piVar8[-1] + (iVar4 - iVar6);
      }
    }
    iVar9 = iVar9 + 0xe;
    piVar8 = piVar8 + 6;
  } while (iVar9 != 0xc4);
  piVar8 = (int *)(iVar1 + 0x1dc);
  pcVar2 = "Jan";
  iVar9 = 0x18;
  do {
    sVar3 = strlen(pcVar2);
    iVar6 = piVar8[-1];
    iVar4 = *piVar8;
    if ((uint)(iVar6 - iVar4) < sVar3) {
      if (iVar6 != iVar4) {
        __aeabi_memmove(iVar4,pcVar2);
        iVar6 = piVar8[-1];
        iVar4 = *piVar8;
      }
      FUN_00037294(piVar8 + -5,pcVar2 + (iVar6 - iVar4),pcVar2 + sVar3);
    }
    else {
      if (sVar3 != 0) {
        __aeabi_memmove(iVar4,pcVar2,sVar3);
        iVar6 = piVar8[-1];
        iVar4 = *piVar8;
      }
      iVar4 = iVar4 + sVar3;
      if (iVar4 != iVar6) {
        __aeabi_memmove(iVar4,iVar6);
        piVar8[-1] = piVar8[-1] + (iVar4 - iVar6);
      }
    }
    iVar9 = iVar9 + -1;
    pcVar2 = pcVar2 + 0x18;
    piVar8 = piVar8 + 6;
  } while (iVar9 != 0);
  puVar5 = *(undefined1 **)(iVar1 + 0x41c);
  puVar7 = *(undefined1 **)(iVar1 + 0x418);
  piVar8 = (int *)(iVar1 + 0x418);
  if ((uint)((int)puVar7 - (int)puVar5) < 2) {
    if (puVar7 != puVar5) {
      __aeabi_memcpy(puVar5,&DAT_00053148);
      puVar5 = *(undefined1 **)(iVar1 + 0x41c);
      puVar7 = (undefined1 *)*piVar8;
    }
    FUN_00037294(iVar1 + 0x408,&DAT_00053148 + ((int)puVar7 - (int)puVar5),&DAT_0005314a);
  }
  else {
    *puVar5 = 0x41;
    puVar5[1] = 0x4d;
    puVar5 = (undefined1 *)*piVar8;
    puVar7 = (undefined1 *)(*(int *)(iVar1 + 0x41c) + 2);
    if (puVar7 != puVar5) {
      *puVar7 = *puVar5;
      *piVar8 = (int)(puVar7 + (*piVar8 - (int)puVar5));
    }
  }
  puVar5 = *(undefined1 **)(iVar1 + 0x434);
  puVar7 = *(undefined1 **)(iVar1 + 0x430);
  piVar8 = (int *)(iVar1 + 0x430);
  if ((uint)((int)puVar7 - (int)puVar5) < 2) {
    if (puVar7 != puVar5) {
      __aeabi_memcpy(puVar5,&DAT_00053150);
      puVar5 = *(undefined1 **)(iVar1 + 0x434);
      puVar7 = (undefined1 *)*piVar8;
    }
    FUN_00037294(iVar1 + 0x420,&DAT_00053150 + ((int)puVar7 - (int)puVar5),&DAT_00053152);
  }
  else {
    *puVar5 = 0x50;
    puVar5[1] = 0x4d;
    puVar5 = (undefined1 *)*piVar8;
    puVar7 = (undefined1 *)(*(int *)(iVar1 + 0x434) + 2);
    if (puVar7 != puVar5) {
      *puVar7 = *puVar5;
      *piVar8 = (int)(puVar7 + (*piVar8 - (int)puVar5));
    }
  }
  FUN_0005404c(iVar1);
  return iVar1;
}



### FUNC FUN_00053160 @ 00053160

void FUN_00053160(undefined1 *param_1)

{
  undefined1 *puVar1;
  int iVar2;
  
  param_1[0x30] = 0;
  param_1[0x48] = 0;
  param_1[0x60] = 0;
  *(undefined1 **)(param_1 + 0x8c) = param_1 + 0x78;
  *(undefined1 **)(param_1 + 0x88) = param_1 + 0x78;
  *param_1 = 0;
  param_1[0x18] = 0;
  *(undefined1 **)(param_1 + 0x28) = param_1 + 0x18;
  *(undefined1 **)(param_1 + 0x2c) = param_1 + 0x18;
  *(undefined1 **)(param_1 + 0x40) = param_1 + 0x30;
  *(undefined1 **)(param_1 + 0x44) = param_1 + 0x30;
  *(undefined1 **)(param_1 + 0x58) = param_1 + 0x48;
  *(undefined1 **)(param_1 + 0x5c) = param_1 + 0x48;
  *(undefined1 **)(param_1 + 0x70) = param_1 + 0x60;
  *(undefined1 **)(param_1 + 0x74) = param_1 + 0x60;
  *(undefined1 **)(param_1 + 0x10) = param_1;
  *(undefined1 **)(param_1 + 0x14) = param_1;
  *(undefined1 **)(param_1 + 0xa4) = param_1 + 0x90;
  *(undefined1 **)(param_1 + 0xa0) = param_1 + 0x90;
  param_1[0x78] = 0;
  param_1[0x90] = 0;
  *(undefined1 **)(param_1 + 0xbc) = param_1 + 0xa8;
  *(undefined1 **)(param_1 + 0xb8) = param_1 + 0xa8;
  param_1[0xa8] = 0;
  *(undefined1 **)(param_1 + 0xd4) = param_1 + 0xc0;
  *(undefined1 **)(param_1 + 0xd0) = param_1 + 0xc0;
  param_1[0xc0] = 0;
  *(undefined1 **)(param_1 + 0xec) = param_1 + 0xd8;
  *(undefined1 **)(param_1 + 0xe8) = param_1 + 0xd8;
  param_1[0xd8] = 0;
  *(undefined1 **)(param_1 + 0x104) = param_1 + 0xf0;
  *(undefined1 **)(param_1 + 0x100) = param_1 + 0xf0;
  param_1[0xf0] = 0;
  *(undefined1 **)(param_1 + 0x11c) = param_1 + 0x108;
  *(undefined1 **)(param_1 + 0x118) = param_1 + 0x108;
  param_1[0x108] = 0;
  *(undefined1 **)(param_1 + 0x134) = param_1 + 0x120;
  *(undefined1 **)(param_1 + 0x130) = param_1 + 0x120;
  param_1[0x120] = 0;
  *(undefined1 **)(param_1 + 0x14c) = param_1 + 0x138;
  *(undefined1 **)(param_1 + 0x148) = param_1 + 0x138;
  param_1[0x138] = 0;
  *(undefined1 **)(param_1 + 0x164) = param_1 + 0x150;
  *(undefined1 **)(param_1 + 0x160) = param_1 + 0x150;
  param_1[0x150] = 0;
  *(undefined1 **)(param_1 + 0x17c) = param_1 + 0x168;
  *(undefined1 **)(param_1 + 0x178) = param_1 + 0x168;
  param_1[0x168] = 0;
  *(undefined1 **)(param_1 + 0x194) = param_1 + 0x180;
  *(undefined1 **)(param_1 + 400) = param_1 + 0x180;
  param_1[0x180] = 0;
  *(undefined1 **)(param_1 + 0x1ac) = param_1 + 0x198;
  *(undefined1 **)(param_1 + 0x1a8) = param_1 + 0x198;
  param_1[0x198] = 0;
  *(undefined1 **)(param_1 + 0x1c4) = param_1 + 0x1b0;
  *(undefined1 **)(param_1 + 0x1c0) = param_1 + 0x1b0;
  param_1[0x1b0] = 0;
  puVar1 = param_1 + 0x1c8;
  iVar2 = 0x18;
  do {
    *puVar1 = 0;
    *(undefined1 **)(puVar1 + 0x10) = puVar1;
    *(undefined1 **)(puVar1 + 0x14) = puVar1;
    iVar2 = iVar2 + -1;
    puVar1 = puVar1 + 0x18;
  } while (iVar2 != 0);
  *(undefined1 **)(param_1 + 0x41c) = param_1 + 0x408;
  *(undefined1 **)(param_1 + 0x418) = param_1 + 0x408;
  param_1[0x408] = 0;
  param_1[0x420] = 0;
  *(undefined1 **)(param_1 + 0x434) = param_1 + 0x420;
  *(undefined1 **)(param_1 + 0x430) = param_1 + 0x420;
  return;
}



### FUNC time_init @ 000532e0

/* std::priv::time_init<char>::time_init(char const*) */

time_init<char> * __thiscall
std::priv::time_init<char>::time_init(time_init<char> *this,char *param_1)

{
  int iVar1;
  undefined4 uVar2;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  local_14 = param_1;
  FUN_00053160();
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a3cc(&local_14,auStack_118,0,&local_18);
    if (iVar1 != 0) {
      FUN_00053350(this,iVar1);
      uVar2 = FUN_000536e8(iVar1);
      *(undefined4 *)(this + 0x438) = uVar2;
      FUN_0004a698(iVar1);
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"time");
  FUN_00039fc0(this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC FUN_00053350 @ 00053350

/* WARNING: Removing unreachable block (ram,0x00053630) */
/* WARNING: Removing unreachable block (ram,0x000534f4) */
/* WARNING: Removing unreachable block (ram,0x000533ce) */
/* WARNING: Removing unreachable block (ram,0x0005346a) */
/* WARNING: Removing unreachable block (ram,0x0005358c) */
/* WARNING: Removing unreachable block (ram,0x000536ca) */

void FUN_00053350(int param_1,undefined4 param_2)

{
  char *pcVar1;
  size_t sVar2;
  int iVar3;
  int iVar4;
  int *piVar5;
  int iVar6;
  int iVar7;
  
  iVar7 = param_1 + 0x78;
  iVar6 = 0;
  do {
    pcVar1 = (char *)FUN_0004de78(param_2,iVar6);
    sVar2 = strlen(pcVar1);
    iVar4 = *(int *)(iVar7 + 0x10);
    iVar3 = *(int *)(iVar7 + 0x14);
    if ((uint)(iVar4 - iVar3) < sVar2) {
      if (iVar4 != iVar3) {
        __aeabi_memmove(iVar3,pcVar1);
        iVar4 = *(int *)(iVar7 + 0x10);
        iVar3 = *(int *)(iVar7 + 0x14);
      }
      FUN_00037294(iVar7,pcVar1 + (iVar4 - iVar3),pcVar1 + sVar2);
    }
    else {
      if (sVar2 != 0) {
        __aeabi_memmove(iVar3,pcVar1,sVar2);
        iVar4 = *(int *)(iVar7 + 0x10);
        iVar3 = *(int *)(iVar7 + 0x14);
      }
      iVar3 = iVar3 + sVar2;
      if (iVar3 != iVar4) {
        __aeabi_memmove(iVar3,iVar4);
        *(int *)(iVar7 + 0x10) = *(int *)(iVar7 + 0x10) + (iVar3 - iVar4);
      }
    }
    iVar7 = iVar7 + 0x18;
    iVar6 = iVar6 + 1;
  } while (iVar6 != 7);
  piVar5 = (int *)(param_1 + 0x134);
  iVar6 = 0;
  do {
    pcVar1 = (char *)FUN_0004de68(param_2);
    sVar2 = strlen(pcVar1);
    iVar3 = piVar5[-1];
    iVar7 = *piVar5;
    if ((uint)(iVar3 - iVar7) < sVar2) {
      if (iVar3 != iVar7) {
        __aeabi_memmove(iVar7,pcVar1);
        iVar3 = piVar5[-1];
        iVar7 = *piVar5;
      }
      FUN_00037294(piVar5 + -5,pcVar1 + (iVar3 - iVar7),pcVar1 + sVar2);
    }
    else {
      if (sVar2 != 0) {
        __aeabi_memmove(iVar7,pcVar1,sVar2);
        iVar3 = piVar5[-1];
        iVar7 = *piVar5;
      }
      iVar7 = iVar7 + sVar2;
      if (iVar7 != iVar3) {
        __aeabi_memmove(iVar7);
        piVar5[-1] = piVar5[-1] + (iVar7 - iVar3);
      }
    }
    piVar5 = piVar5 + 6;
    iVar6 = iVar6 + 1;
  } while (iVar6 != 7);
  iVar7 = param_1 + 0x1c8;
  iVar6 = 0;
  do {
    pcVar1 = (char *)FUN_0004de58(param_2,iVar6);
    sVar2 = strlen(pcVar1);
    iVar4 = *(int *)(iVar7 + 0x10);
    iVar3 = *(int *)(iVar7 + 0x14);
    if ((uint)(iVar4 - iVar3) < sVar2) {
      if (iVar4 != iVar3) {
        __aeabi_memmove(iVar3,pcVar1);
        iVar4 = *(int *)(iVar7 + 0x10);
        iVar3 = *(int *)(iVar7 + 0x14);
      }
      FUN_00037294(iVar7,pcVar1 + (iVar4 - iVar3),pcVar1 + sVar2);
    }
    else {
      if (sVar2 != 0) {
        __aeabi_memmove(iVar3,pcVar1,sVar2);
        iVar4 = *(int *)(iVar7 + 0x10);
        iVar3 = *(int *)(iVar7 + 0x14);
      }
      iVar3 = iVar3 + sVar2;
      if (iVar3 != iVar4) {
        __aeabi_memmove(iVar3,iVar4);
        *(int *)(iVar7 + 0x10) = *(int *)(iVar7 + 0x10) + (iVar3 - iVar4);
      }
    }
    iVar7 = iVar7 + 0x18;
    iVar6 = iVar6 + 1;
  } while (iVar6 != 0xc);
  piVar5 = (int *)(param_1 + 0x2fc);
  iVar6 = 0;
  do {
    pcVar1 = (char *)FUN_0004de48(param_2);
    sVar2 = strlen(pcVar1);
    iVar3 = piVar5[-1];
    iVar7 = *piVar5;
    if ((uint)(iVar3 - iVar7) < sVar2) {
      if (iVar3 != iVar7) {
        __aeabi_memmove(iVar7,pcVar1);
        iVar3 = piVar5[-1];
        iVar7 = *piVar5;
      }
      FUN_00037294(piVar5 + -5,pcVar1 + (iVar3 - iVar7),pcVar1 + sVar2);
    }
    else {
      if (sVar2 != 0) {
        __aeabi_memmove(iVar7,pcVar1,sVar2);
        iVar3 = piVar5[-1];
        iVar7 = *piVar5;
      }
      iVar7 = iVar7 + sVar2;
      if (iVar7 != iVar3) {
        __aeabi_memmove(iVar7,iVar3);
        piVar5[-1] = piVar5[-1] + (iVar7 - iVar3);
      }
    }
    piVar5 = piVar5 + 6;
    iVar6 = iVar6 + 1;
  } while (iVar6 != 0xc);
  pcVar1 = (char *)FUN_0004dec8(param_2);
  sVar2 = strlen(pcVar1);
  iVar6 = *(int *)(param_1 + 0x41c);
  iVar7 = *(int *)(param_1 + 0x418);
  piVar5 = (int *)(param_1 + 0x418);
  if ((uint)(iVar7 - iVar6) < sVar2) {
    if (iVar7 != iVar6) {
      __aeabi_memmove(iVar6,pcVar1);
      iVar6 = *(int *)(param_1 + 0x41c);
      iVar7 = *piVar5;
    }
    FUN_00037294(param_1 + 0x408,pcVar1 + (iVar7 - iVar6),pcVar1 + sVar2);
  }
  else {
    if (sVar2 != 0) {
      __aeabi_memmove(iVar6,pcVar1,sVar2);
      iVar7 = *piVar5;
      iVar6 = *(int *)(param_1 + 0x41c);
    }
    iVar6 = iVar6 + sVar2;
    if (iVar6 != iVar7) {
      __aeabi_memmove(iVar6);
      *piVar5 = *piVar5 + (iVar6 - iVar7);
    }
  }
  pcVar1 = (char *)FUN_0004ded0(param_2);
  sVar2 = strlen(pcVar1);
  iVar6 = *(int *)(param_1 + 0x434);
  iVar7 = *(int *)(param_1 + 0x430);
  piVar5 = (int *)(param_1 + 0x430);
  if ((uint)(iVar7 - iVar6) < sVar2) {
    if (iVar7 != iVar6) {
      __aeabi_memmove(iVar6,pcVar1);
      iVar6 = *(int *)(param_1 + 0x434);
      iVar7 = *piVar5;
    }
    FUN_00037294(param_1 + 0x420,pcVar1 + (iVar7 - iVar6),pcVar1 + sVar2);
  }
  else {
    if (sVar2 != 0) {
      __aeabi_memmove(iVar6,pcVar1,sVar2);
      iVar7 = *piVar5;
      iVar6 = *(int *)(param_1 + 0x434);
    }
    iVar6 = iVar6 + sVar2;
    if (iVar6 != iVar7) {
      __aeabi_memmove(iVar6);
      *piVar5 = *piVar5 + (iVar6 - iVar7);
    }
  }
  FUN_00054198(param_1,param_2);
  return;
}



### FUNC FUN_000536e8 @ 000536e8

undefined4 FUN_000536e8(void)

{
  char cVar1;
  char cVar2;
  char cVar3;
  int iVar4;
  undefined4 uVar5;
  char *pcVar6;
  char *pcVar7;
  bool bVar8;
  
  iVar4 = FUN_0004de94();
  pcVar6 = (char *)(iVar4 + -1);
  do {
    pcVar7 = pcVar6;
    cVar1 = pcVar7[1];
    pcVar6 = pcVar7 + 1;
    if (cVar1 == '%') break;
  } while (cVar1 != '\0');
  uVar5 = 0;
  if (cVar1 != '\0') {
    cVar1 = pcVar7[2];
    bVar8 = cVar1 == '\0';
    if ((cVar1 != '%') && (pcVar7 = pcVar7 + 3, !bVar8)) {
      do {
        pcVar6 = pcVar7;
        bVar8 = *pcVar6 == '\0';
        if (*pcVar6 == '%') break;
        pcVar7 = pcVar6 + 1;
      } while (!bVar8);
      pcVar6 = pcVar6 + -1;
    }
    uVar5 = 0;
    if (!bVar8) {
      pcVar7 = pcVar6 + 2;
      cVar2 = pcVar6[2];
      cVar3 = cVar2;
      while ((cVar3 != '%' && (cVar3 != '\0'))) {
        pcVar6 = pcVar7 + 1;
        pcVar7 = pcVar7 + 1;
        cVar3 = *pcVar6;
      }
      uVar5 = 0;
      if (cVar3 != '\0') {
        cVar3 = pcVar7[1];
        if (cVar1 == 'y') {
          if (cVar2 == 'm') {
            uVar5 = 3;
            if (cVar3 != 'd') {
              return 0;
            }
          }
          else if ((cVar2 == 'd') && (uVar5 = 4, cVar3 != 'm')) {
            return 0;
          }
        }
        else if (cVar1 == 'm') {
          uVar5 = 2;
          if (cVar2 != 'd' || cVar3 != 'y') {
            return 0;
          }
        }
        else if ((cVar1 == 'd') && (uVar5 = 1, cVar2 != 'm' || cVar3 != 'y')) {
          return 0;
        }
      }
    }
  }
  return uVar5;
}



### FUNC time_init @ 000537f2

/* std::priv::time_init<char>::time_init(_Locale_time*) */

time_init<char> * __thiscall
std::priv::time_init<char>::time_init(time_init<char> *this,_Locale_time *param_1)

{
  undefined4 uVar1;
  
  uVar1 = FUN_00053160();
  FUN_00053350(uVar1,param_1);
  uVar1 = FUN_000536e8(param_1);
  *(undefined4 *)(this + 0x438) = uVar1;
  return this;
}



### FUNC time_init @ 00053828

/* std::priv::time_init<wchar_t>::time_init() */

int std::priv::time_init<wchar_t>::time_init(void)

{
  int iVar1;
  size_t sVar2;
  int iVar3;
  int iVar4;
  wchar_t *__s;
  
  iVar1 = FUN_00053b3c();
  *(undefined4 *)(iVar1 + 3000) = 0;
  sVar2 = wcslen(L"Sun");
  FUN_0004413c(iVar1 + 0x78,&DAT_000668f4,&DAT_000668f4 + sVar2 * 4);
  sVar2 = wcslen(L"Mon");
  FUN_0004413c(iVar1 + 0xc0,&DAT_0006692c,&DAT_0006692c + sVar2 * 4);
  sVar2 = wcslen(L"Tue");
  FUN_0004413c(iVar1 + 0x108,&DAT_00066964,&DAT_00066964 + sVar2 * 4);
  sVar2 = wcslen(L"Wed");
  FUN_0004413c(iVar1 + 0x150,&DAT_0006699c,&DAT_0006699c + sVar2 * 4);
  sVar2 = wcslen(L"Thu");
  FUN_0004413c(iVar1 + 0x198,&DAT_000669d4,&DAT_000669d4 + sVar2 * 4);
  sVar2 = wcslen(L"Fri");
  FUN_0004413c(iVar1 + 0x1e0,&DAT_00066a0c,&DAT_00066a0c + sVar2 * 4);
  sVar2 = wcslen(L"Sat");
  FUN_0004413c(iVar1 + 0x228,&DAT_00066a44,&DAT_00066a44 + sVar2 * 4);
  sVar2 = wcslen(L"Sunday");
  FUN_0004413c(iVar1 + 0x270,L"Sunday",L"Sunday" + sVar2);
  sVar2 = wcslen(L"Monday");
  FUN_0004413c(iVar1 + 0x2b8,L"Monday",L"Monday" + sVar2);
  sVar2 = wcslen(L"Tuesday");
  FUN_0004413c(iVar1 + 0x300,L"Tuesday",L"Tuesday" + sVar2);
  sVar2 = wcslen(L"Wednesday");
  FUN_0004413c(iVar1 + 0x348,L"Wednesday",L"Wednesday" + sVar2);
  sVar2 = wcslen(L"Thursday");
  FUN_0004413c(iVar1 + 0x390,L"Thursday",L"Thursday" + sVar2);
  sVar2 = wcslen(L"Friday");
  FUN_0004413c(iVar1 + 0x3d8,L"Friday",L"Friday" + sVar2);
  sVar2 = wcslen(L"Saturday");
  FUN_0004413c(iVar1 + 0x420,L"Saturday",L"Saturday" + sVar2);
  iVar4 = iVar1 + 0x468;
  iVar3 = 0x18;
  __s = L"Jan";
  do {
    sVar2 = wcslen(__s);
    FUN_0004413c(iVar4,__s,__s + sVar2);
    __s = __s + 0x18;
    iVar3 = iVar3 + -1;
    iVar4 = iVar4 + 0x48;
  } while (iVar3 != 0);
  sVar2 = wcslen(L"AM");
  FUN_0004413c(iVar1 + 0xb28,&DAT_00053b20,&DAT_00053b20 + sVar2 * 4);
  sVar2 = wcslen(L"PM");
  FUN_0004413c(iVar1 + 0xb70,&DAT_00053b30,&DAT_00053b30 + sVar2 * 4);
  FUN_0005404c(iVar1);
  return iVar1;
}



### FUNC FUN_00053b3c @ 00053b3c

void FUN_00053b3c(undefined1 *param_1)

{
  undefined4 *puVar1;
  int iVar2;
  
  param_1[0x30] = 0;
  param_1[0x48] = 0;
  param_1[0x60] = 0;
  *(undefined1 **)(param_1 + 0xbc) = param_1 + 0x78;
  *(undefined1 **)(param_1 + 0xb8) = param_1 + 0x78;
  *param_1 = 0;
  param_1[0x18] = 0;
  *(undefined1 **)(param_1 + 0x28) = param_1 + 0x18;
  *(undefined1 **)(param_1 + 0x2c) = param_1 + 0x18;
  *(undefined1 **)(param_1 + 0x40) = param_1 + 0x30;
  *(undefined1 **)(param_1 + 0x44) = param_1 + 0x30;
  *(undefined1 **)(param_1 + 0x58) = param_1 + 0x48;
  *(undefined1 **)(param_1 + 0x5c) = param_1 + 0x48;
  *(undefined1 **)(param_1 + 0x74) = param_1 + 0x60;
  *(undefined1 **)(param_1 + 0x70) = param_1 + 0x60;
  *(undefined1 **)(param_1 + 0x10) = param_1;
  *(undefined1 **)(param_1 + 0x14) = param_1;
  *(undefined1 **)(param_1 + 0x104) = param_1 + 0xc0;
  *(undefined1 **)(param_1 + 0x100) = param_1 + 0xc0;
  *(undefined4 *)(param_1 + 0xc0) = 0;
  *(undefined1 **)(param_1 + 0x14c) = param_1 + 0x108;
  *(undefined1 **)(param_1 + 0x148) = param_1 + 0x108;
  *(undefined4 *)(param_1 + 0x108) = 0;
  *(undefined1 **)(param_1 + 0x194) = param_1 + 0x150;
  *(undefined1 **)(param_1 + 400) = param_1 + 0x150;
  *(undefined4 *)(param_1 + 0x150) = 0;
  *(undefined1 **)(param_1 + 0x1dc) = param_1 + 0x198;
  *(undefined1 **)(param_1 + 0x1d8) = param_1 + 0x198;
  *(undefined4 *)(param_1 + 0x198) = 0;
  *(undefined1 **)(param_1 + 0x224) = param_1 + 0x1e0;
  *(undefined1 **)(param_1 + 0x220) = param_1 + 0x1e0;
  *(undefined4 *)(param_1 + 0x1e0) = 0;
  *(undefined1 **)(param_1 + 0x26c) = param_1 + 0x228;
  *(undefined1 **)(param_1 + 0x268) = param_1 + 0x228;
  *(undefined4 *)(param_1 + 0x228) = 0;
  *(undefined4 *)(param_1 + 0x78) = 0;
  *(undefined1 **)(param_1 + 0x2b4) = param_1 + 0x270;
  *(undefined1 **)(param_1 + 0x2b0) = param_1 + 0x270;
  *(undefined4 *)(param_1 + 0x270) = 0;
  *(undefined1 **)(param_1 + 0x2fc) = param_1 + 0x2b8;
  *(undefined1 **)(param_1 + 0x2f8) = param_1 + 0x2b8;
  *(undefined4 *)(param_1 + 0x2b8) = 0;
  *(undefined1 **)(param_1 + 0x344) = param_1 + 0x300;
  *(undefined1 **)(param_1 + 0x340) = param_1 + 0x300;
  *(undefined4 *)(param_1 + 0x300) = 0;
  *(undefined1 **)(param_1 + 0x38c) = param_1 + 0x348;
  *(undefined1 **)(param_1 + 0x388) = param_1 + 0x348;
  *(undefined4 *)(param_1 + 0x348) = 0;
  *(undefined1 **)(param_1 + 0x3d4) = param_1 + 0x390;
  *(undefined1 **)(param_1 + 0x3d0) = param_1 + 0x390;
  *(undefined4 *)(param_1 + 0x390) = 0;
  *(undefined1 **)(param_1 + 0x41c) = param_1 + 0x3d8;
  *(undefined1 **)(param_1 + 0x418) = param_1 + 0x3d8;
  *(undefined4 *)(param_1 + 0x3d8) = 0;
  *(undefined1 **)(param_1 + 0x464) = param_1 + 0x420;
  *(undefined1 **)(param_1 + 0x460) = param_1 + 0x420;
  *(undefined4 *)(param_1 + 0x420) = 0;
  puVar1 = (undefined4 *)(param_1 + 0x468);
  iVar2 = 0x18;
  do {
    *puVar1 = 0;
    puVar1[0x10] = puVar1;
    puVar1[0x11] = puVar1;
    iVar2 = iVar2 + -1;
    puVar1 = puVar1 + 0x12;
  } while (iVar2 != 0);
  *(undefined1 **)(param_1 + 0xb6c) = param_1 + 0xb28;
  *(undefined1 **)(param_1 + 0xb68) = param_1 + 0xb28;
  *(undefined4 *)(param_1 + 0xb28) = 0;
  *(undefined4 *)(param_1 + 0xb70) = 0;
  *(undefined1 **)(param_1 + 0xbb4) = param_1 + 0xb70;
  *(undefined1 **)(param_1 + 0xbb0) = param_1 + 0xb70;
  return;
}



### FUNC time_init @ 00053cd4

/* std::priv::time_init<wchar_t>::time_init(char const*) */

time_init<wchar_t> * __thiscall
std::priv::time_init<wchar_t>::time_init(time_init<wchar_t> *this,char *param_1)

{
  int iVar1;
  undefined4 uVar2;
  undefined1 auStack_118 [256];
  int local_18;
  char *local_14;
  
  local_14 = param_1;
  FUN_00053b3c();
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a3cc(&local_14,auStack_118,0,&local_18);
    if (iVar1 != 0) {
      FUN_00053d48(this,iVar1);
      uVar2 = FUN_000536e8(iVar1);
      *(undefined4 *)(this + 3000) = uVar2;
      FUN_0004a698(iVar1);
      return this;
    }
  }
  uVar2 = locale::_M_throw_on_creation_failure(local_18,local_14,"time");
  FUN_0003b28c(this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar2);
}



### FUNC FUN_00053d48 @ 00053d48

void FUN_00053d48(int param_1,undefined4 param_2)

{
  wchar_t *pwVar1;
  size_t sVar2;
  int iVar3;
  int iVar4;
  undefined1 auStack_214 [512];
  
  iVar4 = 0;
  pwVar1 = (wchar_t *)FUN_0004df08(param_2,0);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x78,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004df08(param_2,1,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0xc0,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004df08(param_2,2,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x108,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004df08(param_2,3,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x150,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004df08(param_2,4,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x198,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004df08(param_2,5,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x1e0,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004df08(param_2,6,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x228,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004def8(param_2,0,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x270,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004def8(param_2,1,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x2b8,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004def8(param_2,2,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x300,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004def8(param_2,3,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x348,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004def8(param_2,4,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x390,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004def8(param_2,5,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x3d8,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004def8(param_2,6,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0x420,pwVar1,pwVar1 + sVar2);
  iVar3 = param_1 + 0x468;
  do {
    pwVar1 = (wchar_t *)FUN_0004dee8(param_2,iVar4,auStack_214,0x80);
    sVar2 = wcslen(pwVar1);
    FUN_0004413c(iVar3,pwVar1,pwVar1 + sVar2);
    iVar3 = iVar3 + 0x48;
    iVar4 = iVar4 + 1;
  } while (iVar4 != 0xc);
  iVar3 = param_1 + 0x7c8;
  iVar4 = 0;
  do {
    pwVar1 = (wchar_t *)FUN_0004ded8(param_2,iVar4,auStack_214,0x80);
    sVar2 = wcslen(pwVar1);
    FUN_0004413c(iVar3,pwVar1,pwVar1 + sVar2);
    iVar3 = iVar3 + 0x48;
    iVar4 = iVar4 + 1;
  } while (iVar4 != 0xc);
  pwVar1 = (wchar_t *)FUN_0004df18(param_2);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0xb28,pwVar1,pwVar1 + sVar2);
  pwVar1 = (wchar_t *)FUN_0004df28(param_2,auStack_214,0x80);
  sVar2 = wcslen(pwVar1);
  FUN_0004413c(param_1 + 0xb70,pwVar1,pwVar1 + sVar2);
  FUN_00054198(param_1,param_2);
  return;
}



### FUNC time_init @ 00054014

/* std::priv::time_init<wchar_t>::time_init(_Locale_time*) */

time_init<wchar_t> * __thiscall
std::priv::time_init<wchar_t>::time_init(time_init<wchar_t> *this,_Locale_time *param_1)

{
  undefined4 uVar1;
  
  uVar1 = FUN_00053b3c();
  FUN_00053d48(uVar1,param_1);
  uVar1 = FUN_000536e8(param_1);
  *(undefined4 *)(this + 3000) = uVar1;
  return this;
}



### FUNC FUN_0005404c @ 0005404c

void FUN_0005404c(int param_1)

{
  undefined1 *puVar1;
  undefined1 *puVar2;
  
  puVar2 = *(undefined1 **)(param_1 + 0x10);
  puVar1 = *(undefined1 **)(param_1 + 0x14);
  if ((uint)((int)puVar2 - (int)puVar1) < 8) {
    if (puVar2 != puVar1) {
      __aeabi_memcpy(puVar1,&DAT_00066294);
      puVar2 = *(undefined1 **)(param_1 + 0x10);
      puVar1 = *(undefined1 **)(param_1 + 0x14);
    }
    FUN_00037294(param_1,&DAT_00066294 + ((int)puVar2 - (int)puVar1),&DAT_0006629c);
  }
  else {
    puVar1[7] = 0x53;
    puVar1[6] = 0x25;
    puVar1[5] = 0x3a;
    puVar1[4] = 0x4d;
    puVar1[3] = 0x25;
    puVar1[2] = 0x3a;
    puVar1[1] = 0x48;
    *puVar1 = 0x25;
    puVar1 = *(undefined1 **)(param_1 + 0x10);
    puVar2 = (undefined1 *)(*(int *)(param_1 + 0x14) + 8);
    if (puVar2 != puVar1) {
      *puVar2 = *puVar1;
      *(undefined1 **)(param_1 + 0x10) = puVar2 + (*(int *)(param_1 + 0x10) - (int)puVar1);
    }
  }
  puVar2 = *(undefined1 **)(param_1 + 0x28);
  puVar1 = *(undefined1 **)(param_1 + 0x2c);
  if ((uint)((int)puVar2 - (int)puVar1) < 8) {
    if (puVar2 != puVar1) {
      __aeabi_memcpy(puVar1,&DAT_0005418c);
      puVar2 = *(undefined1 **)(param_1 + 0x28);
      puVar1 = *(undefined1 **)(param_1 + 0x2c);
    }
    FUN_00037294(param_1 + 0x18,&DAT_0005418c + ((int)puVar2 - (int)puVar1),&DAT_00054194);
  }
  else {
    *puVar1 = 0x25;
    puVar1[4] = 100;
    puVar1[3] = 0x25;
    puVar1[2] = 0x2f;
    puVar1[1] = 0x6d;
    puVar1[7] = 0x79;
    puVar1[6] = 0x25;
    puVar1[5] = 0x2f;
    puVar1 = *(undefined1 **)(param_1 + 0x28);
    puVar2 = (undefined1 *)(*(int *)(param_1 + 0x2c) + 8);
    if (puVar2 != puVar1) {
      *puVar2 = *puVar1;
      *(undefined1 **)(param_1 + 0x28) = puVar2 + (*(int *)(param_1 + 0x28) - (int)puVar1);
    }
  }
  puVar2 = *(undefined1 **)(param_1 + 0x40);
  puVar1 = *(undefined1 **)(param_1 + 0x44);
  if ((uint)((int)puVar2 - (int)puVar1) < 8) {
    if (puVar2 != puVar1) {
      __aeabi_memcpy(puVar1,&DAT_0005418c);
      puVar2 = *(undefined1 **)(param_1 + 0x40);
      puVar1 = *(undefined1 **)(param_1 + 0x44);
    }
    FUN_00037294(param_1 + 0x30,&DAT_0005418c + ((int)puVar2 - (int)puVar1),&DAT_00054194);
  }
  else {
    *puVar1 = 0x25;
    puVar1[4] = 100;
    puVar1[3] = 0x25;
    puVar1[2] = 0x2f;
    puVar1[1] = 0x6d;
    puVar1[7] = 0x79;
    puVar1[6] = 0x25;
    puVar1[5] = 0x2f;
    puVar1 = *(undefined1 **)(param_1 + 0x40);
    puVar2 = (undefined1 *)(*(int *)(param_1 + 0x44) + 8);
    if (puVar2 != puVar1) {
      *puVar2 = *puVar1;
      *(undefined1 **)(param_1 + 0x40) = puVar2 + (*(int *)(param_1 + 0x40) - (int)puVar1);
      return;
    }
  }
  return;
}



### FUNC FUN_00054198 @ 00054198

/* WARNING: Removing unreachable block (ram,0x00054452) */
/* WARNING: Removing unreachable block (ram,0x00054362) */
/* WARNING: Removing unreachable block (ram,0x00054218) */
/* WARNING: Removing unreachable block (ram,0x000543d8) */
/* WARNING: Removing unreachable block (ram,0x000544cc) */
/* WARNING: Removing unreachable block (ram,0x000542c4) */
/* WARNING: Removing unreachable block (ram,0x000542a0) */
/* WARNING: Removing unreachable block (ram,0x00054508) */
/* WARNING: Removing unreachable block (ram,0x00054506) */
/* WARNING: Removing unreachable block (ram,0x0005425e) */
/* WARNING: Removing unreachable block (ram,0x00054528) */
/* WARNING: Removing unreachable block (ram,0x00054526) */
/* WARNING: Removing unreachable block (ram,0x000542e8) */

void FUN_00054198(int param_1,undefined4 param_2)

{
  char *pcVar1;
  size_t sVar2;
  int iVar3;
  short *psVar4;
  int iVar5;
  undefined *puVar6;
  undefined *puVar7;
  
  pcVar1 = (char *)FUN_0004dea0(param_2);
  sVar2 = strlen(pcVar1);
  iVar5 = *(int *)(param_1 + 0x10);
  iVar3 = *(int *)(param_1 + 0x14);
  if ((uint)(iVar5 - iVar3) < sVar2) {
    if (iVar5 != iVar3) {
      __aeabi_memmove(iVar3,pcVar1);
      iVar5 = *(int *)(param_1 + 0x10);
      iVar3 = *(int *)(param_1 + 0x14);
    }
    FUN_00037294(param_1,pcVar1 + (iVar5 - iVar3),pcVar1 + sVar2);
    iVar5 = *(int *)(param_1 + 0x10);
  }
  else {
    if (sVar2 != 0) {
      __aeabi_memmove(iVar3,pcVar1,sVar2);
      iVar5 = *(int *)(param_1 + 0x10);
      iVar3 = *(int *)(param_1 + 0x14);
    }
    iVar3 = iVar3 + sVar2;
    if (iVar3 != iVar5) {
      __aeabi_memmove(iVar3,iVar5);
      iVar5 = *(int *)(param_1 + 0x10) + (iVar3 - iVar5);
      *(int *)(param_1 + 0x10) = iVar5;
    }
  }
  psVar4 = *(short **)(param_1 + 0x14);
  iVar5 = iVar5 - (int)psVar4;
  if ((iVar5 == 2) && (*psVar4 == 0x5425)) {
    __aeabi_memcpy(psVar4,&DAT_00066294);
    puVar6 = &DAT_00066294 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x14));
    puVar7 = &DAT_0006629c;
  }
  else if ((iVar5 == 2) && (*psVar4 == 0x7225)) {
    __aeabi_memcpy(psVar4,&DAT_000662a4);
    puVar6 = &DAT_000662a4 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x14));
    puVar7 = &DAT_000662af;
  }
  else {
    if ((iVar5 != 2) || (*psVar4 != 0x5225)) goto LAB_000542f4;
    __aeabi_memcpy(psVar4,&DAT_000648a8);
    puVar6 = &DAT_000648a8 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x14));
    puVar7 = &DAT_000648ad;
  }
  FUN_00037294(param_1,puVar6,puVar7);
LAB_000542f4:
  pcVar1 = (char *)FUN_0004de94(param_2);
  sVar2 = strlen(pcVar1);
  iVar5 = *(int *)(param_1 + 0x28);
  iVar3 = *(int *)(param_1 + 0x2c);
  if ((uint)(iVar5 - iVar3) < sVar2) {
    if (iVar5 != iVar3) {
      __aeabi_memmove(iVar3,pcVar1);
      iVar5 = *(int *)(param_1 + 0x28);
      iVar3 = *(int *)(param_1 + 0x2c);
    }
    FUN_00037294(param_1 + 0x18,pcVar1 + (iVar5 - iVar3),pcVar1 + sVar2);
  }
  else {
    if (sVar2 != 0) {
      __aeabi_memmove(iVar3,pcVar1,sVar2);
      iVar5 = *(int *)(param_1 + 0x28);
      iVar3 = *(int *)(param_1 + 0x2c);
    }
    iVar3 = iVar3 + sVar2;
    if (iVar3 != iVar5) {
      __aeabi_memmove(iVar3);
      *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + (iVar3 - iVar5);
    }
  }
  pcVar1 = (char *)FUN_0004de88(param_2);
  sVar2 = strlen(pcVar1);
  iVar5 = *(int *)(param_1 + 0x40);
  iVar3 = *(int *)(param_1 + 0x44);
  if ((uint)(iVar5 - iVar3) < sVar2) {
    if (iVar5 != iVar3) {
      __aeabi_memmove(iVar3,pcVar1);
      iVar5 = *(int *)(param_1 + 0x40);
      iVar3 = *(int *)(param_1 + 0x44);
    }
    FUN_00037294(param_1 + 0x30,pcVar1 + (iVar5 - iVar3),pcVar1 + sVar2);
  }
  else {
    if (sVar2 != 0) {
      __aeabi_memmove(iVar3,pcVar1,sVar2);
      iVar5 = *(int *)(param_1 + 0x40);
      iVar3 = *(int *)(param_1 + 0x44);
    }
    iVar3 = iVar3 + sVar2;
    if (iVar3 != iVar5) {
      __aeabi_memmove(iVar3);
      *(int *)(param_1 + 0x40) = *(int *)(param_1 + 0x40) + (iVar3 - iVar5);
    }
  }
  pcVar1 = (char *)FUN_0004debc(param_2);
  sVar2 = strlen(pcVar1);
  iVar5 = *(int *)(param_1 + 0x58);
  iVar3 = *(int *)(param_1 + 0x5c);
  if ((uint)(iVar5 - iVar3) < sVar2) {
    if (iVar5 != iVar3) {
      __aeabi_memmove(iVar3,pcVar1);
      iVar5 = *(int *)(param_1 + 0x58);
      iVar3 = *(int *)(param_1 + 0x5c);
    }
    FUN_00037294(param_1 + 0x48,pcVar1 + (iVar5 - iVar3),pcVar1 + sVar2);
  }
  else {
    if (sVar2 != 0) {
      __aeabi_memmove(iVar3,pcVar1,sVar2);
      iVar5 = *(int *)(param_1 + 0x58);
      iVar3 = *(int *)(param_1 + 0x5c);
    }
    iVar3 = iVar3 + sVar2;
    if (iVar3 != iVar5) {
      __aeabi_memmove(iVar3);
      *(int *)(param_1 + 0x58) = *(int *)(param_1 + 0x58) + (iVar3 - iVar5);
    }
  }
  pcVar1 = (char *)FUN_0004deb0(param_2);
  sVar2 = strlen(pcVar1);
  iVar5 = *(int *)(param_1 + 0x70);
  iVar3 = *(int *)(param_1 + 0x74);
  if ((uint)(iVar5 - iVar3) < sVar2) {
    if (iVar5 != iVar3) {
      __aeabi_memmove(iVar3,pcVar1);
      iVar5 = *(int *)(param_1 + 0x70);
      iVar3 = *(int *)(param_1 + 0x74);
    }
    FUN_00037294(param_1 + 0x60,pcVar1 + (iVar5 - iVar3),pcVar1 + sVar2);
  }
  else {
    if (sVar2 != 0) {
      __aeabi_memmove(iVar3,pcVar1,sVar2);
      iVar5 = *(int *)(param_1 + 0x70);
      iVar3 = *(int *)(param_1 + 0x74);
    }
    iVar3 = iVar3 + sVar2;
    if (iVar3 != iVar5) {
      __aeabi_memmove(iVar3);
      *(int *)(param_1 + 0x70) = *(int *)(param_1 + 0x70) + (iVar3 - iVar5);
      return;
    }
  }
  return;
}



### FUNC FUN_00054550 @ 00054550

int * FUN_00054550(int *param_1,uint param_2,undefined4 param_3)

{
  int iVar1;
  int *piVar2;
  int *piVar3;
  uint uVar4;
  uint uVar5;
  undefined1 *puVar6;
  uint uVar7;
  uint uVar8;
  int *piVar9;
  int *piVar10;
  int *piVar11;
  
  if (param_2 != 0) {
    piVar9 = (int *)param_1[0x46];
    piVar10 = (int *)param_1[4];
    piVar2 = param_1 + 0x46;
    if ((uint)((-2 - (int)piVar10) + (int)piVar9) < param_2) {
                    /* WARNING: Subroutine does not return */
      std::__stl_throw_length_error("basic_string");
    }
    if (piVar9 == param_1) {
      piVar3 = param_1 + 4;
    }
    else {
      piVar3 = (int *)*param_1;
    }
    piVar11 = piVar10;
    if ((uint)((int)piVar3 - (int)piVar10) <= param_2) {
      uVar4 = (int)piVar10 - (int)piVar9;
      if (-uVar4 - 2 < param_2) {
                    /* WARNING: Subroutine does not return */
        std::__stl_throw_length_error("basic_string");
      }
      uVar7 = uVar4;
      if (uVar4 <= param_2) {
        uVar7 = param_2;
      }
      uVar8 = uVar4 + uVar7 + 1;
      uVar5 = 0xfffffffe;
      if (uVar4 <= uVar8) {
        uVar5 = uVar8;
      }
      uVar8 = 0xfffffffe;
      if (uVar4 + uVar7 != -2) {
        uVar8 = uVar5;
      }
      if (uVar8 >> 1 < 0x81) {
        piVar3 = param_1 + 5;
      }
      else {
        piVar3 = (int *)operator_new(uVar8);
        piVar10 = (int *)param_1[4];
        piVar9 = (int *)*piVar2;
      }
      piVar11 = piVar3;
      if (0 < (int)piVar10 - (int)piVar9) {
        puVar6 = (undefined1 *)((int)piVar10 + (1 - (int)piVar9));
        do {
          *(char *)piVar11 = (char)*piVar9;
          puVar6 = puVar6 + -1;
          piVar11 = (int *)((int)piVar11 + 1);
          piVar9 = (int *)((int)piVar9 + 1);
        } while (1 < (int)puVar6);
      }
      *(undefined1 *)piVar11 = 0;
      piVar10 = (int *)*piVar2;
      if (((piVar10 != param_1) && (piVar10 != (int *)0x0)) && (param_1 + 5 != piVar10)) {
        if ((uint)(*param_1 - (int)piVar10) < 0x81) {
          std::__node_alloc::_M_deallocate(piVar10,*param_1 - (int)piVar10);
        }
        else {
          operator_delete(piVar10);
        }
      }
      param_1[4] = (int)piVar11;
      *param_1 = (int)((int)piVar3 + uVar8);
      *piVar2 = (int)piVar3;
    }
    if (0 < (int)(param_2 - 1)) {
      iVar1 = -param_2;
      if (param_2 == 2 || iVar1 < -2) {
        iVar1 = -2;
      }
      __aeabi_memset((undefined1 *)((int)piVar11 + 1),iVar1 + param_2 + 1,param_3);
      piVar11 = (int *)param_1[4];
    }
    *(undefined1 *)((int)piVar11 + param_2) = 0;
    *(char *)param_1[4] = (char)param_3;
    param_1[4] = param_1[4] + param_2;
  }
  return param_1;
}



### FUNC FUN_0005467c @ 0005467c

void FUN_0005467c(int *param_1,undefined4 param_2,int param_3,undefined4 param_4,undefined4 param_5)

{
  byte *pbVar1;
  byte bVar2;
  byte *pbVar3;
  uint uVar4;
  byte *pbVar5;
  uint *puVar6;
  uint uVar7;
  uint uVar8;
  undefined1 uVar9;
  byte *pbVar10;
  
  pbVar3 = *(byte **)(param_3 + 0x10);
  pbVar10 = *(byte **)(param_3 + 0x14);
  if (pbVar3 != pbVar10) {
    do {
      bVar2 = *pbVar10;
      if (bVar2 == 0x25) {
        pbVar1 = pbVar10 + 1;
        pbVar5 = pbVar10 + 1;
        pbVar10 = pbVar10 + 2;
        if (*pbVar1 != 0x23) {
          pbVar10 = pbVar5;
        }
        uVar9 = 0;
        if (*pbVar1 == 0x23) {
          uVar9 = 0x23;
        }
        FUN_00052734(param_1,param_2,*pbVar10,uVar9,param_4,param_5);
      }
      else {
        puVar6 = (uint *)param_1[0x10];
        uVar4 = (int)puVar6 - param_1[0x112] >> 2;
        if (param_1 == (int *)param_1[0x112]) {
          uVar7 = 0x10 - ((int)puVar6 - (int)param_1 >> 2);
        }
        else {
          uVar7 = *param_1 - (int)puVar6 >> 2;
        }
        if (uVar7 < 2) {
          uVar7 = uVar4;
          if (uVar4 < 2) {
            uVar7 = 1;
          }
          uVar8 = uVar4 + uVar7 + 1;
          uVar7 = 0x3ffffffe;
          if (uVar4 <= uVar8) {
            uVar7 = uVar8;
          }
          uVar4 = 0x3ffffffe;
          if (uVar8 < 0x3fffffff) {
            uVar4 = uVar7;
          }
          FUN_000506a4(param_1,uVar4);
          puVar6 = (uint *)param_1[0x10];
        }
        *puVar6 = (uint)bVar2;
        puVar6[1] = 0;
        param_1[0x10] = (int)(puVar6 + 1);
      }
      pbVar10 = pbVar10 + 1;
    } while (pbVar10 != pbVar3);
  }
  return;
}



### FUNC FUN_0005473c @ 0005473c

int * FUN_0005473c(int *param_1,int *param_2,int *param_3)

{
  int *piVar1;
  int iVar2;
  int *piVar3;
  int *piVar4;
  undefined4 uVar5;
  int *piVar6;
  uint uVar7;
  int *piVar8;
  uint uVar9;
  uint uVar10;
  int *piVar11;
  uint local_18;
  
  if (param_2 != param_3) {
    piVar6 = (int *)param_1[0x112];
    piVar1 = param_1 + 0x112;
    iVar2 = (int)param_3 - (int)param_2;
    uVar9 = iVar2 >> 2;
    if (piVar6 == param_1) {
      piVar3 = (int *)param_1[0x10];
      uVar7 = 0x10 - ((int)piVar3 - (int)param_1 >> 2);
    }
    else {
      piVar3 = (int *)param_1[0x10];
      uVar7 = *param_1 - (int)piVar3 >> 2;
    }
    piVar8 = param_1 + 0x10;
    if (uVar9 < uVar7) {
      piVar1 = param_2 + 1;
      *piVar3 = *param_2;
      if (piVar1 != param_3) {
        __aeabi_memcpy(piVar3 + 1,piVar1,(int)param_3 - (int)piVar1);
        piVar3 = (int *)*piVar8;
      }
      piVar3[uVar9] = 0;
      *piVar8 = (int)(piVar3 + uVar9);
    }
    else {
      uVar7 = (int)piVar3 - (int)piVar6 >> 2;
      if (0x3ffffffe - uVar7 < uVar9) {
                    /* WARNING: Subroutine does not return */
        std::__stl_throw_length_error("basic_string");
      }
      uVar10 = uVar7;
      if (uVar7 <= uVar9) {
        uVar10 = uVar9;
      }
      uVar10 = uVar7 + uVar10 + 1;
      uVar9 = 0x3ffffffe;
      if (uVar7 <= uVar10) {
        uVar9 = uVar10;
      }
      uVar7 = 0x3ffffffe;
      if (uVar10 < 0x3fffffff) {
        uVar7 = uVar9;
      }
      if (uVar7 >> 1 < 0x81) {
        piVar4 = param_1 + 0x11;
      }
      else {
        if (0x3fffffff < uVar7) {
          FUN_00030824(4);
          uVar5 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
          FUN_000309e0(uVar5,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
        }
        local_18 = uVar7 << 2;
        if (local_18 < 0x81) {
          piVar4 = (int *)std::__node_alloc::_M_allocate(&local_18);
        }
        else {
          piVar4 = (int *)operator_new(local_18);
        }
        piVar3 = (int *)*piVar8;
        piVar6 = (int *)*piVar1;
      }
      piVar11 = piVar4;
      if (piVar3 != piVar6) {
        __aeabi_memcpy(piVar4,piVar6,(int)piVar3 - (int)piVar6);
        piVar11 = (int *)((int)piVar4 + ((int)piVar3 - (int)piVar6));
      }
      __aeabi_memcpy(piVar11,param_2,iVar2);
      *(undefined4 *)((int)piVar11 + iVar2) = 0;
      piVar6 = (int *)*piVar1;
      if (((piVar6 != param_1) && (piVar6 != (int *)0x0)) && (param_1 + 0x11 != piVar6)) {
        if ((uint)(*param_1 - (int)piVar6) < 0x81) {
          std::__node_alloc::_M_deallocate(piVar6,*param_1 - (int)piVar6);
        }
        else {
          operator_delete(piVar6);
        }
      }
      *param_1 = (int)(piVar4 + uVar7);
      *piVar8 = (int)piVar11 + iVar2;
      *piVar1 = (int)piVar4;
    }
  }
  return param_1;
}



### FUNC FUN_0005489c @ 0005489c

void FUN_0005489c(undefined4 *param_1,undefined4 param_2,locale *param_3)

{
  int *piVar1;
  int iVar2;
  void *pvVar3;
  undefined1 auStack_28 [8];
  undefined4 local_20;
  locale alStack_1c [4];
  undefined1 auStack_18 [4];
  
  piVar1 = (int *)std::locale::_M_use_facet(param_3,(id *)&std::ctype<wchar_t>::id);
  iVar2 = FUN_00031886(*(undefined4 *)(*piVar1 + -4),&std::ctype<wchar_t>::typeinfo);
  if (iVar2 == 1) {
    pvVar3 = (void *)*param_1;
    if (pvVar3 == (void *)0x0) {
      pvVar3 = operator_new(0x1c);
      FUN_0005529c(pvVar3,0,&local_20,auStack_28,auStack_18);
      *param_1 = pvVar3;
    }
    local_20 = param_2;
    std::locale::locale(alStack_1c,param_3);
    FUN_0005536c(auStack_28,pvVar3,&local_20);
    std::locale::~locale(alStack_1c);
    return;
  }
  return;
}



### FUNC FUN_00054940 @ 00054940

void FUN_00054940(int *param_1,undefined4 param_2)

{
  undefined4 local_c;
  
  if (*param_1 != 0) {
    local_c = param_2;
    FUN_00055706(*param_1,&local_c);
  }
  return;
}



### FUNC FUN_00054958 @ 00054958

void FUN_00054958(locale *param_1,int *param_2,int param_3)

{
  int iVar1;
  locale *plVar2;
  int extraout_r1;
  int *piVar3;
  int iVar4;
  
  iVar1 = *param_2;
  if (iVar1 != 0) {
    iVar4 = *(int *)(iVar1 + 8);
    __aeabi_uidivmod(param_3,(*(int *)(iVar1 + 0xc) - iVar4 >> 2) + -1);
    for (piVar3 = *(int **)(iVar4 + extraout_r1 * 4);
        (int *)*(int *)(iVar4 + extraout_r1 * 4 + 4) != piVar3; piVar3 = (int *)*piVar3) {
      if (piVar3[1] == param_3) {
        if (piVar3 != (int *)0x0) {
          plVar2 = (locale *)(piVar3 + 2);
          goto LAB_000549a0;
        }
        break;
      }
    }
  }
  plVar2 = (locale *)std::locale::classic();
LAB_000549a0:
  std::locale::locale(param_1,plVar2);
  return;
}



### FUNC FUN_000549ac @ 000549ac

int * FUN_000549ac(int *param_1,int param_2,char *param_3)

{
  int iVar1;
  undefined4 *puVar2;
  undefined1 auStack_11c [256];
  int local_1c;
  char *local_18;
  
  *param_1 = 0;
  param_1[1] = 0;
  local_18 = param_3;
  if (param_3 == (char *)0x0) {
    std::locale::_M_throw_on_null_name();
  }
  else {
    iVar1 = FUN_0004a4bc(&local_18,auStack_11c,0,&local_1c);
    *param_1 = iVar1;
    if (iVar1 != 0) {
      if (param_2 == 1) {
        puVar2 = (undefined4 *)operator_new(4);
        *puVar2 = 0;
        param_1[1] = (int)puVar2;
      }
      return param_1;
    }
  }
  std::locale::_M_throw_on_creation_failure(local_1c,local_18,"messages");
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume();
}



### FUNC FUN_00054a08 @ 00054a08

undefined4 * FUN_00054a08(undefined4 *param_1,int param_2,undefined4 param_3)

{
  undefined4 *puVar1;
  
  *param_1 = param_3;
  puVar1 = (undefined4 *)0x0;
  if (param_2 == 1) {
    puVar1 = (undefined4 *)operator_new(4);
    *puVar1 = 0;
  }
  param_1[1] = puVar1;
  return param_1;
}



### FUNC FUN_00054a26 @ 00054a26

undefined4 * FUN_00054a26(undefined4 *param_1)

{
  undefined4 *puVar1;
  void *pvVar2;
  
  FUN_0004a824(*param_1);
  puVar1 = (undefined4 *)param_1[1];
  if (puVar1 != (undefined4 *)0x0) {
    pvVar2 = (void *)*puVar1;
    if (pvVar2 != (void *)0x0) {
      FUN_000551be(pvVar2);
      operator_delete(pvVar2);
    }
    operator_delete(puVar1);
  }
  return param_1;
}



### FUNC FUN_00054aa6 @ 00054aa6

void FUN_00054aa6(undefined4 param_1,int *param_2,int param_3,undefined4 param_4,undefined4 param_5,
                 int param_6)

{
  undefined4 uVar1;
  undefined1 auStack_18 [4];
  
  if ((-1 < param_3) && (*param_2 != 0)) {
    uVar1 = FUN_0004df40(*param_2,param_3,param_4,param_5,*(undefined4 *)(param_6 + 0x14));
    FUN_00031c38(param_1,uVar1,auStack_18);
    return;
  }
  FUN_00036f1c(param_1);
  return;
}



### FUNC FUN_00054aec @ 00054aec

void FUN_00054aec(undefined4 param_1,undefined4 *param_2,int param_3,undefined4 param_4,
                 undefined4 param_5,undefined4 param_6)

{
  int *piVar1;
  int iVar2;
  locale *plVar3;
  char *__s;
  size_t sVar4;
  char *pcVar5;
  int extraout_r1;
  int *piVar6;
  int iVar7;
  uint uVar8;
  int *piVar9;
  int local_60 [16];
  int *local_20;
  int *local_1c;
  uint local_18;
  
  iVar2 = *(int *)param_2[1];
  if (iVar2 != 0) {
    iVar7 = *(int *)(iVar2 + 8);
    __aeabi_uidivmod(param_3,(*(int *)(iVar2 + 0xc) - iVar7 >> 2) + -1);
    for (piVar6 = *(int **)(iVar7 + extraout_r1 * 4);
        (int *)*(int *)(iVar7 + extraout_r1 * 4 + 4) != piVar6; piVar6 = (int *)*piVar6) {
      if (piVar6[1] == param_3) {
        if (piVar6 != (int *)0x0) {
          plVar3 = (locale *)(piVar6 + 2);
          goto LAB_00054b3c;
        }
        break;
      }
    }
  }
  plVar3 = (locale *)std::locale::classic();
LAB_00054b3c:
  std::locale::locale((locale *)local_60,plVar3);
  piVar6 = (int *)std::locale::_M_use_facet((locale *)local_60,(id *)&std::ctype<wchar_t>::id);
  std::locale::~locale((locale *)local_60);
  __s = (char *)FUN_0004df40(*param_2,param_3,param_4,param_5,&DAT_0006478a);
  if ((__s == (char *)0x0) ||
     ((*__s == '\0' &&
      ((pcVar5 = (char *)FUN_0004df40(*param_2,param_3,param_4,param_5,&LAB_00054cb4),
       pcVar5 == (char *)0x0 || ((*pcVar5 == '*' && (pcVar5[1] == '\0')))))))) {
    FUN_0004bac8(param_1,param_6);
  }
  else {
    sVar4 = strlen(__s);
    local_20 = local_60;
    local_1c = local_20;
    if (0x3ffffffe < sVar4) {
                    /* WARNING: Subroutine does not return */
      std::__stl_throw_length_error("basic_string");
    }
    if (0x10 < sVar4 + 1) {
      uVar8 = (sVar4 + 1) * 4;
      local_18 = uVar8;
      if (uVar8 < 0x81) {
        local_1c = (int *)std::__node_alloc::_M_allocate(&local_18);
        uVar8 = local_18;
      }
      else {
        local_1c = (int *)operator_new(uVar8);
      }
      local_60[0] = (int)local_1c + (uVar8 & 0xfffffffc);
    }
    piVar9 = local_1c + sVar4;
    if (0 < (int)(sVar4 * 4)) {
      uVar8 = sVar4 ^ 0xffffffff;
      if ((int)(sVar4 ^ 0xffffffff) < -1) {
        uVar8 = 0xfffffffe;
      }
      local_20 = local_1c;
      __aeabi_memclr4(local_1c,(sVar4 + uVar8) * 4 + 8);
    }
    piVar1 = local_1c;
    local_20 = piVar9;
    *piVar9 = 0;
    (**(code **)(*piVar6 + 0x2c))(piVar6,__s,__s + sVar4,piVar1);
    FUN_0004bac8(param_1,local_60);
    if ((local_1c != local_60) && (local_1c != (int *)0x0)) {
      if (0x80 < (uint)(local_60[0] - (int)local_1c)) {
        operator_delete(local_1c);
        return;
      }
      std::__node_alloc::_M_deallocate(local_1c,local_60[0] - (int)local_1c);
      return;
    }
  }
  return;
}



### FUNC FUN_00054cc0 @ 00054cc0

void FUN_00054cc0(int *param_1,undefined4 param_2)

{
  int iVar1;
  undefined4 local_14;
  
  if (*param_1 != 0) {
    FUN_0004df3e(*param_1,param_2);
  }
  if ((int *)param_1[1] != (int *)0x0) {
    iVar1 = *(int *)param_1[1];
    if (iVar1 != 0) {
      local_14 = param_2;
      FUN_00055706(iVar1,&local_14);
    }
  }
  return;
}



### FUNC messages @ 00054cf0

/* std::messages<char>::messages(unsigned int) */

messages<char> * __thiscall std::messages<char>::messages(messages<char> *this,uint param_1)

{
  *(uint *)(this + 4) = (uint)(param_1 != 0);
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__facet_0006a268;
  return this;
}



### FUNC messages_byname @ 00054d1c

/* std::messages_byname<char>::messages_byname(char const*, unsigned int) */

void __thiscall
std::messages_byname<char>::messages_byname(messages_byname<char> *this,char *param_1,uint param_2)

{
  int *piVar1;
  int iVar2;
  undefined4 uVar3;
  undefined1 auStack_11c [256];
  int local_1c;
  char *local_18;
  
  *(uint *)(this + 4) = (uint)(param_2 != 0);
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__messages_byname_0006a284;
  piVar1 = (int *)operator_new(0xc);
  *piVar1 = 0;
  piVar1[1] = 0;
  local_18 = param_1;
  if (param_1 == (char *)0x0) {
    locale::_M_throw_on_null_name();
  }
  else {
    iVar2 = FUN_0004a4bc(&local_18,auStack_11c,0,&local_1c);
    *piVar1 = iVar2;
    if (iVar2 != 0) {
      *(int **)(this + 0xc) = piVar1;
      return;
    }
  }
  uVar3 = locale::_M_throw_on_creation_failure(local_1c,local_18,"messages");
  operator_delete(piVar1);
  locale::facet::~facet((facet *)this);
                    /* WARNING: Subroutine does not return */
  ___Unwind_Resume(uVar3);
}



### FUNC messages_byname @ 00054dac

/* std::messages_byname<char>::messages_byname(_Locale_messages*) */

messages_byname<char> * __thiscall
std::messages_byname<char>::messages_byname(messages_byname<char> *this,_Locale_messages *param_1)

{
  undefined4 *puVar1;
  
  *(undefined4 *)(this + 4) = 0;
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__messages_byname_0006a284;
  puVar1 = (undefined4 *)operator_new(0xc);
  *puVar1 = param_1;
  puVar1[1] = 0;
  *(undefined4 **)(this + 0xc) = puVar1;
  return this;
}



### FUNC ~messages_byname @ 00054df0

/* std::messages_byname<char>::~messages_byname() */

void __thiscall std::messages_byname<char>::~messages_byname(messages_byname<char> *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR__messages_byname_0006a284;
  pvVar1 = *(void **)(this + 0xc);
  if (pvVar1 != (void *)0x0) {
    FUN_00054a26(pvVar1);
    operator_delete(pvVar1);
  }
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~messages_byname @ 00054e3c

/* std::messages_byname<char>::~messages_byname() */

void __thiscall std::messages_byname<char>::~messages_byname(messages_byname<char> *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR__messages_byname_0006a284;
  pvVar1 = *(void **)(this + 0xc);
  if (pvVar1 != (void *)0x0) {
    FUN_00054a26(pvVar1);
    operator_delete(pvVar1);
  }
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC do_open @ 00054e98

/* std::messages_byname<char>::do_open(std::string const&, std::locale const&) const */

int __thiscall
std::messages_byname<char>::do_open(messages_byname<char> *this,string *param_1,locale *param_2)

{
  int iVar1;
  int iVar2;
  int *piVar3;
  int iVar4;
  
  piVar3 = *(int **)(this + 0xc);
  iVar1 = *piVar3;
  iVar4 = -1;
  if (((iVar1 != 0) && (iVar1 = FUN_0004df38(iVar1,*(undefined4 *)(param_1 + 0x14)), iVar1 != -1))
     && (iVar2 = piVar3[1], iVar4 = iVar1, iVar2 != 0)) {
    FUN_0005489c(iVar2,iVar1,param_2);
  }
  return iVar4;
}



### FUNC do_get @ 00054ece

/* std::messages_byname<char>::do_get(int, int, int, std::string const&) const */

void std::messages_byname<char>::do_get(int param_1,int param_2,int param_3,string *param_4)

{
  undefined4 uVar1;
  undefined4 in_stack_00000000;
  int in_stack_00000004;
  undefined1 auStack_18 [4];
  
  if ((-1 < param_3) && (**(int **)(param_2 + 0xc) != 0)) {
    uVar1 = FUN_0004df40(**(int **)(param_2 + 0xc),param_3,param_4,in_stack_00000000,
                         *(undefined4 *)(in_stack_00000004 + 0x14));
    FUN_00031c38(param_1,uVar1,auStack_18);
    return;
  }
  FUN_00036f1c(param_1);
  return;
}



### FUNC do_close @ 00054f14

/* std::messages_byname<char>::do_close(int) const */

void __thiscall std::messages_byname<char>::do_close(messages_byname<char> *this,int param_1)

{
  int iVar1;
  int *piVar2;
  int local_14;
  
  piVar2 = *(int **)(this + 0xc);
  iVar1 = *piVar2;
  if (iVar1 != 0) {
    FUN_0004df3e(iVar1,param_1);
  }
  piVar2 = (int *)piVar2[1];
  if (piVar2 != (int *)0x0) {
    iVar1 = *piVar2;
    if (iVar1 != 0) {
      local_14 = param_1;
      FUN_00055706(iVar1,&local_14);
    }
  }
  return;
}



### FUNC messages @ 00054f44

/* std::messages<wchar_t>::messages(unsigned int) */

messages<wchar_t> * __thiscall
std::messages<wchar_t>::messages(messages<wchar_t> *this,uint param_1)

{
  *(uint *)(this + 4) = (uint)(param_1 != 0);
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__facet_0006a2a0;
  return this;
}



### FUNC messages_byname @ 00054f70

/* std::messages_byname<wchar_t>::messages_byname(char const*, unsigned int) */

messages_byname<wchar_t> * __thiscall
std::messages_byname<wchar_t>::messages_byname
          (messages_byname<wchar_t> *this,char *param_1,uint param_2)

{
  void *pvVar1;
  
  *(uint *)(this + 4) = (uint)(param_2 != 0);
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__messages_byname_0006a2bc;
  pvVar1 = operator_new(0xc);
  FUN_000549ac(pvVar1,1,param_1);
  *(void **)(this + 0xc) = pvVar1;
  return this;
}



### FUNC messages_byname @ 00054fd4

/* std::messages_byname<wchar_t>::messages_byname(_Locale_messages*) */

messages_byname<wchar_t> * __thiscall
std::messages_byname<wchar_t>::messages_byname
          (messages_byname<wchar_t> *this,_Locale_messages *param_1)

{
  undefined4 *puVar1;
  undefined4 *puVar2;
  
  *(undefined4 *)(this + 4) = 0;
  pthread_mutex_init((pthread_mutex_t *)(this + 8),(pthread_mutexattr_t *)0x0);
  *(undefined ***)this = &PTR__messages_byname_0006a2bc;
  puVar1 = (undefined4 *)operator_new(0xc);
  *puVar1 = param_1;
  puVar2 = (undefined4 *)operator_new(4);
  *puVar2 = 0;
  puVar1[1] = puVar2;
  *(undefined4 **)(this + 0xc) = puVar1;
  return this;
}



### FUNC ~messages_byname @ 00055030

/* std::messages_byname<wchar_t>::~messages_byname() */

void __thiscall std::messages_byname<wchar_t>::~messages_byname(messages_byname<wchar_t> *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR__messages_byname_0006a2bc;
  pvVar1 = *(void **)(this + 0xc);
  if (pvVar1 != (void *)0x0) {
    FUN_00054a26(pvVar1);
    operator_delete(pvVar1);
  }
  locale::facet::~facet((facet *)this);
  return;
}



### FUNC ~messages_byname @ 0005507c

/* std::messages_byname<wchar_t>::~messages_byname() */

void __thiscall std::messages_byname<wchar_t>::~messages_byname(messages_byname<wchar_t> *this)

{
  void *pvVar1;
  
  *(undefined ***)this = &PTR__messages_byname_0006a2bc;
  pvVar1 = *(void **)(this + 0xc);
  if (pvVar1 != (void *)0x0) {
    FUN_00054a26(pvVar1);
    operator_delete(pvVar1);
  }
  locale::facet::~facet((facet *)this);
  operator_delete(this);
  return;
}



### FUNC do_open @ 000550d8

/* std::messages_byname<wchar_t>::do_open(std::string const&, std::locale const&) const */

int __thiscall
std::messages_byname<wchar_t>::do_open
          (messages_byname<wchar_t> *this,string *param_1,locale *param_2)

{
  int iVar1;
  int iVar2;
  int *piVar3;
  int iVar4;
  
  piVar3 = *(int **)(this + 0xc);
  iVar1 = *piVar3;
  iVar4 = -1;
  if (((iVar1 != 0) && (iVar1 = FUN_0004df38(iVar1,*(undefined4 *)(param_1 + 0x14)), iVar1 != -1))
     && (iVar2 = piVar3[1], iVar4 = iVar1, iVar2 != 0)) {
    FUN_0005489c(iVar2,iVar1,param_2);
  }
  return iVar4;
}



### FUNC do_get @ 0005510e

/* std::messages_byname<wchar_t>::do_get(int, int, int, std::wstring const&) const */

void std::messages_byname<wchar_t>::do_get(int param_1,int param_2,int param_3,wstring *param_4)

{
  FUN_00054aec(param_1,*(undefined4 *)(param_2 + 0xc));
  return;
}



### FUNC do_close @ 00055128

/* std::messages_byname<wchar_t>::do_close(int) const */

void __thiscall std::messages_byname<wchar_t>::do_close(messages_byname<wchar_t> *this,int param_1)

{
  int iVar1;
  int *piVar2;
  int local_14;
  
  piVar2 = *(int **)(this + 0xc);
  iVar1 = *piVar2;
  if (iVar1 != 0) {
    FUN_0004df3e(iVar1,param_1);
  }
  piVar2 = (int *)piVar2[1];
  if (piVar2 != (int *)0x0) {
    iVar1 = *piVar2;
    if (iVar1 != 0) {
      local_14 = param_1;
      FUN_00055706(iVar1,&local_14);
    }
  }
  return;
}



### FUNC FUN_00055156 @ 00055156

void FUN_00055156(facet *param_1)

{
  std::locale::facet::~facet(param_1);
  operator_delete(param_1);
  return;
}



### FUNC FUN_0005517c @ 0005517c

void FUN_0005517c(undefined4 param_1)

{
  undefined4 in_stack_00000004;
  
  FUN_00036f1c(param_1,in_stack_00000004);
  return;
}



### FUNC FUN_0005518a @ 0005518a

void FUN_0005518a(facet *param_1)

{
  std::locale::facet::~facet(param_1);
  operator_delete(param_1);
  return;
}



### FUNC FUN_000551b0 @ 000551b0

void FUN_000551b0(undefined4 param_1)

{
  undefined4 in_stack_00000004;
  
  FUN_0004bac8(param_1,in_stack_00000004);
  return;
}



### FUNC FUN_000551be @ 000551be

int FUN_000551be(int param_1)

{
  undefined4 *puVar1;
  uint uVar2;
  void *pvVar3;
  undefined4 local_18;
  
  puVar1 = (undefined4 *)*(void **)(param_1 + 4);
  while (puVar1 != (undefined4 *)0x0) {
    pvVar3 = (void *)*puVar1;
    std::locale::~locale((locale *)(puVar1 + 2));
    std::__node_alloc::_M_deallocate(puVar1,0xc);
    puVar1 = (undefined4 *)pvVar3;
  }
  *(undefined4 *)(param_1 + 4) = 0;
  local_18 = 0;
  FUN_0004aa50(param_1 + 8,*(int *)(param_1 + 0xc) - *(int *)(param_1 + 8) >> 2,&local_18);
  *(undefined4 *)(param_1 + 0x14) = 0;
  pvVar3 = *(void **)(param_1 + 8);
  if (pvVar3 != (void *)0x0) {
    uVar2 = *(int *)(param_1 + 0x10) - (int)pvVar3;
    if (uVar2 < 0x81) {
      std::__node_alloc::_M_deallocate(pvVar3,uVar2);
    }
    else {
      operator_delete(pvVar3);
    }
  }
  puVar1 = (undefined4 *)*(void **)(param_1 + 4);
  while (puVar1 != (undefined4 *)0x0) {
    pvVar3 = (void *)*puVar1;
    std::locale::~locale((locale *)(puVar1 + 2));
    std::__node_alloc::_M_deallocate(puVar1,0xc);
    puVar1 = (undefined4 *)pvVar3;
  }
  *(undefined4 *)(param_1 + 4) = 0;
  return param_1;
}



### FUNC FUN_0005529c @ 0005529c

int FUN_0005529c(int param_1,uint param_2)

{
  int *piVar1;
  int iVar2;
  int *piVar3;
  uint uVar4;
  uint uVar5;
  undefined4 local_18;
  
  *(undefined4 *)(param_1 + 4) = 0;
  *(undefined4 *)(param_1 + 8) = 0;
  *(undefined4 *)(param_1 + 0xc) = 0;
  *(undefined4 *)(param_1 + 0x10) = 0;
  *(undefined4 *)(param_1 + 0x14) = 0;
  *(undefined4 *)(param_1 + 0x18) = 0x3f800000;
  piVar1 = &DAT_0006537c;
  uVar5 = 0x1e;
  while (uVar4 = uVar5, 0 < (int)uVar4) {
    uVar5 = uVar4 >> 1;
    if ((uint)piVar1[uVar5] < param_2) {
      piVar1 = piVar1 + uVar5 + 1;
      uVar5 = (uVar4 - 1) - uVar5;
    }
  }
  piVar3 = &DAT_000653f0;
  if (piVar1 != (int *)&DAT_000653f4) {
    piVar3 = piVar1;
  }
  iVar2 = *piVar3;
  FUN_0004a990(param_1 + 8,iVar2 + 1);
  local_18 = 0;
  FUN_0004aa50(param_1 + 8,iVar2 + 1,&local_18);
  return param_1;
}



### FUNC FUN_0005536c @ 0005536c

void FUN_0005536c(undefined4 param_1,int param_2,undefined4 param_3)

{
  int iVar1;
  undefined4 uVar2;
  uint uVar3;
  undefined4 *puVar4;
  int iVar5;
  undefined4 *puVar6;
  uint uVar7;
  uint uVar8;
  
  iVar1 = *(int *)(param_2 + 8);
  iVar5 = *(int *)(param_2 + 0xc);
  uVar2 = __floatunsisf(*(int *)(param_2 + 0x14) + 1);
  __divsf3(uVar2,*(undefined4 *)(param_2 + 0x18));
  uVar3 = __fixunssfsi();
  if ((iVar5 - iVar1 >> 2) - 1U < uVar3) {
    puVar6 = &DAT_0006537c;
    uVar8 = 0x1e;
    while (uVar7 = uVar8, 0 < (int)uVar7) {
      uVar8 = uVar7 >> 1;
      if ((uint)puVar6[uVar8] < uVar3) {
        puVar6 = puVar6 + uVar8 + 1;
        uVar8 = (uVar7 - 1) - uVar8;
      }
    }
    puVar4 = &DAT_000653f0;
    if (puVar6 != (undefined4 *)&DAT_000653f4) {
      puVar4 = puVar6;
    }
    FUN_00055480(param_2,*puVar4);
  }
  FUN_000553e8(param_1,param_2,param_3);
  return;
}



### FUNC FUN_000553e8 @ 000553e8

void FUN_000553e8(undefined4 *param_1,int param_2,int *param_3)

{
  undefined4 *puVar1;
  int extraout_r1;
  undefined4 *puVar2;
  undefined4 *puVar3;
  int iVar4;
  int iVar5;
  undefined4 local_1c;
  uint local_18;
  
  iVar5 = *(int *)(param_2 + 8);
  iVar4 = *param_3;
  __aeabi_uidivmod(iVar4,(*(int *)(param_2 + 0xc) - iVar5 >> 2) + -1);
  puVar3 = *(undefined4 **)(iVar5 + extraout_r1 * 4);
  puVar1 = *(undefined4 **)(iVar5 + extraout_r1 * 4 + 4);
  puVar2 = puVar3;
  if (puVar3 == puVar1) {
    FUN_0005564c(&local_1c,param_2,extraout_r1,param_3);
    *(undefined1 *)(param_1 + 1) = 1;
    *param_1 = local_1c;
    return;
  }
  do {
    if (puVar2[1] == iVar4) {
      *(undefined1 *)(param_1 + 1) = 0;
      *param_1 = puVar2;
      return;
    }
    puVar2 = (undefined4 *)*puVar2;
  } while (puVar1 != puVar2);
  local_18 = 0xc;
  puVar2 = (undefined4 *)std::__node_alloc::_M_allocate(&local_18);
  puVar2[1] = *param_3;
  std::locale::locale((locale *)(puVar2 + 2),(locale *)(param_3 + 1));
  *puVar2 = 0;
  *puVar2 = *puVar3;
  *puVar3 = puVar2;
  *(int *)(param_2 + 0x14) = *(int *)(param_2 + 0x14) + 1;
  *(undefined1 *)(param_1 + 1) = 1;
  *param_1 = puVar2;
  return;
}



### FUNC FUN_00055480 @ 00055480

void FUN_00055480(int param_1,int param_2)

{
  uint uVar1;
  uint uVar2;
  void *pvVar3;
  int *****pppppiVar4;
  void *pvVar5;
  undefined4 uVar6;
  int extraout_r1;
  int *****pppppiVar7;
  int *****pppppiVar8;
  undefined4 *puVar9;
  int iVar10;
  int *****pppppiVar11;
  int ****ppppiVar12;
  int *****pppppiVar13;
  int ****ppppiVar14;
  int *****pppppiVar15;
  int *****pppppiVar16;
  void *local_3c;
  int local_38;
  void *local_20;
  int ****local_1c;
  uint local_18;
  
  local_20 = (void *)0x0;
  local_1c = (int ****)0x0;
  pppppiVar13 = (int *****)(param_1 + 4);
  uVar1 = param_2 + 1;
  if (uVar1 >> 0x1e == 0) {
    if (uVar1 == 0) {
      local_38 = 0;
      local_3c = (void *)0x0;
    }
    else {
      uVar1 = uVar1 * 4;
      local_18 = uVar1;
      if (uVar1 < 0x81) {
        local_20 = (void *)std::__node_alloc::_M_allocate(&local_18);
        uVar2 = local_18;
      }
      else {
        local_20 = operator_new(uVar1);
        uVar2 = uVar1;
      }
      local_3c = (void *)((int)local_20 + uVar1);
      local_38 = (int)local_20 + (uVar2 & 0xfffffffc);
      if (0 < (int)uVar1) {
        iVar10 = -2 - param_2;
        if (-2 - param_2 < -1) {
          iVar10 = -2;
        }
        __aeabi_memclr4(local_20,(iVar10 + param_2) * 4 + 0xc);
      }
    }
    while (pppppiVar16 = (int *****)*pppppiVar13, pppppiVar16 != (int *****)0x0) {
      ppppiVar14 = pppppiVar16[1];
      __aeabi_uidivmod(ppppiVar14,param_2);
      pppppiVar11 = pppppiVar16;
      for (ppppiVar12 = *pppppiVar16;
          (ppppiVar12 != (int ****)0x0 && (ppppiVar14 == (int ****)ppppiVar12[1]));
          ppppiVar12 = (int ****)*ppppiVar12) {
        pppppiVar11 = (int *****)*pppppiVar11;
      }
      pppppiVar15 = *(int ******)((int)local_20 + extraout_r1 * 4);
      pvVar3 = (void *)((int)local_20 + extraout_r1 * 4);
      iVar10 = 0;
      pvVar5 = pvVar3;
      pppppiVar7 = &local_1c;
      if (pppppiVar15 != (int *****)local_1c) {
        do {
          pppppiVar7 = *(int ******)((int)pvVar5 + -4);
          pvVar5 = (void *)((int)pvVar5 + -4);
        } while (pppppiVar15 == pppppiVar7);
        iVar10 = ((int)pvVar5 - (int)local_20 >> 2) + 1;
        pppppiVar4 = (int *****)*pppppiVar7;
        if ((pppppiVar15 != pppppiVar4) &&
           (pppppiVar8 = (int *****)*pppppiVar4, pppppiVar7 = pppppiVar4, pppppiVar15 != pppppiVar8)
           ) {
          for (pppppiVar4 = (int *****)*pppppiVar8; pppppiVar7 = pppppiVar8,
              pppppiVar15 != pppppiVar4; pppppiVar4 = (int *****)*pppppiVar4) {
            pppppiVar8 = (int *****)*pppppiVar8;
          }
        }
      }
      if (((pppppiVar13 != pppppiVar11) && (pppppiVar13 != pppppiVar7)) &&
         (pppppiVar7 != pppppiVar11)) {
        ppppiVar12 = *pppppiVar7;
        *pppppiVar13 = *pppppiVar11;
        *pppppiVar7 = (int ****)pppppiVar16;
        *pppppiVar11 = ppppiVar12;
      }
      puVar9 = (undefined4 *)((int)local_20 + iVar10 * 4);
      uVar1 = (int)pvVar3 + (4 - (int)puVar9);
      if (0 < (int)uVar1) {
        iVar10 = (uVar1 >> 2) + 1;
        do {
          *puVar9 = pppppiVar16;
          puVar9 = puVar9 + 1;
          iVar10 = iVar10 + -1;
        } while (1 < iVar10);
      }
    }
    *(int *****)(param_1 + 4) = local_1c;
    *(void **)(param_1 + 0xc) = local_3c;
    pvVar5 = *(void **)(param_1 + 8);
    *(void **)(param_1 + 8) = local_20;
    iVar10 = *(int *)(param_1 + 0x10);
    *(int *)(param_1 + 0x10) = local_38;
    local_1c = (int ****)pppppiVar16;
    if (pvVar5 != (void *)0x0) {
      uVar1 = iVar10 - (int)pvVar5;
      if (uVar1 < 0x81) {
        std::__node_alloc::_M_deallocate(pvVar5,uVar1);
        pppppiVar16 = (int *****)local_1c;
      }
      else {
        operator_delete(pvVar5);
        pppppiVar16 = (int *****)local_1c;
      }
    }
    while (pppppiVar16 != (int *****)0x0) {
      pppppiVar13 = (int *****)*pppppiVar16;
      std::locale::~locale((locale *)(pppppiVar16 + 2));
      std::__node_alloc::_M_deallocate(pppppiVar16,0xc);
      pppppiVar16 = pppppiVar13;
    }
    return;
  }
  FUN_00030824(4);
  uVar6 = FUN_00031390();
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(uVar6,&PTR_PTR_FUN_00031728_1_00068d90,0x313a9);
}



### FUNC FUN_0005564c @ 0005564c

void FUN_0005564c(undefined4 *param_1,int param_2,int param_3,undefined4 *param_4)

{
  int iVar1;
  undefined4 *puVar2;
  uint uVar3;
  int iVar4;
  undefined4 *puVar5;
  undefined4 *puVar6;
  undefined4 *puVar7;
  int local_30;
  uint local_18;
  
  param_3 = param_3 * 4;
  iVar4 = *(int *)(param_2 + 8);
  puVar5 = *(undefined4 **)(iVar4 + param_3);
  iVar1 = iVar4 + param_3;
  if (puVar5 == *(undefined4 **)(param_2 + 4)) {
    local_30 = 0;
    puVar6 = (undefined4 *)(param_2 + 4);
  }
  else {
    do {
      puVar6 = *(undefined4 **)(iVar1 + -4);
      iVar1 = iVar1 + -4;
    } while (puVar5 == puVar6);
    local_30 = (iVar1 - iVar4 >> 2) + 1;
    puVar2 = (undefined4 *)*puVar6;
    if (((puVar5 != puVar2) && (puVar7 = (undefined4 *)*puVar2, puVar6 = puVar2, puVar5 != puVar7))
       && (puVar2 = (undefined4 *)*puVar7, puVar6 = puVar7, puVar5 != puVar2)) {
      puVar6 = puVar2;
      for (puVar7 = (undefined4 *)*puVar2; puVar5 != puVar7; puVar7 = (undefined4 *)*puVar7) {
        puVar6 = (undefined4 *)*puVar6;
      }
    }
  }
  local_18 = 0xc;
  puVar5 = (undefined4 *)std::__node_alloc::_M_allocate(&local_18);
  puVar5[1] = *param_4;
  std::locale::locale((locale *)(puVar5 + 2),(locale *)(param_4 + 1));
  *puVar5 = 0;
  *puVar5 = *puVar6;
  *puVar6 = puVar5;
  puVar6 = (undefined4 *)(iVar4 + local_30 * 4);
  uVar3 = (iVar4 + param_3 + 4) - (int)puVar6;
  if (0 < (int)uVar3) {
    iVar1 = (uVar3 >> 2) + 1;
    do {
      *puVar6 = puVar5;
      puVar6 = puVar6 + 1;
      iVar1 = iVar1 + -1;
    } while (1 < iVar1);
  }
  *(int *)(param_2 + 0x14) = *(int *)(param_2 + 0x14) + 1;
  *param_1 = *(undefined4 *)(*(int *)(param_2 + 8) + param_3);
  return;
}



### FUNC FUN_00055706 @ 00055706

int FUN_00055706(int param_1,int *param_2)

{
  int iVar1;
  int *piVar2;
  int extraout_r1;
  int *piVar3;
  uint uVar4;
  int iVar5;
  int iVar6;
  int iVar7;
  undefined4 *puVar8;
  int *piVar9;
  int iVar10;
  int *piVar11;
  int *piVar12;
  int local_2c;
  
  iVar10 = *(int *)(param_1 + 8);
  iVar7 = *param_2;
  __aeabi_uidivmod(iVar7,(*(int *)(param_1 + 0xc) - iVar10 >> 2) + -1);
  iVar5 = extraout_r1 * 4;
  piVar9 = *(int **)(iVar10 + iVar5);
  iVar6 = iVar10 + iVar5;
  piVar3 = *(int **)(iVar6 + 4);
  iVar1 = 0;
  if (piVar9 != piVar3) {
    if (piVar9[1] != iVar7) {
      piVar11 = (int *)*piVar9;
      iVar1 = 0;
LAB_00055790:
      if (piVar3 != piVar11) {
        if (piVar11[1] != iVar7) goto LAB_0005578c;
        iVar5 = 1;
        do {
          iVar1 = iVar5;
          puVar8 = (undefined4 *)*piVar9;
          piVar11 = (int *)*puVar8;
          *piVar9 = (int)piVar11;
          std::locale::~locale((locale *)(puVar8 + 2));
          if (puVar8 != (undefined4 *)0x0) {
            std::__node_alloc::_M_deallocate(puVar8,0xc);
          }
        } while ((piVar3 != piVar11) && (iVar5 = iVar1 + 1, piVar11[1] == *param_2));
      }
      goto LAB_0005582c;
    }
    if (piVar9 == *(int **)(param_1 + 4)) {
      local_2c = 0;
      piVar11 = (int *)(param_1 + 4);
    }
    else {
      do {
        piVar11 = *(int **)(iVar6 + -4);
        iVar6 = iVar6 + -4;
      } while (piVar9 == piVar11);
      local_2c = (iVar6 - iVar10 >> 2) + 1;
      piVar2 = (int *)*piVar11;
      if (((piVar9 != piVar2) && (piVar12 = (int *)*piVar2, piVar11 = piVar2, piVar9 != piVar12)) &&
         (piVar2 = (int *)*piVar12, piVar11 = piVar12, piVar9 != piVar2)) {
        piVar11 = piVar2;
        for (piVar12 = (int *)*piVar2; piVar9 != piVar12; piVar12 = (int *)*piVar12) {
          piVar11 = (int *)*piVar11;
        }
      }
    }
    iVar6 = 1;
    do {
      iVar1 = iVar6;
      puVar8 = (undefined4 *)*piVar11;
      piVar9 = (int *)*puVar8;
      *piVar11 = (int)piVar9;
      std::locale::~locale((locale *)(puVar8 + 2));
      if (puVar8 != (undefined4 *)0x0) {
        std::__node_alloc::_M_deallocate(puVar8,0xc);
      }
    } while ((piVar3 != piVar9) && (iVar6 = iVar1 + 1, piVar9[1] == *param_2));
    puVar8 = (undefined4 *)(*(int *)(param_1 + 8) + local_2c * 4);
    uVar4 = (*(int *)(param_1 + 8) + iVar5 + 4) - (int)puVar8;
    if (0 < (int)uVar4) {
      iVar5 = (uVar4 >> 2) + 1;
      do {
        *puVar8 = piVar9;
        puVar8 = puVar8 + 1;
        iVar5 = iVar5 + -1;
      } while (1 < iVar5);
    }
LAB_0005582c:
    *(int *)(param_1 + 0x14) = *(int *)(param_1 + 0x14) - iVar1;
    FUN_00055840();
  }
  return iVar1;
LAB_0005578c:
  piVar11 = (int *)*piVar11;
  piVar9 = (int *)*piVar9;
  goto LAB_00055790;
}



### FUNC FUN_00055840 @ 00055840

void FUN_00055840(int param_1)

{
  undefined4 uVar1;
  undefined4 uVar2;
  undefined4 uVar3;
  undefined4 uVar4;
  int iVar5;
  uint uVar6;
  uint uVar7;
  char *pcVar8;
  uint uVar9;
  char *pcVar10;
  
  uVar9 = (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 8) >> 2) - 1;
  uVar1 = __floatunsisf(*(undefined4 *)(param_1 + 0x14));
  uVar2 = __floatunsisf(uVar9);
  uVar2 = __divsf3(uVar1,uVar2);
  uVar3 = *(undefined4 *)(param_1 + 0x18);
  uVar4 = __mulsf3(uVar3,0x3e800000);
  iVar5 = __aeabi_fcmpgt(uVar2,uVar4);
  if (iVar5 == 0) {
    iVar5 = 0;
    uVar7 = 0x1e;
    while (uVar6 = uVar7, 0 < (int)uVar6) {
      uVar7 = uVar6 >> 1;
      if ((uint)(&DAT_0006537c)[uVar7 + iVar5] < uVar9) {
        iVar5 = uVar7 + iVar5 + 1;
        uVar7 = (uVar6 - 1) - uVar7;
      }
    }
    pcVar8 = (char *)(&DAT_0006537c + iVar5);
    if ((iVar5 * 4 == 0x78) || ((iVar5 != 0 && ((&DAT_0006537c)[iVar5] == uVar9)))) {
      pcVar8 = "St7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE" + iVar5 * 4 + 0x38;
    }
    if (pcVar8 == "\a") {
      if (uVar9 < 8) {
        return;
      }
      pcVar8 = "\a";
    }
    else {
      uVar2 = __floatunsisf(*(undefined4 *)(pcVar8 + -4));
      uVar2 = __divsf3(uVar1,uVar2);
      iVar5 = __aeabi_fcmpgt(uVar2,uVar3);
      if (iVar5 != 0) {
        return;
      }
      if (pcVar8 != "\x17") {
        do {
          pcVar10 = pcVar8 + -4;
          uVar2 = __floatunsisf(*(undefined4 *)(pcVar8 + -8));
          uVar2 = __divsf3(uVar1,uVar2);
          iVar5 = __aeabi_fcmpgt(uVar2,uVar3);
          if (iVar5 != 0) break;
          pcVar8 = pcVar10;
        } while (pcVar10 != "\x17");
      }
    }
    FUN_00055480(param_1,*(undefined4 *)pcVar8);
  }
  return;
}



### FUNC FUN_00055958 @ 00055958

void FUN_00055958(void)

{
  undefined4 uVar1;
  
  FUN_00030824(4);
  uVar1 = FUN_000318b0();
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(uVar1,&PTR_PTR_FUN_00031728_1_00068e38,0x318c9);
}



### FUNC FUN_00055980 @ 00055980

void FUN_00055980(void)

{
  undefined4 uVar1;
  
  FUN_00030824(4);
  uVar1 = FUN_000318f4();
                    /* WARNING: Subroutine does not return */
  FUN_000309e0(uVar1,&PTR_PTR_FUN_00031728_1_00068e44,0x3190d);
}



### FUNC __udivsi3 @ 000559a8

uint __udivsi3(uint param_1,uint param_2)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  bool bVar4;
  
  if (param_2 - 1 == 0) {
    return param_1;
  }
  if (param_2 == 0) {
    if (param_1 != 0) {
      param_1 = 0xffffffff;
    }
    uVar1 = __aeabi_ldiv0(param_1);
    return uVar1;
  }
  if (param_1 <= param_2) {
    return (uint)(param_1 == param_2);
  }
  if ((param_2 & param_2 - 1) == 0) {
    return param_1 >> (0x1fU - LZCOUNT(param_2) & 0xff);
  }
  uVar2 = param_2 << (LZCOUNT(param_2) - LZCOUNT(param_1) & 0xffU);
  uVar1 = 1 << (LZCOUNT(param_2) - LZCOUNT(param_1) & 0xffU);
  uVar3 = 0;
  while( true ) {
    if (uVar2 <= param_1) {
      param_1 = param_1 - uVar2;
      uVar3 = uVar3 | uVar1;
    }
    if (uVar2 >> 1 <= param_1) {
      param_1 = param_1 - (uVar2 >> 1);
      uVar3 = uVar3 | uVar1 >> 1;
    }
    if (uVar2 >> 2 <= param_1) {
      param_1 = param_1 - (uVar2 >> 2);
      uVar3 = uVar3 | uVar1 >> 2;
    }
    if (uVar2 >> 3 <= param_1) {
      param_1 = param_1 - (uVar2 >> 3);
      uVar3 = uVar3 | uVar1 >> 3;
    }
    bVar4 = param_1 == 0;
    if (!bVar4) {
      uVar1 = uVar1 >> 4;
      bVar4 = uVar1 == 0;
    }
    if (bVar4) break;
    uVar2 = uVar2 >> 4;
  }
  return uVar3;
}



### FUNC __aeabi_uidivmod @ 00055a50

void __aeabi_uidivmod(int param_1,int param_2)

{
  if (param_2 != 0) {
    __udivsi3();
    return;
  }
  if (param_1 != 0) {
    param_1 = -1;
  }
  __aeabi_ldiv0(param_1);
  return;
}



### FUNC __divsi3 @ 00055a70

uint __divsi3(uint param_1,uint param_2)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  bool bVar6;
  
  if (param_2 == 0) {
    bVar6 = (int)param_1 < 0;
    if (0 < (int)param_1) {
      param_1 = 0x7fffffff;
    }
    if (bVar6) {
      param_1 = 0x80000000;
    }
    uVar1 = __aeabi_ldiv0(param_1);
    return uVar1;
  }
  uVar5 = param_1 ^ param_2;
  uVar1 = param_2;
  if ((int)param_2 < 0) {
    uVar1 = -param_2;
  }
  if (uVar1 - 1 == 0) {
    if ((int)param_2 < 0) {
      param_1 = -param_1;
    }
    return param_1;
  }
  uVar4 = param_1;
  if ((int)param_1 < 0) {
    uVar4 = -param_1;
  }
  if (uVar4 <= uVar1) {
    if (uVar4 < uVar1) {
      param_1 = 0;
    }
    if (uVar4 == uVar1) {
      param_1 = (int)uVar5 >> 0x1f | 1;
    }
    return param_1;
  }
  if ((uVar1 & uVar1 - 1) == 0) {
    uVar4 = uVar4 >> (0x1fU - LZCOUNT(uVar1) & 0xff);
    if ((int)uVar5 < 0) {
      uVar4 = -uVar4;
    }
    return uVar4;
  }
  uVar3 = uVar1 << (LZCOUNT(uVar1) - LZCOUNT(uVar4) & 0xffU);
  uVar1 = 1 << (LZCOUNT(uVar1) - LZCOUNT(uVar4) & 0xffU);
  uVar2 = 0;
  while( true ) {
    if (uVar3 <= uVar4) {
      uVar4 = uVar4 - uVar3;
      uVar2 = uVar2 | uVar1;
    }
    if (uVar3 >> 1 <= uVar4) {
      uVar4 = uVar4 - (uVar3 >> 1);
      uVar2 = uVar2 | uVar1 >> 1;
    }
    if (uVar3 >> 2 <= uVar4) {
      uVar4 = uVar4 - (uVar3 >> 2);
      uVar2 = uVar2 | uVar1 >> 2;
    }
    if (uVar3 >> 3 <= uVar4) {
      uVar4 = uVar4 - (uVar3 >> 3);
      uVar2 = uVar2 | uVar1 >> 3;
    }
    bVar6 = uVar4 == 0;
    if (!bVar6) {
      uVar1 = uVar1 >> 4;
      bVar6 = uVar1 == 0;
    }
    if (bVar6) break;
    uVar3 = uVar3 >> 4;
  }
  if ((int)uVar5 < 0) {
    uVar2 = -uVar2;
  }
  return uVar2;
}



### FUNC FUN_00055a78 @ 00055a78

uint FUN_00055a78(uint param_1,uint param_2)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  bool in_NG;
  bool bVar6;
  
  uVar5 = param_1 ^ param_2;
  uVar2 = param_2;
  if (in_NG) {
    uVar2 = -param_2;
  }
  if (uVar2 - 1 == 0) {
    if ((int)param_2 < 0) {
      param_1 = -param_1;
    }
    return param_1;
  }
  uVar4 = param_1;
  if ((int)param_1 < 0) {
    uVar4 = -param_1;
  }
  if (uVar4 <= uVar2) {
    if (uVar4 < uVar2) {
      param_1 = 0;
    }
    if (uVar4 == uVar2) {
      param_1 = (int)uVar5 >> 0x1f | 1;
    }
    return param_1;
  }
  if ((uVar2 & uVar2 - 1) == 0) {
    uVar4 = uVar4 >> (0x1fU - LZCOUNT(uVar2) & 0xff);
    if ((int)uVar5 < 0) {
      uVar4 = -uVar4;
    }
    return uVar4;
  }
  uVar3 = uVar2 << (LZCOUNT(uVar2) - LZCOUNT(uVar4) & 0xffU);
  uVar2 = 1 << (LZCOUNT(uVar2) - LZCOUNT(uVar4) & 0xffU);
  uVar1 = 0;
  while( true ) {
    if (uVar3 <= uVar4) {
      uVar4 = uVar4 - uVar3;
      uVar1 = uVar1 | uVar2;
    }
    if (uVar3 >> 1 <= uVar4) {
      uVar4 = uVar4 - (uVar3 >> 1);
      uVar1 = uVar1 | uVar2 >> 1;
    }
    if (uVar3 >> 2 <= uVar4) {
      uVar4 = uVar4 - (uVar3 >> 2);
      uVar1 = uVar1 | uVar2 >> 2;
    }
    if (uVar3 >> 3 <= uVar4) {
      uVar4 = uVar4 - (uVar3 >> 3);
      uVar1 = uVar1 | uVar2 >> 3;
    }
    bVar6 = uVar4 == 0;
    if (!bVar6) {
      uVar2 = uVar2 >> 4;
      bVar6 = uVar2 == 0;
    }
    if (bVar6) break;
    uVar3 = uVar3 >> 4;
  }
  if ((int)uVar5 < 0) {
    uVar1 = -uVar1;
  }
  return uVar1;
}



### FUNC __aeabi_idivmod @ 00055b4c

void __aeabi_idivmod(int param_1,int param_2)

{
  bool bVar1;
  
  if (param_2 != 0) {
    FUN_00055a78();
    return;
  }
  bVar1 = param_1 < 0;
  if (0 < param_1) {
    param_1 = 0x7fffffff;
  }
  if (bVar1) {
    param_1 = -0x80000000;
  }
  __aeabi_ldiv0(param_1);
  return;
}



### FUNC __aeabi_drsub @ 00055b6c

void __aeabi_drsub(undefined4 param_1,uint param_2)

{
  __adddf3(param_1,param_2 ^ 0x80000000);
  return;
}



### FUNC __subdf3 @ 00055b74

ulonglong __subdf3(uint param_1,uint param_2,uint param_3,uint param_4)

{
  int iVar1;
  uint uVar2;
  byte bVar3;
  byte bVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  uint uVar8;
  uint uVar9;
  int iVar10;
  uint uVar11;
  uint uVar12;
  uint uVar13;
  bool bVar14;
  bool bVar15;
  bool bVar16;
  
  uVar8 = param_4 ^ 0x80000000;
  uVar11 = param_2 << 1;
  param_4 = param_4 << 1;
  iVar10 = (int)uVar11 >> 0x15;
  iVar1 = (int)param_4 >> 0x15;
  if ((((uVar11 == param_4 && param_1 == param_3 || uVar11 == 0 && param_1 == 0) ||
       param_4 == 0 && param_3 == 0) || iVar10 == -1) || iVar1 == -1) {
    if (iVar10 == -1 || iVar1 == -1) {
      uVar11 = uVar8;
      uVar12 = param_3;
      if (iVar10 == -1) {
        uVar11 = param_2;
        uVar12 = param_1;
      }
      if (iVar10 != -1 || iVar1 != -1) {
        param_3 = uVar12;
        uVar8 = uVar11;
      }
      bVar14 = (uVar11 & 0xfffff) == 0;
      bVar15 = uVar12 == 0 && bVar14;
      if (uVar12 == 0 && bVar14) {
        bVar15 = param_3 == 0 && (uVar8 & 0xfffff) == 0;
      }
      if (bVar15) {
        bVar15 = uVar11 == uVar8;
      }
      if (!bVar15) {
        uVar11 = uVar11 | 0x80000;
      }
      return CONCAT44(uVar11,uVar12);
    }
    if (uVar11 != param_4 || param_1 != param_3) {
      if (uVar11 == 0 && param_1 == 0) {
        param_1 = param_3;
        param_2 = uVar8;
      }
      return CONCAT44(param_2,param_1);
    }
    if (param_2 != uVar8) {
      return 0;
    }
    if (uVar11 >> 0x15 == 0) {
      bVar3 = (byte)(param_1 >> 0x1f);
      uVar11 = param_2 * 2 + (uint)bVar3;
      if (CARRY4(param_2,param_2) || CARRY4(param_2 * 2,(uint)bVar3)) {
        uVar11 = uVar11 | 0x80000000;
      }
      return CONCAT44(uVar11,param_1 << 1);
    }
    if (uVar11 < 0xffc00000) {
      return CONCAT44(param_2 + 0x100000,param_1);
    }
    param_2 = param_2 & 0x80000000;
LAB_00055de8:
    return (ulonglong)(param_2 | 0x7ff00000) << 0x20;
  }
  uVar11 = uVar11 >> 0x15;
  param_4 = param_4 >> 0x15;
  uVar12 = param_4 - uVar11;
  bVar14 = uVar12 != 0;
  if (param_4 < uVar11) {
    uVar12 = -uVar12;
  }
  uVar7 = param_1;
  uVar9 = param_2;
  if (bVar14 && uVar11 <= param_4) {
    uVar11 = uVar11 + uVar12;
    uVar7 = param_3;
    uVar9 = uVar8;
    param_3 = param_1;
    uVar8 = param_2;
  }
  if (0x36 < uVar12) {
    return CONCAT44(uVar9,uVar7);
  }
  uVar6 = uVar9 & 0xfffff | 0x100000;
  if ((uVar9 & 0x80000000) != 0) {
    bVar14 = uVar7 != 0;
    uVar7 = -uVar7;
    uVar6 = -(uVar6 + bVar14);
  }
  uVar9 = uVar8 & 0xfffff | 0x100000;
  if ((uVar8 & 0x80000000) != 0) {
    bVar14 = param_3 != 0;
    param_3 = -param_3;
    uVar9 = -(uVar9 + bVar14);
  }
  if (uVar11 == uVar12) {
    uVar9 = uVar9 ^ 0x100000;
    if (uVar11 == 0) {
      uVar6 = uVar6 ^ 0x100000;
      uVar11 = 1;
    }
    else {
      uVar12 = uVar12 - 1;
    }
  }
  uVar8 = -uVar12 + 0x20;
  if ((int)uVar12 < 0x21) {
    uVar13 = param_3 << (uVar8 & 0xff);
    param_3 = param_3 >> (uVar12 & 0xff);
    uVar5 = uVar7 + param_3;
    uVar2 = uVar9 << (uVar8 & 0xff);
    uVar8 = uVar5 + uVar2;
    uVar12 = uVar6 + CARRY4(uVar7,param_3) + ((int)uVar9 >> (uVar12 & 0xff)) +
             (uint)CARRY4(uVar5,uVar2);
  }
  else {
    uVar13 = uVar9 << (-uVar12 + 0x40 & 0xff);
    if (param_3 != 0) {
      uVar13 = uVar13 | 2;
    }
    uVar12 = (int)uVar9 >> (uVar12 - 0x20 & 0xff);
    uVar8 = uVar7 + uVar12;
    uVar12 = uVar6 + ((int)uVar9 >> 0x1f) + (uint)CARRY4(uVar7,uVar12);
  }
  param_2 = uVar12 & 0x80000000;
  uVar7 = uVar12;
  if ((int)uVar12 < 0) {
    bVar14 = uVar13 == 0;
    uVar13 = -uVar13;
    uVar7 = -uVar8;
    uVar8 = -(uVar8 + !bVar14);
    uVar7 = -(uVar12 + (bVar14 <= uVar7));
  }
  if (0xfffff < uVar7) {
    uVar9 = uVar11 - 1;
    if (0x1fffff < uVar7) {
      bVar3 = (byte)uVar7;
      uVar7 = uVar7 >> 1;
      bVar4 = (byte)uVar8;
      uVar8 = (uint)(bVar3 & 1) << 0x1f | uVar8 >> 1;
      uVar13 = (uint)(bVar4 & 1) << 0x1f | uVar13 >> 1;
      uVar9 = uVar11;
      if (0xffbfffff < uVar11 * 0x200000) goto LAB_00055de8;
    }
LAB_00055c90:
    bVar14 = 0x7fffffff < uVar13;
    if (uVar13 == 0x80000000) {
      bVar14 = (bool)((byte)uVar8 & 1);
    }
    return CONCAT44(uVar7 + uVar9 * 0x100000 + (uint)CARRY4(uVar8,(uint)bVar14) | param_2,
                    uVar8 + bVar14);
  }
  bVar3 = (byte)(uVar13 >> 0x1f);
  uVar13 = uVar13 << 1;
  uVar9 = uVar8 * 2;
  bVar14 = CARRY4(uVar8,uVar8);
  uVar8 = uVar8 * 2 + (uint)bVar3;
  uVar7 = uVar7 * 2 + (uint)(bVar14 || CARRY4(uVar9,(uint)bVar3));
  uVar9 = uVar11 - 2;
  if ((uVar7 & 0x100000) != 0) goto LAB_00055c90;
  uVar11 = uVar8;
  uVar6 = uVar7;
  if (uVar7 == 0) {
    uVar11 = 0;
    uVar6 = uVar8;
  }
  iVar10 = LZCOUNT(uVar6);
  if (uVar7 == 0) {
    iVar10 = iVar10 + 0x20;
  }
  uVar7 = iVar10 - 0xb;
  bVar16 = SBORROW4(uVar7,0x20);
  uVar8 = iVar10 - 0x2b;
  bVar14 = (int)uVar8 < 0;
  bVar15 = uVar8 == 0;
  if ((int)uVar7 < 0x20) {
    bVar16 = SCARRY4(uVar8,0xc);
    iVar10 = iVar10 + -0x1f;
    bVar14 = iVar10 < 0;
    bVar15 = iVar10 == 0;
    uVar8 = uVar7;
    if (!bVar15 && bVar14 == bVar16) {
      uVar11 = uVar6 << (uVar7 & 0xff);
      uVar6 = uVar6 >> (0xcU - iVar10 & 0xff);
      goto LAB_00055d10;
    }
  }
  if (bVar15 || bVar14 != bVar16) {
    uVar13 = 0x20 - uVar8;
  }
  uVar6 = uVar6 << (uVar8 & 0xff);
  if (bVar15 || bVar14 != bVar16) {
    uVar6 = uVar6 | uVar11 >> (uVar13 & 0xff);
    uVar11 = uVar11 << (uVar8 & 0xff);
  }
LAB_00055d10:
  if ((int)uVar7 <= (int)uVar9) {
    return CONCAT44(uVar6 + (uVar9 - uVar7) * 0x100000 | param_2,uVar11);
  }
  uVar8 = ~(uVar9 - uVar7);
  if ((int)uVar8 < 0x1f) {
    iVar10 = uVar8 - 0x13;
    if (iVar10 != 0 && iVar10 < 0 == SCARRY4(uVar8 - 0x1f,0xc)) {
      return CONCAT44(uVar12,uVar11 >> (0x20 - (0xcU - iVar10) & 0xff) |
                             uVar6 << (0xcU - iVar10 & 0xff)) & 0x80000000ffffffff;
    }
    uVar8 = uVar8 + 1;
    return CONCAT44(param_2 | uVar6 >> (uVar8 & 0xff),
                    uVar11 >> (uVar8 & 0xff) | uVar6 << (0x20 - uVar8 & 0xff));
  }
  return CONCAT44(uVar12,uVar6 >> (uVar8 - 0x1f & 0xff)) & 0x80000000ffffffff;
}



### FUNC __adddf3 @ 00055b78

ulonglong __adddf3(uint param_1,uint param_2,uint param_3,uint param_4)

{
  int iVar1;
  uint uVar2;
  byte bVar3;
  byte bVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  int iVar8;
  uint uVar9;
  uint uVar10;
  uint uVar11;
  uint uVar12;
  uint uVar13;
  bool bVar14;
  bool bVar15;
  bool bVar16;
  
  uVar9 = param_2 << 1;
  uVar6 = param_4 << 1;
  iVar8 = (int)uVar9 >> 0x15;
  iVar1 = (int)uVar6 >> 0x15;
  if ((((uVar9 == uVar6 && param_1 == param_3 || uVar9 == 0 && param_1 == 0) ||
       uVar6 == 0 && param_3 == 0) || iVar8 == -1) || iVar1 == -1) {
    if (iVar8 == -1 || iVar1 == -1) {
      uVar9 = param_4;
      uVar6 = param_3;
      if (iVar8 == -1) {
        uVar9 = param_2;
        uVar6 = param_1;
      }
      if (iVar8 != -1 || iVar1 != -1) {
        param_3 = uVar6;
        param_4 = uVar9;
      }
      bVar14 = (uVar9 & 0xfffff) == 0;
      bVar15 = uVar6 == 0 && bVar14;
      if (uVar6 == 0 && bVar14) {
        bVar15 = param_3 == 0 && (param_4 & 0xfffff) == 0;
      }
      if (bVar15) {
        bVar15 = uVar9 == param_4;
      }
      if (!bVar15) {
        uVar9 = uVar9 | 0x80000;
      }
      return CONCAT44(uVar9,uVar6);
    }
    if (uVar9 != uVar6 || param_1 != param_3) {
      if (uVar9 == 0 && param_1 == 0) {
        param_1 = param_3;
        param_2 = param_4;
      }
      return CONCAT44(param_2,param_1);
    }
    if (param_2 != param_4) {
      return 0;
    }
    if (uVar9 >> 0x15 == 0) {
      bVar3 = (byte)(param_1 >> 0x1f);
      uVar9 = param_2 * 2 + (uint)bVar3;
      if (CARRY4(param_2,param_2) || CARRY4(param_2 * 2,(uint)bVar3)) {
        uVar9 = uVar9 | 0x80000000;
      }
      return CONCAT44(uVar9,param_1 << 1);
    }
    if (uVar9 < 0xffc00000) {
      return CONCAT44(param_2 + 0x100000,param_1);
    }
    param_2 = param_2 & 0x80000000;
LAB_00055de8:
    return (ulonglong)(param_2 | 0x7ff00000) << 0x20;
  }
  uVar9 = uVar9 >> 0x15;
  uVar6 = uVar6 >> 0x15;
  uVar11 = uVar6 - uVar9;
  bVar14 = uVar11 != 0;
  if (uVar6 < uVar9) {
    uVar11 = -uVar11;
  }
  uVar10 = param_1;
  uVar7 = param_2;
  if (bVar14 && uVar9 <= uVar6) {
    uVar9 = uVar9 + uVar11;
    uVar10 = param_3;
    uVar7 = param_4;
    param_3 = param_1;
    param_4 = param_2;
  }
  if (0x36 < uVar11) {
    return CONCAT44(uVar7,uVar10);
  }
  uVar6 = uVar7 & 0xfffff | 0x100000;
  if ((uVar7 & 0x80000000) != 0) {
    bVar14 = uVar10 != 0;
    uVar10 = -uVar10;
    uVar6 = -(uVar6 + bVar14);
  }
  uVar7 = param_4 & 0xfffff | 0x100000;
  if ((param_4 & 0x80000000) != 0) {
    bVar14 = param_3 != 0;
    param_3 = -param_3;
    uVar7 = -(uVar7 + bVar14);
  }
  if (uVar9 == uVar11) {
    uVar7 = uVar7 ^ 0x100000;
    if (uVar9 == 0) {
      uVar6 = uVar6 ^ 0x100000;
      uVar9 = 1;
    }
    else {
      uVar11 = uVar11 - 1;
    }
  }
  uVar13 = -uVar11 + 0x20;
  if ((int)uVar11 < 0x21) {
    uVar12 = param_3 << (uVar13 & 0xff);
    param_3 = param_3 >> (uVar11 & 0xff);
    uVar5 = uVar10 + param_3;
    uVar2 = uVar7 << (uVar13 & 0xff);
    uVar13 = uVar5 + uVar2;
    uVar6 = uVar6 + CARRY4(uVar10,param_3) + ((int)uVar7 >> (uVar11 & 0xff)) +
            (uint)CARRY4(uVar5,uVar2);
  }
  else {
    uVar12 = uVar7 << (-uVar11 + 0x40 & 0xff);
    if (param_3 != 0) {
      uVar12 = uVar12 | 2;
    }
    uVar11 = (int)uVar7 >> (uVar11 - 0x20 & 0xff);
    uVar13 = uVar10 + uVar11;
    uVar6 = uVar6 + ((int)uVar7 >> 0x1f) + (uint)CARRY4(uVar10,uVar11);
  }
  param_2 = uVar6 & 0x80000000;
  uVar11 = uVar6;
  if ((int)uVar6 < 0) {
    bVar14 = uVar12 == 0;
    uVar12 = -uVar12;
    uVar11 = -uVar13;
    uVar13 = -(uVar13 + !bVar14);
    uVar11 = -(uVar6 + (bVar14 <= uVar11));
  }
  if (0xfffff < uVar11) {
    uVar10 = uVar9 - 1;
    if (0x1fffff < uVar11) {
      bVar3 = (byte)uVar11;
      uVar11 = uVar11 >> 1;
      bVar4 = (byte)uVar13;
      uVar13 = (uint)(bVar3 & 1) << 0x1f | uVar13 >> 1;
      uVar12 = (uint)(bVar4 & 1) << 0x1f | uVar12 >> 1;
      uVar10 = uVar9;
      if (0xffbfffff < uVar9 * 0x200000) goto LAB_00055de8;
    }
LAB_00055c90:
    bVar14 = 0x7fffffff < uVar12;
    if (uVar12 == 0x80000000) {
      bVar14 = (bool)((byte)uVar13 & 1);
    }
    return CONCAT44(uVar11 + uVar10 * 0x100000 + (uint)CARRY4(uVar13,(uint)bVar14) | param_2,
                    uVar13 + bVar14);
  }
  bVar3 = (byte)(uVar12 >> 0x1f);
  uVar12 = uVar12 << 1;
  uVar10 = uVar13 * 2;
  bVar14 = CARRY4(uVar13,uVar13);
  uVar13 = uVar13 * 2 + (uint)bVar3;
  uVar11 = uVar11 * 2 + (uint)(bVar14 || CARRY4(uVar10,(uint)bVar3));
  uVar10 = uVar9 - 2;
  if ((uVar11 & 0x100000) != 0) goto LAB_00055c90;
  uVar9 = uVar13;
  uVar7 = uVar11;
  if (uVar11 == 0) {
    uVar9 = 0;
    uVar7 = uVar13;
  }
  iVar8 = LZCOUNT(uVar7);
  if (uVar11 == 0) {
    iVar8 = iVar8 + 0x20;
  }
  uVar13 = iVar8 - 0xb;
  bVar16 = SBORROW4(uVar13,0x20);
  uVar11 = iVar8 - 0x2b;
  bVar14 = (int)uVar11 < 0;
  bVar15 = uVar11 == 0;
  if ((int)uVar13 < 0x20) {
    bVar16 = SCARRY4(uVar11,0xc);
    iVar8 = iVar8 + -0x1f;
    bVar14 = iVar8 < 0;
    bVar15 = iVar8 == 0;
    uVar11 = uVar13;
    if (!bVar15 && bVar14 == bVar16) {
      uVar9 = uVar7 << (uVar13 & 0xff);
      uVar7 = uVar7 >> (0xcU - iVar8 & 0xff);
      goto LAB_00055d10;
    }
  }
  if (bVar15 || bVar14 != bVar16) {
    uVar12 = 0x20 - uVar11;
  }
  uVar7 = uVar7 << (uVar11 & 0xff);
  if (bVar15 || bVar14 != bVar16) {
    uVar7 = uVar7 | uVar9 >> (uVar12 & 0xff);
    uVar9 = uVar9 << (uVar11 & 0xff);
  }
LAB_00055d10:
  if ((int)uVar13 <= (int)uVar10) {
    return CONCAT44(uVar7 + (uVar10 - uVar13) * 0x100000 | param_2,uVar9);
  }
  uVar11 = ~(uVar10 - uVar13);
  if ((int)uVar11 < 0x1f) {
    iVar8 = uVar11 - 0x13;
    if (iVar8 != 0 && iVar8 < 0 == SCARRY4(uVar11 - 0x1f,0xc)) {
      return CONCAT44(uVar6,uVar9 >> (0x20 - (0xcU - iVar8) & 0xff) | uVar7 << (0xcU - iVar8 & 0xff)
                     ) & 0x80000000ffffffff;
    }
    uVar11 = uVar11 + 1;
    return CONCAT44(param_2 | uVar7 >> (uVar11 & 0xff),
                    uVar9 >> (uVar11 & 0xff) | uVar7 << (0x20 - uVar11 & 0xff));
  }
  return CONCAT44(uVar6,uVar7 >> (uVar11 - 0x1f & 0xff)) & 0x80000000ffffffff;
}



### FUNC __floatunsidf @ 00055e24

ulonglong __floatunsidf(uint param_1)

{
  uint uVar1;
  uint uVar2;
  int iVar3;
  uint uVar4;
  uint in_r12;
  bool bVar5;
  bool bVar6;
  bool bVar7;
  
  if (param_1 == 0) {
    return 0;
  }
  uVar1 = 0;
  iVar3 = LZCOUNT(param_1);
  uVar4 = iVar3 + 0x15;
  bVar7 = SBORROW4(uVar4,0x20);
  uVar2 = iVar3 - 0xb;
  bVar5 = (int)uVar2 < 0;
  bVar6 = uVar2 == 0;
  if (uVar4 < 0x20) {
    bVar7 = SCARRY4(uVar2,0xc);
    bVar5 = false;
    bVar6 = iVar3 + 1 == 0;
    uVar2 = uVar4;
    if (!bVar6 && !bVar7) {
      uVar1 = param_1 << uVar4;
      param_1 = param_1 >> (0xcU - (iVar3 + 1) & 0xff);
      goto LAB_00055d10;
    }
  }
  if (bVar6 || bVar5 != bVar7) {
    in_r12 = 0x20 - uVar2;
  }
  param_1 = param_1 << (uVar2 & 0xff);
  if (bVar6 || bVar5 != bVar7) {
    param_1 = param_1 | 0U >> (in_r12 & 0xff);
    uVar1 = 0 << (uVar2 & 0xff);
  }
LAB_00055d10:
  if (uVar4 < 0x433) {
    return CONCAT44(param_1 + (0x432 - uVar4) * 0x100000,uVar1);
  }
  uVar2 = ~(0x432 - uVar4);
  if (0x1e < (int)uVar2) {
    return (ulonglong)(param_1 >> (uVar2 - 0x1f & 0xff));
  }
  iVar3 = uVar2 - 0x13;
  if (iVar3 == 0 || iVar3 < 0 != SCARRY4(uVar2 - 0x1f,0xc)) {
    uVar2 = uVar2 + 1;
    return CONCAT44(param_1 >> (uVar2 & 0xff),
                    uVar1 >> (uVar2 & 0xff) | param_1 << (0x20 - uVar2 & 0xff));
  }
  return (ulonglong)(uVar1 >> (0x20 - (0xcU - iVar3) & 0xff) | param_1 << (0xcU - iVar3 & 0xff));
}



### FUNC __floatsidf @ 00055e48

ulonglong __floatsidf(uint param_1)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  uint uVar6;
  uint in_r12;
  bool bVar7;
  bool bVar8;
  bool bVar9;
  
  if (param_1 == 0) {
    return 0;
  }
  uVar6 = param_1 & 0x80000000;
  uVar2 = param_1;
  if ((int)uVar6 < 0) {
    uVar2 = -param_1;
  }
  uVar1 = 0;
  iVar4 = LZCOUNT(uVar2);
  uVar5 = iVar4 + 0x15;
  bVar9 = SBORROW4(uVar5,0x20);
  uVar3 = iVar4 - 0xb;
  bVar7 = (int)uVar3 < 0;
  bVar8 = uVar3 == 0;
  if (uVar5 < 0x20) {
    bVar9 = SCARRY4(uVar3,0xc);
    bVar7 = false;
    bVar8 = iVar4 + 1 == 0;
    uVar3 = uVar5;
    if (!bVar8 && !bVar9) {
      uVar1 = uVar2 << uVar5;
      uVar2 = uVar2 >> (0xcU - (iVar4 + 1) & 0xff);
      goto LAB_00055d10;
    }
  }
  if (bVar8 || bVar7 != bVar9) {
    in_r12 = 0x20 - uVar3;
  }
  uVar2 = uVar2 << (uVar3 & 0xff);
  if (bVar8 || bVar7 != bVar9) {
    uVar2 = uVar2 | 0U >> (in_r12 & 0xff);
    uVar1 = 0 << (uVar3 & 0xff);
  }
LAB_00055d10:
  if (uVar5 < 0x433) {
    return CONCAT44(uVar2 + (0x432 - uVar5) * 0x100000 | uVar6,uVar1);
  }
  uVar3 = ~(0x432 - uVar5);
  if (0x1e < (int)uVar3) {
    return CONCAT44(param_1,uVar2 >> (uVar3 - 0x1f & 0xff)) & 0x80000000ffffffff;
  }
  iVar4 = uVar3 - 0x13;
  if (iVar4 == 0 || iVar4 < 0 != SCARRY4(uVar3 - 0x1f,0xc)) {
    uVar3 = uVar3 + 1;
    return CONCAT44(uVar6 | uVar2 >> (uVar3 & 0xff),
                    uVar1 >> (uVar3 & 0xff) | uVar2 << (0x20 - uVar3 & 0xff));
  }
  return CONCAT44(param_1,uVar1 >> (0x20 - (0xcU - iVar4) & 0xff) | uVar2 << (0xcU - iVar4 & 0xff))
         & 0x80000000ffffffff;
}



### FUNC __aeabi_f2d @ 00055e70

ulonglong __aeabi_f2d(uint param_1,undefined4 param_2,undefined4 param_3,uint param_4)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  int iVar6;
  uint uVar7;
  uint in_r12;
  bool bVar8;
  bool bVar9;
  bool bVar10;
  
  uVar3 = param_1 << 1;
  bVar9 = uVar3 == 0;
  uVar1 = param_1 & 0x80000000;
  uVar5 = (uint)((int)uVar3 >> 3) >> 1;
  uVar2 = uVar1 | uVar5;
  param_1 = param_1 << 0x1d;
  if (!bVar9) {
    param_4 = uVar3 & 0xff000000;
    bVar9 = param_4 == 0;
  }
  if (!bVar9) {
    bVar9 = param_4 == 0xff000000;
  }
  if (!bVar9) {
    return CONCAT44(uVar2,param_1) ^ 0x3800000000000000;
  }
  if (uVar3 == 0 || param_4 == 0xff000000) {
    return CONCAT44(uVar2,param_1);
  }
  uVar3 = param_1;
  uVar4 = uVar5;
  if (uVar5 == 0) {
    uVar3 = 0;
    uVar4 = param_1;
  }
  iVar6 = LZCOUNT(uVar4);
  if (uVar5 == 0) {
    iVar6 = iVar6 + 0x20;
  }
  uVar7 = iVar6 - 0xb;
  bVar10 = SBORROW4(uVar7,0x20);
  uVar5 = iVar6 - 0x2b;
  bVar9 = (int)uVar5 < 0;
  bVar8 = uVar5 == 0;
  if ((int)uVar7 < 0x20) {
    bVar10 = SCARRY4(uVar5,0xc);
    iVar6 = iVar6 + -0x1f;
    bVar9 = iVar6 < 0;
    bVar8 = iVar6 == 0;
    uVar5 = uVar7;
    if (!bVar8 && bVar9 == bVar10) {
      uVar3 = uVar4 << (uVar7 & 0xff);
      uVar4 = uVar4 >> (0xcU - iVar6 & 0xff);
      goto LAB_00055d10;
    }
  }
  if (bVar8 || bVar9 != bVar10) {
    in_r12 = 0x20 - uVar5;
  }
  uVar4 = uVar4 << (uVar5 & 0xff);
  if (bVar8 || bVar9 != bVar10) {
    uVar4 = uVar4 | uVar3 >> (in_r12 & 0xff);
    uVar3 = uVar3 << (uVar5 & 0xff);
  }
LAB_00055d10:
  if ((int)uVar7 < 0x381) {
    return CONCAT44(uVar4 + (0x380 - uVar7) * 0x100000 | uVar1,uVar3);
  }
  uVar5 = ~(0x380 - uVar7);
  if ((int)uVar5 < 0x1f) {
    iVar6 = uVar5 - 0x13;
    if (iVar6 != 0 && iVar6 < 0 == SCARRY4(uVar5 - 0x1f,0xc)) {
      return CONCAT44(uVar2,uVar3 >> (0x20 - (0xcU - iVar6) & 0xff) | uVar4 << (0xcU - iVar6 & 0xff)
                     ) & 0x80000000ffffffff;
    }
    uVar5 = uVar5 + 1;
    return CONCAT44(uVar1 | uVar4 >> (uVar5 & 0xff),
                    uVar3 >> (uVar5 & 0xff) | uVar4 << (0x20 - uVar5 & 0xff));
  }
  return CONCAT44(uVar2,uVar4 >> (uVar5 - 0x1f & 0xff)) & 0x80000000ffffffff;
}



### FUNC __aeabi_ul2d @ 00055eb0

ulonglong __aeabi_ul2d(uint param_1,uint param_2)

{
  byte bVar1;
  byte bVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  int iVar6;
  uint uVar7;
  uint uVar8;
  int iVar9;
  bool bVar10;
  bool bVar11;
  bool bVar12;
  
  if (param_1 == 0 && param_2 == 0) {
    return CONCAT44(param_2,param_1);
  }
  iVar9 = 0x432;
  uVar8 = param_2 >> 0x16;
  if (uVar8 != 0) {
    iVar9 = 3;
    if (param_2 >> 0x19 != 0) {
      iVar9 = 6;
    }
    if (param_2 >> 0x1c != 0) {
      iVar9 = iVar9 + 3;
    }
    iVar9 = iVar9 - ((int)param_2 >> 0x1f);
    uVar8 = param_1 << (0x20U - iVar9 & 0xff);
    param_1 = param_1 >> iVar9 | param_2 << (0x20U - iVar9 & 0xff);
    param_2 = param_2 >> iVar9;
    iVar9 = iVar9 + 0x432;
  }
  if (0xfffff < param_2) {
    if (0x1fffff < param_2) {
      bVar1 = (byte)param_2;
      param_2 = param_2 >> 1;
      bVar2 = (byte)param_1;
      param_1 = (uint)(bVar1 & 1) << 0x1f | param_1 >> 1;
      uVar8 = (uint)(bVar2 & 1) << 0x1f | uVar8 >> 1;
      iVar9 = iVar9 + 1;
      if (0xffbfffff < (uint)(iVar9 * 0x200000)) {
        return 0x7ff0000000000000;
      }
    }
LAB_00055c90:
    bVar11 = 0x7fffffff < uVar8;
    if (uVar8 == 0x80000000) {
      bVar11 = (bool)((byte)param_1 & 1);
    }
    return CONCAT44(param_2 + iVar9 * 0x100000 + (uint)CARRY4(param_1,(uint)bVar11),param_1 + bVar11
                   );
  }
  bVar1 = (byte)(uVar8 >> 0x1f);
  uVar8 = uVar8 << 1;
  uVar3 = param_1 * 2;
  bVar11 = CARRY4(param_1,param_1);
  param_1 = param_1 * 2 + (uint)bVar1;
  param_2 = param_2 * 2 + (uint)(bVar11 || CARRY4(uVar3,(uint)bVar1));
  iVar9 = iVar9 + -1;
  if ((param_2 & 0x100000) != 0) goto LAB_00055c90;
  uVar3 = param_1;
  uVar4 = param_2;
  if (param_2 == 0) {
    uVar3 = 0;
    uVar4 = param_1;
  }
  iVar6 = LZCOUNT(uVar4);
  if (param_2 == 0) {
    iVar6 = iVar6 + 0x20;
  }
  uVar7 = iVar6 - 0xb;
  bVar12 = SBORROW4(uVar7,0x20);
  uVar5 = iVar6 - 0x2b;
  bVar11 = (int)uVar5 < 0;
  bVar10 = uVar5 == 0;
  if ((int)uVar7 < 0x20) {
    bVar12 = SCARRY4(uVar5,0xc);
    iVar6 = iVar6 + -0x1f;
    bVar11 = iVar6 < 0;
    bVar10 = iVar6 == 0;
    uVar5 = uVar7;
    if (!bVar10 && bVar11 == bVar12) {
      uVar3 = uVar4 << (uVar7 & 0xff);
      uVar4 = uVar4 >> (0xcU - iVar6 & 0xff);
      goto LAB_00055d10;
    }
  }
  if (bVar10 || bVar11 != bVar12) {
    uVar8 = 0x20 - uVar5;
  }
  uVar4 = uVar4 << (uVar5 & 0xff);
  if (bVar10 || bVar11 != bVar12) {
    uVar4 = uVar4 | uVar3 >> (uVar8 & 0xff);
    uVar3 = uVar3 << (uVar5 & 0xff);
  }
LAB_00055d10:
  if ((int)uVar7 <= iVar9) {
    return CONCAT44(uVar4 + (iVar9 - uVar7) * 0x100000,uVar3);
  }
  uVar8 = ~(iVar9 - uVar7);
  if (0x1e < (int)uVar8) {
    return (ulonglong)(uVar4 >> (uVar8 - 0x1f & 0xff));
  }
  iVar9 = uVar8 - 0x13;
  if (iVar9 == 0 || iVar9 < 0 != SCARRY4(uVar8 - 0x1f,0xc)) {
    uVar8 = uVar8 + 1;
    return CONCAT44(uVar4 >> (uVar8 & 0xff),uVar3 >> (uVar8 & 0xff) | uVar4 << (0x20 - uVar8 & 0xff)
                   );
  }
  return (ulonglong)(uVar3 >> (0x20 - (0xcU - iVar9) & 0xff) | uVar4 << (0xcU - iVar9 & 0xff));
}



### FUNC __floatdidf @ 00055ec4

ulonglong __floatdidf(uint param_1,uint param_2)

{
  byte bVar1;
  byte bVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  int iVar6;
  uint uVar7;
  int iVar8;
  uint uVar9;
  uint uVar10;
  bool bVar11;
  bool bVar12;
  bool bVar13;
  
  if (param_1 == 0 && param_2 == 0) {
    return CONCAT44(param_2,param_1);
  }
  uVar9 = param_2 & 0x80000000;
  uVar4 = param_2;
  if ((int)uVar9 < 0) {
    bVar12 = param_1 != 0;
    param_1 = -param_1;
    uVar4 = -(param_2 + bVar12);
  }
  iVar8 = 0x432;
  uVar10 = uVar4 >> 0x16;
  if (uVar10 != 0) {
    iVar8 = 3;
    if (uVar4 >> 0x19 != 0) {
      iVar8 = 6;
    }
    if (uVar4 >> 0x1c != 0) {
      iVar8 = iVar8 + 3;
    }
    iVar8 = iVar8 - ((int)uVar4 >> 0x1f);
    uVar10 = param_1 << (0x20U - iVar8 & 0xff);
    param_1 = param_1 >> iVar8 | uVar4 << (0x20U - iVar8 & 0xff);
    uVar4 = uVar4 >> iVar8;
    iVar8 = iVar8 + 0x432;
  }
  if (0xfffff < uVar4) {
    if (0x1fffff < uVar4) {
      bVar1 = (byte)uVar4;
      uVar4 = uVar4 >> 1;
      bVar2 = (byte)param_1;
      param_1 = (uint)(bVar1 & 1) << 0x1f | param_1 >> 1;
      uVar10 = (uint)(bVar2 & 1) << 0x1f | uVar10 >> 1;
      iVar8 = iVar8 + 1;
      if (0xffbfffff < (uint)(iVar8 * 0x200000)) {
        return (ulonglong)(uVar9 | 0x7ff00000) << 0x20;
      }
    }
LAB_00055c90:
    bVar12 = 0x7fffffff < uVar10;
    if (uVar10 == 0x80000000) {
      bVar12 = (bool)((byte)param_1 & 1);
    }
    return CONCAT44(uVar4 + iVar8 * 0x100000 + (uint)CARRY4(param_1,(uint)bVar12) | uVar9,
                    param_1 + bVar12);
  }
  bVar1 = (byte)(uVar10 >> 0x1f);
  uVar10 = uVar10 << 1;
  uVar3 = param_1 * 2;
  bVar12 = CARRY4(param_1,param_1);
  param_1 = param_1 * 2 + (uint)bVar1;
  uVar4 = uVar4 * 2 + (uint)(bVar12 || CARRY4(uVar3,(uint)bVar1));
  iVar8 = iVar8 + -1;
  if ((uVar4 & 0x100000) != 0) goto LAB_00055c90;
  uVar3 = param_1;
  uVar5 = uVar4;
  if (uVar4 == 0) {
    uVar3 = 0;
    uVar5 = param_1;
  }
  iVar6 = LZCOUNT(uVar5);
  if (uVar4 == 0) {
    iVar6 = iVar6 + 0x20;
  }
  uVar7 = iVar6 - 0xb;
  bVar13 = SBORROW4(uVar7,0x20);
  uVar4 = iVar6 - 0x2b;
  bVar12 = (int)uVar4 < 0;
  bVar11 = uVar4 == 0;
  if ((int)uVar7 < 0x20) {
    bVar13 = SCARRY4(uVar4,0xc);
    iVar6 = iVar6 + -0x1f;
    bVar12 = iVar6 < 0;
    bVar11 = iVar6 == 0;
    uVar4 = uVar7;
    if (!bVar11 && bVar12 == bVar13) {
      uVar3 = uVar5 << (uVar7 & 0xff);
      uVar5 = uVar5 >> (0xcU - iVar6 & 0xff);
      goto LAB_00055d10;
    }
  }
  if (bVar11 || bVar12 != bVar13) {
    uVar10 = 0x20 - uVar4;
  }
  uVar5 = uVar5 << (uVar4 & 0xff);
  if (bVar11 || bVar12 != bVar13) {
    uVar5 = uVar5 | uVar3 >> (uVar10 & 0xff);
    uVar3 = uVar3 << (uVar4 & 0xff);
  }
LAB_00055d10:
  if ((int)uVar7 <= iVar8) {
    return CONCAT44(uVar5 + (iVar8 - uVar7) * 0x100000 | uVar9,uVar3);
  }
  uVar4 = ~(iVar8 - uVar7);
  if (0x1e < (int)uVar4) {
    return CONCAT44(param_2,uVar5 >> (uVar4 - 0x1f & 0xff)) & 0x80000000ffffffff;
  }
  iVar8 = uVar4 - 0x13;
  if (iVar8 == 0 || iVar8 < 0 != SCARRY4(uVar4 - 0x1f,0xc)) {
    uVar4 = uVar4 + 1;
    return CONCAT44(uVar9 | uVar5 >> (uVar4 & 0xff),
                    uVar3 >> (uVar4 & 0xff) | uVar5 << (0x20 - uVar4 & 0xff));
  }
  return CONCAT44(param_2,uVar3 >> (0x20 - (0xcU - iVar8) & 0xff) | uVar5 << (0xcU - iVar8 & 0xff))
         & 0x80000000ffffffff;
}



### FUNC __muldf3 @ 00055f24

ulonglong __muldf3(undefined4 param_1,uint param_2,uint param_3,uint param_4)

{
  longlong lVar1;
  ulonglong uVar2;
  byte bVar3;
  uint uVar4;
  uint uVar5;
  uint uVar6;
  int iVar7;
  uint uVar8;
  uint unaff_r5;
  uint uVar9;
  uint uVar10;
  bool bVar11;
  bool bVar12;
  bool bVar13;
  ulonglong uVar14;
  
  uVar14 = CONCAT44(param_2,param_1);
  uVar10 = 0x7ff;
  uVar6 = param_2 >> 0x14 & 0x7ff;
  bVar11 = uVar6 == 0;
  if (!bVar11) {
    unaff_r5 = param_4 >> 0x14 & 0x7ff;
    bVar11 = unaff_r5 == 0;
  }
  if (!bVar11) {
    bVar11 = uVar6 == 0x7ff;
  }
  if (!bVar11) {
    bVar11 = unaff_r5 == 0x7ff;
  }
  if (bVar11) {
    uVar14 = FUN_00056104();
  }
  uVar4 = (uint)(uVar14 >> 0x20);
  iVar7 = uVar6 + unaff_r5;
  uVar9 = uVar4 ^ param_4;
  uVar4 = uVar4 & ~(uVar10 << 0x15);
  param_4 = param_4 & ~(uVar10 << 0x15);
  uVar6 = uVar4 | 0x100000;
  uVar5 = param_4 | 0x100000;
  if ((uint)uVar14 == 0 && (uVar4 & 0xfffff) == 0 || param_3 == 0 && (param_4 & 0xfffff) == 0) {
    param_3 = (uint)uVar14 | param_3;
    uVar5 = (uVar9 & 0x80000000 | uVar6) ^ uVar5;
    uVar6 = uVar10 >> 1;
    bVar13 = SBORROW4(iVar7,uVar6);
    uVar8 = iVar7 - uVar6;
    bVar11 = uVar8 == 0;
    uVar4 = uVar8;
    if (!bVar11 && (int)uVar6 <= iVar7) {
      bVar13 = SBORROW4(uVar10,uVar8);
      uVar4 = uVar10 - uVar8;
      bVar11 = uVar10 == uVar8;
    }
    if (!bVar11 && (int)uVar4 < 0 == bVar13) {
      return CONCAT44(uVar5 | uVar8 * 0x100000,param_3);
    }
    uVar5 = uVar5 | 0x100000;
    uVar6 = 0;
    bVar13 = SBORROW4(uVar8,1);
    uVar8 = uVar8 - 1;
    bVar11 = uVar8 == 0;
    uVar10 = uVar8;
  }
  else {
    uVar2 = (ulonglong)param_3 * (uVar14 & 0xffffffff);
    uVar14 = (ulonglong)uVar5 * (uVar14 & 0xffffffff) +
             (ulonglong)param_3 * (ulonglong)uVar6 + (uVar2 >> 0x20);
    uVar4 = (uint)uVar14;
    lVar1 = (ulonglong)uVar5 * (ulonglong)uVar6 + (uVar14 >> 0x20);
    uVar6 = (uint)lVar1;
    uVar10 = (uint)((ulonglong)lVar1 >> 0x20);
    if ((int)uVar2 != 0) {
      uVar4 = uVar4 | 1;
    }
    uVar8 = (iVar7 + -0xff) - ((uVar10 < 0x200) + 0x300);
    if (uVar10 < 0x200) {
      bVar3 = (byte)(uVar4 >> 0x1f);
      uVar4 = uVar4 << 1;
      lVar1 = CONCAT44(uVar10 * 2 + (uint)(CARRY4(uVar6,uVar6) || CARRY4(uVar6 * 2,(uint)bVar3)),
                       uVar6 * 2 + (uint)bVar3);
    }
    uVar5 = uVar9 & 0x80000000 | (int)((ulonglong)lVar1 >> 0x20) << 0xb | (uint)lVar1 >> 0x15;
    param_3 = (uint)lVar1 << 0xb | uVar4 >> 0x15;
    uVar6 = uVar4 * 0x800;
    bVar12 = 0xfc < uVar8;
    bVar13 = SBORROW4(uVar8,0xfd);
    uVar9 = uVar8 - 0xfd;
    bVar11 = uVar9 == 0;
    uVar10 = uVar9;
    if (bVar12 && !bVar11) {
      bVar12 = 0x6ff < uVar9;
      bVar13 = SBORROW4(uVar9,0x700);
      uVar10 = uVar8 - 0x7fd;
      bVar11 = uVar9 == 0x700;
    }
    if (!bVar12 || bVar11) {
      bVar11 = 0x7fffffff < uVar6;
      if (uVar6 == 0x80000000) {
        bVar11 = (bool)((byte)(uVar4 >> 0x15) & 1);
      }
      return CONCAT44(uVar5 + uVar8 * 0x100000 + (uint)CARRY4(param_3,(uint)bVar11),param_3 + bVar11
                     );
    }
  }
  if (!bVar11 && (int)uVar10 < 0 == bVar13) {
    return (ulonglong)(uVar5 & 0x80000000 | 0x7ff00000) << 0x20;
  }
  if (uVar8 != 0xffffffca && (int)(uVar8 + 0x36) < 0 == SCARRY4(uVar8,0x36)) {
    uVar10 = -uVar8;
    uVar4 = uVar10 - 0x20;
    if (0x1f < (int)uVar10) {
      uVar9 = param_3 >> (uVar4 & 0xff) | uVar5 << (0x20 - uVar4 & 0xff);
      uVar10 = (uVar5 >> (uVar4 & 0xff) & ~((uVar5 & 0x80000000) >> (uVar4 & 0xff))) -
               ((int)uVar9 >> 0x1f);
      if ((uVar6 == 0 && param_3 << (0x20 - uVar4 & 0xff) == 0) && (uVar9 & 0x7fffffff) == 0) {
        uVar10 = uVar10 & ~(uVar9 >> 0x1f);
      }
      return CONCAT44(uVar5,uVar10) & 0x80000000ffffffff;
    }
    iVar7 = uVar10 - 0x14;
    if (iVar7 != 0 && iVar7 < 0 == SCARRY4(uVar4,0xc)) {
      uVar4 = 0xc - iVar7;
      uVar10 = param_3 << (uVar4 & 0xff);
      uVar4 = param_3 >> (0x20 - uVar4 & 0xff) | uVar5 << (uVar4 & 0xff);
      uVar9 = uVar4 + -((int)uVar10 >> 0x1f);
      if (uVar6 == 0 && (uVar10 & 0x7fffffff) == 0) {
        uVar9 = uVar9 & ~(uVar10 >> 0x1f);
      }
      return CONCAT44((uVar5 & 0x80000000) + (uint)CARRY4(uVar4,-((int)uVar10 >> 0x1f)),uVar9);
    }
    uVar4 = param_3 << (uVar8 + 0x20 & 0xff);
    uVar9 = param_3 >> (uVar10 & 0xff) | uVar5 << (uVar8 + 0x20 & 0xff);
    uVar8 = uVar9 + -((int)uVar4 >> 0x1f);
    if (uVar6 == 0 && (uVar4 & 0x7fffffff) == 0) {
      uVar8 = uVar8 & ~(uVar4 >> 0x1f);
    }
    return CONCAT44((uVar5 & 0x80000000) + ((uVar5 & 0x7fffffff) >> (uVar10 & 0xff)) +
                    (uint)CARRY4(uVar9,-((int)uVar4 >> 0x1f)),uVar8);
  }
  return (ulonglong)(uVar5 & 0x80000000) << 0x20;
}



### FUNC FUN_00056104 @ 00056104

ulonglong FUN_00056104(int param_1,uint param_2,int param_3,uint param_4)

{
  bool bVar1;
  int iVar2;
  uint uVar3;
  uint unaff_r4;
  uint uVar4;
  uint uVar5;
  uint in_r12;
  
  uVar4 = in_r12 & param_4 >> 0x14;
  if (unaff_r4 != in_r12 && uVar4 != in_r12) {
    if (param_1 == 0 && (param_2 & 0x7fffffff) == 0 || param_3 == 0 && (param_4 & 0x7fffffff) == 0)
    {
      return (ulonglong)((param_2 ^ param_4) & 0x80000000) << 0x20;
    }
    if (unaff_r4 == 0) {
      uVar5 = param_2 & 0x80000000;
      do {
        iVar2 = param_1 >> 0x1f;
        param_1 = param_1 << 1;
        param_2 = param_2 * 2 - iVar2;
      } while ((param_2 & 0x100000) == 0);
      param_2 = param_2 | uVar5;
      if (uVar4 != 0) {
        return CONCAT44(param_2,param_1);
      }
    }
    do {
      iVar2 = param_3 >> 0x1f;
      param_3 = param_3 << 1;
      param_4 = param_4 * 2 - iVar2;
    } while ((param_4 & 0x100000) == 0);
    return CONCAT44(param_2,param_1);
  }
  bVar1 = (param_2 & 0x7fffffff) != 0;
  iVar2 = param_3;
  uVar5 = param_4;
  if (param_1 != 0 || bVar1) {
    iVar2 = param_1;
    uVar5 = param_2;
  }
  uVar3 = uVar5;
  if ((((param_1 != 0 || bVar1) && (param_3 != 0 || (param_4 & 0x7fffffff) != 0)) &&
      ((unaff_r4 != in_r12 || (iVar2 == 0 && (uVar5 & 0xfffff) == 0)))) &&
     ((uVar4 != in_r12 ||
      (iVar2 = param_3, uVar3 = param_4, param_3 == 0 && (param_4 & 0xfffff) == 0)))) {
    return (ulonglong)((uVar5 ^ param_4) & 0x80000000 | 0x7ff00000) << 0x20;
  }
  return CONCAT44(uVar3,iVar2) | 0x7ff8000000000000;
}



### FUNC __divdf3 @ 00056190

ulonglong __divdf3(undefined4 param_1,uint param_2,uint param_3,uint param_4)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  uint uVar6;
  int iVar7;
  uint uVar8;
  uint unaff_r5;
  uint uVar9;
  uint uVar10;
  uint uVar11;
  uint uVar12;
  bool bVar13;
  bool bVar14;
  bool bVar15;
  undefined8 uVar16;
  
  uVar16 = CONCAT44(param_2,param_1);
  uVar11 = 0x7ff;
  uVar6 = param_2 >> 0x14 & 0x7ff;
  bVar13 = uVar6 == 0;
  if (!bVar13) {
    unaff_r5 = param_4 >> 0x14 & 0x7ff;
    bVar13 = unaff_r5 == 0;
  }
  if (!bVar13) {
    bVar13 = uVar6 == 0x7ff;
  }
  if (!bVar13) {
    bVar13 = unaff_r5 == 0x7ff;
  }
  if (bVar13) {
    uVar16 = FUN_00056324();
  }
  uVar8 = (uint)((ulonglong)uVar16 >> 0x20);
  uVar2 = (uint)uVar16;
  iVar7 = uVar6 - unaff_r5;
  if (param_3 == 0 && (param_4 & 0xfffff) == 0) {
    uVar6 = (uVar8 ^ param_4) & 0x80000000 | uVar8 & 0xfffff;
    bVar14 = SCARRY4(iVar7,uVar11 >> 1);
    uVar8 = iVar7 + (uVar11 >> 1);
    bVar13 = (int)uVar8 < 0;
    bVar15 = uVar8 == 0;
    if (!bVar15 && bVar13 == bVar14) {
      bVar14 = SBORROW4(uVar11,uVar8);
      bVar13 = (int)(uVar11 - uVar8) < 0;
      bVar15 = uVar11 == uVar8;
    }
    if (!bVar15 && bVar13 == bVar14) {
      return CONCAT44(uVar6 | uVar8 * 0x100000,uVar2);
    }
    uVar6 = uVar6 | 0x100000;
    uVar4 = 0;
    bVar15 = SBORROW4(uVar8,1);
    uVar8 = uVar8 - 1;
    bVar13 = uVar8 == 0;
    uVar11 = uVar8;
  }
  else {
    uVar4 = (param_4 << 0xc) >> 4 | 0x10000000 | param_3 >> 0x18;
    uVar11 = param_3 << 8;
    uVar9 = (uVar8 << 0xc) >> 4 | 0x10000000 | uVar2 >> 0x18;
    uVar2 = uVar2 * 0x100;
    uVar6 = (uVar8 ^ param_4) & 0x80000000;
    bVar13 = uVar4 <= uVar9;
    if (uVar9 == uVar4) {
      bVar13 = uVar11 <= uVar2;
    }
    iVar7 = iVar7 + (uint)bVar13;
    uVar8 = iVar7 + 0x3fd;
    if (!bVar13) {
      uVar4 = uVar4 >> 1;
      uVar11 = (uint)((byte)(param_3 >> 0x18) & 1) << 0x1f | uVar11 >> 1;
    }
    uVar10 = uVar2 - uVar11;
    uVar9 = uVar9 - (uVar4 + (uVar2 < uVar11));
    uVar5 = uVar4 >> 1;
    uVar3 = (uint)((byte)uVar4 & 1) << 0x1f | uVar11 >> 1;
    uVar2 = 0x100000;
    uVar11 = 0x80000;
    while( true ) {
      bVar13 = uVar3 <= uVar10;
      if (uVar5 < uVar9 || uVar9 - uVar5 < (uint)bVar13) {
        uVar10 = uVar10 - uVar3;
        uVar2 = uVar2 | uVar11;
        uVar9 = uVar9 - (uVar5 + !bVar13);
      }
      uVar4 = uVar5 >> 1;
      uVar3 = (uint)((byte)uVar5 & 1) << 0x1f | uVar3 >> 1;
      bVar13 = uVar3 <= uVar10;
      if (uVar4 < uVar9 || uVar9 - uVar4 < (uint)bVar13) {
        uVar10 = uVar10 - uVar3;
        uVar2 = uVar2 | uVar11 >> 1;
        uVar9 = uVar9 - (uVar4 + !bVar13);
      }
      uVar12 = uVar5 >> 2;
      uVar1 = (uint)((byte)uVar4 & 1) << 0x1f | uVar3 >> 1;
      bVar13 = uVar1 <= uVar10;
      if (uVar12 < uVar9 || uVar9 - uVar12 < (uint)bVar13) {
        uVar10 = uVar10 - uVar1;
        uVar2 = uVar2 | uVar11 >> 2;
        uVar9 = uVar9 - (uVar12 + !bVar13);
      }
      uVar5 = uVar5 >> 3;
      uVar3 = (uint)((byte)uVar12 & 1) << 0x1f | uVar1 >> 1;
      bVar13 = uVar3 <= uVar10;
      if (uVar5 < uVar9 || uVar9 - uVar5 < (uint)bVar13) {
        uVar10 = uVar10 - uVar3;
        uVar2 = uVar2 | uVar11 >> 3;
        uVar9 = uVar9 - (uVar5 + !bVar13);
      }
      uVar4 = uVar9 | uVar10;
      if (uVar4 == 0) break;
      uVar9 = uVar9 << 4 | uVar10 >> 0x1c;
      uVar10 = uVar10 << 4;
      uVar5 = uVar5 << 3 | uVar3 >> 0x1d;
      uVar3 = (uVar1 >> 1) << 3;
      uVar11 = uVar11 >> 4;
      if (uVar11 == 0) {
        if ((uVar6 & 0x100000) != 0) goto LAB_000562d0;
        uVar6 = uVar6 | uVar2;
        uVar2 = 0;
        uVar11 = 0x80000000;
      }
    }
    if ((uVar6 & 0x100000) == 0) {
      uVar6 = uVar6 | uVar2;
      uVar2 = 0;
    }
LAB_000562d0:
    bVar14 = 0xfc < uVar8;
    bVar15 = SBORROW4(uVar8,0xfd);
    uVar12 = iVar7 + 0x300;
    bVar13 = uVar12 == 0;
    uVar11 = uVar12;
    if (bVar14 && !bVar13) {
      bVar14 = 0x6ff < uVar12;
      bVar15 = SBORROW4(uVar12,0x700);
      uVar11 = iVar7 - 0x400;
      bVar13 = uVar12 == 0x700;
    }
    if (!bVar14 || bVar13) {
      bVar13 = uVar5 <= uVar9;
      if (uVar9 == uVar5) {
        bVar13 = uVar3 <= uVar10;
      }
      if (uVar9 == uVar5 && uVar10 == uVar3) {
        bVar13 = (bool)((byte)uVar2 & 1);
      }
      return CONCAT44(uVar6 + uVar8 * 0x100000 + (uint)CARRY4(uVar2,(uint)bVar13),uVar2 + bVar13);
    }
  }
  if (!bVar13 && (int)uVar11 < 0 == bVar15) {
    return (ulonglong)(uVar6 & 0x80000000 | 0x7ff00000) << 0x20;
  }
  if (uVar8 == 0xffffffca || (int)(uVar8 + 0x36) < 0 != SCARRY4(uVar8,0x36)) {
    return (ulonglong)(uVar6 & 0x80000000) << 0x20;
  }
  uVar11 = -uVar8;
  uVar9 = uVar11 - 0x20;
  if (0x1f < (int)uVar11) {
    uVar8 = uVar2 >> (uVar9 & 0xff) | uVar6 << (0x20 - uVar9 & 0xff);
    uVar11 = (uVar6 >> (uVar9 & 0xff) & ~((uVar6 & 0x80000000) >> (uVar9 & 0xff))) -
             ((int)uVar8 >> 0x1f);
    if ((uVar4 == 0 && uVar2 << (0x20 - uVar9 & 0xff) == 0) && (uVar8 & 0x7fffffff) == 0) {
      uVar11 = uVar11 & ~(uVar8 >> 0x1f);
    }
    return CONCAT44(uVar6,uVar11) & 0x80000000ffffffff;
  }
  iVar7 = uVar11 - 0x14;
  if (iVar7 != 0 && iVar7 < 0 == SCARRY4(uVar9,0xc)) {
    uVar8 = 0xc - iVar7;
    uVar11 = uVar2 << (uVar8 & 0xff);
    uVar2 = uVar2 >> (0x20 - uVar8 & 0xff) | uVar6 << (uVar8 & 0xff);
    uVar8 = uVar2 + -((int)uVar11 >> 0x1f);
    if (uVar4 == 0 && (uVar11 & 0x7fffffff) == 0) {
      uVar8 = uVar8 & ~(uVar11 >> 0x1f);
    }
    return CONCAT44((uVar6 & 0x80000000) + (uint)CARRY4(uVar2,-((int)uVar11 >> 0x1f)),uVar8);
  }
  uVar9 = uVar2 << (uVar8 + 0x20 & 0xff);
  uVar2 = uVar2 >> (uVar11 & 0xff) | uVar6 << (uVar8 + 0x20 & 0xff);
  uVar8 = uVar2 + -((int)uVar9 >> 0x1f);
  if (uVar4 == 0 && (uVar9 & 0x7fffffff) == 0) {
    uVar8 = uVar8 & ~(uVar9 >> 0x1f);
  }
  return CONCAT44((uVar6 & 0x80000000) + ((uVar6 & 0x7fffffff) >> (uVar11 & 0xff)) +
                  (uint)CARRY4(uVar2,-((int)uVar9 >> 0x1f)),uVar8);
}



### FUNC FUN_00056324 @ 00056324

ulonglong FUN_00056324(int param_1,uint param_2,int param_3,uint param_4)

{
  int iVar1;
  uint unaff_r4;
  uint uVar2;
  uint uVar3;
  uint in_r12;
  
  uVar2 = in_r12 & param_4 >> 0x14;
  uVar3 = param_2;
  if (unaff_r4 != in_r12 || uVar2 != in_r12) {
    if (unaff_r4 == in_r12) {
      if ((param_1 == 0 && (param_2 & 0xfffff) == 0) &&
         (param_1 = param_3, uVar3 = param_4, uVar2 != in_r12)) {
LAB_0005616c:
        return (ulonglong)((param_2 ^ param_4) & 0x80000000 | 0x7ff00000) << 0x20;
      }
    }
    else if (uVar2 == in_r12) {
      param_1 = param_3;
      uVar3 = param_4;
      if (param_3 == 0 && (param_4 & 0xfffff) == 0) {
LAB_00056120:
        return (ulonglong)((param_2 ^ param_4) & 0x80000000) << 0x20;
      }
    }
    else {
      if ((param_1 != 0 || (param_2 & 0x7fffffff) != 0) &&
          (param_3 != 0 || (param_4 & 0x7fffffff) != 0)) {
        if (unaff_r4 == 0) {
          uVar3 = param_2 & 0x80000000;
          do {
            iVar1 = param_1 >> 0x1f;
            param_1 = param_1 << 1;
            param_2 = param_2 * 2 - iVar1;
          } while ((param_2 & 0x100000) == 0);
          param_2 = param_2 | uVar3;
          if (uVar2 != 0) {
            return CONCAT44(param_2,param_1);
          }
        }
        do {
          iVar1 = param_3 >> 0x1f;
          param_3 = param_3 << 1;
          param_4 = param_4 * 2 - iVar1;
        } while ((param_4 & 0x100000) == 0);
        return CONCAT44(param_2,param_1);
      }
      if (param_1 != 0 || (param_2 & 0x7fffffff) != 0) goto LAB_0005616c;
      if (param_3 != 0 || (param_4 & 0x7fffffff) != 0) goto LAB_00056120;
    }
  }
  return CONCAT44(uVar3,param_1) | 0x7ff8000000000000;
}



### FUNC __gedf2 @ 00056394

uint __gedf2(uint param_1,uint param_2,uint param_3,uint param_4)

{
  uint uVar1;
  bool bVar2;
  bool bVar3;
  
  if (((int)(param_2 << 1) >> 0x15 == -1 || (int)(param_4 << 1) >> 0x15 == -1) &&
     ((((int)(param_2 << 1) >> 0x15 == -1 && (param_1 != 0 || (param_2 & 0xfffff) != 0)) ||
      (((int)(param_4 << 1) >> 0x15 == -1 && (param_3 != 0 || (param_4 & 0xfffff) != 0)))))) {
    return 0xffffffff;
  }
  bVar3 = (param_2 & 0x7fffffff) == 0;
  bVar2 = param_1 == 0 && bVar3;
  if (param_1 == 0 && bVar3) {
    bVar2 = param_3 == 0 && (param_4 & 0x7fffffff) == 0;
  }
  if (!bVar2) {
    bVar2 = param_2 == param_4;
  }
  if (bVar2) {
    bVar2 = param_1 == param_3;
  }
  if (!bVar2) {
    uVar1 = param_2 ^ param_4;
    bVar3 = uVar1 == 0;
    if (-1 < (int)uVar1) {
      bVar3 = param_2 == param_4;
    }
    bVar2 = -1 < (int)uVar1 && param_4 <= param_2;
    if (bVar3) {
      bVar2 = param_3 <= param_1;
    }
    param_4 = (int)param_4 >> 0x1f;
    if (!bVar2) {
      param_4 = ~param_4;
    }
    return param_4 | 1;
  }
  return 0;
}



### FUNC __ledf2 @ 0005639c

uint __ledf2(uint param_1,uint param_2,uint param_3,uint param_4)

{
  uint uVar1;
  bool bVar2;
  bool bVar3;
  
  if (((int)(param_2 << 1) >> 0x15 == -1 || (int)(param_4 << 1) >> 0x15 == -1) &&
     ((((int)(param_2 << 1) >> 0x15 == -1 && (param_1 != 0 || (param_2 & 0xfffff) != 0)) ||
      (((int)(param_4 << 1) >> 0x15 == -1 && (param_3 != 0 || (param_4 & 0xfffff) != 0)))))) {
    return 1;
  }
  bVar3 = (param_2 & 0x7fffffff) == 0;
  bVar2 = param_1 == 0 && bVar3;
  if (param_1 == 0 && bVar3) {
    bVar2 = param_3 == 0 && (param_4 & 0x7fffffff) == 0;
  }
  if (!bVar2) {
    bVar2 = param_2 == param_4;
  }
  if (bVar2) {
    bVar2 = param_1 == param_3;
  }
  if (!bVar2) {
    uVar1 = param_2 ^ param_4;
    bVar3 = uVar1 == 0;
    if (-1 < (int)uVar1) {
      bVar3 = param_2 == param_4;
    }
    bVar2 = -1 < (int)uVar1 && param_4 <= param_2;
    if (bVar3) {
      bVar2 = param_3 <= param_1;
    }
    param_4 = (int)param_4 >> 0x1f;
    if (!bVar2) {
      param_4 = ~param_4;
    }
    return param_4 | 1;
  }
  return 0;
}



### FUNC __eqdf2 @ 000563a4

uint __eqdf2(uint param_1,uint param_2,uint param_3,uint param_4)

{
  uint uVar1;
  bool bVar2;
  bool bVar3;
  
  if (((int)(param_2 << 1) >> 0x15 == -1 || (int)(param_4 << 1) >> 0x15 == -1) &&
     ((((int)(param_2 << 1) >> 0x15 == -1 && (param_1 != 0 || (param_2 & 0xfffff) != 0)) ||
      (((int)(param_4 << 1) >> 0x15 == -1 && (param_3 != 0 || (param_4 & 0xfffff) != 0)))))) {
    return 1;
  }
  bVar3 = (param_2 & 0x7fffffff) == 0;
  bVar2 = param_1 == 0 && bVar3;
  if (param_1 == 0 && bVar3) {
    bVar2 = param_3 == 0 && (param_4 & 0x7fffffff) == 0;
  }
  if (!bVar2) {
    bVar2 = param_2 == param_4;
  }
  if (bVar2) {
    bVar2 = param_1 == param_3;
  }
  if (!bVar2) {
    uVar1 = param_2 ^ param_4;
    bVar3 = uVar1 == 0;
    if (-1 < (int)uVar1) {
      bVar3 = param_2 == param_4;
    }
    bVar2 = -1 < (int)uVar1 && param_4 <= param_2;
    if (bVar3) {
      bVar2 = param_3 <= param_1;
    }
    param_4 = (int)param_4 >> 0x1f;
    if (!bVar2) {
      param_4 = ~param_4;
    }
    return param_4 | 1;
  }
  return 0;
}



### FUNC __aeabi_cdrcmple @ 0005642c

void __aeabi_cdrcmple(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)

{
  __aeabi_cdcmple(param_3,param_4,param_1,param_2);
  return;
}



### FUNC __aeabi_cdcmple @ 00056448

undefined4 __aeabi_cdcmple(undefined4 param_1)

{
  __eqdf2();
  return param_1;
}



### FUNC __aeabi_dcmpeq @ 0005645c

undefined1 __aeabi_dcmpeq(void)

{
  undefined1 in_ZR;
  
  __aeabi_cdcmple();
  return in_ZR;
}



### FUNC __aeabi_dcmplt @ 00056470

bool __aeabi_dcmplt(void)

{
  undefined1 in_CY;
  
  __aeabi_cdcmple();
  return !(bool)in_CY;
}



### FUNC __aeabi_dcmple @ 00056484

bool __aeabi_dcmple(void)

{
  undefined1 in_ZR;
  undefined1 in_CY;
  
  __aeabi_cdcmple();
  return !(bool)in_CY || (bool)in_ZR;
}



### FUNC __aeabi_dcmpge @ 00056498

bool __aeabi_dcmpge(void)

{
  undefined1 in_ZR;
  undefined1 in_CY;
  
  __aeabi_cdrcmple();
  return !(bool)in_CY || (bool)in_ZR;
}



### FUNC __aeabi_dcmpgt @ 000564ac

bool __aeabi_dcmpgt(void)

{
  undefined1 in_CY;
  
  __aeabi_cdrcmple();
  return !(bool)in_CY;
}



### FUNC __fixdfsi @ 000564c0

uint __fixdfsi(uint param_1,uint param_2)

{
  uint uVar1;
  int iVar2;
  uint uVar3;
  
  iVar2 = param_2 * 2 + 0x200000;
  if (param_2 * 2 < 0xffe00000) {
    if (-1 < iVar2) {
      return 0;
    }
    uVar1 = iVar2 >> 0x15;
    uVar3 = -uVar1 - 0x3e1;
    if (uVar1 < 0xfffffc20 && uVar3 != 0) {
      uVar1 = (param_2 << 0xb | 0x80000000 | param_1 >> 0x15) >> (uVar3 & 0xff);
      if ((param_2 & 0x80000000) != 0) {
        uVar1 = -uVar1;
      }
      return uVar1;
    }
  }
  else if (param_1 != 0 || (param_2 & 0xfffff) != 0) {
    return 0;
  }
  param_2 = param_2 & 0x80000000;
  if (param_2 == 0) {
    param_2 = 0x7fffffff;
  }
  return param_2;
}



### FUNC __fixunsdfsi @ 0005651c

uint __fixunsdfsi(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  
  if (SUB41(param_2 >> 0x1f,0)) {
    return 0;
  }
  iVar1 = param_2 * 2 + 0x200000;
  if (param_2 * 2 < 0xffe00000) {
    if (-1 < iVar1) {
      return 0;
    }
    uVar2 = -(iVar1 >> 0x15) - 0x3e1;
    if (-1 < (int)uVar2) {
      return (param_2 << 0xb | 0x80000000 | param_1 >> 0x15) >> (uVar2 & 0xff);
    }
  }
  else if (param_1 != 0 || (param_2 & 0xfffff) != 0) {
    return 0;
  }
  return 0xffffffff;
}



### FUNC __truncdfsf2 @ 00056570

uint __truncdfsf2(uint param_1,uint param_2)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  uint in_r12;
  bool bVar4;
  bool bVar5;
  
  uVar2 = param_2 * 2;
  bVar5 = uVar2 < 0x70000000;
  uVar3 = uVar2 + 0x90000000;
  uVar1 = uVar3;
  if (!bVar5) {
    in_r12 = uVar2 + 0x8fe00000;
    uVar1 = in_r12;
  }
  bVar4 = uVar1 == 0;
  if (!bVar5 && uVar3 >= 0x200000) {
    bVar4 = in_r12 == 0x1fc00000;
  }
  if (((bVar5 || uVar3 < 0x200000) || 0x1fc00000 < in_r12) || bVar4) {
    if ((param_2 & 0x40000000) != 0) {
      if (((int)uVar2 >> 0x15 == -1) && (param_1 != 0 || (param_2 & 0xfffff) != 0)) {
        return 0x7fc00000;
      }
      return param_2 & 0x80000000 | 0x7f800000;
    }
    if ((int)(uVar2 + 0x92e00000) < 0 != SCARRY4(uVar3,0x2e00000)) {
      return param_2 & 0x80000000;
    }
    uVar3 = 0x18 - (uVar2 + 0x92e00000 >> 0x15);
    uVar2 = param_1 >> (uVar3 & 0xff);
    if (param_1 << (0x20 - uVar3 & 0xff) != 0) {
      uVar2 = uVar2 | 1;
    }
    uVar1 = param_2 & 0x1fffff | 0x100000;
    param_1 = uVar2 | uVar1 << (0x20 - uVar3 & 0xff);
    uVar3 = (uVar1 >> (uVar3 & 0xff)) << 1;
  }
  uVar2 = (param_2 & 0x80000000 | param_1 >> 0x1d) + uVar3 * 4 + (uint)(0x7fffffff < param_1 * 8);
  if (param_1 * 8 == 0x80000000) {
    uVar2 = uVar2 & 0xfffffffe;
  }
  return uVar2;
}



### FUNC __aeabi_frsub @ 00056610

void __aeabi_frsub(uint param_1)

{
  __addsf3(param_1 ^ 0x80000000);
  return;
}



### FUNC __subsf3 @ 00056618

uint __subsf3(uint param_1,uint param_2,undefined4 param_3,uint param_4)

{
  int iVar1;
  int iVar2;
  byte bVar3;
  uint uVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  uint uVar8;
  bool bVar9;
  
  uVar5 = param_2 ^ 0x80000000;
  uVar4 = param_1 << 1;
  bVar9 = uVar4 == 0;
  if (!bVar9) {
    param_4 = param_2 << 1;
    bVar9 = param_4 == 0;
  }
  if (!bVar9) {
    bVar9 = uVar4 == param_4;
  }
  iVar1 = (int)uVar4 >> 0x18;
  if (!bVar9) {
    bVar9 = iVar1 == -1;
  }
  if (!bVar9) {
    bVar9 = (int)param_4 >> 0x18 == -1;
  }
  if (bVar9) {
    iVar2 = (int)(param_2 << 1) >> 0x18;
    if (iVar1 == -1 || iVar2 == -1) {
      uVar4 = uVar5;
      if (iVar1 == -1) {
        uVar4 = param_1;
      }
      if (iVar1 != -1 || iVar2 != -1) {
        uVar5 = uVar4;
      }
      if (((uVar4 & 0x7fffff) != 0 || (uVar5 & 0x7fffff) != 0) || uVar4 != uVar5) {
        uVar4 = uVar4 | 0x400000;
      }
      return uVar4;
    }
    if (uVar4 != param_2 << 1) {
      if (uVar4 == 0) {
        param_1 = uVar5;
      }
      return param_1;
    }
    if (param_1 != uVar5) {
      return 0;
    }
    if ((uVar4 & 0xff000000) == 0) {
      uVar4 = param_1 << 1;
      if (SUB41(param_1 >> 0x1f,0)) {
        uVar4 = uVar4 | 0x80000000;
      }
      return uVar4;
    }
    if (uVar4 < 0xfe000000) {
      return param_1 + 0x800000;
    }
    param_1 = param_1 & 0x80000000;
LAB_0005677c:
    return param_1 | 0x7f800000;
  }
  uVar4 = uVar4 >> 0x18;
  param_4 = param_4 >> 0x18;
  uVar8 = param_4 - uVar4;
  uVar6 = uVar5;
  uVar7 = uVar4;
  if (uVar8 != 0 && uVar4 <= param_4) {
    uVar7 = uVar4 + uVar8;
    uVar6 = param_1;
    param_1 = uVar5;
  }
  if (param_4 < uVar4) {
    uVar8 = -uVar8;
  }
  if (0x19 < uVar8) {
    return param_1;
  }
  uVar4 = param_1 & 0xffffff | 0x800000;
  if ((param_1 & 0x80000000) != 0) {
    uVar4 = -uVar4;
  }
  uVar5 = uVar6 & 0xffffff | 0x800000;
  if ((uVar6 & 0x80000000) != 0) {
    uVar5 = -uVar5;
  }
  if (uVar7 == uVar8) {
    uVar5 = uVar5 ^ 0x800000;
    if (uVar7 == 0) {
      uVar4 = uVar4 ^ 0x800000;
      uVar7 = 1;
    }
    else {
      uVar8 = uVar8 - 1;
    }
  }
  uVar4 = uVar4 + ((int)uVar5 >> (uVar8 & 0xff));
  uVar5 = uVar5 << (0x20 - uVar8 & 0xff);
  param_1 = uVar4 & 0x80000000;
  if ((int)uVar4 < 0) {
    bVar9 = uVar5 != 0;
    uVar5 = -uVar5;
    uVar4 = -(uVar4 + bVar9);
  }
  if (uVar4 < 0x800000) {
    iVar1 = (int)uVar5 >> 0x1f;
    uVar5 = uVar5 << 1;
    uVar4 = uVar4 * 2 - iVar1;
    uVar8 = uVar7 - 2;
    if ((uVar4 & 0x800000) == 0) {
      uVar5 = LZCOUNT(uVar4) - 8;
      uVar4 = uVar4 << (uVar5 & 0xff);
      if ((int)uVar8 < (int)uVar5) {
        uVar4 = uVar4 >> (-(uVar8 - uVar5) & 0xff);
      }
      else {
        uVar4 = uVar4 + (uVar8 - uVar5) * 0x800000;
      }
      return uVar4 | param_1;
    }
  }
  else {
    uVar8 = uVar7 - 1;
    if (0xffffff < uVar4) {
      bVar3 = (byte)uVar4;
      uVar4 = uVar4 >> 1;
      uVar5 = (uint)(bVar3 & 1) << 0x1f | uVar5 >> 1;
      uVar8 = uVar7;
      if (0xfd < uVar7) goto LAB_0005677c;
    }
  }
  uVar4 = uVar4 + uVar8 * 0x800000 + (uint)(0x7fffffff < uVar5);
  if (uVar5 == 0x80000000) {
    uVar4 = uVar4 & 0xfffffffe;
  }
  return uVar4 | param_1;
}



### FUNC __addsf3 @ 0005661c

uint __addsf3(uint param_1,uint param_2,undefined4 param_3,uint param_4)

{
  int iVar1;
  int iVar2;
  byte bVar3;
  uint uVar4;
  uint uVar5;
  uint uVar6;
  uint uVar7;
  uint uVar8;
  bool bVar9;
  
  uVar4 = param_1 << 1;
  bVar9 = uVar4 == 0;
  if (!bVar9) {
    param_4 = param_2 << 1;
    bVar9 = param_4 == 0;
  }
  if (!bVar9) {
    bVar9 = uVar4 == param_4;
  }
  iVar1 = (int)uVar4 >> 0x18;
  if (!bVar9) {
    bVar9 = iVar1 == -1;
  }
  if (!bVar9) {
    bVar9 = (int)param_4 >> 0x18 == -1;
  }
  if (bVar9) {
    iVar2 = (int)(param_2 << 1) >> 0x18;
    if (iVar1 == -1 || iVar2 == -1) {
      uVar4 = param_2;
      if (iVar1 == -1) {
        uVar4 = param_1;
      }
      if (iVar1 != -1 || iVar2 != -1) {
        param_2 = uVar4;
      }
      if (((uVar4 & 0x7fffff) != 0 || (param_2 & 0x7fffff) != 0) || uVar4 != param_2) {
        uVar4 = uVar4 | 0x400000;
      }
      return uVar4;
    }
    if (uVar4 != param_2 << 1) {
      if (uVar4 == 0) {
        param_1 = param_2;
      }
      return param_1;
    }
    if (param_1 != param_2) {
      return 0;
    }
    if ((uVar4 & 0xff000000) == 0) {
      uVar4 = param_1 << 1;
      if (SUB41(param_1 >> 0x1f,0)) {
        uVar4 = uVar4 | 0x80000000;
      }
      return uVar4;
    }
    if (uVar4 < 0xfe000000) {
      return param_1 + 0x800000;
    }
    param_1 = param_1 & 0x80000000;
LAB_0005677c:
    return param_1 | 0x7f800000;
  }
  uVar4 = uVar4 >> 0x18;
  param_4 = param_4 >> 0x18;
  uVar8 = param_4 - uVar4;
  uVar5 = param_2;
  uVar7 = uVar4;
  if (uVar8 != 0 && uVar4 <= param_4) {
    uVar7 = uVar4 + uVar8;
    uVar5 = param_1;
    param_1 = param_2;
  }
  if (param_4 < uVar4) {
    uVar8 = -uVar8;
  }
  if (0x19 < uVar8) {
    return param_1;
  }
  uVar4 = param_1 & 0xffffff | 0x800000;
  if ((param_1 & 0x80000000) != 0) {
    uVar4 = -uVar4;
  }
  uVar6 = uVar5 & 0xffffff | 0x800000;
  if ((uVar5 & 0x80000000) != 0) {
    uVar6 = -uVar6;
  }
  if (uVar7 == uVar8) {
    uVar6 = uVar6 ^ 0x800000;
    if (uVar7 == 0) {
      uVar4 = uVar4 ^ 0x800000;
      uVar7 = 1;
    }
    else {
      uVar8 = uVar8 - 1;
    }
  }
  uVar4 = uVar4 + ((int)uVar6 >> (uVar8 & 0xff));
  uVar6 = uVar6 << (0x20 - uVar8 & 0xff);
  param_1 = uVar4 & 0x80000000;
  if ((int)uVar4 < 0) {
    bVar9 = uVar6 != 0;
    uVar6 = -uVar6;
    uVar4 = -(uVar4 + bVar9);
  }
  if (uVar4 < 0x800000) {
    iVar1 = (int)uVar6 >> 0x1f;
    uVar6 = uVar6 << 1;
    uVar4 = uVar4 * 2 - iVar1;
    uVar8 = uVar7 - 2;
    if ((uVar4 & 0x800000) == 0) {
      uVar7 = LZCOUNT(uVar4) - 8;
      uVar4 = uVar4 << (uVar7 & 0xff);
      if ((int)uVar8 < (int)uVar7) {
        uVar4 = uVar4 >> (-(uVar8 - uVar7) & 0xff);
      }
      else {
        uVar4 = uVar4 + (uVar8 - uVar7) * 0x800000;
      }
      return uVar4 | param_1;
    }
  }
  else {
    uVar8 = uVar7 - 1;
    if (0xffffff < uVar4) {
      bVar3 = (byte)uVar4;
      uVar4 = uVar4 >> 1;
      uVar6 = (uint)(bVar3 & 1) << 0x1f | uVar6 >> 1;
      uVar8 = uVar7;
      if (0xfd < uVar7) goto LAB_0005677c;
    }
  }
  uVar4 = uVar4 + uVar8 * 0x800000 + (uint)(0x7fffffff < uVar6);
  if (uVar6 == 0x80000000) {
    uVar4 = uVar4 & 0xfffffffe;
  }
  return uVar4 | param_1;
}



### FUNC __floatunsisf @ 000567ac

uint __floatunsisf(uint param_1)

{
  uint uVar1;
  uint uVar2;
  int iVar3;
  
  if (param_1 == 0) {
    return 0;
  }
  uVar1 = LZCOUNT(param_1);
  uVar2 = uVar1 - 8;
  iVar3 = uVar2 * -0x800000 + 0x4a800000;
  if (7 < uVar1) {
    uVar1 = 0 << (uVar2 & 0xff);
    uVar2 = iVar3 + (param_1 << (uVar2 & 0xff)) + (0U >> (0x20 - uVar2 & 0xff)) +
            (uint)(0x7fffffff < uVar1);
    if (uVar1 == 0x80000000) {
      uVar2 = uVar2 & 0xfffffffe;
    }
    return uVar2;
  }
  uVar2 = param_1 << uVar1 + 0x18;
  uVar1 = (iVar3 + (param_1 >> (0x20 - (uVar1 + 0x18) & 0xff))) - ((int)uVar2 >> 0x1f);
  if ((uVar2 & 0x7fffffff) == 0) {
    uVar1 = uVar1 & ~(uVar2 >> 0x1f);
  }
  return uVar1;
}



### FUNC __floatsisf @ 000567b4

uint __floatsisf(uint param_1)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  
  uVar3 = param_1 & 0x80000000;
  if ((int)uVar3 < 0) {
    param_1 = -param_1;
  }
  if (param_1 == 0) {
    return 0;
  }
  uVar1 = LZCOUNT(param_1);
  uVar2 = uVar1 - 8;
  iVar4 = ((uVar3 | 0x4b000000) - 0x800000) + uVar2 * -0x800000;
  if (7 < uVar1) {
    uVar3 = 0 << (uVar2 & 0xff);
    uVar1 = iVar4 + (param_1 << (uVar2 & 0xff)) + (0U >> (0x20 - uVar2 & 0xff)) +
            (uint)(0x7fffffff < uVar3);
    if (uVar3 == 0x80000000) {
      uVar1 = uVar1 & 0xfffffffe;
    }
    return uVar1;
  }
  uVar3 = param_1 << uVar1 + 0x18;
  uVar1 = (iVar4 + (param_1 >> (0x20 - (uVar1 + 0x18) & 0xff))) - ((int)uVar3 >> 0x1f);
  if ((uVar3 & 0x7fffffff) == 0) {
    uVar1 = uVar1 & ~(uVar3 >> 0x1f);
  }
  return uVar1;
}



### FUNC __aeabi_ul2f @ 000567d4

uint __aeabi_ul2f(uint param_1,uint param_2)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  int iVar5;
  
  if (param_1 == 0 && param_2 == 0) {
    return param_1;
  }
  uVar1 = param_1;
  uVar2 = param_2;
  if (param_2 == 0) {
    uVar1 = 0;
    uVar2 = param_1;
  }
  iVar5 = 0x5b000000;
  if (param_2 == 0) {
    iVar5 = 0x4b000000;
  }
  uVar3 = LZCOUNT(uVar2);
  uVar4 = uVar3 - 8;
  iVar5 = iVar5 + -0x800000 + uVar4 * -0x800000;
  if (uVar3 < 8) {
    uVar4 = uVar2 << uVar3 + 0x18;
    uVar2 = (iVar5 + (uVar2 >> (0x20 - (uVar3 + 0x18) & 0xff))) - ((int)uVar4 >> 0x1f);
    if (uVar1 == 0 && (uVar4 & 0x7fffffff) == 0) {
      uVar2 = uVar2 & ~(uVar4 >> 0x1f);
    }
    return uVar2;
  }
  uVar3 = uVar1 << (uVar4 & 0xff);
  uVar2 = iVar5 + (uVar2 << (uVar4 & 0xff)) + (uVar1 >> (0x20 - uVar4 & 0xff)) +
          (uint)(0x7fffffff < uVar3);
  if (uVar3 == 0x80000000) {
    uVar2 = uVar2 & 0xfffffffe;
  }
  return uVar2;
}



### FUNC __aeabi_l2f @ 000567e4

uint __aeabi_l2f(uint param_1,uint param_2)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  uint uVar5;
  int iVar6;
  bool bVar7;
  
  if (param_1 == 0 && param_2 == 0) {
    return param_1;
  }
  uVar5 = param_2 & 0x80000000;
  if ((int)uVar5 < 0) {
    bVar7 = param_1 != 0;
    param_1 = -param_1;
    param_2 = -(param_2 + bVar7);
  }
  uVar1 = param_1;
  uVar2 = param_2;
  if (param_2 == 0) {
    uVar1 = 0;
    uVar2 = param_1;
  }
  uVar5 = uVar5 | 0x5b000000;
  if (param_2 == 0) {
    uVar5 = uVar5 + 0xf0000000;
  }
  uVar3 = LZCOUNT(uVar2);
  uVar4 = uVar3 - 8;
  iVar6 = (uVar5 - 0x800000) + uVar4 * -0x800000;
  if (uVar3 < 8) {
    uVar5 = uVar2 << uVar3 + 0x18;
    uVar2 = (iVar6 + (uVar2 >> (0x20 - (uVar3 + 0x18) & 0xff))) - ((int)uVar5 >> 0x1f);
    if (uVar1 == 0 && (uVar5 & 0x7fffffff) == 0) {
      uVar2 = uVar2 & ~(uVar5 >> 0x1f);
    }
    return uVar2;
  }
  uVar5 = uVar1 << (uVar4 & 0xff);
  uVar2 = iVar6 + (uVar2 << (uVar4 & 0xff)) + (uVar1 >> (0x20 - uVar4 & 0xff)) +
          (uint)(0x7fffffff < uVar5);
  if (uVar5 == 0x80000000) {
    uVar2 = uVar2 & 0xfffffffe;
  }
  return uVar2;
}



### FUNC __mulsf3 @ 00056860

uint __mulsf3(uint param_1,uint param_2,undefined4 param_3,uint param_4)

{
  uint uVar1;
  longlong lVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  int iVar7;
  uint uVar8;
  uint uVar9;
  bool bVar10;
  bool bVar11;
  
  uVar3 = param_1 >> 0x17 & 0xff;
  bVar10 = uVar3 == 0;
  if (!bVar10) {
    param_4 = param_2 >> 0x17 & 0xff;
    bVar10 = param_4 == 0;
  }
  if (!bVar10) {
    bVar10 = uVar3 == 0xff;
  }
  if (!bVar10) {
    bVar10 = param_4 == 0xff;
  }
  if (bVar10) {
    param_4 = param_2 >> 0x17 & 0xff;
    if (uVar3 == 0xff || param_4 == 0xff) {
      uVar9 = param_2;
      if (param_1 != 0 && param_1 != 0x80000000) {
        uVar9 = param_1;
      }
      uVar5 = uVar9;
      if (((((param_1 == 0 || param_1 == 0x80000000) || param_2 == 0) || param_2 == 0x80000000) ||
          ((uVar3 == 0xff && ((uVar9 & 0x7fffff) != 0)))) ||
         ((param_4 == 0xff && (uVar5 = param_2, (param_2 & 0x7fffff) != 0)))) {
        return uVar5 | 0x7fc00000;
      }
      uVar9 = uVar9 ^ param_2;
      goto LAB_000569dc;
    }
    if ((param_1 & 0x7fffffff) == 0 || (param_2 & 0x7fffffff) == 0) {
      return (param_1 ^ param_2) & 0x80000000;
    }
    bVar10 = uVar3 == 0;
    uVar9 = param_1 & 0x80000000;
    while( true ) {
      if (bVar10) {
        param_1 = param_1 << 1;
        bVar10 = (param_1 & 0x800000) == 0;
      }
      if (!bVar10) break;
      uVar3 = uVar3 - 1;
    }
    param_1 = param_1 | uVar9;
    bVar10 = param_4 == 0;
    uVar9 = param_2 & 0x80000000;
    while( true ) {
      if (bVar10) {
        param_2 = param_2 << 1;
        bVar10 = (param_2 & 0x800000) == 0;
      }
      if (!bVar10) break;
      param_4 = param_4 - 1;
    }
    param_2 = param_2 | uVar9;
  }
  iVar4 = uVar3 + param_4;
  uVar9 = param_1 ^ param_2;
  uVar3 = param_1 << 9;
  bVar10 = uVar3 == 0;
  if (!bVar10) {
    param_2 = param_2 << 9;
    bVar10 = param_2 == 0;
  }
  if (bVar10) {
    if (uVar3 == 0) {
      param_2 = param_2 << 9;
    }
    uVar9 = uVar9 & 0x80000000 | param_1 & 0x7fffff | param_2 >> 9;
    bVar11 = SBORROW4(iVar4,0x7f);
    iVar6 = iVar4 + -0x7f;
    bVar10 = iVar6 == 0;
    iVar7 = iVar6;
    if (!bVar10 && 0x7e < iVar4) {
      bVar11 = SBORROW4(0xff,iVar6);
      iVar7 = -iVar6 + 0xff;
      bVar10 = -iVar6 == -0xff;
    }
    if (!bVar10 && iVar7 < 0 == bVar11) {
      return uVar9 | iVar6 * 0x800000;
    }
    uVar9 = uVar9 | 0x800000;
    uVar8 = 0;
    bVar11 = SBORROW4(iVar6,1);
    uVar5 = iVar4 - 0x80;
    bVar10 = uVar5 == 0;
    uVar3 = uVar5;
  }
  else {
    lVar2 = (ulonglong)(param_2 >> 5 | 0x8000000) * (ulonglong)(uVar3 >> 5 | 0x8000000);
    bVar10 = (uint)((ulonglong)lVar2 >> 0x20) < 0x800000;
    if (bVar10) {
      lVar2 = lVar2 * 2;
    }
    uVar8 = (uint)lVar2;
    uVar9 = uVar9 & 0x80000000 | (uint)((ulonglong)lVar2 >> 0x20);
    uVar5 = iVar4 - (bVar10 + 0x7f);
    bVar11 = SBORROW4(uVar5,0xfd);
    bVar10 = uVar5 == 0xfd;
    uVar3 = uVar5 - 0xfd;
    if (uVar5 < 0xfe) {
      uVar3 = uVar9 + uVar5 * 0x800000 + (uint)(0x7fffffff < uVar8);
      if (uVar8 == 0x80000000) {
        uVar3 = uVar3 & 0xfffffffe;
      }
      return uVar3;
    }
  }
  if (bVar10 || (int)uVar3 < 0 != bVar11) {
    if (uVar5 != 0xffffffe7 && (int)(uVar5 + 0x19) < 0 == SCARRY4(uVar5,0x19)) {
      uVar1 = (uVar9 << 1) >> (-uVar5 & 0xff);
      uVar3 = uVar9 << (uVar5 + 0x20 & 0xff);
      uVar9 = (uVar9 & 0x80000000 | uVar1 >> 1) + (uint)((byte)uVar1 & 1);
      if (uVar8 == 0 && (uVar3 & 0x7fffffff) == 0) {
        uVar9 = uVar9 & ~(uVar3 >> 0x1f);
      }
      return uVar9;
    }
    return uVar9 & 0x80000000;
  }
LAB_000569dc:
  return uVar9 & 0x80000000 | 0x7f800000;
}



### FUNC __divsf3 @ 000569f8

uint __divsf3(uint param_1,uint param_2,undefined4 param_3,uint param_4)

{
  uint uVar1;
  uint uVar2;
  int iVar3;
  uint uVar4;
  int iVar5;
  uint uVar6;
  bool bVar7;
  bool bVar8;
  bool bVar9;
  
  uVar2 = param_1 >> 0x17 & 0xff;
  bVar7 = uVar2 == 0;
  if (!bVar7) {
    param_4 = param_2 >> 0x17 & 0xff;
    bVar7 = param_4 == 0;
  }
  if (!bVar7) {
    bVar7 = uVar2 == 0xff;
  }
  if (!bVar7) {
    bVar7 = param_4 == 0xff;
  }
  if (bVar7) {
    param_4 = param_2 >> 0x17 & 0xff;
    uVar6 = param_1;
    if (uVar2 == 0xff) {
      if (((param_1 & 0x7fffff) != 0) || (uVar6 = param_2, param_4 == 0xff)) {
LAB_000569ec:
        return uVar6 | 0x7fc00000;
      }
    }
    else {
      if (param_4 == 0xff) {
        uVar6 = param_2;
        if ((param_2 & 0x7fffff) == 0) {
LAB_00056990:
          return (param_1 ^ param_2) & 0x80000000;
        }
        goto LAB_000569ec;
      }
      if ((param_1 & 0x7fffffff) != 0 && (param_2 & 0x7fffffff) != 0) {
        bVar7 = uVar2 == 0;
        uVar6 = param_1 & 0x80000000;
        while( true ) {
          if (bVar7) {
            param_1 = param_1 << 1;
            bVar7 = (param_1 & 0x800000) == 0;
          }
          if (!bVar7) break;
          uVar2 = uVar2 - 1;
        }
        param_1 = param_1 | uVar6;
        bVar7 = param_4 == 0;
        uVar6 = param_2 & 0x80000000;
        while( true ) {
          if (bVar7) {
            param_2 = param_2 << 1;
            bVar7 = (param_2 & 0x800000) == 0;
          }
          if (!bVar7) break;
          param_4 = param_4 - 1;
        }
        param_2 = param_2 | uVar6;
        goto LAB_00056a10;
      }
      if ((param_1 & 0x7fffffff) == 0) {
        if ((param_2 & 0x7fffffff) != 0) goto LAB_00056990;
        goto LAB_000569ec;
      }
    }
    param_1 = param_1 ^ param_2;
  }
  else {
LAB_00056a10:
    iVar3 = uVar2 - param_4;
    if (param_2 << 9 == 0) {
      param_1 = (param_1 ^ param_2) & 0x80000000 | param_1 & 0x7fffff;
      bVar9 = SCARRY4(iVar3,0x7f);
      iVar5 = iVar3 + 0x7f;
      bVar7 = iVar5 < 0;
      bVar8 = iVar5 == 0;
      if (!bVar8 && bVar7 == bVar9) {
        bVar9 = SBORROW4(0xff,iVar5);
        bVar7 = -iVar5 + 0xff < 0;
        bVar8 = -iVar5 == -0xff;
      }
      if (!bVar8 && bVar7 == bVar9) {
        return param_1 | iVar5 * 0x800000;
      }
      param_1 = param_1 | 0x800000;
      uVar2 = 0;
      bVar8 = SBORROW4(iVar5,1);
      uVar4 = iVar3 + 0x7e;
      bVar7 = uVar4 == 0;
      uVar6 = uVar4;
    }
    else {
      uVar1 = (param_2 << 9) >> 4 | 0x10000000;
      uVar2 = (param_1 << 9) >> 4 | 0x10000000;
      param_1 = (param_1 ^ param_2) & 0x80000000;
      bVar7 = uVar1 <= uVar2;
      if (!bVar7) {
        uVar2 = uVar2 << 1;
      }
      uVar4 = iVar3 + 0x7d + (uint)bVar7;
      uVar6 = 0x800000;
      do {
        if (uVar1 <= uVar2) {
          uVar2 = uVar2 - uVar1;
          param_1 = param_1 | uVar6;
        }
        if (uVar1 >> 1 <= uVar2) {
          uVar2 = uVar2 - (uVar1 >> 1);
          param_1 = param_1 | uVar6 >> 1;
        }
        if (uVar1 >> 2 <= uVar2) {
          uVar2 = uVar2 - (uVar1 >> 2);
          param_1 = param_1 | uVar6 >> 2;
        }
        if (uVar1 >> 3 <= uVar2) {
          uVar2 = uVar2 - (uVar1 >> 3);
          param_1 = param_1 | uVar6 >> 3;
        }
        uVar2 = uVar2 * 0x10;
        bVar7 = uVar2 == 0;
        if (!bVar7) {
          uVar6 = uVar6 >> 4;
          bVar7 = uVar6 == 0;
        }
      } while (!bVar7);
      bVar8 = SBORROW4(uVar4,0xfd);
      bVar7 = uVar4 == 0xfd;
      uVar6 = uVar4 - 0xfd;
      if (uVar4 < 0xfe) {
        uVar6 = param_1 + uVar4 * 0x800000 + (uint)(uVar1 <= uVar2);
        if (uVar2 == uVar1) {
          uVar6 = uVar6 & 0xfffffffe;
        }
        return uVar6;
      }
    }
    if (bVar7 || (int)uVar6 < 0 != bVar8) {
      if (uVar4 != 0xffffffe7 && (int)(uVar4 + 0x19) < 0 == SCARRY4(uVar4,0x19)) {
        uVar1 = (param_1 << 1) >> (-uVar4 & 0xff);
        uVar6 = param_1 << (uVar4 + 0x20 & 0xff);
        uVar4 = (param_1 & 0x80000000 | uVar1 >> 1) + (uint)((byte)uVar1 & 1);
        if (uVar2 == 0 && (uVar6 & 0x7fffffff) == 0) {
          uVar4 = uVar4 & ~(uVar6 >> 0x1f);
        }
        return uVar4;
      }
      return param_1 & 0x80000000;
    }
  }
  return param_1 & 0x80000000 | 0x7f800000;
}



### FUNC __gesf2 @ 00056b58

uint __gesf2(uint param_1,uint param_2)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  bool bVar4;
  bool bVar5;
  
  uVar1 = param_1 * 2;
  uVar2 = param_2 * 2;
  if (((int)uVar1 >> 0x18 == -1 || (int)uVar2 >> 0x18 == -1) &&
     ((((int)uVar1 >> 0x18 == -1 && ((param_1 & 0x7fffff) != 0)) ||
      (((int)uVar2 >> 0x18 == -1 && ((param_2 & 0x7fffff) != 0)))))) {
    return 0xffffffff;
  }
  uVar3 = uVar1 | param_2 & 0x7fffffff;
  bVar5 = uVar3 == 0;
  if (!bVar5) {
    uVar3 = param_1 ^ param_2;
    bVar5 = uVar3 == 0;
  }
  bVar4 = -1 < (int)uVar3;
  if (bVar4) {
    param_1 = uVar1 + param_2 * -2;
    bVar5 = param_1 == 0;
  }
  if ((bVar4 && uVar1 >= uVar2) && !bVar5) {
    param_1 = (int)param_2 >> 0x1f;
  }
  if (!bVar4 || uVar1 < uVar2) {
    param_1 = ~((int)param_2 >> 0x1f);
  }
  if (!bVar5) {
    param_1 = param_1 | 1;
  }
  return param_1;
}



### FUNC __lesf2 @ 00056b60

uint __lesf2(uint param_1,uint param_2)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  bool bVar4;
  bool bVar5;
  
  uVar1 = param_1 * 2;
  uVar2 = param_2 * 2;
  if (((int)uVar1 >> 0x18 == -1 || (int)uVar2 >> 0x18 == -1) &&
     ((((int)uVar1 >> 0x18 == -1 && ((param_1 & 0x7fffff) != 0)) ||
      (((int)uVar2 >> 0x18 == -1 && ((param_2 & 0x7fffff) != 0)))))) {
    return 1;
  }
  uVar3 = uVar1 | param_2 & 0x7fffffff;
  bVar5 = uVar3 == 0;
  if (!bVar5) {
    uVar3 = param_1 ^ param_2;
    bVar5 = uVar3 == 0;
  }
  bVar4 = -1 < (int)uVar3;
  if (bVar4) {
    param_1 = uVar1 + param_2 * -2;
    bVar5 = param_1 == 0;
  }
  if ((bVar4 && uVar1 >= uVar2) && !bVar5) {
    param_1 = (int)param_2 >> 0x1f;
  }
  if (!bVar4 || uVar1 < uVar2) {
    param_1 = ~((int)param_2 >> 0x1f);
  }
  if (!bVar5) {
    param_1 = param_1 | 1;
  }
  return param_1;
}



### FUNC __eqsf2 @ 00056b68

uint __eqsf2(uint param_1,uint param_2)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  bool bVar4;
  bool bVar5;
  
  uVar1 = param_1 * 2;
  uVar2 = param_2 * 2;
  if (((int)uVar1 >> 0x18 == -1 || (int)uVar2 >> 0x18 == -1) &&
     ((((int)uVar1 >> 0x18 == -1 && ((param_1 & 0x7fffff) != 0)) ||
      (((int)uVar2 >> 0x18 == -1 && ((param_2 & 0x7fffff) != 0)))))) {
    return 1;
  }
  uVar3 = uVar1 | param_2 & 0x7fffffff;
  bVar5 = uVar3 == 0;
  if (!bVar5) {
    uVar3 = param_1 ^ param_2;
    bVar5 = uVar3 == 0;
  }
  bVar4 = -1 < (int)uVar3;
  if (bVar4) {
    param_1 = uVar1 + param_2 * -2;
    bVar5 = param_1 == 0;
  }
  if ((bVar4 && uVar1 >= uVar2) && !bVar5) {
    param_1 = (int)param_2 >> 0x1f;
  }
  if (!bVar4 || uVar1 < uVar2) {
    param_1 = ~((int)param_2 >> 0x1f);
  }
  if (!bVar5) {
    param_1 = param_1 | 1;
  }
  return param_1;
}



### FUNC __aeabi_cfrcmple @ 00056bcc

void __aeabi_cfrcmple(undefined4 param_1,undefined4 param_2)

{
  __aeabi_cfcmple(param_2,param_1);
  return;
}



### FUNC __aeabi_cfcmple @ 00056bdc

undefined8 __aeabi_cfcmple(undefined4 param_1,undefined4 param_2)

{
  __eqsf2();
  return CONCAT44(param_2,param_1);
}



### FUNC __aeabi_fcmpeq @ 00056bf0

undefined1 __aeabi_fcmpeq(void)

{
  undefined1 in_ZR;
  
  __aeabi_cfcmple();
  return in_ZR;
}



### FUNC __aeabi_fcmplt @ 00056c04

bool __aeabi_fcmplt(void)

{
  undefined1 in_CY;
  
  __aeabi_cfcmple();
  return !(bool)in_CY;
}



### FUNC __aeabi_fcmple @ 00056c18

bool __aeabi_fcmple(void)

{
  undefined1 in_ZR;
  undefined1 in_CY;
  
  __aeabi_cfcmple();
  return !(bool)in_CY || (bool)in_ZR;
}



### FUNC __aeabi_fcmpge @ 00056c2c

bool __aeabi_fcmpge(void)

{
  undefined1 in_ZR;
  undefined1 in_CY;
  
  __aeabi_cfrcmple();
  return !(bool)in_CY || (bool)in_ZR;
}



### FUNC __aeabi_fcmpgt @ 00056c40

bool __aeabi_fcmpgt(void)

{
  undefined1 in_CY;
  
  __aeabi_cfrcmple();
  return !(bool)in_CY;
}



### FUNC __unordsf2 @ 00056c54

undefined4 __unordsf2(uint param_1,uint param_2)

{
  if ((((int)(param_1 << 1) >> 0x18 != -1) || ((param_1 & 0x7fffff) == 0)) &&
     (((int)(param_2 << 1) >> 0x18 != -1 || ((param_2 & 0x7fffff) == 0)))) {
    return 0;
  }
  return 1;
}



### FUNC __fixsfsi @ 00056c8c

uint __fixsfsi(uint param_1)

{
  uint uVar1;
  uint uVar2;
  
  if (param_1 << 1 < 0x7f000000) {
    return 0;
  }
  uVar1 = (param_1 << 1) >> 0x18;
  uVar2 = 0x9e - uVar1;
  if (uVar1 < 0x9f && uVar2 != 0) {
    uVar1 = (param_1 << 8 | 0x80000000) >> (uVar2 & 0xff);
    if ((param_1 & 0x80000000) != 0) {
      uVar1 = -uVar1;
    }
    return uVar1;
  }
  if ((uVar2 == 0xffffff9f) && ((param_1 & 0x7fffff) != 0)) {
    return 0;
  }
  param_1 = param_1 & 0x80000000;
  if (param_1 == 0) {
    param_1 = 0x7fffffff;
  }
  return param_1;
}



### FUNC __fixunssfsi @ 00056ce8

uint __fixunssfsi(uint param_1)

{
  uint uVar1;
  
  if ((SUB41(param_1 >> 0x1f,0)) || (param_1 << 1 < 0x7f000000)) {
    return 0;
  }
  uVar1 = 0x9e - ((param_1 << 1) >> 0x18);
  if (-1 < (int)uVar1) {
    return (param_1 << 8 | 0x80000000) >> (uVar1 & 0xff);
  }
  if ((uVar1 == 0xffffff9f) && ((param_1 & 0x7fffff) != 0)) {
    return 0;
  }
  return 0xffffffff;
}



### FUNC __aeabi_ldivmod @ 00056d3c

void __aeabi_ldivmod(int param_1,int param_2,int param_3,int param_4)

{
  bool bVar1;
  bool bVar2;
  bool bVar3;
  
  if (param_4 != 0 || param_3 != 0) {
    __gnu_ldivmod_helper();
    return;
  }
  bVar1 = param_2 < 0;
  bVar2 = param_2 == 0;
  if (bVar2) {
    bVar1 = param_1 < 0;
  }
  bVar3 = param_1 != 0;
  if (bVar1) {
    param_2 = -0x80000000;
    param_1 = 0;
  }
  if ((!bVar2 || bVar3) && !bVar1) {
    param_2 = 0x7fffffff;
  }
  if ((!bVar2 || bVar3) && !bVar1) {
    param_1 = -1;
  }
  __aeabi_ldiv0(param_1,param_2);
  return;
}



### FUNC __aeabi_uldivmod @ 00056d80

void __aeabi_uldivmod(int param_1,int param_2,int param_3,int param_4)

{
  if (param_4 != 0 || param_3 != 0) {
    __gnu_uldivmod_helper();
    return;
  }
  if (param_2 != 0 || param_1 != 0) {
    param_2 = -1;
    param_1 = -1;
  }
  __aeabi_ldiv0(param_1,param_2);
  return;
}



### FUNC __aeabi_ldiv0 @ 00056dbc

void __aeabi_ldiv0(void)

{
  raise(8);
  return;
}



### FUNC __muldi3 @ 00056dcc

undefined8 __muldi3(uint param_1,int param_2,uint param_3,int param_4)

{
  return CONCAT44(param_4 * param_1 + param_2 * param_3 +
                  (int)((ulonglong)param_1 * (ulonglong)param_3 >> 0x20),
                  (int)((ulonglong)param_1 * (ulonglong)param_3));
}



### FUNC __gnu_ldivmod_helper @ 00056de8

void __gnu_ldivmod_helper
               (uint param_1,int param_2,undefined4 param_3,undefined4 param_4,int *param_5)

{
  uint uVar1;
  longlong lVar2;
  
  lVar2 = __divdi3();
  lVar2 = lVar2 * CONCAT44(param_4,param_3);
  uVar1 = (uint)lVar2;
  *param_5 = param_1 - uVar1;
  param_5[1] = param_2 - ((int)((ulonglong)lVar2 >> 0x20) + (uint)(param_1 < uVar1));
  return;
}



### FUNC __gnu_uldivmod_helper @ 00056e24

void __gnu_uldivmod_helper
               (uint param_1,int param_2,undefined4 param_3,undefined4 param_4,int *param_5)

{
  uint uVar1;
  longlong lVar2;
  
  lVar2 = __udivdi3();
  lVar2 = lVar2 * CONCAT44(param_4,param_3);
  uVar1 = (uint)lVar2;
  *param_5 = param_1 - uVar1;
  param_5[1] = param_2 - ((int)((ulonglong)lVar2 >> 0x20) + (uint)(param_1 < uVar1));
  return;
}



### FUNC FUN_00056e60 @ 00056e60

int FUN_00056e60(int *param_1,int param_2)

{
  int iVar1;
  int iVar2;
  
  do {
    iVar2 = *param_1;
    iVar1 = (*(code *)&SUB_ffff0fc0)(iVar2,iVar2 + param_2,param_1);
  } while (iVar1 != 0);
  return iVar2;
}



### FUNC FUN_00056e98 @ 00056e98

int FUN_00056e98(int *param_1,int param_2)

{
  int iVar1;
  int iVar2;
  
  do {
    iVar2 = *param_1;
    iVar1 = (*(code *)&SUB_ffff0fc0)(iVar2,iVar2 - param_2,param_1);
  } while (iVar1 != 0);
  return iVar2;
}



### FUNC FUN_00056ed0 @ 00056ed0

uint FUN_00056ed0(uint *param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  
  do {
    uVar2 = *param_1;
    iVar1 = (*(code *)&SUB_ffff0fc0)(uVar2,uVar2 | param_2,param_1);
  } while (iVar1 != 0);
  return uVar2;
}



### FUNC FUN_00056f08 @ 00056f08

uint FUN_00056f08(uint *param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  
  do {
    uVar2 = *param_1;
    iVar1 = (*(code *)&SUB_ffff0fc0)(uVar2,uVar2 & param_2,param_1);
  } while (iVar1 != 0);
  return uVar2;
}



### FUNC FUN_00056f40 @ 00056f40

uint FUN_00056f40(uint *param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  
  do {
    uVar2 = *param_1;
    iVar1 = (*(code *)&SUB_ffff0fc0)(uVar2,uVar2 ^ param_2,param_1);
  } while (iVar1 != 0);
  return uVar2;
}



### FUNC FUN_00056f78 @ 00056f78

uint FUN_00056f78(uint *param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  
  do {
    uVar2 = *param_1;
    iVar1 = (*(code *)&SUB_ffff0fc0)(uVar2,~(uVar2 & param_2),param_1);
  } while (iVar1 != 0);
  return uVar2;
}



### FUNC FUN_00056fb4 @ 00056fb4

int FUN_00056fb4(uint param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  
  iVar1 = (param_1 & 3) << 3;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar2 = (uVar3 & 0xffff << iVar1) >> iVar1;
    iVar4 = (*(code *)&SUB_ffff0fc0)
                      (uVar3,(uVar2 + param_2 & 0xffff) << iVar1 | ~(0xffff << iVar1) & uVar3,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(short)uVar2;
}



### FUNC FUN_00057018 @ 00057018

int FUN_00057018(uint param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  
  iVar1 = (param_1 & 3) << 3;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar2 = (uVar3 & 0xffff << iVar1) >> iVar1;
    iVar4 = (*(code *)&SUB_ffff0fc0)
                      (uVar3,(uVar2 - param_2 & 0xffff) << iVar1 | ~(0xffff << iVar1) & uVar3,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(short)uVar2;
}



### FUNC FUN_0005707c @ 0005707c

int FUN_0005707c(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  
  iVar1 = (param_1 & 3) << 3;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar2 = (uVar3 & 0xffff << iVar1) >> iVar1;
    iVar4 = (*(code *)&SUB_ffff0fc0)
                      (uVar3,((uVar2 | param_2) & 0xffff) << iVar1 | ~(0xffff << iVar1) & uVar3,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(short)uVar2;
}



### FUNC FUN_000570e0 @ 000570e0

int FUN_000570e0(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  
  iVar1 = (param_1 & 3) << 3;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar2 = (uVar3 & 0xffff << iVar1) >> iVar1;
    iVar4 = (*(code *)&SUB_ffff0fc0)
                      (uVar3,(uVar2 & param_2 & 0xffff) << iVar1 | ~(0xffff << iVar1) & uVar3,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(short)uVar2;
}



### FUNC FUN_00057144 @ 00057144

int FUN_00057144(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  
  iVar1 = (param_1 & 3) << 3;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar2 = (uVar3 & 0xffff << iVar1) >> iVar1;
    iVar4 = (*(code *)&SUB_ffff0fc0)
                      (uVar3,((uVar2 ^ param_2) & 0xffff) << iVar1 | ~(0xffff << iVar1) & uVar3,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(short)uVar2;
}



### FUNC FUN_000571a8 @ 000571a8

int FUN_000571a8(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  
  iVar1 = (param_1 & 3) << 3;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar2 = (uVar3 & 0xffff << iVar1) >> iVar1;
    iVar4 = (*(code *)&SUB_ffff0fc0)
                      (uVar3,(~(uVar2 & param_2) & 0xffff) << iVar1 | ~(0xffff << iVar1) & uVar3,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(short)uVar2;
}



### FUNC FUN_00057210 @ 00057210

int FUN_00057210(uint param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  int iVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar4 = *(uint *)(param_1 & 0xfffffffc);
    uVar3 = (uVar4 & uVar2) >> iVar1;
    iVar5 = (*(code *)&SUB_ffff0fc0)
                      (uVar4,uVar2 & uVar3 + param_2 << iVar1 | ~uVar2 & uVar4,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar5 != 0);
  return (int)(char)uVar3;
}



### FUNC FUN_00057270 @ 00057270

int FUN_00057270(uint param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  int iVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar4 = *(uint *)(param_1 & 0xfffffffc);
    uVar3 = (uVar4 & uVar2) >> iVar1;
    iVar5 = (*(code *)&SUB_ffff0fc0)
                      (uVar4,uVar2 & uVar3 - param_2 << iVar1 | ~uVar2 & uVar4,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar5 != 0);
  return (int)(char)uVar3;
}



### FUNC FUN_000572d0 @ 000572d0

int FUN_000572d0(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  int iVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar4 = *(uint *)(param_1 & 0xfffffffc);
    uVar3 = (uVar4 & uVar2) >> iVar1;
    iVar5 = (*(code *)&SUB_ffff0fc0)
                      (uVar4,uVar2 & (uVar3 | param_2) << iVar1 | ~uVar2 & uVar4,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar5 != 0);
  return (int)(char)uVar3;
}



### FUNC FUN_00057330 @ 00057330

int FUN_00057330(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  int iVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar4 = *(uint *)(param_1 & 0xfffffffc);
    uVar3 = (uVar4 & uVar2) >> iVar1;
    iVar5 = (*(code *)&SUB_ffff0fc0)
                      (uVar4,uVar2 & (uVar3 & param_2) << iVar1 | ~uVar2 & uVar4,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar5 != 0);
  return (int)(char)uVar3;
}



### FUNC FUN_00057390 @ 00057390

int FUN_00057390(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  int iVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar4 = *(uint *)(param_1 & 0xfffffffc);
    uVar3 = (uVar4 & uVar2) >> iVar1;
    iVar5 = (*(code *)&SUB_ffff0fc0)
                      (uVar4,uVar2 & (uVar3 ^ param_2) << iVar1 | ~uVar2 & uVar4,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar5 != 0);
  return (int)(char)uVar3;
}



### FUNC FUN_000573f0 @ 000573f0

int FUN_000573f0(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  int iVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar4 = *(uint *)(param_1 & 0xfffffffc);
    uVar3 = (uVar4 & uVar2) >> iVar1;
    iVar5 = (*(code *)&SUB_ffff0fc0)
                      (uVar4,uVar2 & ~(uVar3 & param_2) << iVar1 | ~uVar2 & uVar4,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar5 != 0);
  return (int)(char)uVar3;
}



### FUNC FUN_00057454 @ 00057454

int FUN_00057454(int *param_1,int param_2)

{
  int iVar1;
  int iVar2;
  
  do {
    iVar2 = *param_1 + param_2;
    iVar1 = (*(code *)&SUB_ffff0fc0)(*param_1,iVar2,param_1);
  } while (iVar1 != 0);
  return iVar2;
}



### FUNC FUN_0005748c @ 0005748c

int FUN_0005748c(int *param_1,int param_2)

{
  int iVar1;
  int iVar2;
  
  do {
    iVar2 = *param_1 - param_2;
    iVar1 = (*(code *)&SUB_ffff0fc0)(*param_1,iVar2,param_1);
  } while (iVar1 != 0);
  return iVar2;
}



### FUNC FUN_000574c4 @ 000574c4

uint FUN_000574c4(uint *param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  
  do {
    uVar2 = *param_1 | param_2;
    iVar1 = (*(code *)&SUB_ffff0fc0)(*param_1,uVar2,param_1);
  } while (iVar1 != 0);
  return uVar2;
}



### FUNC FUN_000574fc @ 000574fc

uint FUN_000574fc(uint *param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  
  do {
    uVar2 = *param_1 & param_2;
    iVar1 = (*(code *)&SUB_ffff0fc0)(*param_1,uVar2,param_1);
  } while (iVar1 != 0);
  return uVar2;
}



### FUNC FUN_00057534 @ 00057534

uint FUN_00057534(uint *param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  
  do {
    uVar2 = *param_1 ^ param_2;
    iVar1 = (*(code *)&SUB_ffff0fc0)(*param_1,uVar2,param_1);
  } while (iVar1 != 0);
  return uVar2;
}



### FUNC FUN_0005756c @ 0005756c

uint FUN_0005756c(uint *param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  
  do {
    uVar2 = ~(*param_1 & param_2);
    iVar1 = (*(code *)&SUB_ffff0fc0)(*param_1,uVar2,param_1);
  } while (iVar1 != 0);
  return uVar2;
}



### FUNC FUN_000575a8 @ 000575a8

int FUN_000575a8(uint param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xffff << iVar1;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar5 = (param_2 + ((uVar3 & uVar2) >> iVar1) & 0xffff) << iVar1 | ~uVar2 & uVar3;
    iVar4 = (*(code *)&SUB_ffff0fc0)(uVar3,uVar5,(uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(short)((uVar5 & uVar2) >> iVar1);
}



### FUNC FUN_00057614 @ 00057614

int FUN_00057614(uint param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xffff << iVar1;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar5 = (((uVar3 & uVar2) >> iVar1) - param_2 & 0xffff) << iVar1 | ~uVar2 & uVar3;
    iVar4 = (*(code *)&SUB_ffff0fc0)(uVar3,uVar5,(uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(short)((uVar5 & uVar2) >> iVar1);
}



### FUNC FUN_00057680 @ 00057680

int FUN_00057680(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xffff << iVar1;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar5 = ((param_2 | (uVar3 & uVar2) >> iVar1) & 0xffff) << iVar1 | ~uVar2 & uVar3;
    iVar4 = (*(code *)&SUB_ffff0fc0)(uVar3,uVar5,(uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(short)((uVar5 & uVar2) >> iVar1);
}



### FUNC FUN_000576ec @ 000576ec

int FUN_000576ec(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xffff << iVar1;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar5 = (param_2 & (uVar3 & uVar2) >> iVar1 & 0xffff) << iVar1 | ~uVar2 & uVar3;
    iVar4 = (*(code *)&SUB_ffff0fc0)(uVar3,uVar5,(uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(short)((uVar5 & uVar2) >> iVar1);
}



### FUNC FUN_00057758 @ 00057758

int FUN_00057758(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xffff << iVar1;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar5 = ((param_2 ^ (uVar3 & uVar2) >> iVar1) & 0xffff) << iVar1 | ~uVar2 & uVar3;
    iVar4 = (*(code *)&SUB_ffff0fc0)(uVar3,uVar5,(uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(short)((uVar5 & uVar2) >> iVar1);
}



### FUNC FUN_000577c4 @ 000577c4

int FUN_000577c4(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xffff << iVar1;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar5 = (~(param_2 & (uVar3 & uVar2) >> iVar1) & 0xffff) << iVar1 | ~uVar2 & uVar3;
    iVar4 = (*(code *)&SUB_ffff0fc0)(uVar3,uVar5,(uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(short)((uVar5 & uVar2) >> iVar1);
}



### FUNC FUN_00057834 @ 00057834

int FUN_00057834(uint param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar5 = uVar2 & param_2 + ((uVar3 & uVar2) >> iVar1) << iVar1 | ~uVar2 & uVar3;
    iVar4 = (*(code *)&SUB_ffff0fc0)(uVar3,uVar5,(uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(char)((uVar5 & uVar2) >> iVar1);
}



### FUNC FUN_0005789c @ 0005789c

int FUN_0005789c(uint param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar5 = uVar2 & ((uVar3 & uVar2) >> iVar1) - param_2 << iVar1 | ~uVar2 & uVar3;
    iVar4 = (*(code *)&SUB_ffff0fc0)(uVar3,uVar5,(uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(char)((uVar5 & uVar2) >> iVar1);
}



### FUNC FUN_00057904 @ 00057904

int FUN_00057904(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar5 = uVar2 & (param_2 | (uVar3 & uVar2) >> iVar1) << iVar1 | ~uVar2 & uVar3;
    iVar4 = (*(code *)&SUB_ffff0fc0)(uVar3,uVar5,(uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(char)((uVar5 & uVar2) >> iVar1);
}



### FUNC FUN_0005796c @ 0005796c

int FUN_0005796c(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar5 = uVar2 & (param_2 & (uVar3 & uVar2) >> iVar1) << iVar1 | ~uVar2 & uVar3;
    iVar4 = (*(code *)&SUB_ffff0fc0)(uVar3,uVar5,(uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(char)((uVar5 & uVar2) >> iVar1);
}



### FUNC FUN_000579d4 @ 000579d4

int FUN_000579d4(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar5 = uVar2 & (param_2 ^ (uVar3 & uVar2) >> iVar1) << iVar1 | ~uVar2 & uVar3;
    iVar4 = (*(code *)&SUB_ffff0fc0)(uVar3,uVar5,(uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(char)((uVar5 & uVar2) >> iVar1);
}



### FUNC FUN_00057a3c @ 00057a3c

int FUN_00057a3c(uint param_1,uint param_2)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar5 = uVar2 & ~(param_2 & (uVar3 & uVar2) >> iVar1) << iVar1 | ~uVar2 & uVar3;
    iVar4 = (*(code *)&SUB_ffff0fc0)(uVar3,uVar5,(uint *)(param_1 & 0xfffffffc));
  } while (iVar4 != 0);
  return (int)(char)((uVar5 & uVar2) >> iVar1);
}



### FUNC FUN_00057aa8 @ 00057aa8

int FUN_00057aa8(int *param_1,int param_2,undefined4 param_3)

{
  int iVar1;
  
  do {
    if (param_2 != *param_1) {
      return *param_1;
    }
    iVar1 = (*(code *)&SUB_ffff0fc0)(param_2,param_3,param_1);
  } while (iVar1 != 0);
  return param_2;
}



### FUNC FUN_00057aec @ 00057aec

int FUN_00057aec(uint param_1,ushort param_2,uint param_3,undefined4 param_4)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  
  iVar1 = (param_1 & 3) << 3;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    uVar2 = (uVar3 & 0xffff << iVar1) >> iVar1;
    if (uVar2 != param_2) {
      param_2 = (ushort)uVar2;
      break;
    }
    iVar4 = (*(code *)&SUB_ffff0fc0)
                      (uVar3,~(0xffff << iVar1) & uVar3 | (param_3 & 0xffff) << iVar1,
                       (uint *)(param_1 & 0xfffffffc),uVar2,param_4);
  } while (iVar4 != 0);
  return (int)(short)param_2;
}



### FUNC FUN_00057b68 @ 00057b68

int FUN_00057b68(uint param_1,byte param_2,int param_3,undefined4 param_4)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  int iVar5;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar4 = *(uint *)(param_1 & 0xfffffffc);
    uVar3 = (uVar4 & uVar2) >> iVar1;
    if (uVar3 != param_2) {
      param_2 = (byte)uVar3;
      break;
    }
    iVar5 = (*(code *)&SUB_ffff0fc0)
                      (uVar4,~uVar2 & uVar4 | uVar2 & param_3 << iVar1,
                       (uint *)(param_1 & 0xfffffffc),uVar3,param_4);
  } while (iVar5 != 0);
  return (int)(char)param_2;
}



### FUNC FUN_00057bd8 @ 00057bd8

bool FUN_00057bd8(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)

{
  int iVar1;
  
  iVar1 = (*(code *)&SUB_ffff0fc0)(param_2,param_3,param_1,&SUB_ffff0fc0,param_4);
  return iVar1 == 0;
}



### FUNC FUN_00057c24 @ 00057c24

bool FUN_00057c24(undefined4 param_1,int param_2)

{
  char cVar1;
  
  cVar1 = FUN_00057b68();
  return param_2 == cVar1;
}



### FUNC FUN_00057c50 @ 00057c50

undefined4 FUN_00057c50(undefined4 *param_1,undefined4 param_2)

{
  int iVar1;
  undefined4 uVar2;
  
  do {
    uVar2 = *param_1;
    iVar1 = (*(code *)&SUB_ffff0fc0)(uVar2,param_2,param_1);
  } while (iVar1 != 0);
  return uVar2;
}



### FUNC FUN_00057c88 @ 00057c88

int FUN_00057c88(uint param_1,uint param_2)

{
  int iVar1;
  int iVar2;
  uint uVar3;
  
  iVar1 = (param_1 & 3) << 3;
  do {
    uVar3 = *(uint *)(param_1 & 0xfffffffc);
    iVar2 = (*(code *)&SUB_ffff0fc0)
                      (uVar3,~(0xffff << iVar1) & uVar3 | (param_2 & 0xffff) << iVar1,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar2 != 0);
  return (int)(short)((0xffff << iVar1 & uVar3) >> iVar1);
}



### FUNC FUN_00057ce8 @ 00057ce8

int FUN_00057ce8(uint param_1,int param_2)

{
  int iVar1;
  uint uVar2;
  int iVar3;
  uint uVar4;
  
  iVar1 = (param_1 & 3) << 3;
  uVar2 = 0xff << iVar1;
  do {
    uVar4 = *(uint *)(param_1 & 0xfffffffc);
    iVar3 = (*(code *)&SUB_ffff0fc0)
                      (uVar4,~uVar2 & uVar4 | uVar2 & param_2 << iVar1,
                       (uint *)(param_1 & 0xfffffffc));
  } while (iVar3 != 0);
  return (int)(char)((uVar2 & uVar4) >> iVar1);
}



### FUNC FUN_00057dc8 @ 00057dc8

int FUN_00057dc8(uint *param_1)

{
  uint uVar1;
  
  uVar1 = *param_1;
  if ((uVar1 & 0x40000000) == 0) {
    uVar1 = uVar1 & 0x7fffffff;
  }
  else {
    uVar1 = uVar1 | 0x80000000;
  }
  return (int)param_1 + uVar1;
}



### FUNC FUN_00057de0 @ 00057de0

int FUN_00057de0(int param_1,int param_2,uint param_3)

{
  int iVar1;
  uint uVar2;
  int iVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  
  if (param_2 == 0) {
    return 0;
  }
  iVar6 = 0;
  iVar5 = param_2 + -1;
  do {
    while( true ) {
      iVar1 = (iVar6 + iVar5) / 2;
      iVar4 = param_1 + iVar1 * 8;
      uVar2 = FUN_00057dc8(iVar4);
      if (iVar1 == param_2 + -1) break;
      iVar3 = FUN_00057dc8(param_1 + iVar1 * 8 + 8);
      if (param_3 < uVar2) goto LAB_00057e44;
      if (param_3 <= iVar3 - 1U) {
        return iVar4;
      }
      iVar6 = iVar1 + 1;
    }
    if (uVar2 <= param_3) {
      return iVar4;
    }
LAB_00057e44:
    if (iVar1 == iVar6) {
      return 0;
    }
    iVar5 = iVar1 + -1;
  } while( true );
}



### FUNC FUN_00057e84 @ 00057e84

code * FUN_00057e84(int param_1)

{
  if (param_1 == 1) {
    return __aeabi_unwind_cpp_pr1;
  }
  if (param_1 != 2) {
    if (param_1 == 0) {
      return __aeabi_unwind_cpp_pr0;
    }
    return (code *)0x0;
  }
  return __aeabi_unwind_cpp_pr2;
}



### FUNC FUN_00057ed4 @ 00057ed4

/* WARNING: Removing unreachable block (ram,0x00057f14) */

undefined4 FUN_00057ed4(int param_1,int param_2,undefined4 param_3)

{
  int iVar1;
  undefined4 uVar2;
  int iVar3;
  bool bVar4;
  int local_14;
  undefined4 uStack_10;
  
  local_14 = param_2;
  uStack_10 = param_3;
  iVar1 = __gnu_Unwind_Find_exidx(param_2 + -2,&local_14,param_3,__gnu_Unwind_Find_exidx,param_1);
  if ((iVar1 == 0) || (iVar1 = FUN_00057de0(iVar1,local_14,param_2 + -2), iVar1 == 0)) {
    *(undefined4 *)(param_1 + 0x10) = 0;
    uVar2 = 9;
  }
  else {
    uVar2 = FUN_00057dc8();
    iVar3 = *(int *)(iVar1 + 4);
    bVar4 = iVar3 == 1;
    if (bVar4) {
      iVar3 = 0;
      *(undefined4 *)(param_1 + 0x10) = 0;
    }
    *(undefined4 *)(param_1 + 0x48) = uVar2;
    if (bVar4) {
      uVar2 = 5;
    }
    else {
      if (iVar3 < 0) {
        *(int *)(param_1 + 0x4c) = iVar1 + 4;
      }
      else {
        uVar2 = FUN_00057dc8();
        *(undefined4 *)(param_1 + 0x4c) = uVar2;
      }
      *(uint *)(param_1 + 0x50) = (uint)(iVar3 < 0);
      if ((int)**(uint **)(param_1 + 0x4c) < 0) {
        iVar1 = FUN_00057e84(**(uint **)(param_1 + 0x4c) >> 0x18 & 0xf);
        *(int *)(param_1 + 0x10) = iVar1;
        if (iVar1 == 0) {
          uVar2 = 9;
        }
        else {
          uVar2 = 0;
        }
      }
      else {
        uVar2 = FUN_00057dc8();
        *(undefined4 *)(param_1 + 0x10) = uVar2;
        uVar2 = 0;
      }
    }
  }
  return uVar2;
}



### FUNC FUN_00057fd8 @ 00057fd8

void FUN_00057fd8(uint *param_1)

{
  if ((*param_1 & 1) == 0) {
    if ((*param_1 & 2) == 0) {
      __gnu_Unwind_Restore_VFP(param_1 + 0x12);
    }
    else {
      __gnu_Unwind_Restore_VFP_D();
    }
  }
  if ((*param_1 & 4) == 0) {
    __gnu_Unwind_Restore_VFP_D_16_to_31(param_1 + 0x34);
  }
  if ((*param_1 & 8) == 0) {
    __gnu_Unwind_Restore_WMMXD(param_1 + 0x54);
  }
  if ((*param_1 & 0x10) != 0) {
    return;
  }
  __gnu_Unwind_Restore_WMMXC(param_1 + 0x74);
  return;
}



### FUNC FUN_00058044 @ 00058044

undefined4 FUN_00058044(int *param_1)

{
  undefined4 uVar1;
  
  if (*param_1 == 0) {
    uVar1 = 0;
  }
  else {
    uVar1 = *(undefined4 *)(*param_1 + (int)param_1);
  }
  return uVar1;
}



### FUNC FUN_00058058 @ 00058058

undefined4 FUN_00058058(void)

{
  return 9;
}



### FUNC FUN_00058060 @ 00058060

void FUN_00058060(void)

{
  return;
}



### FUNC FUN_00058064 @ 00058064

int FUN_00058064(int param_1,int param_2)

{
  int iVar1;
  int iVar2;
  int iVar3;
  uint uVar4;
  int iVar5;
  code *pcVar6;
  undefined4 uVar7;
  undefined8 uVar8;
  undefined4 uStack_3f8;
  undefined4 uStack_3f4;
  undefined4 uStack_3f0;
  undefined4 uStack_3ec;
  undefined4 uStack_3e8;
  undefined4 uStack_3e4;
  undefined4 uStack_3e0;
  undefined4 uStack_3dc;
  undefined4 uStack_3d8;
  undefined4 uStack_3d4;
  undefined4 uStack_3d0;
  undefined4 uStack_3cc;
  undefined4 uStack_3c8;
  undefined4 uStack_3c4;
  undefined4 uStack_3c0;
  undefined4 uStack_3bc;
  undefined4 uStack_3b8;
  undefined4 uStack_3b4;
  undefined1 auStack_218 [56];
  undefined4 uStack_1e0;
  int iStack_34;
  int iStack_30;
  undefined4 uStack_2c;
  
  do {
    iVar1 = FUN_00057ed4(param_1,*(undefined4 *)(param_2 + 0x40));
    if (iVar1 != 0) goto LAB_00058084;
    *(undefined4 *)(param_1 + 0x14) = *(undefined4 *)(param_2 + 0x40);
    iVar1 = param_2;
    iVar2 = (**(code **)(param_1 + 0x10))(1,param_1);
  } while (iVar2 == 8);
  if (iVar2 == 7) {
    FUN_00058060(0,*(undefined4 *)(param_2 + 0x40));
    uVar8 = restore_core_regs(param_2 + 4);
    iVar5 = (int)((ulonglong)uVar8 >> 0x20);
    iVar2 = (int)uVar8;
    pcVar6 = *(code **)(iVar2 + 0xc);
    uVar7 = *(undefined4 *)(iVar2 + 0x18);
    uStack_3f4 = *(undefined4 *)(iVar5 + 4);
    uStack_3f0 = *(undefined4 *)(iVar5 + 8);
    uStack_3ec = *(undefined4 *)(iVar5 + 0xc);
    uStack_3e8 = *(undefined4 *)(iVar5 + 0x10);
    uStack_3e4 = *(undefined4 *)(iVar5 + 0x14);
    uStack_3e0 = *(undefined4 *)(iVar5 + 0x18);
    uStack_3dc = *(undefined4 *)(iVar5 + 0x1c);
    uStack_3d8 = *(undefined4 *)(iVar5 + 0x20);
    uStack_3d4 = *(undefined4 *)(iVar5 + 0x24);
    uStack_3d0 = *(undefined4 *)(iVar5 + 0x28);
    uStack_3cc = *(undefined4 *)(iVar5 + 0x2c);
    uStack_3c8 = *(undefined4 *)(iVar5 + 0x30);
    uStack_3c4 = *(undefined4 *)(iVar5 + 0x34);
    uStack_3c0 = *(undefined4 *)(iVar5 + 0x38);
    uStack_3bc = *(undefined4 *)(iVar5 + 0x3c);
    uStack_3b8 = *(undefined4 *)(iVar5 + 0x40);
    iVar5 = 0;
    uStack_3f8 = 0;
    uStack_2c = 0;
    iStack_34 = param_2;
    iStack_30 = param_1;
    do {
      iVar3 = FUN_00057ed4(iVar2,uStack_3b8);
      if (iVar1 == 0) {
        uVar4 = 9;
      }
      else {
        uVar4 = 10;
      }
      if (iVar3 == 0) {
        *(undefined4 *)(iVar2 + 0x14) = uStack_3b8;
        memcpy(auStack_218,&uStack_3f8,0x1e0);
        iVar5 = (**(code **)(iVar2 + 0x10))(uVar4,iVar2,auStack_218);
        uStack_3b4 = uStack_1e0;
      }
      else {
        uVar4 = uVar4 | 0x10;
        uStack_3b4 = uStack_3c0;
      }
      iVar1 = (*pcVar6)(1,uVar4,iVar2,iVar2,&uStack_3f8,uVar7);
      if (iVar1 != 0) {
        return 9;
      }
      if (iVar3 != 0) {
        return iVar3;
      }
      memcpy(&uStack_3f8,auStack_218,0x1e0);
      iVar1 = 0;
    } while (iVar5 == 8);
    if (iVar5 == 7) {
      FUN_00058060(0,uStack_3b8);
      restore_core_regs(&uStack_3f4);
    }
    return 9;
  }
LAB_00058084:
                    /* WARNING: Subroutine does not return */
  abort();
}



### FUNC FUN_000580c8 @ 000580c8

int FUN_000580c8(int param_1,int param_2,int param_3)

{
  int iVar1;
  int iVar2;
  uint uVar3;
  int iVar4;
  code *pcVar5;
  undefined4 uVar6;
  undefined4 local_3e8;
  undefined4 local_3e4;
  undefined4 uStack_3e0;
  undefined4 uStack_3dc;
  undefined4 uStack_3d8;
  undefined4 local_3d4;
  undefined4 uStack_3d0;
  undefined4 uStack_3cc;
  undefined4 uStack_3c8;
  undefined4 local_3c4;
  undefined4 uStack_3c0;
  undefined4 uStack_3bc;
  undefined4 uStack_3b8;
  undefined4 local_3b4;
  undefined4 uStack_3b0;
  undefined4 uStack_3ac;
  undefined4 local_3a8;
  undefined4 local_3a4;
  undefined1 auStack_208 [56];
  undefined4 local_1d0;
  
  pcVar5 = *(code **)(param_1 + 0xc);
  uVar6 = *(undefined4 *)(param_1 + 0x18);
  local_3e4 = *(undefined4 *)(param_2 + 4);
  uStack_3e0 = *(undefined4 *)(param_2 + 8);
  uStack_3dc = *(undefined4 *)(param_2 + 0xc);
  uStack_3d8 = *(undefined4 *)(param_2 + 0x10);
  local_3d4 = *(undefined4 *)(param_2 + 0x14);
  uStack_3d0 = *(undefined4 *)(param_2 + 0x18);
  uStack_3cc = *(undefined4 *)(param_2 + 0x1c);
  uStack_3c8 = *(undefined4 *)(param_2 + 0x20);
  local_3c4 = *(undefined4 *)(param_2 + 0x24);
  uStack_3c0 = *(undefined4 *)(param_2 + 0x28);
  uStack_3bc = *(undefined4 *)(param_2 + 0x2c);
  uStack_3b8 = *(undefined4 *)(param_2 + 0x30);
  local_3b4 = *(undefined4 *)(param_2 + 0x34);
  uStack_3b0 = *(undefined4 *)(param_2 + 0x38);
  uStack_3ac = *(undefined4 *)(param_2 + 0x3c);
  local_3a8 = *(undefined4 *)(param_2 + 0x40);
  iVar4 = 0;
  local_3e8 = 0;
  do {
    iVar1 = FUN_00057ed4(param_1,local_3a8);
    if (param_3 == 0) {
      uVar3 = 9;
    }
    else {
      uVar3 = 10;
    }
    if (iVar1 == 0) {
      *(undefined4 *)(param_1 + 0x14) = local_3a8;
      memcpy(auStack_208,&local_3e8,0x1e0);
      iVar4 = (**(code **)(param_1 + 0x10))(uVar3,param_1,auStack_208);
      local_3a4 = local_1d0;
    }
    else {
      uVar3 = uVar3 | 0x10;
      local_3a4 = uStack_3b0;
    }
    iVar2 = (*pcVar5)(1,uVar3,param_1,param_1,&local_3e8,uVar6);
    if (iVar2 != 0) {
      return 9;
    }
    if (iVar1 != 0) {
      return iVar1;
    }
    memcpy(&local_3e8,auStack_208,0x1e0);
    param_3 = 0;
  } while (iVar4 == 8);
  if (iVar4 == 7) {
    FUN_00058060(0,local_3a8);
    restore_core_regs(&local_3e4);
  }
  return 9;
}



### FUNC _Unwind_GetCFA @ 000581f0

undefined4 _Unwind_GetCFA(int param_1)

{
  return *(undefined4 *)(param_1 + 0x44);
}



### FUNC __gnu_Unwind_RaiseException @ 000581f8

undefined4 __gnu_Unwind_RaiseException(int param_1,int param_2)

{
  int iVar1;
  undefined4 local_1f8;
  undefined4 local_1f4;
  undefined4 uStack_1f0;
  undefined4 uStack_1ec;
  undefined4 uStack_1e8;
  undefined4 local_1e4;
  undefined4 uStack_1e0;
  undefined4 uStack_1dc;
  undefined4 uStack_1d8;
  undefined4 local_1d4;
  undefined4 uStack_1d0;
  undefined4 uStack_1cc;
  undefined4 uStack_1c8;
  undefined4 local_1c4;
  undefined4 uStack_1c0;
  undefined4 uStack_1bc;
  undefined4 local_1b8;
  
  *(undefined4 *)(param_2 + 0x40) = *(undefined4 *)(param_2 + 0x3c);
  local_1f4 = *(undefined4 *)(param_2 + 4);
  uStack_1f0 = *(undefined4 *)(param_2 + 8);
  uStack_1ec = *(undefined4 *)(param_2 + 0xc);
  uStack_1e8 = *(undefined4 *)(param_2 + 0x10);
  local_1e4 = *(undefined4 *)(param_2 + 0x14);
  uStack_1e0 = *(undefined4 *)(param_2 + 0x18);
  uStack_1dc = *(undefined4 *)(param_2 + 0x1c);
  uStack_1d8 = *(undefined4 *)(param_2 + 0x20);
  local_1d4 = *(undefined4 *)(param_2 + 0x24);
  uStack_1d0 = *(undefined4 *)(param_2 + 0x28);
  uStack_1cc = *(undefined4 *)(param_2 + 0x2c);
  uStack_1c8 = *(undefined4 *)(param_2 + 0x30);
  local_1c4 = *(undefined4 *)(param_2 + 0x34);
  uStack_1c0 = *(undefined4 *)(param_2 + 0x38);
  uStack_1bc = *(undefined4 *)(param_2 + 0x3c);
  local_1b8 = *(undefined4 *)(param_2 + 0x40);
  local_1f8 = 0xffffffff;
  do {
    iVar1 = FUN_00057ed4(param_1,local_1b8);
    if (iVar1 != 0) {
      return 9;
    }
    iVar1 = (**(code **)(param_1 + 0x10))(0,param_1,&local_1f8);
  } while (iVar1 == 8);
  FUN_00057fd8(&local_1f8);
  if (iVar1 == 6) {
    FUN_00058064(param_1,param_2);
  }
  return 9;
}



### FUNC __gnu_Unwind_ForcedUnwind @ 0005829c

void __gnu_Unwind_ForcedUnwind(int param_1,undefined4 param_2,undefined4 param_3,int param_4)

{
  undefined4 uVar1;
  
  *(undefined4 *)(param_1 + 0x18) = param_3;
  uVar1 = *(undefined4 *)(param_4 + 0x3c);
  *(undefined4 *)(param_1 + 0xc) = param_2;
  *(undefined4 *)(param_4 + 0x40) = uVar1;
  FUN_000580c8(param_1,param_4,0);
  return;
}



### FUNC __gnu_Unwind_Resume @ 000582b8

void __gnu_Unwind_Resume(int param_1,int param_2)

{
  int iVar1;
  
  iVar1 = *(int *)(param_1 + 0xc);
  *(undefined4 *)(param_2 + 0x40) = *(undefined4 *)(param_1 + 0x14);
  if (iVar1 == 0) {
    iVar1 = (**(code **)(param_1 + 0x10))(2,param_1,param_2);
    if (iVar1 != 7) {
      if (iVar1 != 8) goto LAB_00058328;
      FUN_00058064(param_1,param_2);
    }
    FUN_00058060(0,*(undefined4 *)(param_2 + 0x40));
    restore_core_regs(param_2 + 4);
  }
  else {
    FUN_000580c8(param_1,param_2,1);
  }
LAB_00058328:
                    /* WARNING: Subroutine does not return */
  abort();
}



### FUNC __gnu_Unwind_Resume_or_Rethrow @ 0005832c

void __gnu_Unwind_Resume_or_Rethrow(int param_1,int param_2)

{
  if (*(int *)(param_1 + 0xc) == 0) {
    __gnu_Unwind_RaiseException();
    return;
  }
  *(undefined4 *)(param_2 + 0x40) = *(undefined4 *)(param_2 + 0x3c);
  FUN_000580c8(param_1,param_2,0);
  return;
}



### FUNC _Unwind_Complete @ 0005834c

void _Unwind_Complete(void)

{
  return;
}



### FUNC _Unwind_DeleteException @ 00058350

void _Unwind_DeleteException(int param_1)

{
  if (*(code **)(param_1 + 8) == (code *)0x0) {
    return;
  }
                    /* WARNING: Could not recover jumptable at 0x00058364. Too many branches */
                    /* WARNING: Treating indirect jump as call */
  (**(code **)(param_1 + 8))(1,param_1);
  return;
}



### FUNC _Unwind_VRS_Get @ 00058368

undefined4
_Unwind_VRS_Get(int param_1,undefined4 param_2,uint param_3,int param_4,undefined4 *param_5)

{
  bool bVar1;
  
  switch(param_2) {
  case 0:
    bVar1 = param_3 == 0xf;
    if (param_3 < 0x10) {
      bVar1 = param_4 == 0;
    }
    if (bVar1) {
      *param_5 = *(undefined4 *)(param_1 + param_3 * 4 + 4);
      return 0;
    }
    break;
  case 1:
    return 1;
  case 2:
    break;
  case 3:
    return 1;
  case 4:
    return 1;
  }
  return 2;
}



### FUNC FUN_000583c4 @ 000583c4

undefined4 FUN_000583c4(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)

{
  undefined4 local_c;
  
  local_c = param_4;
  _Unwind_VRS_Get(param_1,0,param_2,0,&local_c,param_2,param_3);
  return local_c;
}



### FUNC _Unwind_VRS_Set @ 000583ec

undefined4
_Unwind_VRS_Set(int param_1,undefined4 param_2,uint param_3,int param_4,undefined4 *param_5)

{
  bool bVar1;
  
  switch(param_2) {
  case 0:
    bVar1 = param_3 == 0xf;
    if (param_3 < 0x10) {
      bVar1 = param_4 == 0;
    }
    if (bVar1) {
      *(undefined4 *)(param_1 + param_3 * 4 + 4) = *param_5;
      return 0;
    }
    break;
  case 1:
    return 1;
  case 2:
    break;
  case 3:
    return 1;
  case 4:
    return 1;
  }
  return 2;
}



### FUNC FUN_00058448 @ 00058448

void FUN_00058448(undefined4 param_1,undefined4 param_2,undefined4 param_3)

{
  undefined4 local_c;
  
  local_c = param_3;
  _Unwind_VRS_Set(param_1,0,param_2,0,&local_c,param_2,param_3);
  return;
}



### FUNC __gnu_Unwind_Backtrace @ 00058474

int __gnu_Unwind_Backtrace(code *param_1,undefined4 param_2,int param_3)

{
  int iVar1;
  undefined1 auStack_250 [16];
  code *local_240;
  undefined4 local_1f8;
  undefined4 local_1f4;
  undefined4 uStack_1f0;
  undefined4 uStack_1ec;
  undefined4 uStack_1e8;
  undefined4 local_1e4;
  undefined4 uStack_1e0;
  undefined4 uStack_1dc;
  undefined4 uStack_1d8;
  undefined4 local_1d4;
  undefined4 uStack_1d0;
  undefined4 uStack_1cc;
  undefined4 uStack_1c8;
  undefined4 local_1c4;
  undefined4 uStack_1c0;
  undefined4 uStack_1bc;
  undefined4 local_1b8;
  
  *(undefined4 *)(param_3 + 0x40) = *(undefined4 *)(param_3 + 0x3c);
  local_1f4 = *(undefined4 *)(param_3 + 4);
  uStack_1f0 = *(undefined4 *)(param_3 + 8);
  uStack_1ec = *(undefined4 *)(param_3 + 0xc);
  uStack_1e8 = *(undefined4 *)(param_3 + 0x10);
  local_1e4 = *(undefined4 *)(param_3 + 0x14);
  uStack_1e0 = *(undefined4 *)(param_3 + 0x18);
  uStack_1dc = *(undefined4 *)(param_3 + 0x1c);
  uStack_1d8 = *(undefined4 *)(param_3 + 0x20);
  local_1d4 = *(undefined4 *)(param_3 + 0x24);
  uStack_1d0 = *(undefined4 *)(param_3 + 0x28);
  uStack_1cc = *(undefined4 *)(param_3 + 0x2c);
  uStack_1c8 = *(undefined4 *)(param_3 + 0x30);
  local_1c4 = *(undefined4 *)(param_3 + 0x34);
  uStack_1c0 = *(undefined4 *)(param_3 + 0x38);
  uStack_1bc = *(undefined4 *)(param_3 + 0x3c);
  local_1b8 = *(undefined4 *)(param_3 + 0x40);
  local_1f8 = 0xffffffff;
  do {
    iVar1 = FUN_00057ed4(auStack_250,local_1b8);
    if (iVar1 != 0) {
LAB_000584d8:
      iVar1 = 9;
      break;
    }
    FUN_00058448(&local_1f8,0xc,auStack_250);
    iVar1 = (*param_1)(&local_1f8,param_2);
    if (iVar1 != 0) goto LAB_000584d8;
    iVar1 = (*local_240)(8,auStack_250,&local_1f8);
  } while ((iVar1 - 5U & 0xfffffffb) != 0);
  FUN_00057fd8(&local_1f8);
  return iVar1;
}



### FUNC __aeabi_unwind_cpp_pr0 @ 0005892c

/* WARNING: Removing unreachable block (ram,0x000585fc) */
/* WARNING: Removing unreachable block (ram,0x00058584) */
/* WARNING: Removing unreachable block (ram,0x0005858c) */
/* WARNING: Removing unreachable block (ram,0x000585e4) */
/* WARNING: Removing unreachable block (ram,0x00058894) */

undefined4 __aeabi_unwind_cpp_pr0(uint param_1,code *param_2,undefined4 param_3)

{
  ushort uVar1;
  bool bVar2;
  bool bVar3;
  uint uVar4;
  code *pcVar5;
  undefined4 uVar6;
  int iVar7;
  uint uVar8;
  uint *puVar9;
  uint uVar10;
  int iVar11;
  uint uVar12;
  uint *puVar13;
  code *pcStack_38;
  int iStack_34;
  uint *puStack_30;
  undefined1 uStack_2c;
  undefined1 uStack_2b;
  
  puStack_30 = (uint *)(*(int **)(param_2 + 0x4c) + 1);
  uVar10 = param_1 & 3;
  iStack_34 = **(int **)(param_2 + 0x4c) << 8;
  uStack_2b = 0;
  uStack_2c = 3;
  puVar13 = puStack_30;
  if (uVar10 == 2) {
    puVar13 = *(uint **)(param_2 + 0x38);
  }
  if ((*(uint *)(param_2 + 0x50) & 1) == 0) {
    bVar3 = false;
LAB_000585d4:
    do {
      while( true ) {
        if (*puVar13 == 0) goto LAB_0005888c;
        uVar1 = *(ushort *)((int)puVar13 + 2);
        uVar8 = *puVar13;
        puVar9 = puVar13 + 1;
        uVar12 = (uVar1 & 0xfffffffe) + *(int *)(param_2 + 0x48);
        uVar4 = FUN_000583c4(param_3,0xf);
        if (uVar4 < uVar12) {
          bVar2 = false;
        }
        else if (uVar4 < uVar12 + ((ushort)uVar8 & 0xfffffffe)) {
          bVar2 = true;
        }
        else {
          bVar2 = false;
        }
        uVar8 = (ushort)uVar8 & 1 | (uVar1 & 1) << 1;
        if (uVar8 != 1) break;
        if (uVar10 == 0) {
          if (bVar2) {
            uVar8 = *puVar9;
            if (puVar13[2] == 0xfffffffe) {
              return 9;
            }
            pcStack_38 = param_2 + 0x58;
            iVar7 = 1;
            if (puVar13[2] == 0xffffffff) {
LAB_000586fc:
              iVar11 = FUN_000583c4(param_3,0xd);
              pcVar5 = param_2;
              if (iVar7 != 2) {
                pcVar5 = pcStack_38;
              }
              *(int *)(param_2 + 0x20) = iVar11;
              if (iVar7 == 2) {
                pcVar5 = pcVar5 + 0x2c;
                *(code **)pcVar5 = pcStack_38;
              }
LAB_00058914:
              *(code **)(param_2 + 0x24) = pcVar5;
              *(uint **)(param_2 + 0x28) = puVar9;
              return 6;
            }
            uVar6 = FUN_00058044(puVar13 + 2);
            iVar7 = __cxa_type_match(param_2,uVar6,uVar8 >> 0x1f);
            if (iVar7 != 0) goto LAB_000586fc;
          }
        }
        else {
          iVar11 = *(int *)(param_2 + 0x20);
          iVar7 = FUN_000583c4(param_3,0xd);
          if ((iVar11 == iVar7) && (puVar9 == *(uint **)(param_2 + 0x28))) {
            uVar6 = FUN_00057dc8(puVar9);
            FUN_00058448(param_3,0xf,uVar6);
LAB_0005885c:
            uVar6 = 0;
            pcVar5 = param_2;
            goto LAB_000588ec;
          }
        }
        puVar13 = puVar13 + 3;
      }
      if (uVar8 != 0) {
        if (uVar8 != 2) {
          return 9;
        }
        uVar8 = *puVar9 & 0x7fffffff;
        if (uVar10 == 0) {
          if (bVar2) {
            uVar4 = (param_1 >> 3 ^ 1) & 1;
            if (uVar8 == 0) {
              uVar4 = 1;
            }
            if (uVar4 != 0) {
              uVar4 = 0;
              do {
                if (uVar4 == uVar8) {
                  iVar7 = FUN_000583c4(param_3,0xd);
                  *(int *)(param_2 + 0x20) = iVar7;
                  pcVar5 = pcStack_38;
                  goto LAB_00058914;
                }
                uVar4 = uVar4 + 1;
                pcStack_38 = param_2 + 0x58;
                uVar6 = FUN_00058044(puVar9 + uVar4);
                iVar7 = __cxa_type_match(param_2,uVar6,0,&pcStack_38);
              } while (iVar7 == 0);
            }
          }
        }
        else {
          iVar11 = *(int *)(param_2 + 0x20);
          iVar7 = FUN_000583c4(param_3,0xd);
          if ((iVar11 == iVar7) && (puVar9 == *(uint **)(param_2 + 0x28))) {
            *(int *)(param_2 + 0x30) = 4;
            *(uint *)(param_2 + 0x28) = uVar8;
            *(int *)(param_2 + 0x2c) = 0;
            *(uint **)(param_2 + 0x34) = puVar13 + 2;
            if ((int)*puVar9 < 0) {
              uVar6 = FUN_00057dc8(puVar9 + uVar8 + 1);
              FUN_00058448(param_3,0xf,uVar6);
              goto LAB_0005885c;
            }
            bVar3 = true;
          }
        }
        if ((int)*puVar9 < 0) {
          puVar9 = puVar13 + 2;
        }
        puVar13 = puVar9 + uVar8 + 1;
        goto LAB_000585d4;
      }
      if (uVar10 == 0) {
        bVar2 = false;
      }
      puVar13 = puVar13 + 2;
    } while (!bVar2);
    pcVar5 = (code *)FUN_00057dc8(puVar9);
    *(uint **)(param_2 + 0x38) = puVar13;
    iVar7 = __cxa_begin_cleanup(param_2);
    if (iVar7 == 0) {
      return 9;
    }
    uVar6 = 0xf;
  }
  else {
    bVar3 = false;
LAB_0005888c:
    iVar7 = __gnu_unwind_execute(param_3,&iStack_34);
    if (iVar7 != 0) {
      return 9;
    }
    if (!bVar3) {
      return 8;
    }
    uVar6 = FUN_000583c4(param_3,0xf);
    FUN_00058448(param_3,0xe,uVar6);
    pcVar5 = __cxa_call_unexpected;
    uVar6 = 0xf;
  }
LAB_000588ec:
  FUN_00058448(param_3,uVar6,pcVar5);
  return 7;
}



### FUNC __aeabi_unwind_cpp_pr1 @ 00058934

/* WARNING: Removing unreachable block (ram,0x000585fc) */
/* WARNING: Removing unreachable block (ram,0x0005856c) */
/* WARNING: Removing unreachable block (ram,0x000585e4) */
/* WARNING: Removing unreachable block (ram,0x00058894) */

undefined4 __aeabi_unwind_cpp_pr1(uint param_1,code *param_2,undefined4 param_3)

{
  ushort uVar1;
  bool bVar2;
  bool bVar3;
  uint uVar4;
  code *pcVar5;
  undefined4 uVar6;
  int iVar7;
  uint uVar8;
  uint *puVar9;
  uint uVar10;
  int iVar11;
  uint uVar12;
  uint *puVar13;
  code *pcStack_38;
  int iStack_34;
  uint *puStack_30;
  undefined1 uStack_2c;
  undefined1 uStack_2b;
  
  uVar8 = **(uint **)(param_2 + 0x4c);
  puStack_30 = *(uint **)(param_2 + 0x4c) + 1;
  uVar10 = param_1 & 3;
  uStack_2b = (undefined1)(uVar8 >> 0x10);
  iStack_34 = uVar8 << 0x10;
  puVar13 = puStack_30 + (uVar8 >> 0x10 & 0xff);
  uStack_2c = 2;
  if (uVar10 == 2) {
    puVar13 = *(uint **)(param_2 + 0x38);
  }
  if ((*(uint *)(param_2 + 0x50) & 1) == 0) {
    bVar3 = false;
LAB_000585d4:
    do {
      while( true ) {
        if (*puVar13 == 0) goto LAB_0005888c;
        uVar1 = *(ushort *)((int)puVar13 + 2);
        uVar8 = *puVar13;
        puVar9 = puVar13 + 1;
        uVar12 = (uVar1 & 0xfffffffe) + *(int *)(param_2 + 0x48);
        uVar4 = FUN_000583c4(param_3,0xf);
        if (uVar4 < uVar12) {
          bVar2 = false;
        }
        else if (uVar4 < uVar12 + ((ushort)uVar8 & 0xfffffffe)) {
          bVar2 = true;
        }
        else {
          bVar2 = false;
        }
        uVar8 = (ushort)uVar8 & 1 | (uVar1 & 1) << 1;
        if (uVar8 != 1) break;
        if (uVar10 == 0) {
          if (bVar2) {
            uVar8 = *puVar9;
            if (puVar13[2] == 0xfffffffe) {
              return 9;
            }
            pcStack_38 = param_2 + 0x58;
            iVar7 = 1;
            if (puVar13[2] == 0xffffffff) {
LAB_000586fc:
              iVar11 = FUN_000583c4(param_3,0xd);
              pcVar5 = param_2;
              if (iVar7 != 2) {
                pcVar5 = pcStack_38;
              }
              *(int *)(param_2 + 0x20) = iVar11;
              if (iVar7 == 2) {
                pcVar5 = pcVar5 + 0x2c;
                *(code **)pcVar5 = pcStack_38;
              }
LAB_00058914:
              *(code **)(param_2 + 0x24) = pcVar5;
              *(uint **)(param_2 + 0x28) = puVar9;
              return 6;
            }
            uVar6 = FUN_00058044(puVar13 + 2);
            iVar7 = __cxa_type_match(param_2,uVar6,uVar8 >> 0x1f);
            if (iVar7 != 0) goto LAB_000586fc;
          }
        }
        else {
          iVar11 = *(int *)(param_2 + 0x20);
          iVar7 = FUN_000583c4(param_3,0xd);
          if ((iVar11 == iVar7) && (puVar9 == *(uint **)(param_2 + 0x28))) {
            uVar6 = FUN_00057dc8(puVar9);
            FUN_00058448(param_3,0xf,uVar6);
LAB_0005885c:
            uVar6 = 0;
            pcVar5 = param_2;
            goto LAB_000588ec;
          }
        }
        puVar13 = puVar13 + 3;
      }
      if (uVar8 != 0) {
        if (uVar8 != 2) {
          return 9;
        }
        uVar8 = *puVar9 & 0x7fffffff;
        if (uVar10 == 0) {
          if (bVar2) {
            uVar4 = (param_1 >> 3 ^ 1) & 1;
            if (uVar8 == 0) {
              uVar4 = 1;
            }
            if (uVar4 != 0) {
              uVar4 = 0;
              do {
                if (uVar4 == uVar8) {
                  iVar7 = FUN_000583c4(param_3,0xd);
                  *(int *)(param_2 + 0x20) = iVar7;
                  pcVar5 = pcStack_38;
                  goto LAB_00058914;
                }
                uVar4 = uVar4 + 1;
                pcStack_38 = param_2 + 0x58;
                uVar6 = FUN_00058044(puVar9 + uVar4);
                iVar7 = __cxa_type_match(param_2,uVar6,0,&pcStack_38);
              } while (iVar7 == 0);
            }
          }
        }
        else {
          iVar11 = *(int *)(param_2 + 0x20);
          iVar7 = FUN_000583c4(param_3,0xd);
          if ((iVar11 == iVar7) && (puVar9 == *(uint **)(param_2 + 0x28))) {
            *(int *)(param_2 + 0x30) = 4;
            *(uint *)(param_2 + 0x28) = uVar8;
            *(int *)(param_2 + 0x2c) = 0;
            *(uint **)(param_2 + 0x34) = puVar13 + 2;
            if ((int)*puVar9 < 0) {
              uVar6 = FUN_00057dc8(puVar9 + uVar8 + 1);
              FUN_00058448(param_3,0xf,uVar6);
              goto LAB_0005885c;
            }
            bVar3 = true;
          }
        }
        if ((int)*puVar9 < 0) {
          puVar9 = puVar13 + 2;
        }
        puVar13 = puVar9 + uVar8 + 1;
        goto LAB_000585d4;
      }
      if (uVar10 == 0) {
        bVar2 = false;
      }
      puVar13 = puVar13 + 2;
    } while (!bVar2);
    pcVar5 = (code *)FUN_00057dc8(puVar9);
    *(uint **)(param_2 + 0x38) = puVar13;
    iVar7 = __cxa_begin_cleanup(param_2);
    if (iVar7 == 0) {
      return 9;
    }
    uVar6 = 0xf;
  }
  else {
    bVar3 = false;
LAB_0005888c:
    iVar7 = __gnu_unwind_execute(param_3,&iStack_34);
    if (iVar7 != 0) {
      return 9;
    }
    if (!bVar3) {
      return 8;
    }
    uVar6 = FUN_000583c4(param_3,0xf);
    FUN_00058448(param_3,0xe,uVar6);
    pcVar5 = __cxa_call_unexpected;
    uVar6 = 0xf;
  }
LAB_000588ec:
  FUN_00058448(param_3,uVar6,pcVar5);
  return 7;
}



### FUNC __aeabi_unwind_cpp_pr2 @ 0005893c

/* WARNING: Removing unreachable block (ram,0x00058600) */
/* WARNING: Removing unreachable block (ram,0x0005856c) */
/* WARNING: Removing unreachable block (ram,0x000585e8) */
/* WARNING: Removing unreachable block (ram,0x00058604) */
/* WARNING: Removing unreachable block (ram,0x00058894) */

undefined4 __aeabi_unwind_cpp_pr2(uint param_1,code *param_2,undefined4 param_3)

{
  bool bVar1;
  bool bVar2;
  uint uVar3;
  code *pcVar4;
  undefined4 uVar5;
  int iVar6;
  uint uVar7;
  uint *puVar8;
  uint uVar9;
  uint uVar10;
  int iVar11;
  uint uVar12;
  uint *puVar13;
  code *local_38;
  int local_34;
  uint *local_30;
  undefined1 local_2c;
  undefined1 local_2b;
  
  uVar7 = **(uint **)(param_2 + 0x4c);
  local_30 = *(uint **)(param_2 + 0x4c) + 1;
  uVar9 = param_1 & 3;
  local_2b = (undefined1)(uVar7 >> 0x10);
  local_34 = uVar7 << 0x10;
  puVar13 = local_30 + (uVar7 >> 0x10 & 0xff);
  local_2c = 2;
  if (uVar9 == 2) {
    puVar13 = *(uint **)(param_2 + 0x38);
  }
  if ((*(uint *)(param_2 + 0x50) & 1) == 0) {
    bVar2 = false;
LAB_000585d4:
    do {
      while( true ) {
        uVar7 = *puVar13;
        if (uVar7 == 0) goto LAB_0005888c;
        uVar10 = puVar13[1];
        puVar8 = puVar13 + 2;
        uVar12 = (uVar10 & 0xfffffffe) + *(int *)(param_2 + 0x48);
        uVar3 = FUN_000583c4(param_3,0xf);
        if (uVar3 < uVar12) {
          bVar1 = false;
        }
        else if (uVar3 < uVar12 + (uVar7 & 0xfffffffe)) {
          bVar1 = true;
        }
        else {
          bVar1 = false;
        }
        uVar7 = uVar7 & 1 | (uVar10 & 1) << 1;
        if (uVar7 != 1) break;
        if (uVar9 == 0) {
          if (bVar1) {
            uVar7 = *puVar8;
            if (puVar13[3] == 0xfffffffe) {
              return 9;
            }
            local_38 = param_2 + 0x58;
            iVar6 = 1;
            if (puVar13[3] == 0xffffffff) {
LAB_000586fc:
              iVar11 = FUN_000583c4(param_3,0xd);
              pcVar4 = param_2;
              if (iVar6 != 2) {
                pcVar4 = local_38;
              }
              *(int *)(param_2 + 0x20) = iVar11;
              if (iVar6 == 2) {
                pcVar4 = pcVar4 + 0x2c;
                *(code **)pcVar4 = local_38;
              }
LAB_00058914:
              *(code **)(param_2 + 0x24) = pcVar4;
              *(uint **)(param_2 + 0x28) = puVar8;
              return 6;
            }
            uVar5 = FUN_00058044(puVar13 + 3);
            iVar6 = __cxa_type_match(param_2,uVar5,uVar7 >> 0x1f);
            if (iVar6 != 0) goto LAB_000586fc;
          }
        }
        else {
          iVar11 = *(int *)(param_2 + 0x20);
          iVar6 = FUN_000583c4(param_3,0xd);
          if ((iVar11 == iVar6) && (puVar8 == *(uint **)(param_2 + 0x28))) {
            uVar5 = FUN_00057dc8(puVar8);
            FUN_00058448(param_3,0xf,uVar5);
LAB_0005885c:
            uVar5 = 0;
            pcVar4 = param_2;
            goto LAB_000588ec;
          }
        }
        puVar13 = puVar13 + 4;
      }
      if (uVar7 != 0) {
        if (uVar7 != 2) {
          return 9;
        }
        uVar7 = *puVar8 & 0x7fffffff;
        if (uVar9 == 0) {
          if (bVar1) {
            uVar3 = (param_1 >> 3 ^ 1) & 1;
            if (uVar7 == 0) {
              uVar3 = 1;
            }
            if (uVar3 != 0) {
              uVar3 = 0;
              do {
                if (uVar3 == uVar7) {
                  iVar6 = FUN_000583c4(param_3,0xd);
                  *(int *)(param_2 + 0x20) = iVar6;
                  pcVar4 = local_38;
                  goto LAB_00058914;
                }
                uVar3 = uVar3 + 1;
                local_38 = param_2 + 0x58;
                uVar5 = FUN_00058044(puVar8 + uVar3);
                iVar6 = __cxa_type_match(param_2,uVar5,0,&local_38);
              } while (iVar6 == 0);
            }
          }
        }
        else {
          iVar11 = *(int *)(param_2 + 0x20);
          iVar6 = FUN_000583c4(param_3,0xd);
          if ((iVar11 == iVar6) && (puVar8 == *(uint **)(param_2 + 0x28))) {
            *(int *)(param_2 + 0x30) = 4;
            *(uint *)(param_2 + 0x28) = uVar7;
            *(int *)(param_2 + 0x2c) = 0;
            *(uint **)(param_2 + 0x34) = puVar13 + 3;
            if ((int)*puVar8 < 0) {
              uVar5 = FUN_00057dc8(puVar8 + uVar7 + 1);
              FUN_00058448(param_3,0xf,uVar5);
              goto LAB_0005885c;
            }
            bVar2 = true;
          }
        }
        if ((int)*puVar8 < 0) {
          puVar8 = puVar13 + 3;
        }
        puVar13 = puVar8 + uVar7 + 1;
        goto LAB_000585d4;
      }
      if (uVar9 == 0) {
        bVar1 = false;
      }
      puVar13 = puVar13 + 3;
    } while (!bVar1);
    pcVar4 = (code *)FUN_00057dc8(puVar8);
    *(uint **)(param_2 + 0x38) = puVar13;
    iVar6 = __cxa_begin_cleanup(param_2);
    if (iVar6 == 0) {
      return 9;
    }
    uVar5 = 0xf;
  }
  else {
    bVar2 = false;
LAB_0005888c:
    iVar6 = __gnu_unwind_execute(param_3,&local_34);
    if (iVar6 != 0) {
      return 9;
    }
    if (!bVar2) {
      return 8;
    }
    uVar5 = FUN_000583c4(param_3,0xf);
    FUN_00058448(param_3,0xe,uVar5);
    pcVar4 = __cxa_call_unexpected;
    uVar5 = 0xf;
  }
LAB_000588ec:
  FUN_00058448(param_3,uVar5,pcVar4);
  return 7;
}



### FUNC _Unwind_VRS_Pop @ 00058944

/* WARNING: Type propagation algorithm not settling */

undefined4 _Unwind_VRS_Pop(uint *param_1,undefined4 param_2,uint param_3,uint param_4)

{
  uint *puVar1;
  uint uVar2;
  undefined4 *puVar3;
  int iVar4;
  uint uVar5;
  undefined4 *puVar6;
  uint uVar7;
  uint uVar8;
  undefined4 *puVar9;
  uint uVar10;
  bool bVar11;
  undefined4 auStack_1ac [33];
  undefined1 auStack_128 [124];
  undefined4 auStack_ac [36];
  
  switch(param_2) {
  case 0:
    if (param_4 != 0) {
      return 2;
    }
    iVar4 = 1;
    puVar1 = (uint *)param_1[0xe];
    do {
      bVar11 = (param_3 & 0xffff & 1 << (iVar4 - 1U & 0xff)) != 0;
      if (bVar11) {
        param_1[iVar4] = *puVar1;
      }
      iVar4 = iVar4 + 1;
      if (bVar11) {
        puVar1 = puVar1 + 1;
      }
    } while (iVar4 != 0x11);
    if ((param_3 & 0x2000) != 0) {
      return 0;
    }
    param_1[0xe] = (uint)puVar1;
    return 0;
  case 1:
    if ((param_4 & 0xfffffffb) != 1) {
      return 2;
    }
    uVar5 = param_3 >> 0x10;
    param_3 = param_3 & 0xffff;
    uVar7 = param_3 + uVar5;
    if (param_4 == 1) {
      if (0x10 < uVar7) {
        return 2;
      }
      if (0xf < uVar5) {
        return 2;
      }
      uVar8 = 0;
      uVar7 = 1;
    }
    else {
      if (0x20 < uVar7) {
        return 2;
      }
      uVar8 = param_3;
      if (uVar5 < 0x10) {
        if (uVar7 < 0x11) {
          uVar8 = 0;
          uVar7 = uVar8;
          goto LAB_00058a18;
        }
        uVar8 = uVar7 - 0x10;
      }
      uVar7 = 0;
    }
LAB_00058a18:
    uVar10 = uVar8;
    if (uVar8 != 0) {
      uVar10 = 1;
    }
    if (param_4 != 5 && uVar8 != 0) {
      return 2;
    }
    if ((uVar5 < 0x10) && (uVar2 = *param_1, (uVar2 & 1) != 0)) {
      *param_1 = uVar2 & 0xfffffffe;
      if (param_4 != 5) {
        *param_1 = uVar2 & 0xfffffffc;
        __gnu_Unwind_Save_VFP(param_1 + 0x12);
        goto LAB_00058a80;
      }
      *param_1 = uVar2 & 0xfffffffe | 2;
      __gnu_Unwind_Save_VFP_D();
      if (uVar10 != 0) goto LAB_00058a88;
LAB_00058a68:
      __gnu_Unwind_Save_VFP_D(auStack_ac + 1);
LAB_00058ab4:
      if (uVar10 == 0) goto LAB_00058ac8;
      __gnu_Unwind_Save_VFP_D_16_to_31(auStack_128);
    }
    else {
LAB_00058a80:
      if (uVar10 == 0) {
        if (uVar7 != 0) {
          __gnu_Unwind_Save_VFP(auStack_ac + 1);
          goto LAB_00058ac8;
        }
        if (0xf < uVar5) goto LAB_00058ac8;
        goto LAB_00058a68;
      }
LAB_00058a88:
      if ((*param_1 & 4) != 0) {
        *param_1 = *param_1 & 0xfffffffb;
        __gnu_Unwind_Save_VFP_D_16_to_31(param_1 + 0x34);
      }
      if (uVar7 == 0) {
        if (uVar5 < 0x10) goto LAB_00058a68;
        goto LAB_00058ab4;
      }
      __gnu_Unwind_Save_VFP(auStack_ac + 1);
    }
    param_3 = 0x10 - uVar5;
LAB_00058ac8:
    puVar6 = (undefined4 *)param_1[0xe];
    if (0 < (int)param_3) {
      for (iVar4 = 0; iVar4 != param_3 * 2; iVar4 = iVar4 + 1) {
        auStack_ac[uVar5 * 2 + iVar4 + 1U] = puVar6[iVar4];
      }
      puVar6 = puVar6 + iVar4;
    }
    if (uVar10 != 0) {
      uVar2 = uVar5;
      if (uVar5 < 0x10) {
        uVar2 = 0x10;
      }
      puVar3 = auStack_1ac + uVar2 * 2;
      puVar9 = puVar6 + uVar8 * 2;
      for (; puVar6 != puVar9; puVar6 = puVar6 + 1) {
        puVar3 = puVar3 + 1;
        *puVar3 = *puVar6;
      }
    }
    if (uVar7 != 0) {
      puVar6 = puVar6 + 1;
    }
    param_1[0xe] = (uint)puVar6;
    if (uVar7 == 0) {
      if (uVar5 < 0x10) {
        __gnu_Unwind_Restore_VFP_D(auStack_ac + 1);
      }
      if (uVar10 != 0) {
        __gnu_Unwind_Restore_VFP_D_16_to_31(auStack_128);
      }
    }
    else {
      __gnu_Unwind_Restore_VFP(auStack_ac + 1);
    }
    return 0;
  case 2:
    break;
  case 3:
    if (param_4 == 3) {
      if ((param_3 & 0xffff) + (param_3 >> 0x10) < 0x11) {
        if ((*param_1 & 8) != 0) {
          *param_1 = *param_1 & 0xfffffff7;
          __gnu_Unwind_Save_WMMXD(param_1 + 0x54);
        }
        __gnu_Unwind_Save_WMMXD(auStack_ac + 1);
        puVar6 = (undefined4 *)param_1[0xe];
        puVar3 = auStack_ac + (param_3 >> 0x10) * 2;
        puVar9 = puVar6 + (param_3 & 0xffff) * 2;
        for (; puVar6 != puVar9; puVar6 = puVar6 + 1) {
          puVar3 = puVar3 + 1;
          *puVar3 = *puVar6;
        }
        param_1[0xe] = (uint)puVar6;
        __gnu_Unwind_Restore_WMMXD(auStack_ac + 1);
        return 0;
      }
    }
    break;
  case 4:
    bVar11 = param_3 == 0x10;
    if (param_3 < 0x11) {
      bVar11 = param_4 == 0;
    }
    if (bVar11) {
      if ((*param_1 & 0x10) != 0) {
        *param_1 = *param_1 & 0xffffffef;
        __gnu_Unwind_Save_WMMXC(param_1 + 0x74);
      }
      puVar6 = auStack_ac + 1;
      __gnu_Unwind_Save_WMMXC(puVar6);
      puVar3 = (undefined4 *)param_1[0xe];
      uVar5 = 0;
      do {
        bVar11 = (param_3 & 1 << (uVar5 & 0xff)) != 0;
        if (bVar11) {
          puVar6[uVar5] = *puVar3;
        }
        uVar5 = uVar5 + 1;
        if (bVar11) {
          puVar3 = puVar3 + 1;
        }
      } while (uVar5 != 4);
      param_1[0xe] = (uint)puVar3;
      __gnu_Unwind_Restore_WMMXC(puVar6);
      return 0;
    }
  }
  return 2;
}



### FUNC restore_core_regs @ 00058cb0

undefined8 restore_core_regs(undefined8 *param_1)

{
  return *param_1;
}



### FUNC __gnu_Unwind_Restore_VFP @ 00058cc4

undefined8 __gnu_Unwind_Restore_VFP(undefined8 *param_1)

{
  return *param_1;
}



### FUNC __gnu_Unwind_Save_VFP @ 00058ccc

void __gnu_Unwind_Save_VFP(undefined8 *param_1)

{
  undefined8 in_d0;
  undefined8 in_d1;
  undefined8 in_d2;
  undefined8 in_d3;
  undefined8 in_d4;
  undefined8 in_d5;
  undefined8 in_d6;
  undefined8 in_d7;
  undefined8 unaff_d8;
  undefined8 unaff_d9;
  undefined8 unaff_d10;
  undefined8 unaff_d11;
  undefined8 unaff_d12;
  undefined8 unaff_d13;
  undefined8 unaff_d14;
  undefined8 unaff_d15;
  
  *param_1 = in_d0;
  param_1[1] = in_d1;
  param_1[2] = in_d2;
  param_1[3] = in_d3;
  param_1[4] = in_d4;
  param_1[5] = in_d5;
  param_1[6] = in_d6;
  param_1[7] = in_d7;
  param_1[8] = unaff_d8;
  param_1[9] = unaff_d9;
  param_1[10] = unaff_d10;
  param_1[0xb] = unaff_d11;
  param_1[0xc] = unaff_d12;
  param_1[0xd] = unaff_d13;
  param_1[0xe] = unaff_d14;
  param_1[0xf] = unaff_d15;
  return;
}



### FUNC __gnu_Unwind_Restore_VFP_D @ 00058cd4

undefined8 __gnu_Unwind_Restore_VFP_D(undefined8 *param_1)

{
  return *param_1;
}



### FUNC __gnu_Unwind_Save_VFP_D @ 00058cdc

void __gnu_Unwind_Save_VFP_D(undefined8 *param_1)

{
  undefined8 in_d0;
  undefined8 in_d1;
  undefined8 in_d2;
  undefined8 in_d3;
  undefined8 in_d4;
  undefined8 in_d5;
  undefined8 in_d6;
  undefined8 in_d7;
  undefined8 unaff_d8;
  undefined8 unaff_d9;
  undefined8 unaff_d10;
  undefined8 unaff_d11;
  undefined8 unaff_d12;
  undefined8 unaff_d13;
  undefined8 unaff_d14;
  undefined8 unaff_d15;
  
  *param_1 = in_d0;
  param_1[1] = in_d1;
  param_1[2] = in_d2;
  param_1[3] = in_d3;
  param_1[4] = in_d4;
  param_1[5] = in_d5;
  param_1[6] = in_d6;
  param_1[7] = in_d7;
  param_1[8] = unaff_d8;
  param_1[9] = unaff_d9;
  param_1[10] = unaff_d10;
  param_1[0xb] = unaff_d11;
  param_1[0xc] = unaff_d12;
  param_1[0xd] = unaff_d13;
  param_1[0xe] = unaff_d14;
  param_1[0xf] = unaff_d15;
  return;
}



### FUNC __gnu_Unwind_Restore_VFP_D_16_to_31 @ 00058ce4

void __gnu_Unwind_Restore_VFP_D_16_to_31(void)

{
  return;
}



### FUNC __gnu_Unwind_Save_VFP_D_16_to_31 @ 00058cec

void __gnu_Unwind_Save_VFP_D_16_to_31(undefined8 *param_1)

{
  undefined8 in_d16;
  undefined8 in_d17;
  undefined8 in_d18;
  undefined8 in_d19;
  undefined8 in_d20;
  undefined8 in_d21;
  undefined8 in_d22;
  undefined8 in_d23;
  undefined8 in_d24;
  undefined8 in_d25;
  undefined8 in_d26;
  undefined8 in_d27;
  undefined8 in_d28;
  undefined8 in_d29;
  undefined8 in_d30;
  undefined8 in_d31;
  
  *param_1 = in_d16;
  param_1[1] = in_d17;
  param_1[2] = in_d18;
  param_1[3] = in_d19;
  param_1[4] = in_d20;
  param_1[5] = in_d21;
  param_1[6] = in_d22;
  param_1[7] = in_d23;
  param_1[8] = in_d24;
  param_1[9] = in_d25;
  param_1[10] = in_d26;
  param_1[0xb] = in_d27;
  param_1[0xc] = in_d28;
  param_1[0xd] = in_d29;
  param_1[0xe] = in_d30;
  param_1[0xf] = in_d31;
  return;
}



### FUNC __gnu_Unwind_Restore_WMMXD @ 00058cf4

int __gnu_Unwind_Restore_WMMXD(int param_1)

{
  undefined4 in_cr0;
  undefined4 in_cr1;
  undefined4 in_cr2;
  undefined4 in_cr3;
  undefined4 in_cr4;
  undefined4 in_cr5;
  undefined4 in_cr6;
  undefined4 in_cr7;
  undefined4 in_cr8;
  undefined4 in_cr9;
  undefined4 in_cr10;
  undefined4 in_cr11;
  undefined4 in_cr12;
  undefined4 in_cr13;
  undefined4 in_cr14;
  undefined4 in_cr15;
  
  coprocessor_loadlong(1,in_cr0,param_1);
  coprocessor_loadlong(1,in_cr1,param_1 + 8);
  coprocessor_loadlong(1,in_cr2,param_1 + 0x10);
  coprocessor_loadlong(1,in_cr3,param_1 + 0x18);
  coprocessor_loadlong(1,in_cr4,param_1 + 0x20);
  coprocessor_loadlong(1,in_cr5,param_1 + 0x28);
  coprocessor_loadlong(1,in_cr6,param_1 + 0x30);
  coprocessor_loadlong(1,in_cr7,param_1 + 0x38);
  coprocessor_loadlong(1,in_cr8,param_1 + 0x40);
  coprocessor_loadlong(1,in_cr9,param_1 + 0x48);
  coprocessor_loadlong(1,in_cr10,param_1 + 0x50);
  coprocessor_loadlong(1,in_cr11,param_1 + 0x58);
  coprocessor_loadlong(1,in_cr12,param_1 + 0x60);
  coprocessor_loadlong(1,in_cr13,param_1 + 0x68);
  coprocessor_loadlong(1,in_cr14,param_1 + 0x70);
  coprocessor_loadlong(1,in_cr15,param_1 + 0x78);
  return param_1 + 0x80;
}



### FUNC __gnu_Unwind_Save_WMMXD @ 00058d38

int __gnu_Unwind_Save_WMMXD(int param_1)

{
  undefined4 in_cr0;
  undefined4 in_cr1;
  undefined4 in_cr2;
  undefined4 in_cr3;
  undefined4 in_cr4;
  undefined4 in_cr5;
  undefined4 in_cr6;
  undefined4 in_cr7;
  undefined4 in_cr8;
  undefined4 in_cr9;
  undefined4 in_cr10;
  undefined4 in_cr11;
  undefined4 in_cr12;
  undefined4 in_cr13;
  undefined4 in_cr14;
  undefined4 in_cr15;
  
  coprocessor_storelong(1,in_cr0,param_1);
  coprocessor_storelong(1,in_cr1,param_1 + 8);
  coprocessor_storelong(1,in_cr2,param_1 + 0x10);
  coprocessor_storelong(1,in_cr3,param_1 + 0x18);
  coprocessor_storelong(1,in_cr4,param_1 + 0x20);
  coprocessor_storelong(1,in_cr5,param_1 + 0x28);
  coprocessor_storelong(1,in_cr6,param_1 + 0x30);
  coprocessor_storelong(1,in_cr7,param_1 + 0x38);
  coprocessor_storelong(1,in_cr8,param_1 + 0x40);
  coprocessor_storelong(1,in_cr9,param_1 + 0x48);
  coprocessor_storelong(1,in_cr10,param_1 + 0x50);
  coprocessor_storelong(1,in_cr11,param_1 + 0x58);
  coprocessor_storelong(1,in_cr12,param_1 + 0x60);
  coprocessor_storelong(1,in_cr13,param_1 + 0x68);
  coprocessor_storelong(1,in_cr14,param_1 + 0x70);
  coprocessor_storelong(1,in_cr15,param_1 + 0x78);
  return param_1 + 0x80;
}



### FUNC __gnu_Unwind_Restore_WMMXC @ 00058d7c

int __gnu_Unwind_Restore_WMMXC(int param_1)

{
  undefined4 in_cr8;
  undefined4 in_cr9;
  undefined4 in_cr10;
  undefined4 in_cr11;
  
  coprocessor_load2(1,in_cr8,param_1);
  coprocessor_load2(1,in_cr9,param_1 + 4);
  coprocessor_load2(1,in_cr10,param_1 + 8);
  coprocessor_load2(1,in_cr11,param_1 + 0xc);
  return param_1 + 0x10;
}



### FUNC __gnu_Unwind_Save_WMMXC @ 00058d90

int __gnu_Unwind_Save_WMMXC(int param_1)

{
  undefined4 in_cr8;
  undefined4 in_cr9;
  undefined4 in_cr10;
  undefined4 in_cr11;
  
  coprocessor_store2(1,in_cr8,param_1);
  coprocessor_store2(1,in_cr9,param_1 + 4);
  coprocessor_store2(1,in_cr10,param_1 + 8);
  coprocessor_store2(1,in_cr11,param_1 + 0xc);
  return param_1 + 0x10;
}



### FUNC ___Unwind_RaiseException @ 00058da4

void ___Unwind_RaiseException
               (undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)

{
  undefined4 uStack_44;
  undefined4 uStack_40;
  undefined4 uStack_3c;
  undefined4 uStack_38;
  undefined4 uStack_34;
  
  uStack_44 = 0;
  uStack_40 = param_1;
  uStack_3c = param_2;
  uStack_38 = param_3;
  uStack_34 = param_4;
  __gnu_Unwind_RaiseException(param_1,&uStack_44,param_3,0,param_3);
  return;
}



### FUNC ___Unwind_Resume @ 00058dc8

void ___Unwind_Resume(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)

{
  undefined4 uStack_44;
  undefined4 uStack_40;
  undefined4 uStack_3c;
  undefined4 uStack_38;
  undefined4 uStack_34;
  
  uStack_44 = 0;
  uStack_40 = param_1;
  uStack_3c = param_2;
  uStack_38 = param_3;
  uStack_34 = param_4;
  __gnu_Unwind_Resume(param_1,&uStack_44,param_3,0,param_3);
  return;
}



### FUNC _Unwind_Resume_or_Rethrow @ 00058dec

void _Unwind_Resume_or_Rethrow
               (undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)

{
  undefined4 uStack_44;
  undefined4 uStack_40;
  undefined4 uStack_3c;
  undefined4 uStack_38;
  undefined4 uStack_34;
  
  uStack_44 = 0;
  uStack_40 = param_1;
  uStack_3c = param_2;
  uStack_38 = param_3;
  uStack_34 = param_4;
  __gnu_Unwind_Resume_or_Rethrow(param_1,&uStack_44,param_3,0,param_3);
  return;
}



### FUNC _Unwind_ForcedUnwind @ 00058e10

void _Unwind_ForcedUnwind(void)

{
  __gnu_Unwind_ForcedUnwind();
  return;
}



### FUNC _Unwind_Backtrace @ 00058e34

void _Unwind_Backtrace(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)

{
  undefined4 uStack_44;
  undefined4 uStack_40;
  undefined4 uStack_3c;
  undefined4 uStack_38;
  undefined4 uStack_34;
  
  uStack_44 = 0;
  uStack_40 = param_1;
  uStack_3c = param_2;
  uStack_38 = param_3;
  uStack_34 = param_4;
  __gnu_Unwind_Backtrace(param_1,param_2,&uStack_44,0,param_3);
  return;
}



### FUNC FUN_00058e58 @ 00058e58

uint FUN_00058e58(uint *param_1)

{
  char cVar1;
  uint uVar2;
  
  if ((char)param_1[2] == '\0') {
    if (*(char *)((int)param_1 + 9) == '\0') {
      return 0xb0;
    }
    *(char *)((int)param_1 + 9) = *(char *)((int)param_1 + 9) + -1;
    *param_1 = *(uint *)param_1[1];
    param_1[1] = (uint)((uint *)param_1[1] + 1);
    cVar1 = '\x03';
  }
  else {
    cVar1 = (char)param_1[2] + -1;
  }
  *(char *)(param_1 + 2) = cVar1;
  uVar2 = *param_1;
  *param_1 = uVar2 << 8;
  return uVar2 >> 0x18;
}



### FUNC FUN_00058eb8 @ 00058eb8

undefined4 FUN_00058eb8(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)

{
  undefined4 local_c;
  
  local_c = param_4;
  _Unwind_VRS_Get(param_1,0,0xc,0,&local_c,param_2,param_3);
  return local_c;
}



### FUNC __gnu_unwind_execute @ 00058ee4

undefined4 __gnu_unwind_execute(int *param_1,undefined4 param_2,undefined4 param_3,int param_4)

{
  uint uVar1;
  undefined4 uVar2;
  uint uVar3;
  undefined4 uVar4;
  bool bVar5;
  int iVar6;
  int *piVar7;
  undefined4 uVar8;
  int local_24;
  
  bVar5 = false;
  piVar7 = param_1;
  uVar8 = param_2;
  local_24 = param_4;
LAB_00058efc:
  do {
    while( true ) {
      uVar1 = FUN_00058e58(param_2);
      if (uVar1 == 0xb0) {
        if (!bVar5) {
          _Unwind_VRS_Get(param_1,0,0xe,0,&local_24,uVar8,param_3);
          _Unwind_VRS_Set(param_1,0,0xf,0,&local_24);
        }
        return 0;
      }
      if ((uVar1 & 0x80) != 0) break;
      _Unwind_VRS_Get(param_1,0,0xd,0,&local_24,uVar8,param_3);
      iVar6 = (uVar1 & 0x3f) * 4 + 4;
      if ((uVar1 & 0x40) != 0) {
        iVar6 = -iVar6;
      }
      local_24 = local_24 + iVar6;
LAB_00059024:
      piVar7 = &local_24;
      _Unwind_VRS_Set(param_1,0,0xd,0);
    }
    uVar3 = uVar1 & 0xf0;
    if (uVar3 == 0x80) {
      uVar3 = FUN_00058e58(param_2);
      uVar3 = uVar3 | uVar1 << 8;
      if (uVar3 == 0x8000) {
        return 9;
      }
      iVar6 = _Unwind_VRS_Pop(param_1,0,(uVar3 << 0x14) >> 0x10,0,piVar7);
      if (iVar6 != 0) {
        return 9;
      }
      if ((uVar3 & 0x800) != 0) {
        bVar5 = true;
      }
      goto LAB_00058efc;
    }
    if (uVar3 == 0x90) {
      if ((uVar1 & 0xd) == 0xd) {
        return 9;
      }
      _Unwind_VRS_Get(param_1,0,uVar1 & 0xf,0,&local_24,uVar8,param_3);
      goto LAB_00059024;
    }
    if (uVar3 == 0xa0) {
      uVar3 = 0xff0 >> (~uVar1 & 7) & 0xff0;
      if ((uVar1 & 8) != 0) {
        uVar3 = uVar3 | 0x4000;
      }
      uVar2 = 0;
      uVar4 = uVar2;
    }
    else if (uVar3 == 0xb0) {
      if (uVar1 == 0xb1) {
        uVar3 = FUN_00058e58(param_2);
        if (uVar3 == 0) {
          return 9;
        }
        if ((uVar3 & 0xf0) != 0) {
          return 9;
        }
        uVar2 = 0;
        uVar4 = uVar2;
      }
      else {
        if (uVar1 == 0xb2) {
          _Unwind_VRS_Get(param_1,0,0xd,0,&local_24,uVar8,param_3);
          uVar1 = FUN_00058e58(param_2);
          uVar3 = 2;
          while ((uVar1 & 0x80) != 0) {
            local_24 = local_24 + ((uVar1 & 0x7f) << (uVar3 & 0xff));
            uVar3 = uVar3 + 7;
            uVar1 = FUN_00058e58(param_2);
          }
          local_24 = local_24 + 0x204 + ((uVar1 & 0x7f) << (uVar3 & 0xff));
          goto LAB_00059024;
        }
        if (uVar1 == 0xb3) {
          uVar1 = FUN_00058e58(param_2);
          uVar2 = 1;
          goto LAB_00059178;
        }
        if ((uVar1 & 0xfc) == 0xb4) {
          return 9;
        }
        uVar2 = 1;
        uVar3 = (uVar1 & 7) + 1 | 0x80000;
        uVar4 = uVar2;
      }
    }
    else if (uVar3 == 0xc0) {
      if (uVar1 == 0xc6) {
        uVar1 = FUN_00058e58(param_2);
        uVar2 = 3;
LAB_00059178:
        uVar3 = (uVar1 & 0xf) + 1 | (uVar1 & 0xf0) << 0xc;
        uVar4 = uVar2;
      }
      else if (uVar1 == 199) {
        uVar3 = FUN_00058e58(param_2);
        if (uVar3 == 0) {
          return 9;
        }
        if ((uVar3 & 0xf0) != 0) {
          return 9;
        }
        uVar2 = 4;
        uVar4 = 0;
      }
      else {
        if ((uVar1 & 0xf8) != 0xc0) {
          if (uVar1 == 200) {
            uVar1 = FUN_00058e58(param_2);
            uVar3 = (uVar1 & 0xf) + 1 | ((uVar1 & 0xf0) + 0x10) * 0x1000;
          }
          else {
            if (uVar1 != 0xc9) {
              return 9;
            }
            uVar1 = FUN_00058e58(param_2);
            uVar3 = (uVar1 & 0xf) + 1 | (uVar1 & 0xf0) << 0xc;
          }
          goto LAB_0005924c;
        }
        uVar2 = 3;
        uVar3 = (uVar1 & 0xf) + 1 | 0xa0000;
        uVar4 = uVar2;
      }
    }
    else {
      if ((uVar1 & 0xf8) != 0xd0) {
        return 9;
      }
      uVar3 = (uVar1 & 7) + 1 | 0x80000;
LAB_0005924c:
      uVar2 = 1;
      uVar4 = 5;
    }
    iVar6 = _Unwind_VRS_Pop(param_1,uVar2,uVar3,uVar4,piVar7);
    if (iVar6 != 0) {
      return 9;
    }
  } while( true );
}



### FUNC __gnu_unwind_frame @ 0005926c

void __gnu_unwind_frame(int param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)

{
  int iVar1;
  int local_14;
  int local_10;
  undefined1 local_c;
  undefined1 local_b;
  undefined2 uStack_a;
  
  iVar1 = *(int *)(param_1 + 0x4c);
  local_14 = *(int *)(iVar1 + 4) << 8;
  local_10 = iVar1 + 8;
  uStack_a = (undefined2)((uint)param_4 >> 0x10);
  _local_c = CONCAT11(*(undefined1 *)(iVar1 + 7),3);
  __gnu_unwind_execute(param_2,&local_14,3,*(undefined1 *)(iVar1 + 7),param_1);
  return;
}



### FUNC _Unwind_GetRegionStart @ 000592ac

undefined4 _Unwind_GetRegionStart(void)

{
  int iVar1;
  
  iVar1 = thunk_FUN_00058eb8();
  return *(undefined4 *)(iVar1 + 0x48);
}



### FUNC _Unwind_GetLanguageSpecificData @ 000592bc

int _Unwind_GetLanguageSpecificData(void)

{
  int iVar1;
  
  iVar1 = thunk_FUN_00058eb8();
  return *(int *)(iVar1 + 0x4c) + (uint)*(byte *)(*(int *)(iVar1 + 0x4c) + 7) * 4 + 8;
}



### FUNC _Unwind_GetDataRelBase @ 000592d8

void _Unwind_GetDataRelBase(void)

{
                    /* WARNING: Subroutine does not return */
  abort();
}



### FUNC _Unwind_GetTextRelBase @ 000592e0

void _Unwind_GetTextRelBase(void)

{
                    /* WARNING: Subroutine does not return */
  abort();
}



### FUNC __divdi3 @ 000592e8

undefined8 __divdi3(uint param_1,uint param_2,uint param_3,uint param_4)

{
  uint uVar1;
  uint uVar2;
  int iVar3;
  uint uVar4;
  int iVar5;
  uint uVar6;
  uint uVar7;
  bool bVar8;
  bool bVar9;
  undefined8 uVar10;
  longlong lVar11;
  int iVar12;
  
  if ((int)param_2 < 0) {
    uVar4 = -param_1;
    param_2 = -(param_2 + (param_1 != 0));
    uVar6 = 0xffffffff;
  }
  else {
    uVar6 = 0;
    uVar4 = param_1;
  }
  uVar7 = param_3;
  if ((int)param_4 < 0) {
    uVar7 = -param_3;
    param_4 = -(param_4 + (param_3 != 0));
    uVar6 = ~uVar6;
  }
  bVar9 = param_2 <= param_4;
  bVar8 = param_4 != param_2;
  if (!bVar8) {
    bVar9 = uVar4 <= uVar7;
  }
  uVar2 = param_4;
  uVar1 = uVar7;
  if (bVar9 && (bVar8 || uVar7 != uVar4)) {
    uVar1 = 0;
    uVar2 = 0;
  }
  lVar11 = CONCAT44(uVar2,uVar1);
  if (!bVar9 || !bVar8 && uVar7 == uVar4) {
    if (param_4 == 0) {
      iVar5 = LZCOUNT(uVar7) + 0x20;
    }
    else {
      iVar5 = LZCOUNT(param_4);
    }
    if (param_2 == 0) {
      iVar3 = LZCOUNT(uVar4) + 0x20;
    }
    else {
      iVar3 = LZCOUNT(param_2);
    }
    iVar5 = iVar5 - iVar3;
    iVar12 = iVar5;
    uVar10 = __ashldi3(uVar7,param_4,iVar5,iVar3,param_1,iVar5,param_3);
    uVar7 = (uint)((ulonglong)uVar10 >> 0x20);
    uVar1 = (uint)uVar10;
    bVar9 = uVar7 <= param_2;
    if (param_2 == uVar7) {
      bVar9 = uVar1 <= uVar4;
    }
    if (bVar9) {
      bVar9 = uVar4 < uVar1;
      uVar4 = uVar4 - uVar1;
      param_2 = param_2 - (uVar7 + bVar9);
      lVar11 = __ashldi3(1,0,iVar5);
    }
    else {
      lVar11 = 0;
    }
    if (iVar5 != 0) {
      uVar7 = uVar7 >> 1;
      uVar1 = (uint)((byte)((ulonglong)uVar10 >> 0x20) & 1) << 0x1f | uVar1 >> 1;
      do {
        uVar2 = uVar4 - uVar1;
        iVar3 = param_2 - (uVar7 + (uVar4 < uVar1));
        bVar9 = uVar7 <= param_2;
        if (param_2 == uVar7) {
          bVar9 = uVar1 <= uVar4;
        }
        param_2 = param_2 * 2 + (uint)CARRY4(uVar4,uVar4);
        uVar4 = uVar4 * 2;
        if (bVar9) {
          param_2 = iVar3 * 2 + (uint)CARRY4(uVar2,uVar2) + (uint)(0xfffffffe < uVar2 * 2);
          uVar4 = uVar2 * 2 + 1;
        }
        iVar5 = iVar5 + -1;
      } while (iVar5 != 0);
      lVar11 = lVar11 + CONCAT44(param_2,uVar4);
      uVar7 = (uint)lVar11;
      uVar10 = __lshrdi3(uVar4,param_2,iVar12);
      uVar10 = __ashldi3((int)uVar10,(int)((ulonglong)uVar10 >> 0x20),iVar12);
      lVar11 = CONCAT44((int)((ulonglong)lVar11 >> 0x20) -
                        ((int)((ulonglong)uVar10 >> 0x20) + (uint)(uVar7 < (uint)uVar10)),
                        uVar7 - (uint)uVar10);
    }
  }
  if (uVar6 != 0) {
    uVar6 = 1;
  }
  uVar4 = (uint)lVar11 ^ -uVar6;
  return CONCAT44(((uint)((ulonglong)lVar11 >> 0x20) ^ -(uint)(uVar6 != 0)) +
                  (uint)CARRY4(uVar4,uVar6),uVar4 + uVar6);
}



### FUNC __udivdi3 @ 00059468

int __udivdi3(uint param_1,uint param_2,uint param_3,uint param_4)

{
  uint uVar1;
  int iVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  int iVar7;
  uint uVar8;
  bool bVar9;
  bool bVar10;
  undefined8 uVar11;
  
  bVar9 = param_2 <= param_4;
  if (param_4 == param_2) {
    bVar9 = param_1 <= param_3;
  }
  if (bVar9 && (param_4 != param_2 || param_3 != param_1)) {
    return 0;
  }
  if (param_4 == 0) {
    iVar6 = LZCOUNT(param_3) + 0x20;
  }
  else {
    iVar6 = LZCOUNT(param_4);
  }
  if (param_2 == 0) {
    iVar4 = LZCOUNT(param_1) + 0x20;
  }
  else {
    iVar4 = LZCOUNT(param_2);
  }
  iVar6 = iVar6 - iVar4;
  uVar11 = __ashldi3(param_3,param_4,iVar6,param_4,param_4);
  uVar5 = (uint)((ulonglong)uVar11 >> 0x20);
  uVar3 = (uint)uVar11;
  bVar9 = uVar5 <= param_2;
  if (param_2 == uVar5) {
    bVar9 = uVar3 <= param_1;
  }
  if (bVar9) {
    bVar9 = param_1 < uVar3;
    param_1 = param_1 - uVar3;
    param_2 = param_2 - (uVar5 + bVar9);
    iVar4 = __ashldi3(1,0,iVar6);
  }
  else {
    iVar4 = 0;
  }
  if (iVar6 != 0) {
    uVar5 = uVar5 >> 1;
    uVar3 = (uint)((byte)((ulonglong)uVar11 >> 0x20) & 1) << 0x1f | uVar3 >> 1;
    iVar7 = iVar6;
    do {
      uVar8 = param_1 - uVar3;
      bVar10 = CARRY4(param_1,param_1);
      uVar1 = param_1 * 2;
      iVar2 = param_2 * 2;
      bVar9 = uVar5 <= param_2;
      if (param_2 == uVar5) {
        bVar9 = uVar3 <= param_1;
      }
      param_2 = (param_2 - (uVar5 + (param_1 < uVar3))) * 2 + (uint)CARRY4(uVar8,uVar8) +
                (uint)(0xfffffffe < uVar8 * 2);
      param_1 = uVar8 * 2 + 1;
      if (!bVar9) {
        param_2 = iVar2 + (uint)bVar10;
        param_1 = uVar1;
      }
      iVar7 = iVar7 + -1;
    } while (iVar7 != 0);
    uVar11 = __lshrdi3(param_1,param_2,iVar6);
    iVar6 = __ashldi3((int)uVar11,(int)((ulonglong)uVar11 >> 0x20),iVar6);
    return (param_1 + iVar4) - iVar6;
  }
  return iVar4;
}



### FUNC __lshrdi3 @ 00059574

undefined8 __lshrdi3(uint param_1,uint param_2,uint param_3)

{
  uint uVar1;
  
  if ((int)(param_3 - 0x20) < 0) {
    uVar1 = param_1 >> (param_3 & 0xff) | param_2 << (0x20 - param_3 & 0xff);
  }
  else {
    uVar1 = param_2 >> (param_3 - 0x20 & 0xff);
  }
  return CONCAT44(param_2 >> (param_3 & 0xff),uVar1);
}



### FUNC __ashldi3 @ 00059590

undefined8 __ashldi3(uint param_1,int param_2,uint param_3)

{
  uint uVar1;
  
  if ((int)(param_3 - 0x20) < 0) {
    uVar1 = param_2 << (param_3 & 0xff) | param_1 >> (0x20 - param_3 & 0xff);
  }
  else {
    uVar1 = param_1 << (param_3 - 0x20 & 0xff);
  }
  return CONCAT44(uVar1,param_1 << (param_3 & 0xff));
}



