From c3876da74fc1911cba9235856ca171cd6971ee8f Mon Sep 17 00:00:00 2001 From: Jur van den Berg Date: Wed, 29 May 2019 16:24:44 +0200 Subject: [PATCH] Port arthur mandelbread --- files/advanced/mandelbread.ijvm | Bin 0 -> 1526 bytes files/advanced/mandelbread.jas | 902 +++++++++++++++++++++ files/bonus/bfi.ijvm | Bin 706 -> 1208 bytes files/bonus/bfi.jas | 1193 +++++++++++++++++----------- files/bonus/brainfuck/mandelbrot.b | 200 +++++ tests/advanced7.rs | 66 ++ 6 files changed, 1886 insertions(+), 475 deletions(-) create mode 100644 files/advanced/mandelbread.ijvm create mode 100644 files/advanced/mandelbread.jas create mode 100644 files/bonus/brainfuck/mandelbrot.b create mode 100644 tests/advanced7.rs diff --git a/files/advanced/mandelbread.ijvm b/files/advanced/mandelbread.ijvm new file mode 100644 index 0000000000000000000000000000000000000000..5309b8cbc19429a113d22ff3a0cd4ca6681eb14a GIT binary patch literal 1526 zcmb7DJ8M)?5T0{iyIEs$%-xB3s99f8lNjGOF}{K#K~zLULa=a^i(n@bM4K4F#?~&T zh+uJ>D_U(Q1WP*`8}U(DSos6IIes%YE4D5>^Ue8Y&Y78W&usnq?KK&a-*1QqsX{s- z4ag#774nNTNZbLW9b#cOAk&aV$SMS(l?kw$d+aUKL#zTe?4`?emAxgJw-nmNOKNy7zQmr^-boU zVd0@|T|BXAVec09L17z(yVlwvz3FMnp80VvFz2b`DN=)M`bZh;7efIT! z5431X(@O<`+%Ue4k~p5DW=#8$9#xI8_jhXX5we=1#;wEk#B;RfR@;6 z(Fv5{+bS-84p;-u0y}}%fnC6BKnuJI>;YZ@)`6FSy}*mWKHvr50B{Dl1$f?07kB}3 z$zTG^(EEkRL`i!=fJK>(K23)ibv4v2Ql`+xGlzB7~^8>fl(J@7zXZg zIFD&}F2t^q*ac#z5L6kzdO&C!n_y@j3q#xJE@Qh9+oiD^OJXC4P9-+9Lu;j{22Y22 zswGhcQBfiSF)DWv!idEP$`B06v_|+?N4Ak$t4j~d9*Hx`S92REPrCGAOSr+y*7=sm zu?2a7V+(j_GCor>>Stus|C#O(kK!0!os?0-bB^?V%8+B^G4YxE@^?<&uTN~|-f (everything except IN, NOP, WIDE or bonusses) +// - A relatively fast IJVM (runs for about 2-8 sec on good implementation) +// +// ;; +// ;i1;t1@ +// ;i1fi; +// ;ti1f@@ti;; +// ;if@@@@@@@@L +// ;;i@@@@@@@@@i; +// 1;;0i;;;iii1tG@@@@@G1ii;i; ;; +// ;@G@G@1t@@@@@@@@@@@@@@@G@fi;L1i1i; +// ;;i@@@@@@@@@@@@@@@@@@@@@@@@@f@@@@11 +// ;C1tL@@@@@@@@@@@@@@@@@@@@@@@@@@@@f; +// ; ;;f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;; +// ;t;; ;1;; ;;;1L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@; +// ;1tCf1i1fG1fi;;;;i@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@i +// ;;10@@8@@@@@@G111t@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@11 +// ;;f1f@@@@@@@@@@@@Gf8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1; +// ;@iii10@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@fi +// ;;i1L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f; +// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@fi; +// ;;i1L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f; +// ;@iii10@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@fi +// ;;f1f@@@@@@@@@@@@Gf8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1; +// ;;10@@8@@@@@@G111t@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@11 +// ;1tCf1i1fG1fi;;;;i@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@i +// ;t;; ;1;; ;;;1L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@; +// ; ;;f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;; +// ;C1tL@@@@@@@@@@@@@@@@@@@@@@@@@@@@f; +// ;;i@@@@@@@@@@@@@@@@@@@@@@@@@f@@@@11 +// ;@G@G@1t@@@@@@@@@@@@@@@G@fi;L1i1i; +// 1;;0i;;;iii1tG@@@@@G1ii;i; ;; +// ;;i@@@@@@@@@i; +// ;if@@@@@@@@L +// ;ti1f@@ti;; +// ;i1fi; +// ;i1;t1@ +// ;; +// + +.constant + B00000002 0x00000002 + B00000008 0x00000008 + B0000000C 0x0000000c + B00000020 0x00000020 + B00000080 0x00000080 + B000000C0 0x000000c0 + B000000F0 0x000000f0 + B00000100 0x00000100 + B00000200 0x00000200 + B00000400 0x00000400 + B00000800 0x00000800 + B00000C00 0x00000c00 + B00001000 0x00001000 + B00002000 0x00002000 + B00004000 0x00004000 + B00008000 0x00008000 + B0000C000 0x0000c000 + B0000F000 0x0000f000 + B0000FF00 0x0000ff00 + B00010000 0x00010000 + B00020000 0x00020000 + B00040000 0x00040000 + B00080000 0x00080000 + B000C0000 0x000c0000 + B00100000 0x00100000 + B00200000 0x00200000 + B00400000 0x00400000 + B00800000 0x00800000 + B00C00000 0x00c00000 + B00F00000 0x00f00000 + B01000000 0x01000000 + B02000000 0x02000000 + B04000000 0x04000000 + B08000000 0x08000000 + B0C000000 0x0c000000 + B10000000 0x10000000 + B20000000 0x20000000 + B40000000 0x40000000 + B80000000 0x80000000 + BC0000000 0xc0000000 + BF0000000 0xf0000000 + BFF000000 0xff000000 + BFFFF0000 0xffff0000 + BITMASK_INVSIGN 0x7fffffff + BITMASK_SIGNBIT 0x80000000 + INV_FFF 0xfffff000 + MAX_ITERATIONS 30 + MULTIPLIER 256 + MULTIPLIERDIV2 128 + W_HEIGHT 40 + W_WIDTH 100 + X_MAX 128 + X_MIN -512 + Y_MAX 320 + Y_MIN -320 + _OBJREF 0xdeadc001 +.end-constant + +.main + LDC_W _OBJREF + INVOKEVIRTUAL _main + IFEQ success +error: + ERR +success: + HALT +.end-main + +.method _main() +.var + x_range + y_range + x + y + px + py +.end-var + + BIPUSH 0 + ISTORE px + BIPUSH 0 + ISTORE py + + LDC_W X_MAX + LDC_W X_MIN + ISUB + ISTORE x_range + LDC_W Y_MAX + LDC_W Y_MIN + ISUB + ISTORE y_range + GOTO loop_y + +loop_y_update: + IINC py 1 + ILOAD py + LDC_W W_HEIGHT + IF_ICMPEQ loop_y_done + +loop_y: + // calculate value of y for pixel py + LDC_W Y_MIN + LDC_W _OBJREF + LDC_W _OBJREF + ILOAD y_range + ILOAD py + INVOKEVIRTUAL mul + LDC_W W_HEIGHT + INVOKEVIRTUAL div + IADD + ISTORE y + GOTO loop_x + +loop_x_update: + IINC px 1 + ILOAD px + LDC_W W_WIDTH + IF_ICMPEQ loop_x_done + +loop_x: + // x = x_min + x_range * px / width + LDC_W X_MIN + LDC_W _OBJREF + LDC_W _OBJREF + ILOAD x_range + ILOAD px + INVOKEVIRTUAL mul + LDC_W W_WIDTH + INVOKEVIRTUAL div + IADD + ISTORE x + + LDC_W _OBJREF + ILOAD x + ILOAD y + INVOKEVIRTUAL mandelbrot_print + POP + GOTO loop_x_update + +loop_x_done: + BIPUSH 0 + ISTORE px + BIPUSH 10 + OUT + GOTO loop_y_update + +loop_y_done: + BIPUSH 0 + IRETURN +.end-method + +.method div(a, b) +.var + signed + res + k + bshift +.end-var + // store the signed state + BIPUSH 0 + ISTORE signed + + // get absolute of a and b +ha: + ILOAD a + IFLT negate_a +hb: + ILOAD b + IFLT negate_b +handled: + + BIPUSH 0 + ISTORE res + + // edge case if a < b, we're done + ILOAD a + ILOAD b + ISUB + IFLT apply_sign + + // edge case if b == 0, we error + ILOAD b + IFEQ division_by_zero + + BIPUSH 1 + ISTORE k + ILOAD b + ISTORE bshift + + // build a stack of kn, kn * b, kn-1, kn-1 * b, ..., k0 (1), k0 * b (b) +build_stack: + ILOAD a + ILOAD bshift + ISUB + IFLT stack_unwind + + // push bshift to stack and bshift += bshift + ILOAD bshift + DUP + DUP + IADD + ISTORE bshift + + // push k to stack and k += k + ILOAD k + DUP + DUP + IADD + ISTORE k + GOTO build_stack + +stack_unwind: + ISTORE k // stores k from (k * b) in size + + // a - (k * b) + ILOAD a + SWAP + ISUB + + // duplicate a - (k * b) on stack + DUP + + // if (a - (k * b) < 0) cant_substract + IFLT cant_substract + +substract: + // store a = a - k * b + ISTORE a + + // calculate res + ILOAD res + ILOAD k + IADD + ISTORE res + + ILOAD k + BIPUSH 1 + IF_ICMPEQ apply_sign + GOTO stack_unwind + +cant_substract: + // pop a - (k * b) from the stack + POP + + ILOAD k + BIPUSH 1 + IF_ICMPEQ apply_sign + GOTO stack_unwind + +apply_sign: + ILOAD signed + IFEQ ret_res + BIPUSH 0 + ILOAD res + ISUB + IRETURN +ret_res: + ILOAD res + IRETURN + +negate_a: + BIPUSH 0 + ILOAD a + ISUB + ISTORE a + IINC signed 1 + GOTO hb +negate_b: + BIPUSH 0 + ILOAD b + ISUB + ISTORE b + IINC signed 1 + GOTO handled + +division_by_zero: + BIPUSH 100 + OUT + BIPUSH 105 + OUT + BIPUSH 118 + OUT + BIPUSH 32 + OUT + BIPUSH 98 + OUT + BIPUSH 121 + OUT + BIPUSH 32 + OUT + BIPUSH 48 + OUT + BIPUSH 10 + OUT + ERR +.end-method + +.method divby2pow(x, y) +.var + s + b + r + top_bit +.end-var + + ILOAD x + IFLT set_sign + BIPUSH 1 + ISTORE s +calculation: + BIPUSH 1 + ISTORE b + BIPUSH 0 + ISTORE r + LDC_W _OBJREF + ILOAD x + INVOKEVIRTUAL msb + ISTORE top_bit + + GOTO loop_body + +loop_update: + ILOAD y + DUP + IADD + ISTORE y + ILOAD b + DUP + IADD + ISTORE b +loop_body: + ILOAD x + ILOAD y + IAND + IFEQ second_if + ILOAD r + ILOAD b + IOR + ISTORE r +second_if: + ILOAD y + ILOAD top_bit + ISUB + IFLT loop_update + +handle_sign: + ILOAD s + IFEQ ret_neg_r + ILOAD r + IRETURN + +ret_neg_r: + BIPUSH 0 + ILOAD r + ISUB + IRETURN + +set_sign: + BIPUSH 0 + ISTORE s + BIPUSH 0 + ILOAD x + ISUB + ISTORE x + GOTO calculation +.end-method + +.method mandelbrot(real0, imag0) +.var + real + imag + realq + imagq + n +.end-var + + BIPUSH 0 + ISTORE n + ILOAD real0 + ISTORE real + ILOAD imag0 + ISTORE imag + GOTO for_loop + +for_update: + IINC n 1 + ILOAD n + LDC_W MAX_ITERATIONS + IF_ICMPEQ for_done + +for_loop: + LDC_W _OBJREF + LDC_W _OBJREF + ILOAD real + ILOAD real + INVOKEVIRTUAL mul + LDC_W MULTIPLIER + INVOKEVIRTUAL divby2pow + ISTORE realq + LDC_W _OBJREF + LDC_W _OBJREF + ILOAD imag + ILOAD imag + INVOKEVIRTUAL mul + LDC_W MULTIPLIER + INVOKEVIRTUAL divby2pow + ISTORE imagq + + ILOAD realq + ILOAD imagq + IADD + LDC_W INV_FFF + IAND + IFEQ if_not_part + GOTO premature_exit + +if_not_part: + ILOAD imag0 + LDC_W _OBJREF + LDC_W _OBJREF + ILOAD real + ILOAD imag + INVOKEVIRTUAL mul + LDC_W MULTIPLIERDIV2 + INVOKEVIRTUAL divby2pow + IADD + ISTORE imag + + ILOAD realq + ILOAD imagq + ISUB + ILOAD real0 + IADD + ISTORE real + GOTO for_update + +for_done: + LDC_W MAX_ITERATIONS + IRETURN + +premature_exit: + ILOAD n + IRETURN +.end-method + +.method mandelbrot_print(x, y) +.var + value +.end-var + + LDC_W _OBJREF + ILOAD x + ILOAD y + INVOKEVIRTUAL mandelbrot + ISTORE value + + // Palet " `':tfLCG08@" + ILOAD value + BIPUSH 8 + ISUB + IFLT print_space + ILOAD value + BIPUSH 10 + ISUB + IFLT print_backtick + ILOAD value + BIPUSH 12 + ISUB + IFLT print_quote + ILOAD value + BIPUSH 14 + ISUB + IFLT print_colon + ILOAD value + BIPUSH 16 + ISUB + IFLT print_t + ILOAD value + BIPUSH 18 + ISUB + IFLT print_f + ILOAD value + BIPUSH 20 + ISUB + IFLT print_L + ILOAD value + BIPUSH 22 + ISUB + IFLT print_C + ILOAD value + BIPUSH 24 + ISUB + IFLT print_G + ILOAD value + BIPUSH 26 + ISUB + IFLT print_0 + ILOAD value + BIPUSH 28 + ISUB + IFLT print_8 +print_at: + BIPUSH 64 + OUT + BIPUSH 0 + IRETURN +print_space: + BIPUSH 32 + OUT + BIPUSH 0 + IRETURN +print_backtick: + BIPUSH 96 + OUT + BIPUSH 0 + IRETURN +print_quote: + BIPUSH 39 + OUT + BIPUSH 0 + IRETURN +print_colon: + BIPUSH 58 + OUT + BIPUSH 0 + IRETURN +print_t: + BIPUSH 116 + OUT + BIPUSH 0 + IRETURN +print_f: + BIPUSH 102 + OUT + BIPUSH 0 + IRETURN +print_L: + BIPUSH 76 + OUT + BIPUSH 0 + IRETURN +print_C: + BIPUSH 67 + OUT + BIPUSH 0 + IRETURN +print_G: + BIPUSH 71 + OUT + BIPUSH 0 + IRETURN +print_0: + BIPUSH 48 + OUT + BIPUSH 0 + IRETURN +print_8: + BIPUSH 56 + OUT + BIPUSH 0 + IRETURN + +.end-method + +.method msb(x) +lbffffffff: ILOAD x + LDC_W BFFFF0000 + IAND + IFEQ lb0000ffff +lbffff0000: ILOAD x + LDC_W BFF000000 + IAND + IFEQ lb00ff0000 +lbff000000: ILOAD x + LDC_W BF0000000 + IAND + IFEQ lb0f000000 +lbf0000000: ILOAD x + LDC_W BC0000000 + IAND + IFEQ lb30000000 +lbc0000000: ILOAD x + LDC_W B80000000 + IAND + IFEQ lb40000000 +lb80000000: LDC_W B80000000 + IRETURN +lb40000000: LDC_W B40000000 + IRETURN +lb30000000: ILOAD x + LDC_W B20000000 + IAND + IFEQ lb10000000 +lb20000000: LDC_W B20000000 + IRETURN +lb10000000: LDC_W B10000000 + IRETURN +lb0f000000: ILOAD x + LDC_W B0C000000 + IAND + IFEQ lb03000000 +lb0c000000: ILOAD x + LDC_W B08000000 + IAND + IFEQ lb04000000 +lb08000000: LDC_W B08000000 + IRETURN +lb04000000: LDC_W B04000000 + IRETURN +lb03000000: ILOAD x + LDC_W B02000000 + IAND + IFEQ lb01000000 +lb02000000: LDC_W B02000000 + IRETURN +lb01000000: LDC_W B01000000 + IRETURN +lb00ff0000: ILOAD x + LDC_W B00F00000 + IAND + IFEQ lb000f0000 +lb00f00000: ILOAD x + LDC_W B00C00000 + IAND + IFEQ lb00300000 +lb00c00000: ILOAD x + LDC_W B00800000 + IAND + IFEQ lb00400000 +lb00800000: LDC_W B00800000 + IRETURN +lb00400000: LDC_W B00400000 + IRETURN +lb00300000: ILOAD x + LDC_W B00200000 + IAND + IFEQ lb00100000 +lb00200000: LDC_W B00200000 + IRETURN +lb00100000: LDC_W B00100000 + IRETURN +lb000f0000: ILOAD x + LDC_W B000C0000 + IAND + IFEQ lb00030000 +lb000c0000: ILOAD x + LDC_W B00080000 + IAND + IFEQ lb00040000 +lb00080000: LDC_W B00080000 + IRETURN +lb00040000: LDC_W B00040000 + IRETURN +lb00030000: ILOAD x + LDC_W B00020000 + IAND + IFEQ lb00010000 +lb00020000: LDC_W B00020000 + IRETURN +lb00010000: LDC_W B00010000 + IRETURN +lb0000ffff: ILOAD x + LDC_W B0000FF00 + IAND + IFEQ lb000000ff +lb0000ff00: ILOAD x + LDC_W B0000F000 + IAND + IFEQ lb00000f00 +lb0000f000: ILOAD x + LDC_W B0000C000 + IAND + IFEQ lb00003000 +lb0000c000: ILOAD x + LDC_W B00008000 + IAND + IFEQ lb00004000 +lb00008000: LDC_W B00008000 + IRETURN +lb00004000: LDC_W B00004000 + IRETURN +lb00003000: ILOAD x + LDC_W B00002000 + IAND + IFEQ lb00001000 +lb00002000: LDC_W B00002000 + IRETURN +lb00001000: LDC_W B00001000 + IRETURN +lb00000f00: ILOAD x + LDC_W B00000C00 + IAND + IFEQ lb00000300 +lb00000c00: ILOAD x + LDC_W B00000800 + IAND + IFEQ lb00000400 +lb00000800: LDC_W B00000800 + IRETURN +lb00000400: LDC_W B00000400 + IRETURN +lb00000300: ILOAD x + LDC_W B00000200 + IAND + IFEQ lb00000100 +lb00000200: LDC_W B00000200 + IRETURN +lb00000100: LDC_W B00000100 + IRETURN +lb000000ff: ILOAD x + LDC_W B000000F0 + IAND + IFEQ lb0000000f +lb000000f0: ILOAD x + LDC_W B000000C0 + IAND + IFEQ lb00000030 +lb000000c0: ILOAD x + LDC_W B00000080 + IAND + IFEQ lb00000040 +lb00000080: LDC_W B00000080 + IRETURN +lb00000040: BIPUSH 64 + IRETURN +lb00000030: ILOAD x + LDC_W B00000020 + IAND + IFEQ lb00000010 +lb00000020: BIPUSH 32 + IRETURN +lb00000010: BIPUSH 16 + IRETURN +lb0000000f: ILOAD x + LDC_W B0000000C + IAND + IFEQ lb00000003 +lb0000000c: ILOAD x + LDC_W B00000008 + IAND + IFEQ lb00000004 +lb00000008: BIPUSH 8 + IRETURN +lb00000004: BIPUSH 4 + IRETURN +lb00000003: ILOAD x + LDC_W B00000002 + IAND + IFEQ lb00000001 +lb00000002: BIPUSH 2 + IRETURN +lb00000001: ILOAD x + IFEQ lb00000000 + BIPUSH 1 + IRETURN +lb00000000: BIPUSH 0 + IRETURN +.end-method + +.method mul(a, b) +.var + signed + res + pow2 + sum +.end-var + + // store the signed state + ILOAD a + LDC_W BITMASK_SIGNBIT + IAND + ILOAD b + LDC_W BITMASK_SIGNBIT + IAND + IADD + ISTORE signed + + // get absolute of a and b +hsa: ILOAD a + IFLT negate_a +hsb: ILOAD b + IFLT negate_b + +for_init: + BIPUSH 0 + ISTORE res // result + BIPUSH 1 + ISTORE pow2 // 2^n + ILOAD b + ISTORE sum // b * 2^n + +for_loop: + // if (a < (1 << n)) -> done + ILOAD a + ILOAD pow2 + ISUB + IFLT apply_sign + + // if (a & (1 << n) == 0) continue + ILOAD a + ILOAD pow2 + IAND + IFEQ for_update + + // res += b * 2^n + ILOAD res + ILOAD sum + IADD + ISTORE res + +for_update: + ILOAD pow2 + DUP + IADD + ISTORE pow2 + ILOAD sum + DUP + IADD + ISTORE sum + GOTO for_loop + +negate_a: + BIPUSH 0 + ILOAD a + ISUB + ISTORE a + GOTO hsb +negate_b: + BIPUSH 0 + ILOAD b + ISUB + ISTORE b + GOTO for_init + +apply_sign: + // res possibly overflowed, apply positive filter + ILOAD res + LDC_W BITMASK_INVSIGN + IAND + ILOAD signed + IFEQ ret_res + BIPUSH 0 + SWAP + ISUB + IRETURN + +ret_res: + IRETURN +.end-method + diff --git a/files/bonus/bfi.ijvm b/files/bonus/bfi.ijvm index 93df4d752e8797d4fcf3907adbb51fd424b8b42a..3efaedf194044201fd010c8af3e801d08abe921d 100644 GIT binary patch literal 1208 zcma)6ziSjh6n^t#H+vV8jIOT=!Du65l0sn$krY<35fnv261b4F^tZNFTUw^sq?mG3 zTm+jdMG*gh-1QM`1QF}_V{iOs_9PY}F8B7EH}Adq-h4ZAbDux#lc4ad5Y2cZ6CJ!# zSOQZp2@6>o_Tq5=Z5U6&77@CIlr7jx*e9f9n8%~nb87c#vLrq7D3;MZVMWAg8+;Zl z`!sdeP!AazGdZ>TWMa~Is0~^5(@K`+iW4=*UVu;9dA>6)u^G_OZ9wAa5+HSS-(0WFgW7D>=3#A~#NWN>KC8`qoP1Q9c0J-2w;dS(`qV`W zM0dhgDu07@UHKKPryNbQE@?XUVKMYa%}#Lo&Ntcf&8-RN;`gnIr>vw?QMz!oa4;)e zlc*dn61KWJ)@#+G^;s5Hv5Zm_iQohpK@`<9!a|_c4wQxlVt|(#7Fq<^aPhu|7?xAR z%D=;(gJglTfn0Tfi;9oKa%g1u5<`|fBn0vC8Dt?n%Ux_f1OUos1TbrkG5;``5Hp)W8Ur?OS~ZF z#2ex*u}AC>--t{05i(cuu7OJ|QfIjJ4h(aP%w^nqmr5e${Q@tqTp`5*M^ac!JRVs< ziWTlJ;)N8FbO{@7Lfl9$8TC6?t)qOOwY7bo+)p6JXM}~JXGHHm?<|NMT2Eymi%vQ z+q+DCa@fSflFV8M-*D6r|46n(j#3pwO_UZ%?}{e6%EI(+!dOa=rh$}FY`T))U8-&Du?6I*v`|*saDK>w_}KI##BQ&&srMqD&iKlxgF8h(Gj-b!)*3XN@@=ZVd6{ zz@iw>pY9}uO5&a5n38go91W7|z+x?#x~{vL53?TYuPpNMIG2(=Xp#FzSBALDg!w=5 gxT_4ERx;tcZV#Oo*wT3I@^EwARWaQB Compile code into bytecode +// > Run said bytecode :) +// > Profit ? +// .constant - OBJREF 0xdead - - STACK_SIZE 0x100 // support for 160 levels of nested [] - MEMORY_SIZE 0x1000 // size of the bfi's memory (needs to be a power of 2) - INIT_TEXT_SIZE 0x4 // initial size of the bfi program buffer - INIT_INPUT_SIZE 0x4 // initial size of the bfi input buffer - - // configurable to conform with indecisive bf community - EOF 0 - CELL_MIN 0 // adjustable to not upset the brainfuck community - CELL_MAX 255 // (they're not entirely sure whether signed/unsigned word/quadword) - - // delimiter for seperating bf program and bf input - DELIMITER 0x3a // : - - // characters used in brainfuck - ASCII_PLUS 0x2b // + - ASCII_MINUS 0x2d // - - ASCII_LT 0x3c // < - ASCII_GT 0x3e // > - ASCII_BO 0x5b // [ - ASCII_BC 0x5d // ] - ASCII_DOT 0x2e // . - ASCII_COMMA 0x2c // , + BF_MEM_MASK 0x0fff + BF_MEM_SIZE 0x1000 + BYTECODE_ADD 0 + BYTECODE_CLR 6 + BYTECODE_IN 5 + BYTECODE_JNZ 3 + BYTECODE_JZ 2 + BYTECODE_MEM 1 + BYTECODE_OUT 4 + INITIAL_CAPACITY 126 + _OBJREF 0xdeadc001 .end-constant .main -.var - text // the bf program buffer - textcap // capacity of the program buffer - textsize // size of of the program buffer - input // the bf program's input - inputcap // capacity of the input - inputsize // size of of the input - char // read in char -.end-var - - // first setting up the variables - BIPUSH 0x0 // textsize = 0 - ISTORE textsize - LDC_W INIT_TEXT_SIZE // textcap = INIT_TEXT_SIZE - ISTORE textcap - LDC_W INIT_TEXT_SIZE // text = new array[INIT_TEXT_SIZE] - NEWARRAY - ISTORE text - BIPUSH 0x0 // inputsize = 0 - ISTORE inputsize - LDC_W INIT_INPUT_SIZE // inputcap = INIT_TEXT_SIZE - ISTORE inputcap - LDC_W INIT_INPUT_SIZE // input = new array[INIT_INPUT_SIZE] - NEWARRAY - ISTORE input - -slurp_program_loop: - // if (textsize == text capacity) -> realloc text - ILOAD textsize - ILOAD textcap - ISUB - IFEQ text_grow - - // char = IN; - IN - ISTORE char - - // if (char == 0) -> we're done reading - ILOAD char - IFEQ done - - // if (char == DELIMETER) -> read input - ILOAD char - LDC_W DELIMITER - IF_ICMPEQ slurp_input_loop - - // if (!checkBF(char)) goto next char, aka eliminating unnecessary chars - LDC_W OBJREF - ILOAD char - INVOKEVIRTUAL checkBF - IFEQ slurp_program_loop - - // text[textsize++] = char - ILOAD char - ILOAD textsize - IINC textsize 0x1 - ILOAD text - IASTORE - GOTO slurp_program_loop - -slurp_input_loop: - // if (input size == input capacity) -> realloc input - ILOAD inputsize - ILOAD inputcap - ISUB - IFEQ input_grow - - // char = IN; if (char == 0) -> we're done reading - IN - DUP - ISTORE char - IFEQ done - - // input[inputsize++] = char - ILOAD char - ILOAD inputsize - IINC inputsize 0x1 - ILOAD input - IASTORE - GOTO slurp_input_loop - -text_grow: - // text = realloc(text, textcap, (textcap *= 2)) - LDC_W OBJREF - ILOAD text - ILOAD textcap - DUP - DUP - IADD - DUP - ISTORE textcap - INVOKEVIRTUAL realloc - ISTORE text - GOTO slurp_program_loop - -input_grow: - // input = realloc(input, inputcap, (inputcap *= 2)) - LDC_W OBJREF - ILOAD input - ILOAD inputcap - DUP - DUP - IADD - DUP - ISTORE inputcap - INVOKEVIRTUAL realloc - ISTORE input - GOTO slurp_input_loop - -done: - LDC_W OBJREF - ILOAD text - ILOAD textsize - ILOAD input - ILOAD inputsize - INVOKEVIRTUAL exec - POP - HALT + LDC_W _OBJREF + INVOKEVIRTUAL _main + IFEQ success +error: + ERR +success: + HALT .end-main -// checkBF whether a char is a brainfuck symbol or not -// @param symbol -// @return 0 if not bf 1 if bf -.method checkBF(symbol) - ILOAD symbol - LDC_W ASCII_PLUS - IF_ICMPEQ ret1 - - ILOAD symbol - LDC_W ASCII_MINUS - IF_ICMPEQ ret1 - - ILOAD symbol - LDC_W ASCII_LT - IF_ICMPEQ ret1 - - ILOAD symbol - LDC_W ASCII_GT - IF_ICMPEQ ret1 - - ILOAD symbol - LDC_W ASCII_BO - IF_ICMPEQ ret1 - - ILOAD symbol - LDC_W ASCII_BC - IF_ICMPEQ ret1 - - ILOAD symbol - LDC_W ASCII_DOT - IF_ICMPEQ ret1 - - ILOAD symbol - LDC_W ASCII_COMMA - IF_ICMPEQ ret1 - - BIPUSH 0 - IRETURN -ret1: - BIPUSH 1 - IRETURN -.end-method - - -// realloc, 'reallocating' a buffer -// @param buffer, original buffer -// @param curSize, size to be copied -// @param newSize, size that it should become -// -// @return new buffer of newSize, with the contents of the last buffer -.method realloc(buffer, curSize, newSize) +.method _main() .var - newBuffer - i + txt + input .end-var - ILOAD newSize - NEWARRAY - ISTORE newBuffer + // compile brainfuck at stdin to bytecode + LDC_W _OBJREF + INVOKEVIRTUAL bytecode_compile + ISTORE txt - BIPUSH 0 - ISTORE i -loop: - ILOAD i - ILOAD curSize - IF_ICMPEQ end + // get input + LDC_W _OBJREF + INVOKEVIRTUAL get_input + ISTORE input - ILOAD i - ILOAD buffer - IALOAD - ILOAD i - ILOAD newBuffer - IASTORE + LDC_W _OBJREF + ILOAD txt + ILOAD input + INVOKEVIRTUAL bytecode_execute + POP - IINC i 0x1 - GOTO loop - -end: - ILOAD newBuffer - IRETURN + BIPUSH 0 + IRETURN .end-method -// exec, runs a brainfuck program -// @param text, program text (not containing anything but raw bf) -// @param textsize, program size -// @param input, the stdin of the program -// @param size of input -// @return garbage -.method exec(text, textsize, input, inputsize) +.method bytecode_compile() .var - pc // keeps track of where we are in the bf program - memory // the memory array - memptr // points to offset in the memory array - stack // keeps track of where to return bcs of [] - stackptr // pointer to last one - instr // holds current instruction - inputptr // points to what input symbol we're at - tmp // used as temporary value in seeking operation + txt + char + tmp + quotes_stack .end-var - BIPUSH 0 // pc = 0 - ISTORE pc - BIPUSH 0 // inputptr = 0 - ISTORE inputptr - BIPUSH 0 // memptr = 0 - ISTORE memptr - LDC_W MEMORY_SIZE // memory = NEWARRAY(MEMORY_SIZE) - NEWARRAY - ISTORE memory - BIPUSH -1 // stackptr = -1 - ISTORE stackptr - LDC_W STACK_SIZE // stack = NEWARRAY(STACK_SIZE) - NEWARRAY - ISTORE stack + LDC_W _OBJREF + LDC_W INITIAL_CAPACITY + INVOKEVIRTUAL list_new + ISTORE txt + LDC_W _OBJREF + LDC_W INITIAL_CAPACITY + INVOKEVIRTUAL list_new + ISTORE quotes_stack + BIPUSH 0 + ISTORE tmp -// since the memory technically doesn't have to be initialised to 0, I put this in for safety -init_mem_loop: - LDC_W MEMORY_SIZE - ILOAD memptr - IF_ICMPEQ done_init_mem +pl: + IN + ISTORE char +l: + ILOAD char + BIPUSH 58 + IF_ICMPEQ ret + ILOAD char + IFEQ ret - BIPUSH 0 - ILOAD memptr - ILOAD memory - IASTORE + ILOAD char + BIPUSH 43 + ISUB + IFLT pl + ILOAD char + BIPUSH 43 + IF_ICMPEQ plus_compile + ILOAD char + BIPUSH 45 + IF_ICMPEQ hyphen_compile + ILOAD char + BIPUSH 60 + IF_ICMPEQ lt_compile + ILOAD char + BIPUSH 62 + IF_ICMPEQ gt_compile + ILOAD char + BIPUSH 91 + IF_ICMPEQ bq_open_compile + ILOAD char + BIPUSH 93 + IF_ICMPEQ bq_close_compile + ILOAD char + BIPUSH 46 + IF_ICMPEQ period_compile + ILOAD char + BIPUSH 44 + IF_ICMPEQ comma_compile + GOTO pl - IINC memptr 1 - GOTO init_mem_loop +next_add_char: + IN + ISTORE char + ILOAD char + BIPUSH 43 + IF_ICMPEQ plus_compile + ILOAD char + BIPUSH 45 + IF_ICMPEQ hyphen_compile + ILOAD char + BIPUSH 60 + IF_ICMPEQ add_compile + ILOAD char + BIPUSH 62 + IF_ICMPEQ add_compile + ILOAD char + BIPUSH 91 + IF_ICMPEQ add_compile + ILOAD char + BIPUSH 93 + IF_ICMPEQ add_compile + ILOAD char + BIPUSH 46 + IF_ICMPEQ add_compile + ILOAD char + BIPUSH 44 + IF_ICMPEQ add_compile + GOTO next_add_char -done_init_mem: - BIPUSH 0 - ISTORE memptr +add_compile: + ILOAD tmp + IFEQ l + + // write ADD x to txt + LDC_W _OBJREF + ILOAD txt + LDC_W BYTECODE_ADD + INVOKEVIRTUAL list_append + ISTORE txt + LDC_W _OBJREF + ILOAD txt + ILOAD tmp + INVOKEVIRTUAL list_append + ISTORE txt + BIPUSH 0 + ISTORE tmp + GOTO l + +plus_compile: + IINC tmp 1 + GOTO next_add_char + +hyphen_compile: + IINC tmp -1 + GOTO next_add_char + +next_mem_char: + IN + ISTORE char + ILOAD char + BIPUSH 60 + IF_ICMPEQ lt_compile + ILOAD char + BIPUSH 62 + IF_ICMPEQ gt_compile + ILOAD char + BIPUSH 43 + IF_ICMPEQ mem_compile + ILOAD char + BIPUSH 45 + IF_ICMPEQ mem_compile + ILOAD char + BIPUSH 91 + IF_ICMPEQ mem_compile + ILOAD char + BIPUSH 93 + IF_ICMPEQ mem_compile + ILOAD char + BIPUSH 46 + IF_ICMPEQ mem_compile + ILOAD char + BIPUSH 44 + IF_ICMPEQ mem_compile + GOTO next_mem_char + +mem_compile: + ILOAD tmp + IFEQ l + + // write MEM x to txt + LDC_W _OBJREF + ILOAD txt + LDC_W BYTECODE_MEM + INVOKEVIRTUAL list_append + ISTORE txt + LDC_W _OBJREF + ILOAD txt + ILOAD tmp + INVOKEVIRTUAL list_append + ISTORE txt + BIPUSH 0 + ISTORE tmp + GOTO l + +lt_compile: + IINC tmp -1 + GOTO next_mem_char + +gt_compile: + IINC tmp 1 + GOTO next_mem_char + +bq_open_compile: + // quotes_stack.append(txt.ptr) + LDC_W _OBJREF + ILOAD quotes_stack + BIPUSH 1 +ILOAD txt +IALOAD + INVOKEVIRTUAL list_append + ISTORE quotes_stack + + // txt.append(JZ 0), 0 is later filled in + LDC_W _OBJREF + ILOAD txt + LDC_W BYTECODE_JZ + INVOKEVIRTUAL list_append + ISTORE txt + LDC_W _OBJREF + ILOAD txt + BIPUSH 0 + INVOKEVIRTUAL list_append + ISTORE txt + GOTO pl + +bq_close_compile: + LDC_W _OBJREF + ILOAD quotes_stack + INVOKEVIRTUAL list_pop + ISTORE tmp + + // check if we have the following situation: [+] or [-] + // lab_a: JZ lab_d + // lab_b: ADD -1 + // lab_c: JNZ lab_b + // + // In this case, txt.rsize - jz.pos == 4 and txt[jz.pos + 2] == ADD + BIPUSH 1 + ILOAD txt + IALOAD + ILOAD tmp + ISUB + BIPUSH 4 + IF_ICMPEQ possible_clear + +jnz_write: + // JNZ after [ + LDC_W _OBJREF + ILOAD txt + LDC_W BYTECODE_JNZ + INVOKEVIRTUAL list_append + ISTORE txt + LDC_W _OBJREF + ILOAD txt + ILOAD tmp +BIPUSH 2 +IADD + INVOKEVIRTUAL list_append + ISTORE txt + + // the JZ before needs to jump after the JNZ x instruction + BIPUSH 1 + ILOAD txt + IALOAD + ILOAD tmp + BIPUSH 1 + IADD + ILOAD txt + IASTORE + + BIPUSH 0 + ISTORE tmp + GOTO pl + +possible_clear: + // if txt[jz.pos + 2] == ADD (0) + ILOAD tmp + BIPUSH 2 + IADD + ILOAD txt + IALOAD + IFEQ emit_clear + GOTO jnz_write + +emit_clear: + // pop the add and jz + LDC_W _OBJREF + ILOAD txt + INVOKEVIRTUAL list_pop + LDC_W _OBJREF + ILOAD txt + INVOKEVIRTUAL list_pop + LDC_W _OBJREF + ILOAD txt + INVOKEVIRTUAL list_pop + LDC_W _OBJREF + ILOAD txt + INVOKEVIRTUAL list_pop + + // add clear opcode + LDC_W _OBJREF + ILOAD txt + LDC_W BYTECODE_CLR + INVOKEVIRTUAL list_append + ISTORE txt + + // reset tmp + BIPUSH 0 + ISTORE tmp + + // jump back + GOTO pl + +period_compile: + LDC_W _OBJREF + ILOAD txt + LDC_W BYTECODE_OUT + INVOKEVIRTUAL list_append + ISTORE txt + GOTO pl + +comma_compile: + LDC_W _OBJREF + ILOAD txt + LDC_W BYTECODE_IN + INVOKEVIRTUAL list_append + ISTORE txt + GOTO pl + +ret: + ILOAD txt + IRETURN +.end-method + +.method bytecode_execute(txt, input) +.var + mem + mem_val + mem_ptr + pc + last_pc + op + i_ptr + i_end +.end-var + // initialize brainfuck memory + LDC_W BF_MEM_SIZE + NEWARRAY + ISTORE mem + BIPUSH 0 + ISTORE mem_ptr + BIPUSH 0 + ISTORE mem_val + + // set program counter + BIPUSH 2 + ISTORE pc + BIPUSH 1 + ILOAD txt + IALOAD + BIPUSH -1 + IADD + ISTORE last_pc + + // set input counter and end of input + BIPUSH 2 + ISTORE i_ptr + BIPUSH 1 + ILOAD input + IALOAD + ISTORE i_end exec_loop: - // if we're at the end of the program, return - ILOAD pc - ILOAD textsize - IF_ICMPEQ done + // if last_pc < pc + ILOAD last_pc + ILOAD pc + ISUB + IFLT exec_done - // instr = text[pc++] - ILOAD pc - IINC pc 1 - ILOAD text - IALOAD - ISTORE instr + // read op + ILOAD pc + ILOAD txt + IALOAD + ISTORE op - ILOAD instr - LDC_W ASCII_PLUS - IF_ICMPEQ plus + // move pc past op + IINC pc 1 - ILOAD instr - LDC_W ASCII_MINUS - IF_ICMPEQ minus + // do a small binary tree lookup, 1 < op => JZ/JNZ/OUT/IN else ADD/MEM + BIPUSH 1 + ILOAD op + ISUB + IFLT exec_rest - ILOAD instr - LDC_W ASCII_DOT - IF_ICMPEQ dot + // if (op == 0) goto exec_add + ILOAD op + IFEQ exec_add - ILOAD instr - LDC_W ASCII_COMMA - IF_ICMPEQ comma +exec_mem: + // mem[mem_ptr] = mem_val + ILOAD mem_val + ILOAD mem_ptr + ILOAD mem + IASTORE - ILOAD instr - LDC_W ASCII_LT - IF_ICMPEQ lessthan + // mem_ptr += txt[pc] + ILOAD mem_ptr + ILOAD pc + ILOAD txt + IALOAD + IADD + ISTORE mem_ptr - ILOAD instr - LDC_W ASCII_GT - IF_ICMPEQ greaterthan + // apply memory mask (wrap around) + ILOAD mem_ptr + LDC_W BF_MEM_MASK + IAND + ISTORE mem_ptr - ILOAD instr - LDC_W ASCII_BO - IF_ICMPEQ blockopen + // retrieve mem_val + ILOAD mem_ptr + ILOAD mem + IALOAD + ISTORE mem_val - ILOAD instr - LDC_W ASCII_BC - IF_ICMPEQ blockclose - GOTO exec_loop + // pc is increased by 1 for MEM's argument + IINC pc 1 + GOTO exec_loop -plus: - ILOAD memptr - ILOAD memory - IALOAD +exec_add: + // mem_val += txt[pc] + ILOAD mem_val + ILOAD pc + ILOAD txt + IALOAD + IADD + ISTORE mem_val - DUP - LDC_W CELL_MAX - IF_ICMPEQ plus_overflow + // pc is increased by 1, for ADD's argument + IINC pc 1 + GOTO exec_loop - BIPUSH 1 - IADD +exec_rest: + ILOAD op + BIPUSH 4 + ISUB + IFLT exec_jumps + ILOAD op + BIPUSH 4 + IF_ICMPEQ exec_out + ILOAD op + BIPUSH 5 + IF_ICMPEQ exec_in + ILOAD op + BIPUSH 6 + IF_ICMPEQ exec_clr - ILOAD memptr - ILOAD memory - IASTORE + // Opcodes shouldnt get here + BIPUSH 73 + OUT + BIPUSH 110 + OUT + BIPUSH 99 + OUT + BIPUSH 111 + OUT + BIPUSH 114 + OUT + BIPUSH 114 + OUT + BIPUSH 101 + OUT + BIPUSH 99 + OUT + BIPUSH 116 + OUT + BIPUSH 32 + OUT + BIPUSH 111 + OUT + BIPUSH 112 + OUT + BIPUSH 10 + OUT + ERR - GOTO exec_loop +exec_in: + ILOAD i_ptr + ILOAD i_end + IF_ICMPEQ exec_in_eof + ILOAD i_ptr + ILOAD input + IALOAD + ISTORE mem_val + IINC i_ptr 1 + GOTO exec_loop -plus_overflow: - POP - LDC_W CELL_MIN +exec_in_eof: + BIPUSH 0 + ISTORE mem_val + GOTO exec_loop - ILOAD memptr - ILOAD memory - IASTORE - GOTO exec_loop +exec_out: + ILOAD mem_val + OUT + GOTO exec_loop -minus: - ILOAD memptr - ILOAD memory - IALOAD +exec_jumps: + ILOAD op + BIPUSH 3 + IF_ICMPEQ exec_jnz - DUP - LDC_W CELL_MIN - IF_ICMPEQ minus_underflow +exec_jz: + ILOAD mem_val + IFEQ exec_do_jump - BIPUSH -1 - IADD +exec_dont_jump: + IINC pc 1 + GOTO exec_loop - ILOAD memptr - ILOAD memory - IASTORE - GOTO exec_loop +exec_jnz: + ILOAD mem_val + IFEQ exec_dont_jump -minus_underflow: - POP +exec_do_jump: + // pc = txt[pc] + ILOAD pc + ILOAD txt + IALOAD + ISTORE pc + GOTO exec_loop - LDC_W CELL_MAX - ILOAD memptr - ILOAD memory - IASTORE +exec_clr: + BIPUSH 0 + ISTORE mem_val + GOTO exec_loop - GOTO exec_loop +exec_done: + BIPUSH 0 + IRETURN +.end-method -dot: - ILOAD memptr - ILOAD memory - IALOAD - OUT - GOTO exec_loop +.method get_input() +.var + input + char +.end-var -comma: - ILOAD inputptr - ILOAD inputsize - IF_ICMPEQ comma_noinput + LDC_W _OBJREF + LDC_W INITIAL_CAPACITY + INVOKEVIRTUAL list_new + ISTORE input - // memory[memptr] = input[inputptr++] - ILOAD inputptr - IINC inputptr 1 - ILOAD input - IALOAD +loop: + IN + ISTORE char + ILOAD char + IFEQ done - ILOAD memptr - ILOAD memory - IASTORE - - GOTO exec_loop - -comma_noinput: - LDC_W EOF - ILOAD memptr - ILOAD memory - IASTORE - GOTO exec_loop - -lessthan: - ILOAD memptr - BIPUSH -1 - IADD - LDC_W MEMORY_SIZE - BIPUSH -1 - IADD - IAND - ISTORE memptr - GOTO exec_loop - -greaterthan: - ILOAD memptr - BIPUSH 1 - IADD - LDC_W MEMORY_SIZE - BIPUSH -1 - IADD - IAND - ISTORE memptr - - GOTO exec_loop - -blockopen: - // let's first check if we should seek to after the closing ] - ILOAD memptr - ILOAD memory - IALOAD - IFEQ blockopen_seek - - // if not, we'll add pc to the return stack and continue normal execution - IINC stackptr 1 - - // push the address of the [ on stack, we'll jump back to blockopen - ILOAD pc // pc counter was already updated - BIPUSH -1 // so we need to subtract 1 - IADD - ILOAD stackptr - ILOAD stack - IASTORE - - // go back to normal execution loop - GOTO exec_loop - -blockopen_seek: - // we increase tmp when a [ is encountered and decrease if a ] is encountered - // when tmp reaches 0, we'll have reached the correct one - BIPUSH 1 - ISTORE tmp - -blockopen_seekloop: - // - ILOAD pc - IINC pc 1 - ILOAD program - IALOAD - ISTORE instr - - // if instr == '[' goto inc - ILOAD instr - LDC_W ASCII_BO - IF_ICMP blockopen_inc - - // if instr == ']' goto dec - ILOAD instr - LDC_W ASCII_BC - IF_ICMP blockopen_dec - - // if it was neither a [ or ], just go to next instruction - GOTO blockopen_seekloop - -blockopen_inc: - IINC tmp 1 - GOTO blockopen_seekloop - -blockopen_dec: - IINC tmp -1 - IFEQ exec_loop - GOTO blockopen_seekloop - -blockclose: - // we have to return to the last [ - ILOAD stackptr - ILOAD stack - IALOAD - ISTORE pc - GOTO exec_loop + LDC_W _OBJREF + ILOAD input + ILOAD char + INVOKEVIRTUAL list_append + ISTORE input + GOTO loop done: - LDC_W OBJREF - IRETURN + ILOAD input + IRETURN .end-method + +.method list_append(list_ref, value) +.var + list + i + size + capacity +.end-var + + BIPUSH 0 + ILOAD list_ref + IALOAD + DUP + ISTORE capacity + + BIPUSH 1 + ILOAD list_ref + IALOAD + DUP + ISTORE size + + IF_ICMPEQ realloc + ILOAD list_ref + ISTORE list +done: + // arr[size] = value + ILOAD value + ILOAD size + ILOAD list + IASTORE + + // size++ + IINC size 1 + + // arr.size = size + ILOAD size + BIPUSH 1 + ILOAD list + IASTORE + + ILOAD list + IRETURN + +realloc: + BIPUSH 1 + ISTORE i + ILOAD size + DUP + IADD + NEWARRAY + ISTORE list + +realloc_loop: + // list[i] = list_ref[i]; + ILOAD i + ILOAD list_ref + IALOAD + ILOAD i + ILOAD list + IASTORE + + // i++ + IINC i 1 + + // if (i < size) goto realloc_loop + ILOAD i + ILOAD size + ISUB + IFLT realloc_loop + +realloc_done: + // list[LIST_CAPACITY] = cap * 2 + ILOAD size + DUP + IADD + BIPUSH 0 + ILOAD list + IASTORE + GOTO done +.end-method + +.method list_new(capacity) +.var + list + capacity_real +.end-var + ILOAD capacity + BIPUSH 2 + IADD + ISTORE capacity_real + ILOAD capacity_real + NEWARRAY + ISTORE list + ILOAD capacity_real + BIPUSH 0 + ILOAD list + IASTORE + BIPUSH 2 + BIPUSH 1 + ILOAD list + IASTORE + + ILOAD list + IRETURN +.end-method + +.method list_pop(list_ref) +.var + size +.end-var + + BIPUSH 1 + ILOAD list_ref + IALOAD + ISTORE size + IINC size -1 + ILOAD size + IFLT error + + ILOAD size + BIPUSH 1 + ILOAD list_ref + IASTORE + ILOAD size + ILOAD list_ref + IALOAD + IRETURN + +error: + BIPUSH 91 + OUT + BIPUSH 33 + OUT + BIPUSH 93 + OUT + BIPUSH 32 + OUT + BIPUSH 66 + OUT + BIPUSH 111 + OUT + BIPUSH 117 + OUT + BIPUSH 110 + OUT + BIPUSH 100 + OUT + BIPUSH 115 + OUT + BIPUSH 32 + OUT + BIPUSH 101 + OUT + BIPUSH 114 + OUT + BIPUSH 114 + OUT + BIPUSH 111 + OUT + BIPUSH 114 + OUT + BIPUSH 10 + OUT + ERR +.end-method + diff --git a/files/bonus/brainfuck/mandelbrot.b b/files/bonus/brainfuck/mandelbrot.b new file mode 100644 index 0000000..6869d90 --- /dev/null +++ b/files/bonus/brainfuck/mandelbrot.b @@ -0,0 +1,200 @@ +@@@@@@+@@@@+@++@@@++@@@@@@@@+@@+@@@@@@@@@@@@@@+@@@@@+@@@@@@@@@+@@@@@+@@@@+@@@@@[-@@@@>@@@@@@@@@@+@@@@@@@@@@@@@@@+@@>>>@@@@@@+@@@+@@@@@@@@@@@@+@@@@+@@@@@@@@@@@@@+@@@@@@@@@@@@>@@@@@@@@@@@+@@@@@@@+@@>@@@@@+@@@@@@@@@@@@@@@@@<@@<@@@@@@@@@@<@@@@@@@@@<<@@@@@@@@@<@@]@@@@>@@@@@@@@@@@@@@@@@@@@@@@@>@@@>@@@@@@@@@>@@@@@@@>@@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@+@+@@+@+@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@-@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-@@>@@@@@@@@@@@@@@@@@@@@@>@@@@>@@@@@@@@@>@>@@@>@@@@@@ +@@@@@@@>@@@@@@@@@@@@@>@>@@@@@@@@@@@@@>@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@+@@@@@@@@+@@@@@@@@@@@@@@@+@+@@@@@@+@+@@@@@@@@@@@@@@+@@+@@@@@+@@@@@@@@@@@@@+@@@@@@@@@@@@@@@+@@@+@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@[@@@>@@@@@@>@>@>@@@>@>@@>@@@@@@@@@@@@@@@@>@@@>@@@@@@@@@@@@@@@@@@@]@@@@@@+@@@@@@@@[@@@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@<@@@@@<@@@@@@@@@<@@@<@@@@@@@@@@@@<@@@@@@@@]@@@@>@@@@@>@@@@@@@@@@@@>@@>@@@@@@>@@@@@@@@@@@@>@@@@@@>@@@@@@@@@@@@@@@@@@@@>@>@@@ +@@@@@-]@@@+@@@@@[@@@@@@>@>@@@@@@@@@@@@@@@>>@@@>@@@@@@>@@>@@@@@@@@@@>@[@@-@@@@@@@@@@@@@@@@@]@@@@@>@@@@@@@]@@@@@@@@@<@@@@@@@@@<@<@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@@@@@<@@@@@@@@@@@@<@@@@@<<@@[@@@@@<@@@@@@@@@@@@@@<@@<@@<@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@<@@@@@@@@@@@@<@<@@@@]@>@@@@@>@@@@@>@@@@@@>@>@@@@@@>@@>@@@@@>@[-@@@@@@@@@@]@@%@%%+@<@@<@@@@@@@@@@@@@@@@@@<@@@@@@@@<<@@@@@@<<@@@@@@@@@@@@@+@@@+@@@@@@@@@@@@@@@@@+++@@@[@@@@@-@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@->@@@@@@@>@@@>@@@@@@>@@@@>@@@@@@@@@@@>@@@@@@@@ +@@@@@@@@@@@@>>@@@@@@@@@@@@@@@@@@@@@@@>@+@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@<@@<@@@@@@@@@<@@@@@<@@@@@@@<@@<@@@<@@@@@@@@<@@@@@@@]>@>@@@@@@@@@@@@@@@@@@@@>@@@@@@>@@@@@>@@>@>@@>@@@@@@@>@@@]@>@@@@@@@@@>@@@@@@@@@@@@@@>>@@>@@>@@@@@@>@@@@+@@@@@>@>@@@@>>@@@@@>@@@>@@>@@@@@@@@@@>@@>@@@@@@@@@>@@@@@>@@@@>@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@%%%#%%@@@@@%%@@>@@@@@@@@@@@@>@@@@@@>>@>>@@@@@@@@@@@@>@@@@@>@@@@@@@>@@@@@@>@@@>@@>@@@@@@@@@@@@@>>@@+@@@@@@<<@@@@@@<@@@@@@@@@@<@@@@@@@@@@@@<@@@@@@@<@@@<@@@@@@@@@@@@@@@@<@@@<@@@ +@@@@@@@@@@@@@@@@@<@@@@@@@<@@<@@@@@@@@@@<@@@@@@<@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@[@@@@@@@@@@@@<@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@<@<@@@@@@@<@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@]@@@>@@>@@@@@@>@@@[@@@@@@@@@@@@@-@]@@@@@@@+@@@[@@>@>@@@>>@@@@@@@@@@@@@@@@@>@@@@>@@[@@@@@@>@@@@@>@@@@@@@@@@@%%>##%%%%#%>@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@>@@>@@@@@@@@[@@-@@]@>>@@@@@@]@@@@@@@@@@@@@@@@@@<@@@@<@@@@@@@@<<@@@@@@@@@@@@@@@@@@@@<@<<@<@@@@@@@@@@@<@[@@@@@@@<@@@@@@@@@@@ +@@@@<@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@@@@@@@<@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@]@@>@>@>@>@>@@@@@@@@@@>@@@>[@@@@@@@@@@@@-@@@@@@@]@@@@@@@@@@+@@<@<@@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@+@@@@@@+@@@@@@@@@@@@@+@@+@@@@[@@@@@@-@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@%%%%##-#%%%@@@@@@@@@@@@@@@>@@@@@@>@@@@@@@@@@>@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@>>+@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@@ +@@@<<@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@@@@@@<@@@<@@@@@@@@@@]@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@>@@>>@@@@@@@@@@@>@@@>>@@>@@@@@@@@@@@@@@@]@@@@@@@@@>@>@@@@@@@@@@@>@@@@@@@@@@@@@@@@>@>@@@@>@@@@+@@@@@@@@@@@@<<@@@<@@@@<@@@@@@@@@@@@@@@@@@<<@@+@@@@@@@@@@@@@@@@@@@@+@@@@@+@@@@@@@@@@@@+@@@@%%%%++*%%%%%+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@-@@@@@@[@@-@@@@@@>@>@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@>@@ +>@+<@@@@@@<@@<@@@@@@@@@<@@@@<@@@@@@@@<@@@@@@@@@@@@@@<@<@@@@@@@@@<@@@@@@@@@@@@@@@@@@]@@@@>@@@>@@@>@@@@@@@@@@@@@@@@@>>@@@@@@@@@@@@@@>@@>>>]@@@@@@@@@@@>@@>@@@@@@@@@>@@@@@@@>@@@>@@@@@@@@@@>+@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@<@@@@@<@<@@<@@@@@@<<@@@@<@@@@@@@@@<@@@@@@@@@<@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<<@@@@@@@@@@@@@@@@@<@@<@@@[@@@@@%%%%%*#%%<%%<@@@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@<@@@@@@@@@@@@<@@@@<@@@@@@@@@@@<@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@@@@@>@@@@@@[[@-@@@@@@@]@@@@@@@@@@@>@@ +@@@@>@@@@@@@@@>@@@@@>@@@@@@@@@@>@@@@@@@@>@@@@@@@@@@@@@@[@@>@@@@@@@@@@@@@@@@@@@@@@>@@@@@>@@@@@@@>@@>@@>>@@@@@@@@[@@@@@@@@@@@@@@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@<@@@<<@@<@@+@@@@@>@@@@@@@@@@@@>@@>@@@@@@@@@@@@@>@>@@@@@@@@@>@@@@@@@@@@]<@@@@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@<<@@@<[@-@@@@@>@@@>@@@@@@@@@@@@@@@@@@@@%%%##*>%%%#%%%@@@@@@@@@@>@@@>@@@@@@@@@@@@@@@@@@@@@@@>@+<@<+<@<@@@<@@@+@@@@@<@@]>@@@@@>@@@@@@@@@@@@@@@>>@@>@@@@@>@@@@@@@@@@>@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@] +@@<@@@@@@@@@@@@@@@<@<@<@@@@@@@@@@@@@@@@@<@@@@@@@@@<@@@@@@@@@@@<@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@[@@@@<@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@@@<<<@@@@@@@@@@@@<@@<@@<@@@@@@@@@@@]@@@@@>>@@@@@@@@@@>@@>@@@@@@@@>@@@>@@>@@@>>@@@@@@@@@[@>@@@@@@>@@@@@@>@@@@@>@@@@@@@@@>@>@@>@@@@@@>@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%#-***#%%%%<<@<@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@@+@@@@>@@@@@@@@@@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@>@@>@@@@@@>@@@@@@@@]@@@@@@<@@@@@@@@<@@@@@@<@ +@@@@@@@@@@@<@@@@@@@@@@@@<@@@<@@@@@@@@<@@@[@@->@@@@@@@@>@@@@@@@@@@@@@@@@@>@@>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@>@@@@@@@+@@@@@@@<@@@<@@@@@@@@@@@@@@+<@@@<@@@@@@@@@@@@@@@<@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@<@@@@@@@@@]@@@@@@@@@@@@@@@@>@@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@>@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@%>%%%#>%%*#]%%%%%<@@@@@@@@@@<%%#%@@@@@@@@@<@@@@@@@@@@@@@@@@@@@<@@@@<@@@@@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@[<@<@@@@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@ +@@@@@@@@@<@@@@@@@@@@@<<@@<@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@]>@@@>>@@@@@@>@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@@@[@@@@@@@@@-@@@@@@<@@@@@@@@@@@@<<@@@@<<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@+@@@@@@@@@@@@@@@>@@@@@@@>@@@@@@@@>@@@>@@@@@>@@@@@>@@@@@>@@@@@@@@@]@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<<@@@<@@@@@@<@@@@@@<@@@<@@@%%[#*-#*#**###%%%%>%>%%%%%%%%%#>%@@@>@@>@@@@@>@@@@@>@@@@+@@@@@@@@@@@@@@@@@@@@<@@@<+@@@@@@<@@<<@@@@@@@@@@<@@<@]@@@@@@>@@@@@@@@@@>@@@@@@@@@>@@@@@@>@@@>@@@@@@@@@@@@>@@@@@@@@ +@@@@@>@@>@@@>@@@@@@@@@@+@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@++@@@@@@+@@@@@@@@@+@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@+@@@@@@@@@++@@@@@+@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@+@@@@+[@@@@@[@@@@@@@@@@@@@@>@@>@@@@@@@@@@>@@@@@>@@>>@@@@@@@@@@@@@@@@@>@@>@@@@>@@@@]@@+@@>@@@@@@@[@@@@@-@@@@@@@@@@@@]@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@-%%%%%%%%%##`]>%%%%%%%%%%%[%%%%*#%%%@@@@@@@-@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@[@-@@@@@@@]@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@[@@@@@@@@@@@@@@@-@@]>@@@[@@@@-@@]@@@@@@@@@@@@>@@@[@@@@-@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@[@@@@@-@]@@@@>@@@@@@@@@@[@@@@@@@@-@@@@@@@]@@<@@@@@@@@@@@@@@<@@@@@@@<@@@@<@@@@@@@@@@@@@<@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@@@@@@[@@@<@@<@@@@@@@@@@@@@@@@@@@<@@@@@@@@@<@@@@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@@@@%%%%%%%%%%#***#%%%%%%%%#%%##<*<#<%%]@@@>@@@@@@@@>@@@@@@@@@@@@>@@>>@@>@@>@@@>@@@@@@@@@@@@>@@@@@@@@@@@-@@@@@@@@@@@@]@@@@@@@@@@@+[@@@>@@@+@@@@@@@>@@@@@@@@@@@>@>@@@@@@>@@@@@@ +@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@>@@@@@@]<@@<<@@<@<@@@@@@@@@@@@<@@@@<@@@@<@@@@@@@@@@<@@@@@@@@@@@@@@[<@@@@@@@<<@@@<@@@@@@@@@<<@@@@<@<@@@@@@@@@@@@@@@@@<@@@@@@@@@@]@>@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@>@@@@>@@@@@>@>@@@@@@@@>@>@@@@>@@@@@@@@@[@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@-@@@@@@@@@@>@@@@@>@@@@@@>@@@@>@@@@@@@@[@@@@@-%%%%%%%%%#*``*#%%%%<%#**<****%%%@@<@@@@<@@@@@@@+@@@@@@@@@@>@@@@@@@@@@@@@@@@>>@@@@@@>@@@@@@@]@@@@@@@@@@@@<@@@@<@@@@<<@@@@@@@@@@@@@@@@@@@@[->>@@>@@>@@@@@@@@@@@@@+@@<@@@@<@ +@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@<@@@@<@@@@@[@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@>@@@@@@@@[@@@@@@@@-@@<@@@@@@@@@@@@@@<@@@@@@@@@@+@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@@]<@<@[@@@@@@@@@@@@->@>@@@@+@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@+@@@@@@@@@@<@@@@@@@@<@@@@@<@@@@@@@@@<@]@@+@@@@@@@@@@>@@@@@@@@@@@@@@@>@%>%%%%%>%#*>*`*####****####%%>%%%@>>>@@]@@@@@@@@@@<@@@@@<@@@@@@<<@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@<@<@<@[@@@@<@@@@@@@@@@@@@<<@@@@@@@@<<@@@@@@@@@@@@@@@<@@@@@<<@@@@@@<@@@@@@@ +@@@@@@@@@@@@@]@@@@@@@@@@@]@@@@@@@@@@@>@@@@@@@@@>@>@@@@@@@@>@@>@@@@@@@@@@>@@@@@@@@@@@@>>@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@[@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>@@@>@@@@@@@@>@>@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@>@@@@]@@@@@@@<@<<@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@[>[%%%%-%%%%>>>##*>***`***#%%%%%%>%%@@@@@@@@@@@>@@@@@@@@@>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@+@@@@@@@@@@@@@<@@@@@@@@@<@@@@@@@@@@@@@@@@@<@@@<<@@@<@@@@@@@@@@@@@@@@@@@@@@<@@< +@@@@@<@]@@<@@@<@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@<@@@@@@@@<@@<@@<@@<@@@]@@>@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@@-@@>@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@>@@@@@@@@@@@@@@@@@>@@@@@@@@@@>@@@@@@>>@>@@@@@@@@@@@@@+@@@@@<@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@<@@@@@@<@@@@]%%%%%%%<%%%%%+###>`*###%%%%%%%%%%@@@@@>@@@@@@@@@@@@@@>>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@]@@@@<@@@@@@@<@@@@@<@@@@@<@<@@@@@@@@@@@@@@@@@@@@@<@@@<@@@@<@@@@@@@<@@@@@@@@@@ +@@@@[@>[@@@-@@@@@@@@@]@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@-@@@@@@@@@@@@@@>@@@@>@@@@@@@@@>>@@@@@@[@@@@@@@@@@-<@@@@@@@@@@<@@<@@@@@@@@<@+>@@@@@@@@@[@@@@@@@@<@-@@@@@@@@>@@@@@@@@-@@@@<@@<@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@<@@@@@@@@@<@@@@@@@@@@@@@<@@+@@@@@@@@>@>@@@@@@@@@@@@@@>>@@@@@@@@@>@@@@@>@@@]<@@@[-@@@>@@@@@@@@@@@@@@@@@@+@@@@<@]@@@@@@@%%%%%%%%%%%%%%###*``>##>%%%%%%%>%%@@>]@@@@@@@@<@@<@@@@@@@@@@@@@@<@@[@@@@@@@@@-@@@@>@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@+@@@@<@@@@@@<@@@@@<@]@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@<@@@@@@@@+@@@@@@@@@@<@@@@@@@@<@@@@@@@<@@@@@@@@@@@<@@@@@<<@@<<@@@@@@@@@@@@@@@@@@@@<@@@]@@@@@>@@>>@@@@@@@@@@@@@@@@@@>@@@@>@@@@>@>@@@@@@@@@>>@@@@@@@@[>@@@@@+@@@@@@@@@@@@@@>@@@@>@@@@@>@@>@@@@@@@@@@@@@@@@@>@@>>@@>@@@@@]@@@@@<@<@<@@@@@@@@@<@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@<<@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@[@@@@@@@@@@@@@@%<%%%%%%%%%%%%%##*``*``*##%%%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@<<@@@<<<@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@<@@@@]@@@@@@>@@@>@@@@@@@@@@@@>@@@@@@@>@@@@@>@@@@>@@@@@@@@@@@@@@@@>@@@@@@@ +@@@@@@@@@@@@@@@>>@@[@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-@>>@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@>>@@@@@@@@@@@[@@@@@-@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@>@>@@@@@@@@>@@>>@@@@@@@@@@@@@@@@]@@@<@@@@@<@%%<%%%%<<[%%%%#####**`*`**##%%%%%%%%%%%%@-@@@@@>@@>@@@@@@@@@@@>@@@>@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@<@@<<@@@@@@@@@@@@<@@@@@@@<@<@@@@@@[@@@@@@@@@@@@@@@@-@>@@@@@@@@@@@ +>@@@@@@@@@@@@@@@>[@@@@@@@@-@@@@@@<@@@@@@@@@<<@@@@@@@@+@@>@@@@@@@@@>@@@@@@@@@@@@@@@@@>@@@@]@@@<@@@@@@@<@@@@@@<@@@@@[@@@@@@@@@@-@@>@@@@@@@@@@@@@@@>@@>@@@@@+@@@@@@@>+@@@@<@@@@@<@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@]@@@@@@@@+@@@@>@@@@@@>>@@@@@@@>@@@@@@@@@@@>@@@@>@@@@@@@>@@>@@@@@@@@@@@@@@@@@@@@@>@@@@@@@]@@@@@@@<@@@@<@@@@@@@<%%<%%%%%%%%%%####*`##**`<<`**####*#%%%%%%<%<[@@@@@@@@<@@<@@@@<@<@<@@<@@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@]@@@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@ +@@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>@>>@@@@@@@>@@@@@>>@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@>@@@@@@@>@@@@@@@@@@@@@>@@@@@@@@@@@>@@@@@@>@@@@@@@@>@@@@>@@@>@@@@@@@@@@@>@@]@@<<@@@@@@@@<@@@@@@<@@@@@@@@@@@@<<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@<@[>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@-@@@@@@@@@@@@%%>>%%%%%%%%%%%#*````*```*%#``***``#%%%%%%>%%%%%@@@@@@@@>@@@@@@@@@>@@@@@@>@@@@@@@@@@>>@@@@@>@@@@@@@@@@+@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@ +@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@]@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@<<@@@@@@@<<@@@@@@@@@<<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@@@@@@@@@@@@@@]>@>@@@@@@[@@@@@@@@@@@@@-@@@@>@@@@>@@@@@@@>@>@@@@@@@@@@@@@>>@@@@@@@@@>@@@@@@@@@>@@@@@@@@@@>@@+@@@@@@@<@@@@@<@@@@@<@@@%%%%<%**%<%%%%%%%####*``<*%%<@#*`*``**#%<%%%%%%%%%%<@@@@@@@@@@@@@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@<@@@+@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@@@@@@@@@@@@> +>@@@@@@>@@>@@]@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<<@@<@<@@@@@@@@@@@@@@@<@@<@@@@@<@@@<@@@@[@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@-]@<@@-@@@@@>@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@@@@@@@@@@@@@@@[@@-@@@@@@@@@@@@@@@@@@@@@@@@@@<<@@@@@@<@@@@@@@@<@@@@@@@+>@@@@@[@@@@@@@@@@@@@@@@@@<@-@@@>@@@@@@@@@@@@@@@@@@@@@@%%%%%%-%%*<**#<%%%%####**`<%@@@@@@@#``*#<#<%<%%%%%%%%##%%@+@@@@@>@@@@@@@@@@@>@@@@@@>@@@@@@@@@>@@>@@@@@@@>@@@@@@@@@]<@@@@@@@@[@@@@-@@@>@@@@@@@+@@@@<@@@@@@]@@@@@@@@@@@@@>>@>@@@>@@@@@@@@@@@ +@@@@@]@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<<@@@@@@@@@[@@@@@@@@@@@@@@@-@@@>@@@@@@@@>>@+@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@@@@@@]@@@@@@@@@@@<@@+@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@@@@@@@@@@<@@<@@@@@<@@@@@@<@@@@@@<@@@@@@@]>>>@@@@@@@@@>@@@@@>@@@@@@@@@@@@@>@>@@@@@>@@@@@@@@@@@@@@>@@@@[@@@@@@>@@@@@>@@@@@@@>>@@@@%%%#%%[####*``##-##*#**#<*`*@@@@@@@@#`<*####%%%%%%##%#**%%%@@@@@@@@@@@@<@@@<@@@@<<<@@<@@@@@<@@@<@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@@@@@@@ +@@@@<@@@@@@@@@@@@@<<@@<@<@@@@@@@@@@@@@@@@<@@@@@@@@@<@@@@@@<@@@<@<<@@@@@@@@@@@@<@@@@@@@@@@@@@@<@<@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@<@@@@@@@@<@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@<@@@<@@@@@@@@+@@@@>@@@@>@@@@@@@@@>@@>@@@@>@@>@@>>@@@@@>@@@@@@@@@@>>@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@>@>@@@@>@>@@@@>@@@@@@@@@@@@%%##**#*`````>*#####*````*```*@@@@@>%*>`>**>>####>#*`**>#%%%@@>@@@@@@@@@>@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@>@@@>>@@@@@@@@@@@@@@>@@@@@@@>@@@>@@@@>]@@@@@@@>>@@@@@@@>>@@@@@@@@>]@@@@ +@@@<<<@@@@@@@<@@@@@@<@@@@@@@@<@@<@@@@<@@@@<[@@@@@@@@<@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@<@<@<@@@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@<@@]>@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@>@>@@@@@@@@@>@@@>@@@>@@@@@@>@@@@@@@@@@@@@+@@@@@@@+@@@@@@@@@@++@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%##*+**##*``***`***`##*#+%%%@@@@@+#***``+`*#####*`*##%%%%%%@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@+@+@@@@@+@@@@+@@@+@@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@>@@>@@>@@@@@>@@>@>@@>@>@@ +@>@@@@@@@@]@@@@@@@@<@@@@@@@@@@@@@<@@@@@@@<@@@@@@@<<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@<@@@@<<@@@@@@@@@@@@@@@@-@@@<@@@<@@@<@<@@@@@@@<@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@<[@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@@@@@@<<@@@<@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@<@@@@<@@@@@]@@@@@@@@@@%%>%%%##%###*`**``*```*%@@@@@@@@@@>@@@@>@##%*****##*``**>%%%%%@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@>>>-@@@@@@@@]@@@@@+@@@@@@@>@@>@@@@@@@@@@@@@>@@@@@@@@>@@@@@>@@@@@@>@@>@@@@@@@>@@@>@>@@@@@@ +@@@@@@>@@@@>@@@@>@@@@@@@@>@@@>@@@@>@>@@@>@@@@@@@@>@@@@@@>@@@@@@@>@@@+@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@[@<<@@<@@<<@@@@@@@<<@@@@@@@@@<@@@<@@@@@@@@@@]@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@@@@@>@@@@@@>>>@@@@@@@>@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@>@@@@@>@@@@@@@@>@@@@@@@[@@@@@@@@@@@@@%%%%%%%%-<#<``*#%<->*#@@@@@@@>>@@@@@@@@@@@@%*`````]*`***`**%%%%@@@@@@@@@@@@@@@@+@@@@@@@@@<@@@@<<[@@@@@-@@@@@@@@@@@@@@@>@>@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@>@@@@@[@@@@-@@<@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@<@<@@@@@@@+@@@@@@@@@@@@@@@@@>@@@@@@@@>>@@>@@@@@@]<<@@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@-@@@@@@>@@@@@@@@>@@>@@>@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@<@<<<@@@@@<@@@@<@<@@@@@@@@@@@@@@@@@@@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%%%%%##*`*%@@@<@@@@@@@<@@@@@@@@<@@@@@@@*#%%[**<*##<#%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@<@@@@@@@@<@@@@@@@@<@@<<@<@@@@@@]@@@>@@@@@@@@>@@@@@@@@@@@@@@>@>@@@@@@[@@@@@@@@@@@@@@-@@@@@@@@ +@@@@@@@@]@@@@+@@@@@>@@@>@@@@>@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@>@@@@@@[@@@@@@@@>@@@@@@@@@@@@@@@@@@@@>@>@@>@@@@@@@@@@@@@@@@@@@@@>@@@@@>@@@@@>@@@@>>]@@@@@@@>@@@@@@@@@@@@@@@@@+@@@@@<@@@@]@@@@@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%-%%%####***`*%<<@@@<@@@@@@@@@@@@@@@@@@@@@@@@<*`**#%%%%%%%%%@@@@@@@@@@@@@@->@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@>@@@@@]@@@@@@@@@@@@@@@@@@@@+@@<@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@<[@@@@@ +@@@-@@@@@@>@@@@@@@@@>@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@@@@@@@@-@@@@@@@@@@@@<[@@@@@@@@@@@@@@@@@@@@@@@@@@@-@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@<@+@>>@@@@@@@@@@@@@@@@@@@>@@@]@@@@@@<@@@@@@@@@@@@@@@@<@@@<[@@@@@@@@@@@@@@@@@@-@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@+<@@@@@@@@@<@@@@@@@<@@@@@<@@@@@@@@<%%%%%%%%<%%#*****`*#@@@@@@@<@@@@@@@@@@@@@@@<@@@@@#*<`*##%%%%%%%%%%@<<@<[<@@@@@@@<@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@<@@@@@@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@@@<]@@@@@@@@@>@@@ +@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@[@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@]@@@+@>@@@@@@>@@@@@@@@@>@@@@>@@@>@@@@@@@@@>@@@@@@@@@@[>@@@@@@@@@@@@@@@@@@@@@@@@>>@@@@@@@>@@@@>@>@@@@@@>@@@@@@@@@@@@@@@@@@@@@>>@@]@@@@@@@@@@>@[@@@@@@@@-@@@@@@@@]@@@@@@@@@+@@@@<@@@@]]+>@@@@@@@[@@@@@@@@@@@@@@-@@@@@@@@@@@@<@@@@@[@@%>%%%%%%>%%%#*`>````*@@@@@@@@@@@@@>@@@@@@@@@@>@>@@@%*`*****##%%%%%%%>@@@@@@@@@@@@>@@@@@@>@@@@@@@@@@@@@]<@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@<@@]@@@@@>@@@@@>@>@@@ +>@@>@@@@@@@@@@>@@@@@@>>@@@@@@@@@@@]@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@<<@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@<@@@@@@@@@@@@@@@@@<@@<@[@@@@@@@@@@@<@@@@@@@@@@@@<@@@@@@@@@@<<<@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@<@@@@@@@@@@@@@@@@@@@@@]@<@<<@@@@@@@@@@@@@@@@@<@@@@@%%%%%%%%%%%%<#*`**<*#@%<@@@@@@@@[@@-@@@@@>@@@+@@@@@@@@>>``*`**#%%%%%%%%%@@@@@@@@@@>@@@-@@@@@@@@@@@@@@@@@@@@<@@@@<@@@@@@@<@@@@@@@@@@<@@@]@@@@@@@@@@@>@>@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>@@@@@ +@@@@@@@@@@@@@@@@>@@@>>>@@@+@@@@@@@+@@@@@@@@@+@+@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@+@@@@@@@+@@@@@@@@@@@+@@+@+@@+@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@+@@@@@@@@@+@@@@+@@+@@@+@+@@@@@@@@@@++@+@@@@@@@+@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@>@@@@@@@>@@@@@@@[@@@@@@@@@@-@@@@<@@@@@@<%%%%%%%%<%%%%%%#####***%%@@@@@@@@@@@@@@<@@@@@@@@@@@@@@+@@%*>*`*#%>%%%%%%%%%@>@@@>@@@@@@@@@@@@@]@@<@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@[@@@-@@>@@>@@@@@@@>@@@>@@@+@ +<@@@@@@@@@@@@@@<@@[@@@@@@@@@@@@-@]@@@@@@<@@@@@@@<@@@@@@]@@@@>@@>@@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@<<@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@<@@[@@@@-@@@@@@@@@@@@@@@@@@@@<@@+@>@@@@@@>@@@@@@@@>>@@@+@@<@@@@@@@@@@@@@@@@<[@@-]@@@@@]@@@@@@%%%%%>%%%%%%%%%[%-%%%##**<<#@@@@@@@@@[@@@@@@@@@@@@@-@@@@@@@##***##>%%%%%%%%%%%%%%%@@@@@@@@@@+>@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@>@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@<@@<@@<@]@@@@@@@@@>@@@@@>@ +>@]@@@@@@@@@@@@@@@@@>@@@@@>>@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@>>@@>>@@@@@@@>@@@@@@@@@@@@>@@@@@@@@>@>@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@[@@@@@@@@@@>@@@@@@@>@@@@@@@@@@@[@@@@@-@@]>@@@[@@@@@@@@@@@@@@@@@-@@@]@@@>@@@@@@@@@@@@@@@@@@@[@@@@@@-@@@@@@]@@@@@@@>@@@@@@@@@@@>@@@@%@@@@@>@@@@@@@>@%%%%%%%%>%%]%%%%%%%%%%%%%###*<**%@@@@@<@@@@@@@@<@@@@@@@@<@@@@@@@*`<*##%%%%%%%%%%%%%%%%%%%%@@@@@<@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@[@@@@@@@@@@@@@@@@@@@@@@@<@@<@@ +<@@@@@@@@<@@@@@@<@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@@@<@@@@@<@@]@@@@@>@@@@@@@@@@>@>@@@@@@@[-@@@@]@>@@@@@>@@@@@>>@@@@@@@@@@@@@@@@@@@@>@@>@@@[@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%%%%%[-%%%%%%%<%%%%%<%<%%%%%%%%<%%%%%%%%%###*****#@@@@@@@@+>>@>@@@>@@@@]<@@@@@@%#***##%%%%<%%%<%%%%%%%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@<@[@@@@->@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@>@@@@@@@@@ +@>@@@@@+@@<@<@<@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@<@@@@@]@@@@@@@@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@@@@@@@@@@@>@@>>@@@@@@@@@>@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@]@@<@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@<@@@@@<@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@<@@@@%%%%<%%%%%%%%<*#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#####***#%@@[@@@@@@<@@@@@@@@@@@@@@@@<%*<*#<###<%%%%%%%%%<%%%%%%%%%%<%%%%@@@@@@@@@@@@@@<@@@@@<@]@@@%%###%@@@@@@@@@>>@@@@@@@@@@@@@@@@@>@@@>@@@@>@@@@@@@>@>@@@@@@@@@@@@@@@@@@@>>@[@@@@@ +@@@@@@@@@@@@@@>@@@@@@>@@[@@@@@@-@@@@@@@@@@@<@@@@@@@@@@@@@@<<@@@@<@@@@@@@@@@@@@@@@<<@@@@@@@@@@@@@@@@<@<@@@@<@@+@@@@@@@@>>>@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@>@@@@]@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@%%####*%%%%%%%%%%#*`**#%%%%%>%%%%%%%%%%%##%%%%#%%%%%>%>%%>>#]###<<#****<@@@@@@@@@@<@@@@@@@@@<@@@@#**<*#####<%%%<%%%%<%%%%%%[%**#<%<%%%%%@@@@@<@@@<@@@@@@@@@@@%<%%%#*%%%%@<@<@@@@<@@@@@@@@@@@<@@@@@@@]@@@@@>>>@@>@@@@@@@@@@@@@@@@@@@@@>@>@@@@@@@@@ +>@@@@>@@@@>@@@@@@@@@@@@@@@+@@@@@@@@+@@@@@@+@@@@@@@@@@+@@@@@+@@@@@@@@+@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@+@@@@@@@@@@@@@@@+@@@+@@@@@@@@@@+@+@@@@@@@@@@@@@@@@@@@@+@@+@@@@@@@@@@@+@@@@@@@@@@@[@@@@@@@@[@@>@@@@>@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@>@@@@@@@@@@@@@@@@@%>>#*`*##%%#>*####*`*#%%%%%%%%%%%%%%%%%#*`****`*#%%%%######>]######*****#%@@@+@>@[@@@@@@@@@@@-@%*****######]#####*#%%%%%%%%##>`*#%%%%%%%%%%%@@@@@@@@@[@@@@-%%]%%%%%#>*#%@@@@[@@@@@@@@@-@@@@@]@@@@@@@@@@@>@@@@@@@@@@@@@@@@[@@@@@@@@@-@@]@@@@@>@@@@ +@@@[@@@@@@@@@@@@@-@]>@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@-@@@@@]@@>@@@@[@@@@@@@@@-]@@@@>[@@@@@@@@@@-@@@@@@@@@@@@@@@@@@]@@@>@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@-@@@@@@@@@@@@@]@@@@@@@@@<@@@@<@@<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<<@@@<@@@@<@@@@@@@@@@@@@@@@@@@@@@@@<@%%[###*<**##<`**``*`#<%%%%%%%%<%%%%%%%%##**#*****#####**#**##*****<***````*#%<@@@@@@@@<@@@@@%#<````**<**#**###]*>***#%%%%#******>**>%%%%%%%%%%%%%%%%%%%>%%%%%%%%%#**##>>@@@@@@@@@@@@>@@@@@@@@@@@@>@@@@@@@@@@>@@@@@-]@@+@@@@[@@@@@@@@@>@@@@@@@@@@@ +@+@@@@>>>@@@@@@@@>@@@>@>@@@@@@@@@@@@>@@@@@@@@@@@@>@@@@@]@@@@@@@@<@@@@@@@<@<<<@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@<@@@@<@@@@@@@@@@@@@@[@@@@@@<@@@@@@@@@@@@@@<<@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<<<@@@@@<@@@@@@@@@@@@@<@]>@@@@@@@@@@@@@@@@@@@@@>@>@>%%%%%#>**`>``>>`**####%%%#%%%%%%%%>%%#***[*%**`**##***#%****>%#-*#**#*#***>*#%%@@@@@@@@@%>#*****>*#**#*>*%#>[***#-**#####***`*#*`*#%%%%%%%%%%<<%<%%%%%%%%%%%%%<#***#%%%%@@@@@@@@@<@@@@@+@@>@@@@@@@@@@@@@@@@>>@>@@@@@@@@@@@@>@@@]@@@@@@@@@@@@<@@@ +<@@<<<@[@@@@@@@@->>@@@@@@@>@@@@@@@@>@@@@@@@@@>@@@@+@@@@@@@@@@<@@@@@@@@@<@<@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@<@@@<@@@@@@@@@@@@@@@@@[@@@@@-@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@>@@@@@@@@@[-@@@<@@@@@@@@@@@<@@@@@@@@@@@+@@@@@@@@@@@>>@@@@@@]@@<<@@@@@@@@@@@@@@@@@@@@@@@@@%[%%%%%##**``*```*-*###***`#%%%%>%%%%#>***`*%+>*#****`*#@%#`+*@@#%@@%@@@@@@<@@@@@@@@@@@@@@@@<@@@@@@@%%@%##@%*<`]%@#***##**+`**##`**`*%%%%>%%%%>%%%%%%%%>%%%%%%%#**#**%>%%%@@@@@@@@@>@@@@@@@@@@@>@>@@@@@>@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@]@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<<[@@@@@@@@@@@@@@@<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@<@<@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@@%%%<%#*#**`*```*#```*****]]***>###%######***>%@@@>*`*>**%@@%%@>>@@@@@@@>@@>@>@@@[>@@@@@@@@@@@@@@>@@@@@@>@@@@@@@#>@@%*`#****%%%@@*`***#>%%%>%%%%%%%##%%%%%%%>%%%>%##*`*#%>%%%]%@@@@@@@@<@@@@@@@@@@@@@@@@@@@@<@@<@@@@@@@@@@@@@@@@<@<@@<@@@@@@@@@@@<@ +@<@@@<@@@@@@@@@@@@@@@@@[>@@@@@@@@[@@@@@@@@-@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@>@>>@@@@>>@@>@@@@@@@@@@@@@@@@+@@@@@<<@@@@<@@<@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@@]<@@@@@@@@@@@@@@@@<@@@@@@@<@@@<@@@@@@@@@@@@%%%<#<```*****``*###<``*``*<``*<#######*#**#%@@@@@*<%@@@@@@@@@@@@@@]@@@@@@@>@@@@@@@@@[@@@@@@@@@@@@@@@-@@@@@@@@@@@@@%%%%*``%@@@@@#>**##%%%%%%%>%%%#*`***`###%%%%%###``*%%%%%%##@@@@@@@@@@@@@@@@@>@>@@@>@>@@@>>>@@@@@@@+@<@@@<<@@@@@@@@@@@@@<@@<@@@@ +@@@@@@@<@@@@<@@<@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@]<@@@@+@@@@@>@@@@@@@@@@@@@>@@@@@@@@@@@>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>@@@@@@@@@>>]<@@@@@@@@@@@@<@@@@<@@@@@@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@@@<@<@@@@@@@@@@@@@[@>@@@[@@@%-%]##*######***#@@@@##%##%%`***####*<#**`*`->@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@[@@-<@@@@@@@<@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@#%@@@@+%***#####%%%%%%%%%#*>`[``*#<-######*`*#******>-@@@<@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@<<@@<@@@@<@@@<@@@+@@@@@@@@@@@ +@@@@@@@@@@@>@@@@@@>@@@@@@@@@@@@@>@@@>@@@>>@@@@>@@@@]@@@<@@@@@@@@[@@@@@@@@@@@-@>@@+@@@@<@]@@@@@@@@@@@@@@>@@>@>]@@@@@@@@<@@<@[@@@@@@@@@->@@>@@@@@@+@@<@@@@@@@<@@@@@@@@]@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@+<@@@@@@@@@<@@@@@@@@@@<@@@<@@@@@@@@@@@@<@@@@@@@@@<@@<@@@@%%%<%<%]%%%###****#%@@@@@@@@@>##***>>*#%%**%%>%@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>@%#`[*******###%%#####****`***>>`****>*```*###%%%@>@@@@>@@@@@@@@@>@@@@[-@@@@@@@@@@@@@@@@@@<<@@@@@@@@<@@@@@@@@@@@@@@@@ +@@@@@<@@@@@@<@@@@@@+@@@@@@@@@@@@>@@@@@@@>@@@@@>@@@@@@@>@@@@@@>@@@@@@]@@@@@@<@@@@@@@@@@@@@<@<@@@@@@@@@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@-@@@>@@@@@@@@@@@@>@@@@@@>@>>@@@@@@@@+@@@@@@@@@@@<<<@@@@@@@@@@@@@@@@@@@@@@@@@<@@@+@@@@@@@<%%%%%]%%%%%#****`*#@@@@@@@@@@>%>*>>*#*>%@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@@>@@]@@@@@@@@<@@@@@@@@@@@@@@<<@@@@@@@@<<@@@@@@@%%%`*##%**#####****``%<#`*<```*`*`*<`*`*#%%%%%@<@[@@<@@@@@@@@<<@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@<@@@@@@@@@<@@@@@@@@@< +@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@]@@@@>@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@>@@@@@@@@@@[@@@@@@@@@@@>@@@@+@@@@@@@@@@@@@@@@@@@>@>@@@@@@@@@@@@@@@@@@@@@@@>@@@@%%%%%%%%%>>%#>**``*@@@@@@@@@@>>]%*`**%%%@@@@<@@@<@@@@@@@@@<@@@@@@@@@@<@@@@@@@@<@@@@@@@<@@@@@<@@<@@@@@<@@@@@[@@@@@@@@@@@@@@@@@@<@@@@@@%%<@*`**####<`###%@@@@<%#*@@@%*`**#**`*##%@<@@@<@@@@@@<@@@@@<<@@@@]@@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@@@@@@@>@@@@@@ +@@@@@@@@@@@@@@@@@>@@@@>@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@>-@>@@@@@@@@@@@@@@>@>@@@@@>@@>[@@@@@@@@@@@@-@@@@@@@@@@@@@@@<@@@<@@@@@<<@<@@@@@+@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@@@>@@>@@@@]@@<@@@@@@<@@@@<@@@@@@@@@@@<@@%%%%%%%%%%%%#<`***#%[@@@@@@@@@@@@#`#%@@@@@-@@@@>@@@@@@@@@@@@@>@@@@>@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@+@%#*#<*****##@@@@@@@@@@@@@<<``*#####**#%%@@@@@@<@@@<@@<@@[@@@@@@-@@@@@@@@>@@@@@@@@@@@@@>@@@@@@@@@@@[@@@@-@@@@ +@@@@@@@@@@@@@@@@@@@<<@@@+@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@]<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@-@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%+%%%%%%%%##**`*>*%@@@@@@@@@>@%#%@@@@@+<@<<@@@@@@<]@@@@@@@+@@@@@@@@@@@@@@@>@>>@>@@@>@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@@@@]<@@<@@@@<#*``*%@@@@@@@@<@@@@#*`*<##%%%%%%<%@@@@@@@@@@@@@@<@<@@@@@@@[<@@@@@@@@@@@@@<@<@@@@@@@@@@<@@@@@@<@@@<@@@@@ +@@@@@@@@@@<@@@@@@@@@@<@@@@@@@@@@@@@<]@@@]@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@>@@@@@@@>@@@>@@@@>@@@@@@@>@@>[@@>@@>@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@>>@@@@@@@@@@@@@@@@@@@>@@@>>@@@@@@@@@@@>@@@@@@@@@]@@@<@@@@@@@@@@@@@@@%%%%%%%%%%%<%%<%<<##<**#%@@@<@@@@@@@<@@@@@@<@@@@@@@[>@@@@@@@@@[@@@@@@@@@@@@@-@@@@@@@@@@>@@@@@@@@>@>@@@@@@@@@@@@@@@@>@@@@@@@@>@@@@@@@@@>@@>>@@@>@@@#*`*@+@@@@@@@@@@@@@*`*###%%%%%%%@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@<@<@@@@@@@@@@@@@@@@@<@@<@@@<<@@@@@@@@<]@ +@@@@@@@@@@@@@@@@@@@@@@<<@@@@@@@@@@@@<<@@@@@@@@@@@@@@@<@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@<<@@@@@]@@@@>@@@@[@@@@@@@@@@@@@@@@@@-@@>@@@@@@@@@@@@@@@@@>@@@@>@@>>@@@@@@>@@@>@>>@@@+@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@<@@@@@<@@@@@@@<@%%%%%<%%%%<%<%%%%#<###*****#%%%%@@@@@@@@]@@@@@@@@<@+@@@>@>@@@@@>>@@@@@@@@@@@@>@@@@@@@@@@@@@@>>@@@@@@@@@>@@@@@@@@@@@@@@@@]@@@@@@<@@@@@@@@@@<@@@<@@@@@@#*@@@@@@@@@@@@@@@*`***<*#<%%%@@@@@@@@@@<@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@[@@@@@@@>@@@@@@@@[@@@-]@@@<@@@@@@@@@@@@@@@@@@@@-@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>@>@@@@@@@>@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-@@@@@@@@@@@<@@@@@@@<@@@@@@@<@@<@@@@@@@@@@@@@@@@@+@@@@>@@@@[@@@@@@@@@@@@@@@<@@@-@>@@@@@@-@@@@@@%%%%%%%%%%%<%%%<<<%%<####***<``*#%+@>@@>@@@@@@@@@@@>@@@@>@@@@>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@]<@@@@@@@@@@[@@@@-@@@@@@@@@@>@@@@@@@@@@@@@@@@+@@@@@<@@@@@%@@@@@@@@@@@@]@%*>*`*>%%%%%@@@@@@@@@@@@@@@>@@@@@@@@@@@@>@@@@@@@@@@@@]@@@@@@@@@@@@@<@@@@@@@@@<@<@@@ +@[@@@@@@@@@@@@->@@@@@@@@@@@@@@>>@@@@@@@@+@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@]@@@@@@@@@@@@@@@@@@@@@@@@<+@@<@@@@@@<@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<%%%]>>%%#>###%>>%####*****##>#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@>@[@@@@@@@@@@@@@@>@@@@@@@@>>@@@@>@@@@@@@@[@-@@@@@@@@<<@@@@<@<@@@@@@@@@<<@@@@<`***`*#%%%%%@@@<@@@<@<@@@@@@@@<@@@@@@<@@@@@@@@@@@@@@@@<@@@@@@@<@@@@@@@@<@@@@@@<@@@@@ +@<@@@@@@@@@<@@@@@<<@<@@<@<@@@@@@@@@@<@@@@<@<@@@@@@@@@@@@<@<<@@@@@@<<@@@@@@@@@<@<@@@@<<<@@@+@@@>>@@@@@@@@@@@@@@@@@@>>@@@@@@>@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@>@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>%%%%%%%>%%%#>``*>#####**%#>*`*%%>@@@@@@@@@@>@@@@@@@@@@@@@>@@@@@>@>@@>@@@@@@@@@@@@>@@@@@@@>@@>@@@@@@@@@@>@@>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@@@@@>@>@@@@@%@@@@%#>>**#>#%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@]@@@@@@@@@@@@@@>@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@>@@@>@>@@@@>@@@@@@@@@@@@@]@@@@@@@@<@@@@@@@<@@@@@@@@@<@<@@<@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@<@@@@[@@@@@@@<@@<@@@@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@@@@@@@@<@@@<@<@@@@@@@@@@@@]@@@@@@@@@@>>@>>@@>@>@@@@>%%%%%##>#%#******####>[#*>#%%@##@@@@@@>@@>@@@@@@@@@@@[@-@@@<@@@@@@@@@@@@<@@@<@@@@<<<@@@@@@@@@<<<@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@@@@@<@@@@@@@@@@@<@<@<@@@@@@<@@@@@<@@@@%*``*****###<%<%%%<%%@@@@@@@<@@<@@@@@@@<<@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@ +@@@@@@@@<@@@@@<@@@@@@@@<@@@@@@@@@@<@@@@@@@@@@@@<@@@@<<@@<@@@@@@@@@@@<@@@@<+@>@@@@@@@@@@@@@@>@@@@>@@@>@>@@@@@>>@@@@@@@>@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@>@@@@@@@@@@@@>@>@>@@@@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@@@@@@@@@>@@>%>%>%%#****`****`>***>*****`#%@@@@@@@@@@@>@@@>@>@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@>@@@>@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@>@@@@@@@>@@@@>@@@]@@@@@>@@@>@@@@@>@@@%*>>>####%]%<%%%%<%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@<<@@@@@@@@@@@@@@@@@@@<@<<@@<@@@ +@@@@@@@@@@@@@@[@@@@@@@@@<@@<@@@@@@@@@@@<@@@@<<@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@<<@@@@@@@@<]@@@@@@@@@@@@@@@@@@>@@@@@@@@@>@@@@@@@@@@@@@@@>@@@@>@@@@@@@@@@@@@@@>@@@>@@@@>@@@@@@@>@@@@@>+@@+++@@@@@@@@@@@@@@@@@@+@+@+@@@@@+@@@@@@@@@@@@@+@@@@@@@@@@@+@@@%%%%%%%%%#*`*###`**`*##**`+#++@@@@@@@@@@@@@@@@+@@+@@@[@@@@@@@@@@@@@@@@@@@[@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@>@@@@>@@@@@>@@>@@@@@@@@@@@@@@@@@@@>@@@@@>@@@@@@>@@@@@@@@%]`*<###%%%%%%<%<%%@@@@@@@@@@@@@@@@@<@@@@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@ +@@@@@<@@@@@@@@@@@@@@@@@@<@-@@@@@@@@@@@<@@@@@@@@@@@@@@@@<@@@<@@@@<@@@@<<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@<@@@@@@@@@@[@<@@<@@@@@@@@@@@@@@@@@@@@@@@@<<@@@@@<%@@@@@@@@@@@@@@@<@@@@@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@@@@@@@<@@]@@@@@@@@@@@@@@>@@@@@@@@@%%%%%%%%>#`****`##>@%@@@%>`*#@@@@@@@@@@@@>@@@@@@@@@@>>@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@-@@@@@]@@@+@@@@@@@@@@[@@@@@>@@>@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@>>@@>@@@@####*>##**[%%%%%%%%@@@@@@@-@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@<<@<<@@@<@@@@@@@<@@@@@@@@+@@ +@@@@@@@@@@>@@@@@>@@>@@@@@@>@@@@@@@>@>@@@@@@>]@@@<@@@@@@@<<@@<@@@@@@@@@@@@@@@<@@<@@<@@@[@@@@@@@->@>@@@@@@@@@@@@@@@@@@>@@>@@@@@>@@@@@@@@@@@@@@@@@@@>@@@@>@@%#%%%+@@@<@@@@@@@<@@@@@<@<@@@@@<@@@@@@@@@@@@@@@<@@+<]@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@%%%>%%%%%%%>##**>`**#@@@@>@@*%@>@@@@@@@@@>@@@]@@@<@@@@@@@@@@@@@@@<@@@@@@@@@@@@<@@<@@@@@@@@@@@@@@@@<@@@<@<@@@<@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@<@@@@@@@@<@@<@@@@@@@<@<<@@@@#`**`<*<#%%%%<%]%>%%@@@@@>@@@@@@@@@@>@@@@@@@@@@@@>@>@@@@@>@@@@>@@@@@>@@@@@@@@@@@@@@@@@ +@@@@@@@@@@>@@@@@@@@@@[@@@>@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@@>@@@@>@@@[@@@@@@@@@@@@@@@@@@@@@@@@@@-@@@@@@@@@@@@@@]>@@@@@@@@@@@@@@@@@@@@@>@@@@@@>@@%##%]%%%%%%<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@@@%%%%%<%%%%%%%%%%#*#***#@@@@@@@@<@@<@@@@<@[@@@@@@@@@@@<@@@@@@@<@<@@<@@@<@<<@@@@@<<@@@@@@@@@@@@@@@]@@@@@@@@@@>@@@>@@@@@>@@@@@@@@>@@@@@@@@@@@@+@@@>@@@[@@@@@@@@@-@@@<@@@@@@@@-@@<@@@@@*#%<##<*%%%%%%%%%%%%%%@@@<@@@@@@@@@@@@+@@@@@@@@@@@@@@>>@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@>@@]>[@@@@@@@@@@@@@@@@@@@@@@-@<@@@@@@@@@<@@@@@@@<@@<<@<@@@@@@@@@@@@@@[@-@@@@@@@>@@@@@>>@@@>@@@@@@@@@>@@@@+@@@@@<@@@@@@@+@@@@@@@@@@@+@@@@@@@@@@%%%##*###%%%%@@@@@@@@<@@@@@@@@<@@@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@]@>@@@@@@@@@@@@>%%>%%%%%%%%%%%>%###**#*%@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@-@@<@<@@@@<@@<<@@@@@@+@@@@@@>@>@@@@@@>>@@@@@@@@>@@]@@@@@@@@@@@@@@@@@@@<@@@@-@>+@@>@@@@]@@@@@@@@@@@@#**#%%%%%%%<%%%%[##%@@@@@@@@@@@@@@@@-@>@@@@+<@@@@@@@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@ +@@<@<<@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@[@@@@-@@@@@@@@@>@@@@@@@>@@>>@@@@@@>@@@+@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@<@@]%%%%#*#%%>%%%@@@@@@>>@@@@@@>@@@@@>@@@@%%%%%%%%%%@>[@@-@@@]@@@<<@@@<@<@@@@@<@@<%%%%+%%%%%%%%%%%%%%%####**`*`>#@@@@@@>@>@@@@@>@@@@@@@@@@@@@@[@@@-@@@@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@@@<@@@@@@@@@<-@>@@@@@@@@@@@@@@@@@@@@>@@@@@>@>@@]@@@@@@+@<@@@@<@@@@@@@<@@@@@@@@@@@@@@@@#***###%%%%<%%%%%%%#*%%@@@@@@[@@@@@@@@@@@@@@@-@@@@@>@@@@@@@@@@>@@@@>@@@@@@@@@@@@@@@ +@@@@@@@@>@@@@@@@@@@@-@@@@@@>@@@@@@@@@@@@@@>@@@@@@@@>@@@@@@@@@@>@@@@@@@>@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@>@@[@@@@@@@@-@@@@@@@@@@@@@@<@%%<%%#**#-%%>%%%>%@@@@@@@@@@]@+@@@@%%<%%%%#*%%%%<%%%%%@@[@@@@@@@@-@@@@>@>-@%%%%%%%%%%%%%>%%%%%%%##**###*#*`#%@@@@@@[@-@<@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@<@@+@@>@@@@@@>@@>@@]@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@@@@[@@@@@@-@@@@@@@>@@@@@@>@@@@@@>@@@+@@<@@@###<####<##%%%%%#****%@@@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@<@@<@@@@<@<<@@@@@@@@@<@@@@@@ +@@@@@@<@@[@<@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@<@@@@<@@@@<@@@@@@@@@@@@@@@@@@@@<@@<@@@<]@@@@@@@@@@@@@@@@@>@@@>@@@@@@>[@@-@@@@@@@@@]@@@@@@@@@@@@@@@@%%%%%%#*##%%%%%%%+%%%%>%%%%%%%%>%%%%%>>%%%>>[*##%>%>%>%>%%%%%%%%%%%%%%>>%%%%%%%%>>>%%%%%%]>%%%%%#+*<`****#%%%]@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@>>@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@-@@@@@<@@@@@@@@<@<-@@@@>@>@@@>]@@@@@@@@@@@+@@@<@@@@@@#******`***<###***##%%@@<@@[@@-@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@>-@@@@@ +<@@@@@@@@@@@@@@@@@@@@@@@@@[-@@@<@@@@@@@@<@+@@@@@@@@@@@@@@@@@@@@>>@@@@@]@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@-@@@@@@@@@@@@@@@@@>@@@@@@@@>%%%###*#%%%%%%+<%%%%%%%%<%%%%%<%%%%%%<%##*****#%%<%%%%%%%%%%%%%%%%%%%%<%%%%%%%%%%%%%%%%%%%%#******``#*<`*#<<<@@@@@@@@@@@<@@@@@[@@@<<@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@<@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@]@@@@@@@@@@@@>@@#`**%#%#``>#>#*`*>%%%@@@@@[@@@-@@]+@@@>@@>>@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@ +@[>>@@@@>@@@@@@@@@@@@@>@@@@@@@>@@@@@@@@@>@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@>]@@@@@>@@@@@@@[@@@@@@@-@@@@@@@]@@@@+@@@@@@@@<@]@@@]@@@@@+@@@@@@>[#-##**#<%%%%%%%[%%>%%%%%%%%%>%%%%%%%%%#*>`*#%%%%%%%%>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#*`*#####%>%>#@@@>@@@@@@@@@@>@@@@@@@>@@]@@@@@<@@<@@@@<@<@@@@@@@@@@@@@@@@@@@@<@@@@@@@@<<@@@@@@@@@@@@@@@<@@@@@@@@@@@]@>@@@@@@@@@@@@@@@@@@@@@>@@@@@@>@@>@>@@@@@@@@@@@@@@@@>@@@@>@@@%`%@@>@@%]****`***#<<@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@<@@@@<<@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@<@@@@@@@@[@<@@@@@@@@<@@@@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@<@@@@@@<@@@@<@@@@@<]@>@@@@@@@@@@>%%%%%%#*`>#%%%%%%%>%%%%#[#%%%%%%%-%%%<%<#*`*###%%%%%%<%%%%%%<+>%%%%%%%%%%%%%%%%%%%%%%>%%%%%%%#****>%@@@@%@@@@@@@@@>]@@@@@@@@<@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@<[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>@>@@@@@@@@@@@@@@>@@@+@@@@@@@>@@@@%@@@>@@@@@#**```*##%@>@@@@@@@@@@@@@@@@>@@@@@@@>[@@@>@@@@@@@+@>@@>@@@@@@@@@@@@@@ +@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@-@@@@@@@@@<@@<-@@@@@@@@@@@@@@@@@>>@@@]@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@[-@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%>%%%#***+#####*#%%<%*<#%]%%%>%%>%%%%%##``>`*>#>##%%%%%%%%%%#%%%>%>%>%]%%%%%<%%%%%%%%%%%%%<###***#<@<@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@<<@@+@@<@@@@@@@[@@@>@@@@@@@@@[@@@@@@@@@@@@@@@@@@-@@@@@@@@@@@@>>@>@>@@@@@@>@@@@@@+<@<@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@#****`*#*%@%@@@@[@@@@@@@@@@@@@@@@-@@>@@@@@@>@@@@@>@@@@>@@@@@@-@<@@@@@@@ +@@@@@@@@@@@@<<@@@@@@@<@@@@@@@@@<@@@@<@@@@@<@@@<@@@@@@<@@@@@@@@@@@@@@<@@@@@@@<<<<@@@@@@+@@@@>@@@@@@@@>@@@@>@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@%%%%%%###*`*>**>`>**####`*#%%%#%%%>%%%%%##>*>[`-*>`*##%%%%>#**`*%%>+%%%%%%%%%<%%%<%%<%%%%]%%<###]***`>#@@@@@@@@[@@-@@@@>@@>@@@@>-<@@@@<<@@@@@@@@@@@<@@@@@@<@<@<@@@<@<<@@<@@@@@@@<<@@@@@@<@+@@@@@@@@@>@@@@@@@@@@@>@@@>@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@@>@@>>>@@@@@@@>>@]@@@@@@@@%%@@@@%<`*##<#%%%%@@@@@]@@@@>@@@@@@@@@@@@@@@@@@@[-@@@@@>@@@@@@@>@@@>@@@>@@@+@@ +@@@<@@@<@@@@@@@@@@@@@@@@@@<[@@@@@@@@@@@@@@@-@@>@@@@>@@@>@@@@@@@-@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@@@<@@@<<<@@@@@@@@@@@@@@@@@@@<@@@@@@@@@<<@@@<<@@@@@@@@@@<@%%%%%<%%%###<#**`**`*+``*###**#%%%%%>###>###*`******#>####``**#%>%%%%%%%%%%%%%%%%%>%%%%%%%%#>>*```*#%@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@@@@@@@@@@@]@@@@@@@@@@@@<@@@@]@@@>@@[@@@@@@-@@@>@@@@>@>@@@@@+@@@@@@@<<@@@<@]@@@@@@@@@@@@@@@@@@@@@@<@@<@@@@@@@@@@@@<@********<#%%%%%%@@@@@@@@@@@@<@@<@@@@@@@<@@@@@<@@@@@@@@@<@@@<@@<@@@@@@@@@@<@@@ +@@@@@@@@@@]@@@@@@>@@@@@@@@@>@@@@@@@@@@@@@@@>@@@>@@@@@@@@@[-]@@@@@@<@<@@@@@@@@@@@@@@@<@@@@@@<@@@@@]@>>@>[@-@@@@@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@@<@@@@@@+@@@@%%%%%%%%%%%%#>#*``````*``***`*##>#########>**```]<``<#<#[*``**###%%%-%%%%%>%%>%%%%%%%>%%%##**#+*##*%>>@@@@@@@>@>@@@@@@>@@@@@@@@@@@>@@@[@>@@@@+@>[@@@@@@-@@@@@@<@@@-@@@@>@@@@@@@]@@@@<@@@[@@@@-@@@@@@@@@@@@@@>@@+@@@@<@@@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@>>@@@@@@@@@>@@@@@@@>@@%***###>%%%>%%%@@@@@@@@>@@@@@@@@@@@@>@@@]@<@@@<@@@@@@@@@@<@@<@@@@@<@@@<@@@@@@ +@@@@@@@@@@@@@@@@@@@@@<@@<@@@@@@@+@<@@@@@[@@@@@@@>@@@@@@[@@@-@@@@@@@@>@@>@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@+@@@@@<@@@@@<@@@@@@@@@@@@@%%%<[%%%%%%%-%##*****``#**```***####*`*###*``>##%@%****>#>***`**`*#-<%%#<%%%%%<%%%%<%%<%%#<*`#%#<@@%@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@+@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@#***#%%%%%%%%>@@@@@@@@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@@@>@>@@@@@@@@@@@@@@@@@@@@ +@@@@@>@@@@@@@>>@@@@@@@@@[@@@@@@@@@@@-@@@@@@@@@@@@@>@>@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@@@@@@+@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@<@@@<@@@@@@@]@%%%%%%%%%>%%%%####]*<`*%[%#-*#*`***>*`*****``*%@>@@@#``******``#**###>*`#%%%%%%%%%%%%%%%#>###*-*##%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@<@<@@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@<@@@@@@@@@@@<@<@@@@@@<@<@@@@@@@@<@@@@@@@@@@@@@%<#**<%%%%%%<@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>>@@@@@@ +@@@>@@@>@@@>@@@@@@@@@@@>@@@@@@@@>@@@>@@@@@@@@@@@@@>]@@@@@@@@@@@@@@@@@@@<@]@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@>@@[@-@@@@@@@>@@>@@@@@@@@@@@@@@@@@@@@@@@@@>@+@<%%%%%%%%%%%%%%%%###**``*%@<@@@@#*`**<``*%#`<*``#@@@@%*``*#[``#%#%#-***``>>###%%%%%%%%%%%>####**``*#%@@@@@>@@@@@@@@@@@@@-@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@<@@@@@@@<@@@@@@@@@@@@@<@@@@@@@@@<@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@<@@@<@@@@@@@<@@<@@@@@@@@@@@@@@@<@@@@<@@@@@+@@@@%#*##%%%%%%%%%>@>@@@@@@@@@@@>@@@@@@@@@@@@>@@@@@@@>@@@@@@@>>@>@@@@@@@@@@@@@>@ +@>@@@@@]@@@@@@@@@@@@@@@@@@@@>@@@]@@@@@<@@@@@@@@@@[@@@@-@@@@@@@@@@>@>@@>@>@@@@@@@@@@@@@@@@+<@@<@@<@@@@@<@@@@@]@@@@@@@@@@@@@@@@@@@<@@@@@@@<<@@@<@<@@@@@<@%%%%%%%%%%<%%##*##*`<*<@@@@<@@@@#```*#<#@@%%@%@%@]@@@>@@%@#>*%@@@>``*```**#######%%%%####>##*>>*+#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@]@@@@@@@@@@@@]@@@@@@@@@@@@>@@@>@@@@@@@>@@@@>@[@@@@@@@@@@@@@@@@@@@@-@@@@@****#<%%%%*%%%@@@@@@@@@@@@@<@@@@@@@@@@@@<@<@@@@@@@@@@@+@@@>@@@>@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@@@@@@]<@@@<<@@@@<@@@@@@@@@[-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@@@@@@@@@@>@@@@@@@@@@@@%%%%>%+%%%%%%%##*>***`>#@>@@@@@@>#>#%%@@@@@@@@@[@@@@@@@@>@@@@@@>@%>*#`>**#**>**####>########**###@@@@@@@@>@@>@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@]@@@@@@<@@@@@@@@@@<@@@@<@@@@@@@@@@<@@@@@<@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@@@<@@[@@>@[@@-@@@@@@>@@@@@@`*#***###*`>%%@@@@@@@@@>>@@@@@@>+@@@@@@@@@@<@<<@@@@@<@@@@[@@-@@@@@@@>@@@@@> +@@>@@@@>@@@@@@@@@@@@@@@@@@@@@-@@@@@@@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@<@@@@@@<<@@@@@@@<@@@@@@@@<@@@@@@@@@@@@@@@@<@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@<%<%%%%%%%%<<%%%%#####*+**%@@@@@@@@%@>>@@@@@@@@@@@@@@@@@@@@>@@@>@@@@>@@%#@@%*>```*##>#>#>######**``#@@@@@@@@@@@@@>@@@@@@@@>@[@-@@@@@@@@>@>>@@@@@@@@@@+@@@@@@@@<@@@@@<@@@@<@@]@@@@@<@]@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@-@@@@@>@@@@@@@@>@@@>@@-@@@@@@@@@@@@@@@@@%@@@#*<*`*#<%@@@@@@@@@@@@@@<@@@@@@<@@@@@@@@@@@@<@@@<@@<@@@@<@<@@@@@@@@<@@<@ +@@@@@@<@@@@@@<@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@>@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@>@@@>@@@@@@@@@@>@@@>@@>@@@@@@@@@@@@@@@@@@@@@>%%%>%%%%%%%%%%%%%%######*>```]#%@@@@@@<@<@@]@@@@@@@@@@@@>@@[@@@->@@>@@@@@@>@@##``*#**########>##**##+%@@@@@@@@@@@<@@@@@@@@@@@@@@@@@<@@@@<@[@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@>@>@@@@@@@@@@@@@@@-@@@@@@@@@@@<@<@<@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@<<@@@<@@@@@@@#**`*#<%@@@@@@<@@@@@<@@@<@@@<@@@@@@@@@@@@+>@@>@@@@@@@@@@@@@@@>@@@@>@@@ +@>@@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@@>@@@@@@@>@@@@@@>@@@@@>@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@<@@@]@@@@@@@@@@@@@@@>@@@@[@@@-@@>@@@@>@>@@@@@@@@@@@@%%%%%%%%%%##+%%%%%#<###*<**``*`<#%@@@]@@@@@@@@@@@@@@@@<@@<@@@@@@@<@@@@@@<@@@@@@@@%@@#<***##<#####*<**#@@@@@<@@@@@@<<@<@@@<@@@@@@@@@@@@@@@@@]@@@]@@@@@@@@@@@@@>@[-@@@@@@@@@@@@@@@@@]@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@[@@@@@@@@@@@@@@@@@@@@@-@]@@@>[@@@@-]@@@>@@@@@@@@@@@@@>@@>@@>@>[@@%*>%#******#%%@>@@@@@@@@[-@@@@@@@]@@@>@@@@[@@@@@-@@@@@@@@@@@@@@@@]@@@@@@@>@@ +>@@@@@@@@>@@@@>@>>@@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@<<@@<@@@@<<@@@@@@<@<@@[<@@<@@<@<@@<@@<@@@@@@@@@@@@@@@@@@@%%%%%<%%<%<]%#*`*#####*****`*>#>#@@>@@@>@@@>@@@@@@@@@@@@@>@@@@@>@@@@@>@>@@@[@@@@@@@@@@@#**#*>*#####***###@@>@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@>@[@@@@-@@@@@@@<@@@@@@<<@<+@@@@@>@@@@@>@@@>@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@]@@@@@@@@@@@@@@@<@@<@@@@@@@@@@@@<@<[@@@-@@>>@@@@@@>@>@@@@@@*`*#####%%%%+@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@<@ +@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@<@@]@@@@>@@@@>@@@@>@@@>@>@@@@@@@@@@@@@@@@@@@@@@@>>@@@@@@@@>@@@@@@@@@]@@<@@@@@@@@@@@<@@@@@@@@@@<@<@@@@@%%%%<%%%%%%%%%<%%%%%%%#*`******<<````*%@@@@@@@<@@[@@@@<@@@@@@@<<@@<@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@#`<*<<****<**]@@@@@@>@@@@@>@@@@@>@@@@@@@@@@>@@@@@@@@>@>@@@@@@@@@@@>@@@>@@@@@>@+@@+@@+@+@@@@@@@@@+@@@@@@@@@@@+@@@@@@+@+@@@@+@@@@@@@@@@@@@@@@@@@@@@@@+@+@@+@@@@@@+@@@@@@+@@@@+[@@@@@@[@@@@@@@@>@@@@%#*##%%%%%%%@@>@@@@@@@@@@@@@@>@>@@@@@@@@@@@@@@@@>@@@@>@@@@@@@@@@@@>@>>]@@+@> +@@@@@@@@@@@@@@@@@[-@@]@@@@@@@@@@@@@@@@@@@@@@@@>[@@-@@@@@@@@@@@@@@@@]@@@@@@@@>@@@[-@@@@@@@@@@@@@@@@@@@@@@@@@]@@>@@@@[@-@@@@]@@@@@@@>%%%%%%%%%%%%%%[-%%%]%%%%%##***`*###>%**%@@@@@@@@@@@@[@@@@@@@@@@@@-]>@@@@@@[@-@@@@@@@@@@@@@@@@@@@@@@@%##***]*****##@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@[@@-@@@]@@@>@@@@@@@@@@[-@@@@@@@@@@]@@@@@@@@@<@@@@@@@<@@@@@@@<@@@@@@@@@@@@@@@@@@@@<@@@@@@@<@@@@<@<@@@@@@@@@@@@<@@@@@@@@@<[@@<@@<<@<@@@@@<@@@#<*##%%%%%<@<@@@@@<@@@@@@@@@@@]@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@>@@@>@@@@ +@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@>@@@@@@@@@>@@@@@@@@@@@@>-@@@@]@@@@@@@@@@@@@+@@@@@@@@@@[@>@@@@@@@+@@@@@@@@@@@@@%%%##%%>%%%%%%%%%>%%%%%%%%%#>##*`*`#@@@%%@@@@>@@@@@@@@>@>@@@@@@@@@>@@@@@@>]@@@@@@<@<@@@@@@@@@@@@@@@@@@@@%#*`****`*<%<@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@<@@@@<@@[<@@@@@@@@@@@<@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@@<@<@@@@@<@@@@@@<@@@]>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@##**##>*%%%@@@@@@>@@@@>>@@@>@@@>@@>@@@@@@@@[@@@@@@@@@@@>-@@@@@@@@@@@@@@@@@@@ +@>@@@@@@@@>@@@@@@@@@>@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@-@@@@<@@@@@@@@@@@@<@@@@@<<@@@+@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@>@@%%>%>#*##%%%%]%%%<%%%<%%%%%%####**``*#%@<@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@[->@@@@@@@@@>@@@@@@@@@@@@>@@>@@@@@@@#*``*``*#@+@@<@@@@@@@@@@@@@@@@@@@@@<@@<@@@@@@@<@@@@@<@@@@@@@@@@@@@@@[@@@@@@@@@-@@@@@@@@@@@@@@@>@@@>@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-@<@@@@@@@@<@+@@@@@@@@>@@@@@@@@@>@@@@@@@@@@@@@@@@@@%****#%]<@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@-@@>>@+@@ +@@@@@@@@@@@@@@@@@>+<@@<@@@@@@@@<]@@@@@@@+@@@@@@@@@@>@@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@>@@@>@@@@@@@@@@@@@@@@@@%%%%%%>**##%%%%%>%%%%%%%%%%%####]***``*%<@@@@@@@@@@@@@@@@@@@@@<@<@@@@@<<@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@<@@@@@#*````<%@@@@@@@[@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@@@@@@@<@@<<<@@@@@@@@<@@@@]@]@@@@@@@@@>@@>@@@@@@@@@@@@@@@>>@@@@@@@@@@@@@@@@@@@>@>@>@@@>@@@@@@@@@>@[@@@@@@@@@@@>@@@@>*##*>*>#%%@>@@>@@@@@@@>@@@>>@@@@@@@@@@@@@@@@@@@@@@@@@]@<@@@@@@@<@@@@@@@<<@@@@ +@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@<<<@@@@@@@@@@@@[@@@@@@@@>@[@@@@@@->>>>@@@@@@@>@@@@@@>@@@@@@@@@@>@@@@@@@@%%%%%>>##*`##+%%%<%%%####%#####*`<*##<*<@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@<@@@@@<@@]@@@#*```*%@@@@@@@@@@@@@@@@<@@@@<@@@@@@@@@@@<@<@@@@@@@@@@@@@@@@@<@@@@@@@<@@<@@@@@@@@@<<@@@@@@@@@@@@@<@@@@@@@@@@@@@@]@@@@@@@@@@@@@>@[@@@@@-@@@@@@@@>@@@@@@@@@@@>@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>%**####%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@@@>@@>>@@@@@@@@@@@@@ +@@@@@@@+<@<@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@<<@@@@@@@@@@<@<@@@@@@@@@@@@@@@@<@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@+@@%%%%>%%%%%#*>#####%>###`>########**`*#@@@@@>@@@@@@>@@@>@@@@@@>@@]@@@@@@@@@@@@@@@@@@@@<@@<@@@@@@@@@<@<@@@@@@@@@@@@#``<#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@<@@<@@@@@@@<@@@@@@[>@[@@@@@@@-@]<@@@@@@@@-@@@@@@@@@@@@@@@@@@@@>@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@-@<@@@@@@@@@@@@@@@<@@@@@@@#**##%%<%%@@@@@@@@@@@@@@@@+@@@@@@@@@@@@>@@@@[@@@@<@-@@@@@@>@@-@@@@@@@<<@<@@@@@ +<@@@@@@<@@@@@@@@<@@<@@@@@@+@@@@@@>@@>@@@@>@@@>>@@@@@@@@@>@@@>@@@@@@@@@]@@@<@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@-@@@@@@@@@@@>@@@@@+%%%%%%%%<%%%##*]**####>#`*#######>**`**%@@@@@@@@@@@@@>@@@@@]@@@@@@@@@@@@@@@@@@<@@@<@@@[@@@@@@@@@-@@@@@@@@@@@@@@>@@>*``#@@@@@@@@@@@@@@@@@+@<<]@@@@@@@@@@@@@@@@@@<@@@@@+<@@@@@@@@<@@@@@@@@@@@<@@@<@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@]@@@>@@@@@@%>#`>>%%%%@@@@@@@@@@>@@@>@>@@@@@>@@@@@@@@>@@@@@@@[@>@@@@>>@[@@@@@@@@@@-@<@@@@@@ +@@@@@@@@@@@@@<<@@<@<@@@<@@@@@@@<@@@@@@@@@<@@@@@@@@<@@@@@<<@@@@@@@@@@@@@@@<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@<@@@%%%%%%<%%%%%%%%###```****#*<``**`*****`*#%@@@@@@@@@@@@@@@@@@@@@<<<@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@<@@<@@@@@@@@@@@<@%``%@@<@@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@<@@@@@@@@@@@@<@@@<@@@@@@@@<@@@@@@@@<@<@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@#**#>#%>%%@>@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@>@>@@@@@@@@>@@>>@@@@@@>@@@@@@>> +@@@@@@@@@@@@>@@@@@@@@@@>@>@@@@@@@@@@@@@@>@@@@@>@@@@@@>@@@@@@@@>@@@@@@@@@@@@>@@@@@@>@@@@@@@@>@@@@@@@@@@@@@@@@@@@@>@>@@%>%%%%%%%%%%%%%%%%%##**```*`>```**``*``***`*#@@@@@@>@@@@@@@@@@@@@@@@@@@@@>@@@@>@@@@@@@@@@>>>@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@#`%@@@@@]@@@@@>@@@>@>>@@@@@@@@@>>@@@@@@@@@]@@@@<@@@@@<@@@@@<<<@@@@@@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@[@@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@<@@@@@@@@@<@@@@@@@@@@@@@@@@@@@#**%%%%%<@<@@@@<<@@@<@@@@@@@@@]@@@@>@@@@@@@@@@@>@@>>@@@@@@@@@@@@@@@@@@@@@@>@[@@@ +@@@@@@@@@-@@@@@@@@@@@@@@@@@]>@@@>@@@@>>@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%@@@@@+@@+@+@+@@@@@@@@@+@@@@@@@@@@@%+%%%%%%+%%%%%%+%%+%%%%####**``+%%***#@##%**````*%@@@@@@@@@@@@@@@@@@@@+@@@@@@@@+@+@@+[@@@@[@@@@@@>@@>@@@@>@@@@@@@@@@@@@@@@@@@@@@>*>@@@@@@@>@>@>>@@@@@@]@@@@@@@@@@@<@@@@<@@@@@@@@@@@@@@@<@@@@@@<@@@@@<@@@<<@@@@@@<@<@@@@@@@@@@@-@@@@@@@@@@@@@@@@@@@<@@@@@@@<@@@@@<@<@@@@@<@@@@@@<@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@*<#*#%%<%%@@@@@[@@@@@@@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@<@@@@<@@@@@@ +<@@<@@@@<@@@@@@@@@@@@@@]@>>@@@@@@@@@>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@>%#%%%%>@@@@@@@>@@@@@>@%@-]%%%%%%%%%%%%%%%%%%%%%%%%%%%+%%%**####***``*%@@@@@@@@[@@%*>`*@@>@@@@@@@@@>@@@@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-@@@@@@<<@@@@@@@@@@@@@@@@@@@<-@@@@@@@@@@>@@@@@@@@>@@@@@@@@@@@@>@@@]@@@@@@+<@@@@@@@@@<@@@@@@@@@@<[@-@@@@>@@@@@@@>@@>@@@->@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@-@<@@<@@@@<<+@@@@@@@@@@@@@@@@@@@@@>@@@%#**%%%%%%%@@@@@@@@@@@@@@@@@>@@@@@@@@>@@@@>@]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@ +@@@@@@@@@@<@@@@@<@@@@@<@@@@@@@[@@@@@@@@@@@@-@@@@@@@@@>@@@@@@@@@@@@@@@@@@%%%%>%%%%%%%%%%%>%>%%%%%+%%%%%%%%%%%%%%%%%<%%%%%%#*#%<%%%%%##****<<<`<#%@@@@@@@@@@@@@<%`*@@@@@<@@@@@@@@@@@@@@@@@@<<@@@@@<@@@@@@@@<@<@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@<@@<@@<@@@@@@@@<@@@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@<@@@@@@@@@@@@]@@>@@@@@@@@@@@>@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@[@@@@@@@@@@@@-@@@@@@@]@@@@@@@+**#%%%%>%%@@@@@@@@@@@@@@@>@@>>@@@@@@@@@@@@>@@@[@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@>>@@@> +@@>@@@@@@>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@@@@@@@@%%%%%%%##%%%%%%%%%%%%%%%%%%%%#]%%%%%%%%%%%%%%%%%%%%>#*#########+<*``````*@@@@@@@@@@@@@@@@@%#@@]@@@]@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@@@>@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@[@-<@@@@@@<@@<@@@<@@@@@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@@@>>@@@@@@@@@@@@@@@@@@@@@@@@@]@@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@#**%%%%%%%%%%@<@@@<<@<[@-@@@@@>@>@@@@@@>@@@@>@@@@@@@-@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@-<@@@@@@@@@@@@@@@@<%<%%%%%%+%>###**#*>%%>%%%]%%%%<%%%%%<*%%%%%%%#%%%%%%%%%%%<[#-*####*###***`>*##*%@@>@>@@@@@@@+@@@@@@<@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@<@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@<<@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@[@<@<@@@@@@@@@@@@@<@@@@@@@@@@<@@@@<@@@@@@@@@<<@<@@@@@@<@@@@@@@@]@@@@@@@>@@@@@@@@@%>###%%%%%%>%%%@@@@@@@@@@@[@@-@@@@@@@@@]@+@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@>>@@@>>@@@@@@@@@@@@@@@@@>@@[@@@@%%%%>%%%%%%%%%%%%>%%#%%%%%%%%%%>*>#%@@%*#####>%%#>###>###*#*>#>#]#*########*##*>[`#*-**`***```*#@@@@@@@@@@@@]@@@@@@@+@@@@@@@@@@@@<@@@@@@@]@@@]@@@@@@+@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@-@@@@<@@@@@[@@@@@>>@@@@@@@@@>@@@@@@@@@@@>@@@@@@@>@@@@@@>@>>@>@@]<@@@<<<@@@@@@@@@@@@@@@@@@@@@@@@<@@<@@@@<<@@]@@@@@@@@@@@@@@@@@@@>@>@@>@>@@>@@@@@@@@@@@@@>>@@@@@>%##]*<#%%%<%%<<%%%%@@@@@@@@@@@@@@@@@@@<@@@@@@@<<@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@ +@[@@@@@@@<<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@%%%%%%%%%%%%%%%<%%%%#%%%%%%%%%%<**#%@@<*###<##%%######<##***<#####*]#>#>###*##*>*`#****`***```[#@@@@@@@-@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@@@@<@@@@@@@+>@@@>@>@@@@@@@@@@@@@@]@@@@<@@@@@@<@@@@@@@<@[@@@@@-@@@@@@>@@@@@@@>@@@>@@+@@@@@@@@@@@@@>@@@>@@@@@@@@@@@>>@@@@@@@@>@@@@@@@@>@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@>@@@@@@@@@@@@+@@@@@@@@@@@@@>@@@>@@@>@@[@@@@@@@@@-@@@@@<@@@@@@@@@%#<**##%%%%<%%-%%%%@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@>]@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@ +@<@@@<@@@@@@@@[@-@@@@@>@@@@@@@@@@@@@@@@@>>@@@@@@@@@@@@@@@@@@%%@%%%%%%%%%%+##<*#*#%%%%<%%%%%<%%%%%%#]%%%>%%%%%%%%%%%%>>%%##**##>#*###***``>#>*%@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>]@@@@@@@@@<<<@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@<<@@@@@@@@@@@@@<@@@@+@<@@@@@@@@@@@@@@@[@@@>@[@@-@@@@@@@@@@@@>@@+@>@@@@@[@@@@@@-@@@@@@@@<@@-@@@@@@@@@@@<@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@<@@@<@@@@@@@@<@@@@@@@@@%####%%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<<@@@@@@<@@@@@@@@@@@+@>@@>@@@@@@@@@@>@@@@@@@ +@@@@@@>>>@@@@@>>@@>@@@@@@>@@@@@@@@@@@@@@@>@@@@@>@@[-@@@@@@<@@@@@@@@@<+%%%%%%##%%%%%%%%%%%%%%%%>%%%##>]%%%%%%%%%%%%%%%%%%%#*#########<#*```]``*@@@>@@@@@@[@@@@@@%#@@@@@@@@@@-@@@@@@@<@@@@@@@@@@@<@@-@@@@@<@@@@@@@@@<<@<@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@<@<@@@@@@@@@@@@<@@@+@@@@@@@@@@>@@@@@@@@@@@@>@@@@@@@@@@@@@@>>@@@@@@@@@>@@>@@@@@@@@@>>@@@@@@@@@@@@@@@@@@@@>@@@>@@@@>@@@@>@@@@]@@#**#%%%%%%%%%@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@]>@@>@@@@@@@@@@[@@@@ +@@@@@-@@@@@@<+@@@@@@@@@>>@[@@@@@@@@@-@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@%%-%#%%%%%<%<%%%<%%%%%%%%%%%%%<%%%%%%%%%%%%%%%%%%#*<%%%<%%<##******``**%@@@@@@@@@@@@@@%`*@@@@@@@@<@@@@@@@@@@<@<+@@@@@@@@>@@@@@>@@@@@@@@@@@@>@>@@@@@@@@>@@>@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>@@@@@@@>@@@@@@@@@@]<@@]@@@@@>@@@@@@@@@@@@@@@[-@@@@@<<@@@+@@@@>>@]@@@<@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@<<%**#%%%%%%%%@@@@<@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@@<@@<<@@@@@@@<@@@@@@@@@@@<@]@@@@@@@@@ +@@@@@@@@]@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@>@@@@@@>@@@@%%#%%%%@@@@@@@@@@@[@@@@@@%%%%@@-%<%%%%%%%%%%<%%%%%%%%%%%%%#<#<#+***``*%@@@@@@@@@@@%*``*@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@@@@@@@@>@@@@@@@@@#@@@@@@@@@@@@]@@@@@@@@@@@@@@@<@@@@@@@@@@@@<@@<@@@<[@@@@@@@@@@@@@@@@@@-@@@@@@@@>>@@>@@@@@@@@@@@@>@@@@+@@>@@@@>@@@@@@@>@@@>@@@@@@@@@@>@@@@@@@@@@@@@@@[@@@@@@@@>@@@@@@@@@@+@@@@@@@>%**%%%>%%[@@@@@@@@@@@@@@@-@<@@@@<@@@@@@@-@@@@@>@@@@@>]@@<@@@@@@@@@<@[@@@@-@>@@@@@@@ +@>@@@@@@@@@@@+@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@%%%@@@@@]@@>@@@@@@@>@>@@@@@@@>@@@@@@@%>%%%%%%%%%%%%>%%%%%%%>##>#**]`*%#***#@#*%**````*%@<<@@@@@@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<<@@@@@@@<@@@@@+@@@<@@[@@@%>@@@[@@@@@@@@@@@@@@-@@@@@@@>@@@@@@@@@@@@+@@@@@>@@@@>@@@[@@@@@@@@@@@-@@@@@@@<<@@@@@@@@-@@@@@@@@<@@<@<@@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@<@@@@@@@@**#<#%<%%+@@@@@@@@@>@@@>@@@>@@@@@@@@@@@@@@@@@@@@@>@@@>@@@>@>>@@@@@@@@@@@@>@@@>@@@@ +@@@@@@@@@@@@@@@@@@@@@@@>@@@[@@@@@@@@@@@@@@@@@@@@-@@@@@@@@@<@@@@@@@@@@@@@@+@@@@>@@@@@@@@@]@@@@@@>@@@@@@@@]@@@@@<@@@@@@%%[%%%%%-<%%%-%%%%%##*<```*`````<<``*``***`*#<@@@<@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@<@@@<@@@<+@>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@>`%@@@@@@@@>@@@@@@>@@@@@>@@@@@>@@>@@@@@@@@@@>@@>@@@>@]@@@@@@@@<<@@@@@@@@@]>@@@@@@@@@>@@@@>@[@@@@@@@@-@@@@@@@@@@<@@<@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@>@@@@@[-@@@@@@<@@@@@@@@@@@-@@@@@#**%%%%%%@@<@<@@@@@@@@@@@@@@@@@<@<@@@@@@@@@@@@@@@@@@@@<@<@<@@@@@<<<@@@@@@@@@@@@@ +@@@@@@@@+@@@@@@>@>@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@>@@>@@@@>@@@@@>@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%>%%%%>%]#>#```****#*]``**`*****`*#%@@@@@@<@@@@[@@@@@@-@@@@@@@@@@@@@@@@@@@@@<@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%``%>@@@@@@@@]@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@<@@@@@@@@@@@@@@@@@@@<@<@@@@@@@@@@@@@<@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@<@@@@@@@@]@@@@@>>@>@@@@@@@@#**###%%%%@@@@@@@>@@@@@>@@@@+@@@@@@@@@@@<@@<@@@@<@@@@@@@@<@@<@@@]@@@>@@@>@@@>@@@ +@@@@@>@@@@@@@@>@@@@@@@@@@>@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@@@@>@@[@@@@@@@@@@@@@@>@@@@@@>>@[-@]@@@>@@@@@@@[-@@@@@@@@@@@@@@@@]%%%%%%>%%[%%%##****###-##`*######]***`**%@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@>@@@@>@]@@@@@@@@@* `#@@@@@@@@<@<@@@@@@@@@<@@@@@@@<@@@@@@@@@@<@@<@<@@<<@@@@@@@@@@@@@@@@@@@[@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@<<@<@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@<@<@@@@@@@@@@]@@@@@@@@@@@@@@@@@@%>#`**%%%%@@@@@@@@@@@@@>@>@@@[@@@@@@-@@@@@@@]@@@@@@@@@@@@>@@@@@@@@@@@[@@@@-@@@@ +@@@@@@@@@@@@@@@@]@@@>@@@>>@@@@@@@@@@@@>@@@@@@@@>@[@>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@@>@@%%%%%%%>%[#**#-###%%###`##<######****<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@+@@@@@#```#@@@@@>@@@@@@@>@@@@@@@@>@>>@>@]@@@@@@<@@@@<<@@@@@@<@@@@@@@@@@@@@@@@@@@<<@@[@@@@@@@@@@@@@@@@@@@@@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@>@@>@>@@>@@@@@@@@@@@@>@@@+@@@@@@@@@@#<<##%%%%%@@@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@<@@@@@@@@@@@@ +@@@@@@@@@<@@@@@]@@@@@@@@@@@>@@@@@@@@@@>>>@@@@>@@@@@@@>@>@>@@]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@%%%%%%%##<<#<%%%%<%%<####%#<###****<[<*@@<@@@@@@@@@<@<@@@@@@@@@@<@@@@<@@@@@@@@@@@@@@<@@@@<@@@@@@@@@<@@]@@@>@@@@#*```*>@@@@@@@@@@@@@@@@@@@>@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@>@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-@<@-@<@@@@@@@@<@@@@@@@@@@@@<@@@<@@@+@@@@@>@@>@@@@@>@@@@@@@@@@@@@@@@>**####>%%%@@@@@]@@@@@@@@@@@@@@@>@@@@@@>@@@@@[@@@@@@@@-@<@@@@<@@@@@@<@<@@@@@@< +@@@@<@@@@@@@@@@@<@@@[@@@@-@@>@@@@@@@@@@>@@@@@>@>@@@@@@@@@@@@@@@@@@@@@@@@@>@@@+@<@@@+@+@@@@@@@@@@@@@@@@@@<@@@@@@@<@@<@@@@@@@@@@@%%%%%%#**##%%%%%%%%%%%%%<%%%###]#***``>%@@@>@@@@@@>@@@@@@@@@>@@>@[-@@@@@@@<<@@@@@@@<@@@@@@<<@@@@+>@>@@@@@@@>@#>````*%@@@@>@@@@@@@@]@<@@@@@@@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>+@@@@@>@@@@@@>@@@@@@@@@@@@@@@@@@@]@@@@@@@@@<@@@<@@@@@[-@@@@@@>@@@>@@@@@@@@@@+@@@<@@@@@@@@@@@@@@<]@@@@@@@@@@@@@@@@@@@<@*##****#%%@<@<@@@@@@@<@<[@@@@@@@@@-@@@>@@@@@@@@@@@@@>@@@>>@@>@@@@@@@@@@@@@@+@ +@@@@<@@@@@<@@@@@@@@@@@@@@@@@@<<@@@@@@@@@<@@@@@@@@@@]@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@>@@@@@@@>@@%%%%%#*>#%[-%%%%%<%<%%%%<%%%####**`<*#%@@@@@@@@@-@@@>@@@@@@@@@@@@@@@@@@>>@@@@@@@@@@@@@@@@>@@@@@@@@@]@@@@+@<#*<```<*#@@@@@@@@@@@@@@@@<@@@@@[@@@@@-@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@@@@>@@@@@@-@>@@@@@>>>@>@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@>@@@@@@>@@@>@@@@@@@[-@@@@@@@@@@@@@<@%*<**#%%@<@-@@@@@@@>@@@@@@@@@@@>@>@@]@@@@+<@@@@@@@@<@@@@<@@@@[@@@@@@@@@@@@ +@@@@@@@@@-@@@>>>@@@@@@@@@@@@@-<@@@@@@@@@@@@@@@@@[-@<@@@<@+@@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@]<@@@@<@@@@@@@@@@@@@@@@@@@@@%%%##%%%%%[%%%%%%%%%%%%%%%%#-##*`>`#@>@%%@@@@@@@+@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#*`****<*#%<@@@@@@@@@@@@@@<@@@@<@@<@<@@@@@@@@@@<@@@@@@<@<@@@@@@@@@@@@@@@@@<@[@@@<@@@<<@@@@@@@@@@@@<@@<@@@@@@<@@<@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@]@@@@@>@@@@@@>@@@@>@@@@@@@@@@@@@@>@@@@@[@-@@@]@@#+>>>#**%%>@>@@@@@[@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>@@@@@@@@ +@@@>@@>@@@@@@@>@>@@@@@@@@>@@>@@@@@]@@@@>@+<]]@@@+@@>@@>@@@@[-@@@@@<@<@@-@@@@@@@>@@>@@]+@<<@@@@@@@@@@@@@@@@@@@[@@@-@@@@@@@@@@>@@@@@%%%%%%%%%%%%%%%%%%%>%%%%%%##***`*##*#%-*%@>@@@@@@@@@@@@@[@@@@-@@@<@@@<@@@@@@<+@@@@@@@@@>@@@@@@>@@>@@@%##]********<#@@@@<<@@@@@@@@[@@-@>>@@@@@@@@>@@@@+<@@@@<@@@@@@@@@@@@@@@@@<@@@@@@<@@<<@@@@<@@@@@@<@@@@@<@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@<@@@[@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@<<@#**##<%%%%%@<@@@<@@<@@@@@@@@@@<@@@@@@]@@>@@>@>@@@@@@@@@@@@@@@@@@[@@@@@@@@@@- +@@@@@]@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@>@@>@@@@>@@@@@>@>@@@@@@@@@@>@@@@@@@@[@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@>@@@@@@>@@@@@@@@@@@@@>@>@@@%@%%%%%%%%%%%%%%%%%%>%#*`*******`````*>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@#`******]****>@@@@@@@@@@@@@@@@@@@@@[@@-@@@@@@@@@@@@]@@@@@+@@@@@@@@@@@@@@<@@@@@@@]@@@@@]@@@@@+@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@-@@@@@<[>@@@@>>@@@@@@@@@>@>@@>@@@@@@@>@@@@@@@@@@@@@@@>@@>#]##%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@<@@@@@@@@@@@ +@@@@@@@@@@@@@<@@<@@<@@@<@@<@@]@>@@@@@@@@@@@>@@@@@@@@>@@@@@>@@@@@@@>@@@@@@>@@>@@@@@@@@@@@@>@@@]@@@@@@@<@<@@@@@@@@@@@<<@@@@@@@@@@@@@@<@@<@@@@<@%<%%<%%[%%%%%#*`*<##<#*****``##`#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@<<@@@@@@#**#***#####***###@@<@<@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@@@@@]@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@>@@@@@@@[@@@@@@@@@@@@-@@@@@@@@<@@@@@@@@@@<@@@@@@@@@@<@@@@@@@@@``*#####%%%+@@@@@@@@@@@>>@@>@@@@@]@@@@<@@@@@@@<@@@<@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@[@@@->>@@>@+@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@>@@@@@>@@@@>@@@@[@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@@>@@@@[@@@@@@@@@@@@@%%%%%-%%%###%%<%%####-****``*`*#%@@>@@@@@@@]@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@[%%@#`***########-**>+@@@@<@@@@]@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@>@@@@@@@@@>@@@@@@@@@@@@>>@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@>@@]@@@@@@@@<@@@@@@@@@@@@@<@@<@@@@@@<@<@@@@@@@@@@@@@<@@@@<@@@@%*%%#**<***#%%+@@@@@@@@<@@[>@@@@@@[@@@@@@@@@@@@@@@@@@-@@@>@@@@@@@@@@@@@@>@@@ +@@@>>@@@@@@@@@+@@@@<@@@@@@@@@@@<@@[@@@-@>@@@@@@>@@@@@@-@<<@@@<@@<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@@@<@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@%%%%%%%<%%%%%%%%<<+##>##*>``>*#%@@>@@@@@@@@@@@@@@@@@@@>@>@@@>@>@@>@@@>@[@@@@@#*``*#**####-######*>###%@@@@@@>@@@@@@>@+<@@@@@@@@@<@@@@@@<@@@@@@@@@@@@@@@]@@@@>@@@@@]@@@@@@@@@@@@<[@@@@@@@@-@@@@@@@@@@@@@@@@@@@@@>@>@@@>@@@@@@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@@@@@@@@@@@@<@@<@@<#**<*#%<@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@<@@<@@@@@@@@@+ +@@@@@@@@>@@>@@@>>@>@@@@@>@@@@@@@>@@>@@@@@@@@>@@@@>@@@@@@@@@@@]@@<@@@@@@@@@@@@@@]>@@@@@>@@@@@@@@@@[@@@@@@-@@@@@@@@@@>@@@@@@@@@>@+@@@@@@@@@@<@@@@@@@@@%%%%%<%%%%<%%%%%%#[###*`*-%@@>@@@@@>>@@@@@@@-@@@@@<@@@@@@@@@@<@@@<<@@@@%#@@<*<```*#############**``#@@@@@@@@@@@@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<<@@@@<@@<@@<+@@@@@@@@@>@@@@@@@@@@@>@@@@>>>@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@>@@@@@>@@@@@@@@@@@@@@>@@@@@@@]@@@@@@@@@@@%>@@#]**`*#%%@@@@@@@@@@<@@@@@@@@@[@@@@@@@@@@@@@@@@@@->@@@>>@@@+@@<@@@@@@@@@ +@@@@<@@@@<@@@@@@@@@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@<@@@@<@@@@@@@@@%%%<%%%%%<%%%%##*`<**`*#@@@@]@@@@#`#%%@@@@@@@@@@@@@@@@@>@@@@>@@@@%#*#``>*>*>#[*#############**###@@@@@-@@@@@@@@@@@@@@@@@@@]@>>@@@[@@-@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@<@<<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@<@@@@@+@@@>@@>@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@@>@@@@@@@@@@@@@@`*#*>*###*`#%%@@@@@]@@@@@@@@@@@<@<@@<@@@@@<<@@@@@@<@@@@@@@@<[@-@@@@@@@@@@@@ +@@@@@@@@@>@>@@@@@@@@@>>@@@@>>@@@>@@@@@@@@@+@@@@@@@@@<@@@@@@@@@@@@@@@@@@<@@+@@@<@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@<<]@]@>@@@@@@@@@@@@@@>@@@>@@@@@@@@@@@@@@@>%%%%%%[-%%<%%##*##*`**#@<@@@@<@@#```*#*<@@+%@>@%@>@>@%@%%>]#<%@@@#``*```**#######%<%%######<**#*##%@@@@@<@@[-@@@@@@@@@@@@@@@@@@@@@@>@@@@@@>>@@@@@@@@@@@@@@@@@>@+@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@%>*+*##%%%%*%%@>@@@@@@@@@@@@@@>@@@@@@[@@@-@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@- +@@@@@@@@@@@@@@@@@@>@@@>@@]@@@<<@@[@->@@>@@+<@@@@@@@@@@@@@@@<@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@@>@@@@>>@>@>@@@@@@@@@@@@@@@@@@@@@@@@>%%%]%%%%%%%%%%<###**``*%@@<@@@#*`***``*%#``<``#@@@<%*``*#*``#<#%#`***``*<<#<%%%%+%%%%%%#####*<``*[%@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@[-@@@@>@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@<@@@@@<@@<[@@@@-@@@@@@@@>@@@>@@>@@@-@@@@@<@@@<@@@@<@@@@%#*##%%%%%%%%%@@@@@@@@@@@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@@@@@ +@@@@@@@@@@@@@<@@<@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@<@@@@@@<@@@@@@@@@@@@@+@@@@@@@>@@@@@@@@@@@@@>@@@@@@@>@>>@@@>@@>@@@@@@@@@@@@>@@>@@@>@@@@@@@@@@@@@@>@@[%%-%%%%%%%%%%%###>#>`+*%@%##*#<`*****`*****``*%@@@@<#``****]*`*#**###**`#%<%%%%%%%%%%%%%#####***]%%@@@@@@@@@@@@@>@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@-@@@@@@@@@@@@@>@@@@>@-@@@@@@@@@@<@@@@@@<@@@@@@<@@@@@@@@@@@@@@@@@<@@@@<@@@@@@@@<@<@@@@@@@@@@@@@@@@@<@@@@@@@<@@<@@@@@@@@@@@@<@@@<@@%%#<*+%%%%%%%@@@@@@@@@@@@@@@>@@@@@@@@>@@@@>@@@@@@>>@@@@@@@@@@@@@@@@@@>@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@>>@@@@@@@@@@@@@@@@>@@>@@@@@@@@@@@@@@]@@@@@@@@@@@@@@@@@<@@<]@@@@@@@@@@@@@@@@@@>@[@-@@@@@>>>@@@+@@@@@@@<@@@@@@@@@@@@<@@@%%%%%%%%[%%%%%##****-``#**``>>*-##<<***###*``*#*%@%*<**###**<`**<*##%<%%%%%<<%<%%<%%%%<<<##*`#%+%@@>@@@>@@@@@@@@@@@@@@@@@@@@@>@@@@@>@@@@>@@@@@@@@@@@@@@>@@@@@@>@@@@@@@@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@>@@@]@@@@@@@@<@@@]@@@@@@@@>@@@@@@@@[@@@@@@@@@@@@@-#>>*#%+%%%%%%@@@@@@@@@@@@@@@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@]@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@<@@@@@@<@@<@@@@@@@@@@<@@%<<%%%%%%%%%%#<#*``*````]`***]*####>#######***>>`##``*####*``**###%%%%%%%>%%[%%%%%-%%%]<%%<#<*##*##*#@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@]@@>@@>@@>@@@@@@@@@>@[@@@@@@@@@@@-@@@@@@@<@@@@@@@@@@@@@@@@@@@<@<@@@@@@@@@@<@@@@@@@@@@@@@@@@+@@@@>@@@@>@@@@@@@>@@@>]@@@@@@@@@@@<@@@@@<@@<*<[###%%%%%%%%-@@@@@@@>@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@@>@@+@@@@@>@@@@@@@@ +@@[@@@@@@@@@@@@-]@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@[@@@@@@@@@@-@@@@<@@@@@<@@@@@@@@@<@@@@@@@@@<@@@@<@@@@@<@<@@@@@@@@@+@@@@>@@@@@@>@@@@>@@@@@@@@@@@@@>@>%%>%%%%%>%###]#*<`****````###*<#%%%%%%#######<`******#<<###``**#%%%%%%%%%<%%%%<%%%%%%[%%%%%%##**```*#%@@@@@@@@-@>@@@@@@@@@@@@@@@@>@>@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@@@@@>@+@@@@@@@@@@@@@@@@<@@@@@@@@@@@@<@+@@@@<@@@@@@@@@@@@<@@<@@@@@@@@<<]>@>@@@@@@@>@@@@>@@@>@@@@@@***#>***>>%%>%%%[@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@>@>@@@@@>@@>@@@@@@@@@@>@@@@@>@@@@@@@@@@@>@@@@@@@@@@@@@]@@@@@@@@@@@@@<@@@@<<@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@<@@@@%%%%<%###*`****```**###[`>#%[%%%%%%%%%%%###***`*-*`*##%%%%%##>`*%%%%%>>%%>%%%%%%%%%%%%%%%%%%%###****`*#+@@@@@@<@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@[@@@-@>>@@@>@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<<@@@<@@@@@@@@<@<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@%*<*##**%%%%@<@@@@@@@@@@@<@<@@@<@<@@<@@@@@+@@@@@@@@@@@@@@@@@@@@@>@@@@@@@ +@@@>@@@@@@@@>@>@@>@>@>@@>@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@-@@@@@@@@@@@@@>>+@@<@@@@@@@@@@@@@@@<]@@@@@@@@@@%<%]%%%#*>*#[####-#%%%%>*#%>%%%%%%%%%-%%##`<*`**####%%%%%%%%%<#%%%<<%%%%<%%<%%%%%%%%%%%<%%%%%###**<#%@@@@@@<@@@@@<@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@+@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@@@@>>@@@@@>@@@@@@@@@@@@@@@@@@@>@@>@@@>@@@@@@@@@>@@@@@@@@@@@@@@>@@@@@@>@#****`*#*%@@@@@@@@@]@<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@]@@@@@@@@@@ +@@@>@[@@@@@@@@-@@@@@@>@@@@@@@@@@@@@@@@@>@@@@>@+@@@@@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@[@@@@@@@@@@-@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@%%%%%%#***#%%%%%%%%%%%%%*#-<%%%%%%%%%<%%#*`*<##%%%%%%%%%%<%%%%%%<%%%%%<%%<%%%<%%%%%%%%%%%%%%%#*****%@<@<%@@@@@@@@@@@<@@@@@@@@@@@<@<@@@@@@@@@@@@@@+@@@>@>@@@@@@@@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@>@@@@@@>@@@@@@@>@@@@@@@>@@@>>@@@@>@@@]@@<]@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@[@@@->@@@@#**```*##%@@@@@@@@@@@>@@+@@@@@<@@@@@@@@@@@@@@@@@@<@]@@@@<@@@@@@@@@@@< +@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@@@<@<@@@@<@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<<@@@@@<@@@@@@@@@@@@@@@@@@@]@@@@@@@@@]@%%###>**>#%%%%%%%%%%%>%>%%%%%%%%%%%%%%%%#*>>>>>[%>%%%%>%%%%%%%%%%%%%%%[%%%%%%%%%-%%%%]%%%%%%#*`*#####%%%*#@@@@@@@>@@@@@@@@[@@@-@@@@@@@@@@@@]@@@@@@@>@@@@@@@@@>@@@@>@@@@@@@>@>@>@@@@@@]@@<@@@@@@@@<@@@@@@<@@@@@<<@<@<@@@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@[@@@@@@@@@@@<@@<@<<@@@@@%`%@@@@@%**<**`***#*%@@@@<@@<@@@@@@@<@@@@@@@@<@@@@]@@@@@@@@@@@@@>@@@@@@@@@@@@@@@ +@@@@@@@@@@@>>@[-@@@@]@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@[@@-@@@@@@@@@@@@@@]@>@@@@>@@@@@@@@@>@@@>@>[@@@@@@@@>@@@@@>>@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@%%%%###*#%%%%>%%%%%%[-%%%%%%<%%<%<%%%%%%##*<***#%%%+%%%%>%%%%%%%%%%>%%>%%%%%%%>]%<<%%<%%%%%%#****<*``#**`*#@[@-@@@@@@@@@@@@@>@@@@@@@@@@@@@>>>+@@@@@@@<@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@+@@@@@<@@@]>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>@@@>@@@@@@@@@>@@@>@@@@@@>`**%#]#``*###*`*%%%%@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@<@<@@@@@@@@@@@@@@@@@@<@@@@@@< +@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@<@@@@@@@@[@<@@@@@@@@@@@@@@@<@@@@@@<@@<@@@<@@@@@<@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@<<]@@>@@@@@@@@@%%>%%#*##%%%%%%%%%%%%%%%%%%@@%%%%%>%%%%%%%%#>##>%%>%%%%%%%%%>%%%%%%%%%%%%>%>%%[%%%%>%%%%%%%%%%%#***`***>#%%%>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@>@@@@@>@@@@@[@@@@@@@-<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@<<@@@@@<@@@@+@@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@#******`***##>#***##%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@@@@]@@@@@@@@<@@@ +@@@@@@<@@@@@@@@@@@@<@@@@<@@@@<[@@@@@@@@@@@@@@@@@@-@@@@@@>@@@@>@@@@@@@@>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@>@@@@@@@@@@@@+@@@@@<@@@@@@@@@@@@@@@@@@@@<<@+@@@@@@@@@%%%%%<**#%<%]%%%%%>@@@@@@@@>@>@@@@@>>%%%%%#*>%>%%>%%%%@@@@@@@@]@@@@@@@@@@@@%%%%%%%%<%%<%%%%%%%%%##*####<<<`*%@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@<<@@[@@<<@@@@@@@@@@@@<@@@@@@<@@@@@<@@@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@<@@]>@@@@@>@@@>@@@@@@@@@@###*####*##>%%%%##***%@>@@@>@>@>@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@@ +@@@@@@@+@+@@+@@+@@@@+@++@@@@+@@@@@@@+@@++@@+@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@+@[@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@>@@@@>@>@@@@@@@@@@@>@>@@@@@%%%%%#*#%%>%%%%@@@@@@>@@@>@@@@@@@@@@@@@%%%%>%]%%+@@@@@@@@@@@@>@@@@[@@@@@@-]>@@@%%[%%%%%-%%%]%%%%%>%####**`*`*#%@@[@-@@@]@@@@@@>@@@@@@[@@@@-@@@@@@@@@@@@@@@@@@]@@>@@@@@@@@@@[@@@@@@@@@@-@@@@]>@@@@@@@@@@@[@@@@@@@@@@@@-@@@@@@@]@>@[@@@@-@@@@@]@>@@@@@[@@@@@@@@@@@@@@@@@@@#***###%%%%%%%%%-%%#*%]@@@@@@@@@@@>@[@@-@@@@@@@@@@@@]@@@@@@@@@@<@@@@@@@@@@<@@@@@@@@ +@@@@@@@@@@@@@@@@@@<@@@<@@@<@@@@@@<@@@@@@@@@@@<@@@@@@@<@@@@@<@@@@@@@@@@@@[<@@@<@@@@@<@<@@@@@@@@<@@@@@@@@@@<@@@@<@@@@@@@@@@@@<@@@@@<@@@@]@>@@>@@@@@>@@@@@@@%%%##*###%%%%@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@>@@@@@>@@@@>@@@@@@@@>@@@@@@@-@]%%%+%%[%%>+%%%%%%###*>#*%>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>@@@>@@>@@@@@@@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@]@@@<@@@@<@@@<@<@@@<@@<@@@@@@@@<@@<@@@@@@@@@<@@@@@@[<@@@<@<<@@@@@@@<@@@@<@@@@<<*<%%%%%]%>%%%%%>#>@@>@@@@@@@@@@@@@@@@@@@@@>>@@@@@>@@@@@@@@>@@@@@@@@@@@@@@>@@@@@ +@@@@@@@@@@@@@[@@@@@@>@@@@@@@-@@@@>@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>>@@@@@@@[-<@@@@@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@%##%>%%%%%%@@@@@@@>@@@@@@@@@@>@@@@@@@@>@@@@@@@]@@@@@@@@@<@@@@@@@@<@@@@@@@@@@@@@@@@@<%%%%%%%%%%<%%%%#*#**[#@@@@@@@@@@@@@@@->@>@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@+<@@@@@<@@@@<@@@@@@@<@@@@@@@@@@@@@@@<@@@@@@[@@@@@@@@-@>@@@@@@@@@*#%###>*%%%%%%%%%%%%%%@@@@@@@[@@@-@@@<@@@@@@@@@@@@@@@@@@@@@@@<@+@>@@@@@@@@@@@@@@@@@@@ +>@@@@@@@@]<@@<@@@@@@@@[@@@@@-@@@@@@@@@@@>>@@@@+@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@+@@@<@@@<<@@<@@@@@@@@@@@@@@@@@@@@@@@@@@]@@@+@>@@@@@@@@@>@@@@@@@@>>@@@@@%#%%%@%@@@@@@@@@@@@@@@@@@@@>>@>@@@>@@@@@>@@@@@@@@@@@@@@@@]@@@<<@@<@@@@@<@@@@@@@@@@<@@%%%%<%<%%%%%##**<`**%@@@@[@@*%@@<@<<@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<<@@@@@@@@@@@@]@@@@@@]@@>@@@@@@@>@@@@@@@@@@@@>@@@@#`**`***#%%%%>>>>>%@>@@@@@[@@@@@@@@@@@@@@@>@@@@@@@@@>@@@>@@>@>@@@@@@@@>@@@@@@@@>>@@@@@ +@@@@@@@@@>@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@<<<@@@@@<@@@@@<@<@@@@@@@@@@@@@@@<@<@@[@@@@@@@>[@@@@-@@@@>@@@@@@@@>@@@@@@@@@@@@@>@@@@@@@@@@@>@@@%%@>@@>@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@+@<<@@@@@@@@@@@@@@@@@@@@@@%%%%%%%<%#`****`##@%%@@@%#<*#@@<@@@@@@@@@@@@@@@<<@@@@@@<@@<@@@]@@@@@@@@@@@@@@@<@@@@@<<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@<@<@<@@@@@@@@@<@@@@@@<@@@@@@<@@@@@]@@@@@@@@@@@@@@@@@@@@###>*#[-#*%%%%%>%%%@>@@@@>@@>@@>@@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>+@<@@@@<@@ +@@@@@@@<@<@@@@@@<@@<@@<@@@@@@@<@@@@@@@@@@<@@@@]@@@@@@<@@@@@@@@@@@@@+@@@@>@@@@@@@@@@@@@@@>@@@@@@@@@>@@>@>@@@@@@@@@@@@@@@@>@@@@>@@@@>@@]@@@<@@@@@@@@@@@<@@@@@<@@@@@@@@@<@<@@@@@@@@@@@@@@@@<@@@@@@@@@@@@<@@@@@@<@@@<[@@>@@@[@@@@-@@@@@@@]@@@@<@@@@@@%%%%%%%%%#*`*###`**`*##**`*###@@@@-@@@@@@@@@@@>@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@[-@@@@@@@<<@@@@@@@@<<+@@@@>@@@@@@@@@[<@@@@@@-@>@@@@@-@@@@@@@@@%<`**<##%%%%%%%<%%%@@<@@@@<@@@@<+@@@@>>@@@@@@@@@@@@>@@@@@@>@@@@@@@@@@@@@@>@@@@@@@>@@]@@@< +@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@-@@>@@@@@@@@@@@@@@@@@@@+@@@@@@@<@]@@@@@>@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@>@>]@@@@@@@@@@@@@@@@<<@@@@@@@@@<@@@@@@@@@@@@@@[@@@@@@@@@-@@@@@@@@@@>@@@>@@@@@@@@@@@@@>@@@@@@+@@@@<@@<@<@@@@]@@@@<@@+<@@@@@@@@@<@@@@@%%%<%%#*`**`****`**********`#@@@@@@<@<@@@@@@@@@@@@@<@@@@@<@@@@@<@@@@@<@@@@@@@]@@>@>@@@@>@>@@@@>@@@@@@@@>@@@@@@>@@@>@>@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@>@@@@@+@@@@@@@@@>%>`**####%%%%%>%%%%%@@@@@@@@@@@@@@@@@>@@@>@>@@>@>@@@@@@@@@@@@@@]@@<@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@@@@<@<@@@<@@@@<@@@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@<@@@@@@@<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@<@@@@@<@@<@@@@@@@@@@<@@@@@@<@@@@@@@@@@@@@@@@@@@@@@]>@@@@@@@@>@@@@@@@@@@@@@@@%%%%%#>*#%#***>**#######**#%%%##@@@@@@@@@>@@>@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@@@@@@[@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@->@@>@@@@@@@@@@@@@@@@>@>*``*****#>[%%-%%%%%%@@@<@@@@@<@<@@@@@@@@@<@<@@@@@@@@@@@@@@@@@@@@@@@+@@@>@@>@@>@>@@@@>@@@@@]@ +@<<@@@@@@@@@@@<@@@@@<@@@@@<@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@-@@@@@@@@@@>>@>@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@+@@@@@@@@@@@@@@@@@@@<@@<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@@@@@@<[@@@@@@@@-@@@>@@@@@@@@@@>@@@@@@>@@[@@@@@@@@@@@-@@@@<%<%%%%%%<%#+``*#>####**##**`*>>]<@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@[@@@@@@@@@@@@@@-@@>@@@@@@@@@@@@@@@@@@@@@@>@>@+@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@%<#***###%<%%%%<<@@@@@@@@@@@@@@@@@@@@@@]+@@@@@@@@@@@@@@@@@@@>@>@@@@@@@@@@@@@@@@@@@@@@@@> +@@@@@@@@@@>@@>@@@@@@@@@@>@@>>@@@@@@@>@]@@<@@@@<@@<@@@@@@@@<@@@@@@@@@@<@@@<@@<@@@@@@@<@@@[@@@@@@@@@@@@@@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@<@@<<@@@@@@@<@@@@@@@@@@@@@@@@@@<@@@@@<@@@@<@@]@@@@@@@]@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@>@@@@@@>@@@@>@@@@%%%%%>%%>%#####%%%%%##>*****##`#%@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@[@@@@>@@>@@@@@@@@@@@@@@@@@@@>@@>@@@>@>@@@@@@@>@@@>@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@]`***`*#%%%%%@@@@@@@@<@@@@@@<<@@@@@@<<@@@@<@@@@<@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@[ +@@@@@@@@@@@@@@@@@@>@>@@@@@@[@-@@@@@@@@>@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@>@>>@@@@+<@@@@@@<@@@@@<@@@@@@@@@@@@@@<@<@@@@@@@@@@@@@@<@@@@@@<@@@@@@@<@<@]@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@@@@<@@@%%%<%%<%<%%%%%%%<%%%###<#**<````#%@@@@@@@@@@@@@]@@@@@@@@>@>@@@@@@@@@@@@@@@@@[@@@@@@@@-@@@@@>@@@>@@@@@@@@@@>@>>@@@@@@@@@@@@@@@>@@>@@@@@@@@@@@@@@@@>@@@@@@>@%@@+@<@@@@@@@@@%*`*`*#%%%<%@@@@@@<@@@<@@@@@<<@<@@@@@@@@@<@@@@@@@@@@@@@<@@@]<@@@@<@@@@@@@@@@@@+@@@@ +@@>>@@>@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@>@@@]@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@<@@@@@[@@@@@>@[@@@@-@@]@<@-@@@>@@@%%%%%%%%%%%%%%>%%%#####*****#%%%%@@>@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@[@@@-<<@@@@@@@@@@@@@@<@<@@@@@@+@@@@@@@@@@@@@@>@@@@@@[<@@@@@@-@@@@@@@@@@@@@@@@@@>#`@@@@@-<@@@@@@@@*`<****#%<%<@@@@@@<@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@+@@@@>@@>>@@@@>@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@>>@@@@@@@@@@@@@@@@]@@@@@@@@@@@@@@@@@<@@@@[@@@@@@@-@@@@@@>@@@@+<@@@@@@@@@]@@@@@@@@>@@@@@@@>@@@@@@@>@@@@@@@@@@>@@@@@@@@]@@<<@@@@<@@@@@@[@@@@@@@@@@@@@@-@@@@@@@@@@@@@>@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@+@<@@@@@@@@@@@<@@<@@@@@]@%%%%%%%%%%%%%%<%%##+***#%@@@<<@<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@<@@@@@@@@<@@@@@@@@@@@@@@@@@<@@@@@@@@]@@@@@@@@@@@@@@#*`*>>@@>@@@@@@@@@@*`>###>%%%%%%@@@@@@@@@@@>@@@>@@@@>@@@@@@>@@@@@@@@[@>@@@@@@@@@>@@>@@@@@@@@>@@@@@@[-< +@@@@<@<@@@@@@@@<@@@<@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@@@@@@@<@@@@@@<@@<@@@@<<<<@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<<@<@@@@@@@@@@@@@@@<<@<@@@@@@@@@<@<@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%<%%%%##**<***%<@@@@@@@@@@%#%@<@@@@@@@<@@<@@@@@@<@@@@@@@@@<@@@@@@@@@@@@@@@@+@@@>@>>@@@>@@@@@@@@@>@@>@@@@@@@@@@@@@@>>@@>@@@@@@@>@@@@@@@@##*``*%@@@@@@@@@@@@@#>>**##>%%%%%%@@@>@@@>@@@@@@@@@@@>@@@@>@@@@@>@@@@@@>@@@>>@>@>@@@>@@@@@@@@>>@@@@@@@@@ +@@@@@@@>@@@>@@@@@@@@@@@@@@@@>@>@@@@>@@@@@@@@>@@@@@@@@@@@>@@@@@@@@@@@@@@@>>@@@@@>@@@@@@]@@@@@@@@@>@@@@@>@@@@@>>@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@<<<@@@@<@<@%%%%%%%%%%%<#*`***#%@@@@@@@@@@@@@#`<%[@@@@@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@<@@@@%#*##*****##@@@@@@@<@@@@@@<``<###]#**#%%>@>@@@@@@@@@@@@>@@@@@@@@>@>@@@@@@@@@@@@@@@@@@@@@@>@>@@@@@@@@@@@@@@@@ +@@@@@@@@@@>@@>@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@+@@@@@+@@@+@@@@@@++@+@@@@@@+@@@@@@@@@@+@@@@@@+@@@@@@@+@@@@@@@@@@@@@@@@@@+++@+@@@@@[[@@>@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@>@@@@@>@@@@@@@@@@@@@@@@@@@@@@>@@@>@@@>@@@@]<<@@<%%<%%%%%%%%#*`*``*@@@@@@@@@@@@@%*`**%<%@@@@<@@@@@@@@@@@@@@@@@@@<<<@@@@-@<@@@@<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@*<**###<<`###%@@@<@%#*@@<%<`*[#**`<##%@@<@@<@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@@@@@@@@@@<@<@@<@@@@@@@<@@@@@@@ +@]@@@@@@@@@@@@>@@@@@@@@>@@@@@@@@@@@>@@@@>@@@@@@>>@@>@>>@@@-@@@@]@@@@@@@@@@@@@@@@@+@@@@@@@@>@@@@>@@>@@@>@@@@@@@@@@@@@@@@@@@>@@@@>@@@@@@@@>@@@@@@@@@@@@@>@@@@@@@@@@>@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@@@@@@@@>@@@@@@>>@@@@@@>@@@@@@@@>@@%%%%%%%%%%%>#****`*>%@@@@@@@@@@%#****#*>%@>@@@@@@@@@@@@@@@@+<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@[@@<<@@@@@@@@@<<@@@%%%`*#<%#*#####****<`%@#`**```*`<<*<`]`*#%%%%%@>@@@@@@@@@@@>>@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@ +>@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@>@@@@[@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@>@@[@@@@@@@@@@-@<@@@@@@@@@@<@@@@<@@@@-@@@@@@@>@@@@@@@@@@@@@@@@@@@@@>@@@>@@]@@@@+@@@@@@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<[@@@@@-@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@%%%%%%%%%%%###*>>*#%-@@>@@@@@[##******#%%*`-#<%@@@@@<@@@@@<@@<@@@@@@@@@@@@@@@+@@@@@@>@@@@@@@@@@@@@@@>@@@@@@@>@@>@@@@@@@@@@@@@@@%#``**]*<**##<%%#<###**<*`***#*`******```*###%%%@@@[@@@@-@@@>@@@>@>@@@@@@@@>@@@@@@@@+@@@@@@@@@@@@@<@<@@@@@@@@@@@<@@@ +@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@<@@@<@@<@@@@@@@@@@@@<@@<@@[@@@@@@<<@@@@@@@<@@@@@@@@@@@<<@@@@@@@@@@<@@@<@@@@@@@@@@<@<@@@]@@@@@@>@@@@@@@@@@>@@@@@@@@@@@@>@>@@@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%##*##*###***#@@@%##%-]%%*+>*####*>>**`*`*%>@@@@>@[@@@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@>@@@>>>@@@@@@>@@@>@]#%@@@@@%***#####%%%%%%%%%#**````*##>######+<]#]**+**#%@@@>@@>@@@@@@@@@@@@>@@@@@@@>@@@@@@@@@[@@-@@<<@@<<@@@@@@@-@>@@@@@@@@ +@@@@@@@@@@@@@@@@@@@>@>>@]@@@@@@@@+@<@@@@@@@@<<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@[@-@>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@-@@@@@@@<[@@@@@-@@@@@@@@@@<@@@<@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@@@>>@@@@>]@@<<@@@@%%%%#*<``*****``*####``*``[#``*##-#####>#**#%@@@@@>*>@@@+@<@@@<@<@<@<@<@@@@@@@@@@@@<@@@@@<@@<@@@@@@<<@@@<[@@@<@@<@@%%#%*`<%<@@@@#*<<##%%%%%<%%%%<#*`*#*`###%%%%%###``*%<%%%%##@@]@@@@@@@@@@@@@@@@@@@@>@@@@@@>@>@[@@@@-@@@@@]@@+>@@@>@@@@@@@@@@>@@@ +@@@@>@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@>@@@@@>>@@@@@@@@>@@@@@@@@@@>@@@@@>@@@@@@@>@@@@@@@@@@@@>@>@@@]@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@[@-@]@@@+<@@@@@@@]@]@@+@>@@@[@@@@@@@@-@@@@@@@@@@@@@@@<@@@[@@@>@@@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@@@@>@@>@@@@@@%%%%%#*#**`*```*#```**********>#>>%######>**#%@@@%*`*#**%@@%%@@@@@@@@]@@@@@@@@@@@@@@@@<@@@@@@@@@<@@@@@@@@<<@@<@#%@@%*<#****%%%@@*<**<#%%%%%%%%]%%%##%%>%%%%>%%%>%##*`*#%%>%%%%@@@@@@@@@@@>@@@@>@@>@>@@]@@@@@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@ +@@@@@@@@@@@@@@@@@@@<@@<@@@@@@<@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@<@@@@@@[@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@<@@@@<@@@@@@@<@@<@@@@@<@@@@@@@@<@@@@@@@]@@@>@@@>@@@@@@@@@@@@-@@@@@@@@>@@@@@@@@@@@@@@@@@@@@>@[-@@@@<@@<@@@<@@@<@@@+@@@@@@>%%%%>>##**``*```***###***`#%%%%%%%%%#****`*%%#`#*>**`*#]%#`**@@<<@%%@@@@@@@@@@@@<@@<@@@@@@@@@@@@@@[-%@%##@%*>`#%@#***##**#`**##`****%%%%>%%%%%%%%%%%%%%%%>%%%%#**#*>%%%+%@@@@@@@<@@@@@@@@<@@@@@@[@-]@@@@@@@@@@<@@@@@@@@<@@@@@@@@@@@@@@@@]@@>@@@@ +@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@]@@@<@@<+@@@@@@@@@@@@@@>@@>@@>@@@@@@@@>@@@@@@[@@@@-@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@<@@@@@@@-@@@@@>@@@@@@@>@@>>]@@@@@@@@@@@@@+@@<@@@@@@@@@@@@@<@@@@@@@@@@<@@@@@@@@@@@@@@@<@@@@@@@@@@@[@@@@@->@@@@>@@@@@>@@@%%%>%%##**`*`````**####%%%%-%%%%%%<%%<#*****%**`**##***#%****<#<`*<*<#*#*****.%%@@@>@@@@@%##*****>*#*`#]`*#>*****#>**#####***`*#*`*#%%%%%>%%%>%%%%[%-%%%%%%%%%%%#***#%%%%@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@<@@@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@@@@@@ +@@@@@<@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@@@@@@@>@@@@@@@@@@>>@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@]@@<@<@@@@@@@@@@@@<@@@@@@@@@[@@@@@@-@@]@@>@@@@@@@@@[@@@@@-@@]@@@@@@@@@@>@@@@@@@@@@@@@@@@[@@@@@@@-@@@@@@@@@@@@@@@@@@]@@@%%%###*>**##*`**[-*]##%%>%%%%%%%%%%%%%%##*[#*****#-###**#**##**]******````*>%[@@@@-@@@@@@@@@%#`````*****#**##]#****>#%%%>#*****>*[*#%%%%%%%%%%>%%%%[%%%%%-%%%%%%%#**##]>@@@@@@[@@@@@@@@@@@-@]@@@@@@@@@@@@@@@@@@@@@>@@[@@-]@>@@@@[@@-@@@]@@>@@@@@@ +@@[@@@@@@@@@@-@@@@@@@@@@@@@@@@@@@@]@@>@@[-@@@@@@@@@@@@@@@@]@>@@@@@@@@@@@@@@@@@@@@@>>@@]@@@@@@<@@@@@@@@@@@@@<@@@@<@@<@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@<<@@@<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@[@<@@@@@@@@@<<@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@%%<#*`*##%%#**####*`*#<%%%<%%]%%%%%%%%%#*`****`*##%%>###########>##*****>%@@@@@@@@@@@@@@@@@@@@@>#****############*#%%%%%%%%%##`>#%%>%%%%%%%@@@>@>@@@@@@@>@@%[>>%%%%#**#%@@@@@@@@@>@@@@@@@@@@@>@@@@>@[-]>@@@@@@>@@@@>@@@@@>@@]@<@@@@@<<@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@<<<<@@@@@@@@@@@@@@@@@@<@<@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@@@@@@<@<@@@@@@@@<@<@@]@>@@@@@@+@@@@@@@@+@@@@@@@@+@@@@@@++@@@@@@@@@++@+@+@@@@@@+@@@@@@@@@@@@@@@@@+@@@@[@@-@@@@@@@@@@@@[@@@-@>@@@>%####*%%%%%%>%>%>*`**#%%%%%%%%%%%%>%%%%##%%%%#%>%%%%%%>%%%######>#****+@@@@@@@@@@@@@@@@@@@@@@@@@<****#<####%%%%%%%%%<%%%%<%%#*#%%%<%%%@@@@@@@@@@@@@@@@@@<@@@%%%%<#<%%%%@@@@@@@<@@]@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@>@@@@>@@@@>@@@@>@@@>@@@ +@@@@@@@>@@@@@@@@@@@@@@@>@@>@@@@@@@]@@>@@@@@@>@@@@@@@@@@@@>@@>+@@@@@@@@@@>@@@@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@>@@@@>@@@@@@@@@@@@@@@@>@@@>@@>@@@@@@@@@>@@@@@@@@+<@@@<@@@@@@@@@@@@@<@@@@@@<<@@@@@@@@<@@@@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@<@@<@@@@@@@@@@@<@%@%<%%<%%%%[%%%#*#%%%%%%%%%%%%%%%%<%%<%%<%<<%%%<%%%%%%%<%%#####***#%@<@@<@]@@@@@@@@@@>@@@@@@@@@%***#####>%%>%%%%%>%%%>%%%%%%%%>%%>@@[@@@@@@@@@@@-@@@@@@@@<@@%%###%@@@<@@@@@<@<@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@<+>@@@@@@@@@@@@@@@@@>@>@@@@@@> +@@@@@@@@@@>@@>@@@@@>]@@@@@@@@@@@@<<@@@@@@<@<@@<@@<<@@@@@@@@@@@@@@@[@@@@@->@@@@@>@@@@>@@>@@@@@>@@@@@@@@@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@+@[@@@@@@@@-]>>@@[@@@@>@@@@@@@>@@@@@@@>@@@@@@@@@@@@@@>@@@@@@@@@>@@@@@@@@@@>@>@@@@@@@@@@@>@@@@@>@]@<@@<<@@<<@@@@@@@@@@@@@@@<@@@<@@@@@%%%%<%%%%%%<%%%%[>%%%%%%%%%%%%%%%%%%%%%>%%%%%%%%>##**>>*>@>@@@@@@@[@@@@-@@@@@@@<@@@@@@%#*<*<#%%%%%%%%%%%%%%<%%%%%%%%@@@@@@@<@@@@@@@@@@@@@@<@@+@@>@@%%@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@>@@@>@@@@@@@@@@@@@@@@@@@ +@@@>]@@@<@@<@@@<@@@@@@@<@@@@@@@@@@@@@<@@@@@@<@@@@@@[@@@@@@@@@@@@@@@@@@@@@@-@@@@@@>@@@@@@@@@@@@@>@@@@@@@@@@>>@@@@@@>@@@@>@@@@+@<@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@<@@@@@@@@@@@<@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@<@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@<<@@@@@@@@@@@@@@@%%%%%%%%%%%%%%<<%%%<%%<%]###`***%@@@@@@@@@@@@@@@>@@@@@@@>>@@@@>@*`**#>%%%%%%%>%%%%>%%%%%%%@@@@@@@@@@@@[@-@]@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@>@@@@@@@>@@@>@@@@@@@@@@@@@@@@@]@@@@@@<@@@@@@@@@<@@@@@@@@<@@@@@@@@@@@ +@@@@<@@@@@@@@@@@@@@<@<@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@<@@@<<@@@@]@@@@@@@]@@@@@@@@@>@@>@@@@>@@@@@@@@@@@@@>@@@@@@@@@@>@@@>@@@@>@@@@@@@@@@@@@@@@[@@-<@@@@@@@@@@@@@@<<@@@@<@@@@@@@@@@@@@@@@@@@@@@@<<@@<@@@@@@@@@@@@@@@@@@@+@@@@@@>>@@@@@>@@@@>@@@@@@@@@@@@@@@@>@>@@@@@@@@@@>@@@@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%%%%%%%%%%<%%<##*<``#@@@@@@@@@@@@@@@@@@@@<@@@@@@@<@@##*<*###%%%%<%%%%%%%%%[@@@@-@@@@@@@@@@@@@@@@>@@@@@@@@@@@>@>@@>@@@@@@>@@@@>@@@@@@>+>@@@@>@@[@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@>@@> +@@@@>@>@@@@@@@[@@@@-@@@@@@<@<@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@->@@@@@>@@@>>@]@@@@@@@@@@@<<@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@@[-@@@@>@@@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@+@@@<@@@@<@@@@@@<@@@@@@@@@@@@@<@@@@@@]@>@@>@@@@@@@@@>@@@@@@>@@@>@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@>%%%%%%%%%%%]%%##<<#***%%@@@@@@+@<@@@@@@@@@<@@@@@<<@@@<@<%***`*#%%%%%%%%%%<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>@@@>@@@@@@@@@@@@@>@@@>@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@ +@@@@@@@-@@@>@@@@@@@@>@@@@@@@@+@@@@@@@<<@@@@@@]<<<@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@@@<@@@@@<@@@@@@@<@<@@@@@@@@@<@@@@@@@@@@@@<@@@@@@@@<@@@@@<@@<@@@]@@@@@@@@@@>>@@@@>@@@@@>@@@@@@>@@@@@@@@@@@>>@@@@@@@@@@>@>@[@@@@@@@>@@@@@@@@@@@@>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@@@@@@@@@@@@>@@@@@@>@@@@@@@@@@@@@>@@@@@@>@]%<%%%%%%%%%%%#*`<***#@%@@@@@@@@@@@@@@<@<@@@@@@@@<@@@@<#```*`**#%%%<%%%%%@<@@@<@[@@@@@>@@@@@@@[@@@@@@@@@@@@-@@@@@@@@@@@]@@@@@@@@<@@-@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@>@@@>@@@@@@@@>@@@@@@@@@@@@@@>>@> +@@@@@@@@@@@@@@@[@@@@@@@@@@@-@@<@@@@@@@@@@@@@@@@@@<@@@@@@@@@<@<@<@<@@@@@@<@@@@@@@+@@@>@@@@@@@[<@@@-@@@@@@@@@@@@@@>@@@@@@@@@@-@@@@@@<@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@+@@@@@@@@>@@@>@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@]@@<@@@@[@@@-@@@@>@@@@@@@@@@@+@@<@@]@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@>@@@>@@@@@@@@@@@@@@@@@@@@@@>@@@@@%%%%%%%>%%>]#*````<`<@@<@<@@@@@@@@@@@@<<@@@@@@@@@@@%*`*****#[%-%>%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@>@@@@@@@@@@@@@>@@>@@@@@>@@@@@@@@@@@@@@@@@@@+@@<<@@@@@@<<@@@@@@@@@@@@<@@@@@@<@] +@@@@@@<@@@@@@+@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@<<@@@<@<@@<@@@@@@@@<@@@<@<@@@@@@]>@@@@@@@@@>@@@@@@@>@@@@@@@@@@>>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@>-@@<@@@@@@@<@<@<@@[@@@@@@@-@@@@@@@@@@@@@]+@@@@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@<@]@@@@@+@>@@@@@@@@@@@@>@>@@@@@@@@@@@@@>@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@%>[%-%%%%%%%#*****`*#@@<@@@@@@@@@@@@@@@@<@@<<@<@@@##*<*<#-%%%%>%>%%>@@@@@>@@@@>@>@@@@>@@@@@@]@@@@@@@@@+@@<<@<@<<@@@@@@@@<@@@@@<@[@@@@@-@@@@@@@@>@@@@@@@>@@@@@@@@@@@@@@>@@@@@@>@>@@@@@@@>@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@-@@@@@@@@@@@>@>@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@>>@@@@@@@@@@@@@@@@@@@>@>>@@@@@@@@@@@@@@@@@@@@@@@[@@@-@@@@@@@@@@@@>@@@@>@@@@@@@@@@@+@@@@@@@@@@@@@<@@@@<@@@@@@@@@]@@@@@@@@@@@@>@@@@@@>>@@@@@@@@@>@@]<<@<@@@@@@@@@@@@@<@@@@@@<@@@@@@@@@<@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@%%%%%%[%%%%>##***`*%@@@@@@@[@@-]@@@@<@@@@@@@@@@@@@%*`**#%%%%->%%%@>@@@@>@@@@@>@@@>@>@@@@>@@@@@@[@-@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@<@<@@@@<@@@@@@@@<@@@<@@@@@+@@@@@@>@@@@@[<-@@@@>@ +@@@@@@@@@-@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@@<+@@@@@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@>]@@<@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-@@>@@@@@@@@@@@@@@@@@@+@<@@@@@@@@@@@@@@@@@@@@@]@@@@@@@@>@@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@>@@@@@>@@@>@>@@@@@@@@@@@@@@@@@@@@@@@@]<@@@@@@@@<@@@@@@@@@@<@@@@@@@@@<@@@%%%%%%%%%<%%#<[`-%@@@>@@@>@@@@@>@@@@@@@@@@@@@@*#%%>*>`*#>##+%%<%<@@@@@@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@]<@@@@@@@@@@@@@@@@+@@<@@@@<@@@@@@@<@@@@@@@@@@ +@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@@@<<@@@@@]@@@@@@@@@@@@@@@@@>@@@@+@@@@@@@@@@@@@@@@@@@@+@+@@@@@@@@@@@@+@@@@@@@+@@[@@@@@@@-@@@@[@@@@@@@@@@@@@@@-@@@@@@@>@@@>@@@@@>@@@@@@@@>@>@@@@@@@>@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@+@@@@@@@<@@%%%%%<%%%%##``*#%<@%*<@@@@@@<@@@@@@@@@<@@@@%*<`````*``**`*<%%%<]@@>>@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@>@@@@@>>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@]@@>>>@@@@>@@@@@@@@@@@@@@@@@@ +@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@@<@@@@@<@@@@<@@@[@@@@@@@@@@@@@<@@@@@@<@@@@@<<@@@@@@@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@]@@>@@@@@@@@@@@>@@@@@@@@@@@@>>@@@@>@@@@@@@@@@@@@@>@>@@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@@@[@@@@@@@@@@>@@@@@@@>@@@@@@@@@@>@@@@@@>@@>%%%%%##%###[`**``*```*%-@@@@@<@@@@@@@@@@##%*****##*<`*<*%%%%%@@@<@@@@@@@@@@@@@@@@@@@<@@@@@@@@@->@@@>@@@>@@@@@>@@@@>@@@@@@@@@@@]@@@@@@+@@@@@@@@@@@<@@@@@<@@@@@@<@@@<@@<@@@@@@@@@[@@@@@@@@@@@@ +@@@->@@@@@@@@@@@@@>@@@@>@@@@@@@>>@@@@-@>@>@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@-@@@@<@<@@@@@@@<@@@@@@@@@@@@<@@@<@@@@@@<@@@<@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@>@@@>@@@@@@@@@>@@>@>@@@@@@@>@@@@@@@@@@@]@@@@<@@@@<@@@<@@@@@@@@@@<@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@<@@<[@-@@@@@@@@@@@@>@@@>@>>@>@@@>@@@@@@@>@@@@@%%+%##<***##*``***`***`##`#%%%%@@@@@%#*<*```<*#<###*`**#%%%%%%@@@@@@@@@@@@@@<@@@@@@@@@@@@@@<<@@@@@@@@@@<@@@@@<@@@@@@@<@@@@@@<@@@@@@@@@@@@@@@@@@<<@@@<@@@@@@@@@@@@@@@@<<@@@@@@@@@@@@@@@@[@<@@@ +@@@@@@<@<@@@@@@@@@<@@@@@@@@@@@<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<<@@@@@]@@>@>@@>@@>@@@@@@[@@-@@@@@@@@@]@@@@@@@@+@>@@@>@@@@@@@@@@@@@@@>@@@@>@>[@>@@@@@@@>>>@@@@@@@@>@>@@@@@>@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@]@@@@@@@@@>@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@<@@]@@@]@@@@@+@@@>@@@@@@@@@@@@%%##**#*`*````>#####*``>`*```#@@@>@@%*``*>**#######*`*>*#%%%@@@@@@@@@@@@@@>@@[@@@@@@@@@@@@@@@@@@@@@@@@@-@@@@@@@@@@<@@<@@@@@@@@@@@<@<@@<@@@@@<@<@-@@@@@@@@@@@@@@@@@>>@@@>>@@@@@@@@@@@@@@@@@@> +@@@>@>]@@@@+@@@@@<@@@@@@@<@@@@<@@@@@@@<@@@@@@@@@@@@@@@@@@@<@<@@@<@[@@@@-@@@>@@@>@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@-@<@@@@@@@@@@<@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@-@@<@@<@@@@@<@@@@@@@@@@@@@@<@@@<@@@@@+@@@@@@@>>@@>@>@@@@@@@@@@@@@@@>@@@@@@@@]@@%<%%%<%<###*``##<<#*#**[**`*@@@@-@@>#``*###>%%%%%>##%#**>%%>@@@@@@@@@@@@@@@@@@@+@@@@@@@<@@@@@@@@@@@<@@@@<@@@@@@<@<@@@@@<@@@@@@<@<<@@@@@@@@<@@@@@@<@@@@@@@@@@@@@@<@@@@@@@@@@@@<@@<@@@@@@@@@@ +@@@@@@@[@@@@@<@@@@@@<@@@<@@<<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@<<@@@@<@@@@@@@@@@@@@@@@@@@@@@@@]@@@@@@@@@@@@@@>>>@@@@[@@@@@@@@@-@@@@@]@@@@+@@@@>@@@@@@@@@@@@@@@>>@>@@@@@@@@@@@@>@@@>@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@>@@>@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@>@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@%%>%%%>%%*`**#]%%%%####>*`*%@@@@@@@#``*#[#%%%%-%%%%%]##%%@@@+@@@@@<@@@@]@@@@]@@@@@@+@@@@>@@[@@@@@-@@@@@<@@@[@>@@@@>@@>@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@@@@@@@@@@@>@@@@@>>@@@@@@@@@ +@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@<@@@@@@<@@@@@@@@@@@@@<@@@@<@@<@<]@>@@@@>@@@@@@>@>@@@>@@@>>@@@@@@@@@>]@<@@@@<@@@@<@@@@@@@@@<@@@@@@@@<@@@@<@@<<@@@<@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@<@<@<@@@@@@@@@@@@@@<@@@@@@@@@<@@@@@@@@<@@@@@@@@@<@@<@@@@@@@<@]@@@@@@@@>@>@@@@@@@@@>@@@@@@@@@@@@@@>@@@@@@@@[@@@@@@@@-@@@@@@@%%%%%%%]*%%%%%%%%%####*``**#%@@#*`*<`*<#%%%%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@<@@@+@@@@@@@@@@@@@@@@+@@++@@@@@+@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@-@@@@@@@@@@@@[@@@->@@@@@@@@@@@@@@>@>>@@@@@@@@> +@@@>@>@@>@@@@>@@+@@<@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@<<@@@@@@@@<@@@<@@@@@@@@@@@@@@@@<@@@@@@@@@@@<@@]@@@>@@@@@@@>@@@@@@@@@@@@>@@@@@>>@@>@@@>@>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@]@>@>@>@@@@@>@@@@-@@@@@@@@@@@@<@@@@@<@@@@@@<@@@@@@@@@@<<@@@@@@[<@@@@@@@<<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@%%%%%%%%%%%%%%%#*````*`<`*%#``*<*``*%<%%%%<%]%]%@@@@>@@@@@@@>@@@@@@>@@@@]@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@.>@@@>@@@@@@@@@ +@@@@@@>@@@@>@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@>@@@@@>@@@>@@@@>@@@@@@@@@[@@>@>>@@@>@@>@>[@@@@@@@-@@]@@@@@>@>@@@@@@@@@@>@@@@@@@@]<@@@@@@@<@@@@@@@@@<@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<<@@@@@@@@@<<@@<@@@@@@@@@@@@@@@@@@@@@@@[<@@@@<@@@@@<@@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@@<@@@<@@@<@@@<@@@@@@@@@]@@@>@@@@%%++%%%%%%%%%###+*`##**````**#+##*#%%%%%%%%+@@@+@@+@@@@@@@@@@@@@@+@@@@@@@@+@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@-@@@@@@@@@@@@@@@@@[@-@@@>>@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@@> +>@@@@@@@@@>@@>@>@@@@+@@@@@@<@@@@@@@@@@<@@@@@<@<@@@@@@@@@@<@@@@<@@@@<@@@@@@@@@@<@@@@@<]@>@@@@@@@@@@>@@@@@@@@@@@@@@@>@>>@@@>@@@@@@@@@@@@@@@@@@@@>>@@@@@@@@>@@@@@@@@@]@@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@>@@>@@@@@@>@@@@@+@@>@@@@@@@@>@@@@@@@@@@@@>@@@>@>@>@@@@@@@@@@@@@@@@@@@@@@>@@@>@@@@@@@@@>@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@<@@@%%<<<%%%%%%%<%####<**`*<**<<<%%%%<%%%%%<@<@@@@@@@@@<@@@@@@@<@@[@@@@@@@<@@@@@@@<@@<@@@@<@<@@@@@@@@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@<@@<@@@@@@]@@@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@> +@@@@@@@@@@@>@@@@@@@@@@@@>@@@@@@@@@@@@@>@@@@@@@@@@@>@>@@@@@@@[@-@@@@@<@@@@@@@@<@@@@@@@@@@<@@@@@@@@<@<@@@@<@@<@@@<+@@@@>@@@>@@@@@@@@@@@@@@@@@@@@>>@>@@@>>@@@@@@@@>@@]@@@@@@<<@@@@@@@@@@@<@@@@@<@@<@@@@@@@@<@@@@@@@@@@@@<@@@@@@@@@@@<[@@@@@@@@@@@@-@@@@@@@@@>@@@>@@@@>>@@@>>@@@>@>@@+@@@@@@@@@@@@[@@@@-@@@@@@@@]>@@@@@[>@@>@>@@@@@@@@@@@@%%>%%%%%%%%%%%%##*``*``*##%%%>%>>>%%%>@@@@@@@]@@<@@@@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@<@@@@@<@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@<@@@@@<@@@@@[@@@@@@@@>@>>@@@>@@@@@@@ +@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@@@@[@@@@@-@@@<@@@@@<<@@@<@@@<@@<@<@@@@@@@@+@@@>@@@@@@@@@>@@@@@@@@@@@@@@@>@@@@@>@@@>@@@@>@@@@@>@@@@@@@@@@@@@@@@@@@]@@@<<@@@@@@@@@@@@@@@@@<@@@@@@@@@<@<<@@<@@[@@@@@-@@@@@@@@>@>>@@@@@@@@>@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@%%%%%%+%<%%%%%###*``##<%%<%%%%%%%%@@@<<@@@@@<@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@[@@@@@@@@@@@@<<@@@<@@@@@@@@@@<@@@@@@@<@@<@@@@@@@<@@@@@@@<@@@@@@@@<@@@@@@@]@@@@@@@@@@> +>@@@@@@>@@>@@@@@@@@>@@@@@@>@@@@@@@@@>@@@>@@@[@@-@@@@@]@@@@@@@@@@@@@@@@@@@@+@@@@@@@@>@@@@@@@@@>@@@@@@@@@@@@@]@@<@@@@@@@@@@@@@@@@<@@<@@@@@@@@@@<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@<<@@<@@@@@@@@@@@@]@@@@]@@@@@@@@@@@@@@@@>@@@@@@@@@@@@>@@@@@@@>@@@@@>@@@@@@@@@@@@@@@>@@@@@>@>@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@-@@@@@%%%%<%%%%%%%%<###*<*#<<%%%%%%%%%%%@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@@+@@@@@>@@@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@>@@@@@@@>@@@@@@@@@@>@@@@@@@ +@@@@@@@@@@>]<@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@<<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@[@-@@@@@@@@@@@@>@@@>@>@@@@@@@@@@>@@@@@@@@@@@@@@@@@>>>@@@@@@@@@@@>@@@@+@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@[@@@@@@@@@@@@@>@@@@@@+>@@@@@@@@@@@@>@@@@@>@@@@@@@@@>@@@@@@@@@@@@>@[-@<<@@@@@@@@@@@@@@@<@@@@@@@@@@@@@<@@@%%%%%%%%%%%%##*<***`*-*#%%%%%%%%%@@@>@@@@@@@@@@>@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@@@@>@@@@@@@@@@]@@@@@@@@@@<@@@@@@@@@@@<@@@@@<@<@@@<@[->@@@@@@@@@@@@@@>@>@@@@@@@@@@>>@@@@@ +@@@@@+@@@@@@@<@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@@@@@@@@@@@@@@@@@<@]@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@>>@@@@@@@>@@@@@>>>>@@@@@@@@@]<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@<@@@@<@@@@@<@@<<@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@@<@@@[@@@@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@>@@>@@@@@@@@@@>@>[@@@@@-@@@@@@@@@@>>@@@@@%%%%%%%%%#+#*`*###<**<*####%%%%%]<@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@@@@@@@<@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@@@<@<@@@@@@<@<@@@@@@@@@@@@@@@@@@@@<<@@@@@@@@@ +@@@@@@@@<@@@@@@@@@@@@@<@@]@@@>@@@@@>>@@@@@@@>@>@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>@@@@>@@@@@@@@[>@@@@>@@@>@@@@@@@@@@@>@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@>@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@]@@<@@@@@@@@@@@@@@@<@@@<<@@@@@@@@@<@@@<@<<<@@@@@@@@@@@@@@@@@@@@@@@[@@@>@[@@-@@@@@]@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@-@>@@@@@@@@@@@@>%%%%>%%%%#*>`*#%%%%%%#*******#%%>@@@@>@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@@@@@@@@@@[-@@@@@@<@@@@@@@@@@@@@@<@@@@@<@<@@@@@@@@@@@@<@@@@@@@@@@<<@@@@@<@@@@@@+@@@@>@@@@@@[@@@@@@ +@@@@@<@@@@@@@@@@@@@@@@@-@@@>@@@@@@@@@@@-@@@@@@@@@@@@@@@@@@<@@@<+@>@@@>@]@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@[@-@>@@@@@@@@@@@+@@@@@@@@@@@@<@@@]>@@@@@@@@@@@@@@@@@@@>@@@@>@@@@@>>@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@>@@@@@>@@@@@@@@@@@@@@@@@@@@@]@<@<@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@<@@@@<@@@<[@@@@@@-@@@@@@@@@>@>@@>@@@@@@@@@@@@@@%%>%>%%>%#***#%%%%%>%%#%%+##<##%%%@@@@@@@@@@@@<@@@@@@@@<@@@@@@@@<<@@<@@@@@@@@@@@<@@@@@]@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@<@@@@@@@@@@<@@@@@@@@@@@@@@ +@@@@@@@@@@@<@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@<@@@<<@@@@@@@@<]@@>>@@@@@@@@@@@@@@@@@@@@>>@@@@>@@>@@@>@@@@>@@@-@@@<@@@@@<@@@<@@@@@@@@@@<@@@@@<@@@@@@@@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@-@@@@@]@@+@@@@@<@<@@@@@@<@@@@@@@@]@@@@@@@+@@@@@>@>@@@@@@@@>@@@@@@@@@@@@@@@@@@@>@>>@@@@@@@>@@@@@@>@@@@[-@@@@<@@<<@@@@@@@@@@@@@@<@@@@@@@@<@@@%%%<%%%%#<`#%%<%%%%%%%%%%%%%-*#%%%@@@@@@@@>@@@>@@>@@@>@@@@@@>@@@@@@@@>@>>@]@@@@@@@@@@@@@@@+@@@@<@@@@@@@@@@<@@@@@@@@@<@@@@@@@<@@@@<<<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[@@@ +@@@@@@@@@-@@@>@@@@@@@@@@@>@@@@@>@>@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@@@@@>@@-@@@@@@>@@@@@@@@@@@@@@@@@@@@[@>>@@@@>@@@@@@@@@@@@@@@>@@>@@@>@@@@@@@@@@@@@@@@@@@@[@-@@@@@@@@@>>+@@<@@@@@@@<@@@@]>@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@]@@@@@@@@<@@@@@@@@<@@@@@@@@@@@@@@@<@@@@<@@@<@<@@@<<@@@@<@@@@@@%%%#*##*#**###%[%%%%%%%%>%%%%%##%@@@@@[@@@@@@@@@-@@@@@@@@]@@@@@@@@@<@@@@@@@@-@>@@@@@@@@@@>>@@>@@@@@@@>@@@@@@@@@@@@@>@@>@@@@@@@@>[@@@@@-@<@@@@@@@@@@@@@@@@@@@<@@@<@@@@@@<@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<<@@@@@@@@@@@@@@@@@<@@@+@@@@>@@@@@@@@[@@@@@@@<@@@@@@@-@>@@@@-@@@@@@<@<@@@+>@@@@@@@@@@@@@@@@>@@@@@@@@]@@@@@@@@@@@@<@@@@@@@@@[-@@@@>@@@+@@@@@@<@@@@@@@@@@@@@@@@@]@@@@@@>@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@@@@@@@>@@@@@@@>@>@@@@@@@@>@@@@@@@@@@@]@@@@@@@@@@@@@@@@@@@@@<<<@@@@<@@@@@@@@@@@@@@<<@@<[@-%>%%%#`>%*#%%%%%%%@@@@@@@@@@@%%#%@>>@@@@@@@@@>@@@>@@@@>@+@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@@@@@@<@@<@@@@@@@<<@@<@@@@@@@@@@@@@]@@@@@@@@@@@<@+@@@@@@@<@@@@@@@@@@@@@<@@<@@@@@@<@ +@@@@@@@@@@@@<@@@<@<@@@@@@@@@@<@@@@@<@@@@@@@@@@@@]@@@@@@@@@>@+@@@@@@++@@@@@@@@@@@@@@@@@@@@@@@@+@@+[@@@-@@@@@@@@@@@[@@@-@@@@@@@@@@>@@>@@@@>@>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@>@@@@@@@@@@@>@@>>@@@@@@@@@@+@@@@<@@@@<@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@<@@@@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@<@@@@@@@@@@]@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@%%>>%#**#*#%%>%@@>@@@@@@@@@@@@>@@@@@@@@@>@@@>@@@@@@@>@]@>@@@@@>@@@@@@@@@@@@>@>@@@>@@@@+@@@@@@>>@@@@@@@@@@@@@@>@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@@@@>@@@@@@@@@@@@@@@@@>@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>>@>@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>>@@@@@@>@@@@@>@@@@@>@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@>@@@@>@@@>@@>@@@@@@@@@@@@@@@@@@@@@>@@@@@>@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@+@<@@@@@<<@@@@@@@<@@@@@@<@@@@@<[@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@<@@<%%##*#%%%%%%%@@@@@<@@<@@<@@<@<@@<@@@@@@@@@@@@@@@@@]@@@@@@@@@@@@>@@@@@@@@>@@>@@@@>@@@@@@@>@>@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@>>@@@@@@@@@[@@@@@@@@@@@@@>>@@@@@@@@>@@@>@@@@@@ +@@@@@@@@@@@@@@@@@@>@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@[@@@@@-@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@<<@@@@@@<@@@@-@@@@@>@@@@@@@@@@@@@>@>@@>@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@>@]@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@<@@@@@@@%%%%%*#%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@[@@@-@@@@@@@@>>>@@>@@@>@@@@@@@@@@@>@@@@@@@@@@@-@@@@>>@@@@@@@@@@[@-@@<@@@<@@@@@@<<@@@@<@@@@@@@@@@@<@@<@@@@@@@@@@@@<@+@@@@@>@@@@@@@@@@@ +@@@@@@@@>@@@@@@@@@@@@>@@@>@@>>@@@@@@@@@@@@@>@>@@@@@@@@@@@@@@@@@@@@@@]<@@@@@@@@@@@@<<@@@@@@@@@@@@<@@@@@@@@@@<@@@@@@@<@@<@@@@<[@@@@@@-@@@@@@@@@@@@@@@>>@@>@>@@@@>@@@@@>@@@@@@@@@@@@@@@>@>@@@@@@@@@@+@@@@@@<@@@@<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@@@@@@@@<@@@@<@@@@@@<@@@@@@@@@<@@<@@@<@@@@%%%%%#*%%<%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@<@@@@@@<[@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@<@@@@@@@<@@@@@@ +@@@@@@@@@@@@@@@<<@@@@@@@@@@@@<<@@@@<@@@]@@@>@>@@@@@@@@@@@@@@@@@@@@@@>@>@@@@@@@@@@[@@@-@@@@@@@@@@@@@@@@@@@@@@@@@]@@@@@@@@@@+@@@>@@>@@@@@@@@@>@@@@@@@@>@@@@@@@@@@@@@@>[>@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@>@@@@>@@@@@>@@@@@@@@>@@@>@@@@>@@@>@@]>@@@@+@@@@@@@@@@@@<@@@@@]@@@@@@@]@@@@@@@+>@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@>@@@>@>@>@@@@@@%%%%####%%>@@@@@@@@>@@@@@[@@@-@@@@@@<<<@@@@@@@@<<@@@@@@@@@@<@@@<@@@@<@@@->@@@@@@@@@@@@@@@@@@@@@@@@@@>@>@@@@@@@@>@@>@>@@>@@@@>@@@@]@@@@@@@@@@@@@+@@@@@@@@<@@@@@<@@@@@@@@@@@@ +@@@@@@@@@@@<@@@@@@@@@@@@@@@<@@@@@@@@@<@@@<@@@@@<@@@@@@@<@[@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@>@@@@@@@>@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@>@@-@@@@@@@@@@@@@@@@@@@@@@<@@@<@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@-@@@@@@@@@@@<@@@@@@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@<@@@@@@@@%%###%%%%#%%@@@@@@@@@@@<@@@@@@@@@@@@+@@@@>>@@@>@@@@@@@@@@@@@@@@@@@@>>@@@>@@@]@@@@<@@@@@@@@@@@@@@<@@@@@@<@@<@@@@@@@@@@@@@<@<@@@[@@@@@@@@@@@@@@@-@@@@@>@@@@@@@@@@@@@@@@@@@@@>@ +@@@@@@>@@@@@@@@@>@@@@@@@@>@@@@@>@@@@+@@@@@@<@@@@<@@@@@@<@@@@@@@@<@@@@@@@@@@@@@<@@@@@@@@<@@<<@@<@@@@@@@@@@@@@<@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@<<@@@@@@@@<@@@<@@@@@@[@@<@@@@@@@@@@<@@<@@@<@@@@@@@@<@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@@@@@@]@@@@@@@@@@@@@@@@@@@>@@@@>>@@@[@-@@@]@@@@@@@+@@@@>@@%%%#%%@@@@@%>@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@>>@@@@@@@@@@@>@@@@@@@@@@[@@>>@@@@@@@@@>@@@@@@>@@@@@@@>@>@@>@@@@@@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@@@@]@@@@>@@@@@@@@@@@@@@@@@@@@[ +@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@]@@@@@@@@@@@@@+@@<@@@@@@@@@@@@@@@@@@@@@]@@@@@@@]@@+@@@@@@@@@@@@>@@@@@@@@@@[@@-@@@@@@@@@@<@[@@@>@@@>@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@>>@@@@@@@>@>@@@>@>@@]@@@@<@@@@@@@@@@@<@@@@@@@@@@@@<@@<@@@@@@@@@@@@@@@<@@@@@@@<<@<@]@@@@>@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@>>@@@@@@@@@@@@@@>@>>>@@@@@@]@@@@@@<<@@%@<%@@@@@@@@@@<@@@@@@@@@@@<@@@<<@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@[@@@@@<@<@@@@@@@@@@@@<@<@@@<@@@@@@@@@@@@<<@<@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@]@@@@ +@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@@@@@@@@>@@@@@@@@@@>@@[-@@@]@<@@@@@@@@<<@@@@@+@@@@@@@+@@@@@@@@@@@@@+@@@@@@@+@@+@@[@@@@@-@@@@@@@@@@@@@@@@[@@@-@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@>>@@@@@@@@>@@>@@@@@>@@>@@@@@@@@@@@@@@@@@@@@>@@@@@+@@@@@<@@<@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@<@@@@@@@@@@@<<@@@@@<@@@@@@@@@@@@@@@@<@@@<@@@]@@@@@@@@@>@@@@>@@@@@@@@@@@@@>@@@@>@@@>@@@@@@@@@@@@@@@@@@@>@@@@@@>@@@@@@>@>@@@@@@]@>@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@>@@>@@@@@@@@@@@@@>-@@@@@@@@@@@@@>@@@@@@>@@@@@@@@@@ +@>@@@@@@>@@@@>@@@@@@@>@@@@@@@>@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@>@@@@@@@>@@@@@>@@@>>>@@@@@@@@@>@>@>@@@@@@@>@@@@@@@>@@@@@@@@@@@@@@@>@@@@@>@@>@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@>@@@@@@@@@@@@>-@@@@<@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@<@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@<@@@@@@@@@@@@@@@@[@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@@@@@@@@@@@@<@@@@@<@@@@@@<<@@@@@@@@@@@@@<@@@@@@@@@@@@@@@<<<@]@@@@@@@@@@]@@@@@>@@@@@@@@@@@@@@@@@@>@@>@@@@]@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@ diff --git a/tests/advanced7.rs b/tests/advanced7.rs new file mode 100644 index 0000000..4b4ddca --- /dev/null +++ b/tests/advanced7.rs @@ -0,0 +1,66 @@ +extern crate rustijvm; + +use std::io::{SeekFrom, Seek, Read}; + +#[test] +#[ignore] +fn advanced7() { + let output = rustijvm::stubs::output_stub(); + let mut machine = rustijvm::Machine::new_from_file("files/advanced/mandelbread.ijvm").unwrap(); + machine.set_output(output.clone()); + machine.run().unwrap(); + + let expected = vec![ + " ", + " ", + " ", + " t` ", + " `':``'t@ ", + " ``':L:`` ", + " `t:':C@@8t'`` ", + " `'f@@@@@@@@@@L` ", + " ``0@@@@@@@@@@@'` ", + " ::`'8'```''''':tf@@@@@@@C:'''`'`` `` ", + " `fG@@G@::f@@@@@@@@@@@@@@@@@@@G@8:'`L''':'` ", + " ``'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f@@@@8:@ ", + " ``:::@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f` ", + " ``:8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L`` ", + " 't`` `t`` ```'@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:8`", + " `:tGt0:'':fG0:C'````''tC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G` ", + " ```:f@@@0@@@@@@@@Gt:::t@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@t'' ", + " ```C:GC@@@@@@@@@@@@@@@@f8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:' ", + " 'C''::t0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f'` ", + " ` ```':L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f` ", + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L:'` ", + " ` ```':L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f` ", + " 'C''::t0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f'` ", + " ```C:GC@@@@@@@@@@@@@@@@f8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:' ", + " ```:f@@@0@@@@@@@@Gt:::t@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@t'' ", + " `:tGt0:'':fG0:C'````''tC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G` ", + " 't`` `t`` ```'@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:8`", + " ``:8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L`` ", + " ``:::@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f` ", + " ``'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f@@@@8:@ ", + " `fG@@G@::f@@@@@@@@@@@@@@@@@@@G@8:'`L''':'` ", + " ::`'8'```''''':tf@@@@@@@C:'''`'`` `` ", + " ``0@@@@@@@@@@@'` ", + " `'f@@@@@@@@@@L` ", + " `t:':C@@8t'`` ", + " ``':L:`` ", + " `':``'t@ ", + " t` ", + " ", + " ", + ]; + + let mut outbuf = output.lock().unwrap(); + let mut actual = String::new(); + + outbuf.seek(SeekFrom::Start(0)).unwrap(); + outbuf.read_to_string(&mut actual).unwrap(); + + for (line, (act, exp)) in actual.lines().zip(expected).enumerate() { + assert_eq!(act, exp, "mismatch on line {}", line + 1); + } +} +