Commit d27d91fe authored by Erwan Jahier's avatar Erwan Jahier

lurette 0.72 Tue, 23 Jul 2002 16:58:52 +0200 by jahier

Parent-Version:      0.71
Version-Log:

sim2cro.ml:
   switch inputs and output in the sim2chro display. The rational
   is that local vars, are closer from ima outputs than sut ones.
   and should then be displayed close to them.

gen_stubs.ml:
   indent generated code better.

Project-Description: Lurette
parent 562a6ed5
......@@ -5,7 +5,7 @@
# For updates see:
# http://miss.wu-wien.ac.at/~mottl/ocaml_sources
#
# $Id: OcamlMakefile 1.31 Fri, 19 Jul 2002 17:31:37 +0200 jahier $
# $Id: OcamlMakefile 1.32 Tue, 23 Jul 2002 16:58:52 +0200 jahier $
#
###########################################################################
# Set these variables to the names of the sources to be processed and
......@@ -473,6 +473,8 @@ pncl: profiling-native-code-library
###########################################################################
-include /home/jahier/lurette/VERSION
# Generates emacs tags
tags:
......@@ -502,6 +504,12 @@ yvan:
$(LURETTE_PATH)/make_lurette heater Heater_vrai; \
./lurette 50 1 1 Heater.env \
vroum:
../make_lurette ControleurPorte vrai_tram nc; \
/usr/bin/time -v ./lurette 10000 1 1 tram.env usager.env porte.env \
passerelle.env -seed 1015403953 -ns2c --no-oracle
time:
make clean; ../make_lurette ControleurPorte vrai_tram nc; \
\rm -f time.res; touch time.res ; \
......@@ -533,8 +541,8 @@ time:
# Non regression test
test:
../make_lurette ControleurPorte; rm -f tram.rif; touch tram.rif; \
./lurette 100 10 10 -o tram.rif tram.env usager.env porte.env passerelle.env -seed 1013219512 -ns2c ;\
diff -u ControleurPorte.rif.exp tram.rif > test1.res ;\
./lurette 100 10 10 -o ControleurPorte.rif tram.env usager.env porte.env passerelle.env -seed 1013219512 -ns2c ;\
diff -u ControleurPorte.rif.exp ControleurPorte.rif > test1.res ;\
\
../make_lurette heater_int; rm -f heater_int.rif; touch heater_int.rif; \
./lurette 30 10 10 temp_int.env --no-oracle -seed 1013219512 -ns2c -o heater_int.rif ;\
......@@ -645,7 +653,9 @@ release:
$(LURETTE_PATH)/source/show_env.mli $(LURETTE_PATH)/source/show_env.ml \
$(LURETTE_PATH)/source/sim2chro.mli $(LURETTE_PATH)/source/sim2chro.ml \
$(LURETTE_PATH)/source/env.mli $(LURETTE_PATH)/source/env.ml \
$(LURETTE_PATH)/source/lurette.mli $(LURETTE_PATH)/source/lurette.ml lurette-release/source/ ;\
$(LURETTE_PATH)/source/lurette.mli $(LURETTE_PATH)/source/lurette.ml \
$(LURETTE_PATH)/lurette.prj \
lurette-release/source/ ;\
cp $(LURETTE_PATH)/OcamlMakefile lurette-release/ ;\
cp $(LURETTE_PATH)/Makefile lurette-release/ ;\
cp $(LURETTE_PATH)/test/usager.env lurette-release/test/;\
......@@ -667,7 +677,7 @@ release:
cp $(LURETTE_PATH)/bin/Makefile.show_ima lurette-release/bin/ ;\
cp $(LURETTE_PATH)/bin/Makefile.gen_stubs lurette-release/bin/ ;\
cp $(LURETTE_PATH)/bin/Makefile.ima_exe lurette-release/bin/ ;\
tar cvfz lurette.tgz lurette-release/*
tar cvfz lurette$(VERSION).tgz lurette-release/*
###########################################################################
# LOW LEVEL RULES
......
;; -*- Prcs -*-
(Created-By-Prcs-Version 1 3 3)
(Project-Description "Lurette")
(Project-Version lurette 0 71)
(Parent-Version lurette 0 70)
(Project-Version lurette 0 72)
(Parent-Version lurette 0 71)
(Version-Log "
sim2cro.ml:
switch inputs and output in the sim2chro display. The rational
is that local vars, are closer from ima outputs than sut ones.
and should then be displayed close to them.
automata.ml,mli:
env.ml,mli:
ima_exe.ml,mli:
lurette.ml,mli:
Fix a bug where the control expr were evaluated twice, which
migth produce strange behavior whenever a CS var was drawn to 0
in the place, and a value different from 0 in the second place.
The fix consist in attaching the control.state at automata.t leaves,
instead of the control expr labels (which was a bit silly BTW).
gen_stubs.ml:
indent generated code better.
show_env.ml:
Fix a small bug in the dot output.
")
(New-Version-Log "")
(Checkin-Time "Mon, 22 Jul 2002 16:51:44 +0200")
(Checkin-Time "Tue, 23 Jul 2002 16:58:52 +0200")
(Checkin-Login jahier)
(Populate-Ignore ())
(Project-Keywords)
......@@ -51,10 +45,10 @@ show_env.ml:
(source/env.mli (lurette/15_env.mli 1.15 644))
(source/env.ml (lurette/16_env.ml 1.29 644))
(source/util.ml (lurette/35_util.ml 1.21 644))
(source/util.ml (lurette/35_util.ml 1.22 644))
(source/solver.mli (lurette/38_solver.mli 1.13 644))
(source/solver.ml (lurette/39_solver.ml 1.24 644))
(source/solver.ml (lurette/39_solver.ml 1.25 644))
(source/rnumsolver.mli (lurette/b/26_rnumsolver 1.3 644))
(source/rnumsolver.ml (lurette/b/27_rnumsolver 1.6 644))
......@@ -81,18 +75,18 @@ show_env.ml:
(source/automata.ml (lurette/b/47_automata.m 1.2 644))
(source/sim2chro.mli (lurette/b/23_sim2chro.m 1.4 644))
(source/sim2chro.ml (lurette/b/24_sim2chro.m 1.8 644))
(source/sim2chro.ml (lurette/b/24_sim2chro.m 1.9 644))
(source/gne.mli (lurette/b/36_gne.mli 1.2 644))
(source/gne.ml (lurette/b/37_gne.ml 1.2 644))
(source/gen_stubs.ml (lurette/24_generate_l 1.26 644))
(source/gen_stubs.ml (lurette/24_generate_l 1.27 644))
; little script that sets env vars and starts the lurette build
(make_lurette (lurette/27_make_luret 1.13 744))
(make_lurette (lurette/27_make_luret 1.14 744))
;; Make files
(OcamlMakefile (lurette/17_OcamlMakef 1.31 644))
(OcamlMakefile (lurette/17_OcamlMakef 1.32 644))
(Makefile.lurette (lurette/b/38_Makefile.l 1.4 644))
(bin/Makefile.show_ima (lurette/b/40_Makefile.s 1.4 644))
......@@ -133,9 +127,9 @@ show_env.ml:
(test/vrai_tram.c (lurette/b/8_vrai_tram. 1.3 644))
(test/tram_simple.h (lurette/b/25_tram_simpl 1.1 644))
(test/heater_int.rif.exp (lurette/b/28_heater_int 1.4 644))
(test/ControleurPorte.rif.exp (lurette/b/29_Controleur 1.5 644))
(test/heater_float.rif.exp (lurette/b/30_heater_flo 1.3 644))
(test/heater_int.rif.exp (lurette/b/28_heater_int 1.5 644))
(test/ControleurPorte.rif.exp (lurette/b/29_Controleur 1.6 644))
(test/heater_float.rif.exp (lurette/b/30_heater_flo 1.4 644))
(test/heater_int.lus (lurette/b/43_heater_int 1.1 644))
(test/heater_float.lus (lurette/b/44_heater_flo 1.1 644))
(test/test_gen_stubs.h (lurette/b/45_test_gen_s 1.1 644))
......
......@@ -39,7 +39,7 @@ case $# in
echo "... make"
shift 1
make $@ dc
make $@
;;
##############################################################
*)
......
......@@ -178,22 +178,22 @@ and
find_var_list reg str var_name_e ((var_name, var_type)::vars)
with _ -> (vars, sptr)
let _ = match (get_vn_and_ct_list "../test/test_gen_stubs.h") with
(m, lin, lout) ->
assert(
m = "test_gen_stubs" &&
(Util.list_are_equals lin ["attention_depart", "_boolean";
"porte_ouverte", "_boolean";
"en_station", "_boolean";
"demande_porte", "_boolean"]) &&
(Util.list_are_equals lout ["depart_imminent", "_boolean";
"porte_demandee", "_boolean";
"accepter_demande", "_boolean";
"depart", "_boolean";
"attention_depart_a_retentit", "_boolean";
"porte_ok", "_boolean";
"ouvrir_porte", "_boolean";
"fermer_porte", "_boolean"]))
(* let _ = match (get_vn_and_ct_list "../test/test_gen_stubs.h") with *)
(* (m, lin, lout) -> *)
(* assert( *)
(* m = "test_gen_stubs" && *)
(* (Util.list_are_equals lin ["attention_depart", "_boolean"; *)
(* "porte_ouverte", "_boolean"; *)
(* "en_station", "_boolean"; *)
(* "demande_porte", "_boolean"]) && *)
(* (Util.list_are_equals lout ["depart_imminent", "_boolean"; *)
(* "porte_demandee", "_boolean"; *)
(* "accepter_demande", "_boolean"; *)
(* "depart", "_boolean"; *)
(* "attention_depart_a_retentit", "_boolean"; *)
(* "porte_ok", "_boolean"; *)
(* "ouvrir_porte", "_boolean"; *)
(* "fermer_porte", "_boolean"])) *)
(****************************************************************************)
......@@ -321,9 +321,9 @@ let (generate_stub_c: module_name -> string -> vn_ct list -> vn_ct list -> unit)
put "\n" ;
put "// Step \n" ;
put ("void " ^ str ^ "_step(") ;
List.iter (fun (v, t) -> put (t ^ " " ^ v ^ ", \n\t")) vi ;
List.iter (fun (v, t) -> put (t ^ " " ^ v ^ ", \n\t ")) vi ;
List.iter (fun (v, t) -> put (t ^ " *" ^ v ^ "_ptr, ")) vo_pre ;
List.iter (fun (v, t) -> put (t ^ " *" ^ v ^ "_ptr, \n\t ")) vo_pre ;
put (lo_t ^ " *" ^ lo_v ^ "_ptr) \n{\n");
List.iter
......@@ -340,15 +340,15 @@ let (generate_stub_c: module_name -> string -> vn_ct list -> vn_ct list -> unit)
put "\n" ;
put "// Try \n" ;
put ("void " ^ str ^ "_try(") ;
List.iter (fun (v, t) -> put (t ^ " " ^ v ^ ", \n\t")) vi ;
List.iter (fun (v, t) -> put (t ^ " " ^ v ^ ", \n\t ")) vi ;
List.iter (fun (v, t) -> put (t ^ " *" ^ v ^ "_ptr, ")) vo_pre ;
List.iter (fun (v, t) -> put (t ^ " *" ^ v ^ "_ptr, \n\t ")) vo_pre ;
put (lo_t ^ " *" ^ lo_v ^ "_ptr) \n{\n");
put (" " ^ mod_name ^ "_copy_ctx(prg_copy, prg);\n") ;
put (" " ^ str ^ "_step(") ;
List.iter (fun (v, t) -> put (v ^ ", ")) vi ;
List.iter (fun (v, t) -> put (v ^ "_ptr, ")) vo_pre ;
List.iter (fun (v, t) -> put (v ^ ", \n\t ")) vi ;
List.iter (fun (v, t) -> put (v ^ "_ptr, \n\t ")) vo_pre ;
put (lo_v ^ "_ptr); \n");
put (" " ^ mod_name ^ "_copy_ctx(prg, prg_copy);\n") ;
put "}\n" ;
......@@ -373,7 +373,7 @@ let (generate_idl : module_name -> sut_or_oracle -> vn_ct list -> vn_ct list
let put s = output_string oc s in
let ov = List.rev vo in
let (lo_v, lo_t) = List.hd ov in
let vo_pre = List.tl ov in
let vo_pre = List.rev (List.tl ov) in
put ("// Automatically generated file from " ^ mod_name
^ ".h by bin/gen_stubs.\n") ;
......@@ -699,7 +699,7 @@ let (generate_lurette_stub_file: vn_ct_mlt_fvn list * vn_ct_mlt_fvn list -> unit
put " [" ;
put (format_string_list "; \n\t " vn_val_in) ;
put "] \n\t -> (" ;
put (format_string_list ", " fvnl_in) ;
put (format_string_list ", \n\t " fvnl_in) ;
put ")\n";
put " | [] -> (" ;
put_fake_value (List.hd sut_in) ;
......@@ -727,12 +727,12 @@ let (generate_lurette_stub_file: vn_ct_mlt_fvn list * vn_ct_mlt_fvn list -> unit
fvnl_out;
put "\tmatch (" ;
put (format_string_list "_found, " fvnl_out) ;
put (format_string_list "_found, \n\t " fvnl_out) ;
put "_found) with \n (";
put (format_string_list ", " fael_out) ;
put (format_string_list ", \n\t " fael_out) ;
put ")\n\t -> (" ;
put (format_string_list ", " fvnl_out) ;
put (format_string_list ", \n\t\t" fvnl_out) ;
put ")\n | _ -> assert false \n" ;
put " )\n" ;
......@@ -741,7 +741,7 @@ let (generate_lurette_stub_file: vn_ct_mlt_fvn list * vn_ct_mlt_fvn list -> unit
(* Ditto, but the other way around *)
put "let (sut_out_to_env_in: sut_out -> env_in) =\n" ;
put " fun (" ;
put (format_string_list ", " fvnl_out) ;
put (format_string_list ", \n " fvnl_out) ;
put ") \n ->\n\tlet tbl = create " ;
put (string_of_int (List.length fvnl_out));
put " in\n";
......@@ -764,10 +764,10 @@ let (generate_lurette_stub_file: vn_ct_mlt_fvn list * vn_ct_mlt_fvn list -> unit
put " versions of sut_try, sut_step, etc.\n *) \n\n";
put ("let (sut_try: Formula.subst list -> Formula.env_in) = \n") ;
put " fun input_sl ->\n let (" ;
put (format_string_list ", " fvnl_in) ;
put (format_string_list ", \n\t" fvnl_in) ;
put ") = subst_list_to_sut_in input_sl in \n" ;
put " let output_tuple = Sut_idl_stub.sut_try " ;
put (format_string_list " " fvnl_in) ;
put (format_string_list " \n\t" fvnl_in) ;
put " in \n" ;
put " sut_out_to_env_in output_tuple \n\n" ;
......@@ -777,10 +777,10 @@ let (generate_lurette_stub_file: vn_ct_mlt_fvn list * vn_ct_mlt_fvn list -> unit
*)
put ("let (sut_step: Formula.subst list -> Formula.env_in) = \n") ;
put " fun input_sl ->\n let (" ;
put (format_string_list ", " fvnl_in) ;
put (format_string_list ", \n\t" fvnl_in) ;
put ") = subst_list_to_sut_in input_sl in \n" ;
put " let output_tuple = Sut_idl_stub.sut_step " ;
put (format_string_list " " fvnl_in) ;
put (format_string_list " \n\t" fvnl_in) ;
put " in \n" ;
put " sut_out_to_env_in output_tuple \n\n" ;
......@@ -791,15 +791,15 @@ let (generate_lurette_stub_file: vn_ct_mlt_fvn list * vn_ct_mlt_fvn list -> unit
put ("let (oracle_try: Formula.subst list -> Formula.env_in -> bool) = \n") ;
put " fun sut_input sut_output -> \n";
put " let (";
put (format_string_list ", " fvnl_in) ;
put (format_string_list ", \n\t " fvnl_in) ;
put ") = subst_list_to_sut_in sut_input in \n" ;
put " let (";
put (format_string_list ", " fvnl_out) ;
put (format_string_list ", \n\t " fvnl_out) ;
put ") = env_in_to_sut_out sut_output in \n" ;
put " Oracle_idl_stub.oracle_try " ;
put (format_string_list " " fvnl_in) ;
put (format_string_list " \n\t" fvnl_in) ;
put " " ;
put (format_string_list " " fvnl_out) ;
put (format_string_list " \n\t" fvnl_out) ;
put "\n\n" ;
(*
......@@ -808,15 +808,15 @@ let (generate_lurette_stub_file: vn_ct_mlt_fvn list * vn_ct_mlt_fvn list -> unit
put ("let (oracle_step: Formula.subst list -> Formula.env_in -> bool) = \n") ;
put " fun sut_input sut_output -> \n";
put " let (";
put (format_string_list ", " fvnl_in) ;
put (format_string_list ", \n\t " fvnl_in) ;
put ") = subst_list_to_sut_in sut_input in \n" ;
put " let (";
put (format_string_list ", " fvnl_out) ;
put (format_string_list ", \n\t " fvnl_out) ;
put ") = env_in_to_sut_out sut_output in \n" ;
put " Oracle_idl_stub.oracle_step " ;
put (format_string_list " " fvnl_in) ;
put (format_string_list " \n\t" fvnl_in) ;
put " " ;
put (format_string_list " " fvnl_out) ;
put (format_string_list " \n\t" fvnl_out) ;
put "\n\n" ;
(*
......@@ -987,7 +987,7 @@ let (gen_a_fake_oracle : string -> unit) =
put " by bin/gen_stubs. \n" ;
put "\n";
put "node always_true(";
put (format_string_list "; " vn_lt_str_l) ;
put (format_string_list "; \n\t" vn_lt_str_l) ;
put ") returns (ok:bool);\n";
put "let \n ok = true ; \ntel\n";
......
......@@ -28,10 +28,10 @@ let (put_var_decl: string -> ssl -> ssl -> ssl -> out_channel -> bool -> unit) =
put ("#program \" " ^ title ^ " \"\n");
put "#@inputs\n";
List.iter put_vntl sut_input_var_name_and_type_list;
List.iter put_vntl sut_output_var_name_and_type_list;
put "@#\n#@outputs\n";
List.iter put_vntl sut_output_var_name_and_type_list;
List.iter put_vntl sut_input_var_name_and_type_list;
if display_local_var then
List.iter put_vntl local_var_name_and_type_list;
......@@ -46,13 +46,14 @@ let (put_current_step_values: out_channel -> int -> env_out -> env_in -> env_loc
put (string_of_int t);
put "\n";
List.iter
(fun (_, e) -> (print_var_value rif e))
(Util.sort_list_string_pair input);
put "#outs ";
Hashtbl.iter
(fun _ e -> (print_var_value rif e))
output;
put "#outs ";
List.iter
(fun (_, e) -> (print_var_value rif e))
(Util.sort_list_string_pair input);
if display_local_var then
List.iter
......
......@@ -75,7 +75,7 @@ let rec (formula_to_bdd : env_in -> formula -> Bdd.t * bool) =
| Bvar(vn) ->
( match (lookup input (Env_state.pre ()) vn) with
Some(B(bool)) ->
if bool
if bool
then (Bdd.dtrue (Env_state.bdd_manager ()), true)
else (Bdd.dfalse (Env_state.bdd_manager ()), true)
| Some(_) ->
......@@ -178,15 +178,15 @@ and
( match (lookup input (Env_state.pre ()) str) with
Some(N(I(i))) ->
(GneMap.add
(NeMap.add "" (I(i)) NeMap.empty)
((Bdd.dtrue (Env_state.bdd_manager ())), true)
GneMap.empty
(NeMap.add "" (I(i)) NeMap.empty)
((Bdd.dtrue (Env_state.bdd_manager ())), true)
GneMap.empty
)
| None ->
(GneMap.add
(NeMap.add str (I(1)) NeMap.empty)
((Bdd.dtrue (Env_state.bdd_manager ())), false)
GneMap.empty
(NeMap.add str (I(1)) NeMap.empty)
((Bdd.dtrue (Env_state.bdd_manager ())), false)
GneMap.empty
)
| Some(N(F(f))) ->
print_string ((string_of_float f)
......@@ -263,7 +263,7 @@ and
gne
in
gne
and
(gne_to_bdd : Gne.t -> comp -> Bdd.t * bool) =
fun gne cmp ->
......
......@@ -118,7 +118,7 @@ let rec (list_iter3: ('a -> 'b -> 'c -> unit) -> 'a list -> 'b list
(f e1 e2 e3);
(list_iter3 (f) t1 t2 t3);
)
| _ -> failwith ("*** Error: list_map3 should be called with lists "
| _ -> failwith ("*** Error: list_iter3 should be called with lists "
^ "of the same size.\n")
......
#program " lurette chronogram ( passerelle.env porte.env usager.env tram.env) "
#@inputs
baisser_pass:bool
fermer_porte:bool
ouvrir_porte:bool
porte_et_pass_ok:bool
rentrer_pass:bool
@#
#@outputs
debut_ramassage:bool
demande_pass:bool
demande_porte:bool
......@@ -10,210 +17,203 @@ pass_rentree:bool
porte_fermee:bool
porte_ouverte:bool
@#
#@outputs
baisser_pass:bool
fermer_porte:bool
ouvrir_porte:bool
porte_et_pass_ok:bool
rentrer_pass:bool
@#
#step 1
f f f f t f f t t #outs f t f f f
f t f f f #outs f f f f t f f t t
#step 2
t t f f f f f t f #outs f t f f f
f t f f f #outs t t f f f f f t f
#step 3
f t f t t f f t f #outs f t f t f
f t f t f #outs f t f t t f f t f
#step 4
t f t f f f t t t #outs f f t t f
f f t t f #outs t f t f f f t t t
#step 5
f t t t f f t f f #outs f f f f f
f f f f f #outs f t t t f f t f f
#step 6
f f t f f t f t t #outs f f f f f
f f f f f #outs f f t f f t f t t
#step 7
t t t t t f t t f #outs f t t t t
f t t t t #outs t t t t t f t t f
#step 8
f t t t t f f f f #outs f t f f t
f t f f t #outs f t t t t f f f f
#step 9
t t t t t f t f f #outs f t f f t
f t f f t #outs t t t t t f t f f
#step 10
f f f f f f f t t #outs f t f t f
f t f t f #outs f f f f f f f t t
#step 11
t t f t t f t t f #outs f t f f f
f t f f f #outs t t f t t f t t f
#step 12
t t f t f f f t f #outs f f t t f
f f t t f #outs t t f t f f f t f
#step 13
f f t f f t t t f #outs t f f t f
t f f t f #outs f f t f f t t t f
#step 14
t t f f f f t f f #outs f t f f f
f t f f f #outs t t f f f f t f f
#step 15
f t f f f f t t t #outs f t f t f
f t f t f #outs f t f f f f t t t
#step 16
t f t t f t t t t #outs f t f f f
f t f f f #outs t f t t f t t t t
#step 17
f f t t t f f t f #outs f t f f t
f t f f t #outs f f t t t f f t f
#step 18
f f t t f f f t f #outs f t f f f
f t f f f #outs f f t t f f f t f
#step 19
t f t t t f t f f #outs t f f f f
t f f f f #outs t f t t t f t f f
#step 20
t t t f f f t t f #outs f t f f f
f t f f f #outs t t t f f f t t f
#step 21
f t f f f f f t f #outs f t f f f
f t f f f #outs f t f f f f f t f
#step 22
t f t f t t t f f #outs f t f f f
f t f f f #outs t f t f t t t f f
#step 23
t f t f f f t f t #outs f t f f f
f t f f f #outs t f t f f f t f t
#step 24
f t t t t f t t f #outs f t f t f
f t f t f #outs f t t t t f t t f
#step 25
f t f t t t t t t #outs t f f t t
t f f t t #outs f t f t t t t t t
#step 26
t t t t t f f t t #outs f f t t t
f f t t t #outs t t t t t f f t t
#step 27
t f t f f f t t f #outs f t f t f
f t f t f #outs t f t f f f t t f
#step 28
f t f f f f t t f #outs f t f t f
f t f t f #outs f t f f f f t t f
#step 29
t f f f t t t t t #outs t f f t t
t f f t t #outs t f f f t t t t t
#step 30
t f t f f t f t f #outs f f f t f
f f f t f #outs t f t f f t f t f
#step 31
t f t f f f t t f #outs f t f t f
f t f t f #outs t f t f f f t t f
#step 32
t f f t f f f t t #outs f t f f f
f t f f f #outs t f f t f f f t t
#step 33
t t f t f f f t f #outs f f t t f
f f t t f #outs t t f t f f f t f
#step 34
t t f t t f t f f #outs f t f f t
f t f f t #outs t t f t t f t f f
#step 35
f f t t f f t t f #outs f t f t f
f t f t f #outs f f t t f f t t f
#step 36
f t f t f f t t f #outs f t f t f
f t f t f #outs f t f t f f t t f
#step 37
f f t f t t t f f #outs t f f f f
t f f f f #outs f f t f t t t f f
#step 38
f f t t t f f t t #outs f f f f f
f f f f f #outs f f t t t f f t t
#step 39
t t t f t f t t t #outs t t f f t
t t f f t #outs t t t f t f t t t
#step 40
f t f t f f t t f #outs f t f t f
f t f t f #outs f t f t f f t t f
#step 41
f t f t f f f t f #outs f t f t f
f t f t f #outs f t f t f f f t f
#step 42
t t t t f f f f f #outs f f t f f
f f t f f #outs t t t t f f f f f
#step 43
f t t f f t t f f #outs t f f f f
t f f f f #outs f t t f f t t f f
#step 44
t f t f f t t t f #outs f t f t f
f t f t f #outs t f t f f t t t f
#step 45
f f t f f f t f f #outs f t f f f
f t f f f #outs f f t f f f t f f
#step 46
f t f t t f t t f #outs f t f f f
f t f f f #outs f t f t t f t t f
#step 47
t f t t f f t f f #outs t f f f f
t f f f f #outs t f t t f f t f f
#step 48
f f t t t t t t f #outs f f f f f
f f f f f #outs f f t t t t t t f
#step 49
t t f t f f t t f #outs f t f f f
f t f f f #outs t t f t f f t t f
#step 50
t f t t f f f f f #outs f t f f f
f t f f f #outs t f t t f f f f f
#step 51
t t f t t f t t f #outs f t f f f
f t f f f #outs t t f t t f t t f
#step 52
f t t t f f t f f #outs f t f f f
f t f f f #outs f t t t f f t f f
#step 53
f f t t f f t t f #outs f t f f f
f t f f f #outs f f t t f f t t f
#step 54
t t t t t f t f t #outs f t f f t
f t f f t #outs t t t t t f t f t
#step 55
f t f t f f t f f #outs f t f f f
f t f f f #outs f t f t f f t f f
#step 56
t t t f f f f t t #outs f t f f f
f t f f f #outs t t t f f f f t t
#step 57
t f t f f f t t f #outs f t f f f
f t f f f #outs t f t f f f t t f
#step 58
t t t f t f t t f #outs f t f f t
f t f f t #outs t t t f t f t t f
#step 59
f f t t t f f t f #outs f t f f f
f t f f f #outs f f t t t f f t f
#step 60
t f t f t f f f f #outs f t f f f
f t f f f #outs t f t f t f f f f
#step 61
f f t t f f t f f #outs f t f f f
f t f f f #outs f f t t f f t f f
#step 62
t t f f t f t f f #outs t f f f f
t f f f f #outs t t f f t f t f f
#step 63
t t t f t f f f f #outs f t f f f
f t f f f #outs t t t f t f f f f
#step 64