int proc2(int *param1, char *param2);
void proc3(void *param1, int param2);
void proc5(void *param1, char param2[], int param3);
void proc6(void *param1);
void proc7(void *param1, int param2);
int proc9(char *param1);
int proc10(FILE *param1);

// address: 0x4012e0
int main(int argc, char **argv, char **envp) {
    unsigned int dl; 		// r10
    void *eax; 		// r24
    int *ebp; 		// r29
    int *ebx; 		// r27
    unsigned int *ecx; 		// r25
    int *edi; 		// r31
    unsigned int edx; 		// r26
    int *esi; 		// r30
    void *esp; 		// r28
    unsigned int local23; 		// r24{118}
    int local29; 		// %pc{211}
    int local30; 		// %pc{140}
    int local32; 		// %pc{131}
    int local34; 		// %pc{112}
    unsigned int local36; 		// r26{190}
    void **local37; 		// r28{102}
    int *local38; 		// r29{102}
    int *local39; 		// r24{78}
    void *local40; 		// r24{51}
    int local41; 		// local29{211}
    int *local42; 		// r29{227}

    ebp = (int *)(esp - 4);
    local42 = ebp;
    local42 = ebp;
    if (argc > 1) {
        edx = 1;
        dl = 1;
        if (1 >= argc) {
L9:
            eax = *(argv + 4);
            esi = proc2((int *)(esp - 44), eax); /* Warning: also results in ecx, ebx, local37, local38, edi */
            local42 = local38;
            if (*(local38 - 97) == 0) {
                if (*(local38 - 98) == 0) {
                    *local37 = local38 - 40;
                    *(int*)(local38 - 88) = 1;
                    proc7(local38 - 40, ZF);
                    local41 = local30;
                } else {
                    local23 = *(unsigned char*)(local38 - 99);
                    eax = *(*(local38 + 12) + local23 * 4);
                    *(char **)(local37 + 4) = eax;
                    *local37 = local38 - 40;
                    *(int*)(local38 - 88) = 1;
                    proc5(eax, local38 - 40, ZF);
                    local41 = local32;
                }
            } else {
                *local37 = local38 - 40;
                *(int*)(local38 - 88) = 1;
                proc3(local38 - 40, ZF);
                local41 = local34;
            }
            local29 = local41;
            *(int*)(local38 - 88) = 1;
            *local37 = local38 - 40;
            if (*(local38 - 36) != 0) {
                *local37 = *(local38 - 36);
                *(int*)(local37 - 4) = local29;
                proc6(*(local38 - 36));
            }
            esp = local37;
            *(int*)(local38 - 96) = 1;
        } else {
            do {
                local40 = *(argv + edx * 4);
                if (*local40 == 45) {
                    if (*(local40 + 1) != 111) {
                        local39 = *(argv + edx * 4);
                        if (*(local39 + 1) == 120) {
                            goto L10;
                        }
                        goto L10;
                    }
                    if ((int)(dl + 1) >= argc) {
                        puts("you have to add a filename to option -o\nlike: unpackkyra A_E.PAK -o ALGAE.CPS");
                        goto L0;
                    }
                    edx++;
                    goto L10;
                }
L10:
                local36 = edx;
                edx = local36 + 1;
                dl = (unsigned char) local36 + 1;
            } while (local36 + 1 < argc);
            goto L9;
        }
    } else {
        eax = *argv;
        printf("Use:\n%s filename [OPTIONS]\nHere are the options, default is listing files to stdout\n-o xxx   Extract only file 'xxx'\n-x       Extract all files\n", eax);
    }
L0:
    ebp = local42;
    *esp = ebp - 92;
    return *(ebp - 96);
}

// address: 0x401530
int proc2(int *param1, char *param2) {
    FILE *eax; 		// r24
    int *ebp; 		// r29
    FILE *ebx; 		// r27
    int ecx; 		// r25
    void *esp; 		// r28
    union { FILE * x443; int x444; } local11; 		// m[ *union**r28]{93}
    union { FILE * x443; int x444; } local16; 		// m[ *union**r28]{35}
    int local17; 		// %pc{38}
    void *local20; 		// r28{27}
    void *local21; 		// r28{17}
    int local22; 		// %pc{16}
    union { FILE ** x405; union { int x403; FILE * x404; } * x406; int * x410; char ** x422; union { FILE * x443; int x444; } * x445; union { int x403; FILE * x404; } * x447; union { FILE * x443; int x444; } * x452; union { FILE * x443; int x444; } * x466; union { int x403; FILE * x404; } * x467; union { FILE * x443; int x444; } * x469; union { FILE * x443; int x444; } * x477; union { int x403; FILE * x404; } * x478; union { FILE * x443; int x444; } * x480; union { FILE * x443; int x444; } * x488; union { int x403; FILE * x404; } * x489; union { FILE * x443; int x444; } * x491; union { FILE * x443; int x444; } * x499; union { int x403; FILE * x404; } * x500; union { FILE * x443; int x444; } * x502; union { FILE * x443; int x444; } * x510; union { int x403; FILE * x404; } * x511; union { FILE * x443; int x444; } * x513; union { FILE * x443; int x444; } * x521; union { int x403; FILE * x404; } * x522; union { FILE * x443; int x444; } * x524; union { FILE * x443; int x444; } * x532; union { int x403; FILE * x404; } * x533; union { FILE * x443; int x444; } * x535; union { FILE * x443; int x444; } * x543; union { int x403; FILE * x404; } * x544; union { FILE * x443; int x444; } * x546; union { FILE * x443; int x444; } * x554; union { int x403; FILE * x404; } * x555; union { FILE * x443; int x444; } * x557; union { FILE * x443; int x444; } * x565; union { int x403; FILE * x404; } * x566; union { FILE * x443; int x444; } * x568; union { FILE * x443; int x444; } * x576; union { int x403; FILE * x404; } * x577; union { FILE * x443; int x444; } * x579; union { FILE * x443; int x444; } * x587; union { int x403; FILE * x404; } * x588; union { FILE * x443; int x444; } * x590; union { FILE * x443; int x444; } * x598; union { int x403; FILE * x404; } * x599; union { FILE * x443; int x444; } * x601; union { FILE * x443; int x444; } * x609; union { int x403; FILE * x404; } * x610; union { FILE * x443; int x444; } * x612; union { FILE * x443; int x444; } * x620; union { int x403; FILE * x404; } * x621; union { FILE * x443; int x444; } * x623; union { FILE * x443; int x444; } * x631; union { int x403; FILE * x404; } * x632; union { FILE * x443; int x444; } * x634; union { FILE * x443; int x444; } * x642; union { int x403; FILE * x404; } * x643; union { FILE * x443; int x444; } * x645; union { FILE * x443; int x444; } * x653; union { int x403; FILE * x404; } * x654; union { FILE * x443; int x444; } * x656; union { FILE * x443; int x444; } * x2728; union { int x403; FILE * x404; } * x2729; union { FILE * x443; int x444; } * x2733; union { FILE * x443; int x444; } * x2747; union { int x403; FILE * x404; } * x2748; union { FILE * x443; int x444; } * x2750; union { FILE * x443; int x444; } * x2758; union { int x403; FILE * x404; } * x2759; union { FILE * x443; int x444; } * x2761; union { FILE * x443; int x444; } * x2769; union { int x403; FILE * x404; } * x2770; union { FILE * x443; int x444; } * x2772; union { FILE * x443; int x444; } * x2780; union { int x403; FILE * x404; } * x2781; union { FILE * x443; int x444; } * x2783; union { FILE * x443; int x444; } * x2791; union { int x403; FILE * x404; } * x2792; union { FILE * x443; int x444; } * x2794; union { FILE * x443; int x444; } * x2802; union { int x403; FILE * x404; } * x2803; union { FILE * x443; int x444; } * x2805; union { FILE * x443; int x444; } * x2813; union { int x403; FILE * x404; } * x2814; union { FILE * x443; int x444; } * x2816; union { FILE * x443; int x444; } * x2824; union { int x403; FILE * x404; } * x2825; union { FILE * x443; int x444; } * x2827; union { FILE * x443; int x444; } * x2835; union { int x403; FILE * x404; } * x2836; union { FILE * x443; int x444; } * x2838; union { FILE * x443; int x444; } * x2846; union { int x403; FILE * x404; } * x2847; union { FILE * x443; int x444; } * x2849; union { FILE * x443; int x444; } * x2857; union { int x403; FILE * x404; } * x2858; union { FILE * x443; int x444; } * x2860; union { FILE * x443; int x444; } * x2868; union { int x403; FILE * x404; } * x2869; union { FILE * x443; int x444; } * x2871; union { FILE * x443; int x444; } * x2879; union { int x403; FILE * x404; } * x2880; union { FILE * x443; int x444; } * x2882; union { FILE * x443; int x444; } * x2890; union { int x403; FILE * x404; } * x2891; union { FILE * x443; int x444; } * x2893; union { FILE * x443; int x444; } * x2901; union { int x403; FILE * x404; } * x2902; union { FILE * x443; int x444; } * x2904; union { FILE * x443; int x444; } * x2912; union { int x403; FILE * x404; } * x2913; union { FILE * x443; int x444; } * x2915; union { FILE * x443; int x444; } * x2923; union { int x403; FILE * x404; } * x2924; union { FILE * x443; int x444; } * x2926; union { FILE * x443; int x444; } * x2934; union { int x403; FILE * x404; } * x2935; union { FILE * x443; int x444; } * x2937; union { FILE * x443; int x444; } * x2945; union { int x403; FILE * x404; } * x2946; union { FILE * x443; int x444; } * x2948; } local23; 		// local7{79}
    int local24; 		// %pc{81}
    int local25; 		// %pc{86}
    union { FILE * x443; int x444; } local26; 		// local11{93}
    union { FILE ** x405; union { int x403; FILE * x404; } * x406; int * x410; char ** x422; union { FILE * x443; int x444; } * x445; union { int x403; FILE * x404; } * x447; union { FILE * x443; int x444; } * x452; union { FILE * x443; int x444; } * x466; union { int x403; FILE * x404; } * x467; union { FILE * x443; int x444; } * x469; union { FILE * x443; int x444; } * x477; union { int x403; FILE * x404; } * x478; union { FILE * x443; int x444; } * x480; union { FILE * x443; int x444; } * x488; union { int x403; FILE * x404; } * x489; union { FILE * x443; int x444; } * x491; union { FILE * x443; int x444; } * x499; union { int x403; FILE * x404; } * x500; union { FILE * x443; int x444; } * x502; union { FILE * x443; int x444; } * x510; union { int x403; FILE * x404; } * x511; union { FILE * x443; int x444; } * x513; union { FILE * x443; int x444; } * x521; union { int x403; FILE * x404; } * x522; union { FILE * x443; int x444; } * x524; union { FILE * x443; int x444; } * x532; union { int x403; FILE * x404; } * x533; union { FILE * x443; int x444; } * x535; union { FILE * x443; int x444; } * x543; union { int x403; FILE * x404; } * x544; union { FILE * x443; int x444; } * x546; union { FILE * x443; int x444; } * x554; union { int x403; FILE * x404; } * x555; union { FILE * x443; int x444; } * x557; union { FILE * x443; int x444; } * x565; union { int x403; FILE * x404; } * x566; union { FILE * x443; int x444; } * x568; union { FILE * x443; int x444; } * x576; union { int x403; FILE * x404; } * x577; union { FILE * x443; int x444; } * x579; union { FILE * x443; int x444; } * x587; union { int x403; FILE * x404; } * x588; union { FILE * x443; int x444; } * x590; union { FILE * x443; int x444; } * x598; union { int x403; FILE * x404; } * x599; union { FILE * x443; int x444; } * x601; union { FILE * x443; int x444; } * x609; union { int x403; FILE * x404; } * x610; union { FILE * x443; int x444; } * x612; union { FILE * x443; int x444; } * x620; union { int x403; FILE * x404; } * x621; union { FILE * x443; int x444; } * x623; union { FILE * x443; int x444; } * x631; union { int x403; FILE * x404; } * x632; union { FILE * x443; int x444; } * x634; union { FILE * x443; int x444; } * x642; union { int x403; FILE * x404; } * x643; union { FILE * x443; int x444; } * x645; union { FILE * x443; int x444; } * x653; union { int x403; FILE * x404; } * x654; union { FILE * x443; int x444; } * x656; union { FILE * x443; int x444; } * x2728; union { int x403; FILE * x404; } * x2729; union { FILE * x443; int x444; } * x2733; union { FILE * x443; int x444; } * x2747; union { int x403; FILE * x404; } * x2748; union { FILE * x443; int x444; } * x2750; union { FILE * x443; int x444; } * x2758; union { int x403; FILE * x404; } * x2759; union { FILE * x443; int x444; } * x2761; union { FILE * x443; int x444; } * x2769; union { int x403; FILE * x404; } * x2770; union { FILE * x443; int x444; } * x2772; union { FILE * x443; int x444; } * x2780; union { int x403; FILE * x404; } * x2781; union { FILE * x443; int x444; } * x2783; union { FILE * x443; int x444; } * x2791; union { int x403; FILE * x404; } * x2792; union { FILE * x443; int x444; } * x2794; union { FILE * x443; int x444; } * x2802; union { int x403; FILE * x404; } * x2803; union { FILE * x443; int x444; } * x2805; union { FILE * x443; int x444; } * x2813; union { int x403; FILE * x404; } * x2814; union { FILE * x443; int x444; } * x2816; union { FILE * x443; int x444; } * x2824; union { int x403; FILE * x404; } * x2825; union { FILE * x443; int x444; } * x2827; union { FILE * x443; int x444; } * x2835; union { int x403; FILE * x404; } * x2836; union { FILE * x443; int x444; } * x2838; union { FILE * x443; int x444; } * x2846; union { int x403; FILE * x404; } * x2847; union { FILE * x443; int x444; } * x2849; union { FILE * x443; int x444; } * x2857; union { int x403; FILE * x404; } * x2858; union { FILE * x443; int x444; } * x2860; union { FILE * x443; int x444; } * x2868; union { int x403; FILE * x404; } * x2869; union { FILE * x443; int x444; } * x2871; union { FILE * x443; int x444; } * x2879; union { int x403; FILE * x404; } * x2880; union { FILE * x443; int x444; } * x2882; union { FILE * x443; int x444; } * x2890; union { int x403; FILE * x404; } * x2891; union { FILE * x443; int x444; } * x2893; union { FILE * x443; int x444; } * x2901; union { int x403; FILE * x404; } * x2902; union { FILE * x443; int x444; } * x2904; union { FILE * x443; int x444; } * x2912; union { int x403; FILE * x404; } * x2913; union { FILE * x443; int x444; } * x2915; union { FILE * x443; int x444; } * x2923; union { int x403; FILE * x404; } * x2924; union { FILE * x443; int x444; } * x2926; union { FILE * x443; int x444; } * x2934; union { int x403; FILE * x404; } * x2935; union { FILE * x443; int x444; } * x2937; union { FILE * x443; int x444; } * x2945; union { int x403; FILE * x404; } * x2946; union { FILE * x443; int x444; } * x2948; } local7; 		// r28{79}
    int local8; 		// r24{33}
    char *local9; 		// r24{39}

    ebp = (int *)(esp - 4);
    eax = fopen(param2, "rb");
    local23 = local21;
    local24 = local22;
    ebx = eax;
    if (eax == NULL) {
        eax = proc9("couldn't open file '%s'"); /* Warning: also results in ebx, local20, ebp */
        local23 = local20;
    }
    local7 = local23;
    *param1 = 1;
    *(FILE **)esp = eax;
    local8 = proc10(eax);
    *(int*)(param1 + 8) = local8;
    local16 = local8;
    local9 = malloc(local8);
    local25 = local17;
    local26 = local16;
    *(char **)(param1 + 4) = local9;
    if (local9 == NULL) {
        *(FILE **)esp = 0x40710e;
        _assert(0x40710e);
        local26 = *(union { FILE * x443; int x444; } *)esp;
    }
    local11 = local26;
    *(FILE **)(local7 + 12) = ebx;
    *(char **)esp = local9;
    fread(local8, 1, ebx, local9);
    *(FILE **)esp = ebx;
    fclose(ebx);
    return *(ebp - 8); /* WARNING: Also returning: ecx, *(ebp - 12), *ebp, *(ebp - 4) */
}

// address: 0x4017b0
void proc3(void *param1, int param2) {
    unsigned int eax; 		// r24
    unsigned int ebx; 		// r27
    unsigned int *ecx; 		// r25
    unsigned int edx; 		// r26
    int *esi; 		// r30
    int *esp; 		// r28
    unsigned int local11; 		// m[r28 - 24]
    int local12; 		// r25{49}
    int local13; 		// r25{176}
    int local14; 		// r25{54}
    int local15; 		// r25{181}
    FILE *local16; 		// r24{110}
    char *local17; 		// r24{128}
    int local21; 		// %pc{109}
    int *local23; 		// r30{168}
    unsigned int local24; 		// r24{78}
    int local25; 		// local13{176}
    int local26; 		// local15{181}
    int local27; 		// %pc{198}

    ecx = *(param1 + 4);
    edx = *(unsigned char*)(ecx + 3);
    eax = *(unsigned char*)(ecx + 2);
    edx = edx * 0x1000000 + eax * 0x10000;
    eax = *(unsigned char*)(ecx + 1);
    eax = edx + eax * 256 + *(unsigned char*)ecx;
    local11 = eax;
    esi = ecx + 4;
    for(;;) {
        local23 = esi;
        local12 = -1;
        local25 = local12;
        do {
            local13 = local25;
            local26 = local13;
            if (local13 == 0) {
                goto L11;
            }
            local14 = local13 - 1;
            local25 = local14;
            local26 = local14;
        } while ( !param2);
L11:
        local15 = local26;
        if (*local23 == 0) {
            goto L0;
        }
        ecx = local23 +  !local15 - 1;
        edx = *(unsigned char*)(ecx + 4);
        eax = *(unsigned char*)(ecx + 3);
        edx = edx * 0x1000000 + eax * 0x10000;
        local24 = *(unsigned char*)(ecx + 2);
        eax = *(unsigned char*)(ecx + 1);
        ebx = edx + local24 * 256 + eax;
        if (*(param1 + 8) >= ebx) {
            if (ebx == 0) {
                ebx = *(param1 + 8);
                goto L6;
            }
        } else {
            ebx = *(param1 + 8);
        }
L6:
        esi = ecx + 5;
        local16 = fopen(local23, "wb");
        local27 = local21;
        if (local16 != NULL) {
            local17 = local11 + *(param1 + 4);
            fwrite(local17, ebx - local11, 1, local16);
            fclose(local16);
        }
        if (*(param1 + 8) == ebx) {
L0:
            return;
        }
        local11 = ebx;
    }
}

// address: 0x401696
void proc5(void *param1, char param2[], int param3) {
    unsigned int eax; 		// r24
    int *ebx; 		// r27
    unsigned int *ecx; 		// r25
    unsigned int edx; 		// r26
    int *esp; 		// r28
    unsigned int local11; 		// m[r28 - 24]
    int local12; 		// r25{49}
    int local13; 		// r25{196}
    int local14; 		// r25{54}
    int local15; 		// r25{201}
    unsigned int local16; 		// r31{89}
    unsigned int local17; 		// r31{94}
    unsigned int local18; 		// r31{101}
    unsigned int local19; 		// r31{208}
    FILE *local20; 		// r24{122}
    char *local21; 		// r24{140}
    int *local25; 		// r27{186}
    unsigned int local26; 		// r24{78}
    int local27; 		// local13{196}
    int local28; 		// local15{201}
    unsigned int local29; 		// local19{208}

    ecx = *(param1 + 4);
    edx = *(unsigned char*)(ecx + 3);
    eax = *(unsigned char*)(ecx + 2);
    edx = edx * 0x1000000 + eax * 0x10000;
    eax = *(unsigned char*)(ecx + 1);
    eax = edx + eax * 256 + *(unsigned char*)ecx;
    local11 = eax;
    ebx = ecx + 4;
    for(;;) {
        local25 = ebx;
        local12 = -1;
        local27 = local12;
        do {
            local13 = local27;
            local28 = local13;
            if (local13 == 0) {
                goto L14;
            }
            local14 = local13 - 1;
            local27 = local14;
            local28 = local14;
        } while ( !param3);
L14:
        local15 = local28;
        if (*local25 == 0) {
L1:
            printf("File '%s' not found in this pakfile\n", param2);
            goto L0;
        }
        ecx = local25 +  !local15 - 1;
        edx = *(unsigned char*)(ecx + 4);
        eax = *(unsigned char*)(ecx + 3);
        edx = edx * 0x1000000 + eax * 0x10000;
        local26 = *(unsigned char*)(ecx + 2);
        eax = *(unsigned char*)(ecx + 1);
        local16 = edx + local26 * 256 + eax;
        local29 = local16;
        if (*(param1 + 8) >= local16) {
            if (local16 == 0) {
                local18 = *(param1 + 8);
                local29 = local18;
                goto L9;
            }
        } else {
            local17 = *(param1 + 8);
            local29 = local17;
        }
L9:
        local19 = local29;
        ebx = ecx + 5;
        eax = strcmp(local25, param2);
        if (eax == 0) {
            break;
        }
        if (*(param1 + 8) == local19) {
            goto L1;
        }
        local11 = local19;
    }
    local20 = fopen(param2, "wb");
    if (local20 != NULL) {
        local21 = local11 + *(param1 + 4);
        fwrite(local21, local19 - local11, 1, local20);
        fclose(local20);
    }
L0:
    return;
}

// address: 0x4027e0
void proc6(void *param1) {
    void *esp; 		// r28

    if (param1 != NULL) {
        free(param1);
    }
    return;
}

// address: 0x4015d8
void proc7(void *param1, int param2) {
    unsigned int eax; 		// r24
    unsigned int ebx; 		// r27
    unsigned int *ecx; 		// r25
    unsigned int edx; 		// r26
    int *esi; 		// r30
    int *esp; 		// r28
    unsigned int local10; 		// m[r28 - 24]
    int local11; 		// r25{49}
    int local12; 		// r25{154}
    int local13; 		// r25{54}
    int local14; 		// r25{159}
    int *local16; 		// r30{146}
    unsigned int local17; 		// r24{87}
    int local18; 		// local12{154}
    int local19; 		// local14{159}

    ecx = *(param1 + 4);
    edx = *(unsigned char*)(ecx + 3);
    eax = *(unsigned char*)(ecx + 2);
    edx = edx * 0x1000000 + eax * 0x10000;
    eax = *(unsigned char*)(ecx + 1);
    eax = edx + eax * 256 + *(unsigned char*)ecx;
    local10 = eax;
    esi = ecx + 4;
    for(;;) {
        local16 = esi;
        local11 = -1;
        local18 = local11;
        do {
            local12 = local18;
            local19 = local12;
            if (local12 == 0) {
                goto L8;
            }
            local13 = local12 - 1;
            local18 = local13;
            local19 = local13;
        } while ( !param2);
L8:
        local14 = local19;
        if (*local16 == 0) {
            break;
        }
        ecx = local16 +  !local14 - 1;
        edx = *(unsigned char*)(ecx + 4);
        eax = *(unsigned char*)(ecx + 3);
        edx = edx * 0x1000000 + eax * 0x10000;
        eax = *(unsigned char*)(ecx + 2);
        local17 = *(unsigned char*)(ecx + 1);
        ebx = edx + eax * 256 + local17;
        if (*(param1 + 8) >= ebx) {
            if (ebx == 0) {
                ebx = *(param1 + 8);
                goto L3;
            }
        } else {
            ebx = *(param1 + 8);
        }
L3:
        esi = ecx + 5;
        printf("Filename: %s size: %d\n", local16, ebx - local10);
        if (*(param1 + 8) == ebx) {
            break;
        }
        local10 = ebx;
    }
    return;
}

// address: 0x4018a0
int proc9(char *param1) {
    int eax; 		// r24
    void *esp; 		// r28

    _vsnprintf((char *)(esp - 1036), 1024, param1, esp + 8);
    fprintf(*0x40d168 + 64, "ERROR: %s!\n", (char *)(esp - 1036));
    exit(1);
    return eax; /* WARNING: Also returning: (void *)(esp - 1036), (void *)(esp - 4) */
}

// address: 0x401bc1
int proc10(FILE *param1) {
    int eax; 		// r24
    void *esp; 		// r28
    int local9; 		// r24{15}

    local9 = ftell(param1);
    fseek(param1, 0, 2);
    eax = ftell(param1);
    fseek(param1, local9, 0);
    return eax;
}


