// File: ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::parser<double>::expression_generator<double>::synthesize_string_expression(exprtk::details::operator_type const&, exprtk::details::expression_node<double>* (&) [3])
inline expression_node_ptr synthesize_string_expression(const details::operator_type& opr, expression_node_ptr (&branch)[3])
         {
            if (details::e_inrange != opr)
               return error_node();
            else if ((0 == branch[0]) || (0 == branch[1]) || (0 == branch[2]))
            {
               details::free_all_nodes(*node_allocator_,branch);

               return error_node();
            }
            else if (
                      details::is_const_string_node(branch[0]) &&
                      details::is_const_string_node(branch[1]) &&
                      details::is_const_string_node(branch[2])
                    )
            {
               const std::string s0 = static_cast<details::string_literal_node<Type>*>(branch[0])->str();
               const std::string s1 = static_cast<details::string_literal_node<Type>*>(branch[1])->str();
               const std::string s2 = static_cast<details::string_literal_node<Type>*>(branch[2])->str();

               const Type v = (((s0 <= s1) && (s1 <= s2)) ? Type(1) : Type(0));

               details::free_all_nodes(*node_allocator_,branch);

               return node_allocator_->allocate_c<details::literal_node<Type> >(v);
            }
            else if (
                      details::is_string_node(branch[0]) &&
                      details::is_string_node(branch[1]) &&
                      details::is_string_node(branch[2])
                    )
            {
               std::string& s0 = static_cast<details::stringvar_node<Type>*>(branch[0])->ref();
               std::string& s1 = static_cast<details::stringvar_node<Type>*>(branch[1])->ref();
               std::string& s2 = static_cast<details::stringvar_node<Type>*>(branch[2])->ref();

               typedef typename details::sosos_node<Type, std::string&, std::string&, std::string&, details::inrange_op<Type> > inrange_t;

               return node_allocator_->allocate_type<inrange_t, std::string&, std::string&, std::string&>(s0, s1, s2);
            }
            else if (
                      details::is_const_string_node(branch[0]) &&
                            details::is_string_node(branch[1]) &&
                      details::is_const_string_node(branch[2])
                    )
            {
               std::string  s0 = static_cast<details::string_literal_node<Type>*>(branch[0])->str();
               std::string& s1 = static_cast<details::stringvar_node<Type>*     >(branch[1])->ref();
               std::string  s2 = static_cast<details::string_literal_node<Type>*>(branch[2])->str();

               typedef typename details::sosos_node<Type, std::string, std::string&, std::string, details::inrange_op<Type> > inrange_t;

               details::free_node(*node_allocator_,branch[0]);
               details::free_node(*node_allocator_,branch[2]);

               return node_allocator_->allocate_type<inrange_t, std::string, std::string&, std::string>(s0, s1, s2);
            }
            else if (
                            details::is_string_node(branch[0]) &&
                      details::is_const_string_node(branch[1]) &&
                            details::is_string_node(branch[2])
                    )
            {
               std::string&  s0 = static_cast<details::stringvar_node<Type>*     >(branch[0])->ref();
               std::string   s1 = static_cast<details::string_literal_node<Type>*>(branch[1])->str();
               std::string&  s2 = static_cast<details::stringvar_node<Type>*     >(branch[2])->ref();

               typedef typename details::sosos_node<Type, std::string&, std::string, std::string&, details::inrange_op<Type> > inrange_t;

               details::free_node(*node_allocator_,branch[1]);

               return node_allocator_->allocate_type<inrange_t, std::string&, std::string, std::string&>(s0, s1, s2);
            }
            else if (
                      details::is_string_node(branch[0]) &&
                      details::is_string_node(branch[1]) &&
                      details::is_const_string_node(branch[2])
                    )
            {
               std::string& s0 = static_cast<details::stringvar_node<Type>*     >(branch[0])->ref();
               std::string& s1 = static_cast<details::stringvar_node<Type>*     >(branch[1])->ref();
               std::string  s2 = static_cast<details::string_literal_node<Type>*>(branch[2])->str();

               typedef typename details::sosos_node<Type, std::string&, std::string&, std::string, details::inrange_op<Type> > inrange_t;

               details::free_node(*node_allocator_,branch[2]);

               return node_allocator_->allocate_type<inrange_t, std::string&, std::string&, std::string>(s0, s1, s2);
            }
            else if (
                      details::is_const_string_node(branch[0]) &&
                      details::      is_string_node(branch[1]) &&
                      details::      is_string_node(branch[2])
                    )
            {
               std::string  s0 = static_cast<details::string_literal_node<Type>*>(branch[0])->str();
               std::string& s1 = static_cast<details::stringvar_node<Type>*     >(branch[1])->ref();
               std::string& s2 = static_cast<details::stringvar_node<Type>*     >(branch[2])->ref();

               typedef typename details::sosos_node<Type, std::string, std::string&, std::string&, details::inrange_op<Type> > inrange_t;

               details::free_node(*node_allocator_,branch[0]);

               return node_allocator_->allocate_type<inrange_t, std::string, std::string&, std::string&>(s0, s1, s2);
            }
            else
               return error_node();
         }

// Assembly:
subq $0x2b8, %rsp            # imm = 0x2B8
movq %rdi, 0x2a8(%rsp)
movq %rsi, 0x2a0(%rsp)
movq %rdx, 0x298(%rsp)
movq 0x2a8(%rsp), %rax
movq %rax, 0x88(%rsp)
movq 0x2a0(%rsp), %rcx
movl $0x44, %eax
cmpl (%rcx), %eax
je 0x4dbb82
callq 0x2821f0
movq %rax, 0x2b0(%rsp)
jmp 0x4dc55c
movq 0x298(%rsp), %rcx
xorl %eax, %eax
cmpq (%rcx), %rax
je 0x4dbbb1
movq 0x298(%rsp), %rcx
xorl %eax, %eax
cmpq 0x8(%rcx), %rax
je 0x4dbbb1
movq 0x298(%rsp), %rcx
xorl %eax, %eax
cmpq 0x10(%rcx), %rax
jne 0x4dbbdc
movq 0x88(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x298(%rsp), %rsi
callq 0x4db8d0
callq 0x2821f0
movq %rax, 0x2b0(%rsp)
jmp 0x4dc55c
movq 0x298(%rsp), %rax
movq (%rax), %rdi
callq 0x438670
testb $0x1, %al
jne 0x4dbbf5
jmp 0x4dbdd7
movq 0x298(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x438670
testb $0x1, %al
jne 0x4dbc0f
jmp 0x4dbdd7
movq 0x298(%rsp), %rax
movq 0x10(%rax), %rdi
callq 0x438670
testb $0x1, %al
jne 0x4dbc29
jmp 0x4dbdd7
movq 0x298(%rsp), %rax
movq (%rax), %rsi
leaq 0x278(%rsp), %rdi
callq 0x4420a0
movq 0x298(%rsp), %rax
movq 0x8(%rax), %rsi
leaq 0x258(%rsp), %rdi
callq 0x4420a0
jmp 0x4dbc5c
movq 0x298(%rsp), %rax
movq 0x10(%rax), %rsi
leaq 0x228(%rsp), %rdi
callq 0x4420a0
jmp 0x4dbc77
leaq 0x278(%rsp), %rdi
leaq 0x258(%rsp), %rsi
callq 0x43d2a0
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, 0x87(%rsp)
jne 0x4dbc9e
jmp 0x4dbcba
leaq 0x258(%rsp), %rdi
leaq 0x228(%rsp), %rsi
callq 0x43d2a0
movb %al, 0x87(%rsp)
movb 0x87(%rsp), %al
testb $0x1, %al
movsd 0xbf375(%rip), %xmm0    # 0x59b040
xorps %xmm1, %xmm1
movsd %xmm1, 0x70(%rsp)
movsd %xmm0, 0x78(%rsp)
jne 0x4dbce8
movsd 0x70(%rsp), %xmm0
movsd %xmm0, 0x78(%rsp)
movq 0x88(%rsp), %rax
movsd 0x78(%rsp), %xmm0
movsd %xmm0, 0x220(%rsp)
movq 0x8(%rax), %rdi
movq 0x298(%rsp), %rsi
callq 0x4db8d0
jmp 0x4dbd12
movq 0x88(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x220(%rsp), %rsi
callq 0x287b60
movq %rax, 0x68(%rsp)
jmp 0x4dbd32
movq 0x68(%rsp), %rax
movq %rax, 0x2b0(%rsp)
leaq 0x228(%rsp), %rdi
callq 0x11b838
leaq 0x258(%rsp), %rdi
callq 0x11b838
leaq 0x278(%rsp), %rdi
callq 0x11b838
jmp 0x4dc55c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
jmp 0x4dbdc5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
jmp 0x4dbdb8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
leaq 0x228(%rsp), %rdi
callq 0x11b838
leaq 0x258(%rsp), %rdi
callq 0x11b838
leaq 0x278(%rsp), %rdi
callq 0x11b838
jmp 0x4dc56c
movq 0x298(%rsp), %rax
movq (%rax), %rdi
callq 0x23c9a0
testb $0x1, %al
jne 0x4dbdf0
jmp 0x4dbea7
movq 0x298(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x23c9a0
testb $0x1, %al
jne 0x4dbe0a
jmp 0x4dbea7
movq 0x298(%rsp), %rax
movq 0x10(%rax), %rdi
callq 0x23c9a0
testb $0x1, %al
jne 0x4dbe24
jmp 0x4dbea7
movq 0x298(%rsp), %rax
movq (%rax), %rdi
callq 0x3eed20
movq %rax, 0x218(%rsp)
movq 0x298(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x3eed20
movq %rax, 0x210(%rsp)
movq 0x298(%rsp), %rax
movq 0x10(%rax), %rdi
callq 0x3eed20
movq %rax, %rcx
movq 0x88(%rsp), %rax
movq %rcx, 0x208(%rsp)
movq 0x8(%rax), %rdi
movq 0x218(%rsp), %rsi
movq 0x210(%rsp), %rdx
movq 0x208(%rsp), %rcx
callq 0x4dc8e0
movq %rax, 0x2b0(%rsp)
jmp 0x4dc55c
movq 0x298(%rsp), %rax
movq (%rax), %rdi
callq 0x438670
testb $0x1, %al
jne 0x4dbec0
jmp 0x4dc0c1
movq 0x298(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x23c9a0
testb $0x1, %al
jne 0x4dbeda
jmp 0x4dc0c1
movq 0x298(%rsp), %rax
movq 0x10(%rax), %rdi
callq 0x438670
testb $0x1, %al
jne 0x4dbef4
jmp 0x4dc0c1
movq 0x298(%rsp), %rax
movq (%rax), %rsi
leaq 0x1e8(%rsp), %rdi
callq 0x4420a0
movq 0x298(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x3eed20
movq %rax, 0x1e0(%rsp)
movq 0x298(%rsp), %rax
movq 0x10(%rax), %rsi
leaq 0x1c0(%rsp), %rdi
callq 0x4420a0
jmp 0x4dbf40
movq 0x88(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x298(%rsp), %rsi
callq 0x284bd0
jmp 0x4dbf5b
movq 0x88(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x298(%rsp), %rsi
addq $0x10, %rsi
callq 0x284bd0
jmp 0x4dbf7a
movq 0x88(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x60(%rsp)
leaq 0x1a0(%rsp), %rdi
leaq 0x1e8(%rsp), %rsi
callq 0x11b140
jmp 0x4dbfa2
movq 0x1e0(%rsp), %rax
movq %rax, 0x58(%rsp)
leaq 0x180(%rsp), %rdi
leaq 0x1c0(%rsp), %rsi
callq 0x11b140
jmp 0x4dbfc6
movq 0x58(%rsp), %rdx
movq 0x60(%rsp), %rdi
leaq 0x1a0(%rsp), %rsi
leaq 0x180(%rsp), %rcx
callq 0x4dc980
movq %rax, 0x50(%rsp)
jmp 0x4dbfec
movq 0x50(%rsp), %rax
movq %rax, 0x2b0(%rsp)
leaq 0x180(%rsp), %rdi
callq 0x11b838
leaq 0x1a0(%rsp), %rdi
callq 0x11b838
leaq 0x1c0(%rsp), %rdi
callq 0x11b838
leaq 0x1e8(%rsp), %rdi
callq 0x11b838
jmp 0x4dc55c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
jmp 0x4dc0af
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
jmp 0x4dc0a2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
jmp 0x4dc095
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
leaq 0x180(%rsp), %rdi
callq 0x11b838
leaq 0x1a0(%rsp), %rdi
callq 0x11b838
leaq 0x1c0(%rsp), %rdi
callq 0x11b838
leaq 0x1e8(%rsp), %rdi
callq 0x11b838
jmp 0x4dc56c
movq 0x298(%rsp), %rax
movq (%rax), %rdi
callq 0x23c9a0
testb $0x1, %al
jne 0x4dc0da
jmp 0x4dc24a
movq 0x298(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x438670
testb $0x1, %al
jne 0x4dc0f4
jmp 0x4dc24a
movq 0x298(%rsp), %rax
movq 0x10(%rax), %rdi
callq 0x23c9a0
testb $0x1, %al
jne 0x4dc10e
jmp 0x4dc24a
movq 0x298(%rsp), %rax
movq (%rax), %rdi
callq 0x3eed20
movq %rax, 0x178(%rsp)
movq 0x298(%rsp), %rax
movq 0x8(%rax), %rsi
leaq 0x158(%rsp), %rdi
callq 0x4420a0
movq 0x298(%rsp), %rax
movq 0x10(%rax), %rdi
callq 0x3eed20
movq %rax, %rcx
movq 0x88(%rsp), %rax
movq %rcx, 0x150(%rsp)
movq 0x8(%rax), %rdi
movq 0x298(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
jmp 0x4dc17a
movq 0x88(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x40(%rsp)
movq 0x178(%rsp), %rax
movq %rax, 0x48(%rsp)
leaq 0x130(%rsp), %rdi
leaq 0x158(%rsp), %rsi
callq 0x11b140
jmp 0x4dc1af
movq 0x48(%rsp), %rsi
movq 0x40(%rsp), %rdi
movq 0x150(%rsp), %rcx
leaq 0x130(%rsp), %rdx
callq 0x4dcad0
movq %rax, 0x38(%rsp)
jmp 0x4dc1d5
movq 0x38(%rsp), %rax
movq %rax, 0x2b0(%rsp)
leaq 0x130(%rsp), %rdi
callq 0x11b838
leaq 0x158(%rsp), %rdi
callq 0x11b838
jmp 0x4dc55c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
jmp 0x4dc238
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
leaq 0x130(%rsp), %rdi
callq 0x11b838
leaq 0x158(%rsp), %rdi
callq 0x11b838
jmp 0x4dc56c
movq 0x298(%rsp), %rax
movq (%rax), %rdi
callq 0x23c9a0
testb $0x1, %al
jne 0x4dc263
jmp 0x4dc3da
movq 0x298(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x23c9a0
testb $0x1, %al
jne 0x4dc27d
jmp 0x4dc3da
movq 0x298(%rsp), %rax
movq 0x10(%rax), %rdi
callq 0x438670
testb $0x1, %al
jne 0x4dc297
jmp 0x4dc3da
movq 0x298(%rsp), %rax
movq (%rax), %rdi
callq 0x3eed20
movq %rax, 0x128(%rsp)
movq 0x298(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x3eed20
movq %rax, 0x120(%rsp)
movq 0x298(%rsp), %rax
movq 0x10(%rax), %rsi
leaq 0x100(%rsp), %rdi
callq 0x4420a0
movq 0x88(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x298(%rsp), %rsi
addq $0x10, %rsi
callq 0x284bd0
jmp 0x4dc300
movq 0x88(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x128(%rsp), %rax
movq %rax, 0x28(%rsp)
movq 0x120(%rsp), %rax
movq %rax, 0x30(%rsp)
leaq 0xe0(%rsp), %rdi
leaq 0x100(%rsp), %rsi
callq 0x11b140
jmp 0x4dc342
movq 0x30(%rsp), %rdx
movq 0x28(%rsp), %rsi
movq 0x20(%rsp), %rdi
leaq 0xe0(%rsp), %rcx
callq 0x4dcbc0
movq %rax, 0x18(%rsp)
jmp 0x4dc365
movq 0x18(%rsp), %rax
movq %rax, 0x2b0(%rsp)
leaq 0xe0(%rsp), %rdi
callq 0x11b838
leaq 0x100(%rsp), %rdi
callq 0x11b838
jmp 0x4dc55c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
jmp 0x4dc3c8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
leaq 0xe0(%rsp), %rdi
callq 0x11b838
leaq 0x100(%rsp), %rdi
callq 0x11b838
jmp 0x4dc56c
movq 0x298(%rsp), %rax
movq (%rax), %rdi
callq 0x438670
testb $0x1, %al
jne 0x4dc3f3
jmp 0x4dc54f
movq 0x298(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x23c9a0
testb $0x1, %al
jne 0x4dc40d
jmp 0x4dc54f
movq 0x298(%rsp), %rax
movq 0x10(%rax), %rdi
callq 0x23c9a0
testb $0x1, %al
jne 0x4dc427
jmp 0x4dc54f
movq 0x298(%rsp), %rax
movq (%rax), %rsi
leaq 0xc0(%rsp), %rdi
callq 0x4420a0
movq 0x298(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x3eed20
movq %rax, 0xb8(%rsp)
movq 0x298(%rsp), %rax
movq 0x10(%rax), %rdi
callq 0x3eed20
movq %rax, %rcx
movq 0x88(%rsp), %rax
movq %rcx, 0xb0(%rsp)
movq 0x8(%rax), %rdi
movq 0x298(%rsp), %rsi
callq 0x284bd0
jmp 0x4dc48f
movq 0x88(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
leaq 0x90(%rsp), %rdi
leaq 0xc0(%rsp), %rsi
callq 0x11b140
jmp 0x4dc4b7
movq 0x10(%rsp), %rdi
movq 0xb8(%rsp), %rdx
movq 0xb0(%rsp), %rcx
leaq 0x90(%rsp), %rsi
callq 0x4dccc0
movq %rax, 0x8(%rsp)
jmp 0x4dc4e0
movq 0x8(%rsp), %rax
movq %rax, 0x2b0(%rsp)
leaq 0x90(%rsp), %rdi
callq 0x11b838
leaq 0xc0(%rsp), %rdi
callq 0x11b838
jmp 0x4dc55c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
jmp 0x4dc540
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x250(%rsp)
movl %eax, 0x24c(%rsp)
leaq 0x90(%rsp), %rdi
callq 0x11b838
leaq 0xc0(%rsp), %rdi
callq 0x11b838
jmp 0x4dc56c
callq 0x2821f0
movq %rax, 0x2b0(%rsp)
movq 0x2b0(%rsp), %rax
addq $0x2b8, %rsp            # imm = 0x2B8
retq
movq 0x250(%rsp), %rdi
callq 0x11b4e0
nopl (%rax)