├── .gitignore ├── config.cpython-311.pyc ├── facerec.cpython-311.pyc ├── drawpage.cpython-311.pyc ├── detectclick.cpython-311.pyc ├── profiles_settings.xml ├── README.md ├── misc.xml ├── modules.xml ├── BIO METRIC TRANSACTION CONTROL-ATM-main.iml ├── detectclick.py ├── facerec.py ├── workspace.xml ├── Project_Default.xml ├── drawpage.py ├── main.py └── config.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /config.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AIDA-2456/Gesture-ATM/HEAD/config.cpython-311.pyc -------------------------------------------------------------------------------- /facerec.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AIDA-2456/Gesture-ATM/HEAD/facerec.cpython-311.pyc -------------------------------------------------------------------------------- /drawpage.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AIDA-2456/Gesture-ATM/HEAD/drawpage.cpython-311.pyc -------------------------------------------------------------------------------- /detectclick.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AIDA-2456/Gesture-ATM/HEAD/detectclick.cpython-311.pyc -------------------------------------------------------------------------------- /profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Gesture-ATM 2 | GestureATM is an innovative project leveraging deep learning techniques for computer vision to enhance ATM security and accessibility. This repository provides a comprehensive solution for biometric transactions at ATMs through gesture recognition. 3 | -------------------------------------------------------------------------------- /misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /BIO METRIC TRANSACTION CONTROL-ATM-main.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /detectclick.py: -------------------------------------------------------------------------------- 1 | from config import cfg 2 | 3 | 4 | class DetectClick(): 5 | 6 | def __init__(self, circleCenters): 7 | self.circleCenters = circleCenters 8 | 9 | 10 | def detectClick(self, fingertip): 11 | curPg = cfg["currentpage"] 12 | buttons = cfg["pages"][curPg]["buttons"] 13 | radius = cfg["btnparams"]["R"] 14 | 15 | # Check if finger print point resides in any of the eight circles of buttons. 16 | for i, button in enumerate(buttons): 17 | if button and button.strip(): 18 | center_x = self.circleCenters[i][0] 19 | center_y = self.circleCenters[i][1] 20 | if ((fingertip[0] - center_x)**2 + (fingertip[1] - center_y)**2) < radius**2: 21 | return i 22 | -------------------------------------------------------------------------------- /facerec.py: -------------------------------------------------------------------------------- 1 | import face_recognition 2 | import os 3 | from config import cfg 4 | 5 | 6 | class FaceRec(): 7 | 8 | def __init__(self, facespath = "C:/Users/Dell/Downloads/Gesture-Based-Touchless-ATM-main/Gesture-Based-Touchless-ATM-main/Faces"): 9 | self.faces = [] 10 | # Store encodings of all the pictures from our database in memory. 11 | for file in os.listdir(facespath): 12 | if file.endswith(".jpeg") or file.endswith(".jpg"): 13 | img = face_recognition.load_image_file(os.path.join(facespath, file)) 14 | self.faces.append(face_recognition.face_encodings(img)[0]) 15 | 16 | 17 | def MatchTheFace(self, img): 18 | # Get encodings of the image/frame from the camera. 19 | encodings = face_recognition.face_encodings(img) 20 | 21 | # If encoding of any face is present then get it, else say no face matched. 22 | if len(encodings) > 0: 23 | encodings = encodings[0] 24 | else: 25 | return False 26 | 27 | comparisons = face_recognition.compare_faces(self.faces, encodings, tolerance=cfg["tolerance"]) 28 | 29 | # Return true only if at least one of the face matches in database matches wit clicked picture. 30 | return True if any(comparisons) else False 31 | -------------------------------------------------------------------------------- /workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 13 | 14 | 16 | 19 | 20 | 21 | 24 | 33 | 34 | 35 | 36 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 1711497321352 45 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 34 | -------------------------------------------------------------------------------- /drawpage.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | from config import cfg 4 | import cv2 5 | from operator import itemgetter 6 | 7 | class DrawPage(): 8 | 9 | def __init__(self, pages): 10 | self.pages = pages 11 | 12 | def drawThePage(self, pageName, img): 13 | buttons = self.pages[pageName]["buttons"] 14 | btnclr = cfg["btnclr"] 15 | R = cfg["btnparams"]["R"] 16 | txt = cfg["txtparams"] 17 | xadj,yadj,font,fontScale,tness = itemgetter("xadj","yadj","font","fontScale","thickness")(txt) 18 | txtclr = cfg["txtclr"] 19 | 20 | 21 | coords = self.getCoordintates() if "coords" not in cfg else cfg["coords"] 22 | 23 | for i in range(0, len(buttons)): 24 | if buttons[i] and buttons[i].strip(): 25 | # Draw rectangle which will show text 26 | cv2.rectangle(img, coords[i][0], coords[i][1], btnclr, cv2.FILLED) 27 | # Put text on the rectangle you just drew 28 | cv2.putText(img, buttons[i], (coords[i][0][0] + xadj, coords[i][1][1] + yadj), 29 | font, fontScale, txtclr, tness) 30 | # Draw the circle which will act as a button 31 | cv2.circle(img, coords[i][2], R, btnclr, 2) 32 | # Add title text for this page if it exists 33 | if "pagetitle" in self.pages[pageName]: 34 | title,titleY,fontSize,titleclr,titletness = self.pages[pageName]["pagetitle"] 35 | titleX = self.getXOrgofText(title,font,fontSize,titletness) 36 | # Make the text smaller if it's too big to fit in the screen. 37 | while titleX >= (cfg["screen_x"]+50): 38 | fontSize = fontSize - 0.25 39 | titleX = self.getXOrgofText(title,font,fontSize,titletness) 40 | cv2.putText(img, title, (titleX, titleY), font, fontSize, titleclr, titletness) 41 | 42 | # This function returns the width of the text. 43 | def getXOrgofText(self, text, fontFace, fontScale, thickness): 44 | (W, H), baseline = cv2.getTextSize(text, fontFace, fontScale, thickness) 45 | rem = cfg["screen_x"] - W 46 | return (rem-1)//2 if rem%2 == 1 else rem//2 47 | 48 | 49 | # Based on frame size and all the configurations, get coordinates of all the buttons and circles to be drawn. 50 | def getCoordintates(self): 51 | btnpr = cfg["btnparams"] 52 | W, H, BtnSp, CirSp = btnpr["W"], btnpr["H"], btnpr["BtnSp"], btnpr["CirSp"] 53 | scr_x = cfg["screen_x"] 54 | scr_y = cfg["screen_y"] 55 | coords = [] 56 | 57 | # Sequence of buttons wrt this list is as follows: 58 | # 1 - - 2 59 | # 3 - - 4 60 | # 5 - - 6 61 | # 7 - - 8 62 | 63 | # button 1 64 | pt1 = (0, scr_y - (4*H + 3*BtnSp)) 65 | pt2 = (W, scr_y - (3*H + 3*BtnSp)) 66 | c = (W + CirSp, pt2[1] - (H//2)) 67 | coords.append((pt1, pt2, c)) 68 | 69 | # button 2 70 | pt1 = (scr_x - W, scr_y - (4*H + 3*BtnSp)) 71 | pt2 = (scr_x, scr_y - (3*H + 3*BtnSp)) 72 | c = (pt1[0] - CirSp , pt2[1] - (H//2)) 73 | coords.append((pt1, pt2, c)) 74 | 75 | # button 3 76 | pt1 = (0, scr_y - (3*H + 2*BtnSp)) 77 | pt2 = (W, scr_y - (2*H + 2*BtnSp)) 78 | c = (W + CirSp , pt2[1] - (H//2)) 79 | coords.append((pt1, pt2, c)) 80 | 81 | # button 4 82 | pt1 = (scr_x - W, scr_y - (3*H + 2*BtnSp)) 83 | pt2 = (scr_x, scr_y - (2*H + 2*BtnSp)) 84 | c = (pt1[0] - CirSp , pt2[1] - (H//2)) 85 | coords.append((pt1, pt2, c)) 86 | 87 | # button 5 88 | pt1 = (0, scr_y - (2*H + BtnSp)) 89 | pt2 = (W, scr_y - (H + BtnSp)) 90 | c = (W + CirSp , pt2[1] - (H//2)) 91 | coords.append((pt1, pt2, c)) 92 | 93 | # button 6 94 | pt1 = (scr_x - W, scr_y - (2*H + BtnSp)) 95 | pt2 = (scr_x, scr_y - (H + BtnSp)) 96 | c = (pt1[0] - CirSp , pt2[1] - (H//2)) 97 | coords.append((pt1, pt2, c)) 98 | 99 | # button 7 100 | pt1 = (0, (scr_y - H)) 101 | pt2 = (W, scr_y) 102 | c = (W + CirSp, pt2[1] - (H//2)) 103 | coords.append((pt1, pt2, c)) 104 | 105 | # button 8 106 | pt1 = (scr_x - W, scr_y - H) 107 | pt2 = (scr_x, scr_y) 108 | c = (pt1[0] - CirSp , pt2[1] - (H//2)) 109 | coords.append((pt1, pt2, c)) 110 | 111 | cfg["coords"] = coords 112 | 113 | return coords 114 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | from config import cfg 3 | import mediapipe as mp 4 | from drawpage import DrawPage 5 | from detectclick import DetectClick 6 | import datetime 7 | from facerec import FaceRec 8 | 9 | 10 | def main(): 11 | # For webcam input. 12 | cap = cv2.VideoCapture(0) 13 | 14 | # Set the window size as per the configuration 15 | cap.set(cv2.CAP_PROP_FRAME_WIDTH, cfg["screen_x"]) 16 | cap.set(cv2.CAP_PROP_FRAME_HEIGHT, cfg["screen_y"]) 17 | 18 | # Initialise the class draw page with info of all the pages we're going to show 19 | dwPg = DrawPage(cfg["pages"]) 20 | 21 | # Get coordinates of buttons and other shapes we're going to draw on screen 22 | coords = dwPg.getCoordintates() 23 | 24 | # coords is a list of tuples where last element is center of a circle on screen 25 | detClick = DetectClick([s[-1] for s in coords]) 26 | 27 | # Iniitalise the face recognition class and the face detection classifier 28 | facerec = FaceRec() 29 | face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') 30 | 31 | # Initialise hand detection model 32 | mp_hands = mp.solutions.hands.Hands( 33 | min_detection_confidence = cfg["min_detection_confidence"], 34 | min_tracking_confidence = cfg["min_tracking_confidence"], 35 | max_num_hands = cfg["max_num_hands"] 36 | ) 37 | 38 | with mp_hands as hands: 39 | 40 | while cap.isOpened(): 41 | success, image = cap.read() 42 | if not success: 43 | print("Ignoring empty camera frame.") 44 | # If loading a video, use 'break' instead of 'continue'. 45 | break 46 | # Flip the image to make it mirror like and intuitive. 47 | # We use one image to draw and other to detect hands. 48 | overlay = cv2.flip(image, 1).copy() 49 | output = cv2.flip(image, 1).copy() 50 | # Try to match face only when Match button is clicked. 51 | if (("face_matched" in cfg and not cfg["face_matched"]) or "face_matched" not in cfg) and cfg["currentpage"] == "Match": 52 | gray = cv2.cvtColor(output, cv2.COLOR_BGR2GRAY) 53 | faces = face_cascade.detectMultiScale(gray, 1.05, 5) 54 | cfg["face_matched"] = facerec.MatchTheFace(image) if len(faces) >= 1 else False 55 | cfg["currentpage"] = "Transactions" if cfg["face_matched"] == True else "FaceRec" 56 | 57 | 58 | # Draw the buttons as per the current page to be shown to customer. 59 | dwPg.drawThePage(cfg["currentpage"], overlay) 60 | 61 | # Converting the image and making it non-writable for better performance. 62 | output = cv2.cvtColor(output, cv2.COLOR_BGR2RGB) 63 | output.flags.writeable = False 64 | 65 | # Processing the image to be able to detect hands in it if any. 66 | results = hands.process(output) 67 | 68 | # Reversing the color conversion and making image writable. 69 | output.flags.writeable = True 70 | output = cv2.cvtColor(output, cv2.COLOR_RGB2BGR) 71 | 72 | if results and results.multi_hand_landmarks: 73 | hand = results.multi_hand_landmarks[0] 74 | 75 | imgH, imgW, imgC = output.shape 76 | 77 | # Get position of the fingertip in form of pixels. 78 | xpos, ypos = int(hand.landmark[8].x * imgW), int(hand.landmark[8].y * imgH) 79 | 80 | # Draw a circle around the fingertip to make it more visible while being tracked. 81 | cv2.circle(overlay, (xpos, ypos), 20, (255, 0, 255), cv2.FILLED) 82 | 83 | # Detect if the fingertip has clicked any button or not. 84 | clickedBtnIndex = detClick.detectClick((xpos, ypos)) 85 | 86 | if clickedBtnIndex != None and clickedBtnIndex>-1 and clickedBtnIndex <8: 87 | # endtime is timestamp till which the fingertip needs to be on a button for it to qualify as a click. 88 | 89 | # Calculate the endtime if not already calculated. 90 | if "endtime" not in cfg: 91 | cfg["endtime"] = datetime.datetime.now() + datetime.timedelta(seconds=cfg["btnClickDelay"]) 92 | cfg["endtime"] = cfg["endtime"].strftime("%H:%M:%S.%f")[:-5] 93 | 94 | # After some seconds, check if the fingertip is still on button. If yes, then navigate. 95 | elif cfg["endtime"] <= datetime.datetime.now().strftime("%H:%M:%S.%f")[:-5]: 96 | cPage = cfg["currentpage"] 97 | cfg["currentpage"] = cfg["pages"][cPage]["navigation"][clickedBtnIndex] 98 | del cfg["endtime"] 99 | 100 | elif clickedBtnIndex == None and "endtime" in cfg: 101 | if "face_matched" in cfg: 102 | del cfg["face_matched"] 103 | del cfg["endtime"] 104 | 105 | # After all the drawing and hand tracking, put both images on top of each other. 106 | alpha = cfg["alpha"] 107 | cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output) 108 | 109 | # Show the image in window. 110 | cv2.imshow("Bio-Metric transaction control ATM", output) 111 | 112 | # Stop running the code when Escape key is pressed or if any Exit option is chosen. 113 | if cv2.waitKey(5) & 0xFF == 27 or cfg["currentpage"] == "Exit": 114 | break 115 | 116 | cap.release() 117 | 118 | 119 | if __name__ == "__main__": 120 | main() 121 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | cfg = { 4 | "screen_x": 1280, 5 | "screen_y": 720, 6 | "min_detection_confidence": 0.65, # What % of confidence is required to detect the hand 7 | "min_tracking_confidence": 0.65, # What % of confidence is required to track the hand 8 | "max_num_hands": 1, # How many hands are allowed to be tracked. 9 | "tolerance": 0.75, # the confidence or matching % for matching two faces 10 | "alpha": 0.75, # The amount bleding to be done while overlaying one image on top of another 11 | "btnClickDelay": 1.5, # Amount of seconds the fingertips has to be inside the circle to make a click 12 | "btnclr" : (255, 0, 0), # BGR Colour of all the buttons 13 | "txtclr" : (255,255,255), # BGR Colour of all the text only on buttons 14 | "btnparams": { 15 | "W": 400, # width of the button 16 | "H": 80, # height of the button 17 | "BtnSp": 20, # space between two buttons 18 | "R": 40, # Radius of the button circles for each rectangle button. 1/2 * H 19 | "CirSp": 50 # Space between edge of rectangle and center of the circle button 20 | }, 21 | "txtparams": { 22 | # amount of pixels by which putText origin has to be adjusted w.r.t top left corner 23 | # of the rectangle button 24 | "xadj": +20, 25 | "yadj": -20, 26 | # Integer denoting font which is HERSHEY as per CV2 module 27 | "font": 0, 28 | # Size of the font 29 | "fontScale": 1.8, 30 | # How thick the font should be 31 | "thickness": 2 32 | }, 33 | "currentpage": "FaceRec", # Starting page is always facerec as it's the login page. 34 | "pages": { 35 | "FaceRec":{ 36 | "pagetitle":["Select Match to match your face and Login", 100, 1.5, (255,0,0), 4], 37 | "buttons": ["","","","","","","","Match"], 38 | "navigation": ["","","","","","","","Match"] 39 | }, 40 | "Transactions":{ 41 | # List corresponding to pagetitle is as follows from left to right: 42 | # title text, H of text, font size, text colour, text thickness 43 | "pagetitle": ["Select Any Transaction", 150, 2, (255,0,0), 4], 44 | # Sequence of buttons wrt this list is as follows: 45 | # 1 - - 2 46 | # 3 - - 4 47 | # 5 - - 6 48 | # 7 - - 8 49 | "buttons":["Withdraw", "Balance", "Transfer", "Deposit", "", "" , "Exit", ""], 50 | # This is the "pages" to which each of these buttons will navigate to when selected. 51 | "navigation": ["Withdraw-SelAccType", "Balance-SelAccType", "Transfer-SelAccType", 52 | "Deposit-SelAccType", "", "", "Exit", ""] 53 | }, 54 | 55 | # All the pages for Withdrawal transaction 56 | "Withdraw-SelAccType" : { 57 | "pagetitle": ["Select Account Type", 150, 2, (255,0,0), 4], 58 | "buttons":["", "Savings", "", "Checking", "", "Credit"], 59 | "navigation": ["", "SelectAmountW", "", "SelectAmountW", "", "SelectAmountW"] 60 | }, 61 | "SelectAmountW": { 62 | "pagetitle": ["Select Amount to Withdraw", 150, 2, (255,0,0), 4], 63 | "buttons":["Rs.100", "Rs.200", "Rs.500", "Rs.2000"], 64 | "navigation": ["ReceiptW","ReceiptW","ReceiptW","ReceiptW"] 65 | }, 66 | "ReceiptW": { 67 | "pagetitle": ["Do you want a Receipt?", 150, 2, (255,0,0), 4], 68 | "buttons":["Yes", "", "No"], 69 | "navigation": ["WDDoneR", "", "WDDone"] 70 | }, 71 | "WDDoneR": { 72 | "pagetitle": ["Please take your Card, Cash, & Receipt", 150, 1.8, (255,0,0), 4], 73 | "buttons":["", "", "", "", "", "", "New Txn", "Done"], 74 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"] 75 | }, 76 | "WDDone": { 77 | "pagetitle": ["Please take your Card & Cash", 150, 2, (255,0,0), 4], 78 | "buttons":["", "", "", "", "", "", "New Txn", "Done"], 79 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"] 80 | }, 81 | 82 | # All the pages for Balance Enquiry transaction 83 | "Balance-SelAccType" : { 84 | "pagetitle": ["Select Account Type", 150, 2, (255,0,0), 4], 85 | "buttons":["", "Savings", "", "Checking"], 86 | "navigation": ["", "ReceiptBL", "", "ReceiptBL"] 87 | }, 88 | "ReceiptBL": { 89 | "pagetitle": ["Do you want a Receipt?", 150, 2, (255,0,0), 4], 90 | "buttons":["Yes", "", "No"], 91 | "navigation": ["BLDoneR", "", "BLDone"] 92 | }, 93 | "BLDoneR": { 94 | "pagetitle": ["Your Balance is Rs.5000. Please take Receipt", 150, 1.5, (255,0,0), 4], 95 | "buttons":["", "", "", "", "", "", "New Txn", "Done"], 96 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"] 97 | }, 98 | "BLDone": { 99 | "pagetitle": ["Your Balance is Rs.5000.", 150, 2, (255,0,0), 4], 100 | "buttons":["", "", "", "", "", "", "New Txn", "Done"], 101 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"] 102 | }, 103 | 104 | # All the pages for Transfer transaction 105 | "Transfer-SelAccType" : { 106 | "pagetitle": ["Select Transfer Type", 150, 2, (255,0,0), 4], 107 | "buttons":["", "Sav>Check", "", "Check>Sav"], 108 | "navigation": ["", "SelectAmountT", "", "SelectAmountT"] 109 | }, 110 | "SelectAmountT": { 111 | "pagetitle": ["Select Amount to Transfer", 150, 2, (255,0,0), 4], 112 | "buttons":["Rs.100", "Rs.200", "Rs.500", "Rs.2000"], 113 | "navigation": ["ReceiptT","ReceiptT","ReceiptT","ReceiptT"] 114 | }, 115 | "ReceiptT": { 116 | "pagetitle": ["Do you want a Receipt?", 150, 2, (255,0,0), 4], 117 | "buttons":["Yes", "", "No"], 118 | "navigation": ["TDoneR", "", "TDone"] 119 | }, 120 | "TDoneR": { 121 | "pagetitle": ["Your Transfer was Successful! Please take Receipt.", 150, 1.5, (255,0,0), 4], 122 | "buttons":["", "", "", "", "", "", "New Txn", "Done"], 123 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"] 124 | }, 125 | "TDone": { 126 | "pagetitle": ["Your Transfer was Successful!", 150, 2, (255,0,0), 4], 127 | "buttons":["", "", "", "", "", "", "New Txn", "Done"], 128 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"] 129 | }, 130 | 131 | # All the pages for Deposit transaction 132 | "Deposit-SelAccType" : { 133 | "pagetitle": ["Select Account Type", 150, 2, (255,0,0), 4], 134 | "buttons":["", "Savings", "", "Checking"], 135 | "navigation": ["", "SelectAmountD", "", "SelectAmountD"] 136 | }, 137 | "SelectAmountD": { 138 | "pagetitle": ["Select Amount to Deposit", 150, 2, (255,0,0), 4], 139 | "buttons":["Rs.100", "Rs.200", "Rs.500", "Rs.2000"], 140 | "navigation": ["Deposit","Deposit","Deposit","Deposit"] 141 | }, 142 | "Deposit":{ 143 | "pagetitle": ["Please Insert the Money", 150, 2, (255,0,0), 4], 144 | "buttons": ["","","","","","","","Done"], 145 | "navigation": ["","","","","","","","ReceiptD"] 146 | }, 147 | "ReceiptD": { 148 | "pagetitle": ["Do you want a Receipt?", 150, 2, (255,0,0), 4], 149 | "buttons":["Yes", "", "No"], 150 | "navigation": ["DDoneR", "", "DDone"] 151 | }, 152 | "DDoneR": { 153 | "pagetitle": ["Your Deposit was Successful! Please take Receipt.", 150, 1.5, (255,0,0), 4], 154 | "buttons":["", "", "", "", "", "", "New Txn", "Done"], 155 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"] 156 | }, 157 | "DDone": { 158 | "pagetitle": ["Your Deposit was Successful!", 150, 2, (255,0,0), 4], 159 | "buttons":["", "", "", "", "", "", "New Txn", "Done"], 160 | "navigation": ["", "", "", "", "", "", "Transactions", "Exit"] 161 | } 162 | } 163 | } 164 | --------------------------------------------------------------------------------