Preamable
After the success of the first project, RLM decided to hack into one of his childhood treasure -Gameboy Console.
The task of this project is to: 1) reverse engineer and hack Gameboy in order to control it with Arduino, 2) and remotely play it from web.
The Soldering and the Arduino Sketch Code
The Soldering
The biggest challenge is to reverse engineer the buttons of Gameboy and figure out a way to control them using Arduino. It turned out easier than what we visioned. There are four touch pads under each button, two high in voltage and two in low stage. Every time a button was pressed, the corresponding command was trigger by short-circuit the high-state pads. So all we need to do is to connect the high-state pad to a Arduino Pin and activate the button by switching it from High to Low.
The next challenge is to solder those tiny pads to a wire and hook it up to Arduino. A used hard drive ribbon and some hot glue served the purpose well. Following is the final setup.
The Arduino Sketch Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
//// Arduino -> GameBoy Pin Map // 53 -> 1 -> B // 52 -> 5 -> Select // 51 -> 2 -> Up // 50 -> 6 -> Down // 49 -> 3 -> A // 48 -> 7 -> Start // 47 -> 4 -> Right // 46 -> 8 -> Left static int button_pin_START = 46; static int button_pin_END = 53; static int button_A = 52; static int button_B = 53; static int button_START = 50; static int button_SELECT = 51; static int button_UP = 49; static int button_DOWN = 47; static int button_RIGHT = 48; static int button_LEFT = 46; void init_button_pins(){ for(int i=button_pin_START; i<=button_pin_END; i++){ pinMode(i, OUTPUT); // We use low voltage to "press" a gameboy button. digitalWrite(i, HIGH); } // Opens serial port, sets data rate to 9600 bits per second. Serial.begin(9600); } void press_button(int button_code){ digitalWrite(button_code, LOW); delay(10); digitalWrite(button_code, HIGH); } int incomingByte = 0; // for incoming serial data void serial_press_query(){ // read from the serial port and directly press the button which // corresponds to the byte. Input bits MUST be one of the defined // button codes. No error checking is performed. if (Serial.available() > 0) { incomingByte = Serial.read(); press_button((int)incomingByte); } } void setup() {init_button_pins();} void loop() {serial_press_query();} |
Python CGI -The Gateway between Arduino and Web Interface
Following Python CGI code is used to communicate with Arduino. Note: RLM use perl CGI to call python scripts. I am using a Pyhton CGI for shortcut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/usr/bin/env python import sys import serial import os import time import cgi fs = cgi.FieldStorage() btn = fs.getvalue("button_name") # this needs to be printed first before anything else, or will gets malformed header and internal 500 errors # not needed when called from perl NOT as a CGI script print("Content-Type: text/html\n") print('btn is:', btn) ser = serial.Serial('/dev/ttyACM0', 9600) time.sleep(1.5) # time needed for arduino reset # print(sys.argv[1]) # button_code = int(sys.argv[1]) button_codes = {"A" : 52, "B" : 53,"S" : 50, "s" : 51, "u" : 49, "d" : 47, "r" : 48, "l" : 46} button_code = button_codes[btn] valid_button_code_START = 46 valid_button_code_END = 53 print('button_code is:',button_code) if (46 <= button_code <= 53): ser.write(str(chr(button_code)).encode()) # print('sys.argv[0] is:',sys.argv[0]) # print('sys.argv[1] is:',sys.argv[1]) else: print("invalid code (need [46,53]):", button_code) os.strerror(5) |
Javascript for HTML and Paython Binding
Following jQuery javascript binds the interface elements to python CGI, and also jquery.hotkeys-0.7.9.min.js is needed for key stroke binding.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
function key_press(button_name){ return function (){ $.post( "http://localhost/cgi-bin/python/serial-send-gameboy-cgi.py", {button_name: button_name}); }} function click_binding(id, button_name){ /* Enable an html element to control the gameboy via a keypress */ $(id).click(key_press(button_name)); } function keyboard_binding(key_name, button_name){ $(document).bind('keydown', key_name, key_press(button_name)); } /* establish controls for the gameboy, both on-screen and keyboard */ function bind_gb_button(div_name, key_name, button_name){ click_binding(div_name, button_name); keyboard_binding(key_name, button_name); } $(document).ready(function(){ bind_gb_button("#right", 'right', "r"); bind_gb_button("#left", 'left', "l"); bind_gb_button("#up",'up', "u"); bind_gb_button("#down",'down', "d"); bind_gb_button("#start", 'space', "S"); bind_gb_button("#select",'enter', "s"); bind_gb_button("#a", 'z', "A"); bind_gb_button("#b", 'x', "B"); }); |
Website Interface
I tranformed both pages into bootstrap framework.
Simple Web Interface with 6 Buttons
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Arduino connectivity test</title> <!-- Bootstrap --> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="https://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css"> <!-- Optional theme --> <link rel="stylesheet" href="https://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap-theme.min.css"> <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> <![endif]--> <!-- <link href='./gameboy.css' rel='stylesheet' type='text/css'/> --> <script src="./lib/jquery-2.1.3.min.js"></script> <script src="./lib/jquery.hotkeys-0.7.9.min.js"></script> <script src="./gameboy.js"></script> <style> .center-block {float: none !important display: block; margin-left: auto; margin-right: auto; text-align: center; //required to center } </style> </head> <body> <div class="container"> <div class="jumbotron"> <div class="row"> <div class="center-block"> <h1>Gameboy Console</h1> </div> </div> <div class="key-box row" id="arrows"> <div class="row"> <div class="button col-sm-1 col-sm-push-6 btn btn-default" id="up" data-toggle="tooltip" data-placement="top" title="click or press u"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-arrow-up.png" width=80px></img></div> </div> <div class="row"> <div class="button col-sm-1 col-sm-push-5 btn btn-default" id="left" data-toggle="tooltip" data-placement="left" title="click or press l"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-arrow-left.png" width=80px></img></div> <div class="button col-sm-1 col-sm-push-6 btn btn-default" id="right" data-toggle="tooltip" data-placement="right" title="click or press r"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-arrow-right.png" width=80px></img></div> </div> <div class="row"> <div class="button col-sm-1 col-sm-push-6 btn btn-default" id="down" data-toggle="tooltip" data-placement="down" title="click or press d"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-arrow-down.png" width=80px></img></div> </div> </div> <div class="key-box row" id="other-keys"> <div class="round-buttons row"> <div class="row"> <div class="button btn col-sm-1 col-sm-push-5" id="a" data-toggle="tooltip" data-placement="right" title="click or press z"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-a-button.png" width=100px></img></div> <div class="button btn col-sm-1 col-sm-push-6" id="b"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-b-button.png" width=100px></img></div> </div> </div> <div class="thin-buttons row"> <div class="row"> <div class="button btn btn-danger col-sm-1 col-sm-push-5" id="start" data-toggle="tooltip" data-placement="right" title="click or press SPACE">START</div> <div class="button btn btn-primary col-sm-1 col-sm-push-6" id="select" data-toggle="tooltip" data-placement="right" title="click or press Enter">SELECT</div> </div> </div> </div> </div> </div> <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <!-- Include all compiled plugins (below), or include individual files as needed --> <script src="https://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script> <script src="/socket.io/socket.io.js"></script> </body> </html> |
Using a Gameboy Image Web GUI Interface
I went one step further, use a real image as following and slice it into image maps. Use mouse to click on the console to play and the key stroke bindings are the same.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
<html> <head> <title>Game_Boy_Color_Pokémon</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <!-- <link href='./gameboy.css' rel='stylesheet' type='text/css'/> --> <script src="./lib/jquery-2.1.3.min.js"></script> <script src="./lib/jquery.hotkeys-0.7.9.min.js"></script> <script src="./gameboy.js"></script> <!-- Optional theme --> <link rel="stylesheet" href="https://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap-theme.min.css"> <style> html, body { height: 100%; } html { display: table; margin: auto; } body { display: table-cell; vertical-align: middle; } *:focus { outline: none; } </style> <script type="text/javascript"> $(document).ready(function(){ $(".btn").click(function() { $(this).find('img').stop().fadeTo(100,0.8).delay(10).fadeTo(100,1); }); }); </script> </head> <body bgcolor="#FFFFFF" style="display:table-cell; text-align:center; vertical-align:middle;"> <!-- Save for Web Slices (Game_Boy_Color_Pokémon.psd) --> <table id="Table_01" width="460" height="778" border="0" cellpadding="0" cellspacing="0"> <tr> <td colspan="18"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_01.png" width="459" height="31" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="31" alt=""></td> </tr> <tr> <td colspan="2" rowspan="5"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_02.png" width="25" height="464" alt=""></td> <td colspan="14"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-display.png" width="408" height="359" alt=""></td> <td colspan="2" rowspan="3"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_04.png" width="26" height="436" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="359" alt=""></td> </tr> <tr> <td colspan="14"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_05.png" width="408" height="56" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="56" alt=""></td> </tr> <tr> <td rowspan="3"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_06.png" width="41" height="49" alt=""></td> <td colspan="5" rowspan="3"> <div class="button btn" id="up"> <a href="#" data-role="button"><img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-up.png" title="click or press u" width="60" height="49" alt=""></a> </div> </td> <td colspan="8"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_08.png" width="307" height="21" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="21" alt=""></td> </tr> <tr> <td colspan="7"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_09.png" width="221" height="22" alt=""></td> <td colspan="2" rowspan="6"> <div data-role="button" class="button btn" id="a"> <a href="#" data-role="button"><img id="a" src="images-console/a-button.png" title="click or press z" width="90" height="79" alt=""></a> </div> </td> <td rowspan="12"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_11.png" width="22" height="310" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="22" alt=""></td> </tr> <tr> <td colspan="4" rowspan="2"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_12.png" width="137" height="9" alt=""></td> <td colspan="2" rowspan="6"> <div class="button btn" id="b"> <a href="#" data-role="button"><img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-b-button1.png" title="click or press x" width="81" height="89" alt=""></a> </div> </td> <td rowspan="11"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_14.png" width="3" height="288" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="6" alt=""></td> </tr> <tr> <td rowspan="10"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_15.png" width="23" height="282" alt=""></td> <td colspan="4" rowspan="2"> <div class="button btn" id="left"> <a href="#" data-role="button"><img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-left.png" title="click or press l" width="64" height="39" alt=""></a> </div> </td> <td colspan="3"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_17.png" width="39" height="3" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="3" alt=""></td> </tr> <tr> <td colspan="2"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_18.png" width="35" height="36" alt=""></td> <td colspan="3"> <div class="button btn" id="right"> <a href="#" data-role="button"><img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-right.png" title="click or press r" width="55" height="36" alt=""></a> </div> </td> <td colspan="2" rowspan="6"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_20.png" width="86" height="122" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="36" alt=""></td> </tr> <tr> <td colspan="3"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-left-22.png" width="54" height="6" alt=""></td> <td colspan="2" rowspan="4"> <div class="button btn" id="down"> <a href="#" data-role="button"><img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-down.png" title="click or press d" width="42" height="53" alt=""></a> </div> </td> <td colspan="4" rowspan="5"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_23.png" width="58" height="86" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="6" alt=""></td> </tr> <tr> <td colspan="3" rowspan="7"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_24.png" width="54" height="237" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="6" alt=""></td> </tr> <tr> <td colspan="2" rowspan="6"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_25.png" width="90" height="231" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="32" alt=""></td> </tr> <tr> <td colspan="2" rowspan="2"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_26.png" width="81" height="42" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="9" alt=""></td> </tr> <tr> <td colspan="2" rowspan="4"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_27.png" width="42" height="190" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="33" alt=""></td> </tr> <tr> <td colspan="3" rowspan="3"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_28.png" width="30" height="157" alt=""></td> <td colspan="2" rowspan="2"> <div class="button btn" id="select"> <a href="#" data-role="button"><img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-select.png" title="click or press ENTER" width="82" height="81" alt=""></a> </div> </td> <td colspan="2"> <div class="button btn" id="start"> <a href="#" data-role="button"><img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-start.png" title="click or press SPACE" width="83" height="79" alt=""></a> </div> </td> <td rowspan="3"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_31.png" width="30" height="157" alt=""></td> <td> <a href="#" data-role="button"><img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="79" alt=""></td></a> </tr> <tr> <td colspan="2" rowspan="2"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_32.png" width="83" height="78" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="2" alt=""></td> </tr> <tr> <td colspan="2"> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-GameBoyPokemon_33.png" width="82" height="76" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="1" height="76" alt=""></td> </tr> <tr> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="23" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="2" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="41" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="11" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="10" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="32" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="3" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="4" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="23" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="28" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="54" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="32" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="51" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="30" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="3" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="86" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="4" height="1" alt=""></td> <td> <img src="http://tech.memoryimprintstudio.com/wp-content/uploads/2015/12/wpid-spacer.gif" width="22" height="1" alt=""></td> <td></td> </tr> </table> <!-- End Save for Web Slices --> <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <!-- Include all compiled plugins (below), or include individual files as needed --> <script src="https://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script> <script src="/socket.io/socket.io.js"></script> </body> </html> |
DEC
About the Author:
Beyond 8 hours - Computer, Sports, Family...