├── install.bat ├── install.sh ├── run.sh ├── run.bat ├── inspect.bat ├── client ├── icon.png ├── cookies.js ├── index.html ├── style.css ├── game.js └── jquery-3.3.1.min.js ├── .dockerignore ├── Dockerfile ├── .gitignore ├── README.md ├── .github └── ISSUE_TEMPLATE │ ├── Feature_request.md │ └── Bug_report.md ├── package.json ├── LICENSE ├── CODE_OF_CONDUCT.md └── app.js /install.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | npm install -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | npm install -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | export PORT=80 3 | node app.js -------------------------------------------------------------------------------- /run.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | set port=80 3 | node app.js 4 | pause -------------------------------------------------------------------------------- /inspect.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | set port=80 3 | node --inspect app.js 4 | pause -------------------------------------------------------------------------------- /client/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AntonUden/jsShooter/HEAD/client/icon.png -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | package-lock.json 2 | .github 3 | .gitignore 4 | CODE_OF_CONDUCT.md 5 | .dockerignore 6 | README.md 7 | *.bat 8 | *.sh 9 | LICENSE -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:14 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json ./ 6 | 7 | RUN npm install 8 | 9 | COPY . . 10 | 11 | EXPOSE 80 12 | 13 | CMD ["npm", "start"] -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib-cov 2 | *.seed 3 | *.log 4 | *.csv 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | 10 | package-lock.json 11 | 12 | pids 13 | logs 14 | results 15 | 16 | node_modules 17 | npm-debug.log 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jsShooter 2 | This was one of my first project on github! It is by no way well written or maintained but it seems to be one of my most popular repos for some reason. 3 | 4 | This is a HTML5+Javascript browser game where you shoot other players, enemies and blocks to gain points and buy upgrades. 5 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/Feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | 5 | --- 6 | 7 | **Is your feature request related to a problem? Please describe.** 8 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 9 | 10 | **Describe the solution you'd like** 11 | A clear and concise description of what you want to happen. 12 | 13 | **Describe alternatives you've considered** 14 | A clear and concise description of any alternative solutions or features you've considered. 15 | 16 | **Additional context** 17 | Add any other context or screenshots about the feature request here. 18 | -------------------------------------------------------------------------------- /client/cookies.js: -------------------------------------------------------------------------------- 1 | function setCookie(cname, cvalue, exdays) { 2 | let d = new Date(); 3 | d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); 4 | let expires = "expires="+d.toUTCString(); 5 | document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; 6 | } 7 | 8 | function getCookie(cname) { 9 | let name = cname + "="; 10 | let ca = document.cookie.split(';'); 11 | for(let i = 0; i < ca.length; i++) { 12 | let c = ca[i]; 13 | while (c.charAt(0) == ' ') { 14 | c = c.substring(1); 15 | } 16 | if (c.indexOf(name) == 0) { 17 | return c.substring(name.length, c.length); 18 | } 19 | } 20 | return ""; 21 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jsShooter", 3 | "version": "1.0.0", 4 | "description": "Nodejs and html5 game", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "node --debug --use_strict app.js", 8 | "start": "node app.js" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/AntonUden/jsShooter.git" 13 | }, 14 | "dependencies": { 15 | "colors": "1.3.2", 16 | "socket.io": "4.6.2", 17 | "express": "4.20.0", 18 | "socketio-wildcard": "2.0.0", 19 | "ws": "^8.2.2" 20 | }, 21 | "keywords": [], 22 | "author": "AntonUden", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/AntonUden/jsShooter/issues" 26 | }, 27 | "homepage": "https://github.com/AntonUden/jsShooter#readme" 28 | } 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/Bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | 5 | --- 6 | 7 | **Describe the bug** 8 | A clear and concise description of what the bug is. 9 | 10 | **To Reproduce** 11 | Steps to reproduce the behavior: 12 | 1. Go to '...' 13 | 2. Click on '....' 14 | 3. Scroll down to '....' 15 | 4. See error 16 | 17 | **Expected behavior** 18 | A clear and concise description of what you expected to happen. 19 | 20 | **Screenshots** 21 | If applicable, add screenshots to help explain your problem. 22 | 23 | **Desktop (please complete the following information):** 24 | - OS: [e.g. iOS] 25 | - Browser [e.g. chrome, safari] 26 | - Version [e.g. 22] 27 | 28 | **Smartphone (please complete the following information):** 29 | - Device: [e.g. iPhone6] 30 | - OS: [e.g. iOS8.1] 31 | - Browser [e.g. stock browser, safari] 32 | - Version [e.g. 22] 33 | 34 | **Additional context** 35 | Add any other context about the problem here. 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Anton udén 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | JS Shooter 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 |
undefined
20 |
21 |
22 | You are dead 23 |
24 |
25 |
0
26 |
27 |
28 | Powerup time left: 29 |
30 | 0 31 |
32 |
33 | 34 | 37 |
38 | 39 | 40 | 41 | 42 | Lock menu 43 |
44 | 46 | 47 | Source code 48 |
49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at udenanton@hotmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /client/style.css: -------------------------------------------------------------------------------- 1 | button { 2 | white-space: nowrap; 3 | } 4 | 5 | html { 6 | background-color: black; 7 | overflow: hidden; 8 | display: block; 9 | } 10 | 11 | #ctx { 12 | position: absolute; 13 | left: 0px; 14 | top: 0px; 15 | width: 100%; 16 | height: 100%; 17 | border:1px solid #000000; 18 | z-index:-1; 19 | } 20 | 21 | #nameInput { 22 | box-shadow: none; 23 | } 24 | 25 | #uiDiv { 26 | background-color: rgba(255,255,255,0.2); 27 | overflow-y: hidden; 28 | text-align: center; 29 | position: absolute; 30 | z-index: 10; 31 | border:1px solid #000000; 32 | bottom: 0; 33 | right: 0; 34 | left: 0; 35 | height: 60px; 36 | width: 100%; 37 | transition: 1s; 38 | transition-timing-function: ease-in-out; 39 | } 40 | #uiDiv:hover { 41 | background-color: rgba(240,255,255,0.8); 42 | transition: 1s; 43 | } 44 | 45 | #menuTextDiv:hover { 46 | background-color: rgba(240,255,240,0.8); 47 | transition: 1s; 48 | transition-timing-function: ease-in-out; 49 | } 50 | 51 | #menuTextDiv { 52 | background-color: rgba(255,255,255,0.2); 53 | overflow-y: hidden; 54 | text-align: center; 55 | position: absolute; 56 | z-index: 10; 57 | border:1px solid #000000; 58 | bottom: 0; 59 | right: 0; 60 | left: 0; 61 | height: 0px; 62 | width: 100%; 63 | transition: 1s; 64 | transition-timing-function: ease-in-out; 65 | } 66 | 67 | #overlay { 68 | overflow-y: hidden; 69 | position: absolute; 70 | z-index: 9; 71 | top: 0; 72 | right: 0; 73 | bottom: 0; 74 | left: 0; 75 | width: 100%; 76 | height: 100%; 77 | } 78 | 79 | #scoreDiv { 80 | overflow-y: hidden; 81 | text-align: center; 82 | z-index: 2; 83 | position: absolute; 84 | top:10px; 85 | bottom: 0; 86 | left: 0; 87 | right: 0; 88 | margin: auto; 89 | color: black; 90 | font-size: 150%; 91 | } 92 | 93 | #death { 94 | background-color: rgba(0,0,0,0.0); 95 | text-align: center; 96 | z-index: 2; 97 | position: absolute; 98 | margin: auto; 99 | top: 70%; 100 | right: 0; 101 | bottom: 0; 102 | left: 0; 103 | width: 100%; 104 | height: 100%; 105 | display: none; 106 | } 107 | 108 | #dead { 109 | text-align: center; 110 | font-size: 500%; 111 | color: #AA0000; 112 | } 113 | 114 | #countdown { 115 | text-align: center; 116 | font-size: 150%; 117 | } 118 | 119 | #powerupCountdown { 120 | display: none; 121 | white-space: nowrap; 122 | text-align: center; 123 | position: absolute; 124 | top:30px; 125 | bottom: 0; 126 | left: 0; 127 | right: 0; 128 | margin: auto; 129 | color: black; 130 | font-size: 200%; 131 | display: inline-block; 132 | } 133 | 134 | #powerupCountdownTimer { 135 | display: inline-block; 136 | white-space: nowrap; 137 | } 138 | 139 | .shadow { 140 | transition: 1s; 141 | } 142 | 143 | .shadow:hover { 144 | box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19); 145 | transition: 1s; 146 | } 147 | 148 | .noselect { 149 | -webkit-touch-callout: none; /* iOS Safari */ 150 | -webkit-user-select: none; /* Safari */ 151 | -khtml-user-select: none; /* Konqueror HTML */ 152 | -moz-user-select: none; /* Firefox */ 153 | -ms-user-select: none; /* Internet Explorer/Edge */ 154 | user-select: none; /* Non-prefixed version, currentlysupported by Chrome and Opera */ 155 | } 156 | 157 | a { 158 | transition: 1s; 159 | transition-timing-function: ease-in-out; 160 | color:#1337FF; /* unvisited link */ 161 | } 162 | 163 | a:visited { 164 | color:#1337FF; /* visited link */ 165 | } 166 | 167 | a:hover { 168 | color:#11FFBB; /* mouse over link */ 169 | } 170 | 171 | a:active { 172 | color:#1337FF; 173 | } -------------------------------------------------------------------------------- /client/game.js: -------------------------------------------------------------------------------- 1 | var uiDiv = document.getElementById("uiDiv"); 2 | var countdownDiv = document.getElementById("countdown"); 3 | var scoreDiv = document.getElementById("scoreDiv"); 4 | var canvas = document.getElementById('ctx'); 5 | var ctx = canvas.getContext("2d"); 6 | var clickCooldown = 0; 7 | ctx.font = "100px Arial"; 8 | ctx.textAlign = "center"; 9 | ctx.fillStyle = "#FFFFFF"; 10 | ctx.fillRect(0, 0, 1200, 600); 11 | ctx.fillStyle = "#BBBBBB"; 12 | 13 | for (let bgLineX = 0; bgLineX < 1200; bgLineX += 20) { 14 | ctx.fillRect(bgLineX, 0, 1, 600); 15 | } 16 | for (let bgLineY = 0; bgLineY < 600; bgLineY += 20) { 17 | ctx.fillRect(0, bgLineY, 1200, 1); 18 | } 19 | ctx.fillStyle = "#000000"; 20 | 21 | ctx.fillText("No game data =(", 600, 300); 22 | ctx.font = "30px Arial"; 23 | ctx.fillText("Try reloading the page.", 600, 330); 24 | 25 | ctx.font = "10px Arial"; 26 | setTimeout(function () { 27 | uiDiv.style.height = "0px"; 28 | $("#menuTextDiv").height("20px"); 29 | }, 500); 30 | 31 | var socket = io(); 32 | var id = 0.0; 33 | var mx = 0; 34 | var my = 0; 35 | var lmx = -1; 36 | var lmy = -1; 37 | 38 | var upgHP = 500; 39 | 40 | var uiVisible = false; 41 | var shooter_blink_state = true; 42 | var dead = false; 43 | var respawnCooldown = 0; 44 | var colorBlink = 0; 45 | 46 | socket.on("id", function (data) { 47 | console.log("Your id is " + data.id); 48 | id = data.id; 49 | setTimeout(function () { 50 | socket.emit("kthx"); 51 | }, 100); 52 | }); 53 | 54 | function nameInputKeydown(event) { 55 | if (event.keyCode == 13) { 56 | $('#setName').click(); 57 | } 58 | } 59 | 60 | $("#upgradehp").click(function () { 61 | if (clickCooldown < 1) { 62 | clickCooldown = 1; 63 | setTimeout(function () { 64 | socket.emit("upgHPClicked"); 65 | }, 100); 66 | } 67 | }); 68 | 69 | function changeName() { 70 | if (clickCooldown < 1) { 71 | clickCooldown = 1; 72 | let name = "" + $("#nameInput").val(); 73 | if (name == "") { 74 | name = "Unnamed"; 75 | } 76 | console.log("changing name to " + name); 77 | socket.emit("changeName", { 78 | name: name 79 | }); 80 | setCookie("jsshooter_name", name, 60); 81 | $("#nameInput").val(name); 82 | } 83 | } 84 | 85 | $("#setName").click(function () { 86 | changeName(); 87 | }); 88 | 89 | $("#upgradedb").click(function () { 90 | if (clickCooldown < 1) { 91 | clickCooldown = 1; 92 | setTimeout(function () { 93 | socket.emit("upgDualBullets"); 94 | }, 100); 95 | } 96 | }); 97 | 98 | $("#upgradeBulletSize").click(function () { 99 | if (clickCooldown < 1) { 100 | clickCooldown = 1; 101 | setTimeout(function () { 102 | socket.emit("upgBulletSize"); 103 | }, 100); 104 | } 105 | }); 106 | 107 | $("#upgradefs").click(function () { 108 | if (clickCooldown < 1) { 109 | clickCooldown = 1; 110 | setTimeout(function () { 111 | socket.emit("upgFSpeedClicked"); 112 | }, 100); 113 | } 114 | }); 115 | 116 | function mouseMove(e) { 117 | mx = Math.round(e.clientX / window.innerWidth * 1200); 118 | my = Math.round(e.clientY / window.innerHeight * 600); 119 | if (e.clientY < window.innerHeight - 70 && uiVisible && !$("#mlock").prop('checked')) { 120 | unfocus(); 121 | uiVisible = false; 122 | uiDiv.style.height = "0px"; 123 | $("#menuTextDiv").height("20px"); 124 | } else if (e.clientY > window.innerHeight - 40 && !uiVisible) { 125 | uiVisible = true; 126 | $("#menuTextDiv").height("0px"); 127 | uiDiv.style.height = "55px"; 128 | } 129 | } 130 | 131 | function unfocus() { 132 | let tmp = document.createElement("input"); 133 | document.body.appendChild(tmp); 134 | tmp.focus(); 135 | document.body.removeChild(tmp); 136 | } 137 | 138 | socket.on("afk?", function (data) { 139 | socket.emit("not afk"); 140 | }); 141 | 142 | socket.on("price", function (data) { 143 | upgHP = data.upgHP; 144 | $("#upgradehp").html("Upgrade HP (" + upgHP + ")"); 145 | if (data.score >= upgHP && !dead) { 146 | $("#upgradehp").prop("disabled", false); 147 | } else { 148 | $("#upgradehp").prop("disabled", true); 149 | } 150 | 151 | if (data.doubleFireSpeed == true) { 152 | if (data.quadrupleFireSpeed == true) { 153 | $("#upgradefs").html("Quadruple fire speed"); 154 | $("#upgradefs").prop("disabled", true); 155 | } else { 156 | $("#upgradefs").html("Quadruple fire speed (8000)"); 157 | if (data.score >= 8000 && !dead) { 158 | $("#upgradefs").prop("disabled", false); 159 | } else { 160 | $("#upgradefs").prop("disabled", true); 161 | } 162 | } 163 | } else { 164 | $("#upgradefs").html("Double fire speed (2000)"); 165 | if (data.score >= 2000 && !dead) { 166 | $("#upgradefs").prop("disabled", false); 167 | } else { 168 | $("#upgradefs").prop("disabled", true); 169 | } 170 | } 171 | 172 | 173 | if (data.doubleBulletSize) { 174 | $("#upgradeBulletSize").prop("disabled", true); 175 | $("#upgradeBulletSize").html("Upgrade bullet size"); 176 | } else { 177 | $("#upgradeBulletSize").html("Upgrade bullet size (5000)"); 178 | if (data.score >= 5000 && !dead) { 179 | $("#upgradeBulletSize").prop("disabled", false); 180 | } else { 181 | $("#upgradeBulletSize").prop("disabled", true); 182 | } 183 | } 184 | 185 | if (data.dualBullets == true) { 186 | if (data.quadrupleBullets) { 187 | $("#upgradedb").prop("disabled", true); 188 | $("#upgradedb").html("Quadruple bullets"); 189 | } else { 190 | $("#upgradedb").prop("disabled", true); 191 | $("#upgradedb").html("Quadruple bullets (8000)"); 192 | if (data.score >= 8000 && !dead) { 193 | $("#upgradedb").prop("disabled", false); 194 | } else { 195 | $("#upgradedb").prop("disabled", true); 196 | } 197 | } 198 | } else { 199 | $("#upgradedb").html("Dual bullets (5000)"); 200 | if (data.score >= 5000 && !dead) { 201 | $("#upgradedb").prop("disabled", false); 202 | } else { 203 | $("#upgradedb").prop("disabled", true); 204 | } 205 | } 206 | }); 207 | 208 | socket.on("newPositions", function (data) { 209 | ctx.clearRect(0, 0, 1200, 600); 210 | ctx.fillStyle = "#FFFFFF"; 211 | ctx.fillRect(0, 0, 1200, 600); 212 | ctx.textAlign = "center"; 213 | ctx.fillStyle = "#BBBBBB"; 214 | ctx.font = "15px Arial"; 215 | 216 | for (let bgLineX = 0; bgLineX < 1200; bgLineX += 20) { 217 | ctx.fillRect(bgLineX, 0, 1, 600); 218 | } 219 | 220 | for (let bgLineY = 0; bgLineY < 600; bgLineY += 20) { 221 | ctx.fillRect(0, bgLineY, 1200, 1); 222 | } 223 | 224 | for (let i = 0; i < data.players.length; i++) { 225 | // Get player stats 226 | if (data.players[i].id == id) { 227 | let status = "HP: " + data.players[i].hp + "/" + data.players[i].maxHp + " Score: " + data.players[i].score; 228 | scoreDiv.innerHTML = status; 229 | $("#powerupCountdownTimer").html(data.players[i].powerupTime); 230 | if (data.players[i].powerupTime < 0) { 231 | $("#powerupCountdown").hide(); 232 | } 233 | if (data.players[i].spawnCooldown > -1) { 234 | dead = true; 235 | respawnCooldown = data.players[i].spawnCooldown; 236 | } else { 237 | dead = false; 238 | } 239 | } 240 | 241 | if (data.players[i].spawnCooldown < 0) { 242 | let playerAlpha = 1; 243 | let playerTextColor; 244 | 245 | if (data.players[i].powerupTime > 0) { 246 | playerAlpha = 1 - colorBlink; 247 | 248 | ctx.strokeStyle = "rgba(0, 0, 255, " + playerAlpha + ")"; 249 | ctx.beginPath(); 250 | ctx.arc(data.players[i].x, data.players[i].y, 10 + (Math.sin(new Date().getTime() / 500) * 5), 0, 2 * Math.PI); 251 | ctx.stroke(); 252 | ctx.strokeStyle = "rgba(0, 255, 0, " + playerAlpha + ")"; 253 | ctx.beginPath(); 254 | ctx.arc(data.players[i].x, data.players[i].y, 10 + (Math.cos(new Date().getTime() / 500) * 5), 0, 2 * Math.PI); 255 | ctx.stroke(); 256 | 257 | if (data.players[i].id == id) { 258 | $("#powerupCountdown").show(); 259 | } 260 | } 261 | 262 | if (data.players[i].id == id) { 263 | playerTextColor = "rgba(0, 160, 0, " + playerAlpha + ")"; 264 | } else { 265 | playerTextColor = "rgba(255, 0, 0, " + playerAlpha + ")"; 266 | } 267 | 268 | // Player border 269 | ctx.fillStyle = "rgba(0, 0, 0, " + playerAlpha + ")"; 270 | ctx.fillRect(data.players[i].x - 7, data.players[i].y - 7, 14, 14); 271 | // Player 272 | ctx.fillStyle = "hsla(" + data.players[i].color + ", 100%, 50%, " + playerAlpha + ")"; 273 | ctx.fillRect(data.players[i].x - 5, data.players[i].y - 5, 10, 10); 274 | 275 | // Draw player text 276 | ctx.fillStyle = playerTextColor; 277 | ctx.fillText(data.players[i].name, data.players[i].x, data.players[i].y - 24); 278 | ctx.fillText(data.players[i].hp + " HP", data.players[i].x, data.players[i].y - 8); 279 | } 280 | } 281 | 282 | for (let i = 0; i < data.powerups.length; i++) { 283 | ctx.strokeStyle = "#0000FF"; 284 | ctx.beginPath(); 285 | ctx.arc(data.powerups[i].x, data.powerups[i].y, 10 + (Math.sin(new Date().getTime() / 500) * 5), 0, 2 * Math.PI); 286 | ctx.stroke(); 287 | ctx.beginPath(); 288 | ctx.arc(data.powerups[i].x, data.powerups[i].y, 10 + (Math.cos(new Date().getTime() / 500) * 5), 0, 2 * Math.PI); 289 | ctx.stroke(); 290 | ctx.fillStyle = "#000033"; 291 | ctx.fillRect(data.powerups[i].x - 6, data.powerups[i].y - 6, 12, 12); 292 | ctx.fillText("Powerup", data.powerups[i].x, data.powerups[i].y - 10); 293 | } 294 | 295 | for (let i = 0; i < data.bullets.length; i++) { 296 | ctx.fillStyle = "#000000"; 297 | ctx.beginPath(); 298 | let renderSize = 2; 299 | if (data.bullets[i].size > 1) renderSize = 3; 300 | ctx.arc(data.bullets[i].x - (renderSize / 2), data.bullets[i].y - (renderSize / 2), renderSize, 0, Math.PI * 2, true); 301 | ctx.closePath(); 302 | ctx.fill(); 303 | } 304 | 305 | for (let i = 0; i < data.blocks.length; i++) { 306 | ctx.fillStyle = "#000000"; 307 | ctx.fillRect(data.blocks[i].x - 6, data.blocks[i].y - 6, 12, 12); 308 | ctx.fillStyle = "#00FF00"; 309 | ctx.fillRect(data.blocks[i].x - 4, data.blocks[i].y - 4, 8, 8); 310 | } 311 | 312 | for (let i = 0; i < data.attackers.length; i++) { 313 | ctx.fillStyle = "#0000FF"; 314 | ctx.fillRect(data.attackers[i].x - 5, data.attackers[i].y - 5, 10, 10); 315 | ctx.fillStyle = ("rgba(" + (255 - (data.attackers[i].activationTimer * 3)) + ", 0, 0, 1)"); 316 | ctx.fillRect(data.attackers[i].x - 3, data.attackers[i].y - 3, 6, 6); 317 | } 318 | 319 | for (let i = 0; i < data.shooters.length; i++) { 320 | ctx.fillStyle = "#FF0000"; 321 | ctx.fillRect(data.shooters[i].x - 5, data.shooters[i].y - 5, 10, 10); 322 | ctx.fillStyle = ("rgba(" + (255 - (data.shooters[i].activationTimer * 3)) + ", " + (255 - (data.shooters[i].activationTimer * 3)) + ", 0, 1)"); 323 | if (data.shooters[i].target == id) { 324 | if (shooter_blink_state) { 325 | ctx.fillStyle = "#880000"; 326 | } 327 | } 328 | ctx.fillRect(data.shooters[i].x - 3, data.shooters[i].y - 3, 6, 6); 329 | } 330 | 331 | if (dead) { 332 | $("#death").show(); 333 | countdownDiv.innerHTML = "Respawn in " + respawnCooldown; 334 | } else { 335 | $("#death").hide(); 336 | } 337 | }); 338 | 339 | // Spam protection 340 | setInterval(function () { 341 | if (clickCooldown > 0) { 342 | clickCooldown--; 343 | } else { 344 | clickCooldown = -1; 345 | } 346 | }, 50); 347 | 348 | // Sends mouse position to the server 20 times per second 349 | setInterval(function () { 350 | if (!(lmx == mx && lmy == my)) { 351 | let pack = { 352 | x: mx, 353 | y: my 354 | }; 355 | socket.emit('mouseMove', pack); 356 | lmx = mx; 357 | lmy = my; 358 | } 359 | }, 50); 360 | 361 | setInterval(function () { 362 | shooter_blink_state = !shooter_blink_state; 363 | }, 500); 364 | 365 | setInterval(function () { 366 | colorBlink = Math.abs(Math.sin(new Date().getTime() / 700) * 1); 367 | }, 50); 368 | 369 | var keyRightDown, keyLeftDown, keyUpDown, keyDownDown = false; 370 | 371 | document.onkeydown = function (event) { 372 | if ((event.keyCode === 68 || event.keyCode === 39) && !keyRightDown) { //d 373 | keyRightDown = true; 374 | socket.emit('keyPress', { 375 | inputId: 'right', 376 | state: true 377 | }); 378 | } else if ((event.keyCode === 83 || event.keyCode === 40) && !keyDownDown) { //s 379 | keyDownDown = true; 380 | socket.emit('keyPress', { 381 | inputId: 'down', 382 | state: true 383 | }); 384 | } else if ((event.keyCode === 65 || event.keyCode === 37) && !keyLeftDown) { //a 385 | keyLeftDown = true; 386 | socket.emit('keyPress', { 387 | inputId: 'left', 388 | state: true 389 | }); 390 | } else if ((event.keyCode === 87 || event.keyCode === 38) && !keyUpDown) { // w 391 | keyUpDown = true; 392 | socket.emit('keyPress', { 393 | inputId: 'up', 394 | state: true 395 | }); 396 | } 397 | } 398 | 399 | document.onkeyup = function (event) { 400 | if (event.keyCode === 68 || event.keyCode === 39) { //d 401 | keyRightDown = false; 402 | socket.emit('keyPress', { 403 | inputId: 'right', 404 | state: false 405 | }); 406 | } else if (event.keyCode === 83 || event.keyCode === 40) { //s 407 | keyDownDown = false; 408 | socket.emit('keyPress', { 409 | inputId: 'down', 410 | state: false 411 | }); 412 | } else if (event.keyCode === 65 || event.keyCode === 37) { //a 413 | keyLeftDown = false; 414 | socket.emit('keyPress', { 415 | inputId: 'left', 416 | state: false 417 | }); 418 | } else if (event.keyCode === 87 || event.keyCode === 38) { // w 419 | keyUpDown = false; 420 | socket.emit('keyPress', { 421 | inputId: 'up', 422 | state: false 423 | }); 424 | } 425 | } 426 | 427 | window.onblur = function () { 428 | keyRightDown = false; 429 | keyLeftDown = false; 430 | keyUpDown = false; 431 | keyDownDown = false; 432 | 433 | socket.emit('keyPress', { 434 | inputId: 'right', 435 | state: false 436 | }); 437 | socket.emit('keyPress', { 438 | inputId: 'left', 439 | state: false 440 | }); 441 | socket.emit('keyPress', { 442 | inputId: 'up', 443 | state: false 444 | }); 445 | socket.emit('keyPress', { 446 | inputId: 'down', 447 | state: false 448 | }); 449 | }; 450 | 451 | try { 452 | if (getCookie("jsshooter_name") != "") { 453 | if (getCookie("jsshooter_name").length > 18) { 454 | console.error("[Warning] Name stored in cookie is too long. resetting to Unnamed"); 455 | setCookie("jsshooter_name", "Unnamed", 360); 456 | } 457 | $("#nameInput").val(getCookie("jsshooter_name")); 458 | $('#setName').click(); 459 | } else { 460 | setCookie("jsshooter_name", "Unnamed", 360); 461 | } 462 | } catch (err) { } -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var app = express(); 3 | var serv = require('http').Server(app); 4 | var colors = require('colors/safe'); 5 | var middleware = require('socketio-wildcard')(); 6 | 7 | var debug = typeof v8debug === 'object' || /--debug/.test(process.execArgv.join(' ')); 8 | 9 | console.log(colors.green("[jsShooter] Starting server...")); 10 | app.get('/', function (req, res) { 11 | res.sendFile(__dirname + '/client/index.html'); 12 | }); 13 | app.use('/client', express.static(__dirname + '/client')); 14 | 15 | //---------- Server settings ---------- 16 | var MAX_SOCKET_ACTIVITY_PER_SECOND = 1000; 17 | var fps = 30; 18 | //------------------------------------- 19 | 20 | var port = process.env.PORT || 80; 21 | if (process.env.PORT == undefined) { 22 | console.log(colors.blue("[jsShooter] No port defined using default (80)")); 23 | } 24 | 25 | serv.listen(port); 26 | var io = require("socket.io")(serv, {}); 27 | io.use(middleware); 28 | 29 | console.log(colors.green("[jsShooter] Socket started on port " + port)); 30 | 31 | var SOCKET_LIST = {}; 32 | var SOCKET_ACTIVITY = {}; 33 | var PLAYER_LIST = {}; 34 | var BULLET_LIST = {}; 35 | var BLOCK_LIST = {}; 36 | var ATTACKER_LIST = {}; 37 | var NPCSHOOTER_LIST = {}; 38 | var POWERUP_LIST = {}; 39 | 40 | // ---------- Entities ---------- 41 | // Npc shooter object 42 | var NPCShooter = function (id, x, y) { 43 | var self = { 44 | id: id, 45 | x: x, 46 | y: y, 47 | targetPlayer: -1, 48 | hp: 3, 49 | activationTimer: 100 50 | } 51 | 52 | if (countOPPlayers() > 0) { 53 | self.hp = 10; 54 | } 55 | 56 | self.fireBullet = function () { 57 | try { 58 | let bID = Math.random() * 2000; 59 | let target = PLAYER_LIST[self.targetPlayer]; 60 | BULLET_LIST[bID] = Bullet(bID, -1, self.x, self.y, Math.atan2(target.y - self.y, target.x - self.x) * 180 / Math.PI, 1); 61 | } catch (err) { 62 | if (debug) { 63 | throw err; 64 | } 65 | } 66 | } 67 | 68 | self.update = function () { 69 | if (self.activationTimer > 0) { 70 | self.activationTimer--; 71 | } else { 72 | try { 73 | let dist = {}; 74 | for (let p in PLAYER_LIST) { 75 | let player = PLAYER_LIST[p]; 76 | if (countOPPlayers() < 1) { 77 | if (player.joinKickTimeout < 0 && player.spawnCooldown < 0) { 78 | let d = getDistance(self.x, self.y, player.x, player.y); 79 | dist[player.id] = d; 80 | } 81 | } else { 82 | if (isOverPower(player)) { 83 | let d = getDistance(self.x, self.y, player.x, player.y); 84 | dist[player.id] = d; 85 | } 86 | } 87 | } 88 | let target = getSmallest(dist); 89 | if (!(target == undefined)) { 90 | self.targetPlayer = target; 91 | if (getDistance(self.x, self.y, PLAYER_LIST[self.targetPlayer].x, PLAYER_LIST[self.targetPlayer].y) > 200 && countOPPlayers() < 1) { 92 | let dir = Math.atan2(PLAYER_LIST[self.targetPlayer].y - self.y, PLAYER_LIST[self.targetPlayer].x - self.x) * 180 / Math.PI; 93 | self.x += Math.cos(dir / 180 * Math.PI) * 0.5; 94 | self.y += Math.sin(dir / 180 * Math.PI) * 0.5; 95 | } 96 | } else { 97 | self.targetPlayer = -1; 98 | } 99 | } catch (err) { 100 | if (debug) { 101 | throw err; 102 | } 103 | } 104 | } 105 | if (self.hp <= 0) { 106 | delete NPCSHOOTER_LIST[self.id]; 107 | } 108 | } 109 | 110 | return self; 111 | } 112 | 113 | // NPC attacker object 114 | var NPCAttacker = function (id, x, y) { 115 | var self = { 116 | id: id, 117 | x: x, 118 | y: y, 119 | targetPlayer: -1, 120 | attackCooldown: -1, 121 | hp: 5, 122 | activationTimer: 100 123 | } 124 | 125 | self.update = function () { 126 | if (self.activationTimer > 0) { 127 | self.activationTimer--; 128 | } else { 129 | try { 130 | let dist = {}; 131 | for (let p in PLAYER_LIST) { 132 | let player = PLAYER_LIST[p]; 133 | if (player.joinKickTimeout < 0 && player.spawnCooldown < 0) { 134 | let d = getDistance(self.x, self.y, player.x, player.y); 135 | dist[player.id] = d; 136 | } 137 | } 138 | let target = getSmallest(dist); 139 | if (!(target == undefined)) { 140 | self.targetPlayer = target; 141 | } else { 142 | self.targetPlayer = -1; 143 | } 144 | 145 | if (!(self.targetPlayer == -1)) { 146 | if (getDistance(self.x, self.y, PLAYER_LIST[self.targetPlayer].x, PLAYER_LIST[self.targetPlayer].y) > 8) { 147 | let dir = Math.atan2(PLAYER_LIST[self.targetPlayer].y - self.y, PLAYER_LIST[self.targetPlayer].x - self.x) * 180 / Math.PI; 148 | self.x += Math.cos(dir / 180 * Math.PI) * 2; 149 | self.y += Math.sin(dir / 180 * Math.PI) * 2; 150 | } 151 | 152 | } 153 | } catch (err) { 154 | if (debug) { 155 | throw err; 156 | } 157 | } 158 | } 159 | if (self.attackCooldown > 0) { 160 | self.attackCooldown--; 161 | } else { 162 | if (!self.activationTimer > 0) { 163 | if (countActivePlayers() > 0) { 164 | for (let p in PLAYER_LIST) { 165 | let player = PLAYER_LIST[p]; 166 | if (getDistance(self.x, self.y, player.x, player.y) < 10 && player.powerupTime < 1) { 167 | player.hp--; 168 | self.attackCooldown = (1000 / fps) * 1; 169 | } 170 | } 171 | } 172 | } 173 | } 174 | if (self.hp <= 0) { 175 | delete ATTACKER_LIST[self.id]; 176 | delete self; 177 | } 178 | } 179 | 180 | return self; 181 | } 182 | 183 | // Bullet object 184 | var Bullet = function (id, ownerID, x, y, angle, size) { 185 | var self = { 186 | size: size, 187 | id: id, 188 | lifetime: 200, 189 | x: x, 190 | y: y, 191 | xvel: Math.cos(angle / 180 * Math.PI) * 10, 192 | yvel: Math.sin(angle / 180 * Math.PI) * 10, 193 | owner: ownerID 194 | } 195 | self.update = function () { 196 | self.x += self.xvel; 197 | self.y += self.yvel; 198 | self.lifetime--; 199 | let extraSize = 4 * (self.size - 1); 200 | for (let p in PLAYER_LIST) { 201 | let player = PLAYER_LIST[p]; 202 | if (player.joinKickTimeout < 0 && player.spawnCooldown < 0) { 203 | if (self.x >= (player.x - 9) - extraSize && self.x <= player.x + 9 + extraSize) { 204 | if (self.y >= (player.y - 9) - extraSize && self.y <= player.y + 9) { 205 | if (!(self.owner == player.id)) { 206 | if (!(player.powerupTime > 0)) player.hp--; 207 | let owner = getPlayerByID(self.owner); 208 | if (!(owner == undefined)) { 209 | owner.score += 10; 210 | if (player.hp <= 0) { 211 | owner.score += 100; 212 | owner.score += Math.floor(player.score / 4); 213 | if (player.doubleFireSpeed) 214 | owner.score += 500; 215 | if (player.quadrupleFireSpeed) 216 | owner.score += 2000; 217 | if (player.dualBullets) 218 | owner.score += 1250; 219 | if (player.quadrupleBullets) 220 | owner.score += 2000; 221 | if (player.doubleBulletSize) 222 | owner.score += 2000; 223 | if (owner.hp < owner.maxHp) { 224 | owner.hp++; 225 | } 226 | } 227 | } 228 | self.lifetime = 0; 229 | } 230 | } 231 | } 232 | } 233 | } 234 | 235 | for (let b in BLOCK_LIST) { 236 | let block = BLOCK_LIST[b]; 237 | if (self.x >= (block.x - 8) - extraSize && self.x <= block.x + 8 + extraSize) { 238 | if (self.y >= (block.y - 8) - extraSize && self.y <= block.y + 8) { 239 | delete BLOCK_LIST[block.id]; 240 | let owner = getPlayerByID(self.owner); 241 | if (!(owner == undefined)) { 242 | owner.score += 50; 243 | } 244 | self.lifetime = 0; 245 | } 246 | } 247 | } 248 | 249 | for (let na in ATTACKER_LIST) { 250 | let at = ATTACKER_LIST[na]; 251 | if (self.x >= (at.x - 7) - extraSize && self.x <= at.x + 7 + extraSize) { 252 | if (self.y >= (at.y - 7) - extraSize && self.y <= at.y + 7 + extraSize) { 253 | at.hp--; 254 | let owner = getPlayerByID(self.owner); 255 | if (!(owner == undefined)) { 256 | owner.score += 10; 257 | if (at.hp <= 0) { 258 | owner.score += 100; 259 | } 260 | } 261 | self.lifetime = 0; 262 | } 263 | } 264 | } 265 | 266 | for (let s in NPCSHOOTER_LIST) { 267 | let sh = NPCSHOOTER_LIST[s]; 268 | if (self.x >= (sh.x - 7) - extraSize && self.x <= sh.x + 7 + extraSize) { 269 | if (self.y >= (sh.y - 7) - extraSize && self.y <= sh.y + 7 + extraSize) { 270 | sh.hp--; 271 | let owner = getPlayerByID(self.owner); 272 | if (!(owner == undefined)) { 273 | owner.score += 10; 274 | if (sh.hp <= 0) { 275 | owner.score += 250; 276 | } 277 | } 278 | self.lifetime = 0; 279 | } 280 | } 281 | } 282 | 283 | if (self.x < 0 || self.x > 1200 || self.y < 0 || self.y > 600) { 284 | self.lifetime = 0; 285 | } 286 | 287 | if (self.lifetime <= 0) { 288 | delete BULLET_LIST[self.id]; 289 | delete self; 290 | } 291 | } 292 | return self; 293 | } 294 | 295 | // NPCBlock object 296 | var NPCBlock = function (id) { 297 | var self = { 298 | id: id, 299 | x: Math.floor(Math.random() * 1180) + 10, 300 | y: Math.floor(Math.random() * 580) + 10 301 | } 302 | return self; 303 | } 304 | 305 | // Player object 306 | var Player = function (id) { 307 | var self = { 308 | x: Math.floor(Math.random() * 1160) + 20, 309 | y: Math.floor(Math.random() * 560) + 20, 310 | id: id, 311 | spawnCooldown: -1, 312 | afkKickTimeout: 100, 313 | joinKickTimeout: 80, 314 | pressingRight: false, 315 | pressingLeft: false, 316 | pressingUp: false, 317 | pressingDown: false, 318 | maxHp: 10, 319 | hp: 10, 320 | color: Math.floor(Math.random() * 360), 321 | regen: -1, 322 | afk: false, 323 | mx: 0, 324 | my: 0, 325 | powerupTime: -1, 326 | score: 0, 327 | maxSpeed: 3, 328 | name: "Unnamed", 329 | doubleFireSpeed: false, 330 | doubleBulletSize: false, 331 | quadrupleFireSpeed: false, 332 | dualBullets: false, 333 | quadrupleBullets: false, 334 | upgHPPrice: 500 335 | } 336 | 337 | self.respawn = function () { 338 | self.x = Math.floor(Math.random() * 1160) + 20; 339 | self.y = Math.floor(Math.random() * 560) + 20; 340 | self.pressingRight = false; 341 | self.pressingLeft = false; 342 | self.pressingUp = false; 343 | self.pressingDown = false; 344 | self.hp = 10; 345 | self.powerupTime = -1; 346 | self.score = Math.round(self.score / 3); 347 | 348 | if (self.doubleFireSpeed) { 349 | self.score += 400; 350 | } 351 | 352 | if (self.quadrupleFireSpeed) { 353 | self.score += 1600; 354 | } 355 | 356 | if (self.doubleBulletSize) { 357 | self.score += 1600; 358 | } 359 | 360 | if (self.dualBullets) { 361 | self.score += 1000; 362 | } 363 | 364 | if (self.quadrupleBullets) { 365 | self.score += 1600; 366 | } 367 | 368 | self.maxHp = 10; 369 | self.regen = -1; 370 | self.maxSpeed = 3; 371 | self.doubleFireSpeed = false; 372 | self.quadrupleFireSpeed = false; 373 | self.doubleBulletSize = false; 374 | self.dualBullets = false; 375 | self.quadrupleBullets = false; 376 | self.upgHPPrice = 500; 377 | self.spawnCooldown = 10; 378 | } 379 | 380 | self.fireBullet = function () { 381 | if (self.joinKickTimeout < 0 && self.spawnCooldown < 0) { 382 | let bsize = (self.doubleBulletSize ? 1.5 : 1); 383 | let id = Math.random() * 2000; 384 | BULLET_LIST[id] = Bullet(id, self.id, self.x, self.y, Math.atan2(self.my - self.y, self.mx - self.x) * 180 / Math.PI, bsize); 385 | if (self.dualBullets) { 386 | id = Math.random() * 2000; 387 | BULLET_LIST[id] = Bullet(id, self.id, self.x, self.y, (Math.atan2(self.my - self.y, self.mx - self.x) * 180 / Math.PI) - 180, bsize); 388 | if (self.quadrupleBullets) { 389 | id = Math.random() * 2000; 390 | BULLET_LIST[id] = Bullet(id, self.id, self.x, self.y, (Math.atan2(self.my - self.y, self.mx - self.x) * 180 / Math.PI) - 90, bsize); 391 | id = Math.random() * 2000; 392 | BULLET_LIST[id] = Bullet(id, self.id, self.x, self.y, (Math.atan2(self.my - self.y, self.mx - self.x) * 180 / Math.PI) - 270, bsize); 393 | } 394 | } 395 | } 396 | } 397 | 398 | self.update = function () { 399 | if (self.powerupTime > 0) { 400 | self.maxSpeed = 4; 401 | } else { 402 | self.maxSpeed = 3; 403 | } 404 | if (self.hp <= 0) { 405 | self.respawn(); 406 | return; 407 | } 408 | if (self.spawnCooldown < 0) { 409 | if (self.pressingRight) { 410 | if (self.x < (1200 - self.maxSpeed) - 10) { 411 | self.x += self.maxSpeed; 412 | } 413 | } 414 | if (self.pressingLeft) { 415 | if (self.x > (0 + self.maxSpeed) + 10) { 416 | self.x -= self.maxSpeed; 417 | } 418 | } 419 | if (self.pressingUp) { 420 | if (self.y > (0 + self.maxSpeed) + 10) { 421 | self.y -= self.maxSpeed; 422 | } 423 | } 424 | if (self.pressingDown) { 425 | if (self.y < (600 - self.maxSpeed) - 10) { 426 | self.y += self.maxSpeed; 427 | } 428 | } 429 | } 430 | } 431 | return self; 432 | } 433 | 434 | //Powerup object 435 | var PowerUp = function (x, y, id) { 436 | var self = { 437 | x: x, 438 | y: y, 439 | id: id 440 | }; 441 | 442 | self.update = function () { 443 | for (let p in PLAYER_LIST) { 444 | let player = PLAYER_LIST[p]; 445 | if (getDistance(self.x, self.y, player.x, player.y) < 16) { 446 | player.powerupTime += 10; 447 | player.score += 750; 448 | self.destroy(); 449 | } 450 | } 451 | } 452 | 453 | self.destroy = function () { 454 | delete POWERUP_LIST[self.id]; 455 | delete self; 456 | } 457 | 458 | return self; 459 | } 460 | 461 | // ---------- Functions ---------- 462 | function getPlayerByID(id) { 463 | for (let p in PLAYER_LIST) { 464 | let player = PLAYER_LIST[p]; 465 | if (player.id == id) { 466 | return player; 467 | } 468 | } 469 | } 470 | 471 | function getDistance(x1, y1, x2, y2) { 472 | let a = x1 - x2; 473 | let b = y1 - y2; 474 | 475 | return Math.sqrt(a * a + b * b); 476 | } 477 | 478 | function getSmallest(obj) { 479 | let min, key; 480 | for (let k in obj) { 481 | if (typeof (min) == 'undefined') { 482 | min = obj[k]; 483 | key = k; 484 | continue; 485 | } 486 | if (obj[k] < min) { 487 | min = obj[k]; 488 | key = k; 489 | } 490 | } 491 | return key; 492 | } 493 | 494 | function countActivePlayers() { 495 | let result = 0; 496 | for (let p in PLAYER_LIST) { 497 | let player = PLAYER_LIST[p]; 498 | if (player.joinKickTimeout < 0 && player.spawnCooldown < 0) { 499 | result++; 500 | } 501 | } 502 | return result; 503 | } 504 | 505 | function isOverPower(player) { 506 | if (!(player.joinKickTimeout < 0 && player.spawnCooldown < 0)) { 507 | return false; 508 | } 509 | let power = 0; 510 | if (player.doubleFireSpeed) { 511 | power++; 512 | } 513 | if (player.quadrupleFireSpeed) { 514 | power++; 515 | } 516 | if (player.doubleBulletSize) { 517 | power++; 518 | } 519 | if (player.dualBullets) { 520 | power++; 521 | } 522 | if (player.quadrupleBullets) { 523 | power++; 524 | } 525 | 526 | if (power > 3) { 527 | return true; 528 | } else { 529 | return false; 530 | } 531 | } 532 | 533 | function countOPPlayers() { 534 | let result = 0; 535 | for (let p in PLAYER_LIST) { 536 | let player = PLAYER_LIST[p]; 537 | if (isOverPower(player)) { 538 | result++; 539 | } 540 | } 541 | return result; 542 | } 543 | 544 | function spawnBlock() { 545 | let id = (Math.random() * 10); 546 | BLOCK_LIST[id] = NPCBlock(id); 547 | return id; 548 | } 549 | 550 | function spawnAttacker() { 551 | let id = (Math.random() * 10); 552 | let x = Math.floor(Math.random() * 1180) + 10; 553 | let y = Math.floor(Math.random() * 580) + 10; 554 | ATTACKER_LIST[id] = NPCAttacker(id, x, y); 555 | return id; 556 | } 557 | 558 | function spawnShooter() { 559 | let id = (Math.random() * 10); 560 | let x = Math.floor(Math.random() * 1180) + 10; 561 | let y = Math.floor(Math.random() * 580) + 10; 562 | NPCSHOOTER_LIST[id] = NPCShooter(id, x, y); 563 | return id; 564 | } 565 | 566 | function disconnectSocket(id) { 567 | SOCKET_LIST[id].disconnect(); 568 | delete SOCKET_LIST[id]; 569 | delete SOCKET_ACTIVITY[id]; 570 | } 571 | 572 | function getCommand(text) { 573 | let command = ""; 574 | for (let i = 0; i < text.length; i++) { 575 | if (text.charAt(i) == ' ') { 576 | i = text.length; 577 | } else { 578 | command += text.charAt(i); 579 | } 580 | } 581 | return command.toLowerCase(); 582 | } 583 | 584 | function getArgs(text) { 585 | let args = []; 586 | let arg = ""; 587 | let j = false; 588 | text += " "; 589 | for (let i = 0; i < text.length; i++) { 590 | if (text.charAt(i) == ' ') { 591 | if (!j) { 592 | j = true; 593 | } else { 594 | args.push(arg); 595 | } 596 | arg = ""; 597 | } else { 598 | arg += text.charAt(i); 599 | } 600 | } 601 | return args; 602 | } 603 | 604 | // ---------- Socket Connections ---------- 605 | 606 | io.sockets.on("connection", function (socket) { 607 | socket.id = Math.random(); 608 | if (SOCKET_ACTIVITY[socket.id] == undefined) { 609 | SOCKET_ACTIVITY[socket.id] = 0; 610 | } 611 | SOCKET_LIST[socket.id] = socket; 612 | let player = Player(socket.id); 613 | PLAYER_LIST[socket.id] = player; 614 | console.log(colors.cyan("[jsShooter] Socket connection with id " + socket.id)); 615 | socket.emit("id", { 616 | id: socket.id 617 | }); 618 | 619 | socket.on("disconnect", function () { 620 | try { 621 | for (let b in BULLET_LIST) { 622 | let bullet = BULLET_LIST[b]; 623 | if (bullet.owner == socket.id) { 624 | delete BULLET_LIST[b]; 625 | } 626 | } 627 | delete PLAYER_LIST[socket.id]; 628 | disconnectSocket(socket.id); 629 | console.log(colors.cyan("[jsShooter] Player with id " + socket.id + " disconnected")); 630 | } catch (err) { 631 | if (debug) { 632 | throw err; 633 | } 634 | } 635 | }); 636 | 637 | socket.on('keyPress', function (data) { 638 | try { 639 | if (data.inputId === 'left') { 640 | player.pressingLeft = data.state; 641 | } else if (data.inputId === 'right') { 642 | player.pressingRight = data.state; 643 | } else if (data.inputId === 'up') { 644 | player.pressingUp = data.state; 645 | } else if (data.inputId === 'down') { 646 | player.pressingDown = data.state; 647 | } 648 | } catch (err) { 649 | if (debug) { 650 | throw err; 651 | } 652 | } 653 | }); 654 | 655 | socket.on('changeName', function (data) { 656 | try { 657 | if (data.name.length > 64) { // Name is way too long. Kick the player for sending too much data 658 | console.log(colors.red("[jsShooter] Player with id " + socket.id + " tried to change name to " + data.name + " but it is longer than 64 chars. Disconnecting socket")); 659 | disconnectSocket(socket.id); 660 | return; 661 | } 662 | 663 | if (data.name.length > 16 || data.name.length < 1) { // Name is too long or too short 664 | return; 665 | } 666 | 667 | let player = getPlayerByID(socket.id); 668 | if (player.name != data.name) { 669 | console.log(colors.cyan("[jsShooter] Player with id " + socket.id + " changed name to " + data.name)); 670 | player.name = data.name; 671 | } 672 | } catch (err) { 673 | if (debug) { 674 | throw err; 675 | } 676 | } 677 | }); 678 | 679 | socket.on('not afk', function (data) { 680 | try { 681 | let player = getPlayerByID(socket.id); 682 | player.afkKickTimeout = 100; 683 | } catch (err) { 684 | if (debug) { 685 | throw err; 686 | } 687 | } 688 | }); 689 | 690 | socket.on('kthx', function (data) { 691 | try { 692 | let player = getPlayerByID(socket.id); 693 | if (!(player == undefined)) { 694 | player.joinKickTimeout = -1; 695 | console.log(colors.cyan("[jsShooter] Player with id " + socket.id + " is now verified")); 696 | } 697 | } catch (err) { 698 | if (debug) { 699 | throw err; 700 | } 701 | } 702 | }); 703 | 704 | socket.on("*", function (data) { 705 | try { 706 | SOCKET_ACTIVITY[socket.id]++; 707 | //console.log(data); 708 | } catch (err) { 709 | if (debug) { 710 | throw err; 711 | } 712 | } 713 | }); 714 | 715 | // HP Upgrade 716 | socket.on('upgHPClicked', function (data) { 717 | try { 718 | let player = getPlayerByID(socket.id); 719 | if (!(player == undefined)) { 720 | if (player.score >= player.upgHPPrice) { 721 | player.maxHp++; 722 | player.score -= player.upgHPPrice; 723 | player.upgHPPrice += 250; 724 | if (player.hp < player.maxHp) { 725 | player.hp++; 726 | } 727 | } 728 | } 729 | } catch (err) { 730 | if (debug) { 731 | throw err; 732 | } 733 | } 734 | }); 735 | 736 | // Fire speed upgrade 737 | socket.on('upgFSpeedClicked', function (data) { 738 | try { 739 | let player = getPlayerByID(socket.id); 740 | if (!(player == undefined)) { 741 | if (!player.doubleFireSpeed) { 742 | if (player.score >= 2000) { 743 | player.doubleFireSpeed = true; 744 | player.score -= 2000; 745 | } 746 | } else if (!player.quadrupleFireSpeed) { 747 | if (player.score >= 8000) { 748 | player.quadrupleFireSpeed = true; 749 | player.score -= 8000; 750 | } 751 | } 752 | } 753 | } catch (err) { 754 | if (debug) { 755 | throw err; 756 | } 757 | } 758 | }); 759 | 760 | // Bullet size upgrade 761 | socket.on('upgBulletSize', function (data) { 762 | try { 763 | let player = getPlayerByID(socket.id); 764 | if (!(player == undefined)) { 765 | if (!player.doubleBulletSize) { 766 | if (player.score >= 5000) { 767 | player.doubleBulletSize = true; 768 | player.score -= 5000; 769 | } 770 | } 771 | } 772 | } catch (err) { 773 | if (debug) { 774 | throw err; 775 | } 776 | } 777 | }); 778 | 779 | // Dual bullet upgrade 780 | socket.on('upgDualBullets', function () { 781 | try { 782 | let player = getPlayerByID(socket.id); 783 | if (!(player == undefined)) { 784 | if (!player.dualBullets) { 785 | if (player.score >= 5000) { 786 | player.dualBullets = true; 787 | player.score -= 5000; 788 | } 789 | } else { 790 | if (player.score >= 8000) { 791 | player.quadrupleBullets = true; 792 | player.score -= 8000; 793 | } 794 | } 795 | } 796 | } catch (err) { 797 | if (debug) { 798 | throw err; 799 | } 800 | } 801 | }); 802 | 803 | socket.on('mouseMove', function (data) { 804 | try { 805 | let player = getPlayerByID(socket.id); 806 | if (player != undefined && data.x != undefined && data.y != undefined) { 807 | player.mx = data.x; 808 | player.my = data.y; 809 | } 810 | } catch (err) { 811 | if (debug) { 812 | throw err; 813 | } 814 | } 815 | }); 816 | }); 817 | 818 | // ---------- Loops ---------- 819 | // Bullet fire loop 820 | setInterval(function () { 821 | for (let p in PLAYER_LIST) { 822 | let player = PLAYER_LIST[p]; 823 | player.fireBullet(); 824 | } 825 | 826 | setTimeout(function () { 827 | for (let p in PLAYER_LIST) { 828 | let player = PLAYER_LIST[p]; 829 | if (player.joinKickTimeout < 0 && player.spawnCooldown < 0) { 830 | if (player.doubleFireSpeed || player.powerupTime > 0) { 831 | player.fireBullet(); 832 | } 833 | } 834 | } 835 | }, 150); 836 | setTimeout(function () { 837 | for (let p in PLAYER_LIST) { 838 | let player = PLAYER_LIST[p]; 839 | if (player.joinKickTimeout < 0 && player.spawnCooldown < 0) { 840 | if (player.quadrupleFireSpeed) { 841 | player.fireBullet(); 842 | } 843 | } 844 | } 845 | }, 50); 846 | setTimeout(function () { 847 | for (let p in PLAYER_LIST) { 848 | let player = PLAYER_LIST[p]; 849 | if (player.joinKickTimeout < 0 && player.spawnCooldown < 0) { 850 | if (player.quadrupleFireSpeed) { 851 | player.fireBullet(); 852 | } 853 | } 854 | } 855 | }, 200); 856 | }, 250); 857 | 858 | // Spawn blocks 859 | setInterval(function () { 860 | if (Object.keys(BLOCK_LIST).length <= 40) { 861 | spawnBlock(); 862 | } 863 | }, 500); 864 | 865 | // Spawn / despawn / afk test loop 866 | setInterval(function () { 867 | try { 868 | // Overload protection 869 | for (let sa in SOCKET_ACTIVITY) { 870 | if (isNaN(SOCKET_ACTIVITY[sa])) { 871 | delete SOCKET_ACTIVITY[sa]; 872 | break; 873 | } 874 | 875 | if (SOCKET_ACTIVITY[sa] > MAX_SOCKET_ACTIVITY_PER_SECOND) { 876 | console.log(colors.red("[jsShooter] Kicked " + sa + " Too high network activity. " + SOCKET_ACTIVITY[sa] + " > " + MAX_SOCKET_ACTIVITY_PER_SECOND + " Messages in 1 second")); 877 | delete PLAYER_LIST[sa]; 878 | disconnectSocket(sa); 879 | } else { 880 | SOCKET_ACTIVITY[sa] = 0; 881 | } 882 | } 883 | 884 | // Spawn attackers 885 | if (Object.keys(ATTACKER_LIST).length < 3 && Math.floor(Math.random() * 4) == 1) { 886 | if (countActivePlayers() > 0) { 887 | spawnAttacker(); 888 | } 889 | } 890 | 891 | // Player respawn cooldown 892 | for (let p in PLAYER_LIST) { 893 | let player = PLAYER_LIST[p]; 894 | if (!(player.spawnCooldown < 0)) { 895 | player.spawnCooldown--; 896 | } 897 | if (player.powerupTime > 0) { 898 | player.powerupTime--; 899 | } else { 900 | player.powerupTime = -1; 901 | } 902 | } 903 | 904 | // Spawn and despawn shooters 905 | if (Object.keys(NPCSHOOTER_LIST).length < 5 && Math.floor(Math.random() * (countOPPlayers() > 0 ? 4 : 20)) == 1) { 906 | if (countActivePlayers() > 0) { 907 | spawnShooter(); 908 | } 909 | } 910 | if (countActivePlayers() < 1) { 911 | for (let s in NPCSHOOTER_LIST) { 912 | let sh = NPCSHOOTER_LIST[s]; 913 | if (Math.floor(Math.random() * 30) == 1) { 914 | sh.hp = 0; 915 | break; 916 | } 917 | } 918 | } 919 | 920 | // Shooter loop 921 | for (let s in NPCSHOOTER_LIST) { 922 | let sh = NPCSHOOTER_LIST[s]; 923 | if (sh.targetPlayer > 0) { 924 | sh.fireBullet(); 925 | } 926 | } 927 | if (countOPPlayers() > 0) { 928 | setTimeout(function () { 929 | for (let s in NPCSHOOTER_LIST) { 930 | let sh = NPCSHOOTER_LIST[s]; 931 | if (sh.targetPlayer > 0) { 932 | sh.fireBullet(); 933 | } 934 | } 935 | }, 500); 936 | } 937 | 938 | // AFK Test loop 939 | for (let i in SOCKET_LIST) { 940 | let socket = SOCKET_LIST[i]; 941 | socket.emit("afk?", {}); 942 | } 943 | 944 | // Powerup spawn 945 | if (!(Object.keys(POWERUP_LIST).length > 0)) { 946 | if (Math.floor(Math.random() * 200) == 1) { 947 | if (countActivePlayers() > 0) { 948 | let sID = Math.random(); 949 | let x = Math.floor(Math.random() * 1180) + 10; 950 | let y = Math.floor(Math.random() * 580) + 10; 951 | POWERUP_LIST[sID] = PowerUp(x, y, sID); 952 | } 953 | } 954 | } 955 | 956 | // Check players hp 957 | for (let p in PLAYER_LIST) { 958 | let player = PLAYER_LIST[p]; 959 | if (player.hp > player.maxHp) { 960 | player.hp = player.maxHp; 961 | } 962 | } 963 | } catch (err) { 964 | if (debug) { 965 | throw err; 966 | } 967 | }; 968 | }, 1000); 969 | 970 | // Regen and kick loop 971 | setInterval(function () { 972 | for (let p in PLAYER_LIST) { 973 | let player = PLAYER_LIST[p]; 974 | player.afkKickTimeout--; 975 | if (player.hp < player.maxHp) { 976 | if (player.regen < 0) { 977 | player.regen = 50; 978 | } 979 | } 980 | if (player.regen >= 0) { 981 | player.regen--; 982 | } 983 | if (player.regen == 0) { 984 | if (player.hp < player.maxHp) { 985 | player.hp++; 986 | } 987 | } 988 | if (player.joinKickTimeout > 0) { 989 | player.joinKickTimeout--; 990 | } 991 | if (player.joinKickTimeout == 0 || player.afkKickTimeout <= 0) { 992 | delete PLAYER_LIST[player.id]; 993 | disconnectSocket(player.id); 994 | console.log(colors.red("[jsShooter] Kicked " + player.id + " for inactivity")); 995 | } 996 | } 997 | }, 100); 998 | 999 | // Main update loop 1000 | var updatePriceCooldown = 0; 1001 | async function update() { 1002 | try { 1003 | let playerPack = []; 1004 | let bulletPack = []; 1005 | let blockPack = []; 1006 | let shooterPack = []; 1007 | let attackerPack = []; 1008 | let powerupPack = []; 1009 | if (updatePriceCooldown > 0) { 1010 | updatePriceCooldown--; 1011 | } 1012 | for (let p in PLAYER_LIST) { 1013 | let player = PLAYER_LIST[p]; 1014 | player.update(); 1015 | 1016 | if (player.joinKickTimeout < 0) { 1017 | playerPack.push({ 1018 | x: player.x, 1019 | y: player.y, 1020 | color: player.color, 1021 | name: player.name, 1022 | hp: player.hp, 1023 | maxHp: player.maxHp, 1024 | score: player.score, 1025 | id: player.id, 1026 | powerupTime: player.powerupTime, 1027 | spawnCooldown: player.spawnCooldown 1028 | }); 1029 | if (updatePriceCooldown <= 0) { 1030 | let socket = SOCKET_LIST[p]; 1031 | socket.emit("price", { 1032 | upgHP: player.upgHPPrice, 1033 | score: player.score, 1034 | doubleBulletSize: player.doubleBulletSize, 1035 | doubleFireSpeed: player.doubleFireSpeed, 1036 | quadrupleFireSpeed: player.quadrupleFireSpeed, 1037 | quadrupleBullets: player.quadrupleBullets, 1038 | dualBullets: player.dualBullets 1039 | }); 1040 | } 1041 | } 1042 | } 1043 | if (updatePriceCooldown <= 0) { 1044 | updatePriceCooldown = (fps / 4); 1045 | } 1046 | 1047 | for (let b in BULLET_LIST) { 1048 | let bullet = BULLET_LIST[b]; 1049 | bullet.update(); 1050 | bulletPack.push({ 1051 | size: bullet.size, 1052 | x: bullet.x, 1053 | y: bullet.y 1054 | }); 1055 | } 1056 | 1057 | for (let pu in POWERUP_LIST) { 1058 | let powerup = POWERUP_LIST[pu]; 1059 | powerup.update(); 1060 | powerupPack.push({ 1061 | x: powerup.x, 1062 | y: powerup.y, 1063 | id: powerup.id 1064 | }); 1065 | } 1066 | 1067 | for (let bl in BLOCK_LIST) { 1068 | let block = BLOCK_LIST[bl]; 1069 | blockPack.push({ 1070 | x: block.x, 1071 | y: block.y 1072 | }); 1073 | } 1074 | 1075 | for (let at in ATTACKER_LIST) { 1076 | let attacker = ATTACKER_LIST[at]; 1077 | attacker.update(); 1078 | attackerPack.push({ 1079 | x: attacker.x, 1080 | y: attacker.y, 1081 | activationTimer: attacker.activationTimer 1082 | }); 1083 | } 1084 | 1085 | for (let s in NPCSHOOTER_LIST) { 1086 | let sh = NPCSHOOTER_LIST[s]; 1087 | sh.update(); 1088 | shooterPack.push({ 1089 | x: sh.x, 1090 | y: sh.y, 1091 | target: sh.targetPlayer, 1092 | activationTimer: sh.activationTimer 1093 | }); 1094 | } 1095 | 1096 | for (let i in SOCKET_LIST) { 1097 | let socket = SOCKET_LIST[i]; 1098 | socket.emit("newPositions", { 1099 | players: playerPack, 1100 | powerups: powerupPack, 1101 | bullets: bulletPack, 1102 | blocks: blockPack, 1103 | attackers: attackerPack, 1104 | shooters: shooterPack 1105 | }); 1106 | } 1107 | } catch (err) { 1108 | console.log(colors.red("[jsShooter] (Warning) Exception thrown during main update loop. " + err)); 1109 | if (debug) { 1110 | throw err; 1111 | } 1112 | } 1113 | } 1114 | 1115 | setInterval(function () { 1116 | update(); 1117 | }, (1000 / fps)); 1118 | 1119 | // ---------- Commands ---------- 1120 | process.stdin.resume(); 1121 | process.stdin.setEncoding('utf8'); 1122 | 1123 | process.stdin.on('data', function (text) { 1124 | let command = getCommand(text.trim()); 1125 | if (command === 'exit') { 1126 | console.log(colors.yellow("Closing server")); 1127 | process.exit(); 1128 | } else if (command == "kickall") { 1129 | console.log(colors.yellow("Kicking all players")); 1130 | for (let p in PLAYER_LIST) { 1131 | delete PLAYER_LIST[p]; 1132 | } 1133 | for (let s in SOCKET_LIST) { 1134 | disconnectSocket(s); 1135 | } 1136 | } else if (command == "list") { 1137 | console.log(colors.yellow(Object.keys(PLAYER_LIST).length + " Players online")); 1138 | for (let p in PLAYER_LIST) { 1139 | let player = PLAYER_LIST[p]; 1140 | console.log(colors.yellow("Name: " + player.name + " | Score:" + player.score + " | ID:" + p + " | X: " + player.x + " | X: " + player.y)); 1141 | } 1142 | } else if (command == "kick") { 1143 | let args = getArgs(text.trim()); 1144 | if (args.length > 0) { 1145 | let id = parseFloat(args[0]); 1146 | if (id > 0) { 1147 | if (PLAYER_LIST[id] != undefined) { 1148 | console.log(colors.yellow("Kicked player with id " + id)); 1149 | delete PLAYER_LIST[id]; 1150 | disconnectSocket(id); 1151 | } else { 1152 | console.log(colors.yellow("Error: ID " + id + " not found")); 1153 | } 1154 | } else { 1155 | console.log(colors.yellow("Error: Invalid ID")); 1156 | } 1157 | } else { 1158 | console.log(colors.yellow("Error: Player id needed")); 1159 | } 1160 | } else if (command == "spawnpowerup") { 1161 | let sID = Math.random(); 1162 | let x = Math.floor(Math.random() * 1180) + 10; 1163 | let y = Math.floor(Math.random() * 580) + 10; 1164 | POWERUP_LIST[sID] = PowerUp(x, y, sID); 1165 | console.log(colors.yellow("Powerup spawned at X: " + x, " Y: " + y)); 1166 | } else if (command == "maxsocactivity") { 1167 | let args = getArgs(text.trim()); 1168 | if (args.length > 0) { 1169 | let mmps = parseFloat(args[0]); 1170 | if (mmps > 20) { 1171 | MAX_SOCKET_ACTIVITY_PER_SECOND = mmps; 1172 | console.log(colors.yellow("MAX_SOCKET_ACTIVITY_PER_SECOND Set to " + mmps)); 1173 | } else { 1174 | console.log(colors.yellow("Error: Too low value. Needs to be larger than 20")); 1175 | } 1176 | } else { 1177 | console.log(colors.yellow("Error: Max messages per second needed")); 1178 | } 1179 | } else if (command == "name") { 1180 | let args = getArgs(text.trim()); 1181 | if (args.length > 1) { 1182 | let id = parseFloat(args[0]); 1183 | if (id > 0) { 1184 | let player = PLAYER_LIST[id]; 1185 | if (player != undefined) { 1186 | let name = ""; 1187 | for (let i = 0; i < args.length - 1; i++) { 1188 | name += args[i + 1]; 1189 | if (i < args.length) { 1190 | name += " "; 1191 | } 1192 | } 1193 | player.name = name; 1194 | } else { 1195 | console.log(colors.yellow("Error: ID " + id + " not found")); 1196 | } 1197 | } else { 1198 | console.log(colors.yellow("Error: Invalid ID")); 1199 | } 1200 | } else { 1201 | console.log(colors.yellow("Error: Player id and name needed")); 1202 | } 1203 | } else if (command == "help") { 1204 | console.log(colors.yellow("help Show help")); 1205 | console.log(colors.yellow("exit Stops the server")); 1206 | console.log(colors.yellow("list List all players")); 1207 | console.log(colors.yellow("kickall Kick all players")); 1208 | console.log(colors.yellow("kick Kick player")); 1209 | console.log(colors.yellow("spawnPowerup Spawns a powerup")); 1210 | console.log(colors.yellow("name Change name of player")); 1211 | console.log(colors.yellow("maxSocActivity n socket gets kicked if it sends more then n messages per second")); 1212 | } else { 1213 | console.log(colors.yellow("Unknown command type help for help")); 1214 | } 1215 | }); 1216 | // ------------------------------ 1217 | 1218 | //Spawn 20 block at start 1219 | for (let spBlock = 0; spBlock < 20; spBlock++) { 1220 | spawnBlock(); 1221 | } 1222 | 1223 | console.log(colors.green("[jsShooter] Server started ")); 1224 | if (debug) { 1225 | console.log("Running in debug mode"); 1226 | } -------------------------------------------------------------------------------- /client/jquery-3.3.1.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ 2 | !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("