// File: /workspace/github_cpp_makefile_star2_O2/bonetblai[P]mdp-engine/ctp3/../engine/utils.h
// Function: Utils::tokenize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::multimap<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>>&, char)
inline void tokenize(const std::string &parameter_str, std::multimap<std::string, std::string> &parameters, char separator = ',') {
    for( size_t i = 0; i < parameter_str.size(); ++i ) {
        size_t first = i;
        int nesting_level = 0;
        while( i < parameter_str.size() ) {
            if( (parameter_str[i] == separator) && (nesting_level == 0) ) {
                break;
            } else if( parameter_str[i] == ')' ) {
                assert(nesting_level > 0);
                --nesting_level;
            } else if( parameter_str[i] == '(' ) {
                ++nesting_level;
            }
            ++i;
        }
        assert(nesting_level == 0);
        std::string par = parameter_str.substr(first, i - first);
        //std::cout << "parameter=|" << par << "|" << std::endl;
        size_t equal = par.find_first_of("=");
        assert(equal != std::string::npos);
        std::string key = par.substr(0, equal);
        std::string value = par.substr(equal + 1);
        //std::cout << "key=|" << key << "|, value=|" << value << "|" << std::endl;
        parameters.insert(std::make_pair(key, value));
    }
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xa8, %rsp
movl %edx, %ebx
movq %rsi, (%rsp)
movq %rdi, %r13
xorl %edx, %edx
leaq 0x48(%rsp), %r12
pushq $-0x1
popq %r9
movq 0x8(%r13), %r14
cmpq %r14, %rdx
jae 0x6d5a
movq (%r13), %rcx
xorl %eax, %eax
movq %rdx, %rsi
cmpq %rsi, %r14
je 0x6ca0
movb (%rcx,%rsi), %dil
cmpb %bl, %dil
jne 0x6c7b
testl %eax, %eax
je 0x6ca9
cmpb $0x29, %dil
jne 0x6c8d
movl %r9d, %r8d
testl %eax, %eax
jg 0x6c98
jmp 0x6d6c
xorl %r8d, %r8d
cmpb $0x28, %dil
sete %r8b
addl %r8d, %eax
incq %rsi
jmp 0x6c69
testl %eax, %eax
je 0x6cac
jmp 0x6da2
movq %rsi, %r14
movq %r14, %rcx
subq %rdx, %rcx
movq %r12, %rdi
movq %r13, %rsi
callq 0x52c0
movq %r12, %rdi
leaq 0x19537(%rip), %rsi     # 0x201fe
xorl %edx, %edx
callq 0x5140
cmpq $-0x1, %rax
je 0x6d89
movq %rax, %rbp
leaq 0x8(%rsp), %rdi
movq %r12, %rsi
xorl %edx, %edx
movq %rax, %rcx
callq 0x52c0
movq %r12, %rsi
incq %rbp
leaq 0x28(%rsp), %r12
movq %r12, %rdi
movq %rsi, %r15
movq %rbp, %rdx
pushq $-0x1
popq %rcx
callq 0x52c0
leaq 0x68(%rsp), %rbp
movq %rbp, %rdi
leaq 0x8(%rsp), %rsi
movq %r12, %rdx
callq 0xb8f4
movq (%rsp), %rdi
movq %rbp, %rsi
callq 0xb726
movq %rbp, %rdi
callq 0xb710
movq %r12, %rdi
callq 0x5120
leaq 0x8(%rsp), %rdi
callq 0x5120
movq %r15, %r12
movq %r15, %rdi
callq 0x5120
incq %r14
movq %r14, %rdx
jmp 0x6c4f
addq $0xa8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x19943(%rip), %rdi     # 0x206b6
leaq 0x1994e(%rip), %rsi     # 0x206c8
leaq 0x19959(%rip), %rcx     # 0x206da
pushq $0x62
popq %rdx
callq 0x51b0
leaq 0x199b8(%rip), %rdi     # 0x20748
leaq 0x19931(%rip), %rsi     # 0x206c8
leaq 0x1993c(%rip), %rcx     # 0x206da
pushq $0x6d
jmp 0x6d83
leaq 0x1998c(%rip), %rdi     # 0x20735
leaq 0x19918(%rip), %rsi     # 0x206c8
leaq 0x19923(%rip), %rcx     # 0x206da
pushq $0x69
jmp 0x6d83
movq %rax, %rbx
leaq 0x68(%rsp), %rdi
callq 0xb710
jmp 0x6dcd
movq %rax, %rbx
leaq 0x28(%rsp), %rdi
callq 0x5120
jmp 0x6ddc
movq %rax, %rbx
leaq 0x8(%rsp), %rdi
callq 0x5120
jmp 0x6deb
movq %rax, %rbx
leaq 0x48(%rsp), %rdi
callq 0x5120
movq %rbx, %rdi
callq 0x5410
nop