├── .gitignore ├── Bus Ticket Reservation System ├── .settings │ ├── org.eclipse.core.resources.prefs │ └── org.eclipse.jdt.core.prefs ├── adminLogin.PNG ├── seatsdeducted.PNG ├── ticketCancel.PNG ├── ticketConfirmed.PNG ├── insertBusDetails.PNG ├── bin │ └── com │ │ └── masai │ │ ├── runner │ │ └── Main.class │ │ ├── dao │ │ ├── TicketDao.class │ │ └── TicketDaoImpl.class │ │ ├── utility │ │ └── DButil.class │ │ └── usecases │ │ ├── adminLogin.class │ │ ├── ConfirmTicket.class │ │ └── IntsertBusDetails.class ├── .project ├── src │ └── com │ │ └── masai │ │ ├── dao │ │ ├── TicketDao.java │ │ └── TicketDaoImpl.java │ │ ├── usecases │ │ ├── adminLogin.java │ │ ├── ConfirmTicket.java │ │ └── IntsertBusDetails.java │ │ ├── utility │ │ └── DButil.java │ │ └── runner │ │ └── Main.java └── .classpath └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /.metadata/ 2 | -------------------------------------------------------------------------------- /Bus Ticket Reservation System/.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding/=UTF-8 3 | -------------------------------------------------------------------------------- /Bus Ticket Reservation System/adminLogin.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aman1080phd/common-dock-7043/HEAD/Bus Ticket Reservation System/adminLogin.PNG -------------------------------------------------------------------------------- /Bus Ticket Reservation System/seatsdeducted.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aman1080phd/common-dock-7043/HEAD/Bus Ticket Reservation System/seatsdeducted.PNG -------------------------------------------------------------------------------- /Bus Ticket Reservation System/ticketCancel.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aman1080phd/common-dock-7043/HEAD/Bus Ticket Reservation System/ticketCancel.PNG -------------------------------------------------------------------------------- /Bus Ticket Reservation System/ticketConfirmed.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aman1080phd/common-dock-7043/HEAD/Bus Ticket Reservation System/ticketConfirmed.PNG -------------------------------------------------------------------------------- /Bus Ticket Reservation System/insertBusDetails.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aman1080phd/common-dock-7043/HEAD/Bus Ticket Reservation System/insertBusDetails.PNG -------------------------------------------------------------------------------- /Bus Ticket Reservation System/bin/com/masai/runner/Main.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aman1080phd/common-dock-7043/HEAD/Bus Ticket Reservation System/bin/com/masai/runner/Main.class -------------------------------------------------------------------------------- /Bus Ticket Reservation System/bin/com/masai/dao/TicketDao.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aman1080phd/common-dock-7043/HEAD/Bus Ticket Reservation System/bin/com/masai/dao/TicketDao.class -------------------------------------------------------------------------------- /Bus Ticket Reservation System/bin/com/masai/utility/DButil.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aman1080phd/common-dock-7043/HEAD/Bus Ticket Reservation System/bin/com/masai/utility/DButil.class -------------------------------------------------------------------------------- /Bus Ticket Reservation System/bin/com/masai/dao/TicketDaoImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aman1080phd/common-dock-7043/HEAD/Bus Ticket Reservation System/bin/com/masai/dao/TicketDaoImpl.class -------------------------------------------------------------------------------- /Bus Ticket Reservation System/bin/com/masai/usecases/adminLogin.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aman1080phd/common-dock-7043/HEAD/Bus Ticket Reservation System/bin/com/masai/usecases/adminLogin.class -------------------------------------------------------------------------------- /Bus Ticket Reservation System/bin/com/masai/usecases/ConfirmTicket.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aman1080phd/common-dock-7043/HEAD/Bus Ticket Reservation System/bin/com/masai/usecases/ConfirmTicket.class -------------------------------------------------------------------------------- /Bus Ticket Reservation System/bin/com/masai/usecases/IntsertBusDetails.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aman1080phd/common-dock-7043/HEAD/Bus Ticket Reservation System/bin/com/masai/usecases/IntsertBusDetails.class -------------------------------------------------------------------------------- /Bus Ticket Reservation System/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | Bus Ticket Reservation System 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.jdt.core.javanature 16 | 17 | 18 | -------------------------------------------------------------------------------- /Bus Ticket Reservation System/src/com/masai/dao/TicketDao.java: -------------------------------------------------------------------------------- 1 | package com.masai.dao; 2 | 3 | public interface TicketDao { 4 | 5 | public String insertBusDetails(String BusName,String source, String destination, 6 | String BusType, int Seats, String ArrivalTime, String DepartureTime); 7 | 8 | public String confirmTicket(String source, String destination,String name, int age); 9 | 10 | public String ticketCancel(int busno, String name); 11 | 12 | public String adminLogin(String username, String password); 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Bus Ticket Reservation System/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Bus Ticket Reservation System/src/com/masai/usecases/adminLogin.java: -------------------------------------------------------------------------------- 1 | package com.masai.usecases; 2 | 3 | import java.util.Scanner; 4 | 5 | import com.masai.dao.TicketDao; 6 | import com.masai.dao.TicketDaoImpl; 7 | 8 | public class adminLogin { 9 | 10 | 11 | public static void main(String[] args) { 12 | 13 | Scanner sc = new Scanner(System.in); 14 | 15 | System.out.println("Enter username: "); 16 | String username = sc.next(); 17 | 18 | System.out.println("Enter Password: "); 19 | String password = sc.next(); 20 | 21 | TicketDao dao = new TicketDaoImpl(); 22 | 23 | String result = dao.adminLogin(username, password); 24 | 25 | System.out.println(); 26 | System.out.println(result); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Bus Ticket Reservation System/.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 5 | org.eclipse.jdt.core.compiler.compliance=17 6 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate 7 | org.eclipse.jdt.core.compiler.debug.localVariable=generate 8 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate 9 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 10 | org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled 11 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 12 | org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning 13 | org.eclipse.jdt.core.compiler.release=enabled 14 | org.eclipse.jdt.core.compiler.source=17 15 | -------------------------------------------------------------------------------- /Bus Ticket Reservation System/src/com/masai/utility/DButil.java: -------------------------------------------------------------------------------- 1 | package com.masai.utility; 2 | 3 | import java.sql.Connection; 4 | import java.sql.DriverManager; 5 | import java.sql.SQLException; 6 | 7 | public class DButil { 8 | 9 | public static Connection provideConnection() { 10 | 11 | Connection conn=null; 12 | 13 | 14 | try { 15 | Class.forName("com.mysql.cj.jdbc.Driver"); 16 | } catch (ClassNotFoundException e) { 17 | // TODO Auto-generated catch block 18 | e.printStackTrace(); 19 | } 20 | 21 | String url="jdbc:mysql://localhost:3306/busticket"; 22 | 23 | try { 24 | conn= DriverManager.getConnection(url,"root","iaminambalacantt"); 25 | } catch (SQLException e) { 26 | // TODO Auto-generated catch block 27 | e.printStackTrace(); 28 | } 29 | 30 | 31 | 32 | 33 | return conn; 34 | 35 | } 36 | 37 | 38 | 39 | } 40 | -------------------------------------------------------------------------------- /Bus Ticket Reservation System/src/com/masai/usecases/ConfirmTicket.java: -------------------------------------------------------------------------------- 1 | package com.masai.usecases; 2 | 3 | import java.util.Scanner; 4 | 5 | import com.masai.dao.TicketDao; 6 | import com.masai.dao.TicketDaoImpl; 7 | 8 | public class ConfirmTicket { 9 | 10 | public static void main(String[] args) { 11 | 12 | 13 | Scanner sc = new Scanner(System.in); 14 | 15 | System.out.println("Enter BusNo: "); 16 | int busno = sc.nextInt(); 17 | 18 | System.out.println("Enter Name: "); 19 | String name = sc.next(); 20 | 21 | 22 | TicketDao dao = new TicketDaoImpl(); 23 | 24 | 25 | String result = dao.ticketCancel(busno, name); 26 | 27 | // String result = dao.confirmTicket("Agra", "Mathura", "Aman", 20); 28 | 29 | System.out.println(); 30 | 31 | System.out.println(result); 32 | 33 | 34 | 35 | 36 | 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Bus Ticket Reservation System 2 | 3 | ## Admin can insert bus details 4 | ![img](https://github.com/aman1080phd/common-dock-7043/blob/main/Bus%20Ticket%20Reservation%20System/adminLogin.PNG) 5 | 6 | 7 | ![img](https://github.com/aman1080phd/common-dock-7043/blob/main/Bus%20Ticket%20Reservation%20System/insertBusDetails.PNG) 8 | 9 | 10 | ## Passengers can Book Ticket by providing Source and Destination location 11 | ![img](https://github.com/aman1080phd/common-dock-7043/blob/main/Bus%20Ticket%20Reservation%20System/ticketConfirmed.PNG) 12 | 13 | ## Once the seat is booked, automatically the seat would be deducted 14 | ![img](https://github.com/aman1080phd/common-dock-7043/blob/main/Bus%20Ticket%20Reservation%20System/seatsdeducted.PNG) 15 | 16 | ## Passengers can Cancel Ticket by providing BusNo and Name of passenger 17 | ![img](https://github.com/aman1080phd/common-dock-7043/blob/main/Bus%20Ticket%20Reservation%20System/ticketCancel.PNG) 18 | 19 | ## Thank you ❤ 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Bus Ticket Reservation System/src/com/masai/usecases/IntsertBusDetails.java: -------------------------------------------------------------------------------- 1 | package com.masai.usecases; 2 | 3 | import java.util.Scanner; 4 | 5 | import com.masai.dao.TicketDao; 6 | import com.masai.dao.TicketDaoImpl; 7 | 8 | public class IntsertBusDetails { 9 | 10 | public static void main(String[] args) { 11 | 12 | Scanner sc = new Scanner(System.in); 13 | 14 | System.out.println("Enter BusName: "); 15 | String busname = sc.next(); 16 | 17 | System.out.println("Enter Source: "); 18 | String source = sc.next(); 19 | 20 | System.out.println("Enter Destination: "); 21 | String destination = sc.next(); 22 | 23 | System.out.println("Enter BusType: "); 24 | String bustype = sc.next(); 25 | 26 | System.out.println("Enter Seats Avilable: "); 27 | int seats = sc.nextInt(); 28 | 29 | System.out.println("Enter ArrivalTime: "); 30 | String arrivalTime = sc.next(); 31 | 32 | System.out.println("Enter DepartureTime: "); 33 | String departureTime = sc.next(); 34 | 35 | 36 | TicketDao dao = new TicketDaoImpl(); 37 | 38 | String result = dao.insertBusDetails(busname, source, destination, bustype, seats, arrivalTime, departureTime); 39 | 40 | System.out.println(result); 41 | 42 | 43 | 44 | } 45 | 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Bus Ticket Reservation System/src/com/masai/dao/TicketDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.masai.dao; 2 | 3 | import java.sql.Connection; 4 | import java.sql.PreparedStatement; 5 | import java.sql.ResultSet; 6 | 7 | import com.masai.utility.DButil; 8 | 9 | public class TicketDaoImpl implements TicketDao { 10 | 11 | @Override 12 | public String insertBusDetails(String BusName,String source, String destination, 13 | String BusType, int Seats, String ArrivalTime, String DepartureTime) 14 | { 15 | String message = "Not inserted !"; 16 | 17 | try (Connection conn = DButil.provideConnection()) { 18 | 19 | PreparedStatement ps = conn.prepareStatement("insert into busdetails(BusName,Source,Destination, " 20 | + "BusType, Seats, ArrivalTime, DepartureTime) values (?,?,?,?,?,?,?) "); 21 | 22 | ps.setString(1, BusName); 23 | ps.setString(2, source); 24 | ps.setString(3, destination); 25 | ps.setString(4, BusType); 26 | ps.setInt(5, Seats); 27 | ps.setString(6, ArrivalTime); 28 | ps.setString(7, DepartureTime); 29 | 30 | int x = ps.executeUpdate(); 31 | 32 | if(x>0) 33 | { 34 | message = "Bus Details Inserted Sucessfully !"; 35 | } 36 | 37 | 38 | 39 | } catch (Exception e) { 40 | message = e.getMessage(); 41 | } 42 | 43 | 44 | 45 | 46 | return message; 47 | } 48 | 49 | @Override 50 | public String confirmTicket(String source, String destination, String name, int age) { 51 | 52 | String message = "Seat Not Available !"; 53 | 54 | try (Connection conn = DButil.provideConnection()){ 55 | 56 | PreparedStatement ps = conn.prepareStatement("select seats,busno from busdetails " 57 | + "where source = ? and destination = ?"); 58 | 59 | ps.setString(1, source); 60 | ps.setString(2, destination); 61 | 62 | ResultSet rs = ps.executeQuery(); 63 | 64 | if(rs.next()) 65 | { 66 | int x = rs.getInt("Seats"); 67 | 68 | if(x>0) 69 | { 70 | PreparedStatement ps2 = conn.prepareStatement("Update busdetails set Seats = Seats-1 where source = ?"); 71 | 72 | ps2.setString(1, source); 73 | 74 | ps2.executeUpdate(); 75 | 76 | PreparedStatement ps3 = conn.prepareStatement("insert into customerdetails values(?,?,?)"); 77 | 78 | ps3.setInt(1, rs.getInt("busno")); 79 | ps3.setString(2, name); 80 | ps3.setInt(3, age); 81 | 82 | 83 | ps3.executeUpdate(); 84 | 85 | PreparedStatement ps4 = conn.prepareStatement("select * from customerdetails where name = ?"); 86 | 87 | ps4.setString(1, name); 88 | 89 | ResultSet rs2 = ps4.executeQuery(); 90 | 91 | if(rs2.next()) 92 | { 93 | System.out.println(); 94 | System.out.println("BusNo: "+ rs2.getInt("busno")); 95 | System.out.println("Passenger Name: "+rs2.getString("Name")); 96 | System.out.println("Passenger Age: "+rs2.getInt("Age")); 97 | } 98 | message = "Ticked confirmed !"; 99 | } 100 | 101 | } 102 | else 103 | { 104 | message = "Please Enter Valid Location !"; 105 | } 106 | 107 | 108 | } catch (Exception e) { 109 | message = e.getMessage(); 110 | } 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | return message; 119 | } 120 | 121 | @Override 122 | public String ticketCancel(int busno, String name) { 123 | 124 | String message = "Ticket Canellation Unsucessful !"; 125 | 126 | 127 | try (Connection conn = DButil.provideConnection()) { 128 | 129 | PreparedStatement ps = conn.prepareStatement("delete from customerdetails where name = ? and busno = ?"); 130 | 131 | ps.setString(1, name); 132 | ps.setInt(2, busno); 133 | 134 | int x= ps.executeUpdate(); 135 | 136 | PreparedStatement ps2 = conn.prepareStatement("Update busdetails set seats = seats+1 where busno = ?"); 137 | 138 | ps2.setInt(1, busno); 139 | 140 | ps2.executeUpdate(); 141 | 142 | if(x>0) 143 | { 144 | message = "Ticket Cancellation Sucessful !"; 145 | } 146 | 147 | } catch (Exception e) { 148 | message = e.getMessage(); 149 | } 150 | 151 | 152 | return message; 153 | } 154 | 155 | @Override 156 | public String adminLogin(String username, String password) { 157 | 158 | String message = "Wrong Credentials!"; 159 | 160 | try (Connection conn = DButil.provideConnection()){ 161 | 162 | PreparedStatement ps = conn.prepareStatement("Select * from adminlogin where username = ? and password = ?"); 163 | 164 | ps.setString(1, username); 165 | ps.setString(2,password); 166 | 167 | ResultSet rs = ps.executeQuery(); 168 | 169 | if(rs.next()) 170 | { 171 | System.out.println(); 172 | System.out.println("Welcome "+rs.getString("username")+"!"); 173 | message = ""; 174 | } 175 | 176 | 177 | } catch (Exception e) { 178 | message = e.getMessage(); 179 | } 180 | 181 | return message; 182 | } 183 | 184 | } 185 | -------------------------------------------------------------------------------- /Bus Ticket Reservation System/src/com/masai/runner/Main.java: -------------------------------------------------------------------------------- 1 | package com.masai.runner; 2 | 3 | import java.sql.Connection; 4 | import java.sql.PreparedStatement; 5 | import java.sql.ResultSet; 6 | import java.util.Scanner; 7 | 8 | import com.masai.dao.TicketDao; 9 | import com.masai.dao.TicketDaoImpl; 10 | import com.masai.utility.DButil; 11 | 12 | public class Main { 13 | 14 | public static void main(String[] args) { 15 | 16 | int check = 1; 17 | 18 | while(check !=2) 19 | { 20 | System.out.println(); 21 | System.out.println("========================================"); 22 | System.out.println("Welcome To Bus Ticket Reservation System"); 23 | System.out.println("========================================"); 24 | 25 | Scanner sc = new Scanner(System.in); 26 | TicketDao dao = new TicketDaoImpl(); 27 | 28 | 29 | System.out.println(); 30 | System.out.println("1. Admin"); 31 | System.out.println("2. Customer"); 32 | System.out.println(); 33 | 34 | System.out.println("Enter your choice:"); 35 | int choice = sc.nextInt(); 36 | 37 | if(choice==1) 38 | { 39 | System.out.println(); 40 | System.out.println("Enter username: "); 41 | String username = sc.next(); 42 | 43 | System.out.println("Enter Password: "); 44 | String password = sc.next(); 45 | 46 | 47 | String login = dao.adminLogin(username, password); 48 | 49 | System.out.println(login); 50 | 51 | if(login.equals("Wrong Credentials!")) 52 | { 53 | check = 1; 54 | continue; 55 | } 56 | 57 | System.out.println("1. Insert Bus Details"); 58 | System.out.println("2. Go back"); 59 | System.out.println("3. Exit"); 60 | 61 | System.out.println(); 62 | System.out.println("Enter your choice:"); 63 | int insertorNot = sc.nextInt(); 64 | 65 | if(insertorNot==1) 66 | 67 | { 68 | System.out.println("Enter BusName: "); 69 | String busname = sc.next(); 70 | 71 | System.out.println("Enter Source: "); 72 | String source = sc.next(); 73 | 74 | System.out.println("Enter Destination: "); 75 | String destination = sc.next(); 76 | 77 | System.out.println("Enter BusType: "); 78 | String bustype = sc.next(); 79 | 80 | System.out.println("Enter Seats Avilable: "); 81 | int seats = sc.nextInt(); 82 | 83 | System.out.println("Enter ArrivalTime: "); 84 | String arrivalTime = sc.next(); 85 | 86 | System.out.println("Enter DepartureTime: "); 87 | String departureTime = sc.next(); 88 | 89 | 90 | String result = dao.insertBusDetails(busname, source, destination, bustype, seats, arrivalTime, departureTime); 91 | 92 | System.out.println(result); 93 | 94 | } 95 | else if(insertorNot==2) 96 | { 97 | check = 1; 98 | } 99 | else if(insertorNot==3) 100 | { 101 | check = 2; 102 | } 103 | else 104 | { 105 | System.out.println("Please Enter Correction Information Next Time!"); 106 | } 107 | } 108 | else if(choice ==2) 109 | { 110 | System.out.println(); 111 | System.out.println("1. Book Ticket"); 112 | System.out.println("2. Cancel Ticket"); 113 | System.out.println("3. Go back"); 114 | System.out.println("4. Exit"); 115 | 116 | 117 | System.out.println(); 118 | System.out.println("Enter your choice: "); 119 | int bookorNot = sc.nextInt(); 120 | 121 | if(bookorNot==1) 122 | { 123 | System.out.println(); 124 | 125 | try(Connection conn =DButil.provideConnection()) { 126 | 127 | 128 | PreparedStatement ps = conn.prepareStatement("Select * from busdetails"); 129 | 130 | ResultSet rs = ps.executeQuery(); 131 | 132 | System.out.println("BUSNO SEATS SOURCE DESTINATION"); 133 | while(rs.next()) 134 | { 135 | 136 | System.out.print(" "+rs.getInt("busno")+" "); 137 | 138 | System.out.print(rs.getInt("seats")+" "); 139 | 140 | System.out.print(rs.getString("source")+" "); 141 | System.out.print(rs.getString("destination")); 142 | 143 | 144 | 145 | System.out.println(); 146 | } 147 | 148 | } catch (Exception e) { 149 | System.out.println(e.getMessage()); 150 | } 151 | 152 | System.out.println(); 153 | System.out.println("Enter Source Location: "); 154 | String source = sc.next(); 155 | 156 | System.out.println("Enter Destination Location: "); 157 | String destination = sc.next(); 158 | 159 | System.out.println("Enter Your Name: "); 160 | String name = sc.next(); 161 | 162 | System.out.println("Enter Your Age: "); 163 | int age = sc.nextInt(); 164 | 165 | 166 | String res = dao.confirmTicket(source, destination, name, age ); 167 | 168 | System.out.println(); 169 | System.out.println(res); 170 | check = 1; 171 | 172 | 173 | } 174 | else if(bookorNot==2) 175 | { 176 | System.out.println("Enter BusNo: "); 177 | int busno = sc.nextInt(); 178 | 179 | System.out.println("Enter Name: "); 180 | String name = sc.next(); 181 | 182 | 183 | String result = dao.ticketCancel(busno, name); 184 | 185 | 186 | System.out.println(); 187 | 188 | System.out.println(result); 189 | 190 | } 191 | else if(bookorNot==3) 192 | { 193 | check = 1; 194 | } 195 | else if(bookorNot==4) 196 | { 197 | check = 2; 198 | } 199 | else 200 | { 201 | System.out.println("Please Enter Correction Information Next Time!"); 202 | } 203 | 204 | } 205 | else 206 | { 207 | System.out.println("Please Enter Correction Information Next Time!"); 208 | } 209 | 210 | } 211 | 212 | System.out.println("============================"); 213 | System.out.println("Thank you for visiting us !"); 214 | System.out.println("============================"); 215 | 216 | 217 | } 218 | } 219 | --------------------------------------------------------------------------------