supernets.org

- https://supernets.org
git clone git://git.acid.vegas/supernets.org.git
Log | Files | Refs | Archive

commit 86d30c4b31c685ed3765a2dcea0889a262ec7149
parent 0898267eecad9f237d153481e570578295925e62
Author: acidvegas <acid.vegas@acid.vegas>
Date: Thu, 8 Jun 2023 18:52:33 -0400

Added worms

Diffstat:
Dworms | 1-
Aworms/css/bootstrap.min.css | 9+++++++++
Aworms/css/custom.css | 249+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aworms/data/images/README.md | 2++
Aworms/data/images/levels/level2.png | 0
Aworms/data/images/menu/xbox360controls.png | 0
Aworms/data/sounds/boring.wav | 0
Aworms/data/sounds/explosion1.wav | 0
Aworms/data/sounds/explosion2.wav | 0
Aworms/data/sounds/explosion3.wav | 0
Aworms/external/Box2dWeb-2.1.a.3.js | 10870+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aworms/external/Box2dWeb-2.1.a.3.min.js | 445+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aworms/external/Stats.js | 7+++++++
Aworms/external/bootstrap.min.js | 7+++++++
Aworms/external/jquery.1.8.2.min.js | 3+++
Aworms/external/test/qunit.css | 242+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aworms/index.html | 176+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

17 files changed, 12010 insertions(+), 1 deletion(-)

diff --git a/worms b/worms
@@ -1 +0,0 @@
-Subproject commit 6b07e61b9bd2e7db361d5babe8a1b9ff1d2b2a50
diff --git a/worms/css/bootstrap.min.css b/worms/css/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.2.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}.text-warning{color:#c09853}a.text-warning:hover{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover{color:#2d6987}.text-success{color:#468847}a.text-success:hover{color:#356635}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal;cursor:pointer}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info>label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn,.input-append select+.btn-group .btn,.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.warning td{background-color:#fcf8e3}.table tbody tr.info td{background-color:#d9edf7}.table-hover tbody tr.success:hover td{background-color:#d0e9c6}.table-hover tbody tr.error:hover td{background-color:#ebcccc}.table-hover tbody tr.warning:hover td{background-color:#faf2cc}.table-hover tbody tr.info:hover td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#333;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent;background-image:none}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:2px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini{padding:1px 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible;color:#777}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px}.navbar-link{color:#777}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:1px 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{z-index:-1;content:""}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-top-color:#fff;border-width:10px 10px 0}.popover.top .arrow:after{bottom:-1px;left:-11px;border-top-color:rgba(0,0,0,0.25);border-width:11px 11px 0}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-right-color:#fff;border-width:10px 10px 10px 0}.popover.right .arrow:after{bottom:-11px;left:-1px;border-right-color:rgba(0,0,0,0.25);border-width:11px 11px 11px 0}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-bottom-color:#fff;border-width:0 10px 10px}.popover.bottom .arrow:after{top:-1px;left:-11px;border-bottom-color:rgba(0,0,0,0.25);border-width:0 11px 11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-left-color:#fff;border-width:10px 0 10px 10px}.popover.left .arrow:after{right:-1px;bottom:-11px;border-left-color:rgba(0,0,0,0.25);border-width:11px 0 11px 11px}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media .pull-left{margin-right:10px}.media .pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
diff --git a/worms/css/custom.css b/worms/css/custom.css
@@ -0,0 +1,249 @@
+´╗┐body, html {
+    overflow: hidden;
+    margin: 0;
+    padding: 0;
+    background: #fff;
+    -moz-user-select: none;
+    -khtml-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+
+#action {
+    background: #242a4a; /* Old browsers */
+    background: -moz-linear-gradient(top, #242a4a 0%, #201610 100%); /* FF3.6+ */
+    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#242a4a), color-stop(100%,#201610)); /* Chrome,Safari4+ */
+    background: -webkit-linear-gradient(top, #242a4a 0%,#201610 100%); /* Chrome10+,Safari5.1+ */
+    background: -o-linear-gradient(top, #242a4a 0%,#201610 100%); /* Opera 11.10+ */
+    background: -ms-linear-gradient(top, #242a4a 0%,#201610 100%); /* IE10+ */
+    background: linear-gradient(to bottom, #242a4a 0%,#201610 100%); /* W3C */
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#242a4a', endColorstr='#201610',GradientType=0 ); /* IE6-9 */
+}
+
+
+#startMenu {
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    margin-left: -360px;
+    margin-top: -280px;
+    width: 600px;
+    height: 490px;
+    z-index: 1;
+}
+
+
+.btn-large {
+    margin-left: 10px;
+    margin-right: 10px;
+}
+
+.thumbnail {
+    padding: 5px;
+}
+
+#weaponsMenu .thumbnail {
+    padding: 17px;
+}
+
+
+
+.thumbnails {
+    margin-left: auto;
+    list-style: none;
+}
+
+#weaponsMenu {
+    position: absolute;
+    left: 100%;
+    top: 100%;
+    width: 275px;
+    height: 350px;
+    margin-top: -350px;
+    z-index: 9999999;
+    background: black;
+    border: 1px white solid;
+    padding: 10px;
+    padding-left: 2px;
+    padding-right: 2px;
+    border-radius: 3px;
+    cursor: default;
+}
+
+#weaponsMenuBtn {
+    -webkit-transform: rotate(90deg);
+    -moz-transform: rotate(90deg);
+    -ms-transform: rotate(90deg);
+    -o-transform: rotate(90deg);
+    transform: rotate(90deg);
+    cursor: pointer;
+    position: absolute;
+    left: -42.5%;
+    top: 20%;
+    padding: 20px;
+    font-style: bold;
+    background: black;
+    color: white;
+    border: white 1px solid;
+    border-radius: 3px;
+    z-index: 1;
+    font-size: 20px;
+    border-top: none;
+}
+
+    #weaponsMenuBtn:hover {
+        color: #08c;
+    }
+
+#weaponsMenu .thumbnail:active {
+    -ms-transform: scale(0.9,0.9); /* IE 9 */
+    -webkit-transform: scale(0.9,0.9); /* Safari and Chrome */
+    -o-transform: scale(0.9,0.9); /* Opera */
+    -moz-transform: scale(0.9,0.9);
+    transform: scale(0.9,0.9); /* Firefox */
+    cursor: pointer;
+}
+
+#weaponsMenu .noAmmo {
+    -moz-opacity: 0.4;
+    opacity: 0.4;
+}
+
+a.noAmmo:hover {
+    border-color: none;
+    cursor: pointer;
+}
+
+
+.span1 {
+    width: auto;
+}
+
+a.thumbnail.ammo {
+    background: black;
+    cursor: pointer;
+}
+
+.ammoCount {
+    position: absolute;
+    font-size: 11.5px;
+    margin-left: 26px;
+    margin-top: -7px;
+    font-weight: bold;
+    color: white;
+}
+
+#turnTimeCounter {
+    background: black;
+    border: white 1px solid;
+    width: 70px;
+    height: 70px;
+    position: absolute;
+    top: 100%;
+    margin-top: -78px;
+    margin-left: 10px;
+    color: white;
+    font-size: 40px;
+    display: -webkit-box;
+    box-align: center;
+    -webkit-box-orient: horizontal;
+    -webkit-box-pack: center;
+    -moz-box-align: center;
+    -webkit-box-align: center;
+    border-radius: 3px;
+    z-index: 1;
+}
+
+kbd {
+    white-space: nowrap;
+    color: black;
+    background: #EEE;
+    border-style: solid;
+    border-color: #CCC #AAA #888 #BBB;
+    padding: 2px 4px;
+    border-width: 1px 3px 3px 1px;
+}
+
+.healthMenu {
+    position: absolute;
+    left: 50%;
+    bottom: 1%;
+    width: 150px;
+    z-index: 1;
+    margin-left: -200px;
+}
+
+    .healthMenu li {
+        list-style: none;
+        padding: 5px;
+    }
+
+        .healthMenu li span {
+            margin-left: 10px;
+            margin-right: 10px;
+            background: black;
+            color: white;
+            font-size: 14px;
+            padding: 5px;
+            border-radius: 3px;
+            border: 1px white solid;
+        }
+
+
+
+    .healthMenu span.health {
+        position: absolute;
+        height: 15px;
+    }
+
+
+.modal-body h1 {
+    font-size: 18.5px;
+    line-height: normal;
+}
+
+
+.touchButton {
+    position: absolute;
+    left: 100%;
+    top: 100%;
+    width: 80px;
+    height: 50px;
+    margin-top: -78px;
+    margin-left: -100px;
+    z-index: 1;
+    background: black;
+    border: 1px white solid;
+    padding: 10px;
+    padding-left: 2px;
+    padding-right: 2px;
+    border-radius: 3px;
+    cursor: default;
+    color: white;
+    font-size: 30px;
+    display: -webkit-box;
+    -webkit-box-orient: horizontal;
+    -webkit-box-pack: center;
+    -webkit-box-align: center;
+}
+
+#touchJump {
+    margin-left: -200px;
+}
+
+#touchFire {
+    margin-left: -100px;
+}
+
+#notifaction {
+    text-align: center;
+    z-index: 99;
+    position: absolute;
+    top: -50px;
+    left: 50%;
+    margin-left: -250px;
+    width: 500px;
+    font-size: 17px;
+    border-color: black;
+}
diff --git a/worms/data/images/README.md b/worms/data/images/README.md
@@ -0,0 +1 @@
+Game Assets are not in the git repo due to the fact I don't own the copyright to them. 
+\ No newline at end of file
diff --git a/worms/data/images/levels/level2.png b/worms/data/images/levels/level2.png
Binary files differ.
diff --git a/worms/data/images/menu/xbox360controls.png b/worms/data/images/menu/xbox360controls.png
Binary files differ.
diff --git a/worms/data/sounds/boring.wav b/worms/data/sounds/boring.wav
Binary files differ.
diff --git a/worms/data/sounds/explosion1.wav b/worms/data/sounds/explosion1.wav
Binary files differ.
diff --git a/worms/data/sounds/explosion2.wav b/worms/data/sounds/explosion2.wav
Binary files differ.
diff --git a/worms/data/sounds/explosion3.wav b/worms/data/sounds/explosion3.wav
Binary files differ.
diff --git a/worms/external/Box2dWeb-2.1.a.3.js b/worms/external/Box2dWeb-2.1.a.3.js
@@ -0,0 +1,10869 @@
+/*
+* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
+*
+* This software is provided 'as-is', without any express or implied
+* warranty.  In no event will the authors be held liable for any damages
+* arising from the use of this software.
+* Permission is granted to anyone to use this software for any purpose,
+* including commercial applications, and to alter it and redistribute it
+* freely, subject to the following restrictions:
+* 1. The origin of this software must not be misrepresented; you must not
+* claim that you wrote the original software. If you use this software
+* in a product, an acknowledgment in the product documentation would be
+* appreciated but is not required.
+* 2. Altered source versions must be plainly marked as such, and must not be
+* misrepresented as being the original software.
+* 3. This notice may not be removed or altered from any source distribution.
+*/
+var Box2D = {};
+
+(function (a2j, undefined) {
+
+   if(!(Object.prototype.defineProperty instanceof Function)
+      && Object.prototype.__defineGetter__ instanceof Function
+      && Object.prototype.__defineSetter__ instanceof Function)
+   {
+      Object.defineProperty = function(obj, p, cfg) {
+         if(cfg.get instanceof Function)
+            obj.__defineGetter__(p, cfg.get);
+         if(cfg.set instanceof Function)
+            obj.__defineSetter__(p, cfg.set);
+      }
+   }
+   
+   function emptyFn() {};
+   a2j.inherit = function(cls, base) {
+      var tmpCtr = cls;
+      emptyFn.prototype = base.prototype;
+      cls.prototype = new emptyFn;
+      cls.prototype.constructor = tmpCtr;
+   };
+   
+   a2j.generateCallback = function generateCallback(context, cb) {
+      return function () {
+         cb.apply(context, arguments);
+      };
+   };
+   
+   a2j.NVector = function NVector(length) {
+      if (length === undefined) length = 0;
+      var tmp = new Array(length || 0);
+      for (var i = 0; i < length; ++i)
+      tmp[i] = 0;
+      return tmp;
+   };
+   
+   a2j.is = function is(o1, o2) {
+      if (o1 === null) return false;
+      if ((o2 instanceof Function) && (o1 instanceof o2)) return true;
+      if ((o1.constructor.__implements != undefined) && (o1.constructor.__implements[o2])) return true;
+      return false;
+   };
+   
+   a2j.parseUInt = function(v) {
+      return Math.abs(parseInt(v));
+   }
+   
+})(Box2D);
+
+//#TODO remove assignments from global namespace
+var Vector = Array;
+var Vector_a2j_Number = Box2D.NVector;
+//package structure
+if (typeof(Box2D) === "undefined") Box2D = {};
+if (typeof(Box2D.Collision) === "undefined") Box2D.Collision = {};
+if (typeof(Box2D.Collision.Shapes) === "undefined") Box2D.Collision.Shapes = {};
+if (typeof(Box2D.Common) === "undefined") Box2D.Common = {};
+if (typeof(Box2D.Common.Math) === "undefined") Box2D.Common.Math = {};
+if (typeof(Box2D.Dynamics) === "undefined") Box2D.Dynamics = {};
+if (typeof(Box2D.Dynamics.Contacts) === "undefined") Box2D.Dynamics.Contacts = {};
+if (typeof(Box2D.Dynamics.Controllers) === "undefined") Box2D.Dynamics.Controllers = {};
+if (typeof(Box2D.Dynamics.Joints) === "undefined") Box2D.Dynamics.Joints = {};
+//pre-definitions
+(function () {
+   Box2D.Collision.IBroadPhase = 'Box2D.Collision.IBroadPhase';
+
+   function b2AABB() {
+      b2AABB.b2AABB.apply(this, arguments);
+   };
+   Box2D.Collision.b2AABB = b2AABB;
+
+   function b2Bound() {
+      b2Bound.b2Bound.apply(this, arguments);
+   };
+   Box2D.Collision.b2Bound = b2Bound;
+
+   function b2BoundValues() {
+      b2BoundValues.b2BoundValues.apply(this, arguments);
+      if (this.constructor === b2BoundValues) this.b2BoundValues.apply(this, arguments);
+   };
+   Box2D.Collision.b2BoundValues = b2BoundValues;
+
+   function b2Collision() {
+      b2Collision.b2Collision.apply(this, arguments);
+   };
+   Box2D.Collision.b2Collision = b2Collision;
+
+   function b2ContactID() {
+      b2ContactID.b2ContactID.apply(this, arguments);
+      if (this.constructor === b2ContactID) this.b2ContactID.apply(this, arguments);
+   };
+   Box2D.Collision.b2ContactID = b2ContactID;
+
+   function b2ContactPoint() {
+      b2ContactPoint.b2ContactPoint.apply(this, arguments);
+   };
+   Box2D.Collision.b2ContactPoint = b2ContactPoint;
+
+   function b2Distance() {
+      b2Distance.b2Distance.apply(this, arguments);
+   };
+   Box2D.Collision.b2Distance = b2Distance;
+
+   function b2DistanceInput() {
+      b2DistanceInput.b2DistanceInput.apply(this, arguments);
+   };
+   Box2D.Collision.b2DistanceInput = b2DistanceInput;
+
+   function b2DistanceOutput() {
+      b2DistanceOutput.b2DistanceOutput.apply(this, arguments);
+   };
+   Box2D.Collision.b2DistanceOutput = b2DistanceOutput;
+
+   function b2DistanceProxy() {
+      b2DistanceProxy.b2DistanceProxy.apply(this, arguments);
+   };
+   Box2D.Collision.b2DistanceProxy = b2DistanceProxy;
+
+   function b2DynamicTree() {
+      b2DynamicTree.b2DynamicTree.apply(this, arguments);
+      if (this.constructor === b2DynamicTree) this.b2DynamicTree.apply(this, arguments);
+   };
+   Box2D.Collision.b2DynamicTree = b2DynamicTree;
+
+   function b2DynamicTreeBroadPhase() {
+      b2DynamicTreeBroadPhase.b2DynamicTreeBroadPhase.apply(this, arguments);
+   };
+   Box2D.Collision.b2DynamicTreeBroadPhase = b2DynamicTreeBroadPhase;
+
+   function b2DynamicTreeNode() {
+      b2DynamicTreeNode.b2DynamicTreeNode.apply(this, arguments);
+   };
+   Box2D.Collision.b2DynamicTreeNode = b2DynamicTreeNode;
+
+   function b2DynamicTreePair() {
+      b2DynamicTreePair.b2DynamicTreePair.apply(this, arguments);
+   };
+   Box2D.Collision.b2DynamicTreePair = b2DynamicTreePair;
+
+   function b2Manifold() {
+      b2Manifold.b2Manifold.apply(this, arguments);
+      if (this.constructor === b2Manifold) this.b2Manifold.apply(this, arguments);
+   };
+   Box2D.Collision.b2Manifold = b2Manifold;
+
+   function b2ManifoldPoint() {
+      b2ManifoldPoint.b2ManifoldPoint.apply(this, arguments);
+      if (this.constructor === b2ManifoldPoint) this.b2ManifoldPoint.apply(this, arguments);
+   };
+   Box2D.Collision.b2ManifoldPoint = b2ManifoldPoint;
+
+   function b2Point() {
+      b2Point.b2Point.apply(this, arguments);
+   };
+   Box2D.Collision.b2Point = b2Point;
+
+   function b2RayCastInput() {
+      b2RayCastInput.b2RayCastInput.apply(this, arguments);
+      if (this.constructor === b2RayCastInput) this.b2RayCastInput.apply(this, arguments);
+   };
+   Box2D.Collision.b2RayCastInput = b2RayCastInput;
+
+   function b2RayCastOutput() {
+      b2RayCastOutput.b2RayCastOutput.apply(this, arguments);
+   };
+   Box2D.Collision.b2RayCastOutput = b2RayCastOutput;
+
+   function b2Segment() {
+      b2Segment.b2Segment.apply(this, arguments);
+   };
+   Box2D.Collision.b2Segment = b2Segment;
+
+   function b2SeparationFunction() {
+      b2SeparationFunction.b2SeparationFunction.apply(this, arguments);
+   };
+   Box2D.Collision.b2SeparationFunction = b2SeparationFunction;
+
+   function b2Simplex() {
+      b2Simplex.b2Simplex.apply(this, arguments);
+      if (this.constructor === b2Simplex) this.b2Simplex.apply(this, arguments);
+   };
+   Box2D.Collision.b2Simplex = b2Simplex;
+
+   function b2SimplexCache() {
+      b2SimplexCache.b2SimplexCache.apply(this, arguments);
+   };
+   Box2D.Collision.b2SimplexCache = b2SimplexCache;
+
+   function b2SimplexVertex() {
+      b2SimplexVertex.b2SimplexVertex.apply(this, arguments);
+   };
+   Box2D.Collision.b2SimplexVertex = b2SimplexVertex;
+
+   function b2TimeOfImpact() {
+      b2TimeOfImpact.b2TimeOfImpact.apply(this, arguments);
+   };
+   Box2D.Collision.b2TimeOfImpact = b2TimeOfImpact;
+
+   function b2TOIInput() {
+      b2TOIInput.b2TOIInput.apply(this, arguments);
+   };
+   Box2D.Collision.b2TOIInput = b2TOIInput;
+
+   function b2WorldManifold() {
+      b2WorldManifold.b2WorldManifold.apply(this, arguments);
+      if (this.constructor === b2WorldManifold) this.b2WorldManifold.apply(this, arguments);
+   };
+   Box2D.Collision.b2WorldManifold = b2WorldManifold;
+
+   function ClipVertex() {
+      ClipVertex.ClipVertex.apply(this, arguments);
+   };
+   Box2D.Collision.ClipVertex = ClipVertex;
+
+   function Features() {
+      Features.Features.apply(this, arguments);
+   };
+   Box2D.Collision.Features = Features;
+
+   function b2CircleShape() {
+      b2CircleShape.b2CircleShape.apply(this, arguments);
+      if (this.constructor === b2CircleShape) this.b2CircleShape.apply(this, arguments);
+   };
+   Box2D.Collision.Shapes.b2CircleShape = b2CircleShape;
+
+   function b2EdgeChainDef() {
+      b2EdgeChainDef.b2EdgeChainDef.apply(this, arguments);
+      if (this.constructor === b2EdgeChainDef) this.b2EdgeChainDef.apply(this, arguments);
+   };
+   Box2D.Collision.Shapes.b2EdgeChainDef = b2EdgeChainDef;
+
+   function b2EdgeShape() {
+      b2EdgeShape.b2EdgeShape.apply(this, arguments);
+      if (this.constructor === b2EdgeShape) this.b2EdgeShape.apply(this, arguments);
+   };
+   Box2D.Collision.Shapes.b2EdgeShape = b2EdgeShape;
+
+   function b2MassData() {
+      b2MassData.b2MassData.apply(this, arguments);
+   };
+   Box2D.Collision.Shapes.b2MassData = b2MassData;
+
+   function b2PolygonShape() {
+      b2PolygonShape.b2PolygonShape.apply(this, arguments);
+      if (this.constructor === b2PolygonShape) this.b2PolygonShape.apply(this, arguments);
+   };
+   Box2D.Collision.Shapes.b2PolygonShape = b2PolygonShape;
+
+   function b2Shape() {
+      b2Shape.b2Shape.apply(this, arguments);
+      if (this.constructor === b2Shape) this.b2Shape.apply(this, arguments);
+   };
+   Box2D.Collision.Shapes.b2Shape = b2Shape;
+   Box2D.Common.b2internal = 'Box2D.Common.b2internal';
+
+   function b2Color() {
+      b2Color.b2Color.apply(this, arguments);
+      if (this.constructor === b2Color) this.b2Color.apply(this, arguments);
+   };
+   Box2D.Common.b2Color = b2Color;
+
+   function b2Settings() {
+      b2Settings.b2Settings.apply(this, arguments);
+   };
+   Box2D.Common.b2Settings = b2Settings;
+
+   function b2Mat22() {
+      b2Mat22.b2Mat22.apply(this, arguments);
+      if (this.constructor === b2Mat22) this.b2Mat22.apply(this, arguments);
+   };
+   Box2D.Common.Math.b2Mat22 = b2Mat22;
+
+   function b2Mat33() {
+      b2Mat33.b2Mat33.apply(this, arguments);
+      if (this.constructor === b2Mat33) this.b2Mat33.apply(this, arguments);
+   };
+   Box2D.Common.Math.b2Mat33 = b2Mat33;
+
+   function b2Math() {
+      b2Math.b2Math.apply(this, arguments);
+   };
+   Box2D.Common.Math.b2Math = b2Math;
+
+   function b2Sweep() {
+      b2Sweep.b2Sweep.apply(this, arguments);
+   };
+   Box2D.Common.Math.b2Sweep = b2Sweep;
+
+   function b2Transform() {
+      b2Transform.b2Transform.apply(this, arguments);
+      if (this.constructor === b2Transform) this.b2Transform.apply(this, arguments);
+   };
+   Box2D.Common.Math.b2Transform = b2Transform;
+
+   function b2Vec2() {
+      b2Vec2.b2Vec2.apply(this, arguments);
+      if (this.constructor === b2Vec2) this.b2Vec2.apply(this, arguments);
+   };
+   Box2D.Common.Math.b2Vec2 = b2Vec2;
+
+   function b2Vec3() {
+      b2Vec3.b2Vec3.apply(this, arguments);
+      if (this.constructor === b2Vec3) this.b2Vec3.apply(this, arguments);
+   };
+   Box2D.Common.Math.b2Vec3 = b2Vec3;
+
+   function b2Body() {
+      b2Body.b2Body.apply(this, arguments);
+      if (this.constructor === b2Body) this.b2Body.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2Body = b2Body;
+
+   function b2BodyDef() {
+      b2BodyDef.b2BodyDef.apply(this, arguments);
+      if (this.constructor === b2BodyDef) this.b2BodyDef.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2BodyDef = b2BodyDef;
+
+   function b2ContactFilter() {
+      b2ContactFilter.b2ContactFilter.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2ContactFilter = b2ContactFilter;
+
+   function b2ContactImpulse() {
+      b2ContactImpulse.b2ContactImpulse.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2ContactImpulse = b2ContactImpulse;
+
+   function b2ContactListener() {
+      b2ContactListener.b2ContactListener.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2ContactListener = b2ContactListener;
+
+   function b2ContactManager() {
+      b2ContactManager.b2ContactManager.apply(this, arguments);
+      if (this.constructor === b2ContactManager) this.b2ContactManager.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2ContactManager = b2ContactManager;
+
+   function b2DebugDraw() {
+      b2DebugDraw.b2DebugDraw.apply(this, arguments);
+      if (this.constructor === b2DebugDraw) this.b2DebugDraw.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2DebugDraw = b2DebugDraw;
+
+   function b2DestructionListener() {
+      b2DestructionListener.b2DestructionListener.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2DestructionListener = b2DestructionListener;
+
+   function b2FilterData() {
+      b2FilterData.b2FilterData.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2FilterData = b2FilterData;
+
+   function b2Fixture() {
+      b2Fixture.b2Fixture.apply(this, arguments);
+      if (this.constructor === b2Fixture) this.b2Fixture.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2Fixture = b2Fixture;
+
+   function b2FixtureDef() {
+      b2FixtureDef.b2FixtureDef.apply(this, arguments);
+      if (this.constructor === b2FixtureDef) this.b2FixtureDef.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2FixtureDef = b2FixtureDef;
+
+   function b2Island() {
+      b2Island.b2Island.apply(this, arguments);
+      if (this.constructor === b2Island) this.b2Island.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2Island = b2Island;
+
+   function b2TimeStep() {
+      b2TimeStep.b2TimeStep.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2TimeStep = b2TimeStep;
+
+   function b2World() {
+      b2World.b2World.apply(this, arguments);
+      if (this.constructor === b2World) this.b2World.apply(this, arguments);
+   };
+   Box2D.Dynamics.b2World = b2World;
+
+   function b2CircleContact() {
+      b2CircleContact.b2CircleContact.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2CircleContact = b2CircleContact;
+
+   function b2Contact() {
+      b2Contact.b2Contact.apply(this, arguments);
+      if (this.constructor === b2Contact) this.b2Contact.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2Contact = b2Contact;
+
+   function b2ContactConstraint() {
+      b2ContactConstraint.b2ContactConstraint.apply(this, arguments);
+      if (this.constructor === b2ContactConstraint) this.b2ContactConstraint.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2ContactConstraint = b2ContactConstraint;
+
+   function b2ContactConstraintPoint() {
+      b2ContactConstraintPoint.b2ContactConstraintPoint.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2ContactConstraintPoint = b2ContactConstraintPoint;
+
+   function b2ContactEdge() {
+      b2ContactEdge.b2ContactEdge.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2ContactEdge = b2ContactEdge;
+
+   function b2ContactFactory() {
+      b2ContactFactory.b2ContactFactory.apply(this, arguments);
+      if (this.constructor === b2ContactFactory) this.b2ContactFactory.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2ContactFactory = b2ContactFactory;
+
+   function b2ContactRegister() {
+      b2ContactRegister.b2ContactRegister.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2ContactRegister = b2ContactRegister;
+
+   function b2ContactResult() {
+      b2ContactResult.b2ContactResult.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2ContactResult = b2ContactResult;
+
+   function b2ContactSolver() {
+      b2ContactSolver.b2ContactSolver.apply(this, arguments);
+      if (this.constructor === b2ContactSolver) this.b2ContactSolver.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2ContactSolver = b2ContactSolver;
+
+   function b2EdgeAndCircleContact() {
+      b2EdgeAndCircleContact.b2EdgeAndCircleContact.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2EdgeAndCircleContact = b2EdgeAndCircleContact;
+
+   function b2NullContact() {
+      b2NullContact.b2NullContact.apply(this, arguments);
+      if (this.constructor === b2NullContact) this.b2NullContact.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2NullContact = b2NullContact;
+
+   function b2PolyAndCircleContact() {
+      b2PolyAndCircleContact.b2PolyAndCircleContact.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2PolyAndCircleContact = b2PolyAndCircleContact;
+
+   function b2PolyAndEdgeContact() {
+      b2PolyAndEdgeContact.b2PolyAndEdgeContact.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2PolyAndEdgeContact = b2PolyAndEdgeContact;
+
+   function b2PolygonContact() {
+      b2PolygonContact.b2PolygonContact.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2PolygonContact = b2PolygonContact;
+
+   function b2PositionSolverManifold() {
+      b2PositionSolverManifold.b2PositionSolverManifold.apply(this, arguments);
+      if (this.constructor === b2PositionSolverManifold) this.b2PositionSolverManifold.apply(this, arguments);
+   };
+   Box2D.Dynamics.Contacts.b2PositionSolverManifold = b2PositionSolverManifold;
+
+   function b2BuoyancyController() {
+      b2BuoyancyController.b2BuoyancyController.apply(this, arguments);
+   };
+   Box2D.Dynamics.Controllers.b2BuoyancyController = b2BuoyancyController;
+
+   function b2ConstantAccelController() {
+      b2ConstantAccelController.b2ConstantAccelController.apply(this, arguments);
+   };
+   Box2D.Dynamics.Controllers.b2ConstantAccelController = b2ConstantAccelController;
+
+   function b2ConstantForceController() {
+      b2ConstantForceController.b2ConstantForceController.apply(this, arguments);
+   };
+   Box2D.Dynamics.Controllers.b2ConstantForceController = b2ConstantForceController;
+
+   function b2Controller() {
+      b2Controller.b2Controller.apply(this, arguments);
+   };
+   Box2D.Dynamics.Controllers.b2Controller = b2Controller;
+
+   function b2ControllerEdge() {
+      b2ControllerEdge.b2ControllerEdge.apply(this, arguments);
+   };
+   Box2D.Dynamics.Controllers.b2ControllerEdge = b2ControllerEdge;
+
+   function b2GravityController() {
+      b2GravityController.b2GravityController.apply(this, arguments);
+   };
+   Box2D.Dynamics.Controllers.b2GravityController = b2GravityController;
+
+   function b2TensorDampingController() {
+      b2TensorDampingController.b2TensorDampingController.apply(this, arguments);
+   };
+   Box2D.Dynamics.Controllers.b2TensorDampingController = b2TensorDampingController;
+
+   function b2DistanceJoint() {
+      b2DistanceJoint.b2DistanceJoint.apply(this, arguments);
+      if (this.constructor === b2DistanceJoint) this.b2DistanceJoint.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2DistanceJoint = b2DistanceJoint;
+
+   function b2DistanceJointDef() {
+      b2DistanceJointDef.b2DistanceJointDef.apply(this, arguments);
+      if (this.constructor === b2DistanceJointDef) this.b2DistanceJointDef.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2DistanceJointDef = b2DistanceJointDef;
+
+   function b2FrictionJoint() {
+      b2FrictionJoint.b2FrictionJoint.apply(this, arguments);
+      if (this.constructor === b2FrictionJoint) this.b2FrictionJoint.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2FrictionJoint = b2FrictionJoint;
+
+   function b2FrictionJointDef() {
+      b2FrictionJointDef.b2FrictionJointDef.apply(this, arguments);
+      if (this.constructor === b2FrictionJointDef) this.b2FrictionJointDef.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2FrictionJointDef = b2FrictionJointDef;
+
+   function b2GearJoint() {
+      b2GearJoint.b2GearJoint.apply(this, arguments);
+      if (this.constructor === b2GearJoint) this.b2GearJoint.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2GearJoint = b2GearJoint;
+
+   function b2GearJointDef() {
+      b2GearJointDef.b2GearJointDef.apply(this, arguments);
+      if (this.constructor === b2GearJointDef) this.b2GearJointDef.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2GearJointDef = b2GearJointDef;
+
+   function b2Jacobian() {
+      b2Jacobian.b2Jacobian.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2Jacobian = b2Jacobian;
+
+   function b2Joint() {
+      b2Joint.b2Joint.apply(this, arguments);
+      if (this.constructor === b2Joint) this.b2Joint.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2Joint = b2Joint;
+
+   function b2JointDef() {
+      b2JointDef.b2JointDef.apply(this, arguments);
+      if (this.constructor === b2JointDef) this.b2JointDef.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2JointDef = b2JointDef;
+
+   function b2JointEdge() {
+      b2JointEdge.b2JointEdge.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2JointEdge = b2JointEdge;
+
+   function b2LineJoint() {
+      b2LineJoint.b2LineJoint.apply(this, arguments);
+      if (this.constructor === b2LineJoint) this.b2LineJoint.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2LineJoint = b2LineJoint;
+
+   function b2LineJointDef() {
+      b2LineJointDef.b2LineJointDef.apply(this, arguments);
+      if (this.constructor === b2LineJointDef) this.b2LineJointDef.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2LineJointDef = b2LineJointDef;
+
+   function b2MouseJoint() {
+      b2MouseJoint.b2MouseJoint.apply(this, arguments);
+      if (this.constructor === b2MouseJoint) this.b2MouseJoint.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2MouseJoint = b2MouseJoint;
+
+   function b2MouseJointDef() {
+      b2MouseJointDef.b2MouseJointDef.apply(this, arguments);
+      if (this.constructor === b2MouseJointDef) this.b2MouseJointDef.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2MouseJointDef = b2MouseJointDef;
+
+   function b2PrismaticJoint() {
+      b2PrismaticJoint.b2PrismaticJoint.apply(this, arguments);
+      if (this.constructor === b2PrismaticJoint) this.b2PrismaticJoint.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2PrismaticJoint = b2PrismaticJoint;
+
+   function b2PrismaticJointDef() {
+      b2PrismaticJointDef.b2PrismaticJointDef.apply(this, arguments);
+      if (this.constructor === b2PrismaticJointDef) this.b2PrismaticJointDef.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2PrismaticJointDef = b2PrismaticJointDef;
+
+   function b2PulleyJoint() {
+      b2PulleyJoint.b2PulleyJoint.apply(this, arguments);
+      if (this.constructor === b2PulleyJoint) this.b2PulleyJoint.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2PulleyJoint = b2PulleyJoint;
+
+   function b2PulleyJointDef() {
+      b2PulleyJointDef.b2PulleyJointDef.apply(this, arguments);
+      if (this.constructor === b2PulleyJointDef) this.b2PulleyJointDef.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2PulleyJointDef = b2PulleyJointDef;
+
+   function b2RevoluteJoint() {
+      b2RevoluteJoint.b2RevoluteJoint.apply(this, arguments);
+      if (this.constructor === b2RevoluteJoint) this.b2RevoluteJoint.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2RevoluteJoint = b2RevoluteJoint;
+
+   function b2RevoluteJointDef() {
+      b2RevoluteJointDef.b2RevoluteJointDef.apply(this, arguments);
+      if (this.constructor === b2RevoluteJointDef) this.b2RevoluteJointDef.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2RevoluteJointDef = b2RevoluteJointDef;
+
+   function b2WeldJoint() {
+      b2WeldJoint.b2WeldJoint.apply(this, arguments);
+      if (this.constructor === b2WeldJoint) this.b2WeldJoint.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2WeldJoint = b2WeldJoint;
+
+   function b2WeldJointDef() {
+      b2WeldJointDef.b2WeldJointDef.apply(this, arguments);
+      if (this.constructor === b2WeldJointDef) this.b2WeldJointDef.apply(this, arguments);
+   };
+   Box2D.Dynamics.Joints.b2WeldJointDef = b2WeldJointDef;
+})(); //definitions
+Box2D.postDefs = [];
+(function () {
+   var b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
+      b2EdgeChainDef = Box2D.Collision.Shapes.b2EdgeChainDef,
+      b2EdgeShape = Box2D.Collision.Shapes.b2EdgeShape,
+      b2MassData = Box2D.Collision.Shapes.b2MassData,
+      b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
+      b2Shape = Box2D.Collision.Shapes.b2Shape,
+      b2Color = Box2D.Common.b2Color,
+      b2internal = Box2D.Common.b2internal,
+      b2Settings = Box2D.Common.b2Settings,
+      b2Mat22 = Box2D.Common.Math.b2Mat22,
+      b2Mat33 = Box2D.Common.Math.b2Mat33,
+      b2Math = Box2D.Common.Math.b2Math,
+      b2Sweep = Box2D.Common.Math.b2Sweep,
+      b2Transform = Box2D.Common.Math.b2Transform,
+      b2Vec2 = Box2D.Common.Math.b2Vec2,
+      b2Vec3 = Box2D.Common.Math.b2Vec3,
+      b2AABB = Box2D.Collision.b2AABB,
+      b2Bound = Box2D.Collision.b2Bound,
+      b2BoundValues = Box2D.Collision.b2BoundValues,
+      b2Collision = Box2D.Collision.b2Collision,
+      b2ContactID = Box2D.Collision.b2ContactID,
+      b2ContactPoint = Box2D.Collision.b2ContactPoint,
+      b2Distance = Box2D.Collision.b2Distance,
+      b2DistanceInput = Box2D.Collision.b2DistanceInput,
+      b2DistanceOutput = Box2D.Collision.b2DistanceOutput,
+      b2DistanceProxy = Box2D.Collision.b2DistanceProxy,
+      b2DynamicTree = Box2D.Collision.b2DynamicTree,
+      b2DynamicTreeBroadPhase = Box2D.Collision.b2DynamicTreeBroadPhase,
+      b2DynamicTreeNode = Box2D.Collision.b2DynamicTreeNode,
+      b2DynamicTreePair = Box2D.Collision.b2DynamicTreePair,
+      b2Manifold = Box2D.Collision.b2Manifold,
+      b2ManifoldPoint = Box2D.Collision.b2ManifoldPoint,
+      b2Point = Box2D.Collision.b2Point,
+      b2RayCastInput = Box2D.Collision.b2RayCastInput,
+      b2RayCastOutput = Box2D.Collision.b2RayCastOutput,
+      b2Segment = Box2D.Collision.b2Segment,
+      b2SeparationFunction = Box2D.Collision.b2SeparationFunction,
+      b2Simplex = Box2D.Collision.b2Simplex,
+      b2SimplexCache = Box2D.Collision.b2SimplexCache,
+      b2SimplexVertex = Box2D.Collision.b2SimplexVertex,
+      b2TimeOfImpact = Box2D.Collision.b2TimeOfImpact,
+      b2TOIInput = Box2D.Collision.b2TOIInput,
+      b2WorldManifold = Box2D.Collision.b2WorldManifold,
+      ClipVertex = Box2D.Collision.ClipVertex,
+      Features = Box2D.Collision.Features,
+      IBroadPhase = Box2D.Collision.IBroadPhase;
+
+   b2AABB.b2AABB = function () {
+      this.lowerBound = new b2Vec2();
+      this.upperBound = new b2Vec2();
+   };
+   b2AABB.prototype.IsValid = function () {
+      var dX = this.upperBound.x - this.lowerBound.x;
+      var dY = this.upperBound.y - this.lowerBound.y;
+      var valid = dX >= 0.0 && dY >= 0.0;
+      valid = valid && this.lowerBound.IsValid() && this.upperBound.IsValid();
+      return valid;
+   }
+   b2AABB.prototype.GetCenter = function () {
+      return new b2Vec2((this.lowerBound.x + this.upperBound.x) / 2, (this.lowerBound.y + this.upperBound.y) / 2);
+   }
+   b2AABB.prototype.GetExtents = function () {
+      return new b2Vec2((this.upperBound.x - this.lowerBound.x) / 2, (this.upperBound.y - this.lowerBound.y) / 2);
+   }
+   b2AABB.prototype.Contains = function (aabb) {
+      var result = true;
+      result = result && this.lowerBound.x <= aabb.lowerBound.x;
+      result = result && this.lowerBound.y <= aabb.lowerBound.y;
+      result = result && aabb.upperBound.x <= this.upperBound.x;
+      result = result && aabb.upperBound.y <= this.upperBound.y;
+      return result;
+   }
+   b2AABB.prototype.RayCast = function (output, input) {
+      var tmin = (-Number.MAX_VALUE);
+      var tmax = Number.MAX_VALUE;
+      var pX = input.p1.x;
+      var pY = input.p1.y;
+      var dX = input.p2.x - input.p1.x;
+      var dY = input.p2.y - input.p1.y;
+      var absDX = Math.abs(dX);
+      var absDY = Math.abs(dY);
+      var normal = output.normal;
+      var inv_d = 0;
+      var t1 = 0;
+      var t2 = 0;
+      var t3 = 0;
+      var s = 0; {
+         if (absDX < Number.MIN_VALUE) {
+            if (pX < this.lowerBound.x || this.upperBound.x < pX) return false;
+         }
+         else {
+            inv_d = 1.0 / dX;
+            t1 = (this.lowerBound.x - pX) * inv_d;
+            t2 = (this.upperBound.x - pX) * inv_d;
+            s = (-1.0);
+            if (t1 > t2) {
+               t3 = t1;
+               t1 = t2;
+               t2 = t3;
+               s = 1.0;
+            }
+            if (t1 > tmin) {
+               normal.x = s;
+               normal.y = 0;
+               tmin = t1;
+            }
+            tmax = Math.min(tmax, t2);
+            if (tmin > tmax) return false;
+         }
+      } {
+         if (absDY < Number.MIN_VALUE) {
+            if (pY < this.lowerBound.y || this.upperBound.y < pY) return false;
+         }
+         else {
+            inv_d = 1.0 / dY;
+            t1 = (this.lowerBound.y - pY) * inv_d;
+            t2 = (this.upperBound.y - pY) * inv_d;
+            s = (-1.0);
+            if (t1 > t2) {
+               t3 = t1;
+               t1 = t2;
+               t2 = t3;
+               s = 1.0;
+            }
+            if (t1 > tmin) {
+               normal.y = s;
+               normal.x = 0;
+               tmin = t1;
+            }
+            tmax = Math.min(tmax, t2);
+            if (tmin > tmax) return false;
+         }
+      }
+      output.fraction = tmin;
+      return true;
+   }
+   b2AABB.prototype.TestOverlap = function (other) {
+      var d1X = other.lowerBound.x - this.upperBound.x;
+      var d1Y = other.lowerBound.y - this.upperBound.y;
+      var d2X = this.lowerBound.x - other.upperBound.x;
+      var d2Y = this.lowerBound.y - other.upperBound.y;
+      if (d1X > 0.0 || d1Y > 0.0) return false;
+      if (d2X > 0.0 || d2Y > 0.0) return false;
+      return true;
+   }
+   b2AABB.Combine = function (aabb1, aabb2) {
+      var aabb = new b2AABB();
+      aabb.Combine(aabb1, aabb2);
+      return aabb;
+   }
+   b2AABB.prototype.Combine = function (aabb1, aabb2) {
+      this.lowerBound.x = Math.min(aabb1.lowerBound.x, aabb2.lowerBound.x);
+      this.lowerBound.y = Math.min(aabb1.lowerBound.y, aabb2.lowerBound.y);
+      this.upperBound.x = Math.max(aabb1.upperBound.x, aabb2.upperBound.x);
+      this.upperBound.y = Math.max(aabb1.upperBound.y, aabb2.upperBound.y);
+   }
+   b2Bound.b2Bound = function () {};
+   b2Bound.prototype.IsLower = function () {
+      return (this.value & 1) == 0;
+   }
+   b2Bound.prototype.IsUpper = function () {
+      return (this.value & 1) == 1;
+   }
+   b2Bound.prototype.Swap = function (b) {
+      var tempValue = this.value;
+      var tempProxy = this.proxy;
+      var tempStabbingCount = this.stabbingCount;
+      this.value = b.value;
+      this.proxy = b.proxy;
+      this.stabbingCount = b.stabbingCount;
+      b.value = tempValue;
+      b.proxy = tempProxy;
+      b.stabbingCount = tempStabbingCount;
+   }
+   b2BoundValues.b2BoundValues = function () {};
+   b2BoundValues.prototype.b2BoundValues = function () {
+      this.lowerValues = new Vector_a2j_Number();
+      this.lowerValues[0] = 0.0;
+      this.lowerValues[1] = 0.0;
+      this.upperValues = new Vector_a2j_Number();
+      this.upperValues[0] = 0.0;
+      this.upperValues[1] = 0.0;
+   }
+   b2Collision.b2Collision = function () {};
+   b2Collision.ClipSegmentToLine = function (vOut, vIn, normal, offset) {
+      if (offset === undefined) offset = 0;
+      var cv;
+      var numOut = 0;
+      cv = vIn[0];
+      var vIn0 = cv.v;
+      cv = vIn[1];
+      var vIn1 = cv.v;
+      var distance0 = normal.x * vIn0.x + normal.y * vIn0.y - offset;
+      var distance1 = normal.x * vIn1.x + normal.y * vIn1.y - offset;
+      if (distance0 <= 0.0) vOut[numOut++].Set(vIn[0]);
+      if (distance1 <= 0.0) vOut[numOut++].Set(vIn[1]);
+      if (distance0 * distance1 < 0.0) {
+         var interp = distance0 / (distance0 - distance1);
+         cv = vOut[numOut];
+         var tVec = cv.v;
+         tVec.x = vIn0.x + interp * (vIn1.x - vIn0.x);
+         tVec.y = vIn0.y + interp * (vIn1.y - vIn0.y);
+         cv = vOut[numOut];
+         var cv2;
+         if (distance0 > 0.0) {
+            cv2 = vIn[0];
+            cv.id = cv2.id;
+         }
+         else {
+            cv2 = vIn[1];
+            cv.id = cv2.id;
+         }++numOut;
+      }
+      return numOut;
+   }
+   b2Collision.EdgeSeparation = function (poly1, xf1, edge1, poly2, xf2) {
+      if (edge1 === undefined) edge1 = 0;
+      var count1 = parseInt(poly1.m_vertexCount);
+      var vertices1 = poly1.m_vertices;
+      var normals1 = poly1.m_normals;
+      var count2 = parseInt(poly2.m_vertexCount);
+      var vertices2 = poly2.m_vertices;
+      var tMat;
+      var tVec;
+      tMat = xf1.R;
+      tVec = normals1[edge1];
+      var normal1WorldX = (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      var normal1WorldY = (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      tMat = xf2.R;
+      var normal1X = (tMat.col1.x * normal1WorldX + tMat.col1.y * normal1WorldY);
+      var normal1Y = (tMat.col2.x * normal1WorldX + tMat.col2.y * normal1WorldY);
+      var index = 0;
+      var minDot = Number.MAX_VALUE;
+      for (var i = 0; i < count2; ++i) {
+         tVec = vertices2[i];
+         var dot = tVec.x * normal1X + tVec.y * normal1Y;
+         if (dot < minDot) {
+            minDot = dot;
+            index = i;
+         }
+      }
+      tVec = vertices1[edge1];
+      tMat = xf1.R;
+      var v1X = xf1.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      var v1Y = xf1.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      tVec = vertices2[index];
+      tMat = xf2.R;
+      var v2X = xf2.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      var v2Y = xf2.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      v2X -= v1X;
+      v2Y -= v1Y;
+      var separation = v2X * normal1WorldX + v2Y * normal1WorldY;
+      return separation;
+   }
+   b2Collision.FindMaxSeparation = function (edgeIndex, poly1, xf1, poly2, xf2) {
+      var count1 = parseInt(poly1.m_vertexCount);
+      var normals1 = poly1.m_normals;
+      var tVec;
+      var tMat;
+      tMat = xf2.R;
+      tVec = poly2.m_centroid;
+      var dX = xf2.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      var dY = xf2.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      tMat = xf1.R;
+      tVec = poly1.m_centroid;
+      dX -= xf1.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      dY -= xf1.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      var dLocal1X = (dX * xf1.R.col1.x + dY * xf1.R.col1.y);
+      var dLocal1Y = (dX * xf1.R.col2.x + dY * xf1.R.col2.y);
+      var edge = 0;
+      var maxDot = (-Number.MAX_VALUE);
+      for (var i = 0; i < count1; ++i) {
+         tVec = normals1[i];
+         var dot = (tVec.x * dLocal1X + tVec.y * dLocal1Y);
+         if (dot > maxDot) {
+            maxDot = dot;
+            edge = i;
+         }
+      }
+      var s = b2Collision.EdgeSeparation(poly1, xf1, edge, poly2, xf2);
+      var prevEdge = parseInt(edge - 1 >= 0 ? edge - 1 : count1 - 1);
+      var sPrev = b2Collision.EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2);
+      var nextEdge = parseInt(edge + 1 < count1 ? edge + 1 : 0);
+      var sNext = b2Collision.EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2);
+      var bestEdge = 0;
+      var bestSeparation = 0;
+      var increment = 0;
+      if (sPrev > s && sPrev > sNext) {
+         increment = (-1);
+         bestEdge = prevEdge;
+         bestSeparation = sPrev;
+      }
+      else if (sNext > s) {
+         increment = 1;
+         bestEdge = nextEdge;
+         bestSeparation = sNext;
+      }
+      else {
+         edgeIndex[0] = edge;
+         return s;
+      }
+      while (true) {
+         if (increment == (-1)) edge = bestEdge - 1 >= 0 ? bestEdge - 1 : count1 - 1;
+         else edge = bestEdge + 1 < count1 ? bestEdge + 1 : 0;s = b2Collision.EdgeSeparation(poly1, xf1, edge, poly2, xf2);
+         if (s > bestSeparation) {
+            bestEdge = edge;
+            bestSeparation = s;
+         }
+         else {
+            break;
+         }
+      }
+      edgeIndex[0] = bestEdge;
+      return bestSeparation;
+   }
+   b2Collision.FindIncidentEdge = function (c, poly1, xf1, edge1, poly2, xf2) {
+      if (edge1 === undefined) edge1 = 0;
+      var count1 = parseInt(poly1.m_vertexCount);
+      var normals1 = poly1.m_normals;
+      var count2 = parseInt(poly2.m_vertexCount);
+      var vertices2 = poly2.m_vertices;
+      var normals2 = poly2.m_normals;
+      var tMat;
+      var tVec;
+      tMat = xf1.R;
+      tVec = normals1[edge1];
+      var normal1X = (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      var normal1Y = (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      tMat = xf2.R;
+      var tX = (tMat.col1.x * normal1X + tMat.col1.y * normal1Y);
+      normal1Y = (tMat.col2.x * normal1X + tMat.col2.y * normal1Y);
+      normal1X = tX;
+      var index = 0;
+      var minDot = Number.MAX_VALUE;
+      for (var i = 0; i < count2; ++i) {
+         tVec = normals2[i];
+         var dot = (normal1X * tVec.x + normal1Y * tVec.y);
+         if (dot < minDot) {
+            minDot = dot;
+            index = i;
+         }
+      }
+      var tClip;
+      var i1 = parseInt(index);
+      var i2 = parseInt(i1 + 1 < count2 ? i1 + 1 : 0);
+      tClip = c[0];
+      tVec = vertices2[i1];
+      tMat = xf2.R;
+      tClip.v.x = xf2.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      tClip.v.y = xf2.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      tClip.id.features.referenceEdge = edge1;
+      tClip.id.features.incidentEdge = i1;
+      tClip.id.features.incidentVertex = 0;
+      tClip = c[1];
+      tVec = vertices2[i2];
+      tMat = xf2.R;
+      tClip.v.x = xf2.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      tClip.v.y = xf2.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      tClip.id.features.referenceEdge = edge1;
+      tClip.id.features.incidentEdge = i2;
+      tClip.id.features.incidentVertex = 1;
+   }
+   b2Collision.MakeClipPointVector = function () {
+      var r = new Vector(2);
+      r[0] = new ClipVertex();
+      r[1] = new ClipVertex();
+      return r;
+   }
+   b2Collision.CollidePolygons = function (manifold, polyA, xfA, polyB, xfB) {
+      var cv;
+      manifold.m_pointCount = 0;
+      var totalRadius = polyA.m_radius + polyB.m_radius;
+      var edgeA = 0;
+      b2Collision.s_edgeAO[0] = edgeA;
+      var separationA = b2Collision.FindMaxSeparation(b2Collision.s_edgeAO, polyA, xfA, polyB, xfB);
+      edgeA = b2Collision.s_edgeAO[0];
+      if (separationA > totalRadius) return;
+      var edgeB = 0;
+      b2Collision.s_edgeBO[0] = edgeB;
+      var separationB = b2Collision.FindMaxSeparation(b2Collision.s_edgeBO, polyB, xfB, polyA, xfA);
+      edgeB = b2Collision.s_edgeBO[0];
+      if (separationB > totalRadius) return;
+      var poly1;
+      var poly2;
+      var xf1;
+      var xf2;
+      var edge1 = 0;
+      var flip = 0;
+      var k_relativeTol = 0.98;
+      var k_absoluteTol = 0.001;
+      var tMat;
+      if (separationB > k_relativeTol * separationA + k_absoluteTol) {
+         poly1 = polyB;
+         poly2 = polyA;
+         xf1 = xfB;
+         xf2 = xfA;
+         edge1 = edgeB;
+         manifold.m_type = b2Manifold.e_faceB;
+         flip = 1;
+      }
+      else {
+         poly1 = polyA;
+         poly2 = polyB;
+         xf1 = xfA;
+         xf2 = xfB;
+         edge1 = edgeA;
+         manifold.m_type = b2Manifold.e_faceA;
+         flip = 0;
+      }
+      var incidentEdge = b2Collision.s_incidentEdge;
+      b2Collision.FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);
+      var count1 = parseInt(poly1.m_vertexCount);
+      var vertices1 = poly1.m_vertices;
+      var local_v11 = vertices1[edge1];
+      var local_v12;
+      if (edge1 + 1 < count1) {
+         local_v12 = vertices1[parseInt(edge1 + 1)];
+      }
+      else {
+         local_v12 = vertices1[0];
+      }
+      var localTangent = b2Collision.s_localTangent;
+      localTangent.Set(local_v12.x - local_v11.x, local_v12.y - local_v11.y);
+      localTangent.Normalize();
+      var localNormal = b2Collision.s_localNormal;
+      localNormal.x = localTangent.y;
+      localNormal.y = (-localTangent.x);
+      var planePoint = b2Collision.s_planePoint;
+      planePoint.Set(0.5 * (local_v11.x + local_v12.x), 0.5 * (local_v11.y + local_v12.y));
+      var tangent = b2Collision.s_tangent;
+      tMat = xf1.R;
+      tangent.x = (tMat.col1.x * localTangent.x + tMat.col2.x * localTangent.y);
+      tangent.y = (tMat.col1.y * localTangent.x + tMat.col2.y * localTangent.y);
+      var tangent2 = b2Collision.s_tangent2;
+      tangent2.x = (-tangent.x);
+      tangent2.y = (-tangent.y);
+      var normal = b2Collision.s_normal;
+      normal.x = tangent.y;
+      normal.y = (-tangent.x);
+      var v11 = b2Collision.s_v11;
+      var v12 = b2Collision.s_v12;
+      v11.x = xf1.position.x + (tMat.col1.x * local_v11.x + tMat.col2.x * local_v11.y);
+      v11.y = xf1.position.y + (tMat.col1.y * local_v11.x + tMat.col2.y * local_v11.y);
+      v12.x = xf1.position.x + (tMat.col1.x * local_v12.x + tMat.col2.x * local_v12.y);
+      v12.y = xf1.position.y + (tMat.col1.y * local_v12.x + tMat.col2.y * local_v12.y);
+      var frontOffset = normal.x * v11.x + normal.y * v11.y;
+      var sideOffset1 = (-tangent.x * v11.x) - tangent.y * v11.y + totalRadius;
+      var sideOffset2 = tangent.x * v12.x + tangent.y * v12.y + totalRadius;
+      var clipPoints1 = b2Collision.s_clipPoints1;
+      var clipPoints2 = b2Collision.s_clipPoints2;
+      var np = 0;
+      np = b2Collision.ClipSegmentToLine(clipPoints1, incidentEdge, tangent2, sideOffset1);
+      if (np < 2) return;
+      np = b2Collision.ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2);
+      if (np < 2) return;
+      manifold.m_localPlaneNormal.SetV(localNormal);
+      manifold.m_localPoint.SetV(planePoint);
+      var pointCount = 0;
+      for (var i = 0; i < b2Settings.b2_maxManifoldPoints; ++i) {
+         cv = clipPoints2[i];
+         var separation = normal.x * cv.v.x + normal.y * cv.v.y - frontOffset;
+         if (separation <= totalRadius) {
+            var cp = manifold.m_points[pointCount];
+            tMat = xf2.R;
+            var tX = cv.v.x - xf2.position.x;
+            var tY = cv.v.y - xf2.position.y;
+            cp.m_localPoint.x = (tX * tMat.col1.x + tY * tMat.col1.y);
+            cp.m_localPoint.y = (tX * tMat.col2.x + tY * tMat.col2.y);
+            cp.m_id.Set(cv.id);
+            cp.m_id.features.flip = flip;
+            ++pointCount;
+         }
+      }
+      manifold.m_pointCount = pointCount;
+   }
+   b2Collision.CollideCircles = function (manifold, circle1, xf1, circle2, xf2) {
+      manifold.m_pointCount = 0;
+      var tMat;
+      var tVec;
+      tMat = xf1.R;
+      tVec = circle1.m_p;
+      var p1X = xf1.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      var p1Y = xf1.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      tMat = xf2.R;
+      tVec = circle2.m_p;
+      var p2X = xf2.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      var p2Y = xf2.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      var dX = p2X - p1X;
+      var dY = p2Y - p1Y;
+      var distSqr = dX * dX + dY * dY;
+      var radius = circle1.m_radius + circle2.m_radius;
+      if (distSqr > radius * radius) {
+         return;
+      }
+      manifold.m_type = b2Manifold.e_circles;
+      manifold.m_localPoint.SetV(circle1.m_p);
+      manifold.m_localPlaneNormal.SetZero();
+      manifold.m_pointCount = 1;
+      manifold.m_points[0].m_localPoint.SetV(circle2.m_p);
+      manifold.m_points[0].m_id.key = 0;
+   }
+   b2Collision.CollidePolygonAndCircle = function (manifold, polygon, xf1, circle, xf2) {
+      manifold.m_pointCount = 0;
+      var tPoint;
+      var dX = 0;
+      var dY = 0;
+      var positionX = 0;
+      var positionY = 0;
+      var tVec;
+      var tMat;
+      tMat = xf2.R;
+      tVec = circle.m_p;
+      var cX = xf2.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      var cY = xf2.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      dX = cX - xf1.position.x;
+      dY = cY - xf1.position.y;
+      tMat = xf1.R;
+      var cLocalX = (dX * tMat.col1.x + dY * tMat.col1.y);
+      var cLocalY = (dX * tMat.col2.x + dY * tMat.col2.y);
+      var dist = 0;
+      var normalIndex = 0;
+      var separation = (-Number.MAX_VALUE);
+      var radius = polygon.m_radius + circle.m_radius;
+      var vertexCount = parseInt(polygon.m_vertexCount);
+      var vertices = polygon.m_vertices;
+      var normals = polygon.m_normals;
+      for (var i = 0; i < vertexCount; ++i) {
+         tVec = vertices[i];
+         dX = cLocalX - tVec.x;
+         dY = cLocalY - tVec.y;
+         tVec = normals[i];
+         var s = tVec.x * dX + tVec.y * dY;
+         if (s > radius) {
+            return;
+         }
+         if (s > separation) {
+            separation = s;
+            normalIndex = i;
+         }
+      }
+      var vertIndex1 = parseInt(normalIndex);
+      var vertIndex2 = parseInt(vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0);
+      var v1 = vertices[vertIndex1];
+      var v2 = vertices[vertIndex2];
+      if (separation < Number.MIN_VALUE) {
+         manifold.m_pointCount = 1;
+         manifold.m_type = b2Manifold.e_faceA;
+         manifold.m_localPlaneNormal.SetV(normals[normalIndex]);
+         manifold.m_localPoint.x = 0.5 * (v1.x + v2.x);
+         manifold.m_localPoint.y = 0.5 * (v1.y + v2.y);
+         manifold.m_points[0].m_localPoint.SetV(circle.m_p);
+         manifold.m_points[0].m_id.key = 0;
+         return;
+      }
+      var u1 = (cLocalX - v1.x) * (v2.x - v1.x) + (cLocalY - v1.y) * (v2.y - v1.y);
+      var u2 = (cLocalX - v2.x) * (v1.x - v2.x) + (cLocalY - v2.y) * (v1.y - v2.y);
+      if (u1 <= 0.0) {
+         if ((cLocalX - v1.x) * (cLocalX - v1.x) + (cLocalY - v1.y) * (cLocalY - v1.y) > radius * radius) return;
+         manifold.m_pointCount = 1;
+         manifold.m_type = b2Manifold.e_faceA;
+         manifold.m_localPlaneNormal.x = cLocalX - v1.x;
+         manifold.m_localPlaneNormal.y = cLocalY - v1.y;
+         manifold.m_localPlaneNormal.Normalize();
+         manifold.m_localPoint.SetV(v1);
+         manifold.m_points[0].m_localPoint.SetV(circle.m_p);
+         manifold.m_points[0].m_id.key = 0;
+      }
+      else if (u2 <= 0) {
+         if ((cLocalX - v2.x) * (cLocalX - v2.x) + (cLocalY - v2.y) * (cLocalY - v2.y) > radius * radius) return;
+         manifold.m_pointCount = 1;
+         manifold.m_type = b2Manifold.e_faceA;
+         manifold.m_localPlaneNormal.x = cLocalX - v2.x;
+         manifold.m_localPlaneNormal.y = cLocalY - v2.y;
+         manifold.m_localPlaneNormal.Normalize();
+         manifold.m_localPoint.SetV(v2);
+         manifold.m_points[0].m_localPoint.SetV(circle.m_p);
+         manifold.m_points[0].m_id.key = 0;
+      }
+      else {
+         var faceCenterX = 0.5 * (v1.x + v2.x);
+         var faceCenterY = 0.5 * (v1.y + v2.y);
+         separation = (cLocalX - faceCenterX) * normals[vertIndex1].x + (cLocalY - faceCenterY) * normals[vertIndex1].y;
+         if (separation > radius) return;
+         manifold.m_pointCount = 1;
+         manifold.m_type = b2Manifold.e_faceA;
+         manifold.m_localPlaneNormal.x = normals[vertIndex1].x;
+         manifold.m_localPlaneNormal.y = normals[vertIndex1].y;
+         manifold.m_localPlaneNormal.Normalize();
+         manifold.m_localPoint.Set(faceCenterX, faceCenterY);
+         manifold.m_points[0].m_localPoint.SetV(circle.m_p);
+         manifold.m_points[0].m_id.key = 0;
+      }
+   }
+   b2Collision.TestOverlap = function (a, b) {
+      var t1 = b.lowerBound;
+      var t2 = a.upperBound;
+      var d1X = t1.x - t2.x;
+      var d1Y = t1.y - t2.y;
+      t1 = a.lowerBound;
+      t2 = b.upperBound;
+      var d2X = t1.x - t2.x;
+      var d2Y = t1.y - t2.y;
+      if (d1X > 0.0 || d1Y > 0.0) return false;
+      if (d2X > 0.0 || d2Y > 0.0) return false;
+      return true;
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Collision.b2Collision.s_incidentEdge = b2Collision.MakeClipPointVector();
+      Box2D.Collision.b2Collision.s_clipPoints1 = b2Collision.MakeClipPointVector();
+      Box2D.Collision.b2Collision.s_clipPoints2 = b2Collision.MakeClipPointVector();
+      Box2D.Collision.b2Collision.s_edgeAO = new Vector_a2j_Number(1);
+      Box2D.Collision.b2Collision.s_edgeBO = new Vector_a2j_Number(1);
+      Box2D.Collision.b2Collision.s_localTangent = new b2Vec2();
+      Box2D.Collision.b2Collision.s_localNormal = new b2Vec2();
+      Box2D.Collision.b2Collision.s_planePoint = new b2Vec2();
+      Box2D.Collision.b2Collision.s_normal = new b2Vec2();
+      Box2D.Collision.b2Collision.s_tangent = new b2Vec2();
+      Box2D.Collision.b2Collision.s_tangent2 = new b2Vec2();
+      Box2D.Collision.b2Collision.s_v11 = new b2Vec2();
+      Box2D.Collision.b2Collision.s_v12 = new b2Vec2();
+      Box2D.Collision.b2Collision.b2CollidePolyTempVec = new b2Vec2();
+      Box2D.Collision.b2Collision.b2_nullFeature = 0x000000ff;
+   });
+   b2ContactID.b2ContactID = function () {
+      this.features = new Features();
+   };
+   b2ContactID.prototype.b2ContactID = function () {
+      this.features._m_id = this;
+   }
+   b2ContactID.prototype.Set = function (id) {
+      this.key = id._key;
+   }
+   b2ContactID.prototype.Copy = function () {
+      var id = new b2ContactID();
+      id.key = this.key;
+      return id;
+   }
+   Object.defineProperty(b2ContactID.prototype, 'key', {
+      enumerable: false,
+      configurable: true,
+      get: function () {
+         return this._key;
+      }
+   });
+   Object.defineProperty(b2ContactID.prototype, 'key', {
+      enumerable: false,
+      configurable: true,
+      set: function (value) {
+         if (value === undefined) value = 0;
+         this._key = value;
+         this.features._referenceEdge = this._key & 0x000000ff;
+         this.features._incidentEdge = ((this._key & 0x0000ff00) >> 8) & 0x000000ff;
+         this.features._incidentVertex = ((this._key & 0x00ff0000) >> 16) & 0x000000ff;
+         this.features._flip = ((this._key & 0xff000000) >> 24) & 0x000000ff;
+      }
+   });
+   b2ContactPoint.b2ContactPoint = function () {
+      this.position = new b2Vec2();
+      this.velocity = new b2Vec2();
+      this.normal = new b2Vec2();
+      this.id = new b2ContactID();
+   };
+   b2Distance.b2Distance = function () {};
+   b2Distance.Distance = function (output, cache, input) {
+      ++b2Distance.b2_gjkCalls;
+      var proxyA = input.proxyA;
+      var proxyB = input.proxyB;
+      var transformA = input.transformA;
+      var transformB = input.transformB;
+      var simplex = b2Distance.s_simplex;
+      simplex.ReadCache(cache, proxyA, transformA, proxyB, transformB);
+      var vertices = simplex.m_vertices;
+      var k_maxIters = 20;
+      var saveA = b2Distance.s_saveA;
+      var saveB = b2Distance.s_saveB;
+      var saveCount = 0;
+      var closestPoint = simplex.GetClosestPoint();
+      var distanceSqr1 = closestPoint.LengthSquared();
+      var distanceSqr2 = distanceSqr1;
+      var i = 0;
+      var p;
+      var iter = 0;
+      while (iter < k_maxIters) {
+         saveCount = simplex.m_count;
+         for (i = 0;
+         i < saveCount; i++) {
+            saveA[i] = vertices[i].indexA;
+            saveB[i] = vertices[i].indexB;
+         }
+         switch (simplex.m_count) {
+         case 1:
+            break;
+         case 2:
+            simplex.Solve2();
+            break;
+         case 3:
+            simplex.Solve3();
+            break;
+         default:
+            b2Settings.b2Assert(false);
+         }
+         if (simplex.m_count == 3) {
+            break;
+         }
+         p = simplex.GetClosestPoint();
+         distanceSqr2 = p.LengthSquared();
+         if (distanceSqr2 > distanceSqr1) {}
+         distanceSqr1 = distanceSqr2;
+         var d = simplex.GetSearchDirection();
+         if (d.LengthSquared() < Number.MIN_VALUE * Number.MIN_VALUE) {
+            break;
+         }
+         var vertex = vertices[simplex.m_count];
+         vertex.indexA = proxyA.GetSupport(b2Math.MulTMV(transformA.R, d.GetNegative()));
+         vertex.wA = b2Math.MulX(transformA, proxyA.GetVertex(vertex.indexA));
+         vertex.indexB = proxyB.GetSupport(b2Math.MulTMV(transformB.R, d));
+         vertex.wB = b2Math.MulX(transformB, proxyB.GetVertex(vertex.indexB));
+         vertex.w = b2Math.SubtractVV(vertex.wB, vertex.wA);
+         ++iter;
+         ++b2Distance.b2_gjkIters;
+         var duplicate = false;
+         for (i = 0;
+         i < saveCount; i++) {
+            if (vertex.indexA == saveA[i] && vertex.indexB == saveB[i]) {
+               duplicate = true;
+               break;
+            }
+         }
+         if (duplicate) {
+            break;
+         }++simplex.m_count;
+      }
+      b2Distance.b2_gjkMaxIters = b2Math.Max(b2Distance.b2_gjkMaxIters, iter);
+      simplex.GetWitnessPoints(output.pointA, output.pointB);
+      output.distance = b2Math.SubtractVV(output.pointA, output.pointB).Length();
+      output.iterations = iter;
+      simplex.WriteCache(cache);
+      if (input.useRadii) {
+         var rA = proxyA.m_radius;
+         var rB = proxyB.m_radius;
+         if (output.distance > rA + rB && output.distance > Number.MIN_VALUE) {
+            output.distance -= rA + rB;
+            var normal = b2Math.SubtractVV(output.pointB, output.pointA);
+            normal.Normalize();
+            output.pointA.x += rA * normal.x;
+            output.pointA.y += rA * normal.y;
+            output.pointB.x -= rB * normal.x;
+            output.pointB.y -= rB * normal.y;
+         }
+         else {
+            p = new b2Vec2();
+            p.x = .5 * (output.pointA.x + output.pointB.x);
+            p.y = .5 * (output.pointA.y + output.pointB.y);
+            output.pointA.x = output.pointB.x = p.x;
+            output.pointA.y = output.pointB.y = p.y;
+            output.distance = 0.0;
+         }
+      }
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Collision.b2Distance.s_simplex = new b2Simplex();
+      Box2D.Collision.b2Distance.s_saveA = new Vector_a2j_Number(3);
+      Box2D.Collision.b2Distance.s_saveB = new Vector_a2j_Number(3);
+   });
+   b2DistanceInput.b2DistanceInput = function () {};
+   b2DistanceOutput.b2DistanceOutput = function () {
+      this.pointA = new b2Vec2();
+      this.pointB = new b2Vec2();
+   };
+   b2DistanceProxy.b2DistanceProxy = function () {};
+   b2DistanceProxy.prototype.Set = function (shape) {
+      switch (shape.GetType()) {
+      case b2Shape.e_circleShape:
+         {
+            var circle = (shape instanceof b2CircleShape ? shape : null);
+            this.m_vertices = new Vector(1, true);
+            this.m_vertices[0] = circle.m_p;
+            this.m_count = 1;
+            this.m_radius = circle.m_radius;
+         }
+         break;
+      case b2Shape.e_polygonShape:
+         {
+            var polygon = (shape instanceof b2PolygonShape ? shape : null);
+            this.m_vertices = polygon.m_vertices;
+            this.m_count = polygon.m_vertexCount;
+            this.m_radius = polygon.m_radius;
+         }
+         break;
+      default:
+         b2Settings.b2Assert(false);
+      }
+   }
+   b2DistanceProxy.prototype.GetSupport = function (d) {
+      var bestIndex = 0;
+      var bestValue = this.m_vertices[0].x * d.x + this.m_vertices[0].y * d.y;
+      for (var i = 1; i < this.m_count; ++i) {
+         var value = this.m_vertices[i].x * d.x + this.m_vertices[i].y * d.y;
+         if (value > bestValue) {
+            bestIndex = i;
+            bestValue = value;
+         }
+      }
+      return bestIndex;
+   }
+   b2DistanceProxy.prototype.GetSupportVertex = function (d) {
+      var bestIndex = 0;
+      var bestValue = this.m_vertices[0].x * d.x + this.m_vertices[0].y * d.y;
+      for (var i = 1; i < this.m_count; ++i) {
+         var value = this.m_vertices[i].x * d.x + this.m_vertices[i].y * d.y;
+         if (value > bestValue) {
+            bestIndex = i;
+            bestValue = value;
+         }
+      }
+      return this.m_vertices[bestIndex];
+   }
+   b2DistanceProxy.prototype.GetVertexCount = function () {
+      return this.m_count;
+   }
+   b2DistanceProxy.prototype.GetVertex = function (index) {
+      if (index === undefined) index = 0;
+      b2Settings.b2Assert(0 <= index && index < this.m_count);
+      return this.m_vertices[index];
+   }
+   b2DynamicTree.b2DynamicTree = function () {};
+   b2DynamicTree.prototype.b2DynamicTree = function () {
+      this.m_root = null;
+      this.m_freeList = null;
+      this.m_path = 0;
+      this.m_insertionCount = 0;
+   }
+   b2DynamicTree.prototype.CreateProxy = function (aabb, userData) {
+      var node = this.AllocateNode();
+      var extendX = b2Settings.b2_aabbExtension;
+      var extendY = b2Settings.b2_aabbExtension;
+      node.aabb.lowerBound.x = aabb.lowerBound.x - extendX;
+      node.aabb.lowerBound.y = aabb.lowerBound.y - extendY;
+      node.aabb.upperBound.x = aabb.upperBound.x + extendX;
+      node.aabb.upperBound.y = aabb.upperBound.y + extendY;
+      node.userData = userData;
+      this.InsertLeaf(node);
+      return node;
+   }
+   b2DynamicTree.prototype.DestroyProxy = function (proxy) {
+      this.RemoveLeaf(proxy);
+      this.FreeNode(proxy);
+   }
+   b2DynamicTree.prototype.MoveProxy = function (proxy, aabb, displacement) {
+      b2Settings.b2Assert(proxy.IsLeaf());
+      if (proxy.aabb.Contains(aabb)) {
+         return false;
+      }
+      this.RemoveLeaf(proxy);
+      var extendX = b2Settings.b2_aabbExtension + b2Settings.b2_aabbMultiplier * (displacement.x > 0 ? displacement.x : (-displacement.x));
+      var extendY = b2Settings.b2_aabbExtension + b2Settings.b2_aabbMultiplier * (displacement.y > 0 ? displacement.y : (-displacement.y));
+      proxy.aabb.lowerBound.x = aabb.lowerBound.x - extendX;
+      proxy.aabb.lowerBound.y = aabb.lowerBound.y - extendY;
+      proxy.aabb.upperBound.x = aabb.upperBound.x + extendX;
+      proxy.aabb.upperBound.y = aabb.upperBound.y + extendY;
+      this.InsertLeaf(proxy);
+      return true;
+   }
+   b2DynamicTree.prototype.Rebalance = function (iterations) {
+      if (iterations === undefined) iterations = 0;
+      if (this.m_root == null) return;
+      for (var i = 0; i < iterations; i++) {
+         var node = this.m_root;
+         var bit = 0;
+         while (node.IsLeaf() == false) {
+            node = (this.m_path >> bit) & 1 ? node.child2 : node.child1;
+            bit = (bit + 1) & 31;
+         }++this.m_path;
+         this.RemoveLeaf(node);
+         this.InsertLeaf(node);
+      }
+   }
+   b2DynamicTree.prototype.GetFatAABB = function (proxy) {
+      return proxy.aabb;
+   }
+   b2DynamicTree.prototype.GetUserData = function (proxy) {
+      return proxy.userData;
+   }
+   b2DynamicTree.prototype.Query = function (callback, aabb) {
+      if (this.m_root == null) return;
+      var stack = new Vector();
+      var count = 0;
+      stack[count++] = this.m_root;
+      while (count > 0) {
+         var node = stack[--count];
+         if (node.aabb.TestOverlap(aabb)) {
+            if (node.IsLeaf()) {
+               var proceed = callback(node);
+               if (!proceed) return;
+            }
+            else {
+               stack[count++] = node.child1;
+               stack[count++] = node.child2;
+            }
+         }
+      }
+   }
+   b2DynamicTree.prototype.RayCast = function (callback, input) {
+      if (this.m_root == null) return;
+      var p1 = input.p1;
+      var p2 = input.p2;
+      var r = b2Math.SubtractVV(p1, p2);
+      r.Normalize();
+      var v = b2Math.CrossFV(1.0, r);
+      var abs_v = b2Math.AbsV(v);
+      var maxFraction = input.maxFraction;
+      var segmentAABB = new b2AABB();
+      var tX = 0;
+      var tY = 0; {
+         tX = p1.x + maxFraction * (p2.x - p1.x);
+         tY = p1.y + maxFraction * (p2.y - p1.y);
+         segmentAABB.lowerBound.x = Math.min(p1.x, tX);
+         segmentAABB.lowerBound.y = Math.min(p1.y, tY);
+         segmentAABB.upperBound.x = Math.max(p1.x, tX);
+         segmentAABB.upperBound.y = Math.max(p1.y, tY);
+      }
+      var stack = new Vector();
+      var count = 0;
+      stack[count++] = this.m_root;
+      while (count > 0) {
+         var node = stack[--count];
+         if (node.aabb.TestOverlap(segmentAABB) == false) {
+            continue;
+         }
+         var c = node.aabb.GetCenter();
+         var h = node.aabb.GetExtents();
+         var separation = Math.abs(v.x * (p1.x - c.x) + v.y * (p1.y - c.y)) - abs_v.x * h.x - abs_v.y * h.y;
+         if (separation > 0.0) continue;
+         if (node.IsLeaf()) {
+            var subInput = new b2RayCastInput();
+            subInput.p1 = input.p1;
+            subInput.p2 = input.p2;
+            subInput.maxFraction = input.maxFraction;
+            maxFraction = callback(subInput, node);
+            if (maxFraction == 0.0) return;
+            if (maxFraction > 0.0) {
+               tX = p1.x + maxFraction * (p2.x - p1.x);
+               tY = p1.y + maxFraction * (p2.y - p1.y);
+               segmentAABB.lowerBound.x = Math.min(p1.x, tX);
+               segmentAABB.lowerBound.y = Math.min(p1.y, tY);
+               segmentAABB.upperBound.x = Math.max(p1.x, tX);
+               segmentAABB.upperBound.y = Math.max(p1.y, tY);
+            }
+         }
+         else {
+            stack[count++] = node.child1;
+            stack[count++] = node.child2;
+         }
+      }
+   }
+   b2DynamicTree.prototype.AllocateNode = function () {
+      if (this.m_freeList) {
+         var node = this.m_freeList;
+         this.m_freeList = node.parent;
+         node.parent = null;
+         node.child1 = null;
+         node.child2 = null;
+         return node;
+      }
+      return new b2DynamicTreeNode();
+   }
+   b2DynamicTree.prototype.FreeNode = function (node) {
+      node.parent = this.m_freeList;
+      this.m_freeList = node;
+   }
+   b2DynamicTree.prototype.InsertLeaf = function (leaf) {
+      ++this.m_insertionCount;
+      if (this.m_root == null) {
+         this.m_root = leaf;
+         this.m_root.parent = null;
+         return;
+      }
+      var center = leaf.aabb.GetCenter();
+      var sibling = this.m_root;
+      if (sibling.IsLeaf() == false) {
+         do {
+            var child1 = sibling.child1;
+            var child2 = sibling.child2;
+            var norm1 = Math.abs((child1.aabb.lowerBound.x + child1.aabb.upperBound.x) / 2 - center.x) + Math.abs((child1.aabb.lowerBound.y + child1.aabb.upperBound.y) / 2 - center.y);
+            var norm2 = Math.abs((child2.aabb.lowerBound.x + child2.aabb.upperBound.x) / 2 - center.x) + Math.abs((child2.aabb.lowerBound.y + child2.aabb.upperBound.y) / 2 - center.y);
+            if (norm1 < norm2) {
+               sibling = child1;
+            }
+            else {
+               sibling = child2;
+            }
+         }
+         while (sibling.IsLeaf() == false)
+      }
+      var node1 = sibling.parent;
+      var node2 = this.AllocateNode();
+      node2.parent = node1;
+      node2.userData = null;
+      node2.aabb.Combine(leaf.aabb, sibling.aabb);
+      if (node1) {
+         if (sibling.parent.child1 == sibling) {
+            node1.child1 = node2;
+         }
+         else {
+            node1.child2 = node2;
+         }
+         node2.child1 = sibling;
+         node2.child2 = leaf;
+         sibling.parent = node2;
+         leaf.parent = node2;
+         do {
+            if (node1.aabb.Contains(node2.aabb)) break;
+            node1.aabb.Combine(node1.child1.aabb, node1.child2.aabb);
+            node2 = node1;
+            node1 = node1.parent;
+         }
+         while (node1)
+      }
+      else {
+         node2.child1 = sibling;
+         node2.child2 = leaf;
+         sibling.parent = node2;
+         leaf.parent = node2;
+         this.m_root = node2;
+      }
+   }
+   b2DynamicTree.prototype.RemoveLeaf = function (leaf) {
+      if (leaf == this.m_root) {
+         this.m_root = null;
+         return;
+      }
+      var node2 = leaf.parent;
+      var node1 = node2.parent;
+      var sibling;
+      if (node2.child1 == leaf) {
+         sibling = node2.child2;
+      }
+      else {
+         sibling = node2.child1;
+      }
+      if (node1) {
+         if (node1.child1 == node2) {
+            node1.child1 = sibling;
+         }
+         else {
+            node1.child2 = sibling;
+         }
+         sibling.parent = node1;
+         this.FreeNode(node2);
+         while (node1) {
+            var oldAABB = node1.aabb;
+            node1.aabb = b2AABB.Combine(node1.child1.aabb, node1.child2.aabb);
+            if (oldAABB.Contains(node1.aabb)) break;
+            node1 = node1.parent;
+         }
+      }
+      else {
+         this.m_root = sibling;
+         sibling.parent = null;
+         this.FreeNode(node2);
+      }
+   }
+   b2DynamicTreeBroadPhase.b2DynamicTreeBroadPhase = function () {
+      this.m_tree = new b2DynamicTree();
+      this.m_moveBuffer = new Vector();
+      this.m_pairBuffer = new Vector();
+      this.m_pairCount = 0;
+   };
+   b2DynamicTreeBroadPhase.prototype.CreateProxy = function (aabb, userData) {
+      var proxy = this.m_tree.CreateProxy(aabb, userData);
+      ++this.m_proxyCount;
+      this.BufferMove(proxy);
+      return proxy;
+   }
+   b2DynamicTreeBroadPhase.prototype.DestroyProxy = function (proxy) {
+      this.UnBufferMove(proxy);
+      --this.m_proxyCount;
+      this.m_tree.DestroyProxy(proxy);
+   }
+   b2DynamicTreeBroadPhase.prototype.MoveProxy = function (proxy, aabb, displacement) {
+      var buffer = this.m_tree.MoveProxy(proxy, aabb, displacement);
+      if (buffer) {
+         this.BufferMove(proxy);
+      }
+   }
+   b2DynamicTreeBroadPhase.prototype.TestOverlap = function (proxyA, proxyB) {
+      var aabbA = this.m_tree.GetFatAABB(proxyA);
+      var aabbB = this.m_tree.GetFatAABB(proxyB);
+      return aabbA.TestOverlap(aabbB);
+   }
+   b2DynamicTreeBroadPhase.prototype.GetUserData = function (proxy) {
+      return this.m_tree.GetUserData(proxy);
+   }
+   b2DynamicTreeBroadPhase.prototype.GetFatAABB = function (proxy) {
+      return this.m_tree.GetFatAABB(proxy);
+   }
+   b2DynamicTreeBroadPhase.prototype.GetProxyCount = function () {
+      return this.m_proxyCount;
+   }
+   b2DynamicTreeBroadPhase.prototype.UpdatePairs = function (callback) {
+      var __this = this;
+      __this.m_pairCount = 0;
+      var i = 0,
+         queryProxy;
+      for (i = 0;
+      i < __this.m_moveBuffer.length; ++i) {
+         queryProxy = __this.m_moveBuffer[i];
+
+         function QueryCallback(proxy) {
+            if (proxy == queryProxy) return true;
+            if (__this.m_pairCount == __this.m_pairBuffer.length) {
+               __this.m_pairBuffer[__this.m_pairCount] = new b2DynamicTreePair();
+            }
+            var pair = __this.m_pairBuffer[__this.m_pairCount];
+            pair.proxyA = proxy < queryProxy ? proxy : queryProxy;
+            pair.proxyB = proxy >= queryProxy ? proxy : queryProxy;++__this.m_pairCount;
+            return true;
+         };
+         var fatAABB = __this.m_tree.GetFatAABB(queryProxy);
+         __this.m_tree.Query(QueryCallback, fatAABB);
+      }
+      __this.m_moveBuffer.length = 0;
+      for (var i = 0; i < __this.m_pairCount;) {
+         var primaryPair = __this.m_pairBuffer[i];
+         var userDataA = __this.m_tree.GetUserData(primaryPair.proxyA);
+         var userDataB = __this.m_tree.GetUserData(primaryPair.proxyB);
+         callback(userDataA, userDataB);
+         ++i;
+         while (i < __this.m_pairCount) {
+            var pair = __this.m_pairBuffer[i];
+            if (pair.proxyA != primaryPair.proxyA || pair.proxyB != primaryPair.proxyB) {
+               break;
+            }++i;
+         }
+      }
+   }
+   b2DynamicTreeBroadPhase.prototype.Query = function (callback, aabb) {
+      this.m_tree.Query(callback, aabb);
+   }
+   b2DynamicTreeBroadPhase.prototype.RayCast = function (callback, input) {
+      this.m_tree.RayCast(callback, input);
+   }
+   b2DynamicTreeBroadPhase.prototype.Validate = function () {}
+   b2DynamicTreeBroadPhase.prototype.Rebalance = function (iterations) {
+      if (iterations === undefined) iterations = 0;
+      this.m_tree.Rebalance(iterations);
+   }
+   b2DynamicTreeBroadPhase.prototype.BufferMove = function (proxy) {
+      this.m_moveBuffer[this.m_moveBuffer.length] = proxy;
+   }
+   b2DynamicTreeBroadPhase.prototype.UnBufferMove = function (proxy) {
+      var i = parseInt(this.m_moveBuffer.indexOf(proxy));
+      this.m_moveBuffer.splice(i, 1);
+   }
+   b2DynamicTreeBroadPhase.prototype.ComparePairs = function (pair1, pair2) {
+      return 0;
+   }
+   b2DynamicTreeBroadPhase.__implements = {};
+   b2DynamicTreeBroadPhase.__implements[IBroadPhase] = true;
+   b2DynamicTreeNode.b2DynamicTreeNode = function () {
+      this.aabb = new b2AABB();
+   };
+   b2DynamicTreeNode.prototype.IsLeaf = function () {
+      return this.child1 == null;
+   }
+   b2DynamicTreePair.b2DynamicTreePair = function () {};
+   b2Manifold.b2Manifold = function () {
+      this.m_pointCount = 0;
+   };
+   b2Manifold.prototype.b2Manifold = function () {
+      this.m_points = new Vector(b2Settings.b2_maxManifoldPoints);
+      for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++) {
+         this.m_points[i] = new b2ManifoldPoint();
+      }
+      this.m_localPlaneNormal = new b2Vec2();
+      this.m_localPoint = new b2Vec2();
+   }
+   b2Manifold.prototype.Reset = function () {
+      for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++) {
+         ((this.m_points[i] instanceof b2ManifoldPoint ? this.m_points[i] : null)).Reset();
+      }
+      this.m_localPlaneNormal.SetZero();
+      this.m_localPoint.SetZero();
+      this.m_type = 0;
+      this.m_pointCount = 0;
+   }
+   b2Manifold.prototype.Set = function (m) {
+      this.m_pointCount = m.m_pointCount;
+      for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++) {
+         ((this.m_points[i] instanceof b2ManifoldPoint ? this.m_points[i] : null)).Set(m.m_points[i]);
+      }
+      this.m_localPlaneNormal.SetV(m.m_localPlaneNormal);
+      this.m_localPoint.SetV(m.m_localPoint);
+      this.m_type = m.m_type;
+   }
+   b2Manifold.prototype.Copy = function () {
+      var copy = new b2Manifold();
+      copy.Set(this);
+      return copy;
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Collision.b2Manifold.e_circles = 0x0001;
+      Box2D.Collision.b2Manifold.e_faceA = 0x0002;
+      Box2D.Collision.b2Manifold.e_faceB = 0x0004;
+   });
+   b2ManifoldPoint.b2ManifoldPoint = function () {
+      this.m_localPoint = new b2Vec2();
+      this.m_id = new b2ContactID();
+   };
+   b2ManifoldPoint.prototype.b2ManifoldPoint = function () {
+      this.Reset();
+   }
+   b2ManifoldPoint.prototype.Reset = function () {
+      this.m_localPoint.SetZero();
+      this.m_normalImpulse = 0.0;
+      this.m_tangentImpulse = 0.0;
+      this.m_id.key = 0;
+   }
+   b2ManifoldPoint.prototype.Set = function (m) {
+      this.m_localPoint.SetV(m.m_localPoint);
+      this.m_normalImpulse = m.m_normalImpulse;
+      this.m_tangentImpulse = m.m_tangentImpulse;
+      this.m_id.Set(m.m_id);
+   }
+   b2Point.b2Point = function () {
+      this.p = new b2Vec2();
+   };
+   b2Point.prototype.Support = function (xf, vX, vY) {
+      if (vX === undefined) vX = 0;
+      if (vY === undefined) vY = 0;
+      return this.p;
+   }
+   b2Point.prototype.GetFirstVertex = function (xf) {
+      return this.p;
+   }
+   b2RayCastInput.b2RayCastInput = function () {
+      this.p1 = new b2Vec2();
+      this.p2 = new b2Vec2();
+   };
+   b2RayCastInput.prototype.b2RayCastInput = function (p1, p2, maxFraction) {
+      if (p1 === undefined) p1 = null;
+      if (p2 === undefined) p2 = null;
+      if (maxFraction === undefined) maxFraction = 1;
+      if (p1) this.p1.SetV(p1);
+      if (p2) this.p2.SetV(p2);
+      this.maxFraction = maxFraction;
+   }
+   b2RayCastOutput.b2RayCastOutput = function () {
+      this.normal = new b2Vec2();
+   };
+   b2Segment.b2Segment = function () {
+      this.p1 = new b2Vec2();
+      this.p2 = new b2Vec2();
+   };
+   b2Segment.prototype.TestSegment = function (lambda, normal, segment, maxLambda) {
+      if (maxLambda === undefined) maxLambda = 0;
+      var s = segment.p1;
+      var rX = segment.p2.x - s.x;
+      var rY = segment.p2.y - s.y;
+      var dX = this.p2.x - this.p1.x;
+      var dY = this.p2.y - this.p1.y;
+      var nX = dY;
+      var nY = (-dX);
+      var k_slop = 100.0 * Number.MIN_VALUE;
+      var denom = (-(rX * nX + rY * nY));
+      if (denom > k_slop) {
+         var bX = s.x - this.p1.x;
+         var bY = s.y - this.p1.y;
+         var a = (bX * nX + bY * nY);
+         if (0.0 <= a && a <= maxLambda * denom) {
+            var mu2 = (-rX * bY) + rY * bX;
+            if ((-k_slop * denom) <= mu2 && mu2 <= denom * (1.0 + k_slop)) {
+               a /= denom;
+               var nLen = Math.sqrt(nX * nX + nY * nY);
+               nX /= nLen;
+               nY /= nLen;
+               lambda[0] = a;
+               normal.Set(nX, nY);
+               return true;
+            }
+         }
+      }
+      return false;
+   }
+   b2Segment.prototype.Extend = function (aabb) {
+      this.ExtendForward(aabb);
+      this.ExtendBackward(aabb);
+   }
+   b2Segment.prototype.ExtendForward = function (aabb) {
+      var dX = this.p2.x - this.p1.x;
+      var dY = this.p2.y - this.p1.y;
+      var lambda = Math.min(dX > 0 ? (aabb.upperBound.x - this.p1.x) / dX : dX < 0 ? (aabb.lowerBound.x - this.p1.x) / dX : Number.POSITIVE_INFINITY,
+      dY > 0 ? (aabb.upperBound.y - this.p1.y) / dY : dY < 0 ? (aabb.lowerBound.y - this.p1.y) / dY : Number.POSITIVE_INFINITY);
+      this.p2.x = this.p1.x + dX * lambda;
+      this.p2.y = this.p1.y + dY * lambda;
+   }
+   b2Segment.prototype.ExtendBackward = function (aabb) {
+      var dX = (-this.p2.x) + this.p1.x;
+      var dY = (-this.p2.y) + this.p1.y;
+      var lambda = Math.min(dX > 0 ? (aabb.upperBound.x - this.p2.x) / dX : dX < 0 ? (aabb.lowerBound.x - this.p2.x) / dX : Number.POSITIVE_INFINITY,
+      dY > 0 ? (aabb.upperBound.y - this.p2.y) / dY : dY < 0 ? (aabb.lowerBound.y - this.p2.y) / dY : Number.POSITIVE_INFINITY);
+      this.p1.x = this.p2.x + dX * lambda;
+      this.p1.y = this.p2.y + dY * lambda;
+   }
+   b2SeparationFunction.b2SeparationFunction = function () {
+      this.m_localPoint = new b2Vec2();
+      this.m_axis = new b2Vec2();
+   };
+   b2SeparationFunction.prototype.Initialize = function (cache, proxyA, transformA, proxyB, transformB) {
+      this.m_proxyA = proxyA;
+      this.m_proxyB = proxyB;
+      var count = parseInt(cache.count);
+      b2Settings.b2Assert(0 < count && count < 3);
+      var localPointA;
+      var localPointA1;
+      var localPointA2;
+      var localPointB;
+      var localPointB1;
+      var localPointB2;
+      var pointAX = 0;
+      var pointAY = 0;
+      var pointBX = 0;
+      var pointBY = 0;
+      var normalX = 0;
+      var normalY = 0;
+      var tMat;
+      var tVec;
+      var s = 0;
+      var sgn = 0;
+      if (count == 1) {
+         this.m_type = b2SeparationFunction.e_points;
+         localPointA = this.m_proxyA.GetVertex(cache.indexA[0]);
+         localPointB = this.m_proxyB.GetVertex(cache.indexB[0]);
+         tVec = localPointA;
+         tMat = transformA.R;
+         pointAX = transformA.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+         pointAY = transformA.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+         tVec = localPointB;
+         tMat = transformB.R;
+         pointBX = transformB.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+         pointBY = transformB.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+         this.m_axis.x = pointBX - pointAX;
+         this.m_axis.y = pointBY - pointAY;
+         this.m_axis.Normalize();
+      }
+      else if (cache.indexB[0] == cache.indexB[1]) {
+         this.m_type = b2SeparationFunction.e_faceA;
+         localPointA1 = this.m_proxyA.GetVertex(cache.indexA[0]);
+         localPointA2 = this.m_proxyA.GetVertex(cache.indexA[1]);
+         localPointB = this.m_proxyB.GetVertex(cache.indexB[0]);
+         this.m_localPoint.x = 0.5 * (localPointA1.x + localPointA2.x);
+         this.m_localPoint.y = 0.5 * (localPointA1.y + localPointA2.y);
+         this.m_axis = b2Math.CrossVF(b2Math.SubtractVV(localPointA2, localPointA1), 1.0);
+         this.m_axis.Normalize();
+         tVec = this.m_axis;
+         tMat = transformA.R;
+         normalX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+         normalY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+         tVec = this.m_localPoint;
+         tMat = transformA.R;
+         pointAX = transformA.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+         pointAY = transformA.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+         tVec = localPointB;
+         tMat = transformB.R;
+         pointBX = transformB.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+         pointBY = transformB.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+         s = (pointBX - pointAX) * normalX + (pointBY - pointAY) * normalY;
+         if (s < 0.0) {
+            this.m_axis.NegativeSelf();
+         }
+      }
+      else if (cache.indexA[0] == cache.indexA[0]) {
+         this.m_type = b2SeparationFunction.e_faceB;
+         localPointB1 = this.m_proxyB.GetVertex(cache.indexB[0]);
+         localPointB2 = this.m_proxyB.GetVertex(cache.indexB[1]);
+         localPointA = this.m_proxyA.GetVertex(cache.indexA[0]);
+         this.m_localPoint.x = 0.5 * (localPointB1.x + localPointB2.x);
+         this.m_localPoint.y = 0.5 * (localPointB1.y + localPointB2.y);
+         this.m_axis = b2Math.CrossVF(b2Math.SubtractVV(localPointB2, localPointB1), 1.0);
+         this.m_axis.Normalize();
+         tVec = this.m_axis;
+         tMat = transformB.R;
+         normalX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+         normalY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+         tVec = this.m_localPoint;
+         tMat = transformB.R;
+         pointBX = transformB.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+         pointBY = transformB.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+         tVec = localPointA;
+         tMat = transformA.R;
+         pointAX = transformA.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+         pointAY = transformA.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+         s = (pointAX - pointBX) * normalX + (pointAY - pointBY) * normalY;
+         if (s < 0.0) {
+            this.m_axis.NegativeSelf();
+         }
+      }
+      else {
+         localPointA1 = this.m_proxyA.GetVertex(cache.indexA[0]);
+         localPointA2 = this.m_proxyA.GetVertex(cache.indexA[1]);
+         localPointB1 = this.m_proxyB.GetVertex(cache.indexB[0]);
+         localPointB2 = this.m_proxyB.GetVertex(cache.indexB[1]);
+         var pA = b2Math.MulX(transformA, localPointA);
+         var dA = b2Math.MulMV(transformA.R, b2Math.SubtractVV(localPointA2, localPointA1));
+         var pB = b2Math.MulX(transformB, localPointB);
+         var dB = b2Math.MulMV(transformB.R, b2Math.SubtractVV(localPointB2, localPointB1));
+         var a = dA.x * dA.x + dA.y * dA.y;
+         var e = dB.x * dB.x + dB.y * dB.y;
+         var r = b2Math.SubtractVV(dB, dA);
+         var c = dA.x * r.x + dA.y * r.y;
+         var f = dB.x * r.x + dB.y * r.y;
+         var b = dA.x * dB.x + dA.y * dB.y;
+         var denom = a * e - b * b;
+         s = 0.0;
+         if (denom != 0.0) {
+            s = b2Math.Clamp((b * f - c * e) / denom, 0.0, 1.0);
+         }
+         var t = (b * s + f) / e;
+         if (t < 0.0) {
+            t = 0.0;
+            s = b2Math.Clamp((b - c) / a, 0.0, 1.0);
+         }
+         localPointA = new b2Vec2();
+         localPointA.x = localPointA1.x + s * (localPointA2.x - localPointA1.x);
+         localPointA.y = localPointA1.y + s * (localPointA2.y - localPointA1.y);
+         localPointB = new b2Vec2();
+         localPointB.x = localPointB1.x + s * (localPointB2.x - localPointB1.x);
+         localPointB.y = localPointB1.y + s * (localPointB2.y - localPointB1.y);
+         if (s == 0.0 || s == 1.0) {
+            this.m_type = b2SeparationFunction.e_faceB;
+            this.m_axis = b2Math.CrossVF(b2Math.SubtractVV(localPointB2, localPointB1), 1.0);
+            this.m_axis.Normalize();
+            this.m_localPoint = localPointB;
+            tVec = this.m_axis;
+            tMat = transformB.R;
+            normalX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+            normalY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+            tVec = this.m_localPoint;
+            tMat = transformB.R;
+            pointBX = transformB.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+            pointBY = transformB.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+            tVec = localPointA;
+            tMat = transformA.R;
+            pointAX = transformA.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+            pointAY = transformA.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+            sgn = (pointAX - pointBX) * normalX + (pointAY - pointBY) * normalY;
+            if (s < 0.0) {
+               this.m_axis.NegativeSelf();
+            }
+         }
+         else {
+            this.m_type = b2SeparationFunction.e_faceA;
+            this.m_axis = b2Math.CrossVF(b2Math.SubtractVV(localPointA2, localPointA1), 1.0);
+            this.m_localPoint = localPointA;
+            tVec = this.m_axis;
+            tMat = transformA.R;
+            normalX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+            normalY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+            tVec = this.m_localPoint;
+            tMat = transformA.R;
+            pointAX = transformA.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+            pointAY = transformA.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+            tVec = localPointB;
+            tMat = transformB.R;
+            pointBX = transformB.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+            pointBY = transformB.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+            sgn = (pointBX - pointAX) * normalX + (pointBY - pointAY) * normalY;
+            if (s < 0.0) {
+               this.m_axis.NegativeSelf();
+            }
+         }
+      }
+   }
+   b2SeparationFunction.prototype.Evaluate = function (transformA, transformB) {
+      var axisA;
+      var axisB;
+      var localPointA;
+      var localPointB;
+      var pointA;
+      var pointB;
+      var seperation = 0;
+      var normal;
+      switch (this.m_type) {
+      case b2SeparationFunction.e_points:
+         {
+            axisA = b2Math.MulTMV(transformA.R, this.m_axis);
+            axisB = b2Math.MulTMV(transformB.R, this.m_axis.GetNegative());
+            localPointA = this.m_proxyA.GetSupportVertex(axisA);
+            localPointB = this.m_proxyB.GetSupportVertex(axisB);
+            pointA = b2Math.MulX(transformA, localPointA);
+            pointB = b2Math.MulX(transformB, localPointB);
+            seperation = (pointB.x - pointA.x) * this.m_axis.x + (pointB.y - pointA.y) * this.m_axis.y;
+            return seperation;
+         }
+      case b2SeparationFunction.e_faceA:
+         {
+            normal = b2Math.MulMV(transformA.R, this.m_axis);
+            pointA = b2Math.MulX(transformA, this.m_localPoint);
+            axisB = b2Math.MulTMV(transformB.R, normal.GetNegative());
+            localPointB = this.m_proxyB.GetSupportVertex(axisB);
+            pointB = b2Math.MulX(transformB, localPointB);
+            seperation = (pointB.x - pointA.x) * normal.x + (pointB.y - pointA.y) * normal.y;
+            return seperation;
+         }
+      case b2SeparationFunction.e_faceB:
+         {
+            normal = b2Math.MulMV(transformB.R, this.m_axis);
+            pointB = b2Math.MulX(transformB, this.m_localPoint);
+            axisA = b2Math.MulTMV(transformA.R, normal.GetNegative());
+            localPointA = this.m_proxyA.GetSupportVertex(axisA);
+            pointA = b2Math.MulX(transformA, localPointA);
+            seperation = (pointA.x - pointB.x) * normal.x + (pointA.y - pointB.y) * normal.y;
+            return seperation;
+         }
+      default:
+         b2Settings.b2Assert(false);
+         return 0.0;
+      }
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Collision.b2SeparationFunction.e_points = 0x01;
+      Box2D.Collision.b2SeparationFunction.e_faceA = 0x02;
+      Box2D.Collision.b2SeparationFunction.e_faceB = 0x04;
+   });
+   b2Simplex.b2Simplex = function () {
+      this.m_v1 = new b2SimplexVertex();
+      this.m_v2 = new b2SimplexVertex();
+      this.m_v3 = new b2SimplexVertex();
+      this.m_vertices = new Vector(3);
+   };
+   b2Simplex.prototype.b2Simplex = function () {
+      this.m_vertices[0] = this.m_v1;
+      this.m_vertices[1] = this.m_v2;
+      this.m_vertices[2] = this.m_v3;
+   }
+   b2Simplex.prototype.ReadCache = function (cache, proxyA, transformA, proxyB, transformB) {
+      b2Settings.b2Assert(0 <= cache.count && cache.count <= 3);
+      var wALocal;
+      var wBLocal;
+      this.m_count = cache.count;
+      var vertices = this.m_vertices;
+      for (var i = 0; i < this.m_count; i++) {
+         var v = vertices[i];
+         v.indexA = cache.indexA[i];
+         v.indexB = cache.indexB[i];
+         wALocal = proxyA.GetVertex(v.indexA);
+         wBLocal = proxyB.GetVertex(v.indexB);
+         v.wA = b2Math.MulX(transformA, wALocal);
+         v.wB = b2Math.MulX(transformB, wBLocal);
+         v.w = b2Math.SubtractVV(v.wB, v.wA);
+         v.a = 0;
+      }
+      if (this.m_count > 1) {
+         var metric1 = cache.metric;
+         var metric2 = this.GetMetric();
+         if (metric2 < .5 * metric1 || 2.0 * metric1 < metric2 || metric2 < Number.MIN_VALUE) {
+            this.m_count = 0;
+         }
+      }
+      if (this.m_count == 0) {
+         v = vertices[0];
+         v.indexA = 0;
+         v.indexB = 0;
+         wALocal = proxyA.GetVertex(0);
+         wBLocal = proxyB.GetVertex(0);
+         v.wA = b2Math.MulX(transformA, wALocal);
+         v.wB = b2Math.MulX(transformB, wBLocal);
+         v.w = b2Math.SubtractVV(v.wB, v.wA);
+         this.m_count = 1;
+      }
+   }
+   b2Simplex.prototype.WriteCache = function (cache) {
+      cache.metric = this.GetMetric();
+      cache.count = Box2D.parseUInt(this.m_count);
+      var vertices = this.m_vertices;
+      for (var i = 0; i < this.m_count; i++) {
+         cache.indexA[i] = Box2D.parseUInt(vertices[i].indexA);
+         cache.indexB[i] = Box2D.parseUInt(vertices[i].indexB);
+      }
+   }
+   b2Simplex.prototype.GetSearchDirection = function () {
+      switch (this.m_count) {
+      case 1:
+         return this.m_v1.w.GetNegative();
+      case 2:
+         {
+            var e12 = b2Math.SubtractVV(this.m_v2.w, this.m_v1.w);
+            var sgn = b2Math.CrossVV(e12, this.m_v1.w.GetNegative());
+            if (sgn > 0.0) {
+               return b2Math.CrossFV(1.0, e12);
+            }
+            else {
+               return b2Math.CrossVF(e12, 1.0);
+            }
+         }
+      default:
+         b2Settings.b2Assert(false);
+         return new b2Vec2();
+      }
+   }
+   b2Simplex.prototype.GetClosestPoint = function () {
+      switch (this.m_count) {
+      case 0:
+         b2Settings.b2Assert(false);
+         return new b2Vec2();
+      case 1:
+         return this.m_v1.w;
+      case 2:
+         return new b2Vec2(this.m_v1.a * this.m_v1.w.x + this.m_v2.a * this.m_v2.w.x, this.m_v1.a * this.m_v1.w.y + this.m_v2.a * this.m_v2.w.y);
+      default:
+         b2Settings.b2Assert(false);
+         return new b2Vec2();
+      }
+   }
+   b2Simplex.prototype.GetWitnessPoints = function (pA, pB) {
+      switch (this.m_count) {
+      case 0:
+         b2Settings.b2Assert(false);
+         break;
+      case 1:
+         pA.SetV(this.m_v1.wA);
+         pB.SetV(this.m_v1.wB);
+         break;
+      case 2:
+         pA.x = this.m_v1.a * this.m_v1.wA.x + this.m_v2.a * this.m_v2.wA.x;
+         pA.y = this.m_v1.a * this.m_v1.wA.y + this.m_v2.a * this.m_v2.wA.y;
+         pB.x = this.m_v1.a * this.m_v1.wB.x + this.m_v2.a * this.m_v2.wB.x;
+         pB.y = this.m_v1.a * this.m_v1.wB.y + this.m_v2.a * this.m_v2.wB.y;
+         break;
+      case 3:
+         pB.x = pA.x = this.m_v1.a * this.m_v1.wA.x + this.m_v2.a * this.m_v2.wA.x + this.m_v3.a * this.m_v3.wA.x;
+         pB.y = pA.y = this.m_v1.a * this.m_v1.wA.y + this.m_v2.a * this.m_v2.wA.y + this.m_v3.a * this.m_v3.wA.y;
+         break;
+      default:
+         b2Settings.b2Assert(false);
+         break;
+      }
+   }
+   b2Simplex.prototype.GetMetric = function () {
+      switch (this.m_count) {
+      case 0:
+         b2Settings.b2Assert(false);
+         return 0.0;
+      case 1:
+         return 0.0;
+      case 2:
+         return b2Math.SubtractVV(this.m_v1.w, this.m_v2.w).Length();
+      case 3:
+         return b2Math.CrossVV(b2Math.SubtractVV(this.m_v2.w, this.m_v1.w), b2Math.SubtractVV(this.m_v3.w, this.m_v1.w));
+      default:
+         b2Settings.b2Assert(false);
+         return 0.0;
+      }
+   }
+   b2Simplex.prototype.Solve2 = function () {
+      var w1 = this.m_v1.w;
+      var w2 = this.m_v2.w;
+      var e12 = b2Math.SubtractVV(w2, w1);
+      var d12_2 = (-(w1.x * e12.x + w1.y * e12.y));
+      if (d12_2 <= 0.0) {
+         this.m_v1.a = 1.0;
+         this.m_count = 1;
+         return;
+      }
+      var d12_1 = (w2.x * e12.x + w2.y * e12.y);
+      if (d12_1 <= 0.0) {
+         this.m_v2.a = 1.0;
+         this.m_count = 1;
+         this.m_v1.Set(this.m_v2);
+         return;
+      }
+      var inv_d12 = 1.0 / (d12_1 + d12_2);
+      this.m_v1.a = d12_1 * inv_d12;
+      this.m_v2.a = d12_2 * inv_d12;
+      this.m_count = 2;
+   }
+   b2Simplex.prototype.Solve3 = function () {
+      var w1 = this.m_v1.w;
+      var w2 = this.m_v2.w;
+      var w3 = this.m_v3.w;
+      var e12 = b2Math.SubtractVV(w2, w1);
+      var w1e12 = b2Math.Dot(w1, e12);
+      var w2e12 = b2Math.Dot(w2, e12);
+      var d12_1 = w2e12;
+      var d12_2 = (-w1e12);
+      var e13 = b2Math.SubtractVV(w3, w1);
+      var w1e13 = b2Math.Dot(w1, e13);
+      var w3e13 = b2Math.Dot(w3, e13);
+      var d13_1 = w3e13;
+      var d13_2 = (-w1e13);
+      var e23 = b2Math.SubtractVV(w3, w2);
+      var w2e23 = b2Math.Dot(w2, e23);
+      var w3e23 = b2Math.Dot(w3, e23);
+      var d23_1 = w3e23;
+      var d23_2 = (-w2e23);
+      var n123 = b2Math.CrossVV(e12, e13);
+      var d123_1 = n123 * b2Math.CrossVV(w2, w3);
+      var d123_2 = n123 * b2Math.CrossVV(w3, w1);
+      var d123_3 = n123 * b2Math.CrossVV(w1, w2);
+      if (d12_2 <= 0.0 && d13_2 <= 0.0) {
+         this.m_v1.a = 1.0;
+         this.m_count = 1;
+         return;
+      }
+      if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) {
+         var inv_d12 = 1.0 / (d12_1 + d12_2);
+         this.m_v1.a = d12_1 * inv_d12;
+         this.m_v2.a = d12_2 * inv_d12;
+         this.m_count = 2;
+         return;
+      }
+      if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) {
+         var inv_d13 = 1.0 / (d13_1 + d13_2);
+         this.m_v1.a = d13_1 * inv_d13;
+         this.m_v3.a = d13_2 * inv_d13;
+         this.m_count = 2;
+         this.m_v2.Set(this.m_v3);
+         return;
+      }
+      if (d12_1 <= 0.0 && d23_2 <= 0.0) {
+         this.m_v2.a = 1.0;
+         this.m_count = 1;
+         this.m_v1.Set(this.m_v2);
+         return;
+      }
+      if (d13_1 <= 0.0 && d23_1 <= 0.0) {
+         this.m_v3.a = 1.0;
+         this.m_count = 1;
+         this.m_v1.Set(this.m_v3);
+         return;
+      }
+      if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) {
+         var inv_d23 = 1.0 / (d23_1 + d23_2);
+         this.m_v2.a = d23_1 * inv_d23;
+         this.m_v3.a = d23_2 * inv_d23;
+         this.m_count = 2;
+         this.m_v1.Set(this.m_v3);
+         return;
+      }
+      var inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3);
+      this.m_v1.a = d123_1 * inv_d123;
+      this.m_v2.a = d123_2 * inv_d123;
+      this.m_v3.a = d123_3 * inv_d123;
+      this.m_count = 3;
+   }
+   b2SimplexCache.b2SimplexCache = function () {
+      this.indexA = new Vector_a2j_Number(3);
+      this.indexB = new Vector_a2j_Number(3);
+   };
+   b2SimplexVertex.b2SimplexVertex = function () {};
+   b2SimplexVertex.prototype.Set = function (other) {
+      this.wA.SetV(other.wA);
+      this.wB.SetV(other.wB);
+      this.w.SetV(other.w);
+      this.a = other.a;
+      this.indexA = other.indexA;
+      this.indexB = other.indexB;
+   }
+   b2TimeOfImpact.b2TimeOfImpact = function () {};
+   b2TimeOfImpact.TimeOfImpact = function (input) {
+      ++b2TimeOfImpact.b2_toiCalls;
+      var proxyA = input.proxyA;
+      var proxyB = input.proxyB;
+      var sweepA = input.sweepA;
+      var sweepB = input.sweepB;
+      b2Settings.b2Assert(sweepA.t0 == sweepB.t0);
+      b2Settings.b2Assert(1.0 - sweepA.t0 > Number.MIN_VALUE);
+      var radius = proxyA.m_radius + proxyB.m_radius;
+      var tolerance = input.tolerance;
+      var alpha = 0.0;
+      var k_maxIterations = 1000;
+      var iter = 0;
+      var target = 0.0;
+      b2TimeOfImpact.s_cache.count = 0;
+      b2TimeOfImpact.s_distanceInput.useRadii = false;
+      for (;;) {
+         sweepA.GetTransform(b2TimeOfImpact.s_xfA, alpha);
+         sweepB.GetTransform(b2TimeOfImpact.s_xfB, alpha);
+         b2TimeOfImpact.s_distanceInput.proxyA = proxyA;
+         b2TimeOfImpact.s_distanceInput.proxyB = proxyB;
+         b2TimeOfImpact.s_distanceInput.transformA = b2TimeOfImpact.s_xfA;
+         b2TimeOfImpact.s_distanceInput.transformB = b2TimeOfImpact.s_xfB;
+         b2Distance.Distance(b2TimeOfImpact.s_distanceOutput, b2TimeOfImpact.s_cache, b2TimeOfImpact.s_distanceInput);
+         if (b2TimeOfImpact.s_distanceOutput.distance <= 0.0) {
+            alpha = 1.0;
+            break;
+         }
+         b2TimeOfImpact.s_fcn.Initialize(b2TimeOfImpact.s_cache, proxyA, b2TimeOfImpact.s_xfA, proxyB, b2TimeOfImpact.s_xfB);
+         var separation = b2TimeOfImpact.s_fcn.Evaluate(b2TimeOfImpact.s_xfA, b2TimeOfImpact.s_xfB);
+         if (separation <= 0.0) {
+            alpha = 1.0;
+            break;
+         }
+         if (iter == 0) {
+            if (separation > radius) {
+               target = b2Math.Max(radius - tolerance, 0.75 * radius);
+            }
+            else {
+               target = b2Math.Max(separation - tolerance, 0.02 * radius);
+            }
+         }
+         if (separation - target < 0.5 * tolerance) {
+            if (iter == 0) {
+               alpha = 1.0;
+               break;
+            }
+            break;
+         }
+         var newAlpha = alpha; {
+            var x1 = alpha;
+            var x2 = 1.0;
+            var f1 = separation;
+            sweepA.GetTransform(b2TimeOfImpact.s_xfA, x2);
+            sweepB.GetTransform(b2TimeOfImpact.s_xfB, x2);
+            var f2 = b2TimeOfImpact.s_fcn.Evaluate(b2TimeOfImpact.s_xfA, b2TimeOfImpact.s_xfB);
+            if (f2 >= target) {
+               alpha = 1.0;
+               break;
+            }
+            var rootIterCount = 0;
+            for (;;) {
+               var x = 0;
+               if (rootIterCount & 1) {
+                  x = x1 + (target - f1) * (x2 - x1) / (f2 - f1);
+               }
+               else {
+                  x = 0.5 * (x1 + x2);
+               }
+               sweepA.GetTransform(b2TimeOfImpact.s_xfA, x);
+               sweepB.GetTransform(b2TimeOfImpact.s_xfB, x);
+               var f = b2TimeOfImpact.s_fcn.Evaluate(b2TimeOfImpact.s_xfA, b2TimeOfImpact.s_xfB);
+               if (b2Math.Abs(f - target) < 0.025 * tolerance) {
+                  newAlpha = x;
+                  break;
+               }
+               if (f > target) {
+                  x1 = x;
+                  f1 = f;
+               }
+               else {
+                  x2 = x;
+                  f2 = f;
+               }++rootIterCount;
+               ++b2TimeOfImpact.b2_toiRootIters;
+               if (rootIterCount == 50) {
+                  break;
+               }
+            }
+            b2TimeOfImpact.b2_toiMaxRootIters = b2Math.Max(b2TimeOfImpact.b2_toiMaxRootIters, rootIterCount);
+         }
+         if (newAlpha < (1.0 + 100.0 * Number.MIN_VALUE) * alpha) {
+            break;
+         }
+         alpha = newAlpha;
+         iter++;
+         ++b2TimeOfImpact.b2_toiIters;
+         if (iter == k_maxIterations) {
+            break;
+         }
+      }
+      b2TimeOfImpact.b2_toiMaxIters = b2Math.Max(b2TimeOfImpact.b2_toiMaxIters, iter);
+      return alpha;
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Collision.b2TimeOfImpact.b2_toiCalls = 0;
+      Box2D.Collision.b2TimeOfImpact.b2_toiIters = 0;
+      Box2D.Collision.b2TimeOfImpact.b2_toiMaxIters = 0;
+      Box2D.Collision.b2TimeOfImpact.b2_toiRootIters = 0;
+      Box2D.Collision.b2TimeOfImpact.b2_toiMaxRootIters = 0;
+      Box2D.Collision.b2TimeOfImpact.s_cache = new b2SimplexCache();
+      Box2D.Collision.b2TimeOfImpact.s_distanceInput = new b2DistanceInput();
+      Box2D.Collision.b2TimeOfImpact.s_xfA = new b2Transform();
+      Box2D.Collision.b2TimeOfImpact.s_xfB = new b2Transform();
+      Box2D.Collision.b2TimeOfImpact.s_fcn = new b2SeparationFunction();
+      Box2D.Collision.b2TimeOfImpact.s_distanceOutput = new b2DistanceOutput();
+   });
+   b2TOIInput.b2TOIInput = function () {
+      this.proxyA = new b2DistanceProxy();
+      this.proxyB = new b2DistanceProxy();
+      this.sweepA = new b2Sweep();
+      this.sweepB = new b2Sweep();
+   };
+   b2WorldManifold.b2WorldManifold = function () {
+      this.m_normal = new b2Vec2();
+   };
+   b2WorldManifold.prototype.b2WorldManifold = function () {
+      this.m_points = new Vector(b2Settings.b2_maxManifoldPoints);
+      for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++) {
+         this.m_points[i] = new b2Vec2();
+      }
+   }
+   b2WorldManifold.prototype.Initialize = function (manifold, xfA, radiusA, xfB, radiusB) {
+      if (radiusA === undefined) radiusA = 0;
+      if (radiusB === undefined) radiusB = 0;
+      if (manifold.m_pointCount == 0) {
+         return;
+      }
+      var i = 0;
+      var tVec;
+      var tMat;
+      var normalX = 0;
+      var normalY = 0;
+      var planePointX = 0;
+      var planePointY = 0;
+      var clipPointX = 0;
+      var clipPointY = 0;
+      switch (manifold.m_type) {
+      case b2Manifold.e_circles:
+         {
+            tMat = xfA.R;
+            tVec = manifold.m_localPoint;
+            var pointAX = xfA.position.x + tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+            var pointAY = xfA.position.y + tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+            tMat = xfB.R;
+            tVec = manifold.m_points[0].m_localPoint;
+            var pointBX = xfB.position.x + tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+            var pointBY = xfB.position.y + tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+            var dX = pointBX - pointAX;
+            var dY = pointBY - pointAY;
+            var d2 = dX * dX + dY * dY;
+            if (d2 > Number.MIN_VALUE * Number.MIN_VALUE) {
+               var d = Math.sqrt(d2);
+               this.m_normal.x = dX / d;
+               this.m_normal.y = dY / d;
+            }
+            else {
+               this.m_normal.x = 1;
+               this.m_normal.y = 0;
+            }
+            var cAX = pointAX + radiusA * this.m_normal.x;
+            var cAY = pointAY + radiusA * this.m_normal.y;
+            var cBX = pointBX - radiusB * this.m_normal.x;
+            var cBY = pointBY - radiusB * this.m_normal.y;
+            this.m_points[0].x = 0.5 * (cAX + cBX);
+            this.m_points[0].y = 0.5 * (cAY + cBY);
+         }
+         break;
+      case b2Manifold.e_faceA:
+         {
+            tMat = xfA.R;
+            tVec = manifold.m_localPlaneNormal;
+            normalX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+            normalY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+            tMat = xfA.R;
+            tVec = manifold.m_localPoint;
+            planePointX = xfA.position.x + tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+            planePointY = xfA.position.y + tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+            this.m_normal.x = normalX;
+            this.m_normal.y = normalY;
+            for (i = 0;
+            i < manifold.m_pointCount; i++) {
+               tMat = xfB.R;
+               tVec = manifold.m_points[i].m_localPoint;
+               clipPointX = xfB.position.x + tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+               clipPointY = xfB.position.y + tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+               this.m_points[i].x = clipPointX + 0.5 * (radiusA - (clipPointX - planePointX) * normalX - (clipPointY - planePointY) * normalY - radiusB) * normalX;
+               this.m_points[i].y = clipPointY + 0.5 * (radiusA - (clipPointX - planePointX) * normalX - (clipPointY - planePointY) * normalY - radiusB) * normalY;
+            }
+         }
+         break;
+      case b2Manifold.e_faceB:
+         {
+            tMat = xfB.R;
+            tVec = manifold.m_localPlaneNormal;
+            normalX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+            normalY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+            tMat = xfB.R;
+            tVec = manifold.m_localPoint;
+            planePointX = xfB.position.x + tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+            planePointY = xfB.position.y + tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+            this.m_normal.x = (-normalX);
+            this.m_normal.y = (-normalY);
+            for (i = 0;
+            i < manifold.m_pointCount; i++) {
+               tMat = xfA.R;
+               tVec = manifold.m_points[i].m_localPoint;
+               clipPointX = xfA.position.x + tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+               clipPointY = xfA.position.y + tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+               this.m_points[i].x = clipPointX + 0.5 * (radiusB - (clipPointX - planePointX) * normalX - (clipPointY - planePointY) * normalY - radiusA) * normalX;
+               this.m_points[i].y = clipPointY + 0.5 * (radiusB - (clipPointX - planePointX) * normalX - (clipPointY - planePointY) * normalY - radiusA) * normalY;
+            }
+         }
+         break;
+      }
+   }
+   ClipVertex.ClipVertex = function () {
+      this.v = new b2Vec2();
+      this.id = new b2ContactID();
+   };
+   ClipVertex.prototype.Set = function (other) {
+      this.v.SetV(other.v);
+      this.id.Set(other.id);
+   }
+   Features.Features = function () {};
+   Object.defineProperty(Features.prototype, 'referenceEdge', {
+      enumerable: false,
+      configurable: true,
+      get: function () {
+         return this._referenceEdge;
+      }
+   });
+   Object.defineProperty(Features.prototype, 'referenceEdge', {
+      enumerable: false,
+      configurable: true,
+      set: function (value) {
+         if (value === undefined) value = 0;
+         this._referenceEdge = value;
+         this._m_id._key = (this._m_id._key & 0xffffff00) | (this._referenceEdge & 0x000000ff);
+      }
+   });
+   Object.defineProperty(Features.prototype, 'incidentEdge', {
+      enumerable: false,
+      configurable: true,
+      get: function () {
+         return this._incidentEdge;
+      }
+   });
+   Object.defineProperty(Features.prototype, 'incidentEdge', {
+      enumerable: false,
+      configurable: true,
+      set: function (value) {
+         if (value === undefined) value = 0;
+         this._incidentEdge = value;
+         this._m_id._key = (this._m_id._key & 0xffff00ff) | ((this._incidentEdge << 8) & 0x0000ff00);
+      }
+   });
+   Object.defineProperty(Features.prototype, 'incidentVertex', {
+      enumerable: false,
+      configurable: true,
+      get: function () {
+         return this._incidentVertex;
+      }
+   });
+   Object.defineProperty(Features.prototype, 'incidentVertex', {
+      enumerable: false,
+      configurable: true,
+      set: function (value) {
+         if (value === undefined) value = 0;
+         this._incidentVertex = value;
+         this._m_id._key = (this._m_id._key & 0xff00ffff) | ((this._incidentVertex << 16) & 0x00ff0000);
+      }
+   });
+   Object.defineProperty(Features.prototype, 'flip', {
+      enumerable: false,
+      configurable: true,
+      get: function () {
+         return this._flip;
+      }
+   });
+   Object.defineProperty(Features.prototype, 'flip', {
+      enumerable: false,
+      configurable: true,
+      set: function (value) {
+         if (value === undefined) value = 0;
+         this._flip = value;
+         this._m_id._key = (this._m_id._key & 0x00ffffff) | ((this._flip << 24) & 0xff000000);
+      }
+   });
+})();
+(function () {
+   var b2Color = Box2D.Common.b2Color,
+      b2internal = Box2D.Common.b2internal,
+      b2Settings = Box2D.Common.b2Settings,
+      b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
+      b2EdgeChainDef = Box2D.Collision.Shapes.b2EdgeChainDef,
+      b2EdgeShape = Box2D.Collision.Shapes.b2EdgeShape,
+      b2MassData = Box2D.Collision.Shapes.b2MassData,
+      b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
+      b2Shape = Box2D.Collision.Shapes.b2Shape,
+      b2Mat22 = Box2D.Common.Math.b2Mat22,
+      b2Mat33 = Box2D.Common.Math.b2Mat33,
+      b2Math = Box2D.Common.Math.b2Math,
+      b2Sweep = Box2D.Common.Math.b2Sweep,
+      b2Transform = Box2D.Common.Math.b2Transform,
+      b2Vec2 = Box2D.Common.Math.b2Vec2,
+      b2Vec3 = Box2D.Common.Math.b2Vec3,
+      b2Body = Box2D.Dynamics.b2Body,
+      b2BodyDef = Box2D.Dynamics.b2BodyDef,
+      b2ContactFilter = Box2D.Dynamics.b2ContactFilter,
+      b2ContactImpulse = Box2D.Dynamics.b2ContactImpulse,
+      b2ContactListener = Box2D.Dynamics.b2ContactListener,
+      b2ContactManager = Box2D.Dynamics.b2ContactManager,
+      b2DebugDraw = Box2D.Dynamics.b2DebugDraw,
+      b2DestructionListener = Box2D.Dynamics.b2DestructionListener,
+      b2FilterData = Box2D.Dynamics.b2FilterData,
+      b2Fixture = Box2D.Dynamics.b2Fixture,
+      b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
+      b2Island = Box2D.Dynamics.b2Island,
+      b2TimeStep = Box2D.Dynamics.b2TimeStep,
+      b2World = Box2D.Dynamics.b2World,
+      b2AABB = Box2D.Collision.b2AABB,
+      b2Bound = Box2D.Collision.b2Bound,
+      b2BoundValues = Box2D.Collision.b2BoundValues,
+      b2Collision = Box2D.Collision.b2Collision,
+      b2ContactID = Box2D.Collision.b2ContactID,
+      b2ContactPoint = Box2D.Collision.b2ContactPoint,
+      b2Distance = Box2D.Collision.b2Distance,
+      b2DistanceInput = Box2D.Collision.b2DistanceInput,
+      b2DistanceOutput = Box2D.Collision.b2DistanceOutput,
+      b2DistanceProxy = Box2D.Collision.b2DistanceProxy,
+      b2DynamicTree = Box2D.Collision.b2DynamicTree,
+      b2DynamicTreeBroadPhase = Box2D.Collision.b2DynamicTreeBroadPhase,
+      b2DynamicTreeNode = Box2D.Collision.b2DynamicTreeNode,
+      b2DynamicTreePair = Box2D.Collision.b2DynamicTreePair,
+      b2Manifold = Box2D.Collision.b2Manifold,
+      b2ManifoldPoint = Box2D.Collision.b2ManifoldPoint,
+      b2Point = Box2D.Collision.b2Point,
+      b2RayCastInput = Box2D.Collision.b2RayCastInput,
+      b2RayCastOutput = Box2D.Collision.b2RayCastOutput,
+      b2Segment = Box2D.Collision.b2Segment,
+      b2SeparationFunction = Box2D.Collision.b2SeparationFunction,
+      b2Simplex = Box2D.Collision.b2Simplex,
+      b2SimplexCache = Box2D.Collision.b2SimplexCache,
+      b2SimplexVertex = Box2D.Collision.b2SimplexVertex,
+      b2TimeOfImpact = Box2D.Collision.b2TimeOfImpact,
+      b2TOIInput = Box2D.Collision.b2TOIInput,
+      b2WorldManifold = Box2D.Collision.b2WorldManifold,
+      ClipVertex = Box2D.Collision.ClipVertex,
+      Features = Box2D.Collision.Features,
+      IBroadPhase = Box2D.Collision.IBroadPhase;
+
+   Box2D.inherit(b2CircleShape, Box2D.Collision.Shapes.b2Shape);
+   b2CircleShape.prototype.__super = Box2D.Collision.Shapes.b2Shape.prototype;
+   b2CircleShape.b2CircleShape = function () {
+      Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this, arguments);
+      this.m_p = new b2Vec2();
+   };
+   b2CircleShape.prototype.Copy = function () {
+      var s = new b2CircleShape();
+      s.Set(this);
+      return s;
+   }
+   b2CircleShape.prototype.Set = function (other) {
+      this.__super.Set.call(this, other);
+      if (Box2D.is(other, b2CircleShape)) {
+         var other2 = (other instanceof b2CircleShape ? other : null);
+         this.m_p.SetV(other2.m_p);
+      }
+   }
+   b2CircleShape.prototype.TestPoint = function (transform, p) {
+      var tMat = transform.R;
+      var dX = transform.position.x + (tMat.col1.x * this.m_p.x + tMat.col2.x * this.m_p.y);
+      var dY = transform.position.y + (tMat.col1.y * this.m_p.x + tMat.col2.y * this.m_p.y);
+      dX = p.x - dX;
+      dY = p.y - dY;
+      return (dX * dX + dY * dY) <= this.m_radius * this.m_radius;
+   }
+   b2CircleShape.prototype.RayCast = function (output, input, transform) {
+      var tMat = transform.R;
+      var positionX = transform.position.x + (tMat.col1.x * this.m_p.x + tMat.col2.x * this.m_p.y);
+      var positionY = transform.position.y + (tMat.col1.y * this.m_p.x + tMat.col2.y * this.m_p.y);
+      var sX = input.p1.x - positionX;
+      var sY = input.p1.y - positionY;
+      var b = (sX * sX + sY * sY) - this.m_radius * this.m_radius;
+      var rX = input.p2.x - input.p1.x;
+      var rY = input.p2.y - input.p1.y;
+      var c = (sX * rX + sY * rY);
+      var rr = (rX * rX + rY * rY);
+      var sigma = c * c - rr * b;
+      if (sigma < 0.0 || rr < Number.MIN_VALUE) {
+         return false;
+      }
+      var a = (-(c + Math.sqrt(sigma)));
+      if (0.0 <= a && a <= input.maxFraction * rr) {
+         a /= rr;
+         output.fraction = a;
+         output.normal.x = sX + a * rX;
+         output.normal.y = sY + a * rY;
+         output.normal.Normalize();
+         return true;
+      }
+      return false;
+   }
+   b2CircleShape.prototype.ComputeAABB = function (aabb, transform) {
+      var tMat = transform.R;
+      var pX = transform.position.x + (tMat.col1.x * this.m_p.x + tMat.col2.x * this.m_p.y);
+      var pY = transform.position.y + (tMat.col1.y * this.m_p.x + tMat.col2.y * this.m_p.y);
+      aabb.lowerBound.Set(pX - this.m_radius, pY - this.m_radius);
+      aabb.upperBound.Set(pX + this.m_radius, pY + this.m_radius);
+   }
+   b2CircleShape.prototype.ComputeMass = function (massData, density) {
+      if (density === undefined) density = 0;
+      massData.mass = density * b2Settings.b2_pi * this.m_radius * this.m_radius;
+      massData.center.SetV(this.m_p);
+      massData.I = massData.mass * (0.5 * this.m_radius * this.m_radius + (this.m_p.x * this.m_p.x + this.m_p.y * this.m_p.y));
+   }
+   b2CircleShape.prototype.ComputeSubmergedArea = function (normal, offset, xf, c) {
+      if (offset === undefined) offset = 0;
+      var p = b2Math.MulX(xf, this.m_p);
+      var l = (-(b2Math.Dot(normal, p) - offset));
+      if (l < (-this.m_radius) + Number.MIN_VALUE) {
+         return 0;
+      }
+      if (l > this.m_radius) {
+         c.SetV(p);
+         return Math.PI * this.m_radius * this.m_radius;
+      }
+      var r2 = this.m_radius * this.m_radius;
+      var l2 = l * l;
+      var area = r2 * (Math.asin(l / this.m_radius) + Math.PI / 2) + l * Math.sqrt(r2 - l2);
+      var com = (-2 / 3 * Math.pow(r2 - l2, 1.5) / area);
+      c.x = p.x + normal.x * com;
+      c.y = p.y + normal.y * com;
+      return area;
+   }
+   b2CircleShape.prototype.GetLocalPosition = function () {
+      return this.m_p;
+   }
+   b2CircleShape.prototype.SetLocalPosition = function (position) {
+      this.m_p.SetV(position);
+   }
+   b2CircleShape.prototype.GetRadius = function () {
+      return this.m_radius;
+   }
+   b2CircleShape.prototype.SetRadius = function (radius) {
+      if (radius === undefined) radius = 0;
+      this.m_radius = radius;
+   }
+   b2CircleShape.prototype.b2CircleShape = function (radius) {
+      if (radius === undefined) radius = 0;
+      this.__super.b2Shape.call(this);
+      this.m_type = b2Shape.e_circleShape;
+      this.m_radius = radius;
+   }
+   b2EdgeChainDef.b2EdgeChainDef = function () {};
+   b2EdgeChainDef.prototype.b2EdgeChainDef = function () {
+      this.vertexCount = 0;
+      this.isALoop = true;
+      this.vertices = [];
+   }
+   Box2D.inherit(b2EdgeShape, Box2D.Collision.Shapes.b2Shape);
+   b2EdgeShape.prototype.__super = Box2D.Collision.Shapes.b2Shape.prototype;
+   b2EdgeShape.b2EdgeShape = function () {
+      Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this, arguments);
+      this.s_supportVec = new b2Vec2();
+      this.m_v1 = new b2Vec2();
+      this.m_v2 = new b2Vec2();
+      this.m_coreV1 = new b2Vec2();
+      this.m_coreV2 = new b2Vec2();
+      this.m_normal = new b2Vec2();
+      this.m_direction = new b2Vec2();
+      this.m_cornerDir1 = new b2Vec2();
+      this.m_cornerDir2 = new b2Vec2();
+   };
+   b2EdgeShape.prototype.TestPoint = function (transform, p) {
+      return false;
+   }
+   b2EdgeShape.prototype.RayCast = function (output, input, transform) {
+      var tMat;
+      var rX = input.p2.x - input.p1.x;
+      var rY = input.p2.y - input.p1.y;
+      tMat = transform.R;
+      var v1X = transform.position.x + (tMat.col1.x * this.m_v1.x + tMat.col2.x * this.m_v1.y);
+      var v1Y = transform.position.y + (tMat.col1.y * this.m_v1.x + tMat.col2.y * this.m_v1.y);
+      var nX = transform.position.y + (tMat.col1.y * this.m_v2.x + tMat.col2.y * this.m_v2.y) - v1Y;
+      var nY = (-(transform.position.x + (tMat.col1.x * this.m_v2.x + tMat.col2.x * this.m_v2.y) - v1X));
+      var k_slop = 100.0 * Number.MIN_VALUE;
+      var denom = (-(rX * nX + rY * nY));
+      if (denom > k_slop) {
+         var bX = input.p1.x - v1X;
+         var bY = input.p1.y - v1Y;
+         var a = (bX * nX + bY * nY);
+         if (0.0 <= a && a <= input.maxFraction * denom) {
+            var mu2 = (-rX * bY) + rY * bX;
+            if ((-k_slop * denom) <= mu2 && mu2 <= denom * (1.0 + k_slop)) {
+               a /= denom;
+               output.fraction = a;
+               var nLen = Math.sqrt(nX * nX + nY * nY);
+               output.normal.x = nX / nLen;
+               output.normal.y = nY / nLen;
+               return true;
+            }
+         }
+      }
+      return false;
+   }
+   b2EdgeShape.prototype.ComputeAABB = function (aabb, transform) {
+      var tMat = transform.R;
+      var v1X = transform.position.x + (tMat.col1.x * this.m_v1.x + tMat.col2.x * this.m_v1.y);
+      var v1Y = transform.position.y + (tMat.col1.y * this.m_v1.x + tMat.col2.y * this.m_v1.y);
+      var v2X = transform.position.x + (tMat.col1.x * this.m_v2.x + tMat.col2.x * this.m_v2.y);
+      var v2Y = transform.position.y + (tMat.col1.y * this.m_v2.x + tMat.col2.y * this.m_v2.y);
+      if (v1X < v2X) {
+         aabb.lowerBound.x = v1X;
+         aabb.upperBound.x = v2X;
+      }
+      else {
+         aabb.lowerBound.x = v2X;
+         aabb.upperBound.x = v1X;
+      }
+      if (v1Y < v2Y) {
+         aabb.lowerBound.y = v1Y;
+         aabb.upperBound.y = v2Y;
+      }
+      else {
+         aabb.lowerBound.y = v2Y;
+         aabb.upperBound.y = v1Y;
+      }
+   }
+   b2EdgeShape.prototype.ComputeMass = function (massData, density) {
+      if (density === undefined) density = 0;
+      massData.mass = 0;
+      massData.center.SetV(this.m_v1);
+      massData.I = 0;
+   }
+   b2EdgeShape.prototype.ComputeSubmergedArea = function (normal, offset, xf, c) {
+      if (offset === undefined) offset = 0;
+      var v0 = new b2Vec2(normal.x * offset, normal.y * offset);
+      var v1 = b2Math.MulX(xf, this.m_v1);
+      var v2 = b2Math.MulX(xf, this.m_v2);
+      var d1 = b2Math.Dot(normal, v1) - offset;
+      var d2 = b2Math.Dot(normal, v2) - offset;
+      if (d1 > 0) {
+         if (d2 > 0) {
+            return 0;
+         }
+         else {
+            v1.x = (-d2 / (d1 - d2) * v1.x) + d1 / (d1 - d2) * v2.x;
+            v1.y = (-d2 / (d1 - d2) * v1.y) + d1 / (d1 - d2) * v2.y;
+         }
+      }
+      else {
+         if (d2 > 0) {
+            v2.x = (-d2 / (d1 - d2) * v1.x) + d1 / (d1 - d2) * v2.x;
+            v2.y = (-d2 / (d1 - d2) * v1.y) + d1 / (d1 - d2) * v2.y;
+         }
+         else {}
+      }
+      c.x = (v0.x + v1.x + v2.x) / 3;
+      c.y = (v0.y + v1.y + v2.y) / 3;
+      return 0.5 * ((v1.x - v0.x) * (v2.y - v0.y) - (v1.y - v0.y) * (v2.x - v0.x));
+   }
+   b2EdgeShape.prototype.GetLength = function () {
+      return this.m_length;
+   }
+   b2EdgeShape.prototype.GetVertex1 = function () {
+      return this.m_v1;
+   }
+   b2EdgeShape.prototype.GetVertex2 = function () {
+      return this.m_v2;
+   }
+   b2EdgeShape.prototype.GetCoreVertex1 = function () {
+      return this.m_coreV1;
+   }
+   b2EdgeShape.prototype.GetCoreVertex2 = function () {
+      return this.m_coreV2;
+   }
+   b2EdgeShape.prototype.GetNormalVector = function () {
+      return this.m_normal;
+   }
+   b2EdgeShape.prototype.GetDirectionVector = function () {
+      return this.m_direction;
+   }
+   b2EdgeShape.prototype.GetCorner1Vector = function () {
+      return this.m_cornerDir1;
+   }
+   b2EdgeShape.prototype.GetCorner2Vector = function () {
+      return this.m_cornerDir2;
+   }
+   b2EdgeShape.prototype.Corner1IsConvex = function () {
+      return this.m_cornerConvex1;
+   }
+   b2EdgeShape.prototype.Corner2IsConvex = function () {
+      return this.m_cornerConvex2;
+   }
+   b2EdgeShape.prototype.GetFirstVertex = function (xf) {
+      var tMat = xf.R;
+      return new b2Vec2(xf.position.x + (tMat.col1.x * this.m_coreV1.x + tMat.col2.x * this.m_coreV1.y), xf.position.y + (tMat.col1.y * this.m_coreV1.x + tMat.col2.y * this.m_coreV1.y));
+   }
+   b2EdgeShape.prototype.GetNextEdge = function () {
+      return this.m_nextEdge;
+   }
+   b2EdgeShape.prototype.GetPrevEdge = function () {
+      return this.m_prevEdge;
+   }
+   b2EdgeShape.prototype.Support = function (xf, dX, dY) {
+      if (dX === undefined) dX = 0;
+      if (dY === undefined) dY = 0;
+      var tMat = xf.R;
+      var v1X = xf.position.x + (tMat.col1.x * this.m_coreV1.x + tMat.col2.x * this.m_coreV1.y);
+      var v1Y = xf.position.y + (tMat.col1.y * this.m_coreV1.x + tMat.col2.y * this.m_coreV1.y);
+      var v2X = xf.position.x + (tMat.col1.x * this.m_coreV2.x + tMat.col2.x * this.m_coreV2.y);
+      var v2Y = xf.position.y + (tMat.col1.y * this.m_coreV2.x + tMat.col2.y * this.m_coreV2.y);
+      if ((v1X * dX + v1Y * dY) > (v2X * dX + v2Y * dY)) {
+         this.s_supportVec.x = v1X;
+         this.s_supportVec.y = v1Y;
+      }
+      else {
+         this.s_supportVec.x = v2X;
+         this.s_supportVec.y = v2Y;
+      }
+      return this.s_supportVec;
+   }
+   b2EdgeShape.prototype.b2EdgeShape = function (v1, v2) {
+      this.__super.b2Shape.call(this);
+      this.m_type = b2Shape.e_edgeShape;
+      this.m_prevEdge = null;
+      this.m_nextEdge = null;
+      this.m_v1 = v1;
+      this.m_v2 = v2;
+      this.m_direction.Set(this.m_v2.x - this.m_v1.x, this.m_v2.y - this.m_v1.y);
+      this.m_length = this.m_direction.Normalize();
+      this.m_normal.Set(this.m_direction.y, (-this.m_direction.x));
+      this.m_coreV1.Set((-b2Settings.b2_toiSlop * (this.m_normal.x - this.m_direction.x)) + this.m_v1.x, (-b2Settings.b2_toiSlop * (this.m_normal.y - this.m_direction.y)) + this.m_v1.y);
+      this.m_coreV2.Set((-b2Settings.b2_toiSlop * (this.m_normal.x + this.m_direction.x)) + this.m_v2.x, (-b2Settings.b2_toiSlop * (this.m_normal.y + this.m_direction.y)) + this.m_v2.y);
+      this.m_cornerDir1 = this.m_normal;
+      this.m_cornerDir2.Set((-this.m_normal.x), (-this.m_normal.y));
+   }
+   b2EdgeShape.prototype.SetPrevEdge = function (edge, core, cornerDir, convex) {
+      this.m_prevEdge = edge;
+      this.m_coreV1 = core;
+      this.m_cornerDir1 = cornerDir;
+      this.m_cornerConvex1 = convex;
+   }
+   b2EdgeShape.prototype.SetNextEdge = function (edge, core, cornerDir, convex) {
+      this.m_nextEdge = edge;
+      this.m_coreV2 = core;
+      this.m_cornerDir2 = cornerDir;
+      this.m_cornerConvex2 = convex;
+   }
+   b2MassData.b2MassData = function () {
+      this.mass = 0.0;
+      this.center = new b2Vec2(0, 0);
+      this.I = 0.0;
+   };
+   Box2D.inherit(b2PolygonShape, Box2D.Collision.Shapes.b2Shape);
+   b2PolygonShape.prototype.__super = Box2D.Collision.Shapes.b2Shape.prototype;
+   b2PolygonShape.b2PolygonShape = function () {
+      Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this, arguments);
+   };
+   b2PolygonShape.prototype.Copy = function () {
+      var s = new b2PolygonShape();
+      s.Set(this);
+      return s;
+   }
+   b2PolygonShape.prototype.Set = function (other) {
+      this.__super.Set.call(this, other);
+      if (Box2D.is(other, b2PolygonShape)) {
+         var other2 = (other instanceof b2PolygonShape ? other : null);
+         this.m_centroid.SetV(other2.m_centroid);
+         this.m_vertexCount = other2.m_vertexCount;
+         this.Reserve(this.m_vertexCount);
+         for (var i = 0; i < this.m_vertexCount; i++) {
+            this.m_vertices[i].SetV(other2.m_vertices[i]);
+            this.m_normals[i].SetV(other2.m_normals[i]);
+         }
+      }
+   }
+   b2PolygonShape.prototype.SetAsArray = function (vertices, vertexCount) {
+      if (vertexCount === undefined) vertexCount = 0;
+      var v = new Vector();
+      var i = 0,
+         tVec;
+      for (i = 0;
+      i < vertices.length; ++i) {
+         tVec = vertices[i];
+         v.push(tVec);
+      }
+      this.SetAsVector(v, vertexCount);
+   }
+   b2PolygonShape.AsArray = function (vertices, vertexCount) {
+      if (vertexCount === undefined) vertexCount = 0;
+      var polygonShape = new b2PolygonShape();
+      polygonShape.SetAsArray(vertices, vertexCount);
+      return polygonShape;
+   }
+   b2PolygonShape.prototype.SetAsVector = function (vertices, vertexCount) {
+      if (vertexCount === undefined) vertexCount = 0;
+      if (vertexCount == 0) vertexCount = vertices.length;
+      b2Settings.b2Assert(2 <= vertexCount);
+      this.m_vertexCount = vertexCount;
+      this.Reserve(vertexCount);
+      var i = 0;
+      for (i = 0;
+      i < this.m_vertexCount; i++) {
+         this.m_vertices[i].SetV(vertices[i]);
+      }
+      for (i = 0;
+      i < this.m_vertexCount; ++i) {
+         var i1 = parseInt(i);
+         var i2 = parseInt(i + 1 < this.m_vertexCount ? i + 1 : 0);
+         var edge = b2Math.SubtractVV(this.m_vertices[i2], this.m_vertices[i1]);
+         b2Settings.b2Assert(edge.LengthSquared() > Number.MIN_VALUE);
+         this.m_normals[i].SetV(b2Math.CrossVF(edge, 1.0));
+         this.m_normals[i].Normalize();
+      }
+      this.m_centroid = b2PolygonShape.ComputeCentroid(this.m_vertices, this.m_vertexCount);
+   }
+   b2PolygonShape.AsVector = function (vertices, vertexCount) {
+      if (vertexCount === undefined) vertexCount = 0;
+      var polygonShape = new b2PolygonShape();
+      polygonShape.SetAsVector(vertices, vertexCount);
+      return polygonShape;
+   }
+   b2PolygonShape.prototype.SetAsBox = function (hx, hy) {
+      if (hx === undefined) hx = 0;
+      if (hy === undefined) hy = 0;
+      this.m_vertexCount = 4;
+      this.Reserve(4);
+      this.m_vertices[0].Set((-hx), (-hy));
+      this.m_vertices[1].Set(hx, (-hy));
+      this.m_vertices[2].Set(hx, hy);
+      this.m_vertices[3].Set((-hx), hy);
+      this.m_normals[0].Set(0.0, (-1.0));
+      this.m_normals[1].Set(1.0, 0.0);
+      this.m_normals[2].Set(0.0, 1.0);
+      this.m_normals[3].Set((-1.0), 0.0);
+      this.m_centroid.SetZero();
+   }
+   b2PolygonShape.AsBox = function (hx, hy) {
+      if (hx === undefined) hx = 0;
+      if (hy === undefined) hy = 0;
+      var polygonShape = new b2PolygonShape();
+      polygonShape.SetAsBox(hx, hy);
+      return polygonShape;
+   }
+   b2PolygonShape.prototype.SetAsOrientedBox = function (hx, hy, center, angle) {
+      if (hx === undefined) hx = 0;
+      if (hy === undefined) hy = 0;
+      if (center === undefined) center = null;
+      if (angle === undefined) angle = 0.0;
+      this.m_vertexCount = 4;
+      this.Reserve(4);
+      this.m_vertices[0].Set((-hx), (-hy));
+      this.m_vertices[1].Set(hx, (-hy));
+      this.m_vertices[2].Set(hx, hy);
+      this.m_vertices[3].Set((-hx), hy);
+      this.m_normals[0].Set(0.0, (-1.0));
+      this.m_normals[1].Set(1.0, 0.0);
+      this.m_normals[2].Set(0.0, 1.0);
+      this.m_normals[3].Set((-1.0), 0.0);
+      this.m_centroid = center;
+      var xf = new b2Transform();
+      xf.position = center;
+      xf.R.Set(angle);
+      for (var i = 0; i < this.m_vertexCount; ++i) {
+         this.m_vertices[i] = b2Math.MulX(xf, this.m_vertices[i]);
+         this.m_normals[i] = b2Math.MulMV(xf.R, this.m_normals[i]);
+      }
+   }
+   b2PolygonShape.AsOrientedBox = function (hx, hy, center, angle) {
+      if (hx === undefined) hx = 0;
+      if (hy === undefined) hy = 0;
+      if (center === undefined) center = null;
+      if (angle === undefined) angle = 0.0;
+      var polygonShape = new b2PolygonShape();
+      polygonShape.SetAsOrientedBox(hx, hy, center, angle);
+      return polygonShape;
+   }
+   b2PolygonShape.prototype.SetAsEdge = function (v1, v2) {
+      this.m_vertexCount = 2;
+      this.Reserve(2);
+      this.m_vertices[0].SetV(v1);
+      this.m_vertices[1].SetV(v2);
+      this.m_centroid.x = 0.5 * (v1.x + v2.x);
+      this.m_centroid.y = 0.5 * (v1.y + v2.y);
+      this.m_normals[0] = b2Math.CrossVF(b2Math.SubtractVV(v2, v1), 1.0);
+      this.m_normals[0].Normalize();
+      this.m_normals[1].x = (-this.m_normals[0].x);
+      this.m_normals[1].y = (-this.m_normals[0].y);
+   }
+   b2PolygonShape.AsEdge = function (v1, v2) {
+      var polygonShape = new b2PolygonShape();
+      polygonShape.SetAsEdge(v1, v2);
+      return polygonShape;
+   }
+   b2PolygonShape.prototype.TestPoint = function (xf, p) {
+      var tVec;
+      var tMat = xf.R;
+      var tX = p.x - xf.position.x;
+      var tY = p.y - xf.position.y;
+      var pLocalX = (tX * tMat.col1.x + tY * tMat.col1.y);
+      var pLocalY = (tX * tMat.col2.x + tY * tMat.col2.y);
+      for (var i = 0; i < this.m_vertexCount; ++i) {
+         tVec = this.m_vertices[i];
+         tX = pLocalX - tVec.x;
+         tY = pLocalY - tVec.y;
+         tVec = this.m_normals[i];
+         var dot = (tVec.x * tX + tVec.y * tY);
+         if (dot > 0.0) {
+            return false;
+         }
+      }
+      return true;
+   }
+   b2PolygonShape.prototype.RayCast = function (output, input, transform) {
+      var lower = 0.0;
+      var upper = input.maxFraction;
+      var tX = 0;
+      var tY = 0;
+      var tMat;
+      var tVec;
+      tX = input.p1.x - transform.position.x;
+      tY = input.p1.y - transform.position.y;
+      tMat = transform.R;
+      var p1X = (tX * tMat.col1.x + tY * tMat.col1.y);
+      var p1Y = (tX * tMat.col2.x + tY * tMat.col2.y);
+      tX = input.p2.x - transform.position.x;
+      tY = input.p2.y - transform.position.y;
+      tMat = transform.R;
+      var p2X = (tX * tMat.col1.x + tY * tMat.col1.y);
+      var p2Y = (tX * tMat.col2.x + tY * tMat.col2.y);
+      var dX = p2X - p1X;
+      var dY = p2Y - p1Y;
+      var index = parseInt((-1));
+      for (var i = 0; i < this.m_vertexCount; ++i) {
+         tVec = this.m_vertices[i];
+         tX = tVec.x - p1X;
+         tY = tVec.y - p1Y;
+         tVec = this.m_normals[i];
+         var numerator = (tVec.x * tX + tVec.y * tY);
+         var denominator = (tVec.x * dX + tVec.y * dY);
+         if (denominator == 0.0) {
+            if (numerator < 0.0) {
+               return false;
+            }
+         }
+         else {
+            if (denominator < 0.0 && numerator < lower * denominator) {
+               lower = numerator / denominator;
+               index = i;
+            }
+            else if (denominator > 0.0 && numerator < upper * denominator) {
+               upper = numerator / denominator;
+            }
+         }
+         if (upper < lower - Number.MIN_VALUE) {
+            return false;
+         }
+      }
+      if (index >= 0) {
+         output.fraction = lower;
+         tMat = transform.R;
+         tVec = this.m_normals[index];
+         output.normal.x = (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+         output.normal.y = (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+         return true;
+      }
+      return false;
+   }
+   b2PolygonShape.prototype.ComputeAABB = function (aabb, xf) {
+      var tMat = xf.R;
+      var tVec = this.m_vertices[0];
+      var lowerX = xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      var lowerY = xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      var upperX = lowerX;
+      var upperY = lowerY;
+      for (var i = 1; i < this.m_vertexCount; ++i) {
+         tVec = this.m_vertices[i];
+         var vX = xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+         var vY = xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+         lowerX = lowerX < vX ? lowerX : vX;
+         lowerY = lowerY < vY ? lowerY : vY;
+         upperX = upperX > vX ? upperX : vX;
+         upperY = upperY > vY ? upperY : vY;
+      }
+      aabb.lowerBound.x = lowerX - this.m_radius;
+      aabb.lowerBound.y = lowerY - this.m_radius;
+      aabb.upperBound.x = upperX + this.m_radius;
+      aabb.upperBound.y = upperY + this.m_radius;
+   }
+   b2PolygonShape.prototype.ComputeMass = function (massData, density) {
+      if (density === undefined) density = 0;
+      if (this.m_vertexCount == 2) {
+         massData.center.x = 0.5 * (this.m_vertices[0].x + this.m_vertices[1].x);
+         massData.center.y = 0.5 * (this.m_vertices[0].y + this.m_vertices[1].y);
+         massData.mass = 0.0;
+         massData.I = 0.0;
+         return;
+      }
+      var centerX = 0.0;
+      var centerY = 0.0;
+      var area = 0.0;
+      var I = 0.0;
+      var p1X = 0.0;
+      var p1Y = 0.0;
+      var k_inv3 = 1.0 / 3.0;
+      for (var i = 0; i < this.m_vertexCount; ++i) {
+         var p2 = this.m_vertices[i];
+         var p3 = i + 1 < this.m_vertexCount ? this.m_vertices[parseInt(i + 1)] : this.m_vertices[0];
+         var e1X = p2.x - p1X;
+         var e1Y = p2.y - p1Y;
+         var e2X = p3.x - p1X;
+         var e2Y = p3.y - p1Y;
+         var D = e1X * e2Y - e1Y * e2X;
+         var triangleArea = 0.5 * D;area += triangleArea;
+         centerX += triangleArea * k_inv3 * (p1X + p2.x + p3.x);
+         centerY += triangleArea * k_inv3 * (p1Y + p2.y + p3.y);
+         var px = p1X;
+         var py = p1Y;
+         var ex1 = e1X;
+         var ey1 = e1Y;
+         var ex2 = e2X;
+         var ey2 = e2Y;
+         var intx2 = k_inv3 * (0.25 * (ex1 * ex1 + ex2 * ex1 + ex2 * ex2) + (px * ex1 + px * ex2)) + 0.5 * px * px;
+         var inty2 = k_inv3 * (0.25 * (ey1 * ey1 + ey2 * ey1 + ey2 * ey2) + (py * ey1 + py * ey2)) + 0.5 * py * py;I += D * (intx2 + inty2);
+      }
+      massData.mass = density * area;
+      centerX *= 1.0 / area;
+      centerY *= 1.0 / area;
+      massData.center.Set(centerX, centerY);
+      massData.I = density * I;
+   }
+   b2PolygonShape.prototype.ComputeSubmergedArea = function (normal, offset, xf, c) {
+      if (offset === undefined) offset = 0;
+      var normalL = b2Math.MulTMV(xf.R, normal);
+      var offsetL = offset - b2Math.Dot(normal, xf.position);
+      var depths = new Vector_a2j_Number();
+      var diveCount = 0;
+      var intoIndex = parseInt((-1));
+      var outoIndex = parseInt((-1));
+      var lastSubmerged = false;
+      var i = 0;
+      for (i = 0;
+      i < this.m_vertexCount; ++i) {
+         depths[i] = b2Math.Dot(normalL, this.m_vertices[i]) - offsetL;
+         var isSubmerged = depths[i] < (-Number.MIN_VALUE);
+         if (i > 0) {
+            if (isSubmerged) {
+               if (!lastSubmerged) {
+                  intoIndex = i - 1;
+                  diveCount++;
+               }
+            }
+            else {
+               if (lastSubmerged) {
+                  outoIndex = i - 1;
+                  diveCount++;
+               }
+            }
+         }
+         lastSubmerged = isSubmerged;
+      }
+      switch (diveCount) {
+      case 0:
+         if (lastSubmerged) {
+            var md = new b2MassData();
+            this.ComputeMass(md, 1);
+            c.SetV(b2Math.MulX(xf, md.center));
+            return md.mass;
+         }
+         else {
+            return 0;
+         }
+         break;
+      case 1:
+         if (intoIndex == (-1)) {
+            intoIndex = this.m_vertexCount - 1;
+         }
+         else {
+            outoIndex = this.m_vertexCount - 1;
+         }
+         break;
+      }
+      var intoIndex2 = parseInt((intoIndex + 1) % this.m_vertexCount);
+      var outoIndex2 = parseInt((outoIndex + 1) % this.m_vertexCount);
+      var intoLamdda = (0 - depths[intoIndex]) / (depths[intoIndex2] - depths[intoIndex]);
+      var outoLamdda = (0 - depths[outoIndex]) / (depths[outoIndex2] - depths[outoIndex]);
+      var intoVec = new b2Vec2(this.m_vertices[intoIndex].x * (1 - intoLamdda) + this.m_vertices[intoIndex2].x * intoLamdda, this.m_vertices[intoIndex].y * (1 - intoLamdda) + this.m_vertices[intoIndex2].y * intoLamdda);
+      var outoVec = new b2Vec2(this.m_vertices[outoIndex].x * (1 - outoLamdda) + this.m_vertices[outoIndex2].x * outoLamdda, this.m_vertices[outoIndex].y * (1 - outoLamdda) + this.m_vertices[outoIndex2].y * outoLamdda);
+      var area = 0;
+      var center = new b2Vec2();
+      var p2 = this.m_vertices[intoIndex2];
+      var p3;
+      i = intoIndex2;
+      while (i != outoIndex2) {
+         i = (i + 1) % this.m_vertexCount;
+         if (i == outoIndex2) p3 = outoVec;
+         else p3 = this.m_vertices[i];
+         var triangleArea = 0.5 * ((p2.x - intoVec.x) * (p3.y - intoVec.y) - (p2.y - intoVec.y) * (p3.x - intoVec.x));
+         area += triangleArea;
+         center.x += triangleArea * (intoVec.x + p2.x + p3.x) / 3;
+         center.y += triangleArea * (intoVec.y + p2.y + p3.y) / 3;
+         p2 = p3;
+      }
+      center.Multiply(1 / area);
+      c.SetV(b2Math.MulX(xf, center));
+      return area;
+   }
+   b2PolygonShape.prototype.GetVertexCount = function () {
+      return this.m_vertexCount;
+   }
+   b2PolygonShape.prototype.GetVertices = function () {
+      return this.m_vertices;
+   }
+   b2PolygonShape.prototype.GetNormals = function () {
+      return this.m_normals;
+   }
+   b2PolygonShape.prototype.GetSupport = function (d) {
+      var bestIndex = 0;
+      var bestValue = this.m_vertices[0].x * d.x + this.m_vertices[0].y * d.y;
+      for (var i = 1; i < this.m_vertexCount; ++i) {
+         var value = this.m_vertices[i].x * d.x + this.m_vertices[i].y * d.y;
+         if (value > bestValue) {
+            bestIndex = i;
+            bestValue = value;
+         }
+      }
+      return bestIndex;
+   }
+   b2PolygonShape.prototype.GetSupportVertex = function (d) {
+      var bestIndex = 0;
+      var bestValue = this.m_vertices[0].x * d.x + this.m_vertices[0].y * d.y;
+      for (var i = 1; i < this.m_vertexCount; ++i) {
+         var value = this.m_vertices[i].x * d.x + this.m_vertices[i].y * d.y;
+         if (value > bestValue) {
+            bestIndex = i;
+            bestValue = value;
+         }
+      }
+      return this.m_vertices[bestIndex];
+   }
+   b2PolygonShape.prototype.Validate = function () {
+      return false;
+   }
+   b2PolygonShape.prototype.b2PolygonShape = function () {
+      this.__super.b2Shape.call(this);
+      this.m_type = b2Shape.e_polygonShape;
+      this.m_centroid = new b2Vec2();
+      this.m_vertices = new Vector();
+      this.m_normals = new Vector();
+   }
+   b2PolygonShape.prototype.Reserve = function (count) {
+      if (count === undefined) count = 0;
+      for (var i = parseInt(this.m_vertices.length); i < count; i++) {
+         this.m_vertices[i] = new b2Vec2();
+         this.m_normals[i] = new b2Vec2();
+      }
+   }
+   b2PolygonShape.ComputeCentroid = function (vs, count) {
+      if (count === undefined) count = 0;
+      var c = new b2Vec2();
+      var area = 0.0;
+      var p1X = 0.0;
+      var p1Y = 0.0;
+      var inv3 = 1.0 / 3.0;
+      for (var i = 0; i < count; ++i) {
+         var p2 = vs[i];
+         var p3 = i + 1 < count ? vs[parseInt(i + 1)] : vs[0];
+         var e1X = p2.x - p1X;
+         var e1Y = p2.y - p1Y;
+         var e2X = p3.x - p1X;
+         var e2Y = p3.y - p1Y;
+         var D = (e1X * e2Y - e1Y * e2X);
+         var triangleArea = 0.5 * D;area += triangleArea;
+         c.x += triangleArea * inv3 * (p1X + p2.x + p3.x);
+         c.y += triangleArea * inv3 * (p1Y + p2.y + p3.y);
+      }
+      c.x *= 1.0 / area;
+      c.y *= 1.0 / area;
+      return c;
+   }
+   b2PolygonShape.ComputeOBB = function (obb, vs, count) {
+      if (count === undefined) count = 0;
+      var i = 0;
+      var p = new Vector(count + 1);
+      for (i = 0;
+      i < count; ++i) {
+         p[i] = vs[i];
+      }
+      p[count] = p[0];
+      var minArea = Number.MAX_VALUE;
+      for (i = 1;
+      i <= count; ++i) {
+         var root = p[parseInt(i - 1)];
+         var uxX = p[i].x - root.x;
+         var uxY = p[i].y - root.y;
+         var length = Math.sqrt(uxX * uxX + uxY * uxY);
+         uxX /= length;
+         uxY /= length;
+         var uyX = (-uxY);
+         var uyY = uxX;
+         var lowerX = Number.MAX_VALUE;
+         var lowerY = Number.MAX_VALUE;
+         var upperX = (-Number.MAX_VALUE);
+         var upperY = (-Number.MAX_VALUE);
+         for (var j = 0; j < count; ++j) {
+            var dX = p[j].x - root.x;
+            var dY = p[j].y - root.y;
+            var rX = (uxX * dX + uxY * dY);
+            var rY = (uyX * dX + uyY * dY);
+            if (rX < lowerX) lowerX = rX;
+            if (rY < lowerY) lowerY = rY;
+            if (rX > upperX) upperX = rX;
+            if (rY > upperY) upperY = rY;
+         }
+         var area = (upperX - lowerX) * (upperY - lowerY);
+         if (area < 0.95 * minArea) {
+            minArea = area;
+            obb.R.col1.x = uxX;
+            obb.R.col1.y = uxY;
+            obb.R.col2.x = uyX;
+            obb.R.col2.y = uyY;
+            var centerX = 0.5 * (lowerX + upperX);
+            var centerY = 0.5 * (lowerY + upperY);
+            var tMat = obb.R;
+            obb.center.x = root.x + (tMat.col1.x * centerX + tMat.col2.x * centerY);
+            obb.center.y = root.y + (tMat.col1.y * centerX + tMat.col2.y * centerY);
+            obb.extents.x = 0.5 * (upperX - lowerX);
+            obb.extents.y = 0.5 * (upperY - lowerY);
+         }
+      }
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Collision.Shapes.b2PolygonShape.s_mat = new b2Mat22();
+   });
+   b2Shape.b2Shape = function () {};
+   b2Shape.prototype.Copy = function () {
+      return null;
+   }
+   b2Shape.prototype.Set = function (other) {
+      this.m_radius = other.m_radius;
+   }
+   b2Shape.prototype.GetType = function () {
+      return this.m_type;
+   }
+   b2Shape.prototype.TestPoint = function (xf, p) {
+      return false;
+   }
+   b2Shape.prototype.RayCast = function (output, input, transform) {
+      return false;
+   }
+   b2Shape.prototype.ComputeAABB = function (aabb, xf) {}
+   b2Shape.prototype.ComputeMass = function (massData, density) {
+      if (density === undefined) density = 0;
+   }
+   b2Shape.prototype.ComputeSubmergedArea = function (normal, offset, xf, c) {
+      if (offset === undefined) offset = 0;
+      return 0;
+   }
+   b2Shape.TestOverlap = function (shape1, transform1, shape2, transform2) {
+      var input = new b2DistanceInput();
+      input.proxyA = new b2DistanceProxy();
+      input.proxyA.Set(shape1);
+      input.proxyB = new b2DistanceProxy();
+      input.proxyB.Set(shape2);
+      input.transformA = transform1;
+      input.transformB = transform2;
+      input.useRadii = true;
+      var simplexCache = new b2SimplexCache();
+      simplexCache.count = 0;
+      var output = new b2DistanceOutput();
+      b2Distance.Distance(output, simplexCache, input);
+      return output.distance < 10.0 * Number.MIN_VALUE;
+   }
+   b2Shape.prototype.b2Shape = function () {
+      this.m_type = b2Shape.e_unknownShape;
+      this.m_radius = b2Settings.b2_linearSlop;
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Collision.Shapes.b2Shape.e_unknownShape = parseInt((-1));
+      Box2D.Collision.Shapes.b2Shape.e_circleShape = 0;
+      Box2D.Collision.Shapes.b2Shape.e_polygonShape = 1;
+      Box2D.Collision.Shapes.b2Shape.e_edgeShape = 2;
+      Box2D.Collision.Shapes.b2Shape.e_shapeTypeCount = 3;
+      Box2D.Collision.Shapes.b2Shape.e_hitCollide = 1;
+      Box2D.Collision.Shapes.b2Shape.e_missCollide = 0;
+      Box2D.Collision.Shapes.b2Shape.e_startsInsideCollide = parseInt((-1));
+   });
+})();
+(function () {
+   var b2Color = Box2D.Common.b2Color,
+      b2internal = Box2D.Common.b2internal,
+      b2Settings = Box2D.Common.b2Settings,
+      b2Mat22 = Box2D.Common.Math.b2Mat22,
+      b2Mat33 = Box2D.Common.Math.b2Mat33,
+      b2Math = Box2D.Common.Math.b2Math,
+      b2Sweep = Box2D.Common.Math.b2Sweep,
+      b2Transform = Box2D.Common.Math.b2Transform,
+      b2Vec2 = Box2D.Common.Math.b2Vec2,
+      b2Vec3 = Box2D.Common.Math.b2Vec3;
+
+   b2Color.b2Color = function () {
+      this._r = 0;
+      this._g = 0;
+      this._b = 0;
+   };
+   b2Color.prototype.b2Color = function (rr, gg, bb) {
+      if (rr === undefined) rr = 0;
+      if (gg === undefined) gg = 0;
+      if (bb === undefined) bb = 0;
+      this._r = Box2D.parseUInt(255 * b2Math.Clamp(rr, 0.0, 1.0));
+      this._g = Box2D.parseUInt(255 * b2Math.Clamp(gg, 0.0, 1.0));
+      this._b = Box2D.parseUInt(255 * b2Math.Clamp(bb, 0.0, 1.0));
+   }
+   b2Color.prototype.Set = function (rr, gg, bb) {
+      if (rr === undefined) rr = 0;
+      if (gg === undefined) gg = 0;
+      if (bb === undefined) bb = 0;
+      this._r = Box2D.parseUInt(255 * b2Math.Clamp(rr, 0.0, 1.0));
+      this._g = Box2D.parseUInt(255 * b2Math.Clamp(gg, 0.0, 1.0));
+      this._b = Box2D.parseUInt(255 * b2Math.Clamp(bb, 0.0, 1.0));
+   }
+   Object.defineProperty(b2Color.prototype, 'r', {
+      enumerable: false,
+      configurable: true,
+      set: function (rr) {
+         if (rr === undefined) rr = 0;
+         this._r = Box2D.parseUInt(255 * b2Math.Clamp(rr, 0.0, 1.0));
+      }
+   });
+   Object.defineProperty(b2Color.prototype, 'g', {
+      enumerable: false,
+      configurable: true,
+      set: function (gg) {
+         if (gg === undefined) gg = 0;
+         this._g = Box2D.parseUInt(255 * b2Math.Clamp(gg, 0.0, 1.0));
+      }
+   });
+   Object.defineProperty(b2Color.prototype, 'b', {
+      enumerable: false,
+      configurable: true,
+      set: function (bb) {
+         if (bb === undefined) bb = 0;
+         this._b = Box2D.parseUInt(255 * b2Math.Clamp(bb, 0.0, 1.0));
+      }
+   });
+   Object.defineProperty(b2Color.prototype, 'color', {
+      enumerable: false,
+      configurable: true,
+      get: function () {
+         return (this._r << 16) | (this._g << 8) | (this._b);
+      }
+   });
+   b2Settings.b2Settings = function () {};
+   b2Settings.b2MixFriction = function (friction1, friction2) {
+      if (friction1 === undefined) friction1 = 0;
+      if (friction2 === undefined) friction2 = 0;
+      return Math.sqrt(friction1 * friction2);
+   }
+   b2Settings.b2MixRestitution = function (restitution1, restitution2) {
+      if (restitution1 === undefined) restitution1 = 0;
+      if (restitution2 === undefined) restitution2 = 0;
+      return restitution1 > restitution2 ? restitution1 : restitution2;
+   }
+   b2Settings.b2Assert = function (a) {
+      if (!a) {
+         throw "Assertion Failed";
+      }
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Common.b2Settings.VERSION = "2.1alpha";
+      Box2D.Common.b2Settings.USHRT_MAX = 0x0000ffff;
+      Box2D.Common.b2Settings.b2_pi = Math.PI;
+      Box2D.Common.b2Settings.b2_maxManifoldPoints = 2;
+      Box2D.Common.b2Settings.b2_aabbExtension = 0.1;
+      Box2D.Common.b2Settings.b2_aabbMultiplier = 2.0;
+      Box2D.Common.b2Settings.b2_polygonRadius = 2.0 * b2Settings.b2_linearSlop;
+      Box2D.Common.b2Settings.b2_linearSlop = 0.005;
+      Box2D.Common.b2Settings.b2_angularSlop = 2.0 / 180.0 * b2Settings.b2_pi;
+      Box2D.Common.b2Settings.b2_toiSlop = 8.0 * b2Settings.b2_linearSlop;
+      Box2D.Common.b2Settings.b2_maxTOIContactsPerIsland = 32;
+      Box2D.Common.b2Settings.b2_maxTOIJointsPerIsland = 32;
+      Box2D.Common.b2Settings.b2_velocityThreshold = 1.0;
+      Box2D.Common.b2Settings.b2_maxLinearCorrection = 0.2;
+      Box2D.Common.b2Settings.b2_maxAngularCorrection = 8.0 / 180.0 * b2Settings.b2_pi;
+      Box2D.Common.b2Settings.b2_maxTranslation = 2.0;
+      Box2D.Common.b2Settings.b2_maxTranslationSquared = b2Settings.b2_maxTranslation * b2Settings.b2_maxTranslation;
+      Box2D.Common.b2Settings.b2_maxRotation = 0.5 * b2Settings.b2_pi;
+      Box2D.Common.b2Settings.b2_maxRotationSquared = b2Settings.b2_maxRotation * b2Settings.b2_maxRotation;
+      Box2D.Common.b2Settings.b2_contactBaumgarte = 0.2;
+      Box2D.Common.b2Settings.b2_timeToSleep = 0.5;
+      Box2D.Common.b2Settings.b2_linearSleepTolerance = 0.01;
+      Box2D.Common.b2Settings.b2_angularSleepTolerance = 2.0 / 180.0 * b2Settings.b2_pi;
+   });
+})();
+(function () {
+   var b2AABB = Box2D.Collision.b2AABB,
+      b2Color = Box2D.Common.b2Color,
+      b2internal = Box2D.Common.b2internal,
+      b2Settings = Box2D.Common.b2Settings,
+      b2Mat22 = Box2D.Common.Math.b2Mat22,
+      b2Mat33 = Box2D.Common.Math.b2Mat33,
+      b2Math = Box2D.Common.Math.b2Math,
+      b2Sweep = Box2D.Common.Math.b2Sweep,
+      b2Transform = Box2D.Common.Math.b2Transform,
+      b2Vec2 = Box2D.Common.Math.b2Vec2,
+      b2Vec3 = Box2D.Common.Math.b2Vec3;
+
+   b2Mat22.b2Mat22 = function () {
+      this.col1 = new b2Vec2();
+      this.col2 = new b2Vec2();
+   };
+   b2Mat22.prototype.b2Mat22 = function () {
+      this.SetIdentity();
+   }
+   b2Mat22.FromAngle = function (angle) {
+      if (angle === undefined) angle = 0;
+      var mat = new b2Mat22();
+      mat.Set(angle);
+      return mat;
+   }
+   b2Mat22.FromVV = function (c1, c2) {
+      var mat = new b2Mat22();
+      mat.SetVV(c1, c2);
+      return mat;
+   }
+   b2Mat22.prototype.Set = function (angle) {
+      if (angle === undefined) angle = 0;
+      var c = Math.cos(angle);
+      var s = Math.sin(angle);
+      this.col1.x = c;
+      this.col2.x = (-s);
+      this.col1.y = s;
+      this.col2.y = c;
+   }
+   b2Mat22.prototype.SetVV = function (c1, c2) {
+      this.col1.SetV(c1);
+      this.col2.SetV(c2);
+   }
+   b2Mat22.prototype.Copy = function () {
+      var mat = new b2Mat22();
+      mat.SetM(this);
+      return mat;
+   }
+   b2Mat22.prototype.SetM = function (m) {
+      this.col1.SetV(m.col1);
+      this.col2.SetV(m.col2);
+   }
+   b2Mat22.prototype.AddM = function (m) {
+      this.col1.x += m.col1.x;
+      this.col1.y += m.col1.y;
+      this.col2.x += m.col2.x;
+      this.col2.y += m.col2.y;
+   }
+   b2Mat22.prototype.SetIdentity = function () {
+      this.col1.x = 1.0;
+      this.col2.x = 0.0;
+      this.col1.y = 0.0;
+      this.col2.y = 1.0;
+   }
+   b2Mat22.prototype.SetZero = function () {
+      this.col1.x = 0.0;
+      this.col2.x = 0.0;
+      this.col1.y = 0.0;
+      this.col2.y = 0.0;
+   }
+   b2Mat22.prototype.GetAngle = function () {
+      return Math.atan2(this.col1.y, this.col1.x);
+   }
+   b2Mat22.prototype.GetInverse = function (out) {
+      var a = this.col1.x;
+      var b = this.col2.x;
+      var c = this.col1.y;
+      var d = this.col2.y;
+      var det = a * d - b * c;
+      if (det != 0.0) {
+         det = 1.0 / det;
+      }
+      out.col1.x = det * d;
+      out.col2.x = (-det * b);
+      out.col1.y = (-det * c);
+      out.col2.y = det * a;
+      return out;
+   }
+   b2Mat22.prototype.Solve = function (out, bX, bY) {
+      if (bX === undefined) bX = 0;
+      if (bY === undefined) bY = 0;
+      var a11 = this.col1.x;
+      var a12 = this.col2.x;
+      var a21 = this.col1.y;
+      var a22 = this.col2.y;
+      var det = a11 * a22 - a12 * a21;
+      if (det != 0.0) {
+         det = 1.0 / det;
+      }
+      out.x = det * (a22 * bX - a12 * bY);
+      out.y = det * (a11 * bY - a21 * bX);
+      return out;
+   }
+   b2Mat22.prototype.Abs = function () {
+      this.col1.Abs();
+      this.col2.Abs();
+   }
+   b2Mat33.b2Mat33 = function () {
+      this.col1 = new b2Vec3();
+      this.col2 = new b2Vec3();
+      this.col3 = new b2Vec3();
+   };
+   b2Mat33.prototype.b2Mat33 = function (c1, c2, c3) {
+      if (c1 === undefined) c1 = null;
+      if (c2 === undefined) c2 = null;
+      if (c3 === undefined) c3 = null;
+      if (!c1 && !c2 && !c3) {
+         this.col1.SetZero();
+         this.col2.SetZero();
+         this.col3.SetZero();
+      }
+      else {
+         this.col1.SetV(c1);
+         this.col2.SetV(c2);
+         this.col3.SetV(c3);
+      }
+   }
+   b2Mat33.prototype.SetVVV = function (c1, c2, c3) {
+      this.col1.SetV(c1);
+      this.col2.SetV(c2);
+      this.col3.SetV(c3);
+   }
+   b2Mat33.prototype.Copy = function () {
+      return new b2Mat33(this.col1, this.col2, this.col3);
+   }
+   b2Mat33.prototype.SetM = function (m) {
+      this.col1.SetV(m.col1);
+      this.col2.SetV(m.col2);
+      this.col3.SetV(m.col3);
+   }
+   b2Mat33.prototype.AddM = function (m) {
+      this.col1.x += m.col1.x;
+      this.col1.y += m.col1.y;
+      this.col1.z += m.col1.z;
+      this.col2.x += m.col2.x;
+      this.col2.y += m.col2.y;
+      this.col2.z += m.col2.z;
+      this.col3.x += m.col3.x;
+      this.col3.y += m.col3.y;
+      this.col3.z += m.col3.z;
+   }
+   b2Mat33.prototype.SetIdentity = function () {
+      this.col1.x = 1.0;
+      this.col2.x = 0.0;
+      this.col3.x = 0.0;
+      this.col1.y = 0.0;
+      this.col2.y = 1.0;
+      this.col3.y = 0.0;
+      this.col1.z = 0.0;
+      this.col2.z = 0.0;
+      this.col3.z = 1.0;
+   }
+   b2Mat33.prototype.SetZero = function () {
+      this.col1.x = 0.0;
+      this.col2.x = 0.0;
+      this.col3.x = 0.0;
+      this.col1.y = 0.0;
+      this.col2.y = 0.0;
+      this.col3.y = 0.0;
+      this.col1.z = 0.0;
+      this.col2.z = 0.0;
+      this.col3.z = 0.0;
+   }
+   b2Mat33.prototype.Solve22 = function (out, bX, bY) {
+      if (bX === undefined) bX = 0;
+      if (bY === undefined) bY = 0;
+      var a11 = this.col1.x;
+      var a12 = this.col2.x;
+      var a21 = this.col1.y;
+      var a22 = this.col2.y;
+      var det = a11 * a22 - a12 * a21;
+      if (det != 0.0) {
+         det = 1.0 / det;
+      }
+      out.x = det * (a22 * bX - a12 * bY);
+      out.y = det * (a11 * bY - a21 * bX);
+      return out;
+   }
+   b2Mat33.prototype.Solve33 = function (out, bX, bY, bZ) {
+      if (bX === undefined) bX = 0;
+      if (bY === undefined) bY = 0;
+      if (bZ === undefined) bZ = 0;
+      var a11 = this.col1.x;
+      var a21 = this.col1.y;
+      var a31 = this.col1.z;
+      var a12 = this.col2.x;
+      var a22 = this.col2.y;
+      var a32 = this.col2.z;
+      var a13 = this.col3.x;
+      var a23 = this.col3.y;
+      var a33 = this.col3.z;
+      var det = a11 * (a22 * a33 - a32 * a23) + a21 * (a32 * a13 - a12 * a33) + a31 * (a12 * a23 - a22 * a13);
+      if (det != 0.0) {
+         det = 1.0 / det;
+      }
+      out.x = det * (bX * (a22 * a33 - a32 * a23) + bY * (a32 * a13 - a12 * a33) + bZ * (a12 * a23 - a22 * a13));
+      out.y = det * (a11 * (bY * a33 - bZ * a23) + a21 * (bZ * a13 - bX * a33) + a31 * (bX * a23 - bY * a13));
+      out.z = det * (a11 * (a22 * bZ - a32 * bY) + a21 * (a32 * bX - a12 * bZ) + a31 * (a12 * bY - a22 * bX));
+      return out;
+   }
+   b2Math.b2Math = function () {};
+   b2Math.IsValid = function (x) {
+      if (x === undefined) x = 0;
+      return isFinite(x);
+   }
+   b2Math.Dot = function (a, b) {
+      return a.x * b.x + a.y * b.y;
+   }
+   b2Math.CrossVV = function (a, b) {
+      return a.x * b.y - a.y * b.x;
+   }
+   b2Math.CrossVF = function (a, s) {
+      if (s === undefined) s = 0;
+      var v = new b2Vec2(s * a.y, (-s * a.x));
+      return v;
+   }
+   b2Math.CrossFV = function (s, a) {
+      if (s === undefined) s = 0;
+      var v = new b2Vec2((-s * a.y), s * a.x);
+      return v;
+   }
+   b2Math.MulMV = function (A, v) {
+      var u = new b2Vec2(A.col1.x * v.x + A.col2.x * v.y, A.col1.y * v.x + A.col2.y * v.y);
+      return u;
+   }
+   b2Math.MulTMV = function (A, v) {
+      var u = new b2Vec2(b2Math.Dot(v, A.col1), b2Math.Dot(v, A.col2));
+      return u;
+   }
+   b2Math.MulX = function (T, v) {
+      var a = b2Math.MulMV(T.R, v);
+      a.x += T.position.x;
+      a.y += T.position.y;
+      return a;
+   }
+   b2Math.MulXT = function (T, v) {
+      var a = b2Math.SubtractVV(v, T.position);
+      var tX = (a.x * T.R.col1.x + a.y * T.R.col1.y);
+      a.y = (a.x * T.R.col2.x + a.y * T.R.col2.y);
+      a.x = tX;
+      return a;
+   }
+   b2Math.AddVV = function (a, b) {
+      var v = new b2Vec2(a.x + b.x, a.y + b.y);
+      return v;
+   }
+   b2Math.SubtractVV = function (a, b) {
+      var v = new b2Vec2(a.x - b.x, a.y - b.y);
+      return v;
+   }
+   b2Math.Distance = function (a, b) {
+      var cX = a.x - b.x;
+      var cY = a.y - b.y;
+      return Math.sqrt(cX * cX + cY * cY);
+   }
+   b2Math.DistanceSquared = function (a, b) {
+      var cX = a.x - b.x;
+      var cY = a.y - b.y;
+      return (cX * cX + cY * cY);
+   }
+   b2Math.MulFV = function (s, a) {
+      if (s === undefined) s = 0;
+      var v = new b2Vec2(s * a.x, s * a.y);
+      return v;
+   }
+   b2Math.AddMM = function (A, B) {
+      var C = b2Mat22.FromVV(b2Math.AddVV(A.col1, B.col1), b2Math.AddVV(A.col2, B.col2));
+      return C;
+   }
+   b2Math.MulMM = function (A, B) {
+      var C = b2Mat22.FromVV(b2Math.MulMV(A, B.col1), b2Math.MulMV(A, B.col2));
+      return C;
+   }
+   b2Math.MulTMM = function (A, B) {
+      var c1 = new b2Vec2(b2Math.Dot(A.col1, B.col1), b2Math.Dot(A.col2, B.col1));
+      var c2 = new b2Vec2(b2Math.Dot(A.col1, B.col2), b2Math.Dot(A.col2, B.col2));
+      var C = b2Mat22.FromVV(c1, c2);
+      return C;
+   }
+   b2Math.Abs = function (a) {
+      if (a === undefined) a = 0;
+      return a > 0.0 ? a : (-a);
+   }
+   b2Math.AbsV = function (a) {
+      var b = new b2Vec2(b2Math.Abs(a.x), b2Math.Abs(a.y));
+      return b;
+   }
+   b2Math.AbsM = function (A) {
+      var B = b2Mat22.FromVV(b2Math.AbsV(A.col1), b2Math.AbsV(A.col2));
+      return B;
+   }
+   b2Math.Min = function (a, b) {
+      if (a === undefined) a = 0;
+      if (b === undefined) b = 0;
+      return a < b ? a : b;
+   }
+   b2Math.MinV = function (a, b) {
+      var c = new b2Vec2(b2Math.Min(a.x, b.x), b2Math.Min(a.y, b.y));
+      return c;
+   }
+   b2Math.Max = function (a, b) {
+      if (a === undefined) a = 0;
+      if (b === undefined) b = 0;
+      return a > b ? a : b;
+   }
+   b2Math.MaxV = function (a, b) {
+      var c = new b2Vec2(b2Math.Max(a.x, b.x), b2Math.Max(a.y, b.y));
+      return c;
+   }
+   b2Math.Clamp = function (a, low, high) {
+      if (a === undefined) a = 0;
+      if (low === undefined) low = 0;
+      if (high === undefined) high = 0;
+      return a < low ? low : a > high ? high : a;
+   }
+   b2Math.ClampV = function (a, low, high) {
+      return b2Math.MaxV(low, b2Math.MinV(a, high));
+   }
+   b2Math.Swap = function (a, b) {
+      var tmp = a[0];
+      a[0] = b[0];
+      b[0] = tmp;
+   }
+   b2Math.Random = function () {
+      return Math.random() * 2 - 1;
+   }
+   b2Math.RandomRange = function (lo, hi) {
+      if (lo === undefined) lo = 0;
+      if (hi === undefined) hi = 0;
+      var r = Math.random();
+      r = (hi - lo) * r + lo;
+      return r;
+   }
+   b2Math.NextPowerOfTwo = function (x) {
+      if (x === undefined) x = 0;
+      x |= (x >> 1) & 0x7FFFFFFF;
+      x |= (x >> 2) & 0x3FFFFFFF;
+      x |= (x >> 4) & 0x0FFFFFFF;
+      x |= (x >> 8) & 0x00FFFFFF;
+      x |= (x >> 16) & 0x0000FFFF;
+      return x + 1;
+   }
+   b2Math.IsPowerOfTwo = function (x) {
+      if (x === undefined) x = 0;
+      var result = x > 0 && (x & (x - 1)) == 0;
+      return result;
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Common.Math.b2Math.b2Vec2_zero = new b2Vec2(0.0, 0.0);
+      Box2D.Common.Math.b2Math.b2Mat22_identity = b2Mat22.FromVV(new b2Vec2(1.0, 0.0), new b2Vec2(0.0, 1.0));
+      Box2D.Common.Math.b2Math.b2Transform_identity = new b2Transform(b2Math.b2Vec2_zero, b2Math.b2Mat22_identity);
+   });
+   b2Sweep.b2Sweep = function () {
+      this.localCenter = new b2Vec2();
+      this.c0 = new b2Vec2;
+      this.c = new b2Vec2();
+   };
+   b2Sweep.prototype.Set = function (other) {
+      this.localCenter.SetV(other.localCenter);
+      this.c0.SetV(other.c0);
+      this.c.SetV(other.c);
+      this.a0 = other.a0;
+      this.a = other.a;
+      this.t0 = other.t0;
+   }
+   b2Sweep.prototype.Copy = function () {
+      var copy = new b2Sweep();
+      copy.localCenter.SetV(this.localCenter);
+      copy.c0.SetV(this.c0);
+      copy.c.SetV(this.c);
+      copy.a0 = this.a0;
+      copy.a = this.a;
+      copy.t0 = this.t0;
+      return copy;
+   }
+   b2Sweep.prototype.GetTransform = function (xf, alpha) {
+      if (alpha === undefined) alpha = 0;
+      xf.position.x = (1.0 - alpha) * this.c0.x + alpha * this.c.x;
+      xf.position.y = (1.0 - alpha) * this.c0.y + alpha * this.c.y;
+      var angle = (1.0 - alpha) * this.a0 + alpha * this.a;
+      xf.R.Set(angle);
+      var tMat = xf.R;
+      xf.position.x -= (tMat.col1.x * this.localCenter.x + tMat.col2.x * this.localCenter.y);
+      xf.position.y -= (tMat.col1.y * this.localCenter.x + tMat.col2.y * this.localCenter.y);
+   }
+   b2Sweep.prototype.Advance = function (t) {
+      if (t === undefined) t = 0;
+      if (this.t0 < t && 1.0 - this.t0 > Number.MIN_VALUE) {
+         var alpha = (t - this.t0) / (1.0 - this.t0);
+         this.c0.x = (1.0 - alpha) * this.c0.x + alpha * this.c.x;
+         this.c0.y = (1.0 - alpha) * this.c0.y + alpha * this.c.y;
+         this.a0 = (1.0 - alpha) * this.a0 + alpha * this.a;
+         this.t0 = t;
+      }
+   }
+   b2Transform.b2Transform = function () {
+      this.position = new b2Vec2;
+      this.R = new b2Mat22();
+   };
+   b2Transform.prototype.b2Transform = function (pos, r) {
+      if (pos === undefined) pos = null;
+      if (r === undefined) r = null;
+      if (pos) {
+         this.position.SetV(pos);
+         this.R.SetM(r);
+      }
+   }
+   b2Transform.prototype.Initialize = function (pos, r) {
+      this.position.SetV(pos);
+      this.R.SetM(r);
+   }
+   b2Transform.prototype.SetIdentity = function () {
+      this.position.SetZero();
+      this.R.SetIdentity();
+   }
+   b2Transform.prototype.Set = function (x) {
+      this.position.SetV(x.position);
+      this.R.SetM(x.R);
+   }
+   b2Transform.prototype.GetAngle = function () {
+      return Math.atan2(this.R.col1.y, this.R.col1.x);
+   }
+   b2Vec2.b2Vec2 = function () {};
+   b2Vec2.prototype.b2Vec2 = function (x_, y_) {
+      if (x_ === undefined) x_ = 0;
+      if (y_ === undefined) y_ = 0;
+      this.x = x_;
+      this.y = y_;
+   }
+   b2Vec2.prototype.SetZero = function () {
+      this.x = 0.0;
+      this.y = 0.0;
+   }
+   b2Vec2.prototype.Set = function (x_, y_) {
+      if (x_ === undefined) x_ = 0;
+      if (y_ === undefined) y_ = 0;
+      this.x = x_;
+      this.y = y_;
+   }
+   b2Vec2.prototype.SetV = function (v) {
+      this.x = v.x;
+      this.y = v.y;
+   }
+   b2Vec2.prototype.GetNegative = function () {
+      return new b2Vec2((-this.x), (-this.y));
+   }
+   b2Vec2.prototype.NegativeSelf = function () {
+      this.x = (-this.x);
+      this.y = (-this.y);
+   }
+   b2Vec2.Make = function (x_, y_) {
+      if (x_ === undefined) x_ = 0;
+      if (y_ === undefined) y_ = 0;
+      return new b2Vec2(x_, y_);
+   }
+   b2Vec2.prototype.Copy = function () {
+      return new b2Vec2(this.x, this.y);
+   }
+   b2Vec2.prototype.Add = function (v) {
+      this.x += v.x;
+      this.y += v.y;
+   }
+   b2Vec2.prototype.Subtract = function (v) {
+      this.x -= v.x;
+      this.y -= v.y;
+   }
+   b2Vec2.prototype.Multiply = function (a) {
+      if (a === undefined) a = 0;
+      this.x *= a;
+      this.y *= a;
+   }
+   b2Vec2.prototype.MulM = function (A) {
+      var tX = this.x;
+      this.x = A.col1.x * tX + A.col2.x * this.y;
+      this.y = A.col1.y * tX + A.col2.y * this.y;
+   }
+   b2Vec2.prototype.MulTM = function (A) {
+      var tX = b2Math.Dot(this, A.col1);
+      this.y = b2Math.Dot(this, A.col2);
+      this.x = tX;
+   }
+   b2Vec2.prototype.CrossVF = function (s) {
+      if (s === undefined) s = 0;
+      var tX = this.x;
+      this.x = s * this.y;
+      this.y = (-s * tX);
+   }
+   b2Vec2.prototype.CrossFV = function (s) {
+      if (s === undefined) s = 0;
+      var tX = this.x;
+      this.x = (-s * this.y);
+      this.y = s * tX;
+   }
+   b2Vec2.prototype.MinV = function (b) {
+      this.x = this.x < b.x ? this.x : b.x;
+      this.y = this.y < b.y ? this.y : b.y;
+   }
+   b2Vec2.prototype.MaxV = function (b) {
+      this.x = this.x > b.x ? this.x : b.x;
+      this.y = this.y > b.y ? this.y : b.y;
+   }
+   b2Vec2.prototype.Abs = function () {
+      if (this.x < 0) this.x = (-this.x);
+      if (this.y < 0) this.y = (-this.y);
+   }
+   b2Vec2.prototype.Length = function () {
+      return Math.sqrt(this.x * this.x + this.y * this.y);
+   }
+   b2Vec2.prototype.LengthSquared = function () {
+      return (this.x * this.x + this.y * this.y);
+   }
+   b2Vec2.prototype.Normalize = function () {
+      var length = Math.sqrt(this.x * this.x + this.y * this.y);
+      if (length < Number.MIN_VALUE) {
+         return 0.0;
+      }
+      var invLength = 1.0 / length;
+      this.x *= invLength;
+      this.y *= invLength;
+      return length;
+   }
+   b2Vec2.prototype.IsValid = function () {
+      return b2Math.IsValid(this.x) && b2Math.IsValid(this.y);
+   }
+   b2Vec3.b2Vec3 = function () {};
+   b2Vec3.prototype.b2Vec3 = function (x, y, z) {
+      if (x === undefined) x = 0;
+      if (y === undefined) y = 0;
+      if (z === undefined) z = 0;
+      this.x = x;
+      this.y = y;
+      this.z = z;
+   }
+   b2Vec3.prototype.SetZero = function () {
+      this.x = this.y = this.z = 0.0;
+   }
+   b2Vec3.prototype.Set = function (x, y, z) {
+      if (x === undefined) x = 0;
+      if (y === undefined) y = 0;
+      if (z === undefined) z = 0;
+      this.x = x;
+      this.y = y;
+      this.z = z;
+   }
+   b2Vec3.prototype.SetV = function (v) {
+      this.x = v.x;
+      this.y = v.y;
+      this.z = v.z;
+   }
+   b2Vec3.prototype.GetNegative = function () {
+      return new b2Vec3((-this.x), (-this.y), (-this.z));
+   }
+   b2Vec3.prototype.NegativeSelf = function () {
+      this.x = (-this.x);
+      this.y = (-this.y);
+      this.z = (-this.z);
+   }
+   b2Vec3.prototype.Copy = function () {
+      return new b2Vec3(this.x, this.y, this.z);
+   }
+   b2Vec3.prototype.Add = function (v) {
+      this.x += v.x;
+      this.y += v.y;
+      this.z += v.z;
+   }
+   b2Vec3.prototype.Subtract = function (v) {
+      this.x -= v.x;
+      this.y -= v.y;
+      this.z -= v.z;
+   }
+   b2Vec3.prototype.Multiply = function (a) {
+      if (a === undefined) a = 0;
+      this.x *= a;
+      this.y *= a;
+      this.z *= a;
+   }
+})();
+(function () {
+   var b2ControllerEdge = Box2D.Dynamics.Controllers.b2ControllerEdge,
+      b2Mat22 = Box2D.Common.Math.b2Mat22,
+      b2Mat33 = Box2D.Common.Math.b2Mat33,
+      b2Math = Box2D.Common.Math.b2Math,
+      b2Sweep = Box2D.Common.Math.b2Sweep,
+      b2Transform = Box2D.Common.Math.b2Transform,
+      b2Vec2 = Box2D.Common.Math.b2Vec2,
+      b2Vec3 = Box2D.Common.Math.b2Vec3,
+      b2Color = Box2D.Common.b2Color,
+      b2internal = Box2D.Common.b2internal,
+      b2Settings = Box2D.Common.b2Settings,
+      b2AABB = Box2D.Collision.b2AABB,
+      b2Bound = Box2D.Collision.b2Bound,
+      b2BoundValues = Box2D.Collision.b2BoundValues,
+      b2Collision = Box2D.Collision.b2Collision,
+      b2ContactID = Box2D.Collision.b2ContactID,
+      b2ContactPoint = Box2D.Collision.b2ContactPoint,
+      b2Distance = Box2D.Collision.b2Distance,
+      b2DistanceInput = Box2D.Collision.b2DistanceInput,
+      b2DistanceOutput = Box2D.Collision.b2DistanceOutput,
+      b2DistanceProxy = Box2D.Collision.b2DistanceProxy,
+      b2DynamicTree = Box2D.Collision.b2DynamicTree,
+      b2DynamicTreeBroadPhase = Box2D.Collision.b2DynamicTreeBroadPhase,
+      b2DynamicTreeNode = Box2D.Collision.b2DynamicTreeNode,
+      b2DynamicTreePair = Box2D.Collision.b2DynamicTreePair,
+      b2Manifold = Box2D.Collision.b2Manifold,
+      b2ManifoldPoint = Box2D.Collision.b2ManifoldPoint,
+      b2Point = Box2D.Collision.b2Point,
+      b2RayCastInput = Box2D.Collision.b2RayCastInput,
+      b2RayCastOutput = Box2D.Collision.b2RayCastOutput,
+      b2Segment = Box2D.Collision.b2Segment,
+      b2SeparationFunction = Box2D.Collision.b2SeparationFunction,
+      b2Simplex = Box2D.Collision.b2Simplex,
+      b2SimplexCache = Box2D.Collision.b2SimplexCache,
+      b2SimplexVertex = Box2D.Collision.b2SimplexVertex,
+      b2TimeOfImpact = Box2D.Collision.b2TimeOfImpact,
+      b2TOIInput = Box2D.Collision.b2TOIInput,
+      b2WorldManifold = Box2D.Collision.b2WorldManifold,
+      ClipVertex = Box2D.Collision.ClipVertex,
+      Features = Box2D.Collision.Features,
+      IBroadPhase = Box2D.Collision.IBroadPhase,
+      b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
+      b2EdgeChainDef = Box2D.Collision.Shapes.b2EdgeChainDef,
+      b2EdgeShape = Box2D.Collision.Shapes.b2EdgeShape,
+      b2MassData = Box2D.Collision.Shapes.b2MassData,
+      b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
+      b2Shape = Box2D.Collision.Shapes.b2Shape,
+      b2Body = Box2D.Dynamics.b2Body,
+      b2BodyDef = Box2D.Dynamics.b2BodyDef,
+      b2ContactFilter = Box2D.Dynamics.b2ContactFilter,
+      b2ContactImpulse = Box2D.Dynamics.b2ContactImpulse,
+      b2ContactListener = Box2D.Dynamics.b2ContactListener,
+      b2ContactManager = Box2D.Dynamics.b2ContactManager,
+      b2DebugDraw = Box2D.Dynamics.b2DebugDraw,
+      b2DestructionListener = Box2D.Dynamics.b2DestructionListener,
+      b2FilterData = Box2D.Dynamics.b2FilterData,
+      b2Fixture = Box2D.Dynamics.b2Fixture,
+      b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
+      b2Island = Box2D.Dynamics.b2Island,
+      b2TimeStep = Box2D.Dynamics.b2TimeStep,
+      b2World = Box2D.Dynamics.b2World,
+      b2CircleContact = Box2D.Dynamics.Contacts.b2CircleContact,
+      b2Contact = Box2D.Dynamics.Contacts.b2Contact,
+      b2ContactConstraint = Box2D.Dynamics.Contacts.b2ContactConstraint,
+      b2ContactConstraintPoint = Box2D.Dynamics.Contacts.b2ContactConstraintPoint,
+      b2ContactEdge = Box2D.Dynamics.Contacts.b2ContactEdge,
+      b2ContactFactory = Box2D.Dynamics.Contacts.b2ContactFactory,
+      b2ContactRegister = Box2D.Dynamics.Contacts.b2ContactRegister,
+      b2ContactResult = Box2D.Dynamics.Contacts.b2ContactResult,
+      b2ContactSolver = Box2D.Dynamics.Contacts.b2ContactSolver,
+      b2EdgeAndCircleContact = Box2D.Dynamics.Contacts.b2EdgeAndCircleContact,
+      b2NullContact = Box2D.Dynamics.Contacts.b2NullContact,
+      b2PolyAndCircleContact = Box2D.Dynamics.Contacts.b2PolyAndCircleContact,
+      b2PolyAndEdgeContact = Box2D.Dynamics.Contacts.b2PolyAndEdgeContact,
+      b2PolygonContact = Box2D.Dynamics.Contacts.b2PolygonContact,
+      b2PositionSolverManifold = Box2D.Dynamics.Contacts.b2PositionSolverManifold,
+      b2Controller = Box2D.Dynamics.Controllers.b2Controller,
+      b2DistanceJoint = Box2D.Dynamics.Joints.b2DistanceJoint,
+      b2DistanceJointDef = Box2D.Dynamics.Joints.b2DistanceJointDef,
+      b2FrictionJoint = Box2D.Dynamics.Joints.b2FrictionJoint,
+      b2FrictionJointDef = Box2D.Dynamics.Joints.b2FrictionJointDef,
+      b2GearJoint = Box2D.Dynamics.Joints.b2GearJoint,
+      b2GearJointDef = Box2D.Dynamics.Joints.b2GearJointDef,
+      b2Jacobian = Box2D.Dynamics.Joints.b2Jacobian,
+      b2Joint = Box2D.Dynamics.Joints.b2Joint,
+      b2JointDef = Box2D.Dynamics.Joints.b2JointDef,
+      b2JointEdge = Box2D.Dynamics.Joints.b2JointEdge,
+      b2LineJoint = Box2D.Dynamics.Joints.b2LineJoint,
+      b2LineJointDef = Box2D.Dynamics.Joints.b2LineJointDef,
+      b2MouseJoint = Box2D.Dynamics.Joints.b2MouseJoint,
+      b2MouseJointDef = Box2D.Dynamics.Joints.b2MouseJointDef,
+      b2PrismaticJoint = Box2D.Dynamics.Joints.b2PrismaticJoint,
+      b2PrismaticJointDef = Box2D.Dynamics.Joints.b2PrismaticJointDef,
+      b2PulleyJoint = Box2D.Dynamics.Joints.b2PulleyJoint,
+      b2PulleyJointDef = Box2D.Dynamics.Joints.b2PulleyJointDef,
+      b2RevoluteJoint = Box2D.Dynamics.Joints.b2RevoluteJoint,
+      b2RevoluteJointDef = Box2D.Dynamics.Joints.b2RevoluteJointDef,
+      b2WeldJoint = Box2D.Dynamics.Joints.b2WeldJoint,
+      b2WeldJointDef = Box2D.Dynamics.Joints.b2WeldJointDef;
+
+   b2Body.b2Body = function () {
+      this.m_xf = new b2Transform();
+      this.m_sweep = new b2Sweep();
+      this.m_linearVelocity = new b2Vec2();
+      this.m_force = new b2Vec2();
+   };
+   b2Body.prototype.connectEdges = function (s1, s2, angle1) {
+      if (angle1 === undefined) angle1 = 0;
+      var angle2 = Math.atan2(s2.GetDirectionVector().y, s2.GetDirectionVector().x);
+      var coreOffset = Math.tan((angle2 - angle1) * 0.5);
+      var core = b2Math.MulFV(coreOffset, s2.GetDirectionVector());
+      core = b2Math.SubtractVV(core, s2.GetNormalVector());
+      core = b2Math.MulFV(b2Settings.b2_toiSlop, core);
+      core = b2Math.AddVV(core, s2.GetVertex1());
+      var cornerDir = b2Math.AddVV(s1.GetDirectionVector(), s2.GetDirectionVector());
+      cornerDir.Normalize();
+      var convex = b2Math.Dot(s1.GetDirectionVector(), s2.GetNormalVector()) > 0.0;
+      s1.SetNextEdge(s2, core, cornerDir, convex);
+      s2.SetPrevEdge(s1, core, cornerDir, convex);
+      return angle2;
+   }
+   b2Body.prototype.CreateFixture = function (def) {
+      if (this.m_world.IsLocked() == true) {
+         return null;
+      }
+      var fixture = new b2Fixture();
+      fixture.Create(this, this.m_xf, def);
+      if (this.m_flags & b2Body.e_activeFlag) {
+         var broadPhase = this.m_world.m_contactManager.m_broadPhase;
+         fixture.CreateProxy(broadPhase, this.m_xf);
+      }
+      fixture.m_next = this.m_fixtureList;
+      this.m_fixtureList = fixture;
+      ++this.m_fixtureCount;
+      fixture.m_body = this;
+      if (fixture.m_density > 0.0) {
+         this.ResetMassData();
+      }
+      this.m_world.m_flags |= b2World.e_newFixture;
+      return fixture;
+   }
+   b2Body.prototype.CreateFixture2 = function (shape, density) {
+      if (density === undefined) density = 0.0;
+      var def = new b2FixtureDef();
+      def.shape = shape;
+      def.density = density;
+      return this.CreateFixture(def);
+   }
+   b2Body.prototype.DestroyFixture = function (fixture) {
+      if (this.m_world.IsLocked() == true) {
+         return;
+      }
+      var node = this.m_fixtureList;
+      var ppF = null;
+      var found = false;
+      while (node != null) {
+         if (node == fixture) {
+            if (ppF) ppF.m_next = fixture.m_next;
+            else this.m_fixtureList = fixture.m_next;
+            found = true;
+            break;
+         }
+         ppF = node;
+         node = node.m_next;
+      }
+      var edge = this.m_contactList;
+      while (edge) {
+         var c = edge.contact;
+         edge = edge.next;
+         var fixtureA = c.GetFixtureA();
+         var fixtureB = c.GetFixtureB();
+         if (fixture == fixtureA || fixture == fixtureB) {
+            this.m_world.m_contactManager.Destroy(c);
+         }
+      }
+      if (this.m_flags & b2Body.e_activeFlag) {
+         var broadPhase = this.m_world.m_contactManager.m_broadPhase;
+         fixture.DestroyProxy(broadPhase);
+      }
+      else {}
+      fixture.Destroy();
+      fixture.m_body = null;
+      fixture.m_next = null;
+      --this.m_fixtureCount;
+      this.ResetMassData();
+   }
+   b2Body.prototype.SetPositionAndAngle = function (position, angle) {
+      if (angle === undefined) angle = 0;
+      var f;
+      if (this.m_world.IsLocked() == true) {
+         return;
+      }
+      this.m_xf.R.Set(angle);
+      this.m_xf.position.SetV(position);
+      var tMat = this.m_xf.R;
+      var tVec = this.m_sweep.localCenter;
+      this.m_sweep.c.x = (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      this.m_sweep.c.y = (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      this.m_sweep.c.x += this.m_xf.position.x;
+      this.m_sweep.c.y += this.m_xf.position.y;
+      this.m_sweep.c0.SetV(this.m_sweep.c);
+      this.m_sweep.a0 = this.m_sweep.a = angle;
+      var broadPhase = this.m_world.m_contactManager.m_broadPhase;
+      for (f = this.m_fixtureList;
+      f; f = f.m_next) {
+         f.Synchronize(broadPhase, this.m_xf, this.m_xf);
+      }
+      this.m_world.m_contactManager.FindNewContacts();
+   }
+   b2Body.prototype.SetTransform = function (xf) {
+      this.SetPositionAndAngle(xf.position, xf.GetAngle());
+   }
+   b2Body.prototype.GetTransform = function () {
+      return this.m_xf;
+   }
+   b2Body.prototype.GetPosition = function () {
+      return this.m_xf.position;
+   }
+   b2Body.prototype.SetPosition = function (position) {
+      this.SetPositionAndAngle(position, this.GetAngle());
+   }
+   b2Body.prototype.GetAngle = function () {
+      return this.m_sweep.a;
+   }
+   b2Body.prototype.SetAngle = function (angle) {
+      if (angle === undefined) angle = 0;
+      this.SetPositionAndAngle(this.GetPosition(), angle);
+   }
+   b2Body.prototype.GetWorldCenter = function () {
+      return this.m_sweep.c;
+   }
+   b2Body.prototype.GetLocalCenter = function () {
+      return this.m_sweep.localCenter;
+   }
+   b2Body.prototype.SetLinearVelocity = function (v) {
+      if (this.m_type == b2Body.b2_staticBody) {
+         return;
+      }
+      this.m_linearVelocity.SetV(v);
+   }
+   b2Body.prototype.GetLinearVelocity = function () {
+      return this.m_linearVelocity;
+   }
+   b2Body.prototype.SetAngularVelocity = function (omega) {
+      if (omega === undefined) omega = 0;
+      if (this.m_type == b2Body.b2_staticBody) {
+         return;
+      }
+      this.m_angularVelocity = omega;
+   }
+   b2Body.prototype.GetAngularVelocity = function () {
+      return this.m_angularVelocity;
+   }
+   b2Body.prototype.GetDefinition = function () {
+      var bd = new b2BodyDef();
+      bd.type = this.GetType();
+      bd.allowSleep = (this.m_flags & b2Body.e_allowSleepFlag) == b2Body.e_allowSleepFlag;
+      bd.angle = this.GetAngle();
+      bd.angularDamping = this.m_angularDamping;
+      bd.angularVelocity = this.m_angularVelocity;
+      bd.fixedRotation = (this.m_flags & b2Body.e_fixedRotationFlag) == b2Body.e_fixedRotationFlag;
+      bd.bullet = (this.m_flags & b2Body.e_bulletFlag) == b2Body.e_bulletFlag;
+      bd.awake = (this.m_flags & b2Body.e_awakeFlag) == b2Body.e_awakeFlag;
+      bd.linearDamping = this.m_linearDamping;
+      bd.linearVelocity.SetV(this.GetLinearVelocity());
+      bd.position = this.GetPosition();
+      bd.userData = this.GetUserData();
+      return bd;
+   }
+   b2Body.prototype.ApplyForce = function (force, point) {
+      if (this.m_type != b2Body.b2_dynamicBody) {
+         return;
+      }
+      if (this.IsAwake() == false) {
+         this.SetAwake(true);
+      }
+      this.m_force.x += force.x;
+      this.m_force.y += force.y;
+      this.m_torque += ((point.x - this.m_sweep.c.x) * force.y - (point.y - this.m_sweep.c.y) * force.x);
+   }
+   b2Body.prototype.ApplyTorque = function (torque) {
+      if (torque === undefined) torque = 0;
+      if (this.m_type != b2Body.b2_dynamicBody) {
+         return;
+      }
+      if (this.IsAwake() == false) {
+         this.SetAwake(true);
+      }
+      this.m_torque += torque;
+   }
+   b2Body.prototype.ApplyImpulse = function (impulse, point) {
+      if (this.m_type != b2Body.b2_dynamicBody) {
+         return;
+      }
+      if (this.IsAwake() == false) {
+         this.SetAwake(true);
+      }
+      this.m_linearVelocity.x += this.m_invMass * impulse.x;
+      this.m_linearVelocity.y += this.m_invMass * impulse.y;
+      this.m_angularVelocity += this.m_invI * ((point.x - this.m_sweep.c.x) * impulse.y - (point.y - this.m_sweep.c.y) * impulse.x);
+   }
+   b2Body.prototype.Split = function (callback) {
+      var linearVelocity = this.GetLinearVelocity().Copy();
+      var angularVelocity = this.GetAngularVelocity();
+      var center = this.GetWorldCenter();
+      var body1 = this;
+      var body2 = this.m_world.CreateBody(this.GetDefinition());
+      var prev;
+      for (var f = body1.m_fixtureList; f;) {
+         if (callback(f)) {
+            var next = f.m_next;
+            if (prev) {
+               prev.m_next = next;
+            }
+            else {
+               body1.m_fixtureList = next;
+            }
+            body1.m_fixtureCount--;
+            f.m_next = body2.m_fixtureList;
+            body2.m_fixtureList = f;
+            body2.m_fixtureCount++;
+            f.m_body = body2;
+            f = next;
+         }
+         else {
+            prev = f;
+            f = f.m_next;
+         }
+      }
+      body1.ResetMassData();
+      body2.ResetMassData();
+      var center1 = body1.GetWorldCenter();
+      var center2 = body2.GetWorldCenter();
+      var velocity1 = b2Math.AddVV(linearVelocity, b2Math.CrossFV(angularVelocity, b2Math.SubtractVV(center1, center)));
+      var velocity2 = b2Math.AddVV(linearVelocity, b2Math.CrossFV(angularVelocity, b2Math.SubtractVV(center2, center)));
+      body1.SetLinearVelocity(velocity1);
+      body2.SetLinearVelocity(velocity2);
+      body1.SetAngularVelocity(angularVelocity);
+      body2.SetAngularVelocity(angularVelocity);
+      body1.SynchronizeFixtures();
+      body2.SynchronizeFixtures();
+      return body2;
+   }
+   b2Body.prototype.Merge = function (other) {
+      var f;
+      for (f = other.m_fixtureList;
+      f;) {
+         var next = f.m_next;
+         other.m_fixtureCount--;
+         f.m_next = this.m_fixtureList;
+         this.m_fixtureList = f;
+         this.m_fixtureCount++;
+         f.m_body = body2;
+         f = next;
+      }
+      body1.m_fixtureCount = 0;
+      var body1 = this;
+      var body2 = other;
+      var center1 = body1.GetWorldCenter();
+      var center2 = body2.GetWorldCenter();
+      var velocity1 = body1.GetLinearVelocity().Copy();
+      var velocity2 = body2.GetLinearVelocity().Copy();
+      var angular1 = body1.GetAngularVelocity();
+      var angular = body2.GetAngularVelocity();
+      body1.ResetMassData();
+      this.SynchronizeFixtures();
+   }
+   b2Body.prototype.GetMass = function () {
+      return this.m_mass;
+   }
+   b2Body.prototype.GetInertia = function () {
+      return this.m_I;
+   }
+   b2Body.prototype.GetMassData = function (data) {
+      data.mass = this.m_mass;
+      data.I = this.m_I;
+      data.center.SetV(this.m_sweep.localCenter);
+   }
+   b2Body.prototype.SetMassData = function (massData) {
+      b2Settings.b2Assert(this.m_world.IsLocked() == false);
+      if (this.m_world.IsLocked() == true) {
+         return;
+      }
+      if (this.m_type != b2Body.b2_dynamicBody) {
+         return;
+      }
+      this.m_invMass = 0.0;
+      this.m_I = 0.0;
+      this.m_invI = 0.0;
+      this.m_mass = massData.mass;
+      if (this.m_mass <= 0.0) {
+         this.m_mass = 1.0;
+      }
+      this.m_invMass = 1.0 / this.m_mass;
+      if (massData.I > 0.0 && (this.m_flags & b2Body.e_fixedRotationFlag) == 0) {
+         this.m_I = massData.I - this.m_mass * (massData.center.x * massData.center.x + massData.center.y * massData.center.y);
+         this.m_invI = 1.0 / this.m_I;
+      }
+      var oldCenter = this.m_sweep.c.Copy();
+      this.m_sweep.localCenter.SetV(massData.center);
+      this.m_sweep.c0.SetV(b2Math.MulX(this.m_xf, this.m_sweep.localCenter));
+      this.m_sweep.c.SetV(this.m_sweep.c0);
+      this.m_linearVelocity.x += this.m_angularVelocity * (-(this.m_sweep.c.y - oldCenter.y));
+      this.m_linearVelocity.y += this.m_angularVelocity * (+(this.m_sweep.c.x - oldCenter.x));
+   }
+   b2Body.prototype.ResetMassData = function () {
+      this.m_mass = 0.0;
+      this.m_invMass = 0.0;
+      this.m_I = 0.0;
+      this.m_invI = 0.0;
+      this.m_sweep.localCenter.SetZero();
+      if (this.m_type == b2Body.b2_staticBody || this.m_type == b2Body.b2_kinematicBody) {
+         return;
+      }
+      var center = b2Vec2.Make(0, 0);
+      for (var f = this.m_fixtureList; f; f = f.m_next) {
+         if (f.m_density == 0.0) {
+            continue;
+         }
+         var massData = f.GetMassData();
+         this.m_mass += massData.mass;
+         center.x += massData.center.x * massData.mass;
+         center.y += massData.center.y * massData.mass;
+         this.m_I += massData.I;
+      }
+      if (this.m_mass > 0.0) {
+         this.m_invMass = 1.0 / this.m_mass;
+         center.x *= this.m_invMass;
+         center.y *= this.m_invMass;
+      }
+      else {
+         this.m_mass = 1.0;
+         this.m_invMass = 1.0;
+      }
+      if (this.m_I > 0.0 && (this.m_flags & b2Body.e_fixedRotationFlag) == 0) {
+         this.m_I -= this.m_mass * (center.x * center.x + center.y * center.y);
+         this.m_I *= this.m_inertiaScale;
+         b2Settings.b2Assert(this.m_I > 0);
+         this.m_invI = 1.0 / this.m_I;
+      }
+      else {
+         this.m_I = 0.0;
+         this.m_invI = 0.0;
+      }
+      var oldCenter = this.m_sweep.c.Copy();
+      this.m_sweep.localCenter.SetV(center);
+      this.m_sweep.c0.SetV(b2Math.MulX(this.m_xf, this.m_sweep.localCenter));
+      this.m_sweep.c.SetV(this.m_sweep.c0);
+      this.m_linearVelocity.x += this.m_angularVelocity * (-(this.m_sweep.c.y - oldCenter.y));
+      this.m_linearVelocity.y += this.m_angularVelocity * (+(this.m_sweep.c.x - oldCenter.x));
+   }
+   b2Body.prototype.GetWorldPoint = function (localPoint) {
+      var A = this.m_xf.R;
+      var u = new b2Vec2(A.col1.x * localPoint.x + A.col2.x * localPoint.y, A.col1.y * localPoint.x + A.col2.y * localPoint.y);
+      u.x += this.m_xf.position.x;
+      u.y += this.m_xf.position.y;
+      return u;
+   }
+   b2Body.prototype.GetWorldVector = function (localVector) {
+      return b2Math.MulMV(this.m_xf.R, localVector);
+   }
+   b2Body.prototype.GetLocalPoint = function (worldPoint) {
+      return b2Math.MulXT(this.m_xf, worldPoint);
+   }
+   b2Body.prototype.GetLocalVector = function (worldVector) {
+      return b2Math.MulTMV(this.m_xf.R, worldVector);
+   }
+   b2Body.prototype.GetLinearVelocityFromWorldPoint = function (worldPoint) {
+      return new b2Vec2(this.m_linearVelocity.x - this.m_angularVelocity * (worldPoint.y - this.m_sweep.c.y), this.m_linearVelocity.y + this.m_angularVelocity * (worldPoint.x - this.m_sweep.c.x));
+   }
+   b2Body.prototype.GetLinearVelocityFromLocalPoint = function (localPoint) {
+      var A = this.m_xf.R;
+      var worldPoint = new b2Vec2(A.col1.x * localPoint.x + A.col2.x * localPoint.y, A.col1.y * localPoint.x + A.col2.y * localPoint.y);
+      worldPoint.x += this.m_xf.position.x;
+      worldPoint.y += this.m_xf.position.y;
+      return new b2Vec2(this.m_linearVelocity.x - this.m_angularVelocity * (worldPoint.y - this.m_sweep.c.y), this.m_linearVelocity.y + this.m_angularVelocity * (worldPoint.x - this.m_sweep.c.x));
+   }
+   b2Body.prototype.GetLinearDamping = function () {
+      return this.m_linearDamping;
+   }
+   b2Body.prototype.SetLinearDamping = function (linearDamping) {
+      if (linearDamping === undefined) linearDamping = 0;
+      this.m_linearDamping = linearDamping;
+   }
+   b2Body.prototype.GetAngularDamping = function () {
+      return this.m_angularDamping;
+   }
+   b2Body.prototype.SetAngularDamping = function (angularDamping) {
+      if (angularDamping === undefined) angularDamping = 0;
+      this.m_angularDamping = angularDamping;
+   }
+   b2Body.prototype.SetType = function (type) {
+      if (type === undefined) type = 0;
+      if (this.m_type == type) {
+         return;
+      }
+      this.m_type = type;
+      this.ResetMassData();
+      if (this.m_type == b2Body.b2_staticBody) {
+         this.m_linearVelocity.SetZero();
+         this.m_angularVelocity = 0.0;
+      }
+      this.SetAwake(true);
+      this.m_force.SetZero();
+      this.m_torque = 0.0;
+      for (var ce = this.m_contactList; ce; ce = ce.next) {
+         ce.contact.FlagForFiltering();
+      }
+   }
+   b2Body.prototype.GetType = function () {
+      return this.m_type;
+   }
+   b2Body.prototype.SetBullet = function (flag) {
+      if (flag) {
+         this.m_flags |= b2Body.e_bulletFlag;
+      }
+      else {
+         this.m_flags &= ~b2Body.e_bulletFlag;
+      }
+   }
+   b2Body.prototype.IsBullet = function () {
+      return (this.m_flags & b2Body.e_bulletFlag) == b2Body.e_bulletFlag;
+   }
+   b2Body.prototype.SetSleepingAllowed = function (flag) {
+      if (flag) {
+         this.m_flags |= b2Body.e_allowSleepFlag;
+      }
+      else {
+         this.m_flags &= ~b2Body.e_allowSleepFlag;
+         this.SetAwake(true);
+      }
+   }
+   b2Body.prototype.SetAwake = function (flag) {
+      if (flag) {
+         this.m_flags |= b2Body.e_awakeFlag;
+         this.m_sleepTime = 0.0;
+      }
+      else {
+         this.m_flags &= ~b2Body.e_awakeFlag;
+         this.m_sleepTime = 0.0;
+         this.m_linearVelocity.SetZero();
+         this.m_angularVelocity = 0.0;
+         this.m_force.SetZero();
+         this.m_torque = 0.0;
+      }
+   }
+   b2Body.prototype.IsAwake = function () {
+      return (this.m_flags & b2Body.e_awakeFlag) == b2Body.e_awakeFlag;
+   }
+   b2Body.prototype.SetFixedRotation = function (fixed) {
+      if (fixed) {
+         this.m_flags |= b2Body.e_fixedRotationFlag;
+      }
+      else {
+         this.m_flags &= ~b2Body.e_fixedRotationFlag;
+      }
+      this.ResetMassData();
+   }
+   b2Body.prototype.IsFixedRotation = function () {
+      return (this.m_flags & b2Body.e_fixedRotationFlag) == b2Body.e_fixedRotationFlag;
+   }
+   b2Body.prototype.SetActive = function (flag) {
+      if (flag == this.IsActive()) {
+         return;
+      }
+      var broadPhase;
+      var f;
+      if (flag) {
+         this.m_flags |= b2Body.e_activeFlag;
+         broadPhase = this.m_world.m_contactManager.m_broadPhase;
+         for (f = this.m_fixtureList;
+         f; f = f.m_next) {
+            f.CreateProxy(broadPhase, this.m_xf);
+         }
+      }
+      else {
+         this.m_flags &= ~b2Body.e_activeFlag;
+         broadPhase = this.m_world.m_contactManager.m_broadPhase;
+         for (f = this.m_fixtureList;
+         f; f = f.m_next) {
+            f.DestroyProxy(broadPhase);
+         }
+         var ce = this.m_contactList;
+         while (ce) {
+            var ce0 = ce;
+            ce = ce.next;
+            this.m_world.m_contactManager.Destroy(ce0.contact);
+         }
+         this.m_contactList = null;
+      }
+   }
+   b2Body.prototype.IsActive = function () {
+      return (this.m_flags & b2Body.e_activeFlag) == b2Body.e_activeFlag;
+   }
+   b2Body.prototype.IsSleepingAllowed = function () {
+      return (this.m_flags & b2Body.e_allowSleepFlag) == b2Body.e_allowSleepFlag;
+   }
+   b2Body.prototype.GetFixtureList = function () {
+      return this.m_fixtureList;
+   }
+   b2Body.prototype.GetJointList = function () {
+      return this.m_jointList;
+   }
+   b2Body.prototype.GetControllerList = function () {
+      return this.m_controllerList;
+   }
+   b2Body.prototype.GetContactList = function () {
+      return this.m_contactList;
+   }
+   b2Body.prototype.GetNext = function () {
+      return this.m_next;
+   }
+   b2Body.prototype.GetUserData = function () {
+      return this.m_userData;
+   }
+   b2Body.prototype.SetUserData = function (data) {
+      this.m_userData = data;
+   }
+   b2Body.prototype.GetWorld = function () {
+      return this.m_world;
+   }
+   b2Body.prototype.b2Body = function (bd, world) {
+      this.m_flags = 0;
+      if (bd.bullet) {
+         this.m_flags |= b2Body.e_bulletFlag;
+      }
+      if (bd.fixedRotation) {
+         this.m_flags |= b2Body.e_fixedRotationFlag;
+      }
+      if (bd.allowSleep) {
+         this.m_flags |= b2Body.e_allowSleepFlag;
+      }
+      if (bd.awake) {
+         this.m_flags |= b2Body.e_awakeFlag;
+      }
+      if (bd.active) {
+         this.m_flags |= b2Body.e_activeFlag;
+      }
+      this.m_world = world;
+      this.m_xf.position.SetV(bd.position);
+      this.m_xf.R.Set(bd.angle);
+      this.m_sweep.localCenter.SetZero();
+      this.m_sweep.t0 = 1.0;
+      this.m_sweep.a0 = this.m_sweep.a = bd.angle;
+      var tMat = this.m_xf.R;
+      var tVec = this.m_sweep.localCenter;
+      this.m_sweep.c.x = (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      this.m_sweep.c.y = (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      this.m_sweep.c.x += this.m_xf.position.x;
+      this.m_sweep.c.y += this.m_xf.position.y;
+      this.m_sweep.c0.SetV(this.m_sweep.c);
+      this.m_jointList = null;
+      this.m_controllerList = null;
+      this.m_contactList = null;
+      this.m_controllerCount = 0;
+      this.m_prev = null;
+      this.m_next = null;
+      this.m_linearVelocity.SetV(bd.linearVelocity);
+      this.m_angularVelocity = bd.angularVelocity;
+      this.m_linearDamping = bd.linearDamping;
+      this.m_angularDamping = bd.angularDamping;
+      this.m_force.Set(0.0, 0.0);
+      this.m_torque = 0.0;
+      this.m_sleepTime = 0.0;
+      this.m_type = bd.type;
+      if (this.m_type == b2Body.b2_dynamicBody) {
+         this.m_mass = 1.0;
+         this.m_invMass = 1.0;
+      }
+      else {
+         this.m_mass = 0.0;
+         this.m_invMass = 0.0;
+      }
+      this.m_I = 0.0;
+      this.m_invI = 0.0;
+      this.m_inertiaScale = bd.inertiaScale;
+      this.m_userData = bd.userData;
+      this.m_fixtureList = null;
+      this.m_fixtureCount = 0;
+   }
+   b2Body.prototype.SynchronizeFixtures = function () {
+      var xf1 = b2Body.s_xf1;
+      xf1.R.Set(this.m_sweep.a0);
+      var tMat = xf1.R;
+      var tVec = this.m_sweep.localCenter;
+      xf1.position.x = this.m_sweep.c0.x - (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      xf1.position.y = this.m_sweep.c0.y - (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+      var f;
+      var broadPhase = this.m_world.m_contactManager.m_broadPhase;
+      for (f = this.m_fixtureList;
+      f; f = f.m_next) {
+         f.Synchronize(broadPhase, xf1, this.m_xf);
+      }
+   }
+   b2Body.prototype.SynchronizeTransform = function () {
+      this.m_xf.R.Set(this.m_sweep.a);
+      var tMat = this.m_xf.R;
+      var tVec = this.m_sweep.localCenter;
+      this.m_xf.position.x = this.m_sweep.c.x - (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+      this.m_xf.position.y = this.m_sweep.c.y - (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+   }
+   b2Body.prototype.ShouldCollide = function (other) {
+      if (this.m_type != b2Body.b2_dynamicBody && other.m_type != b2Body.b2_dynamicBody) {
+         return false;
+      }
+      for (var jn = this.m_jointList; jn; jn = jn.next) {
+         if (jn.other == other) if (jn.joint.m_collideConnected == false) {
+            return false;
+         }
+      }
+      return true;
+   }
+   b2Body.prototype.Advance = function (t) {
+      if (t === undefined) t = 0;
+      this.m_sweep.Advance(t);
+      this.m_sweep.c.SetV(this.m_sweep.c0);
+      this.m_sweep.a = this.m_sweep.a0;
+      this.SynchronizeTransform();
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Dynamics.b2Body.s_xf1 = new b2Transform();
+      Box2D.Dynamics.b2Body.e_islandFlag = 0x0001;
+      Box2D.Dynamics.b2Body.e_awakeFlag = 0x0002;
+      Box2D.Dynamics.b2Body.e_allowSleepFlag = 0x0004;
+      Box2D.Dynamics.b2Body.e_bulletFlag = 0x0008;
+      Box2D.Dynamics.b2Body.e_fixedRotationFlag = 0x0010;
+      Box2D.Dynamics.b2Body.e_activeFlag = 0x0020;
+      Box2D.Dynamics.b2Body.b2_staticBody = 0;
+      Box2D.Dynamics.b2Body.b2_kinematicBody = 1;
+      Box2D.Dynamics.b2Body.b2_dynamicBody = 2;
+   });
+   b2BodyDef.b2BodyDef = function () {
+      this.position = new b2Vec2();
+      this.linearVelocity = new b2Vec2();
+   };
+   b2BodyDef.prototype.b2BodyDef = function () {
+      this.userData = null;
+      this.position.Set(0.0, 0.0);
+      this.angle = 0.0;
+      this.linearVelocity.Set(0, 0);
+      this.angularVelocity = 0.0;
+      this.linearDamping = 0.0;
+      this.angularDamping = 0.0;
+      this.allowSleep = true;
+      this.awake = true;
+      this.fixedRotation = false;
+      this.bullet = false;
+      this.type = b2Body.b2_staticBody;
+      this.active = true;
+      this.inertiaScale = 1.0;
+   }
+   b2ContactFilter.b2ContactFilter = function () {};
+   b2ContactFilter.prototype.ShouldCollide = function (fixtureA, fixtureB) {
+      var filter1 = fixtureA.GetFilterData();
+      var filter2 = fixtureB.GetFilterData();
+      if (filter1.groupIndex == filter2.groupIndex && filter1.groupIndex != 0) {
+         return filter1.groupIndex > 0;
+      }
+      var collide = (filter1.maskBits & filter2.categoryBits) != 0 && (filter1.categoryBits & filter2.maskBits) != 0;
+      return collide;
+   }
+   b2ContactFilter.prototype.RayCollide = function (userData, fixture) {
+      if (!userData) return true;
+      return this.ShouldCollide((userData instanceof b2Fixture ? userData : null), fixture);
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Dynamics.b2ContactFilter.b2_defaultFilter = new b2ContactFilter();
+   });
+   b2ContactImpulse.b2ContactImpulse = function () {
+      this.normalImpulses = new Vector_a2j_Number(b2Settings.b2_maxManifoldPoints);
+      this.tangentImpulses = new Vector_a2j_Number(b2Settings.b2_maxManifoldPoints);
+   };
+   b2ContactListener.b2ContactListener = function () {};
+   b2ContactListener.prototype.BeginContact = function (contact) {}
+   b2ContactListener.prototype.EndContact = function (contact) {}
+   b2ContactListener.prototype.PreSolve = function (contact, oldManifold) {}
+   b2ContactListener.prototype.PostSolve = function (contact, impulse) {}
+   Box2D.postDefs.push(function () {
+      Box2D.Dynamics.b2ContactListener.b2_defaultListener = new b2ContactListener();
+   });
+   b2ContactManager.b2ContactManager = function () {};
+   b2ContactManager.prototype.b2ContactManager = function () {
+      this.m_world = null;
+      this.m_contactCount = 0;
+      this.m_contactFilter = b2ContactFilter.b2_defaultFilter;
+      this.m_contactListener = b2ContactListener.b2_defaultListener;
+      this.m_contactFactory = new b2ContactFactory(this.m_allocator);
+      this.m_broadPhase = new b2DynamicTreeBroadPhase();
+   }
+   b2ContactManager.prototype.AddPair = function (proxyUserDataA, proxyUserDataB) {
+      var fixtureA = (proxyUserDataA instanceof b2Fixture ? proxyUserDataA : null);
+      var fixtureB = (proxyUserDataB instanceof b2Fixture ? proxyUserDataB : null);
+      var bodyA = fixtureA.GetBody();
+      var bodyB = fixtureB.GetBody();
+      if (bodyA == bodyB) return;
+      var edge = bodyB.GetContactList();
+      while (edge) {
+         if (edge.other == bodyA) {
+            var fA = edge.contact.GetFixtureA();
+            var fB = edge.contact.GetFixtureB();
+            if (fA == fixtureA && fB == fixtureB) return;
+            if (fA == fixtureB && fB == fixtureA) return;
+         }
+         edge = edge.next;
+      }
+      if (bodyB.ShouldCollide(bodyA) == false) {
+         return;
+      }
+      if (this.m_contactFilter.ShouldCollide(fixtureA, fixtureB) == false) {
+         return;
+      }
+      var c = this.m_contactFactory.Create(fixtureA, fixtureB);
+      fixtureA = c.GetFixtureA();
+      fixtureB = c.GetFixtureB();
+      bodyA = fixtureA.m_body;
+      bodyB = fixtureB.m_body;
+      c.m_prev = null;
+      c.m_next = this.m_world.m_contactList;
+      if (this.m_world.m_contactList != null) {
+         this.m_world.m_contactList.m_prev = c;
+      }
+      this.m_world.m_contactList = c;
+      c.m_nodeA.contact = c;
+      c.m_nodeA.other = bodyB;
+      c.m_nodeA.prev = null;
+      c.m_nodeA.next = bodyA.m_contactList;
+      if (bodyA.m_contactList != null) {
+         bodyA.m_contactList.prev = c.m_nodeA;
+      }
+      bodyA.m_contactList = c.m_nodeA;
+      c.m_nodeB.contact = c;
+      c.m_nodeB.other = bodyA;
+      c.m_nodeB.prev = null;
+      c.m_nodeB.next = bodyB.m_contactList;
+      if (bodyB.m_contactList != null) {
+         bodyB.m_contactList.prev = c.m_nodeB;
+      }
+      bodyB.m_contactList = c.m_nodeB;
+      ++this.m_world.m_contactCount;
+      return;
+   }
+   b2ContactManager.prototype.FindNewContacts = function () {
+      this.m_broadPhase.UpdatePairs(Box2D.generateCallback(this, this.AddPair));
+   }
+   b2ContactManager.prototype.Destroy = function (c) {
+      var fixtureA = c.GetFixtureA();
+      var fixtureB = c.GetFixtureB();
+      var bodyA = fixtureA.GetBody();
+      var bodyB = fixtureB.GetBody();
+      if (c.IsTouching()) {
+         this.m_contactListener.EndContact(c);
+      }
+      if (c.m_prev) {
+         c.m_prev.m_next = c.m_next;
+      }
+      if (c.m_next) {
+         c.m_next.m_prev = c.m_prev;
+      }
+      if (c == this.m_world.m_contactList) {
+         this.m_world.m_contactList = c.m_next;
+      }
+      if (c.m_nodeA.prev) {
+         c.m_nodeA.prev.next = c.m_nodeA.next;
+      }
+      if (c.m_nodeA.next) {
+         c.m_nodeA.next.prev = c.m_nodeA.prev;
+      }
+      if (c.m_nodeA == bodyA.m_contactList) {
+         bodyA.m_contactList = c.m_nodeA.next;
+      }
+      if (c.m_nodeB.prev) {
+         c.m_nodeB.prev.next = c.m_nodeB.next;
+      }
+      if (c.m_nodeB.next) {
+         c.m_nodeB.next.prev = c.m_nodeB.prev;
+      }
+      if (c.m_nodeB == bodyB.m_contactList) {
+         bodyB.m_contactList = c.m_nodeB.next;
+      }
+      this.m_contactFactory.Destroy(c);
+      --this.m_contactCount;
+   }
+   b2ContactManager.prototype.Collide = function () {
+      var c = this.m_world.m_contactList;
+      while (c) {
+         var fixtureA = c.GetFixtureA();
+         var fixtureB = c.GetFixtureB();
+         var bodyA = fixtureA.GetBody();
+         var bodyB = fixtureB.GetBody();
+         if (bodyA.IsAwake() == false && bodyB.IsAwake() == false) {
+            c = c.GetNext();
+            continue;
+         }
+         if (c.m_flags & b2Contact.e_filterFlag) {
+            if (bodyB.ShouldCollide(bodyA) == false) {
+               var cNuke = c;
+               c = cNuke.GetNext();
+               this.Destroy(cNuke);
+               continue;
+            }
+            if (this.m_contactFilter.ShouldCollide(fixtureA, fixtureB) == false) {
+               cNuke = c;
+               c = cNuke.GetNext();
+               this.Destroy(cNuke);
+               continue;
+            }
+            c.m_flags &= ~b2Contact.e_filterFlag;
+         }
+         var proxyA = fixtureA.m_proxy;
+         var proxyB = fixtureB.m_proxy;
+         var overlap = this.m_broadPhase.TestOverlap(proxyA, proxyB);
+         if (overlap == false) {
+            cNuke = c;
+            c = cNuke.GetNext();
+            this.Destroy(cNuke);
+            continue;
+         }
+         c.Update(this.m_contactListener);
+         c = c.GetNext();
+      }
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Dynamics.b2ContactManager.s_evalCP = new b2ContactPoint();
+   });
+   b2DebugDraw.b2DebugDraw = function () {};
+   b2DebugDraw.prototype.b2DebugDraw = function () {}
+   b2DebugDraw.prototype.SetFlags = function (flags) {
+      if (flags === undefined) flags = 0;
+   }
+   b2DebugDraw.prototype.GetFlags = function () {}
+   b2DebugDraw.prototype.AppendFlags = function (flags) {
+      if (flags === undefined) flags = 0;
+   }
+   b2DebugDraw.prototype.ClearFlags = function (flags) {
+      if (flags === undefined) flags = 0;
+   }
+   b2DebugDraw.prototype.SetSprite = function (sprite) {}
+   b2DebugDraw.prototype.GetSprite = function () {}
+   b2DebugDraw.prototype.SetDrawScale = function (drawScale) {
+      if (drawScale === undefined) drawScale = 0;
+   }
+   b2DebugDraw.prototype.GetDrawScale = function () {}
+   b2DebugDraw.prototype.SetLineThickness = function (lineThickness) {
+      if (lineThickness === undefined) lineThickness = 0;
+   }
+   b2DebugDraw.prototype.GetLineThickness = function () {}
+   b2DebugDraw.prototype.SetAlpha = function (alpha) {
+      if (alpha === undefined) alpha = 0;
+   }
+   b2DebugDraw.prototype.GetAlpha = function () {}
+   b2DebugDraw.prototype.SetFillAlpha = function (alpha) {
+      if (alpha === undefined) alpha = 0;
+   }
+   b2DebugDraw.prototype.GetFillAlpha = function () {}
+   b2DebugDraw.prototype.SetXFormScale = function (xformScale) {
+      if (xformScale === undefined) xformScale = 0;
+   }
+   b2DebugDraw.prototype.GetXFormScale = function () {}
+   b2DebugDraw.prototype.DrawPolygon = function (vertices, vertexCount, color) {
+      if (vertexCount === undefined) vertexCount = 0;
+   }
+   b2DebugDraw.prototype.DrawSolidPolygon = function (vertices, vertexCount, color) {
+      if (vertexCount === undefined) vertexCount = 0;
+   }
+   b2DebugDraw.prototype.DrawCircle = function (center, radius, color) {
+      if (radius === undefined) radius = 0;
+   }
+   b2DebugDraw.prototype.DrawSolidCircle = function (center, radius, axis, color) {
+      if (radius === undefined) radius = 0;
+   }
+   b2DebugDraw.prototype.DrawSegment = function (p1, p2, color) {}
+   b2DebugDraw.prototype.DrawTransform = function (xf) {}
+   Box2D.postDefs.push(function () {
+      Box2D.Dynamics.b2DebugDraw.e_shapeBit = 0x0001;
+      Box2D.Dynamics.b2DebugDraw.e_jointBit = 0x0002;
+      Box2D.Dynamics.b2DebugDraw.e_aabbBit = 0x0004;
+      Box2D.Dynamics.b2DebugDraw.e_pairBit = 0x0008;
+      Box2D.Dynamics.b2DebugDraw.e_centerOfMassBit = 0x0010;
+      Box2D.Dynamics.b2DebugDraw.e_controllerBit = 0x0020;
+   });
+   b2DestructionListener.b2DestructionListener = function () {};
+   b2DestructionListener.prototype.SayGoodbyeJoint = function (joint) {}
+   b2DestructionListener.prototype.SayGoodbyeFixture = function (fixture) {}
+   b2FilterData.b2FilterData = function () {
+      this.categoryBits = 0x0001;
+      this.maskBits = 0xFFFF;
+      this.groupIndex = 0;
+   };
+   b2FilterData.prototype.Copy = function () {
+      var copy = new b2FilterData();
+      copy.categoryBits = this.categoryBits;
+      copy.maskBits = this.maskBits;
+      copy.groupIndex = this.groupIndex;
+      return copy;
+   }
+   b2Fixture.b2Fixture = function () {
+      this.m_filter = new b2FilterData();
+   };
+   b2Fixture.prototype.GetType = function () {
+      return this.m_shape.GetType();
+   }
+   b2Fixture.prototype.GetShape = function () {
+      return this.m_shape;
+   }
+   b2Fixture.prototype.SetSensor = function (sensor) {
+      if (this.m_isSensor == sensor) return;
+      this.m_isSensor = sensor;
+      if (this.m_body == null) return;
+      var edge = this.m_body.GetContactList();
+      while (edge) {
+         var contact = edge.contact;
+         var fixtureA = contact.GetFixtureA();
+         var fixtureB = contact.GetFixtureB();
+         if (fixtureA == this || fixtureB == this) contact.SetSensor(fixtureA.IsSensor() || fixtureB.IsSensor());
+         edge = edge.next;
+      }
+   }
+   b2Fixture.prototype.IsSensor = function () {
+      return this.m_isSensor;
+   }
+   b2Fixture.prototype.SetFilterData = function (filter) {
+      this.m_filter = filter.Copy();
+      if (this.m_body) return;
+      var edge = this.m_body.GetContactList();
+      while (edge) {
+         var contact = edge.contact;
+         var fixtureA = contact.GetFixtureA();
+         var fixtureB = contact.GetFixtureB();
+         if (fixtureA == this || fixtureB == this) contact.FlagForFiltering();
+         edge = edge.next;
+      }
+   }
+   b2Fixture.prototype.GetFilterData = function () {
+      return this.m_filter.Copy();
+   }
+   b2Fixture.prototype.GetBody = function () {
+      return this.m_body;
+   }
+   b2Fixture.prototype.GetNext = function () {
+      return this.m_next;
+   }
+   b2Fixture.prototype.GetUserData = function () {
+      return this.m_userData;
+   }
+   b2Fixture.prototype.SetUserData = function (data) {
+      this.m_userData = data;
+   }
+   b2Fixture.prototype.TestPoint = function (p) {
+      return this.m_shape.TestPoint(this.m_body.GetTransform(), p);
+   }
+   b2Fixture.prototype.RayCast = function (output, input) {
+      return this.m_shape.RayCast(output, input, this.m_body.GetTransform());
+   }
+   b2Fixture.prototype.GetMassData = function (massData) {
+      if (massData === undefined) massData = null;
+      if (massData == null) {
+         massData = new b2MassData();
+      }
+      this.m_shape.ComputeMass(massData, this.m_density);
+      return massData;
+   }
+   b2Fixture.prototype.SetDensity = function (density) {
+      if (density === undefined) density = 0;
+      this.m_density = density;
+   }
+   b2Fixture.prototype.GetDensity = function () {
+      return this.m_density;
+   }
+   b2Fixture.prototype.GetFriction = function () {
+      return this.m_friction;
+   }
+   b2Fixture.prototype.SetFriction = function (friction) {
+      if (friction === undefined) friction = 0;
+      this.m_friction = friction;
+   }
+   b2Fixture.prototype.GetRestitution = function () {
+      return this.m_restitution;
+   }
+   b2Fixture.prototype.SetRestitution = function (restitution) {
+      if (restitution === undefined) restitution = 0;
+      this.m_restitution = restitution;
+   }
+   b2Fixture.prototype.GetAABB = function () {
+      return this.m_aabb;
+   }
+   b2Fixture.prototype.b2Fixture = function () {
+      this.m_aabb = new b2AABB();
+      this.m_userData = null;
+      this.m_body = null;
+      this.m_next = null;
+      this.m_shape = null;
+      this.m_density = 0.0;
+      this.m_friction = 0.0;
+      this.m_restitution = 0.0;
+   }
+   b2Fixture.prototype.Create = function (body, xf, def) {
+      this.m_userData = def.userData;
+      this.m_friction = def.friction;
+      this.m_restitution = def.restitution;
+      this.m_body = body;
+      this.m_next = null;
+      this.m_filter = def.filter.Copy();
+      this.m_isSensor = def.isSensor;
+      this.m_shape = def.shape.Copy();
+      this.m_density = def.density;
+   }
+   b2Fixture.prototype.Destroy = function () {
+      this.m_shape = null;
+   }
+   b2Fixture.prototype.CreateProxy = function (broadPhase, xf) {
+      this.m_shape.ComputeAABB(this.m_aabb, xf);
+      this.m_proxy = broadPhase.CreateProxy(this.m_aabb, this);
+   }
+   b2Fixture.prototype.DestroyProxy = function (broadPhase) {
+      if (this.m_proxy == null) {
+         return;
+      }
+      broadPhase.DestroyProxy(this.m_proxy);
+      this.m_proxy = null;
+   }
+   b2Fixture.prototype.Synchronize = function (broadPhase, transform1, transform2) {
+      if (!this.m_proxy) return;
+      var aabb1 = new b2AABB();
+      var aabb2 = new b2AABB();
+      this.m_shape.ComputeAABB(aabb1, transform1);
+      this.m_shape.ComputeAABB(aabb2, transform2);
+      this.m_aabb.Combine(aabb1, aabb2);
+      var displacement = b2Math.SubtractVV(transform2.position, transform1.position);
+      broadPhase.MoveProxy(this.m_proxy, this.m_aabb, displacement);
+   }
+   b2FixtureDef.b2FixtureDef = function () {
+      this.filter = new b2FilterData();
+   };
+   b2FixtureDef.prototype.b2FixtureDef = function () {
+      this.shape = null;
+      this.userData = null;
+      this.friction = 0.2;
+      this.restitution = 0.0;
+      this.density = 0.0;
+      this.filter.categoryBits = 0x0001;
+      this.filter.maskBits = 0xFFFF;
+      this.filter.groupIndex = 0;
+      this.isSensor = false;
+   }
+   b2Island.b2Island = function () {};
+   b2Island.prototype.b2Island = function () {
+      this.m_bodies = new Vector();
+      this.m_contacts = new Vector();
+      this.m_joints = new Vector();
+   }
+   b2Island.prototype.Initialize = function (bodyCapacity, contactCapacity, jointCapacity, allocator, listener, contactSolver) {
+      if (bodyCapacity === undefined) bodyCapacity = 0;
+      if (contactCapacity === undefined) contactCapacity = 0;
+      if (jointCapacity === undefined) jointCapacity = 0;
+      var i = 0;
+      this.m_bodyCapacity = bodyCapacity;
+      this.m_contactCapacity = contactCapacity;
+      this.m_jointCapacity = jointCapacity;
+      this.m_bodyCount = 0;
+      this.m_contactCount = 0;
+      this.m_jointCount = 0;
+      this.m_allocator = allocator;
+      this.m_listener = listener;
+      this.m_contactSolver = contactSolver;
+      for (i = this.m_bodies.length;
+      i < bodyCapacity; i++)
+      this.m_bodies[i] = null;
+      for (i = this.m_contacts.length;
+      i < contactCapacity; i++)
+      this.m_contacts[i] = null;
+      for (i = this.m_joints.length;
+      i < jointCapacity; i++)
+      this.m_joints[i] = null;
+   }
+   b2Island.prototype.Clear = function () {
+      this.m_bodyCount = 0;
+      this.m_contactCount = 0;
+      this.m_jointCount = 0;
+   }
+   b2Island.prototype.Solve = function (step, gravity, allowSleep) {
+      var i = 0;
+      var j = 0;
+      var b;
+      var joint;
+      for (i = 0;
+      i < this.m_bodyCount; ++i) {
+         b = this.m_bodies[i];
+         if (b.GetType() != b2Body.b2_dynamicBody) continue;
+         b.m_linearVelocity.x += step.dt * (gravity.x + b.m_invMass * b.m_force.x);
+         b.m_linearVelocity.y += step.dt * (gravity.y + b.m_invMass * b.m_force.y);
+         b.m_angularVelocity += step.dt * b.m_invI * b.m_torque;
+         b.m_linearVelocity.Multiply(b2Math.Clamp(1.0 - step.dt * b.m_linearDamping, 0.0, 1.0));
+         b.m_angularVelocity *= b2Math.Clamp(1.0 - step.dt * b.m_angularDamping, 0.0, 1.0);
+      }
+      this.m_contactSolver.Initialize(step, this.m_contacts, this.m_contactCount, this.m_allocator);
+      var contactSolver = this.m_contactSolver;
+      contactSolver.InitVelocityConstraints(step);
+      for (i = 0;
+      i < this.m_jointCount; ++i) {
+         joint = this.m_joints[i];
+         joint.InitVelocityConstraints(step);
+      }
+      for (i = 0;
+      i < step.velocityIterations; ++i) {
+         for (j = 0;
+         j < this.m_jointCount; ++j) {
+            joint = this.m_joints[j];
+            joint.SolveVelocityConstraints(step);
+         }
+         contactSolver.SolveVelocityConstraints();
+      }
+      for (i = 0;
+      i < this.m_jointCount; ++i) {
+         joint = this.m_joints[i];
+         joint.FinalizeVelocityConstraints();
+      }
+      contactSolver.FinalizeVelocityConstraints();
+      for (i = 0;
+      i < this.m_bodyCount; ++i) {
+         b = this.m_bodies[i];
+         if (b.GetType() == b2Body.b2_staticBody) continue;
+         var translationX = step.dt * b.m_linearVelocity.x;
+         var translationY = step.dt * b.m_linearVelocity.y;
+         if ((translationX * translationX + translationY * translationY) > b2Settings.b2_maxTranslationSquared) {
+            b.m_linearVelocity.Normalize();
+            b.m_linearVelocity.x *= b2Settings.b2_maxTranslation * step.inv_dt;
+            b.m_linearVelocity.y *= b2Settings.b2_maxTranslation * step.inv_dt;
+         }
+         var rotation = step.dt * b.m_angularVelocity;
+         if (rotation * rotation > b2Settings.b2_maxRotationSquared) {
+            if (b.m_angularVelocity < 0.0) {
+               b.m_angularVelocity = (-b2Settings.b2_maxRotation * step.inv_dt);
+            }
+            else {
+               b.m_angularVelocity = b2Settings.b2_maxRotation * step.inv_dt;
+            }
+         }
+         b.m_sweep.c0.SetV(b.m_sweep.c);
+         b.m_sweep.a0 = b.m_sweep.a;
+         b.m_sweep.c.x += step.dt * b.m_linearVelocity.x;
+         b.m_sweep.c.y += step.dt * b.m_linearVelocity.y;
+         b.m_sweep.a += step.dt * b.m_angularVelocity;
+         b.SynchronizeTransform();
+      }
+      for (i = 0;
+      i < step.positionIterations; ++i) {
+         var contactsOkay = contactSolver.SolvePositionConstraints(b2Settings.b2_contactBaumgarte);
+         var jointsOkay = true;
+         for (j = 0;
+         j < this.m_jointCount; ++j) {
+            joint = this.m_joints[j];
+            var jointOkay = joint.SolvePositionConstraints(b2Settings.b2_contactBaumgarte);
+            jointsOkay = jointsOkay && jointOkay;
+         }
+         if (contactsOkay && jointsOkay) {
+            break;
+         }
+      }
+      this.Report(contactSolver.m_constraints);
+      if (allowSleep) {
+         var minSleepTime = Number.MAX_VALUE;
+         var linTolSqr = b2Settings.b2_linearSleepTolerance * b2Settings.b2_linearSleepTolerance;
+         var angTolSqr = b2Settings.b2_angularSleepTolerance * b2Settings.b2_angularSleepTolerance;
+         for (i = 0;
+         i < this.m_bodyCount; ++i) {
+            b = this.m_bodies[i];
+            if (b.GetType() == b2Body.b2_staticBody) {
+               continue;
+            }
+            if ((b.m_flags & b2Body.e_allowSleepFlag) == 0) {
+               b.m_sleepTime = 0.0;
+               minSleepTime = 0.0;
+            }
+            if ((b.m_flags & b2Body.e_allowSleepFlag) == 0 || b.m_angularVelocity * b.m_angularVelocity > angTolSqr || b2Math.Dot(b.m_linearVelocity, b.m_linearVelocity) > linTolSqr) {
+               b.m_sleepTime = 0.0;
+               minSleepTime = 0.0;
+            }
+            else {
+               b.m_sleepTime += step.dt;
+               minSleepTime = b2Math.Min(minSleepTime, b.m_sleepTime);
+            }
+         }
+         if (minSleepTime >= b2Settings.b2_timeToSleep) {
+            for (i = 0;
+            i < this.m_bodyCount; ++i) {
+               b = this.m_bodies[i];
+               b.SetAwake(false);
+            }
+         }
+      }
+   }
+   b2Island.prototype.SolveTOI = function (subStep) {
+      var i = 0;
+      var j = 0;
+      this.m_contactSolver.Initialize(subStep, this.m_contacts, this.m_contactCount, this.m_allocator);
+      var contactSolver = this.m_contactSolver;
+      for (i = 0;
+      i < this.m_jointCount; ++i) {
+         this.m_joints[i].InitVelocityConstraints(subStep);
+      }
+      for (i = 0;
+      i < subStep.velocityIterations; ++i) {
+         contactSolver.SolveVelocityConstraints();
+         for (j = 0;
+         j < this.m_jointCount; ++j) {
+            this.m_joints[j].SolveVelocityConstraints(subStep);
+         }
+      }
+      for (i = 0;
+      i < this.m_bodyCount; ++i) {
+         var b = this.m_bodies[i];
+         if (b.GetType() == b2Body.b2_staticBody) continue;
+         var translationX = subStep.dt * b.m_linearVelocity.x;
+         var translationY = subStep.dt * b.m_linearVelocity.y;
+         if ((translationX * translationX + translationY * translationY) > b2Settings.b2_maxTranslationSquared) {
+            b.m_linearVelocity.Normalize();
+            b.m_linearVelocity.x *= b2Settings.b2_maxTranslation * subStep.inv_dt;
+            b.m_linearVelocity.y *= b2Settings.b2_maxTranslation * subStep.inv_dt;
+         }
+         var rotation = subStep.dt * b.m_angularVelocity;
+         if (rotation * rotation > b2Settings.b2_maxRotationSquared) {
+            if (b.m_angularVelocity < 0.0) {
+               b.m_angularVelocity = (-b2Settings.b2_maxRotation * subStep.inv_dt);
+            }
+            else {
+               b.m_angularVelocity = b2Settings.b2_maxRotation * subStep.inv_dt;
+            }
+         }
+         b.m_sweep.c0.SetV(b.m_sweep.c);
+         b.m_sweep.a0 = b.m_sweep.a;
+         b.m_sweep.c.x += subStep.dt * b.m_linearVelocity.x;
+         b.m_sweep.c.y += subStep.dt * b.m_linearVelocity.y;
+         b.m_sweep.a += subStep.dt * b.m_angularVelocity;
+         b.SynchronizeTransform();
+      }
+      var k_toiBaumgarte = 0.75;
+      for (i = 0;
+      i < subStep.positionIterations; ++i) {
+         var contactsOkay = contactSolver.SolvePositionConstraints(k_toiBaumgarte);
+         var jointsOkay = true;
+         for (j = 0;
+         j < this.m_jointCount; ++j) {
+            var jointOkay = this.m_joints[j].SolvePositionConstraints(b2Settings.b2_contactBaumgarte);
+            jointsOkay = jointsOkay && jointOkay;
+         }
+         if (contactsOkay && jointsOkay) {
+            break;
+         }
+      }
+      this.Report(contactSolver.m_constraints);
+   }
+   b2Island.prototype.Report = function (constraints) {
+      if (this.m_listener == null) {
+         return;
+      }
+      for (var i = 0; i < this.m_contactCount; ++i) {
+         var c = this.m_contacts[i];
+         var cc = constraints[i];
+         for (var j = 0; j < cc.pointCount; ++j) {
+            b2Island.s_impulse.normalImpulses[j] = cc.points[j].normalImpulse;
+            b2Island.s_impulse.tangentImpulses[j] = cc.points[j].tangentImpulse;
+         }
+         this.m_listener.PostSolve(c, b2Island.s_impulse);
+      }
+   }
+   b2Island.prototype.AddBody = function (body) {
+      body.m_islandIndex = this.m_bodyCount;
+      this.m_bodies[this.m_bodyCount++] = body;
+   }
+   b2Island.prototype.AddContact = function (contact) {
+      this.m_contacts[this.m_contactCount++] = contact;
+   }
+   b2Island.prototype.AddJoint = function (joint) {
+      this.m_joints[this.m_jointCount++] = joint;
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Dynamics.b2Island.s_impulse = new b2ContactImpulse();
+   });
+   b2TimeStep.b2TimeStep = function () {};
+   b2TimeStep.prototype.Set = function (step) {
+      this.dt = step.dt;
+      this.inv_dt = step.inv_dt;
+      this.positionIterations = step.positionIterations;
+      this.velocityIterations = step.velocityIterations;
+      this.warmStarting = step.warmStarting;
+   }
+   b2World.b2World = function () {
+      this.s_stack = new Vector();
+      this.m_contactManager = new b2ContactManager();
+      this.m_contactSolver = new b2ContactSolver();
+      this.m_island = new b2Island();
+   };
+   b2World.prototype.b2World = function (gravity, doSleep) {
+      this.m_destructionListener = null;
+      this.m_debugDraw = null;
+      this.m_bodyList = null;
+      this.m_contactList = null;
+      this.m_jointList = null;
+      this.m_controllerList = null;
+      this.m_bodyCount = 0;
+      this.m_contactCount = 0;
+      this.m_jointCount = 0;
+      this.m_controllerCount = 0;
+      b2World.m_warmStarting = true;
+      b2World.m_continuousPhysics = true;
+      this.m_allowSleep = doSleep;
+      this.m_gravity = gravity;
+      this.m_inv_dt0 = 0.0;
+      this.m_contactManager.m_world = this;
+      var bd = new b2BodyDef();
+      this.m_groundBody = this.CreateBody(bd);
+   }
+   b2World.prototype.SetDestructionListener = function (listener) {
+      this.m_destructionListener = listener;
+   }
+   b2World.prototype.SetContactFilter = function (filter) {
+      this.m_contactManager.m_contactFilter = filter;
+   }
+   b2World.prototype.SetContactListener = function (listener) {
+      this.m_contactManager.m_contactListener = listener;
+   }
+   b2World.prototype.SetDebugDraw = function (debugDraw) {
+      this.m_debugDraw = debugDraw;
+   }
+   b2World.prototype.SetBroadPhase = function (broadPhase) {
+      var oldBroadPhase = this.m_contactManager.m_broadPhase;
+      this.m_contactManager.m_broadPhase = broadPhase;
+      for (var b = this.m_bodyList; b; b = b.m_next) {
+         for (var f = b.m_fixtureList; f; f = f.m_next) {
+            f.m_proxy = broadPhase.CreateProxy(oldBroadPhase.GetFatAABB(f.m_proxy), f);
+         }
+      }
+   }
+   b2World.prototype.Validate = function () {
+      this.m_contactManager.m_broadPhase.Validate();
+   }
+   b2World.prototype.GetProxyCount = function () {
+      return this.m_contactManager.m_broadPhase.GetProxyCount();
+   }
+   b2World.prototype.CreateBody = function (def) {
+      if (this.IsLocked() == true) {
+         return null;
+      }
+      var b = new b2Body(def, this);
+      b.m_prev = null;
+      b.m_next = this.m_bodyList;
+      if (this.m_bodyList) {
+         this.m_bodyList.m_prev = b;
+      }
+      this.m_bodyList = b;
+      ++this.m_bodyCount;
+      return b;
+   }
+   b2World.prototype.DestroyBody = function (b) {
+      if (this.IsLocked() == true) {
+         return;
+      }
+      var jn = b.m_jointList;
+      while (jn) {
+         var jn0 = jn;
+         jn = jn.next;
+         if (this.m_destructionListener) {
+            this.m_destructionListener.SayGoodbyeJoint(jn0.joint);
+         }
+         this.DestroyJoint(jn0.joint);
+      }
+      var coe = b.m_controllerList;
+      while (coe) {
+         var coe0 = coe;
+         coe = coe.nextController;
+         coe0.controller.RemoveBody(b);
+      }
+      var ce = b.m_contactList;
+      while (ce) {
+         var ce0 = ce;
+         ce = ce.next;
+         this.m_contactManager.Destroy(ce0.contact);
+      }
+      b.m_contactList = null;
+      var f = b.m_fixtureList;
+      while (f) {
+         var f0 = f;
+         f = f.m_next;
+         if (this.m_destructionListener) {
+            this.m_destructionListener.SayGoodbyeFixture(f0);
+         }
+         f0.DestroyProxy(this.m_contactManager.m_broadPhase);
+         f0.Destroy();
+      }
+      b.m_fixtureList = null;
+      b.m_fixtureCount = 0;
+      if (b.m_prev) {
+         b.m_prev.m_next = b.m_next;
+      }
+      if (b.m_next) {
+         b.m_next.m_prev = b.m_prev;
+      }
+      if (b == this.m_bodyList) {
+         this.m_bodyList = b.m_next;
+      }--this.m_bodyCount;
+   }
+   b2World.prototype.CreateJoint = function (def) {
+      var j = b2Joint.Create(def, null);
+      j.m_prev = null;
+      j.m_next = this.m_jointList;
+      if (this.m_jointList) {
+         this.m_jointList.m_prev = j;
+      }
+      this.m_jointList = j;
+      ++this.m_jointCount;
+      j.m_edgeA.joint = j;
+      j.m_edgeA.other = j.m_bodyB;
+      j.m_edgeA.prev = null;
+      j.m_edgeA.next = j.m_bodyA.m_jointList;
+      if (j.m_bodyA.m_jointList) j.m_bodyA.m_jointList.prev = j.m_edgeA;
+      j.m_bodyA.m_jointList = j.m_edgeA;
+      j.m_edgeB.joint = j;
+      j.m_edgeB.other = j.m_bodyA;
+      j.m_edgeB.prev = null;
+      j.m_edgeB.next = j.m_bodyB.m_jointList;
+      if (j.m_bodyB.m_jointList) j.m_bodyB.m_jointList.prev = j.m_edgeB;
+      j.m_bodyB.m_jointList = j.m_edgeB;
+      var bodyA = def.bodyA;
+      var bodyB = def.bodyB;
+      if (def.collideConnected == false) {
+         var edge = bodyB.GetContactList();
+         while (edge) {
+            if (edge.other == bodyA) {
+               edge.contact.FlagForFiltering();
+            }
+            edge = edge.next;
+         }
+      }
+      return j;
+   }
+   b2World.prototype.DestroyJoint = function (j) {
+      var collideConnected = j.m_collideConnected;
+      if (j.m_prev) {
+         j.m_prev.m_next = j.m_next;
+      }
+      if (j.m_next) {
+         j.m_next.m_prev = j.m_prev;
+      }
+      if (j == this.m_jointList) {
+         this.m_jointList = j.m_next;
+      }
+      var bodyA = j.m_bodyA;
+      var bodyB = j.m_bodyB;
+      bodyA.SetAwake(true);
+      bodyB.SetAwake(true);
+      if (j.m_edgeA.prev) {
+         j.m_edgeA.prev.next = j.m_edgeA.next;
+      }
+      if (j.m_edgeA.next) {
+         j.m_edgeA.next.prev = j.m_edgeA.prev;
+      }
+      if (j.m_edgeA == bodyA.m_jointList) {
+         bodyA.m_jointList = j.m_edgeA.next;
+      }
+      j.m_edgeA.prev = null;
+      j.m_edgeA.next = null;
+      if (j.m_edgeB.prev) {
+         j.m_edgeB.prev.next = j.m_edgeB.next;
+      }
+      if (j.m_edgeB.next) {
+         j.m_edgeB.next.prev = j.m_edgeB.prev;
+      }
+      if (j.m_edgeB == bodyB.m_jointList) {
+         bodyB.m_jointList = j.m_edgeB.next;
+      }
+      j.m_edgeB.prev = null;
+      j.m_edgeB.next = null;
+      b2Joint.Destroy(j, null);
+      --this.m_jointCount;
+      if (collideConnected == false) {
+         var edge = bodyB.GetContactList();
+         while (edge) {
+            if (edge.other == bodyA) {
+               edge.contact.FlagForFiltering();
+            }
+            edge = edge.next;
+         }
+      }
+   }
+   b2World.prototype.AddController = function (c) {
+      c.m_next = this.m_controllerList;
+      c.m_prev = null;
+      this.m_controllerList = c;
+      c.m_world = this;
+      this.m_controllerCount++;
+      return c;
+   }
+   b2World.prototype.RemoveController = function (c) {
+      if (c.m_prev) c.m_prev.m_next = c.m_next;
+      if (c.m_next) c.m_next.m_prev = c.m_prev;
+      if (this.m_controllerList == c) this.m_controllerList = c.m_next;
+      this.m_controllerCount--;
+   }
+   b2World.prototype.CreateController = function (controller) {
+      if (controller.m_world != this) throw new Error("Controller can only be a member of one world");
+      controller.m_next = this.m_controllerList;
+      controller.m_prev = null;
+      if (this.m_controllerList) this.m_controllerList.m_prev = controller;
+      this.m_controllerList = controller;
+      ++this.m_controllerCount;
+      controller.m_world = this;
+      return controller;
+   }
+   b2World.prototype.DestroyController = function (controller) {
+      controller.Clear();
+      if (controller.m_next) controller.m_next.m_prev = controller.m_prev;
+      if (controller.m_prev) controller.m_prev.m_next = controller.m_next;
+      if (controller == this.m_controllerList) this.m_controllerList = controller.m_next;
+      --this.m_controllerCount;
+   }
+   b2World.prototype.SetWarmStarting = function (flag) {
+      b2World.m_warmStarting = flag;
+   }
+   b2World.prototype.SetContinuousPhysics = function (flag) {
+      b2World.m_continuousPhysics = flag;
+   }
+   b2World.prototype.GetBodyCount = function () {
+      return this.m_bodyCount;
+   }
+   b2World.prototype.GetJointCount = function () {
+      return this.m_jointCount;
+   }
+   b2World.prototype.GetContactCount = function () {
+      return this.m_contactCount;
+   }
+   b2World.prototype.SetGravity = function (gravity) {
+      this.m_gravity = gravity;
+   }
+   b2World.prototype.GetGravity = function () {
+      return this.m_gravity;
+   }
+   b2World.prototype.GetGroundBody = function () {
+      return this.m_groundBody;
+   }
+   b2World.prototype.Step = function (dt, velocityIterations, positionIterations) {
+      if (dt === undefined) dt = 0;
+      if (velocityIterations === undefined) velocityIterations = 0;
+      if (positionIterations === undefined) positionIterations = 0;
+      if (this.m_flags & b2World.e_newFixture) {
+         this.m_contactManager.FindNewContacts();
+         this.m_flags &= ~b2World.e_newFixture;
+      }
+      this.m_flags |= b2World.e_locked;
+      var step = b2World.s_timestep2;
+      step.dt = dt;
+      step.velocityIterations = velocityIterations;
+      step.positionIterations = positionIterations;
+      if (dt > 0.0) {
+         step.inv_dt = 1.0 / dt;
+      }
+      else {
+         step.inv_dt = 0.0;
+      }
+      step.dtRatio = this.m_inv_dt0 * dt;
+      step.warmStarting = b2World.m_warmStarting;
+      this.m_contactManager.Collide();
+      if (step.dt > 0.0) {
+         this.Solve(step);
+      }
+      if (b2World.m_continuousPhysics && step.dt > 0.0) {
+         this.SolveTOI(step);
+      }
+      if (step.dt > 0.0) {
+         this.m_inv_dt0 = step.inv_dt;
+      }
+      this.m_flags &= ~b2World.e_locked;
+   }
+   b2World.prototype.ClearForces = function () {
+      for (var body = this.m_bodyList; body; body = body.m_next) {
+         body.m_force.SetZero();
+         body.m_torque = 0.0;
+      }
+   }
+   b2World.prototype.DrawDebugData = function () {
+      if (this.m_debugDraw == null) {
+         return;
+      }
+      this.m_debugDraw.m_sprite.graphics.clear();
+      var flags = this.m_debugDraw.GetFlags();
+      var i = 0;
+      var b;
+      var f;
+      var s;
+      var j;
+      var bp;
+      var invQ = new b2Vec2;
+      var x1 = new b2Vec2;
+      var x2 = new b2Vec2;
+      var xf;
+      var b1 = new b2AABB();
+      var b2 = new b2AABB();
+      var vs = [new b2Vec2(), new b2Vec2(), new b2Vec2(), new b2Vec2()];
+      var color = new b2Color(0, 0, 0);
+      if (flags & b2DebugDraw.e_shapeBit) {
+         for (b = this.m_bodyList;
+         b; b = b.m_next) {
+            xf = b.m_xf;
+            for (f = b.GetFixtureList();
+            f; f = f.m_next) {
+               s = f.GetShape();
+               if (b.IsActive() == false) {
+                  color.Set(0.5, 0.5, 0.3);
+                  this.DrawShape(s, xf, color);
+               }
+               else if (b.GetType() == b2Body.b2_staticBody) {
+                  color.Set(0.5, 0.9, 0.5);
+                  this.DrawShape(s, xf, color);
+               }
+               else if (b.GetType() == b2Body.b2_kinematicBody) {
+                  color.Set(0.5, 0.5, 0.9);
+                  this.DrawShape(s, xf, color);
+               }
+               else if (b.IsAwake() == false) {
+                  color.Set(0.6, 0.6, 0.6);
+                  this.DrawShape(s, xf, color);
+               }
+               else {
+                  color.Set(0.9, 0.7, 0.7);
+                  this.DrawShape(s, xf, color);
+               }
+            }
+         }
+      }
+      if (flags & b2DebugDraw.e_jointBit) {
+         for (j = this.m_jointList;
+         j; j = j.m_next) {
+            this.DrawJoint(j);
+         }
+      }
+      if (flags & b2DebugDraw.e_controllerBit) {
+         for (var c = this.m_controllerList; c; c = c.m_next) {
+            c.Draw(this.m_debugDraw);
+         }
+      }
+      if (flags & b2DebugDraw.e_pairBit) {
+         color.Set(0.3, 0.9, 0.9);
+         for (var contact = this.m_contactManager.m_contactList; contact; contact = contact.GetNext()) {
+            var fixtureA = contact.GetFixtureA();
+            var fixtureB = contact.GetFixtureB();
+            var cA = fixtureA.GetAABB().GetCenter();
+            var cB = fixtureB.GetAABB().GetCenter();
+            this.m_debugDraw.DrawSegment(cA, cB, color);
+         }
+      }
+      if (flags & b2DebugDraw.e_aabbBit) {
+         bp = this.m_contactManager.m_broadPhase;
+         vs = [new b2Vec2(), new b2Vec2(), new b2Vec2(), new b2Vec2()];
+         for (b = this.m_bodyList;
+         b; b = b.GetNext()) {
+            if (b.IsActive() == false) {
+               continue;
+            }
+            for (f = b.GetFixtureList();
+            f; f = f.GetNext()) {
+               var aabb = bp.GetFatAABB(f.m_proxy);
+               vs[0].Set(aabb.lowerBound.x, aabb.lowerBound.y);
+               vs[1].Set(aabb.upperBound.x, aabb.lowerBound.y);
+               vs[2].Set(aabb.upperBound.x, aabb.upperBound.y);
+               vs[3].Set(aabb.lowerBound.x, aabb.upperBound.y);
+               this.m_debugDraw.DrawPolygon(vs, 4, color);
+            }
+         }
+      }
+      if (flags & b2DebugDraw.e_centerOfMassBit) {
+         for (b = this.m_bodyList;
+         b; b = b.m_next) {
+            xf = b2World.s_xf;
+            xf.R = b.m_xf.R;
+            xf.position = b.GetWorldCenter();
+            this.m_debugDraw.DrawTransform(xf);
+         }
+      }
+   }
+   b2World.prototype.QueryAABB = function (callback, aabb) {
+      var __this = this;
+      var broadPhase = __this.m_contactManager.m_broadPhase;
+
+      function WorldQueryWrapper(proxy) {
+         return callback(broadPhase.GetUserData(proxy));
+      };
+      broadPhase.Query(WorldQueryWrapper, aabb);
+   }
+   b2World.prototype.QueryShape = function (callback, shape, transform) {
+      var __this = this;
+      if (transform === undefined) transform = null;
+      if (transform == null) {
+         transform = new b2Transform();
+         transform.SetIdentity();
+      }
+      var broadPhase = __this.m_contactManager.m_broadPhase;
+
+      function WorldQueryWrapper(proxy) {
+         var fixture = (broadPhase.GetUserData(proxy) instanceof b2Fixture ? broadPhase.GetUserData(proxy) : null);
+         if (b2Shape.TestOverlap(shape, transform, fixture.GetShape(), fixture.GetBody().GetTransform())) return callback(fixture);
+         return true;
+      };
+      var aabb = new b2AABB();
+      shape.ComputeAABB(aabb, transform);
+      broadPhase.Query(WorldQueryWrapper, aabb);
+   }
+   b2World.prototype.QueryPoint = function (callback, p) {
+      var __this = this;
+      var broadPhase = __this.m_contactManager.m_broadPhase;
+
+      function WorldQueryWrapper(proxy) {
+         var fixture = (broadPhase.GetUserData(proxy) instanceof b2Fixture ? broadPhase.GetUserData(proxy) : null);
+         if (fixture.TestPoint(p)) return callback(fixture);
+         return true;
+      };
+      var aabb = new b2AABB();
+      aabb.lowerBound.Set(p.x - b2Settings.b2_linearSlop, p.y - b2Settings.b2_linearSlop);
+      aabb.upperBound.Set(p.x + b2Settings.b2_linearSlop, p.y + b2Settings.b2_linearSlop);
+      broadPhase.Query(WorldQueryWrapper, aabb);
+   }
+   b2World.prototype.RayCast = function (callback, point1, point2) {
+      var __this = this;
+      var broadPhase = __this.m_contactManager.m_broadPhase;
+      var output = new b2RayCastOutput;
+
+      function RayCastWrapper(input, proxy) {
+         var userData = broadPhase.GetUserData(proxy);
+         var fixture = (userData instanceof b2Fixture ? userData : null);
+         var hit = fixture.RayCast(output, input);
+         if (hit) {
+            var fraction = output.fraction;
+            var point = new b2Vec2((1.0 - fraction) * point1.x + fraction * point2.x, (1.0 - fraction) * point1.y + fraction * point2.y);
+            return callback(fixture, point, output.normal, fraction);
+         }
+         return input.maxFraction;
+      };
+      var input = new b2RayCastInput(point1, point2);
+      broadPhase.RayCast(RayCastWrapper, input);
+   }
+   b2World.prototype.RayCastOne = function (point1, point2) {
+      var __this = this;
+      var result;
+
+      function RayCastOneWrapper(fixture, point, normal, fraction) {
+         if (fraction === undefined) fraction = 0;
+         result = fixture;
+         return fraction;
+      };
+      __this.RayCast(RayCastOneWrapper, point1, point2);
+      return result;
+   }
+   b2World.prototype.RayCastAll = function (point1, point2) {
+      var __this = this;
+      var result = new Vector();
+
+      function RayCastAllWrapper(fixture, point, normal, fraction) {
+         if (fraction === undefined) fraction = 0;
+         result[result.length] = fixture;
+         return 1;
+      };
+      __this.RayCast(RayCastAllWrapper, point1, point2);
+      return result;
+   }
+   b2World.prototype.GetBodyList = function () {
+      return this.m_bodyList;
+   }
+   b2World.prototype.GetJointList = function () {
+      return this.m_jointList;
+   }
+   b2World.prototype.GetContactList = function () {
+      return this.m_contactList;
+   }
+   b2World.prototype.IsLocked = function () {
+      return (this.m_flags & b2World.e_locked) > 0;
+   }
+   b2World.prototype.Solve = function (step) {
+      var b;
+      for (var controller = this.m_controllerList; controller; controller = controller.m_next) {
+         controller.Step(step);
+      }
+      var island = this.m_island;
+      island.Initialize(this.m_bodyCount, this.m_contactCount, this.m_jointCount, null, this.m_contactManager.m_contactListener, this.m_contactSolver);
+      for (b = this.m_bodyList;
+      b; b = b.m_next) {
+         b.m_flags &= ~b2Body.e_islandFlag;
+      }
+      for (var c = this.m_contactList; c; c = c.m_next) {
+         c.m_flags &= ~b2Contact.e_islandFlag;
+      }
+      for (var j = this.m_jointList; j; j = j.m_next) {
+         j.m_islandFlag = false;
+      }
+      var stackSize = parseInt(this.m_bodyCount);
+      var stack = this.s_stack;
+      for (var seed = this.m_bodyList; seed; seed = seed.m_next) {
+         if (seed.m_flags & b2Body.e_islandFlag) {
+            continue;
+         }
+         if (seed.IsAwake() == false || seed.IsActive() == false) {
+            continue;
+         }
+         if (seed.GetType() == b2Body.b2_staticBody) {
+            continue;
+         }
+         island.Clear();
+         var stackCount = 0;
+         stack[stackCount++] = seed;
+         seed.m_flags |= b2Body.e_islandFlag;
+         while (stackCount > 0) {
+            b = stack[--stackCount];
+            island.AddBody(b);
+            if (b.IsAwake() == false) {
+               b.SetAwake(true);
+            }
+            if (b.GetType() == b2Body.b2_staticBody) {
+               continue;
+            }
+            var other;
+            for (var ce = b.m_contactList; ce; ce = ce.next) {
+               if (ce.contact.m_flags & b2Contact.e_islandFlag) {
+                  continue;
+               }
+               if (ce.contact.IsSensor() == true || ce.contact.IsEnabled() == false || ce.contact.IsTouching() == false) {
+                  continue;
+               }
+               island.AddContact(ce.contact);
+               ce.contact.m_flags |= b2Contact.e_islandFlag;
+               other = ce.other;
+               if (other.m_flags & b2Body.e_islandFlag) {
+                  continue;
+               }
+               stack[stackCount++] = other;
+               other.m_flags |= b2Body.e_islandFlag;
+            }
+            for (var jn = b.m_jointList; jn; jn = jn.next) {
+               if (jn.joint.m_islandFlag == true) {
+                  continue;
+               }
+               other = jn.other;
+               if (other.IsActive() == false) {
+                  continue;
+               }
+               island.AddJoint(jn.joint);
+               jn.joint.m_islandFlag = true;
+               if (other.m_flags & b2Body.e_islandFlag) {
+                  continue;
+               }
+               stack[stackCount++] = other;
+               other.m_flags |= b2Body.e_islandFlag;
+            }
+         }
+         island.Solve(step, this.m_gravity, this.m_allowSleep);
+         for (var i = 0; i < island.m_bodyCount; ++i) {
+            b = island.m_bodies[i];
+            if (b.GetType() == b2Body.b2_staticBody) {
+               b.m_flags &= ~b2Body.e_islandFlag;
+            }
+         }
+      }
+      for (i = 0;
+      i < stack.length; ++i) {
+         if (!stack[i]) break;
+         stack[i] = null;
+      }
+      for (b = this.m_bodyList;
+      b; b = b.m_next) {
+         if (b.IsAwake() == false || b.IsActive() == false) {
+            continue;
+         }
+         if (b.GetType() == b2Body.b2_staticBody) {
+            continue;
+         }
+         b.SynchronizeFixtures();
+      }
+      this.m_contactManager.FindNewContacts();
+   }
+   b2World.prototype.SolveTOI = function (step) {
+      var b;
+      var fA;
+      var fB;
+      var bA;
+      var bB;
+      var cEdge;
+      var j;
+      var island = this.m_island;
+      island.Initialize(this.m_bodyCount, b2Settings.b2_maxTOIContactsPerIsland, b2Settings.b2_maxTOIJointsPerIsland, null, this.m_contactManager.m_contactListener, this.m_contactSolver);
+      var queue = b2World.s_queue;
+      for (b = this.m_bodyList;
+      b; b = b.m_next) {
+         b.m_flags &= ~b2Body.e_islandFlag;
+         b.m_sweep.t0 = 0.0;
+      }
+      var c;
+      for (c = this.m_contactList;
+      c; c = c.m_next) {
+         c.m_flags &= ~ (b2Contact.e_toiFlag | b2Contact.e_islandFlag);
+      }
+      for (j = this.m_jointList;
+      j; j = j.m_next) {
+         j.m_islandFlag = false;
+      }
+      for (;;) {
+         var minContact = null;
+         var minTOI = 1.0;
+         for (c = this.m_contactList;
+         c; c = c.m_next) {
+            if (c.IsSensor() == true || c.IsEnabled() == false || c.IsContinuous() == false) {
+               continue;
+            }
+            var toi = 1.0;
+            if (c.m_flags & b2Contact.e_toiFlag) {
+               toi = c.m_toi;
+            }
+            else {
+               fA = c.m_fixtureA;
+               fB = c.m_fixtureB;
+               bA = fA.m_body;
+               bB = fB.m_body;
+               if ((bA.GetType() != b2Body.b2_dynamicBody || bA.IsAwake() == false) && (bB.GetType() != b2Body.b2_dynamicBody || bB.IsAwake() == false)) {
+                  continue;
+               }
+               var t0 = bA.m_sweep.t0;
+               if (bA.m_sweep.t0 < bB.m_sweep.t0) {
+                  t0 = bB.m_sweep.t0;
+                  bA.m_sweep.Advance(t0);
+               }
+               else if (bB.m_sweep.t0 < bA.m_sweep.t0) {
+                  t0 = bA.m_sweep.t0;
+                  bB.m_sweep.Advance(t0);
+               }
+               toi = c.ComputeTOI(bA.m_sweep, bB.m_sweep);
+               b2Settings.b2Assert(0.0 <= toi && toi <= 1.0);
+               if (toi > 0.0 && toi < 1.0) {
+                  toi = (1.0 - toi) * t0 + toi;
+                  if (toi > 1) toi = 1;
+               }
+               c.m_toi = toi;
+               c.m_flags |= b2Contact.e_toiFlag;
+            }
+            if (Number.MIN_VALUE < toi && toi < minTOI) {
+               minContact = c;
+               minTOI = toi;
+            }
+         }
+         if (minContact == null || 1.0 - 100.0 * Number.MIN_VALUE < minTOI) {
+            break;
+         }
+         fA = minContact.m_fixtureA;
+         fB = minContact.m_fixtureB;
+         bA = fA.m_body;
+         bB = fB.m_body;
+         b2World.s_backupA.Set(bA.m_sweep);
+         b2World.s_backupB.Set(bB.m_sweep);
+         bA.Advance(minTOI);
+         bB.Advance(minTOI);
+         minContact.Update(this.m_contactManager.m_contactListener);
+         minContact.m_flags &= ~b2Contact.e_toiFlag;
+         if (minContact.IsSensor() == true || minContact.IsEnabled() == false) {
+            bA.m_sweep.Set(b2World.s_backupA);
+            bB.m_sweep.Set(b2World.s_backupB);
+            bA.SynchronizeTransform();
+            bB.SynchronizeTransform();
+            continue;
+         }
+         if (minContact.IsTouching() == false) {
+            continue;
+         }
+         var seed = bA;
+         if (seed.GetType() != b2Body.b2_dynamicBody) {
+            seed = bB;
+         }
+         island.Clear();
+         var queueStart = 0;
+         var queueSize = 0;
+         queue[queueStart + queueSize++] = seed;
+         seed.m_flags |= b2Body.e_islandFlag;
+         while (queueSize > 0) {
+            b = queue[queueStart++];
+            --queueSize;
+            island.AddBody(b);
+            if (b.IsAwake() == false) {
+               b.SetAwake(true);
+            }
+            if (b.GetType() != b2Body.b2_dynamicBody) {
+               continue;
+            }
+            for (cEdge = b.m_contactList;
+            cEdge; cEdge = cEdge.next) {
+               if (island.m_contactCount == island.m_contactCapacity) {
+                  break;
+               }
+               if (cEdge.contact.m_flags & b2Contact.e_islandFlag) {
+                  continue;
+               }
+               if (cEdge.contact.IsSensor() == true || cEdge.contact.IsEnabled() == false || cEdge.contact.IsTouching() == false) {
+                  continue;
+               }
+               island.AddContact(cEdge.contact);
+               cEdge.contact.m_flags |= b2Contact.e_islandFlag;
+               var other = cEdge.other;
+               if (other.m_flags & b2Body.e_islandFlag) {
+                  continue;
+               }
+               if (other.GetType() != b2Body.b2_staticBody) {
+                  other.Advance(minTOI);
+                  other.SetAwake(true);
+               }
+               queue[queueStart + queueSize] = other;
+               ++queueSize;
+               other.m_flags |= b2Body.e_islandFlag;
+            }
+            for (var jEdge = b.m_jointList; jEdge; jEdge = jEdge.next) {
+               if (island.m_jointCount == island.m_jointCapacity) continue;
+               if (jEdge.joint.m_islandFlag == true) continue;
+               other = jEdge.other;
+               if (other.IsActive() == false) {
+                  continue;
+               }
+               island.AddJoint(jEdge.joint);
+               jEdge.joint.m_islandFlag = true;
+               if (other.m_flags & b2Body.e_islandFlag) continue;
+               if (other.GetType() != b2Body.b2_staticBody) {
+                  other.Advance(minTOI);
+                  other.SetAwake(true);
+               }
+               queue[queueStart + queueSize] = other;
+               ++queueSize;
+               other.m_flags |= b2Body.e_islandFlag;
+            }
+         }
+         var subStep = b2World.s_timestep;
+         subStep.warmStarting = false;
+         subStep.dt = (1.0 - minTOI) * step.dt;
+         subStep.inv_dt = 1.0 / subStep.dt;
+         subStep.dtRatio = 0.0;
+         subStep.velocityIterations = step.velocityIterations;
+         subStep.positionIterations = step.positionIterations;
+         island.SolveTOI(subStep);
+         var i = 0;
+         for (i = 0;
+         i < island.m_bodyCount; ++i) {
+            b = island.m_bodies[i];
+            b.m_flags &= ~b2Body.e_islandFlag;
+            if (b.IsAwake() == false) {
+               continue;
+            }
+            if (b.GetType() != b2Body.b2_dynamicBody) {
+               continue;
+            }
+            b.SynchronizeFixtures();
+            for (cEdge = b.m_contactList;
+            cEdge; cEdge = cEdge.next) {
+               cEdge.contact.m_flags &= ~b2Contact.e_toiFlag;
+            }
+         }
+         for (i = 0;
+         i < island.m_contactCount; ++i) {
+            c = island.m_contacts[i];
+            c.m_flags &= ~ (b2Contact.e_toiFlag | b2Contact.e_islandFlag);
+         }
+         for (i = 0;
+         i < island.m_jointCount; ++i) {
+            j = island.m_joints[i];
+            j.m_islandFlag = false;
+         }
+         this.m_contactManager.FindNewContacts();
+      }
+   }
+   b2World.prototype.DrawJoint = function (joint) {
+      var b1 = joint.GetBodyA();
+      var b2 = joint.GetBodyB();
+      var xf1 = b1.m_xf;
+      var xf2 = b2.m_xf;
+      var x1 = xf1.position;
+      var x2 = xf2.position;
+      var p1 = joint.GetAnchorA();
+      var p2 = joint.GetAnchorB();
+      var color = b2World.s_jointColor;
+      switch (joint.m_type) {
+      case b2Joint.e_distanceJoint:
+         this.m_debugDraw.DrawSegment(p1, p2, color);
+         break;
+      case b2Joint.e_pulleyJoint:
+         {
+            var pulley = ((joint instanceof b2PulleyJoint ? joint : null));
+            var s1 = pulley.GetGroundAnchorA();
+            var s2 = pulley.GetGroundAnchorB();
+            this.m_debugDraw.DrawSegment(s1, p1, color);
+            this.m_debugDraw.DrawSegment(s2, p2, color);
+            this.m_debugDraw.DrawSegment(s1, s2, color);
+         }
+         break;
+      case b2Joint.e_mouseJoint:
+         this.m_debugDraw.DrawSegment(p1, p2, color);
+         break;
+      default:
+         if (b1 != this.m_groundBody) this.m_debugDraw.DrawSegment(x1, p1, color);
+         this.m_debugDraw.DrawSegment(p1, p2, color);
+         if (b2 != this.m_groundBody) this.m_debugDraw.DrawSegment(x2, p2, color);
+      }
+   }
+   b2World.prototype.DrawShape = function (shape, xf, color) {
+      switch (shape.m_type) {
+      case b2Shape.e_circleShape:
+         {
+            var circle = ((shape instanceof b2CircleShape ? shape : null));
+            var center = b2Math.MulX(xf, circle.m_p);
+            var radius = circle.m_radius;
+            var axis = xf.R.col1;
+            this.m_debugDraw.DrawSolidCircle(center, radius, axis, color);
+         }
+         break;
+      case b2Shape.e_polygonShape:
+         {
+            var i = 0;
+            var poly = ((shape instanceof b2PolygonShape ? shape : null));
+            var vertexCount = parseInt(poly.GetVertexCount());
+            var localVertices = poly.GetVertices();
+            var vertices = new Vector(vertexCount);
+            for (i = 0;
+            i < vertexCount; ++i) {
+               vertices[i] = b2Math.MulX(xf, localVertices[i]);
+            }
+            this.m_debugDraw.DrawSolidPolygon(vertices, vertexCount, color);
+         }
+         break;
+      case b2Shape.e_edgeShape:
+         {
+            var edge = (shape instanceof b2EdgeShape ? shape : null);
+            this.m_debugDraw.DrawSegment(b2Math.MulX(xf, edge.GetVertex1()), b2Math.MulX(xf, edge.GetVertex2()), color);
+         }
+         break;
+      }
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Dynamics.b2World.s_timestep2 = new b2TimeStep();
+      Box2D.Dynamics.b2World.s_xf = new b2Transform();
+      Box2D.Dynamics.b2World.s_backupA = new b2Sweep();
+      Box2D.Dynamics.b2World.s_backupB = new b2Sweep();
+      Box2D.Dynamics.b2World.s_timestep = new b2TimeStep();
+      Box2D.Dynamics.b2World.s_queue = new Vector();
+      Box2D.Dynamics.b2World.s_jointColor = new b2Color(0.5, 0.8, 0.8);
+      Box2D.Dynamics.b2World.e_newFixture = 0x0001;
+      Box2D.Dynamics.b2World.e_locked = 0x0002;
+   });
+})();
+(function () {
+   var b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
+      b2EdgeChainDef = Box2D.Collision.Shapes.b2EdgeChainDef,
+      b2EdgeShape = Box2D.Collision.Shapes.b2EdgeShape,
+      b2MassData = Box2D.Collision.Shapes.b2MassData,
+      b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
+      b2Shape = Box2D.Collision.Shapes.b2Shape,
+      b2CircleContact = Box2D.Dynamics.Contacts.b2CircleContact,
+      b2Contact = Box2D.Dynamics.Contacts.b2Contact,
+      b2ContactConstraint = Box2D.Dynamics.Contacts.b2ContactConstraint,
+      b2ContactConstraintPoint = Box2D.Dynamics.Contacts.b2ContactConstraintPoint,
+      b2ContactEdge = Box2D.Dynamics.Contacts.b2ContactEdge,
+      b2ContactFactory = Box2D.Dynamics.Contacts.b2ContactFactory,
+      b2ContactRegister = Box2D.Dynamics.Contacts.b2ContactRegister,
+      b2ContactResult = Box2D.Dynamics.Contacts.b2ContactResult,
+      b2ContactSolver = Box2D.Dynamics.Contacts.b2ContactSolver,
+      b2EdgeAndCircleContact = Box2D.Dynamics.Contacts.b2EdgeAndCircleContact,
+      b2NullContact = Box2D.Dynamics.Contacts.b2NullContact,
+      b2PolyAndCircleContact = Box2D.Dynamics.Contacts.b2PolyAndCircleContact,
+      b2PolyAndEdgeContact = Box2D.Dynamics.Contacts.b2PolyAndEdgeContact,
+      b2PolygonContact = Box2D.Dynamics.Contacts.b2PolygonContact,
+      b2PositionSolverManifold = Box2D.Dynamics.Contacts.b2PositionSolverManifold,
+      b2Body = Box2D.Dynamics.b2Body,
+      b2BodyDef = Box2D.Dynamics.b2BodyDef,
+      b2ContactFilter = Box2D.Dynamics.b2ContactFilter,
+      b2ContactImpulse = Box2D.Dynamics.b2ContactImpulse,
+      b2ContactListener = Box2D.Dynamics.b2ContactListener,
+      b2ContactManager = Box2D.Dynamics.b2ContactManager,
+      b2DebugDraw = Box2D.Dynamics.b2DebugDraw,
+      b2DestructionListener = Box2D.Dynamics.b2DestructionListener,
+      b2FilterData = Box2D.Dynamics.b2FilterData,
+      b2Fixture = Box2D.Dynamics.b2Fixture,
+      b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
+      b2Island = Box2D.Dynamics.b2Island,
+      b2TimeStep = Box2D.Dynamics.b2TimeStep,
+      b2World = Box2D.Dynamics.b2World,
+      b2Color = Box2D.Common.b2Color,
+      b2internal = Box2D.Common.b2internal,
+      b2Settings = Box2D.Common.b2Settings,
+      b2Mat22 = Box2D.Common.Math.b2Mat22,
+      b2Mat33 = Box2D.Common.Math.b2Mat33,
+      b2Math = Box2D.Common.Math.b2Math,
+      b2Sweep = Box2D.Common.Math.b2Sweep,
+      b2Transform = Box2D.Common.Math.b2Transform,
+      b2Vec2 = Box2D.Common.Math.b2Vec2,
+      b2Vec3 = Box2D.Common.Math.b2Vec3,
+      b2AABB = Box2D.Collision.b2AABB,
+      b2Bound = Box2D.Collision.b2Bound,
+      b2BoundValues = Box2D.Collision.b2BoundValues,
+      b2Collision = Box2D.Collision.b2Collision,
+      b2ContactID = Box2D.Collision.b2ContactID,
+      b2ContactPoint = Box2D.Collision.b2ContactPoint,
+      b2Distance = Box2D.Collision.b2Distance,
+      b2DistanceInput = Box2D.Collision.b2DistanceInput,
+      b2DistanceOutput = Box2D.Collision.b2DistanceOutput,
+      b2DistanceProxy = Box2D.Collision.b2DistanceProxy,
+      b2DynamicTree = Box2D.Collision.b2DynamicTree,
+      b2DynamicTreeBroadPhase = Box2D.Collision.b2DynamicTreeBroadPhase,
+      b2DynamicTreeNode = Box2D.Collision.b2DynamicTreeNode,
+      b2DynamicTreePair = Box2D.Collision.b2DynamicTreePair,
+      b2Manifold = Box2D.Collision.b2Manifold,
+      b2ManifoldPoint = Box2D.Collision.b2ManifoldPoint,
+      b2Point = Box2D.Collision.b2Point,
+      b2RayCastInput = Box2D.Collision.b2RayCastInput,
+      b2RayCastOutput = Box2D.Collision.b2RayCastOutput,
+      b2Segment = Box2D.Collision.b2Segment,
+      b2SeparationFunction = Box2D.Collision.b2SeparationFunction,
+      b2Simplex = Box2D.Collision.b2Simplex,
+      b2SimplexCache = Box2D.Collision.b2SimplexCache,
+      b2SimplexVertex = Box2D.Collision.b2SimplexVertex,
+      b2TimeOfImpact = Box2D.Collision.b2TimeOfImpact,
+      b2TOIInput = Box2D.Collision.b2TOIInput,
+      b2WorldManifold = Box2D.Collision.b2WorldManifold,
+      ClipVertex = Box2D.Collision.ClipVertex,
+      Features = Box2D.Collision.Features,
+      IBroadPhase = Box2D.Collision.IBroadPhase;
+
+   Box2D.inherit(b2CircleContact, Box2D.Dynamics.Contacts.b2Contact);
+   b2CircleContact.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
+   b2CircleContact.b2CircleContact = function () {
+      Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments);
+   };
+   b2CircleContact.Create = function (allocator) {
+      return new b2CircleContact();
+   }
+   b2CircleContact.Destroy = function (contact, allocator) {}
+   b2CircleContact.prototype.Reset = function (fixtureA, fixtureB) {
+      this.__super.Reset.call(this, fixtureA, fixtureB);
+   }
+   b2CircleContact.prototype.Evaluate = function () {
+      var bA = this.m_fixtureA.GetBody();
+      var bB = this.m_fixtureB.GetBody();
+      b2Collision.CollideCircles(this.m_manifold, (this.m_fixtureA.GetShape() instanceof b2CircleShape ? this.m_fixtureA.GetShape() : null), bA.m_xf, (this.m_fixtureB.GetShape() instanceof b2CircleShape ? this.m_fixtureB.GetShape() : null), bB.m_xf);
+   }
+   b2Contact.b2Contact = function () {
+      this.m_nodeA = new b2ContactEdge();
+      this.m_nodeB = new b2ContactEdge();
+      this.m_manifold = new b2Manifold();
+      this.m_oldManifold = new b2Manifold();
+   };
+   b2Contact.prototype.GetManifold = function () {
+      return this.m_manifold;
+   }
+   b2Contact.prototype.GetWorldManifold = function (worldManifold) {
+      var bodyA = this.m_fixtureA.GetBody();
+      var bodyB = this.m_fixtureB.GetBody();
+      var shapeA = this.m_fixtureA.GetShape();
+      var shapeB = this.m_fixtureB.GetShape();
+      worldManifold.Initialize(this.m_manifold, bodyA.GetTransform(), shapeA.m_radius, bodyB.GetTransform(), shapeB.m_radius);
+   }
+   b2Contact.prototype.IsTouching = function () {
+      return (this.m_flags & b2Contact.e_touchingFlag) == b2Contact.e_touchingFlag;
+   }
+   b2Contact.prototype.IsContinuous = function () {
+      return (this.m_flags & b2Contact.e_continuousFlag) == b2Contact.e_continuousFlag;
+   }
+   b2Contact.prototype.SetSensor = function (sensor) {
+      if (sensor) {
+         this.m_flags |= b2Contact.e_sensorFlag;
+      }
+      else {
+         this.m_flags &= ~b2Contact.e_sensorFlag;
+      }
+   }
+   b2Contact.prototype.IsSensor = function () {
+      return (this.m_flags & b2Contact.e_sensorFlag) == b2Contact.e_sensorFlag;
+   }
+   b2Contact.prototype.SetEnabled = function (flag) {
+      if (flag) {
+         this.m_flags |= b2Contact.e_enabledFlag;
+      }
+      else {
+         this.m_flags &= ~b2Contact.e_enabledFlag;
+      }
+   }
+   b2Contact.prototype.IsEnabled = function () {
+      return (this.m_flags & b2Contact.e_enabledFlag) == b2Contact.e_enabledFlag;
+   }
+   b2Contact.prototype.GetNext = function () {
+      return this.m_next;
+   }
+   b2Contact.prototype.GetFixtureA = function () {
+      return this.m_fixtureA;
+   }
+   b2Contact.prototype.GetFixtureB = function () {
+      return this.m_fixtureB;
+   }
+   b2Contact.prototype.FlagForFiltering = function () {
+      this.m_flags |= b2Contact.e_filterFlag;
+   }
+   b2Contact.prototype.b2Contact = function () {}
+   b2Contact.prototype.Reset = function (fixtureA, fixtureB) {
+      if (fixtureA === undefined) fixtureA = null;
+      if (fixtureB === undefined) fixtureB = null;
+      this.m_flags = b2Contact.e_enabledFlag;
+      if (!fixtureA || !fixtureB) {
+         this.m_fixtureA = null;
+         this.m_fixtureB = null;
+         return;
+      }
+      if (fixtureA.IsSensor() || fixtureB.IsSensor()) {
+         this.m_flags |= b2Contact.e_sensorFlag;
+      }
+      var bodyA = fixtureA.GetBody();
+      var bodyB = fixtureB.GetBody();
+      if (bodyA.GetType() != b2Body.b2_dynamicBody || bodyA.IsBullet() || bodyB.GetType() != b2Body.b2_dynamicBody || bodyB.IsBullet()) {
+         this.m_flags |= b2Contact.e_continuousFlag;
+      }
+      this.m_fixtureA = fixtureA;
+      this.m_fixtureB = fixtureB;
+      this.m_manifold.m_pointCount = 0;
+      this.m_prev = null;
+      this.m_next = null;
+      this.m_nodeA.contact = null;
+      this.m_nodeA.prev = null;
+      this.m_nodeA.next = null;
+      this.m_nodeA.other = null;
+      this.m_nodeB.contact = null;
+      this.m_nodeB.prev = null;
+      this.m_nodeB.next = null;
+      this.m_nodeB.other = null;
+   }
+   b2Contact.prototype.Update = function (listener) {
+      var tManifold = this.m_oldManifold;
+      this.m_oldManifold = this.m_manifold;
+      this.m_manifold = tManifold;
+      this.m_flags |= b2Contact.e_enabledFlag;
+      var touching = false;
+      var wasTouching = (this.m_flags & b2Contact.e_touchingFlag) == b2Contact.e_touchingFlag;
+      var bodyA = this.m_fixtureA.m_body;
+      var bodyB = this.m_fixtureB.m_body;
+      var aabbOverlap = this.m_fixtureA.m_aabb.TestOverlap(this.m_fixtureB.m_aabb);
+      if (this.m_flags & b2Contact.e_sensorFlag) {
+         if (aabbOverlap) {
+            var shapeA = this.m_fixtureA.GetShape();
+            var shapeB = this.m_fixtureB.GetShape();
+            var xfA = bodyA.GetTransform();
+            var xfB = bodyB.GetTransform();
+            touching = b2Shape.TestOverlap(shapeA, xfA, shapeB, xfB);
+         }
+         this.m_manifold.m_pointCount = 0;
+      }
+      else {
+         if (bodyA.GetType() != b2Body.b2_dynamicBody || bodyA.IsBullet() || bodyB.GetType() != b2Body.b2_dynamicBody || bodyB.IsBullet()) {
+            this.m_flags |= b2Contact.e_continuousFlag;
+         }
+         else {
+            this.m_flags &= ~b2Contact.e_continuousFlag;
+         }
+         if (aabbOverlap) {
+            this.Evaluate();
+            touching = this.m_manifold.m_pointCount > 0;
+            for (var i = 0; i < this.m_manifold.m_pointCount; ++i) {
+               var mp2 = this.m_manifold.m_points[i];
+               mp2.m_normalImpulse = 0.0;
+               mp2.m_tangentImpulse = 0.0;
+               var id2 = mp2.m_id;
+               for (var j = 0; j < this.m_oldManifold.m_pointCount; ++j) {
+                  var mp1 = this.m_oldManifold.m_points[j];
+                  if (mp1.m_id.key == id2.key) {
+                     mp2.m_normalImpulse = mp1.m_normalImpulse;
+                     mp2.m_tangentImpulse = mp1.m_tangentImpulse;
+                     break;
+                  }
+               }
+            }
+         }
+         else {
+            this.m_manifold.m_pointCount = 0;
+         }
+         if (touching != wasTouching) {
+            bodyA.SetAwake(true);
+            bodyB.SetAwake(true);
+         }
+      }
+      if (touching) {
+         this.m_flags |= b2Contact.e_touchingFlag;
+      }
+      else {
+         this.m_flags &= ~b2Contact.e_touchingFlag;
+      }
+      if (wasTouching == false && touching == true) {
+         listener.BeginContact(this);
+      }
+      if (wasTouching == true && touching == false) {
+         listener.EndContact(this);
+      }
+      if ((this.m_flags & b2Contact.e_sensorFlag) == 0) {
+         listener.PreSolve(this, this.m_oldManifold);
+      }
+   }
+   b2Contact.prototype.Evaluate = function () {}
+   b2Contact.prototype.ComputeTOI = function (sweepA, sweepB) {
+      b2Contact.s_input.proxyA.Set(this.m_fixtureA.GetShape());
+      b2Contact.s_input.proxyB.Set(this.m_fixtureB.GetShape());
+      b2Contact.s_input.sweepA = sweepA;
+      b2Contact.s_input.sweepB = sweepB;
+      b2Contact.s_input.tolerance = b2Settings.b2_linearSlop;
+      return b2TimeOfImpact.TimeOfImpact(b2Contact.s_input);
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Dynamics.Contacts.b2Contact.e_sensorFlag = 0x0001;
+      Box2D.Dynamics.Contacts.b2Contact.e_continuousFlag = 0x0002;
+      Box2D.Dynamics.Contacts.b2Contact.e_islandFlag = 0x0004;
+      Box2D.Dynamics.Contacts.b2Contact.e_toiFlag = 0x0008;
+      Box2D.Dynamics.Contacts.b2Contact.e_touchingFlag = 0x0010;
+      Box2D.Dynamics.Contacts.b2Contact.e_enabledFlag = 0x0020;
+      Box2D.Dynamics.Contacts.b2Contact.e_filterFlag = 0x0040;
+      Box2D.Dynamics.Contacts.b2Contact.s_input = new b2TOIInput();
+   });
+   b2ContactConstraint.b2ContactConstraint = function () {
+      this.localPlaneNormal = new b2Vec2();
+      this.localPoint = new b2Vec2();
+      this.normal = new b2Vec2();
+      this.normalMass = new b2Mat22();
+      this.K = new b2Mat22();
+   };
+   b2ContactConstraint.prototype.b2ContactConstraint = function () {
+      this.points = new Vector(b2Settings.b2_maxManifoldPoints);
+      for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++) {
+         this.points[i] = new b2ContactConstraintPoint();
+      }
+   }
+   b2ContactConstraintPoint.b2ContactConstraintPoint = function () {
+      this.localPoint = new b2Vec2();
+      this.rA = new b2Vec2();
+      this.rB = new b2Vec2();
+   };
+   b2ContactEdge.b2ContactEdge = function () {};
+   b2ContactFactory.b2ContactFactory = function () {};
+   b2ContactFactory.prototype.b2ContactFactory = function (allocator) {
+      this.m_allocator = allocator;
+      this.InitializeRegisters();
+   }
+   b2ContactFactory.prototype.AddType = function (createFcn, destroyFcn, type1, type2) {
+      if (type1 === undefined) type1 = 0;
+      if (type2 === undefined) type2 = 0;
+      this.m_registers[type1][type2].createFcn = createFcn;
+      this.m_registers[type1][type2].destroyFcn = destroyFcn;
+      this.m_registers[type1][type2].primary = true;
+      if (type1 != type2) {
+         this.m_registers[type2][type1].createFcn = createFcn;
+         this.m_registers[type2][type1].destroyFcn = destroyFcn;
+         this.m_registers[type2][type1].primary = false;
+      }
+   }
+   b2ContactFactory.prototype.InitializeRegisters = function () {
+      this.m_registers = new Vector(b2Shape.e_shapeTypeCount);
+      for (var i = 0; i < b2Shape.e_shapeTypeCount; i++) {
+         this.m_registers[i] = new Vector(b2Shape.e_shapeTypeCount);
+         for (var j = 0; j < b2Shape.e_shapeTypeCount; j++) {
+            this.m_registers[i][j] = new b2ContactRegister();
+         }
+      }
+      this.AddType(b2CircleContact.Create, b2CircleContact.Destroy, b2Shape.e_circleShape, b2Shape.e_circleShape);
+      this.AddType(b2PolyAndCircleContact.Create, b2PolyAndCircleContact.Destroy, b2Shape.e_polygonShape, b2Shape.e_circleShape);
+      this.AddType(b2PolygonContact.Create, b2PolygonContact.Destroy, b2Shape.e_polygonShape, b2Shape.e_polygonShape);
+      this.AddType(b2EdgeAndCircleContact.Create, b2EdgeAndCircleContact.Destroy, b2Shape.e_edgeShape, b2Shape.e_circleShape);
+      this.AddType(b2PolyAndEdgeContact.Create, b2PolyAndEdgeContact.Destroy, b2Shape.e_polygonShape, b2Shape.e_edgeShape);
+   }
+   b2ContactFactory.prototype.Create = function (fixtureA, fixtureB) {
+      var type1 = parseInt(fixtureA.GetType());
+      var type2 = parseInt(fixtureB.GetType());
+      var reg = this.m_registers[type1][type2];
+      var c;
+      if (reg.pool) {
+         c = reg.pool;
+         reg.pool = c.m_next;
+         reg.poolCount--;
+         c.Reset(fixtureA, fixtureB);
+         return c;
+      }
+      var createFcn = reg.createFcn;
+      if (createFcn != null) {
+         if (reg.primary) {
+            c = createFcn(this.m_allocator);
+            c.Reset(fixtureA, fixtureB);
+            return c;
+         }
+         else {
+            c = createFcn(this.m_allocator);
+            c.Reset(fixtureB, fixtureA);
+            return c;
+         }
+      }
+      else {
+         return null;
+      }
+   }
+   b2ContactFactory.prototype.Destroy = function (contact) {
+      if (contact.m_manifold.m_pointCount > 0) {
+         contact.m_fixtureA.m_body.SetAwake(true);
+         contact.m_fixtureB.m_body.SetAwake(true);
+      }
+      var type1 = parseInt(contact.m_fixtureA.GetType());
+      var type2 = parseInt(contact.m_fixtureB.GetType());
+      var reg = this.m_registers[type1][type2];
+      if (true) {
+         reg.poolCount++;
+         contact.m_next = reg.pool;
+         reg.pool = contact;
+      }
+      var destroyFcn = reg.destroyFcn;
+      destroyFcn(contact, this.m_allocator);
+   }
+   b2ContactRegister.b2ContactRegister = function () {};
+   b2ContactResult.b2ContactResult = function () {
+      this.position = new b2Vec2();
+      this.normal = new b2Vec2();
+      this.id = new b2ContactID();
+   };
+   b2ContactSolver.b2ContactSolver = function () {
+      this.m_step = new b2TimeStep();
+      this.m_constraints = new Vector();
+   };
+   b2ContactSolver.prototype.b2ContactSolver = function () {}
+   b2ContactSolver.prototype.Initialize = function (step, contacts, contactCount, allocator) {
+      if (contactCount === undefined) contactCount = 0;
+      var contact;
+      this.m_step.Set(step);
+      this.m_allocator = allocator;
+      var i = 0;
+      var tVec;
+      var tMat;
+      this.m_constraintCount = contactCount;
+      while (this.m_constraints.length < this.m_constraintCount) {
+         this.m_constraints[this.m_constraints.length] = new b2ContactConstraint();
+      }
+      for (i = 0;
+      i < contactCount; ++i) {
+         contact = contacts[i];
+         var fixtureA = contact.m_fixtureA;
+         var fixtureB = contact.m_fixtureB;
+         var shapeA = fixtureA.m_shape;
+         var shapeB = fixtureB.m_shape;
+         var radiusA = shapeA.m_radius;
+         var radiusB = shapeB.m_radius;
+         var bodyA = fixtureA.m_body;
+         var bodyB = fixtureB.m_body;
+         var manifold = contact.GetManifold();
+         var friction = b2Settings.b2MixFriction(fixtureA.GetFriction(), fixtureB.GetFriction());
+         var restitution = b2Settings.b2MixRestitution(fixtureA.GetRestitution(), fixtureB.GetRestitution());
+         var vAX = bodyA.m_linearVelocity.x;
+         var vAY = bodyA.m_linearVelocity.y;
+         var vBX = bodyB.m_linearVelocity.x;
+         var vBY = bodyB.m_linearVelocity.y;
+         var wA = bodyA.m_angularVelocity;
+         var wB = bodyB.m_angularVelocity;
+         b2Settings.b2Assert(manifold.m_pointCount > 0);
+         b2ContactSolver.s_worldManifold.Initialize(manifold, bodyA.m_xf, radiusA, bodyB.m_xf, radiusB);
+         var normalX = b2ContactSolver.s_worldManifold.m_normal.x;
+         var normalY = b2ContactSolver.s_worldManifold.m_normal.y;
+         var cc = this.m_constraints[i];
+         cc.bodyA = bodyA;
+         cc.bodyB = bodyB;
+         cc.manifold = manifold;
+         cc.normal.x = normalX;
+         cc.normal.y = normalY;
+         cc.pointCount = manifold.m_pointCount;
+         cc.friction = friction;
+         cc.restitution = restitution;
+         cc.localPlaneNormal.x = manifold.m_localPlaneNormal.x;
+         cc.localPlaneNormal.y = manifold.m_localPlaneNormal.y;
+         cc.localPoint.x = manifold.m_localPoint.x;
+         cc.localPoint.y = manifold.m_localPoint.y;
+         cc.radius = radiusA + radiusB;
+         cc.type = manifold.m_type;
+         for (var k = 0; k < cc.pointCount; ++k) {
+            var cp = manifold.m_points[k];
+            var ccp = cc.points[k];
+            ccp.normalImpulse = cp.m_normalImpulse;
+            ccp.tangentImpulse = cp.m_tangentImpulse;
+            ccp.localPoint.SetV(cp.m_localPoint);
+            var rAX = ccp.rA.x = b2ContactSolver.s_worldManifold.m_points[k].x - bodyA.m_sweep.c.x;
+            var rAY = ccp.rA.y = b2ContactSolver.s_worldManifold.m_points[k].y - bodyA.m_sweep.c.y;
+            var rBX = ccp.rB.x = b2ContactSolver.s_worldManifold.m_points[k].x - bodyB.m_sweep.c.x;
+            var rBY = ccp.rB.y = b2ContactSolver.s_worldManifold.m_points[k].y - bodyB.m_sweep.c.y;
+            var rnA = rAX * normalY - rAY * normalX;
+            var rnB = rBX * normalY - rBY * normalX;
+            rnA *= rnA;
+            rnB *= rnB;
+            var kNormal = bodyA.m_invMass + bodyB.m_invMass + bodyA.m_invI * rnA + bodyB.m_invI * rnB;
+            ccp.normalMass = 1.0 / kNormal;
+            var kEqualized = bodyA.m_mass * bodyA.m_invMass + bodyB.m_mass * bodyB.m_invMass;
+            kEqualized += bodyA.m_mass * bodyA.m_invI * rnA + bodyB.m_mass * bodyB.m_invI * rnB;
+            ccp.equalizedMass = 1.0 / kEqualized;
+            var tangentX = normalY;
+            var tangentY = (-normalX);
+            var rtA = rAX * tangentY - rAY * tangentX;
+            var rtB = rBX * tangentY - rBY * tangentX;
+            rtA *= rtA;
+            rtB *= rtB;
+            var kTangent = bodyA.m_invMass + bodyB.m_invMass + bodyA.m_invI * rtA + bodyB.m_invI * rtB;
+            ccp.tangentMass = 1.0 / kTangent;
+            ccp.velocityBias = 0.0;
+            var tX = vBX + ((-wB * rBY)) - vAX - ((-wA * rAY));
+            var tY = vBY + (wB * rBX) - vAY - (wA * rAX);
+            var vRel = cc.normal.x * tX + cc.normal.y * tY;
+            if (vRel < (-b2Settings.b2_velocityThreshold)) {
+               ccp.velocityBias += (-cc.restitution * vRel);
+            }
+         }
+         if (cc.pointCount == 2) {
+            var ccp1 = cc.points[0];
+            var ccp2 = cc.points[1];
+            var invMassA = bodyA.m_invMass;
+            var invIA = bodyA.m_invI;
+            var invMassB = bodyB.m_invMass;
+            var invIB = bodyB.m_invI;
+            var rn1A = ccp1.rA.x * normalY - ccp1.rA.y * normalX;
+            var rn1B = ccp1.rB.x * normalY - ccp1.rB.y * normalX;
+            var rn2A = ccp2.rA.x * normalY - ccp2.rA.y * normalX;
+            var rn2B = ccp2.rB.x * normalY - ccp2.rB.y * normalX;
+            var k11 = invMassA + invMassB + invIA * rn1A * rn1A + invIB * rn1B * rn1B;
+            var k22 = invMassA + invMassB + invIA * rn2A * rn2A + invIB * rn2B * rn2B;
+            var k12 = invMassA + invMassB + invIA * rn1A * rn2A + invIB * rn1B * rn2B;
+            var k_maxConditionNumber = 100.0;
+            if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) {
+               cc.K.col1.Set(k11, k12);
+               cc.K.col2.Set(k12, k22);
+               cc.K.GetInverse(cc.normalMass);
+            }
+            else {
+               cc.pointCount = 1;
+            }
+         }
+      }
+   }
+   b2ContactSolver.prototype.InitVelocityConstraints = function (step) {
+      var tVec;
+      var tVec2;
+      var tMat;
+      for (var i = 0; i < this.m_constraintCount; ++i) {
+         var c = this.m_constraints[i];
+         var bodyA = c.bodyA;
+         var bodyB = c.bodyB;
+         var invMassA = bodyA.m_invMass;
+         var invIA = bodyA.m_invI;
+         var invMassB = bodyB.m_invMass;
+         var invIB = bodyB.m_invI;
+         var normalX = c.normal.x;
+         var normalY = c.normal.y;
+         var tangentX = normalY;
+         var tangentY = (-normalX);
+         var tX = 0;
+         var j = 0;
+         var tCount = 0;
+         if (step.warmStarting) {
+            tCount = c.pointCount;
+            for (j = 0;
+            j < tCount; ++j) {
+               var ccp = c.points[j];
+               ccp.normalImpulse *= step.dtRatio;
+               ccp.tangentImpulse *= step.dtRatio;
+               var PX = ccp.normalImpulse * normalX + ccp.tangentImpulse * tangentX;
+               var PY = ccp.normalImpulse * normalY + ccp.tangentImpulse * tangentY;
+               bodyA.m_angularVelocity -= invIA * (ccp.rA.x * PY - ccp.rA.y * PX);
+               bodyA.m_linearVelocity.x -= invMassA * PX;
+               bodyA.m_linearVelocity.y -= invMassA * PY;
+               bodyB.m_angularVelocity += invIB * (ccp.rB.x * PY - ccp.rB.y * PX);
+               bodyB.m_linearVelocity.x += invMassB * PX;
+               bodyB.m_linearVelocity.y += invMassB * PY;
+            }
+         }
+         else {
+            tCount = c.pointCount;
+            for (j = 0;
+            j < tCount; ++j) {
+               var ccp2 = c.points[j];
+               ccp2.normalImpulse = 0.0;
+               ccp2.tangentImpulse = 0.0;
+            }
+         }
+      }
+   }
+   b2ContactSolver.prototype.SolveVelocityConstraints = function () {
+      var j = 0;
+      var ccp;
+      var rAX = 0;
+      var rAY = 0;
+      var rBX = 0;
+      var rBY = 0;
+      var dvX = 0;
+      var dvY = 0;
+      var vn = 0;
+      var vt = 0;
+      var lambda = 0;
+      var maxFriction = 0;
+      var newImpulse = 0;
+      var PX = 0;
+      var PY = 0;
+      var dX = 0;
+      var dY = 0;
+      var P1X = 0;
+      var P1Y = 0;
+      var P2X = 0;
+      var P2Y = 0;
+      var tMat;
+      var tVec;
+      for (var i = 0; i < this.m_constraintCount; ++i) {
+         var c = this.m_constraints[i];
+         var bodyA = c.bodyA;
+         var bodyB = c.bodyB;
+         var wA = bodyA.m_angularVelocity;
+         var wB = bodyB.m_angularVelocity;
+         var vA = bodyA.m_linearVelocity;
+         var vB = bodyB.m_linearVelocity;
+         var invMassA = bodyA.m_invMass;
+         var invIA = bodyA.m_invI;
+         var invMassB = bodyB.m_invMass;
+         var invIB = bodyB.m_invI;
+         var normalX = c.normal.x;
+         var normalY = c.normal.y;
+         var tangentX = normalY;
+         var tangentY = (-normalX);
+         var friction = c.friction;
+         var tX = 0;
+         for (j = 0;
+         j < c.pointCount; j++) {
+            ccp = c.points[j];
+            dvX = vB.x - wB * ccp.rB.y - vA.x + wA * ccp.rA.y;
+            dvY = vB.y + wB * ccp.rB.x - vA.y - wA * ccp.rA.x;
+            vt = dvX * tangentX + dvY * tangentY;
+            lambda = ccp.tangentMass * (-vt);
+            maxFriction = friction * ccp.normalImpulse;
+            newImpulse = b2Math.Clamp(ccp.tangentImpulse + lambda, (-maxFriction), maxFriction);
+            lambda = newImpulse - ccp.tangentImpulse;
+            PX = lambda * tangentX;
+            PY = lambda * tangentY;
+            vA.x -= invMassA * PX;
+            vA.y -= invMassA * PY;
+            wA -= invIA * (ccp.rA.x * PY - ccp.rA.y * PX);
+            vB.x += invMassB * PX;
+            vB.y += invMassB * PY;
+            wB += invIB * (ccp.rB.x * PY - ccp.rB.y * PX);
+            ccp.tangentImpulse = newImpulse;
+         }
+         var tCount = parseInt(c.pointCount);
+         if (c.pointCount == 1) {
+            ccp = c.points[0];
+            dvX = vB.x + ((-wB * ccp.rB.y)) - vA.x - ((-wA * ccp.rA.y));
+            dvY = vB.y + (wB * ccp.rB.x) - vA.y - (wA * ccp.rA.x);
+            vn = dvX * normalX + dvY * normalY;
+            lambda = (-ccp.normalMass * (vn - ccp.velocityBias));
+            newImpulse = ccp.normalImpulse + lambda;
+            newImpulse = newImpulse > 0 ? newImpulse : 0.0;
+            lambda = newImpulse - ccp.normalImpulse;
+            PX = lambda * normalX;
+            PY = lambda * normalY;
+            vA.x -= invMassA * PX;
+            vA.y -= invMassA * PY;
+            wA -= invIA * (ccp.rA.x * PY - ccp.rA.y * PX);
+            vB.x += invMassB * PX;
+            vB.y += invMassB * PY;
+            wB += invIB * (ccp.rB.x * PY - ccp.rB.y * PX);
+            ccp.normalImpulse = newImpulse;
+         }
+         else {
+            var cp1 = c.points[0];
+            var cp2 = c.points[1];
+            var aX = cp1.normalImpulse;
+            var aY = cp2.normalImpulse;
+            var dv1X = vB.x - wB * cp1.rB.y - vA.x + wA * cp1.rA.y;
+            var dv1Y = vB.y + wB * cp1.rB.x - vA.y - wA * cp1.rA.x;
+            var dv2X = vB.x - wB * cp2.rB.y - vA.x + wA * cp2.rA.y;
+            var dv2Y = vB.y + wB * cp2.rB.x - vA.y - wA * cp2.rA.x;
+            var vn1 = dv1X * normalX + dv1Y * normalY;
+            var vn2 = dv2X * normalX + dv2Y * normalY;
+            var bX = vn1 - cp1.velocityBias;
+            var bY = vn2 - cp2.velocityBias;
+            tMat = c.K;
+            bX -= tMat.col1.x * aX + tMat.col2.x * aY;
+            bY -= tMat.col1.y * aX + tMat.col2.y * aY;
+            var k_errorTol = 0.001;
+            for (;;) {
+               tMat = c.normalMass;
+               var xX = (-(tMat.col1.x * bX + tMat.col2.x * bY));
+               var xY = (-(tMat.col1.y * bX + tMat.col2.y * bY));
+               if (xX >= 0.0 && xY >= 0.0) {
+                  dX = xX - aX;
+                  dY = xY - aY;
+                  P1X = dX * normalX;
+                  P1Y = dX * normalY;
+                  P2X = dY * normalX;
+                  P2Y = dY * normalY;
+                  vA.x -= invMassA * (P1X + P2X);
+                  vA.y -= invMassA * (P1Y + P2Y);
+                  wA -= invIA * (cp1.rA.x * P1Y - cp1.rA.y * P1X + cp2.rA.x * P2Y - cp2.rA.y * P2X);
+                  vB.x += invMassB * (P1X + P2X);
+                  vB.y += invMassB * (P1Y + P2Y);
+                  wB += invIB * (cp1.rB.x * P1Y - cp1.rB.y * P1X + cp2.rB.x * P2Y - cp2.rB.y * P2X);
+                  cp1.normalImpulse = xX;
+                  cp2.normalImpulse = xY;
+                  break;
+               }
+               xX = (-cp1.normalMass * bX);
+               xY = 0.0;
+               vn1 = 0.0;
+               vn2 = c.K.col1.y * xX + bY;
+               if (xX >= 0.0 && vn2 >= 0.0) {
+                  dX = xX - aX;
+                  dY = xY - aY;
+                  P1X = dX * normalX;
+                  P1Y = dX * normalY;
+                  P2X = dY * normalX;
+                  P2Y = dY * normalY;
+                  vA.x -= invMassA * (P1X + P2X);
+                  vA.y -= invMassA * (P1Y + P2Y);
+                  wA -= invIA * (cp1.rA.x * P1Y - cp1.rA.y * P1X + cp2.rA.x * P2Y - cp2.rA.y * P2X);
+                  vB.x += invMassB * (P1X + P2X);
+                  vB.y += invMassB * (P1Y + P2Y);
+                  wB += invIB * (cp1.rB.x * P1Y - cp1.rB.y * P1X + cp2.rB.x * P2Y - cp2.rB.y * P2X);
+                  cp1.normalImpulse = xX;
+                  cp2.normalImpulse = xY;
+                  break;
+               }
+               xX = 0.0;
+               xY = (-cp2.normalMass * bY);
+               vn1 = c.K.col2.x * xY + bX;
+               vn2 = 0.0;
+               if (xY >= 0.0 && vn1 >= 0.0) {
+                  dX = xX - aX;
+                  dY = xY - aY;
+                  P1X = dX * normalX;
+                  P1Y = dX * normalY;
+                  P2X = dY * normalX;
+                  P2Y = dY * normalY;
+                  vA.x -= invMassA * (P1X + P2X);
+                  vA.y -= invMassA * (P1Y + P2Y);
+                  wA -= invIA * (cp1.rA.x * P1Y - cp1.rA.y * P1X + cp2.rA.x * P2Y - cp2.rA.y * P2X);
+                  vB.x += invMassB * (P1X + P2X);
+                  vB.y += invMassB * (P1Y + P2Y);
+                  wB += invIB * (cp1.rB.x * P1Y - cp1.rB.y * P1X + cp2.rB.x * P2Y - cp2.rB.y * P2X);
+                  cp1.normalImpulse = xX;
+                  cp2.normalImpulse = xY;
+                  break;
+               }
+               xX = 0.0;
+               xY = 0.0;
+               vn1 = bX;
+               vn2 = bY;
+               if (vn1 >= 0.0 && vn2 >= 0.0) {
+                  dX = xX - aX;
+                  dY = xY - aY;
+                  P1X = dX * normalX;
+                  P1Y = dX * normalY;
+                  P2X = dY * normalX;
+                  P2Y = dY * normalY;
+                  vA.x -= invMassA * (P1X + P2X);
+                  vA.y -= invMassA * (P1Y + P2Y);
+                  wA -= invIA * (cp1.rA.x * P1Y - cp1.rA.y * P1X + cp2.rA.x * P2Y - cp2.rA.y * P2X);
+                  vB.x += invMassB * (P1X + P2X);
+                  vB.y += invMassB * (P1Y + P2Y);
+                  wB += invIB * (cp1.rB.x * P1Y - cp1.rB.y * P1X + cp2.rB.x * P2Y - cp2.rB.y * P2X);
+                  cp1.normalImpulse = xX;
+                  cp2.normalImpulse = xY;
+                  break;
+               }
+               break;
+            }
+         }
+         bodyA.m_angularVelocity = wA;
+         bodyB.m_angularVelocity = wB;
+      }
+   }
+   b2ContactSolver.prototype.FinalizeVelocityConstraints = function () {
+      for (var i = 0; i < this.m_constraintCount; ++i) {
+         var c = this.m_constraints[i];
+         var m = c.manifold;
+         for (var j = 0; j < c.pointCount; ++j) {
+            var point1 = m.m_points[j];
+            var point2 = c.points[j];
+            point1.m_normalImpulse = point2.normalImpulse;
+            point1.m_tangentImpulse = point2.tangentImpulse;
+         }
+      }
+   }
+   b2ContactSolver.prototype.SolvePositionConstraints = function (baumgarte) {
+      if (baumgarte === undefined) baumgarte = 0;
+      var minSeparation = 0.0;
+      for (var i = 0; i < this.m_constraintCount; i++) {
+         var c = this.m_constraints[i];
+         var bodyA = c.bodyA;
+         var bodyB = c.bodyB;
+         var invMassA = bodyA.m_mass * bodyA.m_invMass;
+         var invIA = bodyA.m_mass * bodyA.m_invI;
+         var invMassB = bodyB.m_mass * bodyB.m_invMass;
+         var invIB = bodyB.m_mass * bodyB.m_invI;
+         b2ContactSolver.s_psm.Initialize(c);
+         var normal = b2ContactSolver.s_psm.m_normal;
+         for (var j = 0; j < c.pointCount; j++) {
+            var ccp = c.points[j];
+            var point = b2ContactSolver.s_psm.m_points[j];
+            var separation = b2ContactSolver.s_psm.m_separations[j];
+            var rAX = point.x - bodyA.m_sweep.c.x;
+            var rAY = point.y - bodyA.m_sweep.c.y;
+            var rBX = point.x - bodyB.m_sweep.c.x;
+            var rBY = point.y - bodyB.m_sweep.c.y;
+            minSeparation = minSeparation < separation ? minSeparation : separation;
+            var C = b2Math.Clamp(baumgarte * (separation + b2Settings.b2_linearSlop), (-b2Settings.b2_maxLinearCorrection), 0.0);
+            var impulse = (-ccp.equalizedMass * C);
+            var PX = impulse * normal.x;
+            var PY = impulse * normal.y;bodyA.m_sweep.c.x -= invMassA * PX;
+            bodyA.m_sweep.c.y -= invMassA * PY;
+            bodyA.m_sweep.a -= invIA * (rAX * PY - rAY * PX);
+            bodyA.SynchronizeTransform();
+            bodyB.m_sweep.c.x += invMassB * PX;
+            bodyB.m_sweep.c.y += invMassB * PY;
+            bodyB.m_sweep.a += invIB * (rBX * PY - rBY * PX);
+            bodyB.SynchronizeTransform();
+         }
+      }
+      return minSeparation > (-1.5 * b2Settings.b2_linearSlop);
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Dynamics.Contacts.b2ContactSolver.s_worldManifold = new b2WorldManifold();
+      Box2D.Dynamics.Contacts.b2ContactSolver.s_psm = new b2PositionSolverManifold();
+   });
+   Box2D.inherit(b2EdgeAndCircleContact, Box2D.Dynamics.Contacts.b2Contact);
+   b2EdgeAndCircleContact.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
+   b2EdgeAndCircleContact.b2EdgeAndCircleContact = function () {
+      Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments);
+   };
+   b2EdgeAndCircleContact.Create = function (allocator) {
+      return new b2EdgeAndCircleContact();
+   }
+   b2EdgeAndCircleContact.Destroy = function (contact, allocator) {}
+   b2EdgeAndCircleContact.prototype.Reset = function (fixtureA, fixtureB) {
+      this.__super.Reset.call(this, fixtureA, fixtureB);
+   }
+   b2EdgeAndCircleContact.prototype.Evaluate = function () {
+      var bA = this.m_fixtureA.GetBody();
+      var bB = this.m_fixtureB.GetBody();
+      this.b2CollideEdgeAndCircle(this.m_manifold, (this.m_fixtureA.GetShape() instanceof b2EdgeShape ? this.m_fixtureA.GetShape() : null), bA.m_xf, (this.m_fixtureB.GetShape() instanceof b2CircleShape ? this.m_fixtureB.GetShape() : null), bB.m_xf);
+   }
+   b2EdgeAndCircleContact.prototype.b2CollideEdgeAndCircle = function (manifold, edge, xf1, circle, xf2) {}
+   Box2D.inherit(b2NullContact, Box2D.Dynamics.Contacts.b2Contact);
+   b2NullContact.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
+   b2NullContact.b2NullContact = function () {
+      Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments);
+   };
+   b2NullContact.prototype.b2NullContact = function () {
+      this.__super.b2Contact.call(this);
+   }
+   b2NullContact.prototype.Evaluate = function () {}
+   Box2D.inherit(b2PolyAndCircleContact, Box2D.Dynamics.Contacts.b2Contact);
+   b2PolyAndCircleContact.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
+   b2PolyAndCircleContact.b2PolyAndCircleContact = function () {
+      Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments);
+   };
+   b2PolyAndCircleContact.Create = function (allocator) {
+      return new b2PolyAndCircleContact();
+   }
+   b2PolyAndCircleContact.Destroy = function (contact, allocator) {}
+   b2PolyAndCircleContact.prototype.Reset = function (fixtureA, fixtureB) {
+      this.__super.Reset.call(this, fixtureA, fixtureB);
+      b2Settings.b2Assert(fixtureA.GetType() == b2Shape.e_polygonShape);
+      b2Settings.b2Assert(fixtureB.GetType() == b2Shape.e_circleShape);
+   }
+   b2PolyAndCircleContact.prototype.Evaluate = function () {
+      var bA = this.m_fixtureA.m_body;
+      var bB = this.m_fixtureB.m_body;
+      b2Collision.CollidePolygonAndCircle(this.m_manifold, (this.m_fixtureA.GetShape() instanceof b2PolygonShape ? this.m_fixtureA.GetShape() : null), bA.m_xf, (this.m_fixtureB.GetShape() instanceof b2CircleShape ? this.m_fixtureB.GetShape() : null), bB.m_xf);
+   }
+   Box2D.inherit(b2PolyAndEdgeContact, Box2D.Dynamics.Contacts.b2Contact);
+   b2PolyAndEdgeContact.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
+   b2PolyAndEdgeContact.b2PolyAndEdgeContact = function () {
+      Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments);
+   };
+   b2PolyAndEdgeContact.Create = function (allocator) {
+      return new b2PolyAndEdgeContact();
+   }
+   b2PolyAndEdgeContact.Destroy = function (contact, allocator) {}
+   b2PolyAndEdgeContact.prototype.Reset = function (fixtureA, fixtureB) {
+      this.__super.Reset.call(this, fixtureA, fixtureB);
+      b2Settings.b2Assert(fixtureA.GetType() == b2Shape.e_polygonShape);
+      b2Settings.b2Assert(fixtureB.GetType() == b2Shape.e_edgeShape);
+   }
+   b2PolyAndEdgeContact.prototype.Evaluate = function () {
+      var bA = this.m_fixtureA.GetBody();
+      var bB = this.m_fixtureB.GetBody();
+      this.b2CollidePolyAndEdge(this.m_manifold, (this.m_fixtureA.GetShape() instanceof b2PolygonShape ? this.m_fixtureA.GetShape() : null), bA.m_xf, (this.m_fixtureB.GetShape() instanceof b2EdgeShape ? this.m_fixtureB.GetShape() : null), bB.m_xf);
+   }
+   b2PolyAndEdgeContact.prototype.b2CollidePolyAndEdge = function (manifold, polygon, xf1, edge, xf2) {}
+   Box2D.inherit(b2PolygonContact, Box2D.Dynamics.Contacts.b2Contact);
+   b2PolygonContact.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
+   b2PolygonContact.b2PolygonContact = function () {
+      Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments);
+   };
+   b2PolygonContact.Create = function (allocator) {
+      return new b2PolygonContact();
+   }
+   b2PolygonContact.Destroy = function (contact, allocator) {}
+   b2PolygonContact.prototype.Reset = function (fixtureA, fixtureB) {
+      this.__super.Reset.call(this, fixtureA, fixtureB);
+   }
+   b2PolygonContact.prototype.Evaluate = function () {
+      var bA = this.m_fixtureA.GetBody();
+      var bB = this.m_fixtureB.GetBody();
+      b2Collision.CollidePolygons(this.m_manifold, (this.m_fixtureA.GetShape() instanceof b2PolygonShape ? this.m_fixtureA.GetShape() : null), bA.m_xf, (this.m_fixtureB.GetShape() instanceof b2PolygonShape ? this.m_fixtureB.GetShape() : null), bB.m_xf);
+   }
+   b2PositionSolverManifold.b2PositionSolverManifold = function () {};
+   b2PositionSolverManifold.prototype.b2PositionSolverManifold = function () {
+      this.m_normal = new b2Vec2();
+      this.m_separations = new Vector_a2j_Number(b2Settings.b2_maxManifoldPoints);
+      this.m_points = new Vector(b2Settings.b2_maxManifoldPoints);
+      for (var i = 0; i < b2Settings.b2_maxManifoldPoints; i++) {
+         this.m_points[i] = new b2Vec2();
+      }
+   }
+   b2PositionSolverManifold.prototype.Initialize = function (cc) {
+      b2Settings.b2Assert(cc.pointCount > 0);
+      var i = 0;
+      var clipPointX = 0;
+      var clipPointY = 0;
+      var tMat;
+      var tVec;
+      var planePointX = 0;
+      var planePointY = 0;
+      switch (cc.type) {
+      case b2Manifold.e_circles:
+         {
+            tMat = cc.bodyA.m_xf.R;
+            tVec = cc.localPoint;
+            var pointAX = cc.bodyA.m_xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+            var pointAY = cc.bodyA.m_xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+            tMat = cc.bodyB.m_xf.R;
+            tVec = cc.points[0].localPoint;
+            var pointBX = cc.bodyB.m_xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+            var pointBY = cc.bodyB.m_xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+            var dX = pointBX - pointAX;
+            var dY = pointBY - pointAY;
+            var d2 = dX * dX + dY * dY;
+            if (d2 > Number.MIN_VALUE * Number.MIN_VALUE) {
+               var d = Math.sqrt(d2);
+               this.m_normal.x = dX / d;
+               this.m_normal.y = dY / d;
+            }
+            else {
+               this.m_normal.x = 1.0;
+               this.m_normal.y = 0.0;
+            }
+            this.m_points[0].x = 0.5 * (pointAX + pointBX);
+            this.m_points[0].y = 0.5 * (pointAY + pointBY);
+            this.m_separations[0] = dX * this.m_normal.x + dY * this.m_normal.y - cc.radius;
+         }
+         break;
+      case b2Manifold.e_faceA:
+         {
+            tMat = cc.bodyA.m_xf.R;
+            tVec = cc.localPlaneNormal;
+            this.m_normal.x = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+            this.m_normal.y = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+            tMat = cc.bodyA.m_xf.R;
+            tVec = cc.localPoint;
+            planePointX = cc.bodyA.m_xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+            planePointY = cc.bodyA.m_xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+            tMat = cc.bodyB.m_xf.R;
+            for (i = 0;
+            i < cc.pointCount; ++i) {
+               tVec = cc.points[i].localPoint;
+               clipPointX = cc.bodyB.m_xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+               clipPointY = cc.bodyB.m_xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+               this.m_separations[i] = (clipPointX - planePointX) * this.m_normal.x + (clipPointY - planePointY) * this.m_normal.y - cc.radius;
+               this.m_points[i].x = clipPointX;
+               this.m_points[i].y = clipPointY;
+            }
+         }
+         break;
+      case b2Manifold.e_faceB:
+         {
+            tMat = cc.bodyB.m_xf.R;
+            tVec = cc.localPlaneNormal;
+            this.m_normal.x = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+            this.m_normal.y = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+            tMat = cc.bodyB.m_xf.R;
+            tVec = cc.localPoint;
+            planePointX = cc.bodyB.m_xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+            planePointY = cc.bodyB.m_xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+            tMat = cc.bodyA.m_xf.R;
+            for (i = 0;
+            i < cc.pointCount; ++i) {
+               tVec = cc.points[i].localPoint;
+               clipPointX = cc.bodyA.m_xf.position.x + (tMat.col1.x * tVec.x + tMat.col2.x * tVec.y);
+               clipPointY = cc.bodyA.m_xf.position.y + (tMat.col1.y * tVec.x + tMat.col2.y * tVec.y);
+               this.m_separations[i] = (clipPointX - planePointX) * this.m_normal.x + (clipPointY - planePointY) * this.m_normal.y - cc.radius;
+               this.m_points[i].Set(clipPointX, clipPointY);
+            }
+            this.m_normal.x *= (-1);
+            this.m_normal.y *= (-1);
+         }
+         break;
+      }
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Dynamics.Contacts.b2PositionSolverManifold.circlePointA = new b2Vec2();
+      Box2D.Dynamics.Contacts.b2PositionSolverManifold.circlePointB = new b2Vec2();
+   });
+})();
+(function () {
+   var b2Body = Box2D.Dynamics.b2Body,
+      b2BodyDef = Box2D.Dynamics.b2BodyDef,
+      b2ContactFilter = Box2D.Dynamics.b2ContactFilter,
+      b2ContactImpulse = Box2D.Dynamics.b2ContactImpulse,
+      b2ContactListener = Box2D.Dynamics.b2ContactListener,
+      b2ContactManager = Box2D.Dynamics.b2ContactManager,
+      b2DebugDraw = Box2D.Dynamics.b2DebugDraw,
+      b2DestructionListener = Box2D.Dynamics.b2DestructionListener,
+      b2FilterData = Box2D.Dynamics.b2FilterData,
+      b2Fixture = Box2D.Dynamics.b2Fixture,
+      b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
+      b2Island = Box2D.Dynamics.b2Island,
+      b2TimeStep = Box2D.Dynamics.b2TimeStep,
+      b2World = Box2D.Dynamics.b2World,
+      b2Mat22 = Box2D.Common.Math.b2Mat22,
+      b2Mat33 = Box2D.Common.Math.b2Mat33,
+      b2Math = Box2D.Common.Math.b2Math,
+      b2Sweep = Box2D.Common.Math.b2Sweep,
+      b2Transform = Box2D.Common.Math.b2Transform,
+      b2Vec2 = Box2D.Common.Math.b2Vec2,
+      b2Vec3 = Box2D.Common.Math.b2Vec3,
+      b2Color = Box2D.Common.b2Color,
+      b2internal = Box2D.Common.b2internal,
+      b2Settings = Box2D.Common.b2Settings,
+      b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
+      b2EdgeChainDef = Box2D.Collision.Shapes.b2EdgeChainDef,
+      b2EdgeShape = Box2D.Collision.Shapes.b2EdgeShape,
+      b2MassData = Box2D.Collision.Shapes.b2MassData,
+      b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
+      b2Shape = Box2D.Collision.Shapes.b2Shape,
+      b2BuoyancyController = Box2D.Dynamics.Controllers.b2BuoyancyController,
+      b2ConstantAccelController = Box2D.Dynamics.Controllers.b2ConstantAccelController,
+      b2ConstantForceController = Box2D.Dynamics.Controllers.b2ConstantForceController,
+      b2Controller = Box2D.Dynamics.Controllers.b2Controller,
+      b2ControllerEdge = Box2D.Dynamics.Controllers.b2ControllerEdge,
+      b2GravityController = Box2D.Dynamics.Controllers.b2GravityController,
+      b2TensorDampingController = Box2D.Dynamics.Controllers.b2TensorDampingController;
+
+   Box2D.inherit(b2BuoyancyController, Box2D.Dynamics.Controllers.b2Controller);
+   b2BuoyancyController.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
+   b2BuoyancyController.b2BuoyancyController = function () {
+      Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
+      this.normal = new b2Vec2(0, (-1));
+      this.offset = 0;
+      this.density = 0;
+      this.velocity = new b2Vec2(0, 0);
+      this.linearDrag = 2;
+      this.angularDrag = 1;
+      this.useDensity = false;
+      this.useWorldGravity = true;
+      this.gravity = null;
+   };
+   b2BuoyancyController.prototype.Step = function (step) {
+      if (!this.m_bodyList) return;
+      if (this.useWorldGravity) {
+         this.gravity = this.GetWorld().GetGravity().Copy();
+      }
+      for (var i = this.m_bodyList; i; i = i.nextBody) {
+         var body = i.body;
+         if (body.IsAwake() == false) {
+            continue;
+         }
+         var areac = new b2Vec2();
+         var massc = new b2Vec2();
+         var area = 0.0;
+         var mass = 0.0;
+         for (var fixture = body.GetFixtureList(); fixture; fixture = fixture.GetNext()) {
+            var sc = new b2Vec2();
+            var sarea = fixture.GetShape().ComputeSubmergedArea(this.normal, this.offset, body.GetTransform(), sc);
+            area += sarea;
+            areac.x += sarea * sc.x;
+            areac.y += sarea * sc.y;
+            var shapeDensity = 0;
+            if (this.useDensity) {
+               shapeDensity = 1;
+            }
+            else {
+               shapeDensity = 1;
+            }
+            mass += sarea * shapeDensity;
+            massc.x += sarea * sc.x * shapeDensity;
+            massc.y += sarea * sc.y * shapeDensity;
+         }
+         areac.x /= area;
+         areac.y /= area;
+         massc.x /= mass;
+         massc.y /= mass;
+         if (area < Number.MIN_VALUE) continue;
+         var buoyancyForce = this.gravity.GetNegative();
+         buoyancyForce.Multiply(this.density * area);
+         body.ApplyForce(buoyancyForce, massc);
+         var dragForce = body.GetLinearVelocityFromWorldPoint(areac);
+         dragForce.Subtract(this.velocity);
+         dragForce.Multiply((-this.linearDrag * area));
+         body.ApplyForce(dragForce, areac);
+         body.ApplyTorque((-body.GetInertia() / body.GetMass() * area * body.GetAngularVelocity() * this.angularDrag));
+      }
+   }
+   b2BuoyancyController.prototype.Draw = function (debugDraw) {
+      var r = 1000;
+      var p1 = new b2Vec2();
+      var p2 = new b2Vec2();
+      p1.x = this.normal.x * this.offset + this.normal.y * r;
+      p1.y = this.normal.y * this.offset - this.normal.x * r;
+      p2.x = this.normal.x * this.offset - this.normal.y * r;
+      p2.y = this.normal.y * this.offset + this.normal.x * r;
+      var color = new b2Color(0, 0, 1);
+      debugDraw.DrawSegment(p1, p2, color);
+   }
+   Box2D.inherit(b2ConstantAccelController, Box2D.Dynamics.Controllers.b2Controller);
+   b2ConstantAccelController.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
+   b2ConstantAccelController.b2ConstantAccelController = function () {
+      Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
+      this.A = new b2Vec2(0, 0);
+   };
+   b2ConstantAccelController.prototype.Step = function (step) {
+      var smallA = new b2Vec2(this.A.x * step.dt, this.A.y * step.dt);
+      for (var i = this.m_bodyList; i; i = i.nextBody) {
+         var body = i.body;
+         if (!body.IsAwake()) continue;
+         body.SetLinearVelocity(new b2Vec2(body.GetLinearVelocity().x + smallA.x, body.GetLinearVelocity().y + smallA.y));
+      }
+   }
+   Box2D.inherit(b2ConstantForceController, Box2D.Dynamics.Controllers.b2Controller);
+   b2ConstantForceController.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
+   b2ConstantForceController.b2ConstantForceController = function () {
+      Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
+      this.F = new b2Vec2(0, 0);
+   };
+   b2ConstantForceController.prototype.Step = function (step) {
+      for (var i = this.m_bodyList; i; i = i.nextBody) {
+         var body = i.body;
+         if (!body.IsAwake()) continue;
+         body.ApplyForce(this.F, body.GetWorldCenter());
+      }
+   }
+   b2Controller.b2Controller = function () {};
+   b2Controller.prototype.Step = function (step) {}
+   b2Controller.prototype.Draw = function (debugDraw) {}
+   b2Controller.prototype.AddBody = function (body) {
+      var edge = new b2ControllerEdge();
+      edge.controller = this;
+      edge.body = body;
+      edge.nextBody = this.m_bodyList;
+      edge.prevBody = null;
+      this.m_bodyList = edge;
+      if (edge.nextBody) edge.nextBody.prevBody = edge;
+      this.m_bodyCount++;
+      edge.nextController = body.m_controllerList;
+      edge.prevController = null;
+      body.m_controllerList = edge;
+      if (edge.nextController) edge.nextController.prevController = edge;
+      body.m_controllerCount++;
+   }
+   b2Controller.prototype.RemoveBody = function (body) {
+      var edge = body.m_controllerList;
+      while (edge && edge.controller != this)
+      edge = edge.nextController;
+      if (edge.prevBody) edge.prevBody.nextBody = edge.nextBody;
+      if (edge.nextBody) edge.nextBody.prevBody = edge.prevBody;
+      if (edge.nextController) edge.nextController.prevController = edge.prevController;
+      if (edge.prevController) edge.prevController.nextController = edge.nextController;
+      if (this.m_bodyList == edge) this.m_bodyList = edge.nextBody;
+      if (body.m_controllerList == edge) body.m_controllerList = edge.nextController;
+      body.m_controllerCount--;
+      this.m_bodyCount--;
+   }
+   b2Controller.prototype.Clear = function () {
+      while (this.m_bodyList)
+      this.RemoveBody(this.m_bodyList.body);
+   }
+   b2Controller.prototype.GetNext = function () {
+      return this.m_next;
+   }
+   b2Controller.prototype.GetWorld = function () {
+      return this.m_world;
+   }
+   b2Controller.prototype.GetBodyList = function () {
+      return this.m_bodyList;
+   }
+   b2ControllerEdge.b2ControllerEdge = function () {};
+   Box2D.inherit(b2GravityController, Box2D.Dynamics.Controllers.b2Controller);
+   b2GravityController.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
+   b2GravityController.b2GravityController = function () {
+      Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
+      this.G = 1;
+      this.invSqr = true;
+   };
+   b2GravityController.prototype.Step = function (step) {
+      var i = null;
+      var body1 = null;
+      var p1 = null;
+      var mass1 = 0;
+      var j = null;
+      var body2 = null;
+      var p2 = null;
+      var dx = 0;
+      var dy = 0;
+      var r2 = 0;
+      var f = null;
+      if (this.invSqr) {
+         for (i = this.m_bodyList;
+         i; i = i.nextBody) {
+            body1 = i.body;
+            p1 = body1.GetWorldCenter();
+            mass1 = body1.GetMass();
+            for (j = this.m_bodyList;
+            j != i; j = j.nextBody) {
+               body2 = j.body;
+               p2 = body2.GetWorldCenter();
+               dx = p2.x - p1.x;
+               dy = p2.y - p1.y;
+               r2 = dx * dx + dy * dy;
+               if (r2 < Number.MIN_VALUE) continue;
+               f = new b2Vec2(dx, dy);
+               f.Multiply(this.G / r2 / Math.sqrt(r2) * mass1 * body2.GetMass());
+               if (body1.IsAwake()) body1.ApplyForce(f, p1);
+               f.Multiply((-1));
+               if (body2.IsAwake()) body2.ApplyForce(f, p2);
+            }
+         }
+      }
+      else {
+         for (i = this.m_bodyList;
+         i; i = i.nextBody) {
+            body1 = i.body;
+            p1 = body1.GetWorldCenter();
+            mass1 = body1.GetMass();
+            for (j = this.m_bodyList;
+            j != i; j = j.nextBody) {
+               body2 = j.body;
+               p2 = body2.GetWorldCenter();
+               dx = p2.x - p1.x;
+               dy = p2.y - p1.y;
+               r2 = dx * dx + dy * dy;
+               if (r2 < Number.MIN_VALUE) continue;
+               f = new b2Vec2(dx, dy);
+               f.Multiply(this.G / r2 * mass1 * body2.GetMass());
+               if (body1.IsAwake()) body1.ApplyForce(f, p1);
+               f.Multiply((-1));
+               if (body2.IsAwake()) body2.ApplyForce(f, p2);
+            }
+         }
+      }
+   }
+   Box2D.inherit(b2TensorDampingController, Box2D.Dynamics.Controllers.b2Controller);
+   b2TensorDampingController.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
+   b2TensorDampingController.b2TensorDampingController = function () {
+      Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
+      this.T = new b2Mat22();
+      this.maxTimestep = 0;
+   };
+   b2TensorDampingController.prototype.SetAxisAligned = function (xDamping, yDamping) {
+      if (xDamping === undefined) xDamping = 0;
+      if (yDamping === undefined) yDamping = 0;
+      this.T.col1.x = (-xDamping);
+      this.T.col1.y = 0;
+      this.T.col2.x = 0;
+      this.T.col2.y = (-yDamping);
+      if (xDamping > 0 || yDamping > 0) {
+         this.maxTimestep = 1 / Math.max(xDamping, yDamping);
+      }
+      else {
+         this.maxTimestep = 0;
+      }
+   }
+   b2TensorDampingController.prototype.Step = function (step) {
+      var timestep = step.dt;
+      if (timestep <= Number.MIN_VALUE) return;
+      if (timestep > this.maxTimestep && this.maxTimestep > 0) timestep = this.maxTimestep;
+      for (var i = this.m_bodyList; i; i = i.nextBody) {
+         var body = i.body;
+         if (!body.IsAwake()) {
+            continue;
+         }
+         var damping = body.GetWorldVector(b2Math.MulMV(this.T, body.GetLocalVector(body.GetLinearVelocity())));
+         body.SetLinearVelocity(new b2Vec2(body.GetLinearVelocity().x + damping.x * timestep, body.GetLinearVelocity().y + damping.y * timestep));
+      }
+   }
+})();
+(function () {
+   var b2Color = Box2D.Common.b2Color,
+      b2internal = Box2D.Common.b2internal,
+      b2Settings = Box2D.Common.b2Settings,
+      b2Mat22 = Box2D.Common.Math.b2Mat22,
+      b2Mat33 = Box2D.Common.Math.b2Mat33,
+      b2Math = Box2D.Common.Math.b2Math,
+      b2Sweep = Box2D.Common.Math.b2Sweep,
+      b2Transform = Box2D.Common.Math.b2Transform,
+      b2Vec2 = Box2D.Common.Math.b2Vec2,
+      b2Vec3 = Box2D.Common.Math.b2Vec3,
+      b2DistanceJoint = Box2D.Dynamics.Joints.b2DistanceJoint,
+      b2DistanceJointDef = Box2D.Dynamics.Joints.b2DistanceJointDef,
+      b2FrictionJoint = Box2D.Dynamics.Joints.b2FrictionJoint,
+      b2FrictionJointDef = Box2D.Dynamics.Joints.b2FrictionJointDef,
+      b2GearJoint = Box2D.Dynamics.Joints.b2GearJoint,
+      b2GearJointDef = Box2D.Dynamics.Joints.b2GearJointDef,
+      b2Jacobian = Box2D.Dynamics.Joints.b2Jacobian,
+      b2Joint = Box2D.Dynamics.Joints.b2Joint,
+      b2JointDef = Box2D.Dynamics.Joints.b2JointDef,
+      b2JointEdge = Box2D.Dynamics.Joints.b2JointEdge,
+      b2LineJoint = Box2D.Dynamics.Joints.b2LineJoint,
+      b2LineJointDef = Box2D.Dynamics.Joints.b2LineJointDef,
+      b2MouseJoint = Box2D.Dynamics.Joints.b2MouseJoint,
+      b2MouseJointDef = Box2D.Dynamics.Joints.b2MouseJointDef,
+      b2PrismaticJoint = Box2D.Dynamics.Joints.b2PrismaticJoint,
+      b2PrismaticJointDef = Box2D.Dynamics.Joints.b2PrismaticJointDef,
+      b2PulleyJoint = Box2D.Dynamics.Joints.b2PulleyJoint,
+      b2PulleyJointDef = Box2D.Dynamics.Joints.b2PulleyJointDef,
+      b2RevoluteJoint = Box2D.Dynamics.Joints.b2RevoluteJoint,
+      b2RevoluteJointDef = Box2D.Dynamics.Joints.b2RevoluteJointDef,
+      b2WeldJoint = Box2D.Dynamics.Joints.b2WeldJoint,
+      b2WeldJointDef = Box2D.Dynamics.Joints.b2WeldJointDef,
+      b2Body = Box2D.Dynamics.b2Body,
+      b2BodyDef = Box2D.Dynamics.b2BodyDef,
+      b2ContactFilter = Box2D.Dynamics.b2ContactFilter,
+      b2ContactImpulse = Box2D.Dynamics.b2ContactImpulse,
+      b2ContactListener = Box2D.Dynamics.b2ContactListener,
+      b2ContactManager = Box2D.Dynamics.b2ContactManager,
+      b2DebugDraw = Box2D.Dynamics.b2DebugDraw,
+      b2DestructionListener = Box2D.Dynamics.b2DestructionListener,
+      b2FilterData = Box2D.Dynamics.b2FilterData,
+      b2Fixture = Box2D.Dynamics.b2Fixture,
+      b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
+      b2Island = Box2D.Dynamics.b2Island,
+      b2TimeStep = Box2D.Dynamics.b2TimeStep,
+      b2World = Box2D.Dynamics.b2World;
+
+   Box2D.inherit(b2DistanceJoint, Box2D.Dynamics.Joints.b2Joint);
+   b2DistanceJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
+   b2DistanceJoint.b2DistanceJoint = function () {
+      Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
+      this.m_localAnchor1 = new b2Vec2();
+      this.m_localAnchor2 = new b2Vec2();
+      this.m_u = new b2Vec2();
+   };
+   b2DistanceJoint.prototype.GetAnchorA = function () {
+      return this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
+   }
+   b2DistanceJoint.prototype.GetAnchorB = function () {
+      return this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
+   }
+   b2DistanceJoint.prototype.GetReactionForce = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return new b2Vec2(inv_dt * this.m_impulse * this.m_u.x, inv_dt * this.m_impulse * this.m_u.y);
+   }
+   b2DistanceJoint.prototype.GetReactionTorque = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return 0.0;
+   }
+   b2DistanceJoint.prototype.GetLength = function () {
+      return this.m_length;
+   }
+   b2DistanceJoint.prototype.SetLength = function (length) {
+      if (length === undefined) length = 0;
+      this.m_length = length;
+   }
+   b2DistanceJoint.prototype.GetFrequency = function () {
+      return this.m_frequencyHz;
+   }
+   b2DistanceJoint.prototype.SetFrequency = function (hz) {
+      if (hz === undefined) hz = 0;
+      this.m_frequencyHz = hz;
+   }
+   b2DistanceJoint.prototype.GetDampingRatio = function () {
+      return this.m_dampingRatio;
+   }
+   b2DistanceJoint.prototype.SetDampingRatio = function (ratio) {
+      if (ratio === undefined) ratio = 0;
+      this.m_dampingRatio = ratio;
+   }
+   b2DistanceJoint.prototype.b2DistanceJoint = function (def) {
+      this.__super.b2Joint.call(this, def);
+      var tMat;
+      var tX = 0;
+      var tY = 0;
+      this.m_localAnchor1.SetV(def.localAnchorA);
+      this.m_localAnchor2.SetV(def.localAnchorB);
+      this.m_length = def.length;
+      this.m_frequencyHz = def.frequencyHz;
+      this.m_dampingRatio = def.dampingRatio;
+      this.m_impulse = 0.0;
+      this.m_gamma = 0.0;
+      this.m_bias = 0.0;
+   }
+   b2DistanceJoint.prototype.InitVelocityConstraints = function (step) {
+      var tMat;
+      var tX = 0;
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      tMat = bA.m_xf.R;
+      var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
+      var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
+      r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
+      r1X = tX;
+      tMat = bB.m_xf.R;
+      var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
+      var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
+      r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
+      r2X = tX;
+      this.m_u.x = bB.m_sweep.c.x + r2X - bA.m_sweep.c.x - r1X;
+      this.m_u.y = bB.m_sweep.c.y + r2Y - bA.m_sweep.c.y - r1Y;
+      var length = Math.sqrt(this.m_u.x * this.m_u.x + this.m_u.y * this.m_u.y);
+      if (length > b2Settings.b2_linearSlop) {
+         this.m_u.Multiply(1.0 / length);
+      }
+      else {
+         this.m_u.SetZero();
+      }
+      var cr1u = (r1X * this.m_u.y - r1Y * this.m_u.x);
+      var cr2u = (r2X * this.m_u.y - r2Y * this.m_u.x);
+      var invMass = bA.m_invMass + bA.m_invI * cr1u * cr1u + bB.m_invMass + bB.m_invI * cr2u * cr2u;
+      this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;
+      if (this.m_frequencyHz > 0.0) {
+         var C = length - this.m_length;
+         var omega = 2.0 * Math.PI * this.m_frequencyHz;
+         var d = 2.0 * this.m_mass * this.m_dampingRatio * omega;
+         var k = this.m_mass * omega * omega;
+         this.m_gamma = step.dt * (d + step.dt * k);
+         this.m_gamma = this.m_gamma != 0.0 ? 1 / this.m_gamma : 0.0;
+         this.m_bias = C * step.dt * k * this.m_gamma;
+         this.m_mass = invMass + this.m_gamma;
+         this.m_mass = this.m_mass != 0.0 ? 1.0 / this.m_mass : 0.0;
+      }
+      if (step.warmStarting) {
+         this.m_impulse *= step.dtRatio;
+         var PX = this.m_impulse * this.m_u.x;
+         var PY = this.m_impulse * this.m_u.y;
+         bA.m_linearVelocity.x -= bA.m_invMass * PX;
+         bA.m_linearVelocity.y -= bA.m_invMass * PY;
+         bA.m_angularVelocity -= bA.m_invI * (r1X * PY - r1Y * PX);
+         bB.m_linearVelocity.x += bB.m_invMass * PX;
+         bB.m_linearVelocity.y += bB.m_invMass * PY;
+         bB.m_angularVelocity += bB.m_invI * (r2X * PY - r2Y * PX);
+      }
+      else {
+         this.m_impulse = 0.0;
+      }
+   }
+   b2DistanceJoint.prototype.SolveVelocityConstraints = function (step) {
+      var tMat;
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      tMat = bA.m_xf.R;
+      var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
+      var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
+      var tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
+      r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
+      r1X = tX;
+      tMat = bB.m_xf.R;
+      var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
+      var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
+      r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
+      r2X = tX;
+      var v1X = bA.m_linearVelocity.x + ((-bA.m_angularVelocity * r1Y));
+      var v1Y = bA.m_linearVelocity.y + (bA.m_angularVelocity * r1X);
+      var v2X = bB.m_linearVelocity.x + ((-bB.m_angularVelocity * r2Y));
+      var v2Y = bB.m_linearVelocity.y + (bB.m_angularVelocity * r2X);
+      var Cdot = (this.m_u.x * (v2X - v1X) + this.m_u.y * (v2Y - v1Y));
+      var impulse = (-this.m_mass * (Cdot + this.m_bias + this.m_gamma * this.m_impulse));
+      this.m_impulse += impulse;
+      var PX = impulse * this.m_u.x;
+      var PY = impulse * this.m_u.y;
+      bA.m_linearVelocity.x -= bA.m_invMass * PX;
+      bA.m_linearVelocity.y -= bA.m_invMass * PY;
+      bA.m_angularVelocity -= bA.m_invI * (r1X * PY - r1Y * PX);
+      bB.m_linearVelocity.x += bB.m_invMass * PX;
+      bB.m_linearVelocity.y += bB.m_invMass * PY;
+      bB.m_angularVelocity += bB.m_invI * (r2X * PY - r2Y * PX);
+   }
+   b2DistanceJoint.prototype.SolvePositionConstraints = function (baumgarte) {
+      if (baumgarte === undefined) baumgarte = 0;
+      var tMat;
+      if (this.m_frequencyHz > 0.0) {
+         return true;
+      }
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      tMat = bA.m_xf.R;
+      var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
+      var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
+      var tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
+      r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
+      r1X = tX;
+      tMat = bB.m_xf.R;
+      var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
+      var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
+      r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
+      r2X = tX;
+      var dX = bB.m_sweep.c.x + r2X - bA.m_sweep.c.x - r1X;
+      var dY = bB.m_sweep.c.y + r2Y - bA.m_sweep.c.y - r1Y;
+      var length = Math.sqrt(dX * dX + dY * dY);
+      dX /= length;
+      dY /= length;
+      var C = length - this.m_length;
+      C = b2Math.Clamp(C, (-b2Settings.b2_maxLinearCorrection), b2Settings.b2_maxLinearCorrection);
+      var impulse = (-this.m_mass * C);
+      this.m_u.Set(dX, dY);
+      var PX = impulse * this.m_u.x;
+      var PY = impulse * this.m_u.y;
+      bA.m_sweep.c.x -= bA.m_invMass * PX;
+      bA.m_sweep.c.y -= bA.m_invMass * PY;
+      bA.m_sweep.a -= bA.m_invI * (r1X * PY - r1Y * PX);
+      bB.m_sweep.c.x += bB.m_invMass * PX;
+      bB.m_sweep.c.y += bB.m_invMass * PY;
+      bB.m_sweep.a += bB.m_invI * (r2X * PY - r2Y * PX);
+      bA.SynchronizeTransform();
+      bB.SynchronizeTransform();
+      return b2Math.Abs(C) < b2Settings.b2_linearSlop;
+   }
+   Box2D.inherit(b2DistanceJointDef, Box2D.Dynamics.Joints.b2JointDef);
+   b2DistanceJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
+   b2DistanceJointDef.b2DistanceJointDef = function () {
+      Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
+      this.localAnchorA = new b2Vec2();
+      this.localAnchorB = new b2Vec2();
+   };
+   b2DistanceJointDef.prototype.b2DistanceJointDef = function () {
+      this.__super.b2JointDef.call(this);
+      this.type = b2Joint.e_distanceJoint;
+      this.length = 1.0;
+      this.frequencyHz = 0.0;
+      this.dampingRatio = 0.0;
+   }
+   b2DistanceJointDef.prototype.Initialize = function (bA, bB, anchorA, anchorB) {
+      this.bodyA = bA;
+      this.bodyB = bB;
+      this.localAnchorA.SetV(this.bodyA.GetLocalPoint(anchorA));
+      this.localAnchorB.SetV(this.bodyB.GetLocalPoint(anchorB));
+      var dX = anchorB.x - anchorA.x;
+      var dY = anchorB.y - anchorA.y;
+      this.length = Math.sqrt(dX * dX + dY * dY);
+      this.frequencyHz = 0.0;
+      this.dampingRatio = 0.0;
+   }
+   Box2D.inherit(b2FrictionJoint, Box2D.Dynamics.Joints.b2Joint);
+   b2FrictionJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
+   b2FrictionJoint.b2FrictionJoint = function () {
+      Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
+      this.m_localAnchorA = new b2Vec2();
+      this.m_localAnchorB = new b2Vec2();
+      this.m_linearMass = new b2Mat22();
+      this.m_linearImpulse = new b2Vec2();
+   };
+   b2FrictionJoint.prototype.GetAnchorA = function () {
+      return this.m_bodyA.GetWorldPoint(this.m_localAnchorA);
+   }
+   b2FrictionJoint.prototype.GetAnchorB = function () {
+      return this.m_bodyB.GetWorldPoint(this.m_localAnchorB);
+   }
+   b2FrictionJoint.prototype.GetReactionForce = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return new b2Vec2(inv_dt * this.m_linearImpulse.x, inv_dt * this.m_linearImpulse.y);
+   }
+   b2FrictionJoint.prototype.GetReactionTorque = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return inv_dt * this.m_angularImpulse;
+   }
+   b2FrictionJoint.prototype.SetMaxForce = function (force) {
+      if (force === undefined) force = 0;
+      this.m_maxForce = force;
+   }
+   b2FrictionJoint.prototype.GetMaxForce = function () {
+      return this.m_maxForce;
+   }
+   b2FrictionJoint.prototype.SetMaxTorque = function (torque) {
+      if (torque === undefined) torque = 0;
+      this.m_maxTorque = torque;
+   }
+   b2FrictionJoint.prototype.GetMaxTorque = function () {
+      return this.m_maxTorque;
+   }
+   b2FrictionJoint.prototype.b2FrictionJoint = function (def) {
+      this.__super.b2Joint.call(this, def);
+      this.m_localAnchorA.SetV(def.localAnchorA);
+      this.m_localAnchorB.SetV(def.localAnchorB);
+      this.m_linearMass.SetZero();
+      this.m_angularMass = 0.0;
+      this.m_linearImpulse.SetZero();
+      this.m_angularImpulse = 0.0;
+      this.m_maxForce = def.maxForce;
+      this.m_maxTorque = def.maxTorque;
+   }
+   b2FrictionJoint.prototype.InitVelocityConstraints = function (step) {
+      var tMat;
+      var tX = 0;
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      tMat = bA.m_xf.R;
+      var rAX = this.m_localAnchorA.x - bA.m_sweep.localCenter.x;
+      var rAY = this.m_localAnchorA.y - bA.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * rAX + tMat.col2.x * rAY);
+      rAY = (tMat.col1.y * rAX + tMat.col2.y * rAY);
+      rAX = tX;
+      tMat = bB.m_xf.R;
+      var rBX = this.m_localAnchorB.x - bB.m_sweep.localCenter.x;
+      var rBY = this.m_localAnchorB.y - bB.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * rBX + tMat.col2.x * rBY);
+      rBY = (tMat.col1.y * rBX + tMat.col2.y * rBY);
+      rBX = tX;
+      var mA = bA.m_invMass;
+      var mB = bB.m_invMass;
+      var iA = bA.m_invI;
+      var iB = bB.m_invI;
+      var K = new b2Mat22();
+      K.col1.x = mA + mB;
+      K.col2.x = 0.0;
+      K.col1.y = 0.0;
+      K.col2.y = mA + mB;
+      K.col1.x += iA * rAY * rAY;
+      K.col2.x += (-iA * rAX * rAY);
+      K.col1.y += (-iA * rAX * rAY);
+      K.col2.y += iA * rAX * rAX;
+      K.col1.x += iB * rBY * rBY;
+      K.col2.x += (-iB * rBX * rBY);
+      K.col1.y += (-iB * rBX * rBY);
+      K.col2.y += iB * rBX * rBX;
+      K.GetInverse(this.m_linearMass);
+      this.m_angularMass = iA + iB;
+      if (this.m_angularMass > 0.0) {
+         this.m_angularMass = 1.0 / this.m_angularMass;
+      }
+      if (step.warmStarting) {
+         this.m_linearImpulse.x *= step.dtRatio;
+         this.m_linearImpulse.y *= step.dtRatio;
+         this.m_angularImpulse *= step.dtRatio;
+         var P = this.m_linearImpulse;
+         bA.m_linearVelocity.x -= mA * P.x;
+         bA.m_linearVelocity.y -= mA * P.y;
+         bA.m_angularVelocity -= iA * (rAX * P.y - rAY * P.x + this.m_angularImpulse);
+         bB.m_linearVelocity.x += mB * P.x;
+         bB.m_linearVelocity.y += mB * P.y;
+         bB.m_angularVelocity += iB * (rBX * P.y - rBY * P.x + this.m_angularImpulse);
+      }
+      else {
+         this.m_linearImpulse.SetZero();
+         this.m_angularImpulse = 0.0;
+      }
+   }
+   b2FrictionJoint.prototype.SolveVelocityConstraints = function (step) {
+      var tMat;
+      var tX = 0;
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var vA = bA.m_linearVelocity;
+      var wA = bA.m_angularVelocity;
+      var vB = bB.m_linearVelocity;
+      var wB = bB.m_angularVelocity;
+      var mA = bA.m_invMass;
+      var mB = bB.m_invMass;
+      var iA = bA.m_invI;
+      var iB = bB.m_invI;
+      tMat = bA.m_xf.R;
+      var rAX = this.m_localAnchorA.x - bA.m_sweep.localCenter.x;
+      var rAY = this.m_localAnchorA.y - bA.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * rAX + tMat.col2.x * rAY);
+      rAY = (tMat.col1.y * rAX + tMat.col2.y * rAY);
+      rAX = tX;
+      tMat = bB.m_xf.R;
+      var rBX = this.m_localAnchorB.x - bB.m_sweep.localCenter.x;
+      var rBY = this.m_localAnchorB.y - bB.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * rBX + tMat.col2.x * rBY);
+      rBY = (tMat.col1.y * rBX + tMat.col2.y * rBY);
+      rBX = tX;
+      var maxImpulse = 0; {
+         var Cdot = wB - wA;
+         var impulse = (-this.m_angularMass * Cdot);
+         var oldImpulse = this.m_angularImpulse;
+         maxImpulse = step.dt * this.m_maxTorque;
+         this.m_angularImpulse = b2Math.Clamp(this.m_angularImpulse + impulse, (-maxImpulse), maxImpulse);
+         impulse = this.m_angularImpulse - oldImpulse;
+         wA -= iA * impulse;
+         wB += iB * impulse;
+      } {
+         var CdotX = vB.x - wB * rBY - vA.x + wA * rAY;
+         var CdotY = vB.y + wB * rBX - vA.y - wA * rAX;
+         var impulseV = b2Math.MulMV(this.m_linearMass, new b2Vec2((-CdotX), (-CdotY)));
+         var oldImpulseV = this.m_linearImpulse.Copy();
+         this.m_linearImpulse.Add(impulseV);
+         maxImpulse = step.dt * this.m_maxForce;
+         if (this.m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse) {
+            this.m_linearImpulse.Normalize();
+            this.m_linearImpulse.Multiply(maxImpulse);
+         }
+         impulseV = b2Math.SubtractVV(this.m_linearImpulse, oldImpulseV);
+         vA.x -= mA * impulseV.x;
+         vA.y -= mA * impulseV.y;
+         wA -= iA * (rAX * impulseV.y - rAY * impulseV.x);
+         vB.x += mB * impulseV.x;
+         vB.y += mB * impulseV.y;
+         wB += iB * (rBX * impulseV.y - rBY * impulseV.x);
+      }
+      bA.m_angularVelocity = wA;
+      bB.m_angularVelocity = wB;
+   }
+   b2FrictionJoint.prototype.SolvePositionConstraints = function (baumgarte) {
+      if (baumgarte === undefined) baumgarte = 0;
+      return true;
+   }
+   Box2D.inherit(b2FrictionJointDef, Box2D.Dynamics.Joints.b2JointDef);
+   b2FrictionJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
+   b2FrictionJointDef.b2FrictionJointDef = function () {
+      Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
+      this.localAnchorA = new b2Vec2();
+      this.localAnchorB = new b2Vec2();
+   };
+   b2FrictionJointDef.prototype.b2FrictionJointDef = function () {
+      this.__super.b2JointDef.call(this);
+      this.type = b2Joint.e_frictionJoint;
+      this.maxForce = 0.0;
+      this.maxTorque = 0.0;
+   }
+   b2FrictionJointDef.prototype.Initialize = function (bA, bB, anchor) {
+      this.bodyA = bA;
+      this.bodyB = bB;
+      this.localAnchorA.SetV(this.bodyA.GetLocalPoint(anchor));
+      this.localAnchorB.SetV(this.bodyB.GetLocalPoint(anchor));
+   }
+   Box2D.inherit(b2GearJoint, Box2D.Dynamics.Joints.b2Joint);
+   b2GearJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
+   b2GearJoint.b2GearJoint = function () {
+      Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
+      this.m_groundAnchor1 = new b2Vec2();
+      this.m_groundAnchor2 = new b2Vec2();
+      this.m_localAnchor1 = new b2Vec2();
+      this.m_localAnchor2 = new b2Vec2();
+      this.m_J = new b2Jacobian();
+   };
+   b2GearJoint.prototype.GetAnchorA = function () {
+      return this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
+   }
+   b2GearJoint.prototype.GetAnchorB = function () {
+      return this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
+   }
+   b2GearJoint.prototype.GetReactionForce = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return new b2Vec2(inv_dt * this.m_impulse * this.m_J.linearB.x, inv_dt * this.m_impulse * this.m_J.linearB.y);
+   }
+   b2GearJoint.prototype.GetReactionTorque = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      var tMat = this.m_bodyB.m_xf.R;
+      var rX = this.m_localAnchor1.x - this.m_bodyB.m_sweep.localCenter.x;
+      var rY = this.m_localAnchor1.y - this.m_bodyB.m_sweep.localCenter.y;
+      var tX = tMat.col1.x * rX + tMat.col2.x * rY;
+      rY = tMat.col1.y * rX + tMat.col2.y * rY;
+      rX = tX;
+      var PX = this.m_impulse * this.m_J.linearB.x;
+      var PY = this.m_impulse * this.m_J.linearB.y;
+      return inv_dt * (this.m_impulse * this.m_J.angularB - rX * PY + rY * PX);
+   }
+   b2GearJoint.prototype.GetRatio = function () {
+      return this.m_ratio;
+   }
+   b2GearJoint.prototype.SetRatio = function (ratio) {
+      if (ratio === undefined) ratio = 0;
+      this.m_ratio = ratio;
+   }
+   b2GearJoint.prototype.b2GearJoint = function (def) {
+      this.__super.b2Joint.call(this, def);
+      var type1 = parseInt(def.joint1.m_type);
+      var type2 = parseInt(def.joint2.m_type);
+      this.m_revolute1 = null;
+      this.m_prismatic1 = null;
+      this.m_revolute2 = null;
+      this.m_prismatic2 = null;
+      var coordinate1 = 0;
+      var coordinate2 = 0;
+      this.m_ground1 = def.joint1.GetBodyA();
+      this.m_bodyA = def.joint1.GetBodyB();
+      if (type1 == b2Joint.e_revoluteJoint) {
+         this.m_revolute1 = (def.joint1 instanceof b2RevoluteJoint ? def.joint1 : null);
+         this.m_groundAnchor1.SetV(this.m_revolute1.m_localAnchor1);
+         this.m_localAnchor1.SetV(this.m_revolute1.m_localAnchor2);
+         coordinate1 = this.m_revolute1.GetJointAngle();
+      }
+      else {
+         this.m_prismatic1 = (def.joint1 instanceof b2PrismaticJoint ? def.joint1 : null);
+         this.m_groundAnchor1.SetV(this.m_prismatic1.m_localAnchor1);
+         this.m_localAnchor1.SetV(this.m_prismatic1.m_localAnchor2);
+         coordinate1 = this.m_prismatic1.GetJointTranslation();
+      }
+      this.m_ground2 = def.joint2.GetBodyA();
+      this.m_bodyB = def.joint2.GetBodyB();
+      if (type2 == b2Joint.e_revoluteJoint) {
+         this.m_revolute2 = (def.joint2 instanceof b2RevoluteJoint ? def.joint2 : null);
+         this.m_groundAnchor2.SetV(this.m_revolute2.m_localAnchor1);
+         this.m_localAnchor2.SetV(this.m_revolute2.m_localAnchor2);
+         coordinate2 = this.m_revolute2.GetJointAngle();
+      }
+      else {
+         this.m_prismatic2 = (def.joint2 instanceof b2PrismaticJoint ? def.joint2 : null);
+         this.m_groundAnchor2.SetV(this.m_prismatic2.m_localAnchor1);
+         this.m_localAnchor2.SetV(this.m_prismatic2.m_localAnchor2);
+         coordinate2 = this.m_prismatic2.GetJointTranslation();
+      }
+      this.m_ratio = def.ratio;
+      this.m_constant = coordinate1 + this.m_ratio * coordinate2;
+      this.m_impulse = 0.0;
+   }
+   b2GearJoint.prototype.InitVelocityConstraints = function (step) {
+      var g1 = this.m_ground1;
+      var g2 = this.m_ground2;
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var ugX = 0;
+      var ugY = 0;
+      var rX = 0;
+      var rY = 0;
+      var tMat;
+      var tVec;
+      var crug = 0;
+      var tX = 0;
+      var K = 0.0;
+      this.m_J.SetZero();
+      if (this.m_revolute1) {
+         this.m_J.angularA = (-1.0);
+         K += bA.m_invI;
+      }
+      else {
+         tMat = g1.m_xf.R;
+         tVec = this.m_prismatic1.m_localXAxis1;
+         ugX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+         ugY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+         tMat = bA.m_xf.R;
+         rX = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
+         rY = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
+         tX = tMat.col1.x * rX + tMat.col2.x * rY;
+         rY = tMat.col1.y * rX + tMat.col2.y * rY;
+         rX = tX;
+         crug = rX * ugY - rY * ugX;
+         this.m_J.linearA.Set((-ugX), (-ugY));
+         this.m_J.angularA = (-crug);
+         K += bA.m_invMass + bA.m_invI * crug * crug;
+      }
+      if (this.m_revolute2) {
+         this.m_J.angularB = (-this.m_ratio);
+         K += this.m_ratio * this.m_ratio * bB.m_invI;
+      }
+      else {
+         tMat = g2.m_xf.R;
+         tVec = this.m_prismatic2.m_localXAxis1;
+         ugX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
+         ugY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
+         tMat = bB.m_xf.R;
+         rX = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
+         rY = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
+         tX = tMat.col1.x * rX + tMat.col2.x * rY;
+         rY = tMat.col1.y * rX + tMat.col2.y * rY;
+         rX = tX;
+         crug = rX * ugY - rY * ugX;
+         this.m_J.linearB.Set((-this.m_ratio * ugX), (-this.m_ratio * ugY));
+         this.m_J.angularB = (-this.m_ratio * crug);
+         K += this.m_ratio * this.m_ratio * (bB.m_invMass + bB.m_invI * crug * crug);
+      }
+      this.m_mass = K > 0.0 ? 1.0 / K : 0.0;
+      if (step.warmStarting) {
+         bA.m_linearVelocity.x += bA.m_invMass * this.m_impulse * this.m_J.linearA.x;
+         bA.m_linearVelocity.y += bA.m_invMass * this.m_impulse * this.m_J.linearA.y;
+         bA.m_angularVelocity += bA.m_invI * this.m_impulse * this.m_J.angularA;
+         bB.m_linearVelocity.x += bB.m_invMass * this.m_impulse * this.m_J.linearB.x;
+         bB.m_linearVelocity.y += bB.m_invMass * this.m_impulse * this.m_J.linearB.y;
+         bB.m_angularVelocity += bB.m_invI * this.m_impulse * this.m_J.angularB;
+      }
+      else {
+         this.m_impulse = 0.0;
+      }
+   }
+   b2GearJoint.prototype.SolveVelocityConstraints = function (step) {
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var Cdot = this.m_J.Compute(bA.m_linearVelocity, bA.m_angularVelocity, bB.m_linearVelocity, bB.m_angularVelocity);
+      var impulse = (-this.m_mass * Cdot);
+      this.m_impulse += impulse;
+      bA.m_linearVelocity.x += bA.m_invMass * impulse * this.m_J.linearA.x;
+      bA.m_linearVelocity.y += bA.m_invMass * impulse * this.m_J.linearA.y;
+      bA.m_angularVelocity += bA.m_invI * impulse * this.m_J.angularA;
+      bB.m_linearVelocity.x += bB.m_invMass * impulse * this.m_J.linearB.x;
+      bB.m_linearVelocity.y += bB.m_invMass * impulse * this.m_J.linearB.y;
+      bB.m_angularVelocity += bB.m_invI * impulse * this.m_J.angularB;
+   }
+   b2GearJoint.prototype.SolvePositionConstraints = function (baumgarte) {
+      if (baumgarte === undefined) baumgarte = 0;
+      var linearError = 0.0;
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var coordinate1 = 0;
+      var coordinate2 = 0;
+      if (this.m_revolute1) {
+         coordinate1 = this.m_revolute1.GetJointAngle();
+      }
+      else {
+         coordinate1 = this.m_prismatic1.GetJointTranslation();
+      }
+      if (this.m_revolute2) {
+         coordinate2 = this.m_revolute2.GetJointAngle();
+      }
+      else {
+         coordinate2 = this.m_prismatic2.GetJointTranslation();
+      }
+      var C = this.m_constant - (coordinate1 + this.m_ratio * coordinate2);
+      var impulse = (-this.m_mass * C);
+      bA.m_sweep.c.x += bA.m_invMass * impulse * this.m_J.linearA.x;
+      bA.m_sweep.c.y += bA.m_invMass * impulse * this.m_J.linearA.y;
+      bA.m_sweep.a += bA.m_invI * impulse * this.m_J.angularA;
+      bB.m_sweep.c.x += bB.m_invMass * impulse * this.m_J.linearB.x;
+      bB.m_sweep.c.y += bB.m_invMass * impulse * this.m_J.linearB.y;
+      bB.m_sweep.a += bB.m_invI * impulse * this.m_J.angularB;
+      bA.SynchronizeTransform();
+      bB.SynchronizeTransform();
+      return linearError < b2Settings.b2_linearSlop;
+   }
+   Box2D.inherit(b2GearJointDef, Box2D.Dynamics.Joints.b2JointDef);
+   b2GearJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
+   b2GearJointDef.b2GearJointDef = function () {
+      Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
+   };
+   b2GearJointDef.prototype.b2GearJointDef = function () {
+      this.__super.b2JointDef.call(this);
+      this.type = b2Joint.e_gearJoint;
+      this.joint1 = null;
+      this.joint2 = null;
+      this.ratio = 1.0;
+   }
+   b2Jacobian.b2Jacobian = function () {
+      this.linearA = new b2Vec2();
+      this.linearB = new b2Vec2();
+   };
+   b2Jacobian.prototype.SetZero = function () {
+      this.linearA.SetZero();
+      this.angularA = 0.0;
+      this.linearB.SetZero();
+      this.angularB = 0.0;
+   }
+   b2Jacobian.prototype.Set = function (x1, a1, x2, a2) {
+      if (a1 === undefined) a1 = 0;
+      if (a2 === undefined) a2 = 0;
+      this.linearA.SetV(x1);
+      this.angularA = a1;
+      this.linearB.SetV(x2);
+      this.angularB = a2;
+   }
+   b2Jacobian.prototype.Compute = function (x1, a1, x2, a2) {
+      if (a1 === undefined) a1 = 0;
+      if (a2 === undefined) a2 = 0;
+      return (this.linearA.x * x1.x + this.linearA.y * x1.y) + this.angularA * a1 + (this.linearB.x * x2.x + this.linearB.y * x2.y) + this.angularB * a2;
+   }
+   b2Joint.b2Joint = function () {
+      this.m_edgeA = new b2JointEdge();
+      this.m_edgeB = new b2JointEdge();
+      this.m_localCenterA = new b2Vec2();
+      this.m_localCenterB = new b2Vec2();
+   };
+   b2Joint.prototype.GetType = function () {
+      return this.m_type;
+   }
+   b2Joint.prototype.GetAnchorA = function () {
+      return null;
+   }
+   b2Joint.prototype.GetAnchorB = function () {
+      return null;
+   }
+   b2Joint.prototype.GetReactionForce = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return null;
+   }
+   b2Joint.prototype.GetReactionTorque = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return 0.0;
+   }
+   b2Joint.prototype.GetBodyA = function () {
+      return this.m_bodyA;
+   }
+   b2Joint.prototype.GetBodyB = function () {
+      return this.m_bodyB;
+   }
+   b2Joint.prototype.GetNext = function () {
+      return this.m_next;
+   }
+   b2Joint.prototype.GetUserData = function () {
+      return this.m_userData;
+   }
+   b2Joint.prototype.SetUserData = function (data) {
+      this.m_userData = data;
+   }
+   b2Joint.prototype.IsActive = function () {
+      return this.m_bodyA.IsActive() && this.m_bodyB.IsActive();
+   }
+   b2Joint.Create = function (def, allocator) {
+      var joint = null;
+      switch (def.type) {
+      case b2Joint.e_distanceJoint:
+         {
+            joint = new b2DistanceJoint((def instanceof b2DistanceJointDef ? def : null));
+         }
+         break;
+      case b2Joint.e_mouseJoint:
+         {
+            joint = new b2MouseJoint((def instanceof b2MouseJointDef ? def : null));
+         }
+         break;
+      case b2Joint.e_prismaticJoint:
+         {
+            joint = new b2PrismaticJoint((def instanceof b2PrismaticJointDef ? def : null));
+         }
+         break;
+      case b2Joint.e_revoluteJoint:
+         {
+            joint = new b2RevoluteJoint((def instanceof b2RevoluteJointDef ? def : null));
+         }
+         break;
+      case b2Joint.e_pulleyJoint:
+         {
+            joint = new b2PulleyJoint((def instanceof b2PulleyJointDef ? def : null));
+         }
+         break;
+      case b2Joint.e_gearJoint:
+         {
+            joint = new b2GearJoint((def instanceof b2GearJointDef ? def : null));
+         }
+         break;
+      case b2Joint.e_lineJoint:
+         {
+            joint = new b2LineJoint((def instanceof b2LineJointDef ? def : null));
+         }
+         break;
+      case b2Joint.e_weldJoint:
+         {
+            joint = new b2WeldJoint((def instanceof b2WeldJointDef ? def : null));
+         }
+         break;
+      case b2Joint.e_frictionJoint:
+         {
+            joint = new b2FrictionJoint((def instanceof b2FrictionJointDef ? def : null));
+         }
+         break;
+      default:
+         break;
+      }
+      return joint;
+   }
+   b2Joint.Destroy = function (joint, allocator) {}
+   b2Joint.prototype.b2Joint = function (def) {
+      b2Settings.b2Assert(def.bodyA != def.bodyB);
+      this.m_type = def.type;
+      this.m_prev = null;
+      this.m_next = null;
+      this.m_bodyA = def.bodyA;
+      this.m_bodyB = def.bodyB;
+      this.m_collideConnected = def.collideConnected;
+      this.m_islandFlag = false;
+      this.m_userData = def.userData;
+   }
+   b2Joint.prototype.InitVelocityConstraints = function (step) {}
+   b2Joint.prototype.SolveVelocityConstraints = function (step) {}
+   b2Joint.prototype.FinalizeVelocityConstraints = function () {}
+   b2Joint.prototype.SolvePositionConstraints = function (baumgarte) {
+      if (baumgarte === undefined) baumgarte = 0;
+      return false;
+   }
+   Box2D.postDefs.push(function () {
+      Box2D.Dynamics.Joints.b2Joint.e_unknownJoint = 0;
+      Box2D.Dynamics.Joints.b2Joint.e_revoluteJoint = 1;
+      Box2D.Dynamics.Joints.b2Joint.e_prismaticJoint = 2;
+      Box2D.Dynamics.Joints.b2Joint.e_distanceJoint = 3;
+      Box2D.Dynamics.Joints.b2Joint.e_pulleyJoint = 4;
+      Box2D.Dynamics.Joints.b2Joint.e_mouseJoint = 5;
+      Box2D.Dynamics.Joints.b2Joint.e_gearJoint = 6;
+      Box2D.Dynamics.Joints.b2Joint.e_lineJoint = 7;
+      Box2D.Dynamics.Joints.b2Joint.e_weldJoint = 8;
+      Box2D.Dynamics.Joints.b2Joint.e_frictionJoint = 9;
+      Box2D.Dynamics.Joints.b2Joint.e_inactiveLimit = 0;
+      Box2D.Dynamics.Joints.b2Joint.e_atLowerLimit = 1;
+      Box2D.Dynamics.Joints.b2Joint.e_atUpperLimit = 2;
+      Box2D.Dynamics.Joints.b2Joint.e_equalLimits = 3;
+   });
+   b2JointDef.b2JointDef = function () {};
+   b2JointDef.prototype.b2JointDef = function () {
+      this.type = b2Joint.e_unknownJoint;
+      this.userData = null;
+      this.bodyA = null;
+      this.bodyB = null;
+      this.collideConnected = false;
+   }
+   b2JointEdge.b2JointEdge = function () {};
+   Box2D.inherit(b2LineJoint, Box2D.Dynamics.Joints.b2Joint);
+   b2LineJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
+   b2LineJoint.b2LineJoint = function () {
+      Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
+      this.m_localAnchor1 = new b2Vec2();
+      this.m_localAnchor2 = new b2Vec2();
+      this.m_localXAxis1 = new b2Vec2();
+      this.m_localYAxis1 = new b2Vec2();
+      this.m_axis = new b2Vec2();
+      this.m_perp = new b2Vec2();
+      this.m_K = new b2Mat22();
+      this.m_impulse = new b2Vec2();
+   };
+   b2LineJoint.prototype.GetAnchorA = function () {
+      return this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
+   }
+   b2LineJoint.prototype.GetAnchorB = function () {
+      return this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
+   }
+   b2LineJoint.prototype.GetReactionForce = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return new b2Vec2(inv_dt * (this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.x), inv_dt * (this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.y));
+   }
+   b2LineJoint.prototype.GetReactionTorque = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return inv_dt * this.m_impulse.y;
+   }
+   b2LineJoint.prototype.GetJointTranslation = function () {
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var tMat;
+      var p1 = bA.GetWorldPoint(this.m_localAnchor1);
+      var p2 = bB.GetWorldPoint(this.m_localAnchor2);
+      var dX = p2.x - p1.x;
+      var dY = p2.y - p1.y;
+      var axis = bA.GetWorldVector(this.m_localXAxis1);
+      var translation = axis.x * dX + axis.y * dY;
+      return translation;
+   }
+   b2LineJoint.prototype.GetJointSpeed = function () {
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var tMat;
+      tMat = bA.m_xf.R;
+      var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
+      var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
+      var tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
+      r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
+      r1X = tX;
+      tMat = bB.m_xf.R;
+      var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
+      var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
+      r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
+      r2X = tX;
+      var p1X = bA.m_sweep.c.x + r1X;
+      var p1Y = bA.m_sweep.c.y + r1Y;
+      var p2X = bB.m_sweep.c.x + r2X;
+      var p2Y = bB.m_sweep.c.y + r2Y;
+      var dX = p2X - p1X;
+      var dY = p2Y - p1Y;
+      var axis = bA.GetWorldVector(this.m_localXAxis1);
+      var v1 = bA.m_linearVelocity;
+      var v2 = bB.m_linearVelocity;
+      var w1 = bA.m_angularVelocity;
+      var w2 = bB.m_angularVelocity;
+      var speed = (dX * ((-w1 * axis.y)) + dY * (w1 * axis.x)) + (axis.x * (((v2.x + ((-w2 * r2Y))) - v1.x) - ((-w1 * r1Y))) + axis.y * (((v2.y + (w2 * r2X)) - v1.y) - (w1 * r1X)));
+      return speed;
+   }
+   b2LineJoint.prototype.IsLimitEnabled = function () {
+      return this.m_enableLimit;
+   }
+   b2LineJoint.prototype.EnableLimit = function (flag) {
+      this.m_bodyA.SetAwake(true);
+      this.m_bodyB.SetAwake(true);
+      this.m_enableLimit = flag;
+   }
+   b2LineJoint.prototype.GetLowerLimit = function () {
+      return this.m_lowerTranslation;
+   }
+   b2LineJoint.prototype.GetUpperLimit = function () {
+      return this.m_upperTranslation;
+   }
+   b2LineJoint.prototype.SetLimits = function (lower, upper) {
+      if (lower === undefined) lower = 0;
+      if (upper === undefined) upper = 0;
+      this.m_bodyA.SetAwake(true);
+      this.m_bodyB.SetAwake(true);
+      this.m_lowerTranslation = lower;
+      this.m_upperTranslation = upper;
+   }
+   b2LineJoint.prototype.IsMotorEnabled = function () {
+      return this.m_enableMotor;
+   }
+   b2LineJoint.prototype.EnableMotor = function (flag) {
+      this.m_bodyA.SetAwake(true);
+      this.m_bodyB.SetAwake(true);
+      this.m_enableMotor = flag;
+   }
+   b2LineJoint.prototype.SetMotorSpeed = function (speed) {
+      if (speed === undefined) speed = 0;
+      this.m_bodyA.SetAwake(true);
+      this.m_bodyB.SetAwake(true);
+      this.m_motorSpeed = speed;
+   }
+   b2LineJoint.prototype.GetMotorSpeed = function () {
+      return this.m_motorSpeed;
+   }
+   b2LineJoint.prototype.SetMaxMotorForce = function (force) {
+      if (force === undefined) force = 0;
+      this.m_bodyA.SetAwake(true);
+      this.m_bodyB.SetAwake(true);
+      this.m_maxMotorForce = force;
+   }
+   b2LineJoint.prototype.GetMaxMotorForce = function () {
+      return this.m_maxMotorForce;
+   }
+   b2LineJoint.prototype.GetMotorForce = function () {
+      return this.m_motorImpulse;
+   }
+   b2LineJoint.prototype.b2LineJoint = function (def) {
+      this.__super.b2Joint.call(this, def);
+      var tMat;
+      var tX = 0;
+      var tY = 0;
+      this.m_localAnchor1.SetV(def.localAnchorA);
+      this.m_localAnchor2.SetV(def.localAnchorB);
+      this.m_localXAxis1.SetV(def.localAxisA);
+      this.m_localYAxis1.x = (-this.m_localXAxis1.y);
+      this.m_localYAxis1.y = this.m_localXAxis1.x;
+      this.m_impulse.SetZero();
+      this.m_motorMass = 0.0;
+      this.m_motorImpulse = 0.0;
+      this.m_lowerTranslation = def.lowerTranslation;
+      this.m_upperTranslation = def.upperTranslation;
+      this.m_maxMotorForce = def.maxMotorForce;
+      this.m_motorSpeed = def.motorSpeed;
+      this.m_enableLimit = def.enableLimit;
+      this.m_enableMotor = def.enableMotor;
+      this.m_limitState = b2Joint.e_inactiveLimit;
+      this.m_axis.SetZero();
+      this.m_perp.SetZero();
+   }
+   b2LineJoint.prototype.InitVelocityConstraints = function (step) {
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var tMat;
+      var tX = 0;
+      this.m_localCenterA.SetV(bA.GetLocalCenter());
+      this.m_localCenterB.SetV(bB.GetLocalCenter());
+      var xf1 = bA.GetTransform();
+      var xf2 = bB.GetTransform();
+      tMat = bA.m_xf.R;
+      var r1X = this.m_localAnchor1.x - this.m_localCenterA.x;
+      var r1Y = this.m_localAnchor1.y - this.m_localCenterA.y;
+      tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
+      r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
+      r1X = tX;
+      tMat = bB.m_xf.R;
+      var r2X = this.m_localAnchor2.x - this.m_localCenterB.x;
+      var r2Y = this.m_localAnchor2.y - this.m_localCenterB.y;
+      tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
+      r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
+      r2X = tX;
+      var dX = bB.m_sweep.c.x + r2X - bA.m_sweep.c.x - r1X;
+      var dY = bB.m_sweep.c.y + r2Y - bA.m_sweep.c.y - r1Y;
+      this.m_invMassA = bA.m_invMass;
+      this.m_invMassB = bB.m_invMass;
+      this.m_invIA = bA.m_invI;
+      this.m_invIB = bB.m_invI; {
+         this.m_axis.SetV(b2Math.MulMV(xf1.R, this.m_localXAxis1));
+         this.m_a1 = (dX + r1X) * this.m_axis.y - (dY + r1Y) * this.m_axis.x;
+         this.m_a2 = r2X * this.m_axis.y - r2Y * this.m_axis.x;
+         this.m_motorMass = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_a1 * this.m_a1 + this.m_invIB * this.m_a2 * this.m_a2;
+         this.m_motorMass = this.m_motorMass > Number.MIN_VALUE ? 1.0 / this.m_motorMass : 0.0;
+      } {
+         this.m_perp.SetV(b2Math.MulMV(xf1.R, this.m_localYAxis1));
+         this.m_s1 = (dX + r1X) * this.m_perp.y - (dY + r1Y) * this.m_perp.x;
+         this.m_s2 = r2X * this.m_perp.y - r2Y * this.m_perp.x;
+         var m1 = this.m_invMassA;
+         var m2 = this.m_invMassB;
+         var i1 = this.m_invIA;
+         var i2 = this.m_invIB;
+         this.m_K.col1.x = m1 + m2 + i1 * this.m_s1 * this.m_s1 + i2 * this.m_s2 * this.m_s2;
+         this.m_K.col1.y = i1 * this.m_s1 * this.m_a1 + i2 * this.m_s2 * this.m_a2;
+         this.m_K.col2.x = this.m_K.col1.y;
+         this.m_K.col2.y = m1 + m2 + i1 * this.m_a1 * this.m_a1 + i2 * this.m_a2 * this.m_a2;
+      }
+      if (this.m_enableLimit) {
+         var jointTransition = this.m_axis.x * dX + this.m_axis.y * dY;
+         if (b2Math.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * b2Settings.b2_linearSlop) {
+            this.m_limitState = b2Joint.e_equalLimits;
+         }
+         else if (jointTransition <= this.m_lowerTranslation) {
+            if (this.m_limitState != b2Joint.e_atLowerLimit) {
+               this.m_limitState = b2Joint.e_atLowerLimit;
+               this.m_impulse.y = 0.0;
+            }
+         }
+         else if (jointTransition >= this.m_upperTranslation) {
+            if (this.m_limitState != b2Joint.e_atUpperLimit) {
+               this.m_limitState = b2Joint.e_atUpperLimit;
+               this.m_impulse.y = 0.0;
+            }
+         }
+         else {
+            this.m_limitState = b2Joint.e_inactiveLimit;
+            this.m_impulse.y = 0.0;
+         }
+      }
+      else {
+         this.m_limitState = b2Joint.e_inactiveLimit;
+      }
+      if (this.m_enableMotor == false) {
+         this.m_motorImpulse = 0.0;
+      }
+      if (step.warmStarting) {
+         this.m_impulse.x *= step.dtRatio;
+         this.m_impulse.y *= step.dtRatio;
+         this.m_motorImpulse *= step.dtRatio;
+         var PX = this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.x;
+         var PY = this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.y;
+         var L1 = this.m_impulse.x * this.m_s1 + (this.m_motorImpulse + this.m_impulse.y) * this.m_a1;
+         var L2 = this.m_impulse.x * this.m_s2 + (this.m_motorImpulse + this.m_impulse.y) * this.m_a2;
+         bA.m_linearVelocity.x -= this.m_invMassA * PX;
+         bA.m_linearVelocity.y -= this.m_invMassA * PY;
+         bA.m_angularVelocity -= this.m_invIA * L1;
+         bB.m_linearVelocity.x += this.m_invMassB * PX;
+         bB.m_linearVelocity.y += this.m_invMassB * PY;
+         bB.m_angularVelocity += this.m_invIB * L2;
+      }
+      else {
+         this.m_impulse.SetZero();
+         this.m_motorImpulse = 0.0;
+      }
+   }
+   b2LineJoint.prototype.SolveVelocityConstraints = function (step) {
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var v1 = bA.m_linearVelocity;
+      var w1 = bA.m_angularVelocity;
+      var v2 = bB.m_linearVelocity;
+      var w2 = bB.m_angularVelocity;
+      var PX = 0;
+      var PY = 0;
+      var L1 = 0;
+      var L2 = 0;
+      if (this.m_enableMotor && this.m_limitState != b2Joint.e_equalLimits) {
+         var Cdot = this.m_axis.x * (v2.x - v1.x) + this.m_axis.y * (v2.y - v1.y) + this.m_a2 * w2 - this.m_a1 * w1;
+         var impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);
+         var oldImpulse = this.m_motorImpulse;
+         var maxImpulse = step.dt * this.m_maxMotorForce;
+         this.m_motorImpulse = b2Math.Clamp(this.m_motorImpulse + impulse, (-maxImpulse), maxImpulse);
+         impulse = this.m_motorImpulse - oldImpulse;
+         PX = impulse * this.m_axis.x;
+         PY = impulse * this.m_axis.y;
+         L1 = impulse * this.m_a1;
+         L2 = impulse * this.m_a2;
+         v1.x -= this.m_invMassA * PX;
+         v1.y -= this.m_invMassA * PY;
+         w1 -= this.m_invIA * L1;
+         v2.x += this.m_invMassB * PX;
+         v2.y += this.m_invMassB * PY;
+         w2 += this.m_invIB * L2;
+      }
+      var Cdot1 = this.m_perp.x * (v2.x - v1.x) + this.m_perp.y * (v2.y - v1.y) + this.m_s2 * w2 - this.m_s1 * w1;
+      if (this.m_enableLimit && this.m_limitState != b2Joint.e_inactiveLimit) {
+         var Cdot2 = this.m_axis.x * (v2.x - v1.x) + this.m_axis.y * (v2.y - v1.y) + this.m_a2 * w2 - this.m_a1 * w1;
+         var f1 = this.m_impulse.Copy();
+         var df = this.m_K.Solve(new b2Vec2(), (-Cdot1), (-Cdot2));
+         this.m_impulse.Add(df);
+         if (this.m_limitState == b2Joint.e_atLowerLimit) {
+            this.m_impulse.y = b2Math.Max(this.m_impulse.y, 0.0);
+         }
+         else if (this.m_limitState == b2Joint.e_atUpperLimit) {
+            this.m_impulse.y = b2Math.Min(this.m_impulse.y, 0.0);
+         }
+         var b = (-Cdot1) - (this.m_impulse.y - f1.y) * this.m_K.col2.x;
+         var f2r = 0;
+         if (this.m_K.col1.x != 0.0) {
+            f2r = b / this.m_K.col1.x + f1.x;
+         }
+         else {
+            f2r = f1.x;
+         }
+         this.m_impulse.x = f2r;
+         df.x = this.m_impulse.x - f1.x;
+         df.y = this.m_impulse.y - f1.y;
+         PX = df.x * this.m_perp.x + df.y * this.m_axis.x;
+         PY = df.x * this.m_perp.y + df.y * this.m_axis.y;
+         L1 = df.x * this.m_s1 + df.y * this.m_a1;
+         L2 = df.x * this.m_s2 + df.y * this.m_a2;
+         v1.x -= this.m_invMassA * PX;
+         v1.y -= this.m_invMassA * PY;
+         w1 -= this.m_invIA * L1;
+         v2.x += this.m_invMassB * PX;
+         v2.y += this.m_invMassB * PY;
+         w2 += this.m_invIB * L2;
+      }
+      else {
+         var df2 = 0;
+         if (this.m_K.col1.x != 0.0) {
+            df2 = ((-Cdot1)) / this.m_K.col1.x;
+         }
+         else {
+            df2 = 0.0;
+         }
+         this.m_impulse.x += df2;
+         PX = df2 * this.m_perp.x;
+         PY = df2 * this.m_perp.y;
+         L1 = df2 * this.m_s1;
+         L2 = df2 * this.m_s2;
+         v1.x -= this.m_invMassA * PX;
+         v1.y -= this.m_invMassA * PY;
+         w1 -= this.m_invIA * L1;
+         v2.x += this.m_invMassB * PX;
+         v2.y += this.m_invMassB * PY;
+         w2 += this.m_invIB * L2;
+      }
+      bA.m_linearVelocity.SetV(v1);
+      bA.m_angularVelocity = w1;
+      bB.m_linearVelocity.SetV(v2);
+      bB.m_angularVelocity = w2;
+   }
+   b2LineJoint.prototype.SolvePositionConstraints = function (baumgarte) {
+      if (baumgarte === undefined) baumgarte = 0;
+      var limitC = 0;
+      var oldLimitImpulse = 0;
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var c1 = bA.m_sweep.c;
+      var a1 = bA.m_sweep.a;
+      var c2 = bB.m_sweep.c;
+      var a2 = bB.m_sweep.a;
+      var tMat;
+      var tX = 0;
+      var m1 = 0;
+      var m2 = 0;
+      var i1 = 0;
+      var i2 = 0;
+      var linearError = 0.0;
+      var angularError = 0.0;
+      var active = false;
+      var C2 = 0.0;
+      var R1 = b2Mat22.FromAngle(a1);
+      var R2 = b2Mat22.FromAngle(a2);
+      tMat = R1;
+      var r1X = this.m_localAnchor1.x - this.m_localCenterA.x;
+      var r1Y = this.m_localAnchor1.y - this.m_localCenterA.y;
+      tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
+      r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
+      r1X = tX;
+      tMat = R2;
+      var r2X = this.m_localAnchor2.x - this.m_localCenterB.x;
+      var r2Y = this.m_localAnchor2.y - this.m_localCenterB.y;
+      tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
+      r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
+      r2X = tX;
+      var dX = c2.x + r2X - c1.x - r1X;
+      var dY = c2.y + r2Y - c1.y - r1Y;
+      if (this.m_enableLimit) {
+         this.m_axis = b2Math.MulMV(R1, this.m_localXAxis1);
+         this.m_a1 = (dX + r1X) * this.m_axis.y - (dY + r1Y) * this.m_axis.x;
+         this.m_a2 = r2X * this.m_axis.y - r2Y * this.m_axis.x;
+         var translation = this.m_axis.x * dX + this.m_axis.y * dY;
+         if (b2Math.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * b2Settings.b2_linearSlop) {
+            C2 = b2Math.Clamp(translation, (-b2Settings.b2_maxLinearCorrection), b2Settings.b2_maxLinearCorrection);
+            linearError = b2Math.Abs(translation);
+            active = true;
+         }
+         else if (translation <= this.m_lowerTranslation) {
+            C2 = b2Math.Clamp(translation - this.m_lowerTranslation + b2Settings.b2_linearSlop, (-b2Settings.b2_maxLinearCorrection), 0.0);
+            linearError = this.m_lowerTranslation - translation;
+            active = true;
+         }
+         else if (translation >= this.m_upperTranslation) {
+            C2 = b2Math.Clamp(translation - this.m_upperTranslation + b2Settings.b2_linearSlop, 0.0, b2Settings.b2_maxLinearCorrection);
+            linearError = translation - this.m_upperTranslation;
+            active = true;
+         }
+      }
+      this.m_perp = b2Math.MulMV(R1, this.m_localYAxis1);
+      this.m_s1 = (dX + r1X) * this.m_perp.y - (dY + r1Y) * this.m_perp.x;
+      this.m_s2 = r2X * this.m_perp.y - r2Y * this.m_perp.x;
+      var impulse = new b2Vec2();
+      var C1 = this.m_perp.x * dX + this.m_perp.y * dY;
+      linearError = b2Math.Max(linearError, b2Math.Abs(C1));
+      angularError = 0.0;
+      if (active) {
+         m1 = this.m_invMassA;
+         m2 = this.m_invMassB;
+         i1 = this.m_invIA;
+         i2 = this.m_invIB;
+         this.m_K.col1.x = m1 + m2 + i1 * this.m_s1 * this.m_s1 + i2 * this.m_s2 * this.m_s2;
+         this.m_K.col1.y = i1 * this.m_s1 * this.m_a1 + i2 * this.m_s2 * this.m_a2;
+         this.m_K.col2.x = this.m_K.col1.y;
+         this.m_K.col2.y = m1 + m2 + i1 * this.m_a1 * this.m_a1 + i2 * this.m_a2 * this.m_a2;
+         this.m_K.Solve(impulse, (-C1), (-C2));
+      }
+      else {
+         m1 = this.m_invMassA;
+         m2 = this.m_invMassB;
+         i1 = this.m_invIA;
+         i2 = this.m_invIB;
+         var k11 = m1 + m2 + i1 * this.m_s1 * this.m_s1 + i2 * this.m_s2 * this.m_s2;
+         var impulse1 = 0;
+         if (k11 != 0.0) {
+            impulse1 = ((-C1)) / k11;
+         }
+         else {
+            impulse1 = 0.0;
+         }
+         impulse.x = impulse1;
+         impulse.y = 0.0;
+      }
+      var PX = impulse.x * this.m_perp.x + impulse.y * this.m_axis.x;
+      var PY = impulse.x * this.m_perp.y + impulse.y * this.m_axis.y;
+      var L1 = impulse.x * this.m_s1 + impulse.y * this.m_a1;
+      var L2 = impulse.x * this.m_s2 + impulse.y * this.m_a2;
+      c1.x -= this.m_invMassA * PX;
+      c1.y -= this.m_invMassA * PY;
+      a1 -= this.m_invIA * L1;
+      c2.x += this.m_invMassB * PX;
+      c2.y += this.m_invMassB * PY;
+      a2 += this.m_invIB * L2;
+      bA.m_sweep.a = a1;
+      bB.m_sweep.a = a2;
+      bA.SynchronizeTransform();
+      bB.SynchronizeTransform();
+      return linearError <= b2Settings.b2_linearSlop && angularError <= b2Settings.b2_angularSlop;
+   }
+   Box2D.inherit(b2LineJointDef, Box2D.Dynamics.Joints.b2JointDef);
+   b2LineJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
+   b2LineJointDef.b2LineJointDef = function () {
+      Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
+      this.localAnchorA = new b2Vec2();
+      this.localAnchorB = new b2Vec2();
+      this.localAxisA = new b2Vec2();
+   };
+   b2LineJointDef.prototype.b2LineJointDef = function () {
+      this.__super.b2JointDef.call(this);
+      this.type = b2Joint.e_lineJoint;
+      this.localAxisA.Set(1.0, 0.0);
+      this.enableLimit = false;
+      this.lowerTranslation = 0.0;
+      this.upperTranslation = 0.0;
+      this.enableMotor = false;
+      this.maxMotorForce = 0.0;
+      this.motorSpeed = 0.0;
+   }
+   b2LineJointDef.prototype.Initialize = function (bA, bB, anchor, axis) {
+      this.bodyA = bA;
+      this.bodyB = bB;
+      this.localAnchorA = this.bodyA.GetLocalPoint(anchor);
+      this.localAnchorB = this.bodyB.GetLocalPoint(anchor);
+      this.localAxisA = this.bodyA.GetLocalVector(axis);
+   }
+   Box2D.inherit(b2MouseJoint, Box2D.Dynamics.Joints.b2Joint);
+   b2MouseJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
+   b2MouseJoint.b2MouseJoint = function () {
+      Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
+      this.K = new b2Mat22();
+      this.K1 = new b2Mat22();
+      this.K2 = new b2Mat22();
+      this.m_localAnchor = new b2Vec2();
+      this.m_target = new b2Vec2();
+      this.m_impulse = new b2Vec2();
+      this.m_mass = new b2Mat22();
+      this.m_C = new b2Vec2();
+   };
+   b2MouseJoint.prototype.GetAnchorA = function () {
+      return this.m_target;
+   }
+   b2MouseJoint.prototype.GetAnchorB = function () {
+      return this.m_bodyB.GetWorldPoint(this.m_localAnchor);
+   }
+   b2MouseJoint.prototype.GetReactionForce = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return new b2Vec2(inv_dt * this.m_impulse.x, inv_dt * this.m_impulse.y);
+   }
+   b2MouseJoint.prototype.GetReactionTorque = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return 0.0;
+   }
+   b2MouseJoint.prototype.GetTarget = function () {
+      return this.m_target;
+   }
+   b2MouseJoint.prototype.SetTarget = function (target) {
+      if (this.m_bodyB.IsAwake() == false) {
+         this.m_bodyB.SetAwake(true);
+      }
+      this.m_target = target;
+   }
+   b2MouseJoint.prototype.GetMaxForce = function () {
+      return this.m_maxForce;
+   }
+   b2MouseJoint.prototype.SetMaxForce = function (maxForce) {
+      if (maxForce === undefined) maxForce = 0;
+      this.m_maxForce = maxForce;
+   }
+   b2MouseJoint.prototype.GetFrequency = function () {
+      return this.m_frequencyHz;
+   }
+   b2MouseJoint.prototype.SetFrequency = function (hz) {
+      if (hz === undefined) hz = 0;
+      this.m_frequencyHz = hz;
+   }
+   b2MouseJoint.prototype.GetDampingRatio = function () {
+      return this.m_dampingRatio;
+   }
+   b2MouseJoint.prototype.SetDampingRatio = function (ratio) {
+      if (ratio === undefined) ratio = 0;
+      this.m_dampingRatio = ratio;
+   }
+   b2MouseJoint.prototype.b2MouseJoint = function (def) {
+      this.__super.b2Joint.call(this, def);
+      this.m_target.SetV(def.target);
+      var tX = this.m_target.x - this.m_bodyB.m_xf.position.x;
+      var tY = this.m_target.y - this.m_bodyB.m_xf.position.y;
+      var tMat = this.m_bodyB.m_xf.R;
+      this.m_localAnchor.x = (tX * tMat.col1.x + tY * tMat.col1.y);
+      this.m_localAnchor.y = (tX * tMat.col2.x + tY * tMat.col2.y);
+      this.m_maxForce = def.maxForce;
+      this.m_impulse.SetZero();
+      this.m_frequencyHz = def.frequencyHz;
+      this.m_dampingRatio = def.dampingRatio;
+      this.m_beta = 0.0;
+      this.m_gamma = 0.0;
+   }
+   b2MouseJoint.prototype.InitVelocityConstraints = function (step) {
+      var b = this.m_bodyB;
+      var mass = b.GetMass();
+      var omega = 2.0 * Math.PI * this.m_frequencyHz;
+      var d = 2.0 * mass * this.m_dampingRatio * omega;
+      var k = mass * omega * omega;
+      this.m_gamma = step.dt * (d + step.dt * k);
+      this.m_gamma = this.m_gamma != 0 ? 1 / this.m_gamma : 0.0;
+      this.m_beta = step.dt * k * this.m_gamma;
+      var tMat;tMat = b.m_xf.R;
+      var rX = this.m_localAnchor.x - b.m_sweep.localCenter.x;
+      var rY = this.m_localAnchor.y - b.m_sweep.localCenter.y;
+      var tX = (tMat.col1.x * rX + tMat.col2.x * rY);rY = (tMat.col1.y * rX + tMat.col2.y * rY);
+      rX = tX;
+      var invMass = b.m_invMass;
+      var invI = b.m_invI;this.K1.col1.x = invMass;
+      this.K1.col2.x = 0.0;
+      this.K1.col1.y = 0.0;
+      this.K1.col2.y = invMass;
+      this.K2.col1.x = invI * rY * rY;
+      this.K2.col2.x = (-invI * rX * rY);
+      this.K2.col1.y = (-invI * rX * rY);
+      this.K2.col2.y = invI * rX * rX;
+      this.K.SetM(this.K1);
+      this.K.AddM(this.K2);
+      this.K.col1.x += this.m_gamma;
+      this.K.col2.y += this.m_gamma;
+      this.K.GetInverse(this.m_mass);
+      this.m_C.x = b.m_sweep.c.x + rX - this.m_target.x;
+      this.m_C.y = b.m_sweep.c.y + rY - this.m_target.y;
+      b.m_angularVelocity *= 0.98;
+      this.m_impulse.x *= step.dtRatio;
+      this.m_impulse.y *= step.dtRatio;
+      b.m_linearVelocity.x += invMass * this.m_impulse.x;
+      b.m_linearVelocity.y += invMass * this.m_impulse.y;
+      b.m_angularVelocity += invI * (rX * this.m_impulse.y - rY * this.m_impulse.x);
+   }
+   b2MouseJoint.prototype.SolveVelocityConstraints = function (step) {
+      var b = this.m_bodyB;
+      var tMat;
+      var tX = 0;
+      var tY = 0;
+      tMat = b.m_xf.R;
+      var rX = this.m_localAnchor.x - b.m_sweep.localCenter.x;
+      var rY = this.m_localAnchor.y - b.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * rX + tMat.col2.x * rY);
+      rY = (tMat.col1.y * rX + tMat.col2.y * rY);
+      rX = tX;
+      var CdotX = b.m_linearVelocity.x + ((-b.m_angularVelocity * rY));
+      var CdotY = b.m_linearVelocity.y + (b.m_angularVelocity * rX);
+      tMat = this.m_mass;
+      tX = CdotX + this.m_beta * this.m_C.x + this.m_gamma * this.m_impulse.x;
+      tY = CdotY + this.m_beta * this.m_C.y + this.m_gamma * this.m_impulse.y;
+      var impulseX = (-(tMat.col1.x * tX + tMat.col2.x * tY));
+      var impulseY = (-(tMat.col1.y * tX + tMat.col2.y * tY));
+      var oldImpulseX = this.m_impulse.x;
+      var oldImpulseY = this.m_impulse.y;
+      this.m_impulse.x += impulseX;
+      this.m_impulse.y += impulseY;
+      var maxImpulse = step.dt * this.m_maxForce;
+      if (this.m_impulse.LengthSquared() > maxImpulse * maxImpulse) {
+         this.m_impulse.Multiply(maxImpulse / this.m_impulse.Length());
+      }
+      impulseX = this.m_impulse.x - oldImpulseX;
+      impulseY = this.m_impulse.y - oldImpulseY;
+      b.m_linearVelocity.x += b.m_invMass * impulseX;
+      b.m_linearVelocity.y += b.m_invMass * impulseY;
+      b.m_angularVelocity += b.m_invI * (rX * impulseY - rY * impulseX);
+   }
+   b2MouseJoint.prototype.SolvePositionConstraints = function (baumgarte) {
+      if (baumgarte === undefined) baumgarte = 0;
+      return true;
+   }
+   Box2D.inherit(b2MouseJointDef, Box2D.Dynamics.Joints.b2JointDef);
+   b2MouseJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
+   b2MouseJointDef.b2MouseJointDef = function () {
+      Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
+      this.target = new b2Vec2();
+   };
+   b2MouseJointDef.prototype.b2MouseJointDef = function () {
+      this.__super.b2JointDef.call(this);
+      this.type = b2Joint.e_mouseJoint;
+      this.maxForce = 0.0;
+      this.frequencyHz = 5.0;
+      this.dampingRatio = 0.7;
+   }
+   Box2D.inherit(b2PrismaticJoint, Box2D.Dynamics.Joints.b2Joint);
+   b2PrismaticJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
+   b2PrismaticJoint.b2PrismaticJoint = function () {
+      Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
+      this.m_localAnchor1 = new b2Vec2();
+      this.m_localAnchor2 = new b2Vec2();
+      this.m_localXAxis1 = new b2Vec2();
+      this.m_localYAxis1 = new b2Vec2();
+      this.m_axis = new b2Vec2();
+      this.m_perp = new b2Vec2();
+      this.m_K = new b2Mat33();
+      this.m_impulse = new b2Vec3();
+   };
+   b2PrismaticJoint.prototype.GetAnchorA = function () {
+      return this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
+   }
+   b2PrismaticJoint.prototype.GetAnchorB = function () {
+      return this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
+   }
+   b2PrismaticJoint.prototype.GetReactionForce = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return new b2Vec2(inv_dt * (this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.x), inv_dt * (this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.y));
+   }
+   b2PrismaticJoint.prototype.GetReactionTorque = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return inv_dt * this.m_impulse.y;
+   }
+   b2PrismaticJoint.prototype.GetJointTranslation = function () {
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var tMat;
+      var p1 = bA.GetWorldPoint(this.m_localAnchor1);
+      var p2 = bB.GetWorldPoint(this.m_localAnchor2);
+      var dX = p2.x - p1.x;
+      var dY = p2.y - p1.y;
+      var axis = bA.GetWorldVector(this.m_localXAxis1);
+      var translation = axis.x * dX + axis.y * dY;
+      return translation;
+   }
+   b2PrismaticJoint.prototype.GetJointSpeed = function () {
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var tMat;
+      tMat = bA.m_xf.R;
+      var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
+      var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
+      var tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
+      r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
+      r1X = tX;
+      tMat = bB.m_xf.R;
+      var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
+      var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
+      r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
+      r2X = tX;
+      var p1X = bA.m_sweep.c.x + r1X;
+      var p1Y = bA.m_sweep.c.y + r1Y;
+      var p2X = bB.m_sweep.c.x + r2X;
+      var p2Y = bB.m_sweep.c.y + r2Y;
+      var dX = p2X - p1X;
+      var dY = p2Y - p1Y;
+      var axis = bA.GetWorldVector(this.m_localXAxis1);
+      var v1 = bA.m_linearVelocity;
+      var v2 = bB.m_linearVelocity;
+      var w1 = bA.m_angularVelocity;
+      var w2 = bB.m_angularVelocity;
+      var speed = (dX * ((-w1 * axis.y)) + dY * (w1 * axis.x)) + (axis.x * (((v2.x + ((-w2 * r2Y))) - v1.x) - ((-w1 * r1Y))) + axis.y * (((v2.y + (w2 * r2X)) - v1.y) - (w1 * r1X)));
+      return speed;
+   }
+   b2PrismaticJoint.prototype.IsLimitEnabled = function () {
+      return this.m_enableLimit;
+   }
+   b2PrismaticJoint.prototype.EnableLimit = function (flag) {
+      this.m_bodyA.SetAwake(true);
+      this.m_bodyB.SetAwake(true);
+      this.m_enableLimit = flag;
+   }
+   b2PrismaticJoint.prototype.GetLowerLimit = function () {
+      return this.m_lowerTranslation;
+   }
+   b2PrismaticJoint.prototype.GetUpperLimit = function () {
+      return this.m_upperTranslation;
+   }
+   b2PrismaticJoint.prototype.SetLimits = function (lower, upper) {
+      if (lower === undefined) lower = 0;
+      if (upper === undefined) upper = 0;
+      this.m_bodyA.SetAwake(true);
+      this.m_bodyB.SetAwake(true);
+      this.m_lowerTranslation = lower;
+      this.m_upperTranslation = upper;
+   }
+   b2PrismaticJoint.prototype.IsMotorEnabled = function () {
+      return this.m_enableMotor;
+   }
+   b2PrismaticJoint.prototype.EnableMotor = function (flag) {
+      this.m_bodyA.SetAwake(true);
+      this.m_bodyB.SetAwake(true);
+      this.m_enableMotor = flag;
+   }
+   b2PrismaticJoint.prototype.SetMotorSpeed = function (speed) {
+      if (speed === undefined) speed = 0;
+      this.m_bodyA.SetAwake(true);
+      this.m_bodyB.SetAwake(true);
+      this.m_motorSpeed = speed;
+   }
+   b2PrismaticJoint.prototype.GetMotorSpeed = function () {
+      return this.m_motorSpeed;
+   }
+   b2PrismaticJoint.prototype.SetMaxMotorForce = function (force) {
+      if (force === undefined) force = 0;
+      this.m_bodyA.SetAwake(true);
+      this.m_bodyB.SetAwake(true);
+      this.m_maxMotorForce = force;
+   }
+   b2PrismaticJoint.prototype.GetMotorForce = function () {
+      return this.m_motorImpulse;
+   }
+   b2PrismaticJoint.prototype.b2PrismaticJoint = function (def) {
+      this.__super.b2Joint.call(this, def);
+      var tMat;
+      var tX = 0;
+      var tY = 0;
+      this.m_localAnchor1.SetV(def.localAnchorA);
+      this.m_localAnchor2.SetV(def.localAnchorB);
+      this.m_localXAxis1.SetV(def.localAxisA);
+      this.m_localYAxis1.x = (-this.m_localXAxis1.y);
+      this.m_localYAxis1.y = this.m_localXAxis1.x;
+      this.m_refAngle = def.referenceAngle;
+      this.m_impulse.SetZero();
+      this.m_motorMass = 0.0;
+      this.m_motorImpulse = 0.0;
+      this.m_lowerTranslation = def.lowerTranslation;
+      this.m_upperTranslation = def.upperTranslation;
+      this.m_maxMotorForce = def.maxMotorForce;
+      this.m_motorSpeed = def.motorSpeed;
+      this.m_enableLimit = def.enableLimit;
+      this.m_enableMotor = def.enableMotor;
+      this.m_limitState = b2Joint.e_inactiveLimit;
+      this.m_axis.SetZero();
+      this.m_perp.SetZero();
+   }
+   b2PrismaticJoint.prototype.InitVelocityConstraints = function (step) {
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var tMat;
+      var tX = 0;
+      this.m_localCenterA.SetV(bA.GetLocalCenter());
+      this.m_localCenterB.SetV(bB.GetLocalCenter());
+      var xf1 = bA.GetTransform();
+      var xf2 = bB.GetTransform();
+      tMat = bA.m_xf.R;
+      var r1X = this.m_localAnchor1.x - this.m_localCenterA.x;
+      var r1Y = this.m_localAnchor1.y - this.m_localCenterA.y;
+      tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
+      r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
+      r1X = tX;
+      tMat = bB.m_xf.R;
+      var r2X = this.m_localAnchor2.x - this.m_localCenterB.x;
+      var r2Y = this.m_localAnchor2.y - this.m_localCenterB.y;
+      tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
+      r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
+      r2X = tX;
+      var dX = bB.m_sweep.c.x + r2X - bA.m_sweep.c.x - r1X;
+      var dY = bB.m_sweep.c.y + r2Y - bA.m_sweep.c.y - r1Y;
+      this.m_invMassA = bA.m_invMass;
+      this.m_invMassB = bB.m_invMass;
+      this.m_invIA = bA.m_invI;
+      this.m_invIB = bB.m_invI; {
+         this.m_axis.SetV(b2Math.MulMV(xf1.R, this.m_localXAxis1));
+         this.m_a1 = (dX + r1X) * this.m_axis.y - (dY + r1Y) * this.m_axis.x;
+         this.m_a2 = r2X * this.m_axis.y - r2Y * this.m_axis.x;
+         this.m_motorMass = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_a1 * this.m_a1 + this.m_invIB * this.m_a2 * this.m_a2;
+         if (this.m_motorMass > Number.MIN_VALUE) this.m_motorMass = 1.0 / this.m_motorMass;
+      } {
+         this.m_perp.SetV(b2Math.MulMV(xf1.R, this.m_localYAxis1));
+         this.m_s1 = (dX + r1X) * this.m_perp.y - (dY + r1Y) * this.m_perp.x;
+         this.m_s2 = r2X * this.m_perp.y - r2Y * this.m_perp.x;
+         var m1 = this.m_invMassA;
+         var m2 = this.m_invMassB;
+         var i1 = this.m_invIA;
+         var i2 = this.m_invIB;
+         this.m_K.col1.x = m1 + m2 + i1 * this.m_s1 * this.m_s1 + i2 * this.m_s2 * this.m_s2;
+         this.m_K.col1.y = i1 * this.m_s1 + i2 * this.m_s2;
+         this.m_K.col1.z = i1 * this.m_s1 * this.m_a1 + i2 * this.m_s2 * this.m_a2;
+         this.m_K.col2.x = this.m_K.col1.y;
+         this.m_K.col2.y = i1 + i2;
+         this.m_K.col2.z = i1 * this.m_a1 + i2 * this.m_a2;
+         this.m_K.col3.x = this.m_K.col1.z;
+         this.m_K.col3.y = this.m_K.col2.z;
+         this.m_K.col3.z = m1 + m2 + i1 * this.m_a1 * this.m_a1 + i2 * this.m_a2 * this.m_a2;
+      }
+      if (this.m_enableLimit) {
+         var jointTransition = this.m_axis.x * dX + this.m_axis.y * dY;
+         if (b2Math.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * b2Settings.b2_linearSlop) {
+            this.m_limitState = b2Joint.e_equalLimits;
+         }
+         else if (jointTransition <= this.m_lowerTranslation) {
+            if (this.m_limitState != b2Joint.e_atLowerLimit) {
+               this.m_limitState = b2Joint.e_atLowerLimit;
+               this.m_impulse.z = 0.0;
+            }
+         }
+         else if (jointTransition >= this.m_upperTranslation) {
+            if (this.m_limitState != b2Joint.e_atUpperLimit) {
+               this.m_limitState = b2Joint.e_atUpperLimit;
+               this.m_impulse.z = 0.0;
+            }
+         }
+         else {
+            this.m_limitState = b2Joint.e_inactiveLimit;
+            this.m_impulse.z = 0.0;
+         }
+      }
+      else {
+         this.m_limitState = b2Joint.e_inactiveLimit;
+      }
+      if (this.m_enableMotor == false) {
+         this.m_motorImpulse = 0.0;
+      }
+      if (step.warmStarting) {
+         this.m_impulse.x *= step.dtRatio;
+         this.m_impulse.y *= step.dtRatio;
+         this.m_motorImpulse *= step.dtRatio;
+         var PX = this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.x;
+         var PY = this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.y;
+         var L1 = this.m_impulse.x * this.m_s1 + this.m_impulse.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;
+         var L2 = this.m_impulse.x * this.m_s2 + this.m_impulse.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;
+         bA.m_linearVelocity.x -= this.m_invMassA * PX;
+         bA.m_linearVelocity.y -= this.m_invMassA * PY;
+         bA.m_angularVelocity -= this.m_invIA * L1;
+         bB.m_linearVelocity.x += this.m_invMassB * PX;
+         bB.m_linearVelocity.y += this.m_invMassB * PY;
+         bB.m_angularVelocity += this.m_invIB * L2;
+      }
+      else {
+         this.m_impulse.SetZero();
+         this.m_motorImpulse = 0.0;
+      }
+   }
+   b2PrismaticJoint.prototype.SolveVelocityConstraints = function (step) {
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var v1 = bA.m_linearVelocity;
+      var w1 = bA.m_angularVelocity;
+      var v2 = bB.m_linearVelocity;
+      var w2 = bB.m_angularVelocity;
+      var PX = 0;
+      var PY = 0;
+      var L1 = 0;
+      var L2 = 0;
+      if (this.m_enableMotor && this.m_limitState != b2Joint.e_equalLimits) {
+         var Cdot = this.m_axis.x * (v2.x - v1.x) + this.m_axis.y * (v2.y - v1.y) + this.m_a2 * w2 - this.m_a1 * w1;
+         var impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);
+         var oldImpulse = this.m_motorImpulse;
+         var maxImpulse = step.dt * this.m_maxMotorForce;
+         this.m_motorImpulse = b2Math.Clamp(this.m_motorImpulse + impulse, (-maxImpulse), maxImpulse);
+         impulse = this.m_motorImpulse - oldImpulse;
+         PX = impulse * this.m_axis.x;
+         PY = impulse * this.m_axis.y;
+         L1 = impulse * this.m_a1;
+         L2 = impulse * this.m_a2;
+         v1.x -= this.m_invMassA * PX;
+         v1.y -= this.m_invMassA * PY;
+         w1 -= this.m_invIA * L1;
+         v2.x += this.m_invMassB * PX;
+         v2.y += this.m_invMassB * PY;
+         w2 += this.m_invIB * L2;
+      }
+      var Cdot1X = this.m_perp.x * (v2.x - v1.x) + this.m_perp.y * (v2.y - v1.y) + this.m_s2 * w2 - this.m_s1 * w1;
+      var Cdot1Y = w2 - w1;
+      if (this.m_enableLimit && this.m_limitState != b2Joint.e_inactiveLimit) {
+         var Cdot2 = this.m_axis.x * (v2.x - v1.x) + this.m_axis.y * (v2.y - v1.y) + this.m_a2 * w2 - this.m_a1 * w1;
+         var f1 = this.m_impulse.Copy();
+         var df = this.m_K.Solve33(new b2Vec3(), (-Cdot1X), (-Cdot1Y), (-Cdot2));
+         this.m_impulse.Add(df);
+         if (this.m_limitState == b2Joint.e_atLowerLimit) {
+            this.m_impulse.z = b2Math.Max(this.m_impulse.z, 0.0);
+         }
+         else if (this.m_limitState == b2Joint.e_atUpperLimit) {
+            this.m_impulse.z = b2Math.Min(this.m_impulse.z, 0.0);
+         }
+         var bX = (-Cdot1X) - (this.m_impulse.z - f1.z) * this.m_K.col3.x;
+         var bY = (-Cdot1Y) - (this.m_impulse.z - f1.z) * this.m_K.col3.y;
+         var f2r = this.m_K.Solve22(new b2Vec2(), bX, bY);
+         f2r.x += f1.x;
+         f2r.y += f1.y;
+         this.m_impulse.x = f2r.x;
+         this.m_impulse.y = f2r.y;
+         df.x = this.m_impulse.x - f1.x;
+         df.y = this.m_impulse.y - f1.y;
+         df.z = this.m_impulse.z - f1.z;
+         PX = df.x * this.m_perp.x + df.z * this.m_axis.x;
+         PY = df.x * this.m_perp.y + df.z * this.m_axis.y;
+         L1 = df.x * this.m_s1 + df.y + df.z * this.m_a1;
+         L2 = df.x * this.m_s2 + df.y + df.z * this.m_a2;
+         v1.x -= this.m_invMassA * PX;
+         v1.y -= this.m_invMassA * PY;
+         w1 -= this.m_invIA * L1;
+         v2.x += this.m_invMassB * PX;
+         v2.y += this.m_invMassB * PY;
+         w2 += this.m_invIB * L2;
+      }
+      else {
+         var df2 = this.m_K.Solve22(new b2Vec2(), (-Cdot1X), (-Cdot1Y));
+         this.m_impulse.x += df2.x;
+         this.m_impulse.y += df2.y;
+         PX = df2.x * this.m_perp.x;
+         PY = df2.x * this.m_perp.y;
+         L1 = df2.x * this.m_s1 + df2.y;
+         L2 = df2.x * this.m_s2 + df2.y;
+         v1.x -= this.m_invMassA * PX;
+         v1.y -= this.m_invMassA * PY;
+         w1 -= this.m_invIA * L1;
+         v2.x += this.m_invMassB * PX;
+         v2.y += this.m_invMassB * PY;
+         w2 += this.m_invIB * L2;
+      }
+      bA.m_linearVelocity.SetV(v1);
+      bA.m_angularVelocity = w1;
+      bB.m_linearVelocity.SetV(v2);
+      bB.m_angularVelocity = w2;
+   }
+   b2PrismaticJoint.prototype.SolvePositionConstraints = function (baumgarte) {
+      if (baumgarte === undefined) baumgarte = 0;
+      var limitC = 0;
+      var oldLimitImpulse = 0;
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var c1 = bA.m_sweep.c;
+      var a1 = bA.m_sweep.a;
+      var c2 = bB.m_sweep.c;
+      var a2 = bB.m_sweep.a;
+      var tMat;
+      var tX = 0;
+      var m1 = 0;
+      var m2 = 0;
+      var i1 = 0;
+      var i2 = 0;
+      var linearError = 0.0;
+      var angularError = 0.0;
+      var active = false;
+      var C2 = 0.0;
+      var R1 = b2Mat22.FromAngle(a1);
+      var R2 = b2Mat22.FromAngle(a2);
+      tMat = R1;
+      var r1X = this.m_localAnchor1.x - this.m_localCenterA.x;
+      var r1Y = this.m_localAnchor1.y - this.m_localCenterA.y;
+      tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
+      r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
+      r1X = tX;
+      tMat = R2;
+      var r2X = this.m_localAnchor2.x - this.m_localCenterB.x;
+      var r2Y = this.m_localAnchor2.y - this.m_localCenterB.y;
+      tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
+      r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
+      r2X = tX;
+      var dX = c2.x + r2X - c1.x - r1X;
+      var dY = c2.y + r2Y - c1.y - r1Y;
+      if (this.m_enableLimit) {
+         this.m_axis = b2Math.MulMV(R1, this.m_localXAxis1);
+         this.m_a1 = (dX + r1X) * this.m_axis.y - (dY + r1Y) * this.m_axis.x;
+         this.m_a2 = r2X * this.m_axis.y - r2Y * this.m_axis.x;
+         var translation = this.m_axis.x * dX + this.m_axis.y * dY;
+         if (b2Math.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * b2Settings.b2_linearSlop) {
+            C2 = b2Math.Clamp(translation, (-b2Settings.b2_maxLinearCorrection), b2Settings.b2_maxLinearCorrection);
+            linearError = b2Math.Abs(translation);
+            active = true;
+         }
+         else if (translation <= this.m_lowerTranslation) {
+            C2 = b2Math.Clamp(translation - this.m_lowerTranslation + b2Settings.b2_linearSlop, (-b2Settings.b2_maxLinearCorrection), 0.0);
+            linearError = this.m_lowerTranslation - translation;
+            active = true;
+         }
+         else if (translation >= this.m_upperTranslation) {
+            C2 = b2Math.Clamp(translation - this.m_upperTranslation + b2Settings.b2_linearSlop, 0.0, b2Settings.b2_maxLinearCorrection);
+            linearError = translation - this.m_upperTranslation;
+            active = true;
+         }
+      }
+      this.m_perp = b2Math.MulMV(R1, this.m_localYAxis1);
+      this.m_s1 = (dX + r1X) * this.m_perp.y - (dY + r1Y) * this.m_perp.x;
+      this.m_s2 = r2X * this.m_perp.y - r2Y * this.m_perp.x;
+      var impulse = new b2Vec3();
+      var C1X = this.m_perp.x * dX + this.m_perp.y * dY;
+      var C1Y = a2 - a1 - this.m_refAngle;
+      linearError = b2Math.Max(linearError, b2Math.Abs(C1X));
+      angularError = b2Math.Abs(C1Y);
+      if (active) {
+         m1 = this.m_invMassA;
+         m2 = this.m_invMassB;
+         i1 = this.m_invIA;
+         i2 = this.m_invIB;
+         this.m_K.col1.x = m1 + m2 + i1 * this.m_s1 * this.m_s1 + i2 * this.m_s2 * this.m_s2;
+         this.m_K.col1.y = i1 * this.m_s1 + i2 * this.m_s2;
+         this.m_K.col1.z = i1 * this.m_s1 * this.m_a1 + i2 * this.m_s2 * this.m_a2;
+         this.m_K.col2.x = this.m_K.col1.y;
+         this.m_K.col2.y = i1 + i2;
+         this.m_K.col2.z = i1 * this.m_a1 + i2 * this.m_a2;
+         this.m_K.col3.x = this.m_K.col1.z;
+         this.m_K.col3.y = this.m_K.col2.z;
+         this.m_K.col3.z = m1 + m2 + i1 * this.m_a1 * this.m_a1 + i2 * this.m_a2 * this.m_a2;
+         this.m_K.Solve33(impulse, (-C1X), (-C1Y), (-C2));
+      }
+      else {
+         m1 = this.m_invMassA;
+         m2 = this.m_invMassB;
+         i1 = this.m_invIA;
+         i2 = this.m_invIB;
+         var k11 = m1 + m2 + i1 * this.m_s1 * this.m_s1 + i2 * this.m_s2 * this.m_s2;
+         var k12 = i1 * this.m_s1 + i2 * this.m_s2;
+         var k22 = i1 + i2;
+         this.m_K.col1.Set(k11, k12, 0.0);
+         this.m_K.col2.Set(k12, k22, 0.0);
+         var impulse1 = this.m_K.Solve22(new b2Vec2(), (-C1X), (-C1Y));
+         impulse.x = impulse1.x;
+         impulse.y = impulse1.y;
+         impulse.z = 0.0;
+      }
+      var PX = impulse.x * this.m_perp.x + impulse.z * this.m_axis.x;
+      var PY = impulse.x * this.m_perp.y + impulse.z * this.m_axis.y;
+      var L1 = impulse.x * this.m_s1 + impulse.y + impulse.z * this.m_a1;
+      var L2 = impulse.x * this.m_s2 + impulse.y + impulse.z * this.m_a2;
+      c1.x -= this.m_invMassA * PX;
+      c1.y -= this.m_invMassA * PY;
+      a1 -= this.m_invIA * L1;
+      c2.x += this.m_invMassB * PX;
+      c2.y += this.m_invMassB * PY;
+      a2 += this.m_invIB * L2;
+      bA.m_sweep.a = a1;
+      bB.m_sweep.a = a2;
+      bA.SynchronizeTransform();
+      bB.SynchronizeTransform();
+      return linearError <= b2Settings.b2_linearSlop && angularError <= b2Settings.b2_angularSlop;
+   }
+   Box2D.inherit(b2PrismaticJointDef, Box2D.Dynamics.Joints.b2JointDef);
+   b2PrismaticJointDef.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
+   b2PrismaticJointDef.b2PrismaticJointDef = function () {
+      Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
+      this.localAnchorA = new b2Vec2();
+      this.localAnchorB = new b2Vec2();
+      this.localAxisA = new b2Vec2();
+   };
+   b2PrismaticJointDef.prototype.b2PrismaticJointDef = function () {
+      this.__super.b2JointDef.call(this);
+      this.type = b2Joint.e_prismaticJoint;
+      this.localAxisA.Set(1.0, 0.0);
+      this.referenceAngle = 0.0;
+      this.enableLimit = false;
+      this.lowerTranslation = 0.0;
+      this.upperTranslation = 0.0;
+      this.enableMotor = false;
+      this.maxMotorForce = 0.0;
+      this.motorSpeed = 0.0;
+   }
+   b2PrismaticJointDef.prototype.Initialize = function (bA, bB, anchor, axis) {
+      this.bodyA = bA;
+      this.bodyB = bB;
+      this.localAnchorA = this.bodyA.GetLocalPoint(anchor);
+      this.localAnchorB = this.bodyB.GetLocalPoint(anchor);
+      this.localAxisA = this.bodyA.GetLocalVector(axis);
+      this.referenceAngle = this.bodyB.GetAngle() - this.bodyA.GetAngle();
+   }
+   Box2D.inherit(b2PulleyJoint, Box2D.Dynamics.Joints.b2Joint);
+   b2PulleyJoint.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
+   b2PulleyJoint.b2PulleyJoint = function () {
+      Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
+      this.m_groundAnchor1 = new b2Vec2();
+      this.m_groundAnchor2 = new b2Vec2();
+      this.m_localAnchor1 = new b2Vec2();
+      this.m_localAnchor2 = new b2Vec2();
+      this.m_u1 = new b2Vec2();
+      this.m_u2 = new b2Vec2();
+   };
+   b2PulleyJoint.prototype.GetAnchorA = function () {
+      return this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
+   }
+   b2PulleyJoint.prototype.GetAnchorB = function () {
+      return this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
+   }
+   b2PulleyJoint.prototype.GetReactionForce = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return new b2Vec2(inv_dt * this.m_impulse * this.m_u2.x, inv_dt * this.m_impulse * this.m_u2.y);
+   }
+   b2PulleyJoint.prototype.GetReactionTorque = function (inv_dt) {
+      if (inv_dt === undefined) inv_dt = 0;
+      return 0.0;
+   }
+   b2PulleyJoint.prototype.GetGroundAnchorA = function () {
+      var a = this.m_ground.m_xf.position.Copy();
+      a.Add(this.m_groundAnchor1);
+      return a;
+   }
+   b2PulleyJoint.prototype.GetGroundAnchorB = function () {
+      var a = this.m_ground.m_xf.position.Copy();
+      a.Add(this.m_groundAnchor2);
+      return a;
+   }
+   b2PulleyJoint.prototype.GetLength1 = function () {
+      var p = this.m_bodyA.GetWorldPoint(this.m_localAnchor1);
+      var sX = this.m_ground.m_xf.position.x + this.m_groundAnchor1.x;
+      var sY = this.m_ground.m_xf.position.y + this.m_groundAnchor1.y;
+      var dX = p.x - sX;
+      var dY = p.y - sY;
+      return Math.sqrt(dX * dX + dY * dY);
+   }
+   b2PulleyJoint.prototype.GetLength2 = function () {
+      var p = this.m_bodyB.GetWorldPoint(this.m_localAnchor2);
+      var sX = this.m_ground.m_xf.position.x + this.m_groundAnchor2.x;
+      var sY = this.m_ground.m_xf.position.y + this.m_groundAnchor2.y;
+      var dX = p.x - sX;
+      var dY = p.y - sY;
+      return Math.sqrt(dX * dX + dY * dY);
+   }
+   b2PulleyJoint.prototype.GetRatio = function () {
+      return this.m_ratio;
+   }
+   b2PulleyJoint.prototype.b2PulleyJoint = function (def) {
+      this.__super.b2Joint.call(this, def);
+      var tMat;
+      var tX = 0;
+      var tY = 0;
+      this.m_ground = this.m_bodyA.m_world.m_groundBody;
+      this.m_groundAnchor1.x = def.groundAnchorA.x - this.m_ground.m_xf.position.x;
+      this.m_groundAnchor1.y = def.groundAnchorA.y - this.m_ground.m_xf.position.y;
+      this.m_groundAnchor2.x = def.groundAnchorB.x - this.m_ground.m_xf.position.x;
+      this.m_groundAnchor2.y = def.groundAnchorB.y - this.m_ground.m_xf.position.y;
+      this.m_localAnchor1.SetV(def.localAnchorA);
+      this.m_localAnchor2.SetV(def.localAnchorB);
+      this.m_ratio = def.ratio;
+      this.m_constant = def.lengthA + this.m_ratio * def.lengthB;
+      this.m_maxLength1 = b2Math.Min(def.maxLengthA, this.m_constant - this.m_ratio * b2PulleyJoint.b2_minPulleyLength);
+      this.m_maxLength2 = b2Math.Min(def.maxLengthB, (this.m_constant - b2PulleyJoint.b2_minPulleyLength) / this.m_ratio);
+      this.m_impulse = 0.0;
+      this.m_limitImpulse1 = 0.0;
+      this.m_limitImpulse2 = 0.0;
+   }
+   b2PulleyJoint.prototype.InitVelocityConstraints = function (step) {
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var tMat;
+      tMat = bA.m_xf.R;
+      var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
+      var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
+      var tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
+      r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
+      r1X = tX;
+      tMat = bB.m_xf.R;
+      var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
+      var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
+      r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
+      r2X = tX;
+      var p1X = bA.m_sweep.c.x + r1X;
+      var p1Y = bA.m_sweep.c.y + r1Y;
+      var p2X = bB.m_sweep.c.x + r2X;
+      var p2Y = bB.m_sweep.c.y + r2Y;
+      var s1X = this.m_ground.m_xf.position.x + this.m_groundAnchor1.x;
+      var s1Y = this.m_ground.m_xf.position.y + this.m_groundAnchor1.y;
+      var s2X = this.m_ground.m_xf.position.x + this.m_groundAnchor2.x;
+      var s2Y = this.m_ground.m_xf.position.y + this.m_groundAnchor2.y;
+      this.m_u1.Set(p1X - s1X, p1Y - s1Y);
+      this.m_u2.Set(p2X - s2X, p2Y - s2Y);
+      var length1 = this.m_u1.Length();
+      var length2 = this.m_u2.Length();
+      if (length1 > b2Settings.b2_linearSlop) {
+         this.m_u1.Multiply(1.0 / length1);
+      }
+      else {
+         this.m_u1.SetZero();
+      }
+      if (length2 > b2Settings.b2_linearSlop) {
+         this.m_u2.Multiply(1.0 / length2);
+      }
+      else {
+         this.m_u2.SetZero();
+      }
+      var C = this.m_constant - length1 - this.m_ratio * length2;
+      if (C > 0.0) {
+         this.m_state = b2Joint.e_inactiveLimit;
+         this.m_impulse = 0.0;
+      }
+      else {
+         this.m_state = b2Joint.e_atUpperLimit;
+      }
+      if (length1 < this.m_maxLength1) {
+         this.m_limitState1 = b2Joint.e_inactiveLimit;
+         this.m_limitImpulse1 = 0.0;
+      }
+      else {
+         this.m_limitState1 = b2Joint.e_atUpperLimit;
+      }
+      if (length2 < this.m_maxLength2) {
+         this.m_limitState2 = b2Joint.e_inactiveLimit;
+         this.m_limitImpulse2 = 0.0;
+      }
+      else {
+         this.m_limitState2 = b2Joint.e_atUpperLimit;
+      }
+      var cr1u1 = r1X * this.m_u1.y - r1Y * this.m_u1.x;
+      var cr2u2 = r2X * this.m_u2.y - r2Y * this.m_u2.x;
+      this.m_limitMass1 = bA.m_invMass + bA.m_invI * cr1u1 * cr1u1;
+      this.m_limitMass2 = bB.m_invMass + bB.m_invI * cr2u2 * cr2u2;
+      this.m_pulleyMass = this.m_limitMass1 + this.m_ratio * this.m_ratio * this.m_limitMass2;
+      this.m_limitMass1 = 1.0 / this.m_limitMass1;
+      this.m_limitMass2 = 1.0 / this.m_limitMass2;
+      this.m_pulleyMass = 1.0 / this.m_pulleyMass;
+      if (step.warmStarting) {
+         this.m_impulse *= step.dtRatio;
+         this.m_limitImpulse1 *= step.dtRatio;
+         this.m_limitImpulse2 *= step.dtRatio;
+         var P1X = ((-this.m_impulse) - this.m_limitImpulse1) * this.m_u1.x;
+         var P1Y = ((-this.m_impulse) - this.m_limitImpulse1) * this.m_u1.y;
+         var P2X = ((-this.m_ratio * this.m_impulse) - this.m_limitImpulse2) * this.m_u2.x;
+         var P2Y = ((-this.m_ratio * this.m_impulse) - this.m_limitImpulse2) * this.m_u2.y;
+         bA.m_linearVelocity.x += bA.m_invMass * P1X;
+         bA.m_linearVelocity.y += bA.m_invMass * P1Y;
+         bA.m_angularVelocity += bA.m_invI * (r1X * P1Y - r1Y * P1X);
+         bB.m_linearVelocity.x += bB.m_invMass * P2X;
+         bB.m_linearVelocity.y += bB.m_invMass * P2Y;
+         bB.m_angularVelocity += bB.m_invI * (r2X * P2Y - r2Y * P2X);
+      }
+      else {
+         this.m_impulse = 0.0;
+         this.m_limitImpulse1 = 0.0;
+         this.m_limitImpulse2 = 0.0;
+      }
+   }
+   b2PulleyJoint.prototype.SolveVelocityConstraints = function (step) {
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var tMat;
+      tMat = bA.m_xf.R;
+      var r1X = this.m_localAnchor1.x - bA.m_sweep.localCenter.x;
+      var r1Y = this.m_localAnchor1.y - bA.m_sweep.localCenter.y;
+      var tX = (tMat.col1.x * r1X + tMat.col2.x * r1Y);
+      r1Y = (tMat.col1.y * r1X + tMat.col2.y * r1Y);
+      r1X = tX;
+      tMat = bB.m_xf.R;
+      var r2X = this.m_localAnchor2.x - bB.m_sweep.localCenter.x;
+      var r2Y = this.m_localAnchor2.y - bB.m_sweep.localCenter.y;
+      tX = (tMat.col1.x * r2X + tMat.col2.x * r2Y);
+      r2Y = (tMat.col1.y * r2X + tMat.col2.y * r2Y);
+      r2X = tX;
+      var v1X = 0;
+      var v1Y = 0;
+      var v2X = 0;
+      var v2Y = 0;
+      var P1X = 0;
+      var P1Y = 0;
+      var P2X = 0;
+      var P2Y = 0;
+      var Cdot = 0;
+      var impulse = 0;
+      var oldImpulse = 0;
+      if (this.m_state == b2Joint.e_atUpperLimit) {
+         v1X = bA.m_linearVelocity.x + ((-bA.m_angularVelocity * r1Y));
+         v1Y = bA.m_linearVelocity.y + (bA.m_angularVelocity * r1X);
+         v2X = bB.m_linearVelocity.x + ((-bB.m_angularVelocity * r2Y));
+         v2Y = bB.m_linearVelocity.y + (bB.m_angularVelocity * r2X);
+         Cdot = (-(this.m_u1.x * v1X + this.m_u1.y * v1Y)) - this.m_ratio * (this.m_u2.x * v2X + this.m_u2.y * v2Y);
+         impulse = this.m_pulleyMass * ((-Cdot));
+         oldImpulse = this.m_impulse;
+         this.m_impulse = b2Math.Max(0.0, this.m_impulse + impulse);
+         impulse = this.m_impulse - oldImpulse;
+         P1X = (-impulse * this.m_u1.x);
+         P1Y = (-impulse * this.m_u1.y);
+         P2X = (-this.m_ratio * impulse * this.m_u2.x);
+         P2Y = (-this.m_ratio * impulse * this.m_u2.y);
+         bA.m_linearVelocity.x += bA.m_invMass * P1X;
+         bA.m_linearVelocity.y += bA.m_invMass * P1Y;
+         bA.m_angularVelocity += bA.m_invI * (r1X * P1Y - r1Y * P1X);
+         bB.m_linearVelocity.x += bB.m_invMass * P2X;
+         bB.m_linearVelocity.y += bB.m_invMass * P2Y;
+         bB.m_angularVelocity += bB.m_invI * (r2X * P2Y - r2Y * P2X);
+      }
+      if (this.m_limitState1 == b2Joint.e_atUpperLimit) {
+         v1X = bA.m_linearVelocity.x + ((-bA.m_angularVelocity * r1Y));
+         v1Y = bA.m_linearVelocity.y + (bA.m_angularVelocity * r1X);
+         Cdot = (-(this.m_u1.x * v1X + this.m_u1.y * v1Y));
+         impulse = (-this.m_limitMass1 * Cdot);
+         oldImpulse = this.m_limitImpulse1;
+         this.m_limitImpulse1 = b2Math.Max(0.0, this.m_limitImpulse1 + impulse);
+         impulse = this.m_limitImpulse1 - oldImpulse;
+         P1X = (-impulse * this.m_u1.x);
+         P1Y = (-impulse * this.m_u1.y);
+         bA.m_linearVelocity.x += bA.m_invMass * P1X;
+         bA.m_linearVelocity.y += bA.m_invMass * P1Y;
+         bA.m_angularVelocity += bA.m_invI * (r1X * P1Y - r1Y * P1X);
+      }
+      if (this.m_limitState2 == b2Joint.e_atUpperLimit) {
+         v2X = bB.m_linearVelocity.x + ((-bB.m_angularVelocity * r2Y));
+         v2Y = bB.m_linearVelocity.y + (bB.m_angularVelocity * r2X);
+         Cdot = (-(this.m_u2.x * v2X + this.m_u2.y * v2Y));
+         impulse = (-this.m_limitMass2 * Cdot);
+         oldImpulse = this.m_limitImpulse2;
+         this.m_limitImpulse2 = b2Math.Max(0.0, this.m_limitImpulse2 + impulse);
+         impulse = this.m_limitImpulse2 - oldImpulse;
+         P2X = (-impulse * this.m_u2.x);
+         P2Y = (-impulse * this.m_u2.y);
+         bB.m_linearVelocity.x += bB.m_invMass * P2X;
+         bB.m_linearVelocity.y += bB.m_invMass * P2Y;
+         bB.m_angularVelocity += bB.m_invI * (r2X * P2Y - r2Y * P2X);
+      }
+   }
+   b2PulleyJoint.prototype.SolvePositionConstraints = function (baumgarte) {
+      if (baumgarte === undefined) baumgarte = 0;
+      var bA = this.m_bodyA;
+      var bB = this.m_bodyB;
+      var tMat;
+      var s1X = this.m_ground.m_xf.position.x + this.m_groundAnchor1.x;
+      var s1Y = this.m_ground.m_xf.position.y + this.m_groundAnchor1.y;
+      var s2X = this.m_ground.m_xf.position.x + this.m_groundAnchor2.x;
+      var s2Y = this.m_ground.m_xf.position.y + this.m_groundAnchor2.y;
+      var r1X = 0;
+      var r1Y = 0;
+      var r2X = 0;
+      var r2Y = 0;
+      var p1X = 0;
+      var p1Y = 0;
+      var p2X = 0;
+      var p2Y = 0;
+      var length1 = 0;
+      var length2 = 0;
+      var C = 0;
+      var impulse = 0;
+      var oldImpulse = 0;
+      var oldLimitPositionImpulse = 0;
+      var tX = 0;
+      var linearError = 0.0;