-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
3 lines (3 loc) · 170 KB
/
index.html
1
2
3
<!DOCTYPE html><html><head><title>Flushed</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"><meta content="yes" name="apple-mobile-web-app-capable"><meta content="default" name="apple-mobile-web-app-status-bar-style"><meta name="theme-color" content="#0099FF"><script>window.WebComponents=window.WebComponents||{},function(e){var t=e.flags||{},n="webcomponents.js",o=document.querySelector('script[src*="'+n+'"]');if(!t.noOpts){if(location.search.slice(1).split("&").forEach(function(e){e=e.split("="),e[0]&&(t[e[0]]=e[1]||!0)}),o)for(var r,i=0;r=o.attributes[i];i++)"src"!==r.name&&(t[r.name]=r.value||!0);if(t.log){var a=t.log.split(",");t.log={},a.forEach(function(e){t.log[e]=!0})}else t.log={}}t.shadow=t.shadow||t.shadowdom||t.polyfill,t.shadow="native"===t.shadow?!1:t.shadow||!HTMLElement.prototype.createShadowRoot,t.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=t.register),e.flags=t}(WebComponents),"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var o=t[this.name];return o&&o[0]===t?o[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){_.push(e),w||(w=!0,h(o))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function o(){w=!1;var e=_;_=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();r(e),n.length&&(e.callback_(n,e),t=!0)}),t&&o()}function r(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var o=v.get(n);if(o)for(var r=0;r<o.length;r++){var i=o[r],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++E}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function d(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function c(e,t){return y=new s(e,t)}function u(e){return L?L:(L=d(y),L.oldValue=e,L)}function l(){y=L=void 0}function m(e){return e===L||e===y}function f(e,t){return e===t?e:L&&m(e)?L:null}function p(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var h,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))h=setTimeout;else if(window.setImmediate)h=window.setImmediate;else{var g=[],b=String(Math.random());window.addEventListener("message",function(e){if(e.data===b){var t=g;g=[],t.forEach(function(e){e()})}}),h=function(e){g.push(e),window.postMessage(b,"*")}}var w=!1,_=[],E=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var o=v.get(e);o||v.set(e,o=[]);for(var r,i=0;i<o.length;i++)if(o[i].observer===this){r=o[i],r.removeListeners(),r.options=t;break}r||(r=new p(this,e,t),o.push(r),this.nodes_.push(e)),r.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var o=t[n];if(o.observer===this){o.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var y,L;p.prototype={enqueue:function(e){var n=this.observer.records_,o=n.length;if(n.length>0){var r=n[o-1],i=f(r,e);if(i)return void(n[o-1]=i)}else t(this.observer);n[o]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,o=e.target,r=new c("attributes",o);r.attributeName=t,r.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(o,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?u(a):r});break;case"DOMCharacterDataModified":var o=e.target,r=c("characterData",o),a=e.prevValue;i(o,function(e){return e.characterData?e.characterDataOldValue?u(a):r:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,d,o=e.relatedNode,m=e.target;"DOMNodeInserted"===e.type?(s=[m],d=[]):(s=[],d=[m]);var f=m.previousSibling,p=m.nextSibling,r=c("childList",o);r.addedNodes=s,r.removedNodes=d,r.previousSibling=f,r.nextSibling=p,i(o,function(e){return e.childList?r:void 0})}l()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||p,o(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===g}function o(e,t){if(n(t))e&&e();else{var r=function(){("complete"===t.readyState||t.readyState===g)&&(t.removeEventListener(b,r),o(e,t))};t.addEventListener(b,r)}}function r(e){e.target.__loaded=!0}function i(e,t){function n(){s==d&&e&&e()}function o(e){r(e),s++,n()}var i=t.querySelectorAll("link[rel=import]"),s=0,d=i.length;if(d)for(var c,u=0;d>u&&(c=i[u]);u++)a(c)?o.call(c,{target:c}):(c.addEventListener("load",o),c.addEventListener("error",o));else n()}function a(e){return l?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)d(t)&&c(t)}function d(e){return"link"===e.localName&&"import"===e.rel}function c(e){var t=e["import"];t?r({target:e}):(e.addEventListener("load",r),e.addEventListener("error",r))}var u="import",l=Boolean(u in document.createElement("link")),m=Boolean(window.ShadowDOMPolyfill),f=function(e){return m?ShadowDOMPolyfill.wrapIfNeeded(e):e},p=f(document),h={get:function(){var e=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return f(e)},configurable:!0};Object.defineProperty(document,"_currentScript",h),Object.defineProperty(p,"_currentScript",h);var v=/Trident|Edge/.test(navigator.userAgent),g=v?"complete":"interactive",b="readystatechange";l&&(new MutationObserver(function(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,o=t.length;o>n&&(e=t[n]);n++)c(e)}()),t(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime();var e=p.createEvent("CustomEvent");e.initCustomEvent("HTMLImportsLoaded",!0,!0,{}),p.dispatchEvent(e)}),e.IMPORT_LINK_TYPE=u,e.useNative=l,e.rootDocument=p,e.whenReady=t,e.isIE=v}(HTMLImports),function(e){var t=[],n=function(e){t.push(e)},o=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=o}(HTMLImports),HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,o={resolveUrlsInStyle:function(e){var t=e.ownerDocument,n=t.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,n),e},resolveUrlsInCssText:function(e,o){var r=this.replaceUrls(e,o,t);return r=this.replaceUrls(r,o,n)},replaceUrls:function(e,t,n){return e.replace(n,function(e,n,o,r){var i=o.replace(/["']/g,"");return t.href=i,i=t.href,n+"'"+i+"'"+r})}};e.path=o}),HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,o,r){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(){if(4===i.readyState){var e=i.getResponseHeader("Location"),n=null;if(e)var n="/"===e.substr(0,1)?location.origin+e:e;o.call(r,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,o=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};o.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,o){if(n.load&&console.log("fetch",e,o),e)if(e.match(/^data:/)){var r=e.split(","),i=r[0],a=r[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,o,null,a)}.bind(this),0)}else{var s=function(t,n,r){this.receive(e,o,t,n,r)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,o,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,o,r){this.cache[e]=o;for(var i,a=this.pending[e],s=0,d=a.length;d>s&&(i=a[s]);s++)this.onload(e,i,o,n,r),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=o}),HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=o(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function o(e){return e.textContent+r(e)}function r(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,o=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+o+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,d=e.flags,c=e.isIE,u=e.IMPORT_LINK_TYPE,l="link[rel="+u+"]",m={documentSelectors:l,importsSelectors:[l,"link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(d.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){d.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,d.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.dispatchEvent(e.__resource&&!e.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,o=function(o){t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",o),e.addEventListener("error",o),c&&"style"===e.localName){var r=!1;if(-1==e.textContent.indexOf("@import"))r=!0;else if(e.sheet){r=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,d=0;s>d&&(i=a[d]);d++)i.type===CSSRule.IMPORT_RULE&&(r=r&&Boolean(i.styleSheet))}r&&e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(t){var o=document.createElement("script");o.__importElement=t,o.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(o,function(){o.parentNode.removeChild(o),e.currentScript=null}),this.addElementToDocument(o)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var o,r=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=r.length;a>i&&(o=r[i]);i++)if(!this.isParsed(o))return this.hasResource(o)?t(o)?this.nextToParseInDoc(o["import"],o):o:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return t(e)&&void 0===e["import"]?!1:!0}};e.parser=m,e.IMPORT_SELECTOR=l}),HTMLImports.addModule(function(e){function t(e){return n(e,i)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function o(e,t){var n=document.implementation.createHTMLDocument(i);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||Object.defineProperty(n,"baseURI",{value:t});var r=n.createElement("meta");return r.setAttribute("charset","utf-8"),n.head.appendChild(r),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var r=e.flags,i=e.IMPORT_LINK_TYPE,a=e.IMPORT_SELECTOR,s=e.rootDocument,d=e.Loader,c=e.Observer,u=e.parser,l={documents:{},documentPreloadSelectors:a,importsPreloadSelectors:[a].join(","),loadNode:function(e){m.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);m.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,i,a,s){if(r.load&&console.log("loaded",e,n),n.__resource=i,n.__error=a,t(n)){var d=this.documents[e];void 0===d&&(d=a?null:o(i,s||e),d&&(d.__importLink=n,this.bootDocument(d)),this.documents[e]=d),n["import"]=d}u.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),u.parseNext()},loadedAll:function(){u.parseNext()}},m=new d(l.loaded.bind(l),l.loadedAll.bind(l));if(l.observer=new c,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(s,"baseURI",f)}e.importer=l,e.importLoader=m}),HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,o={added:function(e){for(var o,r,i,a,s=0,d=e.length;d>s&&(a=e[s]);s++)o||(o=a.ownerDocument,r=t.isParsed(o)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&r&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&r.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&r.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=o.added.bind(o);var r=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){HTMLImports.importer.bootDocument(r)}var n=e.initializeModules,o=e.isIE;if(!e.useNative){o&&"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],o=function(e){n.push(e)},r=function(){n.forEach(function(t){t(e)})};e.addModule=o,e.initializeModules=r,e.hasNative=Boolean(document.registerElement),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative)}(CustomElements),CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void o(e,t)}),o(e,t)}function n(e,t,o){var r=e.firstElementChild;if(!r)for(r=e.firstChild;r&&r.nodeType!==Node.ELEMENT_NODE;)r=r.nextSibling;for(;r;)t(r,o)!==!0&&n(r,t,o),r=r.nextElementSibling;return null}function o(e,n){for(var o=e.shadowRoot;o;)t(o,n),o=o.olderShadowRoot}function r(e,t){a=[],i(e,t),a=null}function i(e,t){if(e=wrap(e),!(a.indexOf(e)>=0)){a.push(e);for(var n,o=e.querySelectorAll("link[rel="+s+"]"),r=0,d=o.length;d>r&&(n=o[r]);r++)n["import"]&&i(n["import"],t);t(e)}}var a,s=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=r,e.forSubtree=t}),CustomElements.addModule(function(e){function t(e){return n(e)||o(e)}function n(t){return e.upgrade(t)?!0:void s(t)}function o(e){_(e,function(e){return n(e)?!0:void 0})}function r(e){s(e),m(e)&&_(e,function(e){s(e)})}function i(e){M.push(e),L||(L=!0,setTimeout(a))}function a(){L=!1;for(var e,t=M,n=0,o=t.length;o>n&&(e=t[n]);n++)e();M=[]}function s(e){y?i(function(){d(e)}):d(e)}function d(e){e.__upgraded__&&(e.attachedCallback||e.detachedCallback)&&!e.__attached&&m(e)&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){u(e),_(e,function(e){u(e)})}function u(e){y?i(function(){l(e)}):l(e)}function l(e){e.__upgraded__&&(e.attachedCallback||e.detachedCallback)&&e.__attached&&!m(e)&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function m(e){for(var t=e,n=wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.host}}function f(e){if(e.shadowRoot&&!e.shadowRoot.__watched){w.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)v(t),t=t.olderShadowRoot}}function p(e){if(w.dom){var n=e[0];if(n&&"childList"===n.type&&n.addedNodes&&n.addedNodes){for(var o=n.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var r=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";r=r.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",e.length,r||"")}e.forEach(function(e){"childList"===e.type&&(T(e.addedNodes,function(e){e.localName&&t(e)}),T(e.removedNodes,function(e){e.localName&&c(e)}))}),w.dom&&console.groupEnd()}function h(e){for(e=wrap(e),e||(e=wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(p(t.takeRecords()),a())}function v(e){if(!e.__observer){var t=new MutationObserver(p);t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function g(e){e=wrap(e),w.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop()),t(e),v(e),w.dom&&console.groupEnd()}function b(e){E(e,g)}var w=e.flags,_=e.forSubtree,E=e.forDocumentTree,y=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;e.hasPolyfillMutations=y;var L=!1,M=[],T=Array.prototype.forEach.call.bind(Array.prototype.forEach),N=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var e=N.call(this);return CustomElements.watchShadow(this),e},e.watchShadow=f,e.upgradeDocumentTree=b,e.upgradeSubtree=o,e.upgradeAll=t,e.attachedNode=r,e.takeRecords=h}),CustomElements.addModule(function(e){function t(t){if(!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),r=e.getRegisteredDefinition(o||t.localName);if(r){if(o&&r.tag==t.localName)return n(t,r);if(!o&&!r["extends"])return n(t,r)}}}function n(t,n){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),o(t,n),t.__upgraded__=!0,i(t),e.attachedNode(t),e.upgradeSubtree(t),a.upgrade&&console.groupEnd(),t}function o(e,t){Object.__proto__?e.__proto__=t.prototype:(r(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function r(e,t,n){for(var o={},r=t;r!==n&&r!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(r),s=0;i=a[s];s++)o[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i)),o[i]=1);r=Object.getPrototypeOf(r)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=o}),CustomElements.addModule(function(e){function t(t,o){var d=o||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(r(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(c(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return d.prototype||(d.prototype=Object.create(HTMLElement.prototype)),d.__name=t.toLowerCase(),d.lifecycle=d.lifecycle||{},d.ancestry=i(d["extends"]),a(d),s(d),n(d.prototype),u(d.__name,d),d.ctor=l(d),d.ctor.prototype=d.prototype,d.prototype.constructor=d.ctor,e.ready&&v(document),d.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){o.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){o.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function o(e,t,n){e=e.toLowerCase();var o=this.getAttribute(e);n.apply(this,arguments);var r=this.getAttribute(e);this.attributeChangedCallback&&r!==o&&this.attributeChangedCallback(e,o,r)}function r(e){for(var t=0;t<E.length;t++)if(e===E[t])return!0}function i(e){var t=c(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],o=0;t=e.ancestry[o];o++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag),o=Object.getPrototypeOf(n);o===e.prototype&&(t=o)}for(var r,i=e.prototype;i&&i!==t;)r=Object.getPrototypeOf(i),i.__proto__=r,i=r;e["native"]=t}}function d(e){return b(M(e.tag),e)}function c(e){return e?y[e.toLowerCase()]:void 0}function u(e,t){y[e]=t}function l(e){return function(){return d(e)}}function m(e,t,n){return e===L?f(t,n):T(e,t)}function f(e,t){var n=c(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var o;return t?(o=f(e),o.setAttribute("is",t),o):(o=M(e),e.indexOf("-")>=0&&w(o,HTMLElement),o)}function p(e){var t=N.call(this,e);return g(t),t}var h,v=e.upgradeDocumentTree,g=e.upgrade,b=e.upgradeWithDefinition,w=e.implementPrototype,_=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],y={},L="http://www.w3.org/1999/xhtml",M=document.createElement.bind(document),T=document.createElementNS.bind(document),N=Node.prototype.cloneNode;h=Object.__proto__||_?function(e,t){return e instanceof t}:function(e,t){for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},document.registerElement=t,document.createElement=f,document.createElementNS=m,Node.prototype.cloneNode=p,e.registry=y,e["instanceof"]=h,e.reservedTagList=E,e.getRegisteredDefinition=c,document.register=document.registerElement}),function(e){function t(){a(wrap(document)),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(e){a(wrap(e["import"]))}),CustomElements.ready=!0,setTimeout(function(){CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})}var n=e.useNative,o=e.initializeModules,r=/Trident/.test(navigator.userAgent);if(n){var i=function(){};e.watchShadow=i,e.upgrade=i,e.upgradeAll=i,e.upgradeDocumentTree=i,e.upgradeSubtree=i,e.takeRecords=i,e["instanceof"]=function(e,t){return e instanceof t}}else o();var a=e.upgradeDocumentTree;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),r&&"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),"undefined"==typeof HTMLTemplateElement&&!function(){var e="template";HTMLTemplateElement=function(){},HTMLTemplateElement.prototype=Object.create(HTMLElement.prototype),HTMLTemplateElement.decorate=function(e){if(!e.content){e.content=e.ownerDocument.createDocumentFragment();for(var t;t=e.firstChild;)e.content.appendChild(t)}},HTMLTemplateElement.bootstrap=function(t){for(var n,o=t.querySelectorAll(e),r=0,i=o.length;i>r&&(n=o[r]);r++)HTMLTemplateElement.decorate(n)},addEventListener("DOMContentLoaded",function(){HTMLTemplateElement.bootstrap(document)})}(),function(){var e=document.createElement("style");e.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var t=document.querySelector("head");t.insertBefore(e,t.firstChild)}(window.WebComponents);</script><script>(function(scope){function withDependencies(task,depends){depends=depends||[];if(!depends.map){depends=[depends]}return task.apply(this,depends.map(marshal))}function module(name,dependsOrFactory,moduleFactory){var module=null;switch(arguments.length){case 0:return;case 2:module=dependsOrFactory.apply(this);break;default:module=withDependencies(moduleFactory,dependsOrFactory);break}modules[name]=module}function marshal(name){return modules[name]}var modules={};var using=function(depends,task){withDependencies(task,depends)};scope.marshal=marshal;scope.modulate=module;scope.using=using})(this);</script><script>Object.defineProperty(window,"currentImport",{enumerable:true,configurable:true,get:function(){return(document._currentScript||document.currentScript).ownerDocument}});</script><script>modulate("Base",function(){var Base={telemetry:{count:0},addFeature:function(feature,shouldPrepend){this.extend(this,feature)},registerCallback:function(){this.registerFeatures();this.registered()},registered:function(){},createdCallback:function(){Base.telemetry.count++;this.root=this;this.beforeCreated();this.created();this.afterCreated();this.initFeatures()},beforeCreated:function(){},created:function(){},afterCreated:function(){},attachedCallback:function(){this.isAttached=true;this.attached()},attached:function(){},detachedCallback:function(){this.isAttached=false;this.detached()},detached:function(){},attributeChangedCallback:function(name){this.setAttributeToProperty(name);this.attributeChanged.apply(this,arguments)},attributeChanged:function(){},extend:function(prototype,api){if(prototype&&api){Object.getOwnPropertyNames(api).forEach(function(n){var pd=Object.getOwnPropertyDescriptor(api,n);if(pd){Object.defineProperty(prototype,n,pd)}})}return prototype||api}};return Base});</script><script>modulate("Polymer",["Base"],function(Base){Base.__proto__=HTMLElement.prototype;var Polymer=function(prototype){var elementClass=desugar(prototype);var options={prototype:prototype};if(prototype.extends){options.extends=prototype.extends}document.registerElement(prototype.is,options);return elementClass};var desugar=function(prototype){prototype.__proto__=Base;prototype.registerCallback();return prototype.constructor};window.Polymer=Polymer;Polymer.Class=desugar;return Polymer});</script><script>using("Base",function(Base){Base.addFeature({_prepMixins:function(){if(this.mixins){var host=this;this.mixins.forEach(function(m){if(typeof m==="string"){using(m,function(m){Base.extend(host,m)})}else{Base.extend(host,m)}})}}})});</script><script>using("Base",function(Base){Base.addFeature({_prepExtends:function(){if(this.extends){this.__proto__=this.getExtendedPrototype(this.extends)}},getExtendedPrototype:function(tag){return this.getExtendedNativePrototype(tag)},nativePrototypes:{},getExtendedNativePrototype:function(tag){var p=this.nativePrototypes[tag];if(!p){var np=this.getNativePrototype(tag);p=this.extend(Object.create(np),Base);this.nativePrototypes[tag]=p}return p},getNativePrototype:function(tag){return Object.getPrototypeOf(document.createElement(tag))}})});</script><script>using("Base",function(Base){Base.addFeature({_prepConstructor:function(){if(!this.hasOwnProperty("constructor")){var ctor;if(this.extends){ctor=function(){return document.createElement(this.extends,this.is)}}else{ctor=function(){return document.createElement(this.is)}}Object.defineProperty(this,"constructor",{value:ctor,writable:true,configurable:true});ctor.prototype=this}else{ctor=this.constructor}if(this.hasOwnProperty("extends")){ctor.extends=this.extends}}})});</script><script>using("Base",function(Base){Base.addFeature({published:{},nob:Object.create(null),getPublishInfo:function(property){var p=this.published[property];if(typeof p==="function"){p=this.published[property]={type:p}}return p||Base.nob},getPublishedPropertyType:function(property){return this.getPublishInfo(property).type},isReadOnlyProperty:function(property){return this.getPublishInfo(property).readOnly},isNotifyProperty:function(property){return this.getPublishInfo(property).notify},isReflectedProperty:function(property){return this.getPublishInfo(property).reflect}})});</script><script>using("Base",function(Base){Base.addFeature({_marshalAttributes:function(){this._takeAttributes();this._installHostAttributes(this.hostAttributes)},_installHostAttributes:function(attributes){if(attributes){this.cloneAttributes(this,attributes)}},cloneAttributes:function(node,attr$){attr$.split(" ").forEach(function(a){node.setAttribute(a,"")})},_takeAttributes:function(){this._takeAttributesToModel(this)},_takeAttributesToModel:function(model){for(var name in this.published){var type=this.getPublishedPropertyType(name);if(type===Boolean||this.hasAttribute(name)){this.setAttributeToProperty(model,name,type)}}},setAttributeToProperty:function(model,name,type){type=type||this.getPublishedPropertyType(name);if(type){model[name]=this.deserialize(name,this.getAttribute(name),type)}},deserialize:function(name,value,type){var hasAttribute=this.hasAttribute(name);if(!hasAttribute&&type!=Boolean&&this[name]==null){return}switch(type){case Number:value=Number(value);break;case Boolean:value=hasAttribute;break;case Object:case Array:try{value=JSON.parse(value)}catch(x){value="[invalid JSON]"}break;case Date:value=new Date(value);break;case String:default:break}return value},serialize:function(value){switch(typeof value){case"boolean":return value?"":undefined;case"object":if(value instanceof Date){return value}else if(value){try{return JSON.stringify(value)}catch(x){return""}}default:return value!=null?value:undefined}},reflectPropertyToAttribute:function(name){this.serializeValueToAttribute(this[name],name)},serializeValueToAttribute:function(value,attribute,node){node=node||this;value=this.serialize(value);attribute=this.camelToDashCase(attribute);if(value!==undefined){node.setAttribute(attribute,value)}else{node.removeAttribute(attribute)}},camelToDashCase:function(camel){return camel.replace(/([a-z][A-Z])/g,function(g){return g[0]+"-"+g[1].toLowerCase()})}})});</script><script>using("Base",function(Base){Base.addFeature({registerFeatures:function(){this._prepMixins();this._prepExtends();this._prepConstructor()},initFeatures:function(){this._marshalAttributes()}})});</script><script>(function(){var modules={};var DomModule=function(){return document.createElement("dom-module")};DomModule.prototype={constructor:DomModule,createdCallback:function(){if(this.id||this.name){modules[this.id||this.name]=this}},"import":function(id,slctr){var m=modules[id];if(m&&slctr){m=m.querySelector(slctr)}return m},__proto__:HTMLElement.prototype};var cePolyfill=window.CustomElements&&!CustomElements.useNative;if(cePolyfill){var ready=CustomElements.ready;CustomElements.ready=true}document.registerElement("dom-module",DomModule);if(cePolyfill){CustomElements.ready=ready}})();</script><script>using("Base",function(Base){var domModule=document.createElement("dom-module");Base.addFeature({_prepTemplate:function(){this._template=this._template||domModule.import(this.is,"template");if(!this._template){var script=document._currentScript||document.currentScript;var prev=script&&script.previousElementSibling;if(prev&&prev.localName==="template"){this._template=prev}}},_stampTemplate:function(){if(this._template){this.root=this.instanceTemplate(this._template)}},instanceTemplate:function(template){var dom=document.importNode(template._content||template.content,true);if(window.CustomElements&&CustomElements.upgradeSubtree){CustomElements.upgradeSubtree(dom)}return dom}})});</script><script>using("Base",function(Base){var hostStack=[];Base.addFeature({configure:function(){},ready:function(){},queryHost:function(){return this.host},_pushHost:function(){this.host=hostStack[hostStack.length-1];if(this.host){this.host._clients.push(this)}if(!this._clients){this._clients=[]}hostStack.push(this)},_popHost:function(){hostStack.pop()},_readyContent:function(){if(this._canReady()){this._initializeContent()}},_canReady:function(){return!this._readied&&(!this.host||this.host._readied)},_initializeContent:function(){this._setupRoot();this._prepareContent();this._configure();var c$=this._getDistributionClients();for(var i=0,l=c$.length,c;i<l&&(c=c$[i]);i++){c._initializeContent()}this._composeContent();this._ready()},_configure:function(){this.configure()},_ready:function(){this._readied=true;this._beforeReady();this.ready()},_beforeReady:function(){}})});</script><script>using("Base",function(Base){Base.addFeature({_prepContent:function(){this._useContent=this._useContent||Boolean(this._template)},_poolContent:function(){if(this._useContent){saveLightChildrenIfNeeded(this)}},_setupRoot:function(){if(this._useContent){this._createLocalRoot()}else{this.localDom=new Base.DomRoot(nullFragment,this);this.localDom.emptyRoot=true}this.lightDom=new Base.DomRoot(this,this)},_createLocalRoot:function(){this.shadyRoot=this.root;this.shadyRoot.host=this;this.localDom=new Base.DomRoot(this.shadyRoot,this);this.root=this},_distributeContent:function(){this._prepareContent();var c$=this._getDistributionClients();for(var i=0,l=c$.length,c;i<l&&(c=c$[i]);i++){c._distributeContent()}this._composeContent()},_prepareContent:function(){if(this._useContent){this._resetDistribution(this.shadyRoot);this._distributePool(this.shadyRoot,this._collectPool())}},_composeContent:function(){if(this._useContent){this._composeTree(this)}else if(this.root!==this){this.appendChild(this.root);this.root=this}},elementMatches:function(selector,node){if(node===undefined){node=this}return matchesSelector.call(node,selector)},_resetDistribution:function(node){var children=getLightChildren(node);for(var i=0;i<children.length;i++){var child=children[i];if(isInsertionPoint(child)){child._distributedNodes=[]}else if(child._destinationInsertionPoints){child._destinationInsertionPoints=undefined}this._resetDistribution(child)}},_collectPool:function(){var pool=[];var children=getLightChildren(this);for(var i=0;i<children.length;i++){var child=children[i];if(isInsertionPoint(child)){pool.push.apply(pool,child._distributedNodes)}else{pool.push(child)}}return pool},_distributePool:function(node,pool){if(isInsertionPoint(node)){var content=node;var anyDistributed=false;for(var i=0;i<pool.length;i++){var node=pool[i];if(!node){continue}if(this._matchesContentSelect(node,content)){distributeNodeInto(node,content);pool[i]=undefined;anyDistributed=true}}if(!anyDistributed){var children=getLightChildren(content);for(var i=0;i<children.length;i++){distributeNodeInto(children[i],content)}}return}var children=getLightChildren(node);for(var i=0;i<children.length;i++){this._distributePool(children[i],pool)}},_getDistributionClients:function(){return this._clients?this._clients:this.localDom._query(function(n){return Boolean(n._distributeContent)})},_composeTree:function(node){var children=this._composeNode(node);for(var i=0;i<children.length;i++){var child=children[i];if(!child._useContent){this._composeTree(child)}}this._updateChildNodes(node,children)},_composeNode:function(node){var children=[];var c$=getLightChildren(node.shadyRoot||node);for(var i=0;i<c$.length;i++){var child=c$[i];if(isInsertionPoint(child)){var distributedNodes=child._distributedNodes;for(var j=0;j<distributedNodes.length;j++){var distributedNode=distributedNodes[j];if(isFinalDestination(child,distributedNode)){children.push(distributedNode)}}}else{children.push(child)}}return children},_updateChildNodes:function(node,children){for(var i=0,l=children.length,c,b;i<l&&(c=children[i]);i++){b=children[i-1]||null;if(c.parentNode!=node||c.previousSibling!=b){insertBefore(node,c,b&&b.nextSibling)}}var last=children[children.length-1];var lastChild=node.lastChild;while(lastChild&&lastChild!=last){node.removeChild(lastChild);lastChild=node.lastChild}var first=children[0];var firstChild=node.firstChild;while(firstChild&&firstChild!=first){node.removeChild(firstChild);firstChild=node.firstChild}},_matchesContentSelect:function(node,contentElement){var select=contentElement.getAttribute("select");if(!select){return true}select=select.trim();if(!select){return true}if(!(node instanceof Element)){return false}var validSelectors=/^(:not\()?[*.#[a-zA-Z_|]/;if(!validSelectors.test(select)){return false}return this.elementMatches(select,node)},querySelectorAllComposed:function(selector,node){node=node||this;var list=node.querySelectorAll(selector);return list}});function distributeNodeInto(child,insertionPoint){insertionPoint._distributedNodes.push(child);var points=child._destinationInsertionPoints;if(!points){child._destinationInsertionPoints=[insertionPoint]}else if(points.indexOf(insertionPoint)<0){points.push(insertionPoint)}}function isFinalDestination(insertionPoint,node){var points=node._destinationInsertionPoints;return points&&points[points.length-1]===insertionPoint}function isInsertionPoint(node){return node.localName=="content"}function getLightChildren(node){var children=node.lightChildren;return children?children:node.childNodes}function insertBefore(parentNode,newChild,refChild){remove(newChild);saveLightChildrenIfNeeded(parentNode);parentNode.insertBefore(newChild,refChild)}function remove(node){var parentNode=node.parentNode;if(!parentNode)return;saveLightChildrenIfNeeded(parentNode);parentNode.removeChild(node)}function saveLightChildrenIfNeeded(node){if(!node.lightChildren){var children=[];for(var child=node.firstChild;child;child=child.nextSibling){children.push(child);child.lightParent=child.lightParent||node}node.lightChildren=children}}var p=Element.prototype;var matchesSelector=p.matches||p.matchesSelector||p.mozMatchesSelector||p.msMatchesSelector||p.oMatchesSelector||p.webkitMatchesSelector;Base.DomRoot=function(node,host){this.node=node;this.host=host||Base};Base.DomRoot.prototype={domRoot:true,children:function(node){node=node||this.node||this.host;return getLightChildren(node)},elementParent:function(node){node=node||this.node;return node.lightParent||node.parentNode},batch:function(batch_fn){this._batching=true;if(batch_fn){batch_fn.call(this.host);this.distribute()}},distribute:function(){this._batching=false;this.host._distributeContent()},_maybeDistribute:function(){if(!this._batching){this.host._distributeContent()}},appendChild:function(node,container){container=container||this.node;if(this.host._useContent){saveLightChildrenIfNeeded(container);var children=this.children(container);if(node.nodeType===Node.DOCUMENT_FRAGMENT_NODE){var n=node.firstChild;while(n){children.push(n);n.lightParent=container;n=n.nextSibling}}else{children.push(node);node.lightParent=container}this._maybeDistribute()}else{container.appendChild(node)}},insertBefore:function(node,ref_node,container){container=container||this.node;if(ref_node){if(this.host._useContent){var children=this.children(container);saveLightChildrenIfNeeded(container);var index=children.indexOf(ref_node);if(index<0){throw Error("The ref_node to be inserted before is not a child "+"of this node")}if(node.nodeType===Node.DOCUMENT_FRAGMENT_NODE){var n=node.lastChild;while(n){children.splice(index,0,n);n.lightParent=container;n=n.previousSibling}}else{children.splice(index,0,node);node.lightParent=container}this._maybeDistribute()}else{container.insertBefore(node,ref_node)}}else{this.appendChild(node,container)}},removeChild:function(node,container){container=container||this.node;if(this.host._useContent){var children=this.children(container);var index=children.indexOf(node);if(index<0||container!==node.lightParent){throw Error("The node to be removed is not a child of this node")}children.splice(index,1);node.lightParent=null;this._maybeDistribute()}else{this.node.removeChild(node)}},querySelector:function(selector,node){return this.querySelectorAll(selector,node)[0]},querySelectorAll:function(selector,node){var self=this;return this._query(function(n){return self.host.elementMatches(selector,n)},node)},_query:function(matcher,node){var list=[];this._queryElements(this.children(node),matcher,list);return list},_queryElements:function(elements,matcher,list){for(var i=0,l=elements.length,c;i<l&&(c=elements[i]);i++){if(c.nodeType===Node.ELEMENT_NODE){this._queryElement(c,matcher,list)}}},_queryElement:function(node,matcher,list){if(matcher(node)){list.push(node)}this._queryElements(this.children(node),matcher,list)},destinationInsertionPoints:function(node){return node._destinationInsertionPoints},distributedNodes:function(content){return content._distributedNodes}};var nullFragment=document.createDocumentFragment();Polymer.dom=new Base.DomRoot(document.body)});</script><script>using("Base",function(Base){Base.addFeature({registerFeatures:function(){this._prepMixins();this._prepExtends();this._prepConstructor();this._prepTemplate();this._prepContent()},initFeatures:function(){this._poolContent();this._pushHost();this._stampTemplate();this._popHost();this._marshalAttributes();this._readyContent()}})});</script><script>modulate("Annotations",function(){var nar=[];var Annotations={parseAnnotations:function(template){var list=[];var content=template._content||template.content;this._parseNodeAnnotations(content,list);return list},_parseNodeAnnotations:function(node,list){return node.nodeType===Node.TEXT_NODE?this._parseTextNodeAnnotation(node,list):this._parseElementAnnotations(node,list)},_parseTextNodeAnnotation:function(node,list){var v=node.textContent,escape=v.slice(0,2);if(escape==="{{"||escape==="[["){node.textContent=" ";var annote={bindings:[{kind:"text",mode:escape[0],value:v.slice(2,-2)}]};list.push(annote);return annote}},_parseElementAnnotations:function(element,list){var annote={bindings:[],events:[]};this._parseChildNodesAnnotations(element,annote,list);if(element.attributes){this._parseNodeAttributeAnnotations(element,annote,list)}if(annote.bindings.length||annote.events.length||annote.id){list.push(annote)}return annote},_parseChildNodesAnnotations:function(root,annote,list){if(root.firstChild){for(var i=0,node=root.firstChild;node;node=node.nextSibling,i++){if(node.localName==="template"){var content=document.createDocumentFragment();content.appendChild(node.content);list.push({bindings:nar,events:nar,templateContent:content,parent:annote,index:i})}var childAnnotation=this._parseNodeAnnotations(node,list);if(childAnnotation){childAnnotation.parent=annote;childAnnotation.index=i}}}},_parseNodeAttributeAnnotations:function(node,annotation){for(var i=0,a;a=node.attributes[i];i++){var n=a.name,v=a.value;if(n==="id"){annotation.id=v}else if(n.slice(0,3)==="on-"){i--;node.removeAttribute(n);annotation.events.push({name:n.slice(3),value:v})}else{var b=this._parseNodeAttributeAnnotation(node,n,v);if(b){i--;annotation.bindings.push(b)}}}},_parseNodeAttributeAnnotation:function(node,n,v){var mode="",escape=v.slice(0,2),name=n;if(escape==="{{"||escape==="[["){mode=escape[0];v=v.slice(2,-2);var not=false;if(v[0]=="!"){v=v.substring(1);not=true}var kind="property";if(n[n.length-1]=="$"){name=n.slice(0,-1);kind="attribute"}node.removeAttribute(n);if(kind==="property"){name=Annotations.dashToCamelCase(name)}return{kind:kind,mode:mode,name:name,value:v,negate:not}}},dashToCamelCase:function(dash){if(dash.indexOf("-")<0){return dash}return dash.replace(/-([a-z])/g,function(m){return m[1].toUpperCase()})},camelToDashCase:function(camel){return camel.replace(/([a-z][A-Z])/g,function(g){return g[0]+"-"+g[1].toLowerCase()})},_localSubTree:function(node,host){return node===host?node.childNodes:node.lightChildren||node.childNodes},findAnnotatedNode:function(root,annote){var parent=annote.parent&&Annotations.findAnnotatedNode(root,annote.parent);return!parent?root:Annotations._localSubTree(parent,root)[annote.index]}};return Annotations});</script><script>using(["Base","Annotations"],function(Base,Annotations){Base.addFeature({_prepAnnotations:function(){this._annotes=!this._template?[]:Annotations.parseAnnotations(this._template)},findAnnotatedNode:Annotations.findAnnotatedNode,_marshalAnnotationReferences:function(){if(this._template){this._marshalTemplateContent();this._marshalIdNodes();this._marshalAnnotatedNodes();this._marshalAnnotatedListeners()}},_marshalTemplateContent:function(){this._annotes.forEach(function(note){if(note.templateContent){var template=this.findAnnotatedNode(this.root,note);template._content=note.templateContent}},this)},_marshalIdNodes:function(){this.$={};this._annotes.forEach(function(a){if(a.id){this.$[a.id]=Annotations.findAnnotatedNode(this.root,a)}},this)},_marshalAnnotatedNodes:function(){if(this._nodes){this._nodes=this._nodes.map(function(a){return Annotations.findAnnotatedNode(this.root,a)},this)}},_marshalAnnotatedListeners:function(){this._annotes.forEach(function(a){if(a.events&&a.events.length){var node=Annotations.findAnnotatedNode(this.root,a);a.events.forEach(function(e){this.listen(node,e.name,e.value)},this)}},this)}})});</script><script>using("Base",function(Base){Base.addFeature({listeners:{},_marshalListeners:function(){this._listenListeners(this.listeners);this._listenKeyPresses(this.keyPresses)},_listenListeners:function(listeners){var node,name,key;for(key in listeners){if(key.indexOf(".")<0){node=this;name=key}else{name=key.split(".");node=this.$[name[0]];name=name[1]}this.listen(node,name,listeners[key])}},listen:function(node,eventName,methodName){var host=this;node.addEventListener(eventName,function(e){if(host[methodName]){host[methodName](e,e.detail)}else{console.warn("[%s].[%s]: event handler [%s] is null in scope (%o)",node.localName,eventName,methodName,host)}})},keyPresses:{},_listenKeyPresses:function(keyPresses){for(var n in keyPresses){this.addEventListener("keydown",this._keyPressesFeatureHandler);for(n in keyPresses){if(typeof n==="string"){keyPresses[this.eventKeyCodes[n]]=keyPresses[n]}}break}},_keyPressesFeatureHandler:function(e){var method=this.keyPresses[e.keyCode];if(method&&this[method]){return this[method](e.keyCode,e)}},eventKeyCodes:{ESC_KEY:27,ENTER_KEY:13,LEFT:37,UP:38,RIGHT:39,DOWN:40}})});</script><script>modulate("Async",function(){var currVal=0;var lastVal=0;var callbacks=[];var twiddle=document.createTextNode("");function runAsync(callback,waitTime){if(waitTime>0){return~setTimeout(callback,waitTime)}else{twiddle.textContent=currVal++;callbacks.push(callback);return currVal-1}}function cancelAsync(handle){if(handle<0){clearTimeout(~handle)}else{callbacks[handle-lastVal]=null}}function atEndOfMicrotask(){while(callbacks.length){var cb=callbacks.shift();if(cb){cb()}lastVal++}}new(window.MutationObserver||JsMutationObserver)(atEndOfMicrotask).observe(twiddle,{characterData:true});return{run:runAsync,cancel:cancelAsync}});</script><script>modulate("Debounce","Async",function(Async){var Debouncer=function(context){this.context=context;this.boundComplete=this.complete.bind(this)};Debouncer.prototype={go:function(callback,wait){var h;this.finish=function(){Async.cancel(h)};h=Async.run(this.boundComplete,wait);this.callback=callback},stop:function(){if(this.finish){this.finish();this.finish=null}},complete:function(){if(this.finish){this.stop();this.callback.call(this.context)}}};function debounce(debouncer,callback,wait){if(debouncer){debouncer.stop()}else{debouncer=new Debouncer(this)}debouncer.go(callback,wait);return debouncer}return debounce});</script><script>using(["Base","Async","Debounce"],function(Base,Async,Debounce){Base.addFeature({$$:function(slctr){return this.root.querySelector(slctr)},toggleClass:function(name,bool,node){node=node||this;if(arguments.length==1){bool=!node.classList.contains(name)}if(bool){node.classList.add(name)}else{node.classList.remove(name)}},toggleAttribute:function(name,bool,node){(node||this)[bool?"setAttribute":"removeAttribute"](name,"")},classFollows:function(className,neo,old){if(old){old.classList.remove(className)}if(neo){neo.classList.add(className)}},attributeFollows:function(name,neo,old){if(old){old.removeAttribute(name)}if(neo){neo.setAttribute(name,"")}},fire:function(type,detail,onNode,bubbles,cancelable){var node=onNode||this;var detail=detail===null||detail===undefined?{}:detail;var event=new CustomEvent(type,{bubbles:bubbles!==undefined?bubbles:true,cancelable:cancelable!==undefined?cancelable:true,detail:detail});node.dispatchEvent(event);return event},async:function(method,waitTime){return Async.run(method.bind(this),waitTime)},cancelAsync:function(handle){Async.cancel(handle)},queryHost:function(node){return this.host||this._queryHost(this)},_queryHost:function(node){return node&&(node.host||(node.host=this._queryHost(node.parentNode)))},transform:function(node,transform){node.style.webkitTransform=transform;node.style.transform=transform},translate3d:function(node,x,y,z){this.transform(node,"translate3d("+x+","+y+","+z+")")},importHref:function(href,onload,onerror){var l=document.createElement("link");l.rel="import";l.href=href;if(onload){l.onload=onload.bind(this)}if(onerror){l.onerror=onerror.bind(this)}document.head.appendChild(l);return l},debounce:function(jobName,callback,wait){this._debounce("_job_"+jobName,callback,wait)},_debounce:function(job,callback,wait){this[job]=Debounce.call(this,this[job],callback,wait)}})});</script><script>modulate("bind",function(){var Bind={prepareModel:function(model){model._propertyEffects={};model._bindListeners=[];model._setData=this._setData;model._clearPath=this._clearPath},_addAnnotatedListener:function(model,index,property,path){var changedFn="this."+path+" = e.detail.value;";if(path.indexOf(".")>0){changedFn="if (this._data['"+path+"'] != e.detail.value) {\n"+" "+changedFn+"\n"+" this.notifyPath('"+path+"', e.detail.value)\n"+"}"}model._bindListeners.push({index:index,property:property,path:path,changedFn:new Function("e",changedFn)})},_builders:{},addBuilder:function(kind,builder){this._builders[kind]=builder},addBuilders:function(builders){for(var n in builders){this._builders[n]=builders[n]}},addPropertyEffect:function(model,property,kind,effect){var fx=model._propertyEffects[property];if(!fx){fx=model._propertyEffects[property]=[]}fx.push({kind:kind,effect:effect})},createBindings:function(model){var fx$=model._propertyEffects;if(fx$){for(var n in fx$){var fx=fx$[n];fx.sort(this._sortPropertyEffects);var compiledEffects=fx.map(function(x){return this._buildEffect(model,n,x)},this);this._bindPropertyEffects(model,n,compiledEffects)}}},_sortPropertyEffects:function(a,b){return PROPERTY_EFFECT_ORDER[a.kind]-PROPERTY_EFFECT_ORDER[b.kind]},_buildEffect:function(model,property,fx){var b=this._builders[fx.kind];if(b){return b(model,property,fx.effect)}else{throw"bind._buildEffect: missing builder kind ["+fx.kind+"]"}},_bindPropertyEffects:function(model,property,effects){var defun={get:function(){return this._data[property]}};if(effects.length){effects=effects.join("\n ");var effector="_"+property+"Effector";model[effector]=new Function("old",effects);var body=["var old = this._setData('"+property+"', value);","if (value !== old) {"," this."+effector+"(old);","}"].join("\n");var setter=new Function("value",body);if(model.isReadOnlyProperty&&model.isReadOnlyProperty(property)){model["_set"+this.upper(property)]=setter}else{defun.set=setter}}Object.defineProperty(model,property,defun)},upper:function(name){return name[0].toUpperCase()+name.substring(1)},prepareInstance:function(inst){inst._data=Object.create(null)},setupBindListeners:function(inst){inst._bindListeners.forEach(function(info){var node=inst._nodes[info.index];node.addEventListener(info.property+"-changed",inst._notifyListener.bind(inst,info.changedFn));var type=node.getPublishedPropertyType&&node.getPublishedPropertyType(info.property);if(type==Object||type==Array){node.addEventListener(info.property+"-path-changed",inst._notifyListener.bind(inst,function(e){var path=this._fixPath(info.path,info.property,e.detail.path);this.notifyPath(path,e.detail.value)}))}})},_notifyListener:function(fn,e){return fn.call(this,e)},_telemetry:{_setDataCalls:0},_setData:function(property,value){var old=this._data[property];if(old!==value){this._data[property]=value;if(typeof value=="object"){this._clearPath(property)}}return old},_clearPath:function(path){for(var prop in this._data){if(prop.indexOf(path+".")===0){this._data[prop]=undefined}}}};var PROPERTY_EFFECT_ORDER={compute:0,annotation:1,reflect:2,notify:3,method:4};return Bind});</script><script>using(["Annotations","bind"],function(Annotations,Bind){Bind.addComputedPropertyEffect=function(model,name,expression){var index=expression.indexOf("(");var method=expression.slice(0,index);var args=expression.slice(index+1,-1).replace(/ /g,"").split(",");this.addPropertyEffect(model,args[0],"compute",{property:name,method:method})};Bind.mapCase=function(name){var mapd=Bind._caseMap[name];if(!mapd){mapd=Bind._caseMap[name]=Annotations.camelToDashCase(name)}return mapd};Bind._caseMap={};Bind._notifyChange=function(property){var eventName=Bind.mapCase(property)+"-changed";this.fire(eventName,{value:this[property]},null,false)};Bind._shouldAddListener=function(info){return info.name&&info.mode==="{"&&!info.negate&&info.kind!="attribute"};Bind.addBuilders({method:function(model,source,effect){return"this."+effect+"(this._data."+source+", old);"},notify:function(model,source){model._notifyChange=Bind._notifyChange;return"this._notifyChange('"+source+"')"},compute:function(model,source,effect){return"this."+effect.property+" = this."+effect.method+"(this._data."+source+");"},reflect:function(model,source){return"this.reflectPropertyToAttribute('"+source+"');"},annotation:function(model,hostProperty,info){var property=info.name;if(Bind._shouldAddListener(info)){var dashCaseProperty=Annotations.camelToDashCase(property);Bind._addAnnotatedListener(model,info.index,dashCaseProperty,info.value)}if(!property){property="textContent"}if(property==="style"){property="style.cssText"}var parts=info.value.split(".");var value,setData;if(parts.length<=1){setData="";value="this._data."+info.value}else{var last=parts.pop();var curr="this._data";parts=parts.map(function(s){return curr+="."+s});value=parts.join("!=null && ")+"!=null ? "+curr+"."+last+" : undefined";setData="var val = "+value+";\n"+"this._data['"+info.value+"'] = val;\n";value="val"}value=(info.negate?"!":"")+value;var node="this._nodes["+info.index+"]";if(info.kind=="attribute"){return setData+"this.serializeValueToAttribute("+value+","+"'"+property+"',"+node+");"}else{return setData+node+"."+property+" = "+value+";"}}})});</script><script>modulate("bind-annotations",["bind"],function(Bind){var AnnotationsBind={addEffects:function(scope,list){scope._nodes=[];list.forEach(function(annotation){var index=scope._nodes.push(annotation)-1;annotation.bindings.forEach(function(binding){AnnotationsBind._bindAnnotationBinding(scope,binding,index)})})},_bindAnnotationBinding:function(scope,binding,index){binding.index=index;var path=binding.value;var i=path.indexOf(".");var model=i>=0?path.slice(0,i):path;Bind.addPropertyEffect(scope,model,"annotation",binding)},marshalAnnotatedNodes:function(nodes,root,finder){return nodes.map(function(a){return finder(root,a)})}};return AnnotationsBind});</script><script>using(["Base","bind","bind-annotations"],function(Base,Bind,BindAnnotations){Base.addFeature({addPropertyEffect:function(property,kind,effect){var model=property.split(".").shift();if(kind=="method"&&property!=model){this.addPathBindMethod(property,effect)}Bind.addPropertyEffect(this,model,kind,effect)},_notifyListener:Bind._notifyListener,_prepEffects:function(){Bind.prepareModel(this);this._addBindEffects(this.bind);this._addComputedEffects(this.computed);this._addPublishedEffects(this.published);this._addAnnotationEffects(this._annotes);Bind.createBindings(this)},_addBindEffects:function(effects){for(var n in effects){var effect=effects[n];if(typeof effect==="object"){for(var nn in effect){this._addBindEffect(n,effect[nn])}}else{this._addBindEffect(n,effect)}}},_addBindEffect:function(property,effect){this.addPropertyEffect(property,"method",effect)},_addComputedEffects:function(computed){if(computed){for(var n in computed){Bind.addComputedPropertyEffect(this,n,computed[n])}}},_addPublishedEffects:function(published){for(var n in published){if(this.isNotifyProperty(n)){this.addPropertyEffect(n,"notify")}if(this.isReflectedProperty(n)){this.addPropertyEffect(n,"reflect")}}},_addAnnotationEffects:function(notes){if(notes){BindAnnotations.addEffects(this,notes)}},_marshalInstanceEffects:function(){Bind.prepareInstance(this);Bind.setupBindListeners(this)}})});</script><script>using(["Base"],function(Base){Base.addFeature({_setupConfigure:function(){this._config={};this._handlers=[]},_takeAttributes:function(){this._takeAttributesToModel(this._config)},_configValue:function(name,value){this._config[name]=value},_configure:function(){this._beforeConfigure();var config=this.configure(this._config)||{};for(var i in this._config){config[i]=this._config[i]}this._config=config;this._distributeConfig(this._config)},_beforeConfigure:function(){},_distributeConfig:function(config){var fx$=this._propertyEffects;if(fx$){for(var p in config){var fx=fx$[p];if(fx){for(var i=0,l=fx.length,x;i<l&&(x=fx[i]);i++){if(x.kind==="annotation"){var node=this._nodes[x.effect.index];if(node._configValue){node._configValue(x.effect.name,config[p])}}}}}}},_beforeReady:function(){this._applyConfig(this._config);this._flushHandlers()},_applyConfig:function(config){for(var n in config){this[n]=config[n]}},_notifyListener:function(fn,e){if(!this._readied){this._queueHandler(arguments)}else{return fn.call(this,e)}},_queueHandler:function(args){this._handlers.push(args)},_flushHandlers:function(){var h$=this._handlers;for(var i=0,l=h$.length,h;i<l&&(h=h$[i]);i++){h[0].call(this,h[1])}}})});</script><script>using(["Base","Annotations"],function(Base,Annotations){Base.addFeature({notifyPath:function(path,value,fromAbove){var old=this._setData(path,value);if(old!==value){this._pathEffector(path,value);if(!fromAbove){this._notifyPath(path,value)}}},setPathValue:function(path,value){var parts=path.split(".");if(parts.length>1){var last=parts.pop();var prop=this;while(parts.length){prop=prop[parts.shift()];if(!prop){return}}prop[last]=value;this.notifyPath(path,value)}else{this[path]=value}},getPathValue:function(path){var parts=path.split(".");var last=parts.pop();var prop=this;while(parts.length){prop=prop[parts.shift()];if(!prop){return}}return prop[last]},addPathBindMethod:function(path,method){var fx$=this._pathEffects||(this._pathEffects=[]);var match=path.indexOf(".*")==path.length-2;if(match){path=path.slice(0,-2)}fx$.push({path:path,match:match,method:method})},_pathEffector:function(path,value){var model=modelForPath(path);var fx$=this._propertyEffects[model];if(fx$){fx$.forEach(function(fx){if(fx.kind==="annotation"){var n=this._nodeForBinding(fx.effect);if(n){this._performAnnotationPathEffect(n,path,value,fx.effect)}}},this)}if(this._pathEffects){this._pathEffects.forEach(function(fx){this._performPathEffect(path,value,fx)},this)}if(this._boundPaths){this._notifyBoundPaths(path,value)}},_nodeForBinding:function(info){return info.id?this.$[info.id]:this._nodes[info.index]},_performAnnotationPathEffect:function(node,path,value,effect){if(effect.value===path||effect.value.indexOf(path+".")===0){var v=effect.value===path?value:this.getPathValue(effect.value);v=effect.negate?!v:v;if(effect.kind=="attribute"){this.serializeValueToAttribute(v,effect.name,node)}else{node[effect.name||"textContent"]=v}}else if(path.indexOf(effect.value+".")===0&&node.notifyPath&&!effect.negate){var p=this._fixPath(effect.name,effect.value,path);node.notifyPath(p,value,true)}},_performPathEffect:function(path,value,fx){if(fx.path==path||fx.match&&path.indexOf(fx.path)===0){var fn=this[fx.method];if(fn){fn.call(this,value,null,path)}}},bindPaths:function(to,from){this._boundPaths=this._boundPaths||{};if(from){this._boundPaths[to]=from}else{this.unbindPath(to)}},unbindPaths:function(path){if(this._boundPaths){delete this._boundPaths[path]}},_notifyBoundPaths:function(path,value){var from,to;for(var a in this._boundPaths){var b=this._boundPaths[a];if(path.indexOf(a+".")==0){from=a;to=b;break}if(path.indexOf(b+".")==0){from=b;to=a;break}}if(from&&to){var p=this._fixPath(to,from,path);this.notifyPath(p,value)}},_fixPath:function(property,root,path){return property+path.slice(root.length)},_notifyPath:function(path,value){var rootName=modelForPath(path);var dashCaseName=Annotations.camelToDashCase(rootName);var eventName=dashCaseName+EVENT_PATH_CHANGED;this.fire(eventName,{path:path,value:value},null,false)}});function modelForPath(path){return path.split(".").shift()}var EVENT_CHANGED="-changed";var EVENT_PATH_CHANGED="-path"+EVENT_CHANGED});</script><script>using("Base",function(Base){Base.addFeature({registerFeatures:function(){this._prepMixins();this._prepExtends();this._prepConstructor();this._prepTemplate();this._prepAnnotations();this._prepEffects();this._prepContent()},initFeatures:function(){this._poolContent();this._pushHost();this._setupConfigure();this._stampTemplate();this._marshalAnnotationReferences();this._popHost();this._marshalInstanceEffects();this._marshalAttributes();this._marshalListeners();this._readyContent()}})});</script><script>using("Base",function(Base){Polymer({is:"x-autobind","extends":"template",registerFeatures:function(){},_composeContent:function(){this.parentNode.insertBefore(this.root,this.nextSibling)},initFeatures:function(){this._template=this;this._prepAnnotations();this._prepEffects();Base.initFeatures.call(this)}})});</script><script>modulate("Templatizer",["Base","Annotations"],function(Base,Annotations){Templatizer={templatize:function(template){if(template._content&&template._content._ctor){this.ctor=template._content._ctor;return}var host=this.host;var archetype=Object.create(Base);archetype._template=template;this.customPrepAnnotations(archetype,template);archetype._prepEffects();archetype.listen=function(){host.listen.apply(host,arguments)};var ctor=function(){this._setupConfigure();this.root=this.instanceTemplate(this._template);this._marshalTemplateContent();this._marshalAnnotatedNodes();this._marshalInstanceEffects();this._marshalAnnotatedListeners();this._ready();this._notifyPath=function(){var pd=this.pathDelegate;if(pd){var args=Array.prototype.slice.call(arguments);args.unshift(this);pd._notifyDelegatePath.apply(pd,args)}}};ctor.prototype=archetype;archetype.constructor=ctor;template._content._ctor=ctor;this.ctor=ctor},customPrepAnnotations:function(archetype,template){if(template){var c=template._content;if(c){archetype._annotes=c._annotes||Annotations.parseAnnotations(template);c._annotes=archetype._annotes}else{console.warn("no _content")}}else{console.warn("no _template")}},stamp:function(model){var instance=new this.ctor;if(model){for(var n in model){instance[n]=model[n]}}return instance}};return Templatizer});</script><script>Polymer({is:"x-template","extends":"template",mixins:["Templatizer"],ready:function(){this.templatize(this)}});</script><script>modulate("ArrayObserve","Debounce",function(Debounce){var callbacks=new WeakMap;function observe(array,cb){if(Array.observe){var ncb=function(changes){cb(changes.filter(function(o){return o.type=="splice"}))};callbacks.set(cb,ncb);Array.observe(array,ncb)}else{if(!array.__polymerObservable){makeObservable(array)}callbacks.get(array).push(cb)}}function unobserve(array,cb){if(Array.observe){var ncb=callbacks.get(cb);callbacks.delete(cb);Array.unobserve(array,ncb)}else{var cbs=callbacks.get(array);var idx=cbs.indexOf(cb);if(idx>=0){cbs.splice(idx,1)}}}function makeObservable(array){var splices=[];var debounce;var orig={push:array.push,pop:array.pop,splice:array.splice,shift:array.shift,unshift:array.unshift,sort:array.sort};var addSplice=function(index,added,removed){splices.push({index:index,addedCount:added,removed:removed,object:array,type:"splice"})};callbacks.set(array,[]);array.push=function(){debounce=Debounce(debounce,fin);addSplice(array.length,1,[]);return orig.push.apply(this,arguments)};array.pop=function(){debounce=Debounce(debounce,fin);addSplice(array.length-1,0,array.slice(-1));return orig.pop.apply(this,arguments)};array.splice=function(start,deleteCount){debounce=Debounce(debounce,fin);addSplice(start,arguments.length-2,array.slice(start,start+deleteCount));return orig.splice.apply(this,arguments)};array.shift=function(){debounce=Debounce(debounce,fin);addSplice(0,0,[array[0]]);return orig.shift.apply(this,arguments)};array.unshift=function(){debounce=Debounce(debounce,fin);addSplice(0,1,[]);return orig.unshift.apply(this,arguments)};array.sort=function(){debounce=Debounce(debounce,fin);console.warn("[ArrayObserve]: sort not observable");return orig.sort.apply(this,arguments)};var fin=function(){var cbs=callbacks.get(array);for(var i=0;i<cbs.length;i++){cbs[i](splices)}splices=[]};array.__polymerObservable=true}return{observe:observe,unobserve:unobserve}});</script><script>using(["ArrayObserve"],function(ArrayObserve){Polymer({is:"x-repeat","extends":"template",published:{items:Object},mixins:["Templatizer"],bind:{"items.*":"itemsChanged"},attached:function(){if(!this.ctor){this.templatize(this)}this.itemsChanged(this.items)},detached:function(){this.unobserveArray(this.items);this.derender()},itemsChanged:function(items,old,path){if(this.isAttached){if(path){this.notifyElement(path,items)}else{if(old){this.unobserveArray(old)}if(items){this.observeArray(items)}this.render()}}},observeArray:function(items){this.boundArrayObserver=this.boundArrayObserver||this.arrayObserver.bind(this);ArrayObserve.observe(items,this.boundArrayObserver)},unobserveArray:function(items){ArrayObserve.unobserve(items,this.boundArrayObserver)},arrayObserver:function(splices){this.renderSplices(splices)},renderSplices:function(splices){var pool=[];for(var i=0;i<splices.length;i++){var s=splices[i];var removed=this.rows.splice(s.index,s.removed.length);while(removed.length){this.poolRow(removed.pop(),pool)}for(var idx=s.index;idx<s.index+s.addedCount;idx++){this.rows.splice(idx,0,this.insertRow(idx,pool))}}},poolRow:function(row,pool){for(var i=0;i<row.children.length;i++){row.root.appendChild(row.children[i])}pool.push(row)},insertRow:function(idx,pool){var row;var item=this.items[idx];if(pool.length){row=pool.pop();row.item=item}else{row=this.generateRow(idx,item)}var parent=this.rows[idx];this.parentNode.insertBefore(row.root,parent?parent.children[0]:this);return row},render:function(){this.derender();if(this.items){this.rows=this.createRows(this.items,this.parentNode)}},derender:function(){if(this.rows){this.rows.forEach(function(row){row.children.forEach(function(n){n.remove()})})}},createRows:function(items,parent){var rows=[];for(var i=0,row,item;item=items[i];i++){row=this.generateRow(i,item);parent.insertBefore(row.root,this);rows.push(row)}return rows},generateRow:function(idx,item){var row=this.stamp({item:item,pathDelegate:this});var children=[];for(var n=row.root.firstChild;n;n=n.nextSibling){children.push(n);n._templateProxy=row}row.children=children;return row},_notifyDelegatePath:function(row,path,value){var idx=this.items.indexOf(row.item);this.notifyPath(path.replace("item","items."+idx),value)},notifyElement:function(path,value){var dot=path.indexOf(".",6);var idx=path.substring(6,dot<0?path.length:dot);if(dot>=0){path="item."+path.substring(dot+1);this.rows[idx].notifyPath(path,value,true)}else{this.rows[idx].item=value}},indexForElement:function(el){while(el&&!el._templateProxy){el=el.parentNode}return this.rows.indexOf(el._templateProxy)}})});</script><script>(function(){var Matter={};var Body={};(function(){Body._inertiaScale=4;var _nextCollidingGroupId=1,_nextNonCollidingGroupId=-1,_nextCategory=1;Body.create=function(options){var defaults={id:Common.nextId(),type:"body",label:"Body",angle:0,vertices:Vertices.fromPath("L 0 0 L 40 0 L 40 40 L 0 40"),position:{x:0,y:0},force:{x:0,y:0},torque:0,positionImpulse:{x:0,y:0},constraintImpulse:{x:0,y:0,angle:0},speed:0,angularSpeed:0,velocity:{x:0,y:0},angularVelocity:0,isStatic:false,isSleeping:false,motion:0,sleepThreshold:60,density:.001,restitution:0,friction:.1,frictionAir:.01,collisionFilter:{category:1,mask:4294967295,group:0},slop:.05,timeScale:1,render:{visible:true,sprite:{xScale:1,yScale:1},lineWidth:1.5}};var body=Common.extend(defaults,options);_initProperties(body,options);return body};Body.nextGroup=function(isNonColliding){if(isNonColliding)return _nextNonCollidingGroupId--;return _nextCollidingGroupId++};Body.nextCategory=function(){_nextCategory=_nextCategory<<1;return _nextCategory};var _initProperties=function(body,options){Body.set(body,{bounds:body.bounds||Bounds.create(body.vertices),positionPrev:body.positionPrev||Vector.clone(body.position),anglePrev:body.anglePrev||body.angle,vertices:body.vertices,isStatic:body.isStatic,isSleeping:body.isSleeping});Vertices.rotate(body.vertices,body.angle,body.position);Axes.rotate(body.axes,body.angle);Bounds.update(body.bounds,body.vertices,body.velocity);Body.set(body,{axes:options.axes||body.axes,area:options.area||body.area,mass:options.mass||body.mass,inertia:options.inertia||body.inertia});var defaultFillStyle=body.isStatic?"#eeeeee":Common.choose(["#556270","#4ECDC4","#C7F464","#FF6B6B","#C44D58"]),defaultStrokeStyle=Common.shadeColor(defaultFillStyle,-20);body.render.fillStyle=body.render.fillStyle||defaultFillStyle;body.render.strokeStyle=body.render.strokeStyle||defaultStrokeStyle};Body.set=function(body,settings,value){var property;if(typeof settings==="string"){property=settings;settings={};settings[property]=value}for(property in settings){value=settings[property];if(!settings.hasOwnProperty(property))continue;switch(property){case"isStatic":Body.setStatic(body,value);break;case"isSleeping":Sleeping.set(body,value);break;case"mass":Body.setMass(body,value);break;case"density":Body.setDensity(body,value);break;case"inertia":Body.setInertia(body,value);break;case"vertices":Body.setVertices(body,value);break;case"position":Body.setPosition(body,value);break;case"angle":Body.setAngle(body,value);break;case"velocity":Body.setVelocity(body,value);break;case"angularVelocity":Body.setAngularVelocity(body,value);break;default:body[property]=value}}};Body.setStatic=function(body,isStatic){body.isStatic=isStatic;if(isStatic){body.restitution=0;body.friction=1;body.mass=body.inertia=body.density=Infinity;body.inverseMass=body.inverseInertia=0;body.positionPrev.x=body.position.x;body.positionPrev.y=body.position.y;body.anglePrev=body.angle;body.angularVelocity=0;body.speed=0;body.angularSpeed=0;body.motion=0}};Body.setMass=function(body,mass){body.mass=mass;body.inverseMass=1/body.mass;body.density=body.mass/body.area};Body.setDensity=function(body,density){Body.setMass(body,density*body.area);body.density=density};Body.setInertia=function(body,inertia){body.inertia=inertia;body.inverseInertia=1/body.inertia};Body.setVertices=function(body,vertices){if(vertices[0].body===body){body.vertices=vertices}else{body.vertices=Vertices.create(vertices,body)}body.axes=Axes.fromVertices(body.vertices);body.area=Vertices.area(body.vertices);Body.setMass(body,body.density*body.area);var centre=Vertices.centre(body.vertices);Vertices.translate(body.vertices,centre,-1);Body.setInertia(body,Body._inertiaScale*Vertices.inertia(body.vertices,body.mass));Vertices.translate(body.vertices,body.position);Bounds.update(body.bounds,body.vertices,body.velocity)};Body.setPosition=function(body,position){var delta=Vector.sub(position,body.position);body.position.x=position.x;body.position.y=position.y;body.positionPrev.x+=delta.x;body.positionPrev.y+=delta.y;Vertices.translate(body.vertices,delta);Bounds.update(body.bounds,body.vertices,body.velocity)};Body.setAngle=function(body,angle){var delta=angle-body.angle;body.angle=angle;body.anglePrev+=delta;Vertices.rotate(body.vertices,delta,body.position);Axes.rotate(body.axes,delta);Bounds.update(body.bounds,body.vertices,body.velocity)};Body.setVelocity=function(body,velocity){body.positionPrev.x=body.position.x-velocity.x;body.positionPrev.y=body.position.y-velocity.y;body.velocity.x=velocity.x;body.velocity.y=velocity.y;body.speed=Vector.magnitude(body.velocity)};Body.setAngularVelocity=function(body,velocity){body.anglePrev=body.angle-velocity;body.angularVelocity=velocity;body.angularSpeed=Math.abs(body.angularVelocity)};Body.translate=function(body,translation){Body.setPosition(body,Vector.add(body.position,translation))};Body.rotate=function(body,rotation){Body.setAngle(body,body.angle+rotation)};Body.scale=function(body,scaleX,scaleY,point){Vertices.scale(body.vertices,scaleX,scaleY,point);body.axes=Axes.fromVertices(body.vertices);body.area=Vertices.area(body.vertices);Body.setMass(body,body.density*body.area);Vertices.translate(body.vertices,{x:-body.position.x,y:-body.position.y});Body.setInertia(body,Vertices.inertia(body.vertices,body.mass));Vertices.translate(body.vertices,{x:body.position.x,y:body.position.y});Bounds.update(body.bounds,body.vertices,body.velocity)};Body.update=function(body,deltaTime,timeScale,correction){var deltaTimeSquared=Math.pow(deltaTime*timeScale*body.timeScale,2);var frictionAir=1-body.frictionAir*timeScale*body.timeScale,velocityPrevX=body.position.x-body.positionPrev.x,velocityPrevY=body.position.y-body.positionPrev.y;body.velocity.x=velocityPrevX*frictionAir*correction+body.force.x/body.mass*deltaTimeSquared;body.velocity.y=velocityPrevY*frictionAir*correction+body.force.y/body.mass*deltaTimeSquared;body.positionPrev.x=body.position.x;body.positionPrev.y=body.position.y;body.position.x+=body.velocity.x;body.position.y+=body.velocity.y;body.angularVelocity=(body.angle-body.anglePrev)*frictionAir*correction+body.torque/body.inertia*deltaTimeSquared;body.anglePrev=body.angle;body.angle+=body.angularVelocity;body.speed=Vector.magnitude(body.velocity);body.angularSpeed=Math.abs(body.angularVelocity);Vertices.translate(body.vertices,body.velocity);if(body.angularVelocity!==0){Vertices.rotate(body.vertices,body.angularVelocity,body.position);Axes.rotate(body.axes,body.angularVelocity)}Bounds.update(body.bounds,body.vertices,body.velocity)};Body.applyForce=function(body,position,force){body.force.x+=force.x;body.force.y+=force.y;var offset={x:position.x-body.position.x,y:position.y-body.position.y};body.torque+=(offset.x*force.y-offset.y*force.x)*body.inverseInertia}})();var Composite={};(function(){Composite.create=function(options){return Common.extend({id:Common.nextId(),type:"composite",parent:null,isModified:false,bodies:[],constraints:[],composites:[],label:"Composite"},options)};Composite.setModified=function(composite,isModified,updateParents,updateChildren){composite.isModified=isModified;if(updateParents&&composite.parent){Composite.setModified(composite.parent,isModified,updateParents,updateChildren)}if(updateChildren){for(var i=0;i<composite.composites.length;i++){var childComposite=composite.composites[i];Composite.setModified(childComposite,isModified,updateParents,updateChildren)}}};Composite.add=function(composite,object){var objects=[].concat(object);Events.trigger(composite,"beforeAdd",{object:object});for(var i=0;i<objects.length;i++){var obj=objects[i];switch(obj.type){case"body":Composite.addBody(composite,obj);break;case"constraint":Composite.addConstraint(composite,obj);break;case"composite":Composite.addComposite(composite,obj);break;case"mouseConstraint":Composite.addConstraint(composite,obj.constraint);break}}Events.trigger(composite,"afterAdd",{object:object});return composite};Composite.remove=function(composite,object,deep){var objects=[].concat(object);Events.trigger(composite,"beforeRemove",{object:object});for(var i=0;i<objects.length;i++){var obj=objects[i];switch(obj.type){case"body":Composite.removeBody(composite,obj,deep);break;case"constraint":Composite.removeConstraint(composite,obj,deep);break;case"composite":Composite.removeComposite(composite,obj,deep);break;case"mouseConstraint":Composite.removeConstraint(composite,obj.constraint);break}}Events.trigger(composite,"afterRemove",{object:object});return composite};Composite.addComposite=function(compositeA,compositeB){compositeA.composites.push(compositeB);compositeB.parent=compositeA;Composite.setModified(compositeA,true,true,false);return compositeA};Composite.removeComposite=function(compositeA,compositeB,deep){var position=Common.indexOf(compositeA.composites,compositeB);if(position!==-1){Composite.removeCompositeAt(compositeA,position);Composite.setModified(compositeA,true,true,false)}if(deep){for(var i=0;i<compositeA.composites.length;i++){Composite.removeComposite(compositeA.composites[i],compositeB,true)}}return compositeA};Composite.removeCompositeAt=function(composite,position){composite.composites.splice(position,1);Composite.setModified(composite,true,true,false);return composite};Composite.addBody=function(composite,body){composite.bodies.push(body);Composite.setModified(composite,true,true,false);return composite};Composite.removeBody=function(composite,body,deep){var position=Common.indexOf(composite.bodies,body);if(position!==-1){Composite.removeBodyAt(composite,position);Composite.setModified(composite,true,true,false)}if(deep){for(var i=0;i<composite.composites.length;i++){Composite.removeBody(composite.composites[i],body,true)}}return composite};Composite.removeBodyAt=function(composite,position){composite.bodies.splice(position,1);Composite.setModified(composite,true,true,false);return composite};Composite.addConstraint=function(composite,constraint){composite.constraints.push(constraint);Composite.setModified(composite,true,true,false);return composite};Composite.removeConstraint=function(composite,constraint,deep){var position=Common.indexOf(composite.constraints,constraint);if(position!==-1){Composite.removeConstraintAt(composite,position)}if(deep){for(var i=0;i<composite.composites.length;i++){Composite.removeConstraint(composite.composites[i],constraint,true)}}return composite};Composite.removeConstraintAt=function(composite,position){composite.constraints.splice(position,1);Composite.setModified(composite,true,true,false);return composite};Composite.clear=function(composite,keepStatic,deep){if(deep){for(var i=0;i<composite.composites.length;i++){Composite.clear(composite.composites[i],keepStatic,true)}}if(keepStatic){composite.bodies=composite.bodies.filter(function(body){return body.isStatic})}else{composite.bodies.length=0}composite.constraints.length=0;composite.composites.length=0;Composite.setModified(composite,true,true,false);return composite};Composite.allBodies=function(composite){var bodies=[].concat(composite.bodies);for(var i=0;i<composite.composites.length;i++)bodies=bodies.concat(Composite.allBodies(composite.composites[i]));return bodies};Composite.allConstraints=function(composite){var constraints=[].concat(composite.constraints);for(var i=0;i<composite.composites.length;i++)constraints=constraints.concat(Composite.allConstraints(composite.composites[i]));return constraints};Composite.allComposites=function(composite){var composites=[].concat(composite.composites);for(var i=0;i<composite.composites.length;i++)composites=composites.concat(Composite.allComposites(composite.composites[i]));return composites};Composite.get=function(composite,id,type){var objects,object;switch(type){case"body":objects=Composite.allBodies(composite);break;case"constraint":objects=Composite.allConstraints(composite);break;case"composite":objects=Composite.allComposites(composite).concat(composite);break}if(!objects)return null;object=objects.filter(function(object){return object.id.toString()===id.toString()});return object.length===0?null:object[0]};Composite.move=function(compositeA,objects,compositeB){Composite.remove(compositeA,objects);Composite.add(compositeB,objects);return compositeA};Composite.rebase=function(composite){var objects=Composite.allBodies(composite).concat(Composite.allConstraints(composite)).concat(Composite.allComposites(composite));for(var i=0;i<objects.length;i++){objects[i].id=Common.nextId()}Composite.setModified(composite,true,true,false);return composite};Composite.translate=function(composite,translation,recursive){var bodies=recursive?Composite.allBodies(composite):composite.bodies;for(var i=0;i<bodies.length;i++){Body.translate(bodies[i],translation)}Composite.setModified(composite,true,true,false);return composite};Composite.rotate=function(composite,rotation,point,recursive){var cos=Math.cos(rotation),sin=Math.sin(rotation),bodies=recursive?Composite.allBodies(composite):composite.bodies;for(var i=0;i<bodies.length;i++){var body=bodies[i],dx=body.position.x-point.x,dy=body.position.y-point.y;Body.setPosition(body,{x:point.x+(dx*cos-dy*sin),y:point.y+(dx*sin+dy*cos)});Body.rotate(body,rotation)}Composite.setModified(composite,true,true,false);return composite};Composite.scale=function(composite,scaleX,scaleY,point,recursive){var bodies=recursive?Composite.allBodies(composite):composite.bodies;for(var i=0;i<bodies.length;i++){var body=bodies[i],dx=body.position.x-point.x,dy=body.position.y-point.y;Body.setPosition(body,{x:point.x+dx*scaleX,y:point.y+dy*scaleY});Body.scale(body,scaleX,scaleY)}Composite.setModified(composite,true,true,false);return composite}})();var World={};(function(){World.create=function(options){var composite=Composite.create();var defaults={label:"World",gravity:{x:0,y:1},bounds:{min:{x:0,y:0},max:{x:800,y:600}}};return Common.extend(composite,defaults,options)}})();var Contact={};(function(){Contact.create=function(vertex){return{id:Contact.id(vertex),vertex:vertex,normalImpulse:0,tangentImpulse:0}};Contact.id=function(vertex){return vertex.body.id+"_"+vertex.index}})();var Detector={};(function(){Detector.collisions=function(broadphasePairs,engine){var collisions=[],metrics=engine.metrics,pairsTable=engine.pairs.table;for(var i=0;i<broadphasePairs.length;i++){var bodyA=broadphasePairs[i][0],bodyB=broadphasePairs[i][1];if((bodyA.isStatic||bodyA.isSleeping)&&(bodyB.isStatic||bodyB.isSleeping))continue;if(!Detector.canCollide(bodyA.collisionFilter,bodyB.collisionFilter))continue;metrics.midphaseTests+=1;if(Bounds.overlaps(bodyA.bounds,bodyB.bounds)){var pairId=Pair.id(bodyA,bodyB),pair=pairsTable[pairId],previousCollision;if(pair&&pair.isActive){previousCollision=pair.collision}else{previousCollision=null}var collision=SAT.collides(bodyA,bodyB,previousCollision);metrics.narrowphaseTests+=1;if(collision.reused)metrics.narrowReuseCount+=1;if(collision.collided){collisions.push(collision);metrics.narrowDetections+=1}}}return collisions};Detector.bruteForce=function(bodies,engine){var collisions=[],metrics=engine.metrics,pairsTable=engine.pairs.table;for(var i=0;i<bodies.length;i++){for(var j=i+1;j<bodies.length;j++){var bodyA=bodies[i],bodyB=bodies[j];if((bodyA.isStatic||bodyA.isSleeping)&&(bodyB.isStatic||bodyB.isSleeping))continue;if(!Detector.canCollide(bodyA.collisionFilter,bodyB.collisionFilter))continue;metrics.midphaseTests+=1;if(Bounds.overlaps(bodyA.bounds,bodyB.bounds)){var pairId=Pair.id(bodyA,bodyB),pair=pairsTable[pairId],previousCollision;if(pair&&pair.isActive){previousCollision=pair.collision}else{previousCollision=null}var collision=SAT.collides(bodyA,bodyB,previousCollision);metrics.narrowphaseTests+=1;if(collision.reused)metrics.narrowReuseCount+=1;if(collision.collided){collisions.push(collision);metrics.narrowDetections+=1}}}}return collisions};Detector.canCollide=function(filterA,filterB){if(filterA.group===filterB.group&&filterA.group!==0)return filterA.group>0;return(filterA.mask&filterB.category)!==0&&(filterB.mask&filterA.category)!==0}})();var Grid={};(function(){Grid.create=function(options){var defaults={controller:Grid,detector:Detector.collisions,buckets:{},pairs:{},pairsList:[],bucketWidth:48,bucketHeight:48};return Common.extend(defaults,options)};Grid.update=function(grid,bodies,engine,forceUpdate){var i,col,row,world=engine.world,buckets=grid.buckets,bucket,bucketId,metrics=engine.metrics,gridChanged=false;metrics.broadphaseTests=0;for(i=0;i<bodies.length;i++){var body=bodies[i];if(body.isSleeping&&!forceUpdate)continue;if(body.bounds.max.x<0||body.bounds.min.x>world.bounds.width||body.bounds.max.y<0||body.bounds.min.y>world.bounds.height)continue;var newRegion=_getRegion(grid,body);if(!body.region||newRegion.id!==body.region.id||forceUpdate){metrics.broadphaseTests+=1;if(!body.region||forceUpdate)body.region=newRegion;var union=_regionUnion(newRegion,body.region);for(col=union.startCol;col<=union.endCol;col++){for(row=union.startRow;row<=union.endRow;row++){bucketId=_getBucketId(col,row);bucket=buckets[bucketId];var isInsideNewRegion=col>=newRegion.startCol&&col<=newRegion.endCol&&row>=newRegion.startRow&&row<=newRegion.endRow;var isInsideOldRegion=col>=body.region.startCol&&col<=body.region.endCol&&row>=body.region.startRow&&row<=body.region.endRow;if(!isInsideNewRegion&&isInsideOldRegion){if(isInsideOldRegion){if(bucket)_bucketRemoveBody(grid,bucket,body)}}if(body.region===newRegion||isInsideNewRegion&&!isInsideOldRegion||forceUpdate){if(!bucket)bucket=_createBucket(buckets,bucketId);_bucketAddBody(grid,bucket,body)}}}body.region=newRegion;gridChanged=true}}if(gridChanged)grid.pairsList=_createActivePairsList(grid)};Grid.clear=function(grid){grid.buckets={};grid.pairs={};grid.pairsList=[]};var _regionUnion=function(regionA,regionB){var startCol=Math.min(regionA.startCol,regionB.startCol),endCol=Math.max(regionA.endCol,regionB.endCol),startRow=Math.min(regionA.startRow,regionB.startRow),endRow=Math.max(regionA.endRow,regionB.endRow);return _createRegion(startCol,endCol,startRow,endRow)};var _getRegion=function(grid,body){var bounds=body.bounds,startCol=Math.floor(bounds.min.x/grid.bucketWidth),endCol=Math.floor(bounds.max.x/grid.bucketWidth),startRow=Math.floor(bounds.min.y/grid.bucketHeight),endRow=Math.floor(bounds.max.y/grid.bucketHeight);return _createRegion(startCol,endCol,startRow,endRow)};var _createRegion=function(startCol,endCol,startRow,endRow){return{id:startCol+","+endCol+","+startRow+","+endRow,startCol:startCol,endCol:endCol,startRow:startRow,endRow:endRow}};var _getBucketId=function(column,row){return column+","+row};var _createBucket=function(buckets,bucketId){var bucket=buckets[bucketId]=[];return bucket};var _bucketAddBody=function(grid,bucket,body){for(var i=0;i<bucket.length;i++){var bodyB=bucket[i];if(body.id===bodyB.id||body.isStatic&&bodyB.isStatic)continue;var pairId=Pair.id(body,bodyB),pair=grid.pairs[pairId];if(pair){pair[2]+=1}else{grid.pairs[pairId]=[body,bodyB,1]}}bucket.push(body)};var _bucketRemoveBody=function(grid,bucket,body){bucket.splice(Common.indexOf(bucket,body),1);for(var i=0;i<bucket.length;i++){var bodyB=bucket[i],pairId=Pair.id(body,bodyB),pair=grid.pairs[pairId];if(pair)pair[2]-=1}};var _createActivePairsList=function(grid){var pairKeys,pair,pairs=[];pairKeys=Common.keys(grid.pairs);for(var k=0;k<pairKeys.length;k++){pair=grid.pairs[pairKeys[k]];if(pair[2]>0){pairs.push(pair)}else{delete grid.pairs[pairKeys[k]]}}return pairs}})();var Pair={};(function(){Pair.create=function(collision,timestamp){var bodyA=collision.bodyA,bodyB=collision.bodyB;var pair={id:Pair.id(bodyA,bodyB),bodyA:bodyA,bodyB:bodyB,contacts:{},activeContacts:[],separation:0,isActive:true,timeCreated:timestamp,timeUpdated:timestamp,inverseMass:bodyA.inverseMass+bodyB.inverseMass,friction:Math.min(bodyA.friction,bodyB.friction),restitution:Math.max(bodyA.restitution,bodyB.restitution),slop:Math.max(bodyA.slop,bodyB.slop)};Pair.update(pair,collision,timestamp);return pair};Pair.update=function(pair,collision,timestamp){var contacts=pair.contacts,supports=collision.supports,activeContacts=pair.activeContacts;pair.collision=collision;pair.inverseMass=collision.bodyA.inverseMass+collision.bodyB.inverseMass;pair.friction=Math.min(collision.bodyA.friction,collision.bodyB.friction);pair.restitution=Math.max(collision.bodyA.restitution,collision.bodyB.restitution);pair.slop=Math.max(collision.bodyA.slop,collision.bodyB.slop);activeContacts.length=0;if(collision.collided){for(var i=0;i<supports.length;i++){var support=supports[i],contactId=Contact.id(support),contact=contacts[contactId];if(contact){activeContacts.push(contact)}else{activeContacts.push(contacts[contactId]=Contact.create(support))}}pair.separation=collision.depth;Pair.setActive(pair,true,timestamp)}else{if(pair.isActive===true)Pair.setActive(pair,false,timestamp)}};Pair.setActive=function(pair,isActive,timestamp){if(isActive){pair.isActive=true;pair.timeUpdated=timestamp}else{pair.isActive=false;pair.activeContacts.length=0}};Pair.id=function(bodyA,bodyB){if(bodyA.id<bodyB.id){return bodyA.id+"_"+bodyB.id}else{return bodyB.id+"_"+bodyA.id}}})();var Pairs={};(function(){var _pairMaxIdleLife=1e3;Pairs.create=function(options){return Common.extend({table:{},list:[],collisionStart:[],collisionActive:[],collisionEnd:[]},options)};Pairs.update=function(pairs,collisions,timestamp){var pairsList=pairs.list,pairsTable=pairs.table,collisionStart=pairs.collisionStart,collisionEnd=pairs.collisionEnd,collisionActive=pairs.collisionActive,activePairIds=[],collision,pairId,pair,i;collisionStart.length=0;collisionEnd.length=0;collisionActive.length=0;for(i=0;i<collisions.length;i++){collision=collisions[i];if(collision.collided){pairId=Pair.id(collision.bodyA,collision.bodyB);activePairIds.push(pairId);pair=pairsTable[pairId];if(pair){if(pair.isActive){collisionActive.push(pair)}else{collisionStart.push(pair)}Pair.update(pair,collision,timestamp)}else{pair=Pair.create(collision,timestamp);pairsTable[pairId]=pair;collisionStart.push(pair);pairsList.push(pair)}}}for(i=0;i<pairsList.length;i++){pair=pairsList[i];if(pair.isActive&&Common.indexOf(activePairIds,pair.id)===-1){Pair.setActive(pair,false,timestamp);collisionEnd.push(pair)}}};Pairs.removeOld=function(pairs,timestamp){var pairsList=pairs.list,pairsTable=pairs.table,indexesToRemove=[],pair,collision,pairIndex,i;for(i=0;i<pairsList.length;i++){pair=pairsList[i];collision=pair.collision;if(collision.bodyA.isSleeping||collision.bodyB.isSleeping){pair.timeUpdated=timestamp;continue}if(timestamp-pair.timeUpdated>_pairMaxIdleLife){indexesToRemove.push(i)}}for(i=0;i<indexesToRemove.length;i++){pairIndex=indexesToRemove[i]-i;pair=pairsList[pairIndex];delete pairsTable[pair.id];pairsList.splice(pairIndex,1)}};Pairs.clear=function(pairs){pairs.table={};pairs.list.length=0;pairs.collisionStart.length=0;pairs.collisionActive.length=0;pairs.collisionEnd.length=0;return pairs}})();var Query={};(function(){Query.ray=function(bodies,startPoint,endPoint,rayWidth){rayWidth=rayWidth||Number.MIN_VALUE;var rayAngle=Vector.angle(startPoint,endPoint),rayLength=Vector.magnitude(Vector.sub(startPoint,endPoint)),rayX=(endPoint.x+startPoint.x)*.5,rayY=(endPoint.y+startPoint.y)*.5,ray=Bodies.rectangle(rayX,rayY,rayLength,rayWidth,{angle:rayAngle}),collisions=[];for(var i=0;i<bodies.length;i++){var bodyA=bodies[i];if(Bounds.overlaps(bodyA.bounds,ray.bounds)){var collision=SAT.collides(bodyA,ray);if(collision.collided){collision.body=collision.bodyA=collision.bodyB=bodyA;collisions.push(collision)}}}return collisions};Query.region=function(bodies,bounds,outside){var result=[];for(var i=0;i<bodies.length;i++){var body=bodies[i],overlaps=Bounds.overlaps(body.bounds,bounds);if(overlaps&&!outside||!overlaps&&outside)result.push(body)}return result}})();var Resolver={};(function(){var _restingThresh=4,_positionDampen=.2,_positionWarming=.6;Resolver.solvePosition=function(pairs,timeScale){var i,pair,collision,bodyA,bodyB,vertex,vertexCorrected,normal,bodyBtoA;for(i=0;i<pairs.length;i++){pair=pairs[i];if(!pair.isActive)continue;collision=pair.collision;bodyA=collision.bodyA;bodyB=collision.bodyB;vertex=collision.supports[0];vertexCorrected=collision.supportCorrected;normal=collision.normal;bodyBtoA=Vector.sub(Vector.add(bodyB.positionImpulse,vertex),Vector.add(bodyA.positionImpulse,vertexCorrected));pair.separation=Vector.dot(normal,bodyBtoA)}for(i=0;i<pairs.length;i++){pair=pairs[i];if(!pair.isActive)continue;collision=pair.collision;bodyA=collision.bodyA;bodyB=collision.bodyB;normal=collision.normal;positionImpulse=(pair.separation*_positionDampen-pair.slop)*timeScale;if(bodyA.isStatic||bodyB.isStatic)positionImpulse*=2;if(!(bodyA.isStatic||bodyA.isSleeping)){bodyA.positionImpulse.x+=normal.x*positionImpulse;bodyA.positionImpulse.y+=normal.y*positionImpulse}if(!(bodyB.isStatic||bodyB.isSleeping)){bodyB.positionImpulse.x-=normal.x*positionImpulse;bodyB.positionImpulse.y-=normal.y*positionImpulse}}};Resolver.postSolvePosition=function(bodies){for(var i=0;i<bodies.length;i++){var body=bodies[i];if(body.positionImpulse.x!==0||body.positionImpulse.y!==0){body.position.x+=body.positionImpulse.x;body.position.y+=body.positionImpulse.y;body.positionPrev.x+=body.positionImpulse.x;body.positionPrev.y+=body.positionImpulse.y;Vertices.translate(body.vertices,body.positionImpulse);Bounds.update(body.bounds,body.vertices,body.velocity);body.positionImpulse.x*=_positionWarming;body.positionImpulse.y*=_positionWarming}}};Resolver.preSolveVelocity=function(pairs){var impulse={},i,j,pair,contacts,collision,bodyA,bodyB,normal,tangent,contact,contactVertex,normalImpulse,tangentImpulse,offset;for(i=0;i<pairs.length;i++){pair=pairs[i];if(!pair.isActive)continue;contacts=pair.activeContacts;collision=pair.collision;bodyA=collision.bodyA;bodyB=collision.bodyB;normal=collision.normal;tangent=collision.tangent;for(j=0;j<contacts.length;j++){contact=contacts[j];contactVertex=contact.vertex;normalImpulse=contact.normalImpulse;tangentImpulse=contact.tangentImpulse;impulse.x=normal.x*normalImpulse+tangent.x*tangentImpulse;impulse.y=normal.y*normalImpulse+tangent.y*tangentImpulse;if(!(bodyA.isStatic||bodyA.isSleeping)){offset=Vector.sub(contactVertex,bodyA.position);bodyA.positionPrev.x+=impulse.x*bodyA.inverseMass;bodyA.positionPrev.y+=impulse.y*bodyA.inverseMass;bodyA.anglePrev+=Vector.cross(offset,impulse)*bodyA.inverseInertia}if(!(bodyB.isStatic||bodyB.isSleeping)){offset=Vector.sub(contactVertex,bodyB.position);bodyB.positionPrev.x-=impulse.x*bodyB.inverseMass;bodyB.positionPrev.y-=impulse.y*bodyB.inverseMass;bodyB.anglePrev-=Vector.cross(offset,impulse)*bodyB.inverseInertia}}}};Resolver.solveVelocity=function(pairs,timeScale){var impulse={},timeScaleSquared=timeScale*timeScale;for(var i=0;i<pairs.length;i++){var pair=pairs[i];if(!pair.isActive)continue;var collision=pair.collision,bodyA=collision.bodyA,bodyB=collision.bodyB,normal=collision.normal,tangent=collision.tangent,contacts=pair.activeContacts,contactShare=1/contacts.length;bodyA.velocity.x=bodyA.position.x-bodyA.positionPrev.x;bodyA.velocity.y=bodyA.position.y-bodyA.positionPrev.y;bodyB.velocity.x=bodyB.position.x-bodyB.positionPrev.x;bodyB.velocity.y=bodyB.position.y-bodyB.positionPrev.y;bodyA.angularVelocity=bodyA.angle-bodyA.anglePrev;bodyB.angularVelocity=bodyB.angle-bodyB.anglePrev;for(var j=0;j<contacts.length;j++){var contact=contacts[j],contactVertex=contact.vertex,offsetA=Vector.sub(contactVertex,bodyA.position),offsetB=Vector.sub(contactVertex,bodyB.position),velocityPointA=Vector.add(bodyA.velocity,Vector.mult(Vector.perp(offsetA),bodyA.angularVelocity)),velocityPointB=Vector.add(bodyB.velocity,Vector.mult(Vector.perp(offsetB),bodyB.angularVelocity)),relativeVelocity=Vector.sub(velocityPointA,velocityPointB),normalVelocity=Vector.dot(normal,relativeVelocity);var tangentVelocity=Vector.dot(tangent,relativeVelocity),tangentSpeed=Math.abs(tangentVelocity),tangentVelocityDirection=Common.sign(tangentVelocity);var normalImpulse=(1+pair.restitution)*normalVelocity,normalForce=Common.clamp(pair.separation+normalVelocity,0,1);var tangentImpulse=tangentVelocity;if(tangentSpeed>normalForce*pair.friction*timeScaleSquared)tangentImpulse=normalForce*pair.friction*timeScaleSquared*tangentVelocityDirection;var oAcN=Vector.cross(offsetA,normal),oBcN=Vector.cross(offsetB,normal),share=contactShare/(pair.inverseMass+bodyA.inverseInertia*oAcN*oAcN+bodyB.inverseInertia*oBcN*oBcN);normalImpulse*=share;tangentImpulse*=share;if(normalVelocity<0&&normalVelocity*normalVelocity>_restingThresh*timeScaleSquared){contact.normalImpulse=0;contact.tangentImpulse=0}else{var contactNormalImpulse=contact.normalImpulse;contact.normalImpulse=Math.min(contact.normalImpulse+normalImpulse,0);normalImpulse=contact.normalImpulse-contactNormalImpulse;var contactTangentImpulse=contact.tangentImpulse;contact.tangentImpulse=Common.clamp(contact.tangentImpulse+tangentImpulse,-tangentSpeed,tangentSpeed);tangentImpulse=contact.tangentImpulse-contactTangentImpulse}impulse.x=normal.x*normalImpulse+tangent.x*tangentImpulse;impulse.y=normal.y*normalImpulse+tangent.y*tangentImpulse;if(!(bodyA.isStatic||bodyA.isSleeping)){bodyA.positionPrev.x+=impulse.x*bodyA.inverseMass;bodyA.positionPrev.y+=impulse.y*bodyA.inverseMass;bodyA.anglePrev+=Vector.cross(offsetA,impulse)*bodyA.inverseInertia}if(!(bodyB.isStatic||bodyB.isSleeping)){bodyB.positionPrev.x-=impulse.x*bodyB.inverseMass;bodyB.positionPrev.y-=impulse.y*bodyB.inverseMass;bodyB.anglePrev-=Vector.cross(offsetB,impulse)*bodyB.inverseInertia}}}}})();var SAT={};(function(){SAT.collides=function(bodyA,bodyB,previousCollision){var overlapAB,overlapBA,minOverlap,collision,prevCol=previousCollision,canReusePrevCol=false;if(prevCol){var motion=bodyA.speed*bodyA.speed+bodyA.angularSpeed*bodyA.angularSpeed+bodyB.speed*bodyB.speed+bodyB.angularSpeed*bodyB.angularSpeed;canReusePrevCol=prevCol&&prevCol.collided&&motion<.2;collision=prevCol}else{collision={collided:false,bodyA:bodyA,bodyB:bodyB}}if(prevCol&&canReusePrevCol){var axes=[prevCol.bodyA.axes[prevCol.axisNumber]];minOverlap=_overlapAxes(prevCol.bodyA.vertices,prevCol.bodyB.vertices,axes);collision.reused=true;if(minOverlap.overlap<=0){collision.collided=false;return collision}}else{overlapAB=_overlapAxes(bodyA.vertices,bodyB.vertices,bodyA.axes);if(overlapAB.overlap<=0){collision.collided=false;return collision}overlapBA=_overlapAxes(bodyB.vertices,bodyA.vertices,bodyB.axes);if(overlapBA.overlap<=0){collision.collided=false;return collision}if(overlapAB.overlap<overlapBA.overlap){minOverlap=overlapAB;collision.bodyA=bodyA;collision.bodyB=bodyB}else{minOverlap=overlapBA;collision.bodyA=bodyB;collision.bodyB=bodyA}collision.axisNumber=minOverlap.axisNumber}collision.collided=true;collision.normal=minOverlap.axis;collision.depth=minOverlap.overlap;bodyA=collision.bodyA;bodyB=collision.bodyB;if(Vector.dot(collision.normal,Vector.sub(bodyB.position,bodyA.position))>0)collision.normal=Vector.neg(collision.normal);collision.tangent=Vector.perp(collision.normal);collision.penetration={x:collision.normal.x*collision.depth,y:collision.normal.y*collision.depth};var verticesB=_findSupports(bodyA,bodyB,collision.normal),supports=collision.supports||[];supports.length=0;if(Vertices.contains(bodyA.vertices,verticesB[0]))supports.push(verticesB[0]);if(Vertices.contains(bodyA.vertices,verticesB[1]))supports.push(verticesB[1]);if(supports.length<2){var verticesA=_findSupports(bodyB,bodyA,Vector.neg(collision.normal));if(Vertices.contains(bodyB.vertices,verticesA[0]))supports.push(verticesA[0]);if(supports.length<2&&Vertices.contains(bodyB.vertices,verticesA[1]))supports.push(verticesA[1])}if(supports.length<2)supports=[verticesB[0]];collision.supports=supports;collision.supportCorrected=Vector.sub(supports[0],collision.penetration);return collision};var _overlapAxes=function(verticesA,verticesB,axes){var projectionA={},projectionB={},result={overlap:Number.MAX_VALUE},overlap,axis;for(var i=0;i<axes.length;i++){axis=axes[i];_projectToAxis(projectionA,verticesA,axis);
_projectToAxis(projectionB,verticesB,axis);overlap=projectionA.min<projectionB.min?projectionA.max-projectionB.min:projectionB.max-projectionA.min;if(overlap<=0){result.overlap=overlap;return result}if(overlap<result.overlap){result.overlap=overlap;result.axis=axis;result.axisNumber=i}}return result};var _projectToAxis=function(projection,vertices,axis){var min=Vector.dot(vertices[0],axis),max=min;for(var i=1;i<vertices.length;i+=1){var dot=Vector.dot(vertices[i],axis);if(dot>max){max=dot}else if(dot<min){min=dot}}projection.min=min;projection.max=max};var _findSupports=function(bodyA,bodyB,normal){var nearestDistance=Number.MAX_VALUE,vertexToBody={x:0,y:0},vertices=bodyB.vertices,bodyAPosition=bodyA.position,distance,vertex,vertexA=vertices[0],vertexB=vertices[1];for(var i=0;i<vertices.length;i++){vertex=vertices[i];vertexToBody.x=vertex.x-bodyAPosition.x;vertexToBody.y=vertex.y-bodyAPosition.y;distance=-Vector.dot(normal,vertexToBody);if(distance<nearestDistance){nearestDistance=distance;vertexA=vertex}}var prevIndex=vertexA.index-1>=0?vertexA.index-1:vertices.length-1;vertex=vertices[prevIndex];vertexToBody.x=vertex.x-bodyAPosition.x;vertexToBody.y=vertex.y-bodyAPosition.y;nearestDistance=-Vector.dot(normal,vertexToBody);vertexB=vertex;var nextIndex=(vertexA.index+1)%vertices.length;vertex=vertices[nextIndex];vertexToBody.x=vertex.x-bodyAPosition.x;vertexToBody.y=vertex.y-bodyAPosition.y;distance=-Vector.dot(normal,vertexToBody);if(distance<nearestDistance){vertexB=vertex}return[vertexA,vertexB]}})();var Constraint={};(function(){var _minLength=1e-6,_minDifference=.001;Constraint.create=function(options){var constraint=options;if(constraint.bodyA&&!constraint.pointA)constraint.pointA={x:0,y:0};if(constraint.bodyB&&!constraint.pointB)constraint.pointB={x:0,y:0};var initialPointA=constraint.bodyA?Vector.add(constraint.bodyA.position,constraint.pointA):constraint.pointA,initialPointB=constraint.bodyB?Vector.add(constraint.bodyB.position,constraint.pointB):constraint.pointB,length=Vector.magnitude(Vector.sub(initialPointA,initialPointB));constraint.length=constraint.length||length||_minLength;var render={visible:true,lineWidth:2,strokeStyle:"#666"};constraint.render=Common.extend(render,constraint.render);constraint.id=constraint.id||Common.nextId();constraint.label=constraint.label||"Constraint";constraint.type="constraint";constraint.stiffness=constraint.stiffness||1;constraint.angularStiffness=constraint.angularStiffness||0;constraint.angleA=constraint.bodyA?constraint.bodyA.angle:constraint.angleA;constraint.angleB=constraint.bodyB?constraint.bodyB.angle:constraint.angleB;return constraint};Constraint.solveAll=function(constraints,timeScale){for(var i=0;i<constraints.length;i++){Constraint.solve(constraints[i],timeScale)}};Constraint.solve=function(constraint,timeScale){var bodyA=constraint.bodyA,bodyB=constraint.bodyB,pointA=constraint.pointA,pointB=constraint.pointB;if(bodyA&&!bodyA.isStatic){constraint.pointA=Vector.rotate(pointA,bodyA.angle-constraint.angleA);constraint.angleA=bodyA.angle}if(bodyB&&!bodyB.isStatic){constraint.pointB=Vector.rotate(pointB,bodyB.angle-constraint.angleB);constraint.angleB=bodyB.angle}var pointAWorld=pointA,pointBWorld=pointB;if(bodyA)pointAWorld=Vector.add(bodyA.position,pointA);if(bodyB)pointBWorld=Vector.add(bodyB.position,pointB);if(!pointAWorld||!pointBWorld)return;var delta=Vector.sub(pointAWorld,pointBWorld),currentLength=Vector.magnitude(delta);if(currentLength===0)currentLength=_minLength;var difference=(currentLength-constraint.length)/currentLength,normal=Vector.div(delta,currentLength),force=Vector.mult(delta,difference*.5*constraint.stiffness*timeScale*timeScale);if(Math.abs(1-currentLength/constraint.length)<_minDifference*timeScale)return;var velocityPointA,velocityPointB,offsetA,offsetB,oAn,oBn,bodyADenom,bodyBDenom;if(bodyA&&!bodyA.isStatic){offsetA={x:pointAWorld.x-bodyA.position.x+force.x,y:pointAWorld.y-bodyA.position.y+force.y};bodyA.velocity.x=bodyA.position.x-bodyA.positionPrev.x;bodyA.velocity.y=bodyA.position.y-bodyA.positionPrev.y;bodyA.angularVelocity=bodyA.angle-bodyA.anglePrev;velocityPointA=Vector.add(bodyA.velocity,Vector.mult(Vector.perp(offsetA),bodyA.angularVelocity));oAn=Vector.dot(offsetA,normal);bodyADenom=bodyA.inverseMass+bodyA.inverseInertia*oAn*oAn}else{velocityPointA={x:0,y:0};bodyADenom=bodyA?bodyA.inverseMass:0}if(bodyB&&!bodyB.isStatic){offsetB={x:pointBWorld.x-bodyB.position.x-force.x,y:pointBWorld.y-bodyB.position.y-force.y};bodyB.velocity.x=bodyB.position.x-bodyB.positionPrev.x;bodyB.velocity.y=bodyB.position.y-bodyB.positionPrev.y;bodyB.angularVelocity=bodyB.angle-bodyB.anglePrev;velocityPointB=Vector.add(bodyB.velocity,Vector.mult(Vector.perp(offsetB),bodyB.angularVelocity));oBn=Vector.dot(offsetB,normal);bodyBDenom=bodyB.inverseMass+bodyB.inverseInertia*oBn*oBn}else{velocityPointB={x:0,y:0};bodyBDenom=bodyB?bodyB.inverseMass:0}var relativeVelocity=Vector.sub(velocityPointB,velocityPointA),normalImpulse=Vector.dot(normal,relativeVelocity)/(bodyADenom+bodyBDenom);if(normalImpulse>0)normalImpulse=0;var normalVelocity={x:normal.x*normalImpulse,y:normal.y*normalImpulse};var torque;if(bodyA&&!bodyA.isStatic){torque=Vector.cross(offsetA,normalVelocity)*bodyA.inverseInertia*(1-constraint.angularStiffness);Sleeping.set(bodyA,false);torque=Common.clamp(torque,-.01,.01);bodyA.constraintImpulse.x-=force.x;bodyA.constraintImpulse.y-=force.y;bodyA.constraintImpulse.angle+=torque;bodyA.position.x-=force.x;bodyA.position.y-=force.y;bodyA.angle+=torque}if(bodyB&&!bodyB.isStatic){torque=Vector.cross(offsetB,normalVelocity)*bodyB.inverseInertia*(1-constraint.angularStiffness);Sleeping.set(bodyB,false);torque=Common.clamp(torque,-.01,.01);bodyB.constraintImpulse.x+=force.x;bodyB.constraintImpulse.y+=force.y;bodyB.constraintImpulse.angle-=torque;bodyB.position.x+=force.x;bodyB.position.y+=force.y;bodyB.angle-=torque}};Constraint.postSolveAll=function(bodies){for(var i=0;i<bodies.length;i++){var body=bodies[i],impulse=body.constraintImpulse;Vertices.translate(body.vertices,impulse);if(impulse.angle!==0){Vertices.rotate(body.vertices,impulse.angle,body.position);Axes.rotate(body.axes,impulse.angle);impulse.angle=0}Bounds.update(body.bounds,body.vertices);impulse.x=0;impulse.y=0}}})();var MouseConstraint={};(function(){MouseConstraint.create=function(engine,options){var mouse=(engine?engine.mouse:null)||(options?options.mouse:null);if(!mouse&&engine&&engine.render&&engine.render.canvas){mouse=Mouse.create(engine.render.canvas)}else{mouse=Mouse.create();Common.log("MouseConstraint.create: options.mouse was undefined, engine.render.canvas was undefined, may not function as expected","warn")}var constraint=Constraint.create({label:"Mouse Constraint",pointA:mouse.position,pointB:{x:0,y:0},length:.01,stiffness:.1,angularStiffness:1,render:{strokeStyle:"#90EE90",lineWidth:3}});var defaults={type:"mouseConstraint",mouse:mouse,body:null,constraint:constraint,collisionFilter:{category:1,mask:4294967295,group:0}};var mouseConstraint=Common.extend(defaults,options);Events.on(engine,"tick",function(){var allBodies=Composite.allBodies(engine.world);MouseConstraint.update(mouseConstraint,allBodies);_triggerEvents(mouseConstraint)});return mouseConstraint};MouseConstraint.update=function(mouseConstraint,bodies){var mouse=mouseConstraint.mouse,constraint=mouseConstraint.constraint,body=mouseConstraint.body;if(mouse.button===0){if(!constraint.bodyB){for(var i=0;i<bodies.length;i++){body=bodies[i];if(Bounds.contains(body.bounds,mouse.position)&&Vertices.contains(body.vertices,mouse.position)&&Detector.canCollide(body.collisionFilter,mouseConstraint.collisionFilter)){constraint.pointA=mouse.position;constraint.bodyB=mouseConstraint.body=body;constraint.pointB={x:mouse.position.x-body.position.x,y:mouse.position.y-body.position.y};constraint.angleB=body.angle;Sleeping.set(body,false);Events.trigger(mouseConstraint,"startdrag",{mouse:mouse,body:body})}}}else{Sleeping.set(constraint.bodyB,false);constraint.pointA=mouse.position}}else{constraint.bodyB=mouseConstraint.body=null;constraint.pointB=null;if(body)Events.trigger(mouseConstraint,"enddrag",{mouse:mouse,body:body})}};var _triggerEvents=function(mouseConstraint){var mouse=mouseConstraint.mouse,mouseEvents=mouse.sourceEvents;if(mouseEvents.mousemove)Events.trigger(mouseConstraint,"mousemove",{mouse:mouse});if(mouseEvents.mousedown)Events.trigger(mouseConstraint,"mousedown",{mouse:mouse});if(mouseEvents.mouseup)Events.trigger(mouseConstraint,"mouseup",{mouse:mouse});Mouse.clearSourceEvents(mouse)}})();var Common={};(function(){Common._nextId=0;Common._seed=0;Common.extend=function(obj,deep){var argsStart,args,deepClone;if(typeof deep==="boolean"){argsStart=2;deepClone=deep}else{argsStart=1;deepClone=true}args=Array.prototype.slice.call(arguments,argsStart);for(var i=0;i<args.length;i++){var source=args[i];if(source){for(var prop in source){if(deepClone&&source[prop]&&source[prop].constructor===Object){if(!obj[prop]||obj[prop].constructor===Object){obj[prop]=obj[prop]||{};Common.extend(obj[prop],deepClone,source[prop])}else{obj[prop]=source[prop]}}else{obj[prop]=source[prop]}}}}return obj};Common.clone=function(obj,deep){return Common.extend({},deep,obj)};Common.keys=function(obj){if(Object.keys)return Object.keys(obj);var keys=[];for(var key in obj)keys.push(key);return keys};Common.values=function(obj){var values=[];if(Object.keys){var keys=Object.keys(obj);for(var i=0;i<keys.length;i++){values.push(obj[keys[i]])}return values}for(var key in obj)values.push(obj[key]);return values};Common.shadeColor=function(color,percent){var colorInteger=parseInt(color.slice(1),16),amount=Math.round(2.55*percent),R=(colorInteger>>16)+amount,B=(colorInteger>>8&255)+amount,G=(colorInteger&255)+amount;return"#"+(16777216+(R<255?R<1?0:R:255)*65536+(B<255?B<1?0:B:255)*256+(G<255?G<1?0:G:255)).toString(16).slice(1)};Common.shuffle=function(array){for(var i=array.length-1;i>0;i--){var j=Math.floor(Common.random()*(i+1));var temp=array[i];array[i]=array[j];array[j]=temp}return array};Common.choose=function(choices){return choices[Math.floor(Common.random()*choices.length)]};Common.isElement=function(obj){try{return obj instanceof HTMLElement}catch(e){return typeof obj==="object"&&obj.nodeType===1&&typeof obj.style==="object"&&typeof obj.ownerDocument==="object"}};Common.clamp=function(value,min,max){if(value<min)return min;if(value>max)return max;return value};Common.sign=function(value){return value<0?-1:1};Common.now=function(){var perf=window.performance;if(perf){perf.now=perf.now||perf.webkitNow||perf.msNow||perf.oNow||perf.mozNow;return+perf.now()}return+new Date};Common.random=function(min,max){min=typeof min!=="undefined"?min:0;max=typeof max!=="undefined"?max:1;return min+_seededRandom()*(max-min)};Common.colorToNumber=function(colorString){colorString=colorString.replace("#","");if(colorString.length==3){colorString=colorString.charAt(0)+colorString.charAt(0)+colorString.charAt(1)+colorString.charAt(1)+colorString.charAt(2)+colorString.charAt(2)}return parseInt(colorString,16)};Common.log=function(message,type){if(!console||!console.log||!console.warn)return;var style;switch(type){case"warn":console.warn("Matter.js:",message);break;case"error":console.log("Matter.js:",message);break}};Common.nextId=function(){return Common._nextId++};Common.indexOf=function(haystack,needle){if(haystack.indexOf)return haystack.indexOf(needle);for(var i=0;i<haystack.length;i++){if(haystack[i]===needle)return i}return-1};var _seededRandom=function(){Common._seed=(Common._seed*9301+49297)%233280;return Common._seed/233280}})();var Engine={};(function(){var _fps=60,_delta=1e3/_fps;Engine.create=function(element,options){options=Common.isElement(element)?options:element;element=Common.isElement(element)?element:null;var defaults={enabled:true,positionIterations:6,velocityIterations:4,constraintIterations:2,enableSleeping:false,events:[],timing:{fps:_fps,timestamp:0,delta:_delta,correction:1,deltaMin:1e3/_fps,deltaMax:1e3/(_fps*.5),timeScale:1,isFixed:false,frameRequestId:0},render:{element:element,controller:Render},broadphase:{controller:Grid}};var engine=Common.extend(defaults,options);engine.render=engine.render.controller.create(engine.render);engine.world=World.create(engine.world);engine.pairs=Pairs.create();engine.metrics=engine.metrics||Metrics.create();engine.broadphase=engine.broadphase.controller.create(engine.broadphase);return engine};Engine.update=function(engine,delta,correction){correction=typeof correction!=="undefined"?correction:1;var world=engine.world,timing=engine.timing,broadphase=engine.broadphase,broadphasePairs=[],i;timing.timestamp+=delta*timing.timeScale;timing.correction=correction;var event={timestamp:engine.timing.timestamp};Events.trigger(engine,"beforeUpdate",event);var allBodies=Composite.allBodies(world),allConstraints=Composite.allConstraints(world);Metrics.reset(engine.metrics);if(engine.enableSleeping)Sleeping.update(allBodies,timing.timeScale);_bodiesApplyGravity(allBodies,world.gravity);_bodiesUpdate(allBodies,delta,timing.timeScale,correction,world.bounds);for(i=0;i<engine.constraintIterations;i++){Constraint.solveAll(allConstraints,timing.timeScale)}Constraint.postSolveAll(allBodies);if(broadphase.controller){if(world.isModified)broadphase.controller.clear(broadphase);broadphase.controller.update(broadphase,allBodies,engine,world.isModified);broadphasePairs=broadphase.pairsList}else{broadphasePairs=allBodies}var collisions=broadphase.detector(broadphasePairs,engine);var pairs=engine.pairs,timestamp=timing.timestamp;Pairs.update(pairs,collisions,timestamp);Pairs.removeOld(pairs,timestamp);if(engine.enableSleeping)Sleeping.afterCollisions(pairs.list,timing.timeScale);if(pairs.collisionStart.length>0)Events.trigger(engine,"collisionStart",{pairs:pairs.collisionStart});Resolver.preSolveVelocity(pairs.list);for(i=0;i<engine.velocityIterations;i++){Resolver.solveVelocity(pairs.list,timing.timeScale)}for(i=0;i<engine.positionIterations;i++){Resolver.solvePosition(pairs.list,timing.timeScale)}Resolver.postSolvePosition(allBodies);if(pairs.collisionActive.length>0)Events.trigger(engine,"collisionActive",{pairs:pairs.collisionActive});if(pairs.collisionEnd.length>0)Events.trigger(engine,"collisionEnd",{pairs:pairs.collisionEnd});Metrics.update(engine.metrics,engine);_bodiesClearForces(allBodies);if(world.isModified)Composite.setModified(world,false,false,true);Events.trigger(engine,"afterUpdate",event);return engine};Engine.render=function(engine){var event={timestamp:engine.timing.timestamp};Events.trigger(engine,"beforeRender",event);engine.render.controller.world(engine);Events.trigger(engine,"afterRender",event)};Engine.merge=function(engineA,engineB){Common.extend(engineA,engineB);if(engineB.world){engineA.world=engineB.world;Engine.clear(engineA);var bodies=Composite.allBodies(engineA.world);for(var i=0;i<bodies.length;i++){var body=bodies[i];Sleeping.set(body,false);body.id=Common.nextId()}}};Engine.clear=function(engine){var world=engine.world;Pairs.clear(engine.pairs);var broadphase=engine.broadphase;if(broadphase.controller){var bodies=Composite.allBodies(world);broadphase.controller.clear(broadphase);broadphase.controller.update(broadphase,bodies,engine,true)}};var _bodiesClearForces=function(bodies){for(var i=0;i<bodies.length;i++){var body=bodies[i];body.force.x=0;body.force.y=0;body.torque=0}};var _bodiesApplyGravity=function(bodies,gravity){for(var i=0;i<bodies.length;i++){var body=bodies[i];if(body.isStatic||body.isSleeping)continue;body.force.y+=body.mass*gravity.y*.001;body.force.x+=body.mass*gravity.x*.001}};var _bodiesUpdate=function(bodies,deltaTime,timeScale,correction,worldBounds){for(var i=0;i<bodies.length;i++){var body=bodies[i];if(body.isStatic||body.isSleeping)continue;if(body.bounds.max.x<worldBounds.min.x||body.bounds.min.x>worldBounds.max.x||body.bounds.max.y<worldBounds.min.y||body.bounds.min.y>worldBounds.max.y)continue;Body.update(body,deltaTime,timeScale,correction)}}})();var Events={};(function(){Events.on=function(object,eventNames,callback){var names=eventNames.split(" "),name;for(var i=0;i<names.length;i++){name=names[i];object.events=object.events||{};object.events[name]=object.events[name]||[];object.events[name].push(callback)}return callback};Events.off=function(object,eventNames,callback){if(!eventNames){object.events={};return}if(typeof eventNames==="function"){callback=eventNames;eventNames=Common.keys(object.events).join(" ")}var names=eventNames.split(" ");for(var i=0;i<names.length;i++){var callbacks=object.events[names[i]],newCallbacks=[];if(callback){for(var j=0;j<callbacks.length;j++){if(callbacks[j]!==callback)newCallbacks.push(callbacks[j])}}object.events[names[i]]=newCallbacks}};Events.trigger=function(object,eventNames,event){var names,name,callbacks,eventClone;if(object.events){if(!event)event={};names=eventNames.split(" ");for(var i=0;i<names.length;i++){name=names[i];callbacks=object.events[name];if(callbacks){eventClone=Common.clone(event,false);eventClone.name=name;eventClone.source=object;for(var j=0;j<callbacks.length;j++){callbacks[j].apply(object,[eventClone])}}}}}})();var Metrics={};(function(){Metrics.create=function(){return{extended:false,narrowDetections:0,narrowphaseTests:0,narrowReuse:0,narrowReuseCount:0,midphaseTests:0,broadphaseTests:0,narrowEff:1e-4,midEff:1e-4,broadEff:1e-4,collisions:0,buckets:0,bodies:0,pairs:0}};Metrics.reset=function(metrics){if(metrics.extended){metrics.narrowDetections=0;metrics.narrowphaseTests=0;metrics.narrowReuse=0;metrics.narrowReuseCount=0;metrics.midphaseTests=0;metrics.broadphaseTests=0;metrics.narrowEff=0;metrics.midEff=0;metrics.broadEff=0;metrics.collisions=0;metrics.buckets=0;metrics.pairs=0;metrics.bodies=0}};Metrics.update=function(metrics,engine){if(metrics.extended){var world=engine.world,bodies=Composite.allBodies(world);metrics.collisions=metrics.narrowDetections;metrics.pairs=engine.pairs.list.length;metrics.bodies=bodies.length;metrics.midEff=(metrics.narrowDetections/(metrics.midphaseTests||1)).toFixed(2);metrics.narrowEff=(metrics.narrowDetections/(metrics.narrowphaseTests||1)).toFixed(2);metrics.broadEff=(1-metrics.broadphaseTests/(bodies.length||1)).toFixed(2);metrics.narrowReuse=(metrics.narrowReuseCount/(metrics.narrowphaseTests||1)).toFixed(2)}}})();var Mouse={};(function(){Mouse.create=function(element){var mouse={};if(!element){Common.log("Mouse.create: element was undefined, defaulting to document.body","warn")}mouse.element=element||document.body;mouse.absolute={x:0,y:0};mouse.position={x:0,y:0};mouse.mousedownPosition={x:0,y:0};mouse.mouseupPosition={x:0,y:0};mouse.offset={x:0,y:0};mouse.scale={x:1,y:1};mouse.wheelDelta=0;mouse.button=-1;mouse.pixelRatio=mouse.element.getAttribute("data-pixel-ratio")||1;mouse.sourceEvents={mousemove:null,mousedown:null,mouseup:null,mousewheel:null};mouse.mousemove=function(event){var position=_getRelativeMousePosition(event,mouse.element,mouse.pixelRatio),touches=event.changedTouches;if(touches){mouse.button=0;event.preventDefault()}mouse.absolute.x=position.x;mouse.absolute.y=position.y;mouse.position.x=mouse.absolute.x*mouse.scale.x+mouse.offset.x;mouse.position.y=mouse.absolute.y*mouse.scale.y+mouse.offset.y;mouse.sourceEvents.mousemove=event};mouse.mousedown=function(event){var position=_getRelativeMousePosition(event,mouse.element,mouse.pixelRatio),touches=event.changedTouches;if(touches){mouse.button=0;event.preventDefault()}else{mouse.button=event.button}mouse.absolute.x=position.x;mouse.absolute.y=position.y;mouse.position.x=mouse.absolute.x*mouse.scale.x+mouse.offset.x;mouse.position.y=mouse.absolute.y*mouse.scale.y+mouse.offset.y;mouse.mousedownPosition.x=mouse.position.x;mouse.mousedownPosition.y=mouse.position.y;mouse.sourceEvents.mousedown=event};mouse.mouseup=function(event){var position=_getRelativeMousePosition(event,mouse.element,mouse.pixelRatio),touches=event.changedTouches;if(touches){event.preventDefault()}mouse.button=-1;mouse.absolute.x=position.x;mouse.absolute.y=position.y;mouse.position.x=mouse.absolute.x*mouse.scale.x+mouse.offset.x;mouse.position.y=mouse.absolute.y*mouse.scale.y+mouse.offset.y;mouse.mouseupPosition.x=mouse.position.x;mouse.mouseupPosition.y=mouse.position.y;mouse.sourceEvents.mouseup=event};mouse.mousewheel=function(event){mouse.wheelDelta=Math.max(-1,Math.min(1,event.wheelDelta||-event.detail));event.preventDefault()};Mouse.setElement(mouse,mouse.element);return mouse};Mouse.setElement=function(mouse,element){mouse.element=element;element.addEventListener("mousemove",mouse.mousemove);element.addEventListener("mousedown",mouse.mousedown);element.addEventListener("mouseup",mouse.mouseup);element.addEventListener("mousewheel",mouse.mousewheel);element.addEventListener("DOMMouseScroll",mouse.mousewheel);element.addEventListener("touchmove",mouse.mousemove);element.addEventListener("touchstart",mouse.mousedown);element.addEventListener("touchend",mouse.mouseup)};Mouse.clearSourceEvents=function(mouse){mouse.sourceEvents.mousemove=null;mouse.sourceEvents.mousedown=null;mouse.sourceEvents.mouseup=null;mouse.sourceEvents.mousewheel=null;mouse.wheelDelta=0};Mouse.setOffset=function(mouse,offset){mouse.offset.x=offset.x;mouse.offset.y=offset.y;mouse.position.x=mouse.absolute.x*mouse.scale.x+mouse.offset.x;mouse.position.y=mouse.absolute.y*mouse.scale.y+mouse.offset.y};Mouse.setScale=function(mouse,scale){mouse.scale.x=scale.x;mouse.scale.y=scale.y;mouse.position.x=mouse.absolute.x*mouse.scale.x+mouse.offset.x;mouse.position.y=mouse.absolute.y*mouse.scale.y+mouse.offset.y};var _getRelativeMousePosition=function(event,element,pixelRatio){var elementBounds=element.getBoundingClientRect(),rootNode=document.documentElement||document.body.parentNode||document.body,scrollX=window.pageXOffset!==undefined?window.pageXOffset:rootNode.scrollLeft,scrollY=window.pageYOffset!==undefined?window.pageYOffset:rootNode.scrollTop,touches=event.changedTouches,x,y;if(touches){x=touches[0].pageX-elementBounds.left-scrollX;y=touches[0].pageY-elementBounds.top-scrollY}else{x=event.pageX-elementBounds.left-scrollX;y=event.pageY-elementBounds.top-scrollY}return{x:x/(element.clientWidth/element.width*pixelRatio),y:y/(element.clientHeight/element.height*pixelRatio)}}})();var Runner={};(function(){var _fps=60,_deltaSampleSize=_fps,_delta=1e3/_fps;var _requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(function(){callback(Common.now())},_delta)};var _cancelAnimationFrame=window.cancelAnimationFrame||window.mozCancelAnimationFrame||window.webkitCancelAnimationFrame||window.msCancelAnimationFrame;Runner.run=function(engine){var counterTimestamp=0,frameCounter=0,deltaHistory=[],timePrev,timeScalePrev=1;(function render(time){var timing=engine.timing,delta,correction=1;timing.frameRequestId=_requestAnimationFrame(render);if(!engine.enabled)return;var event={timestamp:time};Events.trigger(engine,"beforeTick",event);if(timing.isFixed){delta=timing.delta}else{delta=time-timePrev||timing.delta;timePrev=time;deltaHistory.push(delta);deltaHistory=deltaHistory.slice(-_deltaSampleSize);delta=Math.min.apply(null,deltaHistory);delta=delta<timing.deltaMin?timing.deltaMin:delta;delta=delta>timing.deltaMax?timing.deltaMax:delta;correction=delta/timing.delta;timing.delta=delta}if(timeScalePrev!==0)correction*=timing.timeScale/timeScalePrev;if(timing.timeScale===0)correction=0;timeScalePrev=timing.timeScale;frameCounter+=1;if(time-counterTimestamp>=1e3){timing.fps=frameCounter*((time-counterTimestamp)/1e3);counterTimestamp=time;frameCounter=0}Events.trigger(engine,"tick",event);if(engine.world.isModified&&engine.render.controller.clear)engine.render.controller.clear(engine.render);Engine.update(engine,delta,correction);Engine.render(engine);Events.trigger(engine,"afterTick",event)})()};Runner.stop=function(engine){_cancelAnimationFrame(engine.timing.frameRequestId)}})();var Sleeping={};(function(){Sleeping._motionWakeThreshold=.18;Sleeping._motionSleepThreshold=.08;Sleeping._minBias=.9;Sleeping.update=function(bodies,timeScale){var timeFactor=timeScale*timeScale*timeScale;for(var i=0;i<bodies.length;i++){var body=bodies[i],motion=body.speed*body.speed+body.angularSpeed*body.angularSpeed;if(body.force.x>0||body.force.y>0){Sleeping.set(body,false);continue}var minMotion=Math.min(body.motion,motion),maxMotion=Math.max(body.motion,motion);body.motion=Sleeping._minBias*minMotion+(1-Sleeping._minBias)*maxMotion;if(body.sleepThreshold>0&&body.motion<Sleeping._motionSleepThreshold*timeFactor){body.sleepCounter+=1;if(body.sleepCounter>=body.sleepThreshold)Sleeping.set(body,true)}else if(body.sleepCounter>0){body.sleepCounter-=1}}};Sleeping.afterCollisions=function(pairs,timeScale){var timeFactor=timeScale*timeScale*timeScale;for(var i=0;i<pairs.length;i++){var pair=pairs[i];if(!pair.isActive)continue;var collision=pair.collision,bodyA=collision.bodyA,bodyB=collision.bodyB;if(bodyA.isSleeping&&bodyB.isSleeping||bodyA.isStatic||bodyB.isStatic)continue;if(bodyA.isSleeping||bodyB.isSleeping){var sleepingBody=bodyA.isSleeping&&!bodyA.isStatic?bodyA:bodyB,movingBody=sleepingBody===bodyA?bodyB:bodyA;if(!sleepingBody.isStatic&&movingBody.motion>Sleeping._motionWakeThreshold*timeFactor){Sleeping.set(sleepingBody,false)}}}};Sleeping.set=function(body,isSleeping){if(isSleeping){body.isSleeping=true;body.sleepCounter=body.sleepThreshold;body.positionImpulse.x=0;body.positionImpulse.y=0;body.positionPrev.x=body.position.x;body.positionPrev.y=body.position.y;body.anglePrev=body.angle;body.speed=0;body.angularSpeed=0;body.motion=0}else{body.isSleeping=false;body.sleepCounter=0}}})();var Bodies={};(function(){Bodies.rectangle=function(x,y,width,height,options){options=options||{};var rectangle={label:"Rectangle Body",position:{x:x,y:y},vertices:Vertices.fromPath("L 0 0 L "+width+" 0 L "+width+" "+height+" L 0 "+height)};if(options.chamfer){var chamfer=options.chamfer;rectangle.vertices=Vertices.chamfer(rectangle.vertices,chamfer.radius,chamfer.quality,chamfer.qualityMin,chamfer.qualityMax);delete options.chamfer}return Body.create(Common.extend({},rectangle,options))};Bodies.trapezoid=function(x,y,width,height,slope,options){options=options||{};slope*=.5;var roof=(1-slope*2)*width;var x1=width*slope,x2=x1+roof,x3=x2+x1;var trapezoid={label:"Trapezoid Body",position:{x:x,y:y},vertices:Vertices.fromPath("L 0 0 L "+x1+" "+-height+" L "+x2+" "+-height+" L "+x3+" 0")};if(options.chamfer){var chamfer=options.chamfer;trapezoid.vertices=Vertices.chamfer(trapezoid.vertices,chamfer.radius,chamfer.quality,chamfer.qualityMin,chamfer.qualityMax);delete options.chamfer}return Body.create(Common.extend({},trapezoid,options))};Bodies.circle=function(x,y,radius,options,maxSides){options=options||{};options.label="Circle Body";maxSides=maxSides||25;var sides=Math.ceil(Math.max(10,Math.min(maxSides,radius)));if(sides%2===1)sides+=1;options.circleRadius=radius;return Bodies.polygon(x,y,sides,radius,options)};Bodies.polygon=function(x,y,sides,radius,options){options=options||{};if(sides<3)return Bodies.circle(x,y,radius,options);var theta=2*Math.PI/sides,path="",offset=theta*.5;for(var i=0;i<sides;i+=1){var angle=offset+i*theta,xx=Math.cos(angle)*radius,yy=Math.sin(angle)*radius;path+="L "+xx.toFixed(3)+" "+yy.toFixed(3)+" "}var polygon={label:"Polygon Body",position:{x:x,y:y},vertices:Vertices.fromPath(path)};if(options.chamfer){var chamfer=options.chamfer;polygon.vertices=Vertices.chamfer(polygon.vertices,chamfer.radius,chamfer.quality,chamfer.qualityMin,chamfer.qualityMax);delete options.chamfer}return Body.create(Common.extend({},polygon,options))}})();var Composites={};(function(){Composites.stack=function(xx,yy,columns,rows,columnGap,rowGap,callback){var stack=Composite.create({label:"Stack"}),x=xx,y=yy,lastBody,i=0;for(var row=0;row<rows;row++){var maxHeight=0;for(var column=0;column<columns;column++){var body=callback(x,y,column,row,lastBody,i);if(body){var bodyHeight=body.bounds.max.y-body.bounds.min.y,bodyWidth=body.bounds.max.x-body.bounds.min.x;if(bodyHeight>maxHeight)maxHeight=bodyHeight;Body.translate(body,{x:bodyWidth*.5,y:bodyHeight*.5});x=body.bounds.max.x+columnGap;Composite.addBody(stack,body);lastBody=body;i+=1}}y+=maxHeight+rowGap;x=xx}return stack};Composites.chain=function(composite,xOffsetA,yOffsetA,xOffsetB,yOffsetB,options){var bodies=composite.bodies;for(var i=1;i<bodies.length;i++){var bodyA=bodies[i-1],bodyB=bodies[i],bodyAHeight=bodyA.bounds.max.y-bodyA.bounds.min.y,bodyAWidth=bodyA.bounds.max.x-bodyA.bounds.min.x,bodyBHeight=bodyB.bounds.max.y-bodyB.bounds.min.y,bodyBWidth=bodyB.bounds.max.x-bodyB.bounds.min.x;var defaults={bodyA:bodyA,pointA:{x:bodyAWidth*xOffsetA,y:bodyAHeight*yOffsetA},bodyB:bodyB,pointB:{x:bodyBWidth*xOffsetB,y:bodyBHeight*yOffsetB}};var constraint=Common.extend(defaults,options);Composite.addConstraint(composite,Constraint.create(constraint))}composite.label+=" Chain";return composite};Composites.mesh=function(composite,columns,rows,crossBrace,options){var bodies=composite.bodies,row,col,bodyA,bodyB,bodyC;for(row=0;row<rows;row++){for(col=0;col<columns;col++){if(col>0){bodyA=bodies[col-1+row*columns];bodyB=bodies[col+row*columns];Composite.addConstraint(composite,Constraint.create(Common.extend({bodyA:bodyA,bodyB:bodyB},options)))}}for(col=0;col<columns;col++){if(row>0){bodyA=bodies[col+(row-1)*columns];bodyB=bodies[col+row*columns];Composite.addConstraint(composite,Constraint.create(Common.extend({bodyA:bodyA,bodyB:bodyB},options)));if(crossBrace&&col>0){bodyC=bodies[col-1+(row-1)*columns];Composite.addConstraint(composite,Constraint.create(Common.extend({bodyA:bodyC,bodyB:bodyB},options)))}if(crossBrace&&col<columns-1){bodyC=bodies[col+1+(row-1)*columns];Composite.addConstraint(composite,Constraint.create(Common.extend({bodyA:bodyC,bodyB:bodyB},options)))}}}}composite.label+=" Mesh";return composite};Composites.pyramid=function(xx,yy,columns,rows,columnGap,rowGap,callback){return Composites.stack(xx,yy,columns,rows,columnGap,rowGap,function(x,y,column,row,lastBody,i){var actualRows=Math.min(rows,Math.ceil(columns/2)),lastBodyWidth=lastBody?lastBody.bounds.max.x-lastBody.bounds.min.x:0;if(row>actualRows)return;row=actualRows-row;var start=row,end=columns-1-row;if(column<start||column>end)return;if(i===1){Body.translate(lastBody,{x:(column+(columns%2===1?1:-1))*lastBodyWidth,y:0})}var xOffset=lastBody?column*lastBodyWidth:0;return callback(xx+xOffset+column*columnGap,y,column,row,lastBody,i)})};Composites.newtonsCradle=function(xx,yy,number,size,length){var newtonsCradle=Composite.create({label:"Newtons Cradle"});for(var i=0;i<number;i++){var separation=1.9,circle=Bodies.circle(xx+i*(size*separation),yy+length,size,{inertia:99999,restitution:1,friction:0,frictionAir:1e-4,slop:.01}),constraint=Constraint.create({pointA:{x:xx+i*(size*separation),y:yy},bodyB:circle});Composite.addBody(newtonsCradle,circle);Composite.addConstraint(newtonsCradle,constraint)}return newtonsCradle};Composites.car=function(xx,yy,width,height,wheelSize){var group=Body.nextGroup(true),wheelBase=-20,wheelAOffset=-width*.5+wheelBase,wheelBOffset=width*.5-wheelBase,wheelYOffset=0;var car=Composite.create({label:"Car"}),body=Bodies.trapezoid(xx,yy,width,height,.3,{collisionFilter:{group:group},friction:.01,chamfer:{radius:10}});var wheelA=Bodies.circle(xx+wheelAOffset,yy+wheelYOffset,wheelSize,{collisionFilter:{group:group},restitution:.5,friction:.9,density:.01});var wheelB=Bodies.circle(xx+wheelBOffset,yy+wheelYOffset,wheelSize,{collisionFilter:{group:group},restitution:.5,friction:.9,density:.01});var axelA=Constraint.create({bodyA:body,pointA:{x:wheelAOffset,y:wheelYOffset},bodyB:wheelA,stiffness:.5});var axelB=Constraint.create({bodyA:body,pointA:{x:wheelBOffset,y:wheelYOffset},bodyB:wheelB,stiffness:.5});Composite.addBody(car,body);Composite.addBody(car,wheelA);Composite.addBody(car,wheelB);Composite.addConstraint(car,axelA);
Composite.addConstraint(car,axelB);return car};Composites.softBody=function(xx,yy,columns,rows,columnGap,rowGap,crossBrace,particleRadius,particleOptions,constraintOptions){particleOptions=Common.extend({inertia:Infinity},particleOptions);constraintOptions=Common.extend({stiffness:.4},constraintOptions);var softBody=Composites.stack(xx,yy,columns,rows,columnGap,rowGap,function(x,y){return Bodies.circle(x,y,particleRadius,particleOptions)});Composites.mesh(softBody,columns,rows,crossBrace,constraintOptions);softBody.label="Soft Body";return softBody}})();var Axes={};(function(){Axes.fromVertices=function(vertices){var axes={};for(var i=0;i<vertices.length;i++){var j=(i+1)%vertices.length,normal=Vector.normalise({x:vertices[j].y-vertices[i].y,y:vertices[i].x-vertices[j].x}),gradient=normal.y===0?Infinity:normal.x/normal.y;gradient=gradient.toFixed(3).toString();axes[gradient]=normal}return Common.values(axes)};Axes.rotate=function(axes,angle){if(angle===0)return;var cos=Math.cos(angle),sin=Math.sin(angle);for(var i=0;i<axes.length;i++){var axis=axes[i],xx;xx=axis.x*cos-axis.y*sin;axis.y=axis.x*sin+axis.y*cos;axis.x=xx}}})();var Bounds={};(function(){Bounds.create=function(vertices){var bounds={min:{x:0,y:0},max:{x:0,y:0}};if(vertices)Bounds.update(bounds,vertices);return bounds};Bounds.update=function(bounds,vertices,velocity){bounds.min.x=Number.MAX_VALUE;bounds.max.x=Number.MIN_VALUE;bounds.min.y=Number.MAX_VALUE;bounds.max.y=Number.MIN_VALUE;for(var i=0;i<vertices.length;i++){var vertex=vertices[i];if(vertex.x>bounds.max.x)bounds.max.x=vertex.x;if(vertex.x<bounds.min.x)bounds.min.x=vertex.x;if(vertex.y>bounds.max.y)bounds.max.y=vertex.y;if(vertex.y<bounds.min.y)bounds.min.y=vertex.y}if(velocity){if(velocity.x>0){bounds.max.x+=velocity.x}else{bounds.min.x+=velocity.x}if(velocity.y>0){bounds.max.y+=velocity.y}else{bounds.min.y+=velocity.y}}};Bounds.contains=function(bounds,point){return point.x>=bounds.min.x&&point.x<=bounds.max.x&&point.y>=bounds.min.y&&point.y<=bounds.max.y};Bounds.overlaps=function(boundsA,boundsB){return boundsA.min.x<=boundsB.max.x&&boundsA.max.x>=boundsB.min.x&&boundsA.max.y>=boundsB.min.y&&boundsA.min.y<=boundsB.max.y};Bounds.translate=function(bounds,vector){bounds.min.x+=vector.x;bounds.max.x+=vector.x;bounds.min.y+=vector.y;bounds.max.y+=vector.y};Bounds.shift=function(bounds,position){var deltaX=bounds.max.x-bounds.min.x,deltaY=bounds.max.y-bounds.min.y;bounds.min.x=position.x;bounds.max.x=position.x+deltaX;bounds.min.y=position.y;bounds.max.y=position.y+deltaY}})();var Vector={};(function(){Vector.clone=function(vector){return{x:vector.x,y:vector.y}};Vector.magnitude=function(vector){return Math.sqrt(vector.x*vector.x+vector.y*vector.y)};Vector.magnitudeSquared=function(vector){return vector.x*vector.x+vector.y*vector.y};Vector.rotate=function(vector,angle){var cos=Math.cos(angle),sin=Math.sin(angle);return{x:vector.x*cos-vector.y*sin,y:vector.x*sin+vector.y*cos}};Vector.rotateAbout=function(vector,angle,point){var cos=Math.cos(angle),sin=Math.sin(angle);return{x:point.x+((vector.x-point.x)*cos-(vector.y-point.y)*sin),y:point.y+((vector.x-point.x)*sin+(vector.y-point.y)*cos)}};Vector.normalise=function(vector){var magnitude=Vector.magnitude(vector);if(magnitude===0)return{x:0,y:0};return{x:vector.x/magnitude,y:vector.y/magnitude}};Vector.dot=function(vectorA,vectorB){return vectorA.x*vectorB.x+vectorA.y*vectorB.y};Vector.cross=function(vectorA,vectorB){return vectorA.x*vectorB.y-vectorA.y*vectorB.x};Vector.add=function(vectorA,vectorB){return{x:vectorA.x+vectorB.x,y:vectorA.y+vectorB.y}};Vector.sub=function(vectorA,vectorB){return{x:vectorA.x-vectorB.x,y:vectorA.y-vectorB.y}};Vector.mult=function(vector,scalar){return{x:vector.x*scalar,y:vector.y*scalar}};Vector.div=function(vector,scalar){return{x:vector.x/scalar,y:vector.y/scalar}};Vector.perp=function(vector,negate){negate=negate===true?-1:1;return{x:negate*-vector.y,y:negate*vector.x}};Vector.neg=function(vector){return{x:-vector.x,y:-vector.y}};Vector.angle=function(vectorA,vectorB){return Math.atan2(vectorB.y-vectorA.y,vectorB.x-vectorA.x)}})();var Vertices={};(function(){Vertices.create=function(points,body){var vertices=[];for(var i=0;i<points.length;i++){var point=points[i],vertex={};vertex.x=point.x;vertex.y=point.y;vertex.index=i;vertex.body=body;vertices.push(vertex)}return vertices};Vertices.fromPath=function(path,body){var pathPattern=/L\s*([\-\d\.]*)\s*([\-\d\.]*)/gi,points=[];path.replace(pathPattern,function(match,x,y){points.push({x:parseFloat(x),y:parseFloat(y)})});return Vertices.create(points,body)};Vertices.centre=function(vertices){var area=Vertices.area(vertices,true),centre={x:0,y:0},cross,temp,j;for(var i=0;i<vertices.length;i++){j=(i+1)%vertices.length;cross=Vector.cross(vertices[i],vertices[j]);temp=Vector.mult(Vector.add(vertices[i],vertices[j]),cross);centre=Vector.add(centre,temp)}return Vector.div(centre,6*area)};Vertices.area=function(vertices,signed){var area=0,j=vertices.length-1;for(var i=0;i<vertices.length;i++){area+=(vertices[j].x-vertices[i].x)*(vertices[j].y+vertices[i].y);j=i}if(signed)return area/2;return Math.abs(area)/2};Vertices.inertia=function(vertices,mass){var numerator=0,denominator=0,v=vertices,cross,j;for(var n=0;n<v.length;n++){j=(n+1)%v.length;cross=Math.abs(Vector.cross(v[j],v[n]));numerator+=cross*(Vector.dot(v[j],v[j])+Vector.dot(v[j],v[n])+Vector.dot(v[n],v[n]));denominator+=cross}return mass/6*(numerator/denominator)};Vertices.translate=function(vertices,vector,scalar){var i;if(scalar){for(i=0;i<vertices.length;i++){vertices[i].x+=vector.x*scalar;vertices[i].y+=vector.y*scalar}}else{for(i=0;i<vertices.length;i++){vertices[i].x+=vector.x;vertices[i].y+=vector.y}}return vertices};Vertices.rotate=function(vertices,angle,point){if(angle===0)return;var cos=Math.cos(angle),sin=Math.sin(angle);for(var i=0;i<vertices.length;i++){var vertice=vertices[i],dx=vertice.x-point.x,dy=vertice.y-point.y;vertice.x=point.x+(dx*cos-dy*sin);vertice.y=point.y+(dx*sin+dy*cos)}return vertices};Vertices.contains=function(vertices,point){for(var i=0;i<vertices.length;i++){var vertice=vertices[i],nextVertice=vertices[(i+1)%vertices.length];if((point.x-vertice.x)*(nextVertice.y-vertice.y)+(point.y-vertice.y)*(vertice.x-nextVertice.x)>0){return false}}return true};Vertices.scale=function(vertices,scaleX,scaleY,point){if(scaleX===1&&scaleY===1)return vertices;point=point||Vertices.centre(vertices);var vertex,delta;for(var i=0;i<vertices.length;i++){vertex=vertices[i];delta=Vector.sub(vertex,point);vertices[i].x=point.x+delta.x*scaleX;vertices[i].y=point.y+delta.y*scaleY}return vertices};Vertices.chamfer=function(vertices,radius,quality,qualityMin,qualityMax){radius=radius||[8];if(!radius.length)radius=[radius];quality=typeof quality!=="undefined"?quality:-1;qualityMin=qualityMin||2;qualityMax=qualityMax||14;var newVertices=[];for(var i=0;i<vertices.length;i++){var prevVertex=vertices[i-1>=0?i-1:vertices.length-1],vertex=vertices[i],nextVertex=vertices[(i+1)%vertices.length],currentRadius=radius[i<radius.length?i:radius.length-1];if(currentRadius===0){newVertices.push(vertex);continue}var prevNormal=Vector.normalise({x:vertex.y-prevVertex.y,y:prevVertex.x-vertex.x});var nextNormal=Vector.normalise({x:nextVertex.y-vertex.y,y:vertex.x-nextVertex.x});var diagonalRadius=Math.sqrt(2*Math.pow(currentRadius,2)),radiusVector=Vector.mult(Common.clone(prevNormal),currentRadius),midNormal=Vector.normalise(Vector.mult(Vector.add(prevNormal,nextNormal),.5)),scaledVertex=Vector.sub(vertex,Vector.mult(midNormal,diagonalRadius));var precision=quality;if(quality===-1){precision=Math.pow(currentRadius,.32)*1.75}precision=Common.clamp(precision,qualityMin,qualityMax);if(precision%2===1)precision+=1;var alpha=Math.acos(Vector.dot(prevNormal,nextNormal)),theta=alpha/precision;for(var j=0;j<precision;j++){newVertices.push(Vector.add(Vector.rotate(radiusVector,theta*j),scaledVertex))}}return newVertices}})();var Render={};(function(){Render.create=function(options){var defaults={controller:Render,element:null,canvas:null,options:{width:800,height:600,pixelRatio:1,background:"#fafafa",wireframeBackground:"#222",hasBounds:false,enabled:true,wireframes:true,showSleeping:true,showDebug:false,showBroadphase:false,showBounds:false,showVelocity:false,showCollisions:false,showAxes:false,showPositions:false,showAngleIndicator:false,showIds:false,showShadows:false}};var render=Common.extend(defaults,options);render.canvas=render.canvas||_createCanvas(render.options.width,render.options.height);render.context=render.canvas.getContext("2d");render.textures={};render.bounds=render.bounds||{min:{x:0,y:0},max:{x:render.options.width,y:render.options.height}};if(render.options.pixelRatio!==1){Render.setPixelRatio(render,render.options.pixelRatio)}if(Common.isElement(render.element)){render.element.appendChild(render.canvas)}else{Common.log("Render.create: options.element was undefined, render.canvas was created but not appended","warn")}return render};Render.setPixelRatio=function(render,pixelRatio){var options=render.options,canvas=render.canvas;if(pixelRatio==="auto"){pixelRatio=_getPixelRatio(canvas)}options.pixelRatio=pixelRatio;canvas.setAttribute("data-pixel-ratio",pixelRatio);canvas.width=options.width*pixelRatio;canvas.height=options.height*pixelRatio;canvas.style.width=options.width+"px";canvas.style.height=options.height+"px";render.context.scale(pixelRatio,pixelRatio)};Render.world=function(engine){var render=engine.render,world=engine.world,canvas=render.canvas,context=render.context,options=render.options,allBodies=Composite.allBodies(world),allConstraints=Composite.allConstraints(world),background=options.wireframes?options.wireframeBackground:options.background,bodies=[],constraints=[],i;if(render.currentBackground!==background)_applyBackground(render,background);context.globalCompositeOperation="source-in";context.fillStyle="transparent";context.fillRect(0,0,canvas.width,canvas.height);context.globalCompositeOperation="source-over";if(options.hasBounds){var boundsWidth=render.bounds.max.x-render.bounds.min.x,boundsHeight=render.bounds.max.y-render.bounds.min.y,boundsScaleX=boundsWidth/options.width,boundsScaleY=boundsHeight/options.height;for(i=0;i<allBodies.length;i++){var body=allBodies[i];if(Bounds.overlaps(body.bounds,render.bounds))bodies.push(body)}for(i=0;i<allConstraints.length;i++){var constraint=allConstraints[i],bodyA=constraint.bodyA,bodyB=constraint.bodyB,pointAWorld=constraint.pointA,pointBWorld=constraint.pointB;if(bodyA)pointAWorld=Vector.add(bodyA.position,constraint.pointA);if(bodyB)pointBWorld=Vector.add(bodyB.position,constraint.pointB);if(!pointAWorld||!pointBWorld)continue;if(Bounds.contains(render.bounds,pointAWorld)||Bounds.contains(render.bounds,pointBWorld))constraints.push(constraint)}context.scale(1/boundsScaleX,1/boundsScaleY);context.translate(-render.bounds.min.x,-render.bounds.min.y)}else{constraints=allConstraints;bodies=allBodies}if(!options.wireframes||engine.enableSleeping&&options.showSleeping){Render.bodies(engine,bodies,context)}else{Render.bodyWireframes(engine,bodies,context)}if(options.showBounds)Render.bodyBounds(engine,bodies,context);if(options.showAxes||options.showAngleIndicator)Render.bodyAxes(engine,bodies,context);if(options.showPositions)Render.bodyPositions(engine,bodies,context);if(options.showVelocity)Render.bodyVelocity(engine,bodies,context);if(options.showIds)Render.bodyIds(engine,bodies,context);if(options.showCollisions)Render.collisions(engine,engine.pairs.list,context);Render.constraints(constraints,context);if(options.showBroadphase&&engine.broadphase.controller===Grid)Render.grid(engine,engine.broadphase,context);if(options.showDebug)Render.debug(engine,context);if(options.hasBounds){context.setTransform(options.pixelRatio,0,0,options.pixelRatio,0,0)}};Render.debug=function(engine,context){var c=context,world=engine.world,render=engine.render,options=render.options,bodies=Composite.allBodies(world),space=" ";if(engine.timing.timestamp-(render.debugTimestamp||0)>=500){var text="";text+="fps: "+Math.round(engine.timing.fps)+space;if(engine.metrics.extended){text+="delta: "+engine.timing.delta.toFixed(3)+space;text+="correction: "+engine.timing.correction.toFixed(3)+space;text+="bodies: "+bodies.length+space;if(engine.broadphase.controller===Grid)text+="buckets: "+engine.metrics.buckets+space;text+="\n";text+="collisions: "+engine.metrics.collisions+space;text+="pairs: "+engine.pairs.list.length+space;text+="broad: "+engine.metrics.broadEff+space;text+="mid: "+engine.metrics.midEff+space;text+="narrow: "+engine.metrics.narrowEff+space}render.debugString=text;render.debugTimestamp=engine.timing.timestamp}if(render.debugString){c.font="12px Arial";if(options.wireframes){c.fillStyle="rgba(255,255,255,0.5)"}else{c.fillStyle="rgba(0,0,0,0.5)"}var split=render.debugString.split("\n");for(var i=0;i<split.length;i++){c.fillText(split[i],50,50+i*18)}}};Render.constraints=function(constraints,context){var c=context;for(var i=0;i<constraints.length;i++){var constraint=constraints[i];if(!constraint.render.visible||!constraint.pointA||!constraint.pointB)continue;var bodyA=constraint.bodyA,bodyB=constraint.bodyB;if(bodyA){c.beginPath();c.moveTo(bodyA.position.x+constraint.pointA.x,bodyA.position.y+constraint.pointA.y)}else{c.beginPath();c.moveTo(constraint.pointA.x,constraint.pointA.y)}if(bodyB){c.lineTo(bodyB.position.x+constraint.pointB.x,bodyB.position.y+constraint.pointB.y)}else{c.lineTo(constraint.pointB.x,constraint.pointB.y)}c.lineWidth=constraint.render.lineWidth;c.strokeStyle=constraint.render.strokeStyle;c.stroke()}};Render.bodyShadows=function(engine,bodies,context){var c=context,render=engine.render;for(var i=0;i<bodies.length;i++){var body=bodies[i];if(!body.render.visible)continue;if(body.circleRadius){c.beginPath();c.arc(body.position.x,body.position.y,body.circleRadius,0,2*Math.PI);c.closePath()}else{c.beginPath();c.moveTo(body.vertices[0].x,body.vertices[0].y);for(var j=1;j<body.vertices.length;j++){c.lineTo(body.vertices[j].x,body.vertices[j].y)}c.closePath()}var distanceX=body.position.x-render.options.width*.5,distanceY=body.position.y-render.options.height*.2,distance=Math.abs(distanceX)+Math.abs(distanceY);c.shadowColor="rgba(0,0,0,0.15)";c.shadowOffsetX=.05*distanceX;c.shadowOffsetY=.05*distanceY;c.shadowBlur=1+12*Math.min(1,distance/1e3);c.fill();c.shadowColor=null;c.shadowOffsetX=null;c.shadowOffsetY=null;c.shadowBlur=null}};Render.bodies=function(engine,bodies,context){var c=context,render=engine.render,options=render.options,i;for(i=0;i<bodies.length;i++){var body=bodies[i];if(!body.render.visible)continue;if(body.render.sprite&&body.render.sprite.texture&&!options.wireframes){var sprite=body.render.sprite,texture=_getTexture(render,sprite.texture);if(options.showSleeping&&body.isSleeping)c.globalAlpha=.5;c.translate(body.position.x,body.position.y);c.rotate(body.angle);c.drawImage(texture,texture.width*-.5*sprite.xScale,texture.height*-.5*sprite.yScale,texture.width*sprite.xScale,texture.height*sprite.yScale);c.rotate(-body.angle);c.translate(-body.position.x,-body.position.y);if(options.showSleeping&&body.isSleeping)c.globalAlpha=1}else{if(body.circleRadius){c.beginPath();c.arc(body.position.x,body.position.y,body.circleRadius,0,2*Math.PI)}else{c.beginPath();c.moveTo(body.vertices[0].x,body.vertices[0].y);for(var j=1;j<body.vertices.length;j++){c.lineTo(body.vertices[j].x,body.vertices[j].y)}c.closePath()}if(!options.wireframes){if(options.showSleeping&&body.isSleeping){c.fillStyle=Common.shadeColor(body.render.fillStyle,50)}else{c.fillStyle=body.render.fillStyle}c.lineWidth=body.render.lineWidth;c.strokeStyle=body.render.strokeStyle;c.fill();c.stroke()}else{c.lineWidth=1;c.strokeStyle="#bbb";if(options.showSleeping&&body.isSleeping)c.strokeStyle="rgba(255,255,255,0.2)";c.stroke()}}}};Render.bodyWireframes=function(engine,bodies,context){var c=context,i,j;c.beginPath();for(i=0;i<bodies.length;i++){var body=bodies[i];if(!body.render.visible)continue;c.moveTo(body.vertices[0].x,body.vertices[0].y);for(j=1;j<body.vertices.length;j++){c.lineTo(body.vertices[j].x,body.vertices[j].y)}c.lineTo(body.vertices[0].x,body.vertices[0].y)}c.lineWidth=1;c.strokeStyle="#bbb";c.stroke()};Render.bodyBounds=function(engine,bodies,context){var c=context,render=engine.render,options=render.options;c.beginPath();for(var i=0;i<bodies.length;i++){var body=bodies[i];if(body.render.visible)c.rect(body.bounds.min.x,body.bounds.min.y,body.bounds.max.x-body.bounds.min.x,body.bounds.max.y-body.bounds.min.y)}if(options.wireframes){c.strokeStyle="rgba(255,255,255,0.08)"}else{c.strokeStyle="rgba(0,0,0,0.1)"}c.lineWidth=1;c.stroke()};Render.bodyAxes=function(engine,bodies,context){var c=context,render=engine.render,options=render.options,i,j;c.beginPath();for(i=0;i<bodies.length;i++){var body=bodies[i];if(!body.render.visible)continue;if(options.showAxes){for(j=0;j<body.axes.length;j++){var axis=body.axes[j];c.moveTo(body.position.x,body.position.y);c.lineTo(body.position.x+axis.x*20,body.position.y+axis.y*20)}}else{c.moveTo(body.position.x,body.position.y);c.lineTo((body.vertices[0].x+body.vertices[body.vertices.length-1].x)/2,(body.vertices[0].y+body.vertices[body.vertices.length-1].y)/2)}}if(options.wireframes){c.strokeStyle="indianred"}else{c.strokeStyle="rgba(0,0,0,0.3)"}c.lineWidth=1;c.stroke()};Render.bodyPositions=function(engine,bodies,context){var c=context,render=engine.render,options=render.options,body,i;c.beginPath();for(i=0;i<bodies.length;i++){body=bodies[i];if(body.render.visible){c.arc(body.position.x,body.position.y,3,0,2*Math.PI,false);c.closePath()}}if(options.wireframes){c.fillStyle="indianred"}else{c.fillStyle="rgba(0,0,0,0.5)"}c.fill();c.beginPath();for(i=0;i<bodies.length;i++){body=bodies[i];if(body.render.visible){c.arc(body.positionPrev.x,body.positionPrev.y,2,0,2*Math.PI,false);c.closePath()}}c.fillStyle="rgba(255,165,0,0.8)";c.fill()};Render.bodyVelocity=function(engine,bodies,context){var c=context;c.beginPath();for(var i=0;i<bodies.length;i++){var body=bodies[i];if(!body.render.visible)continue;c.moveTo(body.position.x,body.position.y);c.lineTo(body.position.x+(body.position.x-body.positionPrev.x)*2,body.position.y+(body.position.y-body.positionPrev.y)*2)}c.lineWidth=3;c.strokeStyle="cornflowerblue";c.stroke()};Render.bodyIds=function(engine,bodies,context){var c=context;for(var i=0;i<bodies.length;i++){var body=bodies[i];if(!body.render.visible)continue;c.font="12px Arial";c.fillStyle="rgba(255,255,255,0.5)";c.fillText(body.id,body.position.x+10,body.position.y-10)}};Render.collisions=function(engine,pairs,context){var c=context,options=engine.render.options,pair,collision,i,j;c.beginPath();for(i=0;i<pairs.length;i++){pair=pairs[i];collision=pair.collision;for(j=0;j<pair.activeContacts.length;j++){var contact=pair.activeContacts[j],vertex=contact.vertex;c.rect(vertex.x-1.5,vertex.y-1.5,3.5,3.5)}}if(options.wireframes){c.fillStyle="rgba(255,255,255,0.7)"}else{c.fillStyle="orange"}c.fill();c.beginPath();for(i=0;i<pairs.length;i++){pair=pairs[i];collision=pair.collision;if(pair.activeContacts.length>0){var normalPosX=pair.activeContacts[0].vertex.x,normalPosY=pair.activeContacts[0].vertex.y;if(pair.activeContacts.length===2){normalPosX=(pair.activeContacts[0].vertex.x+pair.activeContacts[1].vertex.x)/2;normalPosY=(pair.activeContacts[0].vertex.y+pair.activeContacts[1].vertex.y)/2}c.moveTo(normalPosX-collision.normal.x*8,normalPosY-collision.normal.y*8);c.lineTo(normalPosX,normalPosY)}}if(options.wireframes){c.strokeStyle="rgba(255,165,0,0.7)"}else{c.strokeStyle="orange"}c.lineWidth=1;c.stroke()};Render.grid=function(engine,grid,context){var c=context,options=engine.render.options;if(options.wireframes){c.strokeStyle="rgba(255,180,0,0.1)"}else{c.strokeStyle="rgba(255,180,0,0.5)"}c.beginPath();var bucketKeys=Common.keys(grid.buckets);for(var i=0;i<bucketKeys.length;i++){var bucketId=bucketKeys[i];if(grid.buckets[bucketId].length<2)continue;var region=bucketId.split(",");c.rect(.5+parseInt(region[0],10)*grid.bucketWidth,.5+parseInt(region[1],10)*grid.bucketHeight,grid.bucketWidth,grid.bucketHeight)}c.lineWidth=1;c.stroke()};Render.inspector=function(inspector,context){var engine=inspector.engine,selected=inspector.selected,render=engine.render,options=render.options,bounds;if(options.hasBounds){var boundsWidth=render.bounds.max.x-render.bounds.min.x,boundsHeight=render.bounds.max.y-render.bounds.min.y,boundsScaleX=boundsWidth/render.options.width,boundsScaleY=boundsHeight/render.options.height;context.scale(1/boundsScaleX,1/boundsScaleY);context.translate(-render.bounds.min.x,-render.bounds.min.y)}for(var i=0;i<selected.length;i++){var item=selected[i].data;context.translate(.5,.5);context.lineWidth=1;context.strokeStyle="rgba(255,165,0,0.9)";context.setLineDash([1,2]);switch(item.type){case"body":bounds=item.bounds;context.beginPath();context.rect(Math.floor(bounds.min.x-3),Math.floor(bounds.min.y-3),Math.floor(bounds.max.x-bounds.min.x+6),Math.floor(bounds.max.y-bounds.min.y+6));context.closePath();context.stroke();break;case"constraint":var point=item.pointA;if(item.bodyA)point=item.pointB;context.beginPath();context.arc(point.x,point.y,10,0,2*Math.PI);context.closePath();context.stroke();break}context.setLineDash([0]);context.translate(-.5,-.5)}if(inspector.selectStart!==null){context.translate(.5,.5);context.lineWidth=1;context.strokeStyle="rgba(255,165,0,0.6)";context.fillStyle="rgba(255,165,0,0.1)";bounds=inspector.selectBounds;context.beginPath();context.rect(Math.floor(bounds.min.x),Math.floor(bounds.min.y),Math.floor(bounds.max.x-bounds.min.x),Math.floor(bounds.max.y-bounds.min.y));context.closePath();context.stroke();context.fill();context.translate(-.5,-.5)}if(options.hasBounds)context.setTransform(1,0,0,1,0,0)};var _createCanvas=function(width,height){var canvas=document.createElement("canvas");canvas.width=width;canvas.height=height;canvas.oncontextmenu=function(){return false};canvas.onselectstart=function(){return false};return canvas};var _getPixelRatio=function(canvas){var context=canvas.getContext("2d"),devicePixelRatio=window.devicePixelRatio||1,backingStorePixelRatio=context.webkitBackingStorePixelRatio||context.mozBackingStorePixelRatio||context.msBackingStorePixelRatio||context.oBackingStorePixelRatio||context.backingStorePixelRatio||1;return devicePixelRatio/backingStorePixelRatio};var _getTexture=function(render,imagePath){var image=render.textures[imagePath];if(image)return image;image=render.textures[imagePath]=new Image;image.src=imagePath;return image};var _applyBackground=function(render,background){var cssBackground=background;if(/(jpg|gif|png)$/.test(background))cssBackground="url("+background+")";render.canvas.style.background=cssBackground;render.canvas.style.backgroundSize="contain";render.currentBackground=background}})();var RenderPixi={};(function(){RenderPixi.create=function(options){var defaults={controller:RenderPixi,element:null,canvas:null,options:{width:800,height:600,background:"#fafafa",wireframeBackground:"#222",hasBounds:false,enabled:true,wireframes:true,showSleeping:true,showDebug:false,showBroadphase:false,showBounds:false,showVelocity:false,showCollisions:false,showAxes:false,showPositions:false,showAngleIndicator:false,showIds:false,showShadows:false}};var render=Common.extend(defaults,options),transparent=!render.options.wireframes&&render.options.background==="transparent";render.context=new PIXI.WebGLRenderer(render.options.width,render.options.height,render.canvas,transparent,true);render.canvas=render.context.view;render.container=new PIXI.DisplayObjectContainer;render.stage=new PIXI.Stage;render.stage.addChild(render.container);render.bounds=render.bounds||{min:{x:0,y:0},max:{x:render.options.width,y:render.options.height}};render.textures={};render.sprites={};render.primitives={};render.spriteBatch=new PIXI.SpriteBatch;render.container.addChild(render.spriteBatch);if(Common.isElement(render.element)){render.element.appendChild(render.canvas)}else{Common.log('No "render.element" passed, "render.canvas" was not inserted into document.',"warn")}render.canvas.oncontextmenu=function(){return false};render.canvas.onselectstart=function(){return false};return render};RenderPixi.clear=function(render){var container=render.container,spriteBatch=render.spriteBatch;while(container.children[0]){container.removeChild(container.children[0])}while(spriteBatch.children[0]){spriteBatch.removeChild(spriteBatch.children[0])}var bgSprite=render.sprites["bg-0"];render.textures={};render.sprites={};render.primitives={};render.sprites["bg-0"]=bgSprite;if(bgSprite)spriteBatch.addChildAt(bgSprite,0);render.container.addChild(render.spriteBatch);render.currentBackground=null;container.scale.set(1,1);container.position.set(0,0)};RenderPixi.setBackground=function(render,background){if(render.currentBackground!==background){var isColor=background.indexOf&&background.indexOf("#")!==-1,bgSprite=render.sprites["bg-0"];if(isColor){var color=Common.colorToNumber(background);render.stage.setBackgroundColor(color);if(bgSprite)render.spriteBatch.removeChild(bgSprite)}else{if(!bgSprite){var texture=_getTexture(render,background);bgSprite=render.sprites["bg-0"]=new PIXI.Sprite(texture);bgSprite.position.x=0;bgSprite.position.y=0;render.spriteBatch.addChildAt(bgSprite,0)}}render.currentBackground=background}};RenderPixi.world=function(engine){var render=engine.render,world=engine.world,context=render.context,stage=render.stage,container=render.container,options=render.options,bodies=Composite.allBodies(world),allConstraints=Composite.allConstraints(world),constraints=[],i;if(options.wireframes){RenderPixi.setBackground(render,options.wireframeBackground)}else{RenderPixi.setBackground(render,options.background)}var boundsWidth=render.bounds.max.x-render.bounds.min.x,boundsHeight=render.bounds.max.y-render.bounds.min.y,boundsScaleX=boundsWidth/render.options.width,boundsScaleY=boundsHeight/render.options.height;if(options.hasBounds){for(i=0;i<bodies.length;i++){var body=bodies[i];body.render.sprite.visible=Bounds.overlaps(body.bounds,render.bounds)}for(i=0;i<allConstraints.length;i++){var constraint=allConstraints[i],bodyA=constraint.bodyA,bodyB=constraint.bodyB,pointAWorld=constraint.pointA,pointBWorld=constraint.pointB;if(bodyA)pointAWorld=Vector.add(bodyA.position,constraint.pointA);if(bodyB)pointBWorld=Vector.add(bodyB.position,constraint.pointB);if(!pointAWorld||!pointBWorld)continue;if(Bounds.contains(render.bounds,pointAWorld)||Bounds.contains(render.bounds,pointBWorld))constraints.push(constraint)}container.scale.set(1/boundsScaleX,1/boundsScaleY);container.position.set(-render.bounds.min.x*(1/boundsScaleX),-render.bounds.min.y*(1/boundsScaleY))}else{constraints=allConstraints}for(i=0;i<bodies.length;i++)RenderPixi.body(engine,bodies[i]);for(i=0;i<constraints.length;i++)RenderPixi.constraint(engine,constraints[i]);context.render(stage)};RenderPixi.constraint=function(engine,constraint){var render=engine.render,bodyA=constraint.bodyA,bodyB=constraint.bodyB,pointA=constraint.pointA,pointB=constraint.pointB,container=render.container,constraintRender=constraint.render,primitiveId="c-"+constraint.id,primitive=render.primitives[primitiveId];if(!primitive)primitive=render.primitives[primitiveId]=new PIXI.Graphics;if(!constraintRender.visible||!constraint.pointA||!constraint.pointB){primitive.clear();return}if(Common.indexOf(container.children,primitive)===-1)container.addChild(primitive);primitive.clear();primitive.beginFill(0,0);primitive.lineStyle(constraintRender.lineWidth,Common.colorToNumber(constraintRender.strokeStyle),1);if(bodyA){primitive.moveTo(bodyA.position.x+pointA.x,bodyA.position.y+pointA.y)}else{primitive.moveTo(pointA.x,pointA.y)}if(bodyB){primitive.lineTo(bodyB.position.x+pointB.x,bodyB.position.y+pointB.y)}else{primitive.lineTo(pointB.x,pointB.y)}primitive.endFill()};RenderPixi.body=function(engine,body){var render=engine.render,bodyRender=body.render;if(!bodyRender.visible)return;if(bodyRender.sprite&&bodyRender.sprite.texture){var spriteId="b-"+body.id,sprite=render.sprites[spriteId],spriteBatch=render.spriteBatch;if(!sprite)sprite=render.sprites[spriteId]=_createBodySprite(render,body);if(Common.indexOf(spriteBatch.children,sprite)===-1)spriteBatch.addChild(sprite);sprite.position.x=body.position.x;sprite.position.y=body.position.y;sprite.rotation=body.angle;sprite.scale.x=bodyRender.sprite.xScale||1;sprite.scale.y=bodyRender.sprite.yScale||1}else{var primitiveId="b-"+body.id,primitive=render.primitives[primitiveId],container=render.container;if(!primitive){primitive=render.primitives[primitiveId]=_createBodyPrimitive(render,body);primitive.initialAngle=body.angle}if(Common.indexOf(container.children,primitive)===-1)container.addChild(primitive);primitive.position.x=body.position.x;primitive.position.y=body.position.y;primitive.rotation=body.angle-primitive.initialAngle}};var _createBodySprite=function(render,body){var bodyRender=body.render,texturePath=bodyRender.sprite.texture,texture=_getTexture(render,texturePath),sprite=new PIXI.Sprite(texture);sprite.anchor.x=.5;sprite.anchor.y=.5;return sprite};var _createBodyPrimitive=function(render,body){var bodyRender=body.render,options=render.options,primitive=new PIXI.Graphics;primitive.clear();if(!options.wireframes){primitive.beginFill(Common.colorToNumber(bodyRender.fillStyle),1);primitive.lineStyle(body.render.lineWidth,Common.colorToNumber(bodyRender.strokeStyle),1)}else{primitive.beginFill(0,0);primitive.lineStyle(1,Common.colorToNumber("#bbb"),1)}primitive.moveTo(body.vertices[0].x-body.position.x,body.vertices[0].y-body.position.y);for(var j=1;j<body.vertices.length;j++){primitive.lineTo(body.vertices[j].x-body.position.x,body.vertices[j].y-body.position.y)}primitive.lineTo(body.vertices[0].x-body.position.x,body.vertices[0].y-body.position.y);primitive.endFill();if(options.showAngleIndicator||options.showAxes){primitive.beginFill(0,0);if(options.wireframes){primitive.lineStyle(1,Common.colorToNumber("#CD5C5C"),1)}else{primitive.lineStyle(1,Common.colorToNumber(body.render.strokeStyle))}primitive.moveTo(0,0);primitive.lineTo((body.vertices[0].x+body.vertices[body.vertices.length-1].x)/2-body.position.x,(body.vertices[0].y+body.vertices[body.vertices.length-1].y)/2-body.position.y);primitive.endFill()}return primitive};var _getTexture=function(render,imagePath){var texture=render.textures[imagePath];if(!texture)texture=render.textures[imagePath]=PIXI.Texture.fromImage(imagePath);return texture}})();World.add=Composite.add;World.remove=Composite.remove;World.addComposite=Composite.addComposite;World.addBody=Composite.addBody;World.addConstraint=Composite.addConstraint;World.clear=Composite.clear;Engine.run=Runner.run;Matter.Body=Body;Matter.Composite=Composite;Matter.World=World;Matter.Contact=Contact;Matter.Detector=Detector;Matter.Grid=Grid;Matter.Pairs=Pairs;Matter.Pair=Pair;Matter.Resolver=Resolver;Matter.SAT=SAT;Matter.Constraint=Constraint;Matter.MouseConstraint=MouseConstraint;Matter.Common=Common;Matter.Engine=Engine;Matter.Metrics=Metrics;Matter.Mouse=Mouse;Matter.Sleeping=Sleeping;Matter.Bodies=Bodies;Matter.Composites=Composites;Matter.Axes=Axes;Matter.Bounds=Bounds;Matter.Vector=Vector;Matter.Vertices=Vertices;Matter.Render=Render;Matter.RenderPixi=RenderPixi;Matter.Events=Events;Matter.Query=Query;Matter.Runner=Runner;if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){exports=module.exports=Matter}exports.Matter=Matter}if(typeof define==="function"&&define.amd){define("Matter",[],function(){return Matter})}if(typeof window==="object"&&typeof window.document==="object"){window.Matter=Matter}})();</script><link href="http://fonts.googleapis.com/css?family=Press+Start+2P" rel="stylesheet" type="text/css"></head><body style="margin:0; padding:0;"><div hidden=""><dom-module id="flushed-app"><style> html, body { width : 100%; height : 100%; background : black; } @keyframes scrollGameBackground { from { transform : translate3d(0,0,0); } to { transform : translate3d(-100%,0,0); } } @-webkit-keyframes scrollGameBackground { from { -webkit-transform : translate3d(0,0,0); } to { -webkit-transform : translate3d(-100%,0,0); } } flushed-app, flushed-app #gameCanvas, flushed-app #gameBGTileLeft, flushed-app #gameBGTileRight { position : absolute; top : 0; left : 0; overflow : hidden; width : 100%; height : 100%; max-height : 690px; } flushed-app { top : 50%; left : 50%; transform : translate3d(-50%, -50%, 0); -webkit-transform : translate3d(-50%, -50%, 0); } flushed-app { background-color: #0099FF; } flushed-app #gameBGTileLeft, flushed-app #gameBGTileRight { background-image : url("img/desert_BG.png"); background-position : 0 100%; background-repeat : no-repeat; background-size : 100% auto; -webkit-animation : scrollGameBackground 1.5s linear 0s infinite; animation : scrollGameBackground 1.5s linear 0s infinite; } flushed-app #gameBGTileRight { left : 100%; right : auto; width : 100%; } .flushed-app__score { position : absolute; top : 20px; right : 20px; font-size : 72px; line-height : 72px; font-family : 'Press Start 2P', sans-serif; color : white; } </style><template><div id="gameBGTileLeft"></div><div id="gameBGTileRight"></div><div id="gameCanvas"></div><div class="flushed-app__score">[[score]]</div></template></dom-module><script>Polymer({is:"flushed-app",configure:function(){return{score:0}},ready:function(){var _this=this;var Engine=Matter.Engine,World=Matter.World,Body=Matter.Body,Bodies=Matter.Bodies,Constraint=Matter.Constraint,Composite=Matter.Composite,MouseConstraint=Matter.MouseConstraint;var _sceneWidth;var _sceneHeight;var engine=Engine.create(this.$.gameCanvas);engine.render.options.wireframes=false;engine.render.options.showBounds=false;var toilet=Composite.create({label:"Toilet"});var toiletGroup=Body.nextGroup(true);var toiletTexture=Bodies.rectangle(300,300,80,80,{label:"Toilet Texture",collisionFilter:{mask:0,group:0},render:{sprite:{texture:"img/toilet2.png"}}});var toiletBowl=Bodies.rectangle(285,330,65,65,{label:"Toilet Bowl",collisionFilter:{group:toiletGroup},render:{visible:false}});var toiletTank=Bodies.rectangle(320,280,60,70,{label:"Toilet Tank",collisionFilter:{group:toiletGroup},render:{visible:false}});var bowlToTank=Constraint.create({bodyA:toiletBowl,pointB:{x:-25,y:25},pointA:{x:18,y:-25},bodyB:toiletTank,stiffness:1,angularStiffness:1,render:{visible:false}});var bowlToTank2=Constraint.create({bodyA:toiletBowl,pointB:{x:-20,y:25},pointA:{x:18,y:-25},bodyB:toiletTank,stiffness:1,angularStiffness:1,render:{visible:false}});var bowlToTexture=Constraint.create({bodyB:toiletTexture,pointB:{x:10,y:10},bodyA:toiletTank,stiffness:1,angularStiffness:1,render:{visible:false}});var bowlToTexture2=Constraint.create({bodyA:toiletTexture,pointA:{x:-10,y:-10},bodyB:toiletTank,stiffness:1,angularStiffness:1,render:{visible:false}});Composite.addBody(toilet,toiletTexture);Composite.addBody(toilet,toiletBowl);Composite.addBody(toilet,toiletTank);Composite.addConstraint(toilet,bowlToTank);Composite.addConstraint(toilet,bowlToTank2);Composite.addConstraint(toilet,bowlToTexture);Composite.addConstraint(toilet,bowlToTexture2);World.add(engine.world,[toilet]);World.add(engine.world,MouseConstraint.create(engine,{constraint:Constraint.create({label:"Mouse Constraint",pointA:0,pointB:{x:0,y:0},length:1e-4,stiffness:.05,angularStiffness:1,render:{strokeStyle:"transparent",lineWidth:0}})}));var allDaPoops=[];var startTime=Date.now();setTimeout(function throwPoop(){var throwHeightRatio=Math.random();var initY=_sceneHeight*(throwHeightRatio*.5+.25);var poop=Bodies.rectangle(0,initY,25,25,{label:"Poop",mass:0,render:{sprite:{texture:"img/poop.png",xScale:.75,yScale:.75}}});var xveloratio=Math.random()*(_sceneHeight/640);var yveloratio=Math.random()*(_sceneHeight/640);var xvelo=xveloratio*.01+.005;var yvelo=yveloratio*-.025+.001;Body.applyForce(poop,{x:0,y:0},{x:xvelo,y:yvelo});World.add(engine.world,[poop]);allDaPoops.push(poop);var waittime=700-(Date.now()-startTime)/1e4*100;waittime=Math.max(waittime,300);setTimeout(throwPoop,waittime)},1e3);var toiletFloatForce=-.0127;setInterval(function(){toiletFloatForce=-(.0127+(Math.random()-.5)*.004)},100);Matter.Events.on(engine,"tick",function(){Body.applyForce(toiletBowl,{x:-10,y:0},{x:0,y:toiletFloatForce});Body.setAngularVelocity(toiletBowl,0);Body.setAngularVelocity(toiletTank,0);Body.setAngularVelocity(toiletTexture,0);removeLostPoops()});Matter.Events.on(engine,"collisionStart",function(event){removePoopFromPairs(event.pairs)});function removeLostPoops(){var poopToRemove=allDaPoops.filter(function(poop){return poop.position.y>_sceneHeight});poopToRemove.forEach(function(poop){--_this.score;World.remove(engine.world,poop);allDaPoops.splice(allDaPoops.indexOf(poop),1)})}function removePoopBody(poopBody){var index=allDaPoops.indexOf(poopBody);if(index!==-1){World.remove(engine.world,poopBody);allDaPoops.splice(index,1);++_this.score}}function removePoopFromPairs(pairs){pairs.forEach(function(pair){if(pair.bodyA===toiletBowl||pair.bodyB===toiletBowl){removePoopBody(pair.bodyA);removePoopBody(pair.bodyB)}})}Engine.run(engine);function resizeScene(){var boundsMax=engine.world.bounds.max,renderOptions=engine.render.options,canvas=engine.render.canvas;_sceneWidth=document.documentElement.clientWidth;_sceneHeight=document.documentElement.clientHeight;var screenRatio=_sceneHeight/_sceneWidth;if(screenRatio<1.3){_sceneWidth=_sceneHeight/1.7786666666666666;_this.style.width=_sceneWidth+"px"}else{_this.style.width="100%"}canvas.style.background="transparent";boundsMax.x=_sceneWidth+100;boundsMax.y=_sceneHeight;canvas.width=renderOptions.width=_sceneWidth;canvas.height=renderOptions.height=_sceneHeight}resizeScene();window.addEventListener("resize",resizeScene)}});</script></div><flushed-app></flushed-app></body></html>