// File: /workspace/github_c_makefile_star2_O0/nilyang[P]redis-tdd-annotation/src/redis.c
// Function: processCommand
int processCommand(redisClient *c) {
    /* The QUIT command is handled separately. Normal command procs will
     * go through checking for replication and QUIT will cause trouble
     * when FORCE_REPLICATION is enabled and would be implemented in
     * a regular command proc. */
    // 特别处理 quit 命令
    if (!strcasecmp(c->argv[0]->ptr,"quit")) {
        addReply(c,shared.ok);
        c->flags |= REDIS_CLOSE_AFTER_REPLY;
        return REDIS_ERR;
    }

    /* Now lookup the command and check ASAP about trivial error conditions
     * such as wrong arity, bad command name and so forth. */
    // 查找命令，并进行命令合法性检查，以及命令参数个数检查
    c->cmd = c->lastcmd = lookupCommand(c->argv[0]->ptr);
    if (!c->cmd) {
        // 没找到指定的命令
        flagTransaction(c);
        addReplyErrorFormat(c,"unknown command '%s'",
            (char*)c->argv[0]->ptr);
        return REDIS_OK;
    } else if ((c->cmd->arity > 0 && c->cmd->arity != c->argc) ||
               (c->argc < -c->cmd->arity)) {
        // 参数个数错误
        flagTransaction(c);
        addReplyErrorFormat(c,"wrong number of arguments for '%s' command",
            c->cmd->name);
        return REDIS_OK;
    }

    /* Check if the user is authenticated */
    // 检查认证信息
    if (server.requirepass && !c->authenticated && c->cmd->proc != authCommand)
    {
        flagTransaction(c);
        addReply(c,shared.noautherr);
        return REDIS_OK;
    }

    /* If cluster is enabled perform the cluster redirection here.
     *
     * 如果开启了集群模式，那么在这里进行转向操作。
     *
     * However we don't perform the redirection if:
     *
     * 不过，如果有以下情况出现，那么节点不进行转向：
     *
     * 1) The sender of this command is our master.
     *    命令的发送者是本节点的主节点
     *
     * 2) The command has no key arguments. 
     *    命令没有 key 参数
     */
    if (server.cluster_enabled &&
        !(c->flags & REDIS_MASTER) &&
        !(c->cmd->getkeys_proc == NULL && c->cmd->firstkey == 0))
    {
        int hashslot;

        // 集群已下线
        if (server.cluster->state != REDIS_CLUSTER_OK) {
            flagTransaction(c);
            addReplySds(c,sdsnew("-CLUSTERDOWN The cluster is down. Use CLUSTER INFO for more information\r\n"));
            return REDIS_OK;

        // 集群运作正常
        } else {
            int error_code;
            clusterNode *n = getNodeByQuery(c,c->cmd,c->argv,c->argc,&hashslot,&error_code);
            // 不能执行多键处理命令
            if (n == NULL) {
                flagTransaction(c);
                if (error_code == REDIS_CLUSTER_REDIR_CROSS_SLOT) {
                    addReplySds(c,sdsnew("-CROSSSLOT Keys in request don't hash to the same slot\r\n"));
                } else if (error_code == REDIS_CLUSTER_REDIR_UNSTABLE) {
                    /* The request spawns mutliple keys in the same slot,
                     * but the slot is not "stable" currently as there is
                     * a migration or import in progress. */
                    addReplySds(c,sdsnew("-TRYAGAIN Multiple keys request during rehashing of slot\r\n"));
                } else {
                    redisPanic("getNodeByQuery() unknown error.");
                }
                return REDIS_OK;

            // 命令针对的槽和键不是本节点处理的，进行转向
            } else if (n != server.cluster->myself) {
                flagTransaction(c);
                // -<ASK or MOVED> <slot> <ip>:<port>
                // 例如 -ASK 10086 127.0.0.1:12345
                addReplySds(c,sdscatprintf(sdsempty(),
                    "-%s %d %s:%d\r\n",
                    (error_code == REDIS_CLUSTER_REDIR_ASK) ? "ASK" : "MOVED",
                    hashslot,n->ip,n->port));

                return REDIS_OK;
            }

            // 如果执行到这里，说明键 key 所在的槽由本节点处理
            // 或者客户端执行的是无参数命令
        }
    }

    /* Handle the maxmemory directive.
     *
     * First we try to free some memory if possible (if there are volatile
     * keys in the dataset). If there are not the only thing we can do
     * is returning an error. */
    // 如果设置了最大内存，那么检查内存是否超过限制，并做相应的操作
    if (server.maxmemory) {
        // 如果内存已超过限制，那么尝试通过删除过期键来释放内存
        int retval = freeMemoryIfNeeded();
        // 如果即将要执行的命令可能占用大量内存（REDIS_CMD_DENYOOM）
        // 并且前面的内存释放失败的话
        // 那么向客户端返回内存错误
        if ((c->cmd->flags & REDIS_CMD_DENYOOM) && retval == REDIS_ERR) {
            flagTransaction(c);
            addReply(c, shared.oomerr);
            return REDIS_OK;
        }
    }

    /* Don't accept write commands if there are problems persisting on disk
     * and if this is a master instance. */
    // 如果这是一个主服务器，并且这个服务器之前执行 BGSAVE 时发生了错误
    // 那么不执行写命令
    if (((server.stop_writes_on_bgsave_err &&
          server.saveparamslen > 0 &&
          server.lastbgsave_status == REDIS_ERR) ||
          server.aof_last_write_status == REDIS_ERR) &&
        server.masterhost == NULL &&
        (c->cmd->flags & REDIS_CMD_WRITE ||
         c->cmd->proc == pingCommand))
    {
        flagTransaction(c);
        if (server.aof_last_write_status == REDIS_OK)
            addReply(c, shared.bgsaveerr);
        else
            addReplySds(c,
                sdscatprintf(sdsempty(),
                "-MISCONF Errors writing to the AOF file: %s\r\n",
                strerror(server.aof_last_write_errno)));
        return REDIS_OK;
    }

    /* Don't accept write commands if there are not enough good slaves and
     * user configured the min-slaves-to-write option. */
    // 如果服务器没有足够多的状态良好服务器
    // 并且 min-slaves-to-write 选项已打开
    if (server.repl_min_slaves_to_write &&
        server.repl_min_slaves_max_lag &&
        c->cmd->flags & REDIS_CMD_WRITE &&
        server.repl_good_slaves_count < server.repl_min_slaves_to_write)
    {
        flagTransaction(c);
        addReply(c, shared.noreplicaserr);
        return REDIS_OK;
    }

    /* Don't accept write commands if this is a read only slave. But
     * accept write commands if this is our master. */
    // 如果这个服务器是一个只读 slave 的话，那么拒绝执行写命令
    if (server.masterhost && server.repl_slave_ro &&
        !(c->flags & REDIS_MASTER) &&
        c->cmd->flags & REDIS_CMD_WRITE)
    {
        addReply(c, shared.roslaveerr);
        return REDIS_OK;
    }

    /* Only allow SUBSCRIBE and UNSUBSCRIBE in the context of Pub/Sub */
    // 在订阅于发布模式的上下文中，只能执行订阅和退订相关的命令
    if ((dictSize(c->pubsub_channels) > 0 || listLength(c->pubsub_patterns) > 0)
        &&
        c->cmd->proc != subscribeCommand &&
        c->cmd->proc != unsubscribeCommand &&
        c->cmd->proc != psubscribeCommand &&
        c->cmd->proc != punsubscribeCommand) {
        addReplyError(c,"only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in this context");
        return REDIS_OK;
    }

    /* Only allow INFO and SLAVEOF when slave-serve-stale-data is no and
     * we are a slave with a broken link with master. */
    if (server.masterhost && server.repl_state != REDIS_REPL_CONNECTED &&
        server.repl_serve_stale_data == 0 &&
        !(c->cmd->flags & REDIS_CMD_STALE))
    {
        flagTransaction(c);
        addReply(c, shared.masterdownerr);
        return REDIS_OK;
    }

    /* Loading DB? Return an error if the command has not the
     * REDIS_CMD_LOADING flag. */
    // 如果服务器正在载入数据到数据库，那么只执行带有 REDIS_CMD_LOADING
    // 标识的命令，否则将出错
    if (server.loading && !(c->cmd->flags & REDIS_CMD_LOADING)) {
        addReply(c, shared.loadingerr);
        return REDIS_OK;
    }

    /* Lua script too slow? Only allow a limited number of commands. */
    // Lua 脚本超时，只允许执行限定的操作，比如 SHUTDOWN 和 SCRIPT KILL
    if (server.lua_timedout &&
          c->cmd->proc != authCommand &&
          c->cmd->proc != replconfCommand &&
        !(c->cmd->proc == shutdownCommand &&
          c->argc == 2 &&
          tolower(((char*)c->argv[1]->ptr)[0]) == 'n') &&
        !(c->cmd->proc == scriptCommand &&
          c->argc == 2 &&
          tolower(((char*)c->argv[1]->ptr)[0]) == 'k'))
    {
        flagTransaction(c);
        addReply(c, shared.slowscripterr);
        return REDIS_OK;
    }

    /* Exec the command */
    if (c->flags & REDIS_MULTI &&
        c->cmd->proc != execCommand && c->cmd->proc != discardCommand &&
        c->cmd->proc != multiCommand && c->cmd->proc != watchCommand)
    {
        // 在事务上下文中
        // 除 EXEC 、 DISCARD 、 MULTI 和 WATCH 命令之外
        // 其他所有命令都会被入队到事务队列中
        queueMultiCommand(c);
        addReply(c,shared.queued);
    } else {
        // 执行命令
        call(c,REDIS_CALL_FULL);

        c->woff = server.master_repl_offset;
        // 处理那些解除了阻塞的键
        if (listLength(server.ready_keys))
            handleClientsBlockedOnLists();
    }

    return REDIS_OK;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movq (%rax), %rax
movq 0x8(%rax), %rdi
leaq 0xb6628(%rip), %rsi     # 0xdf22a
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x28c3b
movq -0x10(%rbp), %rdi
movq 0xeb541(%rip), %rsi     # 0x114158
callq 0x35a70
movq -0x10(%rbp), %rax
movl 0x90(%rax), %ecx
orl $0x40, %ecx
movl %ecx, 0x90(%rax)
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x293c6
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movq (%rax), %rax
movq 0x8(%rax), %rdi
callq 0x28710
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x48(%rax)
movq -0x10(%rbp), %rax
movq %rcx, 0x40(%rax)
movq -0x10(%rbp), %rax
cmpq $0x0, 0x40(%rax)
jne 0x28ca3
movq -0x10(%rbp), %rdi
callq 0x62ac0
movq -0x10(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movq (%rax), %rax
movq 0x8(%rax), %rdx
leaq 0xb659f(%rip), %rsi     # 0xdf22f
movb $0x0, %al
callq 0x35d80
movl $0x0, -0x4(%rbp)
jmp 0x293c6
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
cmpl $0x0, 0x10(%rax)
jle 0x28cc5
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movl 0x10(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0x30(%rcx), %eax
jne 0x28cdd
movq -0x10(%rbp), %rax
movl 0x30(%rax), %eax
movq -0x10(%rbp), %rcx
movq 0x40(%rcx), %rdx
xorl %ecx, %ecx
subl 0x10(%rdx), %ecx
cmpl %ecx, %eax
jge 0x28d0f
movq -0x10(%rbp), %rdi
callq 0x62ac0
movq -0x10(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movq (%rax), %rdx
leaq 0xb6548(%rip), %rsi     # 0xdf244
movb $0x0, %al
callq 0x35d80
movl $0x0, -0x4(%rbp)
jmp 0x293c6
jmp 0x28d11
cmpq $0x0, 0xeac1f(%rip)     # 0x113938
je 0x28d62
movq -0x10(%rbp), %rax
cmpl $0x0, 0x94(%rax)
jne 0x28d62
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq -0x41d7(%rip), %rcx     # 0x24b60
cmpq %rcx, 0x8(%rax)
je 0x28d62
movq -0x10(%rbp), %rdi
callq 0x62ac0
movq -0x10(%rbp), %rdi
movq 0xeb4cf(%rip), %rsi     # 0x114220
callq 0x35a70
movl $0x0, -0x4(%rbp)
jmp 0x293c6
cmpl $0x0, 0xeb34b(%rip)     # 0x1140b4
je 0x28f2e
movq -0x10(%rbp), %rax
movl 0x90(%rax), %eax
andl $0x2, %eax
cmpl $0x0, %eax
jne 0x28f2e
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
cmpq $0x0, 0x28(%rax)
jne 0x28da6
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
cmpl $0x0, 0x30(%rax)
je 0x28f2e
movq 0xeb31b(%rip), %rax     # 0x1140c8
cmpl $0x0, 0x10(%rax)
je 0x28de8
movq -0x10(%rbp), %rdi
callq 0x62ac0
movq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
leaq 0xb64a4(%rip), %rdi     # 0xdf26f
callq 0x2c0e0
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x35c00
movl $0x0, -0x4(%rbp)
jmp 0x293c6
movq -0x10(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rsi
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rdx
movq -0x10(%rbp), %rax
movl 0x30(%rax), %ecx
leaq -0x14(%rbp), %r8
leaq -0x18(%rbp), %r9
callq 0x71d50
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0x28ea8
movq -0x10(%rbp), %rdi
callq 0x62ac0
cmpl $0x1, -0x18(%rbp)
jne 0x28e50
movq -0x10(%rbp), %rax
movq %rax, -0x38(%rbp)
leaq 0xb647c(%rip), %rdi     # 0xdf2b9
callq 0x2c0e0
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x35c00
jmp 0x28e9c
cmpl $0x2, -0x18(%rbp)
jne 0x28e78
movq -0x10(%rbp), %rax
movq %rax, -0x40(%rbp)
leaq 0xb648d(%rip), %rdi     # 0xdf2f2
callq 0x2c0e0
movq -0x40(%rbp), %rdi
movq %rax, %rsi
callq 0x35c00
jmp 0x28e9a
leaq 0xb64ae(%rip), %rdi     # 0xdf32d
leaq 0xc19ce(%rip), %rsi     # 0xea854
movl $0xa38, %edx            # imm = 0xA38
callq 0x63d40
movl $0x1, %edi
callq 0x1f3b0
jmp 0x28e9c
movl $0x0, -0x4(%rbp)
jmp 0x293c6
movq -0x20(%rbp), %rax
movq 0xeb215(%rip), %rcx     # 0x1140c8
cmpq (%rcx), %rax
je 0x28f28
movq -0x10(%rbp), %rdi
callq 0x62ac0
movq -0x10(%rbp), %rax
movq %rax, -0x48(%rbp)
callq 0x2c0c0
movq %rax, %rdi
movl -0x18(%rbp), %ecx
leaq 0xb6487(%rip), %rdx     # 0xdf362
leaq 0xb647c(%rip), %rax     # 0xdf35e
cmpl $0x3, %ecx
cmoveq %rax, %rdx
movl -0x14(%rbp), %ecx
movq -0x20(%rbp), %r8
addq $0x888, %r8             # imm = 0x888
movq -0x20(%rbp), %rax
movl 0x8b8(%rax), %r9d
leaq 0xb6446(%rip), %rsi     # 0xdf34f
movb $0x0, %al
callq 0x2cad0
movq -0x48(%rbp), %rdi
movq %rax, %rsi
callq 0x35c00
movl $0x0, -0x4(%rbp)
jmp 0x293c6
jmp 0x28f2a
jmp 0x28f2c
jmp 0x28f2e
cmpq $0x0, 0xeb0e2(%rip)     # 0x114018
je 0x28f80
callq 0x293d0
movl %eax, -0x24(%rbp)
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movl 0x20(%rax), %eax
andl $0x4, %eax
cmpl $0x0, %eax
je 0x28f7e
cmpl $-0x1, -0x24(%rbp)
jne 0x28f7e
movq -0x10(%rbp), %rdi
callq 0x62ac0
movq -0x10(%rbp), %rdi
movq 0xeb2cb(%rip), %rsi     # 0x114238
callq 0x35a70
movl $0x0, -0x4(%rbp)
jmp 0x293c6
jmp 0x28f80
cmpl $0x0, 0xeaf2d(%rip)     # 0x113eb4
je 0x28f9b
cmpl $0x0, 0xeaee8(%rip)     # 0x113e78
jle 0x28f9b
cmpl $-0x1, 0xeaf17(%rip)    # 0x113eb0
je 0x28fa8
cmpl $-0x1, 0xeaeaa(%rip)    # 0x113e4c
jne 0x2904b
cmpq $0x0, 0xeaf98(%rip)     # 0x113f48
jne 0x2904b
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movl 0x20(%rax), %eax
andl $0x1, %eax
cmpl $0x0, %eax
jne 0x28fde
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq -0x43e8(%rip), %rcx     # 0x24bf0
cmpq %rcx, 0x8(%rax)
jne 0x2904b
movq -0x10(%rbp), %rdi
callq 0x62ac0
cmpl $0x0, 0xeae5e(%rip)     # 0x113e4c
jne 0x29002
movq -0x10(%rbp), %rdi
movq 0xeb205(%rip), %rsi     # 0x114200
callq 0x35a70
jmp 0x2903f
movq -0x10(%rbp), %rax
movq %rax, -0x50(%rbp)
callq 0x2c0c0
movq %rax, -0x58(%rbp)
movl 0xeae37(%rip), %edi     # 0x113e50
callq 0x1f630
movq -0x58(%rbp), %rdi
movq %rax, %rdx
leaq 0xb633c(%rip), %rsi     # 0xdf368
movb $0x0, %al
callq 0x2cad0
movq -0x50(%rbp), %rdi
movq %rax, %rsi
callq 0x35c00
movl $0x0, -0x4(%rbp)
jmp 0x293c6
cmpl $0x0, 0xeaede(%rip)     # 0x113f30
je 0x290a3
cmpl $0x0, 0xeaed9(%rip)     # 0x113f34
je 0x290a3
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movl 0x20(%rax), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x290a3
movl 0xeaec2(%rip), %eax     # 0x113f38
cmpl 0xeaeb4(%rip), %eax     # 0x113f30
jge 0x290a3
movq -0x10(%rbp), %rdi
callq 0x62ac0
movq -0x10(%rbp), %rdi
movq 0xeb196(%rip), %rsi     # 0x114228
callq 0x35a70
movl $0x0, -0x4(%rbp)
jmp 0x293c6
cmpq $0x0, 0xeae9d(%rip)     # 0x113f48
je 0x290f7
cmpl $0x0, 0xeaef0(%rip)     # 0x113fa4
je 0x290f7
movq -0x10(%rbp), %rax
movl 0x90(%rax), %eax
andl $0x2, %eax
cmpl $0x0, %eax
jne 0x290f7
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movl 0x20(%rax), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x290f7
movq -0x10(%rbp), %rdi
movq 0xeb12a(%rip), %rsi     # 0x114210
callq 0x35a70
movl $0x0, -0x4(%rbp)
jmp 0x293c6
movq -0x10(%rbp), %rax
movq 0x158(%rax), %rax
movq 0x28(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x158(%rcx), %rcx
addq 0x48(%rcx), %rax
cmpq $0x0, %rax
ja 0x2912d
movq -0x10(%rbp), %rax
movq 0x160(%rax), %rax
cmpq $0x0, 0x28(%rax)
jbe 0x2919d
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq 0x39134(%rip), %rcx     # 0x62270
cmpq %rcx, 0x8(%rax)
je 0x2919d
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq 0x3916f(%rip), %rcx     # 0x622c0
cmpq %rcx, 0x8(%rax)
je 0x2919d
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq 0x391ca(%rip), %rcx     # 0x62330
cmpq %rcx, 0x8(%rax)
je 0x2919d
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq 0x39205(%rip), %rcx     # 0x62380
cmpq %rcx, 0x8(%rax)
je 0x2919d
movq -0x10(%rbp), %rdi
leaq 0xb620a(%rip), %rsi     # 0xdf396
callq 0x35d40
movl $0x0, -0x4(%rbp)
jmp 0x293c6
cmpq $0x0, 0xeada3(%rip)     # 0x113f48
je 0x291f3
cmpl $0x5, 0xeadbe(%rip)     # 0x113f6c
je 0x291f3
cmpl $0x0, 0xeade9(%rip)     # 0x113fa0
jne 0x291f3
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movl 0x20(%rax), %eax
andl $0x400, %eax            # imm = 0x400
cmpl $0x0, %eax
jne 0x291f3
movq -0x10(%rbp), %rdi
callq 0x62ac0
movq -0x10(%rbp), %rdi
movq 0xeb026(%rip), %rsi     # 0x114208
callq 0x35a70
movl $0x0, -0x4(%rbp)
jmp 0x293c6
cmpl $0x0, 0xea9ee(%rip)     # 0x113be8
je 0x2922d
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movl 0x20(%rax), %eax
andl $0x200, %eax            # imm = 0x200
cmpl $0x0, %eax
jne 0x2922d
movq -0x10(%rbp), %rdi
movq 0xeafd4(%rip), %rsi     # 0x1141f0
callq 0x35a70
movl $0x0, -0x4(%rbp)
jmp 0x293c6
cmpl $0x0, 0xeaedc(%rip)     # 0x114110
je 0x29309
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq -0x46e9(%rip), %rcx     # 0x24b60
cmpq %rcx, 0x8(%rax)
je 0x29309
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq 0x16e0e(%rip), %rcx     # 0x40070
cmpq %rcx, 0x8(%rax)
je 0x29309
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq 0x146f5(%rip), %rcx     # 0x3d970
cmpq %rcx, 0x8(%rax)
jne 0x292a8
movq -0x10(%rbp), %rax
cmpl $0x2, 0x30(%rax)
jne 0x292a8
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movsbl (%rax), %edi
callq 0x1f8a0
cmpl $0x6e, %eax
je 0x29309
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq 0x4c1f9(%rip), %rcx     # 0x754b0
cmpq %rcx, 0x8(%rax)
jne 0x292e4
movq -0x10(%rbp), %rax
cmpl $0x2, 0x30(%rax)
jne 0x292e4
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movsbl (%rax), %edi
callq 0x1f8a0
cmpl $0x6b, %eax
je 0x29309
movq -0x10(%rbp), %rdi
callq 0x62ac0
movq -0x10(%rbp), %rdi
movq 0xeaf00(%rip), %rsi     # 0x1141f8
callq 0x35a70
movl $0x0, -0x4(%rbp)
jmp 0x293c6
movq -0x10(%rbp), %rax
movl 0x90(%rax), %eax
andl $0x8, %eax
cmpl $0x0, %eax
je 0x2938a
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq 0x398f6(%rip), %rcx     # 0x62c20
cmpq %rcx, 0x8(%rax)
je 0x2938a
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq 0x39821(%rip), %rcx     # 0x62b60
cmpq %rcx, 0x8(%rax)
je 0x2938a
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq 0x397ac(%rip), %rcx     # 0x62b00
cmpq %rcx, 0x8(%rax)
je 0x2938a
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
leaq 0x39e17(%rip), %rcx     # 0x63180
cmpq %rcx, 0x8(%rax)
je 0x2938a
movq -0x10(%rbp), %rdi
callq 0x62830
movq -0x10(%rbp), %rdi
movq 0xeae2d(%rip), %rsi     # 0x1141b0
callq 0x35a70
jmp 0x293bf
movq -0x10(%rbp), %rdi
movl $0x7, %esi
callq 0x288a0
movq 0xeab49(%rip), %rcx     # 0x113ee8
movq -0x10(%rbp), %rax
movq %rcx, 0x148(%rax)
movq 0xeac87(%rip), %rax     # 0x114038
cmpq $0x0, 0x28(%rax)
je 0x293bd
callq 0x4a610
jmp 0x293bf
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x60, %rsp
popq %rbp
retq
nop