%------------------------------------------------------------------------------ % File : Prover9---1109a % Problem : MGT071+1 : TPTP v9.3.0. Released v9.3.0. % Transfm : none % Format : tptp:raw % Command : tptp2X_and_run_prover9 %d %s % Computer : n002.cluster.edu % Model : x86_64 x86_64 % CPU : Intel(R) Xeon(R) CPU E5-2620 v4 2.10GHz % Memory : 8042.1875MB % OS : Linux 3.10.0-693.el7.x86_64 % CPULimit : 300s % WCLimit : 300s % DateTime : Wed Apr 29 02:10:26 PM UTC 2026 % Result : Theorem 0.45s 1.06s % Output : Refutation 0.45s % Verified : % SZS Type : - % Comments : %------------------------------------------------------------------------------ %----WARNING: Could not form TPTP format derivation %------------------------------------------------------------------------------ %----ORIGINAL SYSTEM OUTPUT % 0.00/0.12 % Problem : MGT071+1 : TPTP v9.3.0. Released v9.3.0. % 0.12/0.13 % Command : tptp2X_and_run_prover9 %d %s % 0.15/0.34 % Computer : n002.cluster.edu % 0.15/0.34 % Model : x86_64 x86_64 % 0.15/0.34 % CPU : Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz % 0.15/0.34 % Memory : 8042.1875MB % 0.15/0.34 % OS : Linux 3.10.0-693.el7.x86_64 % 0.15/0.34 % CPULimit : 300 % 0.15/0.34 % WCLimit : 300 % 0.15/0.34 % DateTime : Tue Apr 28 18:38:31 EDT 2026 % 0.15/0.34 % CPUTime : % 0.45/1.05 ============================== Prover9 =============================== % 0.45/1.05 Prover9 (32) version 2009-11A, November 2009. % 0.45/1.05 Process 31337 was started by sandbox2 on n002.cluster.edu, % 0.45/1.05 Tue Apr 28 18:38:32 2026 % 0.45/1.05 The command was "/export/starexec/sandbox2/solver/bin/prover9 -t 300 -f /tmp/Prover9_31183_n002.cluster.edu". % 0.45/1.05 ============================== end of head =========================== % 0.45/1.05 % 0.45/1.05 ============================== INPUT ================================= % 0.45/1.05 % 0.45/1.05 % Reading from file /tmp/Prover9_31183_n002.cluster.edu % 0.45/1.05 % 0.45/1.05 set(prolog_style_variables). % 0.45/1.05 set(auto2). % 0.45/1.05 % set(auto2) -> set(auto). % 0.45/1.05 % set(auto) -> set(auto_inference). % 0.45/1.05 % set(auto) -> set(auto_setup). % 0.45/1.05 % set(auto_setup) -> set(predicate_elim). % 0.45/1.05 % set(auto_setup) -> assign(eq_defs, unfold). % 0.45/1.05 % set(auto) -> set(auto_limits). % 0.45/1.05 % set(auto_limits) -> assign(max_weight, "100.000"). % 0.45/1.05 % set(auto_limits) -> assign(sos_limit, 20000). % 0.45/1.05 % set(auto) -> set(auto_denials). % 0.45/1.05 % set(auto) -> set(auto_process). % 0.45/1.05 % set(auto2) -> assign(new_constants, 1). % 0.45/1.05 % set(auto2) -> assign(fold_denial_max, 3). % 0.45/1.05 % set(auto2) -> assign(max_weight, "200.000"). % 0.45/1.05 % set(auto2) -> assign(max_hours, 1). % 0.45/1.05 % assign(max_hours, 1) -> assign(max_seconds, 3600). % 0.45/1.05 % set(auto2) -> assign(max_seconds, 0). % 0.45/1.05 % set(auto2) -> assign(max_minutes, 5). % 0.45/1.05 % assign(max_minutes, 5) -> assign(max_seconds, 300). % 0.45/1.05 % set(auto2) -> set(sort_initial_sos). % 0.45/1.05 % set(auto2) -> assign(sos_limit, -1). % 0.45/1.05 % set(auto2) -> assign(lrs_ticks, 3000). % 0.45/1.05 % set(auto2) -> assign(max_megs, 400). % 0.45/1.05 % set(auto2) -> assign(stats, some). % 0.45/1.05 % set(auto2) -> clear(echo_input). % 0.45/1.05 % set(auto2) -> set(quiet). % 0.45/1.05 % set(auto2) -> clear(print_initial_clauses). % 0.45/1.05 % set(auto2) -> clear(print_given). % 0.45/1.05 assign(lrs_ticks,-1). % 0.45/1.05 assign(sos_limit,10000). % 0.45/1.05 assign(order,kbo). % 0.45/1.05 set(lex_order_vars). % 0.45/1.05 clear(print_given). % 0.45/1.05 % 0.45/1.05 % formulas(sos). % not echoed (41 formulas) % 0.45/1.05 % 0.45/1.05 ============================== end of input ========================== % 0.45/1.05 % 0.45/1.05 % From the command line: assign(max_seconds, 300). % 0.45/1.05 % 0.45/1.05 ============================== PROCESS NON-CLAUSAL FORMULAS ========== % 0.45/1.05 % 0.45/1.05 % Formulas that are not ordinary clauses: % 0.45/1.05 1 (all X -less(X,X)) # label(irreflexive) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 2 (all X all Y all Z (less(X,Y) & less(Y,Z) -> less(X,Z))) # label(transitive) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 3 (all X all Y (less(X,Y) | X = Y | less(Y,X))) # label(trichotomy) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 4 (all X all Y (leq(X,Y) <-> less(X,Y) | X = Y)) # label(leq_def) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 5 (all X all Y (leq(X,Y) & leq(Y,X) -> X = Y)) # label(leq_antisym) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 6 (all X all Y (less(X,Y) -> leq(X,Y))) # label(less_implies_leq) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 7 (all X all Y all Z (leq(X,Y) & less(Y,Z) -> less(X,Z))) # label(leq_less_trans) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 8 (all X all Y all Z (less(X,Y) & leq(Y,Z) -> less(X,Z))) # label(less_leq_trans) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 9 (all X all Y all Z (leq(X,Y) & leq(Y,Z) -> leq(X,Z))) # label(leq_trans) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 10 (all X all A all B (in_closed(X,A,B) <-> leq(A,X) & leq(X,B))) # label(in_closed) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 11 (all X all A all B (in_lopen(X,A,B) <-> less(A,X) & leq(X,B))) # label(in_lopen) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 12 (all X all A all B (in_ropen(X,A,B) <-> leq(A,X) & less(X,B))) # label(in_ropen) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 13 (all X all A all B (in_open(X,A,B) <-> less(A,X) & less(X,B))) # label(in_open) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 14 (all I1lo all I1hi all I2lo all I2hi (axis_conflict(I1lo,I1hi,I2lo,I2hi) <-> -(exists X (in_closed(X,I1lo,I1hi) & in_closed(X,I2lo,I2hi))))) # label(axis_conflict_def) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 15 (all I1lo all I1hi all I2lo all I2hi (axis_compatible(I1lo,I1hi,I2lo,I2hi) <-> (exists X (in_closed(X,I1lo,I1hi) & in_closed(X,I2lo,I2hi))))) # label(axis_compatible_def) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 16 (all I1lo all I1hi all I2lo all I2hi (axis_subsumes(I1lo,I1hi,I2lo,I2hi) <-> (all X (in_closed(X,I1lo,I1hi) -> in_closed(X,I2lo,I2hi))))) # label(axis_subsumes_def) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 17 (all V (is_verdict(V) -> V = conflict | V = compatible | V = unknown)) # label(verdict_enum) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 18 (all V1 all V2 (is_verdict(V1) & is_verdict(V2) & (V1 = conflict | V2 = conflict) -> box_verdict(V1,V2) = conflict)) # label(box_conflict) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 19 (all V1 all V2 (is_verdict(V1) & is_verdict(V2) & V1 = compatible & V2 = compatible -> box_verdict(V1,V2) = compatible)) # label(box_compatible) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 20 (all V1 all V2 (is_verdict(V1) & is_verdict(V2) & (V1 = unknown | V2 = unknown) & V1 != conflict & V2 != conflict -> box_verdict(V1,V2) = unknown)) # label(box_unknown) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 21 (all V1 all V2 (is_verdict(V1) & is_verdict(V2) -> box_verdict(V1,V2) = conflict | box_verdict(V1,V2) = compatible | box_verdict(V1,V2) = unknown)) # label(box_verdict_total) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 22 (all X1 all X2 all A1 all B1 all A2 all B2 (in_box2(X1,X2,A1,B1,A2,B2) <-> in_closed(X1,A1,B1) & in_closed(X2,A2,B2))) # label(in_box2) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 23 (all X1 all X2 all X3 all A1 all B1 all A2 all B2 all A3 all B3 (in_box3(X1,X2,X3,A1,B1,A2,B2,A3,B3) <-> in_closed(X1,A1,B1) & in_closed(X2,A2,B2) & in_closed(X3,A3,B3))) # label(in_box3) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 24 (all A1 all B1 all A2 all B2 all C1 all D1 all C2 all D2 (box2_compatible(A1,B1,A2,B2,C1,D1,C2,D2) <-> axis_compatible(A1,B1,C1,D1) & axis_compatible(A2,B2,C2,D2))) # label(box2_overlap) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 25 (all A1 all B1 all A2 all B2 all C1 all D1 all C2 all D2 (box2_conflict(A1,B1,A2,B2,C1,D1,C2,D2) <-> axis_conflict(A1,B1,C1,D1) | axis_conflict(A2,B2,C2,D2))) # label(box2_conflict) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 26 (all X all V (in_closed(X,V,V) <-> X = V)) # label(shape_point) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 27 (all X all A all B (in_closed(X,A,B) <-> leq(A,X) & leq(X,B))) # label(shape_closed) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 28 (all X all A all B (in_ropen(X,A,B) <-> leq(A,X) & less(X,B))) # label(shape_ropen) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 29 (all X all A all B (in_lopen(X,A,B) <-> less(A,X) & leq(X,B))) # label(shape_lopen) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 30 (all X all A all B (in_open(X,A,B) <-> less(A,X) & less(X,B))) # label(shape_open) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.05 31 --(exists X (in_closed(X,n0,n5) & in_closed(X,n10,n15))) # label(no_false_conflict) # label(negated_conjecture) # label(non_clause). [assumption]. % 0.45/1.05 % 0.45/1.05 ============================== end of process non-clausal formulas === % 0.45/1.05 % 0.45/1.05 ============================== PROCESS INITIAL CLAUSES =============== % 0.45/1.05 % 0.45/1.05 ============================== PREDICATE ELIMINATION ================= % 0.45/1.05 32 -axis_subsumes(A,B,C,D) | -in_closed(E,A,B) | in_closed(E,C,D) # label(axis_subsumes_def) # label(axiom). [clausify(16)]. % 0.45/1.05 33 axis_subsumes(A,B,C,D) | in_closed(f3(A,B,C,D),A,B) # label(axis_subsumes_def) # label(axiom). [clausify(16)]. % 0.45/1.05 Derived: -in_closed(A,B,C) | in_closed(A,D,E) | in_closed(f3(B,C,D,E),B,C). [resolve(32,a,33,a)]. % 0.45/1.05 34 axis_subsumes(A,B,C,D) | -in_closed(f3(A,B,C,D),C,D) # label(axis_subsumes_def) # label(axiom). [clausify(16)]. % 0.45/1.05 Derived: -in_closed(f3(A,B,C,D),C,D) | -in_closed(E,A,B) | in_closed(E,C,D). [resolve(34,a,32,a)]. % 0.45/1.05 35 in_lopen(A,B,C) | -less(B,A) | -leq(A,C) # label(in_lopen) # label(axiom). [clausify(11)]. % 0.45/1.05 36 -in_lopen(A,B,C) | less(B,A) # label(in_lopen) # label(axiom). [clausify(11)]. % 0.45/1.05 37 -in_lopen(A,B,C) | leq(A,C) # label(in_lopen) # label(axiom). [clausify(11)]. % 0.45/1.05 38 -in_lopen(A,B,C) | less(B,A) # label(shape_lopen) # label(axiom). [clausify(29)]. % 0.45/1.05 39 -in_lopen(A,B,C) | leq(A,C) # label(shape_lopen) # label(axiom). [clausify(29)]. % 0.45/1.05 40 in_lopen(A,B,C) | -less(B,A) | -leq(A,C) # label(shape_lopen) # label(axiom). [clausify(29)]. % 0.45/1.05 41 in_ropen(A,B,C) | -leq(B,A) | -less(A,C) # label(in_ropen) # label(axiom). [clausify(12)]. % 0.45/1.05 42 -in_ropen(A,B,C) | leq(B,A) # label(in_ropen) # label(axiom). [clausify(12)]. % 0.45/1.05 43 -in_ropen(A,B,C) | less(A,C) # label(in_ropen) # label(axiom). [clausify(12)]. % 0.45/1.05 44 -in_ropen(A,B,C) | leq(B,A) # label(shape_ropen) # label(axiom). [clausify(28)]. % 0.45/1.05 45 -in_ropen(A,B,C) | less(A,C) # label(shape_ropen) # label(axiom). [clausify(28)]. % 0.45/1.05 46 in_ropen(A,B,C) | -leq(B,A) | -less(A,C) # label(shape_ropen) # label(axiom). [clausify(28)]. % 0.45/1.05 47 in_open(A,B,C) | -less(B,A) | -less(A,C) # label(in_open) # label(axiom). [clausify(13)]. % 0.45/1.05 48 -in_open(A,B,C) | less(B,A) # label(in_open) # label(axiom). [clausify(13)]. % 0.45/1.05 49 -in_open(A,B,C) | less(A,C) # label(in_open) # label(axiom). [clausify(13)]. % 0.45/1.05 50 -in_open(A,B,C) | less(B,A) # label(shape_open) # label(axiom). [clausify(30)]. % 0.45/1.05 51 -in_open(A,B,C) | less(A,C) # label(shape_open) # label(axiom). [clausify(30)]. % 0.45/1.05 52 in_open(A,B,C) | -less(B,A) | -less(A,C) # label(shape_open) # label(axiom). [clausify(30)]. % 0.45/1.05 53 in_box2(A,B,C,D,E,F) | -in_closed(A,C,D) | -in_closed(B,E,F) # label(in_box2) # label(axiom). [clausify(22)]. % 0.45/1.05 54 -in_box2(A,B,C,D,E,F) | in_closed(A,C,D) # label(in_box2) # label(axiom). [clausify(22)]. % 0.45/1.05 55 -in_box2(A,B,C,D,E,F) | in_closed(B,E,F) # label(in_box2) # label(axiom). [clausify(22)]. % 0.45/1.05 56 in_box3(A,B,C,D,E,F,V6,V7,V8) | -in_closed(A,D,E) | -in_closed(B,F,V6) | -in_closed(C,V7,V8) # label(in_box3) # label(axiom). [clausify(23)]. % 0.45/1.05 57 -in_box3(A,B,C,D,E,F,V6,V7,V8) | in_closed(A,D,E) # label(in_box3) # label(axiom). [clausify(23)]. % 0.45/1.05 58 -in_box3(A,B,C,D,E,F,V6,V7,V8) | in_closed(B,F,V6) # label(in_box3) # label(axiom). [clausify(23)]. % 0.45/1.05 59 -in_box3(A,B,C,D,E,F,V6,V7,V8) | in_closed(C,V7,V8) # label(in_box3) # label(axiom). [clausify(23)]. % 0.45/1.05 60 box2_compatible(A,B,C,D,E,F,V6,V7) | -axis_compatible(A,B,E,F) | -axis_compatible(C,D,V6,V7) # label(box2_overlap) # label(axiom). [clausify(24)]. % 0.45/1.05 61 -box2_compatible(A,B,C,D,E,F,V6,V7) | axis_compatible(A,B,E,F) # label(box2_overlap) # label(axiom). [clausify(24)]. % 0.45/1.05 62 -box2_compatible(A,B,C,D,E,F,V6,V7) | axis_compatible(C,D,V6,V7) # label(box2_overlap) # label(axiom). [clausify(24)]. % 0.45/1.05 63 axis_compatible(A,B,C,D) | -in_closed(E,A,B) | -in_closed(E,C,D) # label(axis_compatible_def) # label(axiom). [clausify(15)]. % 0.45/1.05 64 -axis_compatible(A,B,C,D) | in_closed(f2(A,B,C,D),A,B) # label(axis_compatible_def) # label(axiom). [clausify(15)]. % 0.45/1.05 65 -axis_compatible(A,B,C,D) | in_closed(f2(A,B,C,D),C,D) # label(axis_compatible_def) # label(axiom). [clausify(15)]. % 0.45/1.05 Derived: -in_closed(A,B,C) | -in_closed(A,D,E) | in_closed(f2(B,C,D,E),B,C). [resolve(63,a,64,a)]. % 0.45/1.05 Derived: -in_closed(A,B,C) | -in_closed(A,D,E) | in_closed(f2(B,C,D,E),D,E). [resolve(63,a,65,a)]. % 0.45/1.05 66 -box2_conflict(A,B,C,D,E,F,V6,V7) | axis_conflict(A,B,E,F) | axis_conflict(C,D,V6,V7) # label(box2_conflict) # label(axiom). [clausify(25)]. % 0.45/1.05 67 box2_conflict(A,B,C,D,E,F,V6,V7) | -axis_conflict(A,B,E,F) # label(box2_conflict) # label(axiom). [clausify(25)]. % 0.45/1.05 68 box2_conflict(A,B,C,D,E,F,V6,V7) | -axis_conflict(C,D,V6,V7) # label(box2_conflict) # label(axiom). [clausify(25)]. % 0.45/1.05 69 -axis_conflict(A,B,C,D) | -in_closed(E,A,B) | -in_closed(E,C,D) # label(axis_conflict_def) # label(axiom). [clausify(14)]. % 0.45/1.05 70 axis_conflict(n0,n5,n10,n15) # label(conflict_hyp) # label(hypothesis). [assumption]. % 0.45/1.05 71 axis_conflict(A,B,C,D) | in_closed(f1(A,B,C,D),A,B) # label(axis_conflict_def) # label(axiom). [clausify(14)]. % 0.45/1.05 72 axis_conflict(A,B,C,D) | in_closed(f1(A,B,C,D),C,D) # label(axis_conflict_def) # label(axiom). [clausify(14)]. % 0.45/1.05 Derived: -in_closed(A,n0,n5) | -in_closed(A,n10,n15). [resolve(69,a,70,a)]. % 0.45/1.05 Derived: -in_closed(A,B,C) | -in_closed(A,D,E) | in_closed(f1(B,C,D,E),B,C). [resolve(69,a,71,a)]. % 0.45/1.05 Derived: -in_closed(A,B,C) | -in_closed(A,D,E) | in_closed(f1(B,C,D,E),D,E). [resolve(69,a,72,a)]. % 0.45/1.06 % 0.45/1.06 ============================== end predicate elimination ============= % 0.45/1.06 % 0.45/1.06 Auto_denials: (non-Horn, no changes). % 0.45/1.06 % 0.45/1.06 Term ordering decisions: % 0.45/1.06 Function symbol KB weights: conflict=1. unknown=1. compatible=1. n10=1. n5=1. n0=1. n15=1. c1=1. box_verdict=1. f1=1. f2=1. f3=1. % 0.45/1.06 % 0.45/1.06 ============================== end of process initial clauses ======== % 0.45/1.06 % 0.45/1.06 ============================== CLAUSES FOR SEARCH ==================== % 0.45/1.06 % 0.45/1.06 ============================== end of clauses for search ============= % 0.45/1.06 % 0.45/1.06 ============================== SEARCH ================================ % 0.45/1.06 % 0.45/1.06 % Starting search at 0.02 seconds. % 0.45/1.06 % 0.45/1.06 ============================== PROOF ================================= % 0.45/1.06 % SZS status Theorem % 0.45/1.06 % SZS output start Refutation % 0.45/1.06 % 0.45/1.06 % Proof 1 at 0.02 (+ 0.00) seconds. % 0.45/1.06 % Length of proof is 8. % 0.45/1.06 % Level of proof is 3. % 0.45/1.06 % Maximum clause weight is 8.000. % 0.45/1.06 % Given clauses 38. % 0.45/1.06 % 0.45/1.06 14 (all I1lo all I1hi all I2lo all I2hi (axis_conflict(I1lo,I1hi,I2lo,I2hi) <-> -(exists X (in_closed(X,I1lo,I1hi) & in_closed(X,I2lo,I2hi))))) # label(axis_conflict_def) # label(axiom) # label(non_clause). [assumption]. % 0.45/1.06 31 --(exists X (in_closed(X,n0,n5) & in_closed(X,n10,n15))) # label(no_false_conflict) # label(negated_conjecture) # label(non_clause). [assumption]. % 0.45/1.06 69 -axis_conflict(A,B,C,D) | -in_closed(E,A,B) | -in_closed(E,C,D) # label(axis_conflict_def) # label(axiom). [clausify(14)]. % 0.45/1.06 70 axis_conflict(n0,n5,n10,n15) # label(conflict_hyp) # label(hypothesis). [assumption]. % 0.45/1.06 79 in_closed(c1,n0,n5) # label(no_false_conflict) # label(negated_conjecture). [clausify(31)]. % 0.45/1.06 80 in_closed(c1,n10,n15) # label(no_false_conflict) # label(negated_conjecture). [clausify(31)]. % 0.45/1.06 118 -in_closed(A,n0,n5) | -in_closed(A,n10,n15). [resolve(69,a,70,a)]. % 0.45/1.06 201 $F. [resolve(118,a,79,a),unit_del(a,80)]. % 0.45/1.06 % 0.45/1.06 % SZS output end Refutation % 0.45/1.06 ============================== end of proof ========================== % 0.45/1.06 % 0.45/1.06 ============================== STATISTICS ============================ % 0.45/1.06 % 0.45/1.06 Given=38. Generated=176. Kept=120. proofs=1. % 0.45/1.06 Usable=38. Sos=79. Demods=0. Limbo=0, Disabled=88. Hints=0. % 0.45/1.06 Megabytes=0.18. % 0.45/1.06 User_CPU=0.02, System_CPU=0.00, Wall_clock=0. % 0.45/1.06 % 0.45/1.06 ============================== end of statistics ===================== % 0.45/1.06 % 0.45/1.06 ============================== end of search ========================= % 0.45/1.06 % 0.45/1.06 THEOREM PROVED % 0.45/1.06 % SZS status Theorem % 0.45/1.06 % 0.45/1.06 Exiting with 1 proof. % 0.45/1.06 % 0.45/1.06 Process 31337 exit (max_proofs) Tue Apr 28 18:38:32 2026 % 0.45/1.06 Prover9 interrupted %------------------------------------------------------------------------------