// 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>* (&) [2])
inline expression_node_ptr synthesize_string_expression(const details::operator_type& opr, expression_node_ptr (&branch)[2])
         {
            if ((0 == branch[0]) || (0 == branch[1]))
            {
               details::free_all_nodes(*node_allocator_,branch);

               return error_node();
            }

            const bool b0_is_s   = details::is_string_node            (branch[0]);
            const bool b0_is_cs  = details::is_const_string_node      (branch[0]);
            const bool b0_is_sr  = details::is_string_range_node      (branch[0]);
            const bool b0_is_csr = details::is_const_string_range_node(branch[0]);

            const bool b1_is_s   = details::is_string_node            (branch[1]);
            const bool b1_is_cs  = details::is_const_string_node      (branch[1]);
            const bool b1_is_sr  = details::is_string_range_node      (branch[1]);
            const bool b1_is_csr = details::is_const_string_range_node(branch[1]);

            const bool b0_is_gen = details::is_string_assignment_node (branch[0]) ||
                                   details::is_genricstring_range_node(branch[0]) ||
                                   details::is_string_concat_node     (branch[0]) ||
                                   details::is_string_function_node   (branch[0]) ||
                                   details::is_string_condition_node  (branch[0]) ||
                                   details::is_string_ccondition_node (branch[0]) ||
                                   details::is_string_vararg_node     (branch[0]) ;

            const bool b1_is_gen = details::is_string_assignment_node (branch[1]) ||
                                   details::is_genricstring_range_node(branch[1]) ||
                                   details::is_string_concat_node     (branch[1]) ||
                                   details::is_string_function_node   (branch[1]) ||
                                   details::is_string_condition_node  (branch[1]) ||
                                   details::is_string_ccondition_node (branch[1]) ||
                                   details::is_string_vararg_node     (branch[1]) ;

            if (details::e_add == opr)
            {
               if (!b0_is_cs || !b1_is_cs)
               {
                  return synthesize_expression<string_concat_node_t,2>(opr,branch);
               }
            }

            if (b0_is_gen || b1_is_gen)
            {
               return synthesize_strogen_expression(opr,branch);
            }
            else if (b0_is_s)
            {
               if      (b1_is_s  ) return synthesize_sos_expression   (opr,branch);
               else if (b1_is_cs ) return synthesize_socs_expression  (opr,branch);
               else if (b1_is_sr ) return synthesize_sosr_expression  (opr,branch);
               else if (b1_is_csr) return synthesize_socsr_expression (opr,branch);
            }
            else if (b0_is_cs)
            {
               if      (b1_is_s  ) return synthesize_csos_expression  (opr,branch);
               else if (b1_is_cs ) return synthesize_csocs_expression (opr,branch);
               else if (b1_is_sr ) return synthesize_csosr_expression (opr,branch);
               else if (b1_is_csr) return synthesize_csocsr_expression(opr,branch);
            }
            else if (b0_is_sr)
            {
               if      (b1_is_s  ) return synthesize_sros_expression  (opr,branch);
               else if (b1_is_sr ) return synthesize_srosr_expression (opr,branch);
               else if (b1_is_cs ) return synthesize_srocs_expression (opr,branch);
               else if (b1_is_csr) return synthesize_srocsr_expression(opr,branch);
            }
            else if (b0_is_csr)
            {
               if      (b1_is_s  ) return synthesize_csros_expression  (opr,branch);
               else if (b1_is_sr ) return synthesize_csrosr_expression (opr,branch);
               else if (b1_is_cs ) return synthesize_csrocs_expression (opr,branch);
               else if (b1_is_csr) return synthesize_csrocsr_expression(opr,branch);
            }

            return error_node();
         }

// Assembly:
subq $0x48, %rsp
movq %rdi, 0x38(%rsp)
movq %rsi, 0x30(%rsp)
movq %rdx, 0x28(%rsp)
movq 0x38(%rsp), %rax
movq %rax, 0x10(%rsp)
movq 0x28(%rsp), %rcx
xorl %eax, %eax
cmpq (%rcx), %rax
je 0x3e1ac6
movq 0x28(%rsp), %rcx
xorl %eax, %eax
cmpq 0x8(%rcx), %rax
jne 0x3e1ae8
movq 0x10(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x28(%rsp), %rsi
callq 0x3ebbf0
callq 0x2821f0
movq %rax, 0x40(%rsp)
jmp 0x3e2017
movq 0x28(%rsp), %rax
movq (%rax), %rdi
callq 0x23c9a0
andb $0x1, %al
movb %al, 0x27(%rsp)
movq 0x28(%rsp), %rax
movq (%rax), %rdi
callq 0x438670
andb $0x1, %al
movb %al, 0x26(%rsp)
movq 0x28(%rsp), %rax
movq (%rax), %rdi
callq 0x3e9720
andb $0x1, %al
movb %al, 0x25(%rsp)
movq 0x28(%rsp), %rax
movq (%rax), %rdi
callq 0x4386b0
andb $0x1, %al
movb %al, 0x24(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x23c9a0
andb $0x1, %al
movb %al, 0x23(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x438670
andb $0x1, %al
movb %al, 0x22(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x3e9720
andb $0x1, %al
movb %al, 0x21(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x4386b0
andb $0x1, %al
movb %al, 0x20(%rsp)
movq 0x28(%rsp), %rax
movq (%rax), %rdi
callq 0x4386f0
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xf(%rsp)
jne 0x3e1c35
movq 0x28(%rsp), %rax
movq (%rax), %rdi
callq 0x438730
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xf(%rsp)
jne 0x3e1c35
movq 0x28(%rsp), %rax
movq (%rax), %rdi
callq 0x438770
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xf(%rsp)
jne 0x3e1c35
movq 0x28(%rsp), %rax
movq (%rax), %rdi
callq 0x4387b0
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xf(%rsp)
jne 0x3e1c35
movq 0x28(%rsp), %rax
movq (%rax), %rdi
callq 0x4387f0
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xf(%rsp)
jne 0x3e1c35
movq 0x28(%rsp), %rax
movq (%rax), %rdi
callq 0x438830
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xf(%rsp)
jne 0x3e1c35
movq 0x28(%rsp), %rax
movq (%rax), %rdi
callq 0x438870
movb %al, 0xf(%rsp)
movb 0xf(%rsp), %al
andb $0x1, %al
movb %al, 0x1f(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x4386f0
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xe(%rsp)
jne 0x3e1cf7
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x438730
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xe(%rsp)
jne 0x3e1cf7
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x438770
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xe(%rsp)
jne 0x3e1cf7
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x4387b0
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xe(%rsp)
jne 0x3e1cf7
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x4387f0
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xe(%rsp)
jne 0x3e1cf7
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x438830
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xe(%rsp)
jne 0x3e1cf7
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x438870
movb %al, 0xe(%rsp)
movb 0xe(%rsp), %al
andb $0x1, %al
movb %al, 0x1e(%rsp)
movq 0x30(%rsp), %rcx
movl $0x2, %eax
cmpl (%rcx), %eax
jne 0x3e1d3d
testb $0x1, 0x26(%rsp)
je 0x3e1d1d
testb $0x1, 0x22(%rsp)
jne 0x3e1d3b
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x4388b0
movq %rax, 0x40(%rsp)
jmp 0x3e2017
jmp 0x3e1d3d
testb $0x1, 0x1f(%rsp)
jne 0x3e1d4b
testb $0x1, 0x1e(%rsp)
je 0x3e1d69
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x438c10
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x27(%rsp)
je 0x3e1e13
testb $0x1, 0x23(%rsp)
je 0x3e1d99
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x438e20
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x22(%rsp)
je 0x3e1dbe
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x438e80
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x21(%rsp)
je 0x3e1de3
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x438fa0
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x20(%rsp)
je 0x3e1e08
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x4390f0
movq %rax, 0x40(%rsp)
jmp 0x3e2017
jmp 0x3e1e0a
jmp 0x3e1e0c
jmp 0x3e1e0e
jmp 0x3e200b
testb $0x1, 0x26(%rsp)
je 0x3e1ebd
testb $0x1, 0x23(%rsp)
je 0x3e1e43
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x439310
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x22(%rsp)
je 0x3e1e68
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x439410
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x21(%rsp)
je 0x3e1e8d
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x439860
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x20(%rsp)
je 0x3e1eb2
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x439a70
movq %rax, 0x40(%rsp)
jmp 0x3e2017
jmp 0x3e1eb4
jmp 0x3e1eb6
jmp 0x3e1eb8
jmp 0x3e2009
testb $0x1, 0x25(%rsp)
je 0x3e1f67
testb $0x1, 0x23(%rsp)
je 0x3e1eed
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x439d00
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x21(%rsp)
je 0x3e1f12
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x439e40
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x22(%rsp)
je 0x3e1f37
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x43a050
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x20(%rsp)
je 0x3e1f5c
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x43a270
movq %rax, 0x40(%rsp)
jmp 0x3e2017
jmp 0x3e1f5e
jmp 0x3e1f60
jmp 0x3e1f62
jmp 0x3e2007
testb $0x1, 0x24(%rsp)
je 0x3e2005
testb $0x1, 0x23(%rsp)
je 0x3e1f97
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x43a580
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x21(%rsp)
je 0x3e1fb9
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x43a780
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x22(%rsp)
je 0x3e1fdb
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x43aa80
movq %rax, 0x40(%rsp)
jmp 0x3e2017
testb $0x1, 0x20(%rsp)
je 0x3e1ffd
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x28(%rsp), %rdx
callq 0x43acf0
movq %rax, 0x40(%rsp)
jmp 0x3e2017
jmp 0x3e1fff
jmp 0x3e2001
jmp 0x3e2003
jmp 0x3e2005
jmp 0x3e2007
jmp 0x3e2009
jmp 0x3e200b
jmp 0x3e200d
callq 0x2821f0
movq %rax, 0x40(%rsp)
movq 0x40(%rsp), %rax
addq $0x48, %rsp
retq
nopw %cs:(%rax,%rax)
nopl (%rax,%rax)